@dragonmastery/dragoncore-vue 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AppLink-CHMMrSFI.js +54 -0
- package/dist/AppLink-CHMMrSFI.js.map +1 -0
- package/dist/Appearance-D5pwxuf4.js +3 -0
- package/dist/{Appearance-BfPdKMXw.js → Appearance-DxWTyx1M.js} +1 -1
- package/dist/{Appearance-BfPdKMXw.js.map → Appearance-DxWTyx1M.js.map} +1 -1
- package/dist/{ChangePasswordPage-DXzU3NI9.js → ChangePasswordPage--3XwluwE.js} +2 -2
- package/dist/{ChangePasswordPage-DXzU3NI9.js.map → ChangePasswordPage--3XwluwE.js.map} +1 -1
- package/dist/ChangePasswordPage-CpDPmEml.js +6 -0
- package/dist/ConsentRequired-C4IRMA0c.js +213 -0
- package/dist/ConsentRequired-C4IRMA0c.js.map +1 -0
- package/dist/CreateTeamForm-B4cIuYAf.js +35 -0
- package/dist/CreateTeamMemberForm-Chrw1y00.js +35 -0
- package/dist/{CreateUserPage-bwR6fq5C.js → CreateUserPage-DLwXeLAq.js} +2 -2
- package/dist/{CreateUserPage-bwR6fq5C.js.map → CreateUserPage-DLwXeLAq.js.map} +1 -1
- package/dist/CreateUserPage-WruMs7WP.js +6 -0
- package/dist/CreditBalanceDashboard-CkcsrZ_e.js +35 -0
- package/dist/CreditManagement-Ddvu9dMw.js +35 -0
- package/dist/CustomerCreateSupportTicketForm-BKperKGS.js +35 -0
- package/dist/{CustomerSupportTicketDetailPage-D_1t2EpN.js → CustomerSupportTicketDetailPage-BdyaKG1v.js} +9 -9
- package/dist/{CustomerSupportTicketDetailPage-D_1t2EpN.js.map → CustomerSupportTicketDetailPage-BdyaKG1v.js.map} +1 -1
- package/dist/CustomerSupportTicketList-DcbrjDa9.js +35 -0
- package/dist/CustomerSupportTicketParent-BeNzUwuP.js +7 -0
- package/dist/{CustomerSupportTicketParent-B09_iFpJ.js → CustomerSupportTicketParent-HIxwSVdu.js} +4 -4
- package/dist/{CustomerSupportTicketParent-B09_iFpJ.js.map → CustomerSupportTicketParent-HIxwSVdu.js.map} +1 -1
- package/dist/CustomerSupportTicketSuccess-CC967u3y.js +35 -0
- package/dist/EditTeamForm-B5Tee5wL.js +35 -0
- package/dist/{EditTeamMemberForm-DJW7yRQW.js → EditTeamMemberForm-CaS2GLjV.js} +2 -2
- package/dist/{EditTeamMemberForm-DJW7yRQW.js.map → EditTeamMemberForm-CaS2GLjV.js.map} +1 -1
- package/dist/EditTeamMemberForm-OtcS8QWt.js +6 -0
- package/dist/{EditUserPage-aDygGmfD.js → EditUserPage-DURc5rmi.js} +4 -4
- package/dist/{EditUserPage-aDygGmfD.js.map → EditUserPage-DURc5rmi.js.map} +1 -1
- package/dist/EditUserPage-T4DQlKhf.js +7 -0
- package/dist/ForgotPassword-CUifhmqP.js +7 -0
- package/dist/{ForgotPassword-CJjzm9GK.js → ForgotPassword-OjIPi9s9.js} +4 -3
- package/dist/{ForgotPassword-CJjzm9GK.js.map → ForgotPassword-OjIPi9s9.js.map} +1 -1
- package/dist/LoginForm-9UFnA-fO.js +118 -0
- package/dist/LoginForm-9UFnA-fO.js.map +1 -0
- package/dist/LoginForm-Bg7GoZEA.js +7 -0
- package/dist/Logout-Bs92csWH.js +7 -0
- package/dist/{Logout-Cm9kEzgH.js → Logout-YgTgOFUH.js} +5 -4
- package/dist/{Logout-Cm9kEzgH.js.map → Logout-YgTgOFUH.js.map} +1 -1
- package/dist/MfaSetup-BACX5XP-.js +8 -0
- package/dist/{MfaSetup-Ch0w-gTN.js → MfaSetup-RtFMY_dj.js} +5 -4
- package/dist/{MfaSetup-Ch0w-gTN.js.map → MfaSetup-RtFMY_dj.js.map} +1 -1
- package/dist/{MfaVerify-BwzjVrTj.js → MfaVerify-Cvhe8bEM.js} +6 -5
- package/dist/{MfaVerify-BwzjVrTj.js.map → MfaVerify-Cvhe8bEM.js.map} +1 -1
- package/dist/MfaVerify-ak4iSdQ2.js +8 -0
- package/dist/RecordVersionViewer-BWZ78vvE.js +490 -0
- package/dist/RecordVersionViewer-BWZ78vvE.js.map +1 -0
- package/dist/{ResetPassword-DuLuXaNp.js → ResetPassword-BE4mXK9q.js} +4 -3
- package/dist/{ResetPassword-DuLuXaNp.js.map → ResetPassword-BE4mXK9q.js.map} +1 -1
- package/dist/ResetPassword-pY1uhTdl.js +7 -0
- package/dist/{SavedFiltersPage-CawED9Oz.js → SavedFiltersPage-DQt6uc8m.js} +33 -30
- package/dist/{SavedFiltersPage-CawED9Oz.js.map → SavedFiltersPage-DQt6uc8m.js.map} +1 -1
- package/dist/Signup-9TjMMnU4.js +204 -0
- package/dist/Signup-9TjMMnU4.js.map +1 -0
- package/dist/Signup-Bq-G3D-s.js +9 -0
- package/dist/SignupConsentFlow-QUZGKjdB.js +269 -0
- package/dist/SignupConsentFlow-QUZGKjdB.js.map +1 -0
- package/dist/SignupRequirementsPage-DfbYmpQD.js +360 -0
- package/dist/SignupRequirementsPage-DfbYmpQD.js.map +1 -0
- package/dist/StaffCreateSupportTicketForm-D0ZuisDk.js +35 -0
- package/dist/{StaffSupportTicketDetailPage-DZZN3jmt.js → StaffSupportTicketDetailPage-DQdfh6H1.js} +11 -11
- package/dist/{StaffSupportTicketDetailPage-DZZN3jmt.js.map → StaffSupportTicketDetailPage-DQdfh6H1.js.map} +1 -1
- package/dist/StaffSupportTicketList-CiqC05XB.js +35 -0
- package/dist/{StaffSupportTicketParent-BYxQPuhI.js → StaffSupportTicketParent-CilR4RGM.js} +4 -4
- package/dist/{StaffSupportTicketParent-BYxQPuhI.js.map → StaffSupportTicketParent-CilR4RGM.js.map} +1 -1
- package/dist/StaffSupportTicketParent-DkV329NI.js +7 -0
- package/dist/StaffSupportTicketSuccess-CUYnimaI.js +35 -0
- package/dist/{SupportStaffPage-B05UR5LK.js → SupportStaffPage-KKugAnFm.js} +7 -7
- package/dist/{SupportStaffPage-B05UR5LK.js.map → SupportStaffPage-KKugAnFm.js.map} +1 -1
- package/dist/{SupportTicketDevLifecycleBadge-Ba-Rm6QW.js → SupportTicketDevLifecycleBadge-EMrQHfyG.js} +1 -1
- package/dist/{SupportTicketDevLifecycleBadge-Ba-Rm6QW.js.map → SupportTicketDevLifecycleBadge-EMrQHfyG.js.map} +1 -1
- package/dist/{SupportTicketMaintenancePage-BoZpjcAF.js → SupportTicketMaintenancePage-smItdkrD.js} +4 -4
- package/dist/{SupportTicketMaintenancePage-BoZpjcAF.js.map → SupportTicketMaintenancePage-smItdkrD.js.map} +1 -1
- package/dist/TeamAttachmentsTab-DUtCD1Yi.js +35 -0
- package/dist/TeamHistoryTab-BsUoH4VK.js +4 -0
- package/dist/{TeamHistoryTab-BrC6FFIw.js → TeamHistoryTab-D5biUPmq.js} +3 -3
- package/dist/{TeamHistoryTab-BrC6FFIw.js.map → TeamHistoryTab-D5biUPmq.js.map} +1 -1
- package/dist/TeamList-BkPIqZ8V.js +35 -0
- package/dist/TeamMemberList-1mxUGCNa.js +35 -0
- package/dist/TeamMemberParent-DzeBIElY.js +35 -0
- package/dist/{TeamNotesTab-B2eETkAz.js → TeamNotesTab-BzGZZ1h8.js} +5 -5
- package/dist/{TeamNotesTab-B2eETkAz.js.map → TeamNotesTab-BzGZZ1h8.js.map} +1 -1
- package/dist/TeamNotesTab-ClHl2nXd.js +7 -0
- package/dist/TeamParent-DJa9UZTP.js +35 -0
- package/dist/{TimelineNoteInput-C0a0WRQC.js → TimelineNoteInput-0p-M4Qie.js} +2 -2
- package/dist/{TimelineNoteInput-C0a0WRQC.js.map → TimelineNoteInput-0p-M4Qie.js.map} +1 -1
- package/dist/{TimelineSystemEvent-Dj2TMOF6.js → TimelineSystemEvent-BHzFr46C.js} +4 -4
- package/dist/{TimelineSystemEvent-Dj2TMOF6.js.map → TimelineSystemEvent-BHzFr46C.js.map} +1 -1
- package/dist/UserListPage-BTLE4J0s.js +4 -0
- package/dist/{UserListPage-QSdxrJT6.js → UserListPage-DUE5gJTo.js} +3 -3
- package/dist/{UserListPage-QSdxrJT6.js.map → UserListPage-DUE5gJTo.js.map} +1 -1
- package/dist/{UserProfilePage-X4z2lG-J.js → UserProfilePage-C3b93Keh.js} +4 -4
- package/dist/{UserProfilePage-X4z2lG-J.js.map → UserProfilePage-C3b93Keh.js.map} +1 -1
- package/dist/UserProfilePage-CVTORtSx.js +7 -0
- package/dist/VerifyEmail-DCP4DWIw.js +9 -0
- package/dist/VerifyEmail-DlOmWGG-.js +257 -0
- package/dist/VerifyEmail-DlOmWGG-.js.map +1 -0
- package/dist/ViewTeam-DVfnLMhV.js +35 -0
- package/dist/ViewTeamMember-L4v3gCIn.js +35 -0
- package/dist/{convertToLocalDateTime-DOSGtMn8.js → convertToLocalDateTime-CFhtN6PI.js} +12 -2
- package/dist/convertToLocalDateTime-CFhtN6PI.js.map +1 -0
- package/dist/{displayIdFormatter-B1ZKgofu.js → displayIdFormatter-Dz900Awr.js} +1 -1
- package/dist/{displayIdFormatter-B1ZKgofu.js.map → displayIdFormatter-Dz900Awr.js.map} +1 -1
- package/dist/{extractRpcErrorMessage-C_UbKgHL.js → extractRpcErrorMessage-Di8E8-Wh.js} +1 -1
- package/dist/{extractRpcErrorMessage-C_UbKgHL.js.map → extractRpcErrorMessage-Di8E8-Wh.js.map} +1 -1
- package/dist/index.d.ts +62 -17
- package/dist/index.js +37 -33
- package/dist/{mfaSchema-nfNCcEhM.js → mfaSchema-BnRWf0ma.js} +1 -1
- package/dist/{mfaSchema-nfNCcEhM.js.map → mfaSchema-BnRWf0ma.js.map} +1 -1
- package/dist/{src-CkgUIye9.js → src-QZJyMfGX.js} +422 -812
- package/dist/src-QZJyMfGX.js.map +1 -0
- package/dist/{useBreadcrumbs-DmgSucoe.js → useBreadcrumbs-qB6ghsAf.js} +1 -1
- package/dist/{useBreadcrumbs-DmgSucoe.js.map → useBreadcrumbs-qB6ghsAf.js.map} +1 -1
- package/dist/useEmailVerificationChannel-BNi926Ho.js +37 -0
- package/dist/useEmailVerificationChannel-BNi926Ho.js.map +1 -0
- package/dist/{useMutation-DbzXtqf1.js → useMutation-BTsyHKyn.js} +3 -3
- package/dist/{useMutation-DbzXtqf1.js.map → useMutation-BTsyHKyn.js.map} +1 -1
- package/dist/{useQuery-BKb5JXVS.js → useQuery-BggIE52P.js} +5 -5
- package/dist/useQuery-BggIE52P.js.map +1 -0
- package/dist/{useQueryCache-CHG4-HGF.js → useQueryCache-Bjm-S8v5.js} +2 -2
- package/dist/{useQueryCache-CHG4-HGF.js.map → useQueryCache-Bjm-S8v5.js.map} +1 -1
- package/dist/{useReturnUrl-Da8PpLb9.js → useReturnUrl-qFeazn-G.js} +2 -54
- package/dist/useReturnUrl-qFeazn-G.js.map +1 -0
- package/dist/{useRpcAuth-8Byr6SSI.js → useRpcAuth-rmHf7bYx.js} +42 -2
- package/dist/useRpcAuth-rmHf7bYx.js.map +1 -0
- package/dist/useSignupPendingData-BWHwUHhL.js +47 -0
- package/dist/useSignupPendingData-BWHwUHhL.js.map +1 -0
- package/package.json +5 -2
- package/src/daisyui.css +1 -0
- package/dist/Appearance-C3WguxT-.js +0 -3
- package/dist/ChangePasswordPage-BuVNYC_G.js +0 -6
- package/dist/CreateTeamForm-BuMrZ169.js +0 -32
- package/dist/CreateTeamMemberForm-D0xqR9me.js +0 -32
- package/dist/CreateUserPage-BWIvFF-4.js +0 -6
- package/dist/CreditBalanceDashboard-BR-er7gs.js +0 -32
- package/dist/CreditManagement-CyjrE1ep.js +0 -32
- package/dist/CustomerCreateSupportTicketForm-C9-CLRRQ.js +0 -32
- package/dist/CustomerSupportTicketList-B0dC7lgD.js +0 -32
- package/dist/CustomerSupportTicketParent-D0wLnKXf.js +0 -7
- package/dist/CustomerSupportTicketSuccess-BvuBglg8.js +0 -32
- package/dist/EditTeamForm-BJlOKEkI.js +0 -32
- package/dist/EditTeamMemberForm-CbDvTLXI.js +0 -6
- package/dist/EditUserPage-CsHl1h_g.js +0 -7
- package/dist/ForgotPassword-DJjmzU_m.js +0 -7
- package/dist/LoginForm-BeiI_y3E.js +0 -7
- package/dist/LoginForm-IEP-hEh0.js +0 -115
- package/dist/LoginForm-IEP-hEh0.js.map +0 -1
- package/dist/Logout-DmZTNQDP.js +0 -7
- package/dist/MfaSetup-BwkenBRD.js +0 -8
- package/dist/MfaVerify-BaUROEol.js +0 -8
- package/dist/ResetPassword-DEFj1pgV.js +0 -7
- package/dist/Signup-C94alv87.js +0 -166
- package/dist/Signup-C94alv87.js.map +0 -1
- package/dist/Signup-CFUbdrYs.js +0 -7
- package/dist/StaffCreateSupportTicketForm-AxprwWRv.js +0 -32
- package/dist/StaffSupportTicketList-DYKysNs3.js +0 -32
- package/dist/StaffSupportTicketParent-CT8oYFd6.js +0 -7
- package/dist/StaffSupportTicketSuccess-zWEagE4E.js +0 -32
- package/dist/TeamAttachmentsTab-BFRMbPlZ.js +0 -32
- package/dist/TeamHistoryTab-CYrt5KnE.js +0 -4
- package/dist/TeamList-CF5BQhfx.js +0 -32
- package/dist/TeamMemberList-Dfi2iKOH.js +0 -32
- package/dist/TeamMemberParent-DXcumR-Q.js +0 -32
- package/dist/TeamNotesTab-Bv_HPC6f.js +0 -7
- package/dist/TeamParent-DLoNn-mW.js +0 -32
- package/dist/UserListPage-CBwfXo15.js +0 -4
- package/dist/UserProfilePage-cTrZuwOT.js +0 -7
- package/dist/VerifyEmail-8bsvoDdM.js +0 -175
- package/dist/VerifyEmail-8bsvoDdM.js.map +0 -1
- package/dist/VerifyEmail-Cpc0umIu.js +0 -7
- package/dist/VerifyEmailRequired-CN1FU1AE.js +0 -74
- package/dist/VerifyEmailRequired-CN1FU1AE.js.map +0 -1
- package/dist/ViewTeam-DpjnoTwo.js +0 -32
- package/dist/ViewTeamMember-CRb2oBHG.js +0 -32
- package/dist/convertToLocalDateTime-DOSGtMn8.js.map +0 -1
- package/dist/src-CkgUIye9.js.map +0 -1
- package/dist/useQuery-BKb5JXVS.js.map +0 -1
- package/dist/useReturnUrl-Da8PpLb9.js.map +0 -1
- package/dist/useRpcAuth-8Byr6SSI.js.map +0 -1
- /package/dist/{TeamMembersTab-DTJxmb-M.js → TeamMembersTab-CBB2Yl_I.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StaffSupportTicketDetailPage-DZZN3jmt.js","names":["$emit","payload: StaffSupportTicketUpdateDto","items: TimelineItem[]"],"sources":["../src/slices/support_ticket/staff/approveSupportTicketFormMetadata.ts","../src/slices/support_ticket/staff/components/ApproveSupportTicketModal.vue","../src/slices/support_ticket/staff/components/ArchiveSupportTicketModal.vue","../src/slices/support_ticket/staff/completeSupportTicketFormMetadata.ts","../src/slices/support_ticket/staff/components/CompleteSupportTicketModal.vue","../src/slices/support_ticket/staff/components/ConvertToInternalModal.vue","../src/slices/support_ticket/staff/components/DeleteSupportTicketModal.vue","../src/slices/support_ticket/staff/components/RevertSupportTicketModal.vue","../src/slices/support_ticket/staff/components/StaffActionBanner.vue","../src/slices/support_ticket/staff/components/StaffMetadataCard.vue","../src/slices/support_ticket/staff/staffMetadataCardEditFormMetadata.ts","../src/slices/support_ticket/staff/components/StaffMetadataCardEdit.vue","../src/slices/support_ticket/staff/components/StaffTimeline.vue","../src/slices/support_ticket/staff/components/SupportTicketSubscribersCollapsible.vue","../src/slices/support_ticket/staff/StaffSupportTicketDetailPage.vue"],"sourcesContent":["import { ApproveSupportTicketSchema } from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/**\n * Form schema reuses approve workflow schema (credit_value only).\n */\nconst ApproveSupportTicketFormSchema = ApproveSupportTicketSchema.pick({\n credit_value: true,\n});\nexport type ApproveSupportTicketFormDto = z.infer<typeof ApproveSupportTicketFormSchema>;\n\nexport const approveSupportTicketFormMetadata = withMetadata(\n ApproveSupportTicketFormSchema,\n 'approveSupportTicketForm',\n {\n credit_value: {\n label: 'Credit value to deduct',\n inputType: 'currency',\n step: 0.01,\n placeholder: '0.00',\n helpText: 'Enter the credit amount to deduct from the customer',\n },\n },\n);\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Approve Support Ticket?</h3>\n <p class=\"py-2 whitespace-pre-line text-sm text-base-content/80\">\n {{ approveModalIntro }}\n </p>\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.CreditValueField />\n <div v-if=\"form.submitError\" class=\"alert alert-error py-2 my-2\">\n <span class=\"text-sm\">{{ form.submitError }}</span>\n </div>\n <p class=\"py-2 text-sm text-base-content/70 whitespace-pre-line\">\n {{ approveModalFooter }}\n </p>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isApproving\"\n >\n Cancel\n </button>\n <ZiniaSubmitButton submitText=\"Approve & Deduct\" submittingText=\"Approving...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n </ZiniaForm>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { ApproveSupportTicketDto, StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { approveSupportTicketFormMetadata } from '../approveSupportTicketFormMetadata';\n\nconst APPROVE_MODAL_INTRO =\n `This will:\\n\\n` +\n `• Deduct credits from customer (amount set below)\\n` +\n `• Lock the support ticket item\\n` +\n `• Start development workflow\\n`;\n\nconst APPROVE_MODAL_FOOTER = `This action cannot be undone.`;\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst approveModalIntro = APPROVE_MODAL_INTRO;\nconst approveModalFooter = APPROVE_MODAL_FOOTER;\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaFormErrorsSummary,\n refreshFormData,\n} = useForm(approveSupportTicketFormMetadata, {\n storeName: 'approve-support-ticket-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n const raw = props.ticket?.credit_value?.trim();\n const credit_value = raw && raw !== '' ? raw : '0';\n return { credit_value };\n },\n});\n\nconst { mutate: approveSupportTicket, loading: isApproving } = useMutation(\n (api, input: ApproveSupportTicketDto) => api.supportTickets.approveTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n () => props.isOpen,\n (isOpen) => {\n if (isOpen) {\n refreshFormData();\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleSubmit(formData: { credit_value: string }) {\n if (!props.ticket) return;\n await approveSupportTicket({\n id: props.ticket.id,\n credit_value: formData.credit_value,\n });\n return undefined;\n}\n\nfunction handleSuccess() {\n close();\n toast.success(\n `Support Ticket approved! ${form.values.credit_value} credits deducted.`,\n );\n emit('success');\n}\n\nfunction handleError(error: Error | unknown) {\n const message = extractRpcErrorMessage(error, 'Failed to approve');\n form.setSubmitError(message);\n toast.error(message);\n}\n</script>\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">{{ isArchived ? 'Unarchive Support Ticket?' : 'Archive Support Ticket?' }}</h3>\n <p class=\"py-4 text-sm text-base-content/80\">\n <template v-if=\"isArchived\">\n This will unarchive the ticket. Comments, edits, and attachments will be unlocked for\n customer and staff.\n </template>\n <template v-else>\n This will archive the ticket. Once archived, no one (customer or staff) can add or edit\n comments, edit the ticket, or add/delete attachments.\n </template>\n </p>\n <div v-if=\"archiveError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ archiveError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isArchiving\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n :class=\"isArchived ? 'btn btn-primary' : 'btn btn-warning'\"\n @click=\"handleToggle\"\n :disabled=\"isArchiving\"\n >\n <span v-if=\"isArchiving\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isArchiving ? (isArchived ? 'Unarchiving...' : 'Archiving...') : (isArchived ? 'Unarchive' : 'Archive') }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst isArchived = computed(() => !!props.ticket?.archived_at);\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst archiveError = ref<string | null>(null);\n\nconst { mutate: archiveTicket, loading: isArchiving } = useMutation(\n (api, input: { id: string }) => api.supportTickets.archiveTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n () => props.isOpen,\n (isOpen) => {\n if (isOpen) {\n archiveError.value = null;\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleToggle() {\n if (!props.ticket) return;\n archiveError.value = null;\n\n try {\n await archiveTicket({ id: props.ticket.id });\n toast.success(isArchived.value ? 'Ticket unarchived' : 'Ticket archived');\n close();\n emit('success');\n } catch (e) {\n const message = extractRpcErrorMessage(e, isArchived.value ? 'Failed to unarchive' : 'Failed to archive');\n archiveError.value = message;\n toast.error(message);\n }\n}\n</script>\n","import { CompleteSupportTicketSchema } from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\nconst CompleteSupportTicketFormSchema = CompleteSupportTicketSchema.pick({\n delivered_value: true,\n});\nexport type CompleteSupportTicketFormDto = z.infer<typeof CompleteSupportTicketFormSchema>;\n\nexport const completeSupportTicketFormMetadata = withMetadata(\n CompleteSupportTicketFormSchema,\n 'completeSupportTicketForm',\n {\n delivered_value: {\n label: 'Actual Effort Delivered',\n inputType: 'currency',\n step: 0.01,\n placeholder: '100.00',\n helpText: 'How much effort did it actually take?',\n },\n },\n);\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Complete Support Ticket</h3>\n <p class=\"py-2 text-sm text-base-content/80\">\n Customer was charged\n <span class=\"font-semibold\">{{ creditDisplay }}</span>\n credits. Enter the actual effort delivered:\n </p>\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.DeliveredValueField placeholder=\"100.00\" />\n <div v-if=\"form.submitError\" class=\"alert alert-error py-2 my-2\">\n <span class=\"text-sm\">{{ form.submitError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isCompleting\"\n >\n Cancel\n </button>\n <ZiniaSubmitButton submitText=\"Mark as Completed\" submittingText=\"Completing...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n </ZiniaForm>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { CompleteSupportTicketDto, StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { formatStaffCreditValue } from '../../utils/creditValueFormatter';\nimport { completeSupportTicketFormMetadata } from '../completeSupportTicketFormMetadata';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\n\nconst creditDisplay = computed(() =>\n props.ticket\n ? formatStaffCreditValue(\n props.ticket.credit_value,\n props.ticket.approval_status,\n )\n : '0',\n);\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaFormErrorsSummary,\n refreshFormData,\n} = useForm(completeSupportTicketFormMetadata, {\n storeName: 'complete-support-ticket-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n const display = creditDisplay.value;\n const value = display === 'TBD' || display === 'N/A' ? '0.00' : display;\n return { delivered_value: value };\n },\n});\n\nconst { mutate: completeSupportTicket, loading: isCompleting } = useMutation(\n (api, input: CompleteSupportTicketDto) =>\n api.supportTickets.completeTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n () => props.isOpen,\n (isOpen) => {\n if (isOpen) {\n refreshFormData();\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleSubmit(formData: { delivered_value: string }) {\n if (!props.ticket) return;\n await completeSupportTicket({\n id: props.ticket.id,\n delivered_value: formData.delivered_value,\n });\n return undefined;\n}\n\nfunction handleSuccess() {\n close();\n toast.success('Support ticket marked as completed!');\n emit('success');\n}\n\nfunction handleError(error: Error | unknown) {\n const message = extractRpcErrorMessage(error, 'Failed to complete');\n form.setSubmitError(message);\n toast.error(message);\n}\n</script>\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Convert to Internal Task?</h3>\n <p class=\"py-4 whitespace-pre-line text-sm text-base-content/80\">\n {{ convertMessage }}\n </p>\n <div v-if=\"convertError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ convertError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isConverting\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n @click=\"handleConvert\"\n :disabled=\"isConverting\"\n >\n <span v-if=\"isConverting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isConverting ? 'Converting...' : 'Convert to Internal' }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst convertError = ref<string | null>(null);\nconst convertMessage = ref('');\n\nconst { mutate: convertToInternal, loading: isConverting } = useMutation(\n (api, id: string) => api.supportTickets.convertToInternal(id),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n [() => props.isOpen, () => props.ticket],\n ([isOpen, ticket]) => {\n if (isOpen && ticket) {\n const hasCredits =\n ticket.credit_value && parseFloat(ticket.credit_value) > 0;\n convertMessage.value =\n `This will:\\n\\n` +\n `• Change status to INTERNAL\\n` +\n `• Bypass customer approval workflow\\n` +\n (hasCredits ? `• Clear ${ticket.credit_value} credit estimate\\n` : '') +\n `• Set dev lifecycle to BACKLOG\\n` +\n `• Allow immediate development start\\n\\n` +\n `This change can be useful for converting customer ideas into internal improvements.`;\n convertError.value = null;\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleConvert() {\n if (!props.ticket) return;\n convertError.value = null;\n\n try {\n await convertToInternal(props.ticket.id);\n toast.success('Converted to internal task successfully');\n close();\n emit('success');\n } catch (e) {\n const message = extractRpcErrorMessage(e, 'Failed to convert');\n convertError.value = message;\n toast.error(message);\n }\n}\n</script>\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Delete Support Ticket?</h3>\n <p class=\"py-4 text-sm text-base-content/80\">\n This will soft-delete the ticket. It can be restored if needed. This action cannot be undone\n for approved tickets (you cannot delete approved tickets).\n </p>\n <div v-if=\"deleteError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ deleteError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isDeleting\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-error\"\n @click=\"handleDelete\"\n :disabled=\"isDeleting\"\n >\n <span v-if=\"isDeleting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isDeleting ? 'Deleting...' : 'Delete' }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst deleteError = ref<string | null>(null);\n\nconst { mutate: deleteTicket, loading: isDeleting } = useMutation(\n (api, id: string) => api.supportTickets.deleteTicket(id),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n () => props.isOpen,\n (isOpen) => {\n if (isOpen) {\n deleteError.value = null;\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleDelete() {\n if (!props.ticket) return;\n deleteError.value = null;\n\n try {\n await deleteTicket(props.ticket.id);\n toast.success('Ticket deleted');\n close();\n emit('success');\n } catch (e) {\n const message = extractRpcErrorMessage(e, 'Failed to delete');\n deleteError.value = message;\n toast.error(message);\n }\n}\n</script>\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Revert Support Ticket to PENDING?</h3>\n <p class=\"py-4 whitespace-pre-line text-sm text-base-content/80\">\n {{ revertMessage }}\n </p>\n <div v-if=\"revertError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ revertError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isReverting\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-warning\"\n @click=\"handleRevert\"\n :disabled=\"isReverting\"\n >\n <span v-if=\"isReverting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isReverting ? 'Reverting...' : 'Revert to PENDING' }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { formatStaffCreditValue } from '../../utils/creditValueFormatter';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst revertError = ref<string | null>(null);\n\nconst revertMessage = ref('');\n\nconst { mutate: revertSupportTicket, loading: isReverting } = useMutation(\n (api, input: { id: string }) => api.supportTickets.revertTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n [() => props.isOpen, () => props.ticket],\n ([isOpen, ticket]) => {\n if (isOpen && ticket) {\n const creditDisplay = formatStaffCreditValue(\n ticket.credit_value,\n ticket.approval_status,\n );\n const hasCredits = creditDisplay !== 'TBD' && creditDisplay !== 'N/A';\n revertMessage.value =\n `This will:\\n\\n` +\n `• Change status back to PENDING\\n` +\n `• Unlock the support ticket item\\n` +\n (hasCredits ? `• Refund ${creditDisplay} credits to customer\\n` : '') +\n `• Allow the customer to edit again\\n\\n` +\n `Are you sure you want to revert this decision?`;\n revertError.value = null;\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleRevert() {\n if (!props.ticket) return;\n revertError.value = null;\n\n try {\n await revertSupportTicket({ id: props.ticket.id });\n\n const creditDisplay = formatStaffCreditValue(\n props.ticket.credit_value,\n props.ticket.approval_status,\n );\n const refundMessage =\n creditDisplay !== 'TBD' && creditDisplay !== 'N/A'\n ? ` ${creditDisplay} credits refunded.`\n : '';\n\n toast.success(`Support Ticket reverted to PENDING.${refundMessage}`);\n close();\n emit('success');\n } catch (e) {\n const message = extractRpcErrorMessage(e, 'Failed to revert');\n revertError.value = message;\n toast.error(message);\n }\n}\n</script>\n","<template>\n <ActionBannerAlert\n v-if=\"isArchived\"\n variant=\"neutral\"\n icon=\"archive\"\n >\n This ticket is archived. Comments, edits, and attachments are locked for both customer and staff.\n <template #actions>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n @click=\"emit('archive')\"\n >\n Unarchive\n </button>\n </template>\n </ActionBannerAlert>\n <ActionBannerAlert\n v-else-if=\"ticket.approval_status === 'PENDING'\"\n variant=\"warning\"\n icon=\"clock\"\n >\n This ticket is awaiting approval.\n <template #actions>\n <button type=\"button\" class=\"btn btn-success btn-sm\" @click=\"emit('approve')\">\n Approve\n </button>\n <button type=\"button\" class=\"btn btn-error btn-sm\" @click=\"emit('reject')\">\n Reject\n </button>\n <button type=\"button\" class=\"btn btn-primary btn-sm\" @click=\"emit('convertToInternal')\">\n Convert to Internal\n </button>\n <button type=\"button\" class=\"btn btn-ghost btn-sm\" @click=\"emit('delete')\">\n Delete\n </button>\n </template>\n </ActionBannerAlert>\n <ActionBannerAlert\n v-else-if=\"ticket.approval_status === 'APPROVED' && ticket.locked_approval_at\"\n variant=\"success\"\n icon=\"lock\"\n >\n This ticket was approved on {{ lockedDateFormatted }}.\n <template #actions>\n <button type=\"button\" class=\"btn btn-warning btn-sm\" @click=\"emit('revert')\">\n Revert\n </button>\n <button\n v-if=\"!isCompleted\"\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n @click=\"emit('complete')\"\n >\n Complete\n </button>\n <button\n v-else-if=\"!isArchived\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n @click=\"emit('archive')\"\n >\n Archive\n </button>\n </template>\n </ActionBannerAlert>\n <ActionBannerAlert\n v-else-if=\"ticket.approval_status === 'REJECTED' && ticket.locked_approval_at\"\n variant=\"error\"\n icon=\"lock\"\n >\n This ticket was rejected on {{ lockedDateFormatted }}.\n <template #actions>\n <button type=\"button\" class=\"btn btn-warning btn-sm\" @click=\"emit('revert')\">\n Revert\n </button>\n <button\n v-if=\"!isArchived\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n @click=\"emit('archive')\"\n >\n Archive\n </button>\n <button type=\"button\" class=\"btn btn-ghost btn-sm\" @click=\"emit('delete')\">\n Delete\n </button>\n </template>\n </ActionBannerAlert>\n <ActionBannerAlert v-else-if=\"ticket.approval_status === 'INTERNAL'\" variant=\"info\" icon=\"info\">\n Internal ticket.\n <template #actions>\n <button\n v-if=\"!isCompleted\"\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n @click=\"emit('complete')\"\n >\n Complete\n </button>\n <button\n v-else-if=\"!isArchived\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n @click=\"emit('archive')\"\n >\n Archive\n </button>\n <button type=\"button\" class=\"btn btn-ghost btn-sm\" @click=\"emit('delete')\">\n Delete\n </button>\n </template>\n </ActionBannerAlert>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport ActionBannerAlert from '../../shared/ActionBannerAlert.vue';\nimport { formatTicketDate } from '../../utils/formatTicketDate';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto;\n}\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n approve: [];\n reject: [];\n revert: [];\n convertToInternal: [];\n delete: [];\n complete: [];\n archive: [];\n}>();\n\nconst lockedDateFormatted = computed(() => {\n const at = props.ticket.locked_approval_at;\n return at ? formatTicketDate(at).formatted : '';\n});\n\nconst isCompleted = computed(() => props.ticket.status === 'COMPLETED');\nconst isArchived = computed(() => !!props.ticket.archived_at);\n</script>\n","<template>\n <div class=\"border border-base-200 rounded-lg p-4 md:p-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3\">\n <MetadataField label=\"Status\">\n <SupportTicketApprovalBadge\n :approval-status=\"ticket.approval_status\"\n size=\"sm\"\n />\n </MetadataField>\n <MetadataField label=\"Dev Lifecycle\">\n <select\n v-if=\"canEditDevLifecycle\"\n :value=\"effectiveDevLifecycleForSelect\"\n class=\"select select-sm select-bordered min-w-[7rem]\"\n :disabled=\"updatingDevLifecycle\"\n @change=\"handleDevLifecycleChange(($event.target as HTMLSelectElement).value)\"\n >\n <option\n v-for=\"opt in devLifecycleUpdateOptions\"\n :key=\"opt.value\"\n :value=\"opt.value\"\n >\n {{ opt.label }}\n </option>\n </select>\n <SupportTicketDevLifecycleBadge\n v-else-if=\"ticket.dev_lifecycle\"\n :dev-lifecycle=\"ticket.dev_lifecycle\"\n size=\"sm\"\n />\n <span v-else class=\"text-base-content/50 italic text-sm\">Not started</span>\n </MetadataField>\n <MetadataField label=\"Type\">\n <SupportTicketTypeBadge :type=\"ticket.type\" size=\"sm\" />\n </MetadataField>\n <MetadataField label=\"Priority\">\n <SupportTicketPriorityBadge :priority=\"ticket.priority\" size=\"sm\" />\n </MetadataField>\n <MetadataField label=\"Assignee\">\n <span v-if=\"assigneeDisplay\">{{ assigneeDisplay }}</span>\n <span v-else class=\"text-base-content/50 italic text-sm\">Unassigned</span>\n </MetadataField>\n <MetadataField label=\"Requester\">\n {{ ticket.created_by_display_name }}\n </MetadataField>\n <div class=\"md:col-span-2\">\n <MetadataField label=\"Description\">\n <p v-if=\"ticket.description?.trim()\" class=\"whitespace-pre-wrap text-sm\">\n {{ ticket.description }}\n </p>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">No description provided</span>\n </template>\n </MetadataField>\n </div>\n <MetadataField label=\"Ticket ID\" :copyable=\"true\">\n {{ ticketDisplayId }}\n </MetadataField>\n <MetadataField label=\"Created\">\n {{ createdFormatted }}\n <span v-if=\"createdRelative\" class=\"text-base-content/50\">· {{ createdRelative }}</span>\n </MetadataField>\n <MetadataField label=\"Started\">\n <template v-if=\"ticket.start_at\">\n {{ startFormatted }}\n <span class=\"text-base-content/50\">· {{ startRelative }}</span>\n </template>\n <span v-else class=\"text-base-content/50 italic text-sm\">Not set</span>\n </MetadataField>\n <MetadataField label=\"Target\">\n <span v-if=\"ticket.target_at\" :class=\"{ 'text-error': isTargetOverdue }\">\n {{ targetFormatted }}\n <span class=\"text-base-content/50\">· {{ targetRelative }}</span>\n </span>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">Not set</span>\n </template>\n </MetadataField>\n <MetadataField label=\"Completed\">\n <template v-if=\"ticket.completed_at\">\n {{ completedFormatted }}\n <span class=\"text-base-content/50\">· {{ completedRelative }}</span>\n </template>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">Not set</span>\n </template>\n </MetadataField>\n <MetadataField label=\"Credits\">\n <span class=\"inline-flex items-center gap-1\">\n <span v-if=\"ticket.is_locked\" aria-hidden=\"true\">🔒</span>\n {{ creditDisplay }}\n </span>\n </MetadataField>\n <MetadataField label=\"Delivered Value\">\n <template v-if=\"ticket.delivered_value?.trim()\">{{ ticket.delivered_value }}</template>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">Not set</span>\n </template>\n </MetadataField>\n </div>\n <div v-if=\"!ticket.archived_at\" class=\"flex justify-end gap-2 mt-4\">\n <button type=\"button\" class=\"btn btn-sm\" @click=\"$emit('edit')\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 mr-2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\"\n />\n </svg>\n Edit\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n SUPPORT_TICKET_DEV_LIFECYCLE_FILTER_OPTIONS,\n SupportTicketDevLifecycleUpdateEnum,\n supportTicketPriorityToNumber,\n type StaffSupportTicketReadDto,\n type StaffSupportTicketUpdateDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { computed, inject, ref } from 'vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport MetadataField from '../../shared/MetadataField.vue';\nimport SupportTicketApprovalBadge from '../../shared/SupportTicketApprovalBadge.vue';\nimport SupportTicketDevLifecycleBadge from '../../shared/SupportTicketDevLifecycleBadge.vue';\nimport SupportTicketTypeBadge from '../../shared/SupportTicketTypeBadge.vue';\nimport SupportTicketPriorityBadge from '../../shared/SupportTicketPriorityBadge.vue';\nimport { formatTicketDate } from '../../utils/formatTicketDate';\nimport { formatTicketDisplayId } from '../../utils/displayIdFormatter';\nimport { formatStaffCreditValue } from '../../utils/creditValueFormatter';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto;\n}\n\ndefineEmits<{ edit: [] }>();\n\nconst props = defineProps<Props>();\n\nconst refreshTicket = inject<(() => Promise<void>) | undefined>('refreshTicket');\n\nconst devLifecycleUpdateOptions = SUPPORT_TICKET_DEV_LIFECYCLE_FILTER_OPTIONS.filter((opt) =>\n (SupportTicketDevLifecycleUpdateEnum as readonly string[]).includes(opt.value),\n);\n\nconst updatingDevLifecycle = ref(false);\nconst { mutate: updateTicket } = useMutation(\n (api, input: StaffSupportTicketUpdateDto) => api.supportTickets.staffUpdateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst canEditDevLifecycle = computed(() => {\n const t = props.ticket;\n if (!t.approval_status) return false;\n if (!['APPROVED', 'INTERNAL'].includes(t.approval_status)) return false;\n const dl = t.dev_lifecycle;\n if (dl === 'DEPLOYED' || dl === 'CANCELLED') return false;\n return true;\n});\n\nconst effectiveDevLifecycleForSelect = computed(() => {\n const dl = props.ticket.dev_lifecycle;\n if (dl && (SupportTicketDevLifecycleUpdateEnum as readonly string[]).includes(dl)) return dl;\n return 'BACKLOG';\n});\n\nasync function handleDevLifecycleChange(newDevLifecycle: string): Promise<void> {\n if (!(SupportTicketDevLifecycleUpdateEnum as readonly string[]).includes(newDevLifecycle)) return;\n if (!refreshTicket) return;\n const t = props.ticket;\n updatingDevLifecycle.value = true;\n try {\n const priority =\n typeof t.priority === 'number'\n ? t.priority\n : supportTicketPriorityToNumber(t.priority as 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL');\n await updateTicket({\n id: t.id,\n title: t.title,\n type: t.type,\n priority,\n dev_lifecycle: newDevLifecycle as StaffSupportTicketUpdateDto['dev_lifecycle'],\n });\n await refreshTicket();\n } finally {\n updatingDevLifecycle.value = false;\n }\n}\n\nconst assigneeDisplay = computed(() => {\n const assigneeId = props.ticket?.assigned_to;\n if (!assigneeId) return null;\n return props.ticket.assigned_to_display_name ?? assigneeId;\n});\n\nconst ticketDisplayId = computed(() =>\n formatTicketDisplayId(\n props.ticket.display_id,\n props.ticket.display_id_prefix,\n props.ticket.id,\n ),\n);\n\nconst createdFormatted = computed(() => {\n const at = props.ticket.created_at;\n return at ? formatTicketDate(at).formatted : '';\n});\nconst createdRelative = computed(() => {\n const at = props.ticket.created_at;\n return at ? formatTicketDate(at).relative : '';\n});\n\nconst startFormatted = computed(() =>\n props.ticket.start_at ? formatTicketDate(props.ticket.start_at!).formatted : '',\n);\nconst startRelative = computed(() =>\n props.ticket.start_at ? formatTicketDate(props.ticket.start_at!).relative : '',\n);\n\nconst targetFormatted = computed(() =>\n props.ticket.target_at ? formatTicketDate(props.ticket.target_at!).formatted : '',\n);\nconst targetRelative = computed(() =>\n props.ticket.target_at ? formatTicketDate(props.ticket.target_at!).relative : '',\n);\n\nconst completedFormatted = computed(() =>\n props.ticket.completed_at ? formatTicketDate(props.ticket.completed_at!).formatted : '',\n);\nconst completedRelative = computed(() =>\n props.ticket.completed_at ? formatTicketDate(props.ticket.completed_at!).relative : '',\n);\n\nconst isTargetOverdue = computed(() => {\n if (!props.ticket.target_at || props.ticket.completed_at) return false;\n return new Date(props.ticket.target_at) < new Date() && !props.ticket.completed_at;\n});\n\nconst creditDisplay = computed(() =>\n formatStaffCreditValue(props.ticket.credit_value, props.ticket.approval_status),\n);\n</script>\n","import {\n StaffSupportTicketUpdateSchema,\n SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n} from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\nexport type StaffMetadataCardEditFormDto = z.infer<typeof StaffSupportTicketUpdateSchema>;\n\nexport const staffMetadataCardEditFormMetadata = withMetadata(\n StaffSupportTicketUpdateSchema,\n 'staffMetadataCardEditForm',\n {\n title: {\n label: 'Title',\n placeholder: 'Enter ticket title',\n },\n description: {\n label: 'Description',\n inputType: 'textarea',\n placeholder: 'Describe the ticket in detail',\n },\n type: { label: 'Type' },\n priority: {\n label: 'Priority',\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n dev_lifecycle: { label: 'Development Lifecycle' },\n credit_value: {\n label: 'Credit Value',\n inputType: 'currency',\n step: 0.01,\n placeholder: '0.00',\n },\n delivered_value: {\n label: 'Delivered Value',\n inputType: 'currency',\n step: 0.01,\n placeholder: '0.00',\n },\n start_at: {\n label: 'Start At',\n inputType: 'date',\n },\n target_at: {\n label: 'Target At',\n inputType: 'date',\n },\n completed_at: {\n label: 'Completed At',\n inputType: 'date',\n },\n },\n);\n","<template>\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Title - full width -->\n <div class=\"form-control md:col-span-2\">\n <zinia.TitleField placeholder=\"Enter ticket title\" />\n </div>\n\n <!-- Description - full width -->\n <div class=\"form-control md:col-span-2\">\n <zinia.DescriptionField class=\"w-full\" placeholder=\"Describe the ticket in detail\" />\n </div>\n\n <!-- Type -->\n <div class=\"form-control\">\n <zinia.TypeField />\n </div>\n\n <!-- Assignee - only when not archived -->\n <div v-if=\"!ticket.archived_at\" class=\"form-control\">\n <label class=\"label\">\n <span class=\"label-text\">Assignee</span>\n </label>\n <select v-model=\"assigneeId\" class=\"select select-bordered w-full\" :disabled=\"saving\">\n <option value=\"\">Unassigned</option>\n <option v-for=\"u in triageUsers ?? []\" :key=\"u.id\" :value=\"u.id\">\n {{ u.email }}\n </option>\n </select>\n </div>\n\n <!-- Priority -->\n <div class=\"form-control\">\n <zinia.PriorityField />\n </div>\n\n <!-- Development Lifecycle - Only editable when APPROVED or INTERNAL (not terminal states) -->\n <div\n v-if=\"\n ['APPROVED', 'INTERNAL'].includes(ticket.approval_status || '') &&\n ticket.dev_lifecycle !== 'DEPLOYED' &&\n ticket.dev_lifecycle !== 'CANCELLED'\n \"\n class=\"form-control\"\n >\n <zinia.DevLifecycleField />\n </div>\n\n <!-- Credit Value - Only editable when PENDING -->\n <div v-if=\"ticket.approval_status === 'PENDING'\" class=\"form-control\">\n <zinia.CreditValueField placeholder=\"0.00\" />\n </div>\n\n <!-- Delivered Value - Only editable when DEPLOYED -->\n <div v-if=\"ticket.dev_lifecycle === 'DEPLOYED'\" class=\"form-control\">\n <zinia.DeliveredValueField placeholder=\"0.00\" />\n </div>\n\n <!-- Start At - Only editable when PENDING, APPROVED, or INTERNAL (not terminal) -->\n <div\n v-if=\"\n ['PENDING', 'APPROVED', 'INTERNAL'].includes(ticket.approval_status || '') &&\n ticket.dev_lifecycle !== 'CANCELLED' &&\n ticket.dev_lifecycle !== 'DEPLOYED'\n \"\n class=\"form-control\"\n >\n <zinia.StartAtField :formatter=\"formatToISODate\" />\n </div>\n\n <!-- Target At - Only editable when PENDING, APPROVED, or INTERNAL (not terminal) -->\n <div\n v-if=\"\n ['PENDING', 'APPROVED', 'INTERNAL'].includes(ticket.approval_status || '') &&\n ticket.dev_lifecycle !== 'CANCELLED' &&\n ticket.dev_lifecycle !== 'DEPLOYED'\n \"\n class=\"form-control\"\n >\n <zinia.TargetAtField :formatter=\"formatToISODate\" />\n </div>\n\n <!-- Completed At - Only editable when DEPLOYED or CANCELLED -->\n <div\n v-if=\"ticket.dev_lifecycle === 'DEPLOYED' || ticket.dev_lifecycle === 'CANCELLED'\"\n class=\"form-control\"\n >\n <zinia.CompletedAtField :formatter=\"formatToISODate\" />\n </div>\n </div>\n\n <div v-if=\"form.submitError\" class=\"alert alert-error py-2 mt-4\">\n <span class=\"text-sm\">{{ form.submitError }}</span>\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n\n <!-- Action Buttons -->\n <div class=\"flex justify-end gap-2 mt-4\">\n <button type=\"button\" class=\"btn btn-ghost\" @click=\"handleCancel\" :disabled=\"saving\">\n Cancel\n </button>\n <ZiniaSubmitButton submitText=\"Save\" submittingText=\"Saving...\" />\n </div>\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n supportTicketPriorityToNumber,\n type StaffSupportTicketReadDto,\n type StaffSupportTicketUpdateDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref, watch } from 'vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatToISODate } from '../../../../utils/convertToLocalDateTime';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { staffMetadataCardEditFormMetadata } from '../staffMetadataCardEditFormMetadata';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto;\n saving?: boolean;\n}\n\nconst props = defineProps<Props>();\n\nconst assigneeId = ref(props.ticket.assigned_to ?? '');\nwatch(\n () => props.ticket.assigned_to,\n (v) => {\n assigneeId.value = v ?? '';\n },\n);\n\nconst { data: triageUsers } = useQuery((api) => api.users.getTriageUsers(), {\n cacheKey: 'triage-users',\n staleTime: 60 * 60 * 1000,\n});\n\nconst emit = defineEmits<{\n success: [];\n cancel: [];\n}>();\n\nconst { mutate: updateTicket, loading: isSaving } = useMutation(\n (api, input: StaffSupportTicketUpdateDto) => api.supportTickets.staffUpdateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst saving = computed(() => props.saving ?? isSaving.value);\n\nfunction formatDateForInput(dateString: string | null | undefined): string | null {\n if (!dateString) return null;\n try {\n const date = new Date(dateString);\n const isoString = date.toISOString();\n const datePart = isoString.split('T')[0];\n return datePart || null;\n } catch {\n return null;\n }\n}\n\nfunction formatDateForOutput(dateString: string | null | undefined): string | null {\n if (!dateString || dateString.trim() === '') return null;\n try {\n const date = new Date(dateString + 'T00:00:00');\n if (isNaN(date.getTime())) return null;\n return date.toISOString();\n } catch {\n return null;\n }\n}\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton, ZiniaFormErrorsSummary } = useForm(\n staffMetadataCardEditFormMetadata,\n {\n storeName: `staff-metadata-card-edit-${props.ticket.id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n const t = props.ticket;\n const validDevLifecycle = [\n 'BACKLOG',\n 'PLANNING',\n 'DEVELOPMENT',\n 'CODE_REVIEW',\n 'TESTING',\n 'STAGING',\n 'PO_APPROVAL',\n 'VERIFICATION',\n ] as const;\n const devLifecycle =\n t.dev_lifecycle &&\n validDevLifecycle.includes(t.dev_lifecycle as (typeof validDevLifecycle)[number])\n ? (t.dev_lifecycle as (typeof validDevLifecycle)[number])\n : undefined;\n return {\n id: t.id,\n title: t.title || '',\n description: t.description ?? '',\n type: t.type,\n priority: supportTicketPriorityToNumber(t.priority),\n dev_lifecycle: devLifecycle,\n credit_value: t.credit_value?.trim() || null,\n delivered_value: t.delivered_value?.trim() || null,\n start_at: formatDateForInput(t.start_at) ?? null,\n target_at: formatDateForInput(t.target_at) ?? null,\n completed_at: formatDateForInput(t.completed_at) ?? null,\n };\n },\n },\n);\n\nfunction buildPayload(formData: Record<string, unknown>): StaffSupportTicketUpdateDto {\n const t = props.ticket;\n const payload: StaffSupportTicketUpdateDto = {\n id: t.id,\n title: String(formData.title ?? '').trim(),\n description: (formData.description as string) || '',\n type: formData.type as StaffSupportTicketUpdateDto['type'],\n priority: formData.priority as StaffSupportTicketUpdateDto['priority'],\n };\n\n if (\n ['APPROVED', 'INTERNAL'].includes(t.approval_status || '') &&\n t.dev_lifecycle !== 'DEPLOYED' &&\n t.dev_lifecycle !== 'CANCELLED'\n ) {\n const dl = formData.dev_lifecycle;\n if (\n dl !== null &&\n dl !== undefined &&\n dl !== 'PENDING' &&\n dl !== 'DEPLOYED' &&\n dl !== 'CANCELLED'\n ) {\n payload.dev_lifecycle = dl as StaffSupportTicketUpdateDto['dev_lifecycle'];\n }\n }\n\n if (t.approval_status === 'PENDING') {\n const cv = formData.credit_value;\n if (cv != null && cv !== '') {\n payload.credit_value = String(cv).trim();\n }\n }\n\n if (t.dev_lifecycle === 'DEPLOYED') {\n const dv = formData.delivered_value;\n if (dv != null && dv !== '') {\n payload.delivered_value = String(dv).trim();\n }\n }\n\n if (\n ['PENDING', 'APPROVED', 'INTERNAL'].includes(t.approval_status || '') &&\n t.dev_lifecycle !== 'CANCELLED' &&\n t.dev_lifecycle !== 'DEPLOYED'\n ) {\n const startAt = formatDateForOutput(formData.start_at as string | null);\n if (startAt !== null) payload.start_at = startAt;\n const targetAt = formatDateForOutput(formData.target_at as string | null);\n if (targetAt !== null) payload.target_at = targetAt;\n }\n\n if (t.dev_lifecycle === 'DEPLOYED' || t.dev_lifecycle === 'CANCELLED') {\n const completedAt = formatDateForOutput(formData.completed_at as string | null);\n if (completedAt !== null) payload.completed_at = completedAt;\n }\n\n payload.assigned_to = assigneeId.value || null;\n\n return payload;\n}\n\nasync function handleSubmit(formData: Record<string, unknown>) {\n const payload = buildPayload(formData);\n await updateTicket(payload);\n return undefined;\n}\n\nfunction handleSuccess() {\n emit('success');\n}\n\nfunction handleError(error: Error | unknown) {\n const message = extractRpcErrorMessage(error, 'Failed to update ticket');\n form.setSubmitError(message);\n}\n\nfunction handleCancel() {\n emit('cancel');\n}\n</script>\n","<template>\n <div class=\"flex flex-col gap-4 w-full\">\n <TimelineNoteInput\n ref=\"noteInputRef\"\n :show-type-toggle=\"true\"\n :disabled=\"!!ticket.archived_at\"\n :note-type=\"noteTypeFromQuery\"\n :on-submit=\"onAddNote\"\n @update:note-type=\"updateNoteTypeQuery\"\n />\n <p\n v-if=\"mergedTimelineItems.length === 0\"\n class=\"text-base-content/50 text-sm text-center py-8\"\n >\n No activity yet.\n </p>\n <template v-for=\"item in mergedTimelineItems\" :key=\"item.id\">\n <TimelineItem\n v-if=\"item.type === 'customer-note' || item.type === 'internal-note'\"\n :author-name=\"item.data.authorName\"\n :created-at=\"item.data.createdAt\"\n :variant=\"item.type === 'customer-note' ? 'customer' : 'internal'\"\n >\n {{ item.data.body ?? '' }}\n </TimelineItem>\n <TimelineSystemEvent\n v-else-if=\"item.type === 'system-event'\"\n :author=\"item.data.author\"\n :message=\"item.data.message\"\n :timestamp=\"item.data.timestamp\"\n :action=\"item.data.action\"\n :type=\"item.data.type\"\n :details=\"item.data.details\"\n :old-value=\"item.data.oldValue\"\n :new-value=\"item.data.newValue\"\n :changes=\"item.data.changes\"\n />\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport TimelineItem from '../../shared/TimelineItem.vue';\nimport TimelineNoteInput from '../../shared/TimelineNoteInput.vue';\nimport TimelineSystemEvent from '../../shared/TimelineSystemEvent.vue';\nimport type { SystemEvent } from '../../utils/parseRecordVersions';\n\nexport interface TimelineNoteDto {\n authorName: string;\n createdAt: string;\n body: string;\n}\n\ninterface Props {\n ticket: StaffSupportTicketReadDto;\n customerNotes: TimelineNoteDto[];\n internalNotes: TimelineNoteDto[];\n systemEvents: SystemEvent[];\n /** Called when user submits a note. Must return a Promise. */\n onAddNote: (payload: {\n content: string;\n noteType: 'customer' | 'internal';\n }) => Promise<void>;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst noteTypeFromQuery = computed<'customer' | 'internal'>(() => {\n return route.query.noteType === 'internal' ? 'internal' : 'customer';\n});\n\nfunction updateNoteTypeQuery(value: 'customer' | 'internal') {\n router.replace({\n path: route.path,\n query: {\n ...route.query,\n noteType: value === 'internal' ? 'internal' : undefined,\n },\n });\n}\n\nconst noteInputRef = ref<InstanceType<typeof TimelineNoteInput> | null>(null);\n\ntype TimelineItem =\n | { type: 'customer-note'; timestamp: string; id: string; data: TimelineNoteDto }\n | { type: 'internal-note'; timestamp: string; id: string; data: TimelineNoteDto }\n | { type: 'system-event'; timestamp: string; id: string; data: SystemEvent };\n\nconst mergedTimelineItems = computed((): TimelineItem[] => {\n const items: TimelineItem[] = [];\n\n for (const note of props.customerNotes ?? []) {\n items.push({\n type: 'customer-note',\n timestamp: note.createdAt,\n id: `customer-note-${note.createdAt}-${note.authorName}`,\n data: note,\n });\n }\n\n for (const note of props.internalNotes ?? []) {\n items.push({\n type: 'internal-note',\n timestamp: note.createdAt,\n id: `internal-note-${note.createdAt}-${note.authorName}`,\n data: note,\n });\n }\n\n for (const event of props.systemEvents ?? []) {\n items.push({\n type: 'system-event',\n timestamp: event.timestamp,\n id: event.id,\n data: event,\n });\n }\n\n items.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n return items;\n});\n\nfunction resetInput() {\n noteInputRef.value?.reset();\n}\n\ndefineExpose({ resetInput });\n</script>\n","<template>\n <div v-if=\"supportTicketId\" class=\"w-full\">\n <div class=\"collapse collapse-arrow bg-base-200\">\n <input type=\"checkbox\" v-model=\"expanded\" />\n <div class=\"collapse-title text-sm font-medium px-4 py-2 min-h-0\">\n <div class=\"flex items-center gap-2\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\"\n />\n </svg>\n <span>Subscribers ({{ subscribers.length }})</span>\n </div>\n </div>\n <div class=\"collapse-content px-0\">\n <div class=\"px-4 pb-4 space-y-4\">\n <!-- Add subscriber -->\n <div v-if=\"!locked\" class=\"flex flex-wrap items-end gap-2\">\n <div class=\"form-control flex-1 min-w-[200px]\">\n <label class=\"label py-0\">\n <span class=\"label-text text-sm\">Add subscriber</span>\n </label>\n <select\n v-model=\"selectedUserId\"\n class=\"select select-bordered select-sm w-full\"\n :disabled=\"isAddLoading\"\n >\n <option value=\"\">Select user...</option>\n <option\n v-for=\"user in availableUsers\"\n :key=\"user.id\"\n :value=\"user.id\"\n >\n {{ user.email }}\n </option>\n </select>\n </div>\n <button\n class=\"btn btn-sm btn-primary\"\n :disabled=\"!selectedUserId || isAddLoading\"\n @click=\"handleAddSubscriber\"\n >\n <span v-if=\"isAddLoading\" class=\"loading loading-spinner loading-xs\"></span>\n <span v-else>Add</span>\n </button>\n </div>\n\n <!-- Subscriber list -->\n <div v-if=\"subscribersLoading\" class=\"flex justify-center py-4\">\n <span class=\"loading loading-spinner loading-sm\"></span>\n </div>\n <ul v-else-if=\"subscribers.length === 0\" class=\"text-sm text-base-content/50 italic\">\n No subscribers yet\n </ul>\n <ul v-else class=\"space-y-2\">\n <li\n v-for=\"sub in subscribers\"\n :key=\"sub.id\"\n class=\"flex items-center justify-between gap-2 py-2 px-3 rounded bg-base-100 border border-base-300\"\n >\n <span class=\"text-sm truncate\">\n {{ sub.user_id_display_name ?? sub.user_id }}\n </span>\n <button\n v-if=\"!locked\"\n type=\"button\"\n class=\"btn btn-ghost btn-xs text-error\"\n aria-label=\"Remove subscriber\"\n @click=\"handleRemoveSubscriber(sub.id)\"\n :disabled=\"isRemoveLoading === sub.id\"\n >\n <span v-if=\"isRemoveLoading === sub.id\" class=\"loading loading-spinner loading-xs\"></span>\n <svg v-else xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n DragoncoreApi,\n RecordSubscriberReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { ref, computed } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n supportTicketId: string;\n locked: boolean;\n}\n\nconst props = defineProps<Props>();\n\nconst expanded = ref(false);\nconst selectedUserId = ref('');\n\n// Fetch subscribers\nconst {\n data: subscribersData,\n loading: subscribersLoading,\n refetch: refetchSubscribers,\n} = useQuery<DragoncoreApi, RecordSubscriberReadDto[]>(\n (api) => api.supportTickets.staffListSubscribers(props.supportTicketId),\n {\n enabled: computed(() => !!props.supportTicketId),\n cacheKey: `support-ticket-subscribers-${props.supportTicketId}`,\n },\n);\n\nconst subscribers = computed((): RecordSubscriberReadDto[] => {\n return subscribersData.value ?? [];\n});\n\n// Fetch users for add dropdown\nconst { data: usersData } = useQuery<\n DragoncoreApi,\n Array<{ id: string; email: string }>\n>(\n (api) => api.users.getUsersForSelection(),\n { staleTime: 10 * 60 * 1000 },\n);\n\nconst availableUsers = computed(() => {\n const users = usersData.value ?? [];\n const existingIds = new Set(subscribers.value.map((s) => s.user_id));\n return users.filter((u) => !existingIds.has(u.id));\n});\n\n// Add subscriber mutation\nconst { mutate: addSubscriber, loading: isAddLoading } = useMutation<\n DragoncoreApi,\n { support_ticket_id: string; user_id: string },\n RecordSubscriberReadDto\n>(\n (api, input) => api.supportTickets.staffAddSubscriber(input),\n { invalidate: /^support-ticket-subscribers/ },\n);\n\n// Remove subscriber mutation\nconst { mutate: removeSubscriber } = useMutation<\n DragoncoreApi,\n { supportTicketId: string; subscriberId: string },\n void\n>(\n (api, input) => api.supportTickets.staffRemoveSubscriber(input),\n { invalidate: /^support-ticket-subscribers/ },\n);\n\nconst isRemoveLoading = ref<string | null>(null);\n\nasync function handleAddSubscriber() {\n if (!selectedUserId.value) return;\n\n try {\n await addSubscriber({\n support_ticket_id: props.supportTicketId,\n user_id: selectedUserId.value,\n });\n toast.success('Subscriber added');\n selectedUserId.value = '';\n await refetchSubscribers();\n } catch (e) {\n toast.error(extractRpcErrorMessage(e, 'Failed to add subscriber'));\n }\n}\n\nasync function handleRemoveSubscriber(subscriberId: string) {\n try {\n isRemoveLoading.value = subscriberId;\n await removeSubscriber({\n supportTicketId: props.supportTicketId,\n subscriberId,\n });\n toast.success('Subscriber removed');\n await refetchSubscribers();\n } catch (e) {\n toast.error(extractRpcErrorMessage(e, 'Failed to remove subscriber'));\n } finally {\n isRemoveLoading.value = null;\n }\n}\n</script>\n","<template>\n <!-- Loading State (only on initial load; refetch keeps content visible) -->\n <div v-if=\"isLoading && !ticket\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"alert alert-error mb-4 max-w-4xl mx-auto px-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div class=\"flex-1\">\n <span>{{ error.message || 'An error occurred' }}</span>\n <div class=\"mt-2\">\n <router-link :to=\"{ name: 'StaffSupportTicketList' }\" class=\"link link-primary\">\n Go back to ticket list\n </router-link>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div v-else-if=\"ticket\" class=\"px-4 py-6 max-w-4xl mx-auto\">\n <!-- Header -->\n <div class=\"mb-6\">\n <h1 class=\"text-2xl font-bold text-base-content break-words leading-tight mt-2\">\n {{ ticket.title }}\n </h1>\n </div>\n\n <!-- Action Banner (buttons only; sections in dialogs) -->\n <div class=\"mb-6\">\n <StaffActionBanner\n :ticket=\"ticket\"\n @approve=\"showApproveModal\"\n @reject=\"showRejectModal\"\n @revert=\"showRevertModal\"\n @convert-to-internal=\"showConvertToInternalModal\"\n @delete=\"showDeleteModal\"\n @complete=\"showCompleteModal\"\n @archive=\"showArchiveModal\"\n />\n </div>\n\n <!-- Approve Modal -->\n <ApproveSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isApproveModalOpen\"\n @close=\"isApproveModalOpen = false\"\n @success=\"handleApproveSuccess\"\n />\n\n <!-- Revert Modal -->\n <RevertSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isRevertModalOpen\"\n @close=\"isRevertModalOpen = false\"\n @success=\"handleTicketUpdate\"\n />\n\n <!-- Delete Modal -->\n <DeleteSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isDeleteModalOpen\"\n @close=\"isDeleteModalOpen = false\"\n @success=\"handleDeleteSuccess\"\n />\n\n <!-- Convert to Internal Modal -->\n <ConvertToInternalModal\n :ticket=\"ticket\"\n :is-open=\"isConvertToInternalModalOpen\"\n @close=\"isConvertToInternalModalOpen = false\"\n @success=\"handleTicketUpdate\"\n />\n\n <!-- Complete Modal -->\n <CompleteSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isCompleteModalOpen\"\n @close=\"isCompleteModalOpen = false\"\n @success=\"handleTicketUpdate\"\n />\n\n <!-- Archive Modal -->\n <ArchiveSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isArchiveModalOpen\"\n @close=\"isArchiveModalOpen = false\"\n @success=\"handleTicketUpdate\"\n />\n\n <!-- Reject Modal with Reason -->\n <dialog ref=\"rejectModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Reject Ticket</h3>\n <p class=\"text-sm text-base-content/70 py-2\">\n This will lock the ticket and notify the requester.\n </p>\n <div class=\"form-control py-4\">\n <label class=\"label\">\n <span class=\"label-text text-sm font-medium\">Reason (optional)</span>\n </label>\n <textarea\n v-model=\"rejectReason\"\n class=\"textarea textarea-bordered w-full\"\n rows=\"3\"\n placeholder=\"Why is this ticket being rejected?\"\n :disabled=\"isRejecting\"\n ></textarea>\n </div>\n <div v-if=\"rejectError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ rejectError }}</span>\n </div>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeRejectModal\" :disabled=\"isRejecting\">\n Cancel\n </button>\n <button\n class=\"btn btn-error\"\n @click=\"handleRejectWithReason\"\n :disabled=\"isRejecting\"\n >\n <span v-if=\"isRejecting\" class=\"loading loading-spinner loading-xs mr-2\"></span>\n {{ isRejecting ? 'Rejecting...' : 'Reject Ticket' }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button @click=\"closeRejectModal\">close</button>\n </form>\n </dialog>\n\n <!-- Metadata Card (Display or Edit) -->\n <div class=\"mb-8\">\n <StaffMetadataCard v-if=\"!isEditMode\" :ticket=\"ticket\" @edit=\"enterEditMode\" />\n <StaffMetadataCardEdit\n v-else\n :ticket=\"ticket\"\n @success=\"handleMetadataSaveSuccess\"\n @cancel=\"exitEditMode\"\n />\n </div>\n\n <!-- Attachments (separate from timeline so adding a comment doesn't cause refetch) -->\n <div class=\"mb-8\">\n <SupportTicketAttachmentsCollapsible\n :record-id=\"ticket.id\"\n :locked=\"!!ticket.archived_at\"\n :editable=\"!ticket.archived_at\"\n @uploaded=\"refetchTimeline\"\n @deleted=\"refetchTimeline\"\n />\n </div>\n\n <!-- Subscribers -->\n <div class=\"mb-8\">\n <SupportTicketSubscribersCollapsible\n :support-ticket-id=\"ticket.id\"\n :locked=\"!!ticket.archived_at\"\n />\n </div>\n\n <!-- Timeline: stay mounted once we have data so adding a comment doesn't unmount/remount -->\n <div>\n <StaffTimeline\n v-if=\"timelineData != null\"\n :ticket=\"ticket\"\n :customer-notes=\"customerNotesForTimeline\"\n :internal-notes=\"internalNotesForTimeline\"\n :system-events=\"systemEventsForTimeline\"\n :on-add-note=\"handleAddNote\"\n />\n <div v-else class=\"flex justify-center items-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n NoteCreateDto,\n StaffSupportTicketReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { OPERATORS, RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { computed, inject, nextTick, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { BATCH_MODE } from '../../../composables/useRpcAuth';\nimport { useMutation } from '../../../composables/useMutation';\nimport { useQuery } from '../../../composables/useQuery';\nimport { extractRpcErrorMessage } from '../../../utils/extractRpcErrorMessage';\nimport SupportTicketAttachmentsCollapsible from '../shared/SupportTicketAttachmentsCollapsible.vue';\nimport { parseRecordVersions } from '../utils/parseRecordVersions';\nimport ApproveSupportTicketModal from './components/ApproveSupportTicketModal.vue';\nimport ArchiveSupportTicketModal from './components/ArchiveSupportTicketModal.vue';\nimport CompleteSupportTicketModal from './components/CompleteSupportTicketModal.vue';\nimport ConvertToInternalModal from './components/ConvertToInternalModal.vue';\nimport DeleteSupportTicketModal from './components/DeleteSupportTicketModal.vue';\nimport RevertSupportTicketModal from './components/RevertSupportTicketModal.vue';\nimport StaffActionBanner from './components/StaffActionBanner.vue';\nimport StaffMetadataCard from './components/StaffMetadataCard.vue';\nimport StaffMetadataCardEdit from './components/StaffMetadataCardEdit.vue';\nimport StaffTimeline from './components/StaffTimeline.vue';\nimport SupportTicketSubscribersCollapsible from './components/SupportTicketSubscribersCollapsible.vue';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst router = useRouter();\nconst support_ticket_id = route.params.id as string;\n\nconst isApproveModalOpen = ref(false);\nconst isRevertModalOpen = ref(false);\nconst isDeleteModalOpen = ref(false);\nconst isConvertToInternalModalOpen = ref(false);\nconst isCompleteModalOpen = ref(false);\nconst isArchiveModalOpen = ref(false);\nconst rejectModal = ref<HTMLDialogElement | null>(null);\nconst rejectReason = ref('');\nconst rejectError = ref<string | null>(null);\n\n// Edit mode state\nconst isEditMode = computed(() => route.query.mode === 'edit');\n\n// Get refresh function from parent\nconst refreshTicket = inject<(() => Promise<void>) | undefined>('refreshTicket');\n\n// Fetch customer notes, internal notes, and record versions in a single batched request\nconst { data: timelineData, refetch: refetchTimeline } = useQuery(\n async (api) => {\n const [customerNotes, internalNotes, recordVersions] = await Promise.all([\n api.notes.getNotes({\n record_id: { operator: OPERATORS.EQUALS, value: support_ticket_id },\n record_type: { operator: OPERATORS.EQUALS, value: 'support_ticket' },\n is_internal: { operator: OPERATORS.EQUALS, value: false },\n first: 100,\n sortBy: 'created_at',\n sortDirection: 'asc',\n }),\n api.notes.getNotes({\n record_id: { operator: OPERATORS.EQUALS, value: support_ticket_id },\n record_type: { operator: OPERATORS.EQUALS, value: 'support_ticket' },\n is_internal: { operator: OPERATORS.EQUALS, value: true },\n first: 100,\n sortBy: 'created_at',\n sortDirection: 'asc',\n }),\n api.recordVersions.listRecordVersionsPaginated(\n support_ticket_id,\n RecordConst.SUPPORT_TICKET, // legacy; record_types in filters takes priority\n {\n record_types: [RecordConst.SUPPORT_TICKET, RecordConst.SUPPORT_TICKET_ACTIVITY],\n first: 100,\n sortBy: 'recorded_at',\n sortDirection: 'asc',\n },\n ),\n ]);\n return { customerNotes, internalNotes, recordVersions };\n },\n {\n enabled: !!support_ticket_id && !!props.ticket,\n batchMode: BATCH_MODE.batch,\n trackedSegment: 'support-ticket-timeline',\n },\n);\n\n// Map notes for timeline\ninterface TimelineNoteDto {\n authorName: string;\n createdAt: string;\n body: string;\n}\n\nconst customerNotesForTimeline = computed((): TimelineNoteDto[] => {\n const items = timelineData.value?.customerNotes?.items ?? [];\n return items.map((n) => ({\n authorName: n.created_by_display_name ?? n.created_by ?? '(unknown)',\n createdAt: n.created_at,\n body: n.body ?? '',\n }));\n});\n\nconst internalNotesForTimeline = computed((): TimelineNoteDto[] => {\n const items = timelineData.value?.internalNotes?.items ?? [];\n return items.map((n) => ({\n authorName: n.created_by_display_name ?? n.created_by ?? '(unknown)',\n createdAt: n.created_at,\n body: n.body ?? '',\n }));\n});\n\n// Parse system events (no filtering for staff; merged by API from record_types)\nconst systemEventsForTimeline = computed(() => {\n const data = timelineData.value?.recordVersions;\n const versions = data?.items ?? [];\n const userDisplayMap = data?.user_display_map;\n const displayMap = userDisplayMap ? new Map(Object.entries(userDisplayMap)) : undefined;\n return parseRecordVersions(versions, displayMap);\n});\n\n// Note creation mutation\nconst { mutate: createNote } = useMutation(\n (api, input: NoteCreateDto) => api.notes.createNote(input),\n { invalidate: /^notes?:/ },\n);\n\n// Reject mutation\nconst { mutate: rejectSupportTicket, loading: isRejecting } = useMutation(\n (api, input: { id: string }) => api.supportTickets.rejectTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\n// Handle note creation\nasync function handleAddNote(payload: {\n content: string;\n noteType: 'customer' | 'internal';\n}) {\n try {\n await createNote({\n record_id: support_ticket_id,\n record_type: 'support_ticket' as const,\n body: payload.content,\n tag: null,\n is_internal: payload.noteType === 'internal',\n });\n await refetchTimeline();\n toast.success(payload.noteType === 'internal' ? 'Internal note added' : 'Note added');\n } catch {\n toast.error('Failed to add note');\n throw new Error('Failed to add note');\n }\n}\n\n// Show approve modal\nfunction showApproveModal() {\n if (!props.ticket) return;\n isApproveModalOpen.value = true;\n}\n\n// Show revert modal\nfunction showRevertModal() {\n if (!props.ticket) return;\n isRevertModalOpen.value = true;\n}\n\n// Show delete modal\nfunction showDeleteModal() {\n if (!props.ticket) return;\n isDeleteModalOpen.value = true;\n}\n\n// Show convert to internal modal\nfunction showConvertToInternalModal() {\n if (!props.ticket) return;\n isConvertToInternalModalOpen.value = true;\n}\n\n// Show complete modal\nfunction showCompleteModal() {\n if (!props.ticket) return;\n isCompleteModalOpen.value = true;\n}\n\nfunction showArchiveModal() {\n if (!props.ticket) return;\n isArchiveModalOpen.value = true;\n}\n\n// Handle delete success (navigate away since ticket is gone)\nfunction handleDeleteSuccess() {\n router.push({ name: 'StaffSupportTicketList' });\n}\n\n// Show reject modal\nfunction showRejectModal() {\n rejectReason.value = '';\n rejectError.value = null;\n rejectModal.value?.showModal();\n}\n\n// Close reject modal\nfunction closeRejectModal() {\n rejectModal.value?.close();\n rejectReason.value = '';\n rejectError.value = null;\n}\n\n// Handle approve success (called by ApproveSupportTicketModal)\nasync function handleApproveSuccess() {\n await handleTicketUpdate();\n}\n\n// Handle reject with reason\nasync function handleRejectWithReason() {\n if (!props.ticket) return;\n rejectError.value = null;\n\n try {\n const reasonTrimmed = rejectReason.value.trim();\n\n // Create customer note if reason is provided\n if (reasonTrimmed) {\n await createNote({\n record_id: props.ticket.id,\n record_type: 'support_ticket' as const,\n body: reasonTrimmed,\n tag: null,\n is_internal: false,\n });\n }\n\n // Reject the ticket\n await rejectSupportTicket({ id: props.ticket.id });\n toast.info('Support Ticket rejected.');\n closeRejectModal();\n await handleTicketUpdate();\n } catch (e) {\n const errorMessage = extractRpcErrorMessage(e, 'Failed to reject ticket');\n rejectError.value = errorMessage;\n toast.error(errorMessage);\n }\n}\n\n// Handle ticket update after approve/reject\nasync function handleTicketUpdate() {\n // Refresh ticket data\n if (refreshTicket) {\n await refreshTicket();\n }\n // Refetch notes and record versions to show new system events\n await refetchTimeline();\n}\n\n// Enter edit mode\nfunction enterEditMode() {\n router.push({\n name: route.name || 'StaffViewSupportTicket',\n params: route.params,\n query: { ...route.query, mode: 'edit' },\n });\n}\n\n// Exit edit mode\nasync function exitEditMode() {\n await router.push({\n name: route.name || 'StaffViewSupportTicket',\n params: route.params,\n query: { ...route.query, mode: undefined },\n });\n}\n\n// Handle metadata save success (form does mutation; we refresh and exit)\nasync function handleMetadataSaveSuccess() {\n // Await navigation so edit form fully unmounts before toast (prevents toast from being cut off)\n await exitEditMode();\n await nextTick(); // Wait for Vue DOM updates after route change\n toast.success('Ticket updated successfully');\n // Await refresh so user sees fresh data; spinner stays hidden (isLoading && !ticket)\n if (refreshTicket) {\n await refreshTicket();\n }\n await refetchTimeline();\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAOA,MAAM,iCAAiC,2BAA2B,KAAK,EACrE,cAAc,MACf,CAAC;AAGF,MAAa,mCAAmC,aAC9C,gCACA,4BACA,EACE,cAAc;CACZ,OAAO;CACP,WAAW;CACX,MAAM;CACN,aAAa;CACb,UAAU;CACX,EACF,CACF;;;;;;;;;;;;;;AC0BD,MAAM,sBACJ;AAKF,MAAM,uBAAuB;;;;;;;;;EAY7B,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,oBAAoB;EAC1B,MAAM,qBAAqB;EAE3B,MAAM,EACJ,MACA,OACA,WACA,mBACA,wBACA,oBACE,QAAQ,kCAAkC;GAC5C,WAAW;GACX,uBAAuB;GACvB,aAAa;GACb,WAAW,YAAY;IACrB,MAAM,MAAM,MAAM,QAAQ,cAAc,MAAM;AAE9C,WAAO,EAAE,cADY,OAAO,QAAQ,KAAK,MAAM,KACxB;;GAE1B,CAAC;EAEF,MAAM,EAAE,QAAQ,sBAAsB,SAAS,gBAAgB,aAC5D,KAAK,UAAmC,IAAI,eAAe,cAAc,MAAM,EAChF,EAAE,YAAY,sBAAsB,CACrC;AAED,cACQ,MAAM,SACX,WAAW;AACV,OAAI,QAAQ;AACV,qBAAiB;AACjB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,aAAa,UAAoC;AAC9D,OAAI,CAAC,MAAM,OAAQ;AACnB,SAAM,qBAAqB;IACzB,IAAI,MAAM,OAAO;IACjB,cAAc,SAAS;IACxB,CAAC;;EAIJ,SAAS,gBAAgB;AACvB,UAAO;AACP,SAAM,QACJ,4BAA4B,KAAK,OAAO,aAAa,oBACtD;AACD,QAAK,UAAU;;EAGjB,SAAS,YAAY,OAAwB;GAC3C,MAAM,UAAU,uBAAuB,OAAO,oBAAoB;AAClE,QAAK,eAAe,QAAQ;AAC5B,SAAM,MAAM,QAAQ;;;uBAvIpB,mBAqCS,UAAA;aArCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBAgCM,OAhCN,eAgCM;8BA/BJ,mBAA0D,MAAA,EAAtD,OAAM,qBAAmB,EAAC,2BAAuB,GAAA;IACrD,mBAEI,KAFJ,eAEI,gBADC,MAAA,kBAAiB,CAAA,EAAA,EAAA;IAEtB,YA0BY,MAAA,UAAA,EAAA;KAzBT,gBAAe;KACf,WAAS;KACT,SAAO;KACR,OAAM;KACN,UAAS;;4BAEiB;MAA1B,YAA0B,MAAA,MAAA,CAAA,iBAAA;MACf,MAAA,KAAI,CAAC,eAAA,WAAA,EAAhB,mBAEM,OAFN,cAEM,CADJ,mBAAmD,QAAnD,cAAmD,gBAA1B,MAAA,KAAI,CAAC,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAE3C,mBAEI,KAFJ,cAEI,gBADC,MAAA,mBAAkB,CAAA,EAAA,EAAA;MAEvB,mBAUM,OAVN,cAUM,CATJ,mBAOS,UAAA;OANP,MAAK;OACL,OAAM;OACL,SAAO;OACP,UAAU,MAAA,YAAW;SACvB,YAED,GAAA,aAAA,EACA,YAAiF,MAAA,kBAAA,EAAA;OAA9D,YAAW;OAAmB,gBAAe;;MAElE,YAAmE,MAAA,uBAAA,EAAA,EAA3C,OAAM,oCAAkC,CAAA;;;;OAGpE,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECwBhD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,aAAa,eAAe,CAAC,CAAC,MAAM,QAAQ,YAAY;EAE9D,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,eAAe,IAAmB,KAAK;EAE7C,MAAM,EAAE,QAAQ,eAAe,SAAS,gBAAgB,aACrD,KAAK,UAA0B,IAAI,eAAe,cAAc,MAAM,EACvE,EAAE,YAAY,sBAAsB,CACrC;AAED,cACQ,MAAM,SACX,WAAW;AACV,OAAI,QAAQ;AACV,iBAAa,QAAQ;AACrB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,eAAe;AAC5B,OAAI,CAAC,MAAM,OAAQ;AACnB,gBAAa,QAAQ;AAErB,OAAI;AACF,UAAM,cAAc,EAAE,IAAI,MAAM,OAAO,IAAI,CAAC;AAC5C,UAAM,QAAQ,WAAW,QAAQ,sBAAsB,kBAAkB;AACzE,WAAO;AACP,SAAK,UAAU;YACR,GAAG;IACV,MAAM,UAAU,uBAAuB,GAAG,WAAW,QAAQ,wBAAwB,oBAAoB;AACzG,iBAAa,QAAQ;AACrB,UAAM,MAAM,QAAQ;;;;uBAtGtB,mBAuCS,UAAA;aAvCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBAkCM,OAlCN,cAkCM;IAjCJ,mBAA6G,MAA7G,cAA6G,gBAA5E,WAAA,QAAU,8BAAA,0BAAA,EAAA,EAAA;IAC3C,mBASI,KATJ,cASI,CARc,WAAA,SAAA,WAAA,EAAhB,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAHiB,8GAG5B,CAAA,uBACA,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAHM,kJAGjB,CAAA;IAES,aAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,cAEM,CADJ,mBAA+C,QAA/C,cAA+C,gBAAtB,aAAA,MAAY,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;IAEvC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAOS,UAAA;KANP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,YAAW;OACvB,YAED,GAAA,aAAA,EACA,mBAQS,UAAA;KAPP,MAAK;KACJ,OAAK,eAAE,WAAA,QAAU,oBAAA,kBAAA;KACjB,SAAO;KACP,UAAU,MAAA,YAAW;QAEV,MAAA,YAAW,IAAA,WAAA,EAAvB,mBAAgF,QAAhF,aAAgF,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MAChF,gBAAG,MAAA,YAAW,GAAI,WAAA,QAAU,mBAAA,iBAAyC,WAAA,QAAU,cAAA,UAAA,EAAA,EAAA,CAAA,EAAA,IAAA,aAAA,CAAA,CAAA;OAIrF,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;AClChD,MAAM,kCAAkC,4BAA4B,KAAK,EACvE,iBAAiB,MAClB,CAAC;AAGF,MAAa,oCAAoC,aAC/C,iCACA,6BACA,EACE,iBAAiB;CACf,OAAO;CACP,WAAW;CACX,MAAM;CACN,aAAa;CACb,UAAU;CACX,EACF,CACF;;;;;;;;;;;;;;;;;;;;;;ECuCD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EAEpD,MAAM,gBAAgB,eACpB,MAAM,SACF,uBACE,MAAM,OAAO,cACb,MAAM,OAAO,gBACf,GACA,IACL;EAED,MAAM,EACJ,MACA,OACA,WACA,mBACA,wBACA,oBACE,QAAQ,mCAAmC;GAC7C,WAAW;GACX,uBAAuB;GACvB,aAAa;GACb,WAAW,YAAY;IACrB,MAAM,UAAU,cAAc;AAE9B,WAAO,EAAE,iBADK,YAAY,SAAS,YAAY,QAAQ,SAAS,SAC/B;;GAEpC,CAAC;EAEF,MAAM,EAAE,QAAQ,uBAAuB,SAAS,iBAAiB,aAC9D,KAAK,UACJ,IAAI,eAAe,eAAe,MAAM,EAC1C,EAAE,YAAY,sBAAsB,CACrC;AAED,cACQ,MAAM,SACX,WAAW;AACV,OAAI,QAAQ;AACV,qBAAiB;AACjB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,aAAa,UAAuC;AACjE,OAAI,CAAC,MAAM,OAAQ;AACnB,SAAM,sBAAsB;IAC1B,IAAI,MAAM,OAAO;IACjB,iBAAiB,SAAS;IAC3B,CAAC;;EAIJ,SAAS,gBAAgB;AACvB,UAAO;AACP,SAAM,QAAQ,sCAAsC;AACpD,QAAK,UAAU;;EAGjB,SAAS,YAAY,OAAwB;GAC3C,MAAM,UAAU,uBAAuB,OAAO,qBAAqB;AACnE,QAAK,eAAe,QAAQ;AAC5B,SAAM,MAAM,QAAQ;;;uBArIpB,mBAoCS,UAAA;aApCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBA+BM,OA/BN,cA+BM;8BA9BJ,mBAA0D,MAAA,EAAtD,OAAM,qBAAmB,EAAC,2BAAuB,GAAA;IACrD,mBAII,KAJJ,cAII;+CAJyC,0BAE3C,GAAA;KAAA,mBAAsD,QAAtD,cAAsD,gBAAvB,cAAA,MAAa,EAAA,EAAA;+CAAU,iDAExD,GAAA;;IACA,YAuBY,MAAA,UAAA,EAAA;KAtBT,gBAAe;KACf,WAAS;KACT,SAAO;KACR,OAAM;KACN,UAAS;;4BAEyC;MAAlD,YAAkD,MAAA,MAAA,CAAA,qBAAA,EAAvB,aAAY,UAAQ,CAAA;MACpC,MAAA,KAAI,CAAC,eAAA,WAAA,EAAhB,mBAEM,OAFN,cAEM,CADJ,mBAAmD,QAAnD,cAAmD,gBAA1B,MAAA,KAAI,CAAC,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAE3C,mBAUM,OAVN,cAUM,CATJ,mBAOS,UAAA;OANP,MAAK;OACL,OAAM;OACL,SAAO;OACP,UAAU,MAAA,aAAY;SACxB,YAED,GAAA,aAAA,EACA,YAAmF,MAAA,kBAAA,EAAA;OAAhE,YAAW;OAAoB,gBAAe;;MAEnE,YAAmE,MAAA,uBAAA,EAAA,EAA3C,OAAM,oCAAkC,CAAA;;;;OAGpE,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECkBhD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,eAAe,IAAmB,KAAK;EAC7C,MAAM,iBAAiB,IAAI,GAAG;EAE9B,MAAM,EAAE,QAAQ,mBAAmB,SAAS,iBAAiB,aAC1D,KAAK,OAAe,IAAI,eAAe,kBAAkB,GAAG,EAC7D,EAAE,YAAY,sBAAsB,CACrC;AAED,QACE,OAAO,MAAM,cAAc,MAAM,OAAO,GACvC,CAAC,QAAQ,YAAY;AACpB,OAAI,UAAU,QAAQ;AAGpB,mBAAe,QACb,sFAFA,OAAO,gBAAgB,WAAW,OAAO,aAAa,GAAG,IAK3C,WAAW,OAAO,aAAa,sBAAsB,MACnE;AAGF,iBAAa,QAAQ;AACrB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,gBAAgB;AAC7B,OAAI,CAAC,MAAM,OAAQ;AACnB,gBAAa,QAAQ;AAErB,OAAI;AACF,UAAM,kBAAkB,MAAM,OAAO,GAAG;AACxC,UAAM,QAAQ,0CAA0C;AACxD,WAAO;AACP,SAAK,UAAU;YACR,GAAG;IACV,MAAM,UAAU,uBAAuB,GAAG,oBAAoB;AAC9D,iBAAa,QAAQ;AACrB,UAAM,MAAM,QAAQ;;;;uBAxGtB,mBAgCS,UAAA;aAhCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBA2BM,OA3BN,cA2BM;8BA1BJ,mBAA4D,MAAA,EAAxD,OAAM,qBAAmB,EAAC,6BAAyB,GAAA;IACvD,mBAEI,KAFJ,cAEI,gBADC,eAAA,MAAc,EAAA,EAAA;IAER,aAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,cAEM,CADJ,mBAA+C,QAA/C,cAA+C,gBAAtB,aAAA,MAAY,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;IAEvC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAOS,UAAA;KANP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,aAAY;OACxB,YAED,GAAA,aAAA,EACA,mBAQS,UAAA;KAPP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,aAAY;QAEX,MAAA,aAAY,IAAA,WAAA,EAAxB,mBAAiF,QAAjF,aAAiF,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MACjF,gBAAG,MAAA,aAAY,GAAA,kBAAA,sBAAA,EAAA,EAAA,CAAA,EAAA,GAAA,aAAA,CAAA,CAAA;OAIrB,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECuBhD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,cAAc,IAAmB,KAAK;EAE5C,MAAM,EAAE,QAAQ,cAAc,SAAS,eAAe,aACnD,KAAK,OAAe,IAAI,eAAe,aAAa,GAAG,EACxD,EAAE,YAAY,sBAAsB,CACrC;AAED,cACQ,MAAM,SACX,WAAW;AACV,OAAI,QAAQ;AACV,gBAAY,QAAQ;AACpB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,eAAe;AAC5B,OAAI,CAAC,MAAM,OAAQ;AACnB,eAAY,QAAQ;AAEpB,OAAI;AACF,UAAM,aAAa,MAAM,OAAO,GAAG;AACnC,UAAM,QAAQ,iBAAiB;AAC/B,WAAO;AACP,SAAK,UAAU;YACR,GAAG;IACV,MAAM,UAAU,uBAAuB,GAAG,mBAAmB;AAC7D,gBAAY,QAAQ;AACpB,UAAM,MAAM,QAAQ;;;;uBA9FtB,mBAiCS,UAAA;aAjCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBA4BM,OA5BN,cA4BM;8BA3BJ,mBAAyD,MAAA,EAArD,OAAM,qBAAmB,EAAC,0BAAsB,GAAA;8BACpD,mBAGI,KAAA,EAHD,OAAM,qCAAmC,EAAC,6JAG7C,GAAA;IACW,YAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,cAEM,CADJ,mBAA8C,QAA9C,cAA8C,gBAArB,YAAA,MAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;IAEtC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAOS,UAAA;KANP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,WAAU;OACtB,YAED,GAAA,aAAA,EACA,mBAQS,UAAA;KAPP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,WAAU;QAET,MAAA,WAAU,IAAA,WAAA,EAAtB,mBAA+E,QAA/E,aAA+E,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MAC/E,gBAAG,MAAA,WAAU,GAAA,gBAAA,SAAA,EAAA,EAAA,CAAA,EAAA,GAAA,aAAA,CAAA,CAAA;OAInB,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECsBhD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,cAAc,IAAmB,KAAK;EAE5C,MAAM,gBAAgB,IAAI,GAAG;EAE7B,MAAM,EAAE,QAAQ,qBAAqB,SAAS,gBAAgB,aAC3D,KAAK,UAA0B,IAAI,eAAe,aAAa,MAAM,EACtE,EAAE,YAAY,sBAAsB,CACrC;AAED,QACE,OAAO,MAAM,cAAc,MAAM,OAAO,GACvC,CAAC,QAAQ,YAAY;AACpB,OAAI,UAAU,QAAQ;IACpB,MAAM,gBAAgB,uBACpB,OAAO,cACP,OAAO,gBACR;AAED,kBAAc,QACZ,uFAFiB,kBAAkB,SAAS,kBAAkB,QAKhD,YAAY,cAAc,0BAA0B,MAClE;AAEF,gBAAY,QAAQ;AACpB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,eAAe;AAC5B,OAAI,CAAC,MAAM,OAAQ;AACnB,eAAY,QAAQ;AAEpB,OAAI;AACF,UAAM,oBAAoB,EAAE,IAAI,MAAM,OAAO,IAAI,CAAC;IAElD,MAAM,gBAAgB,uBACpB,MAAM,OAAO,cACb,MAAM,OAAO,gBACd;IACD,MAAM,gBACJ,kBAAkB,SAAS,kBAAkB,QACzC,IAAI,cAAc,sBAClB;AAEN,UAAM,QAAQ,sCAAsC,gBAAgB;AACpE,WAAO;AACP,SAAK,UAAU;YACR,GAAG;IACV,MAAM,UAAU,uBAAuB,GAAG,mBAAmB;AAC7D,gBAAY,QAAQ;AACpB,UAAM,MAAM,QAAQ;;;;uBAtHtB,mBAgCS,UAAA;aAhCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBA2BM,OA3BN,cA2BM;8BA1BJ,mBAAoE,MAAA,EAAhE,OAAM,qBAAmB,EAAC,qCAAiC,GAAA;IAC/D,mBAEI,KAFJ,cAEI,gBADC,cAAA,MAAa,EAAA,EAAA;IAEP,YAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,cAEM,CADJ,mBAA8C,QAA9C,cAA8C,gBAArB,YAAA,MAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;IAEtC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAOS,UAAA;KANP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,YAAW;OACvB,YAED,GAAA,aAAA,EACA,mBAQS,UAAA;KAPP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,YAAW;QAEV,MAAA,YAAW,IAAA,WAAA,EAAvB,mBAAgF,QAAhF,aAAgF,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MAChF,gBAAG,MAAA,YAAW,GAAA,iBAAA,oBAAA,EAAA,EAAA,CAAA,EAAA,GAAA,aAAA,CAAA,CAAA;OAIpB,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;EC8FhD,MAAM,QAAQ;EAEd,MAAM,OAAO;EAUb,MAAM,sBAAsB,eAAe;GACzC,MAAM,KAAK,MAAM,OAAO;AACxB,UAAO,KAAK,iBAAiB,GAAG,CAAC,YAAY;IAC7C;EAEF,MAAM,cAAc,eAAe,MAAM,OAAO,WAAW,YAAY;EACvE,MAAM,aAAa,eAAe,CAAC,CAAC,MAAM,OAAO,YAAY;;UA7InD,WAAA,SAAA,WAAA,EADR,YAeoB,2BAAA;;IAblB,SAAQ;IACR,MAAK;;IAGM,SAAO,cAOP,CANT,mBAMS,UAAA;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;OACb,cAED,CAAA,CAAA;2BAPF,CAAA,OAAA,QAAA,OAAA,MAAA,gBAFD,uGAEC,GAAA,EAAA,CAAA;;SAWW,QAAA,OAAO,oBAAe,aAAA,WAAA,EADnC,YAoBoB,2BAAA;;IAlBlB,SAAQ;IACR,MAAK;;IAGM,SAAO,cAGP;KAFT,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAA0B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;QAAa,YAE9E;KACA,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAAwB,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;QAAY,WAE3E;KACA,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAA0B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,oBAAA;QAAuB,wBAExF;KACA,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAAwB,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;QAAY,WAE3E;;2BAZF,CAAA,OAAA,QAAA,OAAA,MAAA,gBAFD,uCAEC,GAAA,EAAA,CAAA;;SAgBW,QAAA,OAAO,oBAAe,cAAmB,QAAA,OAAO,sBAAA,WAAA,EAD7D,YA2BoB,2BAAA;;IAzBlB,SAAQ;IACR,MAAK;;IAGM,SAAO,cAGP,CAFT,mBAES,UAAA;KAFD,MAAK;KAAS,OAAM;KAA0B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;OAAY,WAE7E,EAAA,CAES,YAAA,SAAA,WAAA,EADT,mBAOS,UAAA;;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,WAAA;OACb,aAED,IAAA,CAEc,WAAA,SAAA,WAAA,EADd,mBAOS,UAAA;;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;OACb,YAED,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA;2BApB0B,CAAA,gBAD7B,kCAC6B,gBAAG,oBAAA,MAAmB,GAAG,MACrD,EAAA,CAAA,CAAA;;SAuBW,QAAA,OAAO,oBAAe,cAAmB,QAAA,OAAO,sBAAA,WAAA,EAD7D,YAsBoB,2BAAA;;IApBlB,SAAQ;IACR,MAAK;;IAGM,SAAO,cAGP;KAFT,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAA0B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;QAAY,WAE7E;MAES,WAAA,SAAA,WAAA,EADT,mBAOS,UAAA;;MALP,MAAK;MACL,OAAM;MACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;QACb,YAED,IAAA,mBAAA,QAAA,KAAA;KACA,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAAwB,SAAK,OAAA,QAAA,OAAA,OAAA,WAAE,KAAI,SAAA;QAAY,WAE3E;;2BAf0B,CAAA,gBAD7B,kCAC6B,gBAAG,oBAAA,MAAmB,GAAG,MACrD,EAAA,CAAA,CAAA;;SAiB4B,QAAA,OAAO,oBAAe,cAAA,WAAA,EAApD,YAuBoB,2BAAA;;IAvBiD,SAAQ;IAAO,MAAK;;IAE5E,SAAO,cAQP,CAAA,CANA,YAAA,SAAA,WAAA,EADT,mBAOS,UAAA;;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,QAAA,OAAA,OAAA,WAAE,KAAI,WAAA;OACb,aAED,IAAA,CAEc,WAAA,SAAA,WAAA,EADd,mBAOS,UAAA;;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,QAAA,OAAA,OAAA,WAAE,KAAI,UAAA;OACb,YAED,IAAA,mBAAA,QAAA,KAAA,EACA,mBAES,UAAA;KAFD,MAAK;KAAS,OAAM;KAAwB,SAAK,OAAA,QAAA,OAAA,OAAA,WAAE,KAAI,SAAA;OAAY,WAE3E,CAAA,CAAA;2BAnBF,CAAA,OAAA,QAAA,OAAA,MAAA,gBAF8F,sBAE9F,GAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECwDJ,MAAM,QAAQ;EAEd,MAAM,gBAAgB,OAA0C,gBAAgB;EAEhF,MAAM,4BAA4B,4CAA4C,QAAQ,QACnF,oCAA0D,SAAS,IAAI,MAAM,CAC/E;EAED,MAAM,uBAAuB,IAAI,MAAM;EACvC,MAAM,EAAE,QAAQ,iBAAiB,aAC9B,KAAK,UAAuC,IAAI,eAAe,kBAAkB,MAAM,EACxF,EAAE,YAAY,sBAAsB,CACrC;EAED,MAAM,sBAAsB,eAAe;GACzC,MAAM,IAAI,MAAM;AAChB,OAAI,CAAC,EAAE,gBAAiB,QAAO;AAC/B,OAAI,CAAC,CAAC,YAAY,WAAW,CAAC,SAAS,EAAE,gBAAgB,CAAE,QAAO;GAClE,MAAM,KAAK,EAAE;AACb,OAAI,OAAO,cAAc,OAAO,YAAa,QAAO;AACpD,UAAO;IACP;EAEF,MAAM,iCAAiC,eAAe;GACpD,MAAM,KAAK,MAAM,OAAO;AACxB,OAAI,MAAO,oCAA0D,SAAS,GAAG,CAAE,QAAO;AAC1F,UAAO;IACP;EAEF,eAAe,yBAAyB,iBAAwC;AAC9E,OAAI,CAAE,oCAA0D,SAAS,gBAAgB,CAAE;AAC3F,OAAI,CAAC,cAAe;GACpB,MAAM,IAAI,MAAM;AAChB,wBAAqB,QAAQ;AAC7B,OAAI;IACF,MAAM,WACJ,OAAO,EAAE,aAAa,WAClB,EAAE,WACF,8BAA8B,EAAE,SAAmD;AACzF,UAAM,aAAa;KACjB,IAAI,EAAE;KACN,OAAO,EAAE;KACT,MAAM,EAAE;KACR;KACA,eAAe;KAChB,CAAC;AACF,UAAM,eAAe;aACb;AACR,yBAAqB,QAAQ;;;EAIjC,MAAM,kBAAkB,eAAe;GACrC,MAAM,aAAa,MAAM,QAAQ;AACjC,OAAI,CAAC,WAAY,QAAO;AACxB,UAAO,MAAM,OAAO,4BAA4B;IAChD;EAEF,MAAM,kBAAkB,eACtB,sBACE,MAAM,OAAO,YACb,MAAM,OAAO,mBACb,MAAM,OAAO,GACd,CACF;EAED,MAAM,mBAAmB,eAAe;GACtC,MAAM,KAAK,MAAM,OAAO;AACxB,UAAO,KAAK,iBAAiB,GAAG,CAAC,YAAY;IAC7C;EACF,MAAM,kBAAkB,eAAe;GACrC,MAAM,KAAK,MAAM,OAAO;AACxB,UAAO,KAAK,iBAAiB,GAAG,CAAC,WAAW;IAC5C;EAEF,MAAM,iBAAiB,eACrB,MAAM,OAAO,WAAW,iBAAiB,MAAM,OAAO,SAAU,CAAC,YAAY,GAC9E;EACD,MAAM,gBAAgB,eACpB,MAAM,OAAO,WAAW,iBAAiB,MAAM,OAAO,SAAU,CAAC,WAAW,GAC7E;EAED,MAAM,kBAAkB,eACtB,MAAM,OAAO,YAAY,iBAAiB,MAAM,OAAO,UAAW,CAAC,YAAY,GAChF;EACD,MAAM,iBAAiB,eACrB,MAAM,OAAO,YAAY,iBAAiB,MAAM,OAAO,UAAW,CAAC,WAAW,GAC/E;EAED,MAAM,qBAAqB,eACzB,MAAM,OAAO,eAAe,iBAAiB,MAAM,OAAO,aAAc,CAAC,YAAY,GACtF;EACD,MAAM,oBAAoB,eACxB,MAAM,OAAO,eAAe,iBAAiB,MAAM,OAAO,aAAc,CAAC,WAAW,GACrF;EAED,MAAM,kBAAkB,eAAe;AACrC,OAAI,CAAC,MAAM,OAAO,aAAa,MAAM,OAAO,aAAc,QAAO;AACjE,UAAO,IAAI,KAAK,MAAM,OAAO,UAAU,mBAAG,IAAI,MAAM,IAAI,CAAC,MAAM,OAAO;IACtE;EAEF,MAAM,gBAAgB,eACpB,uBAAuB,MAAM,OAAO,cAAc,MAAM,OAAO,gBAAgB,CAChF;;uBAzPC,mBAsHM,OAtHN,cAsHM,CArHJ,mBAiGM,OAjGN,cAiGM;IAhGJ,YAKgB,uBAAA,EALD,OAAM,UAAQ,EAAA;4BAIzB,CAHF,YAGE,oCAAA;MAFC,mBAAiB,QAAA,OAAO;MACzB,MAAK;;;;IAGT,YAsBgB,uBAAA,EAtBD,OAAM,iBAAe,EAAA;4BAezB,CAbD,oBAAA,SAAA,WAAA,EADR,mBAcS,UAAA;;MAZN,OAAO,+BAAA;MACR,OAAM;MACL,UAAU,qBAAA;MACV,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,yBAA0B,OAAO,OAA6B,MAAK;2BAE5E,mBAMS,UAAA,MAAA,WALO,MAAA,0BAAyB,GAAhC,QAAG;0BADZ,mBAMS,UAAA;OAJN,KAAK,IAAI;OACT,OAAO,IAAI;yBAET,IAAI,MAAK,EAAA,GAAA,aAAA;sCAIH,QAAA,OAAO,iBAAA,WAAA,EADpB,YAIE,wCAAA;;MAFC,iBAAe,QAAA,OAAO;MACvB,MAAK;qDAEP,mBAA2E,QAA3E,cAAyD,cAAW,EAAA,CAAA;;;IAEtE,YAEgB,uBAAA,EAFD,OAAM,QAAM,EAAA;4BAC+B,CAAxD,YAAwD,gCAAA;MAA/B,MAAM,QAAA,OAAO;MAAM,MAAK;;;;IAEnD,YAEgB,uBAAA,EAFD,OAAM,YAAU,EAAA;4BACuC,CAApE,YAAoE,oCAAA;MAAvC,UAAU,QAAA,OAAO;MAAU,MAAK;;;;IAE/D,YAGgB,uBAAA,EAHD,OAAM,YAAU,EAAA;4BAC4B,CAA7C,gBAAA,SAAA,WAAA,EAAZ,mBAAyD,QAAA,cAAA,gBAAzB,gBAAA,MAAe,EAAA,EAAA,KAAA,WAAA,EAC/C,mBAA0E,QAA1E,cAAyD,aAAU,EAAA,CAAA;;;IAErE,YAEgB,uBAAA,EAFD,OAAM,aAAW,EAAA;4BACM,CAAA,gCAAjC,QAAA,OAAO,wBAAuB,EAAA,EAAA,CAAA,CAAA;;;IAEnC,mBASM,OATN,cASM,CARJ,YAOgB,uBAAA,EAPD,OAAM,eAAa,EAAA;KAIrB,OAAK,cACkE,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAhF,mBAAgF,QAAA,EAA1E,OAAM,uCAAqC,EAAC,2BAAuB,GAAA,CAAA,EAAA,CAAA;4BAFvE,CAFK,QAAA,OAAO,aAAa,MAAI,IAAA,WAAA,EAAjC,mBAEI,KAFJ,cAEI,gBADC,QAAA,OAAO,YAAW,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA;;;IAO3B,YAEgB,uBAAA;KAFD,OAAM;KAAa,UAAU;;4BACrB,CAAA,gCAAlB,gBAAA,MAAe,EAAA,EAAA,CAAA,CAAA;;;IAEpB,YAGgB,uBAAA,EAHD,OAAM,WAAS,EAAA;4BACN,CAAA,gCAAnB,iBAAA,MAAgB,GAAG,KACtB,EAAA,EAAY,gBAAA,SAAA,WAAA,EAAZ,mBAAwF,QAAxF,eAA0D,OAAE,gBAAG,gBAAA,MAAe,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA;;;IAEhF,YAMgB,uBAAA,EAND,OAAM,WAAS,EAAA;4BAIjB,CAHK,QAAA,OAAO,YAAA,WAAA,EAAvB,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gCAFN,eAAA,MAAc,GAAG,KACpB,EAAA,EAAA,mBAA+D,QAA/D,eAAmC,OAAE,gBAAG,cAAA,MAAa,EAAA,EAAA,CAAA,uBAEvD,mBAAuE,QAAvE,eAAyD,UAAO,EAAA,CAAA;;;IAElE,YAQgB,uBAAA,EARD,OAAM,UAAQ,EAAA;KAKhB,OAAK,cACkD,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAhE,mBAAgE,QAAA,EAA1D,OAAM,uCAAqC,EAAC,WAAO,GAAA,CAAA,EAAA,CAAA;4BAFpD,CAHK,QAAA,OAAO,aAAA,WAAA,EAAnB,mBAGO,QAAA;;MAHwB,OAAK,eAAA,EAAA,cAAkB,gBAAA,OAAe,CAAA;yCAChE,gBAAA,MAAe,GAAG,KACrB,EAAA,EAAA,mBAAgE,QAAhE,eAAmC,OAAE,gBAAG,eAAA,MAAc,EAAA,EAAA,CAAA;;;IAM1D,YAQgB,uBAAA,EARD,OAAM,aAAW,EAAA;KAKnB,OAAK,cACkD,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAhE,mBAAgE,QAAA,EAA1D,OAAM,uCAAqC,EAAC,WAAO,GAAA,CAAA,EAAA,CAAA;4BAFhD,CAHK,QAAA,OAAO,gBAAA,WAAA,EAAvB,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gCAFN,mBAAA,MAAkB,GAAG,KACxB,EAAA,EAAA,mBAAmE,QAAnE,eAAmC,OAAE,gBAAG,kBAAA,MAAiB,EAAA,EAAA,CAAA;;;IAM7D,YAKgB,uBAAA,EALD,OAAM,WAAS,EAAA;4BAIrB,CAHP,mBAGO,QAHP,eAGO,CAFO,QAAA,OAAO,aAAA,WAAA,EAAnB,mBAA0D,QAA1D,eAAiD,KAAE,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAO,MAC1D,gBAAG,cAAA,MAAa,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA;;;IAGpB,YAKgB,uBAAA,EALD,OAAM,mBAAiB,EAAA;KAEzB,OAAK,cACkD,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAhE,mBAAgE,QAAA,EAA1D,OAAM,uCAAqC,EAAC,WAAO,GAAA,CAAA,EAAA,CAAA;4BAF4B,CAAvE,QAAA,OAAO,iBAAiB,MAAI,IAAA,WAAA,EAA5C,mBAAuF,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gCAApC,QAAA,OAAO,gBAAe,EAAA,EAAA,CAAA;;;QAMjE,QAAA,OAAO,eAAA,WAAA,EAAnB,mBAkBM,OAlBN,eAkBM,CAjBJ,mBAgBS,UAAA;IAhBD,MAAK;IAAS,OAAM;IAAc,SAAK,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,OAAA;qCACpD,mBAaM,OAAA;IAZJ,OAAM;IACN,MAAK;IACL,SAAQ;IACR,gBAAa;IACb,QAAO;IACP,OAAM;OAEN,mBAIE,QAAA;IAHA,kBAAe;IACf,mBAAgB;IAChB,GAAE;6BAEA,UAER,GAAA,CAAA,EAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA;;;;;;;;AC5GN,MAAa,oCAAoC,aAC/C,gCACA,6BACA;CACE,OAAO;EACL,OAAO;EACP,aAAa;EACd;CACD,aAAa;EACX,OAAO;EACP,WAAW;EACX,aAAa;EACd;CACD,MAAM,EAAE,OAAO,QAAQ;CACvB,UAAU;EACR,OAAO;EACP,WAAW;EACX,cAAc;EACd,WAAW;EACZ;CACD,eAAe,EAAE,OAAO,yBAAyB;CACjD,cAAc;EACZ,OAAO;EACP,WAAW;EACX,MAAM;EACN,aAAa;EACd;CACD,iBAAiB;EACf,OAAO;EACP,WAAW;EACX,MAAM;EACN,aAAa;EACd;CACD,UAAU;EACR,OAAO;EACP,WAAW;EACZ;CACD,WAAW;EACT,OAAO;EACP,WAAW;EACZ;CACD,cAAc;EACZ,OAAO;EACP,WAAW;EACZ;CACF,CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC4ED,MAAM,QAAQ;EAEd,MAAM,aAAa,IAAI,MAAM,OAAO,eAAe,GAAG;AACtD,cACQ,MAAM,OAAO,cAClB,MAAM;AACL,cAAW,QAAQ,KAAK;IAE3B;EAED,MAAM,EAAE,MAAM,gBAAgB,UAAU,QAAQ,IAAI,MAAM,gBAAgB,EAAE;GAC1E,UAAU;GACV,WAAW,OAAU;GACtB,CAAC;EAEF,MAAM,OAAO;EAKb,MAAM,EAAE,QAAQ,cAAc,SAAS,aAAa,aACjD,KAAK,UAAuC,IAAI,eAAe,kBAAkB,MAAM,EACxF,EAAE,YAAY,sBAAsB,CACrC;EAED,MAAM,SAAS,eAAe,MAAM,UAAU,SAAS,MAAM;EAE7D,SAAS,mBAAmB,YAAsD;AAChF,OAAI,CAAC,WAAY,QAAO;AACxB,OAAI;AAIF,WAHa,IAAI,KAAK,WAAW,CACV,aAAa,CACT,MAAM,IAAI,CAAC,MACnB;WACb;AACN,WAAO;;;EAIX,SAAS,oBAAoB,YAAsD;AACjF,OAAI,CAAC,cAAc,WAAW,MAAM,KAAK,GAAI,QAAO;AACpD,OAAI;IACF,MAAM,uBAAO,IAAI,KAAK,aAAa,YAAY;AAC/C,QAAI,MAAM,KAAK,SAAS,CAAC,CAAE,QAAO;AAClC,WAAO,KAAK,aAAa;WACnB;AACN,WAAO;;;EAIX,MAAM,EAAE,MAAM,OAAO,WAAW,mBAAmB,2BAA2B,QAC5E,mCACA;GACE,WAAW,4BAA4B,MAAM,OAAO;GACpD,uBAAuB;GACvB,aAAa;GACb,WAAW,YAAY;IACrB,MAAM,IAAI,MAAM;IAWhB,MAAM,eACJ,EAAE,iBAXsB;KACxB;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACD,CAGmB,SAAS,EAAE,cAAmD,GAC3E,EAAE,gBACH;AACN,WAAO;KACL,IAAI,EAAE;KACN,OAAO,EAAE,SAAS;KAClB,aAAa,EAAE,eAAe;KAC9B,MAAM,EAAE;KACR,UAAU,8BAA8B,EAAE,SAAS;KACnD,eAAe;KACf,cAAc,EAAE,cAAc,MAAM,IAAI;KACxC,iBAAiB,EAAE,iBAAiB,MAAM,IAAI;KAC9C,UAAU,mBAAmB,EAAE,SAAS,IAAI;KAC5C,WAAW,mBAAmB,EAAE,UAAU,IAAI;KAC9C,cAAc,mBAAmB,EAAE,aAAa,IAAI;KACrD;;GAEJ,CACF;EAED,SAAS,aAAa,UAAgE;GACpF,MAAM,IAAI,MAAM;GAChB,MAAMC,UAAuC;IAC3C,IAAI,EAAE;IACN,OAAO,OAAO,SAAS,SAAS,GAAG,CAAC,MAAM;IAC1C,aAAc,SAAS,eAA0B;IACjD,MAAM,SAAS;IACf,UAAU,SAAS;IACpB;AAED,OACE,CAAC,YAAY,WAAW,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAC1D,EAAE,kBAAkB,cACpB,EAAE,kBAAkB,aACpB;IACA,MAAM,KAAK,SAAS;AACpB,QACE,OAAO,QACP,OAAO,UACP,OAAO,aACP,OAAO,cACP,OAAO,YAEP,SAAQ,gBAAgB;;AAI5B,OAAI,EAAE,oBAAoB,WAAW;IACnC,MAAM,KAAK,SAAS;AACpB,QAAI,MAAM,QAAQ,OAAO,GACvB,SAAQ,eAAe,OAAO,GAAG,CAAC,MAAM;;AAI5C,OAAI,EAAE,kBAAkB,YAAY;IAClC,MAAM,KAAK,SAAS;AACpB,QAAI,MAAM,QAAQ,OAAO,GACvB,SAAQ,kBAAkB,OAAO,GAAG,CAAC,MAAM;;AAI/C,OACE;IAAC;IAAW;IAAY;IAAW,CAAC,SAAS,EAAE,mBAAmB,GAAG,IACrE,EAAE,kBAAkB,eACpB,EAAE,kBAAkB,YACpB;IACA,MAAM,UAAU,oBAAoB,SAAS,SAA0B;AACvE,QAAI,YAAY,KAAM,SAAQ,WAAW;IACzC,MAAM,WAAW,oBAAoB,SAAS,UAA2B;AACzE,QAAI,aAAa,KAAM,SAAQ,YAAY;;AAG7C,OAAI,EAAE,kBAAkB,cAAc,EAAE,kBAAkB,aAAa;IACrE,MAAM,cAAc,oBAAoB,SAAS,aAA8B;AAC/E,QAAI,gBAAgB,KAAM,SAAQ,eAAe;;AAGnD,WAAQ,cAAc,WAAW,SAAS;AAE1C,UAAO;;EAGT,eAAe,aAAa,UAAmC;AAE7D,SAAM,aADU,aAAa,SAAS,CACX;;EAI7B,SAAS,gBAAgB;AACvB,QAAK,UAAU;;EAGjB,SAAS,YAAY,OAAwB;GAC3C,MAAM,UAAU,uBAAuB,OAAO,0BAA0B;AACxE,QAAK,eAAe,QAAQ;;EAG9B,SAAS,eAAe;AACtB,QAAK,SAAS;;;uBA1Sd,YA4GY,MAAA,UAAA,EAAA;IA3GT,gBAAe;IACf,WAAS;IACT,SAAO;IACR,OAAM;IACN,UAAS;;2BAyFH;KAvFN,mBAuFM,OAvFN,cAuFM;MAtFJ,mBAAA,uBAA2B;MAC3B,mBAEM,OAFN,cAEM,CADJ,YAAqD,MAAA,MAAA,CAAA,YAAA,EAAnC,aAAY,sBAAoB,CAAA,CAAA,CAAA;MAGpD,mBAAA,6BAAiC;MACjC,mBAEM,OAFN,cAEM,CADJ,YAAqF,MAAA,MAAA,CAAA,kBAAA;OAA7D,OAAM;OAAS,aAAY;;MAGrD,mBAAA,SAAa;MACb,mBAEM,OAFN,cAEM,CADJ,YAAmB,MAAA,MAAA,CAAA,UAAA,CAAA,CAAA;MAGrB,mBAAA,sCAA0C;OAC9B,QAAA,OAAO,eAAA,WAAA,EAAnB,mBAUM,OAVN,cAUM,CAAA,OAAA,OAAA,OAAA,KATJ,mBAEQ,SAAA,EAFD,OAAM,SAAO,EAAA,CAClB,mBAAwC,QAAA,EAAlC,OAAM,cAAY,EAAC,WAAQ,CAAA,uBAEnC,mBAKS,UAAA;oEALQ,WAAU,QAAA;OAAE,OAAM;OAAiC,UAAU,OAAA;oCAC5E,mBAAoC,UAAA,EAA5B,OAAM,IAAE,EAAC,cAAU,GAAA,IAAA,UAAA,KAAA,EAC3B,mBAES,UAAA,MAAA,WAFW,MAAA,YAAW,IAAA,EAAA,GAAhB,MAAC;2BAAhB,mBAES,UAAA;QAF+B,KAAK,EAAE;QAAK,OAAO,EAAE;0BACxD,EAAE,MAAK,EAAA,GAAA,aAAA;oDAHG,WAAA,MAAU,CAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAQ7B,mBAAA,aAAiB;MACjB,mBAEM,OAFN,cAEM,CADJ,YAAuB,MAAA,MAAA,CAAA,cAAA,CAAA,CAAA;MAGzB,mBAAA,0FAA8F;+BAElD,SAAS,QAAA,OAAO,mBAAe,GAAA,IAAqB,QAAA,OAAO,kBAAa,cAA6B,QAAA,OAAO,kBAAa,eAAA,WAAA,EADrK,mBASM,OATN,cASM,CADJ,YAA2B,MAAA,MAAA,CAAA,kBAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAG7B,mBAAA,8CAAkD;MACvC,QAAA,OAAO,oBAAe,aAAA,WAAA,EAAjC,mBAEM,OAFN,eAEM,CADJ,YAA6C,MAAA,MAAA,CAAA,kBAAA,EAArB,aAAY,QAAM,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAG5C,mBAAA,kDAAsD;MAC3C,QAAA,OAAO,kBAAa,cAAA,WAAA,EAA/B,mBAEM,OAFN,eAEM,CADJ,YAAgD,MAAA,MAAA,CAAA,qBAAA,EAArB,aAAY,QAAM,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAG/C,mBAAA,gFAAoF;;;;;QAE7B,SAAS,QAAA,OAAO,mBAAe,GAAA,IAAqB,QAAA,OAAO,kBAAa,eAA8B,QAAA,OAAO,kBAAa,cAAA,WAAA,EADjL,mBASM,OATN,eASM,CADJ,YAAmD,MAAA,MAAA,CAAA,cAAA,EAA9B,WAAW,MAAA,gBAAe,EAAA,EAAA,MAAA,GAAA,CAAA,YAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAGjD,mBAAA,iFAAqF;;;;;QAE9B,SAAS,QAAA,OAAO,mBAAe,GAAA,IAAqB,QAAA,OAAO,kBAAa,eAA8B,QAAA,OAAO,kBAAa,cAAA,WAAA,EADjL,mBASM,OATN,eASM,CADJ,YAAoD,MAAA,MAAA,CAAA,eAAA,EAA9B,WAAW,MAAA,gBAAe,EAAA,EAAA,MAAA,GAAA,CAAA,YAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAGlD,mBAAA,4DAAgE;MAExD,QAAA,OAAO,kBAAa,cAAmB,QAAA,OAAO,kBAAa,eAAA,WAAA,EADnE,mBAKM,OALN,eAKM,CADJ,YAAuD,MAAA,MAAA,CAAA,kBAAA,EAA9B,WAAW,MAAA,gBAAe,EAAA,EAAA,MAAA,GAAA,CAAA,YAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;;KAI5C,MAAA,KAAI,CAAC,eAAA,WAAA,EAAhB,mBAEM,OAFN,eAEM,CADJ,mBAAmD,QAAnD,eAAmD,gBAA1B,MAAA,KAAI,CAAC,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;KAE3C,YAAmE,MAAA,uBAAA,EAAA,EAA3C,OAAM,oCAAkC,CAAA;KAEhE,mBAAA,mBAAuB;KACvB,mBAKM,OALN,eAKM,CAJJ,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAAiB,SAAO;MAAe,UAAU,OAAA;QAAQ,YAErF,GAAA,cAAA,EACA,YAAkE,MAAA,kBAAA,EAAA;MAA/C,YAAW;MAAO,gBAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;ECvC1D,MAAM,QAAQ;EAEd,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,WAAW;EAE1B,MAAM,oBAAoB,eAAwC;AAChE,UAAO,MAAM,MAAM,aAAa,aAAa,aAAa;IAC1D;EAEF,SAAS,oBAAoB,OAAgC;AAC3D,UAAO,QAAQ;IACb,MAAM,MAAM;IACZ,OAAO;KACL,GAAG,MAAM;KACT,UAAU,UAAU,aAAa,aAAa;KAC/C;IACF,CAAC;;EAGJ,MAAM,eAAe,IAAmD,KAAK;EAO7E,MAAM,sBAAsB,eAA+B;GACzD,MAAMC,QAAwB,EAAE;AAEhC,QAAK,MAAM,QAAQ,MAAM,iBAAiB,EAAE,CAC1C,OAAM,KAAK;IACT,MAAM;IACN,WAAW,KAAK;IAChB,IAAI,iBAAiB,KAAK,UAAU,GAAG,KAAK;IAC5C,MAAM;IACP,CAAC;AAGJ,QAAK,MAAM,QAAQ,MAAM,iBAAiB,EAAE,CAC1C,OAAM,KAAK;IACT,MAAM;IACN,WAAW,KAAK;IAChB,IAAI,iBAAiB,KAAK,UAAU,GAAG,KAAK;IAC5C,MAAM;IACP,CAAC;AAGJ,QAAK,MAAM,SAAS,MAAM,gBAAgB,EAAE,CAC1C,OAAM,KAAK;IACT,MAAM;IACN,WAAW,MAAM;IACjB,IAAI,MAAM;IACV,MAAM;IACP,CAAC;AAGJ,SAAM,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC;AACvF,UAAO;IACP;EAEF,SAAS,aAAa;AACpB,gBAAa,OAAO,OAAO;;AAG7B,WAAa,EAAE,YAAY,CAAC;;uBAnI1B,mBAqCM,OArCN,cAqCM;IApCJ,YAOE,2BAAA;cANI;KAAJ,KAAI;KACH,oBAAkB;KAClB,UAAQ,CAAA,CAAI,QAAA,OAAO;KACnB,aAAW,kBAAA;KACX,aAAW,QAAA;KACX,qBAAkB;;;;;;IAGb,oBAAA,MAAoB,WAAM,KAAA,WAAA,EADlC,mBAKI,KALJ,cAGC,qBAED,IAAA,mBAAA,QAAA,KAAA;sBACA,mBAqBW,UAAA,MAAA,WArBc,oBAAA,QAAR,SAAI;6DAA+B,KAAK,IAAA,GAE/C,KAAK,SAAI,mBAAwB,KAAK,SAAI,mBAAA,WAAA,EADlD,YAOe,sBAAA;;MALZ,eAAa,KAAK,KAAK;MACvB,cAAY,KAAK,KAAK;MACtB,SAAS,KAAK,SAAI,kBAAA,aAAA;;6BAEO,CAAA,gCAAvB,KAAK,KAAK,QAAI,GAAA,EAAA,EAAA,CAAA,CAAA;;;;;;WAGN,KAAK,SAAI,kBAAA,WAAA,EADtB,YAWE,6BAAA;;MATC,QAAQ,KAAK,KAAK;MAClB,SAAS,KAAK,KAAK;MACnB,WAAW,KAAK,KAAK;MACrB,QAAQ,KAAK,KAAK;MAClB,MAAM,KAAK,KAAK;MAChB,SAAS,KAAK,KAAK;MACnB,aAAW,KAAK,KAAK;MACrB,aAAW,KAAK,KAAK;MACrB,SAAS,KAAK,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC0E5B,MAAM,QAAQ;EAEd,MAAM,WAAW,IAAI,MAAM;EAC3B,MAAM,iBAAiB,IAAI,GAAG;EAG9B,MAAM,EACJ,MAAM,iBACN,SAAS,oBACT,SAAS,uBACP,UACD,QAAQ,IAAI,eAAe,qBAAqB,MAAM,gBAAgB,EACvE;GACE,SAAS,eAAe,CAAC,CAAC,MAAM,gBAAgB;GAChD,UAAU,8BAA8B,MAAM;GAC/C,CACF;EAED,MAAM,cAAc,eAA0C;AAC5D,UAAO,gBAAgB,SAAS,EAAE;IAClC;EAGF,MAAM,EAAE,MAAM,cAAc,UAIzB,QAAQ,IAAI,MAAM,sBAAsB,EACzC,EAAE,WAAW,MAAU,KAAM,CAC9B;EAED,MAAM,iBAAiB,eAAe;GACpC,MAAM,QAAQ,UAAU,SAAS,EAAE;GACnC,MAAM,cAAc,IAAI,IAAI,YAAY,MAAM,KAAK,MAAM,EAAE,QAAQ,CAAC;AACpE,UAAO,MAAM,QAAQ,MAAM,CAAC,YAAY,IAAI,EAAE,GAAG,CAAC;IAClD;EAGF,MAAM,EAAE,QAAQ,eAAe,SAAS,iBAAiB,aAKtD,KAAK,UAAU,IAAI,eAAe,mBAAmB,MAAM,EAC5D,EAAE,YAAY,+BAA+B,CAC9C;EAGD,MAAM,EAAE,QAAQ,qBAAqB,aAKlC,KAAK,UAAU,IAAI,eAAe,sBAAsB,MAAM,EAC/D,EAAE,YAAY,+BAA+B,CAC9C;EAED,MAAM,kBAAkB,IAAmB,KAAK;EAEhD,eAAe,sBAAsB;AACnC,OAAI,CAAC,eAAe,MAAO;AAE3B,OAAI;AACF,UAAM,cAAc;KAClB,mBAAmB,MAAM;KACzB,SAAS,eAAe;KACzB,CAAC;AACF,UAAM,QAAQ,mBAAmB;AACjC,mBAAe,QAAQ;AACvB,UAAM,oBAAoB;YACnB,GAAG;AACV,UAAM,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;;;EAItE,eAAe,uBAAuB,cAAsB;AAC1D,OAAI;AACF,oBAAgB,QAAQ;AACxB,UAAM,iBAAiB;KACrB,iBAAiB,MAAM;KACvB;KACD,CAAC;AACF,UAAM,QAAQ,qBAAqB;AACnC,UAAM,oBAAoB;YACnB,GAAG;AACV,UAAM,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;aAC7D;AACR,oBAAgB,QAAQ;;;;UAnMf,QAAA,mBAAA,WAAA,EAAX,mBAyFM,OAzFN,cAyFM,CAxFJ,mBAuFM,OAvFN,cAuFM;mBAtFJ,mBAA4C,SAAA;KAArC,MAAK;kEAAoB,SAAQ,QAAA;qCAAR,SAAA,MAAQ,CAAA,CAAA;IACxC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAgBM,OAhBN,cAgBM,CAAA,OAAA,OAAA,OAAA,KAfJ,mBAaM,OAAA;KAZJ,OAAM;KACN,OAAM;KACN,MAAK;KACL,SAAQ;KACR,QAAO;QAEP,mBAKE,QAAA;KAJA,kBAAe;KACf,mBAAgB;KAChB,gBAAa;KACb,GAAE;eAGN,mBAAmD,QAAA,MAA7C,kBAAa,gBAAG,YAAA,MAAY,OAAM,GAAG,KAAC,EAAA,CAAA,CAAA,CAAA,CAAA;IAGhD,mBAiEM,OAjEN,cAiEM,CAhEJ,mBA+DM,OA/DN,cA+DM;KA9DJ,mBAAA,mBAAuB;MACX,QAAA,UAAA,WAAA,EAAZ,mBA4BM,OA5BN,cA4BM,CA3BJ,mBAkBM,OAlBN,cAkBM,CAAA,OAAA,OAAA,OAAA,KAjBJ,mBAEQ,SAAA,EAFD,OAAM,cAAY,EAAA,CACvB,mBAAsD,QAAA,EAAhD,OAAM,sBAAoB,EAAC,iBAAc,CAAA,uBAEjD,mBAaS,UAAA;mEAZE,eAAc,QAAA;MACvB,OAAM;MACL,UAAU,MAAA,aAAY;mCAEvB,mBAAwC,UAAA,EAAhC,OAAM,IAAE,EAAC,kBAAc,GAAA,IAAA,UAAA,KAAA,EAC/B,mBAMS,UAAA,MAAA,WALQ,eAAA,QAAR,SAAI;0BADb,mBAMS,UAAA;OAJN,KAAK,KAAK;OACV,OAAO,KAAK;yBAEV,KAAK,MAAK,EAAA,GAAA,cAAA;mDAVN,eAAA,MAAc,CAAA,CAAA,CAAA,CAAA,EAc3B,mBAOS,UAAA;MANP,OAAM;MACL,UAAQ,CAAG,eAAA,SAAkB,MAAA,aAAY;MACzC,SAAO;SAEI,MAAA,aAAY,IAAA,WAAA,EAAxB,mBAA4E,QAA5E,cAA4E,KAAA,WAAA,EAC5E,mBAAuB,QAAA,eAAV,MAAG,EAAA,EAAA,GAAA,cAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;KAIpB,mBAAA,oBAAwB;KACb,MAAA,mBAAkB,IAAA,WAAA,EAA7B,mBAEM,OAFN,eAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAEnC,YAAA,MAAY,WAAM,KAAA,WAAA,EAAjC,mBAEK,MAFL,eAAqF,uBAErF,KAAA,WAAA,EACA,mBAuBK,MAvBL,eAuBK,EAAA,UAAA,KAAA,EAtBH,mBAqBK,UAAA,MAAA,WApBW,YAAA,QAAP,QAAG;0BADZ,mBAqBK,MAAA;OAnBF,KAAK,IAAI;OACV,OAAM;UAEN,mBAEO,QAFP,eAEO,gBADF,IAAI,wBAAwB,IAAI,QAAO,EAAA,EAAA,EAAA,CAGnC,QAAA,UAAA,WAAA,EADT,mBAYS,UAAA;;OAVP,MAAK;OACL,OAAM;OACN,cAAW;OACV,UAAK,WAAE,uBAAuB,IAAI,GAAE;OACpC,UAAU,gBAAA,UAAoB,IAAI;UAEvB,gBAAA,UAAoB,IAAI,MAAA,WAAA,EAApC,mBAA0F,QAA1F,cAA0F,KAAA,WAAA,EAC1F,mBAEM,OAFN,eAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAiG,QAAA;OAA3F,kBAAe;OAAQ,mBAAgB;OAAQ,gBAAa;OAAI,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC6I1F,MAAM,QAAQ;EAEd,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,WAAW;EAC1B,MAAM,oBAAoB,MAAM,OAAO;EAEvC,MAAM,qBAAqB,IAAI,MAAM;EACrC,MAAM,oBAAoB,IAAI,MAAM;EACpC,MAAM,oBAAoB,IAAI,MAAM;EACpC,MAAM,+BAA+B,IAAI,MAAM;EAC/C,MAAM,sBAAsB,IAAI,MAAM;EACtC,MAAM,qBAAqB,IAAI,MAAM;EACrC,MAAM,cAAc,IAA8B,KAAK;EACvD,MAAM,eAAe,IAAI,GAAG;EAC5B,MAAM,cAAc,IAAmB,KAAK;EAG5C,MAAM,aAAa,eAAe,MAAM,MAAM,SAAS,OAAO;EAG9D,MAAM,gBAAgB,OAA0C,gBAAgB;EAGhF,MAAM,EAAE,MAAM,cAAc,SAAS,oBAAoB,SACvD,OAAO,QAAQ;GACb,MAAM,CAAC,eAAe,eAAe,kBAAkB,MAAM,QAAQ,IAAI;IACvE,IAAI,MAAM,SAAS;KACjB,WAAW;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAmB;KACnE,aAAa;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAkB;KACpE,aAAa;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAO;KACzD,OAAO;KACP,QAAQ;KACR,eAAe;KAChB,CAAC;IACF,IAAI,MAAM,SAAS;KACjB,WAAW;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAmB;KACnE,aAAa;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAkB;KACpE,aAAa;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAM;KACxD,OAAO;KACP,QAAQ;KACR,eAAe;KAChB,CAAC;IACF,IAAI,eAAe,4BACjB,mBACA,YAAY,gBACZ;KACE,cAAc,CAAC,YAAY,gBAAgB,YAAY,wBAAwB;KAC/E,OAAO;KACP,QAAQ;KACR,eAAe;KAChB,CACF;IACF,CAAC;AACF,UAAO;IAAE;IAAe;IAAe;IAAgB;KAEzD;GACE,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,MAAM;GACxC,WAAW,WAAW;GACtB,gBAAgB;GACjB,CACF;EASD,MAAM,2BAA2B,eAAkC;AAEjE,WADc,aAAa,OAAO,eAAe,SAAS,EAAE,EAC/C,KAAK,OAAO;IACvB,YAAY,EAAE,2BAA2B,EAAE,cAAc;IACzD,WAAW,EAAE;IACb,MAAM,EAAE,QAAQ;IACjB,EAAE;IACH;EAEF,MAAM,2BAA2B,eAAkC;AAEjE,WADc,aAAa,OAAO,eAAe,SAAS,EAAE,EAC/C,KAAK,OAAO;IACvB,YAAY,EAAE,2BAA2B,EAAE,cAAc;IACzD,WAAW,EAAE;IACb,MAAM,EAAE,QAAQ;IACjB,EAAE;IACH;EAGF,MAAM,0BAA0B,eAAe;GAC7C,MAAM,OAAO,aAAa,OAAO;GACjC,MAAM,WAAW,MAAM,SAAS,EAAE;GAClC,MAAM,iBAAiB,MAAM;AAE7B,UAAO,oBAAoB,UADR,iBAAiB,IAAI,IAAI,OAAO,QAAQ,eAAe,CAAC,GAAG,OAC9B;IAChD;EAGF,MAAM,EAAE,QAAQ,eAAe,aAC5B,KAAK,UAAyB,IAAI,MAAM,WAAW,MAAM,EAC1D,EAAE,YAAY,YAAY,CAC3B;EAGD,MAAM,EAAE,QAAQ,qBAAqB,SAAS,gBAAgB,aAC3D,KAAK,UAA0B,IAAI,eAAe,aAAa,MAAM,EACtE,EAAE,YAAY,sBAAsB,CACrC;EAGD,eAAe,cAAc,SAG1B;AACD,OAAI;AACF,UAAM,WAAW;KACf,WAAW;KACX,aAAa;KACb,MAAM,QAAQ;KACd,KAAK;KACL,aAAa,QAAQ,aAAa;KACnC,CAAC;AACF,UAAM,iBAAiB;AACvB,UAAM,QAAQ,QAAQ,aAAa,aAAa,wBAAwB,aAAa;WAC/E;AACN,UAAM,MAAM,qBAAqB;AACjC,UAAM,IAAI,MAAM,qBAAqB;;;EAKzC,SAAS,mBAAmB;AAC1B,OAAI,CAAC,MAAM,OAAQ;AACnB,sBAAmB,QAAQ;;EAI7B,SAAS,kBAAkB;AACzB,OAAI,CAAC,MAAM,OAAQ;AACnB,qBAAkB,QAAQ;;EAI5B,SAAS,kBAAkB;AACzB,OAAI,CAAC,MAAM,OAAQ;AACnB,qBAAkB,QAAQ;;EAI5B,SAAS,6BAA6B;AACpC,OAAI,CAAC,MAAM,OAAQ;AACnB,gCAA6B,QAAQ;;EAIvC,SAAS,oBAAoB;AAC3B,OAAI,CAAC,MAAM,OAAQ;AACnB,uBAAoB,QAAQ;;EAG9B,SAAS,mBAAmB;AAC1B,OAAI,CAAC,MAAM,OAAQ;AACnB,sBAAmB,QAAQ;;EAI7B,SAAS,sBAAsB;AAC7B,UAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;;EAIjD,SAAS,kBAAkB;AACzB,gBAAa,QAAQ;AACrB,eAAY,QAAQ;AACpB,eAAY,OAAO,WAAW;;EAIhC,SAAS,mBAAmB;AAC1B,eAAY,OAAO,OAAO;AAC1B,gBAAa,QAAQ;AACrB,eAAY,QAAQ;;EAItB,eAAe,uBAAuB;AACpC,SAAM,oBAAoB;;EAI5B,eAAe,yBAAyB;AACtC,OAAI,CAAC,MAAM,OAAQ;AACnB,eAAY,QAAQ;AAEpB,OAAI;IACF,MAAM,gBAAgB,aAAa,MAAM,MAAM;AAG/C,QAAI,cACF,OAAM,WAAW;KACf,WAAW,MAAM,OAAO;KACxB,aAAa;KACb,MAAM;KACN,KAAK;KACL,aAAa;KACd,CAAC;AAIJ,UAAM,oBAAoB,EAAE,IAAI,MAAM,OAAO,IAAI,CAAC;AAClD,UAAM,KAAK,2BAA2B;AACtC,sBAAkB;AAClB,UAAM,oBAAoB;YACnB,GAAG;IACV,MAAM,eAAe,uBAAuB,GAAG,0BAA0B;AACzE,gBAAY,QAAQ;AACpB,UAAM,MAAM,aAAa;;;EAK7B,eAAe,qBAAqB;AAElC,OAAI,cACF,OAAM,eAAe;AAGvB,SAAM,iBAAiB;;EAIzB,SAAS,gBAAgB;AACvB,UAAO,KAAK;IACV,MAAM,MAAM,QAAQ;IACpB,QAAQ,MAAM;IACd,OAAO;KAAE,GAAG,MAAM;KAAO,MAAM;KAAQ;IACxC,CAAC;;EAIJ,eAAe,eAAe;AAC5B,SAAM,OAAO,KAAK;IAChB,MAAM,MAAM,QAAQ;IACpB,QAAQ,MAAM;IACd,OAAO;KAAE,GAAG,MAAM;KAAO,MAAM;KAAW;IAC3C,CAAC;;EAIJ,eAAe,4BAA4B;AAEzC,SAAM,cAAc;AACpB,SAAM,UAAU;AAChB,SAAM,QAAQ,8BAA8B;AAE5C,OAAI,cACF,OAAM,eAAe;AAEvB,SAAM,iBAAiB;;;;2DA/dvB,mBAAA,wEAA4E,EACjE,QAAA,aAAS,CAAK,QAAA,UAAA,WAAA,EAAzB,mBAEM,OAFN,YAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAIlC,QAAA,SAAA,WAAA,EAAhB,mBAsBM,UAAA,EAAA,KAAA,GAAA,EAAA,CAvBN,mBAAA,gBAAoB,EACpB,mBAsBM,OAtBN,YAsBM,CAAA,OAAA,OAAA,OAAA,KArBJ,mBAYM,OAAA;IAXJ,OAAM;IACN,OAAM;IACN,MAAK;IACL,SAAQ;OAER,mBAKE,QAAA;IAJA,kBAAe;IACf,mBAAgB;IAChB,gBAAa;IACb,GAAE;cAGN,mBAOM,OAPN,YAOM,CANJ,mBAAuD,QAAA,MAAA,gBAA9C,QAAA,MAAM,WAAO,oBAAA,EAAA,EAAA,EACtB,mBAIM,OAJN,YAIM,CAHJ,YAEc,wBAAA;IAFA,IAAI,EAAA,MAAA,0BAAkC;IAAE,OAAM;;2BAE5D,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFgF,4BAEhF,GAAA,CAAA,EAAA,CAAA;;uBAMU,QAAA,UAAA,WAAA,EAAhB,mBA2JM,UAAA,EAAA,KAAA,GAAA,EAAA,CA5JN,mBAAA,iBAAqB,EACrB,mBA2JM,OA3JN,YA2JM;IA1JJ,mBAAA,WAAe;IACf,mBAIM,OAJN,YAIM,CAHJ,mBAEK,MAFL,YAEK,gBADA,QAAA,OAAO,MAAK,EAAA,EAAA,CAAA,CAAA;IAInB,mBAAA,sDAA0D;IAC1D,mBAWM,OAXN,YAWM,CAVJ,YASE,2BAAA;KARC,QAAQ,QAAA;KACR,WAAS;KACT,UAAQ;KACR,UAAQ;KACR,qBAAqB;KACrB,UAAQ;KACR,YAAU;KACV,WAAS;;IAId,mBAAA,kBAAsB;IACtB,YAKE,mCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,mBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,mBAAA,QAAkB;KACzB,WAAS;;IAGZ,mBAAA,iBAAqB;IACrB,YAKE,kCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,kBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,kBAAA,QAAiB;KACxB,WAAS;;IAGZ,mBAAA,iBAAqB;IACrB,YAKE,kCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,kBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,kBAAA,QAAiB;KACxB,WAAS;;IAGZ,mBAAA,8BAAkC;IAClC,YAKE,gCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,6BAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,6BAAA,QAA4B;KACnC,WAAS;;IAGZ,mBAAA,mBAAuB;IACvB,YAKE,oCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,oBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,oBAAA,QAAmB;KAC1B,WAAS;;IAGZ,mBAAA,kBAAsB;IACtB,YAKE,mCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,mBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,mBAAA,QAAkB;KACzB,WAAS;;IAGZ,mBAAA,6BAAiC;IACjC,mBAsCS,UAAA;cAtCG;KAAJ,KAAI;KAAc,OAAM;QAC9B,mBAiCM,OAjCN,YAiCM;iCAhCJ,mBAAgD,MAAA,EAA5C,OAAM,qBAAmB,EAAC,iBAAa,GAAA;iCAC3C,mBAEI,KAAA,EAFD,OAAM,qCAAmC,EAAC,yDAE7C,GAAA;KACA,mBAWM,OAXN,aAWM,CAAA,OAAA,QAAA,OAAA,MAVJ,mBAEQ,SAAA,EAFD,OAAM,SAAO,EAAA,CAClB,mBAAqE,QAAA,EAA/D,OAAM,kCAAgC,EAAC,oBAAiB,CAAA,uBAEhE,mBAMY,YAAA;mEALD,aAAY,QAAA;MACrB,OAAM;MACN,MAAK;MACL,aAAY;MACX,UAAU,MAAA,YAAW;6CAJb,aAAA,MAAY,CAAA,CAAA,CAAA,CAAA;KAOd,YAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,aAEM,CADJ,mBAA8C,QAA9C,aAA8C,gBAArB,YAAA,MAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;KAEtC,mBAYM,OAZN,aAYM,CAXJ,mBAES,UAAA;MAFD,OAAM;MAAiB,SAAO;MAAmB,UAAU,MAAA,YAAW;QAAE,YAEhF,GAAA,YAAA,EACA,mBAOS,UAAA;MANP,OAAM;MACL,SAAO;MACP,UAAU,MAAA,YAAW;SAEV,MAAA,YAAW,IAAA,WAAA,EAAvB,mBAAgF,QAAhF,YAAgF,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MAChF,gBAAG,MAAA,YAAW,GAAA,iBAAA,gBAAA,EAAA,EAAA,CAAA,EAAA,GAAA,YAAA,CAAA,CAAA;QAIpB,mBAEO,QAAA;KAFD,QAAO;KAAS,OAAM;QAC1B,mBAAgD,UAAA,EAAvC,SAAO,kBAAgB,EAAE,QAAK,CAAA,CAAA,CAAA;IAI3C,mBAAA,oCAAwC;IACxC,mBAQM,OARN,aAQM,CAAA,CAPsB,WAAA,SAAA,WAAA,EAA1B,YAA+E,2BAAA;;KAAxC,QAAQ,QAAA;KAAS,QAAM;6CAC9D,YAKE,+BAAA;;KAHC,QAAQ,QAAA;KACR,WAAS;KACT,UAAQ;;IAIb,mBAAA,mFAAuF;IACvF,mBAQM,OARN,aAQM,CAPJ,YAME,6CAAA;KALC,aAAW,QAAA,OAAO;KAClB,QAAM,CAAA,CAAI,QAAA,OAAO;KACjB,UAAQ,CAAG,QAAA,OAAO;KAClB,YAAU,MAAA,gBAAe;KACzB,WAAS,MAAA,gBAAe;;;;;;;;IAI7B,mBAAA,gBAAoB;IACpB,mBAKM,OALN,aAKM,CAJJ,YAGE,6CAAA;KAFC,qBAAmB,QAAA,OAAO;KAC1B,QAAM,CAAA,CAAI,QAAA,OAAO;;IAItB,mBAAA,yFAA6F;IAC7F,mBAYM,OAAA,MAAA,CAVI,MAAA,aAAY,IAAA,QAAA,WAAA,EADpB,YAOE,uBAAA;;KALC,QAAQ,QAAA;KACR,kBAAgB,yBAAA;KAChB,kBAAgB,yBAAA;KAChB,iBAAe,wBAAA;KACf,eAAa;;;;;;wBAEhB,mBAEM,OAFN,aAEM,CAAA,GAAA,OAAA,QAAA,OAAA,MAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,EAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"StaffSupportTicketDetailPage-DQdfh6H1.js","names":["$emit","payload: StaffSupportTicketUpdateDto","items: TimelineItem[]"],"sources":["../src/slices/support_ticket/staff/approveSupportTicketFormMetadata.ts","../src/slices/support_ticket/staff/components/ApproveSupportTicketModal.vue","../src/slices/support_ticket/staff/components/ArchiveSupportTicketModal.vue","../src/slices/support_ticket/staff/completeSupportTicketFormMetadata.ts","../src/slices/support_ticket/staff/components/CompleteSupportTicketModal.vue","../src/slices/support_ticket/staff/components/ConvertToInternalModal.vue","../src/slices/support_ticket/staff/components/DeleteSupportTicketModal.vue","../src/slices/support_ticket/staff/components/RevertSupportTicketModal.vue","../src/slices/support_ticket/staff/components/StaffActionBanner.vue","../src/slices/support_ticket/staff/components/StaffMetadataCard.vue","../src/slices/support_ticket/staff/staffMetadataCardEditFormMetadata.ts","../src/slices/support_ticket/staff/components/StaffMetadataCardEdit.vue","../src/slices/support_ticket/staff/components/StaffTimeline.vue","../src/slices/support_ticket/staff/components/SupportTicketSubscribersCollapsible.vue","../src/slices/support_ticket/staff/StaffSupportTicketDetailPage.vue"],"sourcesContent":["import { ApproveSupportTicketSchema } from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\n/**\n * Form schema reuses approve workflow schema (credit_value only).\n */\nconst ApproveSupportTicketFormSchema = ApproveSupportTicketSchema.pick({\n credit_value: true,\n});\nexport type ApproveSupportTicketFormDto = z.infer<typeof ApproveSupportTicketFormSchema>;\n\nexport const approveSupportTicketFormMetadata = withMetadata(\n ApproveSupportTicketFormSchema,\n 'approveSupportTicketForm',\n {\n credit_value: {\n label: 'Credit value to deduct',\n inputType: 'currency',\n step: 0.01,\n placeholder: '0.00',\n helpText: 'Enter the credit amount to deduct from the customer',\n },\n },\n);\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Approve Support Ticket?</h3>\n <p class=\"py-2 whitespace-pre-line text-sm text-base-content/80\">\n {{ approveModalIntro }}\n </p>\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.CreditValueField />\n <div v-if=\"form.submitError\" class=\"alert alert-error py-2 my-2\">\n <span class=\"text-sm\">{{ form.submitError }}</span>\n </div>\n <p class=\"py-2 text-sm text-base-content/70 whitespace-pre-line\">\n {{ approveModalFooter }}\n </p>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isApproving\"\n >\n Cancel\n </button>\n <ZiniaSubmitButton submitText=\"Approve & Deduct\" submittingText=\"Approving...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n </ZiniaForm>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { ApproveSupportTicketDto, StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { approveSupportTicketFormMetadata } from '../approveSupportTicketFormMetadata';\n\nconst APPROVE_MODAL_INTRO =\n `This will:\\n\\n` +\n `• Deduct credits from customer (amount set below)\\n` +\n `• Lock the support ticket item\\n` +\n `• Start development workflow\\n`;\n\nconst APPROVE_MODAL_FOOTER = `This action cannot be undone.`;\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst approveModalIntro = APPROVE_MODAL_INTRO;\nconst approveModalFooter = APPROVE_MODAL_FOOTER;\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaFormErrorsSummary,\n refreshFormData,\n} = useForm(approveSupportTicketFormMetadata, {\n storeName: 'approve-support-ticket-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n const raw = props.ticket?.credit_value?.trim();\n const credit_value = raw && raw !== '' ? raw : '0';\n return { credit_value };\n },\n});\n\nconst { mutate: approveSupportTicket, loading: isApproving } = useMutation(\n (api, input: ApproveSupportTicketDto) => api.supportTickets.approveTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n () => props.isOpen,\n (isOpen) => {\n if (isOpen) {\n refreshFormData();\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleSubmit(formData: { credit_value: string }) {\n if (!props.ticket) return;\n await approveSupportTicket({\n id: props.ticket.id,\n credit_value: formData.credit_value,\n });\n return undefined;\n}\n\nfunction handleSuccess() {\n close();\n toast.success(\n `Support Ticket approved! ${form.values.credit_value} credits deducted.`,\n );\n emit('success');\n}\n\nfunction handleError(error: Error | unknown) {\n const message = extractRpcErrorMessage(error, 'Failed to approve');\n form.setSubmitError(message);\n toast.error(message);\n}\n</script>\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">{{ isArchived ? 'Unarchive Support Ticket?' : 'Archive Support Ticket?' }}</h3>\n <p class=\"py-4 text-sm text-base-content/80\">\n <template v-if=\"isArchived\">\n This will unarchive the ticket. Comments, edits, and attachments will be unlocked for\n customer and staff.\n </template>\n <template v-else>\n This will archive the ticket. Once archived, no one (customer or staff) can add or edit\n comments, edit the ticket, or add/delete attachments.\n </template>\n </p>\n <div v-if=\"archiveError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ archiveError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isArchiving\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n :class=\"isArchived ? 'btn btn-primary' : 'btn btn-warning'\"\n @click=\"handleToggle\"\n :disabled=\"isArchiving\"\n >\n <span v-if=\"isArchiving\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isArchiving ? (isArchived ? 'Unarchiving...' : 'Archiving...') : (isArchived ? 'Unarchive' : 'Archive') }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst isArchived = computed(() => !!props.ticket?.archived_at);\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst archiveError = ref<string | null>(null);\n\nconst { mutate: archiveTicket, loading: isArchiving } = useMutation(\n (api, input: { id: string }) => api.supportTickets.archiveTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n () => props.isOpen,\n (isOpen) => {\n if (isOpen) {\n archiveError.value = null;\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleToggle() {\n if (!props.ticket) return;\n archiveError.value = null;\n\n try {\n await archiveTicket({ id: props.ticket.id });\n toast.success(isArchived.value ? 'Ticket unarchived' : 'Ticket archived');\n close();\n emit('success');\n } catch (e) {\n const message = extractRpcErrorMessage(e, isArchived.value ? 'Failed to unarchive' : 'Failed to archive');\n archiveError.value = message;\n toast.error(message);\n }\n}\n</script>\n","import { CompleteSupportTicketSchema } from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\nconst CompleteSupportTicketFormSchema = CompleteSupportTicketSchema.pick({\n delivered_value: true,\n});\nexport type CompleteSupportTicketFormDto = z.infer<typeof CompleteSupportTicketFormSchema>;\n\nexport const completeSupportTicketFormMetadata = withMetadata(\n CompleteSupportTicketFormSchema,\n 'completeSupportTicketForm',\n {\n delivered_value: {\n label: 'Actual Effort Delivered',\n inputType: 'currency',\n step: 0.01,\n placeholder: '100.00',\n helpText: 'How much effort did it actually take?',\n },\n },\n);\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Complete Support Ticket</h3>\n <p class=\"py-2 text-sm text-base-content/80\">\n Customer was charged\n <span class=\"font-semibold\">{{ creditDisplay }}</span>\n credits. Enter the actual effort delivered:\n </p>\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <zinia.DeliveredValueField placeholder=\"100.00\" />\n <div v-if=\"form.submitError\" class=\"alert alert-error py-2 my-2\">\n <span class=\"text-sm\">{{ form.submitError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isCompleting\"\n >\n Cancel\n </button>\n <ZiniaSubmitButton submitText=\"Mark as Completed\" submittingText=\"Completing...\" />\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n </ZiniaForm>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport type { CompleteSupportTicketDto, StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { formatStaffCreditValue } from '../../utils/creditValueFormatter';\nimport { completeSupportTicketFormMetadata } from '../completeSupportTicketFormMetadata';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\n\nconst creditDisplay = computed(() =>\n props.ticket\n ? formatStaffCreditValue(\n props.ticket.credit_value,\n props.ticket.approval_status,\n )\n : '0',\n);\n\nconst {\n form,\n zinia,\n ZiniaForm,\n ZiniaSubmitButton,\n ZiniaFormErrorsSummary,\n refreshFormData,\n} = useForm(completeSupportTicketFormMetadata, {\n storeName: 'complete-support-ticket-form',\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n const display = creditDisplay.value;\n const value = display === 'TBD' || display === 'N/A' ? '0.00' : display;\n return { delivered_value: value };\n },\n});\n\nconst { mutate: completeSupportTicket, loading: isCompleting } = useMutation(\n (api, input: CompleteSupportTicketDto) =>\n api.supportTickets.completeTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n () => props.isOpen,\n (isOpen) => {\n if (isOpen) {\n refreshFormData();\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleSubmit(formData: { delivered_value: string }) {\n if (!props.ticket) return;\n await completeSupportTicket({\n id: props.ticket.id,\n delivered_value: formData.delivered_value,\n });\n return undefined;\n}\n\nfunction handleSuccess() {\n close();\n toast.success('Support ticket marked as completed!');\n emit('success');\n}\n\nfunction handleError(error: Error | unknown) {\n const message = extractRpcErrorMessage(error, 'Failed to complete');\n form.setSubmitError(message);\n toast.error(message);\n}\n</script>\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Convert to Internal Task?</h3>\n <p class=\"py-4 whitespace-pre-line text-sm text-base-content/80\">\n {{ convertMessage }}\n </p>\n <div v-if=\"convertError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ convertError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isConverting\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n @click=\"handleConvert\"\n :disabled=\"isConverting\"\n >\n <span v-if=\"isConverting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isConverting ? 'Converting...' : 'Convert to Internal' }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst convertError = ref<string | null>(null);\nconst convertMessage = ref('');\n\nconst { mutate: convertToInternal, loading: isConverting } = useMutation(\n (api, id: string) => api.supportTickets.convertToInternal(id),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n [() => props.isOpen, () => props.ticket],\n ([isOpen, ticket]) => {\n if (isOpen && ticket) {\n const hasCredits =\n ticket.credit_value && parseFloat(ticket.credit_value) > 0;\n convertMessage.value =\n `This will:\\n\\n` +\n `• Change status to INTERNAL\\n` +\n `• Bypass customer approval workflow\\n` +\n (hasCredits ? `• Clear ${ticket.credit_value} credit estimate\\n` : '') +\n `• Set dev lifecycle to BACKLOG\\n` +\n `• Allow immediate development start\\n\\n` +\n `This change can be useful for converting customer ideas into internal improvements.`;\n convertError.value = null;\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleConvert() {\n if (!props.ticket) return;\n convertError.value = null;\n\n try {\n await convertToInternal(props.ticket.id);\n toast.success('Converted to internal task successfully');\n close();\n emit('success');\n } catch (e) {\n const message = extractRpcErrorMessage(e, 'Failed to convert');\n convertError.value = message;\n toast.error(message);\n }\n}\n</script>\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Delete Support Ticket?</h3>\n <p class=\"py-4 text-sm text-base-content/80\">\n This will soft-delete the ticket. It can be restored if needed. This action cannot be undone\n for approved tickets (you cannot delete approved tickets).\n </p>\n <div v-if=\"deleteError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ deleteError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isDeleting\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-error\"\n @click=\"handleDelete\"\n :disabled=\"isDeleting\"\n >\n <span v-if=\"isDeleting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isDeleting ? 'Deleting...' : 'Delete' }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst deleteError = ref<string | null>(null);\n\nconst { mutate: deleteTicket, loading: isDeleting } = useMutation(\n (api, id: string) => api.supportTickets.deleteTicket(id),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n () => props.isOpen,\n (isOpen) => {\n if (isOpen) {\n deleteError.value = null;\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleDelete() {\n if (!props.ticket) return;\n deleteError.value = null;\n\n try {\n await deleteTicket(props.ticket.id);\n toast.success('Ticket deleted');\n close();\n emit('success');\n } catch (e) {\n const message = extractRpcErrorMessage(e, 'Failed to delete');\n deleteError.value = message;\n toast.error(message);\n }\n}\n</script>\n","<template>\n <dialog ref=\"modalRef\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Revert Support Ticket to PENDING?</h3>\n <p class=\"py-4 whitespace-pre-line text-sm text-base-content/80\">\n {{ revertMessage }}\n </p>\n <div v-if=\"revertError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ revertError }}</span>\n </div>\n <div class=\"modal-action\">\n <button\n type=\"button\"\n class=\"btn btn-ghost\"\n @click=\"close\"\n :disabled=\"isReverting\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-warning\"\n @click=\"handleRevert\"\n :disabled=\"isReverting\"\n >\n <span v-if=\"isReverting\" class=\"loading loading-spinner loading-sm mr-2\"></span>\n {{ isReverting ? 'Reverting...' : 'Revert to PENDING' }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button type=\"button\" @click=\"close\">close</button>\n </form>\n </dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { ref, watch } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { formatStaffCreditValue } from '../../utils/creditValueFormatter';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isOpen: boolean;\n}\n\ninterface Emits {\n (e: 'close'): void;\n (e: 'success'): void;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits<Emits>();\n\nconst modalRef = ref<HTMLDialogElement | null>(null);\nconst revertError = ref<string | null>(null);\n\nconst revertMessage = ref('');\n\nconst { mutate: revertSupportTicket, loading: isReverting } = useMutation(\n (api, input: { id: string }) => api.supportTickets.revertTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nwatch(\n [() => props.isOpen, () => props.ticket],\n ([isOpen, ticket]) => {\n if (isOpen && ticket) {\n const creditDisplay = formatStaffCreditValue(\n ticket.credit_value,\n ticket.approval_status,\n );\n const hasCredits = creditDisplay !== 'TBD' && creditDisplay !== 'N/A';\n revertMessage.value =\n `This will:\\n\\n` +\n `• Change status back to PENDING\\n` +\n `• Unlock the support ticket item\\n` +\n (hasCredits ? `• Refund ${creditDisplay} credits to customer\\n` : '') +\n `• Allow the customer to edit again\\n\\n` +\n `Are you sure you want to revert this decision?`;\n revertError.value = null;\n modalRef.value?.showModal();\n } else {\n modalRef.value?.close();\n }\n },\n { immediate: true },\n);\n\nfunction close() {\n modalRef.value?.close();\n emit('close');\n}\n\nasync function handleRevert() {\n if (!props.ticket) return;\n revertError.value = null;\n\n try {\n await revertSupportTicket({ id: props.ticket.id });\n\n const creditDisplay = formatStaffCreditValue(\n props.ticket.credit_value,\n props.ticket.approval_status,\n );\n const refundMessage =\n creditDisplay !== 'TBD' && creditDisplay !== 'N/A'\n ? ` ${creditDisplay} credits refunded.`\n : '';\n\n toast.success(`Support Ticket reverted to PENDING.${refundMessage}`);\n close();\n emit('success');\n } catch (e) {\n const message = extractRpcErrorMessage(e, 'Failed to revert');\n revertError.value = message;\n toast.error(message);\n }\n}\n</script>\n","<template>\n <ActionBannerAlert\n v-if=\"isArchived\"\n variant=\"neutral\"\n icon=\"archive\"\n >\n This ticket is archived. Comments, edits, and attachments are locked for both customer and staff.\n <template #actions>\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n @click=\"emit('archive')\"\n >\n Unarchive\n </button>\n </template>\n </ActionBannerAlert>\n <ActionBannerAlert\n v-else-if=\"ticket.approval_status === 'PENDING'\"\n variant=\"warning\"\n icon=\"clock\"\n >\n This ticket is awaiting approval.\n <template #actions>\n <button type=\"button\" class=\"btn btn-success btn-sm\" @click=\"emit('approve')\">\n Approve\n </button>\n <button type=\"button\" class=\"btn btn-error btn-sm\" @click=\"emit('reject')\">\n Reject\n </button>\n <button type=\"button\" class=\"btn btn-primary btn-sm\" @click=\"emit('convertToInternal')\">\n Convert to Internal\n </button>\n <button type=\"button\" class=\"btn btn-ghost btn-sm\" @click=\"emit('delete')\">\n Delete\n </button>\n </template>\n </ActionBannerAlert>\n <ActionBannerAlert\n v-else-if=\"ticket.approval_status === 'APPROVED' && ticket.locked_approval_at\"\n variant=\"success\"\n icon=\"lock\"\n >\n This ticket was approved on {{ lockedDateFormatted }}.\n <template #actions>\n <button type=\"button\" class=\"btn btn-warning btn-sm\" @click=\"emit('revert')\">\n Revert\n </button>\n <button\n v-if=\"!isCompleted\"\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n @click=\"emit('complete')\"\n >\n Complete\n </button>\n <button\n v-else-if=\"!isArchived\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n @click=\"emit('archive')\"\n >\n Archive\n </button>\n </template>\n </ActionBannerAlert>\n <ActionBannerAlert\n v-else-if=\"ticket.approval_status === 'REJECTED' && ticket.locked_approval_at\"\n variant=\"error\"\n icon=\"lock\"\n >\n This ticket was rejected on {{ lockedDateFormatted }}.\n <template #actions>\n <button type=\"button\" class=\"btn btn-warning btn-sm\" @click=\"emit('revert')\">\n Revert\n </button>\n <button\n v-if=\"!isArchived\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n @click=\"emit('archive')\"\n >\n Archive\n </button>\n <button type=\"button\" class=\"btn btn-ghost btn-sm\" @click=\"emit('delete')\">\n Delete\n </button>\n </template>\n </ActionBannerAlert>\n <ActionBannerAlert v-else-if=\"ticket.approval_status === 'INTERNAL'\" variant=\"info\" icon=\"info\">\n Internal ticket.\n <template #actions>\n <button\n v-if=\"!isCompleted\"\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n @click=\"emit('complete')\"\n >\n Complete\n </button>\n <button\n v-else-if=\"!isArchived\"\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n @click=\"emit('archive')\"\n >\n Archive\n </button>\n <button type=\"button\" class=\"btn btn-ghost btn-sm\" @click=\"emit('delete')\">\n Delete\n </button>\n </template>\n </ActionBannerAlert>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport ActionBannerAlert from '../../shared/ActionBannerAlert.vue';\nimport { formatTicketDate } from '../../utils/formatTicketDate';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto;\n}\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n approve: [];\n reject: [];\n revert: [];\n convertToInternal: [];\n delete: [];\n complete: [];\n archive: [];\n}>();\n\nconst lockedDateFormatted = computed(() => {\n const at = props.ticket.locked_approval_at;\n return at ? formatTicketDate(at).formatted : '';\n});\n\nconst isCompleted = computed(() => props.ticket.status === 'COMPLETED');\nconst isArchived = computed(() => !!props.ticket.archived_at);\n</script>\n","<template>\n <div class=\"border border-base-200 rounded-lg p-4 md:p-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3\">\n <MetadataField label=\"Status\">\n <SupportTicketApprovalBadge\n :approval-status=\"ticket.approval_status\"\n size=\"sm\"\n />\n </MetadataField>\n <MetadataField label=\"Dev Lifecycle\">\n <select\n v-if=\"canEditDevLifecycle\"\n :value=\"effectiveDevLifecycleForSelect\"\n class=\"select select-sm select-bordered min-w-[7rem]\"\n :disabled=\"updatingDevLifecycle\"\n @change=\"handleDevLifecycleChange(($event.target as HTMLSelectElement).value)\"\n >\n <option\n v-for=\"opt in devLifecycleUpdateOptions\"\n :key=\"opt.value\"\n :value=\"opt.value\"\n >\n {{ opt.label }}\n </option>\n </select>\n <SupportTicketDevLifecycleBadge\n v-else-if=\"ticket.dev_lifecycle\"\n :dev-lifecycle=\"ticket.dev_lifecycle\"\n size=\"sm\"\n />\n <span v-else class=\"text-base-content/50 italic text-sm\">Not started</span>\n </MetadataField>\n <MetadataField label=\"Type\">\n <SupportTicketTypeBadge :type=\"ticket.type\" size=\"sm\" />\n </MetadataField>\n <MetadataField label=\"Priority\">\n <SupportTicketPriorityBadge :priority=\"ticket.priority\" size=\"sm\" />\n </MetadataField>\n <MetadataField label=\"Assignee\">\n <span v-if=\"assigneeDisplay\">{{ assigneeDisplay }}</span>\n <span v-else class=\"text-base-content/50 italic text-sm\">Unassigned</span>\n </MetadataField>\n <MetadataField label=\"Requester\">\n {{ ticket.created_by_display_name }}\n </MetadataField>\n <div class=\"md:col-span-2\">\n <MetadataField label=\"Description\">\n <p v-if=\"ticket.description?.trim()\" class=\"whitespace-pre-wrap text-sm\">\n {{ ticket.description }}\n </p>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">No description provided</span>\n </template>\n </MetadataField>\n </div>\n <MetadataField label=\"Ticket ID\" :copyable=\"true\">\n {{ ticketDisplayId }}\n </MetadataField>\n <MetadataField label=\"Created\">\n {{ createdFormatted }}\n <span v-if=\"createdRelative\" class=\"text-base-content/50\">· {{ createdRelative }}</span>\n </MetadataField>\n <MetadataField label=\"Started\">\n <template v-if=\"ticket.start_at\">\n {{ startFormatted }}\n <span class=\"text-base-content/50\">· {{ startRelative }}</span>\n </template>\n <span v-else class=\"text-base-content/50 italic text-sm\">Not set</span>\n </MetadataField>\n <MetadataField label=\"Target\">\n <span v-if=\"ticket.target_at\" :class=\"{ 'text-error': isTargetOverdue }\">\n {{ targetFormatted }}\n <span class=\"text-base-content/50\">· {{ targetRelative }}</span>\n </span>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">Not set</span>\n </template>\n </MetadataField>\n <MetadataField label=\"Completed\">\n <template v-if=\"ticket.completed_at\">\n {{ completedFormatted }}\n <span class=\"text-base-content/50\">· {{ completedRelative }}</span>\n </template>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">Not set</span>\n </template>\n </MetadataField>\n <MetadataField label=\"Credits\">\n <span class=\"inline-flex items-center gap-1\">\n <span v-if=\"ticket.is_locked\" aria-hidden=\"true\">🔒</span>\n {{ creditDisplay }}\n </span>\n </MetadataField>\n <MetadataField label=\"Delivered Value\">\n <template v-if=\"ticket.delivered_value?.trim()\">{{ ticket.delivered_value }}</template>\n <template #empty>\n <span class=\"text-base-content/50 italic text-sm\">Not set</span>\n </template>\n </MetadataField>\n </div>\n <div v-if=\"!ticket.archived_at\" class=\"flex justify-end gap-2 mt-4\">\n <button type=\"button\" class=\"btn btn-sm\" @click=\"$emit('edit')\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n class=\"w-4 h-4 mr-2\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\"\n />\n </svg>\n Edit\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n SUPPORT_TICKET_DEV_LIFECYCLE_FILTER_OPTIONS,\n SupportTicketDevLifecycleUpdateEnum,\n supportTicketPriorityToNumber,\n type StaffSupportTicketReadDto,\n type StaffSupportTicketUpdateDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { computed, inject, ref } from 'vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport MetadataField from '../../shared/MetadataField.vue';\nimport SupportTicketApprovalBadge from '../../shared/SupportTicketApprovalBadge.vue';\nimport SupportTicketDevLifecycleBadge from '../../shared/SupportTicketDevLifecycleBadge.vue';\nimport SupportTicketTypeBadge from '../../shared/SupportTicketTypeBadge.vue';\nimport SupportTicketPriorityBadge from '../../shared/SupportTicketPriorityBadge.vue';\nimport { formatTicketDate } from '../../utils/formatTicketDate';\nimport { formatTicketDisplayId } from '../../utils/displayIdFormatter';\nimport { formatStaffCreditValue } from '../../utils/creditValueFormatter';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto;\n}\n\ndefineEmits<{ edit: [] }>();\n\nconst props = defineProps<Props>();\n\nconst refreshTicket = inject<(() => Promise<void>) | undefined>('refreshTicket');\n\nconst devLifecycleUpdateOptions = SUPPORT_TICKET_DEV_LIFECYCLE_FILTER_OPTIONS.filter((opt) =>\n (SupportTicketDevLifecycleUpdateEnum as readonly string[]).includes(opt.value),\n);\n\nconst updatingDevLifecycle = ref(false);\nconst { mutate: updateTicket } = useMutation(\n (api, input: StaffSupportTicketUpdateDto) => api.supportTickets.staffUpdateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst canEditDevLifecycle = computed(() => {\n const t = props.ticket;\n if (!t.approval_status) return false;\n if (!['APPROVED', 'INTERNAL'].includes(t.approval_status)) return false;\n const dl = t.dev_lifecycle;\n if (dl === 'DEPLOYED' || dl === 'CANCELLED') return false;\n return true;\n});\n\nconst effectiveDevLifecycleForSelect = computed(() => {\n const dl = props.ticket.dev_lifecycle;\n if (dl && (SupportTicketDevLifecycleUpdateEnum as readonly string[]).includes(dl)) return dl;\n return 'BACKLOG';\n});\n\nasync function handleDevLifecycleChange(newDevLifecycle: string): Promise<void> {\n if (!(SupportTicketDevLifecycleUpdateEnum as readonly string[]).includes(newDevLifecycle)) return;\n if (!refreshTicket) return;\n const t = props.ticket;\n updatingDevLifecycle.value = true;\n try {\n const priority =\n typeof t.priority === 'number'\n ? t.priority\n : supportTicketPriorityToNumber(t.priority as 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL');\n await updateTicket({\n id: t.id,\n title: t.title,\n type: t.type,\n priority,\n dev_lifecycle: newDevLifecycle as StaffSupportTicketUpdateDto['dev_lifecycle'],\n });\n await refreshTicket();\n } finally {\n updatingDevLifecycle.value = false;\n }\n}\n\nconst assigneeDisplay = computed(() => {\n const assigneeId = props.ticket?.assigned_to;\n if (!assigneeId) return null;\n return props.ticket.assigned_to_display_name ?? assigneeId;\n});\n\nconst ticketDisplayId = computed(() =>\n formatTicketDisplayId(\n props.ticket.display_id,\n props.ticket.display_id_prefix,\n props.ticket.id,\n ),\n);\n\nconst createdFormatted = computed(() => {\n const at = props.ticket.created_at;\n return at ? formatTicketDate(at).formatted : '';\n});\nconst createdRelative = computed(() => {\n const at = props.ticket.created_at;\n return at ? formatTicketDate(at).relative : '';\n});\n\nconst startFormatted = computed(() =>\n props.ticket.start_at ? formatTicketDate(props.ticket.start_at!).formatted : '',\n);\nconst startRelative = computed(() =>\n props.ticket.start_at ? formatTicketDate(props.ticket.start_at!).relative : '',\n);\n\nconst targetFormatted = computed(() =>\n props.ticket.target_at ? formatTicketDate(props.ticket.target_at!).formatted : '',\n);\nconst targetRelative = computed(() =>\n props.ticket.target_at ? formatTicketDate(props.ticket.target_at!).relative : '',\n);\n\nconst completedFormatted = computed(() =>\n props.ticket.completed_at ? formatTicketDate(props.ticket.completed_at!).formatted : '',\n);\nconst completedRelative = computed(() =>\n props.ticket.completed_at ? formatTicketDate(props.ticket.completed_at!).relative : '',\n);\n\nconst isTargetOverdue = computed(() => {\n if (!props.ticket.target_at || props.ticket.completed_at) return false;\n return new Date(props.ticket.target_at) < new Date() && !props.ticket.completed_at;\n});\n\nconst creditDisplay = computed(() =>\n formatStaffCreditValue(props.ticket.credit_value, props.ticket.approval_status),\n);\n</script>\n","import {\n StaffSupportTicketUpdateSchema,\n SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n} from '@dragonmastery/dragoncore-shared';\nimport { withMetadata } from '@dragonmastery/zinia-forms-core';\nimport { z } from 'zod';\n\nexport type StaffMetadataCardEditFormDto = z.infer<typeof StaffSupportTicketUpdateSchema>;\n\nexport const staffMetadataCardEditFormMetadata = withMetadata(\n StaffSupportTicketUpdateSchema,\n 'staffMetadataCardEditForm',\n {\n title: {\n label: 'Title',\n placeholder: 'Enter ticket title',\n },\n description: {\n label: 'Description',\n inputType: 'textarea',\n placeholder: 'Describe the ticket in detail',\n },\n type: { label: 'Type' },\n priority: {\n label: 'Priority',\n inputType: 'select',\n valueToLabel: SUPPORT_TICKET_PRIORITY_NUMBER_TO_LABEL,\n valueType: 'number',\n },\n dev_lifecycle: { label: 'Development Lifecycle' },\n credit_value: {\n label: 'Credit Value',\n inputType: 'currency',\n step: 0.01,\n placeholder: '0.00',\n },\n delivered_value: {\n label: 'Delivered Value',\n inputType: 'currency',\n step: 0.01,\n placeholder: '0.00',\n },\n start_at: {\n label: 'Start At',\n inputType: 'date',\n },\n target_at: {\n label: 'Target At',\n inputType: 'date',\n },\n completed_at: {\n label: 'Completed At',\n inputType: 'date',\n },\n },\n);\n","<template>\n <ZiniaForm\n @handle-submit=\"handleSubmit\"\n @success=\"handleSuccess\"\n @error=\"handleError\"\n title=\"\"\n subtitle=\"\"\n >\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Title - full width -->\n <div class=\"form-control md:col-span-2\">\n <zinia.TitleField placeholder=\"Enter ticket title\" />\n </div>\n\n <!-- Description - full width -->\n <div class=\"form-control md:col-span-2\">\n <zinia.DescriptionField class=\"w-full\" placeholder=\"Describe the ticket in detail\" />\n </div>\n\n <!-- Type -->\n <div class=\"form-control\">\n <zinia.TypeField />\n </div>\n\n <!-- Assignee - only when not archived -->\n <div v-if=\"!ticket.archived_at\" class=\"form-control\">\n <label class=\"label\">\n <span class=\"label-text\">Assignee</span>\n </label>\n <select v-model=\"assigneeId\" class=\"select select-bordered w-full\" :disabled=\"saving\">\n <option value=\"\">Unassigned</option>\n <option v-for=\"u in triageUsers ?? []\" :key=\"u.id\" :value=\"u.id\">\n {{ u.email }}\n </option>\n </select>\n </div>\n\n <!-- Priority -->\n <div class=\"form-control\">\n <zinia.PriorityField />\n </div>\n\n <!-- Development Lifecycle - Only editable when APPROVED or INTERNAL (not terminal states) -->\n <div\n v-if=\"\n ['APPROVED', 'INTERNAL'].includes(ticket.approval_status || '') &&\n ticket.dev_lifecycle !== 'DEPLOYED' &&\n ticket.dev_lifecycle !== 'CANCELLED'\n \"\n class=\"form-control\"\n >\n <zinia.DevLifecycleField />\n </div>\n\n <!-- Credit Value - Only editable when PENDING -->\n <div v-if=\"ticket.approval_status === 'PENDING'\" class=\"form-control\">\n <zinia.CreditValueField placeholder=\"0.00\" />\n </div>\n\n <!-- Delivered Value - Only editable when DEPLOYED -->\n <div v-if=\"ticket.dev_lifecycle === 'DEPLOYED'\" class=\"form-control\">\n <zinia.DeliveredValueField placeholder=\"0.00\" />\n </div>\n\n <!-- Start At - Only editable when PENDING, APPROVED, or INTERNAL (not terminal) -->\n <div\n v-if=\"\n ['PENDING', 'APPROVED', 'INTERNAL'].includes(ticket.approval_status || '') &&\n ticket.dev_lifecycle !== 'CANCELLED' &&\n ticket.dev_lifecycle !== 'DEPLOYED'\n \"\n class=\"form-control\"\n >\n <zinia.StartAtField :formatter=\"formatToISODate\" />\n </div>\n\n <!-- Target At - Only editable when PENDING, APPROVED, or INTERNAL (not terminal) -->\n <div\n v-if=\"\n ['PENDING', 'APPROVED', 'INTERNAL'].includes(ticket.approval_status || '') &&\n ticket.dev_lifecycle !== 'CANCELLED' &&\n ticket.dev_lifecycle !== 'DEPLOYED'\n \"\n class=\"form-control\"\n >\n <zinia.TargetAtField :formatter=\"formatToISODate\" />\n </div>\n\n <!-- Completed At - Only editable when DEPLOYED or CANCELLED -->\n <div\n v-if=\"ticket.dev_lifecycle === 'DEPLOYED' || ticket.dev_lifecycle === 'CANCELLED'\"\n class=\"form-control\"\n >\n <zinia.CompletedAtField :formatter=\"formatToISODate\" />\n </div>\n </div>\n\n <div v-if=\"form.submitError\" class=\"alert alert-error py-2 mt-4\">\n <span class=\"text-sm\">{{ form.submitError }}</span>\n </div>\n <ZiniaFormErrorsSummary title=\"Please fix the following errors:\" />\n\n <!-- Action Buttons -->\n <div class=\"flex justify-end gap-2 mt-4\">\n <button type=\"button\" class=\"btn btn-ghost\" @click=\"handleCancel\" :disabled=\"saving\">\n Cancel\n </button>\n <ZiniaSubmitButton submitText=\"Save\" submittingText=\"Saving...\" />\n </div>\n </ZiniaForm>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n supportTicketPriorityToNumber,\n type StaffSupportTicketReadDto,\n type StaffSupportTicketUpdateDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { useForm } from '@dragonmastery/zinia-forms-core';\nimport { computed, ref, watch } from 'vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { formatToISODate } from '../../../../utils/convertToLocalDateTime';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\nimport { staffMetadataCardEditFormMetadata } from '../staffMetadataCardEditFormMetadata';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto;\n saving?: boolean;\n}\n\nconst props = defineProps<Props>();\n\nconst assigneeId = ref(props.ticket.assigned_to ?? '');\nwatch(\n () => props.ticket.assigned_to,\n (v) => {\n assigneeId.value = v ?? '';\n },\n);\n\nconst { data: triageUsers } = useQuery((api) => api.users.getTriageUsers(), {\n cacheKey: 'triage-users',\n staleTime: 60 * 60 * 1000,\n});\n\nconst emit = defineEmits<{\n success: [];\n cancel: [];\n}>();\n\nconst { mutate: updateTicket, loading: isSaving } = useMutation(\n (api, input: StaffSupportTicketUpdateDto) => api.supportTickets.staffUpdateTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\nconst saving = computed(() => props.saving ?? isSaving.value);\n\nfunction formatDateForInput(dateString: string | null | undefined): string | null {\n if (!dateString) return null;\n try {\n const date = new Date(dateString);\n const isoString = date.toISOString();\n const datePart = isoString.split('T')[0];\n return datePart || null;\n } catch {\n return null;\n }\n}\n\nfunction formatDateForOutput(dateString: string | null | undefined): string | null {\n if (!dateString || dateString.trim() === '') return null;\n try {\n const date = new Date(dateString + 'T00:00:00');\n if (isNaN(date.getTime())) return null;\n return date.toISOString();\n } catch {\n return null;\n }\n}\n\nconst { form, zinia, ZiniaForm, ZiniaSubmitButton, ZiniaFormErrorsSummary } = useForm(\n staffMetadataCardEditFormMetadata,\n {\n storeName: `staff-metadata-card-edit-${props.ticket.id}`,\n persistToLocalStorage: false,\n renderStyle: 'daisy_ui',\n fetchData: async () => {\n const t = props.ticket;\n const validDevLifecycle = [\n 'BACKLOG',\n 'PLANNING',\n 'DEVELOPMENT',\n 'CODE_REVIEW',\n 'TESTING',\n 'STAGING',\n 'PO_APPROVAL',\n 'VERIFICATION',\n ] as const;\n const devLifecycle =\n t.dev_lifecycle &&\n validDevLifecycle.includes(t.dev_lifecycle as (typeof validDevLifecycle)[number])\n ? (t.dev_lifecycle as (typeof validDevLifecycle)[number])\n : undefined;\n return {\n id: t.id,\n title: t.title || '',\n description: t.description ?? '',\n type: t.type,\n priority: supportTicketPriorityToNumber(t.priority),\n dev_lifecycle: devLifecycle,\n credit_value: t.credit_value?.trim() || null,\n delivered_value: t.delivered_value?.trim() || null,\n start_at: formatDateForInput(t.start_at) ?? null,\n target_at: formatDateForInput(t.target_at) ?? null,\n completed_at: formatDateForInput(t.completed_at) ?? null,\n };\n },\n },\n);\n\nfunction buildPayload(formData: Record<string, unknown>): StaffSupportTicketUpdateDto {\n const t = props.ticket;\n const payload: StaffSupportTicketUpdateDto = {\n id: t.id,\n title: String(formData.title ?? '').trim(),\n description: (formData.description as string) || '',\n type: formData.type as StaffSupportTicketUpdateDto['type'],\n priority: formData.priority as StaffSupportTicketUpdateDto['priority'],\n };\n\n if (\n ['APPROVED', 'INTERNAL'].includes(t.approval_status || '') &&\n t.dev_lifecycle !== 'DEPLOYED' &&\n t.dev_lifecycle !== 'CANCELLED'\n ) {\n const dl = formData.dev_lifecycle;\n if (\n dl !== null &&\n dl !== undefined &&\n dl !== 'PENDING' &&\n dl !== 'DEPLOYED' &&\n dl !== 'CANCELLED'\n ) {\n payload.dev_lifecycle = dl as StaffSupportTicketUpdateDto['dev_lifecycle'];\n }\n }\n\n if (t.approval_status === 'PENDING') {\n const cv = formData.credit_value;\n if (cv != null && cv !== '') {\n payload.credit_value = String(cv).trim();\n }\n }\n\n if (t.dev_lifecycle === 'DEPLOYED') {\n const dv = formData.delivered_value;\n if (dv != null && dv !== '') {\n payload.delivered_value = String(dv).trim();\n }\n }\n\n if (\n ['PENDING', 'APPROVED', 'INTERNAL'].includes(t.approval_status || '') &&\n t.dev_lifecycle !== 'CANCELLED' &&\n t.dev_lifecycle !== 'DEPLOYED'\n ) {\n const startAt = formatDateForOutput(formData.start_at as string | null);\n if (startAt !== null) payload.start_at = startAt;\n const targetAt = formatDateForOutput(formData.target_at as string | null);\n if (targetAt !== null) payload.target_at = targetAt;\n }\n\n if (t.dev_lifecycle === 'DEPLOYED' || t.dev_lifecycle === 'CANCELLED') {\n const completedAt = formatDateForOutput(formData.completed_at as string | null);\n if (completedAt !== null) payload.completed_at = completedAt;\n }\n\n payload.assigned_to = assigneeId.value || null;\n\n return payload;\n}\n\nasync function handleSubmit(formData: Record<string, unknown>) {\n const payload = buildPayload(formData);\n await updateTicket(payload);\n return undefined;\n}\n\nfunction handleSuccess() {\n emit('success');\n}\n\nfunction handleError(error: Error | unknown) {\n const message = extractRpcErrorMessage(error, 'Failed to update ticket');\n form.setSubmitError(message);\n}\n\nfunction handleCancel() {\n emit('cancel');\n}\n</script>\n","<template>\n <div class=\"flex flex-col gap-4 w-full\">\n <TimelineNoteInput\n ref=\"noteInputRef\"\n :show-type-toggle=\"true\"\n :disabled=\"!!ticket.archived_at\"\n :note-type=\"noteTypeFromQuery\"\n :on-submit=\"onAddNote\"\n @update:note-type=\"updateNoteTypeQuery\"\n />\n <p\n v-if=\"mergedTimelineItems.length === 0\"\n class=\"text-base-content/50 text-sm text-center py-8\"\n >\n No activity yet.\n </p>\n <template v-for=\"item in mergedTimelineItems\" :key=\"item.id\">\n <TimelineItem\n v-if=\"item.type === 'customer-note' || item.type === 'internal-note'\"\n :author-name=\"item.data.authorName\"\n :created-at=\"item.data.createdAt\"\n :variant=\"item.type === 'customer-note' ? 'customer' : 'internal'\"\n >\n {{ item.data.body ?? '' }}\n </TimelineItem>\n <TimelineSystemEvent\n v-else-if=\"item.type === 'system-event'\"\n :author=\"item.data.author\"\n :message=\"item.data.message\"\n :timestamp=\"item.data.timestamp\"\n :action=\"item.data.action\"\n :type=\"item.data.type\"\n :details=\"item.data.details\"\n :old-value=\"item.data.oldValue\"\n :new-value=\"item.data.newValue\"\n :changes=\"item.data.changes\"\n />\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { StaffSupportTicketReadDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport TimelineItem from '../../shared/TimelineItem.vue';\nimport TimelineNoteInput from '../../shared/TimelineNoteInput.vue';\nimport TimelineSystemEvent from '../../shared/TimelineSystemEvent.vue';\nimport type { SystemEvent } from '../../utils/parseRecordVersions';\n\nexport interface TimelineNoteDto {\n authorName: string;\n createdAt: string;\n body: string;\n}\n\ninterface Props {\n ticket: StaffSupportTicketReadDto;\n customerNotes: TimelineNoteDto[];\n internalNotes: TimelineNoteDto[];\n systemEvents: SystemEvent[];\n /** Called when user submits a note. Must return a Promise. */\n onAddNote: (payload: {\n content: string;\n noteType: 'customer' | 'internal';\n }) => Promise<void>;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst noteTypeFromQuery = computed<'customer' | 'internal'>(() => {\n return route.query.noteType === 'internal' ? 'internal' : 'customer';\n});\n\nfunction updateNoteTypeQuery(value: 'customer' | 'internal') {\n router.replace({\n path: route.path,\n query: {\n ...route.query,\n noteType: value === 'internal' ? 'internal' : undefined,\n },\n });\n}\n\nconst noteInputRef = ref<InstanceType<typeof TimelineNoteInput> | null>(null);\n\ntype TimelineItem =\n | { type: 'customer-note'; timestamp: string; id: string; data: TimelineNoteDto }\n | { type: 'internal-note'; timestamp: string; id: string; data: TimelineNoteDto }\n | { type: 'system-event'; timestamp: string; id: string; data: SystemEvent };\n\nconst mergedTimelineItems = computed((): TimelineItem[] => {\n const items: TimelineItem[] = [];\n\n for (const note of props.customerNotes ?? []) {\n items.push({\n type: 'customer-note',\n timestamp: note.createdAt,\n id: `customer-note-${note.createdAt}-${note.authorName}`,\n data: note,\n });\n }\n\n for (const note of props.internalNotes ?? []) {\n items.push({\n type: 'internal-note',\n timestamp: note.createdAt,\n id: `internal-note-${note.createdAt}-${note.authorName}`,\n data: note,\n });\n }\n\n for (const event of props.systemEvents ?? []) {\n items.push({\n type: 'system-event',\n timestamp: event.timestamp,\n id: event.id,\n data: event,\n });\n }\n\n items.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n return items;\n});\n\nfunction resetInput() {\n noteInputRef.value?.reset();\n}\n\ndefineExpose({ resetInput });\n</script>\n","<template>\n <div v-if=\"supportTicketId\" class=\"w-full\">\n <div class=\"collapse collapse-arrow bg-base-200\">\n <input type=\"checkbox\" v-model=\"expanded\" />\n <div class=\"collapse-title text-sm font-medium px-4 py-2 min-h-0\">\n <div class=\"flex items-center gap-2\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\"\n />\n </svg>\n <span>Subscribers ({{ subscribers.length }})</span>\n </div>\n </div>\n <div class=\"collapse-content px-0\">\n <div class=\"px-4 pb-4 space-y-4\">\n <!-- Add subscriber -->\n <div v-if=\"!locked\" class=\"flex flex-wrap items-end gap-2\">\n <div class=\"form-control flex-1 min-w-[200px]\">\n <label class=\"label py-0\">\n <span class=\"label-text text-sm\">Add subscriber</span>\n </label>\n <select\n v-model=\"selectedUserId\"\n class=\"select select-bordered select-sm w-full\"\n :disabled=\"isAddLoading\"\n >\n <option value=\"\">Select user...</option>\n <option\n v-for=\"user in availableUsers\"\n :key=\"user.id\"\n :value=\"user.id\"\n >\n {{ user.email }}\n </option>\n </select>\n </div>\n <button\n class=\"btn btn-sm btn-primary\"\n :disabled=\"!selectedUserId || isAddLoading\"\n @click=\"handleAddSubscriber\"\n >\n <span v-if=\"isAddLoading\" class=\"loading loading-spinner loading-xs\"></span>\n <span v-else>Add</span>\n </button>\n </div>\n\n <!-- Subscriber list -->\n <div v-if=\"subscribersLoading\" class=\"flex justify-center py-4\">\n <span class=\"loading loading-spinner loading-sm\"></span>\n </div>\n <ul v-else-if=\"subscribers.length === 0\" class=\"text-sm text-base-content/50 italic\">\n No subscribers yet\n </ul>\n <ul v-else class=\"space-y-2\">\n <li\n v-for=\"sub in subscribers\"\n :key=\"sub.id\"\n class=\"flex items-center justify-between gap-2 py-2 px-3 rounded bg-base-100 border border-base-300\"\n >\n <span class=\"text-sm truncate\">\n {{ sub.user_id_display_name ?? sub.user_id }}\n </span>\n <button\n v-if=\"!locked\"\n type=\"button\"\n class=\"btn btn-ghost btn-xs text-error\"\n aria-label=\"Remove subscriber\"\n @click=\"handleRemoveSubscriber(sub.id)\"\n :disabled=\"isRemoveLoading === sub.id\"\n >\n <span v-if=\"isRemoveLoading === sub.id\" class=\"loading loading-spinner loading-xs\"></span>\n <svg v-else xmlns=\"http://www.w3.org/2000/svg\" class=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n DragoncoreApi,\n RecordSubscriberReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { ref, computed } from 'vue';\nimport { toast } from 'vue3-toastify';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { extractRpcErrorMessage } from '../../../../utils/extractRpcErrorMessage';\n\ninterface Props {\n supportTicketId: string;\n locked: boolean;\n}\n\nconst props = defineProps<Props>();\n\nconst expanded = ref(false);\nconst selectedUserId = ref('');\n\n// Fetch subscribers\nconst {\n data: subscribersData,\n loading: subscribersLoading,\n refetch: refetchSubscribers,\n} = useQuery<DragoncoreApi, RecordSubscriberReadDto[]>(\n (api) => api.supportTickets.staffListSubscribers(props.supportTicketId),\n {\n enabled: computed(() => !!props.supportTicketId),\n cacheKey: `support-ticket-subscribers-${props.supportTicketId}`,\n },\n);\n\nconst subscribers = computed((): RecordSubscriberReadDto[] => {\n return subscribersData.value ?? [];\n});\n\n// Fetch users for add dropdown\nconst { data: usersData } = useQuery<\n DragoncoreApi,\n Array<{ id: string; email: string }>\n>(\n (api) => api.users.getUsersForSelection(),\n { staleTime: 10 * 60 * 1000 },\n);\n\nconst availableUsers = computed(() => {\n const users = usersData.value ?? [];\n const existingIds = new Set(subscribers.value.map((s) => s.user_id));\n return users.filter((u) => !existingIds.has(u.id));\n});\n\n// Add subscriber mutation\nconst { mutate: addSubscriber, loading: isAddLoading } = useMutation<\n DragoncoreApi,\n { support_ticket_id: string; user_id: string },\n RecordSubscriberReadDto\n>(\n (api, input) => api.supportTickets.staffAddSubscriber(input),\n { invalidate: /^support-ticket-subscribers/ },\n);\n\n// Remove subscriber mutation\nconst { mutate: removeSubscriber } = useMutation<\n DragoncoreApi,\n { supportTicketId: string; subscriberId: string },\n void\n>(\n (api, input) => api.supportTickets.staffRemoveSubscriber(input),\n { invalidate: /^support-ticket-subscribers/ },\n);\n\nconst isRemoveLoading = ref<string | null>(null);\n\nasync function handleAddSubscriber() {\n if (!selectedUserId.value) return;\n\n try {\n await addSubscriber({\n support_ticket_id: props.supportTicketId,\n user_id: selectedUserId.value,\n });\n toast.success('Subscriber added');\n selectedUserId.value = '';\n await refetchSubscribers();\n } catch (e) {\n toast.error(extractRpcErrorMessage(e, 'Failed to add subscriber'));\n }\n}\n\nasync function handleRemoveSubscriber(subscriberId: string) {\n try {\n isRemoveLoading.value = subscriberId;\n await removeSubscriber({\n supportTicketId: props.supportTicketId,\n subscriberId,\n });\n toast.success('Subscriber removed');\n await refetchSubscribers();\n } catch (e) {\n toast.error(extractRpcErrorMessage(e, 'Failed to remove subscriber'));\n } finally {\n isRemoveLoading.value = null;\n }\n}\n</script>\n","<template>\n <!-- Loading State (only on initial load; refetch keeps content visible) -->\n <div v-if=\"isLoading && !ticket\" class=\"flex justify-center items-center p-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"alert alert-error mb-4 max-w-4xl mx-auto px-4\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <div class=\"flex-1\">\n <span>{{ error.message || 'An error occurred' }}</span>\n <div class=\"mt-2\">\n <router-link :to=\"{ name: 'StaffSupportTicketList' }\" class=\"link link-primary\">\n Go back to ticket list\n </router-link>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div v-else-if=\"ticket\" class=\"px-4 py-6 max-w-4xl mx-auto\">\n <!-- Header -->\n <div class=\"mb-6\">\n <h1 class=\"text-2xl font-bold text-base-content break-words leading-tight mt-2\">\n {{ ticket.title }}\n </h1>\n </div>\n\n <!-- Action Banner (buttons only; sections in dialogs) -->\n <div class=\"mb-6\">\n <StaffActionBanner\n :ticket=\"ticket\"\n @approve=\"showApproveModal\"\n @reject=\"showRejectModal\"\n @revert=\"showRevertModal\"\n @convert-to-internal=\"showConvertToInternalModal\"\n @delete=\"showDeleteModal\"\n @complete=\"showCompleteModal\"\n @archive=\"showArchiveModal\"\n />\n </div>\n\n <!-- Approve Modal -->\n <ApproveSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isApproveModalOpen\"\n @close=\"isApproveModalOpen = false\"\n @success=\"handleApproveSuccess\"\n />\n\n <!-- Revert Modal -->\n <RevertSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isRevertModalOpen\"\n @close=\"isRevertModalOpen = false\"\n @success=\"handleTicketUpdate\"\n />\n\n <!-- Delete Modal -->\n <DeleteSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isDeleteModalOpen\"\n @close=\"isDeleteModalOpen = false\"\n @success=\"handleDeleteSuccess\"\n />\n\n <!-- Convert to Internal Modal -->\n <ConvertToInternalModal\n :ticket=\"ticket\"\n :is-open=\"isConvertToInternalModalOpen\"\n @close=\"isConvertToInternalModalOpen = false\"\n @success=\"handleTicketUpdate\"\n />\n\n <!-- Complete Modal -->\n <CompleteSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isCompleteModalOpen\"\n @close=\"isCompleteModalOpen = false\"\n @success=\"handleTicketUpdate\"\n />\n\n <!-- Archive Modal -->\n <ArchiveSupportTicketModal\n :ticket=\"ticket\"\n :is-open=\"isArchiveModalOpen\"\n @close=\"isArchiveModalOpen = false\"\n @success=\"handleTicketUpdate\"\n />\n\n <!-- Reject Modal with Reason -->\n <dialog ref=\"rejectModal\" class=\"modal\">\n <div class=\"modal-box\">\n <h3 class=\"font-bold text-lg\">Reject Ticket</h3>\n <p class=\"text-sm text-base-content/70 py-2\">\n This will lock the ticket and notify the requester.\n </p>\n <div class=\"form-control py-4\">\n <label class=\"label\">\n <span class=\"label-text text-sm font-medium\">Reason (optional)</span>\n </label>\n <textarea\n v-model=\"rejectReason\"\n class=\"textarea textarea-bordered w-full\"\n rows=\"3\"\n placeholder=\"Why is this ticket being rejected?\"\n :disabled=\"isRejecting\"\n ></textarea>\n </div>\n <div v-if=\"rejectError\" class=\"alert alert-error py-2 mb-4\">\n <span class=\"text-sm\">{{ rejectError }}</span>\n </div>\n <div class=\"modal-action\">\n <button class=\"btn btn-ghost\" @click=\"closeRejectModal\" :disabled=\"isRejecting\">\n Cancel\n </button>\n <button\n class=\"btn btn-error\"\n @click=\"handleRejectWithReason\"\n :disabled=\"isRejecting\"\n >\n <span v-if=\"isRejecting\" class=\"loading loading-spinner loading-xs mr-2\"></span>\n {{ isRejecting ? 'Rejecting...' : 'Reject Ticket' }}\n </button>\n </div>\n </div>\n <form method=\"dialog\" class=\"modal-backdrop\">\n <button @click=\"closeRejectModal\">close</button>\n </form>\n </dialog>\n\n <!-- Metadata Card (Display or Edit) -->\n <div class=\"mb-8\">\n <StaffMetadataCard v-if=\"!isEditMode\" :ticket=\"ticket\" @edit=\"enterEditMode\" />\n <StaffMetadataCardEdit\n v-else\n :ticket=\"ticket\"\n @success=\"handleMetadataSaveSuccess\"\n @cancel=\"exitEditMode\"\n />\n </div>\n\n <!-- Attachments (separate from timeline so adding a comment doesn't cause refetch) -->\n <div class=\"mb-8\">\n <SupportTicketAttachmentsCollapsible\n :record-id=\"ticket.id\"\n :locked=\"!!ticket.archived_at\"\n :editable=\"!ticket.archived_at\"\n @uploaded=\"refetchTimeline\"\n @deleted=\"refetchTimeline\"\n />\n </div>\n\n <!-- Subscribers -->\n <div class=\"mb-8\">\n <SupportTicketSubscribersCollapsible\n :support-ticket-id=\"ticket.id\"\n :locked=\"!!ticket.archived_at\"\n />\n </div>\n\n <!-- Timeline: stay mounted once we have data so adding a comment doesn't unmount/remount -->\n <div>\n <StaffTimeline\n v-if=\"timelineData != null\"\n :ticket=\"ticket\"\n :customer-notes=\"customerNotesForTimeline\"\n :internal-notes=\"internalNotesForTimeline\"\n :system-events=\"systemEventsForTimeline\"\n :on-add-note=\"handleAddNote\"\n />\n <div v-else class=\"flex justify-center items-center py-8\">\n <span class=\"loading loading-spinner loading-lg\"></span>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n NoteCreateDto,\n StaffSupportTicketReadDto,\n} from '@dragonmastery/dragoncore-shared';\nimport { OPERATORS, RecordConst } from '@dragonmastery/dragoncore-shared';\nimport { computed, inject, nextTick, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport { BATCH_MODE } from '../../../composables/useRpcAuth';\nimport { useMutation } from '../../../composables/useMutation';\nimport { useQuery } from '../../../composables/useQuery';\nimport { extractRpcErrorMessage } from '../../../utils/extractRpcErrorMessage';\nimport SupportTicketAttachmentsCollapsible from '../shared/SupportTicketAttachmentsCollapsible.vue';\nimport { parseRecordVersions } from '../utils/parseRecordVersions';\nimport ApproveSupportTicketModal from './components/ApproveSupportTicketModal.vue';\nimport ArchiveSupportTicketModal from './components/ArchiveSupportTicketModal.vue';\nimport CompleteSupportTicketModal from './components/CompleteSupportTicketModal.vue';\nimport ConvertToInternalModal from './components/ConvertToInternalModal.vue';\nimport DeleteSupportTicketModal from './components/DeleteSupportTicketModal.vue';\nimport RevertSupportTicketModal from './components/RevertSupportTicketModal.vue';\nimport StaffActionBanner from './components/StaffActionBanner.vue';\nimport StaffMetadataCard from './components/StaffMetadataCard.vue';\nimport StaffMetadataCardEdit from './components/StaffMetadataCardEdit.vue';\nimport StaffTimeline from './components/StaffTimeline.vue';\nimport SupportTicketSubscribersCollapsible from './components/SupportTicketSubscribersCollapsible.vue';\n\ninterface Props {\n ticket: StaffSupportTicketReadDto | null;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nconst props = defineProps<Props>();\n\nconst route = useRoute();\nconst router = useRouter();\nconst support_ticket_id = route.params.id as string;\n\nconst isApproveModalOpen = ref(false);\nconst isRevertModalOpen = ref(false);\nconst isDeleteModalOpen = ref(false);\nconst isConvertToInternalModalOpen = ref(false);\nconst isCompleteModalOpen = ref(false);\nconst isArchiveModalOpen = ref(false);\nconst rejectModal = ref<HTMLDialogElement | null>(null);\nconst rejectReason = ref('');\nconst rejectError = ref<string | null>(null);\n\n// Edit mode state\nconst isEditMode = computed(() => route.query.mode === 'edit');\n\n// Get refresh function from parent\nconst refreshTicket = inject<(() => Promise<void>) | undefined>('refreshTicket');\n\n// Fetch customer notes, internal notes, and record versions in a single batched request\nconst { data: timelineData, refetch: refetchTimeline } = useQuery(\n async (api) => {\n const [customerNotes, internalNotes, recordVersions] = await Promise.all([\n api.notes.getNotes({\n record_id: { operator: OPERATORS.EQUALS, value: support_ticket_id },\n record_type: { operator: OPERATORS.EQUALS, value: 'support_ticket' },\n is_internal: { operator: OPERATORS.EQUALS, value: false },\n first: 100,\n sortBy: 'created_at',\n sortDirection: 'asc',\n }),\n api.notes.getNotes({\n record_id: { operator: OPERATORS.EQUALS, value: support_ticket_id },\n record_type: { operator: OPERATORS.EQUALS, value: 'support_ticket' },\n is_internal: { operator: OPERATORS.EQUALS, value: true },\n first: 100,\n sortBy: 'created_at',\n sortDirection: 'asc',\n }),\n api.recordVersions.listRecordVersionsPaginated(\n support_ticket_id,\n RecordConst.SUPPORT_TICKET, // legacy; record_types in filters takes priority\n {\n record_types: [RecordConst.SUPPORT_TICKET, RecordConst.SUPPORT_TICKET_ACTIVITY],\n first: 100,\n sortBy: 'recorded_at',\n sortDirection: 'asc',\n },\n ),\n ]);\n return { customerNotes, internalNotes, recordVersions };\n },\n {\n enabled: !!support_ticket_id && !!props.ticket,\n batchMode: BATCH_MODE.batch,\n trackedSegment: 'support-ticket-timeline',\n },\n);\n\n// Map notes for timeline\ninterface TimelineNoteDto {\n authorName: string;\n createdAt: string;\n body: string;\n}\n\nconst customerNotesForTimeline = computed((): TimelineNoteDto[] => {\n const items = timelineData.value?.customerNotes?.items ?? [];\n return items.map((n) => ({\n authorName: n.created_by_display_name ?? n.created_by ?? '(unknown)',\n createdAt: n.created_at,\n body: n.body ?? '',\n }));\n});\n\nconst internalNotesForTimeline = computed((): TimelineNoteDto[] => {\n const items = timelineData.value?.internalNotes?.items ?? [];\n return items.map((n) => ({\n authorName: n.created_by_display_name ?? n.created_by ?? '(unknown)',\n createdAt: n.created_at,\n body: n.body ?? '',\n }));\n});\n\n// Parse system events (no filtering for staff; merged by API from record_types)\nconst systemEventsForTimeline = computed(() => {\n const data = timelineData.value?.recordVersions;\n const versions = data?.items ?? [];\n const userDisplayMap = data?.user_display_map;\n const displayMap = userDisplayMap ? new Map(Object.entries(userDisplayMap)) : undefined;\n return parseRecordVersions(versions, displayMap);\n});\n\n// Note creation mutation\nconst { mutate: createNote } = useMutation(\n (api, input: NoteCreateDto) => api.notes.createNote(input),\n { invalidate: /^notes?:/ },\n);\n\n// Reject mutation\nconst { mutate: rejectSupportTicket, loading: isRejecting } = useMutation(\n (api, input: { id: string }) => api.supportTickets.rejectTicket(input),\n { invalidate: /^support-tickets?:/ },\n);\n\n// Handle note creation\nasync function handleAddNote(payload: {\n content: string;\n noteType: 'customer' | 'internal';\n}) {\n try {\n await createNote({\n record_id: support_ticket_id,\n record_type: 'support_ticket' as const,\n body: payload.content,\n tag: null,\n is_internal: payload.noteType === 'internal',\n });\n await refetchTimeline();\n toast.success(payload.noteType === 'internal' ? 'Internal note added' : 'Note added');\n } catch {\n toast.error('Failed to add note');\n throw new Error('Failed to add note');\n }\n}\n\n// Show approve modal\nfunction showApproveModal() {\n if (!props.ticket) return;\n isApproveModalOpen.value = true;\n}\n\n// Show revert modal\nfunction showRevertModal() {\n if (!props.ticket) return;\n isRevertModalOpen.value = true;\n}\n\n// Show delete modal\nfunction showDeleteModal() {\n if (!props.ticket) return;\n isDeleteModalOpen.value = true;\n}\n\n// Show convert to internal modal\nfunction showConvertToInternalModal() {\n if (!props.ticket) return;\n isConvertToInternalModalOpen.value = true;\n}\n\n// Show complete modal\nfunction showCompleteModal() {\n if (!props.ticket) return;\n isCompleteModalOpen.value = true;\n}\n\nfunction showArchiveModal() {\n if (!props.ticket) return;\n isArchiveModalOpen.value = true;\n}\n\n// Handle delete success (navigate away since ticket is gone)\nfunction handleDeleteSuccess() {\n router.push({ name: 'StaffSupportTicketList' });\n}\n\n// Show reject modal\nfunction showRejectModal() {\n rejectReason.value = '';\n rejectError.value = null;\n rejectModal.value?.showModal();\n}\n\n// Close reject modal\nfunction closeRejectModal() {\n rejectModal.value?.close();\n rejectReason.value = '';\n rejectError.value = null;\n}\n\n// Handle approve success (called by ApproveSupportTicketModal)\nasync function handleApproveSuccess() {\n await handleTicketUpdate();\n}\n\n// Handle reject with reason\nasync function handleRejectWithReason() {\n if (!props.ticket) return;\n rejectError.value = null;\n\n try {\n const reasonTrimmed = rejectReason.value.trim();\n\n // Create customer note if reason is provided\n if (reasonTrimmed) {\n await createNote({\n record_id: props.ticket.id,\n record_type: 'support_ticket' as const,\n body: reasonTrimmed,\n tag: null,\n is_internal: false,\n });\n }\n\n // Reject the ticket\n await rejectSupportTicket({ id: props.ticket.id });\n toast.info('Support Ticket rejected.');\n closeRejectModal();\n await handleTicketUpdate();\n } catch (e) {\n const errorMessage = extractRpcErrorMessage(e, 'Failed to reject ticket');\n rejectError.value = errorMessage;\n toast.error(errorMessage);\n }\n}\n\n// Handle ticket update after approve/reject\nasync function handleTicketUpdate() {\n // Refresh ticket data\n if (refreshTicket) {\n await refreshTicket();\n }\n // Refetch notes and record versions to show new system events\n await refetchTimeline();\n}\n\n// Enter edit mode\nfunction enterEditMode() {\n router.push({\n name: route.name || 'StaffViewSupportTicket',\n params: route.params,\n query: { ...route.query, mode: 'edit' },\n });\n}\n\n// Exit edit mode\nasync function exitEditMode() {\n await router.push({\n name: route.name || 'StaffViewSupportTicket',\n params: route.params,\n query: { ...route.query, mode: undefined },\n });\n}\n\n// Handle metadata save success (form does mutation; we refresh and exit)\nasync function handleMetadataSaveSuccess() {\n // Await navigation so edit form fully unmounts before toast (prevents toast from being cut off)\n await exitEditMode();\n await nextTick(); // Wait for Vue DOM updates after route change\n toast.success('Ticket updated successfully');\n // Await refresh so user sees fresh data; spinner stays hidden (isLoading && !ticket)\n if (refreshTicket) {\n await refreshTicket();\n }\n await refetchTimeline();\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAOA,MAAM,iCAAiC,2BAA2B,KAAK,EACrE,cAAc,MACf,CAAC;AAGF,MAAa,mCAAmC,aAC9C,gCACA,4BACA,EACE,cAAc;CACZ,OAAO;CACP,WAAW;CACX,MAAM;CACN,aAAa;CACb,UAAU;CACX,EACF,CACF;;;;;;;;;;;;;;AC0BD,MAAM,sBACJ;AAKF,MAAM,uBAAuB;;;;;;;;;EAY7B,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,oBAAoB;EAC1B,MAAM,qBAAqB;EAE3B,MAAM,EACJ,MACA,OACA,WACA,mBACA,wBACA,oBACE,QAAQ,kCAAkC;GAC5C,WAAW;GACX,uBAAuB;GACvB,aAAa;GACb,WAAW,YAAY;IACrB,MAAM,MAAM,MAAM,QAAQ,cAAc,MAAM;AAE9C,WAAO,EAAE,cADY,OAAO,QAAQ,KAAK,MAAM,KACxB;;GAE1B,CAAC;EAEF,MAAM,EAAE,QAAQ,sBAAsB,SAAS,gBAAgB,aAC5D,KAAK,UAAmC,IAAI,eAAe,cAAc,MAAM,EAChF,EAAE,YAAY,sBAAsB,CACrC;AAED,cACQ,MAAM,SACX,WAAW;AACV,OAAI,QAAQ;AACV,qBAAiB;AACjB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,aAAa,UAAoC;AAC9D,OAAI,CAAC,MAAM,OAAQ;AACnB,SAAM,qBAAqB;IACzB,IAAI,MAAM,OAAO;IACjB,cAAc,SAAS;IACxB,CAAC;;EAIJ,SAAS,gBAAgB;AACvB,UAAO;AACP,SAAM,QACJ,4BAA4B,KAAK,OAAO,aAAa,oBACtD;AACD,QAAK,UAAU;;EAGjB,SAAS,YAAY,OAAwB;GAC3C,MAAM,UAAU,uBAAuB,OAAO,oBAAoB;AAClE,QAAK,eAAe,QAAQ;AAC5B,SAAM,MAAM,QAAQ;;;uBAvIpB,mBAqCS,UAAA;aArCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBAgCM,OAhCN,eAgCM;8BA/BJ,mBAA0D,MAAA,EAAtD,OAAM,qBAAmB,EAAC,2BAAuB,GAAA;IACrD,mBAEI,KAFJ,eAEI,gBADC,MAAA,kBAAiB,CAAA,EAAA,EAAA;IAEtB,YA0BY,MAAA,UAAA,EAAA;KAzBT,gBAAe;KACf,WAAS;KACT,SAAO;KACR,OAAM;KACN,UAAS;;4BAEiB;MAA1B,YAA0B,MAAA,MAAA,CAAA,iBAAA;MACf,MAAA,KAAI,CAAC,eAAA,WAAA,EAAhB,mBAEM,OAFN,cAEM,CADJ,mBAAmD,QAAnD,cAAmD,gBAA1B,MAAA,KAAI,CAAC,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAE3C,mBAEI,KAFJ,cAEI,gBADC,MAAA,mBAAkB,CAAA,EAAA,EAAA;MAEvB,mBAUM,OAVN,cAUM,CATJ,mBAOS,UAAA;OANP,MAAK;OACL,OAAM;OACL,SAAO;OACP,UAAU,MAAA,YAAW;SACvB,YAED,GAAA,aAAA,EACA,YAAiF,MAAA,kBAAA,EAAA;OAA9D,YAAW;OAAmB,gBAAe;;MAElE,YAAmE,MAAA,uBAAA,EAAA,EAA3C,OAAM,oCAAkC,CAAA;;;;OAGpE,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECwBhD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,aAAa,eAAe,CAAC,CAAC,MAAM,QAAQ,YAAY;EAE9D,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,eAAe,IAAmB,KAAK;EAE7C,MAAM,EAAE,QAAQ,eAAe,SAAS,gBAAgB,aACrD,KAAK,UAA0B,IAAI,eAAe,cAAc,MAAM,EACvE,EAAE,YAAY,sBAAsB,CACrC;AAED,cACQ,MAAM,SACX,WAAW;AACV,OAAI,QAAQ;AACV,iBAAa,QAAQ;AACrB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,eAAe;AAC5B,OAAI,CAAC,MAAM,OAAQ;AACnB,gBAAa,QAAQ;AAErB,OAAI;AACF,UAAM,cAAc,EAAE,IAAI,MAAM,OAAO,IAAI,CAAC;AAC5C,UAAM,QAAQ,WAAW,QAAQ,sBAAsB,kBAAkB;AACzE,WAAO;AACP,SAAK,UAAU;YACR,GAAG;IACV,MAAM,UAAU,uBAAuB,GAAG,WAAW,QAAQ,wBAAwB,oBAAoB;AACzG,iBAAa,QAAQ;AACrB,UAAM,MAAM,QAAQ;;;;uBAtGtB,mBAuCS,UAAA;aAvCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBAkCM,OAlCN,cAkCM;IAjCJ,mBAA6G,MAA7G,cAA6G,gBAA5E,WAAA,QAAU,8BAAA,0BAAA,EAAA,EAAA;IAC3C,mBASI,KATJ,cASI,CARc,WAAA,SAAA,WAAA,EAAhB,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAHiB,8GAG5B,CAAA,uBACA,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAHM,kJAGjB,CAAA;IAES,aAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,cAEM,CADJ,mBAA+C,QAA/C,cAA+C,gBAAtB,aAAA,MAAY,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;IAEvC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAOS,UAAA;KANP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,YAAW;OACvB,YAED,GAAA,aAAA,EACA,mBAQS,UAAA;KAPP,MAAK;KACJ,OAAK,eAAE,WAAA,QAAU,oBAAA,kBAAA;KACjB,SAAO;KACP,UAAU,MAAA,YAAW;QAEV,MAAA,YAAW,IAAA,WAAA,EAAvB,mBAAgF,QAAhF,aAAgF,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MAChF,gBAAG,MAAA,YAAW,GAAI,WAAA,QAAU,mBAAA,iBAAyC,WAAA,QAAU,cAAA,UAAA,EAAA,EAAA,CAAA,EAAA,IAAA,aAAA,CAAA,CAAA;OAIrF,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;AClChD,MAAM,kCAAkC,4BAA4B,KAAK,EACvE,iBAAiB,MAClB,CAAC;AAGF,MAAa,oCAAoC,aAC/C,iCACA,6BACA,EACE,iBAAiB;CACf,OAAO;CACP,WAAW;CACX,MAAM;CACN,aAAa;CACb,UAAU;CACX,EACF,CACF;;;;;;;;;;;;;;;;;;;;;;ECuCD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EAEpD,MAAM,gBAAgB,eACpB,MAAM,SACF,uBACE,MAAM,OAAO,cACb,MAAM,OAAO,gBACf,GACA,IACL;EAED,MAAM,EACJ,MACA,OACA,WACA,mBACA,wBACA,oBACE,QAAQ,mCAAmC;GAC7C,WAAW;GACX,uBAAuB;GACvB,aAAa;GACb,WAAW,YAAY;IACrB,MAAM,UAAU,cAAc;AAE9B,WAAO,EAAE,iBADK,YAAY,SAAS,YAAY,QAAQ,SAAS,SAC/B;;GAEpC,CAAC;EAEF,MAAM,EAAE,QAAQ,uBAAuB,SAAS,iBAAiB,aAC9D,KAAK,UACJ,IAAI,eAAe,eAAe,MAAM,EAC1C,EAAE,YAAY,sBAAsB,CACrC;AAED,cACQ,MAAM,SACX,WAAW;AACV,OAAI,QAAQ;AACV,qBAAiB;AACjB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,aAAa,UAAuC;AACjE,OAAI,CAAC,MAAM,OAAQ;AACnB,SAAM,sBAAsB;IAC1B,IAAI,MAAM,OAAO;IACjB,iBAAiB,SAAS;IAC3B,CAAC;;EAIJ,SAAS,gBAAgB;AACvB,UAAO;AACP,SAAM,QAAQ,sCAAsC;AACpD,QAAK,UAAU;;EAGjB,SAAS,YAAY,OAAwB;GAC3C,MAAM,UAAU,uBAAuB,OAAO,qBAAqB;AACnE,QAAK,eAAe,QAAQ;AAC5B,SAAM,MAAM,QAAQ;;;uBArIpB,mBAoCS,UAAA;aApCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBA+BM,OA/BN,cA+BM;8BA9BJ,mBAA0D,MAAA,EAAtD,OAAM,qBAAmB,EAAC,2BAAuB,GAAA;IACrD,mBAII,KAJJ,cAII;+CAJyC,0BAE3C,GAAA;KAAA,mBAAsD,QAAtD,cAAsD,gBAAvB,cAAA,MAAa,EAAA,EAAA;+CAAU,iDAExD,GAAA;;IACA,YAuBY,MAAA,UAAA,EAAA;KAtBT,gBAAe;KACf,WAAS;KACT,SAAO;KACR,OAAM;KACN,UAAS;;4BAEyC;MAAlD,YAAkD,MAAA,MAAA,CAAA,qBAAA,EAAvB,aAAY,UAAQ,CAAA;MACpC,MAAA,KAAI,CAAC,eAAA,WAAA,EAAhB,mBAEM,OAFN,cAEM,CADJ,mBAAmD,QAAnD,cAAmD,gBAA1B,MAAA,KAAI,CAAC,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAE3C,mBAUM,OAVN,cAUM,CATJ,mBAOS,UAAA;OANP,MAAK;OACL,OAAM;OACL,SAAO;OACP,UAAU,MAAA,aAAY;SACxB,YAED,GAAA,aAAA,EACA,YAAmF,MAAA,kBAAA,EAAA;OAAhE,YAAW;OAAoB,gBAAe;;MAEnE,YAAmE,MAAA,uBAAA,EAAA,EAA3C,OAAM,oCAAkC,CAAA;;;;OAGpE,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECkBhD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,eAAe,IAAmB,KAAK;EAC7C,MAAM,iBAAiB,IAAI,GAAG;EAE9B,MAAM,EAAE,QAAQ,mBAAmB,SAAS,iBAAiB,aAC1D,KAAK,OAAe,IAAI,eAAe,kBAAkB,GAAG,EAC7D,EAAE,YAAY,sBAAsB,CACrC;AAED,QACE,OAAO,MAAM,cAAc,MAAM,OAAO,GACvC,CAAC,QAAQ,YAAY;AACpB,OAAI,UAAU,QAAQ;AAGpB,mBAAe,QACb,sFAFA,OAAO,gBAAgB,WAAW,OAAO,aAAa,GAAG,IAK3C,WAAW,OAAO,aAAa,sBAAsB,MACnE;AAGF,iBAAa,QAAQ;AACrB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,gBAAgB;AAC7B,OAAI,CAAC,MAAM,OAAQ;AACnB,gBAAa,QAAQ;AAErB,OAAI;AACF,UAAM,kBAAkB,MAAM,OAAO,GAAG;AACxC,UAAM,QAAQ,0CAA0C;AACxD,WAAO;AACP,SAAK,UAAU;YACR,GAAG;IACV,MAAM,UAAU,uBAAuB,GAAG,oBAAoB;AAC9D,iBAAa,QAAQ;AACrB,UAAM,MAAM,QAAQ;;;;uBAxGtB,mBAgCS,UAAA;aAhCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBA2BM,OA3BN,cA2BM;8BA1BJ,mBAA4D,MAAA,EAAxD,OAAM,qBAAmB,EAAC,6BAAyB,GAAA;IACvD,mBAEI,KAFJ,cAEI,gBADC,eAAA,MAAc,EAAA,EAAA;IAER,aAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,cAEM,CADJ,mBAA+C,QAA/C,cAA+C,gBAAtB,aAAA,MAAY,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;IAEvC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAOS,UAAA;KANP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,aAAY;OACxB,YAED,GAAA,aAAA,EACA,mBAQS,UAAA;KAPP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,aAAY;QAEX,MAAA,aAAY,IAAA,WAAA,EAAxB,mBAAiF,QAAjF,aAAiF,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MACjF,gBAAG,MAAA,aAAY,GAAA,kBAAA,sBAAA,EAAA,EAAA,CAAA,EAAA,GAAA,aAAA,CAAA,CAAA;OAIrB,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECuBhD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,cAAc,IAAmB,KAAK;EAE5C,MAAM,EAAE,QAAQ,cAAc,SAAS,eAAe,aACnD,KAAK,OAAe,IAAI,eAAe,aAAa,GAAG,EACxD,EAAE,YAAY,sBAAsB,CACrC;AAED,cACQ,MAAM,SACX,WAAW;AACV,OAAI,QAAQ;AACV,gBAAY,QAAQ;AACpB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,eAAe;AAC5B,OAAI,CAAC,MAAM,OAAQ;AACnB,eAAY,QAAQ;AAEpB,OAAI;AACF,UAAM,aAAa,MAAM,OAAO,GAAG;AACnC,UAAM,QAAQ,iBAAiB;AAC/B,WAAO;AACP,SAAK,UAAU;YACR,GAAG;IACV,MAAM,UAAU,uBAAuB,GAAG,mBAAmB;AAC7D,gBAAY,QAAQ;AACpB,UAAM,MAAM,QAAQ;;;;uBA9FtB,mBAiCS,UAAA;aAjCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBA4BM,OA5BN,cA4BM;8BA3BJ,mBAAyD,MAAA,EAArD,OAAM,qBAAmB,EAAC,0BAAsB,GAAA;8BACpD,mBAGI,KAAA,EAHD,OAAM,qCAAmC,EAAC,6JAG7C,GAAA;IACW,YAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,cAEM,CADJ,mBAA8C,QAA9C,cAA8C,gBAArB,YAAA,MAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;IAEtC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAOS,UAAA;KANP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,WAAU;OACtB,YAED,GAAA,aAAA,EACA,mBAQS,UAAA;KAPP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,WAAU;QAET,MAAA,WAAU,IAAA,WAAA,EAAtB,mBAA+E,QAA/E,aAA+E,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MAC/E,gBAAG,MAAA,WAAU,GAAA,gBAAA,SAAA,EAAA,EAAA,CAAA,EAAA,GAAA,aAAA,CAAA,CAAA;OAInB,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECsBhD,MAAM,QAAQ;EACd,MAAM,OAAO;EAEb,MAAM,WAAW,IAA8B,KAAK;EACpD,MAAM,cAAc,IAAmB,KAAK;EAE5C,MAAM,gBAAgB,IAAI,GAAG;EAE7B,MAAM,EAAE,QAAQ,qBAAqB,SAAS,gBAAgB,aAC3D,KAAK,UAA0B,IAAI,eAAe,aAAa,MAAM,EACtE,EAAE,YAAY,sBAAsB,CACrC;AAED,QACE,OAAO,MAAM,cAAc,MAAM,OAAO,GACvC,CAAC,QAAQ,YAAY;AACpB,OAAI,UAAU,QAAQ;IACpB,MAAM,gBAAgB,uBACpB,OAAO,cACP,OAAO,gBACR;AAED,kBAAc,QACZ,uFAFiB,kBAAkB,SAAS,kBAAkB,QAKhD,YAAY,cAAc,0BAA0B,MAClE;AAEF,gBAAY,QAAQ;AACpB,aAAS,OAAO,WAAW;SAE3B,UAAS,OAAO,OAAO;KAG3B,EAAE,WAAW,MAAM,CACpB;EAED,SAAS,QAAQ;AACf,YAAS,OAAO,OAAO;AACvB,QAAK,QAAQ;;EAGf,eAAe,eAAe;AAC5B,OAAI,CAAC,MAAM,OAAQ;AACnB,eAAY,QAAQ;AAEpB,OAAI;AACF,UAAM,oBAAoB,EAAE,IAAI,MAAM,OAAO,IAAI,CAAC;IAElD,MAAM,gBAAgB,uBACpB,MAAM,OAAO,cACb,MAAM,OAAO,gBACd;IACD,MAAM,gBACJ,kBAAkB,SAAS,kBAAkB,QACzC,IAAI,cAAc,sBAClB;AAEN,UAAM,QAAQ,sCAAsC,gBAAgB;AACpE,WAAO;AACP,SAAK,UAAU;YACR,GAAG;IACV,MAAM,UAAU,uBAAuB,GAAG,mBAAmB;AAC7D,gBAAY,QAAQ;AACpB,UAAM,MAAM,QAAQ;;;;uBAtHtB,mBAgCS,UAAA;aAhCG;IAAJ,KAAI;IAAW,OAAM;OAC3B,mBA2BM,OA3BN,cA2BM;8BA1BJ,mBAAoE,MAAA,EAAhE,OAAM,qBAAmB,EAAC,qCAAiC,GAAA;IAC/D,mBAEI,KAFJ,cAEI,gBADC,cAAA,MAAa,EAAA,EAAA;IAEP,YAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,cAEM,CADJ,mBAA8C,QAA9C,cAA8C,gBAArB,YAAA,MAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;IAEtC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAOS,UAAA;KANP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,YAAW;OACvB,YAED,GAAA,aAAA,EACA,mBAQS,UAAA;KAPP,MAAK;KACL,OAAM;KACL,SAAO;KACP,UAAU,MAAA,YAAW;QAEV,MAAA,YAAW,IAAA,WAAA,EAAvB,mBAAgF,QAAhF,aAAgF,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MAChF,gBAAG,MAAA,YAAW,GAAA,iBAAA,oBAAA,EAAA,EAAA,CAAA,EAAA,GAAA,aAAA,CAAA,CAAA;OAIpB,mBAEO,QAAA;IAFD,QAAO;IAAS,OAAM;OAC1B,mBAAmD,UAAA;IAA3C,MAAK;IAAU,SAAO;MAAO,QAAK,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;EC8FhD,MAAM,QAAQ;EAEd,MAAM,OAAO;EAUb,MAAM,sBAAsB,eAAe;GACzC,MAAM,KAAK,MAAM,OAAO;AACxB,UAAO,KAAK,iBAAiB,GAAG,CAAC,YAAY;IAC7C;EAEF,MAAM,cAAc,eAAe,MAAM,OAAO,WAAW,YAAY;EACvE,MAAM,aAAa,eAAe,CAAC,CAAC,MAAM,OAAO,YAAY;;UA7InD,WAAA,SAAA,WAAA,EADR,YAeoB,2BAAA;;IAblB,SAAQ;IACR,MAAK;;IAGM,SAAO,cAOP,CANT,mBAMS,UAAA;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;OACb,cAED,CAAA,CAAA;2BAPF,CAAA,OAAA,QAAA,OAAA,MAAA,gBAFD,uGAEC,GAAA,EAAA,CAAA;;SAWW,QAAA,OAAO,oBAAe,aAAA,WAAA,EADnC,YAoBoB,2BAAA;;IAlBlB,SAAQ;IACR,MAAK;;IAGM,SAAO,cAGP;KAFT,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAA0B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;QAAa,YAE9E;KACA,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAAwB,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;QAAY,WAE3E;KACA,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAA0B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,oBAAA;QAAuB,wBAExF;KACA,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAAwB,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;QAAY,WAE3E;;2BAZF,CAAA,OAAA,QAAA,OAAA,MAAA,gBAFD,uCAEC,GAAA,EAAA,CAAA;;SAgBW,QAAA,OAAO,oBAAe,cAAmB,QAAA,OAAO,sBAAA,WAAA,EAD7D,YA2BoB,2BAAA;;IAzBlB,SAAQ;IACR,MAAK;;IAGM,SAAO,cAGP,CAFT,mBAES,UAAA;KAFD,MAAK;KAAS,OAAM;KAA0B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;OAAY,WAE7E,EAAA,CAES,YAAA,SAAA,WAAA,EADT,mBAOS,UAAA;;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,WAAA;OACb,aAED,IAAA,CAEc,WAAA,SAAA,WAAA,EADd,mBAOS,UAAA;;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;OACb,YAED,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA;2BApB0B,CAAA,gBAD7B,kCAC6B,gBAAG,oBAAA,MAAmB,GAAG,MACrD,EAAA,CAAA,CAAA;;SAuBW,QAAA,OAAO,oBAAe,cAAmB,QAAA,OAAO,sBAAA,WAAA,EAD7D,YAsBoB,2BAAA;;IApBlB,SAAQ;IACR,MAAK;;IAGM,SAAO,cAGP;KAFT,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAA0B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;QAAY,WAE7E;MAES,WAAA,SAAA,WAAA,EADT,mBAOS,UAAA;;MALP,MAAK;MACL,OAAM;MACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,UAAA;QACb,YAED,IAAA,mBAAA,QAAA,KAAA;KACA,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAAwB,SAAK,OAAA,QAAA,OAAA,OAAA,WAAE,KAAI,SAAA;QAAY,WAE3E;;2BAf0B,CAAA,gBAD7B,kCAC6B,gBAAG,oBAAA,MAAmB,GAAG,MACrD,EAAA,CAAA,CAAA;;SAiB4B,QAAA,OAAO,oBAAe,cAAA,WAAA,EAApD,YAuBoB,2BAAA;;IAvBiD,SAAQ;IAAO,MAAK;;IAE5E,SAAO,cAQP,CAAA,CANA,YAAA,SAAA,WAAA,EADT,mBAOS,UAAA;;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,QAAA,OAAA,OAAA,WAAE,KAAI,WAAA;OACb,aAED,IAAA,CAEc,WAAA,SAAA,WAAA,EADd,mBAOS,UAAA;;KALP,MAAK;KACL,OAAM;KACL,SAAK,OAAA,QAAA,OAAA,OAAA,WAAE,KAAI,UAAA;OACb,YAED,IAAA,mBAAA,QAAA,KAAA,EACA,mBAES,UAAA;KAFD,MAAK;KAAS,OAAM;KAAwB,SAAK,OAAA,QAAA,OAAA,OAAA,WAAE,KAAI,SAAA;OAAY,WAE3E,CAAA,CAAA;2BAnBF,CAAA,OAAA,QAAA,OAAA,MAAA,gBAF8F,sBAE9F,GAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECwDJ,MAAM,QAAQ;EAEd,MAAM,gBAAgB,OAA0C,gBAAgB;EAEhF,MAAM,4BAA4B,4CAA4C,QAAQ,QACnF,oCAA0D,SAAS,IAAI,MAAM,CAC/E;EAED,MAAM,uBAAuB,IAAI,MAAM;EACvC,MAAM,EAAE,QAAQ,iBAAiB,aAC9B,KAAK,UAAuC,IAAI,eAAe,kBAAkB,MAAM,EACxF,EAAE,YAAY,sBAAsB,CACrC;EAED,MAAM,sBAAsB,eAAe;GACzC,MAAM,IAAI,MAAM;AAChB,OAAI,CAAC,EAAE,gBAAiB,QAAO;AAC/B,OAAI,CAAC,CAAC,YAAY,WAAW,CAAC,SAAS,EAAE,gBAAgB,CAAE,QAAO;GAClE,MAAM,KAAK,EAAE;AACb,OAAI,OAAO,cAAc,OAAO,YAAa,QAAO;AACpD,UAAO;IACP;EAEF,MAAM,iCAAiC,eAAe;GACpD,MAAM,KAAK,MAAM,OAAO;AACxB,OAAI,MAAO,oCAA0D,SAAS,GAAG,CAAE,QAAO;AAC1F,UAAO;IACP;EAEF,eAAe,yBAAyB,iBAAwC;AAC9E,OAAI,CAAE,oCAA0D,SAAS,gBAAgB,CAAE;AAC3F,OAAI,CAAC,cAAe;GACpB,MAAM,IAAI,MAAM;AAChB,wBAAqB,QAAQ;AAC7B,OAAI;IACF,MAAM,WACJ,OAAO,EAAE,aAAa,WAClB,EAAE,WACF,8BAA8B,EAAE,SAAmD;AACzF,UAAM,aAAa;KACjB,IAAI,EAAE;KACN,OAAO,EAAE;KACT,MAAM,EAAE;KACR;KACA,eAAe;KAChB,CAAC;AACF,UAAM,eAAe;aACb;AACR,yBAAqB,QAAQ;;;EAIjC,MAAM,kBAAkB,eAAe;GACrC,MAAM,aAAa,MAAM,QAAQ;AACjC,OAAI,CAAC,WAAY,QAAO;AACxB,UAAO,MAAM,OAAO,4BAA4B;IAChD;EAEF,MAAM,kBAAkB,eACtB,sBACE,MAAM,OAAO,YACb,MAAM,OAAO,mBACb,MAAM,OAAO,GACd,CACF;EAED,MAAM,mBAAmB,eAAe;GACtC,MAAM,KAAK,MAAM,OAAO;AACxB,UAAO,KAAK,iBAAiB,GAAG,CAAC,YAAY;IAC7C;EACF,MAAM,kBAAkB,eAAe;GACrC,MAAM,KAAK,MAAM,OAAO;AACxB,UAAO,KAAK,iBAAiB,GAAG,CAAC,WAAW;IAC5C;EAEF,MAAM,iBAAiB,eACrB,MAAM,OAAO,WAAW,iBAAiB,MAAM,OAAO,SAAU,CAAC,YAAY,GAC9E;EACD,MAAM,gBAAgB,eACpB,MAAM,OAAO,WAAW,iBAAiB,MAAM,OAAO,SAAU,CAAC,WAAW,GAC7E;EAED,MAAM,kBAAkB,eACtB,MAAM,OAAO,YAAY,iBAAiB,MAAM,OAAO,UAAW,CAAC,YAAY,GAChF;EACD,MAAM,iBAAiB,eACrB,MAAM,OAAO,YAAY,iBAAiB,MAAM,OAAO,UAAW,CAAC,WAAW,GAC/E;EAED,MAAM,qBAAqB,eACzB,MAAM,OAAO,eAAe,iBAAiB,MAAM,OAAO,aAAc,CAAC,YAAY,GACtF;EACD,MAAM,oBAAoB,eACxB,MAAM,OAAO,eAAe,iBAAiB,MAAM,OAAO,aAAc,CAAC,WAAW,GACrF;EAED,MAAM,kBAAkB,eAAe;AACrC,OAAI,CAAC,MAAM,OAAO,aAAa,MAAM,OAAO,aAAc,QAAO;AACjE,UAAO,IAAI,KAAK,MAAM,OAAO,UAAU,mBAAG,IAAI,MAAM,IAAI,CAAC,MAAM,OAAO;IACtE;EAEF,MAAM,gBAAgB,eACpB,uBAAuB,MAAM,OAAO,cAAc,MAAM,OAAO,gBAAgB,CAChF;;uBAzPC,mBAsHM,OAtHN,cAsHM,CArHJ,mBAiGM,OAjGN,cAiGM;IAhGJ,YAKgB,uBAAA,EALD,OAAM,UAAQ,EAAA;4BAIzB,CAHF,YAGE,oCAAA;MAFC,mBAAiB,QAAA,OAAO;MACzB,MAAK;;;;IAGT,YAsBgB,uBAAA,EAtBD,OAAM,iBAAe,EAAA;4BAezB,CAbD,oBAAA,SAAA,WAAA,EADR,mBAcS,UAAA;;MAZN,OAAO,+BAAA;MACR,OAAM;MACL,UAAU,qBAAA;MACV,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,yBAA0B,OAAO,OAA6B,MAAK;2BAE5E,mBAMS,UAAA,MAAA,WALO,MAAA,0BAAyB,GAAhC,QAAG;0BADZ,mBAMS,UAAA;OAJN,KAAK,IAAI;OACT,OAAO,IAAI;yBAET,IAAI,MAAK,EAAA,GAAA,aAAA;sCAIH,QAAA,OAAO,iBAAA,WAAA,EADpB,YAIE,wCAAA;;MAFC,iBAAe,QAAA,OAAO;MACvB,MAAK;qDAEP,mBAA2E,QAA3E,cAAyD,cAAW,EAAA,CAAA;;;IAEtE,YAEgB,uBAAA,EAFD,OAAM,QAAM,EAAA;4BAC+B,CAAxD,YAAwD,gCAAA;MAA/B,MAAM,QAAA,OAAO;MAAM,MAAK;;;;IAEnD,YAEgB,uBAAA,EAFD,OAAM,YAAU,EAAA;4BACuC,CAApE,YAAoE,oCAAA;MAAvC,UAAU,QAAA,OAAO;MAAU,MAAK;;;;IAE/D,YAGgB,uBAAA,EAHD,OAAM,YAAU,EAAA;4BAC4B,CAA7C,gBAAA,SAAA,WAAA,EAAZ,mBAAyD,QAAA,cAAA,gBAAzB,gBAAA,MAAe,EAAA,EAAA,KAAA,WAAA,EAC/C,mBAA0E,QAA1E,cAAyD,aAAU,EAAA,CAAA;;;IAErE,YAEgB,uBAAA,EAFD,OAAM,aAAW,EAAA;4BACM,CAAA,gCAAjC,QAAA,OAAO,wBAAuB,EAAA,EAAA,CAAA,CAAA;;;IAEnC,mBASM,OATN,cASM,CARJ,YAOgB,uBAAA,EAPD,OAAM,eAAa,EAAA;KAIrB,OAAK,cACkE,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAhF,mBAAgF,QAAA,EAA1E,OAAM,uCAAqC,EAAC,2BAAuB,GAAA,CAAA,EAAA,CAAA;4BAFvE,CAFK,QAAA,OAAO,aAAa,MAAI,IAAA,WAAA,EAAjC,mBAEI,KAFJ,cAEI,gBADC,QAAA,OAAO,YAAW,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA;;;IAO3B,YAEgB,uBAAA;KAFD,OAAM;KAAa,UAAU;;4BACrB,CAAA,gCAAlB,gBAAA,MAAe,EAAA,EAAA,CAAA,CAAA;;;IAEpB,YAGgB,uBAAA,EAHD,OAAM,WAAS,EAAA;4BACN,CAAA,gCAAnB,iBAAA,MAAgB,GAAG,KACtB,EAAA,EAAY,gBAAA,SAAA,WAAA,EAAZ,mBAAwF,QAAxF,eAA0D,OAAE,gBAAG,gBAAA,MAAe,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA;;;IAEhF,YAMgB,uBAAA,EAND,OAAM,WAAS,EAAA;4BAIjB,CAHK,QAAA,OAAO,YAAA,WAAA,EAAvB,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gCAFN,eAAA,MAAc,GAAG,KACpB,EAAA,EAAA,mBAA+D,QAA/D,eAAmC,OAAE,gBAAG,cAAA,MAAa,EAAA,EAAA,CAAA,uBAEvD,mBAAuE,QAAvE,eAAyD,UAAO,EAAA,CAAA;;;IAElE,YAQgB,uBAAA,EARD,OAAM,UAAQ,EAAA;KAKhB,OAAK,cACkD,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAhE,mBAAgE,QAAA,EAA1D,OAAM,uCAAqC,EAAC,WAAO,GAAA,CAAA,EAAA,CAAA;4BAFpD,CAHK,QAAA,OAAO,aAAA,WAAA,EAAnB,mBAGO,QAAA;;MAHwB,OAAK,eAAA,EAAA,cAAkB,gBAAA,OAAe,CAAA;yCAChE,gBAAA,MAAe,GAAG,KACrB,EAAA,EAAA,mBAAgE,QAAhE,eAAmC,OAAE,gBAAG,eAAA,MAAc,EAAA,EAAA,CAAA;;;IAM1D,YAQgB,uBAAA,EARD,OAAM,aAAW,EAAA;KAKnB,OAAK,cACkD,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAhE,mBAAgE,QAAA,EAA1D,OAAM,uCAAqC,EAAC,WAAO,GAAA,CAAA,EAAA,CAAA;4BAFhD,CAHK,QAAA,OAAO,gBAAA,WAAA,EAAvB,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gCAFN,mBAAA,MAAkB,GAAG,KACxB,EAAA,EAAA,mBAAmE,QAAnE,eAAmC,OAAE,gBAAG,kBAAA,MAAiB,EAAA,EAAA,CAAA;;;IAM7D,YAKgB,uBAAA,EALD,OAAM,WAAS,EAAA;4BAIrB,CAHP,mBAGO,QAHP,eAGO,CAFO,QAAA,OAAO,aAAA,WAAA,EAAnB,mBAA0D,QAA1D,eAAiD,KAAE,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAO,MAC1D,gBAAG,cAAA,MAAa,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA;;;IAGpB,YAKgB,uBAAA,EALD,OAAM,mBAAiB,EAAA;KAEzB,OAAK,cACkD,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAhE,mBAAgE,QAAA,EAA1D,OAAM,uCAAqC,EAAC,WAAO,GAAA,CAAA,EAAA,CAAA;4BAF4B,CAAvE,QAAA,OAAO,iBAAiB,MAAI,IAAA,WAAA,EAA5C,mBAAuF,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gCAApC,QAAA,OAAO,gBAAe,EAAA,EAAA,CAAA;;;QAMjE,QAAA,OAAO,eAAA,WAAA,EAAnB,mBAkBM,OAlBN,eAkBM,CAjBJ,mBAgBS,UAAA;IAhBD,MAAK;IAAS,OAAM;IAAc,SAAK,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,OAAA;qCACpD,mBAaM,OAAA;IAZJ,OAAM;IACN,MAAK;IACL,SAAQ;IACR,gBAAa;IACb,QAAO;IACP,OAAM;OAEN,mBAIE,QAAA;IAHA,kBAAe;IACf,mBAAgB;IAChB,GAAE;6BAEA,UAER,GAAA,CAAA,EAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA;;;;;;;;AC5GN,MAAa,oCAAoC,aAC/C,gCACA,6BACA;CACE,OAAO;EACL,OAAO;EACP,aAAa;EACd;CACD,aAAa;EACX,OAAO;EACP,WAAW;EACX,aAAa;EACd;CACD,MAAM,EAAE,OAAO,QAAQ;CACvB,UAAU;EACR,OAAO;EACP,WAAW;EACX,cAAc;EACd,WAAW;EACZ;CACD,eAAe,EAAE,OAAO,yBAAyB;CACjD,cAAc;EACZ,OAAO;EACP,WAAW;EACX,MAAM;EACN,aAAa;EACd;CACD,iBAAiB;EACf,OAAO;EACP,WAAW;EACX,MAAM;EACN,aAAa;EACd;CACD,UAAU;EACR,OAAO;EACP,WAAW;EACZ;CACD,WAAW;EACT,OAAO;EACP,WAAW;EACZ;CACD,cAAc;EACZ,OAAO;EACP,WAAW;EACZ;CACF,CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC4ED,MAAM,QAAQ;EAEd,MAAM,aAAa,IAAI,MAAM,OAAO,eAAe,GAAG;AACtD,cACQ,MAAM,OAAO,cAClB,MAAM;AACL,cAAW,QAAQ,KAAK;IAE3B;EAED,MAAM,EAAE,MAAM,gBAAgB,UAAU,QAAQ,IAAI,MAAM,gBAAgB,EAAE;GAC1E,UAAU;GACV,WAAW,OAAU;GACtB,CAAC;EAEF,MAAM,OAAO;EAKb,MAAM,EAAE,QAAQ,cAAc,SAAS,aAAa,aACjD,KAAK,UAAuC,IAAI,eAAe,kBAAkB,MAAM,EACxF,EAAE,YAAY,sBAAsB,CACrC;EAED,MAAM,SAAS,eAAe,MAAM,UAAU,SAAS,MAAM;EAE7D,SAAS,mBAAmB,YAAsD;AAChF,OAAI,CAAC,WAAY,QAAO;AACxB,OAAI;AAIF,WAHa,IAAI,KAAK,WAAW,CACV,aAAa,CACT,MAAM,IAAI,CAAC,MACnB;WACb;AACN,WAAO;;;EAIX,SAAS,oBAAoB,YAAsD;AACjF,OAAI,CAAC,cAAc,WAAW,MAAM,KAAK,GAAI,QAAO;AACpD,OAAI;IACF,MAAM,uBAAO,IAAI,KAAK,aAAa,YAAY;AAC/C,QAAI,MAAM,KAAK,SAAS,CAAC,CAAE,QAAO;AAClC,WAAO,KAAK,aAAa;WACnB;AACN,WAAO;;;EAIX,MAAM,EAAE,MAAM,OAAO,WAAW,mBAAmB,2BAA2B,QAC5E,mCACA;GACE,WAAW,4BAA4B,MAAM,OAAO;GACpD,uBAAuB;GACvB,aAAa;GACb,WAAW,YAAY;IACrB,MAAM,IAAI,MAAM;IAWhB,MAAM,eACJ,EAAE,iBAXsB;KACxB;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACD,CAGmB,SAAS,EAAE,cAAmD,GAC3E,EAAE,gBACH;AACN,WAAO;KACL,IAAI,EAAE;KACN,OAAO,EAAE,SAAS;KAClB,aAAa,EAAE,eAAe;KAC9B,MAAM,EAAE;KACR,UAAU,8BAA8B,EAAE,SAAS;KACnD,eAAe;KACf,cAAc,EAAE,cAAc,MAAM,IAAI;KACxC,iBAAiB,EAAE,iBAAiB,MAAM,IAAI;KAC9C,UAAU,mBAAmB,EAAE,SAAS,IAAI;KAC5C,WAAW,mBAAmB,EAAE,UAAU,IAAI;KAC9C,cAAc,mBAAmB,EAAE,aAAa,IAAI;KACrD;;GAEJ,CACF;EAED,SAAS,aAAa,UAAgE;GACpF,MAAM,IAAI,MAAM;GAChB,MAAMC,UAAuC;IAC3C,IAAI,EAAE;IACN,OAAO,OAAO,SAAS,SAAS,GAAG,CAAC,MAAM;IAC1C,aAAc,SAAS,eAA0B;IACjD,MAAM,SAAS;IACf,UAAU,SAAS;IACpB;AAED,OACE,CAAC,YAAY,WAAW,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAC1D,EAAE,kBAAkB,cACpB,EAAE,kBAAkB,aACpB;IACA,MAAM,KAAK,SAAS;AACpB,QACE,OAAO,QACP,OAAO,UACP,OAAO,aACP,OAAO,cACP,OAAO,YAEP,SAAQ,gBAAgB;;AAI5B,OAAI,EAAE,oBAAoB,WAAW;IACnC,MAAM,KAAK,SAAS;AACpB,QAAI,MAAM,QAAQ,OAAO,GACvB,SAAQ,eAAe,OAAO,GAAG,CAAC,MAAM;;AAI5C,OAAI,EAAE,kBAAkB,YAAY;IAClC,MAAM,KAAK,SAAS;AACpB,QAAI,MAAM,QAAQ,OAAO,GACvB,SAAQ,kBAAkB,OAAO,GAAG,CAAC,MAAM;;AAI/C,OACE;IAAC;IAAW;IAAY;IAAW,CAAC,SAAS,EAAE,mBAAmB,GAAG,IACrE,EAAE,kBAAkB,eACpB,EAAE,kBAAkB,YACpB;IACA,MAAM,UAAU,oBAAoB,SAAS,SAA0B;AACvE,QAAI,YAAY,KAAM,SAAQ,WAAW;IACzC,MAAM,WAAW,oBAAoB,SAAS,UAA2B;AACzE,QAAI,aAAa,KAAM,SAAQ,YAAY;;AAG7C,OAAI,EAAE,kBAAkB,cAAc,EAAE,kBAAkB,aAAa;IACrE,MAAM,cAAc,oBAAoB,SAAS,aAA8B;AAC/E,QAAI,gBAAgB,KAAM,SAAQ,eAAe;;AAGnD,WAAQ,cAAc,WAAW,SAAS;AAE1C,UAAO;;EAGT,eAAe,aAAa,UAAmC;AAE7D,SAAM,aADU,aAAa,SAAS,CACX;;EAI7B,SAAS,gBAAgB;AACvB,QAAK,UAAU;;EAGjB,SAAS,YAAY,OAAwB;GAC3C,MAAM,UAAU,uBAAuB,OAAO,0BAA0B;AACxE,QAAK,eAAe,QAAQ;;EAG9B,SAAS,eAAe;AACtB,QAAK,SAAS;;;uBA1Sd,YA4GY,MAAA,UAAA,EAAA;IA3GT,gBAAe;IACf,WAAS;IACT,SAAO;IACR,OAAM;IACN,UAAS;;2BAyFH;KAvFN,mBAuFM,OAvFN,cAuFM;MAtFJ,mBAAA,uBAA2B;MAC3B,mBAEM,OAFN,cAEM,CADJ,YAAqD,MAAA,MAAA,CAAA,YAAA,EAAnC,aAAY,sBAAoB,CAAA,CAAA,CAAA;MAGpD,mBAAA,6BAAiC;MACjC,mBAEM,OAFN,cAEM,CADJ,YAAqF,MAAA,MAAA,CAAA,kBAAA;OAA7D,OAAM;OAAS,aAAY;;MAGrD,mBAAA,SAAa;MACb,mBAEM,OAFN,cAEM,CADJ,YAAmB,MAAA,MAAA,CAAA,UAAA,CAAA,CAAA;MAGrB,mBAAA,sCAA0C;OAC9B,QAAA,OAAO,eAAA,WAAA,EAAnB,mBAUM,OAVN,cAUM,CAAA,OAAA,OAAA,OAAA,KATJ,mBAEQ,SAAA,EAFD,OAAM,SAAO,EAAA,CAClB,mBAAwC,QAAA,EAAlC,OAAM,cAAY,EAAC,WAAQ,CAAA,uBAEnC,mBAKS,UAAA;oEALQ,WAAU,QAAA;OAAE,OAAM;OAAiC,UAAU,OAAA;oCAC5E,mBAAoC,UAAA,EAA5B,OAAM,IAAE,EAAC,cAAU,GAAA,IAAA,UAAA,KAAA,EAC3B,mBAES,UAAA,MAAA,WAFW,MAAA,YAAW,IAAA,EAAA,GAAhB,MAAC;2BAAhB,mBAES,UAAA;QAF+B,KAAK,EAAE;QAAK,OAAO,EAAE;0BACxD,EAAE,MAAK,EAAA,GAAA,aAAA;oDAHG,WAAA,MAAU,CAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAQ7B,mBAAA,aAAiB;MACjB,mBAEM,OAFN,cAEM,CADJ,YAAuB,MAAA,MAAA,CAAA,cAAA,CAAA,CAAA;MAGzB,mBAAA,0FAA8F;+BAElD,SAAS,QAAA,OAAO,mBAAe,GAAA,IAAqB,QAAA,OAAO,kBAAa,cAA6B,QAAA,OAAO,kBAAa,eAAA,WAAA,EADrK,mBASM,OATN,cASM,CADJ,YAA2B,MAAA,MAAA,CAAA,kBAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAG7B,mBAAA,8CAAkD;MACvC,QAAA,OAAO,oBAAe,aAAA,WAAA,EAAjC,mBAEM,OAFN,eAEM,CADJ,YAA6C,MAAA,MAAA,CAAA,kBAAA,EAArB,aAAY,QAAM,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAG5C,mBAAA,kDAAsD;MAC3C,QAAA,OAAO,kBAAa,cAAA,WAAA,EAA/B,mBAEM,OAFN,eAEM,CADJ,YAAgD,MAAA,MAAA,CAAA,qBAAA,EAArB,aAAY,QAAM,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAG/C,mBAAA,gFAAoF;;;;;QAE7B,SAAS,QAAA,OAAO,mBAAe,GAAA,IAAqB,QAAA,OAAO,kBAAa,eAA8B,QAAA,OAAO,kBAAa,cAAA,WAAA,EADjL,mBASM,OATN,eASM,CADJ,YAAmD,MAAA,MAAA,CAAA,cAAA,EAA9B,WAAW,MAAA,gBAAe,EAAA,EAAA,MAAA,GAAA,CAAA,YAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAGjD,mBAAA,iFAAqF;;;;;QAE9B,SAAS,QAAA,OAAO,mBAAe,GAAA,IAAqB,QAAA,OAAO,kBAAa,eAA8B,QAAA,OAAO,kBAAa,cAAA,WAAA,EADjL,mBASM,OATN,eASM,CADJ,YAAoD,MAAA,MAAA,CAAA,eAAA,EAA9B,WAAW,MAAA,gBAAe,EAAA,EAAA,MAAA,GAAA,CAAA,YAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;MAGlD,mBAAA,4DAAgE;MAExD,QAAA,OAAO,kBAAa,cAAmB,QAAA,OAAO,kBAAa,eAAA,WAAA,EADnE,mBAKM,OALN,eAKM,CADJ,YAAuD,MAAA,MAAA,CAAA,kBAAA,EAA9B,WAAW,MAAA,gBAAe,EAAA,EAAA,MAAA,GAAA,CAAA,YAAA,CAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;;KAI5C,MAAA,KAAI,CAAC,eAAA,WAAA,EAAhB,mBAEM,OAFN,eAEM,CADJ,mBAAmD,QAAnD,eAAmD,gBAA1B,MAAA,KAAI,CAAC,YAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;KAE3C,YAAmE,MAAA,uBAAA,EAAA,EAA3C,OAAM,oCAAkC,CAAA;KAEhE,mBAAA,mBAAuB;KACvB,mBAKM,OALN,eAKM,CAJJ,mBAES,UAAA;MAFD,MAAK;MAAS,OAAM;MAAiB,SAAO;MAAe,UAAU,OAAA;QAAQ,YAErF,GAAA,cAAA,EACA,YAAkE,MAAA,kBAAA,EAAA;MAA/C,YAAW;MAAO,gBAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;ECvC1D,MAAM,QAAQ;EAEd,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,WAAW;EAE1B,MAAM,oBAAoB,eAAwC;AAChE,UAAO,MAAM,MAAM,aAAa,aAAa,aAAa;IAC1D;EAEF,SAAS,oBAAoB,OAAgC;AAC3D,UAAO,QAAQ;IACb,MAAM,MAAM;IACZ,OAAO;KACL,GAAG,MAAM;KACT,UAAU,UAAU,aAAa,aAAa;KAC/C;IACF,CAAC;;EAGJ,MAAM,eAAe,IAAmD,KAAK;EAO7E,MAAM,sBAAsB,eAA+B;GACzD,MAAMC,QAAwB,EAAE;AAEhC,QAAK,MAAM,QAAQ,MAAM,iBAAiB,EAAE,CAC1C,OAAM,KAAK;IACT,MAAM;IACN,WAAW,KAAK;IAChB,IAAI,iBAAiB,KAAK,UAAU,GAAG,KAAK;IAC5C,MAAM;IACP,CAAC;AAGJ,QAAK,MAAM,QAAQ,MAAM,iBAAiB,EAAE,CAC1C,OAAM,KAAK;IACT,MAAM;IACN,WAAW,KAAK;IAChB,IAAI,iBAAiB,KAAK,UAAU,GAAG,KAAK;IAC5C,MAAM;IACP,CAAC;AAGJ,QAAK,MAAM,SAAS,MAAM,gBAAgB,EAAE,CAC1C,OAAM,KAAK;IACT,MAAM;IACN,WAAW,MAAM;IACjB,IAAI,MAAM;IACV,MAAM;IACP,CAAC;AAGJ,SAAM,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC;AACvF,UAAO;IACP;EAEF,SAAS,aAAa;AACpB,gBAAa,OAAO,OAAO;;AAG7B,WAAa,EAAE,YAAY,CAAC;;uBAnI1B,mBAqCM,OArCN,cAqCM;IApCJ,YAOE,2BAAA;cANI;KAAJ,KAAI;KACH,oBAAkB;KAClB,UAAQ,CAAA,CAAI,QAAA,OAAO;KACnB,aAAW,kBAAA;KACX,aAAW,QAAA;KACX,qBAAkB;;;;;;IAGb,oBAAA,MAAoB,WAAM,KAAA,WAAA,EADlC,mBAKI,KALJ,cAGC,qBAED,IAAA,mBAAA,QAAA,KAAA;sBACA,mBAqBW,UAAA,MAAA,WArBc,oBAAA,QAAR,SAAI;6DAA+B,KAAK,IAAA,GAE/C,KAAK,SAAI,mBAAwB,KAAK,SAAI,mBAAA,WAAA,EADlD,YAOe,sBAAA;;MALZ,eAAa,KAAK,KAAK;MACvB,cAAY,KAAK,KAAK;MACtB,SAAS,KAAK,SAAI,kBAAA,aAAA;;6BAEO,CAAA,gCAAvB,KAAK,KAAK,QAAI,GAAA,EAAA,EAAA,CAAA,CAAA;;;;;;WAGN,KAAK,SAAI,kBAAA,WAAA,EADtB,YAWE,6BAAA;;MATC,QAAQ,KAAK,KAAK;MAClB,SAAS,KAAK,KAAK;MACnB,WAAW,KAAK,KAAK;MACrB,QAAQ,KAAK,KAAK;MAClB,MAAM,KAAK,KAAK;MAChB,SAAS,KAAK,KAAK;MACnB,aAAW,KAAK,KAAK;MACrB,aAAW,KAAK,KAAK;MACrB,SAAS,KAAK,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC0E5B,MAAM,QAAQ;EAEd,MAAM,WAAW,IAAI,MAAM;EAC3B,MAAM,iBAAiB,IAAI,GAAG;EAG9B,MAAM,EACJ,MAAM,iBACN,SAAS,oBACT,SAAS,uBACP,UACD,QAAQ,IAAI,eAAe,qBAAqB,MAAM,gBAAgB,EACvE;GACE,SAAS,eAAe,CAAC,CAAC,MAAM,gBAAgB;GAChD,UAAU,8BAA8B,MAAM;GAC/C,CACF;EAED,MAAM,cAAc,eAA0C;AAC5D,UAAO,gBAAgB,SAAS,EAAE;IAClC;EAGF,MAAM,EAAE,MAAM,cAAc,UAIzB,QAAQ,IAAI,MAAM,sBAAsB,EACzC,EAAE,WAAW,MAAU,KAAM,CAC9B;EAED,MAAM,iBAAiB,eAAe;GACpC,MAAM,QAAQ,UAAU,SAAS,EAAE;GACnC,MAAM,cAAc,IAAI,IAAI,YAAY,MAAM,KAAK,MAAM,EAAE,QAAQ,CAAC;AACpE,UAAO,MAAM,QAAQ,MAAM,CAAC,YAAY,IAAI,EAAE,GAAG,CAAC;IAClD;EAGF,MAAM,EAAE,QAAQ,eAAe,SAAS,iBAAiB,aAKtD,KAAK,UAAU,IAAI,eAAe,mBAAmB,MAAM,EAC5D,EAAE,YAAY,+BAA+B,CAC9C;EAGD,MAAM,EAAE,QAAQ,qBAAqB,aAKlC,KAAK,UAAU,IAAI,eAAe,sBAAsB,MAAM,EAC/D,EAAE,YAAY,+BAA+B,CAC9C;EAED,MAAM,kBAAkB,IAAmB,KAAK;EAEhD,eAAe,sBAAsB;AACnC,OAAI,CAAC,eAAe,MAAO;AAE3B,OAAI;AACF,UAAM,cAAc;KAClB,mBAAmB,MAAM;KACzB,SAAS,eAAe;KACzB,CAAC;AACF,UAAM,QAAQ,mBAAmB;AACjC,mBAAe,QAAQ;AACvB,UAAM,oBAAoB;YACnB,GAAG;AACV,UAAM,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;;;EAItE,eAAe,uBAAuB,cAAsB;AAC1D,OAAI;AACF,oBAAgB,QAAQ;AACxB,UAAM,iBAAiB;KACrB,iBAAiB,MAAM;KACvB;KACD,CAAC;AACF,UAAM,QAAQ,qBAAqB;AACnC,UAAM,oBAAoB;YACnB,GAAG;AACV,UAAM,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;aAC7D;AACR,oBAAgB,QAAQ;;;;UAnMf,QAAA,mBAAA,WAAA,EAAX,mBAyFM,OAzFN,cAyFM,CAxFJ,mBAuFM,OAvFN,cAuFM;mBAtFJ,mBAA4C,SAAA;KAArC,MAAK;kEAAoB,SAAQ,QAAA;qCAAR,SAAA,MAAQ,CAAA,CAAA;IACxC,mBAkBM,OAlBN,cAkBM,CAjBJ,mBAgBM,OAhBN,cAgBM,CAAA,OAAA,OAAA,OAAA,KAfJ,mBAaM,OAAA;KAZJ,OAAM;KACN,OAAM;KACN,MAAK;KACL,SAAQ;KACR,QAAO;QAEP,mBAKE,QAAA;KAJA,kBAAe;KACf,mBAAgB;KAChB,gBAAa;KACb,GAAE;eAGN,mBAAmD,QAAA,MAA7C,kBAAa,gBAAG,YAAA,MAAY,OAAM,GAAG,KAAC,EAAA,CAAA,CAAA,CAAA,CAAA;IAGhD,mBAiEM,OAjEN,cAiEM,CAhEJ,mBA+DM,OA/DN,cA+DM;KA9DJ,mBAAA,mBAAuB;MACX,QAAA,UAAA,WAAA,EAAZ,mBA4BM,OA5BN,cA4BM,CA3BJ,mBAkBM,OAlBN,cAkBM,CAAA,OAAA,OAAA,OAAA,KAjBJ,mBAEQ,SAAA,EAFD,OAAM,cAAY,EAAA,CACvB,mBAAsD,QAAA,EAAhD,OAAM,sBAAoB,EAAC,iBAAc,CAAA,uBAEjD,mBAaS,UAAA;mEAZE,eAAc,QAAA;MACvB,OAAM;MACL,UAAU,MAAA,aAAY;mCAEvB,mBAAwC,UAAA,EAAhC,OAAM,IAAE,EAAC,kBAAc,GAAA,IAAA,UAAA,KAAA,EAC/B,mBAMS,UAAA,MAAA,WALQ,eAAA,QAAR,SAAI;0BADb,mBAMS,UAAA;OAJN,KAAK,KAAK;OACV,OAAO,KAAK;yBAEV,KAAK,MAAK,EAAA,GAAA,cAAA;mDAVN,eAAA,MAAc,CAAA,CAAA,CAAA,CAAA,EAc3B,mBAOS,UAAA;MANP,OAAM;MACL,UAAQ,CAAG,eAAA,SAAkB,MAAA,aAAY;MACzC,SAAO;SAEI,MAAA,aAAY,IAAA,WAAA,EAAxB,mBAA4E,QAA5E,cAA4E,KAAA,WAAA,EAC5E,mBAAuB,QAAA,eAAV,MAAG,EAAA,EAAA,GAAA,cAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;KAIpB,mBAAA,oBAAwB;KACb,MAAA,mBAAkB,IAAA,WAAA,EAA7B,mBAEM,OAFN,eAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAEnC,YAAA,MAAY,WAAM,KAAA,WAAA,EAAjC,mBAEK,MAFL,eAAqF,uBAErF,KAAA,WAAA,EACA,mBAuBK,MAvBL,eAuBK,EAAA,UAAA,KAAA,EAtBH,mBAqBK,UAAA,MAAA,WApBW,YAAA,QAAP,QAAG;0BADZ,mBAqBK,MAAA;OAnBF,KAAK,IAAI;OACV,OAAM;UAEN,mBAEO,QAFP,eAEO,gBADF,IAAI,wBAAwB,IAAI,QAAO,EAAA,EAAA,EAAA,CAGnC,QAAA,UAAA,WAAA,EADT,mBAYS,UAAA;;OAVP,MAAK;OACL,OAAM;OACN,cAAW;OACV,UAAK,WAAE,uBAAuB,IAAI,GAAE;OACpC,UAAU,gBAAA,UAAoB,IAAI;UAEvB,gBAAA,UAAoB,IAAI,MAAA,WAAA,EAApC,mBAA0F,QAA1F,cAA0F,KAAA,WAAA,EAC1F,mBAEM,OAFN,eAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAiG,QAAA;OAA3F,kBAAe;OAAQ,mBAAgB;OAAQ,gBAAa;OAAI,GAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC6I1F,MAAM,QAAQ;EAEd,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,WAAW;EAC1B,MAAM,oBAAoB,MAAM,OAAO;EAEvC,MAAM,qBAAqB,IAAI,MAAM;EACrC,MAAM,oBAAoB,IAAI,MAAM;EACpC,MAAM,oBAAoB,IAAI,MAAM;EACpC,MAAM,+BAA+B,IAAI,MAAM;EAC/C,MAAM,sBAAsB,IAAI,MAAM;EACtC,MAAM,qBAAqB,IAAI,MAAM;EACrC,MAAM,cAAc,IAA8B,KAAK;EACvD,MAAM,eAAe,IAAI,GAAG;EAC5B,MAAM,cAAc,IAAmB,KAAK;EAG5C,MAAM,aAAa,eAAe,MAAM,MAAM,SAAS,OAAO;EAG9D,MAAM,gBAAgB,OAA0C,gBAAgB;EAGhF,MAAM,EAAE,MAAM,cAAc,SAAS,oBAAoB,SACvD,OAAO,QAAQ;GACb,MAAM,CAAC,eAAe,eAAe,kBAAkB,MAAM,QAAQ,IAAI;IACvE,IAAI,MAAM,SAAS;KACjB,WAAW;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAmB;KACnE,aAAa;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAkB;KACpE,aAAa;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAO;KACzD,OAAO;KACP,QAAQ;KACR,eAAe;KAChB,CAAC;IACF,IAAI,MAAM,SAAS;KACjB,WAAW;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAmB;KACnE,aAAa;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAkB;KACpE,aAAa;MAAE,UAAU,UAAU;MAAQ,OAAO;MAAM;KACxD,OAAO;KACP,QAAQ;KACR,eAAe;KAChB,CAAC;IACF,IAAI,eAAe,4BACjB,mBACA,YAAY,gBACZ;KACE,cAAc,CAAC,YAAY,gBAAgB,YAAY,wBAAwB;KAC/E,OAAO;KACP,QAAQ;KACR,eAAe;KAChB,CACF;IACF,CAAC;AACF,UAAO;IAAE;IAAe;IAAe;IAAgB;KAEzD;GACE,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,MAAM;GACxC,WAAW,WAAW;GACtB,gBAAgB;GACjB,CACF;EASD,MAAM,2BAA2B,eAAkC;AAEjE,WADc,aAAa,OAAO,eAAe,SAAS,EAAE,EAC/C,KAAK,OAAO;IACvB,YAAY,EAAE,2BAA2B,EAAE,cAAc;IACzD,WAAW,EAAE;IACb,MAAM,EAAE,QAAQ;IACjB,EAAE;IACH;EAEF,MAAM,2BAA2B,eAAkC;AAEjE,WADc,aAAa,OAAO,eAAe,SAAS,EAAE,EAC/C,KAAK,OAAO;IACvB,YAAY,EAAE,2BAA2B,EAAE,cAAc;IACzD,WAAW,EAAE;IACb,MAAM,EAAE,QAAQ;IACjB,EAAE;IACH;EAGF,MAAM,0BAA0B,eAAe;GAC7C,MAAM,OAAO,aAAa,OAAO;GACjC,MAAM,WAAW,MAAM,SAAS,EAAE;GAClC,MAAM,iBAAiB,MAAM;AAE7B,UAAO,oBAAoB,UADR,iBAAiB,IAAI,IAAI,OAAO,QAAQ,eAAe,CAAC,GAAG,OAC9B;IAChD;EAGF,MAAM,EAAE,QAAQ,eAAe,aAC5B,KAAK,UAAyB,IAAI,MAAM,WAAW,MAAM,EAC1D,EAAE,YAAY,YAAY,CAC3B;EAGD,MAAM,EAAE,QAAQ,qBAAqB,SAAS,gBAAgB,aAC3D,KAAK,UAA0B,IAAI,eAAe,aAAa,MAAM,EACtE,EAAE,YAAY,sBAAsB,CACrC;EAGD,eAAe,cAAc,SAG1B;AACD,OAAI;AACF,UAAM,WAAW;KACf,WAAW;KACX,aAAa;KACb,MAAM,QAAQ;KACd,KAAK;KACL,aAAa,QAAQ,aAAa;KACnC,CAAC;AACF,UAAM,iBAAiB;AACvB,UAAM,QAAQ,QAAQ,aAAa,aAAa,wBAAwB,aAAa;WAC/E;AACN,UAAM,MAAM,qBAAqB;AACjC,UAAM,IAAI,MAAM,qBAAqB;;;EAKzC,SAAS,mBAAmB;AAC1B,OAAI,CAAC,MAAM,OAAQ;AACnB,sBAAmB,QAAQ;;EAI7B,SAAS,kBAAkB;AACzB,OAAI,CAAC,MAAM,OAAQ;AACnB,qBAAkB,QAAQ;;EAI5B,SAAS,kBAAkB;AACzB,OAAI,CAAC,MAAM,OAAQ;AACnB,qBAAkB,QAAQ;;EAI5B,SAAS,6BAA6B;AACpC,OAAI,CAAC,MAAM,OAAQ;AACnB,gCAA6B,QAAQ;;EAIvC,SAAS,oBAAoB;AAC3B,OAAI,CAAC,MAAM,OAAQ;AACnB,uBAAoB,QAAQ;;EAG9B,SAAS,mBAAmB;AAC1B,OAAI,CAAC,MAAM,OAAQ;AACnB,sBAAmB,QAAQ;;EAI7B,SAAS,sBAAsB;AAC7B,UAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;;EAIjD,SAAS,kBAAkB;AACzB,gBAAa,QAAQ;AACrB,eAAY,QAAQ;AACpB,eAAY,OAAO,WAAW;;EAIhC,SAAS,mBAAmB;AAC1B,eAAY,OAAO,OAAO;AAC1B,gBAAa,QAAQ;AACrB,eAAY,QAAQ;;EAItB,eAAe,uBAAuB;AACpC,SAAM,oBAAoB;;EAI5B,eAAe,yBAAyB;AACtC,OAAI,CAAC,MAAM,OAAQ;AACnB,eAAY,QAAQ;AAEpB,OAAI;IACF,MAAM,gBAAgB,aAAa,MAAM,MAAM;AAG/C,QAAI,cACF,OAAM,WAAW;KACf,WAAW,MAAM,OAAO;KACxB,aAAa;KACb,MAAM;KACN,KAAK;KACL,aAAa;KACd,CAAC;AAIJ,UAAM,oBAAoB,EAAE,IAAI,MAAM,OAAO,IAAI,CAAC;AAClD,UAAM,KAAK,2BAA2B;AACtC,sBAAkB;AAClB,UAAM,oBAAoB;YACnB,GAAG;IACV,MAAM,eAAe,uBAAuB,GAAG,0BAA0B;AACzE,gBAAY,QAAQ;AACpB,UAAM,MAAM,aAAa;;;EAK7B,eAAe,qBAAqB;AAElC,OAAI,cACF,OAAM,eAAe;AAGvB,SAAM,iBAAiB;;EAIzB,SAAS,gBAAgB;AACvB,UAAO,KAAK;IACV,MAAM,MAAM,QAAQ;IACpB,QAAQ,MAAM;IACd,OAAO;KAAE,GAAG,MAAM;KAAO,MAAM;KAAQ;IACxC,CAAC;;EAIJ,eAAe,eAAe;AAC5B,SAAM,OAAO,KAAK;IAChB,MAAM,MAAM,QAAQ;IACpB,QAAQ,MAAM;IACd,OAAO;KAAE,GAAG,MAAM;KAAO,MAAM;KAAW;IAC3C,CAAC;;EAIJ,eAAe,4BAA4B;AAEzC,SAAM,cAAc;AACpB,SAAM,UAAU;AAChB,SAAM,QAAQ,8BAA8B;AAE5C,OAAI,cACF,OAAM,eAAe;AAEvB,SAAM,iBAAiB;;;;2DA/dvB,mBAAA,wEAA4E,EACjE,QAAA,aAAS,CAAK,QAAA,UAAA,WAAA,EAAzB,mBAEM,OAFN,YAEM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAIlC,QAAA,SAAA,WAAA,EAAhB,mBAsBM,UAAA,EAAA,KAAA,GAAA,EAAA,CAvBN,mBAAA,gBAAoB,EACpB,mBAsBM,OAtBN,YAsBM,CAAA,OAAA,OAAA,OAAA,KArBJ,mBAYM,OAAA;IAXJ,OAAM;IACN,OAAM;IACN,MAAK;IACL,SAAQ;OAER,mBAKE,QAAA;IAJA,kBAAe;IACf,mBAAgB;IAChB,gBAAa;IACb,GAAE;cAGN,mBAOM,OAPN,YAOM,CANJ,mBAAuD,QAAA,MAAA,gBAA9C,QAAA,MAAM,WAAO,oBAAA,EAAA,EAAA,EACtB,mBAIM,OAJN,YAIM,CAHJ,YAEc,wBAAA;IAFA,IAAI,EAAA,MAAA,0BAAkC;IAAE,OAAM;;2BAE5D,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFgF,4BAEhF,GAAA,CAAA,EAAA,CAAA;;uBAMU,QAAA,UAAA,WAAA,EAAhB,mBA2JM,UAAA,EAAA,KAAA,GAAA,EAAA,CA5JN,mBAAA,iBAAqB,EACrB,mBA2JM,OA3JN,YA2JM;IA1JJ,mBAAA,WAAe;IACf,mBAIM,OAJN,YAIM,CAHJ,mBAEK,MAFL,YAEK,gBADA,QAAA,OAAO,MAAK,EAAA,EAAA,CAAA,CAAA;IAInB,mBAAA,sDAA0D;IAC1D,mBAWM,OAXN,YAWM,CAVJ,YASE,2BAAA;KARC,QAAQ,QAAA;KACR,WAAS;KACT,UAAQ;KACR,UAAQ;KACR,qBAAqB;KACrB,UAAQ;KACR,YAAU;KACV,WAAS;;IAId,mBAAA,kBAAsB;IACtB,YAKE,mCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,mBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,mBAAA,QAAkB;KACzB,WAAS;;IAGZ,mBAAA,iBAAqB;IACrB,YAKE,kCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,kBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,kBAAA,QAAiB;KACxB,WAAS;;IAGZ,mBAAA,iBAAqB;IACrB,YAKE,kCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,kBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,kBAAA,QAAiB;KACxB,WAAS;;IAGZ,mBAAA,8BAAkC;IAClC,YAKE,gCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,6BAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,6BAAA,QAA4B;KACnC,WAAS;;IAGZ,mBAAA,mBAAuB;IACvB,YAKE,oCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,oBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,oBAAA,QAAmB;KAC1B,WAAS;;IAGZ,mBAAA,kBAAsB;IACtB,YAKE,mCAAA;KAJC,QAAQ,QAAA;KACR,WAAS,mBAAA;KACT,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,mBAAA,QAAkB;KACzB,WAAS;;IAGZ,mBAAA,6BAAiC;IACjC,mBAsCS,UAAA;cAtCG;KAAJ,KAAI;KAAc,OAAM;QAC9B,mBAiCM,OAjCN,YAiCM;iCAhCJ,mBAAgD,MAAA,EAA5C,OAAM,qBAAmB,EAAC,iBAAa,GAAA;iCAC3C,mBAEI,KAAA,EAFD,OAAM,qCAAmC,EAAC,yDAE7C,GAAA;KACA,mBAWM,OAXN,aAWM,CAAA,OAAA,QAAA,OAAA,MAVJ,mBAEQ,SAAA,EAFD,OAAM,SAAO,EAAA,CAClB,mBAAqE,QAAA,EAA/D,OAAM,kCAAgC,EAAC,oBAAiB,CAAA,uBAEhE,mBAMY,YAAA;mEALD,aAAY,QAAA;MACrB,OAAM;MACN,MAAK;MACL,aAAY;MACX,UAAU,MAAA,YAAW;6CAJb,aAAA,MAAY,CAAA,CAAA,CAAA,CAAA;KAOd,YAAA,SAAA,WAAA,EAAX,mBAEM,OAFN,aAEM,CADJ,mBAA8C,QAA9C,aAA8C,gBAArB,YAAA,MAAW,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,QAAA,KAAA;KAEtC,mBAYM,OAZN,aAYM,CAXJ,mBAES,UAAA;MAFD,OAAM;MAAiB,SAAO;MAAmB,UAAU,MAAA,YAAW;QAAE,YAEhF,GAAA,YAAA,EACA,mBAOS,UAAA;MANP,OAAM;MACL,SAAO;MACP,UAAU,MAAA,YAAW;SAEV,MAAA,YAAW,IAAA,WAAA,EAAvB,mBAAgF,QAAhF,YAAgF,IAAA,mBAAA,QAAA,KAAA,EAAA,gBAAA,MAChF,gBAAG,MAAA,YAAW,GAAA,iBAAA,gBAAA,EAAA,EAAA,CAAA,EAAA,GAAA,YAAA,CAAA,CAAA;QAIpB,mBAEO,QAAA;KAFD,QAAO;KAAS,OAAM;QAC1B,mBAAgD,UAAA,EAAvC,SAAO,kBAAgB,EAAE,QAAK,CAAA,CAAA,CAAA;IAI3C,mBAAA,oCAAwC;IACxC,mBAQM,OARN,aAQM,CAAA,CAPsB,WAAA,SAAA,WAAA,EAA1B,YAA+E,2BAAA;;KAAxC,QAAQ,QAAA;KAAS,QAAM;6CAC9D,YAKE,+BAAA;;KAHC,QAAQ,QAAA;KACR,WAAS;KACT,UAAQ;;IAIb,mBAAA,mFAAuF;IACvF,mBAQM,OARN,aAQM,CAPJ,YAME,6CAAA;KALC,aAAW,QAAA,OAAO;KAClB,QAAM,CAAA,CAAI,QAAA,OAAO;KACjB,UAAQ,CAAG,QAAA,OAAO;KAClB,YAAU,MAAA,gBAAe;KACzB,WAAS,MAAA,gBAAe;;;;;;;;IAI7B,mBAAA,gBAAoB;IACpB,mBAKM,OALN,aAKM,CAJJ,YAGE,6CAAA;KAFC,qBAAmB,QAAA,OAAO;KAC1B,QAAM,CAAA,CAAI,QAAA,OAAO;;IAItB,mBAAA,yFAA6F;IAC7F,mBAYM,OAAA,MAAA,CAVI,MAAA,aAAY,IAAA,QAAA,WAAA,EADpB,YAOE,uBAAA;;KALC,QAAQ,QAAA;KACR,kBAAgB,yBAAA;KAChB,kBAAgB,yBAAA;KAChB,iBAAe,wBAAA;KACf,eAAa;;;;;;wBAEhB,mBAEM,OAFN,aAEM,CAAA,GAAA,OAAA,QAAA,OAAA,MAAA,CADJ,mBAAwD,QAAA,EAAlD,OAAM,sCAAoC,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,EAAA,CAAA"}
|