@projectcor/maia-components 2.49.0-beta.1 → 2.49.1-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/lib/App.js +44 -19
- package/lib/components/atoms/ActionableButton.spec.js +111 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
- package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +137 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
- package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
- package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
- package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
- package/lib/components/atoms/Chip/Chip.spec.js +82 -0
- package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
- package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
- package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
- package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
- package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
- package/lib/components/atoms/Expand/Expand.spec.js +57 -0
- package/lib/components/atoms/Fade/Fade.spec.js +31 -0
- package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
- package/lib/components/atoms/HelpButton.spec.js +87 -0
- package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
- package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
- package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
- package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
- package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.js +130 -177
- package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +641 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
- package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
- package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
- package/lib/components/atoms/NextPageLoader.spec.js +37 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
- package/lib/components/atoms/PrimaryButton.spec.js +42 -0
- package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +27 -13
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +79 -52
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
- package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
- package/lib/components/atoms/Switch/Switch.spec.js +41 -0
- package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
- package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
- package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
- package/lib/components/atoms/TextArea/TextArea.js +11 -20
- package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
- package/lib/components/atoms/ThirdButton.spec.js +29 -0
- package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
- package/lib/components/atoms/WithAppCfg.spec.js +82 -0
- package/lib/components/index.js +2 -1
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +742 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
- package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
- package/lib/components/molecules/AgentInputBlock/index.js +5 -0
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
- package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
- package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +285 -302
- package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
- package/lib/components/molecules/ChatAIHome/styles.js +85 -78
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +742 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +235 -245
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +541 -0
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
- package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +522 -4
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1394 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +250 -349
- package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1401 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +100 -93
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
- package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
- package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
- package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
- package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
- package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
- package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
- package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +65 -44
- package/lib/components/molecules/Sidebar/Sidebar.spec.js +464 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +310 -644
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
- package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
- package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
- package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
- package/lib/components/organisms/ChatAIPage/index.js +3 -0
- package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
- package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
- package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
- package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
- package/lib/constants/formatExtensions.js +7 -8
- package/lib/constants/formatExtensions.spec.js +14 -0
- package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
- package/lib/constants/maiaFeatureAccess.spec.js +30 -0
- package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
- package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
- package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
- package/lib/constants/permissions/index.js +2 -2
- package/lib/constants/permissions/utils.js +4 -1
- package/lib/constants/permissions/utils.spec.js +128 -0
- package/lib/constants/plannerSyncEvents.spec.js +31 -0
- package/lib/constants/taskUrls.spec.js +9 -0
- package/lib/dev/DevMaiaPage.js +30 -0
- package/lib/dev/DevReasoningTimeline.js +75 -86
- package/lib/dev/Providers.js +5 -3
- package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
- package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
- package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
- package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
- package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
- package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
- package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
- package/lib/hooks/useAgentSuggestions.spec.js +89 -0
- package/lib/hooks/useCaretPosition.spec.js +58 -0
- package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
- package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
- package/lib/hooks/useChatManager/useChatManager.js +272 -745
- package/lib/hooks/useChatManager/useChatManager.spec.js +2409 -0
- package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
- package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
- package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
- package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
- package/lib/hooks/useChats/useChats.spec.js +208 -0
- package/lib/hooks/useClientSearch.helpers.js +36 -0
- package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
- package/lib/hooks/useClientSearch.js +4 -32
- package/lib/hooks/useClientSearch.spec.js +86 -0
- package/lib/hooks/useContextMentions.helpers.js +212 -0
- package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
- package/lib/hooks/useContextMentions.js +5 -223
- package/lib/hooks/useContextMentions.spec.js +338 -0
- package/lib/hooks/useContextMentions.types.js +2 -0
- package/lib/hooks/useContextPinPopover.helpers.js +95 -0
- package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
- package/lib/hooks/useContextPinPopover.js +16 -75
- package/lib/hooks/useContextPinPopover.spec.js +159 -0
- package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
- package/lib/hooks/useDebounce.spec.js +42 -0
- package/lib/hooks/useEntitySearch.helpers.js +407 -0
- package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
- package/lib/hooks/useEntitySearch.js +52 -436
- package/lib/hooks/useEntitySearch.spec.js +718 -0
- package/lib/hooks/useEvent.spec.js +45 -0
- package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
- package/lib/hooks/useFrequentlyUsedActions.js +60 -22
- package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
- package/lib/hooks/useIsMaiaPageRoute.js +26 -0
- package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
- package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
- package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
- package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
- package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
- package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
- package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
- package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
- package/lib/hooks/useMentionPopover.helpers.js +41 -0
- package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
- package/lib/hooks/useMentionPopover.js +9 -35
- package/lib/hooks/useMentionPopover.spec.js +392 -0
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
- package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
- package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
- package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
- package/lib/hooks/useModal/useModal.spec.js +73 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +417 -0
- package/lib/hooks/useProjectSearch.helpers.js +61 -0
- package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
- package/lib/hooks/useProjectSearch.js +4 -58
- package/lib/hooks/useProjectSearch.spec.js +91 -0
- package/lib/hooks/useProjectSummary.spec.js +193 -0
- package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
- package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
- package/lib/hooks/useProjectSummaryConfig.js +14 -52
- package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
- package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
- package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
- package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
- package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
- package/lib/hooks/useRecentClientsSearch.js +4 -32
- package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
- package/lib/hooks/useRecentContexts.spec.js +139 -0
- package/lib/hooks/useResize.spec.js +37 -0
- package/lib/hooks/useSkillsCatalog.spec.js +88 -0
- package/lib/hooks/useSlashCommands.spec.js +139 -0
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
- package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
- package/lib/hooks/useStreamResponse.spec.js +199 -0
- package/lib/hooks/useT.spec.js +20 -0
- package/lib/hooks/useToggle.spec.js +33 -0
- package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
- package/lib/index.js +5 -2
- package/lib/lang/br/index.js +26 -7
- package/lib/lang/en/index.js +26 -7
- package/lib/lang/es/index.js +26 -7
- package/lib/lang/fr/index.js +26 -7
- package/lib/services/appcues.spec.js +37 -0
- package/lib/services/maia/Access/updateAccess.spec.js +137 -0
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
- package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
- package/lib/services/maia/Agents/connectors.spec.js +496 -0
- package/lib/services/maia/Agents/createAgent.spec.js +55 -0
- package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
- package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
- package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
- package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
- package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
- package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
- package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
- package/lib/services/maia/Agents/getAgents.js +90 -282
- package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
- package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
- package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
- package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
- package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
- package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
- package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
- package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
- package/lib/services/maia/Chats/patchChat.spec.js +41 -0
- package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
- package/lib/services/maia/Knowledge/delete.spec.js +45 -0
- package/lib/services/maia/Knowledge/download.spec.js +78 -0
- package/lib/services/maia/Knowledge/save.spec.js +58 -0
- package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
- package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +225 -0
- package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
- package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
- package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
- package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
- package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
- package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
- package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
- package/lib/services/maia/Skills/createSkill.spec.js +68 -0
- package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
- package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
- package/lib/services/maia/Skills/getSkills.spec.js +152 -0
- package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
- package/lib/services/maia/client.spec.js +56 -0
- package/lib/services/utils/fetchCOR.spec.js +211 -0
- package/lib/services/utils/getCookie.spec.js +20 -0
- package/lib/services/utils/mapChatMessages.helpers.js +223 -0
- package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
- package/lib/services/utils/mapChatMessages.js +25 -254
- package/lib/services/utils/mapChatMessages.spec.js +254 -0
- package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
- package/lib/store/maiaLastChatPersistence.spec.js +22 -0
- package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
- package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
- package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
- package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
- package/lib/store/sessions/sessionNotifications.js +35 -41
- package/lib/store/sessions/sessionNotifications.spec.js +106 -0
- package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
- package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
- package/lib/store/sessions/sessionStreamManager.js +209 -277
- package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
- package/lib/store/sessions/sessions.types.spec.js +16 -0
- package/lib/store/sessions/useSessionsStore.spec.js +135 -0
- package/lib/store/useChatsStore.spec.js +619 -0
- package/lib/store/useFaqsStore.spec.js +57 -0
- package/lib/styles/cascade.js +29 -3
- package/lib/styles/transitions.js +3 -1
- package/lib/test/mockSseStream.js +121 -0
- package/lib/test/streamdownCodeMock.js +6 -0
- package/lib/test/streamdownMock.js +12 -0
- package/lib/types/Chat.js +1 -1
- package/lib/types/agentModal.js +1 -1
- package/lib/types/global.d.js +1 -1
- package/lib/types/reasoning.js +1 -1
- package/lib/utils/actionCategoryMap.spec.js +18 -0
- package/lib/utils/agentDisplayName.spec.js +48 -0
- package/lib/utils/autoApproveStorage.spec.js +25 -0
- package/lib/utils/chatInputFiles.spec.js +39 -0
- package/lib/utils/contextMentionIcons.spec.js +41 -0
- package/lib/utils/contextMentionLabel.spec.js +13 -0
- package/lib/utils/contextMentionTriggers.spec.js +44 -0
- package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
- package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
- package/lib/utils/entityLinkRender.spec.js +72 -0
- package/lib/utils/fileDownloadHelper.spec.js +67 -0
- package/lib/utils/formatQuickActionMessage.spec.js +27 -0
- package/lib/utils/formatUnreadCount.spec.js +12 -0
- package/lib/utils/getUnitFileSize.spec.js +18 -0
- package/lib/utils/hitlAnalytics.spec.js +136 -0
- package/lib/utils/hoursPlannerQuickActionType.js +74 -1
- package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
- package/lib/utils/imagePreprocessor.helpers.js +28 -0
- package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
- package/lib/utils/imagePreprocessor.js +12 -37
- package/lib/utils/imagePreprocessor.spec.js +112 -0
- package/lib/utils/maiaPageRoute.js +24 -0
- package/lib/utils/maiaPageRoute.spec.js +23 -0
- package/lib/utils/mapBackendLang.spec.js +19 -0
- package/lib/utils/navigateContextEntity.spec.js +50 -0
- package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
- package/lib/utils/openTaskInCorPanel.spec.js +43 -0
- package/lib/utils/orchestratorSubagents.spec.js +32 -0
- package/lib/utils/reasoningMappers.spec.js +103 -0
- package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
- package/lib/utils/renderContextMentions.helpers.js +110 -0
- package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
- package/lib/utils/renderContextMentions.js +4 -110
- package/lib/utils/renderContextMentions.spec.js +268 -0
- package/lib/utils/retryCompletion.spec.js +181 -0
- package/lib/utils/skillContentSize.spec.js +13 -0
- package/lib/utils/slashCommandMarker.spec.js +43 -0
- package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
- package/lib/utils/sseStreamContent.spec.js +31 -0
- package/lib/utils/streamActivityMessages.helpers.js +223 -0
- package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
- package/lib/utils/streamActivityMessages.js +33 -238
- package/lib/utils/streamActivityMessages.spec.js +336 -0
- package/lib/utils/validateTrimmedFields.spec.js +26 -0
- package/package.json +2 -2
- package/README.md +0 -2
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
- package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
- package/lib/types/contextCompaction.js +0 -48
- package/lib/types/jest-dom.d.js +0 -2
|
@@ -0,0 +1,902 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
4
|
+
import _typeof from "@babel/runtime/helpers/typeof";
|
|
5
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
6
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
7
|
+
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; }
|
|
8
|
+
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; }
|
|
9
|
+
import { isHoursChargeTool } from '../../constants/plannerSyncEvents';
|
|
10
|
+
import { ChatHistoryRole } from '../../types/Chat';
|
|
11
|
+
import { reasoningStore } from '../useReasoningTrace';
|
|
12
|
+
import { buildReasoningTrace } from '../../utils/reasoningMappers';
|
|
13
|
+
import { resolveRetryTurnId } from '../../utils/retryCompletion';
|
|
14
|
+
/** Trace acumulado en vivo para `messageId`, o null si el store apunta a otro mensaje. */
|
|
15
|
+
export var reasoningTraceFor = function reasoningTraceFor(messageId) {
|
|
16
|
+
var snapshot = reasoningStore.getSnapshot(messageId);
|
|
17
|
+
if (!snapshot.steps.length) return null;
|
|
18
|
+
return buildReasoningTrace(snapshot.steps, snapshot.summary);
|
|
19
|
+
};
|
|
20
|
+
export var normalizeSendMessageArgs = function normalizeSendMessageArgs(attachmentsOrOptions) {
|
|
21
|
+
var _options$attachments;
|
|
22
|
+
if (Array.isArray(attachmentsOrOptions)) {
|
|
23
|
+
return {
|
|
24
|
+
attachments: attachmentsOrOptions,
|
|
25
|
+
options: {}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
var options = attachmentsOrOptions !== null && attachmentsOrOptions !== void 0 ? attachmentsOrOptions : {};
|
|
29
|
+
return {
|
|
30
|
+
attachments: (_options$attachments = options.attachments) !== null && _options$attachments !== void 0 ? _options$attachments : [],
|
|
31
|
+
options: options
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** chipsProject es la fuente de verdad del pin visible; si no hay pin, restaurar desde historial. */
|
|
36
|
+
export var resolveProjectToRequest = function resolveProjectToRequest(chipsProject, lastMessageProjectId) {
|
|
37
|
+
var chipsProjectId = chipsProject !== null && chipsProject !== void 0 && chipsProject.projectId ? Number(chipsProject.projectId) : null;
|
|
38
|
+
if (chipsProjectId != null && Number.isFinite(chipsProjectId)) {
|
|
39
|
+
return chipsProjectId;
|
|
40
|
+
}
|
|
41
|
+
if (lastMessageProjectId != null) {
|
|
42
|
+
var parsed = Number(lastMessageProjectId);
|
|
43
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
};
|
|
47
|
+
export var resolveClientPayload = function resolveClientPayload(ctxClient, ctxProject) {
|
|
48
|
+
var _ctxProject$client;
|
|
49
|
+
if (ctxClient !== null && ctxClient !== void 0 && ctxClient.id) {
|
|
50
|
+
return _objectSpread({
|
|
51
|
+
clientId: ctxClient.id
|
|
52
|
+
}, ctxClient.name ? {
|
|
53
|
+
clientName: ctxClient.name
|
|
54
|
+
} : {});
|
|
55
|
+
}
|
|
56
|
+
if ((ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.clientId) != null) {
|
|
57
|
+
return {
|
|
58
|
+
clientId: Number(ctxProject.clientId)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (ctxProject !== null && ctxProject !== void 0 && (_ctxProject$client = ctxProject.client) !== null && _ctxProject$client !== void 0 && _ctxProject$client.id) {
|
|
62
|
+
return _objectSpread({
|
|
63
|
+
clientId: ctxProject.client.id
|
|
64
|
+
}, ctxProject.client.name ? {
|
|
65
|
+
clientName: ctxProject.client.name
|
|
66
|
+
} : {});
|
|
67
|
+
}
|
|
68
|
+
return {};
|
|
69
|
+
};
|
|
70
|
+
export var normalizeAssistantAttachments = function normalizeAssistantAttachments(rawAttachments) {
|
|
71
|
+
if (!Array.isArray(rawAttachments)) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
return rawAttachments.filter(function (attachment) {
|
|
75
|
+
return !!attachment && _typeof(attachment) === 'object';
|
|
76
|
+
}).map(function (attachment, index) {
|
|
77
|
+
var name = typeof attachment.name === 'string' && attachment.name.trim() ? attachment.name.trim() : "file-".concat(index + 1);
|
|
78
|
+
var type = typeof attachment.type === 'string' && attachment.type.trim() ? attachment.type.trim() : 'pdf';
|
|
79
|
+
var mimeType = typeof attachment.mime_type === 'string' ? attachment.mime_type : '';
|
|
80
|
+
var fullFileName = name.includes('.') ? name : "".concat(name, ".").concat(type);
|
|
81
|
+
var numericSize = 0;
|
|
82
|
+
if (typeof attachment.size === 'number') {
|
|
83
|
+
numericSize = attachment.size;
|
|
84
|
+
} else {
|
|
85
|
+
var parsedSize = Number(attachment.size);
|
|
86
|
+
numericSize = Number.isFinite(parsedSize) ? parsedSize : 0;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
file: new File([], fullFileName, {
|
|
90
|
+
type: mimeType
|
|
91
|
+
}),
|
|
92
|
+
id: typeof attachment.id === 'string' && attachment.id.trim() ? attachment.id : "assistant-file-".concat(index, "-").concat(fullFileName),
|
|
93
|
+
name: name,
|
|
94
|
+
size: numericSize,
|
|
95
|
+
type: type,
|
|
96
|
+
url_original: typeof attachment.url_original === 'string' ? attachment.url_original : undefined,
|
|
97
|
+
url_thumbnail: typeof attachment.url_thumbnail === 'string' ? attachment.url_thumbnail : undefined,
|
|
98
|
+
url_file: typeof attachment.url_file === 'string' ? attachment.url_file : undefined,
|
|
99
|
+
role: attachment.role === 'assistant' ? 'assistant' : 'user'
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/** Extrae task_ids de los tool_args de pending_actions. */
|
|
105
|
+
export var extractTaskIdsFromPendingActionsArgs = function extractTaskIdsFromPendingActionsArgs(pendingActions) {
|
|
106
|
+
var ids = [];
|
|
107
|
+
var pushId = function pushId(raw) {
|
|
108
|
+
if (raw == null) return;
|
|
109
|
+
var n = parseInt(String(raw), 10);
|
|
110
|
+
if (!Number.isNaN(n)) ids.push(n);
|
|
111
|
+
};
|
|
112
|
+
pendingActions.forEach(function (action) {
|
|
113
|
+
var _rec$task_id;
|
|
114
|
+
if (!action || _typeof(action) !== 'object') return;
|
|
115
|
+
var args = action.tool_args;
|
|
116
|
+
if (!(args && _typeof(args) === 'object' && !Array.isArray(args))) return;
|
|
117
|
+
var rec = args;
|
|
118
|
+
pushId((_rec$task_id = rec.task_id) !== null && _rec$task_id !== void 0 ? _rec$task_id : rec.id);
|
|
119
|
+
if (Array.isArray(rec.task_ids)) {
|
|
120
|
+
rec.task_ids.forEach(pushId);
|
|
121
|
+
}
|
|
122
|
+
if (Array.isArray(rec.tasks)) {
|
|
123
|
+
rec.tasks.forEach(function (t) {
|
|
124
|
+
if (t && _typeof(t) === 'object' && !Array.isArray(t)) {
|
|
125
|
+
var _trec$task_id;
|
|
126
|
+
var trec = t;
|
|
127
|
+
pushId((_trec$task_id = trec.task_id) !== null && _trec$task_id !== void 0 ? _trec$task_id : trec.id);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return ids;
|
|
133
|
+
};
|
|
134
|
+
export var extractTaskIdsFromDeletePendingActions = function extractTaskIdsFromDeletePendingActions(pendingActions) {
|
|
135
|
+
var ids = [];
|
|
136
|
+
pendingActions.forEach(function (action) {
|
|
137
|
+
if (!action || _typeof(action) !== 'object') return;
|
|
138
|
+
var args = action.tool_args;
|
|
139
|
+
if (!(args && _typeof(args) === 'object' && !Array.isArray(args))) return;
|
|
140
|
+
var rec = args;
|
|
141
|
+
if (action.tool_name === 'delete_task') {
|
|
142
|
+
var _rec$task_id2;
|
|
143
|
+
var raw = (_rec$task_id2 = rec.task_id) !== null && _rec$task_id2 !== void 0 ? _rec$task_id2 : rec.id;
|
|
144
|
+
if (raw != null) {
|
|
145
|
+
var n = parseInt(String(raw), 10);
|
|
146
|
+
if (!Number.isNaN(n)) ids.push(n);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (action.tool_name === 'delete_tasks_batch') {
|
|
150
|
+
var list = rec.task_ids;
|
|
151
|
+
if (Array.isArray(list)) {
|
|
152
|
+
list.forEach(function (tid) {
|
|
153
|
+
var n = parseInt(String(tid), 10);
|
|
154
|
+
if (!Number.isNaN(n)) ids.push(n);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
return ids;
|
|
160
|
+
};
|
|
161
|
+
export var extractAgentIdFromEditAgentPendingActions = function extractAgentIdFromEditAgentPendingActions(pendingActions) {
|
|
162
|
+
var _rec$agent_id;
|
|
163
|
+
var editAction = pendingActions.find(function (a) {
|
|
164
|
+
return (a.tool_name || '').toLowerCase() === 'edit_agent';
|
|
165
|
+
});
|
|
166
|
+
if (!editAction || !editAction.tool_args || _typeof(editAction.tool_args) !== 'object' || Array.isArray(editAction.tool_args)) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
var rec = editAction.tool_args;
|
|
170
|
+
var raw = (_rec$agent_id = rec.agent_id) !== null && _rec$agent_id !== void 0 ? _rec$agent_id : rec.agentId;
|
|
171
|
+
return raw != null ? String(raw) : null;
|
|
172
|
+
};
|
|
173
|
+
export var extractAgentIdFromPendingActionsByToolName = function extractAgentIdFromPendingActionsByToolName(pendingActions, toolName) {
|
|
174
|
+
var _ref, _rec$agent_id2;
|
|
175
|
+
var action = pendingActions.find(function (a) {
|
|
176
|
+
return (a.tool_name || '').toLowerCase() === toolName.toLowerCase();
|
|
177
|
+
});
|
|
178
|
+
if (!action || !action.tool_args || _typeof(action.tool_args) !== 'object' || Array.isArray(action.tool_args)) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
var rec = action.tool_args;
|
|
182
|
+
var raw = (_ref = (_rec$agent_id2 = rec.agent_id) !== null && _rec$agent_id2 !== void 0 ? _rec$agent_id2 : rec.agentId) !== null && _ref !== void 0 ? _ref : rec.id;
|
|
183
|
+
return raw != null ? String(raw) : null;
|
|
184
|
+
};
|
|
185
|
+
export var extractTaskIdsFromAssistantDeletionText = function extractTaskIdsFromAssistantDeletionText(text) {
|
|
186
|
+
var labeled = text.match(/\bID\s*\*\*(\d+)\*\*/i);
|
|
187
|
+
if (labeled) {
|
|
188
|
+
var n = parseInt(labeled[1], 10);
|
|
189
|
+
return Number.isNaN(n) ? [] : [n];
|
|
190
|
+
}
|
|
191
|
+
var bold = text.match(/\*\*(\d{5,})\*\*/);
|
|
192
|
+
if (bold) {
|
|
193
|
+
var _n = parseInt(bold[1], 10);
|
|
194
|
+
return Number.isNaN(_n) ? [] : [_n];
|
|
195
|
+
}
|
|
196
|
+
return [];
|
|
197
|
+
};
|
|
198
|
+
export var TASK_CREATION_TOOLS = ['create_task', 'create_tasks_batch', 'clone_task'];
|
|
199
|
+
export var TASK_EDIT_TOOLS = ['edit_task', 'edit_tasks_batch', 'task_assign', 'task_unassign', 'update_task_type', 'update_estimated_hours', 'assign_task_label'];
|
|
200
|
+
export var TASK_DELETE_TOOLS = ['delete_task', 'delete_tasks_batch'];
|
|
201
|
+
export var isTaskEditToolName = function isTaskEditToolName(toolName) {
|
|
202
|
+
return !!toolName && TASK_EDIT_TOOLS.includes(toolName);
|
|
203
|
+
};
|
|
204
|
+
export var isTaskDeleteToolName = function isTaskDeleteToolName(toolName) {
|
|
205
|
+
return !!toolName && TASK_DELETE_TOOLS.includes(toolName);
|
|
206
|
+
};
|
|
207
|
+
var pendingActionsIncludeTool = function pendingActionsIncludeTool(pendingActions, tools) {
|
|
208
|
+
return pendingActions.some(function (action) {
|
|
209
|
+
return tools.includes(action.tool_name || '');
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
export var resolveApprovedPendingActionFlags = function resolveApprovedPendingActionFlags(hasApprovalInPreviousMessage, approvalStatus, pendingActions) {
|
|
213
|
+
var approved = hasApprovalInPreviousMessage && approvalStatus === 'approved';
|
|
214
|
+
return {
|
|
215
|
+
wasTaskCreation: hasApprovalInPreviousMessage && pendingActionsIncludeTool(pendingActions, TASK_CREATION_TOOLS),
|
|
216
|
+
wasTaskEdit: hasApprovalInPreviousMessage && pendingActionsIncludeTool(pendingActions, TASK_EDIT_TOOLS),
|
|
217
|
+
wasTaskDelete: hasApprovalInPreviousMessage && pendingActionsIncludeTool(pendingActions, TASK_DELETE_TOOLS),
|
|
218
|
+
wasCreateAgentApproved: approved && pendingActionsIncludeTool(pendingActions, ['create_agent']),
|
|
219
|
+
wasConfigureAgentAccessApproved: approved && pendingActions.some(function (action) {
|
|
220
|
+
return (action.tool_name || '').toLowerCase() === 'configure_agent_access';
|
|
221
|
+
}),
|
|
222
|
+
wasEditAgentApproved: approved && pendingActions.some(function (action) {
|
|
223
|
+
return (action.tool_name || '').toLowerCase() === 'edit_agent';
|
|
224
|
+
})
|
|
225
|
+
};
|
|
226
|
+
};
|
|
227
|
+
export var shouldSyncTaskDashboard = function shouldSyncTaskDashboard(hasApprovalInPreviousMessage, wasTaskCreation, wasTaskEdit, wasTaskDelete, taskIdsForDashboard) {
|
|
228
|
+
return hasApprovalInPreviousMessage && (wasTaskCreation || wasTaskEdit || wasTaskDelete) && taskIdsForDashboard.length > 0;
|
|
229
|
+
};
|
|
230
|
+
export var resolveTaskIdsForDashboard = function resolveTaskIdsForDashboard(content, taskUrlRegex, pendingActions, wasTaskDelete) {
|
|
231
|
+
var taskIdsFromUrls = _toConsumableArray(content.matchAll(taskUrlRegex)).map(function (match) {
|
|
232
|
+
return parseInt(match[1], 10);
|
|
233
|
+
});
|
|
234
|
+
var taskIdsFromDeleteApproval = extractTaskIdsFromDeletePendingActions(pendingActions);
|
|
235
|
+
var taskIdsFromDeletionText = wasTaskDelete && taskIdsFromUrls.length === 0 && taskIdsFromDeleteApproval.length === 0 ? extractTaskIdsFromAssistantDeletionText(content) : [];
|
|
236
|
+
if (taskIdsFromUrls.length > 0) return taskIdsFromUrls;
|
|
237
|
+
if (taskIdsFromDeleteApproval.length > 0) return taskIdsFromDeleteApproval;
|
|
238
|
+
return taskIdsFromDeletionText;
|
|
239
|
+
};
|
|
240
|
+
export var replaceTaskUrlsWithTabSegment = function replaceTaskUrlsWithTabSegment(content, taskUrlRegex, tabSegment) {
|
|
241
|
+
return content.replace(taskUrlRegex, function (url) {
|
|
242
|
+
return url.replace(/\/(detail|message|messages|files|history|hours)(?=$|\?)/, tabSegment);
|
|
243
|
+
});
|
|
244
|
+
};
|
|
245
|
+
export var resolveProjectDashboardSync = function resolveProjectDashboardSync(contextProjectId, pathname) {
|
|
246
|
+
var pathMatch = pathname.match(/^\/projects\/(\d+)\//);
|
|
247
|
+
var routeProjectId = pathMatch ? parseInt(pathMatch[1], 10) : null;
|
|
248
|
+
var isOnProjectRoute = Boolean(contextProjectId && routeProjectId && contextProjectId === routeProjectId);
|
|
249
|
+
return {
|
|
250
|
+
routeProjectId: routeProjectId,
|
|
251
|
+
isOnProjectRoute: isOnProjectRoute
|
|
252
|
+
};
|
|
253
|
+
};
|
|
254
|
+
export var resolveCreateAgentFollowUp = function resolveCreateAgentFollowUp(flags, multiAgentsAccess, completedAgentId, pendingActions) {
|
|
255
|
+
if (!multiAgentsAccess) return undefined;
|
|
256
|
+
if (flags.wasCreateAgentApproved && completedAgentId !== null && completedAgentId !== void 0 && completedAgentId.trim()) {
|
|
257
|
+
return {
|
|
258
|
+
agentId: completedAgentId.trim()
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
if (flags.wasConfigureAgentAccessApproved) {
|
|
262
|
+
var configuredAgentId = (completedAgentId === null || completedAgentId === void 0 ? void 0 : completedAgentId.trim()) || extractAgentIdFromPendingActionsByToolName(pendingActions, 'configure_agent_access');
|
|
263
|
+
if (configuredAgentId) {
|
|
264
|
+
return {
|
|
265
|
+
agentId: configuredAgentId
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return undefined;
|
|
270
|
+
};
|
|
271
|
+
export var resolveEditAgentFollowUp = function resolveEditAgentFollowUp(wasEditAgentApproved, completedAgentId, pendingActions) {
|
|
272
|
+
if (!wasEditAgentApproved) return undefined;
|
|
273
|
+
var resolvedAgentId = (completedAgentId === null || completedAgentId === void 0 ? void 0 : completedAgentId.trim()) || extractAgentIdFromEditAgentPendingActions(pendingActions);
|
|
274
|
+
return resolvedAgentId ? {
|
|
275
|
+
agentId: resolvedAgentId
|
|
276
|
+
} : undefined;
|
|
277
|
+
};
|
|
278
|
+
export var shouldRefetchOpenTaskPanel = function shouldRefetchOpenTaskPanel(openTaskPanelId, flags, manualFlags, affectedTaskIds) {
|
|
279
|
+
if (openTaskPanelId == null) return false;
|
|
280
|
+
var taskFlowActive = flags.wasTaskEdit || flags.wasTaskDelete || manualFlags.manualWasTaskEdit || manualFlags.manualWasTaskDelete;
|
|
281
|
+
if (!taskFlowActive) return false;
|
|
282
|
+
return affectedTaskIds.includes(String(openTaskPanelId));
|
|
283
|
+
};
|
|
284
|
+
export var resolveStreamErrorPresentation = function resolveStreamErrorPresentation(errorMessage, errorRawMessage) {
|
|
285
|
+
var _errorRawMessage$matc, _errorRawMessage$matc2;
|
|
286
|
+
var isAccessDenied = errorMessage === "Access denied: You don't have permission to access this agent";
|
|
287
|
+
var isPromptTooLong = errorMessage === 'invalid_request_error' && Boolean(errorRawMessage === null || errorRawMessage === void 0 ? void 0 : errorRawMessage.includes('prompt is too long'));
|
|
288
|
+
var tokensUsed = (_errorRawMessage$matc = errorRawMessage === null || errorRawMessage === void 0 || (_errorRawMessage$matc2 = errorRawMessage.match(/(\d+) tokens/)) === null || _errorRawMessage$matc2 === void 0 ? void 0 : _errorRawMessage$matc2[1]) !== null && _errorRawMessage$matc !== void 0 ? _errorRawMessage$matc : '';
|
|
289
|
+
return {
|
|
290
|
+
isAccessDenied: isAccessDenied,
|
|
291
|
+
isPromptTooLong: isPromptTooLong,
|
|
292
|
+
tokensUsed: tokensUsed,
|
|
293
|
+
showRetry: !isAccessDenied && !isPromptTooLong
|
|
294
|
+
};
|
|
295
|
+
};
|
|
296
|
+
export var resolveStreamErrorMessageKey = function resolveStreamErrorMessageKey(errorMessage, errorRawMessage) {
|
|
297
|
+
var presentation = resolveStreamErrorPresentation(errorMessage, errorRawMessage);
|
|
298
|
+
var messageKey = 'chat.error';
|
|
299
|
+
if (presentation.isAccessDenied) messageKey = 'chat.errorAccessDenied';else if (presentation.isPromptTooLong) messageKey = 'chat.errorPromptTooLong';
|
|
300
|
+
return {
|
|
301
|
+
messageKey: messageKey,
|
|
302
|
+
tokensUsed: presentation.tokensUsed,
|
|
303
|
+
showRetry: presentation.showRetry
|
|
304
|
+
};
|
|
305
|
+
};
|
|
306
|
+
export var resolveProjectDashboardMutation = function resolveProjectDashboardMutation(flags) {
|
|
307
|
+
if (flags.wasTaskCreation) return 'create';
|
|
308
|
+
if (flags.wasTaskEdit) return 'edit';
|
|
309
|
+
if (flags.wasTaskDelete) return 'delete';
|
|
310
|
+
return null;
|
|
311
|
+
};
|
|
312
|
+
export var applyProjectDashboardMutation = function applyProjectDashboardMutation(mutation, taskIds, dashboard) {
|
|
313
|
+
var _dashboard$deleteExis;
|
|
314
|
+
if (!mutation || !dashboard) return;
|
|
315
|
+
if (mutation === 'create') {
|
|
316
|
+
var _dashboard$addExistin;
|
|
317
|
+
(_dashboard$addExistin = dashboard.addExistingTaskToDashboard) === null || _dashboard$addExistin === void 0 || _dashboard$addExistin.call(dashboard, taskIds);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
if (mutation === 'edit') {
|
|
321
|
+
var _dashboard$editExisti;
|
|
322
|
+
(_dashboard$editExisti = dashboard.editExistingTaskInDashboard) === null || _dashboard$editExisti === void 0 || _dashboard$editExisti.call(dashboard, taskIds);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
(_dashboard$deleteExis = dashboard.deleteExistingTaskFromDashboard) === null || _dashboard$deleteExis === void 0 || _dashboard$deleteExis.call(dashboard, taskIds);
|
|
326
|
+
};
|
|
327
|
+
export var mergeAffectedTaskIdsForPanelRefetch = function mergeAffectedTaskIdsForPanelRefetch(pendingActions, taskIdsForDashboard, manualApproval) {
|
|
328
|
+
var manualPseudoActions = [];
|
|
329
|
+
if (manualApproval) {
|
|
330
|
+
var _manualApproval$toolA;
|
|
331
|
+
manualPseudoActions.push({
|
|
332
|
+
tool_name: manualApproval.toolName,
|
|
333
|
+
tool_args: (_manualApproval$toolA = manualApproval.toolArgs) !== null && _manualApproval$toolA !== void 0 ? _manualApproval$toolA : {},
|
|
334
|
+
thread_id: 'manual',
|
|
335
|
+
tool_call_id: 'manual'
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
return [].concat(_toConsumableArray(extractTaskIdsFromPendingActionsArgs(pendingActions)), _toConsumableArray(taskIdsForDashboard), _toConsumableArray(extractTaskIdsFromPendingActionsArgs(manualPseudoActions))).map(String);
|
|
339
|
+
};
|
|
340
|
+
export var mapAuthUserToChatMessageUser = function mapAuthUserToChatMessageUser(authUser) {
|
|
341
|
+
return {
|
|
342
|
+
id: authUser.id.toString(),
|
|
343
|
+
name: authUser.firstName,
|
|
344
|
+
avatar: authUser.picture
|
|
345
|
+
};
|
|
346
|
+
};
|
|
347
|
+
export var findMessageWithApprovalInList = function findMessageWithApprovalInList(threadIds, messages, sessionId) {
|
|
348
|
+
var found = messages.find(function (message) {
|
|
349
|
+
var _message$approval;
|
|
350
|
+
return (_message$approval = message.approval) === null || _message$approval === void 0 || (_message$approval = _message$approval.pending_actions) === null || _message$approval === void 0 ? void 0 : _message$approval.some(function (action) {
|
|
351
|
+
return threadIds.includes(action.thread_id);
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
if (found !== null && found !== void 0 && found.approval) {
|
|
355
|
+
return {
|
|
356
|
+
message: found,
|
|
357
|
+
sessionId: found.approval.session_id || sessionId
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
return null;
|
|
361
|
+
};
|
|
362
|
+
export var canSendChatMessage = function canSendChatMessage(isProcessing, waitingResponse, loadingMessages) {
|
|
363
|
+
return !(isProcessing || waitingResponse || loadingMessages);
|
|
364
|
+
};
|
|
365
|
+
export var shouldBlockConcurrentStreamStart = function shouldBlockConcurrentStreamStart(willStartNewStream, activeCount, maxConcurrent) {
|
|
366
|
+
return willStartNewStream && activeCount >= maxConcurrent;
|
|
367
|
+
};
|
|
368
|
+
export var resolveSendMessageGate = function resolveSendMessageGate(params) {
|
|
369
|
+
if (!canSendChatMessage(params.isProcessing, params.waitingResponse, params.loadingMessages)) {
|
|
370
|
+
return 'busy';
|
|
371
|
+
}
|
|
372
|
+
if (shouldBlockConcurrentStreamStart(params.willStartNewStream, params.activeStreamCount, params.maxConcurrent)) {
|
|
373
|
+
return 'concurrency';
|
|
374
|
+
}
|
|
375
|
+
return null;
|
|
376
|
+
};
|
|
377
|
+
export var resolveSendMessagePayloadFields = function resolveSendMessagePayloadFields(options, positional) {
|
|
378
|
+
var _positional$faqId, _positional$agentSugg, _positional$mentions, _positional$fuaId, _positional$scId, _positional$contextDa;
|
|
379
|
+
return {
|
|
380
|
+
faqId: (_positional$faqId = positional === null || positional === void 0 ? void 0 : positional.faqId) !== null && _positional$faqId !== void 0 ? _positional$faqId : options.faqId,
|
|
381
|
+
agentSuggestionId: (_positional$agentSugg = positional === null || positional === void 0 ? void 0 : positional.agentSuggestionId) !== null && _positional$agentSugg !== void 0 ? _positional$agentSugg : options.agentSuggestionId,
|
|
382
|
+
mentions: (_positional$mentions = positional === null || positional === void 0 ? void 0 : positional.mentions) !== null && _positional$mentions !== void 0 ? _positional$mentions : options.mentions,
|
|
383
|
+
fuaId: (_positional$fuaId = positional === null || positional === void 0 ? void 0 : positional.fuaId) !== null && _positional$fuaId !== void 0 ? _positional$fuaId : options.fuaId,
|
|
384
|
+
scId: (_positional$scId = positional === null || positional === void 0 ? void 0 : positional.scId) !== null && _positional$scId !== void 0 ? _positional$scId : options.scId,
|
|
385
|
+
contextData: (_positional$contextDa = positional === null || positional === void 0 ? void 0 : positional.contextData) !== null && _positional$contextDa !== void 0 ? _positional$contextDa : options.contextData
|
|
386
|
+
};
|
|
387
|
+
};
|
|
388
|
+
export var buildChatHistoryFromMessages = function buildChatHistoryFromMessages(messages, authUserId) {
|
|
389
|
+
return messages.map(function (historyMessage) {
|
|
390
|
+
return {
|
|
391
|
+
content: historyMessage.message,
|
|
392
|
+
role: historyMessage.user.id === authUserId ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
|
|
393
|
+
};
|
|
394
|
+
});
|
|
395
|
+
};
|
|
396
|
+
export var resolveLastMessageAgentId = function resolveLastMessageAgentId(messages) {
|
|
397
|
+
var _messages$at;
|
|
398
|
+
return (_messages$at = messages.at(-1)) === null || _messages$at === void 0 ? void 0 : _messages$at.agentId;
|
|
399
|
+
};
|
|
400
|
+
export var resolveAgentIdForStream = function resolveAgentIdForStream(agentIdFromMessages, fallbackAgentId) {
|
|
401
|
+
return agentIdFromMessages || fallbackAgentId || '';
|
|
402
|
+
};
|
|
403
|
+
export var resolveUserQuestionMessageId = function resolveUserQuestionMessageId(turnMessageId) {
|
|
404
|
+
return "question-".concat(turnMessageId);
|
|
405
|
+
};
|
|
406
|
+
export var buildMaiaStreamRequestPayload = function buildMaiaStreamRequestPayload(params) {
|
|
407
|
+
var _params$ctxProject, _params$ctxTask;
|
|
408
|
+
return _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
409
|
+
message: params.message,
|
|
410
|
+
history: params.history,
|
|
411
|
+
projectId: params.projectId,
|
|
412
|
+
lang: params.authUser.lang,
|
|
413
|
+
userId: params.authUser.id.toString(),
|
|
414
|
+
firstName: params.authUser.firstName,
|
|
415
|
+
lastName: params.authUser.lastName,
|
|
416
|
+
companyId: params.authUser.company_id.toString(),
|
|
417
|
+
chatId: params.chatId,
|
|
418
|
+
messageId: params.messageId,
|
|
419
|
+
agentName: params.agentName,
|
|
420
|
+
agentId: params.agentId,
|
|
421
|
+
isWebSearchActive: params.isWebSearchActive,
|
|
422
|
+
isDeepSearchActive: params.isDeepSearchActive,
|
|
423
|
+
isAutoApproveActive: params.isAutoApproveActive
|
|
424
|
+
}, ((_params$ctxProject = params.ctxProject) === null || _params$ctxProject === void 0 ? void 0 : _params$ctxProject.feeId) != null ? {
|
|
425
|
+
feeId: Number(params.ctxProject.feeId)
|
|
426
|
+
} : {}), resolveClientPayload(params.ctxClient, params.ctxProject)), params.projectName ? {
|
|
427
|
+
projectName: params.projectName
|
|
428
|
+
} : {}), ((_params$ctxTask = params.ctxTask) === null || _params$ctxTask === void 0 ? void 0 : _params$ctxTask.id) != null ? _objectSpread({
|
|
429
|
+
taskId: Number(params.ctxTask.id)
|
|
430
|
+
}, params.ctxTask.name ? {
|
|
431
|
+
taskName: params.ctxTask.name
|
|
432
|
+
} : {}) : {}), params.attachments && params.attachments.length > 0 ? {
|
|
433
|
+
attachments: params.attachments
|
|
434
|
+
} : {}), params.faqId ? {
|
|
435
|
+
faqId: params.faqId
|
|
436
|
+
} : {}), params.agentSuggestionId ? {
|
|
437
|
+
agentSuggestionId: params.agentSuggestionId
|
|
438
|
+
} : {}), params.fuaId ? {
|
|
439
|
+
fuaId: params.fuaId
|
|
440
|
+
} : {}), params.scId ? {
|
|
441
|
+
scId: params.scId
|
|
442
|
+
} : {}), params.agentEntity != null ? {
|
|
443
|
+
agentEntity: params.agentEntity
|
|
444
|
+
} : {}), params.agentType != null ? {
|
|
445
|
+
agentType: params.agentType
|
|
446
|
+
} : {}), params.agentEmoji != null ? {
|
|
447
|
+
agentEmoji: params.agentEmoji
|
|
448
|
+
} : {}), params.contextMessage ? {
|
|
449
|
+
contextMessage: params.contextMessage
|
|
450
|
+
} : {}), params.contextData ? {
|
|
451
|
+
contextData: params.contextData
|
|
452
|
+
} : {});
|
|
453
|
+
};
|
|
454
|
+
export var buildMaiaStreamRequestPayloadForProjectChange = function buildMaiaStreamRequestPayloadForProjectChange(params) {
|
|
455
|
+
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
456
|
+
message: params.message,
|
|
457
|
+
history: params.history,
|
|
458
|
+
projectId: params.project.id,
|
|
459
|
+
lang: params.authUser.lang,
|
|
460
|
+
userId: params.authUser.id.toString(),
|
|
461
|
+
firstName: params.authUser.firstName,
|
|
462
|
+
lastName: params.authUser.lastName,
|
|
463
|
+
companyId: params.authUser.company_id.toString(),
|
|
464
|
+
chatId: params.chatId,
|
|
465
|
+
messageId: params.messageId,
|
|
466
|
+
agentName: params.agentName,
|
|
467
|
+
agentId: params.agentId,
|
|
468
|
+
isWebSearchActive: params.isWebSearchActive,
|
|
469
|
+
isDeepSearchActive: params.isDeepSearchActive,
|
|
470
|
+
isAutoApproveActive: params.isAutoApproveActive
|
|
471
|
+
}, params.project.feeId != null ? {
|
|
472
|
+
feeId: Number(params.project.feeId)
|
|
473
|
+
} : {}), params.project.clientId != null ? {
|
|
474
|
+
clientId: Number(params.project.clientId)
|
|
475
|
+
} : {}), params.agentEntity != null ? {
|
|
476
|
+
agentEntity: params.agentEntity
|
|
477
|
+
} : {}), params.agentType != null ? {
|
|
478
|
+
agentType: params.agentType
|
|
479
|
+
} : {});
|
|
480
|
+
};
|
|
481
|
+
export var resolveStreamErrorHandlingMode = function resolveStreamErrorHandlingMode(hasRetrySnapshot) {
|
|
482
|
+
return hasRetrySnapshot ? 'retry-restore' : 'commit-error';
|
|
483
|
+
};
|
|
484
|
+
export var resolveStreamErrorAssistantMessageId = function resolveStreamErrorAssistantMessageId(messageId) {
|
|
485
|
+
return "answer-".concat(messageId);
|
|
486
|
+
};
|
|
487
|
+
export var buildStreamErrorAssistantMessage = function buildStreamErrorAssistantMessage(params) {
|
|
488
|
+
return _objectSpread(_objectSpread({
|
|
489
|
+
id: resolveStreamErrorAssistantMessageId(params.messageId),
|
|
490
|
+
message: params.message,
|
|
491
|
+
isError: true
|
|
492
|
+
}, params.showRetry ? {
|
|
493
|
+
suggestions: [params.retryLabel]
|
|
494
|
+
} : {}), {}, {
|
|
495
|
+
date: new Date(),
|
|
496
|
+
user: {
|
|
497
|
+
id: 'assistant',
|
|
498
|
+
name: 'Assistant'
|
|
499
|
+
},
|
|
500
|
+
role: ChatHistoryRole.ASSISTANT
|
|
501
|
+
});
|
|
502
|
+
};
|
|
503
|
+
/** HITL pre-aprobado (manual/auto): el stream sigue sin pintar la caja de aprobación. */
|
|
504
|
+
export var shouldSkipHitlApprovalUi = function shouldSkipHitlApprovalUi(approval) {
|
|
505
|
+
return Boolean(approval.manual_approval_detected || approval.auto_approved || approval.approval_status === 'approved');
|
|
506
|
+
};
|
|
507
|
+
export var resolveHitlApprovalRequiredOutcome = function resolveHitlApprovalRequiredOutcome(approval) {
|
|
508
|
+
return shouldSkipHitlApprovalUi(approval) ? {
|
|
509
|
+
type: 'skip-ui'
|
|
510
|
+
} : {
|
|
511
|
+
type: 'show-ui',
|
|
512
|
+
approvalMessageId: "approval-".concat(approval.original_thread_id)
|
|
513
|
+
};
|
|
514
|
+
};
|
|
515
|
+
export var buildHitlApprovalPendingMessage = function buildHitlApprovalPendingMessage(params) {
|
|
516
|
+
return {
|
|
517
|
+
id: params.approvalMessageId,
|
|
518
|
+
message: params.accumulatedContent || '',
|
|
519
|
+
date: new Date(),
|
|
520
|
+
user: {
|
|
521
|
+
id: 'assistant',
|
|
522
|
+
name: 'Assistant'
|
|
523
|
+
},
|
|
524
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
525
|
+
approval: params.approval,
|
|
526
|
+
approvalStatus: 'pending',
|
|
527
|
+
reasoning: params.reasoning
|
|
528
|
+
};
|
|
529
|
+
};
|
|
530
|
+
export var shouldPreserveReasoningOnStreamStop = function shouldPreserveReasoningOnStreamStop(stoppedTrace) {
|
|
531
|
+
return Boolean(stoppedTrace === null || stoppedTrace === void 0 ? void 0 : stoppedTrace.steps.length);
|
|
532
|
+
};
|
|
533
|
+
export var buildStreamStopPartialAssistantMessage = function buildStreamStopPartialAssistantMessage(params) {
|
|
534
|
+
return _objectSpread({
|
|
535
|
+
id: params.finalMessageId,
|
|
536
|
+
message: params.partialText,
|
|
537
|
+
date: new Date(),
|
|
538
|
+
user: {
|
|
539
|
+
id: 'assistant',
|
|
540
|
+
name: 'Assistant'
|
|
541
|
+
},
|
|
542
|
+
role: ChatHistoryRole.ASSISTANT
|
|
543
|
+
}, params.stoppedTrace ? {
|
|
544
|
+
reasoning: params.stoppedTrace
|
|
545
|
+
} : {});
|
|
546
|
+
};
|
|
547
|
+
export var buildStreamStopCancelledAssistantMessage = function buildStreamStopCancelledAssistantMessage(params) {
|
|
548
|
+
return {
|
|
549
|
+
id: params.cancelledMessageId,
|
|
550
|
+
message: params.cancelledLabel,
|
|
551
|
+
date: new Date(),
|
|
552
|
+
user: {
|
|
553
|
+
id: 'assistant',
|
|
554
|
+
name: 'Assistant'
|
|
555
|
+
},
|
|
556
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
557
|
+
isFrontendCancelled: true
|
|
558
|
+
};
|
|
559
|
+
};
|
|
560
|
+
export var resolveRetryBlockReason = function resolveRetryBlockReason(params) {
|
|
561
|
+
if (params.isProcessing || params.waitingResponse || params.loadingMessages) return 'busy';
|
|
562
|
+
if (params.isSessionStreamActive) return 'session-active';
|
|
563
|
+
if (params.activeStreamCount >= params.maxConcurrent) return 'concurrency';
|
|
564
|
+
return null;
|
|
565
|
+
};
|
|
566
|
+
export var shouldUseOrchestratorRetryFallback = function shouldUseOrchestratorRetryFallback(message) {
|
|
567
|
+
var _message$memorySessio;
|
|
568
|
+
return Boolean(message.isFrontendCancelled && !((_message$memorySessio = message.memorySessionId) !== null && _message$memorySessio !== void 0 && _message$memorySessio.trim()));
|
|
569
|
+
};
|
|
570
|
+
export var resolveRetryEligibility = function resolveRetryEligibility(previousMessages, message, userMessage) {
|
|
571
|
+
var _userMessage$message, _userMessage$attachme, _userMessage$sources;
|
|
572
|
+
if (!previousMessages.some(function (item) {
|
|
573
|
+
return item.id === message.id;
|
|
574
|
+
})) {
|
|
575
|
+
return {
|
|
576
|
+
eligible: false,
|
|
577
|
+
reason: 'not-in-thread'
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
if (!(userMessage !== null && userMessage !== void 0 && (_userMessage$message = userMessage.message) !== null && _userMessage$message !== void 0 && _userMessage$message.trim()) && !(userMessage !== null && userMessage !== void 0 && (_userMessage$attachme = userMessage.attachments) !== null && _userMessage$attachme !== void 0 && _userMessage$attachme.length) && !(userMessage !== null && userMessage !== void 0 && (_userMessage$sources = userMessage.sources) !== null && _userMessage$sources !== void 0 && _userMessage$sources.length)) {
|
|
581
|
+
return {
|
|
582
|
+
eligible: false,
|
|
583
|
+
reason: 'empty-user'
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
var turnId = resolveRetryTurnId(message);
|
|
587
|
+
var useOrchestratorFallback = shouldUseOrchestratorRetryFallback(message);
|
|
588
|
+
if (!turnId && !useOrchestratorFallback) {
|
|
589
|
+
return {
|
|
590
|
+
eligible: false,
|
|
591
|
+
reason: 'no-turn'
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
return {
|
|
595
|
+
eligible: true,
|
|
596
|
+
turnId: turnId,
|
|
597
|
+
useOrchestratorFallback: useOrchestratorFallback
|
|
598
|
+
};
|
|
599
|
+
};
|
|
600
|
+
export var resolveRetryUserAttachments = function resolveRetryUserAttachments(userMessage) {
|
|
601
|
+
if (Array.isArray(userMessage.attachments)) return userMessage.attachments;
|
|
602
|
+
if (Array.isArray(userMessage.sources)) return userMessage.sources;
|
|
603
|
+
return [];
|
|
604
|
+
};
|
|
605
|
+
export var shouldUpdateProjectOnChange = function shouldUpdateProjectOnChange(nextProjectId, currentProjectId) {
|
|
606
|
+
return nextProjectId !== currentProjectId;
|
|
607
|
+
};
|
|
608
|
+
export var shouldResendAfterProjectChange = function shouldResendAfterProjectChange(userQuestion, project) {
|
|
609
|
+
return Boolean(userQuestion && project);
|
|
610
|
+
};
|
|
611
|
+
export var resolveApprovalDecisionStatus = function resolveApprovalDecisionStatus(decision) {
|
|
612
|
+
return decision === 'approve' ? 'approved' : 'rejected';
|
|
613
|
+
};
|
|
614
|
+
export var resolveContinueStreamDecision = function resolveContinueStreamDecision(decision, editedActions) {
|
|
615
|
+
return editedActions ? 'edit' : decision;
|
|
616
|
+
};
|
|
617
|
+
export var resolveApprovalStreamBlockReason = function resolveApprovalStreamBlockReason(params) {
|
|
618
|
+
var _params$threadIds;
|
|
619
|
+
if (!((_params$threadIds = params.threadIds) !== null && _params$threadIds !== void 0 && _params$threadIds.length)) return 'missing-threads';
|
|
620
|
+
if (!params.hasApprovalMessage) return 'missing-approval';
|
|
621
|
+
if (!params.sessionId) return 'missing-session';
|
|
622
|
+
if (params.isSessionStreamActive) return 'session-active';
|
|
623
|
+
if (params.activeStreamCount >= params.maxConcurrent) return 'limit';
|
|
624
|
+
return null;
|
|
625
|
+
};
|
|
626
|
+
|
|
627
|
+
/** Tools de carga de horas a sincronizar con Planner al cerrar un stream (HITL aprobado). */
|
|
628
|
+
export var resolveHoursChargeToolsOnStreamFinish = function resolveHoursChargeToolsOnStreamFinish(hasApprovalInPreviousMessage, approvalStatus, pendingActions, manualApprovalToolName) {
|
|
629
|
+
var hoursToolsFromApproval = pendingActions.map(function (action) {
|
|
630
|
+
return action.tool_name;
|
|
631
|
+
}).filter(function (toolName) {
|
|
632
|
+
return isHoursChargeTool(toolName);
|
|
633
|
+
});
|
|
634
|
+
var wasHoursChargeApproved = hasApprovalInPreviousMessage && approvalStatus === 'approved' && hoursToolsFromApproval.length > 0;
|
|
635
|
+
if (wasHoursChargeApproved) {
|
|
636
|
+
return hoursToolsFromApproval;
|
|
637
|
+
}
|
|
638
|
+
if (isHoursChargeTool(manualApprovalToolName)) {
|
|
639
|
+
return manualApprovalToolName ? [manualApprovalToolName] : [];
|
|
640
|
+
}
|
|
641
|
+
return [];
|
|
642
|
+
};
|
|
643
|
+
export var findMessageWithApprovalByThreadIds = function findMessageWithApprovalByThreadIds(threadIds, activeMessages, sessionMessagesById, activeSessionId) {
|
|
644
|
+
var fromActiveView = findMessageWithApprovalInList(threadIds, activeMessages, activeSessionId || '');
|
|
645
|
+
if (fromActiveView) return fromActiveView;
|
|
646
|
+
var sessionEntry = Object.entries(sessionMessagesById).find(function (_ref2) {
|
|
647
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
648
|
+
sessionMessages = _ref3[1];
|
|
649
|
+
return sessionMessages.some(function (message) {
|
|
650
|
+
var _message$approval2;
|
|
651
|
+
return (_message$approval2 = message.approval) === null || _message$approval2 === void 0 || (_message$approval2 = _message$approval2.pending_actions) === null || _message$approval2 === void 0 ? void 0 : _message$approval2.some(function (action) {
|
|
652
|
+
return threadIds.includes(action.thread_id);
|
|
653
|
+
});
|
|
654
|
+
});
|
|
655
|
+
});
|
|
656
|
+
if (!sessionEntry) return null;
|
|
657
|
+
var _sessionEntry = _slicedToArray(sessionEntry, 2),
|
|
658
|
+
sessionId = _sessionEntry[0],
|
|
659
|
+
sessionMessages = _sessionEntry[1];
|
|
660
|
+
return findMessageWithApprovalInList(threadIds, sessionMessages, sessionId);
|
|
661
|
+
};
|
|
662
|
+
export var resolveStreamFinishFinalMessageId = function resolveStreamFinishFinalMessageId(memorySessionId) {
|
|
663
|
+
return "answer-".concat(memorySessionId);
|
|
664
|
+
};
|
|
665
|
+
export var resolveStreamStopMessageIds = function resolveStreamStopMessageIds(currentMessageId) {
|
|
666
|
+
return {
|
|
667
|
+
finalMessageId: "answer-".concat(currentMessageId),
|
|
668
|
+
cancelledMessageId: "answer-".concat(currentMessageId, "-cancelled")
|
|
669
|
+
};
|
|
670
|
+
};
|
|
671
|
+
export var resolveRentabilidadProjectFaqMessage = function resolveRentabilidadProjectFaqMessage(message, rentabilidadLabel, incomeType) {
|
|
672
|
+
if (message !== rentabilidadLabel) return message;
|
|
673
|
+
return "FAQ: ".concat(rentabilidadLabel, " - Tipo de rentabilidad: ").concat(incomeType !== null && incomeType !== void 0 ? incomeType : '');
|
|
674
|
+
};
|
|
675
|
+
export var resolveStreamErrorUserMessage = function resolveStreamErrorUserMessage(messageKey, translate, tokensUsed) {
|
|
676
|
+
if (messageKey === 'chat.errorAccessDenied') return translate('chat.errorAccessDenied');
|
|
677
|
+
if (messageKey === 'chat.errorPromptTooLong') return translate('chat.errorPromptTooLong', {
|
|
678
|
+
used: tokensUsed
|
|
679
|
+
});
|
|
680
|
+
return translate('chat.error');
|
|
681
|
+
};
|
|
682
|
+
export var resolvePreviousAssistantMessageBeforePlaceholder = function resolvePreviousAssistantMessageBeforePlaceholder(messages, placeholderId) {
|
|
683
|
+
return messages.filter(function (message) {
|
|
684
|
+
return message.id !== placeholderId;
|
|
685
|
+
}).at(-1);
|
|
686
|
+
};
|
|
687
|
+
export var resolveHitlExecutionContext = function resolveHitlExecutionContext(approval, accumulatedContent) {
|
|
688
|
+
var _approval$pending_act, _approval$pending_act2;
|
|
689
|
+
return {
|
|
690
|
+
messageId: "approval-".concat(approval.original_thread_id),
|
|
691
|
+
messageText: accumulatedContent || '',
|
|
692
|
+
approval: approval,
|
|
693
|
+
pendingActions: approval.pending_actions,
|
|
694
|
+
threadIds: (_approval$pending_act = (_approval$pending_act2 = approval.pending_actions) === null || _approval$pending_act2 === void 0 ? void 0 : _approval$pending_act2.map(function (action) {
|
|
695
|
+
return action.thread_id;
|
|
696
|
+
}).filter(function (threadId) {
|
|
697
|
+
return Boolean(threadId);
|
|
698
|
+
})) !== null && _approval$pending_act !== void 0 ? _approval$pending_act : []
|
|
699
|
+
};
|
|
700
|
+
};
|
|
701
|
+
export var resolveSkippedHitlManualApproval = function resolveSkippedHitlManualApproval(approval) {
|
|
702
|
+
var _approval$pending_act3, _ref4, _tool_name, _tool_args;
|
|
703
|
+
var firstAction = (_approval$pending_act3 = approval.pending_actions) === null || _approval$pending_act3 === void 0 ? void 0 : _approval$pending_act3[0];
|
|
704
|
+
var toolName = (_ref4 = (_tool_name = approval.tool_name) !== null && _tool_name !== void 0 ? _tool_name : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_name) !== null && _ref4 !== void 0 ? _ref4 : '';
|
|
705
|
+
if (!toolName) return null;
|
|
706
|
+
var toolArgs = ((_tool_args = approval.tool_args) !== null && _tool_args !== void 0 ? _tool_args : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_args) || null;
|
|
707
|
+
return {
|
|
708
|
+
toolName: toolName,
|
|
709
|
+
toolArgs: toolArgs
|
|
710
|
+
};
|
|
711
|
+
};
|
|
712
|
+
export var resolveHitlSkipResolutionSource = function resolveHitlSkipResolutionSource(approval) {
|
|
713
|
+
return approval.manual_approval_detected ? 'manual' : 'auto';
|
|
714
|
+
};
|
|
715
|
+
export var resolveCreateAgentHitlAnalyticsEvents = function resolveCreateAgentHitlAnalyticsEvents(params) {
|
|
716
|
+
var _params$completedAgen;
|
|
717
|
+
var events = [];
|
|
718
|
+
var trimmedAgentId = (_params$completedAgen = params.completedAgentId) === null || _params$completedAgen === void 0 ? void 0 : _params$completedAgen.trim();
|
|
719
|
+
var idField = trimmedAgentId ? {
|
|
720
|
+
created_agent_id: trimmedAgentId
|
|
721
|
+
} : {};
|
|
722
|
+
if (params.wasCreateAgentApproved) {
|
|
723
|
+
events.push(_objectSpread({
|
|
724
|
+
agent_type: params.agentType,
|
|
725
|
+
action_type: params.buildActionTypeList(params.pendingActions),
|
|
726
|
+
decision: 'accept',
|
|
727
|
+
option: 'create_agent'
|
|
728
|
+
}, idField));
|
|
729
|
+
}
|
|
730
|
+
var manualTool = params.manualApprovalToolName;
|
|
731
|
+
if (manualTool && params.normalizeToolName(manualTool) === 'create_agent') {
|
|
732
|
+
events.push(_objectSpread({
|
|
733
|
+
agent_type: params.agentType,
|
|
734
|
+
action_type: 'create_agent',
|
|
735
|
+
decision: 'accept',
|
|
736
|
+
resolution_source: 'manual',
|
|
737
|
+
option: 'create_agent'
|
|
738
|
+
}, idField));
|
|
739
|
+
}
|
|
740
|
+
return events;
|
|
741
|
+
};
|
|
742
|
+
export var resolveContextProjectIdForDashboard = function resolveContextProjectIdForDashboard(projectId, lastMessageProjectId) {
|
|
743
|
+
var raw = projectId !== null && projectId !== void 0 ? projectId : lastMessageProjectId;
|
|
744
|
+
if (raw == null) return null;
|
|
745
|
+
var parsed = parseInt(String(raw), 10);
|
|
746
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
747
|
+
};
|
|
748
|
+
export var resolveDashboardSyncedContent = /*#__PURE__*/function () {
|
|
749
|
+
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(content, taskUrlRegex, shouldSyncDashboard, taskIds, getTabTaskDefault) {
|
|
750
|
+
var matches, tab, tabSegment;
|
|
751
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
752
|
+
while (1) switch (_context.prev = _context.next) {
|
|
753
|
+
case 0:
|
|
754
|
+
if (!(!shouldSyncDashboard || taskIds.length === 0)) {
|
|
755
|
+
_context.next = 1;
|
|
756
|
+
break;
|
|
757
|
+
}
|
|
758
|
+
return _context.abrupt("return", content);
|
|
759
|
+
case 1:
|
|
760
|
+
matches = _toConsumableArray(content.matchAll(taskUrlRegex));
|
|
761
|
+
if (!(matches.length === 0)) {
|
|
762
|
+
_context.next = 2;
|
|
763
|
+
break;
|
|
764
|
+
}
|
|
765
|
+
return _context.abrupt("return", content);
|
|
766
|
+
case 2:
|
|
767
|
+
_context.next = 3;
|
|
768
|
+
return getTabTaskDefault(taskIds[0]);
|
|
769
|
+
case 3:
|
|
770
|
+
tab = _context.sent;
|
|
771
|
+
tabSegment = tab ? "/".concat(tab) : '/detail';
|
|
772
|
+
return _context.abrupt("return", replaceTaskUrlsWithTabSegment(content, taskUrlRegex, tabSegment));
|
|
773
|
+
case 4:
|
|
774
|
+
case "end":
|
|
775
|
+
return _context.stop();
|
|
776
|
+
}
|
|
777
|
+
}, _callee);
|
|
778
|
+
}));
|
|
779
|
+
return function resolveDashboardSyncedContent(_x, _x2, _x3, _x4, _x5) {
|
|
780
|
+
return _ref5.apply(this, arguments);
|
|
781
|
+
};
|
|
782
|
+
}();
|
|
783
|
+
export var isTerminalSessionStatus = function isTerminalSessionStatus(status) {
|
|
784
|
+
return status === 'complete' || status === 'error';
|
|
785
|
+
};
|
|
786
|
+
export var buildTerminalSessionReconciliationKey = function buildTerminalSessionReconciliationKey(sessionId, status, finishedAt) {
|
|
787
|
+
return "".concat(sessionId, ":").concat(status, ":").concat(finishedAt !== null && finishedAt !== void 0 ? finishedAt : '');
|
|
788
|
+
};
|
|
789
|
+
export var hasStaleStreamingPlaceholderInTail = function hasStaleStreamingPlaceholderInTail(tail, isStreamingPlaceholder) {
|
|
790
|
+
return tail.some(function (message) {
|
|
791
|
+
return isStreamingPlaceholder(message.id);
|
|
792
|
+
});
|
|
793
|
+
};
|
|
794
|
+
export var shouldForceReloadMessagesOnTerminalSession = function shouldForceReloadMessagesOnTerminalSession(status, tail, isStreamingPlaceholder) {
|
|
795
|
+
return isTerminalSessionStatus(status) && hasStaleStreamingPlaceholderInTail(tail, isStreamingPlaceholder);
|
|
796
|
+
};
|
|
797
|
+
export var shouldRotateSessionForNewHome = function shouldRotateSessionForNewHome(initialChatId, previousInitialChatId) {
|
|
798
|
+
return !initialChatId && Boolean(previousInitialChatId);
|
|
799
|
+
};
|
|
800
|
+
export var shouldSwitchToInitialChatSession = function shouldSwitchToInitialChatSession(initialChatId, currentChatId) {
|
|
801
|
+
return Boolean(initialChatId && initialChatId !== currentChatId);
|
|
802
|
+
};
|
|
803
|
+
export var buildStreamFinishAssistantMessage = function buildStreamFinishAssistantMessage(params) {
|
|
804
|
+
return _objectSpread(_objectSpread(_objectSpread({
|
|
805
|
+
id: params.finalMessageId,
|
|
806
|
+
message: params.content,
|
|
807
|
+
date: new Date(),
|
|
808
|
+
user: {
|
|
809
|
+
id: 'assistant',
|
|
810
|
+
name: 'Assistant'
|
|
811
|
+
},
|
|
812
|
+
role: ChatHistoryRole.ASSISTANT,
|
|
813
|
+
sources: params.sources
|
|
814
|
+
}, params.attachments.length > 0 ? {
|
|
815
|
+
attachments: params.attachments
|
|
816
|
+
} : {}), {}, {
|
|
817
|
+
memorySessionId: params.memorySessionId,
|
|
818
|
+
suggestions: params.suggestions || []
|
|
819
|
+
}, params.createAgentFollowUp ? {
|
|
820
|
+
createAgentFollowUp: params.createAgentFollowUp
|
|
821
|
+
} : {}), {}, {
|
|
822
|
+
reasoning: params.reasoning
|
|
823
|
+
});
|
|
824
|
+
};
|
|
825
|
+
export var shouldMarkChatReadAfterStreamFinish = function shouldMarkChatReadAfterStreamFinish(isActive, isChatViewVisible) {
|
|
826
|
+
return isActive && isChatViewVisible;
|
|
827
|
+
};
|
|
828
|
+
export var shouldDispatchFirstSessionRefetch = function shouldDispatchFirstSessionRefetch(firstTime) {
|
|
829
|
+
return firstTime;
|
|
830
|
+
};
|
|
831
|
+
export function resolveActiveStreamFinishProcessing(_x6) {
|
|
832
|
+
return _resolveActiveStreamFinishProcessing.apply(this, arguments);
|
|
833
|
+
}
|
|
834
|
+
function _resolveActiveStreamFinishProcessing() {
|
|
835
|
+
_resolveActiveStreamFinishProcessing = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(params) {
|
|
836
|
+
var _previousMessage$appr, _params$manualApprova, _params$manualApprova2, _params$manualApprova3, _params$manualApprova4;
|
|
837
|
+
var contentToAdd, previousMessage, hasApprovalInPreviousMessage, pendingActions, _resolveApprovedPendi, wasTaskCreation, wasTaskEdit, wasTaskDelete, wasCreateAgentApproved, wasConfigureAgentAccessApproved, wasEditAgentApproved, createAgentFollowUp, editAgentFollowUp, taskIdsForDashboard, shouldSyncDashboard, lastProjectMessage, contextProjectId, _resolveProjectDashbo, isOnProjectRoute, manualWasTaskEdit, manualWasTaskDelete, hoursChargeTools, affectedTaskIds;
|
|
838
|
+
return _regeneratorRuntime.wrap(function (_context2) {
|
|
839
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
840
|
+
case 0:
|
|
841
|
+
contentToAdd = params.content;
|
|
842
|
+
previousMessage = resolvePreviousAssistantMessageBeforePlaceholder(params.messages, params.tempMessageId);
|
|
843
|
+
hasApprovalInPreviousMessage = (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approval) != null;
|
|
844
|
+
pendingActions = (previousMessage === null || previousMessage === void 0 || (_previousMessage$appr = previousMessage.approval) === null || _previousMessage$appr === void 0 ? void 0 : _previousMessage$appr.pending_actions) || [];
|
|
845
|
+
_resolveApprovedPendi = resolveApprovedPendingActionFlags(hasApprovalInPreviousMessage, previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus, pendingActions), wasTaskCreation = _resolveApprovedPendi.wasTaskCreation, wasTaskEdit = _resolveApprovedPendi.wasTaskEdit, wasTaskDelete = _resolveApprovedPendi.wasTaskDelete, wasCreateAgentApproved = _resolveApprovedPendi.wasCreateAgentApproved, wasConfigureAgentAccessApproved = _resolveApprovedPendi.wasConfigureAgentAccessApproved, wasEditAgentApproved = _resolveApprovedPendi.wasEditAgentApproved;
|
|
846
|
+
createAgentFollowUp = resolveCreateAgentFollowUp({
|
|
847
|
+
wasCreateAgentApproved: wasCreateAgentApproved,
|
|
848
|
+
wasConfigureAgentAccessApproved: wasConfigureAgentAccessApproved
|
|
849
|
+
}, params.multiAgentsAccess, params.completedAgentId, pendingActions);
|
|
850
|
+
editAgentFollowUp = resolveEditAgentFollowUp(wasEditAgentApproved, params.completedAgentId, pendingActions);
|
|
851
|
+
taskIdsForDashboard = resolveTaskIdsForDashboard(params.content, params.taskUrlRegex, pendingActions, wasTaskDelete);
|
|
852
|
+
shouldSyncDashboard = shouldSyncTaskDashboard(hasApprovalInPreviousMessage, wasTaskCreation, wasTaskEdit, wasTaskDelete, taskIdsForDashboard);
|
|
853
|
+
if (!shouldSyncDashboard) {
|
|
854
|
+
_context2.next = 2;
|
|
855
|
+
break;
|
|
856
|
+
}
|
|
857
|
+
_context2.next = 1;
|
|
858
|
+
return resolveDashboardSyncedContent(params.content, params.taskUrlRegex, shouldSyncDashboard, taskIdsForDashboard, params.getTabTaskDefault);
|
|
859
|
+
case 1:
|
|
860
|
+
contentToAdd = _context2.sent;
|
|
861
|
+
lastProjectMessage = params.messages.filter(function (msg) {
|
|
862
|
+
return msg.projectId;
|
|
863
|
+
}).at(-1);
|
|
864
|
+
contextProjectId = resolveContextProjectIdForDashboard(params.projectId, lastProjectMessage === null || lastProjectMessage === void 0 ? void 0 : lastProjectMessage.projectId);
|
|
865
|
+
_resolveProjectDashbo = resolveProjectDashboardSync(contextProjectId, params.pathname), isOnProjectRoute = _resolveProjectDashbo.isOnProjectRoute;
|
|
866
|
+
if (isOnProjectRoute && params.applyDashboardMutation) {
|
|
867
|
+
params.applyDashboardMutation(resolveProjectDashboardMutation({
|
|
868
|
+
wasTaskCreation: wasTaskCreation,
|
|
869
|
+
wasTaskEdit: wasTaskEdit,
|
|
870
|
+
wasTaskDelete: wasTaskDelete
|
|
871
|
+
}), taskIdsForDashboard);
|
|
872
|
+
}
|
|
873
|
+
case 2:
|
|
874
|
+
manualWasTaskEdit = isTaskEditToolName((_params$manualApprova = params.manualApproval) === null || _params$manualApprova === void 0 ? void 0 : _params$manualApprova.toolName);
|
|
875
|
+
manualWasTaskDelete = isTaskDeleteToolName((_params$manualApprova2 = params.manualApproval) === null || _params$manualApprova2 === void 0 ? void 0 : _params$manualApprova2.toolName);
|
|
876
|
+
hoursChargeTools = resolveHoursChargeToolsOnStreamFinish(hasApprovalInPreviousMessage, previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus, pendingActions, (_params$manualApprova3 = params.manualApproval) === null || _params$manualApprova3 === void 0 ? void 0 : _params$manualApprova3.toolName);
|
|
877
|
+
affectedTaskIds = mergeAffectedTaskIdsForPanelRefetch(pendingActions, taskIdsForDashboard, (_params$manualApprova4 = params.manualApproval) !== null && _params$manualApprova4 !== void 0 && _params$manualApprova4.toolName ? {
|
|
878
|
+
toolName: params.manualApproval.toolName,
|
|
879
|
+
toolArgs: params.manualApproval.toolArgs
|
|
880
|
+
} : null);
|
|
881
|
+
return _context2.abrupt("return", {
|
|
882
|
+
contentToAdd: contentToAdd,
|
|
883
|
+
createAgentFollowUp: createAgentFollowUp,
|
|
884
|
+
editAgentFollowUp: editAgentFollowUp,
|
|
885
|
+
hoursChargeTools: hoursChargeTools,
|
|
886
|
+
affectedTaskIds: affectedTaskIds,
|
|
887
|
+
manualWasTaskEdit: manualWasTaskEdit,
|
|
888
|
+
manualWasTaskDelete: manualWasTaskDelete,
|
|
889
|
+
wasTaskEdit: wasTaskEdit,
|
|
890
|
+
wasTaskDelete: wasTaskDelete,
|
|
891
|
+
wasCreateAgentApproved: wasCreateAgentApproved,
|
|
892
|
+
pendingActions: pendingActions
|
|
893
|
+
});
|
|
894
|
+
case 3:
|
|
895
|
+
case "end":
|
|
896
|
+
return _context2.stop();
|
|
897
|
+
}
|
|
898
|
+
}, _callee2);
|
|
899
|
+
}));
|
|
900
|
+
return _resolveActiveStreamFinishProcessing.apply(this, arguments);
|
|
901
|
+
}
|
|
902
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0hvdXJzQ2hhcmdlVG9vbCIsIkNoYXRIaXN0b3J5Um9sZSIsInJlYXNvbmluZ1N0b3JlIiwiYnVpbGRSZWFzb25pbmdUcmFjZSIsInJlc29sdmVSZXRyeVR1cm5JZCIsInJlYXNvbmluZ1RyYWNlRm9yIiwibWVzc2FnZUlkIiwic25hcHNob3QiLCJnZXRTbmFwc2hvdCIsInN0ZXBzIiwibGVuZ3RoIiwic3VtbWFyeSIsIm5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyIsImF0dGFjaG1lbnRzT3JPcHRpb25zIiwiX29wdGlvbnMkYXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJhdHRhY2htZW50cyIsIm9wdGlvbnMiLCJyZXNvbHZlUHJvamVjdFRvUmVxdWVzdCIsImNoaXBzUHJvamVjdCIsImxhc3RNZXNzYWdlUHJvamVjdElkIiwiY2hpcHNQcm9qZWN0SWQiLCJwcm9qZWN0SWQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInBhcnNlZCIsInJlc29sdmVDbGllbnRQYXlsb2FkIiwiY3R4Q2xpZW50IiwiY3R4UHJvamVjdCIsIl9jdHhQcm9qZWN0JGNsaWVudCIsImlkIiwiX29iamVjdFNwcmVhZCIsImNsaWVudElkIiwibmFtZSIsImNsaWVudE5hbWUiLCJjbGllbnQiLCJub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyIsInJhd0F0dGFjaG1lbnRzIiwiZmlsdGVyIiwiYXR0YWNobWVudCIsIl90eXBlb2YiLCJtYXAiLCJpbmRleCIsInRyaW0iLCJjb25jYXQiLCJ0eXBlIiwibWltZVR5cGUiLCJtaW1lX3R5cGUiLCJmdWxsRmlsZU5hbWUiLCJpbmNsdWRlcyIsIm51bWVyaWNTaXplIiwic2l6ZSIsInBhcnNlZFNpemUiLCJmaWxlIiwiRmlsZSIsInVybF9vcmlnaW5hbCIsInVuZGVmaW5lZCIsInVybF90aHVtYm5haWwiLCJ1cmxfZmlsZSIsInJvbGUiLCJleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MiLCJwZW5kaW5nQWN0aW9ucyIsImlkcyIsInB1c2hJZCIsInJhdyIsIm4iLCJwYXJzZUludCIsIlN0cmluZyIsImlzTmFOIiwicHVzaCIsImZvckVhY2giLCJhY3Rpb24iLCJfcmVjJHRhc2tfaWQiLCJhcmdzIiwidG9vbF9hcmdzIiwicmVjIiwidGFza19pZCIsInRhc2tfaWRzIiwidGFza3MiLCJ0IiwiX3RyZWMkdGFza19pZCIsInRyZWMiLCJleHRyYWN0VGFza0lkc0Zyb21EZWxldGVQZW5kaW5nQWN0aW9ucyIsInRvb2xfbmFtZSIsIl9yZWMkdGFza19pZDIiLCJsaXN0IiwidGlkIiwiZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMiLCJfcmVjJGFnZW50X2lkIiwiZWRpdEFjdGlvbiIsImZpbmQiLCJhIiwidG9Mb3dlckNhc2UiLCJhZ2VudF9pZCIsImFnZW50SWQiLCJleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUiLCJ0b29sTmFtZSIsIl9yZWYiLCJfcmVjJGFnZW50X2lkMiIsImV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dCIsInRleHQiLCJsYWJlbGVkIiwibWF0Y2giLCJib2xkIiwiVEFTS19DUkVBVElPTl9UT09MUyIsIlRBU0tfRURJVF9UT09MUyIsIlRBU0tfREVMRVRFX1RPT0xTIiwiaXNUYXNrRWRpdFRvb2xOYW1lIiwiaXNUYXNrRGVsZXRlVG9vbE5hbWUiLCJwZW5kaW5nQWN0aW9uc0luY2x1ZGVUb29sIiwidG9vbHMiLCJzb21lIiwicmVzb2x2ZUFwcHJvdmVkUGVuZGluZ0FjdGlvbkZsYWdzIiwiaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSIsImFwcHJvdmFsU3RhdHVzIiwiYXBwcm92ZWQiLCJ3YXNUYXNrQ3JlYXRpb24iLCJ3YXNUYXNrRWRpdCIsIndhc1Rhc2tEZWxldGUiLCJ3YXNDcmVhdGVBZ2VudEFwcHJvdmVkIiwid2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCIsIndhc0VkaXRBZ2VudEFwcHJvdmVkIiwic2hvdWxkU3luY1Rhc2tEYXNoYm9hcmQiLCJ0YXNrSWRzRm9yRGFzaGJvYXJkIiwicmVzb2x2ZVRhc2tJZHNGb3JEYXNoYm9hcmQiLCJjb250ZW50IiwidGFza1VybFJlZ2V4IiwidGFza0lkc0Zyb21VcmxzIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwibWF0Y2hBbGwiLCJ0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsIiwidGFza0lkc0Zyb21EZWxldGlvblRleHQiLCJyZXBsYWNlVGFza1VybHNXaXRoVGFiU2VnbWVudCIsInRhYlNlZ21lbnQiLCJyZXBsYWNlIiwidXJsIiwicmVzb2x2ZVByb2plY3REYXNoYm9hcmRTeW5jIiwiY29udGV4dFByb2plY3RJZCIsInBhdGhuYW1lIiwicGF0aE1hdGNoIiwicm91dGVQcm9qZWN0SWQiLCJpc09uUHJvamVjdFJvdXRlIiwiQm9vbGVhbiIsInJlc29sdmVDcmVhdGVBZ2VudEZvbGxvd1VwIiwiZmxhZ3MiLCJtdWx0aUFnZW50c0FjY2VzcyIsImNvbXBsZXRlZEFnZW50SWQiLCJjb25maWd1cmVkQWdlbnRJZCIsInJlc29sdmVFZGl0QWdlbnRGb2xsb3dVcCIsInJlc29sdmVkQWdlbnRJZCIsInNob3VsZFJlZmV0Y2hPcGVuVGFza1BhbmVsIiwib3BlblRhc2tQYW5lbElkIiwibWFudWFsRmxhZ3MiLCJhZmZlY3RlZFRhc2tJZHMiLCJ0YXNrRmxvd0FjdGl2ZSIsIm1hbnVhbFdhc1Rhc2tFZGl0IiwibWFudWFsV2FzVGFza0RlbGV0ZSIsInJlc29sdmVTdHJlYW1FcnJvclByZXNlbnRhdGlvbiIsImVycm9yTWVzc2FnZSIsImVycm9yUmF3TWVzc2FnZSIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YyIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YzIiLCJpc0FjY2Vzc0RlbmllZCIsImlzUHJvbXB0VG9vTG9uZyIsInRva2Vuc1VzZWQiLCJzaG93UmV0cnkiLCJyZXNvbHZlU3RyZWFtRXJyb3JNZXNzYWdlS2V5IiwicHJlc2VudGF0aW9uIiwibWVzc2FnZUtleSIsInJlc29sdmVQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24iLCJhcHBseVByb2plY3REYXNoYm9hcmRNdXRhdGlvbiIsIm11dGF0aW9uIiwidGFza0lkcyIsImRhc2hib2FyZCIsIl9kYXNoYm9hcmQkZGVsZXRlRXhpcyIsIl9kYXNoYm9hcmQkYWRkRXhpc3RpbiIsImFkZEV4aXN0aW5nVGFza1RvRGFzaGJvYXJkIiwiY2FsbCIsIl9kYXNoYm9hcmQkZWRpdEV4aXN0aSIsImVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZCIsImRlbGV0ZUV4aXN0aW5nVGFza0Zyb21EYXNoYm9hcmQiLCJtZXJnZUFmZmVjdGVkVGFza0lkc0ZvclBhbmVsUmVmZXRjaCIsIm1hbnVhbEFwcHJvdmFsIiwibWFudWFsUHNldWRvQWN0aW9ucyIsIl9tYW51YWxBcHByb3ZhbCR0b29sQSIsInRvb2xBcmdzIiwidGhyZWFkX2lkIiwidG9vbF9jYWxsX2lkIiwibWFwQXV0aFVzZXJUb0NoYXRNZXNzYWdlVXNlciIsImF1dGhVc2VyIiwidG9TdHJpbmciLCJmaXJzdE5hbWUiLCJhdmF0YXIiLCJwaWN0dXJlIiwiZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxJbkxpc3QiLCJ0aHJlYWRJZHMiLCJtZXNzYWdlcyIsInNlc3Npb25JZCIsImZvdW5kIiwibWVzc2FnZSIsIl9tZXNzYWdlJGFwcHJvdmFsIiwiYXBwcm92YWwiLCJwZW5kaW5nX2FjdGlvbnMiLCJzZXNzaW9uX2lkIiwiY2FuU2VuZENoYXRNZXNzYWdlIiwiaXNQcm9jZXNzaW5nIiwid2FpdGluZ1Jlc3BvbnNlIiwibG9hZGluZ01lc3NhZ2VzIiwic2hvdWxkQmxvY2tDb25jdXJyZW50U3RyZWFtU3RhcnQiLCJ3aWxsU3RhcnROZXdTdHJlYW0iLCJhY3RpdmVDb3VudCIsIm1heENvbmN1cnJlbnQiLCJyZXNvbHZlU2VuZE1lc3NhZ2VHYXRlIiwicGFyYW1zIiwiYWN0aXZlU3RyZWFtQ291bnQiLCJyZXNvbHZlU2VuZE1lc3NhZ2VQYXlsb2FkRmllbGRzIiwicG9zaXRpb25hbCIsIl9wb3NpdGlvbmFsJGZhcUlkIiwiX3Bvc2l0aW9uYWwkYWdlbnRTdWdnIiwiX3Bvc2l0aW9uYWwkbWVudGlvbnMiLCJfcG9zaXRpb25hbCRmdWFJZCIsIl9wb3NpdGlvbmFsJHNjSWQiLCJfcG9zaXRpb25hbCRjb250ZXh0RGEiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJjb250ZXh0RGF0YSIsImJ1aWxkQ2hhdEhpc3RvcnlGcm9tTWVzc2FnZXMiLCJhdXRoVXNlcklkIiwiaGlzdG9yeU1lc3NhZ2UiLCJ1c2VyIiwiVVNFUiIsIkFTU0lTVEFOVCIsInJlc29sdmVMYXN0TWVzc2FnZUFnZW50SWQiLCJfbWVzc2FnZXMkYXQiLCJhdCIsInJlc29sdmVBZ2VudElkRm9yU3RyZWFtIiwiYWdlbnRJZEZyb21NZXNzYWdlcyIsImZhbGxiYWNrQWdlbnRJZCIsInJlc29sdmVVc2VyUXVlc3Rpb25NZXNzYWdlSWQiLCJ0dXJuTWVzc2FnZUlkIiwiYnVpbGRNYWlhU3RyZWFtUmVxdWVzdFBheWxvYWQiLCJfcGFyYW1zJGN0eFByb2plY3QiLCJfcGFyYW1zJGN0eFRhc2siLCJoaXN0b3J5IiwibGFuZyIsInVzZXJJZCIsImxhc3ROYW1lIiwiY29tcGFueUlkIiwiY29tcGFueV9pZCIsImNoYXRJZCIsImFnZW50TmFtZSIsImlzV2ViU2VhcmNoQWN0aXZlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwiaXNBdXRvQXBwcm92ZUFjdGl2ZSIsImZlZUlkIiwicHJvamVjdE5hbWUiLCJjdHhUYXNrIiwidGFza0lkIiwidGFza05hbWUiLCJhZ2VudEVudGl0eSIsImFnZW50VHlwZSIsImFnZW50RW1vamkiLCJjb250ZXh0TWVzc2FnZSIsImJ1aWxkTWFpYVN0cmVhbVJlcXVlc3RQYXlsb2FkRm9yUHJvamVjdENoYW5nZSIsInByb2plY3QiLCJyZXNvbHZlU3RyZWFtRXJyb3JIYW5kbGluZ01vZGUiLCJoYXNSZXRyeVNuYXBzaG90IiwicmVzb2x2ZVN0cmVhbUVycm9yQXNzaXN0YW50TWVzc2FnZUlkIiwiYnVpbGRTdHJlYW1FcnJvckFzc2lzdGFudE1lc3NhZ2UiLCJpc0Vycm9yIiwic3VnZ2VzdGlvbnMiLCJyZXRyeUxhYmVsIiwiZGF0ZSIsIkRhdGUiLCJzaG91bGRTa2lwSGl0bEFwcHJvdmFsVWkiLCJtYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQiLCJhdXRvX2FwcHJvdmVkIiwiYXBwcm92YWxfc3RhdHVzIiwicmVzb2x2ZUhpdGxBcHByb3ZhbFJlcXVpcmVkT3V0Y29tZSIsImFwcHJvdmFsTWVzc2FnZUlkIiwib3JpZ2luYWxfdGhyZWFkX2lkIiwiYnVpbGRIaXRsQXBwcm92YWxQZW5kaW5nTWVzc2FnZSIsImFjY3VtdWxhdGVkQ29udGVudCIsInJlYXNvbmluZyIsInNob3VsZFByZXNlcnZlUmVhc29uaW5nT25TdHJlYW1TdG9wIiwic3RvcHBlZFRyYWNlIiwiYnVpbGRTdHJlYW1TdG9wUGFydGlhbEFzc2lzdGFudE1lc3NhZ2UiLCJmaW5hbE1lc3NhZ2VJZCIsInBhcnRpYWxUZXh0IiwiYnVpbGRTdHJlYW1TdG9wQ2FuY2VsbGVkQXNzaXN0YW50TWVzc2FnZSIsImNhbmNlbGxlZE1lc3NhZ2VJZCIsImNhbmNlbGxlZExhYmVsIiwiaXNGcm9udGVuZENhbmNlbGxlZCIsInJlc29sdmVSZXRyeUJsb2NrUmVhc29uIiwiaXNTZXNzaW9uU3RyZWFtQWN0aXZlIiwic2hvdWxkVXNlT3JjaGVzdHJhdG9yUmV0cnlGYWxsYmFjayIsIl9tZXNzYWdlJG1lbW9yeVNlc3NpbyIsIm1lbW9yeVNlc3Npb25JZCIsInJlc29sdmVSZXRyeUVsaWdpYmlsaXR5IiwicHJldmlvdXNNZXNzYWdlcyIsInVzZXJNZXNzYWdlIiwiX3VzZXJNZXNzYWdlJG1lc3NhZ2UiLCJfdXNlck1lc3NhZ2UkYXR0YWNobWUiLCJfdXNlck1lc3NhZ2Ukc291cmNlcyIsIml0ZW0iLCJlbGlnaWJsZSIsInJlYXNvbiIsInNvdXJjZXMiLCJ0dXJuSWQiLCJ1c2VPcmNoZXN0cmF0b3JGYWxsYmFjayIsInJlc29sdmVSZXRyeVVzZXJBdHRhY2htZW50cyIsInNob3VsZFVwZGF0ZVByb2plY3RPbkNoYW5nZSIsIm5leHRQcm9qZWN0SWQiLCJjdXJyZW50UHJvamVjdElkIiwic2hvdWxkUmVzZW5kQWZ0ZXJQcm9qZWN0Q2hhbmdlIiwidXNlclF1ZXN0aW9uIiwicmVzb2x2ZUFwcHJvdmFsRGVjaXNpb25TdGF0dXMiLCJkZWNpc2lvbiIsInJlc29sdmVDb250aW51ZVN0cmVhbURlY2lzaW9uIiwiZWRpdGVkQWN0aW9ucyIsInJlc29sdmVBcHByb3ZhbFN0cmVhbUJsb2NrUmVhc29uIiwiX3BhcmFtcyR0aHJlYWRJZHMiLCJoYXNBcHByb3ZhbE1lc3NhZ2UiLCJyZXNvbHZlSG91cnNDaGFyZ2VUb29sc09uU3RyZWFtRmluaXNoIiwibWFudWFsQXBwcm92YWxUb29sTmFtZSIsImhvdXJzVG9vbHNGcm9tQXBwcm92YWwiLCJ3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkIiwiZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyIsImFjdGl2ZU1lc3NhZ2VzIiwic2Vzc2lvbk1lc3NhZ2VzQnlJZCIsImFjdGl2ZVNlc3Npb25JZCIsImZyb21BY3RpdmVWaWV3Iiwic2Vzc2lvbkVudHJ5IiwiT2JqZWN0IiwiZW50cmllcyIsIl9yZWYyIiwiX3JlZjMiLCJfc2xpY2VkVG9BcnJheSIsInNlc3Npb25NZXNzYWdlcyIsIl9tZXNzYWdlJGFwcHJvdmFsMiIsIl9zZXNzaW9uRW50cnkiLCJyZXNvbHZlU3RyZWFtRmluaXNoRmluYWxNZXNzYWdlSWQiLCJyZXNvbHZlU3RyZWFtU3RvcE1lc3NhZ2VJZHMiLCJjdXJyZW50TWVzc2FnZUlkIiwicmVzb2x2ZVJlbnRhYmlsaWRhZFByb2plY3RGYXFNZXNzYWdlIiwicmVudGFiaWxpZGFkTGFiZWwiLCJpbmNvbWVUeXBlIiwicmVzb2x2ZVN0cmVhbUVycm9yVXNlck1lc3NhZ2UiLCJ0cmFuc2xhdGUiLCJ1c2VkIiwicmVzb2x2ZVByZXZpb3VzQXNzaXN0YW50TWVzc2FnZUJlZm9yZVBsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXJJZCIsInJlc29sdmVIaXRsRXhlY3V0aW9uQ29udGV4dCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdDIiLCJtZXNzYWdlVGV4dCIsInRocmVhZElkIiwicmVzb2x2ZVNraXBwZWRIaXRsTWFudWFsQXBwcm92YWwiLCJfYXBwcm92YWwkcGVuZGluZ19hY3QzIiwiX3JlZjQiLCJfdG9vbF9uYW1lIiwiX3Rvb2xfYXJncyIsImZpcnN0QWN0aW9uIiwicmVzb2x2ZUhpdGxTa2lwUmVzb2x1dGlvblNvdXJjZSIsInJlc29sdmVDcmVhdGVBZ2VudEhpdGxBbmFseXRpY3NFdmVudHMiLCJfcGFyYW1zJGNvbXBsZXRlZEFnZW4iLCJldmVudHMiLCJ0cmltbWVkQWdlbnRJZCIsImlkRmllbGQiLCJjcmVhdGVkX2FnZW50X2lkIiwiYWdlbnRfdHlwZSIsImFjdGlvbl90eXBlIiwiYnVpbGRBY3Rpb25UeXBlTGlzdCIsIm9wdGlvbiIsIm1hbnVhbFRvb2wiLCJub3JtYWxpemVUb29sTmFtZSIsInJlc29sdXRpb25fc291cmNlIiwicmVzb2x2ZUNvbnRleHRQcm9qZWN0SWRGb3JEYXNoYm9hcmQiLCJyZXNvbHZlRGFzaGJvYXJkU3luY2VkQ29udGVudCIsIl9yZWY1IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJzaG91bGRTeW5jRGFzaGJvYXJkIiwiZ2V0VGFiVGFza0RlZmF1bHQiLCJtYXRjaGVzIiwidGFiIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJhYnJ1cHQiLCJzZW50Iiwic3RvcCIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX3g1IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJpc1Rlcm1pbmFsU2Vzc2lvblN0YXR1cyIsInN0YXR1cyIsImJ1aWxkVGVybWluYWxTZXNzaW9uUmVjb25jaWxpYXRpb25LZXkiLCJmaW5pc2hlZEF0IiwiaGFzU3RhbGVTdHJlYW1pbmdQbGFjZWhvbGRlckluVGFpbCIsInRhaWwiLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyIiwic2hvdWxkRm9yY2VSZWxvYWRNZXNzYWdlc09uVGVybWluYWxTZXNzaW9uIiwic2hvdWxkUm90YXRlU2Vzc2lvbkZvck5ld0hvbWUiLCJpbml0aWFsQ2hhdElkIiwicHJldmlvdXNJbml0aWFsQ2hhdElkIiwic2hvdWxkU3dpdGNoVG9Jbml0aWFsQ2hhdFNlc3Npb24iLCJjdXJyZW50Q2hhdElkIiwiYnVpbGRTdHJlYW1GaW5pc2hBc3Npc3RhbnRNZXNzYWdlIiwiY3JlYXRlQWdlbnRGb2xsb3dVcCIsInNob3VsZE1hcmtDaGF0UmVhZEFmdGVyU3RyZWFtRmluaXNoIiwiaXNBY3RpdmUiLCJpc0NoYXRWaWV3VmlzaWJsZSIsInNob3VsZERpc3BhdGNoRmlyc3RTZXNzaW9uUmVmZXRjaCIsImZpcnN0VGltZSIsInJlc29sdmVBY3RpdmVTdHJlYW1GaW5pc2hQcm9jZXNzaW5nIiwiX3g2IiwiX3Jlc29sdmVBY3RpdmVTdHJlYW1GaW5pc2hQcm9jZXNzaW5nIiwiX2NhbGxlZTIiLCJfcHJldmlvdXNNZXNzYWdlJGFwcHIiLCJfcGFyYW1zJG1hbnVhbEFwcHJvdmEiLCJfcGFyYW1zJG1hbnVhbEFwcHJvdmEyIiwiX3BhcmFtcyRtYW51YWxBcHByb3ZhMyIsIl9wYXJhbXMkbWFudWFsQXBwcm92YTQiLCJjb250ZW50VG9BZGQiLCJwcmV2aW91c01lc3NhZ2UiLCJfcmVzb2x2ZUFwcHJvdmVkUGVuZGkiLCJlZGl0QWdlbnRGb2xsb3dVcCIsImxhc3RQcm9qZWN0TWVzc2FnZSIsIl9yZXNvbHZlUHJvamVjdERhc2hibyIsImhvdXJzQ2hhcmdlVG9vbHMiLCJfY29udGV4dDIiLCJ0ZW1wTWVzc2FnZUlkIiwibXNnIiwiYXBwbHlEYXNoYm9hcmRNdXRhdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWFuYWdlci91c2VDaGF0TWFuYWdlci5oZWxwZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzSG91cnNDaGFyZ2VUb29sIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3BsYW5uZXJTeW5jRXZlbnRzJ1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQge1xuICBBcHByb3ZhbFJlcXVlc3QsXG4gIENoYXRIaXN0b3J5LFxuICBDaGF0SGlzdG9yeVJvbGUsXG4gIENoYXRNZXNzYWdlLFxuICBDaGF0TWVzc2FnZVVzZXIsXG4gIFBlbmRpbmdBY3Rpb24sXG59IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBDT1JVc2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi90eXBlcy9Qcm9qZWN0J1xuaW1wb3J0IHsgcmVhc29uaW5nU3RvcmUgfSBmcm9tICcuLi91c2VSZWFzb25pbmdUcmFjZSdcbmltcG9ydCB7IGJ1aWxkUmVhc29uaW5nVHJhY2UgfSBmcm9tICcuLi8uLi91dGlscy9yZWFzb25pbmdNYXBwZXJzJ1xuaW1wb3J0IHR5cGUgeyBSZWFzb25pbmdUcmFjZSB9IGZyb20gJy4uLy4uL3R5cGVzL3JlYXNvbmluZydcbmltcG9ydCB0eXBlIHsgU2VuZE1lc3NhZ2VPcHRpb25zIH0gZnJvbSAnLi91c2VDaGF0TWFuYWdlci5pbnRlcmZhY2UnXG5pbXBvcnQgdHlwZSB7IENvbnRleHRNZW50aW9uLCBDb250ZXh0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHR5cGUgeyBBZ2VudEVudGl0eSwgQWdlbnRUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyByZXNvbHZlUmV0cnlUdXJuSWQgfSBmcm9tICcuLi8uLi91dGlscy9yZXRyeUNvbXBsZXRpb24nXG5cbnR5cGUgQXR0YWNobWVudHNPck9wdGlvbnMgPSBBdHRhY2htZW50RmlsZVtdIHwgU2VuZE1lc3NhZ2VPcHRpb25zXG5cbi8qKiBUcmFjZSBhY3VtdWxhZG8gZW4gdml2byBwYXJhIGBtZXNzYWdlSWRgLCBvIG51bGwgc2kgZWwgc3RvcmUgYXB1bnRhIGEgb3RybyBtZW5zYWplLiAqL1xuZXhwb3J0IGNvbnN0IHJlYXNvbmluZ1RyYWNlRm9yID0gKG1lc3NhZ2VJZDogc3RyaW5nKTogUmVhc29uaW5nVHJhY2UgfCBudWxsID0+IHtcbiAgY29uc3Qgc25hcHNob3QgPSByZWFzb25pbmdTdG9yZS5nZXRTbmFwc2hvdChtZXNzYWdlSWQpXG4gIGlmICghc25hcHNob3Quc3RlcHMubGVuZ3RoKSByZXR1cm4gbnVsbFxuICByZXR1cm4gYnVpbGRSZWFzb25pbmdUcmFjZShzbmFwc2hvdC5zdGVwcywgc25hcHNob3Quc3VtbWFyeSlcbn1cblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyA9IChhdHRhY2htZW50c09yT3B0aW9ucz86IEF0dGFjaG1lbnRzT3JPcHRpb25zKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGF0dGFjaG1lbnRzT3JPcHRpb25zKSkge1xuICAgIHJldHVybiB7IGF0dGFjaG1lbnRzOiBhdHRhY2htZW50c09yT3B0aW9ucywgb3B0aW9uczoge30gYXMgU2VuZE1lc3NhZ2VPcHRpb25zIH1cbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFNlbmRNZXNzYWdlT3B0aW9ucyA9IGF0dGFjaG1lbnRzT3JPcHRpb25zID8/IHt9XG4gIHJldHVybiB7IGF0dGFjaG1lbnRzOiBvcHRpb25zLmF0dGFjaG1lbnRzID8/IFtdLCBvcHRpb25zIH1cbn1cblxuLyoqIGNoaXBzUHJvamVjdCBlcyBsYSBmdWVudGUgZGUgdmVyZGFkIGRlbCBwaW4gdmlzaWJsZTsgc2kgbm8gaGF5IHBpbiwgcmVzdGF1cmFyIGRlc2RlIGhpc3RvcmlhbC4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlUHJvamVjdFRvUmVxdWVzdCA9IChcbiAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZD86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbGFzdE1lc3NhZ2VQcm9qZWN0SWQ6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbik6IG51bWJlciB8IG51bGwgPT4ge1xuICBjb25zdCBjaGlwc1Byb2plY3RJZCA9IGNoaXBzUHJvamVjdD8ucHJvamVjdElkID8gTnVtYmVyKGNoaXBzUHJvamVjdC5wcm9qZWN0SWQpIDogbnVsbFxuICBpZiAoY2hpcHNQcm9qZWN0SWQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoY2hpcHNQcm9qZWN0SWQpKSB7XG4gICAgcmV0dXJuIGNoaXBzUHJvamVjdElkXG4gIH1cbiAgaWYgKGxhc3RNZXNzYWdlUHJvamVjdElkICE9IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIobGFzdE1lc3NhZ2VQcm9qZWN0SWQpXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogbnVsbFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQ2xpZW50UGF5bG9hZCA9IChcbiAgY3R4Q2xpZW50OiB7IGlkPzogbnVtYmVyOyBuYW1lPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjdHhQcm9qZWN0OiBQcm9qZWN0IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogeyBjbGllbnRJZD86IG51bWJlcjsgY2xpZW50TmFtZT86IHN0cmluZyB9ID0+IHtcbiAgaWYgKGN0eENsaWVudD8uaWQpIHtcbiAgICByZXR1cm4geyBjbGllbnRJZDogY3R4Q2xpZW50LmlkLCAuLi4oY3R4Q2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eENsaWVudC5uYW1lIH0gOiB7fSkgfVxuICB9XG4gIGlmIChjdHhQcm9qZWN0Py5jbGllbnRJZCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHsgY2xpZW50SWQ6IE51bWJlcihjdHhQcm9qZWN0LmNsaWVudElkKSB9XG4gIH1cbiAgaWYgKGN0eFByb2plY3Q/LmNsaWVudD8uaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IGN0eFByb2plY3QuY2xpZW50LmlkLFxuICAgICAgLi4uKGN0eFByb2plY3QuY2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eFByb2plY3QuY2xpZW50Lm5hbWUgfSA6IHt9KSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHt9XG59XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyA9IChyYXdBdHRhY2htZW50czogdW5rbm93bik6IEF0dGFjaG1lbnRGaWxlW10gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmF3QXR0YWNobWVudHMpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gcmF3QXR0YWNobWVudHNcbiAgICAuZmlsdGVyKChhdHRhY2htZW50KTogYXR0YWNobWVudCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiAhIWF0dGFjaG1lbnQgJiYgdHlwZW9mIGF0dGFjaG1lbnQgPT09ICdvYmplY3QnKVxuICAgIC5tYXAoKGF0dGFjaG1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBuYW1lID1cbiAgICAgICAgdHlwZW9mIGF0dGFjaG1lbnQubmFtZSA9PT0gJ3N0cmluZycgJiYgYXR0YWNobWVudC5uYW1lLnRyaW0oKSA/IGF0dGFjaG1lbnQubmFtZS50cmltKCkgOiBgZmlsZS0ke2luZGV4ICsgMX1gXG4gICAgICBjb25zdCB0eXBlID0gdHlwZW9mIGF0dGFjaG1lbnQudHlwZSA9PT0gJ3N0cmluZycgJiYgYXR0YWNobWVudC50eXBlLnRyaW0oKSA/IGF0dGFjaG1lbnQudHlwZS50cmltKCkgOiAncGRmJ1xuICAgICAgY29uc3QgbWltZVR5cGUgPSB0eXBlb2YgYXR0YWNobWVudC5taW1lX3R5cGUgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC5taW1lX3R5cGUgOiAnJ1xuICAgICAgY29uc3QgZnVsbEZpbGVOYW1lID0gbmFtZS5pbmNsdWRlcygnLicpID8gbmFtZSA6IGAke25hbWV9LiR7dHlwZX1gXG4gICAgICBsZXQgbnVtZXJpY1NpemUgPSAwXG4gICAgICBpZiAodHlwZW9mIGF0dGFjaG1lbnQuc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgbnVtZXJpY1NpemUgPSBhdHRhY2htZW50LnNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFNpemUgPSBOdW1iZXIoYXR0YWNobWVudC5zaXplKVxuICAgICAgICBudW1lcmljU2l6ZSA9IE51bWJlci5pc0Zpbml0ZShwYXJzZWRTaXplKSA/IHBhcnNlZFNpemUgOiAwXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGU6IG5ldyBGaWxlKFtdLCBmdWxsRmlsZU5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSksXG4gICAgICAgIGlkOlxuICAgICAgICAgIHR5cGVvZiBhdHRhY2htZW50LmlkID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50LmlkLnRyaW0oKVxuICAgICAgICAgICAgPyBhdHRhY2htZW50LmlkXG4gICAgICAgICAgICA6IGBhc3Npc3RhbnQtZmlsZS0ke2luZGV4fS0ke2Z1bGxGaWxlTmFtZX1gLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzaXplOiBudW1lcmljU2l6ZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdXJsX29yaWdpbmFsOiB0eXBlb2YgYXR0YWNobWVudC51cmxfb3JpZ2luYWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfb3JpZ2luYWwgOiB1bmRlZmluZWQsXG4gICAgICAgIHVybF90aHVtYm5haWw6IHR5cGVvZiBhdHRhY2htZW50LnVybF90aHVtYm5haWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfdGh1bWJuYWlsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmxfZmlsZTogdHlwZW9mIGF0dGFjaG1lbnQudXJsX2ZpbGUgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfZmlsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcm9sZTogYXR0YWNobWVudC5yb2xlID09PSAnYXNzaXN0YW50JyA/ICdhc3Npc3RhbnQnIDogJ3VzZXInLFxuICAgICAgfVxuICAgIH0pXG59XG5cbi8qKiBFeHRyYWUgdGFza19pZHMgZGUgbG9zIHRvb2xfYXJncyBkZSBwZW5kaW5nX2FjdGlvbnMuICovXG5leHBvcnQgY29uc3QgZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzID0gKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBudW1iZXJbXSA9PiB7XG4gIGNvbnN0IGlkczogbnVtYmVyW10gPSBbXVxuICBjb25zdCBwdXNoSWQgPSAocmF3OiB1bmtub3duKSA9PiB7XG4gICAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm5cbiAgICBjb25zdCBuID0gcGFyc2VJbnQoU3RyaW5nKHJhdyksIDEwKVxuICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBpZHMucHVzaChuKVxuICB9XG4gIHBlbmRpbmdBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICBpZiAoIWFjdGlvbiB8fCB0eXBlb2YgYWN0aW9uICE9PSAnb2JqZWN0JykgcmV0dXJuXG4gICAgY29uc3QgYXJncyA9IGFjdGlvbi50b29sX2FyZ3NcbiAgICBpZiAoIShhcmdzICYmIHR5cGVvZiBhcmdzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmdzKSkpIHJldHVyblxuICAgIGNvbnN0IHJlYyA9IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBwdXNoSWQocmVjLnRhc2tfaWQgPz8gcmVjLmlkKVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlYy50YXNrX2lkcykpIHtcbiAgICAgIHJlYy50YXNrX2lkcy5mb3JFYWNoKHB1c2hJZClcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjLnRhc2tzKSkge1xuICAgICAgcmVjLnRhc2tzLmZvckVhY2godCA9PiB7XG4gICAgICAgIGlmICh0ICYmIHR5cGVvZiB0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICAgIGNvbnN0IHRyZWMgPSB0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgcHVzaElkKHRyZWMudGFza19pZCA/PyB0cmVjLmlkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGlkc1xufVxuXG5leHBvcnQgY29uc3QgZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMgPSAocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSk6IG51bWJlcltdID0+IHtcbiAgY29uc3QgaWRzOiBudW1iZXJbXSA9IFtdXG4gIHBlbmRpbmdBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICBpZiAoIWFjdGlvbiB8fCB0eXBlb2YgYWN0aW9uICE9PSAnb2JqZWN0JykgcmV0dXJuXG4gICAgY29uc3QgYXJncyA9IGFjdGlvbi50b29sX2FyZ3NcbiAgICBpZiAoIShhcmdzICYmIHR5cGVvZiBhcmdzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmdzKSkpIHJldHVyblxuICAgIGNvbnN0IHJlYyA9IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBpZiAoYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2RlbGV0ZV90YXNrJykge1xuICAgICAgY29uc3QgcmF3ID0gcmVjLnRhc2tfaWQgPz8gcmVjLmlkXG4gICAgICBpZiAocmF3ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyhyYXcpLCAxMClcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhY3Rpb24udG9vbF9uYW1lID09PSAnZGVsZXRlX3Rhc2tzX2JhdGNoJykge1xuICAgICAgY29uc3QgbGlzdCA9IHJlYy50YXNrX2lkc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgbGlzdC5mb3JFYWNoKHRpZCA9PiB7XG4gICAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KFN0cmluZyh0aWQpLCAxMClcbiAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgaWRzLnB1c2gobilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBpZHNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RBZ2VudElkRnJvbUVkaXRBZ2VudFBlbmRpbmdBY3Rpb25zID0gKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgZWRpdEFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLmZpbmQoYSA9PiAoYS50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdlZGl0X2FnZW50JylcbiAgaWYgKFxuICAgICFlZGl0QWN0aW9uIHx8XG4gICAgIWVkaXRBY3Rpb24udG9vbF9hcmdzIHx8XG4gICAgdHlwZW9mIGVkaXRBY3Rpb24udG9vbF9hcmdzICE9PSAnb2JqZWN0JyB8fFxuICAgIEFycmF5LmlzQXJyYXkoZWRpdEFjdGlvbi50b29sX2FyZ3MpXG4gICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVjID0gZWRpdEFjdGlvbi50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgY29uc3QgcmF3ID0gcmVjLmFnZW50X2lkID8/IHJlYy5hZ2VudElkXG4gIHJldHVybiByYXcgIT0gbnVsbCA/IFN0cmluZyhyYXcpIDogbnVsbFxufVxuXG5leHBvcnQgY29uc3QgZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lID0gKFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdLFxuICB0b29sTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgYWN0aW9uID0gcGVuZGluZ0FjdGlvbnMuZmluZChhID0+IChhLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gdG9vbE5hbWUudG9Mb3dlckNhc2UoKSlcbiAgaWYgKCFhY3Rpb24gfHwgIWFjdGlvbi50b29sX2FyZ3MgfHwgdHlwZW9mIGFjdGlvbi50b29sX2FyZ3MgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoYWN0aW9uLnRvb2xfYXJncykpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IHJlYyA9IGFjdGlvbi50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgY29uc3QgcmF3ID0gcmVjLmFnZW50X2lkID8/IHJlYy5hZ2VudElkID8/IHJlYy5pZFxuICByZXR1cm4gcmF3ICE9IG51bGwgPyBTdHJpbmcocmF3KSA6IG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RUYXNrSWRzRnJvbUFzc2lzdGFudERlbGV0aW9uVGV4dCA9ICh0ZXh0OiBzdHJpbmcpOiBudW1iZXJbXSA9PiB7XG4gIGNvbnN0IGxhYmVsZWQgPSB0ZXh0Lm1hdGNoKC9cXGJJRFxccypcXCpcXCooXFxkKylcXCpcXCovaSlcbiAgaWYgKGxhYmVsZWQpIHtcbiAgICBjb25zdCBuID0gcGFyc2VJbnQobGFiZWxlZFsxXSwgMTApXG4gICAgcmV0dXJuIE51bWJlci5pc05hTihuKSA/IFtdIDogW25dXG4gIH1cbiAgY29uc3QgYm9sZCA9IHRleHQubWF0Y2goL1xcKlxcKihcXGR7NSx9KVxcKlxcKi8pXG4gIGlmIChib2xkKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGJvbGRbMV0sIDEwKVxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBbXSA6IFtuXVxuICB9XG4gIHJldHVybiBbXVxufVxuXG5leHBvcnQgY29uc3QgVEFTS19DUkVBVElPTl9UT09MUyA9IFsnY3JlYXRlX3Rhc2snLCAnY3JlYXRlX3Rhc2tzX2JhdGNoJywgJ2Nsb25lX3Rhc2snXSBhcyBjb25zdFxuZXhwb3J0IGNvbnN0IFRBU0tfRURJVF9UT09MUyA9IFtcbiAgJ2VkaXRfdGFzaycsXG4gICdlZGl0X3Rhc2tzX2JhdGNoJyxcbiAgJ3Rhc2tfYXNzaWduJyxcbiAgJ3Rhc2tfdW5hc3NpZ24nLFxuICAndXBkYXRlX3Rhc2tfdHlwZScsXG4gICd1cGRhdGVfZXN0aW1hdGVkX2hvdXJzJyxcbiAgJ2Fzc2lnbl90YXNrX2xhYmVsJyxcbl0gYXMgY29uc3RcbmV4cG9ydCBjb25zdCBUQVNLX0RFTEVURV9UT09MUyA9IFsnZGVsZXRlX3Rhc2snLCAnZGVsZXRlX3Rhc2tzX2JhdGNoJ10gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IGlzVGFza0VkaXRUb29sTmFtZSA9ICh0b29sTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4gPT5cbiAgISF0b29sTmFtZSAmJiAoVEFTS19FRElUX1RPT0xTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh0b29sTmFtZSlcblxuZXhwb3J0IGNvbnN0IGlzVGFza0RlbGV0ZVRvb2xOYW1lID0gKHRvb2xOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogYm9vbGVhbiA9PlxuICAhIXRvb2xOYW1lICYmIChUQVNLX0RFTEVURV9UT09MUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModG9vbE5hbWUpXG5cbmNvbnN0IHBlbmRpbmdBY3Rpb25zSW5jbHVkZVRvb2wgPSAocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSwgdG9vbHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiA9PlxuICBwZW5kaW5nQWN0aW9ucy5zb21lKGFjdGlvbiA9PiB0b29scy5pbmNsdWRlcyhhY3Rpb24udG9vbF9uYW1lIHx8ICcnKSlcblxuZXhwb3J0IHR5cGUgQXBwcm92ZWRQZW5kaW5nQWN0aW9uRmxhZ3MgPSB7XG4gIHdhc1Rhc2tDcmVhdGlvbjogYm9vbGVhblxuICB3YXNUYXNrRWRpdDogYm9vbGVhblxuICB3YXNUYXNrRGVsZXRlOiBib29sZWFuXG4gIHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQ6IGJvb2xlYW5cbiAgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZDogYm9vbGVhblxuICB3YXNFZGl0QWdlbnRBcHByb3ZlZDogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUFwcHJvdmVkUGVuZGluZ0FjdGlvbkZsYWdzID0gKFxuICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlOiBib29sZWFuLFxuICBhcHByb3ZhbFN0YXR1czogQ2hhdE1lc3NhZ2VbJ2FwcHJvdmFsU3RhdHVzJ10sXG4gIHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW11cbik6IEFwcHJvdmVkUGVuZGluZ0FjdGlvbkZsYWdzID0+IHtcbiAgY29uc3QgYXBwcm92ZWQgPSBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIGFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnXG5cbiAgcmV0dXJuIHtcbiAgICB3YXNUYXNrQ3JlYXRpb246IGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgcGVuZGluZ0FjdGlvbnNJbmNsdWRlVG9vbChwZW5kaW5nQWN0aW9ucywgVEFTS19DUkVBVElPTl9UT09MUyksXG4gICAgd2FzVGFza0VkaXQ6IGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgcGVuZGluZ0FjdGlvbnNJbmNsdWRlVG9vbChwZW5kaW5nQWN0aW9ucywgVEFTS19FRElUX1RPT0xTKSxcbiAgICB3YXNUYXNrRGVsZXRlOiBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIHBlbmRpbmdBY3Rpb25zSW5jbHVkZVRvb2wocGVuZGluZ0FjdGlvbnMsIFRBU0tfREVMRVRFX1RPT0xTKSxcbiAgICB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkOiBhcHByb3ZlZCAmJiBwZW5kaW5nQWN0aW9uc0luY2x1ZGVUb29sKHBlbmRpbmdBY3Rpb25zLCBbJ2NyZWF0ZV9hZ2VudCddKSxcbiAgICB3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkOlxuICAgICAgYXBwcm92ZWQgJiYgcGVuZGluZ0FjdGlvbnMuc29tZShhY3Rpb24gPT4gKGFjdGlvbi50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdjb25maWd1cmVfYWdlbnRfYWNjZXNzJyksXG4gICAgd2FzRWRpdEFnZW50QXBwcm92ZWQ6XG4gICAgICBhcHByb3ZlZCAmJiBwZW5kaW5nQWN0aW9ucy5zb21lKGFjdGlvbiA9PiAoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2VkaXRfYWdlbnQnKSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU3luY1Rhc2tEYXNoYm9hcmQgPSAoXG4gIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2U6IGJvb2xlYW4sXG4gIHdhc1Rhc2tDcmVhdGlvbjogYm9vbGVhbixcbiAgd2FzVGFza0VkaXQ6IGJvb2xlYW4sXG4gIHdhc1Rhc2tEZWxldGU6IGJvb2xlYW4sXG4gIHRhc2tJZHNGb3JEYXNoYm9hcmQ6IG51bWJlcltdXG4pOiBib29sZWFuID0+XG4gIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UgJiYgKHdhc1Rhc2tDcmVhdGlvbiB8fCB3YXNUYXNrRWRpdCB8fCB3YXNUYXNrRGVsZXRlKSAmJiB0YXNrSWRzRm9yRGFzaGJvYXJkLmxlbmd0aCA+IDBcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVUYXNrSWRzRm9yRGFzaGJvYXJkID0gKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHRhc2tVcmxSZWdleDogUmVnRXhwLFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdLFxuICB3YXNUYXNrRGVsZXRlOiBib29sZWFuXG4pOiBudW1iZXJbXSA9PiB7XG4gIGNvbnN0IHRhc2tJZHNGcm9tVXJscyA9IFsuLi5jb250ZW50Lm1hdGNoQWxsKHRhc2tVcmxSZWdleCldLm1hcChtYXRjaCA9PiBwYXJzZUludChtYXRjaFsxXSwgMTApKVxuICBjb25zdCB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsID0gZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gIGNvbnN0IHRhc2tJZHNGcm9tRGVsZXRpb25UZXh0ID1cbiAgICB3YXNUYXNrRGVsZXRlICYmIHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPT09IDAgJiYgdGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbC5sZW5ndGggPT09IDBcbiAgICAgID8gZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0KGNvbnRlbnQpXG4gICAgICA6IFtdXG5cbiAgaWYgKHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPiAwKSByZXR1cm4gdGFza0lkc0Zyb21VcmxzXG4gIGlmICh0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLmxlbmd0aCA+IDApIHJldHVybiB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsXG4gIHJldHVybiB0YXNrSWRzRnJvbURlbGV0aW9uVGV4dFxufVxuXG5leHBvcnQgY29uc3QgcmVwbGFjZVRhc2tVcmxzV2l0aFRhYlNlZ21lbnQgPSAoY29udGVudDogc3RyaW5nLCB0YXNrVXJsUmVnZXg6IFJlZ0V4cCwgdGFiU2VnbWVudDogc3RyaW5nKTogc3RyaW5nID0+XG4gIGNvbnRlbnQucmVwbGFjZSh0YXNrVXJsUmVnZXgsIHVybCA9PlxuICAgIHVybC5yZXBsYWNlKC9cXC8oZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycykoPz0kfFxcPykvLCB0YWJTZWdtZW50KVxuICApXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUHJvamVjdERhc2hib2FyZFN5bmMgPSAoXG4gIGNvbnRleHRQcm9qZWN0SWQ6IG51bWJlciB8IG51bGwsXG4gIHBhdGhuYW1lOiBzdHJpbmdcbik6IHsgcm91dGVQcm9qZWN0SWQ6IG51bWJlciB8IG51bGw7IGlzT25Qcm9qZWN0Um91dGU6IGJvb2xlYW4gfSA9PiB7XG4gIGNvbnN0IHBhdGhNYXRjaCA9IHBhdGhuYW1lLm1hdGNoKC9eXFwvcHJvamVjdHNcXC8oXFxkKylcXC8vKVxuICBjb25zdCByb3V0ZVByb2plY3RJZCA9IHBhdGhNYXRjaCA/IHBhcnNlSW50KHBhdGhNYXRjaFsxXSwgMTApIDogbnVsbFxuICBjb25zdCBpc09uUHJvamVjdFJvdXRlID0gQm9vbGVhbihjb250ZXh0UHJvamVjdElkICYmIHJvdXRlUHJvamVjdElkICYmIGNvbnRleHRQcm9qZWN0SWQgPT09IHJvdXRlUHJvamVjdElkKVxuICByZXR1cm4geyByb3V0ZVByb2plY3RJZCwgaXNPblByb2plY3RSb3V0ZSB9XG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQ3JlYXRlQWdlbnRGb2xsb3dVcCA9IChcbiAgZmxhZ3M6IFBpY2s8QXBwcm92ZWRQZW5kaW5nQWN0aW9uRmxhZ3MsICd3YXNDcmVhdGVBZ2VudEFwcHJvdmVkJyB8ICd3YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkJz4sXG4gIG11bHRpQWdlbnRzQWNjZXNzOiBib29sZWFuLFxuICBjb21wbGV0ZWRBZ2VudElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBwZW5kaW5nQWN0aW9uczogUGVuZGluZ0FjdGlvbltdXG4pOiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFtdWx0aUFnZW50c0FjY2VzcykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGlmIChmbGFncy53YXNDcmVhdGVBZ2VudEFwcHJvdmVkICYmIGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSkge1xuICAgIHJldHVybiB7IGFnZW50SWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH1cbiAgfVxuXG4gIGlmIChmbGFncy53YXNDb25maWd1cmVBZ2VudEFjY2Vzc0FwcHJvdmVkKSB7XG4gICAgY29uc3QgY29uZmlndXJlZEFnZW50SWQgPVxuICAgICAgY29tcGxldGVkQWdlbnRJZD8udHJpbSgpIHx8IGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZShwZW5kaW5nQWN0aW9ucywgJ2NvbmZpZ3VyZV9hZ2VudF9hY2Nlc3MnKVxuICAgIGlmIChjb25maWd1cmVkQWdlbnRJZCkge1xuICAgICAgcmV0dXJuIHsgYWdlbnRJZDogY29uZmlndXJlZEFnZW50SWQgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVFZGl0QWdlbnRGb2xsb3dVcCA9IChcbiAgd2FzRWRpdEFnZW50QXBwcm92ZWQ6IGJvb2xlYW4sXG4gIGNvbXBsZXRlZEFnZW50SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW11cbik6IHsgYWdlbnRJZDogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXdhc0VkaXRBZ2VudEFwcHJvdmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IHJlc29sdmVkQWdlbnRJZCA9IGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSB8fCBleHRyYWN0QWdlbnRJZEZyb21FZGl0QWdlbnRQZW5kaW5nQWN0aW9ucyhwZW5kaW5nQWN0aW9ucylcbiAgcmV0dXJuIHJlc29sdmVkQWdlbnRJZCA/IHsgYWdlbnRJZDogcmVzb2x2ZWRBZ2VudElkIH0gOiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlZmV0Y2hPcGVuVGFza1BhbmVsID0gKFxuICBvcGVuVGFza1BhbmVsSWQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgZmxhZ3M6IFBpY2s8QXBwcm92ZWRQZW5kaW5nQWN0aW9uRmxhZ3MsICd3YXNUYXNrRWRpdCcgfCAnd2FzVGFza0RlbGV0ZSc+LFxuICBtYW51YWxGbGFnczogeyBtYW51YWxXYXNUYXNrRWRpdDogYm9vbGVhbjsgbWFudWFsV2FzVGFza0RlbGV0ZTogYm9vbGVhbiB9LFxuICBhZmZlY3RlZFRhc2tJZHM6IHN0cmluZ1tdXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKG9wZW5UYXNrUGFuZWxJZCA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgdGFza0Zsb3dBY3RpdmUgPVxuICAgIGZsYWdzLndhc1Rhc2tFZGl0IHx8IGZsYWdzLndhc1Rhc2tEZWxldGUgfHwgbWFudWFsRmxhZ3MubWFudWFsV2FzVGFza0VkaXQgfHwgbWFudWFsRmxhZ3MubWFudWFsV2FzVGFza0RlbGV0ZVxuICBpZiAoIXRhc2tGbG93QWN0aXZlKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGFmZmVjdGVkVGFza0lkcy5pbmNsdWRlcyhTdHJpbmcob3BlblRhc2tQYW5lbElkKSlcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTdHJlYW1FcnJvclByZXNlbnRhdGlvbiA9IChlcnJvck1lc3NhZ2U/OiBzdHJpbmcsIGVycm9yUmF3TWVzc2FnZT86IHN0cmluZykgPT4ge1xuICBjb25zdCBpc0FjY2Vzc0RlbmllZCA9IGVycm9yTWVzc2FnZSA9PT0gXCJBY2Nlc3MgZGVuaWVkOiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGlzIGFnZW50XCJcbiAgY29uc3QgaXNQcm9tcHRUb29Mb25nID1cbiAgICBlcnJvck1lc3NhZ2UgPT09ICdpbnZhbGlkX3JlcXVlc3RfZXJyb3InICYmIEJvb2xlYW4oZXJyb3JSYXdNZXNzYWdlPy5pbmNsdWRlcygncHJvbXB0IGlzIHRvbyBsb25nJykpXG4gIGNvbnN0IHRva2Vuc1VzZWQgPSBlcnJvclJhd01lc3NhZ2U/Lm1hdGNoKC8oXFxkKykgdG9rZW5zLyk/LlsxXSA/PyAnJ1xuXG4gIHJldHVybiB7XG4gICAgaXNBY2Nlc3NEZW5pZWQsXG4gICAgaXNQcm9tcHRUb29Mb25nLFxuICAgIHRva2Vuc1VzZWQsXG4gICAgc2hvd1JldHJ5OiAhaXNBY2Nlc3NEZW5pZWQgJiYgIWlzUHJvbXB0VG9vTG9uZyxcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBTdHJlYW1FcnJvck1lc3NhZ2VLZXkgPSAnY2hhdC5lcnJvckFjY2Vzc0RlbmllZCcgfCAnY2hhdC5lcnJvclByb21wdFRvb0xvbmcnIHwgJ2NoYXQuZXJyb3InXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtRXJyb3JNZXNzYWdlS2V5ID0gKFxuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmcsXG4gIGVycm9yUmF3TWVzc2FnZT86IHN0cmluZ1xuKTogeyBtZXNzYWdlS2V5OiBTdHJlYW1FcnJvck1lc3NhZ2VLZXk7IHRva2Vuc1VzZWQ6IHN0cmluZzsgc2hvd1JldHJ5OiBib29sZWFuIH0gPT4ge1xuICBjb25zdCBwcmVzZW50YXRpb24gPSByZXNvbHZlU3RyZWFtRXJyb3JQcmVzZW50YXRpb24oZXJyb3JNZXNzYWdlLCBlcnJvclJhd01lc3NhZ2UpXG4gIGxldCBtZXNzYWdlS2V5OiBTdHJlYW1FcnJvck1lc3NhZ2VLZXkgPSAnY2hhdC5lcnJvcidcbiAgaWYgKHByZXNlbnRhdGlvbi5pc0FjY2Vzc0RlbmllZCkgbWVzc2FnZUtleSA9ICdjaGF0LmVycm9yQWNjZXNzRGVuaWVkJ1xuICBlbHNlIGlmIChwcmVzZW50YXRpb24uaXNQcm9tcHRUb29Mb25nKSBtZXNzYWdlS2V5ID0gJ2NoYXQuZXJyb3JQcm9tcHRUb29Mb25nJ1xuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZUtleSxcbiAgICB0b2tlbnNVc2VkOiBwcmVzZW50YXRpb24udG9rZW5zVXNlZCxcbiAgICBzaG93UmV0cnk6IHByZXNlbnRhdGlvbi5zaG93UmV0cnksXG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUHJvamVjdERhc2hib2FyZE11dGF0aW9uID0gJ2NyZWF0ZScgfCAnZWRpdCcgfCAnZGVsZXRlJ1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVByb2plY3REYXNoYm9hcmRNdXRhdGlvbiA9IChmbGFnczoge1xuICB3YXNUYXNrQ3JlYXRpb246IGJvb2xlYW5cbiAgd2FzVGFza0VkaXQ6IGJvb2xlYW5cbiAgd2FzVGFza0RlbGV0ZTogYm9vbGVhblxufSk6IFByb2plY3REYXNoYm9hcmRNdXRhdGlvbiB8IG51bGwgPT4ge1xuICBpZiAoZmxhZ3Mud2FzVGFza0NyZWF0aW9uKSByZXR1cm4gJ2NyZWF0ZSdcbiAgaWYgKGZsYWdzLndhc1Rhc2tFZGl0KSByZXR1cm4gJ2VkaXQnXG4gIGlmIChmbGFncy53YXNUYXNrRGVsZXRlKSByZXR1cm4gJ2RlbGV0ZSdcbiAgcmV0dXJuIG51bGxcbn1cblxudHlwZSBQcm9qZWN0RGFzaGJvYXJkQXBpID0ge1xuICBhZGRFeGlzdGluZ1Rhc2tUb0Rhc2hib2FyZD86ICh0YXNrSWRzOiBudW1iZXJbXSkgPT4gdm9pZFxuICBlZGl0RXhpc3RpbmdUYXNrSW5EYXNoYm9hcmQ/OiAodGFza0lkczogbnVtYmVyW10pID0+IHZvaWRcbiAgZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZD86ICh0YXNrSWRzOiBudW1iZXJbXSkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24gPSAoXG4gIG11dGF0aW9uOiBQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24gfCBudWxsLFxuICB0YXNrSWRzOiBudW1iZXJbXSxcbiAgZGFzaGJvYXJkOiBQcm9qZWN0RGFzaGJvYXJkQXBpIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogdm9pZCA9PiB7XG4gIGlmICghbXV0YXRpb24gfHwgIWRhc2hib2FyZCkgcmV0dXJuXG4gIGlmIChtdXRhdGlvbiA9PT0gJ2NyZWF0ZScpIHtcbiAgICBkYXNoYm9hcmQuYWRkRXhpc3RpbmdUYXNrVG9EYXNoYm9hcmQ/Lih0YXNrSWRzKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChtdXRhdGlvbiA9PT0gJ2VkaXQnKSB7XG4gICAgZGFzaGJvYXJkLmVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgcmV0dXJuXG4gIH1cbiAgZGFzaGJvYXJkLmRlbGV0ZUV4aXN0aW5nVGFza0Zyb21EYXNoYm9hcmQ/Lih0YXNrSWRzKVxufVxuXG5leHBvcnQgY29uc3QgbWVyZ2VBZmZlY3RlZFRhc2tJZHNGb3JQYW5lbFJlZmV0Y2ggPSAoXG4gIHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10sXG4gIHRhc2tJZHNGb3JEYXNoYm9hcmQ6IG51bWJlcltdLFxuICBtYW51YWxBcHByb3ZhbD86IHsgdG9vbE5hbWU6IHN0cmluZzsgdG9vbEFyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfSB8IG51bGxcbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgbWFudWFsUHNldWRvQWN0aW9uczogUGVuZGluZ0FjdGlvbltdID0gW11cbiAgaWYgKG1hbnVhbEFwcHJvdmFsKSB7XG4gICAgbWFudWFsUHNldWRvQWN0aW9ucy5wdXNoKHtcbiAgICAgIHRvb2xfbmFtZTogbWFudWFsQXBwcm92YWwudG9vbE5hbWUsXG4gICAgICB0b29sX2FyZ3M6IG1hbnVhbEFwcHJvdmFsLnRvb2xBcmdzID8/IHt9LFxuICAgICAgdGhyZWFkX2lkOiAnbWFudWFsJyxcbiAgICAgIHRvb2xfY2FsbF9pZDogJ21hbnVhbCcsXG4gICAgfSBhcyBQZW5kaW5nQWN0aW9uKVxuICB9XG5cbiAgcmV0dXJuIFtcbiAgICAuLi5leHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MocGVuZGluZ0FjdGlvbnMpLFxuICAgIC4uLnRhc2tJZHNGb3JEYXNoYm9hcmQsXG4gICAgLi4uZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzKG1hbnVhbFBzZXVkb0FjdGlvbnMpLFxuICBdLm1hcChTdHJpbmcpXG59XG5cbmV4cG9ydCBjb25zdCBtYXBBdXRoVXNlclRvQ2hhdE1lc3NhZ2VVc2VyID0gKGF1dGhVc2VyOiBDT1JVc2VyKTogQ2hhdE1lc3NhZ2VVc2VyID0+ICh7XG4gIGlkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICBuYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gIGF2YXRhcjogYXV0aFVzZXIucGljdHVyZSxcbn0pXG5cbmV4cG9ydCBjb25zdCBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEluTGlzdCA9IChcbiAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgbWVzc2FnZXM6IENoYXRNZXNzYWdlW10sXG4gIHNlc3Npb25JZDogc3RyaW5nXG4pOiB7IG1lc3NhZ2U6IENoYXRNZXNzYWdlOyBzZXNzaW9uSWQ6IHN0cmluZyB9IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGZvdW5kID0gbWVzc2FnZXMuZmluZChtZXNzYWdlID0+XG4gICAgbWVzc2FnZS5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zPy5zb21lKGFjdGlvbiA9PiB0aHJlYWRJZHMuaW5jbHVkZXMoYWN0aW9uLnRocmVhZF9pZCkpXG4gIClcblxuICBpZiAoZm91bmQ/LmFwcHJvdmFsKSB7XG4gICAgcmV0dXJuIHsgbWVzc2FnZTogZm91bmQsIHNlc3Npb25JZDogZm91bmQuYXBwcm92YWwuc2Vzc2lvbl9pZCB8fCBzZXNzaW9uSWQgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IGNhblNlbmRDaGF0TWVzc2FnZSA9IChcbiAgaXNQcm9jZXNzaW5nOiBib29sZWFuLFxuICB3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW4sXG4gIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhblxuKTogYm9vbGVhbiA9PiAhKGlzUHJvY2Vzc2luZyB8fCB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzKVxuXG5leHBvcnQgdHlwZSBTZW5kTWVzc2FnZUJsb2NrUmVhc29uID0gJ2J1c3knIHwgJ2NvbmN1cnJlbmN5J1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkQmxvY2tDb25jdXJyZW50U3RyZWFtU3RhcnQgPSAoXG4gIHdpbGxTdGFydE5ld1N0cmVhbTogYm9vbGVhbixcbiAgYWN0aXZlQ291bnQ6IG51bWJlcixcbiAgbWF4Q29uY3VycmVudDogbnVtYmVyXG4pOiBib29sZWFuID0+IHdpbGxTdGFydE5ld1N0cmVhbSAmJiBhY3RpdmVDb3VudCA+PSBtYXhDb25jdXJyZW50XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2VuZE1lc3NhZ2VHYXRlID0gKHBhcmFtczoge1xuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW5cbiAgd2FpdGluZ1Jlc3BvbnNlOiBib29sZWFuXG4gIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhblxuICB3aWxsU3RhcnROZXdTdHJlYW06IGJvb2xlYW5cbiAgYWN0aXZlU3RyZWFtQ291bnQ6IG51bWJlclxuICBtYXhDb25jdXJyZW50OiBudW1iZXJcbn0pOiBTZW5kTWVzc2FnZUJsb2NrUmVhc29uIHwgbnVsbCA9PiB7XG4gIGlmICghY2FuU2VuZENoYXRNZXNzYWdlKHBhcmFtcy5pc1Byb2Nlc3NpbmcsIHBhcmFtcy53YWl0aW5nUmVzcG9uc2UsIHBhcmFtcy5sb2FkaW5nTWVzc2FnZXMpKSB7XG4gICAgcmV0dXJuICdidXN5J1xuICB9XG4gIGlmIChzaG91bGRCbG9ja0NvbmN1cnJlbnRTdHJlYW1TdGFydChwYXJhbXMud2lsbFN0YXJ0TmV3U3RyZWFtLCBwYXJhbXMuYWN0aXZlU3RyZWFtQ291bnQsIHBhcmFtcy5tYXhDb25jdXJyZW50KSkge1xuICAgIHJldHVybiAnY29uY3VycmVuY3knXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTZW5kTWVzc2FnZVBheWxvYWRGaWVsZHMgPSAoXG4gIG9wdGlvbnM6IFNlbmRNZXNzYWdlT3B0aW9ucyxcbiAgcG9zaXRpb25hbD86IHtcbiAgICBmYXFJZD86IHN0cmluZ1xuICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdXG4gICAgZnVhSWQ/OiBzdHJpbmdcbiAgICBzY0lkPzogc3RyaW5nXG4gICAgY29udGV4dERhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB9XG4pID0+ICh7XG4gIGZhcUlkOiBwb3NpdGlvbmFsPy5mYXFJZCA/PyBvcHRpb25zLmZhcUlkLFxuICBhZ2VudFN1Z2dlc3Rpb25JZDogcG9zaXRpb25hbD8uYWdlbnRTdWdnZXN0aW9uSWQgPz8gb3B0aW9ucy5hZ2VudFN1Z2dlc3Rpb25JZCxcbiAgbWVudGlvbnM6IHBvc2l0aW9uYWw/Lm1lbnRpb25zID8/IG9wdGlvbnMubWVudGlvbnMsXG4gIGZ1YUlkOiBwb3NpdGlvbmFsPy5mdWFJZCA/PyBvcHRpb25zLmZ1YUlkLFxuICBzY0lkOiBwb3NpdGlvbmFsPy5zY0lkID8/IG9wdGlvbnMuc2NJZCxcbiAgY29udGV4dERhdGE6IHBvc2l0aW9uYWw/LmNvbnRleHREYXRhID8/IG9wdGlvbnMuY29udGV4dERhdGEsXG59KVxuXG5leHBvcnQgY29uc3QgYnVpbGRDaGF0SGlzdG9yeUZyb21NZXNzYWdlcyA9IChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSwgYXV0aFVzZXJJZDogc3RyaW5nKTogQ2hhdEhpc3RvcnlbXSA9PlxuICBtZXNzYWdlcy5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgIHJvbGU6IGhpc3RvcnlNZXNzYWdlLnVzZXIuaWQgPT09IGF1dGhVc2VySWQgPyBDaGF0SGlzdG9yeVJvbGUuVVNFUiA6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gIH0pKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUxhc3RNZXNzYWdlQWdlbnRJZCA9IChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiBtZXNzYWdlcy5hdCgtMSk/LmFnZW50SWRcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBZ2VudElkRm9yU3RyZWFtID0gKFxuICBhZ2VudElkRnJvbU1lc3NhZ2VzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrQWdlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgPT4gYWdlbnRJZEZyb21NZXNzYWdlcyB8fCBmYWxsYmFja0FnZW50SWQgfHwgJydcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVVc2VyUXVlc3Rpb25NZXNzYWdlSWQgPSAodHVybk1lc3NhZ2VJZDogc3RyaW5nKTogc3RyaW5nID0+IGBxdWVzdGlvbi0ke3R1cm5NZXNzYWdlSWR9YFxuXG5leHBvcnQgdHlwZSBNYWlhU3RyZWFtUmVxdWVzdFBheWxvYWQgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBoaXN0b3J5OiBDaGF0SGlzdG9yeVtdXG4gIHByb2plY3RJZDogbnVtYmVyIHwgbnVsbFxuICBsYW5nOiBzdHJpbmdcbiAgdXNlcklkOiBzdHJpbmdcbiAgZmlyc3ROYW1lOiBzdHJpbmdcbiAgbGFzdE5hbWU6IHN0cmluZ1xuICBjb21wYW55SWQ6IHN0cmluZ1xuICBjaGF0SWQ6IHN0cmluZ1xuICBtZXNzYWdlSWQ6IHN0cmluZ1xuICBhZ2VudE5hbWU6IHN0cmluZ1xuICBhZ2VudElkOiBzdHJpbmdcbiAgaXNXZWJTZWFyY2hBY3RpdmU6IGJvb2xlYW5cbiAgaXNEZWVwU2VhcmNoQWN0aXZlOiBib29sZWFuXG4gIGlzQXV0b0FwcHJvdmVBY3RpdmU6IGJvb2xlYW5cbiAgY2xpZW50SWQ/OiBudW1iZXJcbiAgY2xpZW50TmFtZT86IHN0cmluZ1xuICBmZWVJZD86IG51bWJlclxuICBwcm9qZWN0TmFtZT86IHN0cmluZ1xuICB0YXNrSWQ/OiBudW1iZXJcbiAgdGFza05hbWU/OiBzdHJpbmdcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGZhcUlkPzogc3RyaW5nXG4gIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gIGZ1YUlkPzogc3RyaW5nXG4gIHNjSWQ/OiBzdHJpbmdcbiAgYWdlbnRFbnRpdHk/OiBBZ2VudEVudGl0eVxuICBhZ2VudFR5cGU/OiBBZ2VudFR5cGVcbiAgYWdlbnRFbW9qaT86IHN0cmluZyB8IG51bGxcbiAgY29udGV4dE1lc3NhZ2U/OiBDb250ZXh0TWVzc2FnZVxuICBjb250ZXh0RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG59XG5cbmV4cG9ydCBjb25zdCBidWlsZE1haWFTdHJlYW1SZXF1ZXN0UGF5bG9hZCA9IChwYXJhbXM6IHtcbiAgbWVzc2FnZTogc3RyaW5nXG4gIGhpc3Rvcnk6IENoYXRIaXN0b3J5W11cbiAgcHJvamVjdElkOiBudW1iZXIgfCBudWxsXG4gIGF1dGhVc2VyOiBQaWNrPENPUlVzZXIsICdsYW5nJyB8ICdpZCcgfCAnZmlyc3ROYW1lJyB8ICdsYXN0TmFtZScgfCAnY29tcGFueV9pZCc+XG4gIGNoYXRJZDogc3RyaW5nXG4gIG1lc3NhZ2VJZDogc3RyaW5nXG4gIGFnZW50TmFtZTogc3RyaW5nXG4gIGFnZW50SWQ6IHN0cmluZ1xuICBpc1dlYlNlYXJjaEFjdGl2ZTogYm9vbGVhblxuICBpc0RlZXBTZWFyY2hBY3RpdmU6IGJvb2xlYW5cbiAgaXNBdXRvQXBwcm92ZUFjdGl2ZTogYm9vbGVhblxuICBjdHhQcm9qZWN0OiBQcm9qZWN0IHwgbnVsbCB8IHVuZGVmaW5lZFxuICBjdHhDbGllbnQ6IHsgaWQ/OiBudW1iZXI7IG5hbWU/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWRcbiAgY3R4VGFzazogeyBpZD86IG51bWJlciB8IHN0cmluZzsgbmFtZT86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZFxuICBwcm9qZWN0TmFtZT86IHN0cmluZ1xuICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW11cbiAgZmFxSWQ/OiBzdHJpbmdcbiAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgZnVhSWQ/OiBzdHJpbmdcbiAgc2NJZD86IHN0cmluZ1xuICBhZ2VudEVudGl0eT86IEFnZW50RW50aXR5XG4gIGFnZW50VHlwZT86IEFnZW50VHlwZVxuICBhZ2VudEVtb2ppPzogc3RyaW5nIHwgbnVsbFxuICBjb250ZXh0TWVzc2FnZT86IENvbnRleHRNZXNzYWdlXG4gIGNvbnRleHREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbn0pOiBNYWlhU3RyZWFtUmVxdWVzdFBheWxvYWQgPT4gKHtcbiAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gIGhpc3Rvcnk6IHBhcmFtcy5oaXN0b3J5LFxuICBwcm9qZWN0SWQ6IHBhcmFtcy5wcm9qZWN0SWQsXG4gIGxhbmc6IHBhcmFtcy5hdXRoVXNlci5sYW5nLFxuICB1c2VySWQ6IHBhcmFtcy5hdXRoVXNlci5pZC50b1N0cmluZygpLFxuICBmaXJzdE5hbWU6IHBhcmFtcy5hdXRoVXNlci5maXJzdE5hbWUsXG4gIGxhc3ROYW1lOiBwYXJhbXMuYXV0aFVzZXIubGFzdE5hbWUsXG4gIGNvbXBhbnlJZDogcGFyYW1zLmF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgY2hhdElkOiBwYXJhbXMuY2hhdElkLFxuICBtZXNzYWdlSWQ6IHBhcmFtcy5tZXNzYWdlSWQsXG4gIGFnZW50TmFtZTogcGFyYW1zLmFnZW50TmFtZSxcbiAgYWdlbnRJZDogcGFyYW1zLmFnZW50SWQsXG4gIGlzV2ViU2VhcmNoQWN0aXZlOiBwYXJhbXMuaXNXZWJTZWFyY2hBY3RpdmUsXG4gIGlzRGVlcFNlYXJjaEFjdGl2ZTogcGFyYW1zLmlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgaXNBdXRvQXBwcm92ZUFjdGl2ZTogcGFyYW1zLmlzQXV0b0FwcHJvdmVBY3RpdmUsXG4gIC4uLihwYXJhbXMuY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihwYXJhbXMuY3R4UHJvamVjdC5mZWVJZCkgfSA6IHt9KSxcbiAgLi4ucmVzb2x2ZUNsaWVudFBheWxvYWQocGFyYW1zLmN0eENsaWVudCwgcGFyYW1zLmN0eFByb2plY3QpLFxuICAuLi4ocGFyYW1zLnByb2plY3ROYW1lID8geyBwcm9qZWN0TmFtZTogcGFyYW1zLnByb2plY3ROYW1lIH0gOiB7fSksXG4gIC4uLihwYXJhbXMuY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgID8geyB0YXNrSWQ6IE51bWJlcihwYXJhbXMuY3R4VGFzay5pZCksIC4uLihwYXJhbXMuY3R4VGFzay5uYW1lID8geyB0YXNrTmFtZTogcGFyYW1zLmN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICA6IHt9KSxcbiAgLi4uKHBhcmFtcy5hdHRhY2htZW50cyAmJiBwYXJhbXMuYXR0YWNobWVudHMubGVuZ3RoID4gMCA/IHsgYXR0YWNobWVudHM6IHBhcmFtcy5hdHRhY2htZW50cyB9IDoge30pLFxuICAuLi4ocGFyYW1zLmZhcUlkID8geyBmYXFJZDogcGFyYW1zLmZhcUlkIH0gOiB7fSksXG4gIC4uLihwYXJhbXMuYWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiBwYXJhbXMuYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgLi4uKHBhcmFtcy5mdWFJZCA/IHsgZnVhSWQ6IHBhcmFtcy5mdWFJZCB9IDoge30pLFxuICAuLi4ocGFyYW1zLnNjSWQgPyB7IHNjSWQ6IHBhcmFtcy5zY0lkIH0gOiB7fSksXG4gIC4uLihwYXJhbXMuYWdlbnRFbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IHBhcmFtcy5hZ2VudEVudGl0eSB9IDoge30pLFxuICAuLi4ocGFyYW1zLmFnZW50VHlwZSAhPSBudWxsID8geyBhZ2VudFR5cGU6IHBhcmFtcy5hZ2VudFR5cGUgfSA6IHt9KSxcbiAgLi4uKHBhcmFtcy5hZ2VudEVtb2ppICE9IG51bGwgPyB7IGFnZW50RW1vamk6IHBhcmFtcy5hZ2VudEVtb2ppIH0gOiB7fSksXG4gIC4uLihwYXJhbXMuY29udGV4dE1lc3NhZ2UgPyB7IGNvbnRleHRNZXNzYWdlOiBwYXJhbXMuY29udGV4dE1lc3NhZ2UgfSA6IHt9KSxcbiAgLi4uKHBhcmFtcy5jb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGE6IHBhcmFtcy5jb250ZXh0RGF0YSB9IDoge30pLFxufSlcblxuZXhwb3J0IGNvbnN0IGJ1aWxkTWFpYVN0cmVhbVJlcXVlc3RQYXlsb2FkRm9yUHJvamVjdENoYW5nZSA9IChwYXJhbXM6IHtcbiAgbWVzc2FnZTogc3RyaW5nXG4gIGhpc3Rvcnk6IENoYXRIaXN0b3J5W11cbiAgcHJvamVjdDogUHJvamVjdFxuICBhdXRoVXNlcjogUGljazxDT1JVc2VyLCAnbGFuZycgfCAnaWQnIHwgJ2ZpcnN0TmFtZScgfCAnbGFzdE5hbWUnIHwgJ2NvbXBhbnlfaWQnPlxuICBjaGF0SWQ6IHN0cmluZ1xuICBtZXNzYWdlSWQ6IHN0cmluZ1xuICBhZ2VudE5hbWU6IHN0cmluZ1xuICBhZ2VudElkOiBzdHJpbmdcbiAgaXNXZWJTZWFyY2hBY3RpdmU6IGJvb2xlYW5cbiAgaXNEZWVwU2VhcmNoQWN0aXZlOiBib29sZWFuXG4gIGlzQXV0b0FwcHJvdmVBY3RpdmU6IGJvb2xlYW5cbiAgYWdlbnRFbnRpdHk/OiBBZ2VudEVudGl0eVxuICBhZ2VudFR5cGU/OiBBZ2VudFR5cGVcbn0pOiBNYWlhU3RyZWFtUmVxdWVzdFBheWxvYWQgPT4gKHtcbiAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gIGhpc3Rvcnk6IHBhcmFtcy5oaXN0b3J5LFxuICBwcm9qZWN0SWQ6IHBhcmFtcy5wcm9qZWN0LmlkLFxuICBsYW5nOiBwYXJhbXMuYXV0aFVzZXIubGFuZyxcbiAgdXNlcklkOiBwYXJhbXMuYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgZmlyc3ROYW1lOiBwYXJhbXMuYXV0aFVzZXIuZmlyc3ROYW1lLFxuICBsYXN0TmFtZTogcGFyYW1zLmF1dGhVc2VyLmxhc3ROYW1lLFxuICBjb21wYW55SWQ6IHBhcmFtcy5hdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gIGNoYXRJZDogcGFyYW1zLmNoYXRJZCxcbiAgbWVzc2FnZUlkOiBwYXJhbXMubWVzc2FnZUlkLFxuICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gIGFnZW50SWQ6IHBhcmFtcy5hZ2VudElkLFxuICBpc1dlYlNlYXJjaEFjdGl2ZTogcGFyYW1zLmlzV2ViU2VhcmNoQWN0aXZlLFxuICBpc0RlZXBTZWFyY2hBY3RpdmU6IHBhcmFtcy5pc0RlZXBTZWFyY2hBY3RpdmUsXG4gIGlzQXV0b0FwcHJvdmVBY3RpdmU6IHBhcmFtcy5pc0F1dG9BcHByb3ZlQWN0aXZlLFxuICAuLi4ocGFyYW1zLnByb2plY3QuZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihwYXJhbXMucHJvamVjdC5mZWVJZCkgfSA6IHt9KSxcbiAgLi4uKHBhcmFtcy5wcm9qZWN0LmNsaWVudElkICE9IG51bGwgPyB7IGNsaWVudElkOiBOdW1iZXIocGFyYW1zLnByb2plY3QuY2xpZW50SWQpIH0gOiB7fSksXG4gIC4uLihwYXJhbXMuYWdlbnRFbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IHBhcmFtcy5hZ2VudEVudGl0eSB9IDoge30pLFxuICAuLi4ocGFyYW1zLmFnZW50VHlwZSAhPSBudWxsID8geyBhZ2VudFR5cGU6IHBhcmFtcy5hZ2VudFR5cGUgfSA6IHt9KSxcbn0pXG5cbmV4cG9ydCB0eXBlIFN0cmVhbUVycm9ySGFuZGxpbmdNb2RlID0gJ3JldHJ5LXJlc3RvcmUnIHwgJ2NvbW1pdC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTdHJlYW1FcnJvckhhbmRsaW5nTW9kZSA9IChoYXNSZXRyeVNuYXBzaG90OiBib29sZWFuKTogU3RyZWFtRXJyb3JIYW5kbGluZ01vZGUgPT5cbiAgaGFzUmV0cnlTbmFwc2hvdCA/ICdyZXRyeS1yZXN0b3JlJyA6ICdjb21taXQtZXJyb3InXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtRXJyb3JBc3Npc3RhbnRNZXNzYWdlSWQgPSAobWVzc2FnZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT4gYGFuc3dlci0ke21lc3NhZ2VJZH1gXG5cbmV4cG9ydCBjb25zdCBidWlsZFN0cmVhbUVycm9yQXNzaXN0YW50TWVzc2FnZSA9IChwYXJhbXM6IHtcbiAgbWVzc2FnZUlkOiBzdHJpbmdcbiAgbWVzc2FnZTogc3RyaW5nXG4gIHNob3dSZXRyeTogYm9vbGVhblxuICByZXRyeUxhYmVsOiBzdHJpbmdcbn0pOiBDaGF0TWVzc2FnZSA9PiAoe1xuICBpZDogcmVzb2x2ZVN0cmVhbUVycm9yQXNzaXN0YW50TWVzc2FnZUlkKHBhcmFtcy5tZXNzYWdlSWQpLFxuICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgaXNFcnJvcjogdHJ1ZSxcbiAgLi4uKHBhcmFtcy5zaG93UmV0cnkgPyB7IHN1Z2dlc3Rpb25zOiBbcGFyYW1zLnJldHJ5TGFiZWxdIH0gOiB7fSksXG4gIGRhdGU6IG5ldyBEYXRlKCksXG4gIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxufSlcblxuZXhwb3J0IHR5cGUgSGl0bEFwcHJvdmFsUmVxdWlyZWRPdXRjb21lID0geyB0eXBlOiAnc2tpcC11aScgfSB8IHsgdHlwZTogJ3Nob3ctdWknOyBhcHByb3ZhbE1lc3NhZ2VJZDogc3RyaW5nIH1cblxuLyoqIEhJVEwgcHJlLWFwcm9iYWRvIChtYW51YWwvYXV0byk6IGVsIHN0cmVhbSBzaWd1ZSBzaW4gcGludGFyIGxhIGNhamEgZGUgYXByb2JhY2nDs24uICovXG5leHBvcnQgY29uc3Qgc2hvdWxkU2tpcEhpdGxBcHByb3ZhbFVpID0gKGFwcHJvdmFsOiBBcHByb3ZhbFJlcXVlc3QpOiBib29sZWFuID0+XG4gIEJvb2xlYW4oYXBwcm92YWwubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkIHx8IGFwcHJvdmFsLmF1dG9fYXBwcm92ZWQgfHwgYXBwcm92YWwuYXBwcm92YWxfc3RhdHVzID09PSAnYXBwcm92ZWQnKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUhpdGxBcHByb3ZhbFJlcXVpcmVkT3V0Y29tZSA9IChhcHByb3ZhbDogQXBwcm92YWxSZXF1ZXN0KTogSGl0bEFwcHJvdmFsUmVxdWlyZWRPdXRjb21lID0+XG4gIHNob3VsZFNraXBIaXRsQXBwcm92YWxVaShhcHByb3ZhbClcbiAgICA/IHsgdHlwZTogJ3NraXAtdWknIH1cbiAgICA6IHsgdHlwZTogJ3Nob3ctdWknLCBhcHByb3ZhbE1lc3NhZ2VJZDogYGFwcHJvdmFsLSR7YXBwcm92YWwub3JpZ2luYWxfdGhyZWFkX2lkfWAgfVxuXG5leHBvcnQgY29uc3QgYnVpbGRIaXRsQXBwcm92YWxQZW5kaW5nTWVzc2FnZSA9IChwYXJhbXM6IHtcbiAgYXBwcm92YWxNZXNzYWdlSWQ6IHN0cmluZ1xuICBhY2N1bXVsYXRlZENvbnRlbnQ6IHN0cmluZ1xuICBhcHByb3ZhbDogQXBwcm92YWxSZXF1ZXN0XG4gIHJlYXNvbmluZz86IFJlYXNvbmluZ1RyYWNlIHwgbnVsbFxufSk6IENoYXRNZXNzYWdlID0+ICh7XG4gIGlkOiBwYXJhbXMuYXBwcm92YWxNZXNzYWdlSWQsXG4gIG1lc3NhZ2U6IHBhcmFtcy5hY2N1bXVsYXRlZENvbnRlbnQgfHwgJycsXG4gIGRhdGU6IG5ldyBEYXRlKCksXG4gIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICBhcHByb3ZhbDogcGFyYW1zLmFwcHJvdmFsLFxuICBhcHByb3ZhbFN0YXR1czogJ3BlbmRpbmcnLFxuICByZWFzb25pbmc6IHBhcmFtcy5yZWFzb25pbmcsXG59KVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUHJlc2VydmVSZWFzb25pbmdPblN0cmVhbVN0b3AgPSAoc3RvcHBlZFRyYWNlOiBSZWFzb25pbmdUcmFjZSB8IG51bGwpOiBib29sZWFuID0+XG4gIEJvb2xlYW4oc3RvcHBlZFRyYWNlPy5zdGVwcy5sZW5ndGgpXG5cbmV4cG9ydCBjb25zdCBidWlsZFN0cmVhbVN0b3BQYXJ0aWFsQXNzaXN0YW50TWVzc2FnZSA9IChwYXJhbXM6IHtcbiAgZmluYWxNZXNzYWdlSWQ6IHN0cmluZ1xuICBwYXJ0aWFsVGV4dDogc3RyaW5nXG4gIHN0b3BwZWRUcmFjZTogUmVhc29uaW5nVHJhY2UgfCBudWxsXG59KTogQ2hhdE1lc3NhZ2UgPT4gKHtcbiAgaWQ6IHBhcmFtcy5maW5hbE1lc3NhZ2VJZCxcbiAgbWVzc2FnZTogcGFyYW1zLnBhcnRpYWxUZXh0LFxuICBkYXRlOiBuZXcgRGF0ZSgpLFxuICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgLi4uKHBhcmFtcy5zdG9wcGVkVHJhY2UgPyB7IHJlYXNvbmluZzogcGFyYW1zLnN0b3BwZWRUcmFjZSB9IDoge30pLFxufSlcblxuZXhwb3J0IGNvbnN0IGJ1aWxkU3RyZWFtU3RvcENhbmNlbGxlZEFzc2lzdGFudE1lc3NhZ2UgPSAocGFyYW1zOiB7XG4gIGNhbmNlbGxlZE1lc3NhZ2VJZDogc3RyaW5nXG4gIGNhbmNlbGxlZExhYmVsOiBzdHJpbmdcbn0pOiBDaGF0TWVzc2FnZSA9PiAoe1xuICBpZDogcGFyYW1zLmNhbmNlbGxlZE1lc3NhZ2VJZCxcbiAgbWVzc2FnZTogcGFyYW1zLmNhbmNlbGxlZExhYmVsLFxuICBkYXRlOiBuZXcgRGF0ZSgpLFxuICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSxcbn0pXG5cbmV4cG9ydCB0eXBlIFJldHJ5QmxvY2tSZWFzb24gPSAnYnVzeScgfCAnc2Vzc2lvbi1hY3RpdmUnIHwgJ2NvbmN1cnJlbmN5J1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVJldHJ5QmxvY2tSZWFzb24gPSAocGFyYW1zOiB7XG4gIGlzUHJvY2Vzc2luZzogYm9vbGVhblxuICB3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW5cbiAgbG9hZGluZ01lc3NhZ2VzOiBib29sZWFuXG4gIGlzU2Vzc2lvblN0cmVhbUFjdGl2ZTogYm9vbGVhblxuICBhY3RpdmVTdHJlYW1Db3VudDogbnVtYmVyXG4gIG1heENvbmN1cnJlbnQ6IG51bWJlclxufSk6IFJldHJ5QmxvY2tSZWFzb24gfCBudWxsID0+IHtcbiAgaWYgKHBhcmFtcy5pc1Byb2Nlc3NpbmcgfHwgcGFyYW1zLndhaXRpbmdSZXNwb25zZSB8fCBwYXJhbXMubG9hZGluZ01lc3NhZ2VzKSByZXR1cm4gJ2J1c3knXG4gIGlmIChwYXJhbXMuaXNTZXNzaW9uU3RyZWFtQWN0aXZlKSByZXR1cm4gJ3Nlc3Npb24tYWN0aXZlJ1xuICBpZiAocGFyYW1zLmFjdGl2ZVN0cmVhbUNvdW50ID49IHBhcmFtcy5tYXhDb25jdXJyZW50KSByZXR1cm4gJ2NvbmN1cnJlbmN5J1xuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkVXNlT3JjaGVzdHJhdG9yUmV0cnlGYWxsYmFjayA9IChcbiAgbWVzc2FnZTogUGljazxDaGF0TWVzc2FnZSwgJ2lzRnJvbnRlbmRDYW5jZWxsZWQnIHwgJ21lbW9yeVNlc3Npb25JZCc+XG4pOiBib29sZWFuID0+IEJvb2xlYW4obWVzc2FnZS5pc0Zyb250ZW5kQ2FuY2VsbGVkICYmICFtZXNzYWdlLm1lbW9yeVNlc3Npb25JZD8udHJpbSgpKVxuXG5leHBvcnQgdHlwZSBSZXRyeUVsaWdpYmlsaXR5ID1cbiAgfCB7IGVsaWdpYmxlOiBmYWxzZTsgcmVhc29uOiAnbm90LWluLXRocmVhZCcgfCAnZW1wdHktdXNlcicgfCAnbm8tdHVybicgfVxuICB8IHsgZWxpZ2libGU6IHRydWU7IHR1cm5JZDogc3RyaW5nIHwgbnVsbDsgdXNlT3JjaGVzdHJhdG9yRmFsbGJhY2s6IGJvb2xlYW4gfVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVJldHJ5RWxpZ2liaWxpdHkgPSAoXG4gIHByZXZpb3VzTWVzc2FnZXM6IENoYXRNZXNzYWdlW10sXG4gIG1lc3NhZ2U6IENoYXRNZXNzYWdlLFxuICB1c2VyTWVzc2FnZTogQ2hhdE1lc3NhZ2UgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBSZXRyeUVsaWdpYmlsaXR5ID0+IHtcbiAgaWYgKCFwcmV2aW91c01lc3NhZ2VzLnNvbWUoaXRlbSA9PiBpdGVtLmlkID09PSBtZXNzYWdlLmlkKSkge1xuICAgIHJldHVybiB7IGVsaWdpYmxlOiBmYWxzZSwgcmVhc29uOiAnbm90LWluLXRocmVhZCcgfVxuICB9XG4gIGlmICghdXNlck1lc3NhZ2U/Lm1lc3NhZ2U/LnRyaW0oKSAmJiAhdXNlck1lc3NhZ2U/LmF0dGFjaG1lbnRzPy5sZW5ndGggJiYgIXVzZXJNZXNzYWdlPy5zb3VyY2VzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBlbGlnaWJsZTogZmFsc2UsIHJlYXNvbjogJ2VtcHR5LXVzZXInIH1cbiAgfVxuICBjb25zdCB0dXJuSWQgPSByZXNvbHZlUmV0cnlUdXJuSWQobWVzc2FnZSlcbiAgY29uc3QgdXNlT3JjaGVzdHJhdG9yRmFsbGJhY2sgPSBzaG91bGRVc2VPcmNoZXN0cmF0b3JSZXRyeUZhbGxiYWNrKG1lc3NhZ2UpXG4gIGlmICghdHVybklkICYmICF1c2VPcmNoZXN0cmF0b3JGYWxsYmFjaykge1xuICAgIHJldHVybiB7IGVsaWdpYmxlOiBmYWxzZSwgcmVhc29uOiAnbm8tdHVybicgfVxuICB9XG4gIHJldHVybiB7IGVsaWdpYmxlOiB0cnVlLCB0dXJuSWQsIHVzZU9yY2hlc3RyYXRvckZhbGxiYWNrIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVSZXRyeVVzZXJBdHRhY2htZW50cyA9ICh1c2VyTWVzc2FnZTogQ2hhdE1lc3NhZ2UpOiBBdHRhY2htZW50RmlsZVtdID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodXNlck1lc3NhZ2UuYXR0YWNobWVudHMpKSByZXR1cm4gdXNlck1lc3NhZ2UuYXR0YWNobWVudHNcbiAgaWYgKEFycmF5LmlzQXJyYXkodXNlck1lc3NhZ2Uuc291cmNlcykpIHJldHVybiB1c2VyTWVzc2FnZS5zb3VyY2VzXG4gIHJldHVybiBbXVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkVXBkYXRlUHJvamVjdE9uQ2hhbmdlID0gKG5leHRQcm9qZWN0SWQ6IG51bWJlciwgY3VycmVudFByb2plY3RJZD86IG51bWJlcik6IGJvb2xlYW4gPT5cbiAgbmV4dFByb2plY3RJZCAhPT0gY3VycmVudFByb2plY3RJZFxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUmVzZW5kQWZ0ZXJQcm9qZWN0Q2hhbmdlID0gKFxuICB1c2VyUXVlc3Rpb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHByb2plY3Q6IFByb2plY3QgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuID0+IEJvb2xlYW4odXNlclF1ZXN0aW9uICYmIHByb2plY3QpXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQXBwcm92YWxEZWNpc2lvblN0YXR1cyA9IChkZWNpc2lvbjogJ2FwcHJvdmUnIHwgJ3JlamVjdCcpOiAnYXBwcm92ZWQnIHwgJ3JlamVjdGVkJyA9PlxuICBkZWNpc2lvbiA9PT0gJ2FwcHJvdmUnID8gJ2FwcHJvdmVkJyA6ICdyZWplY3RlZCdcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVDb250aW51ZVN0cmVhbURlY2lzaW9uID0gKFxuICBkZWNpc2lvbjogJ2FwcHJvdmUnIHwgJ3JlamVjdCcsXG4gIGVkaXRlZEFjdGlvbnM/OiB1bmtub3duW11cbik6ICdhcHByb3ZlJyB8ICdyZWplY3QnIHwgJ2VkaXQnID0+IChlZGl0ZWRBY3Rpb25zID8gJ2VkaXQnIDogZGVjaXNpb24pXG5cbmV4cG9ydCB0eXBlIEFwcHJvdmFsU3RyZWFtQmxvY2tSZWFzb24gPVxuICAnbWlzc2luZy10aHJlYWRzJyB8ICdtaXNzaW5nLWFwcHJvdmFsJyB8ICdtaXNzaW5nLXNlc3Npb24nIHwgJ3Nlc3Npb24tYWN0aXZlJyB8ICdsaW1pdCdcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVBcHByb3ZhbFN0cmVhbUJsb2NrUmVhc29uID0gKHBhcmFtczoge1xuICB0aHJlYWRJZHM6IHN0cmluZ1tdXG4gIGhhc0FwcHJvdmFsTWVzc2FnZTogYm9vbGVhblxuICBzZXNzaW9uSWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgaXNTZXNzaW9uU3RyZWFtQWN0aXZlOiBib29sZWFuXG4gIGFjdGl2ZVN0cmVhbUNvdW50OiBudW1iZXJcbiAgbWF4Q29uY3VycmVudDogbnVtYmVyXG59KTogQXBwcm92YWxTdHJlYW1CbG9ja1JlYXNvbiB8IG51bGwgPT4ge1xuICBpZiAoIXBhcmFtcy50aHJlYWRJZHM/Lmxlbmd0aCkgcmV0dXJuICdtaXNzaW5nLXRocmVhZHMnXG4gIGlmICghcGFyYW1zLmhhc0FwcHJvdmFsTWVzc2FnZSkgcmV0dXJuICdtaXNzaW5nLWFwcHJvdmFsJ1xuICBpZiAoIXBhcmFtcy5zZXNzaW9uSWQpIHJldHVybiAnbWlzc2luZy1zZXNzaW9uJ1xuICBpZiAocGFyYW1zLmlzU2Vzc2lvblN0cmVhbUFjdGl2ZSkgcmV0dXJuICdzZXNzaW9uLWFjdGl2ZSdcbiAgaWYgKHBhcmFtcy5hY3RpdmVTdHJlYW1Db3VudCA+PSBwYXJhbXMubWF4Q29uY3VycmVudCkgcmV0dXJuICdsaW1pdCdcbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqIFRvb2xzIGRlIGNhcmdhIGRlIGhvcmFzIGEgc2luY3Jvbml6YXIgY29uIFBsYW5uZXIgYWwgY2VycmFyIHVuIHN0cmVhbSAoSElUTCBhcHJvYmFkbykuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUhvdXJzQ2hhcmdlVG9vbHNPblN0cmVhbUZpbmlzaCA9IChcbiAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZTogYm9vbGVhbixcbiAgYXBwcm92YWxTdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSxcbiAgbWFudWFsQXBwcm92YWxUb29sTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbFxuKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBob3Vyc1Rvb2xzRnJvbUFwcHJvdmFsID0gcGVuZGluZ0FjdGlvbnNcbiAgICAubWFwKGFjdGlvbiA9PiBhY3Rpb24udG9vbF9uYW1lKVxuICAgIC5maWx0ZXIoKHRvb2xOYW1lKTogdG9vbE5hbWUgaXMgc3RyaW5nID0+IGlzSG91cnNDaGFyZ2VUb29sKHRvb2xOYW1lKSlcblxuICBjb25zdCB3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkID1cbiAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIGFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmIGhvdXJzVG9vbHNGcm9tQXBwcm92YWwubGVuZ3RoID4gMFxuXG4gIGlmICh3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkKSB7XG4gICAgcmV0dXJuIGhvdXJzVG9vbHNGcm9tQXBwcm92YWxcbiAgfVxuXG4gIGlmIChpc0hvdXJzQ2hhcmdlVG9vbChtYW51YWxBcHByb3ZhbFRvb2xOYW1lKSkge1xuICAgIHJldHVybiBtYW51YWxBcHByb3ZhbFRvb2xOYW1lID8gW21hbnVhbEFwcHJvdmFsVG9vbE5hbWVdIDogW11cbiAgfVxuXG4gIHJldHVybiBbXVxufVxuXG5leHBvcnQgY29uc3QgZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyA9IChcbiAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgYWN0aXZlTWVzc2FnZXM6IENoYXRNZXNzYWdlW10sXG4gIHNlc3Npb25NZXNzYWdlc0J5SWQ6IFJlY29yZDxzdHJpbmcsIENoYXRNZXNzYWdlW10+LFxuICBhY3RpdmVTZXNzaW9uSWQ6IHN0cmluZyB8IG51bGxcbik6IHsgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7IHNlc3Npb25JZDogc3RyaW5nIH0gfCBudWxsID0+IHtcbiAgY29uc3QgZnJvbUFjdGl2ZVZpZXcgPSBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEluTGlzdCh0aHJlYWRJZHMsIGFjdGl2ZU1lc3NhZ2VzLCBhY3RpdmVTZXNzaW9uSWQgfHwgJycpXG4gIGlmIChmcm9tQWN0aXZlVmlldykgcmV0dXJuIGZyb21BY3RpdmVWaWV3XG5cbiAgY29uc3Qgc2Vzc2lvbkVudHJ5ID0gT2JqZWN0LmVudHJpZXMoc2Vzc2lvbk1lc3NhZ2VzQnlJZCkuZmluZCgoWywgc2Vzc2lvbk1lc3NhZ2VzXSkgPT5cbiAgICBzZXNzaW9uTWVzc2FnZXMuc29tZShtZXNzYWdlID0+XG4gICAgICBtZXNzYWdlLmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnM/LnNvbWUoYWN0aW9uID0+IHRocmVhZElkcy5pbmNsdWRlcyhhY3Rpb24udGhyZWFkX2lkKSlcbiAgICApXG4gIClcblxuICBpZiAoIXNlc3Npb25FbnRyeSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBbc2Vzc2lvbklkLCBzZXNzaW9uTWVzc2FnZXNdID0gc2Vzc2lvbkVudHJ5XG4gIHJldHVybiBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEluTGlzdCh0aHJlYWRJZHMsIHNlc3Npb25NZXNzYWdlcywgc2Vzc2lvbklkKVxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVN0cmVhbUZpbmlzaEZpbmFsTWVzc2FnZUlkID0gKG1lbW9yeVNlc3Npb25JZDogc3RyaW5nKTogc3RyaW5nID0+IGBhbnN3ZXItJHttZW1vcnlTZXNzaW9uSWR9YFxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVN0cmVhbVN0b3BNZXNzYWdlSWRzID0gKFxuICBjdXJyZW50TWVzc2FnZUlkOiBzdHJpbmdcbik6IHtcbiAgZmluYWxNZXNzYWdlSWQ6IHN0cmluZ1xuICBjYW5jZWxsZWRNZXNzYWdlSWQ6IHN0cmluZ1xufSA9PiAoe1xuICBmaW5hbE1lc3NhZ2VJZDogYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWR9YCxcbiAgY2FuY2VsbGVkTWVzc2FnZUlkOiBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZH0tY2FuY2VsbGVkYCxcbn0pXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUmVudGFiaWxpZGFkUHJvamVjdEZhcU1lc3NhZ2UgPSAoXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgcmVudGFiaWxpZGFkTGFiZWw6IHN0cmluZyxcbiAgaW5jb21lVHlwZT86IHN0cmluZyB8IG51bGxcbik6IHN0cmluZyA9PiB7XG4gIGlmIChtZXNzYWdlICE9PSByZW50YWJpbGlkYWRMYWJlbCkgcmV0dXJuIG1lc3NhZ2VcbiAgcmV0dXJuIGBGQVE6ICR7cmVudGFiaWxpZGFkTGFiZWx9IC0gVGlwbyBkZSByZW50YWJpbGlkYWQ6ICR7aW5jb21lVHlwZSA/PyAnJ31gXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtRXJyb3JVc2VyTWVzc2FnZSA9IChcbiAgbWVzc2FnZUtleTogU3RyZWFtRXJyb3JNZXNzYWdlS2V5LFxuICB0cmFuc2xhdGU6IChrZXk6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gc3RyaW5nLFxuICB0b2tlbnNVc2VkOiBzdHJpbmdcbik6IHN0cmluZyA9PiB7XG4gIGlmIChtZXNzYWdlS2V5ID09PSAnY2hhdC5lcnJvckFjY2Vzc0RlbmllZCcpIHJldHVybiB0cmFuc2xhdGUoJ2NoYXQuZXJyb3JBY2Nlc3NEZW5pZWQnKVxuICBpZiAobWVzc2FnZUtleSA9PT0gJ2NoYXQuZXJyb3JQcm9tcHRUb29Mb25nJykgcmV0dXJuIHRyYW5zbGF0ZSgnY2hhdC5lcnJvclByb21wdFRvb0xvbmcnLCB7IHVzZWQ6IHRva2Vuc1VzZWQgfSlcbiAgcmV0dXJuIHRyYW5zbGF0ZSgnY2hhdC5lcnJvcicpXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUHJldmlvdXNBc3Npc3RhbnRNZXNzYWdlQmVmb3JlUGxhY2Vob2xkZXIgPSAoXG4gIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLFxuICBwbGFjZWhvbGRlcklkOiBzdHJpbmdcbik6IENoYXRNZXNzYWdlIHwgdW5kZWZpbmVkID0+IG1lc3NhZ2VzLmZpbHRlcihtZXNzYWdlID0+IG1lc3NhZ2UuaWQgIT09IHBsYWNlaG9sZGVySWQpLmF0KC0xKVxuXG5leHBvcnQgdHlwZSBIaXRsRXhlY3V0aW9uQ29udGV4dFNuYXBzaG90ID0ge1xuICBtZXNzYWdlSWQ6IHN0cmluZ1xuICBtZXNzYWdlVGV4dDogc3RyaW5nXG4gIGFwcHJvdmFsOiBBcHByb3ZhbFJlcXVlc3RcbiAgcGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXVxuICB0aHJlYWRJZHM6IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSAoXG4gIGFwcHJvdmFsOiBBcHByb3ZhbFJlcXVlc3QsXG4gIGFjY3VtdWxhdGVkQ29udGVudDogc3RyaW5nXG4pOiBIaXRsRXhlY3V0aW9uQ29udGV4dFNuYXBzaG90ID0+ICh7XG4gIG1lc3NhZ2VJZDogYGFwcHJvdmFsLSR7YXBwcm92YWwub3JpZ2luYWxfdGhyZWFkX2lkfWAsXG4gIG1lc3NhZ2VUZXh0OiBhY2N1bXVsYXRlZENvbnRlbnQgfHwgJycsXG4gIGFwcHJvdmFsLFxuICBwZW5kaW5nQWN0aW9uczogYXBwcm92YWwucGVuZGluZ19hY3Rpb25zLFxuICB0aHJlYWRJZHM6XG4gICAgYXBwcm92YWwucGVuZGluZ19hY3Rpb25zXG4gICAgICA/Lm1hcChhY3Rpb24gPT4gYWN0aW9uLnRocmVhZF9pZClcbiAgICAgIC5maWx0ZXIoKHRocmVhZElkKTogdGhyZWFkSWQgaXMgc3RyaW5nID0+IEJvb2xlYW4odGhyZWFkSWQpKSA/PyBbXSxcbn0pXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2tpcHBlZEhpdGxNYW51YWxBcHByb3ZhbCA9IChcbiAgYXBwcm92YWw6IEFwcHJvdmFsUmVxdWVzdFxuKTogeyB0b29sTmFtZTogc3RyaW5nOyB0b29sQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIH0gfCBudWxsID0+IHtcbiAgY29uc3QgZmlyc3RBY3Rpb24gPSBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnM/LlswXVxuICBjb25zdCB0b29sTmFtZSA9IChhcHByb3ZhbCBhcyB7IHRvb2xfbmFtZT86IHN0cmluZyB9KS50b29sX25hbWUgPz8gZmlyc3RBY3Rpb24/LnRvb2xfbmFtZSA/PyAnJ1xuICBpZiAoIXRvb2xOYW1lKSByZXR1cm4gbnVsbFxuICBjb25zdCB0b29sQXJncyA9XG4gICAgKChhcHByb3ZhbCBhcyB7IHRvb2xfYXJncz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pLnRvb2xfYXJncyA/P1xuICAgICAgKGZpcnN0QWN0aW9uPy50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpKSB8fFxuICAgIG51bGxcbiAgcmV0dXJuIHsgdG9vbE5hbWUsIHRvb2xBcmdzIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVIaXRsU2tpcFJlc29sdXRpb25Tb3VyY2UgPSAoYXBwcm92YWw6IEFwcHJvdmFsUmVxdWVzdCk6ICdtYW51YWwnIHwgJ2F1dG8nID0+XG4gIGFwcHJvdmFsLm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCA/ICdtYW51YWwnIDogJ2F1dG8nXG5cbmV4cG9ydCB0eXBlIENyZWF0ZUFnZW50SGl0bEFuYWx5dGljc0V2ZW50ID0ge1xuICBhZ2VudF90eXBlOiBzdHJpbmdcbiAgYWN0aW9uX3R5cGU6IHN0cmluZ1xuICBkZWNpc2lvbjogJ2FjY2VwdCdcbiAgb3B0aW9uOiAnY3JlYXRlX2FnZW50J1xuICByZXNvbHV0aW9uX3NvdXJjZT86ICdtYW51YWwnXG4gIGNyZWF0ZWRfYWdlbnRfaWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVDcmVhdGVBZ2VudEhpdGxBbmFseXRpY3NFdmVudHMgPSAocGFyYW1zOiB7XG4gIHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQ6IGJvb2xlYW5cbiAgcGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXVxuICBtYW51YWxBcHByb3ZhbFRvb2xOYW1lOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gIGNvbXBsZXRlZEFnZW50SWQ/OiBzdHJpbmcgfCBudWxsXG4gIGFnZW50VHlwZTogc3RyaW5nXG4gIG5vcm1hbGl6ZVRvb2xOYW1lOiAodG9vbE5hbWU6IHN0cmluZykgPT4gc3RyaW5nXG4gIGJ1aWxkQWN0aW9uVHlwZUxpc3Q6IChhY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pID0+IHN0cmluZ1xufSk6IENyZWF0ZUFnZW50SGl0bEFuYWx5dGljc0V2ZW50W10gPT4ge1xuICBjb25zdCBldmVudHM6IENyZWF0ZUFnZW50SGl0bEFuYWx5dGljc0V2ZW50W10gPSBbXVxuICBjb25zdCB0cmltbWVkQWdlbnRJZCA9IHBhcmFtcy5jb21wbGV0ZWRBZ2VudElkPy50cmltKClcbiAgY29uc3QgaWRGaWVsZCA9IHRyaW1tZWRBZ2VudElkID8geyBjcmVhdGVkX2FnZW50X2lkOiB0cmltbWVkQWdlbnRJZCB9IDoge31cblxuICBpZiAocGFyYW1zLndhc0NyZWF0ZUFnZW50QXBwcm92ZWQpIHtcbiAgICBldmVudHMucHVzaCh7XG4gICAgICBhZ2VudF90eXBlOiBwYXJhbXMuYWdlbnRUeXBlLFxuICAgICAgYWN0aW9uX3R5cGU6IHBhcmFtcy5idWlsZEFjdGlvblR5cGVMaXN0KHBhcmFtcy5wZW5kaW5nQWN0aW9ucyksXG4gICAgICBkZWNpc2lvbjogJ2FjY2VwdCcsXG4gICAgICBvcHRpb246ICdjcmVhdGVfYWdlbnQnLFxuICAgICAgLi4uaWRGaWVsZCxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgbWFudWFsVG9vbCA9IHBhcmFtcy5tYW51YWxBcHByb3ZhbFRvb2xOYW1lXG4gIGlmIChtYW51YWxUb29sICYmIHBhcmFtcy5ub3JtYWxpemVUb29sTmFtZShtYW51YWxUb29sKSA9PT0gJ2NyZWF0ZV9hZ2VudCcpIHtcbiAgICBldmVudHMucHVzaCh7XG4gICAgICBhZ2VudF90eXBlOiBwYXJhbXMuYWdlbnRUeXBlLFxuICAgICAgYWN0aW9uX3R5cGU6ICdjcmVhdGVfYWdlbnQnLFxuICAgICAgZGVjaXNpb246ICdhY2NlcHQnLFxuICAgICAgcmVzb2x1dGlvbl9zb3VyY2U6ICdtYW51YWwnLFxuICAgICAgb3B0aW9uOiAnY3JlYXRlX2FnZW50JyxcbiAgICAgIC4uLmlkRmllbGQsXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBldmVudHNcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVDb250ZXh0UHJvamVjdElkRm9yRGFzaGJvYXJkID0gKFxuICBwcm9qZWN0SWQ6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbGFzdE1lc3NhZ2VQcm9qZWN0SWQ6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHJhdyA9IHByb2plY3RJZCA/PyBsYXN0TWVzc2FnZVByb2plY3RJZFxuICBpZiAocmF3ID09IG51bGwpIHJldHVybiBudWxsXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KFN0cmluZyhyYXcpLCAxMClcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZURhc2hib2FyZFN5bmNlZENvbnRlbnQgPSBhc3luYyAoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgdGFza1VybFJlZ2V4OiBSZWdFeHAsXG4gIHNob3VsZFN5bmNEYXNoYm9hcmQ6IGJvb2xlYW4sXG4gIHRhc2tJZHM6IG51bWJlcltdLFxuICBnZXRUYWJUYXNrRGVmYXVsdDogKHRhc2tJZDogbnVtYmVyKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+XG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBpZiAoIXNob3VsZFN5bmNEYXNoYm9hcmQgfHwgdGFza0lkcy5sZW5ndGggPT09IDApIHJldHVybiBjb250ZW50XG4gIGNvbnN0IG1hdGNoZXMgPSBbLi4uY29udGVudC5tYXRjaEFsbCh0YXNrVXJsUmVnZXgpXVxuICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHJldHVybiBjb250ZW50XG4gIGNvbnN0IHRhYiA9IGF3YWl0IGdldFRhYlRhc2tEZWZhdWx0KHRhc2tJZHNbMF0pXG4gIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgcmV0dXJuIHJlcGxhY2VUYXNrVXJsc1dpdGhUYWJTZWdtZW50KGNvbnRlbnQsIHRhc2tVcmxSZWdleCwgdGFiU2VnbWVudClcbn1cblxuZXhwb3J0IGNvbnN0IGlzVGVybWluYWxTZXNzaW9uU3RhdHVzID0gKHN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICBzdGF0dXMgPT09ICdjb21wbGV0ZScgfHwgc3RhdHVzID09PSAnZXJyb3InXG5cbmV4cG9ydCBjb25zdCBidWlsZFRlcm1pbmFsU2Vzc2lvblJlY29uY2lsaWF0aW9uS2V5ID0gKFxuICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgc3RhdHVzOiBzdHJpbmcsXG4gIGZpbmlzaGVkQXQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4pOiBzdHJpbmcgPT4gYCR7c2Vzc2lvbklkfToke3N0YXR1c306JHtmaW5pc2hlZEF0ID8/ICcnfWBcblxuZXhwb3J0IGNvbnN0IGhhc1N0YWxlU3RyZWFtaW5nUGxhY2Vob2xkZXJJblRhaWwgPSAoXG4gIHRhaWw6IEFycmF5PHsgaWQ/OiBzdHJpbmcgfT4sXG4gIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IChtZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gYm9vbGVhblxuKTogYm9vbGVhbiA9PiB0YWlsLnNvbWUobWVzc2FnZSA9PiBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyKG1lc3NhZ2UuaWQpKVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkRm9yY2VSZWxvYWRNZXNzYWdlc09uVGVybWluYWxTZXNzaW9uID0gKFxuICBzdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFpbDogQXJyYXk8eyBpZD86IHN0cmluZyB9PixcbiAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogKG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiBib29sZWFuXG4pOiBib29sZWFuID0+IGlzVGVybWluYWxTZXNzaW9uU3RhdHVzKHN0YXR1cykgJiYgaGFzU3RhbGVTdHJlYW1pbmdQbGFjZWhvbGRlckluVGFpbCh0YWlsLCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyKVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlU2Vzc2lvbkZvck5ld0hvbWUgPSAoXG4gIGluaXRpYWxDaGF0SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHByZXZpb3VzSW5pdGlhbENoYXRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiA9PiAhaW5pdGlhbENoYXRJZCAmJiBCb29sZWFuKHByZXZpb3VzSW5pdGlhbENoYXRJZClcblxuZXhwb3J0IGNvbnN0IHNob3VsZFN3aXRjaFRvSW5pdGlhbENoYXRTZXNzaW9uID0gKFxuICBpbml0aWFsQ2hhdElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjdXJyZW50Q2hhdElkOiBzdHJpbmdcbik6IGJvb2xlYW4gPT4gQm9vbGVhbihpbml0aWFsQ2hhdElkICYmIGluaXRpYWxDaGF0SWQgIT09IGN1cnJlbnRDaGF0SWQpXG5cbmV4cG9ydCB0eXBlIE1hbnVhbEFwcHJvdmFsU25hcHNob3QgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IHRvb2xBcmdzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIH0gfCBudWxsXG5cbmV4cG9ydCB0eXBlIFN0cmVhbUZpbmlzaEFzc2lzdGFudENvbW1pdCA9IHtcbiAgZmluYWxNZXNzYWdlSWQ6IHN0cmluZ1xuICBjb250ZW50OiBzdHJpbmdcbiAgc291cmNlczogdW5rbm93blxuICBhdHRhY2htZW50czogQXR0YWNobWVudEZpbGVbXVxuICBtZW1vcnlTZXNzaW9uSWQ6IHN0cmluZ1xuICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdIHwgbnVsbFxuICBjcmVhdGVBZ2VudEZvbGxvd1VwPzogUmV0dXJuVHlwZTx0eXBlb2YgcmVzb2x2ZUNyZWF0ZUFnZW50Rm9sbG93VXA+XG4gIHJlYXNvbmluZz86IFJlYXNvbmluZ1RyYWNlIHwgbnVsbFxufVxuXG5leHBvcnQgY29uc3QgYnVpbGRTdHJlYW1GaW5pc2hBc3Npc3RhbnRNZXNzYWdlID0gKHBhcmFtczogU3RyZWFtRmluaXNoQXNzaXN0YW50Q29tbWl0KTogQ2hhdE1lc3NhZ2UgPT4gKHtcbiAgaWQ6IHBhcmFtcy5maW5hbE1lc3NhZ2VJZCxcbiAgbWVzc2FnZTogcGFyYW1zLmNvbnRlbnQsXG4gIGRhdGU6IG5ldyBEYXRlKCksXG4gIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICBzb3VyY2VzOiBwYXJhbXMuc291cmNlcyxcbiAgLi4uKHBhcmFtcy5hdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50czogcGFyYW1zLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gIG1lbW9yeVNlc3Npb25JZDogcGFyYW1zLm1lbW9yeVNlc3Npb25JZCxcbiAgc3VnZ2VzdGlvbnM6IHBhcmFtcy5zdWdnZXN0aW9ucyB8fCBbXSxcbiAgLi4uKHBhcmFtcy5jcmVhdGVBZ2VudEZvbGxvd1VwID8geyBjcmVhdGVBZ2VudEZvbGxvd1VwOiBwYXJhbXMuY3JlYXRlQWdlbnRGb2xsb3dVcCB9IDoge30pLFxuICByZWFzb25pbmc6IHBhcmFtcy5yZWFzb25pbmcsXG59KVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkTWFya0NoYXRSZWFkQWZ0ZXJTdHJlYW1GaW5pc2ggPSAoaXNBY3RpdmU6IGJvb2xlYW4sIGlzQ2hhdFZpZXdWaXNpYmxlOiBib29sZWFuKTogYm9vbGVhbiA9PlxuICBpc0FjdGl2ZSAmJiBpc0NoYXRWaWV3VmlzaWJsZVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkRGlzcGF0Y2hGaXJzdFNlc3Npb25SZWZldGNoID0gKGZpcnN0VGltZTogYm9vbGVhbik6IGJvb2xlYW4gPT4gZmlyc3RUaW1lXG5cbmV4cG9ydCB0eXBlIEFjdGl2ZVN0cmVhbUZpbmlzaFByb2Nlc3NpbmdSZXN1bHQgPSB7XG4gIGNvbnRlbnRUb0FkZDogc3RyaW5nXG4gIGNyZWF0ZUFnZW50Rm9sbG93VXA6IFJldHVyblR5cGU8dHlwZW9mIHJlc29sdmVDcmVhdGVBZ2VudEZvbGxvd1VwPlxuICBlZGl0QWdlbnRGb2xsb3dVcDogUmV0dXJuVHlwZTx0eXBlb2YgcmVzb2x2ZUVkaXRBZ2VudEZvbGxvd1VwPlxuICBob3Vyc0NoYXJnZVRvb2xzOiBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlSG91cnNDaGFyZ2VUb29sc09uU3RyZWFtRmluaXNoPlxuICBhZmZlY3RlZFRhc2tJZHM6IHN0cmluZ1tdXG4gIG1hbnVhbFdhc1Rhc2tFZGl0OiBib29sZWFuXG4gIG1hbnVhbFdhc1Rhc2tEZWxldGU6IGJvb2xlYW5cbiAgd2FzVGFza0VkaXQ6IGJvb2xlYW5cbiAgd2FzVGFza0RlbGV0ZTogYm9vbGVhblxuICB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkOiBib29sZWFuXG4gIHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW11cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBY3RpdmVTdHJlYW1GaW5pc2hQcm9jZXNzaW5nKHBhcmFtczoge1xuICBjb250ZW50OiBzdHJpbmdcbiAgbWVzc2FnZXM6IENoYXRNZXNzYWdlW11cbiAgdGVtcE1lc3NhZ2VJZDogc3RyaW5nXG4gIHRhc2tVcmxSZWdleDogUmVnRXhwXG4gIHByb2plY3RJZDogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkXG4gIHBhdGhuYW1lOiBzdHJpbmdcbiAgZ2V0VGFiVGFza0RlZmF1bHQ6ICh0YXNrSWQ6IG51bWJlcikgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPlxuICBtdWx0aUFnZW50c0FjY2VzczogYm9vbGVhblxuICBjb21wbGV0ZWRBZ2VudElkPzogc3RyaW5nIHwgbnVsbFxuICBtYW51YWxBcHByb3ZhbDogTWFudWFsQXBwcm92YWxTbmFwc2hvdFxuICBhcHBseURhc2hib2FyZE11dGF0aW9uPzogKG11dGF0aW9uOiBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlUHJvamVjdERhc2hib2FyZE11dGF0aW9uPiwgdGFza0lkczogbnVtYmVyW10pID0+IHZvaWRcbn0pOiBQcm9taXNlPEFjdGl2ZVN0cmVhbUZpbmlzaFByb2Nlc3NpbmdSZXN1bHQ+IHtcbiAgbGV0IGNvbnRlbnRUb0FkZCA9IHBhcmFtcy5jb250ZW50XG4gIGNvbnN0IHByZXZpb3VzTWVzc2FnZSA9IHJlc29sdmVQcmV2aW91c0Fzc2lzdGFudE1lc3NhZ2VCZWZvcmVQbGFjZWhvbGRlcihwYXJhbXMubWVzc2FnZXMsIHBhcmFtcy50ZW1wTWVzc2FnZUlkKVxuICBjb25zdCBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlID0gcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbCAhPSBudWxsXG4gIGNvbnN0IHBlbmRpbmdBY3Rpb25zID0gcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zIHx8IFtdXG4gIGNvbnN0IHtcbiAgICB3YXNUYXNrQ3JlYXRpb24sXG4gICAgd2FzVGFza0VkaXQsXG4gICAgd2FzVGFza0RlbGV0ZSxcbiAgICB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkLFxuICAgIHdhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQsXG4gICAgd2FzRWRpdEFnZW50QXBwcm92ZWQsXG4gIH0gPSByZXNvbHZlQXBwcm92ZWRQZW5kaW5nQWN0aW9uRmxhZ3MoaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSwgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cywgcGVuZGluZ0FjdGlvbnMpXG5cbiAgY29uc3QgY3JlYXRlQWdlbnRGb2xsb3dVcCA9IHJlc29sdmVDcmVhdGVBZ2VudEZvbGxvd1VwKFxuICAgIHsgd2FzQ3JlYXRlQWdlbnRBcHByb3ZlZCwgd2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCB9LFxuICAgIHBhcmFtcy5tdWx0aUFnZW50c0FjY2VzcyxcbiAgICBwYXJhbXMuY29tcGxldGVkQWdlbnRJZCxcbiAgICBwZW5kaW5nQWN0aW9uc1xuICApXG4gIGNvbnN0IGVkaXRBZ2VudEZvbGxvd1VwID0gcmVzb2x2ZUVkaXRBZ2VudEZvbGxvd1VwKHdhc0VkaXRBZ2VudEFwcHJvdmVkLCBwYXJhbXMuY29tcGxldGVkQWdlbnRJZCwgcGVuZGluZ0FjdGlvbnMpXG4gIGNvbnN0IHRhc2tJZHNGb3JEYXNoYm9hcmQgPSByZXNvbHZlVGFza0lkc0ZvckRhc2hib2FyZChcbiAgICBwYXJhbXMuY29udGVudCxcbiAgICBwYXJhbXMudGFza1VybFJlZ2V4LFxuICAgIHBlbmRpbmdBY3Rpb25zLFxuICAgIHdhc1Rhc2tEZWxldGVcbiAgKVxuXG4gIGNvbnN0IHNob3VsZFN5bmNEYXNoYm9hcmQgPSBzaG91bGRTeW5jVGFza0Rhc2hib2FyZChcbiAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlLFxuICAgIHdhc1Rhc2tDcmVhdGlvbixcbiAgICB3YXNUYXNrRWRpdCxcbiAgICB3YXNUYXNrRGVsZXRlLFxuICAgIHRhc2tJZHNGb3JEYXNoYm9hcmRcbiAgKVxuXG4gIGlmIChzaG91bGRTeW5jRGFzaGJvYXJkKSB7XG4gICAgY29udGVudFRvQWRkID0gYXdhaXQgcmVzb2x2ZURhc2hib2FyZFN5bmNlZENvbnRlbnQoXG4gICAgICBwYXJhbXMuY29udGVudCxcbiAgICAgIHBhcmFtcy50YXNrVXJsUmVnZXgsXG4gICAgICBzaG91bGRTeW5jRGFzaGJvYXJkLFxuICAgICAgdGFza0lkc0ZvckRhc2hib2FyZCxcbiAgICAgIHBhcmFtcy5nZXRUYWJUYXNrRGVmYXVsdFxuICAgIClcblxuICAgIGNvbnN0IGxhc3RQcm9qZWN0TWVzc2FnZSA9IHBhcmFtcy5tZXNzYWdlcy5maWx0ZXIobXNnID0+IG1zZy5wcm9qZWN0SWQpLmF0KC0xKVxuICAgIGNvbnN0IGNvbnRleHRQcm9qZWN0SWQgPSByZXNvbHZlQ29udGV4dFByb2plY3RJZEZvckRhc2hib2FyZChwYXJhbXMucHJvamVjdElkLCBsYXN0UHJvamVjdE1lc3NhZ2U/LnByb2plY3RJZClcbiAgICBjb25zdCB7IGlzT25Qcm9qZWN0Um91dGUgfSA9IHJlc29sdmVQcm9qZWN0RGFzaGJvYXJkU3luYyhjb250ZXh0UHJvamVjdElkLCBwYXJhbXMucGF0aG5hbWUpXG5cbiAgICBpZiAoaXNPblByb2plY3RSb3V0ZSAmJiBwYXJhbXMuYXBwbHlEYXNoYm9hcmRNdXRhdGlvbikge1xuICAgICAgcGFyYW1zLmFwcGx5RGFzaGJvYXJkTXV0YXRpb24oXG4gICAgICAgIHJlc29sdmVQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24oeyB3YXNUYXNrQ3JlYXRpb24sIHdhc1Rhc2tFZGl0LCB3YXNUYXNrRGVsZXRlIH0pLFxuICAgICAgICB0YXNrSWRzRm9yRGFzaGJvYXJkXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWFudWFsV2FzVGFza0VkaXQgPSBpc1Rhc2tFZGl0VG9vbE5hbWUocGFyYW1zLm1hbnVhbEFwcHJvdmFsPy50b29sTmFtZSlcbiAgY29uc3QgbWFudWFsV2FzVGFza0RlbGV0ZSA9IGlzVGFza0RlbGV0ZVRvb2xOYW1lKHBhcmFtcy5tYW51YWxBcHByb3ZhbD8udG9vbE5hbWUpXG4gIGNvbnN0IGhvdXJzQ2hhcmdlVG9vbHMgPSByZXNvbHZlSG91cnNDaGFyZ2VUb29sc09uU3RyZWFtRmluaXNoKFxuICAgIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UsXG4gICAgcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbFN0YXR1cyxcbiAgICBwZW5kaW5nQWN0aW9ucyxcbiAgICBwYXJhbXMubWFudWFsQXBwcm92YWw/LnRvb2xOYW1lXG4gIClcbiAgY29uc3QgYWZmZWN0ZWRUYXNrSWRzID0gbWVyZ2VBZmZlY3RlZFRhc2tJZHNGb3JQYW5lbFJlZmV0Y2goXG4gICAgcGVuZGluZ0FjdGlvbnMsXG4gICAgdGFza0lkc0ZvckRhc2hib2FyZCxcbiAgICBwYXJhbXMubWFudWFsQXBwcm92YWw/LnRvb2xOYW1lXG4gICAgICA/IHsgdG9vbE5hbWU6IHBhcmFtcy5tYW51YWxBcHByb3ZhbC50b29sTmFtZSwgdG9vbEFyZ3M6IHBhcmFtcy5tYW51YWxBcHByb3ZhbC50b29sQXJncyB9XG4gICAgICA6IG51bGxcbiAgKVxuXG4gIHJldHVybiB7XG4gICAgY29udGVudFRvQWRkLFxuICAgIGNyZWF0ZUFnZW50Rm9sbG93VXAsXG4gICAgZWRpdEFnZW50Rm9sbG93VXAsXG4gICAgaG91cnNDaGFyZ2VUb29scyxcbiAgICBhZmZlY3RlZFRhc2tJZHMsXG4gICAgbWFudWFsV2FzVGFza0VkaXQsXG4gICAgbWFudWFsV2FzVGFza0RlbGV0ZSxcbiAgICB3YXNUYXNrRWRpdCxcbiAgICB3YXNUYXNrRGVsZXRlLFxuICAgIHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQsXG4gICAgcGVuZGluZ0FjdGlvbnMsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxTQUFTQSxpQkFBaUIsUUFBUSxtQ0FBbUM7QUFFckUsU0FHRUMsZUFBZSxRQUlWLGtCQUFrQjtBQUd6QixTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELFNBQVNDLG1CQUFtQixRQUFRLDhCQUE4QjtBQUtsRSxTQUFTQyxrQkFBa0IsUUFBUSw2QkFBNkI7QUFJaEU7QUFDQSxPQUFPLElBQU1DLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQUlDLFNBQWlCLEVBQTRCO0VBQzdFLElBQU1DLFFBQVEsR0FBR0wsY0FBYyxDQUFDTSxXQUFXLENBQUNGLFNBQVMsQ0FBQztFQUN0RCxJQUFJLENBQUNDLFFBQVEsQ0FBQ0UsS0FBSyxDQUFDQyxNQUFNLEVBQUUsT0FBTyxJQUFJO0VBQ3ZDLE9BQU9QLG1CQUFtQixDQUFDSSxRQUFRLENBQUNFLEtBQUssRUFBRUYsUUFBUSxDQUFDSSxPQUFPLENBQUM7QUFDOUQsQ0FBQztBQUVELE9BQU8sSUFBTUMsd0JBQXdCLEdBQUcsU0FBM0JBLHdCQUF3QkEsQ0FBSUMsb0JBQTJDLEVBQUs7RUFBQSxJQUFBQyxvQkFBQTtFQUN2RixJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0gsb0JBQW9CLENBQUMsRUFBRTtJQUN2QyxPQUFPO01BQUVJLFdBQVcsRUFBRUosb0JBQW9CO01BQUVLLE9BQU8sRUFBRSxDQUFDO0lBQXdCLENBQUM7RUFDakY7RUFFQSxJQUFNQSxPQUEyQixHQUFHTCxvQkFBb0IsYUFBcEJBLG9CQUFvQixjQUFwQkEsb0JBQW9CLEdB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
|