n8n-editor-ui 1.22.0 → 1.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/.turbo/turbo-build.log +62 -62
  2. package/dist/assets/{AuthView-_5lvIORY.js → AuthView--On8E3VP.js} +2 -2
  3. package/dist/assets/{AuthView-_5lvIORY.js.map → AuthView--On8E3VP.js.map} +1 -1
  4. package/dist/assets/{CanvasControls-_S6dAUFr.js → CanvasControls-ebFBI-_5.js} +2 -2
  5. package/dist/assets/{CanvasControls-_S6dAUFr.js.map → CanvasControls-ebFBI-_5.js.map} +1 -1
  6. package/dist/assets/{ChangePasswordView-Gto324pL.js → ChangePasswordView-gj93rkzc.js} +2 -2
  7. package/dist/assets/{ChangePasswordView-Gto324pL.js.map → ChangePasswordView-gj93rkzc.js.map} +1 -1
  8. package/dist/assets/{CollectionParameter-ThiBAc6J.js → CollectionParameter-V1n0L6ao.js} +2 -2
  9. package/dist/assets/CollectionParameter-V1n0L6ao.js.map +1 -0
  10. package/dist/assets/{CredentialsView-WF2GuXwX.js → CredentialsView-9Nq2fOpi.js} +2 -2
  11. package/dist/assets/{CredentialsView-WF2GuXwX.js.map → CredentialsView-9Nq2fOpi.js.map} +1 -1
  12. package/dist/assets/{ExecutionFilter-6e5m1hky.js → ExecutionFilter-dfrYJ_Rf.js} +2 -2
  13. package/dist/assets/{ExecutionFilter-6e5m1hky.js.map → ExecutionFilter-dfrYJ_Rf.js.map} +1 -1
  14. package/dist/assets/{ExecutionPreview-qQdwo4nO.js → ExecutionPreview-yFW7oTRf.js} +2 -2
  15. package/dist/assets/{ExecutionPreview-qQdwo4nO.js.map → ExecutionPreview-yFW7oTRf.js.map} +1 -1
  16. package/dist/assets/{ExecutionsInfoAccordion-HQZywboM.js → ExecutionsInfoAccordion-EztI4QOE.js} +2 -2
  17. package/dist/assets/{ExecutionsInfoAccordion-HQZywboM.js.map → ExecutionsInfoAccordion-EztI4QOE.js.map} +1 -1
  18. package/dist/assets/{ExecutionsLandingPage-FEiybFSK.js → ExecutionsLandingPage-ygQGHLu2.js} +2 -2
  19. package/dist/assets/{ExecutionsLandingPage-FEiybFSK.js.map → ExecutionsLandingPage-ygQGHLu2.js.map} +1 -1
  20. package/dist/assets/{ExecutionsList-9Pc2Zrql.js → ExecutionsList-H9VKc4jb.js} +2 -2
  21. package/dist/assets/{ExecutionsList-9Pc2Zrql.js.map → ExecutionsList-H9VKc4jb.js.map} +1 -1
  22. package/dist/assets/{ExecutionsView-Li55aBU0.js → ExecutionsView-NdkXn6EA.js} +2 -2
  23. package/dist/assets/{ExecutionsView-Li55aBU0.js.map → ExecutionsView-NdkXn6EA.js.map} +1 -1
  24. package/dist/assets/{FixedCollectionParameter-d68rB1aT.js → FixedCollectionParameter-tJFyljoK.js} +3 -3
  25. package/dist/assets/{FixedCollectionParameter-d68rB1aT.js.map → FixedCollectionParameter-tJFyljoK.js.map} +1 -1
  26. package/dist/assets/{ForgotMyPasswordView-3lTe1SvY.js → ForgotMyPasswordView-VxAVQQgB.js} +2 -2
  27. package/dist/assets/{ForgotMyPasswordView-3lTe1SvY.js.map → ForgotMyPasswordView-VxAVQQgB.js.map} +1 -1
  28. package/dist/assets/{MainHeader-wtrPt4Uz.js → MainHeader-luMJdQn2.js} +2 -2
  29. package/dist/assets/{MainHeader-wtrPt4Uz.js.map → MainHeader-luMJdQn2.js.map} +1 -1
  30. package/dist/assets/{MainSidebar-dKXNC9E9.js → MainSidebar-nf-k1wHF.js} +2 -2
  31. package/dist/assets/{MainSidebar-dKXNC9E9.js.map → MainSidebar-nf-k1wHF.js.map} +1 -1
  32. package/dist/assets/{NodeCreation-lpcdOti7.js → NodeCreation-RvlbocPg.js} +3 -3
  33. package/dist/assets/{NodeCreation-lpcdOti7.js.map → NodeCreation-RvlbocPg.js.map} +1 -1
  34. package/dist/assets/{NodeCreator-YAF-VpA5.js → NodeCreator-zDLKC62A.js} +2 -2
  35. package/dist/assets/{NodeCreator-YAF-VpA5.js.map → NodeCreator-zDLKC62A.js.map} +1 -1
  36. package/dist/assets/{NodeList-8URsrxUQ.js → NodeList-U4qs88M0.js} +2 -2
  37. package/dist/assets/{NodeList-8URsrxUQ.js.map → NodeList-U4qs88M0.js.map} +1 -1
  38. package/dist/assets/{NodeView-caDno-kw.js → NodeView-fUdpq96X.js} +3 -3
  39. package/dist/assets/{NodeView-caDno-kw.js.map → NodeView-fUdpq96X.js.map} +1 -1
  40. package/dist/assets/{ResourcesListLayout-N4zg03Vf.js → ResourcesListLayout-y5FSwJeu.js} +2 -2
  41. package/dist/assets/{ResourcesListLayout-N4zg03Vf.js.map → ResourcesListLayout-y5FSwJeu.js.map} +1 -1
  42. package/dist/assets/{RunDataAi-EdxjRrVc.js → RunDataAi-dgEyN_Yl.js} +2 -2
  43. package/dist/assets/{RunDataAi-EdxjRrVc.js.map → RunDataAi-dgEyN_Yl.js.map} +1 -1
  44. package/dist/assets/{RunDataJson-wqxHrAY5.js → RunDataJson-RuNn5FTw.js} +3 -3
  45. package/dist/assets/{RunDataJson-wqxHrAY5.js.map → RunDataJson-RuNn5FTw.js.map} +1 -1
  46. package/dist/assets/{RunDataJsonActions-MfJV4quL.js → RunDataJsonActions-wMN8ObC3.js} +2 -2
  47. package/dist/assets/{RunDataJsonActions-MfJV4quL.js.map → RunDataJsonActions-wMN8ObC3.js.map} +1 -1
  48. package/dist/assets/{RunDataSchema-rxgd4Q_M.js → RunDataSchema-NrdiV0Bv.js} +2 -2
  49. package/dist/assets/{RunDataSchema-rxgd4Q_M.js.map → RunDataSchema-NrdiV0Bv.js.map} +1 -1
  50. package/dist/assets/{RunDataTable-2IMpD8oi.js → RunDataTable-vThTeakV.js} +2 -2
  51. package/dist/assets/{RunDataTable-2IMpD8oi.js.map → RunDataTable-vThTeakV.js.map} +1 -1
  52. package/dist/assets/{SamlOnboarding-RIlvbmgY.js → SamlOnboarding-7ZeWtOoT.js} +2 -2
  53. package/dist/assets/{SamlOnboarding-RIlvbmgY.js.map → SamlOnboarding-7ZeWtOoT.js.map} +1 -1
  54. package/dist/assets/SettingsApiView-d7znGVgB.js +2 -0
  55. package/dist/assets/SettingsApiView-d7znGVgB.js.map +1 -0
  56. package/dist/assets/{SettingsCommunityNodesView-xqn73tJO.js → SettingsCommunityNodesView-U2OqH5_g.js} +2 -2
  57. package/dist/assets/{SettingsCommunityNodesView-xqn73tJO.js.map → SettingsCommunityNodesView-U2OqH5_g.js.map} +1 -1
  58. package/dist/assets/{SettingsExternalSecrets-yr_g8DWk.js → SettingsExternalSecrets-OK2zcF3w.js} +2 -2
  59. package/dist/assets/{SettingsExternalSecrets-yr_g8DWk.js.map → SettingsExternalSecrets-OK2zcF3w.js.map} +1 -1
  60. package/dist/assets/{SettingsFakeDoorView-ogkrrHSL.js → SettingsFakeDoorView-wbngwN3n.js} +2 -2
  61. package/dist/assets/{SettingsFakeDoorView-ogkrrHSL.js.map → SettingsFakeDoorView-wbngwN3n.js.map} +1 -1
  62. package/dist/assets/{SettingsLdapView-aWCvc1gM.js → SettingsLdapView-rYSjSdpv.js} +2 -2
  63. package/dist/assets/{SettingsLdapView-aWCvc1gM.js.map → SettingsLdapView-rYSjSdpv.js.map} +1 -1
  64. package/dist/assets/{SettingsLogStreamingView-IdWAQAEz.js → SettingsLogStreamingView-r4yJe9rt.js} +2 -2
  65. package/dist/assets/{SettingsLogStreamingView-IdWAQAEz.js.map → SettingsLogStreamingView-r4yJe9rt.js.map} +1 -1
  66. package/dist/assets/{SettingsSourceControl-s8B2f1Et.js → SettingsSourceControl-2sJrfiQZ.js} +2 -2
  67. package/dist/assets/{SettingsSourceControl-s8B2f1Et.js.map → SettingsSourceControl-2sJrfiQZ.js.map} +1 -1
  68. package/dist/assets/{SettingsSso-xhUlnU8v.js → SettingsSso-F08fTaoT.js} +2 -2
  69. package/dist/assets/{SettingsSso-xhUlnU8v.js.map → SettingsSso-F08fTaoT.js.map} +1 -1
  70. package/dist/assets/{SettingsUsageAndPlan-qguburG-.js → SettingsUsageAndPlan-P3NemeAe.js} +2 -2
  71. package/dist/assets/{SettingsUsageAndPlan-qguburG-.js.map → SettingsUsageAndPlan-P3NemeAe.js.map} +1 -1
  72. package/dist/assets/{SettingsUsersView-mRes9Qkr.js → SettingsUsersView-qkwybUvB.js} +2 -2
  73. package/dist/assets/{SettingsUsersView-mRes9Qkr.js.map → SettingsUsersView-qkwybUvB.js.map} +1 -1
  74. package/dist/assets/{SettingsView-3Vqg8kdv.js → SettingsView-9Bw0MXcT.js} +2 -2
  75. package/dist/assets/{SettingsView-3Vqg8kdv.js.map → SettingsView-9Bw0MXcT.js.map} +1 -1
  76. package/dist/assets/{SetupView-RR2VulZH.js → SetupView-s0yzV7Gm.js} +2 -2
  77. package/dist/assets/{SetupView-RR2VulZH.js.map → SetupView-s0yzV7Gm.js.map} +1 -1
  78. package/dist/assets/{SetupWorkflowFromTemplateView-BbMhs31Z.js → SetupWorkflowFromTemplateView-6De7ws36.js} +2 -2
  79. package/dist/assets/{SetupWorkflowFromTemplateView-BbMhs31Z.js.map → SetupWorkflowFromTemplateView-6De7ws36.js.map} +1 -1
  80. package/dist/assets/{SigninView-hIeIEews.js → SigninView-QvYhHXWz.js} +2 -2
  81. package/dist/assets/{SigninView-hIeIEews.js.map → SigninView-QvYhHXWz.js.map} +1 -1
  82. package/dist/assets/{SignupView-iaO_BXyp.js → SignupView-ZLqXA-fI.js} +2 -2
  83. package/dist/assets/{SignupView-iaO_BXyp.js.map → SignupView-ZLqXA-fI.js.map} +1 -1
  84. package/dist/assets/{TemplateDetails-HasVFCUO.js → TemplateDetails-qWnefMYx.js} +2 -2
  85. package/dist/assets/{TemplateDetails-HasVFCUO.js.map → TemplateDetails-qWnefMYx.js.map} +1 -1
  86. package/dist/assets/{TemplateList-uT0I7BC-.js → TemplateList-Ek8NkQLd.js} +2 -2
  87. package/dist/assets/{TemplateList-uT0I7BC-.js.map → TemplateList-Ek8NkQLd.js.map} +1 -1
  88. package/dist/assets/{TemplatesCollectionView-WwdzPK0w.js → TemplatesCollectionView-xoRz-QfG.js} +2 -2
  89. package/dist/assets/{TemplatesCollectionView-WwdzPK0w.js.map → TemplatesCollectionView-xoRz-QfG.js.map} +1 -1
  90. package/dist/assets/{TemplatesInfoCarousel-WUt6CUAt.js → TemplatesInfoCarousel-TKGxiVaR.js} +2 -2
  91. package/dist/assets/{TemplatesInfoCarousel-WUt6CUAt.js.map → TemplatesInfoCarousel-TKGxiVaR.js.map} +1 -1
  92. package/dist/assets/{TemplatesSearchView-pwVBF7_m.js → TemplatesSearchView-gwbhQE6_.js} +2 -2
  93. package/dist/assets/{TemplatesSearchView-pwVBF7_m.js.map → TemplatesSearchView-gwbhQE6_.js.map} +1 -1
  94. package/dist/assets/{TemplatesWorkflowView-OxfZO4yX.js → TemplatesWorkflowView-VbJuwYVl.js} +2 -2
  95. package/dist/assets/{TemplatesWorkflowView-OxfZO4yX.js.map → TemplatesWorkflowView-VbJuwYVl.js.map} +1 -1
  96. package/dist/assets/{VariablesView-O1dh47w6.js → VariablesView-ZNxPDs_G.js} +2 -2
  97. package/dist/assets/{VariablesView-O1dh47w6.js.map → VariablesView-ZNxPDs_G.js.map} +1 -1
  98. package/dist/assets/{WorkerView-ehe17h1Q.js → WorkerView-Rzm_p5Pv.js} +2 -2
  99. package/dist/assets/{WorkerView-ehe17h1Q.js.map → WorkerView-Rzm_p5Pv.js.map} +1 -1
  100. package/dist/assets/{WorkflowActivator-EK3d11st.js → WorkflowActivator-H10vhdIV.js} +2 -2
  101. package/dist/assets/{WorkflowActivator-EK3d11st.js.map → WorkflowActivator-H10vhdIV.js.map} +1 -1
  102. package/dist/assets/{WorkflowHistory-mqWH3nQZ.js → WorkflowHistory-diO3ekal.js} +2 -2
  103. package/dist/assets/{WorkflowHistory-mqWH3nQZ.js.map → WorkflowHistory-diO3ekal.js.map} +1 -1
  104. package/dist/assets/{WorkflowOnboardingView-LZfOfbX4.js → WorkflowOnboardingView-gUVzVQsZ.js} +2 -2
  105. package/dist/assets/{WorkflowOnboardingView-LZfOfbX4.js.map → WorkflowOnboardingView-gUVzVQsZ.js.map} +1 -1
  106. package/dist/assets/{WorkflowsView-NL0wKv4C.js → WorkflowsView-Qqq1sZTo.js} +2 -2
  107. package/dist/assets/{WorkflowsView-NL0wKv4C.js.map → WorkflowsView-Qqq1sZTo.js.map} +1 -1
  108. package/dist/assets/{cloud-JhkwKZAE.js → cloud-g7GqwUFZ.js} +2 -2
  109. package/dist/assets/{cloud-JhkwKZAE.js.map → cloud-g7GqwUFZ.js.map} +1 -1
  110. package/dist/assets/{executionsHelpers-Gkj6bYJi.js → executionsHelpers-gnbzcx5j.js} +2 -2
  111. package/dist/assets/{executionsHelpers-Gkj6bYJi.js.map → executionsHelpers-gnbzcx5j.js.map} +1 -1
  112. package/dist/assets/{index--RuZ5wHr.js → index-RXjMHIPR.js} +11 -11
  113. package/dist/assets/{index--RuZ5wHr.js.map → index-RXjMHIPR.js.map} +1 -1
  114. package/dist/assets/{pushConnection-UpdxMjHa.js → pushConnection-HdjAqr4R.js} +2 -2
  115. package/dist/assets/{pushConnection-UpdxMjHa.js.map → pushConnection-HdjAqr4R.js.map} +1 -1
  116. package/dist/assets/{templateActions-CZfTXoBx.js → templateActions-y8msVyEB.js} +2 -2
  117. package/dist/assets/{templateActions-CZfTXoBx.js.map → templateActions-y8msVyEB.js.map} +1 -1
  118. package/dist/assets/{useExecutionDebugging-FPo5qMF0.js → useExecutionDebugging-Yog1CJXv.js} +2 -2
  119. package/dist/assets/{useExecutionDebugging-FPo5qMF0.js.map → useExecutionDebugging-Yog1CJXv.js.map} +1 -1
  120. package/dist/assets/{workflowActivate-FltKJaAB.js → workflowActivate-IRvCsxq5.js} +2 -2
  121. package/dist/assets/{workflowActivate-FltKJaAB.js.map → workflowActivate-IRvCsxq5.js.map} +1 -1
  122. package/dist/index.html +1 -1
  123. package/package.json +1 -1
  124. package/dist/assets/CollectionParameter-ThiBAc6J.js.map +0 -1
  125. package/dist/assets/SettingsApiView-_7qUJ2zm.js +0 -2
  126. package/dist/assets/SettingsApiView-_7qUJ2zm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"mappings":"onGAEO,MAAMA,GAAuBC,EAAgB,CACnD,MAAO,CACC,OAEN,cAAe,iBAAkB,QAAU,UAAU,iBACrD,QAAS,0BAA0B,KAAK,UAAU,QAAQ,EAE5D,EACA,SAAU,CAET,gBAAyB,CACxB,OAAI,KAAK,QACD,OAED,SACR,CACD,EACA,QAAS,CACR,iBAAiB,EAAwC,CACxD,OAAI,KAAK,gBAAkB,IAAQ,aAAa,WACxC,GAEJ,KAAK,QACD,EAAE,QAEH,EAAE,OACV,CACD,CACD,CAAC,ECvBYC,GAAmBD,EAAgB,CAC/C,OAAQ,CAACD,EAAoB,EAC7B,MAAO,CACC,OACN,iBAAkB,CAAC,EAAG,CAAC,EAEzB,EACA,SAAU,CACT,GAAGG,EAAUC,EAAU,CACxB,EACA,QAAS,CACR,aAAa,EAAe,CACrB,MAAAC,EAAiB,KAAK,QAAQ,uBAE9B,CAACC,EAAGC,CAAC,EAAIC,GAAiB,CAAC,EAE3BC,EAA0BJ,EAAe,CAAC,GAAKC,EAAI,KAAK,iBAAiB,CAAC,GAC1EI,EAA0BL,EAAe,CAAC,GAAKE,EAAI,KAAK,iBAAiB,CAAC,GAChF,KAAK,QAAQ,uBAAyB,CAACE,EAAyBC,CAAuB,EAGlF,sBAAiB,CAAC,EAAIJ,EACtB,sBAAiB,CAAC,EAAIC,CAC5B,EACA,sBAAsB,EAAeI,EAA4B,CAOhE,GANI,CAAC,KAAK,iBAAiB,CAAC,GAAK,CAACA,GAM9B,KAAK,QAAQ,eAAe,YAAY,EAE3C,OAIG,EAAE,SAAW,IAChB,KAAK,QAAQ,uBAAyB,IAGvC,KAAM,CAACL,EAAGC,CAAC,EAAIC,GAAiB,CAAC,EAE5B,sBAAiB,CAAC,EAAIF,EACtB,sBAAiB,CAAC,EAAIC,EAG3B,KAAK,IAAI,iBAAiB,YAAa,KAAK,qBAAqB,CAClE,EACA,oBAAoB,EAAe,CAC7B,KAAK,QAAQ,yBAOlB,KAAK,IAAI,oBAAoB,YAAa,KAAK,qBAAqB,EAEpE,KAAK,QAAQ,uBAAyB,GAGvC,EACA,sBAAsB,EAAe,CAEhC,OAAE,QAAU,CAAC,EAAE,OAAO,GAAG,SAAS,WAAW,IAI7C,MAAK,QAAQ,eAAe,YAAY,EASxC,IAJA,EAAE,UAAY,IACjB,KAAK,QAAQ,uBAAyB,IAGnC,EAAE,UAAY,EAAG,CAKpB,KAAK,QAAQ,CAAC,EACd,MACD,CAEA,KAAK,aAAa,CAAC,EACpB,CACD,CACD,CAAC,ECtDYK,GAAiBC,GAAY,SAAU,IAAM,CACzD,MAAMC,EAAgBC,IAChBC,EAAiBC,IACjBC,EAAUd,KACVe,EAAeC,KACfC,EAAqBC,KAErBC,EAAqBC,IACrBC,EAAaD,EAAa,EAAK,EAC/BE,EAAyBF,EAAuB,IAAI,EACpDG,EAAwBH,EAAuB,IAAI,EAEnDI,EAAQC,EAAoB,IAAMf,EAAc,QAAQ,EACxDgB,EAAeD,EAAoB,IACxCD,EAAM,MAAM,OACVG,GAASA,EAAK,OAASC,IAAmBhB,EAAe,cAAce,EAAK,IAAI,CAClF,GAEKE,EAAST,EAAa,EAAK,EAC3BU,EAAgBV,EAAY,CAAC,EAC7BW,EAA0BX,EAAgB,CAAC,EAAG,CAAC,CAAC,EAChDY,EAAcP,EAAS,IAAMR,EAAmB,YAAY,cAAc,EAE1EgB,GAAAD,EAAcE,GAAa,CAC5Bf,EAAmB,QACHA,EAAA,MAAM,kBAAoB,CAACe,EAC/C,CACA,EAEK,MAAAC,EAAwCC,GAAwB,CAC/D,MAAAC,EAAWC,GAAqBR,EAAc,MAAOM,GAAU,CAAC,EAAG,CAAC,CAAC,EAElEC,EAAA,CAAC,GAAKE,GAAgC,EACtCF,EAAA,CAAC,GAAKE,GAAgC,EAE/CR,EAAwB,MAAQS,GAAmBhB,EAAM,MAAOa,CAAQ,GAGnEI,EAA8B,KACEN,IAE9B,CACN,GAAIO,GAAK,EACT,GAAGC,GACH,SAAUZ,EAAwB,QAI9Ba,EAA8B,IACnClB,EAAa,MAAM,OAAS,EAAIF,EAAM,MAAQ,CAACiB,EAAA,EAA+B,GAAGjB,EAAM,KAAK,EAEvFqB,EAAkCR,GAAqC,CAC5E,MAAMS,EAAejB,EAAO,MACzB,EACAf,EAAQ,qBACNiC,GACAC,GAECC,EAAYZ,EAAS,CAAC,EAAIS,EAC1BI,EAAYrB,EAAO,MACtBQ,EAAS,CAAC,EACVA,EAAS,CAAC,EAAIvB,EAAQ,cAAgBA,EAAQ,aAE1C,OAACmC,EAAWC,CAAS,GAGvBC,EAAe,CAACC,EAAmBhB,IAAuB,OAC/DN,EAAc,MAAQsB,GACHC,EAAAlC,EAAA,cAAAkC,EAAO,QAAQD,GAClCtC,EAAQ,uBAAyBsB,CAAA,EAG5BkB,EAAY,IAAM,CACvB,KAAM,CAAE,MAAAC,EAAO,OAAAnB,CAAO,EAAIoB,GAAW,CACpC,MAAO1B,EAAc,MACrB,OAAQhB,EAAQ,uBAChB,OAAQ+B,EAA+B,CAAC,OAAO,WAAa,EAAG,OAAO,YAAc,CAAC,CAAC,EACtF,EACDM,EAAaI,EAAOnB,CAAM,GAGrBqB,EAAS,IAAM,CACpB,KAAM,CAAE,MAAAF,EAAO,OAAAnB,CAAO,EAAIsB,GAAY,CACrC,MAAO5B,EAAc,MACrB,OAAQhB,EAAQ,uBAChB,OAAQ+B,EAA+B,CAAC,OAAO,WAAa,EAAG,OAAO,YAAc,CAAC,CAAC,EACtF,EACDM,EAAaI,EAAOnB,CAAM,GAGrBuB,EAAU,IAAM,CACrB,KAAM,CAAE,MAAAJ,EAAO,OAAAnB,CAAO,EAAIwB,GAAa,CACtC,MAAO9B,EAAc,MACrB,OAAQhB,EAAQ,uBAChB,OAAQ+B,EAA+B,CAAC,OAAO,WAAa,EAAG,OAAO,YAAc,CAAC,CAAC,EACtF,EACDM,EAAaI,EAAOnB,CAAM,GAGrByB,EAAY,IAAM,CACvB,MAAMrC,EAAQoB,IACV,IAACpB,EAAM,OAEV,OAEK,MAAE,UAAA4B,EAAW,OAAAhB,GAAW0B,GAAatC,EAAO,CAACK,EAAO,KAAK,EAC/DsB,EAAaC,EAAWhB,CAAM,GAGzB2B,EAAoB,CAACC,EAAgBC,EAAgBC,EAAkB,KAAU,CACtF,MAAMjE,EAAiBa,EAAQ,uBACzBT,EAA0BJ,EAAe,CAAC,GAAKiE,EAAkBD,EAASD,GAC1E1D,GAA0BL,EAAe,CAAC,GAAKiE,EAAkBF,EAASC,GACxEnD,EAAA,uBAAyB,CAACT,EAAyBC,EAAuB,GAG7E6D,EAAeC,GAAkB,CAEtCA,EAAE,eAAe,EAEjB,KAAM,CAAE,OAAAJ,EAAQ,OAAAC,CAAO,EAAII,GAAyBD,CAAC,EAEjD,GAAAA,EAAE,SAAWA,EAAE,QAAS,CACrB,MAAAE,EAAcC,GAA4BN,CAAM,EAChD,CAAE,MAAAV,EAAO,OAAAnB,EAAW,EAAAoC,GAAWF,CAAW,EAAE,CACjD,MAAOxC,EAAc,MACrB,OAAQhB,EAAQ,uBAChB,OAAQ+B,EAA+BzC,GAAiBgE,CAAC,CAAC,EAC1D,EACDjB,EAAaI,EAAOnB,EAAM,EAC1B,MACD,CACkB2B,EAAAC,EAAQC,EAAQG,EAAE,QAAQ,GAG7C,SAASK,GAAaC,EAAoB,OAErCvD,EAAmB,QACtBA,EAAmB,MAAM,UACzBA,EAAmB,MAAM,QACzBA,EAAmB,MAAQ,QAG5BA,EAAmB,MAAQwD,GAAY,CACtC,UAAAD,EACA,UAAWE,GACX,eAAgB,GAChB,SAAU,CACT,KAAM,MACN,QAAS,CAAE,OAAQ,CAAE,CACtB,EACA,WAAYC,GACZ,gBAAiBC,GACjB,mBAAoBC,GACpB,kBAAmB,CAAC/C,EAAY,MAChC,YAAa,CACZ,OAAQ,UACR,KAAM,CAAE,EAAGgD,GAAW,EAAGA,EAAU,EACnC,MAAQC,GAAmC,QAEpC,MAAAC,EADcD,EAAO,KAAK,eAAe,EAClB,aAAa,WAAW,EACrD,GAAI,CAACC,EAAU,OACf7D,EAAW,MAAQ,GAEb,MAAA8D,GAAarE,EAAQ,eAAeoE,CAAQ,EAE9C,OAAAD,EAAO,GAAK,CAACE,MAIhB9B,GAAAlC,EAAmB,QAAnB,MAAAkC,GAA0B,qBAC1BvC,EAAQ,mBAAmB,GAG5BA,EAAQ,gBAAgB,YAAY,EAC7B,EACR,EACA,KAAOmE,GAAgC,CAEhC,MAAAC,EADcD,EAAO,KAAK,eAAe,EAClB,aAAa,WAAW,EACrD,GAAI,CAACC,EAAU,OACT,MAAAE,GAAW1E,EAAc,cAAcwE,CAAQ,EAErD,GADA7D,EAAW,MAAQ,GACfP,EAAQ,eAAe,YAAY,GAAKsE,GAAU,CAC/C,MAAAC,GAAYvE,EAAQ,iBAAiB,MAAM,EACvBuE,GAAU,IAAK1D,IAAkBA,GAAK,IAAI,EAC7C,SAASyD,GAAS,IAAI,GAG5CC,GAAU,KAAKD,EAAQ,EAGpBC,GAAU,OAAS,GACtBtE,EAAa,mBAAmB,EAM7B,IAAAuE,GACMD,GAAA,QAAS1D,IAAkB,CACpC,MAAM4D,GAAU,SAAS,eAAe5D,GAAK,EAAE,EAC/C,GAAI4D,KAAY,KACf,OAGiBD,GAAA,CACjB,SAASC,GAAQ,MAAM,KAAK,MAAM,EAAG,EAAE,EAAG,EAAE,EAC5C,SAASA,GAAQ,MAAM,IAAI,MAAM,EAAG,EAAE,EAAG,EAAE,GAG5C,MAAMC,GAAoB,CACzB,KAAM7D,GAAK,KACX,WAAY,CACX,SAAU2D,EACX,GAEKG,GAAc9D,GAAK,UACrB8D,GAAY,CAAC,IAAMH,GAAgB,CAAC,GAAKG,GAAY,CAAC,IAAMH,GAAgB,CAAC,KACnEvE,EAAA,kBACZ,IAAI2E,GAAgB/D,GAAK,KAAM8D,GAAaH,EAAe,GAE5D5E,EAAc,qBAAqB8E,EAAiB,EACrD,CACA,EACGH,GAAU,OAAS,GACtBtE,EAAa,kBAAkB,EAE5BD,EAAQ,eAAe,YAAY,GACtCA,EAAQ,mBAAmB,YAAY,CAEzC,CACD,EACA,OAAQ,mFACT,EACA,GACkBuC,EAAAlC,EAAA,cAAAkC,EAAO,yBAA0BsC,GAChC7E,EAAQ,eAGnB,KAED6E,EAET,CAEA,MAAMC,GAAkBnE,EAAS,IAAMN,EAAmB,KAA+B,EAClF,OACN,OAAAU,EACA,cAAAC,EACA,wBAAAC,EACA,uBAAAT,EACA,sBAAAC,EACA,gBAAAqE,GACA,qCAAAzD,EACA,4BAAAS,EACA,+BAAAC,EACA,aAAAM,EACA,UAAAG,EACA,OAAAG,EACA,QAAAE,EACA,UAAAE,EACA,YAAAM,EACA,aAAAM,EAAA,CAEF,CAAC,EC/QKpC,GAAWjB,EAAgB,CAAC,EAAG,CAAC,CAAC,EACjCyE,GAASzE,EAAI,EAAK,EAClB0E,GAAS1E,EAAuB,CAAE,OAAQ,QAAU,GACpD2E,GAAU3E,EAA2B,EAAE,EACvC4E,GAAiB5E,EAA+B,IAAM,CAAC,CAAC,EAEjD6E,GAAiB,CAACC,EAAsC,IAAM,CAAC,IAAM,CACjF,MAAMpF,EAAUd,KACVY,EAAiBC,IACjBsF,EAAiBxF,IACjBM,EAAqBC,KACrB,CAAE,uBAAAkF,GAA2BC,KAC7BC,EAAOC,KAEPC,EAAa/E,EAClB,IAAMR,EAAmB,YAAY,gBAAkBH,EAAQ,gBAG1D2F,EAAchF,EAAS,IAAM,CAClC,GAAI,CAACoE,GAAO,MAAO,MAAO,GACpB,MAAAa,EAAgB5F,EAAQ,cAAc,IAAKa,GAChDwE,EAAe,cAAcxE,EAAK,IAAI,GAEjCgF,EAAgBb,GAAO,MACzB,OAAAa,EAAc,SAAW,SACrBD,EACGC,EAAc,SAAW,mBACTD,EAAc,KAAM/E,GAASA,EAAK,OAASgF,EAAc,KAAK,IAAI,EACjED,EAAgB,CAACC,EAAc,IAAI,EAGxD,CAACA,EAAc,IAAI,EAC1B,EAEKC,EAAoBC,GAAmC,CACtD,MAAAC,EAAgBX,EAAe,SAAS,OAAQY,GAAMA,EAAE,OAASF,EAAS,IAAI,EACpF,OAAOA,EAAS,WAAa,QAAaC,EAAc,OAASD,EAAS,UAGrEG,EAAoBrF,GAAyB,CAClD,MAAMkF,EAAWjG,EAAe,YAAYe,EAAK,KAAMA,EAAK,WAAW,EAEnE,MADA,CAACkF,GACDI,GAA2B,SAASJ,EAAS,IAAI,EAAU,GAExDD,EAAiBC,CAAQ,GAG3BK,EAAcvF,GAAyB,CAC5C,MAAMkF,EAAWjG,EAAe,YAAYe,EAAK,KAAMA,EAAK,WAAW,EACjEwF,EAAYf,EAAuBzE,CAAI,EACzC,OAACkF,GAAYM,EAAU,SAAW,EAAU,GACzCN,EAAS,QAAQ,SAAW,GAAK,CAACO,GAA6B,SAASzF,EAAK,IAAI,GAGnF0F,EAAc1F,GACZ,CAAC,CAACwE,EAAe,kBAAkBxE,EAAK,IAAI,EAE9C2F,EAAQ,IAAM,CACZxB,GAAA,MAAQ,CAAE,OAAQ,QAAS,EAClCD,GAAO,MAAQ,GACfE,GAAQ,MAAQ,GACP1D,GAAA,MAAQ,CAAC,EAAG,CAAC,GAGjBkF,EAAO,CAACC,EAAmBC,EAAgC,CAAE,OAAQ,YAAe,CAGzF,GAFAD,EAAM,gBAAgB,EAElB3B,GAAO,OAAS4B,EAAW,SAAW3B,GAAO,MAAM,OAAQ,CAExDwB,IACN,MACD,CAEAE,EAAM,eAAe,EAErBxB,GAAe,MAAQE,EACvBJ,GAAO,MAAQ2B,EACNpF,GAAA,MAAQjC,GAAiBoH,CAAK,EACvC3B,GAAO,MAAQ,GAEf,MAAMrE,EAAQiF,EAAY,MACpBiB,EAAelG,EAAM,MAAOG,GAASA,EAAK,OAASgG,EAAgB,EACnEC,EAAc,CACnB,eAAgBpG,EAAM,OACtB,YAAa,CACZ,QAASkG,EACNpB,EAAK,SAAS,qBAAsB,CAAE,eAAgB9E,EAAM,MAAQ,GACpE8E,EAAK,SAAS,mBAAoB,CAAE,eAAgB9E,EAAM,OAAQ,CACtE,GAGKqG,EAAmB,CACxB,CACC,GAAI,aACJ,QAAS,GACT,MAAOvB,EAAK,SAAS,uBAAuB,EAC5C,SAAU,CAAE,QAAS,GAAM,KAAM,CAAC,GAAG,CAAE,EACvC,SAAU9E,EAAM,SAAW2E,EAAe,SAAS,MACpD,EACA,CACC,GAAI,eACJ,MAAOG,EAAK,SAAS,yBAAyB,EAC9C,SAAU9E,EAAM,SAAW,CAC5B,GAGG,GAAAA,EAAM,SAAW,EACpBuE,GAAQ,MAAQ,CACf,CACC,GAAI,WACJ,SAAU,CAAE,KAAM,CAAC,KAAK,CAAE,EAC1B,MAAOO,EAAK,SAAS,qBAAqB,EAC1C,SAAUE,EAAW,KACtB,EACA,CACC,GAAI,aACJ,SAAU,CAAE,SAAU,GAAM,KAAM,CAAC,GAAG,CAAE,EACxC,MAAOF,EAAK,SAAS,uBAAuB,EAC5C,SAAUE,EAAW,KACtB,EACA,GAAGqB,CAAA,MAEE,CACN,MAAMC,EAAqC,CAC1C,CAACJ,GAAgB,CAChB,GAAI,oBACJ,MAAOlG,EAAM,MAAOG,GAASA,EAAK,QAAQ,EACvC2E,EAAK,SAAS,uBAAwBsB,CAAW,EACjDtB,EAAK,SAAS,yBAA0BsB,CAAW,EACtD,SAAU,CAAE,KAAM,CAAC,GAAG,CAAE,EACxB,SAAUpB,EAAW,KACtB,EACA,CAACkB,GAAgB,CAChB,GAAI,aACJ,MAAOlG,EAAM,MAAOG,GAAS0F,EAAW1F,CAAI,CAAC,EAC1C2E,EAAK,SAAS,oBAAqBsB,CAAW,EAC9CtB,EAAK,SAAS,kBAAmBsB,CAAW,EAC/C,SAAU,CAAE,KAAM,CAAC,GAAG,CAAE,EACxB,SAAUpB,EAAW,OAAS,CAAChF,EAAM,MAAM0F,CAAU,CACtD,EACA,CACC,GAAI,OACJ,MAAOZ,EAAK,SAAS,mBAAoBsB,CAAW,EACpD,SAAU,CAAE,QAAS,GAAM,KAAM,CAAC,GAAG,CAAE,CACxC,EACA,CACC,GAAI,YACJ,MAAOtB,EAAK,SAAS,wBAAyBsB,CAAW,EACzD,SAAU,CAAE,QAAS,GAAM,KAAM,CAAC,GAAG,CAAE,EACvC,SAAUpB,EAAW,OAAS,CAAChF,EAAM,MAAMwF,CAAgB,CAC5D,EACA,GAAGa,EACH,CACC,GAAI,SACJ,QAAS,GACT,MAAOvB,EAAK,SAAS,qBAAsBsB,CAAW,EACtD,SAAU,CAAE,KAAM,CAAC,KAAK,CAAE,EAC1B,SAAUpB,EAAW,KACtB,GACC,OAAO,OAAO,EAEZ,GAAAhF,EAAM,SAAW,EAAG,CACvB,MAAMuG,EAAoBL,EACvB,CACA,CACC,GAAI,OACJ,MAAOpB,EAAK,SAAS,wBAAwB,EAC7C,SAAU,CAAE,KAAM,CAAC,GAAG,CAAE,EACxB,SAAUE,EAAW,KACtB,EACA,CACC,GAAI,eACJ,MAAOF,EAAK,SAAS,yBAAyB,EAC9C,SAAUE,EAAW,KACtB,GAEA,CACA,CACC,GAAI,OACJ,MAAOF,EAAK,SAAS,kBAAkB,EACvC,SAAU,CAAE,KAAM,CAAC,GAAG,CAAE,CACzB,EACA,CACC,GAAI,UACJ,MAAOA,EAAK,SAAS,qBAAqB,EAC1C,SAAUE,EAAW,KACtB,EACA,CACC,GAAI,SACJ,MAAOF,EAAK,SAAS,oBAAoB,EACzC,SAAU,CAAE,KAAM,CAAC,IAAI,CAAE,EACzB,SAAUE,EAAW,KACtB,GAGSsB,EAAA,QAAQ,GAAGC,CAAiB,CACzC,CAEAhC,GAAQ,MAAQ+B,CACjB,GAGKE,EAAmBC,GAA8B,CACvCjC,GAAA,MAAMiC,EAAQxB,EAAY,KAAK,GAG/C,OAAAxE,GACC,IAAMnB,EAAQ,uBACd,IAAM,CACCwG,GACP,GAGM,CACN,OAAAzB,GACA,SAAAxD,GACA,OAAAyD,GACA,QAAAC,GACA,YAAAU,EACA,KAAAc,EACA,MAAAD,EACA,gBAAAU,CAAA,CAEF,ECrPA,SAAwBE,IAAuB,CACxC,MAAAC,EAAe/G,EAAI,EAAK,EACxBgH,EAAYhH,EAAI,SAAS,cAAc,MAAM,CAA4B,EAEzE,CAAE,cAAAiH,EAAe,iBAAAC,CAAiB,EAAIC,GAAiB,EACvDzH,EAAUd,KACVwI,EAAchI,KACd2F,EAAiBxF,IACjB,CAAE,OAAQ8H,CAAkB,EAAIxC,GAAe,EAErD,SAASyC,EAAmBC,EAAgC,CAC3D,OAAO,OAAOP,EAAU,MAAM,MAAOO,CAAM,CAC5C,CAEA,SAASC,EAAepB,EAAmB,CAC1C,KAAM,CAACtH,EAAGC,CAAC,EAAI0I,EAA+BrB,CAAK,EACzCY,EAAA,MAAQ,OAAO,OAAOA,EAAU,MAAO,CAAE,EAAAlI,EAAG,EAAAC,EAAG,EAEtCuI,EAAA,CAClB,KAAMN,EAAU,MAAM,EAAI,KAC1B,IAAKA,EAAU,MAAM,EAAI,KACzB,WAAY,UACZ,EACDD,EAAa,MAAQ,EACtB,CAEA,SAASW,EAAiBtB,EAAmB,CACtC,MAAAuB,EAAeC,EAAiBxB,CAAK,EAExBkB,EAAA,CAClB,KAAMK,EAAa,EAAI,KACvB,IAAKA,EAAa,EAAI,KACtB,MAAOA,EAAa,MAAQ,KAC5B,OAAQA,EAAa,OAAS,KAC9B,CACF,CAEA,SAASE,GAAiB,CACzBb,EAAU,MAAM,EAAI,EACpBA,EAAU,MAAM,EAAI,EAEDM,EAAA,CAClB,WAAY,SACZ,KAAM,MACN,IAAK,MACL,MAAO,MACP,OAAQ,MACR,EACDP,EAAa,MAAQ,EACtB,CAEA,SAASa,EAAiBxB,EAAmB,CAC5C,KAAM,CAACtH,EAAGC,CAAC,EAAI0I,EAA+BrB,CAAK,EAC5C,OACN,EAAG,KAAK,IAAItH,EAAGkI,EAAU,MAAM,CAAC,EAChC,EAAG,KAAK,IAAIjI,EAAGiI,EAAU,MAAM,CAAC,EAChC,MAAO,KAAK,IAAIlI,EAAIkI,EAAU,MAAM,CAAC,EACrC,OAAQ,KAAK,IAAIjI,EAAIiI,EAAU,MAAM,CAAC,EAExC,CAEA,SAASc,EAAqB1B,EAA8B,CAC3D,MAAM2B,EAAyB,GACzBJ,EAAeC,EAAiBxB,CAAK,EAG5B,OAAArB,EAAA,SAAS,QAASxE,IAAkB,CAGjDA,GAAK,SAAS,CAAC,EAAIoH,EAAa,GAChCpH,GAAK,SAAS,CAAC,EAAIoH,EAAa,EAAIA,EAAa,OAKjDpH,GAAK,SAAS,CAAC,EAAIoH,EAAa,GAChCpH,GAAK,SAAS,CAAC,EAAIoH,EAAa,EAAIA,EAAa,QAIlDI,EAAY,KAAKxH,EAAI,EACrB,EAEMwH,CACR,CAEA,SAASC,GAAmB,CAC3BhB,EAAU,MAAM,GAAK,aACFM,EAAA,CAClB,OAAQ,WACR,OAAQ,qBAER,SAAU,WACV,OAAQ,MACR,WAAY,SACZ,EAESN,EAAA,MAAM,iBAAiB,UAAWiB,CAAkB,EAE3C,SAAS,cAAc,YAAY,EAC3C,YAAYjB,EAAU,KAAK,CACvC,CAEA,SAASkB,EAAiBlF,EAAe,CACpC,GAAAA,EAAE,UAAY,EAAG,CAIpBiF,EAAmBjF,CAAC,EACpB,MACD,CAEA0E,EAAiB1E,CAAC,CACnB,CAEA,SAASiF,EAAmBjF,EAAe,CAEtC,GAAAA,EAAE,SAAW,GAAKqE,EAAkB,MAAO,OAE3C,IAACN,EAAa,MAAO,CACpBE,GAAiBjE,EAAE,kBAAkB,aACpCA,EAAE,QAAUA,EAAE,OAAO,GAAG,SAAS,WAAW,GAE9BmF,IAKnB,MACD,CACS,6BAAoB,YAAaD,CAAgB,EAGzCC,IAGX,MAAA7C,EAAgBwC,EAAqB9E,CAAC,EAC9BsC,EAAA,QAAS/E,GAAS,CAC/B6H,EAAa7H,CAAI,EACjB,EAEG+E,EAAc,SAAW,IACpB5F,EAAA,iBAAmB4F,EAAc,CAAC,EAAE,MAG9BuC,GAChB,CACS,SAAAQ,EAAqBrF,EAAe7D,EAA4B,CACpE+H,EAAiBlE,CAAC,GAAK7D,GAAqB6D,EAAE,SAAW,GAMzDtD,EAAQ,eAAe,YAAY,IAIvC8H,EAAexE,CAAC,EAIP,0BAAiB,YAAakF,CAAgB,EACxD,CAEA,SAAST,EAA+BrB,EAA4C,CAC7E,MAAAkC,EAAgBtJ,GAAiBoH,CAAK,EAEtC,CAACvE,EAAWC,EAAS,EAAIsF,EAAY,+BAA+BkB,CAAa,EACjF5H,GAAgB0G,EAAY,cAC5BmB,EAAyB7I,EAAQ,uBAEvC,OAAO8I,GAAoB3G,EAAWC,GAAWpB,GAAe6H,CAAsB,CACvF,CAEA,SAASE,EAAelI,EAAe,CACtCb,EAAQ,wBAAwBa,CAAI,EACpCmI,EAAS,MAAM,wBAAwBA,EAAS,MAAM,kBAAkBnI,GAAA,YAAAA,EAAM,EAAE,CAAC,CAClF,CAEA,SAAS6H,EAAa7H,EAAe,CACpCb,EAAQ,gBAAgBa,CAAI,EAC5BmI,EAAS,MAAM,mBAAmBA,EAAS,MAAM,kBAAkBnI,GAAA,YAAAA,EAAM,EAAE,CAAC,CAC7E,CAEA,SAAS4H,GAAmB,CAC3BO,EAAS,MAAM,qBACfhJ,EAAQ,mBAAmB,EAC3BA,EAAQ,iBAAmB,KAC3BA,EAAQ,4BAA8B,KAEtC0H,EAAY,uBAAyB,KACrCA,EAAY,sBAAwB,IACrC,CAEA,MAAMsB,EAAWrI,EAAS,IAAM+G,EAAY,eAAe,EAE3D,OAAAuB,GAAU,IAAM,CACEX,GAAA,CACjB,EAEM,CACN,aAAAjB,EACA,+BAAAU,EACA,mBAAAQ,EACA,qBAAAI,EACA,eAAAI,EACA,aAAAL,EACA,iBAAAD,CAAA,CAEF,CC9NO,SAASS,IAAoB,CAKnC,SAASC,GAAsB,CAC9B,OAAOpJ,EAAoB,eAAa,OAAiB,CAACqJ,EAAKrD,IAAa,CAC3E,GAAI,OAAOA,EAAS,SAAS,MAAS,SAC/B,UAAI,MAAM,2CAA2C,EAG5D,MAAI,MAAM,KAAKA,EAAS,SAAS,IAAI,GAAOqD,EAAA,KAAKrD,EAAS,SAAS,IAAI,EAEhEqD,CACR,EAAG,CAAE,EACN,CAMA,SAASC,EAAeC,EAAsBC,EAAuB,GAAI,SAClE,MAAE,YAAAC,GAAgB3J,IAIpB,GAFa,CAAC2J,EAAY,IAAIF,CAAY,GAAK,CAACC,EAAW,SAASD,CAAY,EAE/D,OAAAA,EAEf,MAAAG,EAAMN,EAAsB,OAAMM,GAAQH,EAAa,WAAWG,CAAG,CAAC,EAI5E,GAAIA,EAAK,CACR,IAAIC,EAAS,GACTC,EAAQ,EAEZ,MAAMC,EAAYN,EAAa,MAAMG,CAAG,EAAE,IAAI,EAExCI,EAAWD,GAAA,YAAAA,EAAYA,EAAU,OAAS,GAShD,IAPIC,GAAY,OAAO,UAAU,OAAOA,CAAQ,CAAC,IAChDF,EAAQ,SAASE,EAAU,EAAE,EACdP,IAAa,MAAM,EAAG,EAAE,GAGxCI,EAASJ,EAEFE,EAAY,IAAIE,CAAM,GAAKH,EAAW,SAASG,CAAM,GAC3DA,EAASJ,EAAeK,IAGlBD,QACR,CAII,gBAAa,KAAKJ,CAAY,EAAG,CACpC,IAAII,EAAS,GACTC,EAAQ,EAENG,QAAQR,EAAa,MAAM,8BAA8B,EAE3D,KAACQ,WAAO,QACL,UAAI,MAAM,sCAAsC,EASvD,MANIA,mBAAO,SAAPA,cAAe,UAAW,KAC7BH,EAAQ,SAASG,EAAM,OAAO,OAAQ,EAAE,GAGzCJ,EAASI,EAAM,OAAO,KAEfN,EAAY,IAAIE,CAAM,GAAKH,EAAW,SAASG,CAAM,GAC3DA,EAASI,EAAM,OAAO,KAAO,IAAMH,IAG7BD,QACR,CAIA,IAAIA,EAAS,GACTC,EAAQ,EAEN,MAAAG,EAAQR,EAAa,MAAM,8BAA8B,EAE3D,KAACQ,GAAA,MAAAA,EAAO,QACL,UAAI,MAAM,sCAAsC,EASvD,MANIC,EAAAD,GAAA,YAAAA,EAAO,SAAP,YAAAC,EAAe,UAAW,KAC7BJ,EAAQ,SAASG,EAAM,OAAO,OAAQ,EAAE,GAGzCJ,EAASI,EAAM,OAAO,KAEfN,EAAY,IAAIE,CAAM,GAAKH,EAAW,SAASG,CAAM,GAClDA,EAAAI,EAAM,OAAO,KAAOH,IAGvB,OAAAD,CACR,CAEA,MAAO,CAAE,eAAAL,CAAe,CACzB,CC/EO,MAAMW,GAAUjL,EAAgB,CACtC,OAAQ,CACA,OACN,GAAGkL,GAAS,EAEd,EACA,SAAU,CACT,GAAGhL,EAAUY,EAAmBqK,EAAW,EAC3C,SAAwC,CAChC,YAAK,KAAO,KAAK,eAAe,kBAAkB,KAAK,KAAK,IAAI,EAAI,MAC5E,EACA,YAAsB,CACrB,MAAO,CAAC,CAAC,KAAK,MAAQ,OAAO,KAAK,QAAY,GAC/C,EACA,WAAY,CACP,IAAC,KAAK,SAAS,SAAW,OAAO,KAAK,SAAS,SAAY,SACvD,SAER,MAAMC,EAAcC,GAA+B,KAAK,SAAS,OAAO,EACjE,OAAAD,EACJA,EAAY,OAAQE,GAAWA,IAAWC,EAAmB,IAAI,EAAE,OAAS,EAC5E,EACJ,EACA,mBAA6B,CAC5B,MACC,CAAC,CAAC,KAAK,MACP,CAAC,KAAK,WACN,CAAC,KAAK,2BACN,CAAChE,GAA6B,SAAS,KAAK,KAAK,IAAI,CAEvD,EACA,2BAAqC,OAC7B,QAAA/D,EAAA,KAAK,WAAL,YAAAA,EAAe,QAAQ,QAAS,CACxC,CACD,EACA,QAAS,CACR,mBAAmBgI,EAAuB,CACrC,IACH,YAAK,MAAMA,CAAI,EAER,SACCC,EAAO,CACf,MAAMC,EAAQ,KAAK,QAAQ,SAAS,2BAA2B,EAEzDC,EAAW,IAAI,OAAO,gCAAiC,GAAG,EAC1DC,EAAUH,EAAM,QAAQ,QAAQE,EAAU,EAAE,EAAE,OAC9CE,EAAqB,oBACrBC,EAAgBL,EAAM,QAAQ,MAAMI,CAAkB,EAQ5D,GANMJ,EAAA,QAAUG,EAAQ,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAQ,MAAM,CAAC,EAC3DH,EAAA,QAAUA,EAAM,QAAQ,QAC7B,6BACA,KAAK,QAAQ,SAAS,uCAAuC,GAG1DK,EAAe,CAClB,MAAMtJ,EAAW,SAASsJ,EAAc,CAAC,EAAG,EAAE,EACxCC,GAA0BP,EAAK,MAAM,EAAGhJ,CAAQ,EAAE,MAAM,KAAK,GAAK,IAAI,OAEtEiJ,EAAA,QAAUA,EAAM,QAAQ,QAC7BI,EACA,KAAK,QAAQ,SAAS,uCAAwC,CAC7D,YAAa,CACZ,SAAU,GAAGrJ,CAAQ,EACtB,EACA,GAGFiJ,EAAM,QAAU,GAAG,KAAK,QAAQ,SAAS,mCAAoC,CAC5E,YAAa,CACZ,KAAM,GAAGM,EAAyB,CAAC,EACpC,CACA,EAAC,IAAIN,EAAM,OAAO,EACpB,CAEK,sBAAUA,EAAOC,CAAK,EAEpB,EACR,CACD,EACA,mBAAmBF,EAAuBQ,EAAiC,CACtE,OAAOR,GAAS,WAAiBA,EAAA,KAAK,UAAUA,CAAI,GAElD,MAAE,QAASS,EAAgB,GAAGC,CAAa,OAAK,eAAe,qBAC/DC,EAAeC,GAAcF,EAAU,CAAE,oBAAqB,GAAM,EAEpEG,EAAa,CAAE,GAAGJ,EAAgB,CAACD,CAAc,EAAGR,CAAK,EACzDc,EAAiB,KAAK,eAAe,eAAeD,CAAU,EAEpE,OAAIC,EAAiBC,IACf,eACJ,IAAI,MAAM,KAAK,QAAQ,SAAS,wCAAwC,CAAC,EACzE,KAAK,QAAQ,SAAS,kCAAkC,GAGlD,IAIPC,GAAkBL,CAAY,EAAIG,EAClCG,GAAoBC,IAEf,eACJ,IAAI,MAAM,KAAK,QAAQ,SAAS,gDAAgD,CAAC,EACjF,KAAK,QAAQ,SAAS,0CAA0C,GAG1D,IAGD,EACR,EACA,WAAW5K,EAAe0J,EAAqCmB,EAAgC,CAC1F,UAAOnB,GAAS,SAAU,CAC7B,GAAI,CAAC,KAAK,mBAAmBA,CAAI,EAChC,WAAK,mBAAmB,CAAE,UAAW,eAAgB,OAAAmB,CAAQ,GACvD,IAAI,MAAM,cAAc,EAG/BnB,EAAOoB,GAAUpB,CAAI,CACtB,CAEA,GAAI,CAAC,KAAK,mBAAmBA,EAAM1J,EAAK,IAAI,EAC3C,WAAK,mBAAmB,CAAE,UAAW,iBAAkB,OAAA6K,CAAQ,GACzD,IAAI,MAAM,gBAAgB,EAG5B,0BAAqB,CAAE,OAAAA,CAAA,CAAQ,EACpC,KAAK,eAAe,QAAQ,CAAE,KAAA7K,EAAM,KAAA0J,CAAoC,EACzE,EACA,aAAa1J,EAAe6K,EAA+B,CACrD,qBAAgB,CAAE,OAAAA,CAAA,CAAQ,EAC/B,KAAK,eAAe,UAAU,CAAE,KAAA7K,CAAM,EACvC,EACA,qBAAqB,CAAE,OAAA6K,GAAqC,OAC3D,MAAME,EAAmB,CACxB,eAAgBF,EAChB,WAAWnJ,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,WAAY,KAAK,UACjB,UAAWgJ,GAAkB,KAAK,OAAO,EACzC,KAAM,KAAK,YACX,UAAW,KAAK,UAEZM,GAAiB,EAAE,IAAI,+BAAgCD,CAAgB,EACvE,gBAAW,MAAM,2BAA4BA,CAAgB,CACnE,EACA,mBAAmB,CAClB,UAAAE,EACA,OAAAJ,CAAA,EAIE,OACG,gBAAW,MAAM,2BAA4B,CACjD,eAAgBA,EAChB,WAAWnJ,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,WAAY,KAAK,UACjB,UAAWgJ,GAAkB,KAAK,OAAO,EACzC,KAAM,KAAK,YACX,UAAW,KAAK,SAChB,WAAYO,CAAA,CACZ,CACF,EACA,gBAAgB,CACf,OAAAJ,CAAA,EAGE,OACG,gBAAW,MAAM,yBAA0B,CAC/C,WAAWnJ,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,WAAY,KAAK,UACjB,UAAW,KAAK,SAChB,OAAAmJ,EACA,UAAWH,GAAkB,KAAK,OAAO,EACzC,CACF,CACD,CACD,CAAC,EChKDQ,GAAehN,EAAgB,CAC9B,KAAM,YACN,WAAY,CACX,SAAAiN,EACD,EACA,MAAO,CACN,WAAY,CACX,KAAM,OACN,QAAS,EACV,EACA,SAAU,CAAC,EACX,SAAU,CACT,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACC,OACN,SAAU,GACV,QAAS,GAEX,EACA,SAAU,CACT,UAAoB,CACnB,MAAO,CAAC,KAAK,UAAY,SAAW,OAAO,MAC5C,CACD,EACA,QAAS,CACR,MAAM,QAAS,CACd,KAAK,QAAU,KAAK,WACpB,KAAK,SAAW,GAChB,MAAM,KAAK,YACL,MAAAC,EAAW,KAAK,MAAM,MACxBA,GACHA,EAAS,MAAM,CAEjB,EACA,UAAW,CACN,KAAK,QAAQ,KAAK,IAAM,IAC3B,KAAK,MAAM,oBAAqB,KAAK,QAAQ,MAAM,EAGpD,KAAK,SAAW,EACjB,CACD,CACD,CAAC,ycAzFAC,EAqCO,eArCyB,OAAAC,EAAA,EAAmCC,EAAA,QAAE,MAAKC,EAAAC,EAAA,wDACzE,QAAqFC,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,QAAAA,EAAA,UAAAE,CAAA,eAAnD,MAA4CH,EAAAC,EAAA,sBAAJG,EAAAC,EAAA,UAAAJ,EAAA,gBAmC5D,sBAlCD,KAAAG,EAAwBE,EAAK,CAAE,UAAS,QAAW,oBAAAL,EAAA,SA0BpD,SAAS,CAAAA,EAAA,WACR,UAAAM,EAAA,KAAAC,EAAA,OACP,MAAAR,EAAA,EAAAC,EAAA,iBAAU,CAAGA,EAChB,kBAAAA,EAAA,aAAWQ,EAAAC,EAAET,EAAO,UAAiB,SAAAO,EAAA,aACgCR,EAAQC,EAAA,4BAAnDA,EAAA,UAAAH,IAAAa,EAAEC,EAAe,CAAE,IAAI,QAAAZ,EAAAC,EAAA,0EA5B5C,QAAAM,EAAA,KACEC,EAAA,aAAAR,EAAAC,EAAA,wDAEMA,EAAQ,UAAAA,EAAA,YAAAE,CAAA,cAAAD,EAAA,KAAAA,EAAA,GAAAW,GAAA,2DAEtB,MAA6BC,EAAW,CAAC,KAAI,qGAG7C,QAA4BC,EAAO,0BAAmB,WAAad,EAAA,8BAAAC,EAAA,KAAAA,EAAA,GAAAc,GAAAf,EAAA,QAAAe,GACnE,oCAAM,KAAK,EAAE,gBAAAR,EAAA,OACZ,MAKER,EAAAC,EAAA,wBAHIgB,EAAO,CACX,iBACA,KAAK,gBAAAf,EAAA,KAAAA,EAAA,GAAAc,GAAAf,EAAA,aAEP,MAKEA,EAAA,sCAJD,KAAK,EAAS,WAAAG,EACTa,EAAO,CACX,eACA,KAAK,gBAAAhB,EAAA,mMCCZiB,GAAexO,EAAgB,CAC9B,KAAM,mBACN,MAAO,CACN,WAAY,CACX,KAAM,OACN,QAAS,EACV,EACA,SAAU,CAAC,EACX,UAAW,CACV,KAAM,MACP,CACD,EACA,OAAQ,CAEA,OACN,cAFqB8M,IAErB,CAEF,EACA,SAAU,CACT,GAAG5M,EAAUiL,GAAarK,CAAiB,EAC3C,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,kBAA2B,aAC1B,MAAMkG,EAAW,KAAK,SAEtB,GAAI,CAACA,EACG,SAGR,GAAIA,EAAS,kBAAoBA,EAAS,iBAAiB,WAAW,MAAM,EAC3E,OAAOA,EAAS,iBAGX,MAAAyH,EACL,mFAEAzH,EAAS,KAGJ0H,GAAgBC,GAAAC,GAAA5D,GAAAxH,EAAAwD,EAAS,QAAT,YAAAxD,EAAgB,YAAhB,YAAAwH,EAA2B,uBAA3B,YAAA4D,EAAkD,KAAlD,YAAAD,EAAsD,IAC5E,OAAID,EACIA,EAAgBD,EAGpB,KAAK,gBACD,GAAGI,EAAyB,GAAG7H,EAAS,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,GAI3D8H,GAAyBL,CACjC,EACA,iBAA2B,CAC1B,MAAMzH,EAAW,KAAK,SACtB,OAAIA,EACI+H,GAAuB/H,EAAS,IAAI,EAErC,EACR,EACA,aAAsB,CAErB,OADiB,KAAK,SACN,KAAK,MAAM,GAAG,EAAE,CAAC,CAClC,EACA,SAAkB,CACjB,MAAMgI,EAAkB,CACvB,CACC,MAAO,KAAK,QAAQ,SAAS,yBAAyB,EACtD,MAAO,QACR,GAEG,KAAK,kBACRA,EAAQ,KAAK,CACZ,MAAO,KAAK,QAAQ,SAAS,mBAAmB,EAChD,MAAO,OACP,KAAM,KAAK,iBACX,EAEE,KAAK,iBACRA,EAAQ,KAAK,CACZ,KAAM,OACN,MAAO,gBACP,MAAO,QACP,QAAS,KAAK,QAAQ,SAAS,gCAAiC,CAC/D,YAAa,CACZ,OAAQC,GACR,YAAa,KAAK,WACnB,EACA,EACD,EAGI,MAAAC,EAAe,MAAK,gBAC1B,OAAAF,EAAQ,KAAK,CACZ,KAAM,MACN,MAAO,WACP,MAAOE,EAAe,QAAU,OAChC,EAEMF,CACR,CACD,EACA,QAAS,CACR,YAAYG,EAAa,CACpBA,IAAQ,QAAU,KAAK,WACrB,KAAK,cAAc,IAAI,sCAAuC,CAClE,SAAU,KAAK,SACf,iBAAkB,KAAK,iBACvB,EACI,gBAAW,MAAM,wBAAyB,CAC9C,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAM5D,EAAmB,KACzB,KAAM,OACN,GAGE4D,IAAQ,YAAc,KAAK,UACzB,gBAAW,MAAM,4BAA6B,CAClD,UAAY,KAAK,SAAkC,KACnD,YAAa,KAAK,eAAe,WACjC,GAGEA,IAAQ,YAAcA,IAAQ,WAC5B,WAAM,oBAAqBA,CAAG,CAErC,EACA,eAAeA,EAAaxH,EAAmB,CAC1CwH,IAAQ,iBAAoBxH,EAAM,OAAmB,YAAc,KACtE,KAAK,WAAW,MAAM,6BAA8B,CAAE,OAAQ,oBAAqB,CAErF,CACD,CACD,CAAC,mCA/JAwF,EAKE,YAHA,OAAAC,EAAA,EAAsBa,EAAAmB,EAAA,CACtB,QAAA7B,EAAA,QACA,WAAcA,EAAA,iCAAAA,EAAA,oJCkEjB8B,GAAerP,EAAgB,CAC9B,KAAM,eACN,OAAQ,CAACsP,GAAWC,EAAe,EACnC,MAAO,CACN,OACA,UACD,EACA,OAAQ,CACA,OACN,GAAGrE,GAAS,EAEd,EACA,MAAO,CACC,OACN,YAAa,KAAK,UAAY,CAACsE,GAAkC,SAAS,KAAK,SAAS,IAAI,EAC5F,WAAY,OAEd,EACA,SAAU,CACT,cAAsC,CACrC,OAAI,KAAK,WAAa,MAAQ,KAAK,SAAS,WAAa,OACjD,GAGA,KAAK,SAAkC,SAAU,OACvDC,GAAgBA,EAAY,iBAAmB,GAElD,EACA,UAAW,CAEV,OADiB,KAAK,SAAS,KACb,CACjB,KAAKC,GACG,OACN,YAAa,KAAK,QAAQ,SAAS,sCAAsC,EACzE,eAAgB,KAAK,QAAQ,SAC5B,oDACD,EACA,YAAa,KAAK,QAAQ,SAAS,iDAAiD,EACpF,YAAa,KAAK,QAAQ,SAAS,iDAAiD,EACpF,QAAS,KAAK,QAAQ,SAAS,sBAAsB,EACrD,cAAe,KAAK,QAAQ,SAAS,4BAA4B,EACjE,UAAW,KAAK,QAAQ,SAAS,4CAA4C,EAC7E,YAAa,KAAK,QAAQ,SAAS,8CAA8C,GAGnF,QACQ,OACN,YAAa,KAAK,QAAQ,SAAS,0BAA0B,EAC7D,eAAgB,KAAK,QAAQ,SAAS,wCAAwC,EAC9E,YAAa,KAAK,QAAQ,SAAS,qCAAqC,EACxE,YAAa,KAAK,QAAQ,SAAS,qCAAqC,EACxE,QAAS,KAAK,QAAQ,SAAS,sBAAsB,EACrD,cAAe,KAAK,QAAQ,SAAS,4BAA4B,EACjE,UAAW,KAAK,QAAQ,SAAS,gCAAgC,EACjE,YAAa,OAEhB,CACD,CACD,EACA,QAAS,CACR,eAAeD,EAAwC,CAChD,MAAAE,EAAa,KAAK,qBAAqBF,CAAW,EACxD,KAAK,gBAAgBE,CAAU,EAE/B,KAAK,YAAY,CAChB,MAAO,KAAK,SAAS,UACrB,QAAS,KAAK,SAAS,YACvB,KAAM,UACN,EACI,gBAAW,MAAM,0BAA2B,CAChD,KAAM,aACN,KAAM,GAAG,KAAK,UAAU,OACxB,CACF,EACA,qBAAqBF,EAA0C,CAC9D,OAAI,KAAK,KACD,KAAK,cAAcA,EAAa,KAAK,KAAM,KAAK,UAAU,EAE3D,EACR,CACD,EACA,MAAO,CACN,MAAO,CACN,KAAK,YAAc,CAACD,GAAkC,SAAS,KAAK,SAAS,IAAI,CAClF,CACD,CACD,CAAC,6CA5JgCI,GAAgB,sCAWzCC,GAAM,yDAyB0BC,GAAM,wDAMnCC,GAAA,OAAM,qHAMAC,GAAM,iPAhDQC,EAAA9C,EAAA,iCAC7BI,EAQM,qBAAAH,EAAA,IAPC,MAAoBwC,GAAA,CAEpB9B,EAAA,OACL,MAAOR,EAAW,CAAY,+BAAiB,CAASC,EAAA,uBAAAC,EAAA,KAAAA,EAAA,GAAAc,GAAAf,EAAA,aAAAA,EAAA,aAEzD,MAA8EA,EAAA,YAAAA,EAAA,wBAAAA,EAAA,yBAAlCW,EAA+B,4DAG5EH,EA+CyB,IAAAC,EAAAT,EAAA,6BAAA2C,EAAA,IA9CUD,EAAW,MAA7C,QAAApC,EAAA,KAAAN,EACC,wBAcU,EAAAF,EAAA,MAAAwC,GAAA,CADC/B,EAAA,MAAAqC,GAAA,CAAAzC,EAXT0C,EAWS,KAXA,CAUN,QAAAvC,EAAA,KAAAH,EATF2C,EASE,WARQ,QAAAxC,EAAA,KAAAH,EAAA4C,EAAA,CACR,WAAO/C,EAAA,WAAsB,sBAAgBC,EAAA,KAAAA,EAAA,GAAAc,GAAAf,EAAA,WAAAe,GAAA,SAA+C,OAAAf,EAAA,SAAS,QAAa,0HAchH,EAAK,EAAAF,EAAAkD,EAAA,KAAAC,GAAAjD,EAAA,oBAAAkD,GAAA,CAAAA,EAAA,aAAAA,EAAA7F,KACNwC,EAAO,EAAAa,EAAAyC,EAAA,CACX,IAAA9F,EACD,qBAAA2C,EAAA,wCAEA,QAAAM,EAAA,KAAA4C,EACC,iBAeO,EAAApD,EAAA,MAAA2C,GAAA,CAFKlC,EAAA,MAAA6C,GAAA,CAAA7C,EAA4C,MAAE,6CACrD,QAAAQ,GAAAf,EAAA,eAAAkD,CAAA,GAAgC,CAAA1C,EAAAC,EAAAT,EAAA,qBAAAkD,CAAA,wBAX9B,EAAApD,EAAA,MAAAyC,GAAA,CADFhC,EAAA,MAAA8C,GAAA,CAAyD9C,EAAA,MAAAiC,GAAA,CAAAhC,EAAAC,EAAAT,EAAA,0BAAAkD,EAAA,oBAG9D,KACY3C,EAAA,MAAA+C,GAAA,CAAA/C,EAA4C,MAAE,6CACrD,QAAAQ,GAAAf,EAAA,eAAAkD,CAAA,GAAgC,CAAA1C,EAAAC,EAAAT,EAAA,qBAAAkD,CAAA,4ICF3CK,GAAe9Q,EAAgB,CAC9B,aAAc,GACd,OAAQ,CAAC+Q,GAAa9F,EAAO,EAC7B,MAAO,CACN,SAAU,CACT,KAAM,MACP,EACA,SAAU,CACT,KAAM,QACN,QAAS,EACV,EACA,MAAO,CACN,KAAM,MACP,EACA,KAAM,CACL,KAAM,MACP,EACA,KAAM,CACL,KAAM,MACP,EACA,YAAa,CACZ,KAAM,QACN,QAAS,EACV,EACA,gBAAiB,CAChB,KAAM,MACP,CACD,EACA,MAAM+F,EAAOC,EAAK,SAGV,OACN,cAHqBnE,KAIrB,GAAG5B,GAAS,EACZ,GAAGgG,GAAW,EAEd,IAAGlG,GAAAxH,EAAAuN,IAAY,QAAZ,YAAA/F,EAAA,KAAAxH,EAAoBwN,EAAOC,EAAG,CAEnC,EACA,SAAU,CACT,GAAG/Q,EAAUc,EAAmBmK,GAAarK,CAAiB,EAC9D,MAAuB,CACtB,OAAO,KAAK,eAAe,cAAc,KAAK,QAAQ,CACvD,EACA,UAAwC,CACvC,OAAI,KAAK,KACD,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,EAEtE,IACR,EACA,aAAuB,CAChB,MAAAqQ,EAAgB,KAAK,eAAe,aAEzC,YAAK,kBACJ,KAAK,eAAe,gBAAgB,KAAK,KAAK,IAAI,GAAKA,IAAkB,KAAK,KAAK,KAEtF,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,eAAyB,CACpB,OAAC,KAAK,KAGH,KAAK,eAAe,cAAc,KAAK,KAAK,IAAI,EAF/C,EAGT,EACA,qBAA+B,CAC9B,MAAO,GAAQ,KAAK,UAAY,KAAK,SAAS,OAASC,GACxD,EACA,mBAA6B,CAC5B,MAAO,GAAQ,KAAK,UAAY,KAAK,SAAS,OAAS1B,GACxD,EACA,mBAA6B,OACrB,OAAC,GAAClM,EAAA,KAAK,WAAL,MAAAA,EAAe,QACzB,EACA,mBAA6B,OAC5B,MAAO,CAAC,GAACA,EAAA,KAAK,WAAL,MAAAA,EAAe,MAAM,SAAS,YACxC,EACA,eAAyB,CACxB,MAAO,GAAQ,KAAK,UAAY,KAAK,SAAS,OAAS6N,GACxD,EACA,sBAAgC,CACzB,MAAAC,EAAmB,KAAK,eAAe,2BACvCC,EAAe,KAAK,eAAe,aAEzC,OACC,KAAK,MACL,CAAC,KAAK,KAAK,UACX,KAAK,eACLD,IACC,CAACC,GAAgBA,IAAiB,KAAK,SAE1C,EACA,8BAAwC,CAEtC,YAAK,aACL,KAAK,eACL,CAAC,KAAK,mBACN,CAAC,KAAK,mBAER,EACA,WAAqB,OACb,UACN/N,EAAA,KAAK,OAAL,MAAAA,EAAW,SAAW,KAAK,KAAK,OAAO,YAAc,KAAK,KAAK,OAAO,aAExE,EACA,cAAuB,CACtB,GAAI,KAAK,qBACD,SAGR,GAAI,KAAK,eAAiB,KAAK,KAAK,SAC5B,YAAK,QAAQ,SAAS,4BAA4B,EAGtD,QAAK,eAAiB,KAAK,UAAW,CACnC,MAAAgO,EAAa,KAAK,SAAS,WACjC,OAAIA,GAAcA,EAAW,OAAS,KAAK,SACnC,KAAK,QAAQ,SAAS,yBAAyB,EAGhD,KAAK,QAAQ,SAAS,mCAAmC,CACjE,CAEA,OAAI,KAAK,iBAAmB,CAAC,KAAK,YAC1B,KAAK,QAAQ,SAAS,oCAAoC,EAG3D,EACR,EACA,aAAsB,OACjB,YAAK,sBAAwB,KAAK,6BAC9B,KAAK,QAAQ,SAAS,2BAA2B,EAGrD,KAAK,MACD,KAAK,MAGT,KAAK,cACD,KAAK,QAAQ,SAAS,gCAAgC,EAG1D,KAAK,kBACD,KAAK,QAAQ,SAAS,sBAAsB,EAGhD,KAAK,oBAAqBhO,EAAA,KAAK,WAAL,MAAAA,EAAe,oBACrC,KAAK,QAAQ,SAAS,wBAAwB,EAIrD,KAAK,eACL,CAAC,KAAK,mBACN,CAAC,KAAK,qBACN,CAAC,KAAK,kBAEC,KAAK,QAAQ,SAAS,4BAA4B,EAGnD,KAAK,QAAQ,SAAS,yBAAyB,CACvD,CACD,EACA,QAAS,CACR,MAAM,uBAAwB,CACzB,IACH,MAAM,KAAK,eAAe,kBAAkB,KAAK,eAAe,UAAU,QAClEiI,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,yCAAyC,CAAC,EACtF,MACD,CACD,EAEA,MAAM,SAAU,CACf,GAAI,KAAK,qBACR,MAAM,KAAK,gCACD,KAAK,6BACf,KAAK,MAAM,eAAe,MACpB,CACN,IAAIgG,EAAwB,GAiBxB,GAhBA,KAAK,aASRA,EARsB,MAAM,KAAK,QAChC,KAAK,QAAQ,SAAS,yCAAyC,EAC/D,KAAK,QAAQ,SAAS,mCAAmC,EACzD,CACC,kBAAmB,KAAK,QAAQ,SAAS,qCAAqC,EAC9E,iBAAkB,KAAK,QAAQ,SAAS,oCAAoC,CAC7E,KAEyCC,GAEtCD,GAAyB,KAAK,MAC5B,kBAAa,KAAK,KAAM,yBAAyB,GAIpD,CAAC,KAAK,YAAcA,EAAuB,CAC9C,MAAM5E,EAAmB,CACxB,UAAW,KAAK,SAAW,KAAK,SAAS,KAAO,KAChD,YAAa,KAAK,eAAe,WACjC,OAAQ,KAAK,gBACb,WAAY,KAAK,SAAS,WAEtB,gBAAW,MAAM,mCAAoCA,CAAgB,EAC1E,MAAM,KAAK,cAAc,IAAI,4BAA6BA,CAAgB,EAE1E,MAAM,KAAK,YAAY,CACtB,gBAAiB,KAAK,SACtB,OAAQ,4BACR,EACD,KAAK,MAAM,SAAS,CACrB,CACD,CACD,CACD,CACD,CAAC,qDAjQAM,EAmBM,eAlBQ,OAAAC,EAAkB,EAAAC,EAAA,YAAAK,EAAagD,EAAY,oBAC5C,SAAO,CAAAnD,EAAA,8BAeZO,EAAA,WAAAE,EAAAT,EAAA,2BAXLM,EAUE,KAAAC,EARS,MAAW,MAAAJ,EACVa,EAAcoD,GAAYpE,EAAA,QACpC,QAAOA,EAAW,cAAAA,EAAA,uBAAAA,EAAA,6BAClB,SAAMA,EAAI,YAAAA,EAAA,aACV,MAAMA,EAAA,YACN,KAAMA,EAAA,KACN,KAAAA,EAAA,KACA,OAAO,mBAAO,8BAAAA,EAAA,yLCyMpBqE,GAAe5R,EAAgB,CAC9B,KAAM,eACN,WAAY,CACX,UAAA6R,GACA,gBAAAC,GACA,mBAAAC,GACA,iBAAAC,GACA,aAAAC,GACA,kBAAAC,EACD,EACA,OAAQ,CACP,MAAMC,EAAcC,KAGb,OACN,cAHqBtF,KAIrB,YAAAqF,CAAA,CAEF,EACA,SAAU,CACT,GAAGjS,EACFiB,GACAH,EACAmK,GACAhL,GACAkS,GACAvR,EACAwR,EACD,EACA,uBAAiC,CACzB,YAAK,QAAQ,YAAYC,EAAqB,CACtD,EACA,YAAsB,CACd,YAAK,UAAY,KAAK,oBAC9B,EACA,cAAwB,CACnB,QAAK,UAAY,KAAK,KAAM,CACzB,MAAArG,EAAW,KAAK,eAAe,mBAAmB,EAClDsG,EAAetG,EAAS,QAAQ,KAAK,KAAK,IAAI,EAC9CuG,EAASC,GAA0BxG,EAAUsG,EAAe,KAAK,QAAQ,EAG3E,IAFenH,GAA+BoH,CAAM,EAExC,SAASlH,EAAmB,IAAI,GAAK,CAAC,KAAK,cACnD,QAET,CAEO,YAAK,YAAc,KAAK,oBAChC,EACA,cAAuB,CACtB,GAAI,KAAK,SAAU,CAClB,MAAMoH,EAAgB,KAAK,QAAQ,cAAc,KAAK,SAAS,IAAI,EAE5D,YAAK,QAAQ,WAAW,CAC9B,IAAK,WAAWA,CAAa,eAC7B,SAAU,KAAK,SAAS,KACxB,CACF,CAEO,QACR,EACA,kBAA6B,CAC5B,OAAK,KAAK,KACH,KAAK,eAAe,gBAAgB,KAAK,KAAK,IAAI,EADlC,EAExB,EACA,eAAwB,CACvB,OAAO,KAAK,IAAI,GAAG,KAAK,gBAAgB,CACzC,EACA,qBAA+B,OACvB,YAAK,kBAAkBnP,EAAA,KAAK,OAAL,YAAAA,EAAW,YAC1C,EACA,gBAAyB,CACxB,MAAI,CAAC,KAAK,UAAY,KAAK,SAAS,OAC5B,KAAK,QAAQ,SAAS,yBAAyB,EAGnD,KAAK,oBACD,KAAK,QAAQ,SAAS,qBAAqB,EAG5C,KAAK,QAAQ,SAAS,6BAA8B,CAC1D,YAAa,CAAE,QAAS,KAAK,cAAc,UAAW,EACtD,CACF,EACA,qBAA8B,OACzB,IAAAA,EAAA,KAAK,WAAL,MAAAA,EAAe,YAAa,CAC/B,MAAMmP,EAAgB,KAAK,QAAQ,cAAc,KAAK,SAAS,IAAI,EAE5D,YAAK,QAAQ,WAAW,CAC9B,IAAK,WAAWA,CAAa,eAC7B,SAAU,KAAK,SAAS,YACxB,MAEM,aAAK,QAAQ,SAAS,iCAAiC,CAEhE,EACA,aAAsB,CACjB,OAAC,KAAK,KAIH,CACN,mBAAoB,KAAK,KAAK,OAJvB,EAMT,EACA,MAAuB,CACtB,OAAO,KAAK,SAAS,UACtB,EACA,mBAAuC,CACtC,OAAO,KAAK,WAAW,OAAQC,GACvBA,EAAK,aACZ,CACF,EACA,uBAA2C,CAC1C,OAAO,KAAK,WAAW,OAAQA,GACvB,CAACA,EAAK,aACb,CACF,EACA,YAAgC,CAC3B,YAAK,WAAa,KACd,GAGD,KAAK,SAAS,UACtB,EACA,qBAA2D,CAC1D,OAAO,KAAK,SAAS,mBACtB,EACA,iBAA2B,OACnB,OAAA7D,IAAuBvL,EAAA,KAAK,OAAL,YAAAA,EAAW,IAAI,CAC9C,EACA,eAAyB,OACxB,OAAO,KAAK,eAAe,eAAcA,EAAA,KAAK,OAAL,YAAAA,EAAW,IAAI,CACzD,EACA,mBAA4B,CAC3B,OAAO,KAAK,iBAAiB,qBAAqB,GAAG,KAAK,eAAe,UAAU,EAAE,CACtF,EACA,sBAAgC,CACxB,YAAK,mBAAmB,OAAS,CACzC,EACA,iBAAqC,CAC7B,cAAO,OAAO,KAAK,eAAe,eAAe,EAAE,OAAQqP,GAAe,OACzE,cAAO,SAAOrP,EAAA,KAAK,OAAL,YAAAA,EAAW,cAAe,EAAE,EAAE,KAAMsP,GACjDA,EAAe,KAAOD,EAAW,EACxC,EACD,CACF,EACA,qBAA8B,CACvB,MAAAA,EAAa,KAAK,gBACrB,OAAO,OAAO,KAAK,eAAe,EAAE,KAAMA,GACnCA,EAAW,KAAO,KAAK,mBAAmB,CAAC,CACjD,EACD,OAEI,YAAK,iBAAiB,uBAAuBA,CAAU,CAC/D,CACD,EACA,MAAO,CACN,SAAU,CACT,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACP,EACA,UAAW,CACV,KAAM,MACP,EACA,SAAU,CACT,KAAM,MACP,EACA,SAAU,CACT,KAAM,QACN,QAAS,EACV,EACA,mBAAoB,CACnB,KAAM,MACN,QAAS,IAAM,CAAC,CACjB,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,WAAY,CACX,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACC,OACN,UAAW,GACX,UAAW,KACX,UAAW,SACX,WAAY,CACX,MAAO,UACP,iBAAkB,GAClB,YAAa,GACb,YAAa,GACb,QAAS,eACT,YAAa,GACb,SAAU,EACV,iBAAkB,IAClB,MAAO,GACP,WAAY,CAAC,CACd,EACA,sBAAuB,GAEvB,aAAc,CAAC,EACf,sCAAA5D,GACA,sBAAA8D,GACA,sBAAAC,GACA,mBAAoB,CAAC,EAEvB,EACA,MAAO,CACN,KAAKC,EAASC,EAAS,CACtB,KAAK,cAAc,CACpB,EACA,sBAAsBC,EAAUC,EAAU,CACzC,GAAID,IAAa,GAAO,CACnB,IAAAE,EAAa,KAAK,QAAQ,uBAAyB,GAEvD,GAAI,CAACA,EAAY,OAEb,IACUA,EAAA,KAAK,MAAMA,CAAU,EAKlC,KAAK,aAAa,CACjB,KAAM,KAAK,KAAK,KAChB,KAAM,aACN,MAAOA,CAAA,CACP,EAED,KAAK,QAAQ,sBAAsB,CAAE,KAAMd,GAAuB,WAAY,GAAI,OAC3E,CAAC,CACV,CACD,CACD,EACA,QAAS,CACR,yBAA0B,CACrB,CAAC,KAAK,MAAQ,CAAC,KAAK,eAAe,eAAe,KAAK,KAAK,IAAI,IAE/D,wBAAmB,KAAK,aAAa,EACrC,2BAAsB,QAASe,GAAc,CAC5C,wBAAmB,KAAKA,EAAU,IAAI,EAC3C,EAED,KAAK,eAAe,gBAAgB,KAAK,KAAK,KAAM,EAAK,EAC1D,EACA,kBAAmB,CACd,KAAK,cAAgB,CAAC,KAAK,eAC9B,KAAK,aAAa,KAEhB,CACC,YAAa,KAAK,QAAQ,SAAS,2CAA2C,EAC9E,KAAM,mBACN,KAAM,UACN,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,2CAA2C,CAC/E,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,sCAAsC,EACzE,KAAM,cACN,KAAM,UACN,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,sCAAsC,CAC1E,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,sCAAsC,EACzE,KAAM,cACN,KAAM,UACN,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,sCAAsC,CAC1E,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,mCAAmC,EACtE,KAAM,WACN,KAAM,SACN,YAAa,CACZ,SAAU,EACV,SAAU,CACX,EACA,QAAS,EACT,eAAgB,CACf,KAAM,CACL,YAAa,CAAC,EAAI,CACnB,CACD,EACA,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,mCAAmC,CACvE,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,2CAA2C,EAC9E,KAAM,mBACN,KAAM,SACN,YAAa,CACZ,SAAU,EACV,SAAU,GACX,EACA,QAAS,IACT,eAAgB,CACf,KAAM,CACL,YAAa,CAAC,EAAI,CACnB,CACD,EACA,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,2CAA2C,CAC/E,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,kCAAkC,EACrE,KAAM,UACN,KAAM,UACN,QAAS,CACR,CACC,KAAM,KAAK,QAAQ,SAClB,uDACD,EACA,MAAO,eACP,YAAa,KAAK,QAAQ,SACzB,uDACD,CACD,EACA,CACC,KAAM,KAAK,QAAQ,SAClB,gEACD,EACA,MAAO,wBACP,YAAa,KAAK,QAAQ,SACzB,gEACD,CACD,EACA,CACC,KAAM,KAAK,QAAQ,SAClB,8DACD,EACA,MAAO,sBACP,YAAa,KAAK,QAAQ,SACzB,8DACD,CACD,CACD,EACA,QAAS,eACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,kCAAkC,CACtE,CACD,EAGF,KAAK,aAAa,KAEhB,CACC,YAAa,KAAK,QAAQ,SAAS,gCAAgC,EACnE,KAAM,QACN,KAAM,SACN,YAAa,CACZ,KAAM,CACP,EACA,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,gCAAgC,CACpE,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,sCAAsC,EACzE,KAAM,cACN,KAAM,UACN,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,sCAAsC,CAC1E,CACD,CAEF,EACA,gBAAgBC,EAAuB,CACtC,KAAK,mBAAqB,KAAK,mBAAmB,OAAQC,GAASA,IAASD,CAAa,CAC1F,EACA,oBAAqB,CACpB,KAAK,mBAAqB,GAC1B,KAAK,MAAM,UAAU,CACtB,EACA,eAAgB,CACf,KAAK,mBAAqB,GAC1B,KAAK,MAAM,SAAS,CACrB,EACA,SAASC,EAAcC,EAA2B,CAC3C,MAAAC,EAAYF,EAAK,MAAM,GAAG,EAC5B,IAAAG,EAAmCD,EAAU,MAE7CE,EAAU,GACd,GAAID,IAAiB,QAAaA,EAAa,SAAS,GAAG,EAAG,CAEvD,MAAAE,EAAgBF,EAAa,MAAM,gBAAgB,EACrDE,IACOH,EAAA,KAAKG,EAAc,CAAC,CAAC,EAC/BF,EAAeE,EAAc,CAAC,EACpBD,EAAA,GAEZ,CAGI,GAAAF,EAAU,SAAW,EAExB,GAAID,IAAU,KAAM,CAEb,MAAE,CAACE,CAAY,EAAGG,EAAkB,GAAGC,GAAwB,KAAK,WAC1E,KAAK,WAAaA,CAAA,MAGlB,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,CAACJ,CAAsB,EAAGF,CAAA,UAKxBA,IAAU,KAAM,CAEnB,IAAIO,EAAYC,GAAI,KAAK,WAAYP,EAAU,KAAK,GAAG,CAAC,EAIxD,KAAM,CAAE,CAACC,CAAY,EAAGG,EAAkB,GAAGC,GAAwBC,EAGjE,GAFQA,EAAAD,EAERH,GAAYI,EAAgC,SAAW,EAAG,CAG7DL,EAAeD,EAAU,MACzBM,EAAYC,GAAI,KAAK,WAAYP,EAAU,KAAK,GAAG,CAAC,EACpD,KAAM,CAAE,CAACC,CAAY,EAAGO,EAAuB,GAAGC,GACjDH,EACWA,EAAAG,CACb,OAGI,OAAOV,GAAU,SACpBW,GACCH,GAAI,KAAK,WAAYP,EAAU,KAAK,GAAG,CAAC,EACxCC,EACAU,GAASZ,CAAK,GAGfW,GACCH,GAAI,KAAK,WAAYP,EAAU,KAAK,GAAG,CAAC,EACxCC,EACAF,CAAA,EAMJ,KAAK,WAAa,CAAE,GAAG,KAAK,UAAW,CACxC,EACA,mBAAmB9N,EAAqD,CAElE,oBAAe,qBAAqBA,CAAiB,EAE1D,MAAM7D,EAAO,KAAK,eAAe,cAAc6D,EAAkB,IAAI,EAEjE7D,GAEE,iBAAY,2BAA2BA,CAAI,EAG5C,KAAK,cAAc,IAAI,kCAAmC,CAAE,kBAAA6D,EAAmB,CACrF,EACA,YAAY6N,EAAc,CACrB,KAAK,MACH,kBAAa,kBAAkB,IAAIc,GAAkB,KAAK,KAAK,KAAMd,CAAI,CAAC,EAGhF,KAAK,aAAa,CACjB,MAAOA,EACP,KAAM,OACN,CACF,EACA,aAAae,EAAmC,OAC3C,IAAApB,EAEAoB,EAAc,eAAe,OAAO,EAEvCpB,EAAWoB,EAAc,MAGzBpB,EAAWc,GAAI,KAAK,WAAYM,EAAc,IAAI,EAInD,MAAMC,EAAiBD,EAAc,QAAQ/Q,EAAA,KAAK,OAAL,YAAAA,EAAW,MAClD1B,EAAO,KAAK,eAAe,cAAc0S,CAAc,EAE7D,GAAI1S,IAAS,KAST,GALAyS,EAAc,OAAS,WAE1B,KAAK,MAAM,gBAAgB,EAGxBA,EAAc,OAAS,OAAQ,CAIlC,MAAME,EAAW,CAChB,MAAOtB,EACP,SAAUqB,EACV,KAAMD,EAAc,MAEhB,WAAM,eAAgBE,CAAQ,UACzBF,EAAc,OAAS,aAAc,CAC/C,MAAMvN,EAAW,KAAK,eAAe,YAAYlF,EAAK,KAAMA,EAAK,WAAW,EAC5E,GAAI,CAACkF,EACJ,OAID,IAAI0N,EAAiBC,GACpB3N,EAAS,WACTlF,EAAK,WACL,GACA,GACAA,CAAA,EAGD,MAAM8S,EAAoB,OAAO,OAAO,GAAIF,CAAc,EAI1DA,EAAiBL,GAASK,CAAc,EAExC,UAAWnB,KAAiB,OAAO,KAAKgB,EAAc,KAAK,EAAG,CAElDpB,EAAAoB,EAAc,MAAMhB,CAAa,EAItC,MAAAsB,EAAgBtB,EAAc,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAI1DuB,EAAqBD,EAAc,MAAM,gBAAgB,EAI/D,GAAIN,EAAchB,CAAa,IAAM,QAAauB,IAAuB,KAAM,CAExE,MAAAC,EAAOD,EAAmB,CAAC,EAC3BlK,EAAQkK,EAAmB,CAAC,EAC5BtJ,EAAOyI,GAAIS,EAAgBK,CAAI,EAEjC,MAAM,QAAQvJ,CAAI,IACrBA,EAAK,OAAO,SAASZ,EAAO,EAAE,EAAG,CAAC,EAC9BwJ,GAAAM,EAA0BK,EAAMvJ,CAAI,EACzC,MAEI2H,IAAa,OAChB6B,GAAMN,EAA0BG,CAAa,EAEzCT,GAAAM,EAA0BG,EAAe1B,CAAQ,EAIlD,KAAK,cAAc,IAAI,4BAA6B,CACxD,cAAA0B,EACA,SAAA1B,EACA,WAAY,KAAK,WACjB,kBAAAyB,CAAA,CACA,CACF,CAIAF,EAAiBC,GAChB3N,EAAS,WACT0N,EACA,GACA,GACA5S,CAAA,EAGD,UAAWmT,KAAO,OAAO,KAAKP,CAAwB,EACjDA,GAAkBA,EAAeO,CAAG,IAAM,MAAQP,EAAeO,CAAG,IAAM,QAC7E,KAAK,SAAS,cAAcA,CAAG,GAAIP,EAAeO,CAAG,CAAW,EAIlE,GAAIP,EAAgB,CACnB,MAAM/O,EAAwC,CAC7C,KAAM7D,EAAK,KACX,MAAO4S,CAAA,EAGH,oBAAe,kBAAkB/O,CAAiB,EAElD,iBAAY,gCAAgC7D,EAAK,IAAI,EACrD,iBAAY,iCAAiCA,EAAK,IAAI,CAC5D,CACU,SAAAyS,EAAc,KAAK,WAAW,aAAa,EAAG,CAGxD,MAAMvN,EAAW,KAAK,eAAe,YAAYlF,EAAK,KAAMA,EAAK,WAAW,EAC5E,GAAI,CAACkF,EACJ,OAID,IAAI0N,EAAiBC,GACpB3N,EAAS,WACTlF,EAAK,WACL,GACA,GACAA,CAAA,EAED,MAAM8S,EAAoB,OAAO,OAAO,GAAIF,CAAc,EAI1DA,EAAiBL,GAASK,CAAc,EAIlC,MAAAG,EAAgBN,EAAc,KAAK,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAI/DO,EAAqBD,EAAc,MAAM,gBAAgB,EAG/D,GAAIN,EAAc,QAAU,QAAaO,IAAuB,KAAM,CAE/D,MAAAC,EAAOD,EAAmB,CAAC,EAC3BlK,EAAQkK,EAAmB,CAAC,EAC5BtJ,EAAOyI,GAAIS,EAAgBK,CAAI,EAEjC,MAAM,QAAQvJ,CAAI,IACrBA,EAAK,OAAO,SAASZ,EAAO,EAAE,EAAG,CAAC,EAC9BwJ,GAAAM,EAA0BK,EAAMvJ,CAAI,EACzC,MAEI2H,IAAa,OAChB6B,GAAMN,EAA0BG,CAAa,EAEzCT,GAAAM,EAA0BG,EAAe1B,CAAQ,EAMvDuB,EAAiBC,GAChB3N,EAAS,WACT0N,EACA,GACA,GACA5S,CAAA,EAGD,UAAWmT,KAAO,OAAO,KAAKP,CAAwB,EACjDA,GAAkBA,EAAeO,CAAG,IAAM,MAAQP,EAAeO,CAAG,IAAM,QAC7E,KAAK,SAAS,cAAcA,CAAG,GAAIP,EAAeO,CAAG,CAAW,EAKlE,MAAMtP,EAAwC,CAC7C,KAAM7D,EAAK,KACX,MAAO4S,CAAA,EAGH,oBAAe,kBAAkB/O,CAAiB,EAElD,KAAK,cAAc,IAAI,4BAA6B,CACxD,cAAAkP,EACA,SAAA1B,EACA,WAAY,KAAK,WACjB,kBAAAyB,CAAA,CACA,EAEI,iBAAY,gCAAgC9S,EAAK,IAAI,EACrD,iBAAY,iCAAiCA,EAAK,IAAI,EAC3D,KAAK,WAAW,gCAAgCkF,EAAS,KAAMuN,CAAa,MACtE,CAIN,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,CAACA,EAAc,IAAI,EAAGpB,CAAA,EAIvB,MAAMxN,EAAoB,CACzB,KAAM7D,EAAK,KACX,IAAKyS,EAAc,KACnB,MAAOpB,CAAA,EAGH,oBAAe,aAAaxN,CAAiB,CACnD,CACD,EAIA,eAAgB,CAEX,IAAC,KAAK,KAAM,CACf,KAAK,sBAAwB,GAC7B,MACD,CAEI,QAAK,WAAa,KAAM,CAC3B,KAAK,UAAY,GAEjB,MAAMuP,EAAoB,GACtB,KAAK,KAAK,QACbA,EAAkB,KAAK,OAAO,EAC9B,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,MAAO,KAAK,KAAK,QAIf,KAAK,KAAK,QACbA,EAAkB,KAAK,OAAO,EAC9B,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,MAAO,KAAK,KAAK,QAIf,KAAK,KAAK,mBACbA,EAAkB,KAAK,kBAAkB,EACzC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,iBAAkB,KAAK,KAAK,mBAI1B,KAAK,KAAK,cACbA,EAAkB,KAAK,aAAa,EACpC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,YAAa,KAAK,KAAK,cAIrB,KAAK,KAAK,iBACbA,EAAkB,KAAK,SAAS,EAChC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,QAAS,0BAIP,KAAK,KAAK,UACbA,EAAkB,KAAK,SAAS,EAChC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,QAAS,KAAK,KAAK,UAIjB,KAAK,KAAK,cACbA,EAAkB,KAAK,aAAa,EACpC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,YAAa,KAAK,KAAK,cAIrB,KAAK,KAAK,cACbA,EAAkB,KAAK,aAAa,EACpC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,YAAa,KAAK,KAAK,cAIrB,KAAK,KAAK,WACbA,EAAkB,KAAK,UAAU,EACjC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,SAAU,KAAK,KAAK,WAIlB,KAAK,KAAK,mBACbA,EAAkB,KAAK,kBAAkB,EACzC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,iBAAkB,KAAK,KAAK,mBAKnB,UAAAC,KAAe,KAAK,aACzBD,EAAkB,SAASC,EAAY,IAAI,IAE/C,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,CAACA,EAAY,IAAI,EAAGA,EAAY,UAKnC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,WAAYd,GAAS,KAAK,KAAK,UAAU,EAC1C,MAEA,KAAK,UAAY,GAGlB,KAAK,sBAAwB,EAC9B,EACA,uBAAuB1M,EAAmB,CACpCA,EAAM,OAAmB,YAAc,KACtC,gBAAW,MAAM,iCAAkC,CACvD,OAAQ,yBACR,CAEH,EACA,iCAAkC,SAC5B,gBAAW,MAAM,6BAA8B,CACnD,OAAQ,4BACR,cAAcnE,EAAA,KAAK,OAAL,YAAAA,EAAW,KAAK,MAAM,KAAK,GACzC,WAAWwH,EAAA,KAAK,OAAL,YAAAA,EAAW,KACtB,CACF,EACA,iBAAkB,CACjB,KAAK,MAAM,eAAe,CAC3B,EACA,cAAe,CACd,KAAK,UAAY,UAClB,CACD,EACA,SAAU,OACT,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACnBxH,EAAA,KAAK,WAAL,MAAAA,EAAe,GAAG,eAAgB,KAAK,cAEvC,KAAK,YAAY,0BAA0B,KAAK,KAAiB,KAAK,QAAQ,CAC/E,EACA,eAAgB,QACfA,EAAA,KAAK,WAAL,MAAAA,EAAe,IAAI,eAAgB,KAAK,aACzC,CACD,CAAC,oLAtgCMqM,GAAM,4IA0CNuF,GAAM,CAA0B,wEAkCYvE,GAAM,8BAQpDwE,GAAM,CACN,4FA+ByBC,GAAa,gUAzJ1CnI,EAuKM,oCAtKoD,MAAAG,EAAA,oBAIjD,SAAAC,EAAA,WAER,UA6BMC,EAAA,KAAAA,EAAA,GAAAW,GAAA,6BA5BL,MAAAb,EAqBMC,EArBN,OAqBM,kBApBLqC,GAOa,CAAArC,EAAA,MAAAH,IALKa,EAAAsH,EAAA,CAChB,MACA,kBACA,WAAUhI,EAAA,UACV,SAAAA,EAAA,kBAAAA,EAAA,8CAES,uBAAY,WAAvB,oCAAAiI,EAAA,OAUGjI,EAAA,cAAAH,EAAA,EAAAC,EAAA,MAAA6C,GAAA,EAAA3C,EAAA,SAAAA,EAAA,MAAAA,EAAA,WAAAH,EAAA,IAPYqI,EAAqB,CACjC,MACA,eAAU,sBACX,SAAKlI,EAAO,UACZ,WAAe,oBAAa,UAAAA,EAAA,cAC3B,aACA,gBAAe,uBAAAA,EAAA,wHAKZ,IAAAiI,EAAQ,GAAS,+BACdvH,EAASyH,EAAA,OACjB,WAAUnI,EAAA,UACV,sBAAWC,EAAS,KAAAA,EAAA,GAAAc,GAAAf,EAAA,UAAAe,GAAA,SAAAf,EAAA,8BAGc,iDAAAiI,EAAS,GAAS,UACtD,MAAS,CAAAjI,EAAA,WAAAH,IAAAC,EAAE,MAAOwC,GAAW,CAAA/B,EAAA,KAC5B,MAAAR,EAAiDC,EAA9B,sBAEpBG,EAIMQ,EAAA,8BAHL,KAAsBJ,EAAA,MAAAqC,GAAA,CAAAzC,EAAOU,EAAW,CAAC,mIAI/B,KAAuBb,EAAA,iBAAAH,IAAAC,EAAE,MAAO,OAC1C,MAAAC,EAcMC,EAdN,OAcM,wBAZIO,EAAA,MAAAgC,GAAA,CACEpC,EAAAiI,EAAA,CACT,QAAO,2DAEG,QAAMpI,EAAA,yBAEV,OAAAM,EAAA,KACUC,EAAA,KACI,sCAAAP,EAAA,qFAUZ,iBAHFG,EAAAkI,EAAA,IAAArI,EAAA,uLAKV,qBAAuB,OAAAH,IAAAa,EAAA0H,EAAA,CAA2C,IAAI,qDAC1D,oBAEJ9H,EAAE,KACQC,EAAA,UAAAP,EAAA,oJAMnB,GAAAiI,EAAA,OAAAjI,EAAA,MAEQA,EAML,WAAAH,EAAA,EAAAC,EAAA,MAAA+H,GAAA,CALO7H,EAAA,sBAAAH,IAAAa,EAAA4H,EAAA,CAAQ,IAAQ,UAAAtI,EAAA,iGAMzB,uBACCiI,EAAmD,OAAAM,EAA7BhI,EAAI,YAAAJ,EAAaqI,EAAQ,MAAAxI,EAAA,KAGxC,SAAAA,EAAA,yBADP,UAqBuB,GAAAA,EAAA,uBAAAH,IAnBTa,EAAqB+H,EAAA,CACjC,MACA,WAAYzI,EAAA,sBACZ,WAAY,GACZ,WAAAA,EAAA,WACD,WAAKA,EAAA,WACJ,mBAAcA,EAAA,mBACd,kBACA,eAAaA,EAAE,wBAAAA,EAAA,mBAUd,gBAAAA,EAAA,kBAPI,QAAAM,EAAE,IAAI,CAAAH,EACAuI,EAAU,CACpB,KAAS1I,EAAA,KACT,SAAAA,EAAA,WACA,WACA,qBAAMA,EAAA,mBACN,eAAaA,EAAA,oBAAAA,EAAA,4KAGL,+BAA4B,aAAvC,wEAAAiI,EAAA,OAAAjI,EACC,sBAEW,SAD6D,GAAAH,EAAA,EAAAC,EAAA,MAAAwD,GAAA,CAApEnD,EAAAU,EAAA,cAAAP,EAAA,yFAIL,GAAA2H,EAAA,OAAAjI,EAKC,oCAMEA,EALO,aAAAH,IAAAC,EAAA,MAAAgI,GAAA,CAAU3H,EAAgBmI,EAAA,SAAAtI,EAAA,sIArCf,IAAAiI,EAAA,mBA6CtB,YA+BM,cA7BS1H,EAAiB,YAAAJ,EACnBsI,EAAY,CACtB,WAAYzI,EAAA,kBACZ,WAAAA,EAAA,WACD,WAAKA,EAAA,WACJ,mBAAcA,EAAA,mBACd,iCAAAA,EAAA,aAEF,gBASEA,EAAA,iBARA,OAAU,cAAE,aAAY,uEAAAG,EACdsI,EAAM,CAChB,WAAYzI,EAAA,aACZ,WAAY,GACZ,WAAAA,EAAA,WACD,WAAOA,EAAA,WACN,mBAAcA,EAAA,mBACd,uBAAAA,EAAA,aAEF,gBAUMA,EAAA,mDARJ,aAAQ,qBAAQ,qCAAAO,EAAA,MAAAwH,GAAA,CAAmEvH,EAAUC,EAAWT,EAAA,6CAA6B,mBAAA/J,EAAA+J,EAAA,uBAAA/J,EAAA,YAOtI,QAAA+J,EAAA,2HAIH,IAAAiI,EAAA,oJChJFU,GAAelW,EAAgB,CAC9B,KAAM,YACN,MAAO,CACN,SAAU,CACT,KAAM,OACP,EACA,KAAM,CACL,KAAM,MACP,EACA,KAAM,CACL,KAAM,MACP,EACA,IAAK,CACJ,KAAM,OACN,QAAS,KACV,EACA,cAAe,CACd,KAAM,MACP,CACD,EACA,MAAO,CACN,MAAMmW,EAAoB,CACzB,EAAG,KACH,EAAG,MAGG,OACN,WAAY,GACZ,kBAAAA,EACA,WAAY,KACZ,eAAgB,CACf,UAAW,aAAaA,EAAkB,CAAC,OAAOA,EAAkB,CAAC,KACtE,EACA,iBAAkB,EAEpB,EACA,SAAU,CACT,GAAGjW,EAAUiL,EAAW,EACxB,SAAmB,CAClB,OAAO,KAAK,SAAS,gBACtB,EACA,gBAAoC,CACnC,OAAO,KAAK,SAAS,kBACtB,CACD,EACA,QAAS,CACR,mBAAoB,CACnB,KAAK,eAAiB,CACrB,UAAW,aAAa,KAAK,kBAAkB,CAAC,OAAO,KAAK,kBAAkB,CAAC,MAEjF,EACA,YAAY,EAAe,WAY1B,GAXI,KAAK,WAIT,KAAK,WAAa,EAAE,OAChB,KAAK,iBAAiB3H,EAAA,KAAK,WAAW,UAAhB,YAAAA,EAAyB,UAAW,KAAK,gBAC7D,gBAAa,KAAK,WAAW,QACjC,iBAAiB,KAAK,aAAa,OAIjC,KAAK,iBAAiBoL,GAAA5D,EAAA,KAAK,aAAL,YAAAA,EAAiB,UAAjB,YAAA4D,EAA0B,UAAW,KAAK,eACnE,OAGD,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAElB,KAAK,WAAa,GAClB,KAAK,kBAAoB,CAAE,EAAG,EAAE,MAAO,EAAG,EAAE,OAC5C,KAAK,kBAAkB,EAEhB,wBAAiB,YAAa,KAAK,MAAM,EACzC,wBAAiB,UAAW,KAAK,SAAS,EAGjD,MAAMwH,EAAgB,SAAS,cAC3BA,GACHA,EAAc,KAAK,CAErB,EACA,OAAO,EAAe,CAIrB,GAHA,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAEd,MAAK,SAIL,KAAC,KAAK,WAAY,CACrB,KAAK,WAAa,GAEZ,MAAA5K,EACL,KAAK,eAAiB,KAAK,WAAa,KAAK,WAAW,QAAQ,MAAQ,KAAK,MAAQ,GACjF,cAAS,uBAAuB,CAAE,KAAM,KAAK,KAAM,KAAMA,GAAQ,GAAI,EAErE,WAAM,YAAa,KAAK,UAAU,EAC9B,cAAK,MAAM,OAAS,UAC9B,CAEK,sBAAmB,OAAO,sBAAsB,IAAM,CACtD,KAAK,SAAW,KAAK,eACnB,uBAAoB,CAAE,EAAG,KAAK,eAAe,CAAC,EAAG,EAAG,KAAK,eAAe,CAAC,CAAE,EAEhF,KAAK,kBAAoB,CAAE,EAAG,EAAE,MAAO,EAAG,EAAE,OAE7C,KAAK,kBAAkB,EAClB,WAAM,OAAQ,KAAK,iBAAiB,EACzC,EACF,EACA,WAAY,CACP,KAAK,WAIA,cAAK,MAAM,OAAS,QACtB,2BAAoB,YAAa,KAAK,MAAM,EAC5C,2BAAoB,UAAW,KAAK,SAAS,EAC7C,4BAAqB,KAAK,gBAAgB,EAEjD,WAAW,IAAM,CACX,WAAM,UAAW,KAAK,UAAU,EACrC,KAAK,WAAa,GAClB,KAAK,WAAa,KAClB,KAAK,SAAS,yBACZ,CAAC,EACL,CACD,CACD,CAAC,uJAtJO6K,GAAK9I,EAAAC,EAAA8I,EAAOC,EAAQC,EAAGC,EAAU,CACtC,OAAArJ,EAAsB,EAAAa,EAAAyI,GAAAnJ,EAAA,MACvB,MAAID,EAAS,EAAAC,EAAA,iBAAAA,EAAA,yBAAAA,EAAA,4BAIb,QAAAM,EAAA,KAAA8I,GAAApJ,EAAA,OACC,UAEM,YAAAA,EAAA,cAAAH,EAAA,EAFca,EAAA2I,GAAA,aAAAd,EAAOhI,EAAQ,MAAC,CAAY,IAAK,kBAAAR,EAAAC,EAAA,kBACpD,MAAgEsJ,GAAAtJ,EAAA,qBAAnBA,EAAU,0BAAAA,EAAA,0JCoC3DuJ,GAAe9W,EAAgB,CAC9B,WAAY,CACX,UAAA+W,EACD,EACA,MAAO,CACN,aAAc,CACb,KAAM,OACP,EACA,YAAa,CACZ,KAAM,OACP,CACD,EACA,QAAS,CACR,OAAO,EAA6B,CAC9B,WAAM,OAAQ,CAAC,CACrB,EACA,aAAc,CACb,KAAK,MAAM,WAAW,CACvB,EACA,WAAY,CACX,KAAK,MAAM,SAAS,CACrB,CACD,CACD,CAAC,wSA7CgBjJ,EAAA,YACAA,EAAA,OACAA,EAAA,OACAA,EAAA,OAAAA,EAAA,OAEZA,EAAA,eAEYA,EAAA,YACAA,EAAA,OACAA,EAAA,OACAA,EAAA,OAAAA,EAAA,eAZZ,MAOA+B,GAMM,CAAAD,iEAnCVzC,EAuCY,aArCN,OAAAC,EAAA,EAAQa,EAAA+I,EAAA,CACZ,oBACA,OAASzJ,EAAA,OACT,YAAKA,EAAA,sBAAAA,EAAA,UAEK,MAAOD,EAAIC,EAAU,gCACpBM,EAAK,aAAArM,KAAA,CAAAsM,EAAA,aAERR,EAAW,EAAAC,EAAA,0BACXA,EAAA,aAAAH,IAAAC,EAAK,OAAO,OAElB,MAAuCC,EAAA,EAAAC,EAAA,gBAApB,EAAI,GAAC,CAAYA,EAAA,gBAAA/L,CAAA,6BAErC,MAAAgU,EAAA,OAAAjI,EAAA,cAAAH,MAEY,OAAO,OAElB,MAAwCE,EAAA,EAAAC,EAAA,iBAArB,EAAK,GAAa,CAAAA,EAAA,gBAAA/L,CAAA,8BAEtC,MAAMgU,EAAK,GAAE,IAAA1H,EAAA,sVCmCXxH,EAAiBxF,IACjBC,EAAiBC,IACjBkL,EAAW5F,EAAe,qBAOhC,SAAS2Q,EAAkBC,EAAiC,CAC3D,MAAMC,EAAuBC,EAAe,MAAMF,CAAS,EAAE,CAAC,EAC1DC,GACEE,EAAA,qBAAsBF,EAAqB,KAAK,IAAI,CAE3D,CAEA,SAASG,EAAU/S,EAAkB,CACpC,GAAIA,EAAE,UAAYA,EAAE,SAAWA,EAAE,SAAWA,EAAE,SAAU,CAUvD,MAAMgT,EARS,CACd,QAAS,YACT,WAAY,aACZ,UAAW,WACX,UAAW,aAIqBhT,EAAE,GAA0B,GAAK,KAC9DgT,GACHN,EAAkBM,CAAiB,CAErC,CACD,CACA,SAASC,EAAmBC,EAA+B,CACnD,OAAAA,EACL,IAAKjE,GAAS,CACR,MAAA1R,EAAOwE,EAAe,cAAckN,CAAI,EAC9C,GAAI1R,EAAM,CACT,MAAMkF,EAAWjG,EAAe,YAAYe,EAAK,IAAI,EACrD,GAAIkF,EACI,OAAE,KAAAlF,EAAM,SAAAkF,EAEjB,CACO,WACP,GACA,OAAQE,GAAuBA,IAAM,IAAI,CAC5C,CACM,MAAAkQ,EAAiBxV,EAErB,IAAM,CACD,MAAA8V,EAAW1G,EAAM,SAAS,KACzB,OACL,UAA2BwG,EAC3BtL,EAAS,cAAcwL,EAAU,cAAc,CAChD,EACC,WAA6BF,EAAmBtL,EAAS,cAAcwL,EAAU,OAAQ,CAAC,CAAC,EAC3F,SAA8BF,EAC9BtL,EAAS,eAAewL,EAAU,cAAc,CACjD,EACC,UAA4BF,EAAmBtL,EAAS,eAAewL,EAAU,OAAQ,CAAC,CAAC,EAC7F,CACA,EAEKC,EAAmB,CACxB,YACA,aACA,WACA,aAEKC,EAAwB,CAC5B,UAA2B,SAC3B,WAA6B,OAC7B,SAA8B,MAC9B,UAA4B,SAG9B,OAAA1N,GAAU,IAAM,CACN,0BAAiB,UAAWoN,EAAW,EAAI,EACpD,EAEDO,GAAgB,IAAM,CACZ,6BAAoB,UAAWP,EAAW,EAAI,EACvD,EACYQ,EAAA,CACZ,kBAAAb,CAAA,CACA,iiCClFKc,GAAc,GACdC,GAAqB,GACrBC,GAAkB,IAClBC,GAAc,IACdC,GAAoB,IAEpBC,GAAmD,CACxD,QAASpF,GACT,SAAUA,GACV,QAASA,GACT,UAAWA,GACX,KAAMA,GAAwB,CAC/B,EAEAqF,GAAerY,EAAgB,CAC9B,KAAM,qBACN,OAAQ,CAACsY,EAAc,EACvB,WAAY,CACX,gBAAAC,GACA,iBAAAC,EACD,EACA,MAAO,CACN,YAAa,CACZ,KAAM,OACP,EACA,mBAAoB,CACnB,KAAM,OACP,EACA,SAAU,CACT,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACN,QAAS,KAAO,GACjB,CACD,EACA,MAKE,CACM,OACN,YAAa,EACb,WAAY,GACZ,gBAAAP,GACA,YAAa,GAEf,EACA,SAAU,CACT,KAAK,cAAc,EAOlB,KAAK,oBAAoB,eAAiB,GAC1C,KAAK,oBAAoB,gBAAkB,IAE3C,KAAK,kBAAkB,EACvB,KAAK,aAAa,KAAK,uBAAuB,KAAK,oBAAoB,aAAa,CAAC,EACrF,KAAK,oBAAoB,GAGnB,wBAAiB,SAAU,KAAK,aAAa,EACpD,KAAK,MAAM,OAAQ,CAAE,SAAU,KAAK,oBAAoB,aAAc,EACtE,WAAW,IAAM,CAChB,KAAK,YAAc,IACjB,CAAC,EAEQQ,GAAA,GAAG,oBAAqB,KAAK,iBAAiB,CAC3D,EACA,eAAgB,CACR,2BAAoB,SAAU,KAAK,aAAa,EAC3CA,GAAA,IAAI,oBAAqB,KAAK,iBAAiB,CAC5D,EACA,SAAU,CACT,GAAGvY,EAAUiL,EAAW,EACxB,qBAIE,CACD,OAAO,KAAK,SAAS,uBAAuB,KAAK,mBAAmB,CACrE,EACA,YAAa,CACZ,OAAO,KAAK,SAAS,UACtB,EACA,2BAAsC,CAC/B,MAAAuN,EAAsB,CAAC,OAAO,EAEpC,OAAI,KAAK,aAAaA,EAAoB,KAAK,MAAM,EAC9CA,CACR,EACA,qBAA8B,CAC7B,OAAK,KAAK,aACL,KAAK,YACN,KAAK,WAAa,KAAa,UAC5BzE,GAAI,KAAM,wBAAwB,GAAK,UAFhB,WADC,WAIhC,EACA,cAAwB,CAChB,YAAK,OAAO,QAAU,MAC9B,EACA,kBAA2B,CACnB,YAAK,kBAAkB+D,EAAkB,CACjD,EACA,gBAAyB,CACjB,UAAKD,GAAcC,IAAsBC,EACjD,EACA,qBAA8B,CACzB,YAAK,YAAc,KAAK,eAAuB,KAAK,kBAAkB,CAAC,EAEtE,KAAK,aACH,KAAK,kBAAkBF,GAAc,EAAE,EAAI,KAAK,iBADxB,KAAK,kBAAkBA,EAAW,CAElE,EACA,sBAA+B,CAC1B,YAAK,YAAc,KAAK,eAAuB,KAAK,kBAAkB,CAAC,EAEpE,KAAK,kBAAkBA,GAAc,EAAE,EAAI,KAAK,gBACxD,EACA,aAAuB,CACf,YAAK,oBAAoB,aAAe,KAAK,mBACrD,EACA,cAAwB,CAChB,YAAK,oBAAoB,cAAgB,KAAK,oBACtD,EACA,iBAAmD,CAC3C,OACN,KAAM,GAAG,KAAK,kBAAkB,KAAK,oBAAoB,YAAY,CAAC,KACtE,MAAO,GAAG,KAAK,kBAAkB,KAAK,oBAAoB,aAAa,CAAC,KAE1E,EACA,kBAAsC,CAC9B,OACN,MAAO,GAAG,KAAK,kBAAkB,KAAK,oBAAoB,uBAAuB,CAAC,KAEpF,EACA,mBAAyD,CACjD,OACN,KAAM,GAAG,KAAK,kBAAkB,KAAK,oBAAoB,uBAAuB,CAAC,KACjF,UAAW,eAAe,KAAK,kBAAkB,KAAK,4BAA4B,CAAC,MAErF,EACA,qBAA4F,CACrF,MAAAY,EAAW,KAAK,OAAO,QAAU,OACjCC,EACL,KAAK,oBAAoB,aAAe,KAAK,oBAAoB,cAM3D,OACN,wBAL+BD,EAC7B,EAAIC,EAA0B,KAAK,oBAAoB,cACvD,EAAI,KAAK,kBAAkBb,EAAW,EAIxC,wBAAAa,CAAA,CAEF,EACA,8BAAuC,CACtC,MAAMC,EAAe,EAAI,KAAK,kBAAkBZ,GAAkBF,EAAW,EACvEe,EACL,KAAK,oBAAoB,wBAA0BD,EAC7C,OAAAC,EAA2B,EAAIA,EAA2B,CAClE,EACA,gBAA0B,CAClB,OAAA7E,GAAI,KAAM,wBAAwB,IAAM,MAChD,EACA,iBAA0B,CACnB,MAAA8E,EAAa,KAAK,eAAiB,EAAI,EAEzC,YAAK,YAAc,KACfZ,GAAoBY,EAGrBb,GAAca,CACtB,EACA,0BAAoC,CAC7B,MAAAC,EAAmB,KAAK,kBAAkBf,EAAe,EACxD,YAAK,oBAAoB,cAAgBe,CACjD,CACD,EACA,MAAO,CACN,YAAYC,EAAa,CAClB,MAAAD,EAAmB,KAAK,kBAAkBf,EAAe,EAE3D,KAAK,0BACR,KAAK,kBAAkBe,CAAgB,EAGxC,MAAME,EAAiB,KAAK,oBAAsB,KAAK,oBAAoB,aACrEC,EAAa,KAAK,qBAAuB,KAAK,oBAAoB,cAGpEF,EAAc,KAAK,gBAAkBC,GAAkBC,IAC1D,KAAK,kBAAkBH,CAAgB,EACvC,KAAK,aAAa,KAAK,uBAAuB,KAAK,oBAAoB,aAAa,CAAC,GAGjF,kBAAa,KAAK,oBAAoB,YAAY,CACxD,CACD,EACA,QAAS,CACR,qBAAqBlX,EAAc,CAC7B,WAAM,qBAAsBA,CAAI,CACtC,EACA,uBAAuBsX,EAAe,CACrC,OAAI,KAAK,sBAAwB,WACzB,KAAK,kBAAkBrB,GAAc,EAAI,KAAK,eAAe,EAE9D,KAAK,aAAe,GAAMqB,EAAQ,EAAI,KAAK,mBACnD,EACA,kBAAkBC,EAAwB,CACzC,MAAMC,EACLD,GAAiB,KAAK,kBAAkBjB,GAAsB,KAAK,mBAAmB,CAAC,EAExF,KAAK,SAAS,uBAAuB,CACpC,UAAW,KAAK,oBAChB,WAAY,CACX,cAAekB,CAChB,EACA,CACF,EACA,aAAaC,EAAsB,CAClC,MAAMC,EACLD,GAAgB,EAAI,KAAK,oBAAoB,wBACxCE,EACL,EAAID,EAAwB,KAAK,oBAAoB,cAEhDL,EAAa,KAAK,qBAAuBM,EACzCC,EAAY,KAAK,oBAAsBF,EACvCG,EAAc,KAAK,sBAAwB,YAEjD,GAAID,EAAW,CACd,KAAK,SAAS,uBAAuB,CACpC,UAAW,KAAK,oBAChB,WAAY,CACX,aAAc,KAAK,oBACnB,cAAe,EAAI,KAAK,oBAAoB,cAAgB,KAAK,mBAClE,EACA,EACD,MACD,CAEA,GAAIP,EAAY,CACf,KAAK,SAAS,uBAAuB,CACpC,UAAW,KAAK,oBAChB,WAAY,CACX,aAAc,EAAI,KAAK,oBAAoB,cAAgB,KAAK,qBAChE,cAAe,KAAK,oBACrB,EACA,EACD,MACD,CAEA,KAAK,SAAS,uBAAuB,CACpC,UAAW,KAAK,oBAChB,WAAY,CACX,aAAcQ,EAAc,KAAK,oBAAsBH,EACvD,cAAeC,CAChB,EACA,CACF,EACA,kBAAkBjX,EAA8C,CAC/D,MAAMoX,EAAyC,CAC9C,QAAS,KAAK,oBACd,SAAU,KAAK,qBACf,QAAS,KAAK,uBAAuB,KAAK,oBAAoB,aAAa,GAGvE,kBAAaA,EAAepX,CAAQ,CAAC,CAC3C,EACA,kBAAkBqX,EAAY,CAC7B,OAAOA,EAAK,KAAK,WAClB,EACA,kBAAkBR,EAAuB,CACxC,OAAOA,EAAgB,KAAK,WAC7B,EACA,eAAgB,CACf,KAAK,cAAc,CACpB,EACA,aAAc,CACb,KAAK,kBAAkB,CACxB,EACA,kBAAkB7N,EAAuD,CACpE,KAAK,aACH,KAAK,cAAc,WAAY,CAAE,aAAc,GAAI,SAAU,IAAQA,CAAI,CAEhF,EACA,SAAS,CAAE,UAAA0L,EAAW,EAAA7W,EAAG,MAAA+Y,GAA0D,CAC5E,MAAAU,EAAmB,KAAK,kBAAkBzZ,CAAC,EAC3CgZ,EAAgB,KAAK,kBAAkBD,CAAK,EAE9ClC,IAAc,QAAU4C,GAAoB,KAAK,qBACjD5C,IAAc,SAAW,EAAI4C,GAAoB,KAAK,sBACtDV,GAASnB,KAEb,KAAK,kBAAkBoB,CAAa,EAC/B,kBACJnC,IAAc,OAAS4C,EAAmB,KAAK,oBAAoB,cAErE,EACA,qBAAsB,CACrB,MAAMC,EAAuBC,GAC5B,GAAGC,EAAuC,IAAI,KAAK,mBAAmB,EACrE,QAEF,GAAIF,EAAsB,CACnB,MAAAG,EAAc,WAAWH,CAAoB,EACnD,KAAK,kBAAkBG,CAAW,EAC5B,MAAAC,EAAkB,KAAK,uBAAuBD,CAAW,EAE/D,YAAK,aAAaC,CAAe,EAC1B,EACR,CACO,QACR,EACA,mBAAoB,CACRH,GAAA,GAAGC,EAAuC,IAAI,KAAK,mBAAmB,EAAE,EAAE,MACpF,KAAK,oBAAoB,cAAc,SAAS,CAClD,EACA,aAAc,CACb,KAAK,WAAa,GAClB,KAAK,MAAM,YAAa,CAAE,SAAU,KAAK,oBAAoB,aAAc,CAC5E,EACA,OAAO,EAA6B,CAC7B,MAAAV,EAAe,KAAK,kBAAkB,EAAE,CAAC,EAAI,KAAK,oBAAoB,cAAgB,EAE5F,KAAK,aAAaA,CAAY,CAC/B,EACA,WAAY,CACX,WAAW,IAAM,CAChB,KAAK,WAAa,GAClB,KAAK,MAAM,UAAW,CACrB,YAAa,KAAK,YAClB,SAAU,KAAK,oBAAoB,aACnC,GACC,CAAC,EACJ,KAAK,kBAAkB,CACxB,EACA,eAAgB,CACf,KAAK,YAAc,OAAO,UAC3B,EACA,OAAQ,CACP,KAAK,MAAM,OAAO,CACnB,CACD,CACD,CAAC,whBArZApM,EAwCM,iCAvCLE,EAKE,YAAAE,EAAA,YAAAH,MAHoBgN,EAAoB,CACxC,MACD,qBAAY7M,EAAA,iCAAAA,EAAA,uBAE0B,iCAAkB,WAAzD,IAAAiI,EAAA,OAAAjI,EAAA,mBAGAiI,EAAA,QAHApI,EAAA,IAAa,MAAO,CAAwC,IAAK,QAAAE,EAAAC,EAAA,mBAChE,MAA0BsJ,GAAAtJ,EAAA,wCAE3B,MAAAA,EAAA,mBAGMiI,EAAK,GAAE,KAHbpI,EAAA,IAAa,MAAO,CAAyC,IAAK,QAAAE,EAAAC,EAAA,oBACjE,MAA2BsJ,GAAAtJ,EAAA,0CAE5B,MAAaO,EAAwB,MAAE,OAAAR,EAAAC,EAAA,kBACtC,MAwBqBsJ,GAAAtJ,EAAA,qBAtBZ8M,EAAkB,CACzB,kBAAU9M,EAAe,gCACzB,MAAYA,EAAA,kBAAAA,EAAA,mCACZ,SAAQA,EAAA,gBACR,YACA,SAAWA,EAAA,kBACX,cAAmBA,EAAA,0BAAAA,EAAA,YAYd,oBAAAA,EAAA,4BAVK,QAAAM,EAAA,KAAAC,EAAA,OAKF,MAAAR,EAAAC,EAAkB,OAAI,mBAAW,IAHlC,CAAAA,EAAA,oBAAAA,EAAA,aAAAH,EAAA,EAAAa,EAAKqM,EAAgB,CAC1B,MACA,QAAc,CAAY,CAAA/M,EAAA,sBAAAA,EAAA,gBAAAA,EAAA,aAE1B,YAAWA,EAAA,YACX,aAAMA,EAAM,aACZ,YAASA,EAAA,mBAAAA,EAAA,iHAGZiI,EAEM,MAFA,KAAA1H,EAAA,OACL,MAAoBR,EAAA,EAAAC,EAAA,2BAAAA,EAAA,iBAAAA,EAAA,iOC7BnBgN,GAAmC,CACxC,oBAAqB,GACrB,oBAAqB,GACrB,mBAAoB,UACpB,YAAa,CAAC,GAAGC,YAAS,YAAa,QAAS,MAAO,OAAO,EAC9D,kBAAmB,CAClB,GAAGA,GAAS,2BACZ,IAAK,CAAC,QAAS,OAAO,CACvB,EACA,cAAe,CACd,KAAM,EACP,CACD,EAEeC,GAAA,CACd,KAAM,cACN,MAAO,CACN,UAAW,CACV,KAAM,MACP,CACD,EACA,SAAU,CACT,eAAgB,CACR,OAAAC,GAAa,KAAK,UAAWH,EAAe,CACpD,CACD,CACD,gBAjCc,SAAAlE,GAAC9I,EAAgBC,EAAA8I,EAAAC,EAAAC,EAAAC,EAAA,CAAQ,OAAArJ,EAAA,EAAeC,EAAA,4MCkCtDsN,GAAe3a,EAAgB,CAC9B,KAAM,yBACN,WAAY,CACX,cAAA4a,GAAA,YACAC,EACD,EACA,MAAO,CACN,WAAY,CACX,KAAM,OACN,SAAU,EACX,CACD,EACA,MAAO,CACC,OACN,UAAW,GACX,YAAa,GACb,MAAO,GACP,KAAM,GAER,EACA,SAAU,CACT,GAAG3a,EAAUY,CAAiB,CAC/B,EACA,MAAM,SAAU,CACf,KAAM,CAAE,GAAAga,EAAI,KAAAtP,EAAM,SAAAuP,EAAU,SAAAC,EAAU,SAAAC,GAAa,KAAK,WAClDC,EAAaF,IAAa,OAC1BG,EAAaH,IAAa,OAEhC,GAAI,CAACF,EACAI,GAAcC,EACjB,KAAK,KAAOvO,GAAU,KAAKpB,CAAI,CAAC,EAE3B,iBAAc,QAAUyP,EAAW,WAAazP,MAGlD,KACH,MAAM4P,EAAY,KAAK,eAAe,aAAaN,EAAI,OAAQC,EAAUE,CAAQ,EACjF,GAAIC,GAAcC,EAAY,CAC7B,MAAME,EAAc,MAAM,MAAMD,EAAW,CAAE,YAAa,UAAW,EACrE,KAAK,KAAO,MAAOF,EAAaG,EAAY,OAASA,EAAY,KAAK,QAEtE,KAAK,YAAcD,OAET,CACX,KAAK,MAAQ,EACd,CAGD,KAAK,UAAY,EAClB,EACA,QAAS,CACR,YAAuB,CAChB,MAAE,SAAAJ,CAAS,EAAI,KAAK,WACnB,OAACA,GAAY,OAAO,CAC5B,CACD,CACD,CAAC,mCAtFgD7K,GAAQ,CAAC,iDAIJS,GAAQ,CAAC,oHAR9DzD,EAqBO,4BApBNE,EAAkD,aAAAE,EAClC,iBAAhB,MAAsDqC,GAAA,wBAA/B,gBAEUvC,EAAA,MAAA6C,GAAA,+BAAA9C,IAAAC,EAAhC,OAGQwC,GAHR,CACCtC,EAAA,sBAAyD,aAAhCF,EAAA,QAAA8C,GAAA,CAAArC,EAAS,SAAW,KAAAP,EAAA,YAC7C,KAAAA,EAAA,4BAAAuC,EAAA,EAEiB/B,EAAW,IAAQC,EAAAT,EAAA,oEACpC,GAAAA,EAAA,sBAAyD,aAAhCF,EAAA,QAAAuD,GAAA,CAAA9C,EAAS,SAAW,KAAAP,EAAA,YAC7C,KAAAA,EAAA,4BAAAwC,EAAA,EAGWhC,EAAW,IAAQC,EAAAT,EAAA,uEAAAA,EAAA,8BAAAH,EACnB,EAAAa,EAAAqN,EAAA,CACV,IAAI,EACJ,KAAU/N,EAAA,YAEc,aAA1B,oBAAAA,EAAA,8BAAAH,IAAsEa,EAAIsN,EAAA,OAC1E,UAAAhO,EAAA,8BAAAH,EAA+B,EAAAC,EAAA,SAAE,IAAK,MAAAE,EAAA,sGCUzCiO,GAAexb,EAAgB,CAC9B,KAAM,oBAEN,WAAY,CACX,uBAAAyb,EACD,EACA,OAAQ,CAGA,OACN,YAHmBrJ,IAGnB,CAEF,EACA,MAAO,CACN,cACA,eACD,EACA,SAAU,CACT,GAAGlS,EAAUY,CAAiB,EAC9B,YAAiC,CAC1B,MAAA4a,EAAa,KAAK,YAAY,cACnC,KAAK,gBACL,KAAK,YAAY,KACjB,KAAK,YAAY,SACjB,KAAK,YAAY,aAOlB,OAJIA,EAAW,SAAW,GAKzB,KAAK,YAAY,OAASA,EAAW,QACrCA,EAAW,KAAK,YAAY,KAAK,EAAE,KAAK,YAAY,GAAG,IAAM,OAEtD,KAG4BA,EAAW,KAAK,YAAY,KAAK,EAAE,KAAK,YAAY,GAAG,CAG5F,EAEA,iBAAmC,CAC5B,MAAAC,EAAoB,KAAK,eAAe,qBAC9C,GAAIA,IAAsB,KAClB,YAER,MAAMC,EAAgBD,EAAkB,KACjC,OAAAC,EAAgBA,EAAc,WAAW,QAAU,IAC3D,CACD,EACA,QAAS,CACR,aAAc,CAGb,YAAK,MAAM,OAAO,EACX,EACR,CACD,CACD,CAAC,4GAzFwBC,EAAA1O,EAAA,0BAAQ,OAAAI,EAAA,eAAAH,EAAA,EAAAC,EAAA,aAC/B,MAOEC,EAAA,uBAAA9J,EAAA+J,EAAA,yBAAA/J,EAAA,eALI+K,EAAO,CACZ,QAAMJ,GAAyBZ,EAAA,sBAC9B,KAAK,QACN,MAAK,0BACJ,MAAOA,UAAQ,SAAQ,0DAGzB,MAAAA,EAAA,QAKM,SALN,8BAKM,QAJO,EAAU,6BAAtBO,EAAA,MAAA8B,GAAA,CAAArC,EAAA,YAAAH,IAG4Ca,EAAU4N,EAAA,yDAHtDzO,EAAA,EAAAC,EAAA,MAAA6C,GAAAlC,EAAAT,EAAA,+GC6HHuO,GAAe9b,EAAgB,CAC9B,KAAM,gBACN,OAAQ,CAACsP,EAAS,EAClB,MAAO,CAAC,OAAO,EACf,WAAY,CACX,cAAAsL,EACD,EACA,OAAQ,CACA,OACN,GAAG1P,GAAS,EAEd,EACA,SAAU,CACT,GAAGhL,EAAUc,EAAmBmK,EAAW,EAC3C,cAAwB,CACvB,OAAO,KAAK,UAAU,KAAK,MAAM,KAAK,EAAE,OAAS4Q,EAClD,EACA,YAAgC,CACzB,MAAAja,EAAO,KAAK,SAAS,WAC3B,GAAI,CAACA,EACJ,MAAO,GAER,MAAMkF,EAAW,KAAK,eAAe,YAAYlF,EAAK,KAAMA,EAAK,WAAW,EAE5E,OAAIkF,IAAa,KACT,GAGDA,EAAS,UACjB,CACD,EACA,QAAS,CACR,oBAAoBsM,EAAmB1H,EAAyB,CAC/D,MAAM2H,EAAgB,KAAK,qBAAqBD,EAAW,EAAK,EAC1D0I,EAAoB,KAAK,qBAAqB1I,EAAW,EAAI,EACnE,OAAO1H,EACL,QAAQ,iBAAkB2H,CAAa,EACvC,QAAQ,sBAAuByI,CAAiB,CACnD,EACA,qBAA8B,OAK7B,GAHC,KAAK,MAAM,OAAS,sBACnB,KAAK,MAA6B,gBAAkB,qBAG9C,OAAAtB,GACN,KAAK,MAAM,YACV,KAAK,QAAQ,SAAS,yCAA0C,CAC/D,YAAa,CAAE,KAAM,KAAK,MAAM,KAAK,IAAK,EAC1C,GAGJ,GAAI,GAAClX,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,qBACjB,OAAAkX,GAAa,KAAK,MAAM,WAAW,EAG3C,MAAMnH,EAAgB,KAAK,qBAAqB,KAAK,MAAM,QAAQ,SAAS,EACrE,OAAAmH,GACN,KAAK,MAAM,QAAQ,oBAAoB,QAAQ,iBAAkBnH,CAAa,EAEhF,EACA,iBAA0B,OACzB,MAAM0I,EAAmB,KAAK,QAAQ,SAAS,qBAAqB,EAAI,KAMxE,GAHC,KAAK,MAAM,OAAS,sBACnB,KAAK,MAA6B,gBAAkB,qBAM9C,OAHyB,KAAK,QAAQ,SAAS,6BAA8B,CACnF,YAAa,CAAE,KAAM,KAAK,MAAM,KAAK,IAAK,EAC1C,EAIF,GAAI,KAAK,MAAM,UAAY,KAAK,MAAM,YAC9B,OAAAA,EAER,GAAI,GAACzY,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,iBACjB,OAAAyY,EAAmB,KAAK,MAAM,QAGtC,MAAM1I,EAAgB,KAAK,qBAAqB,KAAK,MAAM,QAAQ,SAAS,EAE5E,OACC0I,EACA,KAAK,MAAM,QAAQ,gBAAgB,QAAQ,iBAAkB1I,CAAa,CAE5E,EACA,qBAAqBwB,EAAcmH,EAAW,GAAM,CAC/C,IACG,MAAA7I,EAAa,KAAK,cAAc,KAAK,WAAY0B,EAAK,MAAM,GAAG,CAAC,EAClE,IAAC1B,EAAW,OACf,MAAM,IAAI,MAGX,OAAK6I,EAGE7I,EAAW,IAAKC,GAAcA,EAAU,WAAW,EAAE,KAAK,KAAK,EAF9DD,EAAW,IAAO,mBAGX,CACf,MAAO,6BAA6B0B,CAAI,GACzC,CACD,EACA,cACC1B,EACA8I,EACmD,CAC/C,IAAAC,EAAuBD,EAAU,QAErC,GAAIC,IAAyB,OAC5B,MAAO,GAGF,MAAAC,EAAaD,EAAqB,MAAM,iBAAiB,EAC3DC,IAAe,MAAQA,EAAW,OAAS,IAC9CD,EAAuBC,EAAW,CAAC,GAEpC,MAAMC,EAAmBjJ,EAAW,KAClCC,GAAcA,EAAU,OAAS8I,CAAA,EAGnC,GAAIE,IAAqB,OACxB,MAAM,IAAI,MAAM,6BAA6BF,CAAoB,GAAG,EAGjE,OAAAD,EAAU,SAAW,EACjB,CAACG,CAAgB,EAGrBA,EAAiB,eAAe,SAAS,EACrC,CACNA,EACA,GAAG,KAAK,cAAeA,EAAqC,QAAUH,CAAS,GAI7EG,EAAiB,eAAe,QAAQ,EACpC,CACNA,EACA,GAAG,KAAK,cAAeA,EAA6C,OAAQH,CAAS,GAKhF,CAACG,CAAgB,CACzB,EACA,WAAY,CACX,KAAK,gBAAgB,KAAK,UAAU,KAAK,MAAM,KAAK,CAAC,EACrD,KAAK,YAAY,CAClB,EACA,aAAc,CACb,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,iCAAiC,EAC9D,KAAM,OACN,CACF,CACD,CACD,CAAC,4BAhSiBpM,GAAA,gBAIJL,GAAA,sFAWFe,GAAA,KAAK,oDAWZC,GAAM,+DAQCwE,GAAA,OAAM,qCAONrF,GAAA,OAAM,yCASN,MAAM,qCAYNuM,GAAA,OAAM,uCAGJC,GAAA,OAAM,oFAMRC,GAAM,4BA2BNC,GAAA,KAAK,oJAxGhBvP,EAmHM,0BAjHJC,EAAwD,EAAAC,EAAA,YAAAS,EAA7C,MAAe8B,GAAA,CAAC9B,EAAA,6BACU,YAAME,EAAWT,EAAA,oBAAtD,OAAA2C,EAAA,EAAA3C,EAAA,mBAAAH,EAAA,EAA8BC,EAAA,OAA0B,+EAEzDmI,EA6GU,SA3G4D1H,EAAA,gBAAAA,EAA3C,UAAqBqC,GAAA,CAAAzC,EAAMQ,EAAa,kDAGlEH,EAuGM,IAAAC,EAAAT,EAAA,gDAtGLO,EAAA,MAAAgC,GAAA,CACCvC,EAAA,eAIUA,iCAJe,EAAAF,EAAA,MAAAuD,GAAA,CAAAlD,EAAQiP,EAAO,2GAMzC,GAAAnH,EAAA,OAAAjI,EACC,mBAAyB,EAAAF,EAAA,MAAA0C,GAAA,CAAArC,EAAQiP,EAAO,kBAC5B,OAAM,UAEf,OAAA9O,EAAA,KAAAC,EAAA,MAAAsH,GAAA,yJAQJ,GAAAI,EAAA,OAAAjI,EAIC,MAEC,SAAAA,EAAA,MAFD,QAEC,oBAAAH,EAAA,EAAAC,EACD,MAAGwD,GAAM,CAAA/C,EACiB,OAAQuH,GAAArH,EAAAT,EAAA,oDAAAQ,EAAA,IAAlCC,EAMOT,EAAA,gCAAAA,EAAA,wBAAAH,EAAA,EAFLC,EAAA,OAAAiI,GAAA,CACDvH,EAAA,OAAAD,EAAA,OAAAkC,GAAAhC,EAAAT,EAAA,yFAED,GAAAiI,EAAA,OAAAjI,EAAA,yBAAAH,EAAA,EAIEC,EAAA,OAAAsD,GAAA,CACD5C,EAAA,OAAAD,EAAA,OAAA8O,GAAA5O,EAAAT,EAAA,gIAGF,GAAAiI,EAAA,OAAAjI,EACC,kBAAyB,EAAAF,EAAA,MAAAwP,GAAA,CAAAnP,EAAQiP,EAAO,kBAC5B,OAAM,UAEf,OAAA9O,EAAA,KAAAC,EAAA,MAAAyO,GAAA,iIAQJ,GAAA/G,EAAA,OAAAjI,EACC,eAAyB,EAAAF,EAAA,MAAAyP,GAAA,CAAApP,EAAQiP,EAAO,kBAC5B,OAAM,UAEf,OAAA9O,EAAA,KACMC,EAAA,MAAA0O,GAAA,CACN1O,EAES,OAFT,KAESE,EAAAT,EAAA,QADR,SAAQ,qBAAQ,MAAAwP,yFAKalP,EAAY,KAA3CC,EAAA,YACCP,EAAA,cAAAH,EAAA,EACSC,EAAS,MAAAoP,GAAA,CAAA/O,EACTsP,EAAgB,CACxB,QAAKzP,EAAM,gBAAAA,EAAA,0FAIN,IAAAiI,EADP,GAQE,IAAAjI,EAAA,cAAAH,IANiBa,EAAAqN,EAAA,CACjB,IAAI,EACJ,OAAU,MAAM,MACjB,OACA,WAAK,GACL,eAAM,uCAGN,gBAAwC,kBACvCoB,GAAQ,CAAAhP,EAAAQ,EAAA,oHAMb,GAAAsH,EAAA,OAAAjI,EACC,eAAyB,EAAAF,EAAA,MAAA4P,GAAA,CAAAvP,EAAQiP,EAAO,kBAC5B,OAAM,UAEf,OAAA9O,EAAA,KAAAC,EAAA,MAAAoP,GAAA,2EAIDrP,EAAuC,KAAAC,EAAlC,MAA4B,MAAAA,EAAA,2GCigBlCqP,GAAeC,GAAqB,SAAYC,GAAA,WAAO,4BAA+B,EAAC,+IACvFC,GAAcF,GAAqB,SAAYC,GAAA,WAAO,2BAA8B,EAAC,gJACrFE,GAAgBH,GAAqB,SAAYC,GAAA,WAAO,6BAAgC,EAAC,gJACzFxC,GAAcuC,GAAqB,SAAYC,GAAA,+BAAAG,EAAA,EAAsC,SACrFC,GAAgBL,GAAqB,SAAYC,GAAA,WAAO,6BAAgC,EAAC,yDAM/FK,GAAe1d,EAAgB,CAC9B,KAAM,UACN,OAAQ,CAAC2d,GAAgB1S,EAAO,EAChC,WAAY,CACX,kBAAA2S,GACA,cAAAC,GACA,eAAAC,GACA,aAAAX,GACA,YAAAG,GACA,cAAAC,GACA,YAAA1C,GACA,cAAA4C,EACD,EACA,MAAO,CACN,OAAQ,CACP,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,WAAY,CACX,KAAM,OACP,EACA,YAAa,CACZ,KAAM,OACP,EACA,iBAAkB,CACjB,KAAM,MACP,EACA,sBAAuB,CACtB,KAAM,MACP,EACA,YAAa,CACZ,KAAM,OACP,EACA,iBAAkB,CACjB,KAAM,MACP,EACA,UAAW,CACV,KAAM,MACP,EACA,SAAU,CACT,KAAM,MACP,EACA,gBAAiB,CAChB,KAAM,KACP,EACA,eAAgB,CACf,KAAM,OACP,EACA,mBAAoB,CACnB,KAAM,MACP,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,EACA,aAAc,CACb,KAAM,QACN,QAAS,EACV,CACD,EACA,OAAQ,CACP,MAAMtL,EAAcC,KACd2L,EAAgBjR,KAEf,OACN,GAAG5B,GAAS,EACZ,cAAA6S,EACA,YAAA5L,CAAA,CAEF,EACA,MAAO,CACC,OACN,eAAgB5G,EAAmB,KACnC,wBAAyB,GACzB,SAAU,EACV,SAAU,GACV,YAAa,EACb,yBAA0B,GAC1B,sBAAuB,KAEvB,sBAAAwQ,GACA,2BAAAiC,GACA,YAAa,EACb,SAAU,GACV,UAAW,CAAC,GAAI,GAAI,GAAI,GAAG,EAE3B,+BAAgC,GAChC,2BAA4B,GAC5B,OAAQ,GAEV,EACA,SAAU,CACT,KAAK,KAAK,EAEL,KAAK,iBACJ,iCAA4B,KAAK,QAAQ,EAE/C,KAAK,SAAS,kBAAkB,CAC/B,KAAM,KAAK,SACX,YAAa,KAAK,mBAClB,EAEG,KAAK,WAAa,WACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAEpB,EACA,eAAgB,CACf,KAAK,4BAA4B,CAClC,EACA,SAAU,CACT,GAAG9d,EAAUc,EAAmBmK,GAAarK,CAAiB,EAC9D,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,oBAA6B,CACrB,OAAAmd,EACR,EACA,oBAA6B,CACrB,OAAAC,EACR,EACA,aAAmC,CAClC,OAAO,KAAK,SAAS,oBAAoB,KAAK,QAAQ,CACvD,EACA,MAAuB,CACtB,OAAQ,KAAK,QAA6B,IAC3C,EACA,UAAwC,CACvC,OAAI,KAAK,KACD,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,EAEtE,IACR,EACA,cAAwB,CACvB,OAAO,KAAK,cAAgB,QAC7B,EACA,eAAyB,CACpB,YAAK,OAAS,KACV,GAED,KAAK,eAAe,cAAc,KAAK,KAAK,IAAI,CACxD,EACA,YAAsB,CAGjB,QAAK,OAAS,KACV,SAGF,MAAAhS,EAAW,KAAK,eAAe,mBAAmB,EAClDsG,EAAetG,EAAS,QAAQ,KAAK,KAAK,IAAI,EAC9CuG,EAASC,GAA0BxG,EAAUsG,EAAe,KAAK,QAAS,EAKhF,MACC,CAHqB,CAAC,CAFJnH,GAA+BoH,CAAM,EAErB,KAAM0L,GAAcA,IAAc5S,EAAmB,IAAI,GAI3F,CAAC,KAAK,iBACN,KAAK,mBACL,EAAE,KAAK,YAAc,KAAK,WAAW,OAAS,EAEhD,EACA,SAAmD,OAClD,MAAMiP,EAAW,CAChB,CAAE,MAAO,KAAK,QAAQ,SAAS,eAAe,EAAG,MAAO,OAAQ,EAChE,CAAE,MAAO,KAAK,QAAQ,SAAS,cAAc,EAAG,MAAO,MAAO,GAG3D,KAAK,WAAW,QACVA,EAAA,KAAK,CAAE,MAAO,KAAK,QAAQ,SAAS,gBAAgB,EAAG,MAAO,QAAU,GAG5E,MAAA4D,EAAa,CAAE,MAAO,KAAK,QAAQ,SAAS,gBAAgB,EAAG,MAAO,UAC5E,OAAI,KAAK,iBAAmB,CAACC,GAAQ,KAAK,QAAQ,EACjD7D,EAAS,QAAQ4D,CAAU,EAE3B5D,EAAS,KAAK4D,CAAU,EAIxB,KAAK,oBACL5a,EAAA,KAAK,aAAL,YAAAA,EAAiB,QAAS8a,IAC1B,KAAK,WAAW,WAAW,YAAc,wBAEzC9D,EAAS,QAAQ,CAAE,MAAO,OAAQ,MAAO,OAAQ,EAG3CA,CACR,EACA,YAAsB,CACd,SACN,CAAC,KAAK,aACL,KAAK,OACH,KAAK,iBAAmB,KAAK,gBAAgB,eAAe,KAAK,KAAK,IAAI,GAC3E,KAAK,YAET,EACA,gCAA0C,WACzC,MAAO,CAAC,GAAC5L,GAAA5D,GAAAxH,EAAA,KAAK,eAAL,YAAAA,EAAoB,KAApB,YAAAwH,EAAwB,OAAxB,MAAA4D,EAA8B,+BACxC,EACA,2BAA0C,CACzC,OAAO,KAAK,eAAe,yBAC5B,EACA,8BAAwC,CAChC,QAAQ,KAAK,yBACrB,EACA,aAAuB,WACtB,MAAO,GAAQ,KAAK,QAAQA,GAAA5D,GAAAxH,EAAA,KAAK,kBAAL,YAAAA,EAAuB,KAAK,KAAK,QAAjC,YAAAwH,EAAyC,KAAK,YAA9C,MAAA4D,EAAyD,OACtF,EACA,mBAA+C,CAC9C,OAAO,KAAK,eAAe,oBAC5B,EACA,iBAAmC,CAC9B,QAAK,oBAAsB,KACvB,YAEF,MAAAgN,EAA+C,KAAK,kBAAkB,KAC5E,OAAIA,GAAA,MAAAA,EAAe,WACXA,EAAc,WAAW,QAE1B,IACR,EACA,WAAoB,CACnB,OAAO,KAAK,aAAa,KAAK,SAAU,KAAK,kBAAkB,CAChE,EACA,qBAA8B,CAC7B,OAAO,KAAK,QAAU,KAAK,QAAQ,OAAS,KAAK,aAAa,MAC/D,EACA,cAAuB,CACtB,OAAQ,KAAK,SAAW,KAAO,KAAM,eAAe,CACrD,EACA,gBAAyB,CACxB,GAAI,KAAK,OAAS,MAAQ,KAAK,WAAa,OACpC,SAGR,MAAM2C,EAA2B,KAAK,gBAMtC,GAJIA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,KAAK,IAAI,GAI1DA,EAAQ,KAAK,KAAK,IAAI,EAAE,OAAS,KAAK,SAClC,SAGR,GAAIA,EAAQ,KAAK,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAG,CACrC,MAAAC,EAAWD,EAAQ,KAAK,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,KACxD,GAAIC,GAAA,MAAAA,EAAU,KACN,OAAAA,EAAS,KAAK,OAAS,CAEhC,CAEO,QACR,EACA,mBAA4B,CACpB,YAAK,UAAY,KAAK,YAAc,EAC5C,EACA,aAAsB,CACjB,QAAK,OAAS,KACV,SAGR,MAAMD,EAA2B,KAAK,gBAElC,OAAAA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,KAAK,IAAI,EACtD,EAGJA,EAAQ,KAAK,KAAK,IAAI,EAAE,OACpBA,EAAQ,KAAK,KAAK,IAAI,EAAE,OAAS,EAGlC,CACR,EACA,cAAqC,CACpC,OAAO,KAAK,gBAAgB,KAAK,SAAU,KAAK,mBAAoB,KAAK,cAAc,CACxF,EACA,WAAkC,CACjC,MAAME,EAAgB,KAAK,qBAAqB,KAAK,YAAY,EAC1D,YAAK,gBAAgBA,CAAa,CAC1C,EACA,eAAsC,CACrC,MAAMlc,EAAS,KAAK,UAAY,KAAK,YAAc,GACnD,OAAO,KAAK,UAAU,MAAMA,EAAQA,EAAS,KAAK,QAAQ,CAC3D,EACA,UAA0B,CAClB,OAAAmc,GAAoB,KAAK,SAAS,CAC1C,EACA,YAA+B,CAC1B,OAAC,KAAK,KAIS,KAAK,YAAY,cACnC,KAAK,gBACL,KAAK,KAAK,KACV,KAAK,SACL,KAAK,oBAEY,OAAQlT,GAAS,GAAQA,GAAQ,OAAO,KAAKA,CAAI,EAAE,OAAO,EATpE,EAUT,EACA,oBAA6B,OACxB,OAAAhI,EAAA,KAAK,kBAAL,MAAAA,EAAsB,QAAU,CAAC,KAAK,gBAAgB,SAAS,KAAK,WAAW,EAC3E,KAAK,gBAAgB,CAAC,EAGvB,KAAK,WACb,EACA,UAAmB,OACZ,MAAAmb,EAAcnL,GAAiBA,EAAK,OAAO,CAAC,EAAE,oBAAsBA,EAAK,MAAM,CAAC,EAEhFoL,EAAmB,GAEzB,QAASC,EAAI,EAAGA,GAAK,KAAK,eAAgBA,IAAK,CAC9C,GAAI,KAAK,iBAAmB,CAAC,KAAK,gBAAgB,SAASA,CAAC,EAC3D,SAED,MAAMC,EAAkB,KAAK,gBAAgB,KAAK,SAAUD,CAAC,EAAE,OACzDE,EAAa,KAAK,aAAa,KAAK,SAAUF,CAAC,EAC/CG,EAAQ,KAAK,OAChB,KAAK,QAAQ,SAAS,mBAAoB,CAC1C,eAAgBF,EAChB,YAAa,CAAE,QAASC,EAAY,MAAOD,CAAgB,CAC1D,GACD,KAAK,QAAQ,SAAS,mBAAoB,CAC1C,eAAgBC,EAChB,YAAa,CAAE,MAAOA,CAAW,EAChC,EACA,IAAAE,EAAa,KAAK,cAAcJ,CAAC,EAErC,GAAI,GAAGI,CAAU,IAAO,GAAGJ,CAAC,GAC3BI,EAAa,GAAG,KAAK,QAAQ,SAAS,YAAY,CAAC,IAAIA,CAAU,OAC3D,CACN,MAAMC,EAAmBC,GAA4C,UACpE3b,EAAA,KAAK,OAAL,YAAAA,EAAW,MAET,GACA,IAAI,KAAK,QAAQ,SAAS,mBAAmB,CAAC,GACpCyb,EAAAN,EAAW,GAAG,KAAK,cAAcE,CAAC,CAAC,GAAGK,CAAgB,EAAE,CACtE,CACAN,EAAS,KAAK,CACb,MACE,KAAK,QAAUG,GAAeD,EAC5B,GAAGG,CAAU,KAAKD,CAAK,IACvBC,EACJ,MAAOJ,CAAA,CACP,CACF,CACO,OAAAD,CACR,EACA,UAAgD,CACxC,YAAK,gBACT,CAAE,QAAS,GAAO,MAAO,IACzB,KAAK,SAAS,mBAClB,EACA,iBAA2B,CAC1B,OAAO,KAAK,WAAa,OAC1B,EACA,kBAA4B,CAC3B,OAAO,KAAK,WAAa,QAC1B,EACA,aAAuB,CACf,YAAK,mBAAmB,YAAY,cAC5C,EACA,cAAwB,CAChB,YAAK,YAAc,CAAC,KAAK,WACjC,EACA,4BAAsC,CACrC,OAAO,KAAK,YAAc,CAAC,KAAK,UAAU,QAAU,KAAK,MAC1D,CACD,EACA,QAAS,CACR,wBAAyB,CACpB,QAAK,MAAQ,KAAK,SAAU,CACzB,MAAA1S,EAAW,KAAK,eAAe,mBAAmB,EAClDsG,EAAetG,EAAS,QAAQ,KAAK,KAAK,IAAI,EAEpD,GAAIsG,EAEI,OADS4M,GAA2BlT,EAAUsG,EAAc,KAAK,QAAQ,CAGlF,CACA,MAAO,EACR,EACA,YAAY6M,EAA0B,CACrC,GAAIA,IAAc,KAAM,CAClB,WAAM,YAAa,IAAI,EAE5B,MACD,CACA,KAAK,MAAM,YAAa,CACvB,YAAa,KAAK,mBAClB,UAAAA,CAAA,CACA,CACF,EACA,4BAA6B,OACvB,gBAAW,MAAM,wBAAyB,CAC9C,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,WAAW7b,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,KAAM,SACN,KAAM,oBACN,CACF,EACA,4BAA4BiQ,EAAsB,CAC7C,IAAC,KAAK,cACT,OAGK,MAAA6L,EAAuBtF,GAAWuF,EAAyC,EAAE,MAE/E9L,GAASA,EAAM,OAAS,GAAK,CAAC,KAAK,iBAAmB,CAAC6L,IAC1D,KAAK,yBAAyB,EAE9B,WAAW,IAAM,CAChB,KAAK,2BAA6B,GAClC,KAAK,+BAAiC,GACtCE,GAAoB,KAAK,yBAA0B,CAAE,iBAAkB,EAAM,IAC3E,GAAG,EAER,EACA,6BAA8B,CACzB,KAAK,iCACR,KAAK,2BAA6B,GAClC,KAAK,+BAAiC,GACtCA,GAAoB,KAAK,yBAA0B,CAAE,iBAAkB,EAAO,GAEhF,EACA,0BAA2B,CACfxF,GAAAuF,EAAyC,EAAE,MAAQ,OACnDvF,GAAAyF,EAA4C,EAAE,MAAQ,MAClE,EACA,cAAc,CAAE,OAAAC,GAA6B,OACtC,MAAAC,EAAY,KAAK,QACpBC,GAAa,KAAK,OAAO,EACzBlB,GAAoB,KAAK,YAAY,EAElClT,EAAOmU,EAAU,OAAS,EAAIA,EAAYE,GAE3C,cAAS,8BAA8B,EAAI,EAChD,KAAK,SAAS,4BAA4B,KAAK,UAAUrU,EAAM,KAAM,CAAC,CAAC,EAElE,gBAAW,MAAM,6BAA8B,CACnD,WAAWhI,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,WAAYkc,IAAW,iBAAmB,SAAW,OACrD,WAAY,KAAK,UACjB,UAAW,KAAK,SAChB,kBAAmB,KAAK,YAAc,KAAK,WAC3C,KAAM,CAAC,KAAK,YAAc,CAAC,KAAK,WAAa,YAAc,KAAK,YAChE,eAAgB,KAAK,WACrB,CACF,EACA,mBAAoB,CACd,cAAS,8BAA8B,EAAK,EAC5C,cAAS,4BAA4B,EAAE,EAC5C,KAAK,eAAe,CAAE,KAAM,QAAU,EACvC,EACA,iBAAkB,CACb,IAAC,KAAK,KACT,OAGK,MAAE,MAAAjM,CAAM,EAAI,KAAK,SAEvB,KAAK,4BAA4B,EAE7B,IACH,KAAK,WAAW,KAAK,KAAMmM,GAAanM,CAAK,EAA2B,WAAW,QAC3EhI,EAAO,CACf,QAAQ,MAAMA,CAAK,EACnB,MACD,CAEK,cAAS,8BAA8B,EAAK,EAEjD,KAAK,eAAe,CAAE,KAAM,MAAQ,EACrC,EACA,eAAe,CAAE,KAAAqU,GAAqC,OAChD,gBAAW,MAAM,6BAA8B,CACnD,WAAWtc,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,WAAY,KAAK,UACjB,UAAW,KAAK,SAChB,KAAM,KAAK,YACX,KAAAsc,CAAA,CACA,CACF,EACA,MAAM,gBAAgB,CAAE,OAAAnT,GAAqC,CACxD,GAAC,KAAK,KAIV,IAAIA,IAAW,iBAAkB,CAChC,MAAME,EAAmB,CACxB,UAAW,KAAK,WAAW,KAC3B,WAAY,KAAK,UACjB,UAAW,KAAK,SAChB,KAAM,CAAC,KAAK,YAAc,CAAC,KAAK,WAAa,OAAS,KAAK,aAGvD,KAAK,cAAc,IAAI,0BAA2BA,CAAgB,EAClE,gBAAW,MAAM,6BAA8BA,CAAgB,CACrE,CAIA,GAFK,iBAAY,0BAA0B,KAAK,IAAI,EAEhD,KAAK,WAAY,CACf,kBAAa,KAAK,KAAMF,CAAM,EACnC,MACD,CAEI,IACH,KAAK,WAAW,KAAK,KAAM,KAAK,aAAc,gBAAgB,QACtDlB,EAAO,CACf,QAAQ,MAAMA,CAAK,EACnB,MACD,CAEI,KAAK,YAAc,GACtB,KAAK,UAAU,CACd,MAAO,KAAK,QAAQ,SAAS,qCAAsC,CAClE,YAAa,CACZ,MAAO,GAAG,KAAK,QAAQ,EACxB,EACA,EACD,QAAS,KAAK,QAAQ,SAAS,0CAA0C,EACzE,KAAM,UACN,SAAU,IACV,EAGF,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC/B,EACA,gBAAiB,CAChB,KAAK,oBAAoB,QAAQ,CAClC,EACA,eAAegI,EAAe,CAC7B,KAAK,YAAcA,EAEd,gBAAW,MAAM,0BAA2B,CAChD,WAAY,KAAK,UACjB,aAAcA,EACd,UAAW,KAAK,WAAW,KAC3B,0BAA2B,KAAK,SAAW,KAAK,SAAS,KAAO,GAChE,KAAM,KAAK,SACX,CACF,EACA,iBAAkB,CACjB,KAAK,SAAW,GACX,gBAAW,MAAM,0BAA2B,CAChD,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAM,KAAK,SACX,KAAM,kBACN,CACF,EACA,gBAAiB,CAChB,KAAK,WAAa,KAAK,UAAU,EAAI,KAAK,SAC3C,EACA,SAAU,CACT,KAAK,MAAM,SAAS,CACrB,EACA,WAAY,CACX,KAAK,MAAM,WAAW,CACvB,EACA,oBAAoBA,EAAO,OAC1B,KAAK,YAAcA,EACd,gBAAW,MAAM,wBAAyB,CAC9C,WAAWjQ,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAM,KAAK,SACX,cAAe,KAAK,YACpB,UAAW,KAAK,SAChB,YAAa,KAAK,UAClB,CACF,EACA,iBAAiBuc,EAAkB,OAClC,KAAK,SAAWA,EAChB,MAAMC,EAAU,KAAK,KAAK,KAAK,UAAY,KAAK,QAAQ,EACpDA,EAAU,KAAK,cAClB,KAAK,YAAcA,GAGf,gBAAW,MAAM,6BAA8B,CACnD,WAAWxc,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAM,KAAK,SACX,cAAe,KAAK,YACpB,UAAW,KAAK,SAChB,YAAa,KAAK,UAClB,CACF,EACA,oBAAoByc,EAAkC,CACrD,MAAMC,EAAW,KAAK,YACjB,cAAS,oBAAoB,CAAE,KAAM,KAAK,SAAU,KAAMD,EAAa,EAEtE,MAAAE,EAAmB,KAAK,MAAM,cACpC,GAAIA,EAAkB,CACf,MAAAC,EAAcD,EAAiB,SAAS,CAAC,EAE3CC,GACSA,EAAA,SAAS,EAAG,CAAC,CAE3B,CAEA,KAAK,uBAAuB,EACvB,KAAK,cAAc,IAAI,6BAA8B,CACzD,SAAUH,EACV,SAAUC,CAAA,CACV,EACG,KAAK,YACH,gBAAW,MAAM,6BAA8B,CACnD,cAAeA,EACf,SAAUD,EACV,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAM,KAAK,SACX,CAEH,EACA,YAAYI,EAAgB,CAC3B,IAAItB,EAAa,EACjB,QAASF,EAAI,EAAGA,GAAK,KAAK,eAAgBA,IAC3BE,GAAA,KAAK,qBAAqB,KAAK,gBAAgBsB,EAAS,EAAGxB,CAAC,CAAC,EAAE,OAE9E,MAAMG,EAAQ,KAAK,QAAQ,SAAS,mBAAoB,CACvD,eAAgBD,EAChB,YAAa,CAAE,MAAOA,CAAW,EACjC,EACKuB,EAAavB,EAAa,EAAI,KAAKC,CAAK,IAAM,GAC7C,OAAAqB,EAAS,KAAK,QAAQ,SAAS,eAAe,GAAK,KAAK,YAAc,GAAKC,CACnF,EACA,gBACCC,EACAC,EACAC,EAAkClV,EAAmB,KAC9B,CACvB,IAAIoU,EAAkC,GAYtC,OAVI,KAAK,OACRA,EAAY,KAAK,YAAY,iBAC5B,KAAK,KACLY,EACAC,EACA,KAAK,SACLC,CAAA,GAIEd,EAAU,SAAW,GAAK,CAAC,MAAM,QAAQA,CAAS,EAC9C,GAGDA,CACR,EACA,qBAAqBA,EAAuD,CAC3E,OAAI,KAAK,SAAW,CAAC,KAAK,6BAClB,MAAM,QAAQ,KAAK,OAAO,EAC9B,KAAK,QAAQ,IAAKlM,IAAW,CAC7B,KAAMA,GACJ,EACF,CACA,CACC,KAAM,KAAK,OACZ,GAGGkM,CACR,EACA,gBAAgBA,EAAuD,CAClE,OAAC,KAAK,QAIV,KAAK,YAAc,EACZA,EAAU,OAAO,CAAC,CAAE,KAAAe,CAAA,IAAWC,GAAeD,EAAM,KAAK,MAAM,CAAC,GAJ/Df,CAKT,EACA,aACCY,EACAC,EACAC,EAAkClV,EAAmB,KACpD,WACG,IAAC,KAAK,KACF,SAGJ,IAAAqD,GAAA5D,GAAAxH,EAAA,KAAK,kBAAL,YAAAA,EAAuB,KAAK,KAAK,QAAjC,YAAAwH,EAAyCuV,KAAzC,MAAA3R,EAAoD,eAAe,SAC/D,SAGR,MAAMgS,EAAe,KAAK,gBAAgBL,EAAUC,EAAaC,CAAc,EACzEhC,EAAgB,KAAK,qBAAqBmC,CAAY,EACrD,YAAK,gBAAgBnC,CAAa,EAAE,MAC5C,EACA,MAAO,CAEN,KAAK,YAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,IAAIrT,EAAiC,GACrC,GAAI,KAAK,WAAa,MAAQ,KAAK,OAAS,KAAM,CAC3C,MAAAyV,EAAU,KAAK,yBACPzV,EAAAC,GAA+BwV,CAAO,CACrD,CACA,KAAK,eAAiBzV,EAAY,SAAW,EAAIG,EAAmB,KAAOH,EAAY,CAAC,EACpF,KAAK,WAAW,OAAS,EAC5B,KAAK,SAAS,oBAAoB,CACjC,KAAM,KAAK,SACX,KAAM,SACN,EACS,KAAK,cAAgB,UAC/B,KAAK,SAAS,oBAAoB,CACjC,KAAM,KAAK,SACX,KAAM,QACN,CAEH,EACA,wBAAyB,CACxB,KAAK,yBAA2B,GAChC,KAAK,sBAAwB,IAC9B,EACA,oBAAqB,CACf,oBAAe,yBAAyB,IAAI,EACjD,KAAK,YAAY,4BAClB,EACA,WAAWR,EAAeqK,EAAsB,CAC/C,KAAM,CAAE,SAAA+F,CAAS,EAAI,KAAK,WAAWpQ,CAAK,EAAEqK,CAAG,EAC/C,MACC,CAAC,CAAC+F,GAAY,CAAC,QAAS,QAAS,QAAS,OAAQ,OAAQ,MAAO,MAAM,EAAE,SAASA,CAAQ,CAE5F,EACA,eAAepQ,EAAeqK,EAAsB,CAC7C,MAAE,SAAAgG,EAAU,SAAAF,GAAa,KAAK,WAAWnQ,CAAK,EAAEqK,CAAG,EAClD,OAAC,EAAEgG,GAAYF,EACvB,EACA,MAAM,mBAAmBnQ,EAAeqK,EAAa,CAC9C,MAAE,GAAA6F,EAAI,KAAAtP,EAAM,SAAAuP,EAAU,cAAA+F,EAAe,SAAA7F,GAAa,KAAK,WAAWrQ,CAAK,EAAEqK,CAAG,EAElF,GAAI6F,EAAI,CACP,MAAMiG,EAAM,KAAK,eAAe,aAAajG,EAAI,WAAYC,EAAUE,CAAQ,EAC/E+F,GAAA,OAAOD,EAAK,CAAChG,EAAU+F,CAAa,EAAE,KAAK,GAAG,CAAC,EAC/C,WACM,CACA,MAAAG,EAAe,QAAUhG,EAAW,WAAazP,EACjD0V,EAAO,MAAM,MAAMD,CAAY,EAAE,KAAK,MAAOE,GAAMA,EAAE,MAAM,EACjEH,UAAOE,EAAMnG,CAAQ,CACtB,CACD,EACA,MAAM,kBAAmB,CACxB,MAAMA,EAAW,KAAK,KAAM,KAAK,QAAQ,WAAY,GAAG,EAClDmG,EAAO,IAAI,KAAK,CAAC,KAAK,UAAU,KAAK,aAAc,KAAM,CAAC,CAAC,EAAG,CACnE,KAAM,mBACN,EAEMF,UAAAE,EAAM,GAAGnG,CAAQ,OAAO,CAChC,EACA,kBAAkBnQ,EAAeqK,EAAa,CAC7C,KAAK,yBAA2B,GAEhC,KAAK,sBAAwB,CAC5B,KAAM,KAAK,KAAM,KACjB,SAAU,KAAK,SACf,YAAa,KAAK,mBAClB,MAAArK,EACA,IAAAqK,CAAA,CAEF,EACA,cAAcuL,EAAqB,CAC9B,QAAK,OAAS,KACjB,OAAOA,EAAc,EAGtB,MAAMxZ,EAAW,KAAK,SAChB6Z,EAAU,KAAK,yBACfO,EAAsBP,GAAA,YAAAA,EAAUL,GAElC,OAAAY,GAAuBC,GAASD,CAAmB,EAC/CA,GAAA,YAAAA,EAAqB,YAEzB,EAACpa,GAAA,MAAAA,EAAU,cAAeA,EAAS,YAAY,QAAUwZ,EACrDA,EAAc,EAGfxZ,EAAS,YAAYwZ,CAAW,CACxC,EACA,iBAAkB,CAEjB,KAAK,SAAW,GAChB,MAAMc,EAAY,KAAK,cAAc,IAAK1O,GAASA,EAAK,IAAI,EAC5D,KAAK,SAAW,KAAK,UAAU0O,CAAS,EAAE,OACtC,KAAK,SAAW,KAAK,wBAExB,KAAK,SAAW,GAElB,EACA,iBAAiBC,EAAa,CACxB,WAAM,YAAaA,CAAG,CAC5B,EACA,YAAa,CACZ,GAAI,KAAK,KAAM,CACd,MAAM5b,EAAoB,CACzB,KAAM,KAAK,KAAK,KAChB,WAAY,CACX,SAAU,CAAC,KAAK,KAAK,QACtB,GAGI,oBAAe,qBAAqBA,CAAiB,CAC3D,CACD,EACA,gBAAiB,CAChB,GAAI,CAAC,KAAK,WAAY,OAGrB,KAAK,WAAW,OAAS2Y,IACzB,KAAK,WAAW,WAAW,YAAc,wBAGzC,KAAK,SAAS,oBAAoB,CACjC,KAAM,SACN,KAAM,OACN,CAEH,EACA,cAAe,CACd,KAAK,MAAM,cAAc,CAC1B,EACA,eAAgB,CACf,KAAK,OAAS,GACL,uBAAc,IAAI,cAAc,QAAS,CAAE,IAAK,GAAK,EAAC,CAChE,CACD,EACA,MAAO,CACN,MAAO,CACN,KAAK,KAAK,CACX,EACA,YAAa,CACR,KAAK,WAAa,UAAU,KAAK,eAAe,CACrD,EACA,cAAe,CACd,QAAQ9S,EAA4B,CAC/B,KAAK,UAAYA,GACpB,KAAK,SAAS,uBAAuB,CACpC,MAAO,KAAK,SACZ,QAASA,EAAK,MAAOoH,GAASyL,GAAQzL,EAAK,IAAI,CAAC,EAChD,CAEH,EACA,UAAW,GACX,KAAM,EACP,EACA,SAASa,EAAsB,CAC9B,KAAK,gBAAgB,EACrB,KAAK,4BAA4BA,CAAK,CACvC,EACA,WAAW+N,EAA2BC,EAA4B,CAC7DD,EAAQ,QAAU,CAACC,EAAS,QAAU,KAAK,cAAgB,SAC9D,KAAK,eAAe,EACV,CAACD,EAAQ,QAAU,KAAK,cAAgB,UAClD,KAAK,oBAAoB,OAAO,CAElC,EACA,mBAAmBE,EAAqB,CACvC,KAAK,SAAS,kBAAkB,CAC/B,KAAM,KAAK,SACX,YAAAA,CAAA,CACA,CACF,EACA,OAAOC,EAAmB,CACpB,WAAM,SAAUA,CAAS,CAC/B,CACD,CACD,CAAC,g2CAr+CQ/R,GAAc,2lBARtBzC,EAgjBM,uBAhjBwCC,EAAS,EAAAC,EAAA,aAAAC,EAAA,YAAAC,EAAA,mBAE/C,YAAAC,EAAc,EAAU,IAAAA,EAAA,IAAK,IAASC,IAAAF,EAAA,cAAYA,EAA4B,gBAAAE,CAAA,2FACnEQ,EAAA2T,EAAA,CACjB,IAAI,EACH,MAAK,6BAcK,MAAAtU,EAAeC,EAUd,4CARLM,EAAkB,KAAAH,EAClBkI,EAAO,CACZ,GAAMrI,EAAA,mBACN,aACA,kBACC,wIAnBuD,gCAC9BM,EAAe,KAA3CE,EAAAC,EAAAT,EAUO,QAVP,SAUO,4CATN,CAAAA,EAAA,iBAQW,oBAPOF,EAAA,OAAAuC,GAAA,CAAAlC,EACZkI,EAAO,CACZ,kBACA,aACC,UAAK,WAEyC,QAAApI,EAAA,KAAAA,EAAA,GAAAW,GAAAG,GAAAf,EAAA,iJAiBlD,YAIE,IAHAiI,EAAe,OAAA9H,EACJmU,EAAuB,CAClC,cAAOtU,EAAA,qCAAAA,EAAA,sBAGT,QAAAA,EAAA,wBAAM,KAAK,mBAAE,cAAa,YAAAO,EAAA,OACzB,MAA2BR,EAAAC,EAAA,oBAIpBA,EAAN,8BAAAuI,EACMhI,EAAQ,MAAC,CACf,UAAa,CAAsB,IAAAN,EAAA,GAAAW,GAAA,wBAAAb,EAAAC,EAAA,qBAEnC,0CAKWG,EAAO4C,EAAA,CACjB,WAAa/C,EAAA,YACZ,QAAAA,EAAA,gGANwB,qBAAK,UAAU,qBAAqB,iGAWrDA,EAAA,aAAAA,EAAA,kBAAAA,EAAA,YAAAuI,GAAA1I,IAAgBa,EAAA+O,EAAA,CACvB,MACA,MAAAzP,EAAU,QAAK,SAAQ,sBACxB,OAAM,GACN,SAAKA,EAAY,cACjB,MAAK,SACL,kBACC,sDARQ,QAAAC,EAAA,KAAQA,EAAC,CAAO,EAAAc,GAAAf,EAAA,iGAYnB,GAAAiI,EAAA,8CADIpI,EAAY,EAAAa,EAAAyC,EAAA,CAGrB,MAAgB,uBAAoC,QAAsEnD,EAAA,2BAAAA,EAAA,4BAAAA,EAAA,qCAuB3H,EAAAuU,GAAA,CACO,QAAAjU,EAAA,KAAAH,EACDsP,EAAU,CACd,MAAM1P,EAAY,UAAAC,EAAA,uBACnB,KAAK,WACJ,OAAQA,EAAA,WAAU,KAAS,YAAmB,SAAoDA,oBAA0BA,EAAW,0BAAAA,EAAA,YAAAA,EAAA,iBAAAA,EAAA,wJAtB/G,oCAazB,kBAAMM,EAAK,KACPC,EAAA,aAAAR,EAAAC,EAAA,6FAbJ,kBAAMM,EAAK,KAAAC,EAAA,OACV,MAAgER,EAAAC,EAAA,0BAChE,CAAsBO,EAAA,cAAAE,EAAAT,EAAA,8CAAQG,EAAAU,EAAA,gCAG7BP,EAEW,KAAAE,EAFIC,EAAkBT,EAAA,wDAAAG,EAAOkI,EAAO,IAAArI,EAAA,yLA2B7C,GAAAiI,EAAK,GAAE,IAAAM,EAAAhI,EAAA,OACZ,MAIER,EAAAC,EAAA,4BAFOgB,EAAgB,CACvB,sBAAAhB,EAAA,0CAEF,QAKEA,EAAA,mBAJD,KAAM,EAAQ,qBAAAG,EACTa,EAAS,CACb,MAAO,SACP,qBAAAhB,EAAA,iEAV0C,kBAAQ,SAAQ,wDAkBxD,OADAA,EAAA,cAAAuI,GAAA1I,EAAoB,EAAAC,EAAA,OAG1B,YAAAC,EAAAC,EAAA,oBAEA,yCACC,MAcaD,EAAAC,EAAA,+BAZDwU,EAAU,CACpB,aACA,WAAKxU,EAAA,SACN,sBAAUA,EAAA,yBAAAC,EAAA,KAAAA,EAAA,GAAAW,GAAA,kBAEC,WAAO,oBAEgBJ,EAAAC,EAAAT,EAAA,2DACzB,EAAkB,EAAAF,EAAAkD,EAAA,KAAAC,GAAAjD,EAAA,cAAA8S,IACpBjT,EAAQ,EAAAa,EAAA+T,EAAA,CACb,MAAKzU,EAAM,YAAA8S,CAAA,QAAAA,EAAA,6CAGuB,qBAArC,qBAYc,GAAA9S,EAAA,aAAAH,IAZSa,EAAOyC,EAAA,OAClB,UAAO,yBAUhB3C,EAAAC,EAAAT,EAAA,iBAAAA,EAAA,kEANI,QAAAM,EAAC,IAAS,CAAAH,EACRsP,EAAU,CACjB,gBACA,KAAKzP,EAAU,2BACf,KAAK,GACJ,uFAGH,IAAAiI,EAAA,OAGMmB,GAAYpJ,EAAA,wDACTU,EAAMgU,EAAA,OACd,WAAU1U,EAAA,OACV,sBAAcC,EAAY,KAAAA,EAAA,GAAAc,GAAAf,EAAA,OAAAe,GAC1B,SAAOf,EAAA,sBAAAA,EAAA,mGAvCS,GAAO,iCA0C1B,GAGOiI,EAAc,GAAQ,IAAAmB,GAAApJ,EAAA,OAD7B,cAiBM,cAAAA,EAAA,kBAAAA,EAAA,mBAAAH,EAAA,IAfG,MAAW,CACnB,YAAAE,EAAAC,EAAA,aAEA,eAIE,eAFS6B,EAAQ,CACjB,WAAA7B,EAAA,2BAAAA,EAAA,SAGK,sBAAYA,EAAA,qCADnB,UAME,wBAAAA,EAAA,cAAAH,IAJQa,EAAMgU,EAAA,OACd,WAAU1U,EAAA,OACV,sBAAcC,EAAY,KAAAA,EAAA,GAAAc,GAAAf,EAAA,OAAAe,GAC1B,SAAOf,EAAA,sBAAAA,EAAA,2GAKkF,IAAAA,EAAA,aAAAA,EAAA,aAAAA,EAAA,iBAAAA,EAAA,UAAAA,EAAA,+BAAAuI,GAMrF1I,IAAmBC,EAAA,OACzB,YAAAC,EAAAC,EAAA,mBAEsB,mCAEpBA,EAAA,QAAAH,IAAAa,EAAAG,EAAA,CAAQ,IAAQ,IAA6C,QAAAP,EAAA,KAAAE,EAAmDC,EAAkBT,EAAmB,oDAAAA,EAAA,6FAQrJ,KAAAH,EAAA,EAAAa,EAAAG,EAAA,CAAQ,IAAQ,YAA6CP,EAAS,KAAAE,EAA8BC,EAAST,EAAA,oDAAAA,EAAA,kDAOxG,2BACGU,EAAMgU,EAAA,OACd,WAAU1U,EAAA,OACV,sBAAcC,EAAY,KAAAA,EAAA,GAAAc,GAAAf,EAAA,OAAAe,GAC1B,SAAOf,EAAA,sBAAAA,EAAA,mGAzBS,GAAO,iCA6B1B,GAAMiI,EAAO,OAAA1H,EAA0B,MAAe,CAAC,QAAaP,EAAoB,0CAC5E,sCAAmBA,EAAA,aAAAH,IAAAC,EAAE,MAAO,CAAQ,YAAAC,EAAAC,EAAA,eAC9C,0CAA6B,MAAAD,EAA2BC,EAAd,kBAC1CG,EAA2CwU,EAAA,mBAA9BxU,EAAAU,EAAA,cAAAP,EAAA,qCAGE,QAAAN,EAAA,kBAAAH,MAA0B,MAAO,OAChD,MAMME,EAAAC,EAAA,4BALL,MAIED,EAAA,CAAAC,EAAA,6CAFQ4U,EAAM,CACd,WAAiB5U,EAAA,8GAUd,wBAPA,KAAAO,EAAA,OACL,MAKeR,EAAAC,EAAA,2BALmB6U,EAAS,SACW,MAAA9U,EAAAC,EAAA,wCACrDM,EAEW,KAAAE,EAFIC,EAAkBT,EAAA,wDAAAG,EAAOkI,EAAO,IAAArI,EAAA,qIAQtC,UAAAA,EAAA,qBAAAA,EAAA,8BAAAH,EAAA,IACH,MAAO,OAEf,MAAiFE,EAAAC,EAAA,8BAAzB8U,EAAS,OAAA9U,EAAA,wDAGvC,iCAAAA,EAAA,WAI0BA,EAAA,oBAAAA,EAAA,eAAAH,MAAU,MAAO,OACrE,MAKWE,EAAAC,EAAA,iBAJPG,EAAAU,EAAA,cACHP,EAEW,KADsCE,EAAAC,EAAAT,EAAA,6DAAAA,EAAA,qBAAAG,EAAAkI,EAAA,SAA7CrI,EAAO,UAAS,WAAAM,EAAA,qFAKN,QAAAN,EAAA,YAAAA,EAAA,gCAAAH,EAAA,IAAsD,MAAO,OAC5E,MAAqDE,EAAAC,EAAA,iBAGtCoJ,GAAApJ,EAAU,OAAI,mCAAW,mBAAAA,EAAA,YAAAA,EAAA,aAAAH,EAAA,IAAU,MAAO,aACzCE,EAAeC,EAAA,4BAAQA,EAAA,iBAAAH,IAAAa,EAAEG,EAAa,CAAE,IAAI,EAAS,MAAId,EAAGC,EAAA,eAAC,uCAE4BM,EAAS,KAAAE,EAAAC,EAAAT,EAAA,gHAKlF,KAAhC,UAA0D,CAC1D,GAAAA,EAAA,eAAAoJ,GAAApJ,EAAA,qCAAAH,EAAA,EAEoCa,EAAAoU,EAAA,CAClC,IAAK,QAAA9U,EAAA,gBAAAA,EAAA,WAAAA,EAAA,yEAKoB,GAAM,GADlCA,EAAA,cAAAA,EAAA,qBAAAA,EAuBM,QAnBC,CAAAA,EAAA,YAAAA,EAAA,mBAAAH,EAAA,EAAAC,EAAE,MAAO,aAEJC,EAAMC,EAAA,iBAChBA,EAAA,QAAAH,EAAA,EAAkBC,EAAA,MAAA6C,GAAA,CAAAxC,EAAMU,EAAO,iGAG/B,QACCA,EAMS,cANDP,EAAQ,KAA2CH,EAAAiI,EAAA,0CAC/C,IAAI,cACX9H,EAAQ,KAAOC,EAAA,kKAQlB,KAAAV,EAAA,EAAAa,EAAAG,EAAA,iBAAAP,EAAA,0CAIW,SAAAN,EAAA,aAAAA,EAAA,mBAAAA,EAAA,QAAAH,EAAA,IAAoD,MAAO,OAC1E,MAAsCE,EAAAC,EAAA,8DAGvB,WAAAA,EAAA,aAAAA,EAAA,UAAAH,EAAA,IAAiC,MAAO,OACvD,MAAuFE,EAAAC,EAAA,mBAA1Da,EAAW,CAAC,KAAK,gFAC9C,MAAkCV,EAAAU,EAAA,oCAEhCP,EAIC,KAJ+BC,EAAA,QAAkE,UAAAP,EAAA,qGAQpG,QAESgB,EAAgB,CACvB,QAAO,SAAAhB,EAAA,0DAGT,QAIEA,EAAA,iBAHD,KAAK,EAAO,qBAAAG,EACJa,EAAgB,CACvB,mBAAAhB,EAAA,6FAK2C,qBAA9C,IAAAA,EAAA,YAAAA,EAAA,eAG4BoJ,GAAyCpJ,EAAA,qCAAAA,EAAA,YAA8BA,EAAgB,uBAAeA,aAAY,OAAQ,GAAAA,EAAA,kCAAAA,EAAA,0BADtJ,GAQOH,EAAA,EAAAC,EAAE,MAAO,QAEf,MAKWC,EAAAC,EAAA,iBAJPG,EAAAU,EAAA,cACHP,EAEI,KAAAE,EAFKC,EAAET,EAAA,wDACPO,EAAA,aAAAN,EAAA,MAAAA,EAAA,QAAAC,IAAAF,EAAA,gBAAAA,EAAA,kBAAAE,CAAA,mEAKU,QAAAF,EAAA,4BAAAH,MAAoC,MAAO,QAC1D,MAEaE,EAAAC,EAAA,mBAFWa,EAAO,iGAG/B,QACCA,EAMS,cANDP,EAAQ,KAA2CH,EAAAiI,EAAA,0CAC/C,IAAI,cACX9H,EAAQ,KAAOC,EAAA,kKAQD,QAAAP,EAAA,YAAAA,EAclB,2BAAAU,EAAAqU,GAAA,kBAZIzU,EAAE,IAAI,CAAAH,EACC6U,EAAa,CACxB,KAAAhV,EAAA,KACA,UAAAA,EAAA,cACA,eAAUA,EAAA,eACV,mBAAYA,EAAA,mBACZ,SAASA,EAAE,SACX,WAAAA,EAAA,kBACA,UAAQA,EAAA,YACR,qBAAOA,EAAE,qBAAAA,EAAA,OACT,OAAAA,EAAA,OACA,UAAAC,EAAA,EAAiB,IAAEA,EAAmB,IAAAc,GAAAf,EAAA,qBAAAe,CAAA,sBAAAf,EAAA,2OAIpB,OAAAA,EAAA,YAAAA,EAYlB,0BAAAU,EAAAqU,GAAA,kBAVAzU,EAAU,KAAAH,EACA8U,EAAQ,CAClB,SAAUjV,EAAA,SACV,SAAMA,EAAI,SACV,SAASA,EAAE,UACX,KAAAA,EAAA,KACA,UAAAA,EAAA,cACA,eAAUA,EAAA,eACV,mBAAWA,EAAA,mBACX,SAAQA,EAAA,mBAAAA,EAAA,mKAIU,OAAAA,EAAA,YAAAA,EACqC,8CAAAU,EAAAqU,GAAA,kBAAzCzU,EAAW,KAAAH,EAAA6N,EAAA,iEAGP,OAAAhO,EAAA,YAAAA,EAUlB,kBAAAU,EAAAqU,GAAA,kBARIzU,EAAE,IAAQ,CAAAH,EACd+U,GAA8B,CAC9B,KAAAlV,EAAA,SACA,eAAUA,EAAA,eACV,mBAAUA,EAAQ,mBAClB,KAAUA,EAAA,KACV,SAASA,EAAE,SACX,SAAQA,EAAA,mBAAAA,EAAA,wIAIK,OAAAA,EAAA,wBAAAA,EAAA,uBAAAH,MAA6D,MAAO,QACnF,MAEaE,EAAAC,EAAA,iBAFqBG,EAAAU,EAAA,wGAKnB,QAAAb,EAAA,wBAAAH,MAAkC,MAAO,gBACxDG,EA8EM,yBA7EkC,EAAiB,EAAAF,EAAAkD,EAAA,KAAAC,GAAAjD,EAAA,YAAAmV,EAAA9X,SAAxDyC,EAIM,WAAAzC,GAAA,CAAA2C,EAAA,qBAAAH,MAJO,MAAO,OACnB,MAEME,EAAAC,EAAA,4CAGP,MAAMiI,EAAK,GAAE,IAAA1H,EAAA,eACZP,EAoEM,qBAnECH,EAAA,IAAAC,EAASkD,EAAU,KAAAC,GAAAkS,EAAA,CAAAhH,EAAAzG,KAEnB7H,EAAA,EAAcC,EAAG,aAAAC,EAAAC,EAAA,mBAEvB,IAAA3C,EAAA,IAAAqK,CAAA,YACC,eAEM,mBAAArK,CAAA,KADF,MAAG,CAEI,MAAmB0C,EAAAC,EAAA,sBAA9BS,EAAAiH,CAAA,KAAAyG,EACC,cAGYrO,EAAA,MAAAyC,GAAA,CAFWhC,EAAA,YAAYJ,EAAAU,EAAA,gGAInC,KAAoCN,EAAA,aAAAR,EAAAC,EAAA,sCAErC,GAAAiI,EAAA,OAAAkG,EACC,eAGYrO,EAAA,MAAAuD,GAAA,CAFW9C,EAAA,YAAYJ,EAAAU,EAAA,iGAInC,KAAoCN,EAAA,aAAAR,EAAAC,EAAA,uCAErC,GAAAiI,EAAA,OAAAkG,EACC,mBAGErO,EAAA,MAAA0C,GAAA,CAFqBjC,EAAA,YAAYJ,EAAAU,EAAA,oGAInC,KAAoCN,EAAA,aAAAR,EAAAC,EAAA,2CAErC,GAAAiI,EAAA,OAAAkG,EACC,cAGYrO,EAAA,MAAA+H,GAAA,CAFWtH,EAAA,YAAYJ,EAAAU,EAAA,gGAInC,KAAoCN,EAAA,aAAAR,EAAAC,EAAA,sCAErC,GAAAiI,EAAA,OAAAkG,EACC,cAGYrO,EAAA,MAAAwD,GAAA,CAFW/C,EAAA,YAAYJ,EAAAU,EAAA,gGAInC,KAAoCN,EAAA,aAAAR,EAAAC,EAAA,qCAGrC,IAAMiI,EAAK,GAAE,IAAA1H,EAAA,OAEL,MAAAR,EAAgBC,EAAK,qDACf,EAAAU,EAAAM,EAAA,CACX,IAAK,EACN,aACC,MAAKhB,UAAE,SAA4B,sGAGV,yBAAK,MADhC,GAOE,IAAAA,EAAA,eAAA3C,EAAAqK,CAAA,GAAA7H,EALW,EAAAa,EAAAM,EAAA,CACZ,IAAI,EACH,KAAK,QACN,iBACC,MAAKhB,UAAE,SAA6B,yMA3PjBH,MAAU,MAAO,OAC3C,MAAiCE,EAAAC,EAAA,iBAGlBoJ,GAAQpJ,wBAAqB,GAAQ,eAkQ1C,KAAsCA,cAA+B,CAA6BA,EAAA,aAAAA,EAAA,oBAAY,GAASA,EAAA,UAAAA,EAAA,WAAAA,EAAA,eAAAA,EAAA,+BAAAuI,GAD5H1I,IAAmBC,EAAA,OAUzB,YAAAC,EAAAC,EAAA,mBAEA,eAUgB,0BARdoV,GAAyB,CACzB,cACA,sBAAc,GACd,eAAWpV,EAAA,YACZ,cAAO,EACN,YAAAA,EAAA,SACA,OAAO,2CAAAA,EAAA,oBAIT,MAAAA,EAAA,WAAM,KAAK,EAAE,4BAAO,uBAAgB,UAAAO,EAAA,OACnC,MAUaR,EAAAC,EAAA,6BARDwU,EAAU,CACpB,YACD,WAAUxU,EAAA,+BAAAA,EAAA,iBAEC,WAAO,oBACmBQ,EAAAC,EAAAT,EAAA,gEAAO,EAAI,EAAAF,EAAAkD,EAAA,KAAAC,GAAAjD,EAAA,UAAAqV,IAAQxV,EAAM,EAAAa,EAAA+T,EAAA,CAAG,IAAKY,EAAA,MAAAA,SAEmB,8BAA5E,GAAK,GAAAlV,EAA8CsU,EAAS,OAAAzU,EAAA,gKAI5E,GAAeiI,EAAa,OAAA9H,EAAQmV,EAAS,MAAAtV,EAAA,qKC7hB/CuV,GAAe9iB,EAAgB,CAC9B,MAAO,CACN,SAAU,CAAC,CACZ,EAEA,SAAU,CACT,aAAyB,CACxB,OAAO,KAAK,QACb,EACA,aAAmE,CAC9D,OAAC,KAAK,YAGH,CACN,cAAe,KAAK,YAAY,cAChC,UAAW,IAAI,KAAK,KAAK,YAAY,SAAS,EAAE,eAAe,GAJxD,IAMT,CACD,CACD,CAAC,yEArC0FoiB,EAAAjV,EAAA,0CAA9Dc,EAAAmU,EAAA,CAAC,IAAK,EAAc,kCAC/C,mCACCvU,EAEa,KAFQC,EAAA,YAAAJ,EAAOU,EAAO,gGAGR,GAC3BL,EAEa,IAAAC,EAAAT,EAAA,0BAAAqC,KAFexB,EAAO,0OC8HhC2U,GAAc,CACnB,QAAS,UACT,KAAM,MACP,EAEAC,GAAehjB,EAAgB,CAC9B,KAAM,cACN,OAAQ,CAACiL,EAAO,EAChB,WAAY,CAAE,QAAAgY,GAAS,QAAAC,GAAS,UAAAC,EAAU,EAC1C,MAAO,CACC,OACN,WAAY,UACZ,YAAa,CACZ,CAAE,MAAO,KAAK,QAAQ,SAAS,4BAA4B,EAAG,MAAOJ,GAAY,OAAQ,EACzF,CAAE,MAAO,KAAK,QAAQ,SAAS,yBAAyB,EAAG,MAAOA,GAAY,IAAK,CACpF,EAEF,EACA,MAAO,CACN,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,WAAY,CACX,KAAM,OACP,EACA,WAAY,CACX,KAAM,OACP,EACA,YAAa,CACZ,KAAM,OACP,EACA,UAAW,CACV,KAAM,MACP,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,EACA,aAAc,CACb,KAAM,QACN,QAAS,EACV,CACD,EACA,SAAU,CACT,GAAG7iB,EAAUc,EAAmBmK,GAAahL,GAAYW,CAAiB,EAC1E,MAAuB,CACtB,OAAO,KAAK,SAAS,UACtB,EACA,UAAwC,CACvC,OAAI,KAAK,KACD,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,EAEtE,IACR,EACA,eAAyB,CACxB,OAAO,KAAK,eAAe,cAAc,KAAK,KAAK,IAAI,CACxD,EACA,eAAyB,CACxB,GAAI,KAAK,KAAM,CACd,MAAMsiB,EAAa,KAAK,eAAe,gCAAgC,KAAK,KAAK,IAAI,EAEjF,OAACA,GAAc,CAAC,MAAM,QAAQA,CAAU,GAAKA,EAAW,SAAW,EAC/D,GAGD,CAAC,CAACA,EAAWA,EAAW,OAAS,CAAC,EAAE,QAC5C,CACO,QACR,EACA,mBAA6B,OACrB,OAAC,GAAC5f,EAAA,KAAK,WAAL,MAAAA,EAAe,QACzB,EACA,mBAA6B,CACrB,OAAC,EAAE,KAAK,UAAY,KAAK,SAAS,MAAM,SAAS,UAAU,EACnE,EACA,eAAyB,CACxB,OAAO,KAAK,MAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,IAAI,CACvE,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,mBAA+C,CAC9C,OAAO,KAAK,eAAe,oBAC5B,EACA,iBAAmC,OAC9B,QAAK,oBAAsB,KACvB,YAEF,MAAAoY,EAA+C,KAAK,kBAAkB,KACxE,OAACpY,EAAAoY,GAAA,YAAAA,EAAe,aAAf,MAAApY,EAA2B,QAGzBoY,EAAc,WAAW,QAFxB,IAGT,EACA,YAAsB,CACrB,OAAI,KAAK,eAAe,0BAAkC,GAEnD,GACN,KAAK,MAAQ,KAAK,iBAAmB,KAAK,gBAAgB,eAAe,KAAK,KAAK,IAAI,EAEzF,EACA,aAAgC,CAC/B,GAAI,CAAC,KAAK,MAAQ,KAAK,oBAAsB,KACrC,YAGR,MAAM2C,EAAU,KAAK,gBAMrB,OAJIA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,KAAK,IAAI,GAI1DA,EAAQ,KAAK,KAAK,IAAI,EAAE,QAAU,KAAK,SACnC,KAGDA,EAAQ,KAAK,KAAK,IAAI,EAAE,KAAK,QAAQ,CAC7C,EACA,WAAoB,CACf,QAAK,OAAS,KACV,SAGR,MAAMA,EAA2B,KAAK,gBAElC,OAAAA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,KAAK,IAAI,EACtD,EAGJA,EAAQ,KAAK,KAAK,IAAI,EAAE,OACpBA,EAAQ,KAAK,KAAK,IAAI,EAAE,OAGzB,CACR,EACA,WAAqB,CAChB,IAAC,KAAK,KACF,SAER,MAAM8E,EAAY,KAAK,eAAe,wBAAwB,KAAK,KAAK,IAAI,EAC5E,GAAI,CAACA,GAAa,CAAC,KAAK,YAChB,SAEF,MAAAC,EAAQ,KAAK,YAAY,UAC/B,OAAOD,EAAYC,CACpB,EACA,qBAA2D,CAC1D,OAAO,KAAK,SAAS,mBACtB,EACA,YAAsB,CACd,YAAK,mBAAqB,CAAC,KAAK,UACxC,CACD,EACA,QAAS,CACR,gBAAiB,CACV,MAAAC,EAAa,KAAK,MAAM,QAC1BA,IACHA,EAAW,cAAc,CACxB,OAAQ,qBACR,EAEI,gBAAW,MAAM,wBAAyB,CAC9C,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,UAAW,KAAK,KAAK,KACrB,KAAM,SACN,KAAM,mBACN,EAEH,EACA,WAAY,CACX,KAAK,MAAM,SAAS,CACrB,EACA,aAAc,CACb,KAAK,MAAM,WAAW,CACvB,EACA,cAAe,CACd,KAAK,MAAM,cAAc,EACpB,gBAAW,MAAM,wBAAyB,CAC9C,UAAW,KAAK,KAAK,KACrB,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAM,SACN,KAAM,WACN,CACF,EACA,iBAAiBhC,EAAa,CACxB,WAAM,YAAaA,CAAG,CAC5B,EACA,mBAAmBiC,EAA0C,CACxDA,IAAeT,GAAY,KAClBtK,GAAA,KAAK,oBAAqB,SAAS,EAEnCA,GAAA,KAAK,oBAAqB,SAAS,CAEjD,EACA,cAAe,CACd,KAAK,MAAM,cAAc,CAC1B,CACD,CACD,CAAC,oZAjVAtL,EAgHU,WA9GR,OAAAC,EAAA,EAAkBa,EAAAwV,EAAA,CAClB,OAAYlW,EAAA,KACZ,SAAaA,EAAA,SACb,WAAgBA,EAAA,WAChB,YAAAA,EAAA,YACA,iBAAaA,EAAa,iDAC1B,sBAAkBA,UAAQ,SAAQ,mCAClC,YAAWA,EAAA,cACX,iBAASA,EAAO,yCAChB,UAAAA,EAAA,UACA,QAAcA,EAAA,QACd,6BAAcA,EAAY,6BAC3B,aAASA,EAAQ,aAChB,eAAWA,EAAA,aACX,SAAO,SACP,YAAWA,EAAA,iBACX,UAAYA,EAAA,UACZ,YAASA,EAAA,YACT,eAAMC,EAAE,KAAAA,EAAA,GAAAc,GAAAf,EAAK,MAAiB,eAAAe,CAAA,GAC/B,YAAId,EAAS,KAAAA,EAAA,GAAAc,GAAAf,EAAA,kBAAAe,CAAA,GACZ,SAAAd,EAAA,CAAgB,IAAEA,EAAU,GAAAc,GAAAf,EAAA,eAAAe,CAAA,iBAElB,mBAkCJf,EAAA,UAjCN,EAAAuU,GAAA,QAAMjU,EAAK,KAAAC,EAAA,aACMR,EAAaC,EAAA,4CAENU,EAAAqC,EAAA,qDAED,uBAAA9C,EAAA,KAAAA,EAAA,GAAAc,GAAAf,EAAA,WAAAe,wBAGV,2DAAAlB,EAAA,EAAAC,EAAE,OAAY,OAIlB,MAAAC,EAAcC,EAAS,eAAAS,EAAAT,EAAA,QAD/B,SAIEA,EAAA,kEAAAA,EAAA,YAAAA,EAAA,cAAAuI,GADU1I,EAAW,EAAAa,EAAAyV,EAAA,OADb,SAAAnW,EAAA,sEAQH,GAAAiI,EAJP,GAee,IAAAjI,EAAA,YAAAA,EAAA,WAAAH,EAdC,EAAAa,EAAAmU,EAAA,CACf,IAAI,EACJ,+BAGA,mCACCvU,EAMC,KANeC,EAAgB,QAAU,UAAAP,EAAA,wIAYnC,OACV,eAAAM,EAAA,KAAAN,EAAA,kBAAAA,EAAA,eAAAH,MAAgEgB,EAAoB,uHAGnE,IAAAoH,EAAjB,GAcW,IAAAjI,EAAA,gBAGDiI,EAAc,GAGX,KANFpI,EAAA,IAdoCgB,EAA0B,mDACxE,QAAAP,EAAA,KAAAN,EAAA,WAAAH,IAAAC,EAAAkD,EAAA,WAGAvC,EASWT,EAAA,6DAAAH,IAPoCC,EAAAkD,EAAA,SAAAxC,EAAAC,EAA9CT,EAMO,mDANKA,EAAA,YAAAH,IAAAC,EAAA,cACX,QAAMG,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,gBAAAA,EAAA,kBAAAE,CAAA,KAENyC,GAAiBnC,EAAA,IAAAC,EAAAT,EAAA,uCAAAG,EAAMU,EAAQ,CAAC,IAAK,0IAQ9B,GAGG,GAFQ,iBAAAP,EAAA,KAAAH,EAAQU,EAAW,CAAC,KAAK,iHAG9C,MACIV,EAAAU,EAAA,cACHP,EAEM,KAAAE,EAFGC,qBAAE,iCAAY,UACtBF,EAAA,KACK,QAAAN,EAAA,KACNA,EAAG,OAAAC,IAAAF,EAAQ,cAAQA,EAAA,gBAAAE,CAAA,IAAAO,EAAAT,EAAA,uJAOV,wCACGM,EAAO,KAAAC,EAAA,OACnB,MAEaR,EAAAC,EAAA,8BAFkBG,EAAAU,EAAA,CAAE,IAAK,MAAa,KAAK,uIAGxD,MACIV,EAAAU,EAAA,cAAAP,EAAA,uGATmB,MAAPN,EAAA,qBACjB,kBAAcM,EAAM,IAAI,CAAAH,EAAYiW,EAAU,MAAApW,EAAA,mEAapB,wBAAhBA,EAAQ,aAClB,mBAAAM,EAAA,saC7GD+B,GAAW,CACX,YACA,YACA,QAAW,aACX,YACA,wpSAYOE,GAAA,KAlBR,SAAAuG,GAAA9I,EAAAC,EAAA,0DC8LDoW,GAAe5jB,EAAgB,CAC9B,KAAM,aACN,OAAQ,CAACuP,EAAe,EACxB,WAAY,CAAE,QAAA0T,GAAS,kBAAA/Q,GAAmB,SAAA2R,EAAS,EACnD,MAAO,CACN,gBAAiB,CAChB,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,WAAY,CACX,KAAM,OACP,EACA,SAAU,CAAC,EACX,YAAa,CACZ,KAAM,OACP,EACA,UAAW,CACV,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACP,EACA,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,EACA,aAAc,CACb,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACC,OACN,2BAA4B,GAC5B,mBAAoB,GACpB,UAAW,YACX,WAAY,KACZ,WAAY,CACX,CAAE,MAAO,UAAW,MAAO,KAAK,QAAQ,SAAS,mBAAmB,CAAE,EACtE,CAAE,MAAO,YAAa,MAAO,KAAK,QAAQ,SAAS,qBAAqB,CAAE,CAC3E,EAEF,EACA,SAAU,CACT,GAAG3jB,EAAUc,EAAmBmK,GAAarK,CAAiB,EAC9D,sBAA+B,CAC9B,OAAO,KAAK,SAAS,oBACtB,EACA,iBAA2B,CAC1B,OAAO,KAAK,SAAS,kBACtB,EACA,eAAyB,CACjB,YAAK,oBAAsB,KAAK,YAAc,SACtD,EACA,mBAA6B,CAC5B,MAAMgjB,EAAW,CAChB/hB,GACAqP,GACA2S,GACAC,EAAA,EAEG,OAAC,KAAK,aAAeF,EAAS,SAAS,KAAK,YAAY,IAAI,EACxD,GAGD,CAAC,CAAC,KAAK,sBAAwB,CAAC,KAAK,eAC7C,EACA,oBAA8B,SAC7B,IAAIrR,IAASjP,EAAA,KAAK,iBAAL,YAAAA,EAAqB,SAAU,GACxCqd,IAAU7V,EAAA,KAAK,iBAAL,YAAAA,EAAqB,UAAW,GAC9C,GAAI,KAAK,aAAe,MAAQ,KAAK,kBAAoB,KAAM,CAC9D,MAAMlJ,EAAO,KAAK,gBAAgB,QAAQ,KAAK,WAAW,IAAI,EAC9D2Q,EAASC,GAA0B,KAAK,gBAAiB5Q,EAAO,KAAK,cAAe,EACpF+e,EAAUzB,GAA2B,KAAK,gBAAiBtd,EAAO,KAAK,cAAe,OAGjF,MAAM,QAAQ2Q,CAAM,IACxBA,EAAS,IAEL,MAAM,QAAQoO,CAAO,IACzBA,EAAU,IAKX,SAAApO,EAAO,SAAW,GACjBA,EAAO,MAAOwR,GAAU,KAAK,wBAAwBA,EAAO1Y,EAAmB,IAAI,CAAC,GACpFsV,EAAQ,KAAMvV,GAAW,KAAK,wBAAwBA,EAAQC,EAAmB,IAAI,CAAC,EAMzF,EACA,kBAA4B,CAC3B,OAAI,KAAK,SAAiB,GAGtB,KAAK,mBAA2B,KAAK,eAAiB,KAAK,aAAe,KAEvE,EACR,EACA,qBAA+B,CAC1B,IAAC,KAAK,gBACF,SAEF,MAAA4F,EAAgB,KAAK,eAAe,aACpC+S,EAAgB,KAAK,eAAe,cAE1C,OACC,KAAK,YACL/S,IAAkB,KAAK,WAAW,MAClC,CAAC,KAAK,eAAe,gBAAgB,KAAK,WAAW,IAAI,EAElD,GAGJ+S,EAAc,QAAU/S,EACpB,CAAC,CAAC,KAAK,YAAY,KACxBrP,GAAS,KAAK,eAAe,gBAAgBA,EAAK,IAAI,GAAKA,EAAK,OAASqP,CAAA,EAGrE,EACR,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,iBAA4B,CAC3B,OAAO,KAAK,QACb,EACA,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EAEA,UAAmB,CAIlB,OAHiB,KAAK,gBACK,cAAc,KAAK,WAAW,KAAM,cAAc,EAE5D,CAAC,CACnB,EACA,kBAA6B,CAIrB,MAFa,CAAC,GADJ,KAAK,gBACW,eAAe,KAAK,SAAU,MAAM,CAAC,EAAE,SAGzE,EACA,aAA8B,CAC7B,OAAI,KAAK,mBAEJ,KAAK,WACD,KAAK,eAAe,cAAc,KAAK,UAAU,EAKlD,KAAK,WAGN,KAAK,eAAe,cAAc,KAAK,eAAe,CAC9D,EACA,6BAAoD,CAC7C,MAAAgT,EAAS,KAAK,YAAY,KAAK,CAAC,CAAE,KAAA3Q,CAAK,IAAMA,IAAS,KAAK,eAAe,EAChF,GAAI2Q,EACH,OAAOA,EAAO,QAGhB,EACA,aAAgC,CAC3B,IAAC,KAAK,WACT,MAAO,GAEF,MAAAxiB,EAA2B,KAAK,SAAsB,sBAC3D,KAAK,WAAW,MAGjB,OAAOA,EAAM,OACZ,CAAC,CAAE,KAAA6R,CAAA,EAAQqL,IACV,KAAK,YACLrL,IAAS,KAAK,WAAW,MACzB7R,EAAM,UAAWG,GAASA,EAAK,OAAS0R,CAAI,IAAMqL,CAAA,CAErD,EACA,kBAA2B,CACpB,MAAA/c,EAAO,KAAK,YAAY,KAC5BA,GAAS,KAAK,aAAeA,EAAK,OAAS,KAAK,YAAY,MAEvD,OAAAA,EAAOA,EAAK,MAAQ,EAC5B,EACA,gBAA8C,CAC7C,OAAK,KAAK,WAEH,KAAK,eAAe,YAAY,KAAK,WAAW,KAAM,KAAK,WAAW,WAAW,EAF3D,IAG9B,EACA,kBAA4B,CAC3B,OAAO,KAAK,iBAAmB,MAAQ,KAAK,eAAe,OAAO,OAAS,CAC5E,CACD,EACA,QAAS,CACR,wBACC8Q,EACAkN,EACC,CACD,OAAKlN,EAEE,OAAOA,GAAS,SAAWA,IAASkN,EAAOlN,EAAK,OAASkN,EAF9C,EAGnB,EACA,kBAAkBsE,EAAkB,CACnC,KAAK,UAAYA,CAClB,EACA,qBAAqBA,EAAa,CACjC,KAAK,WAAaA,EAElB,KAAK,iBAAiB,CAAC,EACvB,KAAK,YAAY,CAClB,EACA,qBAAqB/e,EAA2B,OAE9C,IAACA,GACD,CAAC,KAAK,kBACN,CAAC,KAAK,cACN7B,EAAA,KAAK,iBAAL,YAAAA,EAAqB,cAAe,OAE7B,SAWR,MAAM6gB,GARL,KAAK,gBAAgB,6BAA6B,KAAK,WAAW,IAAI,EAAE,MAAQ,IAE7B,OAAO,CAACha,EAAevI,EAAM8I,IAC5E9I,EAAK,CAAC,GAAKA,EAAK,CAAC,EAAE,OAASuD,EAAiB,CAAC,GAAGgF,EAAKO,CAAK,EACxDP,EACL,CAAE,GAGyC,IAC5Cia,GAAA,SAAe,OAAAtZ,GAAAxH,EAAA,KAAK,iBAAL,YAAAA,EAAqB,aAArB,YAAAwH,EAAkCsZ,GAAU,EAG7D,OAAID,EAAgB,SAAW,EAAU,GAElC,IAAIA,EAAgB,KAAK,KAAK,CAAC,GACvC,EACA,eAAgB,CACf,KAAK,MAAM,SAAS,EAChB,KAAK,YACH,gBAAW,MAAM,0BAA2B,CAChD,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAM,QACN,KAAM,kBACN,CAEH,EACA,iBAAiB9C,EAAa,CACxB,WAAM,YAAaA,CAAG,CAC5B,EACA,WAAY,CACX,KAAK,MAAM,SAAS,CACrB,EACA,aAAc,CACb,KAAK,MAAM,WAAW,CACvB,EACA,kBAAkB9N,EAAe,CAC1B,MAAA7I,EAAQ,KAAK,YAAY,UAAW9I,GAASA,EAAK,OAAS2R,CAAK,EAAI,EACrE,WAAM,kBAAmBA,EAAO7I,CAAK,CAC3C,EACA,uBAAwB,CACnB,KAAK,YACH,gBAAW,MAAM,wBAAyB,CAC9C,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAM,QACN,KAAM,qBACN,CAEH,EACA,SAASvF,EAAkB,CAC1B,MAAMkf,EAAYlf,EAAS,UAAU,EAAG,EAAE,EACtC,OAAAkf,EAAU,OAASlf,EAAS,OACxB,GAAGkf,CAAS,MAEbA,CACR,EACA,cAAe,CACd,KAAK,MAAM,cAAc,CAC1B,CACD,EACA,MAAO,CACN,UAAW,CACV,QAAQH,EAAK,CACZ,KAAK,iBAAiB,EAAE,EACpBA,IAAQ,YACX,KAAK,YAAY,EACZ,gBAAa,KAAK,iBAAiB,CAAC,EAE3C,EACA,UAAW,EACZ,EACA,kBAAkBI,EAAeC,EAAe,CAC3CD,GAAQ,CAACC,EACZ,WAAW,IAAM,CACZ,KAAK,qBAGT,KAAK,2BAA6B,KAAK,kBACnC,KAAK,6BACR,KAAK,mBAAqB,GAErB,gBAAW,MAAM,mCAAoC,CACzD,KAAM,wBACN,KAEA,GAAI,EACID,IACX,KAAK,2BAA6B,GAEpC,CACD,CACD,CAAC,ugBAhgBArX,EA+JU,WA7JR,OAAAC,EAAA,EAAkBa,EAAAwV,EAAA,CAClB,OAAYlW,EAAA,YACZ,SAAcA,EAAA,SACd,WAAgBA,EAAA,WAChB,2BAAuBA,EAAQ,YAC/B,iBAAaA,EAAmB,gDAChC,sBAAkBA,UAAQ,SAAQ,kCAClC,YAAWA,EAAA,oBACX,iBAAiBA,EAA2B,gDAC5C,UAAgBA,EAAA,UAChB,gBAAoBA,EAAA,4BACpB,eAAAA,EAAA,iBACA,mBAAcA,EAAA,iBACd,6BAAcA,EAAY,6BAC3B,aAASA,EAAO,aACf,eAASA,EAAA,aACT,SAAO,QACP,YAAWC,EAAW,KAAAA,EAAA,GAAAc,GAAAf,EAAA,kBAAAe,CAAA,GACtB,UAASf,EAAE,UACX,YAAYA,EAAA,YACZ,YAAMA,EAAA,iBACP,eAAaC,EAAiB,KAAAA,EAAA,GAAAc,GAAAf,EAAA,qBAAAe,CAAA,YAAAd,EAAA,KAAAA,EAAA,GAAAc,GAAAf,EAAA,eAAAe,CAAA,GAEnB,eAAM,iBAChB,EAAAwT,GAAA,QAAMjU,EAAK,KAAAC,EAAA,OAEH,MAAAR,EAAYC,EAAM,uBACdA,EAAA,oBAAAH,EAAA,EAAVa,EAAU8T,EAAA,CACV,IAAI,EACH,WAAY,GACZ,aACA,WAAcxU,EAAA,gBACd,sBAAaA,EAAQ,kBACtB,eAAUA,EAAA,2CACV,cAAa,QAAkB,gDAEpB,eAAO,qBACL,QAAAM,EAAA,KAAmBC,EAAA,cAAAR,EAAAC,EAAA,aAGJ,EAAAS,EAAAT,EAAA,oDACnBH,EAAA,EAAK,EAAIC,EAAAkD,EAAA,KAAAC,GAAAjD,EAAA,YAAAzL,IACXsL,EAAS,EAAAa,EAAA+T,EAAA,CACf,MAAMlgB,EAAA,KACL,IAAKA,EAAK,KACX,6BAAAyL,EAAA,SAAAzL,EAAA,SAAAyL,EAAA,qBAAAzL,EAAA,4CAGY,QAAA+L,EAAA,KAAAC,EAAZ,cAESP,EADR,SAAAzL,EAAA,cAEDyL,EAAA,qBAAAzL,EAAA,OAAAsL,EAAA,EAAAC,EAAA,OAAAuC,GAAA5B,EAAAT,EAAA,qBAAAzL,EAAA,YAAAsL,EAAA,EAAAC,EAAA,OAAA6C,GAAAlC,EAAAT,EAAA,0DAAAzL,EAAA,yDAKiB,yEAAAsL,EAAA,EAAAC,EAAE,OAAY,OAE1B,MAAAC,EAAuBC,EAAQ,eAAAS,EADtCT,EAKE,mCAAAA,EAAA,qBAAAA,EAAA,UAAAH,EAHmB,EAAAa,EAAAqC,EAAA,CACnB,MACA,QAAA/C,EAAA,sBAAAA,EAAA,qHA4BO,OACV,eAAAM,EAAA,KAAAN,EAAA,oBAAAA,EAAA,UAAAA,EAAA,oBAAAH,EAAA,IACS,MAAO,OAGf,MAEaE,EAAAC,EAAA,uBAFkBG,EAAAU,EAAA,CAAE,IAAK,MAAa,KAAK,gHAGpC,mBAoBpB,GAEW,SAtBkDH,EAAAyC,EAAA,OACjD,QAAOnD,EAOV,mBAAAA,EAAA,qCALNM,EAIC,KAJuBC,EAAS,iBAAAP,EAAA,gGAejC,SAAAsC,EAAA,IAPG,QAAAhC,EAAC,IAAW,CAAAH,EACJ+H,EAAM,CACjB,iBACA,YAAO,GACP,SAAOlI,EAAE,mBAAaA,EAAA,SAAAA,EAAA,gBACvB,gBAAgB,SAAQ,0CACxB,UAAaA,EAAA,6HAGE,cAAQ,IAAWA,EAAA,SAIrCiI,EAAA,QAJqCpI,EAAA,EAAAa,EAAAG,EAAA,CAAC,IAAI,yGAI1C,UAAAhB,MAAa,MAAO,OACnB,MAEME,EAAAC,EAAA,qCACNG,EAEagX,CAAA,IAFkBhX,EAAAU,EAAA,CAAE,IAAK,MAAa,KAAK,gHAGxD,eACI,KAAO,WACVP,EAMI,KAAAE,EALEC,EAA4CT,EAAA,2DAClCO,EAAA,KACd,2NAQM,QACS,iBAAAD,EAAA,KAAYH,EAAAU,EAAA,CAAE,IAAK,MAAa,KAAK,6GAK9C,wCACGP,EAAO,KAAAC,EAAA,OACnB,MAEaR,EAAAC,EAAA,8BAFkBG,EAAAU,EAAA,CAAE,IAAK,MAAa,KAAK,uIAGxD,MACIV,EAAAU,EAAA,cAAAP,EAAA,uGAxFuB,2DAKH6I,GAAgC,uBAAA7I,EAAA,6CACzD,gBACC,MAcaP,EAAAC,EAAA,uBAZXwU,EAAmB,CACpB,WAAKxU,EAAO,WACX,sBAAKA,EAAA,qBACN,qBAAAC,EAAA,KAAAA,EAAA,GAAAW,GAAA,kBAEW,WAAO,oBAEmBJ,EAAAC,EAAAT,EAAA,mEAC9B,EAAQ,EAAAF,EAAAkD,EAAA,KAAAC,GAAAjD,EAAA,iBAAAlI,IACR+H,EAAU,EAAAa,EAAA+T,EAAA,CACf,IAAK3c,EAAA,MAAAA,ogBC0CZsf,GAAe3kB,EAAgB,CAC9B,KAAM,eACN,OAAQ,CAACuP,GAAiBD,EAAS,EACnC,WAAY,CACX,kBAAA4C,GACA,UAAA0S,GACA,SAAA3X,EACD,EACA,KAAM,KACE,CACN,uBAAwB4X,GAAe,IAGzC,MAAO,CACN,SAAU,CACT,KAAM,MACP,EACA,UAAW,CACV,KAAM,MACP,CACD,EACA,SAAU,CACT,GAAG3kB,EAAUc,EAAmBmK,GAAahL,GAAYW,CAAiB,EAC1E,MAAuB,CACtB,OAAO,KAAK,eAAe,cAAc,KAAK,QAAkB,CACjE,EACA,UAAwC,CACvC,OAAI,KAAK,KACD,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,EAGtE,IACR,EACA,WAAqB,OACb,UACN0C,EAAA,KAAK,OAAL,MAAAA,EAAW,SAAW,KAAK,KAAK,OAAO,YAAc,KAAK,KAAK,OAAO,aAExE,EACA,aAAsB,CACrB,OAAI,KAAK,SACDshB,GAA0B,KAAK,QAAQ,EAGxC,EACR,EACA,eAAyB,CACxB,MAAO,GAAQ,KAAK,MAAQ,KAAK,KAAK,OAASzT,GAChD,EACA,mBAAwC,SACvC,GAAI,GAAC,KAAK,MAAQ,GAACrG,GAAAxH,EAAA,KAAK,WAAL,YAAAA,EAAe,WAAf,MAAAwH,EAAyB,SAI5C,OAAO,KAAK,0BAA0B,KAAK,SAAS,SAAS,CAAC,EAAG,YAAY,CAC9E,EACA,gBAAqC,SACpC,GAAI,GAAC,KAAK,MAAQ,GAACA,GAAAxH,EAAA,KAAK,WAAL,YAAAA,EAAe,WAAf,MAAAwH,EAAyB,SAIrC,YAAK,cAAc,KAAK,SAAS,SAAS,CAAC,EAAG,KAAK,KAAM,MAAM,CACvE,EACA,oBAA8B,SAC7B,MAAO,IAAQA,GAAAxH,EAAA,KAAK,WAAL,YAAAA,EAAe,WAAf,MAAAwH,EAAyB,OACzC,EACA,eAAyB,OACjB,UAAQxH,EAAA,KAAK,WAAL,MAAAA,EAAe,QAC/B,EACA,sBAAgC,CACzB,MAAA8N,EAAmB,KAAK,eAAe,2BACvCC,EAAe,KAAK,eAAe,aACzC,MACC,CAAC,CAAC,KAAK,MACP,CAAC,KAAK,KAAK,UACX,KAAK,oBACLD,IACC,CAACC,GAAgBA,IAAiB,KAAK,SAE1C,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,mBAA6B,CACtB,MAAAJ,EAAgB,KAAK,eAAe,aAE1C,OAAO,KAAK,iBAAmB,KAAK,eAAiB,KAAK,WAAaA,CACxE,EACA,kBAA4B,CAC3B,OAAO,KAAK,eAAe,gBAC5B,EACA,gBAAyB,OACxB,QAAO3N,EAAA,KAAK,WAAL,YAAAA,EAAe,QAASkM,GAC5B,KAAK,QAAQ,SAAS,+CAA+C,EACrE,KAAK,QAAQ,SAAS,mCAAmC,CAC7D,EACA,eAAwB,OACvB,QAAOlM,EAAA,KAAK,WAAL,YAAAA,EAAe,QAASkM,GAC5B,KAAK,QAAQ,SAAS,sDAAsD,EAC5E,KAAK,QAAQ,SAAS,2CAA4C,CAClE,YAAa,CAAE,QAAS,KAAK,WAAY,EACxC,CACL,EACA,QAAiB,OAChB,MAAMqV,EAAc,KAAK,SAAWD,GAA0B,KAAK,QAAQ,EAAI,GAE/E,OAAI,KAAK,kBACD,KAAK,QAAQ,SAAS,uCAAuC,GAGjEthB,EAAA,KAAK,WAAL,MAAAA,EAAe,cAAgB,OAAO,KAAK,SAAS,aAAa,QAAW,SACxE,KAAK,SAAS,aAAa,OAG/B,KAAK,mBACD,KAAK,QAAQ,SAAS,sCAAuC,CACnE,YAAa,CAAE,KAAMuhB,CAAY,EACjC,EAGK,EACR,EACA,WAAoB,CACnB,MAAMA,EAAc,KAAK,SAAWD,GAA0B,KAAK,QAAQ,EAAI,GAC/E,OAAI,KAAK,kBACD,KAAK,QAAQ,SAAS,uCAAwC,CACpE,YAAa,CAAE,KAAMC,CAAY,EACjC,EAGK,EACR,EACA,gBAAyB,SACxB,KAAI/Z,GAAAxH,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAf,YAAAwH,EAA6B,kBAAmB,OAAW,CAC9D,GAAI,OAAO,KAAK,SAAS,aAAa,gBAAmB,SACjD,YAAK,SAAS,aAAa,eAEnC,GAAI,CAAC,KAAK,kBAAoB,KAAK,SAAS,aAAa,eAAe,SAChE,YAAK,SAAS,aAAa,eAAe,SAElD,GAAI,KAAK,kBAAoB,KAAK,SAAS,aAAa,eAAe,OAC/D,YAAK,SAAS,aAAa,eAAe,MAEnD,CAEA,OAAI,KAAK,mBACJ,KAAK,iBACD,KAAK,QAAQ,SAAS,qDAAsD,CAClF,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAEM,KAAK,QAAQ,SAAS,uDAAwD,CACpF,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAIC,KAAK,cACJ,KAAK,iBACD,KAAK,QAAQ,SAAS,gDAAiD,CAC7E,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAEM,KAAK,QAAQ,SAAS,kDAAmD,CAC/E,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAII,EACR,EACA,gBAAyB,SACxB,GAAI,KAAK,kBACD,SAGJ,IAAAA,GAAAxH,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAf,MAAAwH,EAA6B,eAAgB,CAChD,GAAI,OAAO,KAAK,SAAS,aAAa,gBAAmB,SACjD,YAAK,SAAS,aAAa,eAGlC,IAAC,KAAK,kBACN,OAAO,KAAK,SAAS,aAAa,eAAe,UAAa,SAEvD,YAAK,SAAS,aAAa,eAAe,SAGjD,QAAK,kBACL,OAAO,KAAK,SAAS,aAAa,eAAe,QAAW,SAErD,YAAK,SAAS,aAAa,eAAe,MAEnD,CAEA,OAAI,KAAK,mBACJ,KAAK,iBACD,KAAK,QAAQ,SAAS,qDAAsD,CAClF,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAEM,KAAK,QAAQ,SAAS,uDAAwD,CACpF,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAIC,KAAK,cACJ,KAAK,iBACD,KAAK,QAAQ,SAAS,gDAAiD,CAC7E,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAEM,KAAK,QAAQ,SAAS,kDAAmD,CAC/E,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAII,EACR,CACD,EACA,QAAS,CACR,qBAAsB,CACjB,KAAK,MAAM,MACT,4BAAuB,KAAK,QAAQ,CAE3C,EACA,YAAY,EAAe,OACtB,IAAC,EAAE,OACN,OAED,MAAM/E,EAAS,EAAE,OACbA,EAAO,YAAc,MAErBzC,EAAAyC,EAAO,UAAP,MAAAzC,EAAgB,MACnB,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEbyC,EAAO,QAAQ,MAAQ,WAC1B,KAAK,MAAM,UAAU,EACXA,EAAO,QAAQ,MAAQ,cAC5B,gBAAW,MAAM,wBAAyB,CAC9C,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAM,QACN,KAAM,sBACN,EACD,KAAK,SAAS,eAAiB,KAC1B,KAAK,QAAQ,KAAK,CACtB,KAAM+e,EAAM,WACZ,GACS/e,EAAO,QAAQ,MAAQ,YAC5B,aAAQ,UAAUgf,EAA2B,EAGrD,EACA,kBAAmB,CACb,gBAAW,MAAM,0BAA2B,CAChD,KAAM,SACN,KAAM,WACN,CACF,EACA,eAAgB,CACf,KAAK,MAAM,SAAS,CACrB,CACD,CACD,CAAC,0NAlVO,IAAI,iCACHrU,GAAa,4OAxDrBzD,EAmGM,0CAlGL,MAiGaG,EAAAC,EAAA,sBAjGgB2X,GAAQ,6BACpC,QAAArX,EAAA,KAAAN,EACgC,WAAhCH,EAAA,EAAAC,EAAA,MAmDMuC,EAnDN,GAAArC,EACC,sBACsDH,EAAA,EAAAC,EAAA,MAAA6C,GAAA,CAAAxC,EAArDyX,EAAqD,cAA1CtX,EAAU,KAAmBH,EAAAC,EAAA,UAAAJ,EAAA,yCAE9B,MACVA,EAAA,eAAAH,EAAA,EAAmBC,EAAA,MAAAwC,GAAA,CAAAnC,EAAMU,EAAO,CAAC,IAAK,MAAa,KAAK,QAAU,4HAGlE,eACC,MAMWd,EAAA,CAAAC,EAAA,yBAJTG,EAAAU,EAAA,MAA6F,QAAAP,EAAA,KAAAE,EAAAC,EAAAT,EAAA,6GAMhG,EACE,KAAAG,EACU0X,EAAkB,CAC7B,MAAM7X,EAAA,eACN,WAAKA,EAAQ,8CACZ,eACA,cACA,SAAM,sBAAAA,EAAA,wCAER,OAMEA,EAAA,kBALD,gBAAa,aAAwB,8BAAAG,EAC1B+H,EAAQ,CAClB,eAAS,yBACV,SAAKlI,EAAQ,SACb,UAAeA,EAAA,8DAGjB,WAgBM,kBAAAH,EAfc,EAAAC,EAAA,MAAA8C,GAAA,CAAAzC,EAAMU,EAAO,CAAC,IAAK,MAAa,KAAK,QAAU,qFAGlE,eACC,MAEWd,EAAA,CAAAC,EAAA,OAFD,MAAI,OAAK,KACfG,EAAAU,EAAA,qBAAAP,EAAA,kCAGL,EACC,KAAAH,EACW+H,EAAQ,CAClB,eAAS,yBACV,SAAKlI,EAAQ,SACb,UAAeA,EAAA,yFAKjB,KAAAH,EAAA,EAAAC,EAAA,MAEMyC,GAFN,CACCvC,EAAA,mBAAAH,EAAA,EAAAC,EAAA,MAAAuD,GAAA,mBAGD,IAAM4E,EAAK,GAAE,IAAA1H,EAAA,OACZ,MAOMR,EAAAC,EAAA,gCANcD,EAAMC,EAAA,iBAAUA,EAAA,QAAAH,IAAAa,EAAAoX,EAAA,CAAC,IAAI,0DAGxB,IAAA7P,EAAhB,GAEW,IAAAjI,EAAA,WAAAH,IADiBa,EAAAG,EAAA,SAArB,QAAAP,EAAA,KAAAC,EAAA,wDAIR0H,EAME,MALD,KAAA9H,EACW+H,EAAQ,CAClB,eAAS,yBACV,SAAKlI,EAAQ,SACb,UAAeA,EAAA,oDAI+C,6DAA1CU,EAAAG,EAAA,CAAE,2CAExB,QAAAP,EAAA,KAAAC,EAAA,kBAAAP,EAAA,uBAAA6H,EAAA,eAGO,cAAc,MAFrB,GAKC,IAAA7H,EAAA,gBAAAA,EAAA,gBAAAH,EAJY,EAAAa,EAAA2H,EAAA,CAEX,0HAKK,cAAc,MAFrB,GAQsB,IAAArI,EAAA,gBAAAH,IAPXa,EAAAqX,EAAA,CAET,IAAK,EACL,IAAK,OACL,QAAa/X,EAAc,kBAC3B,QAAU,QAAsB,gDAChC,YAAYA,EAAA,wBAAAA,EAAA,kPCiFlBgY,GAAevlB,EAAgB,CAC9B,KAAM,kBACN,OAAQ,CAACuP,GAAiBiW,GAAkBva,EAAO,EACnD,WAAY,CACX,aAAAwa,GACA,WAAAC,GACA,YAAAC,GACA,mBAAAC,GACA,aAAAC,EACD,EACA,MAAO,CACN,SAAU,CACT,KAAM,OACP,EACA,SAAU,CACT,KAAM,OACP,EACA,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAM7U,EAAOC,EAAK,SACjB,MAAM8M,EAAgBjR,KAChBqF,EAAcC,KAEb,OACN,cAAA2L,EACA,YAAA5L,EACA,GAAGzJ,GAAiB,EACpB,GAAGwI,GAAW,EAEd,IAAGlG,GAAAxH,EAAAgiB,IAAiB,QAAjB,YAAAxa,EAAA,KAAAxH,EAAyBwN,EAAOC,EAAG,CAExC,EACA,MAAO,CACC,OACN,iBAAkB4T,GAAe,EACjC,eAAgB,GAChB,cAAe,GACf,eAAgB,GAChB,iBAAkB,GAClB,cAAe,OACf,6BAA8B,GAC9B,WAAY,GACZ,kBAAmB,EACnB,+BAAgC,GAChC,kBAAmB,EACnB,mBAAoB,EACpB,kBAAmB,GACnB,mBAAoB,GACpB,4BAA6B,GAE/B,EACA,SAAU,CACWrF,GAAA,GAAG,yBAA0B,KAAK,mBAAmB,CAC1E,EACA,eAAgB,CACKA,GAAA,IAAI,yBAA0B,KAAK,mBAAmB,CAC3E,EACA,SAAU,CACT,GAAGtf,EAAUc,EAAmBmK,GAAahL,GAAYW,EAAmBglB,EAAgB,EAC5F,WAAoB,CACnB,OAAO,KAAK,SAAS,SACtB,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,2BAAqC,CACpC,OACC,KAAK,8BACL,CAAC,CAAC,KAAK,gBACP,CAAC,KAAK,eAAe,MAAM,SAAS,SAAS,GAC7C,KAAK,iBACL,KAAK,eAAe,0BAEtB,EACA,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,eAAoC,CAC5B,YAAK,eAAiB,KAAK,UACnC,EACA,WAA4B,CAC3B,OAAI,KAAK,cACD,KAAK,eAAe,cAAc,KAAK,aAAa,EAGrD,IACR,EACA,gBAA8C,CAC7C,OAAI,KAAK,WACD,KAAK,eAAe,YAAY,KAAK,WAAW,KAAM,KAAK,WAAW,WAAW,EAElF,IACR,EACA,kBAA4B,aAC3B,MAAMC,EAAqB,CAAC,GAAC/a,GAAAxH,EAAA,KAAK,iBAAL,YAAAA,EAAqB,WAArB,MAAAwH,EAA+B,QACtDgb,GAAgBpX,EAAA,KAAK,iBAAL,YAAAA,EAAqB,QACrCqX,EAAW,CAAC,GAACtX,EAAA,KAAK,iBAAL,MAAAA,EAAqB,cACxC,MACC,CAAC,KAAK,UAAY,KAAK,gBAAkBoX,GAAsBC,GAAiBC,EAElF,EACA,UAAqB,CACpB,OAAO,KAAK,oBACb,EACA,qBAAsB,SACrB,GAAI,CAAC,KAAK,WAAmB,SACvB,MAAAC,EAAsB,KAAK,eAAe,8BAC/C,KAAK,WAAW,MAIT,SAAAlb,GAAAxH,EAAA,OAAO,OAAO0iB,CAAmB,IAAjC,YAAA1iB,EAAqC,KAArC,YAAAwH,EAA0C,KAAM,IAAI,OAAS,CACtE,EACA,aAAwB,CACvB,OAAI,KAAK,WAEP,KAAK,SAAS,sBAAsB,KAAK,WAAW,KAAM,CAAC,EAAE,IAAI,CAAC,CAAE,KAAAwI,CAAW,IAAAA,CAAI,GAAK,GAInF,EACR,EACA,YAAiC,OAC1BvI,QAAU,KAAK,eAAe,WAGzB,UAAAkb,KAAkB,KAAK,YAO7B,GALAlb,EAAQkb,CAAc,IAKtB3iB,EAAA,KAAK,kBAAL,MAAAA,EAAuB2iB,GACnB,OAAAA,EAIF,YAAK,YAAY,CAAC,CAC1B,EACA,yBAAmC,CAClC,OAAK,KAAK,eAEHC,GAA8B,SAAS,KAAK,eAAe,IAAI,EAFrC,EAGlC,EACA,eAAyB,CACxB,MACC,CAAC,CAAC,KAAK,iBACN,KAAK,eAAe,MAAM,SAAS,SAAS,GAC5C,KAAK,eAAe,OAASrkB,GAEhC,EACA,oBAA8B,CACtB,OAAC,CAAC,KAAK,SAAS,YAAc,KAAK,SAAS,WAAW,OAAS+F,EACxE,EACA,mBAA+C,CAC9C,OAAO,KAAK,eAAe,oBAC5B,EACA,iBAAmC,CAC9B,QAAK,oBAAsB,KACvB,YAEF,MAAA8T,EAA+C,KAAK,kBAAkB,KAC5E,OAAIA,GAAA,MAAAA,EAAe,WACXA,EAAc,WAAW,QAE1B,IACR,EACA,cAAuB,CAClB,QAAK,aAAe,KAChB,SAGR,MAAM2C,EAA2B,KAAK,gBAElC,OAAAA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,WAAW,IAAI,EAC5D,EAGJA,EAAQ,KAAK,WAAW,IAAI,EAAE,OAC1BA,EAAQ,KAAK,WAAW,IAAI,EAAE,OAAS,EAGxC,CACR,EACA,WAAoB,CACf,YAAK,iBAAmB,GACpB,KAAK,aAGN,KAAK,IAAI,KAAK,eAAgB,KAAK,YAAY,CACvD,EACA,aAAsB,CACrB,GAAI,KAAK,YAAc,MAAQ,KAAK,aAAe,KAC3C,SAGR,MAAM/L,EAAe,KAAK,SAAS,QAAQ,KAAK,WAAW,IAAI,EACzDqO,EAAUzB,GAA2B,KAAK,SAAU5M,EAAc,KAAK,cAAc,EAE3F,IAAI1Q,EAAO,KAAK,UAEhB,MAAMyc,EAA2B,KAAK,gBAMlC,OAJAsC,EAAQ,KAAMvV,GAAWA,IAAWC,EAAmB,IAAI,IAC9DzJ,EAAO,KAAK,YAGT,CAACA,GAAQ,CAACyc,GAAW,CAACA,EAAQ,eAAezc,EAAK,IAAI,EAClD,EAGJyc,EAAQzc,EAAK,IAAI,EAAE,OACfyc,EAAQzc,EAAK,IAAI,EAAE,OAAS,EAG7B,CACR,EACA,UAAmB,CAClB,OAAI,KAAK,kBAAoB,KAAK,eAAiB,KAAK,YAChD,KAAK,UAET,KAAK,gBAAkB,GACnB,KAAK,YAGN,KAAK,IAAI,KAAK,cAAe,KAAK,WAAW,CACrD,EACA,aAAuB,CACtB,OAAO,KAAK,aAAe,GAAK,KAAK,eAAiB,KAAK,WAC5D,EACA,QAAkB,CACV,YAAK,kBAAoB,KAAK,WACtC,EACA,kBAA2B,CACnB,YAAK,cAAgB,EAAI,EACjC,EACA,mBAA4B,CACvB,OAAC,KAAK,eAGH,GAAGukB,EAAoB,GAAG,KAAK,eAAe,IAAI,GAFjD,EAGT,EACA,qBAA2D,CAC1D,OAAO,KAAK,SAAS,mBACtB,EACA,mBAA6B,CACrB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,8BAAwC,CACvC,OAAO,KAAK,eAAe,0BAC5B,EACA,SAAmB,CACX,YAAK,mBAAqB,KAAK,4BACvC,EACA,oBAA+B,CAC9B,MAAMC,GAAe,KAAK,YAAc,IAAI,YACtCC,EAAkB,KAAK,eAAe,gBAEtCC,EAA+B,GACrC,OACCF,GACA,KAAK,cAAc,2BAA2BG,GAAyB,OAAO,GAE9E,OAAO,OAAOH,CAAW,EAAE,QAASzT,GAAe,CAEjDA,EAAW,IACX0T,EAAgB1T,EAAW,EAAE,GAC7B,CAAC0T,EAAgB1T,EAAW,EAAE,EAAE,sBAEb2T,EAAA,KAAK3T,EAAW,EAAE,CACtC,CACA,EAGK2T,CACR,EACA,sBAAgC,CACxB,YAAK,mBAAmB,OAAS,CACzC,CACD,EACA,MAAO,CACN,WAAW1kB,EAAsBoR,EAAyB,CACrDpR,GAAQA,EAAK,QAASoR,GAAA,YAAAA,EAAS,OAAQ,CAAC,KAAK,qBAChD,KAAK,cAAgB,GACrB,KAAK,eAAiB,GACtB,KAAK,iBAAmB,GACxB,KAAK,cAAgB,OACrB,KAAK,6BAA+B,GACpC,KAAK,mBAAqB,EAC1B,KAAK,kBAAoB,EAEzB,WAAW,IAAM,KAAK,SAAS,kBAAmB,CAAC,EAC9C,KAAK,cAAc,IAAI,8BAA+B,CAC1D,aAAc,KAAK,YAAY,gBAC9BpR,EACA,KAAK,eACL,KAAK,mBAAmB,CACzB,EACA,EAED,WAAW,IAAM,OAChB,GAAI,KAAK,WAAY,CACd,MAAAokB,EAAsB,KAAK,eAAe,8BAC/C,KAAK,WAAW,MAGZ,gBAAW,MAAM,yBAA0B,CAC/C,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,YAAa,CAAC,KAAK,qBACnB,yBAA0B,KAAK,kBAC/B,2BAA4B,KAAK,YACjC,4BAA6B,KAAK,aAClC,qBAAsB,KAAK,cACxB,UACA,KAAK,SAAS,sBACjB,sBAAuB,KAAK,SAAS,uBACrC,iBAAkB,KAAK,YAAY,OACnC,mBAAmB1iB,EAAA0iB,GAAA,YAAAA,EAAqB,OAArB,YAAA1iB,EAA2B,OAC9C,0BAA2B,KAAK,SAChC,2BAA4B,KAAK,UACjC,+BAAgC,KAAK,+BACrC,+BAAgC,KAAK,kBACrC,gCAAiC,KAAK,mBACtC,CACF,GACE,GAAI,GAEJ,OAAO,KAAO,CAAC,KAAK,oBAChB,WAAI,YAAY,KAAK,UAAU,CAAE,QAAS1B,EAAO,UAAY,WAAY,EAAG,GAAG,CAExF,EACA,cAAe,CACd,KAAK,eAAiB,EACvB,EACA,aAAc,CACb,KAAK,cAAgB,EACtB,EACA,cAAcuD,EAA8B,CAC3C,WAAW,IAAM,CACX,cAAS,iBAAiBA,CAAQ,GACrC,CAAC,CACL,EACA,UAAW,CACV,WAAW,IAAM,CACX,cAAS,iBAAiB,KAAK,QAAQ,GAC1C,CAAC,CACL,CACD,EACA,QAAS,CACR,oBAAoB,CAAE,iBAAAqhB,GAAmD,CACxE,KAAK,+BAAiCA,CACvC,EACA,UAAU,EAAkB,CAC3B,GAAI,EAAE,MAAQ,KAAO,KAAK,iBAAiB,CAAC,EAAG,CAI9C,GAHA,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEb,KAAK,SAAU,OAEd,WAAM,uBAAwB,CAAC,CACrC,CACD,EACA,iBAAiB,EAAsD,CACtE,GAAI,IAAM,MAAQ,CAAC,KAAK,eAAiB,CAAC,KAAK,4BAA6B,CACtE,cAAS,gBAAgB,IAAI,EAClC,MACD,CAEA,MAAM9T,EAAmB,CACxB,SAAU,KAAK,cACf,SAAU,KAAK,SACf,YAAa,EAAE,YACf,UAAW,EAAE,WAET,cAAS,gBAAgBA,CAAI,CACnC,EACA,kBAAkB,EAAsD,CACvE,GAAI,IAAM,MAAQ,CAAC,KAAK,YAAc,CAAC,KAAK,4BAA6B,CACnE,cAAS,gBAAgB,IAAI,EAClC,MACD,CAEA,MAAMA,EAAmB,CACxB,SAAU,KAAK,WAAW,KAC1B,SAAU,KAAK,UACf,YAAa,EAAE,YACf,UAAW,EAAE,WAET,cAAS,gBAAgBA,CAAI,CACnC,EACA,oBAAoB,EAA6B,CAChD,KAAK,kBAAoB,EAAE,YAC5B,EACA,qBAAqB,EAA6B,CACjD,KAAK,mBAAqB,EAAE,YAC7B,EACA,oBAAqB,CACpB,KAAK,SAAS,eAAiB,KAC/B,WAAW,IAAM,CACX,KAAK,wBAAwB,KAAK,GACrC,GAAI,CACR,EACA,uBAAwB,CAChB,YAAK,KAAK,kBAAmB,QAAQ,EACxC,KAAK,YACH,gBAAW,MAAM,wBAAyB,CAC9C,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,WAAY,KAAK,UACjB,KAAMrH,EAAmB,KACzB,KAAM,yBACN,CAEH,EACA,aAAa,EAAyB,CACrC,KAAK,kBAAoB,EAAE,QAC5B,EACA,YAAY,EAAyB,CACpC,KAAK,WAAa,GAClB,KAAK,kBAAoB,EAAE,QAC5B,EACA,UAAU,EAA8C,CACvD,KAAK,WAAa,GACb,gBAAW,MAAM,6BAA8B,CACnD,aAAc,EAAE,YAChB,eAAgB,KAAK,kBACrB,aAAc,EAAE,SAChB,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,WAAY,KAAK,UACjB,YAAa,KAAK,eAAe,WACjC,EACD,KAAK,kBAAoB,EAAE,QAC5B,EACA,kBAAmB,CAClB,KAAK,eAAiB,KAAK,cAC3B,KAAK,iBAAmB,GACxB,KAAK,aAAa,OAAO,CAC1B,EACA,mBAAoB,CACnB,KAAK,iBAAmB,GACxB,KAAK,aAAa,QAAQ,CAC3B,EACA,YAAYob,EAAc,CACzB,KAAK,cAAgB,KAAK,eAC1B,KAAK,iBAAmB,GACxB,KAAK,aAAaA,CAAI,CACvB,EACA,aAAaA,EAAc,CACrB,gBAAW,MAAM,+BAAgC,CACrD,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,WAAY,KAAK,UACjB,OAAQ,KAAK,OACb,KAAAA,CAAA,CACA,CACF,EACA,eAAgB,CACf,WAAW,IAAM,CACZ,CAAC,KAAK,YAAc,CAAC,KAAK,kBAG9B,KAAK,6BAA+B,KAClC,GAAI,CACR,EACA,cAAe,CACT,sBAAiB,KAAK,cAAc,CAC1C,EACA,aAAapS,EAAmC,CAC1C,WAAM,eAAgBA,CAAa,CACzC,EACA,iBAAiBqS,EAAsB,CACjC,WAAM,mBAAoBA,CAAY,CAC5C,EACA,MAAM,qBAAqBA,EAAsB,CAC3C,WAAM,qBAAsBA,CAAY,CAC9C,EACA,MAAM,OAAQ,SACb,GAAI,MAAK,WAIT,IACC,KAAK,aACJ,QAAOpjB,EAAA,KAAK,iBAAL,YAAAA,EAAqB,UAAY,UACxC,QAAOwH,EAAA,KAAK,iBAAL,YAAAA,EAAqB,SAAW,UACvC,KAAK,gBACL,CAIK,MAAA3F,EAAW,KAAK,WAAW,KACjC,WAAW,IAAM,CACX,WAAM,aAAcA,CAAQ,GAC/B,CAAC,CACL,CAEA,GAAI,KAAK,oBAAoB,SAAW,KAAK,WAAY,CAUxD,GATmC,MAAM,KAAK,QAC7C,GACA,KAAK,QAAQ,SAAS,iCAAiC,EACvD,CACC,kBAAmB,KAAK,QAAQ,SAAS,mCAAmC,EAC5E,iBAAkB,KAAK,QAAQ,SAAS,kCAAkC,CAC3E,KAGkCqM,GAAe,CAC3C,MAAE,MAAA+B,CAAM,EAAI,KAAK,oBACnB,IACH,KAAK,WAAW,KAAK,WAAY7G,GAAU6G,CAAK,EAAG,oBAAoB,QAC/DhI,EAAO,CACf,QAAQ,MAAMA,CAAK,CACpB,CACD,CAEK,cAAS,8BAA8B,EAAK,CAClD,CAEM,WAAK,cAAc,IAAI,iCAAiC,EACzD,gBAAW,MAAM,yBAA0B,CAC/C,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,WAAY,KAAK,UACjB,YAAa,KAAK,eAAe,WACjC,EACD,KAAK,6BAA+B,GACpC,KAAK,SAAS,eAAiB,KAC/B,KAAK,SAAS,oBACf,EACA,uBAAuB8V,EAAa,CACnC,KAAK,eAAiBA,EACjB,oBAAeA,EAAK,QAAQ,CAClC,EACA,sBAAsBA,EAAa,CAClC,KAAK,cAAgBA,EACjB,KAAK,SACR,KAAK,eAAiBA,GAElB,oBAAeA,EAAK,OAAO,CACjC,EACA,eAAeA,EAAaoF,EAAc,CACpC,gBAAW,MAAM,gCAAiC,CACtD,WAAY,KAAK,UACjB,UAAWpF,EACX,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,KAAAoF,CAAA,CACA,CACF,EACA,kBAAkBlT,EAAe7I,EAAe,CAC/C,KAAK,cAAgB,GACrB,KAAK,iBAAmB,GACxB,KAAK,cAAgB6I,EAEhB,gBAAW,MAAM,kCAAmC,CACxD,UAAW,KAAK,WAAa,KAAK,WAAW,KAAO,GACpD,WAAY,KAAK,UACjB,YAAa,KAAK,eAAe,WACjC,gBAAiB7I,EACjB,gBAAiB,KAAK,UAAY,KAAK,UAAU,KAAO,GACxD,CACF,EACA,iBAAkB,CACjB,KAAK,MAAM,eAAe,CAC3B,EACA,mBAAoB,CACnB,KAAK,kBAAoB,GACzB,KAAK,mBAAqB,EAC3B,EACA,oBAAqB,CACpB,KAAK,kBAAoB,GACzB,KAAK,mBAAqB,EAC3B,EACA,SAASuZ,EAAgB,CACxB,KAAK,4BAA8B,CAACA,CACrC,CACD,CACD,CAAC,wZApvBAhX,EAmIY,aAjIV,OAAAC,EAAA,EAAmBa,EAAA4Y,EAAA,CACnB,YAAU,CAAE,CAAKtZ,EAAA,YAAAA,EAAA,YAAAA,EAAA,mBAClB,eAAMA,EAAA,MACN,gBACA,MAAM,mCACN,gBAAc,uBACd,aACC,yCAkBa,6BAAAA,EAAA,8BAfbM,EAAU,kBACAH,EAAAgD,EAAA,CACT,UAAW,uBAAAnD,EAAA,0BAED,SAAO,CAAAA,EAAA,4BACN,QAAAM,EAAA,KACPC,EAAA,aAAAR,EAAAC,EAAA,sBAQC,EAAAS,EAAAT,EAAA,oEALK,QAAAM,EAAA,KAA6BC,EAAA,OAAS,QAAaP,EAAgB,6BAAAC,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,OAAAA,EAAA,SAAAE,CAAA,GAC7E,eAAgE,qBAA9BqZ,EAAa,CAAC,KAAK,iCACrD,kBAAmC1Y,EAAQ,CAAE,MAAM,kHAO9C,GADP,4BAAAb,EAAA,YAAAH,IAEqBC,EAAA,OACpB,IAAI,uBAEJ,iCAAAG,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,WAAAA,EAAA,aAAAE,CAAA,GAEA,iBAA0B,MAAE,SAAAD,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,OAAAA,EAAA,SAAAE,CAAA,WAC5BF,EA4FqB,yBA3FnB,SAAAH,MACoB2Z,EAAc,CAClC,cAAUxZ,EAAA,cACV,mBAAcA,EAAa,sBAC3B,SAAAA,EAAc,eAAE,CAAAA,EAAgB,iBAAa,SAC7C,YAAU,CAAAA,EAAA,cACV,iBAAK/J,EAAA+J,EAAW,iBAAX,YAAA/J,EAAe,wBACpB,SAAA+J,EAAA,eACA,MAAO,WAAK,KACZ,qBAAMA,EAAY,qBAClB,QAAWA,EAAA,MACX,OAASA,EAAA,yBAAAA,EAAA,YAiCC,UAAMA,EAAA,SAChB,EAAAuU,GAAA,QACCjU,EAAa,KAAAH,EACDsZ,EAAa,CACxB,eAAU,eACV,YAAYzZ,EAAA,YACZ,SAASA,EAAE,UACX,WAAYA,EAAA,OACZ,UAASA,EAAA,UACT,uBAA4BA,EAAE,qBAC9B,UAAc,SAAkBA,EAAA,gBAAAA,EAAA,wBAChC,6BAAcA,EAAA,6BACd,aAASA,EAAA,mBACT,eAASA,EAAA,mBACT,UAASA,EAAE,kBACX,cAAc,CAAY,IAAAC,EAAA,OAAAD,EAAA,uBAC1B,YAAcA,EAAA,uBACd,eAAWA,EAAA,aACX,eAAQA,EAAA,iCAAAA,EAAA,qCAGA,EAAI,QACd,cAcE,wNAbAM,EAAU,KAAAH,EACAuZ,EAAU,CACpB,SAAS1Z,EAAE,iBACX,SAAUA,EAAA,WACV,UAAAA,EAAA,UACA,SAAUA,EAAA,eACV,mBAASA,EAAW,mBACpB,SAAUA,EAAG,SACb,UAAY,SAAEA,EAAA,iBACd,WAAS,CAAAA,EAAA,SACT,eAAaA,EAAE,aACf,UAAcA,EAAA,cACd,gBAAUA,EAAA,iCAAAC,EAAA,KAAAA,EAAA,GAAAc,GAAAf,EAAA,mBAGL,WAAAA,EAAA,uCADP,WAQI,4IANGA,EAAA,mBAAAH,IAAAC,EAAA,KACL,IAAK,EACN,QAAOG,EAAQ,KAAAA,EAAA,OAAAC,IAAAF,EAAA,uBAAAA,EAAA,yBAAAE,CAAA,SAAAH,EAAAC,EAAA,uBAEf,+GA1EqB,MAAPA,EAAA,mBAAAA,EAAA,eAER,gBAAAM,EAAA,KACKN,EAAA,kBAAAH,IAAAa,EAAWiZ,EAAI,CACzB,MACA,SAAO3Z,EAAE,gBACT,UAAQA,EAAE,oBAAAA,EAAA,cAGC,WAAAA,EAAA,kBADb,iCAqBE,0DAnBkBU,EAAAkZ,EAAA,CAClB,MACA,SAAU5Z,EAAA,SACV,YAAYA,EAAA,YACZ,SAAeA,EAAA,SACf,WAAWA,EAAA,OACX,gBAAUA,EAAA,cACV,UAAAA,EAAA,UACA,SAAcA,EAAA,UAAAA,EAAA,qBACd,6BAAcA,EAAA,6BACd,aAASA,EAAA,kBACT,eAASA,EAAA,kBACT,UAASA,EAAE,iBACX,cAAc,CAAY,IAAAC,EAAA,OAAAD,EAAA,sBAC1B,YAAeA,EAAA,sBACf,eAASA,EAAA,aACT,kBAAcA,EAAA,kBACd,UAASA,EAAE,cACX,eAAQA,EAAA,gCAAAA,EAAA,gtBC1Ef,MAAM6Z,EAAchhB,KACd,CAAE,SAAA5D,EAAU,OAAAwD,EAAQ,QAAAE,EAAS,OAAAD,GAAWmhB,EACxCC,EAAW9lB,IAGjBa,GACC4D,EACA,IAAM,SACDA,GACHxC,EAAA6jB,EAAS,QAAT,MAAA7jB,EAAgB,QAEhBwH,EAAAqc,EAAS,QAAT,MAAArc,EAAgB,OAElB,EACA,CAAE,MAAO,MAAO,GAGjB,SAASsc,EAAe1U,EAAc,CACrC,MAAMxK,EAASwK,EACfwU,EAAY,gBAAgBhf,CAAM,EAClCiP,EAAK,SAAUjP,EAAQgf,EAAY,YAAY,KAAK,CACrD,CAEA,SAASG,EAAgB7f,EAAe,CAClCA,GACJ0f,EAAY,MAAM,CAEpB,8iBCFMI,GAA6B,CAClCC,EACAC,IACkB,CACZ,MAAAC,EAAWC,GAAoC,SAASH,CAAc,EAErE,OACN,KAAM,cACN,QAAS,CACR,MAAO,GACP,OAAQ,GACR,MAAAC,EACA,SAAAC,CACD,EAEF,EAEME,GAAkC,KAAqB,CAC5D,KAAM,YACN,QAAS,CACR,OAAQ,GACR,MAAO,GACP,SAAU,yBACX,CACD,GAEaC,GAAW9nB,EAAgB,CACvC,OAAQ,CAACD,EAAoB,EAC7B,SAAU,CAEL,QAAK,OAAS,KACb,IACE,eAAU,KAAK,IAAI,OACT,CAGhB,CAEF,EACA,MAAO,CACC,OACN,OAAQ,CAAC,EACT,QAAS,CAAC,EAEZ,EACA,SAAU,CACT,GAAGG,EAAUc,EAAmBb,GAAYQ,GAAgBG,EAAmBK,EAAe,EAC9F,MAAuB,CACtB,OAAO,KAAK,eAAe,cAAc,KAAK,IAAI,CACnD,EACA,QAAiB,OACT,QAAAqC,EAAA,KAAK,OAAL,YAAAA,EAAW,KAAM,EACzB,CACD,EACA,MAAO,CACN,KAAM,CACL,KAAM,MACP,EACA,SAAU,CACT,KAAM,MACP,EACA,WAAY,CACX,KAAM,OACP,EACA,SAAU,CACT,KAAM,OACP,EACA,YAAa,CACZ,KAAM,OACP,EACA,iBAAkB,CACjB,KAAM,OACP,EACA,kBAAmB,CAClB,KAAM,OACP,EACA,SAAU,CACT,KAAM,OACN,SAAU,EACX,CACD,EACA,QAAS,CACR,yBAAyBukB,EAAoBjI,EAAcwE,EAAoB,CAC9E,GAAI,qBAAQ,SAAW,WAAYyD,EAAS,SAAU,CAC/C,MAAAC,EAASD,EAAS,SAAS,OACjC,KAAK,SAAS,aAAaC,EAAQ,qBAAsB,KAAK,KAAK,IAAI,EACvE,KAAK,SAAS,aAAaA,EAAQ,mBAAoB1D,EAAW,UAAU,EAC5E,KAAK,SAAS,aAAa0D,EAAQ,qBAAsBlI,CAAI,CAC9D,CACD,EACA,oBAAoBhe,EAAemmB,EAAoC,CAEtE,MAAMC,EAEF,GACEC,EAEF,GAEE1V,EACLC,GAA0B,KAAK,SAAU,KAAK,KAAOuV,CAAY,GAAK,GACvE,KAAK,OAASxV,EAER,MAAA2V,EAAe,CAAC,GAAG3V,CAAM,EAClB2V,EAAA,KAAK,CAAC,EAAGC,IACjB,OAAO,GAAM,SACT,EACG,OAAOA,GAAM,UAIpB,EAAE,UAAY,CAACA,EAAE,SACb,GACG,CAAC,EAAE,UAAYA,EAAE,SACpB,EAGD,CACP,EAEYD,EAAA,QAAQ,CAAC3U,EAAOoL,IAAM,SAC9B,IAAAyJ,EACA,OAAO7U,GAAU,SACC6U,EAAA,CACpB,KAAM7U,CAAA,EAGc6U,EAAA7U,EAGtB,MAAM0K,EAA6BmK,EAAmB,KAEhDC,EACLpK,IAAc5S,EAAmB,KAAOA,EAAmB,KAAO,QAG/D2c,EAAkB,eAAeK,CAAqB,EACzDL,EAAkBK,CAAqB,IAEvCL,EAAkBK,CAAqB,EAAI,EAGxCJ,EAAc,eAAehK,CAAS,EACzCgK,EAAchK,CAAS,IAEvBgK,EAAchK,CAAS,EAAI,EAGtB,MAAAqK,EAAgBN,EAAkBK,CAAqB,EACvDE,EAAYN,EAAchK,CAAS,EAEnCuK,EAAuBjW,EAAO,OAAQkN,GAAc,CACzD,MAAMgJ,EAAwB,OAAOhJ,GAAc,SAAWA,EAAYA,EAAU,KACpF,OAAOxB,IAAc5S,EAAmB,KACrCod,IAAkBpd,EAAmB,KACrCod,IAAkBpd,EAAmB,KACxC,EAEKqd,EAAgBF,EAAqB,OAAQ/I,GAC3CA,IAAcpU,EAAmB,IACxC,EACKsd,EAAwBD,EAAc,OAAQjJ,GAC5C,OAAOA,GAAc,UAAYA,EAAU,QAClD,EACKmJ,EAAwBF,EAAc,OAAQjJ,GAC5C,OAAOA,GAAc,UAAY,CAACA,EAAU,QACnD,EACKoJ,EAAgB,KAAK,iBAC1BF,EAAsB,OACtBC,EAAsB,QAIjBE,EAAiBC,GACtB9K,EACA,QACAuK,EAAqB,OACrBK,GACCP,CAAa,EAETU,EAAQC,GAA+BhL,CAA+B,EAEtEiL,EAAmC,CACxC,KAAMC,GAAmC,KAAK,OAAQlL,EAAWsK,CAAS,EAC1E,OAAQO,EAGR,eAAgBV,EAAmB,gBAAkB,GACrD,SAAU,YACV,WAAYgB,GACXrB,EACA,2BACA9J,CACD,EACA,gBAAiBmL,GAChBrB,EACA,kBACA9J,CACD,EACA,MAAOoL,GAAuBL,CAAK,EACnC,OAAQ/K,IAAc5S,EAAmB,KACzC,OAAQ,CAAC,KAAK,YAAckH,EAAO,OAAS,EAC5C,WAAY,CACX,WAAY,SACZ,OAAQ,KAAK,OACb,KAAM0L,EACN,MAAOsK,CACR,EACA,QAAS,CAAC,KAAK,WACf,SAAU,sBACV,oBAAqB,GACrB,WAAY,4BACZ,GAAG,KAAK,0BAA0BtK,EAAW8J,CAAY,GAGpDF,GAAWvkB,EAAA,KAAK,WAAL,YAAAA,EAAe,YAC/B,KAAK,MAAM,KAAK,KAAK,IAAI,EACzB4lB,GAEI,8BAAyBrB,EAAU,QAASU,CAAS,GACtDH,EAAmB,cAAetd,EAAAid,EAAa,aAAb,MAAAjd,EAA0B6T,KAEtDkJ,EAAA,WACRyB,GACClB,EAAmB,aAAeL,EAAa,WAAWpJ,CAAC,EAC3DV,EACAmK,EAAmB,QACpB,GAGG,MAAM,QAAQP,CAAQ,IAC1BA,EAAS,OAAS,CACjB,SAAUjmB,EAAK,KACf,OAAQ,KAAK,OACb,MAAO2mB,EACP,eAAgBC,EAAqB,OACrC,SAAU5mB,EAAK,MAEjB,CAYA,EACGsmB,EAAa,SAAW,GAC3B,KAAK,SAAS,OAAO,KAAK,MAAM,KAAK,KAAK,IAAI,CAAY,CAE5D,EACA,iBACCqB,EACAC,EACAC,EAA4BC,GAC5BC,EAAgBC,GACL,CACX,MAAMf,EAAgB,GAElB,GAAAU,EAAsB,GAAKC,EAAuB,GACrD,GAAIC,EACHZ,EAAc,KAAKU,CAAmB,UAC5BA,EAAsBC,EAAuBG,EACvD,QACKE,EAAcN,EAClBM,EAAcF,EAAgBH,EAC9BK,IAEAhB,EAAc,KAAKgB,CAAW,UAK/BN,EAAsB,GACtBA,EAAsBI,GACtBH,IAAyB,EAEzB,QACKK,EAAc,EAClBA,EAAcF,EAAgBJ,EAC9BM,IAEchB,EAAA,KAAKgB,EAAcN,CAAmB,UAGrDA,IAAwB,GACxBC,EAAuB,GACvBA,EAAuBG,EAEvB,QACKE,EAAc,EAClBA,EAAcF,EAAgBH,EAC9BK,IAEAhB,EAAc,KAAKgB,CAAW,EAK1B,OAAAhB,CACR,EACA,qBAAqBjnB,EAAemmB,EAAoC,CACvE,MAAMC,EAEF,GACEC,EAEF,GAEC,aAAU/I,GAA2B,KAAK,SAAU,KAAK,KAAM6I,CAAY,GAAK,GAIrF,IAAI+B,EAAiB,EACrB,MAAMC,EAAmD,GACzD,KAAK,QAAQ,QAAQ,CAACxW,EAAOoL,IAAM,OAC9B,IAAAuC,EACA,OAAO3N,GAAU,SACE2N,EAAA,CACrB,KAAM3N,CAAA,EAGe2N,EAAA3N,GAEnBjQ,EAAAykB,EAAa,cAAb,MAAAzkB,EAA2Bqb,KACVuC,EAAA,YAAc6G,EAAa,YAAYpJ,CAAC,GAGzDuC,EAAoB,cACvB4I,EACC5I,EAAoB,YAAY,OAAS4I,EACtC5I,EAAoB,YAAY,OAChC4I,GAGLC,EAAqB,KAAK7I,CAAmB,EAC7C,EAEK,MAAA8I,EAAsBF,EAAiB,EAAI,QAAU,SAE3D,KAAK,QAAQ,QAAQ,CAACvW,EAAOoL,IAAM,CAC5B,MAAAuC,EAAsB6I,EAAqBpL,CAAC,EAE5CI,EAA8BmC,EAAoB,KAElD+I,EACLlL,IAAe1T,EAAmB,KAAOA,EAAmB,KAAO,QAGhE2c,EAAkB,eAAeiC,CAAsB,EAC1DjC,EAAkBiC,CAAsB,IAExCjC,EAAkBiC,CAAsB,EAAI,EAGzChC,EAAc,eAAelJ,CAAU,EAC1CkJ,EAAclJ,CAAU,IAExBkJ,EAAclJ,CAAU,EAAI,EAGvB,MAAAuJ,EAAgBN,EAAkBiC,CAAsB,EACxD1B,EAAYN,EAAclJ,CAAU,EAEpCmL,EAAwB,KAAK,QAAQ,OAAQC,GAAe,CACjE,MAAMC,EACL,OAAOD,GAAe,SAAWA,EAAaA,EAAW,KAC1D,OAAOpL,IAAe1T,EAAmB,KACtC+e,IAAmB/e,EAAmB,KACtC+e,IAAmB/e,EAAmB,KACzC,EAGKyd,EAAiBC,GACtBhK,EACA,SACAmL,EAAsB,QACrB5B,CAAa,EAETU,EAAQC,GAA+BlK,CAAgC,EAEvEmK,EAAmC,CACxC,KAAMmB,GAAoC,KAAK,OAAQtL,EAAYwJ,CAAS,EAC5E,OAAQO,EACR,eAAgB,GAChB,SAAU,CACT,KAAM,MACN,QAAS,CACR,OAAQf,GAAgBmC,EAAsB,OAAS,EAAI,EAAI,CAChE,CACD,EACA,gBAAiBI,GAAqCvC,EAAc,iBAAiB,EACrF,MAAAiB,EACA,OAAQ,GACR,OAAQjK,IAAe1T,EAAmB,KAC1C,QAAS,CAAC,KAAK,WACf,WAAY,CACX,WAAY,SACZ,OAAQ,KAAK,OACb,KAAM0T,EACN,MAAOwJ,CACR,EACA,WAAY,4BACZ,oBAAqB,GACrB,oBAAqB,GACrB,GAAG,KAAK,2BAA2BxJ,EAAYmC,EAAqB6G,CAAY,GAG3EF,EAAW,KAAK,SAAS,YAC9B,KAAK,MAAM,KAAK,KAAK,IAAI,EACzBqB,CAAA,EAID,GADK,8BAAyBrB,EAAU,SAAUU,CAAS,EACvDrH,EAAoB,YAAa,CAEpC,MAAMqJ,EAAcC,GACnBtJ,EAAoB,YACpBnC,EACAmC,GAAA,YAAAA,EAAqB,UAEtB2G,EAAS,WAAW0C,CAAW,CAChC,CAYA,GAVK,MAAM,QAAQ1C,CAAQ,IAC1BA,EAAS,OAAS,CACjB,SAAUjmB,EAAK,KACf,OAAQ,KAAK,OACb,MAAO2mB,EACP,eAAgB2B,EAAsB,OACtC,oBAAAF,CAAA,GAIE,CAAC,KAAK,YAAcjL,IAAe1T,EAAmB,KAAM,CAC/D,MAAMof,EAAoC,CACzC,KAAMJ,GAAoC,KAAK,OAAQtL,EAAYwJ,CAAS,EAC5E,OAAQO,EACR,eAAgB,GAChB,SAAU,CACT,KAAM,UACN,QAAS,CACR,WAAY,GACZ,kBAAmBjB,EACnB,gBAAiB,KAAK,QAAQ,SAAW,EACzC,KAAM,KAAK,QAAQ,QAAU,EAAI,QAAU,SAC3C,oBAAAmC,EACA,aAAc,KAAK,QAAQ,SAAS,wCAAwC,CAC7E,CACD,EACA,OAAQ,GACR,OAAQ,GACR,QAAS,CAAC,KAAK,WACf,WAAY,CACX,cAAe,MAChB,EACA,gBAAiB,CAChB,cAAe,MAChB,EACA,WAAY,CACX,WAAY,SACZ,OAAQ,KAAK,OACb,KAAMjL,EACN,MAAOwJ,EACP,SAAUrH,GAAA,YAAAA,EAAqB,QAChC,EACA,SAAU,0BACV,oBAAqB,IAGlBA,GAAA,MAAAA,EAAqB,WACxBuJ,EAAiB,SAAW,GAAGA,EAAiB,QAAQ,IAAIvJ,GAAA,YAAAA,EAAqB,QAAQ,IAGpF,MAAAwJ,EAAe,KAAK,SAAS,YAClC,KAAK,MAAM,KAAK,KAAK,IAAI,EACzBD,CAAA,EAEI,8BAAyBC,EAAc,OAAQnC,CAAS,EAExD,MAAM,QAAQmC,CAAY,IAC9BA,EAAa,OAAS,CACrB,SAAU9oB,EAAK,KACf,OAAQ,KAAK,OACb,MAAO2mB,EACP,SAAU3mB,EAAK,KACf,eAAgBsoB,EAAsB,QAGzC,EACA,CACF,EACA,UAAUtoB,EAAe,CACxB,MAAMmmB,EAAgB,KAAK,eAAe,YAAYnmB,EAAK,KAAMA,EAAK,WAAW,GAChF,KAAK,eAAe,YAAY+oB,EAAe,EAE3C,yBAAoB/oB,EAAMmmB,CAAY,EACtC,0BAAqBnmB,EAAMmmB,CAAY,CAC7C,EACA,mBAAmBxH,EAAiC,CACnD,MAAO,eAAeA,CAAc,QACrC,EACA,0BACCA,EACAwH,EACkB,CACd,OAAAxH,IAAmBlV,EAAmB,KAClC,CACN,WAAY+d,GACXrB,EACA,KAAK,mBAAmB1c,EAAmB,IAAI,EAC/CkV,CACD,GAIG,OAAO,OAAOlV,CAAkB,EAAE,SAASkV,CAAoC,GAKnFgH,IACsB,CACtB,SAAUD,GACTC,EACA,KAAK,mBAAmBA,CAAc,CACvC,KAGuChH,CAAc,EAZ9C,EAaT,EACA,2BACCA,EACAW,EACA6G,EACkB,CAClB,MAAMnI,EAAO,SAEPgL,EACLrD,IACsB,CACtB,SAAUI,GAAgC,EAC1C,WAAY2C,GACXvC,EACA,KAAK,mBAAmBR,CAAc,CACvC,EACA,gBAAiB+C,GAChBvC,EACA,KAAK,mBAAmBR,CAAc,CACvC,IAGG,OAAAhH,IAAmBlV,EAAmB,KACrC6V,EAAoB,WAAa,QAC7B,CACN,WAAY,CACX,GAAGoJ,GACFvC,EACA,KAAK,mBAAmB1c,EAAmB,IAAI,CAChD,EACA,KAAM,gCACP,EACA,SAAU,OAAOuU,CAAI,aAGhB,CACN,WAAY0K,GACXvC,EACA,KAAK,mBAAmB1c,EAAmB,IAAI,CAChD,EACA,SAAU,OAAOuU,CAAI,aAIlB,OAAO,OAAOvU,CAAkB,EAAE,SAASkV,CAAoC,EAI7EqK,EAAiCrK,CAAc,EAH9C,EAIT,EACA,SAAS,EAAe,CACnB,KAAK,eACJ,KAAK,QAAQ,eAAe,YAAY,GACtC,aAAQ,mBAAmB,YAAY,CAG/C,EACA,eAAe,EAAe,CAE7B,MAAM1L,EAAO,EAAE,MAAS,EAAE,cAAgB,EAAE,eAC5C,QAASnK,EAAQ,EAAGA,EAAQmK,EAAK,OAAQnK,IACxC,GACCmK,EAAKnK,CAAK,EAAE,WACZ,OAAOmK,EAAKnK,CAAK,EAAE,WAAc,UACjCmK,EAAKnK,CAAK,EAAE,UAAU,SAAS,oBAAoB,EAEnD,OAIG,KAAK,gBACL,KAAK,QAAQ,eAAe,YAAY,EACtC,aAAQ,mBAAmB,YAAY,GAEvC,KAAK,iBAAiB,CAAC,GAC3B,KAAK,MAAM,kBAAkB,EAG1B,KAAK,QAAQ,eAAe,KAAK,KAAK,IAAI,EACxC,WAAM,eAAgB,KAAK,IAAI,EAE/B,WAAM,eAAgB,KAAK,IAAI,GAIxC,CACD,CACD,CAAC,EC9cDmgB,GAAe/qB,EAAgB,CAC9B,KAAM,OACN,OAAQ,CACP,MAAMonB,EAAchhB,KACd2X,EAAgBjR,KAChBqF,EAAcC,KAEb,OAAE,YAAAgV,EAAa,cAAArJ,EAAe,YAAA5L,EACtC,EACA,OAAQ,CAAC2V,GAAUvY,GAAiBtE,GAASqN,EAAc,EAC3D,WAAY,CACX,WAAA0S,GACA,gBAAAC,GACA,SAAAhe,EACD,EACA,MAAO,CACN,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,EACA,qBAAsB,CACrB,KAAM,QACN,QAAS,EACV,EACA,eAAgB,CACf,KAAM,QACN,QAAS,EACV,CACD,EACA,SAAU,CACT,GAAG/M,EAAUc,EAAmBmK,GAAahL,GAAYW,CAAiB,EAC1E,oBAA8B,CACtB,YAAK,YAAc,CAAC,KAAK,4BACjC,EACA,gBAA0B,CACzB,OAAK,KAAK,SACNsG,GAA2B,SAAS,KAAK,SAAS,IAAI,EAAU,GAEnE,KAAK,SAAS,WAAa,QAAa,KAAK,cAAc,OAAS,KAAK,SAAS,SAHxD,EAK5B,EACA,kBAA4B,OAC3B,QAAO5D,EAAA,KAAK,WAAL,YAAAA,EAAe,MAAM,SAAS,eAAgB,EACtD,EACA,kBAAuC,CACtC,GAAI,KAAK,aACD,8BAGT,EACA,aAA2B,OACnB,YAAK,eAAe,kCAAgCA,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAQ,EAAE,GAAK,EACtF,EACA,WAAqB,OAEnB,YAAK,qBACL,CAAC,UAAW,QAAS,QAAQ,EAAE,SAAS,KAAK,mBAAmB,EAEzD,GACJ,KAAK,WAAmB,GACxB,KAAAA,EAAA,KAAK,OAAL,YAAAA,EAAW,UAAW,QAAa,OAAO,KAAK,KAAK,KAAK,MAAM,EAAE,OAItE,EACA,mBAA4B,CAC3B,MAAM0nB,EAAyB,KAAK,YACpC,OAAIA,IAA2B,KACvB,EAGDA,EAAuB,MAC/B,EACA,sBAAuB,CACtB,OAAO,KAAK,QAAQ,sBACrB,EACA,uBAA4C,CAC3C,GAAI,KAAK,WAAa,MAAQ,KAAK,SAAS,eAAe,yBAAyB,EAAG,CACtF,MAAM7lB,EAAW,KAAK,QAAQ,cAAc,KAAK,SAAS,IAAI,EACxD,CAAE,wBAAA8lB,CAAwB,EAAI,KAAK,SACzC,OAAO,KAAK,QACV,WACA,wBAAwB9lB,EAAU8lB,GAA2B,EAAE,MAE1D,aAAK,QAAQ,SAAS,sCAAuC,CACnE,YAAa,CACZ,SAAU,KAAK,SAAWrG,GAA0B,KAAK,QAAQ,EAAI,EACtE,EACA,CAEH,EACA,mBAA6B,OACrB,OAAC,GAACthB,EAAA,KAAK,WAAL,MAAAA,EAAe,QACzB,EACA,aAAuB,CACtB,OAAO,KAAK,eAAe,gBAAgB,KAAK,KAAK,IAAI,CAC1D,EACA,2BAAqC,CAMpC,OALc,KAAK,eAAe,qBAAqB,OAAQ1B,GAAkB,CAChF,MAAMkF,EAAW,KAAK,eAAe,YAAYlF,EAAK,KAAMA,EAAK,WAAW,EAC5E,OAAOkF,GAAYA,EAAS,0BAA4B,IAAM,CAAClF,EAAK,SACpE,EAEY,SAAW,CACzB,EACA,kBAA4B,CACpB,YAAK,KAAK,OAASsP,EAC3B,EACA,cAAwB,OAChB,YAAK,eAAe,aAAa,KAAK,SAAU,KAAK,OAAM5N,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAQ,EAAE,CACxF,EACA,oBAA8B,OAC7B,OAAO,KAAK,eAAe,mBAC1B,KAAK,SACL,KAAK,OACLA,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAQ,GAErB,EACA,eAAyB,OACxB,OAAO,KAAK,eAAe,gBAAcA,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAQ,EAAE,CAC/D,EACA,2BAAqC,CACpC,OAAO,KAAK,WAAa,KAAO,KAAK,SAAS,0BAA4B,GAAK,EAChF,EACA,gBAAsC,CAC9B,YAAK,MAAQ,KAAK,KAAK,QAC/B,EACA,UAAwC,CAChC,YAAK,MAAQ,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,CAC1F,EACA,MAA4B,CAE3B,OAAO,KAAK,eAAe,YAAY,KAAK,IAAI,CACjD,EACA,eAA2B,CACnB,YAAK,eAAe,SAAS,OAAQ1B,GAAkBA,EAAK,OAAS,KAAK,KAAK,IAAI,CAC3F,EACA,kBAA2B,CAC1B,MAAMspB,EAAU,CACf,eAAgB,GAChB,wBAAyB,KAAK,cAC9B,6BAA8B,KAAK,mBACnC,uBAAwB,KAAK,cAG1B,QAAK,QAAQ,OAAQ,CAExB,MAAMC,EADchgB,GAA+B,KAAK,OAAO,EAC9B,OAC/B4T,GAAeA,IAAe1T,EAAmB,MAE/C8f,EAAa,QACHA,EAAA,QAASpM,GAAe,CAC5BmM,EAAA,iCAAiCnM,CAAU,EAAE,EAAI,GACzD,CAEH,CAEO,OAAAmM,CACR,EACA,mBAA4B,CAC3B,MAAMtiB,EAEF,CACH,KAAM,KAAK,SAAS,CAAC,EAAI,KACzB,IAAK,KAAK,SAAS,CAAC,EAAI,MAGrB,QAAK,MAAQ,KAAK,SAAU,CACzB,MAAA2J,EACLC,GAA0B,KAAK,SAAU,KAAK,KAAM,KAAK,QAAQ,GAChE,GAGIkW,EAFavd,GAA+BoH,CAAM,EAEvB,OAAQwR,GAAUA,IAAU1Y,EAAmB,IAAI,EACpF,GAAIqd,EAAc,OAAQ,CACKnW,EAAO,OACnCwR,GAAU,OAAOA,GAAU,UAAYA,EAAM,QAC/C,EAEA,IAAIqH,EAAc,EAOXxiB,EAAA,iCAAiC,EAAI8f,EAAc,OAAS0C,CACpE,CAEA,IAAIzK,EAAU,GACV,KAAK,SAAS,MAAM,KAAK,KAAK,IAAI,IACrCA,EAAUzB,GAA2B,KAAK,SAAU,KAAK,KAAM,KAAK,QAAQ,GAK7E,MAAMmM,EAFclgB,GAA+BwV,CAAO,EAE1B,OAAQvV,GAAWA,IAAWC,EAAmB,IAAI,EAC9EzC,EAAA,0BAA0B,EAAIyiB,EAAY,MAClD,CAEO,OAAAziB,CACR,EACA,WAAoB,CACZ,OACN,WAAY,GACZ,SAAU,KAAK,KAAK,SACpB,UAAW,KAAK,YAElB,EACA,qBAA8B,OAC7B,MAAM0iB,GAAuBhoB,EAAA,KAAK,eAAe,qBAApB,YAAAA,EAAyC,KAAK,MAC3E,OAAIgoB,EACIA,EAAqB,OAAO,OAAO,EAAE,CAAC,EAAE,iBAAmB,GAE5D,EACR,EACA,YAAuB,SACtB,MAAMC,EAAmB,GACnBD,GAAuBhoB,EAAA,KAAK,eAAe,qBAApB,YAAAA,EAAyC,KAAK,MAC3E,OAAIgoB,GACkBA,EAAA,QAASE,GAAqB,CAC9CA,GAAA,MAAAA,EAAkB,OACdD,EAAA,KACN,GAAGC,EAAiB,MAAM,OAAO,GAChCA,EAAiB,MAAM,YAAc,KAAKA,EAAiB,MAAM,WAAW,IAAM,EACnF,GAEF,CACA,IAEE1gB,EAAA,KAAK,OAAL,YAAAA,EAAW,UAAW,QAClBygB,EAAA,KAAK,GAAGE,GAA+B,KAAK,KAAK,OAAQ,KAAK,IAAI,CAAC,EAEpEF,CACR,EACA,kBAA2B,CACtB,YAAK,KAAK,WAAa,GACnB,QAEA,MAET,EACA,UAAuB,CACtB,OAAO,KAAK,KAAO,KAAK,KAAK,SAAW,CAAC,EAAG,CAAC,CAC9C,EACA,yBAAmC,CAClC,MACC,CAAC,KAAK,oBACN,CAAC,EAAE,KAAK,KAAK,UAAY,KAAK,OAAO,SAAW,GAAK,KAAK,QAAQ,SAAW,EAE/E,EACA,eAAwB,CACvB,OAAO,KAAK,QAAQ,cAAc,KAAK,KAAK,IAAI,CACjD,EACA,WAAoB,CACf,YAAK,KAAK,OAAS,QACf,KAAK,QAAQ,WAAW,CAC9B,IAAK,4BACL,SAAU,QACV,EAGK,KAAK,KAAK,IAClB,EACA,SAA8B,CACvB,MAAA9P,EAAoB,KAAK,eAAe,qBAE9C,GAAIA,GAAA,MAAAA,EAAmB,SAAU,CAC1B,MAAAiQ,EAAmB3X,GAAI0H,EAAmB,kCAAkC,EAC9E,QAAK,OAASiQ,EAAkB,CACnC,MAAMC,EAAW,IAAI,KAAKlQ,EAAkB,QAAQ,EAChD,OAAAkQ,EAAS,YAAY,IAAMC,GACvB,KAAK,QAAQ,SACnB,6DAGK,KAAK,QAAQ,SAAS,yBAA0B,CACtD,YAAa,CACZ,KAAMD,EAAS,mBAAmB,EAClC,KAAMA,EAAS,mBAAmB,CACnC,EACA,CACF,CACD,CAGD,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,WAAoB,WACnB,MAAME,EAEF,GAEJ,IAAIC,EAAc,2BAEd,YAAK,oBAAsB,KAAK,gBACrBA,EAAA,2BAGX,KAAK,KAAK,SACCA,EAAA,0BACH,KAAK,cACZ,KAAK,WAAa,CAAC,KAAK,iBAGzBpd,GAAA5D,GAAAxH,EAAA,KAAK,cAAL,YAAAA,EAAmB,KAAnB,YAAAwH,EAAuB,QAAvB,YAAA4D,EAAqD,iBACtD,uBAEcod,EAAA,iBACdD,EAAa,cAAc,EAAI,MAC/BA,EAAa,cAAc,EAAI,SAEtB,KAAK,SAAW,KAAK,mBACjBC,EAAA,oCACJ,KAAK,sBAAwB,UACzBA,EAAA,2BACJ,KAAK,oBACfD,EAAa,cAAc,EAAI,MAC/BA,EAAa,cAAc,EAAI,QACjBC,EAAA,oBAIHD,EAAA,cAAc,EAAI,OAAOC,CAAW,IAE1CD,CACR,EACA,YAAsB,CAEpB,YAAK,QAAQ,iBAAiB,KAAMjqB,GAAkBA,EAAK,OAAS,KAAK,KAAK,IAAI,IAClF,MAEF,EACA,kBAA4B,CAC3B,MAAO,CAAC,EAAE,KAAK,UAAY,KAAK,QAAQ,OAAS,EAClD,EACA,0BAAoC,CACnC,MACC,CAAC,CAAC,KAAK,MACP,KAAK,eACL,CAAC,KAAK,mBACN,CAAC,KAAK,YACN,CAAC,KAAK,gBACN,KAAK,iBACL,KAAK,oBAAsB,GAC3B,KAAK,2BACL,CAAC,KAAK,2BACN,CAAC,KAAK,WACN,CAAC,KAAK,QAER,EACA,mBAA6B,OAC5B,OACC,KAAK,YAAY,OAAO,OACxB,KAAK,YAAY,OAAO,MAAM,SAAW,eACzC,KAAK,YAAY,OAAO,MAAM,KAAK,SAAS0B,EAAA,KAAK,OAAL,YAAAA,EAAW,KAEzD,CACD,EACA,MAAO,CACN,SAAS2P,EAAUC,EAAU,CACxB,CAACD,GAAYC,GAChB,KAAK,YAAY,CAEnB,EACA,sBAAuB,CAClB,KAAK,yBACR,KAAK,uBAAyB,GAC9B,WAAW,IAAM,CAChB,KAAK,uBAAyB,KAAK,0BACjC,GAAG,GAGH,KAAK,iCACR,KAAK,+BAAiC,GACtC,WAAW,IAAM,CAChB,KAAK,+BAAiC,IACpC,GAAG,EAER,EACA,yBAAyB6Y,EAA0B,CAC9CA,EACH,WAAW,IAAM,CAChB,KAAK,uBAAyB,KAAK,0BACjC,IAAI,EAEP,KAAK,uBAAyB,EAEhC,EACA,YAAY9Y,EAAU,CAChB,KAAK,MAIV,KAAK,MAAM,MAAO,CAAE,KAAM,KAAK,KAAK,KAAM,KAAMA,EAAU,QAAS,CAAC,CAAC,KAAK,OAAS,EACpF,CACD,EACA,SAAU,CACqB6G,GAAWyF,EAA4C,EAAE,QAEtF,KAAK,yBAA2B,KAAK,OAAO,oBAAsByM,GAA2B,CAC5F,KAAK,4BAA4BA,CAAc,EAC/C,EAEH,EACA,SAAU,CACT,WAAW,IAAM,CAChB,KAAK,YAAY,GACf,CAAC,EACA,KAAK,aACR,WAAW,IAAM,CAChB,KAAK,MAAM,MAAO,CACjB,KAAM,KAAK,MAAQ,KAAK,KAAK,KAC7B,KAAM,KAAK,YACX,QAAS,CAAC,CAAC,KAAK,QAChB,GACC,CAAC,CAEN,EACA,MAAO,CACC,OACN,cAAe,GACf,aAAc,GACd,uBAAwB,GACxB,+BAAgC,GAChC,SAAU,GACV,yBAA0B,IAAM,CAAC,EAEnC,EACA,QAAS,CACR,4BAA4BA,EAA8B,CAExD,CAAC,KAAK,eACN,KAAK,kBACL,KAAK,kBACL,KAAK,QAAQ,eACbA,IAAmB,IAITlS,GAAAyF,EAA4C,EAAE,MAAQ,OAEjE,KAAK,+BAAiC,GACtC,KAAK,yBAAyB,EAC/B,EACA,aAAc,CAKT,IACG,MAAA0M,EACL,KAAK,YAAY,gBAAgB,KAAK,KAAM,KAAK,SAAU,KAAK,QAAQ,GAAK,GAE9E,KAAK,aAAeA,EAAa,SAASC,EAAmB,EAAI,GAAKD,OAC3D,CAEZ,CACD,EACA,aAAc,CACT,KAAK,OAAS,OACjB,KAAK,YAAY,aAAa,CAAC,KAAK,IAAI,CAAC,EACzC,KAAK,aAAa,kBACjB,IAAIE,GACH,KAAK,KAAK,KACV,CAAC,KAAK,KAAK,SACX,KAAK,KAAK,WAAa,EACxB,GAEI,gBAAW,MAAM,iCAAkC,CACvD,UAAW,KAAK,KAAK,KACrB,YAAa,UACb,YAAa,KAAK,eAAe,WACjC,EAEH,EACA,aAAc,CACb,KAAK,MAAM,cAAe,KAAK,KAAK,KAAM,kBAAkB,EACvD,gBAAW,MAAM,iCAAkC,CACvD,UAAW,KAAK,KAAK,KACrB,YAAa,UACb,YAAa,KAAK,eAAe,WACjC,CACF,EAEA,QAAQ1kB,EAAmB,CACrB,KAAK,cAAc,mBAAoB,CAAE,aAAc,GAAI,SAAU,IAAQA,CAAK,CACxF,EAEA,iBAAiBA,EAAmB,CACbA,EAAM,QAAU,EAErC,KAAK,cAAc,EAEnB,KAAK,eAAeA,CAAK,CAE3B,EAEA,eAAgB,CACf,KAAK,SAAS,eAAiB,KAAK,KAAO,KAAK,KAAK,KAAO,GAC5D,KAAK,+BAAiC,EACvC,EACA,YAAa,CACR,KAAK,gBAAkB,IAAQ,CAAC,KAAK,SAAW,CAAC,KAAK,gBACzD,KAAK,cAAgB,GACrB,WAAW,IAAM,CAChB,KAAK,cAAgB,IACnB,GAAI,EAET,EACA,gBAAgBA,EAAmBgF,EAAqC,CACnE,KAAK,MACH,iBAAY,KAAKhF,EAAO,CAAE,OAAAgF,EAAQ,KAAM,KAAK,KAAM,CAE1D,CACD,CACD,CAAC,EA1rBM2f,GAAAplB,IAAKqlB,GAAC,iBAAmB,EAAArlB,MAAAslB,KAAAtlB,wDAiBzB2I,GAAM,8CAYiCC,GAAM,CAAc,wDAQCc,GAAe,2CAQxCwE,GAAM,mCAEPvE,GAAM,uCAKNyE,GAAM,2BAENtF,GAAM,2KA2CvCwM,GAAM,oDA4BP,MAAa,4OAtInBiQ,GA+IM,SA7IC,OAAArf,EAAA,EAAAC,EAAE,MAAiB,CACxB,MAAIC,EAAMC,EAAA,kBACX,SAAaA,EAAa,mBACzB,GAAGA,EAAE,OACL,eAAW,cACX,IAAWA,EAAA,sBAAAA,EAAA,UAEZ,cAAAC,EAAA,KAAAA,EAAyD,MAAzDD,EAAyD,gBAAAhJ,EAAA,+CACzD,CAyHMmoB,EAAAnf,EAAA,uBAxHmD,MAAAD,EAAA,mBAAsE,eAAAC,EAAA,gCAAAA,EAAA,kGAUvHuI,GAAA1I,EAAA,EAAWC,EAAA,OAChB,MAAKC,EAAAC,EAAA,iBAAAsJ,GAAAtJ,EAAA,mBAIwBC,EAAa,KAAAA,EAAA,GAAAW,GAAA,IAAAV,IAAAF,EAAA,SAAAA,EAAA,WAAAE,CAAA,eAC1CF,EAAA,eAAAH,EAAA,EAE+DC,EAAA,IAAAwC,GAAA,CAAAnC,EAA7DgD,EAA6D,8BAAvD7C,EAAQ,KAAAC,EAAA,+DAE4B,SAAAqC,EAAA,YAApBtC,EAAO,KAAUH,EAAAQ,EAAA,iCAG1C,GAAAsH,EAAA,OAEOjI,EAAA,cA+BFiI,EAAM,GAAqB,KA/BzBpI,EAAA,EAAAC,EAAA,aAEK,MAAAC,EAAc,CAAc,iCAAAC,EAAA,qBACtCA,EAAA,WAKc,uBALeF,EAAA,MAAAyC,GAAA,CAAApC,EAAYgD,EAAQ,kBACrC,UAAO,mBACE7C,EAAK,KAAAH,EAA4Cif,EAAU,UAAApf,EAAA,qDAE9B,qFAGnC,EACf,IAAAA,EAAA,SAKcA,EALD,iCAAAH,IAEiBC,EAAA,MAAAuD,GAAA,CAAAlD,EAA5BgD,EAA4B,sBAAvB,QAAA7C,EAAA,KAAAC,EAAA,+BAE4B,SAAAiC,EAAA,4CAGnB,MAAAxC,EAChB,sBAC6B,EAAAF,EAAA,OAAA+H,GAAA,CAAA1H,EAAAQ,EAAyD,MAAtF,WAAsF,GAAAX,EAAA,qBAAAH,EAAA,EAAAC,EAAA,OAAAwD,GAAA7C,EAAAT,EAAA,uBAEtEiI,EAAmB,UAAAjI,EAGnB,sBAAiB,WAAlCH,EAAA,EAAAC,EAAA,OAGOgI,EAHP,GAAA9H,EACC,qBAC6B,EAAAF,EAAA,OAAAiI,GAAA,CAAA5H,EAAAQ,EAAyD,MAAtF,OAAsF,GAAAX,EAAA,qBAAAH,EAAA,EAAAC,EAAA,OAAA2C,GAAAhC,EAAAT,EAAA,uBAAAiI,EAAA,kBAIxF,MAAgC1H,EAAS,MAAQ,6BAChD,MAA0CP,EAAA,2CAAHG,EAAAQ,EAAA,wBAGxC,IACC,EAUcyC,EAAA,EATE7C,EAAA,MAAA8O,GAAA,CAAAlP,EACdgD,EAAe,CACf,UAAS,MACV,aAAY,YAAAnD,EAAA,uBAED,eAAO,wCACZ,QAAAM,EAAA,KAAAC,EAAA,6CAEE,SAAA+O,EAAA,wBAGF,oBACGtP,EAAA,eAAAH,IAACa,EAAKyC,EAAA,CACd,MACD,wBAAAnD,EAAA,+BAEW,eAAO,uDAGVQ,EAAAC,EAAAT,EAAA,iGAIViI,EAOE,WALU7H,EAAQ,CAClB,MAAM,YACN,SAAQJ,EAAK,SACb,QACA,OAAQ,gBAAAA,EAAA,4CA/EK,oCAAP,UAAK,kCAmFsC,CAAUqf,EAAArf,EAAA,kBAC7DA,EAAA,WAiBDiI,EAAA,OAjBCM,GACC1I,IAAkCC,EAAA,MAAAmP,GAAA,CAAA9O,EAC7BsP,EAAU,CACf,eAAI,sBACJ,KAAK,WACJ,QACA,KAAK,OACL,SAAOzP,EAAW,iBAAAA,EAAA,mBAAAA,EAAA,qCAEpB,QAMEA,EAAA,aALD,mBAAa,QAAsB,YAAAG,EAC9BsP,EAAU,CACf,eAAI,uBACJ,KAAK,WACJ,kHAGH,EACOzP,EAAA,yBAAAH,IAAAC,EAAA,aAA0E,MAAAC,EAAA,wGAOlF,WAAAkI,EAUM,GAVN,GACC,KAAA1H,EAAW,MAAWiP,GAAA,CAAAjP,EAAS,MAAS,mBACvC,MAAAP,EAAA,WAGS,CAAAO,EAAT,SAAqEP,EAA5C,cAAAA,EAAA,eAAAH,EAAA,EAAAC,EAAA,IAAAqP,GAAA,IAAA1O,EAAAT,EAAA,2CAEfiI,EAAiB,GAAS,OAAAqX,EAAA,6BAAuB,EAAAxf,EAAA,OAAE,IAAK,yJCftEyf,GAAe9sB,EAAgB,CAC9B,KAAM,SACN,OAAQ,CAAC8nB,GAAUvY,EAAe,EAClC,OAAQ,CACP,MAAMwd,EAAsBxrB,IACtByrB,EAAezrB,EAAI,EAAK,EACxB0rB,EAAmBxZ,GAAmB,CAC3CuZ,EAAa,MAAQvZ,CAAA,EAEhB2T,EAAchhB,GAAgBgC,GAAW,OAC1CA,IAAW,iBACd6kB,EAAgB,EAAI,GACpBzpB,EAAAupB,EAAoB,QAApB,MAAAvpB,EAA2B,QAC5B,CACA,EAED,MAAO,CAAE,oBAAAupB,EAAqB,YAAA3F,EAAa,aAAA4F,EAAc,gBAAAC,CAAgB,CAC1E,EACA,MAAO,CACN,cAAe,CACd,KAAM,MACP,EACA,SAAU,CACT,KAAM,MACP,CACD,EACA,SAAU,CACT,GAAG/sB,EAAUc,EAAmBmK,GAAahL,GAAYW,CAAiB,EAC1E,aAAsB,CACjB,IAAC,KAAK,SACF,SAGR,MAAMosB,EADa,KAAK,SAAS,WACN,KAAMC,GAAaA,EAAS,OAAS,SAAS,EAEzE,OAAOD,GAAWE,GAASF,EAAQ,OAAO,EAAIA,EAAQ,QAAU,EACjE,EACA,YAAsB,CAEpB,YAAK,QAAQ,iBAAiB,KAAMprB,GAAkBA,EAAK,OAAS,KAAK,KAAK,IAAI,IAClF,MAEF,EACA,UAAwC,CAChC,YAAK,MAAQ,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,CAC1F,EACA,MAAuB,CAEtB,OAAO,KAAK,eAAe,cAAc,KAAK,IAAI,CACnD,EACA,UAAuB,CACtB,OAAI,KAAK,KACD,KAAK,KAAK,SAEV,CAAC,EAAG,CAAC,CAEd,EACA,QAAiB,CACT,YAAK,MAAQurB,GAAS,KAAK,KAAK,WAAW,MAAM,EAAI,KAAK,KAAK,WAAW,OAAS,CAC3F,EACA,OAAgB,CACR,YAAK,MAAQA,GAAS,KAAK,KAAK,WAAW,KAAK,EAAI,KAAK,KAAK,WAAW,MAAQ,CACzF,EACA,YAAqB,CAQb,MALH,CACH,OAAQ,KAAK,OAAS,KACtB,MAAO,KAAK,MAAQ,KAItB,EACA,gBAAyB,CASjB,MANH,CACH,KAAM,KAAK,SAAS,CAAC,EAAI,KACzB,IAAK,KAAK,SAAS,CAAC,EAAI,KACxB,OAAQ,KAAK,SAAW,QAAU,GAAK,KAAK,MAAO,KAAK,OAAS,KAAK,MAAS,GAAI,EAIrF,EACA,aAAuB,CAErB,QAAE,KAAK,aAAe,KAAK,YAAc,KAAK,iBAAmB,KAAK,aACtE,KAAK,YAEP,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,CACD,EACA,MAAO,CACC,OACN,WAAY,GACZ,cAAe,GAEjB,EACA,QAAS,CACR,eAAgB,CACf,KAAK,gBAAgB,EAAI,CAC1B,EACA,eAAgB,CACf,KAAK,gBAAgB,EAAK,CAC3B,EACA,MAAM,YAAa,CAElB,MAAM,KAAK,YACX,KAAK,MAAM,aAAc,KAAK,KAAK,IAAI,CACxC,EACA,YAAYziB,EAAe,CAC1B,KAAK,eAAe,qBAAqB,CACxC,KAAM,KAAK,KACX,WAAY,CAAE,WAAY,CAAE,GAAG,KAAK,KAAK,WAAY,MAAOA,EAAQ,EACpE,CACF,EACA,OAAO0iB,EAAe,CACjBA,GAAQ,CAAC,KAAK,UAAY,KAAK,KAC7B,cAAS,eAAiB,KAAK,KAAK,KAC/B,KAAK,UAAY,CAACA,IAC5B,KAAK,SAAS,eAAiB,KAEjC,EACA,gBAAgBC,EAAyB5lB,EAAc,CACtD,GAAI4lB,EAAM,CACH,MAAAC,EAAmB,KAAK,OAASC,GACjCC,EAAiBH,EAAK,cAAc,gCAAgC,EACpEzN,EACL0N,GAAoBE,EACjB,gBACAF,GAAoBD,EAAK,aAAa,MAAM,IAAM,aAChD,YACA,QAEN,KAAK,WAAW,MAAM,yBAA0B,CAAE,KAAAzN,CAAM,EACzD,CACD,EACA,cAAcoN,EAAiB,CACzB,UAAK,WAAW,QAAUA,EAC1B,mBAAc,CAAE,QAAAA,CAAA,CAAS,CAC/B,EACA,eAAgB,CACf,KAAK,WAAa,GACd,CAAC,KAAK,YAAc,KAAK,MAC5B,KAAK,MAAM,eAAgB,KAAK,KAAK,KAAM,GAAO,EAAI,CAExD,EACA,SAAS,CAAE,OAAAS,EAAQ,MAAAvU,EAAO,GAAAwU,EAAI,GAAAC,GAAiE,CACzF,KAAK,QAGND,IAAO,GAAKC,IAAO,IACtB,KAAK,YAAY,CAAC,KAAK,KAAK,SAAS,CAAC,GAAKD,GAAM,GAAI,KAAK,KAAK,SAAS,CAAC,GAAKC,GAAM,EAAE,CAAC,EAGxF,KAAK,cAAc,CAAE,OAAAF,EAAQ,MAAAvU,CAAO,GACrC,EACA,aAAc,CACb,KAAK,WAAa,EACnB,EACA,cAAchU,EAA+E,CAC5F,GAAI,KAAK,KAAM,CACd,MAAMsP,EAAiB,CACtB,QAAS0Y,GAAShoB,EAAO,OAAO,EAAIA,EAAO,QAAU,KAAK,KAAK,WAAW,QAC1E,OAAQioB,GAASjoB,EAAO,MAAM,EAAIA,EAAO,OAAS,KAAK,KAAK,WAAW,OACvE,MAAOioB,GAASjoB,EAAO,KAAK,EAAIA,EAAO,MAAQ,KAAK,KAAK,WAAW,MACpE,MAAOgoB,GAAShoB,EAAO,KAAK,EAAIA,EAAO,MAAQ,KAAK,KAAK,WAAW,OAG/DO,EAAwC,CAC7C,IAAK,KAAK,KAAK,GACf,KAAM,KAAK,KAAK,KAChB,MAAO+O,CAAA,EAGH,oBAAe,kBAAkB/O,CAAiB,CACxD,CACD,EACA,YAAYnD,EAAsB,CAC7B,IAAC,KAAK,KACT,OAGD,MAAMmD,EAAsD,CAC3D,KAAM,KAAK,KAAK,KAChB,WAAY,CACX,SAAAnD,CACD,GAGI,oBAAe,qBAAqBmD,CAAiB,CAC3D,EACA,YAAa,CACR,KAAK,gBAAkB,IAAQ,CAAC,KAAK,SAAW,CAAC,KAAK,gBACzD,KAAK,cAAgB,GACrB,WAAW,IAAM,CAChB,KAAK,cAAgB,IACnB,GAAI,EAET,EACA,cAAc,EAAqB,CAC9B,KAAK,MACH,iBAAY,KAAK,EAAG,CAAE,OAAQ,mBAAoB,KAAM,KAAK,KAAM,CAE1E,CACD,CACD,CAAC,8DAjQckK,GAAA,0JA3Ed4c,GAmGM,gBAjGArf,EAAM,EAAAC,EAAA,OACV,MAAK,iBACL,GAAKE,EAAA,OACL,IAAWA,EAAA,UACZ,SAAaA,EAAQ,4BAAAA,EAAA,UAErB,mCAC2D,MAAAD,EAAA,qBAAyE,eAAAC,EAAA,gCAAAA,EAAA,cAM7H,eAAAA,EAAA,sBAENA,EAA4D,yDAGrDuI,GAAA1I,EAAA,EAAAC,EAAA,OACL,2BAAAG,EAAA,KAAAA,EAAA,GAAAW,GAAA,IAAAV,IAAAF,EAAA,gBAAAA,EAAA,kBAAAE,CAAA,aAID,cAiBED,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,eAAAA,EAAA,iBAAAE,CAAA,OAfQqgB,EAAgB,CACxB,WAAOvgB,EAAK,KAAgB,mBAC5B,OAAOA,EAAa,uBACpB,aAAiB,WAAK,MACtB,MAAIA,EAAA,cACJ,gBAAUA,EAAU,sBACpB,GAAaA,EAAA,QACb,SAAUA,EAAA,WACV,YAAUA,EAAA,YACV,SAAMA,EAAM,WAAAA,EAAA,WACZ,SAAaA,EAAA,SACb,OAAMA,EAAE,OACR,cAAWA,EAAA,cACX,SAAcA,EAAA,SACd,YAAAA,EAAA,4BAAAA,EAAA,qDAnBa,gCAAP,QAAK,6MAuBdA,EAoDM,uDAhDL,GAOM,qCAAAA,EAAA,iBAJOuI,GAAA1I,EAAA,EAAgBC,EAAA,OAC3B,MAAO,wCAER,MAAAE,EAAA,QAAkC,SAAf,qBALRG,EAAAQ,EAAA,mBAAA2B,EAAA,IAOZ,CAuCc+c,EAAArf,EAAA,sBArCZK,EAAgC,CACjC,OAAO,OACP,eAAe,gBACd,QAAM,QACN,UAAM,aAAAL,EAAA,cAEI,OAASA,EAAA,gBAEd,UAAAM,EAAA,KACUC,EAAA,OACd,0BACC,MAAO,8CAER,MAAAP,EAAA,QAAoC,SAAjB,2CAGrB,IAAA4C,EAAA,IACC,QAAAtC,EAAA,KAAAC,EAAA,MAAAgC,GAAA,EACM1C,EAAA,IAAAC,EAAQkD,OAKWC,GAAK,wBAAAud,EAAAnjB,IAAA,SAJ7B,OAAAwC,EAAA,EAAoBC,EAAA,OAEnB,MAAKC,EAAK,yBAAA1C,EAAA,MACN,eAAK,QAET,IAAKA,EAAA,QAAA0D,GAAAf,EAAA,YAAA3C,EAAA,2HAAuP,iCAAsBA,EAAA,KAAiH,aAAAA,IAAA,KAAApH,EAAA+J,EAAA,mBAAA/J,EAAA,wBAAAoH,EAAA,MAAAI,EAAAuC,EAAA,mBAAAvC,EAAA,6DAAAJ,EAAA,wDArC/X,QAAW,uGCzCjBojB,GAAmB,GACnBC,GAAkB,GAClBC,GAAc,GACdC,GAAqB,GAErBC,GAAyB,IACzBC,GAA6B,KAC7BC,GAA2B,GAOjC,SAASC,GAAiBC,EAAiBvoB,EAAyB,CACnE,IAAIwoB,EAAa,EACbC,EAAS,EAEb,KAAOD,EAAaD,EAAQ,QAAUE,EAASzoB,EAAO,QAAQ,CAC7D,MAAM0oB,EAAcH,EAAQ,OAAOC,CAAU,EAAE,YAAY,EACrDG,EAAa3oB,EAAO,OAAOyoB,CAAM,EAAE,YAAY,EACjDC,IAAgBC,GACnBH,IAEC,EAAAC,CACH,CAEA,OAAOF,EAAQ,SAAW,GAAKvoB,EAAO,SAAW,GAAKwoB,IAAeD,EAAQ,MAC9E,CASA,SAASK,GAAWL,EAAiBvoB,EAAwD,CAMrF,OAAA6oB,GACNN,EACAvoB,EACA,EACA,EACA,KARyB,GAUzB,IACA,EACA,EACA,EAEF,CAEA,SAAS6oB,GACRN,EACAvoB,EACA8oB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACyC,CACzC,IAAIC,EAAW,EAGX,KAAEF,GAAkBC,EAChB,OAAE,QAAS,GAAO,SAAAC,GAI1B,GAAIR,IAAoBP,EAAQ,QAAUQ,IAAoB/oB,EAAO,OAC7D,OAAE,QAAS,GAAO,SAAAspB,GAI1B,IAAIC,EAAiB,GACjBC,EAAiC,GACjCC,EAAqB,EAGrBC,EAAa,GACjB,KAAOZ,EAAkBP,EAAQ,QAAUQ,EAAkB/oB,EAAO,QAAQ,CAEvE,GAAAuoB,EAAQO,CAAe,EAAE,gBAAkB9oB,EAAO+oB,CAAe,EAAE,cAAe,CACrF,GAAII,GAAaD,EACT,OAAE,QAAS,GAAO,SAAAI,GAGtBI,GAAcV,IACPC,EAAA,CAAC,GAAGD,CAAa,EACdU,EAAA,IAGd,MAAMC,EAA6B,GAC7BC,EAAkBf,GACvBN,EACAvoB,EACA8oB,EACAC,EAAkB,EAClBE,EACAU,EACAT,EACAC,EACAC,EACAC,CAAA,EAGKQ,EAAiBD,EAAgB,SACnCA,EAAgB,WAEf,CAACL,GAAkBM,EAAiBJ,KAChBD,EAAA,CAAC,GAAGG,CAAgB,EACtBF,EAAAI,GAELN,EAAA,IAGlBN,EAAQE,GAAW,EAAIJ,EACrB,EAAAD,CACH,CACE,EAAAC,CACH,CAEM,MAAAe,EAAUhB,IAAoBP,EAAQ,OAE5C,GAAIuB,EAAS,CACDR,EAAA,IAGP,IAAAS,EAAU5B,GAAyBc,EAAQ,CAAC,EACtCc,IAAU3B,GAA6BA,GAA6B2B,EAClET,GAAAS,EAGN,MAAAC,EAAYhqB,EAAO,OAASmpB,EAClCG,GAAYjB,GAA2B2B,EAGvC,QAASpR,EAAI,EAAGA,EAAIuQ,EAAWvQ,IAAK,CAC7B,MAAAqR,EAAUhB,EAAQrQ,CAAC,EAEzB,GAAIA,EAAI,EAAG,CACJ,MAAAsR,EAAUjB,EAAQrQ,EAAI,CAAC,EACzBqR,IAAYC,EAAU,IACbZ,GAAAvB,GAEd,CAGA,GAAIkC,EAAU,EAAG,CAEV,MAAAE,EAAWnqB,EAAOiqB,EAAU,CAAC,EAC7B1L,EAAOve,EAAOiqB,CAAO,EACvBE,IAAaA,EAAS,eAAiB5L,IAASA,EAAK,gBAC5C+K,GAAArB,KAEgBkC,IAAa,KAAOA,IAAa,OAEjDb,GAAAtB,GACb,MAGYsB,GAAApB,EAEd,CAGA,OAAIqB,IAAmB,CAACO,GAAWL,EAAqBH,IAE7CL,EAAA,CAAC,GAAGO,CAAoB,EACvBF,EAAAG,EACJ,CAAE,QAAS,GAAM,SAAAH,IACdQ,EAEH,CAAE,QAAS,GAAM,SAAAR,GAEjB,CAAE,QAAS,GAAO,SAAAA,EAE3B,CACO,OAAE,QAAS,GAAO,SAAAA,EAC1B,CAKA,SAASc,GAA2BC,EAAQC,EAAuB,CAC9D,GAAAD,EAAI,eAAeC,CAAI,EAC1B,OAAOD,EAAIC,CAAe,EAGrB,MAAAC,EAAWD,EAAK,MAAM,GAAG,EAE/B,IAAIE,EAASH,EACTzR,EAAI,EACD,KAAA4R,GAAU5R,EAAI2R,EAAS,QAAQ,CAC/B,MAAAvb,EAAMub,EAAS3R,CAAC,EACtB4R,EAASA,EAAOxb,CAAG,EACnB4J,GACD,CACO,OAAA4R,CACR,CAEgB,SAAAC,GACfC,EACAnlB,EACAolB,EACoC,CACpC,MAAMC,EAAUrlB,EAAK,OAAO,CAACslB,EAAyCle,IAAY,CACjF,IAAIme,EAAmD,GACvDH,EAAK,QAAQ,CAAC,CAAE,IAAA3b,EAAK,OAAA+b,KAAa,CAC3B,MAAAvd,EAAQ4c,GAASzd,EAAMqC,CAAG,EAC5B,MAAM,QAAQxB,CAAK,EACbsd,IAAO,OAAOtd,EAAM,IAAKwd,IAAO,CAAE,MAAOA,EAAG,OAAAD,CAAO,EAAE,CAAC,EACrD,OAAOvd,GAAU,UAC3Bsd,EAAO,KAAK,CACX,MAAAtd,EACA,OAAAud,CAAA,CACA,CACF,CACA,EAGD,MAAME,EAAYH,EAAO,OACxB,CACCD,EACA,CAAE,MAAArd,EAAO,OAAAud,KACL,CACJ,GAAI,CAACzC,GAAiBoC,EAAQld,CAAK,EAC3Bqd,SAGF,MAAA/lB,EAAQ8jB,GAAW8B,EAAQld,CAAK,EACtC1I,EAAM,UAAYimB,EAEZ,MAAE,QAAAjB,EAAS,SAAAR,CAAa,EAAAxkB,EAI9B,MAHI,CAAC+lB,GAAQf,GAGTA,GAAWe,GAAQvB,EAAWuB,EAAK,SAC/B/lB,EAED+lB,CACR,EACA,MAGD,OAAII,GACHJ,EAAK,KAAK,CACT,MAAOI,EAAU,SACjB,KAAAte,CAAA,CACA,EAGKke,CACR,EAAG,CAAE,GAEG,OAAAD,EAAA,KAAK,CAACM,EAAG9I,IACTA,EAAE,MAAQ8I,EAAE,KACnB,EAEMN,CACR,CCnQO,SAASO,GACftvB,EACAuvB,EACAvR,EAA0B,OACgB,WAC1C,MAAMwR,EAAgB,CACrB,KAAMC,GAAO,EACb,IAAKzvB,EAAK,KACV,YACCuvB,KAAeziB,GAAA5D,GAAAxH,EAAA1B,EAAK,QAAL,YAAA0B,EAAY,gBAAZ,YAAAwH,EAA4BwmB,MAA5B,YAAA5iB,EAAmD,KAAM6iB,GACzE,WAAY,CACX,GAAG3vB,CACJ,EACA,KAAAge,CAAA,EAGM,OACHwR,CAEL,CAEO,SAASI,GAAmB1S,EAA6B,CACzD,MAAA2S,EAA6B,CAACH,GAAqBI,EAAc,EACvE,OAAO5S,EAAM,OAAO,CAAC3U,EAA8BuI,IAAS,CAEvD,IAAAif,EAA0B,CAACJ,EAAmB,EAEvB,OAAAE,EAAA,QAASG,GAAa,cAC5C9mB,GAAAxH,EAAAoP,EAAK,QAAL,YAAApP,EAAY,aAAZ,MAAAwH,EAAwB,SAAS8mB,KACpCD,IAAgBljB,GAAAC,EAAAgE,EAAK,QAAL,YAAAhE,EAAY,gBAAZ,YAAAD,EAA4BmjB,KAAa,GAC1D,CACA,EAEaD,EAAA,QAASR,GAAwB,CACzChnB,EAAIgnB,CAAW,IACfhnB,EAAAgnB,CAAW,EAAI,IAEpBhnB,EAAIgnB,CAAW,EAAE,KAAKD,GAAkBxe,EAAMye,CAAW,CAAC,EAC1D,EAEMhnB,CACR,EAAG,CAAE,EACN,CAEO,SAAS0nB,GAAuBpwB,EAA6B,CACnE,OAAOA,EAAM,KAAK,CAACwvB,EAAG9I,IAAM,aAC3B,GAAI8I,EAAE,OAAS,QAAU9I,EAAE,OAAS,OAAe,SACnD,MAAM2J,IAAehnB,GAAAxH,EAAA2tB,EAAE,aAAF,YAAA3tB,EAAc,cAAd,YAAAwH,EAA2B,gBAAiBmmB,EAAE,IAC7Dc,IAAetjB,GAAAC,EAAAyZ,EAAE,aAAF,YAAAzZ,EAAc,cAAd,YAAAD,EAA2B,gBAAiB0Z,EAAE,IAEnE,OAAO2J,EAAa,cAAcC,EAAc,OAAW,CAAE,YAAa,OAAQ,EAClF,CACF,CAEgB,SAAAC,GAAYC,EAAsBnT,EAA6B,CAExE,MAAAoT,EAAgBD,EAAa,YAAY,EAAE,QAAQ,UAAW,EAAE,EAAE,UAQjE,OANNzB,GAAkC0B,EAAepT,EAAO,CACvD,CAAE,IAAK,yBAA0B,OAAQ,GAAI,EAC7C,CAAE,IAAK,yBAA0B,OAAQ,CAAE,EAC3C,GAAK,CAAC,GACN,IAAI,CAAC,CAAE,KAAApM,CAAK,IAAMA,CAAI,CAGzB,CAEO,SAASyf,GAAsBrT,EAAmD,CACjF,OAAAA,EAAM,IAAKpM,GAAUA,EAAK,OAAS,UAAYA,EAAK,SAAWA,CAAK,EAAE,KAAK,CACnF,CAEgB,SAAA0f,GACftT,EACAuT,EACuB,CACvB,MAAMC,EAAiBxT,EAAM,OAAO,CAAC3U,EAA2CuI,IAAS,CAClF,MAAA6f,EAAUF,EAAS,KAAMG,GAAMA,EAAE,MAAM,SAAS9f,EAAK,GAAG,CAAC,EACzDqC,GAAMwd,GAAA,YAAAA,EAAS,MAAO,QACxB,OAAApoB,EAAA4K,CAAG,EAAI,CAAC,GAAI5K,EAAI4K,CAAG,GAAK,GAAKrC,CAAI,EAC9BvI,CACR,EAAG,CAAE,GAEComB,EAAiC8B,EACrC,IACCE,IAAmC,CACnC,KAAM,UACN,IAAKA,EAAQ,IACb,MAAOA,EAAQ,MACf,SAAUV,GAAuBS,EAAeC,EAAQ,GAAG,GAAK,EAAE,KAGnE,OAAO,CACP,KAAM,UACN,IAAK,QACL,MAAOhsB,GAAK,SAAS,gCAAgC,EACrD,SAAUsrB,GAAuBS,EAAe,OAAS,EAAE,EAC3D,EACA,OAAQC,GAAYA,EAAQ,SAAS,OAAS,CAAC,EAE7C,OAAAhC,EAAO,QAAU,EACbzR,EAGDyR,CACR,CC3GO,MAAMkC,GAAsB/xB,GAAYgyB,GAAO,aAAc,IAAM,CACnE,MAAAC,EAAetxB,EAAoBuxB,EAAyB,EAC5DC,EAAcxxB,EAA0B,EAAE,EAC1C2E,EAAU3E,EAA6C,EAAE,EAEzDyxB,EAAYzxB,EAAI,EAAK,EACrB0xB,EAAa1xB,EAA2B,EAAE,EAE1C2xB,EAAsBtxB,EAAS,IACpC,OAAO,OAAOmxB,EAAY,KAAK,EAAE,IAAKlU,GAAMuS,GAAkBvS,CAAC,CAAC,GAGjE,SAASsU,EAAcxxB,EAA6B,CACnDoxB,EAAY,MAAQpxB,CACrB,CAEA,SAASyxB,EAAWzxB,EAAgD,CACnEuE,EAAQ,MAAQvE,CACjB,CAEA,SAAS0xB,EAAaC,EAAoB,CACzCN,EAAU,MAAQM,CACnB,CAEA,SAASC,EAAgBC,EAAsB,CAC9CX,EAAa,MAAQW,CACtB,CAEA,SAASC,EAAcD,EAA6B,CACnDP,EAAW,MAAQO,CACpB,CAEO,OACN,WAAAP,EACA,aAAAJ,EACA,UAAAG,EACA,YAAAD,EACA,QAAA7sB,EACA,aAAAmtB,EACA,gBAAAE,EACA,cAAAE,EACA,WAAAL,EACA,cAAAD,EACA,oBAAAD,CAAA,CAEF,CAAC,sHCpBKQ,EAAmBf,KACnBgB,EAAmB/xB,EAAS,KAAO,CACxC,sCAAuC,GAAGoP,EAAM,SAAS,CAAC,CAAC,KAC3D,qCAAsC,GAAGA,EAAM,SAAS,CAAC,CAAC,IACzD,o5BCmDF,SAAS4iB,GAAwBjyB,EAA+B0vB,EAAqB,CACpF,OAAO1vB,EACL,OAAQG,GAAS,kBAAA8M,GAAA5D,GAAAxH,EAAA1B,EAAK,QAAL,YAAA0B,EAAY,gBAAZ,YAAAwH,EAA4B4mB,MAA5B,YAAAhjB,EAA6C,SAASyiB,GAAY,EACnF,IAAKvvB,IAAU,CACf,IAAKA,EAAK,KACV,KAAM,OACN,WAAY,CACX,MAAO,CAAC,EACR,KAAMA,EAAK,KACX,YAAaA,EAAK,YAClB,MAAOA,EAAK,YACZ,YAAaA,EAAK,YAElB,KAAMA,EAAK,IACZ,CACC,IACD,KAAK,CAACqvB,EAAG9I,IAAM8I,EAAE,WAAW,YAAY,cAAc9I,EAAE,WAAW,WAAW,CAAC,CAClF,CAEO,SAASwL,GAAOC,EAAwC,CAC9D,MAAMrtB,EAAOC,KACP3F,EAAiBC,IAEjB+yB,EAAaH,GAAwB7yB,EAAe,mBAAoBizB,EAAkB,EAC1FC,EAAaL,GAAwB7yB,EAAe,mBAAoBmzB,EAAkB,EAEzF,OACN,MAAOC,GACP,MAAO1tB,EAAK,SAAS,6BAA6B,EAClD,SAAUA,EAAK,SAAS,kCAAkC,EAC1D,KAAMA,EAAK,SAAS,6BAA6B,EACjD,MAAO,CACN,GAAGstB,EACH,GAAGE,EACH,CACC,IAAKG,GACL,KAAM,OACN,WAAY,CACX,MAAO3tB,EAAK,SAAS,kCAAkC,EACvD,KAAM,QACN,YAAaA,EAAK,SAAS,6CAA6C,CACzE,CACD,CACD,EAEF,CACO,SAAS4tB,GAAYP,EAAwC,CACnE,MAAMrtB,EAAOC,KAEb,SAAS4tB,EAA2BC,EAAwC,CACpE,OACN,eAAgBA,EAChB,UAAW,CACV,MAAO,mBAAmBA,CAAkB,SAC7C,EACA,WAAY,oBAAoBA,CAAkB,GAEpD,CAEO,OACN,MAAOH,GACP,MAAO3tB,EAAK,SAAS,kCAAkC,EACvD,SAAUA,EAAK,SAAS,kCAAkC,EAC1D,MAAO,CACN,CACC,IAAK+tB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,cACN,GAAGF,EAA2B/oB,EAAmB,UAAU,CAC5D,CACD,EACA,CACC,IAAKkpB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,WACN,GAAGH,EAA2B/oB,EAAmB,eAAe,CACjE,CACD,EACA,CACC,IAAKmpB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,QACN,GAAGJ,EAA2B/oB,EAAmB,QAAQ,CAC1D,CACD,EACA,CACC,IAAKopB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,OACN,GAAGL,EAA2B/oB,EAAmB,cAAc,CAChE,CACD,EACA,CACC,IAAKqpB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,SACN,GAAGN,EAA2B/oB,EAAmB,WAAW,CAC7D,CACD,EACA,CACC,IAAKspB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,sBACN,GAAGP,EAA2B/oB,EAAmB,cAAc,CAChE,CACD,EACA,CACC,IAAKupB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,QACN,GAAGR,EAA2B/oB,EAAmB,MAAM,CACxD,CACD,EACA,CACC,IAAKwpB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,gBACN,GAAGT,EAA2B/oB,EAAmB,WAAW,CAC7D,CACD,EACA,CACC,IAAKypB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,kBACN,GAAGV,EAA2B/oB,EAAmB,aAAa,CAC/D,CACD,EACA,CACC,IAAK0pB,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,MACP,CACD,CACD,EAEF,CAEO,SAASC,GAAYvzB,EAA6B,CACxD,MAAM8E,EAAOC,KAgGN,MA9FgB,CACtB,MAAOosB,GACP,MAAOrsB,EAAK,SAAS,+CAA+C,EACpE,SAAUA,EAAK,SAAS,0DAA0D,EAClF,MAAO,CACN,CACC,IAAKgrB,GACL,KAAM,cACN,WAAY,CACX,kBAAmB,CAACpgB,GAAmB8jB,EAAoB,EAC3D,MAAO,oBACP,KAAM,gBACP,CACD,EACA,CACC,IAAKC,GACL,KAAM,OACN,SAAU,CAAC5D,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAM4D,GACN,YAAa3uB,EAAK,SAAS,2DAA2D,EACtF,YAAaA,EAAK,SAAS,2DAA2D,EACtF,KAAM,UACP,CACD,EACA,CACC,IAAK4K,GACL,KAAM,OACN,SAAU,CAACmgB,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAMngB,GACN,YAAa5K,EAAK,SAAS,0DAA0D,EACrF,YAAaA,EAAK,SAAS,0DAA0D,EACrF,SAAU,CACT,KAAM,OACN,KAAM,UACN,WAAY,0BACb,CACD,CACD,EACA,CACC,IAAKiJ,GACL,KAAM,OACN,SAAU,CAAC8hB,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAM9hB,GACN,YAAajJ,EAAK,SAAS,uDAAuD,EAClF,YAAaA,EAAK,SAAS,uDAAuD,EAClF,SAAU,CACT,KAAM,OACN,KAAM,OACN,WAAY,uBACb,CACD,CACD,EACA,CACC,IAAK2K,GACL,KAAM,OACN,SAAU,CAACogB,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAMpgB,GACN,YAAa3K,EAAK,SAAS,yDAAyD,EACpF,YAAaA,EAAK,SAAS,yDAAyD,EACpF,KAAM,kBACP,CACD,EACA,CACC,IAAK4uB,GACL,KAAM,OACN,SAAU,CAAC7D,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAM6D,GACN,YAAa5uB,EAAK,SAAS,2DAA2D,EACtF,YAAaA,EAAK,SAAS,2DAA2D,EACtF,KAAM,iBACP,CACD,EACA,CACC,KAAM,cACN,IAAK6uB,GACL,SAAU9D,GACV,WAAY,CACX,MAAO8D,GACP,KAAM,aACP,CACD,CACD,EAIF,CAEO,SAASC,GAAY5zB,EAA6B,CACxD,MAAM8E,EAAOC,KAEP8sB,EAAiB,CACtB,MAAOgC,GACP,MAAO/uB,EAAK,SAAS,gDAAgD,EACrE,MAAO,CACN,CACC,IAAKgrB,GACL,KAAM,cACN,WAAY,CACX,MAAO,oBACP,KAAM,QACN,kBAAmB,CAACgE,GAAoBC,EAAoB,CAC7D,CACD,EACA,CACC,KAAM,cACN,IAAKC,GACL,SAAUnE,GACV,WAAY,CACX,MAAOmE,GACP,KAAM,MACN,SAAU,CACT,CACC,IAAK,UACL,MAAOlvB,EAAK,SAAS,kCAAkC,EACvD,MAAO,CAACmvB,GAAeC,GAAgBC,EAAkB,CAC1D,EACA,CACC,IAAK,cACL,MAAOrvB,EAAK,SAAS,gDAAgD,EACrE,MAAO,CACNsvB,GACAC,GACAC,GACAC,EACD,CACD,EACA,CACC,IAAK,UACL,MAAOzvB,EAAK,SAAS,4CAA4C,EACjE,MAAO,CAAC0vB,GAAqBC,GAAqBC,EAAe,CAClE,EACA,CACC,IAAK,UACL,MAAO5vB,EAAK,SAAS,4CAA4C,EACjE,MAAO,CAAC6X,GAAgBgY,GAAoBC,GAAeC,EAAgB,CAC5E,CACD,CACD,CACD,EACA,CACC,KAAM,cACN,IAAKC,GACL,SAAUjF,GACV,WAAY,CACX,MAAOiF,GACP,KAAM,cACN,SAAU,CACT,CACC,IAAK,UACL,MAAOhwB,EAAK,SAAS,kCAAkC,EACvD,MAAO,CAACsvB,GAAkBW,GAAcC,GAA4BN,EAAe,CACpF,CACD,CACD,CACD,EACA,CACC,KAAM,cACN,IAAKO,GACL,SAAUpF,GACV,WAAY,CACX,MAAOoF,GACP,KAAM,UACP,CACD,EACA,CACC,KAAM,cACN,IAAKC,GACL,SAAUrF,GACV,WAAY,CACX,MAAOqF,GACP,KAAM,UACN,SAAU,CACT,CACC,IAAK,UACL,MAAOpwB,EAAK,SAAS,kCAAkC,EACvD,MAAO,CAACqwB,GAAwBzlB,GAAmBwkB,EAAc,CAClE,CACD,CACD,CACD,CACD,GAIG,OADgBl0B,GAAS,CAAC,GAAG,KAAMG,YAAS,OAAAkJ,GAAAxH,EAAA1B,EAAK,QAAL,YAAA0B,EAAY,aAAZ,YAAAwH,EAAwB,SAAS4mB,IAAe,GAE/F4B,EAAK,MAAM,KAAK,CACf,IAAKW,GACL,KAAM,OACN,WAAY,CACX,MAAO1tB,EAAK,SAAS,sCAAsC,EAC3D,KAAM,QACN,YAAaA,EAAK,SAAS,gCAAgC,EAC3D,IAAKA,EAAK,SAAS,4BAA4B,CAChD,EACA,EAEF+sB,EAAK,MAAM,KAAK,CACf,IAAKV,GACL,KAAM,OACN,WAAY,CACX,MAAOrsB,EAAK,SAAS,kDAAkD,EACvE,KAAM,OACN,YAAaA,EAAK,SAAS,6DAA6D,CACzF,EACA,EAEM+sB,CACR,CC3cO,MAAMuD,GAAmB,uBACnBC,GAAe,CAC3B,UACA,YACA,YACA,aACA,QACA,SACA,KACD,EAEaC,GAAwBr2B,GAAY,gCAAiC,IAAM,CACjF,MAAAs2B,EAAkB31B,EAA6B,EAAE,EACjD41B,EAAe51B,EAAmB,IAAI,EAEtC61B,EAAY71B,EAA6B,EAAE,EAEjD,SAAS81B,EAAY3xB,EAAmB,CAChC,OAAAA,GAAA,YAAAA,EAAS,aAAa,yBAC9B,CACA,SAAS4xB,EAAa5xB,EAAmB,CACjC,OAAAA,GAAA,YAAAA,EAAS,aAAaqxB,MAAqB,MACnD,CACA,eAAeQ,GAAwC,CAC/C,WAAI,QAASC,GAAY,CAERC,IACvB,WAAW,IAAM,CAChBP,EAAgB,MAAQ,MAAM,KAC7B,SAAS,iBAAiB,0BAA0B,GACnD,IAAKQ,GAAO,IAAI,QAAQA,CAAE,CAAC,EACrBF,KACN,CAAC,EACJ,CACF,CAES,SAAAG,EAAgBC,EAA0BC,EAAqB,CACrD,OAAO,OAAOT,EAAU,KAAK,EACvB,OAAQU,GAASA,EAAK,aAAa,SAASF,CAAW,CAAC,EAE1E,QAASE,GAAS,CACvB,GAAI,CAACX,EAAa,MAAO,QAGxBW,EAAK,YAAc,QACnBA,EAAK,UAAUT,EAAYQ,CAAU,GAAK,GAAIV,EAAa,KAAK,IAE1CA,EAAa,OAC9BW,EAAA,QAAQX,EAAa,MAAOS,CAAW,CAC7C,CACA,CACF,CAEA,eAAetgB,EAAU/S,EAAkB,WAC1C,MAAMwzB,EAAaxzB,EAAE,IACjB,IAACyyB,GAAa,SAASe,CAAU,EAAG,OACxCxzB,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAElB,MAAMgzB,EAAuB,EACvB,MAAAS,EAAkBd,EAAgB,MAAM,UAC5CtkB,GAAS0kB,EAAa1kB,GAAA,YAAAA,EAAM,OAAO,IAAMukB,EAAa,OAElDU,GAAar0B,EAAA0zB,EAAgB,MAAMc,CAAe,IAArC,YAAAx0B,EAAwC,QAErDy0B,EAAcF,IAAe,YAC7BG,EAAYH,IAAe,UAEjC,GAAKF,EAEL,IAAII,EAAa,CAChB,MAAME,EACLH,EAAkBd,EAAgB,MAAM,OAAS,EAAIc,EAAkB,EAAI,EAE5EI,GAAcptB,EAAAksB,EAAgB,MAAMiB,CAAa,IAAnC,YAAAntB,EAAsC,OAAO,CAC5D,CACA,GAAIktB,EAAW,CACd,MAAMG,EACLL,EAAkB,EAAIA,EAAkB,EAAId,EAAgB,MAAM,OAAS,EAE5EkB,GAAcxpB,EAAAsoB,EAAgB,MAAMmB,CAAa,IAAnC,YAAAzpB,EAAsC,OAAO,CAC5D,CACA+oB,EAAgBI,EAAYF,CAAU,EACvC,CAEA,SAASS,EAAgBxd,EAAY,CACpCqc,EAAa,MAAQrc,CACtB,CAEA,SAASsd,EAAcxlB,EAAgB,CAChC,MAAA2lB,EAASjB,EAAa1kB,CAAI,EAC3B2lB,IAELD,EAAgBC,CAAM,EAClB3lB,GAAA,MAAAA,EAAM,iBACTA,GAAA,MAAAA,EAAM,eAAe,CAAE,MAAO,QAAU,IAE1C,CAEA,eAAe4lB,EAAmB5tB,EAAe,OAChD,MAAM2sB,EAAuB,EAE7Ba,GAAc50B,EAAA0zB,EAAgB,MAAMtsB,CAAK,IAA3B,YAAApH,EAA8B,OAAO,CACpD,CAEA,SAASi1B,GAAqB,CAC7B,SAAS,iBAAiB,UAAWnhB,EAAW,CAAE,QAAS,GAAM,CAClE,CAEA,SAASohB,GAAqB,CACNjB,IACvB,SAAS,oBAAoB,UAAWngB,EAAW,CAAE,QAAS,GAAM,CACrE,CAES,SAAAqhB,EAAgBnlB,EAAcskB,EAAe,CAChDA,EAAA,aAAa,QAASF,GAAgB,CACtC,GAAAZ,GAAa,SAASY,CAAW,EAC1BR,EAAA,MAAQ,CAAE,GAAGA,EAAU,MAAO,CAAC5jB,CAAI,EAAGskB,OAEhD,OAAM,IAAI,MAAM,OAAOF,CAAW,mBAAmB,CACtD,CACA,CACF,CAEA,SAASH,GAAyB,CAEjCP,EAAgB,MAAQ,EACzB,CAEA,SAAS0B,GAAqB,CAC7B,OAAO1B,EAAgB,MAAM,UAC3BtkB,GAAS0kB,EAAa1kB,GAAA,YAAAA,EAAM,OAAO,IAAMukB,EAAa,MAEzD,CAEO,OACN,aAAAA,EACA,mBAAAsB,EACA,uBAAAlB,EACA,mBAAAmB,EACA,gBAAAC,EACA,mBAAAC,EACA,gBAAAN,EACA,mBAAAE,CAAA,CAEF,CAAC,EChGYK,GAAgBj4B,GAAY,wBAAyB,IAAM,CACvE,MAAM8yB,EAAmBf,KACnB,CAAE,mBAAAiG,GAAuB3B,KAEzB6B,EAAav3B,EAAiB,EAAE,EAEhCw3B,EAAmBn3B,EAA+B,IAAM,CAC7D,MAAMo3B,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAEtD,KAACE,GAAA,MAAAA,EAAO,eACX,OAAOA,EAAM,MAAQC,EAAoBD,EAAM,KAAK,EAAI,GAGrD,GAAAA,EAAM,QAAUE,EAAgB,MAAO,CACpC,MAAAC,EACLD,EAAgB,MAAM,OAAS,EAC5BA,EAAgB,MAChB7G,GAAsB2G,EAAM,eAAiB,CAAE,GAEnD,OAAOC,EAAoB/G,GAAY8G,EAAM,QAAU,GAAIG,CAAU,CAAC,CACvE,CACO,OAAAF,EAAoBD,EAAM,aAAa,EAC9C,EAEKI,EAAkBx3B,EAAoB,IAAM,CACjD,MAAMo3B,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC1D,GAAI,CAACE,EAAO,MAAO,GAEnB,MAAMK,EAAoBhH,GAAsB2G,EAAM,eAAiB,CAAE,GAElE,OACN,GAAGA,EACH,MAAOD,EAAiB,MACxB,UAAWM,EAAkB,OAAS,IAAKL,GAAA,YAAAA,EAAO,WACnD,CACA,EAEKM,EAAsB13B,EAC3B,IAAMw3B,EAAgB,MAAM,MAAQtG,EAAA,EAG/BoG,EAAkBt3B,EAA+B,IAAM,CAC5D,MAAMo3B,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC1D,OAAKE,GAAA,MAAAA,EAAO,YAELA,EAAM,YAAY,IAAKpmB,GAASwe,GAAkBxe,EAAMomB,EAAM,WAAW,CAAC,EAFjD,EAEiD,CACjF,EAGKO,EAAwB33B,EAA+B,IAAM,CAClE,MAAMo3B,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC1D,GAAI,EAACE,GAAA,MAAAA,EAAO,QAAQ,MAAO,GAErB,MAAAQ,EAAW9F,EAAiB,YAAY,IAAK9gB,GAASwe,GAAkBxe,CAAI,CAAC,EAG5E,OAFoBqmB,EAAoB/G,GAAY8G,EAAM,QAAU,GAAIQ,CAAQ,CAAC,EAE9D,OAAQ5mB,GAC1B,CAACmmB,EAAiB,MAAM,KAAMlB,GAAeA,EAAW,MAAQjlB,EAAK,GAAG,CAC/E,EACD,EAEK6mB,EAAqB73B,EAAS,IAAM8vB,GAAmBgC,EAAiB,WAAW,CAAC,EAE3E,eAAAgG,EACdjZ,EACAkZ,EACAhJ,EACC,OACD,MAAMlqB,EAAOC,KAET,IAAAkzB,EACAC,EAEAF,IAAa,IAChBC,EAAwB54B,EAAoB,6CAC5B64B,EAAA,CACf,WAAY,CACX,MAAOpzB,EAAK,SAAS,6BAA6B,EAClD,KAAM,OACP,KAGDmzB,EAAwB54B,EAAoB,8CAE5C64B,EAAgBxF,GAAc,EAAE,MAAM,KACpCzhB,GAASA,EAAK,WAAW,iBAAmB6N,CAAA,GAI/C,MAAMqZ,GAAS,EACDC,EAAA,CACb,MAAOF,GAAA,YAAAA,EAAe,WAAW,MACjC,SAAUzF,GACV,KAAM,QACN,MAAOV,EAAiB,oBACxB,SAAU,CACT,SAAU,OACV,KAAMmG,GAAA,YAAAA,EAAe,WAAW,KAChC,OAAOr2B,EAAAq2B,GAAA,YAAAA,EAAe,WAAW,YAA1B,YAAAr2B,EAAqC,KAC7C,EACA,WAAYq2B,GAAA,YAAAA,EAAe,WAAW,WACtC,WAAahb,GAA0B,OAGtC,GAAIA,EAAE,MAAQmb,GAA0B,SACxC,MAAMC,EAAcL,EAAsBnZ,CAAc,EAAE,SAAS5B,EAAE,GAAG,EAMpE,OAAAob,KAAez2B,EAAAmtB,GAAA,YAAAA,EAAQ,QAAR,MAAAntB,EAAe,QAC1BmtB,EAAO,MAAM,SAAS9R,EAAE,GAAG,EAG5Bob,CACR,EACA,YAAYrnB,EAAM,CACV,OACN,GAAGA,EACH,YAAa6N,CAAA,CAEf,EACA,YAAa,GACb,CACF,CAEA,SAASyZ,GAAwB,CAChC,MAAMlB,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC1D,GAAI,CAACE,GAAS,CAACI,EAAgB,MAAM,KAAM,OAEvC,IAAAe,GAAanB,GAAA,YAAAA,EAAO,QAAS,GAE7B,KAACA,GAAA,MAAAA,EAAO,OAAO,CACZ,MAAA3H,GAAc2H,GAAA,YAAAA,EAAO,cAAevH,GACpC2I,EAAqBX,EAAmB,MAAMpI,CAAW,EACzDkB,EAAWyG,EAAM,SAEnBzG,EACU4H,EAAA7H,GAAqB8H,EAAoB7H,CAAQ,EAEjD4H,EAAAC,CAEf,CAIA,IAAKpB,EAAM,mBAAqB,IAAI,OAAS,EAAG,CACzC,MAAAqB,EAAe3G,EAAiB,YACpC,OAAQ9gB,GAAS,cAAApP,EAAAw1B,EAAM,oBAAN,YAAAx1B,EAAyB,SAASoP,EAAK,MAAK,EAC7D,IAAKA,GAASwe,GAAkBxe,EAAMomB,EAAM,WAAW,CAAC,EAE/CmB,EAAA,KAAK,GAAGE,CAAY,CAChC,CAEIrB,EAAM,aACImB,IAAW,OAAOnB,EAAM,UAAU,GAG5CA,EAAM,cACImB,IAAW,IAAInB,EAAM,WAAW,GAIzCA,EAAM,QACVmB,EAAapI,GAAuBoI,CAAU,GAGxBG,EAAA,CAAE,cAAeH,CAAA,CAAY,CACrD,CAEA,SAASlB,EAAoBja,EAA6B,CAClD,OAAAA,EAAM,IAAKpM,IAAU,CAC3B,GAAGA,EACH,KAAM,GAAGA,EAAK,GAAG,IAAI/P,IAAM,EAC1B,GACH,CAEA,SAASk3B,EAAcf,EAAkB,CACpCI,EAAgB,MAAM,MACzBkB,EAAuB,CAAE,YAAa1B,EAAmB,CAAG,GAG7D,MAAM2B,EAAe13B,KACrBi2B,EAAW,MAAM,KAAK,CACrB,GAAGE,EACH,KAAMuB,EACN,oBAAqB,KACrB,YAAa,EACb,EACqBL,GACvB,CAEA,SAASM,GAAe,CACnBpB,EAAgB,MAAM,OACzBN,EAAW,MAAM,MACMwB,EAAA,CAAE,oBAAqB,MAAO,EAEvD,CAEA,SAASA,EAAuBtB,EAA2B,CAC1D,MAAMyB,EAAe3B,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC3D4B,EAAe5B,EAAW,MAAM,UAAWpG,GAAMA,EAAE,OAAS+H,EAAa,IAAI,EAC9EA,GAGL,OAAO,KAAKzB,CAAK,EAAE,QAAS/jB,GAAQ,CACnC,MAAM0lB,EAAW1lB,EACN6jB,EAAA,MAAM4B,CAAY,EAAI,CAChC,GAAG5B,EAAW,MAAM4B,CAAY,EAChC,CAACzlB,CAAG,EAAG+jB,EAAM2B,CAAQ,EACtB,CACA,CACF,CAEA,SAASC,GAAkB,CAC1B9B,EAAW,MAAQ,EACpB,CAEO,OACN,WAAAA,EACA,gBAAAM,EACA,oBAAAE,EACA,sBAAAC,EACA,6BAAAG,EACA,gBAAAkB,EACA,uBAAAN,EACA,cAAAP,EACA,aAAAS,CAAA,CAEF,CAAC,EC4FKK,GAAezd,GAAqB,SAAYC,GAAA,WAAO,4BAAoC,yHAAC,EAC5Fyd,GAAiB1d,GAAqB,SAAYC,GAAA,WAAO,8BAAiC,EAAC,0IAEjG0d,GAAe/6B,EAAgB,CAC9B,KAAM,WACN,OAAQ,CACPsP,GACAqO,GACA1d,GACAsP,GACAwB,GACAuH,GACArN,EACD,EACA,WAAY,CACX,gBAAA+vB,GACA,KAAAC,GACA,OAAAC,GACA,gBAAAC,GACA,wBAAAC,GACA,aAAAP,GACA,eAAAC,GACA,YAAAO,EACD,EACA,MAAMrqB,EAAOC,EAAK,SACjB,MAAM8M,EAAgBjR,KAChBwuB,EAAS50B,KACT0gB,EAAchhB,KACdm1B,EAAa/0B,KACb2L,EAAcC,KAEb,OACN,OAAAkpB,EACA,YAAAlU,EACA,WAAAmU,EACA,YAAAppB,EACA,cAAA4L,EACA,GAAG1V,GAAqB,EACxB,GAAGmzB,GAAqB,EACxB,GAAGC,GAAe,EAClB,GAAGvwB,GAAS,EACZ,GAAGgG,GAAW,EACd,GAAG/G,GAAkB,EACrB,GAAGuxB,GAAsB,EAEzB,IAAG1wB,GAAAxH,EAAAuN,IAAY,QAAZ,YAAA/F,EAAA,KAAAxH,EAAoBwN,EAAOC,EAAG,CAEnC,EACA,cAAe,CAAC0qB,EAAKC,EAAIC,IAAS,CACjC,QAAQ,MAAM,eAAe,EAC7B,QAAQ,MAAMF,CAAG,CAClB,EACA,MAAO,CAEN,MAAM,OAAOG,EAAWC,EAAa,CACpC,KAAK,sBAAsB,EAErB,MAAAC,EAAaC,GAAeH,CAAE,EAC9BI,EAAyB,CAAC,KAAK,QAAQ,oBAC7C,IAAIC,EACHJ,EAAK,OAAO,OAASD,EAAG,OAAO,MAE/B,EAAEC,EAAK,OAAO,OAAS,OAAS,KAAK,kBAAoBK,KACvDL,EAAK,OAAS/W,EAAM,cAEtB8W,EAAG,OAAO,SAAW,eAChB,MAAAO,EAAoBP,EAAG,OAAS9W,EAAM,gBAGxC,GAAAgX,IAAeM,GAAiB,UAAYD,EAAmB,CAC9D,GAAAF,GAAmBD,GAA0BG,EAAmB,CAEnE,GADA,KAAK,aAAa,EACdH,EAAwB,CACrB,MAAAK,EAAqB,KAAK,QAAQ,aACxC,KAAK,eAAe,EACpB,KAAK,QAAQ,aAAeA,CAC7B,CACM,cAAQ,IAAI,CAAC,KAAK,kBAAmB,KAAK,SAAU,EAAC,EAC3D,KAAK,YAAY,EACb,KAAK,gBACR,KAAK,cAAgB,GAEvB,CACA,MAAM,KAAK,uBACZ,CAEIP,IAAeM,GAAiB,aACnCH,EACCJ,EAAK,OAAO,OAASD,EAAG,OAAO,MAC/B,EAAEA,EAAG,OAAO,OAAS,OAASC,EAAK,OAAO,OAAS,QAChDI,IAEH,KAAK,QAAQ,oBAAsB,IAGtC,EACA,YAAa,CAEZ,KAAK,iBAAmB,EACzB,EACA,gBAAgBK,EAAiB,CAE5BA,IAAoB,IAClB,iBAAY,qCAAqC,KAAK,yBAAyB,CACtF,EACA,cAAcC,EAAU,CACjB,MAAAC,EAAa,KAAK,MAAM,SAC1BA,IACQA,EAAA,MAAM,UAAY,SAASD,CAAQ,IAEhD,CACD,EACA,MAAM,iBAAiBX,EAAIC,EAAMY,EAAM,CACtC,GACCV,GAAeH,CAAE,IAAMQ,GAAiB,YACxCP,EAAK,OAAS/W,EAAM,iBACnBiX,GAAeH,CAAE,IAAMQ,GAAiB,UAAYP,EAAK,OAAS/W,EAAM,gBACxE,CACI2X,IACL,MACD,CACA,GAAI,KAAK,QAAQ,cAAgB,CAAC,KAAK,YAAa,CAC7C,MAAAC,EAAe,MAAM,KAAK,QAC/B,KAAK,QAAQ,SAAS,4CAA4C,EAClE,CACC,MAAO,KAAK,QAAQ,SAAS,6CAA6C,EAC1E,KAAM,UACN,kBAAmB,KAAK,QAAQ,SAC/B,sDACD,EACA,iBAAkB,KAAK,QAAQ,SAC9B,qDACD,EACA,UAAW,EACZ,GAEGA,IAAiBlrB,IAEf,oBAAe,cAAc0qB,EAA6B,EACjD,MAAM,KAAK,oBAAoB,GAAI,EAAK,GAE/C,WAAK,cAAc,mBAE1B,KAAK,QAAQ,aAAe,GAExBL,EAAK,OAAS/W,EAAM,aAGvB,MAAM,KAAK,QAAQ,QAClB,CAAE,KAAMA,EAAM,SAAU,OAAQ,CAAE,KAAM,KAAK,gBAAkB,EAC/D,IAAM,CAGA,KAAK,QAAQ,KAAK8W,CAAiB,CACzC,IAGI,wBAAmB,qBAAqB,KAAK,eAAe,EAC5Da,MAEIC,IAAiBC,KACtB,wBAAmB,qBAAqB,KAAK,eAAe,EAC5D,oBAAe,cAAcT,EAA6B,EAC/D,KAAK,eAAe,EACpB,KAAK,QAAQ,aAAe,GACvBO,IACN,MAEK,wBAAmB,qBAAqB,KAAK,eAAe,EAC5DA,GAEP,EACA,SAAU,CACT,GAAGz8B,EACFS,GACAm8B,GACAzqB,GACAsgB,GACA3xB,EACAmK,GACA4xB,GACAjX,GACAkX,GACA78B,GACAW,EACAm8B,GACAtK,GACAuK,GACA5qB,GACAnR,GACAg8B,GACAC,GACAC,EACD,EACA,gCAA2C,CAC1C,OAAO,KAAK,eAAe,8BAC5B,EACA,aAA4B,CAC3B,OAAO,KAAK,WAAW,WACxB,EACA,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,4BAAsC,CACrC,OAAO,KAAK,eAAe,0BAC5B,EACA,QAAkB,CACV,YAAK,OAAO,OAASrY,EAAM,IACnC,EACA,qBAA+B,CAE7B,YAAK,iBAAmB,MAAQ,CAAC,KAAK,iBAAmB,CAAC,KAAK,QAAU,CAAC,KAAK,WAEjF,EACA,kBAAmC,CAClC,OAAO,KAAK,QAAQ,mBACrB,EACA,OAAmB,CAClB,OAAO,KAAK,eAAe,QAC5B,EACA,eAA2B,CACnB,YAAK,eAAe,SAAS,OAAQljB,GAASA,EAAK,OAASgG,EAAgB,CACpF,EACA,kBAA8B,CACtB,YAAK,eAAe,SAAS,OAAQhG,GAASA,EAAK,OAASgG,EAAgB,CACpF,EACA,eAAwB,CACnB,OAAC,KAAK,gBAIN,KAAK,2BACD,KAAK,QAAQ,SAAS,+CAA+C,EAGtE,KAAK,QAAQ,SAAS,0CAA0C,EAP/D,KAAK,QAAQ,SAAS,wCAAwC,CAQvE,EACA,eAAwB,CACjB,MAAA1H,EAAiB,KAAK,QAAQ,uBAC7B,OACN,KAAMA,EAAe,CAAC,EAAI,KAC1B,IAAKA,EAAe,CAAC,EAAI,KAE3B,EACA,sBAA+B,CACvB,OACN,iBAAkB,KAAK,iBAAmB,OAAS,MAErD,EACA,iBAA0B,CACzB,OAAOk9B,GACN,KAAK,cACL,KAAK,QAAQ,uBACb,KAAK,mBAEP,EACA,iBAAkB,CACjB,MAAMC,EAAgB,GAClB,YAAK,gBAAkB,KAAK,wBAC3B,KAAK,QAAQ,uBAChBA,EAAc,KAAK,iBAAiB,EAEpCA,EAAc,KAAK,aAAa,IAG9B,KAAK,cAAgB,KAAK,gBAAkB,KAAK,uBAEpDA,EAAc,KAAK,eAAe,EAG/B,KAAK,oBAAoB,OAC5BA,EAAc,KAAK,8BAA8B,EACjDA,EAAc,KAAK,qCAAqC,KAAK,oBAAoB,IAAI,EAAE,EACzEA,EAAA,KACb,2CAA2C,KAAK,oBAAoB,UAAU,KAIzEA,CACR,EACA,mBAA+C,CAC9C,OAAO,KAAK,eAAe,oBAC5B,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,iBAA0B,CACzB,OAAO,KAAK,OAAO,OAAO,MAAQ,KAAK,eAAe,UACvD,EACA,cAAuB,CACtB,OAAO,KAAK,eAAe,YAC5B,EACA,qBAA+B,CAEvB,OADsB,KAAK,aAAa,OAAQz7B,GAASA,EAAK,QAAQ,EACjD,SAAW,KAAK,aAAa,MAC1D,EACA,cAA0B,CACzB,OAAO,KAAK,MAAM,OAChBA,GAASA,EAAK,OAASC,IAAmB,KAAK,eAAe,cAAcD,EAAK,IAAI,EAExF,EACA,iBAA2B,CACnB,YAAK,aAAa,OAAS,CACnC,EACA,kBAA4B,CAC3B,OAAO,KAAK,mBAAqB,KAAK,aAAa,SAAW,CAC/D,EACA,mBAA6B,CACrB,OAAC,CAAC,KAAK,MAAM,KAClBA,GAASA,EAAK,OAAS07B,IAAiC17B,EAAK,WAAa,GAE7E,EACA,qBAA+B,CACvB,OAAC,KAAK,iBAAmB,KAAK,mBACtC,EACA,2BAAwC,CACvC,OAAO,KAAK,QAAQ,sBACrB,EACA,eAAwB,CACvB,OAAO,KAAK,YAAY,aACzB,EACA,UAAmC,CAClC,OAAO,KAAK,YAAY,eACzB,EACA,WAAqB,CACpB,OAAO,KAAK,iBAAmB,IAChC,EACA,uBAAkC,CAC1B,YAAK,eAAe,oBAC5B,CACD,EACA,MAAO,CACC,OACN,UAAW27B,GACX,iBAAA31B,GACA,iBAAkB,GAClB,kBAAmB,CAAC,IAAK,GAAG,EAC5B,eAAgB,GAChB,qBAAsB,GACtB,wBAAyB,GACzB,cAAe,GACf,mBAAoB,GACpB,uBAAwB,KACxB,eAAgB,GAChB,cAAe,GACf,oBAAqB,CACpB,KAAM,KACN,WAAY,IACb,EACA,eAAgB,GAChB,iBAAkB,GAClB,mBAAoB,GACpB,0BAA2B,GAC3B,aAAc,KACd,iBAAkB,KAClB,iBAAkB,GAClB,6BAA8B,GAC9B,WAAY,OACZ,UAAW,OACX,qBAAsB,KAItB,oCAAqC,GACrC,0BAAA41B,GACA,eAAgB,GAChB,cAAe,OACf,WAAY,GACZ,eAAgB,GAElB,EACA,QAAS,CACR,kBAA4B,OACvB,MAAAl6B,EAAA,KAAK,uBAAL,MAAAA,EAA2B,SAG3B,YAAK,iBAAmB,KAAK,aAC3B,0BAAuB,KAAK,YAAY,CAC5C,MAAO,KAAK,QAAQ,SACnB,KAAK,YACF,2BAA2B,KAAK,gBAAkB,aAAe,WAAW,SAC5E,uCACJ,EACA,QAAS,KAAK,QAAQ,SACrB,KAAK,YACF,2BACA,KAAK,gBAAkB,aAAe,WACtC,WACA,yCACJ,EACA,KAAM,OACN,yBAA0B,GAC1B,EAEM,IAED,EACR,EACA,yBAAyB8vB,EAAoB,CAC5C,KAAK,0BAA4BA,CAClC,EACA,UAAUjuB,EAAkBsH,EAAgB,CAC3C,MAAM7K,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACjDwH,EAAmB,CACxB,UAAW/K,EAAOA,EAAK,KAAO,KAC9B,YAAa,KAAK,eAAe,WACjC,OAAQ,SACR,WAAY,KAAK,SAAS,WAEtB,gBAAW,MAAM,mCAAoC+K,CAAgB,EACrE,KAAK,cAAc,IAAI,qBAAsBA,CAAgB,EAC7D,KAAK,YAAY,CAAE,gBAAiBxH,EAAU,OAAAsH,EAAQ,CAC5D,EACA,MAAM,YAAa,CAClB,MAAME,EAAmB,CACxB,YAAa,KAAK,eAAe,YAE7B,gBAAW,MAAM,gCAAiCA,CAAgB,EAClE,KAAK,cAAc,IAAI,sBAAuBA,CAAgB,EAC9D,aAAQ,UAAU8wB,EAA0B,CAClD,EACA,MAAM,eAAgB,CAChB,KAAK,wBAAwB,KAAMC,GAAiB,CACxD,MAAM/wB,EAAmB,CACxB,YAAa,KAAK,eAAe,WACjC,kBAAmB,KAAK,UACvBgxB,GAAoCD,EAA+B,KAAK,cAAc,EACpF,SACH,GAEI,gBAAW,MAAM,uCAAwC/wB,CAAgB,EACzE,KAAK,cAAc,IAAI,yBAA0BA,CAAgB,EACtE,EAEK,WAAK,YAAY,EAAE,EACzB,KAAK,4BAA4B,CAClC,EACA,sBAAuB,CACD,OAAO,OAAO,KAAK,SAAS,mBAAoB,GAAE,QACrE6qB,GAAOA,EAAG,WAIV,OAAQ3P,IAAaA,GAAA,YAAAA,EAAU,SAAS,QAAS+V,EAAuB,EACxE,QAAS/V,GAAa,CACtB,MAAMgW,EAAsBhW,GAAA,YAAAA,EAAU,SAClCgW,KAAwBhW,GAAA,YAAAA,EAAU,cAAe,CAAC,GAAG,OAAS,GACjEgW,EAAoB,WAAW,CAChC,CACA,CACH,EACA,6BAA8B,CACvB,MAAAC,EAAa,KAAK,eAAe,SAAS,OAAQ92B,GAAMA,EAAE,MAAM,EAEtE,KAAK,qBAAqB,EACf82B,EAAA,QAASl8B,GAAS,OAC5B,MAAMm8B,EAAc,KAAK,SAAS,kBAAkBn8B,EAAK,EAAE,EACrDo8B,EAAY,KAAK,SAAS,aAAaD,CAAW,EAEjD,cAAKz6B,EAAA1B,GAAA,YAAAA,EAAM,SAAN,YAAA0B,EAAc,QAAS,EAAE,EAAE,QAASid,GAAmB,CACjCyd,EAAU,OACzC35B,GAAMA,EAAE,aAAa,QAAUkc,CAAA,EAER,QAASsH,GAAa,CAC9C,MAAMgW,EAAsBhW,GAAA,YAAAA,EAAU,SAClCgW,GACHA,EAAoB,SAAS,CAC9B,CACA,EACD,EACD,CACF,EACA,qBAAsB,CACjB,QAAK,iBAAmB,CAAC,KAAK,oBAAqB,OAEvD,MAAMnyB,EACL,KAAK,iBAAmB,KAAK,oBAC1B,KAAK,QAAQ,SAAS,iCAAiC,EACvD,KAAK,QAAQ,SAAS,+BAA+B,EAEzD,KAAK,qBAAqB,CACzB,IAAK,kBACL,OAAQ,IACP,KAAK,mBAAmB8xB,GAA0B,4BAA4B,EAC/E,EAEK,MAAAS,EAAS,KAAK,YAAY,CAC/B,KAAM,OACN,MAAO,KAAK,QAAQ,SAAS,+BAA+B,EAC5D,QAAAvyB,EACA,SAAU,IACV,QAAS,IACR,WAAW,IAAM,CAEZ,KAAK,kBAAkBuyB,EAAO,MAAM,GACtC,CAAC,EACL,yBAA0B,GAC1B,CACF,EACA,oBAAqB,CACpB,KAAK,eAAe,sBAAwB,KAC5C,KAAK,YAAY,4BAClB,EACA,MAAM,uBAAuB,EAAkB,CAC1C,IAAAC,EAAQ,MAAM,KAAK,sBACnBA,IACG,WAAK,cAAc,mBAErB,KAAK,OAAO,OAASpZ,EAAM,iBACxB,WAAK,QAAQ,QAAQ,CAC1B,KAAMA,EAAM,SACZ,OAAQ,CAAE,KAAM,KAAK,eAAgB,EACrC,GAGC,KAAK,aAGJ,EAAE,kBAAkB,iBACvBoZ,EAAQ,EAAE,OAAO,SAETA,EAAA,GAELA,GACH,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,uBAAuB,EACpD,KAAM,UACN,EAGJ,EACA,mBAAmBzxB,EAA+B,CAC7C,KAAK,mBACJ,sBAAiB,gBAAgBmmB,EAAyB,EAC1D,sBAAiB,aAAa,EAAI,EACvC,KAAK,oBAAoB,CAAE,OAAAnmB,EAAQ,iBAAkB,EAAM,GAC5D,EACA,MAAM,cAAc0xB,EAAqB,SACxC,KAAK,aAAa,EAClB,KAAK,eAAe,EAChB,IAAA7yB,EACA,IACHA,EAAO,MAAM,KAAK,eAAe,aAAa6yB,CAAW,QACjD5yB,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,wCAAwC,CAAC,EACrF,MACD,CACA,GAAID,IAAS,OACZ,MAAM,IAAI,MAAM,sBAAsB6yB,CAAW,uBAAuB,EAgDzE,GA9CA,KAAK,eAAe,gBAAgB,CACnC,QAAS7yB,EAAK,aAAa,KAC3B,cAAe,GACf,EACI,oBAAe,cAAc4wB,EAA6B,EAC1D,oBAAe,yBAAyB5wB,CAAI,EAC7CA,EAAK,aAAa,SACrB,KAAK,eAAe,mBAAmBA,EAAK,aAAa,OAAO,EAG7DA,EAAK,aAAa,SACrB,KAAK,iBAAiB,mBAAmB,CACxC,WAAYA,EAAK,aAAa,GAC9B,QAASA,EAAK,aAAa,QAC3B,EAGEA,EAAK,aAAa,YACrB,KAAK,iBAAiB,sBAAsB,CAC3C,WAAYA,EAAK,aAAa,GAC9B,WAAYA,EAAK,aAAa,WAC9B,EAGEA,EAAK,aAAa,iBACrB,KAAK,eAAe,mBAAmBA,EAAK,aAAa,eAAe,EAGzE,MAAM,KAAK,SACV6I,GAAS7I,EAAK,aAAa,KAAK,EAChC6I,GAAS7I,EAAK,aAAa,WAAW,GAEvC,MAAM,KAAK,YACX,KAAK,YAAY,YACjB,KAAK,QAAQ,aAAe,GACvB,KAAK,cAAc,IAAI,iBAAkB,CAC7C,WAAYA,EAAK,aAAa,GAC9B,aAAcA,EAAK,aAAa,KAChC,YAAA6yB,CAAA,CACA,EACI,gBAAW,MAAM,kCAAmC,CACxD,YAAa7yB,EAAK,aAAa,GAC/B,eAAgBA,EAAK,KACrB,mBAAoBA,EAAK,SACzB,EAEG,CAACA,EAAK,YAAYR,GAAAxH,EAAAgI,EAAK,OAAL,YAAAhI,EAAW,aAAX,MAAAwH,EAAuB,OAAO,CAEnD,IAAIszB,EAAiB,GACjB,GAAA9yB,EAAK,KAAK,WAAW,QAAS,CAC3B,MAAA+S,EAAU/S,EAAK,KAAK,WAAW,QACrC+yB,EAAY,UAAWl5B,KAAY,OAAO,KAAKkZ,CAAO,EAC1C,UAAAC,KAAYD,EAAQlZ,CAAQ,EACtC,GAAImZ,EAAS,MAAO,CACF8f,EAAA,GACX,MAAAC,CACP,CAGH,CAEI,CAACD,GAAkB9yB,EAAK,KAAK,WAAW,MAAM,QAEzC,cAAM,aAAa6yB,CAAW,SAAS,EAC/C,QAAQ,MAAM7yB,EAAK,KAAK,WAAW,MAAM,KAAK,EAC9C,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,kCAAkC,EAC/D,QAASA,EAAK,KAAK,WAAW,MAAM,QACpC,KAAM,QACN,SAAU,EACV,EAEH,CACKA,EAA4B,UAChC,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,wCAAwC,EACrE,QAAS,2BAA2B,KAAK,QAAQ,SAChD,mBACA,QAAQ,KAAK,QAAQ,SACrB,gCACA,6GAA6G,KAAK,QAAQ,SAC1H,mBACA,QACD,KAAM,UACN,SAAU,EACV,EAEF,KAAK,YAAY,CAClB,EACA,MAAM,oBAAoBA,EAAyC,CAClE,GAAI,CAACA,EAAK,SAAS,OAAS,CAACA,EAAK,SAAS,YACpC,UAAI,MAAM,yBAAyB,EAE1C,KAAK,eAAe,EACpBA,EAAK,SAAS,MAAQgzB,GAAgChzB,EAAK,SAAS,KAAK,EAEzE,MAAM,KAAK,SAASA,EAAK,SAAS,MAAoBA,EAAK,SAAS,WAAW,EAE3EA,EAAK,SAAS,SACjB,KAAK,eAAe,mBAAmBA,EAAK,SAAS,OAAO,EAE7D,MAAM,KAAK,YACX,KAAK,YAAY,WAClB,EACA,MAAM,qBAAqBizB,EAAoB,CAC9C,KAAK,aAAa,EAClB,KAAK,eAAe,KAAK,QAAQ,SAAS,0BAA0B,CAAC,EACrE,KAAK,eAAe,EAEf,oBAAe,0BAA4B,GAChD,KAAK,eAAe,wBAA0B,KAE1C,IAAAjzB,EACA,IAIH,GAHK,KAAK,cAAc,IAAI,qBAAsB,CAAE,WAAAizB,EAAY,EAChEjzB,EAAO,MAAM,KAAK,eAAe,yBAAyBizB,CAAU,EAEhE,CAACjzB,EACJ,MAAM,IAAI,MACT,KAAK,QAAQ,SAAS,iDAAkD,CACvE,YAAa,CAAE,WAAAizB,CAAW,EAC1B,SAGKhzB,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,gCAAgC,CAAC,EAC7E,MAAM,KAAK,QAAQ,QAAQ,CAAE,KAAMuZ,EAAM,aAAc,EACvD,MACD,CAEA,KAAK,cAAgB,GACf,WAAK,QAAQ,QAAQ,CAAE,KAAMA,EAAM,aAAc,MAAO,CAAE,WAAAyZ,CAAW,CAAG,GAE9E,MAAM,KAAK,SAASjzB,EAAK,SAAS,MAAOA,EAAK,SAAS,WAAW,EAC7D,kBAAgB,MAAM,KAAK,eAAe,mBAAmBA,EAAK,IAAI,GAAM,GACjF,MAAM,KAAK,YACX,KAAK,YAAY,YACjB,KAAK,QAAQ,aAAe,GAEvB,KAAK,cAAc,IAAI,gBAAiB,CAC5C,WAAAizB,EACA,aAAcjzB,EAAK,KACnB,SAAUA,EAAK,SACf,EACD,KAAK,YAAY,CAClB,EACA,MAAM,aAAaU,EAAuB,CACzC,KAAK,aAAa,EAEZ,MAAAwyB,EAAoB,KAAK,eAAe,wBAE9C,KAAK,eAAe,EAEf,oBAAe,YAAYxyB,CAAQ,EACxC,KAAK,eAAe,UAAUA,EAAS,QAAU,EAAK,EACjD,oBAAe,cAAcA,EAAS,EAAE,EACxC,oBAAe,gBAAgB,CAAE,QAASA,EAAS,KAAM,cAAe,GAAO,EACpF,KAAK,eAAe,oBAAoBA,EAAS,UAAY,CAAE,GAC/D,KAAK,eAAe,mBAAmBA,EAAS,SAAW,CAAE,GACxD,oBAAe,qBAAqBA,EAAS,SAAS,EAEvDA,EAAS,SACZ,KAAK,iBAAiB,mBAAmB,CACxC,WAAYA,EAAS,GACrB,QAASA,EAAS,QAClB,EAGEA,EAAS,YACZ,KAAK,iBAAiB,sBAAsB,CAC3C,WAAYA,EAAS,GACrB,WAAYA,EAAS,WACrB,EAGEA,EAAS,iBACP,oBAAe,mBAAmBA,EAAS,eAAe,EAG1D,MAAAyyB,EAAQzyB,EAAS,MAAQ,GACzB0yB,EAASD,EAAK,IAAKE,GAAQA,EAAI,EAAE,EACvC,KAAK,eAAe,kBAAkBD,GAAU,CAAE,GAC7C,eAAU,WAAWD,CAAI,EAE9B,MAAM,KAAK,SAASzyB,EAAS,MAAOA,EAAS,WAAW,EAEnD,KAAK,qBACT,KAAK,QAAQ,aAAe,IAE7B,KAAK,YAAY,YACZ,KAAK,cAAc,IAAI,gBAAiB,CAC5C,WAAYA,EAAS,GACrB,aAAcA,EAAS,KACvB,GACGwyB,GAAA,YAAAA,EAAmB,cAAexyB,EAAS,IAC9C,KAAK,eAAe,wBAA0B,KACzC,oBAAe,0BAA4B,IAEhD,KAAK,eAAe,wBAA0BwyB,EAE/C,KAAK,YAAY,EACZ,wBAAmB,qBAAqBxyB,EAAS,EAAE,CACzD,EACA,SAAS,EAA4B,CAChC,KAAK,eACR,KAAK,UAAU,CAAC,CAElB,EACA,UAAU,EAA4B,CAEhC,uBAAoB,KAAK,+BAA+B,CAAC,EAC1D,aAAa,YAAc,EAAE,SAAW,IAC3C,KAAK,qBAAuB,IAGxB,0BAAqB,EAAiB,KAAK,oBAAoB,EAC/D,2BAAsB,EAAiB,KAAK,oBAAoB,EAGrE,KAAK,iBAAmB,EACzB,EACA,QAAQ,EAAe,CAClB,EAAE,SAAW,IAChB,KAAK,qBAAuB,IAE7B,KAAK,mBAAmB,CAAC,EACzB,KAAK,oBAAoB,CAAC,CAC3B,EACA,MAAM,EAAkB,CACnB,EAAE,MAAQ,KAAK,iBAClB,KAAK,eAAiB,IAEnB,EAAE,MAAQ,MACb,KAAK,qBAAuB,GAE9B,EACA,MAAM,QAAQ,EAAkB,CAC/B,KAAK,YAAY,QAEX,MAAA4yB,EAAe,KAAK,iBAAiB,CAAC,GAAK,CAAC,EAAE,UAAY,CAAC,EAAE,OAC7DC,EAAgB,EAAE,UAAY,CAAC,EAAE,QAAU,CAAC,KAAK,iBAAiB,CAAC,EACnEC,EAAkB,KAAK,iBAAiB,CAAC,GAAK,EAAE,QAAU,CAAC,EAAE,SAC7DC,EAAiB,CAAC,KAAK,iBAAiB,CAAC,GAAK,CAAC,EAAE,UAAY,CAAC,EAAE,OAChE58B,EAAW,KAAK,iBAAmB,KAAK,YAE9C,GAAI,EAAE,MAAQ,KAAOy8B,GAAgB,CAACz8B,EAAU,CAI3C,GAHJ,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEb,KAAK,iBAAmB,KAAK,YAChC,OAGI,KAAK,cAAc,yBAA0B,CAAE,aAAc,KAAQ,CAAC,EAE3E,MACD,CAGA,MAAM0S,EAAO,EAAE,MAAS,EAAE,cAAgB,EAAE,eAI5C,UAAWrP,KAAWqP,EAEpB,GAAArP,EAAQ,WACR,OAAOA,EAAQ,WAAc,UAC7BA,EAAQ,UAAU,SAAS,kBAAkB,EAE7C,OAKF,GAAI,OAAO,SAAS,KAAK,UAAU,SAAS,yBAAyB,EACpE,OAGG,KAAE,MAAQ,UAAYu5B,EAAgB,CACzC,KAAK,iBAAmB,GACpB,KAAK,aACH,KAAK,cAAc,IAAI,iCAAiC,EAC7D,KAAK,SAAS,eAAiB,MAGhC,MACD,CAGA,GAAI,KAAK,WACR,OAGK,MAAAp4B,EAAgB,KAAK,QAAQ,iBACjC,IAAK/E,GAASA,GAAQ,KAAK,eAAe,cAAcA,EAAK,IAAI,CAAC,EAClE,OAAQA,GAAS,CAAC,CAACA,CAAI,EAEzB,GAAI,EAAE,MAAQ,KAAOm9B,GAAkB,CAAC58B,EAClC,KAAK,cAAc,wBAAyB,CAAE,aAAc,KAAOwE,CAAa,UAC3E,EAAE,MAAQ,KAAOi4B,GAAgB,CAACz8B,EACxCwE,EAAc,OAAS,IAC1B,EAAE,eAAe,EACZ,KAAK,eAAeA,CAAa,WAE7B,EAAE,MAAQ,KAAOo4B,GAAkB,CAAC58B,EAC1CwE,EAAc,OAAS,IAC1B,EAAE,eAAe,EACZ,oBAAeA,EAAe,mBAAmB,YAE5C,EAAE,MAAQ,UAAY,EAAE,MAAQ,cAAgBo4B,GAAkB,CAAC58B,EAC9E,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,cAAe,CAAE,aAAc,KAAOwE,CAAa,UACjE,EAAE,MAAQ,OAASo4B,GAAkB,CAAC58B,EAChD,KAAK,oBAAoB,CACxB,OAAQq7B,GAA0B,IAClC,iBAAkB,CAAC,KAAK,kBAAoB,CAAC,KAAK,iBAAmB,CAAC,KAAK,YAC3E,UACS,EAAE,MAAQ,SAAWoB,GAAgB,CAACz8B,EAC3C,KAAK,wBACA,EAAE,MAAQ,KAAO08B,GAAiB,CAAC18B,EACxC,KAAK,WAAW,CAAE,MAAO,CAAC,CAAE,KAAMyF,GAAkB,EAAG,YAAa,EAAI,WACnE,EAAE,MAAQ,KAAK,eACzB,KAAK,eAAiB,WACZ,EAAE,MAAQ,IACpB,KAAK,qBAAuB,WAClB,EAAE,MAAQ,MAAQm3B,GAAkB,CAAC58B,EAAU,CACzD,MAAM68B,EAAmB,KAAK,iBAC1BA,IAAqB,MAAQA,EAAiB,OAASp3B,IACrD,KAAK,cACT,mBACA,CAAE,aAAc,IAAK,EACrBo3B,EAAiB,KAGT,WAAE,MAAQ,KAAOJ,EAE3B,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,iBAAkB,CAAE,aAAc,IAAM,UACtD,EAAE,MAAQ,KAAOA,EACtB,KAAK,cAAc,YAAa,CAAE,aAAc,KAAQj4B,CAAa,UAChE,EAAE,MAAQ,KAAOi4B,GAAgB,CAACz8B,EAE5C,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,WAAY,CAAE,aAAc,KAAQwE,CAAa,UAC/D,EAAE,MAAQ,KAAOm4B,EAAiB,CAI5C,GAFA,EAAE,gBAAgB,EAClB,EAAE,eAAe,EACb,KAAK,OACR,OAGG,KAAK,QAAQ,aAAa,OAASha,EAAM,aAC5Cma,GAAiB,KAAK,aAAa,EAE9B,KAAK,QAAQ,KAAK,CAAE,KAAMna,EAAM,aAAc,EAGpD,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,oCAAoC,EACjE,KAAM,UACN,CACS,WAAE,MAAQ,SAAWia,EAAgB,CAE/C,MAAMC,EAAmB,KAAK,iBAE9B,GAAIA,IAAqB,KAAM,CAC9B,GACCA,EAAiB,OAASp3B,KACzB,KAAK,iBAAmB,KAAK,aAE9B,OAEI,cAAS,eAAiBo3B,EAAiB,IACjD,CACU,WAAE,MAAQ,cAAgBH,EAEpC,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,wBAAyB,CAAE,aAAc,IAAM,UAC7D,EAAE,MAAQ,cAAgBE,EAAgB,CAEpD,MAAMC,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGK,MAAAE,EAAc,KAAK,eAAe,8BACvCF,EAAiB,MAGlB,GAAIE,EAAY,OAAS,QAAaA,EAAY,KAAK,SAAW,EACjE,OAGI,KAAK,cACT,qBACA,CAAE,aAAc,GAAI,EACpBA,EAAY,KAAK,CAAC,EAAE,CAAC,EAAE,KACvB,GACA,GAES,WAAE,MAAQ,aAAeL,EAEnC,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,sBAAuB,CAAE,aAAc,IAAM,UAC3D,EAAE,MAAQ,aAAeE,EAAgB,CAEnD,MAAMC,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGK,MAAAhzB,EAAW,KAAK,qBAEtB,GAAI,CAACA,EAAS,6BAA6B,eAAegzB,EAAiB,IAAI,EAC9E,OAGD,MAAME,EAAclzB,EAAS,6BAA6BgzB,EAAiB,IAAI,EAE/E,GAAIE,EAAY,OAAS,QAAaA,EAAY,KAAK,SAAW,EACjE,OAGI,KAAK,cACT,qBACA,CAAE,aAAc,GAAI,EACpBA,EAAY,KAAK,CAAC,EAAE,CAAC,EAAE,KACvB,GACA,GACD,SACU,CAAC,UAAW,WAAW,EAAE,SAAS,EAAE,GAAG,GAAKH,EAAgB,CAItE,MAAMC,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGK,MAAAhzB,EAAW,KAAK,qBAEtB,GAAI,CAACA,EAAS,6BAA6B,eAAegzB,EAAiB,IAAI,EAC9E,OAGD,MAAME,EAAclzB,EAAS,6BAA6BgzB,EAAiB,IAAI,EAE3E,IAAC,MAAM,QAAQE,EAAY,IAAI,GAAK,CAACA,EAAY,KAAK,OACzD,OAGD,MAAMC,EAAaD,EAAY,KAAK,CAAC,EAAE,CAAC,EAAE,KACpCE,EAAoB,KAAK,eAAe,8BAA8BD,CAAU,EAElF,IAAC,MAAM,QAAQC,EAAkB,IAAI,GAAK,CAACA,EAAkB,KAAK,OACrE,OAIG,IAAAC,EACAC,EAA0B,EAAE,MAAQ,UAAY,UAAY,SAC5DC,EAAgC,KACzB,UAAAC,KAAoBJ,EAAkB,KAChD,UAAWK,KAAmBD,EACzBC,EAAgB,OAAST,EAAiB,OAI9CK,EAAc,KAAK,eAAe,cAAcI,EAAgB,IAAI,EAEhEJ,IACC,EAAE,MAAQ,UAGZA,EAAY,SAAS,CAAC,GAAKL,EAAiB,SAAS,CAAC,GACtDK,EAAY,SAAS,CAAC,EAAIC,IAE1BC,EAAiBF,EAAY,KACHC,EAAAD,EAAY,SAAS,CAAC,GAKhDA,EAAY,SAAS,CAAC,GAAKL,EAAiB,SAAS,CAAC,GACtDK,EAAY,SAAS,CAAC,EAAIC,IAE1BC,EAAiBF,EAAY,KACHC,EAAAD,EAAY,SAAS,CAAC,KAOjDE,IAAmB,MACjB,KAAK,cACT,qBACA,CAAE,aAAc,GAAI,EACpBA,EACA,GACA,GAGH,CACD,EAEA,sBAAsB99B,EAAgB,CAChC,KAAK,oBAIL,iBAAY,aAAaA,EAAO,EAAI,CAC1C,EAEA,eAAeA,EAAgBgL,EAAuB,CACjD,IAAC,KAAK,mBACT,OAGD,KAAK,aAAa,qBAElB,MAAMizB,EAAkBj+B,EAAM,KAC5BG,GAAS,CAAC,KAAK,eAAe,kBAAkBA,EAAK,IAAI,GAG3D,UAAWA,KAAQH,EAClB,GAAIi+B,EAAiB,CACpB,MAAMt4B,EAAY,KAAK,WAAW,uBAAuBxF,CAAI,EACzDwF,EAAU,SAAW,GACnB,gBAAWxF,EAAMwF,EAAWqF,CAAM,CACxC,MAEK,kBAAa7K,EAAM6K,CAAM,EAIhC,KAAK,aAAa,mBACnB,EAEA,YAAYhL,EAAgB,CAI3B,KAAK,aAAa,qBACZA,EAAA,QAASG,GAAS,CACvB,KAAK,WAAWA,EAAK,KAAM,GAAM,EAAK,EACtC,EACD,WAAW,IAAM,CAChB,KAAK,aAAa,qBAChB,GAAG,CACP,EAEA,gBAAiB,CACX,WAAM,QAASA,GAAS,CACvB,wBAAmBA,EAAK,IAAI,EACjC,CACF,EAEA,qBAAsB,CACrB,MAAMo9B,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGD,KAAK,iBAAiB,EAGhB,MAAAhzB,EAAW,KAAK,qBAEhB2zB,EAAa,KAAK,kBAAkB,WAAY3zB,EAAUgzB,EAAiB,IAAI,EACrF,UAAW75B,KAAYw6B,EACtB,KAAK,mBAAmBx6B,CAAQ,EAI5B,wBAAmB65B,EAAiB,IAAI,CAC9C,EACA,uBAAwB,CACvB,MAAMA,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGD,KAAK,iBAAiB,EAGhB,MAAAhzB,EAAW,KAAK,qBAEhB2zB,EAAa,KAAK,kBAAkB,aAAc3zB,EAAUgzB,EAAiB,IAAI,EACvF,UAAW75B,KAAYw6B,EACtB,KAAK,mBAAmBx6B,CAAQ,EAI5B,wBAAmB65B,EAAiB,IAAI,CAC9C,EAEA,oBAAoBY,EAAwBC,EAAgBC,EAAgB,GAAO,CAClF,MAAMC,EAAa,KAAK,eAAe,YAAYH,CAAc,EAE3D5zB,EAAW,KAAK,qBAEhB2zB,EAAa,KAAK,kBAAkB,aAAc3zB,EAAU4zB,CAAc,EAChF,UAAWz6B,KAAYw6B,EAAY,CAClC,MAAM/9B,EAAO,KAAK,eAAe,YAAYuD,CAAQ,EAC/CO,EAAc9D,EAAK,SAEzB,GAAIA,EAAK,SAAS,CAAC,EAAIm+B,EAAW,SAAS,CAAC,EAC3C,SAGD,MAAMt6B,EAAsD,CAC3D,KAAMN,EACN,WAAY,CACX,SAAU,CAACvD,EAAK,SAAS,CAAC,EAAIi+B,EAAQj+B,EAAK,SAAS,CAAC,CAAC,CACvD,GAGI,oBAAe,qBAAqB6D,CAAiB,EAC1D,KAAK,YAAY7D,CAAI,GAGnBk+B,GAAiBp6B,EAAY,CAAC,IAAMD,EAAkB,WAAW,SAAS,CAAC,GAC5EC,EAAY,CAAC,IAAMD,EAAkB,WAAW,SAAS,CAAC,IAE1D,KAAK,aAAa,kBACjB,IAAIE,GAAgBR,EAAUO,EAAaD,EAAkB,WAAW,QAAQ,EAChFq6B,CAAA,CAGH,CACD,EAEA,SAASr+B,EAAgB,CACxB,MAAMu+B,EAAoB,CAAC,KAAK,iBAAmB,CAAC,KAAK,YACpD,eAAUv+B,EAAOu+B,CAAiB,EACnCA,GACH,KAAK,YAAYv+B,CAAK,CAExB,EAEA,UAAUA,EAAgBw+B,EAAQ,GAAO,CACnC,KAAK,eAAex+B,CAAK,EAAE,KAAM6J,GAAS,CAC9C,MAAM40B,EAAmC,CACxC,KAAM,CACL,WAAY,KAAK,UAAU,UAC5B,EACA,GAAG50B,CAAA,EAGC,0CACJ40B,EACA,KAAK,iBAAiB,gBAGvB,MAAM76B,EAAW,KAAK,UAAU66B,EAAgB,KAAM,CAAC,EAEvD,KAAK,gBAAgB76B,CAAQ,EACzBiG,EAAK,MAAM,OAAS,IAClB20B,GACJ,KAAK,YAAY,CAChB,MAAO,UACP,QAAS,GACT,KAAM,UACN,EAEG,gBAAW,MAAM,oBAAqB,CAC1C,WAAY30B,EAAK,MAAM,IAAK1J,GAASA,EAAK,IAAI,EAC9C,YAAa,KAAK,eAAe,WACjC,EACF,CACA,CACF,EACA,MAAM,eAAgB,CACf,MAAAu8B,EAAc,KAAK,eAAe,kBACxC,GAAIA,IAAgB,KAIhB,KACH,KAAK,wBAA0B,GACzB,WAAK,eAAe,qBAAqBA,CAAW,QAClD5yB,EAAO,CAEf,MAAM40B,EAAY,MAAM,KAAK,eAAe,aAAahC,CAAW,EAEpE,GAAIgC,IAAc,OAGjB,KAAK,eAAe,sBAAsB,CACzC,YAAAhC,EACA,KAAM,CAAE,SAAU,GAAM,UAAW,IAAI,IAAO,EAC9C,EACI,oBAAe,cAAc,OAAS,EACtC,aAAQ,mBAAmB,iBAAiB,EAEjD,KAAK,SAAS,KAAK,eAAe,aAAc,MAAM,EACtD,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,uDAAuD,EACpF,QAAS,KAAK,QAAQ,SACrB,yDACD,EACA,KAAM,UACN,UACSgC,GAAA,MAAAA,EAAW,SAAU,CAG/B,MAAMC,EAAe,CACpB,KAAMD,EAAU,KAChB,SAAUA,EAAU,SACpB,KAAMA,EAAU,KAChB,UAAWA,EAAU,UACrB,UAAWA,EAAU,WAEhBE,EAAW,CAChB,KAAMD,EACN,YAAAjC,EACA,QAASgC,EAAU,SAEf,oBAAe,sBAAsBE,CAAQ,EAClD,KAAK,SAASF,EAAU,aAAa,KAAM,MAAM,EAC5C,oBAAe,cAAc,OAAS,EACtC,oBAAe,yBAAyBC,CAAkC,EAC1E,aAAQ,mBAAmB,iBAAiB,EACjD,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,+CAA+C,EAC5E,QAAS,KAAK,QAAQ,SAAS,iDAAiD,EAChF,KAAM,UACN,OAED,KAAK,UAAU70B,EAAO,KAAK,QAAQ,SAAS,wCAAwC,CAAC,CAEvF,CACA,KAAK,wBAA0B,GAE1B,KAAK,wBAAwB,KAAMmyB,GAAiB,CACxD,MAAM4C,EAAa,CAClB,YAAa,KAAK,eAAe,WACjC,kBAAmB,KAAK,UACvB3C,GAAoCD,EAA+B,KAAK,cAAc,EACpF,SACH,GAGI,gBAAW,MAAM,uCAAwC4C,CAAU,EACxE,EACF,EAEA,MAAM,uBAAwB,CACzB,IACH,MAAM,KAAK,eAAe,kBAAkB,KAAK,eAAe,UAAU,QAClE/0B,EAAO,CACV,eACJA,EACA,KAAK,QAAQ,SAAS,gDAAgD,GAEvE,MACD,CACD,EAIA,MAAM,sBAAsBg1B,EAAsC,CACjE,GAAI,KAAK,YACR,OAIG,GADexE,GAAe,KAAK,MAAM,IAC1BK,GAAiB,SAAU,CACzC,IAAAsB,EACA,IAAC,KAAK,mBACT,OAGG,GAAA6C,EAAc,MAAM,0BAA0B,GA6BjD,GA1BI,CAAC,KAAK,oBAIY,MAAM,KAAK,QAChC,KAAK,QAAQ,SAAS,wDAAyD,CAC9E,YAAa,CAAE,cAAAA,CAAc,EAC7B,EACD,KAAK,QAAQ,SAAS,wDAAwD,EAC9E,CACC,KAAM,UACN,kBAAmB,KAAK,QAAQ,SAC/B,iEACD,EACA,iBAAkB,KAAK,QAAQ,SAC9B,gEACD,EACA,yBAA0B,EAC3B,KAGqB/uB,KAIPksB,EAAA,MAAM,KAAK,uBAAuB6C,CAAa,EAC1D7C,IAAiB,QACpB,WAIG,KAIC,GAFWA,EAAA,KAAK,MAAM6C,CAAa,EAEnC,CAAC,KAAK,mBACT,YAEU,CAEX,MACD,CAGD,OAAO,KAAK,mBAAmB7C,EAAe,QAAS,EAAK,CAC7D,CACD,EAIA,MAAM,uBAAuB7c,EAAuD,CAC/E,IAAA6c,EAEJ,KAAK,aAAa,EACd,IACHA,EAAe,MAAM,KAAK,eAAe,mBAAmB7c,CAAG,QACvDtV,EAAO,CACf,KAAK,YAAY,EACZ,eACJA,EACA,KAAK,QAAQ,SAAS,iDAAiD,GAExE,MACD,CACA,YAAK,YAAY,EAEVmyB,CACR,EAGA,MAAM,mBACLA,EACAjxB,EACA+zB,EAAa,GACG,CAEZ,MAAC9C,EAAa,eAAe,OAAO,GAAK,CAACA,EAAa,eAAe,aAAa,GAInF,IACH,MAAM+C,EAAwC,GAC1C/C,EAAa,OACHA,EAAA,MAAM,QAAS97B,GAAgB,CAY3C,GAVIA,EAAK,WAAa8+B,GAA6B,SAAS9+B,EAAK,IAAI,GAChD,OAAO,OAAO,KAAK,mBAAmB,EAAE,KAAK,EAAE,KACjEoF,GAAMA,EAAE,YAAcpF,EAAK,aAG5BA,EAAK,UAAYe,MAKff,EAAK,GAAI,CACZ,MAAM++B,EAAQh+B,KACJ89B,EAAAE,CAAK,EAAI/+B,EAAK,GACxBA,EAAK,GAAK++B,CAAA,MAEV/+B,EAAK,GAAKe,IACX,CACA,EAGF,KAAK,yBAAyB+6B,CAAY,EAEpC,MAAAkD,EAAiB,KAAK,UAAU,WAEhCC,EAAY,KAAK,UACtBlD,GAAoCD,EAA+B,KAAK,eAAgB,CACvF,UAAA+C,EACA,iBACC/C,EAAa,MAAQA,EAAa,KAAK,aAAekD,EACnDlD,EAAa,KAAK,WAClB,EACJ,GAAE,WAEAjxB,IAAW,QACT,gBAAW,MAAM,oBAAqB,CAC1C,YAAa,KAAK,eAAe,WACjC,kBAAmBo0B,CAAA,CACnB,EACSp0B,IAAW,YAChB,gBAAW,MAAM,wBAAyB,CAC9C,YAAa,KAAK,eAAe,WACjC,kBAAmBo0B,CAAA,CACnB,EAEI,gBAAW,MAAM,yBAA0B,CAC/C,OAAAp0B,EACA,YAAa,KAAK,eAAe,WACjC,kBAAmBo0B,CAAA,CACnB,EAKF,KAAK,iBAAiB,EAKjB,yBACJnD,EACAoD,GAAiC,KAAK,MAAO,KAAK,iBAAiB,GAGpE,MAAMx1B,EAAO,MAAM,KAAK,mBAAmBoyB,CAAY,EAEvD,WAAW,IAAM,CACXpyB,EAAA,MAAO,QAAS1J,GAAkB,CACjC,wBAAmBA,EAAK,IAAI,EACjC,EACD,EAEK,MAAAm/B,EAAc,KAAK,cAAc,eACvC,GAAIP,GAAcO,GAAe,MAAM,QAAQrD,EAAa,IAAI,EAAG,CAClE,MAAMsD,EAAU,MAAM,KAAK,UAAU,SAAS,EACxCC,EAAW,IAAI,IAAID,EAAQ,IAAKrC,GAAQA,EAAI,IAAI,CAAC,EAEjDuC,EAAexD,EAAa,KAC5ByD,EAAWD,EAAa,OAAQvC,GAAQ,CAACsC,EAAS,IAAItC,EAAI,IAAI,CAAC,EAE/DyC,EAA4C,GAClD,UAAWzC,KAAOwC,EAAU,CACrB,MAAAE,EAAkB,KAAK,UAAU,OAAO1C,EAAI,IAAI,EAAE,KAAMA,IAC7DqC,EAAQ,KAAKrC,CAAG,EACTA,EACP,EAEDyC,EAAoB,KAAKC,CAAe,CACzC,CAEM,cAAQ,IAAID,CAAmB,EAErC,MAAM1C,EAASwC,EAAa,OAAO,CAACtQ,EAAgB0Q,IAAmB,CAChE,MAAA3C,EAAMqC,EAAQ,KAAMrC,GAAQA,EAAI,OAAS2C,EAAS,IAAI,EAC5D,OAAI3C,GACE/N,EAAA,KAAK+N,EAAI,EAAE,EAGV/N,CACR,EAAG,CAAE,GAEA,oBAAe,kBAAkB8N,CAAM,CAC7C,QACQnzB,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,6CAA6C,CAAC,CAC3F,CACD,EAEA,yBAAyBS,EAA4B,CACpD,GAAKA,GAAA,MAAAA,EAAU,OAEJ,UAAApK,KAAQoK,EAAS,MAC3B,GAAKpK,EAAK,YAEC,UAAC0R,EAAMX,CAAU,IAAK,OAAO,QAAQ/Q,EAAK,WAAW,EAC3D+Q,EAAW,KAAO,OAEjB,KAAK,iBAAiB,kBAAkBA,EAAW,EAAE,GAClD,OAAA/Q,EAAK,YAAY0R,CAAI,GAIhC,EAEA,WAAW7L,EAAkB,CAC5BA,EAAM,eAAe,CACtB,EAEA,MAAM,OAAOA,EAAkB,CAC1B,IAACA,EAAM,aACV,OAGD,MAAM85B,EAAW70B,GAChBjF,EAAM,aAAa,QAAQ+5B,EAAmB,GAE/C,GAAID,EAAU,CACP,MAAA53B,EAAgB,KAAK,+BAA+BlC,CAAK,EACzDg6B,EAAqB,CAC1B93B,EAAc,CAAC,EAAI+3B,GAA0B,EAAInE,GACjD5zB,EAAc,CAAC,EAAI+3B,GAA0B,GAG9C,MAAM,KAAK,WAAWH,EAAU,GAAME,CAAkB,EACxD,KAAK,iBAAmB,EACzB,CACD,EAEA,qBAAqBt8B,EAAkB,CACtC,MAAMvD,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACnDvD,GACH,KAAK,eAAeA,CAAI,CAE1B,EAEA,mBAAmBuD,EAAkBw8B,EAAY,GAAOC,EAA6B,CAChFA,IAAsB,IACzB,KAAK,iBAAiB,EAGvB,MAAMhgC,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACnDvD,IACH,KAAK,aAAaA,CAAI,EACjB,aAAQ,iBAAmBA,EAAK,KACrC,KAAK,QAAQ,4BAA8B,KAC3C,KAAK,QAAQ,6BAA+B,KAC5C,KAAK,YAAY,uBAAyB,KAC1C,KAAK,YAAY,sBAAwB,KAErC+/B,IACE,cAAS,eAAiB//B,EAAK,MAGvC,EACA,qBAAqBmmB,EAAoC,CACxD,MAAM8Z,EAAW9Z,EAAa,SAC9B,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,iDAAiD,EAC9E,QAAS,KAAK,QAAQ,SAAS,oDAAqD,CACnF,eAAgB8Z,EAChB,YAAa,CAAE,wBAAyB9Z,EAAa,WAAY,EACjE,EACD,KAAM,QACN,SAAU,EACV,CACF,EAEA,MAAM,gCACLA,EACA+Z,EACC,aACD,IAAIC,EAAcha,EAAa,eAE3Bga,IAAgB,SACnBA,EAAc,MAAM,QAAQha,EAAa,OAAO,EAC7CA,EAAa,QAAQ,MAAM,EAAE,EAAE,CAAC,EAChCA,EAAa,SAGjB,MAAMia,EAAuB,CAC5B,GAAIr/B,GAAK,EACT,KAAMm/B,EAAU,MAAS/Z,EAAa,SAAS,KAC/C,KAAMA,EAAa,KACnB,YAAaga,EACb,SAAU,CAAC,EAAG,CAAC,EACf,WAAY,CAAC,GAGRE,GAAoB3+B,EAAAykB,EAAa,cAAb,YAAAzkB,EACvB,IAAKsc,GAAS,KAAK,iBAAiB,0BAA0BA,EAAK,IAAI,GACxE,OAEE,GAAAqiB,GAAqBA,EAAkB,SAAW,EAAG,CAClD,MAAAC,EAAoBD,EAAkB,CAAC,EAEvCE,EAAsB,KAAK,iBAAiB,kBAAkBD,EAAkB,EAAE,EAClFE,EAAW,CAAE,GAAID,EAAoB,GAAI,KAAMA,EAAoB,MACnE/b,EAAc,CACnB,CAAC8b,EAAkB,IAAI,EAAGE,CAAA,EAG3B,MAAM,KAAK,oBACV,CAACJ,CAAW,EAAE,IAAKpgC,IAAU,CAAE,KAAMA,EAAK,KAAM,QAASA,EAAK,WAAc,KAE7E,MAAMkF,EAAW,KAAK,eAAe,YAAYk7B,EAAY,KAAMA,EAAY,WAAW,EACpFxtB,EAAiBC,IACtB3N,GAAA,YAAAA,EAAU,aAAc,CAAC,EACzB,CAAC,EACD,GACA,GACAk7B,CAAA,EAGD,GAAIja,EAAa,YAAa,CACvB,MAAAsa,EAAiBta,EAAa,YAAY,KAC9CnI,GAASA,EAAK,OAASsiB,EAAkB,MAEvC,IAAAp3B,EAAAu3B,GAAA,YAAAA,EAAgB,iBAAhB,MAAAv3B,EAAgC,KAC5B,OAAAk3B,EAGF,MAAAM,GAAqB5zB,EAAA2zB,GAAA,YAAAA,EAAgB,iBAAhB,YAAA3zB,EAAgC,KAC3D,GAAI,CAAC4zB,EACJ,OAAAN,EAAY,YAAc5b,EACnB4b,EAGR,GAAI,OAAO,KAAKM,CAAkB,EAAE,SAAW,GAAKA,EAAmB,eAAgB,CAEtFN,EAAY,YAAc5b,EAE1B,IAAIjT,EAAwC,GAC5C,UAAWovB,KAAiB,OAAO,KAAKD,CAAkB,EAAG,CAC5D,GAAI9tB,GAAkB,CAACA,EAAe+tB,CAAa,EAAG,CACrDpvB,EAAa,GACb6uB,EAAY,YAAc,OAC1B,KACD,CACA,MAAMQ,GAAc/zB,EAAA6zB,EAAmBC,CAAa,IAAhC,YAAA9zB,EAAoC,GACpD+zB,GAAe,OAAOA,GAAgB,WACzCrvB,EAAWovB,CAAa,EAAIC,GAE7BR,EAAY,WAAa,CACxB,GAAGA,EAAY,WACf,GAAG7uB,CAAA,CAEL,CACD,CACD,CACD,CACO,OAAA6uB,CACR,EAEA,MAAM,WACLtb,EACA5X,EAA0B,GAC1B2zB,EAAa,GACbC,EAAe,GACfC,EAAY,GACX,SACD,MAAM5a,EACL,KAAK,eAAe,YAAYrB,CAAY,EAE7C,GAAIqB,IAAiB,KAAM,CAC1B,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,0CAA0C,EACvE,QAAS,KAAK,QAAQ,SAAS,6CAA8C,CAC5E,YAAa,CAAE,aAAArB,CAAa,EAC5B,EACD,KAAM,QACN,EACD,MACD,CAGC,GAAAqB,EAAa,WAAa,QAC1B,KAAK,iBAAiBrB,CAAY,GAAKqB,EAAa,SACnD,CACD,KAAK,qBAAqBA,CAAY,EACtC,MACD,CAEA,MAAMia,EAAc,MAAM,KAAK,gCAAgCja,EAAc,CAC5E,KAAMjZ,EAAQ,KACd,EAGKkwB,EAAmB,KAAK,iBAE9B,GAAIlwB,EAAQ,SACXkzB,EAAY,SAAWlB,GACtB,KAAK,YAAY,4BAA4B,EAC7ChyB,EAAQ,kBAECkwB,EAAkB,CACtB,MAAAz9B,EAAyB,KAAK,YAAY,uBAChD,GAAIA,EAAwB,CAE3B,KAAM,CAACqhC,CAAK,EAAIC,GAAkCthC,CAAsB,EACpEqhC,GAASE,IACP,yBACJ9D,EAAiB,KACjB+D,GACAL,CAAA,CAGH,CAGI,QAAK,YAAY,sBACpBV,EAAY,SAAWlB,GAAiC,KAAK,MAAO,CACnE,KAAK,YAAY,sBAAsB,CAAC,EAAIvD,GAC5C,KAAK,YAAY,sBAAsB,CAAC,EAAImE,GAA0B,EACtE,EACD,KAAK,YAAY,sBAAwB,SACnC,CACN,IAAIsB,EAAU,EACR,MAAAh3B,EAAW,KAAK,qBAEtB,GAAIzK,EAAwB,CACrB,MAAA0hC,EAAiB,KAAK,eAAe,YAC1CjE,EAAiB,KACjBA,EAAiB,aAGlB,GAAIiE,EAAgB,CACnB,MAAMC,EAAU,CACf,CAAC,KAAM,GAAG,EACV,CAAC,KAAM,EAAG,GAAG,EACb,CAAC,KAAM,KAAM,IAAK,GAAG,GAGhBC,EAAoBjkB,GACzBlT,EACAgzB,EACAiE,CAAA,EAIKG,EAFwBj4B,GAA+Bg4B,CAAiB,EAEpB,OACxD/3B,GAAWA,IAAWC,EAAmB,MAGvC,GAAA+3B,EAA4B,OAAS,EAAG,CAC3C,MAAM/gC,EAAS6gC,EAAQE,EAA4B,OAAS,CAAC,EACvDC,EAAoB9hC,EAAuB,OAC9CA,EAAuB,OAAO,kBAC9B,EACHyhC,EAAU3gC,EAAOghC,CAAiB,CACnC,CACD,CACD,CAEA,IAAI1iB,EAA6D,GAC7D,IAMHA,EAAUzB,GAA2BlT,EAAUg2B,EAAaja,CAAY,OAC7D,CAAC,CACP,MAAA7c,EAAcC,GAA+BwV,CAAO,EACpD2iB,EAAuB,KAAK,eAAe,YAChDtE,EAAiB,KACjBA,EAAiB,aAKjB,GAAA9zB,EAAY,OAAS,GACrBA,EAAY,MAAO6T,GAAeA,IAAe1T,EAAmB,IAAI,EACvE,CACD,MAAMk4B,EAA2Bv3B,EAAS,QAAQgzB,EAAiB,IAAI,EACjEwE,EAAqBhxB,GAC1BxG,EACAu3B,EACAD,CAAA,EAIKG,GAFyBt4B,GAA+Bq4B,CAAkB,GAEvB,IACvD,OAAQzf,GAAUA,IAAU1Y,EAAmB,IAAI,EACnD,UAAWq4B,GAAc/iB,EAAQ,CAAC,IAAM+iB,CAAS,EAEnD1B,EAAY,SAAWlB,GACtB,KAAK,MACL,CACC9B,EAAiB,SAAS,CAAC,EACzB0C,IACC,KAAK,MAAIp+B,EAAAggC,GAAA,YAAAA,EAAsB,SAAtB,YAAAhgC,EAA8B,SAAU,CAAC,EAAG,GACtDmgC,EACFzE,EAAiB,SAAS,CAAC,EAAI+D,EAChC,EACA,CAAC,IAAK,CAAC,EACR,KACM,CAEN,MAAMxwB,EAASC,GACdxG,EACAgzB,EACAsE,CAAA,EAEKK,EAAcx4B,GAA+BoH,CAAM,EAEzD,IAAIqxB,EAAab,GACXY,EAAY,KAAM5f,GAAUA,IAAU1Y,EAAmB,IAAI,IAEpDu4B,GAAA,KAIf5B,EAAY,SAAWlB,GACtB,KAAK,MACL,CAAC9B,EAAiB,SAAS,CAAC,EAAI4E,EAAY5E,EAAiB,SAAS,CAAC,EAAIgE,CAAO,EAClF,CAAC,IAAK,CAAC,EAET,CACD,MACM,CAGA,MAAA1gC,EACL,KAAK,eAAe,cAAcokB,CAAY,GAAK,CAAC,KAAK,gBACtD,KAAK,YAAY,wBAEhB,KAAK,kBAEVsb,EAAY,SAAWlB,GAAiC,KAAK,MAAOx+B,CAAQ,CAC7E,CAEA,MAAMuhC,EAAgB,KAAK,OAAO,iBAAiB7B,EAAY,KAAMA,EAAY,IAAI,EAarF,GAXYA,EAAA,KAAO,KAAK,eAAe6B,CAAa,GAEhD/4B,EAAAid,EAAa,WAAb,MAAAjd,EAAuB,SAC1Bk3B,EAAY,UAAYr/B,MAGzB,MAAM,KAAK,SAAS,CAACq/B,CAAW,EAAG,OAAWU,CAAY,EAC1D,KAAK,eAAe,gBAAgBV,EAAY,KAAM,EAAI,EAE1D,KAAK,QAAQ,aAAe,GAExBtb,IAAiB9e,GACf,gBAAW,gBAAgB,qBAAsB,CACrD,YAAa,KAAK,eAAe,WACjC,MACK,CACD,KAAK,cAAc,IAAI,yBAA0B,CAAE,aAAA8e,EAAc,EAC3Dod,GAAA,EAAE,kBAAkBpd,CAAY,EAC3C,MAAMqd,EAA6C,CAClD,UAAWrd,EACX,aAAcsb,EAAY,YAC1B,YAAaW,EACb,YAAa,KAAK,eAAe,WACjC,cAAe7zB,EAAQ,aAGpBkwB,IACH+E,EAAgB,gBAAkB/E,EAAiB,MAG/C,gBAAW,gBAAgB,yBAA0B+E,CAAe,CAC1E,CAIA,OAAIrB,IACH,KAAK,iBAAiB,EACtB,WAAW,IAAM,CACX,wBACJV,EAAY,KACZS,GAAc/b,IAAiB9e,EAAA,CAChC,CACA,GAGKo6B,CACR,EACA,cACCpC,EACAoE,EACAC,EACAC,EACAtkB,EAC0B,CAC1B,MAAMukB,EACL,KAAK,eAAe,8BAA8BvE,CAAc,EAAEhgB,CAAI,EACvE,GAAIukB,EAAiB,CACd,MAAAjF,EAAoCiF,EAAgBH,CAAqB,EAE/E,GAAI9E,EACH,OAAOA,EAAY,KACjBkF,GACAA,EAAW,OAASH,GAAkBG,EAAW,QAAUF,CAAA,CAG/D,CAGD,EACA,gBACCtE,EACAoE,EACAC,EACAI,EACAzkB,EACC,CACD,KAAK,QAAQ,aAAe,GAE5B,MAAMmgB,EAAa,KAAK,eAAe,cAAcH,CAAc,EAC7D0E,EAAa,KAAK,eAAe,cAAcL,CAAc,EAUnE,GAPClE,GACAuE,GACA,CAAC,KAAK,2BAA2BvE,EAAYuE,EAAY1kB,CAAI,GAM7D,KAAK,cACJggB,EACAoE,EACAC,EACAI,EACAzkB,CAAA,EAGD,OAGD,MAAM2kB,EAAiB,CACtB,CACC,KAAM3E,EACN,KAAAhgB,EACA,MAAOokB,CACR,EACA,CACC,KAAMC,EACN,KAAArkB,EACA,MAAOykB,CACR,GAGD,KAAK,gBAAgBE,CAAc,CACpC,EACA,MAAM,QACL7d,EACA5X,EAA0B,GAC1B2zB,EAAa,GACbC,EAAe,GACfC,EAAY,GACX,OACG,IAAC,KAAK,mBACT,OAGD,MAAM3D,EAAmB,KAAK,iBACxBwF,EAA8B,KAAK,QAAQ,4BAC3CC,EAA+B,KAAK,QAAQ,6BAC5CljC,EAAyB,KAAK,YAAY,uBAEhD,KAAK,aAAa,qBAEZ,MAAAygC,EAAc,MAAM,KAAK,WAC9Btb,EACA5X,EACA2zB,EACAC,EACAC,CAAA,EAED,GAAI,CAACX,EACJ,OAGD,MAAM1hB,EAAckkB,GAA+B,EAC7CE,EAAiBD,GAAgC,GAGnD,GAAAA,GAAgC,CAAC9B,EAAW,CAC/C,MAAMgC,EAAuB,KAAK,SAAS,YAAYF,CAA4B,EACnF,GACCE,GACA,KAAK,2BACJ3F,EACAgD,EACA2C,EAAqB,OAErB,CACD,MAAMpkB,EAAiBokB,EAAqB,MACtCC,EAAiB,KAAK,SAAS,kBAAkB5C,EAAY,EAAE,EAE/D6C,EADqB,KAAK,SAAS,aAAaD,CAAc,EACxB,KAAME,GAEhDA,EAAK,QAAUvkB,GACfokB,EAAqB,WAAW,aAAeG,EAAK,WAAW,UAEhE,GAEDxhC,EAAA,KAAK,WAAL,MAAAA,EAAe,QAAQ,CACtB,MAAO,CAACohC,GAAgBG,GAAA,YAAAA,EAAkB,OAAQ,EAAE,EACpD,WAAY,CAAC,KAAK,iBAAmB,CAAC,KAAK,cAE5C,KAAK,aAAa,oBAClB,MACD,CACD,CAEI,GAAA7F,GAAoB,CAAC2D,EAAW,CAGnC,GAFA,MAAM,KAAK,YAEPphC,GAAA,MAAAA,EAAwB,OAAQ,CAC9B,+BAA0BA,EAAwBmhC,CAAY,EAE7D,MAAAuB,EAAiB1iC,EAAuB,OAAO,eAC/CwjC,EAAoBxjC,EAAuB,OAAO,kBACnD,qBACJygC,EAAY,KACZ,EACAiC,EACAc,EACA15B,EAAmB,KAErB,CAGK,qBACJ2zB,EAAiB,KACjB1e,EACA0hB,EAAY,KACZ,EACA32B,EAAmB,KAErB,CACA,KAAK,aAAa,mBACnB,EACA,qBAAqBlG,EAAkB6/B,EAAiC,CACnE,IAAAvU,EACE,MAAAzkB,EAAW,KAAK,qBAChBsG,EAAetG,EAAS,QAAQ7G,CAAQ,EAC9C,GAAI,CAACmN,EAAqB,OAAE,MAAO,IAE7B,MAAAxL,EAAW,KAAK,eAAe,YACpCwL,GAAA,YAAAA,EAAc,KACdA,EAAa,aAEd,GAAIxL,EAAU,CAGb,MAAMm+B,EAFSzyB,GAA0BxG,EAAUsG,EAAcxL,CAAQ,EAE9C,OAAQid,GAC9B,SAAOA,GAAU,UAAYA,EAAM,OAASihB,GAAc,CAACjhB,EAAM,OAMrE,EAEGkhB,EAAY,SACNxU,EAAAwU,EAAY,CAAC,EAAE,OAE1B,CAEO,OAAAxU,CACR,EACA,wBAAwBkL,EAQrB,WACI,MAAA/b,EAAO+b,EAAK,YAActwB,EAAmB,KAI7C00B,EAAa,KAAK,eAAe,YAAYpE,EAAK,QAAQ,EAChE,GAAI,CAACoE,EACJ,OAGI,aAAQ,iBAAmBA,EAAW,KACtC,aAAQ,6BACZpE,EAAK,gBAAgB7wB,GAAAxH,EAAAq4B,EAAK,aAAL,YAAAr4B,EAAiB,OAAO,MAAxB,YAAAwH,EAA6B,SAAS,MACvD,aAAQ,4BAA8B6wB,EAAK,MAChD,KAAK,YAAY,sBAAwB,KAErCA,EAAK,aACH,iBAAY,uBAAyBA,EAAK,YAGhD,KAAK,oBAAoB,CACxB,OAAQA,EAAK,YACb,iBAAkB,GAClB,gBAAiBA,EAAK,gBACtB,EAID,MAAMlC,IAAW/qB,EAAAitB,EAAK,aAAL,YAAAjtB,EAAiB,UAAU,GAAG,WAAW,cAAe,SAExEkR,IAASvU,EAAmB,MAAQ,OAAO,OAAOA,CAAkB,EAAE,SAASuU,CAAI,GAGnF+Y,GACE,+BACA/Y,EACA6Z,EACA,KAAK,qBAAqBsG,EAAW,KAAMngB,CAAI,GAE/C,MAAOvb,GAAM,EAAE,CAEnB,EACA,MAAM,uBAAuB+/B,EAAwB,SAChD,IACH,GAAI,KAAK,cAAe,CACvB,KAAK,cAAgB,GACrB,MACD,CACA,GAAI,KAAK,uBAAwB,CAChC,MAAMrE,EAAa,KAAK,eAAe,YAAYqE,EAAW,WAAW,MAAM,EACzE7jB,EAAiB6jB,EAAW,WAAW,MAAQ/4B,EAAmB,KAClE65B,GAAyB5hC,EAAA8gC,GAAA,YAAAA,EAAY,YAAZ,YAAA9gC,EAC5B,uBAEH,GAAIy8B,EAAY,CACT,MAAAoF,EAAWf,EAAW,WAAW,aAAe,SAChDxE,EAAiBuF,EAAW,KAAK,uBAAyBpF,EAAW,KACrEkE,EAAiBkB,EAAWpF,EAAW,KAAO,KAAK,uBACnDzf,EAAc8jB,EAAW,WAAW,MAC1CgB,GAAuChB,CAAU,EACjD,MAAM,KAAK,YAEN,qBACJxE,EACAtf,EACA2jB,IACAn5B,EAAAo6B,GAAA,YAAAA,EAAwB,aAAxB,YAAAp6B,EAAoC,QAAS,EAC7CyV,CAAA,EAED,KAAK,uBAAyB,KAC9B,KAAK,cAAgB,EACtB,CACA,MACD,CAEA,KAAK,wBAAwB,CAC5B,SAAU6jB,EAAW,WAAW,OAChC,MAAOA,EAAW,WAAW,MAC7B,YAAa5G,GAA0B,qBACvC,WAAA4G,EACA,WAAYA,EAAW,WAAW,KAClC,QACO//B,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,2BACC07B,EACAuE,EACAe,EACU,OACJ,MAAAC,EAAiB,KAAK,eAAe,YAC1ChB,EAAW,KACXA,EAAW,aAGR,IAAAhhC,EAAAgiC,GAAA,YAAAA,EAAgB,SAAhB,MAAAhiC,EAAwB,OAAQ,CAC7B,MAAA0I,EAAW,KAAK,qBAChBsG,EAAetG,EAAS,QAAQs4B,EAAW,IAAI,EACrD,IAAI/xB,EAA2D,GAC3D+yB,IACH/yB,EAASC,GAA0BxG,EAAUsG,EAAegzB,CAAc,GAGhE,UAAAvhB,KAASxR,GAAU,GACzB,YAAOwR,GAAU,UAAYA,EAAM,OAASshB,GAAkB,CAACthB,EAAM,SAKrEA,EAAM,OAAO,MAAM,QAClB,CAACA,EAAM,OAAO,MAAM,SAASgc,EAAW,IAAI,EAC/C,YAAK,cAAgB,GACrB,KAAK,UAAU,CACd,MAAO,KAAK,QAAQ,SAAS,6CAA6C,EAC1E,QAAS,KAAK,QAAQ,SAAS,gDAAiD,CAC/E,YAAa,CAAE,eAAgBA,EAAW,KAAM,eAAgBuE,EAAW,IAAK,EAChF,EACD,KAAM,QACN,SAAU,IACV,EACM,EAIX,CACO,QACR,EACA,sBAAsB3I,EAAwB,CACzC,IACC,IAAA4J,EACAC,EASJ,GARI7J,EAAK,WAAW,UAAU,CAAC,EAAE,WAAW,aAAe,UAC1D4J,EAAa5J,EAAK,aAAa,WAC/B6J,EAAa7J,EAAK,WAAW,UAAU,CAAC,EAAE,aAE1C4J,EAAa5J,EAAK,WAAW,UAAU,CAAC,EAAE,WAC1C6J,EAAa7J,EAAK,aAAa,YAI/B4J,EAAW,OAASC,EAAW,MAC/BD,EAAW,aAAeC,EAAW,WAErC,YAAK,cAAgB,GACd,GAGR,MAAMzF,EAAa,KAAK,eAAe,YAAYwF,EAAW,MAAM,EAC9DjB,EAAa,KAAK,eAAe,YAAYkB,EAAW,MAAM,EAE9D5F,GAAiBG,GAAA,YAAAA,EAAY,OAAQ,GACrCkE,GAAiBK,GAAA,YAAAA,EAAY,OAAQ,GAE3C,OAAIvE,GAAcuE,GACb,CAAC,KAAK,2BAA2BvE,EAAYuE,EAAYkB,EAAW,IAAI,EACpE,GAMR,KAAK,cACJ5F,EACA2F,EAAW,MACXtB,EACAuB,EAAW,MACXD,EAAW,OAGZ,KAAK,cAAgB,GACrB,KAAK,uBAAyB,KACvB,IAGD,SACClhC,EAAG,CACX,eAAQ,MAAMA,CAAC,EACR,EACR,CACD,EACA,kBAAkBs3B,EAAmC,SAChD,IACH,GAAIA,EAAK,eAAe,WAAW,aAAe,SAAU,CAG3D,MAAM8J,EAAe9J,EAAK,eAC1BA,EAAK,eAAiBA,EAAK,eAC3BA,EAAK,eAAiB8J,CACvB,CAEM,MAAAF,EAAa5J,EAAK,eAAe,WACjC6J,EAAa7J,EAAK,eAAe,WAEjCiE,GAAiBt8B,EAAA,KAAK,eAAe,YAAYiiC,EAAW,MAAM,IAAjD,YAAAjiC,EAAoD,KACrE2gC,GAAiBn5B,EAAA,KAAK,eAAe,YAAY06B,EAAW,MAAM,IAAjD,YAAA16B,EAAoD,KAEvE80B,GAAkBqE,IACrBtI,EAAK,WAAW,OAAS,CACxB,eAAAiE,EACA,kBAAmB2F,EAAW,MAC9B,eAAAtB,EACA,kBAAmBuB,EAAW,QAIlBE,GAAgB/J,EAAK,UAAU,EAC/BgK,GAA2BhK,EAAK,cAAc,EAE5D,MAAM4I,EAA6C,CAClD,CACC,KAAM3E,EACN,KAAM2F,EAAW,KACjB,MAAOA,EAAW,KACnB,EACA,CACC,KAAMtB,EACN,KAAMuB,EAAW,KACjB,MAAOA,EAAW,KACnB,GAMD,GAHA,KAAK,cAAgB,GACrB,KAAK,eAAe,cAAc,CAAE,WAAYjB,CAAgB,GAE5D,CAAC,KAAK,iBAAmB,CAAC,KAAK,YAAa,CACjCqB,GAAoBjK,EAAK,cAAc,EACvCkK,GACblK,EAAK,WACL,IAAM,CACL,KAAK,iBAAmB,KACnB,+BAA0BA,EAAK,UAAU,CAC/C,EACA,IAAM,CACL,KAAK,wBAAwB,CAC5B,SAAUA,EAAK,eAAe,WAAW,OACzC,MAAO4J,EAAW,MAClB,WAAY5J,EAAK,WACjB,YAAa6B,GAA0B,uBACvC,CACF,GAGD,MAAMsI,EAAgBC,GACrBpK,EAAK,WACLqK,EAAA,EAEGT,EAAW,OAASl6B,EAAmB,OAE1CswB,EAAK,WAAW,cACfsK,GAA2BtK,EAAK,WAAYA,EAAK,eAAe,WAAW,QAAQ,GAEpFmK,GAAA,MAAAA,EAAe,WAAW,IAE5B,CACA,KAAK,cAAgB,GAChB,KAAK,YACT,KAAK,QAAQ,aAAe,GACvB,KAAK,qCACT,KAAK,aAAa,kBAAkB,IAAII,GAAqB3B,CAAc,CAAC,EAIxE,KAAK,mBACT,KAAK,YAAY,yBACjB,KAAK,qBAAqB,EAC1B,WAAW,IAAM,SACF4B,GACbxK,EAAK,OACLA,EAAK,QACL7wB,GAAAxH,EAAAq4B,EAAK,aAAL,YAAAr4B,EAAiB,YAAjB,MAAAwH,EAA4B,eAAe,UACvC6wB,EAAK,WAAW,UAAU,OAC3B,SAEF,CAAC,UAGEt3B,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,uBAAwB,CACvB,KAAK,SAAS,YAAY,QAAS+/B,GAAe,OACnC+B,GACb/B,EAAW,OACXA,EAAW,QACX9gC,EAAA8gC,GAAA,YAAAA,EAAY,YAAZ,MAAA9gC,EAAuB,eAAe,UAClC8gC,GAAA,YAAAA,EAAY,UAAU,OACvB,OACJ,CACA,CACF,EACA,YAAa,CACN,MAAAgC,EAAa,KAAK,MAAM,OACzB,KAAK,cAAc,4BAA6B,CACpD,aAAcA,EAAa,GAAK,IAAM,EACtC,CACF,EACA,2BAA4B,QAC3B9iC,EAAA,KAAK,WAAL,MAAAA,EAAe,YAAY,QAAS8gC,GAAe,CAClDiC,GAAmCjC,CAAU,EAC7CkC,GAAsClC,CAAU,EAEhD,OAAO,OAAOA,EAAW,QAAQ,EAAE,QAASmC,GAAY,OAClDA,EAAQ,UACRjjC,EAAA,sBAAAA,EAAU,QAAQijC,EAAQ,QAAM,CACrC,GAEH,EACA,mBAAmBnC,EAA+B,SACjD,MAAI,EAACA,GAAA,MAAAA,EAAY,KAAM,GAAC9gC,EAAA,KAAK,mBAAL,MAAAA,EAAuB,IAAW,KAEnDwH,EAAA,KAAK,mBAAL,YAAAA,EAAuB,MAAOs5B,EAAW,EACjD,EACA,sBAAsBA,EAAwB,CACzC,IAMH,GALI,KAAK,YAAc,SACtB,aAAa,KAAK,SAAS,EAC3B,KAAK,UAAY,QAKjB,KAAK,iBACL,KAAK,aACL,KAAK,YACL,CAACA,GACD,KAAK,mBAAmBA,CAAU,EAElC,OAEI,gBAAa,WAAW,IAAM,CAE9B,KAAK,kBAAoB,CAAC,KAAK,mBAAmBA,CAAU,GACjDoC,GAAsB,KAAK,gBAAgB,EAE1D,KAAK,WAAa,OACdpC,IACHqC,GAAoCrC,CAAU,EAC9C,KAAK,iBAAmBA,IAEvB,GAAG,QACE//B,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,qBAAqB+/B,EAAwB,CACxC,IAQH,GAPI,KAAK,YAEL,KAAK,aACR,aAAa,KAAK,UAAU,EAC5B,KAAK,WAAa,QAKlB,KAAK,iBACL,KAAK,aACL,CAACA,GACD,CAAC,KAAK,mBAAmBA,CAAU,GAEnC,OAEI,eAAY,WAAW,IAAM,CACjC,KAAK,UAAY,OAEbA,GAAc,KAAK,mBAAmBA,CAAU,IACrCoC,GAAsB,KAAK,gBAAgB,EACzD,KAAK,iBAAmB,OAEvB,GAAG,QACEniC,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,kBAAkBs3B,EAA6B,SAC1C,IAKW+K,GAAwB/K,EAAK,UAAU,EAE/C,MAAA4J,EAAa5J,EAAK,WAAW,WAC7B6J,EAAa7J,EAAK,iBAAiB,WAEnCgL,EAAiB,CACtB,CACC,OAAMrjC,EAAA,KAAK,eAAe,YAAYiiC,EAAW,MAAM,IAAjD,YAAAjiC,EAAoD,OAAQ,GAClE,KAAMiiC,EAAW,KACjB,MAAOA,EAAW,KACnB,EACA,CACC,OAAMz6B,EAAA,KAAK,eAAe,YAAY06B,EAAW,MAAM,IAAjD,YAAA16B,EAAoD,OAAQ,GAClE,KAAM06B,EAAW,KACjB,MAAOA,EAAW,KACnB,GAGI,wBAAmBmB,EAAgB,EAAK,QACrCtiC,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,oBAAoBwjB,EAAoB+e,EAAO,CAI1C,CAAC/e,EAAS,UAAY+e,EAAM,SAAW/e,EAAS,SAAS,QACxD,cAAS,SAASA,EAAU,EAAI,CACtC,EACA,mBAAmBA,EAAoB,CACjCA,EAAS,UACT,cAAS,SAASA,EAAU,EAAK,CACvC,EACA,MAAM,qBAAqB8T,EAAgC,OACtD,IACH,GAAIA,EAAK,eAAe,WAAW,aAAe,SAAU,CAE3D,MAAM8J,EAAe9J,EAAK,eAC1BA,EAAK,eAAiBA,EAAK,eAC3BA,EAAK,eAAiB8J,CACvB,CAEM,MAAAkB,EAAoDE,GAAkBlL,CAAI,EAOhF,GANc+K,GAAwB/K,EAAK,cAAc,EACzDmL,GAAkCnL,EAAK,eAAgBA,EAAK,UAAU,EAEtEA,EAAK,WAAW,iBACX,wCAAmCA,EAAM,GAAO,EAAK,EAEtD,KAAK,uBAAwB,CAEhC,KAAK,aAAa,qBAElB,MAAMiE,EADa,KAAK,eAAe,YAAYjE,EAAK,WAAW,WAAW,MAAM,EAClD,KAC5Brb,EAAcqb,EAAK,WAAW,WAAW,MACzCuJ,EAAyBvJ,EAAK,WAAW,UAC7C,uBAEEgL,GACH,KAAK,aAAa,kBAAkB,IAAII,GAAwBJ,CAAc,CAAC,EAE3E,qBACJ/G,EACAtf,EACA,KAAK,yBACLhd,EAAA4hC,GAAA,YAAAA,EAAwB,aAAxB,YAAA5hC,EAAoC,QAAS,EAC7C+H,EAAmB,MAEpB,KAAK,uBAAyB,KAC9B,MAAM,KAAK,YACX,KAAK,aAAa,mBAAkB,SAEpC,CAAC,KAAK,aAAa,gBACnB,CAAC,KAAK,qCACNs7B,EACC,CAGD,MAAMK,EAAgB,IAAID,GAAwBJ,EAAgB,IAAI,EACjE,kBAAa,kBAAkBK,CAAa,CAClD,CAEK,KAAK,YAAY,+BACd3iC,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,iBAAiB+/B,EAAwB,QAGxC9gC,EAAA8gC,EAAW,SAAS,gBAAgB,IAApC,MAAA9gC,EAAuC,WAAW,IAC9C,IACH,KAAK,uBAAyB,KAC9B,KAAK,eAAiB,GACtB,KAAK,YAAY,sBAAwB,KACzCkjC,GAAoCpC,CAAU,EAC9CsB,GAA8BtB,CAAU,EAExC,MAAMpb,EAAQob,EAAW,MACnB6C,EAAkB,MAAM,KAC7B,SAAS,iBAAiB,mBAAmBje,CAAK,QAAQ,GAGrDke,EADiB9C,EAAW,WAAW,aACL,SAAW,SAAW,SAExD+C,EAAoBF,EAAgB,OAAQzP,GAAO,CAClD,MAAA3P,EAAW2P,EAAG,IAAI,SACxB,GAAI,CAAC3P,EAAiB,SAGtB,MAAMuf,EAAavf,EAAS,WAAW,SAAWuc,EAAW,WAAW,OAClEiD,EAAexf,EAAS,WAAW,WAElC,OAACuf,GAAcC,IAAiBH,CAAA,CACvC,EAEKI,EAAejjC,GAA+B,CACnD,GAAI,CAAC+/B,EACJ,OAGD,MAAMmD,EAAwBJ,EAC5B,OAAQ3hC,GAAqB,CACvB,MAAAqiB,EAAWriB,EAAQ,IAAI,SAE7B,GAAIA,EAAQ,UAAU,SAAS,uBAAuB,EAC9C,SAER,MAAMgiC,EAAsBC,GAAoCjiC,EAASnB,EAAG,EAAE,EACxEqjC,EAAyBD,GAC9B5f,EAAS,QACTxjB,EACA,IAGD,GAAImjC,GAAuBE,EAAwB,CAClD,MAAM9lC,EAAO,KAAK,eAAe,YAAYimB,EAAS,WAAW,MAAM,EAEvE,GAAIjmB,EAGH,MAFiB,OAAK,eAAe,YAAYA,EAAK,KAAMA,EAAK,WAAW,CAM9E,CAEO,QACP,GACA,KAAK,CAACqvB,EAAG9I,IAAM,CACf,MAAMwf,EAAqBC,GAA2C3W,EAAG5sB,EAAG,EAAE,EACxEwjC,EAAqBD,GAA2Czf,EAAG9jB,EAAG,EAAE,EAG9E,MAAI,EAACsjC,GAAA,MAAAA,EAAoB,IAAK,EAACE,GAAA,MAAAA,EAAoB,GAC3C,EAIHF,GAAA,MAAAA,EAAoB,EACpBE,GAAA,MAAAA,EAAoB,EAGlBA,EAAmB,EAAIF,EAAmB,EAHd,GADA,CAIc,CACjD,EAEE,GAAAJ,EAAsB,OAAS,EAAG,CAE/B,MAAA1f,EADuB0f,EAAsB,CAAC,EACd,IAAI,SACpC3lC,EAAO,KAAK,eAAe,YAAYimB,EAAS,WAAW,MAAM,EAElE,6BAAyBjmB,GAAA,YAAAA,EAAM,OAAQ,KAE9BkmC,GAAwB1D,EAAYvc,CAAQ,OAE1DkgB,GAAsC3D,CAAU,EAChD,KAAK,uBAAyB,IAC/B,EAGK4D,EAAa3jC,GAA+B,CACjD,KAAK,eAAiB,GACtB,KAAK,YAAY,sBAAwB,KAAK,+BAA+BA,CAAC,EAC9E+gC,GAAuChB,CAAU,EAC1C,2BAAoB,YAAakD,CAAW,EAC5C,2BAAoB,UAAWU,CAAS,EAE/C,KAAK,oBAAsB,CAC1B,KAAM,KACN,WAAY,KACb,EAGM,wBAAiB,YAAaV,CAAW,EACzC,wBAAiB,YAAaA,CAAW,EACzC,wBAAiB,UAAWU,CAAS,EACrC,wBAAiB,WAAYV,CAAW,EAE/C,KAAK,oBAAsB,CAC1B,KAAMlD,EAAW,WAAW,KAC5B,WAAYA,EAAW,WAAW,kBAE3B//B,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,8BAA8B+/B,EAAwB,OACrD,OAAO,QAAO9gC,EAAA,KAAK,WAAL,YAAAA,EAAe,kBAAkB,EAC7C,QAAS06B,GAAc,OAAO,OAAOA,CAAS,CAAC,EAC/C,OAAQnW,GAAaA,EAAS,SAAS,OAAS,SAAS,EACzD,QAASA,GAAa,WAAW,IAAMA,EAAS,SAAS,WAAWA,EAAS,OAAO,EAAG,CAAC,CAAC,CAC5F,EACA,oBAAoBA,EAAoB,CACnCA,GAAA,MAAAA,EAAU,QACb,KAAK,wBAAwB,CAC5B,SAAUA,EAAS,OAAO,OAC1B,MAAOA,EAAS,OAAO,MACvB,YAAa2V,GAA0B,cACvC,WAAY3V,EAAS,MACrB,aAAcA,EAAS,KACvB,CAEH,EACA,wBAAwBA,EAAoB,CACvCA,GAAA,MAAAA,EAAU,QACb,KAAK,wBAAwB,CAC5B,SAAUA,EAAS,OAAO,OAC1B,MAAOA,EAAS,OAAO,MACvB,YAAa2V,GAA0B,mBACvC,gBAAiBvJ,GACjB,WAAYpM,EAAS,MACrB,aAAcA,EAAS,KACvB,CAEH,EACA,kBAAmB,CACd,KAAK,iBACT,KAAK,SAAS,KAAKogB,GAAwB,KAAK,sBAAsB,EAEtE,KAAK,SAAS,KAAKC,GAAuB,KAAK,qBAAqB,EAEpE,KAAK,SAAS,KAAKC,GAAkB,KAAK,iBAAiB,EAE3D,KAAK,SAAS,KAAKC,GAAiB,KAAK,UAAU,EACnD,KAAK,SAAS,KAAKC,GAA4B,KAAK,qBAAqB,EACzE,KAAK,SAAS,KAAKC,GAA2B,KAAK,oBAAoB,EAEvE,KAAK,SAAS,KAAKC,GAAwB,KAAK,iBAAiB,EACjE,KAAK,SAAS,KAAKC,GAA0B,KAAK,mBAAmB,EACrE,KAAK,SAAS,KAAKC,GAAyB,KAAK,kBAAkB,EACnE,KAAK,SAAS,KAAKC,GAA2B,KAAK,oBAAoB,EACvE,KAAK,SAAS,KAAKC,GAAuB,KAAK,gBAAgB,EAC/D,KAAK,SAAS,KACb,CAACA,GAAuBV,GAAwBS,EAAyB,EACzE,KAAK,+BAEN,KAAK,SAAS,KAAKE,GAA2B,KAAK,mBAAmB,EACtE,KAAK,SAAS,KAAKC,GAAgC,KAAK,uBAAuB,EAE/E,KAAK,eAAiB,GACvB,EACA,oBAAqB,CACpB,KAAK,SAAS,OAAOZ,GAAwB,KAAK,sBAAsB,EAExE,KAAK,SAAS,OAAOC,GAAuB,KAAK,qBAAqB,EAEtE,KAAK,SAAS,OAAOC,GAAkB,KAAK,iBAAiB,EAE7D,KAAK,SAAS,OAAOC,GAAiB,KAAK,UAAU,EACrD,KAAK,SAAS,OAAOC,GAA4B,KAAK,qBAAqB,EAC3E,KAAK,SAAS,OAAOC,GAA2B,KAAK,oBAAoB,EAEzE,KAAK,SAAS,OAAOC,GAAwB,KAAK,iBAAiB,EACnE,KAAK,SAAS,OAAOC,GAA0B,KAAK,mBAAmB,EACvE,KAAK,SAAS,OAAOC,GAAyB,KAAK,kBAAkB,EACrE,KAAK,SAAS,OAAOC,GAA2B,KAAK,oBAAoB,EACzE,KAAK,SAAS,OAAOC,GAAuB,KAAK,gBAAgB,EAEjE,KAAK,SAAS,OAAOA,GAAuB,KAAK,6BAA6B,EAC9E,KAAK,SAAS,OAAOV,GAAwB,KAAK,6BAA6B,EAC/E,KAAK,SAAS,OAAOS,GAA2B,KAAK,6BAA6B,EAClF,KAAK,SAAS,OAAOE,GAA2B,KAAK,mBAAmB,EACxE,KAAK,SAAS,OAAOC,GAAgC,KAAK,uBAAuB,EACjF,KAAK,eAAiB,EACvB,EACA,6BAA6BC,EAAO,GAAM,CACzC,GAAI,KAAK,SAAU,CAEZ,MAAAC,EAAW,KAAK,SAAS,mBAAmB,EAClD,UAAWvjC,KAAW,OAAO,OAAOujC,CAAQ,EAAG,CAC9C,MAAM/K,EAAYx4B,EAAQ,UACf,UAAAqiB,KAAYmW,GAAa,GAAI,CACvC,MAAMgL,EAAmBnhB,GAAA,YAAAA,EAAU,SAC/BmhB,GAAoBA,EAAiB,OAASC,IAChDD,EAAqC,aAAa,CAErD,CACD,CACD,CAEA,KAAK,eAAiB,EACvB,EACA,eAAe,EAAsB,CAChC,UAAK,QAAU,OAAO,6BAE1B,IAAW,KAAK,QAAQ,aAGvB,YAAK,mBAAmB,qBAAqB,KAAK,eAAe,UAAU,EAEtE,mBAAgB,WAAW,IAAM,CACrC,KAAK,mBAAmB,qBAAqB,KAAK,eAAe,UAAU,GACzE,EAAIE,GAAK,MAAM,EAClB,EAAE,YAAc,GACT,GAEP,KAAK,aAAa,KAAK,QAAQ,SAAS,sBAAsB,CAAC,EAC/D,KAAK,mBAAmB,qBAAqB,KAAK,eAAe,UAAU,EAC3E,OAEF,EACA,UAAW,CAGV,aAAa,KAAK,aAAa,CAChC,EACA,MAAM,aAA6B,CAClC,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,aAAe,MAAM,KAAK,eAAe,mBAAmB,EAC5D,oBAAe,0BAA4B,GAChD,KAAK,eAAe,wBAA0B,KAE9C,KAAK,QAAQ,aAAe,GAC5B,KAAK,YAAY,aAAa,EAAG,CAAC,EAAG,CAAC,CAAC,EACvC,MAAM,KAAK,wBACX,KAAK,QAAQ,oBAAsB,GACnC,KAAK,aAAa,QAClB,KAAK,eAAe,wBAA0B,KAC9C,KAAK,YAAY,CAClB,EACA,MAAM,uBAAuC,CAC5C,KAAK,YAAY,WAClB,EACA,MAAM,UAA0B,SAC/B,GAAI,KAAK,OAAO,OAAO,SAAW,eAAgB,CAGjD,KAAK,QAAQ,aAAe,GAC5B,MACD,CACA,GAAI,KAAK,cACR,KAAK,cAAgB,WACX,KAAK,OAAO,OAASpkB,EAAM,gBAAiB,CAChD,MAAAyZ,EAAa,KAAK,OAAO,OAAO,GAChC,WAAK,qBAAqBA,CAAU,MACpC,CACN,GAAI,KAAK,QAAQ,cAAgB,CAAC,KAAK,YAAa,CAC7C,MAAA7B,EAAe,MAAM,KAAK,QAC/B,KAAK,QAAQ,SAAS,4CAA4C,EAClE,CACC,MAAO,KAAK,QAAQ,SAAS,6CAA6C,EAC1E,KAAM,UACN,kBAAmB,KAAK,QAAQ,SAC/B,sDACD,EACA,iBAAkB,KAAK,QAAQ,SAC9B,qDACD,EACA,UAAW,EACZ,GAED,GAAIA,IAAiBlrB,GACN,MAAM,KAAK,uBACR,WAAK,cAAc,2BAC1BkrB,IAAiByM,GAC3B,MAEF,CAEA,IAAIC,EAAa,KAIjB,GAHI,KAAK,OAAO,OAAO,OACTA,EAAA,KAAK,OAAO,OAAO,MAE7BA,IAAe,KAAM,CACxB,IAAIp9B,EACA,IACHA,EAAW,MAAM,KAAK,eAAe,cAAco9B,CAAU,QACrD79B,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,oCAAoC,CAAC,EAE5E,KAAK,QAAQ,KAAK,CACtB,KAAMuZ,EAAM,aACZ,CACF,CAEI9Y,IACE,cAASA,EAAS,KAAM,MAAM,EAC7B,WAAK,aAAaA,CAAQ,EAChC,MAAM,KAAK,yBAEP1I,EAAA0I,EAAS,OAAT,MAAA1I,EAAe,cAClB,KAAK,WAAW,MACf,yDAAyD0I,EAAS,KAAK,YAAY,GACnF,CACC,YAAaA,EAAS,EACvB,EACA,CACC,YAAa,GACb,YAAa,EACd,GAIO,OAAAlB,EAAA,KAAK,OAAO,OAAZ,YAAAA,EAAkB,YAAa,IAEzC,MAAM,KAAK,aAEb,CACA,KAAK,aAAa,QAClB,KAAK,QAAQ,oBAAsB,GAC1B,0BAAiB,UAAW,KAAK,OAAO,EACxC,0BAAiB,QAAS,KAAK,KAAK,EAEtC,wBAAiB,eAAgB,KAAK,cAAc,EACpD,wBAAiB,SAAU,KAAK,QAAQ,EAG/C,KAAK,yBAAyB,CAACga,EAAM,SAAUA,EAAM,YAAY,CAAC,CACnE,EACA,sBACC3f,EACAob,EACA7V,EACgB,CAChB,MAAM9I,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACvD,OAAKvD,EAIEyoB,GAAoCzoB,EAAK,GAAI2e,EAAgB7V,CAAK,EAHjE,IAIT,EACA,qBAAqBvF,EAAkBob,EAAiC7V,EAAe,CACtF,MAAM9I,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACvD,OAAKvD,EAIEunB,GAAmCvnB,EAAK,GAAI2e,EAAgB7V,CAAK,EAHhE,IAIT,EACA,gBAAgB05B,EAAwC,OACvD,MAAMiF,EAAa,KAAK,sBACvBjF,EAAW,CAAC,EAAE,KACdA,EAAW,CAAC,EAAE,KACdA,EAAW,CAAC,EAAE,OAETkF,EAAY,KAAK,qBACtBlF,EAAW,CAAC,EAAE,KACdA,EAAW,CAAC,EAAE,KACdA,EAAW,CAAC,EAAE,OAEX,IAACiF,GAAc,CAACC,EACnB,OAGK3mC,QAAyB,CAAC0mC,EAAYC,CAAS,GAErDhmC,EAAA,KAAK,WAAL,MAAAA,EAAe,QAAQ,CACtB,MAAOX,EACP,WAAY,CAAC,KAAK,iBAAmB,CAAC,KAAK,cAG5C,WAAW,IAAM,CACX,2BAAsB,KAAK,eAAe,OAAO,EACtD,CACF,EACA,mBAAmByhC,EAAwCmF,EAAyB,GAAO,SAC1F,GAAIA,EAAwB,CAC3B,MAAMxJ,EAAa,KAAK,eAAe,cAAcqE,EAAW,CAAC,EAAE,IAAI,EACjEE,EAAa,KAAK,eAAe,cAAcF,EAAW,CAAC,EAAE,IAAI,EAEnE,IAACrE,GAAc,CAACuE,EACnB,OAGK,MAAArB,EAAiB,KAAK,eAAe,YAC1ClD,EAAW,KACXA,EAAW,aAENyJ,IACLlmC,EAAA2/B,GAAA,YAAAA,EAAgB,UAAhB,YAAA3/B,EAA0B8gC,EAAW,CAAC,EAAE,SAAU/4B,EAAmB,KAChEo+B,EACL,OAAOD,GAAqB,SAAWA,EAAmBA,EAAiB,KACtExgB,EAAQC,GAA+BwgB,CAAoB,IAE7C3+B,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CACjD,MAAAke,EACA,OAAQ+W,EAAW,GACnB,OAAQuE,EAAW,MAGR,QAASoF,GAAmC,CACnDA,EAAmB,OAGrBA,EAAmB,OAAO,oBAAsBtF,EAAW,CAAC,EAAE,OAC9DsF,EAAmB,OAAO,oBAAsBtF,EAAW,CAAC,EAAE,OAE9D,KAAK,0BAA0BsF,CAAkB,EAGlD,KAAK,0BAA0BA,CAAkB,CAClD,CACA,CACF,CAEA,KAAK,eAAe,iBAAiB,CAAE,WAAAtF,CAAY,EACpD,EACA,0BAA0BA,EAAwB1B,EAAe,GAAO,WAOnE,GAJJ0B,EAAW,eAAe,EAE1B,KAAK,uBAAyB,MACzB9gC,EAAA,sBAAAA,EAAU,iBAAiB8gC,GAC5B1B,GAAgB0B,EAAW,OAAQ,CACtC,MAAMG,EAA6C,CAClD,CACC,OAAOz5B,EAAAs5B,EAAW,SAAX,YAAAt5B,EAAmB,kBAC1B,KAAMs5B,EAAW,OAAO,eACxB,KAAM/4B,EAAmB,IAC1B,EACA,CACC,OAAOqD,EAAA01B,EAAW,SAAX,YAAA11B,EAAmB,kBAC1B,KAAM01B,EAAW,OAAO,eACxB,KAAM/4B,EAAmB,IAC1B,GAEK27B,EAAgB,IAAID,GAAwBxC,EAAgB,IAAI,EACjE,kBAAa,kBAAkByC,CAAa,CAClD,CACD,EACA,mCAAmCrL,EAAM4N,EAAyB,GAAO7G,EAAe,GAAO,CACxF,MAAAiE,EAAoDE,GAAkBlL,CAAI,EAE5EgL,IACC4C,EACE,+BAA0B5N,EAAK,WAAY+G,CAAY,EAClDA,GACV,KAAK,aAAa,kBAAkB,IAAIqE,GAAwBJ,CAAc,CAAC,EAEhF,KAAK,eAAe,iBAAiB,CAAE,WAAYA,CAAgB,GAErE,EACA,MAAM,eAAellC,EAA+B,CAC/C,IAAC,KAAK,mBACT,OAGD,MAAMi8B,EAAevpB,GAAS,MAAM,KAAK,eAAe1S,CAAK,CAAC,EAC9D,MAAM,KAAK,mBAAmBi8B,EAAc,YAAa,EAAK,CAC/D,EACA,qBACCkC,EACAyD,EACAY,EACA0F,EACAppB,EACyB,SACzB,MAAMwf,EAAa,KAAK,eAAe,cAAcH,CAAc,EAC7D0E,EAAa,KAAK,eAAe,cAAcL,CAAc,EAC/D,IAAClE,GAAc,CAACuE,EACnB,OAGD,MAAMsF,EAAW7J,EAAW,GACtB8J,EAAWvF,EAAW,GAEtBwF,EAAiBzf,GACtBuf,EACArpB,EACA8iB,CAAA,EAEKqB,EAAiBvb,GACtB0gB,EACAtpB,EACAopB,CAAA,EAGK1G,EAAiB,KAAK,eAAe,YAC1ClD,EAAW,KACXA,EAAW,aAENyJ,IACLlmC,EAAA2/B,GAAA,YAAAA,EAAgB,UAAhB,YAAA3/B,EAA0B+/B,KAAsBh4B,EAAmB,KAC9Do+B,EACL,OAAOD,GAAqB,SAAWA,EAAmBA,EAAiB,KACtExgB,EAAQC,GAA+BwgB,CAAoB,EAS1D,QANa3+B,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CACjD,MAAAke,EACA,OAAQ4gB,EACR,OAAQC,CAAA,IAGU,KAAMzF,GAA2B,CAC7C,MAAA2F,EAAQ3F,EAAW,WACzB,OAAO2F,EAAM,CAAC,IAAMD,GAAkBC,EAAM,CAAC,IAAMrF,CAAA,CACnD,CACF,EACA,oBAAoBv/B,EAA8B,OACjD,MAAMvD,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACjD6kC,EAAS,KAAK,SAAS,kBAAkBpoC,GAAA,YAAAA,EAAM,EAAE,EAGhD,OADW0B,EAAA,KAAK,WAAL,YAAAA,EAAe,aAAa0mC,EAE/C,EACA,gBAAgB7kC,EAAkBmb,EAA2C,CAE5E,OADkB,KAAK,oBAAoBnb,CAAQ,EAClC,KACf0iB,GAAA,OAEA,OAAAA,EAAS,SAAS,OAAS,aAAavkB,EAAAukB,GAAA,YAAAA,EAAU,SAAV,YAAAvkB,EAAkB,SAAUgd,EAAA,CAEvE,EACA,+BAA+Bnb,EAG7B,SACD,MAAMvD,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EAEvD,GAAIvD,EAAM,CAEH,MAAAqoC,GAAW3mC,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CAC9C,OAAQ1B,EAAK,KAQP,OACN,UALgBkJ,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CAC9C,OAAQlJ,EAAK,KAKb,SAAAqoC,CAAA,CAEF,CACA,MAAO,CAAE,SAAU,GAAI,SAAU,CAAG,EACrC,EACA,YAAYroC,EAAe,CAC1B,KAAM,CAAE,SAAAsoC,EAAU,SAAAD,GAAa,KAAK,+BAA+BroC,EAAK,IAAI,EAE5E,CAAC,GAAGsoC,EAAU,GAAGD,CAAQ,EAAE,QAAS7F,GAA2B,CAC9DkC,GAAsClC,CAAU,EAChDiC,GAAmCjC,CAAU,EAC7C,CACF,EACA,UAAU,CACT,KAAA9wB,EACA,KAAAhI,EACA,QAAA6+B,CAAA,EAKE,OACIp/B,QAAU,KAAK,eAAe,WAEpC,GAAIA,WAAUuI,GAAO,OAErB,MAAMssB,EAAiBtsB,EACjBysB,EAAa,KAAK,eAAe,cAAcH,CAAc,EAC7DgK,EAAW7J,IAAe,KAAOA,EAAW,GAAK,GAEvD,GAAIz0B,IAAS,MAAQA,EAAK,SAAW,GAAK6+B,EAAS,GACjC7mC,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CAC9C,OAAQsmC,CAAA,IAGA,QAASxF,GAA2B,CAC5CsB,GAA8BtB,CAAU,EACxC,EACiB,KAAK,oBAAoBxE,CAAc,EAC/C,QAAS/X,GAAuB,CACrCA,EAAS,SAAS,OAAS,WAC7BA,EAAS,SAA6B,oBACxC,CACA,EAED,MACD,CAEA,MAAMuiB,EAAqB,KAAK,eAAe,8BAA8BxK,CAAc,EAErFrf,EAAiB,OAAO,KAAK6pB,CAAkB,EAAE,CAAC,EAClDjG,EAAkBiG,EAAmB7pB,CAAc,EACnD8pB,EAAYC,GACjBh/B,EACA64B,GAAmB,CAAC,EACnB5jB,GAAsClV,EAAmB,MAE3D,OAAO,KAAKg/B,CAAS,EAAE,QAAShH,GAA8B,CAC7D,OAAO,KAAKgH,EAAUhH,CAAiB,CAAC,EAAE,QAASY,GAA2B,CAC7E,OAAO,KAAKoG,EAAUhH,CAAiB,EAAEY,CAAc,CAAC,EAAE,QACxD0F,GAA6B,CAC7B,GAAI1F,EAAgB,CACnB,MAAMG,EAAa,KAAK,qBACvBxE,EACA,SAASyD,EAAmB,EAAE,EAC9BY,EACA,SAAS0F,EAAkB,EAAE,EAC7BppB,CAAA,EAGD,GAAI6jB,EAAY,CACf,MAAMh5B,EAASi/B,EAAUhH,CAAiB,EAAEY,CAAc,EAAE0F,CAAgB,EAExEv+B,EAAO,+BACVm/B,GAAkCnG,CAAU,EAClC,EAACh5B,GAAA,MAAAA,EAAQ,QAAS,CAACA,EAAO,+BACpCs6B,GAA8BtB,CAAU,EAE1BoG,GAA2BpG,EAAYh5B,CAAM,CAE7D,CACD,CAEA,MAAMyc,EAAW,KAAK,gBACrB+X,EACA,SAASyD,EAAmB,EAAE,GAE/B,GAAIxb,GAAA,MAAAA,EAAU,SAAU,CACvB,MAAMzc,EAASi/B,EAAUhH,CAAiB,EAAEoH,EAAuB,EAAE,CAAC,EAElEr/B,GAAUA,EAAO,MAAQ,EAC3Byc,EAAS,SAA6B,iBACtC6iB,GAA+Bt/B,CAAM,GAGrCyc,EAAS,SAA6B,oBAEzC,CACD,EACD,CACA,EACD,CACF,EACA,WAAW1iB,EAAkBu9B,EAAe,GAAOiI,EAAY,GAAM,CAChE,IAAC,KAAK,mBACT,OAGD,MAAM/oC,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACvD,GAAI,CAACvD,EACJ,OAGG8gC,GAAgBiI,GACnB,KAAK,aAAa,qBAInB,MAAMC,EAA8B,GAEpC,GAAIA,EAAkB,SAAShpC,EAAK,IAAI,EAAG,CAI1C,IAAIipC,EAAgB,GACT,UAAAC,KAAa,KAAK,MACxB,GAAAA,EAAU,OAASlpC,EAAK,MAGxBgpC,EAAkB,SAASE,EAAU,IAAI,EAAG,CAC/BD,EAAA,GAChB,KACD,CAGD,GAAI,CAACA,EACJ,MAEF,CAEIjpC,EAAK,OAASgG,GACZ,gBAAW,MAAM,6BAA8B,CACnD,YAAa,KAAK,eAAe,WACjC,gBAAiBhG,EAAK,OAAS2rB,EAAA,CAC/B,GAEI,KAAK,cAAc,IAAI,kBAAmB,CAAE,KAAA3rB,EAAM,EAClD,gBAAW,MAAM,oBAAqB,CAC1C,UAAWA,EAAK,KAChB,YAAa,KAAK,eAAe,WACjC,GAGF,IAAImpC,EAAuB,GAE3B,MAAMjkC,EAAW,KAAK,eAAe,YAAYlF,EAAK,KAAMA,EAAK,WAAW,EAEtEoK,EAAW,KAAK,qBAChBsG,EAAetG,EAAS,QAAQpK,EAAK,IAAI,EAC/C,IAAI2Q,EAA2D,GAC3DoO,EAA6D,GAMjE,GALI7Z,IACHyL,EAASC,GAA0BxG,EAAUsG,EAAexL,CAAQ,EACpE6Z,EAAUzB,GAA2BlT,EAAUsG,EAAexL,CAAQ,GAGnE6Z,EAAQ,SAAW,GAAKpO,EAAO,SAAW,EAAG,CAChD,KAAM,CAAE,SAAA23B,EAAU,SAAAD,GAAa,KAAK,+BAA+BroC,EAAK,IAAI,EAC5E,GAAIsoC,EAAS,SAAW,GAAKD,EAAS,SAAW,EAAG,CAC7C,MAAAe,EAAQd,EAAS,CAAC,EAClBe,EAAQhB,EAAS,CAAC,EACpB,GAAAe,EAAM,QAAUC,EAAM,OAAQ,CACVF,EAAA,GACjB,MAAAnL,EAAiBoL,EAAM,OAAO,eAC9BhH,EAAwBgH,EAAM,OAAO,kBACrC/G,EAAiBgH,EAAM,OAAO,eAC9B/G,EAAuB+G,EAAM,OAAO,kBAE1C,WAAW,IAAM,OACX,qBACJrL,EACAoE,EACAC,EACAC,EACA74B,EAAmB,MAGhB0/B,KACEznC,EAAA,sBAAAA,EAAU,kBAAkB,GAAO,IACjBynC,EAAA,KAEtB,GAAG,CACP,CACD,CACD,CAEKnR,GAAS,IAAM,YAEdt2B,EAAA,sBAAAA,EAAU,kBAAkB,OAChCwH,EAAA,KAAK,WAAL,YAAAA,EAAe,mBAAmBlJ,EAAK,MAAO,IAC7C,KAAK,EACL,QAASimB,UAAa,OAAAvkB,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAeukB,GAAS,EAG1D,oBAAe,wBAAwBjmB,CAAI,EAC3C,oBAAe,WAAWA,CAAI,EAC9B,oBAAe,uBAAuBA,EAAK,IAAI,EAE/CmpC,IAECr8B,EAAA,sBAAAA,EAAU,kBAAkB,GAAO,IAIpC,aAAQ,wBAAwB9M,CAAI,EACrC8gC,GACH,KAAK,aAAa,kBAAkB,IAAIwI,GAAkBtpC,CAAI,CAAC,CAChE,CACA,EAEG8gC,GAAgBiI,GAEnB,WAAW,IAAM,CAChB,KAAK,aAAa,qBAFMI,EAAuB,IAAM,CAGnC,CAErB,EACA,MAAM,qBAAqB5lC,EAAkB,CACvC,wBAAmBA,EAAU,GAAM,EAAI,CAC7C,EACA,MAAM,WAAWA,EAAkB,CAIlC,MAAMgmC,EAAW,iBACX,WAAK,WAAWhmC,EAAUgmC,CAAQ,EAClC,WAAK,WAAWA,EAAUhmC,CAAQ,CACzC,EACA,aAAakP,EAAmC,CAC3CA,EAAc,OAAS,QAAUA,EAAc,UAG7C,KAAK,WAAWA,EAAc,SAAoBA,EAAc,KAAe,CAEtF,EACA,MAAM,iBAAiB+2B,EAAqB,CACvC,IACH,MAAMC,EAAwB,KAAK,OAClC,KAAK,QAAQ,SAAS,yBAAyB,EAAI,IACnD,KAAK,QAAQ,SAAS,4BAA4B,EAAI,KAAKD,CAAW,GACtE,CACC,YAAa,gBACb,kBAAmB,KAAK,QAAQ,SAAS,wBAAwB,EACjE,iBAAkB,KAAK,QAAQ,SAAS,wBAAwB,EAChE,kBAAmB,KAAK,QAAQ,SAAS,6BAA6B,EACtE,WAAYA,CACb,GAID,MAAM,KAAK,YAGL,MAAAE,EAAY,SAAS,cAAc,iCAAiC,EAGtEA,IACHA,EAAU,MAAM,EAChBA,EAAU,OAAO,GAGlB,MAAMC,EAAkB,MAAMF,EAE9B,IAAIE,GAAA,YAAAA,EAAgB,UAAW/5B,GAAe,OAE9C,MAAM,KAAK,WAAW45B,EAAaG,EAAe,MAAO,EAAI,OAClD,CAAC,CACd,EACA,MAAM,WAAWH,EAAqBI,EAAiB9I,EAAe,GAAO,CAC5E,GAAI0I,IAAgBI,EACnB,OAGD,KAAK,oCAAsC,GACvC9I,GACH,KAAK,aAAa,qBAInB,MAAM+I,GADiB,KAAK,YAAc,KAAK,WAAW,QACtBL,EAChCK,IACH,KAAK,eAAiB,IAGbD,EAAA,KAAK,eAAeA,CAAO,EAG/B,MAAAx/B,EAAW,KAAK,mBAAmB,EAAI,EACpCA,EAAA,WAAWo/B,EAAaI,CAAO,EAEpC9I,GACH,KAAK,aAAa,kBAAkB,IAAItuB,GAAkBg3B,EAAaI,CAAO,CAAC,EAIhF,KAAK,eAAe,+BAA+B,CAAE,IAAKJ,EAAa,IAAKI,EAAS,EAGrF,KAAK,oBAAoB,EAEzB,KAAK,eAAe,qBAAqB,CAAE,cAAe,EAAO,GACjE,KAAK,eAAe,eAAe,CAAE,cAAe,GAAO,cAAe,GAAM,EAGhF,MAAM,KAAK,YAGL,WAAK,SAAS,OAAO,OAAOx/B,EAAS,KAAK,EAAGA,EAAS,wBAAyB,EAAK,EAG1F,KAAK,iBAAiB,EACtB,KAAK,mBAAmBw/B,CAAO,EAE3BC,IACH,KAAK,SAAS,eAAiBD,EAC/B,KAAK,eAAiB,IAGnB9I,GACH,KAAK,aAAa,oBAEnB,KAAK,oCAAsC,EAC5C,EACA,qBAAsB,SAEjB,KAAK,YACRp/B,EAAA,KAAK,WAAL,MAAAA,EAAe,QACf,OAAO,QAAOwH,EAAA,KAAK,WAAL,YAAAA,EAAe,kBAAkB,EAC7C,QAAS+c,GAAaA,CAAQ,EAC9B,QAASA,GAAaA,EAAS,SAAS,EAE1C,KAAK,SAAS,sBAAsB,CAAE,UAAW,EAAM,GAEzD,EACA,iBAAiBjmB,EAAe,CAC1BA,EAAK,aAGH,eAAQA,EAAK,WAAW,EAAE,QAChC,CAAC,CAAC8pC,EAAoBC,CAAe,IAAyC,CAC7E,MAAMC,EAAoB,KAAK,iBAAiB,qBAAqBF,CAAkB,EAWvF,GARI,OAAOC,GAAoB,WACZA,EAAA,CACjB,GAAI,KACJ,KAAMA,CAAA,EAEP,KAAK,mBAAqB,IAGvBA,EAAgB,GAAI,CAEjB,MAAAE,EAAgBF,EAAgB,GAAG,SAAS,EAC5CG,EAAmBF,EAAkB,KACzCG,GAAqCA,EAAW,KAAOF,CAAA,EAEzD,GAAIC,EAAkB,EAEpBA,EAAiB,OAASH,EAAgB,MAC1C,OAAOA,EAAgB,IAAO,YAEzB/pC,EAAA,YAAa8pC,CAAkB,EAAI,CACvC,GAAII,EAAiB,GACrB,KAAMA,EAAiB,MAExB,KAAK,mBAAqB,IAE3B,MACD,CACD,CAGKlqC,EAAA,YAAa8pC,CAAkB,EAAIC,EAGxC,MAAMK,EAAqBJ,EAAkB,OAC3CG,GAAqCA,EAAW,OAASJ,EAAgB,MAIvEK,EAAmB,SAAW,IACjCpqC,EAAK,YAAa8pC,CAAkB,EAAE,GAAKM,EAAmB,CAAC,EAAE,GACjE,KAAK,mBAAqB,GAE5B,EAEF,EACA,MAAM,SAASvqC,EAAkBy9B,EAA4BwD,EAAe,GAAO,SAC9E,KAACjhC,GAAA,MAAAA,EAAO,QACX,OAED,KAAK,iBAAmB,GAIxB,MAAM,KAAK,oBACVA,EAAM,IAAKG,IAAU,CAAE,KAAMA,EAAK,KAAM,QAASA,EAAK,WAAc,KAIjE,IAAAkF,EACErF,EAAA,QAASG,GAAS,CAkBvB,GAjBKA,EAAK,KACTA,EAAK,GAAKe,MAGXmE,EAAW,KAAK,eAAe,YAAYlF,EAAK,KAAMA,EAAK,WAAW,EAGjEA,EAAK,eAAe,UAAU,IAClCA,EAAK,SAAW,IAGZA,EAAK,eAAe,YAAY,IACpCA,EAAK,WAAa,IAKfkF,IAAa,KAAM,CACtB,IAAI0N,EAAiB,KACjB,IACHA,EAAiBC,GAChB3N,EAAS,WACTlF,EAAK,WACL,GACA,GACAA,CAAA,QAEOyC,EAAG,CACH,cACP,KAAK,QAAQ,SAAS,yDAAyD,EAC9E,MAAMzC,EAAK,IAAI,KAEjB,QAAQ,MAAMyC,CAAC,CAChB,CACAzC,EAAK,WAAa4S,IAAmB,KAAOA,EAAiB,GAI5D,CAACrD,GAAmB3B,EAAsB,EAAE,SAAS5N,EAAK,IAAI,GAC9DA,EAAK,WAAW,OAAS,KAEpBA,EAAA,WAAW,KAAOA,EAAK,UAE9B,CAGA,KAAK,iBAAiBA,CAAI,EACrB,oBAAe,QAAQA,CAAI,EAC5B8gC,GACH,KAAK,aAAa,kBAAkB,IAAIuJ,GAAerqC,CAAI,CAAC,CAC7D,CACA,EAGD,MAAM,KAAK,aAEN0B,EAAA,sBAAAA,EAAU,kBAAkB,IAE7B47B,GACG,WAAK,eAAeA,CAAW,EAGtC,KAAK,YAAY,oBACjB,KAAK,YAAY,yBACjB,KAAK,qBAAqB,EAC1B,KAAK,iBAAmB,IAGnBp0B,EAAA,sBAAAA,EAAU,kBAAkB,GAAO,GACzC,EACA,MAAM,eAAeo0B,EAA2B,CAC/C,MAAMgN,EAA2D,GAEjE,UAAWnM,KAAcb,EACb,UAAAtf,KAAQsf,EAAYa,CAAU,EACxCb,EAAYa,CAAU,EAAEngB,CAAI,EAAE,QAAQ,CAACusB,EAAoBC,IAAgB,CACtED,GACgBA,EAAA,QAASE,GAAe,CAC1CH,EAAsB,KAAK,CAC1B,CAAE,KAAMnM,EAAY,KAAAngB,EAAM,MAAOwsB,CAAY,EAC7C,CAAE,KAAMC,EAAW,KAAM,KAAMA,EAAW,KAAM,MAAOA,EAAW,KAAM,EACxE,EACD,CACF,CACA,EAKG,WAAK,uBAAuBH,CAAqB,EAC5C,gBAAK,sBAAuB,CAAC,CACzC,EAEA,MAAM,uBAAuBA,EAA0D,CAGtF,QAASvtB,EAAI,EAAGA,EAAIutB,EAAsB,OAAQvtB,GAAK,IACxCutB,EAAsB,MAAMvtB,EAAGA,EAAI,GAAS,EAEpD,QAAS4lB,GAAmB,CACjC,KAAK,gBAAgBA,CAAc,EACnC,CAEH,EAEA,MAAM,mBAAmBj5B,EAAyD,CAOjF,MAAMghC,EAEF,GACEC,EAAyB,GAE3B,IAACjhC,EAAK,MAET,MAAM,IAAI,MAAM,KAAK,QAAQ,SAAS,4BAA4B,CAAC,EAK9D,MAAAkhC,EAAiB,KAAK,uBAExB,IAAAC,EACAjB,EACJ,MAAMkB,EAAuB,GAE7B,MAAM,KAAK,oBACVphC,EAAK,MAAM,IAAK1J,IAAU,CAAE,KAAMA,EAAK,KAAM,QAASA,EAAK,WAAc,KAGrE0J,EAAA,MAAM,QAAS1J,GAAS,CAC5B,GAAI4qC,EAAe5qC,EAAK,IAAI,IAAM,OAC7B,GAAA4qC,EAAe5qC,EAAK,IAAI,EAAE,OAAS4qC,EAAe5qC,EAAK,IAAI,EAAE,IAAK,CAKvD0qC,EAAA1qC,EAAK,IAAI,EAAI4qC,EAAe5qC,EAAK,IAAI,EAAE,UAAU,CAAC,EAChE,YAKe4qC,EAAA5qC,EAAK,IAAI,EAAE,OAAS,EAIrC6qC,EAAU7qC,EAAK,KAEf,MAAM+qC,EAAY,KAAK,OAAO,iBAAiB/qC,EAAK,KAAMA,EAAK,IAAI,EAEzD4pC,EAAA,KAAK,eAAemB,EAAWJ,CAAY,EAErDA,EAAa,KAAKf,CAAO,EACzBc,EAAcG,CAAO,EAAIjB,EAEzBkB,EAAY,KAAK9qC,CAAI,EACrB,EAGD,MAAMgrC,EAA+B,GAC/BC,EAAqBvhC,EAAK,YAC1BwhC,EAAkBJ,EAAY,IAAK9qC,GAASA,EAAK,IAAI,EACvD,IAAAm+B,EAAYngB,EAAMwsB,EAAaW,EAAiBxI,EACpD,IAAKxE,KAAc,OAAO,KAAK8M,CAAkB,EAAG,CACnD,GAAI,CAACC,EAAgB,SAAS/M,CAAU,EAEvC,SAGD,MAAMqE,EAA+B,GAErC,IAAKxkB,KAAQ,OAAO,KAAKitB,EAAmB9M,CAAU,CAAC,EAGrD,IAFUqE,EAAAxkB,CAAI,EAAI,GAElBwsB,EAAc,EACdA,EAAcS,EAAmB9M,CAAU,EAAEngB,CAAI,EAAE,OACnDwsB,IACC,CACD,MAAMY,EAAwB,GAC9B,GAAIH,EAAmB9M,CAAU,EAAEngB,CAAI,EAAEwsB,CAAW,EAElD,IAAAW,EAAkB,EAClBA,EAAkBF,EAAmB9M,CAAU,EAAEngB,CAAI,EAAEwsB,CAAW,EAAE,OACpEW,IAEAxI,EAAiBsI,EAAmB9M,CAAU,EAAEngB,CAAI,EAAEwsB,CAAW,EAAEW,CAAe,EAC7ED,EAAgB,SAASvI,EAAe,IAAI,GAKjDyI,EAAsB,KAAKzI,CAAc,EAIhCH,EAAAxkB,CAAI,EAAE,KAAKotB,CAAqB,CAC5C,CAGDJ,EAAe7M,CAAU,EAAIqE,CAC9B,CAIA,MAAM6I,EAAyB,KAAK,YAAYP,EAAaE,CAAc,EAG3E,IAAKH,KAAWH,EACXG,IAAYH,EAAcG,CAAO,GAIrCQ,EAAa,WAAWR,EAASH,EAAcG,CAAO,CAAC,EAGxD,GAAInhC,EAAK,QAAS,CACjB,IAAI4hC,EAAiB,GACrB,UAAW/nC,KAAY,OAAO,KAAKmG,EAAK,OAAO,EAAG,CAEjD,GAAI,CAAC4hC,EAAgB,CACf,eACJ,IAAI,MAAM,KAAK,QAAQ,SAAS,wCAAwC,CAAC,EACzE,KAAK,QAAQ,SAAS,kCAAkC,GAEzD,QACD,CAEA,MAAMtrC,EAAOqrC,EAAa,MAAMX,EAAcnnC,CAAQ,CAAC,EACnD,IACH,KAAK,WAAWvD,EAAM0J,EAAK,QAAQnG,CAAQ,EAAG,WAAW,EACxC+nC,EAAA,SACT3hC,EAAO,CACE2hC,EAAA,GACjB,QAAQ,MAAM3hC,CAAK,CACpB,CACD,CACD,CAGA,YAAK,aAAa,qBAClB,MAAM,KAAK,SACV,OAAO,OAAO0hC,EAAa,KAAK,EAChCA,EAAa,wBACb,IAGD,KAAK,aAAa,oBAElB,KAAK,QAAQ,aAAe,GAErB,CACN,MAAO,OAAO,OAAOA,EAAa,KAAK,EACvC,YAAaA,EAAa,wBAE5B,EACA,MAAM,eAAexrC,EAAwC,CAC5D,MAAM6J,EAAsB,CAC3B,MAAO,CAAC,EACR,YAAa,CAAC,EACd,QAAS,CAAC,GAIP,IAAAjG,EACJ,MAAM8nC,EAA4B,GAElC,UAAWvrC,KAAQH,EAAO,CACd4D,EAAA,KAAK,kBAAkBzD,CAAI,EACtBurC,EAAA,KAAKvrC,EAAK,IAAI,EAEzB0J,EAAA,MAAM,KAAKjG,CAAQ,EAExB,MAAM+nC,EAAiB,KAAK,eAAe,kBAAkBxrC,EAAK,IAAI,EAKtE,GAJIwrC,IACE9hC,EAAA,QAAS1J,EAAK,IAAI,EAAIwrC,GAI3B/nC,EAAS,aACT,KAAK,cAAc,2BAA2BkhB,GAAyB,OAAO,EAC7E,CACK,MAAAF,EAAkB,KAAK,eAAe,gBAC5ChhB,EAAS,YAAc,OAAO,YAC7B,OAAO,QAAQA,EAAS,WAAW,EAAE,OAAO,CAAC,CAACwoB,EAAGlb,CAAU,IAAM,OAE/D,OAAAA,EAAW,KACV,CAAC0T,EAAgB1T,EAAW,EAAE,KAC9BrP,EAAA+iB,EAAgB1T,EAAW,EAAE,IAA7B,YAAArP,EAAgC,uBAElC,EAEH,CACD,CAGA,IAAI+pC,EACHnO,EACAtf,EACAmtB,EACAX,EACA7H,EACA+I,EAEI,OAAAhiC,EAAA,MAAM,QAAS1J,GAAS,CAE5B,GADAs9B,EAAc,KAAK,eAAe,8BAA8Bt9B,EAAK,IAAI,EACrE,OAAO,KAAKs9B,CAAW,EAAE,SAAW,EAKxC,CAAAoO,EAAkB,GAClB,IAAK1tB,KAAQ,OAAO,KAAKsf,CAAW,EACnC,IAAKkN,EAAc,EAAGA,EAAclN,EAAYtf,CAAI,EAAE,OAAQwsB,IAAe,CAG3E,IAFDiB,EAAmB,GAElBN,EAAkB,EAClBA,EAAkB7N,EAAYtf,CAAI,EAAEwsB,CAAW,EAAE,OACjDW,IAEAxI,EAAiBrF,EAAYtf,CAAI,EAAEwsB,CAAW,EAAEW,CAAe,EAC3DI,EAAgB,QAAQ5I,EAAe,IAAI,IAAM,IACpD8I,EAAiB,KAAK9I,CAAc,EAIlC8I,EAAiB,SACfC,EAAgB,eAAe1tB,CAAI,IACvB0tB,EAAA1tB,CAAI,EAAI,IAET0tB,EAAA1tB,CAAI,EAAEwsB,CAAW,EAAIiB,EAEvC,CAGG,OAAO,KAAKC,CAAe,EAAE,SAC3BhiC,EAAA,YAAY1J,EAAK,IAAI,EAAI0rC,GAC/B,CACA,EAEMhiC,CACR,EACA,gBAAiB,CAYhB,GAXA,KAAK,eAAe,gBAEpB,KAAK,oBAAoB,CAAE,iBAAkB,EAAO,GAC/C,sBAAiB,aAAa,EAAK,EACxC,KAAK,YAAY,YAGjB,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAGrB,KAAK,2BACJ,IACE,KAAK,eAAe,kBAAkB,KAAK,eAAe,UAAU,OAC1D,CAAC,CAElB,KAAK,eAAe,aACf,aAAQ,mBAAmB,iBAAiB,EAEjD,KAAK,QAAQ,qBACb,KAAK,QAAQ,uBAAyB,CAAC,EAAG,CAAC,EAE3C,KAAK,mBAAqB,EAC3B,EACA,MAAM,qBAAqC,CACpC,WAAK,eAAe,sBAC3B,EACA,MAAM,eAA+B,CAC9B,WAAK,eAAe,cAC3B,EACA,MAAM,qBAAqC,CACpC,WAAK,iBAAiB,qBAAqB,EAAI,CACtD,EACA,MAAM,iBAAiC,CAChC,WAAK,iBAAiB,qBAC7B,EACA,MAAM,eAA+B,CAC9B,WAAK,kBAAkB,mBAC9B,EACA,MAAM,aAA6B,CAC5B,WAAK,qBAAqB,iBACjC,EACA,MAAM,oBAAoBiiC,EAAkD,CACrE,MAAAjU,EAAmC,KAAK,eAAe,aAEvDkU,EAA2C,GACxClU,EAAA,QAAS13B,GAAS,CACpB,MAAA6rC,EAAe,MAAM,QAAQ7rC,EAAK,OAAO,EAAIA,EAAK,QAAU,CAACA,EAAK,OAAO,EAE5E2rC,EAAU,KAAMvmC,GAAMA,EAAE,OAASpF,EAAK,MAAQ6rC,EAAa,SAASzmC,EAAE,OAAO,CAAC,GAChF,CAACpF,EAAK,eAAe,YAAY,GAEjC4rC,EAAiB,KAAK,CACrB,KAAM5rC,EAAK,KACX,QAAS,MAAM,QAAQA,EAAK,OAAO,EAAIA,EAAK,QAAQ,MAAM,EAAE,EAAE,CAAC,EAAIA,EAAK,QACxE,CACF,CACA,EAEG4rC,EAAiB,OAAS,IAE7B,KAAK,aAAa,EACZ,WAAK,eAAe,oBAAoBA,CAAgB,EAC9D,KAAK,YAAY,EAEnB,EACA,MAAM,sBAAsB9hC,EAAuB,SAC9C,MAACA,GAAW,OAAOA,EAAQ,MAAS,UAAY,GAACZ,GAAAxH,EAAAoI,EAAQ,OAAR,YAAApI,EAAc,WAAd,MAAAwH,EAAA,KAAAxH,EAAyB,eAG1E,IACH,MAAMkd,EAAO,KAAK,MAAM9U,EAAQ,IAAI,EAChC,GAAA8U,GAAQA,EAAK,UAAY,eACxB,IACG,WAAK,oBAAoBA,CAAI,EAC9B,gBAAaA,EAAK,YAAc,GAChC,oBAAiBA,EAAK,gBAAkB,GAC7C,KAAK,mBAAqB,SAClBnc,EAAG,CACP,OAAO,KACV,OAAO,IAAI,YACV,KAAK,UAAU,CACd,QAAS,QACT,QAAS,KAAK,QAAQ,SAAS,kCAAkC,EACjE,EACD,KAGF,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,kCAAkC,EAC/D,QAAUA,EAAY,QACtB,KAAM,QACN,CACF,SACUmc,GAAQA,EAAK,UAAY,gBAC/B,IAGE,kCAA+BA,EAAK,gBAAkB,SAErD,WAAK,cAAcA,EAAK,WAAW,EACpC,gBAAaA,EAAK,YAAc,GAChC,oBAAiBA,EAAK,gBAAkB,GAC7C,KAAK,mBAAqB,SAClBnc,EAAG,CACP,OAAO,KACV,OAAO,IAAI,YACV,KAAK,UAAU,CACd,QAAS,QACT,QAAS,KAAK,QAAQ,SAAS,wCAAwC,EACvE,EACD,KAGF,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,wCAAwC,EACrE,QAAUA,EAAY,QACtB,KAAM,QACN,CACF,MACUmc,GAAA,YAAAA,EAAM,WAAY,uBACvB,oBAAe,wBAA0BA,EAAK,gBAEzC,CAAC,CACd,EACA,MAAM,0BAA0BlV,EAAmB,CAClD,MAAM,KAAK,mBAAmBA,EAAK,KAA6B,MAAM,CACvE,EACA,MAAM,yBAAyBA,EAAmB,CACjD,MAAMoyB,EAAe,MAAM,KAAK,uBAAuBpyB,EAAK,GAAa,EACrEoyB,IAAiB,QACd,WAAK,mBAAmBA,EAAc,KAAK,CAEnD,EACA,sBAAsB3yB,EAAmB,CACxC,OAAO,KAAKA,CAAO,EAAE,QAAS5F,GAAa,OAC1C,MAAMvD,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACvD,GAAI,CAACvD,EACJ,SAImB0B,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CACjD,OAAQ1B,EAAK,MAGF,QAASwiC,GAAe,CACnCoG,GAAyCpG,EAAY,CACpD,MAAOr5B,EAAQ5F,CAAQ,EAAE,OACzB,WAAY,EACZ,EACD,EACD,CACF,EACA,yBAAyB4F,EAAmB,CAC3C,OAAO,KAAKA,CAAO,EAAE,QAAS5F,GAAa,OAC1C,MAAMvD,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACvD,GAAI,CAACvD,EACJ,OAIK,MAAAs9B,GAAc57B,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CACjD,OAAQ1B,EAAK,KAGT,cAAS,kBAAkB,EAAI,EACxBs9B,EAAA,QAAQwG,EAA6B,EAC5C,cAAS,kBAAkB,GAAO,EAAI,EAC3C,CACF,EACA,oBAAoB,CAAE,OAAAj5B,EAAQ,iBAAAihC,EAAkB,gBAAAC,GAA6C,CAC5F,GAAID,IAAqB,KAAK,iBAAkB,OAE3CC,IACcA,EAAA,KAAK,gBACpBrY,GACA1C,IAIC,sBAAiB,gBAAgB+a,CAAe,EAErD,KAAK,iBAAmBD,EAEpB,IAAAE,EACI,YAAK,iBAAiB,aAAc,CAC3C,KAAK3Z,GACG2Z,EAAA,KACP,MACD,KAAKtY,GACGsY,EAAA,UACP,MACD,QACQA,EAAA,SACT,CAEIF,GAAuB,sBAAiB,cAAcjhC,CAAM,EAC3D,KAAK,cAAc,IAAI,mCAAoC,CAC/D,OAAAA,EACA,KAAAmhC,EACA,iBAAAF,CAAA,CACA,EACI,gBAAW,gBAAgB,mCAAoC,CACnE,OAAAjhC,EACA,KAAAmhC,EACA,iBAAAF,EACA,YAAa,KAAK,eAAe,WACjC,CACF,EACA,MAAM,WACL,CAAE,MAAAjsC,EAAO,YAAAy9B,CACT,EAAA2O,EAAc,GACdvrC,EACC,CACD,IAAIwrC,EAAkBxrC,EACX,UAAE,KAAAsd,EAAM,UAAA+iB,EAAW,KAAArvB,EAAM,WAAAy6B,EAAY,SAAUC,KAAkBvsC,EAAO,CAClF,MAAM,KAAK,QACVme,EACA,CAAE,SAAUouB,GAAgBF,EAAiB,YAAAD,EAAa,KAAAv6B,CAAK,EAC/Dy6B,GAAc,GACd,GACApL,CAAA,EAGD,MAAMsL,EAAgB,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,EACpCH,EAAA,CACjBG,EAAc,SAAS,CAAC,EAAIvM,GAA0B,EAAInE,GAC1D0Q,EAAc,SAAS,CAAC,EAE1B,CAEA,MAAMC,EAAiB,KAAK,MAAM,OAASzsC,EAAM,OACjD,SAAW,CAAE,KAAAo6B,EAAM,GAAAD,CAAG,IAAKsD,EAAa,CACvC,MAAMiP,EAAW,KAAK,MAAMD,EAAiBrS,EAAK,SAAS,EACrDuS,EAAS,KAAK,MAAMF,EAAiBtS,EAAG,SAAS,EAElD,qBACJuS,EAAS,KACTtS,EAAK,aAAe,EACpBuS,EAAO,KACPxS,EAAG,YAAc,EACjBvwB,EAAmB,KAErB,CAEA,MAAM4iC,EAAgB,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,EAEhDI,EADW,KAAK,qBACU,sBAAsBJ,EAAc,KAAM,CAAC,EAGvEI,EAAe,OAAS,GAC3BA,EAAe,MAAM,CAAC,EAAE,QAAQ,CAACzsC,EAAM8I,IAAU,CAChD,MAAM4jC,EAAS,KAAK,eAAe,cAAc1sC,EAAK,IAAI,EACrD0sC,GAEL,KAAK,WAAW,CACf,SAAUA,EAAO,KACjB,SAAU,CAACA,EAAO,SAAS,CAAC,EAAGA,EAAO,SAAS,CAAC,EAAI,KAAO5jC,EAAQ,EAAE,EACrE,EACD,CAEH,EAEA,MAAM,4BAA4B6jC,EAAsB,CACvD,MAAM,KAAK,sBACAA,GAAA,MAAAA,GACZ,EACA,uCAAuCC,EAAkB,CACxD,KAAK,oCAAsCA,CAC5C,EACA,WAAW,CAAE,SAAArpC,EAAU,SAAA7C,GAA8D,CAC/E,oBAAe,qBAAqB,CAAE,KAAM6C,EAAU,WAAY,CAAE,SAAA7C,CAAS,EAAG,EACrF,MAAMV,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACvD,WAAW,IAAM,OACZvD,KACH0B,EAAA,KAAK,WAAL,MAAAA,EAAe,oBACf,KAAK,YAAY1B,CAAI,IAEpB,CAAC,CACL,EACA,gBAAgB,CAAE,KAAAA,GAAiC,CAC7C,gBAAWA,EAAK,KAAM,EAAK,CACjC,EACA,MAAM,mBAAmB,CAAE,KAAAA,GAA0C,CACnD,KAAK,eAAe,SAAS,MAAM,KAAMoF,GAAMA,EAAE,KAAOpF,EAAK,EAAE,IAMhFA,EAAK,GAAKe,KACV,MAAM,KAAK,SAAS,CAACf,CAAI,CAAC,EAC3B,EACA,sBAAsB,CAAE,WAAAwiC,GAA0D,CACjF,KAAK,oCAAsC,GACtC,wBAAmBA,EAAY,EAAI,EACxC,KAAK,oCAAsC,EAC5C,EACA,MAAM,yBAAyB,CAAE,WAAAA,GAA0D,CAC1F,KAAK,oCAAsC,GAC3C,KAAK,gBAAgBA,CAAU,EAC/B,KAAK,oCAAsC,EAC5C,EACA,MAAM,mBAAmB,CAAE,YAAAgH,EAAa,QAAAI,GAAqD,CACtF,WAAK,WAAWA,EAASJ,CAAW,CAC3C,EACA,qBAAqB,CAAE,SAAAjmC,EAAU,WAAAspC,GAAyD,CACzF,MAAM7sC,EAAO,KAAK,eAAe,cAAcuD,CAAQ,EACnDvD,GACH,KAAK,YAAY,aAAa,CAACA,CAAI,CAAC,CAEtC,EACA,WAAW,EAAwB,CAE9B,EAAE,WACL,KAAK,YAAY,CAEnB,EACA,uBAAwB,CAEtB,KAAK,aACL,CAACkjB,EAAM,aAAcA,EAAM,eAAe,EAAE,SAAS,KAAK,OAAO,IAAI,GAEhE,KAAK,UAAU,SAAY,CAC/B,KAAK,eAAe,EACpB,KAAK,QAAQ,aAAe,GAE5B,MAAM,KAAK,QAAQ,QAAQ,CAAE,KAAMA,EAAM,UAAW,EACpD,CAEH,EACA,MAAM,uBAAwB,CACzB,KAAK,OAAO,OAASA,EAAM,kBACzB,cAAS,KAAK,aAAc,OAAO,EACnC,KAAK,eAAe,gBACxB,MAAM,KAAK,mBAAmB,KAAK,OAAO,OAAO,WAAqB,EACtE,KAAK,eAAe,cAAgB,IAGvC,EACA,oBAAoB5c,EAA2BzG,EAAsB,CACpE,OAAQyG,EAAQ,CACf,IAAK,OACJ,KAAK,UAAUzG,CAAK,EACpB,MACD,IAAK,SACJ,KAAK,YAAYA,CAAK,EACtB,MACD,IAAK,YACC,KAAK,eAAeA,CAAK,EAC9B,MACD,IAAK,UACJ,KAAK,UAAUA,EAAM,CAAC,EAAE,KAAM,8BAA8B,EAC5D,MACD,IAAK,OACJ,KAAK,SAAS,eAAiBA,EAAM,CAAC,EAAE,KACxC,MACD,IAAK,SACC,KAAK,iBAAiBA,EAAM,CAAC,EAAE,IAAI,EACxC,MACD,IAAK,oBACJ,KAAK,sBAAsBA,CAAK,EAChC,MACD,IAAK,aACC,oBAAeA,EAAO,cAAc,EACzC,MACD,IAAK,WACJ,KAAK,oBAAoB,CACxB,OAAQ+7B,GAA0B,aAClC,iBAAkB,CAAC,KAAK,iBAAmB,CAAC,KAAK,YACjD,EACD,MACD,IAAK,aACC,KAAK,WAAW,CAAE,MAAO,CAAC,CAAE,KAAM51B,GAAkB,EAAG,YAAa,EAAI,GAC7E,MACD,IAAK,aACJ,KAAK,eAAe,EACpB,MACD,IAAK,eACJ,KAAK,iBAAiB,EACtB,KACF,CACD,CACD,EACA,MAAM,qBAAsB,CAC3B,IAAIwhC,EAAa,KACb,KAAK,OAAO,OAAO,OACTA,EAAA,KAAK,OAAO,OAAO,MAG7B,IAGH,GAFA,MAAM,QAAQ,IAAI,CAAC,KAAK,gBAAgB,EAAG,KAAK,gBAAiB,KAAK,UAAU,UAAU,CAAC,EAEvFA,IAAe,MAAQ,CAAC,KAAK,QAAQ,aAAc,CACtD,MAAMp9B,EACL,MAAM,KAAK,eAAe,cAAco9B,CAAU,EAC/Cp9B,IACE,cAASA,EAAS,KAAM,MAAM,EAC7B,WAAK,aAAaA,CAAQ,EAElC,QACQT,EAAO,CACf,QAAQ,MAAMA,CAAK,CACpB,CACD,EACA,MAAM,SAAU,OACf,KAAK,eAAe,EACpB,KAAK,YAAY,aAAa,KAAK,MAAM,QAAuB,EAChE,KAAK,WAAW,EACT,wBAAiB,UAAW,KAAK,qBAAqB,EAE7D,KAAK,aAAa,EAClB,MAAMmjC,EAAe,CACpB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,YAAY,GAGd,KAAK,eAAe,aAAa,SAAW,GAClCA,EAAA,KAAK,KAAK,cAAe,GAGnC,IACG,cAAQ,IAAIA,CAAY,QACtBnjC,EAAO,CACV,eACJA,EACA,KAAK,QAAQ,SAAS,mCAAmC,EACzD,KAAK,QAAQ,SAAS,qCAAqC,EAAI,KAEhE,MACD,CAgCA,GA9BAojC,GAAM,SAAY,CACb,IACC,IACH,KAAK,iBAAiB,OACf,CAAC,CACT,MAAM,KAAK,WACP,OAAO,QACV,OAAO,OAAO,YACb,KAAK,UAAU,CAAE,QAAS,WAAY,QAAS,KAAK,UAAU,WAAY,EAC1E,WAGMpjC,EAAO,CACV,eACJA,EACA,KAAK,QAAQ,SAAS,mCAAmC,EACzD,KAAK,QAAQ,SAAS,qCAAqC,EAAI,IAEjE,CACA,KAAK,YAAY,EAEjB,WAAW,IAAM,CACX,KAAK,WAAW,4BACrB,KAAK,sBAAsB,KAAK,eAAe,YAAe,CAAe,IAC3E,CAAC,EACJ,EAGI,KAAK,cAAc,IAAI,gBAAgB,EAAE,MAAOlH,GAAM,EAAE,IAG5Df,EAAA,KAAK,cAAL,YAAAA,EAAkB,0BAA2B,MAC7C,KAAK,cAAc,6BACnB,KAAK,aACLsrC,GAAc,KAAK,WAAW,GAAKC,GAClC,CACD,MAAMC,EAAqB,MAAM,KAAK,QAAQ,wBAAwB,EAChEC,EACLD,EAAmB,wBAA0B,EAAIE,GAAkC,IAEhFF,EAAmB,OAASA,EAAmB,aAClD,WAAW,SAAY,CACtB,KAAK,UAAU,CACd,KAAM,OACN,MAAOA,EAAmB,MAC1B,QAASA,EAAmB,YAC5B,SAAU,EACV,YAAa,YACb,aAAc,GACd,QAAS,IAAM,CACT,gBAAW,MAAM,gCAAiC,CACtD,QAASA,EAAmB,sBAC5B,MAAOA,EAAmB,MAC1B,YAAaA,EAAmB,YAChC,EACI,aAAQ,UAAUG,EAAgC,CACxD,EACA,GACCF,CAAa,CAElB,CAEsBG,GAAA,GAAG,OAAQ,KAAK,mBAAmB,EAEzD,KAAK,qBAAqB,CACzB,IAAK,iBACL,OAAQ,CAAC,CAAE,KAAAttC,KAA6B,CAClC,wBAAmBA,EAAM,EAAI,CACnC,EACA,EAED,KAAK,qBAAqB,CACzB,IAAK,2BACL,OAAQ,MAAO,CACd,eAAAutC,EACA,KAAAvtC,EACA,YAAAwtC,CAAA,IAKK,CACC,MAAAjqC,EAAWvD,GAAQ,KAAK,SAAS,eACjCyD,EAAWF,EAAW,KAAK,eAAe,cAAcA,CAAQ,EAAI,KAE1E,KAAK,SAAS,eAAiB,KACzB,WAAK,WAAWvD,CAAI,EAE1B,WAAW,IAAM,CACZwtC,EACH,KAAK,oBAAoB,CACxB,iBAAkB,GAClB,gBAAiBA,CAAA,CACjB,EACSD,GAAkB9pC,GAC5B,KAAK,wBAAwB,CAC5B,MAAO,EACP,aAAc,GAAGA,EAAS,EAAE,SAAS8pC,CAAc,IACnD,YAAa3R,GAA0B,qBACvC,WAAY2R,EACZ,SAAU9pC,EAAS,GACnB,GAEA,CAAC,CACL,EACA,EAED,KAAK,sBAAsB,EACtB,iBAAY,OAAS,KAAK,MAChC,EACA,WAAY,CACU,KAAK,QAAQ,oBAE5B,wBAAmBm4B,GAA0B,0BAA0B,EAE7E,KAAK,QAAQ,mBAAqB,GAClC,KAAK,iBAAiB,EACb,0BAAiB,UAAW,KAAK,OAAO,EACxC,0BAAiB,QAAS,KAAK,KAAK,EACtC,wBAAiB,UAAW,KAAK,qBAAqB,EACtD,wBAAiB,WAAY,KAAK,UAAU,EAElCyB,GAAA,GAAG,cAAe,KAAK,WAAW,EAClCA,GAAA,GAAG,qBAAsB,KAAK,yBAAyB,EACvDA,GAAA,GAAG,oBAAqB,KAAK,wBAAwB,EACrDA,GAAA,GAAG,WAAY,KAAK,UAAU,EACpCoQ,GAAA,GAAG,WAAY,KAAK,UAAU,EAC9BA,GAAA,GAAG,gBAAiB,KAAK,eAAe,EACxCA,GAAA,GAAG,mBAAoB,KAAK,kBAAkB,EAC9CA,GAAA,GAAG,sBAAuB,KAAK,qBAAqB,EACpDA,GAAA,GAAG,yBAA0B,KAAK,wBAAwB,EAC1DA,GAAA,GAAG,mBAAoB,KAAK,kBAAkB,EAC9CA,GAAA,GAAG,mBAAoB,KAAK,oBAAoB,EAEvC/vB,GAAA,GAAG,WAAY,KAAK,qBAAqB,EACzCA,GAAA,GAAG,aAAc,KAAK,wBAAwB,EACjD2f,GAAA,GAAG,eAAgB,KAAK,2BAA2B,EAE/D,iBAAY,OAAS,KAAK,MAChC,EACA,aAAc,CACb,KAAK,mBAAmB,EACf,6BAAoB,UAAW,KAAK,OAAO,EAC3C,6BAAoB,QAAS,KAAK,KAAK,EACzC,2BAAoB,UAAW,KAAK,qBAAqB,EACzD,2BAAoB,eAAgB,KAAK,cAAc,EACvD,2BAAoB,WAAY,KAAK,UAAU,EAErCA,GAAA,IAAI,cAAe,KAAK,WAAW,EACnCA,GAAA,IAAI,qBAAsB,KAAK,yBAAyB,EACxDA,GAAA,IAAI,oBAAqB,KAAK,wBAAwB,EACtDA,GAAA,IAAI,WAAY,KAAK,UAAU,EACrCoQ,GAAA,IAAI,WAAY,KAAK,UAAU,EAC/BA,GAAA,IAAI,gBAAiB,KAAK,eAAe,EACzCA,GAAA,IAAI,mBAAoB,KAAK,kBAAkB,EAC/CA,GAAA,IAAI,sBAAuB,KAAK,qBAAqB,EACrDA,GAAA,IAAI,yBAA0B,KAAK,wBAAwB,EAC3DA,GAAA,IAAI,mBAAoB,KAAK,kBAAkB,EAC/CA,GAAA,IAAI,mBAAoB,KAAK,oBAAoB,EAExC/vB,GAAA,IAAI,WAAY,KAAK,qBAAqB,EAC1CA,GAAA,IAAI,aAAc,KAAK,wBAAwB,EAClD2f,GAAA,IAAI,eAAgB,KAAK,2BAA2B,CACtE,EACA,aAAc,CACR,KAAK,QACT,KAAK,UAAU,aAEjB,EACA,eAAgB,CAGN,6BAAoB,UAAW,KAAK,OAAO,EAC3C,6BAAoB,QAAS,KAAK,KAAK,EAChD,KAAK,uBAAuB,iBAAiB,EAC7C,KAAK,uBAAuB,gBAAgB,EAC5C,KAAK,uBAAuB,0BAA0B,EAEjD,KAAK,QACT,KAAK,UAAU,iBAGhB,KAAK,eAAe,EACpB,KAAK,SAAS,SACd,KAAK,SAAS,UACd,KAAK,QAAQ,aAAe,GACrB,2BAAoB,UAAW,KAAK,qBAAqB,EAC/CA,GAAA,IAAI,cAAe,KAAK,WAAW,EACnCA,GAAA,IAAI,qBAAsB,KAAK,yBAAyB,EACxDA,GAAA,IAAI,oBAAqB,KAAK,wBAAwB,EAClE,oBAAe,cAAc/C,EAA6B,EACzCgT,GAAA,IAAI,OAAQ,KAAK,mBAAmB,CAC3D,CACD,CAAC,yFAnsJOl/B,GAAM,6RAhHbuc,GA6LM,6BA5LL,MA2LMnf,EAAAC,EAAA,oBAzLF,MAAgB,CACnB,qCACC,oBACA,eAAI,4BAAAC,EAAA,MAAAA,EAAA,QAAAC,IAAAF,EAAA,YAAAA,EAAA,cAAAE,CAAA,sBAEL,EA8EM,IAAAA,IAAAF,EAAA,QAAAA,EAAA,UAAAE,CAAA,KA3EOqI,GAAA1I,EAAA,EAAoBC,EAAA,OAC/B,QAAU,CAAE,oBAAAE,EAAA,kBACZ,eAAQ,oBACR,aAASC,EAAE,KAAAA,EAAA,OAAAC,IAAAF,EAAA,WAAAA,EAAA,aAAAE,CAAA,GACX,WAASD,EAAE,KAAAA,EAAA,OAAAC,IAAAF,EAAA,SAAAA,EAAA,WAAAE,CAAA,GAEX,YAAOD,oBAAED,EAAO,uBAAAA,EAAA,yBAAAE,CAAA,GAChB,YAAWD,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAE,WAAWA,EAAK,UAAhB,GAAAE,CAAA,GACb,UAAKD,EAAA,KAAAA,EAAA,OAAAC,IAAEF,EAAY,SAAAA,EAAA,QAAW,GAAvBE,CAAA,iBAAAD,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,kBAAAA,EAAA,oBAAAE,CAAA,GAER,QAKED,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,yBAAAA,EAAA,2BAAAE,CAAA,KAHKK,EAAA,OACL,0BACD,mCAAA+I,GAAAtJ,EAAA,iBAED,uCACC,KAAG,GACcO,EAAA,OAChB,eACD,MAAI,YACJ,SAAaP,EAAW,8BAExB,+BAEOG,EAAE8hC,EAAA,CAEP,SAAcjiC,EAAmB,sBACjC,QAAQC,EAAE,KAAAA,EAAY,CAAuB,EAAAc,GAAAf,EAAA,mBAAAA,EAAA,uDAC9C,YAAI,CAAiBA,EAAA,iBAAAA,EAAA,0BACpB,SAAcA,EAAA,oCACf,uCAAAA,EAAA,iDALQ,iGAOT,CAAAmf,EAAAnf,EAAA,wBAEEH,EAAA,IAAAC,EAAkBkD,EAAgB,KAAAC,GAAAjD,EAAA,cAAAhI,IAClC6H,EAAA,EAAkCa,EAAAwhC,EAAA,CAClC,mBAAcliC,EAAA,iBACd,eAAaA,EAAA,qBACb,eAAOA,EAAA,mBACP,cAAKA,EAAA,UACL,QAAQA,EAAA,YACR,MAAMA,EAAA,UACN,IAAY,GAAAhI,EAAA,UACZ,KAAUA,EAAA,KACV,WAAYgI,EAAc,iBAAAA,EAAA,YAC1B,SAAaA,EAAA,SACb,yBAA8BA,EAA4B,kBAAAhI,EAAA,KAC1D,YAAUgI,EAAA,eACV,6BAAuBA,EAAA,6BACvB,SAAcA,EAAA,4CAAAA,EAAA,WAEJ,eAAcA,EAAA,iBAEvB,iBAAAM,EAAA,KAAAC,EAAA,kJAIH,iBAeE,iBAdoB,0BAAd,QAAU,qJAChBV,EAAA,IAAAC,EAAkBkD,EAAgB,KAAAC,GAAAjD,EAAA,iBAAAmiC,IAClCtiC,EAAA,EAAkCa,EAAA0hC,EAAA,CAClC,mBAAcpiC,EAAA,iBACd,eAAUA,EAAA,qBACV,eAAQA,EAAa,mBACrB,aAAMC,EAAe,KAAAA,EAAA,GAAAgG,GAAAjG,EAAA,WAAAiG,EAAA,KACrB,OAAQk8B,EAAE,YACV,KAAYA,EAAA,KACZ,SAAUniC,EAAA,sBACV,WAAYA,EAAc,iBAAAA,EAAA,YAC1B,SAAeA,EAAA,SACf,SAAU,CAAS,CAAAA,EAAA,YAAAA,EAAA,kBAAAmiC,EAAA,KACnB,cAAaniC,EAAA,uBAAAA,EAAA,0NAIjB,CASEqf,EAAArf,EAAA,oBAPUqiC,EAAc,CACxB,SAA8BriC,EAAA,iBAAAA,EAAA,YAC9B,SAAYA,EAAA,eACZ,6BAAoBA,EAAA,6BACpB,aAAYA,EAAE,WACd,qBAAeA,EAAA,qBACf,eAAAA,EAAA,6BAAAA,EAAA,qCAEFA,EAQW,sBADR,oKAAAH,MALqBkV,GAAK,MAD5B,QAAAzU,EAAA,MAAAN,EAAA,kBAAAA,EAAA,aAAAH,MAEsByiC,EAAgB,CACpC,MACA,qBAAmBtiC,EAAA,iBACnB,kBAAUA,EAAA,kCAAAA,EAAA,yJAIMU,EAAAqU,GAAA,cAAAzU,EAAA,oBAGlBT,IAAAa,EAA6CqU,GAA/B,cAAAzU,EAAA,iEAE8B,OAKpC,CAAAN,EAAA,kBAAAA,EAAgB,mBAJxB,MAqBO2C,GAAA,CAAA3C,EAAA,iBAGAiI,EADP,GAQE,KAVKpI,EAAA,EApBKC,EAAA,QACV,MACA,aAAKG,EAAE,KAAAA,EAAA,GAAAc,GAAAf,EAAA,2CAAAC,EAAA,MAAAA,EAAA,IAAAc,GAAAf,EAAA,8BAGR,QAc4BC,EAAA,MAAAA,EAAA,QAAAC,IAAAF,EAAA,qBAAAA,EAAA,uBAAAE,CAAA,OAZhBqiC,EAA8B,OAAAviC,EAAA,cAWvC,2CARAM,EAAK,KAAAH,EACIa,EAAe,CACxB,QAAOJ,GAAaZ,EAAA,wBACrB,QAAKA,EAAO,gBACZ,MAAKA,EAAA,cACL,KAAK,QACJ,mBACD,wBAAAA,EAAA,kIAMI,OAOLA,EAAA,mBAAAH,MANYmB,EAAU,CACvB,IAAK,EACL,QAAKJ,GAAOZ,EAAA,qBACZ,MAAK,OACL,KAAK,QACL,mEAIM,mBAAe,MADtB,GAcE,IAAAA,EAAA,uBAAAA,EAAA,4BAAAH,EAAA,EAZUa,EAAA+O,EAAA,CACX,IAAI,EACJ,KAAK,OACL,KAAK,QACJ,MAAK,iBAAS,iBAAiC,MAAAzP,EAA+D,wBAK9GA,EAAA,sDAAAA,EAAA,iBAAS,+BAAuB,EAEjC,QAAYA,EAAA,gCAAAY,GAAAZ,EAAA,gEAIS,0BAAa,eADnC,GASE,IAAAA,EAAA,sBAAAA,EAAA,iCAAAH,EAAA,EAPqBa,EAAA+O,EAAA,CACtB,IAAI,EACJ,MAAK,iBACJ,KAAK,OACN,KAAK,QACJ,MAAKzP,mBAAO,oCAAqB,EAClC,yBAAAY,GAAAZ,EAAA,yHAIciI,EAAe,OAAgC,CAA4BjI,EAAA,kBAAAA,EAAA,aAAAA,EAA0B,mBAO3G,CAAAA,EAAA,kBAAAA,EAAA,qBAAAH,EAAA,EAAAa,EAAQ+O,EAAQ,CACxB,IAAI,EACJ,MAAKzP,EAAO,4DACX,aACD,qBAAAY,GAAAZ,EAAA","names":["deviceSupportHelpers","defineComponent","moveNodeWorkflow","mapStores","useUIStore","offsetPosition","x","y","getMousePosition","nodeViewOffsetPositionX","nodeViewOffsetPositionY","moveButtonPressed","useCanvasStore","defineStore","workflowStore","useWorkflowsStore","nodeTypesStore","useNodeTypesStore","uiStore","historyStore","useHistoryStore","sourceControlStore","useSourceControlStore","jsPlumbInstanceRef","ref","isDragging","lastSelectedConnection","newNodeInsertPosition","nodes","computed","triggerNodes","node","START_NODE_TYPE","isDemo","nodeViewScale","canvasAddButtonPosition","readOnlyEnv","watch","readOnly","setRecenteredCanvasAddButtonPosition","offset","position","getMidCanvasPosition","PLACEHOLDER_TRIGGER_NODE_SIZE","getNewNodePosition","getPlaceholderTriggerNodeUI","uuid","DEFAULT_PLACEHOLDER_TRIGGER_BUTTON","getNodesWithPlaceholderNode","canvasPositionFromPagePosition","sidebarWidth","SIDEBAR_WIDTH","SIDEBAR_WIDTH_EXPANDED","relativeX","relativeY","setZoomLevel","zoomLevel","_a","resetZoom","scale","scaleReset","zoomIn","scaleBigger","zoomOut","scaleSmaller","zoomToFit","getZoomToFit","wheelMoveWorkflow","deltaX","deltaY","shiftKeyPressed","wheelScroll","e","normalizeWheelEventDelta","scaleFactor","getScaleFromWheelEventDelta","applyScale","initInstance","container","newInstance","CONNECTOR_FLOWCHART_TYPE","CONNECTOR_PAINT_STYLE_DEFAULT","CONNECTOR_PAINT_STYLE_PRIMARY","CONNECTOR_ARROW_OVERLAYS","GRID_SIZE","params","nodeName","isSelected","nodeData","moveNodes","newNodePosition","element","updateInformation","oldPosition","MoveNodeCommand","pos","jsPlumbInstance","isOpen","target","actions","actionCallback","useContextMenu","onAction","workflowsStore","getInputDataWithPinned","useDataSchema","i18n","useI18n","isReadOnly","targetNodes","selectedNodes","currentTarget","canAddNodeOfType","nodeType","sameTypeNodes","n","canDuplicateNode","NOT_DUPLICATABE_NODE_TYPES","canPinNode","dataToPin","PIN_DATA_NODE_TYPES_DENYLIST","hasPinData","close","open","event","menuTarget","onlyStickies","STICKY_NODE_TYPE","i18nOptions","selectionActions","menuActions","singleNodeActions","_dispatchAction","action","useCanvasMouseSelect","selectActive","selectBox","isTouchDevice","isCtrlKeyPressed","useDeviceSupport","canvasStore","isContextMenuOpen","_setSelectBoxStyle","styles","_showSelectBox","getMousePositionWithinNodeView","_updateSelectBox","selectionBox","_getSelectionBox","_hideSelectBox","_getNodesInSelection","returnNodes","_createSelectBox","mouseUpMouseSelect","_mouseMoveSelect","deselectAllNodes","nodeSelected","mouseDownMouseSelect","mousePosition","nodeViewOffsetPosition","getRelativePosition","nodeDeselected","instance","onMounted","useUniqueNodeName","numberSuffixedNames","acc","uniqueNodeName","originalName","extraNames","canvasNames","nsn","unique","index","remainder","lastChar","match","_b","pinData","useToast","useNDVStore","outputTypes","NodeHelpers.getConnectionTypes","output","NodeConnectionType","data","error","title","toRemove","message","positionMatchRegEx","positionMatch","lineBreaksUpToPosition","activeNodeName","currentPinData","workflow","workflowJson","jsonStringify","newPinData","newPinDataSize","MAX_PINNED_DATA_SIZE","stringSizeInBytes","MAX_WORKFLOW_SIZE","MAX_EXPECTED_REQUEST_SIZE","source","jsonParse","telemetryPayload","useExternalHooks","errorType","_sfc_main$o","NodeIcon","inputRef","_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_ctx","_cache","args","_createVNode","_component_NodeIcon","_component_n8n_popover","_withCtx","_createElementVNode","_createTextVNode","_toDisplayString","_createBlock","_component_font_awesome_icon","_withModifiers","_component_n8n_text","_component_n8n_input","$event","_component_n8n_button","_sfc_main$n","utmTags","primaryDocUrl","_d","_c","NPM_PACKAGE_DOCS_BASE_URL","BUILTIN_NODES_DOCS_URL","isCommunityPackageName","options","COMMUNITY_NODES_INSTALLATION_DOCS_URL","pushCogRight","tab","_component_n8n_tabs","_sfc_main$m","copyPaste","workflowHelpers","OPEN_URL_PANEL_TRIGGER_NODE_TYPES","webhookData","FORM_TRIGGER_NODE_TYPE","webhookUrl","_hoisted_1","_hoisted_3","_hoisted_5","_hoisted_7","_hoisted_12","_component_el_collapse_transition","_hoisted_2","_hoisted_4","_component_el_row","_component_el_col","_component_n8n_radio_buttons","_Fragment","_renderList","webhook","_component_n8n_tooltip","_hoisted_13","_hoisted_6","_hoisted_9","_sfc_main$l","workflowRun","props","ctx","useMessage","triggeredNode","MANUAL_TRIGGER_NODE_TYPE","WEBHOOK_NODE_TYPE","waitingOnWebhook","executedNode","activeNode","shouldUnpinAndExecute","MODAL_CONFIRM","_mergeProps","_sfc_main$k","NodeTitle","NodeCredentials","ParameterInputList","NodeSettingsTabs","NodeWebhooks","NodeExecuteButton","nodeHelpers","useNodeHelpers","useCredentialsStore","useWorkflowsEEStore","IMPORT_CURL_MODAL_KEY","workflowNode","inputs","NodeHelpers.getNodeInputs","shortNodeType","item","credential","nodeCredential","CUSTOM_NODES_DOCS_URL","MAIN_NODE_PANEL_WIDTH","newNode","oldNode","newValue","oldValue","parameters","parameter","parameterName","name","value","nameParts","lastNamePart","isArray","lastNameParts","removedNodeValue","remainingNodeValues","tempValue","get","removedArrayNodeValue","remainingArrayNodeValues","set","deepCopy","RenameNodeCommand","parameterData","nodeNameBefore","sendData","nodeParameters","NodeHelpers.getNodeParameters","oldNodeParameters","parameterPath","parameterPathArray","path","unset","key","foundNodeSettings","nodeSetting","_hoisted_8","_hoisted_10","_hoisted_11","_component_NodeTitle","_createCommentVNode","_component_NodeExecuteButton","_component_NodeSettingsTabs","_component_i18n_t","_component_n8n_link","_component_n8n_notice","_withDirectives","_component_node_webhooks","_component_parameter_input_list","_component_node_credentials","_sfc_main$j","draggablePosition","activeElement","_sfc_render","$props","$setup","$data","$options","_resolveDynamicComponent","_renderSlot","_Teleport","_normalizeStyle","_sfc_main$i","Draggable","_component_Draggable","moveNodeDirection","direction","matchedDirectionNode","connectedNodes","emit","onKeyDown","matchingDirection","getINodesFromNames","names","rootName","connectionGroups","tooltipPositionMapper","onBeforeUnmount","__expose","SIDE_MARGIN","SIDE_PANELS_MARGIN","MIN_PANEL_WIDTH","PANEL_WIDTH","PANEL_WIDTH_LARGE","initialMainPanelWidth","_sfc_main$g","debounceHelper","PanelDragButton","NDVFloatingNodes","ndvEventBus","supportedDirections","hasInput","outputPanelRelativeLeft","panelMinLeft","currentRelativeLeftDelta","multiplier","minRelativeWidth","windowWidth","isBelowMinLeft","isMaxRight","width","relativeWidth","mainPanelRelativeWidth","relativeLeft","mainPanelRelativeLeft","mainPanelRelativeRight","isMinLeft","isInputless","positionByName","px","relativeDistance","storedPanelWidthData","useStorage","LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH","parsedWidth","initialPosition","_component_NDVFloatingNodes","_component_n8n_resize_wrapper","_component_PanelDragButton","sanitizeOptions","defaults","_sfc_main$f","sanitizeHtml","_sfc_main$e","VueJsonPretty","RunDataHtml","id","fileName","fileType","mimeType","isJSONData","isHTMLData","binaryUrl","fetchedData","_component_vue_json_pretty","_component_run_data_html","_sfc_main$d","BinaryDataDisplayEmbed","binaryData","workflowExecution","executionData","_component_BinaryDataDisplayEmbed","_sfc_main$c","MAX_DISPLAY_DATA_SIZE","parameterFullName","baseErrorMessage","fullPath","pathParts","currentParameterName","arrayMatch","currentParameter","_hoisted_16","_hoisted_18","_hoisted_21","_hoisted_22","_component_el_card","_hoisted_14","_hoisted_15","_hoisted_17","_hoisted_19","_component_n8n_icon_button","_hoisted_23","_hoisted_24","RunDataTable","defineAsyncComponent","__vitePreload","RunDataJson","RunDataSchema","RunDataHtml$2","RunDataSearch","_sfc_main$b","genericHelpers","BinaryDataDisplay","NodeErrorView","CodeNodeEditor","externalHooks","MAX_DISPLAY_ITEMS_AUTO_ALL","DATA_PINNING_DOCS_URL","DATA_EDITING_DOCS_URL","inputName","schemaView","isEmpty","HTML_NODE_TYPE","runData","taskData","pinOrLiveData","executionDataToJson","capitalize","branches","i","totalItemsCount","itemsCount","items","outputName","appendBranchWord","NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND","NodeHelpers.getNodeOutputs","itemIndex","pinDataDiscoveryFlag","LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG","dataPinningEventBus","LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG","origin","inputData","clearJsonKey","TEST_PIN_DATA","type","pageSize","maxPage","displayMode","previous","dataContainerRef","dataDisplay","option","itemsLabel","runIndex","outputIndex","connectionType","json","searchInObject","rawInputData","outputs","fileExtension","url","saveAs","bufferString","blob","d","outputConfiguration","isObject","jsonItems","run","newData","prevData","branchIndex","newSearch","_component_n8n_callout","_component_BinaryDataDisplay","_createSlots","_component_n8n_select","_component_n8n_option","_component_run_data_search","_component_n8n_spinner","_component_code_node_editor","_component_n8n_info_tip","_component_NodeErrorView","_Suspense","_component_run_data_table","_component_run_data_json","_component_run_data_schema","binaryDataEntry","_component_el_pagination","size","_component_n8n_block_ui","_sfc_main$a","OUTPUT_TYPE","_sfc_main$9","RunData","RunInfo","RunDataAi","resultData","updatedAt","runAt","runDataRef","outputMode","_component_RunData","_component_RunInfo","_component_run_data_ai","_sfc_main$7","WireMeUp","toIgnore","CRON_NODE_TYPE","INTERVAL_NODE_TYPE","input","executingNode","search","val","connectedInputs","inputIndex","truncated","curr","prev","_component_WireMeUp","_sfc_main$6","CopyInput","createEventBus","getTriggerNodeServiceName","serviceName","VIEWS","WORKFLOW_SETTINGS_MODAL_KEY","_Transition","_component_n8n_pulse","_component_CopyInput","_component_n8n_heading","_component_n8n_info_accordion","_sfc_main$5","workflowActivate","NodeSettings","InputPanel","OutputPanel","NDVDraggablePanels","TriggerPanel","useSettingsStore","isWebhookBasedNode","isPollingNode","override","outgoingConnections","parentNodeName","EXECUTABLE_TRIGGER_NODE_TYPES","BASE_NODE_SURVEY_URL","credentials","usedCredentials","foreignCredentials","EnterpriseEditionFeature","isTooltipVisible","pane","nodeTypeName","_component_el_dialog","_component_n8n_icon","_component_NDVDraggablePanels","_component_OutputPanel","_component_NodeSettings","_component_TriggerPanel","_component_InputPanel","contextMenu","dropdown","onActionSelect","onVisibleChange","createAddInputEndpointSpec","connectionName","color","multiple","NODE_CONNECTION_TYPE_ALLOW_MULTIPLE","createDiamondOutputEndpointSpec","nodeBase","endpoint","canvas","nodeTypeData","rootTypeIndexData","typeIndexData","sortedInputs","b","inputConfiguration","rootCategoryInputName","rootTypeIndex","typeIndex","inputsOfSameRootType","thisInputName","nonMainInputs","requiredNonMainInputs","optionalNonMainInputs","spacerIndexes","anchorPosition","NodeViewUtils.getAnchorPosition","scope","NodeViewUtils.getEndpointScope","newEndpointData","NodeViewUtils.getInputEndpointUUID","NodeViewUtils.getInputEndpointStyle","NodeViewUtils.getScope","NodeViewUtils.getInputNameOverlay","leftGroupItemsCount","rightGroupItemsCount","insertSpacerBetweenGroups","NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS","minItemsCount","NODE_MIN_INPUT_ITEMS_COUNT","spacerIndex","maxLabelLength","outputConfigurations","endpointLabelLength","rootCategoryOutputName","outputsOfSameRootType","outputData","thisOutputName","NodeViewUtils.getOutputEndpointUUID","NodeViewUtils.getOutputEndpointStyle","overlaySpec","NodeViewUtils.getOutputNameOverlay","plusEndpointData","plusEndpoint","NO_OP_NODE_TYPE","createSupplementalConnectionType","_sfc_main$3","TitledList","FontAwesomeIcon","workflowResultDataNode","eventTriggerDescription","classes","otherOutputs","spacerCount","mainOutputs","nodeExecutionRunData","issues","executionRunData","NodeHelpers.nodeIssuesToString","lastNodeExecuted","waitDate","WAIT_TIME_UNLIMITED","returnStyles","borderColor","shouldShowTriggerTooltip","dataItemsCount","nodeSubtitle","CUSTOM_API_CALL_KEY","EnableNodeToggleCommand","_withScopeId","_pushScopeId","_popScopeId","_resolveDirective","_vShow","_component_titled_list","_directive_touch","_hoisted_20","_sfc_main$2","colorPopoverTrigger","forceActions","setForceActions","content","property","isString","isNumber","edit","link","isOnboardingNote","QUICKSTART_NOTE_NAME","isWelcomeVideo","height","dX","dY","_component_n8n_sticky","_","SEQUENTIAL_BONUS","SEPARATOR_BONUS","CAMEL_BONUS","FIRST_LETTER_BONUS","LEADING_LETTER_PENALTY","MAX_LEADING_LETTER_PENALTY","UNMATCHED_LETTER_PENALTY","fuzzyMatchSimple","pattern","patternIdx","strIdx","patternChar","targetChar","fuzzyMatch","fuzzyMatchRecursive","patternCurIndex","targetCurrIndex","targetMatches","matches","maxMatches","nextMatch","recursionCount","recursionLimit","outScore","recursiveMatch","bestRecursiveMatches","bestRecursiveScore","firstMatch","recursiveMatches","recursiveResult","recursiveScore","matched","penalty","unmatched","currIdx","prevIdx","neighbor","getValue","obj","prop","segments","result","sublimeSearch","filter","keys","results","accu","values","weight","v","itemMatch","a","transformNodeType","subcategory","createElement","uuidv4","CORE_NODES_CATEGORY","DEFAULT_SUBCATEGORY","subcategorizeItems","WHITE_LISTED_SUBCATEGORIES","AI_SUBCATEGORY","subcategories","category","sortNodeCreateElements","displayNameA","displayNameB","searchNodes","searchFilter","trimmedFilter","flattenCreateElements","groupItemsInSections","sections","itemsBySection","section","s","useNodeCreatorStore","STORES","selectedView","TRIGGER_NODE_CREATOR_VIEW","mergedNodes","showScrim","openSource","allNodeCreatorNodes","setMergeNodes","setActions","setShowScrim","isVisible","setSelectedView","view","setOpenSource","nodeCreatorStore","containerCssVars","getAiNodesBySubcategory","AIView","_nodes","chainNodes","AI_CATEGORY_CHAINS","agentNodes","AI_CATEGORY_AGENTS","AI_NODE_CREATOR_VIEW","AI_OTHERS_NODE_CREATOR_VIEW","AINodesView","getAISubcategoryProperties","nodeConnectionType","AI_CATEGORY_DOCUMENT_LOADERS","AI_CATEGORY_LANGUAGE_MODELS","AI_CATEGORY_MEMORY","AI_CATEGORY_OUTPUTPARSER","AI_CATEGORY_RETRIEVERS","AI_CATEGORY_TEXT_SPLITTERS","AI_CATEGORY_TOOLS","AI_CATEGORY_EMBEDDING","AI_CATEGORY_VECTOR_STORES","AI_UNCATEGORIZED_CATEGORY","TriggerView","EMAIL_IMAP_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE","OTHER_TRIGGER_NODES_SUBCATEGORY","RegularView","REGULAR_NODE_CREATOR_VIEW","RSS_READ_NODE_TYPE","EMAIL_SEND_NODE_TYPE","TRANSFORM_DATA_SUBCATEGORY","SET_NODE_TYPE","CODE_NODE_TYPE","DATETIME_NODE_TYPE","FILTER_NODE_TYPE","REMOVE_DUPLICATES_NODE_TYPE","SPLIT_OUT_NODE_TYPE","LIMIT_NODE_TYPE","SUMMARIZE_NODE_TYPE","AGGREGATE_NODE_TYPE","MERGE_NODE_TYPE","MARKDOWN_NODE_TYPE","XML_NODE_TYPE","CRYPTO_NODE_TYPE","FLOWS_CONTROL_SUBCATEGORY","IF_NODE_TYPE","SPLIT_IN_BATCHES_NODE_TYPE","FILES_SUBCATEGORY","HELPERS_SUBCATEGORY","HTTP_REQUEST_NODE_TYPE","KEYBOARD_ID_ATTR","WATCHED_KEYS","useKeyboardNavigation","selectableItems","activeItemId","keysHooks","getItemType","getElementId","refreshSelectableItems","resolve","cleanupSelectableItems","el","executeKeyHooks","keyboardKey","activeItem","hook","pressedKey","activeItemIndex","isArrowDown","isArrowUp","nextItemIndex","setActiveItem","previousIndex","setActiveItemId","itemId","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","registerKeyHook","getActiveItemIndex","useViewStacks","viewStacks","activeStackItems","stack","extendItemsWithUUID","searchBaseItems","searchBase","activeViewStack","flatBaselineItems","activeViewStackMode","globalSearchItemsDiff","allNodes","itemsBySubcategory","gotoCompatibleConnectionView","isOutput","nodesByConnectionType","relatedAIView","nextTick","pushViewStack","AI_CODE_NODE_TYPE","displayNode","setStackBaselineItems","stackItems","itemsInSubcategory","matchedNodes","updateCurrentViewStack","newStackUuid","popViewStack","currentStack","matchedIndex","typedKey","resetViewStacks","NodeCreation","CanvasControls","_sfc_main","NodeDetailsView","Node","Sticky","CanvasAddButton","KeyboardShortcutTooltip","ContextMenu","locale","dataSchema","useGlobalLinkActions","useTitleChange","useExecutionDebugging","err","vm","info","to","from","currentTab","getNodeViewTab","nodeViewNotInitialized","workflowChanged","PLACEHOLDER_EMPTY_WORKFLOW_ID","isOpeningTemplate","MAIN_HEADER_TABS","previousDirtyState","containsTrigger","newScale","elementRef","next","confirmModal","MODAL_CANCEL","useTagsStore","useRootStore","useTemplatesStore","useUsersStore","useEnvironmentsStore","useExternalSecretsStore","useCollaborationStore","usePushConnectionStore","NodeViewUtils.getBackgroundStyles","returnClasses","MANUAL_CHAT_TRIGGER_NODE_TYPE","NodeViewUtils.GRID_SIZE","NODE_CREATOR_OPEN_SOURCES","WORKFLOW_LM_CHAT_MODAL_KEY","workflowData","TelemetryHelpers.generateNodesGraph","N8nAddInputEndpointType","n8nAddInputEndpoint","nodeIssues","managedNode","endpoints","notice","saved","executionId","nodeErrorFound","errorCheck","NodeViewUtils.getFixedNodesList","templateId","selectedExecution","tags","tagIds","tag","ctrlModifier","shiftModifier","ctrlAltModifier","noModifierKeys","lastSelectedNode","nodeViewEventBus","connections","parentNode","connectionsParent","siblingNode","lastCheckedNodePosition","nextSelectNode","ouputConnections","ouputConnection","nextStatePinned","checkNodes","sourceNodeName","margin","recordHistory","sourceNode","deleteCopiedNodes","isCut","workflowToCopy","execution","executedData","pushData","trackProps","plainTextData","importTags","nodeIdMap","UPDATE_WEBHOOK_ID_NODE_TYPES","newId","currInstanceId","nodeGraph","NodeViewUtils.getNewNodePosition","tagsEnabled","allTags","tagNames","workflowTags","notFound","creatingTagPromises","creationPromise","imported","dropData","DRAG_EVENT_DATA_KEY","insertNodePosition","NodeViewUtils.NODE_SIZE","setActive","deselectAllOthers","maxNodes","overrides","nodeVersion","newNodeData","credentialPerType","defaultCredential","selectedCredentials","selected","authentication","authDisplayOptions","displayOption","optionValue","showDetail","trackHistory","isAutoAdd","diffX","NodeViewUtils.getConnectorLengths","NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES","NodeViewUtils.PUSH_NODES_OFFSET","yOffset","sourceNodeType","offsets","sourceNodeOutputs","sourceNodeOutputMainOutputs","sourceOutputIndex","lastSelectedNodeType","lastSelectedNodeWorkflow","lastSelectedInputs","scopedConnectionIndex","inputType","inputsTypes","pushOffset","localizedName","useSegment","trackProperties","sourceNodeOutputIndex","targetNodeName","targetNodeOuputIndex","nodeConnections","connection","targetNodeOutputIndex","targetNode","connectionData","lastSelectedNodeOutputIndex","lastSelectedNodeEndpointUuid","targetEndpoint","lastSelectedEndpoint","newNodeElement","viableConnection","conn","targetOutputIndex","outputType","filterFound","overrideTargetEndpoint","isTarget","NodeViewUtils.resetConnectionAfterPull","targetInfoType","targetNodeType","sourceInfo","targetInfo","tempEndpoint","NodeViewUtils.resetConnection","NodeViewUtils.moveBackInputLabelPosition","NodeViewUtils.hideOutputNameLabel","NodeViewUtils.addConnectionActionsOverlay","endpointArrow","NodeViewUtils.getOverlay","OVERLAY_ENDPOINT_ARROW_ID","getConnectorPaintStyleData","AddConnectionCommand","NodeViewUtils.addConnectionTestData","totalNodes","NodeViewUtils.showOrHideItemsLabel","NodeViewUtils.showOrHideMidpointArrow","overlay","NodeViewUtils.hideConnectionActions","NodeViewUtils.showConnectionActions","NodeViewUtils.resetInputLabelPosition","connectionInfo","mouse","getConnectionInfo","NodeViewUtils.showOutputNameLabel","RemoveConnectionCommand","removeCommand","scopedEndpoints","requiredType","filteredEndpoints","isSameNode","endpointType","onMouseMove","intersectingEndpoints","isEndpointIntersect","NodeViewUtils.isElementIntersection","isNodeElementIntersect","aEndpointIntersect","NodeViewUtils.calculateElementIntersection","bEndpointIntersect","NodeViewUtils.showDropConnectionState","NodeViewUtils.showPullConnectionState","onMouseUp","EVENT_CONNECTION_ABORT","INTERCEPT_BEFORE_DROP","EVENT_CONNECTION","EVENT_DRAG_MOVE","EVENT_CONNECTION_MOUSEOVER","EVENT_CONNECTION_MOUSEOUT","EVENT_CONNECTION_MOVED","EVENT_ENDPOINT_MOUSEOVER","EVENT_ENDPOINT_MOUSEOUT","EVENT_CONNECTION_DETACHED","EVENT_CONNECTION_DRAG","EVENT_PLUS_ENDPOINT_CLICK","EVENT_ADD_INPUT_ENDPOINT_CLICK","bind","elements","endpointInstance","N8nPlusEndpointType","TIME","MODAL_CLOSE","workflowId","outputUuid","inputUuid","removeVisualConnection","sourceNodeOutput","sourceNodeOutputName","connectionInstance","targetInputIndex","sourceId","targetId","sourceEndpoint","uuids","nodeEl","outgoing","incoming","waiting","allNodeConnections","outputMap","NodeViewUtils.getOutputSummary","NodeViewUtils.recoveredConnection","NodeViewUtils.addConnectionOutputSuccess","NODE_OUTPUT_DEFAULT_KEY","NodeViewUtils.getRunItemsLabel","trackBulk","requiredNodeTypes","deleteAllowed","checkNode","waitForNewConnection","conn1","conn2","RemoveNodeCommand","tempName","currentName","promptResponsePromise","nameInput","promptResponse","newName","isActive","nodeCredentialType","nodeCredentials","credentialOptions","credentialsId","credentialsForId","optionData","credentialsForName","AddNodeCommand","batchedConnectionData","outwardConnections","sourceIndex","targetData","nodeNameTable","newNodeNames","nodeTypesCount","oldName","createNodes","localized","newConnections","currentConnections","createNodeNames","connectionIndex","nodeSourceConnections","tempWorkflow","pinDataSuccess","exportNodeNames","pinDataForNode","connectionToKeep","typeConnections","nodeInfos","nodesToBeFetched","nodeVersions","createNodeActive","nodeCreatorView","mode","dragAndDrop","currentPosition","openDetail","nodePosition","lastAddedNode","newNodesOffset","fromNode","toNode","lastNodeInputs","nodeUi","callback","suspend","isDisabled","loadPromises","ready","getAccountAge","ONBOARDING_PROMPT_TIMEBOX","onboardingResponse","promptTimeout","FIRST_ONBOARDING_PROMPT_TIMEOUT","ONBOARDING_CALL_SIGNUP_MODAL_KEY","sourceControlEventBus","connectiontype","creatorview","historyBus","_component_canvas_add_button","_component_node","stickyData","_component_sticky","_component_node_details_view","_component_NodeCreation","_component_keyboard_shortcut_tooltip"],"sources":["../../src/mixins/deviceSupportHelpers.ts","../../src/mixins/moveNodeWorkflow.ts","../../src/stores/canvas.store.ts","../../src/composables/useContextMenu.ts","../../src/composables/useCanvasMouseSelect.ts","../../src/composables/useUniqueNodeName.ts","../../src/mixins/pinData.ts","../../src/components/NodeTitle.vue","../../src/components/NodeSettingsTabs.vue","../../src/components/NodeWebhooks.vue","../../src/components/NodeExecuteButton.vue","../../src/components/NodeSettings.vue","../../src/components/Draggable.vue","../../src/components/PanelDragButton.vue","../../src/components/NDVFloatingNodes.vue","../../src/components/NDVDraggablePanels.vue","../../src/components/RunDataHtml.vue","../../src/components/BinaryDataDisplayEmbed.vue","../../src/components/BinaryDataDisplay.vue","../../src/components/Error/NodeErrorView.vue","../../src/components/RunData.vue","../../src/components/RunInfo.vue","../../src/components/OutputPanel.vue","../../src/components/WireMeUp.vue","../../src/components/InputPanel.vue","../../src/components/TriggerPanel.vue","../../src/components/NodeDetailsView.vue","../../src/components/ContextMenu/ContextMenu.vue","../../src/mixins/nodeBase.ts","../../src/components/Node.vue","../../src/components/Sticky.vue","../../src/utils/sortUtils.ts","../../src/components/Node/NodeCreator/utils.ts","../../src/stores/nodeCreator.store.ts","../../src/views/CanvasAddButton.vue","../../src/components/Node/NodeCreator/viewsData.ts","../../src/components/Node/NodeCreator/composables/useKeyboardNavigation.ts","../../src/components/Node/NodeCreator/composables/useViewStacks.ts","../../src/views/NodeView.vue"],"sourcesContent":["import { defineComponent } from 'vue';\n\nexport const deviceSupportHelpers = defineComponent({\n\tdata() {\n\t\treturn {\n\t\t\t// @ts-ignore msMaxTouchPoints is deprecated but must fix tablet bugs before fixing this.. otherwise breaks touchscreen computers\n\t\t\tisTouchDevice: 'ontouchstart' in window || navigator.msMaxTouchPoints,\n\t\t\tisMacOs: /(ipad|iphone|ipod|mac)/i.test(navigator.platform), // TODO: `platform` deprecated\n\t\t};\n\t},\n\tcomputed: {\n\t\t// TODO: Check if used anywhere\n\t\tcontrolKeyCode(): string {\n\t\t\tif (this.isMacOs) {\n\t\t\t\treturn 'Meta';\n\t\t\t}\n\t\t\treturn 'Control';\n\t\t},\n\t},\n\tmethods: {\n\t\tisCtrlKeyPressed(e: MouseEvent | KeyboardEvent): boolean {\n\t\t\tif (this.isTouchDevice === true && e instanceof MouseEvent) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (this.isMacOs) {\n\t\t\t\treturn e.metaKey;\n\t\t\t}\n\t\t\treturn e.ctrlKey;\n\t\t},\n\t},\n});\n","import { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport { deviceSupportHelpers } from '@/mixins/deviceSupportHelpers';\nimport { getMousePosition } from '@/utils/nodeViewUtils';\nimport { useUIStore } from '@/stores/ui.store';\n\nexport const moveNodeWorkflow = defineComponent({\n\tmixins: [deviceSupportHelpers],\n\tdata() {\n\t\treturn {\n\t\t\tmoveLastPosition: [0, 0],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore),\n\t},\n\tmethods: {\n\t\tmoveWorkflow(e: MouseEvent) {\n\t\t\tconst offsetPosition = this.uiStore.nodeViewOffsetPosition;\n\n\t\t\tconst [x, y] = getMousePosition(e);\n\n\t\t\tconst nodeViewOffsetPositionX = offsetPosition[0] + (x - this.moveLastPosition[0]);\n\t\t\tconst nodeViewOffsetPositionY = offsetPosition[1] + (y - this.moveLastPosition[1]);\n\t\t\tthis.uiStore.nodeViewOffsetPosition = [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\n\t\t\t// Update the last position\n\t\t\tthis.moveLastPosition[0] = x;\n\t\t\tthis.moveLastPosition[1] = y;\n\t\t},\n\t\tmouseDownMoveWorkflow(e: MouseEvent, moveButtonPressed: boolean) {\n\t\t\tif (!this.isCtrlKeyPressed(e) && !moveButtonPressed) {\n\t\t\t\t// We only care about it when the ctrl key is pressed at the same time.\n\t\t\t\t// So we exit when it is not pressed.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent moving canvas on anything but middle button\n\t\t\tif (e.button !== 1) {\n\t\t\t\tthis.uiStore.nodeViewMoveInProgress = true;\n\t\t\t}\n\n\t\t\tconst [x, y] = getMousePosition(e);\n\n\t\t\tthis.moveLastPosition[0] = x;\n\t\t\tthis.moveLastPosition[1] = y;\n\n\t\t\t// @ts-ignore\n\t\t\tthis.$el.addEventListener('mousemove', this.mouseMoveNodeWorkflow);\n\t\t},\n\t\tmouseUpMoveWorkflow(e: MouseEvent) {\n\t\t\tif (!this.uiStore.nodeViewMoveInProgress) {\n\t\t\t\t// If it is not active return directly.\n\t\t\t\t// Else normal node dragging will not work.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\tthis.$el.removeEventListener('mousemove', this.mouseMoveNodeWorkflow);\n\n\t\t\tthis.uiStore.nodeViewMoveInProgress = false;\n\n\t\t\t// Nothing else to do. Simply leave the node view at the current offset\n\t\t},\n\t\tmouseMoveNodeWorkflow(e: MouseEvent) {\n\t\t\t// @ts-ignore\n\t\t\tif (e.target && !e.target.id.includes('node-view')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Signal that moving canvas is active if middle button is pressed and mouse is moved\n\t\t\tif (e.buttons === 4) {\n\t\t\t\tthis.uiStore.nodeViewMoveInProgress = true;\n\t\t\t}\n\n\t\t\tif (e.buttons === 0) {\n\t\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t\t// comes back unpressed.\n\t\t\t\t// @ts-ignore\n\t\t\t\tthis.mouseUp(e);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.moveWorkflow(e);\n\t\t},\n\t},\n});\n","import { computed, ref, watch } from 'vue';\nimport { defineStore } from 'pinia';\nimport { v4 as uuid } from 'uuid';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport type { INodeUi, XYPosition } from '@/Interface';\nimport {\n\tapplyScale,\n\tgetScaleFromWheelEventDelta,\n\tnormalizeWheelEventDelta,\n\tscaleBigger,\n\tscaleReset,\n\tscaleSmaller,\n} from '@/utils/canvasUtils';\nimport { START_NODE_TYPE } from '@/constants';\nimport type {\n\tBeforeStartEventParams,\n\tBrowserJsPlumbInstance,\n\tDragStopEventParams,\n} from '@jsplumb/browser-ui';\nimport { newInstance } from '@jsplumb/browser-ui';\nimport type { Connection } from '@jsplumb/core';\nimport { MoveNodeCommand } from '@/models/history';\nimport {\n\tDEFAULT_PLACEHOLDER_TRIGGER_BUTTON,\n\tgetMidCanvasPosition,\n\tgetNewNodePosition,\n\tgetZoomToFit,\n\tPLACEHOLDER_TRIGGER_NODE_SIZE,\n\tCONNECTOR_FLOWCHART_TYPE,\n\tGRID_SIZE,\n\tCONNECTOR_PAINT_STYLE_DEFAULT,\n\tCONNECTOR_PAINT_STYLE_PRIMARY,\n\tCONNECTOR_ARROW_OVERLAYS,\n\tgetMousePosition,\n\tSIDEBAR_WIDTH,\n\tSIDEBAR_WIDTH_EXPANDED,\n} from '@/utils/nodeViewUtils';\nimport type { PointXY } from '@jsplumb/util';\n\nexport const useCanvasStore = defineStore('canvas', () => {\n\tconst workflowStore = useWorkflowsStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst uiStore = useUIStore();\n\tconst historyStore = useHistoryStore();\n\tconst sourceControlStore = useSourceControlStore();\n\n\tconst jsPlumbInstanceRef = ref<BrowserJsPlumbInstance>();\n\tconst isDragging = ref<boolean>(false);\n\tconst lastSelectedConnection = ref<Connection | null>(null);\n\tconst newNodeInsertPosition = ref<XYPosition | null>(null);\n\n\tconst nodes = computed<INodeUi[]>(() => workflowStore.allNodes);\n\tconst triggerNodes = computed<INodeUi[]>(() =>\n\t\tnodes.value.filter(\n\t\t\t(node) => node.type === START_NODE_TYPE || nodeTypesStore.isTriggerNode(node.type),\n\t\t),\n\t);\n\tconst isDemo = ref<boolean>(false);\n\tconst nodeViewScale = ref<number>(1);\n\tconst canvasAddButtonPosition = ref<XYPosition>([1, 1]);\n\tconst readOnlyEnv = computed(() => sourceControlStore.preferences.branchReadOnly);\n\n\twatch(readOnlyEnv, (readOnly) => {\n\t\tif (jsPlumbInstanceRef.value) {\n\t\t\tjsPlumbInstanceRef.value.elementsDraggable = !readOnly;\n\t\t}\n\t});\n\n\tconst setRecenteredCanvasAddButtonPosition = (offset?: XYPosition) => {\n\t\tconst position = getMidCanvasPosition(nodeViewScale.value, offset ?? [0, 0]);\n\n\t\tposition[0] -= PLACEHOLDER_TRIGGER_NODE_SIZE / 2;\n\t\tposition[1] -= PLACEHOLDER_TRIGGER_NODE_SIZE / 2;\n\n\t\tcanvasAddButtonPosition.value = getNewNodePosition(nodes.value, position);\n\t};\n\n\tconst getPlaceholderTriggerNodeUI = (): INodeUi => {\n\t\tsetRecenteredCanvasAddButtonPosition();\n\n\t\treturn {\n\t\t\tid: uuid(),\n\t\t\t...DEFAULT_PLACEHOLDER_TRIGGER_BUTTON,\n\t\t\tposition: canvasAddButtonPosition.value,\n\t\t};\n\t};\n\n\tconst getNodesWithPlaceholderNode = (): INodeUi[] =>\n\t\ttriggerNodes.value.length > 0 ? nodes.value : [getPlaceholderTriggerNodeUI(), ...nodes.value];\n\n\tconst canvasPositionFromPagePosition = (position: XYPosition): XYPosition => {\n\t\tconst sidebarWidth = isDemo.value\n\t\t\t? 0\n\t\t\t: uiStore.sidebarMenuCollapsed\n\t\t\t ? SIDEBAR_WIDTH\n\t\t\t : SIDEBAR_WIDTH_EXPANDED;\n\n\t\tconst relativeX = position[0] - sidebarWidth;\n\t\tconst relativeY = isDemo.value\n\t\t\t? position[1]\n\t\t\t: position[1] - uiStore.bannersHeight - uiStore.headerHeight;\n\n\t\treturn [relativeX, relativeY];\n\t};\n\n\tconst setZoomLevel = (zoomLevel: number, offset: XYPosition) => {\n\t\tnodeViewScale.value = zoomLevel;\n\t\tjsPlumbInstanceRef.value?.setZoom(zoomLevel);\n\t\tuiStore.nodeViewOffsetPosition = offset;\n\t};\n\n\tconst resetZoom = () => {\n\t\tconst { scale, offset } = scaleReset({\n\t\t\tscale: nodeViewScale.value,\n\t\t\toffset: uiStore.nodeViewOffsetPosition,\n\t\t\torigin: canvasPositionFromPagePosition([window.innerWidth / 2, window.innerHeight / 2]),\n\t\t});\n\t\tsetZoomLevel(scale, offset);\n\t};\n\n\tconst zoomIn = () => {\n\t\tconst { scale, offset } = scaleBigger({\n\t\t\tscale: nodeViewScale.value,\n\t\t\toffset: uiStore.nodeViewOffsetPosition,\n\t\t\torigin: canvasPositionFromPagePosition([window.innerWidth / 2, window.innerHeight / 2]),\n\t\t});\n\t\tsetZoomLevel(scale, offset);\n\t};\n\n\tconst zoomOut = () => {\n\t\tconst { scale, offset } = scaleSmaller({\n\t\t\tscale: nodeViewScale.value,\n\t\t\toffset: uiStore.nodeViewOffsetPosition,\n\t\t\torigin: canvasPositionFromPagePosition([window.innerWidth / 2, window.innerHeight / 2]),\n\t\t});\n\t\tsetZoomLevel(scale, offset);\n\t};\n\n\tconst zoomToFit = () => {\n\t\tconst nodes = getNodesWithPlaceholderNode();\n\t\tif (!nodes.length) {\n\t\t\t// some unknown workflow executions\n\t\t\treturn;\n\t\t}\n\t\tconst { zoomLevel, offset } = getZoomToFit(nodes, !isDemo.value);\n\t\tsetZoomLevel(zoomLevel, offset);\n\t};\n\n\tconst wheelMoveWorkflow = (deltaX: number, deltaY: number, shiftKeyPressed = false) => {\n\t\tconst offsetPosition = uiStore.nodeViewOffsetPosition;\n\t\tconst nodeViewOffsetPositionX = offsetPosition[0] - (shiftKeyPressed ? deltaY : deltaX);\n\t\tconst nodeViewOffsetPositionY = offsetPosition[1] - (shiftKeyPressed ? deltaX : deltaY);\n\t\tuiStore.nodeViewOffsetPosition = [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\t};\n\n\tconst wheelScroll = (e: WheelEvent) => {\n\t\t// Prevent browser back/forward gesture, default pinch to zoom etc.\n\t\te.preventDefault();\n\n\t\tconst { deltaX, deltaY } = normalizeWheelEventDelta(e);\n\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\tconst scaleFactor = getScaleFromWheelEventDelta(deltaY);\n\t\t\tconst { scale, offset } = applyScale(scaleFactor)({\n\t\t\t\tscale: nodeViewScale.value,\n\t\t\t\toffset: uiStore.nodeViewOffsetPosition,\n\t\t\t\torigin: canvasPositionFromPagePosition(getMousePosition(e)),\n\t\t\t});\n\t\t\tsetZoomLevel(scale, offset);\n\t\t\treturn;\n\t\t}\n\t\twheelMoveWorkflow(deltaX, deltaY, e.shiftKey);\n\t};\n\n\tfunction initInstance(container: Element) {\n\t\t// Make sure to clean-up previous instance if it exists\n\t\tif (jsPlumbInstanceRef.value) {\n\t\t\tjsPlumbInstanceRef.value.destroy();\n\t\t\tjsPlumbInstanceRef.value.reset();\n\t\t\tjsPlumbInstanceRef.value = undefined;\n\t\t}\n\n\t\tjsPlumbInstanceRef.value = newInstance({\n\t\t\tcontainer,\n\t\t\tconnector: CONNECTOR_FLOWCHART_TYPE,\n\t\t\tresizeObserver: false,\n\t\t\tendpoint: {\n\t\t\t\ttype: 'Dot',\n\t\t\t\toptions: { radius: 5 },\n\t\t\t},\n\t\t\tpaintStyle: CONNECTOR_PAINT_STYLE_DEFAULT,\n\t\t\thoverPaintStyle: CONNECTOR_PAINT_STYLE_PRIMARY,\n\t\t\tconnectionOverlays: CONNECTOR_ARROW_OVERLAYS,\n\t\t\telementsDraggable: !readOnlyEnv.value,\n\t\t\tdragOptions: {\n\t\t\t\tcursor: 'pointer',\n\t\t\t\tgrid: { w: GRID_SIZE, h: GRID_SIZE },\n\t\t\t\tstart: (params: BeforeStartEventParams) => {\n\t\t\t\t\tconst draggedNode = params.drag.getDragElement();\n\t\t\t\t\tconst nodeName = draggedNode.getAttribute('data-name');\n\t\t\t\t\tif (!nodeName) return;\n\t\t\t\t\tisDragging.value = true;\n\n\t\t\t\t\tconst isSelected = uiStore.isNodeSelected(nodeName);\n\n\t\t\t\t\tif (params.e && !isSelected) {\n\t\t\t\t\t\t// Only the node which gets dragged directly gets an event, for all others it is\n\t\t\t\t\t\t// undefined. So check if the currently dragged node is selected and if not clear\n\t\t\t\t\t\t// the drag-selection.\n\t\t\t\t\t\tjsPlumbInstanceRef.value?.clearDragSelection();\n\t\t\t\t\t\tuiStore.resetSelectedNodes();\n\t\t\t\t\t}\n\n\t\t\t\t\tuiStore.addActiveAction('dragActive');\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tstop: (params: DragStopEventParams) => {\n\t\t\t\t\tconst draggedNode = params.drag.getDragElement();\n\t\t\t\t\tconst nodeName = draggedNode.getAttribute('data-name');\n\t\t\t\t\tif (!nodeName) return;\n\t\t\t\t\tconst nodeData = workflowStore.getNodeByName(nodeName);\n\t\t\t\t\tisDragging.value = false;\n\t\t\t\t\tif (uiStore.isActionActive('dragActive') && nodeData) {\n\t\t\t\t\t\tconst moveNodes = uiStore.getSelectedNodes.slice();\n\t\t\t\t\t\tconst selectedNodeNames = moveNodes.map((node: INodeUi) => node.name);\n\t\t\t\t\t\tif (!selectedNodeNames.includes(nodeData.name)) {\n\t\t\t\t\t\t\t// If the current node is not in selected add it to the nodes which\n\t\t\t\t\t\t\t// got moved manually\n\t\t\t\t\t\t\tmoveNodes.push(nodeData);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (moveNodes.length > 1) {\n\t\t\t\t\t\t\thistoryStore.startRecordingUndo();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This does for some reason just get called once for the node that got clicked\n\t\t\t\t\t\t// even though \"start\" and \"drag\" gets called for all. So lets do for now\n\t\t\t\t\t\t// some dirty DOM query to get the new positions till I have more time to\n\t\t\t\t\t\t// create a proper solution\n\t\t\t\t\t\tlet newNodePosition: XYPosition;\n\t\t\t\t\t\tmoveNodes.forEach((node: INodeUi) => {\n\t\t\t\t\t\t\tconst element = document.getElementById(node.id);\n\t\t\t\t\t\t\tif (element === null) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tnewNodePosition = [\n\t\t\t\t\t\t\t\tparseInt(element.style.left.slice(0, -2), 10),\n\t\t\t\t\t\t\t\tparseInt(element.style.top.slice(0, -2), 10),\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tconst updateInformation = {\n\t\t\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\tposition: newNodePosition,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tconst oldPosition = node.position;\n\t\t\t\t\t\t\tif (oldPosition[0] !== newNodePosition[0] || oldPosition[1] !== newNodePosition[1]) {\n\t\t\t\t\t\t\t\thistoryStore.pushCommandToUndo(\n\t\t\t\t\t\t\t\t\tnew MoveNodeCommand(node.name, oldPosition, newNodePosition),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tworkflowStore.updateNodeProperties(updateInformation);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (moveNodes.length > 1) {\n\t\t\t\t\t\t\thistoryStore.stopRecordingUndo();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t\t\t\t\tuiStore.removeActiveAction('dragActive');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfilter: '.node-description, .node-description .node-name, .node-description .node-subtitle',\n\t\t\t},\n\t\t});\n\t\tjsPlumbInstanceRef.value?.setDragConstrainFunction((pos: PointXY) => {\n\t\t\tconst isReadOnly = uiStore.isReadOnlyView;\n\t\t\tif (isReadOnly) {\n\t\t\t\t// Do not allow to move nodes in readOnly mode\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn pos;\n\t\t});\n\t}\n\n\tconst jsPlumbInstance = computed(() => jsPlumbInstanceRef.value as BrowserJsPlumbInstance);\n\treturn {\n\t\tisDemo,\n\t\tnodeViewScale,\n\t\tcanvasAddButtonPosition,\n\t\tlastSelectedConnection,\n\t\tnewNodeInsertPosition,\n\t\tjsPlumbInstance,\n\t\tsetRecenteredCanvasAddButtonPosition,\n\t\tgetNodesWithPlaceholderNode,\n\t\tcanvasPositionFromPagePosition,\n\t\tsetZoomLevel,\n\t\tresetZoom,\n\t\tzoomIn,\n\t\tzoomOut,\n\t\tzoomToFit,\n\t\twheelScroll,\n\t\tinitInstance,\n\t};\n});\n","import type { XYPosition } from '@/Interface';\nimport {\n\tNOT_DUPLICATABE_NODE_TYPES,\n\tPIN_DATA_NODE_TYPES_DENYLIST,\n\tSTICKY_NODE_TYPE,\n} from '@/constants';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { IActionDropdownItem } from 'n8n-design-system/src/components/N8nActionDropdown/ActionDropdown.vue';\nimport type { INode, INodeTypeDescription } from 'n8n-workflow';\nimport { computed, ref, watch } from 'vue';\nimport { getMousePosition } from '../utils/nodeViewUtils';\nimport { useI18n } from './useI18n';\nimport { useDataSchema } from './useDataSchema';\n\nexport type ContextMenuTarget =\n\t| { source: 'canvas' }\n\t| { source: 'node-right-click'; node: INode }\n\t| { source: 'node-button'; node: INode };\nexport type ContextMenuActionCallback = (action: ContextMenuAction, targets: INode[]) => void;\nexport type ContextMenuAction =\n\t| 'open'\n\t| 'copy'\n\t| 'toggle_activation'\n\t| 'duplicate'\n\t| 'execute'\n\t| 'rename'\n\t| 'toggle_pin'\n\t| 'delete'\n\t| 'select_all'\n\t| 'deselect_all'\n\t| 'add_node'\n\t| 'add_sticky'\n\t| 'change_color';\n\nconst position = ref<XYPosition>([0, 0]);\nconst isOpen = ref(false);\nconst target = ref<ContextMenuTarget>({ source: 'canvas' });\nconst actions = ref<IActionDropdownItem[]>([]);\nconst actionCallback = ref<ContextMenuActionCallback>(() => {});\n\nexport const useContextMenu = (onAction: ContextMenuActionCallback = () => {}) => {\n\tconst uiStore = useUIStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst sourceControlStore = useSourceControlStore();\n\tconst { getInputDataWithPinned } = useDataSchema();\n\tconst i18n = useI18n();\n\n\tconst isReadOnly = computed(\n\t\t() => sourceControlStore.preferences.branchReadOnly || uiStore.isReadOnlyView,\n\t);\n\n\tconst targetNodes = computed(() => {\n\t\tif (!isOpen.value) return [];\n\t\tconst selectedNodes = uiStore.selectedNodes.map((node) =>\n\t\t\tworkflowsStore.getNodeByName(node.name),\n\t\t) as INode[];\n\t\tconst currentTarget = target.value;\n\t\tif (currentTarget.source === 'canvas') {\n\t\t\treturn selectedNodes;\n\t\t} else if (currentTarget.source === 'node-right-click') {\n\t\t\tconst isNodeInSelection = selectedNodes.some((node) => node.name === currentTarget.node.name);\n\t\t\treturn isNodeInSelection ? selectedNodes : [currentTarget.node];\n\t\t}\n\n\t\treturn [currentTarget.node];\n\t});\n\n\tconst canAddNodeOfType = (nodeType: INodeTypeDescription) => {\n\t\tconst sameTypeNodes = workflowsStore.allNodes.filter((n) => n.type === nodeType.name);\n\t\treturn nodeType.maxNodes === undefined || sameTypeNodes.length < nodeType.maxNodes;\n\t};\n\n\tconst canDuplicateNode = (node: INode): boolean => {\n\t\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\tif (!nodeType) return false;\n\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(nodeType.name)) return false;\n\n\t\treturn canAddNodeOfType(nodeType);\n\t};\n\n\tconst canPinNode = (node: INode): boolean => {\n\t\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\tconst dataToPin = getInputDataWithPinned(node);\n\t\tif (!nodeType || dataToPin.length === 0) return false;\n\t\treturn nodeType.outputs.length === 1 && !PIN_DATA_NODE_TYPES_DENYLIST.includes(node.type);\n\t};\n\n\tconst hasPinData = (node: INode): boolean => {\n\t\treturn !!workflowsStore.pinDataByNodeName(node.name);\n\t};\n\tconst close = () => {\n\t\ttarget.value = { source: 'canvas' };\n\t\tisOpen.value = false;\n\t\tactions.value = [];\n\t\tposition.value = [0, 0];\n\t};\n\n\tconst open = (event: MouseEvent, menuTarget: ContextMenuTarget = { source: 'canvas' }) => {\n\t\tevent.stopPropagation();\n\n\t\tif (isOpen.value && menuTarget.source === target.value.source) {\n\t\t\t// Close context menu, let browser open native context menu\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tactionCallback.value = onAction;\n\t\ttarget.value = menuTarget;\n\t\tposition.value = getMousePosition(event);\n\t\tisOpen.value = true;\n\n\t\tconst nodes = targetNodes.value;\n\t\tconst onlyStickies = nodes.every((node) => node.type === STICKY_NODE_TYPE);\n\t\tconst i18nOptions = {\n\t\t\tadjustToNumber: nodes.length,\n\t\t\tinterpolate: {\n\t\t\t\tsubject: onlyStickies\n\t\t\t\t\t? i18n.baseText('contextMenu.sticky', { adjustToNumber: nodes.length })\n\t\t\t\t\t: i18n.baseText('contextMenu.node', { adjustToNumber: nodes.length }),\n\t\t\t},\n\t\t};\n\n\t\tconst selectionActions = [\n\t\t\t{\n\t\t\t\tid: 'select_all',\n\t\t\t\tdivided: true,\n\t\t\t\tlabel: i18n.baseText('contextMenu.selectAll'),\n\t\t\t\tshortcut: { metaKey: true, keys: ['A'] },\n\t\t\t\tdisabled: nodes.length === workflowsStore.allNodes.length,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'deselect_all',\n\t\t\t\tlabel: i18n.baseText('contextMenu.deselectAll'),\n\t\t\t\tdisabled: nodes.length === 0,\n\t\t\t},\n\t\t];\n\n\t\tif (nodes.length === 0) {\n\t\t\tactions.value = [\n\t\t\t\t{\n\t\t\t\t\tid: 'add_node',\n\t\t\t\t\tshortcut: { keys: ['Tab'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addNode'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'add_sticky',\n\t\t\t\t\tshortcut: { shiftKey: true, keys: ['s'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addSticky'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t];\n\t\t} else {\n\t\t\tconst menuActions: IActionDropdownItem[] = [\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_activation',\n\t\t\t\t\tlabel: nodes.every((node) => node.disabled)\n\t\t\t\t\t\t? i18n.baseText('contextMenu.activate', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.deactivate', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_pin',\n\t\t\t\t\tlabel: nodes.every((node) => hasPinData(node))\n\t\t\t\t\t\t? i18n.baseText('contextMenu.unpin', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.pin', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['p'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every(canPinNode),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'copy',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.copy', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['C'] },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'duplicate',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.duplicate', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every(canDuplicateNode),\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t\t{\n\t\t\t\t\tid: 'delete',\n\t\t\t\t\tdivided: true,\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.delete', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['Del'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t].filter(Boolean) as IActionDropdownItem[];\n\n\t\t\tif (nodes.length === 1) {\n\t\t\t\tconst singleNodeActions = onlyStickies\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.editSticky'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'change_color',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.changeColor'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t ]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.open'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'execute',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.execute'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'rename',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.rename'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['F2'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t ];\n\t\t\t\t// Add actions only available for a single node\n\t\t\t\tmenuActions.unshift(...singleNodeActions);\n\t\t\t}\n\n\t\t\tactions.value = menuActions;\n\t\t}\n\t};\n\n\tconst _dispatchAction = (action: ContextMenuAction) => {\n\t\tactionCallback.value(action, targetNodes.value);\n\t};\n\n\twatch(\n\t\t() => uiStore.nodeViewOffsetPosition,\n\t\t() => {\n\t\t\tclose();\n\t\t},\n\t);\n\n\treturn {\n\t\tisOpen,\n\t\tposition,\n\t\ttarget,\n\t\tactions,\n\t\ttargetNodes,\n\t\topen,\n\t\tclose,\n\t\t_dispatchAction,\n\t};\n};\n","import type { INodeUi, XYPosition } from '@/Interface';\n\nimport { useDeviceSupport } from 'n8n-design-system/composables/useDeviceSupport';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { getMousePosition, getRelativePosition } from '@/utils/nodeViewUtils';\nimport { ref, onMounted, computed } from 'vue';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useContextMenu } from './useContextMenu';\n\ninterface ExtendedHTMLSpanElement extends HTMLSpanElement {\n\tx: number;\n\ty: number;\n}\n\nexport default function useCanvasMouseSelect() {\n\tconst selectActive = ref(false);\n\tconst selectBox = ref(document.createElement('span') as ExtendedHTMLSpanElement);\n\n\tconst { isTouchDevice, isCtrlKeyPressed } = useDeviceSupport();\n\tconst uiStore = useUIStore();\n\tconst canvasStore = useCanvasStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst { isOpen: isContextMenuOpen } = useContextMenu();\n\n\tfunction _setSelectBoxStyle(styles: Record<string, string>) {\n\t\tObject.assign(selectBox.value.style, styles);\n\t}\n\n\tfunction _showSelectBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\tselectBox.value = Object.assign(selectBox.value, { x, y });\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectBox.value.x + 'px',\n\t\t\ttop: selectBox.value.y + 'px',\n\t\t\tvisibility: 'visible',\n\t\t});\n\t\tselectActive.value = true;\n\t}\n\n\tfunction _updateSelectBox(event: MouseEvent) {\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectionBox.x + 'px',\n\t\t\ttop: selectionBox.y + 'px',\n\t\t\twidth: selectionBox.width + 'px',\n\t\t\theight: selectionBox.height + 'px',\n\t\t});\n\t}\n\n\tfunction _hideSelectBox() {\n\t\tselectBox.value.x = 0;\n\t\tselectBox.value.y = 0;\n\n\t\t_setSelectBoxStyle({\n\t\t\tvisibility: 'hidden',\n\t\t\tleft: '0px',\n\t\t\ttop: '0px',\n\t\t\twidth: '0px',\n\t\t\theight: '0px',\n\t\t});\n\t\tselectActive.value = false;\n\t}\n\n\tfunction _getSelectionBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\treturn {\n\t\t\tx: Math.min(x, selectBox.value.x),\n\t\t\ty: Math.min(y, selectBox.value.y),\n\t\t\twidth: Math.abs(x - selectBox.value.x),\n\t\t\theight: Math.abs(y - selectBox.value.y),\n\t\t};\n\t}\n\n\tfunction _getNodesInSelection(event: MouseEvent): INodeUi[] {\n\t\tconst returnNodes: INodeUi[] = [];\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t// Go through all nodes and check if they are selected\n\t\tworkflowsStore.allNodes.forEach((node: INodeUi) => {\n\t\t\t// TODO: Currently always uses the top left corner for checking. Should probably use the center instead\n\t\t\tif (\n\t\t\t\tnode.position[0] < selectionBox.x ||\n\t\t\t\tnode.position[0] > selectionBox.x + selectionBox.width\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnode.position[1] < selectionBox.y ||\n\t\t\t\tnode.position[1] > selectionBox.y + selectionBox.height\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturnNodes.push(node);\n\t\t});\n\n\t\treturn returnNodes;\n\t}\n\n\tfunction _createSelectBox() {\n\t\tselectBox.value.id = 'select-box';\n\t\t_setSelectBoxStyle({\n\t\t\tmargin: '0px auto',\n\t\t\tborder: '2px dotted #FF0000',\n\t\t\t// Positioned absolutely within #node-view. This is consistent with how nodes are positioned.\n\t\t\tposition: 'absolute',\n\t\t\tzIndex: '100',\n\t\t\tvisibility: 'hidden',\n\t\t});\n\n\t\tselectBox.value.addEventListener('mouseup', mouseUpMouseSelect);\n\n\t\tconst nodeViewEl = document.querySelector('#node-view') as HTMLDivElement;\n\t\tnodeViewEl.appendChild(selectBox.value);\n\t}\n\n\tfunction _mouseMoveSelect(e: MouseEvent) {\n\t\tif (e.buttons === 0) {\n\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t// comes back unpressed.\n\t\t\tmouseUpMouseSelect(e);\n\t\t\treturn;\n\t\t}\n\n\t\t_updateSelectBox(e);\n\t}\n\n\tfunction mouseUpMouseSelect(e: MouseEvent) {\n\t\t// Ignore right-click\n\t\tif (e.button === 2 || isContextMenuOpen.value) return;\n\n\t\tif (!selectActive.value) {\n\t\t\tif (isTouchDevice && e.target instanceof HTMLElement) {\n\t\t\t\tif (e.target && e.target.id.includes('node-view')) {\n\t\t\t\t\t// Deselect all nodes\n\t\t\t\t\tdeselectAllNodes();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If it is not active return directly.\n\t\t\t// Else normal node dragging will not work.\n\t\t\treturn;\n\t\t}\n\t\tdocument.removeEventListener('mousemove', _mouseMoveSelect);\n\n\t\t// Deselect all nodes\n\t\tdeselectAllNodes();\n\n\t\t// Select the nodes which are in the selection box\n\t\tconst selectedNodes = _getNodesInSelection(e);\n\t\tselectedNodes.forEach((node) => {\n\t\t\tnodeSelected(node);\n\t\t});\n\n\t\tif (selectedNodes.length === 1) {\n\t\t\tuiStore.lastSelectedNode = selectedNodes[0].name;\n\t\t}\n\n\t\t_hideSelectBox();\n\t}\n\tfunction mouseDownMouseSelect(e: MouseEvent, moveButtonPressed: boolean) {\n\t\tif (isCtrlKeyPressed(e) || moveButtonPressed || e.button === 2) {\n\t\t\t// We only care about it when the ctrl key is not pressed at the same time.\n\t\t\t// So we exit when it is pressed.\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\treturn;\n\t\t}\n\t\t_showSelectBox(e);\n\n\t\t// Leave like this.\n\t\t// Do not add an anonymous function because then remove would not work anymore\n\t\tdocument.addEventListener('mousemove', _mouseMoveSelect);\n\t}\n\n\tfunction getMousePositionWithinNodeView(event: MouseEvent | TouchEvent): XYPosition {\n\t\tconst mousePosition = getMousePosition(event);\n\n\t\tconst [relativeX, relativeY] = canvasStore.canvasPositionFromPagePosition(mousePosition);\n\t\tconst nodeViewScale = canvasStore.nodeViewScale;\n\t\tconst nodeViewOffsetPosition = uiStore.nodeViewOffsetPosition;\n\n\t\treturn getRelativePosition(relativeX, relativeY, nodeViewScale, nodeViewOffsetPosition);\n\t}\n\n\tfunction nodeDeselected(node: INodeUi) {\n\t\tuiStore.removeNodeFromSelection(node);\n\t\tinstance.value.removeFromDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction nodeSelected(node: INodeUi) {\n\t\tuiStore.addSelectedNode(node);\n\t\tinstance.value.addToDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction deselectAllNodes() {\n\t\tinstance.value.clearDragSelection();\n\t\tuiStore.resetSelectedNodes();\n\t\tuiStore.lastSelectedNode = null;\n\t\tuiStore.lastSelectedNodeOutputIndex = null;\n\n\t\tcanvasStore.lastSelectedConnection = null;\n\t\tcanvasStore.newNodeInsertPosition = null;\n\t}\n\n\tconst instance = computed(() => canvasStore.jsPlumbInstance);\n\n\tonMounted(() => {\n\t\t_createSelectBox();\n\t});\n\n\treturn {\n\t\tselectActive,\n\t\tgetMousePositionWithinNodeView,\n\t\tmouseUpMouseSelect,\n\t\tmouseDownMouseSelect,\n\t\tnodeDeselected,\n\t\tnodeSelected,\n\t\tdeselectAllNodes,\n\t};\n}\n","import { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\nexport function useUniqueNodeName() {\n\t/**\n\t * All in-store node name defaults ending with a number, e.g.\n\t * `AWS S3`, `Magento 2`, `MSG91`, `S3`, `SIGNL4`, `sms77`\n\t */\n\tfunction numberSuffixedNames() {\n\t\treturn useNodeTypesStore().allNodeTypes.reduce<string[]>((acc, nodeType) => {\n\t\t\tif (typeof nodeType.defaults.name !== 'string') {\n\t\t\t\tthrow new Error('Expected node name default to be a string');\n\t\t\t}\n\n\t\t\tif (/\\d$/.test(nodeType.defaults.name)) acc.push(nodeType.defaults.name);\n\n\t\t\treturn acc;\n\t\t}, []);\n\t}\n\n\t/**\n\t * Create a unique node name from an original name, based on the names of\n\t * all nodes on canvas and any extra names that cannot be used.\n\t */\n\tfunction uniqueNodeName(originalName: string, extraNames: string[] = []) {\n\t\tconst { canvasNames } = useWorkflowsStore();\n\n\t\tconst isUnique = !canvasNames.has(originalName) && !extraNames.includes(originalName);\n\n\t\tif (isUnique) return originalName;\n\n\t\tconst nsn = numberSuffixedNames().find((nsn) => originalName.startsWith(nsn));\n\n\t\t// edge case, number suffix as part of name: S3 -> S31 -> S32\n\n\t\tif (nsn) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst remainder = originalName.split(nsn).pop();\n\n\t\t\tconst lastChar = remainder?.[remainder.length - 1];\n\n\t\t\tif (lastChar && Number.isInteger(Number(lastChar))) {\n\t\t\t\tindex = parseInt(lastChar, 10);\n\t\t\t\toriginalName = originalName.slice(0, -1);\n\t\t\t}\n\n\t\t\tunique = originalName;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = originalName + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// edge case, all-number name: 123 -> 123-1 -> 123-2\n\n\t\tif (/^\\d+-?\\d*$/.test(originalName)) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst match = originalName.match(/(?<base>\\d+)-?(?<suffix>\\d*)/);\n\n\t\t\tif (!match?.groups) {\n\t\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t\t}\n\n\t\t\tif (match?.groups?.suffix !== '') {\n\t\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t\t}\n\n\t\t\tunique = match.groups.base;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = match.groups.base + '-' + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// normal case: A -> A1 -> A2\n\n\t\tlet unique = '';\n\t\tlet index = 1;\n\n\t\tconst match = originalName.match(/(?<base>.*\\D+)(?<suffix>\\d*)/);\n\n\t\tif (!match?.groups) {\n\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t}\n\n\t\tif (match?.groups?.suffix !== '') {\n\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t}\n\n\t\tunique = match.groups.base;\n\n\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\tunique = match.groups.base + index++;\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\treturn { uniqueNodeName };\n}\n","import { defineComponent } from 'vue';\nimport type { INodeUi } from '@/Interface';\nimport type { IPinData, INodeExecutionData } from 'n8n-workflow';\nimport { stringSizeInBytes } from '@/utils/typesUtils';\nimport {\n\tMAX_EXPECTED_REQUEST_SIZE,\n\tMAX_PINNED_DATA_SIZE,\n\tMAX_WORKFLOW_SIZE,\n\tPIN_DATA_NODE_TYPES_DENYLIST,\n} from '@/constants';\nimport { mapStores } from 'pinia';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { NodeConnectionType, NodeHelpers, jsonParse, jsonStringify } from 'n8n-workflow';\nimport { useToast } from '@/composables/useToast';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport type PinDataSource =\n\t| 'pin-icon-click'\n\t| 'save-edit'\n\t| 'on-ndv-close-modal'\n\t| 'duplicate-node'\n\t| 'add-nodes'\n\t| 'context-menu'\n\t| 'keyboard-shortcut';\n\nexport type UnpinDataSource = 'unpin-and-execute-modal' | 'context-menu' | 'keyboard-shortcut';\n\nexport const pinData = defineComponent({\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore, useNDVStore),\n\t\tpinData(): IPinData[string] | undefined {\n\t\t\treturn this.node ? this.workflowsStore.pinDataByNodeName(this.node.name) : undefined;\n\t\t},\n\t\thasPinData(): boolean {\n\t\t\treturn !!this.node && typeof this.pinData !== 'undefined';\n\t\t},\n\t\tisSubNode() {\n\t\t\tif (!this.nodeType.outputs || typeof this.nodeType.outputs === 'string') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(this.nodeType.outputs);\n\t\t\treturn outputTypes\n\t\t\t\t? outputTypes.filter((output) => output !== NodeConnectionType.Main).length > 0\n\t\t\t\t: false;\n\t\t},\n\t\tisPinDataNodeType(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\t!this.isSubNode &&\n\t\t\t\t!this.isMultipleOutputsNodeType &&\n\t\t\t\t!PIN_DATA_NODE_TYPES_DENYLIST.includes(this.node.type)\n\t\t\t);\n\t\t},\n\t\tisMultipleOutputsNodeType(): boolean {\n\t\t\treturn this.nodeType?.outputs.length > 1;\n\t\t},\n\t},\n\tmethods: {\n\t\tisValidPinDataJSON(data: string): boolean {\n\t\t\ttry {\n\t\t\t\tJSON.parse(data);\n\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tconst title = this.$locale.baseText('runData.editOutputInvalid');\n\n\t\t\t\tconst toRemove = new RegExp(/JSON\\.parse:|of the JSON data/, 'g');\n\t\t\t\tconst message = error.message.replace(toRemove, '').trim();\n\t\t\t\tconst positionMatchRegEx = /at position (\\d+)/;\n\t\t\t\tconst positionMatch = error.message.match(positionMatchRegEx);\n\n\t\t\t\terror.message = message.charAt(0).toUpperCase() + message.slice(1);\n\t\t\t\terror.message = error.message.replace(\n\t\t\t\t\t\"Unexpected token ' in JSON\",\n\t\t\t\t\tthis.$locale.baseText('runData.editOutputInvalid.singleQuote'),\n\t\t\t\t);\n\n\t\t\t\tif (positionMatch) {\n\t\t\t\t\tconst position = parseInt(positionMatch[1], 10);\n\t\t\t\t\tconst lineBreaksUpToPosition = (data.slice(0, position).match(/\\n/g) || []).length;\n\n\t\t\t\t\terror.message = error.message.replace(\n\t\t\t\t\t\tpositionMatchRegEx,\n\t\t\t\t\t\tthis.$locale.baseText('runData.editOutputInvalid.atPosition', {\n\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\tposition: `${position}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\terror.message = `${this.$locale.baseText('runData.editOutputInvalid.onLine', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tline: `${lineBreaksUpToPosition + 1}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t})} ${error.message}`;\n\t\t\t\t}\n\n\t\t\t\tthis.showError(error, title);\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tisValidPinDataSize(data: string | object, activeNodeName: string): boolean {\n\t\t\tif (typeof data === 'object') data = JSON.stringify(data);\n\n\t\t\tconst { pinData: currentPinData, ...workflow } = this.workflowsStore.getCurrentWorkflow();\n\t\t\tconst workflowJson = jsonStringify(workflow, { replaceCircularRefs: true });\n\n\t\t\tconst newPinData = { ...currentPinData, [activeNodeName]: data };\n\t\t\tconst newPinDataSize = this.workflowsStore.getPinDataSize(newPinData);\n\n\t\t\tif (newPinDataSize > MAX_PINNED_DATA_SIZE) {\n\t\t\t\tthis.showError(\n\t\t\t\t\tnew Error(this.$locale.baseText('ndv.pinData.error.tooLarge.description')),\n\t\t\t\t\tthis.$locale.baseText('ndv.pinData.error.tooLarge.title'),\n\t\t\t\t);\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstringSizeInBytes(workflowJson) + newPinDataSize >\n\t\t\t\tMAX_WORKFLOW_SIZE - MAX_EXPECTED_REQUEST_SIZE\n\t\t\t) {\n\t\t\t\tthis.showError(\n\t\t\t\t\tnew Error(this.$locale.baseText('ndv.pinData.error.tooLargeWorkflow.description')),\n\t\t\t\t\tthis.$locale.baseText('ndv.pinData.error.tooLargeWorkflow.title'),\n\t\t\t\t);\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\tsetPinData(node: INodeUi, data: string | INodeExecutionData[], source: PinDataSource): boolean {\n\t\t\tif (typeof data === 'string') {\n\t\t\t\tif (!this.isValidPinDataJSON(data)) {\n\t\t\t\t\tthis.onDataPinningError({ errorType: 'invalid-json', source });\n\t\t\t\t\tthrow new Error('Invalid JSON');\n\t\t\t\t}\n\n\t\t\t\tdata = jsonParse(data);\n\t\t\t}\n\n\t\t\tif (!this.isValidPinDataSize(data, node.name)) {\n\t\t\t\tthis.onDataPinningError({ errorType: 'data-too-large', source });\n\t\t\t\tthrow new Error('Data too large');\n\t\t\t}\n\n\t\t\tthis.onDataPinningSuccess({ source });\n\t\t\tthis.workflowsStore.pinData({ node, data: data as INodeExecutionData[] });\n\t\t},\n\t\tunsetPinData(node: INodeUi, source: UnpinDataSource): void {\n\t\t\tthis.onDataUnpinning({ source });\n\t\t\tthis.workflowsStore.unpinData({ node });\n\t\t},\n\t\tonDataPinningSuccess({ source }: { source: PinDataSource }) {\n\t\t\tconst telemetryPayload = {\n\t\t\t\tpinning_source: source,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tdata_size: stringSizeInBytes(this.pinData),\n\t\t\t\tview: this.displayMode,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t};\n\t\t\tvoid useExternalHooks().run('runData.onDataPinningSuccess', telemetryPayload);\n\t\t\tthis.$telemetry.track('Ndv data pinning success', telemetryPayload);\n\t\t},\n\t\tonDataPinningError({\n\t\t\terrorType,\n\t\t\tsource,\n\t\t}: {\n\t\t\terrorType: 'data-too-large' | 'invalid-json';\n\t\t\tsource: PinDataSource;\n\t\t}) {\n\t\t\tthis.$telemetry.track('Ndv data pinning failure', {\n\t\t\t\tpinning_source: source,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tdata_size: stringSizeInBytes(this.pinData),\n\t\t\t\tview: this.displayMode,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\terror_type: errorType,\n\t\t\t});\n\t\t},\n\t\tonDataUnpinning({\n\t\t\tsource,\n\t\t}: {\n\t\t\tsource: 'banner-link' | 'pin-icon-click' | 'unpin-and-execute-modal';\n\t\t}) {\n\t\t\tthis.$telemetry.track('User unpinned ndv data', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tsource,\n\t\t\t\tdata_size: stringSizeInBytes(this.pinData),\n\t\t\t});\n\t\t},\n\t},\n});\n","<template>\n\t<span :class=\"$style.container\" data-test-id=\"node-title-container\" @click=\"onEdit\">\n\t\t<span :class=\"$style.iconWrapper\"><NodeIcon :nodeType=\"nodeType\" :size=\"18\" /></span>\n\t\t<n8n-popover placement=\"right\" width=\"200\" :visible=\"editName\" :disabled=\"!editable\">\n\t\t\t<div\n\t\t\t\t:class=\"$style.editContainer\"\n\t\t\t\t@keydown.enter=\"onRename\"\n\t\t\t\t@keydown.stop\n\t\t\t\t@keydown.esc=\"editName = false\"\n\t\t\t>\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-base\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('ndv.title.renameNode')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-input ref=\"input\" size=\"small\" v-model=\"newName\" data-test-id=\"node-rename-input\" />\n\t\t\t\t<div :class=\"$style.editButtons\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click=\"editName = false\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.cancel')\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click=\"onRename\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.rename')\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<template #reference>\n\t\t\t\t<div :class=\"{ [$style.title]: true, [$style.hoverable]: editable }\">\n\t\t\t\t\t{{ modelValue }}\n\t\t\t\t\t<div :class=\"$style.editIconContainer\">\n\t\t\t\t\t\t<font-awesome-icon :class=\"$style.editIcon\" icon=\"pencil-alt\" v-if=\"editable\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-popover>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'NodeTitle',\n\tcomponents: {\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\teditName: false,\n\t\t\tnewName: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\teditable(): boolean {\n\t\t\treturn !this.readOnly && window === window.parent;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onEdit() {\n\t\t\tthis.newName = this.modelValue;\n\t\t\tthis.editName = true;\n\t\t\tawait this.$nextTick();\n\t\t\tconst inputRef = this.$refs.input as HTMLInputElement | undefined;\n\t\t\tif (inputRef) {\n\t\t\t\tinputRef.focus();\n\t\t\t}\n\t\t},\n\t\tonRename() {\n\t\t\tif (this.newName.trim() !== '') {\n\t\t\t\tthis.$emit('update:modelValue', this.newName.trim());\n\t\t\t}\n\n\t\t\tthis.editName = false;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tfont-weight: var(--font-weight-bold);\n\tdisplay: flex;\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-compact);\n\toverflow-wrap: anywhere;\n\tpadding-right: var(--spacing-s);\n\toverflow: hidden;\n}\n\n.title {\n\tmax-height: 100px;\n\tdisplay: -webkit-box;\n\t-webkit-line-clamp: 5;\n\t-webkit-box-orient: vertical;\n\tcolor: var(--color-text-dark);\n}\n\n.hoverable {\n\t&:hover {\n\t\tcursor: pointer;\n\t\t.editIcon {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n\n.iconWrapper {\n\tdisplay: inline-flex;\n\tmargin-right: var(--spacing-2xs);\n}\n\n.editIcon {\n\tdisplay: none;\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--color-text-base);\n\tposition: absolute;\n\tbottom: 0;\n}\n\n.editIconContainer {\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: 0;\n}\n\n.editButtons {\n\ttext-align: right;\n\tmargin-top: var(--spacing-s);\n\n\t> * {\n\t\tmargin-left: var(--spacing-4xs);\n\t}\n}\n\n.editContainer {\n\ttext-align: left;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-4xs);\n\t}\n}\n</style>\n","<template>\n\t<n8n-tabs\n\t\t:options=\"options\"\n\t\t:modelValue=\"modelValue\"\n\t\t@update:modelValue=\"onTabSelect\"\n\t\t@tooltipClick=\"onTooltipClick\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tBUILTIN_NODES_DOCS_URL,\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tNPM_PACKAGE_DOCS_BASE_URL,\n} from '@/constants';\nimport type { INodeUi, ITab } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\n\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tname: 'NodeSettingsTabs',\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\treturn {\n\t\t\texternalHooks,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useWorkflowsStore),\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdocumentationUrl(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\n\t\t\tif (!nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (nodeType.documentationUrl && nodeType.documentationUrl.startsWith('http')) {\n\t\t\t\treturn nodeType.documentationUrl;\n\t\t\t}\n\n\t\t\tconst utmTags =\n\t\t\t\t'?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link' +\n\t\t\t\t'&utm_campaign=' +\n\t\t\t\tnodeType.name;\n\n\t\t\t// Built-in node documentation available via its codex entry\n\t\t\tconst primaryDocUrl = nodeType.codex?.resources?.primaryDocumentation?.[0]?.url;\n\t\t\tif (primaryDocUrl) {\n\t\t\t\treturn primaryDocUrl + utmTags;\n\t\t\t}\n\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\treturn `${NPM_PACKAGE_DOCS_BASE_URL}${nodeType.name.split('.')[0]}`;\n\t\t\t}\n\n\t\t\t// Fallback to the root of the node documentation\n\t\t\treturn BUILTIN_NODES_DOCS_URL + utmTags;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\t\t\tif (nodeType) {\n\t\t\t\treturn isCommunityPackageName(nodeType.name);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tpackageName(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription;\n\t\t\treturn nodeType.name.split('.')[0];\n\t\t},\n\t\toptions(): ITab[] {\n\t\t\tconst options: ITab[] = [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.parameters'),\n\t\t\t\t\tvalue: 'params',\n\t\t\t\t},\n\t\t\t];\n\t\t\tif (this.documentationUrl) {\n\t\t\t\toptions.push({\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.docs'),\n\t\t\t\t\tvalue: 'docs',\n\t\t\t\t\thref: this.documentationUrl,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\toptions.push({\n\t\t\t\t\ticon: 'cube',\n\t\t\t\t\tvalue: 'communityNode',\n\t\t\t\t\talign: 'right',\n\t\t\t\t\ttooltip: this.$locale.baseText('generic.communityNode.tooltip', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdocUrl: COMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\t\t\t\t\tpackageName: this.packageName,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\t// If both tabs have align right, both will have excessive left margin\n\t\t\tconst pushCogRight = this.isCommunityNode ? false : true;\n\t\t\toptions.push({\n\t\t\t\ticon: 'cog',\n\t\t\t\tvalue: 'settings',\n\t\t\t\talign: pushCogRight ? 'right' : undefined,\n\t\t\t});\n\n\t\t\treturn options;\n\t\t},\n\t},\n\tmethods: {\n\t\tonTabSelect(tab: string) {\n\t\t\tif (tab === 'docs' && this.nodeType) {\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.onDocumentationUrlClick', {\n\t\t\t\t\tnodeType: this.nodeType as INodeTypeDescription,\n\t\t\t\t\tdocumentationUrl: this.documentationUrl,\n\t\t\t\t});\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'docs',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' && this.nodeType) {\n\t\t\t\tthis.$telemetry.track('User viewed node settings', {\n\t\t\t\t\tnode_type: (this.nodeType as INodeTypeDescription).name,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' || tab === 'params') {\n\t\t\t\tthis.$emit('update:modelValue', tab);\n\t\t\t}\n\t\t},\n\t\tonTooltipClick(tab: string, event: MouseEvent) {\n\t\t\tif (tab === 'communityNode' && (event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr docs link', { source: 'node details view' });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n#communityNode > div {\n\tcursor: auto;\n\n\t&:hover {\n\t\tcolor: unset;\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"webhooksNode.length\" class=\"webhooks\">\n\t\t<div\n\t\t\tclass=\"clickable headline\"\n\t\t\t:class=\"{ expanded: !isMinimized }\"\n\t\t\t@click=\"isMinimized = !isMinimized\"\n\t\t\t:title=\"isMinimized ? baseText.clickToDisplay : baseText.clickToHide\"\n\t\t>\n\t\t\t<font-awesome-icon icon=\"angle-right\" class=\"minimize-button minimize-icon\" />\n\t\t\t{{ baseText.toggleTitle }}\n\t\t</div>\n\t\t<el-collapse-transition>\n\t\t\t<div class=\"node-webhooks\" v-if=\"!isMinimized\">\n\t\t\t\t<div class=\"url-selection\">\n\t\t\t\t\t<el-row>\n\t\t\t\t\t\t<el-col :span=\"24\">\n\t\t\t\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\t\t\t\tv-model=\"showUrlFor\"\n\t\t\t\t\t\t\t\t:options=\"[\n\t\t\t\t\t\t\t\t\t{ label: baseText.testUrl, value: 'test' },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: baseText.productionUrl,\n\t\t\t\t\t\t\t\t\t\tvalue: 'production',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</el-col>\n\t\t\t\t\t</el-row>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-for=\"(webhook, index) in webhooksNode.filter((webhook) => !webhook.ndvHideUrl)\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"item\"\n\t\t\t\t\t:content=\"baseText.clickToCopy\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"!webhook.ndvHideMethod\" class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"http-field\">\n\t\t\t\t\t\t\t<div class=\"http-method\">\n\t\t\t\t\t\t\t\t{{ getWebhookExpressionValue(webhook, 'httpMethod') }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"url-field\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"url-field-full-width\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</el-collapse-transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { INodeTypeDescription, IWebhookDescription } from 'n8n-workflow';\nimport { defineComponent } from 'vue';\n\nimport { useToast } from '@/composables/useToast';\nimport { FORM_TRIGGER_NODE_TYPE, OPEN_URL_PANEL_TRIGGER_NODE_TYPES } from '@/constants';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\n\nexport default defineComponent({\n\tname: 'NodeWebhooks',\n\tmixins: [copyPaste, workflowHelpers],\n\tprops: [\n\t\t'node', // NodeUi\n\t\t'nodeType', // INodeTypeDescription\n\t],\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisMinimized: this.nodeType && !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name),\n\t\t\tshowUrlFor: 'test',\n\t\t};\n\t},\n\tcomputed: {\n\t\twebhooksNode(): IWebhookDescription[] {\n\t\t\tif (this.nodeType === null || this.nodeType.webhooks === undefined) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn (this.nodeType as INodeTypeDescription).webhooks!.filter(\n\t\t\t\t(webhookData) => webhookData.restartWebhook !== true,\n\t\t\t);\n\t\t},\n\t\tbaseText() {\n\t\t\tconst nodeType = this.nodeType.name;\n\t\t\tswitch (nodeType) {\n\t\t\t\tcase FORM_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeWebhooks.clickToDisplayWebhookUrls.formTrigger',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls.formTrigger'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title.formTrigger'),\n\t\t\t\t\t\tcopyMessage: this.$locale.baseText('nodeWebhooks.showMessage.message.formTrigger'),\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText('nodeWebhooks.clickToDisplayWebhookUrls'),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title'),\n\t\t\t\t\t\tcopyMessage: undefined,\n\t\t\t\t\t};\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tcopyWebhookUrl(webhookData: IWebhookDescription): void {\n\t\t\tconst webhookUrl = this.getWebhookUrlDisplay(webhookData);\n\t\t\tthis.copyToClipboard(webhookUrl);\n\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.baseText.copyTitle,\n\t\t\t\tmessage: this.baseText.copyMessage,\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'parameters',\n\t\t\t\ttype: `${this.showUrlFor} url`,\n\t\t\t});\n\t\t},\n\t\tgetWebhookUrlDisplay(webhookData: IWebhookDescription): string {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.getWebhookUrl(webhookData, this.node, this.showUrlFor);\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t},\n\twatch: {\n\t\tnode() {\n\t\t\tthis.isMinimized = !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name);\n\t\t},\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.webhooks {\n\tpadding-bottom: var(--spacing-xs);\n\tmargin: var(--spacing-xs) 0;\n\tborder-bottom: 1px solid var(--color-text-lighter);\n\n\t.headline {\n\t\tcolor: $color-primary;\n\t\tfont-weight: 600;\n\t\tfont-size: var(--font-size-2xs);\n\t}\n}\n\n.http-field {\n\tposition: absolute;\n\twidth: 50px;\n\tdisplay: inline-block;\n\ttop: calc(50% - 8px);\n}\n\n.http-method {\n\tbackground-color: var(--color-foreground-xdark);\n\twidth: 40px;\n\theight: 16px;\n\tline-height: 16px;\n\tmargin-left: 5px;\n\ttext-align: center;\n\tborder-radius: 2px;\n\tfont-size: var(--font-size-2xs);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-foreground-xlight);\n}\n\n.minimize-icon {\n\tfont-size: 1.3em;\n\tmargin-right: 0.5em;\n}\n\n.mode-selection-headline {\n\tline-height: 1.8em;\n}\n\n.node-webhooks {\n\tmargin-left: 1em;\n}\n\n.url-field {\n\tdisplay: inline-block;\n\twidth: calc(100% - 60px);\n\tmargin-left: 55px;\n}\n.url-field-full-width {\n\tdisplay: inline-block;\n\tmargin: 5px 10px;\n}\n\n.url-selection {\n\tmargin-top: var(--spacing-xs);\n}\n\n.minimize-button {\n\tdisplay: inline-block;\n\t-webkit-transition-duration: 0.5s;\n\t-moz-transition-duration: 0.5s;\n\t-o-transition-duration: 0.5s;\n\ttransition-duration: 0.5s;\n\n\t-webkit-transition-property: -webkit-transform;\n\t-moz-transition-property: -moz-transform;\n\t-o-transition-property: -o-transform;\n\ttransition-property: transform;\n}\n.expanded .minimize-button {\n\t-webkit-transform: rotate(90deg);\n\t-moz-transform: rotate(90deg);\n\t-o-transform: rotate(90deg);\n\ttransform: rotate(90deg);\n}\n\n.webhook-url {\n\tposition: relative;\n\ttop: 0;\n\twidth: 100%;\n\tfont-size: var(--font-size-2xs);\n\twhite-space: normal;\n\toverflow: visible;\n\ttext-overflow: initial;\n\tcolor: var(--color-text-dark);\n\ttext-align: left;\n\tdirection: ltr;\n\tword-break: break-all;\n}\n\n.webhook-wrapper {\n\tline-height: 1.5;\n\tposition: relative;\n\tmargin-top: var(--spacing-xs);\n\tbackground-color: var(--color-foreground-xlight);\n\tborder-radius: 3px;\n}\n</style>\n","<template>\n\t<div>\n\t\t<n8n-tooltip placement=\"bottom\" :disabled=\"!disabledHint\">\n\t\t\t<template #content>\n\t\t\t\t<div>{{ disabledHint }}</div>\n\t\t\t</template>\n\t\t\t<div>\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-bind=\"$attrs\"\n\t\t\t\t\t:loading=\"nodeRunning && !isListeningForEvents && !isListeningForWorkflowEvents\"\n\t\t\t\t\t:disabled=\"disabled || !!disabledHint\"\n\t\t\t\t\t:label=\"buttonLabel\"\n\t\t\t\t\t:type=\"type\"\n\t\t\t\t\t:size=\"size\"\n\t\t\t\t\t:icon=\"isFormTriggerNode && 'flask'\"\n\t\t\t\t\t:transparentBackground=\"transparent\"\n\t\t\t\t\t@click=\"onClick\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tWEBHOOK_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tMODAL_CONFIRM,\n\tFORM_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { workflowRun } from '@/mixins/workflowRun';\nimport { pinData } from '@/mixins/pinData';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tinheritAttrs: false,\n\tmixins: [workflowRun, pinData],\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tlabel: {\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\tsize: {\n\t\t\ttype: String,\n\t\t},\n\t\ttransparent: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\ttelemetrySource: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup(props, ctx) {\n\t\tconst externalHooks = useExternalHooks();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowRun.setup?.(props, ctx),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tnodeRunning(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\t(this.workflowsStore.isNodeExecuting(this.node.name) || triggeredNode === this.node.name)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tisManualTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === MANUAL_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisFormTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === FORM_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!this.nodeType?.group.includes('schedule');\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\n\t\t\treturn (\n\t\t\t\tthis.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tisListeningForWorkflowEvents(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.nodeRunning &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isScheduleTrigger &&\n\t\t\t\t!this.isManualTriggerNode\n\t\t\t);\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tdisabledHint(): string {\n\t\t\tif (this.isListeningForEvents) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.node.disabled) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.nodeIsDisabled');\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.hasIssues) {\n\t\t\t\tconst activeNode = this.ndvStore.activeNode;\n\t\t\t\tif (activeNode && activeNode.name !== this.nodeName) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.execute.fixPrevious');\n\t\t\t\t}\n\n\t\t\t\treturn this.$locale.baseText('ndv.execute.requiredFieldsMissing');\n\t\t\t}\n\n\t\t\tif (this.workflowRunning && !this.nodeRunning) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.workflowAlreadyRunning');\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tbuttonLabel(): string {\n\t\t\tif (this.isListeningForEvents || this.isListeningForWorkflowEvents) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.stopListening');\n\t\t\t}\n\n\t\t\tif (this.label) {\n\t\t\t\treturn this.label;\n\t\t\t}\n\n\t\t\tif (this.isWebhookNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.listenForTestEvent');\n\t\t\t}\n\n\t\t\tif (this.isFormTriggerNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.testStep');\n\t\t\t}\n\n\t\t\tif (this.isPollingTypeNode || this.nodeType?.mockManualExecution) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.fetchEvent');\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isScheduleTrigger &&\n\t\t\t\t!this.isManualTriggerNode &&\n\t\t\t\t!this.isFormTriggerNode\n\t\t\t) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.listenForEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('ndv.execute.executeNode');\n\t\t},\n\t},\n\tmethods: {\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('ndv.execute.stopWaitingForWebhook.error'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\n\t\tasync onClick() {\n\t\t\tif (this.isListeningForEvents) {\n\t\t\t\tawait this.stopWaitingForWebhook();\n\t\t\t} else if (this.isListeningForWorkflowEvents) {\n\t\t\t\tthis.$emit('stopExecution');\n\t\t\t} else {\n\t\t\t\tlet shouldUnpinAndExecute = false;\n\t\t\t\tif (this.hasPinData) {\n\t\t\t\t\tconst confirmResult = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.description'),\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.title'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.confirm'),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.cancel'),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tshouldUnpinAndExecute = confirmResult === MODAL_CONFIRM;\n\n\t\t\t\t\tif (shouldUnpinAndExecute && this.node) {\n\t\t\t\t\t\tthis.unsetPinData(this.node, 'unpin-and-execute-modal');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!this.hasPinData || shouldUnpinAndExecute) {\n\t\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\t\tnode_type: this.nodeType ? this.nodeType.name : null,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tsource: this.telemetrySource,\n\t\t\t\t\t\tsession_id: this.ndvStore.sessionId,\n\t\t\t\t\t};\n\t\t\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\t\t\tawait this.externalHooks.run('nodeExecuteButton.onClick', telemetryPayload);\n\n\t\t\t\t\tawait this.runWorkflow({\n\t\t\t\t\t\tdestinationNode: this.nodeName,\n\t\t\t\t\t\tsource: 'RunData.ExecuteNodeButton',\n\t\t\t\t\t});\n\t\t\t\t\tthis.$emit('execute');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'node-settings': true,\n\t\t\tdragging: dragging,\n\t\t}\"\n\t\t@keydown.stop\n\t>\n\t\t<div :class=\"$style.header\">\n\t\t\t<div class=\"header-side-menu\">\n\t\t\t\t<NodeTitle\n\t\t\t\t\tv-if=\"node\"\n\t\t\t\t\tclass=\"node-name\"\n\t\t\t\t\t:modelValue=\"node.name\"\n\t\t\t\t\t:nodeType=\"nodeType\"\n\t\t\t\t\t:readOnly=\"isReadOnly\"\n\t\t\t\t\t@update:modelValue=\"nameChanged\"\n\t\t\t\t></NodeTitle>\n\t\t\t\t<div v-if=\"isExecutable\">\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tv-if=\"!blockUI && node && nodeValid\"\n\t\t\t\t\t\tdata-test-id=\"node-execute-button\"\n\t\t\t\t\t\t:nodeName=\"node.name\"\n\t\t\t\t\t\t:disabled=\"outputPanelEditMode.enabled && !isTriggerNode\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\ttelemetrySource=\"parameters\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stopExecution=\"onStopExecution\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NodeSettingsTabs\n\t\t\t\tv-if=\"node && nodeValid\"\n\t\t\t\tv-model=\"openPanel\"\n\t\t\t\t:nodeType=\"nodeType\"\n\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t/>\n\t\t</div>\n\t\t<div class=\"node-is-not-valid\" v-if=\"node && !nodeValid\">\n\t\t\t<p :class=\"$style.warningIcon\">\n\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" />\n\t\t\t</p>\n\t\t\t<div class=\"missingNodeTitleContainer mt-s mb-xs\">\n\t\t\t\t<n8n-text size=\"large\" color=\"text-dark\" bold>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.title') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div v-if=\"isCommunityNode\" :class=\"$style.descriptionContainer\">\n\t\t\t\t<div class=\"mb-l\">\n\t\t\t\t\t<i18n-t\n\t\t\t\t\t\tkeypath=\"nodeSettings.communityNodeUnknown.description\"\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t@click=\"onMissingNodeTextClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #action>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://www.npmjs.com/package/${node.type.split('.')[0]}`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>{{ node.type.split('.')[0] }}</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</div>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"COMMUNITY_NODES_INSTALLATION_DOCS_URL\"\n\t\t\t\t\t@click=\"onMissingNodeLearnMoreLinkClick\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.installLink.text') }}\n\t\t\t\t</n8n-link>\n\t\t\t</div>\n\t\t\t<i18n-t v-else keypath=\"nodeSettings.nodeTypeUnknown.description\" tag=\"span\">\n\t\t\t\t<template #action>\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href=\"CUSTOM_NODES_DOCS_URL\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\tv-text=\"$locale.baseText('nodeSettings.nodeTypeUnknown.description.customNode')\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</div>\n\t\t<div class=\"node-parameters-wrapper\" data-test-id=\"node-parameters\" v-if=\"node && nodeValid\">\n\t\t\t<n8n-notice\n\t\t\t\tv-if=\"hasForeignCredential\"\n\t\t\t\t:content=\"\n\t\t\t\t\t$locale.baseText('nodeSettings.hasForeignCredential', {\n\t\t\t\t\t\tinterpolate: { owner: credentialOwnerName },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t/>\n\t\t\t<div v-show=\"openPanel === 'params'\">\n\t\t\t\t<node-webhooks :node=\"node\" :nodeType=\"nodeType\" />\n\n\t\t\t\t<parameter-input-list\n\t\t\t\t\tv-if=\"nodeValuesInitialized\"\n\t\t\t\t\t:parameters=\"parametersNoneSetting\"\n\t\t\t\t\t:hideDelete=\"true\"\n\t\t\t\t\t:nodeValues=\"nodeValues\"\n\t\t\t\t\t:isReadOnly=\"isReadOnly\"\n\t\t\t\t\t:hiddenIssuesInputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t@parameterBlur=\"onParameterBlur\"\n\t\t\t\t>\n\t\t\t\t\t<node-credentials\n\t\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t\t:readonly=\"isReadOnly\"\n\t\t\t\t\t\t:showAll=\"true\"\n\t\t\t\t\t\t@credentialSelected=\"credentialSelected\"\n\t\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t\t@blur=\"onParameterBlur\"\n\t\t\t\t\t\t:hide-issues=\"hiddenIssuesInputs.includes('credentials')\"\n\t\t\t\t\t/>\n\t\t\t\t</parameter-input-list>\n\t\t\t\t<div v-if=\"parametersNoneSetting.length === 0\" class=\"no-parameters\">\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t{{ $locale.baseText('nodeSettings.thisNodeDoesNotHaveAnyParameters') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"nodeHelpers.isCustomApiCallSelected(nodeValues)\"\n\t\t\t\t\tclass=\"parameter-item parameter-notice\"\n\t\t\t\t\tdata-test-id=\"node-parameters-http-notice\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-notice\n\t\t\t\t\t\t:content=\"\n\t\t\t\t\t\t\t$locale.baseText('nodeSettings.useTheHttpRequestNode', {\n\t\t\t\t\t\t\t\tinterpolate: { nodeTypeDisplayName: nodeType.displayName },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-show=\"openPanel === 'settings'\">\n\t\t\t\t<parameter-input-list\n\t\t\t\t\t:parameters=\"parametersSetting\"\n\t\t\t\t\t:nodeValues=\"nodeValues\"\n\t\t\t\t\t:isReadOnly=\"isReadOnly\"\n\t\t\t\t\t:hiddenIssuesInputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t@parameterBlur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<parameter-input-list\n\t\t\t\t\t:parameters=\"nodeSettings\"\n\t\t\t\t\t:hideDelete=\"true\"\n\t\t\t\t\t:nodeValues=\"nodeValues\"\n\t\t\t\t\t:isReadOnly=\"isReadOnly\"\n\t\t\t\t\t:hiddenIssuesInputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"\"\n\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t@parameterBlur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<div class=\"node-version\" data-test-id=\"node-version\">\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeSettings.nodeVersion', {\n\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\tnode: nodeType?.displayName as string,\n\t\t\t\t\t\t\t\tversion: node.typeVersion.toString(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t\t<span>({{ nodeVersionTag }})</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<n8n-block-ui :show=\"blockUI\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type {\n\tINodeTypeDescription,\n\tINodeParameters,\n\tINodeProperties,\n\tNodeParameterValue,\n} from 'n8n-workflow';\nimport { NodeHelpers, NodeConnectionType, deepCopy } from 'n8n-workflow';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tIUsedCredential,\n} from '@/Interface';\n\nimport {\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tCUSTOM_NODES_DOCS_URL,\n\tMAIN_NODE_PANEL_WIDTH,\n\tIMPORT_CURL_MODAL_KEY,\n} from '@/constants';\n\nimport NodeTitle from '@/components/NodeTitle.vue';\nimport ParameterInputList from '@/components/ParameterInputList.vue';\nimport NodeCredentials from '@/components/NodeCredentials.vue';\nimport NodeSettingsTabs from '@/components/NodeSettingsTabs.vue';\nimport NodeWebhooks from '@/components/NodeWebhooks.vue';\nimport { get, set, unset } from 'lodash-es';\n\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { RenameNodeCommand } from '@/models/history';\nimport useWorkflowsEEStore from '@/stores/workflows.ee.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport type { EventBus } from 'n8n-design-system';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\n\nexport default defineComponent({\n\tname: 'NodeSettings',\n\tcomponents: {\n\t\tNodeTitle,\n\t\tNodeCredentials,\n\t\tParameterInputList,\n\t\tNodeSettingsTabs,\n\t\tNodeWebhooks,\n\t\tNodeExecuteButton,\n\t},\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseHistoryStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseUIStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t),\n\t\tisCurlImportModalOpen(): boolean {\n\t\t\treturn this.uiStore.isModalOpen(IMPORT_CURL_MODAL_KEY);\n\t\t},\n\t\tisReadOnly(): boolean {\n\t\t\treturn this.readOnly || this.hasForeignCredential;\n\t\t},\n\t\tisExecutable(): boolean {\n\t\t\tif (this.nodeType && this.node) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, this.nodeType);\n\t\t\t\tconst inputNames = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tif (!inputNames.includes(NodeConnectionType.Main) && !this.isTriggerNode) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.executable || this.hasForeignCredential;\n\t\t},\n\t\tnodeTypeName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.displayName`,\n\t\t\t\t\tfallback: this.nodeType.name,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tnodeTypeVersions(): number[] {\n\t\t\tif (!this.node) return [];\n\t\t\treturn this.nodeTypesStore.getNodeVersions(this.node.type);\n\t\t},\n\t\tlatestVersion(): number {\n\t\t\treturn Math.max(...this.nodeTypeVersions);\n\t\t},\n\t\tisLatestNodeVersion(): boolean {\n\t\t\treturn this.latestVersion === this.node?.typeVersion;\n\t\t},\n\t\tnodeVersionTag(): string {\n\t\t\tif (!this.nodeType || this.nodeType.hidden) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.deprecated');\n\t\t\t}\n\n\t\t\tif (this.isLatestNodeVersion) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.latest');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeSettings.latestVersion', {\n\t\t\t\tinterpolate: { version: this.latestVersion.toString() },\n\t\t\t});\n\t\t},\n\t\tnodeTypeDescription(): string {\n\t\t\tif (this.nodeType?.description) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.description`,\n\t\t\t\t\tfallback: this.nodeType.description,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.noDescriptionFound');\n\t\t\t}\n\t\t},\n\t\theaderStyle(): object {\n\t\t\tif (!this.node) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t'background-color': this.node.color,\n\t\t\t};\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tparametersSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparametersNoneSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn !item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparameters(): INodeProperties[] {\n\t\t\tif (this.nodeType === null) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn this.nodeType.properties;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\treturn isCommunityPackageName(this.node?.type);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node?.type);\n\t\t},\n\t\tworkflowOwnerName(): string {\n\t\t\treturn this.workflowsEEStore.getWorkflowOwnerName(`${this.workflowsStore.workflowId}`);\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t\tusedCredentials(): IUsedCredential[] {\n\t\t\treturn Object.values(this.workflowsStore.usedCredentials).filter((credential) => {\n\t\t\t\treturn Object.values(this.node?.credentials || []).find((nodeCredential) => {\n\t\t\t\t\treturn nodeCredential.id === credential.id;\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tcredentialOwnerName(): string {\n\t\t\tconst credential = this.usedCredentials\n\t\t\t\t? Object.values(this.usedCredentials).find((credential) => {\n\t\t\t\t\t\treturn credential.id === this.foreignCredentials[0];\n\t\t\t\t })\n\t\t\t\t: undefined;\n\n\t\t\treturn this.credentialsStore.getCredentialOwnerName(credential);\n\t\t},\n\t},\n\tprops: {\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t},\n\t\tdragging: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription>,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tforeignCredentials: {\n\t\t\ttype: Array as PropType<string[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\texecutable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tnodeValid: true,\n\t\t\tnodeColor: null,\n\t\t\topenPanel: 'params',\n\t\t\tnodeValues: {\n\t\t\t\tcolor: '#ff0000',\n\t\t\t\talwaysOutputData: false,\n\t\t\t\texecuteOnce: false,\n\t\t\t\tnotesInFlow: false,\n\t\t\t\tonError: 'stopWorkflow',\n\t\t\t\tretryOnFail: false,\n\t\t\t\tmaxTries: 3,\n\t\t\t\twaitBetweenTries: 1000,\n\t\t\t\tnotes: '',\n\t\t\t\tparameters: {},\n\t\t\t} as INodeParameters,\n\t\t\tnodeValuesInitialized: false, // Used to prevent nodeValues from being overwritten by defaults on reopening ndv\n\n\t\t\tnodeSettings: [] as INodeProperties[],\n\t\t\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\tCUSTOM_NODES_DOCS_URL,\n\t\t\tMAIN_NODE_PANEL_WIDTH,\n\t\t\thiddenIssuesInputs: [] as string[],\n\t\t};\n\t},\n\twatch: {\n\t\tnode(newNode, oldNode) {\n\t\t\tthis.setNodeValues();\n\t\t},\n\t\tisCurlImportModalOpen(newValue, oldValue) {\n\t\t\tif (newValue === false) {\n\t\t\t\tlet parameters = this.uiStore.getHttpNodeParameters || '';\n\n\t\t\t\tif (!parameters) return;\n\n\t\t\t\ttry {\n\t\t\t\t\tparameters = JSON.parse(parameters) as {\n\t\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t\t};\n\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tthis.valueChanged({\n\t\t\t\t\t\tnode: this.node.name,\n\t\t\t\t\t\tname: 'parameters',\n\t\t\t\t\t\tvalue: parameters,\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.uiStore.setHttpNodeParameters({ name: IMPORT_CURL_MODAL_KEY, parameters: '' });\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tpopulateHiddenIssuesSet() {\n\t\t\tif (!this.node || !this.workflowsStore.isNodePristine(this.node.name)) return;\n\n\t\t\tthis.hiddenIssuesInputs.push('credentials');\n\t\t\tthis.parametersNoneSetting.forEach((parameter) => {\n\t\t\t\tthis.hiddenIssuesInputs.push(parameter.name);\n\t\t\t});\n\n\t\t\tthis.workflowsStore.setNodePristine(this.node.name, false);\n\t\t},\n\t\tpopulateSettings() {\n\t\t\tif (this.isExecutable && !this.isTriggerNode) {\n\t\t\t\tthis.nodeSettings.push(\n\t\t\t\t\t...([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.alwaysOutputData.displayName'),\n\t\t\t\t\t\t\tname: 'alwaysOutputData',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.alwaysOutputData.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.executeOnce.displayName'),\n\t\t\t\t\t\t\tname: 'executeOnce',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.executeOnce.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.retryOnFail.displayName'),\n\t\t\t\t\t\t\tname: 'retryOnFail',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.retryOnFail.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.maxTries.displayName'),\n\t\t\t\t\t\t\tname: 'maxTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 2,\n\t\t\t\t\t\t\t\tmaxValue: 5,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 3,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.maxTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.waitBetweenTries.displayName'),\n\t\t\t\t\t\t\tname: 'waitBetweenTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 0,\n\t\t\t\t\t\t\t\tmaxValue: 5000,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 1000,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.waitBetweenTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.onError.displayName'),\n\t\t\t\t\t\t\tname: 'onError',\n\t\t\t\t\t\t\ttype: 'options',\n\t\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'stopWorkflow',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueRegularOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueErrorOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: 'stopWorkflow',\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.onError.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t] as INodeProperties[]),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.nodeSettings.push(\n\t\t\t\t...([\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notes.displayName'),\n\t\t\t\t\t\tname: 'notes',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\trows: 5,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notes.description'),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notesInFlow.displayName'),\n\t\t\t\t\t\tname: 'notesInFlow',\n\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notesInFlow.description'),\n\t\t\t\t\t},\n\t\t\t\t] as INodeProperties[]),\n\t\t\t);\n\t\t},\n\t\tonParameterBlur(parameterName: string) {\n\t\t\tthis.hiddenIssuesInputs = this.hiddenIssuesInputs.filter((name) => name !== parameterName);\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\tthis.$emit('activate');\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\tthis.$emit('execute');\n\t\t},\n\t\tsetValue(name: string, value: NodeParameterValue) {\n\t\t\tconst nameParts = name.split('.');\n\t\t\tlet lastNamePart: string | undefined = nameParts.pop();\n\n\t\t\tlet isArray = false;\n\t\t\tif (lastNamePart !== undefined && lastNamePart.includes('[')) {\n\t\t\t\t// It includes an index so we have to extract it\n\t\t\t\tconst lastNameParts = lastNamePart.match(/(.*)\\[(\\d+)\\]$/);\n\t\t\t\tif (lastNameParts) {\n\t\t\t\t\tnameParts.push(lastNameParts[1]);\n\t\t\t\t\tlastNamePart = lastNameParts[2];\n\t\t\t\t\tisArray = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the value so that everything updates correctly in the UI\n\t\t\tif (nameParts.length === 0) {\n\t\t\t\t// Data is on top level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = this.nodeValues;\n\t\t\t\t\tthis.nodeValues = remainingNodeValues;\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t[lastNamePart as string]: value,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Data is on lower level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tlet tempValue = get(this.nodeValues, nameParts.join('.')) as\n\t\t\t\t\t\t| INodeParameters\n\t\t\t\t\t\t| INodeParameters[];\n\n\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = tempValue;\n\t\t\t\t\ttempValue = remainingNodeValues;\n\n\t\t\t\t\tif (isArray && (tempValue as INodeParameters[]).length === 0) {\n\t\t\t\t\t\t// If a value from an array got delete and no values are left\n\t\t\t\t\t\t// delete also the parent\n\t\t\t\t\t\tlastNamePart = nameParts.pop();\n\t\t\t\t\t\ttempValue = get(this.nodeValues, nameParts.join('.')) as INodeParameters;\n\t\t\t\t\t\tconst { [lastNamePart]: removedArrayNodeValue, ...remainingArrayNodeValues } =\n\t\t\t\t\t\t\ttempValue;\n\t\t\t\t\t\ttempValue = remainingArrayNodeValues;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tif (typeof value === 'object') {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tdeepCopy(value),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.nodeValues = { ...this.nodeValues };\n\t\t},\n\t\tcredentialSelected(updateInformation: INodeUpdatePropertiesInformation) {\n\t\t\t// Update the values on the node\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(updateInformation.name);\n\n\t\t\tif (node) {\n\t\t\t\t// Update the issues\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssues(node);\n\t\t\t}\n\n\t\t\tvoid this.externalHooks.run('nodeSettings.credentialSelected', { updateInformation });\n\t\t},\n\t\tnameChanged(name: string) {\n\t\t\tif (this.node) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(this.node.name, name));\n\t\t\t}\n\t\t\t// @ts-ignore\n\t\t\tthis.valueChanged({\n\t\t\t\tvalue: name,\n\t\t\t\tname: 'name',\n\t\t\t});\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tlet newValue: NodeParameterValue;\n\n\t\t\tif (parameterData.hasOwnProperty('value')) {\n\t\t\t\t// New value is given\n\t\t\t\tnewValue = parameterData.value as string | number;\n\t\t\t} else {\n\t\t\t\t// Get new value from nodeData where it is set already\n\t\t\t\tnewValue = get(this.nodeValues, parameterData.name) as NodeParameterValue;\n\t\t\t}\n\t\t\t// Save the node name before we commit the change because\n\t\t\t// we need the old name to rename the node properly\n\t\t\tconst nodeNameBefore = parameterData.node || this.node?.name;\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeNameBefore);\n\n\t\t\tif (node === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'onError') {\n\t\t\t\t// If that parameter changes, we need to redraw the connections, as the error output may need to be added or removed\n\t\t\t\tthis.$emit('redrawRequired');\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'name') {\n\t\t\t\t// Name of node changed so we have to set also the new node name as active\n\n\t\t\t\t// Update happens in NodeView so emit event\n\t\t\t\tconst sendData = {\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t\toldValue: nodeNameBefore,\n\t\t\t\t\tname: parameterData.name,\n\t\t\t\t};\n\t\t\t\tthis.$emit('valueChanged', sendData);\n\t\t\t} else if (parameterData.name === 'parameters') {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\tfor (const parameterName of Object.keys(parameterData.value)) {\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tnewValue = parameterData.value[parameterName];\n\n\t\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t\t// actual parameter name\n\t\t\t\t\tconst parameterPath = parameterName.split('.').slice(1).join('.');\n\n\t\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t\t// the needed data like path and index\n\t\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t\t// Apply the new value\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tif (parameterData[parameterName] === undefined && parameterPathArray !== null) {\n\t\t\t\t\t\t// Delete array item\n\t\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\t\tparameterPath,\n\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\t\toldNodeParameters,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeParameters) {\n\t\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\t}\n\t\t\t} else if (parameterData.name.startsWith('parameters.')) {\n\t\t\t\t// A node parameter changed\n\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t// actual parameter name\n\t\t\t\tconst parameterPath = parameterData.name.split('.').slice(1).join('.');\n\n\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t// the needed data like path and index\n\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t// Apply the new value\n\t\t\t\tif (parameterData.value === undefined && parameterPathArray !== null) {\n\t\t\t\t\t// Delete array item\n\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update the data in vuex\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\tparameterPath,\n\t\t\t\t\tnewValue,\n\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\toldNodeParameters,\n\t\t\t\t});\n\n\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\tthis.$telemetry.trackNodeParametersValuesChange(nodeType.name, parameterData);\n\t\t\t} else {\n\t\t\t\t// A property on the node itself changed\n\n\t\t\t\t// Update data in settings\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t[parameterData.name]: newValue,\n\t\t\t\t};\n\n\t\t\t\t// Update data in vuex\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tkey: parameterData.name,\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeValue(updateInformation);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Sets the values of the active node in the internal settings variables\n\t\t */\n\t\tsetNodeValues() {\n\t\t\t// No node selected\n\t\t\tif (!this.node) {\n\t\t\t\tthis.nodeValuesInitialized = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.nodeType !== null) {\n\t\t\t\tthis.nodeValid = true;\n\n\t\t\t\tconst foundNodeSettings = [];\n\t\t\t\tif (this.node.color) {\n\t\t\t\t\tfoundNodeSettings.push('color');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tcolor: this.node.color,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notes) {\n\t\t\t\t\tfoundNodeSettings.push('notes');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotes: this.node.notes,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.alwaysOutputData) {\n\t\t\t\t\tfoundNodeSettings.push('alwaysOutputData');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\talwaysOutputData: this.node.alwaysOutputData,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.executeOnce) {\n\t\t\t\t\tfoundNodeSettings.push('executeOnce');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\texecuteOnce: this.node.executeOnce,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.continueOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: 'continueRegularOutput',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.onError) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: this.node.onError,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notesInFlow) {\n\t\t\t\t\tfoundNodeSettings.push('notesInFlow');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotesInFlow: this.node.notesInFlow,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.retryOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('retryOnFail');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tretryOnFail: this.node.retryOnFail,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.maxTries) {\n\t\t\t\t\tfoundNodeSettings.push('maxTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tmaxTries: this.node.maxTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.waitBetweenTries) {\n\t\t\t\t\tfoundNodeSettings.push('waitBetweenTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\twaitBetweenTries: this.node.waitBetweenTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Set default node settings\n\t\t\t\tfor (const nodeSetting of this.nodeSettings) {\n\t\t\t\t\tif (!foundNodeSettings.includes(nodeSetting.name)) {\n\t\t\t\t\t\t// Set default value\n\t\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t\t[nodeSetting.name]: nodeSetting.default,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\tparameters: deepCopy(this.node.parameters),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.nodeValid = false;\n\t\t\t}\n\n\t\t\tthis.nodeValuesInitialized = true;\n\t\t},\n\t\tonMissingNodeTextClick(event: MouseEvent) {\n\t\t\tif ((event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr browse button', {\n\t\t\t\t\tsource: 'cnr missing node modal',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonMissingNodeLearnMoreLinkClick() {\n\t\t\tthis.$telemetry.track('user clicked cnr docs link', {\n\t\t\t\tsource: 'missing node modal source',\n\t\t\t\tpackage_name: this.node?.type.split('.')[0],\n\t\t\t\tnode_type: this.node?.type,\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.openPanel = 'settings';\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.populateHiddenIssuesSet();\n\t\tthis.populateSettings();\n\t\tthis.setNodeValues();\n\t\tthis.eventBus?.on('openSettings', this.openSettings);\n\n\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node as INodeUi, this.nodeType);\n\t},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('openSettings', this.openSettings);\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.header {\n\tbackground-color: var(--color-background-base);\n}\n\n.warningIcon {\n\tcolor: var(--color-text-lighter);\n\tfont-size: var(--font-size-2xl);\n}\n\n.descriptionContainer {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-settings {\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n\tbackground-color: var(--color-background-xlight);\n\theight: 100%;\n\twidth: 100%;\n\n\t.no-parameters {\n\t\tmargin-top: var(--spacing-xs);\n\t}\n\n\t.header-side-menu {\n\t\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) var(--spacing-s);\n\t\tfont-size: var(--font-size-l);\n\t\tdisplay: flex;\n\n\t\t.node-name {\n\t\t\tpadding-top: var(--spacing-5xs);\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t.node-is-not-valid {\n\t\theight: 75%;\n\t\tpadding: 10px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttext-align: center;\n\t\tline-height: var(--font-line-height-regular);\n\t}\n\n\t.node-parameters-wrapper {\n\t\toverflow-y: auto;\n\t\tpadding: 0 var(--spacing-m) 200px var(--spacing-m);\n\t\tflex-grow: 1;\n\t}\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.parameter-content {\n\tfont-size: 0.9em;\n\tmargin-right: -15px;\n\tmargin-left: -15px;\n\tinput {\n\t\twidth: calc(100% - 35px);\n\t\tpadding: 5px;\n\t}\n\tselect {\n\t\twidth: calc(100% - 20px);\n\t\tpadding: 5px;\n\t}\n\n\t&:before {\n\t\tdisplay: table;\n\t\tcontent: ' ';\n\t\tposition: relative;\n\t\tbox-sizing: border-box;\n\t\tclear: both;\n\t}\n}\n\n.parameter-wrapper {\n\tpadding: 0 1em;\n}\n\n.color-reset-button-wrapper {\n\tposition: relative;\n}\n.color-reset-button {\n\tposition: absolute;\n\tright: 7px;\n\ttop: -25px;\n}\n\n.node-version {\n\tborder-top: var(--border-base);\n\tfont-size: var(--font-size-xs);\n\tfont-size: var(--font-size-2xs);\n\tpadding: var(--spacing-xs) 0 var(--spacing-2xs) 0;\n\tcolor: var(--color-text-light);\n}\n\n.parameter-value {\n\tinput.expression {\n\t\tborder-style: dashed;\n\t\tborder-color: #ff9600;\n\t\tdisplay: inline-block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tbox-sizing: border-box;\n\t\tbackground-color: #793300;\n\t}\n}\n</style>\n","<template>\n\t<component\n\t\t:is=\"tag\"\n\t\t:class=\"{ [$style.dragging]: isDragging }\"\n\t\t@mousedown=\"onDragStart\"\n\t\tref=\"wrapper\"\n\t>\n\t\t<slot :isDragging=\"isDragging\"></slot>\n\n\t\t<Teleport to=\"body\">\n\t\t\t<div ref=\"draggable\" :class=\"$style.draggable\" :style=\"draggableStyle\" v-show=\"isDragging\">\n\t\t\t\t<slot name=\"preview\" :canDrop=\"canDrop\" :el=\"draggingEl\"></slot>\n\t\t\t</div>\n\t\t</Teleport>\n\t</component>\n</template>\n\n<script lang=\"ts\">\nimport type { XYPosition } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { mapStores } from 'pinia';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'draggable',\n\tprops: {\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\tdata: {\n\t\t\ttype: String,\n\t\t},\n\t\ttag: {\n\t\t\ttype: String,\n\t\t\tdefault: 'div',\n\t\t},\n\t\ttargetDataKey: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tdata() {\n\t\tconst draggablePosition = {\n\t\t\tx: -100,\n\t\t\ty: -100,\n\t\t};\n\n\t\treturn {\n\t\t\tisDragging: false,\n\t\t\tdraggablePosition,\n\t\t\tdraggingEl: null as null | HTMLElement,\n\t\t\tdraggableStyle: {\n\t\t\t\ttransform: `translate(${draggablePosition.x}px, ${draggablePosition.y}px)`,\n\t\t\t},\n\t\t\tanimationFrameId: 0,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tcanDrop(): boolean {\n\t\t\treturn this.ndvStore.canDraggableDrop;\n\t\t},\n\t\tstickyPosition(): XYPosition | null {\n\t\t\treturn this.ndvStore.draggableStickyPos;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetDraggableStyle() {\n\t\t\tthis.draggableStyle = {\n\t\t\t\ttransform: `translate(${this.draggablePosition.x}px, ${this.draggablePosition.y}px)`,\n\t\t\t};\n\t\t},\n\t\tonDragStart(e: MouseEvent) {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.draggingEl = e.target as HTMLElement;\n\t\t\tif (this.targetDataKey && this.draggingEl.dataset?.target !== this.targetDataKey) {\n\t\t\t\tthis.draggingEl = this.draggingEl.closest(\n\t\t\t\t\t`[data-target=\"${this.targetDataKey}\"]`,\n\t\t\t\t) as HTMLElement;\n\t\t\t}\n\n\t\t\tif (this.targetDataKey && this.draggingEl?.dataset?.target !== this.targetDataKey) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tthis.isDragging = false;\n\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\tthis.setDraggableStyle();\n\n\t\t\twindow.addEventListener('mousemove', this.onDrag);\n\t\t\twindow.addEventListener('mouseup', this.onDragEnd);\n\n\t\t\t// blur so that any focused inputs update value\n\t\t\tconst activeElement = document.activeElement as HTMLElement;\n\t\t\tif (activeElement) {\n\t\t\t\tactiveElement.blur();\n\t\t\t}\n\t\t},\n\t\tonDrag(e: MouseEvent) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.isDragging) {\n\t\t\t\tthis.isDragging = true;\n\n\t\t\t\tconst data =\n\t\t\t\t\tthis.targetDataKey && this.draggingEl ? this.draggingEl.dataset.value : this.data || '';\n\t\t\t\tthis.ndvStore.draggableStartDragging({ type: this.type, data: data || '' });\n\n\t\t\t\tthis.$emit('dragstart', this.draggingEl);\n\t\t\t\tdocument.body.style.cursor = 'grabbing';\n\t\t\t}\n\n\t\t\tthis.animationFrameId = window.requestAnimationFrame(() => {\n\t\t\t\tif (this.canDrop && this.stickyPosition) {\n\t\t\t\t\tthis.draggablePosition = { x: this.stickyPosition[0], y: this.stickyPosition[1] };\n\t\t\t\t} else {\n\t\t\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\t\t}\n\t\t\t\tthis.setDraggableStyle();\n\t\t\t\tthis.$emit('drag', this.draggablePosition);\n\t\t\t});\n\t\t},\n\t\tonDragEnd() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdocument.body.style.cursor = 'unset';\n\t\t\twindow.removeEventListener('mousemove', this.onDrag);\n\t\t\twindow.removeEventListener('mouseup', this.onDragEnd);\n\t\t\twindow.cancelAnimationFrame(this.animationFrameId);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('dragend', this.draggingEl);\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.draggingEl = null;\n\t\t\t\tthis.ndvStore.draggableStopDragging();\n\t\t\t}, 0);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragging {\n\tvisibility: visible;\n\tcursor: grabbing;\n}\n\n.draggable {\n\tposition: fixed;\n\tz-index: 9999999;\n\ttop: 0;\n\tleft: 0;\n}\n\n.draggable-data-transfer {\n\twidth: 0;\n\theight: 0;\n}\n</style>\n","<template>\n\t<Draggable\n\t\ttype=\"panel-resize\"\n\t\t@drag=\"onDrag\"\n\t\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t\t:class=\"$style.dragContainer\"\n\t>\n\t\t<template #default=\"{ isDragging }\">\n\t\t\t<div :class=\"{ [$style.dragButton]: true }\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveLeft\"\n\t\t\t\t\t:class=\"{ [$style.leftArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-left\" />\n\t\t\t\t</span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveRight\"\n\t\t\t\t\t:class=\"{ [$style.rightArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-right\" />\n\t\t\t\t</span>\n\t\t\t\t<div :class=\"$style.grid\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</Draggable>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport Draggable from './Draggable.vue';\n\nexport default defineComponent({\n\tcomponents: {\n\t\tDraggable,\n\t},\n\tprops: {\n\t\tcanMoveRight: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanMoveLeft: {\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\tmethods: {\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tthis.$emit('drag', e);\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.$emit('dragstart');\n\t\t},\n\t\tonDragEnd() {\n\t\t\tthis.$emit('dragend');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragContainer {\n\tpointer-events: all;\n}\n.dragButton {\n\tbackground-color: var(--color-background-base);\n\twidth: 64px;\n\theight: 21px;\n\tborder-top-left-radius: var(--border-radius-base);\n\tborder-top-right-radius: var(--border-radius-base);\n\tcursor: grab;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\toverflow: visible;\n\tposition: relative;\n\tz-index: 3;\n\n\t&:hover {\n\t\t.leftArrow,\n\t\t.rightArrow {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.visible {\n\tvisibility: visible !important;\n}\n\n.arrow {\n\tposition: absolute;\n\tcolor: var(--color-background-xlight);\n\tfont-size: var(--font-size-3xs);\n\tvisibility: hidden;\n\ttop: 0;\n}\n\n.leftArrow {\n\tcomposes: arrow;\n\tleft: -16px;\n}\n\n.rightArrow {\n\tcomposes: arrow;\n\tright: -16px;\n}\n\n.grid {\n\t> div {\n\t\tdisplay: flex;\n\n\t\t&:first-child {\n\t\t\t> div {\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\t\t}\n\n\t\t> div {\n\t\t\theight: 2px;\n\t\t\twidth: 2px;\n\t\t\tborder-radius: 50%;\n\t\t\tbackground-color: var(--color-foreground-xdark);\n\t\t\tmargin-right: 4px;\n\n\t\t\t&:last-child {\n\t\t\t\tmargin-right: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<aside :class=\"$style.floatingNodes\">\n\t\t<ul\n\t\t\tv-for=\"connectionGroup in connectionGroups\"\n\t\t\t:class=\"[$style.nodesList, $style[connectionGroup]]\"\n\t\t\t:key=\"connectionGroup\"\n\t\t>\n\t\t\t<template v-for=\"{ node, nodeType } in connectedNodes[connectionGroup]\">\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\t:placement=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\tv-if=\"node && nodeType\"\n\t\t\t\t\t:teleported=\"false\"\n\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t:offset=\"60\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>{{ node.name }}</template>\n\n\t\t\t\t\t<li\n\t\t\t\t\t\t:class=\"$style.connectedNode\"\n\t\t\t\t\t\t@click=\"$emit('switchSelectedNode', node.name)\"\n\t\t\t\t\t\tdata-test-id=\"floating-node\"\n\t\t\t\t\t\t:data-node-name=\"node.name\"\n\t\t\t\t\t\t:data-node-placement=\"connectionGroup\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<node-icon\n\t\t\t\t\t\t\t:nodeType=\"nodeType\"\n\t\t\t\t\t\t\t:nodeName=\"node.name\"\n\t\t\t\t\t\t\t:tooltip-position=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\t\t\t:size=\"35\"\n\t\t\t\t\t\t\tcircle\n\t\t\t\t\t\t/>\n\t\t\t\t\t</li>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</template>\n\t\t</ul>\n\t</aside>\n</template>\n\n<script setup lang=\"ts\">\nimport type { INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { computed, onMounted, onBeforeUnmount } from 'vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport type { INodeTypeDescription } from 'n8n-workflow';\n\ninterface Props {\n\trootNode: INodeUi;\n\ttype: 'input' | 'sub-input' | 'sub-output' | 'output';\n}\nconst enum FloatingNodePosition {\n\ttop = 'outputSub',\n\tright = 'outputMain',\n\tbottom = 'inputSub',\n\tleft = 'inputMain',\n}\nconst props = defineProps<Props>();\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst workflow = workflowsStore.getCurrentWorkflow();\nconst emit = defineEmits(['switchSelectedNode']);\n\ninterface NodeConfig {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n}\nfunction moveNodeDirection(direction: FloatingNodePosition) {\n\tconst matchedDirectionNode = connectedNodes.value[direction][0];\n\tif (matchedDirectionNode) {\n\t\temit('switchSelectedNode', matchedDirectionNode.node.name);\n\t}\n}\n\nfunction onKeyDown(e: KeyboardEvent) {\n\tif (e.shiftKey && e.altKey && (e.ctrlKey || e.metaKey)) {\n\t\t/* eslint-disable @typescript-eslint/naming-convention */\n\t\tconst mapper = {\n\t\t\tArrowUp: FloatingNodePosition.top,\n\t\t\tArrowRight: FloatingNodePosition.right,\n\t\t\tArrowDown: FloatingNodePosition.bottom,\n\t\t\tArrowLeft: FloatingNodePosition.left,\n\t\t};\n\t\t/* eslint-enable @typescript-eslint/naming-convention */\n\n\t\tconst matchingDirection = mapper[e.key as keyof typeof mapper] || null;\n\t\tif (matchingDirection) {\n\t\t\tmoveNodeDirection(matchingDirection);\n\t\t}\n\t}\n}\nfunction getINodesFromNames(names: string[]): NodeConfig[] {\n\treturn names\n\t\t.map((name) => {\n\t\t\tconst node = workflowsStore.getNodeByName(name);\n\t\t\tif (node) {\n\t\t\t\tconst nodeType = nodeTypesStore.getNodeType(node.type);\n\t\t\t\tif (nodeType) {\n\t\t\t\t\treturn { node, nodeType };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\t.filter((n): n is NodeConfig => n !== null);\n}\nconst connectedNodes = computed<\n\tRecord<FloatingNodePosition, Array<{ node: INodeUi; nodeType: INodeTypeDescription }>>\n>(() => {\n\tconst rootName = props.rootNode.name;\n\treturn {\n\t\t[FloatingNodePosition.top]: getINodesFromNames(\n\t\t\tworkflow.getChildNodes(rootName, 'ALL_NON_MAIN'),\n\t\t),\n\t\t[FloatingNodePosition.right]: getINodesFromNames(workflow.getChildNodes(rootName, 'main', 1)),\n\t\t[FloatingNodePosition.bottom]: getINodesFromNames(\n\t\t\tworkflow.getParentNodes(rootName, 'ALL_NON_MAIN'),\n\t\t),\n\t\t[FloatingNodePosition.left]: getINodesFromNames(workflow.getParentNodes(rootName, 'main', 1)),\n\t};\n});\n\nconst connectionGroups = [\n\tFloatingNodePosition.top,\n\tFloatingNodePosition.right,\n\tFloatingNodePosition.bottom,\n\tFloatingNodePosition.left,\n];\nconst tooltipPositionMapper = {\n\t[FloatingNodePosition.top]: 'bottom',\n\t[FloatingNodePosition.right]: 'left',\n\t[FloatingNodePosition.bottom]: 'top',\n\t[FloatingNodePosition.left]: 'right',\n};\n\nonMounted(() => {\n\tdocument.addEventListener('keydown', onKeyDown, true);\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('keydown', onKeyDown, true);\n});\ndefineExpose({\n\tmoveNodeDirection,\n});\n</script>\n\n<style lang=\"scss\" module>\n.floatingNodes {\n\tposition: fixed;\n\tbottom: 0;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 10;\n\tpointer-events: none;\n}\n.floatingNodes {\n\tright: 0;\n}\n\n.nodesList {\n\tlist-style: none;\n\tpadding: 0;\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-direction: column;\n\twidth: min-content;\n\tmargin: auto;\n\ttransform-origin: center;\n\tgap: var(--spacing-s);\n\ttransition: transform 0.2s ease-in-out;\n\n\t&.inputSub,\n\t&.outputSub {\n\t\tright: 0;\n\t\tleft: 0;\n\t\tflex-direction: row;\n\t}\n\t&.outputSub {\n\t\ttop: 0;\n\t}\n\t&.inputSub {\n\t\tbottom: 0;\n\t}\n\t&.outputMain,\n\t&.inputMain {\n\t\ttop: 0;\n\t\tbottom: 0;\n\t}\n\t&.outputMain {\n\t\tright: 0;\n\t}\n\t&.inputMain {\n\t\tleft: 0;\n\t}\n\n\t&.outputMain {\n\t\ttransform: translateX(50%);\n\t}\n\t&.outputSub {\n\t\ttransform: translateY(-50%);\n\t}\n\t&.inputMain {\n\t\ttransform: translateX(-50%);\n\t}\n\t&.inputSub {\n\t\ttransform: translateY(50%);\n\t}\n}\n.connectedNode {\n\tborder: var(--border-base);\n\tbackground-color: var(--color-canvas-node-background);\n\tborder-radius: 100%;\n\tpadding: var(--spacing-s);\n\tcursor: pointer;\n\tpointer-events: all;\n\ttransition: transform 0.2s cubic-bezier(0.19, 1, 0.22, 1);\n\tposition: relative;\n\ttransform: scale(0.8);\n\tdisplay: flex;\n\tjustify-self: center;\n\talign-self: center;\n\n\t&::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: -35%;\n\t\tright: -30%;\n\t\tbottom: -35%;\n\t\tleft: -30%;\n\t\tz-index: -1;\n\t}\n\t.outputMain &,\n\t.inputMain & {\n\t\tborder-radius: var(--border-radius-large);\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\t.outputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(-50%);\n\t\t}\n\t}\n\t.outputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(50%);\n\t\t}\n\t}\n\t.inputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(50%);\n\t\t}\n\t}\n\t.inputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(-50%);\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<NDVFloatingNodes\n\t\t\tv-if=\"activeNode\"\n\t\t\t@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t:root-node=\"activeNode\"\n\t\t\ttype=\"input\"\n\t\t/>\n\t\t<div :class=\"$style.inputPanel\" v-if=\"!hideInputAndOutput\" :style=\"inputPanelStyles\">\n\t\t\t<slot name=\"input\"></slot>\n\t\t</div>\n\t\t<div :class=\"$style.outputPanel\" v-if=\"!hideInputAndOutput\" :style=\"outputPanelStyles\">\n\t\t\t<slot name=\"output\"></slot>\n\t\t</div>\n\t\t<div :class=\"$style.mainPanel\" :style=\"mainPanelStyles\">\n\t\t\t<n8n-resize-wrapper\n\t\t\t\t:isResizingEnabled=\"currentNodePaneType !== 'unknown'\"\n\t\t\t\t:width=\"relativeWidthToPx(mainPanelDimensions.relativeWidth)\"\n\t\t\t\t:minWidth=\"MIN_PANEL_WIDTH\"\n\t\t\t\t:gridSize=\"20\"\n\t\t\t\t@resize=\"onResizeDebounced\"\n\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t\t:supportedDirections=\"supportedResizeDirections\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.dragButtonContainer\">\n\t\t\t\t\t<PanelDragButton\n\t\t\t\t\t\t:class=\"{ [$style.draggable]: true, [$style.visible]: isDragging }\"\n\t\t\t\t\t\t:canMoveLeft=\"canMoveLeft\"\n\t\t\t\t\t\t:canMoveRight=\"canMoveRight\"\n\t\t\t\t\t\tv-if=\"!hideInputAndOutput && isDraggable\"\n\t\t\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t\t\t@drag=\"onDrag\"\n\t\t\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"{ [$style.mainPanelInner]: true, [$style.dragging]: isDragging }\">\n\t\t\t\t\t<slot name=\"main\" />\n\t\t\t\t</div>\n\t\t\t</n8n-resize-wrapper>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { get } from 'lodash-es';\nimport { useStorage } from '@/composables/useStorage';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport PanelDragButton from './PanelDragButton.vue';\n\nimport { LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH, MAIN_NODE_PANEL_WIDTH } from '@/constants';\nimport { debounceHelper } from '@/mixins/debounce';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { ndvEventBus } from '@/event-bus';\nimport NDVFloatingNodes from '@/components/NDVFloatingNodes.vue';\n\nconst SIDE_MARGIN = 24;\nconst SIDE_PANELS_MARGIN = 80;\nconst MIN_PANEL_WIDTH = 280;\nconst PANEL_WIDTH = 320;\nconst PANEL_WIDTH_LARGE = 420;\n\nconst initialMainPanelWidth: { [key: string]: number } = {\n\tregular: MAIN_NODE_PANEL_WIDTH,\n\tdragless: MAIN_NODE_PANEL_WIDTH,\n\tunknown: MAIN_NODE_PANEL_WIDTH,\n\tinputless: MAIN_NODE_PANEL_WIDTH,\n\twide: MAIN_NODE_PANEL_WIDTH * 2,\n};\n\nexport default defineComponent({\n\tname: 'NDVDraggablePanels',\n\tmixins: [debounceHelper],\n\tcomponents: {\n\t\tPanelDragButton,\n\t\tNDVFloatingNodes,\n\t},\n\tprops: {\n\t\tisDraggable: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideInputAndOutput: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tposition: {\n\t\t\ttype: Number,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tdata(): {\n\t\twindowWidth: number;\n\t\tisDragging: boolean;\n\t\tMIN_PANEL_WIDTH: number;\n\t\tinitialized: boolean;\n\t} {\n\t\treturn {\n\t\t\twindowWidth: 1,\n\t\t\tisDragging: false,\n\t\t\tMIN_PANEL_WIDTH,\n\t\t\tinitialized: false,\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.setTotalWidth();\n\n\t\t/*\n\t\t\tOnly set(or restore) initial position if `mainPanelDimensions`\n\t\t\tis at the default state({relativeLeft:1, relativeRight: 1, relativeWidth: 1}) to make sure we use store values if they are set\n\t\t*/\n\t\tif (\n\t\t\tthis.mainPanelDimensions.relativeLeft === 1 &&\n\t\t\tthis.mainPanelDimensions.relativeRight === 1\n\t\t) {\n\t\t\tthis.setMainPanelWidth();\n\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\tthis.restorePositionData();\n\t\t}\n\n\t\twindow.addEventListener('resize', this.setTotalWidth);\n\t\tthis.$emit('init', { position: this.mainPanelDimensions.relativeLeft });\n\t\tsetTimeout(() => {\n\t\t\tthis.initialized = true;\n\t\t}, 0);\n\n\t\tndvEventBus.on('setPositionByName', this.setPositionByName);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.setTotalWidth);\n\t\tndvEventBus.off('setPositionByName', this.setPositionByName);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tmainPanelDimensions(): {\n\t\t\trelativeWidth: number;\n\t\t\trelativeLeft: number;\n\t\t\trelativeRight: number;\n\t\t} {\n\t\t\treturn this.ndvStore.getMainPanelDimensions(this.currentNodePaneType);\n\t\t},\n\t\tactiveNode() {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tsupportedResizeDirections(): string[] {\n\t\t\tconst supportedDirections = ['right'];\n\n\t\t\tif (this.isDraggable) supportedDirections.push('left');\n\t\t\treturn supportedDirections;\n\t\t},\n\t\tcurrentNodePaneType(): string {\n\t\t\tif (!this.hasInputSlot) return 'inputless';\n\t\t\tif (!this.isDraggable) return 'dragless';\n\t\t\tif (this.nodeType === null) return 'unknown';\n\t\t\treturn get(this, 'nodeType.parameterPane') || 'regular';\n\t\t},\n\t\thasInputSlot(): boolean {\n\t\t\treturn this.$slots.input !== undefined;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.pxToRelativeWidth(SIDE_PANELS_MARGIN);\n\t\t},\n\t\tminWindowWidth(): number {\n\t\t\treturn 2 * (SIDE_MARGIN + SIDE_PANELS_MARGIN) + MIN_PANEL_WIDTH;\n\t\t},\n\t\tminimumLeftPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\tif (!this.hasInputSlot) return this.pxToRelativeWidth(SIDE_MARGIN);\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tmaximumRightPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tcanMoveLeft(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeLeft > this.minimumLeftPosition;\n\t\t},\n\t\tcanMoveRight(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeRight > this.maximumRightPosition;\n\t\t},\n\t\tmainPanelStyles(): { left: string; right: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeLeft)}px`,\n\t\t\t\tright: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\tinputPanelStyles(): { right: string } {\n\t\t\treturn {\n\t\t\t\tright: `${this.relativeWidthToPx(this.calculatedPositions.inputPanelRelativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\toutputPanelStyles(): { left: string; transform: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.calculatedPositions.outputPanelRelativeLeft)}px`,\n\t\t\t\ttransform: `translateX(-${this.relativeWidthToPx(this.outputPanelRelativeTranslate)}px)`,\n\t\t\t};\n\t\t},\n\t\tcalculatedPositions(): { inputPanelRelativeRight: number; outputPanelRelativeLeft: number } {\n\t\t\tconst hasInput = this.$slots.input !== undefined;\n\t\t\tconst outputPanelRelativeLeft =\n\t\t\t\tthis.mainPanelDimensions.relativeLeft + this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst inputPanelRelativeRight = hasInput\n\t\t\t\t? 1 - outputPanelRelativeLeft + this.mainPanelDimensions.relativeWidth\n\t\t\t\t: 1 - this.pxToRelativeWidth(SIDE_MARGIN);\n\n\t\t\treturn {\n\t\t\t\tinputPanelRelativeRight,\n\t\t\t\toutputPanelRelativeLeft,\n\t\t\t};\n\t\t},\n\t\toutputPanelRelativeTranslate(): number {\n\t\t\tconst panelMinLeft = 1 - this.pxToRelativeWidth(MIN_PANEL_WIDTH + SIDE_MARGIN);\n\t\t\tconst currentRelativeLeftDelta =\n\t\t\t\tthis.calculatedPositions.outputPanelRelativeLeft - panelMinLeft;\n\t\t\treturn currentRelativeLeftDelta > 0 ? currentRelativeLeftDelta : 0;\n\t\t},\n\t\thasDoubleWidth(): boolean {\n\t\t\treturn get(this, 'nodeType.parameterPane') === 'wide';\n\t\t},\n\t\tfixedPanelWidth(): number {\n\t\t\tconst multiplier = this.hasDoubleWidth ? 2 : 1;\n\n\t\t\tif (this.windowWidth > 1700) {\n\t\t\t\treturn PANEL_WIDTH_LARGE * multiplier;\n\t\t\t}\n\n\t\t\treturn PANEL_WIDTH * multiplier;\n\t\t},\n\t\tisBelowMinWidthMainPanel(): boolean {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\treturn this.mainPanelDimensions.relativeWidth < minRelativeWidth;\n\t\t},\n\t},\n\twatch: {\n\t\twindowWidth(windowWidth) {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\t// Prevent the panel resizing below MIN_PANEL_WIDTH whhile maintaing position\n\t\t\tif (this.isBelowMinWidthMainPanel) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t}\n\n\t\t\tconst isBelowMinLeft = this.minimumLeftPosition > this.mainPanelDimensions.relativeLeft;\n\t\t\tconst isMaxRight = this.maximumRightPosition > this.mainPanelDimensions.relativeRight;\n\n\t\t\t// When user is resizing from non-supported view(sub ~488px) we need to refit the panels\n\t\t\tif (windowWidth > this.minWindowWidth && isBelowMinLeft && isMaxRight) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\t}\n\n\t\t\tthis.setPositions(this.mainPanelDimensions.relativeLeft);\n\t\t},\n\t},\n\tmethods: {\n\t\tonSwitchSelectedNode(node: string) {\n\t\t\tthis.$emit('switchSelectedNode', node);\n\t\t},\n\t\tgetInitialLeftPosition(width: number) {\n\t\t\tif (this.currentNodePaneType === 'dragless')\n\t\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 1 + this.fixedPanelWidth);\n\n\t\t\treturn this.hasInputSlot ? 0.5 - width / 2 : this.minimumLeftPosition;\n\t\t},\n\t\tsetMainPanelWidth(relativeWidth?: number) {\n\t\t\tconst mainPanelRelativeWidth =\n\t\t\t\trelativeWidth || this.pxToRelativeWidth(initialMainPanelWidth[this.currentNodePaneType]);\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeWidth: mainPanelRelativeWidth,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositions(relativeLeft: number) {\n\t\t\tconst mainPanelRelativeLeft =\n\t\t\t\trelativeLeft || 1 - this.calculatedPositions.inputPanelRelativeRight;\n\t\t\tconst mainPanelRelativeRight =\n\t\t\t\t1 - mainPanelRelativeLeft - this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst isMaxRight = this.maximumRightPosition > mainPanelRelativeRight;\n\t\t\tconst isMinLeft = this.minimumLeftPosition > mainPanelRelativeLeft;\n\t\t\tconst isInputless = this.currentNodePaneType === 'inputless';\n\n\t\t\tif (isMinLeft) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: this.minimumLeftPosition,\n\t\t\t\t\t\trelativeRight: 1 - this.mainPanelDimensions.relativeWidth - this.minimumLeftPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isMaxRight) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: 1 - this.mainPanelDimensions.relativeWidth - this.maximumRightPosition,\n\t\t\t\t\t\trelativeRight: this.maximumRightPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeLeft: isInputless ? this.minimumLeftPosition : mainPanelRelativeLeft,\n\t\t\t\t\trelativeRight: mainPanelRelativeRight,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositionByName(position: 'minLeft' | 'maxRight' | 'initial') {\n\t\t\tconst positionByName: Record<string, number> = {\n\t\t\t\tminLeft: this.minimumLeftPosition,\n\t\t\t\tmaxRight: this.maximumRightPosition,\n\t\t\t\tinitial: this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth),\n\t\t\t};\n\n\t\t\tthis.setPositions(positionByName[position]);\n\t\t},\n\t\tpxToRelativeWidth(px: number) {\n\t\t\treturn px / this.windowWidth;\n\t\t},\n\t\trelativeWidthToPx(relativeWidth: number) {\n\t\t\treturn relativeWidth * this.windowWidth;\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.setTotalWidth();\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tonResizeDebounced(data: { direction: string; x: number; width: number }) {\n\t\t\tif (this.initialized) {\n\t\t\t\tvoid this.callDebounced('onResize', { debounceTime: 10, trailing: true }, data);\n\t\t\t}\n\t\t},\n\t\tonResize({ direction, x, width }: { direction: string; x: number; width: number }) {\n\t\t\tconst relativeDistance = this.pxToRelativeWidth(x);\n\t\t\tconst relativeWidth = this.pxToRelativeWidth(width);\n\n\t\t\tif (direction === 'left' && relativeDistance <= this.minimumLeftPosition) return;\n\t\t\tif (direction === 'right' && 1 - relativeDistance <= this.maximumRightPosition) return;\n\t\t\tif (width <= MIN_PANEL_WIDTH) return;\n\n\t\t\tthis.setMainPanelWidth(relativeWidth);\n\t\t\tthis.setPositions(\n\t\t\t\tdirection === 'left' ? relativeDistance : this.mainPanelDimensions.relativeLeft,\n\t\t\t);\n\t\t},\n\t\trestorePositionData() {\n\t\t\tconst storedPanelWidthData = useStorage(\n\t\t\t\t`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`,\n\t\t\t).value;\n\n\t\t\tif (storedPanelWidthData) {\n\t\t\t\tconst parsedWidth = parseFloat(storedPanelWidthData);\n\t\t\t\tthis.setMainPanelWidth(parsedWidth);\n\t\t\t\tconst initialPosition = this.getInitialLeftPosition(parsedWidth);\n\n\t\t\t\tthis.setPositions(initialPosition);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tstorePositionData() {\n\t\t\tuseStorage(`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`).value =\n\t\t\t\tthis.mainPanelDimensions.relativeWidth.toString();\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.$emit('dragstart', { position: this.mainPanelDimensions.relativeLeft });\n\t\t},\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tconst relativeLeft = this.pxToRelativeWidth(e.x) - this.mainPanelDimensions.relativeWidth / 2;\n\n\t\t\tthis.setPositions(relativeLeft);\n\t\t},\n\t\tonDragEnd() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.$emit('dragend', {\n\t\t\t\t\twindowWidth: this.windowWidth,\n\t\t\t\t\tposition: this.mainPanelDimensions.relativeLeft,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tsetTotalWidth() {\n\t\t\tthis.windowWidth = window.innerWidth;\n\t\t},\n\t\tclose() {\n\t\t\tthis.$emit('close');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dataPanel {\n\tposition: absolute;\n\theight: calc(100% - 2 * var(--spacing-l));\n\tposition: absolute;\n\ttop: var(--spacing-l);\n\tz-index: 0;\n\tmin-width: 280px;\n}\n\n.inputPanel {\n\tcomposes: dataPanel;\n\tleft: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: var(--border-radius-large) 0 0 var(--border-radius-large);\n\t}\n}\n\n.outputPanel {\n\tcomposes: dataPanel;\n\tright: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: 0 var(--border-radius-large) var(--border-radius-large) 0;\n\t}\n}\n\n.mainPanel {\n\tposition: absolute;\n\theight: 100%;\n\n\t&:hover {\n\t\t.draggable {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.mainPanelInner {\n\theight: 100%;\n\tborder: var(--border-base);\n\tborder-radius: var(--border-radius-large);\n\tbox-shadow: 0 4px 16px rgb(50 61 85 / 10%);\n\toverflow: hidden;\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.draggable {\n\tvisibility: hidden;\n}\n\n.double-width {\n\tleft: 90%;\n}\n\n.dragButtonContainer {\n\tposition: absolute;\n\ttop: -12px;\n\twidth: 100%;\n\theight: 12px;\n\tdisplay: flex;\n\tjustify-content: center;\n\tpointer-events: none;\n\n\t.draggable {\n\t\tpointer-events: all;\n\t}\n\t&:hover .draggable {\n\t\tvisibility: visible;\n\t}\n}\n\n.visible {\n\tvisibility: visible;\n}\n</style>\n","<template>\n\t<iframe class=\"__html-display\" :srcdoc=\"sanitizedHtml\" />\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport sanitizeHtml, { defaults, type IOptions as SanitizeOptions } from 'sanitize-html';\n\nconst sanitizeOptions: SanitizeOptions = {\n\tallowVulnerableTags: false,\n\tenforceHtmlBoundary: false,\n\tdisallowedTagsMode: 'discard',\n\tallowedTags: [...defaults.allowedTags, 'style', 'img', 'title'],\n\tallowedAttributes: {\n\t\t...defaults.allowedAttributes,\n\t\t'*': ['class', 'style'],\n\t},\n\ttransformTags: {\n\t\thead: '',\n\t},\n};\n\nexport default {\n\tname: 'RunDataHtml',\n\tprops: {\n\t\tinputHtml: {\n\t\t\ttype: String as PropType<string>,\n\t\t},\n\t},\n\tcomputed: {\n\t\tsanitizedHtml() {\n\t\t\treturn sanitizeHtml(this.inputHtml, sanitizeOptions);\n\t\t},\n\t},\n};\n</script>\n\n<style lang=\"scss\">\n.__html-display {\n\twidth: 100%;\n\theight: 100%;\n}\n</style>\n","<template>\n\t<span>\n\t\t<div v-if=\"isLoading\">Loading binary data...</div>\n\t\t<div v-else-if=\"error\">Error loading binary data</div>\n\t\t<span v-else>\n\t\t\t<video v-if=\"binaryData.fileType === 'video'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</video>\n\t\t\t<audio v-else-if=\"binaryData.fileType === 'audio'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</audio>\n\t\t\t<vue-json-pretty\n\t\t\t\tv-else-if=\"binaryData.fileType === 'json'\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t:deep=\"3\"\n\t\t\t\t:showLength=\"true\"\n\t\t\t/>\n\t\t\t<run-data-html v-else-if=\"binaryData.fileType === 'html'\" :inputHtml=\"data\" />\n\t\t\t<embed v-else :src=\"embedSource\" class=\"binary-data\" :class=\"embedClass()\" />\n\t\t</span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData } from 'n8n-workflow';\nimport { jsonParse } from 'n8n-workflow';\nimport type { PropType } from 'vue';\nimport VueJsonPretty from 'vue-json-pretty';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport RunDataHtml from '@/components/RunDataHtml.vue';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplayEmbed',\n\tcomponents: {\n\t\tVueJsonPretty,\n\t\tRunDataHtml,\n\t},\n\tprops: {\n\t\tbinaryData: {\n\t\t\ttype: Object as PropType<IBinaryData>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisLoading: true,\n\t\t\tembedSource: '',\n\t\t\terror: false,\n\t\t\tdata: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t},\n\tasync mounted() {\n\t\tconst { id, data, fileName, fileType, mimeType } = this.binaryData;\n\t\tconst isJSONData = fileType === 'json';\n\t\tconst isHTMLData = fileType === 'html';\n\n\t\tif (!id) {\n\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\tthis.data = jsonParse(atob(data));\n\t\t\t} else {\n\t\t\t\tthis.embedSource = 'data:' + mimeType + ';base64,' + data;\n\t\t\t}\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst binaryUrl = this.workflowsStore.getBinaryUrl(id, 'view', fileName, mimeType);\n\t\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\t\tconst fetchedData = await fetch(binaryUrl, { credentials: 'include' });\n\t\t\t\t\tthis.data = await (isJSONData ? fetchedData.json() : fetchedData.text());\n\t\t\t\t} else {\n\t\t\t\t\tthis.embedSource = binaryUrl;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tthis.error = true;\n\t\t\t}\n\t\t}\n\n\t\tthis.isLoading = false;\n\t},\n\tmethods: {\n\t\tembedClass(): string[] {\n\t\t\tconst { fileType } = this.binaryData;\n\t\t\treturn [fileType ?? 'other'];\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data {\n\tbackground-color: var(--color-foreground-xlight);\n\n\t&.image {\n\t\tmax-height: calc(100% - 1em);\n\t\tmax-width: calc(100% - 1em);\n\t}\n\n\t&.other,\n\t&.pdf {\n\t\theight: calc(100% - 1em);\n\t\twidth: calc(100% - 1em);\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"windowVisible\" :class=\"['binary-data-window', binaryData?.fileType]\">\n\t\t<n8n-button\n\t\t\t@click.stop=\"closeWindow\"\n\t\t\tsize=\"small\"\n\t\t\tclass=\"binary-data-window-back\"\n\t\t\t:title=\"$locale.baseText('binaryDataDisplay.backToOverviewPage')\"\n\t\t\ticon=\"arrow-left\"\n\t\t\t:label=\"$locale.baseText('binaryDataDisplay.backToList')\"\n\t\t/>\n\n\t\t<div class=\"binary-data-window-wrapper\">\n\t\t\t<div v-if=\"!binaryData\">\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.noDataFoundToDisplay') }}\n\t\t\t</div>\n\t\t\t<BinaryDataDisplayEmbed v-else :binaryData=\"binaryData\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData, IRunData } from 'n8n-workflow';\n\nimport BinaryDataDisplayEmbed from '@/components/BinaryDataDisplayEmbed.vue';\n\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplay',\n\n\tcomponents: {\n\t\tBinaryDataDisplayEmbed,\n\t},\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn {\n\t\t\tnodeHelpers,\n\t\t};\n\t},\n\tprops: [\n\t\t'displayData', // IBinaryData\n\t\t'windowVisible', // boolean\n\t],\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t\tbinaryData(): IBinaryData | null {\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.displayData.node,\n\t\t\t\tthis.displayData.runIndex,\n\t\t\t\tthis.displayData.outputIndex,\n\t\t\t);\n\n\t\t\tif (binaryData.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.displayData.index >= binaryData.length ||\n\t\t\t\tbinaryData[this.displayData.index][this.displayData.key] === undefined\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst binaryDataItem: IBinaryData = binaryData[this.displayData.index][this.displayData.key];\n\n\t\t\treturn binaryDataItem;\n\t\t},\n\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution;\n\t\t\tif (workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData = workflowExecution.data;\n\t\t\treturn executionData ? executionData.resultData.runData : null;\n\t\t},\n\t},\n\tmethods: {\n\t\tcloseWindow() {\n\t\t\t// Handle the close externally as the visible parameter is an external prop\n\t\t\t// and is so not allowed to be changed here.\n\t\t\tthis.$emit('close');\n\t\t\treturn false;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data-window {\n\tposition: absolute;\n\ttop: 50px;\n\tleft: 0;\n\tz-index: 10;\n\twidth: 100%;\n\theight: calc(100% - 50px);\n\tbackground-color: var(--color-background-base);\n\toverflow: hidden;\n\ttext-align: center;\n\n\t&.json {\n\t\toverflow: auto;\n\t}\n\n\t.binary-data-window-wrapper {\n\t\tmargin-top: 0.5em;\n\t\tpadding: 0 1em;\n\t\theight: calc(100% - 50px);\n\n\t\t.el-row,\n\t\t.el-col {\n\t\t\theight: 100%;\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<div class=\"error-header\">\n\t\t\t<div class=\"error-message\" v-text=\"getErrorMessage()\" />\n\t\t\t<div class=\"error-description\" v-if=\"error.description\" v-html=\"getErrorDescription()\"></div>\n\t\t</div>\n\t\t<details>\n\t\t\t<summary class=\"error-details__summary\">\n\t\t\t\t<font-awesome-icon class=\"error-details__icon\" icon=\"angle-right\" />\n\t\t\t\t{{ $locale.baseText('nodeErrorView.details') }}\n\t\t\t</summary>\n\t\t\t<div class=\"error-details__content\">\n\t\t\t\t<div v-if=\"error.context && error.context.causeDetailed\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ error.context.causeDetailed }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"error.timestamp\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<template #header>\n\t\t\t\t\t\t\t<div class=\"clearfix box-card__title\">\n\t\t\t\t\t\t\t\t<span>{{ $locale.baseText('nodeErrorView.time') }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ new Date(error.timestamp).toLocaleString() }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"error.context && error.context.itemIndex !== undefined\"\n\t\t\t\t\tclass=\"el-card box-card is-never-shadow el-card__body\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"error-details__summary\"\n\t\t\t\t\t\t>{{ $locale.baseText('nodeErrorView.itemIndex') }}:</span\n\t\t\t\t\t>\n\t\t\t\t\t{{ error.context.itemIndex }}\n\t\t\t\t\t<span v-if=\"error.context.runIndex\">\n\t\t\t\t\t\t|\n\t\t\t\t\t\t<span class=\"error-details__summary\"\n\t\t\t\t\t\t\t>{{ $locale.baseText('nodeErrorView.itemIndex') }}:</span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t{{ error.context.runIndex }}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-if=\"error.context.parameter\">\n\t\t\t\t\t\t|\n\t\t\t\t\t\t<span class=\"error-details__summary\"\n\t\t\t\t\t\t\t>{{ $locale.baseText('nodeErrorView.inParameter') }}:</span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t{{ parameterDisplayName(error.context.parameter) }}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"error.httpCode\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<template #header>\n\t\t\t\t\t\t\t<div class=\"clearfix box-card__title\">\n\t\t\t\t\t\t\t\t<span>{{ $locale.baseText('nodeErrorView.httpCode') }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ error.httpCode }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"error.cause\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<template #header>\n\t\t\t\t\t\t\t<div class=\"clearfix box-card__title\">\n\t\t\t\t\t\t\t\t<span>{{ $locale.baseText('nodeErrorView.cause') }}</span>\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t<span class=\"box-card__subtitle\">{{\n\t\t\t\t\t\t\t\t\t$locale.baseText('nodeErrorView.dataBelowMayContain')\n\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<div class=\"copy-button\" v-if=\"displayCause\">\n\t\t\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\t\t\t@click=\"copyCause\"\n\t\t\t\t\t\t\t\t\t:title=\"$locale.baseText('nodeErrorView.copyToClipboard')\"\n\t\t\t\t\t\t\t\t\ticon=\"copy\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<vue-json-pretty\n\t\t\t\t\t\t\t\tv-if=\"displayCause\"\n\t\t\t\t\t\t\t\t:data=\"error.cause\"\n\t\t\t\t\t\t\t\t:deep=\"3\"\n\t\t\t\t\t\t\t\t:showLength=\"true\"\n\t\t\t\t\t\t\t\tselectableType=\"single\"\n\t\t\t\t\t\t\t\tpath=\"error\"\n\t\t\t\t\t\t\t\tclass=\"json-data\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span v-else>\n\t\t\t\t\t\t\t\t<font-awesome-icon icon=\"info-circle\" />{{\n\t\t\t\t\t\t\t\t\t$locale.baseText('nodeErrorView.theErrorCauseIsTooLargeToBeDisplayed')\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"error.stack\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<template #header>\n\t\t\t\t\t\t\t<div class=\"clearfix box-card__title\">\n\t\t\t\t\t\t\t\t<span>{{ $locale.baseText('nodeErrorView.stack') }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<pre><code>{{error.stack}}</code></pre>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</details>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport VueJsonPretty from 'vue-json-pretty';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { useToast } from '@/composables/useToast';\nimport { MAX_DISPLAY_DATA_SIZE } from '@/constants';\n\nimport type {\n\tINodeProperties,\n\tINodePropertyCollection,\n\tINodePropertyOptions,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { sanitizeHtml } from '@/utils/htmlUtils';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\nexport default defineComponent({\n\tname: 'NodeErrorView',\n\tmixins: [copyPaste],\n\tprops: ['error'],\n\tcomponents: {\n\t\tVueJsonPretty,\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore),\n\t\tdisplayCause(): boolean {\n\t\t\treturn JSON.stringify(this.error.cause).length < MAX_DISPLAY_DATA_SIZE;\n\t\t},\n\t\tparameters(): INodeProperties[] {\n\t\t\tconst node = this.ndvStore.activeNode;\n\t\t\tif (!node) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\tif (nodeType === null) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn nodeType.properties;\n\t\t},\n\t},\n\tmethods: {\n\t\treplacePlaceholders(parameter: string, message: string): string {\n\t\t\tconst parameterName = this.parameterDisplayName(parameter, false);\n\t\t\tconst parameterFullName = this.parameterDisplayName(parameter, true);\n\t\t\treturn message\n\t\t\t\t.replace(/%%PARAMETER%%/g, parameterName)\n\t\t\t\t.replace(/%%PARAMETER_FULL%%/g, parameterFullName);\n\t\t},\n\t\tgetErrorDescription(): string {\n\t\t\tconst isSubNodeError =\n\t\t\t\tthis.error.name === 'NodeOperationError' &&\n\t\t\t\t(this.error as NodeOperationError).functionality === 'configuration-node';\n\n\t\t\tif (isSubNodeError) {\n\t\t\t\treturn sanitizeHtml(\n\t\t\t\t\tthis.error.description +\n\t\t\t\t\t\tthis.$locale.baseText('pushConnection.executionError.openNode', {\n\t\t\t\t\t\t\tinterpolate: { node: this.error.node.name },\n\t\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!this.error.context?.descriptionTemplate) {\n\t\t\t\treturn sanitizeHtml(this.error.description);\n\t\t\t}\n\n\t\t\tconst parameterName = this.parameterDisplayName(this.error.context.parameter);\n\t\t\treturn sanitizeHtml(\n\t\t\t\tthis.error.context.descriptionTemplate.replace(/%%PARAMETER%%/g, parameterName),\n\t\t\t);\n\t\t},\n\t\tgetErrorMessage(): string {\n\t\t\tconst baseErrorMessage = this.$locale.baseText('nodeErrorView.error') + ': ';\n\n\t\t\tconst isSubNodeError =\n\t\t\t\tthis.error.name === 'NodeOperationError' &&\n\t\t\t\t(this.error as NodeOperationError).functionality === 'configuration-node';\n\n\t\t\tif (isSubNodeError) {\n\t\t\t\tconst baseErrorMessageSubNode = this.$locale.baseText('nodeErrorView.errorSubNode', {\n\t\t\t\t\tinterpolate: { node: this.error.node.name },\n\t\t\t\t});\n\t\t\t\treturn baseErrorMessageSubNode;\n\t\t\t}\n\n\t\t\tif (this.error.message === this.error.description) {\n\t\t\t\treturn baseErrorMessage;\n\t\t\t}\n\t\t\tif (!this.error.context?.messageTemplate) {\n\t\t\t\treturn baseErrorMessage + this.error.message;\n\t\t\t}\n\n\t\t\tconst parameterName = this.parameterDisplayName(this.error.context.parameter);\n\n\t\t\treturn (\n\t\t\t\tbaseErrorMessage +\n\t\t\t\tthis.error.context.messageTemplate.replace(/%%PARAMETER%%/g, parameterName)\n\t\t\t);\n\t\t},\n\t\tparameterDisplayName(path: string, fullPath = true) {\n\t\t\ttry {\n\t\t\t\tconst parameters = this.parameterName(this.parameters, path.split('.'));\n\t\t\t\tif (!parameters.length) {\n\t\t\t\t\tthrow new Error();\n\t\t\t\t}\n\n\t\t\t\tif (!fullPath) {\n\t\t\t\t\treturn parameters.pop()!.displayName;\n\t\t\t\t}\n\t\t\t\treturn parameters.map((parameter) => parameter.displayName).join(' > ');\n\t\t\t} catch (error) {\n\t\t\t\treturn `Could not find parameter \"${path}\"`;\n\t\t\t}\n\t\t},\n\t\tparameterName(\n\t\t\tparameters: Array<INodePropertyOptions | INodeProperties | INodePropertyCollection>,\n\t\t\tpathParts: string[],\n\t\t): Array<INodeProperties | INodePropertyCollection> {\n\t\t\tlet currentParameterName = pathParts.shift();\n\n\t\t\tif (currentParameterName === undefined) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst arrayMatch = currentParameterName.match(/(.*)\\[([\\d])\\]$/);\n\t\t\tif (arrayMatch !== null && arrayMatch.length > 0) {\n\t\t\t\tcurrentParameterName = arrayMatch[1];\n\t\t\t}\n\t\t\tconst currentParameter = parameters.find(\n\t\t\t\t(parameter) => parameter.name === currentParameterName,\n\t\t\t) as unknown as INodeProperties | INodePropertyCollection;\n\n\t\t\tif (currentParameter === undefined) {\n\t\t\t\tthrow new Error(`Could not find parameter \"${currentParameterName}\"`);\n\t\t\t}\n\n\t\t\tif (pathParts.length === 0) {\n\t\t\t\treturn [currentParameter];\n\t\t\t}\n\n\t\t\tif (currentParameter.hasOwnProperty('options')) {\n\t\t\t\treturn [\n\t\t\t\t\tcurrentParameter,\n\t\t\t\t\t...this.parameterName((currentParameter as INodeProperties).options!, pathParts),\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tif (currentParameter.hasOwnProperty('values')) {\n\t\t\t\treturn [\n\t\t\t\t\tcurrentParameter,\n\t\t\t\t\t...this.parameterName((currentParameter as INodePropertyCollection).values, pathParts),\n\t\t\t\t];\n\t\t\t}\n\n\t\t\t// We can not resolve any deeper so lets stop here and at least return hopefully something useful\n\t\t\treturn [currentParameter];\n\t\t},\n\t\tcopyCause() {\n\t\t\tthis.copyToClipboard(JSON.stringify(this.error.cause));\n\t\t\tthis.copySuccess();\n\t\t},\n\t\tcopySuccess() {\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('nodeErrorView.showMessage.title'),\n\t\t\t\ttype: 'info',\n\t\t\t});\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.error-header {\n\tmargin-bottom: 10px;\n}\n\n.error-message {\n\tcolor: var(--color-ndv-ouptut-error-font);\n\tfont-weight: bold;\n\tfont-size: 1.1rem;\n}\n\n.error-description {\n\tmargin-top: 10px;\n\tfont-size: 1rem;\n}\n\n.error-details__summary {\n\tfont-weight: 600;\n\tfont-size: 16px;\n\tcursor: pointer;\n\toutline: none;\n}\n\n.error-details__icon {\n\tmargin-right: 4px;\n}\n\ndetails > summary {\n\tlist-style-type: none;\n}\n\ndetails > summary::-webkit-details-marker {\n\tdisplay: none;\n}\n\ndetails[open] {\n\t.error-details__icon {\n\t\ttransform: rotate(90deg);\n\t}\n}\n\n.error-details__content {\n\tmargin-top: 15px;\n}\n\n.el-divider__text {\n\tbackground-color: var(--color-background-light);\n}\n\n.box-card {\n\tmargin-top: 1em;\n\toverflow: auto;\n}\n\n.box-card__title {\n\tfont-weight: 400;\n}\n\n.box-card__subtitle {\n\tfont-weight: 200;\n\tfont-style: italic;\n\tfont-size: 0.7rem;\n}\n\n.copy-button {\n\tposition: absolute;\n\tright: 50px;\n\tz-index: 1000;\n}\n</style>\n","<template>\n\t<div :class=\"['run-data', $style.container]\" @mouseover=\"activatePane\">\n\t\t<n8n-callout\n\t\t\tv-if=\"canPinData && hasPinData && !editMode.enabled && !isProductionExecutionPreview\"\n\t\t\ttheme=\"secondary\"\n\t\t\ticon=\"thumbtack\"\n\t\t\t:class=\"$style.pinnedDataCallout\"\n\t\t>\n\t\t\t{{ $locale.baseText('runData.pindata.thisDataIsPinned') }}\n\t\t\t<span class=\"ml-4xs\" v-if=\"!isReadOnlyRoute && !readOnlyEnv\">\n\t\t\t\t<n8n-link\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tunderline\n\t\t\t\t\tbold\n\t\t\t\t\t@click.stop=\"onTogglePinData({ source: 'banner-link' })\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.unpin') }}\n\t\t\t\t</n8n-link>\n\t\t\t</span>\n\t\t\t<template #trailingContent>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"dataPinningDocsUrl\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tbold\n\t\t\t\t\tunderline\n\t\t\t\t\t@click=\"onClickDataPinningDocsLink\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.learnMore') }}\n\t\t\t\t</n8n-link>\n\t\t\t</template>\n\t\t</n8n-callout>\n\n\t\t<BinaryDataDisplay\n\t\t\t:windowVisible=\"binaryDataDisplayVisible\"\n\t\t\t:displayData=\"binaryDataDisplayData\"\n\t\t\t@close=\"closeBinaryDataDisplay\"\n\t\t/>\n\n\t\t<div :class=\"$style.header\">\n\t\t\t<slot name=\"header\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-show=\"!hasRunError\"\n\t\t\t\t@click.stop\n\t\t\t\t:class=\"$style.displayModes\"\n\t\t\t\tdata-test-id=\"run-data-pane-header\"\n\t\t\t>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-show=\"\n\t\t\t\t\t\thasNodeRun && (inputData.length || binaryData.length || search) && !editMode.enabled\n\t\t\t\t\t\"\n\t\t\t\t\t:modelValue=\"displayMode\"\n\t\t\t\t\t:options=\"buttons\"\n\t\t\t\t\tdata-test-id=\"ndv-run-data-display-mode\"\n\t\t\t\t\t@update:modelValue=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"canPinData && !isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t\t\t:title=\"$locale.baseText('runData.editOutput')\"\n\t\t\t\t\t:circle=\"false\"\n\t\t\t\t\t:disabled=\"node.disabled\"\n\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\ticon=\"pencil-alt\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tdata-test-id=\"ndv-edit-pinned-data\"\n\t\t\t\t\t@click=\"enterEditMode({ origin: 'editIconButton' })\"\n\t\t\t\t/>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tplacement=\"bottom-end\"\n\t\t\t\t\tv-if=\"canPinData && rawInputData.length\"\n\t\t\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t\t\t:visible=\"\n\t\t\t\t\t\tisControlledPinDataTooltip\n\t\t\t\t\t\t\t? isControlledPinDataTooltip && pinDataDiscoveryTooltipVisible\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t<template #content v-if=\"!isControlledPinDataTooltip\">\n\t\t\t\t\t\t<div :class=\"$style.tooltipContainer\">\n\t\t\t\t\t\t\t<strong>{{ $locale.baseText('ndv.pinData.pin.title') }}</strong>\n\t\t\t\t\t\t\t<n8n-text size=\"small\" tag=\"p\">\n\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.pinData.pin.description') }}\n\n\t\t\t\t\t\t\t\t<n8n-link :to=\"dataPinningDocsUrl\" size=\"small\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.pinData.pin.link') }}\n\t\t\t\t\t\t\t\t</n8n-link>\n\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template #content v-else>\n\t\t\t\t\t\t<div :class=\"$style.tooltipContainer\">\n\t\t\t\t\t\t\t{{ $locale.baseText('node.discovery.pinData.ndv') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t:class=\"['ml-2xs', $style.pinDataButton]\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:active=\"hasPinData\"\n\t\t\t\t\t\ticon=\"thumbtack\"\n\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\teditMode.enabled ||\n\t\t\t\t\t\t\t(rawInputData.length === 0 && !hasPinData) ||\n\t\t\t\t\t\t\tisReadOnlyRoute ||\n\t\t\t\t\t\t\treadOnlyEnv\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t@click=\"onTogglePinData({ source: 'pin-icon-click' })\"\n\t\t\t\t\t\tdata-test-id=\"ndv-pin-data\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\n\t\t\t\t<div :class=\"$style.editModeActions\" v-show=\"editMode.enabled\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.cancel')\"\n\t\t\t\t\t\t@click=\"onClickCancelEdit\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.save')\"\n\t\t\t\t\t\t@click=\"onClickSaveEdit\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"$style.runSelector\"\n\t\t\tv-if=\"maxRunIndex > 0\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\tdata-test-id=\"run-selector\"\n\t\t>\n\t\t\t<div :class=\"$style.runSelectorWrapper\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:modelValue=\"runIndex\"\n\t\t\t\t\t@update:modelValue=\"onRunIndexChange\"\n\t\t\t\t\t@click.stop\n\t\t\t\t\tteleported\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.run') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"option in maxRunIndex + 1\"\n\t\t\t\t\t\t:label=\"getRunLabel(option)\"\n\t\t\t\t\t\t:value=\"option - 1\"\n\t\t\t\t\t\t:key=\"option\"\n\t\t\t\t\t></n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<n8n-tooltip placement=\"right\" v-if=\"canLinkRuns\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ $locale.baseText(linkedRuns ? 'runData.unlinking.hint' : 'runData.linking.hint') }}\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\tclass=\"linkRun\"\n\t\t\t\t\t\t:icon=\"linkedRuns ? 'unlink' : 'link'\"\n\t\t\t\t\t\ttext\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click=\"toggleLinkRuns\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<slot name=\"run-info\"></slot>\n\t\t\t</div>\n\t\t\t<run-data-search\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t:isAreaActive=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\t\t<slot name=\"before-data\" />\n\n\t\t<div\n\t\t\tv-if=\"maxOutputIndex > 0 && branches.length > 1\"\n\t\t\t:class=\"$style.tabs\"\n\t\t\tdata-test-id=\"branches\"\n\t\t>\n\t\t\t<n8n-tabs\n\t\t\t\t:modelValue=\"currentOutputIndex\"\n\t\t\t\t:options=\"branches\"\n\t\t\t\t@update:modelValue=\"onBranchChange\"\n\t\t\t/>\n\t\t\t<run-data-search\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t:isAreaActive=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-else-if=\"\n\t\t\t\thasNodeRun &&\n\t\t\t\t((dataCount > 0 && maxRunIndex === 0) || search) &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t:class=\"$style.itemsCount\"\n\t\t\tdata-test-id=\"ndv-items-count\"\n\t\t>\n\t\t\t<n8n-text v-if=\"search\">\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\tadjustToNumber: unfilteredDataCount,\n\t\t\t\t\t\tinterpolate: { matched: dataCount, total: unfilteredDataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<n8n-text v-else>\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\tadjustToNumber: dataCount,\n\t\t\t\t\t\tinterpolate: { count: dataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<run-data-search\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t:isAreaActive=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div :class=\"$style.dataContainer\" ref=\"dataContainer\" data-test-id=\"ndv-data-container\">\n\t\t\t<div v-if=\"isExecuting\" :class=\"$style.center\" data-test-id=\"ndv-executing\">\n\t\t\t\t<div :class=\"$style.spinner\"><n8n-spinner type=\"ring\" /></div>\n\t\t\t\t<n8n-text>{{ executingMessage }}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"editMode.enabled\" :class=\"$style.editMode\">\n\t\t\t\t<div :class=\"[$style.editModeBody, 'ignore-key-press']\">\n\t\t\t\t\t<code-node-editor\n\t\t\t\t\t\t:modelValue=\"editMode.value\"\n\t\t\t\t\t\tlanguage=\"json\"\n\t\t\t\t\t\t@update:modelValue=\"ndvStore.setOutputPanelEditModeValue($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.editModeFooter\">\n\t\t\t\t\t<n8n-info-tip :bold=\"false\" :class=\"$style.editModeFooterInfotip\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.editor.copyDataInfo') }}\n\t\t\t\t\t\t<n8n-link :to=\"dataEditingDocsUrl\" size=\"small\">\n\t\t\t\t\t\t\t{{ $locale.baseText('generic.learnMore') }}\n\t\t\t\t\t\t</n8n-link>\n\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"paneType === 'output' && hasSubworkflowExecutionError\"\n\t\t\t\t:class=\"$style.stretchVertically\"\n\t\t\t>\n\t\t\t\t<NodeErrorView :error=\"subworkflowExecutionError\" :class=\"$style.errorDisplay\" />\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"!hasNodeRun\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"node-not-run\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"paneType === 'input' && node.disabled\" :class=\"$style.center\">\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled', { interpolate: { nodeName: node.name } }) }}\n\t\t\t\t\t<n8n-link @click=\"enableNode\">\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled.cta') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && isArtificialRecoveredEventItem\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"recovered-artificial-output-data\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && hasRunError\" :class=\"$style.stretchVertically\">\n\t\t\t\t<n8n-text v-if=\"isPaneTypeInput\" :class=\"$style.center\" size=\"large\" tag=\"p\" bold>\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeErrorView.inputPanel.previousNodeError.title', {\n\t\t\t\t\t\t\tinterpolate: { nodeName: node.name },\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t</n8n-text>\n\t\t\t\t<slot name=\"content\" v-else-if=\"$slots['content']\"></slot>\n\t\t\t\t<NodeErrorView\n\t\t\t\t\tv-else\n\t\t\t\t\t:error=\"workflowRunData[node.name][runIndex].error\"\n\t\t\t\t\t:class=\"$style.dataDisplay\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun && (!unfilteredDataCount || (search && !dataCount)) && branches.length > 1\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<div v-if=\"search\">\n\t\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t\t<n8n-text v-else>\n\t\t\t\t\t{{ noDataInBranchMessage }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !inputData.length && !search\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"no-output-data\">xxx</slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !showData\" :class=\"$style.center\">\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{ tooMuchDataTitle }}</n8n-text>\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\"\n\t\t\t\t\t><span\n\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t$locale.baseText('ndv.output.tooMuchData.message', {\n\t\t\t\t\t\t\t\tinterpolate: { size: dataSizeInMB },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t></span\n\t\t\t\t></n8n-text>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\toutline\n\t\t\t\t\t:label=\"$locale.baseText('ndv.output.tooMuchData.showDataAnyway')\"\n\t\t\t\t\t@click=\"showTooMuchData\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t@click=\"downloadJsonData()\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<!-- V-else slot named content which only renders if $slots.content is passed and hasNodeRun -->\n\t\t\t<slot name=\"content\" v-else-if=\"hasNodeRun && $slots['content']\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun &&\n\t\t\t\t\tdisplayMode === 'table' &&\n\t\t\t\t\tbinaryData.length > 0 &&\n\t\t\t\t\tinputData.length === 1 &&\n\t\t\t\t\tObject.keys(jsonData[0] || {}).length === 0\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.info') }}\n\t\t\t\t\t<a @click=\"switchToBinary\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.binary') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"showIoSearchNoMatchContent\" :class=\"$style.center\">\n\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'table'\">\n\t\t\t\t<run-data-table\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:inputData=\"inputDataPage\"\n\t\t\t\t\t:mappingEnabled=\"mappingEnabled\"\n\t\t\t\t\t:distanceFromActive=\"distanceFromActive\"\n\t\t\t\t\t:runIndex=\"runIndex\"\n\t\t\t\t\t:pageOffset=\"currentPageOffset\"\n\t\t\t\t\t:totalRuns=\"maxRunIndex\"\n\t\t\t\t\t:hasDefaultHoverState=\"paneType === 'input' && !search\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t\t@mounted=\"$emit('tableMounted', $event)\"\n\t\t\t\t\t@activeRowChanged=\"onItemHover\"\n\t\t\t\t\t@displayModeChange=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'json'\">\n\t\t\t\t<run-data-json\n\t\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t\t:editMode=\"editMode\"\n\t\t\t\t\t:sessioId=\"sessionId\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:inputData=\"inputDataPage\"\n\t\t\t\t\t:mappingEnabled=\"mappingEnabled\"\n\t\t\t\t\t:distanceFromActive=\"distanceFromActive\"\n\t\t\t\t\t:runIndex=\"runIndex\"\n\t\t\t\t\t:totalRuns=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isPaneTypeOutput && displayMode === 'html'\">\n\t\t\t\t<run-data-html :inputHtml=\"inputDataPage[0].json.html\" />\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isSchemaView\">\n\t\t\t\t<run-data-schema\n\t\t\t\t\t:data=\"jsonData\"\n\t\t\t\t\t:mappingEnabled=\"mappingEnabled\"\n\t\t\t\t\t:distanceFromActive=\"distanceFromActive\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t\t:runIndex=\"runIndex\"\n\t\t\t\t\t:totalRuns=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary' && binaryData.length === 0\" :class=\"$style.center\">\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('runData.noBinaryDataFound')\n\t\t\t\t}}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary'\" :class=\"$style.dataDisplay\">\n\t\t\t\t<div v-for=\"(binaryDataEntry, index) in binaryData\" :key=\"index\">\n\t\t\t\t\t<div :class=\"$style.binaryIndex\" v-if=\"binaryData.length > 1\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ index + 1 }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div :class=\"$style.binaryRow\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t:class=\"$style.binaryCell\"\n\t\t\t\t\t\t\tv-for=\"(binaryData, key) in binaryDataEntry\"\n\t\t\t\t\t\t\t:key=\"index + '_' + key\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div :data-test-id=\"'ndv-binary-data_' + index\">\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryHeader\">\n\t\t\t\t\t\t\t\t\t{{ key }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileName\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileName') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileName }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.directory\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.directory') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.directory }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileExtension\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileExtension') }}:</n8n-text\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileExtension }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.mimeType\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.mimeType') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.mimeType }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileSize\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileSize') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileSize }}</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryButtonContainer\">\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isViewable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.showBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-view-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"displayBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isDownloadable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-download-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"downloadBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\t:class=\"$style.pagination\"\n\t\t\tv-if=\"\n\t\t\t\thasNodeRun &&\n\t\t\t\t!hasRunError &&\n\t\t\t\tbinaryData.length === 0 &&\n\t\t\t\tdataCount > pageSize &&\n\t\t\t\t!isSchemaView &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\tdata-test-id=\"ndv-data-pagination\"\n\t\t>\n\t\t\t<el-pagination\n\t\t\t\tbackground\n\t\t\t\t:hide-on-single-page=\"true\"\n\t\t\t\t:current-page=\"currentPage\"\n\t\t\t\t:pager-count=\"5\"\n\t\t\t\t:page-size=\"pageSize\"\n\t\t\t\tlayout=\"prev, pager, next\"\n\t\t\t\t@update:current-page=\"onCurrentPageChange\"\n\t\t\t\t:total=\"dataCount\"\n\t\t\t>\n\t\t\t</el-pagination>\n\n\t\t\t<div :class=\"$style.pageSizeSelector\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t:modelValue=\"pageSize\"\n\t\t\t\t\t@update:modelValue=\"onPageSizeChange\"\n\t\t\t\t\tteleported\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.pageSize') }}</template>\n\t\t\t\t\t<n8n-option v-for=\"size in pageSizes\" :key=\"size\" :label=\"size\" :value=\"size\">\n\t\t\t\t\t</n8n-option>\n\t\t\t\t\t<n8n-option :label=\"$locale.baseText('ndv.output.all')\" :value=\"dataCount\"> </n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</div>\n\t\t<n8n-block-ui :show=\"blockUI\" :class=\"$style.uiBlocker\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport { saveAs } from 'file-saver';\nimport type {\n\tConnectionTypes,\n\tIBinaryData,\n\tIBinaryKeyData,\n\tIDataObject,\n\tINodeExecutionData,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n} from 'n8n-workflow';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\n\nimport type {\n\tIExecutionResponse,\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIRunDataDisplayMode,\n\tITab,\n\tNodePanelType,\n} from '@/Interface';\n\nimport {\n\tDATA_PINNING_DOCS_URL,\n\tDATA_EDITING_DOCS_URL,\n\tNODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMAX_DISPLAY_DATA_SIZE,\n\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\tTEST_PIN_DATA,\n\tHTML_NODE_TYPE,\n} from '@/constants';\n\nimport BinaryDataDisplay from '@/components/BinaryDataDisplay.vue';\nimport NodeErrorView from '@/components/Error/NodeErrorView.vue';\n\nimport { genericHelpers } from '@/mixins/genericHelpers';\nimport { pinData } from '@/mixins/pinData';\nimport type { PinDataSource } from '@/mixins/pinData';\nimport CodeNodeEditor from '@/components/CodeNodeEditor/CodeNodeEditor.vue';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { clearJsonKey, isEmpty } from '@/utils/typesUtils';\nimport { executionDataToJson } from '@/utils/nodeTypesUtils';\nimport { searchInObject } from '@/utils/objectUtils';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useToast } from '@/composables/useToast';\nimport { isObject } from 'lodash-es';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nconst RunDataTable = defineAsyncComponent(async () => import('@/components/RunDataTable.vue'));\nconst RunDataJson = defineAsyncComponent(async () => import('@/components/RunDataJson.vue'));\nconst RunDataSchema = defineAsyncComponent(async () => import('@/components/RunDataSchema.vue'));\nconst RunDataHtml = defineAsyncComponent(async () => import('@/components/RunDataHtml.vue'));\nconst RunDataSearch = defineAsyncComponent(async () => import('@/components/RunDataSearch.vue'));\n\nexport type EnterEditModeArgs = {\n\torigin: 'editIconButton' | 'insertTestDataLink';\n};\n\nexport default defineComponent({\n\tname: 'RunData',\n\tmixins: [genericHelpers, pinData],\n\tcomponents: {\n\t\tBinaryDataDisplay,\n\t\tNodeErrorView,\n\t\tCodeNodeEditor,\n\t\tRunDataTable,\n\t\tRunDataJson,\n\t\tRunDataSchema,\n\t\tRunDataHtml,\n\t\tRunDataSearch,\n\t},\n\tprops: {\n\t\tnodeUi: {\n\t\t\ttype: Object as PropType<INodeUi>,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttooMuchDataTitle: {\n\t\t\ttype: String,\n\t\t},\n\t\tnoDataInBranchMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tisExecuting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\texecutingMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tpaneType: {\n\t\t\ttype: String as PropType<NodePanelType>,\n\t\t},\n\t\toverrideOutputs: {\n\t\t\ttype: Array as PropType<number[]>,\n\t\t},\n\t\tmappingEnabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdistanceFromActive: {\n\t\t\ttype: Number,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tconnectionType: NodeConnectionType.Main,\n\t\t\tbinaryDataPreviewActive: false,\n\t\t\tdataSize: 0,\n\t\t\tshowData: false,\n\t\t\toutputIndex: 0,\n\t\t\tbinaryDataDisplayVisible: false,\n\t\t\tbinaryDataDisplayData: null as IBinaryData | null,\n\n\t\t\tMAX_DISPLAY_DATA_SIZE,\n\t\t\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\t\t\tcurrentPage: 1,\n\t\t\tpageSize: 10,\n\t\t\tpageSizes: [10, 25, 50, 100],\n\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tisControlledPinDataTooltip: false,\n\t\t\tsearch: '',\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.init();\n\n\t\tif (!this.isPaneTypeInput) {\n\t\t\tthis.showPinDataDiscoveryTooltip(this.jsonData);\n\t\t}\n\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\tbranchIndex: this.currentOutputIndex,\n\t\t});\n\n\t\tif (this.paneType === 'output') {\n\t\t\tthis.setDisplayMode();\n\t\t\tthis.activatePane();\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\tthis.hidePinDataDiscoveryTooltip();\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore),\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdataPinningDocsUrl(): string {\n\t\t\treturn DATA_PINNING_DOCS_URL;\n\t\t},\n\t\tdataEditingDocsUrl(): string {\n\t\t\treturn DATA_EDITING_DOCS_URL;\n\t\t},\n\t\tdisplayMode(): IRunDataDisplayMode {\n\t\t\treturn this.ndvStore.getPanelDisplayMode(this.paneType);\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\treturn (this.nodeUi as INodeUi | null) || null;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisSchemaView(): boolean {\n\t\t\treturn this.displayMode === 'schema';\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\t// Only \"main\" inputs can pin data\n\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, this.nodeType!);\n\t\t\tconst inputNames = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\tconst nonMainInputs = !!inputNames.find((inputName) => inputName !== NodeConnectionType.Main);\n\n\t\t\treturn (\n\t\t\t\t!nonMainInputs &&\n\t\t\t\t!this.isPaneTypeInput &&\n\t\t\t\tthis.isPinDataNodeType &&\n\t\t\t\t!(this.binaryData && this.binaryData.length > 0)\n\t\t\t);\n\t\t},\n\t\tbuttons(): Array<{ label: string; value: string }> {\n\t\t\tconst defaults = [\n\t\t\t\t{ label: this.$locale.baseText('runData.table'), value: 'table' },\n\t\t\t\t{ label: this.$locale.baseText('runData.json'), value: 'json' },\n\t\t\t];\n\n\t\t\tif (this.binaryData.length) {\n\t\t\t\tdefaults.push({ label: this.$locale.baseText('runData.binary'), value: 'binary' });\n\t\t\t}\n\n\t\t\tconst schemaView = { label: this.$locale.baseText('runData.schema'), value: 'schema' };\n\t\t\tif (this.isPaneTypeInput && !isEmpty(this.jsonData)) {\n\t\t\t\tdefaults.unshift(schemaView);\n\t\t\t} else {\n\t\t\t\tdefaults.push(schemaView);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.isPaneTypeOutput &&\n\t\t\t\tthis.activeNode?.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate'\n\t\t\t) {\n\t\t\t\tdefaults.unshift({ label: 'HTML', value: 'html' });\n\t\t\t}\n\n\t\t\treturn defaults;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\t!this.isExecuting &&\n\t\t\t\t\tthis.node &&\n\t\t\t\t\t((this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name)) ||\n\t\t\t\t\t\tthis.hasPinData),\n\t\t\t);\n\t\t},\n\t\tisArtificialRecoveredEventItem(): boolean {\n\t\t\treturn !!this.rawInputData?.[0]?.json?.isArtificialRecoveredEventItem;\n\t\t},\n\t\tsubworkflowExecutionError(): Error | null {\n\t\t\treturn this.workflowsStore.subWorkflowExecutionError;\n\t\t},\n\t\thasSubworkflowExecutionError(): boolean {\n\t\t\treturn Boolean(this.subworkflowExecutionError);\n\t\t},\n\t\thasRunError(): boolean {\n\t\t\treturn Boolean(this.node && this.workflowRunData?.[this.node.name]?.[this.runIndex]?.error);\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tdataCount(): number {\n\t\t\treturn this.getDataCount(this.runIndex, this.currentOutputIndex);\n\t\t},\n\t\tunfilteredDataCount(): number {\n\t\t\treturn this.pinData ? this.pinData.length : this.rawInputData.length;\n\t\t},\n\t\tdataSizeInMB(): string {\n\t\t\treturn (this.dataSize / 1024 / 1000).toLocaleString();\n\t\t},\n\t\tmaxOutputIndex(): number {\n\t\t\tif (this.node === null || this.runIndex === undefined) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length < this.runIndex) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name][this.runIndex]) {\n\t\t\t\tconst taskData = runData[this.node.name][this.runIndex].data;\n\t\t\t\tif (taskData?.main) {\n\t\t\t\t\treturn taskData.main.length - 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tcurrentPageOffset(): number {\n\t\t\treturn this.pageSize * (this.currentPage - 1);\n\t\t},\n\t\tmaxRunIndex(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\trawInputData(): INodeExecutionData[] {\n\t\t\treturn this.getRawInputData(this.runIndex, this.currentOutputIndex, this.connectionType);\n\t\t},\n\t\tinputData(): INodeExecutionData[] {\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(this.rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData);\n\t\t},\n\t\tinputDataPage(): INodeExecutionData[] {\n\t\t\tconst offset = this.pageSize * (this.currentPage - 1);\n\t\t\treturn this.inputData.slice(offset, offset + this.pageSize);\n\t\t},\n\t\tjsonData(): IDataObject[] {\n\t\t\treturn executionDataToJson(this.inputData);\n\t\t},\n\t\tbinaryData(): IBinaryKeyData[] {\n\t\t\tif (!this.node) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.node.name,\n\t\t\t\tthis.runIndex,\n\t\t\t\tthis.currentOutputIndex,\n\t\t\t);\n\t\t\treturn binaryData.filter((data) => Boolean(data && Object.keys(data).length));\n\t\t},\n\t\tcurrentOutputIndex(): number {\n\t\t\tif (this.overrideOutputs?.length && !this.overrideOutputs.includes(this.outputIndex)) {\n\t\t\t\treturn this.overrideOutputs[0];\n\t\t\t}\n\n\t\t\treturn this.outputIndex;\n\t\t},\n\t\tbranches(): ITab[] {\n\t\t\tconst capitalize = (name: string) => name.charAt(0).toLocaleUpperCase() + name.slice(1);\n\n\t\t\tconst branches: ITab[] = [];\n\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\tif (this.overrideOutputs && !this.overrideOutputs.includes(i)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst totalItemsCount = this.getRawInputData(this.runIndex, i).length;\n\t\t\t\tconst itemsCount = this.getDataCount(this.runIndex, i);\n\t\t\t\tconst items = this.search\n\t\t\t\t\t? this.$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\t\tadjustToNumber: totalItemsCount,\n\t\t\t\t\t\t\tinterpolate: { matched: itemsCount, total: totalItemsCount },\n\t\t\t\t\t })\n\t\t\t\t\t: this.$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t\t\t });\n\t\t\t\tlet outputName = this.getOutputName(i);\n\n\t\t\t\tif (`${outputName}` === `${i}`) {\n\t\t\t\t\toutputName = `${this.$locale.baseText('ndv.output')} ${outputName}`;\n\t\t\t\t} else {\n\t\t\t\t\tconst appendBranchWord = NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND.includes(\n\t\t\t\t\t\tthis.node?.type,\n\t\t\t\t\t)\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: ` ${this.$locale.baseText('ndv.output.branch')}`;\n\t\t\t\t\toutputName = capitalize(`${this.getOutputName(i)}${appendBranchWord}`);\n\t\t\t\t}\n\t\t\t\tbranches.push({\n\t\t\t\t\tlabel:\n\t\t\t\t\t\t(this.search && itemsCount) || totalItemsCount\n\t\t\t\t\t\t\t? `${outputName} (${items})`\n\t\t\t\t\t\t\t: outputName,\n\t\t\t\t\tvalue: i,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn branches;\n\t\t},\n\t\teditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.isPaneTypeInput\n\t\t\t\t? { enabled: false, value: '' }\n\t\t\t\t: this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisPaneTypeInput(): boolean {\n\t\t\treturn this.paneType === 'input';\n\t\t},\n\t\tisPaneTypeOutput(): boolean {\n\t\t\treturn this.paneType === 'output';\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tshowIOSearch(): boolean {\n\t\t\treturn this.hasNodeRun && !this.hasRunError;\n\t\t},\n\t\tshowIoSearchNoMatchContent(): boolean {\n\t\t\treturn this.hasNodeRun && !this.inputData.length && this.search;\n\t\t},\n\t},\n\tmethods: {\n\t\tgetResolvedNodeOutputs() {\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\n\t\t\t\tif (workflowNode) {\n\t\t\t\t\tconst outputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, this.nodeType);\n\t\t\t\t\treturn outputs;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [];\n\t\t},\n\t\tonItemHover(itemIndex: number | null) {\n\t\t\tif (itemIndex === null) {\n\t\t\t\tthis.$emit('itemHover', null);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.$emit('itemHover', {\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\titemIndex,\n\t\t\t});\n\t\t},\n\t\tonClickDataPinningDocsLink() {\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'data-pinning-docs',\n\t\t\t});\n\t\t},\n\t\tshowPinDataDiscoveryTooltip(value: IDataObject[]) {\n\t\t\tif (!this.isTriggerNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst pinDataDiscoveryFlag = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value;\n\n\t\t\tif (value && value.length > 0 && !this.isReadOnlyRoute && !pinDataDiscoveryFlag) {\n\t\t\t\tthis.pinDataDiscoveryComplete();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isControlledPinDataTooltip = true;\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: true });\n\t\t\t\t}, 500); // Wait for NDV to open\n\t\t\t}\n\t\t},\n\t\thidePinDataDiscoveryTooltip() {\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.isControlledPinDataTooltip = false;\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: false });\n\t\t\t}\n\t\t},\n\t\tpinDataDiscoveryComplete() {\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value = 'true';\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\t\t},\n\t\tenterEditMode({ origin }: EnterEditModeArgs) {\n\t\t\tconst inputData = this.pinData\n\t\t\t\t? clearJsonKey(this.pinData)\n\t\t\t\t: executionDataToJson(this.rawInputData);\n\n\t\t\tconst data = inputData.length > 0 ? inputData : TEST_PIN_DATA;\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(true);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue(JSON.stringify(data, null, 2));\n\n\t\t\tthis.$telemetry.track('User opened ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tclick_type: origin === 'editIconButton' ? 'button' : 'link',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tis_output_present: this.hasNodeRun || this.hasPinData,\n\t\t\t\tview: !this.hasNodeRun && !this.hasPinData ? 'undefined' : this.displayMode,\n\t\t\t\tis_data_pinned: this.hasPinData,\n\t\t\t});\n\t\t},\n\t\tonClickCancelEdit() {\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue('');\n\t\t\tthis.onExitEditMode({ type: 'cancel' });\n\t\t},\n\t\tonClickSaveEdit() {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { value } = this.editMode;\n\n\t\t\tthis.clearAllStickyNotifications();\n\n\t\t\ttry {\n\t\t\t\tthis.setPinData(this.node, clearJsonKey(value) as INodeExecutionData[], 'save-edit');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\n\t\t\tthis.onExitEditMode({ type: 'save' });\n\t\t},\n\t\tonExitEditMode({ type }: { type: 'save' | 'cancel' }) {\n\t\t\tthis.$telemetry.track('User closed ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tview: this.displayMode,\n\t\t\t\ttype,\n\t\t\t});\n\t\t},\n\t\tasync onTogglePinData({ source }: { source: PinDataSource }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (source === 'pin-icon-click') {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\trun_index: this.runIndex,\n\t\t\t\t\tview: !this.hasNodeRun && !this.hasPinData ? 'none' : this.displayMode,\n\t\t\t\t};\n\n\t\t\t\tvoid this.externalHooks.run('runData.onTogglePinData', telemetryPayload);\n\t\t\t\tthis.$telemetry.track('User clicked pin data icon', telemetryPayload);\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node);\n\n\t\t\tif (this.hasPinData) {\n\t\t\t\tthis.unsetPinData(this.node, source);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.setPinData(this.node, this.rawInputData, 'pin-icon-click');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.maxRunIndex > 0) {\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttitle: this.$locale.baseText('ndv.pinData.pin.multipleRuns.title', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tindex: `${this.runIndex}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tmessage: this.$locale.baseText('ndv.pinData.pin.multipleRuns.description'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tduration: 2000,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.hidePinDataDiscoveryTooltip();\n\t\t\tthis.pinDataDiscoveryComplete();\n\t\t},\n\t\tswitchToBinary() {\n\t\t\tthis.onDisplayModeChange('binary');\n\t\t},\n\t\tonBranchChange(value: number) {\n\t\t\tthis.outputIndex = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv branch', {\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tbranch_index: value,\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tnode_type_input_selection: this.nodeType ? this.nodeType.name : '',\n\t\t\t\tpane: this.paneType,\n\t\t\t});\n\t\t},\n\t\tshowTooMuchData() {\n\t\t\tthis.showData = true;\n\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tpane: this.paneType,\n\t\t\t\ttype: 'showTooMuchData',\n\t\t\t});\n\t\t},\n\t\ttoggleLinkRuns() {\n\t\t\tthis.linkedRuns ? this.unlinkRun() : this.linkRun();\n\t\t},\n\t\tlinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tunlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonCurrentPageChange(value) {\n\t\t\tthis.currentPage = value;\n\t\t\tthis.$telemetry.track('User changed ndv page', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonPageSizeChange(pageSize: number) {\n\t\t\tthis.pageSize = pageSize;\n\t\t\tconst maxPage = Math.ceil(this.dataCount / this.pageSize);\n\t\t\tif (maxPage < this.currentPage) {\n\t\t\t\tthis.currentPage = maxPage;\n\t\t\t}\n\n\t\t\tthis.$telemetry.track('User changed ndv page size', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonDisplayModeChange(displayMode: IRunDataDisplayMode) {\n\t\t\tconst previous = this.displayMode;\n\t\t\tthis.ndvStore.setPanelDisplayMode({ pane: this.paneType, mode: displayMode });\n\n\t\t\tconst dataContainerRef = this.$refs.dataContainer as Element | undefined;\n\t\t\tif (dataContainerRef) {\n\t\t\t\tconst dataDisplay = dataContainerRef.children[0];\n\n\t\t\t\tif (dataDisplay) {\n\t\t\t\t\tdataDisplay.scrollTo(0, 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tvoid this.externalHooks.run('runData.displayModeChanged', {\n\t\t\t\tnewValue: displayMode,\n\t\t\t\toldValue: previous,\n\t\t\t});\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User changed ndv item view', {\n\t\t\t\t\tprevious_view: previous,\n\t\t\t\t\tnew_view: displayMode,\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: this.paneType,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tgetRunLabel(option: number) {\n\t\t\tlet itemsCount = 0;\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\titemsCount += this.getPinDataOrLiveData(this.getRawInputData(option - 1, i)).length;\n\t\t\t}\n\t\t\tconst items = this.$locale.baseText('ndv.output.items', {\n\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t});\n\t\t\tconst itemsLabel = itemsCount > 0 ? ` (${items})` : '';\n\t\t\treturn option + this.$locale.baseText('ndv.output.of') + (this.maxRunIndex + 1) + itemsLabel;\n\t\t},\n\t\tgetRawInputData(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t): INodeExecutionData[] {\n\t\t\tlet inputData: INodeExecutionData[] = [];\n\n\t\t\tif (this.node) {\n\t\t\t\tinputData = this.nodeHelpers.getNodeInputData(\n\t\t\t\t\tthis.node,\n\t\t\t\t\trunIndex,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tthis.paneType,\n\t\t\t\t\tconnectionType,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (inputData.length === 0 || !Array.isArray(inputData)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn inputData;\n\t\t},\n\t\tgetPinDataOrLiveData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (this.pinData && !this.isProductionExecutionPreview) {\n\t\t\t\treturn Array.isArray(this.pinData)\n\t\t\t\t\t? this.pinData.map((value) => ({\n\t\t\t\t\t\t\tjson: value,\n\t\t\t\t\t }))\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tjson: this.pinData,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t ];\n\t\t\t}\n\t\t\treturn inputData;\n\t\t},\n\t\tgetFilteredData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (!this.search) {\n\t\t\t\treturn inputData;\n\t\t\t}\n\n\t\t\tthis.currentPage = 1;\n\t\t\treturn inputData.filter(({ json }) => searchInObject(json, this.search));\n\t\t},\n\t\tgetDataCount(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (this.workflowRunData?.[this.node.name]?.[runIndex]?.hasOwnProperty('error')) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tconst rawInputData = this.getRawInputData(runIndex, outputIndex, connectionType);\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData).length;\n\t\t},\n\t\tinit() {\n\t\t\t// Reset the selected output index every time another node gets selected\n\t\t\tthis.outputIndex = 0;\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tlet outputTypes: ConnectionTypes[] = [];\n\t\t\tif (this.nodeType !== null && this.node !== null) {\n\t\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\t\toutputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t}\n\t\t\tthis.connectionType = outputTypes.length === 0 ? NodeConnectionType.Main : outputTypes[0];\n\t\t\tif (this.binaryData.length > 0) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'binary',\n\t\t\t\t});\n\t\t\t} else if (this.displayMode === 'binary') {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'table',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcloseBinaryDataDisplay() {\n\t\t\tthis.binaryDataDisplayVisible = false;\n\t\t\tthis.binaryDataDisplayData = null;\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(null);\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tisViewable(index: number, key: string): boolean {\n\t\t\tconst { fileType } = this.binaryData[index][key];\n\t\t\treturn (\n\t\t\t\t!!fileType && ['image', 'audio', 'video', 'text', 'json', 'pdf', 'html'].includes(fileType)\n\t\t\t);\n\t\t},\n\t\tisDownloadable(index: number, key: string): boolean {\n\t\t\tconst { mimeType, fileName } = this.binaryData[index][key];\n\t\t\treturn !!(mimeType && fileName);\n\t\t},\n\t\tasync downloadBinaryData(index: number, key: string) {\n\t\t\tconst { id, data, fileName, fileExtension, mimeType } = this.binaryData[index][key];\n\n\t\t\tif (id) {\n\t\t\t\tconst url = this.workflowsStore.getBinaryUrl(id, 'download', fileName, mimeType);\n\t\t\t\tsaveAs(url, [fileName, fileExtension].join('.'));\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tconst bufferString = 'data:' + mimeType + ';base64,' + data;\n\t\t\t\tconst blob = await fetch(bufferString).then(async (d) => d.blob());\n\t\t\t\tsaveAs(blob, fileName);\n\t\t\t}\n\t\t},\n\t\tasync downloadJsonData() {\n\t\t\tconst fileName = this.node!.name.replace(/[^\\w\\d]/g, '_');\n\t\t\tconst blob = new Blob([JSON.stringify(this.rawInputData, null, 2)], {\n\t\t\t\ttype: 'application/json',\n\t\t\t});\n\n\t\t\tsaveAs(blob, `${fileName}.json`);\n\t\t},\n\t\tdisplayBinaryData(index: number, key: string) {\n\t\t\tthis.binaryDataDisplayVisible = true;\n\n\t\t\tthis.binaryDataDisplayData = {\n\t\t\t\tnode: this.node!.name,\n\t\t\t\trunIndex: this.runIndex,\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\tindex,\n\t\t\t\tkey,\n\t\t\t};\n\t\t},\n\t\tgetOutputName(outputIndex: number) {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\tconst nodeType = this.nodeType;\n\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\tconst outputConfiguration = outputs?.[outputIndex] as INodeOutputConfiguration;\n\n\t\t\tif (outputConfiguration && isObject(outputConfiguration)) {\n\t\t\t\treturn outputConfiguration?.displayName;\n\t\t\t}\n\t\t\tif (!nodeType?.outputNames || nodeType.outputNames.length <= outputIndex) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\treturn nodeType.outputNames[outputIndex];\n\t\t},\n\t\trefreshDataSize() {\n\t\t\t// Hide by default the data from being displayed\n\t\t\tthis.showData = false;\n\t\t\tconst jsonItems = this.inputDataPage.map((item) => item.json);\n\t\t\tthis.dataSize = JSON.stringify(jsonItems).length;\n\t\t\tif (this.dataSize < this.MAX_DISPLAY_DATA_SIZE) {\n\t\t\t\t// Data is reasonable small (< 200kb) so display it directly\n\t\t\t\tthis.showData = true;\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tenableNode() {\n\t\t\tif (this.node) {\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdisabled: !this.node.disabled,\n\t\t\t\t\t} as IDataObject,\n\t\t\t\t} as INodeUpdatePropertiesInformation;\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetDisplayMode() {\n\t\t\tif (!this.activeNode) return;\n\n\t\t\tconst shouldDisplayHtml =\n\t\t\t\tthis.activeNode.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate';\n\n\t\t\tif (shouldDisplayHtml) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\tmode: 'html',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t\tonSearchClear() {\n\t\t\tthis.search = '';\n\t\t\tdocument.dispatchEvent(new KeyboardEvent('keyup', { key: '/' }));\n\t\t},\n\t},\n\twatch: {\n\t\tnode() {\n\t\t\tthis.init();\n\t\t},\n\t\thasNodeRun() {\n\t\t\tif (this.paneType === 'output') this.setDisplayMode();\n\t\t},\n\t\tinputDataPage: {\n\t\t\thandler(data: INodeExecutionData[]) {\n\t\t\t\tif (this.paneType && data) {\n\t\t\t\t\tthis.ndvStore.setNDVPanelDataIsEmpty({\n\t\t\t\t\t\tpanel: this.paneType as 'input' | 'output',\n\t\t\t\t\t\tisEmpty: data.every((item) => isEmpty(item.json)),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\t\tjsonData(value: IDataObject[]) {\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.showPinDataDiscoveryTooltip(value);\n\t\t},\n\t\tbinaryData(newData: IBinaryKeyData[], prevData: IBinaryKeyData[]) {\n\t\t\tif (newData.length && !prevData.length && this.displayMode !== 'binary') {\n\t\t\t\tthis.switchToBinary();\n\t\t\t} else if (!newData.length && this.displayMode === 'binary') {\n\t\t\t\tthis.onDisplayModeChange('table');\n\t\t\t}\n\t\t},\n\t\tcurrentOutputIndex(branchIndex: number) {\n\t\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\tbranchIndex,\n\t\t\t});\n\t\t},\n\t\tsearch(newSearch: string) {\n\t\t\tthis.$emit('search', newSearch);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.infoIcon {\n\tcolor: var(--color-foreground-dark);\n}\n\n.center {\n\tdisplay: flex;\n\theight: 100%;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\n\t> * {\n\t\tmax-width: 316px;\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-run-data-background);\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.pinnedDataCallout {\n\tborder-radius: inherit;\n\tborder-bottom-right-radius: 0;\n\tborder-top: 0;\n\tborder-left: 0;\n\tborder-right: 0;\n}\n\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n\tpadding: var(--spacing-s) var(--spacing-s) 0 var(--spacing-s);\n\tposition: relative;\n\toverflow-x: auto;\n\toverflow-y: hidden;\n\tmin-height: calc(30px + var(--spacing-s));\n\n\t> *:first-child {\n\t\tflex-grow: 1;\n\t}\n}\n\n.dataContainer {\n\tposition: relative;\n\toverflow-y: auto;\n\theight: 100%;\n\n\t&:hover {\n\t\t.actions-group {\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n\n.dataDisplay {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: 0 var(--spacing-s) var(--spacing-3xl) var(--spacing-s);\n\tright: 0;\n\toverflow-y: auto;\n\tline-height: var(--font-line-height-xloose);\n\tword-break: normal;\n\theight: 100%;\n}\n\n.tabs {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.itemsCount {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n}\n\n.runSelector {\n\tpadding-left: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n\tdisplay: flex;\n\twidth: 100%;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.runSelectorWrapper {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.pagination {\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tbottom: 0;\n\tpadding: 5px;\n\toverflow-y: hidden;\n}\n\n.pageSizeSelector {\n\ttext-transform: capitalize;\n\tmax-width: 150px;\n\tflex: 0 1 auto;\n}\n\n.binaryIndex {\n\tdisplay: block;\n\tpadding: var(--spacing-2xs);\n\tfont-size: var(--font-size-2xs);\n\n\t> * {\n\t\tdisplay: inline-block;\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tline-height: 30px;\n\t\tborder-radius: var(--border-radius-base);\n\t\ttext-align: center;\n\t\tbackground-color: var(--color-foreground-xdark);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-xlight);\n\t}\n}\n\n.binaryRow {\n\tdisplay: inline-flex;\n\tfont-size: var(--font-size-2xs);\n}\n\n.binaryCell {\n\tdisplay: inline-block;\n\twidth: 300px;\n\toverflow: hidden;\n\tbackground-color: var(--color-foreground-xlight);\n\tmargin-right: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n\tborder-radius: var(--border-radius-base);\n\tborder: var(--border-base);\n\tpadding: var(--spacing-s);\n}\n\n.binaryHeader {\n\tcolor: $color-primary;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: 1.2em;\n\tpadding-bottom: var(--spacing-2xs);\n\tmargin-bottom: var(--spacing-2xs);\n\tborder-bottom: 1px solid var(--color-text-light);\n}\n\n.binaryButtonContainer {\n\tmargin-top: 1.5em;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\n\t> * {\n\t\tflex-grow: 0;\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n.binaryValue {\n\twhite-space: initial;\n\tword-wrap: break-word;\n}\n\n.displayModes {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tflex-grow: 1;\n}\n.tooltipContain {\n\tmax-width: 240px;\n}\n\n.pinDataButton {\n\tsvg {\n\t\ttransition: transform 0.3s ease;\n\t}\n}\n\n.spinner {\n\t* {\n\t\tcolor: var(--color-primary);\n\t\tmin-height: 40px;\n\t\tmin-width: 40px;\n\t}\n\n\tdisplay: flex;\n\tjustify-content: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.editMode {\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: stretch;\n\tpadding-left: var(--spacing-s);\n\tpadding-right: var(--spacing-s);\n}\n\n.editModeBody {\n\tflex: 1 1 auto;\n\tmax-height: 100%;\n\twidth: 100%;\n\toverflow: auto;\n}\n\n.editModeFooter {\n\tflex: 0 1 auto;\n\tdisplay: flex;\n\twidth: 100%;\n\tjustify-content: space-between;\n\talign-items: center;\n\tpadding-top: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n}\n\n.editModeFooterInfotip {\n\tdisplay: flex;\n\tflex: 1;\n\twidth: 100%;\n}\n\n.editModeActions {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n}\n\n.stretchVertically {\n\theight: 100%;\n}\n\n.uiBlocker {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.run-data {\n\t.code-node-editor {\n\t\theight: 100%;\n\t}\n}\n</style>\n\n<style lang=\"scss\" scoped>\n:deep(.highlight) {\n\tbackground-color: #f7dc55;\n\tcolor: black;\n\tborder-radius: var(--border-radius-base);\n\tpadding: 0 1px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n</style>\n","<template>\n\t<n8n-info-tip type=\"tooltip\" theme=\"info-light\" tooltipPlacement=\"right\" v-if=\"runMetadata\">\n\t\t<div>\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.startTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.startTime }}<br />\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.executionTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.executionTime }} {{ $locale.baseText('runData.ms') }}\n\t\t</div>\n\t</n8n-info-tip>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { ITaskData } from 'n8n-workflow';\n\nexport default defineComponent({\n\tprops: {\n\t\ttaskData: {}, // ITaskData\n\t},\n\n\tcomputed: {\n\t\trunTaskData(): ITaskData {\n\t\t\treturn this.taskData as ITaskData;\n\t\t},\n\t\trunMetadata(): { executionTime: number; startTime: string } | null {\n\t\t\tif (!this.runTaskData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\texecutionTime: this.runTaskData.executionTime,\n\t\t\t\tstartTime: new Date(this.runTaskData.startTime).toLocaleString(),\n\t\t\t};\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<RunData\n\t\t:nodeUi=\"node\"\n\t\t:runIndex=\"runIndex\"\n\t\t:linkedRuns=\"linkedRuns\"\n\t\t:canLinkRuns=\"canLinkRuns\"\n\t\t:tooMuchDataTitle=\"$locale.baseText('ndv.output.tooMuchData.title')\"\n\t\t:noDataInBranchMessage=\"$locale.baseText('ndv.output.noOutputDataInBranch')\"\n\t\t:isExecuting=\"isNodeRunning\"\n\t\t:executingMessage=\"$locale.baseText('ndv.output.executing')\"\n\t\t:sessionId=\"sessionId\"\n\t\t:blockUI=\"blockUI\"\n\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t:isPaneActive=\"isPaneActive\"\n\t\t@activatePane=\"activatePane\"\n\t\tpaneType=\"output\"\n\t\t@runChange=\"onRunIndexChange\"\n\t\t@linkRun=\"onLinkRun\"\n\t\t@unlinkRun=\"onUnlinkRun\"\n\t\t@tableMounted=\"$emit('tableMounted', $event)\"\n\t\t@itemHover=\"$emit('itemHover', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t\tref=\"runData\"\n\t\t:data-output-type=\"outputMode\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<template v-if=\"hasAiMetadata\">\n\t\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\t\t:options=\"outputTypes\"\n\t\t\t\t\t\tv-model=\"outputMode\"\n\t\t\t\t\t\t@update:modelValue=\"onUpdateOutputMode\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<span :class=\"$style.title\" v-else>\n\t\t\t\t\t{{ $locale.baseText(outputPanelEditMode.enabled ? 'ndv.output.edit' : 'ndv.output') }}\n\t\t\t\t</span>\n\t\t\t\t<RunInfo\n\t\t\t\t\tv-if=\"!hasPinData && runsCount === 1\"\n\t\t\t\t\tv-show=\"!outputPanelEditMode.enabled\"\n\t\t\t\t\t:taskData=\"runTaskData\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-info-tip\n\t\t\t\t\ttheme=\"warning\"\n\t\t\t\t\ttype=\"tooltip\"\n\t\t\t\t\ttooltipPlacement=\"right\"\n\t\t\t\t\tv-if=\"hasNodeRun && staleData\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\thasPinData\n\t\t\t\t\t\t\t\t\t? 'ndv.output.staleDataWarning.pinData'\n\t\t\t\t\t\t\t\t\t: 'ndv.output.staleDataWarning.regular',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\"\n\t\t\t\t\t></span>\n\t\t\t\t</n8n-info-tip>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #node-not-run>\n\t\t\t<n8n-text v-if=\"workflowRunning && !isTriggerNode\" data-test-id=\"ndv-output-waiting\">{{\n\t\t\t\t$locale.baseText('ndv.output.waitingToRun')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text v-if=\"!workflowRunning\" data-test-id=\"ndv-output-run-node-hint\">\n\t\t\t\t<template v-if=\"isSubNode\">\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHintSubNode') }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHint') }}\n\t\t\t\t\t<span @click=\"insertTestData\" v-if=\"canPinData\">\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t{{ $locale.baseText('generic.or') }}\n\t\t\t\t\t\t<n8n-text tag=\"a\" size=\"medium\" color=\"primary\">\n\t\t\t\t\t\t\t{{ $locale.baseText('ndv.output.insertTestData') }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.output.noOutputData.title')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message') }}\n\t\t\t\t<a @click=\"openSettings\">{{\n\t\t\t\t\t$locale.baseText('ndv.output.noOutputData.message.settings')\n\t\t\t\t}}</a>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message.settingsOption') }}\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template #content v-if=\"outputMode === 'logs'\">\n\t\t\t<run-data-ai :node=\"node\" :run-index=\"runIndex\" />\n\t\t</template>\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #run-info v-if=\"!hasPinData && runsCount > 1\">\n\t\t\t<RunInfo :taskData=\"runTaskData\" />\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IExecutionResponse, INodeUi } from '@/Interface';\nimport type { INodeTypeDescription, IRunData, IRunExecutionData, ITaskData } from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport RunInfo from './RunInfo.vue';\nimport { pinData } from '@/mixins/pinData';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport RunDataAi from './RunDataAi/RunDataAi.vue';\nimport { ndvEventBus } from '@/event-bus';\n\ntype RunDataRef = InstanceType<typeof RunData>;\n\nconst OUTPUT_TYPE = {\n\tREGULAR: 'regular',\n\tLOGS: 'logs',\n};\n\nexport default defineComponent({\n\tname: 'OutputPanel',\n\tmixins: [pinData],\n\tcomponents: { RunData, RunInfo, RunDataAi },\n\tdata() {\n\t\treturn {\n\t\t\toutputMode: 'regular',\n\t\t\toutputTypes: [\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.regular'), value: OUTPUT_TYPE.REGULAR },\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.logs'), value: OUTPUT_TYPE.LOGS },\n\t\t\t],\n\t\t};\n\t},\n\tprops: {\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\thasAiMetadata(): boolean {\n\t\t\tif (this.node) {\n\t\t\t\tconst resultData = this.workflowsStore.getWorkflowResultDataByNodeName(this.node.name);\n\n\t\t\t\tif (!resultData || !Array.isArray(resultData) || resultData.length === 0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn !!resultData[resultData.length - 1].metadata;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!(this.nodeType && this.nodeType.group.includes('schedule'));\n\t\t},\n\t\tisNodeRunning(): boolean {\n\t\t\treturn this.node && this.workflowsStore.isNodeExecuting(this.node.name);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (!executionData?.resultData?.runData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn executionData.resultData.runData;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\tif (this.workflowsStore.subWorkflowExecutionError) return true;\n\n\t\t\treturn Boolean(\n\t\t\t\tthis.node && this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name),\n\t\t\t);\n\t\t},\n\t\trunTaskData(): ITaskData | null {\n\t\t\tif (!this.node || this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst runData = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length <= this.runIndex) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn runData[this.node.name][this.runIndex];\n\t\t},\n\t\trunsCount(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tstaleData(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst updatedAt = this.workflowsStore.getParametersLastUpdate(this.node.name);\n\t\t\tif (!updatedAt || !this.runTaskData) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst runAt = this.runTaskData.startTime;\n\t\t\treturn updatedAt > runAt;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\treturn this.isPinDataNodeType && !this.isReadOnly;\n\t\t},\n\t},\n\tmethods: {\n\t\tinsertTestData() {\n\t\t\tconst runDataRef = this.$refs.runData as RunDataRef | undefined;\n\t\t\tif (runDataRef) {\n\t\t\t\trunDataRef.enterEditMode({\n\t\t\t\t\torigin: 'insertTestDataLink',\n\t\t\t\t});\n\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tnode_type: this.node.type,\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\ttype: 'insert-test-data',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.$emit('openSettings');\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tnode_type: this.node.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'settings',\n\t\t\t});\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonUpdateOutputMode(outputMode: (typeof OUTPUT_TYPE)[string]) {\n\t\t\tif (outputMode === OUTPUT_TYPE.LOGS) {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'minLeft');\n\t\t\t} else {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'initial');\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n// The items count and displayModes are rendered in the RunData component\n// this is a workaround to hide it in the output panel(for ai type) to not add unnecessary one-time props\n:global([data-output-type='logs'] [class*='itemsCount']),\n:global([data-output-type='logs'] [class*='displayModes']) {\n\tdisplay: none;\n}\n.outputTypeSelect {\n\tmargin-bottom: var(--spacing-4xs);\n\twidth: fit-content;\n}\n.titleSection {\n\tdisplay: flex;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-s);\n}\n\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n</style>\n","<template>\n\t<svg\n\t\twidth=\"112\"\n\t\theight=\"80\"\n\t\tviewBox=\"0 0 112 80\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\txmlns:xlink=\"http://www.w3.org/1999/xlink\"\n\t>\n\t\t<mask\n\t\t\tid=\"mask0_489_46042\"\n\t\t\tstyle=\"mask-type: alpha\"\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"112\"\n\t\t\theight=\"80\"\n\t\t>\n\t\t\t<rect width=\"112\" height=\"80\" fill=\"url(#paint0_linear_489_46042)\" />\n\t\t</mask>\n\t\t<g mask=\"url(#mask0_489_46042)\">\n\t\t\t<rect x=\"-0.5\" width=\"112\" height=\"80\" fill=\"url(#pattern0)\" fill-opacity=\"0.6\" />\n\t\t</g>\n\t\t<defs>\n\t\t\t<pattern id=\"pattern0\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n\t\t\t\t<use xlink:href=\"#image0_489_46042\" transform=\"scale(0.00357143 0.005)\" />\n\t\t\t</pattern>\n\t\t\t<linearGradient\n\t\t\t\tid=\"paint0_linear_489_46042\"\n\t\t\t\tx1=\"90.5\"\n\t\t\t\ty1=\"40.4494\"\n\t\t\t\tx2=\"112.5\"\n\t\t\t\ty2=\"40.4494\"\n\t\t\t\tgradientUnits=\"userSpaceOnUse\"\n\t\t\t>\n\t\t\t\t<stop />\n\t\t\t\t<stop offset=\"1\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t</linearGradient>\n\t\t\t<image\n\t\t\t\tid=\"image0_489_46042\"\n\t\t\t\twidth=\"280\"\n\t\t\t\theight=\"200\"\n\t\t\t\txlink:href=\"data:image/png;base64,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\"\n\t\t\t/>\n\t\t</defs>\n\t</svg>\n</template>\n","<template>\n\t<RunData\n\t\t:nodeUi=\"currentNode\"\n\t\t:runIndex=\"runIndex\"\n\t\t:linkedRuns=\"linkedRuns\"\n\t\t:canLinkRuns=\"!mappedNode && canLinkRuns\"\n\t\t:tooMuchDataTitle=\"$locale.baseText('ndv.input.tooMuchData.title')\"\n\t\t:noDataInBranchMessage=\"$locale.baseText('ndv.input.noOutputDataInBranch')\"\n\t\t:isExecuting=\"isExecutingPrevious\"\n\t\t:executingMessage=\"$locale.baseText('ndv.input.executingPrevious')\"\n\t\t:sessionId=\"sessionId\"\n\t\t:overrideOutputs=\"connectedCurrentNodeOutputs\"\n\t\t:mappingEnabled=\"isMappingEnabled\"\n\t\t:distanceFromActive=\"currentNodeDepth\"\n\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t:isPaneActive=\"isPaneActive\"\n\t\t@activatePane=\"activatePane\"\n\t\tpaneType=\"input\"\n\t\t@itemHover=\"$emit('itemHover', $event)\"\n\t\t@linkRun=\"onLinkRun\"\n\t\t@unlinkRun=\"onUnlinkRun\"\n\t\t@runChange=\"onRunIndexChange\"\n\t\t@tableMounted=\"$emit('tableMounted', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t\tdata-test-id=\"ndv-input-panel\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tv-if=\"parentNodes.length\"\n\t\t\t\t\tteleported\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:modelValue=\"currentNodeName\"\n\t\t\t\t\t@update:modelValue=\"onInputNodeChange\"\n\t\t\t\t\t:no-data-text=\"$locale.baseText('ndv.input.noNodesFound')\"\n\t\t\t\t\t:placeholder=\"$locale.baseText('ndv.input.parentNodes')\"\n\t\t\t\t\tfilterable\n\t\t\t\t\tdata-test-id=\"ndv-input-select\"\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>\n\t\t\t\t\t\t<span :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"node of parentNodes\"\n\t\t\t\t\t\t:value=\"node.name\"\n\t\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t\tclass=\"node-option\"\n\t\t\t\t\t\t:label=\"`${truncate(node.name)} ${getMultipleNodesText(node.name)}`\"\n\t\t\t\t\t\tdata-test-id=\"ndv-input-option\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{{ truncate(node.name) }}&nbsp;</span>\n\t\t\t\t\t\t<span v-if=\"getMultipleNodesText(node.name)\">{{\n\t\t\t\t\t\t\tgetMultipleNodesText(node.name)\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t<span v-else>{{\n\t\t\t\t\t\t\t$locale.baseText('ndv.input.nodeDistance', { adjustToNumber: node.depth })\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t</n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<span v-else :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-if=\"isActiveNodeConfig && !readOnly\"\n\t\t\t\t\t:options=\"inputModes\"\n\t\t\t\t\t:modelValue=\"inputMode\"\n\t\t\t\t\t@update:modelValue=\"onInputModeChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #before-data v-if=\"isMappingMode\">\n\t\t\t<!--\n\t\t\t\t\t\tHide the run linking buttons for both input and ouput panels when in 'Mapping Mode' because the run indices wouldn't match.\n\t\t\t\t\t\tAlthough this is not the most elegant solution, it's straightforward and simpler than introducing a new props and logic to handle this.\n\t\t\t\t-->\n\t\t\t<component :is=\"'style'\">button.linkRun { display: none }</component>\n\t\t\t<div :class=\"$style.mappedNode\">\n\t\t\t\t<n8n-select\n\t\t\t\t\t:modelValue=\"mappedNode\"\n\t\t\t\t\t@update:modelValue=\"onMappedNodeSelected\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t@click.stop\n\t\t\t\t\tteleported\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.input.previousNode') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"nodeName in rootNodesParents\"\n\t\t\t\t\t\t:key=\"nodeName\"\n\t\t\t\t\t\t:label=\"nodeName\"\n\t\t\t\t\t\t:value=\"nodeName\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #node-not-run>\n\t\t\t<div\n\t\t\t\t:class=\"$style.noOutputData\"\n\t\t\t\tv-if=\"(isActiveNodeConfig && rootNode) || parentNodes.length\"\n\t\t\t>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.noOutputData.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-tooltip v-if=\"!readOnly\" :visible=\"showDraggableHint && showDraggableHintWithDelay\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t\t$locale.baseText('dataMapping.dragFromPreviousHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { name: focusedMappableInput },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t:transparent=\"true\"\n\t\t\t\t\t\t:nodeName=\"isActiveNodeConfig ? rootNode : currentNodeName\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.input.noOutputData.executePrevious')\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\ttelemetrySource=\"inputs\"\n\t\t\t\t\t\tdata-test-id=\"execute-previous-node\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-text v-if=\"!readOnly\" tag=\"div\" size=\"small\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.noOutputData.hint') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.notConnected\" v-else>\n\t\t\t\t<div>\n\t\t\t\t\t<WireMeUp />\n\t\t\t\t</div>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.notConnected.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.message') }}\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://docs.n8n.io/workflows/connections/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click=\"onConnectionHelpClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.learnMore') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.input.noOutputData')\n\t\t\t}}</n8n-text>\n\t\t</template>\n\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { INodeUi } from '@/Interface';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tIConnectedNode,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tWorkflow,\n} from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport WireMeUp from './WireMeUp.vue';\nimport {\n\tCRON_NODE_TYPE,\n\tINTERVAL_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSTART_NODE_TYPE,\n} from '@/constants';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\ntype MappingMode = 'debugging' | 'mapping';\n\nexport default defineComponent({\n\tname: 'InputPanel',\n\tmixins: [workflowHelpers],\n\tcomponents: { RunData, NodeExecuteButton, WireMeUp },\n\tprops: {\n\t\tcurrentNodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowDraggableHintWithDelay: false,\n\t\t\tdraggableHintShown: false,\n\t\t\tinputMode: 'debugging' as MappingMode,\n\t\t\tmappedNode: null as string | null,\n\t\t\tinputModes: [\n\t\t\t\t{ value: 'mapping', label: this.$locale.baseText('ndv.input.mapping') },\n\t\t\t\t{ value: 'debugging', label: this.$locale.baseText('ndv.input.debugging') },\n\t\t\t],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore),\n\t\tfocusedMappableInput(): string {\n\t\t\treturn this.ndvStore.focusedMappableInput;\n\t\t},\n\t\tisUserOnboarded(): boolean {\n\t\t\treturn this.ndvStore.isMappingOnboarded;\n\t\t},\n\t\tisMappingMode(): boolean {\n\t\t\treturn this.isActiveNodeConfig && this.inputMode === 'mapping';\n\t\t},\n\t\tshowDraggableHint(): boolean {\n\t\t\tconst toIgnore = [\n\t\t\t\tSTART_NODE_TYPE,\n\t\t\t\tMANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\tCRON_NODE_TYPE,\n\t\t\t\tINTERVAL_NODE_TYPE,\n\t\t\t];\n\t\t\tif (!this.currentNode || toIgnore.includes(this.currentNode.type)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn !!this.focusedMappableInput && !this.isUserOnboarded;\n\t\t},\n\t\tisActiveNodeConfig(): boolean {\n\t\t\tlet inputs = this.activeNodeType?.inputs ?? [];\n\t\t\tlet outputs = this.activeNodeType?.outputs ?? [];\n\t\t\tif (this.activeNode !== null && this.currentWorkflow !== null) {\n\t\t\t\tconst node = this.currentWorkflow.getNode(this.activeNode.name);\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t} else {\n\t\t\t\t// If we can not figure out the node type we set no outputs\n\t\t\t\tif (!Array.isArray(inputs)) {\n\t\t\t\t\tinputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(outputs)) {\n\t\t\t\t\toutputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tinputs.length === 0 ||\n\t\t\t\t(inputs.every((input) => this.filterOutConnectionType(input, NodeConnectionType.Main)) &&\n\t\t\t\t\toutputs.find((output) => this.filterOutConnectionType(output, NodeConnectionType.Main)))\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tisMappingEnabled(): boolean {\n\t\t\tif (this.readOnly) return false;\n\n\t\t\t// Mapping is only enabled in mapping mode for config nodes and if node to map is selected\n\t\t\tif (this.isActiveNodeConfig) return this.isMappingMode && this.mappedNode !== null;\n\n\t\t\treturn true;\n\t\t},\n\t\tisExecutingPrevious(): boolean {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\tconst executingNode = this.workflowsStore.executingNode;\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\ttriggeredNode === this.activeNode.name &&\n\t\t\t\t!this.workflowsStore.isNodeExecuting(this.activeNode.name)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (executingNode.length || triggeredNode) {\n\t\t\t\treturn !!this.parentNodes.find(\n\t\t\t\t\t(node) => this.workflowsStore.isNodeExecuting(node.name) || node.name === triggeredNode,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): Workflow {\n\t\t\treturn this.workflow as Workflow;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\n\t\trootNode(): string {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst rootNodes = workflow.getChildNodes(this.activeNode.name, 'ALL_NON_MAIN');\n\n\t\t\treturn rootNodes[0];\n\t\t},\n\t\trootNodesParents(): string[] {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst parentNodes = [...workflow.getParentNodes(this.rootNode, 'main')].reverse();\n\n\t\t\treturn parentNodes;\n\t\t},\n\t\tcurrentNode(): INodeUi | null {\n\t\t\tif (this.isActiveNodeConfig) {\n\t\t\t\t// if we're mapping node we want to show the output of the mapped node\n\t\t\t\tif (this.mappedNode) {\n\t\t\t\t\treturn this.workflowsStore.getNodeByName(this.mappedNode);\n\t\t\t\t}\n\n\t\t\t\t// in debugging mode data does get set manually and is only for debugging\n\t\t\t\t// so we want to force the node to be the active node to make sure we show the correct data\n\t\t\t\treturn this.activeNode;\n\t\t\t}\n\n\t\t\treturn this.workflowsStore.getNodeByName(this.currentNodeName);\n\t\t},\n\t\tconnectedCurrentNodeOutputs(): number[] | undefined {\n\t\t\tconst search = this.parentNodes.find(({ name }) => name === this.currentNodeName);\n\t\t\tif (search) {\n\t\t\t\treturn search.indicies;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tparentNodes(): IConnectedNode[] {\n\t\t\tif (!this.activeNode) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst nodes: IConnectedNode[] = (this.workflow as Workflow).getParentNodesByDepth(\n\t\t\t\tthis.activeNode.name,\n\t\t\t);\n\n\t\t\treturn nodes.filter(\n\t\t\t\t({ name }, i) =>\n\t\t\t\t\tthis.activeNode &&\n\t\t\t\t\tname !== this.activeNode.name &&\n\t\t\t\t\tnodes.findIndex((node) => node.name === name) === i,\n\t\t\t);\n\t\t},\n\t\tcurrentNodeDepth(): number {\n\t\t\tconst node = this.parentNodes.find(\n\t\t\t\t(node) => this.currentNode && node.name === this.currentNode.name,\n\t\t\t);\n\t\t\treturn node ? node.depth : -1;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (!this.activeNode) return null;\n\n\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t},\n\t\tisMultiInputNode(): boolean {\n\t\t\treturn this.activeNodeType !== null && this.activeNodeType.inputs.length > 1;\n\t\t},\n\t},\n\tmethods: {\n\t\tfilterOutConnectionType(\n\t\t\titem: ConnectionTypes | INodeOutputConfiguration,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tif (!item) return false;\n\n\t\t\treturn typeof item === 'string' ? item !== type : item.type !== type;\n\t\t},\n\t\tonInputModeChange(val: MappingMode) {\n\t\t\tthis.inputMode = val;\n\t\t},\n\t\tonMappedNodeSelected(val: string) {\n\t\t\tthis.mappedNode = val;\n\n\t\t\tthis.onRunIndexChange(0);\n\t\t\tthis.onUnlinkRun();\n\t\t},\n\t\tgetMultipleNodesText(nodeName?: string): string {\n\t\t\tif (\n\t\t\t\t!nodeName ||\n\t\t\t\t!this.isMultiInputNode ||\n\t\t\t\t!this.activeNode ||\n\t\t\t\tthis.activeNodeType?.inputNames === undefined\n\t\t\t)\n\t\t\t\treturn '';\n\n\t\t\tconst activeNodeConnections =\n\t\t\t\tthis.currentWorkflow.connectionsByDestinationNode[this.activeNode.name].main || [];\n\t\t\t// Collect indexes of connected nodes\n\t\t\tconst connectedInputIndexes = activeNodeConnections.reduce((acc: number[], node, index) => {\n\t\t\t\tif (node[0] && node[0].node === nodeName) return [...acc, index];\n\t\t\t\treturn acc;\n\t\t\t}, []);\n\n\t\t\t// Match connected input indexes to their names specified by active node\n\t\t\tconst connectedInputs = connectedInputIndexes.map(\n\t\t\t\t(inputIndex) => this.activeNodeType?.inputNames?.[inputIndex],\n\t\t\t);\n\n\t\t\tif (connectedInputs.length === 0) return '';\n\n\t\t\treturn `(${connectedInputs.join(' & ')})`;\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'executePrevious',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonInputNodeChange(value: string) {\n\t\t\tconst index = this.parentNodes.findIndex((node) => node.name === value) + 1;\n\t\t\tthis.$emit('changeInputNode', value, index);\n\t\t},\n\t\tonConnectionHelpClick() {\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'not-connected-help',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\ttruncate(nodeName: string) {\n\t\t\tconst truncated = nodeName.substring(0, 30);\n\t\t\tif (truncated.length < nodeName.length) {\n\t\t\t\treturn `${truncated}...`;\n\t\t\t}\n\t\t\treturn truncated;\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n\twatch: {\n\t\tinputMode: {\n\t\t\thandler(val) {\n\t\t\t\tthis.onRunIndexChange(-1);\n\t\t\t\tif (val === 'mapping') {\n\t\t\t\t\tthis.onUnlinkRun();\n\t\t\t\t\tthis.mappedNode = this.rootNodesParents[0];\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t},\n\t\tshowDraggableHint(curr: boolean, prev: boolean) {\n\t\t\tif (curr && !prev) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.draggableHintShown) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.showDraggableHintWithDelay = this.showDraggableHint;\n\t\t\t\t\tif (this.showDraggableHintWithDelay) {\n\t\t\t\t\t\tthis.draggableHintShown = true;\n\n\t\t\t\t\t\tthis.$telemetry.track('User viewed data mapping tooltip', {\n\t\t\t\t\t\t\ttype: 'unexecuted input pane',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 1000);\n\t\t\t} else if (!curr) {\n\t\t\t\tthis.showDraggableHintWithDelay = false;\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.mappedNode {\n\twidth: max-content;\n\tpadding: 0 var(--spacing-s) var(--spacing-s);\n}\n.titleSection {\n\tdisplay: flex;\n\tmax-width: 300px;\n\talign-items: center;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n.inputModeTab {\n\tmargin-left: auto;\n}\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n\n.notConnected {\n\tmax-width: 300px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-size: var(--font-size-s);\n\tfont-weight: var(--font-weight-bold);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-option {\n\tfont-weight: var(--font-weight-regular) !important;\n\n\tspan {\n\t\tcolor: var(--color-text-light);\n\t}\n\n\t&.selected > span {\n\t\tcolor: var(--color-primary);\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<transition name=\"fade\" mode=\"out-in\">\n\t\t\t<div key=\"empty\" v-if=\"hasIssues\"></div>\n\t\t\t<div key=\"listening\" v-else-if=\"isListeningForEvents\">\n\t\t\t\t<n8n-pulse>\n\t\t\t\t\t<NodeIcon :nodeType=\"nodeType\" :size=\"40\"></NodeIcon>\n\t\t\t\t</n8n-pulse>\n\t\t\t\t<div v-if=\"isWebhookNode\">\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.listening')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.requestHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { type: this.webhookHttpMethod },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CopyInput\n\t\t\t\t\t\t:value=\"webhookTestUrl\"\n\t\t\t\t\t\t:toastTitle=\"$locale.baseText('ndv.trigger.copiedTestUrl')\"\n\t\t\t\t\t\tclass=\"mb-2xl\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t:collapse=\"true\"\n\t\t\t\t\t\t:copy-button-text=\"$locale.baseText('generic.clickToCopy')\"\n\t\t\t\t\t\t@copy=\"onTestLinkCopied\"\n\t\t\t\t\t></CopyInput>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:nodeName=\"nodeName\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetrySource=\"inputs\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div v-else>\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\tlisteningTitle\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t\t\t{{ listeningHint }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:nodeName=\"nodeName\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetrySource=\"inputs\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div key=\"default\" v-else>\n\t\t\t\t<div class=\"mb-xl\" v-if=\"isActivelyPolling\">\n\t\t\t\t\t<n8n-spinner type=\"ring\" />\n\t\t\t\t</div>\n\n\t\t\t\t<div :class=\"$style.action\">\n\t\t\t\t\t<div :class=\"$style.header\">\n\t\t\t\t\t\t<n8n-heading v-if=\"header\" tag=\"h1\" bold>\n\t\t\t\t\t\t\t{{ header }}\n\t\t\t\t\t\t</n8n-heading>\n\t\t\t\t\t\t<n8n-text v-if=\"subheader\">\n\t\t\t\t\t\t\t<span v-text=\"subheader\" />\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:nodeName=\"nodeName\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetrySource=\"inputs\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-text size=\"small\" @click=\"onLinkClick\" v-if=\"activationHint\">\n\t\t\t\t\t<span v-html=\"activationHint\"></span>&nbsp;\n\t\t\t\t</n8n-text>\n\t\t\t\t<n8n-link\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tv-if=\"activationHint && executionsHelp\"\n\t\t\t\t\t@click=\"expandExecutionHelp\"\n\t\t\t\t\t>{{ $locale.baseText('ndv.trigger.moreInfo') }}</n8n-link\n\t\t\t\t>\n\t\t\t\t<n8n-info-accordion\n\t\t\t\t\tref=\"help\"\n\t\t\t\t\tv-if=\"executionsHelp\"\n\t\t\t\t\t:class=\"$style.accordion\"\n\t\t\t\t\t:title=\"$locale.baseText('ndv.trigger.executionsHint.question')\"\n\t\t\t\t\t:description=\"executionsHelp\"\n\t\t\t\t\t:eventBus=\"executionsHelpEventBus\"\n\t\t\t\t\t@click:body=\"onLinkClick\"\n\t\t\t\t></n8n-info-accordion>\n\t\t\t</div>\n\t\t</transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tWORKFLOW_SETTINGS_MODAL_KEY,\n\tFORM_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport NodeExecuteButton from '@/components/NodeExecuteButton.vue';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport CopyInput from '@/components/CopyInput.vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { N8nInfoAccordion } from 'n8n-design-system';\nimport { createEventBus } from 'n8n-design-system/utils';\n\ntype HelpRef = InstanceType<typeof N8nInfoAccordion>;\n\nexport default defineComponent({\n\tname: 'TriggerPanel',\n\tmixins: [workflowHelpers, copyPaste],\n\tcomponents: {\n\t\tNodeExecuteButton,\n\t\tCopyInput,\n\t\tNodeIcon,\n\t},\n\tdata: () => {\n\t\treturn {\n\t\t\texecutionsHelpEventBus: createEventBus(),\n\t\t};\n\t},\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName as string);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tserviceName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\treturn getTriggerNodeServiceName(this.nodeType);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.node && this.node.type === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\twebhookHttpMethod(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn this.getWebhookExpressionValue(this.nodeType.webhooks[0], 'httpMethod');\n\t\t},\n\t\twebhookTestUrl(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn this.getWebhookUrl(this.nodeType.webhooks[0], this.node, 'test');\n\t\t},\n\t\tisWebhookBasedNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.webhooks?.length);\n\t\t},\n\t\tisPollingNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.polling);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isWebhookBasedNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisActivelyPolling(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\n\t\t\treturn this.workflowRunning && this.isPollingNode && this.nodeName === triggeredNode;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\treturn this.workflowsStore.isWorkflowActive;\n\t\t},\n\t\tlisteningTitle(): string {\n\t\t\treturn this.nodeType?.name === FORM_TRIGGER_NODE_TYPE\n\t\t\t\t? this.$locale.baseText('ndv.trigger.webhookNode.formTrigger.listening')\n\t\t\t\t: this.$locale.baseText('ndv.trigger.webhookNode.listening');\n\t\t},\n\t\tlisteningHint(): string {\n\t\t\treturn this.nodeType?.name === FORM_TRIGGER_NODE_TYPE\n\t\t\t\t? this.$locale.baseText('ndv.trigger.webhookBasedNode.formTrigger.serviceHint')\n\t\t\t\t: this.$locale.baseText('ndv.trigger.webhookBasedNode.serviceHint', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t });\n\t\t},\n\t\theader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingEvent');\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel && typeof this.nodeType.triggerPanel.header === 'string') {\n\t\t\t\treturn this.nodeType.triggerPanel.header;\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.action', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tsubheader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingHint', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\texecutionsHelp(): string {\n\t\t\tif (this.nodeType?.triggerPanel?.executionsHelp !== undefined) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.executionsHelp === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp;\n\t\t\t\t}\n\t\t\t\tif (!this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.inactive) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.inactive;\n\t\t\t\t}\n\t\t\t\tif (this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.active) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tactivationHint(): string {\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel?.activationHint) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.activationHint === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!this.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.inactive === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.inactive;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.active === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t},\n\tmethods: {\n\t\texpandExecutionHelp() {\n\t\t\tif (this.$refs.help) {\n\t\t\t\tthis.executionsHelpEventBus.emit('expand');\n\t\t\t}\n\t\t},\n\t\tonLinkClick(e: MouseEvent) {\n\t\t\tif (!e.target) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tif (target.localName !== 'a') return;\n\n\t\t\tif (target.dataset?.key) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (target.dataset.key === 'activate') {\n\t\t\t\t\tthis.$emit('activate');\n\t\t\t\t} else if (target.dataset.key === 'executions') {\n\t\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\t\tpane: 'input',\n\t\t\t\t\t\ttype: 'open-executions-log',\n\t\t\t\t\t});\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\tname: VIEWS.EXECUTIONS,\n\t\t\t\t\t});\n\t\t\t\t} else if (target.dataset.key === 'settings') {\n\t\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonTestLinkCopied() {\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'inputs',\n\t\t\t\ttype: 'test url',\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-background-base);\n\tdisplay: flex;\n\tflex-direction: column;\n\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\toverflow: hidden;\n\n\t> * {\n\t\twidth: 100%;\n\t}\n}\n\n.header {\n\tmargin-bottom: var(--spacing-s);\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.action {\n\tmargin-bottom: var(--spacing-2xl);\n}\n\n.shake {\n\tanimation: shake 8s infinite;\n}\n\n@keyframes shake {\n\t90% {\n\t\ttransform: translateX(0);\n\t}\n\t92.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t95% {\n\t\ttransform: translateX(-6px);\n\t}\n\t97.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t100% {\n\t\ttransform: translateX(0);\n\t}\n}\n\n.accordion {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.fade-enter-active,\n.fade-leave-active {\n\ttransition: opacity 200ms;\n}\n.fade-enter,\n.fade-leave-to {\n\topacity: 0;\n}\n</style>\n","<template>\n\t<el-dialog\n\t\t:modelValue=\"(!!activeNode || renaming) && !isActiveStickyNode\"\n\t\t:before-close=\"close\"\n\t\t:show-close=\"false\"\n\t\tclass=\"data-display-wrapper ndv-wrapper\"\n\t\toverlay-class=\"data-display-overlay\"\n\t\twidth=\"auto\"\n\t\tappend-to-body\n\t\tdata-test-id=\"ndv\"\n\t\t:data-has-output-connection=\"hasOutputConnection\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"bottom-start\"\n\t\t\t:visible=\"showTriggerWaitingWarning\"\n\t\t\t:disabled=\"!showTriggerWaitingWarning\"\n\t\t>\n\t\t\t<template #content>\n\t\t\t\t<div :class=\"$style.triggerWarning\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas.waitingForTriggerWarning') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<div :class=\"$style.backToCanvas\" @click=\"close\" data-test-id=\"back-to-canvas\">\n\t\t\t\t<n8n-icon icon=\"arrow-left\" color=\"text-xlight\" size=\"medium\" />\n\t\t\t\t<n8n-text color=\"text-xlight\" size=\"medium\" :bold=\"true\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\n\t\t<div\n\t\t\tv-if=\"activeNode\"\n\t\t\tclass=\"data-display\"\n\t\t\tref=\"container\"\n\t\t\t@keydown.capture=\"onKeyDown\"\n\t\t\ttabindex=\"0\"\n\t\t>\n\t\t\t<div @click=\"close\" :class=\"$style.modalBackground\"></div>\n\t\t\t<NDVDraggablePanels\n\t\t\t\t:isTriggerNode=\"isTriggerNode\"\n\t\t\t\t:hideInputAndOutput=\"activeNodeType === null\"\n\t\t\t\t:position=\"isTriggerNode && !showTriggerPanel ? 0 : undefined\"\n\t\t\t\t:isDraggable=\"!isTriggerNode\"\n\t\t\t\t:hasDoubleWidth=\"activeNodeType?.parameterPane === 'wide'\"\n\t\t\t\t:nodeType=\"activeNodeType\"\n\t\t\t\t:key=\"activeNode.name\"\n\t\t\t\t@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t\t@close=\"close\"\n\t\t\t\t@init=\"onPanelsInit\"\n\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t>\n\t\t\t\t<template #input v-if=\"showTriggerPanel || !isTriggerNode\">\n\t\t\t\t\t<TriggerPanel\n\t\t\t\t\t\tv-if=\"showTriggerPanel\"\n\t\t\t\t\t\t:nodeName=\"activeNode.name\"\n\t\t\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t/>\n\t\t\t\t\t<InputPanel\n\t\t\t\t\t\tv-else-if=\"!isTriggerNode\"\n\t\t\t\t\t\t:workflow=\"workflow\"\n\t\t\t\t\t\t:canLinkRuns=\"canLinkRuns\"\n\t\t\t\t\t\t:runIndex=\"inputRun\"\n\t\t\t\t\t\t:linkedRuns=\"linked\"\n\t\t\t\t\t\t:currentNodeName=\"inputNodeName\"\n\t\t\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t\t\t\t:readOnly=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:isPaneActive=\"isInputPaneActive\"\n\t\t\t\t\t\t@activatePane=\"activateInputPane\"\n\t\t\t\t\t\t@linkRun=\"onLinkRunToInput\"\n\t\t\t\t\t\t@unlinkRun=\"() => onUnlinkRun('input')\"\n\t\t\t\t\t\t@runChange=\"onRunInputIndexChange\"\n\t\t\t\t\t\t@openSettings=\"openSettings\"\n\t\t\t\t\t\t@changeInputNode=\"onInputNodeChange\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@tableMounted=\"onInputTableMounted\"\n\t\t\t\t\t\t@itemHover=\"onInputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #output>\n\t\t\t\t\t<OutputPanel\n\t\t\t\t\t\tdata-test-id=\"output-panel\"\n\t\t\t\t\t\t:canLinkRuns=\"canLinkRuns\"\n\t\t\t\t\t\t:runIndex=\"outputRun\"\n\t\t\t\t\t\t:linkedRuns=\"linked\"\n\t\t\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t\t\t\t:isReadOnly=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:blockUI=\"blockUi && isTriggerNode && !isExecutableTriggerNode\"\n\t\t\t\t\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:isPaneActive=\"isOutputPaneActive\"\n\t\t\t\t\t\t@activatePane=\"activateOutputPane\"\n\t\t\t\t\t\t@linkRun=\"onLinkRunToOutput\"\n\t\t\t\t\t\t@unlinkRun=\"() => onUnlinkRun('output')\"\n\t\t\t\t\t\t@runChange=\"onRunOutputIndexChange\"\n\t\t\t\t\t\t@openSettings=\"openSettings\"\n\t\t\t\t\t\t@tableMounted=\"onOutputTableMounted\"\n\t\t\t\t\t\t@itemHover=\"onOutputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #main>\n\t\t\t\t\t<NodeSettings\n\t\t\t\t\t\t:eventBus=\"settingsEventBus\"\n\t\t\t\t\t\t:dragging=\"isDragging\"\n\t\t\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t\t\t\t:nodeType=\"activeNodeType\"\n\t\t\t\t\t\t:foreignCredentials=\"foreignCredentials\"\n\t\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t\t:blockUI=\"blockUi && showTriggerPanel\"\n\t\t\t\t\t\t:executable=\"!readOnly\"\n\t\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stopExecution=\"onStopExecution\"\n\t\t\t\t\t\t@redrawRequired=\"redrawRequired = true\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t/>\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"featureRequestUrl\"\n\t\t\t\t\t\t@click=\"onFeatureRequestClick\"\n\t\t\t\t\t\t:class=\"$style.featureRequest\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<font-awesome-icon icon=\"lightbulb\" />\n\t\t\t\t\t\t{{ $locale.baseText('ndv.featureRequest') }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t</NDVDraggablePanels>\n\t\t</div>\n\t</el-dialog>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport type {\n\tINodeConnections,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n\tWorkflow,\n} from 'n8n-workflow';\nimport { jsonParse, NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type { IExecutionResponse, INodeUi, IUpdateInformation, TargetItem } from '@/Interface';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\n\nimport NodeSettings from '@/components/NodeSettings.vue';\nimport NDVDraggablePanels from './NDVDraggablePanels.vue';\n\nimport OutputPanel from './OutputPanel.vue';\nimport InputPanel from './InputPanel.vue';\nimport TriggerPanel from './TriggerPanel.vue';\nimport {\n\tBASE_NODE_SURVEY_URL,\n\tEnterpriseEditionFeature,\n\tEXECUTABLE_TRIGGER_NODE_TYPES,\n\tMODAL_CONFIRM,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n} from '@/constants';\nimport { workflowActivate } from '@/mixins/workflowActivate';\nimport { pinData } from '@/mixins/pinData';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useDeviceSupport } from 'n8n-design-system/composables/useDeviceSupport';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useMessage } from '@/composables/useMessage';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tname: 'NodeDetailsView',\n\tmixins: [workflowHelpers, workflowActivate, pinData],\n\tcomponents: {\n\t\tNodeSettings,\n\t\tInputPanel,\n\t\tOutputPanel,\n\t\tNDVDraggablePanels,\n\t\tTriggerPanel,\n\t},\n\tprops: {\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\trenaming: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props, ctx) {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\t...useDeviceSupport(),\n\t\t\t...useMessage(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowActivate.setup?.(props, ctx),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsettingsEventBus: createEventBus(),\n\t\t\tredrawRequired: false,\n\t\t\trunInputIndex: -1,\n\t\t\trunOutputIndex: -1,\n\t\t\tisLinkingEnabled: true,\n\t\t\tselectedInput: undefined as string | undefined,\n\t\t\ttriggerWaitingWarningEnabled: false,\n\t\t\tisDragging: false,\n\t\t\tmainPanelPosition: 0,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tavgInputRowHeight: 0,\n\t\t\tavgOutputRowHeight: 0,\n\t\t\tisInputPaneActive: false,\n\t\t\tisOutputPaneActive: false,\n\t\t\tisPairedItemHoveringEnabled: true,\n\t\t};\n\t},\n\tmounted() {\n\t\tdataPinningEventBus.on('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tbeforeUnmount() {\n\t\tdataPinningEventBus.off('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore, useSettingsStore),\n\t\tsessionId(): string {\n\t\t\treturn this.ndvStore.sessionId;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tshowTriggerWaitingWarning(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.triggerWaitingWarningEnabled &&\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t!this.activeNodeType.group.includes('trigger') &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowsStore.executionWaitingForWebhook\n\t\t\t);\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tinputNodeName(): string | undefined {\n\t\t\treturn this.selectedInput || this.parentNode;\n\t\t},\n\t\tinputNode(): INodeUi | null {\n\t\t\tif (this.inputNodeName) {\n\t\t\t\treturn this.workflowsStore.getNodeByName(this.inputNodeName);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tshowTriggerPanel(): boolean {\n\t\t\tconst isWebhookBasedNode = !!this.activeNodeType?.webhooks?.length;\n\t\t\tconst isPollingNode = this.activeNodeType?.polling;\n\t\t\tconst override = !!this.activeNodeType?.triggerPanel;\n\t\t\treturn (\n\t\t\t\t!this.readOnly && this.isTriggerNode && (isWebhookBasedNode || isPollingNode || override)\n\t\t\t);\n\t\t},\n\t\tworkflow(): Workflow {\n\t\t\treturn this.getCurrentWorkflow();\n\t\t},\n\t\thasOutputConnection() {\n\t\t\tif (!this.activeNode) return false;\n\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\tthis.activeNode.name,\n\t\t\t) as INodeConnections;\n\n\t\t\t// Check if there's at-least one output connection\n\t\t\treturn (Object.values(outgoingConnections)?.[0]?.[0] ?? []).length > 0;\n\t\t},\n\t\tparentNodes(): string[] {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn (\n\t\t\t\t\tthis.workflow.getParentNodesByDepth(this.activeNode.name, 1).map(({ name }) => name) || []\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\t\tparentNode(): string | undefined {\n\t\t\tconst pinData = this.workflowsStore.getPinData;\n\n\t\t\t// Return the first parent node that contains data\n\t\t\tfor (const parentNodeName of this.parentNodes) {\n\t\t\t\t// Check first for pinned data\n\t\t\t\tif (pinData[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\n\t\t\t\t// Check then the data of the current execution\n\t\t\t\tif (this.workflowRunData?.[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.parentNodes[0];\n\t\t},\n\t\tisExecutableTriggerNode(): boolean {\n\t\t\tif (!this.activeNodeType) return false;\n\n\t\t\treturn EXECUTABLE_TRIGGER_NODE_TYPES.includes(this.activeNodeType.name);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t(this.activeNodeType.group.includes('trigger') ||\n\t\t\t\t\tthis.activeNodeType.name === START_NODE_TYPE)\n\t\t\t);\n\t\t},\n\t\tisActiveStickyNode(): boolean {\n\t\t\treturn !!this.ndvStore.activeNode && this.ndvStore.activeNode.type === STICKY_NODE_TYPE;\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tmaxOutputRun(): number {\n\t\t\tif (this.activeNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.activeNode.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.activeNode.name].length) {\n\t\t\t\treturn runData[this.activeNode.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\toutputRun(): number {\n\t\t\tif (this.runOutputIndex === -1) {\n\t\t\t\treturn this.maxOutputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runOutputIndex, this.maxOutputRun);\n\t\t},\n\t\tmaxInputRun(): number {\n\t\t\tif (this.inputNode === null || this.activeNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst workflowNode = this.workflow.getNode(this.activeNode.name);\n\t\t\tconst outputs = NodeHelpers.getNodeOutputs(this.workflow, workflowNode, this.activeNodeType);\n\n\t\t\tlet node = this.inputNode;\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (outputs.some((output) => output !== NodeConnectionType.Main)) {\n\t\t\t\tnode = this.activeNode;\n\t\t\t}\n\n\t\t\tif (!node || !runData || !runData.hasOwnProperty(node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[node.name].length) {\n\t\t\t\treturn runData[node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tinputRun(): number {\n\t\t\tif (this.isLinkingEnabled && this.maxOutputRun === this.maxInputRun) {\n\t\t\t\treturn this.outputRun;\n\t\t\t}\n\t\t\tif (this.runInputIndex === -1) {\n\t\t\t\treturn this.maxInputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runInputIndex, this.maxInputRun);\n\t\t},\n\t\tcanLinkRuns(): boolean {\n\t\t\treturn this.maxOutputRun > 0 && this.maxOutputRun === this.maxInputRun;\n\t\t},\n\t\tlinked(): boolean {\n\t\t\treturn this.isLinkingEnabled && this.canLinkRuns;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.isTriggerNode ? 0 : 80;\n\t\t},\n\t\tfeatureRequestUrl(): string {\n\t\t\tif (!this.activeNodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn `${BASE_NODE_SURVEY_URL}${this.activeNodeType.name}`;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisWorkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisExecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tblockUi(): boolean {\n\t\t\treturn this.isWorkflowRunning || this.isExecutionWaitingForWebhook;\n\t\t},\n\t\tforeignCredentials(): string[] {\n\t\t\tconst credentials = (this.activeNode || {}).credentials;\n\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\n\t\t\tconst foreignCredentials: string[] = [];\n\t\t\tif (\n\t\t\t\tcredentials &&\n\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t) {\n\t\t\t\tObject.values(credentials).forEach((credential) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\tusedCredentials[credential.id] &&\n\t\t\t\t\t\t!usedCredentials[credential.id].currentUserHasAccess\n\t\t\t\t\t) {\n\t\t\t\t\t\tforeignCredentials.push(credential.id);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn foreignCredentials;\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t},\n\twatch: {\n\t\tactiveNode(node: INodeUi | null, oldNode: INodeUi | null) {\n\t\t\tif (node && node.name !== oldNode?.name && !this.isActiveStickyNode) {\n\t\t\t\tthis.runInputIndex = -1;\n\t\t\t\tthis.runOutputIndex = -1;\n\t\t\t\tthis.isLinkingEnabled = true;\n\t\t\t\tthis.selectedInput = undefined;\n\t\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\t\tthis.avgOutputRowHeight = 0;\n\t\t\t\tthis.avgInputRowHeight = 0;\n\n\t\t\t\tsetTimeout(() => this.ndvStore.setNDVSessionId(), 0);\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeTypeChanged', {\n\t\t\t\t\tnodeSubtitle: this.nodeHelpers.getNodeSubtitle(\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tthis.activeNodeType,\n\t\t\t\t\t\tthis.getCurrentWorkflow(),\n\t\t\t\t\t),\n\t\t\t\t});\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.activeNode) {\n\t\t\t\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\t\t\tthis.activeNode.name,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.$telemetry.track('User opened node modal', {\n\t\t\t\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\t\t\tis_editable: !this.hasForeignCredential,\n\t\t\t\t\t\t\tparameters_pane_position: this.mainPanelPosition,\n\t\t\t\t\t\t\tinput_first_connector_runs: this.maxInputRun,\n\t\t\t\t\t\t\toutput_first_connector_runs: this.maxOutputRun,\n\t\t\t\t\t\t\tselected_view_inputs: this.isTriggerNode\n\t\t\t\t\t\t\t\t? 'trigger'\n\t\t\t\t\t\t\t\t: this.ndvStore.inputPanelDisplayMode,\n\t\t\t\t\t\t\tselected_view_outputs: this.ndvStore.outputPanelDisplayMode,\n\t\t\t\t\t\t\tinput_connectors: this.parentNodes.length,\n\t\t\t\t\t\t\toutput_connectors: outgoingConnections?.main?.length,\n\t\t\t\t\t\t\tinput_displayed_run_index: this.inputRun,\n\t\t\t\t\t\t\toutput_displayed_run_index: this.outputRun,\n\t\t\t\t\t\t\tdata_pinning_tooltip_presented: this.pinDataDiscoveryTooltipVisible,\n\t\t\t\t\t\t\tinput_displayed_row_height_avg: this.avgInputRowHeight,\n\t\t\t\t\t\t\toutput_displayed_row_height_avg: this.avgOutputRowHeight,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 2000); // wait for RunData to mount and present pindata discovery tooltip\n\t\t\t}\n\t\t\tif (window.top && !this.isActiveStickyNode) {\n\t\t\t\twindow.top.postMessage(JSON.stringify({ command: node ? 'openNDV' : 'closeNDV' }), '*');\n\t\t\t}\n\t\t},\n\t\tmaxOutputRun() {\n\t\t\tthis.runOutputIndex = -1;\n\t\t},\n\t\tmaxInputRun() {\n\t\t\tthis.runInputIndex = -1;\n\t\t},\n\t\tinputNodeName(nodeName: string | undefined) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputNodeName(nodeName);\n\t\t\t}, 0);\n\t\t},\n\t\tinputRun() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputRunIndex(this.inputRun);\n\t\t\t}, 0);\n\t\t},\n\t},\n\tmethods: {\n\t\tsetIsTooltipVisible({ isTooltipVisible }: { isTooltipVisible: boolean }) {\n\t\t\tthis.pinDataDiscoveryTooltipVisible = isTooltipVisible;\n\t\t},\n\t\tonKeyDown(e: KeyboardEvent) {\n\t\t\tif (e.key === 's' && this.isCtrlKeyPressed(e)) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.readOnly) return;\n\n\t\t\t\tthis.$emit('saveKeyboardShortcut', e);\n\t\t\t}\n\t\t},\n\t\tonInputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.inputNodeName || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.inputNodeName,\n\t\t\t\trunIndex: this.inputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonOutputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.activeNode || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.activeNode.name,\n\t\t\t\trunIndex: this.outputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonInputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgInputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonOutputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgOutputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.activateCurrentWorkflow('ndv');\n\t\t\t}, 1000);\n\t\t},\n\t\tonFeatureRequestClick() {\n\t\t\twindow.open(this.featureRequestUrl, '_blank');\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'i-wish-this-node-would',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonPanelsInit(e: { position: number }) {\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragStart(e: { position: number }) {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragEnd(e: { windowWidth: number; position: number }) {\n\t\t\tthis.isDragging = false;\n\t\t\tthis.$telemetry.track('User moved parameters pane', {\n\t\t\t\twindow_width: e.windowWidth,\n\t\t\t\tstart_position: this.mainPanelPosition,\n\t\t\t\tend_position: e.position,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonLinkRunToInput() {\n\t\t\tthis.runOutputIndex = this.runInputIndex;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('input');\n\t\t},\n\t\tonLinkRunToOutput() {\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('output');\n\t\t},\n\t\tonUnlinkRun(pane: string) {\n\t\t\tthis.runInputIndex = this.runOutputIndex;\n\t\t\tthis.isLinkingEnabled = false;\n\t\t\tthis.trackLinking(pane);\n\t\t},\n\t\ttrackLinking(pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run linking', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tlinked: this.linked,\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!this.activeNode || !this.workflowRunning) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.triggerWaitingWarningEnabled = true;\n\t\t\t}, 1000);\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.settingsEventBus.emit('openSettings');\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tthis.$emit('valueChanged', parameterData);\n\t\t},\n\t\tnodeTypeSelected(nodeTypeName: string) {\n\t\t\tthis.$emit('nodeTypeSelected', nodeTypeName);\n\t\t},\n\t\tasync onSwitchSelectedNode(nodeTypeName: string) {\n\t\t\tthis.$emit('switchSelectedNode', nodeTypeName);\n\t\t},\n\t\tasync close() {\n\t\t\tif (this.isDragging) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\t(typeof this.activeNodeType?.outputs === 'string' ||\n\t\t\t\t\ttypeof this.activeNodeType?.inputs === 'string' ||\n\t\t\t\t\tthis.redrawRequired)\n\t\t\t) {\n\t\t\t\t// TODO: We should keep track of if it actually changed and only do if required\n\t\t\t\t// Whenever a node with custom inputs and outputs gets closed redraw it in case\n\t\t\t\t// they changed\n\t\t\t\tconst nodeName = this.activeNode.name;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.$emit('redrawNode', nodeName);\n\t\t\t\t}, 1);\n\t\t\t}\n\n\t\t\tif (this.outputPanelEditMode.enabled && this.activeNode) {\n\t\t\t\tconst shouldPinDataBeforeClosing = await this.confirm(\n\t\t\t\t\t'',\n\t\t\t\t\tthis.$locale.baseText('ndv.pinData.beforeClosing.title'),\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.beforeClosing.confirm'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('ndv.pinData.beforeClosing.cancel'),\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (shouldPinDataBeforeClosing === MODAL_CONFIRM) {\n\t\t\t\t\tconst { value } = this.outputPanelEditMode;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.setPinData(this.activeNode, jsonParse(value), 'on-ndv-close-modal');\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\t}\n\n\t\t\tawait this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\tthis.$telemetry.track('User closed node modal', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tthis.ndvStore.resetNDVSessionId();\n\t\t},\n\t\tonRunOutputIndexChange(run: number) {\n\t\t\tthis.runOutputIndex = run;\n\t\t\tthis.trackRunChange(run, 'output');\n\t\t},\n\t\tonRunInputIndexChange(run: number) {\n\t\t\tthis.runInputIndex = run;\n\t\t\tif (this.linked) {\n\t\t\t\tthis.runOutputIndex = run;\n\t\t\t}\n\t\t\tthis.trackRunChange(run, 'input');\n\t\t},\n\t\ttrackRunChange(run: number, pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run dropdown', {\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: run,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonInputNodeChange(value: string, index: number) {\n\t\t\tthis.runInputIndex = -1;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.selectedInput = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv input dropdown', {\n\t\t\t\tnode_type: this.activeNode ? this.activeNode.type : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tselection_value: index,\n\t\t\t\tinput_node_type: this.inputNode ? this.inputNode.type : '',\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\tactivateInputPane() {\n\t\t\tthis.isInputPaneActive = true;\n\t\t\tthis.isOutputPaneActive = false;\n\t\t},\n\t\tactivateOutputPane() {\n\t\t\tthis.isInputPaneActive = false;\n\t\t\tthis.isOutputPaneActive = true;\n\t\t},\n\t\tonSearch(search: string) {\n\t\t\tthis.isPairedItemHoveringEnabled = !search;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n// Hide notice(.ndv-connection-hint-notice) warning when node has output connection\n[data-has-output-connection='true'] .ndv-connection-hint-notice {\n\tdisplay: none;\n}\n.ndv-wrapper {\n\toverflow: visible;\n\tmargin-top: 0;\n}\n\n.data-display-wrapper {\n\theight: calc(100% - var(--spacing-2xl));\n\tmargin-top: var(--spacing-xl) !important;\n\twidth: 100%;\n\tbackground: none;\n\tborder: none;\n\n\t.el-dialog__header {\n\t\tpadding: 0 !important;\n\t}\n\n\t.el-dialog__body {\n\t\tpadding: 0 !important;\n\t\theight: 100%;\n\t\tmin-height: 400px;\n\t\toverflow: visible;\n\t\tborder-radius: 8px;\n\t}\n}\n\n.data-display {\n\theight: 100%;\n\twidth: 100%;\n\tdisplay: flex;\n}\n</style>\n\n<style lang=\"scss\" module>\n$main-panel-width: 360px;\n\n.modalBackground {\n\theight: 100%;\n\twidth: 100%;\n}\n\n.triggerWarning {\n\tmax-width: 180px;\n}\n\n.backToCanvas {\n\tposition: fixed;\n\ttop: var(--spacing-xs);\n\tleft: var(--spacing-l);\n\n\tspan {\n\t\tcolor: var(--color-ndv-back-font);\n\t}\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n\n\t> * {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n@media (min-width: $breakpoint-lg) {\n\t.backToCanvas {\n\t\ttop: var(--spacing-xs);\n\t\tleft: var(--spacing-m);\n\t}\n}\n\n.featureRequest {\n\tposition: absolute;\n\tbottom: var(--spacing-4xs);\n\tleft: calc(100% + var(--spacing-s));\n\tcolor: var(--color-feature-request-font);\n\tfont-size: var(--font-size-2xs);\n\twhite-space: nowrap;\n\n\t* {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { N8nActionDropdown } from 'n8n-design-system';\nimport type { INode } from 'n8n-workflow';\nimport { watch, ref } from 'vue';\n\nconst contextMenu = useContextMenu();\nconst { position, isOpen, actions, target } = contextMenu;\nconst dropdown = ref<InstanceType<typeof N8nActionDropdown>>();\nconst emit = defineEmits<{ (event: 'action', action: ContextMenuAction, nodes: INode[]): void }>();\n\nwatch(\n\tisOpen,\n\t() => {\n\t\tif (isOpen) {\n\t\t\tdropdown.value?.open();\n\t\t} else {\n\t\t\tdropdown.value?.close();\n\t\t}\n\t},\n\t{ flush: 'post' },\n);\n\nfunction onActionSelect(item: string) {\n\tconst action = item as ContextMenuAction;\n\tcontextMenu._dispatchAction(action);\n\temit('action', action, contextMenu.targetNodes.value);\n}\n\nfunction onVisibleChange(open: boolean) {\n\tif (!open) {\n\t\tcontextMenu.close();\n\t}\n}\n</script>\n\n<template>\n\t<Teleport v-if=\"isOpen\" to=\"body\">\n\t\t<div\n\t\t\t:class=\"$style.contextMenu\"\n\t\t\t:style=\"{\n\t\t\t\tleft: `${position[0]}px`,\n\t\t\t\ttop: `${position[1]}px`,\n\t\t\t}\"\n\t\t>\n\t\t\t<n8n-action-dropdown\n\t\t\t\tref=\"dropdown\"\n\t\t\t\t:items=\"actions\"\n\t\t\t\tplacement=\"bottom-start\"\n\t\t\t\tdata-test-id=\"context-menu\"\n\t\t\t\t:hideArrow=\"target.source !== 'node-button'\"\n\t\t\t\t@select=\"onActionSelect\"\n\t\t\t\t@visibleChange=\"onVisibleChange\"\n\t\t\t>\n\t\t\t\t<template #activator>\n\t\t\t\t\t<div :class=\"$style.activator\"></div>\n\t\t\t\t</template>\n\t\t\t</n8n-action-dropdown>\n\t\t</div>\n\t</Teleport>\n</template>\n\n<style module lang=\"scss\">\n.contextMenu {\n\tposition: fixed;\n}\n\n.activator {\n\tpointer-events: none;\n\topacity: 0;\n}\n</style>\n","import { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport type { INodeUi } from '@/Interface';\nimport { deviceSupportHelpers } from '@/mixins/deviceSupportHelpers';\nimport {\n\tNO_OP_NODE_TYPE,\n\tNODE_CONNECTION_TYPE_ALLOW_MULTIPLE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNODE_MIN_INPUT_ITEMS_COUNT,\n} from '@/constants';\n\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeOutputConfiguration,\n\tWorkflow,\n} from 'n8n-workflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport type { Endpoint, EndpointOptions } from '@jsplumb/core';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport type { EndpointSpec } from '@jsplumb/common';\n\nconst createAddInputEndpointSpec = (\n\tconnectionName: NodeConnectionType,\n\tcolor: string,\n): EndpointSpec => {\n\tconst multiple = NODE_CONNECTION_TYPE_ALLOW_MULTIPLE.includes(connectionName);\n\n\treturn {\n\t\ttype: 'N8nAddInput',\n\t\toptions: {\n\t\t\twidth: 24,\n\t\t\theight: 72,\n\t\t\tcolor,\n\t\t\tmultiple,\n\t\t},\n\t};\n};\n\nconst createDiamondOutputEndpointSpec = (): EndpointSpec => ({\n\ttype: 'Rectangle',\n\toptions: {\n\t\theight: 10,\n\t\twidth: 10,\n\t\tcssClass: 'diamond-output-endpoint',\n\t},\n});\n\nexport const nodeBase = defineComponent({\n\tmixins: [deviceSupportHelpers],\n\tmounted() {\n\t\t// Initialize the node\n\t\tif (this.data !== null) {\n\t\t\ttry {\n\t\t\t\tthis.__addNode(this.data);\n\t\t\t} catch (error) {\n\t\t\t\t// This breaks when new nodes are loaded into store but workflow tab is not currently active\n\t\t\t\t// Shouldn't affect anything\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tinputs: [] as Array<ConnectionTypes | INodeInputConfiguration>,\n\t\t\toutputs: [] as Array<ConnectionTypes | INodeOutputConfiguration>,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useUIStore, useCanvasStore, useWorkflowsStore, useHistoryStore),\n\t\tdata(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tnodeId(): string {\n\t\t\treturn this.data?.id || '';\n\t\t},\n\t},\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t},\n\t\tinstance: {\n\t\t\ttype: Object as PropType<BrowserJsPlumbInstance>,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisActive: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideActions: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdisableSelecting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tshowCustomTooltip: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {\n\t\t\ttype: Object as () => Workflow,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tmethods: {\n\t\t__addEndpointTestingData(endpoint: Endpoint, type: string, inputIndex: number) {\n\t\t\tif (window?.Cypress && 'canvas' in endpoint.endpoint) {\n\t\t\t\tconst canvas = endpoint.endpoint.canvas;\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-name', this.data.name);\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-input-index', inputIndex.toString());\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-type', type);\n\t\t\t}\n\t\t},\n\t\t__addInputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\t// Add Inputs\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tconst inputs: Array<ConnectionTypes | INodeInputConfiguration> =\n\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.data!, nodeTypeData) || [];\n\t\t\tthis.inputs = inputs;\n\n\t\t\tconst sortedInputs = [...inputs];\n\t\t\tsortedInputs.sort((a, b) => {\n\t\t\t\tif (typeof a === 'string') {\n\t\t\t\t\treturn 1;\n\t\t\t\t} else if (typeof b === 'string') {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\n\t\t\t\tif (a.required && !b.required) {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else if (!a.required && b.required) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t});\n\n\t\t\tsortedInputs.forEach((value, i) => {\n\t\t\t\tlet inputConfiguration: INodeInputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\tinputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tinputConfiguration = value;\n\t\t\t\t}\n\n\t\t\t\tconst inputName: ConnectionTypes = inputConfiguration.type;\n\n\t\t\t\tconst rootCategoryInputName =\n\t\t\t\t\tinputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for inputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryInputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(inputName)) {\n\t\t\t\t\ttypeIndexData[inputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[inputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryInputName];\n\t\t\t\tconst typeIndex = typeIndexData[inputName];\n\n\t\t\t\tconst inputsOfSameRootType = inputs.filter((inputData) => {\n\t\t\t\t\tconst thisInputName: string = typeof inputData === 'string' ? inputData : inputData.type;\n\t\t\t\t\treturn inputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisInputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisInputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\tconst nonMainInputs = inputsOfSameRootType.filter((inputData) => {\n\t\t\t\t\treturn inputData !== NodeConnectionType.Main;\n\t\t\t\t});\n\t\t\t\tconst requiredNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && inputData.required;\n\t\t\t\t});\n\t\t\t\tconst optionalNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && !inputData.required;\n\t\t\t\t});\n\t\t\t\tconst spacerIndexes = this.getSpacerIndexes(\n\t\t\t\t\trequiredNonMainInputs.length,\n\t\t\t\t\toptionalNonMainInputs.length,\n\t\t\t\t);\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\tinputName,\n\t\t\t\t\t'input',\n\t\t\t\t\tinputsOfSameRootType.length,\n\t\t\t\t\tspacerIndexes,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(inputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getInputEndpointUUID(this.nodeId, inputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t// We potentially want to change that in the future to allow people to dynamically\n\t\t\t\t\t// activate and deactivate connected nodes\n\t\t\t\t\tmaxConnections: inputConfiguration.maxConnections ?? -1,\n\t\t\t\t\tendpoint: 'Rectangle',\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-foreground-xdark',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-primary',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\tscope: NodeViewUtils.getScope(scope),\n\t\t\t\t\tsource: inputName !== NodeConnectionType.Main,\n\t\t\t\t\ttarget: !this.isReadOnly && inputs.length > 1, // only enabled for nodes with multiple inputs.. otherwise attachment handled by connectionDrag event in NodeView,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'target',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: inputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\tenabled: !this.isReadOnly, // enabled in default case to allow dragging\n\t\t\t\t\tcssClass: 'rect-input-endpoint',\n\t\t\t\t\tdragAllowedWhenFull: true,\n\t\t\t\t\thoverClass: 'rect-input-endpoint-hover',\n\t\t\t\t\t...this.__getInputConnectionStyle(inputName, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance?.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t) as Endpoint;\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'input', typeIndex);\n\t\t\t\tif (inputConfiguration.displayName || nodeTypeData.inputNames?.[i]) {\n\t\t\t\t\t// Apply input names if they got set\n\t\t\t\t\tendpoint.addOverlay(\n\t\t\t\t\t\tNodeViewUtils.getInputNameOverlay(\n\t\t\t\t\t\t\tinputConfiguration.displayName || nodeTypeData.inputNames[i],\n\t\t\t\t\t\t\tinputName,\n\t\t\t\t\t\t\tinputConfiguration.required,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: inputsOfSameRootType.length,\n\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// TODO: Activate again if it makes sense. Currently makes problems when removing\n\t\t\t\t// connection on which the input has a name. It does not get hidden because\n\t\t\t\t// the endpoint to which it connects when letting it go over the node is\n\t\t\t\t// different to the regular one (have different ids). So that seems to make\n\t\t\t\t// problems when hiding the input-name.\n\n\t\t\t\t// if (index === 0 && inputName === NodeConnectionType.Main) {\n\t\t\t\t// \t// Make the first main-input the default one to connect to when connection gets dropped on node\n\t\t\t\t// \tthis.instance.makeTarget(this.nodeId, newEndpointData);\n\t\t\t\t// }\n\t\t\t});\n\t\t\tif (sortedInputs.length === 0) {\n\t\t\t\tthis.instance.manage(this.$refs[this.data.name] as Element);\n\t\t\t}\n\t\t},\n\t\tgetSpacerIndexes(\n\t\t\tleftGroupItemsCount: number,\n\t\t\trightGroupItemsCount: number,\n\t\t\tinsertSpacerBetweenGroups = NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\t\t\tminItemsCount = NODE_MIN_INPUT_ITEMS_COUNT,\n\t\t): number[] {\n\t\t\tconst spacerIndexes = [];\n\n\t\t\tif (leftGroupItemsCount > 0 && rightGroupItemsCount > 0) {\n\t\t\t\tif (insertSpacerBetweenGroups) {\n\t\t\t\t\tspacerIndexes.push(leftGroupItemsCount);\n\t\t\t\t} else if (leftGroupItemsCount + rightGroupItemsCount < minItemsCount) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tleftGroupItemsCount > 0 &&\n\t\t\t\t\tleftGroupItemsCount < minItemsCount &&\n\t\t\t\t\trightGroupItemsCount === 0\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex + leftGroupItemsCount);\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tleftGroupItemsCount === 0 &&\n\t\t\t\t\trightGroupItemsCount > 0 &&\n\t\t\t\t\trightGroupItemsCount < minItemsCount\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn spacerIndexes;\n\t\t},\n\t\t__addOutputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tthis.outputs = NodeHelpers.getNodeOutputs(this.workflow, this.data, nodeTypeData) || [];\n\n\t\t\t// TODO: There are still a lot of references of \"main\" in NodesView and\n\t\t\t// other locations. So assume there will be more problems\n\t\t\tlet maxLabelLength = 0;\n\t\t\tconst outputConfigurations: INodeOutputConfiguration[] = [];\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tlet outputConfiguration: INodeOutputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\toutputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\toutputConfiguration = value;\n\t\t\t\t}\n\t\t\t\tif (nodeTypeData.outputNames?.[i]) {\n\t\t\t\t\toutputConfiguration.displayName = nodeTypeData.outputNames[i];\n\t\t\t\t}\n\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\tmaxLabelLength =\n\t\t\t\t\t\toutputConfiguration.displayName.length > maxLabelLength\n\t\t\t\t\t\t\t? outputConfiguration.displayName.length\n\t\t\t\t\t\t\t: maxLabelLength;\n\t\t\t\t}\n\n\t\t\t\toutputConfigurations.push(outputConfiguration);\n\t\t\t});\n\n\t\t\tconst endpointLabelLength = maxLabelLength < 4 ? 'short' : 'medium';\n\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tconst outputConfiguration = outputConfigurations[i];\n\n\t\t\t\tconst outputName: ConnectionTypes = outputConfiguration.type;\n\n\t\t\t\tconst rootCategoryOutputName =\n\t\t\t\t\toutputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for outputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryOutputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(outputName)) {\n\t\t\t\t\ttypeIndexData[outputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[outputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryOutputName];\n\t\t\t\tconst typeIndex = typeIndexData[outputName];\n\n\t\t\t\tconst outputsOfSameRootType = this.outputs.filter((outputData) => {\n\t\t\t\t\tconst thisOutputName: string =\n\t\t\t\t\t\ttypeof outputData === 'string' ? outputData : outputData.type;\n\t\t\t\t\treturn outputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisOutputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisOutputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\toutputName,\n\t\t\t\t\t'output',\n\t\t\t\t\toutputsOfSameRootType.length,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(outputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\tendpoint: {\n\t\t\t\t\t\ttype: 'Dot',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tradius: nodeTypeData && outputsOfSameRootType.length > 2 ? 7 : 9,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(nodeTypeData, '--color-primary'),\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: true,\n\t\t\t\t\ttarget: outputName !== NodeConnectionType.Main,\n\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\thoverClass: 'dot-output-endpoint-hover',\n\t\t\t\t\tconnectionsDirected: true,\n\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t...this.__getOutputConnectionStyle(outputName, outputConfiguration, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t);\n\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'output', typeIndex);\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\t// Apply output names if they got set\n\t\t\t\t\tconst overlaySpec = NodeViewUtils.getOutputNameOverlay(\n\t\t\t\t\t\toutputConfiguration.displayName,\n\t\t\t\t\t\toutputName,\n\t\t\t\t\t\toutputConfiguration?.category,\n\t\t\t\t\t);\n\t\t\t\t\tendpoint.addOverlay(overlaySpec);\n\t\t\t\t}\n\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\n\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (!this.isReadOnly && outputName === NodeConnectionType.Main) {\n\t\t\t\t\tconst plusEndpointData: EndpointOptions = {\n\t\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\t\tendpoint: {\n\t\t\t\t\t\t\ttype: 'N8nPlus',\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tdimensions: 24,\n\t\t\t\t\t\t\t\tconnectedEndpoint: endpoint,\n\t\t\t\t\t\t\t\tshowOutputLabel: this.outputs.length === 1,\n\t\t\t\t\t\t\t\tsize: this.outputs.length >= 3 ? 'small' : 'medium',\n\t\t\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t\t\t\thoverMessage: this.$locale.baseText('nodeBase.clickToAddNodeOrDragToConnect'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsource: true,\n\t\t\t\t\t\ttarget: false,\n\t\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\thoverPaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tparameters: {\n\t\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tcategory: outputConfiguration?.category,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: 'plus-draggable-endpoint',\n\t\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (outputConfiguration?.category) {\n\t\t\t\t\t\tplusEndpointData.cssClass = `${plusEndpointData.cssClass} ${outputConfiguration?.category}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst plusEndpoint = this.instance.addEndpoint(\n\t\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\t\tplusEndpointData,\n\t\t\t\t\t);\n\t\t\t\t\tthis.__addEndpointTestingData(plusEndpoint, 'plus', typeIndex);\n\n\t\t\t\t\tif (!Array.isArray(plusEndpoint)) {\n\t\t\t\t\t\tplusEndpoint.__meta = {\n\t\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t__addNode(node: INodeUi) {\n\t\t\tconst nodeTypeData = (this.nodeTypesStore.getNodeType(node.type, node.typeVersion) ??\n\t\t\t\tthis.nodeTypesStore.getNodeType(NO_OP_NODE_TYPE)) as INodeTypeDescription;\n\n\t\t\tthis.__addInputEndpoints(node, nodeTypeData);\n\t\t\tthis.__addOutputEndpoints(node, nodeTypeData);\n\t\t},\n\t\t__getEndpointColor(connectionType: ConnectionTypes) {\n\t\t\treturn `--node-type-${connectionType}-color`;\n\t\t},\n\t\t__getInputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createAddInputEndpointSpec(\n\t\t\t\t\tconnectionName as NodeConnectionType,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\t__getOutputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\toutputConfiguration: INodeOutputConfiguration,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tconst type = 'output';\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createDiamondOutputEndpointSpec(),\n\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\tif (outputConfiguration.category === 'error') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\t...NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfill: 'var(--node-error-output-color)',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t),\n\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\ttouchEnd(e: MouseEvent) {\n\t\t\tif (this.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmouseLeftClick(e: MouseEvent) {\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\t\t\tfor (let index = 0; index < path.length; index++) {\n\t\t\t\tif (\n\t\t\t\t\tpath[index].className &&\n\t\t\t\t\ttypeof path[index].className === 'string' &&\n\t\t\t\t\tpath[index].className.includes('no-select-on-click')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!this.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.isCtrlKeyPressed(e)) {\n\t\t\t\t\t\tthis.$emit('deselectAllNodes');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.uiStore.isNodeSelected(this.data.name)) {\n\t\t\t\t\t\tthis.$emit('deselectNode', this.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$emit('nodeSelected', this.name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n","<template>\n\t<div\n\t\t:class=\"nodeWrapperClass\"\n\t\t:style=\"nodeWrapperStyles\"\n\t\t:id=\"nodeId\"\n\t\tdata-test-id=\"canvas-node\"\n\t\t:ref=\"data.name\"\n\t\t:data-name=\"data.name\"\n\t\t@contextmenu=\"(e: MouseEvent) => openContextMenu(e, 'node-right-click')\"\n\t>\n\t\t<div class=\"select-background\" v-show=\"isSelected\"></div>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'node-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': isTouchDevice,\n\t\t\t\t'menu-open': isContextMenuOpen,\n\t\t\t\t'disable-pointer-events': disablePointerEvents,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\t:class=\"nodeClass\"\n\t\t\t\t:style=\"nodeStyle\"\n\t\t\t\t@click.left=\"onClick\"\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t>\n\t\t\t\t<i class=\"trigger-icon\" v-if=\"isTriggerNode\">\n\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<span v-html=\"$locale.baseText('node.thisIsATriggerNode')\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<font-awesome-icon icon=\"bolt\" size=\"lg\" />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</i>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"!data.disabled\"\n\t\t\t\t\t:class=\"{ 'node-info-icon': true, 'shift-icon': shiftOutputCount }\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"hasIssues && !hideNodeIssues\" class=\"node-issues\" data-test-id=\"node-issues\">\n\t\t\t\t\t\t<n8n-tooltip :show-after=\"500\" placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<titled-list :title=\"`${$locale.baseText('node.issues')}:`\" :items=\"nodeIssues\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else-if=\"waiting || nodeExecutionStatus === 'waiting'\" class=\"waiting\">\n\t\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<div v-text=\"waiting\"></div>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<font-awesome-icon icon=\"clock\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span v-else-if=\"showPinnedDataInfo\" class=\"node-pin-data-icon\">\n\t\t\t\t\t\t<font-awesome-icon icon=\"thumbtack\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"nodeExecutionStatus === 'unknown'\">\n\t\t\t\t\t\t<!-- Do nothing, unknown means the node never executed -->\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"workflowDataItems\" class=\"data-count\">\n\t\t\t\t\t\t<font-awesome-icon icon=\"check\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-executing-info\" :title=\"$locale.baseText('node.nodeIsExecuting')\">\n\t\t\t\t\t<font-awesome-icon icon=\"sync-alt\" spin />\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-trigger-tooltip__wrapper\">\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:show-after=\"500\"\n\t\t\t\t\t\t:visible=\"showTriggerNodeTooltip\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<div v-text=\"getTriggerNodeTooltip\"></div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tv-if=\"isTriggerNode\"\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:visible=\"pinDataDiscoveryTooltipVisible\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t{{ $locale.baseText('node.discovery.pinData.canvas') }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</div>\n\n\t\t\t\t<NodeIcon\n\t\t\t\t\tclass=\"node-icon\"\n\t\t\t\t\t:nodeType=\"nodeType\"\n\t\t\t\t\t:size=\"40\"\n\t\t\t\t\t:shrink=\"false\"\n\t\t\t\t\t:colorDefault=\"iconColorDefault\"\n\t\t\t\t\t:disabled=\"this.data.disabled\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div class=\"node-options no-select-on-click\" v-if=\"!isReadOnly\" v-show=\"!hideActions\">\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"execute-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"play\"\n\t\t\t\t\t:disabled=\"workflowRunning || isConfigNode\"\n\t\t\t\t\t:title=\"$locale.baseText('node.executeNode')\"\n\t\t\t\t\t@click=\"executeNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"overflow-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"ellipsis-h\"\n\t\t\t\t\t@click=\"(e: MouseEvent) => openContextMenu(e, 'node-button')\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\t:class=\"{\n\t\t\t\t\t'disabled-linethrough': true,\n\t\t\t\t\tsuccess: !['unknown'].includes(nodeExecutionStatus) && workflowDataItems > 0,\n\t\t\t\t}\"\n\t\t\t\tv-if=\"showDisabledLinethrough\"\n\t\t\t></div>\n\t\t</div>\n\t\t<div class=\"node-description\">\n\t\t\t<div class=\"node-name\" :title=\"nodeTitle\">\n\t\t\t\t<p data-test-id=\"canvas-node-box-title\">\n\t\t\t\t\t{{ nodeTitle }}\n\t\t\t\t</p>\n\t\t\t\t<p v-if=\"data.disabled\">({{ $locale.baseText('node.disabled') }})</p>\n\t\t\t</div>\n\t\t\t<div v-if=\"nodeSubtitle !== undefined\" class=\"node-subtitle\" :title=\"nodeSubtitle\">\n\t\t\t\t{{ nodeSubtitle }}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport {\n\tCUSTOM_API_CALL_KEY,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNOT_DUPLICATABE_NODE_TYPES,\n\tWAIT_TIME_UNLIMITED,\n} from '@/constants';\nimport { nodeBase } from '@/mixins/nodeBase';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport { pinData } from '@/mixins/pinData';\nimport type {\n\tConnectionTypes,\n\tIExecutionsSummary,\n\tINodeInputConfiguration,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tITaskData,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { NodeConnectionType, NodeHelpers } from 'n8n-workflow';\n\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport TitledList from '@/components/TitledList.vue';\n\nimport { get } from 'lodash-es';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport type { INodeUi, XYPosition } from '@/Interface';\nimport { debounceHelper } from '@/mixins/debounce';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { EnableNodeToggleCommand } from '@/models/history';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { type ContextMenuTarget, useContextMenu } from '@/composables/useContextMenu';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tname: 'Node',\n\tsetup() {\n\t\tconst contextMenu = useContextMenu();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn { contextMenu, externalHooks, nodeHelpers };\n\t},\n\tmixins: [nodeBase, workflowHelpers, pinData, debounceHelper],\n\tcomponents: {\n\t\tTitledList,\n\t\tFontAwesomeIcon,\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tdisablePointerEvents: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\thideNodeIssues: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tshowPinnedDataInfo(): boolean {\n\t\t\treturn this.hasPinData && !this.isProductionExecutionPreview;\n\t\t},\n\t\tisDuplicatable(): boolean {\n\t\t\tif (!this.nodeType) return true;\n\t\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(this.nodeType.name)) return false;\n\t\t\treturn (\n\t\t\t\tthis.nodeType.maxNodes === undefined || this.sameTypeNodes.length < this.nodeType.maxNodes\n\t\t\t);\n\t\t},\n\t\tisScheduledGroup(): boolean {\n\t\t\treturn this.nodeType?.group.includes('schedule') === true;\n\t\t},\n\t\ticonColorDefault(): string | undefined {\n\t\t\tif (this.isConfigNode) {\n\t\t\t\treturn 'var(--color-text-base)';\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tnodeRunData(): ITaskData[] {\n\t\t\treturn this.workflowsStore.getWorkflowResultDataByNodeName(this.data?.name || '') || [];\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\tif (\n\t\t\t\tthis.nodeExecutionStatus &&\n\t\t\t\t['crashed', 'error', 'failed'].includes(this.nodeExecutionStatus)\n\t\t\t)\n\t\t\t\treturn true;\n\t\t\tif (this.hasPinData) return false;\n\t\t\tif (this.data?.issues !== undefined && Object.keys(this.data.issues).length) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowDataItems(): number {\n\t\t\tconst workflowResultDataNode = this.nodeRunData;\n\t\t\tif (workflowResultDataNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn workflowResultDataNode.length;\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tgetTriggerNodeTooltip(): string | undefined {\n\t\t\tif (this.nodeType !== null && this.nodeType.hasOwnProperty('eventTriggerDescription')) {\n\t\t\t\tconst nodeName = this.$locale.shortNodeType(this.nodeType.name);\n\t\t\t\tconst { eventTriggerDescription } = this.nodeType;\n\t\t\t\treturn this.$locale\n\t\t\t\t\t.nodeText()\n\t\t\t\t\t.eventTriggerDescription(nodeName, eventTriggerDescription || '');\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('node.waitingForYouToCreateAnEventIn', {\n\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\tnodeType: this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '',\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisExecuting(): boolean {\n\t\t\treturn this.workflowsStore.isNodeExecuting(this.data.name);\n\t\t},\n\t\tisSingleActiveTriggerNode(): boolean {\n\t\t\tconst nodes = this.workflowsStore.workflowTriggerNodes.filter((node: INodeUi) => {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\treturn nodeType && nodeType.eventTriggerDescription !== '' && !node.disabled;\n\t\t\t});\n\n\t\t\treturn nodes.length === 1;\n\t\t},\n\t\tisManualTypeNode(): boolean {\n\t\t\treturn this.data.type === MANUAL_TRIGGER_NODE_TYPE;\n\t\t},\n\t\tisConfigNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isConfigNode(this.workflow, this.data, this.data?.type ?? '');\n\t\t},\n\t\tisConfigurableNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isConfigurableNode(\n\t\t\t\tthis.workflow,\n\t\t\t\tthis.data,\n\t\t\t\tthis.data?.type ?? '',\n\t\t\t);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.data?.type || '');\n\t\t},\n\t\tisTriggerNodeTooltipEmpty(): boolean {\n\t\t\treturn this.nodeType !== null ? this.nodeType.eventTriggerDescription === '' : false;\n\t\t},\n\t\tisNodeDisabled(): boolean | undefined {\n\t\t\treturn this.node && this.node.disabled;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | undefined {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.nodesByName[this.name] as INodeUi | undefined;\n\t\t},\n\t\tsameTypeNodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node: INodeUi) => node.type === this.data.type);\n\t\t},\n\t\tnodeWrapperClass(): object {\n\t\t\tconst classes = {\n\t\t\t\t'node-wrapper': true,\n\t\t\t\t'node-wrapper--trigger': this.isTriggerNode,\n\t\t\t\t'node-wrapper--configurable': this.isConfigurableNode,\n\t\t\t\t'node-wrapper--config': this.isConfigNode,\n\t\t\t};\n\n\t\t\tif (this.outputs.length) {\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(this.outputs);\n\t\t\t\tconst otherOutputs = outputTypes.filter(\n\t\t\t\t\t(outputName) => outputName !== NodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t\tif (otherOutputs.length) {\n\t\t\t\t\totherOutputs.forEach((outputName) => {\n\t\t\t\t\t\tclasses[`node-wrapper--connection-type-${outputName}`] = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn classes;\n\t\t},\n\t\tnodeWrapperStyles(): object {\n\t\t\tconst styles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t};\n\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst inputs =\n\t\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.node, this.nodeType) ||\n\t\t\t\t\t([] as Array<ConnectionTypes | INodeInputConfiguration>);\n\t\t\t\tconst inputTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tconst nonMainInputs = inputTypes.filter((input) => input !== NodeConnectionType.Main);\n\t\t\t\tif (nonMainInputs.length) {\n\t\t\t\t\tconst requiredNonMainInputs = inputs.filter(\n\t\t\t\t\t\t(input) => typeof input !== 'string' && input.required,\n\t\t\t\t\t);\n\n\t\t\t\t\tlet spacerCount = 0;\n\t\t\t\t\tif (NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS) {\n\t\t\t\t\t\tconst requiredNonMainInputsCount = requiredNonMainInputs.length;\n\t\t\t\t\t\tconst optionalNonMainInputsCount = nonMainInputs.length - requiredNonMainInputsCount;\n\t\t\t\t\t\tspacerCount = requiredNonMainInputsCount > 0 && optionalNonMainInputsCount > 0 ? 1 : 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tstyles['--configurable-node-input-count'] = nonMainInputs.length + spacerCount;\n\t\t\t\t}\n\n\t\t\t\tlet outputs = [] as Array<ConnectionTypes | INodeOutputConfiguration>;\n\t\t\t\tif (this.workflow.nodes[this.node.name]) {\n\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.workflow, this.node, this.nodeType);\n\t\t\t\t}\n\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\n\t\t\t\tconst mainOutputs = outputTypes.filter((output) => output === NodeConnectionType.Main);\n\t\t\t\tstyles['--node-main-output-count'] = mainOutputs.length;\n\t\t\t}\n\n\t\t\treturn styles;\n\t\t},\n\t\tnodeClass(): object {\n\t\t\treturn {\n\t\t\t\t'node-box': true,\n\t\t\t\tdisabled: this.data.disabled,\n\t\t\t\texecuting: this.isExecuting,\n\t\t\t};\n\t\t},\n\t\tnodeExecutionStatus(): string {\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\treturn nodeExecutionRunData.filter(Boolean)[0].executionStatus ?? '';\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t\tnodeIssues(): string[] {\n\t\t\tconst issues: string[] = [];\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\tnodeExecutionRunData.forEach((executionRunData) => {\n\t\t\t\t\tif (executionRunData?.error) {\n\t\t\t\t\t\tissues.push(\n\t\t\t\t\t\t\t`${executionRunData.error.message}${\n\t\t\t\t\t\t\t\texecutionRunData.error.description ? ` (${executionRunData.error.description})` : ''\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.data?.issues !== undefined) {\n\t\t\t\tissues.push(...NodeHelpers.nodeIssuesToString(this.data.issues, this.data));\n\t\t\t}\n\t\t\treturn issues;\n\t\t},\n\t\tnodeDisabledIcon(): string {\n\t\t\tif (this.data.disabled === false) {\n\t\t\t\treturn 'pause';\n\t\t\t} else {\n\t\t\t\treturn 'play';\n\t\t\t}\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\treturn this.node ? this.node.position : [0, 0];\n\t\t},\n\t\tshowDisabledLinethrough(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.isConfigurableNode &&\n\t\t\t\t!!(this.data.disabled && this.inputs.length === 1 && this.outputs.length === 1)\n\t\t\t);\n\t\t},\n\t\tshortNodeType(): string {\n\t\t\treturn this.$locale.shortNodeType(this.data.type);\n\t\t},\n\t\tnodeTitle(): string {\n\t\t\tif (this.data.name === 'Start') {\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: 'headers.start.displayName',\n\t\t\t\t\tfallback: 'Start',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn this.data.name;\n\t\t},\n\t\twaiting(): string | undefined {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution as IExecutionsSummary;\n\n\t\t\tif (workflowExecution?.waitTill) {\n\t\t\t\tconst lastNodeExecuted = get(workflowExecution, 'data.resultData.lastNodeExecuted');\n\t\t\t\tif (this.name === lastNodeExecuted) {\n\t\t\t\t\tconst waitDate = new Date(workflowExecution.waitTill);\n\t\t\t\t\tif (waitDate.toISOString() === WAIT_TIME_UNLIMITED) {\n\t\t\t\t\t\treturn this.$locale.baseText(\n\t\t\t\t\t\t\t'node.theNodeIsWaitingIndefinitelyForAnIncomingWebhookCall',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.$locale.baseText('node.nodeIsWaitingTill', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdate: waitDate.toLocaleDateString(),\n\t\t\t\t\t\t\ttime: waitDate.toLocaleTimeString(),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tnodeStyle(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\n\t\t\tlet borderColor = '--color-foreground-xdark';\n\n\t\t\tif (this.isConfigurableNode || this.isConfigNode) {\n\t\t\t\tborderColor = '--color-foreground-dark';\n\t\t\t}\n\n\t\t\tif (this.data.disabled) {\n\t\t\t\tborderColor = '--color-foreground-base';\n\t\t\t} else if (!this.isExecuting) {\n\t\t\t\tif (this.hasIssues && !this.hideNodeIssues) {\n\t\t\t\t\t// Do not set red border if there is an issue with the configuration node\n\t\t\t\t\tif (\n\t\t\t\t\t\t(this.nodeRunData?.[0]?.error as NodeOperationError)?.functionality !==\n\t\t\t\t\t\t'configuration-node'\n\t\t\t\t\t) {\n\t\t\t\t\t\tborderColor = '--color-danger';\n\t\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\t}\n\t\t\t\t} else if (this.waiting || this.showPinnedDataInfo) {\n\t\t\t\t\tborderColor = '--color-canvas-node-pinned-border';\n\t\t\t\t} else if (this.nodeExecutionStatus === 'unknown') {\n\t\t\t\t\tborderColor = '--color-foreground-xdark';\n\t\t\t\t} else if (this.workflowDataItems) {\n\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\tborderColor = '--color-success';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnStyles['border-color'] = `var(${borderColor})`;\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tshiftOutputCount(): boolean {\n\t\t\treturn !!(this.nodeType && this.outputs.length > 2);\n\t\t},\n\t\tshouldShowTriggerTooltip(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isPollingTypeNode &&\n\t\t\t\t!this.hasPinData &&\n\t\t\t\t!this.isNodeDisabled &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowDataItems === 0 &&\n\t\t\t\tthis.isSingleActiveTriggerNode &&\n\t\t\t\t!this.isTriggerNodeTooltipEmpty &&\n\t\t\t\t!this.hasIssues &&\n\t\t\t\t!this.dragging\n\t\t\t);\n\t\t},\n\t\tisContextMenuOpen(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.contextMenu.isOpen.value &&\n\t\t\t\tthis.contextMenu.target.value.source === 'node-button' &&\n\t\t\t\tthis.contextMenu.target.value.node.name === this.data?.name\n\t\t\t);\n\t\t},\n\t},\n\twatch: {\n\t\tisActive(newValue, oldValue) {\n\t\t\tif (!newValue && oldValue) {\n\t\t\t\tthis.setSubtitle();\n\t\t\t}\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\tif (this.showTriggerNodeTooltip) {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 200);\n\t\t\t}\n\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t},\n\t\tshouldShowTriggerTooltip(shouldShowTriggerTooltip) {\n\t\t\tif (shouldShowTriggerTooltip) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 2500);\n\t\t\t} else {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t}\n\t\t},\n\t\tnodeRunData(newValue) {\n\t\t\tif (!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$emit('run', { name: this.data.name, data: newValue, waiting: !!this.waiting });\n\t\t},\n\t},\n\tcreated() {\n\t\tconst hasSeenPinDataTooltip = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value;\n\t\tif (!hasSeenPinDataTooltip) {\n\t\t\tthis.unwatchWorkflowDataItems = this.$watch('workflowDataItems', (dataItemsCount: number) => {\n\t\t\t\tthis.showPinDataDiscoveryTooltip(dataItemsCount);\n\t\t\t});\n\t\t}\n\t},\n\tmounted() {\n\t\tsetTimeout(() => {\n\t\t\tthis.setSubtitle();\n\t\t}, 0);\n\t\tif (this.nodeRunData) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('run', {\n\t\t\t\t\tname: this.data && this.data.name,\n\t\t\t\t\tdata: this.nodeRunData,\n\t\t\t\t\twaiting: !!this.waiting,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisTouchActive: false,\n\t\t\tnodeSubtitle: '',\n\t\t\tshowTriggerNodeTooltip: false,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tdragging: false,\n\t\t\tunwatchWorkflowDataItems: () => {},\n\t\t};\n\t},\n\tmethods: {\n\t\tshowPinDataDiscoveryTooltip(dataItemsCount: number): void {\n\t\t\tif (\n\t\t\t\t!this.isTriggerNode ||\n\t\t\t\tthis.isManualTypeNode ||\n\t\t\t\tthis.isScheduledGroup ||\n\t\t\t\tthis.uiStore.isModalActive ||\n\t\t\t\tdataItemsCount === 0\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\n\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\tthis.unwatchWorkflowDataItems();\n\t\t},\n\t\tsetSubtitle() {\n\t\t\t// why is this not a computed property? because it's a very expensive operation\n\t\t\t// it requires expressions to resolve each subtitle...\n\t\t\t// and ends up bogging down the UI with big workflows, for example when pasting a workflow or even opening a node...\n\t\t\t// so we only update it when necessary (when node is mounted and when it's opened and closed (isActive))\n\t\t\ttry {\n\t\t\t\tconst nodeSubtitle =\n\t\t\t\t\tthis.nodeHelpers.getNodeSubtitle(this.data, this.nodeType, this.workflow) || '';\n\n\t\t\t\tthis.nodeSubtitle = nodeSubtitle.includes(CUSTOM_API_CALL_KEY) ? '' : nodeSubtitle;\n\t\t\t} catch (e) {\n\t\t\t\t// avoid breaking UI if expression error occurs\n\t\t\t}\n\t\t},\n\t\tdisableNode() {\n\t\t\tif (this.data !== null) {\n\t\t\t\tthis.nodeHelpers.disableNodes([this.data]);\n\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\tnew EnableNodeToggleCommand(\n\t\t\t\t\t\tthis.data.name,\n\t\t\t\t\t\t!this.data.disabled,\n\t\t\t\t\t\tthis.data.disabled === true,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\t\tnode_type: this.data.type,\n\t\t\t\t\tbutton_name: 'disable',\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\texecuteNode() {\n\t\t\tthis.$emit('runWorkflow', this.data.name, 'Node.executeNode');\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data.type,\n\t\t\t\tbutton_name: 'execute',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\n\t\tonClick(event: MouseEvent) {\n\t\t\tvoid this.callDebounced('onClickDebounced', { debounceTime: 50, trailing: true }, event);\n\t\t},\n\n\t\tonClickDebounced(event: MouseEvent) {\n\t\t\tconst isDoubleClick = event.detail >= 2;\n\t\t\tif (isDoubleClick) {\n\t\t\t\tthis.setNodeActive();\n\t\t\t} else {\n\t\t\t\tthis.mouseLeftClick(event);\n\t\t\t}\n\t\t},\n\n\t\tsetNodeActive() {\n\t\t\tthis.ndvStore.activeNodeName = this.data ? this.data.name : '';\n\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.isTouchDevice === true && !this.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\topenContextMenu(event: MouseEvent, source: ContextMenuTarget['source']) {\n\t\t\tif (this.data) {\n\t\t\t\tthis.contextMenu.open(event, { source, node: this.data });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.context-menu {\n\tposition: absolute;\n}\n\n.node-wrapper {\n\t--node-width: 100px;\n\t/*\n\t\tSet the node height to 100px as a base.\n\t\tIncrease height by 20px for each output beyond the 4th one.\n\t\tmax(0, var(--node-main-output-count, 1) - 4) ensures that we only start counting after the 4th output.\n\t*/\n\t--node-height: calc(100px + max(0, var(--node-main-output-count, 1) - 4) * 20px);\n\n\t--configurable-node-min-input-count: 4;\n\t--configurable-node-input-width: 65px;\n\n\tposition: absolute;\n\twidth: var(--node-width);\n\theight: var(--node-height);\n\n\t.node-description {\n\t\tposition: absolute;\n\t\ttop: var(--node-height);\n\t\tleft: calc(var(--node-width) / 2 * -1);\n\t\tline-height: 1.5;\n\t\ttext-align: center;\n\t\tcursor: default;\n\t\tpadding: 8px;\n\t\twidth: 100%;\n\t\tmin-width: calc(var(--node-width) * 2);\n\t\tpointer-events: none; // prevent container from being draggable\n\n\t\t.node-name > p {\n\t\t\t// must be paragraph tag to have two lines in safari\n\t\t\ttext-overflow: ellipsis;\n\t\t\tdisplay: -webkit-box;\n\t\t\t-webkit-box-orient: vertical;\n\t\t\t-webkit-line-clamp: 2;\n\t\t\toverflow: hidden;\n\t\t\toverflow-wrap: anywhere;\n\t\t\tfont-weight: var(--font-weight-bold);\n\t\t\tline-height: var(--font-line-height-compact);\n\t\t}\n\n\t\t.node-subtitle {\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tfont-weight: 400;\n\t\t\tcolor: $custom-font-light;\n\t\t\tfont-size: 0.8em;\n\t\t}\n\t}\n\n\t.node-default {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tcursor: pointer;\n\t\t&.disable-pointer-events {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.node-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t\tbackground-color: var(--color-canvas-node-background);\n\t\t\t--color-background-node-icon-badge: var(--color-canvas-node-background);\n\t\t\t&.executing {\n\t\t\t\tbackground-color: $node-background-executing !important;\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&.touch-active,\n\t\t&:hover,\n\t\t&.menu-open {\n\t\t\t.node-options {\n\t\t\t\tpointer-events: all;\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t.node-executing-info {\n\t\t\tdisplay: none;\n\t\t\tposition: absolute;\n\t\t\tleft: 0px;\n\t\t\ttop: 0px;\n\t\t\tz-index: 12;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tfont-size: 3.75em;\n\t\t\tline-height: 1.65em;\n\t\t\ttext-align: center;\n\t\t\tcolor: hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.7);\n\t\t}\n\n\t\t.node-icon {\n\t\t\tposition: absolute;\n\t\t\ttop: calc(50% - 20px);\n\t\t\tleft: calc(50% - 20px);\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tposition: absolute;\n\t\t\tbottom: 6px;\n\t\t\tright: 6px;\n\n\t\t\t&.shift-icon {\n\t\t\t\tright: 12px;\n\t\t\t}\n\n\t\t\t.data-count {\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: var(--color-success);\n\t\t\t}\n\n\t\t\t.node-issues {\n\t\t\t\tcolor: var(--color-danger);\n\t\t\t}\n\n\t\t\t.items-count {\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t\tpadding: 0;\n\t\t\t}\n\t\t}\n\n\t\t.node-pin-data-icon {\n\t\t\tcolor: var(--color-secondary);\n\t\t\tmargin-right: 2px;\n\n\t\t\tsvg {\n\t\t\t\theight: 0.85rem;\n\t\t\t}\n\t\t}\n\n\t\t.waiting {\n\t\t\tcolor: var(--color-secondary);\n\t\t}\n\n\t\t.node-options {\n\t\t\t--node-options-height: 26px;\n\t\t\t:deep(.button) {\n\t\t\t\t--button-font-color: var(--color-text-light);\n\t\t\t}\n\t\t\tposition: absolute;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: space-between;\n\t\t\tgap: var(--spacing-2xs);\n\t\t\ttransition: opacity 100ms ease-in;\n\t\t\topacity: 0;\n\t\t\tpointer-events: none;\n\t\t\ttop: calc(-1 * (var(--node-options-height) + var(--spacing-4xs)));\n\t\t\tleft: 0;\n\t\t\twidth: var(--node-width);\n\t\t\theight: var(--node-options-height);\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tz-index: 10;\n\t\t\ttext-align: center;\n\n\t\t\t.option {\n\t\t\t\tdisplay: inline-block;\n\n\t\t\t\t&.touch {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: $color-primary;\n\t\t\t\t}\n\n\t\t\t\t.execute-icon {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\tfont-size: var(----font-size-xl);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&:after {\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\ttop: -1rem;\n\t\t\t\tbottom: -1rem;\n\t\t\t\tz-index: -1;\n\t\t\t}\n\t\t}\n\n\t\t&.is-touch-device .node-options {\n\t\t\tleft: -25px;\n\t\t\twidth: 150px;\n\n\t\t\t.option.touch {\n\t\t\t\tdisplay: initial;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--config {\n\t\t--configurable-node-input-width: 55px;\n\t\t--node-width: 75px;\n\t\t--node-height: 75px;\n\n\t\t.node-default {\n\t\t\t.node-options {\n\t\t\t\tbackground: color-mix(in srgb, var(--color-canvas-background) 80%, transparent);\n\t\t\t\theight: 25px;\n\t\t\t}\n\n\t\t\t.node-icon {\n\t\t\t\tscale: 0.75;\n\t\t\t}\n\t\t}\n\n\t\t.node-default {\n\t\t\t.node-box {\n\t\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\t\t//background-color: $node-background-type-other;\n\t\t\t\tborder-radius: 50px;\n\n\t\t\t\t&.executing {\n\t\t\t\t\tbackground-color: $node-background-executing-other !important;\n\t\t\t\t}\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tfont-size: 2.85em;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t&.node-wrapper--connection-type-#{$node-type} {\n\t\t\t\t.node-default .node-box {\n\t\t\t\t\tbackground: var(--node-type-#{$node-type}-background);\n\t\t\t\t}\n\n\t\t\t\t.node-description {\n\t\t\t\t\t.node-subtitle {\n\t\t\t\t\t\tcolor: var(--node-type-#{$node-type}-color);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tbottom: 4px !important;\n\t\t\tright: 50% !important;\n\t\t\ttransform: translateX(50%) scale(0.75);\n\t\t}\n\n\t\t&.node-wrapper--configurable {\n\t\t\t--configurable-node-icon-offset: 20px;\n\n\t\t\t.node-info-icon {\n\t\t\t\tbottom: 1px !important;\n\t\t\t\tright: 1px !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--configurable {\n\t\t--node-width: var(\n\t\t\t--configurable-node-width,\n\t\t\tcalc(\n\t\t\t\tmax(var(--configurable-node-input-count, 5), var(--configurable-node-min-input-count)) *\n\t\t\t\t\tvar(--configurable-node-input-width)\n\t\t\t)\n\t\t);\n\t\t--configurable-node-icon-offset: 40px;\n\t\t--configurable-node-icon-size: 30px;\n\n\t\t.node-description {\n\t\t\ttop: calc(50%);\n\t\t\ttransform: translateY(-50%);\n\t\t\tleft: calc(\n\t\t\t\tvar(--configurable-node-icon-offset) + var(--configurable-node-icon-size) + var(--spacing-s)\n\t\t\t);\n\t\t\ttext-align: left;\n\t\t\toverflow: auto;\n\t\t\twhite-space: normal;\n\t\t\tmin-width: unset;\n\t\t\tmax-width: calc(\n\t\t\t\tvar(--node-width) - var(--configurable-node-icon-offset) - var(\n\t\t\t\t\t\t--configurable-node-icon-size\n\t\t\t\t\t) - 2 * var(--spacing-s)\n\t\t\t);\n\t\t\t.node-name > p {\n\t\t\t\tcolor: var(--color-configurable-node-name);\n\t\t\t}\n\t\t}\n\n\t\t.node-default {\n\t\t\t.node-icon {\n\t\t\t\tleft: var(--configurable-node-icon-offset);\n\t\t\t}\n\n\t\t\t.node-options {\n\t\t\t\tleft: 0;\n\t\t\t\theight: 25px;\n\t\t\t}\n\n\t\t\t.node-executing-info {\n\t\t\t\tleft: -67px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--trigger .node-default .node-box {\n\t\tborder-radius: 32px 8px 8px 32px;\n\t}\n\n\t.trigger-icon {\n\t\tposition: absolute;\n\t\tright: 100%;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tmargin: auto;\n\t\tcolor: var(--color-primary);\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: fit-content;\n\t\t// Increase click radius of the bolt icon\n\t\tpadding: var(--spacing-2xs);\n\t}\n}\n\n.select-background {\n\t--node--selected--box-shadow-radius: 8px;\n\n\tdisplay: block;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\tposition: absolute;\n\tleft: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\ttop: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\theight: calc(100% + 2 * var(--node--selected--box-shadow-radius));\n\twidth: calc(100% + 2 * var(--node--selected--box-shadow-radius)) !important;\n\n\t.node-wrapper--trigger & {\n\t\tborder-radius: 36px 8px 8px 36px;\n\t}\n\n\t.node-wrapper--config & {\n\t\t--node--selected--box-shadow-radius: 4px;\n\t\tborder-radius: 60px;\n\t}\n}\n\n.disabled-linethrough {\n\tborder: 1px solid var(--color-foreground-dark);\n\tposition: absolute;\n\ttop: 49px;\n\tleft: -3px;\n\twidth: 111px;\n\tpointer-events: none;\n\n\t&.success {\n\t\tborder-color: var(--color-success-light);\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n.jtk-endpoint {\n\tz-index: 2;\n}\n\n.node-trigger-tooltip {\n\t&__wrapper {\n\t\ttop: -22px;\n\t\tleft: 50px;\n\t\tposition: relative;\n\n\t\t&--item {\n\t\t\tmax-width: 160px;\n\t\t\tposition: fixed;\n\t\t\tz-index: 0 !important;\n\t\t}\n\t}\n}\n.dot-output-endpoint:hover circle {\n\tfill: var(--color-primary);\n}\n/** connector */\n.jtk-connector {\n\tz-index: 3;\n}\n\n.jtk-floating-endpoint {\n\topacity: 0;\n}\n\n.jtk-connector path {\n\ttransition: stroke 0.1s ease-in-out;\n}\n\n.jtk-overlay {\n\tz-index: 3;\n}\n.jtk-connector {\n\tz-index: 4;\n}\n.node-input-endpoint-label,\n.node-output-endpoint-label,\n.connection-run-items-label {\n\tz-index: 5;\n}\n.jtk-connector.jtk-hover {\n\tz-index: 6;\n}\n\n.jtk-endpoint.plus-endpoint {\n\tz-index: 6;\n}\n.jtk-endpoint.dot-output-endpoint {\n\tz-index: 7;\n\toverflow: auto;\n}\n\n.disabled-linethrough {\n\tz-index: 8;\n}\n\n.jtk-drag-active.dot-output-endpoint,\n.jtk-drag-active.rect-input-endpoint {\n\tz-index: 9;\n}\n.rect-input-endpoint > * {\n\tpointer-events: none;\n}\n\n.connection-actions {\n\tz-index: 100;\n}\n\n.node-options {\n\tz-index: 10;\n}\n\n.drop-add-node-label {\n\tz-index: 10;\n}\n\n.jtk-connector.success:not(.jtk-hover) {\n\tpath:not(.jtk-connector-outline) {\n\t\tstroke: var(--color-success-light);\n\t}\n\tpath[jtk-overlay-id='reverse-arrow'],\n\tpath[jtk-overlay-id='endpoint-arrow'],\n\tpath[jtk-overlay-id='midpoint-arrow'] {\n\t\tfill: var(--color-success-light);\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n:root {\n\t--endpoint-size-small: 14px;\n\t--endpoint-size-medium: 18px;\n\t--stalk-size: 40px;\n\t--stalk-switch-size: 60px;\n\t--stalk-success-size: 87px;\n\t--stalk-success-size-without-label: 40px;\n\t--stalk-long-size: 127px;\n\t--plus-endpoint-box-size: 24px;\n\t--plus-endpoint-box-size-small: 17px;\n}\n\n.plus-svg-circle {\n\tz-index: 111;\n\tcircle {\n\t\tstroke: var(--color-foreground-xdark);\n\t\tstroke-width: 2px;\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\n\t&:hover {\n\t\tcircle {\n\t\t\tstroke: var(--color-primary);\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t}\n}\n.plus-stalk {\n\twidth: calc(var(--stalk-size) + 2px);\n\tborder: 1px solid var(--color-foreground-dark);\n\tmargin-left: calc(var(--stalk-size) / 2);\n\tz-index: 3;\n\t&.ep-success {\n\t\tborder-color: var(--color-success-light);\n\n\t\t&:after {\n\t\t\tcontent: attr(data-label);\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 100%;\n\t\t\tmargin: auto;\n\t\t\tmargin-bottom: 2px;\n\t\t\ttext-align: center;\n\n\t\t\tline-height: 1.3em;\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tfont-weight: var(--font-weight-regular);\n\t\t\tcolor: var(--color-success);\n\t\t}\n\t}\n}\n.connection-run-items-label {\n\t// Disable points events so that the label does not block the connection\n\t// mouse over event.\n\tpointer-events: none;\n\tspan {\n\t\tborder-radius: 7px;\n\t\tbackground-color: hsla(\n\t\t\tvar(--color-canvas-background-h),\n\t\t\tvar(--color-canvas-background-s),\n\t\t\tvar(--color-canvas-background-l),\n\t\t\t0.85\n\t\t);\n\t\tline-height: 1.3em;\n\t\tpadding: 0px 3px;\n\t\twhite-space: nowrap;\n\t\tfont-size: var(--font-size-s);\n\t\tfont-weight: var(--font-weight-regular);\n\t\tcolor: var(--color-success);\n\t\tmargin-top: -15px;\n\n\t\t&.floating {\n\t\t\tposition: absolute;\n\t\t\ttop: -6px;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\t}\n}\n\n.connection-input-name-label {\n\tposition: relative;\n\n\tspan {\n\t\tposition: absolute;\n\t\ttop: -10px;\n\t\tleft: -60px;\n\t}\n}\n\n.plus-endpoint {\n\tcursor: pointer;\n\tz-index: 10;\n\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size) / 2) - 1px);\n\tg {\n\t\tfill: var(--color-background-xlight);\n\t\tpointer-events: none;\n\t}\n\n\t&:hover {\n\t\tpath {\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--color-primary);\n\t\t}\n\t}\n\tpath {\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\trect {\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.error {\n\t\tpath {\n\t\t\tfill: var(--node-error-output-color);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--node-error-output-color);\n\t\t}\n\t}\n\n\t&.small {\n\t\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size-small) / 2));\n\t\tg {\n\t\t\ttransform: scale(0.75);\n\t\t\ttransform-origin: center;\n\t\t}\n\t\trect {\n\t\t\tstroke-width: 2.5;\n\t\t}\n\t}\n\t&:hover .plus-container {\n\t\tcolor: var(--color-primary);\n\t\tborder: 2px solid var(--color-primary);\n\t}\n\t&:hover .drop-hover-message {\n\t\tdisplay: block;\n\t}\n\n\t&.hidden {\n\t\tdisplay: none;\n\t}\n}\n\n.diamond-output-endpoint {\n\t--diamond-output-endpoint--transition-duration: 0.15s;\n\n\ttransition: transform var(--diamond-output-endpoint--transition-duration) ease;\n\ttransform: rotate(45deg);\n\tz-index: 10;\n}\n\n.add-input-endpoint {\n\t--add-input-endpoint--transition-duration: 0.15s;\n\n\t&:not(.jtk-endpoint-connected) {\n\t\tcursor: pointer;\n\t}\n\n\t&.add-input-endpoint-multiple {\n\t\tz-index: 100;\n\t\tcursor: pointer;\n\t}\n\n\t&.jtk-endpoint-connected {\n\t\tz-index: 10;\n\t}\n\n\t&.add-input-endpoint-error {\n\t\t--endpoint-svg-color: var(--color-danger);\n\t}\n\n\t.add-input-endpoint-default {\n\t\ttransition: transform var(--add-input-endpoint--transition-duration) ease;\n\t}\n\n\t.add-input-endpoint-diamond {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-line {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xlight);\n\t\tstroke: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-icon {\n\t\tstroke: none;\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-connected-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xdark);\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.rect-input-endpoint-hover {\n\t\t.add-input-endpoint-plus-rectangle {\n\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t}\n\n\t\t.add-input-endpoint-plus-icon {\n\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t}\n\t}\n\n\t&.jtk-endpoint-connected:not(.add-input-endpoint-multiple) {\n\t\t.add-input-endpoint-unconnected {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&.rect-input-endpoint-hover {\n\t\t\t.add-input-endpoint-connected-rectangle {\n\t\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t\t}\n\t\t}\n\t}\n}\n\n.node-input-endpoint-label,\n.node-output-endpoint-label {\n\t--node-endpoint-label--transition-duration: 0.15s;\n\n\tbackground-color: hsla(\n\t\tvar(--color-canvas-background-h),\n\t\tvar(--color-canvas-background-s),\n\t\tvar(--color-canvas-background-l),\n\t\t0.85\n\t);\n\tborder-radius: 7px;\n\tfont-size: 0.7em;\n\tpadding: 2px;\n\twhite-space: nowrap;\n\ttransition: color var(--node-endpoint-label--transition-duration) ease;\n\n\t@each $node-type in $supplemental-node-types {\n\t\t&.node-connection-type-#{$node-type} {\n\t\t\tcolor: var(--node-type-supplemental-label-color);\n\t\t}\n\t}\n}\n\n.node-output-endpoint-label.node-connection-category-error {\n\tcolor: var(--node-error-output-color);\n}\n\n.node-output-endpoint-label {\n\tmargin-left: calc(var(--endpoint-size-small) + var(--spacing-2xs));\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-l) * -1);\n\t\tmargin-left: 0;\n\t}\n\n\t// Some nodes allow for dynamic connection labels\n\t// so we need to make sure the label does not overflow\n\t&.node-connection-type-main[data-endpoint-label-length='medium'] {\n\t\tmax-width: calc(var(--stalk-size) - (var(--endpoint-size-small)));\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\tmargin-left: calc(var(--endpoint-size-small) + var(--spacing-2xs) + 10px);\n\t}\n}\n\n.node-input-endpoint-label {\n\ttext-align: right;\n\tmargin-left: -25px;\n\n\t&--moved {\n\t\tmargin-left: -40px;\n\t}\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-5xs) * -1);\n\t\tmargin-left: 0;\n\t}\n}\n\n.hover-message.jtk-overlay {\n\t--hover-message-width: 110px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-2xs);\n\tline-height: var(--font-line-height-regular);\n\tcolor: var(--color-text-light);\n\twidth: var(--hover-message-width);\n\tmargin-left: calc(\n\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size) +\n\t\t\tvar(--spacing-2xs)\n\t);\n\topacity: 0;\n\tpointer-events: none;\n\t&.small {\n\t\tmargin-left: calc(\n\t\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size-small) +\n\t\t\t\tvar(--spacing-2xs)\n\t\t);\n\t}\n\t&.visible {\n\t\tpointer-events: all;\n\t\topacity: 1;\n\t}\n}\n\n.long-stalk {\n\t--stalk-size: var(--stalk-long-size);\n}\n.ep-success {\n\t--stalk-size: var(--stalk-success-size);\n}\n.ep-success--without-label {\n\t--stalk-size: var(--stalk-success-size-without-label);\n}\n\n[data-endpoint-label-length='medium'] {\n\t--stalk-size: var(--stalk-switch-size);\n}\n</style>\n","<template>\n\t<div\n\t\tclass=\"sticky-wrapper\"\n\t\t:id=\"nodeId\"\n\t\t:ref=\"data.name\"\n\t\t:style=\"stickyPosition\"\n\t\t:data-name=\"data.name\"\n\t\tdata-test-id=\"sticky\"\n\t>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'sticky-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': isTouchDevice,\n\t\t\t\t'is-read-only': isReadOnly,\n\t\t\t}\"\n\t\t\t:style=\"stickySize\"\n\t\t>\n\t\t\t<div class=\"select-sticky-background\" v-show=\"isSelected\" />\n\t\t\t<div\n\t\t\t\tclass=\"sticky-box\"\n\t\t\t\t@click.left=\"mouseLeftClick\"\n\t\t\t\t@contextmenu=\"onContextMenu\"\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t>\n\t\t\t\t<n8n-sticky\n\t\t\t\t\t:modelValue=\"node.parameters.content\"\n\t\t\t\t\t:height=\"node.parameters.height\"\n\t\t\t\t\t:width=\"node.parameters.width\"\n\t\t\t\t\t:scale=\"nodeViewScale\"\n\t\t\t\t\t:backgroundColor=\"node.parameters.color\"\n\t\t\t\t\t:id=\"node.id\"\n\t\t\t\t\t:readOnly=\"isReadOnly\"\n\t\t\t\t\t:defaultText=\"defaultText\"\n\t\t\t\t\t:editMode=\"isActive && !isReadOnly\"\n\t\t\t\t\t:gridSize=\"gridSize\"\n\t\t\t\t\t@edit=\"onEdit\"\n\t\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t\t@resize=\"onResize\"\n\t\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t\t\t@markdown-click=\"onMarkdownClick\"\n\t\t\t\t\t@update:modelValue=\"onInputChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-show=\"showActions\"\n\t\t\t\t:class=\"{ 'sticky-options': true, 'no-select-on-click': true, 'force-show': forceActions }\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-touch:tap=\"deleteNode\"\n\t\t\t\t\tclass=\"option\"\n\t\t\t\t\tdata-test-id=\"delete-sticky\"\n\t\t\t\t\t:title=\"$locale.baseText('node.deleteNode')\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"trash\" />\n\t\t\t\t</div>\n\t\t\t\t<n8n-popover\n\t\t\t\t\teffect=\"dark\"\n\t\t\t\t\t:popper-style=\"{ width: '208px' }\"\n\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t@show=\"onShowPopover\"\n\t\t\t\t\t@hide=\"onHidePopover\"\n\t\t\t\t>\n\t\t\t\t\t<template #reference>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref=\"colorPopoverTrigger\"\n\t\t\t\t\t\t\tclass=\"option\"\n\t\t\t\t\t\t\tdata-test-id=\"change-sticky-color\"\n\t\t\t\t\t\t\t:title=\"$locale.baseText('node.changeColor')\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<font-awesome-icon icon=\"palette\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<div class=\"content\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"color\"\n\t\t\t\t\t\t\tdata-test-id=\"color\"\n\t\t\t\t\t\t\tv-for=\"(_, index) in Array.from({ length: 7 })\"\n\t\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\t\tv-on:click=\"changeColor(index + 1)\"\n\t\t\t\t\t\t\t:class=\"`sticky-color-${index + 1}`\"\n\t\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\t\t'border-width': '1px',\n\t\t\t\t\t\t\t\t'border-style': 'solid',\n\t\t\t\t\t\t\t\t'border-color': 'var(--color-foreground-xdark)',\n\t\t\t\t\t\t\t\t'background-color': `var(--color-sticky-background-${index + 1})`,\n\t\t\t\t\t\t\t\t'box-shadow':\n\t\t\t\t\t\t\t\t\t(index === 0 && node?.parameters.color === '') ||\n\t\t\t\t\t\t\t\t\tindex + 1 === node?.parameters.color\n\t\t\t\t\t\t\t\t\t\t? `0 0 0 1px var(--color-sticky-background-${index + 1})`\n\t\t\t\t\t\t\t\t\t\t: 'none',\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-popover>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport { nodeBase } from '@/mixins/nodeBase';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport { isNumber, isString } from '@/utils/typeGuards';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tXYPosition,\n} from '@/Interface';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { QUICKSTART_NOTE_NAME } from '@/constants';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useContextMenu } from '@/composables/useContextMenu';\n\nexport default defineComponent({\n\tname: 'Sticky',\n\tmixins: [nodeBase, workflowHelpers],\n\tsetup() {\n\t\tconst colorPopoverTrigger = ref<HTMLDivElement>();\n\t\tconst forceActions = ref(false);\n\t\tconst setForceActions = (value: boolean) => {\n\t\t\tforceActions.value = value;\n\t\t};\n\t\tconst contextMenu = useContextMenu((action) => {\n\t\t\tif (action === 'change_color') {\n\t\t\t\tsetForceActions(true);\n\t\t\t\tcolorPopoverTrigger.value?.click();\n\t\t\t}\n\t\t});\n\n\t\treturn { colorPopoverTrigger, contextMenu, forceActions, setForceActions };\n\t},\n\tprops: {\n\t\tnodeViewScale: {\n\t\t\ttype: Number,\n\t\t},\n\t\tgridSize: {\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tdefaultText(): string {\n\t\t\tif (!this.nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconst properties = this.nodeType.properties;\n\t\t\tconst content = properties.find((property) => property.name === 'content');\n\n\t\t\treturn content && isString(content.default) ? content.default : '';\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.node.position;\n\t\t\t} else {\n\t\t\t\treturn [0, 0];\n\t\t\t}\n\t\t},\n\t\theight(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.height) ? this.node.parameters.height : 0;\n\t\t},\n\t\twidth(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.width) ? this.node.parameters.width : 0;\n\t\t},\n\t\tstickySize(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\theight: this.height + 'px',\n\t\t\t\twidth: this.width + 'px',\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tstickyPosition(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t\tzIndex: this.isActive ? 9999999 : -1 * Math.floor((this.height * this.width) / 1000),\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tshowActions(): boolean {\n\t\t\treturn (\n\t\t\t\t!(this.hideActions || this.isReadOnly || this.workflowRunning || this.isResizing) ||\n\t\t\t\tthis.forceActions\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisResizing: false,\n\t\t\tisTouchActive: false,\n\t\t};\n\t},\n\tmethods: {\n\t\tonShowPopover() {\n\t\t\tthis.setForceActions(true);\n\t\t},\n\t\tonHidePopover() {\n\t\t\tthis.setForceActions(false);\n\t\t},\n\t\tasync deleteNode() {\n\t\t\t// Wait a tick else vue causes problems because the data is gone\n\t\t\tawait this.$nextTick();\n\t\t\tthis.$emit('removeNode', this.data.name);\n\t\t},\n\t\tchangeColor(index: number) {\n\t\t\tthis.workflowsStore.updateNodeProperties({\n\t\t\t\tname: this.name,\n\t\t\t\tproperties: { parameters: { ...this.node.parameters, color: index } },\n\t\t\t});\n\t\t},\n\t\tonEdit(edit: boolean) {\n\t\t\tif (edit && !this.isActive && this.node) {\n\t\t\t\tthis.ndvStore.activeNodeName = this.node.name;\n\t\t\t} else if (this.isActive && !edit) {\n\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t}\n\t\t},\n\t\tonMarkdownClick(link: HTMLAnchorElement, event: Event) {\n\t\t\tif (link) {\n\t\t\t\tconst isOnboardingNote = this.name === QUICKSTART_NOTE_NAME;\n\t\t\t\tconst isWelcomeVideo = link.querySelector('img[alt=\"n8n quickstart video\"');\n\t\t\t\tconst type =\n\t\t\t\t\tisOnboardingNote && isWelcomeVideo\n\t\t\t\t\t\t? 'welcome_video'\n\t\t\t\t\t\t: isOnboardingNote && link.getAttribute('href') === '/templates'\n\t\t\t\t\t\t ? 'templates'\n\t\t\t\t\t\t : 'other';\n\n\t\t\t\tthis.$telemetry.track('User clicked note link', { type });\n\t\t\t}\n\t\t},\n\t\tonInputChange(content: string) {\n\t\t\tthis.node.parameters.content = content;\n\t\t\tthis.setParameters({ content });\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.isResizing = true;\n\t\t\tif (!this.isSelected && this.node) {\n\t\t\t\tthis.$emit('nodeSelected', this.node.name, false, true);\n\t\t\t}\n\t\t},\n\t\tonResize({ height, width, dX, dY }: { width: number; height: number; dX: number; dY: number }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (dX !== 0 || dY !== 0) {\n\t\t\t\tthis.setPosition([this.node.position[0] + (dX || 0), this.node.position[1] + (dY || 0)]);\n\t\t\t}\n\n\t\t\tthis.setParameters({ height, width });\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.isResizing = false;\n\t\t},\n\t\tsetParameters(params: { content?: string; height?: number; width?: number; color?: string }) {\n\t\t\tif (this.node) {\n\t\t\t\tconst nodeParameters = {\n\t\t\t\t\tcontent: isString(params.content) ? params.content : this.node.parameters.content,\n\t\t\t\t\theight: isNumber(params.height) ? params.height : this.node.parameters.height,\n\t\t\t\t\twidth: isNumber(params.width) ? params.width : this.node.parameters.width,\n\t\t\t\t\tcolor: isString(params.color) ? params.color : this.node.parameters.color,\n\t\t\t\t};\n\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tkey: this.node.id,\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetPosition(position: XYPosition) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\tname: this.node.name,\n\t\t\t\tproperties: {\n\t\t\t\t\tposition,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.isTouchDevice === true && !this.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\tonContextMenu(e: MouseEvent): void {\n\t\t\tif (this.node) {\n\t\t\t\tthis.contextMenu.open(e, { source: 'node-right-click', node: this.node });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.sticky-wrapper {\n\tposition: absolute;\n\n\t.sticky-default {\n\t\t.sticky-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\n\t\t&.touch-active,\n\t\t&:hover {\n\t\t\t.sticky-options {\n\t\t\t\tdisplay: flex;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\n\t\t&.is-read-only {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.sticky-options {\n\t\t\tdisplay: none;\n\t\t\tjustify-content: flex-start;\n\t\t\tposition: absolute;\n\t\t\ttop: -25px;\n\t\t\tleft: -8px;\n\t\t\theight: 26px;\n\t\t\tfont-size: 0.9em;\n\t\t\ttext-align: left;\n\t\t\tz-index: 10;\n\t\t\tcolor: #aaa;\n\t\t\ttext-align: center;\n\n\t\t\t.option {\n\t\t\t\twidth: 28px;\n\t\t\t\tdisplay: inline-block;\n\n\t\t\t\t&.touch {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: $color-primary;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.force-show {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t&.is-touch-device .sticky-options {\n\t\t\tleft: -25px;\n\t\t\twidth: 150px;\n\n\t\t\t.option.touch {\n\t\t\t\tdisplay: initial;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.select-sticky-background {\n\tdisplay: block;\n\tposition: absolute;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\theight: calc(100% + 16px);\n\twidth: calc(100% + 16px);\n\tleft: -8px;\n\ttop: -8px;\n\tz-index: 0;\n}\n\n.content {\n\tdisplay: flex;\n\tflex-direction: row;\n\twidth: fit-content;\n\tgap: var(--spacing-2xs);\n}\n\n.color {\n\twidth: 20px;\n\theight: 20px;\n\tborder-radius: 50%;\n\tborder-color: var(--color-primary-shade-1);\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n}\n</style>\n","/*\n\tConstants and utility functions used for searching for node types in node creator component\n*/\n\n// based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 30; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -5;\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty\n\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\toutScore += penalty;\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: Readonly<T[]>,\n\tkeys: Array<{ key: string; weight: number }>,\n): Array<{ score: number; item: T }> {\n\tconst results = data.reduce((accu: Array<{ score: number; item: T }>, item: T) => {\n\t\tlet values: Array<{ value: string; weight: number }> = [];\n\t\tkeys.forEach(({ key, weight }) => {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tvalues = values.concat(value.map((v) => ({ value: v, weight })));\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tvalues.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tweight,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// for each item, check every key and get maximum score\n\t\tconst itemMatch = values.reduce(\n\t\t\t(\n\t\t\t\taccu: null | { matched: boolean; outScore: number },\n\t\t\t\t{ value, weight }: { value: string; weight: number },\n\t\t\t) => {\n\t\t\t\tif (!fuzzyMatchSimple(filter, value)) {\n\t\t\t\t\treturn accu;\n\t\t\t\t}\n\n\t\t\t\tconst match = fuzzyMatch(filter, value);\n\t\t\t\tmatch.outScore *= weight;\n\n\t\t\t\tconst { matched, outScore } = match;\n\t\t\t\tif (!accu && matched) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tif (matched && accu && outScore > accu.outScore) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\treturn accu;\n\t\t\t},\n\t\t\tnull,\n\t\t);\n\n\t\tif (itemMatch) {\n\t\t\taccu.push({\n\t\t\t\tscore: itemMatch.outScore,\n\t\t\t\titem,\n\t\t\t});\n\t\t}\n\n\t\treturn accu;\n\t}, []);\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n","import type {\n\tNodeCreateElement,\n\tActionCreateElement,\n\tSubcategorizedNodeTypes,\n\tSimplifiedNodeType,\n\tINodeCreateElement,\n\tSectionCreateElement,\n} from '@/Interface';\nimport { AI_SUBCATEGORY, CORE_NODES_CATEGORY, DEFAULT_SUBCATEGORY } from '@/constants';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { sublimeSearch } from '@/utils/sortUtils';\nimport { i18n } from '@/plugins/i18n';\nimport type { NodeViewItemSection } from './viewsData';\n\nexport function transformNodeType(\n\tnode: SimplifiedNodeType,\n\tsubcategory?: string,\n\ttype: 'node' | 'action' = 'node',\n): NodeCreateElement | ActionCreateElement {\n\tconst createElement = {\n\t\tuuid: uuidv4(),\n\t\tkey: node.name,\n\t\tsubcategory:\n\t\t\tsubcategory ?? node.codex?.subcategories?.[CORE_NODES_CATEGORY]?.[0] ?? DEFAULT_SUBCATEGORY,\n\t\tproperties: {\n\t\t\t...node,\n\t\t},\n\t\ttype,\n\t};\n\n\treturn type === 'action'\n\t\t? (createElement as ActionCreateElement)\n\t\t: (createElement as NodeCreateElement);\n}\n\nexport function subcategorizeItems(items: SimplifiedNodeType[]) {\n\tconst WHITE_LISTED_SUBCATEGORIES = [CORE_NODES_CATEGORY, AI_SUBCATEGORY];\n\treturn items.reduce((acc: SubcategorizedNodeTypes, item) => {\n\t\t// Only some subcategories are allowed\n\t\tlet subcategories: string[] = [DEFAULT_SUBCATEGORY];\n\n\t\tWHITE_LISTED_SUBCATEGORIES.forEach((category) => {\n\t\t\tif (item.codex?.categories?.includes(category)) {\n\t\t\t\tsubcategories = item.codex?.subcategories?.[category] ?? [];\n\t\t\t}\n\t\t});\n\n\t\tsubcategories.forEach((subcategory: string) => {\n\t\t\tif (!acc[subcategory]) {\n\t\t\t\tacc[subcategory] = [];\n\t\t\t}\n\t\t\tacc[subcategory].push(transformNodeType(item, subcategory));\n\t\t});\n\n\t\treturn acc;\n\t}, {});\n}\n\nexport function sortNodeCreateElements(nodes: INodeCreateElement[]) {\n\treturn nodes.sort((a, b) => {\n\t\tif (a.type !== 'node' || b.type !== 'node') return 0;\n\t\tconst displayNameA = a.properties?.displayName?.toLowerCase() || a.key;\n\t\tconst displayNameB = b.properties?.displayName?.toLowerCase() || b.key;\n\n\t\treturn displayNameA.localeCompare(displayNameB, undefined, { sensitivity: 'base' });\n\t});\n}\n\nexport function searchNodes(searchFilter: string, items: INodeCreateElement[]) {\n\t// In order to support the old search we need to remove the 'trigger' part\n\tconst trimmedFilter = searchFilter.toLowerCase().replace('trigger', '').trimEnd();\n\tconst result = (\n\t\tsublimeSearch<INodeCreateElement>(trimmedFilter, items, [\n\t\t\t{ key: 'properties.displayName', weight: 1.3 },\n\t\t\t{ key: 'properties.codex.alias', weight: 1 },\n\t\t]) || []\n\t).map(({ item }) => item);\n\n\treturn result;\n}\n\nexport function flattenCreateElements(items: INodeCreateElement[]): INodeCreateElement[] {\n\treturn items.map((item) => (item.type === 'section' ? item.children : item)).flat();\n}\n\nexport function groupItemsInSections(\n\titems: INodeCreateElement[],\n\tsections: NodeViewItemSection[],\n): INodeCreateElement[] {\n\tconst itemsBySection = items.reduce((acc: Record<string, INodeCreateElement[]>, item) => {\n\t\tconst section = sections.find((s) => s.items.includes(item.key));\n\t\tconst key = section?.key ?? 'other';\n\t\tacc[key] = [...(acc[key] ?? []), item];\n\t\treturn acc;\n\t}, {});\n\n\tconst result: SectionCreateElement[] = sections\n\t\t.map(\n\t\t\t(section): SectionCreateElement => ({\n\t\t\t\ttype: 'section',\n\t\t\t\tkey: section.key,\n\t\t\t\ttitle: section.title,\n\t\t\t\tchildren: sortNodeCreateElements(itemsBySection[section.key] ?? []),\n\t\t\t}),\n\t\t)\n\t\t.concat({\n\t\t\ttype: 'section',\n\t\t\tkey: 'other',\n\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.other'),\n\t\t\tchildren: sortNodeCreateElements(itemsBySection.other ?? []),\n\t\t})\n\t\t.filter((section) => section.children.length > 0);\n\n\tif (result.length <= 1) {\n\t\treturn items;\n\t}\n\n\treturn result;\n}\n","import { defineStore } from 'pinia';\nimport { STORES, TRIGGER_NODE_CREATOR_VIEW } from '@/constants';\nimport type {\n\tNodeFilterType,\n\tNodeCreatorOpenSource,\n\tSimplifiedNodeType,\n\tActionsRecord,\n} from '@/Interface';\n\nimport { computed, ref } from 'vue';\nimport { transformNodeType } from '@/components/Node/NodeCreator/utils';\n\nexport const useNodeCreatorStore = defineStore(STORES.NODE_CREATOR, () => {\n\tconst selectedView = ref<NodeFilterType>(TRIGGER_NODE_CREATOR_VIEW);\n\tconst mergedNodes = ref<SimplifiedNodeType[]>([]);\n\tconst actions = ref<ActionsRecord<typeof mergedNodes.value>>({});\n\n\tconst showScrim = ref(false);\n\tconst openSource = ref<NodeCreatorOpenSource>('');\n\n\tconst allNodeCreatorNodes = computed(() =>\n\t\tObject.values(mergedNodes.value).map((i) => transformNodeType(i)),\n\t);\n\n\tfunction setMergeNodes(nodes: SimplifiedNodeType[]) {\n\t\tmergedNodes.value = nodes;\n\t}\n\n\tfunction setActions(nodes: ActionsRecord<typeof mergedNodes.value>) {\n\t\tactions.value = nodes;\n\t}\n\n\tfunction setShowScrim(isVisible: boolean) {\n\t\tshowScrim.value = isVisible;\n\t}\n\n\tfunction setSelectedView(view: NodeFilterType) {\n\t\tselectedView.value = view;\n\t}\n\n\tfunction setOpenSource(view: NodeCreatorOpenSource) {\n\t\topenSource.value = view;\n\t}\n\n\treturn {\n\t\topenSource,\n\t\tselectedView,\n\t\tshowScrim,\n\t\tmergedNodes,\n\t\tactions,\n\t\tsetShowScrim,\n\t\tsetSelectedView,\n\t\tsetOpenSource,\n\t\tsetActions,\n\t\tsetMergeNodes,\n\t\tallNodeCreatorNodes,\n\t};\n});\n","<template>\n\t<div\n\t\t:class=\"$style.canvasAddButton\"\n\t\t:style=\"containerCssVars\"\n\t\tref=\"container\"\n\t\tdata-test-id=\"canvas-add-button\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"top\"\n\t\t\t:visible=\"showTooltip\"\n\t\t\t:disabled=\"nodeCreatorStore.showScrim\"\n\t\t\t:popper-class=\"$style.tooltip\"\n\t\t\t:show-after=\"700\"\n\t\t>\n\t\t\t<button :class=\"$style.button\" @click=\"$emit('click')\" data-test-id=\"canvas-plus-button\">\n\t\t\t\t<font-awesome-icon icon=\"plus\" size=\"lg\" />\n\t\t\t</button>\n\t\t\t<template #content>\n\t\t\t\t{{ $locale.baseText('nodeView.canvasAddButton.addATriggerNodeBeforeExecuting') }}\n\t\t\t</template>\n\t\t</n8n-tooltip>\n\t\t<p :class=\"$style.label\" v-text=\"$locale.baseText('nodeView.canvasAddButton.addFirstStep')\" />\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { XYPosition } from '@/Interface';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nexport interface Props {\n\tshowTooltip: boolean;\n\tposition: XYPosition;\n}\n\nconst props = defineProps<Props>();\n\nconst nodeCreatorStore = useNodeCreatorStore();\nconst containerCssVars = computed(() => ({\n\t'--trigger-placeholder-left-position': `${props.position[0]}px`,\n\t'--trigger-placeholder-top-position': `${props.position[1]}px`,\n}));\n</script>\n\n<style lang=\"scss\" module>\n.canvasAddButton {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 100px;\n\theight: 100px;\n\tposition: absolute;\n\ttop: var(--trigger-placeholder-top-position);\n\tleft: var(--trigger-placeholder-left-position);\n\t// We have to increase z-index to make sure it's higher than selecting box in NodeView\n\t// otherwise the clics wouldn't register\n\tz-index: 101;\n\n\t&:hover .button svg path {\n\t\tfill: var(--color-primary);\n\t}\n}\n\n.button {\n\tbackground: var(--color-foreground-xlight);\n\tborder: 2px dashed var(--color-foreground-xdark);\n\tborder-radius: 8px;\n\tpadding: 0;\n\n\tmin-width: 100px;\n\tmin-height: 100px;\n\tcursor: pointer;\n\n\tsvg {\n\t\twidth: 26px !important;\n\t\theight: 40px;\n\t\tpath {\n\t\t\tfill: var(--color-foreground-xdark);\n\t\t}\n\t}\n}\n\n.label {\n\twidth: max-content;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-xloose);\n\tcolor: var(--color-text-dark);\n\tmargin-top: var(--spacing-2xs);\n}\n</style>\n","import {\n\tCORE_NODES_CATEGORY,\n\tWEBHOOK_NODE_TYPE,\n\tOTHER_TRIGGER_NODES_SUBCATEGORY,\n\tEXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSCHEDULE_TRIGGER_NODE_TYPE,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tTRANSFORM_DATA_SUBCATEGORY,\n\tFILES_SUBCATEGORY,\n\tFLOWS_CONTROL_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEMAIL_IMAP_NODE_TYPE,\n\tDEFAULT_SUBCATEGORY,\n\tAI_NODE_CREATOR_VIEW,\n\tAI_CATEGORY_AGENTS,\n\tAI_CATEGORY_CHAINS,\n\tAI_CATEGORY_DOCUMENT_LOADERS,\n\tAI_CATEGORY_LANGUAGE_MODELS,\n\tAI_CATEGORY_MEMORY,\n\tAI_CATEGORY_OUTPUTPARSER,\n\tAI_CATEGORY_RETRIEVERS,\n\tAI_CATEGORY_TEXT_SPLITTERS,\n\tAI_CATEGORY_TOOLS,\n\tAI_CATEGORY_VECTOR_STORES,\n\tAI_SUBCATEGORY,\n\tAI_CATEGORY_EMBEDDING,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tAI_UNCATEGORIZED_CATEGORY,\n\tSET_NODE_TYPE,\n\tCODE_NODE_TYPE,\n\tDATETIME_NODE_TYPE,\n\tFILTER_NODE_TYPE,\n\tREMOVE_DUPLICATES_NODE_TYPE,\n\tSPLIT_OUT_NODE_TYPE,\n\tLIMIT_NODE_TYPE,\n\tSUMMARIZE_NODE_TYPE,\n\tAGGREGATE_NODE_TYPE,\n\tMERGE_NODE_TYPE,\n\tHTML_NODE_TYPE,\n\tMARKDOWN_NODE_TYPE,\n\tXML_NODE_TYPE,\n\tCRYPTO_NODE_TYPE,\n\tIF_NODE_TYPE,\n\tSPLIT_IN_BATCHES_NODE_TYPE,\n\tHTTP_REQUEST_NODE_TYPE,\n\tHELPERS_SUBCATEGORY,\n\tRSS_READ_NODE_TYPE,\n\tEMAIL_SEND_NODE_TYPE,\n} from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { SimplifiedNodeType } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\n\nexport interface NodeViewItemSection {\n\tkey: string;\n\ttitle: string;\n\titems: string[];\n}\n\nexport interface NodeViewItem {\n\tkey: string;\n\ttype: string;\n\tproperties: {\n\t\tname?: string;\n\t\ttitle: string;\n\t\ticon: string;\n\t\ticonProps?: {\n\t\t\tcolor?: string;\n\t\t};\n\t\tconnectionType?: NodeConnectionType;\n\t\tpanelClass?: string;\n\t\tgroup?: string[];\n\t\tsections?: NodeViewItemSection[];\n\t\tdescription?: string;\n\t\ttag?: string;\n\t\tforceIncludeNodes?: string[];\n\t};\n\tcategory?: string | string[];\n}\n\ninterface NodeView {\n\tvalue: string;\n\ttitle: string;\n\tinfo?: string;\n\tsubtitle?: string;\n\titems: NodeViewItem[];\n}\n\nfunction getAiNodesBySubcategory(nodes: INodeTypeDescription[], subcategory: string) {\n\treturn nodes\n\t\t.filter((node) => node.codex?.subcategories?.[AI_SUBCATEGORY]?.includes(subcategory))\n\t\t.map((node) => ({\n\t\t\tkey: node.name,\n\t\t\ttype: 'node',\n\t\t\tproperties: {\n\t\t\t\tgroup: [],\n\t\t\t\tname: node.name,\n\t\t\t\tdisplayName: node.displayName,\n\t\t\t\ttitle: node.displayName,\n\t\t\t\tdescription: node.description,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\ticon: node.icon!,\n\t\t\t},\n\t\t}))\n\t\t.sort((a, b) => a.properties.displayName.localeCompare(b.properties.displayName));\n}\n\nexport function AIView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\tconst nodeTypesStore = useNodeTypesStore();\n\n\tconst chainNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_CHAINS);\n\tconst agentNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_AGENTS);\n\n\treturn {\n\t\tvalue: AI_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\tinfo: i18n.baseText('nodeCreator.aiPanel.infoBox'),\n\t\titems: [\n\t\t\t...chainNodes,\n\t\t\t...agentNodes,\n\t\t\t{\n\t\t\t\tkey: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\t\ttype: 'view',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.aiOtherNodesDescription'),\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\nexport function AINodesView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\n\tfunction getAISubcategoryProperties(nodeConnectionType: NodeConnectionType) {\n\t\treturn {\n\t\t\tconnectionType: nodeConnectionType,\n\t\t\ticonProps: {\n\t\t\t\tcolor: `var(--node-type-${nodeConnectionType}-color)`,\n\t\t\t},\n\t\t\tpanelClass: `nodes-list-panel-${nodeConnectionType}`,\n\t\t};\n\t}\n\n\treturn {\n\t\tvalue: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\t\ticon: 'file-import',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiDocument),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\t\ticon: 'language',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiLanguageModel),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_MEMORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_MEMORY,\n\t\t\t\t\ticon: 'brain',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiMemory),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\t\ticon: 'list',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiOutputParser),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_RETRIEVERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_RETRIEVERS,\n\t\t\t\t\ticon: 'search',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiRetriever),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\t\ticon: 'grip-lines-vertical',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTextSplitter),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TOOLS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TOOLS,\n\t\t\t\t\ticon: 'tools',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTool),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_EMBEDDING,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_EMBEDDING,\n\t\t\t\t\ticon: 'vector-square',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiEmbedding),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\t\ticon: 'project-diagram',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiVectorStore),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\t\ticon: 'code',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\n\nexport function TriggerView(nodes: SimplifiedNodeType[]) {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATrigger'),\n\t\tsubtitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATriggerDescription'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\tforceIncludeNodes: [WEBHOOK_NODE_TYPE, EMAIL_IMAP_NODE_TYPE],\n\t\t\t\t\ttitle: 'App Trigger Nodes',\n\t\t\t\t\ticon: 'satellite-dish',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDescription'),\n\t\t\t\t\ticon: 'fa:clock',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: WEBHOOK_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: WEBHOOK_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'webhook',\n\t\t\t\t\t\tfileBuffer: '/static/webhook-icon.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'form',\n\t\t\t\t\t\tfileBuffer: '/static/form-grey.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDescription'),\n\t\t\t\t\ticon: 'fa:mouse-pointer',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDescription'),\n\t\t\t\t\ticon: 'fa:sign-out-alt',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\t\ticon: 'folder-open',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n\n\treturn view;\n}\n\nexport function RegularView(nodes: SimplifiedNodeType[]) {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: REGULAR_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.whatHappensNext'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: 'App Regular Nodes',\n\t\t\t\t\ticon: 'globe',\n\t\t\t\t\tforceIncludeNodes: [RSS_READ_NODE_TYPE, EMAIL_SEND_NODE_TYPE],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\t\ticon: 'pen',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [SET_NODE_TYPE, CODE_NODE_TYPE, DATETIME_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'addOrRemove',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.addOrRemove'),\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\tFILTER_NODE_TYPE,\n\t\t\t\t\t\t\t\tREMOVE_DUPLICATES_NODE_TYPE,\n\t\t\t\t\t\t\t\tSPLIT_OUT_NODE_TYPE,\n\t\t\t\t\t\t\t\tLIMIT_NODE_TYPE,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'combine',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.combine'),\n\t\t\t\t\t\t\titems: [SUMMARIZE_NODE_TYPE, AGGREGATE_NODE_TYPE, MERGE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'convert',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.convert'),\n\t\t\t\t\t\t\titems: [HTML_NODE_TYPE, MARKDOWN_NODE_TYPE, XML_NODE_TYPE, CRYPTO_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\t\ticon: 'code-branch',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [FILTER_NODE_TYPE, IF_NODE_TYPE, SPLIT_IN_BATCHES_NODE_TYPE, MERGE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FILES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FILES_SUBCATEGORY,\n\t\t\t\t\ticon: 'file-alt',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: HELPERS_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: HELPERS_SUBCATEGORY,\n\t\t\t\t\ticon: 'toolbox',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [HTTP_REQUEST_NODE_TYPE, WEBHOOK_NODE_TYPE, CODE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n\n\tconst hasAINodes = (nodes ?? []).some((node) => node.codex?.categories?.includes(AI_SUBCATEGORY));\n\tif (hasAINodes)\n\t\tview.items.push({\n\t\t\tkey: AI_NODE_CREATOR_VIEW,\n\t\t\ttype: 'view',\n\t\t\tproperties: {\n\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.langchainAiNodes'),\n\t\t\t\ticon: 'robot',\n\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.nodesForAi'),\n\t\t\t\ttag: i18n.baseText('nodeCreator.aiPanel.newTag'),\n\t\t\t},\n\t\t});\n\n\tview.items.push({\n\t\tkey: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttype: 'view',\n\t\tproperties: {\n\t\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTrigger'),\n\t\t\ticon: 'bolt',\n\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTriggerDescription'),\n\t\t},\n\t});\n\n\treturn view;\n}\n","import { ref } from 'vue';\nimport { defineStore } from 'pinia';\n\nexport type KeyboardKey = (typeof WATCHED_KEYS)[number];\ninterface KeyHook {\n\tkeyboardKeys: KeyboardKey[];\n\tcondition?: (type: string, activeItemId: string) => boolean;\n\thandler: (activeItemId: string, keyboardKey: KeyboardKey) => void;\n}\n\nexport const KEYBOARD_ID_ATTR = 'data-keyboard-nav-id';\nexport const WATCHED_KEYS = [\n\t'ArrowUp',\n\t'ArrowDown',\n\t'ArrowLeft',\n\t'ArrowRight',\n\t'Enter',\n\t'Escape',\n\t'Tab',\n];\n\nexport const useKeyboardNavigation = defineStore('nodeCreatorKeyboardNavigation', () => {\n\tconst selectableItems = ref<Array<WeakRef<Element>>>([]);\n\tconst activeItemId = ref<string | null>(null);\n\t// Array of objects that contains key code and handler\n\tconst keysHooks = ref<Record<string, KeyHook>>({});\n\n\tfunction getItemType(element?: Element) {\n\t\treturn element?.getAttribute('data-keyboard-nav-type');\n\t}\n\tfunction getElementId(element?: Element) {\n\t\treturn element?.getAttribute(KEYBOARD_ID_ATTR) || undefined;\n\t}\n\tasync function refreshSelectableItems(): Promise<void> {\n\t\treturn new Promise((resolve) => {\n\t\t\t// Wait for DOM to update\n\t\t\tcleanupSelectableItems();\n\t\t\tsetTimeout(() => {\n\t\t\t\tselectableItems.value = Array.from(\n\t\t\t\t\tdocument.querySelectorAll('[data-keyboard-nav-type]'),\n\t\t\t\t).map((el) => new WeakRef(el));\n\t\t\t\tresolve();\n\t\t\t}, 0);\n\t\t});\n\t}\n\n\tfunction executeKeyHooks(keyboardKey: KeyboardKey, activeItem: Element) {\n\t\tconst flatHooks = Object.values(keysHooks.value);\n\t\tconst hooks = flatHooks.filter((hook) => hook.keyboardKeys.includes(keyboardKey));\n\n\t\thooks.forEach((hook) => {\n\t\t\tif (!activeItemId.value) return;\n\n\t\t\tconst conditionPassed =\n\t\t\t\thook.condition === undefined ||\n\t\t\t\thook.condition(getItemType(activeItem) || '', activeItemId.value);\n\n\t\t\tif (conditionPassed && activeItemId.value) {\n\t\t\t\thook.handler(activeItemId.value, keyboardKey);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync function onKeyDown(e: KeyboardEvent) {\n\t\tconst pressedKey = e.key;\n\t\tif (!WATCHED_KEYS.includes(pressedKey)) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tawait refreshSelectableItems();\n\t\tconst activeItemIndex = selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t\tconst activeItem = selectableItems.value[activeItemIndex]?.deref();\n\n\t\tconst isArrowDown = pressedKey === 'ArrowDown';\n\t\tconst isArrowUp = pressedKey === 'ArrowUp';\n\n\t\tif (!activeItem) return;\n\n\t\tif (isArrowDown) {\n\t\t\tconst nextItemIndex =\n\t\t\t\tactiveItemIndex < selectableItems.value.length - 1 ? activeItemIndex + 1 : 0;\n\n\t\t\tsetActiveItem(selectableItems.value[nextItemIndex]?.deref());\n\t\t}\n\t\tif (isArrowUp) {\n\t\t\tconst previousIndex =\n\t\t\t\tactiveItemIndex > 0 ? activeItemIndex - 1 : selectableItems.value.length - 1;\n\n\t\t\tsetActiveItem(selectableItems.value[previousIndex]?.deref());\n\t\t}\n\t\texecuteKeyHooks(pressedKey, activeItem);\n\t}\n\n\tfunction setActiveItemId(id: string) {\n\t\tactiveItemId.value = id;\n\t}\n\n\tfunction setActiveItem(item?: Element) {\n\t\tconst itemId = getElementId(item);\n\t\tif (!itemId) return;\n\n\t\tsetActiveItemId(itemId);\n\t\tif (item?.scrollIntoView) {\n\t\t\titem?.scrollIntoView({ block: 'center' });\n\t\t}\n\t}\n\n\tasync function setActiveItemIndex(index: number) {\n\t\tawait refreshSelectableItems();\n\n\t\tsetActiveItem(selectableItems.value[index]?.deref());\n\t}\n\n\tfunction attachKeydownEvent() {\n\t\tdocument.addEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction detachKeydownEvent() {\n\t\tcleanupSelectableItems();\n\t\tdocument.removeEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction registerKeyHook(name: string, hook: KeyHook) {\n\t\thook.keyboardKeys.forEach((keyboardKey) => {\n\t\t\tif (WATCHED_KEYS.includes(keyboardKey)) {\n\t\t\t\tkeysHooks.value = { ...keysHooks.value, [name]: hook };\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Key ${keyboardKey} is not supported`);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction cleanupSelectableItems() {\n\t\t// Cleanup to make sure DOM elements get garbage collected\n\t\tselectableItems.value = [];\n\t}\n\n\tfunction getActiveItemIndex() {\n\t\treturn selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t}\n\n\treturn {\n\t\tactiveItemId,\n\t\tattachKeydownEvent,\n\t\trefreshSelectableItems,\n\t\tdetachKeydownEvent,\n\t\tregisterKeyHook,\n\t\tgetActiveItemIndex,\n\t\tsetActiveItemId,\n\t\tsetActiveItemIndex,\n\t};\n});\n","import type { INodeCreateElement, NodeFilterType, SimplifiedNodeType } from '@/Interface';\nimport {\n\tAI_CODE_NODE_TYPE,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tDEFAULT_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n} from '@/constants';\nimport { defineStore } from 'pinia';\nimport { v4 as uuid } from 'uuid';\nimport { computed, nextTick, ref } from 'vue';\n\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport {\n\tflattenCreateElements,\n\tgroupItemsInSections,\n\tsearchNodes,\n\tsortNodeCreateElements,\n\tsubcategorizeItems,\n\ttransformNodeType,\n} from '../utils';\n\nimport type { NodeViewItem, NodeViewItemSection } from '@/components/Node/NodeCreator/viewsData';\nimport { AINodesView } from '@/components/Node/NodeCreator/viewsData';\nimport { useI18n } from '@/composables/useI18n';\nimport { useKeyboardNavigation } from './useKeyboardNavigation';\n\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { INodeInputFilter, NodeConnectionType } from 'n8n-workflow';\n\ninterface ViewStack {\n\tuuid?: string;\n\ttitle?: string;\n\tsubtitle?: string;\n\tsearch?: string;\n\tsubcategory?: string;\n\tinfo?: string;\n\tnodeIcon?: {\n\t\ticonType?: string;\n\t\ticon?: string;\n\t\tcolor?: string;\n\t};\n\ticonUrl?: string;\n\trootView?: NodeFilterType;\n\tactiveIndex?: number;\n\ttransitionDirection?: 'in' | 'out';\n\thasSearch?: boolean;\n\tpreventBack?: boolean;\n\titems?: INodeCreateElement[];\n\tbaselineItems?: INodeCreateElement[];\n\tsearchItems?: SimplifiedNodeType[];\n\tforceIncludeNodes?: string[];\n\tmode?: 'actions' | 'nodes';\n\tbaseFilter?: (item: INodeCreateElement) => boolean;\n\titemsMapper?: (item: INodeCreateElement) => INodeCreateElement;\n\tpanelClass?: string;\n\tsections?: NodeViewItemSection[];\n}\n\nexport const useViewStacks = defineStore('nodeCreatorViewStacks', () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst { getActiveItemIndex } = useKeyboardNavigation();\n\n\tconst viewStacks = ref<ViewStack[]>([]);\n\n\tconst activeStackItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\n\t\tif (!stack?.baselineItems) {\n\t\t\treturn stack.items ? extendItemsWithUUID(stack.items) : [];\n\t\t}\n\n\t\tif (stack.search && searchBaseItems.value) {\n\t\t\tconst searchBase =\n\t\t\t\tsearchBaseItems.value.length > 0\n\t\t\t\t\t? searchBaseItems.value\n\t\t\t\t\t: flattenCreateElements(stack.baselineItems ?? []);\n\n\t\t\treturn extendItemsWithUUID(searchNodes(stack.search || '', searchBase));\n\t\t}\n\t\treturn extendItemsWithUUID(stack.baselineItems);\n\t});\n\n\tconst activeViewStack = computed<ViewStack>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack) return {};\n\n\t\tconst flatBaselineItems = flattenCreateElements(stack.baselineItems ?? []);\n\n\t\treturn {\n\t\t\t...stack,\n\t\t\titems: activeStackItems.value,\n\t\t\thasSearch: flatBaselineItems.length > 8 || stack?.hasSearch,\n\t\t};\n\t});\n\n\tconst activeViewStackMode = computed(\n\t\t() => activeViewStack.value.mode || TRIGGER_NODE_CREATOR_VIEW,\n\t);\n\n\tconst searchBaseItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.searchItems) return [];\n\n\t\treturn stack.searchItems.map((item) => transformNodeType(item, stack.subcategory));\n\t});\n\n\t// Generate a delta between the global search results(all nodes) and the stack search results\n\tconst globalSearchItemsDiff = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.search) return [];\n\n\t\tconst allNodes = nodeCreatorStore.mergedNodes.map((item) => transformNodeType(item));\n\t\tconst globalSearchResult = extendItemsWithUUID(searchNodes(stack.search || '', allNodes));\n\n\t\treturn globalSearchResult.filter((item) => {\n\t\t\treturn !activeStackItems.value.find((activeItem) => activeItem.key === item.key);\n\t\t});\n\t});\n\n\tconst itemsBySubcategory = computed(() => subcategorizeItems(nodeCreatorStore.mergedNodes));\n\n\tasync function gotoCompatibleConnectionView(\n\t\tconnectionType: NodeConnectionType,\n\t\tisOutput?: boolean,\n\t\tfilter?: INodeInputFilter,\n\t) {\n\t\tconst i18n = useI18n();\n\n\t\tlet nodesByConnectionType: { [key: string]: string[] };\n\t\tlet relatedAIView: NodeViewItem | { properties: { title: string; icon: string } } | undefined;\n\n\t\tif (isOutput === true) {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByInputConnectionTypeNames;\n\t\t\trelatedAIView = {\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByOutputConnectionTypeNames;\n\n\t\t\trelatedAIView = AINodesView([]).items.find(\n\t\t\t\t(item) => item.properties.connectionType === connectionType,\n\t\t\t);\n\t\t}\n\n\t\tawait nextTick();\n\t\tpushViewStack({\n\t\t\ttitle: relatedAIView?.properties.title,\n\t\t\trootView: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\tmode: 'nodes',\n\t\t\titems: nodeCreatorStore.allNodeCreatorNodes,\n\t\t\tnodeIcon: {\n\t\t\t\ticonType: 'icon',\n\t\t\t\ticon: relatedAIView?.properties.icon,\n\t\t\t\tcolor: relatedAIView?.properties.iconProps?.color,\n\t\t\t},\n\t\t\tpanelClass: relatedAIView?.properties.panelClass,\n\t\t\tbaseFilter: (i: INodeCreateElement) => {\n\t\t\t\t// AI Code node could have any connection type so we don't want to display it\n\t\t\t\t// in the compatible connection view as it would be displayed in all of them\n\t\t\t\tif (i.key === AI_CODE_NODE_TYPE) return false;\n\t\t\t\tconst displayNode = nodesByConnectionType[connectionType].includes(i.key);\n\n\t\t\t\t// TODO: Filtering works currently fine for displaying compatible node when dropping\n\t\t\t\t// input connections. However, it does not work for output connections.\n\t\t\t\t// For that reason does it currently display nodes that are maybe not compatible\n\t\t\t\t// but then errors once it got selected by the user.\n\t\t\t\tif (displayNode && filter?.nodes?.length) {\n\t\t\t\t\treturn filter.nodes.includes(i.key);\n\t\t\t\t}\n\n\t\t\t\treturn displayNode;\n\t\t\t},\n\t\t\titemsMapper(item) {\n\t\t\t\treturn {\n\t\t\t\t\t...item,\n\t\t\t\t\tsubcategory: connectionType,\n\t\t\t\t};\n\t\t\t},\n\t\t\tpreventBack: true,\n\t\t});\n\t}\n\n\tfunction setStackBaselineItems() {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack || !activeViewStack.value.uuid) return;\n\n\t\tlet stackItems = stack?.items ?? [];\n\n\t\tif (!stack?.items) {\n\t\t\tconst subcategory = stack?.subcategory ?? DEFAULT_SUBCATEGORY;\n\t\t\tconst itemsInSubcategory = itemsBySubcategory.value[subcategory];\n\t\t\tconst sections = stack.sections;\n\n\t\t\tif (sections) {\n\t\t\t\tstackItems = groupItemsInSections(itemsInSubcategory, sections);\n\t\t\t} else {\n\t\t\t\tstackItems = itemsInSubcategory;\n\t\t\t}\n\t\t}\n\n\t\t// Ensure that the nodes specified in `stack.forceIncludeNodes` are always included,\n\t\t// regardless of whether the subcategory is matched\n\t\tif ((stack.forceIncludeNodes ?? []).length > 0) {\n\t\t\tconst matchedNodes = nodeCreatorStore.mergedNodes\n\t\t\t\t.filter((item) => stack.forceIncludeNodes?.includes(item.name))\n\t\t\t\t.map((item) => transformNodeType(item, stack.subcategory));\n\n\t\t\tstackItems.push(...matchedNodes);\n\t\t}\n\n\t\tif (stack.baseFilter) {\n\t\t\tstackItems = stackItems.filter(stack.baseFilter);\n\t\t}\n\n\t\tif (stack.itemsMapper) {\n\t\t\tstackItems = stackItems.map(stack.itemsMapper);\n\t\t}\n\n\t\t// Sort only if non-root view\n\t\tif (!stack.items) {\n\t\t\tstackItems = sortNodeCreateElements(stackItems);\n\t\t}\n\n\t\tupdateCurrentViewStack({ baselineItems: stackItems });\n\t}\n\n\tfunction extendItemsWithUUID(items: INodeCreateElement[]) {\n\t\treturn items.map((item) => ({\n\t\t\t...item,\n\t\t\tuuid: `${item.key}-${uuid()}`,\n\t\t}));\n\t}\n\n\tfunction pushViewStack(stack: ViewStack) {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tupdateCurrentViewStack({ activeIndex: getActiveItemIndex() });\n\t\t}\n\n\t\tconst newStackUuid = uuid();\n\t\tviewStacks.value.push({\n\t\t\t...stack,\n\t\t\tuuid: newStackUuid,\n\t\t\ttransitionDirection: 'in',\n\t\t\tactiveIndex: 0,\n\t\t});\n\t\tsetStackBaselineItems();\n\t}\n\n\tfunction popViewStack() {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tviewStacks.value.pop();\n\t\t\tupdateCurrentViewStack({ transitionDirection: 'out' });\n\t\t}\n\t}\n\n\tfunction updateCurrentViewStack(stack: Partial<ViewStack>) {\n\t\tconst currentStack = viewStacks.value[viewStacks.value.length - 1];\n\t\tconst matchedIndex = viewStacks.value.findIndex((s) => s.uuid === currentStack.uuid);\n\t\tif (!currentStack) return;\n\n\t\t// For each key in the stack, update the matched stack\n\t\tObject.keys(stack).forEach((key) => {\n\t\t\tconst typedKey = key as keyof ViewStack;\n\t\t\tviewStacks.value[matchedIndex] = {\n\t\t\t\t...viewStacks.value[matchedIndex],\n\t\t\t\t[key]: stack[typedKey],\n\t\t\t};\n\t\t});\n\t}\n\n\tfunction resetViewStacks() {\n\t\tviewStacks.value = [];\n\t}\n\n\treturn {\n\t\tviewStacks,\n\t\tactiveViewStack,\n\t\tactiveViewStackMode,\n\t\tglobalSearchItemsDiff,\n\t\tgotoCompatibleConnectionView,\n\t\tresetViewStacks,\n\t\tupdateCurrentViewStack,\n\t\tpushViewStack,\n\t\tpopViewStack,\n\t};\n});\n","<template>\n\t<div :class=\"$style['content']\">\n\t\t<div\n\t\t\tclass=\"node-view-root do-not-select\"\n\t\t\tid=\"node-view-root\"\n\t\t\tdata-test-id=\"node-view-root\"\n\t\t\t@dragover=\"onDragOver\"\n\t\t\t@drop=\"onDrop\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"node-view-wrapper\"\n\t\t\t\t:class=\"workflowClasses\"\n\t\t\t\tdata-test-id=\"node-view-wrapper\"\n\t\t\t\t@touchstart=\"mouseDown\"\n\t\t\t\t@touchend=\"mouseUp\"\n\t\t\t\t@touchmove=\"mouseMoveNodeWorkflow\"\n\t\t\t\t@mousedown=\"mouseDown\"\n\t\t\t\tv-touch:tap=\"touchTap\"\n\t\t\t\t@mouseup=\"mouseUp\"\n\t\t\t\t@contextmenu=\"contextMenu.open\"\n\t\t\t\t@wheel=\"canvasStore.wheelScroll\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view-background\"\n\t\t\t\t\tclass=\"node-view-background\"\n\t\t\t\t\t:style=\"backgroundStyle\"\n\t\t\t\t\tdata-test-id=\"node-view-background\"\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view\"\n\t\t\t\t\tclass=\"node-view\"\n\t\t\t\t\t:style=\"workflowStyle\"\n\t\t\t\t\tref=\"nodeView\"\n\t\t\t\t\tdata-test-id=\"node-view\"\n\t\t\t\t>\n\t\t\t\t\t<canvas-add-button\n\t\t\t\t\t\t:style=\"canvasAddButtonStyle\"\n\t\t\t\t\t\t@click=\"showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON)\"\n\t\t\t\t\t\tv-show=\"showCanvasAddButton\"\n\t\t\t\t\t\t:showTooltip=\"!containsTrigger && showTriggerMissingTooltip\"\n\t\t\t\t\t\t:position=\"canvasStore.canvasAddButtonPosition\"\n\t\t\t\t\t\tref=\"canvasAddButton\"\n\t\t\t\t\t\t@hook:mounted=\"canvasStore.setRecenteredCanvasAddButtonPosition\"\n\t\t\t\t\t\tdata-test-id=\"canvas-add-button\"\n\t\t\t\t\t/>\n\t\t\t\t\t<node\n\t\t\t\t\t\tv-for=\"nodeData in nodesToRender\"\n\t\t\t\t\t\t@deselectAllNodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselectNode=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@nodeSelected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@runWorkflow=\"onRunNode\"\n\t\t\t\t\t\t@moved=\"onNodeMoved\"\n\t\t\t\t\t\t@run=\"onNodeRun\"\n\t\t\t\t\t\t:key=\"`${nodeData.id}_node`\"\n\t\t\t\t\t\t:name=\"nodeData.name\"\n\t\t\t\t\t\t:isReadOnly=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:isActive=\"!!activeNode && activeNode.name === nodeData.name\"\n\t\t\t\t\t\t:hideActions=\"pullConnActive\"\n\t\t\t\t\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:disablePointerEvents=\"!canOpenNDV\"\n\t\t\t\t\t\t:hideNodeIssues=\"hideNodeIssues\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #custom-tooltip>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-text=\"$locale.baseText('nodeView.placeholderNode.addTriggerNodeBeforeExecuting')\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</node>\n\t\t\t\t\t<sticky\n\t\t\t\t\t\tv-for=\"stickyData in stickiesToRender\"\n\t\t\t\t\t\t@deselectAllNodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselectNode=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@nodeSelected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@removeNode=\"(name) => removeNode(name, true)\"\n\t\t\t\t\t\t:key=\"`${stickyData.id}_sticky`\"\n\t\t\t\t\t\t:name=\"stickyData.name\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:isReadOnly=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:isActive=\"!!activeNode && activeNode.name === stickyData.name\"\n\t\t\t\t\t\t:nodeViewScale=\"nodeViewScale\"\n\t\t\t\t\t\t:gridSize=\"GRID_SIZE\"\n\t\t\t\t\t\t:hideActions=\"pullConnActive\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<node-details-view\n\t\t\t\t:readOnly=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t:renaming=\"renamingActive\"\n\t\t\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t\t\t@redrawNode=\"redrawNode\"\n\t\t\t\t@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t@stopExecution=\"stopExecution\"\n\t\t\t\t@saveKeyboardShortcut=\"onSaveKeyboardShortcut\"\n\t\t\t/>\n\t\t\t<Suspense>\n\t\t\t\t<NodeCreation\n\t\t\t\t\tv-if=\"!isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\t:create-node-active=\"createNodeActive\"\n\t\t\t\t\t:node-view-scale=\"nodeViewScale\"\n\t\t\t\t\t@toggleNodeCreator=\"onToggleNodeCreator\"\n\t\t\t\t\t@addNodes=\"onAddNodes\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<CanvasControls />\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<ContextMenu @action=\"onContextMenuAction\" />\n\t\t\t</Suspense>\n\t\t\t<div class=\"workflow-execute-wrapper\" v-if=\"!isReadOnlyRoute && !readOnlyEnv\">\n\t\t\t\t<span\n\t\t\t\t\t@mouseenter=\"showTriggerMissingToltip(true)\"\n\t\t\t\t\t@mouseleave=\"showTriggerMissingToltip(false)\"\n\t\t\t\t\t@click=\"onRunContainerClick\"\n\t\t\t\t\tv-if=\"!isManualChatOnly\"\n\t\t\t\t>\n\t\t\t\t\t<keyboard-shortcut-tooltip\n\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t:shortcut=\"{ metaKey: true, keys: ['↵'] }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t@click.stop=\"onRunWorkflow\"\n\t\t\t\t\t\t\t:loading=\"workflowRunning\"\n\t\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t\ticon=\"play-circle\"\n\t\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t\t:disabled=\"isExecutionDisabled\"\n\t\t\t\t\t\t\tdata-test-id=\"execute-workflow-button\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</keyboard-shortcut-tooltip>\n\t\t\t\t</span>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-if=\"containsChatNodes\"\n\t\t\t\t\t@click.stop=\"onOpenChat\"\n\t\t\t\t\tlabel=\"Chat\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\ticon=\"comment\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\tdata-test-id=\"workflow-chat-button\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && !executionWaitingForWebhook\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t:title=\"\n\t\t\t\t\t\tstopExecutionInProgress\n\t\t\t\t\t\t\t? $locale.baseText('nodeView.stoppingCurrentExecution')\n\t\t\t\t\t\t\t: $locale.baseText('nodeView.stopCurrentExecution')\n\t\t\t\t\t\"\n\t\t\t\t\t:loading=\"stopExecutionInProgress\"\n\t\t\t\t\t@click.stop=\"stopExecution\"\n\t\t\t\t\tdata-test-id=\"stop-execution-button\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && executionWaitingForWebhook === true\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.stopWaitingForWebhookCall')\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t@click.stop=\"stopWaitingForWebhook\"\n\t\t\t\t\tdata-test-id=\"stop-execution-waiting-for-webhook-button\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t!isReadOnlyRoute &&\n\t\t\t\t\t\t!readOnlyEnv &&\n\t\t\t\t\t\tworkflowExecution &&\n\t\t\t\t\t\t!workflowRunning &&\n\t\t\t\t\t\t!allTriggersDisabled\n\t\t\t\t\t\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.deletesTheCurrentExecutionData')\"\n\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t@click.stop=\"clearExecutionData\"\n\t\t\t\t\tdata-test-id=\"clear-execution-data-button\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, nextTick } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport type {\n\tEndpoint,\n\tConnection,\n\tConnectionEstablishedParams,\n\tBeforeDropParams,\n\tConnectionDetachedParams,\n\tConnectionMovedParams,\n\tComponentParameters,\n} from '@jsplumb/core';\nimport {\n\tEVENT_CONNECTION,\n\tEVENT_CONNECTION_DETACHED,\n\tEVENT_CONNECTION_MOVED,\n\tINTERCEPT_BEFORE_DROP,\n} from '@jsplumb/core';\nimport type { MessageBoxInputData, ElNotification } from 'element-plus';\n\nimport {\n\tFIRST_ONBOARDING_PROMPT_TIMEOUT,\n\tMAIN_HEADER_TABS,\n\tMODAL_CANCEL,\n\tMODAL_CLOSE,\n\tMODAL_CONFIRM,\n\tNODE_OUTPUT_DEFAULT_KEY,\n\tONBOARDING_CALL_SIGNUP_MODAL_KEY,\n\tONBOARDING_PROMPT_TIMEBOX,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tQUICKSTART_NOTE_NAME,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEnterpriseEditionFeature,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tMANUAL_CHAT_TRIGGER_NODE_TYPE,\n\tWORKFLOW_LM_CHAT_MODAL_KEY,\n\tAI_NODE_CREATOR_VIEW,\n\tDRAG_EVENT_DATA_KEY,\n\tUPDATE_WEBHOOK_ID_NODE_TYPES,\n\tTIME,\n} from '@/constants';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { genericHelpers } from '@/mixins/genericHelpers';\nimport { moveNodeWorkflow } from '@/mixins/moveNodeWorkflow';\n\nimport useGlobalLinkActions from '@/composables/useGlobalLinkActions';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport useCanvasMouseSelect from '@/composables/useCanvasMouseSelect';\nimport { useExecutionDebugging } from '@/composables/useExecutionDebugging';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useDataSchema } from '@/composables/useDataSchema';\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { useUniqueNodeName } from '@/composables/useUniqueNodeName';\nimport { useI18n } from '@/composables/useI18n';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport { workflowRun } from '@/mixins/workflowRun';\nimport { type PinDataSource, pinData } from '@/mixins/pinData';\n\nimport NodeDetailsView from '@/components/NodeDetailsView.vue';\nimport ContextMenu from '@/components/ContextMenu/ContextMenu.vue';\nimport Node from '@/components/Node.vue';\nimport Sticky from '@/components/Sticky.vue';\nimport CanvasAddButton from './CanvasAddButton.vue';\nimport KeyboardShortcutTooltip from '@/components/KeyboardShortcutTooltip.vue';\nimport { v4 as uuid } from 'uuid';\nimport type {\n\tIConnection,\n\tIConnections,\n\tIDataObject,\n\tIExecutionsSummary,\n\tINode,\n\tINodeConnections,\n\tINodeCredentialsDetails,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeTypeNameVersion,\n\tIPinData,\n\tIRun,\n\tITaskData,\n\tITelemetryTrackProperties,\n\tIWorkflowBase,\n\tWorkflow,\n\tConnectionTypes,\n\tINodeOutputConfiguration,\n} from 'n8n-workflow';\nimport {\n\tdeepCopy,\n\tjsonParse,\n\tNodeConnectionType,\n\tNodeHelpers,\n\tTelemetryHelpers,\n} from 'n8n-workflow';\nimport type {\n\tICredentialsResponse,\n\tIExecutionResponse,\n\tIWorkflowDb,\n\tIWorkflowData,\n\tINodeUi,\n\tIUpdateInformation,\n\tIWorkflowDataUpdate,\n\tXYPosition,\n\tIPushDataExecutionFinished,\n\tITag,\n\tINewWorkflowData,\n\tIWorkflowTemplate,\n\tIWorkflowToShare,\n\tIUser,\n\tINodeUpdatePropertiesInformation,\n\tNodeCreatorOpenSource,\n\tAddedNodesAndConnections,\n\tToggleNodeCreatorOptions,\n} from '@/Interface';\n\nimport { debounceHelper } from '@/mixins/debounce';\nimport type { Route, RawLocation } from 'vue-router';\nimport { dataPinningEventBus, nodeViewEventBus } from '@/event-bus';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useEnvironmentsStore } from '@/stores/environments.ee.store';\nimport { useExternalSecretsStore } from '@/stores/externalSecrets.ee.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { usePushConnectionStore } from '@/stores/pushConnection.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSegment } from '@/stores/segment.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsEEStore } from '@/stores/workflows.ee.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { getAccountAge } from '@/utils/userUtils';\nimport { getConnectionInfo, getNodeViewTab } from '@/utils/canvasUtils';\nimport {\n\tAddConnectionCommand,\n\tAddNodeCommand,\n\tMoveNodeCommand,\n\tRemoveConnectionCommand,\n\tRemoveNodeCommand,\n\tRenameNodeCommand,\n\thistoryBus,\n} from '@/models/history';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport {\n\tEVENT_ENDPOINT_MOUSEOVER,\n\tEVENT_ENDPOINT_MOUSEOUT,\n\tEVENT_DRAG_MOVE,\n\tEVENT_CONNECTION_DRAG,\n\tEVENT_CONNECTION_ABORT,\n\tEVENT_CONNECTION_MOUSEOUT,\n\tEVENT_CONNECTION_MOUSEOVER,\n\tready,\n} from '@jsplumb/browser-ui';\nimport type { N8nPlusEndpoint } from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport {\n\tN8nPlusEndpointType,\n\tEVENT_PLUS_ENDPOINT_CLICK,\n} from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport type { N8nAddInputEndpoint } from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport {\n\tEVENT_ADD_INPUT_ENDPOINT_CLICK,\n\tN8nAddInputEndpointType,\n} from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\nimport { getConnectorPaintStyleData, OVERLAY_ENDPOINT_ARROW_ID } from '@/utils/nodeViewUtils';\nimport { useViewStacks } from '@/components/Node/NodeCreator/composables/useViewStacks';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\ninterface AddNodeOptions {\n\tposition?: XYPosition;\n\tdragAndDrop?: boolean;\n\tname?: string;\n}\n\nconst NodeCreation = defineAsyncComponent(async () => import('@/components/Node/NodeCreation.vue'));\nconst CanvasControls = defineAsyncComponent(async () => import('@/components/CanvasControls.vue'));\n\nexport default defineComponent({\n\tname: 'NodeView',\n\tmixins: [\n\t\tcopyPaste,\n\t\tgenericHelpers,\n\t\tmoveNodeWorkflow,\n\t\tworkflowHelpers,\n\t\tworkflowRun,\n\t\tdebounceHelper,\n\t\tpinData,\n\t],\n\tcomponents: {\n\t\tNodeDetailsView,\n\t\tNode,\n\t\tSticky,\n\t\tCanvasAddButton,\n\t\tKeyboardShortcutTooltip,\n\t\tNodeCreation,\n\t\tCanvasControls,\n\t\tContextMenu,\n\t},\n\tsetup(props, ctx) {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst locale = useI18n();\n\t\tconst contextMenu = useContextMenu();\n\t\tconst dataSchema = useDataSchema();\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn {\n\t\t\tlocale,\n\t\t\tcontextMenu,\n\t\t\tdataSchema,\n\t\t\tnodeHelpers,\n\t\t\texternalHooks,\n\t\t\t...useCanvasMouseSelect(),\n\t\t\t...useGlobalLinkActions(),\n\t\t\t...useTitleChange(),\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t\t...useUniqueNodeName(),\n\t\t\t...useExecutionDebugging(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowRun.setup?.(props, ctx),\n\t\t};\n\t},\n\terrorCaptured: (err, vm, info) => {\n\t\tconsole.error('errorCaptured');\n\t\tconsole.error(err);\n\t},\n\twatch: {\n\t\t// Listen to route changes and load the workflow accordingly\n\t\tasync $route(to: Route, from: Route) {\n\t\t\tthis.readOnlyEnvRouteCheck();\n\n\t\t\tconst currentTab = getNodeViewTab(to);\n\t\t\tconst nodeViewNotInitialized = !this.uiStore.nodeViewInitialized;\n\t\t\tlet workflowChanged =\n\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t// Both 'new' and __EMPTY__ are new workflow names, so ignore them when detecting if wf changed\n\t\t\t\t!(from.params.name === 'new' && this.currentWorkflow === PLACEHOLDER_EMPTY_WORKFLOW_ID) &&\n\t\t\t\t!(from.name === VIEWS.NEW_WORKFLOW) &&\n\t\t\t\t// Also ignore if workflow id changes when saving new workflow\n\t\t\t\tto.params.action !== 'workflowSave';\n\t\t\tconst isOpeningTemplate = to.name === VIEWS.TEMPLATE_IMPORT;\n\n\t\t\t// When entering this tab:\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW || isOpeningTemplate) {\n\t\t\t\tif (workflowChanged || nodeViewNotInitialized || isOpeningTemplate) {\n\t\t\t\t\tthis.startLoading();\n\t\t\t\t\tif (nodeViewNotInitialized) {\n\t\t\t\t\t\tconst previousDirtyState = this.uiStore.stateIsDirty;\n\t\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\t\tthis.uiStore.stateIsDirty = previousDirtyState;\n\t\t\t\t\t}\n\t\t\t\t\tawait Promise.all([this.loadCredentials(), this.initView()]);\n\t\t\t\t\tthis.stopLoading();\n\t\t\t\t\tif (this.blankRedirect) {\n\t\t\t\t\t\tthis.blankRedirect = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.checkAndInitDebugMode();\n\t\t\t}\n\t\t\t// Also, when landing on executions tab, check if workflow data is changed\n\t\t\tif (currentTab === MAIN_HEADER_TABS.EXECUTIONS) {\n\t\t\t\tworkflowChanged =\n\t\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t\t!(to.params.name === 'new' && from.params.name === undefined);\n\t\t\t\tif (workflowChanged) {\n\t\t\t\t\t// This will trigger node view to update next time workflow tab is opened\n\t\t\t\t\tthis.uiStore.nodeViewInitialized = false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tactiveNode() {\n\t\t\t// When a node gets set as active deactivate the create-menu\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tcontainsTrigger(containsTrigger) {\n\t\t\t// Re-center CanvasAddButton if there's no triggers\n\t\t\tif (containsTrigger === false)\n\t\t\t\tthis.canvasStore.setRecenteredCanvasAddButtonPosition(this.getNodeViewOffsetPosition);\n\t\t},\n\t\tnodeViewScale(newScale) {\n\t\t\tconst elementRef = this.$refs.nodeView as HTMLDivElement | undefined;\n\t\t\tif (elementRef) {\n\t\t\t\telementRef.style.transform = `scale(${newScale})`;\n\t\t\t}\n\t\t},\n\t},\n\tasync beforeRouteLeave(to, from, next) {\n\t\tif (\n\t\t\tgetNodeViewTab(to) === MAIN_HEADER_TABS.EXECUTIONS ||\n\t\t\tfrom.name === VIEWS.TEMPLATE_IMPORT ||\n\t\t\t(getNodeViewTab(to) === MAIN_HEADER_TABS.WORKFLOW && from.name === VIEWS.EXECUTION_DEBUG)\n\t\t) {\n\t\t\tnext();\n\t\t\treturn;\n\t\t}\n\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t{\n\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tshowClose: true,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t// Make sure workflow id is empty when leaving the editor\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tconst saved = await this.saveCurrentWorkflow({}, false);\n\t\t\t\tif (saved) {\n\t\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\t\t\t\t}\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\tif (from.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\t// Replace the current route with the new workflow route\n\t\t\t\t\t// before navigating to the new route when saving new workflow.\n\t\t\t\t\tawait this.$router.replace(\n\t\t\t\t\t\t{ name: VIEWS.WORKFLOW, params: { name: this.currentWorkflow } },\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// We can't use next() here since vue-router\n\t\t\t\t\t\t\t// would prevent the navigation with an error\n\t\t\t\t\t\t\tvoid this.$router.push(to as RawLocation);\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t} else if (confirmModal === MODAL_CANCEL) {\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tthis.resetWorkspace();\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\tnext();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\tnext();\n\t\t}\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseCanvasStore,\n\t\t\tuseTagsStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseTemplatesStore,\n\t\t\tuseUIStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseUsersStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseEnvironmentsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t\tuseHistoryStore,\n\t\t\tuseExternalSecretsStore,\n\t\t\tuseCollaborationStore,\n\t\t\tusePushConnectionStore,\n\t\t),\n\t\tnativelyNumberSuffixedDefaults(): string[] {\n\t\t\treturn this.nodeTypesStore.nativelyNumberSuffixedDefaults;\n\t\t},\n\t\tcurrentUser(): IUser | null {\n\t\t\treturn this.usersStore.currentUser;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\texecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tisDemo(): boolean {\n\t\t\treturn this.$route.name === VIEWS.DEMO;\n\t\t},\n\t\tshowCanvasAddButton(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.loadingService === null && !this.containsTrigger && !this.isDemo && !this.readOnlyEnv\n\t\t\t);\n\t\t},\n\t\tlastSelectedNode(): INodeUi | null {\n\t\t\treturn this.uiStore.getLastSelectedNode;\n\t\t},\n\t\tnodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes;\n\t\t},\n\t\tnodesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type !== STICKY_NODE_TYPE);\n\t\t},\n\t\tstickiesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type === STICKY_NODE_TYPE);\n\t\t},\n\t\trunButtonText(): string {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executeWorkflow');\n\t\t\t}\n\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.waitingForTriggerEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executingWorkflow');\n\t\t},\n\t\tworkflowStyle(): object {\n\t\t\tconst offsetPosition = this.uiStore.nodeViewOffsetPosition;\n\t\t\treturn {\n\t\t\t\tleft: offsetPosition[0] + 'px',\n\t\t\t\ttop: offsetPosition[1] + 'px',\n\t\t\t};\n\t\t},\n\t\tcanvasAddButtonStyle(): object {\n\t\t\treturn {\n\t\t\t\t'pointer-events': this.createNodeActive ? 'none' : 'all',\n\t\t\t};\n\t\t},\n\t\tbackgroundStyle(): object {\n\t\t\treturn NodeViewUtils.getBackgroundStyles(\n\t\t\t\tthis.nodeViewScale,\n\t\t\t\tthis.uiStore.nodeViewOffsetPosition,\n\t\t\t\tthis.isExecutionPreview,\n\t\t\t);\n\t\t},\n\t\tworkflowClasses() {\n\t\t\tconst returnClasses = [];\n\t\t\tif (this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\tif (this.uiStore.nodeViewMoveInProgress) {\n\t\t\t\t\treturnClasses.push('move-in-process');\n\t\t\t\t} else {\n\t\t\t\t\treturnClasses.push('move-active');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.selectActive || this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\t// Makes sure that nothing gets selected while select or move is active\n\t\t\t\treturnClasses.push('do-not-select');\n\t\t\t}\n\n\t\t\tif (this.connectionDragScope.type) {\n\t\t\t\treturnClasses.push('connection-drag-scope-active');\n\t\t\t\treturnClasses.push(`connection-drag-scope-active-type-${this.connectionDragScope.type}`);\n\t\t\t\treturnClasses.push(\n\t\t\t\t\t`connection-drag-scope-active-connection-${this.connectionDragScope.connection}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn returnClasses;\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): string {\n\t\t\treturn this.$route.params.name || this.workflowsStore.workflowId;\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tallTriggersDisabled(): boolean {\n\t\t\tconst disabledTriggerNodes = this.triggerNodes.filter((node) => node.disabled);\n\t\t\treturn disabledTriggerNodes.length === this.triggerNodes.length;\n\t\t},\n\t\ttriggerNodes(): INodeUi[] {\n\t\t\treturn this.nodes.filter(\n\t\t\t\t(node) => node.type === START_NODE_TYPE || this.nodeTypesStore.isTriggerNode(node.type),\n\t\t\t);\n\t\t},\n\t\tcontainsTrigger(): boolean {\n\t\t\treturn this.triggerNodes.length > 0;\n\t\t},\n\t\tisManualChatOnly(): boolean {\n\t\t\treturn this.containsChatNodes && this.triggerNodes.length === 1;\n\t\t},\n\t\tcontainsChatNodes(): boolean {\n\t\t\treturn !!this.nodes.find(\n\t\t\t\t(node) => node.type === MANUAL_CHAT_TRIGGER_NODE_TYPE && node.disabled !== true,\n\t\t\t);\n\t\t},\n\t\tisExecutionDisabled(): boolean {\n\t\t\treturn !this.containsTrigger || this.allTriggersDisabled;\n\t\t},\n\t\tgetNodeViewOffsetPosition(): XYPosition {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tnodeViewScale(): number {\n\t\t\treturn this.canvasStore.nodeViewScale;\n\t\t},\n\t\tinstance(): BrowserJsPlumbInstance {\n\t\t\treturn this.canvasStore.jsPlumbInstance;\n\t\t},\n\t\tisLoading(): boolean {\n\t\t\treturn this.loadingService !== null;\n\t\t},\n\t\tcurrentWorkflowObject(): Workflow {\n\t\t\treturn this.workflowsStore.getCurrentWorkflow();\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tGRID_SIZE: NodeViewUtils.GRID_SIZE,\n\t\t\tSTICKY_NODE_TYPE,\n\t\t\tcreateNodeActive: false,\n\t\t\tlastClickPosition: [450, 450] as XYPosition,\n\t\t\tctrlKeyPressed: false,\n\t\t\tmoveCanvasKeyPressed: false,\n\t\t\tstopExecutionInProgress: false,\n\t\t\tblankRedirect: false,\n\t\t\tcredentialsUpdated: false,\n\t\t\tpullConnActiveNodeName: null as string | null,\n\t\t\tpullConnActive: false,\n\t\t\tdropPrevented: false,\n\t\t\tconnectionDragScope: {\n\t\t\t\ttype: null,\n\t\t\t\tconnection: null,\n\t\t\t} as { type: string | null; connection: 'source' | 'target' | null },\n\t\t\trenamingActive: false,\n\t\t\tshowStickyButton: false,\n\t\t\tisExecutionPreview: false,\n\t\t\tshowTriggerMissingTooltip: false,\n\t\t\tworkflowData: null as INewWorkflowData | null,\n\t\t\tactiveConnection: null as null | Connection,\n\t\t\tisInsertingNodes: false,\n\t\t\tisProductionExecutionPreview: false,\n\t\t\tenterTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\texitTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\treadOnlyNotification: null as null | typeof ElNotification,\n\t\t\t// jsplumb automatically deletes all loose connections which is in turn recorded\n\t\t\t// in undo history as a user action.\n\t\t\t// This should prevent automatically removed connections from populating undo stack\n\t\t\tsuspendRecordingDetachedConnections: false,\n\t\t\tNODE_CREATOR_OPEN_SOURCES,\n\t\t\teventsAttached: false,\n\t\t\tunloadTimeout: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\tcanOpenNDV: true,\n\t\t\thideNodeIssues: false,\n\t\t};\n\t},\n\tmethods: {\n\t\teditAllowedCheck(): boolean {\n\t\t\tif (this.readOnlyNotification?.visible) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\tthis.readOnlyNotification = this.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${this.isReadOnlyRoute ? 'executions' : 'workflows'}.title`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.title',\n\t\t\t\t\t),\n\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${\n\t\t\t\t\t\t\t\t\tthis.isReadOnlyRoute ? 'executions' : 'workflows'\n\t\t\t\t\t\t\t }.message`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.message',\n\t\t\t\t\t),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t});\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tshowTriggerMissingToltip(isVisible: boolean) {\n\t\t\tthis.showTriggerMissingTooltip = isVisible;\n\t\t},\n\t\tonRunNode(nodeName: string, source: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tconst telemetryPayload = {\n\t\t\t\tnode_type: node ? node.type : null,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsource: 'canvas',\n\t\t\t\tsession_id: this.ndvStore.sessionId,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onRunNode', telemetryPayload);\n\t\t\tvoid this.runWorkflow({ destinationNode: nodeName, source });\n\t\t},\n\t\tasync onOpenChat() {\n\t\t\tconst telemetryPayload = {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked chat open button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onOpenChat', telemetryPayload);\n\t\t\tthis.uiStore.openModal(WORKFLOW_LM_CHAT_MODAL_KEY);\n\t\t},\n\t\tasync onRunWorkflow() {\n\t\t\tvoid this.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(workflowData as IWorkflowBase, this.getNodeTypes())\n\t\t\t\t\t\t\t.nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t\tthis.$telemetry.track('User clicked execute workflow button', telemetryPayload);\n\t\t\t\tvoid this.externalHooks.run('nodeView.onRunWorkflow', telemetryPayload);\n\t\t\t});\n\n\t\t\tawait this.runWorkflow({});\n\t\t\tthis.refreshEndpointsErrorsState();\n\t\t},\n\t\tresetEndpointsErrors() {\n\t\t\tconst allEndpoints = Object.values(this.instance.getManagedElements()).flatMap(\n\t\t\t\t(el) => el.endpoints,\n\t\t\t);\n\n\t\t\tallEndpoints\n\t\t\t\t.filter((endpoint) => endpoint?.endpoint.type === N8nAddInputEndpointType)\n\t\t\t\t.forEach((endpoint) => {\n\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\tif (n8nAddInputEndpoint && (endpoint?.connections ?? []).length > 0) {\n\t\t\t\t\t\tn8nAddInputEndpoint.resetError();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\trefreshEndpointsErrorsState() {\n\t\t\tconst nodeIssues = this.workflowsStore.allNodes.filter((n) => n.issues);\n\t\t\t// Set input color to red if there are issues\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tnodeIssues.forEach((node) => {\n\t\t\t\tconst managedNode = this.instance.getManagedElement(node.id);\n\t\t\t\tconst endpoints = this.instance.getEndpoints(managedNode);\n\n\t\t\t\tObject.keys(node?.issues?.input ?? {}).forEach((connectionType) => {\n\t\t\t\t\tconst inputEndpointsWithIssues = endpoints.filter(\n\t\t\t\t\t\t(e) => e._defaultType.scope === connectionType,\n\t\t\t\t\t);\n\t\t\t\t\tinputEndpointsWithIssues.forEach((endpoint) => {\n\t\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\t\tif (n8nAddInputEndpoint) {\n\t\t\t\t\t\t\tn8nAddInputEndpoint.setError();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tonRunContainerClick() {\n\t\t\tif (this.containsTrigger && !this.allTriggersDisabled) return;\n\n\t\t\tconst message =\n\t\t\t\tthis.containsTrigger && this.allTriggersDisabled\n\t\t\t\t\t? this.$locale.baseText('nodeView.addOrEnableTriggerNode')\n\t\t\t\t\t: this.$locale.baseText('nodeView.addATriggerNodeFirst');\n\n\t\t\tthis.registerCustomAction({\n\t\t\t\tkey: 'showNodeCreator',\n\t\t\t\taction: () =>\n\t\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.NO_TRIGGER_EXECUTION_TOOLTIP),\n\t\t\t});\n\n\t\t\tconst notice = this.showMessage({\n\t\t\t\ttype: 'info',\n\t\t\t\ttitle: this.$locale.baseText('nodeView.cantExecuteNoTrigger'),\n\t\t\t\tmessage,\n\t\t\t\tduration: 3000,\n\t\t\t\tonClick: () =>\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t// Close the creator panel if user clicked on the link\n\t\t\t\t\t\tif (this.createNodeActive) notice.close();\n\t\t\t\t\t}, 0),\n\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t});\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.workflowExecutionData = null;\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tasync onSaveKeyboardShortcut(e: KeyboardEvent) {\n\t\t\tlet saved = await this.saveCurrentWorkflow();\n\t\t\tif (saved) {\n\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\n\t\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\t\tawait this.$router.replace({\n\t\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\t\tparams: { name: this.currentWorkflow },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.activeNode) {\n\t\t\t\t// If NDV is open, save will not work from editable input fields\n\t\t\t\t// so don't show success message if this is true\n\t\t\t\tif (e.target instanceof HTMLInputElement) {\n\t\t\t\t\tsaved = e.target.readOnly;\n\t\t\t\t} else {\n\t\t\t\t\tsaved = true;\n\t\t\t\t}\n\t\t\t\tif (saved) {\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('generic.workflowSaved'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowTriggerCreator(source: NodeCreatorOpenSource) {\n\t\t\tif (this.createNodeActive) return;\n\t\t\tthis.nodeCreatorStore.setSelectedView(TRIGGER_NODE_CREATOR_VIEW);\n\t\t\tthis.nodeCreatorStore.setShowScrim(true);\n\t\t\tthis.onToggleNodeCreator({ source, createNodeActive: true });\n\t\t},\n\t\tasync openExecution(executionId: string) {\n\t\t\tthis.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tlet data: IExecutionResponse | undefined;\n\t\t\ttry {\n\t\t\t\tdata = await this.workflowsStore.getExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.openExecution.title'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (data === undefined) {\n\t\t\t\tthrow new Error(`Execution with id \"${executionId}\" could not be found!`);\n\t\t\t}\n\t\t\tthis.workflowsStore.setWorkflowName({\n\t\t\t\tnewName: data.workflowData.name,\n\t\t\t\tsetStateDirty: false,\n\t\t\t});\n\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(data);\n\t\t\tif (data.workflowData.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflowData.pinData);\n\t\t\t}\n\n\t\t\tif (data.workflowData.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\townedBy: data.workflowData.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\tsharedWith: data.workflowData.sharedWith,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(data.workflowData.usedCredentials);\n\t\t\t}\n\n\t\t\tawait this.addNodes(\n\t\t\t\tdeepCopy(data.workflowData.nodes),\n\t\t\t\tdeepCopy(data.workflowData.connections),\n\t\t\t);\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tvoid this.externalHooks.run('execution.open', {\n\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\tworkflowName: data.workflowData.name,\n\t\t\t\texecutionId,\n\t\t\t});\n\t\t\tthis.$telemetry.track('User opened read-only execution', {\n\t\t\t\tworkflow_id: data.workflowData.id,\n\t\t\t\texecution_mode: data.mode,\n\t\t\t\texecution_finished: data.finished,\n\t\t\t});\n\n\t\t\tif (!data.finished && data.data?.resultData?.error) {\n\t\t\t\t// Check if any node contains an error\n\t\t\t\tlet nodeErrorFound = false;\n\t\t\t\tif (data.data.resultData.runData) {\n\t\t\t\t\tconst runData = data.data.resultData.runData;\n\t\t\t\t\terrorCheck: for (const nodeName of Object.keys(runData)) {\n\t\t\t\t\t\tfor (const taskData of runData[nodeName]) {\n\t\t\t\t\t\t\tif (taskData.error) {\n\t\t\t\t\t\t\t\tnodeErrorFound = true;\n\t\t\t\t\t\t\t\tbreak errorCheck;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!nodeErrorFound && data.data.resultData.error.stack) {\n\t\t\t\t\t// Display some more information for now in console to make debugging easier\n\t\t\t\t\tconsole.error(`Execution ${executionId} error:`);\n\t\t\t\t\tconsole.error(data.data.resultData.error.stack);\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.workflowError'),\n\t\t\t\t\t\tmessage: data.data.resultData.error.message,\n\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((data as IExecutionsSummary).waitTill) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.thisExecutionHasntFinishedYet'),\n\t\t\t\t\tmessage: `<a data-action=\"reload\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.refresh',\n\t\t\t\t\t)}</a> ${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.toSeeTheLatestStatus',\n\t\t\t\t\t)}.<br/> <a href=\"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/\" target=\"_blank\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.moreInfo',\n\t\t\t\t\t)}</a>`,\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tduration: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.stopLoading();\n\t\t},\n\t\tasync importWorkflowExact(data: { workflow: IWorkflowDataUpdate }) {\n\t\t\tif (!data.workflow.nodes || !data.workflow.connections) {\n\t\t\t\tthrow new Error('Invalid workflow object');\n\t\t\t}\n\t\t\tthis.resetWorkspace();\n\t\t\tdata.workflow.nodes = NodeViewUtils.getFixedNodesList(data.workflow.nodes);\n\n\t\t\tawait this.addNodes(data.workflow.nodes as INodeUi[], data.workflow.connections);\n\n\t\t\tif (data.workflow.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflow.pinData);\n\t\t\t}\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync openWorkflowTemplate(templateId: string) {\n\t\t\tthis.startLoading();\n\t\t\tthis.setLoadingText(this.$locale.baseText('nodeView.loadingTemplate'));\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.workflowsStore.activeWorkflowExecution = null;\n\n\t\t\tlet data: IWorkflowTemplate | undefined;\n\t\t\ttry {\n\t\t\t\tvoid this.externalHooks.run('template.requested', { templateId });\n\t\t\t\tdata = await this.templatesStore.getFixedWorkflowTemplate(templateId);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.workflowTemplateWithIdCouldNotBeFound', {\n\t\t\t\t\t\t\tinterpolate: { templateId },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.couldntImportWorkflow'));\n\t\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.blankRedirect = true;\n\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW, query: { templateId } });\n\n\t\t\tawait this.addNodes(data.workflow.nodes, data.workflow.connections);\n\t\t\tthis.workflowData = (await this.workflowsStore.getNewWorkflowData(data.name)) || {};\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tvoid this.externalHooks.run('template.open', {\n\t\t\t\ttemplateId,\n\t\t\t\ttemplateName: data.name,\n\t\t\t\tworkflow: data.workflow,\n\t\t\t});\n\t\t\tthis.stopLoading();\n\t\t},\n\t\tasync openWorkflow(workflow: IWorkflowDb) {\n\t\t\tthis.startLoading();\n\n\t\t\tconst selectedExecution = this.workflowsStore.activeWorkflowExecution;\n\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.addWorkflow(workflow);\n\t\t\tthis.workflowsStore.setActive(workflow.active || false);\n\t\t\tthis.workflowsStore.setWorkflowId(workflow.id);\n\t\t\tthis.workflowsStore.setWorkflowName({ newName: workflow.name, setStateDirty: false });\n\t\t\tthis.workflowsStore.setWorkflowSettings(workflow.settings || {});\n\t\t\tthis.workflowsStore.setWorkflowPinData(workflow.pinData || {});\n\t\t\tthis.workflowsStore.setWorkflowVersionId(workflow.versionId);\n\n\t\t\tif (workflow.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\townedBy: workflow.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\tsharedWith: workflow.sharedWith,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(workflow.usedCredentials);\n\t\t\t}\n\n\t\t\tconst tags = (workflow.tags || []) as ITag[];\n\t\t\tconst tagIds = tags.map((tag) => tag.id);\n\t\t\tthis.workflowsStore.setWorkflowTagIds(tagIds || []);\n\t\t\tthis.tagsStore.upsertTags(tags);\n\n\t\t\tawait this.addNodes(workflow.nodes, workflow.connections);\n\n\t\t\tif (!this.credentialsUpdated) {\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t}\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tvoid this.externalHooks.run('workflow.open', {\n\t\t\t\tworkflowId: workflow.id,\n\t\t\t\tworkflowName: workflow.name,\n\t\t\t});\n\t\t\tif (selectedExecution?.workflowId !== workflow.id) {\n\t\t\t\tthis.workflowsStore.activeWorkflowExecution = null;\n\t\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\t} else {\n\t\t\t\tthis.workflowsStore.activeWorkflowExecution = selectedExecution;\n\t\t\t}\n\t\t\tthis.stopLoading();\n\t\t\tthis.collaborationStore.notifyWorkflowOpened(workflow.id);\n\t\t},\n\t\ttouchTap(e: MouseEvent | TouchEvent) {\n\t\t\tif (this.isTouchDevice) {\n\t\t\t\tthis.mouseDown(e);\n\t\t\t}\n\t\t},\n\t\tmouseDown(e: MouseEvent | TouchEvent) {\n\t\t\t// Save the location of the mouse click\n\t\t\tthis.lastClickPosition = this.getMousePositionWithinNodeView(e);\n\t\t\tif (e instanceof MouseEvent && e.button === 1) {\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t}\n\n\t\t\tthis.mouseDownMouseSelect(e as MouseEvent, this.moveCanvasKeyPressed);\n\t\t\tthis.mouseDownMoveWorkflow(e as MouseEvent, this.moveCanvasKeyPressed);\n\n\t\t\t// Hide the node-creator\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tmouseUp(e: MouseEvent) {\n\t\t\tif (e.button === 1) {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t\tthis.mouseUpMouseSelect(e);\n\t\t\tthis.mouseUpMoveWorkflow(e);\n\t\t},\n\t\tkeyUp(e: KeyboardEvent) {\n\t\t\tif (e.key === this.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = false;\n\t\t\t}\n\t\t\tif (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t},\n\t\tasync keyDown(e: KeyboardEvent) {\n\t\t\tthis.contextMenu.close();\n\n\t\t\tconst ctrlModifier = this.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst shiftModifier = e.shiftKey && !e.altKey && !this.isCtrlKeyPressed(e);\n\t\t\tconst ctrlAltModifier = this.isCtrlKeyPressed(e) && e.altKey && !e.shiftKey;\n\t\t\tconst noModifierKeys = !this.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst readOnly = this.isReadOnlyRoute || this.readOnlyEnv;\n\n\t\t\tif (e.key === 's' && ctrlModifier && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced('onSaveKeyboardShortcut', { debounceTime: 1000 }, e);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\n\t\t\t// Check if the keys got emitted from a message box or from something\n\t\t\t// else which should ignore the default keybindings\n\t\t\tfor (const element of path) {\n\t\t\t\tif (\n\t\t\t\t\telement.className &&\n\t\t\t\t\ttypeof element.className === 'string' &&\n\t\t\t\t\telement.className.includes('ignore-key-press')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// el-dialog or el-message-box element is open\n\t\t\tif (window.document.body.classList.contains('el-popup-parent--hidden')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.key === 'Escape' && noModifierKeys) {\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t\tif (this.activeNode) {\n\t\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// node modal is open\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectedNodes = this.uiStore.getSelectedNodes\n\t\t\t\t.map((node) => node && this.workflowsStore.getNodeByName(node.name))\n\t\t\t\t.filter((node) => !!node) as INode[];\n\n\t\t\tif (e.key === 'd' && noModifierKeys && !readOnly) {\n\t\t\t\tvoid this.callDebounced('toggleActivationNodes', { debounceTime: 350 }, selectedNodes);\n\t\t\t} else if (e.key === 'd' && ctrlModifier && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvoid this.duplicateNodes(selectedNodes);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'p' && noModifierKeys && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.togglePinNodes(selectedNodes, 'keyboard-shortcut');\n\t\t\t\t}\n\t\t\t} else if ((e.key === 'Delete' || e.key === 'Backspace') && noModifierKeys && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('deleteNodes', { debounceTime: 500 }, selectedNodes);\n\t\t\t} else if (e.key === 'Tab' && noModifierKeys && !readOnly) {\n\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.TAB,\n\t\t\t\t\tcreateNodeActive: !this.createNodeActive && !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && ctrlModifier && !readOnly) {\n\t\t\t\tvoid this.onRunWorkflow();\n\t\t\t} else if (e.key === 'S' && shiftModifier && !readOnly) {\n\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t} else if (e.key === this.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = true;\n\t\t\t} else if (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t} else if (e.key === 'F2' && noModifierKeys && !readOnly) {\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode !== null && lastSelectedNode.type !== STICKY_NODE_TYPE) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\t'renameNodePrompt',\n\t\t\t\t\t\t{ debounceTime: 1500 },\n\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'a' && ctrlModifier) {\n\t\t\t\t// Select all nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('selectAllNodes', { debounceTime: 1000 });\n\t\t\t} else if (e.key === 'c' && ctrlModifier) {\n\t\t\t\tvoid this.callDebounced('copyNodes', { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'x' && ctrlModifier && !readOnly) {\n\t\t\t\t// Cut nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('cutNodes', { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'n' && ctrlAltModifier) {\n\t\t\t\t// Create a new workflow\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\t\t\t\tif (this.isDemo) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (this.$router.currentRoute.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\tnodeViewEventBus.emit('newWorkflow');\n\t\t\t\t} else {\n\t\t\t\t\tvoid this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\t}\n\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.keyDown.title'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && noModifierKeys) {\n\t\t\t\t// Activate the last selected node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\t\tif (lastSelectedNode !== null) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tlastSelectedNode.type === STICKY_NODE_TYPE &&\n\t\t\t\t\t\t(this.isReadOnlyRoute || this.readOnlyEnv)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.ndvStore.activeNodeName = lastSelectedNode.name;\n\t\t\t\t}\n\t\t\t} else if (e.key === 'ArrowRight' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('selectDownstreamNodes', { debounceTime: 1000 });\n\t\t\t} else if (e.key === 'ArrowRight' && noModifierKeys) {\n\t\t\t\t// Set child node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t);\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t'nodeSelectedByName',\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (e.key === 'ArrowLeft' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('selectUpstreamNodes', { debounceTime: 1000 });\n\t\t\t} else if (e.key === 'ArrowLeft' && noModifierKeys) {\n\t\t\t\t// Set parent node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t'nodeSelectedByName',\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (['ArrowUp', 'ArrowDown'].includes(e.key) && noModifierKeys) {\n\t\t\t\t// Set sibling node as active\n\n\t\t\t\t// Check first if it has a parent node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (!Array.isArray(connections.main) || !connections.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst parentNode = connections.main[0][0].node;\n\t\t\t\tconst connectionsParent = this.workflowsStore.outgoingConnectionsByNodeName(parentNode);\n\n\t\t\t\tif (!Array.isArray(connectionsParent.main) || !connectionsParent.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get all the sibling nodes and their x positions to know which one to set active\n\t\t\t\tlet siblingNode: INodeUi | null;\n\t\t\t\tlet lastCheckedNodePosition = e.key === 'ArrowUp' ? -99999999 : 99999999;\n\t\t\t\tlet nextSelectNode: string | null = null;\n\t\t\t\tfor (const ouputConnections of connectionsParent.main) {\n\t\t\t\t\tfor (const ouputConnection of ouputConnections) {\n\t\t\t\t\t\tif (ouputConnection.node === lastSelectedNode.name) {\n\t\t\t\t\t\t\t// Ignore current node\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsiblingNode = this.workflowsStore.getNodeByName(ouputConnection.node);\n\n\t\t\t\t\t\tif (siblingNode) {\n\t\t\t\t\t\t\tif (e.key === 'ArrowUp') {\n\t\t\t\t\t\t\t\t// Get the next node on the left\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] <= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] > lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Get the next node on the right\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] >= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] < lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nextSelectNode !== null) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\t'nodeSelectedByName',\n\t\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\t\tnextSelectNode,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\ttoggleActivationNodes(nodes: INode[]) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.disableNodes(nodes, true);\n\t\t},\n\n\t\ttogglePinNodes(nodes: INode[], source: PinDataSource) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst nextStatePinned = nodes.some(\n\t\t\t\t(node) => !this.workflowsStore.pinDataByNodeName(node.name),\n\t\t\t);\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tif (nextStatePinned) {\n\t\t\t\t\tconst dataToPin = this.dataSchema.getInputDataWithPinned(node);\n\t\t\t\t\tif (dataToPin.length !== 0) {\n\t\t\t\t\t\tthis.setPinData(node, dataToPin, source);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.unsetPinData(node, source);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\n\t\tdeleteNodes(nodes: INode[]) {\n\t\t\t// Copy \"selectedNodes\" as the nodes get deleted out of selection\n\t\t\t// when they get deleted and if we would use original it would mess\n\t\t\t// with the index and would so not delete all nodes\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tthis.removeNode(node.name, true, false);\n\t\t\t});\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}, 200);\n\t\t},\n\n\t\tselectAllNodes() {\n\t\t\tthis.nodes.forEach((node) => {\n\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t});\n\t\t},\n\n\t\tselectUpstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all upstream nodes and select them\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.getConnectedNodes('upstream', workflow, lastSelectedNode.name);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\t\tselectDownstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all downstream nodes and select them\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.getConnectedNodes('downstream', workflow, lastSelectedNode.name);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\n\t\tpushDownstreamNodes(sourceNodeName: string, margin: number, recordHistory = false) {\n\t\t\tconst sourceNode = this.workflowsStore.nodesByName[sourceNodeName];\n\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.getConnectedNodes('downstream', workflow, sourceNodeName);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tconst node = this.workflowsStore.nodesByName[nodeName];\n\t\t\t\tconst oldPosition = node.position;\n\n\t\t\t\tif (node.position[0] < sourceNode.position[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\t\tname: nodeName,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tposition: [node.position[0] + margin, node.position[1]],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t\tthis.onNodeMoved(node);\n\n\t\t\t\tif (\n\t\t\t\t\t(recordHistory && oldPosition[0] !== updateInformation.properties.position[0]) ||\n\t\t\t\t\toldPosition[1] !== updateInformation.properties.position[1]\n\t\t\t\t) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\t\tnew MoveNodeCommand(nodeName, oldPosition, updateInformation.properties.position),\n\t\t\t\t\t\trecordHistory,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tcutNodes(nodes: INode[]) {\n\t\t\tconst deleteCopiedNodes = !this.isReadOnlyRoute && !this.readOnlyEnv;\n\t\t\tthis.copyNodes(nodes, deleteCopiedNodes);\n\t\t\tif (deleteCopiedNodes) {\n\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t}\n\t\t},\n\n\t\tcopyNodes(nodes: INode[], isCut = false) {\n\t\t\tvoid this.getNodesToSave(nodes).then((data) => {\n\t\t\t\tconst workflowToCopy: IWorkflowToShare = {\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tinstanceId: this.rootStore.instanceId,\n\t\t\t\t\t},\n\t\t\t\t\t...data,\n\t\t\t\t};\n\n\t\t\t\tthis.removeForeignCredentialsFromWorkflow(\n\t\t\t\t\tworkflowToCopy,\n\t\t\t\t\tthis.credentialsStore.allCredentials,\n\t\t\t\t);\n\n\t\t\t\tconst nodeData = JSON.stringify(workflowToCopy, null, 2);\n\n\t\t\t\tthis.copyToClipboard(nodeData);\n\t\t\t\tif (data.nodes.length > 0) {\n\t\t\t\t\tif (!isCut) {\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: 'Copied!',\n\t\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.$telemetry.track('User copied nodes', {\n\t\t\t\t\t\tnode_types: data.nodes.map((node) => node.type),\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tasync stopExecution() {\n\t\t\tconst executionId = this.workflowsStore.activeExecutionId;\n\t\t\tif (executionId === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.stopExecutionInProgress = true;\n\t\t\t\tawait this.workflowsStore.stopCurrentExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\t// Execution stop might fail when the execution has already finished. Let's treat this here.\n\t\t\t\tconst execution = await this.workflowsStore.getExecution(executionId);\n\n\t\t\t\tif (execution === undefined) {\n\t\t\t\t\t// execution finished but was not saved (e.g. due to low connectivity)\n\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution({\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tdata: { finished: true, stoppedAt: new Date() },\n\t\t\t\t\t});\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\t\t\tthis.titleSet(this.workflowsStore.workflowName, 'IDLE');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.unsaved.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeView.showMessage.stopExecutionCatch.unsaved.message',\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else if (execution?.finished) {\n\t\t\t\t\t// execution finished before it could be stopped\n\n\t\t\t\t\tconst executedData = {\n\t\t\t\t\t\tdata: execution.data,\n\t\t\t\t\t\tfinished: execution.finished,\n\t\t\t\t\t\tmode: execution.mode,\n\t\t\t\t\t\tstartedAt: execution.startedAt,\n\t\t\t\t\t\tstoppedAt: execution.stoppedAt,\n\t\t\t\t\t} as IRun;\n\t\t\t\t\tconst pushData = {\n\t\t\t\t\t\tdata: executedData,\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tretryOf: execution.retryOf,\n\t\t\t\t\t} as IPushDataExecutionFinished;\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution(pushData);\n\t\t\t\t\tthis.titleSet(execution.workflowData.name, 'IDLE');\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.workflowsStore.setWorkflowExecutionData(executedData as IExecutionResponse);\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.message'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.stopExecution.title'));\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.stopExecutionInProgress = false;\n\n\t\t\tvoid this.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst trackProps = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(workflowData as IWorkflowBase, this.getNodeTypes())\n\t\t\t\t\t\t\t.nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\n\t\t\t\tthis.$telemetry.track('User clicked stop workflow execution', trackProps);\n\t\t\t});\n\t\t},\n\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.stopWaitingForWebhook.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * This method gets called when data got pasted into the window\n\t\t */\n\t\tasync receivedCopyPasteData(plainTextData: string): Promise<void> {\n\t\t\tif (this.readOnlyEnv) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentTab = getNodeViewTab(this.$route);\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW) {\n\t\t\t\tlet workflowData: IWorkflowDataUpdate | undefined;\n\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Check if it is an URL which could contain workflow data\n\t\t\t\tif (plainTextData.match(/^http[s]?:\\/\\/.*\\.json$/i)) {\n\t\t\t\t\t// Pasted data points to a possible workflow JSON file\n\n\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst importConfirm = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.receivedCopyPasteData.message', {\n\t\t\t\t\t\t\tinterpolate: { plainTextData },\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.receivedCopyPasteData.headline'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.receivedCopyPasteData.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.receivedCopyPasteData.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tif (importConfirm !== MODAL_CONFIRM) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tworkflowData = await this.getWorkflowDataFromUrl(plainTextData);\n\t\t\t\t\tif (workflowData === undefined) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Pasted data is is possible workflow data\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Check first if it is valid JSON\n\t\t\t\t\t\tworkflowData = JSON.parse(plainTextData);\n\n\t\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// Is no valid JSON so ignore\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn this.importWorkflowData(workflowData!, 'paste', false);\n\t\t\t}\n\t\t},\n\n\t\t// Returns the workflow data from a given URL. If no data gets found or\n\t\t// data is invalid it returns undefined and displays an error message by itself.\n\t\tasync getWorkflowDataFromUrl(url: string): Promise<IWorkflowDataUpdate | undefined> {\n\t\t\tlet workflowData: IWorkflowDataUpdate;\n\n\t\t\tthis.startLoading();\n\t\t\ttry {\n\t\t\t\tworkflowData = await this.workflowsStore.getWorkflowFromUrl(url);\n\t\t\t} catch (error) {\n\t\t\t\tthis.stopLoading();\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.getWorkflowDataFromUrl.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.stopLoading();\n\n\t\t\treturn workflowData;\n\t\t},\n\n\t\t// Imports the given workflow data into the current workflow\n\t\tasync importWorkflowData(\n\t\t\tworkflowData: IWorkflowToShare,\n\t\t\tsource: string,\n\t\t\timportTags = true,\n\t\t): Promise<void> {\n\t\t\t// If it is JSON check if it looks on the first look like data we can use\n\t\t\tif (!workflowData.hasOwnProperty('nodes') || !workflowData.hasOwnProperty('connections')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst nodeIdMap: { [prev: string]: string } = {};\n\t\t\t\tif (workflowData.nodes) {\n\t\t\t\t\tworkflowData.nodes.forEach((node: INode) => {\n\t\t\t\t\t\t//generate new webhookId if workflow already contains a node with the same webhookId\n\t\t\t\t\t\tif (node.webhookId && UPDATE_WEBHOOK_ID_NODE_TYPES.includes(node.type)) {\n\t\t\t\t\t\t\tconst isDuplicate = Object.values(this.getCurrentWorkflow().nodes).some(\n\t\t\t\t\t\t\t\t(n) => n.webhookId === node.webhookId,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (isDuplicate) {\n\t\t\t\t\t\t\t\tnode.webhookId = uuid();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// set all new ids when pasting/importing workflows\n\t\t\t\t\t\tif (node.id) {\n\t\t\t\t\t\t\tconst newId = uuid();\n\t\t\t\t\t\t\tnodeIdMap[newId] = node.id;\n\t\t\t\t\t\t\tnode.id = newId;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.id = uuid();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.removeUnknownCredentials(workflowData);\n\n\t\t\t\tconst currInstanceId = this.rootStore.instanceId;\n\n\t\t\t\tconst nodeGraph = JSON.stringify(\n\t\t\t\t\tTelemetryHelpers.generateNodesGraph(workflowData as IWorkflowBase, this.getNodeTypes(), {\n\t\t\t\t\t\tnodeIdMap,\n\t\t\t\t\t\tsourceInstanceId:\n\t\t\t\t\t\t\tworkflowData.meta && workflowData.meta.instanceId !== currInstanceId\n\t\t\t\t\t\t\t\t? workflowData.meta.instanceId\n\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t}).nodeGraph,\n\t\t\t\t);\n\t\t\t\tif (source === 'paste') {\n\t\t\t\t\tthis.$telemetry.track('User pasted nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else if (source === 'duplicate') {\n\t\t\t\t\tthis.$telemetry.track('User duplicated nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.$telemetry.track('User imported workflow', {\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// By default we automatically deselect all the currently\n\t\t\t\t// selected nodes and select the new ones\n\t\t\t\tthis.deselectAllNodes();\n\n\t\t\t\t// Fix the node position as it could be totally offscreen\n\t\t\t\t// and the pasted nodes would so not be directly visible to\n\t\t\t\t// the user\n\t\t\t\tthis.updateNodePositions(\n\t\t\t\t\tworkflowData,\n\t\t\t\t\tNodeViewUtils.getNewNodePosition(this.nodes, this.lastClickPosition),\n\t\t\t\t);\n\n\t\t\t\tconst data = await this.addNodesToWorkflow(workflowData);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdata.nodes!.forEach((node: INodeUi) => {\n\t\t\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tconst tagsEnabled = this.settingsStore.areTagsEnabled;\n\t\t\t\tif (importTags && tagsEnabled && Array.isArray(workflowData.tags)) {\n\t\t\t\t\tconst allTags = await this.tagsStore.fetchAll();\n\t\t\t\t\tconst tagNames = new Set(allTags.map((tag) => tag.name));\n\n\t\t\t\t\tconst workflowTags = workflowData.tags as ITag[];\n\t\t\t\t\tconst notFound = workflowTags.filter((tag) => !tagNames.has(tag.name));\n\n\t\t\t\t\tconst creatingTagPromises: Array<Promise<ITag>> = [];\n\t\t\t\t\tfor (const tag of notFound) {\n\t\t\t\t\t\tconst creationPromise = this.tagsStore.create(tag.name).then((tag: ITag) => {\n\t\t\t\t\t\t\tallTags.push(tag);\n\t\t\t\t\t\t\treturn tag;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcreatingTagPromises.push(creationPromise);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait Promise.all(creatingTagPromises);\n\n\t\t\t\t\tconst tagIds = workflowTags.reduce((accu: string[], imported: ITag) => {\n\t\t\t\t\t\tconst tag = allTags.find((tag) => tag.name === imported.name);\n\t\t\t\t\t\tif (tag) {\n\t\t\t\t\t\t\taccu.push(tag.id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn accu;\n\t\t\t\t\t}, []);\n\n\t\t\t\t\tthis.workflowsStore.addWorkflowTagIds(tagIds);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.importWorkflowData.title'));\n\t\t\t}\n\t\t},\n\n\t\tremoveUnknownCredentials(workflow: IWorkflowToShare) {\n\t\t\tif (!workflow?.nodes) return;\n\n\t\t\tfor (const node of workflow.nodes) {\n\t\t\t\tif (!node.credentials) continue;\n\n\t\t\t\tfor (const [name, credential] of Object.entries(node.credentials)) {\n\t\t\t\t\tif (credential.id === null) continue;\n\n\t\t\t\t\tif (!this.credentialsStore.getCredentialById(credential.id)) {\n\t\t\t\t\t\tdelete node.credentials[name];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonDragOver(event: DragEvent) {\n\t\t\tevent.preventDefault();\n\t\t},\n\n\t\tasync onDrop(event: DragEvent) {\n\t\t\tif (!event.dataTransfer) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst dropData = jsonParse<AddedNodesAndConnections>(\n\t\t\t\tevent.dataTransfer.getData(DRAG_EVENT_DATA_KEY),\n\t\t\t);\n\t\t\tif (dropData) {\n\t\t\t\tconst mousePosition = this.getMousePositionWithinNodeView(event);\n\t\t\t\tconst insertNodePosition = [\n\t\t\t\t\tmousePosition[0] - NodeViewUtils.NODE_SIZE / 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tmousePosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t] as XYPosition;\n\n\t\t\t\tawait this.onAddNodes(dropData, true, insertNodePosition);\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t}\n\t\t},\n\n\t\tnodeDeselectedByName(nodeName: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeDeselected(node);\n\t\t\t}\n\t\t},\n\n\t\tnodeSelectedByName(nodeName: string, setActive = false, deselectAllOthers?: boolean) {\n\t\t\tif (deselectAllOthers === true) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeSelected(node);\n\t\t\t\tthis.uiStore.lastSelectedNode = node.name;\n\t\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = null;\n\t\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid = null;\n\t\t\t\tthis.canvasStore.lastSelectedConnection = null;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\t\tif (setActive) {\n\t\t\t\t\tthis.ndvStore.activeNodeName = node.name;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowMaxNodeTypeError(nodeTypeData: INodeTypeDescription) {\n\t\t\tconst maxNodes = nodeTypeData.maxNodes;\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.title'),\n\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.message', {\n\t\t\t\t\tadjustToNumber: maxNodes,\n\t\t\t\t\tinterpolate: { nodeTypeDataDisplayName: nodeTypeData.displayName },\n\t\t\t\t}),\n\t\t\t\ttype: 'error',\n\t\t\t\tduration: 0,\n\t\t\t});\n\t\t},\n\n\t\tasync getNewNodeWithDefaultCredential(\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t\toverrides: Partial<INodeUi>,\n\t\t) {\n\t\t\tlet nodeVersion = nodeTypeData.defaultVersion;\n\n\t\t\tif (nodeVersion === undefined) {\n\t\t\t\tnodeVersion = Array.isArray(nodeTypeData.version)\n\t\t\t\t\t? nodeTypeData.version.slice(-1)[0]\n\t\t\t\t\t: nodeTypeData.version;\n\t\t\t}\n\n\t\t\tconst newNodeData: INodeUi = {\n\t\t\t\tid: uuid(),\n\t\t\t\tname: overrides.name ?? (nodeTypeData.defaults.name as string),\n\t\t\t\ttype: nodeTypeData.name,\n\t\t\t\ttypeVersion: nodeVersion,\n\t\t\t\tposition: [0, 0],\n\t\t\t\tparameters: {},\n\t\t\t};\n\n\t\t\tconst credentialPerType = nodeTypeData.credentials\n\t\t\t\t?.map((type) => this.credentialsStore.getUsableCredentialByType(type.name))\n\t\t\t\t.flat();\n\n\t\t\tif (credentialPerType && credentialPerType.length === 1) {\n\t\t\t\tconst defaultCredential = credentialPerType[0];\n\n\t\t\t\tconst selectedCredentials = this.credentialsStore.getCredentialById(defaultCredential.id);\n\t\t\t\tconst selected = { id: selectedCredentials.id, name: selectedCredentials.name };\n\t\t\t\tconst credentials = {\n\t\t\t\t\t[defaultCredential.type]: selected,\n\t\t\t\t};\n\n\t\t\t\tawait this.loadNodesProperties(\n\t\t\t\t\t[newNodeData].map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t\t);\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(newNodeData.type, newNodeData.typeVersion);\n\t\t\t\tconst nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType?.properties || [],\n\t\t\t\t\t{},\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnewNodeData,\n\t\t\t\t);\n\n\t\t\t\tif (nodeTypeData.credentials) {\n\t\t\t\t\tconst authentication = nodeTypeData.credentials.find(\n\t\t\t\t\t\t(type) => type.name === defaultCredential.type,\n\t\t\t\t\t);\n\t\t\t\t\tif (authentication?.displayOptions?.hide) {\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst authDisplayOptions = authentication?.displayOptions?.show;\n\t\t\t\t\tif (!authDisplayOptions) {\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Object.keys(authDisplayOptions).length === 1 && authDisplayOptions.authentication) {\n\t\t\t\t\t\t// ignore complex case when there's multiple dependencies\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\n\t\t\t\t\t\tlet parameters: { [key: string]: string } = {};\n\t\t\t\t\t\tfor (const displayOption of Object.keys(authDisplayOptions)) {\n\t\t\t\t\t\t\tif (nodeParameters && !nodeParameters[displayOption]) {\n\t\t\t\t\t\t\t\tparameters = {};\n\t\t\t\t\t\t\t\tnewNodeData.credentials = undefined;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst optionValue = authDisplayOptions[displayOption]?.[0];\n\t\t\t\t\t\t\tif (optionValue && typeof optionValue === 'string') {\n\t\t\t\t\t\t\t\tparameters[displayOption] = optionValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnewNodeData.parameters = {\n\t\t\t\t\t\t\t\t...newNodeData.parameters,\n\t\t\t\t\t\t\t\t...parameters,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newNodeData;\n\t\t},\n\n\t\tasync injectNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tconst nodeTypeData: INodeTypeDescription | null =\n\t\t\t\tthis.nodeTypesStore.getNodeType(nodeTypeName);\n\n\t\t\tif (nodeTypeData === null) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.addNodeButton.title'),\n\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.addNodeButton.message', {\n\t\t\t\t\t\tinterpolate: { nodeTypeName },\n\t\t\t\t\t}),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tnodeTypeData.maxNodes !== undefined &&\n\t\t\t\tthis.getNodeTypeCount(nodeTypeName) >= nodeTypeData.maxNodes\n\t\t\t) {\n\t\t\t\tthis.showMaxNodeTypeError(nodeTypeData);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newNodeData = await this.getNewNodeWithDefaultCredential(nodeTypeData, {\n\t\t\t\tname: options.name,\n\t\t\t});\n\n\t\t\t// when pulling new connection from node or injecting into a connection\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\tif (options.position) {\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\tthis.canvasStore.getNodesWithPlaceholderNode(),\n\t\t\t\t\toptions.position,\n\t\t\t\t);\n\t\t\t} else if (lastSelectedNode) {\n\t\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t// set when injecting into a connection\n\t\t\t\t\tconst [diffX] = NodeViewUtils.getConnectorLengths(lastSelectedConnection);\n\t\t\t\t\tif (diffX <= NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES) {\n\t\t\t\t\t\tthis.pushDownstreamNodes(\n\t\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t\t\tNodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\ttrackHistory,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// set when pulling connections\n\t\t\t\tif (this.canvasStore.newNodeInsertPosition) {\n\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, [\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[0] + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t\t]);\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\t} else {\n\t\t\t\t\tlet yOffset = 0;\n\t\t\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (sourceNodeType) {\n\t\t\t\t\t\t\tconst offsets = [\n\t\t\t\t\t\t\t\t[-100, 100],\n\t\t\t\t\t\t\t\t[-140, 0, 140],\n\t\t\t\t\t\t\t\t[-240, -100, 100, 240],\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tconst sourceNodeOutputs = NodeHelpers.getNodeOutputs(\n\t\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\t\tsourceNodeType,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst sourceNodeOutputTypes = NodeHelpers.getConnectionTypes(sourceNodeOutputs);\n\n\t\t\t\t\t\t\tconst sourceNodeOutputMainOutputs = sourceNodeOutputTypes.filter(\n\t\t\t\t\t\t\t\t(output) => output === NodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (sourceNodeOutputMainOutputs.length > 1) {\n\t\t\t\t\t\t\t\tconst offset = offsets[sourceNodeOutputMainOutputs.length - 2];\n\t\t\t\t\t\t\t\tconst sourceOutputIndex = lastSelectedConnection.__meta\n\t\t\t\t\t\t\t\t\t? lastSelectedConnection.__meta.sourceOutputIndex\n\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tyOffset = offset[sourceOutputIndex];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// It fails when the outputs are an expression. As those nodes have\n\t\t\t\t\t\t// normally no outputs by default and the only reason we need the\n\t\t\t\t\t\t// outputs here is to calculate the position, it is fine to assume\n\t\t\t\t\t\t// that they have no outputs and are so treated as a regular node\n\t\t\t\t\t\t// with only \"main\" outputs.\n\t\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, newNodeData, nodeTypeData);\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t\t\tconst lastSelectedNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t);\n\n\t\t\t\t\t// If node has only scoped outputs, position it below the last selected node\n\t\t\t\t\tif (\n\t\t\t\t\t\toutputTypes.length > 0 &&\n\t\t\t\t\t\toutputTypes.every((outputName) => outputName !== NodeConnectionType.Main)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst lastSelectedNodeWorkflow = workflow.getNode(lastSelectedNode.name);\n\t\t\t\t\t\tconst lastSelectedInputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNodeWorkflow!,\n\t\t\t\t\t\t\tlastSelectedNodeType!,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst lastSelectedInputTypes = NodeHelpers.getConnectionTypes(lastSelectedInputs);\n\n\t\t\t\t\t\tconst scopedConnectionIndex = (lastSelectedInputTypes || [])\n\t\t\t\t\t\t\t.filter((input) => input !== NodeConnectionType.Main)\n\t\t\t\t\t\t\t.findIndex((inputType) => outputs[0] === inputType);\n\n\t\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tlastSelectedNode.position[0] +\n\t\t\t\t\t\t\t\t\t(NodeViewUtils.NODE_SIZE /\n\t\t\t\t\t\t\t\t\t\t(Math.max(lastSelectedNodeType?.inputs?.length ?? 1), 1)) *\n\t\t\t\t\t\t\t\t\t\tscopedConnectionIndex,\n\t\t\t\t\t\t\t\tlastSelectedNode.position[1] + NodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Has only main outputs or no outputs at all\n\t\t\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\tlastSelectedNodeType!,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst inputsTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\t\t\tlet pushOffset = NodeViewUtils.PUSH_NODES_OFFSET;\n\t\t\t\t\t\tif (!!inputsTypes.find((input) => input !== NodeConnectionType.Main)) {\n\t\t\t\t\t\t\t// If the node has scoped inputs, push it down a bit more\n\t\t\t\t\t\t\tpushOffset += 150;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a node is active then add the new node directly after the current one\n\t\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[lastSelectedNode.position[0] + pushOffset, lastSelectedNode.position[1] + yOffset],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If added node is a trigger and it's the first one added to the canvas\n\t\t\t\t// we place it at canvasAddButtonPosition to replace the canvas add button\n\t\t\t\tconst position =\n\t\t\t\t\tthis.nodeTypesStore.isTriggerNode(nodeTypeName) && !this.containsTrigger\n\t\t\t\t\t\t? this.canvasStore.canvasAddButtonPosition\n\t\t\t\t\t\t: // If no node is active find a free spot\n\t\t\t\t\t\t (this.lastClickPosition as XYPosition);\n\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, position);\n\t\t\t}\n\n\t\t\tconst localizedName = this.locale.localizeNodeName(newNodeData.name, newNodeData.type);\n\n\t\t\tnewNodeData.name = this.uniqueNodeName(localizedName);\n\n\t\t\tif (nodeTypeData.webhooks?.length) {\n\t\t\t\tnewNodeData.webhookId = uuid();\n\t\t\t}\n\n\t\t\tawait this.addNodes([newNodeData], undefined, trackHistory);\n\t\t\tthis.workflowsStore.setNodePristine(newNodeData.name, true);\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tif (nodeTypeName === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addSticky', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('nodeView.addNodeButton', { nodeTypeName });\n\t\t\t\tuseSegment().trackAddedTrigger(nodeTypeName);\n\t\t\t\tconst trackProperties: ITelemetryTrackProperties = {\n\t\t\t\t\tnode_type: nodeTypeName,\n\t\t\t\t\tnode_version: newNodeData.typeVersion,\n\t\t\t\t\tis_auto_add: isAutoAdd,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tdrag_and_drop: options.dragAndDrop,\n\t\t\t\t};\n\n\t\t\t\tif (lastSelectedNode) {\n\t\t\t\t\ttrackProperties.input_node_type = lastSelectedNode.type;\n\t\t\t\t}\n\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addNodeButton', trackProperties);\n\t\t\t}\n\n\t\t\t// Automatically deselect all nodes and select the current one and also active\n\t\t\t// current node. But only if it's added manually by the user (not by undo/redo mechanism)\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.nodeSelectedByName(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\tshowDetail && nodeTypeName !== STICKY_NODE_TYPE,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn newNodeData;\n\t\t},\n\t\tgetConnection(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOuputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t): IConnection | undefined {\n\t\t\tconst nodeConnections =\n\t\t\t\tthis.workflowsStore.outgoingConnectionsByNodeName(sourceNodeName)[type];\n\t\t\tif (nodeConnections) {\n\t\t\t\tconst connections: IConnection[] | null = nodeConnections[sourceNodeOutputIndex];\n\n\t\t\t\tif (connections) {\n\t\t\t\t\treturn connections.find(\n\t\t\t\t\t\t(connection: IConnection) =>\n\t\t\t\t\t\t\tconnection.node === targetNodeName && connection.index === targetNodeOuputIndex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tconnectTwoNodes(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOutputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst targetNode = this.workflowsStore.getNodeByName(targetNodeName);\n\n\t\t\tif (\n\t\t\t\tsourceNode &&\n\t\t\t\ttargetNode &&\n\t\t\t\t!this.checkNodeConnectionAllowed(sourceNode, targetNode, type)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.getConnection(\n\t\t\t\t\tsourceNodeName,\n\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\ttargetNodeName,\n\t\t\t\t\ttargetNodeOutputIndex,\n\t\t\t\t\ttype,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst connectionData = [\n\t\t\t\t{\n\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: sourceNodeOutputIndex,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: targetNodeOutputIndex,\n\t\t\t\t},\n\t\t\t] as [IConnection, IConnection];\n\n\t\t\tthis.__addConnection(connectionData);\n\t\t},\n\t\tasync addNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tconst lastSelectedNodeOutputIndex = this.uiStore.lastSelectedNodeOutputIndex;\n\t\t\tconst lastSelectedNodeEndpointUuid = this.uiStore.lastSelectedNodeEndpointUuid;\n\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst newNodeData = await this.injectNode(\n\t\t\t\tnodeTypeName,\n\t\t\t\toptions,\n\t\t\t\tshowDetail,\n\t\t\t\ttrackHistory,\n\t\t\t\tisAutoAdd,\n\t\t\t);\n\t\t\tif (!newNodeData) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst outputIndex = lastSelectedNodeOutputIndex || 0;\n\t\t\tconst targetEndpoint = lastSelectedNodeEndpointUuid || '';\n\n\t\t\t// Handle connection of scoped_endpoint types\n\t\t\tif (lastSelectedNodeEndpointUuid && !isAutoAdd) {\n\t\t\t\tconst lastSelectedEndpoint = this.instance.getEndpoint(lastSelectedNodeEndpointUuid);\n\t\t\t\tif (\n\t\t\t\t\tlastSelectedEndpoint &&\n\t\t\t\t\tthis.checkNodeConnectionAllowed(\n\t\t\t\t\t\tlastSelectedNode!,\n\t\t\t\t\t\tnewNodeData,\n\t\t\t\t\t\tlastSelectedEndpoint.scope as NodeConnectionType,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconst connectionType = lastSelectedEndpoint.scope as ConnectionTypes;\n\t\t\t\t\tconst newNodeElement = this.instance.getManagedElement(newNodeData.id);\n\t\t\t\t\tconst newNodeConnections = this.instance.getEndpoints(newNodeElement);\n\t\t\t\t\tconst viableConnection = newNodeConnections.find((conn) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tconn.scope === connectionType &&\n\t\t\t\t\t\t\tlastSelectedEndpoint.parameters.connection !== conn.parameters.connection\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.instance?.connect({\n\t\t\t\t\t\tuuids: [targetEndpoint, viableConnection?.uuid || ''],\n\t\t\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If a node is last selected then connect between the active and its child ones\n\t\t\tif (lastSelectedNode && !isAutoAdd) {\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\tif (lastSelectedConnection?.__meta) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(lastSelectedConnection, trackHistory);\n\n\t\t\t\t\tconst targetNodeName = lastSelectedConnection.__meta.targetNodeName;\n\t\t\t\t\tconst targetOutputIndex = lastSelectedConnection.__meta.targetOutputIndex;\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Connect active node to the newly created one\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\t\tgetNodeCreatorFilter(nodeName: string, outputType?: NodeConnectionType) {\n\t\t\tlet filter;\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(nodeName);\n\t\t\tif (!workflowNode) return { nodes: [] };\n\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\tworkflowNode?.type,\n\t\t\t\tworkflowNode.typeVersion,\n\t\t\t);\n\t\t\tif (nodeType) {\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);\n\n\t\t\t\tconst filterFound = inputs.filter((input) => {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== outputType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t}) as INodeInputConfiguration[];\n\n\t\t\t\tif (filterFound.length) {\n\t\t\t\t\tfilter = filterFound[0].filter;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filter;\n\t\t},\n\t\tinsertNodeAfterSelected(info: {\n\t\t\tsourceId: string;\n\t\t\tindex: number;\n\t\t\teventSource: NodeCreatorOpenSource;\n\t\t\tconnection?: Connection;\n\t\t\tnodeCreatorView?: string;\n\t\t\toutputType?: NodeConnectionType;\n\t\t\tendpointUuid?: string;\n\t\t}) {\n\t\t\tconst type = info.outputType ?? NodeConnectionType.Main;\n\t\t\t// Get the node and set it as active that new nodes\n\t\t\t// which get created get automatically connected\n\t\t\t// to it.\n\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.sourceId);\n\t\t\tif (!sourceNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.uiStore.lastSelectedNode = sourceNode.name;\n\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid =\n\t\t\t\tinfo.endpointUuid ?? info.connection?.target.jtk?.endpoint.uuid;\n\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = info.index;\n\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\tif (info.connection) {\n\t\t\t\tthis.canvasStore.lastSelectedConnection = info.connection;\n\t\t\t}\n\n\t\t\tthis.onToggleNodeCreator({\n\t\t\t\tsource: info.eventSource,\n\t\t\t\tcreateNodeActive: true,\n\t\t\t\tnodeCreatorView: info.nodeCreatorView,\n\t\t\t});\n\n\t\t\t// TODO: The animation is a bit glitchy because we're updating view stack immediately\n\t\t\t// after the node creator is opened\n\t\t\tconst isOutput = info.connection?.endpoints[0].parameters.connection === 'source';\n\t\t\tconst isScopedConnection =\n\t\t\t\ttype !== NodeConnectionType.Main && Object.values(NodeConnectionType).includes(type);\n\n\t\t\tif (isScopedConnection) {\n\t\t\t\tuseViewStacks()\n\t\t\t\t\t.gotoCompatibleConnectionView(\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tisOutput,\n\t\t\t\t\t\tthis.getNodeCreatorFilter(sourceNode.name, type),\n\t\t\t\t\t)\n\t\t\t\t\t.catch((e) => {});\n\t\t\t}\n\t\t},\n\t\tasync onEventConnectionAbort(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.dropPrevented) {\n\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(connection.parameters.nodeId);\n\t\t\t\t\tconst connectionType = connection.parameters.type ?? NodeConnectionType.Main;\n\t\t\t\t\tconst overrideTargetEndpoint = connection?.connector\n\t\t\t\t\t\t?.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (sourceNode) {\n\t\t\t\t\t\tconst isTarget = connection.parameters.connection === 'target';\n\t\t\t\t\t\tconst sourceNodeName = isTarget ? this.pullConnActiveNodeName : sourceNode.name;\n\t\t\t\t\t\tconst targetNodeName = isTarget ? sourceNode.name : this.pullConnActiveNodeName;\n\t\t\t\t\t\tconst outputIndex = connection.parameters.index;\n\t\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: connection.parameters.nodeId,\n\t\t\t\t\tindex: connection.parameters.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t\t\t\tconnection,\n\t\t\t\t\toutputType: connection.parameters.type,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tcheckNodeConnectionAllowed(\n\t\t\tsourceNode: INodeUi,\n\t\t\ttargetNode: INodeUi,\n\t\t\ttargetInfoType: NodeConnectionType,\n\t\t): boolean {\n\t\t\tconst targetNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\ttargetNode.type,\n\t\t\t\ttargetNode.typeVersion,\n\t\t\t);\n\n\t\t\tif (targetNodeType?.inputs?.length) {\n\t\t\t\tconst workflow = this.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(targetNode.name);\n\t\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\t\tif (targetNodeType) {\n\t\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, targetNodeType);\n\t\t\t\t}\n\n\t\t\t\tfor (const input of inputs || []) {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== targetInfoType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (input.filter.nodes.length) {\n\t\t\t\t\t\tif (!input.filter.nodes.includes(sourceNode.type)) {\n\t\t\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.title'),\n\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.message', {\n\t\t\t\t\t\t\t\t\tinterpolate: { sourceNodeName: sourceNode.name, targetNodeName: targetNode.name },\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tonInterceptBeforeDrop(info: BeforeDropParams) {\n\t\t\ttry {\n\t\t\t\tlet sourceInfo: ComponentParameters;\n\t\t\t\tlet targetInfo: ComponentParameters;\n\t\t\t\tif (info.connection.endpoints[0].parameters.connection === 'target') {\n\t\t\t\t\tsourceInfo = info.dropEndpoint.parameters;\n\t\t\t\t\ttargetInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t} else {\n\t\t\t\t\tsourceInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t\ttargetInfo = info.dropEndpoint.parameters;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tsourceInfo.type !== targetInfo.type ||\n\t\t\t\t\tsourceInfo.connection === targetInfo.connection\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(sourceInfo.nodeId);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeById(targetInfo.nodeId);\n\n\t\t\t\tconst sourceNodeName = sourceNode?.name || '';\n\t\t\t\tconst targetNodeName = targetNode?.name || '';\n\n\t\t\t\tif (sourceNode && targetNode) {\n\t\t\t\t\tif (!this.checkNodeConnectionAllowed(sourceNode, targetNode, targetInfo.type)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check for duplicates\n\t\t\t\tif (\n\t\t\t\t\tthis.getConnection(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetInfo.index,\n\t\t\t\t\t\tsourceInfo.type,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tonEventConnection(info: ConnectionEstablishedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\t// so switch them around if necessary\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst sourceInfo = info.sourceEndpoint.parameters;\n\t\t\t\tconst targetInfo = info.targetEndpoint.parameters;\n\n\t\t\t\tconst sourceNodeName = this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name;\n\t\t\t\tconst targetNodeName = this.workflowsStore.getNodeById(targetInfo.nodeId)?.name;\n\n\t\t\t\tif (sourceNodeName && targetNodeName) {\n\t\t\t\t\tinfo.connection.__meta = {\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceOutputIndex: sourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex: targetInfo.index,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tNodeViewUtils.resetConnection(info.connection);\n\t\t\t\tNodeViewUtils.moveBackInputLabelPosition(info.targetEndpoint);\n\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tthis.dropPrevented = true;\n\t\t\t\tthis.workflowsStore.addConnection({ connection: connectionData });\n\n\t\t\t\tif (!this.isReadOnlyRoute && !this.readOnlyEnv) {\n\t\t\t\t\tNodeViewUtils.hideOutputNameLabel(info.sourceEndpoint);\n\t\t\t\t\tNodeViewUtils.addConnectionActionsOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\t\t\tsourceId: info.sourceEndpoint.parameters.nodeId,\n\t\t\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t\t\t\tconnection: info.connection,\n\t\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tconst endpointArrow = NodeViewUtils.getOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\tOVERLAY_ENDPOINT_ARROW_ID,\n\t\t\t\t\t);\n\t\t\t\t\tif (sourceInfo.type !== NodeConnectionType.Main) {\n\t\t\t\t\t\t// Not \"main\" connections get a different connection style\n\t\t\t\t\t\tinfo.connection.setPaintStyle(\n\t\t\t\t\t\t\tgetConnectorPaintStyleData(info.connection, info.sourceEndpoint.parameters.category),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tendpointArrow?.setVisible(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.dropPrevented = false;\n\t\t\t\tif (!this.isLoading) {\n\t\t\t\t\tthis.uiStore.stateIsDirty = true;\n\t\t\t\t\tif (!this.suspendRecordingDetachedConnections) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddConnectionCommand(connectionData));\n\t\t\t\t\t}\n\t\t\t\t\t// When we add multiple nodes, this event could be fired hundreds of times for large workflows.\n\t\t\t\t\t// And because the updateNodesInputIssues() method is quite expensive, we only call it if not in insert mode\n\t\t\t\t\tif (!this.isInsertingNodes) {\n\t\t\t\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\t\t\t\tthis.resetEndpointsErrors();\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\t\t\t\tinfo.source,\n\t\t\t\t\t\t\t\tinfo.target,\n\t\t\t\t\t\t\t\tinfo.connection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t\t\t\t? (info.connection.connector.canvas as HTMLElement)\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\taddConectionsTestData() {\n\t\t\tthis.instance.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\tconnection.source,\n\t\t\t\t\tconnection.target,\n\t\t\t\t\tconnection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t? (connection?.connector.canvas as HTMLElement)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\tonDragMove() {\n\t\t\tconst totalNodes = this.nodes.length;\n\t\t\tvoid this.callDebounced('updateConnectionsOverlays', {\n\t\t\t\tdebounceTime: totalNodes > 20 ? 200 : 0,\n\t\t\t});\n\t\t},\n\t\tupdateConnectionsOverlays() {\n\t\t\tthis.instance?.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\n\t\t\t\tObject.values(connection.overlays).forEach((overlay) => {\n\t\t\t\t\tif (!overlay.canvas) return;\n\t\t\t\t\tthis.instance?.repaint(overlay.canvas);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tisConnectionActive(connection: Connection | null) {\n\t\t\tif (!connection?.id || !this.activeConnection?.id) return false;\n\n\t\t\treturn this.activeConnection?.id === connection.id;\n\t\t},\n\t\tonConnectionMouseOver(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer !== undefined) {\n\t\t\t\t\tclearTimeout(this.exitTimer);\n\t\t\t\t\tthis.exitTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\tthis.enterTimer ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\tthis.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.enterTimer = setTimeout(() => {\n\t\t\t\t\t// If there is already an active connection then hide it first\n\t\t\t\t\tif (this.activeConnection && !this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t}\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tNodeViewUtils.showConnectionActions(connection);\n\t\t\t\t\t\tthis.activeConnection = connection;\n\t\t\t\t\t}\n\t\t\t\t}, 150);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMouseOut(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer) return;\n\n\t\t\t\tif (this.enterTimer) {\n\t\t\t\t\tclearTimeout(this.enterTimer);\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\t!this.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.exitTimer = setTimeout(() => {\n\t\t\t\t\tthis.exitTimer = undefined;\n\n\t\t\t\t\tif (connection && this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMoved(info: ConnectionMovedParams) {\n\t\t\ttry {\n\t\t\t\t// When a connection gets moved from one node to another it for some reason\n\t\t\t\t// calls the \"connection\" event but not the \"connectionDetached\" one. So we listen\n\t\t\t\t// additionally to the \"connectionMoved\" event and then only delete the existing connection.\n\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.connection);\n\n\t\t\t\tconst sourceInfo = info.connection.parameters;\n\t\t\t\tconst targetInfo = info.originalEndpoint.parameters;\n\n\t\t\t\tconst connectionInfo = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(targetInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t] as [IConnection, IConnection];\n\n\t\t\t\tthis.__removeConnection(connectionInfo, false);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonEndpointMouseOver(endpoint: Endpoint, mouse) {\n\t\t\t// This event seems bugged. It gets called constantly even when the mouse is not over the endpoint\n\t\t\t// if the endpoint has a connection attached to it. So we need to check if the mouse is actually over\n\t\t\t// the endpoint.\n\t\t\tif (!endpoint.isTarget || mouse.target !== endpoint.endpoint.canvas) return;\n\t\t\tthis.instance.setHover(endpoint, true);\n\t\t},\n\t\tonEndpointMouseOut(endpoint: Endpoint) {\n\t\t\tif (!endpoint.isTarget) return;\n\t\t\tthis.instance.setHover(endpoint, false);\n\t\t},\n\t\tasync onConnectionDetached(info: ConnectionDetachedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.targetEndpoint);\n\t\t\t\tNodeViewUtils.showOutputNameLabel(info.sourceEndpoint, info.connection);\n\n\t\t\t\tinfo.connection.removeOverlays();\n\t\t\t\tthis.__removeConnectionByConnectionInfo(info, false, false);\n\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\t// establish new connection when dragging connection from one node to another\n\t\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.connection.parameters.nodeId);\n\t\t\t\t\tconst sourceNodeName = sourceNode.name;\n\t\t\t\t\tconst outputIndex = info.connection.parameters.index;\n\t\t\t\t\tconst overrideTargetEndpoint = info.connection.connector\n\t\t\t\t\t\t.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (connectionInfo) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t\t}\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\tthis.pullConnActiveNodeName,\n\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\tawait this.$nextTick();\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t} else if (\n\t\t\t\t\t!this.historyStore.bulkInProgress &&\n\t\t\t\t\t!this.suspendRecordingDetachedConnections &&\n\t\t\t\t\tconnectionInfo\n\t\t\t\t) {\n\t\t\t\t\t// Ff connection being detached by user, save this in history\n\t\t\t\t\t// but skip if it's detached as a side effect of bulk undo/redo or node rename process\n\t\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionInfo, this);\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t\t}\n\n\t\t\t\tvoid this.nodeHelpers.updateNodesInputIssues();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDrag(connection: Connection) {\n\t\t\t// The overlays are visible by default so we need to hide the midpoint arrow\n\t\t\t// manually\n\t\t\tconnection.overlays['midpoint-arrow']?.setVisible(false);\n\t\t\ttry {\n\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\tthis.pullConnActive = true;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\tNodeViewUtils.hideConnectionActions(connection);\n\t\t\t\tNodeViewUtils.resetConnection(connection);\n\n\t\t\t\tconst scope = connection.scope as ConnectionTypes;\n\t\t\t\tconst scopedEndpoints = Array.from(\n\t\t\t\t\tdocument.querySelectorAll(`[data-jtk-scope-${scope}=true]`),\n\t\t\t\t);\n\t\t\t\tconst connectionType = connection.parameters.connection;\n\t\t\t\tconst requiredType = connectionType === 'source' ? 'target' : 'source';\n\n\t\t\t\tconst filteredEndpoints = scopedEndpoints.filter((el) => {\n\t\t\t\t\tconst endpoint = el.jtk.endpoint as Endpoint;\n\t\t\t\t\tif (!endpoint) return false;\n\n\t\t\t\t\t// Prevent snapping(but not connecting) to the same node\n\t\t\t\t\tconst isSameNode = endpoint.parameters.nodeId === connection.parameters.nodeId;\n\t\t\t\t\tconst endpointType = endpoint.parameters.connection;\n\n\t\t\t\t\treturn !isSameNode && endpointType === requiredType;\n\t\t\t\t});\n\n\t\t\t\tconst onMouseMove = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tif (!connection) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst intersectingEndpoints = filteredEndpoints\n\t\t\t\t\t\t.filter((element: Element) => {\n\t\t\t\t\t\t\tconst endpoint = element.jtk.endpoint as Endpoint;\n\n\t\t\t\t\t\t\tif (element.classList.contains('jtk-floating-endpoint')) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst isEndpointIntersect = NodeViewUtils.isElementIntersection(element, e, 50);\n\t\t\t\t\t\t\tconst isNodeElementIntersect = NodeViewUtils.isElementIntersection(\n\t\t\t\t\t\t\t\tendpoint.element,\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t\t30,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (isEndpointIntersect || isNodeElementIntersect) {\n\t\t\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t\t\t\t\t\tif (!nodeType) return false;\n\n\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.sort((a, b) => {\n\t\t\t\t\t\t\tconst aEndpointIntersect = NodeViewUtils.calculateElementIntersection(a, e, 50);\n\t\t\t\t\t\t\tconst bEndpointIntersect = NodeViewUtils.calculateElementIntersection(b, e, 50);\n\n\t\t\t\t\t\t\t// If both intersections are null, treat them as equal\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y && !bEndpointIntersect?.y) {\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// If one intersection is null, sort the non-null one first\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y) return 1;\n\t\t\t\t\t\t\tif (!bEndpointIntersect?.y) return -1;\n\n\t\t\t\t\t\t\t// Otherwise, sort by ascending Y distance\n\t\t\t\t\t\t\treturn bEndpointIntersect.y - aEndpointIntersect.y;\n\t\t\t\t\t\t});\n\n\t\t\t\t\tif (intersectingEndpoints.length > 0) {\n\t\t\t\t\t\tconst intersectingEndpoint = intersectingEndpoints[0];\n\t\t\t\t\t\tconst endpoint = intersectingEndpoint.jtk.endpoint as Endpoint;\n\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\tthis.pullConnActiveNodeName = node?.name ?? null;\n\n\t\t\t\t\t\tNodeViewUtils.showDropConnectionState(connection, endpoint);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tNodeViewUtils.showPullConnectionState(connection);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst onMouseUp = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tthis.pullConnActive = false;\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = this.getMousePositionWithinNodeView(e);\n\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\twindow.removeEventListener('mousemove', onMouseMove);\n\t\t\t\t\twindow.removeEventListener('mouseup', onMouseUp);\n\n\t\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\tconnection: null,\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener('mousemove', onMouseMove);\n\t\t\t\twindow.addEventListener('touchmove', onMouseMove);\n\t\t\t\twindow.addEventListener('mouseup', onMouseUp);\n\t\t\t\twindow.addEventListener('touchend', onMouseMove);\n\n\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\ttype: connection.parameters.type,\n\t\t\t\t\tconnection: connection.parameters.connection,\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDragAbortDetached(connection: Connection) {\n\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t.flatMap((endpoints) => Object.values(endpoints))\n\t\t\t\t.filter((endpoint) => endpoint.endpoint.type === 'N8nPlus')\n\t\t\t\t.forEach((endpoint) => setTimeout(() => endpoint.instance.revalidate(endpoint.element), 0));\n\t\t},\n\t\tonPlusEndpointClick(endpoint: Endpoint) {\n\t\t\tif (endpoint?.__meta) {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonAddInputEndpointClick(endpoint: Endpoint) {\n\t\t\tif (endpoint?.__meta) {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.ADD_INPUT_ENDPOINT,\n\t\t\t\t\tnodeCreatorView: AI_NODE_CREATOR_VIEW,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tbindCanvasEvents() {\n\t\t\tif (this.eventsAttached) return;\n\t\t\tthis.instance.bind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.bind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.bind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\t\t\tthis.instance.bind(\n\t\t\t\t[EVENT_CONNECTION_DRAG, EVENT_CONNECTION_ABORT, EVENT_CONNECTION_DETACHED],\n\t\t\t\tthis.onConnectionDragAbortDetached,\n\t\t\t);\n\t\t\tthis.instance.bind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.bind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\n\t\t\tthis.eventsAttached = true;\n\t\t},\n\t\tunbindCanvasEvents() {\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.unbind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.unbind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.unbind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tunbindEndpointEventListeners(bind = true) {\n\t\t\tif (this.instance) {\n\t\t\t\t// Get all the endpoints and unbind the events\n\t\t\t\tconst elements = this.instance.getManagedElements();\n\t\t\t\tfor (const element of Object.values(elements)) {\n\t\t\t\t\tconst endpoints = element.endpoints;\n\t\t\t\t\tfor (const endpoint of endpoints || []) {\n\t\t\t\t\t\tconst endpointInstance = endpoint?.endpoint;\n\t\t\t\t\t\tif (endpointInstance && endpointInstance.type === N8nPlusEndpointType) {\n\t\t\t\t\t\t\t(endpointInstance as N8nPlusEndpoint).unbindEvents();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tonBeforeUnload(e: BeforeUnloadEvent) {\n\t\t\tif (this.isDemo || window.preventNodeViewBeforeUnload) {\n\t\t\t\treturn;\n\t\t\t} else if (this.uiStore.stateIsDirty) {\n\t\t\t\t// A bit hacky solution to detecting users leaving the page after prompt:\n\t\t\t\t// 1. Notify that workflow is closed straight away\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\t// 2. If user decided to stay on the page we notify that the workflow is opened again\n\t\t\t\tthis.unloadTimeout = setTimeout(() => {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowOpened(this.workflowsStore.workflowId);\n\t\t\t\t}, 5 * TIME.SECOND);\n\t\t\t\te.returnValue = true; //Gecko + IE\n\t\t\t\treturn true; //Gecko + Webkit, Safari, Chrome etc.\n\t\t\t} else {\n\t\t\t\tthis.startLoading(this.$locale.baseText('nodeView.redirecting'));\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tonUnload() {\n\t\t\t// This will fire if users decides to leave the page after prompted\n\t\t\t// Clear the interval to prevent the notification from being sent\n\t\t\tclearTimeout(this.unloadTimeout);\n\t\t},\n\t\tasync newWorkflow(): Promise<void> {\n\t\t\tthis.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tthis.workflowData = await this.workflowsStore.getNewWorkflowData();\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.workflowsStore.activeWorkflowExecution = null;\n\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tthis.canvasStore.setZoomLevel(1, [0, 0]);\n\t\t\tawait this.tryToAddWelcomeSticky();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.workflowsStore.activeWorkflowExecution = null;\n\t\t\tthis.stopLoading();\n\t\t},\n\t\tasync tryToAddWelcomeSticky(): Promise<void> {\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync initView(): Promise<void> {\n\t\t\tif (this.$route.params.action === 'workflowSave') {\n\t\t\t\t// In case the workflow got saved we do not have to run init\n\t\t\t\t// as only the route changed but all the needed data is already loaded\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.blankRedirect) {\n\t\t\t\tthis.blankRedirect = false;\n\t\t\t} else if (this.$route.name === VIEWS.TEMPLATE_IMPORT) {\n\t\t\t\tconst templateId = this.$route.params.id;\n\t\t\t\tawait this.openWorkflowTemplate(templateId);\n\t\t\t} else {\n\t\t\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tshowClose: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t\t\tconst saved = await this.saveCurrentWorkflow();\n\t\t\t\t\t\tif (saved) await this.settingsStore.fetchPromptsData();\n\t\t\t\t\t} else if (confirmModal === MODAL_CLOSE) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Load a workflow\n\t\t\t\tlet workflowId = null as string | null;\n\t\t\t\tif (this.$route.params.name) {\n\t\t\t\t\tworkflowId = this.$route.params.name;\n\t\t\t\t}\n\t\t\t\tif (workflowId !== null) {\n\t\t\t\t\tlet workflow: IWorkflowDb | undefined = undefined;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tworkflow = await this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.showError(error, this.$locale.baseText('openWorkflow.workflowNotFoundError'));\n\n\t\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\t\tname: VIEWS.NEW_WORKFLOW,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (workflow) {\n\t\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t\t\tawait this.checkAndInitDebugMode();\n\n\t\t\t\t\t\tif (workflow.meta?.onboardingId) {\n\t\t\t\t\t\t\tthis.$telemetry.track(\n\t\t\t\t\t\t\t\t`User opened workflow from onboarding template with ID ${workflow.meta.onboardingId}`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tworkflow_id: workflow.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twithPostHog: true,\n\t\t\t\t\t\t\t\t\twithAppCues: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (this.$route.meta?.nodeView === true) {\n\t\t\t\t\t// Create new workflow\n\t\t\t\t\tawait this.newWorkflow();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\t\tdocument.addEventListener('keyup', this.keyUp);\n\n\t\t\twindow.addEventListener('beforeunload', this.onBeforeUnload);\n\t\t\twindow.addEventListener('unload', this.onUnload);\n\t\t\t// Once view is initialized, pick up all toast notifications\n\t\t\t// waiting in the store and display them\n\t\t\tthis.showNotificationForViews([VIEWS.WORKFLOW, VIEWS.NEW_WORKFLOW]);\n\t\t},\n\t\tgetOutputEndpointUUID(\n\t\t\tnodeName: string,\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tindex: number,\n\t\t): string | null {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getOutputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\tgetInputEndpointUUID(nodeName: string, connectionType: ConnectionTypes, index: number) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getInputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\t__addConnection(connection: [IConnection, IConnection]) {\n\t\t\tconst outputUuid = this.getOutputEndpointUUID(\n\t\t\t\tconnection[0].node,\n\t\t\t\tconnection[0].type as ConnectionTypes,\n\t\t\t\tconnection[0].index,\n\t\t\t);\n\t\t\tconst inputUuid = this.getInputEndpointUUID(\n\t\t\t\tconnection[1].node,\n\t\t\t\tconnection[1].type as ConnectionTypes,\n\t\t\t\tconnection[1].index,\n\t\t\t);\n\t\t\tif (!outputUuid || !inputUuid) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst uuid: [string, string] = [outputUuid, inputUuid];\n\t\t\t// Create connections in DOM\n\t\t\tthis.instance?.connect({\n\t\t\t\tuuids: uuid,\n\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinData);\n\t\t\t});\n\t\t},\n\t\t__removeConnection(connection: [IConnection, IConnection], removeVisualConnection = false) {\n\t\t\tif (removeVisualConnection) {\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(connection[0].node);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeByName(connection[1].node);\n\n\t\t\t\tif (!sourceNode || !targetNode) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\tsourceNode.type,\n\t\t\t\t\tsourceNode.typeVersion,\n\t\t\t\t);\n\t\t\t\tconst sourceNodeOutput =\n\t\t\t\t\tsourceNodeType?.outputs?.[connection[0].index] || NodeConnectionType.Main;\n\t\t\t\tconst sourceNodeOutputName =\n\t\t\t\t\ttypeof sourceNodeOutput === 'string' ? sourceNodeOutput : sourceNodeOutput.name;\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(sourceNodeOutputName);\n\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: sourceNode.id,\n\t\t\t\t\ttarget: targetNode.id,\n\t\t\t\t});\n\n\t\t\t\tconnections.forEach((connectionInstance: Connection) => {\n\t\t\t\t\tif (connectionInstance.__meta) {\n\t\t\t\t\t\t// Only delete connections from specific indexes (if it can be determined by meta)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tconnectionInstance.__meta.sourceOutputIndex === connection[0].index &&\n\t\t\t\t\t\t\tconnectionInstance.__meta.targetOutputIndex === connection[1].index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.workflowsStore.removeConnection({ connection });\n\t\t},\n\t\t__deleteJSPlumbConnection(connection: Connection, trackHistory = false) {\n\t\t\t// Make sure to remove the overlay else after the second move\n\t\t\t// it visibly stays behind free floating without a connection.\n\t\t\tconnection.removeOverlays();\n\n\t\t\tthis.pullConnActiveNodeName = null; // prevent new connections when connectionDetached is triggered\n\t\t\tthis.instance?.deleteConnection(connection); // on delete, triggers connectionDetached event which applies mutation to store\n\t\t\tif (trackHistory && connection.__meta) {\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.sourceOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.sourceNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.targetOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.targetNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionData, this);\n\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t}\n\t\t},\n\t\t__removeConnectionByConnectionInfo(info, removeVisualConnection = false, trackHistory = false) {\n\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\n\t\t\tif (connectionInfo) {\n\t\t\t\tif (removeVisualConnection) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection, trackHistory);\n\t\t\t\t} else if (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t}\n\t\t\t\tthis.workflowsStore.removeConnection({ connection: connectionInfo });\n\t\t\t}\n\t\t},\n\t\tasync duplicateNodes(nodes: INode[]): Promise<void> {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst workflowData = deepCopy(await this.getNodesToSave(nodes));\n\t\t\tawait this.importWorkflowData(workflowData, 'duplicate', false);\n\t\t},\n\t\tgetJSPlumbConnection(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetInputIndex: number,\n\t\t\tconnectionType: ConnectionTypes,\n\t\t): Connection | undefined {\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst targetNode = this.workflowsStore.getNodeByName(targetNodeName);\n\t\t\tif (!sourceNode || !targetNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst sourceId = sourceNode.id;\n\t\t\tconst targetId = targetNode.id;\n\n\t\t\tconst sourceEndpoint = NodeViewUtils.getOutputEndpointUUID(\n\t\t\t\tsourceId,\n\t\t\t\tconnectionType,\n\t\t\t\tsourceOutputIndex,\n\t\t\t);\n\t\t\tconst targetEndpoint = NodeViewUtils.getInputEndpointUUID(\n\t\t\t\ttargetId,\n\t\t\t\tconnectionType,\n\t\t\t\ttargetInputIndex,\n\t\t\t);\n\n\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\tsourceNode.type,\n\t\t\t\tsourceNode.typeVersion,\n\t\t\t);\n\t\t\tconst sourceNodeOutput =\n\t\t\t\tsourceNodeType?.outputs?.[sourceOutputIndex] || NodeConnectionType.Main;\n\t\t\tconst sourceNodeOutputName =\n\t\t\t\ttypeof sourceNodeOutput === 'string' ? sourceNodeOutput : sourceNodeOutput.name;\n\t\t\tconst scope = NodeViewUtils.getEndpointScope(sourceNodeOutputName);\n\n\t\t\t// @ts-ignore\n\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\tscope,\n\t\t\t\tsource: sourceId,\n\t\t\t\ttarget: targetId,\n\t\t\t}) as Connection[];\n\n\t\t\treturn connections.find((connection: Connection) => {\n\t\t\t\tconst uuids = connection.getUuids();\n\t\t\t\treturn uuids[0] === sourceEndpoint && uuids[1] === targetEndpoint;\n\t\t\t});\n\t\t},\n\t\tgetJSPlumbEndpoints(nodeName: string): Endpoint[] {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tconst nodeEl = this.instance.getManagedElement(node?.id);\n\n\t\t\tconst endpoints = this.instance?.getEndpoints(nodeEl);\n\t\t\treturn endpoints;\n\t\t},\n\t\tgetPlusEndpoint(nodeName: string, outputIndex: number): Endpoint | undefined {\n\t\t\tconst endpoints = this.getJSPlumbEndpoints(nodeName);\n\t\t\treturn endpoints.find(\n\t\t\t\t(endpoint: Endpoint) =>\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tendpoint.endpoint.type === 'N8nPlus' && endpoint?.__meta?.index === outputIndex,\n\t\t\t);\n\t\t},\n\t\tgetIncomingOutgoingConnections(nodeName: string): {\n\t\t\tincoming: Connection[];\n\t\t\toutgoing: Connection[];\n\t\t} {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\n\t\t\tif (node) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t});\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst incoming = this.instance?.getConnections({\n\t\t\t\t\ttarget: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\treturn {\n\t\t\t\t\tincoming,\n\t\t\t\t\toutgoing,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { incoming: [], outgoing: [] };\n\t\t},\n\t\tonNodeMoved(node: INodeUi) {\n\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\n\t\t\t[...incoming, ...outgoing].forEach((connection: Connection) => {\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t});\n\t\t},\n\t\tonNodeRun({\n\t\t\tname,\n\t\t\tdata,\n\t\t\twaiting,\n\t\t}: {\n\t\t\tname: string;\n\t\t\tdata: ITaskData[] | null;\n\t\t\twaiting: boolean;\n\t\t}) {\n\t\t\tconst pinData = this.workflowsStore.getPinData;\n\n\t\t\tif (pinData?.[name]) return;\n\n\t\t\tconst sourceNodeName = name;\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst sourceId = sourceNode !== null ? sourceNode.id : '';\n\n\t\t\tif (data === null || data.length === 0 || waiting) {\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: sourceId,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\toutgoing.forEach((connection: Connection) => {\n\t\t\t\t\tNodeViewUtils.resetConnection(connection);\n\t\t\t\t});\n\t\t\t\tconst endpoints = this.getJSPlumbEndpoints(sourceNodeName);\n\t\t\t\tendpoints.forEach((endpoint: Endpoint) => {\n\t\t\t\t\tif (endpoint.endpoint.type === 'N8nPlus') {\n\t\t\t\t\t\t(endpoint.endpoint as N8nPlusEndpoint).clearSuccessOutput();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst allNodeConnections = this.workflowsStore.outgoingConnectionsByNodeName(sourceNodeName);\n\n\t\t\tconst connectionType = Object.keys(allNodeConnections)[0];\n\t\t\tconst nodeConnections = allNodeConnections[connectionType];\n\t\t\tconst outputMap = NodeViewUtils.getOutputSummary(\n\t\t\t\tdata,\n\t\t\t\tnodeConnections || [],\n\t\t\t\t(connectionType as ConnectionTypes) ?? NodeConnectionType.Main,\n\t\t\t);\n\t\t\tObject.keys(outputMap).forEach((sourceOutputIndex: string) => {\n\t\t\t\tObject.keys(outputMap[sourceOutputIndex]).forEach((targetNodeName: string) => {\n\t\t\t\t\tObject.keys(outputMap[sourceOutputIndex][targetNodeName]).forEach(\n\t\t\t\t\t\t(targetInputIndex: string) => {\n\t\t\t\t\t\t\tif (targetNodeName) {\n\t\t\t\t\t\t\t\tconst connection = this.getJSPlumbConnection(\n\t\t\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\t\t\tparseInt(sourceOutputIndex, 10),\n\t\t\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\t\t\tparseInt(targetInputIndex, 10),\n\t\t\t\t\t\t\t\t\tconnectionType as ConnectionTypes,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tif (connection) {\n\t\t\t\t\t\t\t\t\tconst output = outputMap[sourceOutputIndex][targetNodeName][targetInputIndex];\n\n\t\t\t\t\t\t\t\t\tif (output.isArtificialRecoveredEventItem) {\n\t\t\t\t\t\t\t\t\t\tNodeViewUtils.recoveredConnection(connection);\n\t\t\t\t\t\t\t\t\t} else if (!output?.total && !output.isArtificialRecoveredEventItem) {\n\t\t\t\t\t\t\t\t\t\tNodeViewUtils.resetConnection(connection);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tNodeViewUtils.addConnectionOutputSuccess(connection, output);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst endpoint = this.getPlusEndpoint(\n\t\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\t\tparseInt(sourceOutputIndex, 10),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (endpoint?.endpoint) {\n\t\t\t\t\t\t\t\tconst output = outputMap[sourceOutputIndex][NODE_OUTPUT_DEFAULT_KEY][0];\n\n\t\t\t\t\t\t\t\tif (output && output.total > 0) {\n\t\t\t\t\t\t\t\t\t(endpoint.endpoint as N8nPlusEndpoint).setSuccessOutput(\n\t\t\t\t\t\t\t\t\t\tNodeViewUtils.getRunItemsLabel(output),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t(endpoint.endpoint as N8nPlusEndpoint).clearSuccessOutput();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tremoveNode(nodeName: string, trackHistory = false, trackBulk = true) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\t// \"requiredNodeTypes\" are also defined in cli/commands/run.ts\n\t\t\tconst requiredNodeTypes: string[] = [];\n\n\t\t\tif (requiredNodeTypes.includes(node.type)) {\n\t\t\t\t// The node is of the required type so check first\n\t\t\t\t// if any node of that type would be left when the\n\t\t\t\t// current one would get deleted.\n\t\t\t\tlet deleteAllowed = false;\n\t\t\t\tfor (const checkNode of this.nodes) {\n\t\t\t\t\tif (checkNode.name === node.name) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (requiredNodeTypes.includes(checkNode.type)) {\n\t\t\t\t\t\tdeleteAllowed = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!deleteAllowed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node.type === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.track('User deleted workflow note', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tis_welcome_note: node.name === QUICKSTART_NOTE_NAME,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('node.deleteNode', { node });\n\t\t\t\tthis.$telemetry.track('User deleted node', {\n\t\t\t\t\tnode_type: node.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet waitForNewConnection = false;\n\t\t\t// connect nodes before/after deleted node\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(node.name);\n\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\tif (nodeType) {\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, nodeType);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, workflowNode!, nodeType);\n\t\t\t}\n\n\t\t\tif (outputs.length === 1 && inputs.length === 1) {\n\t\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\t\t\t\tif (incoming.length === 1 && outgoing.length === 1) {\n\t\t\t\t\tconst conn1 = incoming[0];\n\t\t\t\t\tconst conn2 = outgoing[0];\n\t\t\t\t\tif (conn1.__meta && conn2.__meta) {\n\t\t\t\t\t\twaitForNewConnection = true;\n\t\t\t\t\t\tconst sourceNodeName = conn1.__meta.sourceNodeName;\n\t\t\t\t\t\tconst sourceNodeOutputIndex = conn1.__meta.sourceOutputIndex;\n\t\t\t\t\t\tconst targetNodeName = conn2.__meta.targetNodeName;\n\t\t\t\t\t\tconst targetNodeOuputIndex = conn2.__meta.targetOutputIndex;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\t\ttargetNodeOuputIndex,\n\t\t\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (waitForNewConnection) {\n\t\t\t\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t\t\t\t\twaitForNewConnection = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 100); // just to make it clear to users that this is a new connection\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\t// Suspend drawing\n\t\t\t\tthis.instance?.setSuspendDrawing(true);\n\t\t\t\t(this.instance?.endpointsByElement[node.id] || [])\n\t\t\t\t\t.flat()\n\t\t\t\t\t.forEach((endpoint) => this.instance?.deleteEndpoint(endpoint));\n\n\t\t\t\t// Remove the connections in data\n\t\t\t\tthis.workflowsStore.removeAllNodeConnection(node);\n\t\t\t\tthis.workflowsStore.removeNode(node);\n\t\t\t\tthis.workflowsStore.clearNodeExecutionData(node.name);\n\n\t\t\t\tif (!waitForNewConnection) {\n\t\t\t\t\t// Now it can draw again\n\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t}\n\n\t\t\t\t// Remove node from selected index if found in it\n\t\t\t\tthis.uiStore.removeNodeFromSelection(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveNodeCommand(node));\n\t\t\t\t}\n\t\t\t}); // allow other events to finish like drag stop\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tconst recordingTimeout = waitForNewConnection ? 100 : 0;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t}, recordingTimeout);\n\t\t\t}\n\t\t},\n\t\tasync onSwitchSelectedNode(nodeName: string) {\n\t\t\tthis.nodeSelectedByName(nodeName, true, true);\n\t\t},\n\t\tasync redrawNode(nodeName: string) {\n\t\t\t// TODO: Improve later\n\t\t\t// For now we redraw the node by simply renaming it. Can for sure be\n\t\t\t// done better later but should be fine for now.\n\t\t\tconst tempName = 'x____XXXX____x';\n\t\t\tawait this.renameNode(nodeName, tempName);\n\t\t\tawait this.renameNode(tempName, nodeName);\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tif (parameterData.name === 'name' && parameterData.oldValue) {\n\t\t\t\t// The name changed so we have to take care that\n\t\t\t\t// the connections get changed.\n\t\t\t\tvoid this.renameNode(parameterData.oldValue as string, parameterData.value as string);\n\t\t\t}\n\t\t},\n\t\tasync renameNodePrompt(currentName: string) {\n\t\t\ttry {\n\t\t\t\tconst promptResponsePromise = this.prompt(\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.newName') + ':',\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.renameNode') + `: ${currentName}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustomClass: 'rename-prompt',\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('nodeView.prompt.rename'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('nodeView.prompt.cancel'),\n\t\t\t\t\t\tinputErrorMessage: this.$locale.baseText('nodeView.prompt.invalidName'),\n\t\t\t\t\t\tinputValue: currentName,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Wait till it had time to display\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t// Get the input and select the text in it\n\t\t\t\tconst nameInput = document.querySelector('.rename-prompt .el-input__inner') as\n\t\t\t\t\t| HTMLInputElement\n\t\t\t\t\t| undefined;\n\t\t\t\tif (nameInput) {\n\t\t\t\t\tnameInput.focus();\n\t\t\t\t\tnameInput.select();\n\t\t\t\t}\n\n\t\t\t\tconst promptResponse = (await promptResponsePromise) as MessageBoxInputData;\n\n\t\t\t\tif (promptResponse?.action !== MODAL_CONFIRM) return;\n\n\t\t\t\tawait this.renameNode(currentName, promptResponse.value, true);\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync renameNode(currentName: string, newName: string, trackHistory = false) {\n\t\t\tif (currentName === newName) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\tconst activeNodeName = this.activeNode && this.activeNode.name;\n\t\t\tconst isActive = activeNodeName === currentName;\n\t\t\tif (isActive) {\n\t\t\t\tthis.renamingActive = true;\n\t\t\t}\n\n\t\t\tnewName = this.uniqueNodeName(newName);\n\n\t\t\t// Rename the node and update the connections\n\t\t\tconst workflow = this.getCurrentWorkflow(true);\n\t\t\tworkflow.renameNode(currentName, newName);\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(currentName, newName));\n\t\t\t}\n\n\t\t\t// Update also last selected node and execution data\n\t\t\tthis.workflowsStore.renameNodeSelectedAndExecution({ old: currentName, new: newName });\n\n\t\t\t// Reset all nodes and connections to load the new ones\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\tthis.workflowsStore.removeAllConnections({ setStateDirty: false });\n\t\t\tthis.workflowsStore.removeAllNodes({ removePinData: false, setStateDirty: true });\n\n\t\t\t// Wait a tick that the old nodes had time to get removed\n\t\t\tawait this.$nextTick();\n\n\t\t\t// Add the new updated nodes\n\t\t\tawait this.addNodes(Object.values(workflow.nodes), workflow.connectionsBySourceNode, false);\n\n\t\t\t// Make sure that the node is selected again\n\t\t\tthis.deselectAllNodes();\n\t\t\tthis.nodeSelectedByName(newName);\n\n\t\t\tif (isActive) {\n\t\t\t\tthis.ndvStore.activeNodeName = newName;\n\t\t\t\tthis.renamingActive = false;\n\t\t\t}\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tdeleteEveryEndpoint() {\n\t\t\t// Check as it does not exist on first load\n\t\t\tif (this.instance) {\n\t\t\t\tthis.instance?.reset();\n\t\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t\t.flatMap((endpoint) => endpoint)\n\t\t\t\t\t.forEach((endpoint) => endpoint.destroy());\n\n\t\t\t\tthis.instance.deleteEveryConnection({ fireEvent: true });\n\t\t\t}\n\t\t},\n\t\tmatchCredentials(node: INodeUi) {\n\t\t\tif (!node.credentials) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tObject.entries(node.credentials).forEach(\n\t\t\t\t([nodeCredentialType, nodeCredentials]: [string, INodeCredentialsDetails]) => {\n\t\t\t\t\tconst credentialOptions = this.credentialsStore.getCredentialsByType(nodeCredentialType);\n\n\t\t\t\t\t// Check if workflows applies old credentials style\n\t\t\t\t\tif (typeof nodeCredentials === 'string') {\n\t\t\t\t\t\tnodeCredentials = {\n\t\t\t\t\t\t\tid: null,\n\t\t\t\t\t\t\tname: nodeCredentials,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nodeCredentials.id) {\n\t\t\t\t\t\t// Check whether the id is matching with a credential\n\t\t\t\t\t\tconst credentialsId = nodeCredentials.id.toString(); // due to a fixed bug in the migration UpdateWorkflowCredentials (just sqlite) we have to cast to string and check later if it has been a number\n\t\t\t\t\t\tconst credentialsForId = credentialOptions.find(\n\t\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.id === credentialsId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (credentialsForId) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcredentialsForId.name !== nodeCredentials.name ||\n\t\t\t\t\t\t\t\ttypeof nodeCredentials.id === 'number'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnode.credentials![nodeCredentialType] = {\n\t\t\t\t\t\t\t\t\tid: credentialsForId.id,\n\t\t\t\t\t\t\t\t\tname: credentialsForId.name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// No match for id found or old credentials type used\n\t\t\t\t\tnode.credentials![nodeCredentialType] = nodeCredentials;\n\n\t\t\t\t\t// check if only one option with the name would exist\n\t\t\t\t\tconst credentialsForName = credentialOptions.filter(\n\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.name === nodeCredentials.name,\n\t\t\t\t\t);\n\n\t\t\t\t\t// only one option exists for the name, take it\n\t\t\t\t\tif (credentialsForName.length === 1) {\n\t\t\t\t\t\tnode.credentials![nodeCredentialType].id = credentialsForName[0].id;\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\tasync addNodes(nodes: INodeUi[], connections?: IConnections, trackHistory = false) {\n\t\t\tif (!nodes?.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.isInsertingNodes = true;\n\t\t\t// Before proceeding we must check if all nodes contain the `properties` attribute.\n\t\t\t// Nodes are loaded without this information so we must make sure that all nodes\n\t\t\t// being added have this information.\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tnodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\t// Add the node to the node-list\n\t\t\tlet nodeType: INodeTypeDescription | null;\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tif (!node.id) {\n\t\t\t\t\tnode.id = uuid();\n\t\t\t\t}\n\n\t\t\t\tnodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t// Make sure that some properties always exist\n\t\t\t\tif (!node.hasOwnProperty('disabled')) {\n\t\t\t\t\tnode.disabled = false;\n\t\t\t\t}\n\n\t\t\t\tif (!node.hasOwnProperty('parameters')) {\n\t\t\t\t\tnode.parameters = {};\n\t\t\t\t}\n\n\t\t\t\t// Load the defaul parameter values because only values which differ\n\t\t\t\t// from the defaults get saved\n\t\t\t\tif (nodeType !== null) {\n\t\t\t\t\tlet nodeParameters = null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\t\t\tnodeType.properties,\n\t\t\t\t\t\t\tnode.parameters,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\tthis.$locale.baseText('nodeView.thereWasAProblemLoadingTheNodeParametersOfNode') +\n\t\t\t\t\t\t\t\t`: \"${node.name}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\t\t\t\t\tnode.parameters = nodeParameters !== null ? nodeParameters : {};\n\n\t\t\t\t\t// if it's a webhook and the path is empty set the UUID as the default path\n\t\t\t\t\tif (\n\t\t\t\t\t\t[WEBHOOK_NODE_TYPE, FORM_TRIGGER_NODE_TYPE].includes(node.type) &&\n\t\t\t\t\t\tnode.parameters.path === ''\n\t\t\t\t\t) {\n\t\t\t\t\t\tnode.parameters.path = node.webhookId as string;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check and match credentials, apply new format if old is used\n\t\t\t\tthis.matchCredentials(node);\n\t\t\t\tthis.workflowsStore.addNode(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddNodeCommand(node));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Wait for the nodes to be rendered\n\t\t\tawait this.$nextTick();\n\n\t\t\tthis.instance?.setSuspendDrawing(true);\n\n\t\t\tif (connections) {\n\t\t\t\tawait this.addConnections(connections);\n\t\t\t}\n\t\t\t// Add the node issues at the end as the node-connections are required\n\t\t\tthis.nodeHelpers.refreshNodeIssues();\n\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tthis.isInsertingNodes = false;\n\n\t\t\t// Now it can draw again\n\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t},\n\t\tasync addConnections(connections: IConnections) {\n\t\t\tconst batchedConnectionData: Array<[IConnection, IConnection]> = [];\n\n\t\t\tfor (const sourceNode in connections) {\n\t\t\t\tfor (const type in connections[sourceNode]) {\n\t\t\t\t\tconnections[sourceNode][type].forEach((outwardConnections, sourceIndex) => {\n\t\t\t\t\t\tif (outwardConnections) {\n\t\t\t\t\t\t\toutwardConnections.forEach((targetData) => {\n\t\t\t\t\t\t\t\tbatchedConnectionData.push([\n\t\t\t\t\t\t\t\t\t{ node: sourceNode, type, index: sourceIndex },\n\t\t\t\t\t\t\t\t\t{ node: targetData.node, type: targetData.type, index: targetData.index },\n\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process the connections in batches\n\t\t\tawait this.processConnectionBatch(batchedConnectionData);\n\t\t\tsetTimeout(this.addConectionsTestData, 0);\n\t\t},\n\n\t\tasync processConnectionBatch(batchedConnectionData: Array<[IConnection, IConnection]>) {\n\t\t\tconst batchSize = 100;\n\n\t\t\tfor (let i = 0; i < batchedConnectionData.length; i += batchSize) {\n\t\t\t\tconst batch = batchedConnectionData.slice(i, i + batchSize);\n\n\t\t\t\tbatch.forEach((connectionData) => {\n\t\t\t\t\tthis.__addConnection(connectionData);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tasync addNodesToWorkflow(data: IWorkflowDataUpdate): Promise<IWorkflowDataUpdate> {\n\t\t\t// Because nodes with the same name maybe already exist, it could\n\t\t\t// be needed that they have to be renamed. Also could it be possible\n\t\t\t// that nodes are not allowd to be created because they have a create\n\t\t\t// limit set. So we would then link the new nodes with the already existing ones.\n\t\t\t// In this object all that nodes get saved in the format:\n\t\t\t// old-name -> new-name\n\t\t\tconst nodeNameTable: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\t\t\tconst newNodeNames: string[] = [];\n\n\t\t\tif (!data.nodes) {\n\t\t\t\t// No nodes to add\n\t\t\t\tthrow new Error(this.$locale.baseText('nodeView.noNodesGivenToAdd'));\n\t\t\t}\n\n\t\t\t// Get how many of the nodes of the types which have\n\t\t\t// a max limit set already exist\n\t\t\tconst nodeTypesCount = this.getNodeTypesMaxCount();\n\n\t\t\tlet oldName: string;\n\t\t\tlet newName: string;\n\t\t\tconst createNodes: INode[] = [];\n\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tdata.nodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tif (nodeTypesCount[node.type] !== undefined) {\n\t\t\t\t\tif (nodeTypesCount[node.type].exist >= nodeTypesCount[node.type].max) {\n\t\t\t\t\t\t// Node is not allowed to be created so\n\t\t\t\t\t\t// do not add it to the create list but\n\t\t\t\t\t\t// add the name of the existing node\n\t\t\t\t\t\t// that this one gets linked up instead.\n\t\t\t\t\t\tnodeNameTable[node.name] = nodeTypesCount[node.type].nodeNames[0];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Node can be created but increment the\n\t\t\t\t\t\t// counter in case multiple ones are\n\t\t\t\t\t\t// supposed to be created\n\t\t\t\t\t\tnodeTypesCount[node.type].exist += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toldName = node.name;\n\n\t\t\t\tconst localized = this.locale.localizeNodeName(node.name, node.type);\n\n\t\t\t\tnewName = this.uniqueNodeName(localized, newNodeNames);\n\n\t\t\t\tnewNodeNames.push(newName);\n\t\t\t\tnodeNameTable[oldName] = newName;\n\n\t\t\t\tcreateNodes.push(node);\n\t\t\t});\n\n\t\t\t// Get only the connections of the nodes that get created\n\t\t\tconst newConnections: IConnections = {};\n\t\t\tconst currentConnections = data.connections!;\n\t\t\tconst createNodeNames = createNodes.map((node) => node.name);\n\t\t\tlet sourceNode, type, sourceIndex, connectionIndex, connectionData;\n\t\t\tfor (sourceNode of Object.keys(currentConnections)) {\n\t\t\t\tif (!createNodeNames.includes(sourceNode)) {\n\t\t\t\t\t// Node does not get created so skip output connections\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst connection: INodeConnections = {};\n\n\t\t\t\tfor (type of Object.keys(currentConnections[sourceNode])) {\n\t\t\t\t\tconnection[type] = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tsourceIndex = 0;\n\t\t\t\t\t\tsourceIndex < currentConnections[sourceNode][type].length;\n\t\t\t\t\t\tsourceIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst nodeSourceConnections = [];\n\t\t\t\t\t\tif (currentConnections[sourceNode][type][sourceIndex]) {\n\t\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\t\tconnectionIndex < currentConnections[sourceNode][type][sourceIndex].length;\n\t\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconnectionData = currentConnections[sourceNode][type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\t\tif (!createNodeNames.includes(connectionData.node)) {\n\t\t\t\t\t\t\t\t\t// Node does not get created so skip input connection\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tnodeSourceConnections.push(connectionData);\n\t\t\t\t\t\t\t\t// Add connection\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconnection[type].push(nodeSourceConnections);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewConnections[sourceNode] = connection;\n\t\t\t}\n\n\t\t\t// Create a workflow with the new nodes and connections that we can use\n\t\t\t// the rename method\n\t\t\tconst tempWorkflow: Workflow = this.getWorkflow(createNodes, newConnections);\n\n\t\t\t// Rename all the nodes of which the name changed\n\t\t\tfor (oldName in nodeNameTable) {\n\t\t\t\tif (oldName === nodeNameTable[oldName]) {\n\t\t\t\t\t// Name did not change so skip\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttempWorkflow.renameNode(oldName, nodeNameTable[oldName]);\n\t\t\t}\n\n\t\t\tif (data.pinData) {\n\t\t\t\tlet pinDataSuccess = true;\n\t\t\t\tfor (const nodeName of Object.keys(data.pinData)) {\n\t\t\t\t\t// Pin data limit reached\n\t\t\t\t\tif (!pinDataSuccess) {\n\t\t\t\t\t\tthis.showError(\n\t\t\t\t\t\t\tnew Error(this.$locale.baseText('ndv.pinData.error.tooLarge.description')),\n\t\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.error.tooLarge.title'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst node = tempWorkflow.nodes[nodeNameTable[nodeName]];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.setPinData(node, data.pinData[nodeName], 'add-nodes');\n\t\t\t\t\t\tpinDataSuccess = true;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tpinDataSuccess = false;\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the nodes with the changed node names, expressions and connections\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tawait this.addNodes(\n\t\t\t\tObject.values(tempWorkflow.nodes),\n\t\t\t\ttempWorkflow.connectionsBySourceNode,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\treturn {\n\t\t\t\tnodes: Object.values(tempWorkflow.nodes),\n\t\t\t\tconnections: tempWorkflow.connectionsBySourceNode,\n\t\t\t};\n\t\t},\n\t\tasync getNodesToSave(nodes: INode[]): Promise<IWorkflowData> {\n\t\t\tconst data: IWorkflowData = {\n\t\t\t\tnodes: [],\n\t\t\t\tconnections: {},\n\t\t\t\tpinData: {},\n\t\t\t};\n\n\t\t\t// Get data of all the selected noes\n\t\t\tlet nodeData;\n\t\t\tconst exportNodeNames: string[] = [];\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tnodeData = this.getNodeDataToSave(node);\n\t\t\t\texportNodeNames.push(node.name);\n\n\t\t\t\tdata.nodes.push(nodeData);\n\n\t\t\t\tconst pinDataForNode = this.workflowsStore.pinDataByNodeName(node.name);\n\t\t\t\tif (pinDataForNode) {\n\t\t\t\t\tdata.pinData![node.name] = pinDataForNode;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tnodeData.credentials &&\n\t\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t\t) {\n\t\t\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\t\t\t\t\tnodeData.credentials = Object.fromEntries(\n\t\t\t\t\t\tObject.entries(nodeData.credentials).filter(([_, credential]) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\t\t\t(!usedCredentials[credential.id] ||\n\t\t\t\t\t\t\t\t\tusedCredentials[credential.id]?.currentUserHasAccess)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get only connections of exported nodes and ignore all other ones\n\t\t\tlet connectionToKeep,\n\t\t\t\tconnections: INodeConnections,\n\t\t\t\ttype: string,\n\t\t\t\tconnectionIndex: number,\n\t\t\t\tsourceIndex: number,\n\t\t\t\tconnectionData: IConnection,\n\t\t\t\ttypeConnections: INodeConnections;\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tconnections = this.workflowsStore.outgoingConnectionsByNodeName(node.name);\n\t\t\t\tif (Object.keys(connections).length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Keep only the connection to node which get also exported\n\t\t\t\ttypeConnections = {};\n\t\t\t\tfor (type of Object.keys(connections)) {\n\t\t\t\t\tfor (sourceIndex = 0; sourceIndex < connections[type].length; sourceIndex++) {\n\t\t\t\t\t\tconnectionToKeep = [];\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\tconnectionIndex < connections[type][sourceIndex].length;\n\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconnectionData = connections[type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\tif (exportNodeNames.indexOf(connectionData.node) !== -1) {\n\t\t\t\t\t\t\t\tconnectionToKeep.push(connectionData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (connectionToKeep.length) {\n\t\t\t\t\t\t\tif (!typeConnections.hasOwnProperty(type)) {\n\t\t\t\t\t\t\t\ttypeConnections[type] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttypeConnections[type][sourceIndex] = connectionToKeep;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (Object.keys(typeConnections).length) {\n\t\t\t\t\tdata.connections[node.name] = typeConnections;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn data;\n\t\t},\n\t\tresetWorkspace() {\n\t\t\tthis.workflowsStore.resetWorkflow();\n\n\t\t\tthis.onToggleNodeCreator({ createNodeActive: false });\n\t\t\tthis.nodeCreatorStore.setShowScrim(false);\n\t\t\tthis.canvasStore.resetZoom();\n\n\t\t\t// Reset nodes\n\t\t\tthis.unbindEndpointEventListeners();\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\t// Make sure that if there is a waiting test-webhook that it gets removed\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\ttry {\n\t\t\t\t\tvoid this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t\tthis.workflowsStore.resetState();\n\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\tthis.uiStore.resetSelectedNodes();\n\t\t\tthis.uiStore.nodeViewOffsetPosition = [0, 0];\n\n\t\t\tthis.credentialsUpdated = false;\n\t\t},\n\t\tasync loadActiveWorkflows(): Promise<void> {\n\t\t\tawait this.workflowsStore.fetchActiveWorkflows();\n\t\t},\n\t\tasync loadNodeTypes(): Promise<void> {\n\t\t\tawait this.nodeTypesStore.getNodeTypes();\n\t\t},\n\t\tasync loadCredentialTypes(): Promise<void> {\n\t\t\tawait this.credentialsStore.fetchCredentialTypes(true);\n\t\t},\n\t\tasync loadCredentials(): Promise<void> {\n\t\t\tawait this.credentialsStore.fetchAllCredentials();\n\t\t},\n\t\tasync loadVariables(): Promise<void> {\n\t\t\tawait this.environmentsStore.fetchAllVariables();\n\t\t},\n\t\tasync loadSecrets(): Promise<void> {\n\t\t\tawait this.externalSecretsStore.fetchAllSecrets();\n\t\t},\n\t\tasync loadNodesProperties(nodeInfos: INodeTypeNameVersion[]): Promise<void> {\n\t\t\tconst allNodes: INodeTypeDescription[] = this.nodeTypesStore.allNodeTypes;\n\n\t\t\tconst nodesToBeFetched: INodeTypeNameVersion[] = [];\n\t\t\tallNodes.forEach((node) => {\n\t\t\t\tconst nodeVersions = Array.isArray(node.version) ? node.version : [node.version];\n\t\t\t\tif (\n\t\t\t\t\t!!nodeInfos.find((n) => n.name === node.name && nodeVersions.includes(n.version)) &&\n\t\t\t\t\t!node.hasOwnProperty('properties')\n\t\t\t\t) {\n\t\t\t\t\tnodesToBeFetched.push({\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tversion: Array.isArray(node.version) ? node.version.slice(-1)[0] : node.version,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (nodesToBeFetched.length > 0) {\n\t\t\t\t// Only call API if node information is actually missing\n\t\t\t\tthis.startLoading();\n\t\t\t\tawait this.nodeTypesStore.getNodesInformation(nodesToBeFetched);\n\t\t\t\tthis.stopLoading();\n\t\t\t}\n\t\t},\n\t\tasync onPostMessageReceived(message: MessageEvent) {\n\t\t\tif (!message || typeof message.data !== 'string' || !message.data?.includes?.('\"command\"')) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(message.data);\n\t\t\t\tif (json && json.command === 'openWorkflow') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.importWorkflowExact(json);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = false;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json && json.command === 'openExecution') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// If this NodeView is used in preview mode (in iframe) it will not have access to the main app store\n\t\t\t\t\t\t// so everything it needs has to be sent using post messages and passed down to child components\n\t\t\t\t\t\tthis.isProductionExecutionPreview = json.executionMode !== 'manual';\n\n\t\t\t\t\t\tawait this.openExecution(json.executionId);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = true;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json?.command === 'setActiveExecution') {\n\t\t\t\t\tthis.workflowsStore.activeWorkflowExecution = json.execution;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync onImportWorkflowDataEvent(data: IDataObject) {\n\t\t\tawait this.importWorkflowData(data.data as IWorkflowDataUpdate, 'file');\n\t\t},\n\t\tasync onImportWorkflowUrlEvent(data: IDataObject) {\n\t\t\tconst workflowData = await this.getWorkflowDataFromUrl(data.url as string);\n\t\t\tif (workflowData !== undefined) {\n\t\t\t\tawait this.importWorkflowData(workflowData, 'url');\n\t\t\t}\n\t\t},\n\t\taddPinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tconnections.forEach((connection) => {\n\t\t\t\t\tNodeViewUtils.addConnectionOutputSuccess(connection, {\n\t\t\t\t\t\ttotal: pinData[nodeName].length,\n\t\t\t\t\t\titerations: 0,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tremovePinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tthis.instance.setSuspendDrawing(true);\n\t\t\t\tconnections.forEach(NodeViewUtils.resetConnection);\n\t\t\t\tthis.instance.setSuspendDrawing(false, true);\n\t\t\t});\n\t\t},\n\t\tonToggleNodeCreator({ source, createNodeActive, nodeCreatorView }: ToggleNodeCreatorOptions) {\n\t\t\tif (createNodeActive === this.createNodeActive) return;\n\n\t\t\tif (!nodeCreatorView) {\n\t\t\t\tnodeCreatorView = this.containsTrigger\n\t\t\t\t\t? REGULAR_NODE_CREATOR_VIEW\n\t\t\t\t\t: TRIGGER_NODE_CREATOR_VIEW;\n\t\t\t}\n\n\t\t\t// Default to the trigger tab in node creator if there's no trigger node yet\n\t\t\tthis.nodeCreatorStore.setSelectedView(nodeCreatorView);\n\n\t\t\tthis.createNodeActive = createNodeActive;\n\n\t\t\tlet mode;\n\t\t\tswitch (this.nodeCreatorStore.selectedView) {\n\t\t\t\tcase AI_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'ai';\n\t\t\t\t\tbreak;\n\t\t\t\tcase REGULAR_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'regular';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tmode = 'regular';\n\t\t\t}\n\n\t\t\tif (createNodeActive) this.nodeCreatorStore.setOpenSource(source);\n\t\t\tvoid this.externalHooks.run('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t});\n\t\t\tthis.$telemetry.trackNodesPanel('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\t\tasync onAddNodes(\n\t\t\t{ nodes, connections }: AddedNodesAndConnections,\n\t\t\tdragAndDrop = false,\n\t\t\tposition?: XYPosition,\n\t\t) {\n\t\t\tlet currentPosition = position;\n\t\t\tfor (const { type, isAutoAdd, name, openDetail, position: nodePosition } of nodes) {\n\t\t\t\tawait this.addNode(\n\t\t\t\t\ttype,\n\t\t\t\t\t{ position: nodePosition ?? currentPosition, dragAndDrop, name },\n\t\t\t\t\topenDetail ?? false,\n\t\t\t\t\ttrue,\n\t\t\t\t\tisAutoAdd,\n\t\t\t\t);\n\n\t\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\t\tcurrentPosition = [\n\t\t\t\t\tlastAddedNode.position[0] + NodeViewUtils.NODE_SIZE * 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tlastAddedNode.position[1],\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tconst newNodesOffset = this.nodes.length - nodes.length;\n\t\t\tfor (const { from, to } of connections) {\n\t\t\t\tconst fromNode = this.nodes[newNodesOffset + from.nodeIndex];\n\t\t\t\tconst toNode = this.nodes[newNodesOffset + to.nodeIndex];\n\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tfromNode.name,\n\t\t\t\t\tfrom.outputIndex ?? 0,\n\t\t\t\t\ttoNode.name,\n\t\t\t\t\tto.inputIndex ?? 0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\t\t\tconst lastNodeInputs = workflow.getParentNodesByDepth(lastAddedNode.name, 1);\n\n\t\t\t// If the last added node has multiple inputs, move them down\n\t\t\tif (lastNodeInputs.length > 1) {\n\t\t\t\tlastNodeInputs.slice(1).forEach((node, index) => {\n\t\t\t\t\tconst nodeUi = this.workflowsStore.getNodeByName(node.name);\n\t\t\t\t\tif (!nodeUi) return;\n\n\t\t\t\t\tthis.onMoveNode({\n\t\t\t\t\t\tnodeName: nodeUi.name,\n\t\t\t\t\t\tposition: [nodeUi.position[0], nodeUi.position[1] + 100 * (index + 1)],\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tasync saveCurrentWorkflowExternal(callback: () => void) {\n\t\t\tawait this.saveCurrentWorkflow();\n\t\t\tcallback?.();\n\t\t},\n\t\tsetSuspendRecordingDetachedConnections(suspend: boolean) {\n\t\t\tthis.suspendRecordingDetachedConnections = suspend;\n\t\t},\n\t\tonMoveNode({ nodeName, position }: { nodeName: string; position: XYPosition }): void {\n\t\t\tthis.workflowsStore.updateNodeProperties({ name: nodeName, properties: { position } });\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (node) {\n\t\t\t\t\tthis.instance?.repaintEverything();\n\t\t\t\t\tthis.onNodeMoved(node);\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t},\n\t\tonRevertAddNode({ node }: { node: INodeUi }): void {\n\t\t\tthis.removeNode(node.name, false);\n\t\t},\n\t\tasync onRevertRemoveNode({ node }: { node: INodeUi }): Promise<void> {\n\t\t\tconst prevNode = this.workflowsStore.workflow.nodes.find((n) => n.id === node.id);\n\t\t\tif (prevNode) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// For some reason, returning node to canvas with old id\n\t\t\t// makes it's endpoint to render at wrong position\n\t\t\tnode.id = uuid();\n\t\t\tawait this.addNodes([node]);\n\t\t},\n\t\tonRevertAddConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__removeConnection(connection, true);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertRemoveConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__addConnection(connection);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertNameChange({ currentName, newName }: { currentName: string; newName: string }) {\n\t\t\tawait this.renameNode(newName, currentName);\n\t\t},\n\t\tonRevertEnableToggle({ nodeName, isDisabled }: { nodeName: string; isDisabled: boolean }) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeHelpers.disableNodes([node]);\n\t\t\t}\n\t\t},\n\t\tonPageShow(e: PageTransitionEvent) {\n\t\t\t// Page was restored from the bfcache (back-forward cache)\n\t\t\tif (e.persisted) {\n\t\t\t\tthis.stopLoading();\n\t\t\t}\n\t\t},\n\t\treadOnlyEnvRouteCheck() {\n\t\t\tif (\n\t\t\t\tthis.readOnlyEnv &&\n\t\t\t\t[VIEWS.NEW_WORKFLOW, VIEWS.TEMPLATE_IMPORT].includes(this.$route.name)\n\t\t\t) {\n\t\t\t\tvoid this.$nextTick(async () => {\n\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\t\tawait this.$router.replace({ name: VIEWS.WORKFLOWS });\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync checkAndInitDebugMode() {\n\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\tthis.titleSet(this.workflowName, 'DEBUG');\n\t\t\t\tif (!this.workflowsStore.isInDebugMode) {\n\t\t\t\t\tawait this.applyExecutionData(this.$route.params.executionId as string);\n\t\t\t\t\tthis.workflowsStore.isInDebugMode = true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonContextMenuAction(action: ContextMenuAction, nodes: INode[]): void {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'copy':\n\t\t\t\t\tthis.copyNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'delete':\n\t\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'duplicate':\n\t\t\t\t\tvoid this.duplicateNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'execute':\n\t\t\t\t\tthis.onRunNode(nodes[0].name, 'NodeView.onContextMenuAction');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'open':\n\t\t\t\t\tthis.ndvStore.activeNodeName = nodes[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'rename':\n\t\t\t\t\tvoid this.renameNodePrompt(nodes[0].name);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_activation':\n\t\t\t\t\tthis.toggleActivationNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_pin':\n\t\t\t\t\tthis.togglePinNodes(nodes, 'context-menu');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_node':\n\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.CONTEXT_MENU,\n\t\t\t\t\t\tcreateNodeActive: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_sticky':\n\t\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'select_all':\n\t\t\t\t\tthis.selectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'deselect_all':\n\t\t\t\t\tthis.deselectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t},\n\tasync onSourceControlPull() {\n\t\tlet workflowId = null as string | null;\n\t\tif (this.$route.params.name) {\n\t\t\tworkflowId = this.$route.params.name;\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all([this.loadCredentials(), this.loadVariables(), this.tagsStore.fetchAll()]);\n\n\t\t\tif (workflowId !== null && !this.uiStore.stateIsDirty) {\n\t\t\t\tconst workflow: IWorkflowDb | undefined =\n\t\t\t\t\tawait this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\tif (workflow) {\n\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t},\n\tasync mounted() {\n\t\tthis.resetWorkspace();\n\t\tthis.canvasStore.initInstance(this.$refs.nodeView as HTMLElement);\n\t\tthis.titleReset();\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\n\t\tthis.startLoading();\n\t\tconst loadPromises = [\n\t\t\tthis.loadActiveWorkflows(),\n\t\t\tthis.loadCredentials(),\n\t\t\tthis.loadCredentialTypes(),\n\t\t\tthis.loadVariables(),\n\t\t\tthis.loadSecrets(),\n\t\t];\n\n\t\tif (this.nodeTypesStore.allNodeTypes.length === 0) {\n\t\t\tloadPromises.push(this.loadNodeTypes());\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all(loadPromises);\n\t\t} catch (error) {\n\t\t\tthis.showError(\n\t\t\t\terror,\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.title'),\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.message') + ':',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tready(async () => {\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tthis.bindCanvasEvents();\n\t\t\t\t} catch {} // This will break if mounted after jsplumb has been initiated from executions preview, so continue if it breaks\n\t\t\t\tawait this.initView();\n\t\t\t\tif (window.parent) {\n\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\tJSON.stringify({ command: 'n8nReady', version: this.rootStore.versionCli }),\n\t\t\t\t\t\t'*',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.title'),\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.message') + ':',\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.stopLoading();\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.usersStore.showPersonalizationSurvey();\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.getPinData || ({} as IPinData));\n\t\t\t}, 0);\n\t\t});\n\n\t\t// TODO: This currently breaks since front-end hooks are still not updated to work with pinia store\n\t\tvoid this.externalHooks.run('nodeView.mount').catch((e) => {});\n\n\t\tif (\n\t\t\tthis.currentUser?.personalizationAnswers !== null &&\n\t\t\tthis.settingsStore.onboardingCallPromptEnabled &&\n\t\t\tthis.currentUser &&\n\t\t\tgetAccountAge(this.currentUser) <= ONBOARDING_PROMPT_TIMEBOX\n\t\t) {\n\t\t\tconst onboardingResponse = await this.uiStore.getNextOnboardingPrompt();\n\t\t\tconst promptTimeout =\n\t\t\t\tonboardingResponse.toast_sequence_number === 1 ? FIRST_ONBOARDING_PROMPT_TIMEOUT : 1000;\n\n\t\t\tif (onboardingResponse.title && onboardingResponse.description) {\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\tmessage: onboardingResponse.description,\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\tcustomClass: 'clickable',\n\t\t\t\t\t\tcloseOnClick: true,\n\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\tthis.$telemetry.track('user clicked onboarding toast', {\n\t\t\t\t\t\t\t\tseq_num: onboardingResponse.toast_sequence_number,\n\t\t\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\t\t\tdescription: onboardingResponse.description,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis.uiStore.openModal(ONBOARDING_CALL_SIGNUP_MODAL_KEY);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}, promptTimeout);\n\t\t\t}\n\t\t}\n\n\t\tsourceControlEventBus.on('pull', this.onSourceControlPull);\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openNodeDetail',\n\t\t\taction: ({ node }: { node: string }) => {\n\t\t\t\tthis.nodeSelectedByName(node, true);\n\t\t\t},\n\t\t});\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openSelectiveNodeCreator',\n\t\t\taction: async ({\n\t\t\t\tconnectiontype,\n\t\t\t\tnode,\n\t\t\t\tcreatorview,\n\t\t\t}: {\n\t\t\t\tconnectiontype: NodeConnectionType;\n\t\t\t\tnode: string;\n\t\t\t\tcreatorview?: string;\n\t\t\t}) => {\n\t\t\t\tconst nodeName = node ?? this.ndvStore.activeNodeName;\n\t\t\t\tconst nodeData = nodeName ? this.workflowsStore.getNodeByName(nodeName) : null;\n\n\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\tawait this.redrawNode(node);\n\t\t\t\t// Wait for UI to update\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (creatorview) {\n\t\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\t\tcreateNodeActive: true,\n\t\t\t\t\t\t\tnodeCreatorView: creatorview,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (connectiontype && nodeData) {\n\t\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t\t\tendpointUuid: `${nodeData.id}-input${connectiontype}0`,\n\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NOTICE_ERROR_MESSAGE,\n\t\t\t\t\t\t\toutputType: connectiontype,\n\t\t\t\t\t\t\tsourceId: nodeData.id,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\t\t\t},\n\t\t});\n\n\t\tthis.readOnlyEnvRouteCheck();\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tactivated() {\n\t\tconst openSideMenu = this.uiStore.addFirstStepOnLoad;\n\t\tif (openSideMenu) {\n\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t}\n\t\tthis.uiStore.addFirstStepOnLoad = false;\n\t\tthis.bindCanvasEvents();\n\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\tdocument.addEventListener('keyup', this.keyUp);\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\t\twindow.addEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.on('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.on('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.on('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.on('openChat', this.onOpenChat);\n\t\thistoryBus.on('nodeMove', this.onMoveNode);\n\t\thistoryBus.on('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.on('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.on('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.on('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.on('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.on('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.on('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.on('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.on('saveWorkflow', this.saveCurrentWorkflowExternal);\n\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tdeactivated() {\n\t\tthis.unbindCanvasEvents();\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\twindow.removeEventListener('beforeunload', this.onBeforeUnload);\n\t\twindow.removeEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.off('openChat', this.onOpenChat);\n\t\thistoryBus.off('nodeMove', this.onMoveNode);\n\t\thistoryBus.off('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.off('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.off('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.off('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.off('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.off('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.off('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.off('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.off('saveWorkflow', this.saveCurrentWorkflowExternal);\n\t},\n\tbeforeMount() {\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushConnect();\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\t// Make sure the event listeners get removed again else we\n\t\t// could add up with them registered multiple times\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\tthis.unregisterCustomAction('showNodeCreator');\n\t\tthis.unregisterCustomAction('openNodeDetail');\n\t\tthis.unregisterCustomAction('openSelectiveNodeCreator');\n\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushDisconnect();\n\t\t}\n\n\t\tthis.resetWorkspace();\n\t\tthis.instance.unbind();\n\t\tthis.instance.destroy();\n\t\tthis.uiStore.stateIsDirty = false;\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\tsourceControlEventBus.off('pull', this.onSourceControlPull);\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.node-view-root {\n\tposition: relative;\n\tflex: 1;\n\toverflow: hidden;\n\tbackground-color: var(--color-canvas-background);\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n}\n\n.node-view-wrapper {\n\tposition: fixed;\n}\n\n.node-view {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\ttransform-origin: 0 0;\n\tz-index: -1;\n}\n\n.node-view-background {\n\tbackground-color: var(--color-canvas-background);\n\tposition: absolute;\n\twidth: 10000px;\n\theight: 10000px;\n\tz-index: -2;\n}\n\n.move-active {\n\tcursor: grab;\n\tcursor: -moz-grab;\n\tcursor: -webkit-grab;\n\ttouch-action: none;\n}\n\n.move-in-process {\n\tcursor: grabbing;\n\tcursor: -moz-grabbing;\n\tcursor: -webkit-grabbing;\n\ttouch-action: none;\n}\n\n.workflow-execute-wrapper {\n\tposition: absolute;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-2xl);\n\twidth: auto;\n\n\t@media (max-width: $breakpoint-2xs) {\n\t\tbottom: 150px;\n\t}\n\n\tbutton {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tmargin-left: 0.625rem;\n\n\t\t&:first-child {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n\n/* Makes sure that when selected with mouse it does not select text */\n.do-not-select *,\n.jtk-drag-select * {\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n</style>\n\n<style lang=\"scss\">\n.node-view-wrapper {\n\t--drag-scope-active-disabled-color: var(--color-foreground-dark);\n\n\t&.connection-drag-scope-active {\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t// Grey out incompatible node type endpoints\n\t\t\t&:not(.connection-drag-scope-active-type-#{$node-type}) {\n\t\t\t\t.diamond-output-endpoint,\n\t\t\t\t.jtk-connector,\n\t\t\t\t.add-input-endpoint {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\n\t\t\t\t.node-input-endpoint-label,\n\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.connection-drag-scope-active-type-#{$node-type} {\n\t\t\t\t// Dragging input\n\t\t\t\t&.connection-drag-scope-active-connection-target {\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t}\n\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t// Apply style to dragged compatible input endpoint\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-input-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Dragging output\n\t\t\t\t&.connection-drag-scope-active-connection-source {\n\t\t\t\t\t// Apply style to dragged compatible output endpoint\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.drop-add-node-label {\n\tcolor: var(--color-text-dark);\n\tfont-weight: 600;\n\tfont-size: 0.8em;\n\ttext-align: center;\n\tbackground-color: #ffffff55;\n}\n\n.connection-actions {\n\t&:hover {\n\t\tdisplay: block !important;\n\t}\n\n\t> button {\n\t\tcolor: var(--color-foreground-xdark);\n\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\tbackground-color: var(--color-background-xlight);\n\t\tborder-radius: var(--border-radius-base);\n\t\theight: var(--spacing-l);\n\t\twidth: var(--spacing-l);\n\t\tcursor: pointer;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\tposition: absolute;\n\t\ttop: -12px;\n\n\t\t&.add {\n\t\t\tright: 4px;\n\t\t}\n\n\t\t&.delete {\n\t\t\tleft: 4px;\n\t\t}\n\n\t\t&.delete-single {\n\t\t\tleft: -12px;\n\t\t}\n\n\t\tsvg {\n\t\t\tpointer-events: none;\n\t\t\tfont-size: var(--font-size-2xs);\n\t\t}\n\n\t\t&:hover {\n\t\t\tborder-color: var(--color-primary);\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n</style>\n\n<style module lang=\"scss\">\n.content {\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: auto;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.shake {\n\tanimation: 1s 200ms shake;\n}\n\n@keyframes shake {\n\t10%,\n\t90% {\n\t\ttransform: translate3d(-1px, 0, 0);\n\t}\n\n\t20%,\n\t80% {\n\t\ttransform: translate3d(2px, 0, 0);\n\t}\n\n\t30%,\n\t50%,\n\t70% {\n\t\ttransform: translate3d(-4px, 0, 0);\n\t}\n\n\t40%,\n\t60% {\n\t\ttransform: translate3d(4px, 0, 0);\n\t}\n}\n</style>\n"],"file":"assets/NodeView-caDno-kw.js"}
1
+ {"version":3,"mappings":"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","names":["deviceSupportHelpers","defineComponent","moveNodeWorkflow","mapStores","useUIStore","offsetPosition","x","y","getMousePosition","nodeViewOffsetPositionX","nodeViewOffsetPositionY","moveButtonPressed","useCanvasStore","defineStore","workflowStore","useWorkflowsStore","nodeTypesStore","useNodeTypesStore","uiStore","historyStore","useHistoryStore","sourceControlStore","useSourceControlStore","jsPlumbInstanceRef","ref","isDragging","lastSelectedConnection","newNodeInsertPosition","nodes","computed","triggerNodes","node","START_NODE_TYPE","isDemo","nodeViewScale","canvasAddButtonPosition","readOnlyEnv","watch","readOnly","setRecenteredCanvasAddButtonPosition","offset","position","getMidCanvasPosition","PLACEHOLDER_TRIGGER_NODE_SIZE","getNewNodePosition","getPlaceholderTriggerNodeUI","uuid","DEFAULT_PLACEHOLDER_TRIGGER_BUTTON","getNodesWithPlaceholderNode","canvasPositionFromPagePosition","sidebarWidth","SIDEBAR_WIDTH","SIDEBAR_WIDTH_EXPANDED","relativeX","relativeY","setZoomLevel","zoomLevel","_a","resetZoom","scale","scaleReset","zoomIn","scaleBigger","zoomOut","scaleSmaller","zoomToFit","getZoomToFit","wheelMoveWorkflow","deltaX","deltaY","shiftKeyPressed","wheelScroll","e","normalizeWheelEventDelta","scaleFactor","getScaleFromWheelEventDelta","applyScale","initInstance","container","newInstance","CONNECTOR_FLOWCHART_TYPE","CONNECTOR_PAINT_STYLE_DEFAULT","CONNECTOR_PAINT_STYLE_PRIMARY","CONNECTOR_ARROW_OVERLAYS","GRID_SIZE","params","nodeName","isSelected","nodeData","moveNodes","newNodePosition","element","updateInformation","oldPosition","MoveNodeCommand","pos","jsPlumbInstance","isOpen","target","actions","actionCallback","useContextMenu","onAction","workflowsStore","getInputDataWithPinned","useDataSchema","i18n","useI18n","isReadOnly","targetNodes","selectedNodes","currentTarget","canAddNodeOfType","nodeType","sameTypeNodes","n","canDuplicateNode","NOT_DUPLICATABE_NODE_TYPES","canPinNode","dataToPin","PIN_DATA_NODE_TYPES_DENYLIST","hasPinData","close","open","event","menuTarget","onlyStickies","STICKY_NODE_TYPE","i18nOptions","selectionActions","menuActions","singleNodeActions","_dispatchAction","action","useCanvasMouseSelect","selectActive","selectBox","isTouchDevice","isCtrlKeyPressed","useDeviceSupport","canvasStore","isContextMenuOpen","_setSelectBoxStyle","styles","_showSelectBox","getMousePositionWithinNodeView","_updateSelectBox","selectionBox","_getSelectionBox","_hideSelectBox","_getNodesInSelection","returnNodes","_createSelectBox","mouseUpMouseSelect","_mouseMoveSelect","deselectAllNodes","nodeSelected","mouseDownMouseSelect","mousePosition","nodeViewOffsetPosition","getRelativePosition","nodeDeselected","instance","onMounted","useUniqueNodeName","numberSuffixedNames","acc","uniqueNodeName","originalName","extraNames","canvasNames","nsn","unique","index","remainder","lastChar","match","_b","pinData","useToast","useNDVStore","outputTypes","NodeHelpers.getConnectionTypes","output","NodeConnectionType","data","error","title","toRemove","message","positionMatchRegEx","positionMatch","lineBreaksUpToPosition","activeNodeName","currentPinData","workflow","workflowJson","jsonStringify","newPinData","newPinDataSize","MAX_PINNED_DATA_SIZE","stringSizeInBytes","MAX_WORKFLOW_SIZE","MAX_EXPECTED_REQUEST_SIZE","source","jsonParse","telemetryPayload","useExternalHooks","errorType","_sfc_main$o","NodeIcon","inputRef","_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_ctx","_cache","args","_createVNode","_component_NodeIcon","_component_n8n_popover","_withCtx","_createElementVNode","_createTextVNode","_toDisplayString","_createBlock","_component_font_awesome_icon","_withModifiers","_component_n8n_text","_component_n8n_input","$event","_component_n8n_button","_sfc_main$n","utmTags","primaryDocUrl","_d","_c","NPM_PACKAGE_DOCS_BASE_URL","BUILTIN_NODES_DOCS_URL","isCommunityPackageName","options","COMMUNITY_NODES_INSTALLATION_DOCS_URL","pushCogRight","tab","_component_n8n_tabs","_sfc_main$m","copyPaste","workflowHelpers","OPEN_URL_PANEL_TRIGGER_NODE_TYPES","webhookData","FORM_TRIGGER_NODE_TYPE","webhookUrl","_hoisted_1","_hoisted_3","_hoisted_5","_hoisted_7","_hoisted_12","_component_el_collapse_transition","_hoisted_2","_hoisted_4","_component_el_row","_component_el_col","_component_n8n_radio_buttons","_Fragment","_renderList","webhook","_component_n8n_tooltip","_hoisted_13","_hoisted_6","_hoisted_9","_sfc_main$l","workflowRun","props","ctx","useMessage","triggeredNode","MANUAL_TRIGGER_NODE_TYPE","WEBHOOK_NODE_TYPE","waitingOnWebhook","executedNode","activeNode","shouldUnpinAndExecute","MODAL_CONFIRM","_mergeProps","_sfc_main$k","NodeTitle","NodeCredentials","ParameterInputList","NodeSettingsTabs","NodeWebhooks","NodeExecuteButton","nodeHelpers","useNodeHelpers","useCredentialsStore","useWorkflowsEEStore","IMPORT_CURL_MODAL_KEY","workflowNode","inputs","NodeHelpers.getNodeInputs","shortNodeType","item","credential","nodeCredential","CUSTOM_NODES_DOCS_URL","MAIN_NODE_PANEL_WIDTH","newNode","oldNode","newValue","oldValue","parameters","parameter","parameterName","name","value","nameParts","lastNamePart","isArray","lastNameParts","removedNodeValue","remainingNodeValues","tempValue","get","removedArrayNodeValue","remainingArrayNodeValues","set","deepCopy","RenameNodeCommand","parameterData","nodeNameBefore","sendData","nodeParameters","NodeHelpers.getNodeParameters","oldNodeParameters","parameterPath","parameterPathArray","path","unset","key","foundNodeSettings","nodeSetting","_hoisted_8","_hoisted_10","_hoisted_11","_component_NodeTitle","_createCommentVNode","_component_NodeExecuteButton","_component_NodeSettingsTabs","_component_i18n_t","_component_n8n_link","_component_n8n_notice","_withDirectives","_component_node_webhooks","_component_parameter_input_list","_component_node_credentials","_sfc_main$j","draggablePosition","activeElement","_sfc_render","$props","$setup","$data","$options","_resolveDynamicComponent","_renderSlot","_Teleport","_normalizeStyle","_sfc_main$i","Draggable","_component_Draggable","moveNodeDirection","direction","matchedDirectionNode","connectedNodes","emit","onKeyDown","matchingDirection","getINodesFromNames","names","rootName","connectionGroups","tooltipPositionMapper","onBeforeUnmount","__expose","SIDE_MARGIN","SIDE_PANELS_MARGIN","MIN_PANEL_WIDTH","PANEL_WIDTH","PANEL_WIDTH_LARGE","initialMainPanelWidth","_sfc_main$g","debounceHelper","PanelDragButton","NDVFloatingNodes","ndvEventBus","supportedDirections","hasInput","outputPanelRelativeLeft","panelMinLeft","currentRelativeLeftDelta","multiplier","minRelativeWidth","windowWidth","isBelowMinLeft","isMaxRight","width","relativeWidth","mainPanelRelativeWidth","relativeLeft","mainPanelRelativeLeft","mainPanelRelativeRight","isMinLeft","isInputless","positionByName","px","relativeDistance","storedPanelWidthData","useStorage","LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH","parsedWidth","initialPosition","_component_NDVFloatingNodes","_component_n8n_resize_wrapper","_component_PanelDragButton","sanitizeOptions","defaults","_sfc_main$f","sanitizeHtml","_sfc_main$e","VueJsonPretty","RunDataHtml","id","fileName","fileType","mimeType","isJSONData","isHTMLData","binaryUrl","fetchedData","_component_vue_json_pretty","_component_run_data_html","_sfc_main$d","BinaryDataDisplayEmbed","binaryData","workflowExecution","executionData","_component_BinaryDataDisplayEmbed","_sfc_main$c","MAX_DISPLAY_DATA_SIZE","parameterFullName","baseErrorMessage","fullPath","pathParts","currentParameterName","arrayMatch","currentParameter","_hoisted_16","_hoisted_18","_hoisted_21","_hoisted_22","_component_el_card","_hoisted_14","_hoisted_15","_hoisted_17","_hoisted_19","_component_n8n_icon_button","_hoisted_23","_hoisted_24","RunDataTable","defineAsyncComponent","__vitePreload","RunDataJson","RunDataSchema","RunDataHtml$2","RunDataSearch","_sfc_main$b","genericHelpers","BinaryDataDisplay","NodeErrorView","CodeNodeEditor","externalHooks","MAX_DISPLAY_ITEMS_AUTO_ALL","DATA_PINNING_DOCS_URL","DATA_EDITING_DOCS_URL","inputName","schemaView","isEmpty","HTML_NODE_TYPE","runData","taskData","pinOrLiveData","executionDataToJson","capitalize","branches","i","totalItemsCount","itemsCount","items","outputName","appendBranchWord","NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND","NodeHelpers.getNodeOutputs","itemIndex","pinDataDiscoveryFlag","LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG","dataPinningEventBus","LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG","origin","inputData","clearJsonKey","TEST_PIN_DATA","type","pageSize","maxPage","displayMode","previous","dataContainerRef","dataDisplay","option","itemsLabel","runIndex","outputIndex","connectionType","json","searchInObject","rawInputData","outputs","fileExtension","url","saveAs","bufferString","blob","d","outputConfiguration","isObject","jsonItems","run","newData","prevData","branchIndex","newSearch","_component_n8n_callout","_component_BinaryDataDisplay","_createSlots","_component_n8n_select","_component_n8n_option","_component_run_data_search","_component_n8n_spinner","_component_code_node_editor","_component_n8n_info_tip","_component_NodeErrorView","_Suspense","_component_run_data_table","_component_run_data_json","_component_run_data_schema","binaryDataEntry","_component_el_pagination","size","_component_n8n_block_ui","_sfc_main$a","OUTPUT_TYPE","_sfc_main$9","RunData","RunInfo","RunDataAi","resultData","updatedAt","runAt","runDataRef","outputMode","_component_RunData","_component_RunInfo","_component_run_data_ai","_sfc_main$7","WireMeUp","toIgnore","CRON_NODE_TYPE","INTERVAL_NODE_TYPE","input","executingNode","search","val","connectedInputs","inputIndex","truncated","curr","prev","_component_WireMeUp","_sfc_main$6","CopyInput","createEventBus","getTriggerNodeServiceName","serviceName","VIEWS","WORKFLOW_SETTINGS_MODAL_KEY","_Transition","_component_n8n_pulse","_component_CopyInput","_component_n8n_heading","_component_n8n_info_accordion","_sfc_main$5","workflowActivate","NodeSettings","InputPanel","OutputPanel","NDVDraggablePanels","TriggerPanel","useSettingsStore","isWebhookBasedNode","isPollingNode","override","outgoingConnections","parentNodeName","EXECUTABLE_TRIGGER_NODE_TYPES","BASE_NODE_SURVEY_URL","credentials","usedCredentials","foreignCredentials","EnterpriseEditionFeature","isTooltipVisible","pane","nodeTypeName","_component_el_dialog","_component_n8n_icon","_component_NDVDraggablePanels","_component_OutputPanel","_component_NodeSettings","_component_TriggerPanel","_component_InputPanel","contextMenu","dropdown","onActionSelect","onVisibleChange","createAddInputEndpointSpec","connectionName","color","multiple","NODE_CONNECTION_TYPE_ALLOW_MULTIPLE","createDiamondOutputEndpointSpec","nodeBase","endpoint","canvas","nodeTypeData","rootTypeIndexData","typeIndexData","sortedInputs","b","inputConfiguration","rootCategoryInputName","rootTypeIndex","typeIndex","inputsOfSameRootType","thisInputName","nonMainInputs","requiredNonMainInputs","optionalNonMainInputs","spacerIndexes","anchorPosition","NodeViewUtils.getAnchorPosition","scope","NodeViewUtils.getEndpointScope","newEndpointData","NodeViewUtils.getInputEndpointUUID","NodeViewUtils.getInputEndpointStyle","NodeViewUtils.getScope","NodeViewUtils.getInputNameOverlay","leftGroupItemsCount","rightGroupItemsCount","insertSpacerBetweenGroups","NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS","minItemsCount","NODE_MIN_INPUT_ITEMS_COUNT","spacerIndex","maxLabelLength","outputConfigurations","endpointLabelLength","rootCategoryOutputName","outputsOfSameRootType","outputData","thisOutputName","NodeViewUtils.getOutputEndpointUUID","NodeViewUtils.getOutputEndpointStyle","overlaySpec","NodeViewUtils.getOutputNameOverlay","plusEndpointData","plusEndpoint","NO_OP_NODE_TYPE","createSupplementalConnectionType","_sfc_main$3","TitledList","FontAwesomeIcon","workflowResultDataNode","eventTriggerDescription","classes","otherOutputs","spacerCount","mainOutputs","nodeExecutionRunData","issues","executionRunData","NodeHelpers.nodeIssuesToString","lastNodeExecuted","waitDate","WAIT_TIME_UNLIMITED","returnStyles","borderColor","shouldShowTriggerTooltip","dataItemsCount","nodeSubtitle","CUSTOM_API_CALL_KEY","EnableNodeToggleCommand","_withScopeId","_pushScopeId","_popScopeId","_resolveDirective","_vShow","_component_titled_list","_directive_touch","_hoisted_20","_sfc_main$2","colorPopoverTrigger","forceActions","setForceActions","content","property","isString","isNumber","edit","link","isOnboardingNote","QUICKSTART_NOTE_NAME","isWelcomeVideo","height","dX","dY","_component_n8n_sticky","_","SEQUENTIAL_BONUS","SEPARATOR_BONUS","CAMEL_BONUS","FIRST_LETTER_BONUS","LEADING_LETTER_PENALTY","MAX_LEADING_LETTER_PENALTY","UNMATCHED_LETTER_PENALTY","fuzzyMatchSimple","pattern","patternIdx","strIdx","patternChar","targetChar","fuzzyMatch","fuzzyMatchRecursive","patternCurIndex","targetCurrIndex","targetMatches","matches","maxMatches","nextMatch","recursionCount","recursionLimit","outScore","recursiveMatch","bestRecursiveMatches","bestRecursiveScore","firstMatch","recursiveMatches","recursiveResult","recursiveScore","matched","penalty","unmatched","currIdx","prevIdx","neighbor","getValue","obj","prop","segments","result","sublimeSearch","filter","keys","results","accu","values","weight","v","itemMatch","a","transformNodeType","subcategory","createElement","uuidv4","CORE_NODES_CATEGORY","DEFAULT_SUBCATEGORY","subcategorizeItems","WHITE_LISTED_SUBCATEGORIES","AI_SUBCATEGORY","subcategories","category","sortNodeCreateElements","displayNameA","displayNameB","searchNodes","searchFilter","trimmedFilter","flattenCreateElements","groupItemsInSections","sections","itemsBySection","section","s","useNodeCreatorStore","STORES","selectedView","TRIGGER_NODE_CREATOR_VIEW","mergedNodes","showScrim","openSource","allNodeCreatorNodes","setMergeNodes","setActions","setShowScrim","isVisible","setSelectedView","view","setOpenSource","nodeCreatorStore","containerCssVars","getAiNodesBySubcategory","AIView","_nodes","chainNodes","AI_CATEGORY_CHAINS","agentNodes","AI_CATEGORY_AGENTS","AI_NODE_CREATOR_VIEW","AI_OTHERS_NODE_CREATOR_VIEW","AINodesView","getAISubcategoryProperties","nodeConnectionType","AI_CATEGORY_DOCUMENT_LOADERS","AI_CATEGORY_LANGUAGE_MODELS","AI_CATEGORY_MEMORY","AI_CATEGORY_OUTPUTPARSER","AI_CATEGORY_RETRIEVERS","AI_CATEGORY_TEXT_SPLITTERS","AI_CATEGORY_TOOLS","AI_CATEGORY_EMBEDDING","AI_CATEGORY_VECTOR_STORES","AI_UNCATEGORIZED_CATEGORY","TriggerView","EMAIL_IMAP_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE","OTHER_TRIGGER_NODES_SUBCATEGORY","RegularView","REGULAR_NODE_CREATOR_VIEW","RSS_READ_NODE_TYPE","EMAIL_SEND_NODE_TYPE","TRANSFORM_DATA_SUBCATEGORY","SET_NODE_TYPE","CODE_NODE_TYPE","DATETIME_NODE_TYPE","FILTER_NODE_TYPE","REMOVE_DUPLICATES_NODE_TYPE","SPLIT_OUT_NODE_TYPE","LIMIT_NODE_TYPE","SUMMARIZE_NODE_TYPE","AGGREGATE_NODE_TYPE","MERGE_NODE_TYPE","MARKDOWN_NODE_TYPE","XML_NODE_TYPE","CRYPTO_NODE_TYPE","FLOWS_CONTROL_SUBCATEGORY","IF_NODE_TYPE","SPLIT_IN_BATCHES_NODE_TYPE","FILES_SUBCATEGORY","HELPERS_SUBCATEGORY","HTTP_REQUEST_NODE_TYPE","KEYBOARD_ID_ATTR","WATCHED_KEYS","useKeyboardNavigation","selectableItems","activeItemId","keysHooks","getItemType","getElementId","refreshSelectableItems","resolve","cleanupSelectableItems","el","executeKeyHooks","keyboardKey","activeItem","hook","pressedKey","activeItemIndex","isArrowDown","isArrowUp","nextItemIndex","setActiveItem","previousIndex","setActiveItemId","itemId","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","registerKeyHook","getActiveItemIndex","useViewStacks","viewStacks","activeStackItems","stack","extendItemsWithUUID","searchBaseItems","searchBase","activeViewStack","flatBaselineItems","activeViewStackMode","globalSearchItemsDiff","allNodes","itemsBySubcategory","gotoCompatibleConnectionView","isOutput","nodesByConnectionType","relatedAIView","nextTick","pushViewStack","AI_CODE_NODE_TYPE","displayNode","setStackBaselineItems","stackItems","itemsInSubcategory","matchedNodes","updateCurrentViewStack","newStackUuid","popViewStack","currentStack","matchedIndex","typedKey","resetViewStacks","NodeCreation","CanvasControls","_sfc_main","NodeDetailsView","Node","Sticky","CanvasAddButton","KeyboardShortcutTooltip","ContextMenu","locale","dataSchema","useGlobalLinkActions","useTitleChange","useExecutionDebugging","err","vm","info","to","from","currentTab","getNodeViewTab","nodeViewNotInitialized","workflowChanged","PLACEHOLDER_EMPTY_WORKFLOW_ID","isOpeningTemplate","MAIN_HEADER_TABS","previousDirtyState","containsTrigger","newScale","elementRef","next","confirmModal","MODAL_CANCEL","useTagsStore","useRootStore","useTemplatesStore","useUsersStore","useEnvironmentsStore","useExternalSecretsStore","useCollaborationStore","usePushConnectionStore","NodeViewUtils.getBackgroundStyles","returnClasses","MANUAL_CHAT_TRIGGER_NODE_TYPE","NodeViewUtils.GRID_SIZE","NODE_CREATOR_OPEN_SOURCES","WORKFLOW_LM_CHAT_MODAL_KEY","workflowData","TelemetryHelpers.generateNodesGraph","N8nAddInputEndpointType","n8nAddInputEndpoint","nodeIssues","managedNode","endpoints","notice","saved","executionId","nodeErrorFound","errorCheck","NodeViewUtils.getFixedNodesList","templateId","selectedExecution","tags","tagIds","tag","ctrlModifier","shiftModifier","ctrlAltModifier","noModifierKeys","lastSelectedNode","nodeViewEventBus","connections","parentNode","connectionsParent","siblingNode","lastCheckedNodePosition","nextSelectNode","ouputConnections","ouputConnection","nextStatePinned","checkNodes","sourceNodeName","margin","recordHistory","sourceNode","deleteCopiedNodes","isCut","workflowToCopy","execution","executedData","pushData","trackProps","plainTextData","importTags","nodeIdMap","UPDATE_WEBHOOK_ID_NODE_TYPES","newId","currInstanceId","nodeGraph","NodeViewUtils.getNewNodePosition","tagsEnabled","allTags","tagNames","workflowTags","notFound","creatingTagPromises","creationPromise","imported","dropData","DRAG_EVENT_DATA_KEY","insertNodePosition","NodeViewUtils.NODE_SIZE","setActive","deselectAllOthers","maxNodes","overrides","nodeVersion","newNodeData","credentialPerType","defaultCredential","selectedCredentials","selected","authentication","authDisplayOptions","displayOption","optionValue","showDetail","trackHistory","isAutoAdd","diffX","NodeViewUtils.getConnectorLengths","NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES","NodeViewUtils.PUSH_NODES_OFFSET","yOffset","sourceNodeType","offsets","sourceNodeOutputs","sourceNodeOutputMainOutputs","sourceOutputIndex","lastSelectedNodeType","lastSelectedNodeWorkflow","lastSelectedInputs","scopedConnectionIndex","inputType","inputsTypes","pushOffset","localizedName","useSegment","trackProperties","sourceNodeOutputIndex","targetNodeName","targetNodeOuputIndex","nodeConnections","connection","targetNodeOutputIndex","targetNode","connectionData","lastSelectedNodeOutputIndex","lastSelectedNodeEndpointUuid","targetEndpoint","lastSelectedEndpoint","newNodeElement","viableConnection","conn","targetOutputIndex","outputType","filterFound","overrideTargetEndpoint","isTarget","NodeViewUtils.resetConnectionAfterPull","targetInfoType","targetNodeType","sourceInfo","targetInfo","tempEndpoint","NodeViewUtils.resetConnection","NodeViewUtils.moveBackInputLabelPosition","NodeViewUtils.hideOutputNameLabel","NodeViewUtils.addConnectionActionsOverlay","endpointArrow","NodeViewUtils.getOverlay","OVERLAY_ENDPOINT_ARROW_ID","getConnectorPaintStyleData","AddConnectionCommand","NodeViewUtils.addConnectionTestData","totalNodes","NodeViewUtils.showOrHideItemsLabel","NodeViewUtils.showOrHideMidpointArrow","overlay","NodeViewUtils.hideConnectionActions","NodeViewUtils.showConnectionActions","NodeViewUtils.resetInputLabelPosition","connectionInfo","mouse","getConnectionInfo","NodeViewUtils.showOutputNameLabel","RemoveConnectionCommand","removeCommand","scopedEndpoints","requiredType","filteredEndpoints","isSameNode","endpointType","onMouseMove","intersectingEndpoints","isEndpointIntersect","NodeViewUtils.isElementIntersection","isNodeElementIntersect","aEndpointIntersect","NodeViewUtils.calculateElementIntersection","bEndpointIntersect","NodeViewUtils.showDropConnectionState","NodeViewUtils.showPullConnectionState","onMouseUp","EVENT_CONNECTION_ABORT","INTERCEPT_BEFORE_DROP","EVENT_CONNECTION","EVENT_DRAG_MOVE","EVENT_CONNECTION_MOUSEOVER","EVENT_CONNECTION_MOUSEOUT","EVENT_CONNECTION_MOVED","EVENT_ENDPOINT_MOUSEOVER","EVENT_ENDPOINT_MOUSEOUT","EVENT_CONNECTION_DETACHED","EVENT_CONNECTION_DRAG","EVENT_PLUS_ENDPOINT_CLICK","EVENT_ADD_INPUT_ENDPOINT_CLICK","bind","elements","endpointInstance","N8nPlusEndpointType","TIME","MODAL_CLOSE","workflowId","outputUuid","inputUuid","removeVisualConnection","sourceNodeOutput","sourceNodeOutputName","connectionInstance","targetInputIndex","sourceId","targetId","sourceEndpoint","uuids","nodeEl","outgoing","incoming","waiting","allNodeConnections","outputMap","NodeViewUtils.getOutputSummary","NodeViewUtils.recoveredConnection","NodeViewUtils.addConnectionOutputSuccess","NODE_OUTPUT_DEFAULT_KEY","NodeViewUtils.getRunItemsLabel","trackBulk","requiredNodeTypes","deleteAllowed","checkNode","waitForNewConnection","conn1","conn2","RemoveNodeCommand","tempName","currentName","promptResponsePromise","nameInput","promptResponse","newName","isActive","nodeCredentialType","nodeCredentials","credentialOptions","credentialsId","credentialsForId","optionData","credentialsForName","AddNodeCommand","batchedConnectionData","outwardConnections","sourceIndex","targetData","nodeNameTable","newNodeNames","nodeTypesCount","oldName","createNodes","localized","newConnections","currentConnections","createNodeNames","connectionIndex","nodeSourceConnections","tempWorkflow","pinDataSuccess","exportNodeNames","pinDataForNode","connectionToKeep","typeConnections","nodeInfos","nodesToBeFetched","nodeVersions","createNodeActive","nodeCreatorView","mode","dragAndDrop","currentPosition","openDetail","nodePosition","lastAddedNode","newNodesOffset","fromNode","toNode","lastNodeInputs","nodeUi","callback","suspend","isDisabled","loadPromises","ready","getAccountAge","ONBOARDING_PROMPT_TIMEBOX","onboardingResponse","promptTimeout","FIRST_ONBOARDING_PROMPT_TIMEOUT","ONBOARDING_CALL_SIGNUP_MODAL_KEY","sourceControlEventBus","connectiontype","creatorview","historyBus","_component_canvas_add_button","_component_node","stickyData","_component_sticky","_component_node_details_view","_component_NodeCreation","_component_keyboard_shortcut_tooltip"],"sources":["../../src/mixins/deviceSupportHelpers.ts","../../src/mixins/moveNodeWorkflow.ts","../../src/stores/canvas.store.ts","../../src/composables/useContextMenu.ts","../../src/composables/useCanvasMouseSelect.ts","../../src/composables/useUniqueNodeName.ts","../../src/mixins/pinData.ts","../../src/components/NodeTitle.vue","../../src/components/NodeSettingsTabs.vue","../../src/components/NodeWebhooks.vue","../../src/components/NodeExecuteButton.vue","../../src/components/NodeSettings.vue","../../src/components/Draggable.vue","../../src/components/PanelDragButton.vue","../../src/components/NDVFloatingNodes.vue","../../src/components/NDVDraggablePanels.vue","../../src/components/RunDataHtml.vue","../../src/components/BinaryDataDisplayEmbed.vue","../../src/components/BinaryDataDisplay.vue","../../src/components/Error/NodeErrorView.vue","../../src/components/RunData.vue","../../src/components/RunInfo.vue","../../src/components/OutputPanel.vue","../../src/components/WireMeUp.vue","../../src/components/InputPanel.vue","../../src/components/TriggerPanel.vue","../../src/components/NodeDetailsView.vue","../../src/components/ContextMenu/ContextMenu.vue","../../src/mixins/nodeBase.ts","../../src/components/Node.vue","../../src/components/Sticky.vue","../../src/utils/sortUtils.ts","../../src/components/Node/NodeCreator/utils.ts","../../src/stores/nodeCreator.store.ts","../../src/views/CanvasAddButton.vue","../../src/components/Node/NodeCreator/viewsData.ts","../../src/components/Node/NodeCreator/composables/useKeyboardNavigation.ts","../../src/components/Node/NodeCreator/composables/useViewStacks.ts","../../src/views/NodeView.vue"],"sourcesContent":["import { defineComponent } from 'vue';\n\nexport const deviceSupportHelpers = defineComponent({\n\tdata() {\n\t\treturn {\n\t\t\t// @ts-ignore msMaxTouchPoints is deprecated but must fix tablet bugs before fixing this.. otherwise breaks touchscreen computers\n\t\t\tisTouchDevice: 'ontouchstart' in window || navigator.msMaxTouchPoints,\n\t\t\tisMacOs: /(ipad|iphone|ipod|mac)/i.test(navigator.platform), // TODO: `platform` deprecated\n\t\t};\n\t},\n\tcomputed: {\n\t\t// TODO: Check if used anywhere\n\t\tcontrolKeyCode(): string {\n\t\t\tif (this.isMacOs) {\n\t\t\t\treturn 'Meta';\n\t\t\t}\n\t\t\treturn 'Control';\n\t\t},\n\t},\n\tmethods: {\n\t\tisCtrlKeyPressed(e: MouseEvent | KeyboardEvent): boolean {\n\t\t\tif (this.isTouchDevice === true && e instanceof MouseEvent) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (this.isMacOs) {\n\t\t\t\treturn e.metaKey;\n\t\t\t}\n\t\t\treturn e.ctrlKey;\n\t\t},\n\t},\n});\n","import { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport { deviceSupportHelpers } from '@/mixins/deviceSupportHelpers';\nimport { getMousePosition } from '@/utils/nodeViewUtils';\nimport { useUIStore } from '@/stores/ui.store';\n\nexport const moveNodeWorkflow = defineComponent({\n\tmixins: [deviceSupportHelpers],\n\tdata() {\n\t\treturn {\n\t\t\tmoveLastPosition: [0, 0],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useUIStore),\n\t},\n\tmethods: {\n\t\tmoveWorkflow(e: MouseEvent) {\n\t\t\tconst offsetPosition = this.uiStore.nodeViewOffsetPosition;\n\n\t\t\tconst [x, y] = getMousePosition(e);\n\n\t\t\tconst nodeViewOffsetPositionX = offsetPosition[0] + (x - this.moveLastPosition[0]);\n\t\t\tconst nodeViewOffsetPositionY = offsetPosition[1] + (y - this.moveLastPosition[1]);\n\t\t\tthis.uiStore.nodeViewOffsetPosition = [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\n\t\t\t// Update the last position\n\t\t\tthis.moveLastPosition[0] = x;\n\t\t\tthis.moveLastPosition[1] = y;\n\t\t},\n\t\tmouseDownMoveWorkflow(e: MouseEvent, moveButtonPressed: boolean) {\n\t\t\tif (!this.isCtrlKeyPressed(e) && !moveButtonPressed) {\n\t\t\t\t// We only care about it when the ctrl key is pressed at the same time.\n\t\t\t\t// So we exit when it is not pressed.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Prevent moving canvas on anything but middle button\n\t\t\tif (e.button !== 1) {\n\t\t\t\tthis.uiStore.nodeViewMoveInProgress = true;\n\t\t\t}\n\n\t\t\tconst [x, y] = getMousePosition(e);\n\n\t\t\tthis.moveLastPosition[0] = x;\n\t\t\tthis.moveLastPosition[1] = y;\n\n\t\t\t// @ts-ignore\n\t\t\tthis.$el.addEventListener('mousemove', this.mouseMoveNodeWorkflow);\n\t\t},\n\t\tmouseUpMoveWorkflow(e: MouseEvent) {\n\t\t\tif (!this.uiStore.nodeViewMoveInProgress) {\n\t\t\t\t// If it is not active return directly.\n\t\t\t\t// Else normal node dragging will not work.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\tthis.$el.removeEventListener('mousemove', this.mouseMoveNodeWorkflow);\n\n\t\t\tthis.uiStore.nodeViewMoveInProgress = false;\n\n\t\t\t// Nothing else to do. Simply leave the node view at the current offset\n\t\t},\n\t\tmouseMoveNodeWorkflow(e: MouseEvent) {\n\t\t\t// @ts-ignore\n\t\t\tif (e.target && !e.target.id.includes('node-view')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Signal that moving canvas is active if middle button is pressed and mouse is moved\n\t\t\tif (e.buttons === 4) {\n\t\t\t\tthis.uiStore.nodeViewMoveInProgress = true;\n\t\t\t}\n\n\t\t\tif (e.buttons === 0) {\n\t\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t\t// comes back unpressed.\n\t\t\t\t// @ts-ignore\n\t\t\t\tthis.mouseUp(e);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.moveWorkflow(e);\n\t\t},\n\t},\n});\n","import { computed, ref, watch } from 'vue';\nimport { defineStore } from 'pinia';\nimport { v4 as uuid } from 'uuid';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport type { INodeUi, XYPosition } from '@/Interface';\nimport {\n\tapplyScale,\n\tgetScaleFromWheelEventDelta,\n\tnormalizeWheelEventDelta,\n\tscaleBigger,\n\tscaleReset,\n\tscaleSmaller,\n} from '@/utils/canvasUtils';\nimport { START_NODE_TYPE } from '@/constants';\nimport type {\n\tBeforeStartEventParams,\n\tBrowserJsPlumbInstance,\n\tDragStopEventParams,\n} from '@jsplumb/browser-ui';\nimport { newInstance } from '@jsplumb/browser-ui';\nimport type { Connection } from '@jsplumb/core';\nimport { MoveNodeCommand } from '@/models/history';\nimport {\n\tDEFAULT_PLACEHOLDER_TRIGGER_BUTTON,\n\tgetMidCanvasPosition,\n\tgetNewNodePosition,\n\tgetZoomToFit,\n\tPLACEHOLDER_TRIGGER_NODE_SIZE,\n\tCONNECTOR_FLOWCHART_TYPE,\n\tGRID_SIZE,\n\tCONNECTOR_PAINT_STYLE_DEFAULT,\n\tCONNECTOR_PAINT_STYLE_PRIMARY,\n\tCONNECTOR_ARROW_OVERLAYS,\n\tgetMousePosition,\n\tSIDEBAR_WIDTH,\n\tSIDEBAR_WIDTH_EXPANDED,\n} from '@/utils/nodeViewUtils';\nimport type { PointXY } from '@jsplumb/util';\n\nexport const useCanvasStore = defineStore('canvas', () => {\n\tconst workflowStore = useWorkflowsStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst uiStore = useUIStore();\n\tconst historyStore = useHistoryStore();\n\tconst sourceControlStore = useSourceControlStore();\n\n\tconst jsPlumbInstanceRef = ref<BrowserJsPlumbInstance>();\n\tconst isDragging = ref<boolean>(false);\n\tconst lastSelectedConnection = ref<Connection | null>(null);\n\tconst newNodeInsertPosition = ref<XYPosition | null>(null);\n\n\tconst nodes = computed<INodeUi[]>(() => workflowStore.allNodes);\n\tconst triggerNodes = computed<INodeUi[]>(() =>\n\t\tnodes.value.filter(\n\t\t\t(node) => node.type === START_NODE_TYPE || nodeTypesStore.isTriggerNode(node.type),\n\t\t),\n\t);\n\tconst isDemo = ref<boolean>(false);\n\tconst nodeViewScale = ref<number>(1);\n\tconst canvasAddButtonPosition = ref<XYPosition>([1, 1]);\n\tconst readOnlyEnv = computed(() => sourceControlStore.preferences.branchReadOnly);\n\n\twatch(readOnlyEnv, (readOnly) => {\n\t\tif (jsPlumbInstanceRef.value) {\n\t\t\tjsPlumbInstanceRef.value.elementsDraggable = !readOnly;\n\t\t}\n\t});\n\n\tconst setRecenteredCanvasAddButtonPosition = (offset?: XYPosition) => {\n\t\tconst position = getMidCanvasPosition(nodeViewScale.value, offset ?? [0, 0]);\n\n\t\tposition[0] -= PLACEHOLDER_TRIGGER_NODE_SIZE / 2;\n\t\tposition[1] -= PLACEHOLDER_TRIGGER_NODE_SIZE / 2;\n\n\t\tcanvasAddButtonPosition.value = getNewNodePosition(nodes.value, position);\n\t};\n\n\tconst getPlaceholderTriggerNodeUI = (): INodeUi => {\n\t\tsetRecenteredCanvasAddButtonPosition();\n\n\t\treturn {\n\t\t\tid: uuid(),\n\t\t\t...DEFAULT_PLACEHOLDER_TRIGGER_BUTTON,\n\t\t\tposition: canvasAddButtonPosition.value,\n\t\t};\n\t};\n\n\tconst getNodesWithPlaceholderNode = (): INodeUi[] =>\n\t\ttriggerNodes.value.length > 0 ? nodes.value : [getPlaceholderTriggerNodeUI(), ...nodes.value];\n\n\tconst canvasPositionFromPagePosition = (position: XYPosition): XYPosition => {\n\t\tconst sidebarWidth = isDemo.value\n\t\t\t? 0\n\t\t\t: uiStore.sidebarMenuCollapsed\n\t\t\t ? SIDEBAR_WIDTH\n\t\t\t : SIDEBAR_WIDTH_EXPANDED;\n\n\t\tconst relativeX = position[0] - sidebarWidth;\n\t\tconst relativeY = isDemo.value\n\t\t\t? position[1]\n\t\t\t: position[1] - uiStore.bannersHeight - uiStore.headerHeight;\n\n\t\treturn [relativeX, relativeY];\n\t};\n\n\tconst setZoomLevel = (zoomLevel: number, offset: XYPosition) => {\n\t\tnodeViewScale.value = zoomLevel;\n\t\tjsPlumbInstanceRef.value?.setZoom(zoomLevel);\n\t\tuiStore.nodeViewOffsetPosition = offset;\n\t};\n\n\tconst resetZoom = () => {\n\t\tconst { scale, offset } = scaleReset({\n\t\t\tscale: nodeViewScale.value,\n\t\t\toffset: uiStore.nodeViewOffsetPosition,\n\t\t\torigin: canvasPositionFromPagePosition([window.innerWidth / 2, window.innerHeight / 2]),\n\t\t});\n\t\tsetZoomLevel(scale, offset);\n\t};\n\n\tconst zoomIn = () => {\n\t\tconst { scale, offset } = scaleBigger({\n\t\t\tscale: nodeViewScale.value,\n\t\t\toffset: uiStore.nodeViewOffsetPosition,\n\t\t\torigin: canvasPositionFromPagePosition([window.innerWidth / 2, window.innerHeight / 2]),\n\t\t});\n\t\tsetZoomLevel(scale, offset);\n\t};\n\n\tconst zoomOut = () => {\n\t\tconst { scale, offset } = scaleSmaller({\n\t\t\tscale: nodeViewScale.value,\n\t\t\toffset: uiStore.nodeViewOffsetPosition,\n\t\t\torigin: canvasPositionFromPagePosition([window.innerWidth / 2, window.innerHeight / 2]),\n\t\t});\n\t\tsetZoomLevel(scale, offset);\n\t};\n\n\tconst zoomToFit = () => {\n\t\tconst nodes = getNodesWithPlaceholderNode();\n\t\tif (!nodes.length) {\n\t\t\t// some unknown workflow executions\n\t\t\treturn;\n\t\t}\n\t\tconst { zoomLevel, offset } = getZoomToFit(nodes, !isDemo.value);\n\t\tsetZoomLevel(zoomLevel, offset);\n\t};\n\n\tconst wheelMoveWorkflow = (deltaX: number, deltaY: number, shiftKeyPressed = false) => {\n\t\tconst offsetPosition = uiStore.nodeViewOffsetPosition;\n\t\tconst nodeViewOffsetPositionX = offsetPosition[0] - (shiftKeyPressed ? deltaY : deltaX);\n\t\tconst nodeViewOffsetPositionY = offsetPosition[1] - (shiftKeyPressed ? deltaX : deltaY);\n\t\tuiStore.nodeViewOffsetPosition = [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\t};\n\n\tconst wheelScroll = (e: WheelEvent) => {\n\t\t// Prevent browser back/forward gesture, default pinch to zoom etc.\n\t\te.preventDefault();\n\n\t\tconst { deltaX, deltaY } = normalizeWheelEventDelta(e);\n\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\tconst scaleFactor = getScaleFromWheelEventDelta(deltaY);\n\t\t\tconst { scale, offset } = applyScale(scaleFactor)({\n\t\t\t\tscale: nodeViewScale.value,\n\t\t\t\toffset: uiStore.nodeViewOffsetPosition,\n\t\t\t\torigin: canvasPositionFromPagePosition(getMousePosition(e)),\n\t\t\t});\n\t\t\tsetZoomLevel(scale, offset);\n\t\t\treturn;\n\t\t}\n\t\twheelMoveWorkflow(deltaX, deltaY, e.shiftKey);\n\t};\n\n\tfunction initInstance(container: Element) {\n\t\t// Make sure to clean-up previous instance if it exists\n\t\tif (jsPlumbInstanceRef.value) {\n\t\t\tjsPlumbInstanceRef.value.destroy();\n\t\t\tjsPlumbInstanceRef.value.reset();\n\t\t\tjsPlumbInstanceRef.value = undefined;\n\t\t}\n\n\t\tjsPlumbInstanceRef.value = newInstance({\n\t\t\tcontainer,\n\t\t\tconnector: CONNECTOR_FLOWCHART_TYPE,\n\t\t\tresizeObserver: false,\n\t\t\tendpoint: {\n\t\t\t\ttype: 'Dot',\n\t\t\t\toptions: { radius: 5 },\n\t\t\t},\n\t\t\tpaintStyle: CONNECTOR_PAINT_STYLE_DEFAULT,\n\t\t\thoverPaintStyle: CONNECTOR_PAINT_STYLE_PRIMARY,\n\t\t\tconnectionOverlays: CONNECTOR_ARROW_OVERLAYS,\n\t\t\telementsDraggable: !readOnlyEnv.value,\n\t\t\tdragOptions: {\n\t\t\t\tcursor: 'pointer',\n\t\t\t\tgrid: { w: GRID_SIZE, h: GRID_SIZE },\n\t\t\t\tstart: (params: BeforeStartEventParams) => {\n\t\t\t\t\tconst draggedNode = params.drag.getDragElement();\n\t\t\t\t\tconst nodeName = draggedNode.getAttribute('data-name');\n\t\t\t\t\tif (!nodeName) return;\n\t\t\t\t\tisDragging.value = true;\n\n\t\t\t\t\tconst isSelected = uiStore.isNodeSelected(nodeName);\n\n\t\t\t\t\tif (params.e && !isSelected) {\n\t\t\t\t\t\t// Only the node which gets dragged directly gets an event, for all others it is\n\t\t\t\t\t\t// undefined. So check if the currently dragged node is selected and if not clear\n\t\t\t\t\t\t// the drag-selection.\n\t\t\t\t\t\tjsPlumbInstanceRef.value?.clearDragSelection();\n\t\t\t\t\t\tuiStore.resetSelectedNodes();\n\t\t\t\t\t}\n\n\t\t\t\t\tuiStore.addActiveAction('dragActive');\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tstop: (params: DragStopEventParams) => {\n\t\t\t\t\tconst draggedNode = params.drag.getDragElement();\n\t\t\t\t\tconst nodeName = draggedNode.getAttribute('data-name');\n\t\t\t\t\tif (!nodeName) return;\n\t\t\t\t\tconst nodeData = workflowStore.getNodeByName(nodeName);\n\t\t\t\t\tisDragging.value = false;\n\t\t\t\t\tif (uiStore.isActionActive('dragActive') && nodeData) {\n\t\t\t\t\t\tconst moveNodes = uiStore.getSelectedNodes.slice();\n\t\t\t\t\t\tconst selectedNodeNames = moveNodes.map((node: INodeUi) => node.name);\n\t\t\t\t\t\tif (!selectedNodeNames.includes(nodeData.name)) {\n\t\t\t\t\t\t\t// If the current node is not in selected add it to the nodes which\n\t\t\t\t\t\t\t// got moved manually\n\t\t\t\t\t\t\tmoveNodes.push(nodeData);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (moveNodes.length > 1) {\n\t\t\t\t\t\t\thistoryStore.startRecordingUndo();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This does for some reason just get called once for the node that got clicked\n\t\t\t\t\t\t// even though \"start\" and \"drag\" gets called for all. So lets do for now\n\t\t\t\t\t\t// some dirty DOM query to get the new positions till I have more time to\n\t\t\t\t\t\t// create a proper solution\n\t\t\t\t\t\tlet newNodePosition: XYPosition;\n\t\t\t\t\t\tmoveNodes.forEach((node: INodeUi) => {\n\t\t\t\t\t\t\tconst element = document.getElementById(node.id);\n\t\t\t\t\t\t\tif (element === null) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tnewNodePosition = [\n\t\t\t\t\t\t\t\tparseInt(element.style.left.slice(0, -2), 10),\n\t\t\t\t\t\t\t\tparseInt(element.style.top.slice(0, -2), 10),\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tconst updateInformation = {\n\t\t\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\tposition: newNodePosition,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tconst oldPosition = node.position;\n\t\t\t\t\t\t\tif (oldPosition[0] !== newNodePosition[0] || oldPosition[1] !== newNodePosition[1]) {\n\t\t\t\t\t\t\t\thistoryStore.pushCommandToUndo(\n\t\t\t\t\t\t\t\t\tnew MoveNodeCommand(node.name, oldPosition, newNodePosition),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tworkflowStore.updateNodeProperties(updateInformation);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (moveNodes.length > 1) {\n\t\t\t\t\t\t\thistoryStore.stopRecordingUndo();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t\t\t\t\tuiStore.removeActiveAction('dragActive');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfilter: '.node-description, .node-description .node-name, .node-description .node-subtitle',\n\t\t\t},\n\t\t});\n\t\tjsPlumbInstanceRef.value?.setDragConstrainFunction((pos: PointXY) => {\n\t\t\tconst isReadOnly = uiStore.isReadOnlyView;\n\t\t\tif (isReadOnly) {\n\t\t\t\t// Do not allow to move nodes in readOnly mode\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn pos;\n\t\t});\n\t}\n\n\tconst jsPlumbInstance = computed(() => jsPlumbInstanceRef.value as BrowserJsPlumbInstance);\n\treturn {\n\t\tisDemo,\n\t\tnodeViewScale,\n\t\tcanvasAddButtonPosition,\n\t\tlastSelectedConnection,\n\t\tnewNodeInsertPosition,\n\t\tjsPlumbInstance,\n\t\tsetRecenteredCanvasAddButtonPosition,\n\t\tgetNodesWithPlaceholderNode,\n\t\tcanvasPositionFromPagePosition,\n\t\tsetZoomLevel,\n\t\tresetZoom,\n\t\tzoomIn,\n\t\tzoomOut,\n\t\tzoomToFit,\n\t\twheelScroll,\n\t\tinitInstance,\n\t};\n});\n","import type { XYPosition } from '@/Interface';\nimport {\n\tNOT_DUPLICATABE_NODE_TYPES,\n\tPIN_DATA_NODE_TYPES_DENYLIST,\n\tSTICKY_NODE_TYPE,\n} from '@/constants';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { IActionDropdownItem } from 'n8n-design-system/src/components/N8nActionDropdown/ActionDropdown.vue';\nimport type { INode, INodeTypeDescription } from 'n8n-workflow';\nimport { computed, ref, watch } from 'vue';\nimport { getMousePosition } from '../utils/nodeViewUtils';\nimport { useI18n } from './useI18n';\nimport { useDataSchema } from './useDataSchema';\n\nexport type ContextMenuTarget =\n\t| { source: 'canvas' }\n\t| { source: 'node-right-click'; node: INode }\n\t| { source: 'node-button'; node: INode };\nexport type ContextMenuActionCallback = (action: ContextMenuAction, targets: INode[]) => void;\nexport type ContextMenuAction =\n\t| 'open'\n\t| 'copy'\n\t| 'toggle_activation'\n\t| 'duplicate'\n\t| 'execute'\n\t| 'rename'\n\t| 'toggle_pin'\n\t| 'delete'\n\t| 'select_all'\n\t| 'deselect_all'\n\t| 'add_node'\n\t| 'add_sticky'\n\t| 'change_color';\n\nconst position = ref<XYPosition>([0, 0]);\nconst isOpen = ref(false);\nconst target = ref<ContextMenuTarget>({ source: 'canvas' });\nconst actions = ref<IActionDropdownItem[]>([]);\nconst actionCallback = ref<ContextMenuActionCallback>(() => {});\n\nexport const useContextMenu = (onAction: ContextMenuActionCallback = () => {}) => {\n\tconst uiStore = useUIStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst sourceControlStore = useSourceControlStore();\n\tconst { getInputDataWithPinned } = useDataSchema();\n\tconst i18n = useI18n();\n\n\tconst isReadOnly = computed(\n\t\t() => sourceControlStore.preferences.branchReadOnly || uiStore.isReadOnlyView,\n\t);\n\n\tconst targetNodes = computed(() => {\n\t\tif (!isOpen.value) return [];\n\t\tconst selectedNodes = uiStore.selectedNodes.map((node) =>\n\t\t\tworkflowsStore.getNodeByName(node.name),\n\t\t) as INode[];\n\t\tconst currentTarget = target.value;\n\t\tif (currentTarget.source === 'canvas') {\n\t\t\treturn selectedNodes;\n\t\t} else if (currentTarget.source === 'node-right-click') {\n\t\t\tconst isNodeInSelection = selectedNodes.some((node) => node.name === currentTarget.node.name);\n\t\t\treturn isNodeInSelection ? selectedNodes : [currentTarget.node];\n\t\t}\n\n\t\treturn [currentTarget.node];\n\t});\n\n\tconst canAddNodeOfType = (nodeType: INodeTypeDescription) => {\n\t\tconst sameTypeNodes = workflowsStore.allNodes.filter((n) => n.type === nodeType.name);\n\t\treturn nodeType.maxNodes === undefined || sameTypeNodes.length < nodeType.maxNodes;\n\t};\n\n\tconst canDuplicateNode = (node: INode): boolean => {\n\t\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\tif (!nodeType) return false;\n\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(nodeType.name)) return false;\n\n\t\treturn canAddNodeOfType(nodeType);\n\t};\n\n\tconst canPinNode = (node: INode): boolean => {\n\t\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\tconst dataToPin = getInputDataWithPinned(node);\n\t\tif (!nodeType || dataToPin.length === 0) return false;\n\t\treturn nodeType.outputs.length === 1 && !PIN_DATA_NODE_TYPES_DENYLIST.includes(node.type);\n\t};\n\n\tconst hasPinData = (node: INode): boolean => {\n\t\treturn !!workflowsStore.pinDataByNodeName(node.name);\n\t};\n\tconst close = () => {\n\t\ttarget.value = { source: 'canvas' };\n\t\tisOpen.value = false;\n\t\tactions.value = [];\n\t\tposition.value = [0, 0];\n\t};\n\n\tconst open = (event: MouseEvent, menuTarget: ContextMenuTarget = { source: 'canvas' }) => {\n\t\tevent.stopPropagation();\n\n\t\tif (isOpen.value && menuTarget.source === target.value.source) {\n\t\t\t// Close context menu, let browser open native context menu\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tactionCallback.value = onAction;\n\t\ttarget.value = menuTarget;\n\t\tposition.value = getMousePosition(event);\n\t\tisOpen.value = true;\n\n\t\tconst nodes = targetNodes.value;\n\t\tconst onlyStickies = nodes.every((node) => node.type === STICKY_NODE_TYPE);\n\t\tconst i18nOptions = {\n\t\t\tadjustToNumber: nodes.length,\n\t\t\tinterpolate: {\n\t\t\t\tsubject: onlyStickies\n\t\t\t\t\t? i18n.baseText('contextMenu.sticky', { adjustToNumber: nodes.length })\n\t\t\t\t\t: i18n.baseText('contextMenu.node', { adjustToNumber: nodes.length }),\n\t\t\t},\n\t\t};\n\n\t\tconst selectionActions = [\n\t\t\t{\n\t\t\t\tid: 'select_all',\n\t\t\t\tdivided: true,\n\t\t\t\tlabel: i18n.baseText('contextMenu.selectAll'),\n\t\t\t\tshortcut: { metaKey: true, keys: ['A'] },\n\t\t\t\tdisabled: nodes.length === workflowsStore.allNodes.length,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'deselect_all',\n\t\t\t\tlabel: i18n.baseText('contextMenu.deselectAll'),\n\t\t\t\tdisabled: nodes.length === 0,\n\t\t\t},\n\t\t];\n\n\t\tif (nodes.length === 0) {\n\t\t\tactions.value = [\n\t\t\t\t{\n\t\t\t\t\tid: 'add_node',\n\t\t\t\t\tshortcut: { keys: ['Tab'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addNode'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'add_sticky',\n\t\t\t\t\tshortcut: { shiftKey: true, keys: ['s'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addSticky'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t];\n\t\t} else {\n\t\t\tconst menuActions: IActionDropdownItem[] = [\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_activation',\n\t\t\t\t\tlabel: nodes.every((node) => node.disabled)\n\t\t\t\t\t\t? i18n.baseText('contextMenu.activate', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.deactivate', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_pin',\n\t\t\t\t\tlabel: nodes.every((node) => hasPinData(node))\n\t\t\t\t\t\t? i18n.baseText('contextMenu.unpin', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.pin', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['p'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every(canPinNode),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'copy',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.copy', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['C'] },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'duplicate',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.duplicate', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every(canDuplicateNode),\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t\t{\n\t\t\t\t\tid: 'delete',\n\t\t\t\t\tdivided: true,\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.delete', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['Del'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t].filter(Boolean) as IActionDropdownItem[];\n\n\t\t\tif (nodes.length === 1) {\n\t\t\t\tconst singleNodeActions = onlyStickies\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.editSticky'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'change_color',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.changeColor'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t ]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.open'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'execute',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.execute'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'rename',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.rename'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['F2'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t ];\n\t\t\t\t// Add actions only available for a single node\n\t\t\t\tmenuActions.unshift(...singleNodeActions);\n\t\t\t}\n\n\t\t\tactions.value = menuActions;\n\t\t}\n\t};\n\n\tconst _dispatchAction = (action: ContextMenuAction) => {\n\t\tactionCallback.value(action, targetNodes.value);\n\t};\n\n\twatch(\n\t\t() => uiStore.nodeViewOffsetPosition,\n\t\t() => {\n\t\t\tclose();\n\t\t},\n\t);\n\n\treturn {\n\t\tisOpen,\n\t\tposition,\n\t\ttarget,\n\t\tactions,\n\t\ttargetNodes,\n\t\topen,\n\t\tclose,\n\t\t_dispatchAction,\n\t};\n};\n","import type { INodeUi, XYPosition } from '@/Interface';\n\nimport { useDeviceSupport } from 'n8n-design-system/composables/useDeviceSupport';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { getMousePosition, getRelativePosition } from '@/utils/nodeViewUtils';\nimport { ref, onMounted, computed } from 'vue';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useContextMenu } from './useContextMenu';\n\ninterface ExtendedHTMLSpanElement extends HTMLSpanElement {\n\tx: number;\n\ty: number;\n}\n\nexport default function useCanvasMouseSelect() {\n\tconst selectActive = ref(false);\n\tconst selectBox = ref(document.createElement('span') as ExtendedHTMLSpanElement);\n\n\tconst { isTouchDevice, isCtrlKeyPressed } = useDeviceSupport();\n\tconst uiStore = useUIStore();\n\tconst canvasStore = useCanvasStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst { isOpen: isContextMenuOpen } = useContextMenu();\n\n\tfunction _setSelectBoxStyle(styles: Record<string, string>) {\n\t\tObject.assign(selectBox.value.style, styles);\n\t}\n\n\tfunction _showSelectBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\tselectBox.value = Object.assign(selectBox.value, { x, y });\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectBox.value.x + 'px',\n\t\t\ttop: selectBox.value.y + 'px',\n\t\t\tvisibility: 'visible',\n\t\t});\n\t\tselectActive.value = true;\n\t}\n\n\tfunction _updateSelectBox(event: MouseEvent) {\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectionBox.x + 'px',\n\t\t\ttop: selectionBox.y + 'px',\n\t\t\twidth: selectionBox.width + 'px',\n\t\t\theight: selectionBox.height + 'px',\n\t\t});\n\t}\n\n\tfunction _hideSelectBox() {\n\t\tselectBox.value.x = 0;\n\t\tselectBox.value.y = 0;\n\n\t\t_setSelectBoxStyle({\n\t\t\tvisibility: 'hidden',\n\t\t\tleft: '0px',\n\t\t\ttop: '0px',\n\t\t\twidth: '0px',\n\t\t\theight: '0px',\n\t\t});\n\t\tselectActive.value = false;\n\t}\n\n\tfunction _getSelectionBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\treturn {\n\t\t\tx: Math.min(x, selectBox.value.x),\n\t\t\ty: Math.min(y, selectBox.value.y),\n\t\t\twidth: Math.abs(x - selectBox.value.x),\n\t\t\theight: Math.abs(y - selectBox.value.y),\n\t\t};\n\t}\n\n\tfunction _getNodesInSelection(event: MouseEvent): INodeUi[] {\n\t\tconst returnNodes: INodeUi[] = [];\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t// Go through all nodes and check if they are selected\n\t\tworkflowsStore.allNodes.forEach((node: INodeUi) => {\n\t\t\t// TODO: Currently always uses the top left corner for checking. Should probably use the center instead\n\t\t\tif (\n\t\t\t\tnode.position[0] < selectionBox.x ||\n\t\t\t\tnode.position[0] > selectionBox.x + selectionBox.width\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnode.position[1] < selectionBox.y ||\n\t\t\t\tnode.position[1] > selectionBox.y + selectionBox.height\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturnNodes.push(node);\n\t\t});\n\n\t\treturn returnNodes;\n\t}\n\n\tfunction _createSelectBox() {\n\t\tselectBox.value.id = 'select-box';\n\t\t_setSelectBoxStyle({\n\t\t\tmargin: '0px auto',\n\t\t\tborder: '2px dotted #FF0000',\n\t\t\t// Positioned absolutely within #node-view. This is consistent with how nodes are positioned.\n\t\t\tposition: 'absolute',\n\t\t\tzIndex: '100',\n\t\t\tvisibility: 'hidden',\n\t\t});\n\n\t\tselectBox.value.addEventListener('mouseup', mouseUpMouseSelect);\n\n\t\tconst nodeViewEl = document.querySelector('#node-view') as HTMLDivElement;\n\t\tnodeViewEl.appendChild(selectBox.value);\n\t}\n\n\tfunction _mouseMoveSelect(e: MouseEvent) {\n\t\tif (e.buttons === 0) {\n\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t// comes back unpressed.\n\t\t\tmouseUpMouseSelect(e);\n\t\t\treturn;\n\t\t}\n\n\t\t_updateSelectBox(e);\n\t}\n\n\tfunction mouseUpMouseSelect(e: MouseEvent) {\n\t\t// Ignore right-click\n\t\tif (e.button === 2 || isContextMenuOpen.value) return;\n\n\t\tif (!selectActive.value) {\n\t\t\tif (isTouchDevice && e.target instanceof HTMLElement) {\n\t\t\t\tif (e.target && e.target.id.includes('node-view')) {\n\t\t\t\t\t// Deselect all nodes\n\t\t\t\t\tdeselectAllNodes();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If it is not active return directly.\n\t\t\t// Else normal node dragging will not work.\n\t\t\treturn;\n\t\t}\n\t\tdocument.removeEventListener('mousemove', _mouseMoveSelect);\n\n\t\t// Deselect all nodes\n\t\tdeselectAllNodes();\n\n\t\t// Select the nodes which are in the selection box\n\t\tconst selectedNodes = _getNodesInSelection(e);\n\t\tselectedNodes.forEach((node) => {\n\t\t\tnodeSelected(node);\n\t\t});\n\n\t\tif (selectedNodes.length === 1) {\n\t\t\tuiStore.lastSelectedNode = selectedNodes[0].name;\n\t\t}\n\n\t\t_hideSelectBox();\n\t}\n\tfunction mouseDownMouseSelect(e: MouseEvent, moveButtonPressed: boolean) {\n\t\tif (isCtrlKeyPressed(e) || moveButtonPressed || e.button === 2) {\n\t\t\t// We only care about it when the ctrl key is not pressed at the same time.\n\t\t\t// So we exit when it is pressed.\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\treturn;\n\t\t}\n\t\t_showSelectBox(e);\n\n\t\t// Leave like this.\n\t\t// Do not add an anonymous function because then remove would not work anymore\n\t\tdocument.addEventListener('mousemove', _mouseMoveSelect);\n\t}\n\n\tfunction getMousePositionWithinNodeView(event: MouseEvent | TouchEvent): XYPosition {\n\t\tconst mousePosition = getMousePosition(event);\n\n\t\tconst [relativeX, relativeY] = canvasStore.canvasPositionFromPagePosition(mousePosition);\n\t\tconst nodeViewScale = canvasStore.nodeViewScale;\n\t\tconst nodeViewOffsetPosition = uiStore.nodeViewOffsetPosition;\n\n\t\treturn getRelativePosition(relativeX, relativeY, nodeViewScale, nodeViewOffsetPosition);\n\t}\n\n\tfunction nodeDeselected(node: INodeUi) {\n\t\tuiStore.removeNodeFromSelection(node);\n\t\tinstance.value.removeFromDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction nodeSelected(node: INodeUi) {\n\t\tuiStore.addSelectedNode(node);\n\t\tinstance.value.addToDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction deselectAllNodes() {\n\t\tinstance.value.clearDragSelection();\n\t\tuiStore.resetSelectedNodes();\n\t\tuiStore.lastSelectedNode = null;\n\t\tuiStore.lastSelectedNodeOutputIndex = null;\n\n\t\tcanvasStore.lastSelectedConnection = null;\n\t\tcanvasStore.newNodeInsertPosition = null;\n\t}\n\n\tconst instance = computed(() => canvasStore.jsPlumbInstance);\n\n\tonMounted(() => {\n\t\t_createSelectBox();\n\t});\n\n\treturn {\n\t\tselectActive,\n\t\tgetMousePositionWithinNodeView,\n\t\tmouseUpMouseSelect,\n\t\tmouseDownMouseSelect,\n\t\tnodeDeselected,\n\t\tnodeSelected,\n\t\tdeselectAllNodes,\n\t};\n}\n","import { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\nexport function useUniqueNodeName() {\n\t/**\n\t * All in-store node name defaults ending with a number, e.g.\n\t * `AWS S3`, `Magento 2`, `MSG91`, `S3`, `SIGNL4`, `sms77`\n\t */\n\tfunction numberSuffixedNames() {\n\t\treturn useNodeTypesStore().allNodeTypes.reduce<string[]>((acc, nodeType) => {\n\t\t\tif (typeof nodeType.defaults.name !== 'string') {\n\t\t\t\tthrow new Error('Expected node name default to be a string');\n\t\t\t}\n\n\t\t\tif (/\\d$/.test(nodeType.defaults.name)) acc.push(nodeType.defaults.name);\n\n\t\t\treturn acc;\n\t\t}, []);\n\t}\n\n\t/**\n\t * Create a unique node name from an original name, based on the names of\n\t * all nodes on canvas and any extra names that cannot be used.\n\t */\n\tfunction uniqueNodeName(originalName: string, extraNames: string[] = []) {\n\t\tconst { canvasNames } = useWorkflowsStore();\n\n\t\tconst isUnique = !canvasNames.has(originalName) && !extraNames.includes(originalName);\n\n\t\tif (isUnique) return originalName;\n\n\t\tconst nsn = numberSuffixedNames().find((nsn) => originalName.startsWith(nsn));\n\n\t\t// edge case, number suffix as part of name: S3 -> S31 -> S32\n\n\t\tif (nsn) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst remainder = originalName.split(nsn).pop();\n\n\t\t\tconst lastChar = remainder?.[remainder.length - 1];\n\n\t\t\tif (lastChar && Number.isInteger(Number(lastChar))) {\n\t\t\t\tindex = parseInt(lastChar, 10);\n\t\t\t\toriginalName = originalName.slice(0, -1);\n\t\t\t}\n\n\t\t\tunique = originalName;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = originalName + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// edge case, all-number name: 123 -> 123-1 -> 123-2\n\n\t\tif (/^\\d+-?\\d*$/.test(originalName)) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst match = originalName.match(/(?<base>\\d+)-?(?<suffix>\\d*)/);\n\n\t\t\tif (!match?.groups) {\n\t\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t\t}\n\n\t\t\tif (match?.groups?.suffix !== '') {\n\t\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t\t}\n\n\t\t\tunique = match.groups.base;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = match.groups.base + '-' + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// normal case: A -> A1 -> A2\n\n\t\tlet unique = '';\n\t\tlet index = 1;\n\n\t\tconst match = originalName.match(/(?<base>.*\\D+)(?<suffix>\\d*)/);\n\n\t\tif (!match?.groups) {\n\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t}\n\n\t\tif (match?.groups?.suffix !== '') {\n\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t}\n\n\t\tunique = match.groups.base;\n\n\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\tunique = match.groups.base + index++;\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\treturn { uniqueNodeName };\n}\n","import { defineComponent } from 'vue';\nimport type { INodeUi } from '@/Interface';\nimport type { IPinData, INodeExecutionData } from 'n8n-workflow';\nimport { stringSizeInBytes } from '@/utils/typesUtils';\nimport {\n\tMAX_EXPECTED_REQUEST_SIZE,\n\tMAX_PINNED_DATA_SIZE,\n\tMAX_WORKFLOW_SIZE,\n\tPIN_DATA_NODE_TYPES_DENYLIST,\n} from '@/constants';\nimport { mapStores } from 'pinia';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { NodeConnectionType, NodeHelpers, jsonParse, jsonStringify } from 'n8n-workflow';\nimport { useToast } from '@/composables/useToast';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport type PinDataSource =\n\t| 'pin-icon-click'\n\t| 'save-edit'\n\t| 'on-ndv-close-modal'\n\t| 'duplicate-node'\n\t| 'add-nodes'\n\t| 'context-menu'\n\t| 'keyboard-shortcut';\n\nexport type UnpinDataSource = 'unpin-and-execute-modal' | 'context-menu' | 'keyboard-shortcut';\n\nexport const pinData = defineComponent({\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore, useNDVStore),\n\t\tpinData(): IPinData[string] | undefined {\n\t\t\treturn this.node ? this.workflowsStore.pinDataByNodeName(this.node.name) : undefined;\n\t\t},\n\t\thasPinData(): boolean {\n\t\t\treturn !!this.node && typeof this.pinData !== 'undefined';\n\t\t},\n\t\tisSubNode() {\n\t\t\tif (!this.nodeType.outputs || typeof this.nodeType.outputs === 'string') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(this.nodeType.outputs);\n\t\t\treturn outputTypes\n\t\t\t\t? outputTypes.filter((output) => output !== NodeConnectionType.Main).length > 0\n\t\t\t\t: false;\n\t\t},\n\t\tisPinDataNodeType(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\t!this.isSubNode &&\n\t\t\t\t!this.isMultipleOutputsNodeType &&\n\t\t\t\t!PIN_DATA_NODE_TYPES_DENYLIST.includes(this.node.type)\n\t\t\t);\n\t\t},\n\t\tisMultipleOutputsNodeType(): boolean {\n\t\t\treturn this.nodeType?.outputs.length > 1;\n\t\t},\n\t},\n\tmethods: {\n\t\tisValidPinDataJSON(data: string): boolean {\n\t\t\ttry {\n\t\t\t\tJSON.parse(data);\n\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tconst title = this.$locale.baseText('runData.editOutputInvalid');\n\n\t\t\t\tconst toRemove = new RegExp(/JSON\\.parse:|of the JSON data/, 'g');\n\t\t\t\tconst message = error.message.replace(toRemove, '').trim();\n\t\t\t\tconst positionMatchRegEx = /at position (\\d+)/;\n\t\t\t\tconst positionMatch = error.message.match(positionMatchRegEx);\n\n\t\t\t\terror.message = message.charAt(0).toUpperCase() + message.slice(1);\n\t\t\t\terror.message = error.message.replace(\n\t\t\t\t\t\"Unexpected token ' in JSON\",\n\t\t\t\t\tthis.$locale.baseText('runData.editOutputInvalid.singleQuote'),\n\t\t\t\t);\n\n\t\t\t\tif (positionMatch) {\n\t\t\t\t\tconst position = parseInt(positionMatch[1], 10);\n\t\t\t\t\tconst lineBreaksUpToPosition = (data.slice(0, position).match(/\\n/g) || []).length;\n\n\t\t\t\t\terror.message = error.message.replace(\n\t\t\t\t\t\tpositionMatchRegEx,\n\t\t\t\t\t\tthis.$locale.baseText('runData.editOutputInvalid.atPosition', {\n\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\tposition: `${position}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\terror.message = `${this.$locale.baseText('runData.editOutputInvalid.onLine', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tline: `${lineBreaksUpToPosition + 1}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t})} ${error.message}`;\n\t\t\t\t}\n\n\t\t\t\tthis.showError(error, title);\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tisValidPinDataSize(data: string | object, activeNodeName: string): boolean {\n\t\t\tif (typeof data === 'object') data = JSON.stringify(data);\n\n\t\t\tconst { pinData: currentPinData, ...workflow } = this.workflowsStore.getCurrentWorkflow();\n\t\t\tconst workflowJson = jsonStringify(workflow, { replaceCircularRefs: true });\n\n\t\t\tconst newPinData = { ...currentPinData, [activeNodeName]: data };\n\t\t\tconst newPinDataSize = this.workflowsStore.getPinDataSize(newPinData);\n\n\t\t\tif (newPinDataSize > MAX_PINNED_DATA_SIZE) {\n\t\t\t\tthis.showError(\n\t\t\t\t\tnew Error(this.$locale.baseText('ndv.pinData.error.tooLarge.description')),\n\t\t\t\t\tthis.$locale.baseText('ndv.pinData.error.tooLarge.title'),\n\t\t\t\t);\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstringSizeInBytes(workflowJson) + newPinDataSize >\n\t\t\t\tMAX_WORKFLOW_SIZE - MAX_EXPECTED_REQUEST_SIZE\n\t\t\t) {\n\t\t\t\tthis.showError(\n\t\t\t\t\tnew Error(this.$locale.baseText('ndv.pinData.error.tooLargeWorkflow.description')),\n\t\t\t\t\tthis.$locale.baseText('ndv.pinData.error.tooLargeWorkflow.title'),\n\t\t\t\t);\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\tsetPinData(node: INodeUi, data: string | INodeExecutionData[], source: PinDataSource): boolean {\n\t\t\tif (typeof data === 'string') {\n\t\t\t\tif (!this.isValidPinDataJSON(data)) {\n\t\t\t\t\tthis.onDataPinningError({ errorType: 'invalid-json', source });\n\t\t\t\t\tthrow new Error('Invalid JSON');\n\t\t\t\t}\n\n\t\t\t\tdata = jsonParse(data);\n\t\t\t}\n\n\t\t\tif (!this.isValidPinDataSize(data, node.name)) {\n\t\t\t\tthis.onDataPinningError({ errorType: 'data-too-large', source });\n\t\t\t\tthrow new Error('Data too large');\n\t\t\t}\n\n\t\t\tthis.onDataPinningSuccess({ source });\n\t\t\tthis.workflowsStore.pinData({ node, data: data as INodeExecutionData[] });\n\t\t},\n\t\tunsetPinData(node: INodeUi, source: UnpinDataSource): void {\n\t\t\tthis.onDataUnpinning({ source });\n\t\t\tthis.workflowsStore.unpinData({ node });\n\t\t},\n\t\tonDataPinningSuccess({ source }: { source: PinDataSource }) {\n\t\t\tconst telemetryPayload = {\n\t\t\t\tpinning_source: source,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tdata_size: stringSizeInBytes(this.pinData),\n\t\t\t\tview: this.displayMode,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t};\n\t\t\tvoid useExternalHooks().run('runData.onDataPinningSuccess', telemetryPayload);\n\t\t\tthis.$telemetry.track('Ndv data pinning success', telemetryPayload);\n\t\t},\n\t\tonDataPinningError({\n\t\t\terrorType,\n\t\t\tsource,\n\t\t}: {\n\t\t\terrorType: 'data-too-large' | 'invalid-json';\n\t\t\tsource: PinDataSource;\n\t\t}) {\n\t\t\tthis.$telemetry.track('Ndv data pinning failure', {\n\t\t\t\tpinning_source: source,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tdata_size: stringSizeInBytes(this.pinData),\n\t\t\t\tview: this.displayMode,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\terror_type: errorType,\n\t\t\t});\n\t\t},\n\t\tonDataUnpinning({\n\t\t\tsource,\n\t\t}: {\n\t\t\tsource: 'banner-link' | 'pin-icon-click' | 'unpin-and-execute-modal';\n\t\t}) {\n\t\t\tthis.$telemetry.track('User unpinned ndv data', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tsource,\n\t\t\t\tdata_size: stringSizeInBytes(this.pinData),\n\t\t\t});\n\t\t},\n\t},\n});\n","<template>\n\t<span :class=\"$style.container\" data-test-id=\"node-title-container\" @click=\"onEdit\">\n\t\t<span :class=\"$style.iconWrapper\"><NodeIcon :nodeType=\"nodeType\" :size=\"18\" /></span>\n\t\t<n8n-popover placement=\"right\" width=\"200\" :visible=\"editName\" :disabled=\"!editable\">\n\t\t\t<div\n\t\t\t\t:class=\"$style.editContainer\"\n\t\t\t\t@keydown.enter=\"onRename\"\n\t\t\t\t@keydown.stop\n\t\t\t\t@keydown.esc=\"editName = false\"\n\t\t\t>\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-base\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('ndv.title.renameNode')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-input ref=\"input\" size=\"small\" v-model=\"newName\" data-test-id=\"node-rename-input\" />\n\t\t\t\t<div :class=\"$style.editButtons\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click=\"editName = false\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.cancel')\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click=\"onRename\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.rename')\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<template #reference>\n\t\t\t\t<div :class=\"{ [$style.title]: true, [$style.hoverable]: editable }\">\n\t\t\t\t\t{{ modelValue }}\n\t\t\t\t\t<div :class=\"$style.editIconContainer\">\n\t\t\t\t\t\t<font-awesome-icon :class=\"$style.editIcon\" icon=\"pencil-alt\" v-if=\"editable\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-popover>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'NodeTitle',\n\tcomponents: {\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\teditName: false,\n\t\t\tnewName: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\teditable(): boolean {\n\t\t\treturn !this.readOnly && window === window.parent;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onEdit() {\n\t\t\tthis.newName = this.modelValue;\n\t\t\tthis.editName = true;\n\t\t\tawait this.$nextTick();\n\t\t\tconst inputRef = this.$refs.input as HTMLInputElement | undefined;\n\t\t\tif (inputRef) {\n\t\t\t\tinputRef.focus();\n\t\t\t}\n\t\t},\n\t\tonRename() {\n\t\t\tif (this.newName.trim() !== '') {\n\t\t\t\tthis.$emit('update:modelValue', this.newName.trim());\n\t\t\t}\n\n\t\t\tthis.editName = false;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tfont-weight: var(--font-weight-bold);\n\tdisplay: flex;\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-compact);\n\toverflow-wrap: anywhere;\n\tpadding-right: var(--spacing-s);\n\toverflow: hidden;\n}\n\n.title {\n\tmax-height: 100px;\n\tdisplay: -webkit-box;\n\t-webkit-line-clamp: 5;\n\t-webkit-box-orient: vertical;\n\tcolor: var(--color-text-dark);\n}\n\n.hoverable {\n\t&:hover {\n\t\tcursor: pointer;\n\t\t.editIcon {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n\n.iconWrapper {\n\tdisplay: inline-flex;\n\tmargin-right: var(--spacing-2xs);\n}\n\n.editIcon {\n\tdisplay: none;\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--color-text-base);\n\tposition: absolute;\n\tbottom: 0;\n}\n\n.editIconContainer {\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: 0;\n}\n\n.editButtons {\n\ttext-align: right;\n\tmargin-top: var(--spacing-s);\n\n\t> * {\n\t\tmargin-left: var(--spacing-4xs);\n\t}\n}\n\n.editContainer {\n\ttext-align: left;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-4xs);\n\t}\n}\n</style>\n","<template>\n\t<n8n-tabs\n\t\t:options=\"options\"\n\t\t:modelValue=\"modelValue\"\n\t\t@update:modelValue=\"onTabSelect\"\n\t\t@tooltipClick=\"onTooltipClick\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tBUILTIN_NODES_DOCS_URL,\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tNPM_PACKAGE_DOCS_BASE_URL,\n} from '@/constants';\nimport type { INodeUi, ITab } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\n\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tname: 'NodeSettingsTabs',\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\treturn {\n\t\t\texternalHooks,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useWorkflowsStore),\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdocumentationUrl(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\n\t\t\tif (!nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (nodeType.documentationUrl && nodeType.documentationUrl.startsWith('http')) {\n\t\t\t\treturn nodeType.documentationUrl;\n\t\t\t}\n\n\t\t\tconst utmTags =\n\t\t\t\t'?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link' +\n\t\t\t\t'&utm_campaign=' +\n\t\t\t\tnodeType.name;\n\n\t\t\t// Built-in node documentation available via its codex entry\n\t\t\tconst primaryDocUrl = nodeType.codex?.resources?.primaryDocumentation?.[0]?.url;\n\t\t\tif (primaryDocUrl) {\n\t\t\t\treturn primaryDocUrl + utmTags;\n\t\t\t}\n\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\treturn `${NPM_PACKAGE_DOCS_BASE_URL}${nodeType.name.split('.')[0]}`;\n\t\t\t}\n\n\t\t\t// Fallback to the root of the node documentation\n\t\t\treturn BUILTIN_NODES_DOCS_URL + utmTags;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\t\t\tif (nodeType) {\n\t\t\t\treturn isCommunityPackageName(nodeType.name);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tpackageName(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription;\n\t\t\treturn nodeType.name.split('.')[0];\n\t\t},\n\t\toptions(): ITab[] {\n\t\t\tconst options: ITab[] = [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.parameters'),\n\t\t\t\t\tvalue: 'params',\n\t\t\t\t},\n\t\t\t];\n\t\t\tif (this.documentationUrl) {\n\t\t\t\toptions.push({\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.docs'),\n\t\t\t\t\tvalue: 'docs',\n\t\t\t\t\thref: this.documentationUrl,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\toptions.push({\n\t\t\t\t\ticon: 'cube',\n\t\t\t\t\tvalue: 'communityNode',\n\t\t\t\t\talign: 'right',\n\t\t\t\t\ttooltip: this.$locale.baseText('generic.communityNode.tooltip', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdocUrl: COMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\t\t\t\t\tpackageName: this.packageName,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\t// If both tabs have align right, both will have excessive left margin\n\t\t\tconst pushCogRight = this.isCommunityNode ? false : true;\n\t\t\toptions.push({\n\t\t\t\ticon: 'cog',\n\t\t\t\tvalue: 'settings',\n\t\t\t\talign: pushCogRight ? 'right' : undefined,\n\t\t\t});\n\n\t\t\treturn options;\n\t\t},\n\t},\n\tmethods: {\n\t\tonTabSelect(tab: string) {\n\t\t\tif (tab === 'docs' && this.nodeType) {\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.onDocumentationUrlClick', {\n\t\t\t\t\tnodeType: this.nodeType as INodeTypeDescription,\n\t\t\t\t\tdocumentationUrl: this.documentationUrl,\n\t\t\t\t});\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'docs',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' && this.nodeType) {\n\t\t\t\tthis.$telemetry.track('User viewed node settings', {\n\t\t\t\t\tnode_type: (this.nodeType as INodeTypeDescription).name,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' || tab === 'params') {\n\t\t\t\tthis.$emit('update:modelValue', tab);\n\t\t\t}\n\t\t},\n\t\tonTooltipClick(tab: string, event: MouseEvent) {\n\t\t\tif (tab === 'communityNode' && (event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr docs link', { source: 'node details view' });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n#communityNode > div {\n\tcursor: auto;\n\n\t&:hover {\n\t\tcolor: unset;\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"webhooksNode.length\" class=\"webhooks\">\n\t\t<div\n\t\t\tclass=\"clickable headline\"\n\t\t\t:class=\"{ expanded: !isMinimized }\"\n\t\t\t@click=\"isMinimized = !isMinimized\"\n\t\t\t:title=\"isMinimized ? baseText.clickToDisplay : baseText.clickToHide\"\n\t\t>\n\t\t\t<font-awesome-icon icon=\"angle-right\" class=\"minimize-button minimize-icon\" />\n\t\t\t{{ baseText.toggleTitle }}\n\t\t</div>\n\t\t<el-collapse-transition>\n\t\t\t<div class=\"node-webhooks\" v-if=\"!isMinimized\">\n\t\t\t\t<div class=\"url-selection\">\n\t\t\t\t\t<el-row>\n\t\t\t\t\t\t<el-col :span=\"24\">\n\t\t\t\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\t\t\t\tv-model=\"showUrlFor\"\n\t\t\t\t\t\t\t\t:options=\"[\n\t\t\t\t\t\t\t\t\t{ label: baseText.testUrl, value: 'test' },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: baseText.productionUrl,\n\t\t\t\t\t\t\t\t\t\tvalue: 'production',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</el-col>\n\t\t\t\t\t</el-row>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-for=\"(webhook, index) in webhooksNode.filter((webhook) => !webhook.ndvHideUrl)\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"item\"\n\t\t\t\t\t:content=\"baseText.clickToCopy\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"!webhook.ndvHideMethod\" class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"http-field\">\n\t\t\t\t\t\t\t<div class=\"http-method\">\n\t\t\t\t\t\t\t\t{{ getWebhookExpressionValue(webhook, 'httpMethod') }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"url-field\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"url-field-full-width\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</el-collapse-transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { INodeTypeDescription, IWebhookDescription } from 'n8n-workflow';\nimport { defineComponent } from 'vue';\n\nimport { useToast } from '@/composables/useToast';\nimport { FORM_TRIGGER_NODE_TYPE, OPEN_URL_PANEL_TRIGGER_NODE_TYPES } from '@/constants';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\n\nexport default defineComponent({\n\tname: 'NodeWebhooks',\n\tmixins: [copyPaste, workflowHelpers],\n\tprops: [\n\t\t'node', // NodeUi\n\t\t'nodeType', // INodeTypeDescription\n\t],\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisMinimized: this.nodeType && !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name),\n\t\t\tshowUrlFor: 'test',\n\t\t};\n\t},\n\tcomputed: {\n\t\twebhooksNode(): IWebhookDescription[] {\n\t\t\tif (this.nodeType === null || this.nodeType.webhooks === undefined) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn (this.nodeType as INodeTypeDescription).webhooks!.filter(\n\t\t\t\t(webhookData) => webhookData.restartWebhook !== true,\n\t\t\t);\n\t\t},\n\t\tbaseText() {\n\t\t\tconst nodeType = this.nodeType.name;\n\t\t\tswitch (nodeType) {\n\t\t\t\tcase FORM_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeWebhooks.clickToDisplayWebhookUrls.formTrigger',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls.formTrigger'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title.formTrigger'),\n\t\t\t\t\t\tcopyMessage: this.$locale.baseText('nodeWebhooks.showMessage.message.formTrigger'),\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText('nodeWebhooks.clickToDisplayWebhookUrls'),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title'),\n\t\t\t\t\t\tcopyMessage: undefined,\n\t\t\t\t\t};\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tcopyWebhookUrl(webhookData: IWebhookDescription): void {\n\t\t\tconst webhookUrl = this.getWebhookUrlDisplay(webhookData);\n\t\t\tthis.copyToClipboard(webhookUrl);\n\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.baseText.copyTitle,\n\t\t\t\tmessage: this.baseText.copyMessage,\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'parameters',\n\t\t\t\ttype: `${this.showUrlFor} url`,\n\t\t\t});\n\t\t},\n\t\tgetWebhookUrlDisplay(webhookData: IWebhookDescription): string {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.getWebhookUrl(webhookData, this.node, this.showUrlFor);\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t},\n\twatch: {\n\t\tnode() {\n\t\t\tthis.isMinimized = !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name);\n\t\t},\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.webhooks {\n\tpadding-bottom: var(--spacing-xs);\n\tmargin: var(--spacing-xs) 0;\n\tborder-bottom: 1px solid var(--color-text-lighter);\n\n\t.headline {\n\t\tcolor: $color-primary;\n\t\tfont-weight: 600;\n\t\tfont-size: var(--font-size-2xs);\n\t}\n}\n\n.http-field {\n\tposition: absolute;\n\twidth: 50px;\n\tdisplay: inline-block;\n\ttop: calc(50% - 8px);\n}\n\n.http-method {\n\tbackground-color: var(--color-foreground-xdark);\n\twidth: 40px;\n\theight: 16px;\n\tline-height: 16px;\n\tmargin-left: 5px;\n\ttext-align: center;\n\tborder-radius: 2px;\n\tfont-size: var(--font-size-2xs);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-foreground-xlight);\n}\n\n.minimize-icon {\n\tfont-size: 1.3em;\n\tmargin-right: 0.5em;\n}\n\n.mode-selection-headline {\n\tline-height: 1.8em;\n}\n\n.node-webhooks {\n\tmargin-left: 1em;\n}\n\n.url-field {\n\tdisplay: inline-block;\n\twidth: calc(100% - 60px);\n\tmargin-left: 55px;\n}\n.url-field-full-width {\n\tdisplay: inline-block;\n\tmargin: 5px 10px;\n}\n\n.url-selection {\n\tmargin-top: var(--spacing-xs);\n}\n\n.minimize-button {\n\tdisplay: inline-block;\n\t-webkit-transition-duration: 0.5s;\n\t-moz-transition-duration: 0.5s;\n\t-o-transition-duration: 0.5s;\n\ttransition-duration: 0.5s;\n\n\t-webkit-transition-property: -webkit-transform;\n\t-moz-transition-property: -moz-transform;\n\t-o-transition-property: -o-transform;\n\ttransition-property: transform;\n}\n.expanded .minimize-button {\n\t-webkit-transform: rotate(90deg);\n\t-moz-transform: rotate(90deg);\n\t-o-transform: rotate(90deg);\n\ttransform: rotate(90deg);\n}\n\n.webhook-url {\n\tposition: relative;\n\ttop: 0;\n\twidth: 100%;\n\tfont-size: var(--font-size-2xs);\n\twhite-space: normal;\n\toverflow: visible;\n\ttext-overflow: initial;\n\tcolor: var(--color-text-dark);\n\ttext-align: left;\n\tdirection: ltr;\n\tword-break: break-all;\n}\n\n.webhook-wrapper {\n\tline-height: 1.5;\n\tposition: relative;\n\tmargin-top: var(--spacing-xs);\n\tbackground-color: var(--color-foreground-xlight);\n\tborder-radius: 3px;\n}\n</style>\n","<template>\n\t<div>\n\t\t<n8n-tooltip placement=\"bottom\" :disabled=\"!disabledHint\">\n\t\t\t<template #content>\n\t\t\t\t<div>{{ disabledHint }}</div>\n\t\t\t</template>\n\t\t\t<div>\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-bind=\"$attrs\"\n\t\t\t\t\t:loading=\"nodeRunning && !isListeningForEvents && !isListeningForWorkflowEvents\"\n\t\t\t\t\t:disabled=\"disabled || !!disabledHint\"\n\t\t\t\t\t:label=\"buttonLabel\"\n\t\t\t\t\t:type=\"type\"\n\t\t\t\t\t:size=\"size\"\n\t\t\t\t\t:icon=\"isFormTriggerNode && 'flask'\"\n\t\t\t\t\t:transparentBackground=\"transparent\"\n\t\t\t\t\t@click=\"onClick\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tWEBHOOK_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tMODAL_CONFIRM,\n\tFORM_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { workflowRun } from '@/mixins/workflowRun';\nimport { pinData } from '@/mixins/pinData';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tinheritAttrs: false,\n\tmixins: [workflowRun, pinData],\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tlabel: {\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\tsize: {\n\t\t\ttype: String,\n\t\t},\n\t\ttransparent: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\ttelemetrySource: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup(props, ctx) {\n\t\tconst externalHooks = useExternalHooks();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowRun.setup?.(props, ctx),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tnodeRunning(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\t(this.workflowsStore.isNodeExecuting(this.node.name) || triggeredNode === this.node.name)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tisManualTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === MANUAL_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisFormTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === FORM_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!this.nodeType?.group.includes('schedule');\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\n\t\t\treturn (\n\t\t\t\tthis.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tisListeningForWorkflowEvents(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.nodeRunning &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isScheduleTrigger &&\n\t\t\t\t!this.isManualTriggerNode\n\t\t\t);\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tdisabledHint(): string {\n\t\t\tif (this.isListeningForEvents) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.node.disabled) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.nodeIsDisabled');\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.hasIssues) {\n\t\t\t\tconst activeNode = this.ndvStore.activeNode;\n\t\t\t\tif (activeNode && activeNode.name !== this.nodeName) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.execute.fixPrevious');\n\t\t\t\t}\n\n\t\t\t\treturn this.$locale.baseText('ndv.execute.requiredFieldsMissing');\n\t\t\t}\n\n\t\t\tif (this.workflowRunning && !this.nodeRunning) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.workflowAlreadyRunning');\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tbuttonLabel(): string {\n\t\t\tif (this.isListeningForEvents || this.isListeningForWorkflowEvents) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.stopListening');\n\t\t\t}\n\n\t\t\tif (this.label) {\n\t\t\t\treturn this.label;\n\t\t\t}\n\n\t\t\tif (this.isWebhookNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.listenForTestEvent');\n\t\t\t}\n\n\t\t\tif (this.isFormTriggerNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.testStep');\n\t\t\t}\n\n\t\t\tif (this.isPollingTypeNode || this.nodeType?.mockManualExecution) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.fetchEvent');\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isScheduleTrigger &&\n\t\t\t\t!this.isManualTriggerNode &&\n\t\t\t\t!this.isFormTriggerNode\n\t\t\t) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.listenForEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('ndv.execute.executeNode');\n\t\t},\n\t},\n\tmethods: {\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('ndv.execute.stopWaitingForWebhook.error'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\n\t\tasync onClick() {\n\t\t\tif (this.isListeningForEvents) {\n\t\t\t\tawait this.stopWaitingForWebhook();\n\t\t\t} else if (this.isListeningForWorkflowEvents) {\n\t\t\t\tthis.$emit('stopExecution');\n\t\t\t} else {\n\t\t\t\tlet shouldUnpinAndExecute = false;\n\t\t\t\tif (this.hasPinData) {\n\t\t\t\t\tconst confirmResult = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.description'),\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.title'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.confirm'),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.cancel'),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tshouldUnpinAndExecute = confirmResult === MODAL_CONFIRM;\n\n\t\t\t\t\tif (shouldUnpinAndExecute && this.node) {\n\t\t\t\t\t\tthis.unsetPinData(this.node, 'unpin-and-execute-modal');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!this.hasPinData || shouldUnpinAndExecute) {\n\t\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\t\tnode_type: this.nodeType ? this.nodeType.name : null,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tsource: this.telemetrySource,\n\t\t\t\t\t\tsession_id: this.ndvStore.sessionId,\n\t\t\t\t\t};\n\t\t\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\t\t\tawait this.externalHooks.run('nodeExecuteButton.onClick', telemetryPayload);\n\n\t\t\t\t\tawait this.runWorkflow({\n\t\t\t\t\t\tdestinationNode: this.nodeName,\n\t\t\t\t\t\tsource: 'RunData.ExecuteNodeButton',\n\t\t\t\t\t});\n\t\t\t\t\tthis.$emit('execute');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'node-settings': true,\n\t\t\tdragging: dragging,\n\t\t}\"\n\t\t@keydown.stop\n\t>\n\t\t<div :class=\"$style.header\">\n\t\t\t<div class=\"header-side-menu\">\n\t\t\t\t<NodeTitle\n\t\t\t\t\tv-if=\"node\"\n\t\t\t\t\tclass=\"node-name\"\n\t\t\t\t\t:modelValue=\"node.name\"\n\t\t\t\t\t:nodeType=\"nodeType\"\n\t\t\t\t\t:readOnly=\"isReadOnly\"\n\t\t\t\t\t@update:modelValue=\"nameChanged\"\n\t\t\t\t></NodeTitle>\n\t\t\t\t<div v-if=\"isExecutable\">\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tv-if=\"!blockUI && node && nodeValid\"\n\t\t\t\t\t\tdata-test-id=\"node-execute-button\"\n\t\t\t\t\t\t:nodeName=\"node.name\"\n\t\t\t\t\t\t:disabled=\"outputPanelEditMode.enabled && !isTriggerNode\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\ttelemetrySource=\"parameters\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stopExecution=\"onStopExecution\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NodeSettingsTabs\n\t\t\t\tv-if=\"node && nodeValid\"\n\t\t\t\tv-model=\"openPanel\"\n\t\t\t\t:nodeType=\"nodeType\"\n\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t/>\n\t\t</div>\n\t\t<div class=\"node-is-not-valid\" v-if=\"node && !nodeValid\">\n\t\t\t<p :class=\"$style.warningIcon\">\n\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" />\n\t\t\t</p>\n\t\t\t<div class=\"missingNodeTitleContainer mt-s mb-xs\">\n\t\t\t\t<n8n-text size=\"large\" color=\"text-dark\" bold>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.title') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div v-if=\"isCommunityNode\" :class=\"$style.descriptionContainer\">\n\t\t\t\t<div class=\"mb-l\">\n\t\t\t\t\t<i18n-t\n\t\t\t\t\t\tkeypath=\"nodeSettings.communityNodeUnknown.description\"\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t@click=\"onMissingNodeTextClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #action>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://www.npmjs.com/package/${node.type.split('.')[0]}`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>{{ node.type.split('.')[0] }}</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</div>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"COMMUNITY_NODES_INSTALLATION_DOCS_URL\"\n\t\t\t\t\t@click=\"onMissingNodeLearnMoreLinkClick\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.installLink.text') }}\n\t\t\t\t</n8n-link>\n\t\t\t</div>\n\t\t\t<i18n-t v-else keypath=\"nodeSettings.nodeTypeUnknown.description\" tag=\"span\">\n\t\t\t\t<template #action>\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href=\"CUSTOM_NODES_DOCS_URL\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\tv-text=\"$locale.baseText('nodeSettings.nodeTypeUnknown.description.customNode')\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</div>\n\t\t<div class=\"node-parameters-wrapper\" data-test-id=\"node-parameters\" v-if=\"node && nodeValid\">\n\t\t\t<n8n-notice\n\t\t\t\tv-if=\"hasForeignCredential\"\n\t\t\t\t:content=\"\n\t\t\t\t\t$locale.baseText('nodeSettings.hasForeignCredential', {\n\t\t\t\t\t\tinterpolate: { owner: credentialOwnerName },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t/>\n\t\t\t<div v-show=\"openPanel === 'params'\">\n\t\t\t\t<node-webhooks :node=\"node\" :nodeType=\"nodeType\" />\n\n\t\t\t\t<parameter-input-list\n\t\t\t\t\tv-if=\"nodeValuesInitialized\"\n\t\t\t\t\t:parameters=\"parametersNoneSetting\"\n\t\t\t\t\t:hideDelete=\"true\"\n\t\t\t\t\t:nodeValues=\"nodeValues\"\n\t\t\t\t\t:isReadOnly=\"isReadOnly\"\n\t\t\t\t\t:hiddenIssuesInputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t@parameterBlur=\"onParameterBlur\"\n\t\t\t\t>\n\t\t\t\t\t<node-credentials\n\t\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t\t:readonly=\"isReadOnly\"\n\t\t\t\t\t\t:showAll=\"true\"\n\t\t\t\t\t\t@credentialSelected=\"credentialSelected\"\n\t\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t\t@blur=\"onParameterBlur\"\n\t\t\t\t\t\t:hide-issues=\"hiddenIssuesInputs.includes('credentials')\"\n\t\t\t\t\t/>\n\t\t\t\t</parameter-input-list>\n\t\t\t\t<div v-if=\"parametersNoneSetting.length === 0\" class=\"no-parameters\">\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t{{ $locale.baseText('nodeSettings.thisNodeDoesNotHaveAnyParameters') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"nodeHelpers.isCustomApiCallSelected(nodeValues)\"\n\t\t\t\t\tclass=\"parameter-item parameter-notice\"\n\t\t\t\t\tdata-test-id=\"node-parameters-http-notice\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-notice\n\t\t\t\t\t\t:content=\"\n\t\t\t\t\t\t\t$locale.baseText('nodeSettings.useTheHttpRequestNode', {\n\t\t\t\t\t\t\t\tinterpolate: { nodeTypeDisplayName: nodeType.displayName },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-show=\"openPanel === 'settings'\">\n\t\t\t\t<parameter-input-list\n\t\t\t\t\t:parameters=\"parametersSetting\"\n\t\t\t\t\t:nodeValues=\"nodeValues\"\n\t\t\t\t\t:isReadOnly=\"isReadOnly\"\n\t\t\t\t\t:hiddenIssuesInputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t@parameterBlur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<parameter-input-list\n\t\t\t\t\t:parameters=\"nodeSettings\"\n\t\t\t\t\t:hideDelete=\"true\"\n\t\t\t\t\t:nodeValues=\"nodeValues\"\n\t\t\t\t\t:isReadOnly=\"isReadOnly\"\n\t\t\t\t\t:hiddenIssuesInputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"\"\n\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t@parameterBlur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<div class=\"node-version\" data-test-id=\"node-version\">\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeSettings.nodeVersion', {\n\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\tnode: nodeType?.displayName as string,\n\t\t\t\t\t\t\t\tversion: node.typeVersion.toString(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t\t<span>({{ nodeVersionTag }})</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<n8n-block-ui :show=\"blockUI\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type {\n\tINodeTypeDescription,\n\tINodeParameters,\n\tINodeProperties,\n\tNodeParameterValue,\n} from 'n8n-workflow';\nimport { NodeHelpers, NodeConnectionType, deepCopy } from 'n8n-workflow';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tIUsedCredential,\n} from '@/Interface';\n\nimport {\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tCUSTOM_NODES_DOCS_URL,\n\tMAIN_NODE_PANEL_WIDTH,\n\tIMPORT_CURL_MODAL_KEY,\n} from '@/constants';\n\nimport NodeTitle from '@/components/NodeTitle.vue';\nimport ParameterInputList from '@/components/ParameterInputList.vue';\nimport NodeCredentials from '@/components/NodeCredentials.vue';\nimport NodeSettingsTabs from '@/components/NodeSettingsTabs.vue';\nimport NodeWebhooks from '@/components/NodeWebhooks.vue';\nimport { get, set, unset } from 'lodash-es';\n\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { RenameNodeCommand } from '@/models/history';\nimport useWorkflowsEEStore from '@/stores/workflows.ee.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport type { EventBus } from 'n8n-design-system';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\n\nexport default defineComponent({\n\tname: 'NodeSettings',\n\tcomponents: {\n\t\tNodeTitle,\n\t\tNodeCredentials,\n\t\tParameterInputList,\n\t\tNodeSettingsTabs,\n\t\tNodeWebhooks,\n\t\tNodeExecuteButton,\n\t},\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseHistoryStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseUIStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t),\n\t\tisCurlImportModalOpen(): boolean {\n\t\t\treturn this.uiStore.isModalOpen(IMPORT_CURL_MODAL_KEY);\n\t\t},\n\t\tisReadOnly(): boolean {\n\t\t\treturn this.readOnly || this.hasForeignCredential;\n\t\t},\n\t\tisExecutable(): boolean {\n\t\t\tif (this.nodeType && this.node) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, this.nodeType);\n\t\t\t\tconst inputNames = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tif (!inputNames.includes(NodeConnectionType.Main) && !this.isTriggerNode) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.executable || this.hasForeignCredential;\n\t\t},\n\t\tnodeTypeName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.displayName`,\n\t\t\t\t\tfallback: this.nodeType.name,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tnodeTypeVersions(): number[] {\n\t\t\tif (!this.node) return [];\n\t\t\treturn this.nodeTypesStore.getNodeVersions(this.node.type);\n\t\t},\n\t\tlatestVersion(): number {\n\t\t\treturn Math.max(...this.nodeTypeVersions);\n\t\t},\n\t\tisLatestNodeVersion(): boolean {\n\t\t\treturn this.latestVersion === this.node?.typeVersion;\n\t\t},\n\t\tnodeVersionTag(): string {\n\t\t\tif (!this.nodeType || this.nodeType.hidden) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.deprecated');\n\t\t\t}\n\n\t\t\tif (this.isLatestNodeVersion) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.latest');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeSettings.latestVersion', {\n\t\t\t\tinterpolate: { version: this.latestVersion.toString() },\n\t\t\t});\n\t\t},\n\t\tnodeTypeDescription(): string {\n\t\t\tif (this.nodeType?.description) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.description`,\n\t\t\t\t\tfallback: this.nodeType.description,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.noDescriptionFound');\n\t\t\t}\n\t\t},\n\t\theaderStyle(): object {\n\t\t\tif (!this.node) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t'background-color': this.node.color,\n\t\t\t};\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tparametersSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparametersNoneSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn !item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparameters(): INodeProperties[] {\n\t\t\tif (this.nodeType === null) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn this.nodeType.properties;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\treturn isCommunityPackageName(this.node?.type);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node?.type);\n\t\t},\n\t\tworkflowOwnerName(): string {\n\t\t\treturn this.workflowsEEStore.getWorkflowOwnerName(`${this.workflowsStore.workflowId}`);\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t\tusedCredentials(): IUsedCredential[] {\n\t\t\treturn Object.values(this.workflowsStore.usedCredentials).filter((credential) => {\n\t\t\t\treturn Object.values(this.node?.credentials || []).find((nodeCredential) => {\n\t\t\t\t\treturn nodeCredential.id === credential.id;\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tcredentialOwnerName(): string {\n\t\t\tconst credential = this.usedCredentials\n\t\t\t\t? Object.values(this.usedCredentials).find((credential) => {\n\t\t\t\t\t\treturn credential.id === this.foreignCredentials[0];\n\t\t\t\t })\n\t\t\t\t: undefined;\n\n\t\t\treturn this.credentialsStore.getCredentialOwnerName(credential);\n\t\t},\n\t},\n\tprops: {\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t},\n\t\tdragging: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription>,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tforeignCredentials: {\n\t\t\ttype: Array as PropType<string[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\texecutable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tnodeValid: true,\n\t\t\tnodeColor: null,\n\t\t\topenPanel: 'params',\n\t\t\tnodeValues: {\n\t\t\t\tcolor: '#ff0000',\n\t\t\t\talwaysOutputData: false,\n\t\t\t\texecuteOnce: false,\n\t\t\t\tnotesInFlow: false,\n\t\t\t\tonError: 'stopWorkflow',\n\t\t\t\tretryOnFail: false,\n\t\t\t\tmaxTries: 3,\n\t\t\t\twaitBetweenTries: 1000,\n\t\t\t\tnotes: '',\n\t\t\t\tparameters: {},\n\t\t\t} as INodeParameters,\n\t\t\tnodeValuesInitialized: false, // Used to prevent nodeValues from being overwritten by defaults on reopening ndv\n\n\t\t\tnodeSettings: [] as INodeProperties[],\n\t\t\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\tCUSTOM_NODES_DOCS_URL,\n\t\t\tMAIN_NODE_PANEL_WIDTH,\n\t\t\thiddenIssuesInputs: [] as string[],\n\t\t};\n\t},\n\twatch: {\n\t\tnode(newNode, oldNode) {\n\t\t\tthis.setNodeValues();\n\t\t},\n\t\tisCurlImportModalOpen(newValue, oldValue) {\n\t\t\tif (newValue === false) {\n\t\t\t\tlet parameters = this.uiStore.getHttpNodeParameters || '';\n\n\t\t\t\tif (!parameters) return;\n\n\t\t\t\ttry {\n\t\t\t\t\tparameters = JSON.parse(parameters) as {\n\t\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t\t};\n\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tthis.valueChanged({\n\t\t\t\t\t\tnode: this.node.name,\n\t\t\t\t\t\tname: 'parameters',\n\t\t\t\t\t\tvalue: parameters,\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.uiStore.setHttpNodeParameters({ name: IMPORT_CURL_MODAL_KEY, parameters: '' });\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tpopulateHiddenIssuesSet() {\n\t\t\tif (!this.node || !this.workflowsStore.isNodePristine(this.node.name)) return;\n\n\t\t\tthis.hiddenIssuesInputs.push('credentials');\n\t\t\tthis.parametersNoneSetting.forEach((parameter) => {\n\t\t\t\tthis.hiddenIssuesInputs.push(parameter.name);\n\t\t\t});\n\n\t\t\tthis.workflowsStore.setNodePristine(this.node.name, false);\n\t\t},\n\t\tpopulateSettings() {\n\t\t\tif (this.isExecutable && !this.isTriggerNode) {\n\t\t\t\tthis.nodeSettings.push(\n\t\t\t\t\t...([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.alwaysOutputData.displayName'),\n\t\t\t\t\t\t\tname: 'alwaysOutputData',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.alwaysOutputData.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.executeOnce.displayName'),\n\t\t\t\t\t\t\tname: 'executeOnce',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.executeOnce.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.retryOnFail.displayName'),\n\t\t\t\t\t\t\tname: 'retryOnFail',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.retryOnFail.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.maxTries.displayName'),\n\t\t\t\t\t\t\tname: 'maxTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 2,\n\t\t\t\t\t\t\t\tmaxValue: 5,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 3,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.maxTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.waitBetweenTries.displayName'),\n\t\t\t\t\t\t\tname: 'waitBetweenTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 0,\n\t\t\t\t\t\t\t\tmaxValue: 5000,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 1000,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.waitBetweenTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.onError.displayName'),\n\t\t\t\t\t\t\tname: 'onError',\n\t\t\t\t\t\t\ttype: 'options',\n\t\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'stopWorkflow',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueRegularOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueErrorOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: 'stopWorkflow',\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.onError.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t] as INodeProperties[]),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.nodeSettings.push(\n\t\t\t\t...([\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notes.displayName'),\n\t\t\t\t\t\tname: 'notes',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\trows: 5,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notes.description'),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notesInFlow.displayName'),\n\t\t\t\t\t\tname: 'notesInFlow',\n\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notesInFlow.description'),\n\t\t\t\t\t},\n\t\t\t\t] as INodeProperties[]),\n\t\t\t);\n\t\t},\n\t\tonParameterBlur(parameterName: string) {\n\t\t\tthis.hiddenIssuesInputs = this.hiddenIssuesInputs.filter((name) => name !== parameterName);\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\tthis.$emit('activate');\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\tthis.$emit('execute');\n\t\t},\n\t\tsetValue(name: string, value: NodeParameterValue) {\n\t\t\tconst nameParts = name.split('.');\n\t\t\tlet lastNamePart: string | undefined = nameParts.pop();\n\n\t\t\tlet isArray = false;\n\t\t\tif (lastNamePart !== undefined && lastNamePart.includes('[')) {\n\t\t\t\t// It includes an index so we have to extract it\n\t\t\t\tconst lastNameParts = lastNamePart.match(/(.*)\\[(\\d+)\\]$/);\n\t\t\t\tif (lastNameParts) {\n\t\t\t\t\tnameParts.push(lastNameParts[1]);\n\t\t\t\t\tlastNamePart = lastNameParts[2];\n\t\t\t\t\tisArray = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the value so that everything updates correctly in the UI\n\t\t\tif (nameParts.length === 0) {\n\t\t\t\t// Data is on top level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = this.nodeValues;\n\t\t\t\t\tthis.nodeValues = remainingNodeValues;\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t[lastNamePart as string]: value,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Data is on lower level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tlet tempValue = get(this.nodeValues, nameParts.join('.')) as\n\t\t\t\t\t\t| INodeParameters\n\t\t\t\t\t\t| INodeParameters[];\n\n\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = tempValue;\n\t\t\t\t\ttempValue = remainingNodeValues;\n\n\t\t\t\t\tif (isArray && (tempValue as INodeParameters[]).length === 0) {\n\t\t\t\t\t\t// If a value from an array got delete and no values are left\n\t\t\t\t\t\t// delete also the parent\n\t\t\t\t\t\tlastNamePart = nameParts.pop();\n\t\t\t\t\t\ttempValue = get(this.nodeValues, nameParts.join('.')) as INodeParameters;\n\t\t\t\t\t\tconst { [lastNamePart]: removedArrayNodeValue, ...remainingArrayNodeValues } =\n\t\t\t\t\t\t\ttempValue;\n\t\t\t\t\t\ttempValue = remainingArrayNodeValues;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tif (typeof value === 'object') {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tdeepCopy(value),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.nodeValues = { ...this.nodeValues };\n\t\t},\n\t\tcredentialSelected(updateInformation: INodeUpdatePropertiesInformation) {\n\t\t\t// Update the values on the node\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(updateInformation.name);\n\n\t\t\tif (node) {\n\t\t\t\t// Update the issues\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssues(node);\n\t\t\t}\n\n\t\t\tvoid this.externalHooks.run('nodeSettings.credentialSelected', { updateInformation });\n\t\t},\n\t\tnameChanged(name: string) {\n\t\t\tif (this.node) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(this.node.name, name));\n\t\t\t}\n\t\t\t// @ts-ignore\n\t\t\tthis.valueChanged({\n\t\t\t\tvalue: name,\n\t\t\t\tname: 'name',\n\t\t\t});\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tlet newValue: NodeParameterValue;\n\n\t\t\tif (parameterData.hasOwnProperty('value')) {\n\t\t\t\t// New value is given\n\t\t\t\tnewValue = parameterData.value as string | number;\n\t\t\t} else {\n\t\t\t\t// Get new value from nodeData where it is set already\n\t\t\t\tnewValue = get(this.nodeValues, parameterData.name) as NodeParameterValue;\n\t\t\t}\n\t\t\t// Save the node name before we commit the change because\n\t\t\t// we need the old name to rename the node properly\n\t\t\tconst nodeNameBefore = parameterData.node || this.node?.name;\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeNameBefore);\n\n\t\t\tif (node === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'onError') {\n\t\t\t\t// If that parameter changes, we need to redraw the connections, as the error output may need to be added or removed\n\t\t\t\tthis.$emit('redrawRequired');\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'name') {\n\t\t\t\t// Name of node changed so we have to set also the new node name as active\n\n\t\t\t\t// Update happens in NodeView so emit event\n\t\t\t\tconst sendData = {\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t\toldValue: nodeNameBefore,\n\t\t\t\t\tname: parameterData.name,\n\t\t\t\t};\n\t\t\t\tthis.$emit('valueChanged', sendData);\n\t\t\t} else if (parameterData.name === 'parameters') {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\tfor (const parameterName of Object.keys(parameterData.value)) {\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tnewValue = parameterData.value[parameterName];\n\n\t\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t\t// actual parameter name\n\t\t\t\t\tconst parameterPath = parameterName.split('.').slice(1).join('.');\n\n\t\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t\t// the needed data like path and index\n\t\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t\t// Apply the new value\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tif (parameterData[parameterName] === undefined && parameterPathArray !== null) {\n\t\t\t\t\t\t// Delete array item\n\t\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\t\tparameterPath,\n\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\t\toldNodeParameters,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeParameters) {\n\t\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\t}\n\t\t\t} else if (parameterData.name.startsWith('parameters.')) {\n\t\t\t\t// A node parameter changed\n\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t// actual parameter name\n\t\t\t\tconst parameterPath = parameterData.name.split('.').slice(1).join('.');\n\n\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t// the needed data like path and index\n\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t// Apply the new value\n\t\t\t\tif (parameterData.value === undefined && parameterPathArray !== null) {\n\t\t\t\t\t// Delete array item\n\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update the data in vuex\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\tparameterPath,\n\t\t\t\t\tnewValue,\n\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\toldNodeParameters,\n\t\t\t\t});\n\n\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\tthis.$telemetry.trackNodeParametersValuesChange(nodeType.name, parameterData);\n\t\t\t} else {\n\t\t\t\t// A property on the node itself changed\n\n\t\t\t\t// Update data in settings\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t[parameterData.name]: newValue,\n\t\t\t\t};\n\n\t\t\t\t// Update data in vuex\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tkey: parameterData.name,\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeValue(updateInformation);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Sets the values of the active node in the internal settings variables\n\t\t */\n\t\tsetNodeValues() {\n\t\t\t// No node selected\n\t\t\tif (!this.node) {\n\t\t\t\tthis.nodeValuesInitialized = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.nodeType !== null) {\n\t\t\t\tthis.nodeValid = true;\n\n\t\t\t\tconst foundNodeSettings = [];\n\t\t\t\tif (this.node.color) {\n\t\t\t\t\tfoundNodeSettings.push('color');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tcolor: this.node.color,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notes) {\n\t\t\t\t\tfoundNodeSettings.push('notes');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotes: this.node.notes,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.alwaysOutputData) {\n\t\t\t\t\tfoundNodeSettings.push('alwaysOutputData');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\talwaysOutputData: this.node.alwaysOutputData,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.executeOnce) {\n\t\t\t\t\tfoundNodeSettings.push('executeOnce');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\texecuteOnce: this.node.executeOnce,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.continueOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: 'continueRegularOutput',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.onError) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: this.node.onError,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notesInFlow) {\n\t\t\t\t\tfoundNodeSettings.push('notesInFlow');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotesInFlow: this.node.notesInFlow,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.retryOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('retryOnFail');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tretryOnFail: this.node.retryOnFail,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.maxTries) {\n\t\t\t\t\tfoundNodeSettings.push('maxTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tmaxTries: this.node.maxTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.waitBetweenTries) {\n\t\t\t\t\tfoundNodeSettings.push('waitBetweenTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\twaitBetweenTries: this.node.waitBetweenTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Set default node settings\n\t\t\t\tfor (const nodeSetting of this.nodeSettings) {\n\t\t\t\t\tif (!foundNodeSettings.includes(nodeSetting.name)) {\n\t\t\t\t\t\t// Set default value\n\t\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t\t[nodeSetting.name]: nodeSetting.default,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\tparameters: deepCopy(this.node.parameters),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.nodeValid = false;\n\t\t\t}\n\n\t\t\tthis.nodeValuesInitialized = true;\n\t\t},\n\t\tonMissingNodeTextClick(event: MouseEvent) {\n\t\t\tif ((event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr browse button', {\n\t\t\t\t\tsource: 'cnr missing node modal',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonMissingNodeLearnMoreLinkClick() {\n\t\t\tthis.$telemetry.track('user clicked cnr docs link', {\n\t\t\t\tsource: 'missing node modal source',\n\t\t\t\tpackage_name: this.node?.type.split('.')[0],\n\t\t\t\tnode_type: this.node?.type,\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.openPanel = 'settings';\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.populateHiddenIssuesSet();\n\t\tthis.populateSettings();\n\t\tthis.setNodeValues();\n\t\tthis.eventBus?.on('openSettings', this.openSettings);\n\n\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node as INodeUi, this.nodeType);\n\t},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('openSettings', this.openSettings);\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.header {\n\tbackground-color: var(--color-background-base);\n}\n\n.warningIcon {\n\tcolor: var(--color-text-lighter);\n\tfont-size: var(--font-size-2xl);\n}\n\n.descriptionContainer {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-settings {\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n\tbackground-color: var(--color-background-xlight);\n\theight: 100%;\n\twidth: 100%;\n\n\t.no-parameters {\n\t\tmargin-top: var(--spacing-xs);\n\t}\n\n\t.header-side-menu {\n\t\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) var(--spacing-s);\n\t\tfont-size: var(--font-size-l);\n\t\tdisplay: flex;\n\n\t\t.node-name {\n\t\t\tpadding-top: var(--spacing-5xs);\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t.node-is-not-valid {\n\t\theight: 75%;\n\t\tpadding: 10px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttext-align: center;\n\t\tline-height: var(--font-line-height-regular);\n\t}\n\n\t.node-parameters-wrapper {\n\t\toverflow-y: auto;\n\t\tpadding: 0 var(--spacing-m) 200px var(--spacing-m);\n\t\tflex-grow: 1;\n\t}\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.parameter-content {\n\tfont-size: 0.9em;\n\tmargin-right: -15px;\n\tmargin-left: -15px;\n\tinput {\n\t\twidth: calc(100% - 35px);\n\t\tpadding: 5px;\n\t}\n\tselect {\n\t\twidth: calc(100% - 20px);\n\t\tpadding: 5px;\n\t}\n\n\t&:before {\n\t\tdisplay: table;\n\t\tcontent: ' ';\n\t\tposition: relative;\n\t\tbox-sizing: border-box;\n\t\tclear: both;\n\t}\n}\n\n.parameter-wrapper {\n\tpadding: 0 1em;\n}\n\n.color-reset-button-wrapper {\n\tposition: relative;\n}\n.color-reset-button {\n\tposition: absolute;\n\tright: 7px;\n\ttop: -25px;\n}\n\n.node-version {\n\tborder-top: var(--border-base);\n\tfont-size: var(--font-size-xs);\n\tfont-size: var(--font-size-2xs);\n\tpadding: var(--spacing-xs) 0 var(--spacing-2xs) 0;\n\tcolor: var(--color-text-light);\n}\n\n.parameter-value {\n\tinput.expression {\n\t\tborder-style: dashed;\n\t\tborder-color: #ff9600;\n\t\tdisplay: inline-block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tbox-sizing: border-box;\n\t\tbackground-color: #793300;\n\t}\n}\n</style>\n","<template>\n\t<component\n\t\t:is=\"tag\"\n\t\t:class=\"{ [$style.dragging]: isDragging }\"\n\t\t@mousedown=\"onDragStart\"\n\t\tref=\"wrapper\"\n\t>\n\t\t<slot :isDragging=\"isDragging\"></slot>\n\n\t\t<Teleport to=\"body\">\n\t\t\t<div ref=\"draggable\" :class=\"$style.draggable\" :style=\"draggableStyle\" v-show=\"isDragging\">\n\t\t\t\t<slot name=\"preview\" :canDrop=\"canDrop\" :el=\"draggingEl\"></slot>\n\t\t\t</div>\n\t\t</Teleport>\n\t</component>\n</template>\n\n<script lang=\"ts\">\nimport type { XYPosition } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { mapStores } from 'pinia';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'draggable',\n\tprops: {\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\tdata: {\n\t\t\ttype: String,\n\t\t},\n\t\ttag: {\n\t\t\ttype: String,\n\t\t\tdefault: 'div',\n\t\t},\n\t\ttargetDataKey: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tdata() {\n\t\tconst draggablePosition = {\n\t\t\tx: -100,\n\t\t\ty: -100,\n\t\t};\n\n\t\treturn {\n\t\t\tisDragging: false,\n\t\t\tdraggablePosition,\n\t\t\tdraggingEl: null as null | HTMLElement,\n\t\t\tdraggableStyle: {\n\t\t\t\ttransform: `translate(${draggablePosition.x}px, ${draggablePosition.y}px)`,\n\t\t\t},\n\t\t\tanimationFrameId: 0,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tcanDrop(): boolean {\n\t\t\treturn this.ndvStore.canDraggableDrop;\n\t\t},\n\t\tstickyPosition(): XYPosition | null {\n\t\t\treturn this.ndvStore.draggableStickyPos;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetDraggableStyle() {\n\t\t\tthis.draggableStyle = {\n\t\t\t\ttransform: `translate(${this.draggablePosition.x}px, ${this.draggablePosition.y}px)`,\n\t\t\t};\n\t\t},\n\t\tonDragStart(e: MouseEvent) {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.draggingEl = e.target as HTMLElement;\n\t\t\tif (this.targetDataKey && this.draggingEl.dataset?.target !== this.targetDataKey) {\n\t\t\t\tthis.draggingEl = this.draggingEl.closest(\n\t\t\t\t\t`[data-target=\"${this.targetDataKey}\"]`,\n\t\t\t\t) as HTMLElement;\n\t\t\t}\n\n\t\t\tif (this.targetDataKey && this.draggingEl?.dataset?.target !== this.targetDataKey) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tthis.isDragging = false;\n\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\tthis.setDraggableStyle();\n\n\t\t\twindow.addEventListener('mousemove', this.onDrag);\n\t\t\twindow.addEventListener('mouseup', this.onDragEnd);\n\n\t\t\t// blur so that any focused inputs update value\n\t\t\tconst activeElement = document.activeElement as HTMLElement;\n\t\t\tif (activeElement) {\n\t\t\t\tactiveElement.blur();\n\t\t\t}\n\t\t},\n\t\tonDrag(e: MouseEvent) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.isDragging) {\n\t\t\t\tthis.isDragging = true;\n\n\t\t\t\tconst data =\n\t\t\t\t\tthis.targetDataKey && this.draggingEl ? this.draggingEl.dataset.value : this.data || '';\n\t\t\t\tthis.ndvStore.draggableStartDragging({ type: this.type, data: data || '' });\n\n\t\t\t\tthis.$emit('dragstart', this.draggingEl);\n\t\t\t\tdocument.body.style.cursor = 'grabbing';\n\t\t\t}\n\n\t\t\tthis.animationFrameId = window.requestAnimationFrame(() => {\n\t\t\t\tif (this.canDrop && this.stickyPosition) {\n\t\t\t\t\tthis.draggablePosition = { x: this.stickyPosition[0], y: this.stickyPosition[1] };\n\t\t\t\t} else {\n\t\t\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\t\t}\n\t\t\t\tthis.setDraggableStyle();\n\t\t\t\tthis.$emit('drag', this.draggablePosition);\n\t\t\t});\n\t\t},\n\t\tonDragEnd() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdocument.body.style.cursor = 'unset';\n\t\t\twindow.removeEventListener('mousemove', this.onDrag);\n\t\t\twindow.removeEventListener('mouseup', this.onDragEnd);\n\t\t\twindow.cancelAnimationFrame(this.animationFrameId);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('dragend', this.draggingEl);\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.draggingEl = null;\n\t\t\t\tthis.ndvStore.draggableStopDragging();\n\t\t\t}, 0);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragging {\n\tvisibility: visible;\n\tcursor: grabbing;\n}\n\n.draggable {\n\tposition: fixed;\n\tz-index: 9999999;\n\ttop: 0;\n\tleft: 0;\n}\n\n.draggable-data-transfer {\n\twidth: 0;\n\theight: 0;\n}\n</style>\n","<template>\n\t<Draggable\n\t\ttype=\"panel-resize\"\n\t\t@drag=\"onDrag\"\n\t\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t\t:class=\"$style.dragContainer\"\n\t>\n\t\t<template #default=\"{ isDragging }\">\n\t\t\t<div :class=\"{ [$style.dragButton]: true }\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveLeft\"\n\t\t\t\t\t:class=\"{ [$style.leftArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-left\" />\n\t\t\t\t</span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveRight\"\n\t\t\t\t\t:class=\"{ [$style.rightArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-right\" />\n\t\t\t\t</span>\n\t\t\t\t<div :class=\"$style.grid\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</Draggable>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport Draggable from './Draggable.vue';\n\nexport default defineComponent({\n\tcomponents: {\n\t\tDraggable,\n\t},\n\tprops: {\n\t\tcanMoveRight: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanMoveLeft: {\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\tmethods: {\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tthis.$emit('drag', e);\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.$emit('dragstart');\n\t\t},\n\t\tonDragEnd() {\n\t\t\tthis.$emit('dragend');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragContainer {\n\tpointer-events: all;\n}\n.dragButton {\n\tbackground-color: var(--color-background-base);\n\twidth: 64px;\n\theight: 21px;\n\tborder-top-left-radius: var(--border-radius-base);\n\tborder-top-right-radius: var(--border-radius-base);\n\tcursor: grab;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\toverflow: visible;\n\tposition: relative;\n\tz-index: 3;\n\n\t&:hover {\n\t\t.leftArrow,\n\t\t.rightArrow {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.visible {\n\tvisibility: visible !important;\n}\n\n.arrow {\n\tposition: absolute;\n\tcolor: var(--color-background-xlight);\n\tfont-size: var(--font-size-3xs);\n\tvisibility: hidden;\n\ttop: 0;\n}\n\n.leftArrow {\n\tcomposes: arrow;\n\tleft: -16px;\n}\n\n.rightArrow {\n\tcomposes: arrow;\n\tright: -16px;\n}\n\n.grid {\n\t> div {\n\t\tdisplay: flex;\n\n\t\t&:first-child {\n\t\t\t> div {\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\t\t}\n\n\t\t> div {\n\t\t\theight: 2px;\n\t\t\twidth: 2px;\n\t\t\tborder-radius: 50%;\n\t\t\tbackground-color: var(--color-foreground-xdark);\n\t\t\tmargin-right: 4px;\n\n\t\t\t&:last-child {\n\t\t\t\tmargin-right: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<aside :class=\"$style.floatingNodes\">\n\t\t<ul\n\t\t\tv-for=\"connectionGroup in connectionGroups\"\n\t\t\t:class=\"[$style.nodesList, $style[connectionGroup]]\"\n\t\t\t:key=\"connectionGroup\"\n\t\t>\n\t\t\t<template v-for=\"{ node, nodeType } in connectedNodes[connectionGroup]\">\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\t:placement=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\tv-if=\"node && nodeType\"\n\t\t\t\t\t:teleported=\"false\"\n\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t:offset=\"60\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>{{ node.name }}</template>\n\n\t\t\t\t\t<li\n\t\t\t\t\t\t:class=\"$style.connectedNode\"\n\t\t\t\t\t\t@click=\"$emit('switchSelectedNode', node.name)\"\n\t\t\t\t\t\tdata-test-id=\"floating-node\"\n\t\t\t\t\t\t:data-node-name=\"node.name\"\n\t\t\t\t\t\t:data-node-placement=\"connectionGroup\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<node-icon\n\t\t\t\t\t\t\t:nodeType=\"nodeType\"\n\t\t\t\t\t\t\t:nodeName=\"node.name\"\n\t\t\t\t\t\t\t:tooltip-position=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\t\t\t:size=\"35\"\n\t\t\t\t\t\t\tcircle\n\t\t\t\t\t\t/>\n\t\t\t\t\t</li>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</template>\n\t\t</ul>\n\t</aside>\n</template>\n\n<script setup lang=\"ts\">\nimport type { INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { computed, onMounted, onBeforeUnmount } from 'vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport type { INodeTypeDescription } from 'n8n-workflow';\n\ninterface Props {\n\trootNode: INodeUi;\n\ttype: 'input' | 'sub-input' | 'sub-output' | 'output';\n}\nconst enum FloatingNodePosition {\n\ttop = 'outputSub',\n\tright = 'outputMain',\n\tbottom = 'inputSub',\n\tleft = 'inputMain',\n}\nconst props = defineProps<Props>();\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst workflow = workflowsStore.getCurrentWorkflow();\nconst emit = defineEmits(['switchSelectedNode']);\n\ninterface NodeConfig {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n}\nfunction moveNodeDirection(direction: FloatingNodePosition) {\n\tconst matchedDirectionNode = connectedNodes.value[direction][0];\n\tif (matchedDirectionNode) {\n\t\temit('switchSelectedNode', matchedDirectionNode.node.name);\n\t}\n}\n\nfunction onKeyDown(e: KeyboardEvent) {\n\tif (e.shiftKey && e.altKey && (e.ctrlKey || e.metaKey)) {\n\t\t/* eslint-disable @typescript-eslint/naming-convention */\n\t\tconst mapper = {\n\t\t\tArrowUp: FloatingNodePosition.top,\n\t\t\tArrowRight: FloatingNodePosition.right,\n\t\t\tArrowDown: FloatingNodePosition.bottom,\n\t\t\tArrowLeft: FloatingNodePosition.left,\n\t\t};\n\t\t/* eslint-enable @typescript-eslint/naming-convention */\n\n\t\tconst matchingDirection = mapper[e.key as keyof typeof mapper] || null;\n\t\tif (matchingDirection) {\n\t\t\tmoveNodeDirection(matchingDirection);\n\t\t}\n\t}\n}\nfunction getINodesFromNames(names: string[]): NodeConfig[] {\n\treturn names\n\t\t.map((name) => {\n\t\t\tconst node = workflowsStore.getNodeByName(name);\n\t\t\tif (node) {\n\t\t\t\tconst nodeType = nodeTypesStore.getNodeType(node.type);\n\t\t\t\tif (nodeType) {\n\t\t\t\t\treturn { node, nodeType };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\t.filter((n): n is NodeConfig => n !== null);\n}\nconst connectedNodes = computed<\n\tRecord<FloatingNodePosition, Array<{ node: INodeUi; nodeType: INodeTypeDescription }>>\n>(() => {\n\tconst rootName = props.rootNode.name;\n\treturn {\n\t\t[FloatingNodePosition.top]: getINodesFromNames(\n\t\t\tworkflow.getChildNodes(rootName, 'ALL_NON_MAIN'),\n\t\t),\n\t\t[FloatingNodePosition.right]: getINodesFromNames(workflow.getChildNodes(rootName, 'main', 1)),\n\t\t[FloatingNodePosition.bottom]: getINodesFromNames(\n\t\t\tworkflow.getParentNodes(rootName, 'ALL_NON_MAIN'),\n\t\t),\n\t\t[FloatingNodePosition.left]: getINodesFromNames(workflow.getParentNodes(rootName, 'main', 1)),\n\t};\n});\n\nconst connectionGroups = [\n\tFloatingNodePosition.top,\n\tFloatingNodePosition.right,\n\tFloatingNodePosition.bottom,\n\tFloatingNodePosition.left,\n];\nconst tooltipPositionMapper = {\n\t[FloatingNodePosition.top]: 'bottom',\n\t[FloatingNodePosition.right]: 'left',\n\t[FloatingNodePosition.bottom]: 'top',\n\t[FloatingNodePosition.left]: 'right',\n};\n\nonMounted(() => {\n\tdocument.addEventListener('keydown', onKeyDown, true);\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('keydown', onKeyDown, true);\n});\ndefineExpose({\n\tmoveNodeDirection,\n});\n</script>\n\n<style lang=\"scss\" module>\n.floatingNodes {\n\tposition: fixed;\n\tbottom: 0;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 10;\n\tpointer-events: none;\n}\n.floatingNodes {\n\tright: 0;\n}\n\n.nodesList {\n\tlist-style: none;\n\tpadding: 0;\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-direction: column;\n\twidth: min-content;\n\tmargin: auto;\n\ttransform-origin: center;\n\tgap: var(--spacing-s);\n\ttransition: transform 0.2s ease-in-out;\n\n\t&.inputSub,\n\t&.outputSub {\n\t\tright: 0;\n\t\tleft: 0;\n\t\tflex-direction: row;\n\t}\n\t&.outputSub {\n\t\ttop: 0;\n\t}\n\t&.inputSub {\n\t\tbottom: 0;\n\t}\n\t&.outputMain,\n\t&.inputMain {\n\t\ttop: 0;\n\t\tbottom: 0;\n\t}\n\t&.outputMain {\n\t\tright: 0;\n\t}\n\t&.inputMain {\n\t\tleft: 0;\n\t}\n\n\t&.outputMain {\n\t\ttransform: translateX(50%);\n\t}\n\t&.outputSub {\n\t\ttransform: translateY(-50%);\n\t}\n\t&.inputMain {\n\t\ttransform: translateX(-50%);\n\t}\n\t&.inputSub {\n\t\ttransform: translateY(50%);\n\t}\n}\n.connectedNode {\n\tborder: var(--border-base);\n\tbackground-color: var(--color-canvas-node-background);\n\tborder-radius: 100%;\n\tpadding: var(--spacing-s);\n\tcursor: pointer;\n\tpointer-events: all;\n\ttransition: transform 0.2s cubic-bezier(0.19, 1, 0.22, 1);\n\tposition: relative;\n\ttransform: scale(0.8);\n\tdisplay: flex;\n\tjustify-self: center;\n\talign-self: center;\n\n\t&::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: -35%;\n\t\tright: -30%;\n\t\tbottom: -35%;\n\t\tleft: -30%;\n\t\tz-index: -1;\n\t}\n\t.outputMain &,\n\t.inputMain & {\n\t\tborder-radius: var(--border-radius-large);\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\t.outputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(-50%);\n\t\t}\n\t}\n\t.outputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(50%);\n\t\t}\n\t}\n\t.inputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(50%);\n\t\t}\n\t}\n\t.inputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(-50%);\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<NDVFloatingNodes\n\t\t\tv-if=\"activeNode\"\n\t\t\t@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t:root-node=\"activeNode\"\n\t\t\ttype=\"input\"\n\t\t/>\n\t\t<div :class=\"$style.inputPanel\" v-if=\"!hideInputAndOutput\" :style=\"inputPanelStyles\">\n\t\t\t<slot name=\"input\"></slot>\n\t\t</div>\n\t\t<div :class=\"$style.outputPanel\" v-if=\"!hideInputAndOutput\" :style=\"outputPanelStyles\">\n\t\t\t<slot name=\"output\"></slot>\n\t\t</div>\n\t\t<div :class=\"$style.mainPanel\" :style=\"mainPanelStyles\">\n\t\t\t<n8n-resize-wrapper\n\t\t\t\t:isResizingEnabled=\"currentNodePaneType !== 'unknown'\"\n\t\t\t\t:width=\"relativeWidthToPx(mainPanelDimensions.relativeWidth)\"\n\t\t\t\t:minWidth=\"MIN_PANEL_WIDTH\"\n\t\t\t\t:gridSize=\"20\"\n\t\t\t\t@resize=\"onResizeDebounced\"\n\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t\t:supportedDirections=\"supportedResizeDirections\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.dragButtonContainer\">\n\t\t\t\t\t<PanelDragButton\n\t\t\t\t\t\t:class=\"{ [$style.draggable]: true, [$style.visible]: isDragging }\"\n\t\t\t\t\t\t:canMoveLeft=\"canMoveLeft\"\n\t\t\t\t\t\t:canMoveRight=\"canMoveRight\"\n\t\t\t\t\t\tv-if=\"!hideInputAndOutput && isDraggable\"\n\t\t\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t\t\t@drag=\"onDrag\"\n\t\t\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"{ [$style.mainPanelInner]: true, [$style.dragging]: isDragging }\">\n\t\t\t\t\t<slot name=\"main\" />\n\t\t\t\t</div>\n\t\t\t</n8n-resize-wrapper>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { get } from 'lodash-es';\nimport { useStorage } from '@/composables/useStorage';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport PanelDragButton from './PanelDragButton.vue';\n\nimport { LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH, MAIN_NODE_PANEL_WIDTH } from '@/constants';\nimport { debounceHelper } from '@/mixins/debounce';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { ndvEventBus } from '@/event-bus';\nimport NDVFloatingNodes from '@/components/NDVFloatingNodes.vue';\n\nconst SIDE_MARGIN = 24;\nconst SIDE_PANELS_MARGIN = 80;\nconst MIN_PANEL_WIDTH = 280;\nconst PANEL_WIDTH = 320;\nconst PANEL_WIDTH_LARGE = 420;\n\nconst initialMainPanelWidth: { [key: string]: number } = {\n\tregular: MAIN_NODE_PANEL_WIDTH,\n\tdragless: MAIN_NODE_PANEL_WIDTH,\n\tunknown: MAIN_NODE_PANEL_WIDTH,\n\tinputless: MAIN_NODE_PANEL_WIDTH,\n\twide: MAIN_NODE_PANEL_WIDTH * 2,\n};\n\nexport default defineComponent({\n\tname: 'NDVDraggablePanels',\n\tmixins: [debounceHelper],\n\tcomponents: {\n\t\tPanelDragButton,\n\t\tNDVFloatingNodes,\n\t},\n\tprops: {\n\t\tisDraggable: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideInputAndOutput: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tposition: {\n\t\t\ttype: Number,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tdata(): {\n\t\twindowWidth: number;\n\t\tisDragging: boolean;\n\t\tMIN_PANEL_WIDTH: number;\n\t\tinitialized: boolean;\n\t} {\n\t\treturn {\n\t\t\twindowWidth: 1,\n\t\t\tisDragging: false,\n\t\t\tMIN_PANEL_WIDTH,\n\t\t\tinitialized: false,\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.setTotalWidth();\n\n\t\t/*\n\t\t\tOnly set(or restore) initial position if `mainPanelDimensions`\n\t\t\tis at the default state({relativeLeft:1, relativeRight: 1, relativeWidth: 1}) to make sure we use store values if they are set\n\t\t*/\n\t\tif (\n\t\t\tthis.mainPanelDimensions.relativeLeft === 1 &&\n\t\t\tthis.mainPanelDimensions.relativeRight === 1\n\t\t) {\n\t\t\tthis.setMainPanelWidth();\n\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\tthis.restorePositionData();\n\t\t}\n\n\t\twindow.addEventListener('resize', this.setTotalWidth);\n\t\tthis.$emit('init', { position: this.mainPanelDimensions.relativeLeft });\n\t\tsetTimeout(() => {\n\t\t\tthis.initialized = true;\n\t\t}, 0);\n\n\t\tndvEventBus.on('setPositionByName', this.setPositionByName);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.setTotalWidth);\n\t\tndvEventBus.off('setPositionByName', this.setPositionByName);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tmainPanelDimensions(): {\n\t\t\trelativeWidth: number;\n\t\t\trelativeLeft: number;\n\t\t\trelativeRight: number;\n\t\t} {\n\t\t\treturn this.ndvStore.getMainPanelDimensions(this.currentNodePaneType);\n\t\t},\n\t\tactiveNode() {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tsupportedResizeDirections(): string[] {\n\t\t\tconst supportedDirections = ['right'];\n\n\t\t\tif (this.isDraggable) supportedDirections.push('left');\n\t\t\treturn supportedDirections;\n\t\t},\n\t\tcurrentNodePaneType(): string {\n\t\t\tif (!this.hasInputSlot) return 'inputless';\n\t\t\tif (!this.isDraggable) return 'dragless';\n\t\t\tif (this.nodeType === null) return 'unknown';\n\t\t\treturn get(this, 'nodeType.parameterPane') || 'regular';\n\t\t},\n\t\thasInputSlot(): boolean {\n\t\t\treturn this.$slots.input !== undefined;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.pxToRelativeWidth(SIDE_PANELS_MARGIN);\n\t\t},\n\t\tminWindowWidth(): number {\n\t\t\treturn 2 * (SIDE_MARGIN + SIDE_PANELS_MARGIN) + MIN_PANEL_WIDTH;\n\t\t},\n\t\tminimumLeftPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\tif (!this.hasInputSlot) return this.pxToRelativeWidth(SIDE_MARGIN);\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tmaximumRightPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tcanMoveLeft(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeLeft > this.minimumLeftPosition;\n\t\t},\n\t\tcanMoveRight(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeRight > this.maximumRightPosition;\n\t\t},\n\t\tmainPanelStyles(): { left: string; right: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeLeft)}px`,\n\t\t\t\tright: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\tinputPanelStyles(): { right: string } {\n\t\t\treturn {\n\t\t\t\tright: `${this.relativeWidthToPx(this.calculatedPositions.inputPanelRelativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\toutputPanelStyles(): { left: string; transform: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.calculatedPositions.outputPanelRelativeLeft)}px`,\n\t\t\t\ttransform: `translateX(-${this.relativeWidthToPx(this.outputPanelRelativeTranslate)}px)`,\n\t\t\t};\n\t\t},\n\t\tcalculatedPositions(): { inputPanelRelativeRight: number; outputPanelRelativeLeft: number } {\n\t\t\tconst hasInput = this.$slots.input !== undefined;\n\t\t\tconst outputPanelRelativeLeft =\n\t\t\t\tthis.mainPanelDimensions.relativeLeft + this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst inputPanelRelativeRight = hasInput\n\t\t\t\t? 1 - outputPanelRelativeLeft + this.mainPanelDimensions.relativeWidth\n\t\t\t\t: 1 - this.pxToRelativeWidth(SIDE_MARGIN);\n\n\t\t\treturn {\n\t\t\t\tinputPanelRelativeRight,\n\t\t\t\toutputPanelRelativeLeft,\n\t\t\t};\n\t\t},\n\t\toutputPanelRelativeTranslate(): number {\n\t\t\tconst panelMinLeft = 1 - this.pxToRelativeWidth(MIN_PANEL_WIDTH + SIDE_MARGIN);\n\t\t\tconst currentRelativeLeftDelta =\n\t\t\t\tthis.calculatedPositions.outputPanelRelativeLeft - panelMinLeft;\n\t\t\treturn currentRelativeLeftDelta > 0 ? currentRelativeLeftDelta : 0;\n\t\t},\n\t\thasDoubleWidth(): boolean {\n\t\t\treturn get(this, 'nodeType.parameterPane') === 'wide';\n\t\t},\n\t\tfixedPanelWidth(): number {\n\t\t\tconst multiplier = this.hasDoubleWidth ? 2 : 1;\n\n\t\t\tif (this.windowWidth > 1700) {\n\t\t\t\treturn PANEL_WIDTH_LARGE * multiplier;\n\t\t\t}\n\n\t\t\treturn PANEL_WIDTH * multiplier;\n\t\t},\n\t\tisBelowMinWidthMainPanel(): boolean {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\treturn this.mainPanelDimensions.relativeWidth < minRelativeWidth;\n\t\t},\n\t},\n\twatch: {\n\t\twindowWidth(windowWidth) {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\t// Prevent the panel resizing below MIN_PANEL_WIDTH whhile maintaing position\n\t\t\tif (this.isBelowMinWidthMainPanel) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t}\n\n\t\t\tconst isBelowMinLeft = this.minimumLeftPosition > this.mainPanelDimensions.relativeLeft;\n\t\t\tconst isMaxRight = this.maximumRightPosition > this.mainPanelDimensions.relativeRight;\n\n\t\t\t// When user is resizing from non-supported view(sub ~488px) we need to refit the panels\n\t\t\tif (windowWidth > this.minWindowWidth && isBelowMinLeft && isMaxRight) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\t}\n\n\t\t\tthis.setPositions(this.mainPanelDimensions.relativeLeft);\n\t\t},\n\t},\n\tmethods: {\n\t\tonSwitchSelectedNode(node: string) {\n\t\t\tthis.$emit('switchSelectedNode', node);\n\t\t},\n\t\tgetInitialLeftPosition(width: number) {\n\t\t\tif (this.currentNodePaneType === 'dragless')\n\t\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 1 + this.fixedPanelWidth);\n\n\t\t\treturn this.hasInputSlot ? 0.5 - width / 2 : this.minimumLeftPosition;\n\t\t},\n\t\tsetMainPanelWidth(relativeWidth?: number) {\n\t\t\tconst mainPanelRelativeWidth =\n\t\t\t\trelativeWidth || this.pxToRelativeWidth(initialMainPanelWidth[this.currentNodePaneType]);\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeWidth: mainPanelRelativeWidth,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositions(relativeLeft: number) {\n\t\t\tconst mainPanelRelativeLeft =\n\t\t\t\trelativeLeft || 1 - this.calculatedPositions.inputPanelRelativeRight;\n\t\t\tconst mainPanelRelativeRight =\n\t\t\t\t1 - mainPanelRelativeLeft - this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst isMaxRight = this.maximumRightPosition > mainPanelRelativeRight;\n\t\t\tconst isMinLeft = this.minimumLeftPosition > mainPanelRelativeLeft;\n\t\t\tconst isInputless = this.currentNodePaneType === 'inputless';\n\n\t\t\tif (isMinLeft) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: this.minimumLeftPosition,\n\t\t\t\t\t\trelativeRight: 1 - this.mainPanelDimensions.relativeWidth - this.minimumLeftPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isMaxRight) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: 1 - this.mainPanelDimensions.relativeWidth - this.maximumRightPosition,\n\t\t\t\t\t\trelativeRight: this.maximumRightPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeLeft: isInputless ? this.minimumLeftPosition : mainPanelRelativeLeft,\n\t\t\t\t\trelativeRight: mainPanelRelativeRight,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositionByName(position: 'minLeft' | 'maxRight' | 'initial') {\n\t\t\tconst positionByName: Record<string, number> = {\n\t\t\t\tminLeft: this.minimumLeftPosition,\n\t\t\t\tmaxRight: this.maximumRightPosition,\n\t\t\t\tinitial: this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth),\n\t\t\t};\n\n\t\t\tthis.setPositions(positionByName[position]);\n\t\t},\n\t\tpxToRelativeWidth(px: number) {\n\t\t\treturn px / this.windowWidth;\n\t\t},\n\t\trelativeWidthToPx(relativeWidth: number) {\n\t\t\treturn relativeWidth * this.windowWidth;\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.setTotalWidth();\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tonResizeDebounced(data: { direction: string; x: number; width: number }) {\n\t\t\tif (this.initialized) {\n\t\t\t\tvoid this.callDebounced('onResize', { debounceTime: 10, trailing: true }, data);\n\t\t\t}\n\t\t},\n\t\tonResize({ direction, x, width }: { direction: string; x: number; width: number }) {\n\t\t\tconst relativeDistance = this.pxToRelativeWidth(x);\n\t\t\tconst relativeWidth = this.pxToRelativeWidth(width);\n\n\t\t\tif (direction === 'left' && relativeDistance <= this.minimumLeftPosition) return;\n\t\t\tif (direction === 'right' && 1 - relativeDistance <= this.maximumRightPosition) return;\n\t\t\tif (width <= MIN_PANEL_WIDTH) return;\n\n\t\t\tthis.setMainPanelWidth(relativeWidth);\n\t\t\tthis.setPositions(\n\t\t\t\tdirection === 'left' ? relativeDistance : this.mainPanelDimensions.relativeLeft,\n\t\t\t);\n\t\t},\n\t\trestorePositionData() {\n\t\t\tconst storedPanelWidthData = useStorage(\n\t\t\t\t`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`,\n\t\t\t).value;\n\n\t\t\tif (storedPanelWidthData) {\n\t\t\t\tconst parsedWidth = parseFloat(storedPanelWidthData);\n\t\t\t\tthis.setMainPanelWidth(parsedWidth);\n\t\t\t\tconst initialPosition = this.getInitialLeftPosition(parsedWidth);\n\n\t\t\t\tthis.setPositions(initialPosition);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tstorePositionData() {\n\t\t\tuseStorage(`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`).value =\n\t\t\t\tthis.mainPanelDimensions.relativeWidth.toString();\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.$emit('dragstart', { position: this.mainPanelDimensions.relativeLeft });\n\t\t},\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tconst relativeLeft = this.pxToRelativeWidth(e.x) - this.mainPanelDimensions.relativeWidth / 2;\n\n\t\t\tthis.setPositions(relativeLeft);\n\t\t},\n\t\tonDragEnd() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.$emit('dragend', {\n\t\t\t\t\twindowWidth: this.windowWidth,\n\t\t\t\t\tposition: this.mainPanelDimensions.relativeLeft,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tsetTotalWidth() {\n\t\t\tthis.windowWidth = window.innerWidth;\n\t\t},\n\t\tclose() {\n\t\t\tthis.$emit('close');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dataPanel {\n\tposition: absolute;\n\theight: calc(100% - 2 * var(--spacing-l));\n\tposition: absolute;\n\ttop: var(--spacing-l);\n\tz-index: 0;\n\tmin-width: 280px;\n}\n\n.inputPanel {\n\tcomposes: dataPanel;\n\tleft: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: var(--border-radius-large) 0 0 var(--border-radius-large);\n\t}\n}\n\n.outputPanel {\n\tcomposes: dataPanel;\n\tright: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: 0 var(--border-radius-large) var(--border-radius-large) 0;\n\t}\n}\n\n.mainPanel {\n\tposition: absolute;\n\theight: 100%;\n\n\t&:hover {\n\t\t.draggable {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.mainPanelInner {\n\theight: 100%;\n\tborder: var(--border-base);\n\tborder-radius: var(--border-radius-large);\n\tbox-shadow: 0 4px 16px rgb(50 61 85 / 10%);\n\toverflow: hidden;\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.draggable {\n\tvisibility: hidden;\n}\n\n.double-width {\n\tleft: 90%;\n}\n\n.dragButtonContainer {\n\tposition: absolute;\n\ttop: -12px;\n\twidth: 100%;\n\theight: 12px;\n\tdisplay: flex;\n\tjustify-content: center;\n\tpointer-events: none;\n\n\t.draggable {\n\t\tpointer-events: all;\n\t}\n\t&:hover .draggable {\n\t\tvisibility: visible;\n\t}\n}\n\n.visible {\n\tvisibility: visible;\n}\n</style>\n","<template>\n\t<iframe class=\"__html-display\" :srcdoc=\"sanitizedHtml\" />\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport sanitizeHtml, { defaults, type IOptions as SanitizeOptions } from 'sanitize-html';\n\nconst sanitizeOptions: SanitizeOptions = {\n\tallowVulnerableTags: false,\n\tenforceHtmlBoundary: false,\n\tdisallowedTagsMode: 'discard',\n\tallowedTags: [...defaults.allowedTags, 'style', 'img', 'title'],\n\tallowedAttributes: {\n\t\t...defaults.allowedAttributes,\n\t\t'*': ['class', 'style'],\n\t},\n\ttransformTags: {\n\t\thead: '',\n\t},\n};\n\nexport default {\n\tname: 'RunDataHtml',\n\tprops: {\n\t\tinputHtml: {\n\t\t\ttype: String as PropType<string>,\n\t\t},\n\t},\n\tcomputed: {\n\t\tsanitizedHtml() {\n\t\t\treturn sanitizeHtml(this.inputHtml, sanitizeOptions);\n\t\t},\n\t},\n};\n</script>\n\n<style lang=\"scss\">\n.__html-display {\n\twidth: 100%;\n\theight: 100%;\n}\n</style>\n","<template>\n\t<span>\n\t\t<div v-if=\"isLoading\">Loading binary data...</div>\n\t\t<div v-else-if=\"error\">Error loading binary data</div>\n\t\t<span v-else>\n\t\t\t<video v-if=\"binaryData.fileType === 'video'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</video>\n\t\t\t<audio v-else-if=\"binaryData.fileType === 'audio'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</audio>\n\t\t\t<vue-json-pretty\n\t\t\t\tv-else-if=\"binaryData.fileType === 'json'\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t:deep=\"3\"\n\t\t\t\t:showLength=\"true\"\n\t\t\t/>\n\t\t\t<run-data-html v-else-if=\"binaryData.fileType === 'html'\" :inputHtml=\"data\" />\n\t\t\t<embed v-else :src=\"embedSource\" class=\"binary-data\" :class=\"embedClass()\" />\n\t\t</span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData } from 'n8n-workflow';\nimport { jsonParse } from 'n8n-workflow';\nimport type { PropType } from 'vue';\nimport VueJsonPretty from 'vue-json-pretty';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport RunDataHtml from '@/components/RunDataHtml.vue';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplayEmbed',\n\tcomponents: {\n\t\tVueJsonPretty,\n\t\tRunDataHtml,\n\t},\n\tprops: {\n\t\tbinaryData: {\n\t\t\ttype: Object as PropType<IBinaryData>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisLoading: true,\n\t\t\tembedSource: '',\n\t\t\terror: false,\n\t\t\tdata: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t},\n\tasync mounted() {\n\t\tconst { id, data, fileName, fileType, mimeType } = this.binaryData;\n\t\tconst isJSONData = fileType === 'json';\n\t\tconst isHTMLData = fileType === 'html';\n\n\t\tif (!id) {\n\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\tthis.data = jsonParse(atob(data));\n\t\t\t} else {\n\t\t\t\tthis.embedSource = 'data:' + mimeType + ';base64,' + data;\n\t\t\t}\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst binaryUrl = this.workflowsStore.getBinaryUrl(id, 'view', fileName, mimeType);\n\t\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\t\tconst fetchedData = await fetch(binaryUrl, { credentials: 'include' });\n\t\t\t\t\tthis.data = await (isJSONData ? fetchedData.json() : fetchedData.text());\n\t\t\t\t} else {\n\t\t\t\t\tthis.embedSource = binaryUrl;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tthis.error = true;\n\t\t\t}\n\t\t}\n\n\t\tthis.isLoading = false;\n\t},\n\tmethods: {\n\t\tembedClass(): string[] {\n\t\t\tconst { fileType } = this.binaryData;\n\t\t\treturn [fileType ?? 'other'];\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data {\n\tbackground-color: var(--color-foreground-xlight);\n\n\t&.image {\n\t\tmax-height: calc(100% - 1em);\n\t\tmax-width: calc(100% - 1em);\n\t}\n\n\t&.other,\n\t&.pdf {\n\t\theight: calc(100% - 1em);\n\t\twidth: calc(100% - 1em);\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"windowVisible\" :class=\"['binary-data-window', binaryData?.fileType]\">\n\t\t<n8n-button\n\t\t\t@click.stop=\"closeWindow\"\n\t\t\tsize=\"small\"\n\t\t\tclass=\"binary-data-window-back\"\n\t\t\t:title=\"$locale.baseText('binaryDataDisplay.backToOverviewPage')\"\n\t\t\ticon=\"arrow-left\"\n\t\t\t:label=\"$locale.baseText('binaryDataDisplay.backToList')\"\n\t\t/>\n\n\t\t<div class=\"binary-data-window-wrapper\">\n\t\t\t<div v-if=\"!binaryData\">\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.noDataFoundToDisplay') }}\n\t\t\t</div>\n\t\t\t<BinaryDataDisplayEmbed v-else :binaryData=\"binaryData\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData, IRunData } from 'n8n-workflow';\n\nimport BinaryDataDisplayEmbed from '@/components/BinaryDataDisplayEmbed.vue';\n\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplay',\n\n\tcomponents: {\n\t\tBinaryDataDisplayEmbed,\n\t},\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn {\n\t\t\tnodeHelpers,\n\t\t};\n\t},\n\tprops: [\n\t\t'displayData', // IBinaryData\n\t\t'windowVisible', // boolean\n\t],\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t\tbinaryData(): IBinaryData | null {\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.displayData.node,\n\t\t\t\tthis.displayData.runIndex,\n\t\t\t\tthis.displayData.outputIndex,\n\t\t\t);\n\n\t\t\tif (binaryData.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.displayData.index >= binaryData.length ||\n\t\t\t\tbinaryData[this.displayData.index][this.displayData.key] === undefined\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst binaryDataItem: IBinaryData = binaryData[this.displayData.index][this.displayData.key];\n\n\t\t\treturn binaryDataItem;\n\t\t},\n\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution;\n\t\t\tif (workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData = workflowExecution.data;\n\t\t\treturn executionData ? executionData.resultData.runData : null;\n\t\t},\n\t},\n\tmethods: {\n\t\tcloseWindow() {\n\t\t\t// Handle the close externally as the visible parameter is an external prop\n\t\t\t// and is so not allowed to be changed here.\n\t\t\tthis.$emit('close');\n\t\t\treturn false;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data-window {\n\tposition: absolute;\n\ttop: 50px;\n\tleft: 0;\n\tz-index: 10;\n\twidth: 100%;\n\theight: calc(100% - 50px);\n\tbackground-color: var(--color-background-base);\n\toverflow: hidden;\n\ttext-align: center;\n\n\t&.json {\n\t\toverflow: auto;\n\t}\n\n\t.binary-data-window-wrapper {\n\t\tmargin-top: 0.5em;\n\t\tpadding: 0 1em;\n\t\theight: calc(100% - 50px);\n\n\t\t.el-row,\n\t\t.el-col {\n\t\t\theight: 100%;\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<div class=\"error-header\">\n\t\t\t<div class=\"error-message\" v-text=\"getErrorMessage()\" />\n\t\t\t<div class=\"error-description\" v-if=\"error.description\" v-html=\"getErrorDescription()\"></div>\n\t\t</div>\n\t\t<details>\n\t\t\t<summary class=\"error-details__summary\">\n\t\t\t\t<font-awesome-icon class=\"error-details__icon\" icon=\"angle-right\" />\n\t\t\t\t{{ $locale.baseText('nodeErrorView.details') }}\n\t\t\t</summary>\n\t\t\t<div class=\"error-details__content\">\n\t\t\t\t<div v-if=\"error.context && error.context.causeDetailed\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ error.context.causeDetailed }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"error.timestamp\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<template #header>\n\t\t\t\t\t\t\t<div class=\"clearfix box-card__title\">\n\t\t\t\t\t\t\t\t<span>{{ $locale.baseText('nodeErrorView.time') }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ new Date(error.timestamp).toLocaleString() }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"error.context && error.context.itemIndex !== undefined\"\n\t\t\t\t\tclass=\"el-card box-card is-never-shadow el-card__body\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"error-details__summary\"\n\t\t\t\t\t\t>{{ $locale.baseText('nodeErrorView.itemIndex') }}:</span\n\t\t\t\t\t>\n\t\t\t\t\t{{ error.context.itemIndex }}\n\t\t\t\t\t<span v-if=\"error.context.runIndex\">\n\t\t\t\t\t\t|\n\t\t\t\t\t\t<span class=\"error-details__summary\"\n\t\t\t\t\t\t\t>{{ $locale.baseText('nodeErrorView.itemIndex') }}:</span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t{{ error.context.runIndex }}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-if=\"error.context.parameter\">\n\t\t\t\t\t\t|\n\t\t\t\t\t\t<span class=\"error-details__summary\"\n\t\t\t\t\t\t\t>{{ $locale.baseText('nodeErrorView.inParameter') }}:</span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t{{ parameterDisplayName(error.context.parameter) }}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"error.httpCode\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<template #header>\n\t\t\t\t\t\t\t<div class=\"clearfix box-card__title\">\n\t\t\t\t\t\t\t\t<span>{{ $locale.baseText('nodeErrorView.httpCode') }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ error.httpCode }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"error.cause\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<template #header>\n\t\t\t\t\t\t\t<div class=\"clearfix box-card__title\">\n\t\t\t\t\t\t\t\t<span>{{ $locale.baseText('nodeErrorView.cause') }}</span>\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t<span class=\"box-card__subtitle\">{{\n\t\t\t\t\t\t\t\t\t$locale.baseText('nodeErrorView.dataBelowMayContain')\n\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<div class=\"copy-button\" v-if=\"displayCause\">\n\t\t\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\t\t\t@click=\"copyCause\"\n\t\t\t\t\t\t\t\t\t:title=\"$locale.baseText('nodeErrorView.copyToClipboard')\"\n\t\t\t\t\t\t\t\t\ticon=\"copy\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<vue-json-pretty\n\t\t\t\t\t\t\t\tv-if=\"displayCause\"\n\t\t\t\t\t\t\t\t:data=\"error.cause\"\n\t\t\t\t\t\t\t\t:deep=\"3\"\n\t\t\t\t\t\t\t\t:showLength=\"true\"\n\t\t\t\t\t\t\t\tselectableType=\"single\"\n\t\t\t\t\t\t\t\tpath=\"error\"\n\t\t\t\t\t\t\t\tclass=\"json-data\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span v-else>\n\t\t\t\t\t\t\t\t<font-awesome-icon icon=\"info-circle\" />{{\n\t\t\t\t\t\t\t\t\t$locale.baseText('nodeErrorView.theErrorCauseIsTooLargeToBeDisplayed')\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"error.stack\">\n\t\t\t\t\t<el-card class=\"box-card\" shadow=\"never\">\n\t\t\t\t\t\t<template #header>\n\t\t\t\t\t\t\t<div class=\"clearfix box-card__title\">\n\t\t\t\t\t\t\t\t<span>{{ $locale.baseText('nodeErrorView.stack') }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<pre><code>{{error.stack}}</code></pre>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</el-card>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</details>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport VueJsonPretty from 'vue-json-pretty';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { useToast } from '@/composables/useToast';\nimport { MAX_DISPLAY_DATA_SIZE } from '@/constants';\n\nimport type {\n\tINodeProperties,\n\tINodePropertyCollection,\n\tINodePropertyOptions,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { sanitizeHtml } from '@/utils/htmlUtils';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\nexport default defineComponent({\n\tname: 'NodeErrorView',\n\tmixins: [copyPaste],\n\tprops: ['error'],\n\tcomponents: {\n\t\tVueJsonPretty,\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore),\n\t\tdisplayCause(): boolean {\n\t\t\treturn JSON.stringify(this.error.cause).length < MAX_DISPLAY_DATA_SIZE;\n\t\t},\n\t\tparameters(): INodeProperties[] {\n\t\t\tconst node = this.ndvStore.activeNode;\n\t\t\tif (!node) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\tif (nodeType === null) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn nodeType.properties;\n\t\t},\n\t},\n\tmethods: {\n\t\treplacePlaceholders(parameter: string, message: string): string {\n\t\t\tconst parameterName = this.parameterDisplayName(parameter, false);\n\t\t\tconst parameterFullName = this.parameterDisplayName(parameter, true);\n\t\t\treturn message\n\t\t\t\t.replace(/%%PARAMETER%%/g, parameterName)\n\t\t\t\t.replace(/%%PARAMETER_FULL%%/g, parameterFullName);\n\t\t},\n\t\tgetErrorDescription(): string {\n\t\t\tconst isSubNodeError =\n\t\t\t\tthis.error.name === 'NodeOperationError' &&\n\t\t\t\t(this.error as NodeOperationError).functionality === 'configuration-node';\n\n\t\t\tif (isSubNodeError) {\n\t\t\t\treturn sanitizeHtml(\n\t\t\t\t\tthis.error.description +\n\t\t\t\t\t\tthis.$locale.baseText('pushConnection.executionError.openNode', {\n\t\t\t\t\t\t\tinterpolate: { node: this.error.node.name },\n\t\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!this.error.context?.descriptionTemplate) {\n\t\t\t\treturn sanitizeHtml(this.error.description);\n\t\t\t}\n\n\t\t\tconst parameterName = this.parameterDisplayName(this.error.context.parameter);\n\t\t\treturn sanitizeHtml(\n\t\t\t\tthis.error.context.descriptionTemplate.replace(/%%PARAMETER%%/g, parameterName),\n\t\t\t);\n\t\t},\n\t\tgetErrorMessage(): string {\n\t\t\tconst baseErrorMessage = this.$locale.baseText('nodeErrorView.error') + ': ';\n\n\t\t\tconst isSubNodeError =\n\t\t\t\tthis.error.name === 'NodeOperationError' &&\n\t\t\t\t(this.error as NodeOperationError).functionality === 'configuration-node';\n\n\t\t\tif (isSubNodeError) {\n\t\t\t\tconst baseErrorMessageSubNode = this.$locale.baseText('nodeErrorView.errorSubNode', {\n\t\t\t\t\tinterpolate: { node: this.error.node.name },\n\t\t\t\t});\n\t\t\t\treturn baseErrorMessageSubNode;\n\t\t\t}\n\n\t\t\tif (this.error.message === this.error.description) {\n\t\t\t\treturn baseErrorMessage;\n\t\t\t}\n\t\t\tif (!this.error.context?.messageTemplate) {\n\t\t\t\treturn baseErrorMessage + this.error.message;\n\t\t\t}\n\n\t\t\tconst parameterName = this.parameterDisplayName(this.error.context.parameter);\n\n\t\t\treturn (\n\t\t\t\tbaseErrorMessage +\n\t\t\t\tthis.error.context.messageTemplate.replace(/%%PARAMETER%%/g, parameterName)\n\t\t\t);\n\t\t},\n\t\tparameterDisplayName(path: string, fullPath = true) {\n\t\t\ttry {\n\t\t\t\tconst parameters = this.parameterName(this.parameters, path.split('.'));\n\t\t\t\tif (!parameters.length) {\n\t\t\t\t\tthrow new Error();\n\t\t\t\t}\n\n\t\t\t\tif (!fullPath) {\n\t\t\t\t\treturn parameters.pop()!.displayName;\n\t\t\t\t}\n\t\t\t\treturn parameters.map((parameter) => parameter.displayName).join(' > ');\n\t\t\t} catch (error) {\n\t\t\t\treturn `Could not find parameter \"${path}\"`;\n\t\t\t}\n\t\t},\n\t\tparameterName(\n\t\t\tparameters: Array<INodePropertyOptions | INodeProperties | INodePropertyCollection>,\n\t\t\tpathParts: string[],\n\t\t): Array<INodeProperties | INodePropertyCollection> {\n\t\t\tlet currentParameterName = pathParts.shift();\n\n\t\t\tif (currentParameterName === undefined) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst arrayMatch = currentParameterName.match(/(.*)\\[([\\d])\\]$/);\n\t\t\tif (arrayMatch !== null && arrayMatch.length > 0) {\n\t\t\t\tcurrentParameterName = arrayMatch[1];\n\t\t\t}\n\t\t\tconst currentParameter = parameters.find(\n\t\t\t\t(parameter) => parameter.name === currentParameterName,\n\t\t\t) as unknown as INodeProperties | INodePropertyCollection;\n\n\t\t\tif (currentParameter === undefined) {\n\t\t\t\tthrow new Error(`Could not find parameter \"${currentParameterName}\"`);\n\t\t\t}\n\n\t\t\tif (pathParts.length === 0) {\n\t\t\t\treturn [currentParameter];\n\t\t\t}\n\n\t\t\tif (currentParameter.hasOwnProperty('options')) {\n\t\t\t\treturn [\n\t\t\t\t\tcurrentParameter,\n\t\t\t\t\t...this.parameterName((currentParameter as INodeProperties).options!, pathParts),\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tif (currentParameter.hasOwnProperty('values')) {\n\t\t\t\treturn [\n\t\t\t\t\tcurrentParameter,\n\t\t\t\t\t...this.parameterName((currentParameter as INodePropertyCollection).values, pathParts),\n\t\t\t\t];\n\t\t\t}\n\n\t\t\t// We can not resolve any deeper so lets stop here and at least return hopefully something useful\n\t\t\treturn [currentParameter];\n\t\t},\n\t\tcopyCause() {\n\t\t\tthis.copyToClipboard(JSON.stringify(this.error.cause));\n\t\t\tthis.copySuccess();\n\t\t},\n\t\tcopySuccess() {\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('nodeErrorView.showMessage.title'),\n\t\t\t\ttype: 'info',\n\t\t\t});\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.error-header {\n\tmargin-bottom: 10px;\n}\n\n.error-message {\n\tcolor: var(--color-ndv-ouptut-error-font);\n\tfont-weight: bold;\n\tfont-size: 1.1rem;\n}\n\n.error-description {\n\tmargin-top: 10px;\n\tfont-size: 1rem;\n}\n\n.error-details__summary {\n\tfont-weight: 600;\n\tfont-size: 16px;\n\tcursor: pointer;\n\toutline: none;\n}\n\n.error-details__icon {\n\tmargin-right: 4px;\n}\n\ndetails > summary {\n\tlist-style-type: none;\n}\n\ndetails > summary::-webkit-details-marker {\n\tdisplay: none;\n}\n\ndetails[open] {\n\t.error-details__icon {\n\t\ttransform: rotate(90deg);\n\t}\n}\n\n.error-details__content {\n\tmargin-top: 15px;\n}\n\n.el-divider__text {\n\tbackground-color: var(--color-background-light);\n}\n\n.box-card {\n\tmargin-top: 1em;\n\toverflow: auto;\n}\n\n.box-card__title {\n\tfont-weight: 400;\n}\n\n.box-card__subtitle {\n\tfont-weight: 200;\n\tfont-style: italic;\n\tfont-size: 0.7rem;\n}\n\n.copy-button {\n\tposition: absolute;\n\tright: 50px;\n\tz-index: 1000;\n}\n</style>\n","<template>\n\t<div :class=\"['run-data', $style.container]\" @mouseover=\"activatePane\">\n\t\t<n8n-callout\n\t\t\tv-if=\"canPinData && hasPinData && !editMode.enabled && !isProductionExecutionPreview\"\n\t\t\ttheme=\"secondary\"\n\t\t\ticon=\"thumbtack\"\n\t\t\t:class=\"$style.pinnedDataCallout\"\n\t\t>\n\t\t\t{{ $locale.baseText('runData.pindata.thisDataIsPinned') }}\n\t\t\t<span class=\"ml-4xs\" v-if=\"!isReadOnlyRoute && !readOnlyEnv\">\n\t\t\t\t<n8n-link\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tunderline\n\t\t\t\t\tbold\n\t\t\t\t\t@click.stop=\"onTogglePinData({ source: 'banner-link' })\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.unpin') }}\n\t\t\t\t</n8n-link>\n\t\t\t</span>\n\t\t\t<template #trailingContent>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"dataPinningDocsUrl\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tbold\n\t\t\t\t\tunderline\n\t\t\t\t\t@click=\"onClickDataPinningDocsLink\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.learnMore') }}\n\t\t\t\t</n8n-link>\n\t\t\t</template>\n\t\t</n8n-callout>\n\n\t\t<BinaryDataDisplay\n\t\t\t:windowVisible=\"binaryDataDisplayVisible\"\n\t\t\t:displayData=\"binaryDataDisplayData\"\n\t\t\t@close=\"closeBinaryDataDisplay\"\n\t\t/>\n\n\t\t<div :class=\"$style.header\">\n\t\t\t<slot name=\"header\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-show=\"!hasRunError\"\n\t\t\t\t@click.stop\n\t\t\t\t:class=\"$style.displayModes\"\n\t\t\t\tdata-test-id=\"run-data-pane-header\"\n\t\t\t>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-show=\"\n\t\t\t\t\t\thasNodeRun && (inputData.length || binaryData.length || search) && !editMode.enabled\n\t\t\t\t\t\"\n\t\t\t\t\t:modelValue=\"displayMode\"\n\t\t\t\t\t:options=\"buttons\"\n\t\t\t\t\tdata-test-id=\"ndv-run-data-display-mode\"\n\t\t\t\t\t@update:modelValue=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"canPinData && !isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t\t\t:title=\"$locale.baseText('runData.editOutput')\"\n\t\t\t\t\t:circle=\"false\"\n\t\t\t\t\t:disabled=\"node.disabled\"\n\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\ticon=\"pencil-alt\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tdata-test-id=\"ndv-edit-pinned-data\"\n\t\t\t\t\t@click=\"enterEditMode({ origin: 'editIconButton' })\"\n\t\t\t\t/>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tplacement=\"bottom-end\"\n\t\t\t\t\tv-if=\"canPinData && rawInputData.length\"\n\t\t\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t\t\t:visible=\"\n\t\t\t\t\t\tisControlledPinDataTooltip\n\t\t\t\t\t\t\t? isControlledPinDataTooltip && pinDataDiscoveryTooltipVisible\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t<template #content v-if=\"!isControlledPinDataTooltip\">\n\t\t\t\t\t\t<div :class=\"$style.tooltipContainer\">\n\t\t\t\t\t\t\t<strong>{{ $locale.baseText('ndv.pinData.pin.title') }}</strong>\n\t\t\t\t\t\t\t<n8n-text size=\"small\" tag=\"p\">\n\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.pinData.pin.description') }}\n\n\t\t\t\t\t\t\t\t<n8n-link :to=\"dataPinningDocsUrl\" size=\"small\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.pinData.pin.link') }}\n\t\t\t\t\t\t\t\t</n8n-link>\n\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template #content v-else>\n\t\t\t\t\t\t<div :class=\"$style.tooltipContainer\">\n\t\t\t\t\t\t\t{{ $locale.baseText('node.discovery.pinData.ndv') }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t:class=\"['ml-2xs', $style.pinDataButton]\"\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:active=\"hasPinData\"\n\t\t\t\t\t\ticon=\"thumbtack\"\n\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\teditMode.enabled ||\n\t\t\t\t\t\t\t(rawInputData.length === 0 && !hasPinData) ||\n\t\t\t\t\t\t\tisReadOnlyRoute ||\n\t\t\t\t\t\t\treadOnlyEnv\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t@click=\"onTogglePinData({ source: 'pin-icon-click' })\"\n\t\t\t\t\t\tdata-test-id=\"ndv-pin-data\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\n\t\t\t\t<div :class=\"$style.editModeActions\" v-show=\"editMode.enabled\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.cancel')\"\n\t\t\t\t\t\t@click=\"onClickCancelEdit\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.save')\"\n\t\t\t\t\t\t@click=\"onClickSaveEdit\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"$style.runSelector\"\n\t\t\tv-if=\"maxRunIndex > 0\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\tdata-test-id=\"run-selector\"\n\t\t>\n\t\t\t<div :class=\"$style.runSelectorWrapper\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:modelValue=\"runIndex\"\n\t\t\t\t\t@update:modelValue=\"onRunIndexChange\"\n\t\t\t\t\t@click.stop\n\t\t\t\t\tteleported\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.run') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"option in maxRunIndex + 1\"\n\t\t\t\t\t\t:label=\"getRunLabel(option)\"\n\t\t\t\t\t\t:value=\"option - 1\"\n\t\t\t\t\t\t:key=\"option\"\n\t\t\t\t\t></n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<n8n-tooltip placement=\"right\" v-if=\"canLinkRuns\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ $locale.baseText(linkedRuns ? 'runData.unlinking.hint' : 'runData.linking.hint') }}\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\tclass=\"linkRun\"\n\t\t\t\t\t\t:icon=\"linkedRuns ? 'unlink' : 'link'\"\n\t\t\t\t\t\ttext\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click=\"toggleLinkRuns\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<slot name=\"run-info\"></slot>\n\t\t\t</div>\n\t\t\t<run-data-search\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t:isAreaActive=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\t\t<slot name=\"before-data\" />\n\n\t\t<div\n\t\t\tv-if=\"maxOutputIndex > 0 && branches.length > 1\"\n\t\t\t:class=\"$style.tabs\"\n\t\t\tdata-test-id=\"branches\"\n\t\t>\n\t\t\t<n8n-tabs\n\t\t\t\t:modelValue=\"currentOutputIndex\"\n\t\t\t\t:options=\"branches\"\n\t\t\t\t@update:modelValue=\"onBranchChange\"\n\t\t\t/>\n\t\t\t<run-data-search\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t:isAreaActive=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-else-if=\"\n\t\t\t\thasNodeRun &&\n\t\t\t\t((dataCount > 0 && maxRunIndex === 0) || search) &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t:class=\"$style.itemsCount\"\n\t\t\tdata-test-id=\"ndv-items-count\"\n\t\t>\n\t\t\t<n8n-text v-if=\"search\">\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\tadjustToNumber: unfilteredDataCount,\n\t\t\t\t\t\tinterpolate: { matched: dataCount, total: unfilteredDataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<n8n-text v-else>\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\tadjustToNumber: dataCount,\n\t\t\t\t\t\tinterpolate: { count: dataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<run-data-search\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t:isAreaActive=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div :class=\"$style.dataContainer\" ref=\"dataContainer\" data-test-id=\"ndv-data-container\">\n\t\t\t<div v-if=\"isExecuting\" :class=\"$style.center\" data-test-id=\"ndv-executing\">\n\t\t\t\t<div :class=\"$style.spinner\"><n8n-spinner type=\"ring\" /></div>\n\t\t\t\t<n8n-text>{{ executingMessage }}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"editMode.enabled\" :class=\"$style.editMode\">\n\t\t\t\t<div :class=\"[$style.editModeBody, 'ignore-key-press']\">\n\t\t\t\t\t<code-node-editor\n\t\t\t\t\t\t:modelValue=\"editMode.value\"\n\t\t\t\t\t\tlanguage=\"json\"\n\t\t\t\t\t\t@update:modelValue=\"ndvStore.setOutputPanelEditModeValue($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.editModeFooter\">\n\t\t\t\t\t<n8n-info-tip :bold=\"false\" :class=\"$style.editModeFooterInfotip\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.editor.copyDataInfo') }}\n\t\t\t\t\t\t<n8n-link :to=\"dataEditingDocsUrl\" size=\"small\">\n\t\t\t\t\t\t\t{{ $locale.baseText('generic.learnMore') }}\n\t\t\t\t\t\t</n8n-link>\n\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"paneType === 'output' && hasSubworkflowExecutionError\"\n\t\t\t\t:class=\"$style.stretchVertically\"\n\t\t\t>\n\t\t\t\t<NodeErrorView :error=\"subworkflowExecutionError\" :class=\"$style.errorDisplay\" />\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"!hasNodeRun\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"node-not-run\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"paneType === 'input' && node.disabled\" :class=\"$style.center\">\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled', { interpolate: { nodeName: node.name } }) }}\n\t\t\t\t\t<n8n-link @click=\"enableNode\">\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled.cta') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && isArtificialRecoveredEventItem\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"recovered-artificial-output-data\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && hasRunError\" :class=\"$style.stretchVertically\">\n\t\t\t\t<n8n-text v-if=\"isPaneTypeInput\" :class=\"$style.center\" size=\"large\" tag=\"p\" bold>\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeErrorView.inputPanel.previousNodeError.title', {\n\t\t\t\t\t\t\tinterpolate: { nodeName: node.name },\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t</n8n-text>\n\t\t\t\t<slot name=\"content\" v-else-if=\"$slots['content']\"></slot>\n\t\t\t\t<NodeErrorView\n\t\t\t\t\tv-else\n\t\t\t\t\t:error=\"workflowRunData[node.name][runIndex].error\"\n\t\t\t\t\t:class=\"$style.dataDisplay\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun && (!unfilteredDataCount || (search && !dataCount)) && branches.length > 1\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<div v-if=\"search\">\n\t\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t\t<n8n-text v-else>\n\t\t\t\t\t{{ noDataInBranchMessage }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !inputData.length && !search\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"no-output-data\">xxx</slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !showData\" :class=\"$style.center\">\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{ tooMuchDataTitle }}</n8n-text>\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\"\n\t\t\t\t\t><span\n\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t$locale.baseText('ndv.output.tooMuchData.message', {\n\t\t\t\t\t\t\t\tinterpolate: { size: dataSizeInMB },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t></span\n\t\t\t\t></n8n-text>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\toutline\n\t\t\t\t\t:label=\"$locale.baseText('ndv.output.tooMuchData.showDataAnyway')\"\n\t\t\t\t\t@click=\"showTooMuchData\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t@click=\"downloadJsonData()\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<!-- V-else slot named content which only renders if $slots.content is passed and hasNodeRun -->\n\t\t\t<slot name=\"content\" v-else-if=\"hasNodeRun && $slots['content']\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun &&\n\t\t\t\t\tdisplayMode === 'table' &&\n\t\t\t\t\tbinaryData.length > 0 &&\n\t\t\t\t\tinputData.length === 1 &&\n\t\t\t\t\tObject.keys(jsonData[0] || {}).length === 0\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.info') }}\n\t\t\t\t\t<a @click=\"switchToBinary\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.binary') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"showIoSearchNoMatchContent\" :class=\"$style.center\">\n\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'table'\">\n\t\t\t\t<run-data-table\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:inputData=\"inputDataPage\"\n\t\t\t\t\t:mappingEnabled=\"mappingEnabled\"\n\t\t\t\t\t:distanceFromActive=\"distanceFromActive\"\n\t\t\t\t\t:runIndex=\"runIndex\"\n\t\t\t\t\t:pageOffset=\"currentPageOffset\"\n\t\t\t\t\t:totalRuns=\"maxRunIndex\"\n\t\t\t\t\t:hasDefaultHoverState=\"paneType === 'input' && !search\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t\t@mounted=\"$emit('tableMounted', $event)\"\n\t\t\t\t\t@activeRowChanged=\"onItemHover\"\n\t\t\t\t\t@displayModeChange=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'json'\">\n\t\t\t\t<run-data-json\n\t\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t\t:editMode=\"editMode\"\n\t\t\t\t\t:sessioId=\"sessionId\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:inputData=\"inputDataPage\"\n\t\t\t\t\t:mappingEnabled=\"mappingEnabled\"\n\t\t\t\t\t:distanceFromActive=\"distanceFromActive\"\n\t\t\t\t\t:runIndex=\"runIndex\"\n\t\t\t\t\t:totalRuns=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isPaneTypeOutput && displayMode === 'html'\">\n\t\t\t\t<run-data-html :inputHtml=\"inputDataPage[0].json.html\" />\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isSchemaView\">\n\t\t\t\t<run-data-schema\n\t\t\t\t\t:data=\"jsonData\"\n\t\t\t\t\t:mappingEnabled=\"mappingEnabled\"\n\t\t\t\t\t:distanceFromActive=\"distanceFromActive\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:paneType=\"paneType\"\n\t\t\t\t\t:runIndex=\"runIndex\"\n\t\t\t\t\t:totalRuns=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary' && binaryData.length === 0\" :class=\"$style.center\">\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('runData.noBinaryDataFound')\n\t\t\t\t}}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary'\" :class=\"$style.dataDisplay\">\n\t\t\t\t<div v-for=\"(binaryDataEntry, index) in binaryData\" :key=\"index\">\n\t\t\t\t\t<div :class=\"$style.binaryIndex\" v-if=\"binaryData.length > 1\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ index + 1 }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div :class=\"$style.binaryRow\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t:class=\"$style.binaryCell\"\n\t\t\t\t\t\t\tv-for=\"(binaryData, key) in binaryDataEntry\"\n\t\t\t\t\t\t\t:key=\"index + '_' + key\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div :data-test-id=\"'ndv-binary-data_' + index\">\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryHeader\">\n\t\t\t\t\t\t\t\t\t{{ key }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileName\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileName') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileName }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.directory\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.directory') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.directory }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileExtension\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileExtension') }}:</n8n-text\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileExtension }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.mimeType\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.mimeType') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.mimeType }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileSize\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileSize') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileSize }}</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryButtonContainer\">\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isViewable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.showBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-view-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"displayBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isDownloadable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-download-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"downloadBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\t:class=\"$style.pagination\"\n\t\t\tv-if=\"\n\t\t\t\thasNodeRun &&\n\t\t\t\t!hasRunError &&\n\t\t\t\tbinaryData.length === 0 &&\n\t\t\t\tdataCount > pageSize &&\n\t\t\t\t!isSchemaView &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\tdata-test-id=\"ndv-data-pagination\"\n\t\t>\n\t\t\t<el-pagination\n\t\t\t\tbackground\n\t\t\t\t:hide-on-single-page=\"true\"\n\t\t\t\t:current-page=\"currentPage\"\n\t\t\t\t:pager-count=\"5\"\n\t\t\t\t:page-size=\"pageSize\"\n\t\t\t\tlayout=\"prev, pager, next\"\n\t\t\t\t@update:current-page=\"onCurrentPageChange\"\n\t\t\t\t:total=\"dataCount\"\n\t\t\t>\n\t\t\t</el-pagination>\n\n\t\t\t<div :class=\"$style.pageSizeSelector\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t:modelValue=\"pageSize\"\n\t\t\t\t\t@update:modelValue=\"onPageSizeChange\"\n\t\t\t\t\tteleported\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.pageSize') }}</template>\n\t\t\t\t\t<n8n-option v-for=\"size in pageSizes\" :key=\"size\" :label=\"size\" :value=\"size\">\n\t\t\t\t\t</n8n-option>\n\t\t\t\t\t<n8n-option :label=\"$locale.baseText('ndv.output.all')\" :value=\"dataCount\"> </n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</div>\n\t\t<n8n-block-ui :show=\"blockUI\" :class=\"$style.uiBlocker\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport { saveAs } from 'file-saver';\nimport type {\n\tConnectionTypes,\n\tIBinaryData,\n\tIBinaryKeyData,\n\tIDataObject,\n\tINodeExecutionData,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n} from 'n8n-workflow';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\n\nimport type {\n\tIExecutionResponse,\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIRunDataDisplayMode,\n\tITab,\n\tNodePanelType,\n} from '@/Interface';\n\nimport {\n\tDATA_PINNING_DOCS_URL,\n\tDATA_EDITING_DOCS_URL,\n\tNODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMAX_DISPLAY_DATA_SIZE,\n\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\tTEST_PIN_DATA,\n\tHTML_NODE_TYPE,\n} from '@/constants';\n\nimport BinaryDataDisplay from '@/components/BinaryDataDisplay.vue';\nimport NodeErrorView from '@/components/Error/NodeErrorView.vue';\n\nimport { genericHelpers } from '@/mixins/genericHelpers';\nimport { pinData } from '@/mixins/pinData';\nimport type { PinDataSource } from '@/mixins/pinData';\nimport CodeNodeEditor from '@/components/CodeNodeEditor/CodeNodeEditor.vue';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { clearJsonKey, isEmpty } from '@/utils/typesUtils';\nimport { executionDataToJson } from '@/utils/nodeTypesUtils';\nimport { searchInObject } from '@/utils/objectUtils';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useToast } from '@/composables/useToast';\nimport { isObject } from 'lodash-es';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nconst RunDataTable = defineAsyncComponent(async () => import('@/components/RunDataTable.vue'));\nconst RunDataJson = defineAsyncComponent(async () => import('@/components/RunDataJson.vue'));\nconst RunDataSchema = defineAsyncComponent(async () => import('@/components/RunDataSchema.vue'));\nconst RunDataHtml = defineAsyncComponent(async () => import('@/components/RunDataHtml.vue'));\nconst RunDataSearch = defineAsyncComponent(async () => import('@/components/RunDataSearch.vue'));\n\nexport type EnterEditModeArgs = {\n\torigin: 'editIconButton' | 'insertTestDataLink';\n};\n\nexport default defineComponent({\n\tname: 'RunData',\n\tmixins: [genericHelpers, pinData],\n\tcomponents: {\n\t\tBinaryDataDisplay,\n\t\tNodeErrorView,\n\t\tCodeNodeEditor,\n\t\tRunDataTable,\n\t\tRunDataJson,\n\t\tRunDataSchema,\n\t\tRunDataHtml,\n\t\tRunDataSearch,\n\t},\n\tprops: {\n\t\tnodeUi: {\n\t\t\ttype: Object as PropType<INodeUi>,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttooMuchDataTitle: {\n\t\t\ttype: String,\n\t\t},\n\t\tnoDataInBranchMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tisExecuting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\texecutingMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tpaneType: {\n\t\t\ttype: String as PropType<NodePanelType>,\n\t\t},\n\t\toverrideOutputs: {\n\t\t\ttype: Array as PropType<number[]>,\n\t\t},\n\t\tmappingEnabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdistanceFromActive: {\n\t\t\ttype: Number,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tconnectionType: NodeConnectionType.Main,\n\t\t\tbinaryDataPreviewActive: false,\n\t\t\tdataSize: 0,\n\t\t\tshowData: false,\n\t\t\toutputIndex: 0,\n\t\t\tbinaryDataDisplayVisible: false,\n\t\t\tbinaryDataDisplayData: null as IBinaryData | null,\n\n\t\t\tMAX_DISPLAY_DATA_SIZE,\n\t\t\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\t\t\tcurrentPage: 1,\n\t\t\tpageSize: 10,\n\t\t\tpageSizes: [10, 25, 50, 100],\n\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tisControlledPinDataTooltip: false,\n\t\t\tsearch: '',\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.init();\n\n\t\tif (!this.isPaneTypeInput) {\n\t\t\tthis.showPinDataDiscoveryTooltip(this.jsonData);\n\t\t}\n\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\tbranchIndex: this.currentOutputIndex,\n\t\t});\n\n\t\tif (this.paneType === 'output') {\n\t\t\tthis.setDisplayMode();\n\t\t\tthis.activatePane();\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\tthis.hidePinDataDiscoveryTooltip();\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore),\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdataPinningDocsUrl(): string {\n\t\t\treturn DATA_PINNING_DOCS_URL;\n\t\t},\n\t\tdataEditingDocsUrl(): string {\n\t\t\treturn DATA_EDITING_DOCS_URL;\n\t\t},\n\t\tdisplayMode(): IRunDataDisplayMode {\n\t\t\treturn this.ndvStore.getPanelDisplayMode(this.paneType);\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\treturn (this.nodeUi as INodeUi | null) || null;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisSchemaView(): boolean {\n\t\t\treturn this.displayMode === 'schema';\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\t// Only \"main\" inputs can pin data\n\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, this.nodeType!);\n\t\t\tconst inputNames = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\tconst nonMainInputs = !!inputNames.find((inputName) => inputName !== NodeConnectionType.Main);\n\n\t\t\treturn (\n\t\t\t\t!nonMainInputs &&\n\t\t\t\t!this.isPaneTypeInput &&\n\t\t\t\tthis.isPinDataNodeType &&\n\t\t\t\t!(this.binaryData && this.binaryData.length > 0)\n\t\t\t);\n\t\t},\n\t\tbuttons(): Array<{ label: string; value: string }> {\n\t\t\tconst defaults = [\n\t\t\t\t{ label: this.$locale.baseText('runData.table'), value: 'table' },\n\t\t\t\t{ label: this.$locale.baseText('runData.json'), value: 'json' },\n\t\t\t];\n\n\t\t\tif (this.binaryData.length) {\n\t\t\t\tdefaults.push({ label: this.$locale.baseText('runData.binary'), value: 'binary' });\n\t\t\t}\n\n\t\t\tconst schemaView = { label: this.$locale.baseText('runData.schema'), value: 'schema' };\n\t\t\tif (this.isPaneTypeInput && !isEmpty(this.jsonData)) {\n\t\t\t\tdefaults.unshift(schemaView);\n\t\t\t} else {\n\t\t\t\tdefaults.push(schemaView);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.isPaneTypeOutput &&\n\t\t\t\tthis.activeNode?.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate'\n\t\t\t) {\n\t\t\t\tdefaults.unshift({ label: 'HTML', value: 'html' });\n\t\t\t}\n\n\t\t\treturn defaults;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\t!this.isExecuting &&\n\t\t\t\t\tthis.node &&\n\t\t\t\t\t((this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name)) ||\n\t\t\t\t\t\tthis.hasPinData),\n\t\t\t);\n\t\t},\n\t\tisArtificialRecoveredEventItem(): boolean {\n\t\t\treturn !!this.rawInputData?.[0]?.json?.isArtificialRecoveredEventItem;\n\t\t},\n\t\tsubworkflowExecutionError(): Error | null {\n\t\t\treturn this.workflowsStore.subWorkflowExecutionError;\n\t\t},\n\t\thasSubworkflowExecutionError(): boolean {\n\t\t\treturn Boolean(this.subworkflowExecutionError);\n\t\t},\n\t\thasRunError(): boolean {\n\t\t\treturn Boolean(this.node && this.workflowRunData?.[this.node.name]?.[this.runIndex]?.error);\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tdataCount(): number {\n\t\t\treturn this.getDataCount(this.runIndex, this.currentOutputIndex);\n\t\t},\n\t\tunfilteredDataCount(): number {\n\t\t\treturn this.pinData ? this.pinData.length : this.rawInputData.length;\n\t\t},\n\t\tdataSizeInMB(): string {\n\t\t\treturn (this.dataSize / 1024 / 1000).toLocaleString();\n\t\t},\n\t\tmaxOutputIndex(): number {\n\t\t\tif (this.node === null || this.runIndex === undefined) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length < this.runIndex) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name][this.runIndex]) {\n\t\t\t\tconst taskData = runData[this.node.name][this.runIndex].data;\n\t\t\t\tif (taskData?.main) {\n\t\t\t\t\treturn taskData.main.length - 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tcurrentPageOffset(): number {\n\t\t\treturn this.pageSize * (this.currentPage - 1);\n\t\t},\n\t\tmaxRunIndex(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\trawInputData(): INodeExecutionData[] {\n\t\t\treturn this.getRawInputData(this.runIndex, this.currentOutputIndex, this.connectionType);\n\t\t},\n\t\tinputData(): INodeExecutionData[] {\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(this.rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData);\n\t\t},\n\t\tinputDataPage(): INodeExecutionData[] {\n\t\t\tconst offset = this.pageSize * (this.currentPage - 1);\n\t\t\treturn this.inputData.slice(offset, offset + this.pageSize);\n\t\t},\n\t\tjsonData(): IDataObject[] {\n\t\t\treturn executionDataToJson(this.inputData);\n\t\t},\n\t\tbinaryData(): IBinaryKeyData[] {\n\t\t\tif (!this.node) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.node.name,\n\t\t\t\tthis.runIndex,\n\t\t\t\tthis.currentOutputIndex,\n\t\t\t);\n\t\t\treturn binaryData.filter((data) => Boolean(data && Object.keys(data).length));\n\t\t},\n\t\tcurrentOutputIndex(): number {\n\t\t\tif (this.overrideOutputs?.length && !this.overrideOutputs.includes(this.outputIndex)) {\n\t\t\t\treturn this.overrideOutputs[0];\n\t\t\t}\n\n\t\t\treturn this.outputIndex;\n\t\t},\n\t\tbranches(): ITab[] {\n\t\t\tconst capitalize = (name: string) => name.charAt(0).toLocaleUpperCase() + name.slice(1);\n\n\t\t\tconst branches: ITab[] = [];\n\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\tif (this.overrideOutputs && !this.overrideOutputs.includes(i)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst totalItemsCount = this.getRawInputData(this.runIndex, i).length;\n\t\t\t\tconst itemsCount = this.getDataCount(this.runIndex, i);\n\t\t\t\tconst items = this.search\n\t\t\t\t\t? this.$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\t\tadjustToNumber: totalItemsCount,\n\t\t\t\t\t\t\tinterpolate: { matched: itemsCount, total: totalItemsCount },\n\t\t\t\t\t })\n\t\t\t\t\t: this.$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t\t\t });\n\t\t\t\tlet outputName = this.getOutputName(i);\n\n\t\t\t\tif (`${outputName}` === `${i}`) {\n\t\t\t\t\toutputName = `${this.$locale.baseText('ndv.output')} ${outputName}`;\n\t\t\t\t} else {\n\t\t\t\t\tconst appendBranchWord = NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND.includes(\n\t\t\t\t\t\tthis.node?.type,\n\t\t\t\t\t)\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: ` ${this.$locale.baseText('ndv.output.branch')}`;\n\t\t\t\t\toutputName = capitalize(`${this.getOutputName(i)}${appendBranchWord}`);\n\t\t\t\t}\n\t\t\t\tbranches.push({\n\t\t\t\t\tlabel:\n\t\t\t\t\t\t(this.search && itemsCount) || totalItemsCount\n\t\t\t\t\t\t\t? `${outputName} (${items})`\n\t\t\t\t\t\t\t: outputName,\n\t\t\t\t\tvalue: i,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn branches;\n\t\t},\n\t\teditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.isPaneTypeInput\n\t\t\t\t? { enabled: false, value: '' }\n\t\t\t\t: this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisPaneTypeInput(): boolean {\n\t\t\treturn this.paneType === 'input';\n\t\t},\n\t\tisPaneTypeOutput(): boolean {\n\t\t\treturn this.paneType === 'output';\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tshowIOSearch(): boolean {\n\t\t\treturn this.hasNodeRun && !this.hasRunError;\n\t\t},\n\t\tshowIoSearchNoMatchContent(): boolean {\n\t\t\treturn this.hasNodeRun && !this.inputData.length && this.search;\n\t\t},\n\t},\n\tmethods: {\n\t\tgetResolvedNodeOutputs() {\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\n\t\t\t\tif (workflowNode) {\n\t\t\t\t\tconst outputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, this.nodeType);\n\t\t\t\t\treturn outputs;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [];\n\t\t},\n\t\tonItemHover(itemIndex: number | null) {\n\t\t\tif (itemIndex === null) {\n\t\t\t\tthis.$emit('itemHover', null);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.$emit('itemHover', {\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\titemIndex,\n\t\t\t});\n\t\t},\n\t\tonClickDataPinningDocsLink() {\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'data-pinning-docs',\n\t\t\t});\n\t\t},\n\t\tshowPinDataDiscoveryTooltip(value: IDataObject[]) {\n\t\t\tif (!this.isTriggerNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst pinDataDiscoveryFlag = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value;\n\n\t\t\tif (value && value.length > 0 && !this.isReadOnlyRoute && !pinDataDiscoveryFlag) {\n\t\t\t\tthis.pinDataDiscoveryComplete();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isControlledPinDataTooltip = true;\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: true });\n\t\t\t\t}, 500); // Wait for NDV to open\n\t\t\t}\n\t\t},\n\t\thidePinDataDiscoveryTooltip() {\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.isControlledPinDataTooltip = false;\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: false });\n\t\t\t}\n\t\t},\n\t\tpinDataDiscoveryComplete() {\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value = 'true';\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\t\t},\n\t\tenterEditMode({ origin }: EnterEditModeArgs) {\n\t\t\tconst inputData = this.pinData\n\t\t\t\t? clearJsonKey(this.pinData)\n\t\t\t\t: executionDataToJson(this.rawInputData);\n\n\t\t\tconst data = inputData.length > 0 ? inputData : TEST_PIN_DATA;\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(true);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue(JSON.stringify(data, null, 2));\n\n\t\t\tthis.$telemetry.track('User opened ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tclick_type: origin === 'editIconButton' ? 'button' : 'link',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tis_output_present: this.hasNodeRun || this.hasPinData,\n\t\t\t\tview: !this.hasNodeRun && !this.hasPinData ? 'undefined' : this.displayMode,\n\t\t\t\tis_data_pinned: this.hasPinData,\n\t\t\t});\n\t\t},\n\t\tonClickCancelEdit() {\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue('');\n\t\t\tthis.onExitEditMode({ type: 'cancel' });\n\t\t},\n\t\tonClickSaveEdit() {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { value } = this.editMode;\n\n\t\t\tthis.clearAllStickyNotifications();\n\n\t\t\ttry {\n\t\t\t\tthis.setPinData(this.node, clearJsonKey(value) as INodeExecutionData[], 'save-edit');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\n\t\t\tthis.onExitEditMode({ type: 'save' });\n\t\t},\n\t\tonExitEditMode({ type }: { type: 'save' | 'cancel' }) {\n\t\t\tthis.$telemetry.track('User closed ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tview: this.displayMode,\n\t\t\t\ttype,\n\t\t\t});\n\t\t},\n\t\tasync onTogglePinData({ source }: { source: PinDataSource }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (source === 'pin-icon-click') {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\trun_index: this.runIndex,\n\t\t\t\t\tview: !this.hasNodeRun && !this.hasPinData ? 'none' : this.displayMode,\n\t\t\t\t};\n\n\t\t\t\tvoid this.externalHooks.run('runData.onTogglePinData', telemetryPayload);\n\t\t\t\tthis.$telemetry.track('User clicked pin data icon', telemetryPayload);\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node);\n\n\t\t\tif (this.hasPinData) {\n\t\t\t\tthis.unsetPinData(this.node, source);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.setPinData(this.node, this.rawInputData, 'pin-icon-click');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.maxRunIndex > 0) {\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttitle: this.$locale.baseText('ndv.pinData.pin.multipleRuns.title', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tindex: `${this.runIndex}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tmessage: this.$locale.baseText('ndv.pinData.pin.multipleRuns.description'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tduration: 2000,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.hidePinDataDiscoveryTooltip();\n\t\t\tthis.pinDataDiscoveryComplete();\n\t\t},\n\t\tswitchToBinary() {\n\t\t\tthis.onDisplayModeChange('binary');\n\t\t},\n\t\tonBranchChange(value: number) {\n\t\t\tthis.outputIndex = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv branch', {\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tbranch_index: value,\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tnode_type_input_selection: this.nodeType ? this.nodeType.name : '',\n\t\t\t\tpane: this.paneType,\n\t\t\t});\n\t\t},\n\t\tshowTooMuchData() {\n\t\t\tthis.showData = true;\n\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tpane: this.paneType,\n\t\t\t\ttype: 'showTooMuchData',\n\t\t\t});\n\t\t},\n\t\ttoggleLinkRuns() {\n\t\t\tthis.linkedRuns ? this.unlinkRun() : this.linkRun();\n\t\t},\n\t\tlinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tunlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonCurrentPageChange(value) {\n\t\t\tthis.currentPage = value;\n\t\t\tthis.$telemetry.track('User changed ndv page', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonPageSizeChange(pageSize: number) {\n\t\t\tthis.pageSize = pageSize;\n\t\t\tconst maxPage = Math.ceil(this.dataCount / this.pageSize);\n\t\t\tif (maxPage < this.currentPage) {\n\t\t\t\tthis.currentPage = maxPage;\n\t\t\t}\n\n\t\t\tthis.$telemetry.track('User changed ndv page size', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonDisplayModeChange(displayMode: IRunDataDisplayMode) {\n\t\t\tconst previous = this.displayMode;\n\t\t\tthis.ndvStore.setPanelDisplayMode({ pane: this.paneType, mode: displayMode });\n\n\t\t\tconst dataContainerRef = this.$refs.dataContainer as Element | undefined;\n\t\t\tif (dataContainerRef) {\n\t\t\t\tconst dataDisplay = dataContainerRef.children[0];\n\n\t\t\t\tif (dataDisplay) {\n\t\t\t\t\tdataDisplay.scrollTo(0, 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tvoid this.externalHooks.run('runData.displayModeChanged', {\n\t\t\t\tnewValue: displayMode,\n\t\t\t\toldValue: previous,\n\t\t\t});\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User changed ndv item view', {\n\t\t\t\t\tprevious_view: previous,\n\t\t\t\t\tnew_view: displayMode,\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: this.paneType,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tgetRunLabel(option: number) {\n\t\t\tlet itemsCount = 0;\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\titemsCount += this.getPinDataOrLiveData(this.getRawInputData(option - 1, i)).length;\n\t\t\t}\n\t\t\tconst items = this.$locale.baseText('ndv.output.items', {\n\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t});\n\t\t\tconst itemsLabel = itemsCount > 0 ? ` (${items})` : '';\n\t\t\treturn option + this.$locale.baseText('ndv.output.of') + (this.maxRunIndex + 1) + itemsLabel;\n\t\t},\n\t\tgetRawInputData(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t): INodeExecutionData[] {\n\t\t\tlet inputData: INodeExecutionData[] = [];\n\n\t\t\tif (this.node) {\n\t\t\t\tinputData = this.nodeHelpers.getNodeInputData(\n\t\t\t\t\tthis.node,\n\t\t\t\t\trunIndex,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tthis.paneType,\n\t\t\t\t\tconnectionType,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (inputData.length === 0 || !Array.isArray(inputData)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn inputData;\n\t\t},\n\t\tgetPinDataOrLiveData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (this.pinData && !this.isProductionExecutionPreview) {\n\t\t\t\treturn Array.isArray(this.pinData)\n\t\t\t\t\t? this.pinData.map((value) => ({\n\t\t\t\t\t\t\tjson: value,\n\t\t\t\t\t }))\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tjson: this.pinData,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t ];\n\t\t\t}\n\t\t\treturn inputData;\n\t\t},\n\t\tgetFilteredData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (!this.search) {\n\t\t\t\treturn inputData;\n\t\t\t}\n\n\t\t\tthis.currentPage = 1;\n\t\t\treturn inputData.filter(({ json }) => searchInObject(json, this.search));\n\t\t},\n\t\tgetDataCount(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (this.workflowRunData?.[this.node.name]?.[runIndex]?.hasOwnProperty('error')) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tconst rawInputData = this.getRawInputData(runIndex, outputIndex, connectionType);\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData).length;\n\t\t},\n\t\tinit() {\n\t\t\t// Reset the selected output index every time another node gets selected\n\t\t\tthis.outputIndex = 0;\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tlet outputTypes: ConnectionTypes[] = [];\n\t\t\tif (this.nodeType !== null && this.node !== null) {\n\t\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\t\toutputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t}\n\t\t\tthis.connectionType = outputTypes.length === 0 ? NodeConnectionType.Main : outputTypes[0];\n\t\t\tif (this.binaryData.length > 0) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'binary',\n\t\t\t\t});\n\t\t\t} else if (this.displayMode === 'binary') {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'table',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcloseBinaryDataDisplay() {\n\t\t\tthis.binaryDataDisplayVisible = false;\n\t\t\tthis.binaryDataDisplayData = null;\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(null);\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tisViewable(index: number, key: string): boolean {\n\t\t\tconst { fileType } = this.binaryData[index][key];\n\t\t\treturn (\n\t\t\t\t!!fileType && ['image', 'audio', 'video', 'text', 'json', 'pdf', 'html'].includes(fileType)\n\t\t\t);\n\t\t},\n\t\tisDownloadable(index: number, key: string): boolean {\n\t\t\tconst { mimeType, fileName } = this.binaryData[index][key];\n\t\t\treturn !!(mimeType && fileName);\n\t\t},\n\t\tasync downloadBinaryData(index: number, key: string) {\n\t\t\tconst { id, data, fileName, fileExtension, mimeType } = this.binaryData[index][key];\n\n\t\t\tif (id) {\n\t\t\t\tconst url = this.workflowsStore.getBinaryUrl(id, 'download', fileName, mimeType);\n\t\t\t\tsaveAs(url, [fileName, fileExtension].join('.'));\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tconst bufferString = 'data:' + mimeType + ';base64,' + data;\n\t\t\t\tconst blob = await fetch(bufferString).then(async (d) => d.blob());\n\t\t\t\tsaveAs(blob, fileName);\n\t\t\t}\n\t\t},\n\t\tasync downloadJsonData() {\n\t\t\tconst fileName = this.node!.name.replace(/[^\\w\\d]/g, '_');\n\t\t\tconst blob = new Blob([JSON.stringify(this.rawInputData, null, 2)], {\n\t\t\t\ttype: 'application/json',\n\t\t\t});\n\n\t\t\tsaveAs(blob, `${fileName}.json`);\n\t\t},\n\t\tdisplayBinaryData(index: number, key: string) {\n\t\t\tthis.binaryDataDisplayVisible = true;\n\n\t\t\tthis.binaryDataDisplayData = {\n\t\t\t\tnode: this.node!.name,\n\t\t\t\trunIndex: this.runIndex,\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\tindex,\n\t\t\t\tkey,\n\t\t\t};\n\t\t},\n\t\tgetOutputName(outputIndex: number) {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\tconst nodeType = this.nodeType;\n\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\tconst outputConfiguration = outputs?.[outputIndex] as INodeOutputConfiguration;\n\n\t\t\tif (outputConfiguration && isObject(outputConfiguration)) {\n\t\t\t\treturn outputConfiguration?.displayName;\n\t\t\t}\n\t\t\tif (!nodeType?.outputNames || nodeType.outputNames.length <= outputIndex) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\treturn nodeType.outputNames[outputIndex];\n\t\t},\n\t\trefreshDataSize() {\n\t\t\t// Hide by default the data from being displayed\n\t\t\tthis.showData = false;\n\t\t\tconst jsonItems = this.inputDataPage.map((item) => item.json);\n\t\t\tthis.dataSize = JSON.stringify(jsonItems).length;\n\t\t\tif (this.dataSize < this.MAX_DISPLAY_DATA_SIZE) {\n\t\t\t\t// Data is reasonable small (< 200kb) so display it directly\n\t\t\t\tthis.showData = true;\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tenableNode() {\n\t\t\tif (this.node) {\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdisabled: !this.node.disabled,\n\t\t\t\t\t} as IDataObject,\n\t\t\t\t} as INodeUpdatePropertiesInformation;\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetDisplayMode() {\n\t\t\tif (!this.activeNode) return;\n\n\t\t\tconst shouldDisplayHtml =\n\t\t\t\tthis.activeNode.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate';\n\n\t\t\tif (shouldDisplayHtml) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\tmode: 'html',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t\tonSearchClear() {\n\t\t\tthis.search = '';\n\t\t\tdocument.dispatchEvent(new KeyboardEvent('keyup', { key: '/' }));\n\t\t},\n\t},\n\twatch: {\n\t\tnode() {\n\t\t\tthis.init();\n\t\t},\n\t\thasNodeRun() {\n\t\t\tif (this.paneType === 'output') this.setDisplayMode();\n\t\t},\n\t\tinputDataPage: {\n\t\t\thandler(data: INodeExecutionData[]) {\n\t\t\t\tif (this.paneType && data) {\n\t\t\t\t\tthis.ndvStore.setNDVPanelDataIsEmpty({\n\t\t\t\t\t\tpanel: this.paneType as 'input' | 'output',\n\t\t\t\t\t\tisEmpty: data.every((item) => isEmpty(item.json)),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\t\tjsonData(value: IDataObject[]) {\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.showPinDataDiscoveryTooltip(value);\n\t\t},\n\t\tbinaryData(newData: IBinaryKeyData[], prevData: IBinaryKeyData[]) {\n\t\t\tif (newData.length && !prevData.length && this.displayMode !== 'binary') {\n\t\t\t\tthis.switchToBinary();\n\t\t\t} else if (!newData.length && this.displayMode === 'binary') {\n\t\t\t\tthis.onDisplayModeChange('table');\n\t\t\t}\n\t\t},\n\t\tcurrentOutputIndex(branchIndex: number) {\n\t\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\tbranchIndex,\n\t\t\t});\n\t\t},\n\t\tsearch(newSearch: string) {\n\t\t\tthis.$emit('search', newSearch);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.infoIcon {\n\tcolor: var(--color-foreground-dark);\n}\n\n.center {\n\tdisplay: flex;\n\theight: 100%;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\n\t> * {\n\t\tmax-width: 316px;\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-run-data-background);\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.pinnedDataCallout {\n\tborder-radius: inherit;\n\tborder-bottom-right-radius: 0;\n\tborder-top: 0;\n\tborder-left: 0;\n\tborder-right: 0;\n}\n\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n\tpadding: var(--spacing-s) var(--spacing-s) 0 var(--spacing-s);\n\tposition: relative;\n\toverflow-x: auto;\n\toverflow-y: hidden;\n\tmin-height: calc(30px + var(--spacing-s));\n\n\t> *:first-child {\n\t\tflex-grow: 1;\n\t}\n}\n\n.dataContainer {\n\tposition: relative;\n\toverflow-y: auto;\n\theight: 100%;\n\n\t&:hover {\n\t\t.actions-group {\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n\n.dataDisplay {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: 0 var(--spacing-s) var(--spacing-3xl) var(--spacing-s);\n\tright: 0;\n\toverflow-y: auto;\n\tline-height: var(--font-line-height-xloose);\n\tword-break: normal;\n\theight: 100%;\n}\n\n.tabs {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.itemsCount {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n}\n\n.runSelector {\n\tpadding-left: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n\tdisplay: flex;\n\twidth: 100%;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.runSelectorWrapper {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.pagination {\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tbottom: 0;\n\tpadding: 5px;\n\toverflow-y: hidden;\n}\n\n.pageSizeSelector {\n\ttext-transform: capitalize;\n\tmax-width: 150px;\n\tflex: 0 1 auto;\n}\n\n.binaryIndex {\n\tdisplay: block;\n\tpadding: var(--spacing-2xs);\n\tfont-size: var(--font-size-2xs);\n\n\t> * {\n\t\tdisplay: inline-block;\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tline-height: 30px;\n\t\tborder-radius: var(--border-radius-base);\n\t\ttext-align: center;\n\t\tbackground-color: var(--color-foreground-xdark);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-xlight);\n\t}\n}\n\n.binaryRow {\n\tdisplay: inline-flex;\n\tfont-size: var(--font-size-2xs);\n}\n\n.binaryCell {\n\tdisplay: inline-block;\n\twidth: 300px;\n\toverflow: hidden;\n\tbackground-color: var(--color-foreground-xlight);\n\tmargin-right: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n\tborder-radius: var(--border-radius-base);\n\tborder: var(--border-base);\n\tpadding: var(--spacing-s);\n}\n\n.binaryHeader {\n\tcolor: $color-primary;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: 1.2em;\n\tpadding-bottom: var(--spacing-2xs);\n\tmargin-bottom: var(--spacing-2xs);\n\tborder-bottom: 1px solid var(--color-text-light);\n}\n\n.binaryButtonContainer {\n\tmargin-top: 1.5em;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\n\t> * {\n\t\tflex-grow: 0;\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n.binaryValue {\n\twhite-space: initial;\n\tword-wrap: break-word;\n}\n\n.displayModes {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tflex-grow: 1;\n}\n.tooltipContain {\n\tmax-width: 240px;\n}\n\n.pinDataButton {\n\tsvg {\n\t\ttransition: transform 0.3s ease;\n\t}\n}\n\n.spinner {\n\t* {\n\t\tcolor: var(--color-primary);\n\t\tmin-height: 40px;\n\t\tmin-width: 40px;\n\t}\n\n\tdisplay: flex;\n\tjustify-content: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.editMode {\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: stretch;\n\tpadding-left: var(--spacing-s);\n\tpadding-right: var(--spacing-s);\n}\n\n.editModeBody {\n\tflex: 1 1 auto;\n\tmax-height: 100%;\n\twidth: 100%;\n\toverflow: auto;\n}\n\n.editModeFooter {\n\tflex: 0 1 auto;\n\tdisplay: flex;\n\twidth: 100%;\n\tjustify-content: space-between;\n\talign-items: center;\n\tpadding-top: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n}\n\n.editModeFooterInfotip {\n\tdisplay: flex;\n\tflex: 1;\n\twidth: 100%;\n}\n\n.editModeActions {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n}\n\n.stretchVertically {\n\theight: 100%;\n}\n\n.uiBlocker {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.run-data {\n\t.code-node-editor {\n\t\theight: 100%;\n\t}\n}\n</style>\n\n<style lang=\"scss\" scoped>\n:deep(.highlight) {\n\tbackground-color: #f7dc55;\n\tcolor: black;\n\tborder-radius: var(--border-radius-base);\n\tpadding: 0 1px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n</style>\n","<template>\n\t<n8n-info-tip type=\"tooltip\" theme=\"info-light\" tooltipPlacement=\"right\" v-if=\"runMetadata\">\n\t\t<div>\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.startTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.startTime }}<br />\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.executionTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.executionTime }} {{ $locale.baseText('runData.ms') }}\n\t\t</div>\n\t</n8n-info-tip>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { ITaskData } from 'n8n-workflow';\n\nexport default defineComponent({\n\tprops: {\n\t\ttaskData: {}, // ITaskData\n\t},\n\n\tcomputed: {\n\t\trunTaskData(): ITaskData {\n\t\t\treturn this.taskData as ITaskData;\n\t\t},\n\t\trunMetadata(): { executionTime: number; startTime: string } | null {\n\t\t\tif (!this.runTaskData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\texecutionTime: this.runTaskData.executionTime,\n\t\t\t\tstartTime: new Date(this.runTaskData.startTime).toLocaleString(),\n\t\t\t};\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<RunData\n\t\t:nodeUi=\"node\"\n\t\t:runIndex=\"runIndex\"\n\t\t:linkedRuns=\"linkedRuns\"\n\t\t:canLinkRuns=\"canLinkRuns\"\n\t\t:tooMuchDataTitle=\"$locale.baseText('ndv.output.tooMuchData.title')\"\n\t\t:noDataInBranchMessage=\"$locale.baseText('ndv.output.noOutputDataInBranch')\"\n\t\t:isExecuting=\"isNodeRunning\"\n\t\t:executingMessage=\"$locale.baseText('ndv.output.executing')\"\n\t\t:sessionId=\"sessionId\"\n\t\t:blockUI=\"blockUI\"\n\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t:isPaneActive=\"isPaneActive\"\n\t\t@activatePane=\"activatePane\"\n\t\tpaneType=\"output\"\n\t\t@runChange=\"onRunIndexChange\"\n\t\t@linkRun=\"onLinkRun\"\n\t\t@unlinkRun=\"onUnlinkRun\"\n\t\t@tableMounted=\"$emit('tableMounted', $event)\"\n\t\t@itemHover=\"$emit('itemHover', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t\tref=\"runData\"\n\t\t:data-output-type=\"outputMode\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<template v-if=\"hasAiMetadata\">\n\t\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\t\t:options=\"outputTypes\"\n\t\t\t\t\t\tv-model=\"outputMode\"\n\t\t\t\t\t\t@update:modelValue=\"onUpdateOutputMode\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<span :class=\"$style.title\" v-else>\n\t\t\t\t\t{{ $locale.baseText(outputPanelEditMode.enabled ? 'ndv.output.edit' : 'ndv.output') }}\n\t\t\t\t</span>\n\t\t\t\t<RunInfo\n\t\t\t\t\tv-if=\"!hasPinData && runsCount === 1\"\n\t\t\t\t\tv-show=\"!outputPanelEditMode.enabled\"\n\t\t\t\t\t:taskData=\"runTaskData\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-info-tip\n\t\t\t\t\ttheme=\"warning\"\n\t\t\t\t\ttype=\"tooltip\"\n\t\t\t\t\ttooltipPlacement=\"right\"\n\t\t\t\t\tv-if=\"hasNodeRun && staleData\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t$locale.baseText(\n\t\t\t\t\t\t\t\thasPinData\n\t\t\t\t\t\t\t\t\t? 'ndv.output.staleDataWarning.pinData'\n\t\t\t\t\t\t\t\t\t: 'ndv.output.staleDataWarning.regular',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\"\n\t\t\t\t\t></span>\n\t\t\t\t</n8n-info-tip>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #node-not-run>\n\t\t\t<n8n-text v-if=\"workflowRunning && !isTriggerNode\" data-test-id=\"ndv-output-waiting\">{{\n\t\t\t\t$locale.baseText('ndv.output.waitingToRun')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text v-if=\"!workflowRunning\" data-test-id=\"ndv-output-run-node-hint\">\n\t\t\t\t<template v-if=\"isSubNode\">\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHintSubNode') }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHint') }}\n\t\t\t\t\t<span @click=\"insertTestData\" v-if=\"canPinData\">\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t{{ $locale.baseText('generic.or') }}\n\t\t\t\t\t\t<n8n-text tag=\"a\" size=\"medium\" color=\"primary\">\n\t\t\t\t\t\t\t{{ $locale.baseText('ndv.output.insertTestData') }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.output.noOutputData.title')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message') }}\n\t\t\t\t<a @click=\"openSettings\">{{\n\t\t\t\t\t$locale.baseText('ndv.output.noOutputData.message.settings')\n\t\t\t\t}}</a>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message.settingsOption') }}\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template #content v-if=\"outputMode === 'logs'\">\n\t\t\t<run-data-ai :node=\"node\" :run-index=\"runIndex\" />\n\t\t</template>\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #run-info v-if=\"!hasPinData && runsCount > 1\">\n\t\t\t<RunInfo :taskData=\"runTaskData\" />\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IExecutionResponse, INodeUi } from '@/Interface';\nimport type { INodeTypeDescription, IRunData, IRunExecutionData, ITaskData } from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport RunInfo from './RunInfo.vue';\nimport { pinData } from '@/mixins/pinData';\nimport { mapStores } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport RunDataAi from './RunDataAi/RunDataAi.vue';\nimport { ndvEventBus } from '@/event-bus';\n\ntype RunDataRef = InstanceType<typeof RunData>;\n\nconst OUTPUT_TYPE = {\n\tREGULAR: 'regular',\n\tLOGS: 'logs',\n};\n\nexport default defineComponent({\n\tname: 'OutputPanel',\n\tmixins: [pinData],\n\tcomponents: { RunData, RunInfo, RunDataAi },\n\tdata() {\n\t\treturn {\n\t\t\toutputMode: 'regular',\n\t\t\toutputTypes: [\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.regular'), value: OUTPUT_TYPE.REGULAR },\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.logs'), value: OUTPUT_TYPE.LOGS },\n\t\t\t],\n\t\t};\n\t},\n\tprops: {\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\thasAiMetadata(): boolean {\n\t\t\tif (this.node) {\n\t\t\t\tconst resultData = this.workflowsStore.getWorkflowResultDataByNodeName(this.node.name);\n\n\t\t\t\tif (!resultData || !Array.isArray(resultData) || resultData.length === 0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn !!resultData[resultData.length - 1].metadata;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!(this.nodeType && this.nodeType.group.includes('schedule'));\n\t\t},\n\t\tisNodeRunning(): boolean {\n\t\t\treturn this.node && this.workflowsStore.isNodeExecuting(this.node.name);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (!executionData?.resultData?.runData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn executionData.resultData.runData;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\tif (this.workflowsStore.subWorkflowExecutionError) return true;\n\n\t\t\treturn Boolean(\n\t\t\t\tthis.node && this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name),\n\t\t\t);\n\t\t},\n\t\trunTaskData(): ITaskData | null {\n\t\t\tif (!this.node || this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst runData = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length <= this.runIndex) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn runData[this.node.name][this.runIndex];\n\t\t},\n\t\trunsCount(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tstaleData(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst updatedAt = this.workflowsStore.getParametersLastUpdate(this.node.name);\n\t\t\tif (!updatedAt || !this.runTaskData) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst runAt = this.runTaskData.startTime;\n\t\t\treturn updatedAt > runAt;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\treturn this.isPinDataNodeType && !this.isReadOnly;\n\t\t},\n\t},\n\tmethods: {\n\t\tinsertTestData() {\n\t\t\tconst runDataRef = this.$refs.runData as RunDataRef | undefined;\n\t\t\tif (runDataRef) {\n\t\t\t\trunDataRef.enterEditMode({\n\t\t\t\t\torigin: 'insertTestDataLink',\n\t\t\t\t});\n\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tnode_type: this.node.type,\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\ttype: 'insert-test-data',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.$emit('openSettings');\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tnode_type: this.node.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'settings',\n\t\t\t});\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonUpdateOutputMode(outputMode: (typeof OUTPUT_TYPE)[string]) {\n\t\t\tif (outputMode === OUTPUT_TYPE.LOGS) {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'minLeft');\n\t\t\t} else {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'initial');\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n// The items count and displayModes are rendered in the RunData component\n// this is a workaround to hide it in the output panel(for ai type) to not add unnecessary one-time props\n:global([data-output-type='logs'] [class*='itemsCount']),\n:global([data-output-type='logs'] [class*='displayModes']) {\n\tdisplay: none;\n}\n.outputTypeSelect {\n\tmargin-bottom: var(--spacing-4xs);\n\twidth: fit-content;\n}\n.titleSection {\n\tdisplay: flex;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-s);\n}\n\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n</style>\n","<template>\n\t<svg\n\t\twidth=\"112\"\n\t\theight=\"80\"\n\t\tviewBox=\"0 0 112 80\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\txmlns:xlink=\"http://www.w3.org/1999/xlink\"\n\t>\n\t\t<mask\n\t\t\tid=\"mask0_489_46042\"\n\t\t\tstyle=\"mask-type: alpha\"\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"112\"\n\t\t\theight=\"80\"\n\t\t>\n\t\t\t<rect width=\"112\" height=\"80\" fill=\"url(#paint0_linear_489_46042)\" />\n\t\t</mask>\n\t\t<g mask=\"url(#mask0_489_46042)\">\n\t\t\t<rect x=\"-0.5\" width=\"112\" height=\"80\" fill=\"url(#pattern0)\" fill-opacity=\"0.6\" />\n\t\t</g>\n\t\t<defs>\n\t\t\t<pattern id=\"pattern0\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n\t\t\t\t<use xlink:href=\"#image0_489_46042\" transform=\"scale(0.00357143 0.005)\" />\n\t\t\t</pattern>\n\t\t\t<linearGradient\n\t\t\t\tid=\"paint0_linear_489_46042\"\n\t\t\t\tx1=\"90.5\"\n\t\t\t\ty1=\"40.4494\"\n\t\t\t\tx2=\"112.5\"\n\t\t\t\ty2=\"40.4494\"\n\t\t\t\tgradientUnits=\"userSpaceOnUse\"\n\t\t\t>\n\t\t\t\t<stop />\n\t\t\t\t<stop offset=\"1\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t</linearGradient>\n\t\t\t<image\n\t\t\t\tid=\"image0_489_46042\"\n\t\t\t\twidth=\"280\"\n\t\t\t\theight=\"200\"\n\t\t\t\txlink:href=\"data:image/png;base64,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\"\n\t\t\t/>\n\t\t</defs>\n\t</svg>\n</template>\n","<template>\n\t<RunData\n\t\t:nodeUi=\"currentNode\"\n\t\t:runIndex=\"runIndex\"\n\t\t:linkedRuns=\"linkedRuns\"\n\t\t:canLinkRuns=\"!mappedNode && canLinkRuns\"\n\t\t:tooMuchDataTitle=\"$locale.baseText('ndv.input.tooMuchData.title')\"\n\t\t:noDataInBranchMessage=\"$locale.baseText('ndv.input.noOutputDataInBranch')\"\n\t\t:isExecuting=\"isExecutingPrevious\"\n\t\t:executingMessage=\"$locale.baseText('ndv.input.executingPrevious')\"\n\t\t:sessionId=\"sessionId\"\n\t\t:overrideOutputs=\"connectedCurrentNodeOutputs\"\n\t\t:mappingEnabled=\"isMappingEnabled\"\n\t\t:distanceFromActive=\"currentNodeDepth\"\n\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t:isPaneActive=\"isPaneActive\"\n\t\t@activatePane=\"activatePane\"\n\t\tpaneType=\"input\"\n\t\t@itemHover=\"$emit('itemHover', $event)\"\n\t\t@linkRun=\"onLinkRun\"\n\t\t@unlinkRun=\"onUnlinkRun\"\n\t\t@runChange=\"onRunIndexChange\"\n\t\t@tableMounted=\"$emit('tableMounted', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t\tdata-test-id=\"ndv-input-panel\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tv-if=\"parentNodes.length\"\n\t\t\t\t\tteleported\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:modelValue=\"currentNodeName\"\n\t\t\t\t\t@update:modelValue=\"onInputNodeChange\"\n\t\t\t\t\t:no-data-text=\"$locale.baseText('ndv.input.noNodesFound')\"\n\t\t\t\t\t:placeholder=\"$locale.baseText('ndv.input.parentNodes')\"\n\t\t\t\t\tfilterable\n\t\t\t\t\tdata-test-id=\"ndv-input-select\"\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>\n\t\t\t\t\t\t<span :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"node of parentNodes\"\n\t\t\t\t\t\t:value=\"node.name\"\n\t\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t\tclass=\"node-option\"\n\t\t\t\t\t\t:label=\"`${truncate(node.name)} ${getMultipleNodesText(node.name)}`\"\n\t\t\t\t\t\tdata-test-id=\"ndv-input-option\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{{ truncate(node.name) }}&nbsp;</span>\n\t\t\t\t\t\t<span v-if=\"getMultipleNodesText(node.name)\">{{\n\t\t\t\t\t\t\tgetMultipleNodesText(node.name)\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t<span v-else>{{\n\t\t\t\t\t\t\t$locale.baseText('ndv.input.nodeDistance', { adjustToNumber: node.depth })\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t</n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<span v-else :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-if=\"isActiveNodeConfig && !readOnly\"\n\t\t\t\t\t:options=\"inputModes\"\n\t\t\t\t\t:modelValue=\"inputMode\"\n\t\t\t\t\t@update:modelValue=\"onInputModeChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #before-data v-if=\"isMappingMode\">\n\t\t\t<!--\n\t\t\t\t\t\tHide the run linking buttons for both input and ouput panels when in 'Mapping Mode' because the run indices wouldn't match.\n\t\t\t\t\t\tAlthough this is not the most elegant solution, it's straightforward and simpler than introducing a new props and logic to handle this.\n\t\t\t\t-->\n\t\t\t<component :is=\"'style'\">button.linkRun { display: none }</component>\n\t\t\t<div :class=\"$style.mappedNode\">\n\t\t\t\t<n8n-select\n\t\t\t\t\t:modelValue=\"mappedNode\"\n\t\t\t\t\t@update:modelValue=\"onMappedNodeSelected\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t@click.stop\n\t\t\t\t\tteleported\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.input.previousNode') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"nodeName in rootNodesParents\"\n\t\t\t\t\t\t:key=\"nodeName\"\n\t\t\t\t\t\t:label=\"nodeName\"\n\t\t\t\t\t\t:value=\"nodeName\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #node-not-run>\n\t\t\t<div\n\t\t\t\t:class=\"$style.noOutputData\"\n\t\t\t\tv-if=\"(isActiveNodeConfig && rootNode) || parentNodes.length\"\n\t\t\t>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.noOutputData.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-tooltip v-if=\"!readOnly\" :visible=\"showDraggableHint && showDraggableHintWithDelay\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t\t$locale.baseText('dataMapping.dragFromPreviousHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { name: focusedMappableInput },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t:transparent=\"true\"\n\t\t\t\t\t\t:nodeName=\"isActiveNodeConfig ? rootNode : currentNodeName\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.input.noOutputData.executePrevious')\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\ttelemetrySource=\"inputs\"\n\t\t\t\t\t\tdata-test-id=\"execute-previous-node\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-text v-if=\"!readOnly\" tag=\"div\" size=\"small\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.noOutputData.hint') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div :class=\"$style.notConnected\" v-else>\n\t\t\t\t<div>\n\t\t\t\t\t<WireMeUp />\n\t\t\t\t</div>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.notConnected.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.message') }}\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://docs.n8n.io/workflows/connections/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click=\"onConnectionHelpClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.learnMore') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.input.noOutputData')\n\t\t\t}}</n8n-text>\n\t\t</template>\n\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { INodeUi } from '@/Interface';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tIConnectedNode,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tWorkflow,\n} from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport WireMeUp from './WireMeUp.vue';\nimport {\n\tCRON_NODE_TYPE,\n\tINTERVAL_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSTART_NODE_TYPE,\n} from '@/constants';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\ntype MappingMode = 'debugging' | 'mapping';\n\nexport default defineComponent({\n\tname: 'InputPanel',\n\tmixins: [workflowHelpers],\n\tcomponents: { RunData, NodeExecuteButton, WireMeUp },\n\tprops: {\n\t\tcurrentNodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowDraggableHintWithDelay: false,\n\t\t\tdraggableHintShown: false,\n\t\t\tinputMode: 'debugging' as MappingMode,\n\t\t\tmappedNode: null as string | null,\n\t\t\tinputModes: [\n\t\t\t\t{ value: 'mapping', label: this.$locale.baseText('ndv.input.mapping') },\n\t\t\t\t{ value: 'debugging', label: this.$locale.baseText('ndv.input.debugging') },\n\t\t\t],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore),\n\t\tfocusedMappableInput(): string {\n\t\t\treturn this.ndvStore.focusedMappableInput;\n\t\t},\n\t\tisUserOnboarded(): boolean {\n\t\t\treturn this.ndvStore.isMappingOnboarded;\n\t\t},\n\t\tisMappingMode(): boolean {\n\t\t\treturn this.isActiveNodeConfig && this.inputMode === 'mapping';\n\t\t},\n\t\tshowDraggableHint(): boolean {\n\t\t\tconst toIgnore = [\n\t\t\t\tSTART_NODE_TYPE,\n\t\t\t\tMANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\tCRON_NODE_TYPE,\n\t\t\t\tINTERVAL_NODE_TYPE,\n\t\t\t];\n\t\t\tif (!this.currentNode || toIgnore.includes(this.currentNode.type)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn !!this.focusedMappableInput && !this.isUserOnboarded;\n\t\t},\n\t\tisActiveNodeConfig(): boolean {\n\t\t\tlet inputs = this.activeNodeType?.inputs ?? [];\n\t\t\tlet outputs = this.activeNodeType?.outputs ?? [];\n\t\t\tif (this.activeNode !== null && this.currentWorkflow !== null) {\n\t\t\t\tconst node = this.currentWorkflow.getNode(this.activeNode.name);\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t} else {\n\t\t\t\t// If we can not figure out the node type we set no outputs\n\t\t\t\tif (!Array.isArray(inputs)) {\n\t\t\t\t\tinputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(outputs)) {\n\t\t\t\t\toutputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tinputs.length === 0 ||\n\t\t\t\t(inputs.every((input) => this.filterOutConnectionType(input, NodeConnectionType.Main)) &&\n\t\t\t\t\toutputs.find((output) => this.filterOutConnectionType(output, NodeConnectionType.Main)))\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tisMappingEnabled(): boolean {\n\t\t\tif (this.readOnly) return false;\n\n\t\t\t// Mapping is only enabled in mapping mode for config nodes and if node to map is selected\n\t\t\tif (this.isActiveNodeConfig) return this.isMappingMode && this.mappedNode !== null;\n\n\t\t\treturn true;\n\t\t},\n\t\tisExecutingPrevious(): boolean {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\tconst executingNode = this.workflowsStore.executingNode;\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\ttriggeredNode === this.activeNode.name &&\n\t\t\t\t!this.workflowsStore.isNodeExecuting(this.activeNode.name)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (executingNode.length || triggeredNode) {\n\t\t\t\treturn !!this.parentNodes.find(\n\t\t\t\t\t(node) => this.workflowsStore.isNodeExecuting(node.name) || node.name === triggeredNode,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): Workflow {\n\t\t\treturn this.workflow as Workflow;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\n\t\trootNode(): string {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst rootNodes = workflow.getChildNodes(this.activeNode.name, 'ALL_NON_MAIN');\n\n\t\t\treturn rootNodes[0];\n\t\t},\n\t\trootNodesParents(): string[] {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst parentNodes = [...workflow.getParentNodes(this.rootNode, 'main')].reverse();\n\n\t\t\treturn parentNodes;\n\t\t},\n\t\tcurrentNode(): INodeUi | null {\n\t\t\tif (this.isActiveNodeConfig) {\n\t\t\t\t// if we're mapping node we want to show the output of the mapped node\n\t\t\t\tif (this.mappedNode) {\n\t\t\t\t\treturn this.workflowsStore.getNodeByName(this.mappedNode);\n\t\t\t\t}\n\n\t\t\t\t// in debugging mode data does get set manually and is only for debugging\n\t\t\t\t// so we want to force the node to be the active node to make sure we show the correct data\n\t\t\t\treturn this.activeNode;\n\t\t\t}\n\n\t\t\treturn this.workflowsStore.getNodeByName(this.currentNodeName);\n\t\t},\n\t\tconnectedCurrentNodeOutputs(): number[] | undefined {\n\t\t\tconst search = this.parentNodes.find(({ name }) => name === this.currentNodeName);\n\t\t\tif (search) {\n\t\t\t\treturn search.indicies;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tparentNodes(): IConnectedNode[] {\n\t\t\tif (!this.activeNode) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst nodes: IConnectedNode[] = (this.workflow as Workflow).getParentNodesByDepth(\n\t\t\t\tthis.activeNode.name,\n\t\t\t);\n\n\t\t\treturn nodes.filter(\n\t\t\t\t({ name }, i) =>\n\t\t\t\t\tthis.activeNode &&\n\t\t\t\t\tname !== this.activeNode.name &&\n\t\t\t\t\tnodes.findIndex((node) => node.name === name) === i,\n\t\t\t);\n\t\t},\n\t\tcurrentNodeDepth(): number {\n\t\t\tconst node = this.parentNodes.find(\n\t\t\t\t(node) => this.currentNode && node.name === this.currentNode.name,\n\t\t\t);\n\t\t\treturn node ? node.depth : -1;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (!this.activeNode) return null;\n\n\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t},\n\t\tisMultiInputNode(): boolean {\n\t\t\treturn this.activeNodeType !== null && this.activeNodeType.inputs.length > 1;\n\t\t},\n\t},\n\tmethods: {\n\t\tfilterOutConnectionType(\n\t\t\titem: ConnectionTypes | INodeOutputConfiguration,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tif (!item) return false;\n\n\t\t\treturn typeof item === 'string' ? item !== type : item.type !== type;\n\t\t},\n\t\tonInputModeChange(val: MappingMode) {\n\t\t\tthis.inputMode = val;\n\t\t},\n\t\tonMappedNodeSelected(val: string) {\n\t\t\tthis.mappedNode = val;\n\n\t\t\tthis.onRunIndexChange(0);\n\t\t\tthis.onUnlinkRun();\n\t\t},\n\t\tgetMultipleNodesText(nodeName?: string): string {\n\t\t\tif (\n\t\t\t\t!nodeName ||\n\t\t\t\t!this.isMultiInputNode ||\n\t\t\t\t!this.activeNode ||\n\t\t\t\tthis.activeNodeType?.inputNames === undefined\n\t\t\t)\n\t\t\t\treturn '';\n\n\t\t\tconst activeNodeConnections =\n\t\t\t\tthis.currentWorkflow.connectionsByDestinationNode[this.activeNode.name].main || [];\n\t\t\t// Collect indexes of connected nodes\n\t\t\tconst connectedInputIndexes = activeNodeConnections.reduce((acc: number[], node, index) => {\n\t\t\t\tif (node[0] && node[0].node === nodeName) return [...acc, index];\n\t\t\t\treturn acc;\n\t\t\t}, []);\n\n\t\t\t// Match connected input indexes to their names specified by active node\n\t\t\tconst connectedInputs = connectedInputIndexes.map(\n\t\t\t\t(inputIndex) => this.activeNodeType?.inputNames?.[inputIndex],\n\t\t\t);\n\n\t\t\tif (connectedInputs.length === 0) return '';\n\n\t\t\treturn `(${connectedInputs.join(' & ')})`;\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'executePrevious',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonInputNodeChange(value: string) {\n\t\t\tconst index = this.parentNodes.findIndex((node) => node.name === value) + 1;\n\t\t\tthis.$emit('changeInputNode', value, index);\n\t\t},\n\t\tonConnectionHelpClick() {\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'not-connected-help',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\ttruncate(nodeName: string) {\n\t\t\tconst truncated = nodeName.substring(0, 30);\n\t\t\tif (truncated.length < nodeName.length) {\n\t\t\t\treturn `${truncated}...`;\n\t\t\t}\n\t\t\treturn truncated;\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n\twatch: {\n\t\tinputMode: {\n\t\t\thandler(val) {\n\t\t\t\tthis.onRunIndexChange(-1);\n\t\t\t\tif (val === 'mapping') {\n\t\t\t\t\tthis.onUnlinkRun();\n\t\t\t\t\tthis.mappedNode = this.rootNodesParents[0];\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t},\n\t\tshowDraggableHint(curr: boolean, prev: boolean) {\n\t\t\tif (curr && !prev) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.draggableHintShown) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.showDraggableHintWithDelay = this.showDraggableHint;\n\t\t\t\t\tif (this.showDraggableHintWithDelay) {\n\t\t\t\t\t\tthis.draggableHintShown = true;\n\n\t\t\t\t\t\tthis.$telemetry.track('User viewed data mapping tooltip', {\n\t\t\t\t\t\t\ttype: 'unexecuted input pane',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 1000);\n\t\t\t} else if (!curr) {\n\t\t\t\tthis.showDraggableHintWithDelay = false;\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.mappedNode {\n\twidth: max-content;\n\tpadding: 0 var(--spacing-s) var(--spacing-s);\n}\n.titleSection {\n\tdisplay: flex;\n\tmax-width: 300px;\n\talign-items: center;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n.inputModeTab {\n\tmargin-left: auto;\n}\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n\n.notConnected {\n\tmax-width: 300px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-size: var(--font-size-s);\n\tfont-weight: var(--font-weight-bold);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-option {\n\tfont-weight: var(--font-weight-regular) !important;\n\n\tspan {\n\t\tcolor: var(--color-text-light);\n\t}\n\n\t&.selected > span {\n\t\tcolor: var(--color-primary);\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<transition name=\"fade\" mode=\"out-in\">\n\t\t\t<div key=\"empty\" v-if=\"hasIssues\"></div>\n\t\t\t<div key=\"listening\" v-else-if=\"isListeningForEvents\">\n\t\t\t\t<n8n-pulse>\n\t\t\t\t\t<NodeIcon :nodeType=\"nodeType\" :size=\"40\"></NodeIcon>\n\t\t\t\t</n8n-pulse>\n\t\t\t\t<div v-if=\"isWebhookNode\">\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.listening')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.requestHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { type: this.webhookHttpMethod },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CopyInput\n\t\t\t\t\t\t:value=\"webhookTestUrl\"\n\t\t\t\t\t\t:toastTitle=\"$locale.baseText('ndv.trigger.copiedTestUrl')\"\n\t\t\t\t\t\tclass=\"mb-2xl\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t:collapse=\"true\"\n\t\t\t\t\t\t:copy-button-text=\"$locale.baseText('generic.clickToCopy')\"\n\t\t\t\t\t\t@copy=\"onTestLinkCopied\"\n\t\t\t\t\t></CopyInput>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:nodeName=\"nodeName\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetrySource=\"inputs\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div v-else>\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\tlisteningTitle\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t\t\t{{ listeningHint }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:nodeName=\"nodeName\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetrySource=\"inputs\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div key=\"default\" v-else>\n\t\t\t\t<div class=\"mb-xl\" v-if=\"isActivelyPolling\">\n\t\t\t\t\t<n8n-spinner type=\"ring\" />\n\t\t\t\t</div>\n\n\t\t\t\t<div :class=\"$style.action\">\n\t\t\t\t\t<div :class=\"$style.header\">\n\t\t\t\t\t\t<n8n-heading v-if=\"header\" tag=\"h1\" bold>\n\t\t\t\t\t\t\t{{ header }}\n\t\t\t\t\t\t</n8n-heading>\n\t\t\t\t\t\t<n8n-text v-if=\"subheader\">\n\t\t\t\t\t\t\t<span v-text=\"subheader\" />\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:nodeName=\"nodeName\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetrySource=\"inputs\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-text size=\"small\" @click=\"onLinkClick\" v-if=\"activationHint\">\n\t\t\t\t\t<span v-html=\"activationHint\"></span>&nbsp;\n\t\t\t\t</n8n-text>\n\t\t\t\t<n8n-link\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tv-if=\"activationHint && executionsHelp\"\n\t\t\t\t\t@click=\"expandExecutionHelp\"\n\t\t\t\t\t>{{ $locale.baseText('ndv.trigger.moreInfo') }}</n8n-link\n\t\t\t\t>\n\t\t\t\t<n8n-info-accordion\n\t\t\t\t\tref=\"help\"\n\t\t\t\t\tv-if=\"executionsHelp\"\n\t\t\t\t\t:class=\"$style.accordion\"\n\t\t\t\t\t:title=\"$locale.baseText('ndv.trigger.executionsHint.question')\"\n\t\t\t\t\t:description=\"executionsHelp\"\n\t\t\t\t\t:eventBus=\"executionsHelpEventBus\"\n\t\t\t\t\t@click:body=\"onLinkClick\"\n\t\t\t\t></n8n-info-accordion>\n\t\t\t</div>\n\t\t</transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tWORKFLOW_SETTINGS_MODAL_KEY,\n\tFORM_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport NodeExecuteButton from '@/components/NodeExecuteButton.vue';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport CopyInput from '@/components/CopyInput.vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { N8nInfoAccordion } from 'n8n-design-system';\nimport { createEventBus } from 'n8n-design-system/utils';\n\ntype HelpRef = InstanceType<typeof N8nInfoAccordion>;\n\nexport default defineComponent({\n\tname: 'TriggerPanel',\n\tmixins: [workflowHelpers, copyPaste],\n\tcomponents: {\n\t\tNodeExecuteButton,\n\t\tCopyInput,\n\t\tNodeIcon,\n\t},\n\tdata: () => {\n\t\treturn {\n\t\t\texecutionsHelpEventBus: createEventBus(),\n\t\t};\n\t},\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\tsessionId: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName as string);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tserviceName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\treturn getTriggerNodeServiceName(this.nodeType);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.node && this.node.type === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\twebhookHttpMethod(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn this.getWebhookExpressionValue(this.nodeType.webhooks[0], 'httpMethod');\n\t\t},\n\t\twebhookTestUrl(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn this.getWebhookUrl(this.nodeType.webhooks[0], this.node, 'test');\n\t\t},\n\t\tisWebhookBasedNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.webhooks?.length);\n\t\t},\n\t\tisPollingNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.polling);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isWebhookBasedNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisActivelyPolling(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\n\t\t\treturn this.workflowRunning && this.isPollingNode && this.nodeName === triggeredNode;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\treturn this.workflowsStore.isWorkflowActive;\n\t\t},\n\t\tlisteningTitle(): string {\n\t\t\treturn this.nodeType?.name === FORM_TRIGGER_NODE_TYPE\n\t\t\t\t? this.$locale.baseText('ndv.trigger.webhookNode.formTrigger.listening')\n\t\t\t\t: this.$locale.baseText('ndv.trigger.webhookNode.listening');\n\t\t},\n\t\tlisteningHint(): string {\n\t\t\treturn this.nodeType?.name === FORM_TRIGGER_NODE_TYPE\n\t\t\t\t? this.$locale.baseText('ndv.trigger.webhookBasedNode.formTrigger.serviceHint')\n\t\t\t\t: this.$locale.baseText('ndv.trigger.webhookBasedNode.serviceHint', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t });\n\t\t},\n\t\theader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingEvent');\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel && typeof this.nodeType.triggerPanel.header === 'string') {\n\t\t\t\treturn this.nodeType.triggerPanel.header;\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.action', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tsubheader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingHint', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\texecutionsHelp(): string {\n\t\t\tif (this.nodeType?.triggerPanel?.executionsHelp !== undefined) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.executionsHelp === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp;\n\t\t\t\t}\n\t\t\t\tif (!this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.inactive) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.inactive;\n\t\t\t\t}\n\t\t\t\tif (this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.active) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tactivationHint(): string {\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel?.activationHint) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.activationHint === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!this.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.inactive === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.inactive;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.active === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t},\n\tmethods: {\n\t\texpandExecutionHelp() {\n\t\t\tif (this.$refs.help) {\n\t\t\t\tthis.executionsHelpEventBus.emit('expand');\n\t\t\t}\n\t\t},\n\t\tonLinkClick(e: MouseEvent) {\n\t\t\tif (!e.target) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tif (target.localName !== 'a') return;\n\n\t\t\tif (target.dataset?.key) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (target.dataset.key === 'activate') {\n\t\t\t\t\tthis.$emit('activate');\n\t\t\t\t} else if (target.dataset.key === 'executions') {\n\t\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\t\tpane: 'input',\n\t\t\t\t\t\ttype: 'open-executions-log',\n\t\t\t\t\t});\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\tname: VIEWS.EXECUTIONS,\n\t\t\t\t\t});\n\t\t\t\t} else if (target.dataset.key === 'settings') {\n\t\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonTestLinkCopied() {\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'inputs',\n\t\t\t\ttype: 'test url',\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-background-base);\n\tdisplay: flex;\n\tflex-direction: column;\n\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\toverflow: hidden;\n\n\t> * {\n\t\twidth: 100%;\n\t}\n}\n\n.header {\n\tmargin-bottom: var(--spacing-s);\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.action {\n\tmargin-bottom: var(--spacing-2xl);\n}\n\n.shake {\n\tanimation: shake 8s infinite;\n}\n\n@keyframes shake {\n\t90% {\n\t\ttransform: translateX(0);\n\t}\n\t92.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t95% {\n\t\ttransform: translateX(-6px);\n\t}\n\t97.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t100% {\n\t\ttransform: translateX(0);\n\t}\n}\n\n.accordion {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.fade-enter-active,\n.fade-leave-active {\n\ttransition: opacity 200ms;\n}\n.fade-enter,\n.fade-leave-to {\n\topacity: 0;\n}\n</style>\n","<template>\n\t<el-dialog\n\t\t:modelValue=\"(!!activeNode || renaming) && !isActiveStickyNode\"\n\t\t:before-close=\"close\"\n\t\t:show-close=\"false\"\n\t\tclass=\"data-display-wrapper ndv-wrapper\"\n\t\toverlay-class=\"data-display-overlay\"\n\t\twidth=\"auto\"\n\t\tappend-to-body\n\t\tdata-test-id=\"ndv\"\n\t\t:data-has-output-connection=\"hasOutputConnection\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"bottom-start\"\n\t\t\t:visible=\"showTriggerWaitingWarning\"\n\t\t\t:disabled=\"!showTriggerWaitingWarning\"\n\t\t>\n\t\t\t<template #content>\n\t\t\t\t<div :class=\"$style.triggerWarning\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas.waitingForTriggerWarning') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<div :class=\"$style.backToCanvas\" @click=\"close\" data-test-id=\"back-to-canvas\">\n\t\t\t\t<n8n-icon icon=\"arrow-left\" color=\"text-xlight\" size=\"medium\" />\n\t\t\t\t<n8n-text color=\"text-xlight\" size=\"medium\" :bold=\"true\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\n\t\t<div\n\t\t\tv-if=\"activeNode\"\n\t\t\tclass=\"data-display\"\n\t\t\tref=\"container\"\n\t\t\t@keydown.capture=\"onKeyDown\"\n\t\t\ttabindex=\"0\"\n\t\t>\n\t\t\t<div @click=\"close\" :class=\"$style.modalBackground\"></div>\n\t\t\t<NDVDraggablePanels\n\t\t\t\t:isTriggerNode=\"isTriggerNode\"\n\t\t\t\t:hideInputAndOutput=\"activeNodeType === null\"\n\t\t\t\t:position=\"isTriggerNode && !showTriggerPanel ? 0 : undefined\"\n\t\t\t\t:isDraggable=\"!isTriggerNode\"\n\t\t\t\t:hasDoubleWidth=\"activeNodeType?.parameterPane === 'wide'\"\n\t\t\t\t:nodeType=\"activeNodeType\"\n\t\t\t\t:key=\"activeNode.name\"\n\t\t\t\t@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t\t@close=\"close\"\n\t\t\t\t@init=\"onPanelsInit\"\n\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t>\n\t\t\t\t<template #input v-if=\"showTriggerPanel || !isTriggerNode\">\n\t\t\t\t\t<TriggerPanel\n\t\t\t\t\t\tv-if=\"showTriggerPanel\"\n\t\t\t\t\t\t:nodeName=\"activeNode.name\"\n\t\t\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t/>\n\t\t\t\t\t<InputPanel\n\t\t\t\t\t\tv-else-if=\"!isTriggerNode\"\n\t\t\t\t\t\t:workflow=\"workflow\"\n\t\t\t\t\t\t:canLinkRuns=\"canLinkRuns\"\n\t\t\t\t\t\t:runIndex=\"inputRun\"\n\t\t\t\t\t\t:linkedRuns=\"linked\"\n\t\t\t\t\t\t:currentNodeName=\"inputNodeName\"\n\t\t\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t\t\t\t:readOnly=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:isPaneActive=\"isInputPaneActive\"\n\t\t\t\t\t\t@activatePane=\"activateInputPane\"\n\t\t\t\t\t\t@linkRun=\"onLinkRunToInput\"\n\t\t\t\t\t\t@unlinkRun=\"() => onUnlinkRun('input')\"\n\t\t\t\t\t\t@runChange=\"onRunInputIndexChange\"\n\t\t\t\t\t\t@openSettings=\"openSettings\"\n\t\t\t\t\t\t@changeInputNode=\"onInputNodeChange\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@tableMounted=\"onInputTableMounted\"\n\t\t\t\t\t\t@itemHover=\"onInputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #output>\n\t\t\t\t\t<OutputPanel\n\t\t\t\t\t\tdata-test-id=\"output-panel\"\n\t\t\t\t\t\t:canLinkRuns=\"canLinkRuns\"\n\t\t\t\t\t\t:runIndex=\"outputRun\"\n\t\t\t\t\t\t:linkedRuns=\"linked\"\n\t\t\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t\t\t\t:isReadOnly=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:blockUI=\"blockUi && isTriggerNode && !isExecutableTriggerNode\"\n\t\t\t\t\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:isPaneActive=\"isOutputPaneActive\"\n\t\t\t\t\t\t@activatePane=\"activateOutputPane\"\n\t\t\t\t\t\t@linkRun=\"onLinkRunToOutput\"\n\t\t\t\t\t\t@unlinkRun=\"() => onUnlinkRun('output')\"\n\t\t\t\t\t\t@runChange=\"onRunOutputIndexChange\"\n\t\t\t\t\t\t@openSettings=\"openSettings\"\n\t\t\t\t\t\t@tableMounted=\"onOutputTableMounted\"\n\t\t\t\t\t\t@itemHover=\"onOutputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #main>\n\t\t\t\t\t<NodeSettings\n\t\t\t\t\t\t:eventBus=\"settingsEventBus\"\n\t\t\t\t\t\t:dragging=\"isDragging\"\n\t\t\t\t\t\t:sessionId=\"sessionId\"\n\t\t\t\t\t\t:nodeType=\"activeNodeType\"\n\t\t\t\t\t\t:foreignCredentials=\"foreignCredentials\"\n\t\t\t\t\t\t:readOnly=\"readOnly\"\n\t\t\t\t\t\t:blockUI=\"blockUi && showTriggerPanel\"\n\t\t\t\t\t\t:executable=\"!readOnly\"\n\t\t\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stopExecution=\"onStopExecution\"\n\t\t\t\t\t\t@redrawRequired=\"redrawRequired = true\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t/>\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"featureRequestUrl\"\n\t\t\t\t\t\t@click=\"onFeatureRequestClick\"\n\t\t\t\t\t\t:class=\"$style.featureRequest\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<font-awesome-icon icon=\"lightbulb\" />\n\t\t\t\t\t\t{{ $locale.baseText('ndv.featureRequest') }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t</NDVDraggablePanels>\n\t\t</div>\n\t</el-dialog>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport type {\n\tINodeConnections,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n\tWorkflow,\n} from 'n8n-workflow';\nimport { jsonParse, NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type { IExecutionResponse, INodeUi, IUpdateInformation, TargetItem } from '@/Interface';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\n\nimport NodeSettings from '@/components/NodeSettings.vue';\nimport NDVDraggablePanels from './NDVDraggablePanels.vue';\n\nimport OutputPanel from './OutputPanel.vue';\nimport InputPanel from './InputPanel.vue';\nimport TriggerPanel from './TriggerPanel.vue';\nimport {\n\tBASE_NODE_SURVEY_URL,\n\tEnterpriseEditionFeature,\n\tEXECUTABLE_TRIGGER_NODE_TYPES,\n\tMODAL_CONFIRM,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n} from '@/constants';\nimport { workflowActivate } from '@/mixins/workflowActivate';\nimport { pinData } from '@/mixins/pinData';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useDeviceSupport } from 'n8n-design-system/composables/useDeviceSupport';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useMessage } from '@/composables/useMessage';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tname: 'NodeDetailsView',\n\tmixins: [workflowHelpers, workflowActivate, pinData],\n\tcomponents: {\n\t\tNodeSettings,\n\t\tInputPanel,\n\t\tOutputPanel,\n\t\tNDVDraggablePanels,\n\t\tTriggerPanel,\n\t},\n\tprops: {\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\trenaming: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props, ctx) {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\t...useDeviceSupport(),\n\t\t\t...useMessage(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowActivate.setup?.(props, ctx),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsettingsEventBus: createEventBus(),\n\t\t\tredrawRequired: false,\n\t\t\trunInputIndex: -1,\n\t\t\trunOutputIndex: -1,\n\t\t\tisLinkingEnabled: true,\n\t\t\tselectedInput: undefined as string | undefined,\n\t\t\ttriggerWaitingWarningEnabled: false,\n\t\t\tisDragging: false,\n\t\t\tmainPanelPosition: 0,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tavgInputRowHeight: 0,\n\t\t\tavgOutputRowHeight: 0,\n\t\t\tisInputPaneActive: false,\n\t\t\tisOutputPaneActive: false,\n\t\t\tisPairedItemHoveringEnabled: true,\n\t\t};\n\t},\n\tmounted() {\n\t\tdataPinningEventBus.on('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tbeforeUnmount() {\n\t\tdataPinningEventBus.off('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore, useSettingsStore),\n\t\tsessionId(): string {\n\t\t\treturn this.ndvStore.sessionId;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tshowTriggerWaitingWarning(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.triggerWaitingWarningEnabled &&\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t!this.activeNodeType.group.includes('trigger') &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowsStore.executionWaitingForWebhook\n\t\t\t);\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tinputNodeName(): string | undefined {\n\t\t\treturn this.selectedInput || this.parentNode;\n\t\t},\n\t\tinputNode(): INodeUi | null {\n\t\t\tif (this.inputNodeName) {\n\t\t\t\treturn this.workflowsStore.getNodeByName(this.inputNodeName);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tshowTriggerPanel(): boolean {\n\t\t\tconst isWebhookBasedNode = !!this.activeNodeType?.webhooks?.length;\n\t\t\tconst isPollingNode = this.activeNodeType?.polling;\n\t\t\tconst override = !!this.activeNodeType?.triggerPanel;\n\t\t\treturn (\n\t\t\t\t!this.readOnly && this.isTriggerNode && (isWebhookBasedNode || isPollingNode || override)\n\t\t\t);\n\t\t},\n\t\tworkflow(): Workflow {\n\t\t\treturn this.getCurrentWorkflow();\n\t\t},\n\t\thasOutputConnection() {\n\t\t\tif (!this.activeNode) return false;\n\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\tthis.activeNode.name,\n\t\t\t) as INodeConnections;\n\n\t\t\t// Check if there's at-least one output connection\n\t\t\treturn (Object.values(outgoingConnections)?.[0]?.[0] ?? []).length > 0;\n\t\t},\n\t\tparentNodes(): string[] {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn (\n\t\t\t\t\tthis.workflow.getParentNodesByDepth(this.activeNode.name, 1).map(({ name }) => name) || []\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\t\tparentNode(): string | undefined {\n\t\t\tconst pinData = this.workflowsStore.getPinData;\n\n\t\t\t// Return the first parent node that contains data\n\t\t\tfor (const parentNodeName of this.parentNodes) {\n\t\t\t\t// Check first for pinned data\n\t\t\t\tif (pinData[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\n\t\t\t\t// Check then the data of the current execution\n\t\t\t\tif (this.workflowRunData?.[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.parentNodes[0];\n\t\t},\n\t\tisExecutableTriggerNode(): boolean {\n\t\t\tif (!this.activeNodeType) return false;\n\n\t\t\treturn EXECUTABLE_TRIGGER_NODE_TYPES.includes(this.activeNodeType.name);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t(this.activeNodeType.group.includes('trigger') ||\n\t\t\t\t\tthis.activeNodeType.name === START_NODE_TYPE)\n\t\t\t);\n\t\t},\n\t\tisActiveStickyNode(): boolean {\n\t\t\treturn !!this.ndvStore.activeNode && this.ndvStore.activeNode.type === STICKY_NODE_TYPE;\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tmaxOutputRun(): number {\n\t\t\tif (this.activeNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.activeNode.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.activeNode.name].length) {\n\t\t\t\treturn runData[this.activeNode.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\toutputRun(): number {\n\t\t\tif (this.runOutputIndex === -1) {\n\t\t\t\treturn this.maxOutputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runOutputIndex, this.maxOutputRun);\n\t\t},\n\t\tmaxInputRun(): number {\n\t\t\tif (this.inputNode === null || this.activeNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst workflowNode = this.workflow.getNode(this.activeNode.name);\n\t\t\tconst outputs = NodeHelpers.getNodeOutputs(this.workflow, workflowNode, this.activeNodeType);\n\n\t\t\tlet node = this.inputNode;\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (outputs.some((output) => output !== NodeConnectionType.Main)) {\n\t\t\t\tnode = this.activeNode;\n\t\t\t}\n\n\t\t\tif (!node || !runData || !runData.hasOwnProperty(node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[node.name].length) {\n\t\t\t\treturn runData[node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tinputRun(): number {\n\t\t\tif (this.isLinkingEnabled && this.maxOutputRun === this.maxInputRun) {\n\t\t\t\treturn this.outputRun;\n\t\t\t}\n\t\t\tif (this.runInputIndex === -1) {\n\t\t\t\treturn this.maxInputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runInputIndex, this.maxInputRun);\n\t\t},\n\t\tcanLinkRuns(): boolean {\n\t\t\treturn this.maxOutputRun > 0 && this.maxOutputRun === this.maxInputRun;\n\t\t},\n\t\tlinked(): boolean {\n\t\t\treturn this.isLinkingEnabled && this.canLinkRuns;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.isTriggerNode ? 0 : 80;\n\t\t},\n\t\tfeatureRequestUrl(): string {\n\t\t\tif (!this.activeNodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn `${BASE_NODE_SURVEY_URL}${this.activeNodeType.name}`;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisWorkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisExecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tblockUi(): boolean {\n\t\t\treturn this.isWorkflowRunning || this.isExecutionWaitingForWebhook;\n\t\t},\n\t\tforeignCredentials(): string[] {\n\t\t\tconst credentials = (this.activeNode || {}).credentials;\n\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\n\t\t\tconst foreignCredentials: string[] = [];\n\t\t\tif (\n\t\t\t\tcredentials &&\n\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t) {\n\t\t\t\tObject.values(credentials).forEach((credential) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\tusedCredentials[credential.id] &&\n\t\t\t\t\t\t!usedCredentials[credential.id].currentUserHasAccess\n\t\t\t\t\t) {\n\t\t\t\t\t\tforeignCredentials.push(credential.id);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn foreignCredentials;\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t},\n\twatch: {\n\t\tactiveNode(node: INodeUi | null, oldNode: INodeUi | null) {\n\t\t\tif (node && node.name !== oldNode?.name && !this.isActiveStickyNode) {\n\t\t\t\tthis.runInputIndex = -1;\n\t\t\t\tthis.runOutputIndex = -1;\n\t\t\t\tthis.isLinkingEnabled = true;\n\t\t\t\tthis.selectedInput = undefined;\n\t\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\t\tthis.avgOutputRowHeight = 0;\n\t\t\t\tthis.avgInputRowHeight = 0;\n\n\t\t\t\tsetTimeout(() => this.ndvStore.setNDVSessionId(), 0);\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeTypeChanged', {\n\t\t\t\t\tnodeSubtitle: this.nodeHelpers.getNodeSubtitle(\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tthis.activeNodeType,\n\t\t\t\t\t\tthis.getCurrentWorkflow(),\n\t\t\t\t\t),\n\t\t\t\t});\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.activeNode) {\n\t\t\t\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\t\t\tthis.activeNode.name,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.$telemetry.track('User opened node modal', {\n\t\t\t\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\t\t\tis_editable: !this.hasForeignCredential,\n\t\t\t\t\t\t\tparameters_pane_position: this.mainPanelPosition,\n\t\t\t\t\t\t\tinput_first_connector_runs: this.maxInputRun,\n\t\t\t\t\t\t\toutput_first_connector_runs: this.maxOutputRun,\n\t\t\t\t\t\t\tselected_view_inputs: this.isTriggerNode\n\t\t\t\t\t\t\t\t? 'trigger'\n\t\t\t\t\t\t\t\t: this.ndvStore.inputPanelDisplayMode,\n\t\t\t\t\t\t\tselected_view_outputs: this.ndvStore.outputPanelDisplayMode,\n\t\t\t\t\t\t\tinput_connectors: this.parentNodes.length,\n\t\t\t\t\t\t\toutput_connectors: outgoingConnections?.main?.length,\n\t\t\t\t\t\t\tinput_displayed_run_index: this.inputRun,\n\t\t\t\t\t\t\toutput_displayed_run_index: this.outputRun,\n\t\t\t\t\t\t\tdata_pinning_tooltip_presented: this.pinDataDiscoveryTooltipVisible,\n\t\t\t\t\t\t\tinput_displayed_row_height_avg: this.avgInputRowHeight,\n\t\t\t\t\t\t\toutput_displayed_row_height_avg: this.avgOutputRowHeight,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 2000); // wait for RunData to mount and present pindata discovery tooltip\n\t\t\t}\n\t\t\tif (window.top && !this.isActiveStickyNode) {\n\t\t\t\twindow.top.postMessage(JSON.stringify({ command: node ? 'openNDV' : 'closeNDV' }), '*');\n\t\t\t}\n\t\t},\n\t\tmaxOutputRun() {\n\t\t\tthis.runOutputIndex = -1;\n\t\t},\n\t\tmaxInputRun() {\n\t\t\tthis.runInputIndex = -1;\n\t\t},\n\t\tinputNodeName(nodeName: string | undefined) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputNodeName(nodeName);\n\t\t\t}, 0);\n\t\t},\n\t\tinputRun() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputRunIndex(this.inputRun);\n\t\t\t}, 0);\n\t\t},\n\t},\n\tmethods: {\n\t\tsetIsTooltipVisible({ isTooltipVisible }: { isTooltipVisible: boolean }) {\n\t\t\tthis.pinDataDiscoveryTooltipVisible = isTooltipVisible;\n\t\t},\n\t\tonKeyDown(e: KeyboardEvent) {\n\t\t\tif (e.key === 's' && this.isCtrlKeyPressed(e)) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.readOnly) return;\n\n\t\t\t\tthis.$emit('saveKeyboardShortcut', e);\n\t\t\t}\n\t\t},\n\t\tonInputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.inputNodeName || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.inputNodeName,\n\t\t\t\trunIndex: this.inputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonOutputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.activeNode || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.activeNode.name,\n\t\t\t\trunIndex: this.outputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonInputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgInputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonOutputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgOutputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.activateCurrentWorkflow('ndv');\n\t\t\t}, 1000);\n\t\t},\n\t\tonFeatureRequestClick() {\n\t\t\twindow.open(this.featureRequestUrl, '_blank');\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tsession_id: this.sessionId,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'i-wish-this-node-would',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonPanelsInit(e: { position: number }) {\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragStart(e: { position: number }) {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragEnd(e: { windowWidth: number; position: number }) {\n\t\t\tthis.isDragging = false;\n\t\t\tthis.$telemetry.track('User moved parameters pane', {\n\t\t\t\twindow_width: e.windowWidth,\n\t\t\t\tstart_position: this.mainPanelPosition,\n\t\t\t\tend_position: e.position,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonLinkRunToInput() {\n\t\t\tthis.runOutputIndex = this.runInputIndex;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('input');\n\t\t},\n\t\tonLinkRunToOutput() {\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('output');\n\t\t},\n\t\tonUnlinkRun(pane: string) {\n\t\t\tthis.runInputIndex = this.runOutputIndex;\n\t\t\tthis.isLinkingEnabled = false;\n\t\t\tthis.trackLinking(pane);\n\t\t},\n\t\ttrackLinking(pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run linking', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tlinked: this.linked,\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!this.activeNode || !this.workflowRunning) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.triggerWaitingWarningEnabled = true;\n\t\t\t}, 1000);\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.settingsEventBus.emit('openSettings');\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tthis.$emit('valueChanged', parameterData);\n\t\t},\n\t\tnodeTypeSelected(nodeTypeName: string) {\n\t\t\tthis.$emit('nodeTypeSelected', nodeTypeName);\n\t\t},\n\t\tasync onSwitchSelectedNode(nodeTypeName: string) {\n\t\t\tthis.$emit('switchSelectedNode', nodeTypeName);\n\t\t},\n\t\tasync close() {\n\t\t\tif (this.isDragging) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\t(typeof this.activeNodeType?.outputs === 'string' ||\n\t\t\t\t\ttypeof this.activeNodeType?.inputs === 'string' ||\n\t\t\t\t\tthis.redrawRequired)\n\t\t\t) {\n\t\t\t\t// TODO: We should keep track of if it actually changed and only do if required\n\t\t\t\t// Whenever a node with custom inputs and outputs gets closed redraw it in case\n\t\t\t\t// they changed\n\t\t\t\tconst nodeName = this.activeNode.name;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.$emit('redrawNode', nodeName);\n\t\t\t\t}, 1);\n\t\t\t}\n\n\t\t\tif (this.outputPanelEditMode.enabled && this.activeNode) {\n\t\t\t\tconst shouldPinDataBeforeClosing = await this.confirm(\n\t\t\t\t\t'',\n\t\t\t\t\tthis.$locale.baseText('ndv.pinData.beforeClosing.title'),\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.beforeClosing.confirm'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('ndv.pinData.beforeClosing.cancel'),\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (shouldPinDataBeforeClosing === MODAL_CONFIRM) {\n\t\t\t\t\tconst { value } = this.outputPanelEditMode;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.setPinData(this.activeNode, jsonParse(value), 'on-ndv-close-modal');\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\t}\n\n\t\t\tawait this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\tthis.$telemetry.track('User closed node modal', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tthis.ndvStore.resetNDVSessionId();\n\t\t},\n\t\tonRunOutputIndexChange(run: number) {\n\t\t\tthis.runOutputIndex = run;\n\t\t\tthis.trackRunChange(run, 'output');\n\t\t},\n\t\tonRunInputIndexChange(run: number) {\n\t\t\tthis.runInputIndex = run;\n\t\t\tif (this.linked) {\n\t\t\t\tthis.runOutputIndex = run;\n\t\t\t}\n\t\t\tthis.trackRunChange(run, 'input');\n\t\t},\n\t\ttrackRunChange(run: number, pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run dropdown', {\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\trun_index: run,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonInputNodeChange(value: string, index: number) {\n\t\t\tthis.runInputIndex = -1;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.selectedInput = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv input dropdown', {\n\t\t\t\tnode_type: this.activeNode ? this.activeNode.type : '',\n\t\t\t\tsession_id: this.sessionId,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tselection_value: index,\n\t\t\t\tinput_node_type: this.inputNode ? this.inputNode.type : '',\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\tactivateInputPane() {\n\t\t\tthis.isInputPaneActive = true;\n\t\t\tthis.isOutputPaneActive = false;\n\t\t},\n\t\tactivateOutputPane() {\n\t\t\tthis.isInputPaneActive = false;\n\t\t\tthis.isOutputPaneActive = true;\n\t\t},\n\t\tonSearch(search: string) {\n\t\t\tthis.isPairedItemHoveringEnabled = !search;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n// Hide notice(.ndv-connection-hint-notice) warning when node has output connection\n[data-has-output-connection='true'] .ndv-connection-hint-notice {\n\tdisplay: none;\n}\n.ndv-wrapper {\n\toverflow: visible;\n\tmargin-top: 0;\n}\n\n.data-display-wrapper {\n\theight: calc(100% - var(--spacing-2xl));\n\tmargin-top: var(--spacing-xl) !important;\n\twidth: 100%;\n\tbackground: none;\n\tborder: none;\n\n\t.el-dialog__header {\n\t\tpadding: 0 !important;\n\t}\n\n\t.el-dialog__body {\n\t\tpadding: 0 !important;\n\t\theight: 100%;\n\t\tmin-height: 400px;\n\t\toverflow: visible;\n\t\tborder-radius: 8px;\n\t}\n}\n\n.data-display {\n\theight: 100%;\n\twidth: 100%;\n\tdisplay: flex;\n}\n</style>\n\n<style lang=\"scss\" module>\n$main-panel-width: 360px;\n\n.modalBackground {\n\theight: 100%;\n\twidth: 100%;\n}\n\n.triggerWarning {\n\tmax-width: 180px;\n}\n\n.backToCanvas {\n\tposition: fixed;\n\ttop: var(--spacing-xs);\n\tleft: var(--spacing-l);\n\n\tspan {\n\t\tcolor: var(--color-ndv-back-font);\n\t}\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n\n\t> * {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n@media (min-width: $breakpoint-lg) {\n\t.backToCanvas {\n\t\ttop: var(--spacing-xs);\n\t\tleft: var(--spacing-m);\n\t}\n}\n\n.featureRequest {\n\tposition: absolute;\n\tbottom: var(--spacing-4xs);\n\tleft: calc(100% + var(--spacing-s));\n\tcolor: var(--color-feature-request-font);\n\tfont-size: var(--font-size-2xs);\n\twhite-space: nowrap;\n\n\t* {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { N8nActionDropdown } from 'n8n-design-system';\nimport type { INode } from 'n8n-workflow';\nimport { watch, ref } from 'vue';\n\nconst contextMenu = useContextMenu();\nconst { position, isOpen, actions, target } = contextMenu;\nconst dropdown = ref<InstanceType<typeof N8nActionDropdown>>();\nconst emit = defineEmits<{ (event: 'action', action: ContextMenuAction, nodes: INode[]): void }>();\n\nwatch(\n\tisOpen,\n\t() => {\n\t\tif (isOpen) {\n\t\t\tdropdown.value?.open();\n\t\t} else {\n\t\t\tdropdown.value?.close();\n\t\t}\n\t},\n\t{ flush: 'post' },\n);\n\nfunction onActionSelect(item: string) {\n\tconst action = item as ContextMenuAction;\n\tcontextMenu._dispatchAction(action);\n\temit('action', action, contextMenu.targetNodes.value);\n}\n\nfunction onVisibleChange(open: boolean) {\n\tif (!open) {\n\t\tcontextMenu.close();\n\t}\n}\n</script>\n\n<template>\n\t<Teleport v-if=\"isOpen\" to=\"body\">\n\t\t<div\n\t\t\t:class=\"$style.contextMenu\"\n\t\t\t:style=\"{\n\t\t\t\tleft: `${position[0]}px`,\n\t\t\t\ttop: `${position[1]}px`,\n\t\t\t}\"\n\t\t>\n\t\t\t<n8n-action-dropdown\n\t\t\t\tref=\"dropdown\"\n\t\t\t\t:items=\"actions\"\n\t\t\t\tplacement=\"bottom-start\"\n\t\t\t\tdata-test-id=\"context-menu\"\n\t\t\t\t:hideArrow=\"target.source !== 'node-button'\"\n\t\t\t\t@select=\"onActionSelect\"\n\t\t\t\t@visibleChange=\"onVisibleChange\"\n\t\t\t>\n\t\t\t\t<template #activator>\n\t\t\t\t\t<div :class=\"$style.activator\"></div>\n\t\t\t\t</template>\n\t\t\t</n8n-action-dropdown>\n\t\t</div>\n\t</Teleport>\n</template>\n\n<style module lang=\"scss\">\n.contextMenu {\n\tposition: fixed;\n}\n\n.activator {\n\tpointer-events: none;\n\topacity: 0;\n}\n</style>\n","import { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport type { INodeUi } from '@/Interface';\nimport { deviceSupportHelpers } from '@/mixins/deviceSupportHelpers';\nimport {\n\tNO_OP_NODE_TYPE,\n\tNODE_CONNECTION_TYPE_ALLOW_MULTIPLE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNODE_MIN_INPUT_ITEMS_COUNT,\n} from '@/constants';\n\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeOutputConfiguration,\n\tWorkflow,\n} from 'n8n-workflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport type { Endpoint, EndpointOptions } from '@jsplumb/core';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport type { EndpointSpec } from '@jsplumb/common';\n\nconst createAddInputEndpointSpec = (\n\tconnectionName: NodeConnectionType,\n\tcolor: string,\n): EndpointSpec => {\n\tconst multiple = NODE_CONNECTION_TYPE_ALLOW_MULTIPLE.includes(connectionName);\n\n\treturn {\n\t\ttype: 'N8nAddInput',\n\t\toptions: {\n\t\t\twidth: 24,\n\t\t\theight: 72,\n\t\t\tcolor,\n\t\t\tmultiple,\n\t\t},\n\t};\n};\n\nconst createDiamondOutputEndpointSpec = (): EndpointSpec => ({\n\ttype: 'Rectangle',\n\toptions: {\n\t\theight: 10,\n\t\twidth: 10,\n\t\tcssClass: 'diamond-output-endpoint',\n\t},\n});\n\nexport const nodeBase = defineComponent({\n\tmixins: [deviceSupportHelpers],\n\tmounted() {\n\t\t// Initialize the node\n\t\tif (this.data !== null) {\n\t\t\ttry {\n\t\t\t\tthis.__addNode(this.data);\n\t\t\t} catch (error) {\n\t\t\t\t// This breaks when new nodes are loaded into store but workflow tab is not currently active\n\t\t\t\t// Shouldn't affect anything\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tinputs: [] as Array<ConnectionTypes | INodeInputConfiguration>,\n\t\t\toutputs: [] as Array<ConnectionTypes | INodeOutputConfiguration>,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useUIStore, useCanvasStore, useWorkflowsStore, useHistoryStore),\n\t\tdata(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tnodeId(): string {\n\t\t\treturn this.data?.id || '';\n\t\t},\n\t},\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t},\n\t\tinstance: {\n\t\t\ttype: Object as PropType<BrowserJsPlumbInstance>,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisActive: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideActions: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdisableSelecting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tshowCustomTooltip: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {\n\t\t\ttype: Object as () => Workflow,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tmethods: {\n\t\t__addEndpointTestingData(endpoint: Endpoint, type: string, inputIndex: number) {\n\t\t\tif (window?.Cypress && 'canvas' in endpoint.endpoint) {\n\t\t\t\tconst canvas = endpoint.endpoint.canvas;\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-name', this.data.name);\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-input-index', inputIndex.toString());\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-type', type);\n\t\t\t}\n\t\t},\n\t\t__addInputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\t// Add Inputs\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tconst inputs: Array<ConnectionTypes | INodeInputConfiguration> =\n\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.data!, nodeTypeData) || [];\n\t\t\tthis.inputs = inputs;\n\n\t\t\tconst sortedInputs = [...inputs];\n\t\t\tsortedInputs.sort((a, b) => {\n\t\t\t\tif (typeof a === 'string') {\n\t\t\t\t\treturn 1;\n\t\t\t\t} else if (typeof b === 'string') {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\n\t\t\t\tif (a.required && !b.required) {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else if (!a.required && b.required) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t});\n\n\t\t\tsortedInputs.forEach((value, i) => {\n\t\t\t\tlet inputConfiguration: INodeInputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\tinputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tinputConfiguration = value;\n\t\t\t\t}\n\n\t\t\t\tconst inputName: ConnectionTypes = inputConfiguration.type;\n\n\t\t\t\tconst rootCategoryInputName =\n\t\t\t\t\tinputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for inputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryInputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(inputName)) {\n\t\t\t\t\ttypeIndexData[inputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[inputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryInputName];\n\t\t\t\tconst typeIndex = typeIndexData[inputName];\n\n\t\t\t\tconst inputsOfSameRootType = inputs.filter((inputData) => {\n\t\t\t\t\tconst thisInputName: string = typeof inputData === 'string' ? inputData : inputData.type;\n\t\t\t\t\treturn inputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisInputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisInputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\tconst nonMainInputs = inputsOfSameRootType.filter((inputData) => {\n\t\t\t\t\treturn inputData !== NodeConnectionType.Main;\n\t\t\t\t});\n\t\t\t\tconst requiredNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && inputData.required;\n\t\t\t\t});\n\t\t\t\tconst optionalNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && !inputData.required;\n\t\t\t\t});\n\t\t\t\tconst spacerIndexes = this.getSpacerIndexes(\n\t\t\t\t\trequiredNonMainInputs.length,\n\t\t\t\t\toptionalNonMainInputs.length,\n\t\t\t\t);\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\tinputName,\n\t\t\t\t\t'input',\n\t\t\t\t\tinputsOfSameRootType.length,\n\t\t\t\t\tspacerIndexes,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(inputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getInputEndpointUUID(this.nodeId, inputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t// We potentially want to change that in the future to allow people to dynamically\n\t\t\t\t\t// activate and deactivate connected nodes\n\t\t\t\t\tmaxConnections: inputConfiguration.maxConnections ?? -1,\n\t\t\t\t\tendpoint: 'Rectangle',\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-foreground-xdark',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-primary',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\tscope: NodeViewUtils.getScope(scope),\n\t\t\t\t\tsource: inputName !== NodeConnectionType.Main,\n\t\t\t\t\ttarget: !this.isReadOnly && inputs.length > 1, // only enabled for nodes with multiple inputs.. otherwise attachment handled by connectionDrag event in NodeView,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'target',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: inputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\tenabled: !this.isReadOnly, // enabled in default case to allow dragging\n\t\t\t\t\tcssClass: 'rect-input-endpoint',\n\t\t\t\t\tdragAllowedWhenFull: true,\n\t\t\t\t\thoverClass: 'rect-input-endpoint-hover',\n\t\t\t\t\t...this.__getInputConnectionStyle(inputName, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance?.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t) as Endpoint;\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'input', typeIndex);\n\t\t\t\tif (inputConfiguration.displayName || nodeTypeData.inputNames?.[i]) {\n\t\t\t\t\t// Apply input names if they got set\n\t\t\t\t\tendpoint.addOverlay(\n\t\t\t\t\t\tNodeViewUtils.getInputNameOverlay(\n\t\t\t\t\t\t\tinputConfiguration.displayName || nodeTypeData.inputNames[i],\n\t\t\t\t\t\t\tinputName,\n\t\t\t\t\t\t\tinputConfiguration.required,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: inputsOfSameRootType.length,\n\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// TODO: Activate again if it makes sense. Currently makes problems when removing\n\t\t\t\t// connection on which the input has a name. It does not get hidden because\n\t\t\t\t// the endpoint to which it connects when letting it go over the node is\n\t\t\t\t// different to the regular one (have different ids). So that seems to make\n\t\t\t\t// problems when hiding the input-name.\n\n\t\t\t\t// if (index === 0 && inputName === NodeConnectionType.Main) {\n\t\t\t\t// \t// Make the first main-input the default one to connect to when connection gets dropped on node\n\t\t\t\t// \tthis.instance.makeTarget(this.nodeId, newEndpointData);\n\t\t\t\t// }\n\t\t\t});\n\t\t\tif (sortedInputs.length === 0) {\n\t\t\t\tthis.instance.manage(this.$refs[this.data.name] as Element);\n\t\t\t}\n\t\t},\n\t\tgetSpacerIndexes(\n\t\t\tleftGroupItemsCount: number,\n\t\t\trightGroupItemsCount: number,\n\t\t\tinsertSpacerBetweenGroups = NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\t\t\tminItemsCount = NODE_MIN_INPUT_ITEMS_COUNT,\n\t\t): number[] {\n\t\t\tconst spacerIndexes = [];\n\n\t\t\tif (leftGroupItemsCount > 0 && rightGroupItemsCount > 0) {\n\t\t\t\tif (insertSpacerBetweenGroups) {\n\t\t\t\t\tspacerIndexes.push(leftGroupItemsCount);\n\t\t\t\t} else if (leftGroupItemsCount + rightGroupItemsCount < minItemsCount) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tleftGroupItemsCount > 0 &&\n\t\t\t\t\tleftGroupItemsCount < minItemsCount &&\n\t\t\t\t\trightGroupItemsCount === 0\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex + leftGroupItemsCount);\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tleftGroupItemsCount === 0 &&\n\t\t\t\t\trightGroupItemsCount > 0 &&\n\t\t\t\t\trightGroupItemsCount < minItemsCount\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn spacerIndexes;\n\t\t},\n\t\t__addOutputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tthis.outputs = NodeHelpers.getNodeOutputs(this.workflow, this.data, nodeTypeData) || [];\n\n\t\t\t// TODO: There are still a lot of references of \"main\" in NodesView and\n\t\t\t// other locations. So assume there will be more problems\n\t\t\tlet maxLabelLength = 0;\n\t\t\tconst outputConfigurations: INodeOutputConfiguration[] = [];\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tlet outputConfiguration: INodeOutputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\toutputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\toutputConfiguration = value;\n\t\t\t\t}\n\t\t\t\tif (nodeTypeData.outputNames?.[i]) {\n\t\t\t\t\toutputConfiguration.displayName = nodeTypeData.outputNames[i];\n\t\t\t\t}\n\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\tmaxLabelLength =\n\t\t\t\t\t\toutputConfiguration.displayName.length > maxLabelLength\n\t\t\t\t\t\t\t? outputConfiguration.displayName.length\n\t\t\t\t\t\t\t: maxLabelLength;\n\t\t\t\t}\n\n\t\t\t\toutputConfigurations.push(outputConfiguration);\n\t\t\t});\n\n\t\t\tconst endpointLabelLength = maxLabelLength < 4 ? 'short' : 'medium';\n\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tconst outputConfiguration = outputConfigurations[i];\n\n\t\t\t\tconst outputName: ConnectionTypes = outputConfiguration.type;\n\n\t\t\t\tconst rootCategoryOutputName =\n\t\t\t\t\toutputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for outputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryOutputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(outputName)) {\n\t\t\t\t\ttypeIndexData[outputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[outputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryOutputName];\n\t\t\t\tconst typeIndex = typeIndexData[outputName];\n\n\t\t\t\tconst outputsOfSameRootType = this.outputs.filter((outputData) => {\n\t\t\t\t\tconst thisOutputName: string =\n\t\t\t\t\t\ttypeof outputData === 'string' ? outputData : outputData.type;\n\t\t\t\t\treturn outputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisOutputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisOutputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\toutputName,\n\t\t\t\t\t'output',\n\t\t\t\t\toutputsOfSameRootType.length,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(outputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\tendpoint: {\n\t\t\t\t\t\ttype: 'Dot',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tradius: nodeTypeData && outputsOfSameRootType.length > 2 ? 7 : 9,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(nodeTypeData, '--color-primary'),\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: true,\n\t\t\t\t\ttarget: outputName !== NodeConnectionType.Main,\n\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\thoverClass: 'dot-output-endpoint-hover',\n\t\t\t\t\tconnectionsDirected: true,\n\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t...this.__getOutputConnectionStyle(outputName, outputConfiguration, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t);\n\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'output', typeIndex);\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\t// Apply output names if they got set\n\t\t\t\t\tconst overlaySpec = NodeViewUtils.getOutputNameOverlay(\n\t\t\t\t\t\toutputConfiguration.displayName,\n\t\t\t\t\t\toutputName,\n\t\t\t\t\t\toutputConfiguration?.category,\n\t\t\t\t\t);\n\t\t\t\t\tendpoint.addOverlay(overlaySpec);\n\t\t\t\t}\n\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\n\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (!this.isReadOnly && outputName === NodeConnectionType.Main) {\n\t\t\t\t\tconst plusEndpointData: EndpointOptions = {\n\t\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\t\tendpoint: {\n\t\t\t\t\t\t\ttype: 'N8nPlus',\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tdimensions: 24,\n\t\t\t\t\t\t\t\tconnectedEndpoint: endpoint,\n\t\t\t\t\t\t\t\tshowOutputLabel: this.outputs.length === 1,\n\t\t\t\t\t\t\t\tsize: this.outputs.length >= 3 ? 'small' : 'medium',\n\t\t\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t\t\t\thoverMessage: this.$locale.baseText('nodeBase.clickToAddNodeOrDragToConnect'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsource: true,\n\t\t\t\t\t\ttarget: false,\n\t\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\thoverPaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tparameters: {\n\t\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tcategory: outputConfiguration?.category,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: 'plus-draggable-endpoint',\n\t\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (outputConfiguration?.category) {\n\t\t\t\t\t\tplusEndpointData.cssClass = `${plusEndpointData.cssClass} ${outputConfiguration?.category}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst plusEndpoint = this.instance.addEndpoint(\n\t\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\t\tplusEndpointData,\n\t\t\t\t\t);\n\t\t\t\t\tthis.__addEndpointTestingData(plusEndpoint, 'plus', typeIndex);\n\n\t\t\t\t\tif (!Array.isArray(plusEndpoint)) {\n\t\t\t\t\t\tplusEndpoint.__meta = {\n\t\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t__addNode(node: INodeUi) {\n\t\t\tconst nodeTypeData = (this.nodeTypesStore.getNodeType(node.type, node.typeVersion) ??\n\t\t\t\tthis.nodeTypesStore.getNodeType(NO_OP_NODE_TYPE)) as INodeTypeDescription;\n\n\t\t\tthis.__addInputEndpoints(node, nodeTypeData);\n\t\t\tthis.__addOutputEndpoints(node, nodeTypeData);\n\t\t},\n\t\t__getEndpointColor(connectionType: ConnectionTypes) {\n\t\t\treturn `--node-type-${connectionType}-color`;\n\t\t},\n\t\t__getInputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createAddInputEndpointSpec(\n\t\t\t\t\tconnectionName as NodeConnectionType,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\t__getOutputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\toutputConfiguration: INodeOutputConfiguration,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tconst type = 'output';\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createDiamondOutputEndpointSpec(),\n\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\tif (outputConfiguration.category === 'error') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\t...NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfill: 'var(--node-error-output-color)',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t),\n\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\ttouchEnd(e: MouseEvent) {\n\t\t\tif (this.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmouseLeftClick(e: MouseEvent) {\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\t\t\tfor (let index = 0; index < path.length; index++) {\n\t\t\t\tif (\n\t\t\t\t\tpath[index].className &&\n\t\t\t\t\ttypeof path[index].className === 'string' &&\n\t\t\t\t\tpath[index].className.includes('no-select-on-click')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!this.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.isCtrlKeyPressed(e)) {\n\t\t\t\t\t\tthis.$emit('deselectAllNodes');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.uiStore.isNodeSelected(this.data.name)) {\n\t\t\t\t\t\tthis.$emit('deselectNode', this.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$emit('nodeSelected', this.name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n","<template>\n\t<div\n\t\t:class=\"nodeWrapperClass\"\n\t\t:style=\"nodeWrapperStyles\"\n\t\t:id=\"nodeId\"\n\t\tdata-test-id=\"canvas-node\"\n\t\t:ref=\"data.name\"\n\t\t:data-name=\"data.name\"\n\t\t@contextmenu=\"(e: MouseEvent) => openContextMenu(e, 'node-right-click')\"\n\t>\n\t\t<div class=\"select-background\" v-show=\"isSelected\"></div>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'node-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': isTouchDevice,\n\t\t\t\t'menu-open': isContextMenuOpen,\n\t\t\t\t'disable-pointer-events': disablePointerEvents,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\t:class=\"nodeClass\"\n\t\t\t\t:style=\"nodeStyle\"\n\t\t\t\t@click.left=\"onClick\"\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t>\n\t\t\t\t<i class=\"trigger-icon\" v-if=\"isTriggerNode\">\n\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<span v-html=\"$locale.baseText('node.thisIsATriggerNode')\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<font-awesome-icon icon=\"bolt\" size=\"lg\" />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</i>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"!data.disabled\"\n\t\t\t\t\t:class=\"{ 'node-info-icon': true, 'shift-icon': shiftOutputCount }\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"hasIssues && !hideNodeIssues\" class=\"node-issues\" data-test-id=\"node-issues\">\n\t\t\t\t\t\t<n8n-tooltip :show-after=\"500\" placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<titled-list :title=\"`${$locale.baseText('node.issues')}:`\" :items=\"nodeIssues\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else-if=\"waiting || nodeExecutionStatus === 'waiting'\" class=\"waiting\">\n\t\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<div v-text=\"waiting\"></div>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<font-awesome-icon icon=\"clock\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span v-else-if=\"showPinnedDataInfo\" class=\"node-pin-data-icon\">\n\t\t\t\t\t\t<font-awesome-icon icon=\"thumbtack\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"nodeExecutionStatus === 'unknown'\">\n\t\t\t\t\t\t<!-- Do nothing, unknown means the node never executed -->\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"workflowDataItems\" class=\"data-count\">\n\t\t\t\t\t\t<font-awesome-icon icon=\"check\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-executing-info\" :title=\"$locale.baseText('node.nodeIsExecuting')\">\n\t\t\t\t\t<font-awesome-icon icon=\"sync-alt\" spin />\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-trigger-tooltip__wrapper\">\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:show-after=\"500\"\n\t\t\t\t\t\t:visible=\"showTriggerNodeTooltip\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<div v-text=\"getTriggerNodeTooltip\"></div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tv-if=\"isTriggerNode\"\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:visible=\"pinDataDiscoveryTooltipVisible\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t{{ $locale.baseText('node.discovery.pinData.canvas') }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</div>\n\n\t\t\t\t<NodeIcon\n\t\t\t\t\tclass=\"node-icon\"\n\t\t\t\t\t:nodeType=\"nodeType\"\n\t\t\t\t\t:size=\"40\"\n\t\t\t\t\t:shrink=\"false\"\n\t\t\t\t\t:colorDefault=\"iconColorDefault\"\n\t\t\t\t\t:disabled=\"this.data.disabled\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div class=\"node-options no-select-on-click\" v-if=\"!isReadOnly\" v-show=\"!hideActions\">\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"execute-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"play\"\n\t\t\t\t\t:disabled=\"workflowRunning || isConfigNode\"\n\t\t\t\t\t:title=\"$locale.baseText('node.executeNode')\"\n\t\t\t\t\t@click=\"executeNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"overflow-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"ellipsis-h\"\n\t\t\t\t\t@click=\"(e: MouseEvent) => openContextMenu(e, 'node-button')\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\t:class=\"{\n\t\t\t\t\t'disabled-linethrough': true,\n\t\t\t\t\tsuccess: !['unknown'].includes(nodeExecutionStatus) && workflowDataItems > 0,\n\t\t\t\t}\"\n\t\t\t\tv-if=\"showDisabledLinethrough\"\n\t\t\t></div>\n\t\t</div>\n\t\t<div class=\"node-description\">\n\t\t\t<div class=\"node-name\" :title=\"nodeTitle\">\n\t\t\t\t<p data-test-id=\"canvas-node-box-title\">\n\t\t\t\t\t{{ nodeTitle }}\n\t\t\t\t</p>\n\t\t\t\t<p v-if=\"data.disabled\">({{ $locale.baseText('node.disabled') }})</p>\n\t\t\t</div>\n\t\t\t<div v-if=\"nodeSubtitle !== undefined\" class=\"node-subtitle\" :title=\"nodeSubtitle\">\n\t\t\t\t{{ nodeSubtitle }}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport {\n\tCUSTOM_API_CALL_KEY,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNOT_DUPLICATABE_NODE_TYPES,\n\tWAIT_TIME_UNLIMITED,\n} from '@/constants';\nimport { nodeBase } from '@/mixins/nodeBase';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport { pinData } from '@/mixins/pinData';\nimport type {\n\tConnectionTypes,\n\tIExecutionsSummary,\n\tINodeInputConfiguration,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tITaskData,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { NodeConnectionType, NodeHelpers } from 'n8n-workflow';\n\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport TitledList from '@/components/TitledList.vue';\n\nimport { get } from 'lodash-es';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport type { INodeUi, XYPosition } from '@/Interface';\nimport { debounceHelper } from '@/mixins/debounce';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { EnableNodeToggleCommand } from '@/models/history';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { type ContextMenuTarget, useContextMenu } from '@/composables/useContextMenu';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tname: 'Node',\n\tsetup() {\n\t\tconst contextMenu = useContextMenu();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn { contextMenu, externalHooks, nodeHelpers };\n\t},\n\tmixins: [nodeBase, workflowHelpers, pinData, debounceHelper],\n\tcomponents: {\n\t\tTitledList,\n\t\tFontAwesomeIcon,\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tdisablePointerEvents: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\thideNodeIssues: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tshowPinnedDataInfo(): boolean {\n\t\t\treturn this.hasPinData && !this.isProductionExecutionPreview;\n\t\t},\n\t\tisDuplicatable(): boolean {\n\t\t\tif (!this.nodeType) return true;\n\t\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(this.nodeType.name)) return false;\n\t\t\treturn (\n\t\t\t\tthis.nodeType.maxNodes === undefined || this.sameTypeNodes.length < this.nodeType.maxNodes\n\t\t\t);\n\t\t},\n\t\tisScheduledGroup(): boolean {\n\t\t\treturn this.nodeType?.group.includes('schedule') === true;\n\t\t},\n\t\ticonColorDefault(): string | undefined {\n\t\t\tif (this.isConfigNode) {\n\t\t\t\treturn 'var(--color-text-base)';\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tnodeRunData(): ITaskData[] {\n\t\t\treturn this.workflowsStore.getWorkflowResultDataByNodeName(this.data?.name || '') || [];\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\tif (\n\t\t\t\tthis.nodeExecutionStatus &&\n\t\t\t\t['crashed', 'error', 'failed'].includes(this.nodeExecutionStatus)\n\t\t\t)\n\t\t\t\treturn true;\n\t\t\tif (this.hasPinData) return false;\n\t\t\tif (this.data?.issues !== undefined && Object.keys(this.data.issues).length) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowDataItems(): number {\n\t\t\tconst workflowResultDataNode = this.nodeRunData;\n\t\t\tif (workflowResultDataNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn workflowResultDataNode.length;\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tgetTriggerNodeTooltip(): string | undefined {\n\t\t\tif (this.nodeType !== null && this.nodeType.hasOwnProperty('eventTriggerDescription')) {\n\t\t\t\tconst nodeName = this.$locale.shortNodeType(this.nodeType.name);\n\t\t\t\tconst { eventTriggerDescription } = this.nodeType;\n\t\t\t\treturn this.$locale\n\t\t\t\t\t.nodeText()\n\t\t\t\t\t.eventTriggerDescription(nodeName, eventTriggerDescription || '');\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('node.waitingForYouToCreateAnEventIn', {\n\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\tnodeType: this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '',\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisExecuting(): boolean {\n\t\t\treturn this.workflowsStore.isNodeExecuting(this.data.name);\n\t\t},\n\t\tisSingleActiveTriggerNode(): boolean {\n\t\t\tconst nodes = this.workflowsStore.workflowTriggerNodes.filter((node: INodeUi) => {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\treturn nodeType && nodeType.eventTriggerDescription !== '' && !node.disabled;\n\t\t\t});\n\n\t\t\treturn nodes.length === 1;\n\t\t},\n\t\tisManualTypeNode(): boolean {\n\t\t\treturn this.data.type === MANUAL_TRIGGER_NODE_TYPE;\n\t\t},\n\t\tisConfigNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isConfigNode(this.workflow, this.data, this.data?.type ?? '');\n\t\t},\n\t\tisConfigurableNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isConfigurableNode(\n\t\t\t\tthis.workflow,\n\t\t\t\tthis.data,\n\t\t\t\tthis.data?.type ?? '',\n\t\t\t);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.data?.type || '');\n\t\t},\n\t\tisTriggerNodeTooltipEmpty(): boolean {\n\t\t\treturn this.nodeType !== null ? this.nodeType.eventTriggerDescription === '' : false;\n\t\t},\n\t\tisNodeDisabled(): boolean | undefined {\n\t\t\treturn this.node && this.node.disabled;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | undefined {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.nodesByName[this.name] as INodeUi | undefined;\n\t\t},\n\t\tsameTypeNodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node: INodeUi) => node.type === this.data.type);\n\t\t},\n\t\tnodeWrapperClass(): object {\n\t\t\tconst classes = {\n\t\t\t\t'node-wrapper': true,\n\t\t\t\t'node-wrapper--trigger': this.isTriggerNode,\n\t\t\t\t'node-wrapper--configurable': this.isConfigurableNode,\n\t\t\t\t'node-wrapper--config': this.isConfigNode,\n\t\t\t};\n\n\t\t\tif (this.outputs.length) {\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(this.outputs);\n\t\t\t\tconst otherOutputs = outputTypes.filter(\n\t\t\t\t\t(outputName) => outputName !== NodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t\tif (otherOutputs.length) {\n\t\t\t\t\totherOutputs.forEach((outputName) => {\n\t\t\t\t\t\tclasses[`node-wrapper--connection-type-${outputName}`] = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn classes;\n\t\t},\n\t\tnodeWrapperStyles(): object {\n\t\t\tconst styles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t};\n\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst inputs =\n\t\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.node, this.nodeType) ||\n\t\t\t\t\t([] as Array<ConnectionTypes | INodeInputConfiguration>);\n\t\t\t\tconst inputTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tconst nonMainInputs = inputTypes.filter((input) => input !== NodeConnectionType.Main);\n\t\t\t\tif (nonMainInputs.length) {\n\t\t\t\t\tconst requiredNonMainInputs = inputs.filter(\n\t\t\t\t\t\t(input) => typeof input !== 'string' && input.required,\n\t\t\t\t\t);\n\n\t\t\t\t\tlet spacerCount = 0;\n\t\t\t\t\tif (NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS) {\n\t\t\t\t\t\tconst requiredNonMainInputsCount = requiredNonMainInputs.length;\n\t\t\t\t\t\tconst optionalNonMainInputsCount = nonMainInputs.length - requiredNonMainInputsCount;\n\t\t\t\t\t\tspacerCount = requiredNonMainInputsCount > 0 && optionalNonMainInputsCount > 0 ? 1 : 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tstyles['--configurable-node-input-count'] = nonMainInputs.length + spacerCount;\n\t\t\t\t}\n\n\t\t\t\tlet outputs = [] as Array<ConnectionTypes | INodeOutputConfiguration>;\n\t\t\t\tif (this.workflow.nodes[this.node.name]) {\n\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.workflow, this.node, this.nodeType);\n\t\t\t\t}\n\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\n\t\t\t\tconst mainOutputs = outputTypes.filter((output) => output === NodeConnectionType.Main);\n\t\t\t\tstyles['--node-main-output-count'] = mainOutputs.length;\n\t\t\t}\n\n\t\t\treturn styles;\n\t\t},\n\t\tnodeClass(): object {\n\t\t\treturn {\n\t\t\t\t'node-box': true,\n\t\t\t\tdisabled: this.data.disabled,\n\t\t\t\texecuting: this.isExecuting,\n\t\t\t};\n\t\t},\n\t\tnodeExecutionStatus(): string {\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\treturn nodeExecutionRunData.filter(Boolean)[0].executionStatus ?? '';\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t\tnodeIssues(): string[] {\n\t\t\tconst issues: string[] = [];\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\tnodeExecutionRunData.forEach((executionRunData) => {\n\t\t\t\t\tif (executionRunData?.error) {\n\t\t\t\t\t\tissues.push(\n\t\t\t\t\t\t\t`${executionRunData.error.message}${\n\t\t\t\t\t\t\t\texecutionRunData.error.description ? ` (${executionRunData.error.description})` : ''\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.data?.issues !== undefined) {\n\t\t\t\tissues.push(...NodeHelpers.nodeIssuesToString(this.data.issues, this.data));\n\t\t\t}\n\t\t\treturn issues;\n\t\t},\n\t\tnodeDisabledIcon(): string {\n\t\t\tif (this.data.disabled === false) {\n\t\t\t\treturn 'pause';\n\t\t\t} else {\n\t\t\t\treturn 'play';\n\t\t\t}\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\treturn this.node ? this.node.position : [0, 0];\n\t\t},\n\t\tshowDisabledLinethrough(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.isConfigurableNode &&\n\t\t\t\t!!(this.data.disabled && this.inputs.length === 1 && this.outputs.length === 1)\n\t\t\t);\n\t\t},\n\t\tshortNodeType(): string {\n\t\t\treturn this.$locale.shortNodeType(this.data.type);\n\t\t},\n\t\tnodeTitle(): string {\n\t\t\tif (this.data.name === 'Start') {\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: 'headers.start.displayName',\n\t\t\t\t\tfallback: 'Start',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn this.data.name;\n\t\t},\n\t\twaiting(): string | undefined {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution as IExecutionsSummary;\n\n\t\t\tif (workflowExecution?.waitTill) {\n\t\t\t\tconst lastNodeExecuted = get(workflowExecution, 'data.resultData.lastNodeExecuted');\n\t\t\t\tif (this.name === lastNodeExecuted) {\n\t\t\t\t\tconst waitDate = new Date(workflowExecution.waitTill);\n\t\t\t\t\tif (waitDate.toISOString() === WAIT_TIME_UNLIMITED) {\n\t\t\t\t\t\treturn this.$locale.baseText(\n\t\t\t\t\t\t\t'node.theNodeIsWaitingIndefinitelyForAnIncomingWebhookCall',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.$locale.baseText('node.nodeIsWaitingTill', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdate: waitDate.toLocaleDateString(),\n\t\t\t\t\t\t\ttime: waitDate.toLocaleTimeString(),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tnodeStyle(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\n\t\t\tlet borderColor = '--color-foreground-xdark';\n\n\t\t\tif (this.isConfigurableNode || this.isConfigNode) {\n\t\t\t\tborderColor = '--color-foreground-dark';\n\t\t\t}\n\n\t\t\tif (this.data.disabled) {\n\t\t\t\tborderColor = '--color-foreground-base';\n\t\t\t} else if (!this.isExecuting) {\n\t\t\t\tif (this.hasIssues && !this.hideNodeIssues) {\n\t\t\t\t\t// Do not set red border if there is an issue with the configuration node\n\t\t\t\t\tif (\n\t\t\t\t\t\t(this.nodeRunData?.[0]?.error as NodeOperationError)?.functionality !==\n\t\t\t\t\t\t'configuration-node'\n\t\t\t\t\t) {\n\t\t\t\t\t\tborderColor = '--color-danger';\n\t\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\t}\n\t\t\t\t} else if (this.waiting || this.showPinnedDataInfo) {\n\t\t\t\t\tborderColor = '--color-canvas-node-pinned-border';\n\t\t\t\t} else if (this.nodeExecutionStatus === 'unknown') {\n\t\t\t\t\tborderColor = '--color-foreground-xdark';\n\t\t\t\t} else if (this.workflowDataItems) {\n\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\tborderColor = '--color-success';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnStyles['border-color'] = `var(${borderColor})`;\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tshiftOutputCount(): boolean {\n\t\t\treturn !!(this.nodeType && this.outputs.length > 2);\n\t\t},\n\t\tshouldShowTriggerTooltip(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isPollingTypeNode &&\n\t\t\t\t!this.hasPinData &&\n\t\t\t\t!this.isNodeDisabled &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowDataItems === 0 &&\n\t\t\t\tthis.isSingleActiveTriggerNode &&\n\t\t\t\t!this.isTriggerNodeTooltipEmpty &&\n\t\t\t\t!this.hasIssues &&\n\t\t\t\t!this.dragging\n\t\t\t);\n\t\t},\n\t\tisContextMenuOpen(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.contextMenu.isOpen.value &&\n\t\t\t\tthis.contextMenu.target.value.source === 'node-button' &&\n\t\t\t\tthis.contextMenu.target.value.node.name === this.data?.name\n\t\t\t);\n\t\t},\n\t},\n\twatch: {\n\t\tisActive(newValue, oldValue) {\n\t\t\tif (!newValue && oldValue) {\n\t\t\t\tthis.setSubtitle();\n\t\t\t}\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\tif (this.showTriggerNodeTooltip) {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 200);\n\t\t\t}\n\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t},\n\t\tshouldShowTriggerTooltip(shouldShowTriggerTooltip) {\n\t\t\tif (shouldShowTriggerTooltip) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 2500);\n\t\t\t} else {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t}\n\t\t},\n\t\tnodeRunData(newValue) {\n\t\t\tif (!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$emit('run', { name: this.data.name, data: newValue, waiting: !!this.waiting });\n\t\t},\n\t},\n\tcreated() {\n\t\tconst hasSeenPinDataTooltip = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value;\n\t\tif (!hasSeenPinDataTooltip) {\n\t\t\tthis.unwatchWorkflowDataItems = this.$watch('workflowDataItems', (dataItemsCount: number) => {\n\t\t\t\tthis.showPinDataDiscoveryTooltip(dataItemsCount);\n\t\t\t});\n\t\t}\n\t},\n\tmounted() {\n\t\tsetTimeout(() => {\n\t\t\tthis.setSubtitle();\n\t\t}, 0);\n\t\tif (this.nodeRunData) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('run', {\n\t\t\t\t\tname: this.data && this.data.name,\n\t\t\t\t\tdata: this.nodeRunData,\n\t\t\t\t\twaiting: !!this.waiting,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisTouchActive: false,\n\t\t\tnodeSubtitle: '',\n\t\t\tshowTriggerNodeTooltip: false,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tdragging: false,\n\t\t\tunwatchWorkflowDataItems: () => {},\n\t\t};\n\t},\n\tmethods: {\n\t\tshowPinDataDiscoveryTooltip(dataItemsCount: number): void {\n\t\t\tif (\n\t\t\t\t!this.isTriggerNode ||\n\t\t\t\tthis.isManualTypeNode ||\n\t\t\t\tthis.isScheduledGroup ||\n\t\t\t\tthis.uiStore.isModalActive ||\n\t\t\t\tdataItemsCount === 0\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\n\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\tthis.unwatchWorkflowDataItems();\n\t\t},\n\t\tsetSubtitle() {\n\t\t\t// why is this not a computed property? because it's a very expensive operation\n\t\t\t// it requires expressions to resolve each subtitle...\n\t\t\t// and ends up bogging down the UI with big workflows, for example when pasting a workflow or even opening a node...\n\t\t\t// so we only update it when necessary (when node is mounted and when it's opened and closed (isActive))\n\t\t\ttry {\n\t\t\t\tconst nodeSubtitle =\n\t\t\t\t\tthis.nodeHelpers.getNodeSubtitle(this.data, this.nodeType, this.workflow) || '';\n\n\t\t\t\tthis.nodeSubtitle = nodeSubtitle.includes(CUSTOM_API_CALL_KEY) ? '' : nodeSubtitle;\n\t\t\t} catch (e) {\n\t\t\t\t// avoid breaking UI if expression error occurs\n\t\t\t}\n\t\t},\n\t\tdisableNode() {\n\t\t\tif (this.data !== null) {\n\t\t\t\tthis.nodeHelpers.disableNodes([this.data]);\n\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\tnew EnableNodeToggleCommand(\n\t\t\t\t\t\tthis.data.name,\n\t\t\t\t\t\t!this.data.disabled,\n\t\t\t\t\t\tthis.data.disabled === true,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\t\tnode_type: this.data.type,\n\t\t\t\t\tbutton_name: 'disable',\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\texecuteNode() {\n\t\t\tthis.$emit('runWorkflow', this.data.name, 'Node.executeNode');\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data.type,\n\t\t\t\tbutton_name: 'execute',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\n\t\tonClick(event: MouseEvent) {\n\t\t\tvoid this.callDebounced('onClickDebounced', { debounceTime: 50, trailing: true }, event);\n\t\t},\n\n\t\tonClickDebounced(event: MouseEvent) {\n\t\t\tconst isDoubleClick = event.detail >= 2;\n\t\t\tif (isDoubleClick) {\n\t\t\t\tthis.setNodeActive();\n\t\t\t} else {\n\t\t\t\tthis.mouseLeftClick(event);\n\t\t\t}\n\t\t},\n\n\t\tsetNodeActive() {\n\t\t\tthis.ndvStore.activeNodeName = this.data ? this.data.name : '';\n\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.isTouchDevice === true && !this.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\topenContextMenu(event: MouseEvent, source: ContextMenuTarget['source']) {\n\t\t\tif (this.data) {\n\t\t\t\tthis.contextMenu.open(event, { source, node: this.data });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.context-menu {\n\tposition: absolute;\n}\n\n.node-wrapper {\n\t--node-width: 100px;\n\t/*\n\t\tSet the node height to 100px as a base.\n\t\tIncrease height by 20px for each output beyond the 4th one.\n\t\tmax(0, var(--node-main-output-count, 1) - 4) ensures that we only start counting after the 4th output.\n\t*/\n\t--node-height: calc(100px + max(0, var(--node-main-output-count, 1) - 4) * 20px);\n\n\t--configurable-node-min-input-count: 4;\n\t--configurable-node-input-width: 65px;\n\n\tposition: absolute;\n\twidth: var(--node-width);\n\theight: var(--node-height);\n\n\t.node-description {\n\t\tposition: absolute;\n\t\ttop: var(--node-height);\n\t\tleft: calc(var(--node-width) / 2 * -1);\n\t\tline-height: 1.5;\n\t\ttext-align: center;\n\t\tcursor: default;\n\t\tpadding: 8px;\n\t\twidth: 100%;\n\t\tmin-width: calc(var(--node-width) * 2);\n\t\tpointer-events: none; // prevent container from being draggable\n\n\t\t.node-name > p {\n\t\t\t// must be paragraph tag to have two lines in safari\n\t\t\ttext-overflow: ellipsis;\n\t\t\tdisplay: -webkit-box;\n\t\t\t-webkit-box-orient: vertical;\n\t\t\t-webkit-line-clamp: 2;\n\t\t\toverflow: hidden;\n\t\t\toverflow-wrap: anywhere;\n\t\t\tfont-weight: var(--font-weight-bold);\n\t\t\tline-height: var(--font-line-height-compact);\n\t\t}\n\n\t\t.node-subtitle {\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tfont-weight: 400;\n\t\t\tcolor: $custom-font-light;\n\t\t\tfont-size: 0.8em;\n\t\t}\n\t}\n\n\t.node-default {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tcursor: pointer;\n\t\t&.disable-pointer-events {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.node-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t\tbackground-color: var(--color-canvas-node-background);\n\t\t\t--color-background-node-icon-badge: var(--color-canvas-node-background);\n\t\t\t&.executing {\n\t\t\t\tbackground-color: $node-background-executing !important;\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&.touch-active,\n\t\t&:hover,\n\t\t&.menu-open {\n\t\t\t.node-options {\n\t\t\t\tpointer-events: all;\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t.node-executing-info {\n\t\t\tdisplay: none;\n\t\t\tposition: absolute;\n\t\t\tleft: 0px;\n\t\t\ttop: 0px;\n\t\t\tz-index: 12;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tfont-size: 3.75em;\n\t\t\tline-height: 1.65em;\n\t\t\ttext-align: center;\n\t\t\tcolor: hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.7);\n\t\t}\n\n\t\t.node-icon {\n\t\t\tposition: absolute;\n\t\t\ttop: calc(50% - 20px);\n\t\t\tleft: calc(50% - 20px);\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tposition: absolute;\n\t\t\tbottom: 6px;\n\t\t\tright: 6px;\n\n\t\t\t&.shift-icon {\n\t\t\t\tright: 12px;\n\t\t\t}\n\n\t\t\t.data-count {\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: var(--color-success);\n\t\t\t}\n\n\t\t\t.node-issues {\n\t\t\t\tcolor: var(--color-danger);\n\t\t\t}\n\n\t\t\t.items-count {\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t\tpadding: 0;\n\t\t\t}\n\t\t}\n\n\t\t.node-pin-data-icon {\n\t\t\tcolor: var(--color-secondary);\n\t\t\tmargin-right: 2px;\n\n\t\t\tsvg {\n\t\t\t\theight: 0.85rem;\n\t\t\t}\n\t\t}\n\n\t\t.waiting {\n\t\t\tcolor: var(--color-secondary);\n\t\t}\n\n\t\t.node-options {\n\t\t\t--node-options-height: 26px;\n\t\t\t:deep(.button) {\n\t\t\t\t--button-font-color: var(--color-text-light);\n\t\t\t}\n\t\t\tposition: absolute;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: space-between;\n\t\t\tgap: var(--spacing-2xs);\n\t\t\ttransition: opacity 100ms ease-in;\n\t\t\topacity: 0;\n\t\t\tpointer-events: none;\n\t\t\ttop: calc(-1 * (var(--node-options-height) + var(--spacing-4xs)));\n\t\t\tleft: 0;\n\t\t\twidth: var(--node-width);\n\t\t\theight: var(--node-options-height);\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tz-index: 10;\n\t\t\ttext-align: center;\n\n\t\t\t.option {\n\t\t\t\tdisplay: inline-block;\n\n\t\t\t\t&.touch {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: $color-primary;\n\t\t\t\t}\n\n\t\t\t\t.execute-icon {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\tfont-size: var(----font-size-xl);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&:after {\n\t\t\t\tcontent: '';\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\ttop: -1rem;\n\t\t\t\tbottom: -1rem;\n\t\t\t\tz-index: -1;\n\t\t\t}\n\t\t}\n\n\t\t&.is-touch-device .node-options {\n\t\t\tleft: -25px;\n\t\t\twidth: 150px;\n\n\t\t\t.option.touch {\n\t\t\t\tdisplay: initial;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--config {\n\t\t--configurable-node-input-width: 55px;\n\t\t--node-width: 75px;\n\t\t--node-height: 75px;\n\n\t\t.node-default {\n\t\t\t.node-options {\n\t\t\t\tbackground: color-mix(in srgb, var(--color-canvas-background) 80%, transparent);\n\t\t\t\theight: 25px;\n\t\t\t}\n\n\t\t\t.node-icon {\n\t\t\t\tscale: 0.75;\n\t\t\t}\n\t\t}\n\n\t\t.node-default {\n\t\t\t.node-box {\n\t\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\t\t//background-color: $node-background-type-other;\n\t\t\t\tborder-radius: 50px;\n\n\t\t\t\t&.executing {\n\t\t\t\t\tbackground-color: $node-background-executing-other !important;\n\t\t\t\t}\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tfont-size: 2.85em;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t&.node-wrapper--connection-type-#{$node-type} {\n\t\t\t\t.node-default .node-box {\n\t\t\t\t\tbackground: var(--node-type-#{$node-type}-background);\n\t\t\t\t}\n\n\t\t\t\t.node-description {\n\t\t\t\t\t.node-subtitle {\n\t\t\t\t\t\tcolor: var(--node-type-#{$node-type}-color);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tbottom: 4px !important;\n\t\t\tright: 50% !important;\n\t\t\ttransform: translateX(50%) scale(0.75);\n\t\t}\n\n\t\t&.node-wrapper--configurable {\n\t\t\t--configurable-node-icon-offset: 20px;\n\n\t\t\t.node-info-icon {\n\t\t\t\tbottom: 1px !important;\n\t\t\t\tright: 1px !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--configurable {\n\t\t--node-width: var(\n\t\t\t--configurable-node-width,\n\t\t\tcalc(\n\t\t\t\tmax(var(--configurable-node-input-count, 5), var(--configurable-node-min-input-count)) *\n\t\t\t\t\tvar(--configurable-node-input-width)\n\t\t\t)\n\t\t);\n\t\t--configurable-node-icon-offset: 40px;\n\t\t--configurable-node-icon-size: 30px;\n\n\t\t.node-description {\n\t\t\ttop: calc(50%);\n\t\t\ttransform: translateY(-50%);\n\t\t\tleft: calc(\n\t\t\t\tvar(--configurable-node-icon-offset) + var(--configurable-node-icon-size) + var(--spacing-s)\n\t\t\t);\n\t\t\ttext-align: left;\n\t\t\toverflow: auto;\n\t\t\twhite-space: normal;\n\t\t\tmin-width: unset;\n\t\t\tmax-width: calc(\n\t\t\t\tvar(--node-width) - var(--configurable-node-icon-offset) - var(\n\t\t\t\t\t\t--configurable-node-icon-size\n\t\t\t\t\t) - 2 * var(--spacing-s)\n\t\t\t);\n\t\t\t.node-name > p {\n\t\t\t\tcolor: var(--color-configurable-node-name);\n\t\t\t}\n\t\t}\n\n\t\t.node-default {\n\t\t\t.node-icon {\n\t\t\t\tleft: var(--configurable-node-icon-offset);\n\t\t\t}\n\n\t\t\t.node-options {\n\t\t\t\tleft: 0;\n\t\t\t\theight: 25px;\n\t\t\t}\n\n\t\t\t.node-executing-info {\n\t\t\t\tleft: -67px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--trigger .node-default .node-box {\n\t\tborder-radius: 32px 8px 8px 32px;\n\t}\n\n\t.trigger-icon {\n\t\tposition: absolute;\n\t\tright: 100%;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tmargin: auto;\n\t\tcolor: var(--color-primary);\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: fit-content;\n\t\t// Increase click radius of the bolt icon\n\t\tpadding: var(--spacing-2xs);\n\t}\n}\n\n.select-background {\n\t--node--selected--box-shadow-radius: 8px;\n\n\tdisplay: block;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\tposition: absolute;\n\tleft: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\ttop: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\theight: calc(100% + 2 * var(--node--selected--box-shadow-radius));\n\twidth: calc(100% + 2 * var(--node--selected--box-shadow-radius)) !important;\n\n\t.node-wrapper--trigger & {\n\t\tborder-radius: 36px 8px 8px 36px;\n\t}\n\n\t.node-wrapper--config & {\n\t\t--node--selected--box-shadow-radius: 4px;\n\t\tborder-radius: 60px;\n\t}\n}\n\n.disabled-linethrough {\n\tborder: 1px solid var(--color-foreground-dark);\n\tposition: absolute;\n\ttop: 49px;\n\tleft: -3px;\n\twidth: 111px;\n\tpointer-events: none;\n\n\t&.success {\n\t\tborder-color: var(--color-success-light);\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n.jtk-endpoint {\n\tz-index: 2;\n}\n\n.node-trigger-tooltip {\n\t&__wrapper {\n\t\ttop: -22px;\n\t\tleft: 50px;\n\t\tposition: relative;\n\n\t\t&--item {\n\t\t\tmax-width: 160px;\n\t\t\tposition: fixed;\n\t\t\tz-index: 0 !important;\n\t\t}\n\t}\n}\n.dot-output-endpoint:hover circle {\n\tfill: var(--color-primary);\n}\n/** connector */\n.jtk-connector {\n\tz-index: 3;\n}\n\n.jtk-floating-endpoint {\n\topacity: 0;\n}\n\n.jtk-connector path {\n\ttransition: stroke 0.1s ease-in-out;\n}\n\n.jtk-overlay {\n\tz-index: 3;\n}\n.jtk-connector {\n\tz-index: 4;\n}\n.node-input-endpoint-label,\n.node-output-endpoint-label,\n.connection-run-items-label {\n\tz-index: 5;\n}\n.jtk-connector.jtk-hover {\n\tz-index: 6;\n}\n\n.jtk-endpoint.plus-endpoint {\n\tz-index: 6;\n}\n.jtk-endpoint.dot-output-endpoint {\n\tz-index: 7;\n\toverflow: auto;\n}\n\n.disabled-linethrough {\n\tz-index: 8;\n}\n\n.jtk-drag-active.dot-output-endpoint,\n.jtk-drag-active.rect-input-endpoint {\n\tz-index: 9;\n}\n.rect-input-endpoint > * {\n\tpointer-events: none;\n}\n\n.connection-actions {\n\tz-index: 100;\n}\n\n.node-options {\n\tz-index: 10;\n}\n\n.drop-add-node-label {\n\tz-index: 10;\n}\n\n.jtk-connector.success:not(.jtk-hover) {\n\tpath:not(.jtk-connector-outline) {\n\t\tstroke: var(--color-success-light);\n\t}\n\tpath[jtk-overlay-id='reverse-arrow'],\n\tpath[jtk-overlay-id='endpoint-arrow'],\n\tpath[jtk-overlay-id='midpoint-arrow'] {\n\t\tfill: var(--color-success-light);\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n:root {\n\t--endpoint-size-small: 14px;\n\t--endpoint-size-medium: 18px;\n\t--stalk-size: 40px;\n\t--stalk-switch-size: 60px;\n\t--stalk-success-size: 87px;\n\t--stalk-success-size-without-label: 40px;\n\t--stalk-long-size: 127px;\n\t--plus-endpoint-box-size: 24px;\n\t--plus-endpoint-box-size-small: 17px;\n}\n\n.plus-svg-circle {\n\tz-index: 111;\n\tcircle {\n\t\tstroke: var(--color-foreground-xdark);\n\t\tstroke-width: 2px;\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\n\t&:hover {\n\t\tcircle {\n\t\t\tstroke: var(--color-primary);\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t}\n}\n.plus-stalk {\n\twidth: calc(var(--stalk-size) + 2px);\n\tborder: 1px solid var(--color-foreground-dark);\n\tmargin-left: calc(var(--stalk-size) / 2);\n\tz-index: 3;\n\t&.ep-success {\n\t\tborder-color: var(--color-success-light);\n\n\t\t&:after {\n\t\t\tcontent: attr(data-label);\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 100%;\n\t\t\tmargin: auto;\n\t\t\tmargin-bottom: 2px;\n\t\t\ttext-align: center;\n\n\t\t\tline-height: 1.3em;\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tfont-weight: var(--font-weight-regular);\n\t\t\tcolor: var(--color-success);\n\t\t}\n\t}\n}\n.connection-run-items-label {\n\t// Disable points events so that the label does not block the connection\n\t// mouse over event.\n\tpointer-events: none;\n\tspan {\n\t\tborder-radius: 7px;\n\t\tbackground-color: hsla(\n\t\t\tvar(--color-canvas-background-h),\n\t\t\tvar(--color-canvas-background-s),\n\t\t\tvar(--color-canvas-background-l),\n\t\t\t0.85\n\t\t);\n\t\tline-height: 1.3em;\n\t\tpadding: 0px 3px;\n\t\twhite-space: nowrap;\n\t\tfont-size: var(--font-size-s);\n\t\tfont-weight: var(--font-weight-regular);\n\t\tcolor: var(--color-success);\n\t\tmargin-top: -15px;\n\n\t\t&.floating {\n\t\t\tposition: absolute;\n\t\t\ttop: -6px;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\t}\n}\n\n.connection-input-name-label {\n\tposition: relative;\n\n\tspan {\n\t\tposition: absolute;\n\t\ttop: -10px;\n\t\tleft: -60px;\n\t}\n}\n\n.plus-endpoint {\n\tcursor: pointer;\n\tz-index: 10;\n\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size) / 2) - 1px);\n\tg {\n\t\tfill: var(--color-background-xlight);\n\t\tpointer-events: none;\n\t}\n\n\t&:hover {\n\t\tpath {\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--color-primary);\n\t\t}\n\t}\n\tpath {\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\trect {\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.error {\n\t\tpath {\n\t\t\tfill: var(--node-error-output-color);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--node-error-output-color);\n\t\t}\n\t}\n\n\t&.small {\n\t\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size-small) / 2));\n\t\tg {\n\t\t\ttransform: scale(0.75);\n\t\t\ttransform-origin: center;\n\t\t}\n\t\trect {\n\t\t\tstroke-width: 2.5;\n\t\t}\n\t}\n\t&:hover .plus-container {\n\t\tcolor: var(--color-primary);\n\t\tborder: 2px solid var(--color-primary);\n\t}\n\t&:hover .drop-hover-message {\n\t\tdisplay: block;\n\t}\n\n\t&.hidden {\n\t\tdisplay: none;\n\t}\n}\n\n.diamond-output-endpoint {\n\t--diamond-output-endpoint--transition-duration: 0.15s;\n\n\ttransition: transform var(--diamond-output-endpoint--transition-duration) ease;\n\ttransform: rotate(45deg);\n\tz-index: 10;\n}\n\n.add-input-endpoint {\n\t--add-input-endpoint--transition-duration: 0.15s;\n\n\t&:not(.jtk-endpoint-connected) {\n\t\tcursor: pointer;\n\t}\n\n\t&.add-input-endpoint-multiple {\n\t\tz-index: 100;\n\t\tcursor: pointer;\n\t}\n\n\t&.jtk-endpoint-connected {\n\t\tz-index: 10;\n\t}\n\n\t&.add-input-endpoint-error {\n\t\t--endpoint-svg-color: var(--color-danger);\n\t}\n\n\t.add-input-endpoint-default {\n\t\ttransition: transform var(--add-input-endpoint--transition-duration) ease;\n\t}\n\n\t.add-input-endpoint-diamond {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-line {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xlight);\n\t\tstroke: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-icon {\n\t\tstroke: none;\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-connected-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xdark);\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.rect-input-endpoint-hover {\n\t\t.add-input-endpoint-plus-rectangle {\n\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t}\n\n\t\t.add-input-endpoint-plus-icon {\n\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t}\n\t}\n\n\t&.jtk-endpoint-connected:not(.add-input-endpoint-multiple) {\n\t\t.add-input-endpoint-unconnected {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&.rect-input-endpoint-hover {\n\t\t\t.add-input-endpoint-connected-rectangle {\n\t\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t\t}\n\t\t}\n\t}\n}\n\n.node-input-endpoint-label,\n.node-output-endpoint-label {\n\t--node-endpoint-label--transition-duration: 0.15s;\n\n\tbackground-color: hsla(\n\t\tvar(--color-canvas-background-h),\n\t\tvar(--color-canvas-background-s),\n\t\tvar(--color-canvas-background-l),\n\t\t0.85\n\t);\n\tborder-radius: 7px;\n\tfont-size: 0.7em;\n\tpadding: 2px;\n\twhite-space: nowrap;\n\ttransition: color var(--node-endpoint-label--transition-duration) ease;\n\n\t@each $node-type in $supplemental-node-types {\n\t\t&.node-connection-type-#{$node-type} {\n\t\t\tcolor: var(--node-type-supplemental-label-color);\n\t\t}\n\t}\n}\n\n.node-output-endpoint-label.node-connection-category-error {\n\tcolor: var(--node-error-output-color);\n}\n\n.node-output-endpoint-label {\n\tmargin-left: calc(var(--endpoint-size-small) + var(--spacing-2xs));\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-l) * -1);\n\t\tmargin-left: 0;\n\t}\n\n\t// Some nodes allow for dynamic connection labels\n\t// so we need to make sure the label does not overflow\n\t&.node-connection-type-main[data-endpoint-label-length='medium'] {\n\t\tmax-width: calc(var(--stalk-size) - (var(--endpoint-size-small)));\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\tmargin-left: calc(var(--endpoint-size-small) + var(--spacing-2xs) + 10px);\n\t}\n}\n\n.node-input-endpoint-label {\n\ttext-align: right;\n\tmargin-left: -25px;\n\n\t&--moved {\n\t\tmargin-left: -40px;\n\t}\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-5xs) * -1);\n\t\tmargin-left: 0;\n\t}\n}\n\n.hover-message.jtk-overlay {\n\t--hover-message-width: 110px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-2xs);\n\tline-height: var(--font-line-height-regular);\n\tcolor: var(--color-text-light);\n\twidth: var(--hover-message-width);\n\tmargin-left: calc(\n\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size) +\n\t\t\tvar(--spacing-2xs)\n\t);\n\topacity: 0;\n\tpointer-events: none;\n\t&.small {\n\t\tmargin-left: calc(\n\t\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size-small) +\n\t\t\t\tvar(--spacing-2xs)\n\t\t);\n\t}\n\t&.visible {\n\t\tpointer-events: all;\n\t\topacity: 1;\n\t}\n}\n\n.long-stalk {\n\t--stalk-size: var(--stalk-long-size);\n}\n.ep-success {\n\t--stalk-size: var(--stalk-success-size);\n}\n.ep-success--without-label {\n\t--stalk-size: var(--stalk-success-size-without-label);\n}\n\n[data-endpoint-label-length='medium'] {\n\t--stalk-size: var(--stalk-switch-size);\n}\n</style>\n","<template>\n\t<div\n\t\tclass=\"sticky-wrapper\"\n\t\t:id=\"nodeId\"\n\t\t:ref=\"data.name\"\n\t\t:style=\"stickyPosition\"\n\t\t:data-name=\"data.name\"\n\t\tdata-test-id=\"sticky\"\n\t>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'sticky-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': isTouchDevice,\n\t\t\t\t'is-read-only': isReadOnly,\n\t\t\t}\"\n\t\t\t:style=\"stickySize\"\n\t\t>\n\t\t\t<div class=\"select-sticky-background\" v-show=\"isSelected\" />\n\t\t\t<div\n\t\t\t\tclass=\"sticky-box\"\n\t\t\t\t@click.left=\"mouseLeftClick\"\n\t\t\t\t@contextmenu=\"onContextMenu\"\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t>\n\t\t\t\t<n8n-sticky\n\t\t\t\t\t:modelValue=\"node.parameters.content\"\n\t\t\t\t\t:height=\"node.parameters.height\"\n\t\t\t\t\t:width=\"node.parameters.width\"\n\t\t\t\t\t:scale=\"nodeViewScale\"\n\t\t\t\t\t:backgroundColor=\"node.parameters.color\"\n\t\t\t\t\t:id=\"node.id\"\n\t\t\t\t\t:readOnly=\"isReadOnly\"\n\t\t\t\t\t:defaultText=\"defaultText\"\n\t\t\t\t\t:editMode=\"isActive && !isReadOnly\"\n\t\t\t\t\t:gridSize=\"gridSize\"\n\t\t\t\t\t@edit=\"onEdit\"\n\t\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t\t@resize=\"onResize\"\n\t\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t\t\t@markdown-click=\"onMarkdownClick\"\n\t\t\t\t\t@update:modelValue=\"onInputChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-show=\"showActions\"\n\t\t\t\t:class=\"{ 'sticky-options': true, 'no-select-on-click': true, 'force-show': forceActions }\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-touch:tap=\"deleteNode\"\n\t\t\t\t\tclass=\"option\"\n\t\t\t\t\tdata-test-id=\"delete-sticky\"\n\t\t\t\t\t:title=\"$locale.baseText('node.deleteNode')\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"trash\" />\n\t\t\t\t</div>\n\t\t\t\t<n8n-popover\n\t\t\t\t\teffect=\"dark\"\n\t\t\t\t\t:popper-style=\"{ width: '208px' }\"\n\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t@show=\"onShowPopover\"\n\t\t\t\t\t@hide=\"onHidePopover\"\n\t\t\t\t>\n\t\t\t\t\t<template #reference>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref=\"colorPopoverTrigger\"\n\t\t\t\t\t\t\tclass=\"option\"\n\t\t\t\t\t\t\tdata-test-id=\"change-sticky-color\"\n\t\t\t\t\t\t\t:title=\"$locale.baseText('node.changeColor')\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<font-awesome-icon icon=\"palette\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<div class=\"content\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"color\"\n\t\t\t\t\t\t\tdata-test-id=\"color\"\n\t\t\t\t\t\t\tv-for=\"(_, index) in Array.from({ length: 7 })\"\n\t\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\t\tv-on:click=\"changeColor(index + 1)\"\n\t\t\t\t\t\t\t:class=\"`sticky-color-${index + 1}`\"\n\t\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\t\t'border-width': '1px',\n\t\t\t\t\t\t\t\t'border-style': 'solid',\n\t\t\t\t\t\t\t\t'border-color': 'var(--color-foreground-xdark)',\n\t\t\t\t\t\t\t\t'background-color': `var(--color-sticky-background-${index + 1})`,\n\t\t\t\t\t\t\t\t'box-shadow':\n\t\t\t\t\t\t\t\t\t(index === 0 && node?.parameters.color === '') ||\n\t\t\t\t\t\t\t\t\tindex + 1 === node?.parameters.color\n\t\t\t\t\t\t\t\t\t\t? `0 0 0 1px var(--color-sticky-background-${index + 1})`\n\t\t\t\t\t\t\t\t\t\t: 'none',\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-popover>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport { nodeBase } from '@/mixins/nodeBase';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport { isNumber, isString } from '@/utils/typeGuards';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tXYPosition,\n} from '@/Interface';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { QUICKSTART_NOTE_NAME } from '@/constants';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useContextMenu } from '@/composables/useContextMenu';\n\nexport default defineComponent({\n\tname: 'Sticky',\n\tmixins: [nodeBase, workflowHelpers],\n\tsetup() {\n\t\tconst colorPopoverTrigger = ref<HTMLDivElement>();\n\t\tconst forceActions = ref(false);\n\t\tconst setForceActions = (value: boolean) => {\n\t\t\tforceActions.value = value;\n\t\t};\n\t\tconst contextMenu = useContextMenu((action) => {\n\t\t\tif (action === 'change_color') {\n\t\t\t\tsetForceActions(true);\n\t\t\t\tcolorPopoverTrigger.value?.click();\n\t\t\t}\n\t\t});\n\n\t\treturn { colorPopoverTrigger, contextMenu, forceActions, setForceActions };\n\t},\n\tprops: {\n\t\tnodeViewScale: {\n\t\t\ttype: Number,\n\t\t},\n\t\tgridSize: {\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tdefaultText(): string {\n\t\t\tif (!this.nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconst properties = this.nodeType.properties;\n\t\t\tconst content = properties.find((property) => property.name === 'content');\n\n\t\t\treturn content && isString(content.default) ? content.default : '';\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.node.position;\n\t\t\t} else {\n\t\t\t\treturn [0, 0];\n\t\t\t}\n\t\t},\n\t\theight(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.height) ? this.node.parameters.height : 0;\n\t\t},\n\t\twidth(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.width) ? this.node.parameters.width : 0;\n\t\t},\n\t\tstickySize(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\theight: this.height + 'px',\n\t\t\t\twidth: this.width + 'px',\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tstickyPosition(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t\tzIndex: this.isActive ? 9999999 : -1 * Math.floor((this.height * this.width) / 1000),\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tshowActions(): boolean {\n\t\t\treturn (\n\t\t\t\t!(this.hideActions || this.isReadOnly || this.workflowRunning || this.isResizing) ||\n\t\t\t\tthis.forceActions\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisResizing: false,\n\t\t\tisTouchActive: false,\n\t\t};\n\t},\n\tmethods: {\n\t\tonShowPopover() {\n\t\t\tthis.setForceActions(true);\n\t\t},\n\t\tonHidePopover() {\n\t\t\tthis.setForceActions(false);\n\t\t},\n\t\tasync deleteNode() {\n\t\t\t// Wait a tick else vue causes problems because the data is gone\n\t\t\tawait this.$nextTick();\n\t\t\tthis.$emit('removeNode', this.data.name);\n\t\t},\n\t\tchangeColor(index: number) {\n\t\t\tthis.workflowsStore.updateNodeProperties({\n\t\t\t\tname: this.name,\n\t\t\t\tproperties: { parameters: { ...this.node.parameters, color: index } },\n\t\t\t});\n\t\t},\n\t\tonEdit(edit: boolean) {\n\t\t\tif (edit && !this.isActive && this.node) {\n\t\t\t\tthis.ndvStore.activeNodeName = this.node.name;\n\t\t\t} else if (this.isActive && !edit) {\n\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t}\n\t\t},\n\t\tonMarkdownClick(link: HTMLAnchorElement, event: Event) {\n\t\t\tif (link) {\n\t\t\t\tconst isOnboardingNote = this.name === QUICKSTART_NOTE_NAME;\n\t\t\t\tconst isWelcomeVideo = link.querySelector('img[alt=\"n8n quickstart video\"');\n\t\t\t\tconst type =\n\t\t\t\t\tisOnboardingNote && isWelcomeVideo\n\t\t\t\t\t\t? 'welcome_video'\n\t\t\t\t\t\t: isOnboardingNote && link.getAttribute('href') === '/templates'\n\t\t\t\t\t\t ? 'templates'\n\t\t\t\t\t\t : 'other';\n\n\t\t\t\tthis.$telemetry.track('User clicked note link', { type });\n\t\t\t}\n\t\t},\n\t\tonInputChange(content: string) {\n\t\t\tthis.node.parameters.content = content;\n\t\t\tthis.setParameters({ content });\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.isResizing = true;\n\t\t\tif (!this.isSelected && this.node) {\n\t\t\t\tthis.$emit('nodeSelected', this.node.name, false, true);\n\t\t\t}\n\t\t},\n\t\tonResize({ height, width, dX, dY }: { width: number; height: number; dX: number; dY: number }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (dX !== 0 || dY !== 0) {\n\t\t\t\tthis.setPosition([this.node.position[0] + (dX || 0), this.node.position[1] + (dY || 0)]);\n\t\t\t}\n\n\t\t\tthis.setParameters({ height, width });\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.isResizing = false;\n\t\t},\n\t\tsetParameters(params: { content?: string; height?: number; width?: number; color?: string }) {\n\t\t\tif (this.node) {\n\t\t\t\tconst nodeParameters = {\n\t\t\t\t\tcontent: isString(params.content) ? params.content : this.node.parameters.content,\n\t\t\t\t\theight: isNumber(params.height) ? params.height : this.node.parameters.height,\n\t\t\t\t\twidth: isNumber(params.width) ? params.width : this.node.parameters.width,\n\t\t\t\t\tcolor: isString(params.color) ? params.color : this.node.parameters.color,\n\t\t\t\t};\n\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tkey: this.node.id,\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetPosition(position: XYPosition) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\tname: this.node.name,\n\t\t\t\tproperties: {\n\t\t\t\t\tposition,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.isTouchDevice === true && !this.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\tonContextMenu(e: MouseEvent): void {\n\t\t\tif (this.node) {\n\t\t\t\tthis.contextMenu.open(e, { source: 'node-right-click', node: this.node });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.sticky-wrapper {\n\tposition: absolute;\n\n\t.sticky-default {\n\t\t.sticky-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\n\t\t&.touch-active,\n\t\t&:hover {\n\t\t\t.sticky-options {\n\t\t\t\tdisplay: flex;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\n\t\t&.is-read-only {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.sticky-options {\n\t\t\tdisplay: none;\n\t\t\tjustify-content: flex-start;\n\t\t\tposition: absolute;\n\t\t\ttop: -25px;\n\t\t\tleft: -8px;\n\t\t\theight: 26px;\n\t\t\tfont-size: 0.9em;\n\t\t\ttext-align: left;\n\t\t\tz-index: 10;\n\t\t\tcolor: #aaa;\n\t\t\ttext-align: center;\n\n\t\t\t.option {\n\t\t\t\twidth: 28px;\n\t\t\t\tdisplay: inline-block;\n\n\t\t\t\t&.touch {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: $color-primary;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.force-show {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t&.is-touch-device .sticky-options {\n\t\t\tleft: -25px;\n\t\t\twidth: 150px;\n\n\t\t\t.option.touch {\n\t\t\t\tdisplay: initial;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.select-sticky-background {\n\tdisplay: block;\n\tposition: absolute;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\theight: calc(100% + 16px);\n\twidth: calc(100% + 16px);\n\tleft: -8px;\n\ttop: -8px;\n\tz-index: 0;\n}\n\n.content {\n\tdisplay: flex;\n\tflex-direction: row;\n\twidth: fit-content;\n\tgap: var(--spacing-2xs);\n}\n\n.color {\n\twidth: 20px;\n\theight: 20px;\n\tborder-radius: 50%;\n\tborder-color: var(--color-primary-shade-1);\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n}\n</style>\n","/*\n\tConstants and utility functions used for searching for node types in node creator component\n*/\n\n// based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 30; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -5;\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty\n\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\toutScore += penalty;\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: Readonly<T[]>,\n\tkeys: Array<{ key: string; weight: number }>,\n): Array<{ score: number; item: T }> {\n\tconst results = data.reduce((accu: Array<{ score: number; item: T }>, item: T) => {\n\t\tlet values: Array<{ value: string; weight: number }> = [];\n\t\tkeys.forEach(({ key, weight }) => {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tvalues = values.concat(value.map((v) => ({ value: v, weight })));\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tvalues.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tweight,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// for each item, check every key and get maximum score\n\t\tconst itemMatch = values.reduce(\n\t\t\t(\n\t\t\t\taccu: null | { matched: boolean; outScore: number },\n\t\t\t\t{ value, weight }: { value: string; weight: number },\n\t\t\t) => {\n\t\t\t\tif (!fuzzyMatchSimple(filter, value)) {\n\t\t\t\t\treturn accu;\n\t\t\t\t}\n\n\t\t\t\tconst match = fuzzyMatch(filter, value);\n\t\t\t\tmatch.outScore *= weight;\n\n\t\t\t\tconst { matched, outScore } = match;\n\t\t\t\tif (!accu && matched) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tif (matched && accu && outScore > accu.outScore) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\treturn accu;\n\t\t\t},\n\t\t\tnull,\n\t\t);\n\n\t\tif (itemMatch) {\n\t\t\taccu.push({\n\t\t\t\tscore: itemMatch.outScore,\n\t\t\t\titem,\n\t\t\t});\n\t\t}\n\n\t\treturn accu;\n\t}, []);\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n","import type {\n\tNodeCreateElement,\n\tActionCreateElement,\n\tSubcategorizedNodeTypes,\n\tSimplifiedNodeType,\n\tINodeCreateElement,\n\tSectionCreateElement,\n} from '@/Interface';\nimport { AI_SUBCATEGORY, CORE_NODES_CATEGORY, DEFAULT_SUBCATEGORY } from '@/constants';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { sublimeSearch } from '@/utils/sortUtils';\nimport { i18n } from '@/plugins/i18n';\nimport type { NodeViewItemSection } from './viewsData';\n\nexport function transformNodeType(\n\tnode: SimplifiedNodeType,\n\tsubcategory?: string,\n\ttype: 'node' | 'action' = 'node',\n): NodeCreateElement | ActionCreateElement {\n\tconst createElement = {\n\t\tuuid: uuidv4(),\n\t\tkey: node.name,\n\t\tsubcategory:\n\t\t\tsubcategory ?? node.codex?.subcategories?.[CORE_NODES_CATEGORY]?.[0] ?? DEFAULT_SUBCATEGORY,\n\t\tproperties: {\n\t\t\t...node,\n\t\t},\n\t\ttype,\n\t};\n\n\treturn type === 'action'\n\t\t? (createElement as ActionCreateElement)\n\t\t: (createElement as NodeCreateElement);\n}\n\nexport function subcategorizeItems(items: SimplifiedNodeType[]) {\n\tconst WHITE_LISTED_SUBCATEGORIES = [CORE_NODES_CATEGORY, AI_SUBCATEGORY];\n\treturn items.reduce((acc: SubcategorizedNodeTypes, item) => {\n\t\t// Only some subcategories are allowed\n\t\tlet subcategories: string[] = [DEFAULT_SUBCATEGORY];\n\n\t\tWHITE_LISTED_SUBCATEGORIES.forEach((category) => {\n\t\t\tif (item.codex?.categories?.includes(category)) {\n\t\t\t\tsubcategories = item.codex?.subcategories?.[category] ?? [];\n\t\t\t}\n\t\t});\n\n\t\tsubcategories.forEach((subcategory: string) => {\n\t\t\tif (!acc[subcategory]) {\n\t\t\t\tacc[subcategory] = [];\n\t\t\t}\n\t\t\tacc[subcategory].push(transformNodeType(item, subcategory));\n\t\t});\n\n\t\treturn acc;\n\t}, {});\n}\n\nexport function sortNodeCreateElements(nodes: INodeCreateElement[]) {\n\treturn nodes.sort((a, b) => {\n\t\tif (a.type !== 'node' || b.type !== 'node') return 0;\n\t\tconst displayNameA = a.properties?.displayName?.toLowerCase() || a.key;\n\t\tconst displayNameB = b.properties?.displayName?.toLowerCase() || b.key;\n\n\t\treturn displayNameA.localeCompare(displayNameB, undefined, { sensitivity: 'base' });\n\t});\n}\n\nexport function searchNodes(searchFilter: string, items: INodeCreateElement[]) {\n\t// In order to support the old search we need to remove the 'trigger' part\n\tconst trimmedFilter = searchFilter.toLowerCase().replace('trigger', '').trimEnd();\n\tconst result = (\n\t\tsublimeSearch<INodeCreateElement>(trimmedFilter, items, [\n\t\t\t{ key: 'properties.displayName', weight: 1.3 },\n\t\t\t{ key: 'properties.codex.alias', weight: 1 },\n\t\t]) || []\n\t).map(({ item }) => item);\n\n\treturn result;\n}\n\nexport function flattenCreateElements(items: INodeCreateElement[]): INodeCreateElement[] {\n\treturn items.map((item) => (item.type === 'section' ? item.children : item)).flat();\n}\n\nexport function groupItemsInSections(\n\titems: INodeCreateElement[],\n\tsections: NodeViewItemSection[],\n): INodeCreateElement[] {\n\tconst itemsBySection = items.reduce((acc: Record<string, INodeCreateElement[]>, item) => {\n\t\tconst section = sections.find((s) => s.items.includes(item.key));\n\t\tconst key = section?.key ?? 'other';\n\t\tacc[key] = [...(acc[key] ?? []), item];\n\t\treturn acc;\n\t}, {});\n\n\tconst result: SectionCreateElement[] = sections\n\t\t.map(\n\t\t\t(section): SectionCreateElement => ({\n\t\t\t\ttype: 'section',\n\t\t\t\tkey: section.key,\n\t\t\t\ttitle: section.title,\n\t\t\t\tchildren: sortNodeCreateElements(itemsBySection[section.key] ?? []),\n\t\t\t}),\n\t\t)\n\t\t.concat({\n\t\t\ttype: 'section',\n\t\t\tkey: 'other',\n\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.other'),\n\t\t\tchildren: sortNodeCreateElements(itemsBySection.other ?? []),\n\t\t})\n\t\t.filter((section) => section.children.length > 0);\n\n\tif (result.length <= 1) {\n\t\treturn items;\n\t}\n\n\treturn result;\n}\n","import { defineStore } from 'pinia';\nimport { STORES, TRIGGER_NODE_CREATOR_VIEW } from '@/constants';\nimport type {\n\tNodeFilterType,\n\tNodeCreatorOpenSource,\n\tSimplifiedNodeType,\n\tActionsRecord,\n} from '@/Interface';\n\nimport { computed, ref } from 'vue';\nimport { transformNodeType } from '@/components/Node/NodeCreator/utils';\n\nexport const useNodeCreatorStore = defineStore(STORES.NODE_CREATOR, () => {\n\tconst selectedView = ref<NodeFilterType>(TRIGGER_NODE_CREATOR_VIEW);\n\tconst mergedNodes = ref<SimplifiedNodeType[]>([]);\n\tconst actions = ref<ActionsRecord<typeof mergedNodes.value>>({});\n\n\tconst showScrim = ref(false);\n\tconst openSource = ref<NodeCreatorOpenSource>('');\n\n\tconst allNodeCreatorNodes = computed(() =>\n\t\tObject.values(mergedNodes.value).map((i) => transformNodeType(i)),\n\t);\n\n\tfunction setMergeNodes(nodes: SimplifiedNodeType[]) {\n\t\tmergedNodes.value = nodes;\n\t}\n\n\tfunction setActions(nodes: ActionsRecord<typeof mergedNodes.value>) {\n\t\tactions.value = nodes;\n\t}\n\n\tfunction setShowScrim(isVisible: boolean) {\n\t\tshowScrim.value = isVisible;\n\t}\n\n\tfunction setSelectedView(view: NodeFilterType) {\n\t\tselectedView.value = view;\n\t}\n\n\tfunction setOpenSource(view: NodeCreatorOpenSource) {\n\t\topenSource.value = view;\n\t}\n\n\treturn {\n\t\topenSource,\n\t\tselectedView,\n\t\tshowScrim,\n\t\tmergedNodes,\n\t\tactions,\n\t\tsetShowScrim,\n\t\tsetSelectedView,\n\t\tsetOpenSource,\n\t\tsetActions,\n\t\tsetMergeNodes,\n\t\tallNodeCreatorNodes,\n\t};\n});\n","<template>\n\t<div\n\t\t:class=\"$style.canvasAddButton\"\n\t\t:style=\"containerCssVars\"\n\t\tref=\"container\"\n\t\tdata-test-id=\"canvas-add-button\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"top\"\n\t\t\t:visible=\"showTooltip\"\n\t\t\t:disabled=\"nodeCreatorStore.showScrim\"\n\t\t\t:popper-class=\"$style.tooltip\"\n\t\t\t:show-after=\"700\"\n\t\t>\n\t\t\t<button :class=\"$style.button\" @click=\"$emit('click')\" data-test-id=\"canvas-plus-button\">\n\t\t\t\t<font-awesome-icon icon=\"plus\" size=\"lg\" />\n\t\t\t</button>\n\t\t\t<template #content>\n\t\t\t\t{{ $locale.baseText('nodeView.canvasAddButton.addATriggerNodeBeforeExecuting') }}\n\t\t\t</template>\n\t\t</n8n-tooltip>\n\t\t<p :class=\"$style.label\" v-text=\"$locale.baseText('nodeView.canvasAddButton.addFirstStep')\" />\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { XYPosition } from '@/Interface';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nexport interface Props {\n\tshowTooltip: boolean;\n\tposition: XYPosition;\n}\n\nconst props = defineProps<Props>();\n\nconst nodeCreatorStore = useNodeCreatorStore();\nconst containerCssVars = computed(() => ({\n\t'--trigger-placeholder-left-position': `${props.position[0]}px`,\n\t'--trigger-placeholder-top-position': `${props.position[1]}px`,\n}));\n</script>\n\n<style lang=\"scss\" module>\n.canvasAddButton {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 100px;\n\theight: 100px;\n\tposition: absolute;\n\ttop: var(--trigger-placeholder-top-position);\n\tleft: var(--trigger-placeholder-left-position);\n\t// We have to increase z-index to make sure it's higher than selecting box in NodeView\n\t// otherwise the clics wouldn't register\n\tz-index: 101;\n\n\t&:hover .button svg path {\n\t\tfill: var(--color-primary);\n\t}\n}\n\n.button {\n\tbackground: var(--color-foreground-xlight);\n\tborder: 2px dashed var(--color-foreground-xdark);\n\tborder-radius: 8px;\n\tpadding: 0;\n\n\tmin-width: 100px;\n\tmin-height: 100px;\n\tcursor: pointer;\n\n\tsvg {\n\t\twidth: 26px !important;\n\t\theight: 40px;\n\t\tpath {\n\t\t\tfill: var(--color-foreground-xdark);\n\t\t}\n\t}\n}\n\n.label {\n\twidth: max-content;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-xloose);\n\tcolor: var(--color-text-dark);\n\tmargin-top: var(--spacing-2xs);\n}\n</style>\n","import {\n\tCORE_NODES_CATEGORY,\n\tWEBHOOK_NODE_TYPE,\n\tOTHER_TRIGGER_NODES_SUBCATEGORY,\n\tEXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSCHEDULE_TRIGGER_NODE_TYPE,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tTRANSFORM_DATA_SUBCATEGORY,\n\tFILES_SUBCATEGORY,\n\tFLOWS_CONTROL_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEMAIL_IMAP_NODE_TYPE,\n\tDEFAULT_SUBCATEGORY,\n\tAI_NODE_CREATOR_VIEW,\n\tAI_CATEGORY_AGENTS,\n\tAI_CATEGORY_CHAINS,\n\tAI_CATEGORY_DOCUMENT_LOADERS,\n\tAI_CATEGORY_LANGUAGE_MODELS,\n\tAI_CATEGORY_MEMORY,\n\tAI_CATEGORY_OUTPUTPARSER,\n\tAI_CATEGORY_RETRIEVERS,\n\tAI_CATEGORY_TEXT_SPLITTERS,\n\tAI_CATEGORY_TOOLS,\n\tAI_CATEGORY_VECTOR_STORES,\n\tAI_SUBCATEGORY,\n\tAI_CATEGORY_EMBEDDING,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tAI_UNCATEGORIZED_CATEGORY,\n\tSET_NODE_TYPE,\n\tCODE_NODE_TYPE,\n\tDATETIME_NODE_TYPE,\n\tFILTER_NODE_TYPE,\n\tREMOVE_DUPLICATES_NODE_TYPE,\n\tSPLIT_OUT_NODE_TYPE,\n\tLIMIT_NODE_TYPE,\n\tSUMMARIZE_NODE_TYPE,\n\tAGGREGATE_NODE_TYPE,\n\tMERGE_NODE_TYPE,\n\tHTML_NODE_TYPE,\n\tMARKDOWN_NODE_TYPE,\n\tXML_NODE_TYPE,\n\tCRYPTO_NODE_TYPE,\n\tIF_NODE_TYPE,\n\tSPLIT_IN_BATCHES_NODE_TYPE,\n\tHTTP_REQUEST_NODE_TYPE,\n\tHELPERS_SUBCATEGORY,\n\tRSS_READ_NODE_TYPE,\n\tEMAIL_SEND_NODE_TYPE,\n} from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { SimplifiedNodeType } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\n\nexport interface NodeViewItemSection {\n\tkey: string;\n\ttitle: string;\n\titems: string[];\n}\n\nexport interface NodeViewItem {\n\tkey: string;\n\ttype: string;\n\tproperties: {\n\t\tname?: string;\n\t\ttitle: string;\n\t\ticon: string;\n\t\ticonProps?: {\n\t\t\tcolor?: string;\n\t\t};\n\t\tconnectionType?: NodeConnectionType;\n\t\tpanelClass?: string;\n\t\tgroup?: string[];\n\t\tsections?: NodeViewItemSection[];\n\t\tdescription?: string;\n\t\ttag?: string;\n\t\tforceIncludeNodes?: string[];\n\t};\n\tcategory?: string | string[];\n}\n\ninterface NodeView {\n\tvalue: string;\n\ttitle: string;\n\tinfo?: string;\n\tsubtitle?: string;\n\titems: NodeViewItem[];\n}\n\nfunction getAiNodesBySubcategory(nodes: INodeTypeDescription[], subcategory: string) {\n\treturn nodes\n\t\t.filter((node) => node.codex?.subcategories?.[AI_SUBCATEGORY]?.includes(subcategory))\n\t\t.map((node) => ({\n\t\t\tkey: node.name,\n\t\t\ttype: 'node',\n\t\t\tproperties: {\n\t\t\t\tgroup: [],\n\t\t\t\tname: node.name,\n\t\t\t\tdisplayName: node.displayName,\n\t\t\t\ttitle: node.displayName,\n\t\t\t\tdescription: node.description,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\ticon: node.icon!,\n\t\t\t},\n\t\t}))\n\t\t.sort((a, b) => a.properties.displayName.localeCompare(b.properties.displayName));\n}\n\nexport function AIView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\tconst nodeTypesStore = useNodeTypesStore();\n\n\tconst chainNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_CHAINS);\n\tconst agentNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_AGENTS);\n\n\treturn {\n\t\tvalue: AI_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\tinfo: i18n.baseText('nodeCreator.aiPanel.infoBox'),\n\t\titems: [\n\t\t\t...chainNodes,\n\t\t\t...agentNodes,\n\t\t\t{\n\t\t\t\tkey: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\t\ttype: 'view',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.aiOtherNodesDescription'),\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\nexport function AINodesView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\n\tfunction getAISubcategoryProperties(nodeConnectionType: NodeConnectionType) {\n\t\treturn {\n\t\t\tconnectionType: nodeConnectionType,\n\t\t\ticonProps: {\n\t\t\t\tcolor: `var(--node-type-${nodeConnectionType}-color)`,\n\t\t\t},\n\t\t\tpanelClass: `nodes-list-panel-${nodeConnectionType}`,\n\t\t};\n\t}\n\n\treturn {\n\t\tvalue: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\t\ticon: 'file-import',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiDocument),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\t\ticon: 'language',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiLanguageModel),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_MEMORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_MEMORY,\n\t\t\t\t\ticon: 'brain',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiMemory),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\t\ticon: 'list',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiOutputParser),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_RETRIEVERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_RETRIEVERS,\n\t\t\t\t\ticon: 'search',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiRetriever),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\t\ticon: 'grip-lines-vertical',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTextSplitter),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TOOLS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TOOLS,\n\t\t\t\t\ticon: 'tools',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTool),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_EMBEDDING,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_EMBEDDING,\n\t\t\t\t\ticon: 'vector-square',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiEmbedding),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\t\ticon: 'project-diagram',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiVectorStore),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\t\ticon: 'code',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\n\nexport function TriggerView(nodes: SimplifiedNodeType[]) {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATrigger'),\n\t\tsubtitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATriggerDescription'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\tforceIncludeNodes: [WEBHOOK_NODE_TYPE, EMAIL_IMAP_NODE_TYPE],\n\t\t\t\t\ttitle: 'App Trigger Nodes',\n\t\t\t\t\ticon: 'satellite-dish',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDescription'),\n\t\t\t\t\ticon: 'fa:clock',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: WEBHOOK_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: WEBHOOK_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'webhook',\n\t\t\t\t\t\tfileBuffer: '/static/webhook-icon.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'form',\n\t\t\t\t\t\tfileBuffer: '/static/form-grey.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDescription'),\n\t\t\t\t\ticon: 'fa:mouse-pointer',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDescription'),\n\t\t\t\t\ticon: 'fa:sign-out-alt',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\t\ticon: 'folder-open',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n\n\treturn view;\n}\n\nexport function RegularView(nodes: SimplifiedNodeType[]) {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: REGULAR_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.whatHappensNext'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: 'App Regular Nodes',\n\t\t\t\t\ticon: 'globe',\n\t\t\t\t\tforceIncludeNodes: [RSS_READ_NODE_TYPE, EMAIL_SEND_NODE_TYPE],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\t\ticon: 'pen',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [SET_NODE_TYPE, CODE_NODE_TYPE, DATETIME_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'addOrRemove',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.addOrRemove'),\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\tFILTER_NODE_TYPE,\n\t\t\t\t\t\t\t\tREMOVE_DUPLICATES_NODE_TYPE,\n\t\t\t\t\t\t\t\tSPLIT_OUT_NODE_TYPE,\n\t\t\t\t\t\t\t\tLIMIT_NODE_TYPE,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'combine',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.combine'),\n\t\t\t\t\t\t\titems: [SUMMARIZE_NODE_TYPE, AGGREGATE_NODE_TYPE, MERGE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'convert',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.convert'),\n\t\t\t\t\t\t\titems: [HTML_NODE_TYPE, MARKDOWN_NODE_TYPE, XML_NODE_TYPE, CRYPTO_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\t\ticon: 'code-branch',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [FILTER_NODE_TYPE, IF_NODE_TYPE, SPLIT_IN_BATCHES_NODE_TYPE, MERGE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FILES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FILES_SUBCATEGORY,\n\t\t\t\t\ticon: 'file-alt',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: HELPERS_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: HELPERS_SUBCATEGORY,\n\t\t\t\t\ticon: 'toolbox',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [HTTP_REQUEST_NODE_TYPE, WEBHOOK_NODE_TYPE, CODE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n\n\tconst hasAINodes = (nodes ?? []).some((node) => node.codex?.categories?.includes(AI_SUBCATEGORY));\n\tif (hasAINodes)\n\t\tview.items.push({\n\t\t\tkey: AI_NODE_CREATOR_VIEW,\n\t\t\ttype: 'view',\n\t\t\tproperties: {\n\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.langchainAiNodes'),\n\t\t\t\ticon: 'robot',\n\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.nodesForAi'),\n\t\t\t\ttag: i18n.baseText('nodeCreator.aiPanel.newTag'),\n\t\t\t},\n\t\t});\n\n\tview.items.push({\n\t\tkey: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttype: 'view',\n\t\tproperties: {\n\t\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTrigger'),\n\t\t\ticon: 'bolt',\n\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTriggerDescription'),\n\t\t},\n\t});\n\n\treturn view;\n}\n","import { ref } from 'vue';\nimport { defineStore } from 'pinia';\n\nexport type KeyboardKey = (typeof WATCHED_KEYS)[number];\ninterface KeyHook {\n\tkeyboardKeys: KeyboardKey[];\n\tcondition?: (type: string, activeItemId: string) => boolean;\n\thandler: (activeItemId: string, keyboardKey: KeyboardKey) => void;\n}\n\nexport const KEYBOARD_ID_ATTR = 'data-keyboard-nav-id';\nexport const WATCHED_KEYS = [\n\t'ArrowUp',\n\t'ArrowDown',\n\t'ArrowLeft',\n\t'ArrowRight',\n\t'Enter',\n\t'Escape',\n\t'Tab',\n];\n\nexport const useKeyboardNavigation = defineStore('nodeCreatorKeyboardNavigation', () => {\n\tconst selectableItems = ref<Array<WeakRef<Element>>>([]);\n\tconst activeItemId = ref<string | null>(null);\n\t// Array of objects that contains key code and handler\n\tconst keysHooks = ref<Record<string, KeyHook>>({});\n\n\tfunction getItemType(element?: Element) {\n\t\treturn element?.getAttribute('data-keyboard-nav-type');\n\t}\n\tfunction getElementId(element?: Element) {\n\t\treturn element?.getAttribute(KEYBOARD_ID_ATTR) || undefined;\n\t}\n\tasync function refreshSelectableItems(): Promise<void> {\n\t\treturn new Promise((resolve) => {\n\t\t\t// Wait for DOM to update\n\t\t\tcleanupSelectableItems();\n\t\t\tsetTimeout(() => {\n\t\t\t\tselectableItems.value = Array.from(\n\t\t\t\t\tdocument.querySelectorAll('[data-keyboard-nav-type]'),\n\t\t\t\t).map((el) => new WeakRef(el));\n\t\t\t\tresolve();\n\t\t\t}, 0);\n\t\t});\n\t}\n\n\tfunction executeKeyHooks(keyboardKey: KeyboardKey, activeItem: Element) {\n\t\tconst flatHooks = Object.values(keysHooks.value);\n\t\tconst hooks = flatHooks.filter((hook) => hook.keyboardKeys.includes(keyboardKey));\n\n\t\thooks.forEach((hook) => {\n\t\t\tif (!activeItemId.value) return;\n\n\t\t\tconst conditionPassed =\n\t\t\t\thook.condition === undefined ||\n\t\t\t\thook.condition(getItemType(activeItem) || '', activeItemId.value);\n\n\t\t\tif (conditionPassed && activeItemId.value) {\n\t\t\t\thook.handler(activeItemId.value, keyboardKey);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync function onKeyDown(e: KeyboardEvent) {\n\t\tconst pressedKey = e.key;\n\t\tif (!WATCHED_KEYS.includes(pressedKey)) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tawait refreshSelectableItems();\n\t\tconst activeItemIndex = selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t\tconst activeItem = selectableItems.value[activeItemIndex]?.deref();\n\n\t\tconst isArrowDown = pressedKey === 'ArrowDown';\n\t\tconst isArrowUp = pressedKey === 'ArrowUp';\n\n\t\tif (!activeItem) return;\n\n\t\tif (isArrowDown) {\n\t\t\tconst nextItemIndex =\n\t\t\t\tactiveItemIndex < selectableItems.value.length - 1 ? activeItemIndex + 1 : 0;\n\n\t\t\tsetActiveItem(selectableItems.value[nextItemIndex]?.deref());\n\t\t}\n\t\tif (isArrowUp) {\n\t\t\tconst previousIndex =\n\t\t\t\tactiveItemIndex > 0 ? activeItemIndex - 1 : selectableItems.value.length - 1;\n\n\t\t\tsetActiveItem(selectableItems.value[previousIndex]?.deref());\n\t\t}\n\t\texecuteKeyHooks(pressedKey, activeItem);\n\t}\n\n\tfunction setActiveItemId(id: string) {\n\t\tactiveItemId.value = id;\n\t}\n\n\tfunction setActiveItem(item?: Element) {\n\t\tconst itemId = getElementId(item);\n\t\tif (!itemId) return;\n\n\t\tsetActiveItemId(itemId);\n\t\tif (item?.scrollIntoView) {\n\t\t\titem?.scrollIntoView({ block: 'center' });\n\t\t}\n\t}\n\n\tasync function setActiveItemIndex(index: number) {\n\t\tawait refreshSelectableItems();\n\n\t\tsetActiveItem(selectableItems.value[index]?.deref());\n\t}\n\n\tfunction attachKeydownEvent() {\n\t\tdocument.addEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction detachKeydownEvent() {\n\t\tcleanupSelectableItems();\n\t\tdocument.removeEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction registerKeyHook(name: string, hook: KeyHook) {\n\t\thook.keyboardKeys.forEach((keyboardKey) => {\n\t\t\tif (WATCHED_KEYS.includes(keyboardKey)) {\n\t\t\t\tkeysHooks.value = { ...keysHooks.value, [name]: hook };\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Key ${keyboardKey} is not supported`);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction cleanupSelectableItems() {\n\t\t// Cleanup to make sure DOM elements get garbage collected\n\t\tselectableItems.value = [];\n\t}\n\n\tfunction getActiveItemIndex() {\n\t\treturn selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t}\n\n\treturn {\n\t\tactiveItemId,\n\t\tattachKeydownEvent,\n\t\trefreshSelectableItems,\n\t\tdetachKeydownEvent,\n\t\tregisterKeyHook,\n\t\tgetActiveItemIndex,\n\t\tsetActiveItemId,\n\t\tsetActiveItemIndex,\n\t};\n});\n","import type { INodeCreateElement, NodeFilterType, SimplifiedNodeType } from '@/Interface';\nimport {\n\tAI_CODE_NODE_TYPE,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tDEFAULT_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n} from '@/constants';\nimport { defineStore } from 'pinia';\nimport { v4 as uuid } from 'uuid';\nimport { computed, nextTick, ref } from 'vue';\n\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport {\n\tflattenCreateElements,\n\tgroupItemsInSections,\n\tsearchNodes,\n\tsortNodeCreateElements,\n\tsubcategorizeItems,\n\ttransformNodeType,\n} from '../utils';\n\nimport type { NodeViewItem, NodeViewItemSection } from '@/components/Node/NodeCreator/viewsData';\nimport { AINodesView } from '@/components/Node/NodeCreator/viewsData';\nimport { useI18n } from '@/composables/useI18n';\nimport { useKeyboardNavigation } from './useKeyboardNavigation';\n\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { INodeInputFilter, NodeConnectionType } from 'n8n-workflow';\n\ninterface ViewStack {\n\tuuid?: string;\n\ttitle?: string;\n\tsubtitle?: string;\n\tsearch?: string;\n\tsubcategory?: string;\n\tinfo?: string;\n\tnodeIcon?: {\n\t\ticonType?: string;\n\t\ticon?: string;\n\t\tcolor?: string;\n\t};\n\ticonUrl?: string;\n\trootView?: NodeFilterType;\n\tactiveIndex?: number;\n\ttransitionDirection?: 'in' | 'out';\n\thasSearch?: boolean;\n\tpreventBack?: boolean;\n\titems?: INodeCreateElement[];\n\tbaselineItems?: INodeCreateElement[];\n\tsearchItems?: SimplifiedNodeType[];\n\tforceIncludeNodes?: string[];\n\tmode?: 'actions' | 'nodes';\n\tbaseFilter?: (item: INodeCreateElement) => boolean;\n\titemsMapper?: (item: INodeCreateElement) => INodeCreateElement;\n\tpanelClass?: string;\n\tsections?: NodeViewItemSection[];\n}\n\nexport const useViewStacks = defineStore('nodeCreatorViewStacks', () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst { getActiveItemIndex } = useKeyboardNavigation();\n\n\tconst viewStacks = ref<ViewStack[]>([]);\n\n\tconst activeStackItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\n\t\tif (!stack?.baselineItems) {\n\t\t\treturn stack.items ? extendItemsWithUUID(stack.items) : [];\n\t\t}\n\n\t\tif (stack.search && searchBaseItems.value) {\n\t\t\tconst searchBase =\n\t\t\t\tsearchBaseItems.value.length > 0\n\t\t\t\t\t? searchBaseItems.value\n\t\t\t\t\t: flattenCreateElements(stack.baselineItems ?? []);\n\n\t\t\treturn extendItemsWithUUID(searchNodes(stack.search || '', searchBase));\n\t\t}\n\t\treturn extendItemsWithUUID(stack.baselineItems);\n\t});\n\n\tconst activeViewStack = computed<ViewStack>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack) return {};\n\n\t\tconst flatBaselineItems = flattenCreateElements(stack.baselineItems ?? []);\n\n\t\treturn {\n\t\t\t...stack,\n\t\t\titems: activeStackItems.value,\n\t\t\thasSearch: flatBaselineItems.length > 8 || stack?.hasSearch,\n\t\t};\n\t});\n\n\tconst activeViewStackMode = computed(\n\t\t() => activeViewStack.value.mode || TRIGGER_NODE_CREATOR_VIEW,\n\t);\n\n\tconst searchBaseItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.searchItems) return [];\n\n\t\treturn stack.searchItems.map((item) => transformNodeType(item, stack.subcategory));\n\t});\n\n\t// Generate a delta between the global search results(all nodes) and the stack search results\n\tconst globalSearchItemsDiff = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.search) return [];\n\n\t\tconst allNodes = nodeCreatorStore.mergedNodes.map((item) => transformNodeType(item));\n\t\tconst globalSearchResult = extendItemsWithUUID(searchNodes(stack.search || '', allNodes));\n\n\t\treturn globalSearchResult.filter((item) => {\n\t\t\treturn !activeStackItems.value.find((activeItem) => activeItem.key === item.key);\n\t\t});\n\t});\n\n\tconst itemsBySubcategory = computed(() => subcategorizeItems(nodeCreatorStore.mergedNodes));\n\n\tasync function gotoCompatibleConnectionView(\n\t\tconnectionType: NodeConnectionType,\n\t\tisOutput?: boolean,\n\t\tfilter?: INodeInputFilter,\n\t) {\n\t\tconst i18n = useI18n();\n\n\t\tlet nodesByConnectionType: { [key: string]: string[] };\n\t\tlet relatedAIView: NodeViewItem | { properties: { title: string; icon: string } } | undefined;\n\n\t\tif (isOutput === true) {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByInputConnectionTypeNames;\n\t\t\trelatedAIView = {\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByOutputConnectionTypeNames;\n\n\t\t\trelatedAIView = AINodesView([]).items.find(\n\t\t\t\t(item) => item.properties.connectionType === connectionType,\n\t\t\t);\n\t\t}\n\n\t\tawait nextTick();\n\t\tpushViewStack({\n\t\t\ttitle: relatedAIView?.properties.title,\n\t\t\trootView: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\tmode: 'nodes',\n\t\t\titems: nodeCreatorStore.allNodeCreatorNodes,\n\t\t\tnodeIcon: {\n\t\t\t\ticonType: 'icon',\n\t\t\t\ticon: relatedAIView?.properties.icon,\n\t\t\t\tcolor: relatedAIView?.properties.iconProps?.color,\n\t\t\t},\n\t\t\tpanelClass: relatedAIView?.properties.panelClass,\n\t\t\tbaseFilter: (i: INodeCreateElement) => {\n\t\t\t\t// AI Code node could have any connection type so we don't want to display it\n\t\t\t\t// in the compatible connection view as it would be displayed in all of them\n\t\t\t\tif (i.key === AI_CODE_NODE_TYPE) return false;\n\t\t\t\tconst displayNode = nodesByConnectionType[connectionType].includes(i.key);\n\n\t\t\t\t// TODO: Filtering works currently fine for displaying compatible node when dropping\n\t\t\t\t// input connections. However, it does not work for output connections.\n\t\t\t\t// For that reason does it currently display nodes that are maybe not compatible\n\t\t\t\t// but then errors once it got selected by the user.\n\t\t\t\tif (displayNode && filter?.nodes?.length) {\n\t\t\t\t\treturn filter.nodes.includes(i.key);\n\t\t\t\t}\n\n\t\t\t\treturn displayNode;\n\t\t\t},\n\t\t\titemsMapper(item) {\n\t\t\t\treturn {\n\t\t\t\t\t...item,\n\t\t\t\t\tsubcategory: connectionType,\n\t\t\t\t};\n\t\t\t},\n\t\t\tpreventBack: true,\n\t\t});\n\t}\n\n\tfunction setStackBaselineItems() {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack || !activeViewStack.value.uuid) return;\n\n\t\tlet stackItems = stack?.items ?? [];\n\n\t\tif (!stack?.items) {\n\t\t\tconst subcategory = stack?.subcategory ?? DEFAULT_SUBCATEGORY;\n\t\t\tconst itemsInSubcategory = itemsBySubcategory.value[subcategory];\n\t\t\tconst sections = stack.sections;\n\n\t\t\tif (sections) {\n\t\t\t\tstackItems = groupItemsInSections(itemsInSubcategory, sections);\n\t\t\t} else {\n\t\t\t\tstackItems = itemsInSubcategory;\n\t\t\t}\n\t\t}\n\n\t\t// Ensure that the nodes specified in `stack.forceIncludeNodes` are always included,\n\t\t// regardless of whether the subcategory is matched\n\t\tif ((stack.forceIncludeNodes ?? []).length > 0) {\n\t\t\tconst matchedNodes = nodeCreatorStore.mergedNodes\n\t\t\t\t.filter((item) => stack.forceIncludeNodes?.includes(item.name))\n\t\t\t\t.map((item) => transformNodeType(item, stack.subcategory));\n\n\t\t\tstackItems.push(...matchedNodes);\n\t\t}\n\n\t\tif (stack.baseFilter) {\n\t\t\tstackItems = stackItems.filter(stack.baseFilter);\n\t\t}\n\n\t\tif (stack.itemsMapper) {\n\t\t\tstackItems = stackItems.map(stack.itemsMapper);\n\t\t}\n\n\t\t// Sort only if non-root view\n\t\tif (!stack.items) {\n\t\t\tstackItems = sortNodeCreateElements(stackItems);\n\t\t}\n\n\t\tupdateCurrentViewStack({ baselineItems: stackItems });\n\t}\n\n\tfunction extendItemsWithUUID(items: INodeCreateElement[]) {\n\t\treturn items.map((item) => ({\n\t\t\t...item,\n\t\t\tuuid: `${item.key}-${uuid()}`,\n\t\t}));\n\t}\n\n\tfunction pushViewStack(stack: ViewStack) {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tupdateCurrentViewStack({ activeIndex: getActiveItemIndex() });\n\t\t}\n\n\t\tconst newStackUuid = uuid();\n\t\tviewStacks.value.push({\n\t\t\t...stack,\n\t\t\tuuid: newStackUuid,\n\t\t\ttransitionDirection: 'in',\n\t\t\tactiveIndex: 0,\n\t\t});\n\t\tsetStackBaselineItems();\n\t}\n\n\tfunction popViewStack() {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tviewStacks.value.pop();\n\t\t\tupdateCurrentViewStack({ transitionDirection: 'out' });\n\t\t}\n\t}\n\n\tfunction updateCurrentViewStack(stack: Partial<ViewStack>) {\n\t\tconst currentStack = viewStacks.value[viewStacks.value.length - 1];\n\t\tconst matchedIndex = viewStacks.value.findIndex((s) => s.uuid === currentStack.uuid);\n\t\tif (!currentStack) return;\n\n\t\t// For each key in the stack, update the matched stack\n\t\tObject.keys(stack).forEach((key) => {\n\t\t\tconst typedKey = key as keyof ViewStack;\n\t\t\tviewStacks.value[matchedIndex] = {\n\t\t\t\t...viewStacks.value[matchedIndex],\n\t\t\t\t[key]: stack[typedKey],\n\t\t\t};\n\t\t});\n\t}\n\n\tfunction resetViewStacks() {\n\t\tviewStacks.value = [];\n\t}\n\n\treturn {\n\t\tviewStacks,\n\t\tactiveViewStack,\n\t\tactiveViewStackMode,\n\t\tglobalSearchItemsDiff,\n\t\tgotoCompatibleConnectionView,\n\t\tresetViewStacks,\n\t\tupdateCurrentViewStack,\n\t\tpushViewStack,\n\t\tpopViewStack,\n\t};\n});\n","<template>\n\t<div :class=\"$style['content']\">\n\t\t<div\n\t\t\tclass=\"node-view-root do-not-select\"\n\t\t\tid=\"node-view-root\"\n\t\t\tdata-test-id=\"node-view-root\"\n\t\t\t@dragover=\"onDragOver\"\n\t\t\t@drop=\"onDrop\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"node-view-wrapper\"\n\t\t\t\t:class=\"workflowClasses\"\n\t\t\t\tdata-test-id=\"node-view-wrapper\"\n\t\t\t\t@touchstart=\"mouseDown\"\n\t\t\t\t@touchend=\"mouseUp\"\n\t\t\t\t@touchmove=\"mouseMoveNodeWorkflow\"\n\t\t\t\t@mousedown=\"mouseDown\"\n\t\t\t\tv-touch:tap=\"touchTap\"\n\t\t\t\t@mouseup=\"mouseUp\"\n\t\t\t\t@contextmenu=\"contextMenu.open\"\n\t\t\t\t@wheel=\"canvasStore.wheelScroll\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view-background\"\n\t\t\t\t\tclass=\"node-view-background\"\n\t\t\t\t\t:style=\"backgroundStyle\"\n\t\t\t\t\tdata-test-id=\"node-view-background\"\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view\"\n\t\t\t\t\tclass=\"node-view\"\n\t\t\t\t\t:style=\"workflowStyle\"\n\t\t\t\t\tref=\"nodeView\"\n\t\t\t\t\tdata-test-id=\"node-view\"\n\t\t\t\t>\n\t\t\t\t\t<canvas-add-button\n\t\t\t\t\t\t:style=\"canvasAddButtonStyle\"\n\t\t\t\t\t\t@click=\"showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON)\"\n\t\t\t\t\t\tv-show=\"showCanvasAddButton\"\n\t\t\t\t\t\t:showTooltip=\"!containsTrigger && showTriggerMissingTooltip\"\n\t\t\t\t\t\t:position=\"canvasStore.canvasAddButtonPosition\"\n\t\t\t\t\t\tref=\"canvasAddButton\"\n\t\t\t\t\t\t@hook:mounted=\"canvasStore.setRecenteredCanvasAddButtonPosition\"\n\t\t\t\t\t\tdata-test-id=\"canvas-add-button\"\n\t\t\t\t\t/>\n\t\t\t\t\t<node\n\t\t\t\t\t\tv-for=\"nodeData in nodesToRender\"\n\t\t\t\t\t\t@deselectAllNodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselectNode=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@nodeSelected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@runWorkflow=\"onRunNode\"\n\t\t\t\t\t\t@moved=\"onNodeMoved\"\n\t\t\t\t\t\t@run=\"onNodeRun\"\n\t\t\t\t\t\t:key=\"`${nodeData.id}_node`\"\n\t\t\t\t\t\t:name=\"nodeData.name\"\n\t\t\t\t\t\t:isReadOnly=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:isActive=\"!!activeNode && activeNode.name === nodeData.name\"\n\t\t\t\t\t\t:hideActions=\"pullConnActive\"\n\t\t\t\t\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:disablePointerEvents=\"!canOpenNDV\"\n\t\t\t\t\t\t:hideNodeIssues=\"hideNodeIssues\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #custom-tooltip>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-text=\"$locale.baseText('nodeView.placeholderNode.addTriggerNodeBeforeExecuting')\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</node>\n\t\t\t\t\t<sticky\n\t\t\t\t\t\tv-for=\"stickyData in stickiesToRender\"\n\t\t\t\t\t\t@deselectAllNodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselectNode=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@nodeSelected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@removeNode=\"(name) => removeNode(name, true)\"\n\t\t\t\t\t\t:key=\"`${stickyData.id}_sticky`\"\n\t\t\t\t\t\t:name=\"stickyData.name\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:isReadOnly=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:isActive=\"!!activeNode && activeNode.name === stickyData.name\"\n\t\t\t\t\t\t:nodeViewScale=\"nodeViewScale\"\n\t\t\t\t\t\t:gridSize=\"GRID_SIZE\"\n\t\t\t\t\t\t:hideActions=\"pullConnActive\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<node-details-view\n\t\t\t\t:readOnly=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t:renaming=\"renamingActive\"\n\t\t\t\t:isProductionExecutionPreview=\"isProductionExecutionPreview\"\n\t\t\t\t@redrawNode=\"redrawNode\"\n\t\t\t\t@switchSelectedNode=\"onSwitchSelectedNode\"\n\t\t\t\t@valueChanged=\"valueChanged\"\n\t\t\t\t@stopExecution=\"stopExecution\"\n\t\t\t\t@saveKeyboardShortcut=\"onSaveKeyboardShortcut\"\n\t\t\t/>\n\t\t\t<Suspense>\n\t\t\t\t<NodeCreation\n\t\t\t\t\tv-if=\"!isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\t:create-node-active=\"createNodeActive\"\n\t\t\t\t\t:node-view-scale=\"nodeViewScale\"\n\t\t\t\t\t@toggleNodeCreator=\"onToggleNodeCreator\"\n\t\t\t\t\t@addNodes=\"onAddNodes\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<CanvasControls />\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<ContextMenu @action=\"onContextMenuAction\" />\n\t\t\t</Suspense>\n\t\t\t<div class=\"workflow-execute-wrapper\" v-if=\"!isReadOnlyRoute && !readOnlyEnv\">\n\t\t\t\t<span\n\t\t\t\t\t@mouseenter=\"showTriggerMissingToltip(true)\"\n\t\t\t\t\t@mouseleave=\"showTriggerMissingToltip(false)\"\n\t\t\t\t\t@click=\"onRunContainerClick\"\n\t\t\t\t\tv-if=\"!isManualChatOnly\"\n\t\t\t\t>\n\t\t\t\t\t<keyboard-shortcut-tooltip\n\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t:shortcut=\"{ metaKey: true, keys: ['↵'] }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t@click.stop=\"onRunWorkflow\"\n\t\t\t\t\t\t\t:loading=\"workflowRunning\"\n\t\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t\ticon=\"play-circle\"\n\t\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t\t:disabled=\"isExecutionDisabled\"\n\t\t\t\t\t\t\tdata-test-id=\"execute-workflow-button\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</keyboard-shortcut-tooltip>\n\t\t\t\t</span>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-if=\"containsChatNodes\"\n\t\t\t\t\t@click.stop=\"onOpenChat\"\n\t\t\t\t\tlabel=\"Chat\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\ticon=\"comment\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\tdata-test-id=\"workflow-chat-button\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && !executionWaitingForWebhook\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t:title=\"\n\t\t\t\t\t\tstopExecutionInProgress\n\t\t\t\t\t\t\t? $locale.baseText('nodeView.stoppingCurrentExecution')\n\t\t\t\t\t\t\t: $locale.baseText('nodeView.stopCurrentExecution')\n\t\t\t\t\t\"\n\t\t\t\t\t:loading=\"stopExecutionInProgress\"\n\t\t\t\t\t@click.stop=\"stopExecution\"\n\t\t\t\t\tdata-test-id=\"stop-execution-button\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && executionWaitingForWebhook === true\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.stopWaitingForWebhookCall')\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t@click.stop=\"stopWaitingForWebhook\"\n\t\t\t\t\tdata-test-id=\"stop-execution-waiting-for-webhook-button\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t!isReadOnlyRoute &&\n\t\t\t\t\t\t!readOnlyEnv &&\n\t\t\t\t\t\tworkflowExecution &&\n\t\t\t\t\t\t!workflowRunning &&\n\t\t\t\t\t\t!allTriggersDisabled\n\t\t\t\t\t\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.deletesTheCurrentExecutionData')\"\n\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t@click.stop=\"clearExecutionData\"\n\t\t\t\t\tdata-test-id=\"clear-execution-data-button\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, nextTick } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport type {\n\tEndpoint,\n\tConnection,\n\tConnectionEstablishedParams,\n\tBeforeDropParams,\n\tConnectionDetachedParams,\n\tConnectionMovedParams,\n\tComponentParameters,\n} from '@jsplumb/core';\nimport {\n\tEVENT_CONNECTION,\n\tEVENT_CONNECTION_DETACHED,\n\tEVENT_CONNECTION_MOVED,\n\tINTERCEPT_BEFORE_DROP,\n} from '@jsplumb/core';\nimport type { MessageBoxInputData, ElNotification } from 'element-plus';\n\nimport {\n\tFIRST_ONBOARDING_PROMPT_TIMEOUT,\n\tMAIN_HEADER_TABS,\n\tMODAL_CANCEL,\n\tMODAL_CLOSE,\n\tMODAL_CONFIRM,\n\tNODE_OUTPUT_DEFAULT_KEY,\n\tONBOARDING_CALL_SIGNUP_MODAL_KEY,\n\tONBOARDING_PROMPT_TIMEBOX,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tQUICKSTART_NOTE_NAME,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEnterpriseEditionFeature,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tMANUAL_CHAT_TRIGGER_NODE_TYPE,\n\tWORKFLOW_LM_CHAT_MODAL_KEY,\n\tAI_NODE_CREATOR_VIEW,\n\tDRAG_EVENT_DATA_KEY,\n\tUPDATE_WEBHOOK_ID_NODE_TYPES,\n\tTIME,\n} from '@/constants';\nimport { copyPaste } from '@/mixins/copyPaste';\nimport { genericHelpers } from '@/mixins/genericHelpers';\nimport { moveNodeWorkflow } from '@/mixins/moveNodeWorkflow';\n\nimport useGlobalLinkActions from '@/composables/useGlobalLinkActions';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport useCanvasMouseSelect from '@/composables/useCanvasMouseSelect';\nimport { useExecutionDebugging } from '@/composables/useExecutionDebugging';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useDataSchema } from '@/composables/useDataSchema';\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { useUniqueNodeName } from '@/composables/useUniqueNodeName';\nimport { useI18n } from '@/composables/useI18n';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { workflowHelpers } from '@/mixins/workflowHelpers';\nimport { workflowRun } from '@/mixins/workflowRun';\nimport { type PinDataSource, pinData } from '@/mixins/pinData';\n\nimport NodeDetailsView from '@/components/NodeDetailsView.vue';\nimport ContextMenu from '@/components/ContextMenu/ContextMenu.vue';\nimport Node from '@/components/Node.vue';\nimport Sticky from '@/components/Sticky.vue';\nimport CanvasAddButton from './CanvasAddButton.vue';\nimport KeyboardShortcutTooltip from '@/components/KeyboardShortcutTooltip.vue';\nimport { v4 as uuid } from 'uuid';\nimport type {\n\tIConnection,\n\tIConnections,\n\tIDataObject,\n\tIExecutionsSummary,\n\tINode,\n\tINodeConnections,\n\tINodeCredentialsDetails,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeTypeNameVersion,\n\tIPinData,\n\tIRun,\n\tITaskData,\n\tITelemetryTrackProperties,\n\tIWorkflowBase,\n\tWorkflow,\n\tConnectionTypes,\n\tINodeOutputConfiguration,\n} from 'n8n-workflow';\nimport {\n\tdeepCopy,\n\tjsonParse,\n\tNodeConnectionType,\n\tNodeHelpers,\n\tTelemetryHelpers,\n} from 'n8n-workflow';\nimport type {\n\tICredentialsResponse,\n\tIExecutionResponse,\n\tIWorkflowDb,\n\tIWorkflowData,\n\tINodeUi,\n\tIUpdateInformation,\n\tIWorkflowDataUpdate,\n\tXYPosition,\n\tIPushDataExecutionFinished,\n\tITag,\n\tINewWorkflowData,\n\tIWorkflowTemplate,\n\tIWorkflowToShare,\n\tIUser,\n\tINodeUpdatePropertiesInformation,\n\tNodeCreatorOpenSource,\n\tAddedNodesAndConnections,\n\tToggleNodeCreatorOptions,\n} from '@/Interface';\n\nimport { debounceHelper } from '@/mixins/debounce';\nimport type { Route, RawLocation } from 'vue-router';\nimport { dataPinningEventBus, nodeViewEventBus } from '@/event-bus';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useEnvironmentsStore } from '@/stores/environments.ee.store';\nimport { useExternalSecretsStore } from '@/stores/externalSecrets.ee.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { usePushConnectionStore } from '@/stores/pushConnection.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSegment } from '@/stores/segment.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsEEStore } from '@/stores/workflows.ee.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { getAccountAge } from '@/utils/userUtils';\nimport { getConnectionInfo, getNodeViewTab } from '@/utils/canvasUtils';\nimport {\n\tAddConnectionCommand,\n\tAddNodeCommand,\n\tMoveNodeCommand,\n\tRemoveConnectionCommand,\n\tRemoveNodeCommand,\n\tRenameNodeCommand,\n\thistoryBus,\n} from '@/models/history';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport {\n\tEVENT_ENDPOINT_MOUSEOVER,\n\tEVENT_ENDPOINT_MOUSEOUT,\n\tEVENT_DRAG_MOVE,\n\tEVENT_CONNECTION_DRAG,\n\tEVENT_CONNECTION_ABORT,\n\tEVENT_CONNECTION_MOUSEOUT,\n\tEVENT_CONNECTION_MOUSEOVER,\n\tready,\n} from '@jsplumb/browser-ui';\nimport type { N8nPlusEndpoint } from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport {\n\tN8nPlusEndpointType,\n\tEVENT_PLUS_ENDPOINT_CLICK,\n} from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport type { N8nAddInputEndpoint } from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport {\n\tEVENT_ADD_INPUT_ENDPOINT_CLICK,\n\tN8nAddInputEndpointType,\n} from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\nimport { getConnectorPaintStyleData, OVERLAY_ENDPOINT_ARROW_ID } from '@/utils/nodeViewUtils';\nimport { useViewStacks } from '@/components/Node/NodeCreator/composables/useViewStacks';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\ninterface AddNodeOptions {\n\tposition?: XYPosition;\n\tdragAndDrop?: boolean;\n\tname?: string;\n}\n\nconst NodeCreation = defineAsyncComponent(async () => import('@/components/Node/NodeCreation.vue'));\nconst CanvasControls = defineAsyncComponent(async () => import('@/components/CanvasControls.vue'));\n\nexport default defineComponent({\n\tname: 'NodeView',\n\tmixins: [\n\t\tcopyPaste,\n\t\tgenericHelpers,\n\t\tmoveNodeWorkflow,\n\t\tworkflowHelpers,\n\t\tworkflowRun,\n\t\tdebounceHelper,\n\t\tpinData,\n\t],\n\tcomponents: {\n\t\tNodeDetailsView,\n\t\tNode,\n\t\tSticky,\n\t\tCanvasAddButton,\n\t\tKeyboardShortcutTooltip,\n\t\tNodeCreation,\n\t\tCanvasControls,\n\t\tContextMenu,\n\t},\n\tsetup(props, ctx) {\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst locale = useI18n();\n\t\tconst contextMenu = useContextMenu();\n\t\tconst dataSchema = useDataSchema();\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn {\n\t\t\tlocale,\n\t\t\tcontextMenu,\n\t\t\tdataSchema,\n\t\t\tnodeHelpers,\n\t\t\texternalHooks,\n\t\t\t...useCanvasMouseSelect(),\n\t\t\t...useGlobalLinkActions(),\n\t\t\t...useTitleChange(),\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t\t...useUniqueNodeName(),\n\t\t\t...useExecutionDebugging(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowRun.setup?.(props, ctx),\n\t\t};\n\t},\n\terrorCaptured: (err, vm, info) => {\n\t\tconsole.error('errorCaptured');\n\t\tconsole.error(err);\n\t},\n\twatch: {\n\t\t// Listen to route changes and load the workflow accordingly\n\t\tasync $route(to: Route, from: Route) {\n\t\t\tthis.readOnlyEnvRouteCheck();\n\n\t\t\tconst currentTab = getNodeViewTab(to);\n\t\t\tconst nodeViewNotInitialized = !this.uiStore.nodeViewInitialized;\n\t\t\tlet workflowChanged =\n\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t// Both 'new' and __EMPTY__ are new workflow names, so ignore them when detecting if wf changed\n\t\t\t\t!(from.params.name === 'new' && this.currentWorkflow === PLACEHOLDER_EMPTY_WORKFLOW_ID) &&\n\t\t\t\t!(from.name === VIEWS.NEW_WORKFLOW) &&\n\t\t\t\t// Also ignore if workflow id changes when saving new workflow\n\t\t\t\tto.params.action !== 'workflowSave';\n\t\t\tconst isOpeningTemplate = to.name === VIEWS.TEMPLATE_IMPORT;\n\n\t\t\t// When entering this tab:\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW || isOpeningTemplate) {\n\t\t\t\tif (workflowChanged || nodeViewNotInitialized || isOpeningTemplate) {\n\t\t\t\t\tthis.startLoading();\n\t\t\t\t\tif (nodeViewNotInitialized) {\n\t\t\t\t\t\tconst previousDirtyState = this.uiStore.stateIsDirty;\n\t\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\t\tthis.uiStore.stateIsDirty = previousDirtyState;\n\t\t\t\t\t}\n\t\t\t\t\tawait Promise.all([this.loadCredentials(), this.initView()]);\n\t\t\t\t\tthis.stopLoading();\n\t\t\t\t\tif (this.blankRedirect) {\n\t\t\t\t\t\tthis.blankRedirect = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.checkAndInitDebugMode();\n\t\t\t}\n\t\t\t// Also, when landing on executions tab, check if workflow data is changed\n\t\t\tif (currentTab === MAIN_HEADER_TABS.EXECUTIONS) {\n\t\t\t\tworkflowChanged =\n\t\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t\t!(to.params.name === 'new' && from.params.name === undefined);\n\t\t\t\tif (workflowChanged) {\n\t\t\t\t\t// This will trigger node view to update next time workflow tab is opened\n\t\t\t\t\tthis.uiStore.nodeViewInitialized = false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tactiveNode() {\n\t\t\t// When a node gets set as active deactivate the create-menu\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tcontainsTrigger(containsTrigger) {\n\t\t\t// Re-center CanvasAddButton if there's no triggers\n\t\t\tif (containsTrigger === false)\n\t\t\t\tthis.canvasStore.setRecenteredCanvasAddButtonPosition(this.getNodeViewOffsetPosition);\n\t\t},\n\t\tnodeViewScale(newScale) {\n\t\t\tconst elementRef = this.$refs.nodeView as HTMLDivElement | undefined;\n\t\t\tif (elementRef) {\n\t\t\t\telementRef.style.transform = `scale(${newScale})`;\n\t\t\t}\n\t\t},\n\t},\n\tasync beforeRouteLeave(to, from, next) {\n\t\tif (\n\t\t\tgetNodeViewTab(to) === MAIN_HEADER_TABS.EXECUTIONS ||\n\t\t\tfrom.name === VIEWS.TEMPLATE_IMPORT ||\n\t\t\t(getNodeViewTab(to) === MAIN_HEADER_TABS.WORKFLOW && from.name === VIEWS.EXECUTION_DEBUG)\n\t\t) {\n\t\t\tnext();\n\t\t\treturn;\n\t\t}\n\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t{\n\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tshowClose: true,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t// Make sure workflow id is empty when leaving the editor\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tconst saved = await this.saveCurrentWorkflow({}, false);\n\t\t\t\tif (saved) {\n\t\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\t\t\t\t}\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\tif (from.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\t// Replace the current route with the new workflow route\n\t\t\t\t\t// before navigating to the new route when saving new workflow.\n\t\t\t\t\tawait this.$router.replace(\n\t\t\t\t\t\t{ name: VIEWS.WORKFLOW, params: { name: this.currentWorkflow } },\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// We can't use next() here since vue-router\n\t\t\t\t\t\t\t// would prevent the navigation with an error\n\t\t\t\t\t\t\tvoid this.$router.push(to as RawLocation);\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t} else if (confirmModal === MODAL_CANCEL) {\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tthis.resetWorkspace();\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\tnext();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\tnext();\n\t\t}\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseCanvasStore,\n\t\t\tuseTagsStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseTemplatesStore,\n\t\t\tuseUIStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseUsersStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseEnvironmentsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t\tuseHistoryStore,\n\t\t\tuseExternalSecretsStore,\n\t\t\tuseCollaborationStore,\n\t\t\tusePushConnectionStore,\n\t\t),\n\t\tnativelyNumberSuffixedDefaults(): string[] {\n\t\t\treturn this.nodeTypesStore.nativelyNumberSuffixedDefaults;\n\t\t},\n\t\tcurrentUser(): IUser | null {\n\t\t\treturn this.usersStore.currentUser;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\texecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tisDemo(): boolean {\n\t\t\treturn this.$route.name === VIEWS.DEMO;\n\t\t},\n\t\tshowCanvasAddButton(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.loadingService === null && !this.containsTrigger && !this.isDemo && !this.readOnlyEnv\n\t\t\t);\n\t\t},\n\t\tlastSelectedNode(): INodeUi | null {\n\t\t\treturn this.uiStore.getLastSelectedNode;\n\t\t},\n\t\tnodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes;\n\t\t},\n\t\tnodesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type !== STICKY_NODE_TYPE);\n\t\t},\n\t\tstickiesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type === STICKY_NODE_TYPE);\n\t\t},\n\t\trunButtonText(): string {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executeWorkflow');\n\t\t\t}\n\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.waitingForTriggerEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executingWorkflow');\n\t\t},\n\t\tworkflowStyle(): object {\n\t\t\tconst offsetPosition = this.uiStore.nodeViewOffsetPosition;\n\t\t\treturn {\n\t\t\t\tleft: offsetPosition[0] + 'px',\n\t\t\t\ttop: offsetPosition[1] + 'px',\n\t\t\t};\n\t\t},\n\t\tcanvasAddButtonStyle(): object {\n\t\t\treturn {\n\t\t\t\t'pointer-events': this.createNodeActive ? 'none' : 'all',\n\t\t\t};\n\t\t},\n\t\tbackgroundStyle(): object {\n\t\t\treturn NodeViewUtils.getBackgroundStyles(\n\t\t\t\tthis.nodeViewScale,\n\t\t\t\tthis.uiStore.nodeViewOffsetPosition,\n\t\t\t\tthis.isExecutionPreview,\n\t\t\t);\n\t\t},\n\t\tworkflowClasses() {\n\t\t\tconst returnClasses = [];\n\t\t\tif (this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\tif (this.uiStore.nodeViewMoveInProgress) {\n\t\t\t\t\treturnClasses.push('move-in-process');\n\t\t\t\t} else {\n\t\t\t\t\treturnClasses.push('move-active');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.selectActive || this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\t// Makes sure that nothing gets selected while select or move is active\n\t\t\t\treturnClasses.push('do-not-select');\n\t\t\t}\n\n\t\t\tif (this.connectionDragScope.type) {\n\t\t\t\treturnClasses.push('connection-drag-scope-active');\n\t\t\t\treturnClasses.push(`connection-drag-scope-active-type-${this.connectionDragScope.type}`);\n\t\t\t\treturnClasses.push(\n\t\t\t\t\t`connection-drag-scope-active-connection-${this.connectionDragScope.connection}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn returnClasses;\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): string {\n\t\t\treturn this.$route.params.name || this.workflowsStore.workflowId;\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tallTriggersDisabled(): boolean {\n\t\t\tconst disabledTriggerNodes = this.triggerNodes.filter((node) => node.disabled);\n\t\t\treturn disabledTriggerNodes.length === this.triggerNodes.length;\n\t\t},\n\t\ttriggerNodes(): INodeUi[] {\n\t\t\treturn this.nodes.filter(\n\t\t\t\t(node) => node.type === START_NODE_TYPE || this.nodeTypesStore.isTriggerNode(node.type),\n\t\t\t);\n\t\t},\n\t\tcontainsTrigger(): boolean {\n\t\t\treturn this.triggerNodes.length > 0;\n\t\t},\n\t\tisManualChatOnly(): boolean {\n\t\t\treturn this.containsChatNodes && this.triggerNodes.length === 1;\n\t\t},\n\t\tcontainsChatNodes(): boolean {\n\t\t\treturn !!this.nodes.find(\n\t\t\t\t(node) => node.type === MANUAL_CHAT_TRIGGER_NODE_TYPE && node.disabled !== true,\n\t\t\t);\n\t\t},\n\t\tisExecutionDisabled(): boolean {\n\t\t\treturn !this.containsTrigger || this.allTriggersDisabled;\n\t\t},\n\t\tgetNodeViewOffsetPosition(): XYPosition {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tnodeViewScale(): number {\n\t\t\treturn this.canvasStore.nodeViewScale;\n\t\t},\n\t\tinstance(): BrowserJsPlumbInstance {\n\t\t\treturn this.canvasStore.jsPlumbInstance;\n\t\t},\n\t\tisLoading(): boolean {\n\t\t\treturn this.loadingService !== null;\n\t\t},\n\t\tcurrentWorkflowObject(): Workflow {\n\t\t\treturn this.workflowsStore.getCurrentWorkflow();\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tGRID_SIZE: NodeViewUtils.GRID_SIZE,\n\t\t\tSTICKY_NODE_TYPE,\n\t\t\tcreateNodeActive: false,\n\t\t\tlastClickPosition: [450, 450] as XYPosition,\n\t\t\tctrlKeyPressed: false,\n\t\t\tmoveCanvasKeyPressed: false,\n\t\t\tstopExecutionInProgress: false,\n\t\t\tblankRedirect: false,\n\t\t\tcredentialsUpdated: false,\n\t\t\tpullConnActiveNodeName: null as string | null,\n\t\t\tpullConnActive: false,\n\t\t\tdropPrevented: false,\n\t\t\tconnectionDragScope: {\n\t\t\t\ttype: null,\n\t\t\t\tconnection: null,\n\t\t\t} as { type: string | null; connection: 'source' | 'target' | null },\n\t\t\trenamingActive: false,\n\t\t\tshowStickyButton: false,\n\t\t\tisExecutionPreview: false,\n\t\t\tshowTriggerMissingTooltip: false,\n\t\t\tworkflowData: null as INewWorkflowData | null,\n\t\t\tactiveConnection: null as null | Connection,\n\t\t\tisInsertingNodes: false,\n\t\t\tisProductionExecutionPreview: false,\n\t\t\tenterTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\texitTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\treadOnlyNotification: null as null | typeof ElNotification,\n\t\t\t// jsplumb automatically deletes all loose connections which is in turn recorded\n\t\t\t// in undo history as a user action.\n\t\t\t// This should prevent automatically removed connections from populating undo stack\n\t\t\tsuspendRecordingDetachedConnections: false,\n\t\t\tNODE_CREATOR_OPEN_SOURCES,\n\t\t\teventsAttached: false,\n\t\t\tunloadTimeout: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\tcanOpenNDV: true,\n\t\t\thideNodeIssues: false,\n\t\t};\n\t},\n\tmethods: {\n\t\teditAllowedCheck(): boolean {\n\t\t\tif (this.readOnlyNotification?.visible) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\tthis.readOnlyNotification = this.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${this.isReadOnlyRoute ? 'executions' : 'workflows'}.title`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.title',\n\t\t\t\t\t),\n\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${\n\t\t\t\t\t\t\t\t\tthis.isReadOnlyRoute ? 'executions' : 'workflows'\n\t\t\t\t\t\t\t }.message`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.message',\n\t\t\t\t\t),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t});\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tshowTriggerMissingToltip(isVisible: boolean) {\n\t\t\tthis.showTriggerMissingTooltip = isVisible;\n\t\t},\n\t\tonRunNode(nodeName: string, source: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tconst telemetryPayload = {\n\t\t\t\tnode_type: node ? node.type : null,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsource: 'canvas',\n\t\t\t\tsession_id: this.ndvStore.sessionId,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onRunNode', telemetryPayload);\n\t\t\tvoid this.runWorkflow({ destinationNode: nodeName, source });\n\t\t},\n\t\tasync onOpenChat() {\n\t\t\tconst telemetryPayload = {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked chat open button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onOpenChat', telemetryPayload);\n\t\t\tthis.uiStore.openModal(WORKFLOW_LM_CHAT_MODAL_KEY);\n\t\t},\n\t\tasync onRunWorkflow() {\n\t\t\tvoid this.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(workflowData as IWorkflowBase, this.getNodeTypes())\n\t\t\t\t\t\t\t.nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t\tthis.$telemetry.track('User clicked execute workflow button', telemetryPayload);\n\t\t\t\tvoid this.externalHooks.run('nodeView.onRunWorkflow', telemetryPayload);\n\t\t\t});\n\n\t\t\tawait this.runWorkflow({});\n\t\t\tthis.refreshEndpointsErrorsState();\n\t\t},\n\t\tresetEndpointsErrors() {\n\t\t\tconst allEndpoints = Object.values(this.instance.getManagedElements()).flatMap(\n\t\t\t\t(el) => el.endpoints,\n\t\t\t);\n\n\t\t\tallEndpoints\n\t\t\t\t.filter((endpoint) => endpoint?.endpoint.type === N8nAddInputEndpointType)\n\t\t\t\t.forEach((endpoint) => {\n\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\tif (n8nAddInputEndpoint && (endpoint?.connections ?? []).length > 0) {\n\t\t\t\t\t\tn8nAddInputEndpoint.resetError();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\trefreshEndpointsErrorsState() {\n\t\t\tconst nodeIssues = this.workflowsStore.allNodes.filter((n) => n.issues);\n\t\t\t// Set input color to red if there are issues\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tnodeIssues.forEach((node) => {\n\t\t\t\tconst managedNode = this.instance.getManagedElement(node.id);\n\t\t\t\tconst endpoints = this.instance.getEndpoints(managedNode);\n\n\t\t\t\tObject.keys(node?.issues?.input ?? {}).forEach((connectionType) => {\n\t\t\t\t\tconst inputEndpointsWithIssues = endpoints.filter(\n\t\t\t\t\t\t(e) => e._defaultType.scope === connectionType,\n\t\t\t\t\t);\n\t\t\t\t\tinputEndpointsWithIssues.forEach((endpoint) => {\n\t\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\t\tif (n8nAddInputEndpoint) {\n\t\t\t\t\t\t\tn8nAddInputEndpoint.setError();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tonRunContainerClick() {\n\t\t\tif (this.containsTrigger && !this.allTriggersDisabled) return;\n\n\t\t\tconst message =\n\t\t\t\tthis.containsTrigger && this.allTriggersDisabled\n\t\t\t\t\t? this.$locale.baseText('nodeView.addOrEnableTriggerNode')\n\t\t\t\t\t: this.$locale.baseText('nodeView.addATriggerNodeFirst');\n\n\t\t\tthis.registerCustomAction({\n\t\t\t\tkey: 'showNodeCreator',\n\t\t\t\taction: () =>\n\t\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.NO_TRIGGER_EXECUTION_TOOLTIP),\n\t\t\t});\n\n\t\t\tconst notice = this.showMessage({\n\t\t\t\ttype: 'info',\n\t\t\t\ttitle: this.$locale.baseText('nodeView.cantExecuteNoTrigger'),\n\t\t\t\tmessage,\n\t\t\t\tduration: 3000,\n\t\t\t\tonClick: () =>\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t// Close the creator panel if user clicked on the link\n\t\t\t\t\t\tif (this.createNodeActive) notice.close();\n\t\t\t\t\t}, 0),\n\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t});\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.workflowExecutionData = null;\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tasync onSaveKeyboardShortcut(e: KeyboardEvent) {\n\t\t\tlet saved = await this.saveCurrentWorkflow();\n\t\t\tif (saved) {\n\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\n\t\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\t\tawait this.$router.replace({\n\t\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\t\tparams: { name: this.currentWorkflow },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.activeNode) {\n\t\t\t\t// If NDV is open, save will not work from editable input fields\n\t\t\t\t// so don't show success message if this is true\n\t\t\t\tif (e.target instanceof HTMLInputElement) {\n\t\t\t\t\tsaved = e.target.readOnly;\n\t\t\t\t} else {\n\t\t\t\t\tsaved = true;\n\t\t\t\t}\n\t\t\t\tif (saved) {\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('generic.workflowSaved'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowTriggerCreator(source: NodeCreatorOpenSource) {\n\t\t\tif (this.createNodeActive) return;\n\t\t\tthis.nodeCreatorStore.setSelectedView(TRIGGER_NODE_CREATOR_VIEW);\n\t\t\tthis.nodeCreatorStore.setShowScrim(true);\n\t\t\tthis.onToggleNodeCreator({ source, createNodeActive: true });\n\t\t},\n\t\tasync openExecution(executionId: string) {\n\t\t\tthis.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tlet data: IExecutionResponse | undefined;\n\t\t\ttry {\n\t\t\t\tdata = await this.workflowsStore.getExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.openExecution.title'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (data === undefined) {\n\t\t\t\tthrow new Error(`Execution with id \"${executionId}\" could not be found!`);\n\t\t\t}\n\t\t\tthis.workflowsStore.setWorkflowName({\n\t\t\t\tnewName: data.workflowData.name,\n\t\t\t\tsetStateDirty: false,\n\t\t\t});\n\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(data);\n\t\t\tif (data.workflowData.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflowData.pinData);\n\t\t\t}\n\n\t\t\tif (data.workflowData.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\townedBy: data.workflowData.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\tsharedWith: data.workflowData.sharedWith,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(data.workflowData.usedCredentials);\n\t\t\t}\n\n\t\t\tawait this.addNodes(\n\t\t\t\tdeepCopy(data.workflowData.nodes),\n\t\t\t\tdeepCopy(data.workflowData.connections),\n\t\t\t);\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tvoid this.externalHooks.run('execution.open', {\n\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\tworkflowName: data.workflowData.name,\n\t\t\t\texecutionId,\n\t\t\t});\n\t\t\tthis.$telemetry.track('User opened read-only execution', {\n\t\t\t\tworkflow_id: data.workflowData.id,\n\t\t\t\texecution_mode: data.mode,\n\t\t\t\texecution_finished: data.finished,\n\t\t\t});\n\n\t\t\tif (!data.finished && data.data?.resultData?.error) {\n\t\t\t\t// Check if any node contains an error\n\t\t\t\tlet nodeErrorFound = false;\n\t\t\t\tif (data.data.resultData.runData) {\n\t\t\t\t\tconst runData = data.data.resultData.runData;\n\t\t\t\t\terrorCheck: for (const nodeName of Object.keys(runData)) {\n\t\t\t\t\t\tfor (const taskData of runData[nodeName]) {\n\t\t\t\t\t\t\tif (taskData.error) {\n\t\t\t\t\t\t\t\tnodeErrorFound = true;\n\t\t\t\t\t\t\t\tbreak errorCheck;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!nodeErrorFound && data.data.resultData.error.stack) {\n\t\t\t\t\t// Display some more information for now in console to make debugging easier\n\t\t\t\t\tconsole.error(`Execution ${executionId} error:`);\n\t\t\t\t\tconsole.error(data.data.resultData.error.stack);\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.workflowError'),\n\t\t\t\t\t\tmessage: data.data.resultData.error.message,\n\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((data as IExecutionsSummary).waitTill) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.thisExecutionHasntFinishedYet'),\n\t\t\t\t\tmessage: `<a data-action=\"reload\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.refresh',\n\t\t\t\t\t)}</a> ${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.toSeeTheLatestStatus',\n\t\t\t\t\t)}.<br/> <a href=\"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/\" target=\"_blank\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.moreInfo',\n\t\t\t\t\t)}</a>`,\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tduration: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.stopLoading();\n\t\t},\n\t\tasync importWorkflowExact(data: { workflow: IWorkflowDataUpdate }) {\n\t\t\tif (!data.workflow.nodes || !data.workflow.connections) {\n\t\t\t\tthrow new Error('Invalid workflow object');\n\t\t\t}\n\t\t\tthis.resetWorkspace();\n\t\t\tdata.workflow.nodes = NodeViewUtils.getFixedNodesList(data.workflow.nodes);\n\n\t\t\tawait this.addNodes(data.workflow.nodes as INodeUi[], data.workflow.connections);\n\n\t\t\tif (data.workflow.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflow.pinData);\n\t\t\t}\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync openWorkflowTemplate(templateId: string) {\n\t\t\tthis.startLoading();\n\t\t\tthis.setLoadingText(this.$locale.baseText('nodeView.loadingTemplate'));\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.workflowsStore.activeWorkflowExecution = null;\n\n\t\t\tlet data: IWorkflowTemplate | undefined;\n\t\t\ttry {\n\t\t\t\tvoid this.externalHooks.run('template.requested', { templateId });\n\t\t\t\tdata = await this.templatesStore.getFixedWorkflowTemplate(templateId);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.workflowTemplateWithIdCouldNotBeFound', {\n\t\t\t\t\t\t\tinterpolate: { templateId },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.couldntImportWorkflow'));\n\t\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.blankRedirect = true;\n\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW, query: { templateId } });\n\n\t\t\tawait this.addNodes(data.workflow.nodes, data.workflow.connections);\n\t\t\tthis.workflowData = (await this.workflowsStore.getNewWorkflowData(data.name)) || {};\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tvoid this.externalHooks.run('template.open', {\n\t\t\t\ttemplateId,\n\t\t\t\ttemplateName: data.name,\n\t\t\t\tworkflow: data.workflow,\n\t\t\t});\n\t\t\tthis.stopLoading();\n\t\t},\n\t\tasync openWorkflow(workflow: IWorkflowDb) {\n\t\t\tthis.startLoading();\n\n\t\t\tconst selectedExecution = this.workflowsStore.activeWorkflowExecution;\n\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.addWorkflow(workflow);\n\t\t\tthis.workflowsStore.setActive(workflow.active || false);\n\t\t\tthis.workflowsStore.setWorkflowId(workflow.id);\n\t\t\tthis.workflowsStore.setWorkflowName({ newName: workflow.name, setStateDirty: false });\n\t\t\tthis.workflowsStore.setWorkflowSettings(workflow.settings || {});\n\t\t\tthis.workflowsStore.setWorkflowPinData(workflow.pinData || {});\n\t\t\tthis.workflowsStore.setWorkflowVersionId(workflow.versionId);\n\n\t\t\tif (workflow.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\townedBy: workflow.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\tsharedWith: workflow.sharedWith,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(workflow.usedCredentials);\n\t\t\t}\n\n\t\t\tconst tags = (workflow.tags || []) as ITag[];\n\t\t\tconst tagIds = tags.map((tag) => tag.id);\n\t\t\tthis.workflowsStore.setWorkflowTagIds(tagIds || []);\n\t\t\tthis.tagsStore.upsertTags(tags);\n\n\t\t\tawait this.addNodes(workflow.nodes, workflow.connections);\n\n\t\t\tif (!this.credentialsUpdated) {\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t}\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tvoid this.externalHooks.run('workflow.open', {\n\t\t\t\tworkflowId: workflow.id,\n\t\t\t\tworkflowName: workflow.name,\n\t\t\t});\n\t\t\tif (selectedExecution?.workflowId !== workflow.id) {\n\t\t\t\tthis.workflowsStore.activeWorkflowExecution = null;\n\t\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\t} else {\n\t\t\t\tthis.workflowsStore.activeWorkflowExecution = selectedExecution;\n\t\t\t}\n\t\t\tthis.stopLoading();\n\t\t\tthis.collaborationStore.notifyWorkflowOpened(workflow.id);\n\t\t},\n\t\ttouchTap(e: MouseEvent | TouchEvent) {\n\t\t\tif (this.isTouchDevice) {\n\t\t\t\tthis.mouseDown(e);\n\t\t\t}\n\t\t},\n\t\tmouseDown(e: MouseEvent | TouchEvent) {\n\t\t\t// Save the location of the mouse click\n\t\t\tthis.lastClickPosition = this.getMousePositionWithinNodeView(e);\n\t\t\tif (e instanceof MouseEvent && e.button === 1) {\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t}\n\n\t\t\tthis.mouseDownMouseSelect(e as MouseEvent, this.moveCanvasKeyPressed);\n\t\t\tthis.mouseDownMoveWorkflow(e as MouseEvent, this.moveCanvasKeyPressed);\n\n\t\t\t// Hide the node-creator\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tmouseUp(e: MouseEvent) {\n\t\t\tif (e.button === 1) {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t\tthis.mouseUpMouseSelect(e);\n\t\t\tthis.mouseUpMoveWorkflow(e);\n\t\t},\n\t\tkeyUp(e: KeyboardEvent) {\n\t\t\tif (e.key === this.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = false;\n\t\t\t}\n\t\t\tif (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t},\n\t\tasync keyDown(e: KeyboardEvent) {\n\t\t\tthis.contextMenu.close();\n\n\t\t\tconst ctrlModifier = this.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst shiftModifier = e.shiftKey && !e.altKey && !this.isCtrlKeyPressed(e);\n\t\t\tconst ctrlAltModifier = this.isCtrlKeyPressed(e) && e.altKey && !e.shiftKey;\n\t\t\tconst noModifierKeys = !this.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst readOnly = this.isReadOnlyRoute || this.readOnlyEnv;\n\n\t\t\tif (e.key === 's' && ctrlModifier && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced('onSaveKeyboardShortcut', { debounceTime: 1000 }, e);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\n\t\t\t// Check if the keys got emitted from a message box or from something\n\t\t\t// else which should ignore the default keybindings\n\t\t\tfor (const element of path) {\n\t\t\t\tif (\n\t\t\t\t\telement.className &&\n\t\t\t\t\ttypeof element.className === 'string' &&\n\t\t\t\t\telement.className.includes('ignore-key-press')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// el-dialog or el-message-box element is open\n\t\t\tif (window.document.body.classList.contains('el-popup-parent--hidden')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.key === 'Escape' && noModifierKeys) {\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t\tif (this.activeNode) {\n\t\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// node modal is open\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectedNodes = this.uiStore.getSelectedNodes\n\t\t\t\t.map((node) => node && this.workflowsStore.getNodeByName(node.name))\n\t\t\t\t.filter((node) => !!node) as INode[];\n\n\t\t\tif (e.key === 'd' && noModifierKeys && !readOnly) {\n\t\t\t\tvoid this.callDebounced('toggleActivationNodes', { debounceTime: 350 }, selectedNodes);\n\t\t\t} else if (e.key === 'd' && ctrlModifier && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvoid this.duplicateNodes(selectedNodes);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'p' && noModifierKeys && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.togglePinNodes(selectedNodes, 'keyboard-shortcut');\n\t\t\t\t}\n\t\t\t} else if ((e.key === 'Delete' || e.key === 'Backspace') && noModifierKeys && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('deleteNodes', { debounceTime: 500 }, selectedNodes);\n\t\t\t} else if (e.key === 'Tab' && noModifierKeys && !readOnly) {\n\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.TAB,\n\t\t\t\t\tcreateNodeActive: !this.createNodeActive && !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && ctrlModifier && !readOnly) {\n\t\t\t\tvoid this.onRunWorkflow();\n\t\t\t} else if (e.key === 'S' && shiftModifier && !readOnly) {\n\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t} else if (e.key === this.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = true;\n\t\t\t} else if (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t} else if (e.key === 'F2' && noModifierKeys && !readOnly) {\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode !== null && lastSelectedNode.type !== STICKY_NODE_TYPE) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\t'renameNodePrompt',\n\t\t\t\t\t\t{ debounceTime: 1500 },\n\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'a' && ctrlModifier) {\n\t\t\t\t// Select all nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('selectAllNodes', { debounceTime: 1000 });\n\t\t\t} else if (e.key === 'c' && ctrlModifier) {\n\t\t\t\tvoid this.callDebounced('copyNodes', { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'x' && ctrlModifier && !readOnly) {\n\t\t\t\t// Cut nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('cutNodes', { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'n' && ctrlAltModifier) {\n\t\t\t\t// Create a new workflow\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\t\t\t\tif (this.isDemo) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (this.$router.currentRoute.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\tnodeViewEventBus.emit('newWorkflow');\n\t\t\t\t} else {\n\t\t\t\t\tvoid this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\t}\n\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.keyDown.title'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && noModifierKeys) {\n\t\t\t\t// Activate the last selected node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\t\tif (lastSelectedNode !== null) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tlastSelectedNode.type === STICKY_NODE_TYPE &&\n\t\t\t\t\t\t(this.isReadOnlyRoute || this.readOnlyEnv)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.ndvStore.activeNodeName = lastSelectedNode.name;\n\t\t\t\t}\n\t\t\t} else if (e.key === 'ArrowRight' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('selectDownstreamNodes', { debounceTime: 1000 });\n\t\t\t} else if (e.key === 'ArrowRight' && noModifierKeys) {\n\t\t\t\t// Set child node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t);\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t'nodeSelectedByName',\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (e.key === 'ArrowLeft' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced('selectUpstreamNodes', { debounceTime: 1000 });\n\t\t\t} else if (e.key === 'ArrowLeft' && noModifierKeys) {\n\t\t\t\t// Set parent node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t'nodeSelectedByName',\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (['ArrowUp', 'ArrowDown'].includes(e.key) && noModifierKeys) {\n\t\t\t\t// Set sibling node as active\n\n\t\t\t\t// Check first if it has a parent node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (!Array.isArray(connections.main) || !connections.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst parentNode = connections.main[0][0].node;\n\t\t\t\tconst connectionsParent = this.workflowsStore.outgoingConnectionsByNodeName(parentNode);\n\n\t\t\t\tif (!Array.isArray(connectionsParent.main) || !connectionsParent.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get all the sibling nodes and their x positions to know which one to set active\n\t\t\t\tlet siblingNode: INodeUi | null;\n\t\t\t\tlet lastCheckedNodePosition = e.key === 'ArrowUp' ? -99999999 : 99999999;\n\t\t\t\tlet nextSelectNode: string | null = null;\n\t\t\t\tfor (const ouputConnections of connectionsParent.main) {\n\t\t\t\t\tfor (const ouputConnection of ouputConnections) {\n\t\t\t\t\t\tif (ouputConnection.node === lastSelectedNode.name) {\n\t\t\t\t\t\t\t// Ignore current node\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsiblingNode = this.workflowsStore.getNodeByName(ouputConnection.node);\n\n\t\t\t\t\t\tif (siblingNode) {\n\t\t\t\t\t\t\tif (e.key === 'ArrowUp') {\n\t\t\t\t\t\t\t\t// Get the next node on the left\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] <= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] > lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Get the next node on the right\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] >= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] < lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nextSelectNode !== null) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\t'nodeSelectedByName',\n\t\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\t\tnextSelectNode,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\ttoggleActivationNodes(nodes: INode[]) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.disableNodes(nodes, true);\n\t\t},\n\n\t\ttogglePinNodes(nodes: INode[], source: PinDataSource) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst nextStatePinned = nodes.some(\n\t\t\t\t(node) => !this.workflowsStore.pinDataByNodeName(node.name),\n\t\t\t);\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tif (nextStatePinned) {\n\t\t\t\t\tconst dataToPin = this.dataSchema.getInputDataWithPinned(node);\n\t\t\t\t\tif (dataToPin.length !== 0) {\n\t\t\t\t\t\tthis.setPinData(node, dataToPin, source);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.unsetPinData(node, source);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\n\t\tdeleteNodes(nodes: INode[]) {\n\t\t\t// Copy \"selectedNodes\" as the nodes get deleted out of selection\n\t\t\t// when they get deleted and if we would use original it would mess\n\t\t\t// with the index and would so not delete all nodes\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tthis.removeNode(node.name, true, false);\n\t\t\t});\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}, 200);\n\t\t},\n\n\t\tselectAllNodes() {\n\t\t\tthis.nodes.forEach((node) => {\n\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t});\n\t\t},\n\n\t\tselectUpstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all upstream nodes and select them\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.getConnectedNodes('upstream', workflow, lastSelectedNode.name);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\t\tselectDownstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all downstream nodes and select them\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.getConnectedNodes('downstream', workflow, lastSelectedNode.name);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\n\t\tpushDownstreamNodes(sourceNodeName: string, margin: number, recordHistory = false) {\n\t\t\tconst sourceNode = this.workflowsStore.nodesByName[sourceNodeName];\n\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.getConnectedNodes('downstream', workflow, sourceNodeName);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tconst node = this.workflowsStore.nodesByName[nodeName];\n\t\t\t\tconst oldPosition = node.position;\n\n\t\t\t\tif (node.position[0] < sourceNode.position[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\t\tname: nodeName,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tposition: [node.position[0] + margin, node.position[1]],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t\tthis.onNodeMoved(node);\n\n\t\t\t\tif (\n\t\t\t\t\t(recordHistory && oldPosition[0] !== updateInformation.properties.position[0]) ||\n\t\t\t\t\toldPosition[1] !== updateInformation.properties.position[1]\n\t\t\t\t) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\t\tnew MoveNodeCommand(nodeName, oldPosition, updateInformation.properties.position),\n\t\t\t\t\t\trecordHistory,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tcutNodes(nodes: INode[]) {\n\t\t\tconst deleteCopiedNodes = !this.isReadOnlyRoute && !this.readOnlyEnv;\n\t\t\tthis.copyNodes(nodes, deleteCopiedNodes);\n\t\t\tif (deleteCopiedNodes) {\n\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t}\n\t\t},\n\n\t\tcopyNodes(nodes: INode[], isCut = false) {\n\t\t\tvoid this.getNodesToSave(nodes).then((data) => {\n\t\t\t\tconst workflowToCopy: IWorkflowToShare = {\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tinstanceId: this.rootStore.instanceId,\n\t\t\t\t\t},\n\t\t\t\t\t...data,\n\t\t\t\t};\n\n\t\t\t\tthis.removeForeignCredentialsFromWorkflow(\n\t\t\t\t\tworkflowToCopy,\n\t\t\t\t\tthis.credentialsStore.allCredentials,\n\t\t\t\t);\n\n\t\t\t\tconst nodeData = JSON.stringify(workflowToCopy, null, 2);\n\n\t\t\t\tthis.copyToClipboard(nodeData);\n\t\t\t\tif (data.nodes.length > 0) {\n\t\t\t\t\tif (!isCut) {\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: 'Copied!',\n\t\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.$telemetry.track('User copied nodes', {\n\t\t\t\t\t\tnode_types: data.nodes.map((node) => node.type),\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tasync stopExecution() {\n\t\t\tconst executionId = this.workflowsStore.activeExecutionId;\n\t\t\tif (executionId === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.stopExecutionInProgress = true;\n\t\t\t\tawait this.workflowsStore.stopCurrentExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\t// Execution stop might fail when the execution has already finished. Let's treat this here.\n\t\t\t\tconst execution = await this.workflowsStore.getExecution(executionId);\n\n\t\t\t\tif (execution === undefined) {\n\t\t\t\t\t// execution finished but was not saved (e.g. due to low connectivity)\n\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution({\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tdata: { finished: true, stoppedAt: new Date() },\n\t\t\t\t\t});\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\t\t\tthis.titleSet(this.workflowsStore.workflowName, 'IDLE');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.unsaved.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeView.showMessage.stopExecutionCatch.unsaved.message',\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else if (execution?.finished) {\n\t\t\t\t\t// execution finished before it could be stopped\n\n\t\t\t\t\tconst executedData = {\n\t\t\t\t\t\tdata: execution.data,\n\t\t\t\t\t\tfinished: execution.finished,\n\t\t\t\t\t\tmode: execution.mode,\n\t\t\t\t\t\tstartedAt: execution.startedAt,\n\t\t\t\t\t\tstoppedAt: execution.stoppedAt,\n\t\t\t\t\t} as IRun;\n\t\t\t\t\tconst pushData = {\n\t\t\t\t\t\tdata: executedData,\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tretryOf: execution.retryOf,\n\t\t\t\t\t} as IPushDataExecutionFinished;\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution(pushData);\n\t\t\t\t\tthis.titleSet(execution.workflowData.name, 'IDLE');\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.workflowsStore.setWorkflowExecutionData(executedData as IExecutionResponse);\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.message'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.stopExecution.title'));\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.stopExecutionInProgress = false;\n\n\t\t\tvoid this.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst trackProps = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(workflowData as IWorkflowBase, this.getNodeTypes())\n\t\t\t\t\t\t\t.nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\n\t\t\t\tthis.$telemetry.track('User clicked stop workflow execution', trackProps);\n\t\t\t});\n\t\t},\n\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.stopWaitingForWebhook.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * This method gets called when data got pasted into the window\n\t\t */\n\t\tasync receivedCopyPasteData(plainTextData: string): Promise<void> {\n\t\t\tif (this.readOnlyEnv) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentTab = getNodeViewTab(this.$route);\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW) {\n\t\t\t\tlet workflowData: IWorkflowDataUpdate | undefined;\n\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Check if it is an URL which could contain workflow data\n\t\t\t\tif (plainTextData.match(/^http[s]?:\\/\\/.*\\.json$/i)) {\n\t\t\t\t\t// Pasted data points to a possible workflow JSON file\n\n\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst importConfirm = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.receivedCopyPasteData.message', {\n\t\t\t\t\t\t\tinterpolate: { plainTextData },\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.receivedCopyPasteData.headline'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.receivedCopyPasteData.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.receivedCopyPasteData.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tif (importConfirm !== MODAL_CONFIRM) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tworkflowData = await this.getWorkflowDataFromUrl(plainTextData);\n\t\t\t\t\tif (workflowData === undefined) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Pasted data is is possible workflow data\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Check first if it is valid JSON\n\t\t\t\t\t\tworkflowData = JSON.parse(plainTextData);\n\n\t\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// Is no valid JSON so ignore\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn this.importWorkflowData(workflowData!, 'paste', false);\n\t\t\t}\n\t\t},\n\n\t\t// Returns the workflow data from a given URL. If no data gets found or\n\t\t// data is invalid it returns undefined and displays an error message by itself.\n\t\tasync getWorkflowDataFromUrl(url: string): Promise<IWorkflowDataUpdate | undefined> {\n\t\t\tlet workflowData: IWorkflowDataUpdate;\n\n\t\t\tthis.startLoading();\n\t\t\ttry {\n\t\t\t\tworkflowData = await this.workflowsStore.getWorkflowFromUrl(url);\n\t\t\t} catch (error) {\n\t\t\t\tthis.stopLoading();\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.getWorkflowDataFromUrl.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.stopLoading();\n\n\t\t\treturn workflowData;\n\t\t},\n\n\t\t// Imports the given workflow data into the current workflow\n\t\tasync importWorkflowData(\n\t\t\tworkflowData: IWorkflowToShare,\n\t\t\tsource: string,\n\t\t\timportTags = true,\n\t\t): Promise<void> {\n\t\t\t// If it is JSON check if it looks on the first look like data we can use\n\t\t\tif (!workflowData.hasOwnProperty('nodes') || !workflowData.hasOwnProperty('connections')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst nodeIdMap: { [prev: string]: string } = {};\n\t\t\t\tif (workflowData.nodes) {\n\t\t\t\t\tworkflowData.nodes.forEach((node: INode) => {\n\t\t\t\t\t\t//generate new webhookId if workflow already contains a node with the same webhookId\n\t\t\t\t\t\tif (node.webhookId && UPDATE_WEBHOOK_ID_NODE_TYPES.includes(node.type)) {\n\t\t\t\t\t\t\tconst isDuplicate = Object.values(this.getCurrentWorkflow().nodes).some(\n\t\t\t\t\t\t\t\t(n) => n.webhookId === node.webhookId,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (isDuplicate) {\n\t\t\t\t\t\t\t\tnode.webhookId = uuid();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// set all new ids when pasting/importing workflows\n\t\t\t\t\t\tif (node.id) {\n\t\t\t\t\t\t\tconst newId = uuid();\n\t\t\t\t\t\t\tnodeIdMap[newId] = node.id;\n\t\t\t\t\t\t\tnode.id = newId;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.id = uuid();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.removeUnknownCredentials(workflowData);\n\n\t\t\t\tconst currInstanceId = this.rootStore.instanceId;\n\n\t\t\t\tconst nodeGraph = JSON.stringify(\n\t\t\t\t\tTelemetryHelpers.generateNodesGraph(workflowData as IWorkflowBase, this.getNodeTypes(), {\n\t\t\t\t\t\tnodeIdMap,\n\t\t\t\t\t\tsourceInstanceId:\n\t\t\t\t\t\t\tworkflowData.meta && workflowData.meta.instanceId !== currInstanceId\n\t\t\t\t\t\t\t\t? workflowData.meta.instanceId\n\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t}).nodeGraph,\n\t\t\t\t);\n\t\t\t\tif (source === 'paste') {\n\t\t\t\t\tthis.$telemetry.track('User pasted nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else if (source === 'duplicate') {\n\t\t\t\t\tthis.$telemetry.track('User duplicated nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.$telemetry.track('User imported workflow', {\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// By default we automatically deselect all the currently\n\t\t\t\t// selected nodes and select the new ones\n\t\t\t\tthis.deselectAllNodes();\n\n\t\t\t\t// Fix the node position as it could be totally offscreen\n\t\t\t\t// and the pasted nodes would so not be directly visible to\n\t\t\t\t// the user\n\t\t\t\tthis.updateNodePositions(\n\t\t\t\t\tworkflowData,\n\t\t\t\t\tNodeViewUtils.getNewNodePosition(this.nodes, this.lastClickPosition),\n\t\t\t\t);\n\n\t\t\t\tconst data = await this.addNodesToWorkflow(workflowData);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdata.nodes!.forEach((node: INodeUi) => {\n\t\t\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tconst tagsEnabled = this.settingsStore.areTagsEnabled;\n\t\t\t\tif (importTags && tagsEnabled && Array.isArray(workflowData.tags)) {\n\t\t\t\t\tconst allTags = await this.tagsStore.fetchAll();\n\t\t\t\t\tconst tagNames = new Set(allTags.map((tag) => tag.name));\n\n\t\t\t\t\tconst workflowTags = workflowData.tags as ITag[];\n\t\t\t\t\tconst notFound = workflowTags.filter((tag) => !tagNames.has(tag.name));\n\n\t\t\t\t\tconst creatingTagPromises: Array<Promise<ITag>> = [];\n\t\t\t\t\tfor (const tag of notFound) {\n\t\t\t\t\t\tconst creationPromise = this.tagsStore.create(tag.name).then((tag: ITag) => {\n\t\t\t\t\t\t\tallTags.push(tag);\n\t\t\t\t\t\t\treturn tag;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcreatingTagPromises.push(creationPromise);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait Promise.all(creatingTagPromises);\n\n\t\t\t\t\tconst tagIds = workflowTags.reduce((accu: string[], imported: ITag) => {\n\t\t\t\t\t\tconst tag = allTags.find((tag) => tag.name === imported.name);\n\t\t\t\t\t\tif (tag) {\n\t\t\t\t\t\t\taccu.push(tag.id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn accu;\n\t\t\t\t\t}, []);\n\n\t\t\t\t\tthis.workflowsStore.addWorkflowTagIds(tagIds);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.importWorkflowData.title'));\n\t\t\t}\n\t\t},\n\n\t\tremoveUnknownCredentials(workflow: IWorkflowToShare) {\n\t\t\tif (!workflow?.nodes) return;\n\n\t\t\tfor (const node of workflow.nodes) {\n\t\t\t\tif (!node.credentials) continue;\n\n\t\t\t\tfor (const [name, credential] of Object.entries(node.credentials)) {\n\t\t\t\t\tif (credential.id === null) continue;\n\n\t\t\t\t\tif (!this.credentialsStore.getCredentialById(credential.id)) {\n\t\t\t\t\t\tdelete node.credentials[name];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonDragOver(event: DragEvent) {\n\t\t\tevent.preventDefault();\n\t\t},\n\n\t\tasync onDrop(event: DragEvent) {\n\t\t\tif (!event.dataTransfer) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst dropData = jsonParse<AddedNodesAndConnections>(\n\t\t\t\tevent.dataTransfer.getData(DRAG_EVENT_DATA_KEY),\n\t\t\t);\n\t\t\tif (dropData) {\n\t\t\t\tconst mousePosition = this.getMousePositionWithinNodeView(event);\n\t\t\t\tconst insertNodePosition = [\n\t\t\t\t\tmousePosition[0] - NodeViewUtils.NODE_SIZE / 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tmousePosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t] as XYPosition;\n\n\t\t\t\tawait this.onAddNodes(dropData, true, insertNodePosition);\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t}\n\t\t},\n\n\t\tnodeDeselectedByName(nodeName: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeDeselected(node);\n\t\t\t}\n\t\t},\n\n\t\tnodeSelectedByName(nodeName: string, setActive = false, deselectAllOthers?: boolean) {\n\t\t\tif (deselectAllOthers === true) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeSelected(node);\n\t\t\t\tthis.uiStore.lastSelectedNode = node.name;\n\t\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = null;\n\t\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid = null;\n\t\t\t\tthis.canvasStore.lastSelectedConnection = null;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\t\tif (setActive) {\n\t\t\t\t\tthis.ndvStore.activeNodeName = node.name;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowMaxNodeTypeError(nodeTypeData: INodeTypeDescription) {\n\t\t\tconst maxNodes = nodeTypeData.maxNodes;\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.title'),\n\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.message', {\n\t\t\t\t\tadjustToNumber: maxNodes,\n\t\t\t\t\tinterpolate: { nodeTypeDataDisplayName: nodeTypeData.displayName },\n\t\t\t\t}),\n\t\t\t\ttype: 'error',\n\t\t\t\tduration: 0,\n\t\t\t});\n\t\t},\n\n\t\tasync getNewNodeWithDefaultCredential(\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t\toverrides: Partial<INodeUi>,\n\t\t) {\n\t\t\tlet nodeVersion = nodeTypeData.defaultVersion;\n\n\t\t\tif (nodeVersion === undefined) {\n\t\t\t\tnodeVersion = Array.isArray(nodeTypeData.version)\n\t\t\t\t\t? nodeTypeData.version.slice(-1)[0]\n\t\t\t\t\t: nodeTypeData.version;\n\t\t\t}\n\n\t\t\tconst newNodeData: INodeUi = {\n\t\t\t\tid: uuid(),\n\t\t\t\tname: overrides.name ?? (nodeTypeData.defaults.name as string),\n\t\t\t\ttype: nodeTypeData.name,\n\t\t\t\ttypeVersion: nodeVersion,\n\t\t\t\tposition: [0, 0],\n\t\t\t\tparameters: {},\n\t\t\t};\n\n\t\t\tconst credentialPerType = nodeTypeData.credentials\n\t\t\t\t?.map((type) => this.credentialsStore.getUsableCredentialByType(type.name))\n\t\t\t\t.flat();\n\n\t\t\tif (credentialPerType && credentialPerType.length === 1) {\n\t\t\t\tconst defaultCredential = credentialPerType[0];\n\n\t\t\t\tconst selectedCredentials = this.credentialsStore.getCredentialById(defaultCredential.id);\n\t\t\t\tconst selected = { id: selectedCredentials.id, name: selectedCredentials.name };\n\t\t\t\tconst credentials = {\n\t\t\t\t\t[defaultCredential.type]: selected,\n\t\t\t\t};\n\n\t\t\t\tawait this.loadNodesProperties(\n\t\t\t\t\t[newNodeData].map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t\t);\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(newNodeData.type, newNodeData.typeVersion);\n\t\t\t\tconst nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType?.properties || [],\n\t\t\t\t\t{},\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnewNodeData,\n\t\t\t\t);\n\n\t\t\t\tif (nodeTypeData.credentials) {\n\t\t\t\t\tconst authentication = nodeTypeData.credentials.find(\n\t\t\t\t\t\t(type) => type.name === defaultCredential.type,\n\t\t\t\t\t);\n\t\t\t\t\tif (authentication?.displayOptions?.hide) {\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst authDisplayOptions = authentication?.displayOptions?.show;\n\t\t\t\t\tif (!authDisplayOptions) {\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Object.keys(authDisplayOptions).length === 1 && authDisplayOptions.authentication) {\n\t\t\t\t\t\t// ignore complex case when there's multiple dependencies\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\n\t\t\t\t\t\tlet parameters: { [key: string]: string } = {};\n\t\t\t\t\t\tfor (const displayOption of Object.keys(authDisplayOptions)) {\n\t\t\t\t\t\t\tif (nodeParameters && !nodeParameters[displayOption]) {\n\t\t\t\t\t\t\t\tparameters = {};\n\t\t\t\t\t\t\t\tnewNodeData.credentials = undefined;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst optionValue = authDisplayOptions[displayOption]?.[0];\n\t\t\t\t\t\t\tif (optionValue && typeof optionValue === 'string') {\n\t\t\t\t\t\t\t\tparameters[displayOption] = optionValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnewNodeData.parameters = {\n\t\t\t\t\t\t\t\t...newNodeData.parameters,\n\t\t\t\t\t\t\t\t...parameters,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newNodeData;\n\t\t},\n\n\t\tasync injectNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tconst nodeTypeData: INodeTypeDescription | null =\n\t\t\t\tthis.nodeTypesStore.getNodeType(nodeTypeName);\n\n\t\t\tif (nodeTypeData === null) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.addNodeButton.title'),\n\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.addNodeButton.message', {\n\t\t\t\t\t\tinterpolate: { nodeTypeName },\n\t\t\t\t\t}),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tnodeTypeData.maxNodes !== undefined &&\n\t\t\t\tthis.getNodeTypeCount(nodeTypeName) >= nodeTypeData.maxNodes\n\t\t\t) {\n\t\t\t\tthis.showMaxNodeTypeError(nodeTypeData);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newNodeData = await this.getNewNodeWithDefaultCredential(nodeTypeData, {\n\t\t\t\tname: options.name,\n\t\t\t});\n\n\t\t\t// when pulling new connection from node or injecting into a connection\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\tif (options.position) {\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\tthis.canvasStore.getNodesWithPlaceholderNode(),\n\t\t\t\t\toptions.position,\n\t\t\t\t);\n\t\t\t} else if (lastSelectedNode) {\n\t\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t// set when injecting into a connection\n\t\t\t\t\tconst [diffX] = NodeViewUtils.getConnectorLengths(lastSelectedConnection);\n\t\t\t\t\tif (diffX <= NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES) {\n\t\t\t\t\t\tthis.pushDownstreamNodes(\n\t\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t\t\tNodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\ttrackHistory,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// set when pulling connections\n\t\t\t\tif (this.canvasStore.newNodeInsertPosition) {\n\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, [\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[0] + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t\t]);\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\t} else {\n\t\t\t\t\tlet yOffset = 0;\n\t\t\t\t\tconst workflow = this.getCurrentWorkflow();\n\n\t\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (sourceNodeType) {\n\t\t\t\t\t\t\tconst offsets = [\n\t\t\t\t\t\t\t\t[-100, 100],\n\t\t\t\t\t\t\t\t[-140, 0, 140],\n\t\t\t\t\t\t\t\t[-240, -100, 100, 240],\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tconst sourceNodeOutputs = NodeHelpers.getNodeOutputs(\n\t\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\t\tsourceNodeType,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst sourceNodeOutputTypes = NodeHelpers.getConnectionTypes(sourceNodeOutputs);\n\n\t\t\t\t\t\t\tconst sourceNodeOutputMainOutputs = sourceNodeOutputTypes.filter(\n\t\t\t\t\t\t\t\t(output) => output === NodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (sourceNodeOutputMainOutputs.length > 1) {\n\t\t\t\t\t\t\t\tconst offset = offsets[sourceNodeOutputMainOutputs.length - 2];\n\t\t\t\t\t\t\t\tconst sourceOutputIndex = lastSelectedConnection.__meta\n\t\t\t\t\t\t\t\t\t? lastSelectedConnection.__meta.sourceOutputIndex\n\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tyOffset = offset[sourceOutputIndex];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// It fails when the outputs are an expression. As those nodes have\n\t\t\t\t\t\t// normally no outputs by default and the only reason we need the\n\t\t\t\t\t\t// outputs here is to calculate the position, it is fine to assume\n\t\t\t\t\t\t// that they have no outputs and are so treated as a regular node\n\t\t\t\t\t\t// with only \"main\" outputs.\n\t\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, newNodeData, nodeTypeData);\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t\t\tconst lastSelectedNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t);\n\n\t\t\t\t\t// If node has only scoped outputs, position it below the last selected node\n\t\t\t\t\tif (\n\t\t\t\t\t\toutputTypes.length > 0 &&\n\t\t\t\t\t\toutputTypes.every((outputName) => outputName !== NodeConnectionType.Main)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst lastSelectedNodeWorkflow = workflow.getNode(lastSelectedNode.name);\n\t\t\t\t\t\tconst lastSelectedInputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNodeWorkflow!,\n\t\t\t\t\t\t\tlastSelectedNodeType!,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst lastSelectedInputTypes = NodeHelpers.getConnectionTypes(lastSelectedInputs);\n\n\t\t\t\t\t\tconst scopedConnectionIndex = (lastSelectedInputTypes || [])\n\t\t\t\t\t\t\t.filter((input) => input !== NodeConnectionType.Main)\n\t\t\t\t\t\t\t.findIndex((inputType) => outputs[0] === inputType);\n\n\t\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tlastSelectedNode.position[0] +\n\t\t\t\t\t\t\t\t\t(NodeViewUtils.NODE_SIZE /\n\t\t\t\t\t\t\t\t\t\t(Math.max(lastSelectedNodeType?.inputs?.length ?? 1), 1)) *\n\t\t\t\t\t\t\t\t\t\tscopedConnectionIndex,\n\t\t\t\t\t\t\t\tlastSelectedNode.position[1] + NodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Has only main outputs or no outputs at all\n\t\t\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\tlastSelectedNodeType!,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst inputsTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\t\t\tlet pushOffset = NodeViewUtils.PUSH_NODES_OFFSET;\n\t\t\t\t\t\tif (!!inputsTypes.find((input) => input !== NodeConnectionType.Main)) {\n\t\t\t\t\t\t\t// If the node has scoped inputs, push it down a bit more\n\t\t\t\t\t\t\tpushOffset += 150;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a node is active then add the new node directly after the current one\n\t\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[lastSelectedNode.position[0] + pushOffset, lastSelectedNode.position[1] + yOffset],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If added node is a trigger and it's the first one added to the canvas\n\t\t\t\t// we place it at canvasAddButtonPosition to replace the canvas add button\n\t\t\t\tconst position =\n\t\t\t\t\tthis.nodeTypesStore.isTriggerNode(nodeTypeName) && !this.containsTrigger\n\t\t\t\t\t\t? this.canvasStore.canvasAddButtonPosition\n\t\t\t\t\t\t: // If no node is active find a free spot\n\t\t\t\t\t\t (this.lastClickPosition as XYPosition);\n\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, position);\n\t\t\t}\n\n\t\t\tconst localizedName = this.locale.localizeNodeName(newNodeData.name, newNodeData.type);\n\n\t\t\tnewNodeData.name = this.uniqueNodeName(localizedName);\n\n\t\t\tif (nodeTypeData.webhooks?.length) {\n\t\t\t\tnewNodeData.webhookId = uuid();\n\t\t\t}\n\n\t\t\tawait this.addNodes([newNodeData], undefined, trackHistory);\n\t\t\tthis.workflowsStore.setNodePristine(newNodeData.name, true);\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tif (nodeTypeName === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addSticky', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('nodeView.addNodeButton', { nodeTypeName });\n\t\t\t\tuseSegment().trackAddedTrigger(nodeTypeName);\n\t\t\t\tconst trackProperties: ITelemetryTrackProperties = {\n\t\t\t\t\tnode_type: nodeTypeName,\n\t\t\t\t\tnode_version: newNodeData.typeVersion,\n\t\t\t\t\tis_auto_add: isAutoAdd,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tdrag_and_drop: options.dragAndDrop,\n\t\t\t\t};\n\n\t\t\t\tif (lastSelectedNode) {\n\t\t\t\t\ttrackProperties.input_node_type = lastSelectedNode.type;\n\t\t\t\t}\n\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addNodeButton', trackProperties);\n\t\t\t}\n\n\t\t\t// Automatically deselect all nodes and select the current one and also active\n\t\t\t// current node. But only if it's added manually by the user (not by undo/redo mechanism)\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.nodeSelectedByName(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\tshowDetail && nodeTypeName !== STICKY_NODE_TYPE,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn newNodeData;\n\t\t},\n\t\tgetConnection(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOuputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t): IConnection | undefined {\n\t\t\tconst nodeConnections =\n\t\t\t\tthis.workflowsStore.outgoingConnectionsByNodeName(sourceNodeName)[type];\n\t\t\tif (nodeConnections) {\n\t\t\t\tconst connections: IConnection[] | null = nodeConnections[sourceNodeOutputIndex];\n\n\t\t\t\tif (connections) {\n\t\t\t\t\treturn connections.find(\n\t\t\t\t\t\t(connection: IConnection) =>\n\t\t\t\t\t\t\tconnection.node === targetNodeName && connection.index === targetNodeOuputIndex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tconnectTwoNodes(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOutputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst targetNode = this.workflowsStore.getNodeByName(targetNodeName);\n\n\t\t\tif (\n\t\t\t\tsourceNode &&\n\t\t\t\ttargetNode &&\n\t\t\t\t!this.checkNodeConnectionAllowed(sourceNode, targetNode, type)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.getConnection(\n\t\t\t\t\tsourceNodeName,\n\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\ttargetNodeName,\n\t\t\t\t\ttargetNodeOutputIndex,\n\t\t\t\t\ttype,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst connectionData = [\n\t\t\t\t{\n\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: sourceNodeOutputIndex,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: targetNodeOutputIndex,\n\t\t\t\t},\n\t\t\t] as [IConnection, IConnection];\n\n\t\t\tthis.__addConnection(connectionData);\n\t\t},\n\t\tasync addNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tconst lastSelectedNodeOutputIndex = this.uiStore.lastSelectedNodeOutputIndex;\n\t\t\tconst lastSelectedNodeEndpointUuid = this.uiStore.lastSelectedNodeEndpointUuid;\n\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst newNodeData = await this.injectNode(\n\t\t\t\tnodeTypeName,\n\t\t\t\toptions,\n\t\t\t\tshowDetail,\n\t\t\t\ttrackHistory,\n\t\t\t\tisAutoAdd,\n\t\t\t);\n\t\t\tif (!newNodeData) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst outputIndex = lastSelectedNodeOutputIndex || 0;\n\t\t\tconst targetEndpoint = lastSelectedNodeEndpointUuid || '';\n\n\t\t\t// Handle connection of scoped_endpoint types\n\t\t\tif (lastSelectedNodeEndpointUuid && !isAutoAdd) {\n\t\t\t\tconst lastSelectedEndpoint = this.instance.getEndpoint(lastSelectedNodeEndpointUuid);\n\t\t\t\tif (\n\t\t\t\t\tlastSelectedEndpoint &&\n\t\t\t\t\tthis.checkNodeConnectionAllowed(\n\t\t\t\t\t\tlastSelectedNode!,\n\t\t\t\t\t\tnewNodeData,\n\t\t\t\t\t\tlastSelectedEndpoint.scope as NodeConnectionType,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconst connectionType = lastSelectedEndpoint.scope as ConnectionTypes;\n\t\t\t\t\tconst newNodeElement = this.instance.getManagedElement(newNodeData.id);\n\t\t\t\t\tconst newNodeConnections = this.instance.getEndpoints(newNodeElement);\n\t\t\t\t\tconst viableConnection = newNodeConnections.find((conn) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tconn.scope === connectionType &&\n\t\t\t\t\t\t\tlastSelectedEndpoint.parameters.connection !== conn.parameters.connection\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.instance?.connect({\n\t\t\t\t\t\tuuids: [targetEndpoint, viableConnection?.uuid || ''],\n\t\t\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If a node is last selected then connect between the active and its child ones\n\t\t\tif (lastSelectedNode && !isAutoAdd) {\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\tif (lastSelectedConnection?.__meta) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(lastSelectedConnection, trackHistory);\n\n\t\t\t\t\tconst targetNodeName = lastSelectedConnection.__meta.targetNodeName;\n\t\t\t\t\tconst targetOutputIndex = lastSelectedConnection.__meta.targetOutputIndex;\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Connect active node to the newly created one\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\t\tgetNodeCreatorFilter(nodeName: string, outputType?: NodeConnectionType) {\n\t\t\tlet filter;\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(nodeName);\n\t\t\tif (!workflowNode) return { nodes: [] };\n\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\tworkflowNode?.type,\n\t\t\t\tworkflowNode.typeVersion,\n\t\t\t);\n\t\t\tif (nodeType) {\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);\n\n\t\t\t\tconst filterFound = inputs.filter((input) => {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== outputType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t}) as INodeInputConfiguration[];\n\n\t\t\t\tif (filterFound.length) {\n\t\t\t\t\tfilter = filterFound[0].filter;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filter;\n\t\t},\n\t\tinsertNodeAfterSelected(info: {\n\t\t\tsourceId: string;\n\t\t\tindex: number;\n\t\t\teventSource: NodeCreatorOpenSource;\n\t\t\tconnection?: Connection;\n\t\t\tnodeCreatorView?: string;\n\t\t\toutputType?: NodeConnectionType;\n\t\t\tendpointUuid?: string;\n\t\t}) {\n\t\t\tconst type = info.outputType ?? NodeConnectionType.Main;\n\t\t\t// Get the node and set it as active that new nodes\n\t\t\t// which get created get automatically connected\n\t\t\t// to it.\n\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.sourceId);\n\t\t\tif (!sourceNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.uiStore.lastSelectedNode = sourceNode.name;\n\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid =\n\t\t\t\tinfo.endpointUuid ?? info.connection?.target.jtk?.endpoint.uuid;\n\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = info.index;\n\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\tif (info.connection) {\n\t\t\t\tthis.canvasStore.lastSelectedConnection = info.connection;\n\t\t\t}\n\n\t\t\tthis.onToggleNodeCreator({\n\t\t\t\tsource: info.eventSource,\n\t\t\t\tcreateNodeActive: true,\n\t\t\t\tnodeCreatorView: info.nodeCreatorView,\n\t\t\t});\n\n\t\t\t// TODO: The animation is a bit glitchy because we're updating view stack immediately\n\t\t\t// after the node creator is opened\n\t\t\tconst isOutput = info.connection?.endpoints[0].parameters.connection === 'source';\n\t\t\tconst isScopedConnection =\n\t\t\t\ttype !== NodeConnectionType.Main && Object.values(NodeConnectionType).includes(type);\n\n\t\t\tif (isScopedConnection) {\n\t\t\t\tuseViewStacks()\n\t\t\t\t\t.gotoCompatibleConnectionView(\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tisOutput,\n\t\t\t\t\t\tthis.getNodeCreatorFilter(sourceNode.name, type),\n\t\t\t\t\t)\n\t\t\t\t\t.catch((e) => {});\n\t\t\t}\n\t\t},\n\t\tasync onEventConnectionAbort(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.dropPrevented) {\n\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(connection.parameters.nodeId);\n\t\t\t\t\tconst connectionType = connection.parameters.type ?? NodeConnectionType.Main;\n\t\t\t\t\tconst overrideTargetEndpoint = connection?.connector\n\t\t\t\t\t\t?.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (sourceNode) {\n\t\t\t\t\t\tconst isTarget = connection.parameters.connection === 'target';\n\t\t\t\t\t\tconst sourceNodeName = isTarget ? this.pullConnActiveNodeName : sourceNode.name;\n\t\t\t\t\t\tconst targetNodeName = isTarget ? sourceNode.name : this.pullConnActiveNodeName;\n\t\t\t\t\t\tconst outputIndex = connection.parameters.index;\n\t\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: connection.parameters.nodeId,\n\t\t\t\t\tindex: connection.parameters.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t\t\t\tconnection,\n\t\t\t\t\toutputType: connection.parameters.type,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tcheckNodeConnectionAllowed(\n\t\t\tsourceNode: INodeUi,\n\t\t\ttargetNode: INodeUi,\n\t\t\ttargetInfoType: NodeConnectionType,\n\t\t): boolean {\n\t\t\tconst targetNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\ttargetNode.type,\n\t\t\t\ttargetNode.typeVersion,\n\t\t\t);\n\n\t\t\tif (targetNodeType?.inputs?.length) {\n\t\t\t\tconst workflow = this.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(targetNode.name);\n\t\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\t\tif (targetNodeType) {\n\t\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, targetNodeType);\n\t\t\t\t}\n\n\t\t\t\tfor (const input of inputs || []) {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== targetInfoType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (input.filter.nodes.length) {\n\t\t\t\t\t\tif (!input.filter.nodes.includes(sourceNode.type)) {\n\t\t\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.title'),\n\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.message', {\n\t\t\t\t\t\t\t\t\tinterpolate: { sourceNodeName: sourceNode.name, targetNodeName: targetNode.name },\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tonInterceptBeforeDrop(info: BeforeDropParams) {\n\t\t\ttry {\n\t\t\t\tlet sourceInfo: ComponentParameters;\n\t\t\t\tlet targetInfo: ComponentParameters;\n\t\t\t\tif (info.connection.endpoints[0].parameters.connection === 'target') {\n\t\t\t\t\tsourceInfo = info.dropEndpoint.parameters;\n\t\t\t\t\ttargetInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t} else {\n\t\t\t\t\tsourceInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t\ttargetInfo = info.dropEndpoint.parameters;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tsourceInfo.type !== targetInfo.type ||\n\t\t\t\t\tsourceInfo.connection === targetInfo.connection\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(sourceInfo.nodeId);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeById(targetInfo.nodeId);\n\n\t\t\t\tconst sourceNodeName = sourceNode?.name || '';\n\t\t\t\tconst targetNodeName = targetNode?.name || '';\n\n\t\t\t\tif (sourceNode && targetNode) {\n\t\t\t\t\tif (!this.checkNodeConnectionAllowed(sourceNode, targetNode, targetInfo.type)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check for duplicates\n\t\t\t\tif (\n\t\t\t\t\tthis.getConnection(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetInfo.index,\n\t\t\t\t\t\tsourceInfo.type,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tonEventConnection(info: ConnectionEstablishedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\t// so switch them around if necessary\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst sourceInfo = info.sourceEndpoint.parameters;\n\t\t\t\tconst targetInfo = info.targetEndpoint.parameters;\n\n\t\t\t\tconst sourceNodeName = this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name;\n\t\t\t\tconst targetNodeName = this.workflowsStore.getNodeById(targetInfo.nodeId)?.name;\n\n\t\t\t\tif (sourceNodeName && targetNodeName) {\n\t\t\t\t\tinfo.connection.__meta = {\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceOutputIndex: sourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex: targetInfo.index,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tNodeViewUtils.resetConnection(info.connection);\n\t\t\t\tNodeViewUtils.moveBackInputLabelPosition(info.targetEndpoint);\n\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tthis.dropPrevented = true;\n\t\t\t\tthis.workflowsStore.addConnection({ connection: connectionData });\n\n\t\t\t\tif (!this.isReadOnlyRoute && !this.readOnlyEnv) {\n\t\t\t\t\tNodeViewUtils.hideOutputNameLabel(info.sourceEndpoint);\n\t\t\t\t\tNodeViewUtils.addConnectionActionsOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\t\t\tsourceId: info.sourceEndpoint.parameters.nodeId,\n\t\t\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t\t\t\tconnection: info.connection,\n\t\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tconst endpointArrow = NodeViewUtils.getOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\tOVERLAY_ENDPOINT_ARROW_ID,\n\t\t\t\t\t);\n\t\t\t\t\tif (sourceInfo.type !== NodeConnectionType.Main) {\n\t\t\t\t\t\t// Not \"main\" connections get a different connection style\n\t\t\t\t\t\tinfo.connection.setPaintStyle(\n\t\t\t\t\t\t\tgetConnectorPaintStyleData(info.connection, info.sourceEndpoint.parameters.category),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tendpointArrow?.setVisible(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.dropPrevented = false;\n\t\t\t\tif (!this.isLoading) {\n\t\t\t\t\tthis.uiStore.stateIsDirty = true;\n\t\t\t\t\tif (!this.suspendRecordingDetachedConnections) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddConnectionCommand(connectionData));\n\t\t\t\t\t}\n\t\t\t\t\t// When we add multiple nodes, this event could be fired hundreds of times for large workflows.\n\t\t\t\t\t// And because the updateNodesInputIssues() method is quite expensive, we only call it if not in insert mode\n\t\t\t\t\tif (!this.isInsertingNodes) {\n\t\t\t\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\t\t\t\tthis.resetEndpointsErrors();\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\t\t\t\tinfo.source,\n\t\t\t\t\t\t\t\tinfo.target,\n\t\t\t\t\t\t\t\tinfo.connection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t\t\t\t? (info.connection.connector.canvas as HTMLElement)\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\taddConectionsTestData() {\n\t\t\tthis.instance.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\tconnection.source,\n\t\t\t\t\tconnection.target,\n\t\t\t\t\tconnection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t? (connection?.connector.canvas as HTMLElement)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\tonDragMove() {\n\t\t\tconst totalNodes = this.nodes.length;\n\t\t\tvoid this.callDebounced('updateConnectionsOverlays', {\n\t\t\t\tdebounceTime: totalNodes > 20 ? 200 : 0,\n\t\t\t});\n\t\t},\n\t\tupdateConnectionsOverlays() {\n\t\t\tthis.instance?.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\n\t\t\t\tObject.values(connection.overlays).forEach((overlay) => {\n\t\t\t\t\tif (!overlay.canvas) return;\n\t\t\t\t\tthis.instance?.repaint(overlay.canvas);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tisConnectionActive(connection: Connection | null) {\n\t\t\tif (!connection?.id || !this.activeConnection?.id) return false;\n\n\t\t\treturn this.activeConnection?.id === connection.id;\n\t\t},\n\t\tonConnectionMouseOver(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer !== undefined) {\n\t\t\t\t\tclearTimeout(this.exitTimer);\n\t\t\t\t\tthis.exitTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\tthis.enterTimer ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\tthis.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.enterTimer = setTimeout(() => {\n\t\t\t\t\t// If there is already an active connection then hide it first\n\t\t\t\t\tif (this.activeConnection && !this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t}\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tNodeViewUtils.showConnectionActions(connection);\n\t\t\t\t\t\tthis.activeConnection = connection;\n\t\t\t\t\t}\n\t\t\t\t}, 150);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMouseOut(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer) return;\n\n\t\t\t\tif (this.enterTimer) {\n\t\t\t\t\tclearTimeout(this.enterTimer);\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\t!this.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.exitTimer = setTimeout(() => {\n\t\t\t\t\tthis.exitTimer = undefined;\n\n\t\t\t\t\tif (connection && this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMoved(info: ConnectionMovedParams) {\n\t\t\ttry {\n\t\t\t\t// When a connection gets moved from one node to another it for some reason\n\t\t\t\t// calls the \"connection\" event but not the \"connectionDetached\" one. So we listen\n\t\t\t\t// additionally to the \"connectionMoved\" event and then only delete the existing connection.\n\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.connection);\n\n\t\t\t\tconst sourceInfo = info.connection.parameters;\n\t\t\t\tconst targetInfo = info.originalEndpoint.parameters;\n\n\t\t\t\tconst connectionInfo = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(targetInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t] as [IConnection, IConnection];\n\n\t\t\t\tthis.__removeConnection(connectionInfo, false);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonEndpointMouseOver(endpoint: Endpoint, mouse) {\n\t\t\t// This event seems bugged. It gets called constantly even when the mouse is not over the endpoint\n\t\t\t// if the endpoint has a connection attached to it. So we need to check if the mouse is actually over\n\t\t\t// the endpoint.\n\t\t\tif (!endpoint.isTarget || mouse.target !== endpoint.endpoint.canvas) return;\n\t\t\tthis.instance.setHover(endpoint, true);\n\t\t},\n\t\tonEndpointMouseOut(endpoint: Endpoint) {\n\t\t\tif (!endpoint.isTarget) return;\n\t\t\tthis.instance.setHover(endpoint, false);\n\t\t},\n\t\tasync onConnectionDetached(info: ConnectionDetachedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.targetEndpoint);\n\t\t\t\tNodeViewUtils.showOutputNameLabel(info.sourceEndpoint, info.connection);\n\n\t\t\t\tinfo.connection.removeOverlays();\n\t\t\t\tthis.__removeConnectionByConnectionInfo(info, false, false);\n\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\t// establish new connection when dragging connection from one node to another\n\t\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.connection.parameters.nodeId);\n\t\t\t\t\tconst sourceNodeName = sourceNode.name;\n\t\t\t\t\tconst outputIndex = info.connection.parameters.index;\n\t\t\t\t\tconst overrideTargetEndpoint = info.connection.connector\n\t\t\t\t\t\t.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (connectionInfo) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t\t}\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\tthis.pullConnActiveNodeName,\n\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\tawait this.$nextTick();\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t} else if (\n\t\t\t\t\t!this.historyStore.bulkInProgress &&\n\t\t\t\t\t!this.suspendRecordingDetachedConnections &&\n\t\t\t\t\tconnectionInfo\n\t\t\t\t) {\n\t\t\t\t\t// Ff connection being detached by user, save this in history\n\t\t\t\t\t// but skip if it's detached as a side effect of bulk undo/redo or node rename process\n\t\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionInfo, this);\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t\t}\n\n\t\t\t\tvoid this.nodeHelpers.updateNodesInputIssues();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDrag(connection: Connection) {\n\t\t\t// The overlays are visible by default so we need to hide the midpoint arrow\n\t\t\t// manually\n\t\t\tconnection.overlays['midpoint-arrow']?.setVisible(false);\n\t\t\ttry {\n\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\tthis.pullConnActive = true;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\tNodeViewUtils.hideConnectionActions(connection);\n\t\t\t\tNodeViewUtils.resetConnection(connection);\n\n\t\t\t\tconst scope = connection.scope as ConnectionTypes;\n\t\t\t\tconst scopedEndpoints = Array.from(\n\t\t\t\t\tdocument.querySelectorAll(`[data-jtk-scope-${scope}=true]`),\n\t\t\t\t);\n\t\t\t\tconst connectionType = connection.parameters.connection;\n\t\t\t\tconst requiredType = connectionType === 'source' ? 'target' : 'source';\n\n\t\t\t\tconst filteredEndpoints = scopedEndpoints.filter((el) => {\n\t\t\t\t\tconst endpoint = el.jtk.endpoint as Endpoint;\n\t\t\t\t\tif (!endpoint) return false;\n\n\t\t\t\t\t// Prevent snapping(but not connecting) to the same node\n\t\t\t\t\tconst isSameNode = endpoint.parameters.nodeId === connection.parameters.nodeId;\n\t\t\t\t\tconst endpointType = endpoint.parameters.connection;\n\n\t\t\t\t\treturn !isSameNode && endpointType === requiredType;\n\t\t\t\t});\n\n\t\t\t\tconst onMouseMove = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tif (!connection) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst intersectingEndpoints = filteredEndpoints\n\t\t\t\t\t\t.filter((element: Element) => {\n\t\t\t\t\t\t\tconst endpoint = element.jtk.endpoint as Endpoint;\n\n\t\t\t\t\t\t\tif (element.classList.contains('jtk-floating-endpoint')) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst isEndpointIntersect = NodeViewUtils.isElementIntersection(element, e, 50);\n\t\t\t\t\t\t\tconst isNodeElementIntersect = NodeViewUtils.isElementIntersection(\n\t\t\t\t\t\t\t\tendpoint.element,\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t\t30,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (isEndpointIntersect || isNodeElementIntersect) {\n\t\t\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t\t\t\t\t\tif (!nodeType) return false;\n\n\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.sort((a, b) => {\n\t\t\t\t\t\t\tconst aEndpointIntersect = NodeViewUtils.calculateElementIntersection(a, e, 50);\n\t\t\t\t\t\t\tconst bEndpointIntersect = NodeViewUtils.calculateElementIntersection(b, e, 50);\n\n\t\t\t\t\t\t\t// If both intersections are null, treat them as equal\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y && !bEndpointIntersect?.y) {\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// If one intersection is null, sort the non-null one first\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y) return 1;\n\t\t\t\t\t\t\tif (!bEndpointIntersect?.y) return -1;\n\n\t\t\t\t\t\t\t// Otherwise, sort by ascending Y distance\n\t\t\t\t\t\t\treturn bEndpointIntersect.y - aEndpointIntersect.y;\n\t\t\t\t\t\t});\n\n\t\t\t\t\tif (intersectingEndpoints.length > 0) {\n\t\t\t\t\t\tconst intersectingEndpoint = intersectingEndpoints[0];\n\t\t\t\t\t\tconst endpoint = intersectingEndpoint.jtk.endpoint as Endpoint;\n\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\tthis.pullConnActiveNodeName = node?.name ?? null;\n\n\t\t\t\t\t\tNodeViewUtils.showDropConnectionState(connection, endpoint);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tNodeViewUtils.showPullConnectionState(connection);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst onMouseUp = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tthis.pullConnActive = false;\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = this.getMousePositionWithinNodeView(e);\n\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\twindow.removeEventListener('mousemove', onMouseMove);\n\t\t\t\t\twindow.removeEventListener('mouseup', onMouseUp);\n\n\t\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\tconnection: null,\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener('mousemove', onMouseMove);\n\t\t\t\twindow.addEventListener('touchmove', onMouseMove);\n\t\t\t\twindow.addEventListener('mouseup', onMouseUp);\n\t\t\t\twindow.addEventListener('touchend', onMouseMove);\n\n\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\ttype: connection.parameters.type,\n\t\t\t\t\tconnection: connection.parameters.connection,\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDragAbortDetached(connection: Connection) {\n\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t.flatMap((endpoints) => Object.values(endpoints))\n\t\t\t\t.filter((endpoint) => endpoint.endpoint.type === 'N8nPlus')\n\t\t\t\t.forEach((endpoint) => setTimeout(() => endpoint.instance.revalidate(endpoint.element), 0));\n\t\t},\n\t\tonPlusEndpointClick(endpoint: Endpoint) {\n\t\t\tif (endpoint?.__meta) {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonAddInputEndpointClick(endpoint: Endpoint) {\n\t\t\tif (endpoint?.__meta) {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.ADD_INPUT_ENDPOINT,\n\t\t\t\t\tnodeCreatorView: AI_NODE_CREATOR_VIEW,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tbindCanvasEvents() {\n\t\t\tif (this.eventsAttached) return;\n\t\t\tthis.instance.bind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.bind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.bind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\t\t\tthis.instance.bind(\n\t\t\t\t[EVENT_CONNECTION_DRAG, EVENT_CONNECTION_ABORT, EVENT_CONNECTION_DETACHED],\n\t\t\t\tthis.onConnectionDragAbortDetached,\n\t\t\t);\n\t\t\tthis.instance.bind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.bind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\n\t\t\tthis.eventsAttached = true;\n\t\t},\n\t\tunbindCanvasEvents() {\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.unbind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.unbind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.unbind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tunbindEndpointEventListeners(bind = true) {\n\t\t\tif (this.instance) {\n\t\t\t\t// Get all the endpoints and unbind the events\n\t\t\t\tconst elements = this.instance.getManagedElements();\n\t\t\t\tfor (const element of Object.values(elements)) {\n\t\t\t\t\tconst endpoints = element.endpoints;\n\t\t\t\t\tfor (const endpoint of endpoints || []) {\n\t\t\t\t\t\tconst endpointInstance = endpoint?.endpoint;\n\t\t\t\t\t\tif (endpointInstance && endpointInstance.type === N8nPlusEndpointType) {\n\t\t\t\t\t\t\t(endpointInstance as N8nPlusEndpoint).unbindEvents();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tonBeforeUnload(e: BeforeUnloadEvent) {\n\t\t\tif (this.isDemo || window.preventNodeViewBeforeUnload) {\n\t\t\t\treturn;\n\t\t\t} else if (this.uiStore.stateIsDirty) {\n\t\t\t\t// A bit hacky solution to detecting users leaving the page after prompt:\n\t\t\t\t// 1. Notify that workflow is closed straight away\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\t// 2. If user decided to stay on the page we notify that the workflow is opened again\n\t\t\t\tthis.unloadTimeout = setTimeout(() => {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowOpened(this.workflowsStore.workflowId);\n\t\t\t\t}, 5 * TIME.SECOND);\n\t\t\t\te.returnValue = true; //Gecko + IE\n\t\t\t\treturn true; //Gecko + Webkit, Safari, Chrome etc.\n\t\t\t} else {\n\t\t\t\tthis.startLoading(this.$locale.baseText('nodeView.redirecting'));\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tonUnload() {\n\t\t\t// This will fire if users decides to leave the page after prompted\n\t\t\t// Clear the interval to prevent the notification from being sent\n\t\t\tclearTimeout(this.unloadTimeout);\n\t\t},\n\t\tasync newWorkflow(): Promise<void> {\n\t\t\tthis.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tthis.workflowData = await this.workflowsStore.getNewWorkflowData();\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.workflowsStore.activeWorkflowExecution = null;\n\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tthis.canvasStore.setZoomLevel(1, [0, 0]);\n\t\t\tawait this.tryToAddWelcomeSticky();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.workflowsStore.activeWorkflowExecution = null;\n\t\t\tthis.stopLoading();\n\t\t},\n\t\tasync tryToAddWelcomeSticky(): Promise<void> {\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync initView(): Promise<void> {\n\t\t\tif (this.$route.params.action === 'workflowSave') {\n\t\t\t\t// In case the workflow got saved we do not have to run init\n\t\t\t\t// as only the route changed but all the needed data is already loaded\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.blankRedirect) {\n\t\t\t\tthis.blankRedirect = false;\n\t\t\t} else if (this.$route.name === VIEWS.TEMPLATE_IMPORT) {\n\t\t\t\tconst templateId = this.$route.params.id;\n\t\t\t\tawait this.openWorkflowTemplate(templateId);\n\t\t\t} else {\n\t\t\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tshowClose: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t\t\tconst saved = await this.saveCurrentWorkflow();\n\t\t\t\t\t\tif (saved) await this.settingsStore.fetchPromptsData();\n\t\t\t\t\t} else if (confirmModal === MODAL_CLOSE) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Load a workflow\n\t\t\t\tlet workflowId = null as string | null;\n\t\t\t\tif (this.$route.params.name) {\n\t\t\t\t\tworkflowId = this.$route.params.name;\n\t\t\t\t}\n\t\t\t\tif (workflowId !== null) {\n\t\t\t\t\tlet workflow: IWorkflowDb | undefined = undefined;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tworkflow = await this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.showError(error, this.$locale.baseText('openWorkflow.workflowNotFoundError'));\n\n\t\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\t\tname: VIEWS.NEW_WORKFLOW,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (workflow) {\n\t\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t\t\tawait this.checkAndInitDebugMode();\n\n\t\t\t\t\t\tif (workflow.meta?.onboardingId) {\n\t\t\t\t\t\t\tthis.$telemetry.track(\n\t\t\t\t\t\t\t\t`User opened workflow from onboarding template with ID ${workflow.meta.onboardingId}`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tworkflow_id: workflow.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twithPostHog: true,\n\t\t\t\t\t\t\t\t\twithAppCues: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (this.$route.meta?.nodeView === true) {\n\t\t\t\t\t// Create new workflow\n\t\t\t\t\tawait this.newWorkflow();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\t\tdocument.addEventListener('keyup', this.keyUp);\n\n\t\t\twindow.addEventListener('beforeunload', this.onBeforeUnload);\n\t\t\twindow.addEventListener('unload', this.onUnload);\n\t\t\t// Once view is initialized, pick up all toast notifications\n\t\t\t// waiting in the store and display them\n\t\t\tthis.showNotificationForViews([VIEWS.WORKFLOW, VIEWS.NEW_WORKFLOW]);\n\t\t},\n\t\tgetOutputEndpointUUID(\n\t\t\tnodeName: string,\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tindex: number,\n\t\t): string | null {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getOutputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\tgetInputEndpointUUID(nodeName: string, connectionType: ConnectionTypes, index: number) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getInputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\t__addConnection(connection: [IConnection, IConnection]) {\n\t\t\tconst outputUuid = this.getOutputEndpointUUID(\n\t\t\t\tconnection[0].node,\n\t\t\t\tconnection[0].type as ConnectionTypes,\n\t\t\t\tconnection[0].index,\n\t\t\t);\n\t\t\tconst inputUuid = this.getInputEndpointUUID(\n\t\t\t\tconnection[1].node,\n\t\t\t\tconnection[1].type as ConnectionTypes,\n\t\t\t\tconnection[1].index,\n\t\t\t);\n\t\t\tif (!outputUuid || !inputUuid) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst uuid: [string, string] = [outputUuid, inputUuid];\n\t\t\t// Create connections in DOM\n\t\t\tthis.instance?.connect({\n\t\t\t\tuuids: uuid,\n\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinData);\n\t\t\t});\n\t\t},\n\t\t__removeConnection(connection: [IConnection, IConnection], removeVisualConnection = false) {\n\t\t\tif (removeVisualConnection) {\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(connection[0].node);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeByName(connection[1].node);\n\n\t\t\t\tif (!sourceNode || !targetNode) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\tsourceNode.type,\n\t\t\t\t\tsourceNode.typeVersion,\n\t\t\t\t);\n\t\t\t\tconst sourceNodeOutput =\n\t\t\t\t\tsourceNodeType?.outputs?.[connection[0].index] || NodeConnectionType.Main;\n\t\t\t\tconst sourceNodeOutputName =\n\t\t\t\t\ttypeof sourceNodeOutput === 'string' ? sourceNodeOutput : sourceNodeOutput.name;\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(sourceNodeOutputName);\n\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: sourceNode.id,\n\t\t\t\t\ttarget: targetNode.id,\n\t\t\t\t});\n\n\t\t\t\tconnections.forEach((connectionInstance: Connection) => {\n\t\t\t\t\tif (connectionInstance.__meta) {\n\t\t\t\t\t\t// Only delete connections from specific indexes (if it can be determined by meta)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tconnectionInstance.__meta.sourceOutputIndex === connection[0].index &&\n\t\t\t\t\t\t\tconnectionInstance.__meta.targetOutputIndex === connection[1].index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.workflowsStore.removeConnection({ connection });\n\t\t},\n\t\t__deleteJSPlumbConnection(connection: Connection, trackHistory = false) {\n\t\t\t// Make sure to remove the overlay else after the second move\n\t\t\t// it visibly stays behind free floating without a connection.\n\t\t\tconnection.removeOverlays();\n\n\t\t\tthis.pullConnActiveNodeName = null; // prevent new connections when connectionDetached is triggered\n\t\t\tthis.instance?.deleteConnection(connection); // on delete, triggers connectionDetached event which applies mutation to store\n\t\t\tif (trackHistory && connection.__meta) {\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.sourceOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.sourceNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.targetOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.targetNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionData, this);\n\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t}\n\t\t},\n\t\t__removeConnectionByConnectionInfo(info, removeVisualConnection = false, trackHistory = false) {\n\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\n\t\t\tif (connectionInfo) {\n\t\t\t\tif (removeVisualConnection) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection, trackHistory);\n\t\t\t\t} else if (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t}\n\t\t\t\tthis.workflowsStore.removeConnection({ connection: connectionInfo });\n\t\t\t}\n\t\t},\n\t\tasync duplicateNodes(nodes: INode[]): Promise<void> {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst workflowData = deepCopy(await this.getNodesToSave(nodes));\n\t\t\tawait this.importWorkflowData(workflowData, 'duplicate', false);\n\t\t},\n\t\tgetJSPlumbConnection(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetInputIndex: number,\n\t\t\tconnectionType: ConnectionTypes,\n\t\t): Connection | undefined {\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst targetNode = this.workflowsStore.getNodeByName(targetNodeName);\n\t\t\tif (!sourceNode || !targetNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst sourceId = sourceNode.id;\n\t\t\tconst targetId = targetNode.id;\n\n\t\t\tconst sourceEndpoint = NodeViewUtils.getOutputEndpointUUID(\n\t\t\t\tsourceId,\n\t\t\t\tconnectionType,\n\t\t\t\tsourceOutputIndex,\n\t\t\t);\n\t\t\tconst targetEndpoint = NodeViewUtils.getInputEndpointUUID(\n\t\t\t\ttargetId,\n\t\t\t\tconnectionType,\n\t\t\t\ttargetInputIndex,\n\t\t\t);\n\n\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\tsourceNode.type,\n\t\t\t\tsourceNode.typeVersion,\n\t\t\t);\n\t\t\tconst sourceNodeOutput =\n\t\t\t\tsourceNodeType?.outputs?.[sourceOutputIndex] || NodeConnectionType.Main;\n\t\t\tconst sourceNodeOutputName =\n\t\t\t\ttypeof sourceNodeOutput === 'string' ? sourceNodeOutput : sourceNodeOutput.name;\n\t\t\tconst scope = NodeViewUtils.getEndpointScope(sourceNodeOutputName);\n\n\t\t\t// @ts-ignore\n\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\tscope,\n\t\t\t\tsource: sourceId,\n\t\t\t\ttarget: targetId,\n\t\t\t}) as Connection[];\n\n\t\t\treturn connections.find((connection: Connection) => {\n\t\t\t\tconst uuids = connection.getUuids();\n\t\t\t\treturn uuids[0] === sourceEndpoint && uuids[1] === targetEndpoint;\n\t\t\t});\n\t\t},\n\t\tgetJSPlumbEndpoints(nodeName: string): Endpoint[] {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tconst nodeEl = this.instance.getManagedElement(node?.id);\n\n\t\t\tconst endpoints = this.instance?.getEndpoints(nodeEl);\n\t\t\treturn endpoints;\n\t\t},\n\t\tgetPlusEndpoint(nodeName: string, outputIndex: number): Endpoint | undefined {\n\t\t\tconst endpoints = this.getJSPlumbEndpoints(nodeName);\n\t\t\treturn endpoints.find(\n\t\t\t\t(endpoint: Endpoint) =>\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tendpoint.endpoint.type === 'N8nPlus' && endpoint?.__meta?.index === outputIndex,\n\t\t\t);\n\t\t},\n\t\tgetIncomingOutgoingConnections(nodeName: string): {\n\t\t\tincoming: Connection[];\n\t\t\toutgoing: Connection[];\n\t\t} {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\n\t\t\tif (node) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t});\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst incoming = this.instance?.getConnections({\n\t\t\t\t\ttarget: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\treturn {\n\t\t\t\t\tincoming,\n\t\t\t\t\toutgoing,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { incoming: [], outgoing: [] };\n\t\t},\n\t\tonNodeMoved(node: INodeUi) {\n\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\n\t\t\t[...incoming, ...outgoing].forEach((connection: Connection) => {\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t});\n\t\t},\n\t\tonNodeRun({\n\t\t\tname,\n\t\t\tdata,\n\t\t\twaiting,\n\t\t}: {\n\t\t\tname: string;\n\t\t\tdata: ITaskData[] | null;\n\t\t\twaiting: boolean;\n\t\t}) {\n\t\t\tconst pinData = this.workflowsStore.getPinData;\n\n\t\t\tif (pinData?.[name]) return;\n\n\t\t\tconst sourceNodeName = name;\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst sourceId = sourceNode !== null ? sourceNode.id : '';\n\n\t\t\tif (data === null || data.length === 0 || waiting) {\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: sourceId,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\toutgoing.forEach((connection: Connection) => {\n\t\t\t\t\tNodeViewUtils.resetConnection(connection);\n\t\t\t\t});\n\t\t\t\tconst endpoints = this.getJSPlumbEndpoints(sourceNodeName);\n\t\t\t\tendpoints.forEach((endpoint: Endpoint) => {\n\t\t\t\t\tif (endpoint.endpoint.type === 'N8nPlus') {\n\t\t\t\t\t\t(endpoint.endpoint as N8nPlusEndpoint).clearSuccessOutput();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst allNodeConnections = this.workflowsStore.outgoingConnectionsByNodeName(sourceNodeName);\n\n\t\t\tconst connectionType = Object.keys(allNodeConnections)[0];\n\t\t\tconst nodeConnections = allNodeConnections[connectionType];\n\t\t\tconst outputMap = NodeViewUtils.getOutputSummary(\n\t\t\t\tdata,\n\t\t\t\tnodeConnections || [],\n\t\t\t\t(connectionType as ConnectionTypes) ?? NodeConnectionType.Main,\n\t\t\t);\n\t\t\tObject.keys(outputMap).forEach((sourceOutputIndex: string) => {\n\t\t\t\tObject.keys(outputMap[sourceOutputIndex]).forEach((targetNodeName: string) => {\n\t\t\t\t\tObject.keys(outputMap[sourceOutputIndex][targetNodeName]).forEach(\n\t\t\t\t\t\t(targetInputIndex: string) => {\n\t\t\t\t\t\t\tif (targetNodeName) {\n\t\t\t\t\t\t\t\tconst connection = this.getJSPlumbConnection(\n\t\t\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\t\t\tparseInt(sourceOutputIndex, 10),\n\t\t\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\t\t\tparseInt(targetInputIndex, 10),\n\t\t\t\t\t\t\t\t\tconnectionType as ConnectionTypes,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tif (connection) {\n\t\t\t\t\t\t\t\t\tconst output = outputMap[sourceOutputIndex][targetNodeName][targetInputIndex];\n\n\t\t\t\t\t\t\t\t\tif (output.isArtificialRecoveredEventItem) {\n\t\t\t\t\t\t\t\t\t\tNodeViewUtils.recoveredConnection(connection);\n\t\t\t\t\t\t\t\t\t} else if (!output?.total && !output.isArtificialRecoveredEventItem) {\n\t\t\t\t\t\t\t\t\t\tNodeViewUtils.resetConnection(connection);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tNodeViewUtils.addConnectionOutputSuccess(connection, output);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst endpoint = this.getPlusEndpoint(\n\t\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\t\tparseInt(sourceOutputIndex, 10),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (endpoint?.endpoint) {\n\t\t\t\t\t\t\t\tconst output = outputMap[sourceOutputIndex][NODE_OUTPUT_DEFAULT_KEY][0];\n\n\t\t\t\t\t\t\t\tif (output && output.total > 0) {\n\t\t\t\t\t\t\t\t\t(endpoint.endpoint as N8nPlusEndpoint).setSuccessOutput(\n\t\t\t\t\t\t\t\t\t\tNodeViewUtils.getRunItemsLabel(output),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t(endpoint.endpoint as N8nPlusEndpoint).clearSuccessOutput();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tremoveNode(nodeName: string, trackHistory = false, trackBulk = true) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\t// \"requiredNodeTypes\" are also defined in cli/commands/run.ts\n\t\t\tconst requiredNodeTypes: string[] = [];\n\n\t\t\tif (requiredNodeTypes.includes(node.type)) {\n\t\t\t\t// The node is of the required type so check first\n\t\t\t\t// if any node of that type would be left when the\n\t\t\t\t// current one would get deleted.\n\t\t\t\tlet deleteAllowed = false;\n\t\t\t\tfor (const checkNode of this.nodes) {\n\t\t\t\t\tif (checkNode.name === node.name) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (requiredNodeTypes.includes(checkNode.type)) {\n\t\t\t\t\t\tdeleteAllowed = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!deleteAllowed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node.type === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.track('User deleted workflow note', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tis_welcome_note: node.name === QUICKSTART_NOTE_NAME,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('node.deleteNode', { node });\n\t\t\t\tthis.$telemetry.track('User deleted node', {\n\t\t\t\t\tnode_type: node.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet waitForNewConnection = false;\n\t\t\t// connect nodes before/after deleted node\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(node.name);\n\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\tif (nodeType) {\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, nodeType);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, workflowNode!, nodeType);\n\t\t\t}\n\n\t\t\tif (outputs.length === 1 && inputs.length === 1) {\n\t\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\t\t\t\tif (incoming.length === 1 && outgoing.length === 1) {\n\t\t\t\t\tconst conn1 = incoming[0];\n\t\t\t\t\tconst conn2 = outgoing[0];\n\t\t\t\t\tif (conn1.__meta && conn2.__meta) {\n\t\t\t\t\t\twaitForNewConnection = true;\n\t\t\t\t\t\tconst sourceNodeName = conn1.__meta.sourceNodeName;\n\t\t\t\t\t\tconst sourceNodeOutputIndex = conn1.__meta.sourceOutputIndex;\n\t\t\t\t\t\tconst targetNodeName = conn2.__meta.targetNodeName;\n\t\t\t\t\t\tconst targetNodeOuputIndex = conn2.__meta.targetOutputIndex;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\t\ttargetNodeOuputIndex,\n\t\t\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (waitForNewConnection) {\n\t\t\t\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t\t\t\t\twaitForNewConnection = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 100); // just to make it clear to users that this is a new connection\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\t// Suspend drawing\n\t\t\t\tthis.instance?.setSuspendDrawing(true);\n\t\t\t\t(this.instance?.endpointsByElement[node.id] || [])\n\t\t\t\t\t.flat()\n\t\t\t\t\t.forEach((endpoint) => this.instance?.deleteEndpoint(endpoint));\n\n\t\t\t\t// Remove the connections in data\n\t\t\t\tthis.workflowsStore.removeAllNodeConnection(node);\n\t\t\t\tthis.workflowsStore.removeNode(node);\n\t\t\t\tthis.workflowsStore.clearNodeExecutionData(node.name);\n\n\t\t\t\tif (!waitForNewConnection) {\n\t\t\t\t\t// Now it can draw again\n\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t}\n\n\t\t\t\t// Remove node from selected index if found in it\n\t\t\t\tthis.uiStore.removeNodeFromSelection(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveNodeCommand(node));\n\t\t\t\t}\n\t\t\t}); // allow other events to finish like drag stop\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tconst recordingTimeout = waitForNewConnection ? 100 : 0;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t}, recordingTimeout);\n\t\t\t}\n\t\t},\n\t\tasync onSwitchSelectedNode(nodeName: string) {\n\t\t\tthis.nodeSelectedByName(nodeName, true, true);\n\t\t},\n\t\tasync redrawNode(nodeName: string) {\n\t\t\t// TODO: Improve later\n\t\t\t// For now we redraw the node by simply renaming it. Can for sure be\n\t\t\t// done better later but should be fine for now.\n\t\t\tconst tempName = 'x____XXXX____x';\n\t\t\tawait this.renameNode(nodeName, tempName);\n\t\t\tawait this.renameNode(tempName, nodeName);\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tif (parameterData.name === 'name' && parameterData.oldValue) {\n\t\t\t\t// The name changed so we have to take care that\n\t\t\t\t// the connections get changed.\n\t\t\t\tvoid this.renameNode(parameterData.oldValue as string, parameterData.value as string);\n\t\t\t}\n\t\t},\n\t\tasync renameNodePrompt(currentName: string) {\n\t\t\ttry {\n\t\t\t\tconst promptResponsePromise = this.prompt(\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.newName') + ':',\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.renameNode') + `: ${currentName}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustomClass: 'rename-prompt',\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('nodeView.prompt.rename'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('nodeView.prompt.cancel'),\n\t\t\t\t\t\tinputErrorMessage: this.$locale.baseText('nodeView.prompt.invalidName'),\n\t\t\t\t\t\tinputValue: currentName,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Wait till it had time to display\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t// Get the input and select the text in it\n\t\t\t\tconst nameInput = document.querySelector('.rename-prompt .el-input__inner') as\n\t\t\t\t\t| HTMLInputElement\n\t\t\t\t\t| undefined;\n\t\t\t\tif (nameInput) {\n\t\t\t\t\tnameInput.focus();\n\t\t\t\t\tnameInput.select();\n\t\t\t\t}\n\n\t\t\t\tconst promptResponse = (await promptResponsePromise) as MessageBoxInputData;\n\n\t\t\t\tif (promptResponse?.action !== MODAL_CONFIRM) return;\n\n\t\t\t\tawait this.renameNode(currentName, promptResponse.value, true);\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync renameNode(currentName: string, newName: string, trackHistory = false) {\n\t\t\tif (currentName === newName) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\tconst activeNodeName = this.activeNode && this.activeNode.name;\n\t\t\tconst isActive = activeNodeName === currentName;\n\t\t\tif (isActive) {\n\t\t\t\tthis.renamingActive = true;\n\t\t\t}\n\n\t\t\tnewName = this.uniqueNodeName(newName);\n\n\t\t\t// Rename the node and update the connections\n\t\t\tconst workflow = this.getCurrentWorkflow(true);\n\t\t\tworkflow.renameNode(currentName, newName);\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(currentName, newName));\n\t\t\t}\n\n\t\t\t// Update also last selected node and execution data\n\t\t\tthis.workflowsStore.renameNodeSelectedAndExecution({ old: currentName, new: newName });\n\n\t\t\t// Reset all nodes and connections to load the new ones\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\tthis.workflowsStore.removeAllConnections({ setStateDirty: false });\n\t\t\tthis.workflowsStore.removeAllNodes({ removePinData: false, setStateDirty: true });\n\n\t\t\t// Wait a tick that the old nodes had time to get removed\n\t\t\tawait this.$nextTick();\n\n\t\t\t// Add the new updated nodes\n\t\t\tawait this.addNodes(Object.values(workflow.nodes), workflow.connectionsBySourceNode, false);\n\n\t\t\t// Make sure that the node is selected again\n\t\t\tthis.deselectAllNodes();\n\t\t\tthis.nodeSelectedByName(newName);\n\n\t\t\tif (isActive) {\n\t\t\t\tthis.ndvStore.activeNodeName = newName;\n\t\t\t\tthis.renamingActive = false;\n\t\t\t}\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tdeleteEveryEndpoint() {\n\t\t\t// Check as it does not exist on first load\n\t\t\tif (this.instance) {\n\t\t\t\tthis.instance?.reset();\n\t\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t\t.flatMap((endpoint) => endpoint)\n\t\t\t\t\t.forEach((endpoint) => endpoint.destroy());\n\n\t\t\t\tthis.instance.deleteEveryConnection({ fireEvent: true });\n\t\t\t}\n\t\t},\n\t\tmatchCredentials(node: INodeUi) {\n\t\t\tif (!node.credentials) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tObject.entries(node.credentials).forEach(\n\t\t\t\t([nodeCredentialType, nodeCredentials]: [string, INodeCredentialsDetails]) => {\n\t\t\t\t\tconst credentialOptions = this.credentialsStore.getCredentialsByType(nodeCredentialType);\n\n\t\t\t\t\t// Check if workflows applies old credentials style\n\t\t\t\t\tif (typeof nodeCredentials === 'string') {\n\t\t\t\t\t\tnodeCredentials = {\n\t\t\t\t\t\t\tid: null,\n\t\t\t\t\t\t\tname: nodeCredentials,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nodeCredentials.id) {\n\t\t\t\t\t\t// Check whether the id is matching with a credential\n\t\t\t\t\t\tconst credentialsId = nodeCredentials.id.toString(); // due to a fixed bug in the migration UpdateWorkflowCredentials (just sqlite) we have to cast to string and check later if it has been a number\n\t\t\t\t\t\tconst credentialsForId = credentialOptions.find(\n\t\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.id === credentialsId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (credentialsForId) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcredentialsForId.name !== nodeCredentials.name ||\n\t\t\t\t\t\t\t\ttypeof nodeCredentials.id === 'number'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnode.credentials![nodeCredentialType] = {\n\t\t\t\t\t\t\t\t\tid: credentialsForId.id,\n\t\t\t\t\t\t\t\t\tname: credentialsForId.name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// No match for id found or old credentials type used\n\t\t\t\t\tnode.credentials![nodeCredentialType] = nodeCredentials;\n\n\t\t\t\t\t// check if only one option with the name would exist\n\t\t\t\t\tconst credentialsForName = credentialOptions.filter(\n\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.name === nodeCredentials.name,\n\t\t\t\t\t);\n\n\t\t\t\t\t// only one option exists for the name, take it\n\t\t\t\t\tif (credentialsForName.length === 1) {\n\t\t\t\t\t\tnode.credentials![nodeCredentialType].id = credentialsForName[0].id;\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\tasync addNodes(nodes: INodeUi[], connections?: IConnections, trackHistory = false) {\n\t\t\tif (!nodes?.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.isInsertingNodes = true;\n\t\t\t// Before proceeding we must check if all nodes contain the `properties` attribute.\n\t\t\t// Nodes are loaded without this information so we must make sure that all nodes\n\t\t\t// being added have this information.\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tnodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\t// Add the node to the node-list\n\t\t\tlet nodeType: INodeTypeDescription | null;\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tif (!node.id) {\n\t\t\t\t\tnode.id = uuid();\n\t\t\t\t}\n\n\t\t\t\tnodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t// Make sure that some properties always exist\n\t\t\t\tif (!node.hasOwnProperty('disabled')) {\n\t\t\t\t\tnode.disabled = false;\n\t\t\t\t}\n\n\t\t\t\tif (!node.hasOwnProperty('parameters')) {\n\t\t\t\t\tnode.parameters = {};\n\t\t\t\t}\n\n\t\t\t\t// Load the defaul parameter values because only values which differ\n\t\t\t\t// from the defaults get saved\n\t\t\t\tif (nodeType !== null) {\n\t\t\t\t\tlet nodeParameters = null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\t\t\tnodeType.properties,\n\t\t\t\t\t\t\tnode.parameters,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\tthis.$locale.baseText('nodeView.thereWasAProblemLoadingTheNodeParametersOfNode') +\n\t\t\t\t\t\t\t\t`: \"${node.name}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\t\t\t\t\tnode.parameters = nodeParameters !== null ? nodeParameters : {};\n\n\t\t\t\t\t// if it's a webhook and the path is empty set the UUID as the default path\n\t\t\t\t\tif (\n\t\t\t\t\t\t[WEBHOOK_NODE_TYPE, FORM_TRIGGER_NODE_TYPE].includes(node.type) &&\n\t\t\t\t\t\tnode.parameters.path === ''\n\t\t\t\t\t) {\n\t\t\t\t\t\tnode.parameters.path = node.webhookId as string;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check and match credentials, apply new format if old is used\n\t\t\t\tthis.matchCredentials(node);\n\t\t\t\tthis.workflowsStore.addNode(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddNodeCommand(node));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Wait for the nodes to be rendered\n\t\t\tawait this.$nextTick();\n\n\t\t\tthis.instance?.setSuspendDrawing(true);\n\n\t\t\tif (connections) {\n\t\t\t\tawait this.addConnections(connections);\n\t\t\t}\n\t\t\t// Add the node issues at the end as the node-connections are required\n\t\t\tthis.nodeHelpers.refreshNodeIssues();\n\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tthis.isInsertingNodes = false;\n\n\t\t\t// Now it can draw again\n\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t},\n\t\tasync addConnections(connections: IConnections) {\n\t\t\tconst batchedConnectionData: Array<[IConnection, IConnection]> = [];\n\n\t\t\tfor (const sourceNode in connections) {\n\t\t\t\tfor (const type in connections[sourceNode]) {\n\t\t\t\t\tconnections[sourceNode][type].forEach((outwardConnections, sourceIndex) => {\n\t\t\t\t\t\tif (outwardConnections) {\n\t\t\t\t\t\t\toutwardConnections.forEach((targetData) => {\n\t\t\t\t\t\t\t\tbatchedConnectionData.push([\n\t\t\t\t\t\t\t\t\t{ node: sourceNode, type, index: sourceIndex },\n\t\t\t\t\t\t\t\t\t{ node: targetData.node, type: targetData.type, index: targetData.index },\n\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process the connections in batches\n\t\t\tawait this.processConnectionBatch(batchedConnectionData);\n\t\t\tsetTimeout(this.addConectionsTestData, 0);\n\t\t},\n\n\t\tasync processConnectionBatch(batchedConnectionData: Array<[IConnection, IConnection]>) {\n\t\t\tconst batchSize = 100;\n\n\t\t\tfor (let i = 0; i < batchedConnectionData.length; i += batchSize) {\n\t\t\t\tconst batch = batchedConnectionData.slice(i, i + batchSize);\n\n\t\t\t\tbatch.forEach((connectionData) => {\n\t\t\t\t\tthis.__addConnection(connectionData);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tasync addNodesToWorkflow(data: IWorkflowDataUpdate): Promise<IWorkflowDataUpdate> {\n\t\t\t// Because nodes with the same name maybe already exist, it could\n\t\t\t// be needed that they have to be renamed. Also could it be possible\n\t\t\t// that nodes are not allowd to be created because they have a create\n\t\t\t// limit set. So we would then link the new nodes with the already existing ones.\n\t\t\t// In this object all that nodes get saved in the format:\n\t\t\t// old-name -> new-name\n\t\t\tconst nodeNameTable: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\t\t\tconst newNodeNames: string[] = [];\n\n\t\t\tif (!data.nodes) {\n\t\t\t\t// No nodes to add\n\t\t\t\tthrow new Error(this.$locale.baseText('nodeView.noNodesGivenToAdd'));\n\t\t\t}\n\n\t\t\t// Get how many of the nodes of the types which have\n\t\t\t// a max limit set already exist\n\t\t\tconst nodeTypesCount = this.getNodeTypesMaxCount();\n\n\t\t\tlet oldName: string;\n\t\t\tlet newName: string;\n\t\t\tconst createNodes: INode[] = [];\n\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tdata.nodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tif (nodeTypesCount[node.type] !== undefined) {\n\t\t\t\t\tif (nodeTypesCount[node.type].exist >= nodeTypesCount[node.type].max) {\n\t\t\t\t\t\t// Node is not allowed to be created so\n\t\t\t\t\t\t// do not add it to the create list but\n\t\t\t\t\t\t// add the name of the existing node\n\t\t\t\t\t\t// that this one gets linked up instead.\n\t\t\t\t\t\tnodeNameTable[node.name] = nodeTypesCount[node.type].nodeNames[0];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Node can be created but increment the\n\t\t\t\t\t\t// counter in case multiple ones are\n\t\t\t\t\t\t// supposed to be created\n\t\t\t\t\t\tnodeTypesCount[node.type].exist += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toldName = node.name;\n\n\t\t\t\tconst localized = this.locale.localizeNodeName(node.name, node.type);\n\n\t\t\t\tnewName = this.uniqueNodeName(localized, newNodeNames);\n\n\t\t\t\tnewNodeNames.push(newName);\n\t\t\t\tnodeNameTable[oldName] = newName;\n\n\t\t\t\tcreateNodes.push(node);\n\t\t\t});\n\n\t\t\t// Get only the connections of the nodes that get created\n\t\t\tconst newConnections: IConnections = {};\n\t\t\tconst currentConnections = data.connections!;\n\t\t\tconst createNodeNames = createNodes.map((node) => node.name);\n\t\t\tlet sourceNode, type, sourceIndex, connectionIndex, connectionData;\n\t\t\tfor (sourceNode of Object.keys(currentConnections)) {\n\t\t\t\tif (!createNodeNames.includes(sourceNode)) {\n\t\t\t\t\t// Node does not get created so skip output connections\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst connection: INodeConnections = {};\n\n\t\t\t\tfor (type of Object.keys(currentConnections[sourceNode])) {\n\t\t\t\t\tconnection[type] = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tsourceIndex = 0;\n\t\t\t\t\t\tsourceIndex < currentConnections[sourceNode][type].length;\n\t\t\t\t\t\tsourceIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst nodeSourceConnections = [];\n\t\t\t\t\t\tif (currentConnections[sourceNode][type][sourceIndex]) {\n\t\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\t\tconnectionIndex < currentConnections[sourceNode][type][sourceIndex].length;\n\t\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconnectionData = currentConnections[sourceNode][type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\t\tif (!createNodeNames.includes(connectionData.node)) {\n\t\t\t\t\t\t\t\t\t// Node does not get created so skip input connection\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tnodeSourceConnections.push(connectionData);\n\t\t\t\t\t\t\t\t// Add connection\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconnection[type].push(nodeSourceConnections);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewConnections[sourceNode] = connection;\n\t\t\t}\n\n\t\t\t// Create a workflow with the new nodes and connections that we can use\n\t\t\t// the rename method\n\t\t\tconst tempWorkflow: Workflow = this.getWorkflow(createNodes, newConnections);\n\n\t\t\t// Rename all the nodes of which the name changed\n\t\t\tfor (oldName in nodeNameTable) {\n\t\t\t\tif (oldName === nodeNameTable[oldName]) {\n\t\t\t\t\t// Name did not change so skip\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttempWorkflow.renameNode(oldName, nodeNameTable[oldName]);\n\t\t\t}\n\n\t\t\tif (data.pinData) {\n\t\t\t\tlet pinDataSuccess = true;\n\t\t\t\tfor (const nodeName of Object.keys(data.pinData)) {\n\t\t\t\t\t// Pin data limit reached\n\t\t\t\t\tif (!pinDataSuccess) {\n\t\t\t\t\t\tthis.showError(\n\t\t\t\t\t\t\tnew Error(this.$locale.baseText('ndv.pinData.error.tooLarge.description')),\n\t\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.error.tooLarge.title'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst node = tempWorkflow.nodes[nodeNameTable[nodeName]];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.setPinData(node, data.pinData[nodeName], 'add-nodes');\n\t\t\t\t\t\tpinDataSuccess = true;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tpinDataSuccess = false;\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the nodes with the changed node names, expressions and connections\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tawait this.addNodes(\n\t\t\t\tObject.values(tempWorkflow.nodes),\n\t\t\t\ttempWorkflow.connectionsBySourceNode,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\treturn {\n\t\t\t\tnodes: Object.values(tempWorkflow.nodes),\n\t\t\t\tconnections: tempWorkflow.connectionsBySourceNode,\n\t\t\t};\n\t\t},\n\t\tasync getNodesToSave(nodes: INode[]): Promise<IWorkflowData> {\n\t\t\tconst data: IWorkflowData = {\n\t\t\t\tnodes: [],\n\t\t\t\tconnections: {},\n\t\t\t\tpinData: {},\n\t\t\t};\n\n\t\t\t// Get data of all the selected noes\n\t\t\tlet nodeData;\n\t\t\tconst exportNodeNames: string[] = [];\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tnodeData = this.getNodeDataToSave(node);\n\t\t\t\texportNodeNames.push(node.name);\n\n\t\t\t\tdata.nodes.push(nodeData);\n\n\t\t\t\tconst pinDataForNode = this.workflowsStore.pinDataByNodeName(node.name);\n\t\t\t\tif (pinDataForNode) {\n\t\t\t\t\tdata.pinData![node.name] = pinDataForNode;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tnodeData.credentials &&\n\t\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t\t) {\n\t\t\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\t\t\t\t\tnodeData.credentials = Object.fromEntries(\n\t\t\t\t\t\tObject.entries(nodeData.credentials).filter(([_, credential]) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\t\t\t(!usedCredentials[credential.id] ||\n\t\t\t\t\t\t\t\t\tusedCredentials[credential.id]?.currentUserHasAccess)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get only connections of exported nodes and ignore all other ones\n\t\t\tlet connectionToKeep,\n\t\t\t\tconnections: INodeConnections,\n\t\t\t\ttype: string,\n\t\t\t\tconnectionIndex: number,\n\t\t\t\tsourceIndex: number,\n\t\t\t\tconnectionData: IConnection,\n\t\t\t\ttypeConnections: INodeConnections;\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tconnections = this.workflowsStore.outgoingConnectionsByNodeName(node.name);\n\t\t\t\tif (Object.keys(connections).length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Keep only the connection to node which get also exported\n\t\t\t\ttypeConnections = {};\n\t\t\t\tfor (type of Object.keys(connections)) {\n\t\t\t\t\tfor (sourceIndex = 0; sourceIndex < connections[type].length; sourceIndex++) {\n\t\t\t\t\t\tconnectionToKeep = [];\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\tconnectionIndex < connections[type][sourceIndex].length;\n\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconnectionData = connections[type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\tif (exportNodeNames.indexOf(connectionData.node) !== -1) {\n\t\t\t\t\t\t\t\tconnectionToKeep.push(connectionData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (connectionToKeep.length) {\n\t\t\t\t\t\t\tif (!typeConnections.hasOwnProperty(type)) {\n\t\t\t\t\t\t\t\ttypeConnections[type] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttypeConnections[type][sourceIndex] = connectionToKeep;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (Object.keys(typeConnections).length) {\n\t\t\t\t\tdata.connections[node.name] = typeConnections;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn data;\n\t\t},\n\t\tresetWorkspace() {\n\t\t\tthis.workflowsStore.resetWorkflow();\n\n\t\t\tthis.onToggleNodeCreator({ createNodeActive: false });\n\t\t\tthis.nodeCreatorStore.setShowScrim(false);\n\t\t\tthis.canvasStore.resetZoom();\n\n\t\t\t// Reset nodes\n\t\t\tthis.unbindEndpointEventListeners();\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\t// Make sure that if there is a waiting test-webhook that it gets removed\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\ttry {\n\t\t\t\t\tvoid this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t\tthis.workflowsStore.resetState();\n\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\tthis.uiStore.resetSelectedNodes();\n\t\t\tthis.uiStore.nodeViewOffsetPosition = [0, 0];\n\n\t\t\tthis.credentialsUpdated = false;\n\t\t},\n\t\tasync loadActiveWorkflows(): Promise<void> {\n\t\t\tawait this.workflowsStore.fetchActiveWorkflows();\n\t\t},\n\t\tasync loadNodeTypes(): Promise<void> {\n\t\t\tawait this.nodeTypesStore.getNodeTypes();\n\t\t},\n\t\tasync loadCredentialTypes(): Promise<void> {\n\t\t\tawait this.credentialsStore.fetchCredentialTypes(true);\n\t\t},\n\t\tasync loadCredentials(): Promise<void> {\n\t\t\tawait this.credentialsStore.fetchAllCredentials();\n\t\t},\n\t\tasync loadVariables(): Promise<void> {\n\t\t\tawait this.environmentsStore.fetchAllVariables();\n\t\t},\n\t\tasync loadSecrets(): Promise<void> {\n\t\t\tawait this.externalSecretsStore.fetchAllSecrets();\n\t\t},\n\t\tasync loadNodesProperties(nodeInfos: INodeTypeNameVersion[]): Promise<void> {\n\t\t\tconst allNodes: INodeTypeDescription[] = this.nodeTypesStore.allNodeTypes;\n\n\t\t\tconst nodesToBeFetched: INodeTypeNameVersion[] = [];\n\t\t\tallNodes.forEach((node) => {\n\t\t\t\tconst nodeVersions = Array.isArray(node.version) ? node.version : [node.version];\n\t\t\t\tif (\n\t\t\t\t\t!!nodeInfos.find((n) => n.name === node.name && nodeVersions.includes(n.version)) &&\n\t\t\t\t\t!node.hasOwnProperty('properties')\n\t\t\t\t) {\n\t\t\t\t\tnodesToBeFetched.push({\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tversion: Array.isArray(node.version) ? node.version.slice(-1)[0] : node.version,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (nodesToBeFetched.length > 0) {\n\t\t\t\t// Only call API if node information is actually missing\n\t\t\t\tthis.startLoading();\n\t\t\t\tawait this.nodeTypesStore.getNodesInformation(nodesToBeFetched);\n\t\t\t\tthis.stopLoading();\n\t\t\t}\n\t\t},\n\t\tasync onPostMessageReceived(message: MessageEvent) {\n\t\t\tif (!message || typeof message.data !== 'string' || !message.data?.includes?.('\"command\"')) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(message.data);\n\t\t\t\tif (json && json.command === 'openWorkflow') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.importWorkflowExact(json);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = false;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json && json.command === 'openExecution') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// If this NodeView is used in preview mode (in iframe) it will not have access to the main app store\n\t\t\t\t\t\t// so everything it needs has to be sent using post messages and passed down to child components\n\t\t\t\t\t\tthis.isProductionExecutionPreview = json.executionMode !== 'manual';\n\n\t\t\t\t\t\tawait this.openExecution(json.executionId);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = true;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json?.command === 'setActiveExecution') {\n\t\t\t\t\tthis.workflowsStore.activeWorkflowExecution = json.execution;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync onImportWorkflowDataEvent(data: IDataObject) {\n\t\t\tawait this.importWorkflowData(data.data as IWorkflowDataUpdate, 'file');\n\t\t},\n\t\tasync onImportWorkflowUrlEvent(data: IDataObject) {\n\t\t\tconst workflowData = await this.getWorkflowDataFromUrl(data.url as string);\n\t\t\tif (workflowData !== undefined) {\n\t\t\t\tawait this.importWorkflowData(workflowData, 'url');\n\t\t\t}\n\t\t},\n\t\taddPinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tconnections.forEach((connection) => {\n\t\t\t\t\tNodeViewUtils.addConnectionOutputSuccess(connection, {\n\t\t\t\t\t\ttotal: pinData[nodeName].length,\n\t\t\t\t\t\titerations: 0,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tremovePinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tthis.instance.setSuspendDrawing(true);\n\t\t\t\tconnections.forEach(NodeViewUtils.resetConnection);\n\t\t\t\tthis.instance.setSuspendDrawing(false, true);\n\t\t\t});\n\t\t},\n\t\tonToggleNodeCreator({ source, createNodeActive, nodeCreatorView }: ToggleNodeCreatorOptions) {\n\t\t\tif (createNodeActive === this.createNodeActive) return;\n\n\t\t\tif (!nodeCreatorView) {\n\t\t\t\tnodeCreatorView = this.containsTrigger\n\t\t\t\t\t? REGULAR_NODE_CREATOR_VIEW\n\t\t\t\t\t: TRIGGER_NODE_CREATOR_VIEW;\n\t\t\t}\n\n\t\t\t// Default to the trigger tab in node creator if there's no trigger node yet\n\t\t\tthis.nodeCreatorStore.setSelectedView(nodeCreatorView);\n\n\t\t\tthis.createNodeActive = createNodeActive;\n\n\t\t\tlet mode;\n\t\t\tswitch (this.nodeCreatorStore.selectedView) {\n\t\t\t\tcase AI_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'ai';\n\t\t\t\t\tbreak;\n\t\t\t\tcase REGULAR_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'regular';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tmode = 'regular';\n\t\t\t}\n\n\t\t\tif (createNodeActive) this.nodeCreatorStore.setOpenSource(source);\n\t\t\tvoid this.externalHooks.run('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t});\n\t\t\tthis.$telemetry.trackNodesPanel('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\t\tasync onAddNodes(\n\t\t\t{ nodes, connections }: AddedNodesAndConnections,\n\t\t\tdragAndDrop = false,\n\t\t\tposition?: XYPosition,\n\t\t) {\n\t\t\tlet currentPosition = position;\n\t\t\tfor (const { type, isAutoAdd, name, openDetail, position: nodePosition } of nodes) {\n\t\t\t\tawait this.addNode(\n\t\t\t\t\ttype,\n\t\t\t\t\t{ position: nodePosition ?? currentPosition, dragAndDrop, name },\n\t\t\t\t\topenDetail ?? false,\n\t\t\t\t\ttrue,\n\t\t\t\t\tisAutoAdd,\n\t\t\t\t);\n\n\t\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\t\tcurrentPosition = [\n\t\t\t\t\tlastAddedNode.position[0] + NodeViewUtils.NODE_SIZE * 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tlastAddedNode.position[1],\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tconst newNodesOffset = this.nodes.length - nodes.length;\n\t\t\tfor (const { from, to } of connections) {\n\t\t\t\tconst fromNode = this.nodes[newNodesOffset + from.nodeIndex];\n\t\t\t\tconst toNode = this.nodes[newNodesOffset + to.nodeIndex];\n\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tfromNode.name,\n\t\t\t\t\tfrom.outputIndex ?? 0,\n\t\t\t\t\ttoNode.name,\n\t\t\t\t\tto.inputIndex ?? 0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\tconst workflow = this.getCurrentWorkflow();\n\t\t\tconst lastNodeInputs = workflow.getParentNodesByDepth(lastAddedNode.name, 1);\n\n\t\t\t// If the last added node has multiple inputs, move them down\n\t\t\tif (lastNodeInputs.length > 1) {\n\t\t\t\tlastNodeInputs.slice(1).forEach((node, index) => {\n\t\t\t\t\tconst nodeUi = this.workflowsStore.getNodeByName(node.name);\n\t\t\t\t\tif (!nodeUi) return;\n\n\t\t\t\t\tthis.onMoveNode({\n\t\t\t\t\t\tnodeName: nodeUi.name,\n\t\t\t\t\t\tposition: [nodeUi.position[0], nodeUi.position[1] + 100 * (index + 1)],\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tasync saveCurrentWorkflowExternal(callback: () => void) {\n\t\t\tawait this.saveCurrentWorkflow();\n\t\t\tcallback?.();\n\t\t},\n\t\tsetSuspendRecordingDetachedConnections(suspend: boolean) {\n\t\t\tthis.suspendRecordingDetachedConnections = suspend;\n\t\t},\n\t\tonMoveNode({ nodeName, position }: { nodeName: string; position: XYPosition }): void {\n\t\t\tthis.workflowsStore.updateNodeProperties({ name: nodeName, properties: { position } });\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (node) {\n\t\t\t\t\tthis.instance?.repaintEverything();\n\t\t\t\t\tthis.onNodeMoved(node);\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t},\n\t\tonRevertAddNode({ node }: { node: INodeUi }): void {\n\t\t\tthis.removeNode(node.name, false);\n\t\t},\n\t\tasync onRevertRemoveNode({ node }: { node: INodeUi }): Promise<void> {\n\t\t\tconst prevNode = this.workflowsStore.workflow.nodes.find((n) => n.id === node.id);\n\t\t\tif (prevNode) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// For some reason, returning node to canvas with old id\n\t\t\t// makes it's endpoint to render at wrong position\n\t\t\tnode.id = uuid();\n\t\t\tawait this.addNodes([node]);\n\t\t},\n\t\tonRevertAddConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__removeConnection(connection, true);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertRemoveConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__addConnection(connection);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertNameChange({ currentName, newName }: { currentName: string; newName: string }) {\n\t\t\tawait this.renameNode(newName, currentName);\n\t\t},\n\t\tonRevertEnableToggle({ nodeName, isDisabled }: { nodeName: string; isDisabled: boolean }) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeHelpers.disableNodes([node]);\n\t\t\t}\n\t\t},\n\t\tonPageShow(e: PageTransitionEvent) {\n\t\t\t// Page was restored from the bfcache (back-forward cache)\n\t\t\tif (e.persisted) {\n\t\t\t\tthis.stopLoading();\n\t\t\t}\n\t\t},\n\t\treadOnlyEnvRouteCheck() {\n\t\t\tif (\n\t\t\t\tthis.readOnlyEnv &&\n\t\t\t\t[VIEWS.NEW_WORKFLOW, VIEWS.TEMPLATE_IMPORT].includes(this.$route.name)\n\t\t\t) {\n\t\t\t\tvoid this.$nextTick(async () => {\n\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\t\tawait this.$router.replace({ name: VIEWS.WORKFLOWS });\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync checkAndInitDebugMode() {\n\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\tthis.titleSet(this.workflowName, 'DEBUG');\n\t\t\t\tif (!this.workflowsStore.isInDebugMode) {\n\t\t\t\t\tawait this.applyExecutionData(this.$route.params.executionId as string);\n\t\t\t\t\tthis.workflowsStore.isInDebugMode = true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonContextMenuAction(action: ContextMenuAction, nodes: INode[]): void {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'copy':\n\t\t\t\t\tthis.copyNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'delete':\n\t\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'duplicate':\n\t\t\t\t\tvoid this.duplicateNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'execute':\n\t\t\t\t\tthis.onRunNode(nodes[0].name, 'NodeView.onContextMenuAction');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'open':\n\t\t\t\t\tthis.ndvStore.activeNodeName = nodes[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'rename':\n\t\t\t\t\tvoid this.renameNodePrompt(nodes[0].name);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_activation':\n\t\t\t\t\tthis.toggleActivationNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_pin':\n\t\t\t\t\tthis.togglePinNodes(nodes, 'context-menu');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_node':\n\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.CONTEXT_MENU,\n\t\t\t\t\t\tcreateNodeActive: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_sticky':\n\t\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'select_all':\n\t\t\t\t\tthis.selectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'deselect_all':\n\t\t\t\t\tthis.deselectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t},\n\tasync onSourceControlPull() {\n\t\tlet workflowId = null as string | null;\n\t\tif (this.$route.params.name) {\n\t\t\tworkflowId = this.$route.params.name;\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all([this.loadCredentials(), this.loadVariables(), this.tagsStore.fetchAll()]);\n\n\t\t\tif (workflowId !== null && !this.uiStore.stateIsDirty) {\n\t\t\t\tconst workflow: IWorkflowDb | undefined =\n\t\t\t\t\tawait this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\tif (workflow) {\n\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t},\n\tasync mounted() {\n\t\tthis.resetWorkspace();\n\t\tthis.canvasStore.initInstance(this.$refs.nodeView as HTMLElement);\n\t\tthis.titleReset();\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\n\t\tthis.startLoading();\n\t\tconst loadPromises = [\n\t\t\tthis.loadActiveWorkflows(),\n\t\t\tthis.loadCredentials(),\n\t\t\tthis.loadCredentialTypes(),\n\t\t\tthis.loadVariables(),\n\t\t\tthis.loadSecrets(),\n\t\t];\n\n\t\tif (this.nodeTypesStore.allNodeTypes.length === 0) {\n\t\t\tloadPromises.push(this.loadNodeTypes());\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all(loadPromises);\n\t\t} catch (error) {\n\t\t\tthis.showError(\n\t\t\t\terror,\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.title'),\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.message') + ':',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tready(async () => {\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tthis.bindCanvasEvents();\n\t\t\t\t} catch {} // This will break if mounted after jsplumb has been initiated from executions preview, so continue if it breaks\n\t\t\t\tawait this.initView();\n\t\t\t\tif (window.parent) {\n\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\tJSON.stringify({ command: 'n8nReady', version: this.rootStore.versionCli }),\n\t\t\t\t\t\t'*',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.title'),\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.message') + ':',\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.stopLoading();\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.usersStore.showPersonalizationSurvey();\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.getPinData || ({} as IPinData));\n\t\t\t}, 0);\n\t\t});\n\n\t\t// TODO: This currently breaks since front-end hooks are still not updated to work with pinia store\n\t\tvoid this.externalHooks.run('nodeView.mount').catch((e) => {});\n\n\t\tif (\n\t\t\tthis.currentUser?.personalizationAnswers !== null &&\n\t\t\tthis.settingsStore.onboardingCallPromptEnabled &&\n\t\t\tthis.currentUser &&\n\t\t\tgetAccountAge(this.currentUser) <= ONBOARDING_PROMPT_TIMEBOX\n\t\t) {\n\t\t\tconst onboardingResponse = await this.uiStore.getNextOnboardingPrompt();\n\t\t\tconst promptTimeout =\n\t\t\t\tonboardingResponse.toast_sequence_number === 1 ? FIRST_ONBOARDING_PROMPT_TIMEOUT : 1000;\n\n\t\t\tif (onboardingResponse.title && onboardingResponse.description) {\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\tmessage: onboardingResponse.description,\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\tcustomClass: 'clickable',\n\t\t\t\t\t\tcloseOnClick: true,\n\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\tthis.$telemetry.track('user clicked onboarding toast', {\n\t\t\t\t\t\t\t\tseq_num: onboardingResponse.toast_sequence_number,\n\t\t\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\t\t\tdescription: onboardingResponse.description,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis.uiStore.openModal(ONBOARDING_CALL_SIGNUP_MODAL_KEY);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}, promptTimeout);\n\t\t\t}\n\t\t}\n\n\t\tsourceControlEventBus.on('pull', this.onSourceControlPull);\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openNodeDetail',\n\t\t\taction: ({ node }: { node: string }) => {\n\t\t\t\tthis.nodeSelectedByName(node, true);\n\t\t\t},\n\t\t});\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openSelectiveNodeCreator',\n\t\t\taction: async ({\n\t\t\t\tconnectiontype,\n\t\t\t\tnode,\n\t\t\t\tcreatorview,\n\t\t\t}: {\n\t\t\t\tconnectiontype: NodeConnectionType;\n\t\t\t\tnode: string;\n\t\t\t\tcreatorview?: string;\n\t\t\t}) => {\n\t\t\t\tconst nodeName = node ?? this.ndvStore.activeNodeName;\n\t\t\t\tconst nodeData = nodeName ? this.workflowsStore.getNodeByName(nodeName) : null;\n\n\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\tawait this.redrawNode(node);\n\t\t\t\t// Wait for UI to update\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (creatorview) {\n\t\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\t\tcreateNodeActive: true,\n\t\t\t\t\t\t\tnodeCreatorView: creatorview,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (connectiontype && nodeData) {\n\t\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t\t\tendpointUuid: `${nodeData.id}-input${connectiontype}0`,\n\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NOTICE_ERROR_MESSAGE,\n\t\t\t\t\t\t\toutputType: connectiontype,\n\t\t\t\t\t\t\tsourceId: nodeData.id,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\t\t\t},\n\t\t});\n\n\t\tthis.readOnlyEnvRouteCheck();\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tactivated() {\n\t\tconst openSideMenu = this.uiStore.addFirstStepOnLoad;\n\t\tif (openSideMenu) {\n\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t}\n\t\tthis.uiStore.addFirstStepOnLoad = false;\n\t\tthis.bindCanvasEvents();\n\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\tdocument.addEventListener('keyup', this.keyUp);\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\t\twindow.addEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.on('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.on('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.on('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.on('openChat', this.onOpenChat);\n\t\thistoryBus.on('nodeMove', this.onMoveNode);\n\t\thistoryBus.on('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.on('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.on('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.on('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.on('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.on('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.on('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.on('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.on('saveWorkflow', this.saveCurrentWorkflowExternal);\n\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tdeactivated() {\n\t\tthis.unbindCanvasEvents();\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\twindow.removeEventListener('beforeunload', this.onBeforeUnload);\n\t\twindow.removeEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.off('openChat', this.onOpenChat);\n\t\thistoryBus.off('nodeMove', this.onMoveNode);\n\t\thistoryBus.off('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.off('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.off('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.off('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.off('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.off('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.off('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.off('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.off('saveWorkflow', this.saveCurrentWorkflowExternal);\n\t},\n\tbeforeMount() {\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushConnect();\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\t// Make sure the event listeners get removed again else we\n\t\t// could add up with them registered multiple times\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\tthis.unregisterCustomAction('showNodeCreator');\n\t\tthis.unregisterCustomAction('openNodeDetail');\n\t\tthis.unregisterCustomAction('openSelectiveNodeCreator');\n\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushDisconnect();\n\t\t}\n\n\t\tthis.resetWorkspace();\n\t\tthis.instance.unbind();\n\t\tthis.instance.destroy();\n\t\tthis.uiStore.stateIsDirty = false;\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\tsourceControlEventBus.off('pull', this.onSourceControlPull);\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.node-view-root {\n\tposition: relative;\n\tflex: 1;\n\toverflow: hidden;\n\tbackground-color: var(--color-canvas-background);\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n}\n\n.node-view-wrapper {\n\tposition: fixed;\n}\n\n.node-view {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\ttransform-origin: 0 0;\n\tz-index: -1;\n}\n\n.node-view-background {\n\tbackground-color: var(--color-canvas-background);\n\tposition: absolute;\n\twidth: 10000px;\n\theight: 10000px;\n\tz-index: -2;\n}\n\n.move-active {\n\tcursor: grab;\n\tcursor: -moz-grab;\n\tcursor: -webkit-grab;\n\ttouch-action: none;\n}\n\n.move-in-process {\n\tcursor: grabbing;\n\tcursor: -moz-grabbing;\n\tcursor: -webkit-grabbing;\n\ttouch-action: none;\n}\n\n.workflow-execute-wrapper {\n\tposition: absolute;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-2xl);\n\twidth: auto;\n\n\t@media (max-width: $breakpoint-2xs) {\n\t\tbottom: 150px;\n\t}\n\n\tbutton {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tmargin-left: 0.625rem;\n\n\t\t&:first-child {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n\n/* Makes sure that when selected with mouse it does not select text */\n.do-not-select *,\n.jtk-drag-select * {\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n</style>\n\n<style lang=\"scss\">\n.node-view-wrapper {\n\t--drag-scope-active-disabled-color: var(--color-foreground-dark);\n\n\t&.connection-drag-scope-active {\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t// Grey out incompatible node type endpoints\n\t\t\t&:not(.connection-drag-scope-active-type-#{$node-type}) {\n\t\t\t\t.diamond-output-endpoint,\n\t\t\t\t.jtk-connector,\n\t\t\t\t.add-input-endpoint {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\n\t\t\t\t.node-input-endpoint-label,\n\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.connection-drag-scope-active-type-#{$node-type} {\n\t\t\t\t// Dragging input\n\t\t\t\t&.connection-drag-scope-active-connection-target {\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t}\n\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t// Apply style to dragged compatible input endpoint\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-input-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Dragging output\n\t\t\t\t&.connection-drag-scope-active-connection-source {\n\t\t\t\t\t// Apply style to dragged compatible output endpoint\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.drop-add-node-label {\n\tcolor: var(--color-text-dark);\n\tfont-weight: 600;\n\tfont-size: 0.8em;\n\ttext-align: center;\n\tbackground-color: #ffffff55;\n}\n\n.connection-actions {\n\t&:hover {\n\t\tdisplay: block !important;\n\t}\n\n\t> button {\n\t\tcolor: var(--color-foreground-xdark);\n\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\tbackground-color: var(--color-background-xlight);\n\t\tborder-radius: var(--border-radius-base);\n\t\theight: var(--spacing-l);\n\t\twidth: var(--spacing-l);\n\t\tcursor: pointer;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\tposition: absolute;\n\t\ttop: -12px;\n\n\t\t&.add {\n\t\t\tright: 4px;\n\t\t}\n\n\t\t&.delete {\n\t\t\tleft: 4px;\n\t\t}\n\n\t\t&.delete-single {\n\t\t\tleft: -12px;\n\t\t}\n\n\t\tsvg {\n\t\t\tpointer-events: none;\n\t\t\tfont-size: var(--font-size-2xs);\n\t\t}\n\n\t\t&:hover {\n\t\t\tborder-color: var(--color-primary);\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n</style>\n\n<style module lang=\"scss\">\n.content {\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: auto;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.shake {\n\tanimation: 1s 200ms shake;\n}\n\n@keyframes shake {\n\t10%,\n\t90% {\n\t\ttransform: translate3d(-1px, 0, 0);\n\t}\n\n\t20%,\n\t80% {\n\t\ttransform: translate3d(2px, 0, 0);\n\t}\n\n\t30%,\n\t50%,\n\t70% {\n\t\ttransform: translate3d(-4px, 0, 0);\n\t}\n\n\t40%,\n\t60% {\n\t\ttransform: translate3d(4px, 0, 0);\n\t}\n}\n</style>\n"],"file":"assets/NodeView-fUdpq96X.js"}