@projectcor/maia-components 2.30.0 → 2.30.2-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +656 -0
- package/lib/App.js +4 -2
- package/lib/components/atoms/MAIAInput/MAIAInput.js +73 -14
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +116 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +197 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +157 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +123 -0
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +115 -0
- package/lib/components/atoms/ReasoningBlock/index.js +3 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +54 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +391 -120
- package/lib/components/molecules/ChatAIMessages/newStyles.js +50 -18
- package/lib/components/molecules/MessageFeedback/styles.js +6 -2
- package/lib/context/global-context.js +1 -1
- package/lib/dev/DevReasoningTimeline.js +235 -0
- package/lib/dev/reasoningTraceMock.js +556 -0
- package/lib/hooks/useChatManager/useChatManager.js +97 -59
- package/lib/hooks/useChatMessages/useChatMessages.js +28 -27
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +4 -3
- package/lib/hooks/useProjectSummaryConfig.js +36 -17
- package/lib/hooks/useReasoningTrace/index.js +3 -0
- package/lib/hooks/useReasoningTrace/reasoningStore.js +142 -0
- package/lib/hooks/useReasoningTrace/useReasoningTrace.js +14 -0
- package/lib/lang/br/index.js +237 -31
- package/lib/lang/en/index.js +237 -31
- package/lib/lang/es/index.js +237 -31
- package/lib/lang/fr/index.js +237 -31
- package/lib/services/maia/Orchestrator/orchestrator.js +9 -7
- package/lib/services/utils/mapChatMessages.js +21 -18
- package/lib/store/sessions/sessionStreamManager.js +98 -51
- package/lib/store/sessions/sessions.types.js +1 -1
- package/lib/types/Chat.js +1 -1
- package/lib/types/reasoning.js +2 -0
- package/lib/utils/autoApproveStorage.js +26 -0
- package/lib/utils/hitlAnalytics.js +4 -3
- package/lib/utils/reasoningMappers.js +62 -0
- package/lib/utils/streamActivityMessages.js +106 -41
- package/package.json +1 -1
- package/README.md +0 -2
|
@@ -19,7 +19,6 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
19
19
|
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
20
20
|
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
21
21
|
import React, { memo, useCallback, useEffect, useLayoutEffect, useRef, useState, createElement as _createElement } from 'react';
|
|
22
|
-
import { ArrowSmallDown } from '@projectcor/icons/lib/components/ArrowSmallDown';
|
|
23
22
|
import { AttachmentCard } from '../../atoms/AttachmentCard/AttachmentCard';
|
|
24
23
|
import { ApprovalBox } from '../../atoms/ApprovalBox/ApprovalBox';
|
|
25
24
|
import { AttachmentPreviewModal } from '../../atoms/AttachmentPreviewModal';
|
|
@@ -35,13 +34,18 @@ import { useSmoothStreamText } from '../../../hooks/useSmoothStreamText';
|
|
|
35
34
|
import { useStreamingMessage } from '../../../hooks/useStreamingMessage';
|
|
36
35
|
import { LoadingText } from '../../atoms/LoadingText';
|
|
37
36
|
import { AgentActivityIndicator } from '../../atoms/AgentActivityIndicator';
|
|
37
|
+
import { ReasoningBlock } from '../../atoms/ReasoningBlock/ReasoningBlock';
|
|
38
|
+
import { shouldStreamNarrationInTimeline } from '../../atoms/ReasoningBlock/reasoningLiveNarration';
|
|
39
|
+
import { ReasoningTimeline } from '../../atoms/ReasoningBlock/ReasoningTimeline';
|
|
40
|
+
import { SCTimelineIndicator } from '../../atoms/ReasoningBlock/ReasoningBlock.styles';
|
|
38
41
|
import { isStreamingPlaceholderMessageId, resolveStreamLoadingDisplay } from '../../../utils/streamActivityMessages';
|
|
39
42
|
import { resolveRetryTurnId, findUserMessageForRetry } from '../../../utils/retryCompletion';
|
|
43
|
+
import { useReasoningTrace } from '../../../hooks/useReasoningTrace';
|
|
40
44
|
import { Loader } from '../../atoms/Loader';
|
|
41
45
|
import { Fade } from '../../atoms/Fade';
|
|
42
46
|
import { MessageFromUser, MessageFromOther, MessageContentFromUser, MessageContentFromOther } from './styles';
|
|
43
47
|
import { MessageFeedback } from '../MessageFeedback';
|
|
44
|
-
import { SCCAIMessageWrapper, ScrollToBottomButton, SCMessagesOuter, SCMessagesScroll, SCMessagesInner,
|
|
48
|
+
import { SCCAIMessageWrapper, ScrollToBottomButton, SCScrollIconSwap, SCWritingDots, SCMessagesOuter, SCMessagesScroll, SCMessagesInner, SCTurnSpacer, SCOptionsList, SCOptionItem, SCMessageItemWrapper, SCMessageItemInner, SCAttachmentsRow, SCApprovalActionsColumn, SCLoadingMessagesColumn, SCMessagesGradientTop, SCMessagesGradientBottom } from './newStyles';
|
|
45
49
|
import { Feedback } from '../MessageFeedback/MessageFeedback';
|
|
46
50
|
import { useGlobalContext } from '../../../context/global-context';
|
|
47
51
|
import { EntityLinkCustomLink, getEntityLinkWrapperClassName } from '../../../utils/entityLinkRender';
|
|
@@ -50,6 +54,24 @@ import { ChatAICreateAgentActions } from './ChatAICreateAgentActions';
|
|
|
50
54
|
import { EVENTS, useEvent } from '../../../hooks/useEvent';
|
|
51
55
|
import { downloadFileFromUrl } from '../../../utils/fileDownloadHelper';
|
|
52
56
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
57
|
+
/**
|
|
58
|
+
* Al anclar el turno, la pregunta no se pega al borde superior: dejamos asomar
|
|
59
|
+
* la cola del mensaje anterior para no perder el hilo de la conversación.
|
|
60
|
+
* Relativo al viewport porque un valor fijo se come demasiado en pantallas cortas.
|
|
61
|
+
*/
|
|
62
|
+
var turnAnchorOffset = function turnAnchorOffset(viewportHeight) {
|
|
63
|
+
return Math.min(viewportHeight * 0.18, 200);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Duración del scroll animado: base y tope para recorridos largos, para que un
|
|
68
|
+
* salto de varias pantallas no se sienta un latigazo.
|
|
69
|
+
*/
|
|
70
|
+
var TURN_SCROLL_DURATION_MS = 600;
|
|
71
|
+
var TURN_SCROLL_MAX_DURATION_MS = 800;
|
|
72
|
+
|
|
73
|
+
/** Distancia a partir de la cual la duración ya está en su tope. */
|
|
74
|
+
var TURN_SCROLL_LONG_DISTANCE_PX = 1200;
|
|
53
75
|
var MessageWrapper = function MessageWrapper(_ref) {
|
|
54
76
|
var isCurrentUser = _ref.isCurrentUser,
|
|
55
77
|
children = _ref.children,
|
|
@@ -177,7 +199,7 @@ var StreamingMessageBody = /*#__PURE__*/memo(function (props) {
|
|
|
177
199
|
});
|
|
178
200
|
});
|
|
179
201
|
var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
180
|
-
var _props$projectMetadat;
|
|
202
|
+
var _props$reasoning, _props$projectMetadat;
|
|
181
203
|
var id = props.id,
|
|
182
204
|
user = props.user,
|
|
183
205
|
message = props.message,
|
|
@@ -200,22 +222,22 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
200
222
|
suggestions = props.suggestions,
|
|
201
223
|
createAgentFollowUp = props.createAgentFollowUp,
|
|
202
224
|
hasSelectedSuggestion = props.hasSelectedSuggestion,
|
|
203
|
-
isLastMessage = props.isLastMessage
|
|
225
|
+
isLastMessage = props.isLastMessage,
|
|
226
|
+
streamActivity = props.streamActivity;
|
|
204
227
|
var _useState3 = useState(null),
|
|
205
228
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
206
229
|
previewAttachment = _useState4[0],
|
|
207
230
|
setPreviewAttachment = _useState4[1];
|
|
208
231
|
var isCurrentUser = role === ChatHistoryRole.USER || user.id === authUser.id.toString();
|
|
209
232
|
var isAssistant = role === ChatHistoryRole.ASSISTANT || user.id === 'assistant';
|
|
210
|
-
// Mientras el agente "piensa" (streaming sin texto) no montamos el MessageItem:
|
|
211
|
-
// un placeholder vacío sumaría otro gap de 36px encima del indicador de actividad.
|
|
212
233
|
var isStreamingPlaceholder = isStreamingPlaceholderMessageId(id);
|
|
213
234
|
var streamingText = useStreamingMessage(isStreaming || isStreamingPlaceholder ? id : null);
|
|
214
235
|
var isActiveStreaming = !!isStreaming || isStreamingPlaceholder;
|
|
215
|
-
var
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
236
|
+
var hasStreamText = Boolean(streamingText);
|
|
237
|
+
var reasoningTrace = useReasoningTrace(isAssistant && isActiveStreaming ? id : '');
|
|
238
|
+
var streamNarrationInTimeline = isAssistant && shouldStreamNarrationInTimeline(reasoningTrace.steps, streamActivity, streamingText);
|
|
239
|
+
var showStreamingBody = isActiveStreaming && hasStreamText && !streamNarrationInTimeline;
|
|
240
|
+
var showActivityIndicator = isAssistant && isActiveStreaming && !!streamActivity;
|
|
219
241
|
var messageAttachments = attachments && attachments.length > 0 ? attachments : !isAssistant && Array.isArray(sources) ? sources : [];
|
|
220
242
|
var handleAttachmentClick = function handleAttachmentClick(attachment) {
|
|
221
243
|
// Permitir previsualización si tiene archivo local o URLs del backend
|
|
@@ -313,8 +335,16 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
313
335
|
};
|
|
314
336
|
return /*#__PURE__*/_jsxs(SCMessageItemWrapper, {
|
|
315
337
|
$isAssistant: isAssistant,
|
|
338
|
+
"data-message-id": id,
|
|
316
339
|
children: [/*#__PURE__*/_jsxs(SCMessageItemInner, {
|
|
317
|
-
children: [
|
|
340
|
+
children: [isAssistant && (isActiveStreaming ? /*#__PURE__*/_jsx(ReasoningTimeline, {
|
|
341
|
+
messageId: id,
|
|
342
|
+
streamActivity: streamActivity,
|
|
343
|
+
streamingText: streamingText
|
|
344
|
+
}) : /*#__PURE__*/_jsx(ReasoningBlock, {
|
|
345
|
+
messageId: id,
|
|
346
|
+
trace: (_props$reasoning = props.reasoning) !== null && _props$reasoning !== void 0 ? _props$reasoning : null
|
|
347
|
+
})), !!messageAttachments.length && /*#__PURE__*/_jsx(SCAttachmentsRow, {
|
|
318
348
|
$isAssistant: isAssistant,
|
|
319
349
|
children: messageAttachments.map(function (attachment, index) {
|
|
320
350
|
var _attachment$type, _attachment$name;
|
|
@@ -340,9 +370,9 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
340
370
|
}
|
|
341
371
|
}, "".concat(attachment.id, "-").concat(attachment.name));
|
|
342
372
|
})
|
|
343
|
-
}), (!!message ||
|
|
373
|
+
}), (!!message || showStreamingBody) && !(isAssistant && !!messageAttachments.length) && /*#__PURE__*/_jsx(StreamingMessageBody, {
|
|
344
374
|
message: message !== null && message !== void 0 ? message : '',
|
|
345
|
-
isStreaming:
|
|
375
|
+
isStreaming: showStreamingBody,
|
|
346
376
|
isCurrentUser: isCurrentUser,
|
|
347
377
|
isAssistant: isAssistant,
|
|
348
378
|
isFrontendCancelled: props.isFrontendCancelled,
|
|
@@ -358,6 +388,11 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
358
388
|
suggestionsDisabled: isActiveStreaming || !!hasSelectedSuggestion,
|
|
359
389
|
messageId: id,
|
|
360
390
|
isLastMessage: isLastMessage
|
|
391
|
+
}), showActivityIndicator && /*#__PURE__*/_jsx(SCTimelineIndicator, {
|
|
392
|
+
children: /*#__PURE__*/_jsx(AgentActivityIndicator, {
|
|
393
|
+
activity: streamActivity,
|
|
394
|
+
compact: true
|
|
395
|
+
})
|
|
361
396
|
}), approval && approval.pending_actions && /*#__PURE__*/_jsx(SCApprovalActionsColumn, {
|
|
362
397
|
children: /*#__PURE__*/_jsx(ApprovalBox, {
|
|
363
398
|
actions: approval.pending_actions,
|
|
@@ -406,17 +441,36 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
406
441
|
var scrollThresholdRef = useRef(39);
|
|
407
442
|
var lastScrollTopRef = useRef(0);
|
|
408
443
|
var showScrollToBottomRef = useRef(false);
|
|
444
|
+
var showTopGradientRef = useRef(false);
|
|
445
|
+
var showBottomGradientRef = useRef(false);
|
|
409
446
|
var scrollRafRef = useRef(null);
|
|
447
|
+
/**
|
|
448
|
+
* Turno con el scroll bajo control del usuario: desde que envía el mensaje y
|
|
449
|
+
* hasta el próximo envío no movemos el scroll por ningún motivo. Es
|
|
450
|
+
* independiente de la altura del spacer, que puede llegar a 0 sin desanclar.
|
|
451
|
+
*/
|
|
452
|
+
var anchoredTurnIdRef = useRef(null);
|
|
453
|
+
var spacerElRef = useRef(null);
|
|
454
|
+
var spacerHeightRef = useRef(0);
|
|
455
|
+
var turnScrollRafRef = useRef(null);
|
|
410
456
|
var wasLoadingMessagesRef = useRef(false);
|
|
411
457
|
var lastScrolledSessionRef = useRef(null);
|
|
412
458
|
var _useState5 = useState(false),
|
|
413
459
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
414
460
|
showScrollToBottom = _useState6[0],
|
|
415
461
|
setShowScrollToBottom = _useState6[1];
|
|
416
|
-
var _useState7 = useState(
|
|
462
|
+
var _useState7 = useState(false),
|
|
417
463
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
418
|
-
|
|
419
|
-
|
|
464
|
+
showTopGradient = _useState8[0],
|
|
465
|
+
setShowTopGradient = _useState8[1];
|
|
466
|
+
var _useState9 = useState(false),
|
|
467
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
468
|
+
showBottomGradient = _useState0[0],
|
|
469
|
+
setShowBottomGradient = _useState0[1];
|
|
470
|
+
var _useState1 = useState({}),
|
|
471
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
472
|
+
selectedSuggestionMessageIds = _useState10[0],
|
|
473
|
+
setSelectedSuggestionMessageIds = _useState10[1];
|
|
420
474
|
var _useChatManager = useChatManager({
|
|
421
475
|
chatId: initialChatId || undefined,
|
|
422
476
|
userInitialMessage: userInitialMessage,
|
|
@@ -443,50 +497,36 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
443
497
|
var handleSelectOption = useCallback(function (option) {
|
|
444
498
|
changeProject(option);
|
|
445
499
|
}, [changeProject]);
|
|
446
|
-
var handleSuggestionClick = useCallback(function (messageId, suggestion) {
|
|
447
|
-
if (!(suggestion !== null && suggestion !== void 0 && suggestion.trim())) return;
|
|
448
|
-
if (selectedSuggestionMessageIds[messageId]) return;
|
|
449
|
-
var isMarketplaceGlobalAgent = isMaiakerAgent(agent);
|
|
450
|
-
event(EVENTS.aiChatSuggestedAnswer, {
|
|
451
|
-
agent_type: isMarketplaceGlobalAgent ? 'marketplace' : agent === null || agent === void 0 ? void 0 : agent.type
|
|
452
|
-
});
|
|
453
|
-
setSelectedSuggestionMessageIds(function (prev) {
|
|
454
|
-
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, messageId, true));
|
|
455
|
-
});
|
|
456
|
-
var targetMessage = messages.find(function (msg) {
|
|
457
|
-
return msg.id === messageId;
|
|
458
|
-
});
|
|
459
|
-
var isRetrySuggestion = !!(targetMessage !== null && targetMessage !== void 0 && targetMessage.isError) && suggestion === t('chat.retry');
|
|
460
|
-
if (isRetrySuggestion) {
|
|
461
|
-
var _lastUserMessage = messages.filter(function (msg) {
|
|
462
|
-
return msg.role === ChatHistoryRole.USER || msg.user.id === authUser.id.toString();
|
|
463
|
-
}).at(-1);
|
|
464
|
-
if (_lastUserMessage !== null && _lastUserMessage !== void 0 && _lastUserMessage.message) {
|
|
465
|
-
var retryAttachments = Array.isArray(_lastUserMessage.attachments) ? _lastUserMessage.attachments : Array.isArray(_lastUserMessage.sources) ? _lastUserMessage.sources : [];
|
|
466
|
-
sendMessage(_lastUserMessage.message, retryAttachments);
|
|
467
|
-
return;
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
sendMessage(suggestion);
|
|
471
|
-
}, [sendMessage, selectedSuggestionMessageIds, event, agent === null || agent === void 0 ? void 0 : agent.entity, agent === null || agent === void 0 ? void 0 : agent.name, agent === null || agent === void 0 ? void 0 : agent.type, messages, t, authUser.id]);
|
|
472
500
|
|
|
473
501
|
/**
|
|
474
|
-
*
|
|
475
|
-
*
|
|
476
|
-
*
|
|
502
|
+
* Recalcula el botón "scroll to bottom" y los gradientes de borde a partir de
|
|
503
|
+
* la posición del scroll. Los refs evitan `setState` cuando el valor no cambia:
|
|
504
|
+
* esto corre en cada frame del stream.
|
|
477
505
|
*/
|
|
478
|
-
var
|
|
506
|
+
var updateScrollAffordances = useCallback(function () {
|
|
479
507
|
var el = messagesRef.current;
|
|
480
508
|
if (!el) return;
|
|
481
509
|
var scrollTop = el.scrollTop,
|
|
482
510
|
scrollHeight = el.scrollHeight,
|
|
483
511
|
clientHeight = el.clientHeight;
|
|
484
|
-
|
|
512
|
+
// El spacer del turno es alto reservado, no contenido: si no lo descontamos
|
|
513
|
+
// la flecha y el gradiente de abajo quedan encendidos durante todo el turno.
|
|
514
|
+
var distanceFromBottom = scrollHeight - spacerHeightRef.current - scrollTop - clientHeight;
|
|
485
515
|
var shouldShow = distanceFromBottom > 50;
|
|
486
516
|
if (showScrollToBottomRef.current !== shouldShow) {
|
|
487
517
|
showScrollToBottomRef.current = shouldShow;
|
|
488
518
|
setShowScrollToBottom(shouldShow);
|
|
489
519
|
}
|
|
520
|
+
var nextTopGradient = scrollTop > 1;
|
|
521
|
+
if (showTopGradientRef.current !== nextTopGradient) {
|
|
522
|
+
showTopGradientRef.current = nextTopGradient;
|
|
523
|
+
setShowTopGradient(nextTopGradient);
|
|
524
|
+
}
|
|
525
|
+
var nextBottomGradient = distanceFromBottom > 1;
|
|
526
|
+
if (showBottomGradientRef.current !== nextBottomGradient) {
|
|
527
|
+
showBottomGradientRef.current = nextBottomGradient;
|
|
528
|
+
setShowBottomGradient(nextBottomGradient);
|
|
529
|
+
}
|
|
490
530
|
}, []);
|
|
491
531
|
|
|
492
532
|
/**
|
|
@@ -506,33 +546,149 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
506
546
|
if (!el) return;
|
|
507
547
|
if (skipIfUserScrolling && userScrollingRef.current) return;
|
|
508
548
|
el.scrollTop = el.scrollHeight;
|
|
509
|
-
|
|
549
|
+
updateScrollAffordances();
|
|
510
550
|
});
|
|
511
551
|
};
|
|
512
552
|
if (delayMs > 0) setTimeout(run, delayMs);else run();
|
|
513
|
-
}, [
|
|
553
|
+
}, [updateScrollAffordances]);
|
|
554
|
+
var cancelTurnScroll = useCallback(function () {
|
|
555
|
+
if (turnScrollRafRef.current === null) return;
|
|
556
|
+
cancelAnimationFrame(turnScrollRafRef.current);
|
|
557
|
+
turnScrollRafRef.current = null;
|
|
558
|
+
}, []);
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* Scroll animado con easing propio: `behavior: 'smooth'` no permite regular la
|
|
562
|
+
* duración y el salto al anclar el turno queda demasiado seco.
|
|
563
|
+
*/
|
|
564
|
+
var animateScrollTo = useCallback(function (top) {
|
|
565
|
+
cancelTurnScroll();
|
|
566
|
+
var el = messagesRef.current;
|
|
567
|
+
if (!el) return;
|
|
568
|
+
var from = el.scrollTop;
|
|
569
|
+
var distance = top - from;
|
|
570
|
+
if (Math.abs(distance) < 1) return;
|
|
571
|
+
var duration = TURN_SCROLL_DURATION_MS + (TURN_SCROLL_MAX_DURATION_MS - TURN_SCROLL_DURATION_MS) * Math.min(1, Math.abs(distance) / TURN_SCROLL_LONG_DISTANCE_PX);
|
|
572
|
+
var startedAt = performance.now();
|
|
573
|
+
var _step = function step(now) {
|
|
574
|
+
var progress = Math.min(1, (now - startedAt) / duration);
|
|
575
|
+
// easeOutExpo (~cubic-bezier(0.16, 1, 0.3, 1)): empieza a frenar mucho
|
|
576
|
+
// antes que el quint y aterriza sin corte perceptible.
|
|
577
|
+
var eased = progress === 1 ? 1 : 1 - Math.pow(2, -12 * progress);
|
|
578
|
+
el.scrollTop = from + distance * eased;
|
|
579
|
+
updateScrollAffordances();
|
|
580
|
+
turnScrollRafRef.current = progress < 1 ? requestAnimationFrame(_step) : null;
|
|
581
|
+
};
|
|
582
|
+
turnScrollRafRef.current = requestAnimationFrame(_step);
|
|
583
|
+
}, [cancelTurnScroll, updateScrollAffordances]);
|
|
584
|
+
useEffect(function () {
|
|
585
|
+
return cancelTurnScroll;
|
|
586
|
+
}, [cancelTurnScroll]);
|
|
587
|
+
var setSpacerHeight = useCallback(function (next) {
|
|
588
|
+
if (Math.abs(spacerHeightRef.current - next) < 1) return;
|
|
589
|
+
spacerHeightRef.current = next;
|
|
590
|
+
if (spacerElRef.current) {
|
|
591
|
+
spacerElRef.current.style.height = "".concat(next, "px");
|
|
592
|
+
}
|
|
593
|
+
}, []);
|
|
594
|
+
var clearTurnSpace = useCallback(function () {
|
|
595
|
+
anchoredTurnIdRef.current = null;
|
|
596
|
+
setSpacerHeight(0);
|
|
597
|
+
}, [setSpacerHeight]);
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Devuelve el alto reservado que se puede sacar sin mover la vista: todo lo
|
|
601
|
+
* que quede por debajo del scroll actual. Si el usuario está en el fondo, se
|
|
602
|
+
* saca entero; si está a mitad de camino, se va drenando a medida que baja.
|
|
603
|
+
*/
|
|
604
|
+
var drainTurnSpace = useCallback(function () {
|
|
605
|
+
var el = messagesRef.current;
|
|
606
|
+
if (!el || spacerHeightRef.current <= 0) return;
|
|
607
|
+
var removable = Math.max(0, el.scrollHeight - el.clientHeight - el.scrollTop);
|
|
608
|
+
setSpacerHeight(Math.max(0, spacerHeightRef.current - removable));
|
|
609
|
+
}, [setSpacerHeight]);
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* El usuario tomó el control del scroll: el turno deja de estar anclado y el
|
|
613
|
+
* espacio reservado empieza a devolverse. Sin ancla y con spacer > 0, el
|
|
614
|
+
* handler de scroll sigue drenando hasta que llega al fondo y no queda hueco.
|
|
615
|
+
*/
|
|
616
|
+
var releaseTurnSpace = useCallback(function () {
|
|
617
|
+
if (!anchoredTurnIdRef.current && spacerHeightRef.current <= 0) return;
|
|
618
|
+
anchoredTurnIdRef.current = null;
|
|
619
|
+
drainTurnSpace();
|
|
620
|
+
}, [drainTurnSpace]);
|
|
621
|
+
var handleUserScrollIntent = useCallback(function () {
|
|
622
|
+
cancelTurnScroll();
|
|
623
|
+
releaseTurnSpace();
|
|
624
|
+
}, [cancelTurnScroll, releaseTurnSpace]);
|
|
625
|
+
var measureTurn = useCallback(function (questionId) {
|
|
626
|
+
var el = messagesRef.current;
|
|
627
|
+
var spacerEl = spacerElRef.current;
|
|
628
|
+
if (!el || !spacerEl) return null;
|
|
629
|
+
var questionEl = el.querySelector("[data-message-id=\"".concat(questionId, "\"]"));
|
|
630
|
+
if (!questionEl) return null;
|
|
631
|
+
var containerTop = el.getBoundingClientRect().top;
|
|
632
|
+
var questionTop = questionEl.getBoundingClientRect().top - containerTop + el.scrollTop;
|
|
633
|
+
var contentBottom = spacerEl.getBoundingClientRect().top - containerTop + el.scrollTop;
|
|
634
|
+
return {
|
|
635
|
+
el: el,
|
|
636
|
+
questionTop: questionTop,
|
|
637
|
+
turnHeight: contentBottom - questionTop
|
|
638
|
+
};
|
|
639
|
+
}, []);
|
|
640
|
+
var reserveTurnSpace = useCallback(function (questionId) {
|
|
641
|
+
var measured = measureTurn(questionId);
|
|
642
|
+
if (!measured) return;
|
|
643
|
+
var el = measured.el,
|
|
644
|
+
questionTop = measured.questionTop,
|
|
645
|
+
turnHeight = measured.turnHeight;
|
|
646
|
+
|
|
647
|
+
// Anclamos siempre, incluso cuando no haga falta reservar: durante el
|
|
648
|
+
// turno el scroll no se mueve solo en ningún caso.
|
|
649
|
+
anchoredTurnIdRef.current = questionId;
|
|
650
|
+
var offset = turnAnchorOffset(el.clientHeight);
|
|
651
|
+
var targetScrollTop = Math.max(0, questionTop - offset);
|
|
652
|
+
// Chat recién iniciado o conversación que aún entra en pantalla: la
|
|
653
|
+
// pregunta ya está arriba, no hay nada que subir ni que reservar.
|
|
654
|
+
if (targetScrollTop <= el.scrollTop) {
|
|
655
|
+
setSpacerHeight(0);
|
|
656
|
+
updateScrollAffordances();
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// Reservamos lo mínimo para que `targetScrollTop` sea alcanzable. El
|
|
661
|
+
// spacer se inserta de una (es alto reservado, no contenido visible);
|
|
662
|
+
// lo único que se percibe es el desplazamiento animado.
|
|
663
|
+
setSpacerHeight(Math.max(0, el.clientHeight - turnHeight - offset));
|
|
664
|
+
animateScrollTo(targetScrollTop);
|
|
665
|
+
}, [measureTurn, setSpacerHeight, updateScrollAffordances, animateScrollTo]);
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* Encoge el spacer a medida que crece la respuesta: el alto total del scroll
|
|
669
|
+
* queda constante y la vista no se mueve sola. Solo achica, nunca agranda,
|
|
670
|
+
* para no inyectar espacio en turnos que arrancaron sin reserva.
|
|
671
|
+
* Devuelve si el turno sigue anclado (aunque el spacer ya sea 0).
|
|
672
|
+
*/
|
|
673
|
+
var syncTurnSpace = useCallback(function () {
|
|
674
|
+
if (!anchoredTurnIdRef.current) return false;
|
|
675
|
+
if (spacerHeightRef.current > 0) {
|
|
676
|
+
var measured = measureTurn(anchoredTurnIdRef.current);
|
|
677
|
+
if (measured) {
|
|
678
|
+
var offset = turnAnchorOffset(measured.el.clientHeight);
|
|
679
|
+
var reserved = Math.max(0, measured.el.clientHeight - measured.turnHeight - offset);
|
|
680
|
+
setSpacerHeight(Math.min(spacerHeightRef.current, reserved));
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
return true;
|
|
684
|
+
}, [measureTurn, setSpacerHeight]);
|
|
514
685
|
var handleClickScrollToBottom = useCallback(function () {
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
setTimeout(updateScrollBottomVisibility, 500);
|
|
522
|
-
}, [updateScrollBottomVisibility]);
|
|
523
|
-
|
|
524
|
-
// Al decidir en el ApprovalBox: el box colapsa (botones -> badge) y el stream
|
|
525
|
-
// continúa abajo. Reactivar el auto-scroll y seguir el fondo para que la vista
|
|
526
|
-
// no quede atrás (evita que aparezca la flecha de scroll-to-bottom).
|
|
527
|
-
var handleApprovalDecisionWithScroll = useCallback(function () {
|
|
528
|
-
userScrollingRef.current = false;
|
|
529
|
-
scrollThresholdRef.current = 39;
|
|
530
|
-
handleApprovalDecision.apply(void 0, arguments);
|
|
531
|
-
scrollToBottomRaf();
|
|
532
|
-
scrollToBottomRaf({
|
|
533
|
-
delayMs: 100
|
|
534
|
-
});
|
|
535
|
-
}, [handleApprovalDecision, scrollToBottomRaf]);
|
|
686
|
+
var el = messagesRef.current;
|
|
687
|
+
if (!el) return;
|
|
688
|
+
clearTurnSpace();
|
|
689
|
+
// Misma curva y duración que el anclaje del turno: el `smooth` nativo frena seco.
|
|
690
|
+
animateScrollTo(el.scrollHeight - el.clientHeight);
|
|
691
|
+
}, [clearTurnSpace, animateScrollTo]);
|
|
536
692
|
var handleScrollToBottom = useCallback(function (e) {
|
|
537
693
|
var container = e.currentTarget;
|
|
538
694
|
if (scrollRafRef.current !== null) {
|
|
@@ -553,13 +709,18 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
553
709
|
}
|
|
554
710
|
userScrollingRef.current = !isNearBottom;
|
|
555
711
|
lastScrollTopRef.current = scrollTop;
|
|
556
|
-
|
|
712
|
+
|
|
713
|
+
// Turno ya liberado por el usuario: seguimos devolviendo el alto
|
|
714
|
+
// reservado mientras baja, para que al llegar al último mensaje no
|
|
715
|
+
// quede hueco debajo.
|
|
716
|
+
if (!anchoredTurnIdRef.current) drainTurnSpace();
|
|
717
|
+
updateScrollAffordances();
|
|
557
718
|
if (isNearBottom && onScrollToBottom) {
|
|
558
719
|
onScrollToBottom();
|
|
559
720
|
}
|
|
560
721
|
handleScroll(container);
|
|
561
722
|
});
|
|
562
|
-
}, [onScrollToBottom, handleScroll,
|
|
723
|
+
}, [onScrollToBottom, handleScroll, updateScrollAffordances, drainTurnSpace]);
|
|
563
724
|
|
|
564
725
|
// refs to stabilize functions and avoid unnecessary re-renders
|
|
565
726
|
var sendMessageRef = useRef(sendMessage);
|
|
@@ -576,6 +737,45 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
576
737
|
sendMessageRef.current = sendMessage;
|
|
577
738
|
stopGenerationRef.current = stopGeneration;
|
|
578
739
|
onSendMessageReadyRef.current = onSendMessageReady;
|
|
740
|
+
|
|
741
|
+
/**
|
|
742
|
+
* `handleSuggestionClick` se pasa a TODOS los MessageItem, así que su identidad
|
|
743
|
+
* decide si el `memo` de la lista sostiene. Leemos por ref lo que cambia en cada
|
|
744
|
+
* update (`messages`, `sendMessage`, las sugerencias ya elegidas) para que el
|
|
745
|
+
* callback sea estable: si no, al terminar el stream se repinta el chat entero
|
|
746
|
+
* y cada MaiaStreamdown vuelve a parsear su markdown.
|
|
747
|
+
*/
|
|
748
|
+
var messagesDataRef = useRef(messages);
|
|
749
|
+
messagesDataRef.current = messages;
|
|
750
|
+
var selectedSuggestionMessageIdsRef = useRef(selectedSuggestionMessageIds);
|
|
751
|
+
selectedSuggestionMessageIdsRef.current = selectedSuggestionMessageIds;
|
|
752
|
+
var handleSuggestionClick = useCallback(function (messageId, suggestion) {
|
|
753
|
+
if (!(suggestion !== null && suggestion !== void 0 && suggestion.trim())) return;
|
|
754
|
+
if (selectedSuggestionMessageIdsRef.current[messageId]) return;
|
|
755
|
+
var currentMessages = messagesDataRef.current;
|
|
756
|
+
var isMarketplaceGlobalAgent = isMaiakerAgent(agent);
|
|
757
|
+
event(EVENTS.aiChatSuggestedAnswer, {
|
|
758
|
+
agent_type: isMarketplaceGlobalAgent ? 'marketplace' : agent === null || agent === void 0 ? void 0 : agent.type
|
|
759
|
+
});
|
|
760
|
+
setSelectedSuggestionMessageIds(function (prev) {
|
|
761
|
+
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, messageId, true));
|
|
762
|
+
});
|
|
763
|
+
var targetMessage = currentMessages.find(function (msg) {
|
|
764
|
+
return msg.id === messageId;
|
|
765
|
+
});
|
|
766
|
+
var isRetrySuggestion = !!(targetMessage !== null && targetMessage !== void 0 && targetMessage.isError) && suggestion === t('chat.retry');
|
|
767
|
+
if (isRetrySuggestion) {
|
|
768
|
+
var _lastUserMessage = currentMessages.filter(function (msg) {
|
|
769
|
+
return msg.role === ChatHistoryRole.USER || msg.user.id === authUser.id.toString();
|
|
770
|
+
}).at(-1);
|
|
771
|
+
if (_lastUserMessage !== null && _lastUserMessage !== void 0 && _lastUserMessage.message) {
|
|
772
|
+
var retryAttachments = Array.isArray(_lastUserMessage.attachments) ? _lastUserMessage.attachments : Array.isArray(_lastUserMessage.sources) ? _lastUserMessage.sources : [];
|
|
773
|
+
sendMessageRef.current(_lastUserMessage.message, retryAttachments);
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
sendMessageRef.current(suggestion);
|
|
778
|
+
}, [event, agent, t, authUser.id]);
|
|
579
779
|
useEffect(function () {
|
|
580
780
|
if (onSendMessageReadyRef.current) {
|
|
581
781
|
onSendMessageReadyRef.current(sendMessageProxyRef.current, stopGenerationProxyRef.current, waitingResponse, isWriting);
|
|
@@ -605,6 +805,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
605
805
|
// contra el último valor observado y ajusta solo cuando cambia. Así el
|
|
606
806
|
// scroll queda perfectamente sincronizado con la animación del texto sin
|
|
607
807
|
// depender de la cadencia del streamingStore.
|
|
808
|
+
// Con el turno anclado este loop solo encoge el spacer: no toca el scroll.
|
|
608
809
|
useEffect(function () {
|
|
609
810
|
if (!waitingResponse && !isWriting) return undefined;
|
|
610
811
|
if (!messagesRef.current) return undefined;
|
|
@@ -616,13 +817,20 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
616
817
|
rafId = null;
|
|
617
818
|
return;
|
|
618
819
|
}
|
|
820
|
+
if (syncTurnSpace()) {
|
|
821
|
+
// El scroll no se mueve, pero el contenido crece: la flecha y el
|
|
822
|
+
// gradiente de abajo tienen que encenderse apenas se pasa del viewport.
|
|
823
|
+
updateScrollAffordances();
|
|
824
|
+
rafId = requestAnimationFrame(_tick);
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
619
827
|
var currentHeight = el.scrollHeight;
|
|
620
828
|
if (currentHeight !== lastHeight) {
|
|
621
829
|
lastHeight = currentHeight;
|
|
622
830
|
if (!userScrollingRef.current) {
|
|
623
831
|
el.scrollTop = currentHeight;
|
|
624
832
|
}
|
|
625
|
-
|
|
833
|
+
updateScrollAffordances();
|
|
626
834
|
}
|
|
627
835
|
rafId = requestAnimationFrame(_tick);
|
|
628
836
|
};
|
|
@@ -630,16 +838,43 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
630
838
|
return function () {
|
|
631
839
|
if (rafId != null) cancelAnimationFrame(rafId);
|
|
632
840
|
};
|
|
633
|
-
}, [waitingResponse, isWriting,
|
|
841
|
+
}, [waitingResponse, isWriting, syncTurnSpace, updateScrollAffordances]);
|
|
634
842
|
|
|
635
843
|
// Al comenzar a esperar la respuesta del backend, scroll inicial al fondo.
|
|
636
844
|
useEffect(function () {
|
|
637
|
-
if (waitingResponse && messagesRef.current) {
|
|
845
|
+
if (waitingResponse && messagesRef.current && !anchoredTurnIdRef.current) {
|
|
638
846
|
scrollToBottomRaf({
|
|
639
847
|
skipIfUserScrolling: true
|
|
640
848
|
});
|
|
641
849
|
}
|
|
642
850
|
}, [waitingResponse, scrollToBottomRaf]);
|
|
851
|
+
var lastReservedQuestionRef = useRef(null);
|
|
852
|
+
|
|
853
|
+
// Cambio de chat: el ancla y el spacer del turno anterior dejan de aplicar.
|
|
854
|
+
useEffect(function () {
|
|
855
|
+
if (!loadingMessages) return;
|
|
856
|
+
lastReservedQuestionRef.current = null;
|
|
857
|
+
clearTurnSpace();
|
|
858
|
+
}, [loadingMessages, clearTurnSpace]);
|
|
859
|
+
|
|
860
|
+
// Al enviar un mensaje: anclamos el turno y hacemos el único scroll del ciclo.
|
|
861
|
+
useEffect(function () {
|
|
862
|
+
if (loadingMessages || isLoadingMoreMessages) return;
|
|
863
|
+
var questionId = null;
|
|
864
|
+
for (var index = messages.length - 1; index >= 0; index -= 1) {
|
|
865
|
+
var _messages$index;
|
|
866
|
+
if ((_messages$index = messages[index]) !== null && _messages$index !== void 0 && (_messages$index = _messages$index.id) !== null && _messages$index !== void 0 && _messages$index.startsWith('question-')) {
|
|
867
|
+
questionId = messages[index].id;
|
|
868
|
+
break;
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
if (!questionId || questionId === lastReservedQuestionRef.current) return;
|
|
872
|
+
lastReservedQuestionRef.current = questionId;
|
|
873
|
+
userScrollingRef.current = false;
|
|
874
|
+
requestAnimationFrame(function () {
|
|
875
|
+
return reserveTurnSpace(questionId);
|
|
876
|
+
});
|
|
877
|
+
}, [messages, loadingMessages, isLoadingMoreMessages, reserveTurnSpace]);
|
|
643
878
|
|
|
644
879
|
// Scroll cuando cambian los mensajes: distingue "nuevo mensaje" (agregado)
|
|
645
880
|
// de "reemplazo" (mismo id/length, ej. feedback o approvalStatus). En
|
|
@@ -686,7 +921,14 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
686
921
|
lastMessagesLengthRef.current = messages.length;
|
|
687
922
|
var isNewMessage = lastId !== prevId || messages.length !== prevLen;
|
|
688
923
|
if (!isNewMessage) {
|
|
689
|
-
|
|
924
|
+
updateScrollAffordances();
|
|
925
|
+
return;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
// Turno anclado: ni el reemplazo del placeholder por el mensaje final, ni la
|
|
929
|
+
// aparición del ApprovalBox mueven el scroll. Solo se ajusta el spacer.
|
|
930
|
+
if (anchoredTurnIdRef.current) {
|
|
931
|
+
requestAnimationFrame(syncTurnSpace);
|
|
690
932
|
return;
|
|
691
933
|
}
|
|
692
934
|
var container = messagesRef.current;
|
|
@@ -697,18 +939,6 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
697
939
|
var isApproval = !!lastMessage && (lastMessage.id.startsWith('approval-') || !!lastMessage.approval);
|
|
698
940
|
var isAnswerOrQuestion = !!lastMessage && (lastMessage.id.startsWith('answer-') || lastMessage.id.startsWith('question-'));
|
|
699
941
|
|
|
700
|
-
// Approval: secuencia de scrolls con delay porque el ApprovalBox necesita
|
|
701
|
-
// un tick para medirse. Scrollea aunque el usuario no esté al fondo si no
|
|
702
|
-
// está scrolleando manualmente.
|
|
703
|
-
if (isApproval && (isAtBottom || !userScrollingRef.current)) {
|
|
704
|
-
scrollToBottomRaf();
|
|
705
|
-
scrollToBottomRaf();
|
|
706
|
-
scrollToBottomRaf({
|
|
707
|
-
delayMs: 100
|
|
708
|
-
});
|
|
709
|
-
return;
|
|
710
|
-
}
|
|
711
|
-
|
|
712
942
|
// Nuevos answer/question: scroll si el usuario ya estaba al fondo.
|
|
713
943
|
if (isAnswerOrQuestion && isAtBottom) {
|
|
714
944
|
scrollToBottomRaf();
|
|
@@ -721,8 +951,8 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
721
951
|
scrollToBottomRaf();
|
|
722
952
|
return;
|
|
723
953
|
}
|
|
724
|
-
|
|
725
|
-
}, [messages, loadingMessages, isLoadingMoreMessages, scrollToBottomRaf,
|
|
954
|
+
updateScrollAffordances();
|
|
955
|
+
}, [messages, loadingMessages, isLoadingMoreMessages, scrollToBottomRaf, syncTurnSpace, updateScrollAffordances]);
|
|
726
956
|
|
|
727
957
|
// Al abrir/cargar una conversación el contenedor se remonta (Loader → lista) con
|
|
728
958
|
// scrollTop=0. Forzamos ir al fondo al terminar loadMessages, sin afectar paginación hacia arriba.
|
|
@@ -741,6 +971,13 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
741
971
|
});
|
|
742
972
|
}, [loadingMessages, messages.length, scrollToBottomRaf]);
|
|
743
973
|
|
|
974
|
+
// Estado inicial del botón scroll-to-bottom al terminar loadingMessages.
|
|
975
|
+
useEffect(function () {
|
|
976
|
+
if (!loadingMessages) {
|
|
977
|
+
updateScrollAffordances();
|
|
978
|
+
}
|
|
979
|
+
}, [loadingMessages, messages.length, updateScrollAffordances]);
|
|
980
|
+
|
|
744
981
|
// Obtener el último mensaje del usuario para verificar si tiene attachments
|
|
745
982
|
var lastUserMessage = messages.filter(function (msg) {
|
|
746
983
|
return msg.role === ChatHistoryRole.USER || msg.user.id === authUser.id.toString();
|
|
@@ -758,7 +995,6 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
758
995
|
t: t
|
|
759
996
|
});
|
|
760
997
|
var isScrollOnParent = !!expanded;
|
|
761
|
-
var isMarketplaceGlobalAgent = isMaiakerAgent(agent);
|
|
762
998
|
|
|
763
999
|
// Al expandir/contraer el modal el ref pasa a otro contenedor (scrollTop se resetea a 0).
|
|
764
1000
|
// Restaurar la posición de scroll antes del paint para evitar que la conversación salte arriba.
|
|
@@ -778,6 +1014,8 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
778
1014
|
children: /*#__PURE__*/_jsx(Loader, {})
|
|
779
1015
|
});
|
|
780
1016
|
}
|
|
1017
|
+
var lastMessage = messages[messages.length - 1];
|
|
1018
|
+
var hasMessageLevelIndicator = !!lastMessage && isStreamingPlaceholderMessageId(lastMessage.id) && (waitingResponse || isWriting);
|
|
781
1019
|
var messagesContent = /*#__PURE__*/_jsxs(_Fragment, {
|
|
782
1020
|
children: [isLoadingMoreMessages && /*#__PURE__*/_jsx(LoadingText, {
|
|
783
1021
|
text: t('chat.loadingMore')
|
|
@@ -804,7 +1042,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
804
1042
|
authUser: authUser,
|
|
805
1043
|
handleSelectOption: handleSelectOption,
|
|
806
1044
|
handleFeedback: handleFeedback,
|
|
807
|
-
handleApprovalDecision:
|
|
1045
|
+
handleApprovalDecision: handleApprovalDecision,
|
|
808
1046
|
handleSuggestionClick: handleSuggestionClick,
|
|
809
1047
|
handleRetry: canRetry ? function () {
|
|
810
1048
|
return retryMessage(message);
|
|
@@ -813,41 +1051,74 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
813
1051
|
disableFeedback: messageFeedback,
|
|
814
1052
|
isStreaming: isStreaming,
|
|
815
1053
|
isLastMessage: isLastMessage,
|
|
816
|
-
expanded: expanded
|
|
1054
|
+
expanded: expanded,
|
|
1055
|
+
streamActivity: isStreaming ? streamLoadingDisplay : null
|
|
817
1056
|
}));
|
|
818
1057
|
})
|
|
819
|
-
}), streamLoadingDisplay && /*#__PURE__*/_jsx(SCLoadingMessagesColumn, {
|
|
1058
|
+
}), !hasMessageLevelIndicator && streamLoadingDisplay && /*#__PURE__*/_jsx(SCLoadingMessagesColumn, {
|
|
820
1059
|
children: /*#__PURE__*/_jsx(AgentActivityIndicator, {
|
|
821
1060
|
activity: streamLoadingDisplay
|
|
822
1061
|
})
|
|
1062
|
+
}), /*#__PURE__*/_jsx(SCTurnSpacer, {
|
|
1063
|
+
ref: spacerElRef,
|
|
1064
|
+
"aria-hidden": "true"
|
|
823
1065
|
})]
|
|
824
1066
|
});
|
|
825
|
-
return
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
1067
|
+
return (
|
|
1068
|
+
/*#__PURE__*/
|
|
1069
|
+
// Si el usuario mueve el scroll abortamos la animación y soltamos el turno:
|
|
1070
|
+
// no le peleamos el control del contenedor.
|
|
1071
|
+
_jsxs(SCMessagesOuter, {
|
|
1072
|
+
$scrollOnParent: isScrollOnParent,
|
|
1073
|
+
onWheel: handleUserScrollIntent,
|
|
1074
|
+
onTouchStart: handleUserScrollIntent,
|
|
1075
|
+
children: [/*#__PURE__*/_jsx(SCMessagesGradientTop, {
|
|
1076
|
+
$show: showTopGradient,
|
|
1077
|
+
"aria-hidden": "true"
|
|
1078
|
+
}), isScrollOnParent ? /*#__PURE__*/_jsx(SCMessagesScroll, {
|
|
1079
|
+
ref: messagesRef,
|
|
1080
|
+
onScroll: handleScrollToBottom,
|
|
1081
|
+
children: /*#__PURE__*/_jsx(SCMessagesInner, {
|
|
1082
|
+
$scrollOnParent: isScrollOnParent,
|
|
1083
|
+
children: messagesContent
|
|
1084
|
+
})
|
|
1085
|
+
}) : /*#__PURE__*/_jsx(SCMessagesInner, {
|
|
1086
|
+
ref: messagesRef,
|
|
1087
|
+
onScroll: handleScrollToBottom,
|
|
1088
|
+
$scrollOnParent: false,
|
|
833
1089
|
children: messagesContent
|
|
834
|
-
})
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
1090
|
+
}), /*#__PURE__*/_jsx(SCMessagesGradientBottom, {
|
|
1091
|
+
$show: showBottomGradient,
|
|
1092
|
+
"aria-hidden": "true"
|
|
1093
|
+
}), showScrollToBottom && /*#__PURE__*/_jsxs(ScrollToBottomButton, {
|
|
1094
|
+
type: "button",
|
|
1095
|
+
onClick: handleClickScrollToBottom,
|
|
1096
|
+
children: [/*#__PURE__*/_jsx(SCScrollIconSwap, {
|
|
1097
|
+
$visible: isWriting,
|
|
1098
|
+
"aria-hidden": true,
|
|
1099
|
+
children: /*#__PURE__*/_jsxs(SCWritingDots, {
|
|
1100
|
+
children: [/*#__PURE__*/_jsx("span", {}), /*#__PURE__*/_jsx("span", {}), /*#__PURE__*/_jsx("span", {})]
|
|
1101
|
+
})
|
|
1102
|
+
}), /*#__PURE__*/_jsx(SCScrollIconSwap, {
|
|
1103
|
+
$visible: !isWriting,
|
|
1104
|
+
"aria-hidden": true,
|
|
1105
|
+
children: /*#__PURE__*/_jsx("svg", {
|
|
1106
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
1107
|
+
width: 12,
|
|
1108
|
+
height: 12,
|
|
1109
|
+
fill: "none",
|
|
1110
|
+
children: /*#__PURE__*/_jsx("path", {
|
|
1111
|
+
stroke: "#202020",
|
|
1112
|
+
strokeLinecap: "round",
|
|
1113
|
+
strokeLinejoin: "round",
|
|
1114
|
+
strokeWidth: 1.5,
|
|
1115
|
+
d: "M6 .75v10.5M.75 6 6 11.25 11.25 6"
|
|
1116
|
+
})
|
|
1117
|
+
})
|
|
1118
|
+
})]
|
|
1119
|
+
})]
|
|
1120
|
+
})
|
|
1121
|
+
);
|
|
851
1122
|
};
|
|
852
1123
|
export var ChatAIMessages = /*#__PURE__*/React.memo(ChatAIMessagesInner);
|
|
853
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiY3JlYXRlRWxlbWVudCIsIl9jcmVhdGVFbGVtZW50IiwiQXJyb3dTbWFsbERvd24iLCJBdHRhY2htZW50Q2FyZCIsIkFwcHJvdmFsQm94IiwiQXR0YWNobWVudFByZXZpZXdNb2RhbCIsIkF0dGFjaG1lbnRDYXJkQXVkaW8iLCJNYWlhU3RyZWFtZG93biIsIkNoYXRIaXN0b3J5Um9sZSIsInJlbmRlclRleHRXaXRoTWVudGlvbnMiLCJoYXNJbmxpbmVNYXJrZXJzIiwiaXNNYWlha2VyQWdlbnQiLCJ1c2VVc2VyIiwidXNlVCIsInVzZUNoYXRNYW5hZ2VyIiwidXNlU21vb3RoU3RyZWFtVGV4dCIsInVzZVN0cmVhbWluZ01lc3NhZ2UiLCJMb2FkaW5nVGV4dCIsIkFnZW50QWN0aXZpdHlJbmRpY2F0b3IiLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkIiwicmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5IiwicmVzb2x2ZVJldHJ5VHVybklkIiwiZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkiLCJMb2FkZXIiLCJGYWRlIiwiTWVzc2FnZUZyb21Vc2VyIiwiTWVzc2FnZUZyb21PdGhlciIsIk1lc3NhZ2VDb250ZW50RnJvbVVzZXIiLCJNZXNzYWdlQ29udGVudEZyb21PdGhlciIsIk1lc3NhZ2VGZWVkYmFjayIsIlNDQ0FJTWVzc2FnZVdyYXBwZXIiLCJTY3JvbGxUb0JvdHRvbUJ1dHRvbiIsIlNDTWVzc2FnZXNPdXRlciIsIlNDTWVzc2FnZXNTY3JvbGwiLCJTQ01lc3NhZ2VzSW5uZXIiLCJTQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbiIsIlNDT3B0aW9uc0xpc3QiLCJTQ09wdGlvbkl0ZW0iLCJTQ01lc3NhZ2VJdGVtV3JhcHBlciIsIlNDTWVzc2FnZUl0ZW1Jbm5lciIsIlNDQXR0YWNobWVudHNSb3ciLCJTQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbiIsIkZlZWRiYWNrIiwidXNlR2xvYmFsQ29udGV4dCIsIkVudGl0eUxpbmtDdXN0b21MaW5rIiwiZ2V0RW50aXR5TGlua1dyYXBwZXJDbGFzc05hbWUiLCJDaGF0QUlTdWdnZXN0aW9ucyIsIkNoYXRBSUNyZWF0ZUFnZW50QWN0aW9ucyIsIkVWRU5UUyIsInVzZUV2ZW50IiwiZG93bmxvYWRGaWxlRnJvbVVybCIsImpzeCIsIl9qc3giLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsImpzeHMiLCJfanN4cyIsIk1lc3NhZ2VXcmFwcGVyIiwiX3JlZiIsImlzQ3VycmVudFVzZXIiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiTWVzc2FnZUNvbXBvbmVudCIsIl9vYmplY3RTcHJlYWQiLCJNZXNzYWdlQ29udGVudFdyYXBwZXIiLCJfcmVmMiIsIl9leGNsdWRlZDIiLCJNZXNzYWdlQ29udGVudENvbXBvbmVudCIsIk1lc3NhZ2VPcHRpb25zIiwiX3JlZjMiLCJvcHRpb25zIiwiaGFuZGxlU2VsZWN0T3B0aW9uIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5Iiwic2VsZWN0ZWRPcHRpb24iLCJzZXRTZWxlY3RlZE9wdGlvbiIsImhhbmRsZVNlbGVjdCIsIm9wdGlvbiIsIm1hcCIsIiRoYXNTZWxlY3Rpb24iLCIkZGltbWVkIiwiaWQiLCJvbkNsaWNrIiwibmFtZSIsIlN0cmVhbWluZ01lc3NhZ2VCb2R5IiwiX3Byb3BzJGNyZWF0ZUFnZW50Rm9sIiwiX3Byb3BzJHN1Z2dlc3Rpb25zIiwic3RyZWFtaW5nVGV4dCIsImlzU3RyZWFtaW5nIiwibWVzc2FnZUlkIiwicmF3VGV4dCIsIm1lc3NhZ2UiLCJ3aW5GbGFncyIsIndpbmRvdyIsImRpc3BsYXlUZXh0IiwiZW5hYmxlZCIsIm1heENoYXJzUGVyRnJhbWUiLCJzbmFwVG9Xb3JkQm91bmRhcnkiLCJzdHJlYW1MYWdNcyIsInRhcmdldExhZ01zIiwic3RyZWFtQWRhcHQiLCJhZGFwdFRvQmFja2VuZFJhdGUiLCJzdHJlYW1CdWZmZXJNcyIsInRhcmdldEJ1ZmZlck1zIiwic3RyZWFtTWluQnVmZmVyIiwibWluQnVmZmVyQ2hhcnMiLCJzdHJlYW1XYXJtdXBNcyIsIndhcm11cE1zIiwiY3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZCIsImNyZWF0ZUFnZW50Rm9sbG93VXAiLCJhZ2VudElkIiwiaGFzTWVudGlvbnMiLCJtZW50aW9uTm9kZXMiLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJkaXNwbGF5IiwidmFyaWFudCIsImNvbXBvbmVudHMiLCJhIiwiaXNBbmltYXRpbmciLCJpc0Fzc2lzdGFudCIsImlzRXJyb3IiLCJhcHByb3ZhbCIsIm9uUmV0cnkiLCJjb250ZW50Iiwic291cmNlcyIsInVuZGVmaW5lZCIsImhhbmRsZUZlZWRiYWNrIiwiaGFuZGxlRmVlZGJhY2tDbGljayIsImRpc2FibGVGZWVkYmFjayIsInN1Z2dlc3Rpb25zIiwibGVuZ3RoIiwib25TZWxlY3RTdWdnZXN0aW9uIiwic3VnZ2VzdGlvbiIsImhhbmRsZVN1Z2dlc3Rpb25DbGljayIsImRpc2FibGVkIiwic3VnZ2VzdGlvbnNEaXNhYmxlZCIsImhpZGRlbiIsImlzTGFzdE1lc3NhZ2UiLCJNZXNzYWdlSXRlbSIsIl9wcm9wcyRwcm9qZWN0TWV0YWRhdCIsInVzZXIiLCJhdXRoVXNlciIsImlzQ2hhbmdlUHJvamVjdCIsImhhbmRsZUFwcHJvdmFsRGVjaXNpb24iLCJoYW5kbGVSZXRyeSIsInJvbGUiLCJhdHRhY2htZW50cyIsImFwcHJvdmFsU3RhdHVzIiwiaGFzU2VsZWN0ZWRTdWdnZXN0aW9uIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJwcmV2aWV3QXR0YWNobWVudCIsInNldFByZXZpZXdBdHRhY2htZW50IiwiVVNFUiIsInRvU3RyaW5nIiwiQVNTSVNUQU5UIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlciIsImlzQWN0aXZlU3RyZWFtaW5nIiwiaXNUaGlua2luZyIsIm1lc3NhZ2VBdHRhY2htZW50cyIsIkFycmF5IiwiaXNBcnJheSIsImhhbmRsZUF0dGFjaG1lbnRDbGljayIsImF0dGFjaG1lbnQiLCJmaWxlIiwiRmlsZSIsIm9yaWdpbmFsRmlsZSIsInVybF90aHVtYm5haWwiLCJ1cmxfb3JpZ2luYWwiLCJ1cmxfZmlsZSIsImhhbmRsZUNsb3NlUHJldmlldyIsImhhbmRsZUF0dGFjaG1lbnREb3dubG9hZCIsIl9yZWY0IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJleHRlbnNpb24iLCJmaWxlTmFtZSIsImZpbGVVcmwiLCJibG9iVXJsIiwiZG93bmxvYWRlZEZpbGUiLCJsaW5rIiwiX3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImluY2x1ZGVzIiwiY29uY2F0IiwidHlwZSIsInNlbnQiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJhYnJ1cHQiLCJkb2N1bWVudCIsImhyZWYiLCJkb3dubG9hZCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNsaWNrIiwic2V0VGltZW91dCIsInJlbW92ZUNoaWxkIiwicmV2b2tlT2JqZWN0VVJMIiwiY29uc29sZSIsImVycm9yIiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJoYXNGZWVkYmFjayIsIiRpc0Fzc2lzdGFudCIsIm1lc3NhZ2VFeHRyYUNvbnRlbnQiLCJmZWVkYmFjayIsInNlc3Npb25JZCIsInNwbGl0IiwiZmlsdGVyIiwicXVlc3Rpb25JZCIsImpvaW4iLCJpbmRleCIsIl9hdHRhY2htZW50JHR5cGUiLCJfYXR0YWNobWVudCRuYW1lIiwiYXR0YWNobWVudFR5cGUiLCJ0b0xvd2VyQ2FzZSIsImF0dGFjaG1lbnROYW1lIiwiaXNBdWRpb0ZpbGUiLCJzdGFydHNXaXRoIiwic29tZSIsImV4dCIsImVuZHNXaXRoIiwicG9zaXRpb25JbmRleCIsIm9uRG93bmxvYWQiLCJwZW5kaW5nX2FjdGlvbnMiLCJhY3Rpb25zIiwic3RhdHVzIiwib25BcHByb3ZlIiwidGhyZWFkSWRzIiwib25SZWplY3QiLCJpc1Byb2plY3REZWxldGVkIiwicHJvamVjdE1ldGFkYXRhIiwiaXNfZGVsZXRlZCIsImlzRXhwYW5kZWQiLCJleHBhbmRlZCIsImhpdGxJbnN0YW5jZUlkIiwib3JpZ2luYWxfdGhyZWFkX2lkIiwid2FybmluZ01lc3NhZ2UiLCJ3YXJuaW5nX21lc3NhZ2UiLCJtYW51YWxBcHByb3ZhbERldGVjdGVkIiwibWFudWFsX2FwcHJvdmFsX2RldGVjdGVkIiwiaXNPcGVuIiwib25DbG9zZSIsIkNoYXRBSU1lc3NhZ2VzSW5uZXIiLCJfcmVmNSIsInVzZXJJbml0aWFsTWVzc2FnZSIsImluaXRpYWxDaGF0SWQiLCJvbkVycm9yIiwib25TZW5kTWVzc2FnZVJlYWR5Iiwib25TY3JvbGxUb0JvdHRvbSIsImFnZW50cyIsIl91c2VUIiwidCIsIl91c2VHbG9iYWxDb250ZXh0IiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJpc0RlZXBTZWFyY2hBY3RpdmUiLCJhZ2VudCIsImV2ZW50IiwibWVzc2FnZXNSZWYiLCJjaGF0SW5pdGlhbGl6ZWRSZWYiLCJpc0xvYWRpbmdNb3JlUmVmIiwidXNlclNjcm9sbGluZ1JlZiIsInNjcm9sbFRocmVzaG9sZFJlZiIsImxhc3RTY3JvbGxUb3BSZWYiLCJzaG93U2Nyb2xsVG9Cb3R0b21SZWYiLCJzY3JvbGxSYWZSZWYiLCJ3YXNMb2FkaW5nTWVzc2FnZXNSZWYiLCJsYXN0U2Nyb2xsZWRTZXNzaW9uUmVmIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJzaG93U2Nyb2xsVG9Cb3R0b20iLCJzZXRTaG93U2Nyb2xsVG9Cb3R0b20iLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHMiLCJzZXRTZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzIiwiX3VzZUNoYXRNYW5hZ2VyIiwiY2hhdElkIiwibWVzc2FnZXMiLCJsb2FkaW5nTWVzc2FnZXMiLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc1dyaXRpbmciLCJsb2FkaW5nTWVzc2FnZSIsInN0cmVhbUFjdGl2aXR5IiwiYWN0aXZlTG9hZGluZ3MiLCJzZW5kTWVzc2FnZSIsInJldHJ5TWVzc2FnZSIsImNoYW5nZVByb2plY3QiLCJpbml0aWFsaXplQ2hhdCIsImhhbmRsZVNjcm9sbCIsInN0b3BHZW5lcmF0aW9uIiwidHJpbSIsImlzTWFya2V0cGxhY2VHbG9iYWxBZ2VudCIsImFpQ2hhdFN1Z2dlc3RlZEFuc3dlciIsImFnZW50X3R5cGUiLCJfZGVmaW5lUHJvcGVydHkiLCJ0YXJnZXRNZXNzYWdlIiwiZmluZCIsIm1zZyIsImlzUmV0cnlTdWdnZXN0aW9uIiwibGFzdFVzZXJNZXNzYWdlIiwiYXQiLCJyZXRyeUF0dGFjaG1lbnRzIiwiZW50aXR5IiwidXBkYXRlU2Nyb2xsQm90dG9tVmlzaWJpbGl0eSIsImVsIiwiY3VycmVudCIsInNjcm9sbFRvcCIsInNjcm9sbEhlaWdodCIsImNsaWVudEhlaWdodCIsImRpc3RhbmNlRnJvbUJvdHRvbSIsInNob3VsZFNob3ciLCJzY3JvbGxUb0JvdHRvbVJhZiIsIm9wdHMiLCJfb3B0cyRza2lwSWZVc2VyU2Nyb2wiLCJza2lwSWZVc2VyU2Nyb2xsaW5nIiwiX29wdHMkZGVsYXlNcyIsImRlbGF5TXMiLCJydW4iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJoYW5kbGVDbGlja1Njcm9sbFRvQm90dG9tIiwic2Nyb2xsVG8iLCJ0b3AiLCJiZWhhdmlvciIsImhhbmRsZUFwcHJvdmFsRGVjaXNpb25XaXRoU2Nyb2xsIiwiaGFuZGxlU2Nyb2xsVG9Cb3R0b20iLCJlIiwiY29udGFpbmVyIiwiY3VycmVudFRhcmdldCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiaXNTY3JvbGxpbmdVcCIsImlzTmVhckJvdHRvbSIsInNlbmRNZXNzYWdlUmVmIiwic3RvcEdlbmVyYXRpb25SZWYiLCJvblNlbmRNZXNzYWdlUmVhZHlSZWYiLCJzZW5kTWVzc2FnZVByb3h5UmVmIiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIm1lbnRpb25zIiwiZnVhSWQiLCJzY0lkIiwic3RvcEdlbmVyYXRpb25Qcm94eVJlZiIsInJhZklkIiwibGFzdEhlaWdodCIsInRpY2siLCJjdXJyZW50SGVpZ2h0IiwibGFzdE1lc3NhZ2VJZFJlZiIsImxhc3RNZXNzYWdlc0xlbmd0aFJlZiIsIl9tZXNzYWdlcyRpZCIsIl9tZXNzYWdlcyIsIl9sYXN0TWVzc2FnZSRpZCIsImxhc3RNZXNzYWdlIiwibGFzdElkIiwicHJldklkIiwicHJldkxlbiIsImlzTmV3TWVzc2FnZSIsImlzQXRCb3R0b20iLCJoYXNJbml0aWFsTWVzc2FnZSIsImlzQXBwcm92YWwiLCJpc0Fuc3dlck9yUXVlc3Rpb24iLCJfbWVzc2FnZXMkaWQyIiwiX21lc3NhZ2VzMiIsImp1c3RGaW5pc2hlZExvYWRpbmciLCJhdHRhY2htZW50c0NvdW50Iiwic3RyZWFtTG9hZGluZ0Rpc3BsYXkiLCJoYXNBdHRhY2htZW50cyIsIkJvb2xlYW4iLCJpc1Njcm9sbE9uUGFyZW50IiwiZXhwYW5kZWRSZWYiLCJzYXZlZFNjcm9sbFRvcCIsImZpbGwiLCJtZXNzYWdlc0NvbnRlbnQiLCJ0ZXh0IiwiX21lc3NhZ2UkYXR0YWNobWVudHMiLCJfbWVzc2FnZSRzb3VyY2VzIiwiX21lc3NhZ2UkcHJvamVjdCIsIl9tZXNzYWdlJGlkIiwiaXNBc3Npc3RhbnRNZXNzYWdlIiwicHJvamVjdCIsIm1lc3NhZ2VGZWVkYmFjayIsIndhc0hlbHBmdWwiLCJUSFVNQlNfVVAiLCJUSFVNQlNfRE9XTiIsIm1lc3NhZ2VLZXkiLCJ0dXJuSWQiLCJ1c2VyTWVzc2FnZUZvclJldHJ5IiwiY2FuUmV0cnkiLCJpc19jYW5jZWxsZWQiLCJrZXkiLCJhY3Rpdml0eSIsIiRzY3JvbGxPblBhcmVudCIsInJlZiIsIm9uU2Nyb2xsIiwiJGlzTWFya2V0cGxhY2VHbG9iYWwiLCJjb2xvciIsIndpZHRoIiwiaGVpZ2h0IiwiQ2hhdEFJTWVzc2FnZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTWVzc2FnZXMvQ2hhdEFJTWVzc2FnZXMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tdW5zdGFibGUtbmVzdGVkLWNvbXBvbmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3cgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wcyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG5pbXBvcnQgUmVhY3QsIHsgRkMsIG1lbW8sIFJlYWN0Tm9kZSwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBBcnJvd1NtYWxsRG93biB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL0Fycm93U21hbGxEb3duJ1xuXG5pbXBvcnQgeyBBdHRhY2htZW50Q2FyZCB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRDYXJkL0F0dGFjaG1lbnRDYXJkJ1xuaW1wb3J0IHsgQXBwcm92YWxCb3ggfSBmcm9tICcuLi8uLi9hdG9tcy9BcHByb3ZhbEJveC9BcHByb3ZhbEJveCdcbmltcG9ydCB7IEF0dGFjaG1lbnRQcmV2aWV3TW9kYWwgfSBmcm9tICcuLi8uLi9hdG9tcy9BdHRhY2htZW50UHJldmlld01vZGFsJ1xuaW1wb3J0IHsgQXR0YWNobWVudENhcmRBdWRpbyB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRDYXJkL0F0dGFjaG1lbnRDYXJkQXVkaW8nXG5pbXBvcnQgeyBNYWlhU3RyZWFtZG93biB9IGZyb20gJy4uLy4uL2F0b21zL01haWFTdHJlYW1kb3duJ1xuaW1wb3J0IHR5cGUgeyBNYWlhU3RyZWFtZG93blByb3BzIH0gZnJvbSAnLi4vLi4vYXRvbXMvTWFpYVN0cmVhbWRvd24nXG5pbXBvcnQgeyBNQUlBTWVzc2FnZVByb3BzIH0gZnJvbSAnLi4vLi4vYXRvbXMvTUFJQU1lc3NhZ2UvTUFJQU1lc3NhZ2UuaW50ZXJmYWNlcydcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0SGlzdG9yeVJvbGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IHsgcmVuZGVyVGV4dFdpdGhNZW50aW9ucywgaGFzSW5saW5lTWFya2VycyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3JlbmRlckNvbnRleHRNZW50aW9ucydcblxuaW1wb3J0IHsgaXNNYWlha2VyQWdlbnQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9hZ2VudERpc3BsYXlOYW1lJ1xuaW1wb3J0IHsgQ09SVXNlciwgdXNlVXNlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5cbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VUJ1xuaW1wb3J0IHsgdXNlQ2hhdE1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VDaGF0TWFuYWdlci91c2VDaGF0TWFuYWdlcidcbmltcG9ydCB7IHVzZVNtb290aFN0cmVhbVRleHQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VTbW9vdGhTdHJlYW1UZXh0J1xuaW1wb3J0IHsgdXNlU3RyZWFtaW5nTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVN0cmVhbWluZ01lc3NhZ2UnXG5cbmltcG9ydCB7IExvYWRpbmdUZXh0IH0gZnJvbSAnLi4vLi4vYXRvbXMvTG9hZGluZ1RleHQnXG5pbXBvcnQgeyBBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIH0gZnJvbSAnLi4vLi4vYXRvbXMvQWdlbnRBY3Rpdml0eUluZGljYXRvcidcbmltcG9ydCB7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQsIHJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgeyByZXNvbHZlUmV0cnlUdXJuSWQsIGZpbmRVc2VyTWVzc2FnZUZvclJldHJ5IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcmV0cnlDb21wbGV0aW9uJ1xuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi4vLi4vYXRvbXMvTG9hZGVyJ1xuaW1wb3J0IHsgRmFkZSB9IGZyb20gJy4uLy4uL2F0b21zL0ZhZGUnXG5cbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Qcm9qZWN0J1xuXG5pbXBvcnQgeyBNZXNzYWdlRnJvbVVzZXIsIE1lc3NhZ2VGcm9tT3RoZXIsIE1lc3NhZ2VDb250ZW50RnJvbVVzZXIsIE1lc3NhZ2VDb250ZW50RnJvbU90aGVyIH0gZnJvbSAnLi9zdHlsZXMnXG5pbXBvcnQgeyBNZXNzYWdlRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2snXG5pbXBvcnQge1xuICBTQ0NBSU1lc3NhZ2VXcmFwcGVyLFxuICBTY3JvbGxUb0JvdHRvbUJ1dHRvbixcbiAgU0NNZXNzYWdlc091dGVyLFxuICBTQ01lc3NhZ2VzU2Nyb2xsLFxuICBTQ01lc3NhZ2VzSW5uZXIsXG4gIFNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uLFxuICBTQ09wdGlvbnNMaXN0LFxuICBTQ09wdGlvbkl0ZW0sXG4gIFNDTWVzc2FnZUl0ZW1XcmFwcGVyLFxuICBTQ01lc3NhZ2VJdGVtSW5uZXIsXG4gIFNDQXR0YWNobWVudHNSb3csXG4gIFNDQXBwcm92YWxBY3Rpb25zQ29sdW1uLFxufSBmcm9tICcuL25ld1N0eWxlcydcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnLi4vTWVzc2FnZUZlZWRiYWNrL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IEVudGl0eUxpbmtDdXN0b21MaW5rLCBnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2VudGl0eUxpbmtSZW5kZXInXG5pbXBvcnQgeyBDaGF0QUlTdWdnZXN0aW9ucyB9IGZyb20gJy4vQ2hhdEFJU3VnZ2VzdGlvbnMnXG5pbXBvcnQgeyBDaGF0QUlDcmVhdGVBZ2VudEFjdGlvbnMgfSBmcm9tICcuL0NoYXRBSUNyZWF0ZUFnZW50QWN0aW9ucydcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IGRvd25sb2FkRmlsZUZyb21VcmwgfSBmcm9tICcuLi8uLi8uLi91dGlscy9maWxlRG93bmxvYWRIZWxwZXInXG5cbnR5cGUgQ2hhdEFJTWVzc2FnZXNQcm9wcyA9IHtcbiAgdXNlckluaXRpYWxNZXNzYWdlOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRGaWxlW11cbiAgICBmYXFJZD86IHN0cmluZ1xuICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdXG4gICAgZnVhSWQ/OiBzdHJpbmdcbiAgICBzY0lkPzogc3RyaW5nXG4gIH1cbiAgaW5pdGlhbENoYXRJZDogc3RyaW5nIHwgbnVsbFxuICBvbkVycm9yOiAoKSA9PiB2b2lkXG4gIG9uU2VuZE1lc3NhZ2VSZWFkeT86IChcbiAgICBzZW5kTWVzc2FnZTogKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgc2NJZD86IHN0cmluZ1xuICAgICkgPT4gdm9pZCxcbiAgICBzdG9wR2VuZXJhdGlvbjogKCkgPT4gdm9pZCxcbiAgICBpc1N0cmVhbWluZzogYm9vbGVhbixcbiAgICBpc1dyaXRpbmc6IGJvb2xlYW5cbiAgKSA9PiB2b2lkXG4gIGlzRGlzYWJsZWQ/OiBib29sZWFuXG4gIG9uU2Nyb2xsVG9Cb3R0b20/OiAoKSA9PiB2b2lkXG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBhZ2VudHM/OiBBZ2VudFtdXG4gIGV4cGFuZGVkPzogYm9vbGVhblxufVxuXG50eXBlIE1lc3NhZ2VJdGVtUHJvcHMgPSBDaGF0TWVzc2FnZSAmIHtcbiAgYXV0aFVzZXI6IENPUlVzZXJcbiAgaGFuZGxlU2VsZWN0T3B0aW9uOiAob3B0aW9uOiBQcm9qZWN0KSA9PiB2b2lkXG4gIGhhbmRsZVN1Z2dlc3Rpb25DbGljazogKG1lc3NhZ2VJZDogc3RyaW5nLCBzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHZvaWRcbiAgaGFzU2VsZWN0ZWRTdWdnZXN0aW9uPzogYm9vbGVhblxuICBoYW5kbGVGZWVkYmFjazogKGZlZWRiYWNrOiBGZWVkYmFjaywgY2hhdE1lc3NhZ2VJZDogc3RyaW5nKSA9PiB2b2lkXG4gIGhhbmRsZUFwcHJvdmFsRGVjaXNpb246ICh0aHJlYWRJZHM6IHN0cmluZ1tdLCBkZWNpc2lvbjogJ2FwcHJvdmUnIHwgJ3JlamVjdCcpID0+IHZvaWRcbiAgaGFuZGxlUmV0cnk/OiAoKSA9PiB2b2lkXG4gIGRpc2FibGVGZWVkYmFjaz86IEZlZWRiYWNrIHwgbnVsbFxuICBzb3VyY2VzPzogYW55XG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBpc1N0cmVhbWluZz86IGJvb2xlYW5cbiAgaXNMYXN0TWVzc2FnZT86IGJvb2xlYW5cbiAgZXhwYW5kZWQ/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBNZXNzYWdlV3JhcHBlclByb3BzIHtcbiAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gICdkYXRhLW1lc3NhZ2UtaWQnPzogc3RyaW5nXG4gIGhhc0ZlZWRiYWNrPzogYm9vbGVhblxufVxuXG50eXBlIE1lc3NhZ2VDb250ZW50V3JhcHBlclByb3BzID0gTUFJQU1lc3NhZ2VQcm9wcyAmIHtcbiAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICBpc0Vycm9yPzogYm9vbGVhblxuICBpc0NoYW5nZVByb2plY3Q/OiBib29sZWFuXG59XG5cbmNvbnN0IE1lc3NhZ2VXcmFwcGVyOiBGQzxNZXNzYWdlV3JhcHBlclByb3BzPiA9ICh7IGlzQ3VycmVudFVzZXIsIGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiB7XG4gIGNvbnN0IE1lc3NhZ2VDb21wb25lbnQgPSBpc0N1cnJlbnRVc2VyID8gTWVzc2FnZUZyb21Vc2VyIDogTWVzc2FnZUZyb21PdGhlclxuICByZXR1cm4gPE1lc3NhZ2VDb21wb25lbnQgey4uLnByb3BzfT57Y2hpbGRyZW59PC9NZXNzYWdlQ29tcG9uZW50PlxufVxuXG5jb25zdCBNZXNzYWdlQ29udGVudFdyYXBwZXI6IEZDPE1lc3NhZ2VDb250ZW50V3JhcHBlclByb3BzPiA9ICh7IGlzQ3VycmVudFVzZXIsIC4uLnByb3BzIH0pID0+IHtcbiAgY29uc3QgTWVzc2FnZUNvbnRlbnRDb21wb25lbnQgPSBpc0N1cnJlbnRVc2VyID8gTWVzc2FnZUNvbnRlbnRGcm9tVXNlciA6IE1lc3NhZ2VDb250ZW50RnJvbU90aGVyXG4gIHJldHVybiA8TWVzc2FnZUNvbnRlbnRDb21wb25lbnQgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBNZXNzYWdlT3B0aW9ucyh7XG4gIG9wdGlvbnMsXG4gIGhhbmRsZVNlbGVjdE9wdGlvbixcbn06IHtcbiAgb3B0aW9uczogUHJvamVjdFtdIHwgbnVsbFxuICBoYW5kbGVTZWxlY3RPcHRpb246IChvcHRpb246IFByb2plY3QpID0+IHZvaWRcbn0pIHtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9uLCBzZXRTZWxlY3RlZE9wdGlvbl0gPSB1c2VTdGF0ZTxQcm9qZWN0IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBoYW5kbGVTZWxlY3QgPSAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkT3B0aW9uKSByZXR1cm5cbiAgICBzZXRTZWxlY3RlZE9wdGlvbihvcHRpb24pXG4gICAgaGFuZGxlU2VsZWN0T3B0aW9uKG9wdGlvbilcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDT3B0aW9uc0xpc3Q+XG4gICAgICB7KG9wdGlvbnMgfHwgW10pLm1hcChvcHRpb24gPT4gKFxuICAgICAgICA8U0NPcHRpb25JdGVtXG4gICAgICAgICAgJGhhc1NlbGVjdGlvbj17ISFzZWxlY3RlZE9wdGlvbn1cbiAgICAgICAgICAkZGltbWVkPXshIXNlbGVjdGVkT3B0aW9uICYmIHNlbGVjdGVkT3B0aW9uPy5pZCAhPT0gb3B0aW9uLmlkfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVNlbGVjdChvcHRpb24pfVxuICAgICAgICAgIGtleT17b3B0aW9uLmlkfVxuICAgICAgICA+XG4gICAgICAgICAge29wdGlvbi5uYW1lfVxuICAgICAgICA8L1NDT3B0aW9uSXRlbT5cbiAgICAgICkpfVxuICAgIDwvU0NPcHRpb25zTGlzdD5cbiAgKVxufVxuXG4vKiogU29sbyBlc3RlIGNvbXBvbmVudGUgcmUtcmVuZGVyaXphIGN1YW5kbyBjYW1iaWEgZWwgdGV4dG8gZW4gc3RyZWFtaW5nIChsZWUgZGVsIGNvbnRleHQpLiAqL1xuY29uc3QgU3RyZWFtaW5nTWVzc2FnZUJvZHkgPSBtZW1vKFxuICAocHJvcHM6IHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBpc1N0cmVhbWluZzogYm9vbGVhblxuICAgIGlzQ3VycmVudFVzZXI6IGJvb2xlYW5cbiAgICBpc0Fzc2lzdGFudDogYm9vbGVhblxuICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ/OiBib29sZWFuXG4gICAgYXBwcm92YWw/OiBNZXNzYWdlSXRlbVByb3BzWydhcHByb3ZhbCddXG4gICAgaXNFcnJvcj86IGJvb2xlYW5cbiAgICBzb3VyY2VzPzogTWVzc2FnZUl0ZW1Qcm9wc1snc291cmNlcyddXG4gICAgc3VnZ2VzdGlvbnM/OiBzdHJpbmdbXSB8IG51bGxcbiAgICBjcmVhdGVBZ2VudEZvbGxvd1VwPzogeyBhZ2VudElkOiBzdHJpbmcgfSB8IG51bGxcbiAgICBoYW5kbGVGZWVkYmFja0NsaWNrOiAoZjogRmVlZGJhY2spID0+IHZvaWRcbiAgICBkaXNhYmxlRmVlZGJhY2s6IEZlZWRiYWNrIHwgbnVsbFxuICAgIG9uUmV0cnk/OiAoKSA9PiB2b2lkXG4gICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrOiAobWVzc2FnZUlkOiBzdHJpbmcsIHN1Z2dlc3Rpb246IHN0cmluZykgPT4gdm9pZFxuICAgIHN1Z2dlc3Rpb25zRGlzYWJsZWQ/OiBib29sZWFuXG4gICAgbWVzc2FnZUlkOiBzdHJpbmdcbiAgICBpc0xhc3RNZXNzYWdlPzogYm9vbGVhblxuICB9KSA9PiB7XG4gICAgLy8gVGV4dG8gZGVsIHN0cmVhbTogc29sbyBzZSBsZWUgZGVsIHN0b3JlIGN1YW5kbyBlc3RlIG1lbnNhamUgZXMgZWxcbiAgICAvLyBxdWUgZXN0w6EgZW4gc3RyZWFtaW5nLiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSBhw61zbGEgZWwgcmUtcmVuZGVyIGFcbiAgICAvLyBlc3RlIGNvbXBvbmVudGUsIHNpbiB0b2NhciBlbCByZXN0byBkZWwgw6FyYm9sLlxuICAgIGNvbnN0IHN0cmVhbWluZ1RleHQgPSB1c2VTdHJlYW1pbmdNZXNzYWdlKHByb3BzLmlzU3RyZWFtaW5nID8gcHJvcHMubWVzc2FnZUlkIDogbnVsbClcbiAgICBjb25zdCByYXdUZXh0ID0gcHJvcHMuaXNTdHJlYW1pbmcgPyBzdHJlYW1pbmdUZXh0IDogcHJvcHMubWVzc2FnZVxuICAgIC8vIFNtb290aCBzdHJlYW1pbmc6IGRlc2Fjb3BsYSBsYSBjYWRlbmNpYSBkZWwgYmFja2VuZCBkZWwgcmVuZGVyLlxuICAgIC8vIER1cmFudGUgZWwgc3RyZWFtaW5nIGxpYmVyYSBjaGFycyBhIHJpdG1vIGNvbnN0YW50ZSB2w61hIHJBRjsgY3VhbmRvXG4gICAgLy8gdGVybWluYSwgbXVlc3RyYSBlbCB0ZXh0byBmaW5hbCBhbCBpbnN0YW50ZSAoc2luIGFuaW1hY2nDs24gcmVzaWR1YWwpLlxuICAgIC8vIExvcyBkZWZhdWx0cyBkZWwgaG9vayBzZSBhanVzdGFyb24gZW1ww61yaWNhbWVudGUgZW4gc3RhZ2luZzsgYXVuIGFzw61cbiAgICAvLyBzZSBleHBvbmVuIGZsYWdzIGRlIHJ1bnRpbWUgKHdpbmRvdy4qKSBwYXJhIHBvZGVyIHR1bmVhciBzaW4gcmVjb21waWxhclxuICAgIC8vIHNpIGFsZ8O6biBiYWNrZW5kIHByZXNlbnRhIHVuYSBjYWRlbmNpYSBtdXkgZGlzdGludGEgZW4gcHJvZHVjY2nDs24uXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtQWRhcHQgPSBmYWxzZSAgICAgIC8vIGRlc2FjdGl2YSBhZGFwdGFjacOzbiBhbCBiYWNrZW5kXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtQnVmZmVyTXMgPSA2MDAgICAgIC8vIGNvbGNow7NuIG9iamV0aXZvIChtcylcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1MYWdNcyA9IDQ1MCAgICAgICAgLy8gbGFnIG3DoXhpbW8gYmFzZSAobXMpXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtTWluQnVmZmVyID0gNzAgICAgIC8vIHBpc28gZGVsIGNvbGNow7NuIGVuIGNoYXJzXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtV2FybXVwTXMgPSA0MDAgICAgIC8vIHdhcm11cCBpbmljaWFsIChtcylcbiAgICBjb25zdCB3aW5GbGFncyA9XG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/ICh3aW5kb3cgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICBzdHJlYW1BZGFwdD86IGJvb2xlYW5cbiAgICAgICAgICAgIHN0cmVhbUJ1ZmZlck1zPzogbnVtYmVyXG4gICAgICAgICAgICBzdHJlYW1MYWdNcz86IG51bWJlclxuICAgICAgICAgICAgc3RyZWFtTWluQnVmZmVyPzogbnVtYmVyXG4gICAgICAgICAgICBzdHJlYW1XYXJtdXBNcz86IG51bWJlclxuICAgICAgICAgIH0pXG4gICAgICAgIDoge31cbiAgICBjb25zdCBkaXNwbGF5VGV4dCA9IHVzZVNtb290aFN0cmVhbVRleHQocmF3VGV4dCwge1xuICAgICAgZW5hYmxlZDogISFwcm9wcy5pc1N0cmVhbWluZyxcbiAgICAgIG1heENoYXJzUGVyRnJhbWU6IDI0LFxuICAgICAgc25hcFRvV29yZEJvdW5kYXJ5OiB0cnVlLFxuICAgICAgLi4uKHdpbkZsYWdzLnN0cmVhbUxhZ01zICE9IG51bGwgJiYgeyB0YXJnZXRMYWdNczogd2luRmxhZ3Muc3RyZWFtTGFnTXMgfSksXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtQWRhcHQgIT0gbnVsbCAmJiB7IGFkYXB0VG9CYWNrZW5kUmF0ZTogd2luRmxhZ3Muc3RyZWFtQWRhcHQgfSksXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtQnVmZmVyTXMgIT0gbnVsbCAmJiB7IHRhcmdldEJ1ZmZlck1zOiB3aW5GbGFncy5zdHJlYW1CdWZmZXJNcyB9KSxcbiAgICAgIC4uLih3aW5GbGFncy5zdHJlYW1NaW5CdWZmZXIgIT0gbnVsbCAmJiB7IG1pbkJ1ZmZlckNoYXJzOiB3aW5GbGFncy5zdHJlYW1NaW5CdWZmZXIgfSksXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtV2FybXVwTXMgIT0gbnVsbCAmJiB7IHdhcm11cE1zOiB3aW5GbGFncy5zdHJlYW1XYXJtdXBNcyB9KSxcbiAgICB9KVxuICAgIGNvbnN0IGNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQgPSBwcm9wcy5jcmVhdGVBZ2VudEZvbGxvd1VwPy5hZ2VudElkXG5cbiAgICBpZiAoIWRpc3BsYXlUZXh0ICYmICFwcm9wcy5pc1N0cmVhbWluZykgcmV0dXJuIG51bGxcbiAgICBjb25zdCBoYXNNZW50aW9ucyA9IGhhc0lubGluZU1hcmtlcnMoZGlzcGxheVRleHQpXG4gICAgY29uc3QgbWVudGlvbk5vZGVzID0gaGFzTWVudGlvbnMgPyByZW5kZXJUZXh0V2l0aE1lbnRpb25zKGRpc3BsYXlUZXh0KSA6IG51bGxcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPFNDQ0FJTWVzc2FnZVdyYXBwZXJcbiAgICAgICAgICBpc0N1cnJlbnRVc2VyPXtwcm9wcy5pc0N1cnJlbnRVc2VyfVxuICAgICAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWR9XG4gICAgICAgICAgY2xhc3NOYW1lPXtnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZShkaXNwbGF5VGV4dCl9XG4gICAgICAgID5cbiAgICAgICAgICB7aGFzTWVudGlvbnMgJiYgbWVudGlvbk5vZGVzID8gKFxuICAgICAgICAgICAgLy8gU2kgaGF5IG1lbnRpb25zLCByZW5kZXJpemFyIGRpcmVjdGFtZW50ZSAoc2luIG1hcmtkb3duIGVuIGVsIG1pc21vIHDDoXJyYWZvKVxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZGlzcGxheTogJ2lubGluZScgfX0+e21lbnRpb25Ob2Rlc308L3NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIC8vIFNpbiBtZW50aW9ucywgcGFzYXIgYSBTdHJlYW1kb3duIHBhcmEgbWFya2Rvd24gc3VwcG9ydFxuICAgICAgICAgICAgPE1haWFTdHJlYW1kb3duXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJjaGF0XCJcbiAgICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17cHJvcHMuaXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZD17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZH1cbiAgICAgICAgICAgICAgY29tcG9uZW50cz17eyBhOiBFbnRpdHlMaW5rQ3VzdG9tTGluayB9IGFzIE1haWFTdHJlYW1kb3duUHJvcHNbJ2NvbXBvbmVudHMnXX1cbiAgICAgICAgICAgICAgaXNBbmltYXRpbmc9eyEhcHJvcHMuaXNTdHJlYW1pbmd9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtkaXNwbGF5VGV4dH1cbiAgICAgICAgICAgIDwvTWFpYVN0cmVhbWRvd24+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9TQ0NBSU1lc3NhZ2VXcmFwcGVyPlxuICAgICAgICB7cHJvcHMuaXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAhcHJvcHMuaXNFcnJvciAmJlxuICAgICAgICAgICFwcm9wcy5hcHByb3ZhbCAmJlxuICAgICAgICAgICFwcm9wcy5pc1N0cmVhbWluZyAmJlxuICAgICAgICAgICghcHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCB8fCAhIXByb3BzLm9uUmV0cnkpICYmIChcbiAgICAgICAgICAgIDxNZXNzYWdlRmVlZGJhY2tcbiAgICAgICAgICAgICAgY29udGVudD17ZGlzcGxheVRleHR9XG4gICAgICAgICAgICAgIHNvdXJjZXM9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWQgPyB1bmRlZmluZWQgOiBwcm9wcy5zb3VyY2VzfVxuICAgICAgICAgICAgICBoYW5kbGVGZWVkYmFjaz17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCA/IHVuZGVmaW5lZCA6IHByb3BzLmhhbmRsZUZlZWRiYWNrQ2xpY2t9XG4gICAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17cHJvcHMuZGlzYWJsZUZlZWRiYWNrfVxuICAgICAgICAgICAgICBvblJldHJ5PXtwcm9wcy5vblJldHJ5fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICB7cHJvcHMuaXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAhcHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCAmJlxuICAgICAgICAgICFwcm9wcy5hcHByb3ZhbCAmJlxuICAgICAgICAgICghcHJvcHMuaXNFcnJvciB8fCBwcm9wcy5zdWdnZXN0aW9ucz8ubGVuZ3RoKSAmJiAoXG4gICAgICAgICAgICA8Q2hhdEFJU3VnZ2VzdGlvbnNcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM9e3Byb3BzLnN1Z2dlc3Rpb25zIHx8IFtdfVxuICAgICAgICAgICAgICBvblNlbGVjdFN1Z2dlc3Rpb249e3N1Z2dlc3Rpb24gPT4gcHJvcHMuaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKHByb3BzLm1lc3NhZ2VJZCwgc3VnZ2VzdGlvbil9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtwcm9wcy5zdWdnZXN0aW9uc0Rpc2FibGVkfVxuICAgICAgICAgICAgICBoaWRkZW49eyEhcHJvcHMuaXNTdHJlYW1pbmcgfHwgIXByb3BzLmlzTGFzdE1lc3NhZ2UgfHwgISFwcm9wcy5zdWdnZXN0aW9uc0Rpc2FibGVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICB7cHJvcHMuaXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAhcHJvcHMuaXNFcnJvciAmJlxuICAgICAgICAgICFwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkICYmXG4gICAgICAgICAgIXByb3BzLmFwcHJvdmFsICYmXG4gICAgICAgICAgISFjcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkICYmIChcbiAgICAgICAgICAgIDxDaGF0QUlDcmVhdGVBZ2VudEFjdGlvbnNcbiAgICAgICAgICAgICAgYWdlbnRJZD17Y3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZH1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3Byb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAgIGhpZGRlbj17ISFwcm9wcy5pc1N0cmVhbWluZyB8fCAhcHJvcHMuaXNMYXN0TWVzc2FnZSB8fCAhIXByb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICA8Lz5cbiAgICApXG4gIH1cbilcblxuY29uc3QgTWVzc2FnZUl0ZW0gPSBtZW1vKChwcm9wczogTWVzc2FnZUl0ZW1Qcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgaWQsXG4gICAgdXNlcixcbiAgICBtZXNzYWdlLFxuICAgIGlzU3RyZWFtaW5nLFxuICAgIGlzRXJyb3IsXG4gICAgYXV0aFVzZXIsXG4gICAgb3B0aW9ucyxcbiAgICBpc0NoYW5nZVByb2plY3QsXG4gICAgaGFuZGxlU2VsZWN0T3B0aW9uLFxuICAgIGhhbmRsZVN1Z2dlc3Rpb25DbGljayxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGRpc2FibGVGZWVkYmFjayxcbiAgICBoYW5kbGVSZXRyeSxcbiAgICByb2xlLFxuICAgIHNvdXJjZXMsXG4gICAgYXR0YWNobWVudHMsXG4gICAgYXBwcm92YWwsXG4gICAgYXBwcm92YWxTdGF0dXMsXG4gICAgc3VnZ2VzdGlvbnMsXG4gICAgY3JlYXRlQWdlbnRGb2xsb3dVcCxcbiAgICBoYXNTZWxlY3RlZFN1Z2dlc3Rpb24sXG4gICAgaXNMYXN0TWVzc2FnZSxcbiAgfSA9IHByb3BzXG5cbiAgY29uc3QgW3ByZXZpZXdBdHRhY2htZW50LCBzZXRQcmV2aWV3QXR0YWNobWVudF0gPSB1c2VTdGF0ZTxBdHRhY2htZW50RmlsZSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGlzQ3VycmVudFVzZXIgPSByb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuVVNFUiB8fCB1c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpXG4gIGNvbnN0IGlzQXNzaXN0YW50ID0gcm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCB8fCB1c2VyLmlkID09PSAnYXNzaXN0YW50J1xuICAvLyBNaWVudHJhcyBlbCBhZ2VudGUgXCJwaWVuc2FcIiAoc3RyZWFtaW5nIHNpbiB0ZXh0bykgbm8gbW9udGFtb3MgZWwgTWVzc2FnZUl0ZW06XG4gIC8vIHVuIHBsYWNlaG9sZGVyIHZhY8OtbyBzdW1hcsOtYSBvdHJvIGdhcCBkZSAzNnB4IGVuY2ltYSBkZWwgaW5kaWNhZG9yIGRlIGFjdGl2aWRhZC5cbiAgY29uc3QgaXNTdHJlYW1pbmdQbGFjZWhvbGRlciA9IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQoaWQpXG4gIGNvbnN0IHN0cmVhbWluZ1RleHQgPSB1c2VTdHJlYW1pbmdNZXNzYWdlKGlzU3RyZWFtaW5nIHx8IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgPyBpZCA6IG51bGwpXG4gIGNvbnN0IGlzQWN0aXZlU3RyZWFtaW5nID0gISFpc1N0cmVhbWluZyB8fCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyXG4gIGNvbnN0IGlzVGhpbmtpbmcgPSBpc0FjdGl2ZVN0cmVhbWluZyAmJiAhc3RyZWFtaW5nVGV4dFxuICBpZiAoaXNUaGlua2luZykge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgbWVzc2FnZUF0dGFjaG1lbnRzID1cbiAgICBhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwXG4gICAgICA/IGF0dGFjaG1lbnRzXG4gICAgICA6ICFpc0Fzc2lzdGFudCAmJiBBcnJheS5pc0FycmF5KHNvdXJjZXMpXG4gICAgICAgID8gKHNvdXJjZXMgYXMgQXR0YWNobWVudEZpbGVbXSlcbiAgICAgICAgOiBbXVxuXG4gIGNvbnN0IGhhbmRsZUF0dGFjaG1lbnRDbGljayA9IChhdHRhY2htZW50OiBBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgIC8vIFBlcm1pdGlyIHByZXZpc3VhbGl6YWNpw7NuIHNpIHRpZW5lIGFyY2hpdm8gbG9jYWwgbyBVUkxzIGRlbCBiYWNrZW5kXG4gICAgaWYgKFxuICAgICAgYXR0YWNobWVudC5maWxlIGluc3RhbmNlb2YgRmlsZSB8fFxuICAgICAgYXR0YWNobWVudC5vcmlnaW5hbEZpbGUgaW5zdGFuY2VvZiBGaWxlIHx8XG4gICAgICBhdHRhY2htZW50LnVybF90aHVtYm5haWwgfHxcbiAgICAgIGF0dGFjaG1lbnQudXJsX29yaWdpbmFsIHx8XG4gICAgICBhdHRhY2htZW50LnVybF9maWxlXG4gICAgKSB7XG4gICAgICBzZXRQcmV2aWV3QXR0YWNobWVudChhdHRhY2htZW50KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNsb3NlUHJldmlldyA9ICgpID0+IHtcbiAgICBzZXRQcmV2aWV3QXR0YWNobWVudChudWxsKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXR0YWNobWVudERvd25sb2FkID0gYXN5bmMgKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gYXR0YWNobWVudC5uYW1lLmluY2x1ZGVzKCcuJykgPyAnJyA6IGAuJHthdHRhY2htZW50LnR5cGV9YFxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7YXR0YWNobWVudC5uYW1lfSR7ZXh0ZW5zaW9ufWBcbiAgICBjb25zdCBmaWxlVXJsID0gYXR0YWNobWVudC51cmxfb3JpZ2luYWwgfHwgYXR0YWNobWVudC51cmxfZmlsZSB8fCBhdHRhY2htZW50LnVybF90aHVtYm5haWxcblxuICAgIHRyeSB7XG4gICAgICBsZXQgYmxvYlVybDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgICAgaWYgKGZpbGVVcmwpIHtcbiAgICAgICAgY29uc3QgZG93bmxvYWRlZEZpbGUgPSBhd2FpdCBkb3dubG9hZEZpbGVGcm9tVXJsKGZpbGVVcmwsIGZpbGVOYW1lLCBhdHRhY2htZW50LnR5cGUpXG4gICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGRvd25sb2FkZWRGaWxlKVxuICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50LmZpbGUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGF0dGFjaG1lbnQuZmlsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFibG9iVXJsKSByZXR1cm5cblxuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgbGluay5ocmVmID0gYmxvYlVybFxuICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lXG4gICAgICBsaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluaylcbiAgICAgIGxpbmsuY2xpY2soKVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKVxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpXG4gICAgICB9LCAxMDApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkb3dubG9hZCBhdHRhY2htZW50JywgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ2hhbmdlUHJvamVjdCAmJiBvcHRpb25zKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxNZXNzYWdlV3JhcHBlciBrZXk9e2lkfSBpc0N1cnJlbnRVc2VyPXtpc0N1cnJlbnRVc2VyfSBkYXRhLW1lc3NhZ2UtaWQ9e2lkfSBoYXNGZWVkYmFjaz17ZmFsc2V9PlxuICAgICAgICA8U0NNZXNzYWdlSXRlbVdyYXBwZXIgJGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH0+XG4gICAgICAgICAgPE1lc3NhZ2VDb250ZW50V3JhcHBlclxuICAgICAgICAgICAgaXNDaGFuZ2VQcm9qZWN0PXtpc0NoYW5nZVByb2plY3R9XG4gICAgICAgICAgICBtZXNzYWdlPXttZXNzYWdlfVxuICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgIGlzRXJyb3I9e2lzRXJyb3J9XG4gICAgICAgICAgICBtZXNzYWdlRXh0cmFDb250ZW50PXs8TWVzc2FnZU9wdGlvbnMgb3B0aW9ucz17b3B0aW9ucyBhcyBhbnl9IGhhbmRsZVNlbGVjdE9wdGlvbj17aGFuZGxlU2VsZWN0T3B0aW9ufSAvPn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1NDTWVzc2FnZUl0ZW1XcmFwcGVyPlxuICAgICAgPC9NZXNzYWdlV3JhcHBlcj5cbiAgICApXG4gIH1cblxuICBjb25zdCBoYW5kbGVGZWVkYmFja0NsaWNrID0gKGZlZWRiYWNrOiBGZWVkYmFjaykgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IGlkXG4gICAgICAuc3BsaXQoJy0nKVxuICAgICAgLmZpbHRlcihxdWVzdGlvbklkID0+IHF1ZXN0aW9uSWQgIT09ICdhbnN3ZXInKVxuICAgICAgLmpvaW4oJy0nKVxuICAgIGhhbmRsZUZlZWRiYWNrPy4oZmVlZGJhY2ssIHNlc3Npb25JZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDTWVzc2FnZUl0ZW1XcmFwcGVyICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9PlxuICAgICAgPFNDTWVzc2FnZUl0ZW1Jbm5lcj5cbiAgICAgICAgeyEhbWVzc2FnZUF0dGFjaG1lbnRzLmxlbmd0aCAmJiAoXG4gICAgICAgICAgPFNDQXR0YWNobWVudHNSb3cgJGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH0+XG4gICAgICAgICAgICB7bWVzc2FnZUF0dGFjaG1lbnRzLm1hcCgoYXR0YWNobWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGV0ZWN0YXIgc2kgZXMgdW4gYXJjaGl2byBkZSBhdWRpb1xuICAgICAgICAgICAgICBjb25zdCBhdHRhY2htZW50VHlwZSA9IGF0dGFjaG1lbnQ/LnR5cGU/LnRvTG93ZXJDYXNlKCkgfHwgJydcbiAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudE5hbWUgPSBhdHRhY2htZW50Py5uYW1lPy50b0xvd2VyQ2FzZSgpIHx8ICcnXG4gICAgICAgICAgICAgIGNvbnN0IGlzQXVkaW9GaWxlID1cbiAgICAgICAgICAgICAgICBhdHRhY2htZW50VHlwZS5zdGFydHNXaXRoKCdhdWRpby8nKSB8fFxuICAgICAgICAgICAgICAgIFsnZmxhYycsICdtNGEnLCAnbXAzJywgJ21wNCcsICdvZ2EnLCAnb2dnJywgJ3dhdicsICd3ZWJtJ10uaW5jbHVkZXMoYXR0YWNobWVudFR5cGUpIHx8XG4gICAgICAgICAgICAgICAgWycuZmxhYycsICcubTRhJywgJy5tcDMnLCAnLm1wNCcsICcub2dhJywgJy5vZ2cnLCAnLndhdicsICcud2VibSddLnNvbWUoZXh0ID0+XG4gICAgICAgICAgICAgICAgICBhdHRhY2htZW50TmFtZS5lbmRzV2l0aChleHQpXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIGlmIChpc0F1ZGlvRmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA8QXR0YWNobWVudENhcmRBdWRpbyBrZXk9e2Ake2F0dGFjaG1lbnQuaWR9LSR7YXR0YWNobWVudC5uYW1lfWB9IGF0dGFjaG1lbnQ9e2F0dGFjaG1lbnR9IC8+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxBdHRhY2htZW50Q2FyZFxuICAgICAgICAgICAgICAgICAga2V5PXtgJHthdHRhY2htZW50LmlkfS0ke2F0dGFjaG1lbnQubmFtZX1gfVxuICAgICAgICAgICAgICAgICAgYXR0YWNobWVudD17YXR0YWNobWVudH1cbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgb25Eb3dubG9hZD17KCkgPT4gaGFuZGxlQXR0YWNobWVudERvd25sb2FkKGF0dGFjaG1lbnQpfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlQXR0YWNobWVudENsaWNrKGF0dGFjaG1lbnQpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvU0NBdHRhY2htZW50c1Jvdz5cbiAgICAgICAgKX1cbiAgICAgICAgeyghIW1lc3NhZ2UgfHwgaXNBY3RpdmVTdHJlYW1pbmcpICYmICEoaXNBc3Npc3RhbnQgJiYgISFtZXNzYWdlQXR0YWNobWVudHMubGVuZ3RoKSAmJiAoXG4gICAgICAgICAgPFN0cmVhbWluZ01lc3NhZ2VCb2R5XG4gICAgICAgICAgICBtZXNzYWdlPXttZXNzYWdlID8/ICcnfVxuICAgICAgICAgICAgaXNTdHJlYW1pbmc9e2lzQWN0aXZlU3RyZWFtaW5nfVxuICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgIGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH1cbiAgICAgICAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWR9XG4gICAgICAgICAgICBhcHByb3ZhbD17YXBwcm92YWx9XG4gICAgICAgICAgICBpc0Vycm9yPXtpc0Vycm9yfVxuICAgICAgICAgICAgc291cmNlcz17c291cmNlc31cbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPXtzdWdnZXN0aW9uc31cbiAgICAgICAgICAgIGNyZWF0ZUFnZW50Rm9sbG93VXA9e2NyZWF0ZUFnZW50Rm9sbG93VXB9XG4gICAgICAgICAgICBoYW5kbGVGZWVkYmFja0NsaWNrPXtoYW5kbGVGZWVkYmFja0NsaWNrfVxuICAgICAgICAgICAgZGlzYWJsZUZlZWRiYWNrPXtkaXNhYmxlRmVlZGJhY2sgPz8gbnVsbH1cbiAgICAgICAgICAgIG9uUmV0cnk9e2hhbmRsZVJldHJ5fVxuICAgICAgICAgICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrPXtoYW5kbGVTdWdnZXN0aW9uQ2xpY2t9XG4gICAgICAgICAgICBzdWdnZXN0aW9uc0Rpc2FibGVkPXtpc0FjdGl2ZVN0cmVhbWluZyB8fCAhIWhhc1NlbGVjdGVkU3VnZ2VzdGlvbn1cbiAgICAgICAgICAgIG1lc3NhZ2VJZD17aWR9XG4gICAgICAgICAgICBpc0xhc3RNZXNzYWdlPXtpc0xhc3RNZXNzYWdlfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHthcHByb3ZhbCAmJiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMgJiYgKFxuICAgICAgICAgIDxTQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbj5cbiAgICAgICAgICAgIDxBcHByb3ZhbEJveFxuICAgICAgICAgICAgICBhY3Rpb25zPXthcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnN9XG4gICAgICAgICAgICAgIHN0YXR1cz17YXBwcm92YWxTdGF0dXN9XG4gICAgICAgICAgICAgIG9uQXBwcm92ZT17dGhyZWFkSWRzID0+IGhhbmRsZUFwcHJvdmFsRGVjaXNpb24odGhyZWFkSWRzLCAnYXBwcm92ZScpfVxuICAgICAgICAgICAgICBvblJlamVjdD17dGhyZWFkSWRzID0+IGhhbmRsZUFwcHJvdmFsRGVjaXNpb24odGhyZWFkSWRzLCAncmVqZWN0Jyl9XG4gICAgICAgICAgICAgIGlzUHJvamVjdERlbGV0ZWQ9e3Byb3BzLnByb2plY3RNZXRhZGF0YT8uaXNfZGVsZXRlZCA9PT0gdHJ1ZX1cbiAgICAgICAgICAgICAgaXNFeHBhbmRlZD17cHJvcHMuZXhwYW5kZWR9XG4gICAgICAgICAgICAgIGhpdGxJbnN0YW5jZUlkPXthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9XG4gICAgICAgICAgICAgIHdhcm5pbmdNZXNzYWdlPXthcHByb3ZhbC53YXJuaW5nX21lc3NhZ2V9XG4gICAgICAgICAgICAgIG1hbnVhbEFwcHJvdmFsRGV0ZWN0ZWQ9e2FwcHJvdmFsLm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9TQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbj5cbiAgICAgICAgKX1cbiAgICAgIDwvU0NNZXNzYWdlSXRlbUlubmVyPlxuICAgICAgPEF0dGFjaG1lbnRQcmV2aWV3TW9kYWxcbiAgICAgICAgaXNPcGVuPXshIXByZXZpZXdBdHRhY2htZW50fVxuICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZVByZXZpZXd9XG4gICAgICAgIGF0dGFjaG1lbnQ9e3ByZXZpZXdBdHRhY2htZW50fVxuICAgICAgLz5cbiAgICA8L1NDTWVzc2FnZUl0ZW1XcmFwcGVyPlxuICApXG59KVxuXG5jb25zdCBDaGF0QUlNZXNzYWdlc0lubmVyID0gKHtcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBpbml0aWFsQ2hhdElkLFxuICBvbkVycm9yLFxuICBvblNlbmRNZXNzYWdlUmVhZHksXG4gIG9uU2Nyb2xsVG9Cb3R0b20sXG4gIGF0dGFjaG1lbnRzLFxuICBhZ2VudHMsXG4gIGV4cGFuZGVkLFxufTogQ2hhdEFJTWVzc2FnZXNQcm9wcykgPT4ge1xuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCB7IGlzV2ViU2VhcmNoQWN0aXZlLCBpc0RlZXBTZWFyY2hBY3RpdmUsIGFnZW50IH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgZXZlbnQgPSB1c2VFdmVudCgpXG4gIGNvbnN0IGF1dGhVc2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IG1lc3NhZ2VzUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCBjaGF0SW5pdGlhbGl6ZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGlzTG9hZGluZ01vcmVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHVzZXJTY3JvbGxpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHNjcm9sbFRocmVzaG9sZFJlZiA9IHVzZVJlZigzOSlcbiAgY29uc3QgbGFzdFNjcm9sbFRvcFJlZiA9IHVzZVJlZigwKVxuICBjb25zdCBzaG93U2Nyb2xsVG9Cb3R0b21SZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHNjcm9sbFJhZlJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICBjb25zdCB3YXNMb2FkaW5nTWVzc2FnZXNSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGxhc3RTY3JvbGxlZFNlc3Npb25SZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW3Nob3dTY3JvbGxUb0JvdHRvbSwgc2V0U2hvd1Njcm9sbFRvQm90dG9tXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcywgc2V0U2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc10gPSB1c2VTdGF0ZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe30pXG5cbiAgY29uc3Qge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICByZXRyeU1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGluaXRpYWxpemVDaGF0LFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBzdG9wR2VuZXJhdGlvbixcbiAgfSA9IHVzZUNoYXRNYW5hZ2VyKHtcbiAgICBjaGF0SWQ6IGluaXRpYWxDaGF0SWQgfHwgdW5kZWZpbmVkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBvbkVycm9yLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIGFnZW50cyxcbiAgfSlcblxuICBjb25zdCBoYW5kbGVTZWxlY3RPcHRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgICBjaGFuZ2VQcm9qZWN0KG9wdGlvbilcbiAgICB9LFxuICAgIFtjaGFuZ2VQcm9qZWN0XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKG1lc3NhZ2VJZDogc3RyaW5nLCBzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc3VnZ2VzdGlvbj8udHJpbSgpKSByZXR1cm5cbiAgICAgIGlmIChzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzW21lc3NhZ2VJZF0pIHJldHVyblxuICAgICAgY29uc3QgaXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50ID0gaXNNYWlha2VyQWdlbnQoYWdlbnQpXG4gICAgICBldmVudChFVkVOVFMuYWlDaGF0U3VnZ2VzdGVkQW5zd2VyLCB7XG4gICAgICAgIGFnZW50X3R5cGU6IGlzTWFya2V0cGxhY2VHbG9iYWxBZ2VudCA/ICdtYXJrZXRwbGFjZScgOiBhZ2VudD8udHlwZSxcbiAgICAgIH0pXG4gICAgICBzZXRTZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzKHByZXYgPT4gKHsgLi4ucHJldiwgW21lc3NhZ2VJZF06IHRydWUgfSkpXG5cbiAgICAgIGNvbnN0IHRhcmdldE1lc3NhZ2UgPSBtZXNzYWdlcy5maW5kKG1zZyA9PiBtc2cuaWQgPT09IG1lc3NhZ2VJZClcbiAgICAgIGNvbnN0IGlzUmV0cnlTdWdnZXN0aW9uID0gISF0YXJnZXRNZXNzYWdlPy5pc0Vycm9yICYmIHN1Z2dlc3Rpb24gPT09IHQoJ2NoYXQucmV0cnknKVxuICAgICAgaWYgKGlzUmV0cnlTdWdnZXN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGxhc3RVc2VyTWVzc2FnZSA9IG1lc3NhZ2VzXG4gICAgICAgICAgLmZpbHRlcihtc2cgPT4gbXNnLnJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5VU0VSIHx8IG1zZy51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpKVxuICAgICAgICAgIC5hdCgtMSlcbiAgICAgICAgaWYgKGxhc3RVc2VyTWVzc2FnZT8ubWVzc2FnZSkge1xuICAgICAgICAgIGNvbnN0IHJldHJ5QXR0YWNobWVudHMgPSBBcnJheS5pc0FycmF5KGxhc3RVc2VyTWVzc2FnZS5hdHRhY2htZW50cylcbiAgICAgICAgICAgID8gbGFzdFVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzXG4gICAgICAgICAgICA6IEFycmF5LmlzQXJyYXkobGFzdFVzZXJNZXNzYWdlLnNvdXJjZXMpXG4gICAgICAgICAgICAgID8gbGFzdFVzZXJNZXNzYWdlLnNvdXJjZXNcbiAgICAgICAgICAgICAgOiBbXVxuICAgICAgICAgIHNlbmRNZXNzYWdlKGxhc3RVc2VyTWVzc2FnZS5tZXNzYWdlLCByZXRyeUF0dGFjaG1lbnRzKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNlbmRNZXNzYWdlKHN1Z2dlc3Rpb24pXG4gICAgfSxcbiAgICBbXG4gICAgICBzZW5kTWVzc2FnZSxcbiAgICAgIHNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHMsXG4gICAgICBldmVudCxcbiAgICAgIGFnZW50Py5lbnRpdHksXG4gICAgICBhZ2VudD8ubmFtZSxcbiAgICAgIGFnZW50Py50eXBlLFxuICAgICAgbWVzc2FnZXMsXG4gICAgICB0LFxuICAgICAgYXV0aFVzZXIuaWQsXG4gICAgXVxuICApXG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBlbCBlc3RhZG8gZGVsIGJvdMOzbiBcInNjcm9sbCB0byBib3R0b21cIiBjb21wYXJhbmRvIGxhIHBvc2ljacOzblxuICAgKiBhY3R1YWwgZGVsIHNjcm9sbCBjb24gZWwgZm9uZG8uIFVzYSB1biByZWYgcGFyYSBldml0YXIgYHNldFN0YXRlYCBjdWFuZG9cbiAgICogZWwgdmFsb3Igbm8gY2FtYmlhLlxuICAgKi9cbiAgY29uc3QgdXBkYXRlU2Nyb2xsQm90dG9tVmlzaWJpbGl0eSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsKSByZXR1cm5cbiAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGVsXG4gICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsVG9wIC0gY2xpZW50SGVpZ2h0XG4gICAgY29uc3Qgc2hvdWxkU2hvdyA9IGRpc3RhbmNlRnJvbUJvdHRvbSA+IDUwXG4gICAgaWYgKHNob3dTY3JvbGxUb0JvdHRvbVJlZi5jdXJyZW50ICE9PSBzaG91bGRTaG93KSB7XG4gICAgICBzaG93U2Nyb2xsVG9Cb3R0b21SZWYuY3VycmVudCA9IHNob3VsZFNob3dcbiAgICAgIHNldFNob3dTY3JvbGxUb0JvdHRvbShzaG91bGRTaG93KVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLyoqXG4gICAqIFNjcm9sbCBpbm1lZGlhdG8gYWwgZm9uZG8gKGRlbnRybyBkZSByQUYgcGFyYSBjb29yZGluYXIgY29uIGVsIHBhaW50KVxuICAgKiB5IGFjdHVhbGl6YSBsYSB2aXNpYmlsaWRhZCBkZWwgYm90w7NuLiBSZXNwZXRhIGBza2lwSWZVc2VyU2Nyb2xsaW5nYCBwYXJhXG4gICAqIG5vIHNvYnJlc2NyaWJpciBlbCBzY3JvbGwgbWFudWFsIGRlbCB1c3VhcmlvIGR1cmFudGUgZWwgc3RyZWFtaW5nLlxuICAgKi9cbiAgY29uc3Qgc2Nyb2xsVG9Cb3R0b21SYWYgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0czogeyBza2lwSWZVc2VyU2Nyb2xsaW5nPzogYm9vbGVhbjsgZGVsYXlNcz86IG51bWJlciB9ID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHsgc2tpcElmVXNlclNjcm9sbGluZyA9IGZhbHNlLCBkZWxheU1zID0gMCB9ID0gb3B0c1xuICAgICAgY29uc3QgcnVuID0gKCkgPT4ge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWwpIHJldHVyblxuICAgICAgICAgIGlmIChza2lwSWZVc2VyU2Nyb2xsaW5nICYmIHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgICAgICAgZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsQm90dG9tVmlzaWJpbGl0eSgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZGVsYXlNcyA+IDApIHNldFRpbWVvdXQocnVuLCBkZWxheU1zKVxuICAgICAgZWxzZSBydW4oKVxuICAgIH0sXG4gICAgW3VwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHldXG4gIClcblxuICBjb25zdCBoYW5kbGVDbGlja1Njcm9sbFRvQm90dG9tID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghbWVzc2FnZXNSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxUbyh7XG4gICAgICB0b3A6IG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsSGVpZ2h0LFxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgIH0pXG4gICAgLy8gRGFyIHRpZW1wbyBhbCBzbW9vdGgtc2Nyb2xsIGFudGVzIGRlIHJlY2FsY3VsYXIgbGEgdmlzaWJpbGlkYWQgZGVsIGJvdMOzbi5cbiAgICBzZXRUaW1lb3V0KHVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHksIDUwMClcbiAgfSwgW3VwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHldKVxuXG4gIC8vIEFsIGRlY2lkaXIgZW4gZWwgQXBwcm92YWxCb3g6IGVsIGJveCBjb2xhcHNhIChib3RvbmVzIC0+IGJhZGdlKSB5IGVsIHN0cmVhbVxuICAvLyBjb250aW7DumEgYWJham8uIFJlYWN0aXZhciBlbCBhdXRvLXNjcm9sbCB5IHNlZ3VpciBlbCBmb25kbyBwYXJhIHF1ZSBsYSB2aXN0YVxuICAvLyBubyBxdWVkZSBhdHLDoXMgKGV2aXRhIHF1ZSBhcGFyZXpjYSBsYSBmbGVjaGEgZGUgc2Nyb2xsLXRvLWJvdHRvbSkuXG4gIGNvbnN0IGhhbmRsZUFwcHJvdmFsRGVjaXNpb25XaXRoU2Nyb2xsID0gdXNlQ2FsbGJhY2soXG4gICAgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIGhhbmRsZUFwcHJvdmFsRGVjaXNpb24+KSA9PiB7XG4gICAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgc2Nyb2xsVGhyZXNob2xkUmVmLmN1cnJlbnQgPSAzOVxuICAgICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbiguLi5hcmdzKVxuICAgICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgICAgc2Nyb2xsVG9Cb3R0b21SYWYoeyBkZWxheU1zOiAxMDAgfSlcbiAgICB9LFxuICAgIFtoYW5kbGVBcHByb3ZhbERlY2lzaW9uLCBzY3JvbGxUb0JvdHRvbVJhZl1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNjcm9sbFRvQm90dG9tID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlVJRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBlLmN1cnJlbnRUYXJnZXRcblxuICAgICAgaWYgKHNjcm9sbFJhZlJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHNjcm9sbFJhZlJlZi5jdXJyZW50KVxuICAgICAgfVxuXG4gICAgICBzY3JvbGxSYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHNjcm9sbFJhZlJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lclxuXG4gICAgICAgIGNvbnN0IGlzU2Nyb2xsaW5nVXAgPSBzY3JvbGxUb3AgPCBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnRcblxuICAgICAgICBpZiAoaXNTY3JvbGxpbmdVcCkge1xuICAgICAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMTVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTmVhckJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodCA8IHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50XG5cbiAgICAgICAgaWYgKGlzTmVhckJvdHRvbSkge1xuICAgICAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICAgICAgfVxuXG4gICAgICAgIHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCA9ICFpc05lYXJCb3R0b21cbiAgICAgICAgbGFzdFNjcm9sbFRvcFJlZi5jdXJyZW50ID0gc2Nyb2xsVG9wXG5cbiAgICAgICAgdXBkYXRlU2Nyb2xsQm90dG9tVmlzaWJpbGl0eSgpXG5cbiAgICAgICAgaWYgKGlzTmVhckJvdHRvbSAmJiBvblNjcm9sbFRvQm90dG9tKSB7XG4gICAgICAgICAgb25TY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgIH1cblxuICAgICAgICBoYW5kbGVTY3JvbGwoY29udGFpbmVyKVxuICAgICAgfSlcbiAgICB9LFxuICAgIFtvblNjcm9sbFRvQm90dG9tLCBoYW5kbGVTY3JvbGwsIHVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHldXG4gIClcblxuICAvLyByZWZzIHRvIHN0YWJpbGl6ZSBmdW5jdGlvbnMgYW5kIGF2b2lkIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgY29uc3Qgc2VuZE1lc3NhZ2VSZWYgPSB1c2VSZWYoc2VuZE1lc3NhZ2UpXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uUmVmID0gdXNlUmVmKHN0b3BHZW5lcmF0aW9uKVxuICBjb25zdCBvblNlbmRNZXNzYWdlUmVhZHlSZWYgPSB1c2VSZWYob25TZW5kTWVzc2FnZVJlYWR5KVxuICBjb25zdCBzZW5kTWVzc2FnZVByb3h5UmVmID0gdXNlUmVmKFxuICAgIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHNlbmRNZXNzYWdlUmVmLmN1cnJlbnQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkLCBzY0lkKVxuICApXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uUHJveHlSZWYgPSB1c2VSZWYoKCkgPT4gc3RvcEdlbmVyYXRpb25SZWYuY3VycmVudCgpKVxuXG4gIC8vIHVwZGF0ZSByZWZzIHdoZW4gZnVuY3Rpb25zIGNoYW5nZVxuICBzZW5kTWVzc2FnZVJlZi5jdXJyZW50ID0gc2VuZE1lc3NhZ2VcbiAgc3RvcEdlbmVyYXRpb25SZWYuY3VycmVudCA9IHN0b3BHZW5lcmF0aW9uXG4gIG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50ID0gb25TZW5kTWVzc2FnZVJlYWR5XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAob25TZW5kTWVzc2FnZVJlYWR5UmVmLmN1cnJlbnQpIHtcbiAgICAgIG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50KFxuICAgICAgICBzZW5kTWVzc2FnZVByb3h5UmVmLmN1cnJlbnQsXG4gICAgICAgIHN0b3BHZW5lcmF0aW9uUHJveHlSZWYuY3VycmVudCxcbiAgICAgICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgICAgICBpc1dyaXRpbmdcbiAgICAgIClcbiAgICB9XG4gIH0sIFt3YWl0aW5nUmVzcG9uc2UsIGlzV3JpdGluZ10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpc0xvYWRpbmdNb3JlUmVmLmN1cnJlbnQgPSBpc0xvYWRpbmdNb3JlTWVzc2FnZXNcbiAgfSwgW2lzTG9hZGluZ01vcmVNZXNzYWdlc10pXG5cbiAgLy8gQ3VhbmRvIGVsIGFnZW50ZSBlbXBpZXphIGEgcmVzcG9uZGVyLCByZXNldGVhciBlbCBmbGFnIHkgZWwgdW1icmFsIHBhcmEgYWN0aXZhciBlbCBhdXRvLXNjcm9sbFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh3YWl0aW5nUmVzcG9uc2UpIHtcbiAgICAgIHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgfVxuICB9LCBbd2FpdGluZ1Jlc3BvbnNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY2hhdEluaXRpYWxpemVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRJbml0aWFsaXplZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgaW5pdGlhbGl6ZUNoYXQoKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLy8gQXV0b3Njcm9sbCBtaWVudHJhcyBlbCB0ZXh0byBkZWwgc3RyZWFtIGNyZWNlLiBFbCB0ZXh0byBzZSBwaW50YSBhbCByaXRtb1xuICAvLyBkZSBgdXNlU21vb3RoU3RyZWFtVGV4dGAgKH42MGZwcyksIG5vIGFsIHJpdG1vIGRlIGxsZWdhZGEgZGUgdG9rZW5zIGRlbFxuICAvLyBiYWNrZW5kOiBwb3IgZXNvIGFjw6EgdXNhbW9zIHVuIGxvb3AgZGUgckFGIHF1ZSBjb21wYXJhIGBzY3JvbGxIZWlnaHRgXG4gIC8vIGNvbnRyYSBlbCDDumx0aW1vIHZhbG9yIG9ic2VydmFkbyB5IGFqdXN0YSBzb2xvIGN1YW5kbyBjYW1iaWEuIEFzw60gZWxcbiAgLy8gc2Nyb2xsIHF1ZWRhIHBlcmZlY3RhbWVudGUgc2luY3Jvbml6YWRvIGNvbiBsYSBhbmltYWNpw7NuIGRlbCB0ZXh0byBzaW5cbiAgLy8gZGVwZW5kZXIgZGUgbGEgY2FkZW5jaWEgZGVsIHN0cmVhbWluZ1N0b3JlLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghd2FpdGluZ1Jlc3BvbnNlICYmICFpc1dyaXRpbmcpIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoIW1lc3NhZ2VzUmVmLmN1cnJlbnQpIHJldHVybiB1bmRlZmluZWRcblxuICAgIGxldCByYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgICBsZXQgbGFzdEhlaWdodCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsSGVpZ2h0XG5cbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJhZklkID0gbnVsbFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHRcbiAgICAgIGlmIChjdXJyZW50SGVpZ2h0ICE9PSBsYXN0SGVpZ2h0KSB7XG4gICAgICAgIGxhc3RIZWlnaHQgPSBjdXJyZW50SGVpZ2h0XG4gICAgICAgIGlmICghdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgZWwuc2Nyb2xsVG9wID0gY3VycmVudEhlaWdodFxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHkoKVxuICAgICAgfVxuICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljaylcbiAgICB9XG5cbiAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmFmSWQgIT0gbnVsbCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpXG4gICAgfVxuICB9LCBbd2FpdGluZ1Jlc3BvbnNlLCBpc1dyaXRpbmcsIHVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHldKVxuXG4gIC8vIEFsIGNvbWVuemFyIGEgZXNwZXJhciBsYSByZXNwdWVzdGEgZGVsIGJhY2tlbmQsIHNjcm9sbCBpbmljaWFsIGFsIGZvbmRvLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh3YWl0aW5nUmVzcG9uc2UgJiYgbWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgc2Nyb2xsVG9Cb3R0b21SYWYoeyBza2lwSWZVc2VyU2Nyb2xsaW5nOiB0cnVlIH0pXG4gICAgfVxuICB9LCBbd2FpdGluZ1Jlc3BvbnNlLCBzY3JvbGxUb0JvdHRvbVJhZl0pXG5cbiAgLy8gU2Nyb2xsIGN1YW5kbyBjYW1iaWFuIGxvcyBtZW5zYWplczogZGlzdGluZ3VlIFwibnVldm8gbWVuc2FqZVwiIChhZ3JlZ2FkbylcbiAgLy8gZGUgXCJyZWVtcGxhem9cIiAobWlzbW8gaWQvbGVuZ3RoLCBlai4gZmVlZGJhY2sgbyBhcHByb3ZhbFN0YXR1cykuIEVuXG4gIC8vIHJlZW1wbGF6b3Mgc29sbyBzZSByZWNhbGN1bGEgbGEgdmlzaWJpbGlkYWQgZGVsIGJvdMOzbiBzaW4gZm9yemFyIHNjcm9sbC5cbiAgY29uc3QgbGFzdE1lc3NhZ2VJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBsYXN0TWVzc2FnZXNMZW5ndGhSZWYgPSB1c2VSZWY8bnVtYmVyPigwKVxuXG4gIC8vIEFsIGNhbWJpYXIgZGUgc2VzacOzbiwgcmVzZXRlYXIgZXN0YWRvIGRlIHNjcm9sbCBtYW51YWwgcGFyYSBubyBoZXJlZGFyIGVsIGNoYXQgYW50ZXJpb3IuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgd2FzTG9hZGluZ01lc3NhZ2VzUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIGxhc3RTY3JvbGxlZFNlc3Npb25SZWYuY3VycmVudCA9IG51bGxcbiAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSAwXG4gICAgbGFzdE1lc3NhZ2VJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50ID0gMFxuICB9LCBbaW5pdGlhbENoYXRJZF0pXG5cbiAgLy8gUmVzdGF1cmFjacOzbiBkZXNkZSBjYWNoZSAoc2luIExvYWRlcik6IGJhamFyIGFsIGZvbmRvIGFsIHJlYWJyaXIgc2VzacOzbiB2aXNpdGFkYS5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAobG9hZGluZ01lc3NhZ2VzIHx8ICFpbml0aWFsQ2hhdElkIHx8IG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG4gICAgaWYgKGxhc3RTY3JvbGxlZFNlc3Npb25SZWYuY3VycmVudCA9PT0gaW5pdGlhbENoYXRJZCkgcmV0dXJuXG4gICAgbGFzdFNjcm9sbGVkU2Vzc2lvblJlZi5jdXJyZW50ID0gaW5pdGlhbENoYXRJZFxuXG4gICAgdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgbGFzdE1lc3NhZ2VJZFJlZi5jdXJyZW50ID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0/LmlkID8/IG51bGxcbiAgICBsYXN0TWVzc2FnZXNMZW5ndGhSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aFxuXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgIHNjcm9sbFRvQm90dG9tUmFmKHsgZGVsYXlNczogMTAwIH0pXG4gIH0sIFtpbml0aWFsQ2hhdElkLCBsb2FkaW5nTWVzc2FnZXMsIG1lc3NhZ2VzLmxlbmd0aCwgbWVzc2FnZXMsIHNjcm9sbFRvQm90dG9tUmFmXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghbWVzc2FnZXNSZWYuY3VycmVudCB8fCBsb2FkaW5nTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzIHx8IGlzTG9hZGluZ01vcmVSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbGFzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXVxuICAgIGNvbnN0IGxhc3RJZCA9IGxhc3RNZXNzYWdlPy5pZCA/PyBudWxsXG4gICAgY29uc3QgcHJldklkID0gbGFzdE1lc3NhZ2VJZFJlZi5jdXJyZW50XG4gICAgY29uc3QgcHJldkxlbiA9IGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50XG4gICAgbGFzdE1lc3NhZ2VJZFJlZi5jdXJyZW50ID0gbGFzdElkXG4gICAgbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnQgPSBtZXNzYWdlcy5sZW5ndGhcblxuICAgIGNvbnN0IGlzTmV3TWVzc2FnZSA9IGxhc3RJZCAhPT0gcHJldklkIHx8IG1lc3NhZ2VzLmxlbmd0aCAhPT0gcHJldkxlblxuICAgIGlmICghaXNOZXdNZXNzYWdlKSB7XG4gICAgICB1cGRhdGVTY3JvbGxCb3R0b21WaXNpYmlsaXR5KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBjb25zdCBpc0F0Qm90dG9tID0gY29udGFpbmVyLnNjcm9sbEhlaWdodCAtIGNvbnRhaW5lci5zY3JvbGxUb3AgPD0gY29udGFpbmVyLmNsaWVudEhlaWdodCArIDEwMFxuICAgIGNvbnN0IGhhc0luaXRpYWxNZXNzYWdlID0gbWVzc2FnZXMuc29tZShtc2cgPT4gbXNnLmlkID09PSAndXNlci1pbml0aWFsLW1lc3NhZ2UnKVxuICAgIGNvbnN0IGlzQXBwcm92YWwgPSAhIWxhc3RNZXNzYWdlICYmIChsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdhcHByb3ZhbC0nKSB8fCAhIWxhc3RNZXNzYWdlLmFwcHJvdmFsKVxuICAgIGNvbnN0IGlzQW5zd2VyT3JRdWVzdGlvbiA9XG4gICAgICAhIWxhc3RNZXNzYWdlICYmIChsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdhbnN3ZXItJykgfHwgbGFzdE1lc3NhZ2UuaWQuc3RhcnRzV2l0aCgncXVlc3Rpb24tJykpXG5cbiAgICAvLyBBcHByb3ZhbDogc2VjdWVuY2lhIGRlIHNjcm9sbHMgY29uIGRlbGF5IHBvcnF1ZSBlbCBBcHByb3ZhbEJveCBuZWNlc2l0YVxuICAgIC8vIHVuIHRpY2sgcGFyYSBtZWRpcnNlLiBTY3JvbGxlYSBhdW5xdWUgZWwgdXN1YXJpbyBubyBlc3TDqSBhbCBmb25kbyBzaSBub1xuICAgIC8vIGVzdMOhIHNjcm9sbGVhbmRvIG1hbnVhbG1lbnRlLlxuICAgIGlmIChpc0FwcHJvdmFsICYmIChpc0F0Qm90dG9tIHx8ICF1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQpKSB7XG4gICAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgICBzY3JvbGxUb0JvdHRvbVJhZih7IGRlbGF5TXM6IDEwMCB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gTnVldm9zIGFuc3dlci9xdWVzdGlvbjogc2Nyb2xsIHNpIGVsIHVzdWFyaW8geWEgZXN0YWJhIGFsIGZvbmRvLlxuICAgIGlmIChpc0Fuc3dlck9yUXVlc3Rpb24gJiYgaXNBdEJvdHRvbSkge1xuICAgICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2FzbyBib3JkZTogY2FtYmlvcyBkZSBtZW5zYWplcyBzaW4gc2VyIG51ZXZvIGFuc3dlci91c2VyL2FwcHJvdmFsXG4gICAgLy8gcGVybyBzw60gdW4gbWVuc2FqZSBudWV2byAobm8gZWwgXCJ1c2VyLWluaXRpYWwtbWVzc2FnZVwiKS4gU2Nyb2xsZWEuXG4gICAgaWYgKCFpc0Fuc3dlck9yUXVlc3Rpb24gJiYgIWlzQXBwcm92YWwgJiYgIWhhc0luaXRpYWxNZXNzYWdlICYmIG1lc3NhZ2VzLmxlbmd0aCA+IHByZXZMZW4pIHtcbiAgICAgIHNjcm9sbFRvQm90dG9tUmFmKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHkoKVxuICB9LCBbbWVzc2FnZXMsIGxvYWRpbmdNZXNzYWdlcywgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCBzY3JvbGxUb0JvdHRvbVJhZiwgdXBkYXRlU2Nyb2xsQm90dG9tVmlzaWJpbGl0eV0pXG5cbiAgLy8gQWwgYWJyaXIvY2FyZ2FyIHVuYSBjb252ZXJzYWNpw7NuIGVsIGNvbnRlbmVkb3Igc2UgcmVtb250YSAoTG9hZGVyIOKGkiBsaXN0YSkgY29uXG4gIC8vIHNjcm9sbFRvcD0wLiBGb3J6YW1vcyBpciBhbCBmb25kbyBhbCB0ZXJtaW5hciBsb2FkTWVzc2FnZXMsIHNpbiBhZmVjdGFyIHBhZ2luYWNpw7NuIGhhY2lhIGFycmliYS5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBqdXN0RmluaXNoZWRMb2FkaW5nID0gd2FzTG9hZGluZ01lc3NhZ2VzUmVmLmN1cnJlbnQgJiYgIWxvYWRpbmdNZXNzYWdlc1xuICAgIHdhc0xvYWRpbmdNZXNzYWdlc1JlZi5jdXJyZW50ID0gbG9hZGluZ01lc3NhZ2VzXG5cbiAgICBpZiAoIWp1c3RGaW5pc2hlZExvYWRpbmcgfHwgbWVzc2FnZXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2Nyb2xsVGhyZXNob2xkUmVmLmN1cnJlbnQgPSAzOVxuICAgIGxhc3RNZXNzYWdlSWRSZWYuY3VycmVudCA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdPy5pZCA/PyBudWxsXG4gICAgbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnQgPSBtZXNzYWdlcy5sZW5ndGhcblxuICAgIHNjcm9sbFRvQm90dG9tUmFmKClcbiAgICBzY3JvbGxUb0JvdHRvbVJhZih7IGRlbGF5TXM6IDEwMCB9KVxuICB9LCBbbG9hZGluZ01lc3NhZ2VzLCBtZXNzYWdlcy5sZW5ndGgsIHNjcm9sbFRvQm90dG9tUmFmXSlcblxuICAvLyBPYnRlbmVyIGVsIMO6bHRpbW8gbWVuc2FqZSBkZWwgdXN1YXJpbyBwYXJhIHZlcmlmaWNhciBzaSB0aWVuZSBhdHRhY2htZW50c1xuICBjb25zdCBsYXN0VXNlck1lc3NhZ2UgPSBtZXNzYWdlc1xuICAgIC5maWx0ZXIobXNnID0+IG1zZy5yb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuVVNFUiB8fCBtc2cudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSlcbiAgICAuYXQoLTEpXG5cbiAgY29uc3QgYXR0YWNobWVudHNDb3VudCA9XG4gICAgKEFycmF5LmlzQXJyYXkobGFzdFVzZXJNZXNzYWdlPy5hdHRhY2htZW50cykgPyBsYXN0VXNlck1lc3NhZ2UuYXR0YWNobWVudHMubGVuZ3RoIDogMCkgfHxcbiAgICAoQXJyYXkuaXNBcnJheShsYXN0VXNlck1lc3NhZ2U/LnNvdXJjZXMpID8gbGFzdFVzZXJNZXNzYWdlLnNvdXJjZXMubGVuZ3RoIDogMClcblxuICBjb25zdCBzdHJlYW1Mb2FkaW5nRGlzcGxheSA9IHJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSh7XG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgYWN0aXZlTG9hZGluZ3M6IGFjdGl2ZUxvYWRpbmdzIHx8IHt9LFxuICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gICAgaGFzQXR0YWNobWVudHM6IEJvb2xlYW4oYXR0YWNobWVudHNDb3VudCksXG4gICAgYXR0YWNobWVudHNDb3VudCxcbiAgICB0LFxuICB9KVxuXG4gIGNvbnN0IGlzU2Nyb2xsT25QYXJlbnQgPSAhIWV4cGFuZGVkXG4gIGNvbnN0IGlzTWFya2V0cGxhY2VHbG9iYWxBZ2VudCA9IGlzTWFpYWtlckFnZW50KGFnZW50KVxuXG4gIC8vIEFsIGV4cGFuZGlyL2NvbnRyYWVyIGVsIG1vZGFsIGVsIHJlZiBwYXNhIGEgb3RybyBjb250ZW5lZG9yIChzY3JvbGxUb3Agc2UgcmVzZXRlYSBhIDApLlxuICAvLyBSZXN0YXVyYXIgbGEgcG9zaWNpw7NuIGRlIHNjcm9sbCBhbnRlcyBkZWwgcGFpbnQgcGFyYSBldml0YXIgcXVlIGxhIGNvbnZlcnNhY2nDs24gc2FsdGUgYXJyaWJhLlxuICBjb25zdCBleHBhbmRlZFJlZiA9IHVzZVJlZihleHBhbmRlZClcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZXhwYW5kZWRSZWYuY3VycmVudCAhPT0gZXhwYW5kZWQgJiYgbWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgY29uc3Qgc2F2ZWRTY3JvbGxUb3AgPSBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnRcbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gc2F2ZWRTY3JvbGxUb3BcbiAgICAgIGV4cGFuZGVkUmVmLmN1cnJlbnQgPSBleHBhbmRlZFxuICAgIH0gZWxzZSB7XG4gICAgICBleHBhbmRlZFJlZi5jdXJyZW50ID0gZXhwYW5kZWRcbiAgICB9XG4gIH0sIFtleHBhbmRlZF0pXG5cbiAgaWYgKGxvYWRpbmdNZXNzYWdlcykge1xuICAgIHJldHVybiAoXG4gICAgICA8RmFkZSBmaWxsPlxuICAgICAgICA8TG9hZGVyIC8+XG4gICAgICA8L0ZhZGU+XG4gICAgKVxuICB9XG5cbiAgY29uc3QgbWVzc2FnZXNDb250ZW50ID0gKFxuICAgIDw+XG4gICAgICB7aXNMb2FkaW5nTW9yZU1lc3NhZ2VzICYmIDxMb2FkaW5nVGV4dCB0ZXh0PXt0KCdjaGF0LmxvYWRpbmdNb3JlJyl9IC8+fVxuICAgICAgPD5cbiAgICAgICAge21lc3NhZ2VzLm1hcCgobWVzc2FnZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0Fzc2lzdGFudE1lc3NhZ2UgPSBtZXNzYWdlLnJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQgfHwgbWVzc2FnZS51c2VyLmlkID09PSAnYXNzaXN0YW50J1xuICAgICAgICAgIGNvbnN0IGlzTGFzdE1lc3NhZ2UgPSBpbmRleCA9PT0gbWVzc2FnZXMubGVuZ3RoIC0gMVxuICAgICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgPVxuICAgICAgICAgICAgaXNBc3Npc3RhbnRNZXNzYWdlICYmIGlzTGFzdE1lc3NhZ2UgJiYgaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZChtZXNzYWdlLmlkKVxuICAgICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nID0gaXNTdHJlYW1pbmdQbGFjZWhvbGRlciAmJiAod2FpdGluZ1Jlc3BvbnNlIHx8IGlzV3JpdGluZylcblxuICAgICAgICAgIC8vIE5vIGZpbHRyYXIgZWwgcGxhY2Vob2xkZXIgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nOiBzdSB0ZXh0byB2aXZlXG4gICAgICAgICAgLy8gZW4gZWwgc3RyZWFtaW5nU3RvcmUgeSBgbWVzc2FnZS5tZXNzYWdlYCBlcyAnJyBoYXN0YSBlbCBjb21wbGV0ZS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaXNTdHJlYW1pbmdQbGFjZWhvbGRlciAmJlxuICAgICAgICAgICAgIWlzU3RyZWFtaW5nICYmXG4gICAgICAgICAgICAhKG1lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aCB8fCBtZXNzYWdlLnNvdXJjZXM/Lmxlbmd0aCkgJiZcbiAgICAgICAgICAgICFtZXNzYWdlLm1lc3NhZ2UgJiZcbiAgICAgICAgICAgICFtZXNzYWdlLnByb2plY3Q/Lm5hbWUgJiZcbiAgICAgICAgICAgICFtZXNzYWdlLmFwcHJvdmFsXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VGZWVkYmFjayA9XG4gICAgICAgICAgICBtZXNzYWdlPy53YXNIZWxwZnVsID09PSB1bmRlZmluZWQgfHwgbWVzc2FnZS53YXNIZWxwZnVsID09PSBudWxsXG4gICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICA6IG1lc3NhZ2Uud2FzSGVscGZ1bFxuICAgICAgICAgICAgICAgID8gRmVlZGJhY2suVEhVTUJTX1VQXG4gICAgICAgICAgICAgICAgOiBGZWVkYmFjay5USFVNQlNfRE9XTlxuXG4gICAgICAgICAgLy8gS2V5IGVzdGFibGU6IHNvbG8gbWVzc2FnZS5pZCBwYXJhIGV2aXRhciByZW1vdW50IGR1cmFudGUgc3RyZWFtaW5nIChtZXNzYWdlLmRhdGUgcHVlZGUgY2FtYmlhcilcbiAgICAgICAgICBjb25zdCBtZXNzYWdlS2V5ID0gbWVzc2FnZS5pZCA/PyBgbXNnLSR7aW5kZXh9YFxuXG4gICAgICAgICAgY29uc3QgdHVybklkID0gcmVzb2x2ZVJldHJ5VHVybklkKG1lc3NhZ2UpXG4gICAgICAgICAgY29uc3QgdXNlck1lc3NhZ2VGb3JSZXRyeSA9IGZpbmRVc2VyTWVzc2FnZUZvclJldHJ5KG1lc3NhZ2VzLCBtZXNzYWdlKVxuICAgICAgICAgIGNvbnN0IGNhblJldHJ5ID1cbiAgICAgICAgICAgICEhdXNlck1lc3NhZ2VGb3JSZXRyeSAmJlxuICAgICAgICAgICAgIWlzU3RyZWFtaW5nICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5pc0Vycm9yICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5hcHByb3ZhbCAmJlxuICAgICAgICAgICAgKG1lc3NhZ2UuaXNGcm9udGVuZENhbmNlbGxlZCB8fCAoIW1lc3NhZ2UuaXNfY2FuY2VsbGVkICYmICEhdHVybklkKSlcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8TWVzc2FnZUl0ZW1cbiAgICAgICAgICAgICAgey4uLm1lc3NhZ2V9XG4gICAgICAgICAgICAgIGtleT17bWVzc2FnZUtleX1cbiAgICAgICAgICAgICAgYXV0aFVzZXI9e2F1dGhVc2VyfVxuICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RPcHRpb249e2hhbmRsZVNlbGVjdE9wdGlvbn1cbiAgICAgICAgICAgICAgaGFuZGxlRmVlZGJhY2s9e2hhbmRsZUZlZWRiYWNrfVxuICAgICAgICAgICAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uPXtoYW5kbGVBcHByb3ZhbERlY2lzaW9uV2l0aFNjcm9sbH1cbiAgICAgICAgICAgICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrPXtoYW5kbGVTdWdnZXN0aW9uQ2xpY2t9XG4gICAgICAgICAgICAgIGhhbmRsZVJldHJ5PXtjYW5SZXRyeSA/ICgpID0+IHJldHJ5TWVzc2FnZShtZXNzYWdlKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgaGFzU2VsZWN0ZWRTdWdnZXN0aW9uPXshIXNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHNbbWVzc2FnZS5pZF19XG4gICAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17bWVzc2FnZUZlZWRiYWNrfVxuICAgICAgICAgICAgICBpc1N0cmVhbWluZz17aXNTdHJlYW1pbmd9XG4gICAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2U9e2lzTGFzdE1lc3NhZ2V9XG4gICAgICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKVxuICAgICAgICB9KX1cbiAgICAgIDwvPlxuICAgICAge3N0cmVhbUxvYWRpbmdEaXNwbGF5ICYmIChcbiAgICAgICAgPFNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uPlxuICAgICAgICAgIDxBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIGFjdGl2aXR5PXtzdHJlYW1Mb2FkaW5nRGlzcGxheX0gLz5cbiAgICAgICAgPC9TQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbj5cbiAgICAgICl9XG4gICAgPC8+XG4gIClcblxuICByZXR1cm4gKFxuICAgIDxTQ01lc3NhZ2VzT3V0ZXIgJHNjcm9sbE9uUGFyZW50PXtpc1Njcm9sbE9uUGFyZW50fT5cbiAgICAgIHtpc1Njcm9sbE9uUGFyZW50ID8gKFxuICAgICAgICA8U0NNZXNzYWdlc1Njcm9sbCByZWY9e21lc3NhZ2VzUmVmfSBvblNjcm9sbD17aGFuZGxlU2Nyb2xsVG9Cb3R0b219PlxuICAgICAgICAgIDxTQ01lc3NhZ2VzSW5uZXIgJHNjcm9sbE9uUGFyZW50PXtpc1Njcm9sbE9uUGFyZW50fSAkaXNNYXJrZXRwbGFjZUdsb2JhbD17aXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50fT5cbiAgICAgICAgICAgIHttZXNzYWdlc0NvbnRlbnR9XG4gICAgICAgICAgPC9TQ01lc3NhZ2VzSW5uZXI+XG4gICAgICAgIDwvU0NNZXNzYWdlc1Njcm9sbD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxTQ01lc3NhZ2VzSW5uZXJcbiAgICAgICAgICByZWY9e21lc3NhZ2VzUmVmfVxuICAgICAgICAgIG9uU2Nyb2xsPXtoYW5kbGVTY3JvbGxUb0JvdHRvbX1cbiAgICAgICAgICAkc2Nyb2xsT25QYXJlbnQ9e2ZhbHNlfVxuICAgICAgICAgICRpc01hcmtldHBsYWNlR2xvYmFsPXtpc01hcmtldHBsYWNlR2xvYmFsQWdlbnR9XG4gICAgICAgID5cbiAgICAgICAgICB7bWVzc2FnZXNDb250ZW50fVxuICAgICAgICA8L1NDTWVzc2FnZXNJbm5lcj5cbiAgICAgICl9XG5cbiAgICAgIHtzaG93U2Nyb2xsVG9Cb3R0b20gJiYgKFxuICAgICAgICA8U2Nyb2xsVG9Cb3R0b21CdXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e2hhbmRsZUNsaWNrU2Nyb2xsVG9Cb3R0b219PlxuICAgICAgICAgIDxBcnJvd1NtYWxsRG93biBjb2xvcj1cIiM2NjZcIiB3aWR0aD1cIjIwcHhcIiBoZWlnaHQ9XCIyMHB4XCIgLz5cbiAgICAgICAgPC9TY3JvbGxUb0JvdHRvbUJ1dHRvbj5cbiAgICAgICl9XG4gICAgPC9TQ01lc3NhZ2VzT3V0ZXI+XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IENoYXRBSU1lc3NhZ2VzID0gUmVhY3QubWVtbyhDaGF0QUlNZXNzYWdlc0lubmVyKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBT0EsS0FBSyxJQUFRQyxJQUFJLEVBQWFDLFdBQVcsRUFBRUMsU0FBUyxFQUFFQyxlQUFlLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxFQUFBQyxhQUFBLElBQUFDLGNBQUEsUUFBUSxPQUFPO0FBQzdHLFNBQVNDLGNBQWMsUUFBUSxpREFBaUQ7QUFFaEYsU0FBU0MsY0FBYyxRQUFRLDJDQUEyQztBQUMxRSxTQUFTQyxXQUFXLFFBQVEscUNBQXFDO0FBQ2pFLFNBQVNDLHNCQUFzQixRQUFRLG9DQUFvQztBQUMzRSxTQUFTQyxtQkFBbUIsUUFBUSxnREFBZ0Q7QUFDcEYsU0FBU0MsY0FBYyxRQUFRLDRCQUE0QjtBQUczRCxTQUFzQkMsZUFBZSxRQUFRLHFCQUFxQjtBQUNsRSxTQUFTQyxzQkFBc0IsRUFBRUMsZ0JBQWdCLFFBQVEsc0NBQXNDO0FBRS9GLFNBQVNDLGNBQWMsUUFBUSxpQ0FBaUM7QUFDaEUsU0FBa0JDLE9BQU8sUUFBUSwyQkFBMkI7QUFFNUQsU0FBU0MsSUFBSSxRQUFRLHFCQUFxQjtBQUMxQyxTQUFTQyxjQUFjLFFBQVEsOENBQThDO0FBQzdFLFNBQVNDLG1CQUFtQixRQUFRLG9DQUFvQztBQUN4RSxTQUFTQyxtQkFBbUIsUUFBUSxvQ0FBb0M7QUFFeEUsU0FBU0MsV0FBVyxRQUFRLHlCQUF5QjtBQUNyRCxTQUFTQyxzQkFBc0Is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
|
|
1124
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiY3JlYXRlRWxlbWVudCIsIl9jcmVhdGVFbGVtZW50IiwiQXR0YWNobWVudENhcmQiLCJBcHByb3ZhbEJveCIsIkF0dGFjaG1lbnRQcmV2aWV3TW9kYWwiLCJBdHRhY2htZW50Q2FyZEF1ZGlvIiwiTWFpYVN0cmVhbWRvd24iLCJDaGF0SGlzdG9yeVJvbGUiLCJyZW5kZXJUZXh0V2l0aE1lbnRpb25zIiwiaGFzSW5saW5lTWFya2VycyIsImlzTWFpYWtlckFnZW50IiwidXNlVXNlciIsInVzZVQiLCJ1c2VDaGF0TWFuYWdlciIsInVzZVNtb290aFN0cmVhbVRleHQiLCJ1c2VTdHJlYW1pbmdNZXNzYWdlIiwiTG9hZGluZ1RleHQiLCJBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIiwiUmVhc29uaW5nQmxvY2siLCJzaG91bGRTdHJlYW1OYXJyYXRpb25JblRpbWVsaW5lIiwiUmVhc29uaW5nVGltZWxpbmUiLCJTQ1RpbWVsaW5lSW5kaWNhdG9yIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsInJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSIsInJlc29sdmVSZXRyeVR1cm5JZCIsImZpbmRVc2VyTWVzc2FnZUZvclJldHJ5IiwidXNlUmVhc29uaW5nVHJhY2UiLCJMb2FkZXIiLCJGYWRlIiwiTWVzc2FnZUZyb21Vc2VyIiwiTWVzc2FnZUZyb21PdGhlciIsIk1lc3NhZ2VDb250ZW50RnJvbVVzZXIiLCJNZXNzYWdlQ29udGVudEZyb21PdGhlciIsIk1lc3NhZ2VGZWVkYmFjayIsIlNDQ0FJTWVzc2FnZVdyYXBwZXIiLCJTY3JvbGxUb0JvdHRvbUJ1dHRvbiIsIlNDU2Nyb2xsSWNvblN3YXAiLCJTQ1dyaXRpbmdEb3RzIiwiU0NNZXNzYWdlc091dGVyIiwiU0NNZXNzYWdlc1Njcm9sbCIsIlNDTWVzc2FnZXNJbm5lciIsIlNDVHVyblNwYWNlciIsIlNDT3B0aW9uc0xpc3QiLCJTQ09wdGlvbkl0ZW0iLCJTQ01lc3NhZ2VJdGVtV3JhcHBlciIsIlNDTWVzc2FnZUl0ZW1Jbm5lciIsIlNDQXR0YWNobWVudHNSb3ciLCJTQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbiIsIlNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uIiwiU0NNZXNzYWdlc0dyYWRpZW50VG9wIiwiU0NNZXNzYWdlc0dyYWRpZW50Qm90dG9tIiwiRmVlZGJhY2siLCJ1c2VHbG9iYWxDb250ZXh0IiwiRW50aXR5TGlua0N1c3RvbUxpbmsiLCJnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZSIsIkNoYXRBSVN1Z2dlc3Rpb25zIiwiQ2hhdEFJQ3JlYXRlQWdlbnRBY3Rpb25zIiwiRVZFTlRTIiwidXNlRXZlbnQiLCJkb3dubG9hZEZpbGVGcm9tVXJsIiwianN4IiwiX2pzeCIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwianN4cyIsIl9qc3hzIiwidHVybkFuY2hvck9mZnNldCIsInZpZXdwb3J0SGVpZ2h0IiwiTWF0aCIsIm1pbiIsIlRVUk5fU0NST0xMX0RVUkFUSU9OX01TIiwiVFVSTl9TQ1JPTExfTUFYX0RVUkFUSU9OX01TIiwiVFVSTl9TQ1JPTExfTE9OR19ESVNUQU5DRV9QWCIsIk1lc3NhZ2VXcmFwcGVyIiwiX3JlZiIsImlzQ3VycmVudFVzZXIiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiTWVzc2FnZUNvbXBvbmVudCIsIl9vYmplY3RTcHJlYWQiLCJNZXNzYWdlQ29udGVudFdyYXBwZXIiLCJfcmVmMiIsIl9leGNsdWRlZDIiLCJNZXNzYWdlQ29udGVudENvbXBvbmVudCIsIk1lc3NhZ2VPcHRpb25zIiwiX3JlZjMiLCJvcHRpb25zIiwiaGFuZGxlU2VsZWN0T3B0aW9uIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5Iiwic2VsZWN0ZWRPcHRpb24iLCJzZXRTZWxlY3RlZE9wdGlvbiIsImhhbmRsZVNlbGVjdCIsIm9wdGlvbiIsIm1hcCIsIiRoYXNTZWxlY3Rpb24iLCIkZGltbWVkIiwiaWQiLCJvbkNsaWNrIiwibmFtZSIsIlN0cmVhbWluZ01lc3NhZ2VCb2R5IiwiX3Byb3BzJGNyZWF0ZUFnZW50Rm9sIiwiX3Byb3BzJHN1Z2dlc3Rpb25zIiwic3RyZWFtaW5nVGV4dCIsImlzU3RyZWFtaW5nIiwibWVzc2FnZUlkIiwicmF3VGV4dCIsIm1lc3NhZ2UiLCJ3aW5GbGFncyIsIndpbmRvdyIsImRpc3BsYXlUZXh0IiwiZW5hYmxlZCIsIm1heENoYXJzUGVyRnJhbWUiLCJzbmFwVG9Xb3JkQm91bmRhcnkiLCJzdHJlYW1MYWdNcyIsInRhcmdldExhZ01zIiwic3RyZWFtQWRhcHQiLCJhZGFwdFRvQmFja2VuZFJhdGUiLCJzdHJlYW1CdWZmZXJNcyIsInRhcmdldEJ1ZmZlck1zIiwic3RyZWFtTWluQnVmZmVyIiwibWluQnVmZmVyQ2hhcnMiLCJzdHJlYW1XYXJtdXBNcyIsIndhcm11cE1zIiwiY3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZCIsImNyZWF0ZUFnZW50Rm9sbG93VXAiLCJhZ2VudElkIiwiaGFzTWVudGlvbnMiLCJtZW50aW9uTm9kZXMiLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJkaXNwbGF5IiwidmFyaWFudCIsImNvbXBvbmVudHMiLCJhIiwiaXNBbmltYXRpbmciLCJpc0Fzc2lzdGFudCIsImlzRXJyb3IiLCJhcHByb3ZhbCIsIm9uUmV0cnkiLCJjb250ZW50Iiwic291cmNlcyIsInVuZGVmaW5lZCIsImhhbmRsZUZlZWRiYWNrIiwiaGFuZGxlRmVlZGJhY2tDbGljayIsImRpc2FibGVGZWVkYmFjayIsInN1Z2dlc3Rpb25zIiwibGVuZ3RoIiwib25TZWxlY3RTdWdnZXN0aW9uIiwic3VnZ2VzdGlvbiIsImhhbmRsZVN1Z2dlc3Rpb25DbGljayIsImRpc2FibGVkIiwic3VnZ2VzdGlvbnNEaXNhYmxlZCIsImhpZGRlbiIsImlzTGFzdE1lc3NhZ2UiLCJNZXNzYWdlSXRlbSIsIl9wcm9wcyRyZWFzb25pbmciLCJfcHJvcHMkcHJvamVjdE1ldGFkYXQiLCJ1c2VyIiwiYXV0aFVzZXIiLCJpc0NoYW5nZVByb2plY3QiLCJoYW5kbGVBcHByb3ZhbERlY2lzaW9uIiwiaGFuZGxlUmV0cnkiLCJyb2xlIiwiYXR0YWNobWVudHMiLCJhcHByb3ZhbFN0YXR1cyIsImhhc1NlbGVjdGVkU3VnZ2VzdGlvbiIsInN0cmVhbUFjdGl2aXR5IiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJwcmV2aWV3QXR0YWNobWVudCIsInNldFByZXZpZXdBdHRhY2htZW50IiwiVVNFUiIsInRvU3RyaW5nIiwiQVNTSVNUQU5UIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlciIsImlzQWN0aXZlU3RyZWFtaW5nIiwiaGFzU3RyZWFtVGV4dCIsIkJvb2xlYW4iLCJyZWFzb25pbmdUcmFjZSIsInN0cmVhbU5hcnJhdGlvbkluVGltZWxpbmUiLCJzdGVwcyIsInNob3dTdHJlYW1pbmdCb2R5Iiwic2hvd0FjdGl2aXR5SW5kaWNhdG9yIiwibWVzc2FnZUF0dGFjaG1lbnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiaGFuZGxlQXR0YWNobWVudENsaWNrIiwiYXR0YWNobWVudCIsImZpbGUiLCJGaWxlIiwib3JpZ2luYWxGaWxlIiwidXJsX3RodW1ibmFpbCIsInVybF9vcmlnaW5hbCIsInVybF9maWxlIiwiaGFuZGxlQ2xvc2VQcmV2aWV3IiwiaGFuZGxlQXR0YWNobWVudERvd25sb2FkIiwiX3JlZjQiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsImV4dGVuc2lvbiIsImZpbGVOYW1lIiwiZmlsZVVybCIsImJsb2JVcmwiLCJkb3dubG9hZGVkRmlsZSIsImxpbmsiLCJfdCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiaW5jbHVkZXMiLCJjb25jYXQiLCJ0eXBlIiwic2VudCIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImFicnVwdCIsImRvY3VtZW50IiwiaHJlZiIsImRvd25sb2FkIiwiYm9keSIsImFwcGVuZENoaWxkIiwiY2xpY2siLCJzZXRUaW1lb3V0IiwicmVtb3ZlQ2hpbGQiLCJyZXZva2VPYmplY3RVUkwiLCJjb25zb2xlIiwiZXJyb3IiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsImhhc0ZlZWRiYWNrIiwiJGlzQXNzaXN0YW50IiwibWVzc2FnZUV4dHJhQ29udGVudCIsImZlZWRiYWNrIiwic2Vzc2lvbklkIiwic3BsaXQiLCJmaWx0ZXIiLCJxdWVzdGlvbklkIiwiam9pbiIsInRyYWNlIiwicmVhc29uaW5nIiwiaW5kZXgiLCJfYXR0YWNobWVudCR0eXBlIiwiX2F0dGFjaG1lbnQkbmFtZSIsImF0dGFjaG1lbnRUeXBlIiwidG9Mb3dlckNhc2UiLCJhdHRhY2htZW50TmFtZSIsImlzQXVkaW9GaWxlIiwic3RhcnRzV2l0aCIsInNvbWUiLCJleHQiLCJlbmRzV2l0aCIsInBvc2l0aW9uSW5kZXgiLCJvbkRvd25sb2FkIiwiYWN0aXZpdHkiLCJjb21wYWN0IiwicGVuZGluZ19hY3Rpb25zIiwiYWN0aW9ucyIsInN0YXR1cyIsIm9uQXBwcm92ZSIsInRocmVhZElkcyIsIm9uUmVqZWN0IiwiaXNQcm9qZWN0RGVsZXRlZCIsInByb2plY3RNZXRhZGF0YSIsImlzX2RlbGV0ZWQiLCJpc0V4cGFuZGVkIiwiZXhwYW5kZWQiLCJoaXRsSW5zdGFuY2VJZCIsIm9yaWdpbmFsX3RocmVhZF9pZCIsIndhcm5pbmdNZXNzYWdlIiwid2FybmluZ19tZXNzYWdlIiwibWFudWFsQXBwcm92YWxEZXRlY3RlZCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsImlzT3BlbiIsIm9uQ2xvc2UiLCJDaGF0QUlNZXNzYWdlc0lubmVyIiwiX3JlZjUiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJpbml0aWFsQ2hhdElkIiwib25FcnJvciIsIm9uU2VuZE1lc3NhZ2VSZWFkeSIsIm9uU2Nyb2xsVG9Cb3R0b20iLCJhZ2VudHMiLCJfdXNlVCIsInQiLCJfdXNlR2xvYmFsQ29udGV4dCIsImlzV2ViU2VhcmNoQWN0aXZlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwiYWdlbnQiLCJldmVudCIsIm1lc3NhZ2VzUmVmIiwiY2hhdEluaXRpYWxpemVkUmVmIiwiaXNMb2FkaW5nTW9yZVJlZiIsInVzZXJTY3JvbGxpbmdSZWYiLCJzY3JvbGxUaHJlc2hvbGRSZWYiLCJsYXN0U2Nyb2xsVG9wUmVmIiwic2hvd1Njcm9sbFRvQm90dG9tUmVmIiwic2hvd1RvcEdyYWRpZW50UmVmIiwic2hvd0JvdHRvbUdyYWRpZW50UmVmIiwic2Nyb2xsUmFmUmVmIiwiYW5jaG9yZWRUdXJuSWRSZWYiLCJzcGFjZXJFbFJlZiIsInNwYWNlckhlaWdodFJlZiIsInR1cm5TY3JvbGxSYWZSZWYiLCJ3YXNMb2FkaW5nTWVzc2FnZXNSZWYiLCJsYXN0U2Nyb2xsZWRTZXNzaW9uUmVmIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJzaG93U2Nyb2xsVG9Cb3R0b20iLCJzZXRTaG93U2Nyb2xsVG9Cb3R0b20iLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNob3dUb3BHcmFkaWVudCIsInNldFNob3dUb3BHcmFkaWVudCIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2hvd0JvdHRvbUdyYWRpZW50Iiwic2V0U2hvd0JvdHRvbUdyYWRpZW50IiwiX3VzZVN0YXRlMSIsIl91c2VTdGF0ZTEwIiwic2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcyIsInNldFNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHMiLCJfdXNlQ2hhdE1hbmFnZXIiLCJjaGF0SWQiLCJtZXNzYWdlcyIsImxvYWRpbmdNZXNzYWdlcyIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsIndhaXRpbmdSZXNwb25zZSIsImlzV3JpdGluZyIsImxvYWRpbmdNZXNzYWdlIiwiYWN0aXZlTG9hZGluZ3MiLCJzZW5kTWVzc2FnZSIsInJldHJ5TWVzc2FnZSIsImNoYW5nZVByb2plY3QiLCJpbml0aWFsaXplQ2hhdCIsImhhbmRsZVNjcm9sbCIsInN0b3BHZW5lcmF0aW9uIiwidXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMiLCJlbCIsImN1cnJlbnQiLCJzY3JvbGxUb3AiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJkaXN0YW5jZUZyb21Cb3R0b20iLCJzaG91bGRTaG93IiwibmV4dFRvcEdyYWRpZW50IiwibmV4dEJvdHRvbUdyYWRpZW50Iiwic2Nyb2xsVG9Cb3R0b21SYWYiLCJvcHRzIiwiX29wdHMkc2tpcElmVXNlclNjcm9sIiwic2tpcElmVXNlclNjcm9sbGluZyIsIl9vcHRzJGRlbGF5TXMiLCJkZWxheU1zIiwicnVuIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiY2FuY2VsVHVyblNjcm9sbCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0ZVNjcm9sbFRvIiwidG9wIiwiZnJvbSIsImRpc3RhbmNlIiwiYWJzIiwiZHVyYXRpb24iLCJzdGFydGVkQXQiLCJwZXJmb3JtYW5jZSIsIm5vdyIsInN0ZXAiLCJwcm9ncmVzcyIsImVhc2VkIiwicG93Iiwic2V0U3BhY2VySGVpZ2h0IiwiaGVpZ2h0IiwiY2xlYXJUdXJuU3BhY2UiLCJkcmFpblR1cm5TcGFjZSIsInJlbW92YWJsZSIsIm1heCIsInJlbGVhc2VUdXJuU3BhY2UiLCJoYW5kbGVVc2VyU2Nyb2xsSW50ZW50IiwibWVhc3VyZVR1cm4iLCJzcGFjZXJFbCIsInF1ZXN0aW9uRWwiLCJxdWVyeVNlbGVjdG9yIiwiY29udGFpbmVyVG9wIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicXVlc3Rpb25Ub3AiLCJjb250ZW50Qm90dG9tIiwidHVybkhlaWdodCIsInJlc2VydmVUdXJuU3BhY2UiLCJtZWFzdXJlZCIsIm9mZnNldCIsInRhcmdldFNjcm9sbFRvcCIsInN5bmNUdXJuU3BhY2UiLCJyZXNlcnZlZCIsImhhbmRsZUNsaWNrU2Nyb2xsVG9Cb3R0b20iLCJoYW5kbGVTY3JvbGxUb0JvdHRvbSIsImUiLCJjb250YWluZXIiLCJjdXJyZW50VGFyZ2V0IiwiaXNTY3JvbGxpbmdVcCIsImlzTmVhckJvdHRvbSIsInNlbmRNZXNzYWdlUmVmIiwic3RvcEdlbmVyYXRpb25SZWYiLCJvblNlbmRNZXNzYWdlUmVhZHlSZWYiLCJzZW5kTWVzc2FnZVByb3h5UmVmIiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIm1lbnRpb25zIiwiZnVhSWQiLCJzY0lkIiwic3RvcEdlbmVyYXRpb25Qcm94eVJlZiIsIm1lc3NhZ2VzRGF0YVJlZiIsInNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHNSZWYiLCJ0cmltIiwiY3VycmVudE1lc3NhZ2VzIiwiaXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50IiwiYWlDaGF0U3VnZ2VzdGVkQW5zd2VyIiwiYWdlbnRfdHlwZSIsIl9kZWZpbmVQcm9wZXJ0eSIsInRhcmdldE1lc3NhZ2UiLCJmaW5kIiwibXNnIiwiaXNSZXRyeVN1Z2dlc3Rpb24iLCJsYXN0VXNlck1lc3NhZ2UiLCJhdCIsInJldHJ5QXR0YWNobWVudHMiLCJyYWZJZCIsImxhc3RIZWlnaHQiLCJ0aWNrIiwiY3VycmVudEhlaWdodCIsImxhc3RSZXNlcnZlZFF1ZXN0aW9uUmVmIiwiX21lc3NhZ2VzJGluZGV4IiwibGFzdE1lc3NhZ2VJZFJlZiIsImxhc3RNZXNzYWdlc0xlbmd0aFJlZiIsIl9tZXNzYWdlcyRpZCIsIl9tZXNzYWdlcyIsIl9sYXN0TWVzc2FnZSRpZCIsImxhc3RNZXNzYWdlIiwibGFzdElkIiwicHJldklkIiwicHJldkxlbiIsImlzTmV3TWVzc2FnZSIsImlzQXRCb3R0b20iLCJoYXNJbml0aWFsTWVzc2FnZSIsImlzQXBwcm92YWwiLCJpc0Fuc3dlck9yUXVlc3Rpb24iLCJfbWVzc2FnZXMkaWQyIiwiX21lc3NhZ2VzMiIsImp1c3RGaW5pc2hlZExvYWRpbmciLCJhdHRhY2htZW50c0NvdW50Iiwic3RyZWFtTG9hZGluZ0Rpc3BsYXkiLCJoYXNBdHRhY2htZW50cyIsImlzU2Nyb2xsT25QYXJlbnQiLCJleHBhbmRlZFJlZiIsInNhdmVkU2Nyb2xsVG9wIiwiZmlsbCIsImhhc01lc3NhZ2VMZXZlbEluZGljYXRvciIsIm1lc3NhZ2VzQ29udGVudCIsInRleHQiLCJfbWVzc2FnZSRhdHRhY2htZW50cyIsIl9tZXNzYWdlJHNvdXJjZXMiLCJfbWVzc2FnZSRwcm9qZWN0IiwiX21lc3NhZ2UkaWQiLCJpc0Fzc2lzdGFudE1lc3NhZ2UiLCJwcm9qZWN0IiwibWVzc2FnZUZlZWRiYWNrIiwid2FzSGVscGZ1bCIsIlRIVU1CU19VUCIsIlRIVU1CU19ET1dOIiwibWVzc2FnZUtleSIsInR1cm5JZCIsInVzZXJNZXNzYWdlRm9yUmV0cnkiLCJjYW5SZXRyeSIsImlzX2NhbmNlbGxlZCIsImtleSIsInJlZiIsIiRzY3JvbGxPblBhcmVudCIsIm9uV2hlZWwiLCJvblRvdWNoU3RhcnQiLCIkc2hvdyIsIm9uU2Nyb2xsIiwiJHZpc2libGUiLCJ4bWxucyIsIndpZHRoIiwic3Ryb2tlIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwic3Ryb2tlV2lkdGgiLCJkIiwiQ2hhdEFJTWVzc2FnZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTWVzc2FnZXMvQ2hhdEFJTWVzc2FnZXMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tdW5zdGFibGUtbmVzdGVkLWNvbXBvbmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3cgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wcyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG5pbXBvcnQgUmVhY3QsIHsgRkMsIG1lbW8sIFJlYWN0Tm9kZSwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IEF0dGFjaG1lbnRDYXJkIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmQnXG5pbXBvcnQgeyBBcHByb3ZhbEJveCB9IGZyb20gJy4uLy4uL2F0b21zL0FwcHJvdmFsQm94L0FwcHJvdmFsQm94J1xuaW1wb3J0IHsgQXR0YWNobWVudFByZXZpZXdNb2RhbCB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRQcmV2aWV3TW9kYWwnXG5pbXBvcnQgeyBBdHRhY2htZW50Q2FyZEF1ZGlvIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmRBdWRpbydcbmltcG9ydCB7IE1haWFTdHJlYW1kb3duIH0gZnJvbSAnLi4vLi4vYXRvbXMvTWFpYVN0cmVhbWRvd24nXG5pbXBvcnQgdHlwZSB7IE1haWFTdHJlYW1kb3duUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NYWlhU3RyZWFtZG93bidcbmltcG9ydCB7IE1BSUFNZXNzYWdlUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NQUlBTWVzc2FnZS9NQUlBTWVzc2FnZS5pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRIaXN0b3J5Um9sZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyByZW5kZXJUZXh0V2l0aE1lbnRpb25zLCBoYXNJbmxpbmVNYXJrZXJzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcmVuZGVyQ29udGV4dE1lbnRpb25zJ1xuXG5pbXBvcnQgeyBpc01haWFrZXJBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2FnZW50RGlzcGxheU5hbWUnXG5pbXBvcnQgeyBDT1JVc2VyLCB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcblxuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVQnXG5pbXBvcnQgeyB1c2VDaGF0TWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyJ1xuaW1wb3J0IHsgdXNlU21vb3RoU3RyZWFtVGV4dCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNtb290aFN0cmVhbVRleHQnXG5pbXBvcnQgeyB1c2VTdHJlYW1pbmdNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU3RyZWFtaW5nTWVzc2FnZSdcblxuaW1wb3J0IHsgTG9hZGluZ1RleHQgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkaW5nVGV4dCdcbmltcG9ydCB7IEFnZW50QWN0aXZpdHlJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9hdG9tcy9BZ2VudEFjdGl2aXR5SW5kaWNhdG9yJ1xuaW1wb3J0IHsgUmVhc29uaW5nQmxvY2sgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9SZWFzb25pbmdCbG9jaydcbmltcG9ydCB7IHNob3VsZFN0cmVhbU5hcnJhdGlvbkluVGltZWxpbmUgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9yZWFzb25pbmdMaXZlTmFycmF0aW9uJ1xuaW1wb3J0IHsgUmVhc29uaW5nVGltZWxpbmUgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9SZWFzb25pbmdUaW1lbGluZSdcbmltcG9ydCB7IFNDVGltZWxpbmVJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9SZWFzb25pbmdCbG9jay5zdHlsZXMnXG5pbXBvcnQgdHlwZSB7IFN0cmVhbUFjdGl2aXR5IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvc3RyZWFtQWN0aXZpdHknXG5pbXBvcnQgeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkLCByZXNvbHZlU3RyZWFtTG9hZGluZ0Rpc3BsYXkgfSBmcm9tICcuLi8uLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgcmVzb2x2ZVJldHJ5VHVybklkLCBmaW5kVXNlck1lc3NhZ2VGb3JSZXRyeSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3JldHJ5Q29tcGxldGlvbidcbmltcG9ydCB7IHVzZVJlYXNvbmluZ1RyYWNlIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkZXInXG5pbXBvcnQgeyBGYWRlIH0gZnJvbSAnLi4vLi4vYXRvbXMvRmFkZSdcblxuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL1Byb2plY3QnXG5cbmltcG9ydCB7IE1lc3NhZ2VGcm9tVXNlciwgTWVzc2FnZUZyb21PdGhlciwgTWVzc2FnZUNvbnRlbnRGcm9tVXNlciwgTWVzc2FnZUNvbnRlbnRGcm9tT3RoZXIgfSBmcm9tICcuL3N0eWxlcydcbmltcG9ydCB7IE1lc3NhZ2VGZWVkYmFjayB9IGZyb20gJy4uL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7XG4gIFNDQ0FJTWVzc2FnZVdyYXBwZXIsXG4gIFNjcm9sbFRvQm90dG9tQnV0dG9uLFxuICBTQ1Njcm9sbEljb25Td2FwLFxuICBTQ1dyaXRpbmdEb3RzLFxuICBTQ01lc3NhZ2VzT3V0ZXIsXG4gIFNDTWVzc2FnZXNTY3JvbGwsXG4gIFNDTWVzc2FnZXNJbm5lcixcbiAgU0NUdXJuU3BhY2VyLFxuICBTQ09wdGlvbnNMaXN0LFxuICBTQ09wdGlvbkl0ZW0sXG4gIFNDTWVzc2FnZUl0ZW1XcmFwcGVyLFxuICBTQ01lc3NhZ2VJdGVtSW5uZXIsXG4gIFNDQXR0YWNobWVudHNSb3csXG4gIFNDQXBwcm92YWxBY3Rpb25zQ29sdW1uLFxuICBTQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbixcbiAgU0NNZXNzYWdlc0dyYWRpZW50VG9wLFxuICBTQ01lc3NhZ2VzR3JhZGllbnRCb3R0b20sXG59IGZyb20gJy4vbmV3U3R5bGVzJ1xuaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgRW50aXR5TGlua0N1c3RvbUxpbmssIGdldEVudGl0eUxpbmtXcmFwcGVyQ2xhc3NOYW1lIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZW50aXR5TGlua1JlbmRlcidcbmltcG9ydCB7IENoYXRBSVN1Z2dlc3Rpb25zIH0gZnJvbSAnLi9DaGF0QUlTdWdnZXN0aW9ucydcbmltcG9ydCB7IENoYXRBSUNyZWF0ZUFnZW50QWN0aW9ucyB9IGZyb20gJy4vQ2hhdEFJQ3JlYXRlQWdlbnRBY3Rpb25zJ1xuaW1wb3J0IHsgRVZFTlRTLCB1c2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50J1xuaW1wb3J0IHsgZG93bmxvYWRGaWxlRnJvbVVybCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2ZpbGVEb3dubG9hZEhlbHBlcidcblxudHlwZSBDaGF0QUlNZXNzYWdlc1Byb3BzID0ge1xuICB1c2VySW5pdGlhbE1lc3NhZ2U6IHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudEZpbGVbXVxuICAgIGZhcUlkPzogc3RyaW5nXG4gICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW11cbiAgICBmdWFJZD86IHN0cmluZ1xuICAgIHNjSWQ/OiBzdHJpbmdcbiAgfVxuICBpbml0aWFsQ2hhdElkOiBzdHJpbmcgfCBudWxsXG4gIG9uRXJyb3I6ICgpID0+IHZvaWRcbiAgb25TZW5kTWVzc2FnZVJlYWR5PzogKFxuICAgIHNlbmRNZXNzYWdlOiAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nXG4gICAgKSA9PiB2b2lkLFxuICAgIHN0b3BHZW5lcmF0aW9uOiAoKSA9PiB2b2lkLFxuICAgIGlzU3RyZWFtaW5nOiBib29sZWFuLFxuICAgIGlzV3JpdGluZzogYm9vbGVhblxuICApID0+IHZvaWRcbiAgaXNEaXNhYmxlZD86IGJvb2xlYW5cbiAgb25TY3JvbGxUb0JvdHRvbT86ICgpID0+IHZvaWRcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGFnZW50cz86IEFnZW50W11cbiAgZXhwYW5kZWQ/OiBib29sZWFuXG59XG5cbi8qKlxuICogQWwgYW5jbGFyIGVsIHR1cm5vLCBsYSBwcmVndW50YSBubyBzZSBwZWdhIGFsIGJvcmRlIHN1cGVyaW9yOiBkZWphbW9zIGFzb21hclxuICogbGEgY29sYSBkZWwgbWVuc2FqZSBhbnRlcmlvciBwYXJhIG5vIHBlcmRlciBlbCBoaWxvIGRlIGxhIGNvbnZlcnNhY2nDs24uXG4gKiBSZWxhdGl2byBhbCB2aWV3cG9ydCBwb3JxdWUgdW4gdmFsb3IgZmlqbyBzZSBjb21lIGRlbWFzaWFkbyBlbiBwYW50YWxsYXMgY29ydGFzLlxuICovXG5jb25zdCB0dXJuQW5jaG9yT2Zmc2V0ID0gKHZpZXdwb3J0SGVpZ2h0OiBudW1iZXIpOiBudW1iZXIgPT4gTWF0aC5taW4odmlld3BvcnRIZWlnaHQgKiAwLjE4LCAyMDApXG5cbi8qKlxuICogRHVyYWNpw7NuIGRlbCBzY3JvbGwgYW5pbWFkbzogYmFzZSB5IHRvcGUgcGFyYSByZWNvcnJpZG9zIGxhcmdvcywgcGFyYSBxdWUgdW5cbiAqIHNhbHRvIGRlIHZhcmlhcyBwYW50YWxsYXMgbm8gc2Ugc2llbnRhIHVuIGxhdGlnYXpvLlxuICovXG5jb25zdCBUVVJOX1NDUk9MTF9EVVJBVElPTl9NUyA9IDYwMFxuY29uc3QgVFVSTl9TQ1JPTExfTUFYX0RVUkFUSU9OX01TID0gODAwXG5cbi8qKiBEaXN0YW5jaWEgYSBwYXJ0aXIgZGUgbGEgY3VhbCBsYSBkdXJhY2nDs24geWEgZXN0w6EgZW4gc3UgdG9wZS4gKi9cbmNvbnN0IFRVUk5fU0NST0xMX0xPTkdfRElTVEFOQ0VfUFggPSAxMjAwXG5cbnR5cGUgTWVzc2FnZUl0ZW1Qcm9wcyA9IENoYXRNZXNzYWdlICYge1xuICBhdXRoVXNlcjogQ09SVXNlclxuICBoYW5kbGVTZWxlY3RPcHRpb246IChvcHRpb246IFByb2plY3QpID0+IHZvaWRcbiAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrOiAobWVzc2FnZUlkOiBzdHJpbmcsIHN1Z2dlc3Rpb246IHN0cmluZykgPT4gdm9pZFxuICBoYXNTZWxlY3RlZFN1Z2dlc3Rpb24/OiBib29sZWFuXG4gIGhhbmRsZUZlZWRiYWNrOiAoZmVlZGJhY2s6IEZlZWRiYWNrLCBjaGF0TWVzc2FnZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbjogKHRocmVhZElkczogc3RyaW5nW10sIGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0JykgPT4gdm9pZFxuICBoYW5kbGVSZXRyeT86ICgpID0+IHZvaWRcbiAgZGlzYWJsZUZlZWRiYWNrPzogRmVlZGJhY2sgfCBudWxsXG4gIHNvdXJjZXM/OiBhbnlcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGlzU3RyZWFtaW5nPzogYm9vbGVhblxuICBpc0xhc3RNZXNzYWdlPzogYm9vbGVhblxuICBleHBhbmRlZD86IGJvb2xlYW5cbiAgc3RyZWFtQWN0aXZpdHk/OiBTdHJlYW1BY3Rpdml0eSB8IG51bGxcbn1cblxuaW50ZXJmYWNlIE1lc3NhZ2VXcmFwcGVyUHJvcHMge1xuICBpc0N1cnJlbnRVc2VyOiBib29sZWFuXG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgJ2RhdGEtbWVzc2FnZS1pZCc/OiBzdHJpbmdcbiAgaGFzRmVlZGJhY2s/OiBib29sZWFuXG59XG5cbnR5cGUgTWVzc2FnZUNvbnRlbnRXcmFwcGVyUHJvcHMgPSBNQUlBTWVzc2FnZVByb3BzICYge1xuICBpc0N1cnJlbnRVc2VyOiBib29sZWFuXG4gIGlzRXJyb3I/OiBib29sZWFuXG4gIGlzQ2hhbmdlUHJvamVjdD86IGJvb2xlYW5cbn1cblxuY29uc3QgTWVzc2FnZVdyYXBwZXI6IEZDPE1lc3NhZ2VXcmFwcGVyUHJvcHM+ID0gKHsgaXNDdXJyZW50VXNlciwgY2hpbGRyZW4sIC4uLnByb3BzIH0pID0+IHtcbiAgY29uc3QgTWVzc2FnZUNvbXBvbmVudCA9IGlzQ3VycmVudFVzZXIgPyBNZXNzYWdlRnJvbVVzZXIgOiBNZXNzYWdlRnJvbU90aGVyXG4gIHJldHVybiA8TWVzc2FnZUNvbXBvbmVudCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L01lc3NhZ2VDb21wb25lbnQ+XG59XG5cbmNvbnN0IE1lc3NhZ2VDb250ZW50V3JhcHBlcjogRkM8TWVzc2FnZUNvbnRlbnRXcmFwcGVyUHJvcHM+ID0gKHsgaXNDdXJyZW50VXNlciwgLi4ucHJvcHMgfSkgPT4ge1xuICBjb25zdCBNZXNzYWdlQ29udGVudENvbXBvbmVudCA9IGlzQ3VycmVudFVzZXIgPyBNZXNzYWdlQ29udGVudEZyb21Vc2VyIDogTWVzc2FnZUNvbnRlbnRGcm9tT3RoZXJcbiAgcmV0dXJuIDxNZXNzYWdlQ29udGVudENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIE1lc3NhZ2VPcHRpb25zKHtcbiAgb3B0aW9ucyxcbiAgaGFuZGxlU2VsZWN0T3B0aW9uLFxufToge1xuICBvcHRpb25zOiBQcm9qZWN0W10gfCBudWxsXG4gIGhhbmRsZVNlbGVjdE9wdGlvbjogKG9wdGlvbjogUHJvamVjdCkgPT4gdm9pZFxufSkge1xuICBjb25zdCBbc2VsZWN0ZWRPcHRpb24sIHNldFNlbGVjdGVkT3B0aW9uXSA9IHVzZVN0YXRlPFByb2plY3QgfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IChvcHRpb246IFByb2plY3QpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHJldHVyblxuICAgIHNldFNlbGVjdGVkT3B0aW9uKG9wdGlvbilcbiAgICBoYW5kbGVTZWxlY3RPcHRpb24ob3B0aW9uKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U0NPcHRpb25zTGlzdD5cbiAgICAgIHsob3B0aW9ucyB8fCBbXSkubWFwKG9wdGlvbiA9PiAoXG4gICAgICAgIDxTQ09wdGlvbkl0ZW1cbiAgICAgICAgICAkaGFzU2VsZWN0aW9uPXshIXNlbGVjdGVkT3B0aW9ufVxuICAgICAgICAgICRkaW1tZWQ9eyEhc2VsZWN0ZWRPcHRpb24gJiYgc2VsZWN0ZWRPcHRpb24/LmlkICE9PSBvcHRpb24uaWR9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlU2VsZWN0KG9wdGlvbil9XG4gICAgICAgICAga2V5PXtvcHRpb24uaWR9XG4gICAgICAgID5cbiAgICAgICAgICB7b3B0aW9uLm5hbWV9XG4gICAgICAgIDwvU0NPcHRpb25JdGVtPlxuICAgICAgKSl9XG4gICAgPC9TQ09wdGlvbnNMaXN0PlxuICApXG59XG5cbi8qKiBTb2xvIGVzdGUgY29tcG9uZW50ZSByZS1yZW5kZXJpemEgY3VhbmRvIGNhbWJpYSBlbCB0ZXh0byBlbiBzdHJlYW1pbmcgKGxlZSBkZWwgY29udGV4dCkuICovXG5jb25zdCBTdHJlYW1pbmdNZXNzYWdlQm9keSA9IG1lbW8oXG4gIChwcm9wczoge1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGlzU3RyZWFtaW5nOiBib29sZWFuXG4gICAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICAgIGlzQXNzaXN0YW50OiBib29sZWFuXG4gICAgaXNGcm9udGVuZENhbmNlbGxlZD86IGJvb2xlYW5cbiAgICBhcHByb3ZhbD86IE1lc3NhZ2VJdGVtUHJvcHNbJ2FwcHJvdmFsJ11cbiAgICBpc0Vycm9yPzogYm9vbGVhblxuICAgIHNvdXJjZXM/OiBNZXNzYWdlSXRlbVByb3BzWydzb3VyY2VzJ11cbiAgICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdIHwgbnVsbFxuICAgIGNyZWF0ZUFnZW50Rm9sbG93VXA/OiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgbnVsbFxuICAgIGhhbmRsZUZlZWRiYWNrQ2xpY2s6IChmOiBGZWVkYmFjaykgPT4gdm9pZFxuICAgIGRpc2FibGVGZWVkYmFjazogRmVlZGJhY2sgfCBudWxsXG4gICAgb25SZXRyeT86ICgpID0+IHZvaWRcbiAgICBoYW5kbGVTdWdnZXN0aW9uQ2xpY2s6IChtZXNzYWdlSWQ6IHN0cmluZywgc3VnZ2VzdGlvbjogc3RyaW5nKSA9PiB2b2lkXG4gICAgc3VnZ2VzdGlvbnNEaXNhYmxlZD86IGJvb2xlYW5cbiAgICBtZXNzYWdlSWQ6IHN0cmluZ1xuICAgIGlzTGFzdE1lc3NhZ2U/OiBib29sZWFuXG4gIH0pID0+IHtcbiAgICAvLyBUZXh0byBkZWwgc3RyZWFtOiBzb2xvIHNlIGxlZSBkZWwgc3RvcmUgY3VhbmRvIGVzdGUgbWVuc2FqZSBlcyBlbFxuICAgIC8vIHF1ZSBlc3TDoSBlbiBzdHJlYW1pbmcuIHVzZVN5bmNFeHRlcm5hbFN0b3JlIGHDrXNsYSBlbCByZS1yZW5kZXIgYVxuICAgIC8vIGVzdGUgY29tcG9uZW50ZSwgc2luIHRvY2FyIGVsIHJlc3RvIGRlbCDDoXJib2wuXG4gICAgY29uc3Qgc3RyZWFtaW5nVGV4dCA9IHVzZVN0cmVhbWluZ01lc3NhZ2UocHJvcHMuaXNTdHJlYW1pbmcgPyBwcm9wcy5tZXNzYWdlSWQgOiBudWxsKVxuICAgIGNvbnN0IHJhd1RleHQgPSBwcm9wcy5pc1N0cmVhbWluZyA/IHN0cmVhbWluZ1RleHQgOiBwcm9wcy5tZXNzYWdlXG4gICAgLy8gU21vb3RoIHN0cmVhbWluZzogZGVzYWNvcGxhIGxhIGNhZGVuY2lhIGRlbCBiYWNrZW5kIGRlbCByZW5kZXIuXG4gICAgLy8gRHVyYW50ZSBlbCBzdHJlYW1pbmcgbGliZXJhIGNoYXJzIGEgcml0bW8gY29uc3RhbnRlIHbDrWEgckFGOyBjdWFuZG9cbiAgICAvLyB0ZXJtaW5hLCBtdWVzdHJhIGVsIHRleHRvIGZpbmFsIGFsIGluc3RhbnRlIChzaW4gYW5pbWFjacOzbiByZXNpZHVhbCkuXG4gICAgLy8gTG9zIGRlZmF1bHRzIGRlbCBob29rIHNlIGFqdXN0YXJvbiBlbXDDrXJpY2FtZW50ZSBlbiBzdGFnaW5nOyBhdW4gYXPDrVxuICAgIC8vIHNlIGV4cG9uZW4gZmxhZ3MgZGUgcnVudGltZSAod2luZG93LiopIHBhcmEgcG9kZXIgdHVuZWFyIHNpbiByZWNvbXBpbGFyXG4gICAgLy8gc2kgYWxnw7puIGJhY2tlbmQgcHJlc2VudGEgdW5hIGNhZGVuY2lhIG11eSBkaXN0aW50YSBlbiBwcm9kdWNjacOzbi5cbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1BZGFwdCA9IGZhbHNlICAgICAgLy8gZGVzYWN0aXZhIGFkYXB0YWNpw7NuIGFsIGJhY2tlbmRcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1CdWZmZXJNcyA9IDYwMCAgICAgLy8gY29sY2jDs24gb2JqZXRpdm8gKG1zKVxuICAgIC8vICAgd2luZG93LnN0cmVhbUxhZ01zID0gNDUwICAgICAgICAvLyBsYWcgbcOheGltbyBiYXNlIChtcylcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1NaW5CdWZmZXIgPSA3MCAgICAgLy8gcGlzbyBkZWwgY29sY2jDs24gZW4gY2hhcnNcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1XYXJtdXBNcyA9IDQwMCAgICAgLy8gd2FybXVwIGluaWNpYWwgKG1zKVxuICAgIGNvbnN0IHdpbkZsYWdzID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gKHdpbmRvdyBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIHN0cmVhbUFkYXB0PzogYm9vbGVhblxuICAgICAgICAgICAgc3RyZWFtQnVmZmVyTXM/OiBudW1iZXJcbiAgICAgICAgICAgIHN0cmVhbUxhZ01zPzogbnVtYmVyXG4gICAgICAgICAgICBzdHJlYW1NaW5CdWZmZXI/OiBudW1iZXJcbiAgICAgICAgICAgIHN0cmVhbVdhcm11cE1zPzogbnVtYmVyXG4gICAgICAgICAgfSlcbiAgICAgICAgOiB7fVxuICAgIGNvbnN0IGRpc3BsYXlUZXh0ID0gdXNlU21vb3RoU3RyZWFtVGV4dChyYXdUZXh0LCB7XG4gICAgICBlbmFibGVkOiAhIXByb3BzLmlzU3RyZWFtaW5nLFxuICAgICAgbWF4Q2hhcnNQZXJGcmFtZTogMjQsXG4gICAgICBzbmFwVG9Xb3JkQm91bmRhcnk6IHRydWUsXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtTGFnTXMgIT0gbnVsbCAmJiB7IHRhcmdldExhZ01zOiB3aW5GbGFncy5zdHJlYW1MYWdNcyB9KSxcbiAgICAgIC4uLih3aW5GbGFncy5zdHJlYW1BZGFwdCAhPSBudWxsICYmIHsgYWRhcHRUb0JhY2tlbmRSYXRlOiB3aW5GbGFncy5zdHJlYW1BZGFwdCB9KSxcbiAgICAgIC4uLih3aW5GbGFncy5zdHJlYW1CdWZmZXJNcyAhPSBudWxsICYmIHsgdGFyZ2V0QnVmZmVyTXM6IHdpbkZsYWdzLnN0cmVhbUJ1ZmZlck1zIH0pLFxuICAgICAgLi4uKHdpbkZsYWdzLnN0cmVhbU1pbkJ1ZmZlciAhPSBudWxsICYmIHsgbWluQnVmZmVyQ2hhcnM6IHdpbkZsYWdzLnN0cmVhbU1pbkJ1ZmZlciB9KSxcbiAgICAgIC4uLih3aW5GbGFncy5zdHJlYW1XYXJtdXBNcyAhPSBudWxsICYmIHsgd2FybXVwTXM6IHdpbkZsYWdzLnN0cmVhbVdhcm11cE1zIH0pLFxuICAgIH0pXG4gICAgY29uc3QgY3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZCA9IHByb3BzLmNyZWF0ZUFnZW50Rm9sbG93VXA/LmFnZW50SWRcblxuICAgIGlmICghZGlzcGxheVRleHQgJiYgIXByb3BzLmlzU3RyZWFtaW5nKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGhhc01lbnRpb25zID0gaGFzSW5saW5lTWFya2VycyhkaXNwbGF5VGV4dClcbiAgICBjb25zdCBtZW50aW9uTm9kZXMgPSBoYXNNZW50aW9ucyA/IHJlbmRlclRleHRXaXRoTWVudGlvbnMoZGlzcGxheVRleHQpIDogbnVsbFxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8U0NDQUlNZXNzYWdlV3JhcHBlclxuICAgICAgICAgIGlzQ3VycmVudFVzZXI9e3Byb3BzLmlzQ3VycmVudFVzZXJ9XG4gICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZD17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZH1cbiAgICAgICAgICBjbGFzc05hbWU9e2dldEVudGl0eUxpbmtXcmFwcGVyQ2xhc3NOYW1lKGRpc3BsYXlUZXh0KX1cbiAgICAgICAgPlxuICAgICAgICAgIHtoYXNNZW50aW9ucyAmJiBtZW50aW9uTm9kZXMgPyAoXG4gICAgICAgICAgICAvLyBTaSBoYXkgbWVudGlvbnMsIHJlbmRlcml6YXIgZGlyZWN0YW1lbnRlIChzaW4gbWFya2Rvd24gZW4gZWwgbWlzbW8gcMOhcnJhZm8pXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnaW5saW5lJyB9fT57bWVudGlvbk5vZGVzfTwvc3Bhbj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgLy8gU2luIG1lbnRpb25zLCBwYXNhciBhIFN0cmVhbWRvd24gcGFyYSBtYXJrZG93biBzdXBwb3J0XG4gICAgICAgICAgICA8TWFpYVN0cmVhbWRvd25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImNoYXRcIlxuICAgICAgICAgICAgICBpc0N1cnJlbnRVc2VyPXtwcm9wcy5pc0N1cnJlbnRVc2VyfVxuICAgICAgICAgICAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkPXtwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkfVxuICAgICAgICAgICAgICBjb21wb25lbnRzPXt7IGE6IEVudGl0eUxpbmtDdXN0b21MaW5rIH0gYXMgTWFpYVN0cmVhbWRvd25Qcm9wc1snY29tcG9uZW50cyddfVxuICAgICAgICAgICAgICBpc0FuaW1hdGluZz17ISFwcm9wcy5pc1N0cmVhbWluZ31cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2Rpc3BsYXlUZXh0fVxuICAgICAgICAgICAgPC9NYWlhU3RyZWFtZG93bj5cbiAgICAgICAgICApfVxuICAgICAgICA8L1NDQ0FJTWVzc2FnZVdyYXBwZXI+XG4gICAgICAgIHtwcm9wcy5pc0Fzc2lzdGFudCAmJlxuICAgICAgICAgICFwcm9wcy5pc0Vycm9yICYmXG4gICAgICAgICAgIXByb3BzLmFwcHJvdmFsICYmXG4gICAgICAgICAgIXByb3BzLmlzU3RyZWFtaW5nICYmXG4gICAgICAgICAgKCFwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkIHx8ICEhcHJvcHMub25SZXRyeSkgJiYgKFxuICAgICAgICAgICAgPE1lc3NhZ2VGZWVkYmFja1xuICAgICAgICAgICAgICBjb250ZW50PXtkaXNwbGF5VGV4dH1cbiAgICAgICAgICAgICAgc291cmNlcz17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCA/IHVuZGVmaW5lZCA6IHByb3BzLnNvdXJjZXN9XG4gICAgICAgICAgICAgIGhhbmRsZUZlZWRiYWNrPXtwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkID8gdW5kZWZpbmVkIDogcHJvcHMuaGFuZGxlRmVlZGJhY2tDbGlja31cbiAgICAgICAgICAgICAgZGlzYWJsZUZlZWRiYWNrPXtwcm9wcy5kaXNhYmxlRmVlZGJhY2t9XG4gICAgICAgICAgICAgIG9uUmV0cnk9e3Byb3BzLm9uUmV0cnl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIHtwcm9wcy5pc0Fzc2lzdGFudCAmJlxuICAgICAgICAgICFwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkICYmXG4gICAgICAgICAgIXByb3BzLmFwcHJvdmFsICYmXG4gICAgICAgICAgKCFwcm9wcy5pc0Vycm9yIHx8IHByb3BzLnN1Z2dlc3Rpb25zPy5sZW5ndGgpICYmIChcbiAgICAgICAgICAgIDxDaGF0QUlTdWdnZXN0aW9uc1xuICAgICAgICAgICAgICBzdWdnZXN0aW9ucz17cHJvcHMuc3VnZ2VzdGlvbnMgfHwgW119XG4gICAgICAgICAgICAgIG9uU2VsZWN0U3VnZ2VzdGlvbj17c3VnZ2VzdGlvbiA9PiBwcm9wcy5oYW5kbGVTdWdnZXN0aW9uQ2xpY2socHJvcHMubWVzc2FnZUlkLCBzdWdnZXN0aW9uKX1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3Byb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAgIGhpZGRlbj17ISFwcm9wcy5pc1N0cmVhbWluZyB8fCAhcHJvcHMuaXNMYXN0TWVzc2FnZSB8fCAhIXByb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIHtwcm9wcy5pc0Fzc2lzdGFudCAmJlxuICAgICAgICAgICFwcm9wcy5pc0Vycm9yICYmXG4gICAgICAgICAgIXByb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWQgJiZcbiAgICAgICAgICAhcHJvcHMuYXBwcm92YWwgJiZcbiAgICAgICAgICAhIWNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQgJiYgKFxuICAgICAgICAgICAgPENoYXRBSUNyZWF0ZUFnZW50QWN0aW9uc1xuICAgICAgICAgICAgICBhZ2VudElkPXtjcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17cHJvcHMuc3VnZ2VzdGlvbnNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgaGlkZGVuPXshIXByb3BzLmlzU3RyZWFtaW5nIHx8ICFwcm9wcy5pc0xhc3RNZXNzYWdlIHx8ICEhcHJvcHMuc3VnZ2VzdGlvbnNEaXNhYmxlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgIDwvPlxuICAgIClcbiAgfVxuKVxuXG5jb25zdCBNZXNzYWdlSXRlbSA9IG1lbW8oKHByb3BzOiBNZXNzYWdlSXRlbVByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICB1c2VyLFxuICAgIG1lc3NhZ2UsXG4gICAgaXNTdHJlYW1pbmcsXG4gICAgaXNFcnJvcixcbiAgICBhdXRoVXNlcixcbiAgICBvcHRpb25zLFxuICAgIGlzQ2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVTZWxlY3RPcHRpb24sXG4gICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrLFxuICAgIGhhbmRsZUZlZWRiYWNrLFxuICAgIGhhbmRsZUFwcHJvdmFsRGVjaXNpb24sXG4gICAgZGlzYWJsZUZlZWRiYWNrLFxuICAgIGhhbmRsZVJldHJ5LFxuICAgIHJvbGUsXG4gICAgc291cmNlcyxcbiAgICBhdHRhY2htZW50cyxcbiAgICBhcHByb3ZhbCxcbiAgICBhcHByb3ZhbFN0YXR1cyxcbiAgICBzdWdnZXN0aW9ucyxcbiAgICBjcmVhdGVBZ2VudEZvbGxvd1VwLFxuICAgIGhhc1NlbGVjdGVkU3VnZ2VzdGlvbixcbiAgICBpc0xhc3RNZXNzYWdlLFxuICAgIHN0cmVhbUFjdGl2aXR5LFxuICB9ID0gcHJvcHNcblxuICBjb25zdCBbcHJldmlld0F0dGFjaG1lbnQsIHNldFByZXZpZXdBdHRhY2htZW50XSA9IHVzZVN0YXRlPEF0dGFjaG1lbnRGaWxlIHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNDdXJyZW50VXNlciA9IHJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5VU0VSIHx8IHVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKClcbiAgY29uc3QgaXNBc3Npc3RhbnQgPSByb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5UIHx8IHVzZXIuaWQgPT09ICdhc3Npc3RhbnQnXG4gIGNvbnN0IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgPSBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKGlkKVxuICBjb25zdCBzdHJlYW1pbmdUZXh0ID0gdXNlU3RyZWFtaW5nTWVzc2FnZShpc1N0cmVhbWluZyB8fCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyID8gaWQgOiBudWxsKVxuICBjb25zdCBpc0FjdGl2ZVN0cmVhbWluZyA9ICEhaXNTdHJlYW1pbmcgfHwgaXNTdHJlYW1pbmdQbGFjZWhvbGRlclxuICBjb25zdCBoYXNTdHJlYW1UZXh0ID0gQm9vbGVhbihzdHJlYW1pbmdUZXh0KVxuICBjb25zdCByZWFzb25pbmdUcmFjZSA9IHVzZVJlYXNvbmluZ1RyYWNlKGlzQXNzaXN0YW50ICYmIGlzQWN0aXZlU3RyZWFtaW5nID8gaWQgOiAnJylcbiAgY29uc3Qgc3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZSA9XG4gICAgaXNBc3Npc3RhbnQgJiYgc2hvdWxkU3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZShyZWFzb25pbmdUcmFjZS5zdGVwcywgc3RyZWFtQWN0aXZpdHksIHN0cmVhbWluZ1RleHQpXG4gIGNvbnN0IHNob3dTdHJlYW1pbmdCb2R5ID0gaXNBY3RpdmVTdHJlYW1pbmcgJiYgaGFzU3RyZWFtVGV4dCAmJiAhc3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZVxuICBjb25zdCBzaG93QWN0aXZpdHlJbmRpY2F0b3IgPSBpc0Fzc2lzdGFudCAmJiBpc0FjdGl2ZVN0cmVhbWluZyAmJiAhIXN0cmVhbUFjdGl2aXR5XG5cbiAgY29uc3QgbWVzc2FnZUF0dGFjaG1lbnRzID1cbiAgICBhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwXG4gICAgICA/IGF0dGFjaG1lbnRzXG4gICAgICA6ICFpc0Fzc2lzdGFudCAmJiBBcnJheS5pc0FycmF5KHNvdXJjZXMpXG4gICAgICAgID8gKHNvdXJjZXMgYXMgQXR0YWNobWVudEZpbGVbXSlcbiAgICAgICAgOiBbXVxuXG4gIGNvbnN0IGhhbmRsZUF0dGFjaG1lbnRDbGljayA9IChhdHRhY2htZW50OiBBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgIC8vIFBlcm1pdGlyIHByZXZpc3VhbGl6YWNpw7NuIHNpIHRpZW5lIGFyY2hpdm8gbG9jYWwgbyBVUkxzIGRlbCBiYWNrZW5kXG4gICAgaWYgKFxuICAgICAgYXR0YWNobWVudC5maWxlIGluc3RhbmNlb2YgRmlsZSB8fFxuICAgICAgYXR0YWNobWVudC5vcmlnaW5hbEZpbGUgaW5zdGFuY2VvZiBGaWxlIHx8XG4gICAgICBhdHRhY2htZW50LnVybF90aHVtYm5haWwgfHxcbiAgICAgIGF0dGFjaG1lbnQudXJsX29yaWdpbmFsIHx8XG4gICAgICBhdHRhY2htZW50LnVybF9maWxlXG4gICAgKSB7XG4gICAgICBzZXRQcmV2aWV3QXR0YWNobWVudChhdHRhY2htZW50KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNsb3NlUHJldmlldyA9ICgpID0+IHtcbiAgICBzZXRQcmV2aWV3QXR0YWNobWVudChudWxsKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXR0YWNobWVudERvd25sb2FkID0gYXN5bmMgKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gYXR0YWNobWVudC5uYW1lLmluY2x1ZGVzKCcuJykgPyAnJyA6IGAuJHthdHRhY2htZW50LnR5cGV9YFxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7YXR0YWNobWVudC5uYW1lfSR7ZXh0ZW5zaW9ufWBcbiAgICBjb25zdCBmaWxlVXJsID0gYXR0YWNobWVudC51cmxfb3JpZ2luYWwgfHwgYXR0YWNobWVudC51cmxfZmlsZSB8fCBhdHRhY2htZW50LnVybF90aHVtYm5haWxcblxuICAgIHRyeSB7XG4gICAgICBsZXQgYmxvYlVybDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgICAgaWYgKGZpbGVVcmwpIHtcbiAgICAgICAgY29uc3QgZG93bmxvYWRlZEZpbGUgPSBhd2FpdCBkb3dubG9hZEZpbGVGcm9tVXJsKGZpbGVVcmwsIGZpbGVOYW1lLCBhdHRhY2htZW50LnR5cGUpXG4gICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGRvd25sb2FkZWRGaWxlKVxuICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50LmZpbGUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGF0dGFjaG1lbnQuZmlsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFibG9iVXJsKSByZXR1cm5cblxuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgbGluay5ocmVmID0gYmxvYlVybFxuICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lXG4gICAgICBsaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluaylcbiAgICAgIGxpbmsuY2xpY2soKVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKVxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpXG4gICAgICB9LCAxMDApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkb3dubG9hZCBhdHRhY2htZW50JywgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ2hhbmdlUHJvamVjdCAmJiBvcHRpb25zKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxNZXNzYWdlV3JhcHBlciBrZXk9e2lkfSBpc0N1cnJlbnRVc2VyPXtpc0N1cnJlbnRVc2VyfSBkYXRhLW1lc3NhZ2UtaWQ9e2lkfSBoYXNGZWVkYmFjaz17ZmFsc2V9PlxuICAgICAgICA8U0NNZXNzYWdlSXRlbVdyYXBwZXIgJGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH0+XG4gICAgICAgICAgPE1lc3NhZ2VDb250ZW50V3JhcHBlclxuICAgICAgICAgICAgaXNDaGFuZ2VQcm9qZWN0PXtpc0NoYW5nZVByb2plY3R9XG4gICAgICAgICAgICBtZXNzYWdlPXttZXNzYWdlfVxuICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgIGlzRXJyb3I9e2lzRXJyb3J9XG4gICAgICAgICAgICBtZXNzYWdlRXh0cmFDb250ZW50PXs8TWVzc2FnZU9wdGlvbnMgb3B0aW9ucz17b3B0aW9ucyBhcyBhbnl9IGhhbmRsZVNlbGVjdE9wdGlvbj17aGFuZGxlU2VsZWN0T3B0aW9ufSAvPn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1NDTWVzc2FnZUl0ZW1XcmFwcGVyPlxuICAgICAgPC9NZXNzYWdlV3JhcHBlcj5cbiAgICApXG4gIH1cblxuICBjb25zdCBoYW5kbGVGZWVkYmFja0NsaWNrID0gKGZlZWRiYWNrOiBGZWVkYmFjaykgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IGlkXG4gICAgICAuc3BsaXQoJy0nKVxuICAgICAgLmZpbHRlcihxdWVzdGlvbklkID0+IHF1ZXN0aW9uSWQgIT09ICdhbnN3ZXInKVxuICAgICAgLmpvaW4oJy0nKVxuICAgIGhhbmRsZUZlZWRiYWNrPy4oZmVlZGJhY2ssIHNlc3Npb25JZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDTWVzc2FnZUl0ZW1XcmFwcGVyICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9IGRhdGEtbWVzc2FnZS1pZD17aWR9PlxuICAgICAgPFNDTWVzc2FnZUl0ZW1Jbm5lcj5cbiAgICAgICAgey8qIE1pc21vIHNsb3QgcGFyYSBsYSB0cmF6YSBlbiB2aXZvIHkgbGEgeWEgcGxlZ2FkYTogbWllbnRyYXMgZWwgdHVybm9cbiAgICAgICAgICAgIGNvcnJlLCBsb3MgcGFzb3Mgc2UgYXBpbGFuIGFjw6EgKHRpbWVsYXBzZSk7IGFsIGNvbXBsZXRhciwgZWxcbiAgICAgICAgICAgIFJlYXNvbmluZ0Jsb2NrIG9jdXBhIGVsIGx1Z2FyIHkgY29sYXBzYSBzb2xvLlxuICAgICAgICAgICAgVmEgQVJSSUJBIGRlbCBjdWVycG8gcG9ycXVlIGxhIG5hcnJhY2nDs24gZGUgY2FkYSB0dXJubyB0ZXJtaW5hIGNvbW9cbiAgICAgICAgICAgIGZpbGEgZGUgbGEgdHJhemE6IHNpIGVzdHV2aWVyYSBhYmFqbywgZWwgdGV4dG8gdmllam8gcXVlZGFyw61hIHBvclxuICAgICAgICAgICAgZGViYWpvIGRlbCB0ZXh0byBudWV2by4gKi99XG4gICAgICAgIHtpc0Fzc2lzdGFudCAmJlxuICAgICAgICAgIChpc0FjdGl2ZVN0cmVhbWluZyA/IChcbiAgICAgICAgICAgIDxSZWFzb25pbmdUaW1lbGluZSBtZXNzYWdlSWQ9e2lkfSBzdHJlYW1BY3Rpdml0eT17c3RyZWFtQWN0aXZpdHl9IHN0cmVhbWluZ1RleHQ9e3N0cmVhbWluZ1RleHR9IC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxSZWFzb25pbmdCbG9jayBtZXNzYWdlSWQ9e2lkfSB0cmFjZT17cHJvcHMucmVhc29uaW5nID8/IG51bGx9IC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIHshIW1lc3NhZ2VBdHRhY2htZW50cy5sZW5ndGggJiYgKFxuICAgICAgICAgIDxTQ0F0dGFjaG1lbnRzUm93ICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9PlxuICAgICAgICAgICAge21lc3NhZ2VBdHRhY2htZW50cy5tYXAoKGF0dGFjaG1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIC8vIERldGVjdGFyIHNpIGVzIHVuIGFyY2hpdm8gZGUgYXVkaW9cbiAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Py50eXBlPy50b0xvd2VyQ2FzZSgpIHx8ICcnXG4gICAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnROYW1lID0gYXR0YWNobWVudD8ubmFtZT8udG9Mb3dlckNhc2UoKSB8fCAnJ1xuICAgICAgICAgICAgICBjb25zdCBpc0F1ZGlvRmlsZSA9XG4gICAgICAgICAgICAgICAgYXR0YWNobWVudFR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJykgfHxcbiAgICAgICAgICAgICAgICBbJ2ZsYWMnLCAnbTRhJywgJ21wMycsICdtcDQnLCAnb2dhJywgJ29nZycsICd3YXYnLCAnd2VibSddLmluY2x1ZGVzKGF0dGFjaG1lbnRUeXBlKSB8fFxuICAgICAgICAgICAgICAgIFsnLmZsYWMnLCAnLm00YScsICcubXAzJywgJy5tcDQnLCAnLm9nYScsICcub2dnJywgJy53YXYnLCAnLndlYm0nXS5zb21lKGV4dCA9PlxuICAgICAgICAgICAgICAgICAgYXR0YWNobWVudE5hbWUuZW5kc1dpdGgoZXh0KVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICBpZiAoaXNBdWRpb0ZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gPEF0dGFjaG1lbnRDYXJkQXVkaW8ga2V5PXtgJHthdHRhY2htZW50LmlkfS0ke2F0dGFjaG1lbnQubmFtZX1gfSBhdHRhY2htZW50PXthdHRhY2htZW50fSAvPlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8QXR0YWNobWVudENhcmRcbiAgICAgICAgICAgICAgICAgIGtleT17YCR7YXR0YWNobWVudC5pZH0tJHthdHRhY2htZW50Lm5hbWV9YH1cbiAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQ9e2F0dGFjaG1lbnR9XG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbkluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIG9uRG93bmxvYWQ9eygpID0+IGhhbmRsZUF0dGFjaG1lbnREb3dubG9hZChhdHRhY2htZW50KX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUF0dGFjaG1lbnRDbGljayhhdHRhY2htZW50KX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1NDQXR0YWNobWVudHNSb3c+XG4gICAgICAgICl9XG4gICAgICAgIHsoISFtZXNzYWdlIHx8IHNob3dTdHJlYW1pbmdCb2R5KSAmJiAhKGlzQXNzaXN0YW50ICYmICEhbWVzc2FnZUF0dGFjaG1lbnRzLmxlbmd0aCkgJiYgKFxuICAgICAgICAgIDxTdHJlYW1pbmdNZXNzYWdlQm9keVxuICAgICAgICAgICAgbWVzc2FnZT17bWVzc2FnZSA/PyAnJ31cbiAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtzaG93U3RyZWFtaW5nQm9keX1cbiAgICAgICAgICAgIGlzQ3VycmVudFVzZXI9e2lzQ3VycmVudFVzZXJ9XG4gICAgICAgICAgICBpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9XG4gICAgICAgICAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkPXtwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkfVxuICAgICAgICAgICAgYXBwcm92YWw9e2FwcHJvdmFsfVxuICAgICAgICAgICAgaXNFcnJvcj17aXNFcnJvcn1cbiAgICAgICAgICAgIHNvdXJjZXM9e3NvdXJjZXN9XG4gICAgICAgICAgICBzdWdnZXN0aW9ucz17c3VnZ2VzdGlvbnN9XG4gICAgICAgICAgICBjcmVhdGVBZ2VudEZvbGxvd1VwPXtjcmVhdGVBZ2VudEZvbGxvd1VwfVxuICAgICAgICAgICAgaGFuZGxlRmVlZGJhY2tDbGljaz17aGFuZGxlRmVlZGJhY2tDbGlja31cbiAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17ZGlzYWJsZUZlZWRiYWNrID8/IG51bGx9XG4gICAgICAgICAgICBvblJldHJ5PXtoYW5kbGVSZXRyeX1cbiAgICAgICAgICAgIGhhbmRsZVN1Z2dlc3Rpb25DbGljaz17aGFuZGxlU3VnZ2VzdGlvbkNsaWNrfVxuICAgICAgICAgICAgc3VnZ2VzdGlvbnNEaXNhYmxlZD17aXNBY3RpdmVTdHJlYW1pbmcgfHwgISFoYXNTZWxlY3RlZFN1Z2dlc3Rpb259XG4gICAgICAgICAgICBtZXNzYWdlSWQ9e2lkfVxuICAgICAgICAgICAgaXNMYXN0TWVzc2FnZT17aXNMYXN0TWVzc2FnZX1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICB7LyogU3Bpbm5lciBkZSBhY3RpdmlkYWQ6IHZpc2libGUgdGFtYmnDqW4gZW4gd3JpdGluZyAobmFycmFjacOzbiBlbiB0cmF6YSBvIHJlc3B1ZXN0YSBmaW5hbCkuICovfVxuICAgICAgICB7c2hvd0FjdGl2aXR5SW5kaWNhdG9yICYmIChcbiAgICAgICAgICA8U0NUaW1lbGluZUluZGljYXRvcj5cbiAgICAgICAgICAgIDxBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIGFjdGl2aXR5PXtzdHJlYW1BY3Rpdml0eX0gY29tcGFjdCAvPlxuICAgICAgICAgIDwvU0NUaW1lbGluZUluZGljYXRvcj5cbiAgICAgICAgKX1cbiAgICAgICAge2FwcHJvdmFsICYmIGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucyAmJiAoXG4gICAgICAgICAgPFNDQXBwcm92YWxBY3Rpb25zQ29sdW1uPlxuICAgICAgICAgICAgPEFwcHJvdmFsQm94XG4gICAgICAgICAgICAgIGFjdGlvbnM9e2FwcHJvdmFsLnBlbmRpbmdfYWN0aW9uc31cbiAgICAgICAgICAgICAgc3RhdHVzPXthcHByb3ZhbFN0YXR1c31cbiAgICAgICAgICAgICAgb25BcHByb3ZlPXt0aHJlYWRJZHMgPT4gaGFuZGxlQXBwcm92YWxEZWNpc2lvbih0aHJlYWRJZHMsICdhcHByb3ZlJyl9XG4gICAgICAgICAgICAgIG9uUmVqZWN0PXt0aHJlYWRJZHMgPT4gaGFuZGxlQXBwcm92YWxEZWNpc2lvbih0aHJlYWRJZHMsICdyZWplY3QnKX1cbiAgICAgICAgICAgICAgaXNQcm9qZWN0RGVsZXRlZD17cHJvcHMucHJvamVjdE1ldGFkYXRhPy5pc19kZWxldGVkID09PSB0cnVlfVxuICAgICAgICAgICAgICBpc0V4cGFuZGVkPXtwcm9wcy5leHBhbmRlZH1cbiAgICAgICAgICAgICAgaGl0bEluc3RhbmNlSWQ9e2FwcHJvdmFsLm9yaWdpbmFsX3RocmVhZF9pZH1cbiAgICAgICAgICAgICAgd2FybmluZ01lc3NhZ2U9e2FwcHJvdmFsLndhcm5pbmdfbWVzc2FnZX1cbiAgICAgICAgICAgICAgbWFudWFsQXBwcm92YWxEZXRlY3RlZD17YXBwcm92YWwubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1NDQXBwcm92YWxBY3Rpb25zQ29sdW1uPlxuICAgICAgICApfVxuICAgICAgPC9TQ01lc3NhZ2VJdGVtSW5uZXI+XG4gICAgICA8QXR0YWNobWVudFByZXZpZXdNb2RhbFxuICAgICAgICBpc09wZW49eyEhcHJldmlld0F0dGFjaG1lbnR9XG4gICAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlUHJldmlld31cbiAgICAgICAgYXR0YWNobWVudD17cHJldmlld0F0dGFjaG1lbnR9XG4gICAgICAvPlxuICAgIDwvU0NNZXNzYWdlSXRlbVdyYXBwZXI+XG4gIClcbn0pXG5cbmNvbnN0IENoYXRBSU1lc3NhZ2VzSW5uZXIgPSAoe1xuICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gIGluaXRpYWxDaGF0SWQsXG4gIG9uRXJyb3IsXG4gIG9uU2VuZE1lc3NhZ2VSZWFkeSxcbiAgb25TY3JvbGxUb0JvdHRvbSxcbiAgYXR0YWNobWVudHMsXG4gIGFnZW50cyxcbiAgZXhwYW5kZWQsXG59OiBDaGF0QUlNZXNzYWdlc1Byb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVCgpXG4gIGNvbnN0IHsgaXNXZWJTZWFyY2hBY3RpdmUsIGlzRGVlcFNlYXJjaEFjdGl2ZSwgYWdlbnQgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCBldmVudCA9IHVzZUV2ZW50KClcbiAgY29uc3QgYXV0aFVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgbWVzc2FnZXNSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGNoYXRJbml0aWFsaXplZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaXNMb2FkaW5nTW9yZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgdXNlclNjcm9sbGluZ1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2Nyb2xsVGhyZXNob2xkUmVmID0gdXNlUmVmKDM5KVxuICBjb25zdCBsYXN0U2Nyb2xsVG9wUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IHNob3dTY3JvbGxUb0JvdHRvbVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2hvd1RvcEdyYWRpZW50UmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBzaG93Qm90dG9tR3JhZGllbnRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHNjcm9sbFJhZlJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICAvKipcbiAgICogVHVybm8gY29uIGVsIHNjcm9sbCBiYWpvIGNvbnRyb2wgZGVsIHVzdWFyaW86IGRlc2RlIHF1ZSBlbnbDrWEgZWwgbWVuc2FqZSB5XG4gICAqIGhhc3RhIGVsIHByw7N4aW1vIGVudsOtbyBubyBtb3ZlbW9zIGVsIHNjcm9sbCBwb3IgbmluZ8O6biBtb3Rpdm8uIEVzXG4gICAqIGluZGVwZW5kaWVudGUgZGUgbGEgYWx0dXJhIGRlbCBzcGFjZXIsIHF1ZSBwdWVkZSBsbGVnYXIgYSAwIHNpbiBkZXNhbmNsYXIuXG4gICAqL1xuICBjb25zdCBhbmNob3JlZFR1cm5JZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBzcGFjZXJFbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHNwYWNlckhlaWdodFJlZiA9IHVzZVJlZigwKVxuICBjb25zdCB0dXJuU2Nyb2xsUmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHdhc0xvYWRpbmdNZXNzYWdlc1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgbGFzdFNjcm9sbGVkU2Vzc2lvblJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbc2hvd1Njcm9sbFRvQm90dG9tLCBzZXRTaG93U2Nyb2xsVG9Cb3R0b21dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzaG93VG9wR3JhZGllbnQsIHNldFNob3dUb3BHcmFkaWVudF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3Nob3dCb3R0b21HcmFkaWVudCwgc2V0U2hvd0JvdHRvbUdyYWRpZW50XSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcywgc2V0U2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc10gPSB1c2VTdGF0ZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe30pXG5cbiAgY29uc3Qge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICByZXRyeU1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGluaXRpYWxpemVDaGF0LFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBzdG9wR2VuZXJhdGlvbixcbiAgfSA9IHVzZUNoYXRNYW5hZ2VyKHtcbiAgICBjaGF0SWQ6IGluaXRpYWxDaGF0SWQgfHwgdW5kZWZpbmVkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBvbkVycm9yLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIGFnZW50cyxcbiAgfSlcblxuICBjb25zdCBoYW5kbGVTZWxlY3RPcHRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgICBjaGFuZ2VQcm9qZWN0KG9wdGlvbilcbiAgICB9LFxuICAgIFtjaGFuZ2VQcm9qZWN0XVxuICApXG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYSBlbCBib3TDs24gXCJzY3JvbGwgdG8gYm90dG9tXCIgeSBsb3MgZ3JhZGllbnRlcyBkZSBib3JkZSBhIHBhcnRpciBkZVxuICAgKiBsYSBwb3NpY2nDs24gZGVsIHNjcm9sbC4gTG9zIHJlZnMgZXZpdGFuIGBzZXRTdGF0ZWAgY3VhbmRvIGVsIHZhbG9yIG5vIGNhbWJpYTpcbiAgICogZXN0byBjb3JyZSBlbiBjYWRhIGZyYW1lIGRlbCBzdHJlYW0uXG4gICAqL1xuICBjb25zdCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsKSByZXR1cm5cbiAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGVsXG4gICAgLy8gRWwgc3BhY2VyIGRlbCB0dXJubyBlcyBhbHRvIHJlc2VydmFkbywgbm8gY29udGVuaWRvOiBzaSBubyBsbyBkZXNjb250YW1vc1xuICAgIC8vIGxhIGZsZWNoYSB5IGVsIGdyYWRpZW50ZSBkZSBhYmFqbyBxdWVkYW4gZW5jZW5kaWRvcyBkdXJhbnRlIHRvZG8gZWwgdHVybm8uXG4gICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gc2Nyb2xsSGVpZ2h0IC0gc3BhY2VySGVpZ2h0UmVmLmN1cnJlbnQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHRcblxuICAgIGNvbnN0IHNob3VsZFNob3cgPSBkaXN0YW5jZUZyb21Cb3R0b20gPiA1MFxuICAgIGlmIChzaG93U2Nyb2xsVG9Cb3R0b21SZWYuY3VycmVudCAhPT0gc2hvdWxkU2hvdykge1xuICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICBzZXRTaG93U2Nyb2xsVG9Cb3R0b20oc2hvdWxkU2hvdylcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0VG9wR3JhZGllbnQgPSBzY3JvbGxUb3AgPiAxXG4gICAgaWYgKHNob3dUb3BHcmFkaWVudFJlZi5jdXJyZW50ICE9PSBuZXh0VG9wR3JhZGllbnQpIHtcbiAgICAgIHNob3dUb3BHcmFkaWVudFJlZi5jdXJyZW50ID0gbmV4dFRvcEdyYWRpZW50XG4gICAgICBzZXRTaG93VG9wR3JhZGllbnQobmV4dFRvcEdyYWRpZW50KVxuICAgIH1cblxuICAgIGNvbnN0IG5leHRCb3R0b21HcmFkaWVudCA9IGRpc3RhbmNlRnJvbUJvdHRvbSA+IDFcbiAgICBpZiAoc2hvd0JvdHRvbUdyYWRpZW50UmVmLmN1cnJlbnQgIT09IG5leHRCb3R0b21HcmFkaWVudCkge1xuICAgICAgc2hvd0JvdHRvbUdyYWRpZW50UmVmLmN1cnJlbnQgPSBuZXh0Qm90dG9tR3JhZGllbnRcbiAgICAgIHNldFNob3dCb3R0b21HcmFkaWVudChuZXh0Qm90dG9tR3JhZGllbnQpXG4gICAgfVxuICB9LCBbXSlcblxuICAvKipcbiAgICogU2Nyb2xsIGlubWVkaWF0byBhbCBmb25kbyAoZGVudHJvIGRlIHJBRiBwYXJhIGNvb3JkaW5hciBjb24gZWwgcGFpbnQpXG4gICAqIHkgYWN0dWFsaXphIGxhIHZpc2liaWxpZGFkIGRlbCBib3TDs24uIFJlc3BldGEgYHNraXBJZlVzZXJTY3JvbGxpbmdgIHBhcmFcbiAgICogbm8gc29icmVzY3JpYmlyIGVsIHNjcm9sbCBtYW51YWwgZGVsIHVzdWFyaW8gZHVyYW50ZSBlbCBzdHJlYW1pbmcuXG4gICAqL1xuICBjb25zdCBzY3JvbGxUb0JvdHRvbVJhZiA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRzOiB7IHNraXBJZlVzZXJTY3JvbGxpbmc/OiBib29sZWFuOyBkZWxheU1zPzogbnVtYmVyIH0gPSB7fSkgPT4ge1xuICAgICAgY29uc3QgeyBza2lwSWZVc2VyU2Nyb2xsaW5nID0gZmFsc2UsIGRlbGF5TXMgPSAwIH0gPSBvcHRzXG4gICAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICAgICAgaWYgKCFlbCkgcmV0dXJuXG4gICAgICAgICAgaWYgKHNraXBJZlVzZXJTY3JvbGxpbmcgJiYgdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgICBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHRcbiAgICAgICAgICB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcygpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZGVsYXlNcyA+IDApIHNldFRpbWVvdXQocnVuLCBkZWxheU1zKVxuICAgICAgZWxzZSBydW4oKVxuICAgIH0sXG4gICAgW3VwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzXVxuICApXG5cbiAgY29uc3QgY2FuY2VsVHVyblNjcm9sbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAodHVyblNjcm9sbFJhZlJlZi5jdXJyZW50ID09PSBudWxsKSByZXR1cm5cbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0dXJuU2Nyb2xsUmFmUmVmLmN1cnJlbnQpXG4gICAgdHVyblNjcm9sbFJhZlJlZi5jdXJyZW50ID0gbnVsbFxuICB9LCBbXSlcblxuICAvKipcbiAgICogU2Nyb2xsIGFuaW1hZG8gY29uIGVhc2luZyBwcm9waW86IGBiZWhhdmlvcjogJ3Ntb290aCdgIG5vIHBlcm1pdGUgcmVndWxhciBsYVxuICAgKiBkdXJhY2nDs24geSBlbCBzYWx0byBhbCBhbmNsYXIgZWwgdHVybm8gcXVlZGEgZGVtYXNpYWRvIHNlY28uXG4gICAqL1xuICBjb25zdCBhbmltYXRlU2Nyb2xsVG8gPSB1c2VDYWxsYmFjayhcbiAgICAodG9wOiBudW1iZXIpID0+IHtcbiAgICAgIGNhbmNlbFR1cm5TY3JvbGwoKVxuICAgICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICBpZiAoIWVsKSByZXR1cm5cbiAgICAgIGNvbnN0IGZyb20gPSBlbC5zY3JvbGxUb3BcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gdG9wIC0gZnJvbVxuICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlKSA8IDEpIHJldHVyblxuXG4gICAgICBjb25zdCBkdXJhdGlvbiA9XG4gICAgICAgIFRVUk5fU0NST0xMX0RVUkFUSU9OX01TICtcbiAgICAgICAgKFRVUk5fU0NST0xMX01BWF9EVVJBVElPTl9NUyAtIFRVUk5fU0NST0xMX0RVUkFUSU9OX01TKSAqXG4gICAgICAgICAgTWF0aC5taW4oMSwgTWF0aC5hYnMoZGlzdGFuY2UpIC8gVFVSTl9TQ1JPTExfTE9OR19ESVNUQU5DRV9QWClcblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KClcbiAgICAgIGNvbnN0IHN0ZXAgPSAobm93OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBNYXRoLm1pbigxLCAobm93IC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uKVxuICAgICAgICAvLyBlYXNlT3V0RXhwbyAofmN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpKTogZW1waWV6YSBhIGZyZW5hciBtdWNob1xuICAgICAgICAvLyBhbnRlcyBxdWUgZWwgcXVpbnQgeSBhdGVycml6YSBzaW4gY29ydGUgcGVyY2VwdGlibGUuXG4gICAgICAgIGNvbnN0IGVhc2VkID0gcHJvZ3Jlc3MgPT09IDEgPyAxIDogMSAtIDIgKiogKC0xMiAqIHByb2dyZXNzKVxuICAgICAgICBlbC5zY3JvbGxUb3AgPSBmcm9tICsgZGlzdGFuY2UgKiBlYXNlZFxuICAgICAgICB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcygpXG4gICAgICAgIHR1cm5TY3JvbGxSYWZSZWYuY3VycmVudCA9IHByb2dyZXNzIDwgMSA/IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKSA6IG51bGxcbiAgICAgIH1cbiAgICAgIHR1cm5TY3JvbGxSYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKVxuICAgIH0sXG4gICAgW2NhbmNlbFR1cm5TY3JvbGwsIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzXVxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IGNhbmNlbFR1cm5TY3JvbGwsIFtjYW5jZWxUdXJuU2Nyb2xsXSlcblxuICBjb25zdCBzZXRTcGFjZXJIZWlnaHQgPSB1c2VDYWxsYmFjaygobmV4dDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKE1hdGguYWJzKHNwYWNlckhlaWdodFJlZi5jdXJyZW50IC0gbmV4dCkgPCAxKSByZXR1cm5cbiAgICBzcGFjZXJIZWlnaHRSZWYuY3VycmVudCA9IG5leHRcbiAgICBpZiAoc3BhY2VyRWxSZWYuY3VycmVudCkge1xuICAgICAgc3BhY2VyRWxSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBgJHtuZXh0fXB4YFxuICAgIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgY2xlYXJUdXJuU3BhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgYW5jaG9yZWRUdXJuSWRSZWYuY3VycmVudCA9IG51bGxcbiAgICBzZXRTcGFjZXJIZWlnaHQoMClcbiAgfSwgW3NldFNwYWNlckhlaWdodF0pXG5cbiAgLyoqXG4gICAqIERldnVlbHZlIGVsIGFsdG8gcmVzZXJ2YWRvIHF1ZSBzZSBwdWVkZSBzYWNhciBzaW4gbW92ZXIgbGEgdmlzdGE6IHRvZG8gbG9cbiAgICogcXVlIHF1ZWRlIHBvciBkZWJham8gZGVsIHNjcm9sbCBhY3R1YWwuIFNpIGVsIHVzdWFyaW8gZXN0w6EgZW4gZWwgZm9uZG8sIHNlXG4gICAqIHNhY2EgZW50ZXJvOyBzaSBlc3TDoSBhIG1pdGFkIGRlIGNhbWlubywgc2UgdmEgZHJlbmFuZG8gYSBtZWRpZGEgcXVlIGJhamEuXG4gICAqL1xuICBjb25zdCBkcmFpblR1cm5TcGFjZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsIHx8IHNwYWNlckhlaWdodFJlZi5jdXJyZW50IDw9IDApIHJldHVyblxuICAgIGNvbnN0IHJlbW92YWJsZSA9IE1hdGgubWF4KDAsIGVsLnNjcm9sbEhlaWdodCAtIGVsLmNsaWVudEhlaWdodCAtIGVsLnNjcm9sbFRvcClcbiAgICBzZXRTcGFjZXJIZWlnaHQoTWF0aC5tYXgoMCwgc3BhY2VySGVpZ2h0UmVmLmN1cnJlbnQgLSByZW1vdmFibGUpKVxuICB9LCBbc2V0U3BhY2VySGVpZ2h0XSlcblxuICAvKipcbiAgICogRWwgdXN1YXJpbyB0b23DsyBlbCBjb250cm9sIGRlbCBzY3JvbGw6IGVsIHR1cm5vIGRlamEgZGUgZXN0YXIgYW5jbGFkbyB5IGVsXG4gICAqIGVzcGFjaW8gcmVzZXJ2YWRvIGVtcGllemEgYSBkZXZvbHZlcnNlLiBTaW4gYW5jbGEgeSBjb24gc3BhY2VyID4gMCwgZWxcbiAgICogaGFuZGxlciBkZSBzY3JvbGwgc2lndWUgZHJlbmFuZG8gaGFzdGEgcXVlIGxsZWdhIGFsIGZvbmRvIHkgbm8gcXVlZGEgaHVlY28uXG4gICAqL1xuICBjb25zdCByZWxlYXNlVHVyblNwYWNlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghYW5jaG9yZWRUdXJuSWRSZWYuY3VycmVudCAmJiBzcGFjZXJIZWlnaHRSZWYuY3VycmVudCA8PSAwKSByZXR1cm5cbiAgICBhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGRyYWluVHVyblNwYWNlKClcbiAgfSwgW2RyYWluVHVyblNwYWNlXSlcblxuICBjb25zdCBoYW5kbGVVc2VyU2Nyb2xsSW50ZW50ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNhbmNlbFR1cm5TY3JvbGwoKVxuICAgIHJlbGVhc2VUdXJuU3BhY2UoKVxuICB9LCBbY2FuY2VsVHVyblNjcm9sbCwgcmVsZWFzZVR1cm5TcGFjZV0pXG5cbiAgY29uc3QgbWVhc3VyZVR1cm4gPSB1c2VDYWxsYmFjaygocXVlc3Rpb25JZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgY29uc3Qgc3BhY2VyRWwgPSBzcGFjZXJFbFJlZi5jdXJyZW50XG4gICAgaWYgKCFlbCB8fCAhc3BhY2VyRWwpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBxdWVzdGlvbkVsID0gZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLW1lc3NhZ2UtaWQ9XCIke3F1ZXN0aW9uSWR9XCJdYClcbiAgICBpZiAoIXF1ZXN0aW9uRWwpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBjb250YWluZXJUb3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICBjb25zdCBxdWVzdGlvblRvcCA9IHF1ZXN0aW9uRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gY29udGFpbmVyVG9wICsgZWwuc2Nyb2xsVG9wXG4gICAgY29uc3QgY29udGVudEJvdHRvbSA9IHNwYWNlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIGNvbnRhaW5lclRvcCArIGVsLnNjcm9sbFRvcFxuICAgIHJldHVybiB7IGVsLCBxdWVzdGlvblRvcCwgdHVybkhlaWdodDogY29udGVudEJvdHRvbSAtIHF1ZXN0aW9uVG9wIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgcmVzZXJ2ZVR1cm5TcGFjZSA9IHVzZUNhbGxiYWNrKFxuICAgIChxdWVzdGlvbklkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gbWVhc3VyZVR1cm4ocXVlc3Rpb25JZClcbiAgICAgIGlmICghbWVhc3VyZWQpIHJldHVyblxuICAgICAgY29uc3QgeyBlbCwgcXVlc3Rpb25Ub3AsIHR1cm5IZWlnaHQgfSA9IG1lYXN1cmVkXG5cbiAgICAgIC8vIEFuY2xhbW9zIHNpZW1wcmUsIGluY2x1c28gY3VhbmRvIG5vIGhhZ2EgZmFsdGEgcmVzZXJ2YXI6IGR1cmFudGUgZWxcbiAgICAgIC8vIHR1cm5vIGVsIHNjcm9sbCBubyBzZSBtdWV2ZSBzb2xvIGVuIG5pbmfDum4gY2Fzby5cbiAgICAgIGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQgPSBxdWVzdGlvbklkXG5cbiAgICAgIGNvbnN0IG9mZnNldCA9IHR1cm5BbmNob3JPZmZzZXQoZWwuY2xpZW50SGVpZ2h0KVxuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsVG9wID0gTWF0aC5tYXgoMCwgcXVlc3Rpb25Ub3AgLSBvZmZzZXQpXG4gICAgICAvLyBDaGF0IHJlY2nDqW4gaW5pY2lhZG8gbyBjb252ZXJzYWNpw7NuIHF1ZSBhw7puIGVudHJhIGVuIHBhbnRhbGxhOiBsYVxuICAgICAgLy8gcHJlZ3VudGEgeWEgZXN0w6EgYXJyaWJhLCBubyBoYXkgbmFkYSBxdWUgc3ViaXIgbmkgcXVlIHJlc2VydmFyLlxuICAgICAgaWYgKHRhcmdldFNjcm9sbFRvcCA8PSBlbC5zY3JvbGxUb3ApIHtcbiAgICAgICAgc2V0U3BhY2VySGVpZ2h0KDApXG4gICAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2VydmFtb3MgbG8gbcOtbmltbyBwYXJhIHF1ZSBgdGFyZ2V0U2Nyb2xsVG9wYCBzZWEgYWxjYW56YWJsZS4gRWxcbiAgICAgIC8vIHNwYWNlciBzZSBpbnNlcnRhIGRlIHVuYSAoZXMgYWx0byByZXNlcnZhZG8sIG5vIGNvbnRlbmlkbyB2aXNpYmxlKTtcbiAgICAgIC8vIGxvIMO6bmljbyBxdWUgc2UgcGVyY2liZSBlcyBlbCBkZXNwbGF6YW1pZW50byBhbmltYWRvLlxuICAgICAgc2V0U3BhY2VySGVpZ2h0KE1hdGgubWF4KDAsIGVsLmNsaWVudEhlaWdodCAtIHR1cm5IZWlnaHQgLSBvZmZzZXQpKVxuICAgICAgYW5pbWF0ZVNjcm9sbFRvKHRhcmdldFNjcm9sbFRvcClcbiAgICB9LFxuICAgIFttZWFzdXJlVHVybiwgc2V0U3BhY2VySGVpZ2h0LCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcywgYW5pbWF0ZVNjcm9sbFRvXVxuICApXG5cbiAgLyoqXG4gICAqIEVuY29nZSBlbCBzcGFjZXIgYSBtZWRpZGEgcXVlIGNyZWNlIGxhIHJlc3B1ZXN0YTogZWwgYWx0byB0b3RhbCBkZWwgc2Nyb2xsXG4gICAqIHF1ZWRhIGNvbnN0YW50ZSB5IGxhIHZpc3RhIG5vIHNlIG11ZXZlIHNvbGEuIFNvbG8gYWNoaWNhLCBudW5jYSBhZ3JhbmRhLFxuICAgKiBwYXJhIG5vIGlueWVjdGFyIGVzcGFjaW8gZW4gdHVybm9zIHF1ZSBhcnJhbmNhcm9uIHNpbiByZXNlcnZhLlxuICAgKiBEZXZ1ZWx2ZSBzaSBlbCB0dXJubyBzaWd1ZSBhbmNsYWRvIChhdW5xdWUgZWwgc3BhY2VyIHlhIHNlYSAwKS5cbiAgICovXG4gIGNvbnN0IHN5bmNUdXJuU3BhY2UgPSB1c2VDYWxsYmFjaygoKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50KSByZXR1cm4gZmFsc2VcbiAgICBpZiAoc3BhY2VySGVpZ2h0UmVmLmN1cnJlbnQgPiAwKSB7XG4gICAgICBjb25zdCBtZWFzdXJlZCA9IG1lYXN1cmVUdXJuKGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQpXG4gICAgICBpZiAobWVhc3VyZWQpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHVybkFuY2hvck9mZnNldChtZWFzdXJlZC5lbC5jbGllbnRIZWlnaHQpXG4gICAgICAgIGNvbnN0IHJlc2VydmVkID0gTWF0aC5tYXgoMCwgbWVhc3VyZWQuZWwuY2xpZW50SGVpZ2h0IC0gbWVhc3VyZWQudHVybkhlaWdodCAtIG9mZnNldClcbiAgICAgICAgc2V0U3BhY2VySGVpZ2h0KE1hdGgubWluKHNwYWNlckhlaWdodFJlZi5jdXJyZW50LCByZXNlcnZlZCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH0sIFttZWFzdXJlVHVybiwgc2V0U3BhY2VySGVpZ2h0XSlcblxuICBjb25zdCBoYW5kbGVDbGlja1Njcm9sbFRvQm90dG9tID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgIGlmICghZWwpIHJldHVyblxuICAgIGNsZWFyVHVyblNwYWNlKClcbiAgICAvLyBNaXNtYSBjdXJ2YSB5IGR1cmFjacOzbiBxdWUgZWwgYW5jbGFqZSBkZWwgdHVybm86IGVsIGBzbW9vdGhgIG5hdGl2byBmcmVuYSBzZWNvLlxuICAgIGFuaW1hdGVTY3JvbGxUbyhlbC5zY3JvbGxIZWlnaHQgLSBlbC5jbGllbnRIZWlnaHQpXG4gIH0sIFtjbGVhclR1cm5TcGFjZSwgYW5pbWF0ZVNjcm9sbFRvXSlcblxuICBjb25zdCBoYW5kbGVTY3JvbGxUb0JvdHRvbSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5VSUV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZS5jdXJyZW50VGFyZ2V0XG5cbiAgICAgIGlmIChzY3JvbGxSYWZSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShzY3JvbGxSYWZSZWYuY3VycmVudClcbiAgICAgIH1cblxuICAgICAgc2Nyb2xsUmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBzY3JvbGxSYWZSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXJcblxuICAgICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsVG9wIDwgbGFzdFNjcm9sbFRvcFJlZi5jdXJyZW50XG5cbiAgICAgICAgaWYgKGlzU2Nyb2xsaW5nVXApIHtcbiAgICAgICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDE1XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc05lYXJCb3R0b20gPSBzY3JvbGxIZWlnaHQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHQgPCBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudFxuXG4gICAgICAgIGlmIChpc05lYXJCb3R0b20pIHtcbiAgICAgICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgICAgIH1cblxuICAgICAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSAhaXNOZWFyQm90dG9tXG4gICAgICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IHNjcm9sbFRvcFxuXG4gICAgICAgIC8vIFR1cm5vIHlhIGxpYmVyYWRvIHBvciBlbCB1c3VhcmlvOiBzZWd1aW1vcyBkZXZvbHZpZW5kbyBlbCBhbHRvXG4gICAgICAgIC8vIHJlc2VydmFkbyBtaWVudHJhcyBiYWphLCBwYXJhIHF1ZSBhbCBsbGVnYXIgYWwgw7psdGltbyBtZW5zYWplIG5vXG4gICAgICAgIC8vIHF1ZWRlIGh1ZWNvIGRlYmFqby5cbiAgICAgICAgaWYgKCFhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50KSBkcmFpblR1cm5TcGFjZSgpXG5cbiAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuXG4gICAgICAgIGlmIChpc05lYXJCb3R0b20gJiYgb25TY3JvbGxUb0JvdHRvbSkge1xuICAgICAgICAgIG9uU2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlU2Nyb2xsKGNvbnRhaW5lcilcbiAgICAgIH0pXG4gICAgfSxcbiAgICBbb25TY3JvbGxUb0JvdHRvbSwgaGFuZGxlU2Nyb2xsLCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcywgZHJhaW5UdXJuU3BhY2VdXG4gIClcblxuICAvLyByZWZzIHRvIHN0YWJpbGl6ZSBmdW5jdGlvbnMgYW5kIGF2b2lkIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgY29uc3Qgc2VuZE1lc3NhZ2VSZWYgPSB1c2VSZWYoc2VuZE1lc3NhZ2UpXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uUmVmID0gdXNlUmVmKHN0b3BHZW5lcmF0aW9uKVxuICBjb25zdCBvblNlbmRNZXNzYWdlUmVhZHlSZWYgPSB1c2VSZWYob25TZW5kTWVzc2FnZVJlYWR5KVxuICBjb25zdCBzZW5kTWVzc2FnZVByb3h5UmVmID0gdXNlUmVmKFxuICAgIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHNlbmRNZXNzYWdlUmVmLmN1cnJlbnQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkLCBzY0lkKVxuICApXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uUHJveHlSZWYgPSB1c2VSZWYoKCkgPT4gc3RvcEdlbmVyYXRpb25SZWYuY3VycmVudCgpKVxuXG4gIC8vIHVwZGF0ZSByZWZzIHdoZW4gZnVuY3Rpb25zIGNoYW5nZVxuICBzZW5kTWVzc2FnZVJlZi5jdXJyZW50ID0gc2VuZE1lc3NhZ2VcbiAgc3RvcEdlbmVyYXRpb25SZWYuY3VycmVudCA9IHN0b3BHZW5lcmF0aW9uXG4gIG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50ID0gb25TZW5kTWVzc2FnZVJlYWR5XG5cbiAgLyoqXG4gICAqIGBoYW5kbGVTdWdnZXN0aW9uQ2xpY2tgIHNlIHBhc2EgYSBUT0RPUyBsb3MgTWVzc2FnZUl0ZW0sIGFzw60gcXVlIHN1IGlkZW50aWRhZFxuICAgKiBkZWNpZGUgc2kgZWwgYG1lbW9gIGRlIGxhIGxpc3RhIHNvc3RpZW5lLiBMZWVtb3MgcG9yIHJlZiBsbyBxdWUgY2FtYmlhIGVuIGNhZGFcbiAgICogdXBkYXRlIChgbWVzc2FnZXNgLCBgc2VuZE1lc3NhZ2VgLCBsYXMgc3VnZXJlbmNpYXMgeWEgZWxlZ2lkYXMpIHBhcmEgcXVlIGVsXG4gICAqIGNhbGxiYWNrIHNlYSBlc3RhYmxlOiBzaSBubywgYWwgdGVybWluYXIgZWwgc3RyZWFtIHNlIHJlcGludGEgZWwgY2hhdCBlbnRlcm9cbiAgICogeSBjYWRhIE1haWFTdHJlYW1kb3duIHZ1ZWx2ZSBhIHBhcnNlYXIgc3UgbWFya2Rvd24uXG4gICAqL1xuICBjb25zdCBtZXNzYWdlc0RhdGFSZWYgPSB1c2VSZWYobWVzc2FnZXMpXG4gIG1lc3NhZ2VzRGF0YVJlZi5jdXJyZW50ID0gbWVzc2FnZXNcbiAgY29uc3Qgc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1JlZiA9IHVzZVJlZihzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzKVxuICBzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzUmVmLmN1cnJlbnQgPSBzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzXG5cbiAgY29uc3QgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKG1lc3NhZ2VJZDogc3RyaW5nLCBzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc3VnZ2VzdGlvbj8udHJpbSgpKSByZXR1cm5cbiAgICAgIGlmIChzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzUmVmLmN1cnJlbnRbbWVzc2FnZUlkXSkgcmV0dXJuXG4gICAgICBjb25zdCBjdXJyZW50TWVzc2FnZXMgPSBtZXNzYWdlc0RhdGFSZWYuY3VycmVudFxuICAgICAgY29uc3QgaXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50ID0gaXNNYWlha2VyQWdlbnQoYWdlbnQpXG4gICAgICBldmVudChFVkVOVFMuYWlDaGF0U3VnZ2VzdGVkQW5zd2VyLCB7XG4gICAgICAgIGFnZW50X3R5cGU6IGlzTWFya2V0cGxhY2VHbG9iYWxBZ2VudCA/ICdtYXJrZXRwbGFjZScgOiBhZ2VudD8udHlwZSxcbiAgICAgIH0pXG4gICAgICBzZXRTZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzKHByZXYgPT4gKHsgLi4ucHJldiwgW21lc3NhZ2VJZF06IHRydWUgfSkpXG5cbiAgICAgIGNvbnN0IHRhcmdldE1lc3NhZ2UgPSBjdXJyZW50TWVzc2FnZXMuZmluZChtc2cgPT4gbXNnLmlkID09PSBtZXNzYWdlSWQpXG4gICAgICBjb25zdCBpc1JldHJ5U3VnZ2VzdGlvbiA9ICEhdGFyZ2V0TWVzc2FnZT8uaXNFcnJvciAmJiBzdWdnZXN0aW9uID09PSB0KCdjaGF0LnJldHJ5JylcbiAgICAgIGlmIChpc1JldHJ5U3VnZ2VzdGlvbikge1xuICAgICAgICBjb25zdCBsYXN0VXNlck1lc3NhZ2UgPSBjdXJyZW50TWVzc2FnZXNcbiAgICAgICAgICAuZmlsdGVyKG1zZyA9PiBtc2cucm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgbXNnLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkpXG4gICAgICAgICAgLmF0KC0xKVxuICAgICAgICBpZiAobGFzdFVzZXJNZXNzYWdlPy5tZXNzYWdlKSB7XG4gICAgICAgICAgY29uc3QgcmV0cnlBdHRhY2htZW50cyA9IEFycmF5LmlzQXJyYXkobGFzdFVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzKVxuICAgICAgICAgICAgPyBsYXN0VXNlck1lc3NhZ2UuYXR0YWNobWVudHNcbiAgICAgICAgICAgIDogQXJyYXkuaXNBcnJheShsYXN0VXNlck1lc3NhZ2Uuc291cmNlcylcbiAgICAgICAgICAgICAgPyBsYXN0VXNlck1lc3NhZ2Uuc291cmNlc1xuICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgc2VuZE1lc3NhZ2VSZWYuY3VycmVudChsYXN0VXNlck1lc3NhZ2UubWVzc2FnZSwgcmV0cnlBdHRhY2htZW50cylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZW5kTWVzc2FnZVJlZi5jdXJyZW50KHN1Z2dlc3Rpb24pXG4gICAgfSxcbiAgICBbZXZlbnQsIGFnZW50LCB0LCBhdXRoVXNlci5pZF1cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50KSB7XG4gICAgICBvblNlbmRNZXNzYWdlUmVhZHlSZWYuY3VycmVudChcbiAgICAgICAgc2VuZE1lc3NhZ2VQcm94eVJlZi5jdXJyZW50LFxuICAgICAgICBzdG9wR2VuZXJhdGlvblByb3h5UmVmLmN1cnJlbnQsXG4gICAgICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICAgICAgaXNXcml0aW5nXG4gICAgICApXG4gICAgfVxuICB9LCBbd2FpdGluZ1Jlc3BvbnNlLCBpc1dyaXRpbmddKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaXNMb2FkaW5nTW9yZVJlZi5jdXJyZW50ID0gaXNMb2FkaW5nTW9yZU1lc3NhZ2VzXG4gIH0sIFtpc0xvYWRpbmdNb3JlTWVzc2FnZXNdKVxuXG4gIC8vIEN1YW5kbyBlbCBhZ2VudGUgZW1waWV6YSBhIHJlc3BvbmRlciwgcmVzZXRlYXIgZWwgZmxhZyB5IGVsIHVtYnJhbCBwYXJhIGFjdGl2YXIgZWwgYXV0by1zY3JvbGxcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAod2FpdGluZ1Jlc3BvbnNlKSB7XG4gICAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgc2Nyb2xsVGhyZXNob2xkUmVmLmN1cnJlbnQgPSAzOVxuICAgIH1cbiAgfSwgW3dhaXRpbmdSZXNwb25zZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNoYXRJbml0aWFsaXplZFJlZi5jdXJyZW50KSB7XG4gICAgICBjaGF0SW5pdGlhbGl6ZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGluaXRpYWxpemVDaGF0KClcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8vIEF1dG9zY3JvbGwgbWllbnRyYXMgZWwgdGV4dG8gZGVsIHN0cmVhbSBjcmVjZS4gRWwgdGV4dG8gc2UgcGludGEgYWwgcml0bW9cbiAgLy8gZGUgYHVzZVNtb290aFN0cmVhbVRleHRgICh+NjBmcHMpLCBubyBhbCByaXRtbyBkZSBsbGVnYWRhIGRlIHRva2VucyBkZWxcbiAgLy8gYmFja2VuZDogcG9yIGVzbyBhY8OhIHVzYW1vcyB1biBsb29wIGRlIHJBRiBxdWUgY29tcGFyYSBgc2Nyb2xsSGVpZ2h0YFxuICAvLyBjb250cmEgZWwgw7psdGltbyB2YWxvciBvYnNlcnZhZG8geSBhanVzdGEgc29sbyBjdWFuZG8gY2FtYmlhLiBBc8OtIGVsXG4gIC8vIHNjcm9sbCBxdWVkYSBwZXJmZWN0YW1lbnRlIHNpbmNyb25pemFkbyBjb24gbGEgYW5pbWFjacOzbiBkZWwgdGV4dG8gc2luXG4gIC8vIGRlcGVuZGVyIGRlIGxhIGNhZGVuY2lhIGRlbCBzdHJlYW1pbmdTdG9yZS5cbiAgLy8gQ29uIGVsIHR1cm5vIGFuY2xhZG8gZXN0ZSBsb29wIHNvbG8gZW5jb2dlIGVsIHNwYWNlcjogbm8gdG9jYSBlbCBzY3JvbGwuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF3YWl0aW5nUmVzcG9uc2UgJiYgIWlzV3JpdGluZykgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmICghbWVzc2FnZXNSZWYuY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgbGV0IHJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAgIGxldCBsYXN0SGVpZ2h0ID0gbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxIZWlnaHRcblxuICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmFmSWQgPSBudWxsXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHN5bmNUdXJuU3BhY2UoKSkge1xuICAgICAgICAvLyBFbCBzY3JvbGwgbm8gc2UgbXVldmUsIHBlcm8gZWwgY29udGVuaWRvIGNyZWNlOiBsYSBmbGVjaGEgeSBlbFxuICAgICAgICAvLyBncmFkaWVudGUgZGUgYWJham8gdGllbmVuIHF1ZSBlbmNlbmRlcnNlIGFwZW5hcyBzZSBwYXNhIGRlbCB2aWV3cG9ydC5cbiAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHRcbiAgICAgIGlmIChjdXJyZW50SGVpZ2h0ICE9PSBsYXN0SGVpZ2h0KSB7XG4gICAgICAgIGxhc3RIZWlnaHQgPSBjdXJyZW50SGVpZ2h0XG4gICAgICAgIGlmICghdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgZWwuc2Nyb2xsVG9wID0gY3VycmVudEhlaWdodFxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICAgIH1cbiAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spXG4gICAgfVxuXG4gICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljaylcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJhZklkICE9IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKVxuICAgIH1cbiAgfSwgW3dhaXRpbmdSZXNwb25zZSwgaXNXcml0aW5nLCBzeW5jVHVyblNwYWNlLCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlc10pXG5cbiAgLy8gQWwgY29tZW56YXIgYSBlc3BlcmFyIGxhIHJlc3B1ZXN0YSBkZWwgYmFja2VuZCwgc2Nyb2xsIGluaWNpYWwgYWwgZm9uZG8uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHdhaXRpbmdSZXNwb25zZSAmJiBtZXNzYWdlc1JlZi5jdXJyZW50ICYmICFhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50KSB7XG4gICAgICBzY3JvbGxUb0JvdHRvbVJhZih7IHNraXBJZlVzZXJTY3JvbGxpbmc6IHRydWUgfSlcbiAgICB9XG4gIH0sIFt3YWl0aW5nUmVzcG9uc2UsIHNjcm9sbFRvQm90dG9tUmFmXSlcblxuICBjb25zdCBsYXN0UmVzZXJ2ZWRRdWVzdGlvblJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIC8vIENhbWJpbyBkZSBjaGF0OiBlbCBhbmNsYSB5IGVsIHNwYWNlciBkZWwgdHVybm8gYW50ZXJpb3IgZGVqYW4gZGUgYXBsaWNhci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxvYWRpbmdNZXNzYWdlcykgcmV0dXJuXG4gICAgbGFzdFJlc2VydmVkUXVlc3Rpb25SZWYuY3VycmVudCA9IG51bGxcbiAgICBjbGVhclR1cm5TcGFjZSgpXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXMsIGNsZWFyVHVyblNwYWNlXSlcblxuICAvLyBBbCBlbnZpYXIgdW4gbWVuc2FqZTogYW5jbGFtb3MgZWwgdHVybm8geSBoYWNlbW9zIGVsIMO6bmljbyBzY3JvbGwgZGVsIGNpY2xvLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2FkaW5nTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzKSByZXR1cm5cblxuICAgIGxldCBxdWVzdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIGZvciAobGV0IGluZGV4ID0gbWVzc2FnZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXggLT0gMSkge1xuICAgICAgaWYgKG1lc3NhZ2VzW2luZGV4XT8uaWQ/LnN0YXJ0c1dpdGgoJ3F1ZXN0aW9uLScpKSB7XG4gICAgICAgIHF1ZXN0aW9uSWQgPSBtZXNzYWdlc1tpbmRleF0uaWRcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFxdWVzdGlvbklkIHx8IHF1ZXN0aW9uSWQgPT09IGxhc3RSZXNlcnZlZFF1ZXN0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuXG4gICAgbGFzdFJlc2VydmVkUXVlc3Rpb25SZWYuY3VycmVudCA9IHF1ZXN0aW9uSWRcbiAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNlcnZlVHVyblNwYWNlKHF1ZXN0aW9uSWQpKVxuICB9LCBbbWVzc2FnZXMsIGxvYWRpbmdNZXNzYWdlcywgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCByZXNlcnZlVHVyblNwYWNlXSlcblxuICAvLyBTY3JvbGwgY3VhbmRvIGNhbWJpYW4gbG9zIG1lbnNhamVzOiBkaXN0aW5ndWUgXCJudWV2byBtZW5zYWplXCIgKGFncmVnYWRvKVxuICAvLyBkZSBcInJlZW1wbGF6b1wiIChtaXNtbyBpZC9sZW5ndGgsIGVqLiBmZWVkYmFjayBvIGFwcHJvdmFsU3RhdHVzKS4gRW5cbiAgLy8gcmVlbXBsYXpvcyBzb2xvIHNlIHJlY2FsY3VsYSBsYSB2aXNpYmlsaWRhZCBkZWwgYm90w7NuIHNpbiBmb3J6YXIgc2Nyb2xsLlxuICBjb25zdCBsYXN0TWVzc2FnZUlkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGxhc3RNZXNzYWdlc0xlbmd0aFJlZiA9IHVzZVJlZjxudW1iZXI+KDApXG5cbiAgLy8gQWwgY2FtYmlhciBkZSBzZXNpw7NuLCByZXNldGVhciBlc3RhZG8gZGUgc2Nyb2xsIG1hbnVhbCBwYXJhIG5vIGhlcmVkYXIgZWwgY2hhdCBhbnRlcmlvci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB3YXNMb2FkaW5nTWVzc2FnZXNSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgbGFzdFNjcm9sbGVkU2Vzc2lvblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2Nyb2xsVGhyZXNob2xkUmVmLmN1cnJlbnQgPSAzOVxuICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IDBcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnQgPSAwXG4gIH0sIFtpbml0aWFsQ2hhdElkXSlcblxuICAvLyBSZXN0YXVyYWNpw7NuIGRlc2RlIGNhY2hlIChzaW4gTG9hZGVyKTogYmFqYXIgYWwgZm9uZG8gYWwgcmVhYnJpciBzZXNpw7NuIHZpc2l0YWRhLlxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2FkaW5nTWVzc2FnZXMgfHwgIWluaXRpYWxDaGF0SWQgfHwgbWVzc2FnZXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBpZiAobGFzdFNjcm9sbGVkU2Vzc2lvblJlZi5jdXJyZW50ID09PSBpbml0aWFsQ2hhdElkKSByZXR1cm5cbiAgICBsYXN0U2Nyb2xsZWRTZXNzaW9uUmVmLmN1cnJlbnQgPSBpbml0aWFsQ2hhdElkXG5cbiAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXT8uaWQgPz8gbnVsbFxuICAgIGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50ID0gbWVzc2FnZXMubGVuZ3RoXG5cbiAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoeyBkZWxheU1zOiAxMDAgfSlcbiAgfSwgW2luaXRpYWxDaGF0SWQsIGxvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoLCBtZXNzYWdlcywgc2Nyb2xsVG9Cb3R0b21SYWZdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFtZXNzYWdlc1JlZi5jdXJyZW50IHx8IGxvYWRpbmdNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgbGFzdElkID0gbGFzdE1lc3NhZ2U/LmlkID8/IG51bGxcbiAgICBjb25zdCBwcmV2SWQgPSBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnRcbiAgICBjb25zdCBwcmV2TGVuID0gbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnRcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBsYXN0SWRcbiAgICBsYXN0TWVzc2FnZXNMZW5ndGhSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aFxuXG4gICAgY29uc3QgaXNOZXdNZXNzYWdlID0gbGFzdElkICE9PSBwcmV2SWQgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSBwcmV2TGVuXG4gICAgaWYgKCFpc05ld01lc3NhZ2UpIHtcbiAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFR1cm5vIGFuY2xhZG86IG5pIGVsIHJlZW1wbGF6byBkZWwgcGxhY2Vob2xkZXIgcG9yIGVsIG1lbnNhamUgZmluYWwsIG5pIGxhXG4gICAgLy8gYXBhcmljacOzbiBkZWwgQXBwcm92YWxCb3ggbXVldmVuIGVsIHNjcm9sbC4gU29sbyBzZSBhanVzdGEgZWwgc3BhY2VyLlxuICAgIGlmIChhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50KSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3luY1R1cm5TcGFjZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBjb25zdCBpc0F0Qm90dG9tID0gY29udGFpbmVyLnNjcm9sbEhlaWdodCAtIGNvbnRhaW5lci5zY3JvbGxUb3AgPD0gY29udGFpbmVyLmNsaWVudEhlaWdodCArIDEwMFxuICAgIGNvbnN0IGhhc0luaXRpYWxNZXNzYWdlID0gbWVzc2FnZXMuc29tZShtc2cgPT4gbXNnLmlkID09PSAndXNlci1pbml0aWFsLW1lc3NhZ2UnKVxuICAgIGNvbnN0IGlzQXBwcm92YWwgPSAhIWxhc3RNZXNzYWdlICYmIChsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdhcHByb3ZhbC0nKSB8fCAhIWxhc3RNZXNzYWdlLmFwcHJvdmFsKVxuICAgIGNvbnN0IGlzQW5zd2VyT3JRdWVzdGlvbiA9XG4gICAgICAhIWxhc3RNZXNzYWdlICYmIChsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdhbnN3ZXItJykgfHwgbGFzdE1lc3NhZ2UuaWQuc3RhcnRzV2l0aCgncXVlc3Rpb24tJykpXG5cbiAgICAvLyBOdWV2b3MgYW5zd2VyL3F1ZXN0aW9uOiBzY3JvbGwgc2kgZWwgdXN1YXJpbyB5YSBlc3RhYmEgYWwgZm9uZG8uXG4gICAgaWYgKGlzQW5zd2VyT3JRdWVzdGlvbiAmJiBpc0F0Qm90dG9tKSB7XG4gICAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDYXNvIGJvcmRlOiBjYW1iaW9zIGRlIG1lbnNhamVzIHNpbiBzZXIgbnVldm8gYW5zd2VyL3VzZXIvYXBwcm92YWxcbiAgICAvLyBwZXJvIHPDrSB1biBtZW5zYWplIG51ZXZvIChubyBlbCBcInVzZXItaW5pdGlhbC1tZXNzYWdlXCIpLiBTY3JvbGxlYS5cbiAgICBpZiAoIWlzQW5zd2VyT3JRdWVzdGlvbiAmJiAhaXNBcHByb3ZhbCAmJiAhaGFzSW5pdGlhbE1lc3NhZ2UgJiYgbWVzc2FnZXMubGVuZ3RoID4gcHJldkxlbikge1xuICAgICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICB9LCBbbWVzc2FnZXMsIGxvYWRpbmdNZXNzYWdlcywgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCBzY3JvbGxUb0JvdHRvbVJhZiwgc3luY1R1cm5TcGFjZSwgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXNdKVxuXG4gIC8vIEFsIGFicmlyL2NhcmdhciB1bmEgY29udmVyc2FjacOzbiBlbCBjb250ZW5lZG9yIHNlIHJlbW9udGEgKExvYWRlciDihpIgbGlzdGEpIGNvblxuICAvLyBzY3JvbGxUb3A9MC4gRm9yemFtb3MgaXIgYWwgZm9uZG8gYWwgdGVybWluYXIgbG9hZE1lc3NhZ2VzLCBzaW4gYWZlY3RhciBwYWdpbmFjacOzbiBoYWNpYSBhcnJpYmEuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QganVzdEZpbmlzaGVkTG9hZGluZyA9IHdhc0xvYWRpbmdNZXNzYWdlc1JlZi5jdXJyZW50ICYmICFsb2FkaW5nTWVzc2FnZXNcbiAgICB3YXNMb2FkaW5nTWVzc2FnZXNSZWYuY3VycmVudCA9IGxvYWRpbmdNZXNzYWdlc1xuXG4gICAgaWYgKCFqdXN0RmluaXNoZWRMb2FkaW5nIHx8IG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXT8uaWQgPz8gbnVsbFxuICAgIGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50ID0gbWVzc2FnZXMubGVuZ3RoXG5cbiAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoeyBkZWxheU1zOiAxMDAgfSlcbiAgfSwgW2xvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoLCBzY3JvbGxUb0JvdHRvbVJhZl0pXG5cbiAgLy8gRXN0YWRvIGluaWNpYWwgZGVsIGJvdMOzbiBzY3JvbGwtdG8tYm90dG9tIGFsIHRlcm1pbmFyIGxvYWRpbmdNZXNzYWdlcy5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxvYWRpbmdNZXNzYWdlcykge1xuICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgIH1cbiAgfSwgW2xvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoLCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlc10pXG5cbiAgLy8gT2J0ZW5lciBlbCDDumx0aW1vIG1lbnNhamUgZGVsIHVzdWFyaW8gcGFyYSB2ZXJpZmljYXIgc2kgdGllbmUgYXR0YWNobWVudHNcbiAgY29uc3QgbGFzdFVzZXJNZXNzYWdlID0gbWVzc2FnZXNcbiAgICAuZmlsdGVyKG1zZyA9PiBtc2cucm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgbXNnLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkpXG4gICAgLmF0KC0xKVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRzQ291bnQgPVxuICAgIChBcnJheS5pc0FycmF5KGxhc3RVc2VyTWVzc2FnZT8uYXR0YWNobWVudHMpID8gbGFzdFVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzLmxlbmd0aCA6IDApIHx8XG4gICAgKEFycmF5LmlzQXJyYXkobGFzdFVzZXJNZXNzYWdlPy5zb3VyY2VzKSA/IGxhc3RVc2VyTWVzc2FnZS5zb3VyY2VzLmxlbmd0aCA6IDApXG5cbiAgY29uc3Qgc3RyZWFtTG9hZGluZ0Rpc3BsYXkgPSByZXNvbHZlU3RyZWFtTG9hZGluZ0Rpc3BsYXkoe1xuICAgIHN0cmVhbUFjdGl2aXR5LFxuICAgIGxvYWRpbmdNZXNzYWdlLFxuICAgIGFjdGl2ZUxvYWRpbmdzOiBhY3RpdmVMb2FkaW5ncyB8fCB7fSxcbiAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIGhhc0F0dGFjaG1lbnRzOiBCb29sZWFuKGF0dGFjaG1lbnRzQ291bnQpLFxuICAgIGF0dGFjaG1lbnRzQ291bnQsXG4gICAgdCxcbiAgfSlcblxuICBjb25zdCBpc1Njcm9sbE9uUGFyZW50ID0gISFleHBhbmRlZFxuXG4gIC8vIEFsIGV4cGFuZGlyL2NvbnRyYWVyIGVsIG1vZGFsIGVsIHJlZiBwYXNhIGEgb3RybyBjb250ZW5lZG9yIChzY3JvbGxUb3Agc2UgcmVzZXRlYSBhIDApLlxuICAvLyBSZXN0YXVyYXIgbGEgcG9zaWNpw7NuIGRlIHNjcm9sbCBhbnRlcyBkZWwgcGFpbnQgcGFyYSBldml0YXIgcXVlIGxhIGNvbnZlcnNhY2nDs24gc2FsdGUgYXJyaWJhLlxuICBjb25zdCBleHBhbmRlZFJlZiA9IHVzZVJlZihleHBhbmRlZClcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZXhwYW5kZWRSZWYuY3VycmVudCAhPT0gZXhwYW5kZWQgJiYgbWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgY29uc3Qgc2F2ZWRTY3JvbGxUb3AgPSBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnRcbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gc2F2ZWRTY3JvbGxUb3BcbiAgICAgIGV4cGFuZGVkUmVmLmN1cnJlbnQgPSBleHBhbmRlZFxuICAgIH0gZWxzZSB7XG4gICAgICBleHBhbmRlZFJlZi5jdXJyZW50ID0gZXhwYW5kZWRcbiAgICB9XG4gIH0sIFtleHBhbmRlZF0pXG5cbiAgaWYgKGxvYWRpbmdNZXNzYWdlcykge1xuICAgIHJldHVybiAoXG4gICAgICA8RmFkZSBmaWxsPlxuICAgICAgICA8TG9hZGVyIC8+XG4gICAgICA8L0ZhZGU+XG4gICAgKVxuICB9XG5cbiAgY29uc3QgbGFzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXVxuICBjb25zdCBoYXNNZXNzYWdlTGV2ZWxJbmRpY2F0b3IgPVxuICAgICEhbGFzdE1lc3NhZ2UgJiYgaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZChsYXN0TWVzc2FnZS5pZCkgJiYgKHdhaXRpbmdSZXNwb25zZSB8fCBpc1dyaXRpbmcpXG5cbiAgY29uc3QgbWVzc2FnZXNDb250ZW50ID0gKFxuICAgIDw+XG4gICAgICB7aXNMb2FkaW5nTW9yZU1lc3NhZ2VzICYmIDxMb2FkaW5nVGV4dCB0ZXh0PXt0KCdjaGF0LmxvYWRpbmdNb3JlJyl9IC8+fVxuICAgICAgPD5cbiAgICAgICAge21lc3NhZ2VzLm1hcCgobWVzc2FnZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0Fzc2lzdGFudE1lc3NhZ2UgPSBtZXNzYWdlLnJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQgfHwgbWVzc2FnZS51c2VyLmlkID09PSAnYXNzaXN0YW50J1xuICAgICAgICAgIGNvbnN0IGlzTGFzdE1lc3NhZ2UgPSBpbmRleCA9PT0gbWVzc2FnZXMubGVuZ3RoIC0gMVxuICAgICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgPVxuICAgICAgICAgICAgaXNBc3Npc3RhbnRNZXNzYWdlICYmIGlzTGFzdE1lc3NhZ2UgJiYgaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZChtZXNzYWdlLmlkKVxuICAgICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nID0gaXNTdHJlYW1pbmdQbGFjZWhvbGRlciAmJiAod2FpdGluZ1Jlc3BvbnNlIHx8IGlzV3JpdGluZylcblxuICAgICAgICAgIC8vIE5vIGZpbHRyYXIgZWwgcGxhY2Vob2xkZXIgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nOiBzdSB0ZXh0byB2aXZlXG4gICAgICAgICAgLy8gZW4gZWwgc3RyZWFtaW5nU3RvcmUgeSBgbWVzc2FnZS5tZXNzYWdlYCBlcyAnJyBoYXN0YSBlbCBjb21wbGV0ZS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaXNTdHJlYW1pbmdQbGFjZWhvbGRlciAmJlxuICAgICAgICAgICAgIWlzU3RyZWFtaW5nICYmXG4gICAgICAgICAgICAhKG1lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aCB8fCBtZXNzYWdlLnNvdXJjZXM/Lmxlbmd0aCkgJiZcbiAgICAgICAgICAgICFtZXNzYWdlLm1lc3NhZ2UgJiZcbiAgICAgICAgICAgICFtZXNzYWdlLnByb2plY3Q/Lm5hbWUgJiZcbiAgICAgICAgICAgICFtZXNzYWdlLmFwcHJvdmFsXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VGZWVkYmFjayA9XG4gICAgICAgICAgICBtZXNzYWdlPy53YXNIZWxwZnVsID09PSB1bmRlZmluZWQgfHwgbWVzc2FnZS53YXNIZWxwZnVsID09PSBudWxsXG4gICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICA6IG1lc3NhZ2Uud2FzSGVscGZ1bFxuICAgICAgICAgICAgICAgID8gRmVlZGJhY2suVEhVTUJTX1VQXG4gICAgICAgICAgICAgICAgOiBGZWVkYmFjay5USFVNQlNfRE9XTlxuXG4gICAgICAgICAgLy8gS2V5IGVzdGFibGU6IHNvbG8gbWVzc2FnZS5pZCBwYXJhIGV2aXRhciByZW1vdW50IGR1cmFudGUgc3RyZWFtaW5nIChtZXNzYWdlLmRhdGUgcHVlZGUgY2FtYmlhcilcbiAgICAgICAgICBjb25zdCBtZXNzYWdlS2V5ID0gbWVzc2FnZS5pZCA/PyBgbXNnLSR7aW5kZXh9YFxuXG4gICAgICAgICAgY29uc3QgdHVybklkID0gcmVzb2x2ZVJldHJ5VHVybklkKG1lc3NhZ2UpXG4gICAgICAgICAgY29uc3QgdXNlck1lc3NhZ2VGb3JSZXRyeSA9IGZpbmRVc2VyTWVzc2FnZUZvclJldHJ5KG1lc3NhZ2VzLCBtZXNzYWdlKVxuICAgICAgICAgIGNvbnN0IGNhblJldHJ5ID1cbiAgICAgICAgICAgICEhdXNlck1lc3NhZ2VGb3JSZXRyeSAmJlxuICAgICAgICAgICAgIWlzU3RyZWFtaW5nICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5pc0Vycm9yICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5hcHByb3ZhbCAmJlxuICAgICAgICAgICAgKG1lc3NhZ2UuaXNGcm9udGVuZENhbmNlbGxlZCB8fCAoIW1lc3NhZ2UuaXNfY2FuY2VsbGVkICYmICEhdHVybklkKSlcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8TWVzc2FnZUl0ZW1cbiAgICAgICAgICAgICAgey4uLm1lc3NhZ2V9XG4gICAgICAgICAgICAgIGtleT17bWVzc2FnZUtleX1cbiAgICAgICAgICAgICAgYXV0aFVzZXI9e2F1dGhVc2VyfVxuICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RPcHRpb249e2hhbmRsZVNlbGVjdE9wdGlvbn1cbiAgICAgICAgICAgICAgaGFuZGxlRmVlZGJhY2s9e2hhbmRsZUZlZWRiYWNrfVxuICAgICAgICAgICAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uPXtoYW5kbGVBcHByb3ZhbERlY2lzaW9ufVxuICAgICAgICAgICAgICBoYW5kbGVTdWdnZXN0aW9uQ2xpY2s9e2hhbmRsZVN1Z2dlc3Rpb25DbGlja31cbiAgICAgICAgICAgICAgaGFuZGxlUmV0cnk9e2NhblJldHJ5ID8gKCkgPT4gcmV0cnlNZXNzYWdlKG1lc3NhZ2UpIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICBoYXNTZWxlY3RlZFN1Z2dlc3Rpb249eyEhc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1ttZXNzYWdlLmlkXX1cbiAgICAgICAgICAgICAgZGlzYWJsZUZlZWRiYWNrPXttZXNzYWdlRmVlZGJhY2t9XG4gICAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtpc1N0cmVhbWluZ31cbiAgICAgICAgICAgICAgaXNMYXN0TWVzc2FnZT17aXNMYXN0TWVzc2FnZX1cbiAgICAgICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgICAgICBzdHJlYW1BY3Rpdml0eT17aXNTdHJlYW1pbmcgPyBzdHJlYW1Mb2FkaW5nRGlzcGxheSA6IG51bGx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8Lz5cbiAgICAgIHshaGFzTWVzc2FnZUxldmVsSW5kaWNhdG9yICYmIHN0cmVhbUxvYWRpbmdEaXNwbGF5ICYmIChcbiAgICAgICAgPFNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uPlxuICAgICAgICAgIDxBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIGFjdGl2aXR5PXtzdHJlYW1Mb2FkaW5nRGlzcGxheX0gLz5cbiAgICAgICAgPC9TQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbj5cbiAgICAgICl9XG4gICAgICB7LyogRXNwYWNpbyBxdWUgbGUgcGVybWl0ZSBhIGxhIHByZWd1bnRhIHN1YmlyIGFsIHRvcGUuIEFsdHVyYSBtYW5lamFkYVxuICAgICAgICAgIGltcGVyYXRpdmFtZW50ZSBkZXNkZSBgc2V0U3BhY2VySGVpZ2h0YDsgYXJyYW5jYSBlbiAwLiAqL31cbiAgICAgIDxTQ1R1cm5TcGFjZXIgcmVmPXtzcGFjZXJFbFJlZn0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICA8Lz5cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgLy8gU2kgZWwgdXN1YXJpbyBtdWV2ZSBlbCBzY3JvbGwgYWJvcnRhbW9zIGxhIGFuaW1hY2nDs24geSBzb2x0YW1vcyBlbCB0dXJubzpcbiAgICAvLyBubyBsZSBwZWxlYW1vcyBlbCBjb250cm9sIGRlbCBjb250ZW5lZG9yLlxuICAgIDxTQ01lc3NhZ2VzT3V0ZXJcbiAgICAgICRzY3JvbGxPblBhcmVudD17aXNTY3JvbGxPblBhcmVudH1cbiAgICAgIG9uV2hlZWw9e2hhbmRsZVVzZXJTY3JvbGxJbnRlbnR9XG4gICAgICBvblRvdWNoU3RhcnQ9e2hhbmRsZVVzZXJTY3JvbGxJbnRlbnR9XG4gICAgPlxuICAgICAgPFNDTWVzc2FnZXNHcmFkaWVudFRvcCAkc2hvdz17c2hvd1RvcEdyYWRpZW50fSBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAge2lzU2Nyb2xsT25QYXJlbnQgPyAoXG4gICAgICAgIDxTQ01lc3NhZ2VzU2Nyb2xsIHJlZj17bWVzc2FnZXNSZWZ9IG9uU2Nyb2xsPXtoYW5kbGVTY3JvbGxUb0JvdHRvbX0+XG4gICAgICAgICAgPFNDTWVzc2FnZXNJbm5lciAkc2Nyb2xsT25QYXJlbnQ9e2lzU2Nyb2xsT25QYXJlbnR9PnttZXNzYWdlc0NvbnRlbnR9PC9TQ01lc3NhZ2VzSW5uZXI+XG4gICAgICAgIDwvU0NNZXNzYWdlc1Njcm9sbD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxTQ01lc3NhZ2VzSW5uZXIgcmVmPXttZXNzYWdlc1JlZn0gb25TY3JvbGw9e2hhbmRsZVNjcm9sbFRvQm90dG9tfSAkc2Nyb2xsT25QYXJlbnQ9e2ZhbHNlfT5cbiAgICAgICAgICB7bWVzc2FnZXNDb250ZW50fVxuICAgICAgICA8L1NDTWVzc2FnZXNJbm5lcj5cbiAgICAgICl9XG5cbiAgICAgIDxTQ01lc3NhZ2VzR3JhZGllbnRCb3R0b20gJHNob3c9e3Nob3dCb3R0b21HcmFkaWVudH0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cblxuICAgICAge3Nob3dTY3JvbGxUb0JvdHRvbSAmJiAoXG4gICAgICAgIDxTY3JvbGxUb0JvdHRvbUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17aGFuZGxlQ2xpY2tTY3JvbGxUb0JvdHRvbX0+XG4gICAgICAgICAgPFNDU2Nyb2xsSWNvblN3YXAgJHZpc2libGU9e2lzV3JpdGluZ30gYXJpYS1oaWRkZW4+XG4gICAgICAgICAgICA8U0NXcml0aW5nRG90cz5cbiAgICAgICAgICAgICAgPHNwYW4gLz5cbiAgICAgICAgICAgICAgPHNwYW4gLz5cbiAgICAgICAgICAgICAgPHNwYW4gLz5cbiAgICAgICAgICAgIDwvU0NXcml0aW5nRG90cz5cbiAgICAgICAgICA8L1NDU2Nyb2xsSWNvblN3YXA+XG4gICAgICAgICAgPFNDU2Nyb2xsSWNvblN3YXAgJHZpc2libGU9eyFpc1dyaXRpbmd9IGFyaWEtaGlkZGVuPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9ezEyfSBoZWlnaHQ9ezEyfSBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMyMDIwMjBcIlxuICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezEuNX1cbiAgICAgICAgICAgICAgICBkPVwiTTYgLjc1djEwLjVNLjc1IDYgNiAxMS4yNSAxMS4yNSA2XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvU0NTY3JvbGxJY29uU3dhcD5cbiAgICAgICAgPC9TY3JvbGxUb0JvdHRvbUJ1dHRvbj5cbiAgICAgICl9XG4gICAgPC9TQ01lc3NhZ2VzT3V0ZXI+XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IENoYXRBSU1lc3NhZ2VzID0gUmVhY3QubWVtbyhDaGF0QUlNZXNzYWdlc0lubmVyKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBT0EsS0FBSyxJQUFRQyxJQUFJLEVBQWFDLFdBQVcs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USxFQUFFckYsb0JBQXFCO1FBQUF2VSxRQUFBLGVBQ2pFZixJQUFBLENBQUNyQixlQUFlO1VBQUM0YixlQUFlLEVBQUV4QixnQkFBaUI7VUFBQWhZLFFBQUEsRUFBRXFZO1FBQWUsQ0FBa0I7TUFBQyxDQUN2RSxDQUFDLGdCQUVuQnBaLElBQUEsQ0FBQ3JCLGVBQWU7UUFBQzJiLEdBQUcsRUFBRXhMLFdBQVk7UUFBQzZMLFFBQVEsRUFBRXJGLG9CQUFxQjtRQUFDaUYsZUFBZSxFQUFFLEtBQU07UUFBQXhaLFFBQUEsRUFDdkZxWTtNQUFlLENBQ0QsQ0FDbEIsZUFFRHBaLElBQUEsQ0FBQ1gsd0JBQXdCO1FBQUNxYixLQUFLLEVBQUVsSyxrQkFBbUI7UUFBQyxlQUFZO01BQU0sQ0FBRSxDQUFDLEVBRXpFUixrQkFBa0IsaUJBQ2pCNVAsS0FBQSxDQUFDOUIsb0JBQW9CO1FBQUN3TCxJQUFJLEVBQUMsUUFBUTtRQUFDdEgsT0FBTyxFQUFFNlMseUJBQTBCO1FBQUF0VSxRQUFBLGdCQUNyRWYsSUFBQSxDQUFDekIsZ0JBQWdCO1VBQUNxYyxRQUFRLEVBQUV4SixTQUFVO1VBQUMsbUJBQVc7VUFBQXJRLFFBQUEsZUFDaERYLEtBQUEsQ0FBQzVCLGFBQWE7WUFBQXVDLFFBQUEsZ0JBQ1pmLElBQUEsV0FBTyxDQUFDLGVBQ1JBLElBQUEsV0FBTyxDQUFDLGVBQ1JBLElBQUEsV0FBTyxDQUFDO1VBQUEsQ0FDSztRQUFDLENBQ0EsQ0FBQyxlQUNuQkEsSUFBQSxDQUFDekIsZ0JBQWdCO1VBQUNxYyxRQUFRLEVBQUUsQ0FBQ3hKLFNBQVU7VUFBQyxtQkFBVztVQUFBclEsUUFBQSxlQUNqRGYsSUFBQTtZQUFLNmEsS0FBSyxFQUFDLDRCQUE0QjtZQUFDQyxLQUFLLEVBQUUsRUFBRztZQUFDL0csTUFBTSxFQUFFLEVBQUc7WUFBQ21GLElBQUksRUFBQyxNQUFNO1lBQUFuWSxRQUFBLGVBQ3hFZixJQUFBO2NBQ0UrYSxNQUFNLEVBQUMsU0FBUztjQUNoQkMsYUFBYSxFQUFDLE9BQU87Y0FDckJDLGNBQWMsRUFBQyxPQUFPO2NBQ3RCQyxXQUFXLEVBQUUsR0FBSTtjQUNqQkMsQ0FBQyxFQUFDO1lBQW1DLENBQ3RDO1VBQUMsQ0FDQztRQUFDLENBQ1UsQ0FBQztNQUFBLENBQ0MsQ0FDdkI7SUFBQSxDQUNjO0VBQUM7QUFFdEIsQ0FBQztBQUVELE9BQU8sSUFBTUMsY0FBYyxnQkFBR3hmLEtBQUssQ0FBQ0MsSUFBSSxDQUFDa1MsbUJBQW1CLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|