@projectcor/maia-components 2.50.1-1 → 2.51.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/README.md +2 -0
- package/lib/App.js +19 -44
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +1 -3
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +1 -3
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +14 -24
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +10 -28
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +15 -19
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +4 -8
- package/lib/components/atoms/ClientSelector/ClientSelector.js +13 -15
- package/lib/components/atoms/Fade/Fade.js +6 -10
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +2 -3
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +2 -3
- package/lib/components/atoms/MAIAInput/MAIAInput.js +99 -123
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +4 -9
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +5 -4
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +26 -28
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +14 -15
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +24 -41
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +10 -25
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +43 -78
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +11 -9
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +15 -37
- package/lib/components/index.js +1 -2
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +8 -6
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +4 -6
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +16 -25
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +72 -93
- package/lib/components/molecules/ChatAIHome/styles.js +78 -85
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +14 -30
- package/lib/components/molecules/ChatAIMessages/newStyles.js +35 -32
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +1 -8
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -25
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +367 -63
- package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -10
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +2 -5
- package/lib/components/molecules/Sidebar/Sidebar.js +23 -41
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +2 -2
- package/lib/components/organisms/ProjectSummary/ProjectSummary.js +7 -11
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +1 -4
- package/lib/constants/permissions/index.js +2 -2
- package/lib/constants/permissions/utils.js +1 -4
- package/lib/dev/DevReasoningTimeline.js +37 -68
- package/lib/dev/Providers.js +3 -5
- package/lib/hooks/useAgentModel/useUpdateAgent.js +6 -7
- package/lib/hooks/useChatManager/useChatManager.helpers.js +3 -3
- package/lib/hooks/useChatManager/useChatManager.js +7 -8
- package/lib/hooks/useEntitySearch.js +1 -3
- package/lib/hooks/useFrequentlyUsedActions.js +22 -61
- package/lib/hooks/useKnowledge/downloadKnowledge.js +4 -4
- package/lib/hooks/useKnowledge/useKnowledgeOperations.js +15 -16
- package/lib/hooks/useProjectSummaryConfig.js +5 -10
- package/lib/index.js +2 -5
- package/lib/lang/br/index.js +2 -27
- package/lib/lang/en/index.js +2 -27
- package/lib/lang/es/index.js +2 -27
- package/lib/lang/fr/index.js +2 -27
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Agents/connectors.js +1 -3
- package/lib/store/sessions/sessionStreamManager.js +55 -51
- package/lib/store/useChatsStore.js +3 -4
- package/lib/styles/cascade.js +3 -29
- package/lib/styles/transitions.js +1 -3
- package/lib/types/global.d.js +1 -1
- package/lib/utils/hoursPlannerQuickActionType.js +1 -116
- package/lib/utils/imagePreprocessor.js +3 -14
- package/lib/utils/navigateContextEntity.js +2 -2
- package/lib/utils/openTaskInCorPanel.js +2 -2
- package/lib/utils/streamActivityMessages.helpers.js +4 -5
- package/lib/utils/streamActivityMessages.js +20 -32
- package/package.json +1 -1
- package/lib/components/atoms/ActionableButton.spec.js +0 -111
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +0 -52
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +0 -11
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +0 -63
- package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -183
- package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +0 -123
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +0 -139
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +0 -385
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +0 -78
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +0 -94
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +0 -396
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +0 -80
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +0 -526
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +0 -169
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +0 -11
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +0 -77
- package/lib/components/atoms/Backdrop/Backdrop.spec.js +0 -28
- package/lib/components/atoms/CardMenu/CardMenu.spec.js +0 -56
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +0 -67
- package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
- package/lib/components/atoms/Chip/Chip.spec.js +0 -82
- package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +0 -26
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +0 -45
- package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +0 -133
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.spec.js +0 -107
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +0 -46
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +0 -109
- package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +0 -81
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +0 -92
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +0 -319
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +0 -107
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +0 -136
- package/lib/components/atoms/CopyToClipboard.spec.js +0 -74
- package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +0 -76
- package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +0 -86
- package/lib/components/atoms/Expand/Expand.spec.js +0 -57
- package/lib/components/atoms/Fade/Fade.spec.js +0 -66
- package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +0 -75
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +0 -104
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +0 -91
- package/lib/components/atoms/HelpButton.spec.js +0 -87
- package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +0 -96
- package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +0 -54
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +0 -21
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +0 -20
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +0 -26
- package/lib/components/atoms/LoadingText/LoadingText.spec.js +0 -25
- package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
- package/lib/components/atoms/MAIAError/MAIAError.spec.js +0 -27
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +0 -113
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +0 -381
- package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -719
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +0 -92
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +0 -193
- package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +0 -32
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +0 -64
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +0 -43
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +0 -114
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +0 -51
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +0 -48
- package/lib/components/atoms/ModalProject/ModalProject.spec.js +0 -66
- package/lib/components/atoms/NextPageLoader.spec.js +0 -37
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +0 -20
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +0 -35
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +0 -47
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +0 -146
- package/lib/components/atoms/PrimaryButton.spec.js +0 -42
- package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -170
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +0 -199
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +0 -70
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -120
- package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +0 -8
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +0 -31
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +0 -29
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +0 -38
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +0 -16
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +0 -24
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +0 -71
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -120
- package/lib/components/atoms/Switch/Switch.spec.js +0 -41
- package/lib/components/atoms/TextArea/CustomTextArea.spec.js +0 -52
- package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +0 -25
- package/lib/components/atoms/TextArea/TextArea.spec.js +0 -126
- package/lib/components/atoms/ThirdButton.spec.js +0 -29
- package/lib/components/atoms/VideoModal/VideoModal.spec.js +0 -68
- package/lib/components/atoms/WithAppCfg.spec.js +0 -82
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +0 -53
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -742
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +0 -107
- package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +0 -256
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +0 -175
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +0 -318
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +0 -50
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +0 -94
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
- package/lib/components/molecules/AgentInputBlock/index.js +0 -5
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
- package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +0 -66
- package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +0 -145
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +0 -204
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +0 -622
- package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -264
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +0 -86
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +0 -742
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -541
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -1394
- package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +0 -1401
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +0 -33
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +0 -116
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +0 -134
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +0 -142
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +0 -241
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.js +0 -69
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.spec.js +0 -144
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentDropdown.js +0 -95
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentSelector.js +0 -174
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.js +0 -99
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.spec.js +0 -65
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
- package/lib/components/molecules/ChatAIModal/constants.spec.js +0 -16
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +0 -22
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +0 -67
- package/lib/components/molecules/ChatAIModal/layout.spec.js +0 -72
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +0 -93
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +0 -297
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +0 -62
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -221
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +0 -66
- package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -369
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +0 -10
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +0 -104
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +0 -139
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
- package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +0 -126
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +0 -115
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +0 -79
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +0 -37
- package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +0 -119
- package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -464
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +0 -1067
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -1236
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +0 -112
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +0 -77
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -503
- package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -525
- package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -246
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -291
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -284
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -343
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -197
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -94
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -69
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
- package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
- package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
- package/lib/components/organisms/ChatAIPage/index.js +0 -3
- package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +0 -53
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +0 -49
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +0 -67
- package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +0 -117
- package/lib/components/organisms/SnackBar/Snackbar.spec.js +0 -66
- package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +0 -19
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +0 -52
- package/lib/constants/formatExtensions.spec.js +0 -15
- package/lib/constants/maiaExternalConnectorsAccess.spec.js +0 -29
- package/lib/constants/maiaFeatureAccess.spec.js +0 -30
- package/lib/constants/maiaHourAgentAccess.spec.js +0 -30
- package/lib/constants/maiaTaskPanelAccess.spec.js +0 -41
- package/lib/constants/permissions/clientRoleAccess.spec.js +0 -65
- package/lib/constants/permissions/utils.spec.js +0 -128
- package/lib/constants/plannerSyncEvents.spec.js +0 -31
- package/lib/constants/taskUrls.spec.js +0 -9
- package/lib/dev/DevMaiaPage.js +0 -30
- package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
- package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
- package/lib/hooks/useAccessClient/useAccessClient.spec.js +0 -149
- package/lib/hooks/useAgentModel/useAgentModel.spec.js +0 -83
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +0 -268
- package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -314
- package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +0 -183
- package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -374
- package/lib/hooks/useAgentSuggestions.spec.js +0 -89
- package/lib/hooks/useCaretPosition.spec.js +0 -58
- package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +0 -2027
- package/lib/hooks/useChatManager/useChatManager.spec.js +0 -2409
- package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +0 -491
- package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -729
- package/lib/hooks/useChats/useChats.spec.js +0 -208
- package/lib/hooks/useClientSearch.helpers.spec.js +0 -52
- package/lib/hooks/useClientSearch.spec.js +0 -86
- package/lib/hooks/useContextMentions.helpers.spec.js +0 -267
- package/lib/hooks/useContextMentions.spec.js +0 -338
- package/lib/hooks/useContextPinPopover.helpers.spec.js +0 -183
- package/lib/hooks/useContextPinPopover.spec.js +0 -159
- package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.spec.js +0 -257
- package/lib/hooks/useDebounce.spec.js +0 -42
- package/lib/hooks/useEntitySearch.helpers.spec.js +0 -723
- package/lib/hooks/useEntitySearch.spec.js +0 -718
- package/lib/hooks/useEvent.spec.js +0 -45
- package/lib/hooks/useFrequentlyAskedQuestions.spec.js +0 -222
- package/lib/hooks/useFrequentlyUsedActions.spec.js +0 -293
- package/lib/hooks/useIsMaiaPageRoute.js +0 -26
- package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
- package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +0 -122
- package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +0 -148
- package/lib/hooks/useKnowledge/saveKnowledge.spec.js +0 -104
- package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +0 -178
- package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
- package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
- package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
- package/lib/hooks/useMentionPopover.helpers.spec.js +0 -100
- package/lib/hooks/useMentionPopover.spec.js +0 -392
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +0 -176
- package/lib/hooks/useMinimizedPillBottomOffset.spec.js +0 -89
- package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
- package/lib/hooks/useModal/useModal.spec.js +0 -73
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +0 -138
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +0 -417
- package/lib/hooks/useProjectSearch.helpers.spec.js +0 -89
- package/lib/hooks/useProjectSearch.spec.js +0 -91
- package/lib/hooks/useProjectSummary.spec.js +0 -193
- package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +0 -151
- package/lib/hooks/useProjectSummaryConfig.spec.js +0 -133
- package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +0 -112
- package/lib/hooks/useRecentClientsSearch.helpers.spec.js +0 -33
- package/lib/hooks/useRecentClientsSearch.spec.js +0 -85
- package/lib/hooks/useRecentContexts.spec.js +0 -139
- package/lib/hooks/useResize.spec.js +0 -37
- package/lib/hooks/useSkillsCatalog.spec.js +0 -88
- package/lib/hooks/useSlashCommands.spec.js +0 -139
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +0 -101
- package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
- package/lib/hooks/useStreamResponse.spec.js +0 -199
- package/lib/hooks/useT.spec.js +0 -20
- package/lib/hooks/useToggle.spec.js +0 -33
- package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +0 -171
- package/lib/services/appcues.spec.js +0 -37
- package/lib/services/maia/Access/updateAccess.spec.js +0 -137
- package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -121
- package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -91
- package/lib/services/maia/Agents/connectors.spec.js +0 -496
- package/lib/services/maia/Agents/createAgent.spec.js +0 -55
- package/lib/services/maia/Agents/deleteAgent.spec.js +0 -57
- package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
- package/lib/services/maia/Agents/getAgentById.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentModels.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -89
- package/lib/services/maia/Agents/getAgents.helpers.spec.js +0 -325
- package/lib/services/maia/Agents/getAgents.spec.js +0 -1135
- package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
- package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -59
- package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
- package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
- package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
- package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
- package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
- package/lib/services/maia/Chats/patchChat.spec.js +0 -41
- package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
- package/lib/services/maia/Knowledge/delete.spec.js +0 -45
- package/lib/services/maia/Knowledge/download.spec.js +0 -78
- package/lib/services/maia/Knowledge/save.spec.js +0 -58
- package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +0 -225
- package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -181
- package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
- package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -103
- package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
- package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
- package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
- package/lib/services/maia/Skills/createSkill.spec.js +0 -68
- package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
- package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
- package/lib/services/maia/Skills/getSkills.spec.js +0 -152
- package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
- package/lib/services/maia/client.spec.js +0 -56
- package/lib/services/utils/fetchCOR.spec.js +0 -211
- package/lib/services/utils/getCookie.spec.js +0 -20
- package/lib/services/utils/mapChatMessages.helpers.spec.js +0 -336
- package/lib/services/utils/mapChatMessages.spec.js +0 -254
- package/lib/store/chatsSidebarOptimistic.spec.js +0 -145
- package/lib/store/maiaLastChatPersistence.spec.js +0 -22
- package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
- package/lib/store/sessions/sessionNotificationSound.spec.js +0 -145
- package/lib/store/sessions/sessionNotifications.helpers.spec.js +0 -63
- package/lib/store/sessions/sessionNotifications.spec.js +0 -106
- package/lib/store/sessions/sessionStreamManager.helpers.spec.js +0 -177
- package/lib/store/sessions/sessionStreamManager.spec.js +0 -939
- package/lib/store/sessions/sessions.types.spec.js +0 -16
- package/lib/store/sessions/useSessionsStore.spec.js +0 -135
- package/lib/store/useChatsStore.spec.js +0 -619
- package/lib/store/useFaqsStore.spec.js +0 -57
- package/lib/utils/actionCategoryMap.spec.js +0 -18
- package/lib/utils/agentDisplayName.spec.js +0 -48
- package/lib/utils/autoApproveStorage.spec.js +0 -25
- package/lib/utils/chatInputFiles.spec.js +0 -39
- package/lib/utils/contextMentionIcons.spec.js +0 -41
- package/lib/utils/contextMentionLabel.spec.js +0 -13
- package/lib/utils/contextMentionTriggers.spec.js +0 -44
- package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
- package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
- package/lib/utils/entityLinkRender.spec.js +0 -72
- package/lib/utils/fileDownloadHelper.spec.js +0 -67
- package/lib/utils/formatQuickActionMessage.spec.js +0 -27
- package/lib/utils/formatUnreadCount.spec.js +0 -12
- package/lib/utils/getUnitFileSize.spec.js +0 -18
- package/lib/utils/hitlAnalytics.spec.js +0 -136
- package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -124
- package/lib/utils/imagePreprocessor.helpers.spec.js +0 -28
- package/lib/utils/imagePreprocessor.spec.js +0 -112
- package/lib/utils/maiaPageRoute.js +0 -24
- package/lib/utils/maiaPageRoute.spec.js +0 -23
- package/lib/utils/mapBackendLang.spec.js +0 -19
- package/lib/utils/navigateContextEntity.spec.js +0 -50
- package/lib/utils/normalizeAgentConnectors.spec.js +0 -98
- package/lib/utils/openTaskInCorPanel.spec.js +0 -43
- package/lib/utils/orchestratorSubagents.spec.js +0 -32
- package/lib/utils/reasoningMappers.spec.js +0 -103
- package/lib/utils/recentContextsHomeLimit.spec.js +0 -32
- package/lib/utils/renderContextMentions.helpers.spec.js +0 -87
- package/lib/utils/renderContextMentions.spec.js +0 -268
- package/lib/utils/retryCompletion.spec.js +0 -181
- package/lib/utils/skillContentSize.spec.js +0 -13
- package/lib/utils/slashCommandMarker.spec.js +0 -43
- package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
- package/lib/utils/sseStreamContent.spec.js +0 -31
- package/lib/utils/streamActivityMessages.helpers.spec.js +0 -84
- package/lib/utils/streamActivityMessages.spec.js +0 -336
- package/lib/utils/validateTrimmedFields.spec.js +0 -26
|
@@ -1,1394 +0,0 @@
|
|
|
1
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
-
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
-
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
4
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
|
-
import { CORUserRole } from '../../../context/cor-user';
|
|
7
|
-
import { options } from './constants';
|
|
8
|
-
import { clampFloatingPanelPosition, dispatchSkillMentionInsert, ensureAgentsBeforeSkillUse, getMaiaHostPanelPresentation, hasAnyActiveSessionInMeta, isBannerFaqReadyToAutoSend, isLegacyContextEntity, resolveAiChatBackDestination, resolveComputedCurrentOption, resolveDefaultFloatingPanelPosition, resolveInitialCurrentOption, resolveLegacyContextSession, resolveSidebarAgentsNavActive, shouldRestoreExpandedPanel, shouldSkipFloatingDragTarget, validateAccessByFeature, resolveHostTakeoverEntityState, buildHostTakeoverPersistContext, buildMaiaPanelSessionPatch, resolveFloatingPanelDragPosition, resolveHostTakeoverAgentId, resolveMaiaModalI18nLang, resolveMinimizedRestoreTarget, resolveNextDragPosition, resolveUserHasAgentManagementPermissions, shouldBackClearPinnedContext, shouldBackStartNewChatPreservingContext, shouldMarkOrchestratorContextReset, shouldStartNewChatFromCatalog, resolveHasPinnedContext, resolveOrchestratorHomeNavFlags, shouldShowOrchestratorBackButton, shouldClearClientOnGoHomeFromChat, shouldResetAgentToFirstOnGoHome, shouldUseActiveChatSendHandler, buildLegacyContextMigrationPatch, findOrchestratorAgent, buildLegacyContextAgent, shouldMarkAgentAsLegacyContext, canOpenMaiaMarketplace, shouldSetChatViewHiddenOnMount, shouldPersistLastActiveChatId, hasBannerFaqTitle, shouldSyncPanelSessionOnPageHide, resolveCachedAgentsIfAvailable, shouldAttemptInitialAgentsFetch, findAgentForChatItem, shouldApplyClientOnHostTakeover, shouldSelectFirstAgentOnHostTakeover, shouldResetChatStateOnGoHome, shouldClearContextForCatalogOrSkillAgent, resolveOpenNewChatWithAgentContext, canContinueLegacyContextInNewChat, resolveSessionRestoreNavRoute, shouldSkipAgentsLoadOnSessionRestore, shouldFetchAgentDetailOnSessionRestore, shouldPassAgentToGetAgentsOnRestore, shouldSelectFetchedAgentAfterRestore, resolveSnapshotChipsProject, resolveChatModalSectionFlags, shouldRenderChatSidebar, resolveChatModalMainContentView, shouldShowChatModalFooter, shouldUseElevatedMaiaPanel, shouldReselectAgentAfterDelete, shouldClearDragPositionOnLayoutChange, shouldPersistDragPositionOnDragEnd, shouldStartFloatingPanelDrag, isActiveFloatingDragPointer, shouldOpenSkillsCatalog, shouldUseDragClampFallback, resolveLayoutDragPositionUpdate, resolvePersistedDragPositionOnEnd, buildUserInitialMessageFromStartChat, shouldResetSidebarErrorOnStartChat, shouldClearTaskOnGoHomeFromChat, shouldClearOrchestratorGlobalContextOnGoHome, shouldPrefetchAgentsForCatalogNewChat, isGlobalMaiaSection } from './ChatAIModal.helpers';
|
|
9
|
-
var baseUser = {
|
|
10
|
-
id: 1,
|
|
11
|
-
company_id: 10,
|
|
12
|
-
role_id: CORUserRole.PROJECT_MANAGER
|
|
13
|
-
};
|
|
14
|
-
var orchestratorAgent = {
|
|
15
|
-
id: '1',
|
|
16
|
-
name: 'MAIA',
|
|
17
|
-
type: 'orchestrator',
|
|
18
|
-
entity: 'global'
|
|
19
|
-
};
|
|
20
|
-
var agent = function agent(id) {
|
|
21
|
-
return {
|
|
22
|
-
id: id,
|
|
23
|
-
name: "Agent ".concat(id),
|
|
24
|
-
type: 'custom'
|
|
25
|
-
};
|
|
26
|
-
};
|
|
27
|
-
describe('ChatAIModal.helpers', function () {
|
|
28
|
-
var originalChatAccess = window.MAIA_CHAT_AI_FEATURE_ACCESS;
|
|
29
|
-
var originalMultiAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
|
|
30
|
-
var originalSkillsAccess = window.MAIA_SKILLS_ACCESS;
|
|
31
|
-
var originalProjectSummary = window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS;
|
|
32
|
-
afterEach(function () {
|
|
33
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS = originalChatAccess;
|
|
34
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = originalMultiAgents;
|
|
35
|
-
window.MAIA_SKILLS_ACCESS = originalSkillsAccess;
|
|
36
|
-
window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS = originalProjectSummary;
|
|
37
|
-
});
|
|
38
|
-
describe('resolveAiChatBackDestination', function () {
|
|
39
|
-
it('returns global home for orchestrator on header home', function () {
|
|
40
|
-
expect(resolveAiChatBackDestination('header', 'orchestrator', options.home, options.home)).toBe('global_context_home');
|
|
41
|
-
});
|
|
42
|
-
it('maps section-specific homes', function () {
|
|
43
|
-
expect(resolveAiChatBackDestination('task', 'orchestrator', options.chat, options.home)).toBe('task_home');
|
|
44
|
-
expect(resolveAiChatBackDestination('planner', 'clone', options.chat, options.home)).toBe('planner_home');
|
|
45
|
-
expect(resolveAiChatBackDestination('project', 'clone', options.chat, options.home)).toBe('project_home');
|
|
46
|
-
expect(resolveAiChatBackDestination('client', 'clone', options.chat, options.home)).toBe('client_home');
|
|
47
|
-
});
|
|
48
|
-
it('falls back to global home for unsupported combinations', function () {
|
|
49
|
-
expect(resolveAiChatBackDestination('header', 'custom', options.chat, options.chat)).toBe('global_context_home');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe('validateAccessByFeature', function () {
|
|
53
|
-
it('denies access without section or chat permission', function () {
|
|
54
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS = true;
|
|
55
|
-
expect(validateAccessByFeature(null, baseUser)).toBe(false);
|
|
56
|
-
expect(validateAccessByFeature('header', _objectSpread(_objectSpread({}, baseUser), {}, {
|
|
57
|
-
role_id: CORUserRole.CLIENT
|
|
58
|
-
}))).toBe(false);
|
|
59
|
-
});
|
|
60
|
-
it('allows task and planner when chat AI is enabled for the user', function () {
|
|
61
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS = false;
|
|
62
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
|
|
63
|
-
window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS = true;
|
|
64
|
-
expect(validateAccessByFeature('task', baseUser)).toBe(true);
|
|
65
|
-
expect(validateAccessByFeature('planner', baseUser)).toBe(true);
|
|
66
|
-
});
|
|
67
|
-
it('requires chat flags for header and project sections', function () {
|
|
68
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS = false;
|
|
69
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
|
|
70
|
-
expect(validateAccessByFeature('header', baseUser)).toBe(false);
|
|
71
|
-
expect(validateAccessByFeature('project', baseUser)).toBe(false);
|
|
72
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
|
|
73
|
-
expect(validateAccessByFeature('header', baseUser)).toBe(true);
|
|
74
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS = true;
|
|
75
|
-
window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
|
|
76
|
-
expect(validateAccessByFeature('project', baseUser)).toBe(true);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
describe('resolveComputedCurrentOption', function () {
|
|
80
|
-
it('falls back to the current option when myAgents is unavailable', function () {
|
|
81
|
-
expect(resolveComputedCurrentOption({
|
|
82
|
-
currentOption: options.myAgents,
|
|
83
|
-
agent: orchestratorAgent,
|
|
84
|
-
project: null,
|
|
85
|
-
client: null,
|
|
86
|
-
user: baseUser,
|
|
87
|
-
multiAgentsAccess: false
|
|
88
|
-
})).toBe(options.myAgents);
|
|
89
|
-
});
|
|
90
|
-
it('keeps myAgents and mySkills when feature access allows', function () {
|
|
91
|
-
window.MAIA_SKILLS_ACCESS = true;
|
|
92
|
-
expect(resolveComputedCurrentOption({
|
|
93
|
-
currentOption: options.myAgents,
|
|
94
|
-
agent: orchestratorAgent,
|
|
95
|
-
project: null,
|
|
96
|
-
client: null,
|
|
97
|
-
user: baseUser,
|
|
98
|
-
multiAgentsAccess: true
|
|
99
|
-
})).toBe(options.myAgents);
|
|
100
|
-
expect(resolveComputedCurrentOption({
|
|
101
|
-
currentOption: options.mySkills,
|
|
102
|
-
agent: orchestratorAgent,
|
|
103
|
-
project: null,
|
|
104
|
-
client: null,
|
|
105
|
-
user: baseUser,
|
|
106
|
-
multiAgentsAccess: false
|
|
107
|
-
})).toBe(options.mySkills);
|
|
108
|
-
});
|
|
109
|
-
it('redirects non-orchestrator global specialists from home to chat', function () {
|
|
110
|
-
var globalClone = {
|
|
111
|
-
id: '2',
|
|
112
|
-
name: 'Sales Bot',
|
|
113
|
-
type: 'clone',
|
|
114
|
-
entity: 'global'
|
|
115
|
-
};
|
|
116
|
-
expect(resolveComputedCurrentOption({
|
|
117
|
-
currentOption: options.home,
|
|
118
|
-
agent: globalClone,
|
|
119
|
-
project: null,
|
|
120
|
-
client: null,
|
|
121
|
-
user: baseUser,
|
|
122
|
-
multiAgentsAccess: false
|
|
123
|
-
})).toBe(options.chat);
|
|
124
|
-
});
|
|
125
|
-
it('keeps chat option when project or client context is already set', function () {
|
|
126
|
-
var projectAgent = {
|
|
127
|
-
id: '3',
|
|
128
|
-
name: 'Proj',
|
|
129
|
-
type: 'clone',
|
|
130
|
-
entity: 'project'
|
|
131
|
-
};
|
|
132
|
-
var clientAgent = {
|
|
133
|
-
id: '4',
|
|
134
|
-
name: 'Client',
|
|
135
|
-
type: 'clone',
|
|
136
|
-
entity: 'client'
|
|
137
|
-
};
|
|
138
|
-
expect(resolveComputedCurrentOption({
|
|
139
|
-
currentOption: options.home,
|
|
140
|
-
agent: projectAgent,
|
|
141
|
-
project: {
|
|
142
|
-
id: 10,
|
|
143
|
-
name: 'Alpha'
|
|
144
|
-
},
|
|
145
|
-
client: null,
|
|
146
|
-
user: baseUser,
|
|
147
|
-
multiAgentsAccess: false
|
|
148
|
-
})).toBe(options.home);
|
|
149
|
-
expect(resolveComputedCurrentOption({
|
|
150
|
-
currentOption: options.home,
|
|
151
|
-
agent: clientAgent,
|
|
152
|
-
project: null,
|
|
153
|
-
client: {
|
|
154
|
-
id: 5,
|
|
155
|
-
name: 'Beta'
|
|
156
|
-
},
|
|
157
|
-
user: baseUser,
|
|
158
|
-
multiAgentsAccess: false
|
|
159
|
-
})).toBe(options.home);
|
|
160
|
-
});
|
|
161
|
-
it('does not redirect orchestrator global clones from home', function () {
|
|
162
|
-
var orchestratorGlobal = {
|
|
163
|
-
id: '1',
|
|
164
|
-
name: 'MAIA',
|
|
165
|
-
type: 'orchestrator',
|
|
166
|
-
entity: 'global'
|
|
167
|
-
};
|
|
168
|
-
expect(resolveComputedCurrentOption({
|
|
169
|
-
currentOption: options.home,
|
|
170
|
-
agent: orchestratorGlobal,
|
|
171
|
-
project: null,
|
|
172
|
-
client: null,
|
|
173
|
-
user: baseUser,
|
|
174
|
-
multiAgentsAccess: false
|
|
175
|
-
})).toBe(options.home);
|
|
176
|
-
});
|
|
177
|
-
it('shows project and client selectors when context is missing', function () {
|
|
178
|
-
var projectAgent = {
|
|
179
|
-
id: '3',
|
|
180
|
-
name: 'Proj',
|
|
181
|
-
type: 'clone',
|
|
182
|
-
entity: 'project'
|
|
183
|
-
};
|
|
184
|
-
var clientAgent = {
|
|
185
|
-
id: '4',
|
|
186
|
-
name: 'Client',
|
|
187
|
-
type: 'clone',
|
|
188
|
-
entity: 'client'
|
|
189
|
-
};
|
|
190
|
-
expect(resolveComputedCurrentOption({
|
|
191
|
-
currentOption: options.home,
|
|
192
|
-
agent: projectAgent,
|
|
193
|
-
project: null,
|
|
194
|
-
client: null,
|
|
195
|
-
user: baseUser,
|
|
196
|
-
multiAgentsAccess: false
|
|
197
|
-
})).toBe(options.projectSelector);
|
|
198
|
-
expect(resolveComputedCurrentOption({
|
|
199
|
-
currentOption: options.home,
|
|
200
|
-
agent: clientAgent,
|
|
201
|
-
project: null,
|
|
202
|
-
client: null,
|
|
203
|
-
user: baseUser,
|
|
204
|
-
multiAgentsAccess: false
|
|
205
|
-
})).toBe(options.clientSelector);
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
describe('resolveSidebarAgentsNavActive', function () {
|
|
209
|
-
it('maps computed options and maiaker selection', function () {
|
|
210
|
-
expect(resolveSidebarAgentsNavActive(options.mySkills, false)).toBe('mySkills');
|
|
211
|
-
expect(resolveSidebarAgentsNavActive(options.myAgents, false)).toBe('myAgents');
|
|
212
|
-
expect(resolveSidebarAgentsNavActive(options.home, true)).toBe('maiaker');
|
|
213
|
-
expect(resolveSidebarAgentsNavActive(options.chat, false)).toBeNull();
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
describe('resolveInitialCurrentOption', function () {
|
|
217
|
-
it('restores saved nav and validates saved option', function () {
|
|
218
|
-
window.MAIA_SKILLS_ACCESS = true;
|
|
219
|
-
expect(resolveInitialCurrentOption('myAgents', null, baseUser)).toBe(options.myAgents);
|
|
220
|
-
expect(resolveInitialCurrentOption('mySkills', null, baseUser)).toBe(options.mySkills);
|
|
221
|
-
expect(resolveInitialCurrentOption(null, 'chat', baseUser)).toBe(options.chat);
|
|
222
|
-
expect(resolveInitialCurrentOption(null, 'invalid', baseUser)).toBe(options.home);
|
|
223
|
-
});
|
|
224
|
-
it('ignores saved mySkills when the user lacks skills access', function () {
|
|
225
|
-
window.MAIA_SKILLS_ACCESS = false;
|
|
226
|
-
expect(resolveInitialCurrentOption('mySkills', null, baseUser)).toBe(options.home);
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
describe('clampFloatingPanelPosition', function () {
|
|
230
|
-
it('keeps the panel inside the viewport with padding', function () {
|
|
231
|
-
expect(clampFloatingPanelPosition(0, 0, 400, 600, 1200, 800)).toEqual({
|
|
232
|
-
x: 16,
|
|
233
|
-
y: 16
|
|
234
|
-
});
|
|
235
|
-
expect(clampFloatingPanelPosition(2000, 2000, 400, 600, 1200, 800)).toEqual({
|
|
236
|
-
x: 784,
|
|
237
|
-
y: 184
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
describe('resolveLegacyContextSession', function () {
|
|
242
|
-
it('returns legacy clone context only on chat view', function () {
|
|
243
|
-
expect(resolveLegacyContextSession(options.chat, options.chat, {
|
|
244
|
-
agentType: 'clone',
|
|
245
|
-
agentEntity: 'project',
|
|
246
|
-
projectName: 'Alpha'
|
|
247
|
-
})).toEqual({
|
|
248
|
-
entityType: 'project',
|
|
249
|
-
contextName: 'Alpha'
|
|
250
|
-
});
|
|
251
|
-
expect(resolveLegacyContextSession(options.home, options.chat, {
|
|
252
|
-
agentType: 'clone',
|
|
253
|
-
agentEntity: 'project',
|
|
254
|
-
projectName: 'Alpha'
|
|
255
|
-
})).toBeNull();
|
|
256
|
-
});
|
|
257
|
-
it('maps task and client names and ignores invalid entities', function () {
|
|
258
|
-
expect(resolveLegacyContextSession(options.chat, options.chat, {
|
|
259
|
-
agentType: 'clone',
|
|
260
|
-
agentEntity: 'task'
|
|
261
|
-
})).toEqual({
|
|
262
|
-
entityType: 'task',
|
|
263
|
-
contextName: ''
|
|
264
|
-
});
|
|
265
|
-
expect(resolveLegacyContextSession(options.chat, options.chat, {
|
|
266
|
-
agentType: 'clone',
|
|
267
|
-
agentEntity: 'task',
|
|
268
|
-
taskName: 'Bugfix'
|
|
269
|
-
})).toEqual({
|
|
270
|
-
entityType: 'task',
|
|
271
|
-
contextName: 'Bugfix'
|
|
272
|
-
});
|
|
273
|
-
expect(resolveLegacyContextSession(options.chat, options.chat, {
|
|
274
|
-
agentType: 'clone',
|
|
275
|
-
agentEntity: 'client',
|
|
276
|
-
clientName: 'Acme'
|
|
277
|
-
})).toEqual({
|
|
278
|
-
entityType: 'client',
|
|
279
|
-
contextName: 'Acme'
|
|
280
|
-
});
|
|
281
|
-
expect(resolveLegacyContextSession(options.chat, options.chat, {
|
|
282
|
-
agentType: 'clone',
|
|
283
|
-
agentEntity: 'global',
|
|
284
|
-
projectName: 'Ignored'
|
|
285
|
-
})).toBeNull();
|
|
286
|
-
});
|
|
287
|
-
});
|
|
288
|
-
describe('hasAnyActiveSessionInMeta', function () {
|
|
289
|
-
it('detects thinking, writing and approval sessions', function () {
|
|
290
|
-
expect(hasAnyActiveSessionInMeta({
|
|
291
|
-
a: {
|
|
292
|
-
status: 'thinking'
|
|
293
|
-
},
|
|
294
|
-
b: {
|
|
295
|
-
status: 'complete'
|
|
296
|
-
}
|
|
297
|
-
})).toBe(true);
|
|
298
|
-
expect(hasAnyActiveSessionInMeta({
|
|
299
|
-
a: {
|
|
300
|
-
status: 'complete'
|
|
301
|
-
}
|
|
302
|
-
})).toBe(false);
|
|
303
|
-
});
|
|
304
|
-
});
|
|
305
|
-
describe('panel restore and floating helpers', function () {
|
|
306
|
-
it('restores expanded panels from saved session snapshots', function () {
|
|
307
|
-
expect(shouldRestoreExpandedPanel({
|
|
308
|
-
isExpanded: true
|
|
309
|
-
})).toBe(true);
|
|
310
|
-
expect(shouldRestoreExpandedPanel({
|
|
311
|
-
isExpanded: false
|
|
312
|
-
})).toBe(false);
|
|
313
|
-
expect(shouldRestoreExpandedPanel(undefined)).toBe(false);
|
|
314
|
-
});
|
|
315
|
-
it('anchors the default floating panel to the bottom-right corner', function () {
|
|
316
|
-
expect(resolveDefaultFloatingPanelPosition(1200, 480)).toEqual({
|
|
317
|
-
x: 704,
|
|
318
|
-
y: 16
|
|
319
|
-
});
|
|
320
|
-
});
|
|
321
|
-
it('skips drag on interactive targets', function () {
|
|
322
|
-
var button = document.createElement('button');
|
|
323
|
-
expect(shouldSkipFloatingDragTarget(button)).toBe(true);
|
|
324
|
-
expect(shouldSkipFloatingDragTarget(document.createElement('div'))).toBe(false);
|
|
325
|
-
});
|
|
326
|
-
});
|
|
327
|
-
describe('isBannerFaqReadyToAutoSend', function () {
|
|
328
|
-
it('blocks auto send when the FAQ is empty or already sent', function () {
|
|
329
|
-
expect(isBannerFaqReadyToAutoSend({
|
|
330
|
-
faqTitle: ' ',
|
|
331
|
-
alreadySent: false,
|
|
332
|
-
loading: false,
|
|
333
|
-
agentId: '1',
|
|
334
|
-
section: 'header'
|
|
335
|
-
})).toBe(false);
|
|
336
|
-
expect(isBannerFaqReadyToAutoSend({
|
|
337
|
-
faqTitle: 'Pregunta',
|
|
338
|
-
alreadySent: true,
|
|
339
|
-
loading: false,
|
|
340
|
-
agentId: '1',
|
|
341
|
-
section: 'header'
|
|
342
|
-
})).toBe(false);
|
|
343
|
-
});
|
|
344
|
-
it('waits for project and client context before auto sending', function () {
|
|
345
|
-
expect(isBannerFaqReadyToAutoSend({
|
|
346
|
-
faqTitle: 'Resumí el proyecto',
|
|
347
|
-
alreadySent: false,
|
|
348
|
-
loading: false,
|
|
349
|
-
agentId: '1',
|
|
350
|
-
section: 'project',
|
|
351
|
-
projectId: null
|
|
352
|
-
})).toBe(false);
|
|
353
|
-
expect(isBannerFaqReadyToAutoSend({
|
|
354
|
-
faqTitle: 'Resumí el proyecto',
|
|
355
|
-
alreadySent: false,
|
|
356
|
-
loading: false,
|
|
357
|
-
agentId: '1',
|
|
358
|
-
section: 'project',
|
|
359
|
-
projectId: 42
|
|
360
|
-
})).toBe(true);
|
|
361
|
-
});
|
|
362
|
-
it('requires client context for client sections and allows header FAQs', function () {
|
|
363
|
-
expect(isBannerFaqReadyToAutoSend({
|
|
364
|
-
faqTitle: 'Pregunta',
|
|
365
|
-
alreadySent: false,
|
|
366
|
-
loading: false,
|
|
367
|
-
agentId: '1',
|
|
368
|
-
section: 'client',
|
|
369
|
-
clientId: null
|
|
370
|
-
})).toBe(false);
|
|
371
|
-
expect(isBannerFaqReadyToAutoSend({
|
|
372
|
-
faqTitle: 'Pregunta',
|
|
373
|
-
alreadySent: false,
|
|
374
|
-
loading: false,
|
|
375
|
-
agentId: '1',
|
|
376
|
-
section: 'client',
|
|
377
|
-
clientId: 9
|
|
378
|
-
})).toBe(true);
|
|
379
|
-
expect(isBannerFaqReadyToAutoSend({
|
|
380
|
-
faqTitle: 'Pregunta',
|
|
381
|
-
alreadySent: false,
|
|
382
|
-
loading: false,
|
|
383
|
-
agentId: '1',
|
|
384
|
-
section: 'header'
|
|
385
|
-
})).toBe(true);
|
|
386
|
-
});
|
|
387
|
-
});
|
|
388
|
-
describe('isLegacyContextEntity', function () {
|
|
389
|
-
it('accepts only project, task and client entities', function () {
|
|
390
|
-
expect(isLegacyContextEntity('project')).toBe(true);
|
|
391
|
-
expect(isLegacyContextEntity('global')).toBe(false);
|
|
392
|
-
});
|
|
393
|
-
});
|
|
394
|
-
describe('getMaiaHostPanelPresentation', function () {
|
|
395
|
-
it('hides expanded panel on maia page route without showing the pill', function () {
|
|
396
|
-
expect(getMaiaHostPanelPresentation(false, true)).toEqual({
|
|
397
|
-
hidePanelContent: true,
|
|
398
|
-
showMinimizedPill: false
|
|
399
|
-
});
|
|
400
|
-
});
|
|
401
|
-
it('keeps the panel visible on other routes when expanded', function () {
|
|
402
|
-
expect(getMaiaHostPanelPresentation(false, false)).toEqual({
|
|
403
|
-
hidePanelContent: false,
|
|
404
|
-
showMinimizedPill: false
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
it('shows the pill only when minimized outside maia page', function () {
|
|
408
|
-
expect(getMaiaHostPanelPresentation(true, false)).toEqual({
|
|
409
|
-
hidePanelContent: true,
|
|
410
|
-
showMinimizedPill: true
|
|
411
|
-
});
|
|
412
|
-
expect(getMaiaHostPanelPresentation(true, true)).toEqual({
|
|
413
|
-
hidePanelContent: true,
|
|
414
|
-
showMinimizedPill: false
|
|
415
|
-
});
|
|
416
|
-
});
|
|
417
|
-
});
|
|
418
|
-
describe('ensureAgentsBeforeSkillUse', function () {
|
|
419
|
-
it('returns undefined when useFirstAgent is false', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
420
|
-
var ensureAgentsLoaded;
|
|
421
|
-
return _regeneratorRuntime.wrap(function (_context) {
|
|
422
|
-
while (1) switch (_context.prev = _context.next) {
|
|
423
|
-
case 0:
|
|
424
|
-
ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a1')]);
|
|
425
|
-
_context.next = 1;
|
|
426
|
-
return expect(ensureAgentsBeforeSkillUse({
|
|
427
|
-
useFirstAgent: false,
|
|
428
|
-
agents: [],
|
|
429
|
-
ensureAgentsLoaded: ensureAgentsLoaded
|
|
430
|
-
})).resolves.toBeUndefined();
|
|
431
|
-
case 1:
|
|
432
|
-
expect(ensureAgentsLoaded).not.toHaveBeenCalled();
|
|
433
|
-
case 2:
|
|
434
|
-
case "end":
|
|
435
|
-
return _context.stop();
|
|
436
|
-
}
|
|
437
|
-
}, _callee);
|
|
438
|
-
})));
|
|
439
|
-
it('uses the in-memory agents list when it is already populated', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
440
|
-
var ensureAgentsLoaded;
|
|
441
|
-
return _regeneratorRuntime.wrap(function (_context2) {
|
|
442
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
443
|
-
case 0:
|
|
444
|
-
ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a2')]);
|
|
445
|
-
_context2.next = 1;
|
|
446
|
-
return expect(ensureAgentsBeforeSkillUse({
|
|
447
|
-
useFirstAgent: true,
|
|
448
|
-
agents: [agent('a1')],
|
|
449
|
-
ensureAgentsLoaded: ensureAgentsLoaded
|
|
450
|
-
})).resolves.toEqual(agent('a1'));
|
|
451
|
-
case 1:
|
|
452
|
-
expect(ensureAgentsLoaded).not.toHaveBeenCalled();
|
|
453
|
-
case 2:
|
|
454
|
-
case "end":
|
|
455
|
-
return _context2.stop();
|
|
456
|
-
}
|
|
457
|
-
}, _callee2);
|
|
458
|
-
})));
|
|
459
|
-
it('loads agents when the list is empty', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
460
|
-
var ensureAgentsLoaded;
|
|
461
|
-
return _regeneratorRuntime.wrap(function (_context3) {
|
|
462
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
463
|
-
case 0:
|
|
464
|
-
ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a1'), agent('a2')]);
|
|
465
|
-
_context3.next = 1;
|
|
466
|
-
return expect(ensureAgentsBeforeSkillUse({
|
|
467
|
-
useFirstAgent: true,
|
|
468
|
-
agents: [],
|
|
469
|
-
ensureAgentsLoaded: ensureAgentsLoaded
|
|
470
|
-
})).resolves.toEqual(agent('a1'));
|
|
471
|
-
case 1:
|
|
472
|
-
expect(ensureAgentsLoaded).toHaveBeenCalledTimes(1);
|
|
473
|
-
case 2:
|
|
474
|
-
case "end":
|
|
475
|
-
return _context3.stop();
|
|
476
|
-
}
|
|
477
|
-
}, _callee3);
|
|
478
|
-
})));
|
|
479
|
-
it('returns undefined when agents cannot be loaded', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
|
|
480
|
-
var ensureAgentsLoaded;
|
|
481
|
-
return _regeneratorRuntime.wrap(function (_context4) {
|
|
482
|
-
while (1) switch (_context4.prev = _context4.next) {
|
|
483
|
-
case 0:
|
|
484
|
-
ensureAgentsLoaded = jest.fn().mockResolvedValue([]);
|
|
485
|
-
_context4.next = 1;
|
|
486
|
-
return expect(ensureAgentsBeforeSkillUse({
|
|
487
|
-
useFirstAgent: true,
|
|
488
|
-
agents: [],
|
|
489
|
-
ensureAgentsLoaded: ensureAgentsLoaded
|
|
490
|
-
})).resolves.toBeUndefined();
|
|
491
|
-
case 1:
|
|
492
|
-
case "end":
|
|
493
|
-
return _context4.stop();
|
|
494
|
-
}
|
|
495
|
-
}, _callee4);
|
|
496
|
-
})));
|
|
497
|
-
});
|
|
498
|
-
describe('host takeover context helpers', function () {
|
|
499
|
-
it('maps project/task sections to project and task entities', function () {
|
|
500
|
-
var project = {
|
|
501
|
-
id: 1,
|
|
502
|
-
name: 'Alpha'
|
|
503
|
-
};
|
|
504
|
-
var task = {
|
|
505
|
-
id: 9,
|
|
506
|
-
name: 'Bug'
|
|
507
|
-
};
|
|
508
|
-
expect(resolveHostTakeoverEntityState({
|
|
509
|
-
section: 'task',
|
|
510
|
-
project: project,
|
|
511
|
-
task: task
|
|
512
|
-
})).toMatchObject({
|
|
513
|
-
project: project,
|
|
514
|
-
task: task,
|
|
515
|
-
clearGlobalPinnedContext: false
|
|
516
|
-
});
|
|
517
|
-
expect(resolveHostTakeoverEntityState({
|
|
518
|
-
section: 'task',
|
|
519
|
-
project: project,
|
|
520
|
-
task: task
|
|
521
|
-
}).client).toBeUndefined();
|
|
522
|
-
});
|
|
523
|
-
it('clears client on header/planner takeover and sets client on client section', function () {
|
|
524
|
-
var client = {
|
|
525
|
-
id: 2,
|
|
526
|
-
name: 'Acme'
|
|
527
|
-
};
|
|
528
|
-
expect(resolveHostTakeoverEntityState({
|
|
529
|
-
section: 'header'
|
|
530
|
-
})).toMatchObject({
|
|
531
|
-
project: null,
|
|
532
|
-
client: null,
|
|
533
|
-
task: null,
|
|
534
|
-
clearGlobalPinnedContext: true
|
|
535
|
-
});
|
|
536
|
-
expect(resolveHostTakeoverEntityState({
|
|
537
|
-
section: 'client',
|
|
538
|
-
client: client
|
|
539
|
-
})).toMatchObject({
|
|
540
|
-
project: null,
|
|
541
|
-
client: client,
|
|
542
|
-
clearGlobalPinnedContext: false
|
|
543
|
-
});
|
|
544
|
-
});
|
|
545
|
-
it('builds persist host context for panel session patch', function () {
|
|
546
|
-
var project = {
|
|
547
|
-
id: 3,
|
|
548
|
-
name: 'Beta'
|
|
549
|
-
};
|
|
550
|
-
expect(buildHostTakeoverPersistContext({
|
|
551
|
-
section: 'project',
|
|
552
|
-
project: project
|
|
553
|
-
})).toEqual({
|
|
554
|
-
section: 'project',
|
|
555
|
-
project: project,
|
|
556
|
-
client: null,
|
|
557
|
-
task: null,
|
|
558
|
-
chipsProject: null
|
|
559
|
-
});
|
|
560
|
-
});
|
|
561
|
-
it('defaults missing project, client and task entities on takeover', function () {
|
|
562
|
-
expect(resolveHostTakeoverEntityState({
|
|
563
|
-
section: 'project'
|
|
564
|
-
})).toMatchObject({
|
|
565
|
-
project: null,
|
|
566
|
-
task: null
|
|
567
|
-
});
|
|
568
|
-
expect(resolveHostTakeoverEntityState({
|
|
569
|
-
section: 'client'
|
|
570
|
-
})).toMatchObject({
|
|
571
|
-
client: null
|
|
572
|
-
});
|
|
573
|
-
expect(resolveHostTakeoverEntityState({
|
|
574
|
-
section: 'task',
|
|
575
|
-
project: {
|
|
576
|
-
id: 1
|
|
577
|
-
}
|
|
578
|
-
})).toMatchObject({
|
|
579
|
-
task: null
|
|
580
|
-
});
|
|
581
|
-
expect(buildHostTakeoverPersistContext({
|
|
582
|
-
section: 'planner'
|
|
583
|
-
})).toMatchObject({
|
|
584
|
-
project: null,
|
|
585
|
-
client: null,
|
|
586
|
-
task: null
|
|
587
|
-
});
|
|
588
|
-
expect(buildHostTakeoverPersistContext({
|
|
589
|
-
section: 'client'
|
|
590
|
-
})).toMatchObject({
|
|
591
|
-
client: null
|
|
592
|
-
});
|
|
593
|
-
expect(buildHostTakeoverPersistContext({
|
|
594
|
-
section: 'client',
|
|
595
|
-
client: {
|
|
596
|
-
id: 9,
|
|
597
|
-
name: 'Client'
|
|
598
|
-
}
|
|
599
|
-
}).client).toEqual({
|
|
600
|
-
id: 9,
|
|
601
|
-
name: 'Client'
|
|
602
|
-
});
|
|
603
|
-
expect(buildHostTakeoverPersistContext({
|
|
604
|
-
section: 'task',
|
|
605
|
-
task: {
|
|
606
|
-
id: 1,
|
|
607
|
-
name: 'T'
|
|
608
|
-
}
|
|
609
|
-
}).task).toEqual({
|
|
610
|
-
id: 1,
|
|
611
|
-
name: 'T'
|
|
612
|
-
});
|
|
613
|
-
var project = {
|
|
614
|
-
id: 4,
|
|
615
|
-
name: 'P'
|
|
616
|
-
};
|
|
617
|
-
expect(buildHostTakeoverPersistContext({
|
|
618
|
-
section: 'task',
|
|
619
|
-
project: project,
|
|
620
|
-
task: {
|
|
621
|
-
id: 1,
|
|
622
|
-
name: 'T'
|
|
623
|
-
}
|
|
624
|
-
})).toMatchObject({
|
|
625
|
-
project: project,
|
|
626
|
-
task: {
|
|
627
|
-
id: 1,
|
|
628
|
-
name: 'T'
|
|
629
|
-
}
|
|
630
|
-
});
|
|
631
|
-
});
|
|
632
|
-
});
|
|
633
|
-
describe('modal navigation and session helpers', function () {
|
|
634
|
-
it('normalizes br to pt-br for modal i18n', function () {
|
|
635
|
-
expect(resolveMaiaModalI18nLang('br')).toBe('pt-br');
|
|
636
|
-
expect(resolveMaiaModalI18nLang('es')).toBe('es');
|
|
637
|
-
});
|
|
638
|
-
it('checks agent management permissions with multi-agents flag', function () {
|
|
639
|
-
expect(resolveUserHasAgentManagementPermissions({
|
|
640
|
-
ai_agents: {
|
|
641
|
-
create: true
|
|
642
|
-
}
|
|
643
|
-
}, true)).toBe(true);
|
|
644
|
-
expect(resolveUserHasAgentManagementPermissions({
|
|
645
|
-
ai_agents: {
|
|
646
|
-
edit: true
|
|
647
|
-
}
|
|
648
|
-
}, true)).toBe(true);
|
|
649
|
-
expect(resolveUserHasAgentManagementPermissions({
|
|
650
|
-
ai_agents: {
|
|
651
|
-
"delete": true
|
|
652
|
-
}
|
|
653
|
-
}, true)).toBe(true);
|
|
654
|
-
expect(resolveUserHasAgentManagementPermissions({
|
|
655
|
-
ai_agents: {
|
|
656
|
-
create: true
|
|
657
|
-
}
|
|
658
|
-
}, false)).toBe(false);
|
|
659
|
-
});
|
|
660
|
-
it('decides when to start a new chat from catalog views', function () {
|
|
661
|
-
expect(shouldStartNewChatFromCatalog(options.myAgents, false)).toBe(true);
|
|
662
|
-
expect(shouldStartNewChatFromCatalog(options.home, true)).toBe(true);
|
|
663
|
-
expect(shouldStartNewChatFromCatalog(options.home, false)).toBe(false);
|
|
664
|
-
});
|
|
665
|
-
it('handles back navigation branches', function () {
|
|
666
|
-
expect(shouldBackStartNewChatPreservingContext(options.chat, options.chat)).toBe(true);
|
|
667
|
-
expect(shouldBackClearPinnedContext(options.home, options.home, 'header', false)).toBe(true);
|
|
668
|
-
expect(shouldBackClearPinnedContext(options.home, options.home, 'project', false)).toBe(false);
|
|
669
|
-
});
|
|
670
|
-
it('marks orchestrator context reset on pinned-to-empty transition', function () {
|
|
671
|
-
expect(shouldMarkOrchestratorContextReset('project', 'orchestrator', true, false)).toBe(true);
|
|
672
|
-
expect(shouldMarkOrchestratorContextReset('header', 'orchestrator', true, false)).toBe(false);
|
|
673
|
-
});
|
|
674
|
-
it('prefers unread chats when restoring from minimized', function () {
|
|
675
|
-
var _resolveMinimizedRest, _resolveMinimizedRest2;
|
|
676
|
-
var chats = [{
|
|
677
|
-
sessionExternalId: 's1',
|
|
678
|
-
isRead: true
|
|
679
|
-
}, {
|
|
680
|
-
sessionExternalId: 's2',
|
|
681
|
-
isRead: false
|
|
682
|
-
}];
|
|
683
|
-
expect((_resolveMinimizedRest = resolveMinimizedRestoreTarget(chats, 's1')) === null || _resolveMinimizedRest === void 0 ? void 0 : _resolveMinimizedRest.sessionExternalId).toBe('s2');
|
|
684
|
-
expect((_resolveMinimizedRest2 = resolveMinimizedRestoreTarget([{
|
|
685
|
-
sessionExternalId: 's1',
|
|
686
|
-
isRead: true
|
|
687
|
-
}], 's1')) === null || _resolveMinimizedRest2 === void 0 ? void 0 : _resolveMinimizedRest2.sessionExternalId).toBe('s1');
|
|
688
|
-
expect(resolveMinimizedRestoreTarget([{
|
|
689
|
-
sessionExternalId: 's1',
|
|
690
|
-
isRead: true
|
|
691
|
-
}], undefined)).toBeUndefined();
|
|
692
|
-
});
|
|
693
|
-
it('resolves host takeover agent id', function () {
|
|
694
|
-
expect(resolveHostTakeoverAgentId(false, [agent('a1')], 'current')).toBe('current');
|
|
695
|
-
expect(resolveHostTakeoverAgentId(false, [agent('a1')], undefined)).toBeNull();
|
|
696
|
-
expect(resolveHostTakeoverAgentId(true, [agent('a1')], 'current')).toBe('a1');
|
|
697
|
-
expect(resolveHostTakeoverAgentId(true, [], 'current')).toBeNull();
|
|
698
|
-
});
|
|
699
|
-
it('builds panel session patch only when expanded', function () {
|
|
700
|
-
expect(buildMaiaPanelSessionPatch({
|
|
701
|
-
isMinimized: true,
|
|
702
|
-
currentOption: options.home,
|
|
703
|
-
agentsNavActive: null,
|
|
704
|
-
activeChatId: null,
|
|
705
|
-
agentId: null,
|
|
706
|
-
sidebarOpen: false,
|
|
707
|
-
layoutMode: 'floating',
|
|
708
|
-
dragPosition: {
|
|
709
|
-
x: 1,
|
|
710
|
-
y: 2
|
|
711
|
-
},
|
|
712
|
-
hostContext: {
|
|
713
|
-
section: 'header',
|
|
714
|
-
project: null,
|
|
715
|
-
client: null,
|
|
716
|
-
task: null,
|
|
717
|
-
chipsProject: null
|
|
718
|
-
}
|
|
719
|
-
})).toBeNull();
|
|
720
|
-
expect(buildMaiaPanelSessionPatch({
|
|
721
|
-
isMinimized: false,
|
|
722
|
-
currentOption: options.chat,
|
|
723
|
-
agentsNavActive: 'myAgents',
|
|
724
|
-
activeChatId: 'chat-1',
|
|
725
|
-
agentId: '1',
|
|
726
|
-
sidebarOpen: true,
|
|
727
|
-
layoutMode: 'sidebar',
|
|
728
|
-
dragPosition: {
|
|
729
|
-
x: 1,
|
|
730
|
-
y: 2
|
|
731
|
-
},
|
|
732
|
-
hostContext: {
|
|
733
|
-
section: 'header',
|
|
734
|
-
project: null,
|
|
735
|
-
client: null,
|
|
736
|
-
task: null,
|
|
737
|
-
chipsProject: null
|
|
738
|
-
}
|
|
739
|
-
})).toMatchObject({
|
|
740
|
-
activeChatId: 'chat-1',
|
|
741
|
-
dragPosition: null
|
|
742
|
-
});
|
|
743
|
-
expect(buildMaiaPanelSessionPatch({
|
|
744
|
-
isMinimized: false,
|
|
745
|
-
currentOption: options.chat,
|
|
746
|
-
agentsNavActive: null,
|
|
747
|
-
activeChatId: 'chat-1',
|
|
748
|
-
agentId: '1',
|
|
749
|
-
sidebarOpen: false,
|
|
750
|
-
layoutMode: 'floating',
|
|
751
|
-
dragPosition: {
|
|
752
|
-
x: 3,
|
|
753
|
-
y: 4
|
|
754
|
-
},
|
|
755
|
-
hostContext: {
|
|
756
|
-
section: 'header',
|
|
757
|
-
project: null,
|
|
758
|
-
client: null,
|
|
759
|
-
task: null,
|
|
760
|
-
chipsProject: null
|
|
761
|
-
}
|
|
762
|
-
})).toMatchObject({
|
|
763
|
-
dragPosition: {
|
|
764
|
-
x: 3,
|
|
765
|
-
y: 4
|
|
766
|
-
}
|
|
767
|
-
});
|
|
768
|
-
});
|
|
769
|
-
it('resolves floating drag position with clamp fallback', function () {
|
|
770
|
-
var clamp = function clamp(x, y) {
|
|
771
|
-
return {
|
|
772
|
-
x: x,
|
|
773
|
-
y: y
|
|
774
|
-
};
|
|
775
|
-
};
|
|
776
|
-
expect(resolveFloatingPanelDragPosition({
|
|
777
|
-
layoutMode: 'sidebar',
|
|
778
|
-
dragPosition: {
|
|
779
|
-
x: 5,
|
|
780
|
-
y: 6
|
|
781
|
-
},
|
|
782
|
-
viewportWidth: 1200,
|
|
783
|
-
panelWidth: 400,
|
|
784
|
-
clamp: clamp
|
|
785
|
-
})).toEqual({
|
|
786
|
-
x: 5,
|
|
787
|
-
y: 6
|
|
788
|
-
});
|
|
789
|
-
expect(resolveFloatingPanelDragPosition({
|
|
790
|
-
layoutMode: 'floating',
|
|
791
|
-
dragPosition: null,
|
|
792
|
-
viewportWidth: 1200,
|
|
793
|
-
panelWidth: 400,
|
|
794
|
-
clamp: clamp
|
|
795
|
-
})).toEqual({
|
|
796
|
-
x: 784,
|
|
797
|
-
y: 16
|
|
798
|
-
});
|
|
799
|
-
expect(resolveFloatingPanelDragPosition({
|
|
800
|
-
layoutMode: 'floating',
|
|
801
|
-
dragPosition: {
|
|
802
|
-
x: 40,
|
|
803
|
-
y: 50
|
|
804
|
-
},
|
|
805
|
-
viewportWidth: 1200,
|
|
806
|
-
panelWidth: 400,
|
|
807
|
-
clamp: clamp
|
|
808
|
-
})).toEqual({
|
|
809
|
-
x: 40,
|
|
810
|
-
y: 50
|
|
811
|
-
});
|
|
812
|
-
});
|
|
813
|
-
it('reuses previous drag position when unchanged', function () {
|
|
814
|
-
var prev = {
|
|
815
|
-
x: 10,
|
|
816
|
-
y: 20
|
|
817
|
-
};
|
|
818
|
-
expect(resolveNextDragPosition(prev, {
|
|
819
|
-
x: 10,
|
|
820
|
-
y: 20
|
|
821
|
-
})).toBe(prev);
|
|
822
|
-
expect(resolveNextDragPosition(prev, {
|
|
823
|
-
x: 11,
|
|
824
|
-
y: 20
|
|
825
|
-
})).toEqual({
|
|
826
|
-
x: 11,
|
|
827
|
-
y: 20
|
|
828
|
-
});
|
|
829
|
-
});
|
|
830
|
-
});
|
|
831
|
-
describe('navigation and legacy context helpers', function () {
|
|
832
|
-
it('resolves pinned context and back button visibility', function () {
|
|
833
|
-
expect(resolveHasPinnedContext({
|
|
834
|
-
taskId: 1
|
|
835
|
-
})).toBe(true);
|
|
836
|
-
expect(resolveHasPinnedContext({})).toBe(false);
|
|
837
|
-
var flags = resolveOrchestratorHomeNavFlags({
|
|
838
|
-
computedCurrentOption: options.chat,
|
|
839
|
-
homeOption: options.home,
|
|
840
|
-
chatOption: options.chat,
|
|
841
|
-
hasPinnedContext: true,
|
|
842
|
-
section: 'header',
|
|
843
|
-
didResetContextInSection: false
|
|
844
|
-
});
|
|
845
|
-
expect(flags.isChatView).toBe(true);
|
|
846
|
-
expect(shouldShowOrchestratorBackButton(_objectSpread({
|
|
847
|
-
agentType: 'orchestrator',
|
|
848
|
-
hasError: false,
|
|
849
|
-
loading: false
|
|
850
|
-
}, flags))).toBe(true);
|
|
851
|
-
var sectionResetFlags = resolveOrchestratorHomeNavFlags({
|
|
852
|
-
computedCurrentOption: options.home,
|
|
853
|
-
homeOption: options.home,
|
|
854
|
-
chatOption: options.chat,
|
|
855
|
-
hasPinnedContext: true,
|
|
856
|
-
section: 'project',
|
|
857
|
-
didResetContextInSection: true
|
|
858
|
-
});
|
|
859
|
-
expect(sectionResetFlags.isSectionResetHomeStep2).toBe(true);
|
|
860
|
-
expect(shouldShowOrchestratorBackButton(_objectSpread({
|
|
861
|
-
agentType: 'orchestrator',
|
|
862
|
-
hasError: true,
|
|
863
|
-
loading: false
|
|
864
|
-
}, sectionResetFlags))).toBe(false);
|
|
865
|
-
expect(shouldShowOrchestratorBackButton({
|
|
866
|
-
agentType: 'orchestrator',
|
|
867
|
-
hasError: false,
|
|
868
|
-
loading: true,
|
|
869
|
-
isChatView: true,
|
|
870
|
-
isHeaderHomeStep2: false,
|
|
871
|
-
isSectionResetHomeStep2: false
|
|
872
|
-
})).toBe(false);
|
|
873
|
-
expect(shouldShowOrchestratorBackButton({
|
|
874
|
-
agentType: 'orchestrator',
|
|
875
|
-
hasError: false,
|
|
876
|
-
loading: false,
|
|
877
|
-
isChatView: false,
|
|
878
|
-
isHeaderHomeStep2: false,
|
|
879
|
-
isSectionResetHomeStep2: true
|
|
880
|
-
})).toBe(true);
|
|
881
|
-
});
|
|
882
|
-
it('builds legacy migration patches for client, project and task entities', function () {
|
|
883
|
-
var _buildLegacyContextMi, _buildLegacyContextMi2, _buildLegacyContextMi3, _buildLegacyContextMi4, _buildLegacyContextMi5, _buildLegacyContextMi6, _buildLegacyContextMi7, _buildLegacyContextMi8, _buildLegacyContextMi9;
|
|
884
|
-
expect(buildLegacyContextMigrationPatch(null)).toBeNull();
|
|
885
|
-
expect(buildLegacyContextMigrationPatch({
|
|
886
|
-
agentEntity: 'client'
|
|
887
|
-
})).toBeNull();
|
|
888
|
-
expect((_buildLegacyContextMi = buildLegacyContextMigrationPatch({
|
|
889
|
-
agentEntity: 'client',
|
|
890
|
-
clientId: 3,
|
|
891
|
-
clientName: 'ACME'
|
|
892
|
-
})) === null || _buildLegacyContextMi === void 0 ? void 0 : _buildLegacyContextMi.client).toEqual({
|
|
893
|
-
id: 3,
|
|
894
|
-
name: 'ACME'
|
|
895
|
-
});
|
|
896
|
-
expect((_buildLegacyContextMi2 = buildLegacyContextMigrationPatch({
|
|
897
|
-
agentEntity: 'project',
|
|
898
|
-
projectId: 9,
|
|
899
|
-
projectName: 'P'
|
|
900
|
-
})) === null || _buildLegacyContextMi2 === void 0 || (_buildLegacyContextMi2 = _buildLegacyContextMi2.chipsProject) === null || _buildLegacyContextMi2 === void 0 ? void 0 : _buildLegacyContextMi2.projectId).toBe('9');
|
|
901
|
-
expect((_buildLegacyContextMi3 = buildLegacyContextMigrationPatch({
|
|
902
|
-
agentEntity: 'task',
|
|
903
|
-
taskId: 1,
|
|
904
|
-
taskName: 'T',
|
|
905
|
-
projectId: 2,
|
|
906
|
-
projectName: 'P',
|
|
907
|
-
clientId: 4,
|
|
908
|
-
clientName: 'C'
|
|
909
|
-
})) === null || _buildLegacyContextMi3 === void 0 ? void 0 : _buildLegacyContextMi3.task).toMatchObject({
|
|
910
|
-
id: 1,
|
|
911
|
-
name: 'T',
|
|
912
|
-
projectId: 2
|
|
913
|
-
});
|
|
914
|
-
expect((_buildLegacyContextMi4 = buildLegacyContextMigrationPatch({
|
|
915
|
-
agentEntity: 'project',
|
|
916
|
-
projectId: 9,
|
|
917
|
-
projectName: 'P',
|
|
918
|
-
clientId: 4,
|
|
919
|
-
clientName: 'C'
|
|
920
|
-
})) === null || _buildLegacyContextMi4 === void 0 ? void 0 : _buildLegacyContextMi4.project).toMatchObject({
|
|
921
|
-
clientId: 4
|
|
922
|
-
});
|
|
923
|
-
expect((_buildLegacyContextMi5 = buildLegacyContextMigrationPatch({
|
|
924
|
-
agentEntity: 'task',
|
|
925
|
-
taskId: 5,
|
|
926
|
-
taskName: 'Only task'
|
|
927
|
-
})) === null || _buildLegacyContextMi5 === void 0 ? void 0 : _buildLegacyContextMi5.task).toEqual({
|
|
928
|
-
id: 5,
|
|
929
|
-
name: 'Only task'
|
|
930
|
-
});
|
|
931
|
-
expect((_buildLegacyContextMi6 = buildLegacyContextMigrationPatch({
|
|
932
|
-
agentEntity: 'client',
|
|
933
|
-
clientId: 1
|
|
934
|
-
})) === null || _buildLegacyContextMi6 === void 0 ? void 0 : _buildLegacyContextMi6.client).toEqual({
|
|
935
|
-
id: 1,
|
|
936
|
-
name: ''
|
|
937
|
-
});
|
|
938
|
-
expect((_buildLegacyContextMi7 = buildLegacyContextMigrationPatch({
|
|
939
|
-
agentEntity: 'task',
|
|
940
|
-
taskId: 8,
|
|
941
|
-
taskName: 'T',
|
|
942
|
-
projectId: 2,
|
|
943
|
-
projectName: 'P'
|
|
944
|
-
})) === null || _buildLegacyContextMi7 === void 0 || (_buildLegacyContextMi7 = _buildLegacyContextMi7.chipsProject) === null || _buildLegacyContextMi7 === void 0 ? void 0 : _buildLegacyContextMi7.projectId).toBe('2');
|
|
945
|
-
expect((_buildLegacyContextMi8 = buildLegacyContextMigrationPatch({
|
|
946
|
-
agentEntity: 'task',
|
|
947
|
-
taskId: 6,
|
|
948
|
-
taskName: 'T',
|
|
949
|
-
clientId: 3,
|
|
950
|
-
clientName: 'C'
|
|
951
|
-
})) === null || _buildLegacyContextMi8 === void 0 ? void 0 : _buildLegacyContextMi8.client).toEqual({
|
|
952
|
-
id: 3,
|
|
953
|
-
name: 'C'
|
|
954
|
-
});
|
|
955
|
-
expect((_buildLegacyContextMi9 = buildLegacyContextMigrationPatch({
|
|
956
|
-
agentEntity: 'project',
|
|
957
|
-
projectId: 9,
|
|
958
|
-
projectName: 'P'
|
|
959
|
-
})) === null || _buildLegacyContextMi9 === void 0 ? void 0 : _buildLegacyContextMi9.project).not.toHaveProperty('clientId');
|
|
960
|
-
expect(buildLegacyContextMigrationPatch({
|
|
961
|
-
agentEntity: 'task',
|
|
962
|
-
taskId: 10,
|
|
963
|
-
taskName: 'Full task',
|
|
964
|
-
projectId: 11,
|
|
965
|
-
projectName: 'Proj',
|
|
966
|
-
clientId: 12,
|
|
967
|
-
clientName: 'Client'
|
|
968
|
-
})).toMatchObject({
|
|
969
|
-
task: {
|
|
970
|
-
id: 10,
|
|
971
|
-
name: 'Full task',
|
|
972
|
-
projectId: 11,
|
|
973
|
-
clientId: 12
|
|
974
|
-
},
|
|
975
|
-
client: {
|
|
976
|
-
id: 12,
|
|
977
|
-
name: 'Client'
|
|
978
|
-
},
|
|
979
|
-
chipsProject: {
|
|
980
|
-
projectId: '11',
|
|
981
|
-
projectName: 'Proj',
|
|
982
|
-
clientName: 'Client'
|
|
983
|
-
}
|
|
984
|
-
});
|
|
985
|
-
});
|
|
986
|
-
it('resolves floating drag clamp and layout position updates', function () {
|
|
987
|
-
expect(shouldUseDragClampFallback(null)).toBe(true);
|
|
988
|
-
var clamp = function clamp(x, y) {
|
|
989
|
-
return {
|
|
990
|
-
x: x,
|
|
991
|
-
y: y
|
|
992
|
-
};
|
|
993
|
-
};
|
|
994
|
-
expect(resolveLayoutDragPositionUpdate('floating', {
|
|
995
|
-
x: 4,
|
|
996
|
-
y: 8
|
|
997
|
-
}, clamp, {
|
|
998
|
-
innerWidth: 1000,
|
|
999
|
-
panelWidth: 400,
|
|
1000
|
-
pad: 16
|
|
1001
|
-
})).toEqual({
|
|
1002
|
-
x: 4,
|
|
1003
|
-
y: 8
|
|
1004
|
-
});
|
|
1005
|
-
expect(resolveLayoutDragPositionUpdate('floating', null, clamp, {
|
|
1006
|
-
innerWidth: 1000,
|
|
1007
|
-
panelWidth: 400,
|
|
1008
|
-
pad: 16
|
|
1009
|
-
})).toEqual({
|
|
1010
|
-
x: 584,
|
|
1011
|
-
y: 16
|
|
1012
|
-
});
|
|
1013
|
-
expect(resolveLayoutDragPositionUpdate('sidebar', null, clamp, {
|
|
1014
|
-
innerWidth: 0,
|
|
1015
|
-
panelWidth: 0,
|
|
1016
|
-
pad: 0
|
|
1017
|
-
})).toBeNull();
|
|
1018
|
-
expect(resolvePersistedDragPositionOnEnd('floating', {})).toBe(true);
|
|
1019
|
-
expect(resolvePersistedDragPositionOnEnd('sidebar', {})).toBe(false);
|
|
1020
|
-
});
|
|
1021
|
-
it('builds initial chat message payload from start chat args', function () {
|
|
1022
|
-
expect(buildUserInitialMessageFromStartChat({
|
|
1023
|
-
message: 'hola',
|
|
1024
|
-
faqId: 'f1'
|
|
1025
|
-
})).toMatchObject({
|
|
1026
|
-
message: 'hola',
|
|
1027
|
-
faqId: 'f1',
|
|
1028
|
-
attachments: []
|
|
1029
|
-
});
|
|
1030
|
-
expect(buildUserInitialMessageFromStartChat({
|
|
1031
|
-
attachments: [{
|
|
1032
|
-
id: '1'
|
|
1033
|
-
}],
|
|
1034
|
-
agentSuggestionId: 's1',
|
|
1035
|
-
mentions: [{
|
|
1036
|
-
id: 'm1'
|
|
1037
|
-
}],
|
|
1038
|
-
fuaId: 'fua',
|
|
1039
|
-
scId: 'sc',
|
|
1040
|
-
contextData: {
|
|
1041
|
-
taskId: 1
|
|
1042
|
-
}
|
|
1043
|
-
})).toMatchObject({
|
|
1044
|
-
message: '',
|
|
1045
|
-
attachments: [{
|
|
1046
|
-
id: '1'
|
|
1047
|
-
}],
|
|
1048
|
-
agentSuggestionId: 's1',
|
|
1049
|
-
mentions: [{
|
|
1050
|
-
id: 'm1'
|
|
1051
|
-
}],
|
|
1052
|
-
fuaId: 'fua',
|
|
1053
|
-
scId: 'sc',
|
|
1054
|
-
contextData: {
|
|
1055
|
-
taskId: 1
|
|
1056
|
-
}
|
|
1057
|
-
});
|
|
1058
|
-
expect(shouldResetSidebarErrorOnStartChat(true)).toBe(true);
|
|
1059
|
-
});
|
|
1060
|
-
it('supports go-home and send routing guards', function () {
|
|
1061
|
-
var _findOrchestratorAgen;
|
|
1062
|
-
expect(shouldClearClientOnGoHomeFromChat('client')).toBe(false);
|
|
1063
|
-
expect(shouldResetAgentToFirstOnGoHome({
|
|
1064
|
-
has_not_access: true
|
|
1065
|
-
}, 2)).toBe(true);
|
|
1066
|
-
expect(shouldResetAgentToFirstOnGoHome(null, 2)).toBe(true);
|
|
1067
|
-
expect(shouldResetAgentToFirstOnGoHome({
|
|
1068
|
-
is_deleted: true
|
|
1069
|
-
}, 1)).toBe(true);
|
|
1070
|
-
expect(shouldResetAgentToFirstOnGoHome({
|
|
1071
|
-
has_not_access: true
|
|
1072
|
-
}, 0)).toBe(false);
|
|
1073
|
-
expect(shouldUseActiveChatSendHandler(options.chat, options.chat, true)).toBe(true);
|
|
1074
|
-
expect(canOpenMaiaMarketplace(false)).toBe(false);
|
|
1075
|
-
expect((_findOrchestratorAgen = findOrchestratorAgent([agent('2'), orchestratorAgent])) === null || _findOrchestratorAgen === void 0 ? void 0 : _findOrchestratorAgen.type).toBe('orchestrator');
|
|
1076
|
-
expect(shouldMarkAgentAsLegacyContext({}, {
|
|
1077
|
-
id: '1'
|
|
1078
|
-
})).toBe(true);
|
|
1079
|
-
expect(shouldMarkAgentAsLegacyContext({}, {
|
|
1080
|
-
id: '1',
|
|
1081
|
-
is_legacy_context: true
|
|
1082
|
-
})).toBe(false);
|
|
1083
|
-
expect(buildLegacyContextAgent({
|
|
1084
|
-
id: '1',
|
|
1085
|
-
name: 'A',
|
|
1086
|
-
type: 'custom'
|
|
1087
|
-
}).is_legacy_context).toBe(true);
|
|
1088
|
-
});
|
|
1089
|
-
});
|
|
1090
|
-
describe('mount, banner and agents loading helpers', function () {
|
|
1091
|
-
it('controls chat visibility and last active chat persistence', function () {
|
|
1092
|
-
expect(shouldSetChatViewHiddenOnMount(false)).toBe(true);
|
|
1093
|
-
expect(shouldSetChatViewHiddenOnMount(true)).toBe(false);
|
|
1094
|
-
expect(shouldPersistLastActiveChatId('chat-1')).toBe(true);
|
|
1095
|
-
expect(shouldPersistLastActiveChatId(null)).toBe(false);
|
|
1096
|
-
expect(shouldSyncPanelSessionOnPageHide(false)).toBe(true);
|
|
1097
|
-
expect(shouldSyncPanelSessionOnPageHide(true)).toBe(false);
|
|
1098
|
-
});
|
|
1099
|
-
it('detects banner FAQ titles', function () {
|
|
1100
|
-
expect(hasBannerFaqTitle(' ')).toBe(false);
|
|
1101
|
-
expect(hasBannerFaqTitle('Pregunta')).toBe(true);
|
|
1102
|
-
});
|
|
1103
|
-
it('resolves cached agents and initial fetch attempts', function () {
|
|
1104
|
-
expect(resolveCachedAgentsIfAvailable([agent('1')])).toEqual([agent('1')]);
|
|
1105
|
-
expect(resolveCachedAgentsIfAvailable([])).toBeNull();
|
|
1106
|
-
expect(shouldAttemptInitialAgentsFetch(0, false)).toBe(true);
|
|
1107
|
-
expect(shouldAttemptInitialAgentsFetch(0, true)).toBe(false);
|
|
1108
|
-
expect(shouldAttemptInitialAgentsFetch(2, false)).toBe(false);
|
|
1109
|
-
});
|
|
1110
|
-
it('finds agents for chat items with numeric ids', function () {
|
|
1111
|
-
var _findAgentForChatItem;
|
|
1112
|
-
expect((_findAgentForChatItem = findAgentForChatItem([_objectSpread(_objectSpread({}, agent('7')), {}, {
|
|
1113
|
-
id: '7'
|
|
1114
|
-
})], 7)) === null || _findAgentForChatItem === void 0 ? void 0 : _findAgentForChatItem.id).toBe('7');
|
|
1115
|
-
expect(findAgentForChatItem([agent('1')], 99)).toBeUndefined();
|
|
1116
|
-
});
|
|
1117
|
-
});
|
|
1118
|
-
describe('host takeover and navigation guards', function () {
|
|
1119
|
-
it('applies client updates only when defined', function () {
|
|
1120
|
-
expect(shouldApplyClientOnHostTakeover(undefined)).toBe(false);
|
|
1121
|
-
expect(shouldApplyClientOnHostTakeover(null)).toBe(true);
|
|
1122
|
-
expect(shouldApplyClientOnHostTakeover({
|
|
1123
|
-
id: 1,
|
|
1124
|
-
name: 'Acme'
|
|
1125
|
-
})).toBe(true);
|
|
1126
|
-
});
|
|
1127
|
-
it('selects first agent on global host takeover', function () {
|
|
1128
|
-
expect(shouldSelectFirstAgentOnHostTakeover(true, agent('1'))).toBe(true);
|
|
1129
|
-
expect(shouldSelectFirstAgentOnHostTakeover(false, agent('1'))).toBe(false);
|
|
1130
|
-
expect(shouldSelectFirstAgentOnHostTakeover(true, undefined)).toBe(false);
|
|
1131
|
-
});
|
|
1132
|
-
it('covers go-home, catalog and skill agent guards', function () {
|
|
1133
|
-
expect(shouldResetChatStateOnGoHome(options.chat, options.chat)).toBe(true);
|
|
1134
|
-
expect(shouldResetChatStateOnGoHome(options.home, options.chat)).toBe(false);
|
|
1135
|
-
expect(shouldClearContextForCatalogOrSkillAgent(agent('1'))).toBe(true);
|
|
1136
|
-
expect(shouldClearContextForCatalogOrSkillAgent(undefined)).toBe(false);
|
|
1137
|
-
expect(shouldClearTaskOnGoHomeFromChat('task')).toBe(false);
|
|
1138
|
-
expect(shouldClearTaskOnGoHomeFromChat('header')).toBe(true);
|
|
1139
|
-
expect(shouldClearOrchestratorGlobalContextOnGoHome('header', 'orchestrator')).toBe(true);
|
|
1140
|
-
expect(shouldClearOrchestratorGlobalContextOnGoHome('project', 'orchestrator')).toBe(false);
|
|
1141
|
-
expect(shouldPrefetchAgentsForCatalogNewChat(options.myAgents, options.myAgents, options.mySkills)).toBe(true);
|
|
1142
|
-
expect(shouldPrefetchAgentsForCatalogNewChat(options.home, options.myAgents, options.mySkills)).toBe(false);
|
|
1143
|
-
});
|
|
1144
|
-
it('resolves open-new-chat-with-agent context patches', function () {
|
|
1145
|
-
expect(resolveOpenNewChatWithAgentContext({
|
|
1146
|
-
project: {
|
|
1147
|
-
id: 1,
|
|
1148
|
-
name: 'P'
|
|
1149
|
-
}
|
|
1150
|
-
})).toMatchObject({
|
|
1151
|
-
project: {
|
|
1152
|
-
id: 1,
|
|
1153
|
-
name: 'P'
|
|
1154
|
-
},
|
|
1155
|
-
shouldSetTask: false
|
|
1156
|
-
});
|
|
1157
|
-
expect(resolveOpenNewChatWithAgentContext({
|
|
1158
|
-
task: {
|
|
1159
|
-
id: 2,
|
|
1160
|
-
name: 'T'
|
|
1161
|
-
}
|
|
1162
|
-
}).shouldSetTask).toBe(true);
|
|
1163
|
-
});
|
|
1164
|
-
it('validates legacy context continuation', function () {
|
|
1165
|
-
expect(canContinueLegacyContextInNewChat({
|
|
1166
|
-
agentEntity: 'task'
|
|
1167
|
-
}, orchestratorAgent)).toBe(true);
|
|
1168
|
-
expect(canContinueLegacyContextInNewChat(null, orchestratorAgent)).toBe(false);
|
|
1169
|
-
});
|
|
1170
|
-
});
|
|
1171
|
-
describe('session restore routing', function () {
|
|
1172
|
-
it('maps snapshot nav routes', function () {
|
|
1173
|
-
expect(resolveSessionRestoreNavRoute({
|
|
1174
|
-
agentsNavActive: 'myAgents'
|
|
1175
|
-
})).toBe('myAgents');
|
|
1176
|
-
expect(resolveSessionRestoreNavRoute({
|
|
1177
|
-
agentsNavActive: 'mySkills'
|
|
1178
|
-
})).toBe('mySkills');
|
|
1179
|
-
expect(resolveSessionRestoreNavRoute({
|
|
1180
|
-
agentsNavActive: 'maiaker'
|
|
1181
|
-
})).toBe('maiaker');
|
|
1182
|
-
expect(resolveSessionRestoreNavRoute({
|
|
1183
|
-
currentOption: 'chat',
|
|
1184
|
-
activeChatId: 's-1'
|
|
1185
|
-
})).toBe('chat');
|
|
1186
|
-
expect(resolveSessionRestoreNavRoute({
|
|
1187
|
-
currentOption: 'home'
|
|
1188
|
-
})).toBe('savedOption');
|
|
1189
|
-
expect(resolveSessionRestoreNavRoute({
|
|
1190
|
-
currentOption: 'invalid'
|
|
1191
|
-
})).toBe('none');
|
|
1192
|
-
});
|
|
1193
|
-
it('controls agents load branches during restore', function () {
|
|
1194
|
-
expect(shouldSkipAgentsLoadOnSessionRestore('mySkills')).toBe(true);
|
|
1195
|
-
expect(shouldSkipAgentsLoadOnSessionRestore('myAgents')).toBe(false);
|
|
1196
|
-
expect(shouldFetchAgentDetailOnSessionRestore('a1', 'maiaker')).toBe(true);
|
|
1197
|
-
expect(shouldFetchAgentDetailOnSessionRestore('a1', 'myAgents')).toBe(false);
|
|
1198
|
-
expect(shouldPassAgentToGetAgentsOnRestore('myAgents')).toBe(false);
|
|
1199
|
-
expect(shouldPassAgentToGetAgentsOnRestore('maiaker')).toBe(true);
|
|
1200
|
-
expect(shouldSelectFetchedAgentAfterRestore(agent('1'), 'maiaker')).toBe(true);
|
|
1201
|
-
expect(shouldSelectFetchedAgentAfterRestore(agent('1'), 'myAgents')).toBe(false);
|
|
1202
|
-
});
|
|
1203
|
-
it('restores chips project from snapshot host context', function () {
|
|
1204
|
-
var _resolveSnapshotChips;
|
|
1205
|
-
expect((_resolveSnapshotChips = resolveSnapshotChipsProject({
|
|
1206
|
-
chipsProject: {
|
|
1207
|
-
projectId: '9',
|
|
1208
|
-
projectName: 'P',
|
|
1209
|
-
clientName: 'C'
|
|
1210
|
-
}
|
|
1211
|
-
})) === null || _resolveSnapshotChips === void 0 ? void 0 : _resolveSnapshotChips.projectId).toBe('9');
|
|
1212
|
-
expect(resolveSnapshotChipsProject(null)).toBeNull();
|
|
1213
|
-
});
|
|
1214
|
-
});
|
|
1215
|
-
describe('layout and modal visibility helpers', function () {
|
|
1216
|
-
it('resolves section flags and sidebar visibility', function () {
|
|
1217
|
-
expect(resolveChatModalSectionFlags(options.chat, false)).toMatchObject({
|
|
1218
|
-
showNewChat: false,
|
|
1219
|
-
isMyAgentsSection: false
|
|
1220
|
-
});
|
|
1221
|
-
expect(resolveChatModalSectionFlags(options.home, true)).toMatchObject({
|
|
1222
|
-
isMaiakerCreatorHome: true
|
|
1223
|
-
});
|
|
1224
|
-
expect(shouldRenderChatSidebar(true, false)).toBe(true);
|
|
1225
|
-
expect(shouldRenderChatSidebar(true, true)).toBe(false);
|
|
1226
|
-
});
|
|
1227
|
-
it('resolves main content view and footer visibility', function () {
|
|
1228
|
-
expect(resolveChatModalMainContentView(true, true)).toBe('error');
|
|
1229
|
-
expect(resolveChatModalMainContentView(false, true)).toBe('chat');
|
|
1230
|
-
expect(resolveChatModalMainContentView(false, false)).toBe('projectSummary');
|
|
1231
|
-
expect(shouldShowChatModalFooter({
|
|
1232
|
-
computedCurrentOption: options.chat,
|
|
1233
|
-
homeOption: options.home,
|
|
1234
|
-
chatOption: options.chat,
|
|
1235
|
-
agentsCount: 0,
|
|
1236
|
-
isMaiakerCreatorHome: false,
|
|
1237
|
-
hasError: false,
|
|
1238
|
-
loading: false,
|
|
1239
|
-
hasAccess: true
|
|
1240
|
-
})).toBe(true);
|
|
1241
|
-
expect(shouldShowChatModalFooter({
|
|
1242
|
-
computedCurrentOption: options.home,
|
|
1243
|
-
homeOption: options.home,
|
|
1244
|
-
chatOption: options.chat,
|
|
1245
|
-
agentsCount: 0,
|
|
1246
|
-
isMaiakerCreatorHome: false,
|
|
1247
|
-
hasError: false,
|
|
1248
|
-
loading: false,
|
|
1249
|
-
hasAccess: true
|
|
1250
|
-
})).toBe(false);
|
|
1251
|
-
expect(shouldShowChatModalFooter({
|
|
1252
|
-
computedCurrentOption: options.home,
|
|
1253
|
-
homeOption: options.home,
|
|
1254
|
-
chatOption: options.chat,
|
|
1255
|
-
agentsCount: 2,
|
|
1256
|
-
isMaiakerCreatorHome: false,
|
|
1257
|
-
hasError: false,
|
|
1258
|
-
loading: false,
|
|
1259
|
-
hasAccess: true
|
|
1260
|
-
})).toBe(true);
|
|
1261
|
-
});
|
|
1262
|
-
it('covers floating drag and elevated panel branches', function () {
|
|
1263
|
-
expect(shouldClearDragPositionOnLayoutChange('sidebar')).toBe(true);
|
|
1264
|
-
expect(shouldClearDragPositionOnLayoutChange('floating')).toBe(false);
|
|
1265
|
-
expect(shouldPersistDragPositionOnDragEnd('floating')).toBe(true);
|
|
1266
|
-
expect(shouldStartFloatingPanelDrag(true, 0)).toBe(true);
|
|
1267
|
-
expect(shouldStartFloatingPanelDrag(true, 1)).toBe(false);
|
|
1268
|
-
expect(isActiveFloatingDragPointer(1, 1)).toBe(true);
|
|
1269
|
-
expect(isActiveFloatingDragPointer(1, 2)).toBe(false);
|
|
1270
|
-
expect(shouldUseElevatedMaiaPanel('task')).toBe(true);
|
|
1271
|
-
expect(isGlobalMaiaSection('header')).toBe(true);
|
|
1272
|
-
});
|
|
1273
|
-
it('covers delete agent and skills catalog guards', function () {
|
|
1274
|
-
expect(shouldReselectAgentAfterDelete('a1', 'a1')).toBe(true);
|
|
1275
|
-
expect(shouldReselectAgentAfterDelete('a1', 'a2')).toBe(false);
|
|
1276
|
-
expect(shouldOpenSkillsCatalog(true)).toBe(true);
|
|
1277
|
-
expect(shouldOpenSkillsCatalog(false)).toBe(false);
|
|
1278
|
-
});
|
|
1279
|
-
it('hides the footer on maiaker home, errors, loading or missing access', function () {
|
|
1280
|
-
var base = {
|
|
1281
|
-
computedCurrentOption: options.chat,
|
|
1282
|
-
homeOption: options.home,
|
|
1283
|
-
chatOption: options.chat,
|
|
1284
|
-
agentsCount: 0,
|
|
1285
|
-
isMaiakerCreatorHome: false,
|
|
1286
|
-
hasError: false,
|
|
1287
|
-
loading: false,
|
|
1288
|
-
hasAccess: true
|
|
1289
|
-
};
|
|
1290
|
-
expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
|
|
1291
|
-
isMaiakerCreatorHome: true
|
|
1292
|
-
}))).toBe(false);
|
|
1293
|
-
expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
|
|
1294
|
-
hasError: true
|
|
1295
|
-
}))).toBe(false);
|
|
1296
|
-
expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
|
|
1297
|
-
loading: true
|
|
1298
|
-
}))).toBe(false);
|
|
1299
|
-
expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
|
|
1300
|
-
hasAccess: false
|
|
1301
|
-
}))).toBe(false);
|
|
1302
|
-
});
|
|
1303
|
-
it('builds start-chat payloads and drag position updates', function () {
|
|
1304
|
-
expect(buildUserInitialMessageFromStartChat({
|
|
1305
|
-
message: 'Hola',
|
|
1306
|
-
attachments: [{
|
|
1307
|
-
id: '1'
|
|
1308
|
-
}],
|
|
1309
|
-
faqId: 'faq-1',
|
|
1310
|
-
agentSuggestionId: 'sug-1',
|
|
1311
|
-
mentions: [{
|
|
1312
|
-
id: 'm1'
|
|
1313
|
-
}],
|
|
1314
|
-
fuaId: 'fua-1',
|
|
1315
|
-
scId: 'sc-1',
|
|
1316
|
-
contextData: {
|
|
1317
|
-
projectId: 1
|
|
1318
|
-
}
|
|
1319
|
-
})).toMatchObject({
|
|
1320
|
-
message: 'Hola',
|
|
1321
|
-
faqId: 'faq-1',
|
|
1322
|
-
agentSuggestionId: 'sug-1',
|
|
1323
|
-
mentions: [{
|
|
1324
|
-
id: 'm1'
|
|
1325
|
-
}],
|
|
1326
|
-
fuaId: 'fua-1',
|
|
1327
|
-
scId: 'sc-1',
|
|
1328
|
-
contextData: {
|
|
1329
|
-
projectId: 1
|
|
1330
|
-
}
|
|
1331
|
-
});
|
|
1332
|
-
expect(resolveLayoutDragPositionUpdate('sidebar', {
|
|
1333
|
-
x: 1,
|
|
1334
|
-
y: 2
|
|
1335
|
-
}, function (x, y) {
|
|
1336
|
-
return {
|
|
1337
|
-
x: x,
|
|
1338
|
-
y: y
|
|
1339
|
-
};
|
|
1340
|
-
}, {
|
|
1341
|
-
innerWidth: 1000,
|
|
1342
|
-
panelWidth: 400,
|
|
1343
|
-
pad: 16
|
|
1344
|
-
})).toBeNull();
|
|
1345
|
-
expect(resolveLayoutDragPositionUpdate('floating', null, function (x, y) {
|
|
1346
|
-
return {
|
|
1347
|
-
x: x,
|
|
1348
|
-
y: y
|
|
1349
|
-
};
|
|
1350
|
-
}, {
|
|
1351
|
-
innerWidth: 1000,
|
|
1352
|
-
panelWidth: 400,
|
|
1353
|
-
pad: 16
|
|
1354
|
-
})).toEqual({
|
|
1355
|
-
x: 584,
|
|
1356
|
-
y: 16
|
|
1357
|
-
});
|
|
1358
|
-
expect(resolvePersistedDragPositionOnEnd('floating', document.createElement('div'))).toBe(true);
|
|
1359
|
-
expect(resolvePersistedDragPositionOnEnd('sidebar', document.createElement('div'))).toBe(false);
|
|
1360
|
-
});
|
|
1361
|
-
});
|
|
1362
|
-
describe('dispatchSkillMentionInsert', function () {
|
|
1363
|
-
it('dispatches the skill mention after two animation frames', function () {
|
|
1364
|
-
jest.useFakeTimers();
|
|
1365
|
-
var raf = jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (callback) {
|
|
1366
|
-
return window.setTimeout(function () {
|
|
1367
|
-
return callback(0);
|
|
1368
|
-
}, 0);
|
|
1369
|
-
});
|
|
1370
|
-
var onInsert = jest.fn();
|
|
1371
|
-
var onRefocus = jest.fn();
|
|
1372
|
-
document.addEventListener('maia-insert-skill-mention', onInsert);
|
|
1373
|
-
document.addEventListener('maia-input-refocus', onRefocus);
|
|
1374
|
-
dispatchSkillMentionInsert({
|
|
1375
|
-
id: 'sk1',
|
|
1376
|
-
name: 'Resumir'
|
|
1377
|
-
});
|
|
1378
|
-
expect(onInsert).not.toHaveBeenCalled();
|
|
1379
|
-
jest.runAllTimers();
|
|
1380
|
-
expect(onInsert).toHaveBeenCalledTimes(1);
|
|
1381
|
-
expect(onRefocus).toHaveBeenCalledTimes(1);
|
|
1382
|
-
var event = onInsert.mock.calls[0][0];
|
|
1383
|
-
expect(event.detail.skill).toEqual({
|
|
1384
|
-
id: 'sk1',
|
|
1385
|
-
name: 'Resumir'
|
|
1386
|
-
});
|
|
1387
|
-
document.removeEventListener('maia-insert-skill-mention', onInsert);
|
|
1388
|
-
document.removeEventListener('maia-input-refocus', onRefocus);
|
|
1389
|
-
raf.mockRestore();
|
|
1390
|
-
jest.useRealTimers();
|
|
1391
|
-
});
|
|
1392
|
-
});
|
|
1393
|
-
});
|
|
1394
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT1JVc2VyUm9sZSIsIm9wdGlvbnMiLCJjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbiIsImRpc3BhdGNoU2tpbGxNZW50aW9uSW5zZXJ0IiwiZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2UiLCJnZXRNYWlhSG9zdFBhbmVsUHJlc2VudGF0aW9uIiwiaGFzQW55QWN0aXZlU2Vzc2lvbkluTWV0YSIsImlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kIiwiaXNMZWdhY3lDb250ZXh0RW50aXR5IiwicmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbiIsInJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24iLCJyZXNvbHZlRGVmYXVsdEZsb2F0aW5nUGFuZWxQb3NpdGlvbiIsInJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbiIsInJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbiIsInJlc29sdmVTaWRlYmFyQWdlbnRzTmF2QWN0aXZlIiwic2hvdWxkUmVzdG9yZUV4cGFuZGVkUGFuZWwiLCJzaG91bGRTa2lwRmxvYXRpbmdEcmFnVGFyZ2V0IiwidmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUiLCJyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUiLCJidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0IiwiYnVpbGRNYWlhUGFuZWxTZXNzaW9uUGF0Y2giLCJyZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbiIsInJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkIiwicmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nIiwicmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQiLCJyZXNvbHZlTmV4dERyYWdQb3NpdGlvbiIsInJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMiLCJzaG91bGRCYWNrQ2xlYXJQaW5uZWRDb250ZXh0Iiwic2hvdWxkQmFja1N0YXJ0TmV3Q2hhdFByZXNlcnZpbmdDb250ZXh0Iiwic2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCIsInNob3VsZFN0YXJ0TmV3Q2hhdEZyb21DYXRhbG9nIiwicmVzb2x2ZUhhc1Bpbm5lZENvbnRleHQiLCJyZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzIiwic2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24iLCJzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQiLCJzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lIiwic2hvdWxkVXNlQWN0aXZlQ2hhdFNlbmRIYW5kbGVyIiwiYnVpbGRMZWdhY3lDb250ZXh0TWlncmF0aW9uUGF0Y2giLCJmaW5kT3JjaGVzdHJhdG9yQWdlbnQiLCJidWlsZExlZ2FjeUNvbnRleHRBZ2VudCIsInNob3VsZE1hcmtBZ2VudEFzTGVnYWN5Q29udGV4dCIsImNhbk9wZW5NYWlhTWFya2V0cGxhY2UiLCJzaG91bGRTZXRDaGF0Vmlld0hpZGRlbk9uTW91bnQiLCJzaG91bGRQZXJzaXN0TGFzdEFjdGl2ZUNoYXRJZCIsImhhc0Jhbm5lckZhcVRpdGxlIiwic2hvdWxkU3luY1BhbmVsU2Vzc2lvbk9uUGFnZUhpZGUiLCJyZXNvbHZlQ2FjaGVkQWdlbnRzSWZBdmFpbGFibGUiLCJzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoIiwiZmluZEFnZW50Rm9yQ2hhdEl0ZW0iLCJzaG91bGRBcHBseUNsaWVudE9uSG9zdFRha2VvdmVyIiwic2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyIiwic2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZSIsInNob3VsZENsZWFyQ29udGV4dEZvckNhdGFsb2dPclNraWxsQWdlbnQiLCJyZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0IiwiY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0IiwicmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUiLCJzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUiLCJzaG91bGRGZXRjaEFnZW50RGV0YWlsT25TZXNzaW9uUmVzdG9yZSIsInNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlIiwic2hvdWxkU2VsZWN0RmV0Y2hlZEFnZW50QWZ0ZXJSZXN0b3JlIiwicmVzb2x2ZVNuYXBzaG90Q2hpcHNQcm9qZWN0IiwicmVzb2x2ZUNoYXRNb2RhbFNlY3Rpb25GbGFncyIsInNob3VsZFJlbmRlckNoYXRTaWRlYmFyIiwicmVzb2x2ZUNoYXRNb2RhbE1haW5Db250ZW50VmlldyIsInNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIiLCJzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCIsInNob3VsZFJlc2VsZWN0QWdlbnRBZnRlckRlbGV0ZSIsInNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UiLCJzaG91bGRQZXJzaXN0RHJhZ1Bvc2l0aW9uT25EcmFnRW5kIiwic2hvdWxkU3RhcnRGbG9hdGluZ1BhbmVsRHJhZyIsImlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlciIsInNob3VsZE9wZW5Ta2lsbHNDYXRhbG9nIiwic2hvdWxkVXNlRHJhZ0NsYW1wRmFsbGJhY2siLCJyZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlIiwicmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kIiwiYnVpbGRVc2VySW5pdGlhbE1lc3NhZ2VGcm9tU3RhcnRDaGF0Iiwic2hvdWxkUmVzZXRTaWRlYmFyRXJyb3JPblN0YXJ0Q2hhdCIsInNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQiLCJzaG91bGRDbGVhck9yY2hlc3RyYXRvckdsb2JhbENvbnRleHRPbkdvSG9tZSIsInNob3VsZFByZWZldGNoQWdlbnRzRm9yQ2F0YWxvZ05ld0NoYXQiLCJpc0dsb2JhbE1haWFTZWN0aW9uIiwiYmFzZVVzZXIiLCJpZCIsImNvbXBhbnlfaWQiLCJyb2xlX2lkIiwiUFJPSkVDVF9NQU5BR0VSIiwib3JjaGVzdHJhdG9yQWdlbnQiLCJuYW1lIiwidHlwZSIsImVudGl0eSIsImFnZW50IiwiY29uY2F0IiwiZGVzY3JpYmUiLCJvcmlnaW5hbENoYXRBY2Nlc3MiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJvcmlnaW5hbE11bHRpQWdlbnRzIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIm9yaWdpbmFsU2tpbGxzQWNjZXNzIiwiTUFJQV9TS0lMTFNfQUNDRVNTIiwib3JpZ2luYWxQcm9qZWN0U3VtbWFyeSIsIk1BSUFfUFJPSkVDVF9TVU1NQVJZX0ZFQVRVUkVfQUNDRVNTIiwiYWZ0ZXJFYWNoIiwiaXQiLCJleHBlY3QiLCJob21lIiwidG9CZSIsImNoYXQiLCJfb2JqZWN0U3ByZWFkIiwiQ0xJRU5UIiwiY3VycmVudE9wdGlvbiIsIm15QWdlbnRzIiwicHJvamVjdCIsImNsaWVudCIsInVzZXIiLCJtdWx0aUFnZW50c0FjY2VzcyIsIm15U2tpbGxzIiwiZ2xvYmFsQ2xvbmUiLCJwcm9qZWN0QWdlbnQiLCJjbGllbnRBZ2VudCIsIm9yY2hlc3RyYXRvckdsb2JhbCIsInByb2plY3RTZWxlY3RvciIsImNsaWVudFNlbGVjdG9yIiwidG9CZU51bGwiLCJ0b0VxdWFsIiwieCIsInkiLCJhZ2VudFR5cGUiLCJhZ2VudEVudGl0eSIsInByb2plY3ROYW1lIiwiZW50aXR5VHlwZSIsImNvbnRleHROYW1lIiwidGFza05hbWUiLCJjbGllbnROYW1lIiwiYSIsInN0YXR1cyIsImIiLCJpc0V4cGFuZGVkIiwidW5kZWZpbmVkIiwiYnV0dG9uIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZmFxVGl0bGUiLCJhbHJlYWR5U2VudCIsImxvYWRpbmciLCJhZ2VudElkIiwic2VjdGlvbiIsInByb2plY3RJZCIsImNsaWVudElkIiwiaGlkZVBhbmVsQ29udGVudCIsInNob3dNaW5pbWl6ZWRQaWxsIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJlbnN1cmVBZ2VudHNMb2FkZWQiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImplc3QiLCJmbiIsIm1vY2tSZXNvbHZlZFZhbHVlIiwidXNlRmlyc3RBZ2VudCIsImFnZW50cyIsInJlc29sdmVzIiwidG9CZVVuZGVmaW5lZCIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJzdG9wIiwiX2NhbGxlZTIiLCJfY29udGV4dDIiLCJfY2FsbGVlMyIsIl9jb250ZXh0MyIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIl9jYWxsZWU0IiwiX2NvbnRleHQ0IiwidGFzayIsInRvTWF0Y2hPYmplY3QiLCJjbGVhckdsb2JhbFBpbm5lZENvbnRleHQiLCJjaGlwc1Byb2plY3QiLCJhaV9hZ2VudHMiLCJjcmVhdGUiLCJlZGl0IiwiX3Jlc29sdmVNaW5pbWl6ZWRSZXN0IiwiX3Jlc29sdmVNaW5pbWl6ZWRSZXN0MiIsImNoYXRzIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJpc1JlYWQiLCJpc01pbmltaXplZCIsImFnZW50c05hdkFjdGl2ZSIsImFjdGl2ZUNoYXRJZCIsInNpZGViYXJPcGVuIiwibGF5b3V0TW9kZSIsImRyYWdQb3NpdGlvbiIsImhvc3RDb250ZXh0IiwiY2xhbXAiLCJ2aWV3cG9ydFdpZHRoIiwicGFuZWxXaWR0aCIsInRhc2tJZCIsImZsYWdzIiwiY29tcHV0ZWRDdXJyZW50T3B0aW9uIiwiaG9tZU9wdGlvbiIsImNoYXRPcHRpb24iLCJoYXNQaW5uZWRDb250ZXh0IiwiZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uIiwiaXNDaGF0VmlldyIsImhhc0Vycm9yIiwic2VjdGlvblJlc2V0RmxhZ3MiLCJpc1NlY3Rpb25SZXNldEhvbWVTdGVwMiIsImlzSGVhZGVySG9tZVN0ZXAyIiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pIiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pMiIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTMiLCJfYnVpbGRMZWdhY3lDb250ZXh0TWk0IiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pNSIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTYiLCJfYnVpbGRMZWdhY3lDb250ZXh0TWk3IiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pOCIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTkiLCJ0b0hhdmVQcm9wZXJ0eSIsImlubmVyV2lkdGgiLCJwYWQiLCJtZXNzYWdlIiwiZmFxSWQiLCJhdHRhY2htZW50cyIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJjb250ZXh0RGF0YSIsIl9maW5kT3JjaGVzdHJhdG9yQWdlbiIsImhhc19ub3RfYWNjZXNzIiwiaXNfZGVsZXRlZCIsImlzX2xlZ2FjeV9jb250ZXh0IiwiX2ZpbmRBZ2VudEZvckNoYXRJdGVtIiwic2hvdWxkU2V0VGFzayIsIl9yZXNvbHZlU25hcHNob3RDaGlwcyIsInNob3dOZXdDaGF0IiwiaXNNeUFnZW50c1NlY3Rpb24iLCJpc01haWFrZXJDcmVhdG9ySG9tZSIsImFnZW50c0NvdW50IiwiaGFzQWNjZXNzIiwiYmFzZSIsInVzZUZha2VUaW1lcnMiLCJyYWYiLCJzcHlPbiIsIm1vY2tJbXBsZW1lbnRhdGlvbiIsImNhbGxiYWNrIiwic2V0VGltZW91dCIsIm9uSW5zZXJ0Iiwib25SZWZvY3VzIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJ1bkFsbFRpbWVycyIsImV2ZW50IiwibW9jayIsImNhbGxzIiwiZGV0YWlsIiwic2tpbGwiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibW9ja1Jlc3RvcmUiLCJ1c2VSZWFsVGltZXJzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRBSU1vZGFsL0NoYXRBSU1vZGFsLmhlbHBlcnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT1JVc2VyUm9sZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQge1xuICBjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbixcbiAgZGlzcGF0Y2hTa2lsbE1lbnRpb25JbnNlcnQsXG4gIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlLFxuICBnZXRNYWlhSG9zdFBhbmVsUHJlc2VudGF0aW9uLFxuICBoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhLFxuICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCxcbiAgaXNMZWdhY3lDb250ZXh0RW50aXR5LFxuICByZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uLFxuICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uLFxuICByZXNvbHZlRGVmYXVsdEZsb2F0aW5nUGFuZWxQb3NpdGlvbixcbiAgcmVzb2x2ZUluaXRpYWxDdXJyZW50T3B0aW9uLFxuICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24sXG4gIHJlc29sdmVTaWRlYmFyQWdlbnRzTmF2QWN0aXZlLFxuICBzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCxcbiAgc2hvdWxkU2tpcEZsb2F0aW5nRHJhZ1RhcmdldCxcbiAgdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUsXG4gIHJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZSxcbiAgYnVpbGRIb3N0VGFrZW92ZXJQZXJzaXN0Q29udGV4dCxcbiAgYnVpbGRNYWlhUGFuZWxTZXNzaW9uUGF0Y2gsXG4gIHJlc29sdmVGbG9hdGluZ1BhbmVsRHJhZ1Bvc2l0aW9uLFxuICByZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZCxcbiAgcmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nLFxuICByZXNvbHZlTWluaW1pemVkUmVzdG9yZVRhcmdldCxcbiAgcmVzb2x2ZU5leHREcmFnUG9zaXRpb24sXG4gIHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMsXG4gIHNob3VsZEJhY2tDbGVhclBpbm5lZENvbnRleHQsXG4gIHNob3VsZEJhY2tTdGFydE5ld0NoYXRQcmVzZXJ2aW5nQ29udGV4dCxcbiAgc2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCxcbiAgc2hvdWxkU3RhcnROZXdDaGF0RnJvbUNhdGFsb2csXG4gIHJlc29sdmVIYXNQaW5uZWRDb250ZXh0LFxuICByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzLFxuICBzaG91bGRTaG93T3JjaGVzdHJhdG9yQmFja0J1dHRvbixcbiAgc2hvdWxkQ2xlYXJDbGllbnRPbkdvSG9tZUZyb21DaGF0LFxuICBzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lLFxuICBzaG91bGRVc2VBY3RpdmVDaGF0U2VuZEhhbmRsZXIsXG4gIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoLFxuICBmaW5kT3JjaGVzdHJhdG9yQWdlbnQsXG4gIGJ1aWxkTGVnYWN5Q29udGV4dEFnZW50LFxuICBzaG91bGRNYXJrQWdlbnRBc0xlZ2FjeUNvbnRleHQsXG4gIGNhbk9wZW5NYWlhTWFya2V0cGxhY2UsXG4gIHNob3VsZFNldENoYXRWaWV3SGlkZGVuT25Nb3VudCxcbiAgc2hvdWxkUGVyc2lzdExhc3RBY3RpdmVDaGF0SWQsXG4gIGhhc0Jhbm5lckZhcVRpdGxlLFxuICBzaG91bGRTeW5jUGFuZWxTZXNzaW9uT25QYWdlSGlkZSxcbiAgcmVzb2x2ZUNhY2hlZEFnZW50c0lmQXZhaWxhYmxlLFxuICBzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoLFxuICBmaW5kQWdlbnRGb3JDaGF0SXRlbSxcbiAgc2hvdWxkQXBwbHlDbGllbnRPbkhvc3RUYWtlb3ZlcixcbiAgc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyLFxuICBzaG91bGRSZXNldENoYXRTdGF0ZU9uR29Ib21lLFxuICBzaG91bGRDbGVhckNvbnRleHRGb3JDYXRhbG9nT3JTa2lsbEFnZW50LFxuICByZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0LFxuICBjYW5Db250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQsXG4gIHJlc29sdmVTZXNzaW9uUmVzdG9yZU5hdlJvdXRlLFxuICBzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUsXG4gIHNob3VsZEZldGNoQWdlbnREZXRhaWxPblNlc3Npb25SZXN0b3JlLFxuICBzaG91bGRQYXNzQWdlbnRUb0dldEFnZW50c09uUmVzdG9yZSxcbiAgc2hvdWxkU2VsZWN0RmV0Y2hlZEFnZW50QWZ0ZXJSZXN0b3JlLFxuICByZXNvbHZlU25hcHNob3RDaGlwc1Byb2plY3QsXG4gIHJlc29sdmVDaGF0TW9kYWxTZWN0aW9uRmxhZ3MsXG4gIHNob3VsZFJlbmRlckNoYXRTaWRlYmFyLFxuICByZXNvbHZlQ2hhdE1vZGFsTWFpbkNvbnRlbnRWaWV3LFxuICBzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyLFxuICBzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCxcbiAgc2hvdWxkUmVzZWxlY3RBZ2VudEFmdGVyRGVsZXRlLFxuICBzaG91bGRDbGVhckRyYWdQb3NpdGlvbk9uTGF5b3V0Q2hhbmdlLFxuICBzaG91bGRQZXJzaXN0RHJhZ1Bvc2l0aW9uT25EcmFnRW5kLFxuICBzaG91bGRTdGFydEZsb2F0aW5nUGFuZWxEcmFnLFxuICBpc0FjdGl2ZUZsb2F0aW5nRHJhZ1BvaW50ZXIsXG4gIHNob3VsZE9wZW5Ta2lsbHNDYXRhbG9nLFxuICBzaG91bGRVc2VEcmFnQ2xhbXBGYWxsYmFjayxcbiAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSxcbiAgcmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kLFxuICBidWlsZFVzZXJJbml0aWFsTWVzc2FnZUZyb21TdGFydENoYXQsXG4gIHNob3VsZFJlc2V0U2lkZWJhckVycm9yT25TdGFydENoYXQsXG4gIHNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQsXG4gIHNob3VsZENsZWFyT3JjaGVzdHJhdG9yR2xvYmFsQ29udGV4dE9uR29Ib21lLFxuICBzaG91bGRQcmVmZXRjaEFnZW50c0ZvckNhdGFsb2dOZXdDaGF0LFxuICBpc0dsb2JhbE1haWFTZWN0aW9uLFxufSBmcm9tICcuL0NoYXRBSU1vZGFsLmhlbHBlcnMnXG5cbmNvbnN0IGJhc2VVc2VyID0ge1xuICBpZDogMSxcbiAgY29tcGFueV9pZDogMTAsXG4gIHJvbGVfaWQ6IENPUlVzZXJSb2xlLlBST0pFQ1RfTUFOQUdFUixcbn1cblxuY29uc3Qgb3JjaGVzdHJhdG9yQWdlbnQ6IEFnZW50ID0ge1xuICBpZDogJzEnLFxuICBuYW1lOiAnTUFJQScsXG4gIHR5cGU6ICdvcmNoZXN0cmF0b3InLFxuICBlbnRpdHk6ICdnbG9iYWwnLFxufVxuXG5jb25zdCBhZ2VudCA9IChpZDogc3RyaW5nKTogQWdlbnQgPT5cbiAgKHtcbiAgICBpZCxcbiAgICBuYW1lOiBgQWdlbnQgJHtpZH1gLFxuICAgIHR5cGU6ICdjdXN0b20nLFxuICB9KSBhcyBBZ2VudFxuXG5kZXNjcmliZSgnQ2hhdEFJTW9kYWwuaGVscGVycycsICgpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxDaGF0QWNjZXNzID0gd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU1xuICBjb25zdCBvcmlnaW5hbE11bHRpQWdlbnRzID0gd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcbiAgY29uc3Qgb3JpZ2luYWxTa2lsbHNBY2Nlc3MgPSB3aW5kb3cuTUFJQV9TS0lMTFNfQUNDRVNTXG4gIGNvbnN0IG9yaWdpbmFsUHJvamVjdFN1bW1hcnkgPSB3aW5kb3cuTUFJQV9QUk9KRUNUX1NVTU1BUllfRkVBVFVSRV9BQ0NFU1NcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSBvcmlnaW5hbENoYXRBY2Nlc3NcbiAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IG9yaWdpbmFsTXVsdGlBZ2VudHNcbiAgICB3aW5kb3cuTUFJQV9TS0lMTFNfQUNDRVNTID0gb3JpZ2luYWxTa2lsbHNBY2Nlc3NcbiAgICB3aW5kb3cuTUFJQV9QUk9KRUNUX1NVTU1BUllfRkVBVFVSRV9BQ0NFU1MgPSBvcmlnaW5hbFByb2plY3RTdW1tYXJ5XG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgZ2xvYmFsIGhvbWUgZm9yIG9yY2hlc3RyYXRvciBvbiBoZWFkZXIgaG9tZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJywgb3B0aW9ucy5ob21lLCBvcHRpb25zLmhvbWUpKS50b0JlKFxuICAgICAgICAnZ2xvYmFsX2NvbnRleHRfaG9tZSdcbiAgICAgIClcbiAgICB9KVxuXG4gICAgaXQoJ21hcHMgc2VjdGlvbi1zcGVjaWZpYyBob21lcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCd0YXNrJywgJ29yY2hlc3RyYXRvcicsIG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5ob21lKSkudG9CZSgndGFza19ob21lJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCdwbGFubmVyJywgJ2Nsb25lJywgb3B0aW9ucy5jaGF0LCBvcHRpb25zLmhvbWUpKS50b0JlKCdwbGFubmVyX2hvbWUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24oJ3Byb2plY3QnLCAnY2xvbmUnLCBvcHRpb25zLmNoYXQsIG9wdGlvbnMuaG9tZSkpLnRvQmUoJ3Byb2plY3RfaG9tZScpXG4gICAgICBleHBlY3QocmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbignY2xpZW50JywgJ2Nsb25lJywgb3B0aW9ucy5jaGF0LCBvcHRpb25zLmhvbWUpKS50b0JlKCdjbGllbnRfaG9tZScpXG4gICAgfSlcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIGdsb2JhbCBob21lIGZvciB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbignaGVhZGVyJywgJ2N1c3RvbScsIG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0KSkudG9CZSgnZ2xvYmFsX2NvbnRleHRfaG9tZScpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgndmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUnLCAoKSA9PiB7XG4gICAgaXQoJ2RlbmllcyBhY2Nlc3Mgd2l0aG91dCBzZWN0aW9uIG9yIGNoYXQgcGVybWlzc2lvbicsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QodmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUobnVsbCwgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdoZWFkZXInLCB7IC4uLmJhc2VVc2VyLCByb2xlX2lkOiBDT1JVc2VyUm9sZS5DTElFTlQgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbGxvd3MgdGFzayBhbmQgcGxhbm5lciB3aGVuIGNoYXQgQUkgaXMgZW5hYmxlZCBmb3IgdGhlIHVzZXInLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX1BST0pFQ1RfU1VNTUFSWV9GRUFUVVJFX0FDQ0VTUyA9IHRydWVcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgndGFzaycsIGJhc2VVc2VyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdwbGFubmVyJywgYmFzZVVzZXIpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXF1aXJlcyBjaGF0IGZsYWdzIGZvciBoZWFkZXIgYW5kIHByb2plY3Qgc2VjdGlvbnMnLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gZmFsc2VcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgnaGVhZGVyJywgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdwcm9qZWN0JywgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuXG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgnaGVhZGVyJywgYmFzZVVzZXIpKS50b0JlKHRydWUpXG5cbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSB0cnVlXG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IGZhbHNlXG4gICAgICBleHBlY3QodmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoJ3Byb2plY3QnLCBiYXNlVXNlcikpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdmYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IG9wdGlvbiB3aGVuIG15QWdlbnRzIGlzIHVuYXZhaWxhYmxlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLm15QWdlbnRzLFxuICAgICAgICAgIGFnZW50OiBvcmNoZXN0cmF0b3JBZ2VudCxcbiAgICAgICAgICBwcm9qZWN0OiBudWxsLFxuICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5teUFnZW50cylcbiAgICB9KVxuXG4gICAgaXQoJ2tlZXBzIG15QWdlbnRzIGFuZCBteVNraWxscyB3aGVuIGZlYXR1cmUgYWNjZXNzIGFsbG93cycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMubXlBZ2VudHMsXG4gICAgICAgICAgYWdlbnQ6IG9yY2hlc3RyYXRvckFnZW50LFxuICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICAgIHVzZXI6IGJhc2VVc2VyLFxuICAgICAgICAgIG11bHRpQWdlbnRzQWNjZXNzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMubXlBZ2VudHMpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5teVNraWxscyxcbiAgICAgICAgICBhZ2VudDogb3JjaGVzdHJhdG9yQWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMubXlTa2lsbHMpXG4gICAgfSlcblxuICAgIGl0KCdyZWRpcmVjdHMgbm9uLW9yY2hlc3RyYXRvciBnbG9iYWwgc3BlY2lhbGlzdHMgZnJvbSBob21lIHRvIGNoYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBnbG9iYWxDbG9uZTogQWdlbnQgPSB7XG4gICAgICAgIGlkOiAnMicsXG4gICAgICAgIG5hbWU6ICdTYWxlcyBCb3QnLFxuICAgICAgICB0eXBlOiAnY2xvbmUnLFxuICAgICAgICBlbnRpdHk6ICdnbG9iYWwnLFxuICAgICAgfVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBhZ2VudDogZ2xvYmFsQ2xvbmUsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuY2hhdClcbiAgICB9KVxuXG4gICAgaXQoJ2tlZXBzIGNoYXQgb3B0aW9uIHdoZW4gcHJvamVjdCBvciBjbGllbnQgY29udGV4dCBpcyBhbHJlYWR5IHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3RBZ2VudDogQWdlbnQgPSB7IGlkOiAnMycsIG5hbWU6ICdQcm9qJywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAncHJvamVjdCcgfVxuICAgICAgY29uc3QgY2xpZW50QWdlbnQ6IEFnZW50ID0geyBpZDogJzQnLCBuYW1lOiAnQ2xpZW50JywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAnY2xpZW50JyB9XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50OiBwcm9qZWN0QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogeyBpZDogMTAsIG5hbWU6ICdBbHBoYScgfSBhcyBuZXZlcixcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuaG9tZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgYWdlbnQ6IGNsaWVudEFnZW50LFxuICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgY2xpZW50OiB7IGlkOiA1LCBuYW1lOiAnQmV0YScgfSBhcyBuZXZlcixcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG5cbiAgICBpdCgnZG9lcyBub3QgcmVkaXJlY3Qgb3JjaGVzdHJhdG9yIGdsb2JhbCBjbG9uZXMgZnJvbSBob21lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3JjaGVzdHJhdG9yR2xvYmFsOiBBZ2VudCA9IHtcbiAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgbmFtZTogJ01BSUEnLFxuICAgICAgICB0eXBlOiAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgZW50aXR5OiAnZ2xvYmFsJyxcbiAgICAgIH1cblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgYWdlbnQ6IG9yY2hlc3RyYXRvckdsb2JhbCxcbiAgICAgICAgICBwcm9qZWN0OiBudWxsLFxuICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvd3MgcHJvamVjdCBhbmQgY2xpZW50IHNlbGVjdG9ycyB3aGVuIGNvbnRleHQgaXMgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3RBZ2VudDogQWdlbnQgPSB7IGlkOiAnMycsIG5hbWU6ICdQcm9qJywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAncHJvamVjdCcgfVxuICAgICAgY29uc3QgY2xpZW50QWdlbnQ6IEFnZW50ID0geyBpZDogJzQnLCBuYW1lOiAnQ2xpZW50JywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAnY2xpZW50JyB9XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50OiBwcm9qZWN0QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMucHJvamVjdFNlbGVjdG9yKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBhZ2VudDogY2xpZW50QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuY2xpZW50U2VsZWN0b3IpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUnLCAoKSA9PiB7XG4gICAgaXQoJ21hcHMgY29tcHV0ZWQgb3B0aW9ucyBhbmQgbWFpYWtlciBzZWxlY3Rpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5teVNraWxscywgZmFsc2UpKS50b0JlKCdteVNraWxscycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5teUFnZW50cywgZmFsc2UpKS50b0JlKCdteUFnZW50cycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5ob21lLCB0cnVlKSkudG9CZSgnbWFpYWtlcicpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5jaGF0LCBmYWxzZSkpLnRvQmVOdWxsKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Jlc3RvcmVzIHNhdmVkIG5hdiBhbmQgdmFsaWRhdGVzIHNhdmVkIG9wdGlvbicsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QocmVzb2x2ZUluaXRpYWxDdXJyZW50T3B0aW9uKCdteUFnZW50cycsIG51bGwsIGJhc2VVc2VyKSkudG9CZShvcHRpb25zLm15QWdlbnRzKVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbignbXlTa2lsbHMnLCBudWxsLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5teVNraWxscylcbiAgICAgIGV4cGVjdChyZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24obnVsbCwgJ2NoYXQnLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5jaGF0KVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbihudWxsLCAnaW52YWxpZCcsIGJhc2VVc2VyKSkudG9CZShvcHRpb25zLmhvbWUpXG4gICAgfSlcblxuICAgIGl0KCdpZ25vcmVzIHNhdmVkIG15U2tpbGxzIHdoZW4gdGhlIHVzZXIgbGFja3Mgc2tpbGxzIGFjY2VzcycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSBmYWxzZVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbignbXlTa2lsbHMnLCBudWxsLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2NsYW1wRmxvYXRpbmdQYW5lbFBvc2l0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdrZWVwcyB0aGUgcGFuZWwgaW5zaWRlIHRoZSB2aWV3cG9ydCB3aXRoIHBhZGRpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2xhbXBGbG9hdGluZ1BhbmVsUG9zaXRpb24oMCwgMCwgNDAwLCA2MDAsIDEyMDAsIDgwMCkpLnRvRXF1YWwoeyB4OiAxNiwgeTogMTYgfSlcbiAgICAgIGV4cGVjdChjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbigyMDAwLCAyMDAwLCA0MDAsIDYwMCwgMTIwMCwgODAwKSkudG9FcXVhbCh7IHg6IDc4NCwgeTogMTg0IH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGxlZ2FjeSBjbG9uZSBjb250ZXh0IG9ubHkgb24gY2hhdCB2aWV3JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24ob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQsIHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdjbG9uZScsXG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ0FscGhhJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGVudGl0eVR5cGU6ICdwcm9qZWN0JywgY29udGV4dE5hbWU6ICdBbHBoYScgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24ob3B0aW9ucy5ob21lLCBvcHRpb25zLmNoYXQsIHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdjbG9uZScsXG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ0FscGhhJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnbWFwcyB0YXNrIGFuZCBjbGllbnQgbmFtZXMgYW5kIGlnbm9yZXMgaW52YWxpZCBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uKG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0LCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnY2xvbmUnLFxuICAgICAgICAgIGFnZW50RW50aXR5OiAndGFzaycsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBlbnRpdHlUeXBlOiAndGFzaycsIGNvbnRleHROYW1lOiAnJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCwge1xuICAgICAgICAgIGFnZW50VHlwZTogJ2Nsb25lJyxcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tOYW1lOiAnQnVnZml4JyxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGVudGl0eVR5cGU6ICd0YXNrJywgY29udGV4dE5hbWU6ICdCdWdmaXgnIH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uKG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0LCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnY2xvbmUnLFxuICAgICAgICAgIGFnZW50RW50aXR5OiAnY2xpZW50JyxcbiAgICAgICAgICBjbGllbnROYW1lOiAnQWNtZScsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBlbnRpdHlUeXBlOiAnY2xpZW50JywgY29udGV4dE5hbWU6ICdBY21lJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCwge1xuICAgICAgICAgIGFnZW50VHlwZTogJ2Nsb25lJyxcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ2dsb2JhbCcsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdJZ25vcmVkJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hhc0FueUFjdGl2ZVNlc3Npb25Jbk1ldGEnLCAoKSA9PiB7XG4gICAgaXQoJ2RldGVjdHMgdGhpbmtpbmcsIHdyaXRpbmcgYW5kIGFwcHJvdmFsIHNlc3Npb25zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhKHtcbiAgICAgICAgICBhOiB7IHN0YXR1czogJ3RoaW5raW5nJyB9LFxuICAgICAgICAgIGI6IHsgc3RhdHVzOiAnY29tcGxldGUnIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhKHsgYTogeyBzdGF0dXM6ICdjb21wbGV0ZScgfSB9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdwYW5lbCByZXN0b3JlIGFuZCBmbG9hdGluZyBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdyZXN0b3JlcyBleHBhbmRlZCBwYW5lbHMgZnJvbSBzYXZlZCBzZXNzaW9uIHNuYXBzaG90cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCh7IGlzRXhwYW5kZWQ6IHRydWUgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCh7IGlzRXhwYW5kZWQ6IGZhbHNlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc3RvcmVFeHBhbmRlZFBhbmVsKHVuZGVmaW5lZCkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbmNob3JzIHRoZSBkZWZhdWx0IGZsb2F0aW5nIHBhbmVsIHRvIHRoZSBib3R0b20tcmlnaHQgY29ybmVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVEZWZhdWx0RmxvYXRpbmdQYW5lbFBvc2l0aW9uKDEyMDAsIDQ4MCkpLnRvRXF1YWwoeyB4OiA3MDQsIHk6IDE2IH0pXG4gICAgfSlcblxuICAgIGl0KCdza2lwcyBkcmFnIG9uIGludGVyYWN0aXZlIHRhcmdldHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQoYnV0dG9uKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2lzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kJywgKCkgPT4ge1xuICAgIGl0KCdibG9ja3MgYXV0byBzZW5kIHdoZW4gdGhlIEZBUSBpcyBlbXB0eSBvciBhbHJlYWR5IHNlbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJyAgICcsXG4gICAgICAgICAgYWxyZWFkeVNlbnQ6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGFnZW50SWQ6ICcxJyxcbiAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCh7XG4gICAgICAgICAgZmFxVGl0bGU6ICdQcmVndW50YScsXG4gICAgICAgICAgYWxyZWFkeVNlbnQ6IHRydWUsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnd2FpdHMgZm9yIHByb2plY3QgYW5kIGNsaWVudCBjb250ZXh0IGJlZm9yZSBhdXRvIHNlbmRpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1Jlc3Vtw60gZWwgcHJveWVjdG8nLFxuICAgICAgICAgIGFscmVhZHlTZW50OiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2VjdGlvbjogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCh7XG4gICAgICAgICAgZmFxVGl0bGU6ICdSZXN1bcOtIGVsIHByb3llY3RvJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDQyLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXF1aXJlcyBjbGllbnQgY29udGV4dCBmb3IgY2xpZW50IHNlY3Rpb25zIGFuZCBhbGxvd3MgaGVhZGVyIEZBUXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1ByZWd1bnRhJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudElkOiBudWxsLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1ByZWd1bnRhJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudElkOiA5LFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgaXNCYW5uZXJGYXFSZWFkeVRvQXV0b1NlbmQoe1xuICAgICAgICAgIGZhcVRpdGxlOiAnUHJlZ3VudGEnLFxuICAgICAgICAgIGFscmVhZHlTZW50OiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2VjdGlvbjogJ2hlYWRlcicsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdpc0xlZ2FjeUNvbnRleHRFbnRpdHknLCAoKSA9PiB7XG4gICAgaXQoJ2FjY2VwdHMgb25seSBwcm9qZWN0LCB0YXNrIGFuZCBjbGllbnQgZW50aXRpZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNMZWdhY3lDb250ZXh0RW50aXR5KCdwcm9qZWN0JykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0xlZ2FjeUNvbnRleHRFbnRpdHkoJ2dsb2JhbCcpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2dldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2hpZGVzIGV4cGFuZGVkIHBhbmVsIG9uIG1haWEgcGFnZSByb3V0ZSB3aXRob3V0IHNob3dpbmcgdGhlIHBpbGwnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0TWFpYUhvc3RQYW5lbFByZXNlbnRhdGlvbihmYWxzZSwgdHJ1ZSkpLnRvRXF1YWwoe1xuICAgICAgICBoaWRlUGFuZWxDb250ZW50OiB0cnVlLFxuICAgICAgICBzaG93TWluaW1pemVkUGlsbDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgna2VlcHMgdGhlIHBhbmVsIHZpc2libGUgb24gb3RoZXIgcm91dGVzIHdoZW4gZXhwYW5kZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0TWFpYUhvc3RQYW5lbFByZXNlbnRhdGlvbihmYWxzZSwgZmFsc2UpKS50b0VxdWFsKHtcbiAgICAgICAgaGlkZVBhbmVsQ29udGVudDogZmFsc2UsXG4gICAgICAgIHNob3dNaW5pbWl6ZWRQaWxsOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG93cyB0aGUgcGlsbCBvbmx5IHdoZW4gbWluaW1pemVkIG91dHNpZGUgbWFpYSBwYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24odHJ1ZSwgZmFsc2UpKS50b0VxdWFsKHtcbiAgICAgICAgaGlkZVBhbmVsQ29udGVudDogdHJ1ZSxcbiAgICAgICAgc2hvd01pbmltaXplZFBpbGw6IHRydWUsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KGdldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24odHJ1ZSwgdHJ1ZSkpLnRvRXF1YWwoe1xuICAgICAgICBoaWRlUGFuZWxDb250ZW50OiB0cnVlLFxuICAgICAgICBzaG93TWluaW1pemVkUGlsbDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2Vuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHVzZUZpcnN0QWdlbnQgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnN1cmVBZ2VudHNMb2FkZWQgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW2FnZW50KCdhMScpXSlcblxuICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICBlbnN1cmVBZ2VudHNCZWZvcmVTa2lsbFVzZSh7XG4gICAgICAgICAgdXNlRmlyc3RBZ2VudDogZmFsc2UsXG4gICAgICAgICAgYWdlbnRzOiBbXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKVxuXG4gICAgICBleHBlY3QoZW5zdXJlQWdlbnRzTG9hZGVkKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgfSlcblxuICAgIGl0KCd1c2VzIHRoZSBpbi1tZW1vcnkgYWdlbnRzIGxpc3Qgd2hlbiBpdCBpcyBhbHJlYWR5IHBvcHVsYXRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVuc3VyZUFnZW50c0xvYWRlZCA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbYWdlbnQoJ2EyJyldKVxuXG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgICB1c2VGaXJzdEFnZW50OiB0cnVlLFxuICAgICAgICAgIGFnZW50czogW2FnZW50KCdhMScpXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoYWdlbnQoJ2ExJykpXG5cbiAgICAgIGV4cGVjdChlbnN1cmVBZ2VudHNMb2FkZWQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICB9KVxuXG4gICAgaXQoJ2xvYWRzIGFnZW50cyB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW5zdXJlQWdlbnRzTG9hZGVkID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFthZ2VudCgnYTEnKSwgYWdlbnQoJ2EyJyldKVxuXG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgICB1c2VGaXJzdEFnZW50OiB0cnVlLFxuICAgICAgICAgIGFnZW50czogW10sXG4gICAgICAgICAgZW5zdXJlQWdlbnRzTG9hZGVkLFxuICAgICAgICB9KVxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKGFnZW50KCdhMScpKVxuXG4gICAgICBleHBlY3QoZW5zdXJlQWdlbnRzTG9hZGVkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICB9KVxuXG4gICAgaXQoJ3JldHVybnMgdW5kZWZpbmVkIHdoZW4gYWdlbnRzIGNhbm5vdCBiZSBsb2FkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnN1cmVBZ2VudHNMb2FkZWQgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pXG5cbiAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2Uoe1xuICAgICAgICAgIHVzZUZpcnN0QWdlbnQ6IHRydWUsXG4gICAgICAgICAgYWdlbnRzOiBbXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hvc3QgdGFrZW92ZXIgY29udGV4dCBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdtYXBzIHByb2plY3QvdGFzayBzZWN0aW9ucyB0byBwcm9qZWN0IGFuZCB0YXNrIGVudGl0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvamVjdCA9IHsgaWQ6IDEsIG5hbWU6ICdBbHBoYScgfSBhcyBjb25zdFxuICAgICAgY29uc3QgdGFzayA9IHsgaWQ6IDksIG5hbWU6ICdCdWcnIH0gYXMgY29uc3RcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoe1xuICAgICAgICAgIHNlY3Rpb246ICd0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRhc2ssXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwcm9qZWN0LFxuICAgICAgICB0YXNrLFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoeyBzZWN0aW9uOiAndGFzaycsIHByb2plY3QsIHRhc2sgfSkuY2xpZW50KS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuXG4gICAgaXQoJ2NsZWFycyBjbGllbnQgb24gaGVhZGVyL3BsYW5uZXIgdGFrZW92ZXIgYW5kIHNldHMgY2xpZW50IG9uIGNsaWVudCBzZWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0geyBpZDogMiwgbmFtZTogJ0FjbWUnIH0gYXMgY29uc3RcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoe1xuICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IHRydWUsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZSh7XG4gICAgICAgICAgc2VjdGlvbjogJ2NsaWVudCcsXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBwZXJzaXN0IGhvc3QgY29udGV4dCBmb3IgcGFuZWwgc2Vzc2lvbiBwYXRjaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3QgPSB7IGlkOiAzLCBuYW1lOiAnQmV0YScgfSBhcyBjb25zdFxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAncHJvamVjdCcsXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7XG4gICAgICAgIHNlY3Rpb246ICdwcm9qZWN0JyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICBjaGlwc1Byb2plY3Q6IG51bGwsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnZGVmYXVsdHMgbWlzc2luZyBwcm9qZWN0LCBjbGllbnQgYW5kIHRhc2sgZW50aXRpZXMgb24gdGFrZW92ZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUhvc3RUYWtlb3ZlckVudGl0eVN0YXRlKHsgc2VjdGlvbjogJ3Byb2plY3QnIH0pKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgdGFzazogbnVsbCxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzb2x2ZUhvc3RUYWtlb3ZlckVudGl0eVN0YXRlKHsgc2VjdGlvbjogJ2NsaWVudCcgfSkpLnRvTWF0Y2hPYmplY3QoeyBjbGllbnQ6IG51bGwgfSlcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoeyBzZWN0aW9uOiAndGFzaycsIHByb2plY3Q6IHsgaWQ6IDEgfSBhcyBuZXZlciB9KSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIHRhc2s6IG51bGwsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAncGxhbm5lcicsXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBwcm9qZWN0OiBudWxsLCBjbGllbnQ6IG51bGwsIHRhc2s6IG51bGwgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAnY2xpZW50JyxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGNsaWVudDogbnVsbCB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkSG9zdFRha2VvdmVyUGVyc2lzdENvbnRleHQoe1xuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudDogeyBpZDogOSwgbmFtZTogJ0NsaWVudCcgfSBhcyBuZXZlcixcbiAgICAgICAgfSkuY2xpZW50XG4gICAgICApLnRvRXF1YWwoeyBpZDogOSwgbmFtZTogJ0NsaWVudCcgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAndGFzaycsXG4gICAgICAgICAgdGFzazogeyBpZDogMSwgbmFtZTogJ1QnIH0gYXMgbmV2ZXIsXG4gICAgICAgIH0pLnRhc2tcbiAgICAgICkudG9FcXVhbCh7IGlkOiAxLCBuYW1lOiAnVCcgfSlcblxuICAgICAgY29uc3QgcHJvamVjdCA9IHsgaWQ6IDQsIG5hbWU6ICdQJyB9IGFzIGNvbnN0XG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkSG9zdFRha2VvdmVyUGVyc2lzdENvbnRleHQoe1xuICAgICAgICAgIHNlY3Rpb246ICd0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRhc2s6IHsgaWQ6IDEsIG5hbWU6ICdUJyB9IGFzIG5ldmVyLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHsgcHJvamVjdCwgdGFzazogeyBpZDogMSwgbmFtZTogJ1QnIH0gfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdtb2RhbCBuYXZpZ2F0aW9uIGFuZCBzZXNzaW9uIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ25vcm1hbGl6ZXMgYnIgdG8gcHQtYnIgZm9yIG1vZGFsIGkxOG4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nKCdicicpKS50b0JlKCdwdC1icicpXG4gICAgICBleHBlY3QocmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nKCdlcycpKS50b0JlKCdlcycpXG4gICAgfSlcblxuICAgIGl0KCdjaGVja3MgYWdlbnQgbWFuYWdlbWVudCBwZXJtaXNzaW9ucyB3aXRoIG11bHRpLWFnZW50cyBmbGFnJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMoeyBhaV9hZ2VudHM6IHsgY3JlYXRlOiB0cnVlIH0gfSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlVXNlckhhc0FnZW50TWFuYWdlbWVudFBlcm1pc3Npb25zKHsgYWlfYWdlbnRzOiB7IGVkaXQ6IHRydWUgfSB9LCB0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMoeyBhaV9hZ2VudHM6IHsgZGVsZXRlOiB0cnVlIH0gfSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlVXNlckhhc0FnZW50TWFuYWdlbWVudFBlcm1pc3Npb25zKHsgYWlfYWdlbnRzOiB7IGNyZWF0ZTogdHJ1ZSB9IH0sIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2RlY2lkZXMgd2hlbiB0byBzdGFydCBhIG5ldyBjaGF0IGZyb20gY2F0YWxvZyB2aWV3cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyhvcHRpb25zLm15QWdlbnRzLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyhvcHRpb25zLmhvbWUsIHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU3RhcnROZXdDaGF0RnJvbUNhdGFsb2cob3B0aW9ucy5ob21lLCBmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdoYW5kbGVzIGJhY2sgbmF2aWdhdGlvbiBicmFuY2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRCYWNrU3RhcnROZXdDaGF0UHJlc2VydmluZ0NvbnRleHQob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQmFja0NsZWFyUGlubmVkQ29udGV4dChvcHRpb25zLmhvbWUsIG9wdGlvbnMuaG9tZSwgJ2hlYWRlcicsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEJhY2tDbGVhclBpbm5lZENvbnRleHQob3B0aW9ucy5ob21lLCBvcHRpb25zLmhvbWUsICdwcm9qZWN0JywgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnbWFya3Mgb3JjaGVzdHJhdG9yIGNvbnRleHQgcmVzZXQgb24gcGlubmVkLXRvLWVtcHR5IHRyYW5zaXRpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCgncHJvamVjdCcsICdvcmNoZXN0cmF0b3InLCB0cnVlLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRNYXJrT3JjaGVzdHJhdG9yQ29udGV4dFJlc2V0KCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJywgdHJ1ZSwgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncHJlZmVycyB1bnJlYWQgY2hhdHMgd2hlbiByZXN0b3JpbmcgZnJvbSBtaW5pbWl6ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGF0cyA9IFtcbiAgICAgICAgeyBzZXNzaW9uRXh0ZXJuYWxJZDogJ3MxJywgaXNSZWFkOiB0cnVlIH0sXG4gICAgICAgIHsgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMicsIGlzUmVhZDogZmFsc2UgfSxcbiAgICAgIF1cbiAgICAgIGV4cGVjdChyZXNvbHZlTWluaW1pemVkUmVzdG9yZVRhcmdldChjaGF0cywgJ3MxJyk/LnNlc3Npb25FeHRlcm5hbElkKS50b0JlKCdzMicpXG4gICAgICBleHBlY3QocmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQoW3sgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMScsIGlzUmVhZDogdHJ1ZSB9XSwgJ3MxJyk/LnNlc3Npb25FeHRlcm5hbElkKS50b0JlKFxuICAgICAgICAnczEnXG4gICAgICApXG4gICAgICBleHBlY3QocmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQoW3sgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMScsIGlzUmVhZDogdHJ1ZSB9XSwgdW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBob3N0IHRha2VvdmVyIGFnZW50IGlkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkKGZhbHNlLCBbYWdlbnQoJ2ExJyldLCAnY3VycmVudCcpKS50b0JlKCdjdXJyZW50JylcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZChmYWxzZSwgW2FnZW50KCdhMScpXSwgdW5kZWZpbmVkKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkKHRydWUsIFthZ2VudCgnYTEnKV0sICdjdXJyZW50JykpLnRvQmUoJ2ExJylcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZCh0cnVlLCBbXSwgJ2N1cnJlbnQnKSkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnYnVpbGRzIHBhbmVsIHNlc3Npb24gcGF0Y2ggb25seSB3aGVuIGV4cGFuZGVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCh7XG4gICAgICAgICAgaXNNaW5pbWl6ZWQ6IHRydWUsXG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICBhY3RpdmVDaGF0SWQ6IG51bGwsXG4gICAgICAgICAgYWdlbnRJZDogbnVsbCxcbiAgICAgICAgICBzaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgICBkcmFnUG9zaXRpb246IHsgeDogMSwgeTogMiB9LFxuICAgICAgICAgIGhvc3RDb250ZXh0OiB7XG4gICAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICAgICAgY2hpcHNQcm9qZWN0OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvQmVOdWxsKClcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCh7XG4gICAgICAgICAgaXNNaW5pbWl6ZWQ6IGZhbHNlLFxuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNOYXZBY3RpdmU6ICdteUFnZW50cycsXG4gICAgICAgICAgYWN0aXZlQ2hhdElkOiAnY2hhdC0xJyxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2lkZWJhck9wZW46IHRydWUsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ3NpZGViYXInLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiAxLCB5OiAyIH0sXG4gICAgICAgICAgaG9zdENvbnRleHQ6IHtcbiAgICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICAgIHRhc2s6IG51bGwsXG4gICAgICAgICAgICBjaGlwc1Byb2plY3Q6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGFjdGl2ZUNoYXRJZDogJ2NoYXQtMScsIGRyYWdQb3NpdGlvbjogbnVsbCB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTWFpYVBhbmVsU2Vzc2lvblBhdGNoKHtcbiAgICAgICAgICBpc01pbmltaXplZDogZmFsc2UsXG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICBhY3RpdmVDaGF0SWQ6ICdjaGF0LTEnLFxuICAgICAgICAgIGFnZW50SWQ6ICcxJyxcbiAgICAgICAgICBzaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgICBkcmFnUG9zaXRpb246IHsgeDogMywgeTogNCB9LFxuICAgICAgICAgIGhvc3RDb250ZXh0OiB7XG4gICAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICAgICAgY2hpcHNQcm9qZWN0OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBkcmFnUG9zaXRpb246IHsgeDogMywgeTogNCB9IH0pXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBmbG9hdGluZyBkcmFnIHBvc2l0aW9uIHdpdGggY2xhbXAgZmFsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjbGFtcCA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gKHsgeCwgeSB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbih7XG4gICAgICAgICAgbGF5b3V0TW9kZTogJ3NpZGViYXInLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiA1LCB5OiA2IH0sXG4gICAgICAgICAgdmlld3BvcnRXaWR0aDogMTIwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgY2xhbXAsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyB4OiA1LCB5OiA2IH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUZsb2F0aW5nUGFuZWxEcmFnUG9zaXRpb24oe1xuICAgICAgICAgIGxheW91dE1vZGU6ICdmbG9hdGluZycsXG4gICAgICAgICAgZHJhZ1Bvc2l0aW9uOiBudWxsLFxuICAgICAgICAgIHZpZXdwb3J0V2lkdGg6IDEyMDAsXG4gICAgICAgICAgcGFuZWxXaWR0aDogNDAwLFxuICAgICAgICAgIGNsYW1wLFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNzg0LCB5OiAxNiB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVGbG9hdGluZ1BhbmVsRHJhZ1Bvc2l0aW9uKHtcbiAgICAgICAgICBsYXlvdXRNb2RlOiAnZmxvYXRpbmcnLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiA0MCwgeTogNTAgfSxcbiAgICAgICAgICB2aWV3cG9ydFdpZHRoOiAxMjAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBjbGFtcCxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IHg6IDQwLCB5OiA1MCB9KVxuICAgIH0pXG5cbiAgICBpdCgncmV1c2VzIHByZXZpb3VzIGRyYWcgcG9zaXRpb24gd2hlbiB1bmNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcmV2ID0geyB4OiAxMCwgeTogMjAgfVxuICAgICAgZXhwZWN0KHJlc29sdmVOZXh0RHJhZ1Bvc2l0aW9uKHByZXYsIHsgeDogMTAsIHk6IDIwIH0pKS50b0JlKHByZXYpXG4gICAgICBleHBlY3QocmVzb2x2ZU5leHREcmFnUG9zaXRpb24ocHJldiwgeyB4OiAxMSwgeTogMjAgfSkpLnRvRXF1YWwoeyB4OiAxMSwgeTogMjAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCduYXZpZ2F0aW9uIGFuZCBsZWdhY3kgY29udGV4dCBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdyZXNvbHZlcyBwaW5uZWQgY29udGV4dCBhbmQgYmFjayBidXR0b24gdmlzaWJpbGl0eScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlSGFzUGlubmVkQ29udGV4dCh7IHRhc2tJZDogMSB9KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVIYXNQaW5uZWRDb250ZXh0KHt9KSkudG9CZShmYWxzZSlcblxuICAgICAgY29uc3QgZmxhZ3MgPSByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzKHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBoYXNQaW5uZWRDb250ZXh0OiB0cnVlLFxuICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QoZmxhZ3MuaXNDaGF0VmlldykudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTaG93T3JjaGVzdHJhdG9yQmFja0J1dHRvbih7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICBoYXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcblxuICAgICAgY29uc3Qgc2VjdGlvblJlc2V0RmxhZ3MgPSByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzKHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBoYXNQaW5uZWRDb250ZXh0OiB0cnVlLFxuICAgICAgICBzZWN0aW9uOiAncHJvamVjdCcsXG4gICAgICAgIGRpZFJlc2V0Q29udGV4dEluU2VjdGlvbjogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3Qoc2VjdGlvblJlc2V0RmxhZ3MuaXNTZWN0aW9uUmVzZXRIb21lU3RlcDIpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24oe1xuICAgICAgICAgIGFnZW50VHlwZTogJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgaGFzRXJyb3I6IHRydWUsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgLi4uc2VjdGlvblJlc2V0RmxhZ3MsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24oe1xuICAgICAgICAgIGFnZW50VHlwZTogJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgaXNDaGF0VmlldzogdHJ1ZSxcbiAgICAgICAgICBpc0hlYWRlckhvbWVTdGVwMjogZmFsc2UsXG4gICAgICAgICAgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDI6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNob3dPcmNoZXN0cmF0b3JCYWNrQnV0dG9uKHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0NoYXRWaWV3OiBmYWxzZSxcbiAgICAgICAgICBpc0hlYWRlckhvbWVTdGVwMjogZmFsc2UsXG4gICAgICAgICAgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDI6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBsZWdhY3kgbWlncmF0aW9uIHBhdGNoZXMgZm9yIGNsaWVudCwgcHJvamVjdCBhbmQgdGFzayBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaChudWxsKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnIH0pKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnLCBjbGllbnRJZDogMywgY2xpZW50TmFtZTogJ0FDTUUnIH0pPy5jbGllbnRcbiAgICAgICkudG9FcXVhbCh7XG4gICAgICAgIGlkOiAzLFxuICAgICAgICBuYW1lOiAnQUNNRScsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7IGFnZW50RW50aXR5OiAncHJvamVjdCcsIHByb2plY3RJZDogOSwgcHJvamVjdE5hbWU6ICdQJyB9KT8uY2hpcHNQcm9qZWN0XG4gICAgICAgICAgPy5wcm9qZWN0SWRcbiAgICAgICkudG9CZSgnOScpXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tJZDogMSxcbiAgICAgICAgICB0YXNrTmFtZTogJ1QnLFxuICAgICAgICAgIHByb2plY3RJZDogMixcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICAgIGNsaWVudElkOiA0LFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LnRhc2tcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGlkOiAxLCBuYW1lOiAnVCcsIHByb2plY3RJZDogMiB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogOSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICAgIGNsaWVudElkOiA0LFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LnByb2plY3RcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGNsaWVudElkOiA0IH0pXG5cbiAgICAgIGV4cGVjdChidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7IGFnZW50RW50aXR5OiAndGFzaycsIHRhc2tJZDogNSwgdGFza05hbWU6ICdPbmx5IHRhc2snIH0pPy50YXNrKS50b0VxdWFsKFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDUsXG4gICAgICAgICAgbmFtZTogJ09ubHkgdGFzaycsXG4gICAgICAgIH1cbiAgICAgIClcblxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnLCBjbGllbnRJZDogMSB9KT8uY2xpZW50KS50b0VxdWFsKHtcbiAgICAgICAgaWQ6IDEsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7XG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICd0YXNrJyxcbiAgICAgICAgICB0YXNrSWQ6IDgsXG4gICAgICAgICAgdGFza05hbWU6ICdUJyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDIsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdQJyxcbiAgICAgICAgfSk/LmNoaXBzUHJvamVjdD8ucHJvamVjdElkXG4gICAgICApLnRvQmUoJzInKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tJZDogNixcbiAgICAgICAgICB0YXNrTmFtZTogJ1QnLFxuICAgICAgICAgIGNsaWVudElkOiAzLFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LmNsaWVudFxuICAgICAgKS50b0VxdWFsKHsgaWQ6IDMsIG5hbWU6ICdDJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogOSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICB9KT8ucHJvamVjdFxuICAgICAgKS5ub3QudG9IYXZlUHJvcGVydHkoJ2NsaWVudElkJylcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7XG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICd0YXNrJyxcbiAgICAgICAgICB0YXNrSWQ6IDEwLFxuICAgICAgICAgIHRhc2tOYW1lOiAnRnVsbCB0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDExLFxuICAgICAgICAgIHByb2plY3ROYW1lOiAnUHJvaicsXG4gICAgICAgICAgY2xpZW50SWQ6IDEyLFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDbGllbnQnLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgdGFzazogeyBpZDogMTAsIG5hbWU6ICdGdWxsIHRhc2snLCBwcm9qZWN0SWQ6IDExLCBjbGllbnRJZDogMTIgfSxcbiAgICAgICAgY2xpZW50OiB7IGlkOiAxMiwgbmFtZTogJ0NsaWVudCcgfSxcbiAgICAgICAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZDogJzExJywgcHJvamVjdE5hbWU6ICdQcm9qJywgY2xpZW50TmFtZTogJ0NsaWVudCcgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBmbG9hdGluZyBkcmFnIGNsYW1wIGFuZCBsYXlvdXQgcG9zaXRpb24gdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRVc2VEcmFnQ2xhbXBGYWxsYmFjayhudWxsKSkudG9CZSh0cnVlKVxuICAgICAgY29uc3QgY2xhbXAgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+ICh7IHgsIHkgfSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSgnZmxvYXRpbmcnLCB7IHg6IDQsIHk6IDggfSwgY2xhbXAsIHtcbiAgICAgICAgICBpbm5lcldpZHRoOiAxMDAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBwYWQ6IDE2LFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNCwgeTogOCB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlKCdmbG9hdGluZycsIG51bGwsIGNsYW1wLCB7XG4gICAgICAgICAgaW5uZXJXaWR0aDogMTAwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgcGFkOiAxNixcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IHg6IDU4NCwgeTogMTYgfSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSgnc2lkZWJhcicsIG51bGwsIGNsYW1wLCB7IGlubmVyV2lkdGg6IDAsIHBhbmVsV2lkdGg6IDAsIHBhZDogMCB9KVxuICAgICAgKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QocmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kKCdmbG9hdGluZycsIHt9IGFzIEhUTUxFbGVtZW50KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCgnc2lkZWJhcicsIHt9IGFzIEhUTUxFbGVtZW50KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBpbml0aWFsIGNoYXQgbWVzc2FnZSBwYXlsb2FkIGZyb20gc3RhcnQgY2hhdCBhcmdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGJ1aWxkVXNlckluaXRpYWxNZXNzYWdlRnJvbVN0YXJ0Q2hhdCh7IG1lc3NhZ2U6ICdob2xhJywgZmFxSWQ6ICdmMScgfSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiAnaG9sYScsXG4gICAgICAgIGZhcUlkOiAnZjEnLFxuICAgICAgICBhdHRhY2htZW50czogW10sXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZFVzZXJJbml0aWFsTWVzc2FnZUZyb21TdGFydENoYXQoe1xuICAgICAgICAgIGF0dGFjaG1lbnRzOiBbeyBpZDogJzEnIH1dLFxuICAgICAgICAgIGFnZW50U3VnZ2VzdGlvbklkOiAnczEnLFxuICAgICAgICAgIG1lbnRpb25zOiBbeyBpZDogJ20xJyB9XSxcbiAgICAgICAgICBmdWFJZDogJ2Z1YScsXG4gICAgICAgICAgc2NJZDogJ3NjJyxcbiAgICAgICAgICBjb250ZXh0RGF0YTogeyB0YXNrSWQ6IDEgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICBhdHRhY2htZW50czogW3sgaWQ6ICcxJyB9XSxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ6ICdzMScsXG4gICAgICAgIG1lbnRpb25zOiBbeyBpZDogJ20xJyB9XSxcbiAgICAgICAgZnVhSWQ6ICdmdWEnLFxuICAgICAgICBzY0lkOiAnc2MnLFxuICAgICAgICBjb250ZXh0RGF0YTogeyB0YXNrSWQ6IDEgfSxcbiAgICAgIH0pXG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZXRTaWRlYmFyRXJyb3JPblN0YXJ0Q2hhdCh0cnVlKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnc3VwcG9ydHMgZ28taG9tZSBhbmQgc2VuZCByb3V0aW5nIGd1YXJkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQoJ2NsaWVudCcpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUoeyBoYXNfbm90X2FjY2VzczogdHJ1ZSB9IGFzIEFnZW50LCAyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUobnVsbCwgMikpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lKHsgaXNfZGVsZXRlZDogdHJ1ZSB9IGFzIEFnZW50LCAxKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUoeyBoYXNfbm90X2FjY2VzczogdHJ1ZSB9IGFzIEFnZW50LCAwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRVc2VBY3RpdmVDaGF0U2VuZEhhbmRsZXIob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQsIHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoY2FuT3Blbk1haWFNYXJrZXRwbGFjZShmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoZmluZE9yY2hlc3RyYXRvckFnZW50KFthZ2VudCgnMicpLCBvcmNoZXN0cmF0b3JBZ2VudF0pPy50eXBlKS50b0JlKCdvcmNoZXN0cmF0b3InKVxuICAgICAgZXhwZWN0KHNob3VsZE1hcmtBZ2VudEFzTGVnYWN5Q29udGV4dCh7fSwgeyBpZDogJzEnIH0gYXMgQWdlbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkTWFya0FnZW50QXNMZWdhY3lDb250ZXh0KHt9LCB7IGlkOiAnMScsIGlzX2xlZ2FjeV9jb250ZXh0OiB0cnVlIH0gYXMgQWdlbnQpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dEFnZW50KHsgaWQ6ICcxJywgbmFtZTogJ0EnLCB0eXBlOiAnY3VzdG9tJyB9IGFzIEFnZW50KS5pc19sZWdhY3lfY29udGV4dCkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ21vdW50LCBiYW5uZXIgYW5kIGFnZW50cyBsb2FkaW5nIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NvbnRyb2xzIGNoYXQgdmlzaWJpbGl0eSBhbmQgbGFzdCBhY3RpdmUgY2hhdCBwZXJzaXN0ZW5jZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTZXRDaGF0Vmlld0hpZGRlbk9uTW91bnQoZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2V0Q2hhdFZpZXdIaWRkZW5Pbk1vdW50KHRydWUpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RMYXN0QWN0aXZlQ2hhdElkKCdjaGF0LTEnKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RMYXN0QWN0aXZlQ2hhdElkKG51bGwpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFN5bmNQYW5lbFNlc3Npb25PblBhZ2VIaWRlKGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFN5bmNQYW5lbFNlc3Npb25PblBhZ2VIaWRlKHRydWUpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyBiYW5uZXIgRkFRIHRpdGxlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChoYXNCYW5uZXJGYXFUaXRsZSgnICAnKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChoYXNCYW5uZXJGYXFUaXRsZSgnUHJlZ3VudGEnKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgY2FjaGVkIGFnZW50cyBhbmQgaW5pdGlhbCBmZXRjaCBhdHRlbXB0cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQ2FjaGVkQWdlbnRzSWZBdmFpbGFibGUoW2FnZW50KCcxJyldKSkudG9FcXVhbChbYWdlbnQoJzEnKV0pXG4gICAgICBleHBlY3QocmVzb2x2ZUNhY2hlZEFnZW50c0lmQXZhaWxhYmxlKFtdKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHNob3VsZEF0dGVtcHRJbml0aWFsQWdlbnRzRmV0Y2goMCwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQXR0ZW1wdEluaXRpYWxBZ2VudHNGZXRjaCgwLCB0cnVlKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoKDIsIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2ZpbmRzIGFnZW50cyBmb3IgY2hhdCBpdGVtcyB3aXRoIG51bWVyaWMgaWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZpbmRBZ2VudEZvckNoYXRJdGVtKFt7IC4uLmFnZW50KCc3JyksIGlkOiAnNycgfSBhcyBBZ2VudF0sIDcpPy5pZCkudG9CZSgnNycpXG4gICAgICBleHBlY3QoZmluZEFnZW50Rm9yQ2hhdEl0ZW0oW2FnZW50KCcxJyldLCA5OSkpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hvc3QgdGFrZW92ZXIgYW5kIG5hdmlnYXRpb24gZ3VhcmRzJywgKCkgPT4ge1xuICAgIGl0KCdhcHBsaWVzIGNsaWVudCB1cGRhdGVzIG9ubHkgd2hlbiBkZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZEFwcGx5Q2xpZW50T25Ib3N0VGFrZW92ZXIodW5kZWZpbmVkKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRBcHBseUNsaWVudE9uSG9zdFRha2VvdmVyKG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQXBwbHlDbGllbnRPbkhvc3RUYWtlb3Zlcih7IGlkOiAxLCBuYW1lOiAnQWNtZScgfSBhcyBuZXZlcikpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3NlbGVjdHMgZmlyc3QgYWdlbnQgb24gZ2xvYmFsIGhvc3QgdGFrZW92ZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyKHRydWUsIGFnZW50KCcxJykpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyKGZhbHNlLCBhZ2VudCgnMScpKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTZWxlY3RGaXJzdEFnZW50T25Ib3N0VGFrZW92ZXIodHJ1ZSwgdW5kZWZpbmVkKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NvdmVycyBnby1ob21lLCBjYXRhbG9nIGFuZCBza2lsbCBhZ2VudCBndWFyZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZShvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNldENoYXRTdGF0ZU9uR29Ib21lKG9wdGlvbnMuaG9tZSwgb3B0aW9ucy5jaGF0KSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckNvbnRleHRGb3JDYXRhbG9nT3JTa2lsbEFnZW50KGFnZW50KCcxJykpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQ2xlYXJDb250ZXh0Rm9yQ2F0YWxvZ09yU2tpbGxBZ2VudCh1bmRlZmluZWQpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQoJ3Rhc2snKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhclRhc2tPbkdvSG9tZUZyb21DaGF0KCdoZWFkZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyT3JjaGVzdHJhdG9yR2xvYmFsQ29udGV4dE9uR29Ib21lKCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhck9yY2hlc3RyYXRvckdsb2JhbENvbnRleHRPbkdvSG9tZSgncHJvamVjdCcsICdvcmNoZXN0cmF0b3InKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRQcmVmZXRjaEFnZW50c0ZvckNhdGFsb2dOZXdDaGF0KG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlTa2lsbHMpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUHJlZmV0Y2hBZ2VudHNGb3JDYXRhbG9nTmV3Q2hhdChvcHRpb25zLmhvbWUsIG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlTa2lsbHMpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgb3Blbi1uZXctY2hhdC13aXRoLWFnZW50IGNvbnRleHQgcGF0Y2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0KHsgcHJvamVjdDogeyBpZDogMSwgbmFtZTogJ1AnIH0gYXMgbmV2ZXIgfSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAnUCcgfSxcbiAgICAgICAgc2hvdWxkU2V0VGFzazogZmFsc2UsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc29sdmVPcGVuTmV3Q2hhdFdpdGhBZ2VudENvbnRleHQoeyB0YXNrOiB7IGlkOiAyLCBuYW1lOiAnVCcgfSBhcyBuZXZlciB9KS5zaG91bGRTZXRUYXNrKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCd2YWxpZGF0ZXMgbGVnYWN5IGNvbnRleHQgY29udGludWF0aW9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNhbkNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCh7IGFnZW50RW50aXR5OiAndGFzaycgfSwgb3JjaGVzdHJhdG9yQWdlbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0KG51bGwsIG9yY2hlc3RyYXRvckFnZW50KSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdzZXNzaW9uIHJlc3RvcmUgcm91dGluZycsICgpID0+IHtcbiAgICBpdCgnbWFwcyBzbmFwc2hvdCBuYXYgcm91dGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVTZXNzaW9uUmVzdG9yZU5hdlJvdXRlKHsgYWdlbnRzTmF2QWN0aXZlOiAnbXlBZ2VudHMnIH0pKS50b0JlKCdteUFnZW50cycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUoeyBhZ2VudHNOYXZBY3RpdmU6ICdteVNraWxscycgfSkpLnRvQmUoJ215U2tpbGxzJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGFnZW50c05hdkFjdGl2ZTogJ21haWFrZXInIH0pKS50b0JlKCdtYWlha2VyJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGN1cnJlbnRPcHRpb246ICdjaGF0JywgYWN0aXZlQ2hhdElkOiAncy0xJyB9KSkudG9CZSgnY2hhdCcpXG4gICAgICBleHBlY3QocmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUoeyBjdXJyZW50T3B0aW9uOiAnaG9tZScgfSkpLnRvQmUoJ3NhdmVkT3B0aW9uJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGN1cnJlbnRPcHRpb246ICdpbnZhbGlkJyB9KSkudG9CZSgnbm9uZScpXG4gICAgfSlcblxuICAgIGl0KCdjb250cm9scyBhZ2VudHMgbG9hZCBicmFuY2hlcyBkdXJpbmcgcmVzdG9yZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUoJ215U2tpbGxzJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUoJ215QWdlbnRzJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkRmV0Y2hBZ2VudERldGFpbE9uU2Vzc2lvblJlc3RvcmUoJ2ExJywgJ21haWFrZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEZldGNoQWdlbnREZXRhaWxPblNlc3Npb25SZXN0b3JlKCdhMScsICdteUFnZW50cycpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlKCdteUFnZW50cycpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlKCdtYWlha2VyJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTZWxlY3RGZXRjaGVkQWdlbnRBZnRlclJlc3RvcmUoYWdlbnQoJzEnKSwgJ21haWFrZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNlbGVjdEZldGNoZWRBZ2VudEFmdGVyUmVzdG9yZShhZ2VudCgnMScpLCAnbXlBZ2VudHMnKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc3RvcmVzIGNoaXBzIHByb2plY3QgZnJvbSBzbmFwc2hvdCBob3N0IGNvbnRleHQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVTbmFwc2hvdENoaXBzUHJvamVjdCh7XG4gICAgICAgICAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZDogJzknLCBwcm9qZWN0TmFtZTogJ1AnLCBjbGllbnROYW1lOiAnQycgfSxcbiAgICAgICAgfSk/LnByb2plY3RJZFxuICAgICAgKS50b0JlKCc5JylcbiAgICAgIGV4cGVjdChyZXNvbHZlU25hcHNob3RDaGlwc1Byb2plY3QobnVsbCkpLnRvQmVOdWxsKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdsYXlvdXQgYW5kIG1vZGFsIHZpc2liaWxpdHkgaGVscGVycycsICgpID0+IHtcbiAgICBpdCgncmVzb2x2ZXMgc2VjdGlvbiBmbGFncyBhbmQgc2lkZWJhciB2aXNpYmlsaXR5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVDaGF0TW9kYWxTZWN0aW9uRmxhZ3Mob3B0aW9ucy5jaGF0LCBmYWxzZSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBzaG93TmV3Q2hhdDogZmFsc2UsXG4gICAgICAgIGlzTXlBZ2VudHNTZWN0aW9uOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzb2x2ZUNoYXRNb2RhbFNlY3Rpb25GbGFncyhvcHRpb25zLmhvbWUsIHRydWUpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IHRydWUsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYXRTaWRlYmFyKHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYXRTaWRlYmFyKHRydWUsIHRydWUpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgbWFpbiBjb250ZW50IHZpZXcgYW5kIGZvb3RlciB2aXNpYmlsaXR5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVDaGF0TW9kYWxNYWluQ29udGVudFZpZXcodHJ1ZSwgdHJ1ZSkpLnRvQmUoJ2Vycm9yJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQ2hhdE1vZGFsTWFpbkNvbnRlbnRWaWV3KGZhbHNlLCB0cnVlKSkudG9CZSgnY2hhdCcpXG4gICAgICBleHBlY3QocmVzb2x2ZUNoYXRNb2RhbE1haW5Db250ZW50VmlldyhmYWxzZSwgZmFsc2UpKS50b0JlKCdwcm9qZWN0U3VtbWFyeScpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7XG4gICAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgICAgaG9tZU9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGNoYXRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNDb3VudDogMCxcbiAgICAgICAgICBpc01haWFrZXJDcmVhdG9ySG9tZTogZmFsc2UsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGhhc0FjY2VzczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoe1xuICAgICAgICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBjaGF0T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgICAgYWdlbnRzQ291bnQ6IDAsXG4gICAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IGZhbHNlLFxuICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBoYXNBY2Nlc3M6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7XG4gICAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgaG9tZU9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGNoYXRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNDb3VudDogMixcbiAgICAgICAgICBpc01haWFrZXJDcmVhdG9ySG9tZTogZmFsc2UsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGhhc0FjY2VzczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnY292ZXJzIGZsb2F0aW5nIGRyYWcgYW5kIGVsZXZhdGVkIHBhbmVsIGJyYW5jaGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UoJ3NpZGViYXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UoJ2Zsb2F0aW5nJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkUGVyc2lzdERyYWdQb3NpdGlvbk9uRHJhZ0VuZCgnZmxvYXRpbmcnKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFN0YXJ0RmxvYXRpbmdQYW5lbERyYWcodHJ1ZSwgMCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydEZsb2F0aW5nUGFuZWxEcmFnKHRydWUsIDEpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlcigxLCAxKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlcigxLCAyKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCgndGFzaycpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNHbG9iYWxNYWlhU2VjdGlvbignaGVhZGVyJykpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NvdmVycyBkZWxldGUgYWdlbnQgYW5kIHNraWxscyBjYXRhbG9nIGd1YXJkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRSZXNlbGVjdEFnZW50QWZ0ZXJEZWxldGUoJ2ExJywgJ2ExJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNlbGVjdEFnZW50QWZ0ZXJEZWxldGUoJ2ExJywgJ2EyJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkT3BlblNraWxsc0NhdGFsb2codHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRPcGVuU2tpbGxzQ2F0YWxvZyhmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdoaWRlcyB0aGUgZm9vdGVyIG9uIG1haWFrZXIgaG9tZSwgZXJyb3JzLCBsb2FkaW5nIG9yIG1pc3NpbmcgYWNjZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBhZ2VudHNDb3VudDogMCxcbiAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IGZhbHNlLFxuICAgICAgICBoYXNFcnJvcjogZmFsc2UsXG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBoYXNBY2Nlc3M6IHRydWUsXG4gICAgICB9XG5cbiAgICAgIGV4cGVjdChzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyKHsgLi4uYmFzZSwgaXNNYWlha2VyQ3JlYXRvckhvbWU6IHRydWUgfSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7IC4uLmJhc2UsIGhhc0Vycm9yOiB0cnVlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoeyAuLi5iYXNlLCBsb2FkaW5nOiB0cnVlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoeyAuLi5iYXNlLCBoYXNBY2Nlc3M6IGZhbHNlIH0pKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnYnVpbGRzIHN0YXJ0LWNoYXQgcGF5bG9hZHMgYW5kIGRyYWcgcG9zaXRpb24gdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgYnVpbGRVc2VySW5pdGlhbE1lc3NhZ2VGcm9tU3RhcnRDaGF0KHtcbiAgICAgICAgICBtZXNzYWdlOiAnSG9sYScsXG4gICAgICAgICAgYXR0YWNobWVudHM6IFt7IGlkOiAnMScgfV0sXG4gICAgICAgICAgZmFxSWQ6ICdmYXEtMScsXG4gICAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ6ICdzdWctMScsXG4gICAgICAgICAgbWVudGlvbnM6IFt7IGlkOiAnbTEnIH1dLFxuICAgICAgICAgIGZ1YUlkOiAnZnVhLTEnLFxuICAgICAgICAgIHNjSWQ6ICdzYy0xJyxcbiAgICAgICAgICBjb250ZXh0RGF0YTogeyBwcm9qZWN0SWQ6IDEgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIG1lc3NhZ2U6ICdIb2xhJyxcbiAgICAgICAgZmFxSWQ6ICdmYXEtMScsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkOiAnc3VnLTEnLFxuICAgICAgICBtZW50aW9uczogW3sgaWQ6ICdtMScgfV0sXG4gICAgICAgIGZ1YUlkOiAnZnVhLTEnLFxuICAgICAgICBzY0lkOiAnc2MtMScsXG4gICAgICAgIGNvbnRleHREYXRhOiB7IHByb2plY3RJZDogMSB9LFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlKCdzaWRlYmFyJywgeyB4OiAxLCB5OiAyIH0sICh4LCB5KSA9PiAoeyB4LCB5IH0pLCB7XG4gICAgICAgICAgaW5uZXJXaWR0aDogMTAwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgcGFkOiAxNixcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMYXlvdXREcmFnUG9zaXRpb25VcGRhdGUoJ2Zsb2F0aW5nJywgbnVsbCwgKHgsIHkpID0+ICh7IHgsIHkgfSksIHtcbiAgICAgICAgICBpbm5lcldpZHRoOiAxMDAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBwYWQ6IDE2LFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNTg0LCB5OiAxNiB9KVxuXG4gICAgICBleHBlY3QocmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kKCdmbG9hdGluZycsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCgnc2lkZWJhcicsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdkaXNwYXRjaFNraWxsTWVudGlvbkluc2VydCcsICgpID0+IHtcbiAgICBpdCgnZGlzcGF0Y2hlcyB0aGUgc2tpbGwgbWVudGlvbiBhZnRlciB0d28gYW5pbWF0aW9uIGZyYW1lcycsICgpID0+IHtcbiAgICAgIGplc3QudXNlRmFrZVRpbWVycygpXG4gICAgICBjb25zdCByYWYgPSBqZXN0XG4gICAgICAgIC5zcHlPbih3aW5kb3csICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnKVxuICAgICAgICAubW9ja0ltcGxlbWVudGF0aW9uKGNhbGxiYWNrID0+IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKDApLCAwKSBhcyB1bmtub3duIGFzIG51bWJlcilcblxuICAgICAgY29uc3Qgb25JbnNlcnQgPSBqZXN0LmZuKClcbiAgICAgIGNvbnN0IG9uUmVmb2N1cyA9IGplc3QuZm4oKVxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1pbnNlcnQtc2tpbGwtbWVudGlvbicsIG9uSW5zZXJ0KVxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1pbnB1dC1yZWZvY3VzJywgb25SZWZvY3VzKVxuXG4gICAgICBkaXNwYXRjaFNraWxsTWVudGlvbkluc2VydCh7IGlkOiAnc2sxJywgbmFtZTogJ1Jlc3VtaXInIH0pXG5cbiAgICAgIGV4cGVjdChvbkluc2VydCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG5cbiAgICAgIGV4cGVjdChvbkluc2VydCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgICBleHBlY3Qob25SZWZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICAgIGNvbnN0IGV2ZW50ID0gb25JbnNlcnQubW9jay5jYWxsc1swXVswXSBhcyBDdXN0b21FdmVudFxuICAgICAgZXhwZWN0KGV2ZW50LmRldGFpbC5za2lsbCkudG9FcXVhbCh7IGlkOiAnc2sxJywgbmFtZTogJ1Jlc3VtaXInIH0pXG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtaW5zZXJ0LXNraWxsLW1lbnRpb24nLCBvbkluc2VydClcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtaW5wdXQtcmVmb2N1cycsIG9uUmVmb2N1cylcbiAgICAgIHJhZi5tb2NrUmVzdG9yZSgpXG4gICAgICBqZXN0LnVzZVJlYWxUaW1lcnMoKVxuICAgIH0pXG4gIH0pXG59KVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLFNBQVNBLFdBQVcsUUFBUSwyQkFBMkI7QUFFdkQsU0FBU0MsT0FBTyxRQUFRLGFBQWE7QUFDckMsU0FDRUMsMEJBQTBCLEVBQzFCQywwQkFBMEIsRUFDMUJDLDBCQUEwQixFQUMxQkMsNEJBQTRCLEVBQzVCQyx5QkFBeUIsRUFDekJDLDBCQUEwQixFQUMxQkMscUJBQXFCLEVBQ3JCQyw0QkFBNEIsRUFDNUJDLDRCQUE0QixFQUM1QkMsbUNBQW1DLEVBQ25DQywyQkFBMkIsRUFDM0JDLDJCQUEyQixFQUMzQkMsNkJBQTZCLEVBQzdCQywwQkFBMEIsRUFDMUJDLDRCQUE0QixFQUM1QkMsdUJBQXVCLEVBQ3ZCQyw4QkFBOEIsRUFDOUJDLCtCQUErQixFQUMvQkMsMEJBQTBCLEVBQzFCQyxnQ0FBZ0MsRUFDaENDLDBCQUEwQixFQUMxQkMsd0JBQXdCLEVBQ3hCQyw2QkFBNkIsRUFDN0JDLHVCQUF1QixFQUN2QkMsd0NBQXdD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
|