{ "version": 3, "sources": ["css-bundle-plugin-ns:@remix-run/css-bundle", "../../app/root.tsx", "../../app/containers/Drawers/Container.tsx", "../../app/containers/Drawers/index.ts", "../../app/containers/Errors/ErrorPreview.tsx", "../../app/containers/Errors/Error404.tsx", "../../app/containers/Errors/ErrorUnknown.tsx", "../../app/containers/Loaders/Transition/Transition.tsx", "../../app/containers/Loaders/Transition/index.ts", "../../app/hooks/app/useAnalyticsEffect.ts", "../../app/hooks/app/utils.ts", "../../app/hooks/app/useFirebaseEffect.ts", "../../app/hooks/app/useAppLaunchEffect.ts"], "sourcesContent": ["export const cssBundleHref = \"/build/css-bundle-JOWK774O.css\";", "import { cssBundleHref } from '@remix-run/css-bundle';\nimport { json } from '@remix-run/node';\nimport {\n Links,\n LiveReload,\n Meta,\n Outlet,\n Scripts,\n ScrollRestoration,\n isRouteErrorResponse,\n useLoaderData,\n useRouteError,\n useRouteLoaderData } from\n'@remix-run/react';\nimport { captureRemixErrorBoundaryError, withSentry } from '@sentry/remix';\nimport { AnalyticsScreenNames } from '@tectonic/athena-web';\nimport { useEffect, useMemo } from 'react';\nimport Drawers from '~/containers/Drawers';\nimport { Error404, ErrorUnknown } from '~/containers/Errors';\nimport { Transition as TransitionLoader } from '~/containers/Loaders';\nimport { RootProvider } from '~/contexts/root';\nimport { ToastProvider } from '~/contexts/toast';\nimport { useAppLaunchEffect } from '~/hooks/app';\nimport { getSession } from '~/session';\nimport { isMobile } from '~/utils/device';\nimport { populate } from '~/utils/string';\nimport { dropTrailingSlashes } from '~/utils/url';\nimport mainCss from './styles/main.css';\n\nimport type {\n AppLoadContext,\n DataFunctionArgs,\n LinksFunction,\n LoaderFunction } from\n'@remix-run/node';\nimport type { MetaFunction, ShouldRevalidateFunction } from '@remix-run/react';\nimport { isEmpty } from 'lodash-es';\nimport type { FC } from 'react';\n// @ts-ignore\nimport { getEnvs, populateEnvs } from 'server/env';\nimport type { ContextAuth, ContextSessionStorage } from '~/session';\nimport type {\n BrowserEnv,\n RootLoaderData,\n RootRouteHandle } from\n'~/typings/remix';\nimport { configureApiEndPoints } from './network/config';\n\nconst getBrowserEnv = (context: AppLoadContext): BrowserEnv => {\n const env = context.browserEnvs as Record;\n const { GTAG_HOST, GTAG_ID, ORGANIZATION, DAM_URL: _DAM_URL } = env;\n\n const DAM_URL = dropTrailingSlashes(_DAM_URL as string);\n const MIXPANEL_PROXY_DOMAIN = populate(env.MIXPANEL_PROXY_DOMAIN as string, {\n organization: ORGANIZATION\n });\n\n // Url has placeholder for org.\n // https://{gtmHost}/gtag/js?id={gtagId}\n const GTAG_JS_URL = populate(env.GTAG_JS_URL as string, {\n gtmHost: GTAG_HOST,\n gtagId: GTAG_ID\n });\n\n return {\n NODE_ENV: process.env.NODE_ENV,\n FIREBASE_API_KEY: env.FIREBASE_API_KEY as string,\n FIREBASE_AUTH_DOMAIN: env.FIREBASE_AUTH_DOMAIN as string,\n FIREBASE_PROJECT_ID: env.FIREBASE_PROJECT_ID as string,\n FIREBASE_STORAGE_BUCKET: env.FIREBASE_STORAGE_BUCKET as string,\n FIREBASE_MESSAGING_SENDER_ID: env.FIREBASE_MESSAGING_SENDER_ID as string,\n FIREBASE_APP_ID: env.FIREBASE_APP_ID as string,\n FIREBASE_MEASUREMENT_ID: env.FIREBASE_MEASUREMENT_ID as string,\n MIXPANEL_PROJECT_TOKEN: env.MIXPANEL_PROJECT_TOKEN as string,\n GTAG_ID: env.GTAG_ID as string,\n GTAG_HOST: env.GTAG_HOST as string,\n ROOT_DOMAIN: env.ROOT_DOMAIN as string,\n ORGANIZATION: env.ORGANIZATION as string,\n SENTRY_DSN: env.SENTRY_DSN as string,\n CLARITY_TOKEN: env.CLARITY_TOKEN as string,\n DISABLED_EVENTS: (env.DISABLED_EVENTS as string ?? '').\n split(',').\n map((e) => e.trim()).\n filter((x) => !!x),\n PRE_CONNECT_URLS: (env.PRE_CONNECT_URLS as string ?? '').\n split(',').\n map((e) => e.trim()).\n filter((x) => !!x),\n DAM_URL,\n MIXPANEL_PROXY_DOMAIN,\n GTAG_JS_URL\n };\n};\n\nconst getHeaders = async ({\n request,\n context\n}: Pick): Promise => {\n const headers: HeadersInit = {};\n const sessionStorage = context.sessionStorage as ContextSessionStorage;\n const authContext = context.auth as ContextAuth;\n const session = await getSession(request, sessionStorage);\n\n // Commit session only when there's a change or not initialized.\n // session.id is empty for a freshly created session that is not committed.\n const shouldCommitSession =\n !session.id || session.get('accessToken') !== authContext.accessToken;\n\n if (shouldCommitSession) {\n // freshly created session\n session.set('accessToken', authContext.accessToken);\n session.set('refreshToken', authContext.refreshToken);\n session.set('currentUser', JSON.stringify(authContext.currentUser));\n headers['Set-Cookie'] = await sessionStorage.commitSession(session);\n }\n return headers;\n};\n\nconst isLogoutRedirect = ({\n request,\n context\n}: Pick) => {\n // We need to detect logout and return appropriate data to client so that it\n // can clean up. We presently piggyback on the referrer to detect if is a logout\n // If there are multiple redirect accounts page, we'll have to a couple of\n // jing-bang with flash data.\n // https://sergiodxa.com/articles/destroy-user-session-and-while-setting-a-flash-message-in-remix\n const referer = request.headers.get('Referer');\n\n const { currentUser } = context.auth as ContextAuth;\n const isAnonymous = !currentUser.email && !currentUser.phone;\n return isAnonymous && referer?.endsWith('/account');\n};\n\nexport const loader: LoaderFunction = async ({ context, request }) => {\n populateEnvs(process.env);\n configureApiEndPoints(getEnvs());\n\n // Envs for browsers as mentioned here https://remix.run/docs/en/main/guides/envvars\n const ENV = getBrowserEnv(context);\n const auth = context.auth as ContextAuth;\n const headers = await getHeaders({ context, request });\n\n return json(\n {\n ENV,\n currentUser: auth.currentUser,\n isLogoutRedirect: isLogoutRedirect({ request, context }),\n isMobile: isMobile(request.headers.get('user-agent') as string)\n },\n { headers }\n );\n};\n\nexport const links: LinksFunction = () => [\n...(cssBundleHref ? [{ rel: 'stylesheet', href: cssBundleHref }] : [])];\n\n\nexport const meta: MetaFunction = () => [\n{\n title: 'Online Fashion Store styled by Malaika & Bipasha | The Label Life'\n},\n{\n name: 'description',\n content: `Shop the latest trends in women's clothing online, your go-to online fashion store. Browse our curated collection clothing for women and home d\u00E9cor to elevate your lifestyle`\n}];\n\n\n// Route handle is an arbitrary data object that can be associated with a remix\n// route. Any metadata that is needed for a route should be added it. It should\n// be used sparingly cause most of the information should already be available\n// in remix loader and meta function.\n// https://remix.run/docs/en/1.19.3/hooks/use-matches\nexport const handle: RootRouteHandle = {\n screenName: AnalyticsScreenNames.ROOT,\n breadcrumb: () => ({ name: 'Home' })\n};\n\nexport const shouldRevalidate: ShouldRevalidateFunction = ({\n formAction,\n actionResult: _actionResult\n}) => {\n const action = formAction ?? '';\n // reload fetcher on sign in/out/up action to update user in root context.\n if (/sign-(in|out|up|in-with-id-token)$/.test(action)) {\n // TODO: Reload only when action result is success.\n return true;\n }\n return false;\n};\n\nconst Fastrr = () => {\n return (\n <>\n \n \n\n \n \n );\n\n};\n\nconst App = () => {\n const loaderData = useLoaderData();\n const { ENV, currentUser, isMobile } = loaderData;\n const rootContext = { ENV, currentUser, isMobile };\n\n useAppLaunchEffect(loaderData);\n\n return (\n \n \n {/* https://remix.run/docs/en/main/route/meta#global-meta */}\n \n \n\n \n {ENV.PRE_CONNECT_URLS.map((url) =>\n \n )}\n \n \n \n {/* https://github.com/remix-run/remix/discussions/6625 */}\n \n\n {!isEmpty(ENV.CLARITY_TOKEN) &&\n \n\n }\n \n {/*\n Display nothing till styles are loaded. It is to prevent flash of unstyled\n content.\n */}\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n\n};\n\nconst useErrorPreview = (error: unknown) =>\nuseMemo(() => {\n const isRouteError = isRouteErrorResponse(error);\n if (!isRouteError) {\n return ErrorUnknown;\n }\n const { status } = error;\n if (status === 404) {\n return Error404;\n }\n return ErrorUnknown;\n}, [error]);\n\n/**\n * Root error boundary.\n * https://remix.run/docs/en/main/guides/errors#root-error-boundary\n */\nexport const ErrorBoundary: FC = (props) => {\n const error = useRouteError() as Error;\n captureRemixErrorBoundaryError(error);\n const ErrorPreview = useErrorPreview(error);\n const { ENV = {} as any } =\n useRouteLoaderData<{ENV: BrowserEnv;}>('root') ?? {};\n\n // When a user navigate to a different app in same tab, an error is thrown.\n // Not sure who is causing that error. This error doesn't have any info in it\n // We tried to comment out code to see if there's any component unmount is\n // causing the error but no luck. As a workaround for time being, we are\n // treating empty errors as errors something caused by navigation. We don't\n // render anything in case of empty error. It only happens on iOS and Safari\n // on macOs. Whenever there's an empty error, we don't render anything. We\n // also listen to `pageshow` event if the page is persisted. So that these\n // error is gone specially when user presses the back-button.\n // TODO: Find a proper fix for it.\n const isEmptyError = isEmpty(error);\n\n useEffect(() => {\n const listener = (event: PageTransitionEvent) => {\n if (event.persisted) {\n window.location.reload();\n }\n };\n window.addEventListener('pageshow', listener);\n return () => {\n window.removeEventListener('pageshow', listener);\n };\n }, []);\n\n return (\n \n \n \n\n \n \n \n {/* https://github.com/remix-run/remix/discussions/6625 */}\n \n\n {!isEmpty(ENV.CLARITY_TOKEN) &&\n \n\n }\n \n \n \n \n \n \n {!isEmptyError ? : null}\n \n );\n\n};\n\nexport default withSentry(App);", "import { Suspense, lazy } from 'react';\n\nimport type { FC } from 'react';\n\n// TODO: When we use lazy the component is loaded the moment it is in the render\n// path. We might not need to load drawer immediately. Do some research on resource\n// hinting and load drawers only when there's a needed.\nconst Drawers = lazy(() => import('./Drawers'));\n\nconst Container: FC = () => (\n \n \n \n);\n\nexport default Container;\n", "import Drawers from './Container';\n\nexport default Drawers;\n", "import { useNavigate } from '@remix-run/react';\nimport { twMerge } from 'tailwind-merge';\nimport SvgSprite from '~/containers/SvgSprite';\nimport { Box, Button, Center, Typography } from '~/uikit/components';\n\nimport type { ComponentType } from 'react';\nimport type { ErrorPreviewProps } from './Errors.types';\n\n\nconst ErrorPreview: ComponentType = ({\n className,\n title,\n subtitle,\n children,\n}) => {\n const navigate = useNavigate();\n return (\n
\n
\n {/* TODO: Make it configurable */}\n \n
\n\n \n \n {title}\n \n \n {subtitle}\n \n \n {children}\n \n
\n );\n};\n\nexport default ErrorPreview;\n", "import ErrorPreview from './ErrorPreview';\n\nimport type { Error404Props } from './Errors.types';\nimport type { FC } from 'react';\n\nconst Error404: FC = ({ className }) => (\n \n);\n\nexport default Error404;\n", "import ErrorPreview from './ErrorPreview';\n\nimport type { ErrorUnknownProps } from './Errors.types';\nimport type { FC } from 'react';\n\n// TODO: Add reload CTA.\nconst ErrorUnknown: FC = ({ className }) => (\n \n);\n\nexport default ErrorUnknown;\n", "import { useNavigation } from '@remix-run/react';\nimport clsx from 'clsx';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Progress, ProgressIndicator } from '~/uikit/components';\nimport { isIdle, isLoading } from '~/utils/remix';\n\nimport type { FC } from 'react';\nimport type { TransitionProps } from './Transition.types';\n\n\nconst FAKE_MAX_PROGRESS = 95;\nconst FRAME_DELAY = 100;\n\nconst useProgress = () => {\n const [progress, setProgress] = useState(0);\n const animationRef = useRef();\n const { state: navState } = useNavigation();\n const timerRef = useRef>();\n\n const animate = useCallback(() => {\n animationRef.current = window.requestAnimationFrame(() => {\n setProgress((prevProgress) => {\n // Don't do anything if progress is already at max.\n if (prevProgress === 100) {\n return prevProgress;\n }\n let newProgress = prevProgress + Math.pow(2, prevProgress / 10);\n // Ensure progress doesn't exceed max progress\n newProgress = Math.min(newProgress, FAKE_MAX_PROGRESS);\n timerRef.current = setTimeout(animate, FRAME_DELAY);\n return newProgress;\n });\n });\n }, [animationRef, setProgress]);\n\n const start = useCallback(() => {\n setProgress(0);\n animate();\n }, [setProgress, animate]);\n\n const end = useCallback(() => {\n cancelAnimationFrame(animationRef.current!);\n clearTimeout(timerRef.current);\n setProgress(100);\n }, [setProgress]);\n\n useEffect(() => {\n if (isIdle(navState)) {\n end();\n } else if (isLoading(navState)) {\n start();\n }\n }, [start, end, navState]);\n\n return { progress } as const;\n};\n\nconst Transition: FC = () => {\n const { progress } = useProgress();\n const indicatorStyle = { width: `${progress}%` };\n\n const isVisible = progress !== 0 && progress !== 100;\n\n return (\n \n \n \n );\n};\n\nTransition.displayName = 'LoadersTransition';\n\nexport default Transition;\n", "import Transition from './Transition';\n\nexport default Transition;\n", "import { useLocation } from '@remix-run/react';\nimport { Analytics } from '@tectonic/athena-web';\nimport { useEffect, useRef } from 'react';\nimport { useAnalyticsStore } from '~/analytics/store';\nimport {\n useClientLayoutEffect,\n usePrevious,\n useRouteHandle\n} from '~/hooks/common';\nimport {\n usePageDurationTracker,\n usePageViewTracker,\n useSessionDurationTracker\n} from '~/hooks/instrumentation';\nimport { loadScript } from '~/utils/dom';\nimport { toLocationPath } from './utils';\nimport * as Sentry from '@sentry/browser';\n\nimport type { RootLoaderData } from '~/typings/remix';\n\n// We have custom implementation of tracking. Therefore, we need to set, reset\n// and alias user as per our backend implementation.\n// 1. `ttUserId`\n// - We add `ttUserId` as current user id to identity a user for an event.\n// - It is always in sync with the user available in context.\n// 2. `identify`\n// - We identify user only when the user signs in or signs up.\n// 3. `aliases`\n// - Users are aliased when they login. We don't aliases a user when they sign\n// up cause the user id doesn't change.\nconst useAnalyticsUserEffect = (context: RootLoaderData) => {\n const { currentUser, isLogoutRedirect } = context;\n\n const { externalUserId: userId, email, phone, simpleId } = currentUser;\n // TODO: Create a generic utility for this.\n const isAnonymous = !email && !phone;\n\n const prevIdRef = useRef(userId);\n\n // Reset user only when user logs out.\n useEffect(() => {\n if (isLogoutRedirect) {\n Sentry.setUser(null);\n Analytics.resetUser();\n }\n }, [isLogoutRedirect]);\n\n // Keep `ttUserId` up to date.\n useEffect(() => {\n Analytics.setGlobalProperties({\n ttUserId: userId,\n ttSourceUserId: simpleId\n });\n }, [userId, simpleId]);\n\n // Keep `isAnonymous` up to date.\n useEffect(() => {\n Sentry.setUser({ id: userId });\n // TODO: Check if we need to set it on both or only one should be enough.\n // Ideally, setting properties on the user should be enough.\n // https://docs.mixpanel.com/docs/other-bits/tutorials/developers/mixpanel-for-developers-fundamentals#property-types\n Analytics.setUserProperties({ isAnonymous });\n Analytics.setGlobalProperties({ isAnonymous });\n }, [isAnonymous, userId]);\n\n // Sets user property in case of sign in.\n useEffect(() => {\n const prevId = prevIdRef.current!;\n\n // TODO: Use flash data instead of using ref.\n // Ugly hack to detect sign in :)\n if (prevId !== userId && !isAnonymous) {\n // Definitely as sign up.\n // https://stackoverflow.com/a/69701902/2879146\n // oldId, newId\n Analytics.setUserAlias(prevId, userId);\n Analytics.setUser(userId);\n }\n\n Analytics.setGlobalProperties({ ttEventSource: 'WEBSITE' });\n\n prevIdRef.current = userId;\n }, [isAnonymous, userId, prevIdRef]);\n\n // Sets user properties in case of signup. In case of sign up, we can not\n // simply rely on the value of user ids and anonymous flag cause in case of\n // fresh render the hooks will run and most likely condition\n // `prevId === userId && !isAnonymous` will be true. Therefore, we have to check\n // user is already identified using the distinct id.\n useEffect(() => {\n const prevId = prevIdRef.current!;\n if (prevId === userId && !isAnonymous) {\n // Might be a sign up. Let's confirm if user is already identified\n const analytics = Analytics.getDistinctId();\n if (analytics.mixpanel !== userId) {\n // having different ids. Definitely a sign up.\n Analytics.setUser(userId);\n }\n }\n\n prevIdRef.current = userId;\n }, [isAnonymous, userId, prevIdRef]);\n};\n\nconst useAnalyticsInitEffect = (context: RootLoaderData) => {\n const { ENV } = context;\n const { MIXPANEL_PROJECT_TOKEN, MIXPANEL_PROXY_DOMAIN, NODE_ENV } = ENV;\n\n useEffect(() => {\n const mixpanel = {\n token: MIXPANEL_PROJECT_TOKEN,\n options: {\n ignore_dnt: true,\n persistence: 'localStorage',\n debug: NODE_ENV !== 'production',\n api_host: MIXPANEL_PROXY_DOMAIN\n }\n };\n\n try {\n Analytics.initialize({ mixpanel });\n } catch (error) {\n // We don't want to break the app if analytics fails to initialize.\n }\n }, [MIXPANEL_PROJECT_TOKEN, MIXPANEL_PROXY_DOMAIN, NODE_ENV]);\n};\n\nconst useGtagEffect = (context: RootLoaderData) => {\n const { ENV } = context;\n const { GTAG_HOST, GTAG_ID, GTAG_JS_URL, ORGANIZATION } = ENV;\n\n useEffect(() => {\n loadScript(GTAG_JS_URL);\n globalThis.dataLayer = globalThis.dataLayer ?? [];\n globalThis.gtag = function () {\n globalThis.dataLayer.push(arguments);\n };\n gtag('js', new Date());\n gtag('config', GTAG_ID, {\n sever_container_url: `https://${GTAG_HOST}`,\n tt_event_source: 'HERMES_CLI',\n tt_org: ORGANIZATION,\n tt_ga_tag: GTAG_ID\n });\n }, [GTAG_HOST, GTAG_ID, GTAG_JS_URL, ORGANIZATION]);\n};\n\n// Keeps the store for analytics in sync with ui state.\nconst useAnalyticsStoreEffect = () => {\n const setParams = useAnalyticsStore(state => state.setParams);\n const { screenName } = useRouteHandle<{ screenName: string }>();\n const location = useLocation();\n\n // There's no way to get previous url reliable. We use ref to remember previous\n // location and construct it manually when it is available.\n // https://stackoverflow.com/questions/3528324/how-to-get-the-previous-url-in-javascript\n const prevLocationRef = usePrevious(null);\n\n useClientLayoutEffect(() => {\n const previousUrl = prevLocationRef.current\n ? toLocationPath(prevLocationRef.current)\n : null;\n // @ts-ignore\n prevLocationRef.current = location;\n setParams({ previousUrl });\n }, [prevLocationRef, location, setParams]);\n\n useClientLayoutEffect(() => {\n setParams({ screenName });\n }, [screenName, setParams]);\n};\n\nconst useAnalyticsEffect = (context: RootLoaderData) => {\n useAnalyticsStoreEffect();\n useGtagEffect(context);\n useAnalyticsInitEffect(context);\n useAnalyticsUserEffect(context);\n usePageViewTracker();\n usePageDurationTracker();\n useSessionDurationTracker();\n};\n\nexport default useAnalyticsEffect;\n", "import type { Maybe } from '~/typings/utils';\n\nconst toLocationPath = (location: Maybe) => {\n if (!location) {\n return '';\n }\n const { search, pathname } = location;\n return `${pathname}${search}`;\n};\n\nexport { toLocationPath };\n", "import { useEffect } from 'react';\nimport { Logger } from '~/logger';\n\nimport type { BrowserEnv, RootLoaderData } from '~/typings/remix';\n\nconst getFirebaseConfig = (env: BrowserEnv) => {\n const config = {\n apiKey: env.FIREBASE_API_KEY,\n authDomain: env.FIREBASE_AUTH_DOMAIN,\n projectId: env.FIREBASE_PROJECT_ID,\n storageBucket: env.FIREBASE_STORAGE_BUCKET,\n messagingSenderId: env.FIREBASE_MESSAGING_SENDER_ID,\n appId: env.FIREBASE_APP_ID,\n measurementId: env.FIREBASE_MEASUREMENT_ID,\n };\n return config;\n};\n\nconst setupFirebase = async (env: BrowserEnv) => {\n try {\n const config = getFirebaseConfig(env);\n const module = await import('~/firebase-client/app');\n const { initializeApp } = module;\n initializeApp(config);\n // initialize other stuff like analytics, remote config etc here.\n } catch (error) {\n Logger.error('Firebase module could not be loaded', error);\n }\n};\n\nconst useFirebaseEffect = (context: RootLoaderData) => {\n const { ENV } = context;\n useEffect(() => {\n setupFirebase(ENV);\n }, [ENV]);\n};\n\nexport default useFirebaseEffect;\n", "import { canUseDOM, loadScript } from '~/utils/dom';\nimport useAnalyticsEffect from './useAnalyticsEffect';\nimport useFirebaseEffect from './useFirebaseEffect';\n\nimport type { RootLoaderData } from '~/typings/remix';\nimport { useEffect } from 'react';\n\nconst RE_TAG_JS = 'https://wd-ret.io/rtg/v1/retag.js';\nconst ALPHA_TARGET_JS = 'https://alphatargeting.com/target.js';\n\nconst injectDebugHelpers = (context: RootLoaderData) => {\n if (!canUseDOM) {\n return;\n }\n globalThis.___tt___.currentUser = context.currentUser;\n};\n\nconst useThirdPartyScriptEffects = () => {\n useEffect(() => {\n loadScript(RE_TAG_JS, { async: true }, document.head);\n loadScript(ALPHA_TARGET_JS, { async: true }, document.head);\n }, []);\n};\n\nconst useAppLaunchEffect = (context: RootLoaderData) => {\n injectDebugHelpers(context);\n // Firebase stuff.\n useFirebaseEffect(context);\n useAnalyticsEffect(context);\n useThirdPartyScriptEffects();\n};\n\nexport default useAppLaunchEffect;\n"], "mappings": "siCAAO,IAAMA,EAAgB,iCCC7B,IAAAC,GAAqB,UAerB,IAAAC,EAAmC,SChBnC,IAAAC,EAA+B,SAW3BC,EAAA,SAJEC,MAAU,QAAK,IAAM,OAAO,oCAAW,CAAC,EAExCC,GAAgB,OACpB,OAAC,YACC,mBAACD,GAAA,EAAQ,EACX,EAGKE,GAAQD,GCbf,IAAOE,GAAQC,GCkBP,IAAAC,EAAA,SAXFC,GAAiD,CAAC,CACtD,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,SAAAC,CACF,IAAM,CACJ,IAAMC,EAAWC,EAAY,EAC7B,SACE,QAACC,EAAA,CAAO,UAAWC,EAAQ,eAAgBP,CAAS,EAClD,oBAACM,EAAA,CAAO,UAAU,iBAEhB,mBAACE,GAAA,CAAU,OAAO,yBAAyB,UAAU,YAAY,EACnE,KAEA,QAACC,EAAA,CAAI,UAAU,mBACb,oBAACC,EAAA,CAAW,QAAQ,QAAQ,UAAU,mBACnC,SAAAT,EACH,KACA,OAACS,EAAA,CAAW,QAAQ,QAAQ,UAAU,mBACnC,SAAAR,EACH,GACF,EACCC,KACD,OAACQ,GAAA,CAAO,QAAS,IAAMP,EAAS,GAAG,EAAG,sBAAU,GAClD,CAEJ,EAEOQ,EAAQb,GC/Bb,IAAAc,GAAA,SADIC,GAA8B,CAAC,CAAE,UAAAC,CAAU,OAC/C,QAACC,EAAA,CACC,UAAWD,EACX,MAAM,iBACN,SAAS,oJACX,EAGKE,EAAQH,GCNb,IAAAI,GAAA,SADIC,GAAsC,CAAC,CAAE,UAAAC,CAAU,OACvD,QAACC,EAAA,CACC,UAAWD,EACX,MAAM,wBACN,SAAU,2FACZ,EAGKE,EAAQH,GCZf,IAAAI,EAAyD,SAuEnD,IAAAC,EAAA,SA/DAC,GAAoB,GACpBC,GAAc,IAEdC,GAAc,IAAM,CACxB,GAAM,CAACC,EAAUC,CAAW,KAAI,YAAS,CAAC,EACpCC,KAAe,UAAe,EAC9B,CAAE,MAAOC,CAAS,EAAIC,EAAc,EACpCC,KAAW,UAAsC,EAEjDC,KAAU,eAAY,IAAM,CAChCJ,EAAa,QAAU,OAAO,sBAAsB,IAAM,CACxDD,EAAaM,GAAiB,CAE5B,GAAIA,IAAiB,IACnB,OAAOA,EAET,IAAIC,EAAcD,EAAe,KAAK,IAAI,EAAGA,EAAe,EAAE,EAE9D,OAAAC,EAAc,KAAK,IAAIA,EAAaX,EAAiB,EACrDQ,EAAS,QAAU,WAAWC,EAASR,EAAW,EAC3CU,CACT,CAAC,CACH,CAAC,CACH,EAAG,CAACN,EAAcD,CAAW,CAAC,EAExBQ,KAAQ,eAAY,IAAM,CAC9BR,EAAY,CAAC,EACbK,EAAQ,CACV,EAAG,CAACL,EAAaK,CAAO,CAAC,EAEnBI,KAAM,eAAY,IAAM,CAC5B,qBAAqBR,EAAa,OAAQ,EAC1C,aAAaG,EAAS,OAAO,EAC7BJ,EAAY,GAAG,CACjB,EAAG,CAACA,CAAW,CAAC,EAEhB,sBAAU,IAAM,CACVU,GAAOR,CAAQ,EACjBO,EAAI,EACKE,GAAUT,CAAQ,GAC3BM,EAAM,CAEV,EAAG,CAACA,EAAOC,EAAKP,CAAQ,CAAC,EAElB,CAAE,SAAAH,CAAS,CACpB,EAEMa,GAAkC,IAAM,CAC5C,GAAM,CAAE,SAAAb,CAAS,EAAID,GAAY,EAC3Be,EAAiB,CAAE,MAAO,GAAGd,IAAY,EAI/C,SACE,OAACe,GAAA,CACC,MAAOf,EACP,UAAWgB,EACT,EANYhB,IAAa,GAAKA,IAAa,MAM7B,SACd,kBACA,kBACA,iCACF,EAEA,mBAACiB,GAAA,CACC,MAAOH,EACP,UAAWE,EAAK,kBAAmB,0BAA0B,EAC/D,EACF,CAEJ,EAEAH,GAAW,YAAc,oBAEzB,IAAOK,GAAQL,GCjFf,IAAOM,EAAQA,GCAf,IAAAC,EAAkC,SCAlC,IAAMC,GAAkBC,GAA8B,CACpD,GAAI,CAACA,EACH,MAAO,GAET,GAAM,CAAE,OAAAC,EAAQ,SAAAC,CAAS,EAAIF,EAC7B,MAAO,GAAGE,IAAWD,GACvB,EDsBA,IAAME,GAA0BC,GAA4B,CAC1D,GAAM,CAAE,YAAAC,EAAa,iBAAAC,CAAiB,EAAIF,EAEpC,CAAE,eAAgBG,EAAQ,MAAAC,EAAO,MAAAC,EAAO,SAAAC,CAAS,EAAIL,EAErDM,EAAc,CAACH,GAAS,CAACC,EAEzBG,KAAY,UAAeL,CAAM,KAGvC,aAAU,IAAM,CACVD,IACKO,EAAQ,IAAI,EACnBC,EAAU,UAAU,EAExB,EAAG,CAACR,CAAgB,CAAC,KAGrB,aAAU,IAAM,CACdQ,EAAU,oBAAoB,CAC5B,SAAUP,EACV,eAAgBG,CAClB,CAAC,CACH,EAAG,CAACH,EAAQG,CAAQ,CAAC,KAGrB,aAAU,IAAM,CACPG,EAAQ,CAAE,GAAIN,CAAO,CAAC,EAI7BO,EAAU,kBAAkB,CAAE,YAAAH,CAAY,CAAC,EAC3CG,EAAU,oBAAoB,CAAE,YAAAH,CAAY,CAAC,CAC/C,EAAG,CAACA,EAAaJ,CAAM,CAAC,KAGxB,aAAU,IAAM,CACd,IAAMQ,EAASH,EAAU,QAIrBG,IAAWR,GAAU,CAACI,IAIxBG,EAAU,aAAaC,EAAQR,CAAM,EACrCO,EAAU,QAAQP,CAAM,GAG1BO,EAAU,oBAAoB,CAAE,cAAe,SAAU,CAAC,EAE1DF,EAAU,QAAUL,CACtB,EAAG,CAACI,EAAaJ,EAAQK,CAAS,CAAC,KAOnC,aAAU,IAAM,CACCA,EAAU,UACVL,GAAU,CAACI,GAENG,EAAU,cAAc,EAC5B,WAAaP,GAEzBO,EAAU,QAAQP,CAAM,EAI5BK,EAAU,QAAUL,CACtB,EAAG,CAACI,EAAaJ,EAAQK,CAAS,CAAC,CACrC,EAEMI,GAA0BZ,GAA4B,CAC1D,GAAM,CAAE,IAAAa,CAAI,EAAIb,EACV,CAAE,uBAAAc,EAAwB,sBAAAC,EAAuB,SAAAC,CAAS,EAAIH,KAEpE,aAAU,IAAM,CACd,IAAMI,EAAW,CACf,MAAOH,EACP,QAAS,CACP,WAAY,GACZ,YAAa,eACb,MAAOE,IAAa,aACpB,SAAUD,CACZ,CACF,EAEA,GAAI,CACFL,EAAU,WAAW,CAAE,SAAAO,CAAS,CAAC,CACnC,MAAE,CAEF,CACF,EAAG,CAACH,EAAwBC,EAAuBC,CAAQ,CAAC,CAC9D,EAEME,GAAiBlB,GAA4B,CACjD,GAAM,CAAE,IAAAa,CAAI,EAAIb,EACV,CAAE,UAAAmB,EAAW,QAAAC,EAAS,YAAAC,EAAa,aAAAC,CAAa,EAAIT,KAE1D,aAAU,IAAM,CACdU,EAAWF,CAAW,EACtB,WAAW,UAAY,WAAW,WAAa,CAAC,EAChD,WAAW,KAAO,UAAY,CAC5B,WAAW,UAAU,KAAK,SAAS,CACrC,EACA,KAAK,KAAM,IAAI,IAAM,EACrB,KAAK,SAAUD,EAAS,CACtB,oBAAqB,WAAWD,IAChC,gBAAiB,aACjB,OAAQG,EACR,UAAWF,CACb,CAAC,CACH,EAAG,CAACD,EAAWC,EAASC,EAAaC,CAAY,CAAC,CACpD,EAGME,GAA0B,IAAM,CACpC,IAAMC,EAAYC,GAAkBC,GAASA,EAAM,SAAS,EACtD,CAAE,WAAAC,CAAW,EAAIC,GAAuC,EACxDC,EAAWC,EAAY,EAKvBC,EAAkBC,GAAsB,IAAI,EAElDC,EAAsB,IAAM,CAC1B,IAAMC,EAAcH,EAAgB,QAChCI,GAAeJ,EAAgB,OAAO,EACtC,KAEJA,EAAgB,QAAUF,EAC1BL,EAAU,CAAE,YAAAU,CAAY,CAAC,CAC3B,EAAG,CAACH,EAAiBF,EAAUL,CAAS,CAAC,EAEzCS,EAAsB,IAAM,CAC1BT,EAAU,CAAE,WAAAG,CAAW,CAAC,CAC1B,EAAG,CAACA,EAAYH,CAAS,CAAC,CAC5B,EAEMY,GAAsBrC,GAA4B,CACtDwB,GAAwB,EACxBN,GAAclB,CAAO,EACrBY,GAAuBZ,CAAO,EAC9BD,GAAuBC,CAAO,EAC9BsC,GAAmB,EACnBC,GAAuB,EACvBC,GAA0B,CAC5B,EAEOC,GAAQJ,GEtLf,IAAAK,GAA0B,SAK1B,IAAMC,GAAqBC,IACV,CACb,OAAQA,EAAI,iBACZ,WAAYA,EAAI,qBAChB,UAAWA,EAAI,oBACf,cAAeA,EAAI,wBACnB,kBAAmBA,EAAI,6BACvB,MAAOA,EAAI,gBACX,cAAeA,EAAI,uBACrB,GAIIC,GAAgB,MAAOD,GAAoB,CAC/C,GAAI,CACF,IAAME,EAASH,GAAkBC,CAAG,EAC9BG,EAAS,KAAM,QAAO,gCAAuB,EAC7C,CAAE,cAAAC,CAAc,EAAID,EAC1BC,EAAcF,CAAM,CAEtB,OAASG,EAAP,CACAC,GAAO,MAAM,sCAAuCD,CAAK,CAC3D,CACF,EAEME,GAAqBC,GAA4B,CACrD,GAAM,CAAE,IAAAC,CAAI,EAAID,KAChB,cAAU,IAAM,CACdP,GAAcQ,CAAG,CACnB,EAAG,CAACA,CAAG,CAAC,CACV,EAEOC,GAAQH,GChCf,IAAAI,GAA0B,SAEpBC,GAAY,oCACZC,GAAkB,uCAElBC,GAAsBC,GAA4B,CACjDC,KAGL,WAAW,SAAS,YAAcD,EAAQ,YAC5C,EAEME,GAA6B,IAAM,IACvC,cAAU,IAAM,CACdC,EAAWN,GAAW,CAAE,MAAO,EAAK,EAAG,SAAS,IAAI,EACpDM,EAAWL,GAAiB,CAAE,MAAO,EAAK,EAAG,SAAS,IAAI,CAC5D,EAAG,CAAC,CAAC,CACP,EAEMM,GAAsBJ,GAA4B,CACtDD,GAAmBC,CAAO,EAE1BK,GAAkBL,CAAO,EACzBM,GAAmBN,CAAO,EAC1BE,GAA2B,CAC7B,EAEOK,EAAQH,4CXiKX,IAAAI,EAAA,SAvCG,IAAMC,GAAuB,IAAM,CAC1C,GAAIC,EAAgB,CAAC,CAAE,IAAK,aAAc,KAAMA,CAAc,CAAC,EAAI,CAAC,CAAE,EAGzDC,GAAqB,IAAM,CACxC,CACE,MAAO,mEACT,EACA,CACE,KAAM,cACN,QAAS,kLACX,CAAC,EAQYC,GAA0B,CACrC,WAAYC,EAAqB,KACjC,WAAY,KAAO,CAAE,KAAM,MAAO,EACpC,EAEaC,GAA6C,CAAC,CACzD,WAAAC,EACA,aAAcC,CAChB,IAAM,CACJ,IAAMC,EAASF,GAAc,GAE7B,MAAI,uCAAqC,KAAKE,CAAM,CAKtD,EAEMC,GAAS,OAEX,oBACE,oBAAC,SAAM,KAAK,SAAS,MAAM,yBAAyB,GAAG,eAAe,KACtE,OAAC,QACC,IAAI,aACJ,KAAK,+DAA+D,KAEtE,OAAC,UACC,IAAI,uEACJ,MAAK,GACP,GACF,EAIEC,GAAM,IAAM,CAChB,IAAMC,EAAaC,EAA8B,EAC3C,CAAE,IAAAC,EAAK,YAAAC,EAAa,SAAAC,CAAS,EAAIJ,EACjCK,EAAc,CAAE,IAAAH,EAAK,YAAAC,EAAa,SAAAC,CAAS,EAEjD,OAAAE,EAAmBN,CAAU,KAG3B,QAAC,QAAK,KAAK,KAAK,IAAI,MAClB,qBAAC,QAEC,oBAAC,QAAK,QAAQ,QAAQ,KACtB,OAAC,QACC,KAAK,WACL,QAAQ,qDAAqD,KAE/D,OAAC,QAAK,IAAI,aAAa,KAAME,EAAI,QAAS,EACzCA,EAAI,iBAAiB,IAAKK,MAC3B,OAAC,QAAe,IAAI,aAAa,KAAMA,GAA5BA,CAAiC,CAC5C,KACA,OAAC,QAAK,IAAI,aAAa,KAAMC,EAAS,KACtC,OAACC,EAAA,EAAK,KACN,OAACC,EAAA,EAAM,KAEP,OAAC,UACC,wBAAyB,CACvB,OAAQ,4BAA4B,KAAK,UAAUR,CAAG,KACxD,EAAG,EAEJ,CAACS,EAAQT,EAAI,aAAa,MAC3B,OAAC,UACC,wBAAyB,CACvB,OAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,yDAKqCA,EAAI,kBACnD,EAAG,GAGP,KAKA,QAAC,QACC,qBAACU,GAAA,CAAa,MAAOP,EACnB,oBAACQ,EAAA,EAAiB,KAClB,QAACC,GAAA,CACC,oBAACC,EAAA,EAAO,KACR,OAACC,GAAA,EAAQ,GACX,KACA,OAACC,EAAA,EAAkB,KACnB,OAACC,EAAA,EAAQ,KACT,OAACC,EAAA,EAAW,GACd,KACA,OAACrB,GAAA,EAAO,GACV,GACF,CAEJ,EAEMsB,GAAmBC,MACzB,WAAQ,IAAM,CAEZ,GAAI,CADiBC,EAAqBD,CAAK,EAE7C,OAAOE,EAET,GAAM,CAAE,OAAAC,CAAO,EAAIH,EACnB,OAAIG,IAAW,IACNC,EAEFF,CACT,EAAG,CAACF,CAAK,CAAC,EAMGK,GAAqBC,GAAU,CAC1C,IAAMN,EAAQO,EAAc,EAC5BC,EAA+BR,CAAK,EACpC,IAAMS,EAAeV,GAAgBC,CAAK,EACpC,CAAE,IAAAnB,EAAM,CAAC,CAAS,EACxB6B,EAAuC,MAAM,GAAK,CAAC,EAY7CC,EAAerB,EAAQU,CAAK,EAElC,sBAAU,IAAM,CACd,IAAMY,EAAYC,GAA+B,CAC3CA,EAAM,WACR,OAAO,SAAS,OAAO,CAE3B,EACA,cAAO,iBAAiB,WAAYD,CAAQ,EACrC,IAAM,CACX,OAAO,oBAAoB,WAAYA,CAAQ,CACjD,CACF,EAAG,CAAC,CAAC,KAGH,QAAC,QAAK,KAAK,KAAK,IAAI,MAClB,qBAAC,QACC,oBAAC,QACC,KAAK,cACL,QAAQ,mLAAgL,KAE1L,OAAC,QAAK,IAAI,aAAa,KAAMzB,EAAS,KACtC,OAACC,EAAA,EAAK,KACN,OAACC,EAAA,EAAM,KAEP,OAAC,UACC,wBAAyB,CACvB,OAAQ,4BAA4B,KAAK,UAAUR,CAAG,KACxD,EAAG,EAEJ,CAACS,EAAQT,EAAI,aAAa,MAC3B,OAAC,UACC,wBAAyB,CACvB,OAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,yDAKqCA,EAAI,kBACnD,EAAG,GAGP,KACA,QAAC,QACC,oBAACe,EAAA,EAAkB,KACnB,OAACC,EAAA,EAAQ,KACT,OAACC,EAAA,EAAW,KACZ,OAACrB,GAAA,EAAO,EACNkC,EAAqD,QAAtC,OAACF,EAAA,CAAa,UAAU,SAAS,GACpD,GACF,CAEJ,EAEOK,GAAQC,EAAWrC,EAAG", "names": ["cssBundleHref", "import_node", "import_react", "import_react", "import_jsx_runtime", "Drawers", "Container", "Container_default", "Drawers_default", "Container_default", "import_jsx_runtime", "ErrorPreview", "className", "title", "subtitle", "children", "navigate", "useNavigate", "Center_default", "twMerge", "SvgSprite_default", "Box_default", "Typography_default", "Button_default", "ErrorPreview_default", "import_jsx_runtime", "Error404", "className", "ErrorPreview_default", "Error404_default", "import_jsx_runtime", "ErrorUnknown", "className", "ErrorPreview_default", "ErrorUnknown_default", "import_react", "import_jsx_runtime", "FAKE_MAX_PROGRESS", "FRAME_DELAY", "useProgress", "progress", "setProgress", "animationRef", "navState", "useNavigation", "timerRef", "animate", "prevProgress", "newProgress", "start", "end", "isIdle", "isLoading", "Transition", "indicatorStyle", "$67824d98245208a0$export$b25a304ec7d746bb", "clsx_m_default", "$67824d98245208a0$export$2b776f7e7ee60dbd", "Transition_default", "Transition_default", "import_react", "toLocationPath", "location", "search", "pathname", "useAnalyticsUserEffect", "context", "currentUser", "isLogoutRedirect", "userId", "email", "phone", "simpleId", "isAnonymous", "prevIdRef", "setUser", "ri", "prevId", "useAnalyticsInitEffect", "ENV", "MIXPANEL_PROJECT_TOKEN", "MIXPANEL_PROXY_DOMAIN", "NODE_ENV", "mixpanel", "useGtagEffect", "GTAG_HOST", "GTAG_ID", "GTAG_JS_URL", "ORGANIZATION", "loadScript", "useAnalyticsStoreEffect", "setParams", "useAnalyticsStore", "state", "screenName", "useRouteHandle_default", "location", "useLocation", "prevLocationRef", "usePrevious_default", "useClientLayoutEffect_default", "previousUrl", "toLocationPath", "useAnalyticsEffect", "usePageViewTracker_default", "usePageDurationTracker_default", "useSessionDurationTracker_default", "useAnalyticsEffect_default", "import_react", "getFirebaseConfig", "env", "setupFirebase", "config", "module", "initializeApp", "error", "Logger", "useFirebaseEffect", "context", "ENV", "useFirebaseEffect_default", "import_react", "RE_TAG_JS", "ALPHA_TARGET_JS", "injectDebugHelpers", "context", "canUseDOM", "useThirdPartyScriptEffects", "loadScript", "useAppLaunchEffect", "useFirebaseEffect_default", "useAnalyticsEffect_default", "useAppLaunchEffect_default", "import_jsx_runtime", "links", "cssBundleHref", "meta", "handle", "t", "shouldRevalidate", "formAction", "_actionResult", "action", "Fastrr", "App", "loaderData", "useLoaderData", "ENV", "currentUser", "isMobile", "rootContext", "useAppLaunchEffect_default", "url", "main_default", "Meta", "Links", "isEmpty_default", "RootProvider", "Transition_default", "ToastProvider_default", "Outlet", "Drawers_default", "ScrollRestoration", "Scripts", "LiveReload", "useErrorPreview", "error", "isRouteErrorResponse", "ErrorUnknown_default", "status", "Error404_default", "ErrorBoundary", "props", "useRouteError", "captureRemixErrorBoundaryError", "ErrorPreview", "useRouteLoaderData", "isEmptyError", "listener", "event", "root_default", "withSentry"] }