{"version":3,"file":"AuthenticationContext-Jt5O6Vfq.js","sources":["../../src/features/authentication/queries/useAuthenticatedUser.ts","../../src/features/authentication/queries/useRequestStatus.ts","../../src/features/authentication/utils/index.ts","../../src/features/authentication/types/index.ts","../../src/features/authentication/mutations/useChangePassword.ts","../../src/features/authentication/components/ChangePasswordModal.tsx","../../src/features/authentication/context/AuthenticationContext.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport type { SaivaProduct, UserMeRead } from 'types/api'\nimport { apiClient } from '@services/api/api-client'\n\nexport const authenticatedUserQueryKey = ['me']\n\nexport function useAuthenticatedUser(\n product?: SaivaProduct\n) {\n async function getAuthenticatedUser() {\n const response = await apiClient.get('v3/users/me')\n return response.data\n }\n\n return useQuery({\n queryFn: getAuthenticatedUser,\n queryKey: [...authenticatedUserQueryKey, product]\n })\n}\n","import { useMemo } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiClient } from '../../../services/api'\nimport { FcmStatusRead } from '../../../types/api'\n\nexport const statusRequestQueryKey = ['fcm_status']\n\nconst numberOfRetries =\n import.meta.env.VITE_REACT_APP_LOGIN_NUMBER_OF_RETRIES || 12\nconst retryInterval =\n import.meta.env.VITE_REACT_APP_LOGIN_RERTY_INTERVAL || 5000\n\nexport function useRequestStatus(searchParams: URLSearchParams) {\n const [, setSearchParams] = useSearchParams()\n const params = useMemo(\n function getParams(): URLSearchParams {\n const params = new URLSearchParams(searchParams)\n\n return params\n },\n [searchParams]\n )\n\n async function getStatus() {\n const res = await apiClient.get(\n `v2/auth/fcm_status?${params.toString()}`\n )\n return res.data\n }\n\n function expireStatus(\n count: number,\n query: FcmStatusRead | undefined\n ): number | false {\n if (query?.status === 'Pending') {\n if (count > numberOfRetries) {\n setSearchParams((params) => {\n const p = new URLSearchParams(params)\n p.append('expired', 'true')\n return p\n })\n\n return false\n }\n\n return retryInterval\n } else {\n return false\n }\n }\n\n return useQuery({\n queryFn: getStatus,\n queryKey: statusRequestQueryKey,\n gcTime: 0,\n refetchInterval: (query) =>\n expireStatus(query.state.dataUpdateCount, query.state.data)\n })\n}\n","import { mixpanelInstance } from '@utils/mixpanel'\nimport { SaivaProduct, UserMeRead } from 'types/api'\n\nexport const LAST_APP_KEY = 'mysaiva-last-app'\nexport const APP_PATHS: Record = {\n [SaivaProduct.Upt]: '/upt',\n [SaivaProduct.WoundCare]: '/wounds',\n [SaivaProduct.Therapy]: '/therapy'\n}\n\nexport function selectAppPath(\n user: UserMeRead | undefined,\n storage: Storage\n): string {\n if (!user) return '/login'\n\n const products = user.product_list\n\n if (products.length == 0) return '/error'\n\n const lastApp = storage.getItem(LAST_APP_KEY) as SaivaProduct | null\n\n if (!lastApp) return APP_PATHS[products[0]]\n if (!products.includes(lastApp)) return APP_PATHS[products[0]]\n\n return APP_PATHS[lastApp]\n}\n\nexport function trackLastUsedApp(appName: string, storage: Storage) {\n storage.setItem(LAST_APP_KEY, appName)\n}\n\nexport function getCurrentProduct(\n user: UserMeRead | undefined,\n storage: Storage\n): SaivaProduct | undefined {\n if (!user) return undefined\n\n const pathnameWithProduct = window.location.pathname.split('/')[1] as\n | SaivaProduct\n | undefined\n\n if (\n pathnameWithProduct &&\n Object.values(SaivaProduct).includes(pathnameWithProduct)\n ) {\n mixpanelInstance.setProduct(pathnameWithProduct as SaivaProduct)\n return pathnameWithProduct as SaivaProduct\n }\n\n const products = user.product_list\n\n if (products.length == 0) return undefined\n\n const lastApp = storage.getItem(LAST_APP_KEY) as SaivaProduct | null\n\n if (!lastApp) return products[0]\n if (!products.includes(lastApp)) return products[0]\n\n mixpanelInstance.setProduct(lastApp)\n\n return lastApp as SaivaProduct\n}\n\nexport function getNumberOfDaysUntilExpiration(\n expirationDate: Date | string | null | undefined\n): number | undefined {\n if (!expirationDate) return undefined\n\n const targetDate = new Date(expirationDate)\n if (isNaN(targetDate.getTime())) return undefined\n\n const now = new Date()\n const diff = targetDate.getTime() - now.getTime()\n\n // Convert milliseconds to days, including partial days\n return Math.floor(diff / (1000 * 60 * 60 * 24))\n}\n","import type { SaivaProduct, UserMeRead } from 'types/api'\n\nexport enum AuthSearchParams {\n ShouldAutoLogin = 'sal',\n Email = 'email',\n Username = 'username',\n UsernameLogin = 'username_login'\n}\n\nexport enum AuthenticationStatus {\n Loading = 'LOADING',\n LoggedIn = 'LOGGED_IN',\n LoggedOut = 'LOGGED_OUT'\n}\n\nexport enum UserPermission {\n INTEGRATIONS_CONNECT = 'integrations_connect',\n INVITATIONS_DELETE = 'invitations_delete',\n FACILITIES_READ_ACCESSIBLE = 'facilities_read_accessible',\n ORGANIZATIONS_EDIT = 'organizations_edit',\n DASHBOARD_READ = 'dashboard_read',\n INTEGRATIONS_READ = 'integrations_read',\n INTEGRATIONS_UPDATE = 'integrations_update',\n USERS_EDIT = 'users_edit',\n FACILITIES_READ = 'facilities_read',\n ANALYTICS_READ = 'analytics_read',\n REGIONS_DELETE = 'regions_delete',\n VISITS_EDIT = 'visits_edit',\n INVITATIONS_CREATE = 'invitations_create',\n INVITATIONS_RESEND = 'invitations_resend',\n VISITS_READ = 'visits_read',\n REGION_CREATE = 'regions_create',\n ORGANIZATIONS_READ = 'organizations_read',\n INTEGRATIONS_DELETE = 'integrations_delete',\n REGION_EDIT = 'regions_edit',\n INVITATIONS_READ = 'invitations_read',\n ORGANIZATION_BRANDING_READ_WRITE = 'organization_branding_read_write',\n REPORTS_READ = 'reports_read',\n FACILITIES_EDIT = 'facilities_edit',\n WOUNDS_READ = 'wound_care_read',\n WOUNDS_EDIT = 'wound_care_edit'\n}\n\nexport enum OrgProductFeature {\n SFTP_EXPORT_INTEGRATION = 'sftp_export_integration',\n MOBILE_APP = 'mobile_app',\n WEBHOOK_EXPORT_INTEGRATION = 'webhook_integration',\n CUSTOMER_API_INTEGRATION = 'sdk_api_integration',\n ANALYTICS_DAILY_RISK_REPORT = 'reporting_daily_risk_report',\n ORGANIZATIN_BRANDING = 'organization_branding',\n ANALYTICS_READ = 'reporting_analytics',\n MODEL_FALLS = 'model_fall',\n MODEL_WOUNDS = 'model_wound',\n MODEL_UPT = 'model_upt',\n MODEL_RTH = 'model_rth',\n GEN_AI = 'gen_ai',\n TEST = 'test',\n WOUND_CARE = 'wound_care'\n}\n\nexport type OrgItem = {\n id: string\n name: string\n role: string\n last_active_at: Date\n permissions: UserPermission[]\n productFeatures: OrgProductFeature[]\n}\n\nexport type AuthenticatedUser = {\n email: string\n title: string\n productName: string[] // \"regular\" or \"medical_supply\"\n name: string\n isSuperuser: boolean\n orgs: OrgItem[]\n}\n\nexport type AuthenticationContextType = {\n status: AuthenticationStatus\n user?: UserMeRead\n product?: SaivaProduct\n selectProduct: (product: SaivaProduct) => void\n login: (email: string, tokens: Tokens, username: string) => void\n changePassword: () => void\n}\n\nexport interface JwtTokenPayload {\n token_type: string\n exp: number\n iat: number\n user_id: number\n}\n\nexport interface StoredUser {\n email: string\n username: string\n accessToken: string\n refreshToken: string\n lastRefresh: number\n expiresAt: number\n}\n\nexport type Tokens = {\n refresh_token: string\n access_token: string\n}\n\nexport enum UserCapability {\n EMAIL_NOTIFICATION = 'can_receive_email_notifications',\n PUSH_NOTIFICATION = 'can_receive_push_notifications',\n WEB_APP_LOGIN = 'can_login_to_webapp',\n MOBILE_APP_LOGIN = 'can_login_to_mobileapp'\n}\n\nexport type InviteJwtTokenPayload = {\n email: string\n username: string\n capabilities: UserCapability[]\n}\n","import { useMutation } from '@tanstack/react-query'\nimport { apiClient } from '../../../services/api'\nimport { PasswordChange } from '../../../types/api'\n\nexport function useChangePassword(props: {\n onSuccess: () => void\n onError: (error: ApiError) => void\n}) {\n const { onSuccess, onError } = props\n async function changePassword(args: PasswordChange): Promise {\n const res = await apiClient.post(`v3/users/me/change_password`, args)\n return res.data\n }\n\n return useMutation({\n mutationFn: changePassword,\n onSuccess,\n onError\n })\n}\n","import { Row, Col, Flex } from 'antd'\nimport {\n Form,\n Modal,\n FormItem,\n Password,\n Button,\n useForm,\n useToast,\n useWatch,\n Icon\n} from 'mysaiva-web-components'\nimport { useTranslation } from 'react-i18next'\nimport { useChangePassword } from '../mutations/useChangePassword'\nimport { PasswordChange } from 'types/api'\nimport { Rule } from 'antd/es/form'\nimport styles from './ChangePasswordModal.module.scss'\nimport { TFunction } from 'i18next'\nimport { useAuthentication } from '@authentication/context'\nimport { getNumberOfDaysUntilExpiration } from '@authentication/utils'\nimport { useQueryClient } from '@tanstack/react-query'\n\nconst MIN_DAYS_TO_EXPIRATION = import.meta.env.VITE_MIN_DAYS_TO_EXPIRATION || 2\n\ntype ChangePasswordModalProps = {\n open: boolean\n onCancel: () => void\n onOk: () => void\n}\n\nexport function ChangePasswordModal(props: ChangePasswordModalProps) {\n const { open, onCancel, onOk } = props\n const { t } = useTranslation()\n const form = useForm()\n const new_password = useWatch('new_password', form) || ''\n const toast = useToast()\n const { user } = useAuthentication()\n const queryClient = useQueryClient()\n\n const { mutate: submitChangePassword } = useChangePassword({\n onSuccess: () => {\n form.resetFields()\n queryClient.invalidateQueries({ queryKey: ['me'] })\n onOk()\n toast.success({\n message: t('changePasswordModal.success')\n })\n },\n onError: (error) => {\n toast.error({\n message: error.localizedError\n })\n }\n })\n\n function handleFinish(values: PasswordChange) {\n form.validateFields().then(() => {\n submitChangePassword(values)\n })\n }\n\n const expirationDays =\n getNumberOfDaysUntilExpiration(user?.password_expires_at) || 0\n\n const passwordValidationRules = getPasswordValidationRules(t)\n const isLessThanOneDay = user && expirationDays < MIN_DAYS_TO_EXPIRATION\n\n function getExpirationMessage(days: number) {\n if (days == 0) {\n return t('changePasswordModal.expired')\n }\n return t('changePasswordModal.expires', { days })\n }\n\n return (\n \n
\n \n \n \n \n \n \n\n \n \n \n
\n {getExpirationMessage(expirationDays)}\n
\n
\n \n
\n \n \n rule.rule\n ),\n ({ getFieldValue }) => ({\n validator(_, value) {\n if (getFieldValue('old_password') !== value) {\n return Promise.resolve()\n }\n return Promise.reject(new Error(t('common.form.isMatch')))\n }\n })\n ]}\n >\n form.validateFields(['new_password_confirm'])}\n />\n \n
\n {passwordValidationRules.map((rule, index) => (\n \n ))}\n
\n \n \n ({\n validator(_, value) {\n if (!value || getFieldValue('new_password') === value) {\n return Promise.resolve()\n }\n return Promise.reject(new Error(t('common.form.notMatch')))\n }\n })\n ]}\n >\n \n \n \n
\n {/* If less then one day we will hide option to skip */}\n \n {!isLessThanOneDay && (\n \n )}\n \n \n \n \n
\n \n )\n}\n\nfunction CheckIcon({ condition, text }: { condition: boolean; text: string }) {\n return (\n \n \n \n \n
{text}
\n
\n )\n}\n\n/**\n * Centralized password validation rules for both form validation & UI feedback.\n */\nconst getPasswordValidationRules = (t: TFunction<'translation', undefined>) => [\n {\n type: 'length',\n rule: { min: 12, message: t('common.form.minLength', { min: 12 }) },\n check: (val: string) => val.length >= 12,\n text: t('common.form.minLength', { min: 12 })\n },\n {\n type: 'uppercase',\n rule: {\n pattern: /^(?=.*[A-Z])(?=.*[a-z]).+$/,\n message: t('common.form.uppercase')\n },\n check: (val: string) => /^(?=.*[A-Z])(?=.*[a-z]).+$/.test(val),\n text: t('common.form.uppercase')\n },\n {\n type: 'number',\n rule: { pattern: /[0-9]/, message: t('common.form.number') },\n check: (val: string) => /[0-9]/.test(val),\n text: t('common.form.number')\n },\n {\n type: 'character',\n rule: {\n pattern: /[!@#$%^&*()\\-_=+[\\]{}|;:',.<>?/`~]/,\n message: t('common.form.character')\n },\n check: (val: string) => /[!@#$%^&*()\\-_=+[\\]{}|;:',.<>?/`~]/.test(val),\n text: t('common.form.character')\n }\n]\n","import { createContext, useContext, useEffect, useState } from 'react'\nimport type { AuthenticationContextType } from '../types'\nimport { PropsWithChildren, useMemo } from 'react'\nimport { useAuthenticatedUser } from '../queries'\nimport { AuthenticationStatus } from '../types'\nimport { getCurrentProduct } from '../utils'\nimport { SaivaProduct, UserMeRead } from 'types/api'\nimport { trackLastUsedApp } from '../utils/index'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\nimport { userStorage } from '../../../services/utils/local-storage'\nimport { LoadingPage } from '@common/loading/LoadingPage'\nimport { mixpanelInstance } from '@utils/mixpanel'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { ChangePasswordModal } from '../components/ChangePasswordModal'\n\nexport const AuthenticationContext = createContext<\n AuthenticationContextType | undefined\n>(undefined)\n\nexport function AuthenticationProvider({ children }: PropsWithChildren) {\n const navigate = useNavigate()\n const [openChangePasswordModal, setOpenChangePasswordModal] = useState(false)\n const [searchParams] = useSearchParams()\n const queryClient = useQueryClient()\n\n const { isLoading, isSuccess, data: user } = useAuthenticatedUser()\n\n const [product, setProduct] = useState(undefined)\n\n const pathnameWithProduct = window.location.pathname.split('/')[1] as\n | SaivaProduct\n | undefined\n\n const newProduct = getCurrentProduct(user, localStorage)\n useEffect(() => {\n setProduct(newProduct)\n }, [user, product, pathnameWithProduct, newProduct])\n\n const state = useMemo(\n function () {\n return {\n user,\n product: newProduct,\n status: getStatus(isLoading, isSuccess, user),\n selectProduct: function (product: SaivaProduct) {\n trackLastUsedApp(product, localStorage)\n setProduct(product)\n },\n login: function (email, tokens, username) {\n queryClient.invalidateQueries({ queryKey: ['me'] })\n userStorage.save(email, tokens, username)\n mixpanelInstance.login(email, username)\n const redirect = searchParams.get('redirect')\n if (redirect) {\n searchParams.delete('redirect')\n navigate(redirect + '?' + searchParams.toString(), {\n replace: true\n })\n } else {\n navigate('/')\n }\n },\n changePassword: function () {\n setOpenChangePasswordModal(true)\n }\n }\n },\n [user, newProduct, isLoading, isSuccess, navigate]\n )\n\n if (isLoading) {\n return \n }\n\n return (\n \n {children}\n \n \n )\n}\n\nexport function useAuthentication(): AuthenticationContextType {\n const context = useContext(AuthenticationContext)\n\n if (!context) {\n throw new Error('AuthenticationContext is missing')\n }\n\n return context\n}\n\nfunction getStatus(\n isLoading: boolean,\n isSuccess: boolean,\n user: UserMeRead | undefined\n): AuthenticationStatus {\n if (isLoading) {\n return AuthenticationStatus.Loading\n }\n\n if (isSuccess || user) {\n return AuthenticationStatus.LoggedIn\n }\n\n return AuthenticationStatus.LoggedOut\n}\n"],"names":["useQuery","importShared","authenticatedUserQueryKey","useAuthenticatedUser","product","getAuthenticatedUser","apiClient","useMemo","useSearchParams","statusRequestQueryKey","numberOfRetries","retryInterval","useRequestStatus","searchParams","setSearchParams","params","getStatus","expireStatus","count","query","p","LAST_APP_KEY","APP_PATHS","SaivaProduct","selectAppPath","user","storage","products","lastApp","trackLastUsedApp","appName","getCurrentProduct","pathnameWithProduct","mixpanelInstance","getNumberOfDaysUntilExpiration","expirationDate","targetDate","now","diff","AuthSearchParams","AuthenticationStatus","UserCapability","useMutation","useChangePassword","props","onSuccess","onError","changePassword","args","Row","Col","Flex","Form","Modal","FormItem","Password","Button","useForm","useToast","useWatch","Icon","useTranslation","useQueryClient","MIN_DAYS_TO_EXPIRATION","ChangePasswordModal","open","onCancel","onOk","t","form","new_password","toast","useAuthentication","queryClient","submitChangePassword","error","handleFinish","values","expirationDays","passwordValidationRules","getPasswordValidationRules","isLessThanOneDay","getExpirationMessage","days","jsx","jsxs","styles","rule","getFieldValue","_","value","index","CheckIcon","condition","text","val","createContext","useContext","useEffect","useState","useNavigate","AuthenticationContext","AuthenticationProvider","children","navigate","openChangePasswordModal","setOpenChangePasswordModal","isLoading","isSuccess","setProduct","newProduct","state","email","tokens","username","userStorage","redirect","LoadingPage","context"],"mappings":"sYAAA,KAAA,CAAA,SAAAA,CAAA,EAAA,MAAAC,EAAA,uBAAA,EAIaC,EAA4B,CAAC,IAAI,EAEvC,SAASC,EACdC,EACA,CACA,eAAeC,GAAuB,CAEpC,OADiB,MAAMC,EAAU,IAAgB,aAAa,GAC9C,IAAA,CAGlB,OAAON,EAAS,CACd,QAASK,EACT,SAAU,CAAC,GAAGH,EAA2BE,CAAO,CAAA,CACjD,CACH,CClBA,KAAA,CAAA,QAAAG,CAAA,EAAA,MAAAN,EAAA,OAAA,EACA,CAAA,gBAAAO,CAAA,EAAA,MAAAP,EAAA,kBAAA,EACA,CAAA,SAAAD,CAAA,EAAA,MAAAC,EAAA,uBAAA,EAIaQ,EAAwB,CAAC,YAAY,EAE5CC,EACsD,GACtDC,EACmD,IAElD,SAASC,GAAiBC,EAA+B,CAC9D,KAAM,CAAG,CAAAC,CAAe,EAAIN,EAAgB,EACtCO,EAASR,EACb,UAAsC,CAG7BQ,OAFQ,IAAI,gBAAgBF,CAAY,CAGjD,EACA,CAACA,CAAY,CACf,EAEA,eAAeG,GAAY,CAIzB,OAHY,MAAMV,EAAU,IAC1B,sBAAsBS,EAAO,UAAU,EACzC,GACW,IAAA,CAGJ,SAAAE,EACPC,EACAC,EACgB,CACZ,OAAAA,GAAO,SAAW,UAChBD,EAAQR,GACVI,EAAiBC,GAAW,CACpB,MAAAK,EAAI,IAAI,gBAAgBL,CAAM,EAClC,OAAAK,EAAA,OAAO,UAAW,MAAM,EACnBA,CAAA,CACR,EAEM,IAGFT,EAEA,EACT,CAGF,OAAOX,EAAS,CACd,QAASgB,EACT,SAAUP,EACV,OAAQ,EACR,gBAAkBU,GAChBF,EAAaE,EAAM,MAAM,gBAAiBA,EAAM,MAAM,IAAI,CAAA,CAC7D,CACH,CCxDO,MAAME,EAAe,mBACfC,EAA0C,CACrD,CAACC,EAAa,GAAG,EAAG,OACpB,CAACA,EAAa,SAAS,EAAG,UAC1B,CAACA,EAAa,OAAO,EAAG,UAC1B,EAEgB,SAAAC,GACdC,EACAC,EACQ,CACJ,GAAA,CAACD,EAAa,MAAA,SAElB,MAAME,EAAWF,EAAK,aAElB,GAAAE,EAAS,QAAU,EAAU,MAAA,SAE3B,MAAAC,EAAUF,EAAQ,QAAQL,CAAY,EAGxC,MADA,CAACO,GACD,CAACD,EAAS,SAASC,CAAO,EAAUN,EAAUK,EAAS,CAAC,CAAC,EAEtDL,EAAUM,CAAO,CAC1B,CAEgB,SAAAC,EAAiBC,EAAiBJ,EAAkB,CAC1DA,EAAA,QAAQL,EAAcS,CAAO,CACvC,CAEgB,SAAAC,EACdN,EACAC,EAC0B,CACtB,GAAA,CAACD,EAAa,OAElB,MAAMO,EAAsB,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC,EAIjE,GACEA,GACA,OAAO,OAAOT,CAAY,EAAE,SAASS,CAAmB,EAExD,OAAAC,EAAiB,WAAWD,CAAmC,EACxDA,EAGT,MAAML,EAAWF,EAAK,aAElB,GAAAE,EAAS,QAAU,EAAU,OAE3B,MAAAC,EAAUF,EAAQ,QAAQL,CAAY,EAG5C,MADI,CAACO,GACD,CAACD,EAAS,SAASC,CAAO,EAAUD,EAAS,CAAC,GAElDM,EAAiB,WAAWL,CAAO,EAE5BA,EACT,CAEO,SAASM,EACdC,EACoB,CAChB,GAAA,CAACA,EAAuB,OAEtB,MAAAC,EAAa,IAAI,KAAKD,CAAc,EAC1C,GAAI,MAAMC,EAAW,QAAQ,CAAC,EAAU,OAElC,MAAAC,MAAU,KACVC,EAAOF,EAAW,QAAQ,EAAIC,EAAI,QAAQ,EAGhD,OAAO,KAAK,MAAMC,GAAQ,IAAO,GAAK,GAAK,GAAG,CAChD,CC3EY,IAAAC,GAAAA,IACVA,EAAA,gBAAkB,MAClBA,EAAA,MAAQ,QACRA,EAAA,SAAW,WACXA,EAAA,cAAgB,iBAJNA,IAAAA,GAAA,CAAA,CAAA,EAOAC,GAAAA,IACVA,EAAA,QAAU,UACVA,EAAA,SAAW,YACXA,EAAA,UAAY,aAHFA,IAAAA,GAAA,CAAA,CAAA,EAmGAC,GAAAA,IACVA,EAAA,mBAAqB,kCACrBA,EAAA,kBAAoB,iCACpBA,EAAA,cAAgB,sBAChBA,EAAA,iBAAmB,yBAJTA,IAAAA,GAAA,CAAA,CAAA,EC5GZ,KAAA,CAAA,YAAAC,CAAA,EAAA,MAAAzC,EAAA,uBAAA,EAIO,SAAS0C,GAAkBC,EAG/B,CACK,KAAA,CAAE,UAAAC,EAAW,QAAAC,CAAA,EAAYF,EAC/B,eAAeG,EAAeC,EAAqC,CAEjE,OADY,MAAM1C,EAAU,KAAK,8BAA+B0C,CAAI,GACzD,IAAA,CAGb,OAAON,EAAY,CACjB,WAAYK,EACZ,UAAAF,EACA,QAAAC,CAAA,CACD,CACH,qICnBA,CAAA,IAAAG,EAAA,IAAAC,EAAA,KAAAC,CAAA,EAAA,MAAAlD,EAAA,MAAA,EACA,CAAA,KAAAmD,GAAA,MAAAC,GAAA,SAAAC,EAAA,SAAAC,EAAA,OAAAC,EAAA,QAAAC,GAAA,SAAAC,GAAA,SAAAC,GAAA,KAAAC,CAAA,EAAA,MAAA3D,EAAA,wBAAA,EAWA,CAAA,eAAA4D,EAAA,EAAA,MAAA5D,EAAA,eAAA,EAQA,CAAA,eAAA6D,EAAA,EAAA,MAAA7D,EAAA,uBAAA,EAEM8D,GAAwE,EAQvE,SAASC,GAAoBpB,EAAiC,CACnE,KAAM,CAAE,KAAAqB,EAAM,SAAAC,EAAU,KAAAC,CAAS,EAAAvB,EAC3B,CAAE,EAAAwB,CAAE,EAAIP,GAAe,EACvBQ,EAAOZ,GAAwB,EAC/Ba,EAAeX,GAAS,eAAgBU,CAAI,GAAK,GACjDE,EAAQb,GAAS,EACjB,CAAE,KAAAjC,CAAK,EAAI+C,GAAkB,EAC7BC,EAAcX,GAAe,EAE7B,CAAE,OAAQY,CAAqB,EAAI/B,GAAkB,CACzD,UAAW,IAAM,CACf0B,EAAK,YAAY,EACjBI,EAAY,kBAAkB,CAAE,SAAU,CAAC,IAAI,EAAG,EAC7CN,EAAA,EACLI,EAAM,QAAQ,CACZ,QAASH,EAAE,6BAA6B,CAAA,CACzC,CACH,EACA,QAAUO,GAAU,CAClBJ,EAAM,MAAM,CACV,QAASI,EAAM,cAAA,CAChB,CAAA,CACH,CACD,EAED,SAASC,EAAaC,EAAwB,CACvCR,EAAA,iBAAiB,KAAK,IAAM,CAC/BK,EAAqBG,CAAM,CAAA,CAC5B,CAAA,CAGH,MAAMC,EACJ5C,EAA+BT,GAAM,mBAAmB,GAAK,EAEzDsD,EAA0BC,GAA2BZ,CAAC,EACtDa,EAAmBxD,GAAQqD,EAAiBf,GAElD,SAASmB,EAAqBC,EAAc,CAC1C,OAAIA,GAAQ,EACHf,EAAE,6BAA6B,EAEjCA,EAAE,8BAA+B,CAAE,KAAAe,EAAM,CAAA,CAIhD,OAAAC,EAAA,IAAC/B,GAAA,CACC,KAAAY,EACA,MAAOG,EAAE,2BAA2B,EACpC,OAAQ,KACR,SAAU,GAEV,gBAAChB,GAAK,CAAA,KAAAiB,EAAY,SAAUO,EAAc,OAAO,WAC/C,SAAA,CAACS,EAAAA,KAAApC,EAAA,CAAI,OAAQ,GACX,SAAA,CAACmC,EAAAA,IAAAlC,EAAA,CAAI,KAAM,GACT,SAAAkC,EAAA,IAAC9B,EAAA,CACC,MAAOc,EAAE,0CAA0C,EACnD,KAAM,eACN,MAAO,CACL,CACE,SAAU,GACV,QAASA,EAAE,iBAAiB,CAAA,CAEhC,EAEA,SAAAgB,EAAA,IAAC7B,EAAA,CACC,OAAM,GACN,YAAaa,EAAE,0CAA0C,CAAA,CAAA,CAC3D,CAAA,EAEJ,QAEClB,EAAI,CAAA,KAAM,GAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,UACnD,gBAACC,EAAA,CAAK,MAAM,SAAS,IAAK,EACxB,SAAA,CAAAiC,MAACxB,GAAK,KAAM,aAAc,MAAM,UAAU,KAAM,GAAI,QACnD,MAAI,CAAA,UAAW0B,EAAO,mBACpB,SAAAJ,EAAqBJ,CAAc,CACtC,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAAA,EACF,EACCO,EAAAA,KAAApC,EAAI,CAAA,OAAQ,GACX,SAAA,CAACoC,EAAAA,KAAAnC,EAAA,CAAI,KAAM,GACT,SAAA,CAAAkC,EAAA,IAAC9B,EAAA,CACC,MAAOc,EAAE,sCAAsC,EAC/C,KAAM,eACN,MAAO,CACL,GAAGW,EAAwB,IACxBQ,GAAuCA,EAAK,IAC/C,EACA,CAAC,CAAE,cAAAC,CAAA,KAAqB,CACtB,UAAUC,EAAGC,EAAO,CACd,OAAAF,EAAc,cAAc,IAAME,EAC7B,QAAQ,QAAQ,EAElB,QAAQ,OAAO,IAAI,MAAMtB,EAAE,qBAAqB,CAAC,CAAC,CAAA,CAE7D,EACF,EAEA,SAAAgB,EAAA,IAAC7B,EAAA,CACC,OAAM,GACN,YAAaa,EAAE,sCAAsC,EACrD,SAAU,IAAMC,EAAK,eAAe,CAAC,sBAAsB,CAAC,CAAA,CAAA,CAC9D,CACF,EACAe,EAAAA,IAAC,OAAI,UAAWE,EAAO,mBACpB,SAAwBP,EAAA,IAAI,CAACQ,EAAMI,IAClCP,EAAA,IAACQ,GAAA,CAEC,UAAWL,EAAK,MAAMjB,CAAY,EAClC,KAAMiB,EAAK,IAAA,EAFNI,CAAA,CAIR,CACH,CAAA,CAAA,EACF,EACCP,EAAAA,IAAAlC,EAAI,CAAA,KAAM,GACT,SAAAkC,EAAA,IAAC9B,EAAA,CACC,MAAOc,EAAE,0CAA0C,EACnD,KAAM,uBACN,MAAO,CACL,CAAC,CAAE,cAAAoB,CAAA,KAAqB,CACtB,UAAUC,EAAGC,EAAO,CAClB,MAAI,CAACA,GAASF,EAAc,cAAc,IAAME,EACvC,QAAQ,QAAQ,EAElB,QAAQ,OAAO,IAAI,MAAMtB,EAAE,sBAAsB,CAAC,CAAC,CAAA,CAE9D,EACF,EAEA,SAAAgB,EAAA,IAAC7B,EAAA,CACC,OAAM,GACN,YAAaa,EAAE,0CAA0C,CAAA,CAAA,CAC3D,CAAA,CAEJ,CAAA,CAAA,EACF,EAECiB,EAAAA,KAAAlC,EAAK,CAAA,IAAK,GAAI,QAAQ,MAAM,MAAO,CAAE,UAAW,EAAG,EACjD,SAAA,CAAA,CAAC8B,GACCG,MAAA5B,EAAA,CAAO,QAASU,EACd,SAAAE,EAAE,iCAAiC,EACtC,QAEDd,EAAS,CAAA,MAAO,CAAE,aAAc,CAC/B,EAAA,SAAC8B,MAAA5B,EAAO,CAAA,KAAK,UAAU,SAAS,SAC7B,SAAEY,EAAA,uCAAuC,CAAA,CAC5C,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAEA,SAASwB,GAAU,CAAE,UAAAC,EAAW,KAAAC,GAA8C,CAC5E,cACG3C,EAAA,CAAK,MAAM,SAAS,IAAK,EACxB,SAAA,CAAAiC,EAAA,IAAC,MAAA,CACC,UAAWE,EAAO,UAClB,MAAO,CAAE,WAAYO,EAAY,0BAA4B,EAAG,EAEhE,SAAAT,EAAA,IAACxB,EAAA,CACC,KAAMiC,EAAY,cAAgB,SAClC,MAAOA,EAAY,UAAY,YAC/B,KAAM,EAAA,CAAA,CACR,CACF,EACCT,EAAA,IAAA,MAAA,CAAI,UAAWE,EAAO,MAAQ,SAAKQ,CAAA,CAAA,CAAA,EACtC,CAEJ,CAKA,MAAMd,GAA8BZ,GAA2C,CAC7E,CACE,KAAM,SACN,KAAM,CAAE,IAAK,GAAI,QAASA,EAAE,wBAAyB,CAAE,IAAK,EAAG,CAAC,CAAE,EAClE,MAAQ2B,GAAgBA,EAAI,QAAU,GACtC,KAAM3B,EAAE,wBAAyB,CAAE,IAAK,EAAI,CAAA,CAC9C,EACA,CACE,KAAM,YACN,KAAM,CACJ,QAAS,6BACT,QAASA,EAAE,uBAAuB,CACpC,EACA,MAAQ2B,GAAgB,6BAA6B,KAAKA,CAAG,EAC7D,KAAM3B,EAAE,uBAAuB,CACjC,EACA,CACE,KAAM,SACN,KAAM,CAAE,QAAS,QAAS,QAASA,EAAE,oBAAoB,CAAE,EAC3D,MAAQ2B,GAAgB,QAAQ,KAAKA,CAAG,EACxC,KAAM3B,EAAE,oBAAoB,CAC9B,EACA,CACE,KAAM,YACN,KAAM,CACJ,QAAS,qCACT,QAASA,EAAE,uBAAuB,CACpC,EACA,MAAQ2B,GAAgB,qCAAqC,KAAKA,CAAG,EACrE,KAAM3B,EAAE,uBAAuB,CAAA,CAEnC,EC7OA,CAAA,cAAA4B,GAAA,WAAAC,GAAA,UAAAC,GAAA,SAAAC,CAAA,EAAA,MAAAlG,EAAA,OAAA,EAEA,CAAA,QAAAM,EAAA,EAAA,MAAAN,EAAA,OAAA,EAMA,CAAA,YAAAmG,GAAA,gBAAA5F,EAAA,EAAA,MAAAP,EAAA,kBAAA,EAIA,CAAA,eAAA6D,EAAA,EAAA,MAAA7D,EAAA,uBAAA,EAGaoG,EAAwBL,GAEnC,MAAS,EAEK,SAAAM,GAAuB,CAAE,SAAAC,GAA+B,CACtE,MAAMC,EAAWJ,GAAY,EACvB,CAACK,EAAyBC,CAA0B,EAAIP,EAAS,EAAK,EACtE,CAACtF,CAAY,EAAIL,GAAgB,EACjCiE,EAAcX,GAAe,EAE7B,CAAE,UAAA6C,EAAW,UAAAC,EAAW,KAAMnF,CAAA,EAAStB,EAAqB,EAE5D,CAACC,EAASyG,CAAU,EAAIV,EAAmC,MAAS,EAEpEnE,EAAsB,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC,EAI3D8E,EAAa/E,EAAkBN,EAAM,YAAY,EACvDyE,GAAU,IAAM,CACdW,EAAWC,CAAU,GACpB,CAACrF,EAAMrB,EAAS4B,EAAqB8E,CAAU,CAAC,EAEnD,MAAMC,EAAQxG,GACZ,UAAY,CACH,MAAA,CACL,KAAAkB,EACA,QAASqF,EACT,OAAQ9F,GAAU2F,EAAWC,EAAWnF,CAAI,EAC5C,cAAe,SAAUrB,EAAuB,CAC9CyB,EAAiBzB,EAAS,YAAY,EACtCyG,EAAWzG,CAAO,CACpB,EACA,MAAO,SAAU4G,EAAOC,EAAQC,EAAU,CACxCzC,EAAY,kBAAkB,CAAE,SAAU,CAAC,IAAI,EAAG,EACtC0C,EAAA,KAAKH,EAAOC,EAAQC,CAAQ,EACvBjF,EAAA,MAAM+E,EAAOE,CAAQ,EAChC,MAAAE,EAAWvG,EAAa,IAAI,UAAU,EACxCuG,GACFvG,EAAa,OAAO,UAAU,EAC9B2F,EAASY,EAAW,IAAMvG,EAAa,SAAA,EAAY,CACjD,QAAS,EAAA,CACV,GAED2F,EAAS,GAAG,CAEhB,EACA,eAAgB,UAAY,CAC1BE,EAA2B,EAAI,CAAA,CAEnC,CACF,EACA,CAACjF,EAAMqF,EAAYH,EAAWC,EAAWJ,CAAQ,CACnD,EAEA,OAAIG,QACMU,EAAY,EAAA,EAInBhC,EAAAA,KAAAgB,EAAsB,SAAtB,CAA+B,MAAOU,EACpC,SAAA,CAAAR,EACDnB,EAAA,IAACpB,GAAA,CACC,KAAMyC,EACN,SAAUC,EAA2B,KAAK,KAAM,EAAK,EACrD,KAAMA,EAA2B,KAAK,KAAM,EAAK,CAAA,CAAA,CACnD,EACF,CAEJ,CAEO,SAASlC,IAA+C,CACvD,MAAA8C,EAAUrB,GAAWI,CAAqB,EAEhD,GAAI,CAACiB,EACG,MAAA,IAAI,MAAM,kCAAkC,EAG7C,OAAAA,CACT,CAEA,SAAStG,GACP2F,EACAC,EACAnF,EACsB,CACtB,OAAIkF,EACKnE,EAAqB,QAG1BoE,GAAanF,EACRe,EAAqB,SAGvBA,EAAqB,SAC9B"}