@shoppexio/storefront-react 0.0.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/LICENSE +21 -0
- package/README.md +215 -0
- package/dist/account.css +1171 -0
- package/dist/account.d.ts +23 -0
- package/dist/account.js +12685 -0
- package/dist/account.js.map +1 -0
- package/dist/chunk-D6XKDVAV.js +181 -0
- package/dist/chunk-D6XKDVAV.js.map +1 -0
- package/dist/index.d.ts +3087 -0
- package/dist/index.js +2801 -0
- package/dist/index.js.map +1 -0
- package/eject/account/account-availability.ts +171 -0
- package/eject/account/account-downloads.ts +118 -0
- package/eject/account/account-favorites.ts +99 -0
- package/eject/account/account-loyalty.ts +241 -0
- package/eject/account/account-page.tsx +410 -0
- package/eject/account/account-payment-method.ts +99 -0
- package/eject/account/account-referrals.ts +68 -0
- package/eject/account/account-reseller-invite.ts +88 -0
- package/eject/account/account-reseller.ts +685 -0
- package/eject/account/account-rewards.ts +104 -0
- package/eject/account/account-settings.ts +181 -0
- package/eject/account/account-signin-link.ts +122 -0
- package/eject/account/account-subscriptions.ts +130 -0
- package/eject/account/account-support.ts +155 -0
- package/eject/account/account-warranties.ts +118 -0
- package/eject/account/customer-account.ts +93 -0
- package/eject/account/dashboard.tsx +139 -0
- package/eject/account/downloads.tsx +343 -0
- package/eject/account/favorites.tsx +201 -0
- package/eject/account/i18n.ts +175 -0
- package/eject/account/icons.tsx +218 -0
- package/eject/account/login.tsx +253 -0
- package/eject/account/messages/ar.json +464 -0
- package/eject/account/messages/de.json +464 -0
- package/eject/account/messages/en.json +464 -0
- package/eject/account/messages/es.json +464 -0
- package/eject/account/messages/fi.json +464 -0
- package/eject/account/messages/fr.json +464 -0
- package/eject/account/messages/hi.json +464 -0
- package/eject/account/messages/it.json +464 -0
- package/eject/account/messages/lt.json +464 -0
- package/eject/account/messages/nl.json +464 -0
- package/eject/account/messages/pl.json +464 -0
- package/eject/account/messages/pt.json +464 -0
- package/eject/account/messages/ru.json +464 -0
- package/eject/account/messages/tr.json +464 -0
- package/eject/account/messages/uk.json +464 -0
- package/eject/account/messages/zh.json +464 -0
- package/eject/account/orders.tsx +791 -0
- package/eject/account/overview.tsx +147 -0
- package/eject/account/referrals.tsx +327 -0
- package/eject/account/reseller.tsx +1365 -0
- package/eject/account/rewards.tsx +641 -0
- package/eject/account/settings.tsx +699 -0
- package/eject/account/shared.tsx +398 -0
- package/eject/account/subscriptions.tsx +421 -0
- package/eject/account/support.tsx +453 -0
- package/package.json +79 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/account/account-page.tsx","../src/account/account-availability.ts","../src/account/account-reseller-invite.ts","../src/account/account-signin-link.ts","../src/account/messages/ar.json","../src/account/messages/de.json","../src/account/messages/en.json","../src/account/messages/es.json","../src/account/messages/fi.json","../src/account/messages/fr.json","../src/account/messages/hi.json","../src/account/messages/it.json","../src/account/messages/lt.json","../src/account/messages/nl.json","../src/account/messages/pl.json","../src/account/messages/pt.json","../src/account/messages/ru.json","../src/account/messages/tr.json","../src/account/messages/uk.json","../src/account/messages/zh.json","../src/account/i18n.ts","../src/account/customer-account.ts","../src/account/dashboard.tsx","../src/account/account-reseller.ts","../src/account/shared.tsx","../src/account/icons.tsx","../src/account/downloads.tsx","../src/account/account-downloads.ts","../src/account/favorites.tsx","../src/account/account-favorites.ts","../src/account/login.tsx","../src/account/orders.tsx","../src/account/account-payment-method.ts","../src/account/account-warranties.ts","../src/account/overview.tsx","../src/account/account-referrals.ts","../src/account/referrals.tsx","../src/account/reseller.tsx","../src/account/rewards.tsx","../src/account/account-loyalty.ts","../src/account/account-rewards.ts","../src/account/settings.tsx","../src/account/account-settings.ts","../src/account/subscriptions.tsx","../src/account/account-subscriptions.ts","../src/account/support.tsx","../src/account/account-support.ts"],"sourcesContent":["import { useEffect, useState, type ComponentType, type ReactElement, type ReactNode } from 'react';\nimport { Link, Navigate, useLocation } from 'react-router-dom';\nimport {\n isAccountTabOffered,\n type AccountAvailability,\n} from './account-availability';\nimport {\n IMPLEMENTED_ACCOUNT_TABS,\n accountTabHref,\n accountTabLabelKey,\n canonicalAccountPath,\n resolveAccountView,\n type AccountTab,\n type AccountView,\n type ImplementedAccountTab,\n} from '../account-route';\nimport { captureAccountResellerInvite } from './account-reseller-invite';\nimport {\n takeAccountSignInPrefill,\n type AccountSignInPrefill,\n} from './account-signin-link';\nimport { callCustomerApi } from './customer-account';\nimport { t } from './i18n';\nimport {\n AccountShellProvider,\n useAccountAvailability,\n useAccountShellReads,\n} from './dashboard';\nimport { AccountDownloads } from './downloads';\nimport { AccountFavorites } from './favorites';\nimport { AccountLogin } from './login';\nimport { AccountOrderDetail, AccountOrders } from './orders';\nimport { AccountOverview } from './overview';\nimport { AccountReferrals } from './referrals';\nimport { AccountReseller } from './reseller';\nimport { AccountRewards } from './rewards';\nimport { AccountSettings } from './settings';\nimport { AccountSubscriptions } from './subscriptions';\nimport { AccountSupport } from './support';\nimport { AccountEmpty, AccountError, AccountRowsSkeleton, BusySpinner } from './shared';\n\n/**\n * The customer account, served from this storefront's own build.\n *\n * ONE shell under `/dashboard`, with the panel as a path segment below it —\n * `/dashboard/orders`, `/dashboard/orders/<uniqid>`. That is the platform's\n * route shape and it is the same on every lane, so a link in an order email\n * works whether the shop runs a document theme or either code storefront. The\n * retired `?tab=`/`?order=` spelling is accepted and canonicalized here;\n * nothing in this template writes it.\n *\n * The session is an HttpOnly cookie the Shoppex worker sets on the merchant's\n * own host. This component cannot read it and does not try: it asks the API who\n * is signed in, and renders the sign-in form when the answer is nobody.\n */\n\ntype SessionState =\n | { status: 'checking' }\n | { status: 'signed-out' }\n | { status: 'signed-in' }\n | { status: 'unknown'; message: string };\n\n/**\n * The prefill for this page load, taken from the cookie the first time it is\n * asked for.\n *\n * Module scope rather than a hook, because the cookie can be read exactly once:\n * reading it deletes it, and React invokes a `useState` initializer twice under\n * StrictMode. The second read would find an empty jar and null out a prefill the\n * first read had already spent.\n */\nlet takenPrefill: AccountSignInPrefill | null | undefined;\n\nexport function takeSignInPrefillOnce(): AccountSignInPrefill | null {\n if (takenPrefill === undefined) takenPrefill = takeAccountSignInPrefill(document);\n return takenPrefill;\n}\n\n/**\n * Spend the prefill for good — component state AND the module memo.\n *\n * Clearing only the component's copy leaves the pair here for the next mount.\n * This is a single-page app: the buyer walks off to a product, their session\n * expires, they navigate back to `/dashboard`, and the page remounts from this\n * cache — putting the old address and a long-dead code back in the form for\n * whoever is at the browser.\n */\nexport function spendSignInPrefill(): null {\n takenPrefill = null;\n return null;\n}\n\n/** `?tab=` and `?order=` are this route's to drop; everything else is not. */\nfunction remainingSearch(search: URLSearchParams): string {\n const kept = new URLSearchParams(search);\n kept.delete('tab');\n kept.delete('order');\n // `invoice` is the portal's spelling for `order` and `canonicalAccountPath`\n // counts it as legacy too, so leaving it here would re-trigger this very\n // redirect on the next render — the loop the paragraph above warns about.\n kept.delete('invoice');\n const query = kept.toString();\n return query ? `?${query}` : '';\n}\n\n/** What the host storefront hands the account. */\nexport interface AccountPageProps {\n /**\n * The storefront's own page chrome around the account: the same column,\n * gutter and rhythm every other page renders into. The account draws\n * everything inside it and nothing around it.\n */\n frame: ComponentType<{ children: ReactNode }>;\n /**\n * What a path under the account that names no account surface renders —\n * the storefront's own not-found page, so a mistyped link looks like every\n * other missing page on the shop.\n */\n notFound: ReactNode;\n}\n\nexport function AccountPage({ frame: Frame, notFound }: AccountPageProps) {\n const location = useLocation();\n const search = new URLSearchParams(location.search);\n const canonical = canonicalAccountPath(location.pathname, search);\n const view = resolveAccountView(location.pathname, search);\n const [session, setSession] = useState<SessionState>({ status: 'checking' });\n const [signOutError, setSignOutError] = useState<string | null>(null);\n const [signingOut, setSigningOut] = useState(false);\n const [probeToken, setProbeToken] = useState(0);\n const [prefill, setPrefill] = useState(takeSignInPrefillOnce);\n\n useEffect(() => {\n let active = true;\n\n // An artifact-owned account receives the reseller invitation in the URL —\n // the worker only mints the cookie for platform-rendered surfaces. Move it\n // into the cookie before anything else, so the sign-in navigation that may\n // follow (a new tab included) cannot lose it. Idempotent under StrictMode.\n captureAccountResellerInvite(document, window);\n\n /*\n * The session probe.\n *\n * Only a 401 means \"not signed in\". A 403, a 5xx, a contract mismatch or a\n * network error with no status at all means the answer is UNKNOWN, and\n * showing the sign-in form there tells a buyer whose session is still live\n * that they have been signed out. Those get an error and a retry.\n *\n * The opposite must never happen either: a failed probe treated as a\n * signed-in customer would render an account shell around data that was\n * never fetched.\n */\n void callCustomerApi((sdk) => sdk.me()).then((result) => {\n if (!active) return;\n\n if (result.success) {\n // Already signed in, so the link's code was never needed — and neither\n // a later sign-out nor a remount may bring it back.\n setPrefill(spendSignInPrefill());\n setSession({ status: 'signed-in' });\n return;\n }\n\n if (result.status === 401) {\n setSession({ status: 'signed-out' });\n return;\n }\n\n setSession({\n status: 'unknown',\n message: result.message?.trim() || t('account.sessionUnknown'),\n });\n });\n\n return () => {\n active = false;\n };\n }, [probeToken]);\n\n const signOut = async () => {\n setSigningOut(true);\n setSignOutError(null);\n const result = await callCustomerApi((sdk) => sdk.logout());\n setSigningOut(false);\n\n // The worker clears the session cookie on every response it produces, even\n // a 500 from the backend — so an ANSWERED request means the buyer really is\n // signed out, whatever the status says. Only a result with no status at all\n // means nothing reached the edge: the cookie is still there, the session is\n // still live, and a signed-out page would be a lie the next reload exposes.\n if (!result.success && result.status === undefined) {\n setSignOutError(result.message?.trim() || t('account.signOutFailed'));\n return;\n }\n setSession({ status: 'signed-out' });\n };\n\n /*\n * A retired spelling is rewritten before anything renders — replace, not\n * push, so the back button leaves the account rather than bouncing between\n * two spellings of one panel. Returning the redirect here rather than running\n * it from an effect also means the panel below mounts once, on the canonical\n * URL, instead of loading its data twice.\n */\n if (canonical !== null) return <Navigate to={`${canonical}${remainingSearch(search)}`} replace />;\n\n /*\n * A path naming no account surface is NOT this route (ADR-0064), and it is\n * answered before anything asks who is signed in. Answering it inside the\n * account meant a buyer who followed a mistyped link was shown a sign-in form\n * first and only told the link was broken after they had used it — a password\n * prompt standing in front of a 404.\n */\n if (view.kind === 'unknown-tab') return <>{notFound}</>;\n\n return (\n <Frame>\n <section className=\"sx-account sxa:space-y-8 sxa:py-6 sxa:md:py-8\" data-sx-account-session={session.status}>\n <div className=\"sx-account-header sxa:flex sxa:flex-wrap sxa:items-end sxa:justify-between sxa:gap-4\">\n <h1 className=\"sx-account-title sxa:font-heading sxa:text-h1\">\n {t('account.title')}\n </h1>\n {session.status === 'signed-in' ? (\n <button\n type=\"button\"\n onClick={() => void signOut()}\n disabled={signingOut}\n aria-busy={signingOut || undefined}\n className=\"sx-account-signout sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {signingOut ? <BusySpinner className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" /> : null}\n {signingOut ? t('account.signingOut') : t('account.signOut')}\n </button>\n ) : null}\n </div>\n\n {session.status === 'checking' ? (\n <AccountRowsSkeleton rows={3} label={t('account.checkingSession')} />\n ) : null}\n\n {session.status === 'signed-out' ? (\n <AccountLogin\n prefill={prefill}\n onSignedIn={() => {\n // Spent. Without this the pair outlives the sign-in — here and in\n // the module memo behind it — so signing out, or navigating away\n // and back, remounts the form with the previous buyer's address\n // and their already-used code.\n setPrefill(spendSignInPrefill());\n setSession({ status: 'signed-in' });\n }}\n />\n ) : null}\n\n {session.status === 'unknown' ? (\n <div className=\"sxa:mx-auto sxa:w-full sxa:max-w-md\">\n <AccountError\n message={session.message}\n onRetry={() => {\n setSession({ status: 'checking' });\n setProbeToken((token) => token + 1);\n }}\n />\n </div>\n ) : null}\n\n {session.status === 'signed-in' ? (\n <SignedInAccount view={view} signOutError={signOutError} />\n ) : null}\n </section>\n </Frame>\n );\n}\n\n/**\n * Everything below the sign-in: the shell's two reads, the gated navigation,\n * and the panel.\n *\n * Its own component because the reads have to sit ABOVE both the navigation and\n * the panel — the navigation gates on them and seven panels are built from the\n * dashboard payload. They used to be loaded by each panel separately, which is\n * why the shell had nothing to gate with.\n */\nfunction SignedInAccount({\n view,\n signOutError,\n}: {\n view: AccountView;\n signOutError: string | null;\n}) {\n /*\n * The surface being shown, and therefore what the shell's reads are keyed on.\n * An order detail rides on the orders key: it loads its own order and needs\n * nothing re-read to show it.\n */\n const panelKey = view.kind === 'panel' ? view.tab : 'orders';\n const reads = useAccountShellReads(panelKey);\n const availability = useAccountAvailability(reads);\n\n return (\n <AccountShellProvider value={reads}>\n {signOutError ? <AccountError message={signOutError} /> : null}\n <AccountNav view={view} availability={availability} />\n <div className=\"sx-account-panel\" data-sx-account-view={view.kind === 'panel' ? view.tab : view.kind}>\n <AccountPanel view={view} />\n </div>\n </AccountShellProvider>\n );\n}\n\n/**\n * The tabs this storefront offers this customer.\n *\n * Gated, because ADR-0064 names the portal's `visibleSections()` model as\n * contract and requires it reproduced rather than simplified away — the\n * document lane reproduces it, so a code storefront that did not would show a\n * Referrals tab to a buyer whose shop runs no programme while the very same\n * shop on the other lane hides it. The rules live in `account-availability.ts`;\n * this only draws what they admit.\n */\nfunction AccountNav({\n view,\n availability,\n}: {\n view: AccountView;\n availability: AccountAvailability | null;\n}) {\n const activeTab: AccountTab | null = view.kind === 'panel'\n ? view.tab\n : view.kind === 'order'\n ? 'orders'\n : null;\n\n return (\n <nav className=\"sx-account-nav sxa:flex sxa:flex-wrap sxa:gap-1\" aria-label={t('account.sections')}>\n {IMPLEMENTED_ACCOUNT_TABS\n .filter((tab) => isAccountTabOffered(tab, availability, activeTab))\n .map((tab) => (\n <Link\n key={tab}\n to={accountTabHref(tab)}\n aria-current={activeTab === tab ? 'page' : undefined}\n className={`sx-account-nav-link sxa:nav-link sxa:rounded-input sxa:px-3 sxa:py-1.5 sxa:text-small ${activeTab === tab ? 'sxa:nav-link--active' : ''}`}\n >\n {t(accountTabLabelKey(tab))}\n </Link>\n ))}\n </nav>\n );\n}\n\n/**\n * Every implemented tab, and its panel.\n *\n * A record rather than a switch with a default: the key type is\n * `ImplementedAccountTab`, so adding a tab to that list without building its\n * panel stops the build. A default branch would instead quietly answer the new\n * tab with the overview, which is the \"looks like the link worked\" failure the\n * route module exists to prevent.\n */\nconst ACCOUNT_PANELS: Readonly<Record<ImplementedAccountTab, () => ReactElement>> = {\n overview: () => <AccountOverview />,\n orders: () => <AccountOrders />,\n downloads: () => <AccountDownloads />,\n subscriptions: () => <AccountSubscriptions />,\n rewards: () => <AccountRewards />,\n referrals: () => <AccountReferrals />,\n favorites: () => <AccountFavorites />,\n support: () => <AccountSupport />,\n settings: () => <AccountSettings />,\n reseller: () => <AccountReseller />,\n};\n\nfunction AccountPanel({ view }: { view: AccountView }) {\n switch (view.kind) {\n case 'panel':\n return ACCOUNT_PANELS[view.tab]();\n case 'order':\n return <AccountOrderDetail orderId={view.orderId} />;\n case 'not-built':\n /*\n * A real platform tab this storefront does not render. Said plainly\n * rather than answered with the overview, which would look like the link\n * worked and leave the buyer hunting for something that is not there.\n */\n return (\n <AccountEmpty\n title={t('account.notBuilt.title', { tab: t(accountTabLabelKey(view.tab)) })}\n body={t('account.notBuilt.body')}\n action={<OverviewLink />}\n />\n );\n case 'unknown-tab':\n // Answered above, before the session is even read. Unreachable here, and\n // the compiler holds the switch exhaustive so it cannot be dropped.\n return null;\n }\n}\n\nfunction OverviewLink() {\n return (\n <Link\n to={accountTabHref('overview')}\n className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small\"\n >\n {t('account.goToOverview')}\n </Link>\n );\n}\n","/**\n * Which account destinations this customer has anything behind.\n *\n * ADR-0064 names the gating model from the retired portal's `visibleSections()`\n * as part of the contract, to be reproduced rather than simplified away, and\n * the document lane reproduces it in\n * `packages/storefront-commerce/src/sx/account-nav-core.ts`. This is the same\n * model for the code lane. It is a separate module, not a few conditions inside\n * the navigation, because the rules are a contract two lanes have to agree on —\n * and because a rule inside JSX is a rule no test can read.\n *\n * The counters come off the ONE `dashboard()` payload the shell already loads,\n * so gating costs no request. `reseller` is the exception: it lives behind its\n * own read and is passed in.\n *\n * Two leaves are deliberately ungated, and the reasoning is the portal's:\n *\n * - `rewards` — the dashboard assigns the rewards object unconditionally and\n * the producer returns a zeroed summary when there is nothing to report, so\n * its presence carries no information. Gating it would need a programme flag\n * the payload does not send; inferring one is the invented value the repo's\n * fallback policy prohibits.\n * - `favorites` — offered to every customer.\n */\n\nimport type { ResellerProgramState } from './account-reseller';\nimport type { AccountTab } from '../account-route';\n\n/** The signals a gate is decided on, read off the dashboard payload. */\nexport interface AccountAvailabilitySource {\n licensesCount: number;\n deliverablesCount: number;\n subscriptionsCount: number;\n walletPresent: boolean;\n affiliateState: string;\n}\n\nexport interface AccountAvailability {\n downloads: boolean;\n subscriptions: boolean;\n wallet: boolean;\n rewards: boolean;\n referrals: boolean;\n favorites: boolean;\n reseller: boolean;\n}\n\n/**\n * The gate each tab hangs on. `always` is the four leaves every customer has:\n * the overview, their orders, support and their own settings.\n *\n * `wallet` is in the gate set but is NOT a tab — it is the embedded section\n * inside the overview, gated on the same signal.\n */\nexport type AccountGate =\n | 'always'\n | 'downloads'\n | 'subscriptions'\n | 'wallet'\n | 'rewards'\n | 'referrals'\n | 'favorites'\n | 'reseller';\n\nconst TAB_GATES: Readonly<Record<AccountTab, AccountGate>> = {\n overview: 'always',\n orders: 'always',\n support: 'always',\n settings: 'always',\n downloads: 'downloads',\n subscriptions: 'subscriptions',\n rewards: 'rewards',\n referrals: 'referrals',\n favorites: 'favorites',\n reseller: 'reseller',\n};\n\nexport function accountTabGate(tab: AccountTab): AccountGate {\n return TAB_GATES[tab];\n}\n\nexport function accountAvailabilityFrom(\n source: AccountAvailabilitySource,\n reseller: ResellerProgramState | null,\n): AccountAvailability {\n return {\n downloads: source.licensesCount > 0 || source.deliverablesCount > 0,\n subscriptions: source.subscriptionsCount > 0,\n wallet: source.walletPresent,\n rewards: true,\n referrals: source.affiliateState !== 'not_enrolled',\n favorites: true,\n reseller: accountResellerAvailable(reseller),\n };\n}\n\n/**\n * A shop with no programme has no wholesale surface. One that enrolls by\n * invitation only (`MANUAL`) shows the tab to the invited and to nobody else;\n * an `APPLICATION` or `OPEN` programme shows it to everyone, because applying\n * is the point of the tab.\n */\nexport function accountResellerAvailable(program: ResellerProgramState | null): boolean {\n if (!program?.program_enabled) return false;\n return program.reseller !== null || program.enrollment_mode.toUpperCase() !== 'MANUAL';\n}\n\n/**\n * What the navigation may offer given what has answered SO FAR.\n *\n * Pure, and separate from the hook that calls it, because the sequencing is the\n * part that was wrong: the dashboard gates were made to wait on the reseller\n * read, so a slow wholesale endpoint emptied a navigation it has nothing to do\n * with. Three rules, each of which a test can hold:\n *\n * - the dashboard gates are decided the moment the dashboard answers, and never\n * wait on anything else;\n * - a reseller programme that has not answered, or failed to, leaves that one\n * gate shut — it is an unanswered question, not a shop without a programme;\n * - while a revalidation is in flight the last known answer stands, so moving\n * between panels does not empty the navigation and refill it.\n */\nexport function availabilityFromShellReads(\n dashboard: AccountAvailabilitySource | null,\n program: ResellerProgramState | null,\n lastKnown: AccountAvailability | null,\n): AccountAvailability | null {\n if (dashboard === null) return lastKnown;\n\n const availability = accountAvailabilityFrom(dashboard, program);\n\n /*\n * The two reads revalidate together and answer separately. When the dashboard\n * lands first, this used to recompute the wholesale gate as shut — so an\n * eligible buyer moving from the overview to their orders watched the\n * Wholesale tab vanish and come back a moment later. Holding the previous\n * answer for that one gate is not inventing a value: it is the last thing the\n * producer actually said, kept until it says otherwise. On a first load there\n * is nothing to hold and the gate stays shut.\n */\n if (program === null && lastKnown !== null) {\n return { ...availability, reseller: lastKnown.reseller };\n }\n\n return availability;\n}\n\n/**\n * Whether a tab is offered.\n *\n * The active tab is never hidden — that rule is named in ADR-0064 and it is\n * what keeps a buyer who followed a link from an order email from finding the\n * navigation missing the very page they are standing on. Hiding it would leave\n * them looking at a panel with no way back to it.\n */\nexport function isAccountTabOffered(\n tab: AccountTab,\n availability: AccountAvailability | null,\n activeTab: AccountTab | null,\n): boolean {\n if (tab === activeTab) return true;\n\n const gate = accountTabGate(tab);\n if (gate === 'always') return true;\n\n // Nothing has answered yet. A gated leaf stays hidden rather than appearing\n // and then vanishing under the buyer's cursor a moment later.\n if (availability === null) return false;\n\n return availability[gate];\n}\n","/**\n * The reseller invitation token, carried across sign-in as a cookie.\n *\n * On an artifact-owned account the edge worker deliberately leaves\n * `reseller_invite` in the URL — this bundle is immutable merchant code, and an\n * older build would otherwise watch the worker strip a token nobody reads.\n * `captureAccountResellerInvite` is therefore this template's own handoff: it\n * moves the token from the URL into the same `__Host-` cookie the worker mints\n * for platform-rendered accounts, and scrubs the parameter before it can linger\n * in history or a copied link.\n *\n * Reading is deliberately not consumption. A reload, a sign-in link opened in a\n * new tab, or a session for another email must leave the token available while\n * its one-hour cookie lives. Callers clear it explicitly after an accept\n * attempt.\n */\n\n/** Pinned to `workers/storefront/src/reseller-invite-link.ts`. */\nexport const ACCOUNT_RESELLER_INVITE_COOKIE = '__Host-sx_reseller_invite';\n\n/** Pinned to the email producer (`ResellerEnrollmentEmailService`). */\nexport const ACCOUNT_RESELLER_INVITE_PARAM = 'reseller_invite';\n\nconst INVITE_TTL_SECONDS = 3600;\n\nconst CLEAR_RESELLER_INVITE_COOKIE = `${ACCOUNT_RESELLER_INVITE_COOKIE}=; Path=/; Secure; SameSite=Lax; Max-Age=0`;\n\nexport interface AccountResellerInviteCookieJar {\n cookie: string;\n}\n\n/** The slice of `window` the capture needs; a seam for tests. */\nexport interface AccountResellerInviteLocation {\n location: { search: string; pathname: string; hash: string };\n history: { replaceState(data: unknown, unused: string, url: string): void };\n}\n\nfunction cookieValue(jar: string, name: string): string | null {\n for (const entry of jar.split(';')) {\n const separator = entry.indexOf('=');\n if (separator < 0) continue;\n if (entry.slice(0, separator).trim() !== name) continue;\n return entry.slice(separator + 1).trim();\n }\n return null;\n}\n\nfunction usableInviteToken(raw: string | null): string | null {\n if (!raw || !/^[A-Za-z0-9_-]+$/.test(raw)) return null;\n return raw;\n}\n\n/**\n * Move a URL-borne invitation into the cookie, scrubbing the parameter.\n *\n * The scrub happens even for an unusable value — a malformed token has no\n * business staying in the address bar either. Idempotent: a second call finds\n * no parameter and does nothing, so a StrictMode double-mount is harmless.\n */\nexport function captureAccountResellerInvite(\n jar: AccountResellerInviteCookieJar,\n win: AccountResellerInviteLocation,\n): void {\n const params = new URLSearchParams(win.location.search);\n if (!params.has(ACCOUNT_RESELLER_INVITE_PARAM)) return;\n\n const token = usableInviteToken(params.get(ACCOUNT_RESELLER_INVITE_PARAM));\n params.delete(ACCOUNT_RESELLER_INVITE_PARAM);\n const query = params.toString();\n win.history.replaceState(\n null,\n '',\n `${win.location.pathname}${query ? `?${query}` : ''}${win.location.hash}`,\n );\n\n if (!token) return;\n jar.cookie = `${ACCOUNT_RESELLER_INVITE_COOKIE}=${token}; Path=/; Secure; SameSite=Lax; Max-Age=${INVITE_TTL_SECONDS}`;\n}\n\n/** Read without consuming; the producer's base64url token is already cookie-safe. */\nexport function peekAccountResellerInvite(jar: AccountResellerInviteCookieJar): string | null {\n return usableInviteToken(cookieValue(jar.cookie, ACCOUNT_RESELLER_INVITE_COOKIE));\n}\n\n/** Clear after an accept attempt, with the same `__Host-` attributes as the producer. */\nexport function clearAccountResellerInvite(jar: AccountResellerInviteCookieJar): void {\n jar.cookie = CLEAR_RESELLER_INVITE_COOKIE;\n}\n","/**\n * The OTP email's sign-in link, handed to the account page in a cookie\n * (ADR-0064 S11).\n *\n * **Following the link verifies nothing.** It carries the email and the code\n * the buyer was just sent, and everything here does with them is put them in\n * the form. No request is made, nothing is consumed, and no session is created\n * — a corporate mail scanner that fetches the URL leaves the code exactly as\n * valid as it found it, which is the property ADR-0052 chose codes to protect\n * and the reason this link is allowed to exist beside them.\n *\n * The link's `sx_login_email` / `sx_login_code` parameters never reach the\n * browser. The Shoppex edge worker injects merchant analytics — Google\n * Analytics, GTM, Meta Pixel, TikTok — synchronously into `<head>`, and those\n * run before this storefront's bundle does, so a page-view beacon would carry a\n * live one-time code to a third party whatever this page did with the URL a\n * moment later. The worker therefore answers the link with a redirect to the\n * clean URL and puts the pair in the cookie named below. That worker is the\n * only producer: there is no query-string path here, because a URL carrying\n * these values is one the browser is never supposed to see.\n *\n * The cookie is deliberately readable by JavaScript — this page has to read it\n * — which is why the worker gives it two minutes and why the read below deletes\n * it on the way out. It holds a credential for exactly one navigation.\n *\n * The document lane reads the same cookie in\n * `packages/storefront-commerce/src/sx/account-signin-link.ts`. This template is\n * built standalone against the published SDK and cannot import from the\n * monorepo, so it carries its own copy and pins the name and value shape in\n * `tests/account-signin-link.test.ts` — the same arrangement the document lane\n * uses for the same reason.\n *\n * Neither value is judged beyond \"is it usable as a form value\". The backend is\n * the authority on whether a code is valid, and a client that decided the shape\n * of a code would be inventing a contract the producer never promised.\n */\n\n/** The worker's cookie name, pinned here because it cannot be imported. */\nexport const ACCOUNT_SIGN_IN_PREFILL_COOKIE = '__Host-sx_signin_prefill';\n\nconst MAX_EMAIL_LENGTH = 254;\nconst MAX_CODE_LENGTH = 64;\n\n/**\n * Deleting a cookie is a write, and the `__Host-` prefix makes the browser\n * REJECT a write that is not `Secure` with `Path=/` and no `Domain`. A delete\n * that dropped those attributes would silently do nothing and leave the code in\n * the jar for the rest of its two minutes, so the attributes mirror the\n * worker's exactly.\n */\nconst CLEAR_PREFILL_COOKIE = `${ACCOUNT_SIGN_IN_PREFILL_COOKIE}=; Path=/; Secure; SameSite=Lax; Max-Age=0`;\n\nexport interface AccountSignInPrefill {\n email: string;\n code: string;\n}\n\n/** The two things this needs from `document`: read the jar, write one cookie back. */\nexport interface AccountCookieJar {\n cookie: string;\n}\n\n/** A form value has to be one line and non-empty to be worth putting in a field. */\nfunction usable(raw: unknown, maxLength: number): string {\n const value = typeof raw === 'string' ? raw.trim() : '';\n if (!value || value.length > maxLength) return '';\n return /\\s/.test(value) ? '' : value;\n}\n\n/** The raw, still-encoded value of one cookie in a `document.cookie` string. */\nfunction cookieValue(jar: string, name: string): string | null {\n for (const entry of jar.split(';')) {\n const separator = entry.indexOf('=');\n if (separator < 0) continue;\n if (entry.slice(0, separator).trim() !== name) continue;\n return entry.slice(separator + 1).trim();\n }\n return null;\n}\n\n/**\n * The email and code to put in the login form, or null when the cookie does not\n * carry a usable pair. Half a pair is not a prefill: filling one field and\n * leaving the other empty is worse than leaving the form untouched.\n */\nfunction parsePrefill(raw: string): AccountSignInPrefill | null {\n let value: unknown;\n try {\n value = JSON.parse(decodeURIComponent(raw));\n } catch {\n return null;\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n\n const record = value as Record<string, unknown>;\n const email = usable(record.email, MAX_EMAIL_LENGTH);\n const code = usable(record.code, MAX_CODE_LENGTH);\n if (!email || !code) return null;\n return { email, code };\n}\n\n/**\n * Read the prefill and delete the cookie, in that one step.\n *\n * Reading and deleting are the same operation on purpose: a caller that could\n * read without deleting would leave a credential in a JavaScript-readable\n * cookie for every script on the page to find, for two minutes, on a surface\n * where merchants install their own analytics.\n *\n * The delete happens BEFORE the value is parsed, so a malformed cookie — the\n * only kind this page cannot use — is removed just as surely as a good one.\n * An absent cookie is the ordinary case (a buyer who typed the URL) and is\n * neither a prefill nor a reason to write anything.\n */\nexport function takeAccountSignInPrefill(jar: AccountCookieJar): AccountSignInPrefill | null {\n const raw = cookieValue(jar.cookie, ACCOUNT_SIGN_IN_PREFILL_COOKIE);\n if (raw === null) return null;\n\n jar.cookie = CLEAR_PREFILL_COOKIE;\n return parsePrefill(raw);\n}\n\n","{\n \"common\": {\n \"copy\": \"نسخ\",\n \"copied\": \"تم النسخ\",\n \"retry\": \"أعد المحاولة\",\n \"notLoaded\": \"تعذّر تحميل هذا\",\n \"genericError\": \"تعذّر تحميل هذا. يُرجى المحاولة بعد قليل.\",\n \"browseStore\": \"تصفّح المتجر\",\n \"unavailable\": \"غير متاح\",\n \"cancel\": \"إلغاء\"\n },\n \"account\": {\n \"title\": \"حسابك\",\n \"sections\": \"أقسام الحساب\",\n \"signOut\": \"تسجيل الخروج\",\n \"signingOut\": \"جارٍ تسجيل الخروج…\",\n \"signOutFailed\": \"تعذّر تسجيل خروجك. يُرجى المحاولة مرة أخرى.\",\n \"checkingSession\": \"جارٍ التحقق من جلستك\",\n \"sessionUnknown\": \"تعذّر التحقق من جلستك. يُرجى المحاولة بعد قليل.\",\n \"goToOverview\": \"الانتقال إلى النظرة العامة\",\n \"tabs\": {\n \"overview\": \"نظرة عامة\",\n \"orders\": \"الطلبات\",\n \"downloads\": \"التنزيلات\",\n \"subscriptions\": \"الاشتراكات\",\n \"rewards\": \"المكافآت\",\n \"referrals\": \"الإحالات\",\n \"favorites\": \"المفضلة\",\n \"support\": \"الدعم\",\n \"settings\": \"الإعدادات\",\n \"reseller\": \"إعادة البيع\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} ليس جزءًا من هذا المتجر\",\n \"body\": \"هذه الواجهة لا توفّر ذلك القسم. طلباتك وتفاصيل حسابك ما زالت هنا.\"\n },\n \"unknownTab\": {\n \"title\": \"هذا الرابط لا يؤدي إلى أي مكان\",\n \"body\": \"العنوان يشير إلى قسم حساب غير موجود. ربما كُتب بشكل خاطئ أو نقص منه جزء.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"سجّل الدخول إلى حسابك\",\n \"titleCode\": \"تحقّق من بريدك الإلكتروني\",\n \"introEmail\": \"نرسل رمزًا يُستخدم مرة واحدة إلى بريدك الإلكتروني. لا توجد كلمة مرور تحفظها.\",\n \"introCode\": \"أدخل الرمز الذي أرسلناه إلى {email}.\",\n \"emailLabel\": \"البريد الإلكتروني\",\n \"codeLabel\": \"رمز تسجيل الدخول\",\n \"invalidEmail\": \"أدخل عنوان بريد إلكتروني كاملًا، مثل you@example.com.\",\n \"missingCode\": \"أدخل الرمز الموجود في بريدك.\",\n \"send\": \"أرسل لي رمزًا\",\n \"sending\": \"جارٍ الإرسال…\",\n \"submit\": \"تسجيل الدخول\",\n \"submitting\": \"جارٍ التحقق…\",\n \"resend\": \"إرسال رمز جديد\",\n \"resent\": \"رمز جديد في طريقه إلى {email}.\",\n \"changeEmail\": \"استخدام بريد آخر\",\n \"sendFailed\": \"تعذّر إرسال الرمز. يُرجى المحاولة بعد قليل.\",\n \"verifyFailed\": \"لم يُقبل هذا الرمز. يُرجى المحاولة مرة أخرى.\"\n },\n \"status\": {\n \"COMPLETED\": \"مكتمل\",\n \"PROCESSING\": \"قيد المعالجة\",\n \"AWAITING_STOCK\": \"بانتظار توفّر المخزون\",\n \"PENDING\": \"قيد الانتظار\",\n \"PENDING_PAYMENT\": \"بانتظار الدفع\",\n \"UNDERPAID\": \"دفع ناقص\",\n \"DISPUTED\": \"متنازع عليه\",\n \"REFUNDED\": \"مُسترَد\",\n \"PARTIAL_REFUND\": \"مُسترَد جزئيًا\",\n \"VOIDED\": \"باطل\",\n \"EXPIRED\": \"منتهي الصلاحية\",\n \"ACTIVE\": \"نشط\",\n \"INACTIVE\": \"غير نشط\",\n \"SUSPENDED\": \"موقوف\",\n \"REVOKED\": \"مسحوب\",\n \"TRIALING\": \"فترة تجريبية\",\n \"PAUSED\": \"متوقف مؤقتًا\",\n \"PAST_DUE\": \"متأخر السداد\",\n \"UNPAID\": \"غير مدفوع\",\n \"INCOMPLETE\": \"غير مكتمل\",\n \"CANCELED\": \"ملغى\",\n \"CANCELLED\": \"ملغى\",\n \"OPEN\": \"مفتوح\",\n \"CLOSED\": \"مغلق\",\n \"RESOLVED\": \"تم الحل\",\n \"AWAITING_REPLY\": \"بانتظار ردّك\",\n \"APPROVED\": \"مقبول\",\n \"REJECTED\": \"مرفوض\",\n \"REQUESTED\": \"تم الطلب\",\n \"CONVERTED\": \"محوَّل\",\n \"PAID\": \"مدفوع\",\n \"FAILED\": \"فشل\"\n },\n \"delivery\": {\n \"DELIVERED\": \"تم التسليم\",\n \"AWAITING_FULFILLMENT\": \"بانتظار التنفيذ\",\n \"PENDING\": \"قيد الانتظار\",\n \"FAILED\": \"فشل التسليم\"\n },\n \"overview\": {\n \"loading\": \"جارٍ تحميل حسابك\",\n \"signedInAs\": \"تم تسجيل الدخول باسم\",\n \"statOrders\": \"الطلبات\",\n \"statLicenses\": \"التراخيص\",\n \"statDownloads\": \"التنزيلات\",\n \"statTickets\": \"تذاكر الدعم\",\n \"walletLabel\": \"رصيد المتجر\",\n \"walletNote\": \"يُطبَّق عند الدفع\",\n \"recentOrders\": \"أحدث الطلبات\",\n \"allOrders\": \"كل الطلبات\"\n },\n \"orders\": {\n \"loading\": \"جارٍ تحميل طلباتك\",\n \"emptyTitle\": \"لا توجد طلبات بعد\",\n \"emptyBody\": \"تظهر مشترياتك من هذا المتجر هنا فور إتمام أول طلب.\",\n \"movedTitle\": \"لا شيء في هذه الصفحة\",\n \"movedBody\": \"تغيّر ترتيب هذه الطلبات أثناء اطّلاعك عليها.\",\n \"backToFirstPage\": \"العودة إلى الصفحة الأولى\",\n \"pagesLabel\": \"صفحات سجل الطلبات\",\n \"previous\": \"السابق\",\n \"next\": \"التالي\",\n \"page\": \"صفحة {page}\",\n \"andMoreOne\": \"وعنصر واحد آخر\",\n \"andMoreOther\": \"و{count} عناصر أخرى\",\n \"fallbackTitle\": \"الطلب {id}\",\n \"allOrders\": \"كل الطلبات\",\n \"loadingOne\": \"جارٍ تحميل هذا الطلب\",\n \"detailTitle\": \"الطلب {id}\",\n \"subtotal\": \"المجموع الفرعي\",\n \"discount\": \"الخصم\",\n \"tax\": \"الضريبة\",\n \"total\": \"الإجمالي\",\n \"paidWith\": \"تم الدفع عبر\",\n \"deliveryTitle\": \"تسليم طلبك\",\n \"replacement\": \"استبدال\",\n \"search\": \"البحث في الطلبات\",\n \"searchPlaceholder\": \"البحث برقم الفاتورة\",\n \"status\": \"الحالة\",\n \"statusAll\": \"كل الحالات\",\n \"statusCompleted\": \"مكتمل\",\n \"statusPending\": \"قيد الانتظار\",\n \"statusProcessing\": \"قيد المعالجة\",\n \"statusRefunded\": \"مُسترَد\",\n \"statusDisputed\": \"متنازع عليه\",\n \"statusExpired\": \"منتهي الصلاحية\",\n \"emptyFiltered\": \"لا توجد طلبات مطابقة. جرّب رقم فاتورة أو حالة أخرى.\",\n \"warrantyTitle\": \"الضمان\",\n \"warrantyCoveredUntil\": \"مغطى حتى {date}\",\n \"warrantyEnded\": \"انتهت التغطية في {date}\",\n \"warrantyCancelled\": \"أُلغيت التغطية\",\n \"warrantyClaimSubmitted\": \"أُرسل الطلب\",\n \"warrantyClaimApproved\": \"ووفق على الطلب\",\n \"warrantyClaimDeclined\": \"رُفض الطلب\",\n \"warrantyClaimStart\": \"تقديم طلب ضمان\",\n \"warrantyClaimLabel\": \"ما الذي حدث؟\",\n \"warrantyClaimOptional\": \"اختياري\",\n \"warrantyClaimSend\": \"إرسال الطلب\",\n \"warrantyClaimSending\": \"جارٍ الإرسال…\",\n \"warrantyClaimDone\": \"وصل طلبك إلى المتجر. سيردّون عبر البريد الإلكتروني.\",\n \"warrantyClaimFailed\": \"تعذّر إرسال طلبك.\"\n },\n \"downloads\": {\n \"loading\": \"جارٍ تحميل تنزيلاتك\",\n \"emptyTitle\": \"لا يوجد ما يمكن تنزيله بعد\",\n \"emptyBody\": \"تظهر الملفات والمفاتيح وروابط الوصول هنا بعد اكتمال الطلب.\",\n \"licensesTitle\": \"مفاتيح التراخيص\",\n \"filesTitle\": \"الملفات\",\n \"codesTitle\": \"الرموز والروابط\",\n \"download\": \"تنزيل\",\n \"openLink\": \"فتح الرابط\",\n \"viewOrder\": \"عرض الطلب\",\n \"expires\": \"تنتهي الصلاحية في {date}\",\n \"neverExpires\": \"بلا تاريخ انتهاء\",\n \"lockedTo\": \"مرتبط بالجهاز {hardwareId}\",\n \"resetHwid\": \"إعادة تعيين معرّف الجهاز\",\n \"resettingHwid\": \"جارٍ إعادة التعيين…\",\n \"hwidResetDone\": \"تم مسح معرّف الجهاز. سيرتبط هذا الترخيص بأول تفعيل قادم.\",\n \"hwidResetFailed\": \"تعذّرت إعادة تعيين معرّف الجهاز. يُرجى المحاولة مرة أخرى.\",\n \"renewTitle\": \"قابل للتجديد\",\n \"renewBody\": \"التجديد عملية شراء، لذلك يتم عبر صفحة الدفع لا من هنا.\",\n \"renewAction\": \"فتح المتجر\",\n \"brokenTitle\": \"تعذّر عرض قائمة تنزيلاتك\",\n \"brokenBody\": \"أرسل المتجر عنصر ترخيص ({id}) بدون الترخيص نفسه، لذا ستكون هذه القائمة ناقصة لما تذكره.\",\n \"brokenFileBody\": \"أرسل المتجر عنصر ملف ({id}) دون أي شيء يمكن تنزيله، لذا ستذكر هذه القائمة ملفًا لا تستطيع تسليمه.\"\n },\n \"subscriptions\": {\n \"loading\": \"جارٍ تحميل اشتراكاتك\",\n \"emptyTitle\": \"لا توجد اشتراكات بعد\",\n \"emptyBody\": \"تظهر المشتريات المتكررة هنا بمجرد أن تبدأ واحدًا.\",\n \"allSubscriptions\": \"كل الاشتراكات\",\n \"unnamedPlan\": \"اشتراك\",\n \"renews\": \"يتجدّد في {date}\",\n \"ends\": \"ينتهي في {date}\",\n \"canceled\": \"أُلغي في {date}\",\n \"startedOn\": \"بدأ في {date}\",\n \"billingDayOne\": \"فوترة يومية\",\n \"billingDayOther\": \"فوترة كل {count} أيام\",\n \"billingWeekOne\": \"فوترة أسبوعية\",\n \"billingWeekOther\": \"فوترة كل {count} أسابيع\",\n \"billingMonthOne\": \"فوترة شهرية\",\n \"billingMonthOther\": \"فوترة كل {count} أشهر\",\n \"billingYearOne\": \"فوترة سنوية\",\n \"billingYearOther\": \"فوترة كل {count} سنوات\",\n \"billingOther\": \"فوترة كل {count} × {interval}\",\n \"gateway\": \"مزوّد الدفع\",\n \"paymentMethod\": \"طريقة الدفع\",\n \"cardOnFile\": \"{brand} المنتهية بالأرقام {last4}\",\n \"noPaymentMethod\": \"لا توجد طريقة محفوظة\",\n \"paymentMethodElsewhere\": \"رابط تغيير بيانات الدفع يصلك من رسائل المتجر نفسها. لا يُعرض هنا، لأن أي عنصر في هذه الصفحة قد يلتقطه.\",\n \"pause\": \"إيقاف مؤقت\",\n \"pausing\": \"جارٍ الإيقاف…\",\n \"resume\": \"استئناف\",\n \"resuming\": \"جارٍ الاستئناف…\",\n \"cancel\": \"إلغاء الاشتراك\",\n \"cancelling\": \"جارٍ الإلغاء…\",\n \"keep\": \"الاحتفاظ به\",\n \"confirmCancelTitle\": \"إلغاء هذا الاشتراك؟\",\n \"confirmCancelAtPeriodEnd\": \"يبقى وصولك حتى {date}. لن تُحصَّل أي مبالغ بعد ذلك.\",\n \"confirmCancelNow\": \"ينتهي الوصول فور الإلغاء.\",\n \"actionFailed\": \"لم تتم العملية. يُرجى المحاولة مرة أخرى.\",\n \"paused\": \"هذا الاشتراك متوقف مؤقتًا.\",\n \"resumed\": \"هذا الاشتراك يعمل من جديد.\",\n \"cancelled\": \"تم إلغاء هذا الاشتراك.\",\n \"historyTitle\": \"سجل الفواتير\",\n \"historyLoading\": \"جارٍ تحميل سجل الفواتير\",\n \"historyEmptyTitle\": \"لا يوجد سجل فواتير بعد\",\n \"historyEmptyBody\": \"تظهر فواتير التجديد هنا بعد الدورة الأولى.\",\n \"trial\": \"تنتهي الفترة التجريبية في {date}\"\n },\n \"favorites\": {\n \"loading\": \"جارٍ تحميل مفضلتك\",\n \"emptyTitle\": \"لا توجد مفضلات بعد\",\n \"emptyBody\": \"المنتجات التي تحفظها أثناء تصفح المتجر تبقى هنا.\",\n \"added\": \"حُفظ في {date}\",\n \"gone\": \"لم يعد متاحًا\",\n \"view\": \"عرض في المتجر\",\n \"remove\": \"إزالة\",\n \"removing\": \"جارٍ الإزالة…\",\n \"removeFailed\": \"تعذّرت إزالة هذا المفضل. يُرجى المحاولة مرة أخرى.\",\n \"noImage\": \"لا توجد صورة لـ {title}\"\n },\n \"rewards\": {\n \"loading\": \"جارٍ تحميل مكافآتك\",\n \"available\": \"متاح\",\n \"pending\": \"قيد التنفيذ\",\n \"lifetime\": \"إجمالي ما كسبته\",\n \"couponsTitle\": \"قسائمك\",\n \"couponsBody\": \"الصق إحداها عند إتمام الشراء.\",\n \"percentOff\": \"خصم {percent}%\",\n \"couponGeneric\": \"قسيمة خصم\",\n \"expiresOn\": \"تنتهي الصلاحية في {date}\",\n \"activityTitle\": \"النشاط\",\n \"emptyTitle\": \"لا توجد مكافآت بعد\",\n \"emptyBody\": \"أكمل طلبًا أو اترك تقييمًا لتبدأ بالكسب.\",\n \"storeCredit\": \"{amount} رصيد متجر\",\n \"storeCreditGeneric\": \"رصيد المتجر\",\n \"couponNamed\": \"قسيمة {code}\",\n \"couponUnnamed\": \"رمز قسيمة\",\n \"otherReward\": \"مكافأة\",\n \"reasonOrderCompleted\": \"اكتمل طلب\",\n \"reasonOrderCount\": \"إنجاز ولاء\",\n \"reasonSpendAmount\": \"إجمالي الإنفاق\",\n \"reasonReview\": \"تقييم مكتوب\",\n \"reasonFirstPurchase\": \"أول عملية شراء\",\n \"reasonOther\": \"مكافأة\",\n \"grantFulfilled\": \"تم الكسب\",\n \"grantPending\": \"قيد التنفيذ\",\n \"grantFailed\": \"فشل\",\n \"grantRevoked\": \"مسحوب\",\n \"pointsTitle\": \"النقاط\",\n \"pointsBalance\": \"رصيد النقاط\",\n \"pointsLifetime\": \"إجمالي ما جمعته\",\n \"pointsEarnHint\": \"أكمل طلبًا لتبدأ بجمع النقاط.\",\n \"pointsActivityTitle\": \"حركة النقاط\",\n \"pointsFromOrder\": \"طلب مكتمل\",\n \"pointsFromReview\": \"تقييم مكتوب\",\n \"pointsConverted\": \"حُوّلت إلى رصيد المتجر\",\n \"pointsAdjusted\": \"تعديل من المتجر\",\n \"redeemTitle\": \"تحويل النقاط\",\n \"redeemBody\": \"حوّل نقاطك إلى رصيد في المتجر وادفع به عند إتمام الشراء.\",\n \"redeemLabel\": \"النقاط المراد تحويلها\",\n \"redeemMinimum\": \"حوّل {points} نقطة على الأقل.\",\n \"redeemOverBalance\": \"لديك {points} نقطة للإنفاق.\",\n \"redeemInvalid\": \"أدخل عددًا صحيحًا من النقاط.\",\n \"redeemPreview\": \"تساوي نحو {amount} من رصيد المتجر.\",\n \"redeemContinue\": \"متابعة\",\n \"redeemConfirm\": \"تحويل {points} نقطة إلى نحو {amount} من رصيد المتجر؟\",\n \"redeemConfirmAction\": \"نعم، حوّل\",\n \"redeemWorking\": \"جارٍ التحويل…\",\n \"redeemDone\": \"أُضيف {amount} إلى رصيدك في المتجر.\",\n \"redeemFailed\": \"تعذّر تحويل نقاطك.\"\n },\n \"referrals\": {\n \"loading\": \"جارٍ تحميل إحالاتك\",\n \"notEnrolledTitle\": \"أنت لست ضمن برنامج الإحالة\",\n \"notEnrolledBody\": \"لم يسجّلك هذا المتجر، لذا لا يوجد ما تشاركه أو تتابعه بعد.\",\n \"availableLabel\": \"متاح للسحب\",\n \"pendingLabel\": \"قيد الانتظار\",\n \"requestedLabel\": \"تم طلبه\",\n \"payoutsElsewhere\": \"عمليات السحب والدفعات يتولاها المتجر، وليس من هذه الصفحة.\",\n \"codesAccepted\": \"رمزك مقبول عند إتمام الشراء.\",\n \"codesNotAccepted\": \"لا يقبل هذا المتجر رموز الإحالة عند الشراء حاليًا.\",\n \"linksTitle\": \"روابطك\",\n \"linksEmptyTitle\": \"لا توجد روابط إحالة بعد\",\n \"linksEmptyBody\": \"المتجر هو من ينشئ الروابط التي تشاركها. اطلب منهم رابطًا إن كنت تتوقع وجوده هنا.\",\n \"primary\": \"أساسي\",\n \"commission\": \"عمولة {percent}%\",\n \"buyerDiscount\": \"خصم {percent}% للمشتري\",\n \"awaitingApproval\": \"بانتظار موافقة المتجر على هذا الرابط.\",\n \"clicks\": \"النقرات\",\n \"sales\": \"المبيعات\",\n \"revenue\": \"الإيرادات\",\n \"commissionsTitle\": \"العمولات\",\n \"commissionsEmptyTitle\": \"لا توجد عمولات بعد\",\n \"commissionsEmptyBody\": \"تظهر هنا مبيعات الإحالة المعتمدة.\",\n \"commissionFor\": \"الطلب {id}\",\n \"balanceTitle\": \"حركة الرصيد\",\n \"balanceEmptyTitle\": \"لا توجد حركة رصيد بعد\",\n \"balanceEmptyBody\": \"تظهر هنا التحويلات والدفعات.\",\n \"claimStoreCredit\": \"رصيد المتجر\",\n \"claimCryptoPayout\": \"دفعة بالعملات الرقمية\",\n \"claimAdjustment\": \"تسوية\",\n \"differentCurrency\": \"رصيد إحالاتك محفوظ بعملة {currency}.\",\n \"convertedLabel\": \"حُوِّل إلى رصيد المتجر\",\n \"paidLabel\": \"تم الدفع\"\n },\n \"support\": {\n \"loading\": \"جارٍ تحميل تذاكرك\",\n \"ticketsTitle\": \"تذاكرك\",\n \"emptyTitle\": \"لا توجد تذاكر بعد\",\n \"emptyBody\": \"راسل المتجر من هنا، وتبقى كل الردود على هذه الصفحة.\",\n \"newTicket\": \"تذكرة جديدة\",\n \"backToTickets\": \"كل التذاكر\",\n \"updated\": \"آخر تحديث {date}\",\n \"aboutOrder\": \"بخصوص الطلب {id}\",\n \"subjectLabel\": \"الموضوع\",\n \"subjectOptional\": \"اختياري\",\n \"messageLabel\": \"الرسالة\",\n \"replyLabel\": \"ردّك\",\n \"create\": \"إرسال إلى المتجر\",\n \"creating\": \"جارٍ الإرسال…\",\n \"createFailed\": \"تعذّر إنشاء تذكرتك. يُرجى المحاولة مرة أخرى.\",\n \"reply\": \"إرسال الرد\",\n \"replying\": \"جارٍ الإرسال…\",\n \"replyFailed\": \"تعذّر إرسال ردّك. يُرجى المحاولة مرة أخرى.\",\n \"tooShort\": \"يُرجى كتابة رسالة قصيرة على الأقل.\",\n \"closedTitle\": \"هذه التذكرة مغلقة\",\n \"closedBody\": \"افتح تذكرة جديدة إن كنت ما زلت بحاجة إلى المساعدة.\",\n \"loadingThread\": \"جارٍ تحميل هذه المحادثة\",\n \"noMessages\": \"لا توجد رسائل على هذه التذكرة بعد.\",\n \"fromYou\": \"أنت\",\n \"fromMerchant\": \"المتجر\",\n \"fromSystem\": \"النظام\",\n \"untitled\": \"طلب دعم\"\n },\n \"settings\": {\n \"loading\": \"جارٍ تحميل إعداداتك\",\n \"profileTitle\": \"الملف الشخصي\",\n \"emailLabel\": \"البريد الإلكتروني\",\n \"emailNote\": \"بريدك الإلكتروني هو ما تسجّل به الدخول، لذا يغيّره المتجر وليس أنت من هنا.\",\n \"nameLabel\": \"الاسم\",\n \"nameTooShort\": \"يُرجى إدخال اسمك.\",\n \"saveProfile\": \"حفظ التغييرات\",\n \"savingProfile\": \"جارٍ الحفظ…\",\n \"profileSaved\": \"تم تحديث اسمك.\",\n \"profileFailed\": \"تعذّر حفظ اسمك. يُرجى المحاولة مرة أخرى.\",\n \"uploadAvatar\": \"رفع صورة\",\n \"uploadingAvatar\": \"جارٍ الرفع…\",\n \"removeAvatar\": \"إزالة الصورة\",\n \"removingAvatar\": \"جارٍ الإزالة…\",\n \"avatarHint\": \"JPG أو PNG أو GIF أو WebP، بحد أقصى 10 ميغابايت.\",\n \"avatarFailed\": \"تعذّر رفع صورتك. يُرجى المحاولة مرة أخرى.\",\n \"avatarRemoveFailed\": \"تعذّرت إزالة صورتك. يُرجى المحاولة مرة أخرى.\",\n \"avatarTooLarge\": \"حجم هذه الصورة أكبر من 10 ميغابايت.\",\n \"emailsTitle\": \"رسائل المتجر\",\n \"emailsLoading\": \"جارٍ تحميل إعدادات البريد\",\n \"unsubscribeAll\": \"إيقاف كل الرسائل التسويقية\",\n \"unsubscribeAllNote\": \"رسائل الطلبات والتسليم تُرسل في الحالتين.\",\n \"listsEmpty\": \"لا توجد قوائم بريدية في هذا المتجر.\",\n \"emailsFailed\": \"تعذّر تحميل إعدادات بريدك.\",\n \"emailsSaveFailed\": \"تعذّر حفظ هذا الإعداد. يُرجى المحاولة مرة أخرى.\",\n \"devicesTitle\": \"الأجهزة المسجّل دخولها\",\n \"devicesLoading\": \"جارٍ تحميل أجهزتك\",\n \"devicesEmpty\": \"لا يوجد جهاز آخر مسجّل الدخول.\",\n \"thisDevice\": \"هذا الجهاز\",\n \"signedInOn\": \"سُجّل الدخول في {date}\",\n \"unknownDevice\": \"جهاز غير معروف\",\n \"signOutDevice\": \"تسجيل الخروج\",\n \"signingOutDevice\": \"جارٍ تسجيل الخروج…\",\n \"signOutOthers\": \"تسجيل الخروج من كل الأجهزة الأخرى\",\n \"signOutOthersDone\": \"تم تسجيل الخروج من كل الأجهزة الأخرى.\",\n \"devicesFailed\": \"تعذّر تحميل أجهزتك.\",\n \"signOutDeviceFailed\": \"تعذّر تسجيل الخروج من هذا الجهاز. يُرجى المحاولة مرة أخرى.\",\n \"deviceOn\": \"{browser} على {os}\"\n },\n \"walletTopup\": {\n \"title\": \"إضافة رصيد المتجر\",\n \"minimum\": \"الحد الأدنى {min}\",\n \"bounds\": \"من {min} إلى {max}\",\n \"bonus\": \"أضف {amount} على الأقل واحصل على {percent}% إضافية\",\n \"amount\": \"المبلغ\",\n \"submit\": \"المتابعة إلى الدفع\"\n },\n \"reseller\": {\n \"disabledTitle\": \"برنامج الموزعين غير متاح\",\n \"disabledBody\": \"لا يقبل هذا المتجر طلبات الجملة حاليًا.\",\n \"openTitle\": \"الانضمام إلى برنامج الموزعين\",\n \"openBody\": \"انضم الآن لشراء منتجات هذا المتجر بأسعار الجملة.\",\n \"join\": \"الانضمام الآن\",\n \"manualTitle\": \"قبول دعوة الموزع\",\n \"manualBody\": \"أدخل رمز الدعوة الذي أرسله إليك المتجر.\",\n \"inviteToken\": \"رمز الدعوة\",\n \"acceptInvite\": \"قبول الدعوة\",\n \"applicationTitle\": \"التقدم لتصبح موزعًا\",\n \"applicationBody\": \"أخبر المتجر عن نشاطك التجاري وأرسل طلبك.\",\n \"applicationNote\": \"ملاحظة الطلب\",\n \"noteRequired\": \"أضف ملاحظة قبل إرسال طلبك.\",\n \"apply\": \"إرسال الطلب\",\n \"pendingTitle\": \"طلبك قيد المراجعة\",\n \"pendingBody\": \"سيراجع المتجر طلبك قبل تفعيل وصول الجملة.\",\n \"rejectedTitle\": \"تم رفض طلب الموزع\",\n \"rejectedBody\": \"تواصل مع المتجر إذا أردت المزيد من المعلومات أو التقديم مرة أخرى.\",\n \"suspendedTitle\": \"حساب الموزع موقوف\",\n \"suspendedBody\": \"طلبات الجملة غير متاحة. تواصل مع المتجر للحصول على المساعدة.\",\n \"activeTitle\": \"حساب الجملة\",\n \"tier\": \"المستوى\",\n \"walletTitle\": \"رصيد الجملة\",\n \"balance\": \"الرصيد\",\n \"held\": \"محجوز\",\n \"catalogTitle\": \"كتالوج الجملة\",\n \"search\": \"البحث عن منتجات\",\n \"catalogEmptyTitle\": \"لم يتم العثور على منتجات جملة\",\n \"catalogEmptyBody\": \"جرّب بحثًا آخر أو عد بعد أن يضيف المتجر منتجات.\",\n \"volumePricing\": \"أسعار الكميات متاحة\",\n \"supplierBacked\": \"ينفذه المورّد\",\n \"add\": \"إضافة\",\n \"basketTitle\": \"سلة الجملة\",\n \"basketEmpty\": \"أضف منتجًا من كتالوج الجملة لبدء الطلب.\",\n \"quantity\": \"الكمية\",\n \"basketNeedsQuote\": \"احسب سعر هذه السلة لرؤية الإجمالي الحالي قبل الطلب.\",\n \"quote\": \"حساب سعر السلة\",\n \"place\": \"تنفيذ الطلب\",\n \"ordersTitle\": \"طلبات الجملة\",\n \"ordersEmptyTitle\": \"لا توجد طلبات جملة بعد\",\n \"ordersEmptyBody\": \"تظهر هنا الطلبات المدفوعة من رصيد الجملة.\",\n \"refunded\": \"تمت إعادته إلى الرصيد\",\n \"lineQuantity\": \"الكمية {count}\",\n \"serials\": \"الأرقام التسلسلية المسلّمة\",\n \"apiKeysTitle\": \"مفاتيح API للموزع\",\n \"apiKeyName\": \"اسم المفتاح\",\n \"createApiKey\": \"إنشاء مفتاح\",\n \"apiKeysEmpty\": \"لم تنشئ أي مفاتيح API للموزع.\",\n \"orderElsewhere\": \"تُقدَّم طلبات الجملة عبر واجهة برمجة الموزّعين، لا من هذه الصفحة.\",\n \"keysElsewhere\": \"يصدر المتجر مفاتيح واجهة البرمجة. اطلب منه مفتاحًا.\",\n \"apiKeyCreatedTitle\": \"انسخ هذا المفتاح الآن\",\n \"apiKeyCreatedBody\": \"يظهر هذا المفتاح النصي مرة واحدة ولا يمكن استعادته لاحقًا.\",\n \"dismissKey\": \"حفظت المفتاح\",\n \"lastUsed\": \"آخر استخدام: {date}\",\n \"neverUsed\": \"لم يُستخدم\",\n \"revokeApiKey\": \"إلغاء\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Kopieren\",\n \"copied\": \"Kopiert\",\n \"retry\": \"Erneut versuchen\",\n \"notLoaded\": \"Das wurde nicht geladen\",\n \"genericError\": \"Das konnte nicht geladen werden. Bitte versuche es gleich noch einmal.\",\n \"browseStore\": \"Zum Shop\",\n \"unavailable\": \"Nicht verfügbar\",\n \"cancel\": \"Abbrechen\"\n },\n \"account\": {\n \"title\": \"Dein Konto\",\n \"sections\": \"Kontobereiche\",\n \"signOut\": \"Abmelden\",\n \"signingOut\": \"Wird abgemeldet…\",\n \"signOutFailed\": \"Du konntest nicht abgemeldet werden. Bitte versuche es noch einmal.\",\n \"checkingSession\": \"Deine Sitzung wird geprüft\",\n \"sessionUnknown\": \"Deine Sitzung konnte nicht geprüft werden. Bitte versuche es gleich noch einmal.\",\n \"goToOverview\": \"Zur Übersicht\",\n \"tabs\": {\n \"overview\": \"Übersicht\",\n \"orders\": \"Bestellungen\",\n \"downloads\": \"Downloads\",\n \"subscriptions\": \"Abos\",\n \"rewards\": \"Prämien\",\n \"referrals\": \"Empfehlungen\",\n \"favorites\": \"Favoriten\",\n \"support\": \"Hilfe\",\n \"settings\": \"Einstellungen\",\n \"reseller\": \"Wiederverkauf\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} gibt es in diesem Shop nicht\",\n \"body\": \"Dieser Shop bietet diesen Bereich nicht an. Deine Bestellungen und Kontodaten findest du weiterhin hier.\"\n },\n \"unknownTab\": {\n \"title\": \"Dieser Link führt nirgendwohin\",\n \"body\": \"Die Adresse nennt einen Kontobereich, den es nicht gibt. Vielleicht hat sich ein Tippfehler eingeschlichen oder der Link ist abgeschnitten.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Melde dich bei deinem Konto an\",\n \"titleCode\": \"Sieh in dein E-Mail-Postfach\",\n \"introEmail\": \"Wir schicken dir einen Einmal-Code an deine E-Mail-Adresse. Du musst dir kein Passwort merken.\",\n \"introCode\": \"Gib den Code ein, den wir an {email} geschickt haben.\",\n \"emailLabel\": \"E-Mail\",\n \"codeLabel\": \"Anmelde-Code\",\n \"invalidEmail\": \"Gib eine vollständige E-Mail-Adresse ein, zum Beispiel du@beispiel.de.\",\n \"missingCode\": \"Gib den Code aus deiner E-Mail ein.\",\n \"send\": \"Schick mir einen Code\",\n \"sending\": \"Wird gesendet…\",\n \"submit\": \"Anmelden\",\n \"submitting\": \"Wird geprüft…\",\n \"resend\": \"Neuen Code schicken\",\n \"resent\": \"Ein neuer Code ist unterwegs zu {email}.\",\n \"changeEmail\": \"Andere E-Mail nutzen\",\n \"sendFailed\": \"Der Code konnte nicht gesendet werden. Bitte versuche es gleich noch einmal.\",\n \"verifyFailed\": \"Dieser Code wurde nicht akzeptiert. Bitte versuche es noch einmal.\"\n },\n \"status\": {\n \"COMPLETED\": \"Abgeschlossen\",\n \"PROCESSING\": \"In Bearbeitung\",\n \"AWAITING_STOCK\": \"Wartet auf Nachschub\",\n \"PENDING\": \"Offen\",\n \"PENDING_PAYMENT\": \"Zahlung ausstehend\",\n \"UNDERPAID\": \"Zu wenig bezahlt\",\n \"DISPUTED\": \"Angefochten\",\n \"REFUNDED\": \"Erstattet\",\n \"PARTIAL_REFUND\": \"Teilweise erstattet\",\n \"VOIDED\": \"Annulliert\",\n \"EXPIRED\": \"Abgelaufen\",\n \"ACTIVE\": \"Aktiv\",\n \"INACTIVE\": \"Inaktiv\",\n \"SUSPENDED\": \"Gesperrt\",\n \"REVOKED\": \"Zurückgezogen\",\n \"TRIALING\": \"Testphase\",\n \"PAUSED\": \"Pausiert\",\n \"PAST_DUE\": \"Überfällig\",\n \"UNPAID\": \"Unbezahlt\",\n \"INCOMPLETE\": \"Unvollständig\",\n \"CANCELED\": \"Storniert\",\n \"CANCELLED\": \"Storniert\",\n \"OPEN\": \"Offen\",\n \"CLOSED\": \"Geschlossen\",\n \"RESOLVED\": \"Gelöst\",\n \"AWAITING_REPLY\": \"Wartet auf deine Antwort\",\n \"APPROVED\": \"Bestätigt\",\n \"REJECTED\": \"Abgelehnt\",\n \"REQUESTED\": \"Angefragt\",\n \"CONVERTED\": \"Umgewandelt\",\n \"PAID\": \"Bezahlt\",\n \"FAILED\": \"Fehlgeschlagen\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Geliefert\",\n \"AWAITING_FULFILLMENT\": \"Wartet auf Lieferung\",\n \"PENDING\": \"Offen\",\n \"FAILED\": \"Lieferung fehlgeschlagen\"\n },\n \"overview\": {\n \"loading\": \"Dein Konto wird geladen\",\n \"signedInAs\": \"Angemeldet als\",\n \"statOrders\": \"Bestellungen\",\n \"statLicenses\": \"Lizenzen\",\n \"statDownloads\": \"Downloads\",\n \"statTickets\": \"Support-Anfragen\",\n \"walletLabel\": \"Shop-Guthaben\",\n \"walletNote\": \"Wird an der Kasse verrechnet\",\n \"recentOrders\": \"Letzte Bestellungen\",\n \"allOrders\": \"Alle Bestellungen\"\n },\n \"orders\": {\n \"loading\": \"Deine Bestellungen werden geladen\",\n \"emptyTitle\": \"Noch keine Bestellungen\",\n \"emptyBody\": \"Deine Einkäufe in diesem Shop erscheinen hier, sobald du eine Bestellung aufgibst.\",\n \"movedTitle\": \"Auf dieser Seite ist nichts\",\n \"movedBody\": \"Diese Bestellungen haben sich verschoben, während du sie angesehen hast.\",\n \"backToFirstPage\": \"Zurück zur ersten Seite\",\n \"pagesLabel\": \"Seiten der Bestellhistorie\",\n \"previous\": \"Zurück\",\n \"next\": \"Weiter\",\n \"page\": \"Seite {page}\",\n \"andMoreOne\": \"und ein weiterer Artikel\",\n \"andMoreOther\": \"und {count} weitere Artikel\",\n \"fallbackTitle\": \"Bestellung {id}\",\n \"allOrders\": \"Alle Bestellungen\",\n \"loadingOne\": \"Diese Bestellung wird geladen\",\n \"detailTitle\": \"Bestellung {id}\",\n \"subtotal\": \"Zwischensumme\",\n \"discount\": \"Rabatt\",\n \"tax\": \"Steuer\",\n \"total\": \"Gesamt\",\n \"paidWith\": \"Bezahlt mit\",\n \"deliveryTitle\": \"Deine Lieferung\",\n \"replacement\": \"Ersatz\",\n \"search\": \"Bestellungen suchen\",\n \"searchPlaceholder\": \"Nach Rechnungsnummer suchen\",\n \"status\": \"Status\",\n \"statusAll\": \"Alle Status\",\n \"statusCompleted\": \"Abgeschlossen\",\n \"statusPending\": \"Ausstehend\",\n \"statusProcessing\": \"In Bearbeitung\",\n \"statusRefunded\": \"Erstattet\",\n \"statusDisputed\": \"Reklamiert\",\n \"statusExpired\": \"Abgelaufen\",\n \"emptyFiltered\": \"Keine passenden Bestellungen. Versuch eine andere Rechnungsnummer oder einen anderen Status.\",\n \"warrantyTitle\": \"Garantie\",\n \"warrantyCoveredUntil\": \"Abgedeckt bis {date}\",\n \"warrantyEnded\": \"Garantie endete am {date}\",\n \"warrantyCancelled\": \"Garantie storniert\",\n \"warrantyClaimSubmitted\": \"Fall eingereicht\",\n \"warrantyClaimApproved\": \"Fall genehmigt\",\n \"warrantyClaimDeclined\": \"Fall abgelehnt\",\n \"warrantyClaimStart\": \"Garantiefall melden\",\n \"warrantyClaimLabel\": \"Was ist passiert?\",\n \"warrantyClaimOptional\": \"Freiwillig\",\n \"warrantyClaimSend\": \"Fall senden\",\n \"warrantyClaimSending\": \"Wird gesendet…\",\n \"warrantyClaimDone\": \"Der Shop hat deinen Fall erhalten. Die Antwort kommt per E-Mail.\",\n \"warrantyClaimFailed\": \"Dein Fall konnte nicht gesendet werden.\"\n },\n \"downloads\": {\n \"loading\": \"Deine Downloads werden geladen\",\n \"emptyTitle\": \"Noch nichts zum Herunterladen\",\n \"emptyBody\": \"Dateien, Keys und Zugangslinks erscheinen hier, sobald eine Bestellung abgeschlossen ist.\",\n \"licensesTitle\": \"Lizenzschlüssel\",\n \"filesTitle\": \"Dateien\",\n \"codesTitle\": \"Codes und Links\",\n \"download\": \"Herunterladen\",\n \"openLink\": \"Link öffnen\",\n \"viewOrder\": \"Bestellung ansehen\",\n \"expires\": \"Läuft ab am {date}\",\n \"neverExpires\": \"Kein Enddatum\",\n \"lockedTo\": \"Gebunden an {hardwareId}\",\n \"resetHwid\": \"Hardware-ID zurücksetzen\",\n \"resettingHwid\": \"Wird zurückgesetzt…\",\n \"hwidResetDone\": \"Die Hardware-ID wurde gelöscht. Deine nächste Aktivierung beansprucht diese Lizenz.\",\n \"hwidResetFailed\": \"Die Hardware-ID konnte nicht zurückgesetzt werden. Bitte versuche es noch einmal.\",\n \"renewTitle\": \"Verlängerbar\",\n \"renewBody\": \"Eine Verlängerung ist ein Kauf und läuft deshalb über die Kasse und nicht über diese Seite.\",\n \"renewAction\": \"Shop öffnen\",\n \"brokenTitle\": \"Deine Downloads konnten nicht aufgelistet werden\",\n \"brokenBody\": \"Der Shop hat einen Lizenzeintrag ({id}) ohne die zugehörige Lizenz geschickt. In dieser Liste würde also genau das fehlen, was sie benennt.\",\n \"brokenFileBody\": \"Der Shop hat einen Dateieintrag ({id}) ohne Datei zum Herunterladen geschickt. Die Liste würde also eine Datei nennen, die sie nicht herausgeben kann.\"\n },\n \"subscriptions\": {\n \"loading\": \"Deine Abos werden geladen\",\n \"emptyTitle\": \"Noch keine Abos\",\n \"emptyBody\": \"Wiederkehrende Käufe erscheinen hier, sobald du eines startest.\",\n \"allSubscriptions\": \"Alle Abos\",\n \"unnamedPlan\": \"Abo\",\n \"renews\": \"Verlängert sich am {date}\",\n \"ends\": \"Endet am {date}\",\n \"canceled\": \"Gekündigt am {date}\",\n \"startedOn\": \"Gestartet am {date}\",\n \"billingDayOne\": \"Tägliche Abrechnung\",\n \"billingDayOther\": \"Abrechnung alle {count} Tage\",\n \"billingWeekOne\": \"Wöchentliche Abrechnung\",\n \"billingWeekOther\": \"Abrechnung alle {count} Wochen\",\n \"billingMonthOne\": \"Monatliche Abrechnung\",\n \"billingMonthOther\": \"Abrechnung alle {count} Monate\",\n \"billingYearOne\": \"Jährliche Abrechnung\",\n \"billingYearOther\": \"Abrechnung alle {count} Jahre\",\n \"billingOther\": \"Abrechnung alle {count} × {interval}\",\n \"gateway\": \"Zahlungsanbieter\",\n \"paymentMethod\": \"Zahlungsmethode\",\n \"cardOnFile\": \"{brand} endet auf {last4}\",\n \"noPaymentMethod\": \"Keine hinterlegt\",\n \"paymentMethodElsewhere\": \"Den Link zum Ändern deiner Zahlungsdaten bekommst du in den E-Mails des Shops. Hier wird er nicht ausgegeben, weil alles auf dieser Seite ihn abgreifen könnte.\",\n \"pause\": \"Pausieren\",\n \"pausing\": \"Wird pausiert…\",\n \"resume\": \"Fortsetzen\",\n \"resuming\": \"Wird fortgesetzt…\",\n \"cancel\": \"Abo kündigen\",\n \"cancelling\": \"Wird gekündigt…\",\n \"keep\": \"Behalten\",\n \"confirmCancelTitle\": \"Dieses Abo kündigen?\",\n \"confirmCancelAtPeriodEnd\": \"Du behältst den Zugang bis zum {date}. Danach wird nichts mehr abgerechnet.\",\n \"confirmCancelNow\": \"Der Zugang endet, sobald gekündigt ist.\",\n \"actionFailed\": \"Das hat nicht geklappt. Bitte versuche es noch einmal.\",\n \"paused\": \"Dieses Abo ist pausiert.\",\n \"resumed\": \"Dieses Abo läuft wieder.\",\n \"cancelled\": \"Dieses Abo ist gekündigt.\",\n \"historyTitle\": \"Abrechnungsverlauf\",\n \"historyLoading\": \"Abrechnungsverlauf wird geladen\",\n \"historyEmptyTitle\": \"Noch kein Abrechnungsverlauf\",\n \"historyEmptyBody\": \"Verlängerungsrechnungen erscheinen hier nach dem ersten Zyklus.\",\n \"trial\": \"Testphase endet am {date}\"\n },\n \"favorites\": {\n \"loading\": \"Deine Favoriten werden geladen\",\n \"emptyTitle\": \"Noch keine Favoriten\",\n \"emptyBody\": \"Produkte, die du beim Stöbern im Shop speicherst, werden hier aufbewahrt.\",\n \"added\": \"Gespeichert am {date}\",\n \"gone\": \"Nicht mehr verfügbar\",\n \"view\": \"Im Shop ansehen\",\n \"remove\": \"Entfernen\",\n \"removing\": \"Wird entfernt…\",\n \"removeFailed\": \"Dieser Favorit konnte nicht entfernt werden. Bitte versuche es noch einmal.\",\n \"noImage\": \"Kein Bild für {title}\"\n },\n \"rewards\": {\n \"loading\": \"Deine Prämien werden geladen\",\n \"available\": \"Verfügbar\",\n \"pending\": \"In Arbeit\",\n \"lifetime\": \"Insgesamt verdient\",\n \"couponsTitle\": \"Deine Gutscheine\",\n \"couponsBody\": \"Füge einen davon an der Kasse ein.\",\n \"percentOff\": \"{percent}% Rabatt\",\n \"couponGeneric\": \"Rabattgutschein\",\n \"expiresOn\": \"Läuft ab am {date}\",\n \"activityTitle\": \"Aktivität\",\n \"emptyTitle\": \"Noch keine Prämien\",\n \"emptyBody\": \"Schließe eine Bestellung ab oder schreib eine Bewertung, um zu verdienen.\",\n \"storeCredit\": \"{amount} Shop-Guthaben\",\n \"storeCreditGeneric\": \"Shop-Guthaben\",\n \"couponNamed\": \"Gutschein {code}\",\n \"couponUnnamed\": \"Gutscheincode\",\n \"otherReward\": \"Prämie\",\n \"reasonOrderCompleted\": \"Bestellung abgeschlossen\",\n \"reasonOrderCount\": \"Treue-Meilenstein\",\n \"reasonSpendAmount\": \"Bisherige Ausgaben\",\n \"reasonReview\": \"Bewertung abgegeben\",\n \"reasonFirstPurchase\": \"Erster Kauf\",\n \"reasonOther\": \"Prämie\",\n \"grantFulfilled\": \"Verdient\",\n \"grantPending\": \"In Arbeit\",\n \"grantFailed\": \"Fehlgeschlagen\",\n \"grantRevoked\": \"Zurückgezogen\",\n \"pointsTitle\": \"Punkte\",\n \"pointsBalance\": \"Punktestand\",\n \"pointsLifetime\": \"Insgesamt gesammelt\",\n \"pointsEarnHint\": \"Schließe eine Bestellung ab, um Punkte zu sammeln.\",\n \"pointsActivityTitle\": \"Punkteverlauf\",\n \"pointsFromOrder\": \"Bestellung abgeschlossen\",\n \"pointsFromReview\": \"Bewertung abgegeben\",\n \"pointsConverted\": \"In Shop-Guthaben umgewandelt\",\n \"pointsAdjusted\": \"Vom Shop angepasst\",\n \"redeemTitle\": \"Punkte umwandeln\",\n \"redeemBody\": \"Wandle deine Punkte in Shop-Guthaben um und zahle damit an der Kasse.\",\n \"redeemLabel\": \"Punkte zum Umwandeln\",\n \"redeemMinimum\": \"Wandle mindestens {points} Punkte um.\",\n \"redeemOverBalance\": \"Du hast {points} Punkte zur Verfügung.\",\n \"redeemInvalid\": \"Gib eine ganze Punktzahl ein.\",\n \"redeemPreview\": \"Etwa {amount} Shop-Guthaben wert.\",\n \"redeemContinue\": \"Weiter\",\n \"redeemConfirm\": \"{points} Punkte in etwa {amount} Shop-Guthaben umwandeln?\",\n \"redeemConfirmAction\": \"Ja, umwandeln\",\n \"redeemWorking\": \"Wird umgewandelt…\",\n \"redeemDone\": \"{amount} zu deinem Shop-Guthaben hinzugefügt.\",\n \"redeemFailed\": \"Deine Punkte konnten nicht umgewandelt werden.\"\n },\n \"referrals\": {\n \"loading\": \"Deine Empfehlungen werden geladen\",\n \"notEnrolledTitle\": \"Du bist nicht im Empfehlungsprogramm\",\n \"notEnrolledBody\": \"Dieser Shop hat dich nicht aufgenommen, deshalb gibt es noch nichts zu teilen oder zu verfolgen.\",\n \"availableLabel\": \"Zur Auszahlung verfügbar\",\n \"pendingLabel\": \"Ausstehend\",\n \"requestedLabel\": \"Angefragt\",\n \"payoutsElsewhere\": \"Auszahlungen wickelt der Shop ab, nicht diese Seite.\",\n \"codesAccepted\": \"Dein Code wird an der Kasse akzeptiert.\",\n \"codesNotAccepted\": \"Dieser Shop akzeptiert derzeit keine Empfehlungscodes an der Kasse.\",\n \"linksTitle\": \"Deine Links\",\n \"linksEmptyTitle\": \"Noch keine Empfehlungslinks\",\n \"linksEmptyBody\": \"Die Links zum Teilen erstellt der Shop. Frag dort nach, wenn du hier einen erwartet hast.\",\n \"primary\": \"Primär\",\n \"commission\": \"{percent}% Provision\",\n \"buyerDiscount\": \"{percent}% Käuferrabatt\",\n \"awaitingApproval\": \"Wartet auf die Freigabe durch den Shop.\",\n \"clicks\": \"Klicks\",\n \"sales\": \"Verkäufe\",\n \"revenue\": \"Umsatz\",\n \"commissionsTitle\": \"Provisionen\",\n \"commissionsEmptyTitle\": \"Noch keine Provisionen\",\n \"commissionsEmptyBody\": \"Freigegebene Empfehlungsverkäufe erscheinen hier.\",\n \"commissionFor\": \"Bestellung {id}\",\n \"balanceTitle\": \"Guthabenbewegungen\",\n \"balanceEmptyTitle\": \"Noch keine Guthabenbewegungen\",\n \"balanceEmptyBody\": \"Umwandlungen und Auszahlungen erscheinen hier.\",\n \"claimStoreCredit\": \"Shop-Guthaben\",\n \"claimCryptoPayout\": \"Krypto-Auszahlung\",\n \"claimAdjustment\": \"Korrektur\",\n \"differentCurrency\": \"Dein Empfehlungsguthaben wird in {currency} geführt.\",\n \"convertedLabel\": \"In Shop-Guthaben umgewandelt\",\n \"paidLabel\": \"Ausgezahlt\"\n },\n \"support\": {\n \"loading\": \"Deine Anfragen werden geladen\",\n \"ticketsTitle\": \"Deine Anfragen\",\n \"emptyTitle\": \"Noch keine Anfragen\",\n \"emptyBody\": \"Schreib dem Shop hier, und jede Antwort bleibt auf dieser Seite.\",\n \"newTicket\": \"Neue Anfrage\",\n \"backToTickets\": \"Alle Anfragen\",\n \"updated\": \"Aktualisiert am {date}\",\n \"aboutOrder\": \"Zu Bestellung {id}\",\n \"subjectLabel\": \"Betreff\",\n \"subjectOptional\": \"Optional\",\n \"messageLabel\": \"Nachricht\",\n \"replyLabel\": \"Deine Antwort\",\n \"create\": \"An den Shop senden\",\n \"creating\": \"Wird gesendet…\",\n \"createFailed\": \"Deine Anfrage konnte nicht erstellt werden. Bitte versuche es noch einmal.\",\n \"reply\": \"Antwort senden\",\n \"replying\": \"Wird gesendet…\",\n \"replyFailed\": \"Deine Antwort konnte nicht gesendet werden. Bitte versuche es noch einmal.\",\n \"tooShort\": \"Bitte schreib wenigstens ein paar Worte.\",\n \"closedTitle\": \"Diese Anfrage ist geschlossen\",\n \"closedBody\": \"Eröffne eine neue, wenn du weiterhin Hilfe brauchst.\",\n \"loadingThread\": \"Diese Unterhaltung wird geladen\",\n \"noMessages\": \"Zu dieser Anfrage gibt es noch keine Nachrichten.\",\n \"fromYou\": \"Du\",\n \"fromMerchant\": \"Shop\",\n \"fromSystem\": \"System\",\n \"untitled\": \"Support-Anfrage\"\n },\n \"settings\": {\n \"loading\": \"Deine Einstellungen werden geladen\",\n \"profileTitle\": \"Profil\",\n \"emailLabel\": \"E-Mail\",\n \"emailNote\": \"Mit deiner E-Mail meldest du dich an, deshalb ändert sie der Shop und nicht diese Seite.\",\n \"nameLabel\": \"Name\",\n \"nameTooShort\": \"Bitte gib deinen Namen ein.\",\n \"saveProfile\": \"Änderungen speichern\",\n \"savingProfile\": \"Wird gespeichert…\",\n \"profileSaved\": \"Dein Name wurde aktualisiert.\",\n \"profileFailed\": \"Dein Name konnte nicht gespeichert werden. Bitte versuche es noch einmal.\",\n \"uploadAvatar\": \"Foto hochladen\",\n \"uploadingAvatar\": \"Wird hochgeladen…\",\n \"removeAvatar\": \"Foto entfernen\",\n \"removingAvatar\": \"Wird entfernt…\",\n \"avatarHint\": \"JPG, PNG, GIF oder WebP, bis zu 10 MB.\",\n \"avatarFailed\": \"Dein Foto konnte nicht hochgeladen werden. Bitte versuche es noch einmal.\",\n \"avatarRemoveFailed\": \"Dein Foto konnte nicht entfernt werden. Bitte versuche es noch einmal.\",\n \"avatarTooLarge\": \"Dieses Bild ist größer als 10 MB.\",\n \"emailsTitle\": \"E-Mails des Shops\",\n \"emailsLoading\": \"Deine E-Mail-Einstellungen werden geladen\",\n \"unsubscribeAll\": \"Gar keine Werbe-E-Mails\",\n \"unsubscribeAllNote\": \"Bestell- und Liefer-E-Mails werden in jedem Fall verschickt.\",\n \"listsEmpty\": \"Dieser Shop hat keine Verteiler.\",\n \"emailsFailed\": \"Deine E-Mail-Einstellungen konnten nicht geladen werden.\",\n \"emailsSaveFailed\": \"Diese Einstellung konnte nicht gespeichert werden. Bitte versuche es noch einmal.\",\n \"devicesTitle\": \"Angemeldete Geräte\",\n \"devicesLoading\": \"Deine Geräte werden geladen\",\n \"devicesEmpty\": \"Kein anderes Gerät ist angemeldet.\",\n \"thisDevice\": \"Dieses Gerät\",\n \"signedInOn\": \"Angemeldet am {date}\",\n \"unknownDevice\": \"Unbekanntes Gerät\",\n \"signOutDevice\": \"Abmelden\",\n \"signingOutDevice\": \"Wird abgemeldet…\",\n \"signOutOthers\": \"Alle anderen Geräte abmelden\",\n \"signOutOthersDone\": \"Alle anderen Geräte wurden abgemeldet.\",\n \"devicesFailed\": \"Deine Geräte konnten nicht geladen werden.\",\n \"signOutDeviceFailed\": \"Dieses Gerät konnte nicht abgemeldet werden. Bitte versuche es noch einmal.\",\n \"deviceOn\": \"{browser} auf {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Guthaben aufladen\",\n \"minimum\": \"Mindestens {min}\",\n \"bounds\": \"Von {min} bis {max}\",\n \"bonus\": \"Lade mindestens {amount} auf und erhalte {percent}% extra\",\n \"amount\": \"Betrag\",\n \"submit\": \"Weiter zur Zahlung\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Das Reseller-Programm ist nicht verfügbar\",\n \"disabledBody\": \"Dieser Shop nimmt derzeit keine Großhandelsbestellungen an.\",\n \"openTitle\": \"Am Reseller-Programm teilnehmen\",\n \"openBody\": \"Tritt jetzt bei und kaufe Produkte dieses Shops zu Großhandelspreisen.\",\n \"join\": \"Jetzt teilnehmen\",\n \"manualTitle\": \"Reseller-Einladung annehmen\",\n \"manualBody\": \"Gib das Einladungstoken ein, das der Shop dir geschickt hat.\",\n \"inviteToken\": \"Einladungstoken\",\n \"acceptInvite\": \"Einladung annehmen\",\n \"applicationTitle\": \"Als Reseller bewerben\",\n \"applicationBody\": \"Erzähl dem Shop von deinem Unternehmen und sende deine Bewerbung ab.\",\n \"applicationNote\": \"Hinweis zur Bewerbung\",\n \"noteRequired\": \"Füge vor dem Absenden einen Hinweis hinzu.\",\n \"apply\": \"Bewerbung absenden\",\n \"pendingTitle\": \"Deine Bewerbung wird geprüft\",\n \"pendingBody\": \"Der Shop prüft deine Bewerbung, bevor der Großhandelszugang freigeschaltet wird.\",\n \"rejectedTitle\": \"Deine Reseller-Bewerbung wurde abgelehnt\",\n \"rejectedBody\": \"Kontaktiere den Shop, wenn du mehr erfahren oder dich erneut bewerben möchtest.\",\n \"suspendedTitle\": \"Dein Reseller-Konto ist gesperrt\",\n \"suspendedBody\": \"Großhandelsbestellungen sind nicht verfügbar. Kontaktiere den Shop, wenn du Hilfe brauchst.\",\n \"activeTitle\": \"Großhandelskonto\",\n \"tier\": \"Stufe\",\n \"walletTitle\": \"Großhandelsguthaben\",\n \"balance\": \"Guthaben\",\n \"held\": \"Reserviert\",\n \"catalogTitle\": \"Großhandelskatalog\",\n \"search\": \"Produkte suchen\",\n \"catalogEmptyTitle\": \"Keine Großhandelsprodukte gefunden\",\n \"catalogEmptyBody\": \"Versuche eine andere Suche oder komm wieder, nachdem der Shop Produkte hinzugefügt hat.\",\n \"volumePricing\": \"Mengenpreise verfügbar\",\n \"supplierBacked\": \"Vom Lieferanten erfüllt\",\n \"add\": \"Hinzufügen\",\n \"basketTitle\": \"Großhandelswarenkorb\",\n \"basketEmpty\": \"Füge ein Produkt aus dem Großhandelskatalog hinzu, um eine Bestellung zu starten.\",\n \"quantity\": \"Menge\",\n \"basketNeedsQuote\": \"Lass diesen Warenkorb berechnen, um vor der Bestellung den aktuellen Gesamtbetrag zu sehen.\",\n \"quote\": \"Warenkorb berechnen\",\n \"place\": \"Bestellung aufgeben\",\n \"ordersTitle\": \"Großhandelsbestellungen\",\n \"ordersEmptyTitle\": \"Noch keine Großhandelsbestellungen\",\n \"ordersEmptyBody\": \"Bestellungen, die mit deinem Großhandelsguthaben bezahlt wurden, erscheinen hier.\",\n \"refunded\": \"Auf das Guthaben erstattet\",\n \"lineQuantity\": \"Menge {count}\",\n \"serials\": \"Gelieferte Seriennummern\",\n \"apiKeysTitle\": \"Reseller-API-Schlüssel\",\n \"apiKeyName\": \"Schlüsselname\",\n \"createApiKey\": \"Schlüssel erstellen\",\n \"apiKeysEmpty\": \"Du hast noch keine Reseller-API-Schlüssel erstellt.\",\n \"orderElsewhere\": \"Großhandelsbestellungen laufen über die Reseller-API, nicht über diese Seite.\",\n \"keysElsewhere\": \"API-Schlüssel vergibt der Shop. Frag dort danach.\",\n \"apiKeyCreatedTitle\": \"Kopiere diesen Schlüssel jetzt\",\n \"apiKeyCreatedBody\": \"Dieser Klartextschlüssel wird nur einmal angezeigt und kann später nicht wiederhergestellt werden.\",\n \"dismissKey\": \"Ich habe ihn gespeichert\",\n \"lastUsed\": \"Zuletzt verwendet: {date}\",\n \"neverUsed\": \"Nie verwendet\",\n \"revokeApiKey\": \"Widerrufen\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Copy\",\n \"copied\": \"Copied\",\n \"retry\": \"Try again\",\n \"notLoaded\": \"This did not load\",\n \"genericError\": \"This could not be loaded. Please try again in a moment.\",\n \"browseStore\": \"Browse the store\",\n \"unavailable\": \"Unavailable\",\n \"cancel\": \"Cancel\"\n },\n \"account\": {\n \"title\": \"Your account\",\n \"sections\": \"Account sections\",\n \"signOut\": \"Sign out\",\n \"signingOut\": \"Signing out…\",\n \"signOutFailed\": \"You could not be signed out. Please try again.\",\n \"checkingSession\": \"Checking your session\",\n \"sessionUnknown\": \"Your session could not be checked. Please try again in a moment.\",\n \"goToOverview\": \"Go to the overview\",\n \"tabs\": {\n \"overview\": \"Overview\",\n \"orders\": \"Orders\",\n \"downloads\": \"Downloads\",\n \"subscriptions\": \"Subscriptions\",\n \"rewards\": \"Rewards\",\n \"referrals\": \"Referrals\",\n \"favorites\": \"Favorites\",\n \"support\": \"Support\",\n \"settings\": \"Settings\",\n \"reseller\": \"Reseller\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} is not part of this store\",\n \"body\": \"This storefront does not offer that section. Your orders and account details are still here.\"\n },\n \"unknownTab\": {\n \"title\": \"That link does not point anywhere\",\n \"body\": \"The address names an account section that does not exist. It may have been mistyped or cut short.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Sign in to your account\",\n \"titleCode\": \"Check your email\",\n \"introEmail\": \"We send a single-use code to your email address. There is no password to remember.\",\n \"introCode\": \"Enter the code we sent to {email}.\",\n \"emailLabel\": \"Email\",\n \"codeLabel\": \"Sign-in code\",\n \"invalidEmail\": \"Enter a full email address, like you@example.com.\",\n \"missingCode\": \"Enter the code from your email.\",\n \"send\": \"Send me a code\",\n \"sending\": \"Sending…\",\n \"submit\": \"Sign in\",\n \"submitting\": \"Checking…\",\n \"resend\": \"Send a new code\",\n \"resent\": \"A new code is on its way to {email}.\",\n \"changeEmail\": \"Use a different email\",\n \"sendFailed\": \"The code could not be sent. Please try again in a moment.\",\n \"verifyFailed\": \"That code was not accepted. Please try again.\"\n },\n \"status\": {\n \"COMPLETED\": \"Completed\",\n \"PROCESSING\": \"Processing\",\n \"AWAITING_STOCK\": \"Awaiting stock\",\n \"PENDING\": \"Pending\",\n \"PENDING_PAYMENT\": \"Pending payment\",\n \"UNDERPAID\": \"Underpaid\",\n \"DISPUTED\": \"Disputed\",\n \"REFUNDED\": \"Refunded\",\n \"PARTIAL_REFUND\": \"Partially refunded\",\n \"VOIDED\": \"Voided\",\n \"EXPIRED\": \"Expired\",\n \"ACTIVE\": \"Active\",\n \"INACTIVE\": \"Inactive\",\n \"SUSPENDED\": \"Suspended\",\n \"REVOKED\": \"Withdrawn\",\n \"TRIALING\": \"Trial\",\n \"PAUSED\": \"Paused\",\n \"PAST_DUE\": \"Past due\",\n \"UNPAID\": \"Unpaid\",\n \"INCOMPLETE\": \"Incomplete\",\n \"CANCELED\": \"Canceled\",\n \"CANCELLED\": \"Canceled\",\n \"OPEN\": \"Open\",\n \"CLOSED\": \"Closed\",\n \"RESOLVED\": \"Resolved\",\n \"AWAITING_REPLY\": \"Awaiting your reply\",\n \"APPROVED\": \"Approved\",\n \"REJECTED\": \"Rejected\",\n \"REQUESTED\": \"Requested\",\n \"CONVERTED\": \"Converted\",\n \"PAID\": \"Paid\",\n \"FAILED\": \"Failed\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Delivered\",\n \"AWAITING_FULFILLMENT\": \"Awaiting fulfillment\",\n \"PENDING\": \"Pending\",\n \"FAILED\": \"Delivery failed\"\n },\n \"overview\": {\n \"loading\": \"Loading your account\",\n \"signedInAs\": \"Signed in as\",\n \"statOrders\": \"Orders\",\n \"statLicenses\": \"Licenses\",\n \"statDownloads\": \"Downloads\",\n \"statTickets\": \"Support tickets\",\n \"walletLabel\": \"Store credit\",\n \"walletNote\": \"Applied at checkout\",\n \"recentOrders\": \"Recent orders\",\n \"allOrders\": \"All orders\"\n },\n \"orders\": {\n \"loading\": \"Loading your orders\",\n \"emptyTitle\": \"No orders yet\",\n \"emptyBody\": \"Your purchases from this store appear here as soon as you place one.\",\n \"movedTitle\": \"Nothing on this page\",\n \"movedBody\": \"These orders moved while you were looking at them.\",\n \"backToFirstPage\": \"Back to the first page\",\n \"pagesLabel\": \"Order history pages\",\n \"previous\": \"Previous\",\n \"next\": \"Next\",\n \"page\": \"Page {page}\",\n \"andMoreOne\": \"and one more item\",\n \"andMoreOther\": \"and {count} more items\",\n \"fallbackTitle\": \"Order {id}\",\n \"allOrders\": \"All orders\",\n \"loadingOne\": \"Loading this order\",\n \"detailTitle\": \"Order {id}\",\n \"subtotal\": \"Subtotal\",\n \"discount\": \"Discount\",\n \"tax\": \"Tax\",\n \"total\": \"Total\",\n \"paidWith\": \"Paid with\",\n \"deliveryTitle\": \"Your delivery\",\n \"replacement\": \"Replacement\",\n \"search\": \"Search orders\",\n \"searchPlaceholder\": \"Search by invoice ID\",\n \"status\": \"Status\",\n \"statusAll\": \"All statuses\",\n \"statusCompleted\": \"Completed\",\n \"statusPending\": \"Pending\",\n \"statusProcessing\": \"Processing\",\n \"statusRefunded\": \"Refunded\",\n \"statusDisputed\": \"Disputed\",\n \"statusExpired\": \"Expired\",\n \"emptyFiltered\": \"No matching orders. Try a different invoice ID or status.\",\n \"warrantyTitle\": \"Warranty\",\n \"warrantyCoveredUntil\": \"Covered until {date}\",\n \"warrantyEnded\": \"Coverage ended {date}\",\n \"warrantyCancelled\": \"Coverage cancelled\",\n \"warrantyClaimSubmitted\": \"Claim submitted\",\n \"warrantyClaimApproved\": \"Claim approved\",\n \"warrantyClaimDeclined\": \"Claim declined\",\n \"warrantyClaimStart\": \"Make a claim\",\n \"warrantyClaimLabel\": \"What went wrong?\",\n \"warrantyClaimOptional\": \"Optional\",\n \"warrantyClaimSend\": \"Send claim\",\n \"warrantyClaimSending\": \"Sending…\",\n \"warrantyClaimDone\": \"The store has your claim. They reply by email.\",\n \"warrantyClaimFailed\": \"Your claim could not be sent.\"\n },\n \"downloads\": {\n \"loading\": \"Loading your downloads\",\n \"emptyTitle\": \"Nothing to download yet\",\n \"emptyBody\": \"Files, keys and access links appear here once an order is completed.\",\n \"licensesTitle\": \"License keys\",\n \"filesTitle\": \"Files\",\n \"codesTitle\": \"Codes and links\",\n \"download\": \"Download\",\n \"openLink\": \"Open link\",\n \"viewOrder\": \"View order\",\n \"expires\": \"Expires {date}\",\n \"neverExpires\": \"No end date\",\n \"lockedTo\": \"Locked to {hardwareId}\",\n \"resetHwid\": \"Reset hardware ID\",\n \"resettingHwid\": \"Resetting…\",\n \"hwidResetDone\": \"The hardware ID was cleared. Your next activation claims this license.\",\n \"hwidResetFailed\": \"The hardware ID could not be reset. Please try again.\",\n \"renewTitle\": \"Renewable\",\n \"renewBody\": \"A renewal is a purchase, so it goes through checkout rather than this page.\",\n \"renewAction\": \"Open the store\",\n \"brokenTitle\": \"Your downloads could not be listed\",\n \"brokenBody\": \"The store sent a license entry ({id}) without the license behind it, so this list would be missing what it names.\",\n \"brokenFileBody\": \"The store sent a file entry ({id}) with nothing to download, so this list would name a file it cannot hand over.\"\n },\n \"subscriptions\": {\n \"loading\": \"Loading your subscriptions\",\n \"emptyTitle\": \"No subscriptions yet\",\n \"emptyBody\": \"Recurring purchases appear here once you start one.\",\n \"allSubscriptions\": \"All subscriptions\",\n \"unnamedPlan\": \"Subscription\",\n \"renews\": \"Renews {date}\",\n \"ends\": \"Ends {date}\",\n \"canceled\": \"Canceled {date}\",\n \"startedOn\": \"Started {date}\",\n \"billingDayOne\": \"Billed daily\",\n \"billingDayOther\": \"Billed every {count} days\",\n \"billingWeekOne\": \"Billed weekly\",\n \"billingWeekOther\": \"Billed every {count} weeks\",\n \"billingMonthOne\": \"Billed monthly\",\n \"billingMonthOther\": \"Billed every {count} months\",\n \"billingYearOne\": \"Billed yearly\",\n \"billingYearOther\": \"Billed every {count} years\",\n \"billingOther\": \"Billed every {count} × {interval}\",\n \"gateway\": \"Payment provider\",\n \"paymentMethod\": \"Payment method\",\n \"cardOnFile\": \"{brand} ending {last4}\",\n \"noPaymentMethod\": \"None on file\",\n \"paymentMethodElsewhere\": \"The link to change your payment details comes from the store's own emails. It is not handed out here, because anything on this page could pick it up.\",\n \"pause\": \"Pause\",\n \"pausing\": \"Pausing…\",\n \"resume\": \"Resume\",\n \"resuming\": \"Resuming…\",\n \"cancel\": \"Cancel subscription\",\n \"cancelling\": \"Cancelling…\",\n \"keep\": \"Keep it\",\n \"confirmCancelTitle\": \"Cancel this subscription?\",\n \"confirmCancelAtPeriodEnd\": \"You keep access until {date}. Nothing is billed after that.\",\n \"confirmCancelNow\": \"Access ends as soon as this is cancelled.\",\n \"actionFailed\": \"That did not go through. Please try again.\",\n \"paused\": \"This subscription is paused.\",\n \"resumed\": \"This subscription is running again.\",\n \"cancelled\": \"This subscription is cancelled.\",\n \"historyTitle\": \"Billing history\",\n \"historyLoading\": \"Loading billing history\",\n \"historyEmptyTitle\": \"No billing history yet\",\n \"historyEmptyBody\": \"Renewal invoices appear here after the first cycle.\",\n \"trial\": \"Trial ends {date}\"\n },\n \"favorites\": {\n \"loading\": \"Loading your favorites\",\n \"emptyTitle\": \"No favorites yet\",\n \"emptyBody\": \"Products you save while browsing the store are kept here.\",\n \"added\": \"Saved {date}\",\n \"gone\": \"No longer available\",\n \"view\": \"View in store\",\n \"remove\": \"Remove\",\n \"removing\": \"Removing…\",\n \"removeFailed\": \"This favorite could not be removed. Please try again.\",\n \"noImage\": \"No image for {title}\"\n },\n \"rewards\": {\n \"loading\": \"Loading your rewards\",\n \"available\": \"Available\",\n \"pending\": \"In progress\",\n \"lifetime\": \"Earned in total\",\n \"couponsTitle\": \"Your coupons\",\n \"couponsBody\": \"Paste one of these at checkout.\",\n \"percentOff\": \"{percent}% off\",\n \"couponGeneric\": \"Discount coupon\",\n \"expiresOn\": \"Expires {date}\",\n \"activityTitle\": \"Activity\",\n \"emptyTitle\": \"No rewards yet\",\n \"emptyBody\": \"Complete an order or leave a review to start earning.\",\n \"storeCredit\": \"{amount} store credit\",\n \"storeCreditGeneric\": \"Store credit\",\n \"couponNamed\": \"Coupon {code}\",\n \"couponUnnamed\": \"Coupon code\",\n \"otherReward\": \"Reward\",\n \"reasonOrderCompleted\": \"Order completed\",\n \"reasonOrderCount\": \"Loyalty milestone\",\n \"reasonSpendAmount\": \"Lifetime spend\",\n \"reasonReview\": \"Review left\",\n \"reasonFirstPurchase\": \"First purchase\",\n \"reasonOther\": \"Reward\",\n \"grantFulfilled\": \"Earned\",\n \"grantPending\": \"In progress\",\n \"grantFailed\": \"Failed\",\n \"grantRevoked\": \"Withdrawn\",\n \"pointsTitle\": \"Points\",\n \"pointsBalance\": \"Points balance\",\n \"pointsLifetime\": \"Points earned in total\",\n \"pointsEarnHint\": \"Complete an order to start collecting points.\",\n \"pointsActivityTitle\": \"Points activity\",\n \"pointsFromOrder\": \"Order completed\",\n \"pointsFromReview\": \"Review left\",\n \"pointsConverted\": \"Converted to store credit\",\n \"pointsAdjusted\": \"Adjusted by the store\",\n \"redeemTitle\": \"Convert points\",\n \"redeemBody\": \"Turn your points into store credit and spend it at checkout.\",\n \"redeemLabel\": \"Points to convert\",\n \"redeemMinimum\": \"Convert at least {points} points.\",\n \"redeemOverBalance\": \"You have {points} points to spend.\",\n \"redeemInvalid\": \"Enter a whole number of points.\",\n \"redeemPreview\": \"Worth about {amount} in store credit.\",\n \"redeemContinue\": \"Continue\",\n \"redeemConfirm\": \"Convert {points} points into about {amount} in store credit?\",\n \"redeemConfirmAction\": \"Yes, convert\",\n \"redeemWorking\": \"Converting…\",\n \"redeemDone\": \"{amount} added to your store credit.\",\n \"redeemFailed\": \"Your points could not be converted.\"\n },\n \"referrals\": {\n \"loading\": \"Loading your referrals\",\n \"notEnrolledTitle\": \"You are not in the referral program\",\n \"notEnrolledBody\": \"This store has not enrolled you, so there is nothing to share or track yet.\",\n \"availableLabel\": \"Available to withdraw\",\n \"pendingLabel\": \"Pending\",\n \"requestedLabel\": \"Requested\",\n \"payoutsElsewhere\": \"Withdrawals and payouts are handled by the store, not from this page.\",\n \"codesAccepted\": \"Your code is accepted at checkout.\",\n \"codesNotAccepted\": \"This store does not accept referral codes at checkout right now.\",\n \"linksTitle\": \"Your links\",\n \"linksEmptyTitle\": \"No referral links yet\",\n \"linksEmptyBody\": \"The store creates the links you share. Ask them for one if you expected to find it here.\",\n \"primary\": \"Primary\",\n \"commission\": \"{percent}% commission\",\n \"buyerDiscount\": \"{percent}% buyer discount\",\n \"awaitingApproval\": \"Waiting for the store to approve this link.\",\n \"clicks\": \"Clicks\",\n \"sales\": \"Sales\",\n \"revenue\": \"Revenue\",\n \"commissionsTitle\": \"Commissions\",\n \"commissionsEmptyTitle\": \"No commissions yet\",\n \"commissionsEmptyBody\": \"Approved referral sales appear here.\",\n \"commissionFor\": \"Order {id}\",\n \"balanceTitle\": \"Balance activity\",\n \"balanceEmptyTitle\": \"No balance activity yet\",\n \"balanceEmptyBody\": \"Conversions and payouts appear here.\",\n \"claimStoreCredit\": \"Store credit\",\n \"claimCryptoPayout\": \"Crypto payout\",\n \"claimAdjustment\": \"Adjustment\",\n \"differentCurrency\": \"Your referral balance is held in {currency}.\",\n \"convertedLabel\": \"Moved to store credit\",\n \"paidLabel\": \"Paid out\"\n },\n \"support\": {\n \"loading\": \"Loading your tickets\",\n \"ticketsTitle\": \"Your tickets\",\n \"emptyTitle\": \"No tickets yet\",\n \"emptyBody\": \"Write to the store here and every reply stays on this page.\",\n \"newTicket\": \"New ticket\",\n \"backToTickets\": \"All tickets\",\n \"updated\": \"Updated {date}\",\n \"aboutOrder\": \"About order {id}\",\n \"subjectLabel\": \"Subject\",\n \"subjectOptional\": \"Optional\",\n \"messageLabel\": \"Message\",\n \"replyLabel\": \"Your reply\",\n \"create\": \"Send to the store\",\n \"creating\": \"Sending…\",\n \"createFailed\": \"Your ticket could not be created. Please try again.\",\n \"reply\": \"Send reply\",\n \"replying\": \"Sending…\",\n \"replyFailed\": \"Your reply could not be sent. Please try again.\",\n \"tooShort\": \"Please write at least a short message.\",\n \"closedTitle\": \"This ticket is closed\",\n \"closedBody\": \"Open a new one if you still need help.\",\n \"loadingThread\": \"Loading this conversation\",\n \"noMessages\": \"There are no messages on this ticket yet.\",\n \"fromYou\": \"You\",\n \"fromMerchant\": \"Store\",\n \"fromSystem\": \"System\",\n \"untitled\": \"Support request\"\n },\n \"settings\": {\n \"loading\": \"Loading your settings\",\n \"profileTitle\": \"Profile\",\n \"emailLabel\": \"Email\",\n \"emailNote\": \"Your email is what signs you in, so it is changed by the store rather than here.\",\n \"nameLabel\": \"Name\",\n \"nameTooShort\": \"Please enter your name.\",\n \"saveProfile\": \"Save changes\",\n \"savingProfile\": \"Saving…\",\n \"profileSaved\": \"Your name was updated.\",\n \"profileFailed\": \"Your name could not be saved. Please try again.\",\n \"uploadAvatar\": \"Upload a photo\",\n \"uploadingAvatar\": \"Uploading…\",\n \"removeAvatar\": \"Remove photo\",\n \"removingAvatar\": \"Removing…\",\n \"avatarHint\": \"JPG, PNG, GIF or WebP, up to 10 MB.\",\n \"avatarFailed\": \"Your photo could not be uploaded. Please try again.\",\n \"avatarRemoveFailed\": \"Your photo could not be removed. Please try again.\",\n \"avatarTooLarge\": \"That image is larger than 10 MB.\",\n \"emailsTitle\": \"Store emails\",\n \"emailsLoading\": \"Loading your email settings\",\n \"unsubscribeAll\": \"No marketing emails at all\",\n \"unsubscribeAllNote\": \"Order and delivery emails are sent either way.\",\n \"listsEmpty\": \"This store has no mailing lists.\",\n \"emailsFailed\": \"Your email settings could not be loaded.\",\n \"emailsSaveFailed\": \"That setting could not be saved. Please try again.\",\n \"devicesTitle\": \"Signed-in devices\",\n \"devicesLoading\": \"Loading your devices\",\n \"devicesEmpty\": \"No other device is signed in.\",\n \"thisDevice\": \"This device\",\n \"signedInOn\": \"Signed in {date}\",\n \"unknownDevice\": \"Unknown device\",\n \"signOutDevice\": \"Sign out\",\n \"signingOutDevice\": \"Signing out…\",\n \"signOutOthers\": \"Sign out every other device\",\n \"signOutOthersDone\": \"Every other device was signed out.\",\n \"devicesFailed\": \"Your devices could not be loaded.\",\n \"signOutDeviceFailed\": \"That device could not be signed out. Please try again.\",\n \"deviceOn\": \"{browser} on {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Add store credit\",\n \"minimum\": \"Minimum {min}\",\n \"bounds\": \"From {min} to {max}\",\n \"bonus\": \"Add at least {amount} and get {percent}% extra\",\n \"amount\": \"Amount\",\n \"submit\": \"Continue to payment\"\n },\n \"reseller\": {\n \"disabledTitle\": \"The reseller program is unavailable\",\n \"disabledBody\": \"This store is not accepting wholesale orders right now.\",\n \"openTitle\": \"Join the reseller program\",\n \"openBody\": \"Join now to buy this store's products at wholesale prices.\",\n \"join\": \"Join now\",\n \"manualTitle\": \"Accept your reseller invitation\",\n \"manualBody\": \"Enter the invitation token the store sent you.\",\n \"inviteToken\": \"Invitation token\",\n \"acceptInvite\": \"Accept invitation\",\n \"applicationTitle\": \"Apply to become a reseller\",\n \"applicationBody\": \"Tell the store about your business and submit your application.\",\n \"applicationNote\": \"Application note\",\n \"noteRequired\": \"Add a note before you submit your application.\",\n \"apply\": \"Submit application\",\n \"pendingTitle\": \"Your application is pending\",\n \"pendingBody\": \"The store will review your application before wholesale access is enabled.\",\n \"rejectedTitle\": \"Your reseller application was rejected\",\n \"rejectedBody\": \"Contact the store if you need more information or want to apply again.\",\n \"suspendedTitle\": \"Your reseller account is suspended\",\n \"suspendedBody\": \"Wholesale ordering is unavailable. Contact the store for help.\",\n \"activeTitle\": \"Wholesale account\",\n \"tier\": \"Tier\",\n \"walletTitle\": \"Wholesale balance\",\n \"balance\": \"Balance\",\n \"held\": \"On hold\",\n \"catalogTitle\": \"Wholesale catalog\",\n \"search\": \"Search products\",\n \"catalogEmptyTitle\": \"No wholesale products found\",\n \"catalogEmptyBody\": \"Try another search or come back after the store adds products.\",\n \"volumePricing\": \"Volume pricing available\",\n \"supplierBacked\": \"Supplier fulfilled\",\n \"add\": \"Add\",\n \"basketTitle\": \"Wholesale basket\",\n \"basketEmpty\": \"Add a product from the wholesale catalog to start an order.\",\n \"quantity\": \"Quantity\",\n \"basketNeedsQuote\": \"Price this basket to see the current total before placing it.\",\n \"quote\": \"Price basket\",\n \"place\": \"Place order\",\n \"ordersTitle\": \"Wholesale orders\",\n \"ordersEmptyTitle\": \"No wholesale orders yet\",\n \"ordersEmptyBody\": \"Orders paid from your wholesale balance appear here.\",\n \"refunded\": \"Refunded to balance\",\n \"lineQuantity\": \"Quantity {count}\",\n \"serials\": \"Delivered serials\",\n \"apiKeysTitle\": \"Reseller API keys\",\n \"apiKeyName\": \"Key name\",\n \"createApiKey\": \"Create key\",\n \"apiKeysEmpty\": \"You have not created any reseller API keys.\",\n \"orderElsewhere\": \"Wholesale orders are placed through the reseller API, not from this page.\",\n \"keysElsewhere\": \"API keys are issued by the shop. Ask them for one.\",\n \"apiKeyCreatedTitle\": \"Copy this key now\",\n \"apiKeyCreatedBody\": \"This plaintext key is shown once and cannot be recovered later.\",\n \"dismissKey\": \"I saved it\",\n \"lastUsed\": \"Last used {date}\",\n \"neverUsed\": \"Never used\",\n \"revokeApiKey\": \"Revoke\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Copiar\",\n \"copied\": \"Copiado\",\n \"retry\": \"Inténtalo de nuevo\",\n \"notLoaded\": \"Esto no se cargó\",\n \"genericError\": \"No se pudo cargar. Inténtalo de nuevo en un momento.\",\n \"browseStore\": \"Ver la tienda\",\n \"unavailable\": \"No disponible\",\n \"cancel\": \"Cancelar\"\n },\n \"account\": {\n \"title\": \"Tu cuenta\",\n \"sections\": \"Secciones de la cuenta\",\n \"signOut\": \"Cerrar sesión\",\n \"signingOut\": \"Cerrando sesión…\",\n \"signOutFailed\": \"No se pudo cerrar tu sesión. Inténtalo de nuevo.\",\n \"checkingSession\": \"Comprobando tu sesión\",\n \"sessionUnknown\": \"No se pudo comprobar tu sesión. Inténtalo de nuevo en un momento.\",\n \"goToOverview\": \"Ir al resumen\",\n \"tabs\": {\n \"overview\": \"Resumen\",\n \"orders\": \"Pedidos\",\n \"downloads\": \"Descargas\",\n \"subscriptions\": \"Suscripciones\",\n \"rewards\": \"Recompensas\",\n \"referrals\": \"Referidos\",\n \"favorites\": \"Favoritos\",\n \"support\": \"Ayuda\",\n \"settings\": \"Ajustes\",\n \"reseller\": \"Revendedor\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} no forma parte de esta tienda\",\n \"body\": \"Esta tienda no ofrece esa sección. Tus pedidos y los datos de tu cuenta siguen aquí.\"\n },\n \"unknownTab\": {\n \"title\": \"Ese enlace no lleva a ninguna parte\",\n \"body\": \"La dirección nombra una sección de la cuenta que no existe. Puede que se haya escrito mal o que esté incompleta.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Inicia sesión en tu cuenta\",\n \"titleCode\": \"Revisa tu correo\",\n \"introEmail\": \"Enviamos un código de un solo uso a tu correo. No hay ninguna contraseña que recordar.\",\n \"introCode\": \"Escribe el código que enviamos a {email}.\",\n \"emailLabel\": \"Correo\",\n \"codeLabel\": \"Código de acceso\",\n \"invalidEmail\": \"Escribe un correo completo, como tu@ejemplo.com.\",\n \"missingCode\": \"Escribe el código de tu correo.\",\n \"send\": \"Enviarme un código\",\n \"sending\": \"Enviando…\",\n \"submit\": \"Iniciar sesión\",\n \"submitting\": \"Comprobando…\",\n \"resend\": \"Enviar un código nuevo\",\n \"resent\": \"Un código nuevo va camino a {email}.\",\n \"changeEmail\": \"Usar otro correo\",\n \"sendFailed\": \"No se pudo enviar el código. Inténtalo de nuevo en un momento.\",\n \"verifyFailed\": \"Ese código no se aceptó. Inténtalo de nuevo.\"\n },\n \"status\": {\n \"COMPLETED\": \"Completado\",\n \"PROCESSING\": \"En proceso\",\n \"AWAITING_STOCK\": \"Esperando existencias\",\n \"PENDING\": \"Pendiente\",\n \"PENDING_PAYMENT\": \"Pago pendiente\",\n \"UNDERPAID\": \"Pago insuficiente\",\n \"DISPUTED\": \"En disputa\",\n \"REFUNDED\": \"Reembolsado\",\n \"PARTIAL_REFUND\": \"Reembolsado en parte\",\n \"VOIDED\": \"Anulado\",\n \"EXPIRED\": \"Caducado\",\n \"ACTIVE\": \"Activo\",\n \"INACTIVE\": \"Inactivo\",\n \"SUSPENDED\": \"Suspendido\",\n \"REVOKED\": \"Retirado\",\n \"TRIALING\": \"Prueba\",\n \"PAUSED\": \"En pausa\",\n \"PAST_DUE\": \"Pago atrasado\",\n \"UNPAID\": \"Sin pagar\",\n \"INCOMPLETE\": \"Incompleto\",\n \"CANCELED\": \"Cancelado\",\n \"CANCELLED\": \"Cancelado\",\n \"OPEN\": \"Abierto\",\n \"CLOSED\": \"Cerrado\",\n \"RESOLVED\": \"Resuelto\",\n \"AWAITING_REPLY\": \"Esperando tu respuesta\",\n \"APPROVED\": \"Aprobado\",\n \"REJECTED\": \"Rechazado\",\n \"REQUESTED\": \"Solicitado\",\n \"CONVERTED\": \"Convertido\",\n \"PAID\": \"Pagado\",\n \"FAILED\": \"Fallido\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Entregado\",\n \"AWAITING_FULFILLMENT\": \"Esperando entrega\",\n \"PENDING\": \"Pendiente\",\n \"FAILED\": \"Entrega fallida\"\n },\n \"overview\": {\n \"loading\": \"Cargando tu cuenta\",\n \"signedInAs\": \"Sesión iniciada como\",\n \"statOrders\": \"Pedidos\",\n \"statLicenses\": \"Licencias\",\n \"statDownloads\": \"Descargas\",\n \"statTickets\": \"Tickets de ayuda\",\n \"walletLabel\": \"Saldo de la tienda\",\n \"walletNote\": \"Se aplica al pagar\",\n \"recentOrders\": \"Pedidos recientes\",\n \"allOrders\": \"Todos los pedidos\"\n },\n \"orders\": {\n \"loading\": \"Cargando tus pedidos\",\n \"emptyTitle\": \"Aún no hay pedidos\",\n \"emptyBody\": \"Tus compras en esta tienda aparecen aquí en cuanto hagas una.\",\n \"movedTitle\": \"No hay nada en esta página\",\n \"movedBody\": \"Estos pedidos cambiaron de sitio mientras los mirabas.\",\n \"backToFirstPage\": \"Volver a la primera página\",\n \"pagesLabel\": \"Páginas del historial de pedidos\",\n \"previous\": \"Anterior\",\n \"next\": \"Siguiente\",\n \"page\": \"Página {page}\",\n \"andMoreOne\": \"y un artículo más\",\n \"andMoreOther\": \"y {count} artículos más\",\n \"fallbackTitle\": \"Pedido {id}\",\n \"allOrders\": \"Todos los pedidos\",\n \"loadingOne\": \"Cargando este pedido\",\n \"detailTitle\": \"Pedido {id}\",\n \"subtotal\": \"Subtotal\",\n \"discount\": \"Descuento\",\n \"tax\": \"Impuestos\",\n \"total\": \"Total\",\n \"paidWith\": \"Pagado con\",\n \"deliveryTitle\": \"Tu entrega\",\n \"replacement\": \"Reemplazo\",\n \"search\": \"Buscar pedidos\",\n \"searchPlaceholder\": \"Buscar por número de factura\",\n \"status\": \"Estado\",\n \"statusAll\": \"Todos los estados\",\n \"statusCompleted\": \"Completado\",\n \"statusPending\": \"Pendiente\",\n \"statusProcessing\": \"En proceso\",\n \"statusRefunded\": \"Reembolsado\",\n \"statusDisputed\": \"En disputa\",\n \"statusExpired\": \"Caducado\",\n \"emptyFiltered\": \"No hay pedidos que coincidan. Prueba con otro número de factura u otro estado.\",\n \"warrantyTitle\": \"Garantía\",\n \"warrantyCoveredUntil\": \"Cubierto hasta el {date}\",\n \"warrantyEnded\": \"La cobertura terminó el {date}\",\n \"warrantyCancelled\": \"Cobertura cancelada\",\n \"warrantyClaimSubmitted\": \"Reclamación enviada\",\n \"warrantyClaimApproved\": \"Reclamación aprobada\",\n \"warrantyClaimDeclined\": \"Reclamación rechazada\",\n \"warrantyClaimStart\": \"Hacer una reclamación\",\n \"warrantyClaimLabel\": \"¿Qué ha pasado?\",\n \"warrantyClaimOptional\": \"Opcional\",\n \"warrantyClaimSend\": \"Enviar reclamación\",\n \"warrantyClaimSending\": \"Enviando…\",\n \"warrantyClaimDone\": \"La tienda ha recibido tu reclamación. Te responderán por correo.\",\n \"warrantyClaimFailed\": \"No se ha podido enviar tu reclamación.\"\n },\n \"downloads\": {\n \"loading\": \"Cargando tus descargas\",\n \"emptyTitle\": \"Aún no hay nada que descargar\",\n \"emptyBody\": \"Los archivos, las claves y los enlaces de acceso aparecen aquí cuando se completa un pedido.\",\n \"licensesTitle\": \"Claves de licencia\",\n \"filesTitle\": \"Archivos\",\n \"codesTitle\": \"Códigos y enlaces\",\n \"download\": \"Descargar\",\n \"openLink\": \"Abrir enlace\",\n \"viewOrder\": \"Ver pedido\",\n \"expires\": \"Caduca el {date}\",\n \"neverExpires\": \"Sin fecha de fin\",\n \"lockedTo\": \"Vinculada a {hardwareId}\",\n \"resetHwid\": \"Restablecer ID de hardware\",\n \"resettingHwid\": \"Restableciendo…\",\n \"hwidResetDone\": \"Se borró el ID de hardware. Tu próxima activación reclama esta licencia.\",\n \"hwidResetFailed\": \"No se pudo restablecer el ID de hardware. Inténtalo de nuevo.\",\n \"renewTitle\": \"Renovable\",\n \"renewBody\": \"Una renovación es una compra, así que pasa por la caja y no por esta página.\",\n \"renewAction\": \"Abrir la tienda\",\n \"brokenTitle\": \"No se pudieron mostrar tus descargas\",\n \"brokenBody\": \"La tienda envió una entrada de licencia ({id}) sin la licencia que hay detrás, así que a esta lista le faltaría justo lo que nombra.\",\n \"brokenFileBody\": \"La tienda envió una entrada de archivo ({id}) sin nada que descargar, así que esta lista nombraría un archivo que no puede entregar.\"\n },\n \"subscriptions\": {\n \"loading\": \"Cargando tus suscripciones\",\n \"emptyTitle\": \"Aún no hay suscripciones\",\n \"emptyBody\": \"Las compras recurrentes aparecen aquí en cuanto empieces una.\",\n \"allSubscriptions\": \"Todas las suscripciones\",\n \"unnamedPlan\": \"Suscripción\",\n \"renews\": \"Se renueva el {date}\",\n \"ends\": \"Termina el {date}\",\n \"canceled\": \"Cancelada el {date}\",\n \"startedOn\": \"Empezó el {date}\",\n \"billingDayOne\": \"Se cobra a diario\",\n \"billingDayOther\": \"Se cobra cada {count} días\",\n \"billingWeekOne\": \"Se cobra cada semana\",\n \"billingWeekOther\": \"Se cobra cada {count} semanas\",\n \"billingMonthOne\": \"Se cobra cada mes\",\n \"billingMonthOther\": \"Se cobra cada {count} meses\",\n \"billingYearOne\": \"Se cobra cada año\",\n \"billingYearOther\": \"Se cobra cada {count} años\",\n \"billingOther\": \"Se cobra cada {count} × {interval}\",\n \"gateway\": \"Proveedor de pago\",\n \"paymentMethod\": \"Método de pago\",\n \"cardOnFile\": \"{brand} terminada en {last4}\",\n \"noPaymentMethod\": \"Ninguno guardado\",\n \"paymentMethodElsewhere\": \"El enlace para cambiar tus datos de pago llega en los correos de la propia tienda. Aquí no se muestra, porque cualquier cosa de esta página podría capturarlo.\",\n \"pause\": \"Pausar\",\n \"pausing\": \"Pausando…\",\n \"resume\": \"Reanudar\",\n \"resuming\": \"Reanudando…\",\n \"cancel\": \"Cancelar suscripción\",\n \"cancelling\": \"Cancelando…\",\n \"keep\": \"Mantenerla\",\n \"confirmCancelTitle\": \"¿Cancelar esta suscripción?\",\n \"confirmCancelAtPeriodEnd\": \"Conservas el acceso hasta el {date}. Después no se cobra nada.\",\n \"confirmCancelNow\": \"El acceso termina en cuanto se cancele.\",\n \"actionFailed\": \"Eso no salió bien. Inténtalo de nuevo.\",\n \"paused\": \"Esta suscripción está en pausa.\",\n \"resumed\": \"Esta suscripción vuelve a estar activa.\",\n \"cancelled\": \"Esta suscripción está cancelada.\",\n \"historyTitle\": \"Historial de cobros\",\n \"historyLoading\": \"Cargando el historial de cobros\",\n \"historyEmptyTitle\": \"Aún no hay historial de cobros\",\n \"historyEmptyBody\": \"Las facturas de renovación aparecen aquí tras el primer ciclo.\",\n \"trial\": \"La prueba termina el {date}\"\n },\n \"favorites\": {\n \"loading\": \"Cargando tus favoritos\",\n \"emptyTitle\": \"Aún no hay favoritos\",\n \"emptyBody\": \"Los productos que guardas mientras miras la tienda se quedan aquí.\",\n \"added\": \"Guardado el {date}\",\n \"gone\": \"Ya no está disponible\",\n \"view\": \"Ver en la tienda\",\n \"remove\": \"Quitar\",\n \"removing\": \"Quitando…\",\n \"removeFailed\": \"No se pudo quitar este favorito. Inténtalo de nuevo.\",\n \"noImage\": \"Sin imagen para {title}\"\n },\n \"rewards\": {\n \"loading\": \"Cargando tus recompensas\",\n \"available\": \"Disponible\",\n \"pending\": \"En curso\",\n \"lifetime\": \"Ganado en total\",\n \"couponsTitle\": \"Tus cupones\",\n \"couponsBody\": \"Pega uno de estos al pagar.\",\n \"percentOff\": \"{percent}% de descuento\",\n \"couponGeneric\": \"Cupón de descuento\",\n \"expiresOn\": \"Caduca el {date}\",\n \"activityTitle\": \"Actividad\",\n \"emptyTitle\": \"Aún no hay recompensas\",\n \"emptyBody\": \"Completa un pedido o deja una reseña para empezar a ganar.\",\n \"storeCredit\": \"{amount} de saldo de la tienda\",\n \"storeCreditGeneric\": \"Saldo de la tienda\",\n \"couponNamed\": \"Cupón {code}\",\n \"couponUnnamed\": \"Código de cupón\",\n \"otherReward\": \"Recompensa\",\n \"reasonOrderCompleted\": \"Pedido completado\",\n \"reasonOrderCount\": \"Hito de fidelidad\",\n \"reasonSpendAmount\": \"Gasto acumulado\",\n \"reasonReview\": \"Reseña dejada\",\n \"reasonFirstPurchase\": \"Primera compra\",\n \"reasonOther\": \"Recompensa\",\n \"grantFulfilled\": \"Ganada\",\n \"grantPending\": \"En curso\",\n \"grantFailed\": \"Fallida\",\n \"grantRevoked\": \"Retirada\",\n \"pointsTitle\": \"Puntos\",\n \"pointsBalance\": \"Saldo de puntos\",\n \"pointsLifetime\": \"Ganados en total\",\n \"pointsEarnHint\": \"Completa un pedido para empezar a sumar puntos.\",\n \"pointsActivityTitle\": \"Movimientos de puntos\",\n \"pointsFromOrder\": \"Pedido completado\",\n \"pointsFromReview\": \"Reseña dejada\",\n \"pointsConverted\": \"Convertidos en saldo de la tienda\",\n \"pointsAdjusted\": \"Ajustados por la tienda\",\n \"redeemTitle\": \"Convertir puntos\",\n \"redeemBody\": \"Convierte tus puntos en saldo de la tienda y úsalo al pagar.\",\n \"redeemLabel\": \"Puntos que convertir\",\n \"redeemMinimum\": \"Convierte al menos {points} puntos.\",\n \"redeemOverBalance\": \"Tienes {points} puntos disponibles.\",\n \"redeemInvalid\": \"Introduce un número entero de puntos.\",\n \"redeemPreview\": \"Equivale a unos {amount} de saldo de la tienda.\",\n \"redeemContinue\": \"Continuar\",\n \"redeemConfirm\": \"¿Convertir {points} puntos en unos {amount} de saldo de la tienda?\",\n \"redeemConfirmAction\": \"Sí, convertir\",\n \"redeemWorking\": \"Convirtiendo…\",\n \"redeemDone\": \"{amount} añadidos a tu saldo de la tienda.\",\n \"redeemFailed\": \"No se han podido convertir tus puntos.\"\n },\n \"referrals\": {\n \"loading\": \"Cargando tus referidos\",\n \"notEnrolledTitle\": \"No estás en el programa de referidos\",\n \"notEnrolledBody\": \"Esta tienda no te ha inscrito, así que todavía no hay nada que compartir ni seguir.\",\n \"availableLabel\": \"Disponible para retirar\",\n \"pendingLabel\": \"Pendiente\",\n \"requestedLabel\": \"Solicitado\",\n \"payoutsElsewhere\": \"Las retiradas y los pagos los gestiona la tienda, no esta página.\",\n \"codesAccepted\": \"Tu código se acepta al pagar.\",\n \"codesNotAccepted\": \"Esta tienda no acepta códigos de referido al pagar por ahora.\",\n \"linksTitle\": \"Tus enlaces\",\n \"linksEmptyTitle\": \"Aún no hay enlaces de referido\",\n \"linksEmptyBody\": \"La tienda crea los enlaces que compartes. Pídeles uno si esperabas encontrarlo aquí.\",\n \"primary\": \"Principal\",\n \"commission\": \"{percent}% de comisión\",\n \"buyerDiscount\": \"{percent}% de descuento para el comprador\",\n \"awaitingApproval\": \"Esperando a que la tienda apruebe este enlace.\",\n \"clicks\": \"Clics\",\n \"sales\": \"Ventas\",\n \"revenue\": \"Ingresos\",\n \"commissionsTitle\": \"Comisiones\",\n \"commissionsEmptyTitle\": \"Aún no hay comisiones\",\n \"commissionsEmptyBody\": \"Las ventas por referido aprobadas aparecen aquí.\",\n \"commissionFor\": \"Pedido {id}\",\n \"balanceTitle\": \"Movimientos del saldo\",\n \"balanceEmptyTitle\": \"Aún no hay movimientos de saldo\",\n \"balanceEmptyBody\": \"Las conversiones y los pagos aparecen aquí.\",\n \"claimStoreCredit\": \"Saldo de la tienda\",\n \"claimCryptoPayout\": \"Pago en cripto\",\n \"claimAdjustment\": \"Ajuste\",\n \"differentCurrency\": \"Tu saldo de referidos se lleva en {currency}.\",\n \"convertedLabel\": \"Convertido en saldo\",\n \"paidLabel\": \"Pagado\"\n },\n \"support\": {\n \"loading\": \"Cargando tus tickets\",\n \"ticketsTitle\": \"Tus tickets\",\n \"emptyTitle\": \"Aún no hay tickets\",\n \"emptyBody\": \"Escribe aquí a la tienda y cada respuesta se queda en esta página.\",\n \"newTicket\": \"Nuevo ticket\",\n \"backToTickets\": \"Todos los tickets\",\n \"updated\": \"Actualizado el {date}\",\n \"aboutOrder\": \"Sobre el pedido {id}\",\n \"subjectLabel\": \"Asunto\",\n \"subjectOptional\": \"Opcional\",\n \"messageLabel\": \"Mensaje\",\n \"replyLabel\": \"Tu respuesta\",\n \"create\": \"Enviar a la tienda\",\n \"creating\": \"Enviando…\",\n \"createFailed\": \"No se pudo crear tu ticket. Inténtalo de nuevo.\",\n \"reply\": \"Enviar respuesta\",\n \"replying\": \"Enviando…\",\n \"replyFailed\": \"No se pudo enviar tu respuesta. Inténtalo de nuevo.\",\n \"tooShort\": \"Escribe al menos un mensaje breve.\",\n \"closedTitle\": \"Este ticket está cerrado\",\n \"closedBody\": \"Abre uno nuevo si todavía necesitas ayuda.\",\n \"loadingThread\": \"Cargando esta conversación\",\n \"noMessages\": \"Todavía no hay mensajes en este ticket.\",\n \"fromYou\": \"Tú\",\n \"fromMerchant\": \"Tienda\",\n \"fromSystem\": \"Sistema\",\n \"untitled\": \"Solicitud de ayuda\"\n },\n \"settings\": {\n \"loading\": \"Cargando tus ajustes\",\n \"profileTitle\": \"Perfil\",\n \"emailLabel\": \"Correo\",\n \"emailNote\": \"Con tu correo inicias sesión, así que lo cambia la tienda y no esta página.\",\n \"nameLabel\": \"Nombre\",\n \"nameTooShort\": \"Escribe tu nombre.\",\n \"saveProfile\": \"Guardar cambios\",\n \"savingProfile\": \"Guardando…\",\n \"profileSaved\": \"Tu nombre se actualizó.\",\n \"profileFailed\": \"No se pudo guardar tu nombre. Inténtalo de nuevo.\",\n \"uploadAvatar\": \"Subir una foto\",\n \"uploadingAvatar\": \"Subiendo…\",\n \"removeAvatar\": \"Quitar la foto\",\n \"removingAvatar\": \"Quitando…\",\n \"avatarHint\": \"JPG, PNG, GIF o WebP, hasta 10 MB.\",\n \"avatarFailed\": \"No se pudo subir tu foto. Inténtalo de nuevo.\",\n \"avatarRemoveFailed\": \"No se pudo quitar tu foto. Inténtalo de nuevo.\",\n \"avatarTooLarge\": \"Esa imagen supera los 10 MB.\",\n \"emailsTitle\": \"Correos de la tienda\",\n \"emailsLoading\": \"Cargando tus ajustes de correo\",\n \"unsubscribeAll\": \"Ningún correo de marketing\",\n \"unsubscribeAllNote\": \"Los correos de pedido y entrega se envían igualmente.\",\n \"listsEmpty\": \"Esta tienda no tiene listas de correo.\",\n \"emailsFailed\": \"No se pudieron cargar tus ajustes de correo.\",\n \"emailsSaveFailed\": \"No se pudo guardar ese ajuste. Inténtalo de nuevo.\",\n \"devicesTitle\": \"Dispositivos con sesión iniciada\",\n \"devicesLoading\": \"Cargando tus dispositivos\",\n \"devicesEmpty\": \"No hay ningún otro dispositivo con sesión iniciada.\",\n \"thisDevice\": \"Este dispositivo\",\n \"signedInOn\": \"Sesión iniciada el {date}\",\n \"unknownDevice\": \"Dispositivo desconocido\",\n \"signOutDevice\": \"Cerrar sesión\",\n \"signingOutDevice\": \"Cerrando sesión…\",\n \"signOutOthers\": \"Cerrar sesión en los demás dispositivos\",\n \"signOutOthersDone\": \"Se cerró la sesión en los demás dispositivos.\",\n \"devicesFailed\": \"No se pudieron cargar tus dispositivos.\",\n \"signOutDeviceFailed\": \"No se pudo cerrar la sesión de ese dispositivo. Inténtalo de nuevo.\",\n \"deviceOn\": \"{browser} en {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Añadir saldo\",\n \"minimum\": \"Mínimo {min}\",\n \"bounds\": \"De {min} a {max}\",\n \"bonus\": \"Añade al menos {amount} y recibe un {percent}% extra\",\n \"amount\": \"Importe\",\n \"submit\": \"Continuar al pago\"\n },\n \"reseller\": {\n \"disabledTitle\": \"El programa de distribuidores no está disponible\",\n \"disabledBody\": \"Esta tienda no acepta pedidos al por mayor ahora mismo.\",\n \"openTitle\": \"Únete al programa de distribuidores\",\n \"openBody\": \"Únete ahora para comprar productos de esta tienda a precios mayoristas.\",\n \"join\": \"Unirme ahora\",\n \"manualTitle\": \"Acepta tu invitación de distribuidor\",\n \"manualBody\": \"Introduce el token de invitación que te envió la tienda.\",\n \"inviteToken\": \"Token de invitación\",\n \"acceptInvite\": \"Aceptar invitación\",\n \"applicationTitle\": \"Solicitar ser distribuidor\",\n \"applicationBody\": \"Cuéntale a la tienda sobre tu negocio y envía la solicitud.\",\n \"applicationNote\": \"Nota de la solicitud\",\n \"noteRequired\": \"Añade una nota antes de enviar la solicitud.\",\n \"apply\": \"Enviar solicitud\",\n \"pendingTitle\": \"Tu solicitud está pendiente\",\n \"pendingBody\": \"La tienda revisará tu solicitud antes de activar el acceso mayorista.\",\n \"rejectedTitle\": \"Tu solicitud de distribuidor fue rechazada\",\n \"rejectedBody\": \"Contacta con la tienda si necesitas más información o quieres volver a solicitarlo.\",\n \"suspendedTitle\": \"Tu cuenta de distribuidor está suspendida\",\n \"suspendedBody\": \"Los pedidos mayoristas no están disponibles. Contacta con la tienda para obtener ayuda.\",\n \"activeTitle\": \"Cuenta mayorista\",\n \"tier\": \"Nivel\",\n \"walletTitle\": \"Saldo mayorista\",\n \"balance\": \"Saldo\",\n \"held\": \"Retenido\",\n \"catalogTitle\": \"Catálogo mayorista\",\n \"search\": \"Buscar productos\",\n \"catalogEmptyTitle\": \"No se encontraron productos mayoristas\",\n \"catalogEmptyBody\": \"Prueba otra búsqueda o vuelve cuando la tienda añada productos.\",\n \"volumePricing\": \"Precios por volumen disponibles\",\n \"supplierBacked\": \"Enviado por proveedor\",\n \"add\": \"Añadir\",\n \"basketTitle\": \"Cesta mayorista\",\n \"basketEmpty\": \"Añade un producto del catálogo mayorista para iniciar un pedido.\",\n \"quantity\": \"Cantidad\",\n \"basketNeedsQuote\": \"Calcula esta cesta para ver el total actual antes de realizar el pedido.\",\n \"quote\": \"Calcular cesta\",\n \"place\": \"Realizar pedido\",\n \"ordersTitle\": \"Pedidos mayoristas\",\n \"ordersEmptyTitle\": \"Aún no hay pedidos mayoristas\",\n \"ordersEmptyBody\": \"Aquí aparecen los pedidos pagados con tu saldo mayorista.\",\n \"refunded\": \"Reembolsado al saldo\",\n \"lineQuantity\": \"Cantidad {count}\",\n \"serials\": \"Números de serie entregados\",\n \"apiKeysTitle\": \"Claves de API de distribuidor\",\n \"apiKeyName\": \"Nombre de la clave\",\n \"createApiKey\": \"Crear clave\",\n \"apiKeysEmpty\": \"No has creado ninguna clave de API de distribuidor.\",\n \"orderElsewhere\": \"Los pedidos mayoristas se hacen por la API de distribuidor, no desde esta página.\",\n \"keysElsewhere\": \"Las claves API las emite la tienda. Pídesela a ellos.\",\n \"apiKeyCreatedTitle\": \"Copia esta clave ahora\",\n \"apiKeyCreatedBody\": \"Esta clave en texto plano se muestra una sola vez y no puede recuperarse después.\",\n \"dismissKey\": \"Ya la guardé\",\n \"lastUsed\": \"Último uso: {date}\",\n \"neverUsed\": \"Nunca usada\",\n \"revokeApiKey\": \"Revocar\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Kopioi\",\n \"copied\": \"Kopioitu\",\n \"retry\": \"Yritä uudelleen\",\n \"notLoaded\": \"Tämä ei latautunut\",\n \"genericError\": \"Tätä ei voitu ladata. Yritä hetken kuluttua uudelleen.\",\n \"browseStore\": \"Selaa kauppaa\",\n \"unavailable\": \"Ei saatavilla\",\n \"cancel\": \"Peruuta\"\n },\n \"account\": {\n \"title\": \"Oma tili\",\n \"sections\": \"Tilin osiot\",\n \"signOut\": \"Kirjaudu ulos\",\n \"signingOut\": \"Kirjaudutaan ulos…\",\n \"signOutFailed\": \"Uloskirjautuminen ei onnistunut. Yritä uudelleen.\",\n \"checkingSession\": \"Tarkistetaan istuntoasi\",\n \"sessionUnknown\": \"Istuntoasi ei voitu tarkistaa. Yritä hetken kuluttua uudelleen.\",\n \"goToOverview\": \"Siirry yleiskatsaukseen\",\n \"tabs\": {\n \"overview\": \"Yleiskatsaus\",\n \"orders\": \"Tilaukset\",\n \"downloads\": \"Lataukset\",\n \"subscriptions\": \"Kestotilaukset\",\n \"rewards\": \"Palkinnot\",\n \"referrals\": \"Suosittelut\",\n \"favorites\": \"Suosikit\",\n \"support\": \"Tuki\",\n \"settings\": \"Asetukset\",\n \"reseller\": \"Jälleenmyyjä\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} ei kuulu tähän kauppaan\",\n \"body\": \"Tämä kauppa ei tarjoa kyseistä osiota. Tilauksesi ja tilitietosi ovat edelleen täällä.\"\n },\n \"unknownTab\": {\n \"title\": \"Tämä linkki ei johda mihinkään\",\n \"body\": \"Osoite viittaa tilin osioon, jota ei ole. Se on voitu kirjoittaa väärin tai se on jäänyt vajaaksi.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Kirjaudu tilillesi\",\n \"titleCode\": \"Tarkista sähköpostisi\",\n \"introEmail\": \"Lähetämme sähköpostiisi kertakäyttöisen koodin. Salasanaa ei tarvitse muistaa.\",\n \"introCode\": \"Syötä koodi, jonka lähetimme osoitteeseen {email}.\",\n \"emailLabel\": \"Sähköposti\",\n \"codeLabel\": \"Kirjautumiskoodi\",\n \"invalidEmail\": \"Syötä koko sähköpostiosoite, esimerkiksi sina@esimerkki.fi.\",\n \"missingCode\": \"Syötä koodi sähköpostistasi.\",\n \"send\": \"Lähetä minulle koodi\",\n \"sending\": \"Lähetetään…\",\n \"submit\": \"Kirjaudu sisään\",\n \"submitting\": \"Tarkistetaan…\",\n \"resend\": \"Lähetä uusi koodi\",\n \"resent\": \"Uusi koodi on matkalla osoitteeseen {email}.\",\n \"changeEmail\": \"Käytä toista sähköpostia\",\n \"sendFailed\": \"Koodia ei voitu lähettää. Yritä hetken kuluttua uudelleen.\",\n \"verifyFailed\": \"Koodia ei hyväksytty. Yritä uudelleen.\"\n },\n \"status\": {\n \"COMPLETED\": \"Valmis\",\n \"PROCESSING\": \"Käsitellään\",\n \"AWAITING_STOCK\": \"Odottaa varastoa\",\n \"PENDING\": \"Odottaa\",\n \"PENDING_PAYMENT\": \"Odottaa maksua\",\n \"UNDERPAID\": \"Maksettu vajaana\",\n \"DISPUTED\": \"Riitautettu\",\n \"REFUNDED\": \"Hyvitetty\",\n \"PARTIAL_REFUND\": \"Osittain hyvitetty\",\n \"VOIDED\": \"Mitätöity\",\n \"EXPIRED\": \"Vanhentunut\",\n \"ACTIVE\": \"Voimassa\",\n \"INACTIVE\": \"Ei käytössä\",\n \"SUSPENDED\": \"Jäädytetty\",\n \"REVOKED\": \"Kumottu\",\n \"TRIALING\": \"Kokeilujakso\",\n \"PAUSED\": \"Tauolla\",\n \"PAST_DUE\": \"Erääntynyt\",\n \"UNPAID\": \"Maksamatta\",\n \"INCOMPLETE\": \"Kesken\",\n \"CANCELED\": \"Peruutettu\",\n \"CANCELLED\": \"Peruutettu\",\n \"OPEN\": \"Avoin\",\n \"CLOSED\": \"Suljettu\",\n \"RESOLVED\": \"Ratkaistu\",\n \"AWAITING_REPLY\": \"Odottaa vastaustasi\",\n \"APPROVED\": \"Hyväksytty\",\n \"REJECTED\": \"Hylätty\",\n \"REQUESTED\": \"Pyydetty\",\n \"CONVERTED\": \"Muunnettu\",\n \"PAID\": \"Maksettu\",\n \"FAILED\": \"Epäonnistui\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Toimitettu\",\n \"AWAITING_FULFILLMENT\": \"Odottaa toimitusta\",\n \"PENDING\": \"Odottaa\",\n \"FAILED\": \"Toimitus epäonnistui\"\n },\n \"overview\": {\n \"loading\": \"Ladataan tiliäsi\",\n \"signedInAs\": \"Kirjautuneena tunnuksella\",\n \"statOrders\": \"Tilaukset\",\n \"statLicenses\": \"Lisenssit\",\n \"statDownloads\": \"Lataukset\",\n \"statTickets\": \"Tukipyynnöt\",\n \"walletLabel\": \"Kaupan saldo\",\n \"walletNote\": \"Käytetään kassalla\",\n \"recentOrders\": \"Viimeisimmät tilaukset\",\n \"allOrders\": \"Kaikki tilaukset\"\n },\n \"orders\": {\n \"loading\": \"Ladataan tilauksiasi\",\n \"emptyTitle\": \"Ei vielä tilauksia\",\n \"emptyBody\": \"Ostoksesi tästä kaupasta näkyvät täällä heti ensimmäisen tilauksen jälkeen.\",\n \"movedTitle\": \"Tällä sivulla ei ole mitään\",\n \"movedBody\": \"Nämä tilaukset siirtyivät sillä aikaa kun katselit niitä.\",\n \"backToFirstPage\": \"Takaisin ensimmäiselle sivulle\",\n \"pagesLabel\": \"Tilaushistorian sivut\",\n \"previous\": \"Edellinen\",\n \"next\": \"Seuraava\",\n \"page\": \"Sivu {page}\",\n \"andMoreOne\": \"ja yksi tuote lisää\",\n \"andMoreOther\": \"ja {count} tuotetta lisää\",\n \"fallbackTitle\": \"Tilaus {id}\",\n \"allOrders\": \"Kaikki tilaukset\",\n \"loadingOne\": \"Ladataan tätä tilausta\",\n \"detailTitle\": \"Tilaus {id}\",\n \"subtotal\": \"Välisumma\",\n \"discount\": \"Alennus\",\n \"tax\": \"Vero\",\n \"total\": \"Yhteensä\",\n \"paidWith\": \"Maksutapa\",\n \"deliveryTitle\": \"Toimituksesi\",\n \"replacement\": \"Korvaava\",\n \"search\": \"Hae tilauksia\",\n \"searchPlaceholder\": \"Hae laskutunnuksella\",\n \"status\": \"Tila\",\n \"statusAll\": \"Kaikki tilat\",\n \"statusCompleted\": \"Valmis\",\n \"statusPending\": \"Odottaa\",\n \"statusProcessing\": \"Käsittelyssä\",\n \"statusRefunded\": \"Hyvitetty\",\n \"statusDisputed\": \"Riitautettu\",\n \"statusExpired\": \"Vanhentunut\",\n \"emptyFiltered\": \"Ei vastaavia tilauksia. Kokeile toista laskutunnusta tai tilaa.\",\n \"warrantyTitle\": \"Takuu\",\n \"warrantyCoveredUntil\": \"Voimassa {date} asti\",\n \"warrantyEnded\": \"Takuu päättyi {date}\",\n \"warrantyCancelled\": \"Takuu peruttu\",\n \"warrantyClaimSubmitted\": \"Vaatimus lähetetty\",\n \"warrantyClaimApproved\": \"Vaatimus hyväksytty\",\n \"warrantyClaimDeclined\": \"Vaatimus hylätty\",\n \"warrantyClaimStart\": \"Tee takuuvaatimus\",\n \"warrantyClaimLabel\": \"Mikä meni vikaan?\",\n \"warrantyClaimOptional\": \"Vapaaehtoinen\",\n \"warrantyClaimSend\": \"Lähetä vaatimus\",\n \"warrantyClaimSending\": \"Lähetetään…\",\n \"warrantyClaimDone\": \"Kauppa sai vaatimuksesi. He vastaavat sähköpostitse.\",\n \"warrantyClaimFailed\": \"Vaatimustasi ei voitu lähettää.\"\n },\n \"downloads\": {\n \"loading\": \"Ladataan latauksiasi\",\n \"emptyTitle\": \"Ei vielä ladattavaa\",\n \"emptyBody\": \"Tiedostot, avaimet ja käyttölinkit näkyvät täällä, kun tilaus on valmis.\",\n \"licensesTitle\": \"Lisenssiavaimet\",\n \"filesTitle\": \"Tiedostot\",\n \"codesTitle\": \"Koodit ja linkit\",\n \"download\": \"Lataa\",\n \"openLink\": \"Avaa linkki\",\n \"viewOrder\": \"Näytä tilaus\",\n \"expires\": \"Voimassa {date} asti\",\n \"neverExpires\": \"Ei päättymispäivää\",\n \"lockedTo\": \"Sidottu laitteeseen {hardwareId}\",\n \"resetHwid\": \"Nollaa laitetunnus\",\n \"resettingHwid\": \"Nollataan…\",\n \"hwidResetDone\": \"Laitetunnus tyhjennettiin. Seuraava aktivointi ottaa tämän lisenssin käyttöönsä.\",\n \"hwidResetFailed\": \"Laitetunnusta ei voitu nollata. Yritä uudelleen.\",\n \"renewTitle\": \"Uusittavissa\",\n \"renewBody\": \"Uusiminen on ostos, joten se tehdään kassalla eikä tällä sivulla.\",\n \"renewAction\": \"Avaa kauppa\",\n \"brokenTitle\": \"Latauksiasi ei voitu listata\",\n \"brokenBody\": \"Kauppa lähetti lisenssimerkinnän ({id}) ilman itse lisenssiä, joten listasta puuttuisi juuri se, minkä se nimeää.\",\n \"brokenFileBody\": \"Kauppa lähetti tiedostomerkinnän ({id}), jossa ei ole mitään ladattavaa, joten lista nimeäisi tiedoston, jota se ei voi antaa.\"\n },\n \"subscriptions\": {\n \"loading\": \"Ladataan kestotilauksiasi\",\n \"emptyTitle\": \"Ei vielä kestotilauksia\",\n \"emptyBody\": \"Toistuvat ostokset näkyvät täällä, kun aloitat ensimmäisen.\",\n \"allSubscriptions\": \"Kaikki kestotilaukset\",\n \"unnamedPlan\": \"Kestotilaus\",\n \"renews\": \"Uusiutuu {date}\",\n \"ends\": \"Päättyy {date}\",\n \"canceled\": \"Peruutettu {date}\",\n \"startedOn\": \"Alkoi {date}\",\n \"billingDayOne\": \"Laskutetaan päivittäin\",\n \"billingDayOther\": \"Laskutetaan {count} päivän välein\",\n \"billingWeekOne\": \"Laskutetaan viikoittain\",\n \"billingWeekOther\": \"Laskutetaan {count} viikon välein\",\n \"billingMonthOne\": \"Laskutetaan kuukausittain\",\n \"billingMonthOther\": \"Laskutetaan {count} kuukauden välein\",\n \"billingYearOne\": \"Laskutetaan vuosittain\",\n \"billingYearOther\": \"Laskutetaan {count} vuoden välein\",\n \"billingOther\": \"Laskutetaan {count} × {interval} välein\",\n \"gateway\": \"Maksupalvelu\",\n \"paymentMethod\": \"Maksutapa\",\n \"cardOnFile\": \"{brand}, päättyy numeroihin {last4}\",\n \"noPaymentMethod\": \"Ei tallennettuna\",\n \"paymentMethodElsewhere\": \"Linkki maksutietojen muuttamiseen tulee kaupan omista sähköposteista. Sitä ei anneta täällä, koska mikä tahansa tällä sivulla voisi napata sen.\",\n \"pause\": \"Keskeytä\",\n \"pausing\": \"Keskeytetään…\",\n \"resume\": \"Jatka\",\n \"resuming\": \"Jatketaan…\",\n \"cancel\": \"Peruuta kestotilaus\",\n \"cancelling\": \"Peruutetaan…\",\n \"keep\": \"Säilytä\",\n \"confirmCancelTitle\": \"Peruutetaanko tämä kestotilaus?\",\n \"confirmCancelAtPeriodEnd\": \"Käyttöoikeus jatkuu {date} asti. Sen jälkeen ei veloiteta mitään.\",\n \"confirmCancelNow\": \"Käyttöoikeus päättyy heti peruutuksen jälkeen.\",\n \"actionFailed\": \"Tämä ei mennyt läpi. Yritä uudelleen.\",\n \"paused\": \"Tämä kestotilaus on keskeytetty.\",\n \"resumed\": \"Tämä kestotilaus on taas käynnissä.\",\n \"cancelled\": \"Tämä kestotilaus on peruutettu.\",\n \"historyTitle\": \"Laskutushistoria\",\n \"historyLoading\": \"Ladataan laskutushistoriaa\",\n \"historyEmptyTitle\": \"Ei vielä laskutushistoriaa\",\n \"historyEmptyBody\": \"Uusintalaskut näkyvät täällä ensimmäisen jakson jälkeen.\",\n \"trial\": \"Kokeilu päättyy {date}\"\n },\n \"favorites\": {\n \"loading\": \"Ladataan suosikkejasi\",\n \"emptyTitle\": \"Ei vielä suosikkeja\",\n \"emptyBody\": \"Kauppaa selatessa tallentamasi tuotteet säilyvät täällä.\",\n \"added\": \"Tallennettu {date}\",\n \"gone\": \"Ei enää saatavilla\",\n \"view\": \"Näytä kaupassa\",\n \"remove\": \"Poista\",\n \"removing\": \"Poistetaan…\",\n \"removeFailed\": \"Tätä suosikkia ei voitu poistaa. Yritä uudelleen.\",\n \"noImage\": \"Ei kuvaa tuotteelle {title}\"\n },\n \"rewards\": {\n \"loading\": \"Ladataan palkintojasi\",\n \"available\": \"Käytettävissä\",\n \"pending\": \"Kesken\",\n \"lifetime\": \"Ansaittu yhteensä\",\n \"couponsTitle\": \"Kuponkisi\",\n \"couponsBody\": \"Liitä jokin näistä kassalla.\",\n \"percentOff\": \"{percent} % alennus\",\n \"couponGeneric\": \"Alennuskuponki\",\n \"expiresOn\": \"Voimassa {date} asti\",\n \"activityTitle\": \"Tapahtumat\",\n \"emptyTitle\": \"Ei vielä palkintoja\",\n \"emptyBody\": \"Tee tilaus tai jätä arvostelu, niin alat kerätä palkintoja.\",\n \"storeCredit\": \"{amount} kaupan saldoa\",\n \"storeCreditGeneric\": \"Kaupan saldo\",\n \"couponNamed\": \"Kuponki {code}\",\n \"couponUnnamed\": \"Kuponkikoodi\",\n \"otherReward\": \"Palkinto\",\n \"reasonOrderCompleted\": \"Tilaus valmistui\",\n \"reasonOrderCount\": \"Kanta-asiakasraja\",\n \"reasonSpendAmount\": \"Ostot yhteensä\",\n \"reasonReview\": \"Arvostelu jätetty\",\n \"reasonFirstPurchase\": \"Ensimmäinen ostos\",\n \"reasonOther\": \"Palkinto\",\n \"grantFulfilled\": \"Ansaittu\",\n \"grantPending\": \"Kesken\",\n \"grantFailed\": \"Epäonnistui\",\n \"grantRevoked\": \"Peruttu\",\n \"pointsTitle\": \"Pisteet\",\n \"pointsBalance\": \"Pistesaldo\",\n \"pointsLifetime\": \"Kerätty yhteensä\",\n \"pointsEarnHint\": \"Tee tilaus, niin alat kerätä pisteitä.\",\n \"pointsActivityTitle\": \"Pistetapahtumat\",\n \"pointsFromOrder\": \"Tilaus valmistui\",\n \"pointsFromReview\": \"Arvostelu jätetty\",\n \"pointsConverted\": \"Muunnettu kaupan saldoksi\",\n \"pointsAdjusted\": \"Kaupan tekemä korjaus\",\n \"redeemTitle\": \"Muunna pisteitä\",\n \"redeemBody\": \"Muunna pisteesi kaupan saldoksi ja käytä se kassalla.\",\n \"redeemLabel\": \"Muunnettavat pisteet\",\n \"redeemMinimum\": \"Muunna vähintään {points} pistettä.\",\n \"redeemOverBalance\": \"Sinulla on {points} pistettä käytettävissä.\",\n \"redeemInvalid\": \"Anna pisteet kokonaislukuna.\",\n \"redeemPreview\": \"Arvo on noin {amount} kaupan saldoa.\",\n \"redeemContinue\": \"Jatka\",\n \"redeemConfirm\": \"Muunnetaanko {points} pistettä noin {amount} kaupan saldoksi?\",\n \"redeemConfirmAction\": \"Kyllä, muunna\",\n \"redeemWorking\": \"Muunnetaan…\",\n \"redeemDone\": \"{amount} lisätty kaupan saldoosi.\",\n \"redeemFailed\": \"Pisteitäsi ei voitu muuntaa.\"\n },\n \"referrals\": {\n \"loading\": \"Ladataan suositteluitasi\",\n \"notEnrolledTitle\": \"Et ole mukana suositteluohjelmassa\",\n \"notEnrolledBody\": \"Kauppa ei ole liittänyt sinua mukaan, joten jaettavaa tai seurattavaa ei vielä ole.\",\n \"availableLabel\": \"Nostettavissa\",\n \"pendingLabel\": \"Odottaa\",\n \"requestedLabel\": \"Pyydetty\",\n \"payoutsElsewhere\": \"Nostot ja maksut hoitaa kauppa, ei tämä sivu.\",\n \"codesAccepted\": \"Koodisi käy kassalla.\",\n \"codesNotAccepted\": \"Tämä kauppa ei tällä hetkellä hyväksy suosittelukoodeja kassalla.\",\n \"linksTitle\": \"Linkkisi\",\n \"linksEmptyTitle\": \"Ei vielä suosittelulinkkejä\",\n \"linksEmptyBody\": \"Kauppa luo jakamasi linkit. Pyydä sellaista heiltä, jos odotit löytäväsi sen täältä.\",\n \"primary\": \"Ensisijainen\",\n \"commission\": \"{percent} % provisio\",\n \"buyerDiscount\": \"{percent} % alennus ostajalle\",\n \"awaitingApproval\": \"Odottaa, että kauppa hyväksyy tämän linkin.\",\n \"clicks\": \"Klikkaukset\",\n \"sales\": \"Myynnit\",\n \"revenue\": \"Myyntitulot\",\n \"commissionsTitle\": \"Provisiot\",\n \"commissionsEmptyTitle\": \"Ei vielä provisioita\",\n \"commissionsEmptyBody\": \"Hyväksytyt suosittelumyynnit näkyvät täällä.\",\n \"commissionFor\": \"Tilaus {id}\",\n \"balanceTitle\": \"Saldotapahtumat\",\n \"balanceEmptyTitle\": \"Ei vielä saldotapahtumia\",\n \"balanceEmptyBody\": \"Muunnot ja maksut näkyvät täällä.\",\n \"claimStoreCredit\": \"Kaupan saldo\",\n \"claimCryptoPayout\": \"Kryptomaksu\",\n \"claimAdjustment\": \"Oikaisu\",\n \"differentCurrency\": \"Suosittelusaldosi säilytetään valuutassa {currency}.\",\n \"convertedLabel\": \"Siirretty kaupan saldoon\",\n \"paidLabel\": \"Maksettu ulos\"\n },\n \"support\": {\n \"loading\": \"Ladataan tukipyyntöjäsi\",\n \"ticketsTitle\": \"Tukipyyntösi\",\n \"emptyTitle\": \"Ei vielä tukipyyntöjä\",\n \"emptyBody\": \"Kirjoita kaupalle täällä, ja kaikki vastaukset pysyvät tällä sivulla.\",\n \"newTicket\": \"Uusi tukipyyntö\",\n \"backToTickets\": \"Kaikki tukipyynnöt\",\n \"updated\": \"Päivitetty {date}\",\n \"aboutOrder\": \"Koskee tilausta {id}\",\n \"subjectLabel\": \"Aihe\",\n \"subjectOptional\": \"Vapaaehtoinen\",\n \"messageLabel\": \"Viesti\",\n \"replyLabel\": \"Vastauksesi\",\n \"create\": \"Lähetä kaupalle\",\n \"creating\": \"Lähetetään…\",\n \"createFailed\": \"Tukipyyntöäsi ei voitu luoda. Yritä uudelleen.\",\n \"reply\": \"Lähetä vastaus\",\n \"replying\": \"Lähetetään…\",\n \"replyFailed\": \"Vastaustasi ei voitu lähettää. Yritä uudelleen.\",\n \"tooShort\": \"Kirjoita edes lyhyt viesti.\",\n \"closedTitle\": \"Tämä tukipyyntö on suljettu\",\n \"closedBody\": \"Avaa uusi, jos tarvitset vielä apua.\",\n \"loadingThread\": \"Ladataan tätä keskustelua\",\n \"noMessages\": \"Tässä tukipyynnössä ei ole vielä viestejä.\",\n \"fromYou\": \"Sinä\",\n \"fromMerchant\": \"Kauppa\",\n \"fromSystem\": \"Järjestelmä\",\n \"untitled\": \"Tukipyyntö\"\n },\n \"settings\": {\n \"loading\": \"Ladataan asetuksiasi\",\n \"profileTitle\": \"Profiili\",\n \"emailLabel\": \"Sähköposti\",\n \"emailNote\": \"Sähköpostillasi kirjaudut sisään, joten sen vaihtaa kauppa eikä sitä tehdä täällä.\",\n \"nameLabel\": \"Nimi\",\n \"nameTooShort\": \"Kirjoita nimesi.\",\n \"saveProfile\": \"Tallenna muutokset\",\n \"savingProfile\": \"Tallennetaan…\",\n \"profileSaved\": \"Nimesi päivitettiin.\",\n \"profileFailed\": \"Nimeäsi ei voitu tallentaa. Yritä uudelleen.\",\n \"uploadAvatar\": \"Lataa kuva\",\n \"uploadingAvatar\": \"Ladataan…\",\n \"removeAvatar\": \"Poista kuva\",\n \"removingAvatar\": \"Poistetaan…\",\n \"avatarHint\": \"JPG, PNG, GIF tai WebP, enintään 10 Mt.\",\n \"avatarFailed\": \"Kuvaasi ei voitu ladata. Yritä uudelleen.\",\n \"avatarRemoveFailed\": \"Kuvaasi ei voitu poistaa. Yritä uudelleen.\",\n \"avatarTooLarge\": \"Tämä kuva on yli 10 Mt.\",\n \"emailsTitle\": \"Kaupan sähköpostit\",\n \"emailsLoading\": \"Ladataan sähköpostiasetuksiasi\",\n \"unsubscribeAll\": \"Ei lainkaan markkinointiviestejä\",\n \"unsubscribeAllNote\": \"Tilaus- ja toimitusviestit lähetetään joka tapauksessa.\",\n \"listsEmpty\": \"Tällä kaupalla ei ole postituslistoja.\",\n \"emailsFailed\": \"Sähköpostiasetuksiasi ei voitu ladata.\",\n \"emailsSaveFailed\": \"Tätä asetusta ei voitu tallentaa. Yritä uudelleen.\",\n \"devicesTitle\": \"Kirjautuneet laitteet\",\n \"devicesLoading\": \"Ladataan laitteitasi\",\n \"devicesEmpty\": \"Mikään muu laite ei ole kirjautuneena.\",\n \"thisDevice\": \"Tämä laite\",\n \"signedInOn\": \"Kirjauduttu {date}\",\n \"unknownDevice\": \"Tuntematon laite\",\n \"signOutDevice\": \"Kirjaudu ulos\",\n \"signingOutDevice\": \"Kirjaudutaan ulos…\",\n \"signOutOthers\": \"Kirjaa ulos kaikki muut laitteet\",\n \"signOutOthersDone\": \"Kaikki muut laitteet kirjattiin ulos.\",\n \"devicesFailed\": \"Laitteitasi ei voitu ladata.\",\n \"signOutDeviceFailed\": \"Tätä laitetta ei voitu kirjata ulos. Yritä uudelleen.\",\n \"deviceOn\": \"{browser} järjestelmässä {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Lisää kauppasaldoa\",\n \"minimum\": \"Vähintään {min}\",\n \"bounds\": \"{min}–{max}\",\n \"bonus\": \"Lisää vähintään {amount} ja saat {percent}% ylimääräistä\",\n \"amount\": \"Summa\",\n \"submit\": \"Jatka maksuun\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Jälleenmyyjäohjelma ei ole käytettävissä\",\n \"disabledBody\": \"Tämä kauppa ei ota juuri nyt vastaan tukkutilauksia.\",\n \"openTitle\": \"Liity jälleenmyyjäohjelmaan\",\n \"openBody\": \"Liity nyt ja osta kaupan tuotteita tukkuhinnoilla.\",\n \"join\": \"Liity nyt\",\n \"manualTitle\": \"Hyväksy jälleenmyyjäkutsu\",\n \"manualBody\": \"Anna kaupan lähettämä kutsutunnus.\",\n \"inviteToken\": \"Kutsutunnus\",\n \"acceptInvite\": \"Hyväksy kutsu\",\n \"applicationTitle\": \"Hae jälleenmyyjäksi\",\n \"applicationBody\": \"Kerro kaupalle yrityksestäsi ja lähetä hakemus.\",\n \"applicationNote\": \"Hakemuksen lisätiedot\",\n \"noteRequired\": \"Lisää viesti ennen hakemuksen lähettämistä.\",\n \"apply\": \"Lähetä hakemus\",\n \"pendingTitle\": \"Hakemuksesi odottaa käsittelyä\",\n \"pendingBody\": \"Kauppa tarkistaa hakemuksesi ennen tukkuoikeuksien avaamista.\",\n \"rejectedTitle\": \"Jälleenmyyjähaun hylättiin\",\n \"rejectedBody\": \"Ota yhteyttä kauppaan saadaksesi lisätietoja tai hakeaksesi uudelleen.\",\n \"suspendedTitle\": \"Jälleenmyyjätilisi on jäädytetty\",\n \"suspendedBody\": \"Tukkutilaukset eivät ole käytettävissä. Ota yhteyttä kauppaan.\",\n \"activeTitle\": \"Tukkutili\",\n \"tier\": \"Taso\",\n \"walletTitle\": \"Tukkusaldo\",\n \"balance\": \"Saldo\",\n \"held\": \"Varattu\",\n \"catalogTitle\": \"Tukkukuvasto\",\n \"search\": \"Hae tuotteita\",\n \"catalogEmptyTitle\": \"Tukkutuotteita ei löytynyt\",\n \"catalogEmptyBody\": \"Kokeile toista hakua tai palaa, kun kauppa on lisännyt tuotteita.\",\n \"volumePricing\": \"Määrähinnat saatavilla\",\n \"supplierBacked\": \"Toimittajan toimittama\",\n \"add\": \"Lisää\",\n \"basketTitle\": \"Tukkukori\",\n \"basketEmpty\": \"Aloita tilaus lisäämällä tuote tukkukuvastosta.\",\n \"quantity\": \"Määrä\",\n \"basketNeedsQuote\": \"Hinnoittele kori nähdäksesi nykyisen loppusumman ennen tilausta.\",\n \"quote\": \"Hinnoittele kori\",\n \"place\": \"Tee tilaus\",\n \"ordersTitle\": \"Tukkutilaukset\",\n \"ordersEmptyTitle\": \"Ei vielä tukkutilauksia\",\n \"ordersEmptyBody\": \"Tukkusaldolla maksetut tilaukset näkyvät täällä.\",\n \"refunded\": \"Palautettu saldoon\",\n \"lineQuantity\": \"Määrä {count}\",\n \"serials\": \"Toimitetut sarjanumerot\",\n \"apiKeysTitle\": \"Jälleenmyyjän API-avaimet\",\n \"apiKeyName\": \"Avaimen nimi\",\n \"createApiKey\": \"Luo avain\",\n \"apiKeysEmpty\": \"Et ole luonut jälleenmyyjän API-avaimia.\",\n \"orderElsewhere\": \"Tukkutilaukset tehdään jälleenmyyjän API:n kautta, ei tältä sivulta.\",\n \"keysElsewhere\": \"API-avaimet myöntää kauppa. Pyydä avainta sieltä.\",\n \"apiKeyCreatedTitle\": \"Kopioi tämä avain nyt\",\n \"apiKeyCreatedBody\": \"Tämä selväkielinen avain näytetään kerran eikä sitä voi palauttaa myöhemmin.\",\n \"dismissKey\": \"Tallensin sen\",\n \"lastUsed\": \"Käytetty viimeksi {date}\",\n \"neverUsed\": \"Ei koskaan käytetty\",\n \"revokeApiKey\": \"Kumoa\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Copier\",\n \"copied\": \"Copié\",\n \"retry\": \"Réessayer\",\n \"notLoaded\": \"Le chargement a échoué\",\n \"genericError\": \"Le chargement a échoué. Réessayez dans un instant.\",\n \"browseStore\": \"Parcourir la boutique\",\n \"unavailable\": \"Indisponible\",\n \"cancel\": \"Annuler\"\n },\n \"account\": {\n \"title\": \"Votre compte\",\n \"sections\": \"Rubriques du compte\",\n \"signOut\": \"Se déconnecter\",\n \"signingOut\": \"Déconnexion…\",\n \"signOutFailed\": \"La déconnexion a échoué. Réessayez.\",\n \"checkingSession\": \"Vérification de votre session\",\n \"sessionUnknown\": \"Votre session n'a pas pu être vérifiée. Réessayez dans un instant.\",\n \"goToOverview\": \"Aller à l'aperçu\",\n \"tabs\": {\n \"overview\": \"Aperçu\",\n \"orders\": \"Commandes\",\n \"downloads\": \"Téléchargements\",\n \"subscriptions\": \"Abonnements\",\n \"rewards\": \"Récompenses\",\n \"referrals\": \"Parrainage\",\n \"favorites\": \"Favoris\",\n \"support\": \"Aide\",\n \"settings\": \"Paramètres\",\n \"reseller\": \"Revendeur\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} ne fait pas partie de cette boutique\",\n \"body\": \"Cette boutique ne propose pas cette rubrique. Vos commandes et les informations de votre compte restent accessibles ici.\"\n },\n \"unknownTab\": {\n \"title\": \"Ce lien ne mène nulle part\",\n \"body\": \"L'adresse désigne une rubrique du compte qui n'existe pas. Elle a peut-être été mal saisie ou tronquée.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Connectez-vous à votre compte\",\n \"titleCode\": \"Consultez votre boîte mail\",\n \"introEmail\": \"Nous envoyons un code à usage unique à votre adresse e-mail. Aucun mot de passe à retenir.\",\n \"introCode\": \"Saisissez le code envoyé à {email}.\",\n \"emailLabel\": \"E-mail\",\n \"codeLabel\": \"Code de connexion\",\n \"invalidEmail\": \"Saisissez une adresse e-mail complète, comme vous@exemple.fr.\",\n \"missingCode\": \"Saisissez le code reçu par e-mail.\",\n \"send\": \"Envoyez-moi un code\",\n \"sending\": \"Envoi…\",\n \"submit\": \"Se connecter\",\n \"submitting\": \"Vérification…\",\n \"resend\": \"Envoyer un nouveau code\",\n \"resent\": \"Un nouveau code est en route vers {email}.\",\n \"changeEmail\": \"Utiliser une autre adresse\",\n \"sendFailed\": \"L'envoi du code a échoué. Réessayez dans un instant.\",\n \"verifyFailed\": \"Ce code n'a pas été accepté. Réessayez.\"\n },\n \"status\": {\n \"COMPLETED\": \"Terminé\",\n \"PROCESSING\": \"En cours de traitement\",\n \"AWAITING_STOCK\": \"En attente de stock\",\n \"PENDING\": \"En attente\",\n \"PENDING_PAYMENT\": \"Paiement en attente\",\n \"UNDERPAID\": \"Paiement insuffisant\",\n \"DISPUTED\": \"Contesté\",\n \"REFUNDED\": \"Remboursé\",\n \"PARTIAL_REFUND\": \"Remboursé en partie\",\n \"VOIDED\": \"Invalidé\",\n \"EXPIRED\": \"Expiré\",\n \"ACTIVE\": \"Actif\",\n \"INACTIVE\": \"Inactif\",\n \"SUSPENDED\": \"Suspendu\",\n \"REVOKED\": \"Retiré\",\n \"TRIALING\": \"Essai\",\n \"PAUSED\": \"En pause\",\n \"PAST_DUE\": \"En retard de paiement\",\n \"UNPAID\": \"Impayé\",\n \"INCOMPLETE\": \"Incomplet\",\n \"CANCELED\": \"Annulé\",\n \"CANCELLED\": \"Annulé\",\n \"OPEN\": \"Ouvert\",\n \"CLOSED\": \"Fermé\",\n \"RESOLVED\": \"Résolu\",\n \"AWAITING_REPLY\": \"En attente de votre réponse\",\n \"APPROVED\": \"Approuvé\",\n \"REJECTED\": \"Refusé\",\n \"REQUESTED\": \"Demandé\",\n \"CONVERTED\": \"Converti\",\n \"PAID\": \"Payé\",\n \"FAILED\": \"Échoué\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Livré\",\n \"AWAITING_FULFILLMENT\": \"En attente de livraison\",\n \"PENDING\": \"En attente\",\n \"FAILED\": \"Échec de la livraison\"\n },\n \"overview\": {\n \"loading\": \"Chargement de votre compte\",\n \"signedInAs\": \"Connecté en tant que\",\n \"statOrders\": \"Commandes\",\n \"statLicenses\": \"Licences\",\n \"statDownloads\": \"Téléchargements\",\n \"statTickets\": \"Demandes d'assistance\",\n \"walletLabel\": \"Avoir en boutique\",\n \"walletNote\": \"Déduit au moment du paiement\",\n \"recentOrders\": \"Commandes récentes\",\n \"allOrders\": \"Toutes les commandes\"\n },\n \"orders\": {\n \"loading\": \"Chargement de vos commandes\",\n \"emptyTitle\": \"Aucune commande pour l'instant\",\n \"emptyBody\": \"Vos achats dans cette boutique apparaissent ici dès votre première commande.\",\n \"movedTitle\": \"Rien sur cette page\",\n \"movedBody\": \"Ces commandes ont changé de page pendant que vous les consultiez.\",\n \"backToFirstPage\": \"Revenir à la première page\",\n \"pagesLabel\": \"Pages de l'historique des commandes\",\n \"previous\": \"Précédent\",\n \"next\": \"Suivant\",\n \"page\": \"Page {page}\",\n \"andMoreOne\": \"et un article de plus\",\n \"andMoreOther\": \"et {count} articles de plus\",\n \"fallbackTitle\": \"Commande {id}\",\n \"allOrders\": \"Toutes les commandes\",\n \"loadingOne\": \"Chargement de cette commande\",\n \"detailTitle\": \"Commande {id}\",\n \"subtotal\": \"Sous-total\",\n \"discount\": \"Remise\",\n \"tax\": \"Taxes\",\n \"total\": \"Total\",\n \"paidWith\": \"Payé avec\",\n \"deliveryTitle\": \"Votre livraison\",\n \"replacement\": \"Remplacement\",\n \"search\": \"Rechercher des commandes\",\n \"searchPlaceholder\": \"Rechercher par numéro de facture\",\n \"status\": \"Statut\",\n \"statusAll\": \"Tous les statuts\",\n \"statusCompleted\": \"Terminée\",\n \"statusPending\": \"En attente\",\n \"statusProcessing\": \"En cours\",\n \"statusRefunded\": \"Remboursée\",\n \"statusDisputed\": \"Contestée\",\n \"statusExpired\": \"Expirée\",\n \"emptyFiltered\": \"Aucune commande correspondante. Essayez un autre numéro de facture ou un autre statut.\",\n \"warrantyTitle\": \"Garantie\",\n \"warrantyCoveredUntil\": \"Couvert jusqu'au {date}\",\n \"warrantyEnded\": \"La couverture a pris fin le {date}\",\n \"warrantyCancelled\": \"Couverture annulée\",\n \"warrantyClaimSubmitted\": \"Demande envoyée\",\n \"warrantyClaimApproved\": \"Demande acceptée\",\n \"warrantyClaimDeclined\": \"Demande refusée\",\n \"warrantyClaimStart\": \"Faire une demande\",\n \"warrantyClaimLabel\": \"Que s'est-il passé ?\",\n \"warrantyClaimOptional\": \"Facultatif\",\n \"warrantyClaimSend\": \"Envoyer la demande\",\n \"warrantyClaimSending\": \"Envoi en cours…\",\n \"warrantyClaimDone\": \"La boutique a bien reçu votre demande. Elle répond par e-mail.\",\n \"warrantyClaimFailed\": \"Votre demande n'a pas pu être envoyée.\"\n },\n \"downloads\": {\n \"loading\": \"Chargement de vos téléchargements\",\n \"emptyTitle\": \"Rien à télécharger pour l'instant\",\n \"emptyBody\": \"Les fichiers, les clés et les liens d'accès apparaissent ici dès qu'une commande est terminée.\",\n \"licensesTitle\": \"Clés de licence\",\n \"filesTitle\": \"Fichiers\",\n \"codesTitle\": \"Codes et liens\",\n \"download\": \"Télécharger\",\n \"openLink\": \"Ouvrir le lien\",\n \"viewOrder\": \"Voir la commande\",\n \"expires\": \"Expire le {date}\",\n \"neverExpires\": \"Sans date de fin\",\n \"lockedTo\": \"Liée à {hardwareId}\",\n \"resetHwid\": \"Réinitialiser l'ID matériel\",\n \"resettingHwid\": \"Réinitialisation…\",\n \"hwidResetDone\": \"L'ID matériel a été effacé. Votre prochaine activation reprend cette licence.\",\n \"hwidResetFailed\": \"L'ID matériel n'a pas pu être réinitialisé. Réessayez.\",\n \"renewTitle\": \"Renouvelable\",\n \"renewBody\": \"Un renouvellement est un achat : il passe par le paiement et non par cette page.\",\n \"renewAction\": \"Ouvrir la boutique\",\n \"brokenTitle\": \"Vos téléchargements n'ont pas pu être listés\",\n \"brokenBody\": \"La boutique a envoyé une entrée de licence ({id}) sans la licence correspondante : cette liste annoncerait donc quelque chose qui lui manque.\",\n \"brokenFileBody\": \"La boutique a envoyé une entrée de fichier ({id}) sans rien à télécharger : cette liste annoncerait donc un fichier qu'elle ne peut pas remettre.\"\n },\n \"subscriptions\": {\n \"loading\": \"Chargement de vos abonnements\",\n \"emptyTitle\": \"Aucun abonnement pour l'instant\",\n \"emptyBody\": \"Les achats récurrents apparaissent ici dès que vous en démarrez un.\",\n \"allSubscriptions\": \"Tous les abonnements\",\n \"unnamedPlan\": \"Abonnement\",\n \"renews\": \"Renouvellement le {date}\",\n \"ends\": \"Se termine le {date}\",\n \"canceled\": \"Résilié le {date}\",\n \"startedOn\": \"Démarré le {date}\",\n \"billingDayOne\": \"Facturé chaque jour\",\n \"billingDayOther\": \"Facturé tous les {count} jours\",\n \"billingWeekOne\": \"Facturé chaque semaine\",\n \"billingWeekOther\": \"Facturé toutes les {count} semaines\",\n \"billingMonthOne\": \"Facturé chaque mois\",\n \"billingMonthOther\": \"Facturé tous les {count} mois\",\n \"billingYearOne\": \"Facturé chaque année\",\n \"billingYearOther\": \"Facturé tous les {count} ans\",\n \"billingOther\": \"Facturé tous les {count} × {interval}\",\n \"gateway\": \"Prestataire de paiement\",\n \"paymentMethod\": \"Moyen de paiement\",\n \"cardOnFile\": \"{brand} finissant par {last4}\",\n \"noPaymentMethod\": \"Aucun enregistré\",\n \"paymentMethodElsewhere\": \"Le lien pour modifier vos informations de paiement se trouve dans les e-mails de la boutique. Il n'est pas donné ici, car n'importe quel élément de cette page pourrait le récupérer.\",\n \"pause\": \"Mettre en pause\",\n \"pausing\": \"Mise en pause…\",\n \"resume\": \"Reprendre\",\n \"resuming\": \"Reprise…\",\n \"cancel\": \"Résilier l'abonnement\",\n \"cancelling\": \"Résiliation…\",\n \"keep\": \"Le garder\",\n \"confirmCancelTitle\": \"Résilier cet abonnement ?\",\n \"confirmCancelAtPeriodEnd\": \"Vous gardez l'accès jusqu'au {date}. Plus rien n'est facturé ensuite.\",\n \"confirmCancelNow\": \"L'accès prend fin dès la résiliation.\",\n \"actionFailed\": \"L'opération n'a pas abouti. Réessayez.\",\n \"paused\": \"Cet abonnement est en pause.\",\n \"resumed\": \"Cet abonnement a repris.\",\n \"cancelled\": \"Cet abonnement est résilié.\",\n \"historyTitle\": \"Historique de facturation\",\n \"historyLoading\": \"Chargement de l'historique de facturation\",\n \"historyEmptyTitle\": \"Aucun historique de facturation\",\n \"historyEmptyBody\": \"Les factures de renouvellement apparaissent ici après le premier cycle.\",\n \"trial\": \"L'essai se termine le {date}\"\n },\n \"favorites\": {\n \"loading\": \"Chargement de vos favoris\",\n \"emptyTitle\": \"Aucun favori pour l'instant\",\n \"emptyBody\": \"Les produits que vous enregistrez en parcourant la boutique restent ici.\",\n \"added\": \"Enregistré le {date}\",\n \"gone\": \"Plus disponible\",\n \"view\": \"Voir dans la boutique\",\n \"remove\": \"Retirer\",\n \"removing\": \"Retrait…\",\n \"removeFailed\": \"Ce favori n'a pas pu être retiré. Réessayez.\",\n \"noImage\": \"Aucune image pour {title}\"\n },\n \"rewards\": {\n \"loading\": \"Chargement de vos récompenses\",\n \"available\": \"Disponible\",\n \"pending\": \"En cours\",\n \"lifetime\": \"Gagné au total\",\n \"couponsTitle\": \"Vos bons de réduction\",\n \"couponsBody\": \"Collez l'un d'eux au moment du paiement.\",\n \"percentOff\": \"{percent}% de remise\",\n \"couponGeneric\": \"Bon de réduction\",\n \"expiresOn\": \"Expire le {date}\",\n \"activityTitle\": \"Activité\",\n \"emptyTitle\": \"Aucune récompense pour l'instant\",\n \"emptyBody\": \"Terminez une commande ou laissez un avis pour commencer à en gagner.\",\n \"storeCredit\": \"{amount} d'avoir en boutique\",\n \"storeCreditGeneric\": \"Avoir en boutique\",\n \"couponNamed\": \"Bon {code}\",\n \"couponUnnamed\": \"Code de réduction\",\n \"otherReward\": \"Récompense\",\n \"reasonOrderCompleted\": \"Commande terminée\",\n \"reasonOrderCount\": \"Palier de fidélité\",\n \"reasonSpendAmount\": \"Total dépensé\",\n \"reasonReview\": \"Avis laissé\",\n \"reasonFirstPurchase\": \"Premier achat\",\n \"reasonOther\": \"Récompense\",\n \"grantFulfilled\": \"Gagnée\",\n \"grantPending\": \"En cours\",\n \"grantFailed\": \"Échouée\",\n \"grantRevoked\": \"Retirée\",\n \"pointsTitle\": \"Vos points\",\n \"pointsBalance\": \"Solde de points\",\n \"pointsLifetime\": \"Cumulés au total\",\n \"pointsEarnHint\": \"Passez une commande pour commencer à cumuler des points.\",\n \"pointsActivityTitle\": \"Mouvements de points\",\n \"pointsFromOrder\": \"Commande terminée\",\n \"pointsFromReview\": \"Avis laissé\",\n \"pointsConverted\": \"Converti en avoir en boutique\",\n \"pointsAdjusted\": \"Ajusté par la boutique\",\n \"redeemTitle\": \"Convertir des points\",\n \"redeemBody\": \"Convertissez vos points en avoir et dépensez-le au moment du paiement.\",\n \"redeemLabel\": \"Points à convertir\",\n \"redeemMinimum\": \"Convertissez au moins {points} points.\",\n \"redeemOverBalance\": \"Vous disposez de {points} points.\",\n \"redeemInvalid\": \"Saisissez un nombre entier de points.\",\n \"redeemPreview\": \"Vaut environ {amount} d'avoir en boutique.\",\n \"redeemContinue\": \"Continuer\",\n \"redeemConfirm\": \"Convertir {points} points en environ {amount} d'avoir en boutique ?\",\n \"redeemConfirmAction\": \"Oui, convertir\",\n \"redeemWorking\": \"Conversion en cours…\",\n \"redeemDone\": \"{amount} ajoutés à votre avoir en boutique.\",\n \"redeemFailed\": \"Vos points n'ont pas pu être convertis.\"\n },\n \"referrals\": {\n \"loading\": \"Chargement de vos parrainages\",\n \"notEnrolledTitle\": \"Vous ne participez pas au programme de parrainage\",\n \"notEnrolledBody\": \"Cette boutique ne vous y a pas inscrit : il n'y a donc rien à partager ni à suivre.\",\n \"availableLabel\": \"Disponible au retrait\",\n \"pendingLabel\": \"En attente\",\n \"requestedLabel\": \"Demandé\",\n \"payoutsElsewhere\": \"Les retraits et les versements sont gérés par la boutique, pas depuis cette page.\",\n \"codesAccepted\": \"Votre code est accepté au moment du paiement.\",\n \"codesNotAccepted\": \"Cette boutique n'accepte pas de code de parrainage au paiement pour le moment.\",\n \"linksTitle\": \"Vos liens\",\n \"linksEmptyTitle\": \"Aucun lien de parrainage\",\n \"linksEmptyBody\": \"C'est la boutique qui crée les liens que vous partagez. Demandez-lui-en un si vous en attendiez un ici.\",\n \"primary\": \"Principal\",\n \"commission\": \"{percent}% de commission\",\n \"buyerDiscount\": \"{percent}% de remise pour l'acheteur\",\n \"awaitingApproval\": \"En attente de validation par la boutique.\",\n \"clicks\": \"Clics\",\n \"sales\": \"Ventes\",\n \"revenue\": \"Chiffre d'affaires\",\n \"commissionsTitle\": \"Commissions\",\n \"commissionsEmptyTitle\": \"Aucune commission pour l'instant\",\n \"commissionsEmptyBody\": \"Les ventes parrainées validées apparaissent ici.\",\n \"commissionFor\": \"Commande {id}\",\n \"balanceTitle\": \"Mouvements du solde\",\n \"balanceEmptyTitle\": \"Aucun mouvement de solde\",\n \"balanceEmptyBody\": \"Les conversions et les versements apparaissent ici.\",\n \"claimStoreCredit\": \"Avoir en boutique\",\n \"claimCryptoPayout\": \"Versement en crypto\",\n \"claimAdjustment\": \"Ajustement\",\n \"differentCurrency\": \"Votre solde de parrainage est tenu en {currency}.\",\n \"convertedLabel\": \"Converti en avoir\",\n \"paidLabel\": \"Versé\"\n },\n \"support\": {\n \"loading\": \"Chargement de vos demandes\",\n \"ticketsTitle\": \"Vos demandes\",\n \"emptyTitle\": \"Aucune demande pour l'instant\",\n \"emptyBody\": \"Écrivez à la boutique ici : toutes les réponses restent sur cette page.\",\n \"newTicket\": \"Nouvelle demande\",\n \"backToTickets\": \"Toutes les demandes\",\n \"updated\": \"Mise à jour le {date}\",\n \"aboutOrder\": \"À propos de la commande {id}\",\n \"subjectLabel\": \"Objet\",\n \"subjectOptional\": \"Facultatif\",\n \"messageLabel\": \"Message\",\n \"replyLabel\": \"Votre réponse\",\n \"create\": \"Envoyer à la boutique\",\n \"creating\": \"Envoi…\",\n \"createFailed\": \"Votre demande n'a pas pu être créée. Réessayez.\",\n \"reply\": \"Envoyer la réponse\",\n \"replying\": \"Envoi…\",\n \"replyFailed\": \"Votre réponse n'a pas pu être envoyée. Réessayez.\",\n \"tooShort\": \"Écrivez au moins un court message.\",\n \"closedTitle\": \"Cette demande est fermée\",\n \"closedBody\": \"Ouvrez-en une nouvelle si vous avez encore besoin d'aide.\",\n \"loadingThread\": \"Chargement de cette conversation\",\n \"noMessages\": \"Cette demande ne contient encore aucun message.\",\n \"fromYou\": \"Vous\",\n \"fromMerchant\": \"Boutique\",\n \"fromSystem\": \"Système\",\n \"untitled\": \"Demande d'assistance\"\n },\n \"settings\": {\n \"loading\": \"Chargement de vos paramètres\",\n \"profileTitle\": \"Profil\",\n \"emailLabel\": \"E-mail\",\n \"emailNote\": \"Votre adresse e-mail sert à vous connecter : elle est modifiée par la boutique et non ici.\",\n \"nameLabel\": \"Nom\",\n \"nameTooShort\": \"Saisissez votre nom.\",\n \"saveProfile\": \"Enregistrer les modifications\",\n \"savingProfile\": \"Enregistrement…\",\n \"profileSaved\": \"Votre nom a été mis à jour.\",\n \"profileFailed\": \"Votre nom n'a pas pu être enregistré. Réessayez.\",\n \"uploadAvatar\": \"Envoyer une photo\",\n \"uploadingAvatar\": \"Envoi…\",\n \"removeAvatar\": \"Retirer la photo\",\n \"removingAvatar\": \"Retrait…\",\n \"avatarHint\": \"JPG, PNG, GIF ou WebP, jusqu'à 10 Mo.\",\n \"avatarFailed\": \"Votre photo n'a pas pu être envoyée. Réessayez.\",\n \"avatarRemoveFailed\": \"Votre photo n'a pas pu être retirée. Réessayez.\",\n \"avatarTooLarge\": \"Cette image dépasse 10 Mo.\",\n \"emailsTitle\": \"E-mails de la boutique\",\n \"emailsLoading\": \"Chargement de vos préférences e-mail\",\n \"unsubscribeAll\": \"Aucun e-mail marketing\",\n \"unsubscribeAllNote\": \"Les e-mails de commande et de livraison sont envoyés dans tous les cas.\",\n \"listsEmpty\": \"Cette boutique n'a aucune liste de diffusion.\",\n \"emailsFailed\": \"Vos préférences e-mail n'ont pas pu être chargées.\",\n \"emailsSaveFailed\": \"Ce réglage n'a pas pu être enregistré. Réessayez.\",\n \"devicesTitle\": \"Appareils connectés\",\n \"devicesLoading\": \"Chargement de vos appareils\",\n \"devicesEmpty\": \"Aucun autre appareil n'est connecté.\",\n \"thisDevice\": \"Cet appareil\",\n \"signedInOn\": \"Connecté le {date}\",\n \"unknownDevice\": \"Appareil inconnu\",\n \"signOutDevice\": \"Déconnecter\",\n \"signingOutDevice\": \"Déconnexion…\",\n \"signOutOthers\": \"Déconnecter tous les autres appareils\",\n \"signOutOthersDone\": \"Tous les autres appareils ont été déconnectés.\",\n \"devicesFailed\": \"Vos appareils n'ont pas pu être chargés.\",\n \"signOutDeviceFailed\": \"Cet appareil n'a pas pu être déconnecté. Réessayez.\",\n \"deviceOn\": \"{browser} sur {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Ajouter du crédit\",\n \"minimum\": \"Minimum {min}\",\n \"bounds\": \"De {min} à {max}\",\n \"bonus\": \"Ajoutez au moins {amount} et recevez {percent}% en plus\",\n \"amount\": \"Montant\",\n \"submit\": \"Continuer vers le paiement\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Le programme revendeur est indisponible\",\n \"disabledBody\": \"Cette boutique n'accepte pas de commandes en gros pour le moment.\",\n \"openTitle\": \"Rejoindre le programme revendeur\",\n \"openBody\": \"Rejoignez-le pour acheter les produits de cette boutique au tarif de gros.\",\n \"join\": \"Rejoindre maintenant\",\n \"manualTitle\": \"Accepter votre invitation revendeur\",\n \"manualBody\": \"Saisissez le jeton d'invitation envoyé par la boutique.\",\n \"inviteToken\": \"Jeton d'invitation\",\n \"acceptInvite\": \"Accepter l'invitation\",\n \"applicationTitle\": \"Devenir revendeur\",\n \"applicationBody\": \"Présentez votre entreprise à la boutique et envoyez votre demande.\",\n \"applicationNote\": \"Note de candidature\",\n \"noteRequired\": \"Ajoutez une note avant d'envoyer votre demande.\",\n \"apply\": \"Envoyer la demande\",\n \"pendingTitle\": \"Votre demande est en attente\",\n \"pendingBody\": \"La boutique examinera votre demande avant d'activer l'accès grossiste.\",\n \"rejectedTitle\": \"Votre demande de revendeur a été refusée\",\n \"rejectedBody\": \"Contactez la boutique pour en savoir plus ou présenter une nouvelle demande.\",\n \"suspendedTitle\": \"Votre compte revendeur est suspendu\",\n \"suspendedBody\": \"Les commandes en gros sont indisponibles. Contactez la boutique pour obtenir de l'aide.\",\n \"activeTitle\": \"Compte grossiste\",\n \"tier\": \"Niveau\",\n \"walletTitle\": \"Solde grossiste\",\n \"balance\": \"Solde\",\n \"held\": \"En attente\",\n \"catalogTitle\": \"Catalogue grossiste\",\n \"search\": \"Rechercher des produits\",\n \"catalogEmptyTitle\": \"Aucun produit grossiste trouvé\",\n \"catalogEmptyBody\": \"Essayez une autre recherche ou revenez après l'ajout de produits par la boutique.\",\n \"volumePricing\": \"Tarifs dégressifs disponibles\",\n \"supplierBacked\": \"Expédié par le fournisseur\",\n \"add\": \"Ajouter\",\n \"basketTitle\": \"Panier grossiste\",\n \"basketEmpty\": \"Ajoutez un produit du catalogue grossiste pour commencer une commande.\",\n \"quantity\": \"Quantité\",\n \"basketNeedsQuote\": \"Faites chiffrer ce panier pour voir le total actuel avant de commander.\",\n \"quote\": \"Chiffrer le panier\",\n \"place\": \"Passer la commande\",\n \"ordersTitle\": \"Commandes grossistes\",\n \"ordersEmptyTitle\": \"Aucune commande grossiste\",\n \"ordersEmptyBody\": \"Les commandes payées avec votre solde grossiste apparaissent ici.\",\n \"refunded\": \"Remboursé sur le solde\",\n \"lineQuantity\": \"Quantité {count}\",\n \"serials\": \"Numéros de série livrés\",\n \"apiKeysTitle\": \"Clés API revendeur\",\n \"apiKeyName\": \"Nom de la clé\",\n \"createApiKey\": \"Créer une clé\",\n \"apiKeysEmpty\": \"Vous n'avez créé aucune clé API revendeur.\",\n \"orderElsewhere\": \"Les commandes en gros passent par l’API revendeur, pas par cette page.\",\n \"keysElsewhere\": \"Les clés API sont délivrées par la boutique. Demandez-lui la vôtre.\",\n \"apiKeyCreatedTitle\": \"Copiez cette clé maintenant\",\n \"apiKeyCreatedBody\": \"Cette clé en clair n'est affichée qu'une fois et ne peut pas être récupérée ensuite.\",\n \"dismissKey\": \"Je l'ai enregistrée\",\n \"lastUsed\": \"Dernière utilisation : {date}\",\n \"neverUsed\": \"Jamais utilisée\",\n \"revokeApiKey\": \"Révoquer\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"कॉपी करें\",\n \"copied\": \"कॉपी हो गया\",\n \"retry\": \"फिर कोशिश करें\",\n \"notLoaded\": \"यह लोड नहीं हुआ\",\n \"genericError\": \"यह लोड नहीं हो सका। कृपया थोड़ी देर बाद फिर कोशिश करें।\",\n \"browseStore\": \"स्टोर देखें\",\n \"unavailable\": \"उपलब्ध नहीं\",\n \"cancel\": \"रद्द करें\"\n },\n \"account\": {\n \"title\": \"आपका खाता\",\n \"sections\": \"खाता अनुभाग\",\n \"signOut\": \"साइन आउट\",\n \"signingOut\": \"साइन आउट हो रहा है…\",\n \"signOutFailed\": \"आपको साइन आउट नहीं किया जा सका। कृपया फिर कोशिश करें।\",\n \"checkingSession\": \"आपका सत्र जाँचा जा रहा है\",\n \"sessionUnknown\": \"आपका सत्र जाँचा नहीं जा सका। कृपया थोड़ी देर बाद फिर कोशिश करें।\",\n \"goToOverview\": \"अवलोकन पर जाएँ\",\n \"tabs\": {\n \"overview\": \"अवलोकन\",\n \"orders\": \"ऑर्डर\",\n \"downloads\": \"डाउनलोड\",\n \"subscriptions\": \"सदस्यताएँ\",\n \"rewards\": \"इनाम\",\n \"referrals\": \"रेफ़रल\",\n \"favorites\": \"पसंदीदा\",\n \"support\": \"सहायता\",\n \"settings\": \"सेटिंग्स\",\n \"reseller\": \"रीसेलर\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} इस स्टोर का हिस्सा नहीं है\",\n \"body\": \"यह स्टोरफ़्रंट वह अनुभाग नहीं देता। आपके ऑर्डर और खाते का विवरण यहीं मौजूद हैं।\"\n },\n \"unknownTab\": {\n \"title\": \"यह लिंक कहीं नहीं ले जाता\",\n \"body\": \"पते में जिस खाता अनुभाग का नाम है वह मौजूद नहीं है। शायद टाइप करने में गलती हुई या पता अधूरा रह गया।\"\n }\n },\n \"login\": {\n \"titleEmail\": \"अपने खाते में साइन इन करें\",\n \"titleCode\": \"अपना ईमेल देखें\",\n \"introEmail\": \"हम आपके ईमेल पते पर एक बार इस्तेमाल होने वाला कोड भेजते हैं। कोई पासवर्ड याद रखने की ज़रूरत नहीं।\",\n \"introCode\": \"{email} पर भेजा गया कोड डालें।\",\n \"emailLabel\": \"ईमेल\",\n \"codeLabel\": \"साइन-इन कोड\",\n \"invalidEmail\": \"पूरा ईमेल पता डालें, जैसे you@example.com।\",\n \"missingCode\": \"अपने ईमेल में मिला कोड डालें।\",\n \"send\": \"मुझे कोड भेजें\",\n \"sending\": \"भेजा जा रहा है…\",\n \"submit\": \"साइन इन\",\n \"submitting\": \"जाँच हो रही है…\",\n \"resend\": \"नया कोड भेजें\",\n \"resent\": \"नया कोड {email} पर भेजा जा रहा है।\",\n \"changeEmail\": \"दूसरा ईमेल इस्तेमाल करें\",\n \"sendFailed\": \"कोड नहीं भेजा जा सका। कृपया थोड़ी देर बाद फिर कोशिश करें।\",\n \"verifyFailed\": \"यह कोड स्वीकार नहीं हुआ। कृपया फिर कोशिश करें।\"\n },\n \"status\": {\n \"COMPLETED\": \"पूरा हुआ\",\n \"PROCESSING\": \"प्रक्रिया में\",\n \"AWAITING_STOCK\": \"स्टॉक का इंतज़ार\",\n \"PENDING\": \"लंबित\",\n \"PENDING_PAYMENT\": \"भुगतान बाकी\",\n \"UNDERPAID\": \"कम भुगतान\",\n \"DISPUTED\": \"विवादित\",\n \"REFUNDED\": \"रिफ़ंड किया गया\",\n \"PARTIAL_REFUND\": \"आंशिक रिफ़ंड\",\n \"VOIDED\": \"अमान्य किया गया\",\n \"EXPIRED\": \"समाप्त\",\n \"ACTIVE\": \"सक्रिय\",\n \"INACTIVE\": \"निष्क्रिय\",\n \"SUSPENDED\": \"निलंबित\",\n \"REVOKED\": \"वापस लिया गया\",\n \"TRIALING\": \"परीक्षण अवधि\",\n \"PAUSED\": \"रोका गया\",\n \"PAST_DUE\": \"भुगतान की तारीख निकली\",\n \"UNPAID\": \"बिना भुगतान\",\n \"INCOMPLETE\": \"अधूरा\",\n \"CANCELED\": \"रद्द\",\n \"CANCELLED\": \"रद्द\",\n \"OPEN\": \"खुला\",\n \"CLOSED\": \"बंद\",\n \"RESOLVED\": \"हल हो गया\",\n \"AWAITING_REPLY\": \"आपके जवाब का इंतज़ार\",\n \"APPROVED\": \"मंज़ूर\",\n \"REJECTED\": \"अस्वीकृत\",\n \"REQUESTED\": \"अनुरोध किया गया\",\n \"CONVERTED\": \"बदला गया\",\n \"PAID\": \"भुगतान हुआ\",\n \"FAILED\": \"विफल\"\n },\n \"delivery\": {\n \"DELIVERED\": \"डिलीवर हो गया\",\n \"AWAITING_FULFILLMENT\": \"पूर्ति का इंतज़ार\",\n \"PENDING\": \"लंबित\",\n \"FAILED\": \"डिलीवरी विफल\"\n },\n \"overview\": {\n \"loading\": \"आपका खाता लोड हो रहा है\",\n \"signedInAs\": \"इस रूप में साइन इन\",\n \"statOrders\": \"ऑर्डर\",\n \"statLicenses\": \"लाइसेंस\",\n \"statDownloads\": \"डाउनलोड\",\n \"statTickets\": \"सहायता टिकट\",\n \"walletLabel\": \"स्टोर क्रेडिट\",\n \"walletNote\": \"चेकआउट पर लगेगा\",\n \"recentOrders\": \"हाल के ऑर्डर\",\n \"allOrders\": \"सभी ऑर्डर\"\n },\n \"orders\": {\n \"loading\": \"आपके ऑर्डर लोड हो रहे हैं\",\n \"emptyTitle\": \"अभी कोई ऑर्डर नहीं\",\n \"emptyBody\": \"इस स्टोर से की गई आपकी खरीदें ऑर्डर करते ही यहाँ दिखेंगी।\",\n \"movedTitle\": \"इस पेज पर कुछ नहीं\",\n \"movedBody\": \"आपके देखते-देखते ये ऑर्डर आगे-पीछे हो गए।\",\n \"backToFirstPage\": \"पहले पेज पर लौटें\",\n \"pagesLabel\": \"ऑर्डर इतिहास के पेज\",\n \"previous\": \"पिछला\",\n \"next\": \"अगला\",\n \"page\": \"पेज {page}\",\n \"andMoreOne\": \"और एक चीज़\",\n \"andMoreOther\": \"और {count} चीज़ें\",\n \"fallbackTitle\": \"ऑर्डर {id}\",\n \"allOrders\": \"सभी ऑर्डर\",\n \"loadingOne\": \"यह ऑर्डर लोड हो रहा है\",\n \"detailTitle\": \"ऑर्डर {id}\",\n \"subtotal\": \"उप-योग\",\n \"discount\": \"छूट\",\n \"tax\": \"कर\",\n \"total\": \"कुल\",\n \"paidWith\": \"भुगतान का माध्यम\",\n \"deliveryTitle\": \"आपकी डिलीवरी\",\n \"replacement\": \"प्रतिस्थापन\",\n \"search\": \"ऑर्डर खोजें\",\n \"searchPlaceholder\": \"चालान आईडी से खोजें\",\n \"status\": \"स्थिति\",\n \"statusAll\": \"सभी स्थितियाँ\",\n \"statusCompleted\": \"पूर्ण\",\n \"statusPending\": \"लंबित\",\n \"statusProcessing\": \"प्रक्रियाधीन\",\n \"statusRefunded\": \"वापस किया गया\",\n \"statusDisputed\": \"विवादित\",\n \"statusExpired\": \"समाप्त\",\n \"emptyFiltered\": \"कोई मेल खाता ऑर्डर नहीं। दूसरी चालान आईडी या स्थिति आज़माएँ।\",\n \"warrantyTitle\": \"वारंटी\",\n \"warrantyCoveredUntil\": \"{date} तक कवर\",\n \"warrantyEnded\": \"कवरेज {date} को समाप्त हुई\",\n \"warrantyCancelled\": \"कवरेज रद्द\",\n \"warrantyClaimSubmitted\": \"दावा भेजा गया\",\n \"warrantyClaimApproved\": \"दावा मंज़ूर\",\n \"warrantyClaimDeclined\": \"दावा अस्वीकार\",\n \"warrantyClaimStart\": \"दावा करें\",\n \"warrantyClaimLabel\": \"क्या गड़बड़ हुई?\",\n \"warrantyClaimOptional\": \"वैकल्पिक\",\n \"warrantyClaimSend\": \"दावा भेजें\",\n \"warrantyClaimSending\": \"भेजा जा रहा है…\",\n \"warrantyClaimDone\": \"स्टोर को आपका दावा मिल गया। जवाब ईमेल से आएगा।\",\n \"warrantyClaimFailed\": \"आपका दावा नहीं भेजा जा सका।\"\n },\n \"downloads\": {\n \"loading\": \"आपके डाउनलोड लोड हो रहे हैं\",\n \"emptyTitle\": \"अभी डाउनलोड करने को कुछ नहीं\",\n \"emptyBody\": \"ऑर्डर पूरा होते ही फ़ाइलें, कीज़ और एक्सेस लिंक यहाँ दिखेंगे।\",\n \"licensesTitle\": \"लाइसेंस कीज़\",\n \"filesTitle\": \"फ़ाइलें\",\n \"codesTitle\": \"कोड और लिंक\",\n \"download\": \"डाउनलोड\",\n \"openLink\": \"लिंक खोलें\",\n \"viewOrder\": \"ऑर्डर देखें\",\n \"expires\": \"{date} को समाप्त\",\n \"neverExpires\": \"कोई अंतिम तारीख नहीं\",\n \"lockedTo\": \"{hardwareId} से जुड़ा है\",\n \"resetHwid\": \"हार्डवेयर आईडी रीसेट करें\",\n \"resettingHwid\": \"रीसेट हो रहा है…\",\n \"hwidResetDone\": \"हार्डवेयर आईडी हटा दी गई। अगला एक्टिवेशन इस लाइसेंस को ले लेगा।\",\n \"hwidResetFailed\": \"हार्डवेयर आईडी रीसेट नहीं हो सकी। कृपया फिर कोशिश करें।\",\n \"renewTitle\": \"नवीनीकरण योग्य\",\n \"renewBody\": \"नवीनीकरण एक खरीद है, इसलिए वह इस पेज से नहीं बल्कि चेकआउट से होता है।\",\n \"renewAction\": \"स्टोर खोलें\",\n \"brokenTitle\": \"आपके डाउनलोड की सूची नहीं बन सकी\",\n \"brokenBody\": \"स्टोर ने लाइसेंस प्रविष्टि ({id}) भेजी पर उसके पीछे का लाइसेंस नहीं, इसलिए यह सूची जिस चीज़ का नाम लेती है वही उसमें नहीं होती।\",\n \"brokenFileBody\": \"स्टोर ने फ़ाइल प्रविष्टि ({id}) भेजी पर डाउनलोड करने को कुछ नहीं, इसलिए यह सूची ऐसी फ़ाइल का नाम लेती जो वह दे नहीं सकती।\"\n },\n \"subscriptions\": {\n \"loading\": \"आपकी सदस्यताएँ लोड हो रही हैं\",\n \"emptyTitle\": \"अभी कोई सदस्यता नहीं\",\n \"emptyBody\": \"बार-बार होने वाली खरीदें शुरू करते ही यहाँ दिखेंगी।\",\n \"allSubscriptions\": \"सभी सदस्यताएँ\",\n \"unnamedPlan\": \"सदस्यता\",\n \"renews\": \"{date} को नवीनीकरण\",\n \"ends\": \"{date} को समाप्त\",\n \"canceled\": \"{date} को रद्द\",\n \"startedOn\": \"{date} को शुरू\",\n \"billingDayOne\": \"रोज़ बिलिंग\",\n \"billingDayOther\": \"हर {count} दिन में बिलिंग\",\n \"billingWeekOne\": \"साप्ताहिक बिलिंग\",\n \"billingWeekOther\": \"हर {count} हफ़्ते में बिलिंग\",\n \"billingMonthOne\": \"मासिक बिलिंग\",\n \"billingMonthOther\": \"हर {count} महीने में बिलिंग\",\n \"billingYearOne\": \"सालाना बिलिंग\",\n \"billingYearOther\": \"हर {count} साल में बिलिंग\",\n \"billingOther\": \"हर {count} × {interval} में बिलिंग\",\n \"gateway\": \"भुगतान प्रदाता\",\n \"paymentMethod\": \"भुगतान का तरीका\",\n \"cardOnFile\": \"{brand}, अंतिम अंक {last4}\",\n \"noPaymentMethod\": \"कोई सहेजा हुआ तरीका नहीं\",\n \"paymentMethodElsewhere\": \"भुगतान विवरण बदलने का लिंक स्टोर के अपने ईमेल से आता है। वह यहाँ नहीं दिया जाता, क्योंकि इस पेज पर कुछ भी उसे उठा सकता है।\",\n \"pause\": \"रोकें\",\n \"pausing\": \"रोका जा रहा है…\",\n \"resume\": \"फिर शुरू करें\",\n \"resuming\": \"फिर शुरू हो रहा है…\",\n \"cancel\": \"सदस्यता रद्द करें\",\n \"cancelling\": \"रद्द किया जा रहा है…\",\n \"keep\": \"रहने दें\",\n \"confirmCancelTitle\": \"यह सदस्यता रद्द करें?\",\n \"confirmCancelAtPeriodEnd\": \"{date} तक आपकी पहुँच बनी रहेगी। उसके बाद कोई बिल नहीं बनेगा।\",\n \"confirmCancelNow\": \"रद्द करते ही पहुँच खत्म हो जाएगी।\",\n \"actionFailed\": \"यह नहीं हो सका। कृपया फिर कोशिश करें।\",\n \"paused\": \"यह सदस्यता रोकी गई है।\",\n \"resumed\": \"यह सदस्यता फिर चालू है।\",\n \"cancelled\": \"यह सदस्यता रद्द कर दी गई है।\",\n \"historyTitle\": \"बिलिंग इतिहास\",\n \"historyLoading\": \"बिलिंग इतिहास लोड हो रहा है\",\n \"historyEmptyTitle\": \"अभी कोई बिलिंग इतिहास नहीं\",\n \"historyEmptyBody\": \"पहले चक्र के बाद नवीनीकरण के इनवॉइस यहाँ दिखेंगे।\",\n \"trial\": \"परीक्षण अवधि {date} को खत्म\"\n },\n \"favorites\": {\n \"loading\": \"आपके पसंदीदा लोड हो रहे हैं\",\n \"emptyTitle\": \"अभी कोई पसंदीदा नहीं\",\n \"emptyBody\": \"स्टोर देखते समय आप जो उत्पाद सहेजते हैं वे यहाँ रहते हैं।\",\n \"added\": \"{date} को सहेजा\",\n \"gone\": \"अब उपलब्ध नहीं\",\n \"view\": \"स्टोर में देखें\",\n \"remove\": \"हटाएँ\",\n \"removing\": \"हटाया जा रहा है…\",\n \"removeFailed\": \"यह पसंदीदा हटाया नहीं जा सका। कृपया फिर कोशिश करें।\",\n \"noImage\": \"{title} की कोई तस्वीर नहीं\"\n },\n \"rewards\": {\n \"loading\": \"आपके इनाम लोड हो रहे हैं\",\n \"available\": \"उपलब्ध\",\n \"pending\": \"चल रहा है\",\n \"lifetime\": \"अब तक कुल कमाई\",\n \"couponsTitle\": \"आपके कूपन\",\n \"couponsBody\": \"इनमें से कोई एक चेकआउट पर चिपकाएँ।\",\n \"percentOff\": \"{percent}% छूट\",\n \"couponGeneric\": \"छूट कूपन\",\n \"expiresOn\": \"{date} को समाप्त\",\n \"activityTitle\": \"गतिविधि\",\n \"emptyTitle\": \"अभी कोई इनाम नहीं\",\n \"emptyBody\": \"कमाई शुरू करने के लिए कोई ऑर्डर पूरा करें या समीक्षा लिखें।\",\n \"storeCredit\": \"{amount} स्टोर क्रेडिट\",\n \"storeCreditGeneric\": \"स्टोर क्रेडिट\",\n \"couponNamed\": \"कूपन {code}\",\n \"couponUnnamed\": \"कूपन कोड\",\n \"otherReward\": \"इनाम\",\n \"reasonOrderCompleted\": \"ऑर्डर पूरा हुआ\",\n \"reasonOrderCount\": \"वफ़ादारी पड़ाव\",\n \"reasonSpendAmount\": \"अब तक का खर्च\",\n \"reasonReview\": \"समीक्षा लिखी\",\n \"reasonFirstPurchase\": \"पहली खरीद\",\n \"reasonOther\": \"इनाम\",\n \"grantFulfilled\": \"मिल गया\",\n \"grantPending\": \"चल रहा है\",\n \"grantFailed\": \"विफल\",\n \"grantRevoked\": \"वापस लिया गया\",\n \"pointsTitle\": \"पॉइंट\",\n \"pointsBalance\": \"पॉइंट बैलेंस\",\n \"pointsLifetime\": \"कुल कमाए गए पॉइंट\",\n \"pointsEarnHint\": \"पॉइंट जमा करना शुरू करने के लिए एक ऑर्डर पूरा करें।\",\n \"pointsActivityTitle\": \"पॉइंट गतिविधि\",\n \"pointsFromOrder\": \"ऑर्डर पूरा हुआ\",\n \"pointsFromReview\": \"समीक्षा लिखी\",\n \"pointsConverted\": \"स्टोर क्रेडिट में बदला गया\",\n \"pointsAdjusted\": \"स्टोर ने समायोजित किया\",\n \"redeemTitle\": \"पॉइंट बदलें\",\n \"redeemBody\": \"अपने पॉइंट को स्टोर क्रेडिट में बदलें और चेकआउट पर इस्तेमाल करें।\",\n \"redeemLabel\": \"बदलने वाले पॉइंट\",\n \"redeemMinimum\": \"कम से कम {points} पॉइंट बदलें।\",\n \"redeemOverBalance\": \"आपके पास {points} पॉइंट हैं।\",\n \"redeemInvalid\": \"पॉइंट की पूरी संख्या डालें।\",\n \"redeemPreview\": \"यह लगभग {amount} स्टोर क्रेडिट के बराबर है।\",\n \"redeemContinue\": \"आगे बढ़ें\",\n \"redeemConfirm\": \"{points} पॉइंट को लगभग {amount} स्टोर क्रेडिट में बदलें?\",\n \"redeemConfirmAction\": \"हाँ, बदलें\",\n \"redeemWorking\": \"बदला जा रहा है…\",\n \"redeemDone\": \"{amount} आपके स्टोर क्रेडिट में जोड़ा गया।\",\n \"redeemFailed\": \"आपके पॉइंट नहीं बदले जा सके।\"\n },\n \"referrals\": {\n \"loading\": \"आपके रेफ़रल लोड हो रहे हैं\",\n \"notEnrolledTitle\": \"आप रेफ़रल कार्यक्रम में नहीं हैं\",\n \"notEnrolledBody\": \"इस स्टोर ने आपको जोड़ा नहीं है, इसलिए अभी साझा करने या देखने को कुछ नहीं है।\",\n \"availableLabel\": \"निकालने के लिए उपलब्ध\",\n \"pendingLabel\": \"लंबित\",\n \"requestedLabel\": \"अनुरोध किया गया\",\n \"payoutsElsewhere\": \"निकासी और भुगतान स्टोर संभालता है, इस पेज से नहीं होते।\",\n \"codesAccepted\": \"आपका कोड चेकआउट पर स्वीकार होता है।\",\n \"codesNotAccepted\": \"यह स्टोर फ़िलहाल चेकआउट पर रेफ़रल कोड नहीं लेता।\",\n \"linksTitle\": \"आपके लिंक\",\n \"linksEmptyTitle\": \"अभी कोई रेफ़रल लिंक नहीं\",\n \"linksEmptyBody\": \"जो लिंक आप साझा करते हैं वे स्टोर बनाता है। यहाँ लिंक की उम्मीद थी तो उनसे माँग लें।\",\n \"primary\": \"मुख्य\",\n \"commission\": \"{percent}% कमीशन\",\n \"buyerDiscount\": \"खरीदार को {percent}% छूट\",\n \"awaitingApproval\": \"इस लिंक पर स्टोर की मंज़ूरी का इंतज़ार है।\",\n \"clicks\": \"क्लिक\",\n \"sales\": \"बिक्री\",\n \"revenue\": \"आमदनी\",\n \"commissionsTitle\": \"कमीशन\",\n \"commissionsEmptyTitle\": \"अभी कोई कमीशन नहीं\",\n \"commissionsEmptyBody\": \"मंज़ूर हुई रेफ़रल बिक्री यहाँ दिखेगी।\",\n \"commissionFor\": \"ऑर्डर {id}\",\n \"balanceTitle\": \"बैलेंस गतिविधि\",\n \"balanceEmptyTitle\": \"अभी कोई बैलेंस गतिविधि नहीं\",\n \"balanceEmptyBody\": \"रूपांतरण और भुगतान यहाँ दिखेंगे।\",\n \"claimStoreCredit\": \"स्टोर क्रेडिट\",\n \"claimCryptoPayout\": \"क्रिप्टो भुगतान\",\n \"claimAdjustment\": \"समायोजन\",\n \"differentCurrency\": \"आपका रेफ़रल बैलेंस {currency} में रखा जाता है।\",\n \"convertedLabel\": \"स्टोर क्रेडिट में बदला\",\n \"paidLabel\": \"भुगतान हो गया\"\n },\n \"support\": {\n \"loading\": \"आपके टिकट लोड हो रहे हैं\",\n \"ticketsTitle\": \"आपके टिकट\",\n \"emptyTitle\": \"अभी कोई टिकट नहीं\",\n \"emptyBody\": \"स्टोर को यहीं से लिखें और हर जवाब इसी पेज पर रहेगा।\",\n \"newTicket\": \"नया टिकट\",\n \"backToTickets\": \"सभी टिकट\",\n \"updated\": \"{date} को अपडेट\",\n \"aboutOrder\": \"ऑर्डर {id} के बारे में\",\n \"subjectLabel\": \"विषय\",\n \"subjectOptional\": \"वैकल्पिक\",\n \"messageLabel\": \"संदेश\",\n \"replyLabel\": \"आपका जवाब\",\n \"create\": \"स्टोर को भेजें\",\n \"creating\": \"भेजा जा रहा है…\",\n \"createFailed\": \"आपका टिकट नहीं बन सका। कृपया फिर कोशिश करें।\",\n \"reply\": \"जवाब भेजें\",\n \"replying\": \"भेजा जा रहा है…\",\n \"replyFailed\": \"आपका जवाब नहीं भेजा जा सका। कृपया फिर कोशिश करें।\",\n \"tooShort\": \"कृपया कम से कम एक छोटा संदेश लिखें।\",\n \"closedTitle\": \"यह टिकट बंद है\",\n \"closedBody\": \"अब भी मदद चाहिए तो नया टिकट खोलें।\",\n \"loadingThread\": \"यह बातचीत लोड हो रही है\",\n \"noMessages\": \"इस टिकट पर अभी कोई संदेश नहीं है।\",\n \"fromYou\": \"आप\",\n \"fromMerchant\": \"स्टोर\",\n \"fromSystem\": \"सिस्टम\",\n \"untitled\": \"सहायता अनुरोध\"\n },\n \"settings\": {\n \"loading\": \"आपकी सेटिंग्स लोड हो रही हैं\",\n \"profileTitle\": \"प्रोफ़ाइल\",\n \"emailLabel\": \"ईमेल\",\n \"emailNote\": \"आपका ईमेल ही आपको साइन इन कराता है, इसलिए उसे यहाँ नहीं बल्कि स्टोर बदलता है।\",\n \"nameLabel\": \"नाम\",\n \"nameTooShort\": \"कृपया अपना नाम डालें।\",\n \"saveProfile\": \"बदलाव सहेजें\",\n \"savingProfile\": \"सहेजा जा रहा है…\",\n \"profileSaved\": \"आपका नाम अपडेट हो गया।\",\n \"profileFailed\": \"आपका नाम सहेजा नहीं जा सका। कृपया फिर कोशिश करें।\",\n \"uploadAvatar\": \"फ़ोटो अपलोड करें\",\n \"uploadingAvatar\": \"अपलोड हो रहा है…\",\n \"removeAvatar\": \"फ़ोटो हटाएँ\",\n \"removingAvatar\": \"हटाया जा रहा है…\",\n \"avatarHint\": \"JPG, PNG, GIF या WebP, 10 MB तक।\",\n \"avatarFailed\": \"आपकी फ़ोटो अपलोड नहीं हो सकी। कृपया फिर कोशिश करें।\",\n \"avatarRemoveFailed\": \"आपकी फ़ोटो हटाई नहीं जा सकी। कृपया फिर कोशिश करें।\",\n \"avatarTooLarge\": \"यह तस्वीर 10 MB से बड़ी है।\",\n \"emailsTitle\": \"स्टोर के ईमेल\",\n \"emailsLoading\": \"आपकी ईमेल सेटिंग्स लोड हो रही हैं\",\n \"unsubscribeAll\": \"कोई मार्केटिंग ईमेल नहीं\",\n \"unsubscribeAllNote\": \"ऑर्डर और डिलीवरी के ईमेल दोनों ही हाल में आते हैं।\",\n \"listsEmpty\": \"इस स्टोर की कोई मेलिंग सूची नहीं है।\",\n \"emailsFailed\": \"आपकी ईमेल सेटिंग्स लोड नहीं हो सकीं।\",\n \"emailsSaveFailed\": \"यह सेटिंग सहेजी नहीं जा सकी। कृपया फिर कोशिश करें।\",\n \"devicesTitle\": \"साइन इन डिवाइस\",\n \"devicesLoading\": \"आपके डिवाइस लोड हो रहे हैं\",\n \"devicesEmpty\": \"कोई दूसरा डिवाइस साइन इन नहीं है।\",\n \"thisDevice\": \"यह डिवाइस\",\n \"signedInOn\": \"{date} को साइन इन\",\n \"unknownDevice\": \"अनजान डिवाइस\",\n \"signOutDevice\": \"साइन आउट\",\n \"signingOutDevice\": \"साइन आउट हो रहा है…\",\n \"signOutOthers\": \"बाकी सभी डिवाइस से साइन आउट करें\",\n \"signOutOthersDone\": \"बाकी सभी डिवाइस से साइन आउट हो गया।\",\n \"devicesFailed\": \"आपके डिवाइस लोड नहीं हो सके।\",\n \"signOutDeviceFailed\": \"उस डिवाइस से साइन आउट नहीं हो सका। कृपया फिर कोशिश करें।\",\n \"deviceOn\": \"{os} पर {browser}\"\n },\n \"walletTopup\": {\n \"title\": \"स्टोर क्रेडिट जोड़ें\",\n \"minimum\": \"न्यूनतम {min}\",\n \"bounds\": \"{min} से {max} तक\",\n \"bonus\": \"कम से कम {amount} जोड़ें और {percent}% अतिरिक्त पाएँ\",\n \"amount\": \"राशि\",\n \"submit\": \"भुगतान पर जाएँ\"\n },\n \"reseller\": {\n \"disabledTitle\": \"रीसेलर कार्यक्रम उपलब्ध नहीं है\",\n \"disabledBody\": \"यह स्टोर अभी थोक ऑर्डर स्वीकार नहीं कर रहा है।\",\n \"openTitle\": \"रीसेलर कार्यक्रम में शामिल हों\",\n \"openBody\": \"इस स्टोर के उत्पाद थोक मूल्य पर खरीदने के लिए अभी शामिल हों।\",\n \"join\": \"अभी शामिल हों\",\n \"manualTitle\": \"अपना रीसेलर आमंत्रण स्वीकार करें\",\n \"manualBody\": \"स्टोर से मिला आमंत्रण टोकन दर्ज करें।\",\n \"inviteToken\": \"आमंत्रण टोकन\",\n \"acceptInvite\": \"आमंत्रण स्वीकार करें\",\n \"applicationTitle\": \"रीसेलर बनने के लिए आवेदन करें\",\n \"applicationBody\": \"स्टोर को अपने व्यवसाय के बारे में बताएँ और आवेदन भेजें।\",\n \"applicationNote\": \"आवेदन का नोट\",\n \"noteRequired\": \"आवेदन भेजने से पहले एक नोट जोड़ें।\",\n \"apply\": \"आवेदन भेजें\",\n \"pendingTitle\": \"आपका आवेदन लंबित है\",\n \"pendingBody\": \"थोक पहुँच चालू करने से पहले स्टोर आपके आवेदन की समीक्षा करेगा।\",\n \"rejectedTitle\": \"आपका रीसेलर आवेदन अस्वीकार हुआ\",\n \"rejectedBody\": \"अधिक जानकारी या दोबारा आवेदन के लिए स्टोर से संपर्क करें।\",\n \"suspendedTitle\": \"आपका रीसेलर खाता निलंबित है\",\n \"suspendedBody\": \"थोक ऑर्डर उपलब्ध नहीं हैं। सहायता के लिए स्टोर से संपर्क करें।\",\n \"activeTitle\": \"थोक खाता\",\n \"tier\": \"स्तर\",\n \"walletTitle\": \"थोक शेष\",\n \"balance\": \"शेष\",\n \"held\": \"रोक पर\",\n \"catalogTitle\": \"थोक कैटलॉग\",\n \"search\": \"उत्पाद खोजें\",\n \"catalogEmptyTitle\": \"कोई थोक उत्पाद नहीं मिला\",\n \"catalogEmptyBody\": \"दूसरी खोज करें या स्टोर के उत्पाद जोड़ने के बाद वापस आएँ।\",\n \"volumePricing\": \"मात्रा के अनुसार मूल्य उपलब्ध\",\n \"supplierBacked\": \"आपूर्तिकर्ता द्वारा पूरा\",\n \"add\": \"जोड़ें\",\n \"basketTitle\": \"थोक टोकरी\",\n \"basketEmpty\": \"ऑर्डर शुरू करने के लिए थोक कैटलॉग से उत्पाद जोड़ें।\",\n \"quantity\": \"मात्रा\",\n \"basketNeedsQuote\": \"ऑर्डर से पहले मौजूदा कुल देखने के लिए इस टोकरी का मूल्य लें।\",\n \"quote\": \"टोकरी का मूल्य लें\",\n \"place\": \"ऑर्डर करें\",\n \"ordersTitle\": \"थोक ऑर्डर\",\n \"ordersEmptyTitle\": \"अभी कोई थोक ऑर्डर नहीं\",\n \"ordersEmptyBody\": \"आपके थोक शेष से भुगतान किए गए ऑर्डर यहाँ दिखते हैं।\",\n \"refunded\": \"शेष में वापस\",\n \"lineQuantity\": \"मात्रा {count}\",\n \"serials\": \"दिए गए सीरियल नंबर\",\n \"apiKeysTitle\": \"रीसेलर API कुंजियाँ\",\n \"apiKeyName\": \"कुंजी का नाम\",\n \"createApiKey\": \"कुंजी बनाएँ\",\n \"apiKeysEmpty\": \"आपने कोई रीसेलर API कुंजी नहीं बनाई है।\",\n \"orderElsewhere\": \"थोक ऑर्डर इस पृष्ठ से नहीं, रीसेलर API के ज़रिए दिए जाते हैं।\",\n \"keysElsewhere\": \"API कुंजियाँ दुकान जारी करती है। वहाँ से माँगें।\",\n \"apiKeyCreatedTitle\": \"इस कुंजी को अभी कॉपी करें\",\n \"apiKeyCreatedBody\": \"यह सादी कुंजी केवल एक बार दिखाई जाती है और बाद में वापस नहीं मिल सकती।\",\n \"dismissKey\": \"मैंने इसे सहेज लिया\",\n \"lastUsed\": \"अंतिम उपयोग: {date}\",\n \"neverUsed\": \"कभी उपयोग नहीं हुआ\",\n \"revokeApiKey\": \"रद्द करें\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Copia\",\n \"copied\": \"Copiato\",\n \"retry\": \"Riprova\",\n \"notLoaded\": \"Caricamento non riuscito\",\n \"genericError\": \"Non è stato possibile caricare questo contenuto. Riprova tra poco.\",\n \"browseStore\": \"Esplora il negozio\",\n \"unavailable\": \"Non disponibile\",\n \"cancel\": \"Annulla\"\n },\n \"account\": {\n \"title\": \"Il tuo account\",\n \"sections\": \"Sezioni dell'account\",\n \"signOut\": \"Esci\",\n \"signingOut\": \"Disconnessione…\",\n \"signOutFailed\": \"Non è stato possibile disconnetterti. Riprova.\",\n \"checkingSession\": \"Verifica della tua sessione\",\n \"sessionUnknown\": \"Non è stato possibile verificare la tua sessione. Riprova tra poco.\",\n \"goToOverview\": \"Vai alla panoramica\",\n \"tabs\": {\n \"overview\": \"Panoramica\",\n \"orders\": \"Ordini\",\n \"downloads\": \"Download\",\n \"subscriptions\": \"Abbonamenti\",\n \"rewards\": \"Premi\",\n \"referrals\": \"Referral\",\n \"favorites\": \"Preferiti\",\n \"support\": \"Assistenza\",\n \"settings\": \"Impostazioni\",\n \"reseller\": \"Rivenditore\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} non fa parte di questo negozio\",\n \"body\": \"Questo negozio non offre quella sezione. I tuoi ordini e i dati del tuo account sono comunque qui.\"\n },\n \"unknownTab\": {\n \"title\": \"Questo link non porta da nessuna parte\",\n \"body\": \"L'indirizzo indica una sezione dell'account che non esiste. Forse è stato scritto male o troncato.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Accedi al tuo account\",\n \"titleCode\": \"Controlla la tua email\",\n \"introEmail\": \"Inviamo un codice monouso al tuo indirizzo email. Non c'è nessuna password da ricordare.\",\n \"introCode\": \"Inserisci il codice che abbiamo inviato a {email}.\",\n \"emailLabel\": \"Email\",\n \"codeLabel\": \"Codice di accesso\",\n \"invalidEmail\": \"Inserisci un indirizzo email completo, ad esempio tu@esempio.com.\",\n \"missingCode\": \"Inserisci il codice che trovi nella tua email.\",\n \"send\": \"Inviami un codice\",\n \"sending\": \"Invio in corso…\",\n \"submit\": \"Accedi\",\n \"submitting\": \"Verifica in corso…\",\n \"resend\": \"Invia un nuovo codice\",\n \"resent\": \"Un nuovo codice è in arrivo a {email}.\",\n \"changeEmail\": \"Usa un'altra email\",\n \"sendFailed\": \"Non è stato possibile inviare il codice. Riprova tra poco.\",\n \"verifyFailed\": \"Questo codice non è stato accettato. Riprova.\"\n },\n \"status\": {\n \"COMPLETED\": \"Completato\",\n \"PROCESSING\": \"In elaborazione\",\n \"AWAITING_STOCK\": \"In attesa di disponibilità\",\n \"PENDING\": \"In sospeso\",\n \"PENDING_PAYMENT\": \"In attesa di pagamento\",\n \"UNDERPAID\": \"Importo insufficiente\",\n \"DISPUTED\": \"Contestato\",\n \"REFUNDED\": \"Rimborsato\",\n \"PARTIAL_REFUND\": \"Rimborsato in parte\",\n \"VOIDED\": \"Annullato\",\n \"EXPIRED\": \"Scaduto\",\n \"ACTIVE\": \"Attivo\",\n \"INACTIVE\": \"Non attivo\",\n \"SUSPENDED\": \"Sospeso\",\n \"REVOKED\": \"Revocato\",\n \"TRIALING\": \"Prova\",\n \"PAUSED\": \"In pausa\",\n \"PAST_DUE\": \"Pagamento arretrato\",\n \"UNPAID\": \"Non pagato\",\n \"INCOMPLETE\": \"Incompleto\",\n \"CANCELED\": \"Annullato\",\n \"CANCELLED\": \"Annullato\",\n \"OPEN\": \"Aperto\",\n \"CLOSED\": \"Chiuso\",\n \"RESOLVED\": \"Risolto\",\n \"AWAITING_REPLY\": \"In attesa della tua risposta\",\n \"APPROVED\": \"Approvato\",\n \"REJECTED\": \"Rifiutato\",\n \"REQUESTED\": \"Richiesto\",\n \"CONVERTED\": \"Convertito\",\n \"PAID\": \"Pagato\",\n \"FAILED\": \"Non riuscito\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Consegnato\",\n \"AWAITING_FULFILLMENT\": \"In attesa di evasione\",\n \"PENDING\": \"In sospeso\",\n \"FAILED\": \"Consegna non riuscita\"\n },\n \"overview\": {\n \"loading\": \"Caricamento del tuo account\",\n \"signedInAs\": \"Hai effettuato l'accesso come\",\n \"statOrders\": \"Ordini\",\n \"statLicenses\": \"Licenze\",\n \"statDownloads\": \"Download\",\n \"statTickets\": \"Ticket di assistenza\",\n \"walletLabel\": \"Credito del negozio\",\n \"walletNote\": \"Applicato al checkout\",\n \"recentOrders\": \"Ordini recenti\",\n \"allOrders\": \"Tutti gli ordini\"\n },\n \"orders\": {\n \"loading\": \"Caricamento dei tuoi ordini\",\n \"emptyTitle\": \"Ancora nessun ordine\",\n \"emptyBody\": \"Gli acquisti fatti in questo negozio compaiono qui non appena ne effettui uno.\",\n \"movedTitle\": \"Niente in questa pagina\",\n \"movedBody\": \"Questi ordini si sono spostati mentre li stavi guardando.\",\n \"backToFirstPage\": \"Torna alla prima pagina\",\n \"pagesLabel\": \"Pagine dello storico ordini\",\n \"previous\": \"Precedente\",\n \"next\": \"Successiva\",\n \"page\": \"Pagina {page}\",\n \"andMoreOne\": \"e un altro articolo\",\n \"andMoreOther\": \"e altri {count} articoli\",\n \"fallbackTitle\": \"Ordine {id}\",\n \"allOrders\": \"Tutti gli ordini\",\n \"loadingOne\": \"Caricamento dell'ordine\",\n \"detailTitle\": \"Ordine {id}\",\n \"subtotal\": \"Subtotale\",\n \"discount\": \"Sconto\",\n \"tax\": \"Imposte\",\n \"total\": \"Totale\",\n \"paidWith\": \"Pagato con\",\n \"deliveryTitle\": \"La tua consegna\",\n \"replacement\": \"Sostituzione\",\n \"search\": \"Cerca ordini\",\n \"searchPlaceholder\": \"Cerca per numero fattura\",\n \"status\": \"Stato\",\n \"statusAll\": \"Tutti gli stati\",\n \"statusCompleted\": \"Completato\",\n \"statusPending\": \"In attesa\",\n \"statusProcessing\": \"In elaborazione\",\n \"statusRefunded\": \"Rimborsato\",\n \"statusDisputed\": \"Contestato\",\n \"statusExpired\": \"Scaduto\",\n \"emptyFiltered\": \"Nessun ordine corrispondente. Prova un altro numero fattura o un altro stato.\",\n \"warrantyTitle\": \"Garanzia\",\n \"warrantyCoveredUntil\": \"Coperto fino al {date}\",\n \"warrantyEnded\": \"La copertura è terminata il {date}\",\n \"warrantyCancelled\": \"Copertura annullata\",\n \"warrantyClaimSubmitted\": \"Richiesta inviata\",\n \"warrantyClaimApproved\": \"Richiesta accettata\",\n \"warrantyClaimDeclined\": \"Richiesta rifiutata\",\n \"warrantyClaimStart\": \"Apri una richiesta\",\n \"warrantyClaimLabel\": \"Cosa è successo?\",\n \"warrantyClaimOptional\": \"Facoltativo\",\n \"warrantyClaimSend\": \"Invia richiesta\",\n \"warrantyClaimSending\": \"Invio in corso…\",\n \"warrantyClaimDone\": \"Il negozio ha ricevuto la tua richiesta. Ti rispondono via e-mail.\",\n \"warrantyClaimFailed\": \"Non è stato possibile inviare la richiesta.\"\n },\n \"downloads\": {\n \"loading\": \"Caricamento dei tuoi download\",\n \"emptyTitle\": \"Ancora niente da scaricare\",\n \"emptyBody\": \"File, chiavi e link di accesso compaiono qui quando un ordine è completato.\",\n \"licensesTitle\": \"Chiavi di licenza\",\n \"filesTitle\": \"File\",\n \"codesTitle\": \"Codici e link\",\n \"download\": \"Scarica\",\n \"openLink\": \"Apri il link\",\n \"viewOrder\": \"Vedi l'ordine\",\n \"expires\": \"Scade il {date}\",\n \"neverExpires\": \"Senza scadenza\",\n \"lockedTo\": \"Vincolata a {hardwareId}\",\n \"resetHwid\": \"Reimposta l'hardware ID\",\n \"resettingHwid\": \"Reimpostazione…\",\n \"hwidResetDone\": \"L'hardware ID è stato cancellato. La prossima attivazione occuperà questa licenza.\",\n \"hwidResetFailed\": \"Non è stato possibile reimpostare l'hardware ID. Riprova.\",\n \"renewTitle\": \"Rinnovabile\",\n \"renewBody\": \"Un rinnovo è un acquisto, quindi passa dal checkout e non da questa pagina.\",\n \"renewAction\": \"Apri il negozio\",\n \"brokenTitle\": \"Non è stato possibile elencare i tuoi download\",\n \"brokenBody\": \"Il negozio ha inviato una voce di licenza ({id}) senza la licenza corrispondente, quindi in questo elenco mancherebbe proprio ciò che nomina.\",\n \"brokenFileBody\": \"Il negozio ha inviato una voce di file ({id}) senza nulla da scaricare, quindi questo elenco nominerebbe un file che non può consegnare.\"\n },\n \"subscriptions\": {\n \"loading\": \"Caricamento dei tuoi abbonamenti\",\n \"emptyTitle\": \"Ancora nessun abbonamento\",\n \"emptyBody\": \"Gli acquisti ricorrenti compaiono qui quando ne attivi uno.\",\n \"allSubscriptions\": \"Tutti gli abbonamenti\",\n \"unnamedPlan\": \"Abbonamento\",\n \"renews\": \"Si rinnova il {date}\",\n \"ends\": \"Termina il {date}\",\n \"canceled\": \"Annullato il {date}\",\n \"startedOn\": \"Iniziato il {date}\",\n \"billingDayOne\": \"Addebito giornaliero\",\n \"billingDayOther\": \"Addebito ogni {count} giorni\",\n \"billingWeekOne\": \"Addebito settimanale\",\n \"billingWeekOther\": \"Addebito ogni {count} settimane\",\n \"billingMonthOne\": \"Addebito mensile\",\n \"billingMonthOther\": \"Addebito ogni {count} mesi\",\n \"billingYearOne\": \"Addebito annuale\",\n \"billingYearOther\": \"Addebito ogni {count} anni\",\n \"billingOther\": \"Addebito ogni {count} × {interval}\",\n \"gateway\": \"Fornitore di pagamento\",\n \"paymentMethod\": \"Metodo di pagamento\",\n \"cardOnFile\": \"{brand} che termina con {last4}\",\n \"noPaymentMethod\": \"Nessuno salvato\",\n \"paymentMethodElsewhere\": \"Il link per cambiare i tuoi dati di pagamento arriva dalle email del negozio. Non viene fornito qui, perché qualsiasi elemento di questa pagina potrebbe intercettarlo.\",\n \"pause\": \"Metti in pausa\",\n \"pausing\": \"Sospensione…\",\n \"resume\": \"Riprendi\",\n \"resuming\": \"Ripresa…\",\n \"cancel\": \"Annulla l'abbonamento\",\n \"cancelling\": \"Annullamento…\",\n \"keep\": \"Mantienilo\",\n \"confirmCancelTitle\": \"Vuoi annullare questo abbonamento?\",\n \"confirmCancelAtPeriodEnd\": \"Mantieni l'accesso fino al {date}. Dopo non ti verrà addebitato nulla.\",\n \"confirmCancelNow\": \"L'accesso termina non appena l'abbonamento viene annullato.\",\n \"actionFailed\": \"L'operazione non è andata a buon fine. Riprova.\",\n \"paused\": \"Questo abbonamento è in pausa.\",\n \"resumed\": \"Questo abbonamento è di nuovo attivo.\",\n \"cancelled\": \"Questo abbonamento è stato annullato.\",\n \"historyTitle\": \"Storico degli addebiti\",\n \"historyLoading\": \"Caricamento dello storico\",\n \"historyEmptyTitle\": \"Ancora nessun addebito\",\n \"historyEmptyBody\": \"Le fatture di rinnovo compaiono qui dopo il primo ciclo.\",\n \"trial\": \"La prova termina il {date}\"\n },\n \"favorites\": {\n \"loading\": \"Caricamento dei tuoi preferiti\",\n \"emptyTitle\": \"Ancora nessun preferito\",\n \"emptyBody\": \"I prodotti che salvi mentre esplori il negozio restano qui.\",\n \"added\": \"Salvato il {date}\",\n \"gone\": \"Non più disponibile\",\n \"view\": \"Vedi nel negozio\",\n \"remove\": \"Rimuovi\",\n \"removing\": \"Rimozione…\",\n \"removeFailed\": \"Non è stato possibile rimuovere questo preferito. Riprova.\",\n \"noImage\": \"Nessuna immagine per {title}\"\n },\n \"rewards\": {\n \"loading\": \"Caricamento dei tuoi premi\",\n \"available\": \"Disponibile\",\n \"pending\": \"In corso\",\n \"lifetime\": \"Guadagnato in totale\",\n \"couponsTitle\": \"I tuoi coupon\",\n \"couponsBody\": \"Incolla uno di questi al checkout.\",\n \"percentOff\": \"{percent}% di sconto\",\n \"couponGeneric\": \"Coupon sconto\",\n \"expiresOn\": \"Scade il {date}\",\n \"activityTitle\": \"Attività\",\n \"emptyTitle\": \"Ancora nessun premio\",\n \"emptyBody\": \"Completa un ordine o lascia una recensione per iniziare a guadagnare.\",\n \"storeCredit\": \"{amount} di credito del negozio\",\n \"storeCreditGeneric\": \"Credito del negozio\",\n \"couponNamed\": \"Coupon {code}\",\n \"couponUnnamed\": \"Codice coupon\",\n \"otherReward\": \"Premio\",\n \"reasonOrderCompleted\": \"Ordine completato\",\n \"reasonOrderCount\": \"Traguardo fedeltà\",\n \"reasonSpendAmount\": \"Spesa complessiva\",\n \"reasonReview\": \"Recensione lasciata\",\n \"reasonFirstPurchase\": \"Primo acquisto\",\n \"reasonOther\": \"Premio\",\n \"grantFulfilled\": \"Guadagnato\",\n \"grantPending\": \"In corso\",\n \"grantFailed\": \"Non riuscito\",\n \"grantRevoked\": \"Revocato\",\n \"pointsTitle\": \"Punti\",\n \"pointsBalance\": \"Saldo punti\",\n \"pointsLifetime\": \"Accumulati in totale\",\n \"pointsEarnHint\": \"Completa un ordine per iniziare a raccogliere punti.\",\n \"pointsActivityTitle\": \"Movimenti punti\",\n \"pointsFromOrder\": \"Ordine completato\",\n \"pointsFromReview\": \"Recensione lasciata\",\n \"pointsConverted\": \"Convertiti in credito del negozio\",\n \"pointsAdjusted\": \"Rettificati dal negozio\",\n \"redeemTitle\": \"Converti punti\",\n \"redeemBody\": \"Trasforma i tuoi punti in credito del negozio e usalo alla cassa.\",\n \"redeemLabel\": \"Punti da convertire\",\n \"redeemMinimum\": \"Converti almeno {points} punti.\",\n \"redeemOverBalance\": \"Hai {points} punti da usare.\",\n \"redeemInvalid\": \"Inserisci un numero intero di punti.\",\n \"redeemPreview\": \"Valgono circa {amount} di credito del negozio.\",\n \"redeemContinue\": \"Continua\",\n \"redeemConfirm\": \"Convertire {points} punti in circa {amount} di credito del negozio?\",\n \"redeemConfirmAction\": \"Sì, converti\",\n \"redeemWorking\": \"Conversione in corso…\",\n \"redeemDone\": \"{amount} aggiunti al tuo credito del negozio.\",\n \"redeemFailed\": \"Non è stato possibile convertire i tuoi punti.\"\n },\n \"referrals\": {\n \"loading\": \"Caricamento dei tuoi referral\",\n \"notEnrolledTitle\": \"Non fai parte del programma referral\",\n \"notEnrolledBody\": \"Questo negozio non ti ha iscritto, quindi non c'è ancora nulla da condividere o monitorare.\",\n \"availableLabel\": \"Disponibile per il prelievo\",\n \"pendingLabel\": \"In sospeso\",\n \"requestedLabel\": \"Richiesto\",\n \"payoutsElsewhere\": \"I prelievi e i pagamenti sono gestiti dal negozio, non da questa pagina.\",\n \"codesAccepted\": \"Il tuo codice è accettato al checkout.\",\n \"codesNotAccepted\": \"Al momento questo negozio non accetta codici referral al checkout.\",\n \"linksTitle\": \"I tuoi link\",\n \"linksEmptyTitle\": \"Ancora nessun link referral\",\n \"linksEmptyBody\": \"È il negozio a creare i link che condividi. Chiedine uno se ti aspettavi di trovarlo qui.\",\n \"primary\": \"Principale\",\n \"commission\": \"{percent}% di commissione\",\n \"buyerDiscount\": \"{percent}% di sconto per l'acquirente\",\n \"awaitingApproval\": \"In attesa che il negozio approvi questo link.\",\n \"clicks\": \"Clic\",\n \"sales\": \"Vendite\",\n \"revenue\": \"Fatturato\",\n \"commissionsTitle\": \"Commissioni\",\n \"commissionsEmptyTitle\": \"Ancora nessuna commissione\",\n \"commissionsEmptyBody\": \"Le vendite referral approvate compaiono qui.\",\n \"commissionFor\": \"Ordine {id}\",\n \"balanceTitle\": \"Movimenti del saldo\",\n \"balanceEmptyTitle\": \"Ancora nessun movimento\",\n \"balanceEmptyBody\": \"Le conversioni e i pagamenti compaiono qui.\",\n \"claimStoreCredit\": \"Credito del negozio\",\n \"claimCryptoPayout\": \"Pagamento in cripto\",\n \"claimAdjustment\": \"Rettifica\",\n \"differentCurrency\": \"Il tuo saldo referral è in {currency}.\",\n \"convertedLabel\": \"Convertito in credito\",\n \"paidLabel\": \"Pagato\"\n },\n \"support\": {\n \"loading\": \"Caricamento dei tuoi ticket\",\n \"ticketsTitle\": \"I tuoi ticket\",\n \"emptyTitle\": \"Ancora nessun ticket\",\n \"emptyBody\": \"Scrivi al negozio da qui: ogni risposta resta su questa pagina.\",\n \"newTicket\": \"Nuovo ticket\",\n \"backToTickets\": \"Tutti i ticket\",\n \"updated\": \"Aggiornato il {date}\",\n \"aboutOrder\": \"Sull'ordine {id}\",\n \"subjectLabel\": \"Oggetto\",\n \"subjectOptional\": \"Facoltativo\",\n \"messageLabel\": \"Messaggio\",\n \"replyLabel\": \"La tua risposta\",\n \"create\": \"Invia al negozio\",\n \"creating\": \"Invio in corso…\",\n \"createFailed\": \"Non è stato possibile creare il tuo ticket. Riprova.\",\n \"reply\": \"Invia la risposta\",\n \"replying\": \"Invio in corso…\",\n \"replyFailed\": \"Non è stato possibile inviare la tua risposta. Riprova.\",\n \"tooShort\": \"Scrivi almeno un breve messaggio.\",\n \"closedTitle\": \"Questo ticket è chiuso\",\n \"closedBody\": \"Aprine uno nuovo se ti serve ancora aiuto.\",\n \"loadingThread\": \"Caricamento della conversazione\",\n \"noMessages\": \"Su questo ticket non ci sono ancora messaggi.\",\n \"fromYou\": \"Tu\",\n \"fromMerchant\": \"Negozio\",\n \"fromSystem\": \"Sistema\",\n \"untitled\": \"Richiesta di assistenza\"\n },\n \"settings\": {\n \"loading\": \"Caricamento delle tue impostazioni\",\n \"profileTitle\": \"Profilo\",\n \"emailLabel\": \"Email\",\n \"emailNote\": \"La tua email è ciò che ti fa accedere, quindi viene cambiata dal negozio e non da qui.\",\n \"nameLabel\": \"Nome\",\n \"nameTooShort\": \"Inserisci il tuo nome.\",\n \"saveProfile\": \"Salva le modifiche\",\n \"savingProfile\": \"Salvataggio…\",\n \"profileSaved\": \"Il tuo nome è stato aggiornato.\",\n \"profileFailed\": \"Non è stato possibile salvare il tuo nome. Riprova.\",\n \"uploadAvatar\": \"Carica una foto\",\n \"uploadingAvatar\": \"Caricamento…\",\n \"removeAvatar\": \"Rimuovi la foto\",\n \"removingAvatar\": \"Rimozione…\",\n \"avatarHint\": \"JPG, PNG, GIF o WebP, fino a 10 MB.\",\n \"avatarFailed\": \"Non è stato possibile caricare la tua foto. Riprova.\",\n \"avatarRemoveFailed\": \"Non è stato possibile rimuovere la tua foto. Riprova.\",\n \"avatarTooLarge\": \"Questa immagine supera i 10 MB.\",\n \"emailsTitle\": \"Email del negozio\",\n \"emailsLoading\": \"Caricamento delle impostazioni email\",\n \"unsubscribeAll\": \"Nessuna email di marketing\",\n \"unsubscribeAllNote\": \"Le email su ordini e consegne vengono inviate comunque.\",\n \"listsEmpty\": \"Questo negozio non ha liste di distribuzione.\",\n \"emailsFailed\": \"Non è stato possibile caricare le tue impostazioni email.\",\n \"emailsSaveFailed\": \"Non è stato possibile salvare questa impostazione. Riprova.\",\n \"devicesTitle\": \"Dispositivi connessi\",\n \"devicesLoading\": \"Caricamento dei tuoi dispositivi\",\n \"devicesEmpty\": \"Nessun altro dispositivo è connesso.\",\n \"thisDevice\": \"Questo dispositivo\",\n \"signedInOn\": \"Accesso il {date}\",\n \"unknownDevice\": \"Dispositivo sconosciuto\",\n \"signOutDevice\": \"Disconnetti\",\n \"signingOutDevice\": \"Disconnessione…\",\n \"signOutOthers\": \"Disconnetti tutti gli altri dispositivi\",\n \"signOutOthersDone\": \"Tutti gli altri dispositivi sono stati disconnessi.\",\n \"devicesFailed\": \"Non è stato possibile caricare i tuoi dispositivi.\",\n \"signOutDeviceFailed\": \"Non è stato possibile disconnettere questo dispositivo. Riprova.\",\n \"deviceOn\": \"{browser} su {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Aggiungi credito\",\n \"minimum\": \"Minimo {min}\",\n \"bounds\": \"Da {min} a {max}\",\n \"bonus\": \"Aggiungi almeno {amount} e ottieni il {percent}% in più\",\n \"amount\": \"Importo\",\n \"submit\": \"Continua al pagamento\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Il programma rivenditori non è disponibile\",\n \"disabledBody\": \"Questo negozio non accetta ordini all'ingrosso in questo momento.\",\n \"openTitle\": \"Partecipa al programma rivenditori\",\n \"openBody\": \"Partecipa ora per acquistare i prodotti del negozio a prezzi all'ingrosso.\",\n \"join\": \"Partecipa ora\",\n \"manualTitle\": \"Accetta l'invito da rivenditore\",\n \"manualBody\": \"Inserisci il token di invito inviato dal negozio.\",\n \"inviteToken\": \"Token di invito\",\n \"acceptInvite\": \"Accetta invito\",\n \"applicationTitle\": \"Candidati come rivenditore\",\n \"applicationBody\": \"Presenta la tua attività al negozio e invia la candidatura.\",\n \"applicationNote\": \"Nota della candidatura\",\n \"noteRequired\": \"Aggiungi una nota prima di inviare la candidatura.\",\n \"apply\": \"Invia candidatura\",\n \"pendingTitle\": \"La tua candidatura è in attesa\",\n \"pendingBody\": \"Il negozio esaminerà la candidatura prima di attivare l'accesso all'ingrosso.\",\n \"rejectedTitle\": \"La tua candidatura è stata rifiutata\",\n \"rejectedBody\": \"Contatta il negozio per maggiori informazioni o per candidarti di nuovo.\",\n \"suspendedTitle\": \"Il tuo account rivenditore è sospeso\",\n \"suspendedBody\": \"Gli ordini all'ingrosso non sono disponibili. Contatta il negozio per ricevere assistenza.\",\n \"activeTitle\": \"Account all'ingrosso\",\n \"tier\": \"Livello\",\n \"walletTitle\": \"Saldo all'ingrosso\",\n \"balance\": \"Saldo\",\n \"held\": \"Trattenuto\",\n \"catalogTitle\": \"Catalogo all'ingrosso\",\n \"search\": \"Cerca prodotti\",\n \"catalogEmptyTitle\": \"Nessun prodotto all'ingrosso trovato\",\n \"catalogEmptyBody\": \"Prova un'altra ricerca o torna dopo che il negozio avrà aggiunto prodotti.\",\n \"volumePricing\": \"Prezzi per quantità disponibili\",\n \"supplierBacked\": \"Evaso dal fornitore\",\n \"add\": \"Aggiungi\",\n \"basketTitle\": \"Carrello all'ingrosso\",\n \"basketEmpty\": \"Aggiungi un prodotto dal catalogo all'ingrosso per iniziare un ordine.\",\n \"quantity\": \"Quantità\",\n \"basketNeedsQuote\": \"Calcola questo carrello per vedere il totale aggiornato prima dell'ordine.\",\n \"quote\": \"Calcola carrello\",\n \"place\": \"Effettua ordine\",\n \"ordersTitle\": \"Ordini all'ingrosso\",\n \"ordersEmptyTitle\": \"Nessun ordine all'ingrosso\",\n \"ordersEmptyBody\": \"Gli ordini pagati con il saldo all'ingrosso vengono mostrati qui.\",\n \"refunded\": \"Rimborsato sul saldo\",\n \"lineQuantity\": \"Quantità {count}\",\n \"serials\": \"Seriali consegnati\",\n \"apiKeysTitle\": \"Chiavi API rivenditore\",\n \"apiKeyName\": \"Nome della chiave\",\n \"createApiKey\": \"Crea chiave\",\n \"apiKeysEmpty\": \"Non hai creato chiavi API rivenditore.\",\n \"orderElsewhere\": \"Gli ordini all’ingrosso passano dall’API rivenditore, non da questa pagina.\",\n \"keysElsewhere\": \"Le chiavi API le rilascia il negozio. Chiedigliene una.\",\n \"apiKeyCreatedTitle\": \"Copia subito questa chiave\",\n \"apiKeyCreatedBody\": \"Questa chiave in chiaro viene mostrata una sola volta e non può essere recuperata in seguito.\",\n \"dismissKey\": \"L'ho salvata\",\n \"lastUsed\": \"Ultimo utilizzo: {date}\",\n \"neverUsed\": \"Mai utilizzata\",\n \"revokeApiKey\": \"Revoca\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Kopijuoti\",\n \"copied\": \"Nukopijuota\",\n \"retry\": \"Bandykite dar kartą\",\n \"notLoaded\": \"Šis turinys neįsikėlė\",\n \"genericError\": \"Nepavyko to įkelti. Po akimirkos bandykite dar kartą.\",\n \"browseStore\": \"Naršyti parduotuvę\",\n \"unavailable\": \"Nepasiekiama\",\n \"cancel\": \"Atšaukti\"\n },\n \"account\": {\n \"title\": \"Jūsų paskyra\",\n \"sections\": \"Paskyros skiltys\",\n \"signOut\": \"Atsijungti\",\n \"signingOut\": \"Atsijungiama…\",\n \"signOutFailed\": \"Nepavyko atsijungti. Bandykite dar kartą.\",\n \"checkingSession\": \"Tikriname jūsų seansą\",\n \"sessionUnknown\": \"Nepavyko patikrinti jūsų seanso. Po akimirkos bandykite dar kartą.\",\n \"goToOverview\": \"Eiti į apžvalgą\",\n \"tabs\": {\n \"overview\": \"Apžvalga\",\n \"orders\": \"Užsakymai\",\n \"downloads\": \"Atsisiuntimai\",\n \"subscriptions\": \"Prenumeratos\",\n \"rewards\": \"Apdovanojimai\",\n \"referrals\": \"Rekomendacijos\",\n \"favorites\": \"Mėgstami\",\n \"support\": \"Pagalba\",\n \"settings\": \"Nustatymai\",\n \"reseller\": \"Perpardavėjas\"\n },\n \"notBuilt\": {\n \"title\": \"Skilties „{tab}“ šioje parduotuvėje nėra\",\n \"body\": \"Ši parduotuvė tokios skilties nesiūlo. Jūsų užsakymai ir paskyros duomenys tebėra čia.\"\n },\n \"unknownTab\": {\n \"title\": \"Ši nuoroda niekur neveda\",\n \"body\": \"Adrese nurodyta paskyros skiltis, kurios nėra. Galbūt jis įvestas su klaida arba nukirstas.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Prisijunkite prie savo paskyros\",\n \"titleCode\": \"Patikrinkite el. paštą\",\n \"introEmail\": \"Į jūsų el. pašto adresą siunčiame vienkartinį kodą. Jokio slaptažodžio prisiminti nereikia.\",\n \"introCode\": \"Įveskite kodą, kurį išsiuntėme adresu {email}.\",\n \"emailLabel\": \"El. paštas\",\n \"codeLabel\": \"Prisijungimo kodas\",\n \"invalidEmail\": \"Įveskite visą el. pašto adresą, pvz., jus@pavyzdys.lt.\",\n \"missingCode\": \"Įveskite kodą iš savo el. laiško.\",\n \"send\": \"Atsiųsti kodą\",\n \"sending\": \"Siunčiama…\",\n \"submit\": \"Prisijungti\",\n \"submitting\": \"Tikrinama…\",\n \"resend\": \"Siųsti naują kodą\",\n \"resent\": \"Naujas kodas jau keliauja adresu {email}.\",\n \"changeEmail\": \"Naudoti kitą el. paštą\",\n \"sendFailed\": \"Nepavyko išsiųsti kodo. Po akimirkos bandykite dar kartą.\",\n \"verifyFailed\": \"Šis kodas nepriimtas. Bandykite dar kartą.\"\n },\n \"status\": {\n \"COMPLETED\": \"Įvykdyta\",\n \"PROCESSING\": \"Vykdoma\",\n \"AWAITING_STOCK\": \"Laukiama atsargų\",\n \"PENDING\": \"Laukiama\",\n \"PENDING_PAYMENT\": \"Laukiama apmokėjimo\",\n \"UNDERPAID\": \"Sumokėta per mažai\",\n \"DISPUTED\": \"Ginčijama\",\n \"REFUNDED\": \"Grąžinti pinigai\",\n \"PARTIAL_REFUND\": \"Grąžinta dalis\",\n \"VOIDED\": \"Anuliuota\",\n \"EXPIRED\": \"Nebegalioja\",\n \"ACTIVE\": \"Aktyvi\",\n \"INACTIVE\": \"Neaktyvi\",\n \"SUSPENDED\": \"Sustabdyta\",\n \"REVOKED\": \"Panaikinta\",\n \"TRIALING\": \"Bandomasis laikotarpis\",\n \"PAUSED\": \"Pristabdyta\",\n \"PAST_DUE\": \"Pradelsta\",\n \"UNPAID\": \"Neapmokėta\",\n \"INCOMPLETE\": \"Nebaigta\",\n \"CANCELED\": \"Atšaukta\",\n \"CANCELLED\": \"Atšaukta\",\n \"OPEN\": \"Atvira\",\n \"CLOSED\": \"Uždaryta\",\n \"RESOLVED\": \"Išspręsta\",\n \"AWAITING_REPLY\": \"Laukiama jūsų atsakymo\",\n \"APPROVED\": \"Patvirtinta\",\n \"REJECTED\": \"Atmesta\",\n \"REQUESTED\": \"Paprašyta\",\n \"CONVERTED\": \"Konvertuota\",\n \"PAID\": \"Apmokėta\",\n \"FAILED\": \"Nepavyko\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Pristatyta\",\n \"AWAITING_FULFILLMENT\": \"Laukiama įvykdymo\",\n \"PENDING\": \"Laukiama\",\n \"FAILED\": \"Pristatyti nepavyko\"\n },\n \"overview\": {\n \"loading\": \"Įkeliama jūsų paskyra\",\n \"signedInAs\": \"Prisijungta kaip\",\n \"statOrders\": \"Užsakymai\",\n \"statLicenses\": \"Licencijos\",\n \"statDownloads\": \"Atsisiuntimai\",\n \"statTickets\": \"Pagalbos užklausos\",\n \"walletLabel\": \"Parduotuvės kreditas\",\n \"walletNote\": \"Pritaikoma atsiskaitant\",\n \"recentOrders\": \"Naujausi užsakymai\",\n \"allOrders\": \"Visi užsakymai\"\n },\n \"orders\": {\n \"loading\": \"Įkeliami jūsų užsakymai\",\n \"emptyTitle\": \"Užsakymų dar nėra\",\n \"emptyBody\": \"Jūsų pirkiniai iš šios parduotuvės atsiras čia, vos tik pateiksite pirmą užsakymą.\",\n \"movedTitle\": \"Šiame puslapyje nieko nėra\",\n \"movedBody\": \"Šie užsakymai pasislinko, kol į juos žiūrėjote.\",\n \"backToFirstPage\": \"Grįžti į pirmą puslapį\",\n \"pagesLabel\": \"Užsakymų istorijos puslapiai\",\n \"previous\": \"Atgal\",\n \"next\": \"Pirmyn\",\n \"page\": \"{page} puslapis\",\n \"andMoreOne\": \"ir dar viena prekė\",\n \"andMoreOther\": \"ir dar {count} prekių\",\n \"fallbackTitle\": \"Užsakymas {id}\",\n \"allOrders\": \"Visi užsakymai\",\n \"loadingOne\": \"Įkeliamas šis užsakymas\",\n \"detailTitle\": \"Užsakymas {id}\",\n \"subtotal\": \"Tarpinė suma\",\n \"discount\": \"Nuolaida\",\n \"tax\": \"Mokesčiai\",\n \"total\": \"Iš viso\",\n \"paidWith\": \"Apmokėjimo būdas\",\n \"deliveryTitle\": \"Jūsų pristatymas\",\n \"replacement\": \"Pakeitimas\",\n \"search\": \"Ieškoti užsakymų\",\n \"searchPlaceholder\": \"Ieškoti pagal sąskaitos numerį\",\n \"status\": \"Būsena\",\n \"statusAll\": \"Visos būsenos\",\n \"statusCompleted\": \"Įvykdytas\",\n \"statusPending\": \"Laukiama\",\n \"statusProcessing\": \"Vykdomas\",\n \"statusRefunded\": \"Grąžinta\",\n \"statusDisputed\": \"Ginčijamas\",\n \"statusExpired\": \"Nebegalioja\",\n \"emptyFiltered\": \"Atitinkančių užsakymų nėra. Pabandykite kitą sąskaitos numerį ar būseną.\",\n \"warrantyTitle\": \"Garantija\",\n \"warrantyCoveredUntil\": \"Galioja iki {date}\",\n \"warrantyEnded\": \"Garantija baigėsi {date}\",\n \"warrantyCancelled\": \"Garantija atšaukta\",\n \"warrantyClaimSubmitted\": \"Prašymas pateiktas\",\n \"warrantyClaimApproved\": \"Prašymas patvirtintas\",\n \"warrantyClaimDeclined\": \"Prašymas atmestas\",\n \"warrantyClaimStart\": \"Pateikti prašymą\",\n \"warrantyClaimLabel\": \"Kas nutiko?\",\n \"warrantyClaimOptional\": \"Neprivaloma\",\n \"warrantyClaimSend\": \"Siųsti prašymą\",\n \"warrantyClaimSending\": \"Siunčiama…\",\n \"warrantyClaimDone\": \"Parduotuvė gavo jūsų prašymą. Atsakymas ateis el. paštu.\",\n \"warrantyClaimFailed\": \"Jūsų prašymo išsiųsti nepavyko.\"\n },\n \"downloads\": {\n \"loading\": \"Įkeliami jūsų atsisiuntimai\",\n \"emptyTitle\": \"Kol kas nėra ko atsisiųsti\",\n \"emptyBody\": \"Failai, raktai ir prieigos nuorodos atsiras čia, kai užsakymas bus įvykdytas.\",\n \"licensesTitle\": \"Licencijų raktai\",\n \"filesTitle\": \"Failai\",\n \"codesTitle\": \"Kodai ir nuorodos\",\n \"download\": \"Atsisiųsti\",\n \"openLink\": \"Atidaryti nuorodą\",\n \"viewOrder\": \"Peržiūrėti užsakymą\",\n \"expires\": \"Galioja iki {date}\",\n \"neverExpires\": \"Be pabaigos datos\",\n \"lockedTo\": \"Susieta su {hardwareId}\",\n \"resetHwid\": \"Atsieti įrenginio ID\",\n \"resettingHwid\": \"Atsiejama…\",\n \"hwidResetDone\": \"Įrenginio ID išvalytas. Kitas aktyvavimas priskirs šią licenciją.\",\n \"hwidResetFailed\": \"Nepavyko atsieti įrenginio ID. Bandykite dar kartą.\",\n \"renewTitle\": \"Galima pratęsti\",\n \"renewBody\": \"Pratęsimas yra pirkinys, todėl jis atliekamas atsiskaitant, o ne šiame puslapyje.\",\n \"renewAction\": \"Atidaryti parduotuvę\",\n \"brokenTitle\": \"Nepavyko išvardyti jūsų atsisiuntimų\",\n \"brokenBody\": \"Parduotuvė atsiuntė licencijos įrašą ({id}) be pačios licencijos, tad šiame sąraše trūktų būtent to, ką jis įvardija.\",\n \"brokenFileBody\": \"Parduotuvė atsiuntė failo įrašą ({id}), kuriame nėra ko atsisiųsti, tad sąrašas įvardytų failą, kurio negali pateikti.\"\n },\n \"subscriptions\": {\n \"loading\": \"Įkeliamos jūsų prenumeratos\",\n \"emptyTitle\": \"Prenumeratų dar nėra\",\n \"emptyBody\": \"Pasikartojantys pirkiniai atsiras čia, kai pradėsite pirmąjį.\",\n \"allSubscriptions\": \"Visos prenumeratos\",\n \"unnamedPlan\": \"Prenumerata\",\n \"renews\": \"Atsinaujina {date}\",\n \"ends\": \"Baigiasi {date}\",\n \"canceled\": \"Atšaukta {date}\",\n \"startedOn\": \"Pradėta {date}\",\n \"billingDayOne\": \"Apmokestinama kasdien\",\n \"billingDayOther\": \"Apmokestinama kas {count} dienų\",\n \"billingWeekOne\": \"Apmokestinama kas savaitę\",\n \"billingWeekOther\": \"Apmokestinama kas {count} savaičių\",\n \"billingMonthOne\": \"Apmokestinama kas mėnesį\",\n \"billingMonthOther\": \"Apmokestinama kas {count} mėnesių\",\n \"billingYearOne\": \"Apmokestinama kasmet\",\n \"billingYearOther\": \"Apmokestinama kas {count} metų\",\n \"billingOther\": \"Apmokestinama kas {count} × {interval}\",\n \"gateway\": \"Mokėjimų teikėjas\",\n \"paymentMethod\": \"Mokėjimo būdas\",\n \"cardOnFile\": \"{brand}, paskutiniai skaitmenys {last4}\",\n \"noPaymentMethod\": \"Nėra išsaugoto\",\n \"paymentMethodElsewhere\": \"Nuoroda mokėjimo duomenims pakeisti ateina pačios parduotuvės el. laiškuose. Čia ji neteikiama, nes bet kas šiame puslapyje galėtų ją perimti.\",\n \"pause\": \"Pristabdyti\",\n \"pausing\": \"Pristabdoma…\",\n \"resume\": \"Tęsti\",\n \"resuming\": \"Tęsiama…\",\n \"cancel\": \"Atšaukti prenumeratą\",\n \"cancelling\": \"Atšaukiama…\",\n \"keep\": \"Palikti\",\n \"confirmCancelTitle\": \"Atšaukti šią prenumeratą?\",\n \"confirmCancelAtPeriodEnd\": \"Prieiga išliks iki {date}. Po to niekas nebus nuskaičiuota.\",\n \"confirmCancelNow\": \"Prieiga baigsis iškart po atšaukimo.\",\n \"actionFailed\": \"Nepavyko atlikti. Bandykite dar kartą.\",\n \"paused\": \"Ši prenumerata pristabdyta.\",\n \"resumed\": \"Ši prenumerata vėl veikia.\",\n \"cancelled\": \"Ši prenumerata atšaukta.\",\n \"historyTitle\": \"Mokėjimų istorija\",\n \"historyLoading\": \"Įkeliama mokėjimų istorija\",\n \"historyEmptyTitle\": \"Mokėjimų istorijos dar nėra\",\n \"historyEmptyBody\": \"Atnaujinimo sąskaitos atsiras čia po pirmojo ciklo.\",\n \"trial\": \"Bandomasis laikotarpis baigiasi {date}\"\n },\n \"favorites\": {\n \"loading\": \"Įkeliami jūsų mėgstami\",\n \"emptyTitle\": \"Mėgstamų dar nėra\",\n \"emptyBody\": \"Prekės, kurias išsaugote naršydami parduotuvę, laikomos čia.\",\n \"added\": \"Išsaugota {date}\",\n \"gone\": \"Nebeprieinama\",\n \"view\": \"Peržiūrėti parduotuvėje\",\n \"remove\": \"Pašalinti\",\n \"removing\": \"Šalinama…\",\n \"removeFailed\": \"Nepavyko pašalinti iš mėgstamų. Bandykite dar kartą.\",\n \"noImage\": \"Prekei {title} nuotraukos nėra\"\n },\n \"rewards\": {\n \"loading\": \"Įkeliami jūsų apdovanojimai\",\n \"available\": \"Galima naudoti\",\n \"pending\": \"Vykdoma\",\n \"lifetime\": \"Iš viso uždirbta\",\n \"couponsTitle\": \"Jūsų kuponai\",\n \"couponsBody\": \"Įklijuokite vieną iš jų atsiskaitydami.\",\n \"percentOff\": \"{percent} % nuolaida\",\n \"couponGeneric\": \"Nuolaidos kuponas\",\n \"expiresOn\": \"Galioja iki {date}\",\n \"activityTitle\": \"Veikla\",\n \"emptyTitle\": \"Apdovanojimų dar nėra\",\n \"emptyBody\": \"Įvykdykite užsakymą arba palikite atsiliepimą, kad pradėtumėte uždirbti.\",\n \"storeCredit\": \"{amount} parduotuvės kredito\",\n \"storeCreditGeneric\": \"Parduotuvės kreditas\",\n \"couponNamed\": \"Kuponas {code}\",\n \"couponUnnamed\": \"Kupono kodas\",\n \"otherReward\": \"Apdovanojimas\",\n \"reasonOrderCompleted\": \"Užsakymas įvykdytas\",\n \"reasonOrderCount\": \"Lojalumo riba\",\n \"reasonSpendAmount\": \"Bendra išleista suma\",\n \"reasonReview\": \"Paliktas atsiliepimas\",\n \"reasonFirstPurchase\": \"Pirmas pirkinys\",\n \"reasonOther\": \"Apdovanojimas\",\n \"grantFulfilled\": \"Uždirbta\",\n \"grantPending\": \"Vykdoma\",\n \"grantFailed\": \"Nepavyko\",\n \"grantRevoked\": \"Panaikinta\",\n \"pointsTitle\": \"Taškai\",\n \"pointsBalance\": \"Taškų likutis\",\n \"pointsLifetime\": \"Iš viso surinkta\",\n \"pointsEarnHint\": \"Įvykdykite užsakymą, kad pradėtumėte rinkti taškus.\",\n \"pointsActivityTitle\": \"Taškų istorija\",\n \"pointsFromOrder\": \"Užsakymas įvykdytas\",\n \"pointsFromReview\": \"Paliktas atsiliepimas\",\n \"pointsConverted\": \"Iškeista į parduotuvės kreditą\",\n \"pointsAdjusted\": \"Pakoreguota parduotuvės\",\n \"redeemTitle\": \"Iškeisti taškus\",\n \"redeemBody\": \"Iškeiskite taškus į parduotuvės kreditą ir atsiskaitykite juo užsakydami.\",\n \"redeemLabel\": \"Iškeičiami taškai\",\n \"redeemMinimum\": \"Iškeiskite bent {points} taškų.\",\n \"redeemOverBalance\": \"Turite {points} taškų.\",\n \"redeemInvalid\": \"Įveskite sveikąjį taškų skaičių.\",\n \"redeemPreview\": \"Vertė – apie {amount} parduotuvės kredito.\",\n \"redeemContinue\": \"Tęsti\",\n \"redeemConfirm\": \"Iškeisti {points} taškų į maždaug {amount} parduotuvės kredito?\",\n \"redeemConfirmAction\": \"Taip, iškeisti\",\n \"redeemWorking\": \"Keičiama…\",\n \"redeemDone\": \"{amount} pridėta prie jūsų parduotuvės kredito.\",\n \"redeemFailed\": \"Jūsų taškų iškeisti nepavyko.\"\n },\n \"referrals\": {\n \"loading\": \"Įkeliamos jūsų rekomendacijos\",\n \"notEnrolledTitle\": \"Jūs nedalyvaujate rekomendacijų programoje\",\n \"notEnrolledBody\": \"Parduotuvė jūsų neįtraukė, tad kol kas nėra kuo dalytis ir ko stebėti.\",\n \"availableLabel\": \"Galima atsiimti\",\n \"pendingLabel\": \"Laukiama\",\n \"requestedLabel\": \"Paprašyta\",\n \"payoutsElsewhere\": \"Atsiėmimus ir išmokas tvarko parduotuvė, o ne šis puslapis.\",\n \"codesAccepted\": \"Jūsų kodas priimamas atsiskaitant.\",\n \"codesNotAccepted\": \"Šiuo metu ši parduotuvė nepriima rekomendacijų kodų atsiskaitant.\",\n \"linksTitle\": \"Jūsų nuorodos\",\n \"linksEmptyTitle\": \"Rekomendacijų nuorodų dar nėra\",\n \"linksEmptyBody\": \"Nuorodas, kuriomis dalijatės, sukuria parduotuvė. Paprašykite jos, jei tikėjotės rasti nuorodą čia.\",\n \"primary\": \"Pagrindinė\",\n \"commission\": \"{percent} % komisinių\",\n \"buyerDiscount\": \"{percent} % nuolaida pirkėjui\",\n \"awaitingApproval\": \"Laukiama, kol parduotuvė patvirtins šią nuorodą.\",\n \"clicks\": \"Paspaudimai\",\n \"sales\": \"Pardavimai\",\n \"revenue\": \"Pajamos\",\n \"commissionsTitle\": \"Komisiniai\",\n \"commissionsEmptyTitle\": \"Komisinių dar nėra\",\n \"commissionsEmptyBody\": \"Patvirtinti rekomenduoti pardavimai atsiras čia.\",\n \"commissionFor\": \"Užsakymas {id}\",\n \"balanceTitle\": \"Likučio judėjimas\",\n \"balanceEmptyTitle\": \"Likučio judėjimo dar nėra\",\n \"balanceEmptyBody\": \"Konvertavimai ir išmokos atsiras čia.\",\n \"claimStoreCredit\": \"Parduotuvės kreditas\",\n \"claimCryptoPayout\": \"Išmoka kriptovaliuta\",\n \"claimAdjustment\": \"Koregavimas\",\n \"differentCurrency\": \"Jūsų rekomendacijų likutis laikomas {currency} valiuta.\",\n \"convertedLabel\": \"Perkelta į parduotuvės kreditą\",\n \"paidLabel\": \"Išmokėta\"\n },\n \"support\": {\n \"loading\": \"Įkeliamos jūsų užklausos\",\n \"ticketsTitle\": \"Jūsų užklausos\",\n \"emptyTitle\": \"Užklausų dar nėra\",\n \"emptyBody\": \"Rašykite parduotuvei čia – visi atsakymai liks šiame puslapyje.\",\n \"newTicket\": \"Nauja užklausa\",\n \"backToTickets\": \"Visos užklausos\",\n \"updated\": \"Atnaujinta {date}\",\n \"aboutOrder\": \"Dėl užsakymo {id}\",\n \"subjectLabel\": \"Tema\",\n \"subjectOptional\": \"Neprivaloma\",\n \"messageLabel\": \"Žinutė\",\n \"replyLabel\": \"Jūsų atsakymas\",\n \"create\": \"Siųsti parduotuvei\",\n \"creating\": \"Siunčiama…\",\n \"createFailed\": \"Nepavyko sukurti jūsų užklausos. Bandykite dar kartą.\",\n \"reply\": \"Siųsti atsakymą\",\n \"replying\": \"Siunčiama…\",\n \"replyFailed\": \"Nepavyko išsiųsti jūsų atsakymo. Bandykite dar kartą.\",\n \"tooShort\": \"Parašykite bent trumpą žinutę.\",\n \"closedTitle\": \"Ši užklausa uždaryta\",\n \"closedBody\": \"Sukurkite naują, jei vis dar reikia pagalbos.\",\n \"loadingThread\": \"Įkeliamas šis pokalbis\",\n \"noMessages\": \"Šioje užklausoje dar nėra žinučių.\",\n \"fromYou\": \"Jūs\",\n \"fromMerchant\": \"Parduotuvė\",\n \"fromSystem\": \"Sistema\",\n \"untitled\": \"Pagalbos užklausa\"\n },\n \"settings\": {\n \"loading\": \"Įkeliami jūsų nustatymai\",\n \"profileTitle\": \"Profilis\",\n \"emailLabel\": \"El. paštas\",\n \"emailNote\": \"Būtent el. paštu jūs prisijungiate, todėl jį keičia parduotuvė, o ne jūs šiame puslapyje.\",\n \"nameLabel\": \"Vardas\",\n \"nameTooShort\": \"Įveskite savo vardą.\",\n \"saveProfile\": \"Išsaugoti pakeitimus\",\n \"savingProfile\": \"Išsaugoma…\",\n \"profileSaved\": \"Jūsų vardas atnaujintas.\",\n \"profileFailed\": \"Nepavyko išsaugoti jūsų vardo. Bandykite dar kartą.\",\n \"uploadAvatar\": \"Įkelti nuotrauką\",\n \"uploadingAvatar\": \"Įkeliama…\",\n \"removeAvatar\": \"Pašalinti nuotrauką\",\n \"removingAvatar\": \"Šalinama…\",\n \"avatarHint\": \"JPG, PNG, GIF arba WebP, iki 10 MB.\",\n \"avatarFailed\": \"Nepavyko įkelti jūsų nuotraukos. Bandykite dar kartą.\",\n \"avatarRemoveFailed\": \"Nepavyko pašalinti jūsų nuotraukos. Bandykite dar kartą.\",\n \"avatarTooLarge\": \"Šis vaizdas didesnis nei 10 MB.\",\n \"emailsTitle\": \"Parduotuvės laiškai\",\n \"emailsLoading\": \"Įkeliami el. laiškų nustatymai\",\n \"unsubscribeAll\": \"Jokių rinkodaros laiškų\",\n \"unsubscribeAllNote\": \"Laiškai apie užsakymus ir pristatymą siunčiami bet kuriuo atveju.\",\n \"listsEmpty\": \"Ši parduotuvė neturi laiškų sąrašų.\",\n \"emailsFailed\": \"Nepavyko įkelti el. laiškų nustatymų.\",\n \"emailsSaveFailed\": \"Nepavyko išsaugoti šio nustatymo. Bandykite dar kartą.\",\n \"devicesTitle\": \"Prisijungę įrenginiai\",\n \"devicesLoading\": \"Įkeliami jūsų įrenginiai\",\n \"devicesEmpty\": \"Joks kitas įrenginys nėra prisijungęs.\",\n \"thisDevice\": \"Šis įrenginys\",\n \"signedInOn\": \"Prisijungta {date}\",\n \"unknownDevice\": \"Nežinomas įrenginys\",\n \"signOutDevice\": \"Atjungti\",\n \"signingOutDevice\": \"Atjungiama…\",\n \"signOutOthers\": \"Atjungti visus kitus įrenginius\",\n \"signOutOthersDone\": \"Visi kiti įrenginiai atjungti.\",\n \"devicesFailed\": \"Nepavyko įkelti jūsų įrenginių.\",\n \"signOutDeviceFailed\": \"Nepavyko atjungti šio įrenginio. Bandykite dar kartą.\",\n \"deviceOn\": \"{browser} sistemoje {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Papildyti parduotuvės kreditą\",\n \"minimum\": \"Mažiausiai {min}\",\n \"bounds\": \"Nuo {min} iki {max}\",\n \"bonus\": \"Papildykite bent {amount} ir gaukite {percent}% daugiau\",\n \"amount\": \"Suma\",\n \"submit\": \"Tęsti į mokėjimą\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Perpardavėjų programa nepasiekiama\",\n \"disabledBody\": \"Ši parduotuvė šiuo metu nepriima didmeninių užsakymų.\",\n \"openTitle\": \"Prisijungti prie perpardavėjų programos\",\n \"openBody\": \"Prisijunkite ir pirkite šios parduotuvės produktus didmeninėmis kainomis.\",\n \"join\": \"Prisijungti dabar\",\n \"manualTitle\": \"Priimti perpardavėjo kvietimą\",\n \"manualBody\": \"Įveskite parduotuvės atsiųstą kvietimo žetoną.\",\n \"inviteToken\": \"Kvietimo žetonas\",\n \"acceptInvite\": \"Priimti kvietimą\",\n \"applicationTitle\": \"Pateikti perpardavėjo paraišką\",\n \"applicationBody\": \"Papasakokite parduotuvei apie savo verslą ir pateikite paraišką.\",\n \"applicationNote\": \"Paraiškos pastaba\",\n \"noteRequired\": \"Prieš pateikdami paraišką pridėkite pastabą.\",\n \"apply\": \"Pateikti paraišką\",\n \"pendingTitle\": \"Jūsų paraiška nagrinėjama\",\n \"pendingBody\": \"Parduotuvė peržiūrės paraišką prieš įjungdama didmeninę prieigą.\",\n \"rejectedTitle\": \"Jūsų perpardavėjo paraiška atmesta\",\n \"rejectedBody\": \"Susisiekite su parduotuve dėl informacijos arba pakartotinės paraiškos.\",\n \"suspendedTitle\": \"Jūsų perpardavėjo paskyra sustabdyta\",\n \"suspendedBody\": \"Didmeniniai užsakymai nepasiekiami. Kreipkitės pagalbos į parduotuvę.\",\n \"activeTitle\": \"Didmeninė paskyra\",\n \"tier\": \"Lygis\",\n \"walletTitle\": \"Didmeninis likutis\",\n \"balance\": \"Likutis\",\n \"held\": \"Rezervuota\",\n \"catalogTitle\": \"Didmeninis katalogas\",\n \"search\": \"Ieškoti produktų\",\n \"catalogEmptyTitle\": \"Didmeninių produktų nerasta\",\n \"catalogEmptyBody\": \"Bandykite kitą paiešką arba grįžkite parduotuvei pridėjus produktų.\",\n \"volumePricing\": \"Galimos kiekio kainos\",\n \"supplierBacked\": \"Pristato tiekėjas\",\n \"add\": \"Pridėti\",\n \"basketTitle\": \"Didmeninis krepšelis\",\n \"basketEmpty\": \"Pridėkite produktą iš didmeninio katalogo, kad pradėtumėte užsakymą.\",\n \"quantity\": \"Kiekis\",\n \"basketNeedsQuote\": \"Įkainokite krepšelį, kad prieš užsakydami matytumėte dabartinę sumą.\",\n \"quote\": \"Įkainoti krepšelį\",\n \"place\": \"Pateikti užsakymą\",\n \"ordersTitle\": \"Didmeniniai užsakymai\",\n \"ordersEmptyTitle\": \"Didmeninių užsakymų dar nėra\",\n \"ordersEmptyBody\": \"Didmeniniu likučiu apmokėti užsakymai rodomi čia.\",\n \"refunded\": \"Grąžinta į likutį\",\n \"lineQuantity\": \"Kiekis {count}\",\n \"serials\": \"Pristatyti serijos numeriai\",\n \"apiKeysTitle\": \"Perpardavėjo API raktai\",\n \"apiKeyName\": \"Rakto pavadinimas\",\n \"createApiKey\": \"Sukurti raktą\",\n \"apiKeysEmpty\": \"Dar nesukūrėte perpardavėjo API raktų.\",\n \"orderElsewhere\": \"Didmeniniai užsakymai teikiami per prekiautojo API, ne šiame puslapyje.\",\n \"keysElsewhere\": \"API raktus išduoda parduotuvė. Paprašykite jų.\",\n \"apiKeyCreatedTitle\": \"Nukopijuokite šį raktą dabar\",\n \"apiKeyCreatedBody\": \"Šis atviras raktas rodomas vieną kartą ir vėliau negali būti atkurtas.\",\n \"dismissKey\": \"Išsaugojau\",\n \"lastUsed\": \"Paskutinį kartą naudota {date}\",\n \"neverUsed\": \"Niekada nenaudota\",\n \"revokeApiKey\": \"Atšaukti\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Kopiëren\",\n \"copied\": \"Gekopieerd\",\n \"retry\": \"Probeer opnieuw\",\n \"notLoaded\": \"Dit is niet geladen\",\n \"genericError\": \"Dit kon niet worden geladen. Probeer het zo meteen opnieuw.\",\n \"browseStore\": \"Naar de winkel\",\n \"unavailable\": \"Niet beschikbaar\",\n \"cancel\": \"Annuleren\"\n },\n \"account\": {\n \"title\": \"Je account\",\n \"sections\": \"Accountonderdelen\",\n \"signOut\": \"Uitloggen\",\n \"signingOut\": \"Bezig met uitloggen…\",\n \"signOutFailed\": \"Je kon niet worden uitgelogd. Probeer het opnieuw.\",\n \"checkingSession\": \"Je sessie wordt gecontroleerd\",\n \"sessionUnknown\": \"Je sessie kon niet worden gecontroleerd. Probeer het zo meteen opnieuw.\",\n \"goToOverview\": \"Naar het overzicht\",\n \"tabs\": {\n \"overview\": \"Overzicht\",\n \"orders\": \"Bestellingen\",\n \"downloads\": \"Downloads\",\n \"subscriptions\": \"Abonnementen\",\n \"rewards\": \"Beloningen\",\n \"referrals\": \"Verwijzingen\",\n \"favorites\": \"Favorieten\",\n \"support\": \"Hulp\",\n \"settings\": \"Instellingen\",\n \"reseller\": \"Wederverkoop\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} hoort niet bij deze winkel\",\n \"body\": \"Deze winkel biedt dat onderdeel niet aan. Je bestellingen en accountgegevens staan hier nog steeds.\"\n },\n \"unknownTab\": {\n \"title\": \"Die link wijst nergens heen\",\n \"body\": \"Het adres noemt een accountonderdeel dat niet bestaat. Misschien is er een typefout gemaakt of is de link afgekapt.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Log in op je account\",\n \"titleCode\": \"Kijk in je e-mail\",\n \"introEmail\": \"We sturen een eenmalige code naar je e-mailadres. Je hoeft geen wachtwoord te onthouden.\",\n \"introCode\": \"Vul de code in die we naar {email} hebben gestuurd.\",\n \"emailLabel\": \"E-mail\",\n \"codeLabel\": \"Inlogcode\",\n \"invalidEmail\": \"Vul een volledig e-mailadres in, zoals jij@voorbeeld.nl.\",\n \"missingCode\": \"Vul de code uit je e-mail in.\",\n \"send\": \"Stuur me een code\",\n \"sending\": \"Versturen…\",\n \"submit\": \"Inloggen\",\n \"submitting\": \"Controleren…\",\n \"resend\": \"Stuur een nieuwe code\",\n \"resent\": \"Er is een nieuwe code onderweg naar {email}.\",\n \"changeEmail\": \"Ander e-mailadres gebruiken\",\n \"sendFailed\": \"De code kon niet worden verstuurd. Probeer het zo meteen opnieuw.\",\n \"verifyFailed\": \"Die code is niet geaccepteerd. Probeer het opnieuw.\"\n },\n \"status\": {\n \"COMPLETED\": \"Afgerond\",\n \"PROCESSING\": \"In behandeling\",\n \"AWAITING_STOCK\": \"Wacht op voorraad\",\n \"PENDING\": \"In afwachting\",\n \"PENDING_PAYMENT\": \"Wacht op betaling\",\n \"UNDERPAID\": \"Te weinig betaald\",\n \"DISPUTED\": \"Betwist\",\n \"REFUNDED\": \"Terugbetaald\",\n \"PARTIAL_REFUND\": \"Deels terugbetaald\",\n \"VOIDED\": \"Ongeldig gemaakt\",\n \"EXPIRED\": \"Verlopen\",\n \"ACTIVE\": \"Actief\",\n \"INACTIVE\": \"Inactief\",\n \"SUSPENDED\": \"Geblokkeerd\",\n \"REVOKED\": \"Ingetrokken\",\n \"TRIALING\": \"Proefperiode\",\n \"PAUSED\": \"Gepauzeerd\",\n \"PAST_DUE\": \"Achterstallig\",\n \"UNPAID\": \"Onbetaald\",\n \"INCOMPLETE\": \"Onvolledig\",\n \"CANCELED\": \"Geannuleerd\",\n \"CANCELLED\": \"Geannuleerd\",\n \"OPEN\": \"Open\",\n \"CLOSED\": \"Gesloten\",\n \"RESOLVED\": \"Opgelost\",\n \"AWAITING_REPLY\": \"Wacht op je antwoord\",\n \"APPROVED\": \"Goedgekeurd\",\n \"REJECTED\": \"Afgewezen\",\n \"REQUESTED\": \"Aangevraagd\",\n \"CONVERTED\": \"Omgezet\",\n \"PAID\": \"Betaald\",\n \"FAILED\": \"Mislukt\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Geleverd\",\n \"AWAITING_FULFILLMENT\": \"Wacht op levering\",\n \"PENDING\": \"In afwachting\",\n \"FAILED\": \"Levering mislukt\"\n },\n \"overview\": {\n \"loading\": \"Je account wordt geladen\",\n \"signedInAs\": \"Ingelogd als\",\n \"statOrders\": \"Bestellingen\",\n \"statLicenses\": \"Licenties\",\n \"statDownloads\": \"Downloads\",\n \"statTickets\": \"Supportvragen\",\n \"walletLabel\": \"Winkeltegoed\",\n \"walletNote\": \"Wordt bij het afrekenen verrekend\",\n \"recentOrders\": \"Recente bestellingen\",\n \"allOrders\": \"Alle bestellingen\"\n },\n \"orders\": {\n \"loading\": \"Je bestellingen worden geladen\",\n \"emptyTitle\": \"Nog geen bestellingen\",\n \"emptyBody\": \"Je aankopen in deze winkel verschijnen hier zodra je er een plaatst.\",\n \"movedTitle\": \"Niets op deze pagina\",\n \"movedBody\": \"Deze bestellingen zijn verschoven terwijl je ernaar keek.\",\n \"backToFirstPage\": \"Terug naar de eerste pagina\",\n \"pagesLabel\": \"Pagina's met bestelgeschiedenis\",\n \"previous\": \"Vorige\",\n \"next\": \"Volgende\",\n \"page\": \"Pagina {page}\",\n \"andMoreOne\": \"en nog één artikel\",\n \"andMoreOther\": \"en nog {count} artikelen\",\n \"fallbackTitle\": \"Bestelling {id}\",\n \"allOrders\": \"Alle bestellingen\",\n \"loadingOne\": \"Deze bestelling wordt geladen\",\n \"detailTitle\": \"Bestelling {id}\",\n \"subtotal\": \"Subtotaal\",\n \"discount\": \"Korting\",\n \"tax\": \"Btw\",\n \"total\": \"Totaal\",\n \"paidWith\": \"Betaald met\",\n \"deliveryTitle\": \"Je levering\",\n \"replacement\": \"Vervanging\",\n \"search\": \"Bestellingen zoeken\",\n \"searchPlaceholder\": \"Zoeken op factuurnummer\",\n \"status\": \"Status\",\n \"statusAll\": \"Alle statussen\",\n \"statusCompleted\": \"Voltooid\",\n \"statusPending\": \"In afwachting\",\n \"statusProcessing\": \"In behandeling\",\n \"statusRefunded\": \"Terugbetaald\",\n \"statusDisputed\": \"Betwist\",\n \"statusExpired\": \"Verlopen\",\n \"emptyFiltered\": \"Geen overeenkomende bestellingen. Probeer een ander factuurnummer of een andere status.\",\n \"warrantyTitle\": \"Garantie\",\n \"warrantyCoveredUntil\": \"Gedekt tot {date}\",\n \"warrantyEnded\": \"Dekking liep af op {date}\",\n \"warrantyCancelled\": \"Dekking ingetrokken\",\n \"warrantyClaimSubmitted\": \"Melding verstuurd\",\n \"warrantyClaimApproved\": \"Melding goedgekeurd\",\n \"warrantyClaimDeclined\": \"Melding afgewezen\",\n \"warrantyClaimStart\": \"Garantie melden\",\n \"warrantyClaimLabel\": \"Wat is er misgegaan?\",\n \"warrantyClaimOptional\": \"Optioneel\",\n \"warrantyClaimSend\": \"Melding versturen\",\n \"warrantyClaimSending\": \"Versturen…\",\n \"warrantyClaimDone\": \"De winkel heeft je melding ontvangen. Ze antwoorden per e-mail.\",\n \"warrantyClaimFailed\": \"Je melding kon niet worden verstuurd.\"\n },\n \"downloads\": {\n \"loading\": \"Je downloads worden geladen\",\n \"emptyTitle\": \"Nog niets om te downloaden\",\n \"emptyBody\": \"Bestanden, sleutels en toegangslinks verschijnen hier zodra een bestelling is afgerond.\",\n \"licensesTitle\": \"Licentiesleutels\",\n \"filesTitle\": \"Bestanden\",\n \"codesTitle\": \"Codes en links\",\n \"download\": \"Downloaden\",\n \"openLink\": \"Link openen\",\n \"viewOrder\": \"Bestelling bekijken\",\n \"expires\": \"Verloopt op {date}\",\n \"neverExpires\": \"Geen einddatum\",\n \"lockedTo\": \"Gekoppeld aan {hardwareId}\",\n \"resetHwid\": \"Hardware-ID resetten\",\n \"resettingHwid\": \"Resetten…\",\n \"hwidResetDone\": \"De hardware-ID is gewist. Je volgende activering claimt deze licentie.\",\n \"hwidResetFailed\": \"De hardware-ID kon niet worden gereset. Probeer het opnieuw.\",\n \"renewTitle\": \"Verlengbaar\",\n \"renewBody\": \"Een verlenging is een aankoop en loopt daarom via het afrekenen, niet via deze pagina.\",\n \"renewAction\": \"Naar de winkel\",\n \"brokenTitle\": \"Je downloads konden niet worden getoond\",\n \"brokenBody\": \"De winkel stuurde een licentieregel ({id}) zonder de bijbehorende licentie, dus in deze lijst zou juist ontbreken wat ze noemt.\",\n \"brokenFileBody\": \"De winkel stuurde een bestandsregel ({id}) zonder iets om te downloaden, dus deze lijst zou een bestand noemen dat ze niet kan geven.\"\n },\n \"subscriptions\": {\n \"loading\": \"Je abonnementen worden geladen\",\n \"emptyTitle\": \"Nog geen abonnementen\",\n \"emptyBody\": \"Terugkerende aankopen verschijnen hier zodra je er een start.\",\n \"allSubscriptions\": \"Alle abonnementen\",\n \"unnamedPlan\": \"Abonnement\",\n \"renews\": \"Verlengt op {date}\",\n \"ends\": \"Eindigt op {date}\",\n \"canceled\": \"Opgezegd op {date}\",\n \"startedOn\": \"Gestart op {date}\",\n \"billingDayOne\": \"Dagelijks gefactureerd\",\n \"billingDayOther\": \"Elke {count} dagen gefactureerd\",\n \"billingWeekOne\": \"Wekelijks gefactureerd\",\n \"billingWeekOther\": \"Elke {count} weken gefactureerd\",\n \"billingMonthOne\": \"Maandelijks gefactureerd\",\n \"billingMonthOther\": \"Elke {count} maanden gefactureerd\",\n \"billingYearOne\": \"Jaarlijks gefactureerd\",\n \"billingYearOther\": \"Elke {count} jaar gefactureerd\",\n \"billingOther\": \"Elke {count} × {interval} gefactureerd\",\n \"gateway\": \"Betaalprovider\",\n \"paymentMethod\": \"Betaalmethode\",\n \"cardOnFile\": \"{brand} eindigend op {last4}\",\n \"noPaymentMethod\": \"Niets vastgelegd\",\n \"paymentMethodElsewhere\": \"De link om je betaalgegevens te wijzigen komt uit de e-mails van de winkel zelf. Die wordt hier niet gegeven, omdat alles op deze pagina hem zou kunnen oppikken.\",\n \"pause\": \"Pauzeren\",\n \"pausing\": \"Pauzeren…\",\n \"resume\": \"Hervatten\",\n \"resuming\": \"Hervatten…\",\n \"cancel\": \"Abonnement opzeggen\",\n \"cancelling\": \"Opzeggen…\",\n \"keep\": \"Toch houden\",\n \"confirmCancelTitle\": \"Dit abonnement opzeggen?\",\n \"confirmCancelAtPeriodEnd\": \"Je houdt toegang tot {date}. Daarna wordt er niets meer in rekening gebracht.\",\n \"confirmCancelNow\": \"De toegang stopt zodra dit is opgezegd.\",\n \"actionFailed\": \"Dat is niet gelukt. Probeer het opnieuw.\",\n \"paused\": \"Dit abonnement is gepauzeerd.\",\n \"resumed\": \"Dit abonnement loopt weer.\",\n \"cancelled\": \"Dit abonnement is opgezegd.\",\n \"historyTitle\": \"Factuurgeschiedenis\",\n \"historyLoading\": \"Factuurgeschiedenis wordt geladen\",\n \"historyEmptyTitle\": \"Nog geen factuurgeschiedenis\",\n \"historyEmptyBody\": \"Verlengingsfacturen verschijnen hier na de eerste periode.\",\n \"trial\": \"Proefperiode eindigt op {date}\"\n },\n \"favorites\": {\n \"loading\": \"Je favorieten worden geladen\",\n \"emptyTitle\": \"Nog geen favorieten\",\n \"emptyBody\": \"Producten die je opslaat tijdens het rondkijken bewaren we hier.\",\n \"added\": \"Opgeslagen op {date}\",\n \"gone\": \"Niet meer beschikbaar\",\n \"view\": \"Bekijk in de winkel\",\n \"remove\": \"Verwijderen\",\n \"removing\": \"Verwijderen…\",\n \"removeFailed\": \"Deze favoriet kon niet worden verwijderd. Probeer het opnieuw.\",\n \"noImage\": \"Geen afbeelding voor {title}\"\n },\n \"rewards\": {\n \"loading\": \"Je beloningen worden geladen\",\n \"available\": \"Beschikbaar\",\n \"pending\": \"Onderweg\",\n \"lifetime\": \"Totaal verdiend\",\n \"couponsTitle\": \"Je kortingsbonnen\",\n \"couponsBody\": \"Plak er een bij het afrekenen.\",\n \"percentOff\": \"{percent}% korting\",\n \"couponGeneric\": \"Kortingsbon\",\n \"expiresOn\": \"Verloopt op {date}\",\n \"activityTitle\": \"Activiteit\",\n \"emptyTitle\": \"Nog geen beloningen\",\n \"emptyBody\": \"Rond een bestelling af of laat een review achter om te gaan verdienen.\",\n \"storeCredit\": \"{amount} winkeltegoed\",\n \"storeCreditGeneric\": \"Winkeltegoed\",\n \"couponNamed\": \"Bon {code}\",\n \"couponUnnamed\": \"Kortingscode\",\n \"otherReward\": \"Beloning\",\n \"reasonOrderCompleted\": \"Bestelling afgerond\",\n \"reasonOrderCount\": \"Trouwmijlpaal\",\n \"reasonSpendAmount\": \"Totaal besteed\",\n \"reasonReview\": \"Review achtergelaten\",\n \"reasonFirstPurchase\": \"Eerste aankoop\",\n \"reasonOther\": \"Beloning\",\n \"grantFulfilled\": \"Verdiend\",\n \"grantPending\": \"Onderweg\",\n \"grantFailed\": \"Mislukt\",\n \"grantRevoked\": \"Ingetrokken\",\n \"pointsTitle\": \"Punten\",\n \"pointsBalance\": \"Puntensaldo\",\n \"pointsLifetime\": \"Totaal gespaard\",\n \"pointsEarnHint\": \"Rond een bestelling af om punten te gaan sparen.\",\n \"pointsActivityTitle\": \"Puntenoverzicht\",\n \"pointsFromOrder\": \"Bestelling afgerond\",\n \"pointsFromReview\": \"Review achtergelaten\",\n \"pointsConverted\": \"Omgezet in winkeltegoed\",\n \"pointsAdjusted\": \"Aangepast door de winkel\",\n \"redeemTitle\": \"Punten omzetten\",\n \"redeemBody\": \"Zet je punten om in winkeltegoed en betaal ermee bij het afrekenen.\",\n \"redeemLabel\": \"Om te zetten punten\",\n \"redeemMinimum\": \"Zet minstens {points} punten om.\",\n \"redeemOverBalance\": \"Je hebt {points} punten te besteden.\",\n \"redeemInvalid\": \"Vul een heel aantal punten in.\",\n \"redeemPreview\": \"Ongeveer {amount} aan winkeltegoed waard.\",\n \"redeemContinue\": \"Doorgaan\",\n \"redeemConfirm\": \"{points} punten omzetten in ongeveer {amount} winkeltegoed?\",\n \"redeemConfirmAction\": \"Ja, omzetten\",\n \"redeemWorking\": \"Bezig met omzetten…\",\n \"redeemDone\": \"{amount} aan je winkeltegoed toegevoegd.\",\n \"redeemFailed\": \"Je punten konden niet worden omgezet.\"\n },\n \"referrals\": {\n \"loading\": \"Je verwijzingen worden geladen\",\n \"notEnrolledTitle\": \"Je doet niet mee aan het verwijsprogramma\",\n \"notEnrolledBody\": \"Deze winkel heeft je niet aangemeld, dus er is nog niets te delen of te volgen.\",\n \"availableLabel\": \"Beschikbaar om op te nemen\",\n \"pendingLabel\": \"In afwachting\",\n \"requestedLabel\": \"Aangevraagd\",\n \"payoutsElsewhere\": \"Opnames en uitbetalingen regelt de winkel, niet deze pagina.\",\n \"codesAccepted\": \"Je code wordt bij het afrekenen geaccepteerd.\",\n \"codesNotAccepted\": \"Deze winkel accepteert op dit moment geen verwijscodes bij het afrekenen.\",\n \"linksTitle\": \"Je links\",\n \"linksEmptyTitle\": \"Nog geen verwijslinks\",\n \"linksEmptyBody\": \"De winkel maakt de links die je deelt. Vraag er een aan als je hier een link verwachtte.\",\n \"primary\": \"Primair\",\n \"commission\": \"{percent}% commissie\",\n \"buyerDiscount\": \"{percent}% korting voor de koper\",\n \"awaitingApproval\": \"Wacht op goedkeuring van de winkel.\",\n \"clicks\": \"Kliks\",\n \"sales\": \"Verkopen\",\n \"revenue\": \"Omzet\",\n \"commissionsTitle\": \"Commissies\",\n \"commissionsEmptyTitle\": \"Nog geen commissies\",\n \"commissionsEmptyBody\": \"Goedgekeurde verwijsverkopen verschijnen hier.\",\n \"commissionFor\": \"Bestelling {id}\",\n \"balanceTitle\": \"Saldomutaties\",\n \"balanceEmptyTitle\": \"Nog geen saldomutaties\",\n \"balanceEmptyBody\": \"Omzettingen en uitbetalingen verschijnen hier.\",\n \"claimStoreCredit\": \"Winkeltegoed\",\n \"claimCryptoPayout\": \"Crypto-uitbetaling\",\n \"claimAdjustment\": \"Correctie\",\n \"differentCurrency\": \"Je verwijssaldo staat in {currency}.\",\n \"convertedLabel\": \"Omgezet naar winkeltegoed\",\n \"paidLabel\": \"Uitbetaald\"\n },\n \"support\": {\n \"loading\": \"Je tickets worden geladen\",\n \"ticketsTitle\": \"Je tickets\",\n \"emptyTitle\": \"Nog geen tickets\",\n \"emptyBody\": \"Schrijf hier naar de winkel; elk antwoord blijft op deze pagina staan.\",\n \"newTicket\": \"Nieuw ticket\",\n \"backToTickets\": \"Alle tickets\",\n \"updated\": \"Bijgewerkt op {date}\",\n \"aboutOrder\": \"Over bestelling {id}\",\n \"subjectLabel\": \"Onderwerp\",\n \"subjectOptional\": \"Optioneel\",\n \"messageLabel\": \"Bericht\",\n \"replyLabel\": \"Je antwoord\",\n \"create\": \"Naar de winkel sturen\",\n \"creating\": \"Versturen…\",\n \"createFailed\": \"Je ticket kon niet worden aangemaakt. Probeer het opnieuw.\",\n \"reply\": \"Antwoord versturen\",\n \"replying\": \"Versturen…\",\n \"replyFailed\": \"Je antwoord kon niet worden verstuurd. Probeer het opnieuw.\",\n \"tooShort\": \"Schrijf op zijn minst een kort bericht.\",\n \"closedTitle\": \"Dit ticket is gesloten\",\n \"closedBody\": \"Open een nieuw ticket als je nog hulp nodig hebt.\",\n \"loadingThread\": \"Dit gesprek wordt geladen\",\n \"noMessages\": \"Er staan nog geen berichten bij dit ticket.\",\n \"fromYou\": \"Jij\",\n \"fromMerchant\": \"Winkel\",\n \"fromSystem\": \"Systeem\",\n \"untitled\": \"Supportvraag\"\n },\n \"settings\": {\n \"loading\": \"Je instellingen worden geladen\",\n \"profileTitle\": \"Profiel\",\n \"emailLabel\": \"E-mail\",\n \"emailNote\": \"Met je e-mailadres log je in, dus het wordt door de winkel gewijzigd en niet hier.\",\n \"nameLabel\": \"Naam\",\n \"nameTooShort\": \"Vul je naam in.\",\n \"saveProfile\": \"Wijzigingen opslaan\",\n \"savingProfile\": \"Opslaan…\",\n \"profileSaved\": \"Je naam is bijgewerkt.\",\n \"profileFailed\": \"Je naam kon niet worden opgeslagen. Probeer het opnieuw.\",\n \"uploadAvatar\": \"Foto uploaden\",\n \"uploadingAvatar\": \"Uploaden…\",\n \"removeAvatar\": \"Foto verwijderen\",\n \"removingAvatar\": \"Verwijderen…\",\n \"avatarHint\": \"JPG, PNG, GIF of WebP, tot 10 MB.\",\n \"avatarFailed\": \"Je foto kon niet worden geüpload. Probeer het opnieuw.\",\n \"avatarRemoveFailed\": \"Je foto kon niet worden verwijderd. Probeer het opnieuw.\",\n \"avatarTooLarge\": \"Die afbeelding is groter dan 10 MB.\",\n \"emailsTitle\": \"E-mails van de winkel\",\n \"emailsLoading\": \"Je e-mailinstellingen worden geladen\",\n \"unsubscribeAll\": \"Helemaal geen marketingmails\",\n \"unsubscribeAllNote\": \"Bestel- en levermails worden hoe dan ook verstuurd.\",\n \"listsEmpty\": \"Deze winkel heeft geen mailinglijsten.\",\n \"emailsFailed\": \"Je e-mailinstellingen konden niet worden geladen.\",\n \"emailsSaveFailed\": \"Die instelling kon niet worden opgeslagen. Probeer het opnieuw.\",\n \"devicesTitle\": \"Ingelogde apparaten\",\n \"devicesLoading\": \"Je apparaten worden geladen\",\n \"devicesEmpty\": \"Er is geen ander apparaat ingelogd.\",\n \"thisDevice\": \"Dit apparaat\",\n \"signedInOn\": \"Ingelogd op {date}\",\n \"unknownDevice\": \"Onbekend apparaat\",\n \"signOutDevice\": \"Uitloggen\",\n \"signingOutDevice\": \"Uitloggen…\",\n \"signOutOthers\": \"Alle andere apparaten uitloggen\",\n \"signOutOthersDone\": \"Alle andere apparaten zijn uitgelogd.\",\n \"devicesFailed\": \"Je apparaten konden niet worden geladen.\",\n \"signOutDeviceFailed\": \"Dat apparaat kon niet worden uitgelogd. Probeer het opnieuw.\",\n \"deviceOn\": \"{browser} op {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Tegoed toevoegen\",\n \"minimum\": \"Minimaal {min}\",\n \"bounds\": \"Van {min} tot {max}\",\n \"bonus\": \"Voeg minstens {amount} toe en ontvang {percent}% extra\",\n \"amount\": \"Bedrag\",\n \"submit\": \"Doorgaan naar betalen\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Het resellerprogramma is niet beschikbaar\",\n \"disabledBody\": \"Deze winkel accepteert momenteel geen groothandelsbestellingen.\",\n \"openTitle\": \"Word lid van het resellerprogramma\",\n \"openBody\": \"Word nu lid om producten van deze winkel tegen groothandelsprijzen te kopen.\",\n \"join\": \"Nu deelnemen\",\n \"manualTitle\": \"Accepteer je reselleruitnodiging\",\n \"manualBody\": \"Voer het uitnodigingstoken in dat de winkel je heeft gestuurd.\",\n \"inviteToken\": \"Uitnodigingstoken\",\n \"acceptInvite\": \"Uitnodiging accepteren\",\n \"applicationTitle\": \"Aanmelden als reseller\",\n \"applicationBody\": \"Vertel de winkel over je bedrijf en dien je aanvraag in.\",\n \"applicationNote\": \"Toelichting bij aanvraag\",\n \"noteRequired\": \"Voeg een toelichting toe voordat je de aanvraag indient.\",\n \"apply\": \"Aanvraag indienen\",\n \"pendingTitle\": \"Je aanvraag wordt beoordeeld\",\n \"pendingBody\": \"De winkel beoordeelt je aanvraag voordat groothandelstoegang wordt ingeschakeld.\",\n \"rejectedTitle\": \"Je reselleraanvraag is afgewezen\",\n \"rejectedBody\": \"Neem contact op met de winkel voor meer informatie of om opnieuw een aanvraag te doen.\",\n \"suspendedTitle\": \"Je reselleraccount is opgeschort\",\n \"suspendedBody\": \"Groothandelsbestellingen zijn niet beschikbaar. Neem contact op met de winkel voor hulp.\",\n \"activeTitle\": \"Groothandelsaccount\",\n \"tier\": \"Niveau\",\n \"walletTitle\": \"Groothandelstegoed\",\n \"balance\": \"Saldo\",\n \"held\": \"Gereserveerd\",\n \"catalogTitle\": \"Groothandelscatalogus\",\n \"search\": \"Producten zoeken\",\n \"catalogEmptyTitle\": \"Geen groothandelsproducten gevonden\",\n \"catalogEmptyBody\": \"Probeer een andere zoekopdracht of kom terug nadat de winkel producten heeft toegevoegd.\",\n \"volumePricing\": \"Staffelprijzen beschikbaar\",\n \"supplierBacked\": \"Geleverd door leverancier\",\n \"add\": \"Toevoegen\",\n \"basketTitle\": \"Groothandelsmandje\",\n \"basketEmpty\": \"Voeg een product uit de groothandelscatalogus toe om een bestelling te starten.\",\n \"quantity\": \"Aantal\",\n \"basketNeedsQuote\": \"Laat dit mandje berekenen om het actuele totaal te zien voordat je bestelt.\",\n \"quote\": \"Mandje berekenen\",\n \"place\": \"Bestelling plaatsen\",\n \"ordersTitle\": \"Groothandelsbestellingen\",\n \"ordersEmptyTitle\": \"Nog geen groothandelsbestellingen\",\n \"ordersEmptyBody\": \"Bestellingen die met je groothandelstegoed zijn betaald, verschijnen hier.\",\n \"refunded\": \"Teruggestort op saldo\",\n \"lineQuantity\": \"Aantal {count}\",\n \"serials\": \"Geleverde serienummers\",\n \"apiKeysTitle\": \"Reseller-API-sleutels\",\n \"apiKeyName\": \"Naam van sleutel\",\n \"createApiKey\": \"Sleutel maken\",\n \"apiKeysEmpty\": \"Je hebt nog geen reseller-API-sleutels gemaakt.\",\n \"orderElsewhere\": \"Groothandelsbestellingen lopen via de reseller-API, niet via deze pagina.\",\n \"keysElsewhere\": \"API-sleutels geeft de winkel uit. Vraag er daar om.\",\n \"apiKeyCreatedTitle\": \"Kopieer deze sleutel nu\",\n \"apiKeyCreatedBody\": \"Deze leesbare sleutel wordt één keer getoond en kan later niet worden hersteld.\",\n \"dismissKey\": \"Ik heb hem opgeslagen\",\n \"lastUsed\": \"Laatst gebruikt: {date}\",\n \"neverUsed\": \"Nooit gebruikt\",\n \"revokeApiKey\": \"Intrekken\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Kopiuj\",\n \"copied\": \"Skopiowano\",\n \"retry\": \"Spróbuj ponownie\",\n \"notLoaded\": \"To się nie wczytało\",\n \"genericError\": \"Nie udało się tego wczytać. Spróbuj ponownie za chwilę.\",\n \"browseStore\": \"Przeglądaj sklep\",\n \"unavailable\": \"Niedostępne\",\n \"cancel\": \"Anuluj\"\n },\n \"account\": {\n \"title\": \"Twoje konto\",\n \"sections\": \"Sekcje konta\",\n \"signOut\": \"Wyloguj się\",\n \"signingOut\": \"Wylogowywanie…\",\n \"signOutFailed\": \"Nie udało się Cię wylogować. Spróbuj ponownie.\",\n \"checkingSession\": \"Sprawdzamy Twoją sesję\",\n \"sessionUnknown\": \"Nie udało się sprawdzić Twojej sesji. Spróbuj ponownie za chwilę.\",\n \"goToOverview\": \"Przejdź do przeglądu\",\n \"tabs\": {\n \"overview\": \"Przegląd\",\n \"orders\": \"Zamówienia\",\n \"downloads\": \"Pliki do pobrania\",\n \"subscriptions\": \"Subskrypcje\",\n \"rewards\": \"Nagrody\",\n \"referrals\": \"Polecenia\",\n \"favorites\": \"Ulubione\",\n \"support\": \"Pomoc\",\n \"settings\": \"Ustawienia\",\n \"reseller\": \"Odsprzedawca\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} nie jest częścią tego sklepu\",\n \"body\": \"Ten sklep nie udostępnia tej sekcji. Twoje zamówienia i dane konta nadal tu są.\"\n },\n \"unknownTab\": {\n \"title\": \"Ten link donikąd nie prowadzi\",\n \"body\": \"Adres wskazuje sekcję konta, która nie istnieje. Mógł zostać źle wpisany albo ucięty.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Zaloguj się na swoje konto\",\n \"titleCode\": \"Sprawdź swoją skrzynkę\",\n \"introEmail\": \"Wysyłamy jednorazowy kod na Twój adres e-mail. Nie musisz pamiętać żadnego hasła.\",\n \"introCode\": \"Wpisz kod, który wysłaliśmy na {email}.\",\n \"emailLabel\": \"E-mail\",\n \"codeLabel\": \"Kod logowania\",\n \"invalidEmail\": \"Wpisz pełny adres e-mail, na przykład ty@przyklad.pl.\",\n \"missingCode\": \"Wpisz kod z wiadomości e-mail.\",\n \"send\": \"Wyślij mi kod\",\n \"sending\": \"Wysyłanie…\",\n \"submit\": \"Zaloguj się\",\n \"submitting\": \"Sprawdzanie…\",\n \"resend\": \"Wyślij nowy kod\",\n \"resent\": \"Nowy kod jest już w drodze na {email}.\",\n \"changeEmail\": \"Użyj innego adresu\",\n \"sendFailed\": \"Nie udało się wysłać kodu. Spróbuj ponownie za chwilę.\",\n \"verifyFailed\": \"Ten kod nie został przyjęty. Spróbuj ponownie.\"\n },\n \"status\": {\n \"COMPLETED\": \"Zrealizowane\",\n \"PROCESSING\": \"W realizacji\",\n \"AWAITING_STOCK\": \"Czeka na dostępność\",\n \"PENDING\": \"Oczekuje\",\n \"PENDING_PAYMENT\": \"Oczekuje na płatność\",\n \"UNDERPAID\": \"Niedopłata\",\n \"DISPUTED\": \"Sporne\",\n \"REFUNDED\": \"Zwrócone\",\n \"PARTIAL_REFUND\": \"Częściowo zwrócone\",\n \"VOIDED\": \"Unieważnione\",\n \"EXPIRED\": \"Wygasłe\",\n \"ACTIVE\": \"Aktywne\",\n \"INACTIVE\": \"Nieaktywne\",\n \"SUSPENDED\": \"Zawieszone\",\n \"REVOKED\": \"Cofnięte\",\n \"TRIALING\": \"Okres próbny\",\n \"PAUSED\": \"Wstrzymane\",\n \"PAST_DUE\": \"Zaległa płatność\",\n \"UNPAID\": \"Nieopłacone\",\n \"INCOMPLETE\": \"Niekompletne\",\n \"CANCELED\": \"Anulowane\",\n \"CANCELLED\": \"Anulowane\",\n \"OPEN\": \"Otwarte\",\n \"CLOSED\": \"Zamknięte\",\n \"RESOLVED\": \"Rozwiązane\",\n \"AWAITING_REPLY\": \"Czeka na Twoją odpowiedź\",\n \"APPROVED\": \"Zatwierdzone\",\n \"REJECTED\": \"Odrzucone\",\n \"REQUESTED\": \"Zgłoszone\",\n \"CONVERTED\": \"Zamienione\",\n \"PAID\": \"Opłacone\",\n \"FAILED\": \"Nieudane\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Dostarczone\",\n \"AWAITING_FULFILLMENT\": \"Czeka na realizację\",\n \"PENDING\": \"Oczekuje\",\n \"FAILED\": \"Dostawa nieudana\"\n },\n \"overview\": {\n \"loading\": \"Wczytujemy Twoje konto\",\n \"signedInAs\": \"Zalogowano jako\",\n \"statOrders\": \"Zamówienia\",\n \"statLicenses\": \"Licencje\",\n \"statDownloads\": \"Pobrania\",\n \"statTickets\": \"Zgłoszenia do pomocy\",\n \"walletLabel\": \"Środki w sklepie\",\n \"walletNote\": \"Uwzględniane przy płatności\",\n \"recentOrders\": \"Ostatnie zamówienia\",\n \"allOrders\": \"Wszystkie zamówienia\"\n },\n \"orders\": {\n \"loading\": \"Wczytujemy Twoje zamówienia\",\n \"emptyTitle\": \"Nie masz jeszcze zamówień\",\n \"emptyBody\": \"Zakupy z tego sklepu pojawią się tutaj, gdy tylko złożysz pierwsze zamówienie.\",\n \"movedTitle\": \"Na tej stronie nic nie ma\",\n \"movedBody\": \"Te zamówienia przesunęły się w trakcie przeglądania.\",\n \"backToFirstPage\": \"Wróć na pierwszą stronę\",\n \"pagesLabel\": \"Strony historii zamówień\",\n \"previous\": \"Poprzednia\",\n \"next\": \"Następna\",\n \"page\": \"Strona {page}\",\n \"andMoreOne\": \"i jeszcze jedna pozycja\",\n \"andMoreOther\": \"i jeszcze {count} pozycji\",\n \"fallbackTitle\": \"Zamówienie {id}\",\n \"allOrders\": \"Wszystkie zamówienia\",\n \"loadingOne\": \"Wczytujemy to zamówienie\",\n \"detailTitle\": \"Zamówienie {id}\",\n \"subtotal\": \"Suma częściowa\",\n \"discount\": \"Rabat\",\n \"tax\": \"Podatek\",\n \"total\": \"Razem\",\n \"paidWith\": \"Zapłacono przez\",\n \"deliveryTitle\": \"Twoja dostawa\",\n \"replacement\": \"Wymiana\",\n \"search\": \"Szukaj zamówień\",\n \"searchPlaceholder\": \"Szukaj po numerze faktury\",\n \"status\": \"Status\",\n \"statusAll\": \"Wszystkie statusy\",\n \"statusCompleted\": \"Zrealizowane\",\n \"statusPending\": \"Oczekujące\",\n \"statusProcessing\": \"W trakcie\",\n \"statusRefunded\": \"Zwrócone\",\n \"statusDisputed\": \"Sporne\",\n \"statusExpired\": \"Wygasłe\",\n \"emptyFiltered\": \"Brak pasujących zamówień. Spróbuj innego numeru faktury lub statusu.\",\n \"warrantyTitle\": \"Gwarancja\",\n \"warrantyCoveredUntil\": \"Objęte do {date}\",\n \"warrantyEnded\": \"Ochrona zakończyła się {date}\",\n \"warrantyCancelled\": \"Ochrona anulowana\",\n \"warrantyClaimSubmitted\": \"Zgłoszenie wysłane\",\n \"warrantyClaimApproved\": \"Zgłoszenie zaakceptowane\",\n \"warrantyClaimDeclined\": \"Zgłoszenie odrzucone\",\n \"warrantyClaimStart\": \"Zgłoś gwarancję\",\n \"warrantyClaimLabel\": \"Co się stało?\",\n \"warrantyClaimOptional\": \"Opcjonalne\",\n \"warrantyClaimSend\": \"Wyślij zgłoszenie\",\n \"warrantyClaimSending\": \"Wysyłanie…\",\n \"warrantyClaimDone\": \"Sklep otrzymał Twoje zgłoszenie. Odpowiedź przyjdzie e-mailem.\",\n \"warrantyClaimFailed\": \"Nie udało się wysłać zgłoszenia.\"\n },\n \"downloads\": {\n \"loading\": \"Wczytujemy Twoje pliki\",\n \"emptyTitle\": \"Nie ma jeszcze nic do pobrania\",\n \"emptyBody\": \"Pliki, klucze i linki dostępu pojawią się tutaj po zrealizowaniu zamówienia.\",\n \"licensesTitle\": \"Klucze licencyjne\",\n \"filesTitle\": \"Pliki\",\n \"codesTitle\": \"Kody i linki\",\n \"download\": \"Pobierz\",\n \"openLink\": \"Otwórz link\",\n \"viewOrder\": \"Zobacz zamówienie\",\n \"expires\": \"Wygasa {date}\",\n \"neverExpires\": \"Bez daty końca\",\n \"lockedTo\": \"Przypisana do {hardwareId}\",\n \"resetHwid\": \"Zresetuj ID sprzętu\",\n \"resettingHwid\": \"Resetowanie…\",\n \"hwidResetDone\": \"ID sprzętu zostało wyczyszczone. Kolejna aktywacja przypisze tę licencję na nowo.\",\n \"hwidResetFailed\": \"Nie udało się zresetować ID sprzętu. Spróbuj ponownie.\",\n \"renewTitle\": \"Do odnowienia\",\n \"renewBody\": \"Odnowienie to zakup, więc przechodzi przez płatność, a nie przez tę stronę.\",\n \"renewAction\": \"Otwórz sklep\",\n \"brokenTitle\": \"Nie udało się wyświetlić Twoich plików\",\n \"brokenBody\": \"Sklep przysłał wpis licencji ({id}) bez samej licencji, więc na tej liście brakowałoby tego, co sama wymienia.\",\n \"brokenFileBody\": \"Sklep przysłał wpis pliku ({id}), do którego nie ma nic do pobrania, więc lista wskazywałaby plik, którego nie da się wydać.\"\n },\n \"subscriptions\": {\n \"loading\": \"Wczytujemy Twoje subskrypcje\",\n \"emptyTitle\": \"Nie masz jeszcze subskrypcji\",\n \"emptyBody\": \"Zakupy cykliczne pojawią się tutaj, gdy któryś rozpoczniesz.\",\n \"allSubscriptions\": \"Wszystkie subskrypcje\",\n \"unnamedPlan\": \"Subskrypcja\",\n \"renews\": \"Odnawia się {date}\",\n \"ends\": \"Kończy się {date}\",\n \"canceled\": \"Anulowano {date}\",\n \"startedOn\": \"Rozpoczęto {date}\",\n \"billingDayOne\": \"Płatność codziennie\",\n \"billingDayOther\": \"Płatność co {count} dni\",\n \"billingWeekOne\": \"Płatność co tydzień\",\n \"billingWeekOther\": \"Płatność co {count} tygodni\",\n \"billingMonthOne\": \"Płatność co miesiąc\",\n \"billingMonthOther\": \"Płatność co {count} miesięcy\",\n \"billingYearOne\": \"Płatność co rok\",\n \"billingYearOther\": \"Płatność co {count} lat\",\n \"billingOther\": \"Płatność co {count} × {interval}\",\n \"gateway\": \"Dostawca płatności\",\n \"paymentMethod\": \"Metoda płatności\",\n \"cardOnFile\": \"{brand} kończąca się na {last4}\",\n \"noPaymentMethod\": \"Brak zapisanej\",\n \"paymentMethodElsewhere\": \"Link do zmiany danych płatności przychodzi w e-mailach od samego sklepu. Nie podajemy go tutaj, bo mogłoby go przechwycić cokolwiek na tej stronie.\",\n \"pause\": \"Wstrzymaj\",\n \"pausing\": \"Wstrzymywanie…\",\n \"resume\": \"Wznów\",\n \"resuming\": \"Wznawianie…\",\n \"cancel\": \"Anuluj subskrypcję\",\n \"cancelling\": \"Anulowanie…\",\n \"keep\": \"Zostaw ją\",\n \"confirmCancelTitle\": \"Anulować tę subskrypcję?\",\n \"confirmCancelAtPeriodEnd\": \"Zachowujesz dostęp do {date}. Po tej dacie nie pobieramy już opłat.\",\n \"confirmCancelNow\": \"Dostęp kończy się w chwili anulowania.\",\n \"actionFailed\": \"To nie doszło do skutku. Spróbuj ponownie.\",\n \"paused\": \"Ta subskrypcja jest wstrzymana.\",\n \"resumed\": \"Ta subskrypcja znów działa.\",\n \"cancelled\": \"Ta subskrypcja jest anulowana.\",\n \"historyTitle\": \"Historia płatności\",\n \"historyLoading\": \"Wczytujemy historię płatności\",\n \"historyEmptyTitle\": \"Nie ma jeszcze historii płatności\",\n \"historyEmptyBody\": \"Faktury za odnowienia pojawią się tutaj po pierwszym okresie.\",\n \"trial\": \"Okres próbny kończy się {date}\"\n },\n \"favorites\": {\n \"loading\": \"Wczytujemy Twoje ulubione\",\n \"emptyTitle\": \"Nie masz jeszcze ulubionych\",\n \"emptyBody\": \"Produkty zapisane podczas przeglądania sklepu trafiają tutaj.\",\n \"added\": \"Zapisano {date}\",\n \"gone\": \"Już niedostępny\",\n \"view\": \"Zobacz w sklepie\",\n \"remove\": \"Usuń\",\n \"removing\": \"Usuwanie…\",\n \"removeFailed\": \"Nie udało się usunąć tej pozycji. Spróbuj ponownie.\",\n \"noImage\": \"Brak zdjęcia dla {title}\"\n },\n \"rewards\": {\n \"loading\": \"Wczytujemy Twoje nagrody\",\n \"available\": \"Dostępne\",\n \"pending\": \"W trakcie\",\n \"lifetime\": \"Łącznie zdobyte\",\n \"couponsTitle\": \"Twoje kupony\",\n \"couponsBody\": \"Wklej jeden z nich przy płatności.\",\n \"percentOff\": \"{percent}% rabatu\",\n \"couponGeneric\": \"Kupon rabatowy\",\n \"expiresOn\": \"Wygasa {date}\",\n \"activityTitle\": \"Aktywność\",\n \"emptyTitle\": \"Nie masz jeszcze nagród\",\n \"emptyBody\": \"Zrealizuj zamówienie albo napisz opinię, żeby zacząć zbierać.\",\n \"storeCredit\": \"{amount} środków w sklepie\",\n \"storeCreditGeneric\": \"Środki w sklepie\",\n \"couponNamed\": \"Kupon {code}\",\n \"couponUnnamed\": \"Kod kuponu\",\n \"otherReward\": \"Nagroda\",\n \"reasonOrderCompleted\": \"Zrealizowane zamówienie\",\n \"reasonOrderCount\": \"Próg lojalnościowy\",\n \"reasonSpendAmount\": \"Łączne wydatki\",\n \"reasonReview\": \"Wystawiona opinia\",\n \"reasonFirstPurchase\": \"Pierwszy zakup\",\n \"reasonOther\": \"Nagroda\",\n \"grantFulfilled\": \"Zdobyte\",\n \"grantPending\": \"W trakcie\",\n \"grantFailed\": \"Nieudane\",\n \"grantRevoked\": \"Cofnięte\",\n \"pointsTitle\": \"Punkty\",\n \"pointsBalance\": \"Stan punktów\",\n \"pointsLifetime\": \"Zebrane łącznie\",\n \"pointsEarnHint\": \"Złóż zamówienie, żeby zacząć zbierać punkty.\",\n \"pointsActivityTitle\": \"Historia punktów\",\n \"pointsFromOrder\": \"Zrealizowane zamówienie\",\n \"pointsFromReview\": \"Wystawiona opinia\",\n \"pointsConverted\": \"Zamienione na środki w sklepie\",\n \"pointsAdjusted\": \"Skorygowane przez sklep\",\n \"redeemTitle\": \"Zamień punkty\",\n \"redeemBody\": \"Zamień punkty na środki w sklepie i zapłać nimi przy zamówieniu.\",\n \"redeemLabel\": \"Punkty do zamiany\",\n \"redeemMinimum\": \"Zamień co najmniej {points} punktów.\",\n \"redeemOverBalance\": \"Masz {points} punktów do wykorzystania.\",\n \"redeemInvalid\": \"Podaj całkowitą liczbę punktów.\",\n \"redeemPreview\": \"Warte około {amount} środków w sklepie.\",\n \"redeemContinue\": \"Dalej\",\n \"redeemConfirm\": \"Zamienić {points} punktów na około {amount} środków w sklepie?\",\n \"redeemConfirmAction\": \"Tak, zamień\",\n \"redeemWorking\": \"Zamieniamy…\",\n \"redeemDone\": \"{amount} dodano do Twoich środków w sklepie.\",\n \"redeemFailed\": \"Nie udało się zamienić Twoich punktów.\"\n },\n \"referrals\": {\n \"loading\": \"Wczytujemy Twoje polecenia\",\n \"notEnrolledTitle\": \"Nie bierzesz udziału w programie poleceń\",\n \"notEnrolledBody\": \"Ten sklep Cię nie zapisał, więc nie ma jeszcze czego udostępniać ani śledzić.\",\n \"availableLabel\": \"Dostępne do wypłaty\",\n \"pendingLabel\": \"Oczekujące\",\n \"requestedLabel\": \"Zgłoszone\",\n \"payoutsElsewhere\": \"Wypłatami zajmuje się sklep, a nie ta strona.\",\n \"codesAccepted\": \"Twój kod działa przy płatności.\",\n \"codesNotAccepted\": \"Ten sklep na razie nie przyjmuje kodów polecających przy płatności.\",\n \"linksTitle\": \"Twoje linki\",\n \"linksEmptyTitle\": \"Nie masz jeszcze linków polecających\",\n \"linksEmptyBody\": \"Linki, które udostępniasz, tworzy sklep. Poproś o niego, jeśli spodziewasz się go tutaj.\",\n \"primary\": \"Główny\",\n \"commission\": \"{percent}% prowizji\",\n \"buyerDiscount\": \"{percent}% rabatu dla kupującego\",\n \"awaitingApproval\": \"Czekamy, aż sklep zatwierdzi ten link.\",\n \"clicks\": \"Kliknięcia\",\n \"sales\": \"Sprzedaż\",\n \"revenue\": \"Przychód\",\n \"commissionsTitle\": \"Prowizje\",\n \"commissionsEmptyTitle\": \"Nie masz jeszcze prowizji\",\n \"commissionsEmptyBody\": \"Zatwierdzona sprzedaż z poleceń pojawi się tutaj.\",\n \"commissionFor\": \"Zamówienie {id}\",\n \"balanceTitle\": \"Historia salda\",\n \"balanceEmptyTitle\": \"Nie ma jeszcze historii salda\",\n \"balanceEmptyBody\": \"Zamiany i wypłaty pojawią się tutaj.\",\n \"claimStoreCredit\": \"Środki w sklepie\",\n \"claimCryptoPayout\": \"Wypłata w krypto\",\n \"claimAdjustment\": \"Korekta\",\n \"differentCurrency\": \"Twoje saldo z poleceń jest prowadzone w {currency}.\",\n \"convertedLabel\": \"Zamienione na środki w sklepie\",\n \"paidLabel\": \"Wypłacone\"\n },\n \"support\": {\n \"loading\": \"Wczytujemy Twoje zgłoszenia\",\n \"ticketsTitle\": \"Twoje zgłoszenia\",\n \"emptyTitle\": \"Nie masz jeszcze zgłoszeń\",\n \"emptyBody\": \"Napisz do sklepu tutaj, a wszystkie odpowiedzi zostaną na tej stronie.\",\n \"newTicket\": \"Nowe zgłoszenie\",\n \"backToTickets\": \"Wszystkie zgłoszenia\",\n \"updated\": \"Zaktualizowano {date}\",\n \"aboutOrder\": \"Dotyczy zamówienia {id}\",\n \"subjectLabel\": \"Temat\",\n \"subjectOptional\": \"Opcjonalnie\",\n \"messageLabel\": \"Wiadomość\",\n \"replyLabel\": \"Twoja odpowiedź\",\n \"create\": \"Wyślij do sklepu\",\n \"creating\": \"Wysyłanie…\",\n \"createFailed\": \"Nie udało się utworzyć zgłoszenia. Spróbuj ponownie.\",\n \"reply\": \"Wyślij odpowiedź\",\n \"replying\": \"Wysyłanie…\",\n \"replyFailed\": \"Nie udało się wysłać odpowiedzi. Spróbuj ponownie.\",\n \"tooShort\": \"Napisz przynajmniej krótką wiadomość.\",\n \"closedTitle\": \"To zgłoszenie jest zamknięte\",\n \"closedBody\": \"Otwórz nowe, jeśli nadal potrzebujesz pomocy.\",\n \"loadingThread\": \"Wczytujemy tę rozmowę\",\n \"noMessages\": \"W tym zgłoszeniu nie ma jeszcze wiadomości.\",\n \"fromYou\": \"Ty\",\n \"fromMerchant\": \"Sklep\",\n \"fromSystem\": \"System\",\n \"untitled\": \"Prośba o pomoc\"\n },\n \"settings\": {\n \"loading\": \"Wczytujemy Twoje ustawienia\",\n \"profileTitle\": \"Profil\",\n \"emailLabel\": \"E-mail\",\n \"emailNote\": \"Twój e-mail służy do logowania, więc zmienia go sklep, a nie Ty tutaj.\",\n \"nameLabel\": \"Imię\",\n \"nameTooShort\": \"Podaj swoje imię.\",\n \"saveProfile\": \"Zapisz zmiany\",\n \"savingProfile\": \"Zapisywanie…\",\n \"profileSaved\": \"Twoje imię zostało zaktualizowane.\",\n \"profileFailed\": \"Nie udało się zapisać Twojego imienia. Spróbuj ponownie.\",\n \"uploadAvatar\": \"Wgraj zdjęcie\",\n \"uploadingAvatar\": \"Wgrywanie…\",\n \"removeAvatar\": \"Usuń zdjęcie\",\n \"removingAvatar\": \"Usuwanie…\",\n \"avatarHint\": \"JPG, PNG, GIF lub WebP, do 10 MB.\",\n \"avatarFailed\": \"Nie udało się wgrać Twojego zdjęcia. Spróbuj ponownie.\",\n \"avatarRemoveFailed\": \"Nie udało się usunąć Twojego zdjęcia. Spróbuj ponownie.\",\n \"avatarTooLarge\": \"To zdjęcie jest większe niż 10 MB.\",\n \"emailsTitle\": \"E-maile ze sklepu\",\n \"emailsLoading\": \"Wczytujemy ustawienia e-maili\",\n \"unsubscribeAll\": \"Żadnych e-maili marketingowych\",\n \"unsubscribeAllNote\": \"E-maile o zamówieniach i dostawach wysyłamy tak czy tak.\",\n \"listsEmpty\": \"Ten sklep nie ma list mailingowych.\",\n \"emailsFailed\": \"Nie udało się wczytać Twoich ustawień e-maili.\",\n \"emailsSaveFailed\": \"Nie udało się zapisać tego ustawienia. Spróbuj ponownie.\",\n \"devicesTitle\": \"Zalogowane urządzenia\",\n \"devicesLoading\": \"Wczytujemy Twoje urządzenia\",\n \"devicesEmpty\": \"Żadne inne urządzenie nie jest zalogowane.\",\n \"thisDevice\": \"To urządzenie\",\n \"signedInOn\": \"Zalogowano {date}\",\n \"unknownDevice\": \"Nieznane urządzenie\",\n \"signOutDevice\": \"Wyloguj\",\n \"signingOutDevice\": \"Wylogowywanie…\",\n \"signOutOthers\": \"Wyloguj wszystkie inne urządzenia\",\n \"signOutOthersDone\": \"Wszystkie inne urządzenia zostały wylogowane.\",\n \"devicesFailed\": \"Nie udało się wczytać Twoich urządzeń.\",\n \"signOutDeviceFailed\": \"Nie udało się wylogować tego urządzenia. Spróbuj ponownie.\",\n \"deviceOn\": \"{browser} na {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Dodaj środki\",\n \"minimum\": \"Minimum {min}\",\n \"bounds\": \"Od {min} do {max}\",\n \"bonus\": \"Dodaj co najmniej {amount} i otrzymaj {percent}% więcej\",\n \"amount\": \"Kwota\",\n \"submit\": \"Przejdź do płatności\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Program sprzedawców jest niedostępny\",\n \"disabledBody\": \"Ten sklep nie przyjmuje teraz zamówień hurtowych.\",\n \"openTitle\": \"Dołącz do programu sprzedawców\",\n \"openBody\": \"Dołącz, aby kupować produkty tego sklepu w cenach hurtowych.\",\n \"join\": \"Dołącz teraz\",\n \"manualTitle\": \"Przyjmij zaproszenie sprzedawcy\",\n \"manualBody\": \"Wpisz token zaproszenia otrzymany od sklepu.\",\n \"inviteToken\": \"Token zaproszenia\",\n \"acceptInvite\": \"Przyjmij zaproszenie\",\n \"applicationTitle\": \"Zgłoś się jako sprzedawca\",\n \"applicationBody\": \"Opowiedz sklepowi o swojej firmie i wyślij zgłoszenie.\",\n \"applicationNote\": \"Notatka do zgłoszenia\",\n \"noteRequired\": \"Dodaj notatkę przed wysłaniem zgłoszenia.\",\n \"apply\": \"Wyślij zgłoszenie\",\n \"pendingTitle\": \"Twoje zgłoszenie oczekuje\",\n \"pendingBody\": \"Sklep sprawdzi zgłoszenie przed włączeniem dostępu hurtowego.\",\n \"rejectedTitle\": \"Twoje zgłoszenie zostało odrzucone\",\n \"rejectedBody\": \"Skontaktuj się ze sklepem, aby uzyskać informacje lub zgłosić się ponownie.\",\n \"suspendedTitle\": \"Twoje konto sprzedawcy jest zawieszone\",\n \"suspendedBody\": \"Zamówienia hurtowe są niedostępne. Skontaktuj się ze sklepem, aby uzyskać pomoc.\",\n \"activeTitle\": \"Konto hurtowe\",\n \"tier\": \"Poziom\",\n \"walletTitle\": \"Saldo hurtowe\",\n \"balance\": \"Saldo\",\n \"held\": \"Zablokowane\",\n \"catalogTitle\": \"Katalog hurtowy\",\n \"search\": \"Szukaj produktów\",\n \"catalogEmptyTitle\": \"Nie znaleziono produktów hurtowych\",\n \"catalogEmptyBody\": \"Spróbuj innego wyszukiwania lub wróć, gdy sklep doda produkty.\",\n \"volumePricing\": \"Dostępne ceny ilościowe\",\n \"supplierBacked\": \"Realizowane przez dostawcę\",\n \"add\": \"Dodaj\",\n \"basketTitle\": \"Koszyk hurtowy\",\n \"basketEmpty\": \"Dodaj produkt z katalogu hurtowego, aby rozpocząć zamówienie.\",\n \"quantity\": \"Ilość\",\n \"basketNeedsQuote\": \"Wyceń koszyk, aby zobaczyć aktualną sumę przed złożeniem zamówienia.\",\n \"quote\": \"Wyceń koszyk\",\n \"place\": \"Złóż zamówienie\",\n \"ordersTitle\": \"Zamówienia hurtowe\",\n \"ordersEmptyTitle\": \"Brak zamówień hurtowych\",\n \"ordersEmptyBody\": \"Tutaj pojawią się zamówienia opłacone z salda hurtowego.\",\n \"refunded\": \"Zwrócono na saldo\",\n \"lineQuantity\": \"Ilość {count}\",\n \"serials\": \"Dostarczone numery seryjne\",\n \"apiKeysTitle\": \"Klucze API sprzedawcy\",\n \"apiKeyName\": \"Nazwa klucza\",\n \"createApiKey\": \"Utwórz klucz\",\n \"apiKeysEmpty\": \"Nie utworzono jeszcze kluczy API sprzedawcy.\",\n \"orderElsewhere\": \"Zamówienia hurtowe składa się przez API resellera, nie z tej strony.\",\n \"keysElsewhere\": \"Klucze API wydaje sklep. Poproś o jeden.\",\n \"apiKeyCreatedTitle\": \"Skopiuj ten klucz teraz\",\n \"apiKeyCreatedBody\": \"Ten jawny klucz jest wyświetlany raz i nie można go później odzyskać.\",\n \"dismissKey\": \"Klucz zapisany\",\n \"lastUsed\": \"Ostatnio użyto: {date}\",\n \"neverUsed\": \"Nigdy nie użyto\",\n \"revokeApiKey\": \"Unieważnij\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Copiar\",\n \"copied\": \"Copiado\",\n \"retry\": \"Tentar de novo\",\n \"notLoaded\": \"Isto não carregou\",\n \"genericError\": \"Não foi possível carregar isto. Tenta de novo daqui a pouco.\",\n \"browseStore\": \"Ver a loja\",\n \"unavailable\": \"Indisponível\",\n \"cancel\": \"Cancelar\"\n },\n \"account\": {\n \"title\": \"A tua conta\",\n \"sections\": \"Secções da conta\",\n \"signOut\": \"Terminar sessão\",\n \"signingOut\": \"A terminar sessão…\",\n \"signOutFailed\": \"Não foi possível terminar a tua sessão. Tenta de novo.\",\n \"checkingSession\": \"A verificar a tua sessão\",\n \"sessionUnknown\": \"Não foi possível verificar a tua sessão. Tenta de novo daqui a pouco.\",\n \"goToOverview\": \"Ir para o resumo\",\n \"tabs\": {\n \"overview\": \"Resumo\",\n \"orders\": \"Encomendas\",\n \"downloads\": \"Transferências\",\n \"subscriptions\": \"Subscrições\",\n \"rewards\": \"Recompensas\",\n \"referrals\": \"Indicações\",\n \"favorites\": \"Favoritos\",\n \"support\": \"Apoio\",\n \"settings\": \"Definições\",\n \"reseller\": \"Revendedor\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} não faz parte desta loja\",\n \"body\": \"Esta loja não oferece essa secção. As tuas encomendas e os dados da tua conta continuam aqui.\"\n },\n \"unknownTab\": {\n \"title\": \"Essa ligação não aponta para lado nenhum\",\n \"body\": \"O endereço indica uma secção da conta que não existe. Pode ter sido mal escrito ou ter ficado cortado.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Inicia sessão na tua conta\",\n \"titleCode\": \"Vê o teu e-mail\",\n \"introEmail\": \"Enviamos um código de utilização única para o teu endereço de e-mail. Não há palavra-passe para memorizar.\",\n \"introCode\": \"Introduz o código que enviámos para {email}.\",\n \"emailLabel\": \"E-mail\",\n \"codeLabel\": \"Código de acesso\",\n \"invalidEmail\": \"Introduz um endereço de e-mail completo, como tu@exemplo.com.\",\n \"missingCode\": \"Introduz o código que está no teu e-mail.\",\n \"send\": \"Enviar-me um código\",\n \"sending\": \"A enviar…\",\n \"submit\": \"Iniciar sessão\",\n \"submitting\": \"A verificar…\",\n \"resend\": \"Enviar um novo código\",\n \"resent\": \"Está a caminho um novo código para {email}.\",\n \"changeEmail\": \"Usar outro e-mail\",\n \"sendFailed\": \"Não foi possível enviar o código. Tenta de novo daqui a pouco.\",\n \"verifyFailed\": \"Esse código não foi aceite. Tenta de novo.\"\n },\n \"status\": {\n \"COMPLETED\": \"Concluído\",\n \"PROCESSING\": \"Em processamento\",\n \"AWAITING_STOCK\": \"A aguardar stock\",\n \"PENDING\": \"Pendente\",\n \"PENDING_PAYMENT\": \"Pagamento pendente\",\n \"UNDERPAID\": \"Pago a menos\",\n \"DISPUTED\": \"Em disputa\",\n \"REFUNDED\": \"Reembolsado\",\n \"PARTIAL_REFUND\": \"Reembolsado em parte\",\n \"VOIDED\": \"Anulado\",\n \"EXPIRED\": \"Expirado\",\n \"ACTIVE\": \"Ativo\",\n \"INACTIVE\": \"Inativo\",\n \"SUSPENDED\": \"Suspenso\",\n \"REVOKED\": \"Retirado\",\n \"TRIALING\": \"Período de teste\",\n \"PAUSED\": \"Em pausa\",\n \"PAST_DUE\": \"Pagamento em atraso\",\n \"UNPAID\": \"Por pagar\",\n \"INCOMPLETE\": \"Incompleto\",\n \"CANCELED\": \"Cancelado\",\n \"CANCELLED\": \"Cancelado\",\n \"OPEN\": \"Aberto\",\n \"CLOSED\": \"Fechado\",\n \"RESOLVED\": \"Resolvido\",\n \"AWAITING_REPLY\": \"A aguardar a tua resposta\",\n \"APPROVED\": \"Aprovado\",\n \"REJECTED\": \"Rejeitado\",\n \"REQUESTED\": \"Pedido\",\n \"CONVERTED\": \"Convertido\",\n \"PAID\": \"Pago\",\n \"FAILED\": \"Falhou\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Entregue\",\n \"AWAITING_FULFILLMENT\": \"A aguardar preparação\",\n \"PENDING\": \"Pendente\",\n \"FAILED\": \"A entrega falhou\"\n },\n \"overview\": {\n \"loading\": \"A carregar a tua conta\",\n \"signedInAs\": \"Sessão iniciada como\",\n \"statOrders\": \"Encomendas\",\n \"statLicenses\": \"Licenças\",\n \"statDownloads\": \"Transferências\",\n \"statTickets\": \"Pedidos de apoio\",\n \"walletLabel\": \"Saldo da loja\",\n \"walletNote\": \"Aplicado no pagamento\",\n \"recentOrders\": \"Encomendas recentes\",\n \"allOrders\": \"Todas as encomendas\"\n },\n \"orders\": {\n \"loading\": \"A carregar as tuas encomendas\",\n \"emptyTitle\": \"Ainda sem encomendas\",\n \"emptyBody\": \"As tuas compras nesta loja aparecem aqui assim que fizeres uma.\",\n \"movedTitle\": \"Nada nesta página\",\n \"movedBody\": \"Estas encomendas mudaram de lugar enquanto olhavas para elas.\",\n \"backToFirstPage\": \"Voltar à primeira página\",\n \"pagesLabel\": \"Páginas do histórico de encomendas\",\n \"previous\": \"Anterior\",\n \"next\": \"Seguinte\",\n \"page\": \"Página {page}\",\n \"andMoreOne\": \"e mais um artigo\",\n \"andMoreOther\": \"e mais {count} artigos\",\n \"fallbackTitle\": \"Encomenda {id}\",\n \"allOrders\": \"Todas as encomendas\",\n \"loadingOne\": \"A carregar esta encomenda\",\n \"detailTitle\": \"Encomenda {id}\",\n \"subtotal\": \"Subtotal\",\n \"discount\": \"Desconto\",\n \"tax\": \"Imposto\",\n \"total\": \"Total\",\n \"paidWith\": \"Pago com\",\n \"deliveryTitle\": \"A tua entrega\",\n \"replacement\": \"Substituição\",\n \"search\": \"Procurar encomendas\",\n \"searchPlaceholder\": \"Procurar por número de fatura\",\n \"status\": \"Estado\",\n \"statusAll\": \"Todos os estados\",\n \"statusCompleted\": \"Concluída\",\n \"statusPending\": \"Pendente\",\n \"statusProcessing\": \"Em processamento\",\n \"statusRefunded\": \"Reembolsada\",\n \"statusDisputed\": \"Contestada\",\n \"statusExpired\": \"Expirada\",\n \"emptyFiltered\": \"Nenhuma encomenda corresponde. Experimente outro número de fatura ou outro estado.\",\n \"warrantyTitle\": \"Garantia\",\n \"warrantyCoveredUntil\": \"Coberto até {date}\",\n \"warrantyEnded\": \"A cobertura terminou a {date}\",\n \"warrantyCancelled\": \"Cobertura cancelada\",\n \"warrantyClaimSubmitted\": \"Pedido enviado\",\n \"warrantyClaimApproved\": \"Pedido aprovado\",\n \"warrantyClaimDeclined\": \"Pedido recusado\",\n \"warrantyClaimStart\": \"Abrir um pedido\",\n \"warrantyClaimLabel\": \"O que aconteceu?\",\n \"warrantyClaimOptional\": \"Opcional\",\n \"warrantyClaimSend\": \"Enviar pedido\",\n \"warrantyClaimSending\": \"A enviar…\",\n \"warrantyClaimDone\": \"A loja recebeu o teu pedido. Respondem por e-mail.\",\n \"warrantyClaimFailed\": \"Não foi possível enviar o teu pedido.\"\n },\n \"downloads\": {\n \"loading\": \"A carregar as tuas transferências\",\n \"emptyTitle\": \"Ainda não há nada para transferir\",\n \"emptyBody\": \"Ficheiros, chaves e ligações de acesso aparecem aqui assim que uma encomenda fica concluída.\",\n \"licensesTitle\": \"Chaves de licença\",\n \"filesTitle\": \"Ficheiros\",\n \"codesTitle\": \"Códigos e ligações\",\n \"download\": \"Transferir\",\n \"openLink\": \"Abrir ligação\",\n \"viewOrder\": \"Ver encomenda\",\n \"expires\": \"Expira a {date}\",\n \"neverExpires\": \"Sem data de fim\",\n \"lockedTo\": \"Ligada a {hardwareId}\",\n \"resetHwid\": \"Repor o ID de hardware\",\n \"resettingHwid\": \"A repor…\",\n \"hwidResetDone\": \"O ID de hardware foi limpo. A tua próxima ativação fica com esta licença.\",\n \"hwidResetFailed\": \"Não foi possível repor o ID de hardware. Tenta de novo.\",\n \"renewTitle\": \"Renovável\",\n \"renewBody\": \"Uma renovação é uma compra, por isso passa pelo pagamento e não por esta página.\",\n \"renewAction\": \"Abrir a loja\",\n \"brokenTitle\": \"Não foi possível listar as tuas transferências\",\n \"brokenBody\": \"A loja enviou uma entrada de licença ({id}) sem a licença por trás dela, por isso faltaria a esta lista aquilo que ela própria nomeia.\",\n \"brokenFileBody\": \"A loja enviou uma entrada de ficheiro ({id}) sem nada para transferir, por isso esta lista indicaria um ficheiro que não consegue entregar.\"\n },\n \"subscriptions\": {\n \"loading\": \"A carregar as tuas subscrições\",\n \"emptyTitle\": \"Ainda sem subscrições\",\n \"emptyBody\": \"As compras recorrentes aparecem aqui assim que começares uma.\",\n \"allSubscriptions\": \"Todas as subscrições\",\n \"unnamedPlan\": \"Subscrição\",\n \"renews\": \"Renova a {date}\",\n \"ends\": \"Termina a {date}\",\n \"canceled\": \"Cancelada a {date}\",\n \"startedOn\": \"Começou a {date}\",\n \"billingDayOne\": \"Cobrança diária\",\n \"billingDayOther\": \"Cobrança a cada {count} dias\",\n \"billingWeekOne\": \"Cobrança semanal\",\n \"billingWeekOther\": \"Cobrança a cada {count} semanas\",\n \"billingMonthOne\": \"Cobrança mensal\",\n \"billingMonthOther\": \"Cobrança a cada {count} meses\",\n \"billingYearOne\": \"Cobrança anual\",\n \"billingYearOther\": \"Cobrança a cada {count} anos\",\n \"billingOther\": \"Cobrança a cada {count} × {interval}\",\n \"gateway\": \"Fornecedor de pagamento\",\n \"paymentMethod\": \"Método de pagamento\",\n \"cardOnFile\": \"{brand} terminado em {last4}\",\n \"noPaymentMethod\": \"Nenhum guardado\",\n \"paymentMethodElsewhere\": \"A ligação para alterares os teus dados de pagamento chega pelos e-mails da própria loja. Não é fornecida aqui, porque qualquer coisa nesta página a poderia apanhar.\",\n \"pause\": \"Pausar\",\n \"pausing\": \"A pausar…\",\n \"resume\": \"Retomar\",\n \"resuming\": \"A retomar…\",\n \"cancel\": \"Cancelar subscrição\",\n \"cancelling\": \"A cancelar…\",\n \"keep\": \"Manter\",\n \"confirmCancelTitle\": \"Cancelar esta subscrição?\",\n \"confirmCancelAtPeriodEnd\": \"Manténs o acesso até {date}. Depois disso não há mais cobranças.\",\n \"confirmCancelNow\": \"O acesso termina assim que isto for cancelado.\",\n \"actionFailed\": \"Isso não foi concluído. Tenta de novo.\",\n \"paused\": \"Esta subscrição está em pausa.\",\n \"resumed\": \"Esta subscrição voltou a estar ativa.\",\n \"cancelled\": \"Esta subscrição está cancelada.\",\n \"historyTitle\": \"Histórico de cobranças\",\n \"historyLoading\": \"A carregar o histórico de cobranças\",\n \"historyEmptyTitle\": \"Ainda sem histórico de cobranças\",\n \"historyEmptyBody\": \"As faturas de renovação aparecem aqui depois do primeiro ciclo.\",\n \"trial\": \"O período de teste termina a {date}\"\n },\n \"favorites\": {\n \"loading\": \"A carregar os teus favoritos\",\n \"emptyTitle\": \"Ainda sem favoritos\",\n \"emptyBody\": \"Os produtos que guardas enquanto vês a loja ficam aqui.\",\n \"added\": \"Guardado a {date}\",\n \"gone\": \"Já não está disponível\",\n \"view\": \"Ver na loja\",\n \"remove\": \"Remover\",\n \"removing\": \"A remover…\",\n \"removeFailed\": \"Não foi possível remover este favorito. Tenta de novo.\",\n \"noImage\": \"Sem imagem para {title}\"\n },\n \"rewards\": {\n \"loading\": \"A carregar as tuas recompensas\",\n \"available\": \"Disponível\",\n \"pending\": \"A decorrer\",\n \"lifetime\": \"Ganho no total\",\n \"couponsTitle\": \"Os teus cupões\",\n \"couponsBody\": \"Cola um destes no pagamento.\",\n \"percentOff\": \"{percent}% de desconto\",\n \"couponGeneric\": \"Cupão de desconto\",\n \"expiresOn\": \"Expira a {date}\",\n \"activityTitle\": \"Atividade\",\n \"emptyTitle\": \"Ainda sem recompensas\",\n \"emptyBody\": \"Conclui uma encomenda ou deixa uma avaliação para começares a ganhar.\",\n \"storeCredit\": \"{amount} de saldo da loja\",\n \"storeCreditGeneric\": \"Saldo da loja\",\n \"couponNamed\": \"Cupão {code}\",\n \"couponUnnamed\": \"Código de cupão\",\n \"otherReward\": \"Recompensa\",\n \"reasonOrderCompleted\": \"Encomenda concluída\",\n \"reasonOrderCount\": \"Marco de fidelidade\",\n \"reasonSpendAmount\": \"Total gasto\",\n \"reasonReview\": \"Avaliação deixada\",\n \"reasonFirstPurchase\": \"Primeira compra\",\n \"reasonOther\": \"Recompensa\",\n \"grantFulfilled\": \"Ganho\",\n \"grantPending\": \"A decorrer\",\n \"grantFailed\": \"Falhou\",\n \"grantRevoked\": \"Retirado\",\n \"pointsTitle\": \"Pontos\",\n \"pointsBalance\": \"Saldo de pontos\",\n \"pointsLifetime\": \"Ganhos no total\",\n \"pointsEarnHint\": \"Conclui uma encomenda para começares a juntar pontos.\",\n \"pointsActivityTitle\": \"Movimentos de pontos\",\n \"pointsFromOrder\": \"Encomenda concluída\",\n \"pointsFromReview\": \"Avaliação deixada\",\n \"pointsConverted\": \"Convertido em saldo da loja\",\n \"pointsAdjusted\": \"Ajustado pela loja\",\n \"redeemTitle\": \"Converter pontos\",\n \"redeemBody\": \"Converte os teus pontos em saldo da loja e usa-o no pagamento.\",\n \"redeemLabel\": \"Pontos a converter\",\n \"redeemMinimum\": \"Converte pelo menos {points} pontos.\",\n \"redeemOverBalance\": \"Tens {points} pontos para gastar.\",\n \"redeemInvalid\": \"Indica um número inteiro de pontos.\",\n \"redeemPreview\": \"Vale cerca de {amount} de saldo da loja.\",\n \"redeemContinue\": \"Continuar\",\n \"redeemConfirm\": \"Converter {points} pontos em cerca de {amount} de saldo da loja?\",\n \"redeemConfirmAction\": \"Sim, converter\",\n \"redeemWorking\": \"A converter…\",\n \"redeemDone\": \"{amount} adicionados ao teu saldo da loja.\",\n \"redeemFailed\": \"Não foi possível converter os teus pontos.\"\n },\n \"referrals\": {\n \"loading\": \"A carregar as tuas indicações\",\n \"notEnrolledTitle\": \"Não estás no programa de indicações\",\n \"notEnrolledBody\": \"Esta loja não te inscreveu, por isso ainda não há nada para partilhar ou acompanhar.\",\n \"availableLabel\": \"Disponível para levantar\",\n \"pendingLabel\": \"Pendente\",\n \"requestedLabel\": \"Pedido\",\n \"payoutsElsewhere\": \"Os levantamentos e pagamentos são tratados pela loja, não a partir desta página.\",\n \"codesAccepted\": \"O teu código é aceite no pagamento.\",\n \"codesNotAccepted\": \"De momento, esta loja não aceita códigos de indicação no pagamento.\",\n \"linksTitle\": \"As tuas ligações\",\n \"linksEmptyTitle\": \"Ainda sem ligações de indicação\",\n \"linksEmptyBody\": \"É a loja que cria as ligações que partilhas. Pede-lhes uma se esperavas encontrá-la aqui.\",\n \"primary\": \"Principal\",\n \"commission\": \"{percent}% de comissão\",\n \"buyerDiscount\": \"{percent}% de desconto para o comprador\",\n \"awaitingApproval\": \"A aguardar que a loja aprove esta ligação.\",\n \"clicks\": \"Cliques\",\n \"sales\": \"Vendas\",\n \"revenue\": \"Receita\",\n \"commissionsTitle\": \"Comissões\",\n \"commissionsEmptyTitle\": \"Ainda sem comissões\",\n \"commissionsEmptyBody\": \"As vendas por indicação aprovadas aparecem aqui.\",\n \"commissionFor\": \"Encomenda {id}\",\n \"balanceTitle\": \"Movimentos do saldo\",\n \"balanceEmptyTitle\": \"Ainda sem movimentos de saldo\",\n \"balanceEmptyBody\": \"As conversões e os pagamentos aparecem aqui.\",\n \"claimStoreCredit\": \"Saldo da loja\",\n \"claimCryptoPayout\": \"Pagamento em cripto\",\n \"claimAdjustment\": \"Ajuste\",\n \"differentCurrency\": \"O teu saldo de indicações está em {currency}.\",\n \"convertedLabel\": \"Passou para saldo da loja\",\n \"paidLabel\": \"Pago\"\n },\n \"support\": {\n \"loading\": \"A carregar os teus pedidos\",\n \"ticketsTitle\": \"Os teus pedidos\",\n \"emptyTitle\": \"Ainda sem pedidos\",\n \"emptyBody\": \"Escreve à loja por aqui e todas as respostas ficam nesta página.\",\n \"newTicket\": \"Novo pedido\",\n \"backToTickets\": \"Todos os pedidos\",\n \"updated\": \"Atualizado a {date}\",\n \"aboutOrder\": \"Sobre a encomenda {id}\",\n \"subjectLabel\": \"Assunto\",\n \"subjectOptional\": \"Opcional\",\n \"messageLabel\": \"Mensagem\",\n \"replyLabel\": \"A tua resposta\",\n \"create\": \"Enviar à loja\",\n \"creating\": \"A enviar…\",\n \"createFailed\": \"Não foi possível criar o teu pedido. Tenta de novo.\",\n \"reply\": \"Enviar resposta\",\n \"replying\": \"A enviar…\",\n \"replyFailed\": \"Não foi possível enviar a tua resposta. Tenta de novo.\",\n \"tooShort\": \"Escreve pelo menos uma mensagem curta.\",\n \"closedTitle\": \"Este pedido está fechado\",\n \"closedBody\": \"Abre um novo se ainda precisares de ajuda.\",\n \"loadingThread\": \"A carregar esta conversa\",\n \"noMessages\": \"Ainda não há mensagens neste pedido.\",\n \"fromYou\": \"Tu\",\n \"fromMerchant\": \"Loja\",\n \"fromSystem\": \"Sistema\",\n \"untitled\": \"Pedido de apoio\"\n },\n \"settings\": {\n \"loading\": \"A carregar as tuas definições\",\n \"profileTitle\": \"Perfil\",\n \"emailLabel\": \"E-mail\",\n \"emailNote\": \"O teu e-mail é o que te dá acesso, por isso é alterado pela loja e não aqui.\",\n \"nameLabel\": \"Nome\",\n \"nameTooShort\": \"Introduz o teu nome.\",\n \"saveProfile\": \"Guardar alterações\",\n \"savingProfile\": \"A guardar…\",\n \"profileSaved\": \"O teu nome foi atualizado.\",\n \"profileFailed\": \"Não foi possível guardar o teu nome. Tenta de novo.\",\n \"uploadAvatar\": \"Carregar uma foto\",\n \"uploadingAvatar\": \"A carregar…\",\n \"removeAvatar\": \"Remover foto\",\n \"removingAvatar\": \"A remover…\",\n \"avatarHint\": \"JPG, PNG, GIF ou WebP, até 10 MB.\",\n \"avatarFailed\": \"Não foi possível carregar a tua foto. Tenta de novo.\",\n \"avatarRemoveFailed\": \"Não foi possível remover a tua foto. Tenta de novo.\",\n \"avatarTooLarge\": \"Essa imagem tem mais de 10 MB.\",\n \"emailsTitle\": \"E-mails da loja\",\n \"emailsLoading\": \"A carregar as tuas definições de e-mail\",\n \"unsubscribeAll\": \"Nenhum e-mail de marketing\",\n \"unsubscribeAllNote\": \"Os e-mails de encomenda e entrega são enviados de qualquer forma.\",\n \"listsEmpty\": \"Esta loja não tem listas de envio.\",\n \"emailsFailed\": \"Não foi possível carregar as tuas definições de e-mail.\",\n \"emailsSaveFailed\": \"Não foi possível guardar essa definição. Tenta de novo.\",\n \"devicesTitle\": \"Dispositivos com sessão iniciada\",\n \"devicesLoading\": \"A carregar os teus dispositivos\",\n \"devicesEmpty\": \"Não há mais nenhum dispositivo com sessão iniciada.\",\n \"thisDevice\": \"Este dispositivo\",\n \"signedInOn\": \"Sessão iniciada a {date}\",\n \"unknownDevice\": \"Dispositivo desconhecido\",\n \"signOutDevice\": \"Terminar sessão\",\n \"signingOutDevice\": \"A terminar sessão…\",\n \"signOutOthers\": \"Terminar sessão nos outros dispositivos\",\n \"signOutOthersDone\": \"A sessão foi terminada em todos os outros dispositivos.\",\n \"devicesFailed\": \"Não foi possível carregar os teus dispositivos.\",\n \"signOutDeviceFailed\": \"Não foi possível terminar a sessão nesse dispositivo. Tenta de novo.\",\n \"deviceOn\": \"{browser} em {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Adicionar saldo\",\n \"minimum\": \"Mínimo {min}\",\n \"bounds\": \"De {min} a {max}\",\n \"bonus\": \"Adiciona pelo menos {amount} e recebe mais {percent}%\",\n \"amount\": \"Valor\",\n \"submit\": \"Continuar para o pagamento\"\n },\n \"reseller\": {\n \"disabledTitle\": \"O programa de revendedores não está disponível\",\n \"disabledBody\": \"Esta loja não aceita encomendas por grosso neste momento.\",\n \"openTitle\": \"Aderir ao programa de revendedores\",\n \"openBody\": \"Adere agora para comprar produtos desta loja a preços grossistas.\",\n \"join\": \"Aderir agora\",\n \"manualTitle\": \"Aceitar o convite de revendedor\",\n \"manualBody\": \"Introduz o token de convite enviado pela loja.\",\n \"inviteToken\": \"Token de convite\",\n \"acceptInvite\": \"Aceitar convite\",\n \"applicationTitle\": \"Candidatar-se a revendedor\",\n \"applicationBody\": \"Conta à loja sobre o teu negócio e envia a candidatura.\",\n \"applicationNote\": \"Nota da candidatura\",\n \"noteRequired\": \"Adiciona uma nota antes de enviares a candidatura.\",\n \"apply\": \"Enviar candidatura\",\n \"pendingTitle\": \"A tua candidatura está pendente\",\n \"pendingBody\": \"A loja irá rever a candidatura antes de ativar o acesso grossista.\",\n \"rejectedTitle\": \"A tua candidatura foi rejeitada\",\n \"rejectedBody\": \"Contacta a loja para mais informações ou para te candidatares novamente.\",\n \"suspendedTitle\": \"A tua conta de revendedor está suspensa\",\n \"suspendedBody\": \"As encomendas por grosso não estão disponíveis. Contacta a loja para obter ajuda.\",\n \"activeTitle\": \"Conta grossista\",\n \"tier\": \"Nível\",\n \"walletTitle\": \"Saldo grossista\",\n \"balance\": \"Saldo\",\n \"held\": \"Retido\",\n \"catalogTitle\": \"Catálogo grossista\",\n \"search\": \"Pesquisar produtos\",\n \"catalogEmptyTitle\": \"Nenhum produto grossista encontrado\",\n \"catalogEmptyBody\": \"Tenta outra pesquisa ou volta depois de a loja adicionar produtos.\",\n \"volumePricing\": \"Preços por volume disponíveis\",\n \"supplierBacked\": \"Fornecido pelo fornecedor\",\n \"add\": \"Adicionar\",\n \"basketTitle\": \"Cesto grossista\",\n \"basketEmpty\": \"Adiciona um produto do catálogo grossista para iniciar uma encomenda.\",\n \"quantity\": \"Quantidade\",\n \"basketNeedsQuote\": \"Calcula este cesto para veres o total atual antes de encomendar.\",\n \"quote\": \"Calcular cesto\",\n \"place\": \"Fazer encomenda\",\n \"ordersTitle\": \"Encomendas grossistas\",\n \"ordersEmptyTitle\": \"Ainda não há encomendas grossistas\",\n \"ordersEmptyBody\": \"As encomendas pagas com o teu saldo grossista aparecem aqui.\",\n \"refunded\": \"Reembolsado para o saldo\",\n \"lineQuantity\": \"Quantidade {count}\",\n \"serials\": \"Séries entregues\",\n \"apiKeysTitle\": \"Chaves API de revendedor\",\n \"apiKeyName\": \"Nome da chave\",\n \"createApiKey\": \"Criar chave\",\n \"apiKeysEmpty\": \"Ainda não criaste chaves API de revendedor.\",\n \"orderElsewhere\": \"As encomendas grossistas são feitas pela API de revendedor, não a partir desta página.\",\n \"keysElsewhere\": \"As chaves API são emitidas pela loja. Peça-lhes uma.\",\n \"apiKeyCreatedTitle\": \"Copia esta chave agora\",\n \"apiKeyCreatedBody\": \"Esta chave em texto simples é mostrada uma vez e não pode ser recuperada depois.\",\n \"dismissKey\": \"Já a guardei\",\n \"lastUsed\": \"Última utilização: {date}\",\n \"neverUsed\": \"Nunca utilizada\",\n \"revokeApiKey\": \"Revogar\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Копировать\",\n \"copied\": \"Скопировано\",\n \"retry\": \"Повторить\",\n \"notLoaded\": \"Это не загрузилось\",\n \"genericError\": \"Не удалось загрузить это. Повторите попытку через минуту.\",\n \"browseStore\": \"Перейти в магазин\",\n \"unavailable\": \"Недоступно\",\n \"cancel\": \"Отмена\"\n },\n \"account\": {\n \"title\": \"Ваш аккаунт\",\n \"sections\": \"Разделы аккаунта\",\n \"signOut\": \"Выйти\",\n \"signingOut\": \"Выходим…\",\n \"signOutFailed\": \"Не удалось выйти из аккаунта. Повторите попытку.\",\n \"checkingSession\": \"Проверяем вашу сессию\",\n \"sessionUnknown\": \"Не удалось проверить вашу сессию. Повторите попытку через минуту.\",\n \"goToOverview\": \"Перейти к обзору\",\n \"tabs\": {\n \"overview\": \"Обзор\",\n \"orders\": \"Заказы\",\n \"downloads\": \"Загрузки\",\n \"subscriptions\": \"Подписки\",\n \"rewards\": \"Бонусы\",\n \"referrals\": \"Рефералы\",\n \"favorites\": \"Избранное\",\n \"support\": \"Поддержка\",\n \"settings\": \"Настройки\",\n \"reseller\": \"Реселлер\"\n },\n \"notBuilt\": {\n \"title\": \"Раздела «{tab}» в этом магазине нет\",\n \"body\": \"Этот магазин такой раздел не предлагает. Ваши заказы и данные аккаунта по-прежнему здесь.\"\n },\n \"unknownTab\": {\n \"title\": \"Эта ссылка никуда не ведёт\",\n \"body\": \"В адресе указан раздел аккаунта, которого не существует. Возможно, он набран с ошибкой или обрезан.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Вход в ваш аккаунт\",\n \"titleCode\": \"Проверьте почту\",\n \"introEmail\": \"Мы отправим одноразовый код на вашу почту. Пароль запоминать не нужно.\",\n \"introCode\": \"Введите код, который мы отправили на {email}.\",\n \"emailLabel\": \"Эл. почта\",\n \"codeLabel\": \"Код для входа\",\n \"invalidEmail\": \"Введите полный адрес почты, например name@example.com.\",\n \"missingCode\": \"Введите код из письма.\",\n \"send\": \"Отправить мне код\",\n \"sending\": \"Отправляем…\",\n \"submit\": \"Войти\",\n \"submitting\": \"Проверяем…\",\n \"resend\": \"Отправить новый код\",\n \"resent\": \"Новый код уже летит на {email}.\",\n \"changeEmail\": \"Другой адрес почты\",\n \"sendFailed\": \"Не удалось отправить код. Повторите попытку через минуту.\",\n \"verifyFailed\": \"Этот код не подошёл. Повторите попытку.\"\n },\n \"status\": {\n \"COMPLETED\": \"Выполнено\",\n \"PROCESSING\": \"В обработке\",\n \"AWAITING_STOCK\": \"Ожидает поступления\",\n \"PENDING\": \"В ожидании\",\n \"PENDING_PAYMENT\": \"Ожидает оплаты\",\n \"UNDERPAID\": \"Оплачено не полностью\",\n \"DISPUTED\": \"Открыт спор\",\n \"REFUNDED\": \"Возвращено\",\n \"PARTIAL_REFUND\": \"Возвращено частично\",\n \"VOIDED\": \"Аннулировано\",\n \"EXPIRED\": \"Срок истёк\",\n \"ACTIVE\": \"Активно\",\n \"INACTIVE\": \"Неактивно\",\n \"SUSPENDED\": \"Приостановлено\",\n \"REVOKED\": \"Отозвано\",\n \"TRIALING\": \"Пробный период\",\n \"PAUSED\": \"На паузе\",\n \"PAST_DUE\": \"Платёж просрочен\",\n \"UNPAID\": \"Не оплачено\",\n \"INCOMPLETE\": \"Не завершено\",\n \"CANCELED\": \"Отменено\",\n \"CANCELLED\": \"Отменено\",\n \"OPEN\": \"Открыто\",\n \"CLOSED\": \"Закрыто\",\n \"RESOLVED\": \"Решено\",\n \"AWAITING_REPLY\": \"Ждём вашего ответа\",\n \"APPROVED\": \"Одобрено\",\n \"REJECTED\": \"Отклонено\",\n \"REQUESTED\": \"Запрошено\",\n \"CONVERTED\": \"Переведено\",\n \"PAID\": \"Оплачено\",\n \"FAILED\": \"Не удалось\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Доставлено\",\n \"AWAITING_FULFILLMENT\": \"Ожидает отправки\",\n \"PENDING\": \"В ожидании\",\n \"FAILED\": \"Доставка не удалась\"\n },\n \"overview\": {\n \"loading\": \"Загружаем ваш аккаунт\",\n \"signedInAs\": \"Вы вошли как\",\n \"statOrders\": \"Заказы\",\n \"statLicenses\": \"Лицензии\",\n \"statDownloads\": \"Загрузки\",\n \"statTickets\": \"Обращения в поддержку\",\n \"walletLabel\": \"Баланс магазина\",\n \"walletNote\": \"Учитывается при оплате\",\n \"recentOrders\": \"Последние заказы\",\n \"allOrders\": \"Все заказы\"\n },\n \"orders\": {\n \"loading\": \"Загружаем ваши заказы\",\n \"emptyTitle\": \"Заказов пока нет\",\n \"emptyBody\": \"Покупки в этом магазине появятся здесь сразу после первого заказа.\",\n \"movedTitle\": \"На этой странице ничего нет\",\n \"movedBody\": \"Пока вы смотрели список, эти заказы переехали на другую страницу.\",\n \"backToFirstPage\": \"Вернуться на первую страницу\",\n \"pagesLabel\": \"Страницы истории заказов\",\n \"previous\": \"Назад\",\n \"next\": \"Вперёд\",\n \"page\": \"Страница {page}\",\n \"andMoreOne\": \"и ещё одна позиция\",\n \"andMoreOther\": \"и ещё {count} позиций\",\n \"fallbackTitle\": \"Заказ {id}\",\n \"allOrders\": \"Все заказы\",\n \"loadingOne\": \"Загружаем этот заказ\",\n \"detailTitle\": \"Заказ {id}\",\n \"subtotal\": \"Промежуточный итог\",\n \"discount\": \"Скидка\",\n \"tax\": \"Налог\",\n \"total\": \"Итого\",\n \"paidWith\": \"Оплачено через\",\n \"deliveryTitle\": \"Ваша доставка\",\n \"replacement\": \"Замена\",\n \"search\": \"Поиск заказов\",\n \"searchPlaceholder\": \"Поиск по номеру счёта\",\n \"status\": \"Статус\",\n \"statusAll\": \"Все статусы\",\n \"statusCompleted\": \"Завершён\",\n \"statusPending\": \"Ожидает\",\n \"statusProcessing\": \"В обработке\",\n \"statusRefunded\": \"Возвращён\",\n \"statusDisputed\": \"Оспорен\",\n \"statusExpired\": \"Истёк\",\n \"emptyFiltered\": \"Подходящих заказов нет. Попробуйте другой номер счёта или другой статус.\",\n \"warrantyTitle\": \"Гарантия\",\n \"warrantyCoveredUntil\": \"Действует до {date}\",\n \"warrantyEnded\": \"Гарантия закончилась {date}\",\n \"warrantyCancelled\": \"Гарантия аннулирована\",\n \"warrantyClaimSubmitted\": \"Обращение отправлено\",\n \"warrantyClaimApproved\": \"Обращение одобрено\",\n \"warrantyClaimDeclined\": \"Обращение отклонено\",\n \"warrantyClaimStart\": \"Обратиться по гарантии\",\n \"warrantyClaimLabel\": \"Что случилось?\",\n \"warrantyClaimOptional\": \"Необязательно\",\n \"warrantyClaimSend\": \"Отправить обращение\",\n \"warrantyClaimSending\": \"Отправляем…\",\n \"warrantyClaimDone\": \"Магазин получил ваше обращение. Ответ придёт на почту.\",\n \"warrantyClaimFailed\": \"Не удалось отправить обращение.\"\n },\n \"downloads\": {\n \"loading\": \"Загружаем ваши файлы\",\n \"emptyTitle\": \"Скачивать пока нечего\",\n \"emptyBody\": \"Файлы, ключи и ссылки доступа появятся здесь, как только заказ будет выполнен.\",\n \"licensesTitle\": \"Лицензионные ключи\",\n \"filesTitle\": \"Файлы\",\n \"codesTitle\": \"Коды и ссылки\",\n \"download\": \"Скачать\",\n \"openLink\": \"Открыть ссылку\",\n \"viewOrder\": \"Открыть заказ\",\n \"expires\": \"Действует до {date}\",\n \"neverExpires\": \"Без срока окончания\",\n \"lockedTo\": \"Привязана к {hardwareId}\",\n \"resetHwid\": \"Сбросить ID устройства\",\n \"resettingHwid\": \"Сбрасываем…\",\n \"hwidResetDone\": \"ID устройства очищен. Следующая активация закрепит эту лицензию заново.\",\n \"hwidResetFailed\": \"Не удалось сбросить ID устройства. Повторите попытку.\",\n \"renewTitle\": \"Можно продлить\",\n \"renewBody\": \"Продление — это покупка, поэтому оно проходит через оформление заказа, а не через эту страницу.\",\n \"renewAction\": \"Открыть магазин\",\n \"brokenTitle\": \"Не удалось показать список загрузок\",\n \"brokenBody\": \"Магазин прислал запись о лицензии ({id}) без самой лицензии, поэтому в списке не хватало бы того, что он называет.\",\n \"brokenFileBody\": \"Магазин прислал запись о файле ({id}), к которой нечего скачать, поэтому список назвал бы файл, который не может выдать.\"\n },\n \"subscriptions\": {\n \"loading\": \"Загружаем ваши подписки\",\n \"emptyTitle\": \"Подписок пока нет\",\n \"emptyBody\": \"Регулярные покупки появятся здесь, как только вы оформите первую.\",\n \"allSubscriptions\": \"Все подписки\",\n \"unnamedPlan\": \"Подписка\",\n \"renews\": \"Продление {date}\",\n \"ends\": \"Заканчивается {date}\",\n \"canceled\": \"Отменена {date}\",\n \"startedOn\": \"Начата {date}\",\n \"billingDayOne\": \"Списание каждый день\",\n \"billingDayOther\": \"Списание раз в {count} дней\",\n \"billingWeekOne\": \"Списание каждую неделю\",\n \"billingWeekOther\": \"Списание раз в {count} недель\",\n \"billingMonthOne\": \"Списание каждый месяц\",\n \"billingMonthOther\": \"Списание раз в {count} месяцев\",\n \"billingYearOne\": \"Списание каждый год\",\n \"billingYearOther\": \"Списание раз в {count} лет\",\n \"billingOther\": \"Списание раз в {count} × {interval}\",\n \"gateway\": \"Платёжный провайдер\",\n \"paymentMethod\": \"Способ оплаты\",\n \"cardOnFile\": \"{brand}, последние цифры {last4}\",\n \"noPaymentMethod\": \"Не сохранён\",\n \"paymentMethodElsewhere\": \"Ссылка на изменение платёжных данных приходит в письмах самого магазина. Здесь мы её не выдаём, потому что её мог бы перехватить любой элемент этой страницы.\",\n \"pause\": \"Приостановить\",\n \"pausing\": \"Приостанавливаем…\",\n \"resume\": \"Возобновить\",\n \"resuming\": \"Возобновляем…\",\n \"cancel\": \"Отменить подписку\",\n \"cancelling\": \"Отменяем…\",\n \"keep\": \"Оставить\",\n \"confirmCancelTitle\": \"Отменить эту подписку?\",\n \"confirmCancelAtPeriodEnd\": \"Доступ сохранится до {date}. После этого списаний не будет.\",\n \"confirmCancelNow\": \"Доступ прекратится сразу после отмены.\",\n \"actionFailed\": \"Действие не прошло. Повторите попытку.\",\n \"paused\": \"Эта подписка приостановлена.\",\n \"resumed\": \"Эта подписка снова активна.\",\n \"cancelled\": \"Эта подписка отменена.\",\n \"historyTitle\": \"История списаний\",\n \"historyLoading\": \"Загружаем историю списаний\",\n \"historyEmptyTitle\": \"Истории списаний пока нет\",\n \"historyEmptyBody\": \"Счета за продление появятся здесь после первого периода.\",\n \"trial\": \"Пробный период заканчивается {date}\"\n },\n \"favorites\": {\n \"loading\": \"Загружаем ваше избранное\",\n \"emptyTitle\": \"В избранном пока пусто\",\n \"emptyBody\": \"Товары, которые вы сохраняете при просмотре магазина, остаются здесь.\",\n \"added\": \"Сохранено {date}\",\n \"gone\": \"Больше не продаётся\",\n \"view\": \"Открыть в магазине\",\n \"remove\": \"Удалить\",\n \"removing\": \"Удаляем…\",\n \"removeFailed\": \"Не удалось убрать товар из избранного. Повторите попытку.\",\n \"noImage\": \"Нет изображения для {title}\"\n },\n \"rewards\": {\n \"loading\": \"Загружаем ваши бонусы\",\n \"available\": \"Доступно\",\n \"pending\": \"В процессе\",\n \"lifetime\": \"Начислено всего\",\n \"couponsTitle\": \"Ваши купоны\",\n \"couponsBody\": \"Вставьте один из них при оформлении заказа.\",\n \"percentOff\": \"Скидка {percent}%\",\n \"couponGeneric\": \"Купон на скидку\",\n \"expiresOn\": \"Действует до {date}\",\n \"activityTitle\": \"История\",\n \"emptyTitle\": \"Бонусов пока нет\",\n \"emptyBody\": \"Оформите заказ или оставьте отзыв, чтобы начать копить.\",\n \"storeCredit\": \"{amount} на баланс магазина\",\n \"storeCreditGeneric\": \"Баланс магазина\",\n \"couponNamed\": \"Купон {code}\",\n \"couponUnnamed\": \"Код купона\",\n \"otherReward\": \"Бонус\",\n \"reasonOrderCompleted\": \"Заказ выполнен\",\n \"reasonOrderCount\": \"Рубеж по числу заказов\",\n \"reasonSpendAmount\": \"Сумма покупок за всё время\",\n \"reasonReview\": \"Оставлен отзыв\",\n \"reasonFirstPurchase\": \"Первая покупка\",\n \"reasonOther\": \"Бонус\",\n \"grantFulfilled\": \"Начислено\",\n \"grantPending\": \"В процессе\",\n \"grantFailed\": \"Не удалось\",\n \"grantRevoked\": \"Отозвано\",\n \"pointsTitle\": \"Баллы\",\n \"pointsBalance\": \"Баланс баллов\",\n \"pointsLifetime\": \"Накоплено за всё время\",\n \"pointsEarnHint\": \"Оформите заказ, чтобы начать копить баллы.\",\n \"pointsActivityTitle\": \"История баллов\",\n \"pointsFromOrder\": \"Заказ выполнен\",\n \"pointsFromReview\": \"Оставлен отзыв\",\n \"pointsConverted\": \"Обменяно на баланс магазина\",\n \"pointsAdjusted\": \"Скорректировано магазином\",\n \"redeemTitle\": \"Обменять баллы\",\n \"redeemBody\": \"Обменяйте баллы на баланс магазина и оплатите им заказ.\",\n \"redeemLabel\": \"Баллы к обмену\",\n \"redeemMinimum\": \"Обменяйте не менее {points} баллов.\",\n \"redeemOverBalance\": \"У вас {points} баллов.\",\n \"redeemInvalid\": \"Введите целое число баллов.\",\n \"redeemPreview\": \"Это примерно {amount} на баланс магазина.\",\n \"redeemContinue\": \"Далее\",\n \"redeemConfirm\": \"Обменять {points} баллов примерно на {amount} баланса магазина?\",\n \"redeemConfirmAction\": \"Да, обменять\",\n \"redeemWorking\": \"Обмениваем…\",\n \"redeemDone\": \"{amount} зачислено на баланс магазина.\",\n \"redeemFailed\": \"Не удалось обменять ваши баллы.\"\n },\n \"referrals\": {\n \"loading\": \"Загружаем ваши рефералы\",\n \"notEnrolledTitle\": \"Вы не участвуете в реферальной программе\",\n \"notEnrolledBody\": \"Магазин вас не подключил, поэтому делиться и отслеживать пока нечего.\",\n \"availableLabel\": \"Доступно к выводу\",\n \"pendingLabel\": \"В ожидании\",\n \"requestedLabel\": \"Запрошено\",\n \"payoutsElsewhere\": \"Выводом и выплатами занимается магазин, а не эта страница.\",\n \"codesAccepted\": \"Ваш код принимается при оформлении заказа.\",\n \"codesNotAccepted\": \"Сейчас этот магазин не принимает реферальные коды при оформлении заказа.\",\n \"linksTitle\": \"Ваши ссылки\",\n \"linksEmptyTitle\": \"Реферальных ссылок пока нет\",\n \"linksEmptyBody\": \"Ссылки для распространения создаёт магазин. Попросите ссылку, если рассчитывали найти её здесь.\",\n \"primary\": \"Основная\",\n \"commission\": \"Комиссия {percent}%\",\n \"buyerDiscount\": \"Скидка покупателю {percent}%\",\n \"awaitingApproval\": \"Ждём, пока магазин одобрит эту ссылку.\",\n \"clicks\": \"Клики\",\n \"sales\": \"Продажи\",\n \"revenue\": \"Выручка\",\n \"commissionsTitle\": \"Комиссии\",\n \"commissionsEmptyTitle\": \"Комиссий пока нет\",\n \"commissionsEmptyBody\": \"Одобренные продажи по рефералам появятся здесь.\",\n \"commissionFor\": \"Заказ {id}\",\n \"balanceTitle\": \"Движение баланса\",\n \"balanceEmptyTitle\": \"Движений по балансу пока нет\",\n \"balanceEmptyBody\": \"Переводы и выплаты появятся здесь.\",\n \"claimStoreCredit\": \"Баланс магазина\",\n \"claimCryptoPayout\": \"Выплата в криптовалюте\",\n \"claimAdjustment\": \"Корректировка\",\n \"differentCurrency\": \"Ваш реферальный баланс ведётся в {currency}.\",\n \"convertedLabel\": \"Переведено на баланс магазина\",\n \"paidLabel\": \"Выплачено\"\n },\n \"support\": {\n \"loading\": \"Загружаем ваши обращения\",\n \"ticketsTitle\": \"Ваши обращения\",\n \"emptyTitle\": \"Обращений пока нет\",\n \"emptyBody\": \"Напишите магазину отсюда — все ответы останутся на этой странице.\",\n \"newTicket\": \"Новое обращение\",\n \"backToTickets\": \"Все обращения\",\n \"updated\": \"Обновлено {date}\",\n \"aboutOrder\": \"По заказу {id}\",\n \"subjectLabel\": \"Тема\",\n \"subjectOptional\": \"Необязательно\",\n \"messageLabel\": \"Сообщение\",\n \"replyLabel\": \"Ваш ответ\",\n \"create\": \"Отправить магазину\",\n \"creating\": \"Отправляем…\",\n \"createFailed\": \"Не удалось создать обращение. Повторите попытку.\",\n \"reply\": \"Отправить ответ\",\n \"replying\": \"Отправляем…\",\n \"replyFailed\": \"Не удалось отправить ответ. Повторите попытку.\",\n \"tooShort\": \"Напишите хотя бы короткое сообщение.\",\n \"closedTitle\": \"Это обращение закрыто\",\n \"closedBody\": \"Откройте новое, если помощь ещё нужна.\",\n \"loadingThread\": \"Загружаем переписку\",\n \"noMessages\": \"В этом обращении пока нет сообщений.\",\n \"fromYou\": \"Вы\",\n \"fromMerchant\": \"Магазин\",\n \"fromSystem\": \"Система\",\n \"untitled\": \"Обращение в поддержку\"\n },\n \"settings\": {\n \"loading\": \"Загружаем ваши настройки\",\n \"profileTitle\": \"Профиль\",\n \"emailLabel\": \"Эл. почта\",\n \"emailNote\": \"По вашей почте выполняется вход, поэтому её меняет магазин, а не вы здесь.\",\n \"nameLabel\": \"Имя\",\n \"nameTooShort\": \"Укажите ваше имя.\",\n \"saveProfile\": \"Сохранить изменения\",\n \"savingProfile\": \"Сохраняем…\",\n \"profileSaved\": \"Ваше имя обновлено.\",\n \"profileFailed\": \"Не удалось сохранить ваше имя. Повторите попытку.\",\n \"uploadAvatar\": \"Загрузить фото\",\n \"uploadingAvatar\": \"Загружаем…\",\n \"removeAvatar\": \"Удалить фото\",\n \"removingAvatar\": \"Удаляем…\",\n \"avatarHint\": \"JPG, PNG, GIF или WebP, до 10 МБ.\",\n \"avatarFailed\": \"Не удалось загрузить ваше фото. Повторите попытку.\",\n \"avatarRemoveFailed\": \"Не удалось удалить ваше фото. Повторите попытку.\",\n \"avatarTooLarge\": \"Это изображение больше 10 МБ.\",\n \"emailsTitle\": \"Письма магазина\",\n \"emailsLoading\": \"Загружаем настройки писем\",\n \"unsubscribeAll\": \"Никаких рекламных писем\",\n \"unsubscribeAllNote\": \"Письма о заказах и доставке приходят в любом случае.\",\n \"listsEmpty\": \"У этого магазина нет списков рассылки.\",\n \"emailsFailed\": \"Не удалось загрузить ваши настройки писем.\",\n \"emailsSaveFailed\": \"Не удалось сохранить эту настройку. Повторите попытку.\",\n \"devicesTitle\": \"Устройства с активным входом\",\n \"devicesLoading\": \"Загружаем ваши устройства\",\n \"devicesEmpty\": \"Других устройств с активным входом нет.\",\n \"thisDevice\": \"Это устройство\",\n \"signedInOn\": \"Вход выполнен {date}\",\n \"unknownDevice\": \"Неизвестное устройство\",\n \"signOutDevice\": \"Выйти\",\n \"signingOutDevice\": \"Выходим…\",\n \"signOutOthers\": \"Выйти на всех других устройствах\",\n \"signOutOthersDone\": \"Выход выполнен на всех других устройствах.\",\n \"devicesFailed\": \"Не удалось загрузить список устройств.\",\n \"signOutDeviceFailed\": \"Не удалось выйти на этом устройстве. Повторите попытку.\",\n \"deviceOn\": \"{browser} на {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Пополнить баланс\",\n \"minimum\": \"Минимум {min}\",\n \"bounds\": \"От {min} до {max}\",\n \"bonus\": \"Пополните на {amount} или больше и получите ещё {percent}%\",\n \"amount\": \"Сумма\",\n \"submit\": \"Перейти к оплате\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Программа реселлеров недоступна\",\n \"disabledBody\": \"Сейчас этот магазин не принимает оптовые заказы.\",\n \"openTitle\": \"Присоединиться к программе реселлеров\",\n \"openBody\": \"Присоединитесь, чтобы покупать товары магазина по оптовым ценам.\",\n \"join\": \"Присоединиться\",\n \"manualTitle\": \"Принять приглашение реселлера\",\n \"manualBody\": \"Введите токен приглашения, отправленный магазином.\",\n \"inviteToken\": \"Токен приглашения\",\n \"acceptInvite\": \"Принять приглашение\",\n \"applicationTitle\": \"Подать заявку реселлера\",\n \"applicationBody\": \"Расскажите магазину о своём бизнесе и отправьте заявку.\",\n \"applicationNote\": \"Комментарий к заявке\",\n \"noteRequired\": \"Добавьте комментарий перед отправкой заявки.\",\n \"apply\": \"Отправить заявку\",\n \"pendingTitle\": \"Ваша заявка рассматривается\",\n \"pendingBody\": \"Магазин проверит заявку перед открытием оптового доступа.\",\n \"rejectedTitle\": \"Ваша заявка реселлера отклонена\",\n \"rejectedBody\": \"Обратитесь в магазин за подробностями или чтобы подать заявку снова.\",\n \"suspendedTitle\": \"Ваш аккаунт реселлера приостановлен\",\n \"suspendedBody\": \"Оптовые заказы недоступны. Обратитесь в магазин за помощью.\",\n \"activeTitle\": \"Оптовый аккаунт\",\n \"tier\": \"Уровень\",\n \"walletTitle\": \"Оптовый баланс\",\n \"balance\": \"Баланс\",\n \"held\": \"Зарезервировано\",\n \"catalogTitle\": \"Оптовый каталог\",\n \"search\": \"Поиск товаров\",\n \"catalogEmptyTitle\": \"Оптовые товары не найдены\",\n \"catalogEmptyBody\": \"Попробуйте другой поиск или вернитесь после добавления товаров магазином.\",\n \"volumePricing\": \"Доступны цены за объём\",\n \"supplierBacked\": \"Поставка от поставщика\",\n \"add\": \"Добавить\",\n \"basketTitle\": \"Оптовая корзина\",\n \"basketEmpty\": \"Добавьте товар из оптового каталога, чтобы начать заказ.\",\n \"quantity\": \"Количество\",\n \"basketNeedsQuote\": \"Рассчитайте корзину, чтобы увидеть актуальную сумму перед заказом.\",\n \"quote\": \"Рассчитать корзину\",\n \"place\": \"Оформить заказ\",\n \"ordersTitle\": \"Оптовые заказы\",\n \"ordersEmptyTitle\": \"Оптовых заказов пока нет\",\n \"ordersEmptyBody\": \"Здесь появятся заказы, оплаченные с оптового баланса.\",\n \"refunded\": \"Возвращено на баланс\",\n \"lineQuantity\": \"Количество: {count}\",\n \"serials\": \"Доставленные серийные номера\",\n \"apiKeysTitle\": \"API-ключи реселлера\",\n \"apiKeyName\": \"Название ключа\",\n \"createApiKey\": \"Создать ключ\",\n \"apiKeysEmpty\": \"Вы ещё не создали API-ключи реселлера.\",\n \"orderElsewhere\": \"Оптовые заказы оформляются через API реселлера, а не на этой странице.\",\n \"keysElsewhere\": \"Ключи API выдаёт магазин. Запросите его у них.\",\n \"apiKeyCreatedTitle\": \"Скопируйте этот ключ сейчас\",\n \"apiKeyCreatedBody\": \"Открытый ключ показывается один раз, и позже его нельзя восстановить.\",\n \"dismissKey\": \"Ключ сохранён\",\n \"lastUsed\": \"Последнее использование: {date}\",\n \"neverUsed\": \"Не использовался\",\n \"revokeApiKey\": \"Отозвать\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Kopyala\",\n \"copied\": \"Kopyalandı\",\n \"retry\": \"Tekrar deneyin\",\n \"notLoaded\": \"Bu yüklenemedi\",\n \"genericError\": \"Bu yüklenemedi. Lütfen birazdan tekrar deneyin.\",\n \"browseStore\": \"Mağazaya göz atın\",\n \"unavailable\": \"Mevcut değil\",\n \"cancel\": \"Vazgeç\"\n },\n \"account\": {\n \"title\": \"Hesabınız\",\n \"sections\": \"Hesap bölümleri\",\n \"signOut\": \"Çıkış yap\",\n \"signingOut\": \"Çıkış yapılıyor…\",\n \"signOutFailed\": \"Çıkış yapılamadı. Lütfen tekrar deneyin.\",\n \"checkingSession\": \"Oturumunuz kontrol ediliyor\",\n \"sessionUnknown\": \"Oturumunuz kontrol edilemedi. Lütfen birazdan tekrar deneyin.\",\n \"goToOverview\": \"Genel bakışa git\",\n \"tabs\": {\n \"overview\": \"Genel bakış\",\n \"orders\": \"Siparişler\",\n \"downloads\": \"İndirmeler\",\n \"subscriptions\": \"Abonelikler\",\n \"rewards\": \"Ödüller\",\n \"referrals\": \"Referanslar\",\n \"favorites\": \"Favoriler\",\n \"support\": \"Destek\",\n \"settings\": \"Ayarlar\",\n \"reseller\": \"Bayi\"\n },\n \"notBuilt\": {\n \"title\": \"{tab} bu mağazada yok\",\n \"body\": \"Bu mağaza o bölümü sunmuyor. Siparişleriniz ve hesap bilgileriniz yine burada.\"\n },\n \"unknownTab\": {\n \"title\": \"Bu bağlantı hiçbir yere gitmiyor\",\n \"body\": \"Adres, var olmayan bir hesap bölümünü gösteriyor. Yanlış yazılmış ya da eksik kalmış olabilir.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Hesabınıza giriş yapın\",\n \"titleCode\": \"E-postanızı kontrol edin\",\n \"introEmail\": \"E-posta adresinize tek kullanımlık bir kod gönderiyoruz. Hatırlamanız gereken bir parola yok.\",\n \"introCode\": \"{email} adresine gönderdiğimiz kodu girin.\",\n \"emailLabel\": \"E-posta\",\n \"codeLabel\": \"Giriş kodu\",\n \"invalidEmail\": \"Tam bir e-posta adresi girin, örneğin siz@ornek.com.\",\n \"missingCode\": \"E-postanızdaki kodu girin.\",\n \"send\": \"Bana kod gönder\",\n \"sending\": \"Gönderiliyor…\",\n \"submit\": \"Giriş yap\",\n \"submitting\": \"Kontrol ediliyor…\",\n \"resend\": \"Yeni kod gönder\",\n \"resent\": \"{email} adresine yeni bir kod yolda.\",\n \"changeEmail\": \"Başka bir e-posta kullan\",\n \"sendFailed\": \"Kod gönderilemedi. Lütfen birazdan tekrar deneyin.\",\n \"verifyFailed\": \"Bu kod kabul edilmedi. Lütfen tekrar deneyin.\"\n },\n \"status\": {\n \"COMPLETED\": \"Tamamlandı\",\n \"PROCESSING\": \"İşleniyor\",\n \"AWAITING_STOCK\": \"Stok bekleniyor\",\n \"PENDING\": \"Beklemede\",\n \"PENDING_PAYMENT\": \"Ödeme bekleniyor\",\n \"UNDERPAID\": \"Eksik ödendi\",\n \"DISPUTED\": \"İtiraz edildi\",\n \"REFUNDED\": \"İade edildi\",\n \"PARTIAL_REFUND\": \"Kısmen iade edildi\",\n \"VOIDED\": \"Geçersiz kılındı\",\n \"EXPIRED\": \"Süresi doldu\",\n \"ACTIVE\": \"Etkin\",\n \"INACTIVE\": \"Etkin değil\",\n \"SUSPENDED\": \"Askıya alındı\",\n \"REVOKED\": \"Geri alındı\",\n \"TRIALING\": \"Deneme\",\n \"PAUSED\": \"Duraklatıldı\",\n \"PAST_DUE\": \"Vadesi geçti\",\n \"UNPAID\": \"Ödenmedi\",\n \"INCOMPLETE\": \"Tamamlanmadı\",\n \"CANCELED\": \"İptal edildi\",\n \"CANCELLED\": \"İptal edildi\",\n \"OPEN\": \"Açık\",\n \"CLOSED\": \"Kapalı\",\n \"RESOLVED\": \"Çözüldü\",\n \"AWAITING_REPLY\": \"Yanıtınız bekleniyor\",\n \"APPROVED\": \"Onaylandı\",\n \"REJECTED\": \"Reddedildi\",\n \"REQUESTED\": \"Talep edildi\",\n \"CONVERTED\": \"Dönüştürüldü\",\n \"PAID\": \"Ödendi\",\n \"FAILED\": \"Başarısız\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Teslim edildi\",\n \"AWAITING_FULFILLMENT\": \"Teslimat bekleniyor\",\n \"PENDING\": \"Beklemede\",\n \"FAILED\": \"Teslimat başarısız\"\n },\n \"overview\": {\n \"loading\": \"Hesabınız yükleniyor\",\n \"signedInAs\": \"Giriş yapılan hesap\",\n \"statOrders\": \"Siparişler\",\n \"statLicenses\": \"Lisanslar\",\n \"statDownloads\": \"İndirmeler\",\n \"statTickets\": \"Destek talepleri\",\n \"walletLabel\": \"Mağaza bakiyesi\",\n \"walletNote\": \"Ödeme adımında uygulanır\",\n \"recentOrders\": \"Son siparişler\",\n \"allOrders\": \"Tüm siparişler\"\n },\n \"orders\": {\n \"loading\": \"Siparişleriniz yükleniyor\",\n \"emptyTitle\": \"Henüz sipariş yok\",\n \"emptyBody\": \"Bu mağazadan yaptığınız alışverişler, ilk siparişinizi verir vermez burada görünür.\",\n \"movedTitle\": \"Bu sayfada bir şey yok\",\n \"movedBody\": \"Siz bakarken bu siparişler yer değiştirdi.\",\n \"backToFirstPage\": \"İlk sayfaya dön\",\n \"pagesLabel\": \"Sipariş geçmişi sayfaları\",\n \"previous\": \"Önceki\",\n \"next\": \"Sonraki\",\n \"page\": \"Sayfa {page}\",\n \"andMoreOne\": \"ve bir ürün daha\",\n \"andMoreOther\": \"ve {count} ürün daha\",\n \"fallbackTitle\": \"{id} numaralı sipariş\",\n \"allOrders\": \"Tüm siparişler\",\n \"loadingOne\": \"Bu sipariş yükleniyor\",\n \"detailTitle\": \"{id} numaralı sipariş\",\n \"subtotal\": \"Ara toplam\",\n \"discount\": \"İndirim\",\n \"tax\": \"Vergi\",\n \"total\": \"Toplam\",\n \"paidWith\": \"Ödeme yöntemi\",\n \"deliveryTitle\": \"Teslimatınız\",\n \"replacement\": \"Değişim\",\n \"search\": \"Sipariş ara\",\n \"searchPlaceholder\": \"Fatura numarasına göre ara\",\n \"status\": \"Durum\",\n \"statusAll\": \"Tüm durumlar\",\n \"statusCompleted\": \"Tamamlandı\",\n \"statusPending\": \"Beklemede\",\n \"statusProcessing\": \"İşleniyor\",\n \"statusRefunded\": \"İade edildi\",\n \"statusDisputed\": \"İtiraz edildi\",\n \"statusExpired\": \"Süresi doldu\",\n \"emptyFiltered\": \"Eşleşen sipariş yok. Farklı bir fatura numarası veya durum deneyin.\",\n \"warrantyTitle\": \"Garanti\",\n \"warrantyCoveredUntil\": \"{date} tarihine kadar kapsamda\",\n \"warrantyEnded\": \"Kapsam {date} tarihinde sona erdi\",\n \"warrantyCancelled\": \"Kapsam iptal edildi\",\n \"warrantyClaimSubmitted\": \"Talep gönderildi\",\n \"warrantyClaimApproved\": \"Talep onaylandı\",\n \"warrantyClaimDeclined\": \"Talep reddedildi\",\n \"warrantyClaimStart\": \"Garanti talebi oluştur\",\n \"warrantyClaimLabel\": \"Ne oldu?\",\n \"warrantyClaimOptional\": \"İsteğe bağlı\",\n \"warrantyClaimSend\": \"Talebi gönder\",\n \"warrantyClaimSending\": \"Gönderiliyor…\",\n \"warrantyClaimDone\": \"Mağaza talebinizi aldı. E-posta ile yanıt verirler.\",\n \"warrantyClaimFailed\": \"Talebiniz gönderilemedi.\"\n },\n \"downloads\": {\n \"loading\": \"İndirmeleriniz yükleniyor\",\n \"emptyTitle\": \"Henüz indirilecek bir şey yok\",\n \"emptyBody\": \"Dosyalar, anahtarlar ve erişim bağlantıları bir sipariş tamamlandığında burada görünür.\",\n \"licensesTitle\": \"Lisans anahtarları\",\n \"filesTitle\": \"Dosyalar\",\n \"codesTitle\": \"Kodlar ve bağlantılar\",\n \"download\": \"İndir\",\n \"openLink\": \"Bağlantıyı aç\",\n \"viewOrder\": \"Siparişi görüntüle\",\n \"expires\": \"{date} tarihinde sona erer\",\n \"neverExpires\": \"Bitiş tarihi yok\",\n \"lockedTo\": \"{hardwareId} cihazına bağlı\",\n \"resetHwid\": \"Donanım kimliğini sıfırla\",\n \"resettingHwid\": \"Sıfırlanıyor…\",\n \"hwidResetDone\": \"Donanım kimliği temizlendi. Bir sonraki etkinleştirme bu lisansı üstlenir.\",\n \"hwidResetFailed\": \"Donanım kimliği sıfırlanamadı. Lütfen tekrar deneyin.\",\n \"renewTitle\": \"Yenilenebilir\",\n \"renewBody\": \"Yenileme bir satın alma olduğu için bu sayfadan değil, ödeme adımından geçer.\",\n \"renewAction\": \"Mağazayı aç\",\n \"brokenTitle\": \"İndirmeleriniz listelenemedi\",\n \"brokenBody\": \"Mağaza, arkasındaki lisans olmadan bir lisans kaydı ({id}) gönderdi; bu yüzden listede adı geçen şeyin kendisi eksik kalırdı.\",\n \"brokenFileBody\": \"Mağaza, indirilecek hiçbir şey olmadan bir dosya kaydı ({id}) gönderdi; bu yüzden liste, veremeyeceği bir dosyanın adını verirdi.\"\n },\n \"subscriptions\": {\n \"loading\": \"Abonelikleriniz yükleniyor\",\n \"emptyTitle\": \"Henüz abonelik yok\",\n \"emptyBody\": \"Yinelenen alışverişler, ilkini başlattığınızda burada görünür.\",\n \"allSubscriptions\": \"Tüm abonelikler\",\n \"unnamedPlan\": \"Abonelik\",\n \"renews\": \"{date} tarihinde yenilenir\",\n \"ends\": \"{date} tarihinde biter\",\n \"canceled\": \"{date} tarihinde iptal edildi\",\n \"startedOn\": \"{date} tarihinde başladı\",\n \"billingDayOne\": \"Günlük faturalanır\",\n \"billingDayOther\": \"{count} günde bir faturalanır\",\n \"billingWeekOne\": \"Haftalık faturalanır\",\n \"billingWeekOther\": \"{count} haftada bir faturalanır\",\n \"billingMonthOne\": \"Aylık faturalanır\",\n \"billingMonthOther\": \"{count} ayda bir faturalanır\",\n \"billingYearOne\": \"Yıllık faturalanır\",\n \"billingYearOther\": \"{count} yılda bir faturalanır\",\n \"billingOther\": \"Her {count} × {interval} faturalanır\",\n \"gateway\": \"Ödeme sağlayıcısı\",\n \"paymentMethod\": \"Ödeme yöntemi\",\n \"cardOnFile\": \"{last4} ile biten {brand}\",\n \"noPaymentMethod\": \"Kayıtlı yöntem yok\",\n \"paymentMethodElsewhere\": \"Ödeme bilgilerinizi değiştirme bağlantısı mağazanın kendi e-postalarından gelir. Bu sayfadaki her şey onu ele geçirebileceği için burada verilmez.\",\n \"pause\": \"Duraklat\",\n \"pausing\": \"Duraklatılıyor…\",\n \"resume\": \"Devam ettir\",\n \"resuming\": \"Devam ettiriliyor…\",\n \"cancel\": \"Aboneliği iptal et\",\n \"cancelling\": \"İptal ediliyor…\",\n \"keep\": \"Devam etsin\",\n \"confirmCancelTitle\": \"Bu abonelik iptal edilsin mi?\",\n \"confirmCancelAtPeriodEnd\": \"{date} tarihine kadar erişiminiz sürer. Sonrasında ücret alınmaz.\",\n \"confirmCancelNow\": \"İptal edilir edilmez erişim sona erer.\",\n \"actionFailed\": \"Bu işlem gerçekleşmedi. Lütfen tekrar deneyin.\",\n \"paused\": \"Bu abonelik duraklatıldı.\",\n \"resumed\": \"Bu abonelik yeniden çalışıyor.\",\n \"cancelled\": \"Bu abonelik iptal edildi.\",\n \"historyTitle\": \"Fatura geçmişi\",\n \"historyLoading\": \"Fatura geçmişi yükleniyor\",\n \"historyEmptyTitle\": \"Henüz fatura geçmişi yok\",\n \"historyEmptyBody\": \"Yenileme faturaları ilk dönemden sonra burada görünür.\",\n \"trial\": \"Deneme {date} tarihinde biter\"\n },\n \"favorites\": {\n \"loading\": \"Favorileriniz yükleniyor\",\n \"emptyTitle\": \"Henüz favori yok\",\n \"emptyBody\": \"Mağazaya göz atarken kaydettiğiniz ürünler burada durur.\",\n \"added\": \"{date} tarihinde kaydedildi\",\n \"gone\": \"Artık mevcut değil\",\n \"view\": \"Mağazada görüntüle\",\n \"remove\": \"Kaldır\",\n \"removing\": \"Kaldırılıyor…\",\n \"removeFailed\": \"Bu favori kaldırılamadı. Lütfen tekrar deneyin.\",\n \"noImage\": \"{title} için görsel yok\"\n },\n \"rewards\": {\n \"loading\": \"Ödülleriniz yükleniyor\",\n \"available\": \"Kullanılabilir\",\n \"pending\": \"Devam ediyor\",\n \"lifetime\": \"Toplam kazanılan\",\n \"couponsTitle\": \"Kuponlarınız\",\n \"couponsBody\": \"Ödeme adımında bunlardan birini yapıştırın.\",\n \"percentOff\": \"%{percent} indirim\",\n \"couponGeneric\": \"İndirim kuponu\",\n \"expiresOn\": \"{date} tarihinde sona erer\",\n \"activityTitle\": \"Hareketler\",\n \"emptyTitle\": \"Henüz ödül yok\",\n \"emptyBody\": \"Kazanmaya başlamak için bir sipariş tamamlayın ya da değerlendirme yazın.\",\n \"storeCredit\": \"{amount} mağaza bakiyesi\",\n \"storeCreditGeneric\": \"Mağaza bakiyesi\",\n \"couponNamed\": \"{code} kuponu\",\n \"couponUnnamed\": \"Kupon kodu\",\n \"otherReward\": \"Ödül\",\n \"reasonOrderCompleted\": \"Sipariş tamamlandı\",\n \"reasonOrderCount\": \"Sadakat eşiği\",\n \"reasonSpendAmount\": \"Toplam harcama\",\n \"reasonReview\": \"Değerlendirme yazıldı\",\n \"reasonFirstPurchase\": \"İlk satın alma\",\n \"reasonOther\": \"Ödül\",\n \"grantFulfilled\": \"Kazanıldı\",\n \"grantPending\": \"Devam ediyor\",\n \"grantFailed\": \"Başarısız\",\n \"grantRevoked\": \"Geri alındı\",\n \"pointsTitle\": \"Puan\",\n \"pointsBalance\": \"Puan bakiyesi\",\n \"pointsLifetime\": \"Toplam kazanılan puan\",\n \"pointsEarnHint\": \"Puan biriktirmeye başlamak için bir sipariş tamamlayın.\",\n \"pointsActivityTitle\": \"Puan hareketleri\",\n \"pointsFromOrder\": \"Sipariş tamamlandı\",\n \"pointsFromReview\": \"Değerlendirme yazıldı\",\n \"pointsConverted\": \"Mağaza bakiyesine çevrildi\",\n \"pointsAdjusted\": \"Mağaza tarafından düzeltildi\",\n \"redeemTitle\": \"Puanları çevir\",\n \"redeemBody\": \"Puanlarınızı mağaza bakiyesine çevirin ve ödeme adımında kullanın.\",\n \"redeemLabel\": \"Çevrilecek puan\",\n \"redeemMinimum\": \"En az {points} puan çevirin.\",\n \"redeemOverBalance\": \"Kullanabileceğiniz {points} puan var.\",\n \"redeemInvalid\": \"Puanı tam sayı olarak girin.\",\n \"redeemPreview\": \"Yaklaşık {amount} mağaza bakiyesi değerinde.\",\n \"redeemContinue\": \"Devam\",\n \"redeemConfirm\": \"{points} puan yaklaşık {amount} mağaza bakiyesine çevrilsin mi?\",\n \"redeemConfirmAction\": \"Evet, çevir\",\n \"redeemWorking\": \"Çevriliyor…\",\n \"redeemDone\": \"{amount} mağaza bakiyenize eklendi.\",\n \"redeemFailed\": \"Puanlarınız çevrilemedi.\"\n },\n \"referrals\": {\n \"loading\": \"Referanslarınız yükleniyor\",\n \"notEnrolledTitle\": \"Referans programında değilsiniz\",\n \"notEnrolledBody\": \"Mağaza sizi programa eklemedi, bu yüzden paylaşacak ya da izleyecek bir şey henüz yok.\",\n \"availableLabel\": \"Çekilebilir tutar\",\n \"pendingLabel\": \"Beklemede\",\n \"requestedLabel\": \"Talep edildi\",\n \"payoutsElsewhere\": \"Para çekme ve ödemeler bu sayfadan değil, mağaza tarafından yürütülür.\",\n \"codesAccepted\": \"Kodunuz ödeme adımında geçerlidir.\",\n \"codesNotAccepted\": \"Bu mağaza şu anda ödeme adımında referans kodu kabul etmiyor.\",\n \"linksTitle\": \"Bağlantılarınız\",\n \"linksEmptyTitle\": \"Henüz referans bağlantısı yok\",\n \"linksEmptyBody\": \"Paylaştığınız bağlantıları mağaza oluşturur. Burada bulmayı bekliyorduysanız onlardan isteyin.\",\n \"primary\": \"Birincil\",\n \"commission\": \"%{percent} komisyon\",\n \"buyerDiscount\": \"Alıcıya %{percent} indirim\",\n \"awaitingApproval\": \"Bu bağlantı için mağazanın onayı bekleniyor.\",\n \"clicks\": \"Tıklamalar\",\n \"sales\": \"Satışlar\",\n \"revenue\": \"Ciro\",\n \"commissionsTitle\": \"Komisyonlar\",\n \"commissionsEmptyTitle\": \"Henüz komisyon yok\",\n \"commissionsEmptyBody\": \"Onaylanan referans satışları burada görünür.\",\n \"commissionFor\": \"{id} numaralı sipariş\",\n \"balanceTitle\": \"Bakiye hareketleri\",\n \"balanceEmptyTitle\": \"Henüz bakiye hareketi yok\",\n \"balanceEmptyBody\": \"Dönüşümler ve ödemeler burada görünür.\",\n \"claimStoreCredit\": \"Mağaza bakiyesi\",\n \"claimCryptoPayout\": \"Kripto ödemesi\",\n \"claimAdjustment\": \"Düzeltme\",\n \"differentCurrency\": \"Referans bakiyeniz {currency} cinsinden tutulur.\",\n \"convertedLabel\": \"Mağaza bakiyesine aktarıldı\",\n \"paidLabel\": \"Ödendi\"\n },\n \"support\": {\n \"loading\": \"Destek talepleriniz yükleniyor\",\n \"ticketsTitle\": \"Destek talepleriniz\",\n \"emptyTitle\": \"Henüz destek talebi yok\",\n \"emptyBody\": \"Mağazaya buradan yazın; gelen her yanıt bu sayfada kalır.\",\n \"newTicket\": \"Yeni talep\",\n \"backToTickets\": \"Tüm talepler\",\n \"updated\": \"{date} tarihinde güncellendi\",\n \"aboutOrder\": \"{id} numaralı sipariş hakkında\",\n \"subjectLabel\": \"Konu\",\n \"subjectOptional\": \"İsteğe bağlı\",\n \"messageLabel\": \"Mesaj\",\n \"replyLabel\": \"Yanıtınız\",\n \"create\": \"Mağazaya gönder\",\n \"creating\": \"Gönderiliyor…\",\n \"createFailed\": \"Talebiniz oluşturulamadı. Lütfen tekrar deneyin.\",\n \"reply\": \"Yanıt gönder\",\n \"replying\": \"Gönderiliyor…\",\n \"replyFailed\": \"Yanıtınız gönderilemedi. Lütfen tekrar deneyin.\",\n \"tooShort\": \"Lütfen en azından kısa bir mesaj yazın.\",\n \"closedTitle\": \"Bu talep kapatıldı\",\n \"closedBody\": \"Hâlâ yardıma ihtiyacınız varsa yeni bir tane açın.\",\n \"loadingThread\": \"Bu görüşme yükleniyor\",\n \"noMessages\": \"Bu talepte henüz mesaj yok.\",\n \"fromYou\": \"Siz\",\n \"fromMerchant\": \"Mağaza\",\n \"fromSystem\": \"Sistem\",\n \"untitled\": \"Destek isteği\"\n },\n \"settings\": {\n \"loading\": \"Ayarlarınız yükleniyor\",\n \"profileTitle\": \"Profil\",\n \"emailLabel\": \"E-posta\",\n \"emailNote\": \"Girişinizi e-postanız sağladığı için onu burası değil, mağaza değiştirir.\",\n \"nameLabel\": \"Ad\",\n \"nameTooShort\": \"Lütfen adınızı girin.\",\n \"saveProfile\": \"Değişiklikleri kaydet\",\n \"savingProfile\": \"Kaydediliyor…\",\n \"profileSaved\": \"Adınız güncellendi.\",\n \"profileFailed\": \"Adınız kaydedilemedi. Lütfen tekrar deneyin.\",\n \"uploadAvatar\": \"Fotoğraf yükle\",\n \"uploadingAvatar\": \"Yükleniyor…\",\n \"removeAvatar\": \"Fotoğrafı kaldır\",\n \"removingAvatar\": \"Kaldırılıyor…\",\n \"avatarHint\": \"JPG, PNG, GIF veya WebP, en fazla 10 MB.\",\n \"avatarFailed\": \"Fotoğrafınız yüklenemedi. Lütfen tekrar deneyin.\",\n \"avatarRemoveFailed\": \"Fotoğrafınız kaldırılamadı. Lütfen tekrar deneyin.\",\n \"avatarTooLarge\": \"Bu görsel 10 MB'tan büyük.\",\n \"emailsTitle\": \"Mağaza e-postaları\",\n \"emailsLoading\": \"E-posta ayarlarınız yükleniyor\",\n \"unsubscribeAll\": \"Hiç pazarlama e-postası gönderilmesin\",\n \"unsubscribeAllNote\": \"Sipariş ve teslimat e-postaları her hâlükârda gönderilir.\",\n \"listsEmpty\": \"Bu mağazanın posta listesi yok.\",\n \"emailsFailed\": \"E-posta ayarlarınız yüklenemedi.\",\n \"emailsSaveFailed\": \"Bu ayar kaydedilemedi. Lütfen tekrar deneyin.\",\n \"devicesTitle\": \"Giriş yapılmış cihazlar\",\n \"devicesLoading\": \"Cihazlarınız yükleniyor\",\n \"devicesEmpty\": \"Giriş yapılmış başka cihaz yok.\",\n \"thisDevice\": \"Bu cihaz\",\n \"signedInOn\": \"{date} tarihinde giriş yapıldı\",\n \"unknownDevice\": \"Bilinmeyen cihaz\",\n \"signOutDevice\": \"Çıkış yap\",\n \"signingOutDevice\": \"Çıkış yapılıyor…\",\n \"signOutOthers\": \"Diğer tüm cihazlardan çıkış yap\",\n \"signOutOthersDone\": \"Diğer tüm cihazlardan çıkış yapıldı.\",\n \"devicesFailed\": \"Cihazlarınız yüklenemedi.\",\n \"signOutDeviceFailed\": \"Bu cihazdan çıkış yapılamadı. Lütfen tekrar deneyin.\",\n \"deviceOn\": \"{os} üzerinde {browser}\"\n },\n \"walletTopup\": {\n \"title\": \"Bakiye ekle\",\n \"minimum\": \"En az {min}\",\n \"bounds\": \"{min} ile {max} arası\",\n \"bonus\": \"En az {amount} ekle, %{percent} fazlasını kazan\",\n \"amount\": \"Tutar\",\n \"submit\": \"Ödemeye devam et\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Bayi programı kullanılamıyor\",\n \"disabledBody\": \"Bu mağaza şu anda toptan sipariş kabul etmiyor.\",\n \"openTitle\": \"Bayi programına katıl\",\n \"openBody\": \"Bu mağazanın ürünlerini toptan fiyatlarla almak için şimdi katıl.\",\n \"join\": \"Şimdi katıl\",\n \"manualTitle\": \"Bayi davetini kabul et\",\n \"manualBody\": \"Mağazanın gönderdiği davet kodunu gir.\",\n \"inviteToken\": \"Davet kodu\",\n \"acceptInvite\": \"Daveti kabul et\",\n \"applicationTitle\": \"Bayi olmak için başvur\",\n \"applicationBody\": \"İşletmeni mağazaya anlat ve başvurunu gönder.\",\n \"applicationNote\": \"Başvuru notu\",\n \"noteRequired\": \"Başvuruyu göndermeden önce bir not ekle.\",\n \"apply\": \"Başvuruyu gönder\",\n \"pendingTitle\": \"Başvurun beklemede\",\n \"pendingBody\": \"Mağaza, toptan erişimi açmadan önce başvurunu inceleyecek.\",\n \"rejectedTitle\": \"Bayi başvurun reddedildi\",\n \"rejectedBody\": \"Daha fazla bilgi veya yeniden başvuru için mağazayla iletişime geç.\",\n \"suspendedTitle\": \"Bayi hesabın askıya alındı\",\n \"suspendedBody\": \"Toptan sipariş verilemiyor. Yardım için mağazayla iletişime geç.\",\n \"activeTitle\": \"Toptan satış hesabı\",\n \"tier\": \"Seviye\",\n \"walletTitle\": \"Toptan satış bakiyesi\",\n \"balance\": \"Bakiye\",\n \"held\": \"Bekletilen\",\n \"catalogTitle\": \"Toptan satış kataloğu\",\n \"search\": \"Ürün ara\",\n \"catalogEmptyTitle\": \"Toptan ürün bulunamadı\",\n \"catalogEmptyBody\": \"Başka bir arama yap veya mağaza ürün ekledikten sonra tekrar gel.\",\n \"volumePricing\": \"Miktar indirimi mevcut\",\n \"supplierBacked\": \"Tedarikçi tarafından karşılanır\",\n \"add\": \"Ekle\",\n \"basketTitle\": \"Toptan satış sepeti\",\n \"basketEmpty\": \"Siparişe başlamak için toptan katalogdan bir ürün ekle.\",\n \"quantity\": \"Adet\",\n \"basketNeedsQuote\": \"Sipariş vermeden önce güncel toplamı görmek için sepeti fiyatlandır.\",\n \"quote\": \"Sepeti fiyatlandır\",\n \"place\": \"Sipariş ver\",\n \"ordersTitle\": \"Toptan siparişler\",\n \"ordersEmptyTitle\": \"Henüz toptan sipariş yok\",\n \"ordersEmptyBody\": \"Toptan bakiyenden ödenen siparişler burada görünür.\",\n \"refunded\": \"Bakiyeye iade edildi\",\n \"lineQuantity\": \"Adet {count}\",\n \"serials\": \"Teslim edilen seri numaraları\",\n \"apiKeysTitle\": \"Bayi API anahtarları\",\n \"apiKeyName\": \"Anahtar adı\",\n \"createApiKey\": \"Anahtar oluştur\",\n \"apiKeysEmpty\": \"Henüz bayi API anahtarı oluşturmadın.\",\n \"orderElsewhere\": \"Toptan siparişler bu sayfadan değil, bayi API’si üzerinden verilir.\",\n \"keysElsewhere\": \"API anahtarlarını mağaza verir. Onlardan iste.\",\n \"apiKeyCreatedTitle\": \"Bu anahtarı şimdi kopyala\",\n \"apiKeyCreatedBody\": \"Bu düz metin anahtar yalnızca bir kez gösterilir ve daha sonra kurtarılamaz.\",\n \"dismissKey\": \"Kaydettim\",\n \"lastUsed\": \"Son kullanım: {date}\",\n \"neverUsed\": \"Hiç kullanılmadı\",\n \"revokeApiKey\": \"İptal et\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"Копіювати\",\n \"copied\": \"Скопійовано\",\n \"retry\": \"Спробувати ще раз\",\n \"notLoaded\": \"Це не завантажилося\",\n \"genericError\": \"Не вдалося завантажити. Спробуйте ще раз за хвилину.\",\n \"browseStore\": \"Перейти до магазину\",\n \"unavailable\": \"Недоступно\",\n \"cancel\": \"Скасувати\"\n },\n \"account\": {\n \"title\": \"Ваш акаунт\",\n \"sections\": \"Розділи акаунта\",\n \"signOut\": \"Вийти\",\n \"signingOut\": \"Виходимо…\",\n \"signOutFailed\": \"Не вдалося вийти. Спробуйте ще раз.\",\n \"checkingSession\": \"Перевіряємо вашу сесію\",\n \"sessionUnknown\": \"Не вдалося перевірити вашу сесію. Спробуйте ще раз за хвилину.\",\n \"goToOverview\": \"Перейти до огляду\",\n \"tabs\": {\n \"overview\": \"Огляд\",\n \"orders\": \"Замовлення\",\n \"downloads\": \"Завантаження\",\n \"subscriptions\": \"Підписки\",\n \"rewards\": \"Винагороди\",\n \"referrals\": \"Реферали\",\n \"favorites\": \"Обране\",\n \"support\": \"Підтримка\",\n \"settings\": \"Налаштування\",\n \"reseller\": \"Реселер\"\n },\n \"notBuilt\": {\n \"title\": \"Розділ «{tab}» відсутній у цьому магазині\",\n \"body\": \"Ця вітрина не пропонує такого розділу. Ваші замовлення та дані акаунта залишаються тут.\"\n },\n \"unknownTab\": {\n \"title\": \"Це посилання нікуди не веде\",\n \"body\": \"В адресі вказано розділ акаунта, якого не існує. Можливо, її ввели з помилкою або обрізали.\"\n }\n },\n \"login\": {\n \"titleEmail\": \"Вхід до вашого акаунта\",\n \"titleCode\": \"Перевірте пошту\",\n \"introEmail\": \"Ми надсилаємо одноразовий код на вашу електронну адресу. Пароль запам’ятовувати не потрібно.\",\n \"introCode\": \"Введіть код, який ми надіслали на {email}.\",\n \"emailLabel\": \"Електронна пошта\",\n \"codeLabel\": \"Код для входу\",\n \"invalidEmail\": \"Введіть повну електронну адресу, наприклад you@example.com.\",\n \"missingCode\": \"Введіть код із вашого листа.\",\n \"send\": \"Надіслати код\",\n \"sending\": \"Надсилаємо…\",\n \"submit\": \"Увійти\",\n \"submitting\": \"Перевіряємо…\",\n \"resend\": \"Надіслати новий код\",\n \"resent\": \"Новий код уже прямує на {email}.\",\n \"changeEmail\": \"Інша адреса\",\n \"sendFailed\": \"Не вдалося надіслати код. Спробуйте ще раз за хвилину.\",\n \"verifyFailed\": \"Цей код не прийнято. Спробуйте ще раз.\"\n },\n \"status\": {\n \"COMPLETED\": \"Виконано\",\n \"PROCESSING\": \"В обробці\",\n \"AWAITING_STOCK\": \"Очікує наявності\",\n \"PENDING\": \"Очікує\",\n \"PENDING_PAYMENT\": \"Очікує оплати\",\n \"UNDERPAID\": \"Недоплачено\",\n \"DISPUTED\": \"Оскаржено\",\n \"REFUNDED\": \"Повернуто кошти\",\n \"PARTIAL_REFUND\": \"Частково повернуто\",\n \"VOIDED\": \"Анульовано\",\n \"EXPIRED\": \"Термін минув\",\n \"ACTIVE\": \"Активна\",\n \"INACTIVE\": \"Неактивна\",\n \"SUSPENDED\": \"Призупинена\",\n \"REVOKED\": \"Відкликано\",\n \"TRIALING\": \"Пробний період\",\n \"PAUSED\": \"На паузі\",\n \"PAST_DUE\": \"Прострочено\",\n \"UNPAID\": \"Не оплачено\",\n \"INCOMPLETE\": \"Незавершено\",\n \"CANCELED\": \"Скасовано\",\n \"CANCELLED\": \"Скасовано\",\n \"OPEN\": \"Відкрито\",\n \"CLOSED\": \"Закрито\",\n \"RESOLVED\": \"Вирішено\",\n \"AWAITING_REPLY\": \"Чекає на вашу відповідь\",\n \"APPROVED\": \"Схвалено\",\n \"REJECTED\": \"Відхилено\",\n \"REQUESTED\": \"Запитано\",\n \"CONVERTED\": \"Конвертовано\",\n \"PAID\": \"Оплачено\",\n \"FAILED\": \"Помилка\"\n },\n \"delivery\": {\n \"DELIVERED\": \"Доставлено\",\n \"AWAITING_FULFILLMENT\": \"Очікує видачі\",\n \"PENDING\": \"Очікує\",\n \"FAILED\": \"Доставку не виконано\"\n },\n \"overview\": {\n \"loading\": \"Завантажуємо ваш акаунт\",\n \"signedInAs\": \"Ви увійшли як\",\n \"statOrders\": \"Замовлення\",\n \"statLicenses\": \"Ліцензії\",\n \"statDownloads\": \"Завантаження\",\n \"statTickets\": \"Звернення в підтримку\",\n \"walletLabel\": \"Баланс магазину\",\n \"walletNote\": \"Застосовується при оформленні\",\n \"recentOrders\": \"Останні замовлення\",\n \"allOrders\": \"Усі замовлення\"\n },\n \"orders\": {\n \"loading\": \"Завантажуємо ваші замовлення\",\n \"emptyTitle\": \"Замовлень поки немає\",\n \"emptyBody\": \"Ваші покупки в цьому магазині з’являться тут одразу після першого замовлення.\",\n \"movedTitle\": \"На цій сторінці нічого немає\",\n \"movedBody\": \"Ці замовлення перемістилися, поки ви їх переглядали.\",\n \"backToFirstPage\": \"На першу сторінку\",\n \"pagesLabel\": \"Сторінки історії замовлень\",\n \"previous\": \"Назад\",\n \"next\": \"Далі\",\n \"page\": \"Сторінка {page}\",\n \"andMoreOne\": \"і ще одна позиція\",\n \"andMoreOther\": \"і ще {count} позицій\",\n \"fallbackTitle\": \"Замовлення {id}\",\n \"allOrders\": \"Усі замовлення\",\n \"loadingOne\": \"Завантажуємо це замовлення\",\n \"detailTitle\": \"Замовлення {id}\",\n \"subtotal\": \"Проміжний підсумок\",\n \"discount\": \"Знижка\",\n \"tax\": \"Податок\",\n \"total\": \"Разом\",\n \"paidWith\": \"Спосіб оплати\",\n \"deliveryTitle\": \"Ваша доставка\",\n \"replacement\": \"Заміна\",\n \"search\": \"Пошук замовлень\",\n \"searchPlaceholder\": \"Пошук за номером рахунка\",\n \"status\": \"Статус\",\n \"statusAll\": \"Усі статуси\",\n \"statusCompleted\": \"Завершено\",\n \"statusPending\": \"Очікує\",\n \"statusProcessing\": \"В обробці\",\n \"statusRefunded\": \"Повернено\",\n \"statusDisputed\": \"Оскаржено\",\n \"statusExpired\": \"Прострочено\",\n \"emptyFiltered\": \"Немає відповідних замовлень. Спробуйте інший номер рахунка або інший статус.\",\n \"warrantyTitle\": \"Гарантія\",\n \"warrantyCoveredUntil\": \"Діє до {date}\",\n \"warrantyEnded\": \"Гарантія завершилася {date}\",\n \"warrantyCancelled\": \"Гарантію скасовано\",\n \"warrantyClaimSubmitted\": \"Звернення надіслано\",\n \"warrantyClaimApproved\": \"Звернення схвалено\",\n \"warrantyClaimDeclined\": \"Звернення відхилено\",\n \"warrantyClaimStart\": \"Звернутися за гарантією\",\n \"warrantyClaimLabel\": \"Що сталося?\",\n \"warrantyClaimOptional\": \"Необов’язково\",\n \"warrantyClaimSend\": \"Надіслати звернення\",\n \"warrantyClaimSending\": \"Надсилаємо…\",\n \"warrantyClaimDone\": \"Магазин отримав ваше звернення. Відповідь надійде на пошту.\",\n \"warrantyClaimFailed\": \"Не вдалося надіслати звернення.\"\n },\n \"downloads\": {\n \"loading\": \"Завантажуємо ваші файли\",\n \"emptyTitle\": \"Поки нічого завантажувати\",\n \"emptyBody\": \"Файли, ключі та посилання доступу з’являться тут після виконання замовлення.\",\n \"licensesTitle\": \"Ліцензійні ключі\",\n \"filesTitle\": \"Файли\",\n \"codesTitle\": \"Коди та посилання\",\n \"download\": \"Завантажити\",\n \"openLink\": \"Відкрити посилання\",\n \"viewOrder\": \"Переглянути замовлення\",\n \"expires\": \"Діє до {date}\",\n \"neverExpires\": \"Без терміну дії\",\n \"lockedTo\": \"Прив’язано до {hardwareId}\",\n \"resetHwid\": \"Скинути ID пристрою\",\n \"resettingHwid\": \"Скидаємо…\",\n \"hwidResetDone\": \"ID пристрою очищено. Наступна активація закріпить цю ліцензію.\",\n \"hwidResetFailed\": \"Не вдалося скинути ID пристрою. Спробуйте ще раз.\",\n \"renewTitle\": \"Можна продовжити\",\n \"renewBody\": \"Продовження — це покупка, тож воно проходить через оформлення замовлення, а не через цю сторінку.\",\n \"renewAction\": \"Відкрити магазин\",\n \"brokenTitle\": \"Не вдалося показати ваші завантаження\",\n \"brokenBody\": \"Магазин надіслав запис ліцензії ({id}) без самої ліцензії, тож у цьому списку бракувало б того, що він називає.\",\n \"brokenFileBody\": \"Магазин надіслав запис файлу ({id}), у якому немає чого завантажувати, тож список назвав би файл, який неможливо видати.\"\n },\n \"subscriptions\": {\n \"loading\": \"Завантажуємо ваші підписки\",\n \"emptyTitle\": \"Підписок поки немає\",\n \"emptyBody\": \"Регулярні покупки з’являться тут, щойно ви оформите першу.\",\n \"allSubscriptions\": \"Усі підписки\",\n \"unnamedPlan\": \"Підписка\",\n \"renews\": \"Продовження {date}\",\n \"ends\": \"Завершується {date}\",\n \"canceled\": \"Скасовано {date}\",\n \"startedOn\": \"Початок {date}\",\n \"billingDayOne\": \"Оплата щодня\",\n \"billingDayOther\": \"Оплата кожні {count} днів\",\n \"billingWeekOne\": \"Оплата щотижня\",\n \"billingWeekOther\": \"Оплата кожні {count} тижнів\",\n \"billingMonthOne\": \"Оплата щомісяця\",\n \"billingMonthOther\": \"Оплата кожні {count} місяців\",\n \"billingYearOne\": \"Оплата щороку\",\n \"billingYearOther\": \"Оплата кожні {count} років\",\n \"billingOther\": \"Оплата кожні {count} × {interval}\",\n \"gateway\": \"Платіжний провайдер\",\n \"paymentMethod\": \"Спосіб оплати\",\n \"cardOnFile\": \"{brand}, що закінчується на {last4}\",\n \"noPaymentMethod\": \"Не збережено\",\n \"paymentMethodElsewhere\": \"Посилання для зміни платіжних даних надходить у листах самого магазину. Тут його не видають, бо будь-що на цій сторінці могло б його перехопити.\",\n \"pause\": \"Призупинити\",\n \"pausing\": \"Призупиняємо…\",\n \"resume\": \"Відновити\",\n \"resuming\": \"Відновлюємо…\",\n \"cancel\": \"Скасувати підписку\",\n \"cancelling\": \"Скасовуємо…\",\n \"keep\": \"Залишити\",\n \"confirmCancelTitle\": \"Скасувати цю підписку?\",\n \"confirmCancelAtPeriodEnd\": \"Доступ збережеться до {date}. Після цього списань не буде.\",\n \"confirmCancelNow\": \"Доступ припиниться одразу після скасування.\",\n \"actionFailed\": \"Не вдалося виконати. Спробуйте ще раз.\",\n \"paused\": \"Цю підписку призупинено.\",\n \"resumed\": \"Цю підписку відновлено.\",\n \"cancelled\": \"Цю підписку скасовано.\",\n \"historyTitle\": \"Історія платежів\",\n \"historyLoading\": \"Завантажуємо історію платежів\",\n \"historyEmptyTitle\": \"Історії платежів поки немає\",\n \"historyEmptyBody\": \"Рахунки за продовження з’являться тут після першого циклу.\",\n \"trial\": \"Пробний період до {date}\"\n },\n \"favorites\": {\n \"loading\": \"Завантажуємо ваше обране\",\n \"emptyTitle\": \"В обраному поки порожньо\",\n \"emptyBody\": \"Товари, які ви зберігаєте під час перегляду магазину, лишаються тут.\",\n \"added\": \"Збережено {date}\",\n \"gone\": \"Більше недоступно\",\n \"view\": \"Переглянути в магазині\",\n \"remove\": \"Видалити\",\n \"removing\": \"Видаляємо…\",\n \"removeFailed\": \"Не вдалося видалити з обраного. Спробуйте ще раз.\",\n \"noImage\": \"Немає зображення для {title}\"\n },\n \"rewards\": {\n \"loading\": \"Завантажуємо ваші винагороди\",\n \"available\": \"Доступно\",\n \"pending\": \"В обробці\",\n \"lifetime\": \"Зароблено загалом\",\n \"couponsTitle\": \"Ваші купони\",\n \"couponsBody\": \"Вставте один із них під час оформлення.\",\n \"percentOff\": \"Знижка {percent}%\",\n \"couponGeneric\": \"Купон на знижку\",\n \"expiresOn\": \"Діє до {date}\",\n \"activityTitle\": \"Активність\",\n \"emptyTitle\": \"Винагород поки немає\",\n \"emptyBody\": \"Оформіть замовлення або залиште відгук, щоб почати заробляти.\",\n \"storeCredit\": \"{amount} на баланс магазину\",\n \"storeCreditGeneric\": \"Баланс магазину\",\n \"couponNamed\": \"Купон {code}\",\n \"couponUnnamed\": \"Код купона\",\n \"otherReward\": \"Винагорода\",\n \"reasonOrderCompleted\": \"Замовлення виконано\",\n \"reasonOrderCount\": \"Етап лояльності\",\n \"reasonSpendAmount\": \"Загальна сума покупок\",\n \"reasonReview\": \"Залишено відгук\",\n \"reasonFirstPurchase\": \"Перша покупка\",\n \"reasonOther\": \"Винагорода\",\n \"grantFulfilled\": \"Зараховано\",\n \"grantPending\": \"В обробці\",\n \"grantFailed\": \"Помилка\",\n \"grantRevoked\": \"Відкликано\",\n \"pointsTitle\": \"Бали\",\n \"pointsBalance\": \"Баланс балів\",\n \"pointsLifetime\": \"Накопичено загалом\",\n \"pointsEarnHint\": \"Оформіть замовлення, щоб почати накопичувати бали.\",\n \"pointsActivityTitle\": \"Історія балів\",\n \"pointsFromOrder\": \"Замовлення виконано\",\n \"pointsFromReview\": \"Залишено відгук\",\n \"pointsConverted\": \"Обміняно на баланс магазину\",\n \"pointsAdjusted\": \"Скориговано магазином\",\n \"redeemTitle\": \"Обміняти бали\",\n \"redeemBody\": \"Обміняйте бали на баланс магазину й оплатіть ним замовлення.\",\n \"redeemLabel\": \"Бали до обміну\",\n \"redeemMinimum\": \"Обміняйте щонайменше {points} балів.\",\n \"redeemOverBalance\": \"У вас {points} балів.\",\n \"redeemInvalid\": \"Введіть ціле число балів.\",\n \"redeemPreview\": \"Це приблизно {amount} на баланс магазину.\",\n \"redeemContinue\": \"Далі\",\n \"redeemConfirm\": \"Обміняти {points} балів приблизно на {amount} балансу магазину?\",\n \"redeemConfirmAction\": \"Так, обміняти\",\n \"redeemWorking\": \"Обмінюємо…\",\n \"redeemDone\": \"{amount} зараховано на баланс магазину.\",\n \"redeemFailed\": \"Не вдалося обміняти ваші бали.\"\n },\n \"referrals\": {\n \"loading\": \"Завантажуємо ваші реферали\",\n \"notEnrolledTitle\": \"Ви не берете участі в реферальній програмі\",\n \"notEnrolledBody\": \"Магазин не додав вас до неї, тож поки немає чим ділитися й що відстежувати.\",\n \"availableLabel\": \"Доступно до виведення\",\n \"pendingLabel\": \"В обробці\",\n \"requestedLabel\": \"Запитано\",\n \"payoutsElsewhere\": \"Виведення та виплати здійснює магазин, а не ця сторінка.\",\n \"codesAccepted\": \"Ваш код приймається при оформленні.\",\n \"codesNotAccepted\": \"Наразі цей магазин не приймає реферальні коди при оформленні.\",\n \"linksTitle\": \"Ваші посилання\",\n \"linksEmptyTitle\": \"Реферальних посилань поки немає\",\n \"linksEmptyBody\": \"Посилання для поширення створює магазин. Попросіть його, якщо очікували побачити посилання тут.\",\n \"primary\": \"Основне\",\n \"commission\": \"{percent}% комісії\",\n \"buyerDiscount\": \"{percent}% знижки покупцю\",\n \"awaitingApproval\": \"Очікує на схвалення цього посилання магазином.\",\n \"clicks\": \"Кліки\",\n \"sales\": \"Продажі\",\n \"revenue\": \"Дохід\",\n \"commissionsTitle\": \"Комісії\",\n \"commissionsEmptyTitle\": \"Комісій поки немає\",\n \"commissionsEmptyBody\": \"Схвалені реферальні продажі з’являться тут.\",\n \"commissionFor\": \"Замовлення {id}\",\n \"balanceTitle\": \"Рух коштів\",\n \"balanceEmptyTitle\": \"Рухів коштів поки немає\",\n \"balanceEmptyBody\": \"Конвертації та виплати з’являться тут.\",\n \"claimStoreCredit\": \"Баланс магазину\",\n \"claimCryptoPayout\": \"Виплата в криптовалюті\",\n \"claimAdjustment\": \"Коригування\",\n \"differentCurrency\": \"Ваш реферальний баланс ведеться у валюті {currency}.\",\n \"convertedLabel\": \"Переведено в баланс магазину\",\n \"paidLabel\": \"Виплачено\"\n },\n \"support\": {\n \"loading\": \"Завантажуємо ваші звернення\",\n \"ticketsTitle\": \"Ваші звернення\",\n \"emptyTitle\": \"Звернень поки немає\",\n \"emptyBody\": \"Напишіть магазину тут, і всі відповіді залишатимуться на цій сторінці.\",\n \"newTicket\": \"Нове звернення\",\n \"backToTickets\": \"Усі звернення\",\n \"updated\": \"Оновлено {date}\",\n \"aboutOrder\": \"Щодо замовлення {id}\",\n \"subjectLabel\": \"Тема\",\n \"subjectOptional\": \"Необов’язково\",\n \"messageLabel\": \"Повідомлення\",\n \"replyLabel\": \"Ваша відповідь\",\n \"create\": \"Надіслати магазину\",\n \"creating\": \"Надсилаємо…\",\n \"createFailed\": \"Не вдалося створити звернення. Спробуйте ще раз.\",\n \"reply\": \"Надіслати відповідь\",\n \"replying\": \"Надсилаємо…\",\n \"replyFailed\": \"Не вдалося надіслати відповідь. Спробуйте ще раз.\",\n \"tooShort\": \"Напишіть хоча б коротке повідомлення.\",\n \"closedTitle\": \"Це звернення закрито\",\n \"closedBody\": \"Створіть нове, якщо вам ще потрібна допомога.\",\n \"loadingThread\": \"Завантажуємо цю розмову\",\n \"noMessages\": \"У цьому зверненні поки немає повідомлень.\",\n \"fromYou\": \"Ви\",\n \"fromMerchant\": \"Магазин\",\n \"fromSystem\": \"Система\",\n \"untitled\": \"Запит у підтримку\"\n },\n \"settings\": {\n \"loading\": \"Завантажуємо ваші налаштування\",\n \"profileTitle\": \"Профіль\",\n \"emailLabel\": \"Електронна пошта\",\n \"emailNote\": \"Саме за поштою ви входите, тому її змінює магазин, а не ви на цій сторінці.\",\n \"nameLabel\": \"Ім’я\",\n \"nameTooShort\": \"Вкажіть ваше ім’я.\",\n \"saveProfile\": \"Зберегти зміни\",\n \"savingProfile\": \"Зберігаємо…\",\n \"profileSaved\": \"Ваше ім’я оновлено.\",\n \"profileFailed\": \"Не вдалося зберегти ваше ім’я. Спробуйте ще раз.\",\n \"uploadAvatar\": \"Завантажити фото\",\n \"uploadingAvatar\": \"Завантажуємо…\",\n \"removeAvatar\": \"Видалити фото\",\n \"removingAvatar\": \"Видаляємо…\",\n \"avatarHint\": \"JPG, PNG, GIF або WebP, до 10 МБ.\",\n \"avatarFailed\": \"Не вдалося завантажити ваше фото. Спробуйте ще раз.\",\n \"avatarRemoveFailed\": \"Не вдалося видалити ваше фото. Спробуйте ще раз.\",\n \"avatarTooLarge\": \"Це зображення більше за 10 МБ.\",\n \"emailsTitle\": \"Листи магазину\",\n \"emailsLoading\": \"Завантажуємо налаштування листів\",\n \"unsubscribeAll\": \"Жодних рекламних листів\",\n \"unsubscribeAllNote\": \"Листи про замовлення та доставку надходять у будь-якому разі.\",\n \"listsEmpty\": \"У цього магазину немає списків розсилки.\",\n \"emailsFailed\": \"Не вдалося завантажити налаштування листів.\",\n \"emailsSaveFailed\": \"Не вдалося зберегти це налаштування. Спробуйте ще раз.\",\n \"devicesTitle\": \"Пристрої з активним входом\",\n \"devicesLoading\": \"Завантажуємо ваші пристрої\",\n \"devicesEmpty\": \"Жоден інший пристрій не має активного входу.\",\n \"thisDevice\": \"Цей пристрій\",\n \"signedInOn\": \"Вхід {date}\",\n \"unknownDevice\": \"Невідомий пристрій\",\n \"signOutDevice\": \"Вийти\",\n \"signingOutDevice\": \"Виходимо…\",\n \"signOutOthers\": \"Вийти на всіх інших пристроях\",\n \"signOutOthersDone\": \"Вихід виконано на всіх інших пристроях.\",\n \"devicesFailed\": \"Не вдалося завантажити ваші пристрої.\",\n \"signOutDeviceFailed\": \"Не вдалося вийти на цьому пристрої. Спробуйте ще раз.\",\n \"deviceOn\": \"{browser} на {os}\"\n },\n \"walletTopup\": {\n \"title\": \"Поповнити баланс\",\n \"minimum\": \"Мінімум {min}\",\n \"bounds\": \"Від {min} до {max}\",\n \"bonus\": \"Поповніть щонайменше на {amount} та отримайте ще {percent}%\",\n \"amount\": \"Сума\",\n \"submit\": \"Перейти до оплати\"\n },\n \"reseller\": {\n \"disabledTitle\": \"Програма реселерів недоступна\",\n \"disabledBody\": \"Зараз цей магазин не приймає оптові замовлення.\",\n \"openTitle\": \"Приєднатися до програми реселерів\",\n \"openBody\": \"Приєднайтеся, щоб купувати товари магазину за оптовими цінами.\",\n \"join\": \"Приєднатися\",\n \"manualTitle\": \"Прийняти запрошення реселера\",\n \"manualBody\": \"Введіть токен запрошення, який надіслав магазин.\",\n \"inviteToken\": \"Токен запрошення\",\n \"acceptInvite\": \"Прийняти запрошення\",\n \"applicationTitle\": \"Подати заявку реселера\",\n \"applicationBody\": \"Розкажіть магазину про свій бізнес і надішліть заявку.\",\n \"applicationNote\": \"Коментар до заявки\",\n \"noteRequired\": \"Додайте коментар перед надсиланням заявки.\",\n \"apply\": \"Надіслати заявку\",\n \"pendingTitle\": \"Ваша заявка очікує розгляду\",\n \"pendingBody\": \"Магазин перевірить заявку перед увімкненням оптового доступу.\",\n \"rejectedTitle\": \"Вашу заявку реселера відхилено\",\n \"rejectedBody\": \"Зверніться до магазину по інформацію або щоб подати заявку знову.\",\n \"suspendedTitle\": \"Ваш обліковий запис реселера призупинено\",\n \"suspendedBody\": \"Оптові замовлення недоступні. Зверніться до магазину по допомогу.\",\n \"activeTitle\": \"Оптовий обліковий запис\",\n \"tier\": \"Рівень\",\n \"walletTitle\": \"Оптовий баланс\",\n \"balance\": \"Баланс\",\n \"held\": \"Зарезервовано\",\n \"catalogTitle\": \"Оптовий каталог\",\n \"search\": \"Пошук товарів\",\n \"catalogEmptyTitle\": \"Оптових товарів не знайдено\",\n \"catalogEmptyBody\": \"Спробуйте інший пошук або поверніться після додавання товарів магазином.\",\n \"volumePricing\": \"Доступні ціни за обсяг\",\n \"supplierBacked\": \"Постачає постачальник\",\n \"add\": \"Додати\",\n \"basketTitle\": \"Оптовий кошик\",\n \"basketEmpty\": \"Додайте товар з оптового каталогу, щоб почати замовлення.\",\n \"quantity\": \"Кількість\",\n \"basketNeedsQuote\": \"Розрахуйте кошик, щоб побачити актуальну суму перед замовленням.\",\n \"quote\": \"Розрахувати кошик\",\n \"place\": \"Оформити замовлення\",\n \"ordersTitle\": \"Оптові замовлення\",\n \"ordersEmptyTitle\": \"Оптових замовлень ще немає\",\n \"ordersEmptyBody\": \"Тут з'являться замовлення, оплачені з оптового балансу.\",\n \"refunded\": \"Повернено на баланс\",\n \"lineQuantity\": \"Кількість: {count}\",\n \"serials\": \"Доставлені серійні номери\",\n \"apiKeysTitle\": \"API-ключі реселера\",\n \"apiKeyName\": \"Назва ключа\",\n \"createApiKey\": \"Створити ключ\",\n \"apiKeysEmpty\": \"Ви ще не створили API-ключі реселера.\",\n \"orderElsewhere\": \"Оптові замовлення оформлюються через API реселера, а не на цій сторінці.\",\n \"keysElsewhere\": \"Ключі API видає магазин. Попросіть його там.\",\n \"apiKeyCreatedTitle\": \"Скопіюйте цей ключ зараз\",\n \"apiKeyCreatedBody\": \"Відкритий ключ показується один раз, і пізніше його неможливо відновити.\",\n \"dismissKey\": \"Ключ збережено\",\n \"lastUsed\": \"Останнє використання: {date}\",\n \"neverUsed\": \"Не використовувався\",\n \"revokeApiKey\": \"Відкликати\"\n }\n}\n\n","{\n \"common\": {\n \"copy\": \"复制\",\n \"copied\": \"已复制\",\n \"retry\": \"重试\",\n \"notLoaded\": \"此内容未加载\",\n \"genericError\": \"无法加载此内容,请稍后重试。\",\n \"browseStore\": \"浏览商店\",\n \"unavailable\": \"不可用\",\n \"cancel\": \"取消\"\n },\n \"account\": {\n \"title\": \"你的账户\",\n \"sections\": \"账户板块\",\n \"signOut\": \"退出登录\",\n \"signingOut\": \"正在退出…\",\n \"signOutFailed\": \"无法退出登录,请重试。\",\n \"checkingSession\": \"正在检查登录状态\",\n \"sessionUnknown\": \"无法检查你的登录状态,请稍后重试。\",\n \"goToOverview\": \"前往总览\",\n \"tabs\": {\n \"overview\": \"总览\",\n \"orders\": \"订单\",\n \"downloads\": \"下载\",\n \"subscriptions\": \"订阅\",\n \"rewards\": \"奖励\",\n \"referrals\": \"推荐\",\n \"favorites\": \"收藏\",\n \"support\": \"客服\",\n \"settings\": \"设置\",\n \"reseller\": \"分销商\"\n },\n \"notBuilt\": {\n \"title\": \"本店没有{tab}\",\n \"body\": \"此店铺不提供该板块。你的订单和账户信息仍在这里。\"\n },\n \"unknownTab\": {\n \"title\": \"该链接无处可去\",\n \"body\": \"网址指向一个并不存在的账户板块,可能是输错了或被截断了。\"\n }\n },\n \"login\": {\n \"titleEmail\": \"登录你的账户\",\n \"titleCode\": \"请查收邮件\",\n \"introEmail\": \"我们会向你的邮箱发送一次性验证码,无需记住密码。\",\n \"introCode\": \"请输入我们发送到 {email} 的验证码。\",\n \"emailLabel\": \"邮箱\",\n \"codeLabel\": \"登录验证码\",\n \"invalidEmail\": \"请输入完整的邮箱地址,例如 you@example.com。\",\n \"missingCode\": \"请输入邮件中的验证码。\",\n \"send\": \"给我发送验证码\",\n \"sending\": \"正在发送…\",\n \"submit\": \"登录\",\n \"submitting\": \"正在校验…\",\n \"resend\": \"重新发送验证码\",\n \"resent\": \"新的验证码正在发往 {email}。\",\n \"changeEmail\": \"换一个邮箱\",\n \"sendFailed\": \"验证码发送失败,请稍后重试。\",\n \"verifyFailed\": \"该验证码未被接受,请重试。\"\n },\n \"status\": {\n \"COMPLETED\": \"已完成\",\n \"PROCESSING\": \"处理中\",\n \"AWAITING_STOCK\": \"等待补货\",\n \"PENDING\": \"待处理\",\n \"PENDING_PAYMENT\": \"待付款\",\n \"UNDERPAID\": \"支付金额不足\",\n \"DISPUTED\": \"有争议\",\n \"REFUNDED\": \"已退款\",\n \"PARTIAL_REFUND\": \"部分退款\",\n \"VOIDED\": \"已作废\",\n \"EXPIRED\": \"已过期\",\n \"ACTIVE\": \"有效\",\n \"INACTIVE\": \"未启用\",\n \"SUSPENDED\": \"已停用\",\n \"REVOKED\": \"已撤回\",\n \"TRIALING\": \"试用中\",\n \"PAUSED\": \"已暂停\",\n \"PAST_DUE\": \"已逾期\",\n \"UNPAID\": \"未付款\",\n \"INCOMPLETE\": \"未完成\",\n \"CANCELED\": \"已取消\",\n \"CANCELLED\": \"已取消\",\n \"OPEN\": \"进行中\",\n \"CLOSED\": \"已关闭\",\n \"RESOLVED\": \"已解决\",\n \"AWAITING_REPLY\": \"等待你回复\",\n \"APPROVED\": \"已通过\",\n \"REJECTED\": \"已拒绝\",\n \"REQUESTED\": \"已申请\",\n \"CONVERTED\": \"已转换\",\n \"PAID\": \"已支付\",\n \"FAILED\": \"失败\"\n },\n \"delivery\": {\n \"DELIVERED\": \"已交付\",\n \"AWAITING_FULFILLMENT\": \"等待发货\",\n \"PENDING\": \"待处理\",\n \"FAILED\": \"交付失败\"\n },\n \"overview\": {\n \"loading\": \"正在加载你的账户\",\n \"signedInAs\": \"当前登录账号\",\n \"statOrders\": \"订单\",\n \"statLicenses\": \"许可证\",\n \"statDownloads\": \"下载\",\n \"statTickets\": \"客服工单\",\n \"walletLabel\": \"商店余额\",\n \"walletNote\": \"结账时自动抵扣\",\n \"recentOrders\": \"最近的订单\",\n \"allOrders\": \"全部订单\"\n },\n \"orders\": {\n \"loading\": \"正在加载你的订单\",\n \"emptyTitle\": \"还没有订单\",\n \"emptyBody\": \"你在本店下单后,购买记录会立即出现在这里。\",\n \"movedTitle\": \"本页没有内容\",\n \"movedBody\": \"你查看期间,这些订单的位置发生了变动。\",\n \"backToFirstPage\": \"回到第一页\",\n \"pagesLabel\": \"订单记录分页\",\n \"previous\": \"上一页\",\n \"next\": \"下一页\",\n \"page\": \"第 {page} 页\",\n \"andMoreOne\": \"还有一件商品\",\n \"andMoreOther\": \"还有 {count} 件商品\",\n \"fallbackTitle\": \"订单 {id}\",\n \"allOrders\": \"全部订单\",\n \"loadingOne\": \"正在加载该订单\",\n \"detailTitle\": \"订单 {id}\",\n \"subtotal\": \"小计\",\n \"discount\": \"优惠\",\n \"tax\": \"税费\",\n \"total\": \"合计\",\n \"paidWith\": \"支付方式\",\n \"deliveryTitle\": \"你的交付内容\",\n \"replacement\": \"补发\",\n \"search\": \"搜索订单\",\n \"searchPlaceholder\": \"按发票编号搜索\",\n \"status\": \"状态\",\n \"statusAll\": \"全部状态\",\n \"statusCompleted\": \"已完成\",\n \"statusPending\": \"待处理\",\n \"statusProcessing\": \"处理中\",\n \"statusRefunded\": \"已退款\",\n \"statusDisputed\": \"有争议\",\n \"statusExpired\": \"已过期\",\n \"emptyFiltered\": \"没有匹配的订单。请尝试其他发票编号或状态。\",\n \"warrantyTitle\": \"保修\",\n \"warrantyCoveredUntil\": \"保修至 {date}\",\n \"warrantyEnded\": \"保修已于 {date} 结束\",\n \"warrantyCancelled\": \"保修已取消\",\n \"warrantyClaimSubmitted\": \"已提交申请\",\n \"warrantyClaimApproved\": \"申请已通过\",\n \"warrantyClaimDeclined\": \"申请被拒绝\",\n \"warrantyClaimStart\": \"申请保修\",\n \"warrantyClaimLabel\": \"遇到了什么问题?\",\n \"warrantyClaimOptional\": \"选填\",\n \"warrantyClaimSend\": \"提交申请\",\n \"warrantyClaimSending\": \"提交中…\",\n \"warrantyClaimDone\": \"商店已收到你的申请,他们会通过邮件回复。\",\n \"warrantyClaimFailed\": \"申请提交失败。\"\n },\n \"downloads\": {\n \"loading\": \"正在加载你的下载内容\",\n \"emptyTitle\": \"暂时没有可下载的内容\",\n \"emptyBody\": \"订单完成后,文件、密钥和访问链接会出现在这里。\",\n \"licensesTitle\": \"许可证密钥\",\n \"filesTitle\": \"文件\",\n \"codesTitle\": \"兑换码和链接\",\n \"download\": \"下载\",\n \"openLink\": \"打开链接\",\n \"viewOrder\": \"查看订单\",\n \"expires\": \"{date} 到期\",\n \"neverExpires\": \"无到期日\",\n \"lockedTo\": \"已绑定到 {hardwareId}\",\n \"resetHwid\": \"重置硬件 ID\",\n \"resettingHwid\": \"正在重置…\",\n \"hwidResetDone\": \"硬件 ID 已清除,下次激活将重新绑定该许可证。\",\n \"hwidResetFailed\": \"硬件 ID 重置失败,请重试。\",\n \"renewTitle\": \"可续期\",\n \"renewBody\": \"续期属于一次购买,因此要在结账页完成,而不是本页。\",\n \"renewAction\": \"打开商店\",\n \"brokenTitle\": \"无法列出你的下载内容\",\n \"brokenBody\": \"商店发来了一条许可证记录({id}),却没有对应的许可证,这份列表会缺少它所指的东西。\",\n \"brokenFileBody\": \"商店发来了一条文件记录({id}),却没有可下载的内容,这份列表会列出一个交不出的文件。\"\n },\n \"subscriptions\": {\n \"loading\": \"正在加载你的订阅\",\n \"emptyTitle\": \"还没有订阅\",\n \"emptyBody\": \"开通周期性购买后,它会显示在这里。\",\n \"allSubscriptions\": \"全部订阅\",\n \"unnamedPlan\": \"订阅\",\n \"renews\": \"{date} 续订\",\n \"ends\": \"{date} 结束\",\n \"canceled\": \"{date} 已取消\",\n \"startedOn\": \"{date} 开始\",\n \"billingDayOne\": \"每天计费\",\n \"billingDayOther\": \"每 {count} 天计费\",\n \"billingWeekOne\": \"每周计费\",\n \"billingWeekOther\": \"每 {count} 周计费\",\n \"billingMonthOne\": \"每月计费\",\n \"billingMonthOther\": \"每 {count} 个月计费\",\n \"billingYearOne\": \"每年计费\",\n \"billingYearOther\": \"每 {count} 年计费\",\n \"billingOther\": \"每 {count} × {interval} 计费\",\n \"gateway\": \"支付服务商\",\n \"paymentMethod\": \"支付方式\",\n \"cardOnFile\": \"{brand} 尾号 {last4}\",\n \"noPaymentMethod\": \"未保存支付方式\",\n \"paymentMethodElsewhere\": \"修改支付信息的链接来自商店发给你的邮件,不会在此页提供,因为本页上的任何内容都可能读取到它。\",\n \"pause\": \"暂停\",\n \"pausing\": \"正在暂停…\",\n \"resume\": \"恢复\",\n \"resuming\": \"正在恢复…\",\n \"cancel\": \"取消订阅\",\n \"cancelling\": \"正在取消…\",\n \"keep\": \"先留着\",\n \"confirmCancelTitle\": \"要取消该订阅吗?\",\n \"confirmCancelAtPeriodEnd\": \"你可以使用到 {date},之后不再扣费。\",\n \"confirmCancelNow\": \"取消后立即失去使用权限。\",\n \"actionFailed\": \"操作没有成功,请重试。\",\n \"paused\": \"该订阅已暂停。\",\n \"resumed\": \"该订阅已恢复运行。\",\n \"cancelled\": \"该订阅已取消。\",\n \"historyTitle\": \"账单记录\",\n \"historyLoading\": \"正在加载账单记录\",\n \"historyEmptyTitle\": \"还没有账单记录\",\n \"historyEmptyBody\": \"首个周期结束后,续订账单会出现在这里。\",\n \"trial\": \"试用期 {date} 结束\"\n },\n \"favorites\": {\n \"loading\": \"正在加载你的收藏\",\n \"emptyTitle\": \"还没有收藏\",\n \"emptyBody\": \"你逛店时收藏的商品会保存在这里。\",\n \"added\": \"{date} 收藏\",\n \"gone\": \"已下架\",\n \"view\": \"在商店中查看\",\n \"remove\": \"移除\",\n \"removing\": \"正在移除…\",\n \"removeFailed\": \"无法移除该收藏,请重试。\",\n \"noImage\": \"{title} 没有图片\"\n },\n \"rewards\": {\n \"loading\": \"正在加载你的奖励\",\n \"available\": \"可使用\",\n \"pending\": \"进行中\",\n \"lifetime\": \"累计获得\",\n \"couponsTitle\": \"你的优惠券\",\n \"couponsBody\": \"结账时粘贴其中一个。\",\n \"percentOff\": \"立减 {percent}%\",\n \"couponGeneric\": \"折扣优惠券\",\n \"expiresOn\": \"{date} 到期\",\n \"activityTitle\": \"动态\",\n \"emptyTitle\": \"还没有奖励\",\n \"emptyBody\": \"完成一笔订单或写一条评价即可开始赚取。\",\n \"storeCredit\": \"{amount} 商店余额\",\n \"storeCreditGeneric\": \"商店余额\",\n \"couponNamed\": \"优惠券 {code}\",\n \"couponUnnamed\": \"优惠券代码\",\n \"otherReward\": \"奖励\",\n \"reasonOrderCompleted\": \"订单已完成\",\n \"reasonOrderCount\": \"忠诚度里程碑\",\n \"reasonSpendAmount\": \"累计消费\",\n \"reasonReview\": \"已写评价\",\n \"reasonFirstPurchase\": \"首次购买\",\n \"reasonOther\": \"奖励\",\n \"grantFulfilled\": \"已到账\",\n \"grantPending\": \"进行中\",\n \"grantFailed\": \"失败\",\n \"grantRevoked\": \"已撤回\",\n \"pointsTitle\": \"积分\",\n \"pointsBalance\": \"积分余额\",\n \"pointsLifetime\": \"累计获得积分\",\n \"pointsEarnHint\": \"完成一笔订单即可开始累积积分。\",\n \"pointsActivityTitle\": \"积分动态\",\n \"pointsFromOrder\": \"订单已完成\",\n \"pointsFromReview\": \"已写评价\",\n \"pointsConverted\": \"已兑换为商店余额\",\n \"pointsAdjusted\": \"由商店调整\",\n \"redeemTitle\": \"兑换积分\",\n \"redeemBody\": \"把积分兑换成商店余额,结账时即可使用。\",\n \"redeemLabel\": \"要兑换的积分\",\n \"redeemMinimum\": \"至少兑换 {points} 积分。\",\n \"redeemOverBalance\": \"你有 {points} 积分可用。\",\n \"redeemInvalid\": \"请输入整数积分。\",\n \"redeemPreview\": \"约合 {amount} 商店余额。\",\n \"redeemContinue\": \"继续\",\n \"redeemConfirm\": \"将 {points} 积分兑换成约 {amount} 商店余额?\",\n \"redeemConfirmAction\": \"确认兑换\",\n \"redeemWorking\": \"兑换中…\",\n \"redeemDone\": \"{amount} 已存入你的商店余额。\",\n \"redeemFailed\": \"积分兑换失败。\"\n },\n \"referrals\": {\n \"loading\": \"正在加载你的推荐记录\",\n \"notEnrolledTitle\": \"你尚未加入推荐计划\",\n \"notEnrolledBody\": \"本店还没有把你加入计划,因此暂时没有可分享或可查看的内容。\",\n \"availableLabel\": \"可提现\",\n \"pendingLabel\": \"处理中\",\n \"requestedLabel\": \"已申请\",\n \"payoutsElsewhere\": \"提现和打款由商店处理,不在此页办理。\",\n \"codesAccepted\": \"结账时可以使用你的推荐码。\",\n \"codesNotAccepted\": \"本店目前不接受在结账时使用推荐码。\",\n \"linksTitle\": \"你的链接\",\n \"linksEmptyTitle\": \"还没有推荐链接\",\n \"linksEmptyBody\": \"你分享的链接由商店创建。如果你以为这里会有,请向商店索取。\",\n \"primary\": \"主链接\",\n \"commission\": \"{percent}% 佣金\",\n \"buyerDiscount\": \"买家享 {percent}% 优惠\",\n \"awaitingApproval\": \"该链接正在等待商店审核。\",\n \"clicks\": \"点击\",\n \"sales\": \"成交\",\n \"revenue\": \"销售额\",\n \"commissionsTitle\": \"佣金\",\n \"commissionsEmptyTitle\": \"还没有佣金\",\n \"commissionsEmptyBody\": \"审核通过的推荐订单会显示在这里。\",\n \"commissionFor\": \"订单 {id}\",\n \"balanceTitle\": \"余额动态\",\n \"balanceEmptyTitle\": \"还没有余额动态\",\n \"balanceEmptyBody\": \"转换和打款记录会显示在这里。\",\n \"claimStoreCredit\": \"商店余额\",\n \"claimCryptoPayout\": \"加密货币打款\",\n \"claimAdjustment\": \"调整\",\n \"differentCurrency\": \"你的推荐余额以 {currency} 结算。\",\n \"convertedLabel\": \"已转为商店余额\",\n \"paidLabel\": \"已打款\"\n },\n \"support\": {\n \"loading\": \"正在加载你的工单\",\n \"ticketsTitle\": \"你的工单\",\n \"emptyTitle\": \"还没有工单\",\n \"emptyBody\": \"在这里联系商店,所有回复都会留在本页。\",\n \"newTicket\": \"新建工单\",\n \"backToTickets\": \"全部工单\",\n \"updated\": \"{date} 更新\",\n \"aboutOrder\": \"关于订单 {id}\",\n \"subjectLabel\": \"主题\",\n \"subjectOptional\": \"选填\",\n \"messageLabel\": \"留言\",\n \"replyLabel\": \"你的回复\",\n \"create\": \"发送给商店\",\n \"creating\": \"正在发送…\",\n \"createFailed\": \"无法创建工单,请重试。\",\n \"reply\": \"发送回复\",\n \"replying\": \"正在发送…\",\n \"replyFailed\": \"回复发送失败,请重试。\",\n \"tooShort\": \"请至少写一句话。\",\n \"closedTitle\": \"该工单已关闭\",\n \"closedBody\": \"如果仍需帮助,请新建一个工单。\",\n \"loadingThread\": \"正在加载该对话\",\n \"noMessages\": \"该工单还没有任何消息。\",\n \"fromYou\": \"你\",\n \"fromMerchant\": \"商店\",\n \"fromSystem\": \"系统\",\n \"untitled\": \"客服请求\"\n },\n \"settings\": {\n \"loading\": \"正在加载你的设置\",\n \"profileTitle\": \"个人资料\",\n \"emailLabel\": \"邮箱\",\n \"emailNote\": \"你用邮箱登录,因此邮箱由商店修改,不能在此更改。\",\n \"nameLabel\": \"姓名\",\n \"nameTooShort\": \"请输入你的姓名。\",\n \"saveProfile\": \"保存更改\",\n \"savingProfile\": \"正在保存…\",\n \"profileSaved\": \"你的姓名已更新。\",\n \"profileFailed\": \"姓名保存失败,请重试。\",\n \"uploadAvatar\": \"上传照片\",\n \"uploadingAvatar\": \"正在上传…\",\n \"removeAvatar\": \"移除照片\",\n \"removingAvatar\": \"正在移除…\",\n \"avatarHint\": \"支持 JPG、PNG、GIF 或 WebP,最大 10 MB。\",\n \"avatarFailed\": \"照片上传失败,请重试。\",\n \"avatarRemoveFailed\": \"照片移除失败,请重试。\",\n \"avatarTooLarge\": \"该图片超过 10 MB。\",\n \"emailsTitle\": \"商店邮件\",\n \"emailsLoading\": \"正在加载邮件设置\",\n \"unsubscribeAll\": \"不接收任何营销邮件\",\n \"unsubscribeAllNote\": \"订单和交付邮件都会照常发送。\",\n \"listsEmpty\": \"本店没有邮件列表。\",\n \"emailsFailed\": \"无法加载你的邮件设置。\",\n \"emailsSaveFailed\": \"该设置保存失败,请重试。\",\n \"devicesTitle\": \"已登录的设备\",\n \"devicesLoading\": \"正在加载你的设备\",\n \"devicesEmpty\": \"没有其他设备处于登录状态。\",\n \"thisDevice\": \"当前设备\",\n \"signedInOn\": \"{date} 登录\",\n \"unknownDevice\": \"未知设备\",\n \"signOutDevice\": \"退出登录\",\n \"signingOutDevice\": \"正在退出…\",\n \"signOutOthers\": \"退出其他所有设备\",\n \"signOutOthersDone\": \"其他所有设备已退出登录。\",\n \"devicesFailed\": \"无法加载你的设备。\",\n \"signOutDeviceFailed\": \"该设备退出登录失败,请重试。\",\n \"deviceOn\": \"{os} 上的 {browser}\"\n },\n \"walletTopup\": {\n \"title\": \"添加商店余额\",\n \"minimum\": \"最低 {min}\",\n \"bounds\": \"{min} 至 {max}\",\n \"bonus\": \"至少添加 {amount},额外获得 {percent}%\",\n \"amount\": \"金额\",\n \"submit\": \"继续付款\"\n },\n \"reseller\": {\n \"disabledTitle\": \"经销商计划暂不可用\",\n \"disabledBody\": \"该商店目前不接受批发订单。\",\n \"openTitle\": \"加入经销商计划\",\n \"openBody\": \"立即加入,以批发价购买该商店的商品。\",\n \"join\": \"立即加入\",\n \"manualTitle\": \"接受经销商邀请\",\n \"manualBody\": \"请输入商店发送给你的邀请令牌。\",\n \"inviteToken\": \"邀请令牌\",\n \"acceptInvite\": \"接受邀请\",\n \"applicationTitle\": \"申请成为经销商\",\n \"applicationBody\": \"向商店介绍你的业务并提交申请。\",\n \"applicationNote\": \"申请说明\",\n \"noteRequired\": \"提交申请前请添加说明。\",\n \"apply\": \"提交申请\",\n \"pendingTitle\": \"你的申请正在审核\",\n \"pendingBody\": \"商店将在启用批发权限前审核你的申请。\",\n \"rejectedTitle\": \"你的经销商申请已被拒绝\",\n \"rejectedBody\": \"如需更多信息或重新申请,请联系商店。\",\n \"suspendedTitle\": \"你的经销商账户已暂停\",\n \"suspendedBody\": \"目前无法下批发订单。请联系商店获取帮助。\",\n \"activeTitle\": \"批发账户\",\n \"tier\": \"等级\",\n \"walletTitle\": \"批发余额\",\n \"balance\": \"余额\",\n \"held\": \"冻结中\",\n \"catalogTitle\": \"批发目录\",\n \"search\": \"搜索商品\",\n \"catalogEmptyTitle\": \"未找到批发商品\",\n \"catalogEmptyBody\": \"请尝试其他搜索,或等待商店添加商品后再来。\",\n \"volumePricing\": \"支持批量定价\",\n \"supplierBacked\": \"由供应商履约\",\n \"add\": \"添加\",\n \"basketTitle\": \"批发购物篮\",\n \"basketEmpty\": \"从批发目录添加商品即可开始下单。\",\n \"quantity\": \"数量\",\n \"basketNeedsQuote\": \"请先为购物篮询价,查看当前总额后再下单。\",\n \"quote\": \"购物篮询价\",\n \"place\": \"提交订单\",\n \"ordersTitle\": \"批发订单\",\n \"ordersEmptyTitle\": \"暂无批发订单\",\n \"ordersEmptyBody\": \"使用批发余额支付的订单会显示在这里。\",\n \"refunded\": \"已退回余额\",\n \"lineQuantity\": \"数量 {count}\",\n \"serials\": \"已交付序列号\",\n \"apiKeysTitle\": \"经销商 API 密钥\",\n \"apiKeyName\": \"密钥名称\",\n \"createApiKey\": \"创建密钥\",\n \"apiKeysEmpty\": \"你还没有创建经销商 API 密钥。\",\n \"orderElsewhere\": \"批发订单通过分销商 API 下单,不在此页面进行。\",\n \"keysElsewhere\": \"API 密钥由店铺签发,请向店铺索取。\",\n \"apiKeyCreatedTitle\": \"立即复制此密钥\",\n \"apiKeyCreatedBody\": \"该明文密钥只显示一次,之后无法恢复。\",\n \"dismissKey\": \"我已保存\",\n \"lastUsed\": \"上次使用:{date}\",\n \"neverUsed\": \"从未使用\",\n \"revokeApiKey\": \"撤销\"\n }\n}\n\n","/**\n * The customer account's message catalog.\n *\n * A code storefront is an immutable artifact served from R2 — there is no\n * server render and no request-time catalog injection. Every locale therefore\n * ships INSIDE the account chunk, and the one thing that varies per request is\n * which of them is read.\n *\n * The locale comes from `<html lang>`, which the Shoppex worker rewrites to the\n * locale the page was served in (`withServedHtmlLang` in\n * `workers/storefront/src/code-page-metadata.ts`) before the bundle runs. That\n * is the only locale signal a code storefront gets, and it is the same one the\n * document lane resolves its catalog from — so a buyer on `/de/dashboard` reads\n * German on either lane. `navigator.language` is deliberately NOT consulted: it\n * is the browser's preference, not the page the edge decided to serve, and\n * mixing the two produces a German page with English panels inside it.\n *\n * English is the compiled-in contract. `translate` falls back to it for a key a\n * locale catalog is missing, exactly like the document lane's runtime, and the\n * parity test in `tests/messages.test.ts` is what keeps that fallback from ever\n * being needed in a release.\n *\n * All sixteen are STATIC imports, and that is a decision with a price: they add\n * roughly 66 KB gzipped to a bundle that only ever reads one of them. Splitting\n * them into per-locale chunks would trade those bytes for a second failure mode\n * — a chunk that does not arrive leaves a buyer reading English on a German\n * page, quietly, and the boot would have to become asynchronous to allow for\n * it. Bytes that are always right beat a request that can be wrong; revisit\n * this if the catalog grows past the account surface.\n */\n\nimport arMessages from './messages/ar.json';\nimport deMessages from './messages/de.json';\nimport enMessages from './messages/en.json';\nimport esMessages from './messages/es.json';\nimport fiMessages from './messages/fi.json';\nimport frMessages from './messages/fr.json';\nimport hiMessages from './messages/hi.json';\nimport itMessages from './messages/it.json';\nimport ltMessages from './messages/lt.json';\nimport nlMessages from './messages/nl.json';\nimport plMessages from './messages/pl.json';\nimport ptMessages from './messages/pt.json';\nimport ruMessages from './messages/ru.json';\nimport trMessages from './messages/tr.json';\nimport ukMessages from './messages/uk.json';\nimport zhMessages from './messages/zh.json';\n\nexport type MessageParams = Record<string, string | number>;\nexport type MessageCatalog = { [key: string]: string | MessageCatalog };\n\n/** The locales the Shoppex storefront edge can serve. */\nexport const SUPPORTED_LOCALES = [\n 'ar', 'de', 'en', 'es', 'fi', 'fr', 'hi', 'it',\n 'lt', 'nl', 'pl', 'pt', 'ru', 'tr', 'uk', 'zh',\n] as const;\n\nexport type Locale = (typeof SUPPORTED_LOCALES)[number];\n\nexport const DEFAULT_LOCALE: Locale = 'en';\n\nexport const MESSAGE_CATALOGS: Readonly<Record<Locale, MessageCatalog>> = {\n ar: arMessages as MessageCatalog,\n de: deMessages as MessageCatalog,\n en: enMessages as MessageCatalog,\n es: esMessages as MessageCatalog,\n fi: fiMessages as MessageCatalog,\n fr: frMessages as MessageCatalog,\n hi: hiMessages as MessageCatalog,\n it: itMessages as MessageCatalog,\n lt: ltMessages as MessageCatalog,\n nl: nlMessages as MessageCatalog,\n pl: plMessages as MessageCatalog,\n pt: ptMessages as MessageCatalog,\n ru: ruMessages as MessageCatalog,\n tr: trMessages as MessageCatalog,\n uk: ukMessages as MessageCatalog,\n zh: zhMessages as MessageCatalog,\n};\n\nexport const EN_MESSAGES: MessageCatalog = MESSAGE_CATALOGS.en;\n\n/** Locales written right-to-left, so the account shell can flip its direction. */\nconst RTL_LOCALES: ReadonlySet<Locale> = new Set<Locale>(['ar']);\n\nexport function isSupportedLocale(value: string): value is Locale {\n return (SUPPORTED_LOCALES as readonly string[]).includes(value);\n}\n\n/**\n * The catalog a `lang` attribute names.\n *\n * `de-AT` and `DE` both resolve to `de`: the edge writes a bare two-letter code\n * today, and a region-tagged one must not silently read as \"no locale at all\".\n * Anything that names no catalog is English, which is the complete contract\n * rather than a guess at what the buyer wanted.\n */\nexport function resolveLocale(lang: string | null | undefined): Locale {\n const base = (lang ?? '').trim().toLowerCase().split(/[-_]/)[0] ?? '';\n return isSupportedLocale(base) ? base : DEFAULT_LOCALE;\n}\n\nexport function isRightToLeft(locale: Locale): boolean {\n return RTL_LOCALES.has(locale);\n}\n\nfunction messageAt(catalog: MessageCatalog | undefined, key: string): string | undefined {\n let value: string | MessageCatalog | undefined = catalog;\n for (const segment of key.split('.')) {\n if (!value || typeof value === 'string') return undefined;\n value = value[segment];\n }\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction interpolate(message: string, params: MessageParams | undefined): string {\n if (!params) return message;\n return message.replace(/\\{([^{}]+)\\}/g, (token, name: string) => (\n Object.prototype.hasOwnProperty.call(params, name) ? String(params[name]) : token\n ));\n}\n\n/** Whether English — the contract — defines this key at all. */\nexport function hasMessage(key: string): boolean {\n return messageAt(EN_MESSAGES, key) !== undefined;\n}\n\nexport function translate(locale: Locale, key: string, params?: MessageParams): string {\n const message = messageAt(MESSAGE_CATALOGS[locale], key) ?? messageAt(EN_MESSAGES, key);\n // The key itself, so a missing string is visible in the UI rather than blank.\n if (message === undefined) return key;\n return interpolate(message, params);\n}\n\n/**\n * A message only when one exists.\n *\n * Wire enums (invoice status, reward reason, delivery state) are OPEN sets: the\n * server may emit a value this catalog has never heard of. Those callers need\n * \"no translation\" as an answer they can act on, so they can print the server's\n * own spelling instead of the key.\n */\nexport function translateOptional(\n locale: Locale,\n key: string,\n params?: MessageParams,\n): string | undefined {\n return hasMessage(key) ? translate(locale, key, params) : undefined;\n}\n\nlet activeLocale: Locale | undefined;\n\nfunction documentLocale(): Locale {\n if (typeof document === 'undefined') return DEFAULT_LOCALE;\n return resolveLocale(document.documentElement.getAttribute('lang'));\n}\n\n/** The locale this page load is being read in. Resolved once, from the edge. */\nexport function getActiveLocale(): Locale {\n if (activeLocale === undefined) activeLocale = documentLocale();\n return activeLocale;\n}\n\n/** Pins the locale. The tests are the only caller; the browser uses `<html lang>`. */\nexport function setActiveLocale(locale: Locale | undefined): void {\n activeLocale = locale;\n}\n\nexport function t(key: string, params?: MessageParams): string {\n return translate(getActiveLocale(), key, params);\n}\n\nexport function tOptional(key: string, params?: MessageParams): string | undefined {\n return translateOptional(getActiveLocale(), key, params);\n}\n","import { t } from './i18n';\nimport { getShoppex } from '../shoppex';\nimport type { ShoppexSdk, SdkResponse } from '../sdk';\n\n/**\n * The one way this template reaches customer data.\n *\n * Every account call goes through the SDK, which posts to the merchant's own\n * origin with `credentials: 'same-origin'`. There is deliberately no fetch\n * client here: the session is an HttpOnly cookie the Shoppex worker owns, the\n * shop comes from the host, and a hand-rolled client is how a storefront ends\n * up sending a shop or a token it should never have been able to choose.\n *\n * `getShoppex()` throws when the SDK script or a bootstrap global is missing,\n * and an SDK build older than the customer module has no `dashboard` method at\n * all. Both surface here as a failed call, so the panel shows an error instead\n * of an empty account — the first carrying its own sentence, the second falling\n * back to the panel's generic one.\n */\nexport async function callCustomerApi<T>(\n operation: (sdk: ShoppexSdk) => Promise<SdkResponse<T>>,\n): Promise<SdkResponse<T>> {\n try {\n return await operation(getShoppex());\n } catch (error) {\n // A TypeError here is the ENGINE talking, not the shop: `sdk.loyalty is not\n // a function` is what a page gets when the CDN is still serving an SDK\n // bundle older than this build — publish sequencing, invisible to the buyer\n // and unfixable by them. Dropping the message hands the panel the generic\n // sentence it already has, instead of printing a stack-trace fragment into\n // the account page.\n if (error instanceof TypeError) return { success: false };\n return {\n success: false,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * What a panel is currently showing. `error` carries the server's own sentence\n * rather than a generic one, because the server is the only party that knows\n * why a call was refused.\n */\nexport type AccountPanelState<T> =\n | { status: 'loading' }\n | { status: 'error'; message: string }\n /**\n * `staleMessage` is set when a RE-read of data already on screen failed:\n * the panel keeps what the buyer is looking at instead of tearing it down,\n * but must say the figures may be out of date rather than staying silent.\n */\n | { status: 'ready'; data: T; staleMessage?: string };\n\n/**\n * The message shown when a failure reached us without one.\n *\n * Localized, unlike `response.message`: the server's sentence is already in the\n * buyer's language when the server knows it, and this is the one case where\n * nobody said anything at all.\n */\nexport function accountGenericError(): string {\n return t('common.genericError');\n}\n\n/**\n * A merchant-supplied delivery link, or nothing.\n *\n * A delivery of kind `link` is a URL the shop typed into their own product, and\n * `javascript:` is a URL. An anchor carrying one runs on the origin the buyer\n * is standing on, with their session — so it is refused here rather than\n * rendered and hoped about. Only http, https and relative paths survive.\n */\nexport function safeExternalHref(href: string | null | undefined): string | null {\n const raw = href?.trim() ?? '';\n if (!raw) return null;\n if (raw.startsWith('/')) return raw;\n\n const scheme = raw.slice(0, raw.indexOf(':')).toLowerCase();\n if (raw.includes(':') && scheme !== 'http' && scheme !== 'https') return null;\n return raw;\n}\n\nexport function toPanelState<T>(response: SdkResponse<T>): AccountPanelState<T> {\n if (!response.success || response.data === undefined) {\n return {\n status: 'error',\n message: response.message?.trim() || accountGenericError(),\n };\n }\n return { status: 'ready', data: response.data };\n}\n\n","/**\n * The reads the account shell owns, and the availability derived from them.\n *\n * Seven panels are built from the `dashboard()` payload and both the navigation\n * gate and the wholesale panel need the reseller programme. Each used to ask\n * for its own copy, which meant the shell could not gate its navigation without\n * a SECOND request for something already on the page. The shell asks once,\n * above the panels, and hands both down — the shape the document lane uses in\n * `packages/storefront-commerce/src/sx/account-page.ts`.\n *\n * Both reads are keyed on the panel being shown, so moving between panels\n * revalidates exactly as it did when each panel fetched on its own mount. The\n * duplicate is what this removes; the freshness is not.\n */\n\nimport { createContext, useContext, useRef, type ReactNode } from 'react';\nimport {\n availabilityFromShellReads,\n type AccountAvailability,\n} from './account-availability';\nimport { narrowResellerProgram } from './account-reseller';\nimport { callCustomerApi, type AccountPanelState } from './customer-account';\nimport type { SdkCustomerDashboard } from '../sdk';\nimport { useAccountResource } from './shared';\n\nexport interface AccountResource<T> {\n state: AccountPanelState<T>;\n reload: () => void;\n}\n\ninterface AccountShellReads {\n dashboard: AccountResource<SdkCustomerDashboard>;\n /** The wholesale programme, raw. The gate and the panel narrow it themselves. */\n resellerProgram: AccountResource<unknown>;\n}\n\nconst ShellReadsContext = createContext<AccountShellReads | null>(null);\n\nfunction useShellReads(): AccountShellReads {\n const value = useContext(ShellReadsContext);\n if (value === null) {\n throw new Error('account panels must be rendered inside the account shell');\n }\n return value;\n}\n\n/** The dashboard payload, as loaded once by the shell. */\nexport function useAccountDashboard(): AccountResource<SdkCustomerDashboard> {\n return useShellReads().dashboard;\n}\n\n/**\n * The wholesale programme, as loaded once by the shell.\n *\n * The navigation gate and the wholesale panel read the SAME response. Two reads\n * could disagree — the gate's failing while the panel's succeeded — and a buyer\n * would see the panel call them an active reseller while the navigation had\n * dropped the tab they reached it by.\n */\nexport function useAccountResellerProgram(): AccountResource<unknown> {\n return useShellReads().resellerProgram;\n}\n\n/**\n * Both shell reads, revalidated when the buyer moves to another panel.\n *\n * `panelKey` is the surface being shown. Without it the shell would load once\n * per sign-in and never again: a buyer who bought their first download in\n * another tab would come back, walk into Downloads and be told they have none,\n * because the payload deciding that was read before the purchase existed.\n */\nexport function useAccountShellReads(panelKey: string): AccountShellReads {\n // keepStale: the only same-key re-read of this payload is the refresh a\n // successful redemption asks for, and tearing every panel down to an error\n // because a background refresh failed would destroy the notice that\n // redemption just showed. AccountRewards renders the staleMessage.\n const dashboard = useAccountResource(`dashboard:${panelKey}`, () =>\n callCustomerApi((sdk) => sdk.dashboard()), { keepStale: true });\n const resellerProgram = useAccountResource(`reseller-program:${panelKey}`, () =>\n callCustomerApi((sdk) => sdk.reseller()));\n return { dashboard, resellerProgram };\n}\n\n/**\n * What the navigation may offer, or null while nothing is known yet.\n *\n * The dashboard gates are decided the moment the dashboard answers. They do NOT\n * wait on the reseller read — that is a separate request for one tab, and\n * blocking Downloads, Subscriptions, Rewards, Referrals and Favorites on it\n * meant a slow wholesale endpoint emptied a navigation it has nothing to do\n * with. The document lane passes whatever it holds and lets the wholesale leaf\n * appear when its own answer arrives; this does the same.\n *\n * The last known answer is held across a revalidation. Otherwise every move\n * between panels would empty the navigation and refill it a moment later, under\n * the cursor of the buyer using it.\n */\nexport function useAccountAvailability(reads: AccountShellReads): AccountAvailability | null {\n const lastKnown = useRef<AccountAvailability | null>(null);\n const { dashboard, resellerProgram } = reads;\n\n /*\n * A reseller read that failed, or has not answered, is not a shop without a\n * programme — it is an unanswered question, and the gate stays SHUT rather\n * than offering a tab on a guess. A buyer standing on that tab keeps it:\n * `isAccountTabOffered` never hides the active one. And because the panel\n * shares this exact response, its retry reopens the gate.\n */\n const program = resellerProgram.state.status === 'ready'\n ? narrowResellerProgram(resellerProgram.state.data)\n : null;\n\n const availability = availabilityFromShellReads(\n dashboard.state.status === 'ready'\n ? {\n licensesCount: dashboard.state.data.stats.licenses_count,\n deliverablesCount: dashboard.state.data.stats.deliverables_count,\n subscriptionsCount: dashboard.state.data.subscriptions.length,\n walletPresent: dashboard.state.data.wallet !== null,\n affiliateState: dashboard.state.data.affiliate.state,\n }\n : null,\n program?.ok ? program.data : null,\n lastKnown.current,\n );\n\n lastKnown.current = availability;\n return availability;\n}\n\nexport function AccountShellProvider({\n value,\n children,\n}: {\n value: AccountShellReads;\n children: ReactNode;\n}) {\n return <ShellReadsContext.Provider value={value}>{children}</ShellReadsContext.Provider>;\n}\n","/**\n * Pure wire narrowing and basket quote helpers for the wholesale account tab.\n *\n * The shapes below follow the mapper functions in\n * `apps/backend-elysia/src/routes/v1/customer-reseller.ts` exactly. They do not\n * model what the UI wishes the API returned. A missing producer field fails the\n * complete read, so Clean Minimal never renders a partly guessed money or order state.\n */\n\nexport type ResellerEnrollmentMode = \"MANUAL\" | \"APPLICATION\" | \"OPEN\";\nexport type ResellerStatus =\n | \"INVITED\"\n | \"APPLIED\"\n | \"ACTIVE\"\n | \"SUSPENDED\"\n | \"REJECTED\";\nexport type ResellerAppliedOverride = \"variant\" | \"product\" | \"tier\";\n\nexport interface ResellerTier {\n id: string;\n name: string | null;\n discount_percent: number | null;\n}\n\nexport interface ResellerRelationship {\n id: string;\n status: ResellerStatus;\n tier: ResellerTier | null;\n application_note: string | null;\n lifetime_revenue: string;\n lifetime_orders: number;\n approved_at: string | null;\n created_at: string;\n}\n\nexport interface ResellerProgramState {\n program_enabled: boolean;\n enrollment_mode: ResellerEnrollmentMode;\n application_message: string | null;\n require_application_note: boolean;\n reseller: ResellerRelationship | null;\n}\n\nexport interface ResellerCatalogVariant {\n variant_id: string;\n title: string;\n stock: number;\n supplier_backed: boolean;\n orderable: boolean;\n base_price: string;\n unit_price: string;\n discount_percent: number;\n applied_override: ResellerAppliedOverride;\n}\n\nexport interface ResellerCatalogItem {\n product_id: string;\n uniqid: string;\n title: string;\n type: string;\n stock: number;\n supplier_backed: boolean;\n orderable: boolean;\n volume_discount_enabled: boolean;\n base_price: string;\n unit_price: string;\n discount_percent: number;\n applied_override: ResellerAppliedOverride;\n variants: ResellerCatalogVariant[];\n}\n\nexport interface ResellerCatalog {\n currency: string;\n total: number;\n page: number;\n per_page: number;\n items: ResellerCatalogItem[];\n}\n\nexport interface ResellerCatalogPayload {\n tier: { id: string; name: string; discount_percent: number };\n catalog: ResellerCatalog;\n}\n\nexport interface ResellerOrderItemInput {\n product_id: string;\n variant_id?: string;\n quantity: number;\n}\n\n/** Producer limits from `ResellerOrderItemSchema`. Quantities are units, not fractions. */\nexport const RESELLER_QUANTITY_MIN_UNITS = 1;\nexport const RESELLER_QUANTITY_MAX_UNITS = 100_000;\n\nexport function isValidResellerQuantity(value: number): boolean {\n return Number.isInteger(value)\n && value >= RESELLER_QUANTITY_MIN_UNITS\n && value <= RESELLER_QUANTITY_MAX_UNITS;\n}\n\nexport interface ResellerQuoteItem {\n product_id: string;\n product_title: string;\n product_type: string;\n variant_id: string | null;\n variant_title: string | null;\n quantity: number;\n base_price: string;\n discount_percent: number;\n unit_price: string;\n line_total: string;\n applied_override: ResellerAppliedOverride;\n volume_discount_applied: string;\n}\n\nexport interface ResellerQuote {\n currency: string;\n tier: { id: string; name: string; discount_percent: number };\n items: ResellerQuoteItem[];\n subtotal: string;\n volume_discount_total: string;\n total: string;\n savings: string;\n}\n\nexport interface ResellerOrderListItem {\n uniqid: string;\n status: string;\n currency: string;\n total: string;\n item_count: number;\n created_at: string;\n}\n\nexport interface ResellerOrderList {\n total: number;\n page: number;\n per_page: number;\n items: ResellerOrderListItem[];\n}\n\nexport interface ResellerOrderLine {\n product_id: string | null;\n product_title: string;\n variant_id: string | null;\n variant_title: string | null;\n quantity: number;\n unit_price: string;\n total: string;\n delivered: boolean;\n delivered_at: string | null;\n serials: string[];\n}\n\nexport interface ResellerOrderDetail {\n uniqid: string;\n status: string;\n currency: string;\n total: string;\n item_count: number;\n created_at: string;\n tier_name: string;\n tier_discount_percent: number;\n partially_delivered: boolean;\n refunded_amount: string | null;\n lines: ResellerOrderLine[];\n}\n\nexport interface ResellerWallet {\n currency: string;\n balance: string;\n hold_balance: string;\n available: string;\n is_active: boolean;\n}\n\nexport interface ResellerApiKey {\n id: string;\n name: string;\n key_last4: string;\n last_used_at: string | null;\n revoked_at: string | null;\n created_at: string;\n}\n\nexport type NarrowResult<T> = { ok: true; data: T } | { ok: false };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNullableString(value: unknown): value is string | null {\n return value === null || typeof value === \"string\";\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isEnrollmentMode(value: unknown): value is ResellerEnrollmentMode {\n return value === \"MANUAL\" || value === \"APPLICATION\" || value === \"OPEN\";\n}\n\nfunction isResellerStatus(value: unknown): value is ResellerStatus {\n return (\n value === \"INVITED\" ||\n value === \"APPLIED\" ||\n value === \"ACTIVE\" ||\n value === \"SUSPENDED\" ||\n value === \"REJECTED\"\n );\n}\n\nfunction isAppliedOverride(value: unknown): value is ResellerAppliedOverride {\n return value === \"variant\" || value === \"product\" || value === \"tier\";\n}\n\nfunction narrowTier(\n value: unknown,\n nullableFields = false,\n): ResellerTier | null | undefined {\n if (value === null) return null;\n if (!isRecord(value) || typeof value.id !== \"string\") return undefined;\n if (nullableFields) {\n if (\n !isNullableString(value.name) ||\n !(\n value.discount_percent === null ||\n isFiniteNumber(value.discount_percent)\n )\n ) {\n return undefined;\n }\n return {\n id: value.id,\n name: value.name,\n discount_percent: value.discount_percent,\n };\n }\n if (typeof value.name !== \"string\" || !isFiniteNumber(value.discount_percent))\n return undefined;\n return {\n id: value.id,\n name: value.name,\n discount_percent: value.discount_percent,\n };\n}\n\nfunction narrowRelationship(\n value: unknown,\n): ResellerRelationship | null | undefined {\n if (value === null) return null;\n if (!isRecord(value)) return undefined;\n const tier = narrowTier(value.tier, true);\n if (\n typeof value.id !== \"string\" ||\n !isResellerStatus(value.status) ||\n tier === undefined ||\n !isNullableString(value.application_note) ||\n typeof value.lifetime_revenue !== \"string\" ||\n !isFiniteNumber(value.lifetime_orders) ||\n !isNullableString(value.approved_at) ||\n typeof value.created_at !== \"string\"\n ) {\n return undefined;\n }\n return {\n id: value.id,\n status: value.status,\n tier,\n application_note: value.application_note,\n lifetime_revenue: value.lifetime_revenue,\n lifetime_orders: value.lifetime_orders,\n approved_at: value.approved_at,\n created_at: value.created_at,\n };\n}\n\n/** `GET /reseller`, written against the route's program response + mapReseller. */\nexport function narrowResellerProgram(\n payload: unknown,\n): NarrowResult<ResellerProgramState> {\n if (!isRecord(payload)) return { ok: false };\n const reseller = narrowRelationship(payload.reseller);\n if (\n typeof payload.program_enabled !== \"boolean\" ||\n !isEnrollmentMode(payload.enrollment_mode) ||\n !isNullableString(payload.application_message) ||\n typeof payload.require_application_note !== \"boolean\" ||\n reseller === undefined\n ) {\n return { ok: false };\n }\n return {\n ok: true,\n data: {\n program_enabled: payload.program_enabled,\n enrollment_mode: payload.enrollment_mode,\n application_message: payload.application_message,\n require_application_note: payload.require_application_note,\n reseller,\n },\n };\n}\n\n/** Enrollment mutations answer `{ reseller: mapReseller(...) }`. */\nexport function narrowResellerMutation(\n payload: unknown,\n): NarrowResult<ResellerRelationship> {\n if (!isRecord(payload)) return { ok: false };\n const reseller = narrowRelationship(payload.reseller);\n return reseller ? { ok: true, data: reseller } : { ok: false };\n}\n\nfunction narrowCatalogVariant(value: unknown): ResellerCatalogVariant | null {\n if (!isRecord(value)) return null;\n if (\n typeof value.variant_id !== \"string\" ||\n typeof value.title !== \"string\" ||\n !isFiniteNumber(value.stock) ||\n typeof value.supplier_backed !== \"boolean\" ||\n typeof value.orderable !== \"boolean\" ||\n typeof value.base_price !== \"string\" ||\n typeof value.unit_price !== \"string\" ||\n !isFiniteNumber(value.discount_percent) ||\n !isAppliedOverride(value.applied_override)\n )\n return null;\n return value as unknown as ResellerCatalogVariant;\n}\n\nfunction narrowCatalogItem(value: unknown): ResellerCatalogItem | null {\n if (!isRecord(value) || !Array.isArray(value.variants)) return null;\n const variants: ResellerCatalogVariant[] = [];\n for (const raw of value.variants) {\n const variant = narrowCatalogVariant(raw);\n if (!variant) return null;\n variants.push(variant);\n }\n if (\n typeof value.product_id !== \"string\" ||\n typeof value.uniqid !== \"string\" ||\n typeof value.title !== \"string\" ||\n typeof value.type !== \"string\" ||\n !isFiniteNumber(value.stock) ||\n typeof value.supplier_backed !== \"boolean\" ||\n typeof value.orderable !== \"boolean\" ||\n typeof value.volume_discount_enabled !== \"boolean\" ||\n typeof value.base_price !== \"string\" ||\n typeof value.unit_price !== \"string\" ||\n !isFiniteNumber(value.discount_percent) ||\n !isAppliedOverride(value.applied_override)\n )\n return null;\n return {\n product_id: value.product_id,\n uniqid: value.uniqid,\n title: value.title,\n type: value.type,\n stock: value.stock,\n supplier_backed: value.supplier_backed,\n orderable: value.orderable,\n volume_discount_enabled: value.volume_discount_enabled,\n base_price: value.base_price,\n unit_price: value.unit_price,\n discount_percent: value.discount_percent,\n applied_override: value.applied_override,\n variants,\n };\n}\n\n/** `GET /reseller/catalog`, written against mapCatalog and its tier wrapper. */\nexport function narrowResellerCatalog(\n payload: unknown,\n): NarrowResult<ResellerCatalogPayload> {\n if (!isRecord(payload) || !isRecord(payload.catalog)) return { ok: false };\n const tier = narrowTier(payload.tier);\n const raw = payload.catalog;\n if (\n !tier ||\n typeof tier.name !== \"string\" ||\n typeof tier.discount_percent !== \"number\" ||\n typeof raw.currency !== \"string\" ||\n !isFiniteNumber(raw.total) ||\n !isFiniteNumber(raw.page) ||\n !isFiniteNumber(raw.per_page) ||\n !Array.isArray(raw.items)\n )\n return { ok: false };\n const items: ResellerCatalogItem[] = [];\n for (const entry of raw.items) {\n const item = narrowCatalogItem(entry);\n if (!item) return { ok: false };\n items.push(item);\n }\n return {\n ok: true,\n data: {\n tier: {\n id: tier.id,\n name: tier.name,\n discount_percent: tier.discount_percent,\n },\n catalog: {\n currency: raw.currency,\n total: raw.total,\n page: raw.page,\n per_page: raw.per_page,\n items,\n },\n },\n };\n}\n\nfunction narrowQuoteItem(value: unknown): ResellerQuoteItem | null {\n if (!isRecord(value)) return null;\n if (\n typeof value.product_id !== \"string\" ||\n typeof value.product_title !== \"string\" ||\n typeof value.product_type !== \"string\" ||\n !isNullableString(value.variant_id) ||\n !isNullableString(value.variant_title) ||\n !isValidResellerQuantity(value.quantity as number) ||\n typeof value.base_price !== \"string\" ||\n !isFiniteNumber(value.discount_percent) ||\n typeof value.unit_price !== \"string\" ||\n typeof value.line_total !== \"string\" ||\n !isAppliedOverride(value.applied_override) ||\n typeof value.volume_discount_applied !== \"string\"\n )\n return null;\n return value as unknown as ResellerQuoteItem;\n}\n\n/** `POST /reseller/orders/quote`, written against mapQuote. */\nexport function narrowResellerQuote(\n payload: unknown,\n): NarrowResult<ResellerQuote> {\n if (!isRecord(payload) || !isRecord(payload.quote)) return { ok: false };\n const raw = payload.quote;\n const tier = narrowTier(raw.tier);\n if (\n !tier ||\n typeof tier.name !== \"string\" ||\n typeof tier.discount_percent !== \"number\" ||\n typeof raw.currency !== \"string\" ||\n !Array.isArray(raw.items) ||\n typeof raw.subtotal !== \"string\" ||\n typeof raw.volume_discount_total !== \"string\" ||\n typeof raw.total !== \"string\" ||\n typeof raw.savings !== \"string\"\n )\n return { ok: false };\n const items: ResellerQuoteItem[] = [];\n for (const entry of raw.items) {\n const item = narrowQuoteItem(entry);\n if (!item) return { ok: false };\n items.push(item);\n }\n return {\n ok: true,\n data: {\n currency: raw.currency,\n tier: {\n id: tier.id,\n name: tier.name,\n discount_percent: tier.discount_percent,\n },\n items,\n subtotal: raw.subtotal,\n volume_discount_total: raw.volume_discount_total,\n total: raw.total,\n savings: raw.savings,\n },\n };\n}\n\nfunction narrowOrderListItem(value: unknown): ResellerOrderListItem | null {\n if (!isRecord(value)) return null;\n if (\n typeof value.uniqid !== \"string\" ||\n typeof value.status !== \"string\" ||\n typeof value.currency !== \"string\" ||\n typeof value.total !== \"string\" ||\n !isFiniteNumber(value.item_count) ||\n typeof value.created_at !== \"string\"\n )\n return null;\n return value as unknown as ResellerOrderListItem;\n}\n\n/** `GET /reseller/orders`, written against mapOrderList. */\nexport function narrowResellerOrders(\n payload: unknown,\n): NarrowResult<ResellerOrderList> {\n if (!isRecord(payload) || !isRecord(payload.orders)) return { ok: false };\n const raw = payload.orders;\n if (\n !isFiniteNumber(raw.total) ||\n !isFiniteNumber(raw.page) ||\n !isFiniteNumber(raw.per_page) ||\n !Array.isArray(raw.items)\n )\n return { ok: false };\n const items: ResellerOrderListItem[] = [];\n for (const entry of raw.items) {\n const item = narrowOrderListItem(entry);\n if (!item) return { ok: false };\n items.push(item);\n }\n return {\n ok: true,\n data: { total: raw.total, page: raw.page, per_page: raw.per_page, items },\n };\n}\n\nfunction narrowOrderLine(value: unknown): ResellerOrderLine | null {\n if (\n !isRecord(value) ||\n !Array.isArray(value.serials) ||\n !value.serials.every((serial) => typeof serial === \"string\")\n ) {\n return null;\n }\n if (\n !isNullableString(value.product_id) ||\n typeof value.product_title !== \"string\" ||\n !isNullableString(value.variant_id) ||\n !isNullableString(value.variant_title) ||\n !isValidResellerQuantity(value.quantity as number) ||\n typeof value.unit_price !== \"string\" ||\n typeof value.total !== \"string\" ||\n typeof value.delivered !== \"boolean\" ||\n !isNullableString(value.delivered_at)\n )\n return null;\n return value as unknown as ResellerOrderLine;\n}\n\n/** `GET /reseller/orders/:uniqid`, written against mapOrderDetail. */\nexport function narrowResellerOrderDetail(\n payload: unknown,\n): NarrowResult<ResellerOrderDetail> {\n if (!isRecord(payload) || !isRecord(payload.order)) return { ok: false };\n const raw = payload.order;\n if (\n typeof raw.uniqid !== \"string\" ||\n typeof raw.status !== \"string\" ||\n typeof raw.currency !== \"string\" ||\n typeof raw.total !== \"string\" ||\n !isFiniteNumber(raw.item_count) ||\n typeof raw.created_at !== \"string\" ||\n typeof raw.tier_name !== \"string\" ||\n !isFiniteNumber(raw.tier_discount_percent) ||\n typeof raw.partially_delivered !== \"boolean\" ||\n !isNullableString(raw.refunded_amount) ||\n !Array.isArray(raw.lines)\n )\n return { ok: false };\n const lines: ResellerOrderLine[] = [];\n for (const entry of raw.lines) {\n const line = narrowOrderLine(entry);\n if (!line) return { ok: false };\n lines.push(line);\n }\n return {\n ok: true,\n data: {\n uniqid: raw.uniqid,\n status: raw.status,\n currency: raw.currency,\n total: raw.total,\n item_count: raw.item_count,\n created_at: raw.created_at,\n tier_name: raw.tier_name,\n tier_discount_percent: raw.tier_discount_percent,\n partially_delivered: raw.partially_delivered,\n refunded_amount: raw.refunded_amount,\n lines,\n },\n };\n}\n\n/** `GET /reseller/wallet`, narrowed against its route-local wallet mapper. */\nexport function narrowResellerWallet(\n payload: unknown,\n): NarrowResult<ResellerWallet> {\n if (!isRecord(payload) || !isRecord(payload.wallet)) return { ok: false };\n const raw = payload.wallet;\n if (\n typeof raw.currency !== \"string\" ||\n typeof raw.balance !== \"string\" ||\n typeof raw.hold_balance !== \"string\" ||\n typeof raw.available !== \"string\" ||\n typeof raw.is_active !== \"boolean\"\n )\n return { ok: false };\n return { ok: true, data: raw as unknown as ResellerWallet };\n}\n\nfunction narrowApiKey(value: unknown): ResellerApiKey | null {\n if (!isRecord(value)) return null;\n if (\n typeof value.id !== \"string\" ||\n typeof value.name !== \"string\" ||\n typeof value.key_last4 !== \"string\" ||\n !isNullableString(value.last_used_at) ||\n !isNullableString(value.revoked_at) ||\n typeof value.created_at !== \"string\"\n )\n return null;\n return value as unknown as ResellerApiKey;\n}\n\n/** `GET /reseller/api-keys`, written against mapApiKey. */\nexport function narrowResellerApiKeys(\n payload: unknown,\n): NarrowResult<ResellerApiKey[]> {\n if (!isRecord(payload) || !Array.isArray(payload.api_keys))\n return { ok: false };\n const keys: ResellerApiKey[] = [];\n for (const entry of payload.api_keys) {\n const key = narrowApiKey(entry);\n if (!key) return { ok: false };\n keys.push(key);\n }\n return { ok: true, data: keys };\n}\n\n/** Stable identity of one basket version. Order is normalized for comparison. */\nexport function resellerBasketKey(\n items: readonly ResellerOrderItemInput[],\n): string {\n for (const item of items) {\n if (!isValidResellerQuantity(item.quantity)) {\n throw new RangeError(\n `Wholesale quantity must be a whole number from ${RESELLER_QUANTITY_MIN_UNITS} to ${RESELLER_QUANTITY_MAX_UNITS} units; received ${String(item.quantity)}.`,\n );\n }\n }\n\n return JSON.stringify(\n [...items]\n .map((item) => ({\n product_id: item.product_id,\n variant_id: item.variant_id ?? null,\n quantity: item.quantity,\n }))\n .sort((left, right) => {\n const product = left.product_id.localeCompare(right.product_id);\n return (\n product ||\n (left.variant_id ?? \"\").localeCompare(right.variant_id ?? \"\")\n );\n }),\n );\n}\n\n/**\n * The one way into the program this buyer actually has.\n *\n * Normally the shop's enrolment mode decides. An invitation overrides it:\n * `ResellerEnrollmentService.invite` requires an enabled program, not a MANUAL\n * one, so a shop taking open sign-ups can still have invited someone. Offering\n * that buyer the join button offers the one call the producer answers 409 to\n * (\"already part of the reseller program\"), while the token in their mail has\n * nowhere to go.\n */\nexport function resellerEntryMode(\n program: ResellerProgramState,\n): ResellerEnrollmentMode {\n return program.reseller?.status === \"INVITED\"\n ? \"MANUAL\"\n : program.enrollment_mode;\n}\n\n/** A quote is displayed only for the basket it priced. */\nexport function quoteMatchesBasket(\n quotedBasketKey: string | null,\n items: readonly ResellerOrderItemInput[],\n): boolean {\n return (\n quotedBasketKey !== null && quotedBasketKey === resellerBasketKey(items)\n );\n}\n","/**\n * The pieces every account panel needs.\n *\n * Every class here is an `sxa:` utility compiled into `account.css`, and every\n * value those utilities read is one of the host theme's `--sx-*` custom\n * properties: cards are `rounded-input border bg-surface shadow-card`, inner\n * tiles `bg-bg`, secondary text `text-muted`. The account has no palette of its\n * own. The `sx-account-*` classes carry no styles; they are the hooks a theme\n * restyles through.\n *\n * Loading, empty and failed all render something a buyer can act on, and none\n * of them invents a value the producer did not send.\n */\n\nimport { useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\nimport { toPanelState, type AccountPanelState } from './customer-account';\nimport type { SdkResponse } from '../sdk';\nimport { getActiveLocale, t, tOptional } from './i18n';\nimport {\n ArrowLeftIcon,\n CheckIcon,\n CircleAlertIcon,\n CopyIcon,\n LoaderIcon,\n} from './icons';\n\n/**\n * Loads one panel's data and keeps the three states apart.\n *\n * `key` is what the load depends on: the page number for the order list, the\n * order id for a detail view. A response that arrives after the key changed is\n * dropped, so a slow request cannot overwrite the panel the buyer is now on.\n */\nexport function useAccountResource<T>(\n key: string,\n load: () => Promise<SdkResponse<T>>,\n options: {\n /**\n * Keep ready data when a same-key re-read fails, carrying the error as\n * `staleMessage` — ONLY for consumers that render that field (the points\n * section, and the shell read it revalidates). Everything else keeps the\n * plain contract: a failed re-read is an error state with a retry, shown\n * where ready data was.\n */\n keepStale?: boolean;\n } = {},\n): { state: AccountPanelState<T>; reload: () => void } {\n const [state, setState] = useState<AccountPanelState<T>>({ status: 'loading' });\n const [attempt, setAttempt] = useState(0);\n const loadRef = useRef(load);\n loadRef.current = load;\n const keepStaleRef = useRef(options.keepStale === true);\n keepStaleRef.current = options.keepStale === true;\n\n /*\n * Back to loading DURING the render that changed the key, not in the effect\n * afterwards.\n *\n * An effect runs after the render commits, so for one render this hook still\n * handed out the PREVIOUS key's finished data. A panel mounted on it, started\n * its own nested reads, was torn down when the effect finally set loading,\n * and started every one of those reads again when the new data arrived — five\n * duplicated requests on the wholesale panel. React's documented way to reset\n * state when an input changes is to do it while rendering, which is what this\n * is; the extra render it schedules happens before anything is shown.\n *\n * A bumped ATTEMPT on the same key is a different thing and is not reset: it\n * re-reads the subject already on screen. Blanking finished data for the\n * length of that read empties the panel one frame after the buyer acted on\n * it — the points section taking its own \"credited\" notice down with it — so\n * ready data stays until the new answer replaces it. Only a key change, or a\n * re-read of something that never finished, goes back to loading.\n */\n const token = `${key}::${attempt}`;\n const [rendered, setRendered] = useState({ token, key });\n if (token !== rendered.token) {\n setRendered({ token, key });\n if (key !== rendered.key || state.status !== 'ready') setState({ status: 'loading' });\n }\n\n useEffect(() => {\n let active = true;\n\n loadRef.current()\n .then((response) => {\n if (!active) return;\n // A failed RE-read keeps what the buyer is looking at — ready data\n // only exists here for a same-key revalidation (a key change went back\n // to loading above), and replacing it with an error tears down the\n // panel that just acted. But it does not stay silent: the retained\n // figures are marked stale, so the panel can say they may be out of\n // date. The first read of a key still surfaces its error normally.\n setState((previous) => {\n const next = toPanelState(response);\n if (next.status === 'error' && previous.status === 'ready') {\n return keepStaleRef.current ? { ...previous, staleMessage: next.message } : next;\n }\n return next;\n });\n })\n .catch((error: unknown) => {\n if (!active) return;\n const message = error instanceof Error ? error.message : String(error);\n setState((previous) => (previous.status === 'ready' && keepStaleRef.current\n ? { ...previous, staleMessage: message }\n : { status: 'error', message }));\n });\n\n return () => {\n active = false;\n };\n }, [token]);\n\n return { state, reload: useCallback(() => setAttempt((value) => value + 1), []) };\n}\n\n/**\n * An invoice amount, in the currency the buyer sees.\n *\n * `currency` is the BUYER display currency and `total` is the USD-normalized\n * aggregate, so the two are not a pair. `totalDisplay` is the same total in\n * that currency and is what to render; the producer documents\n * `total_display ?? total` as the rule, and this is the only place the template\n * applies it.\n */\nexport function formatInvoiceAmount(\n displayAmount: string | null,\n normalizedAmount: string,\n currency: string,\n): string {\n return formatAccountAmount(displayAmount ?? normalizedAmount, currency);\n}\n\nexport function formatAccountAmount(amount: string, currency: string): string {\n const value = Number(amount);\n if (!Number.isFinite(value)) return amount;\n try {\n return new Intl.NumberFormat(getActiveLocale(), {\n style: 'currency',\n currency: currency || 'USD',\n }).format(value);\n } catch {\n // An unknown currency code is the shop's, not ours to correct.\n return `${amount} ${currency}`.trim();\n }\n}\n\nexport function formatAccountDate(value: string | Date): string {\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return typeof value === 'string' ? value : '';\n return new Intl.DateTimeFormat(getActiveLocale(), {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }).format(date);\n}\n\nexport function formatAccountDateTime(value: string | Date): string {\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return typeof value === 'string' ? value : '';\n return new Intl.DateTimeFormat(getActiveLocale(), {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date);\n}\n\n/**\n * A producer status as a word.\n *\n * `tOptional` first: a status the catalog names is shown in the buyer's\n * language, and one it does not is shown as the producer spelled it rather than\n * as a guess. New statuses appear upstream before they appear here.\n *\n * The catalog is keyed by the producer's own spelling — `status.COMPLETED`,\n * uppercase — so the lookup normalizes UP. Lowercasing it missed every key in\n * every one of the 16 locales and quietly served `humanizeStatus`, i.e. English\n * word-splitting, to buyers reading the shop in another language.\n */\nexport function statusLabel(status: string): string {\n return tOptional(`status.${status.trim().toUpperCase()}`) ?? humanizeStatus(status);\n}\n\nfunction humanizeStatus(status: string): string {\n return status\n .toLowerCase()\n .split('_')\n .map((word) => (word ? word[0]!.toUpperCase() + word.slice(1) : word))\n .join(' ');\n}\n\n/**\n * The tone table. Anything unlisted is neutral rather than green.\n *\n * The chip tones are the catalog's stock-level tones. They read as\n * stock levels because the catalog's chips are where they were introduced;\n * there is no separate success/warning/danger trio to reach for, and inventing\n * one would leave the storefront with two chip systems.\n */\nconst TONE_GOOD = 'sxa:meta-chip--in_stock';\nconst TONE_WAITING = 'sxa:meta-chip--low_stock';\nconst TONE_BAD = 'sxa:meta-chip--sold_out';\n\nconst STATUS_TONES: Record<string, string> = {\n // Done, and nothing is owed either way.\n COMPLETED: TONE_GOOD,\n PAID: TONE_GOOD,\n ACTIVE: TONE_GOOD,\n APPROVED: TONE_GOOD,\n RESOLVED: TONE_GOOD,\n CONVERTED: TONE_GOOD,\n // In flight. The buyer is waiting on someone, or someone is waiting on them.\n PENDING: TONE_WAITING,\n PENDING_PAYMENT: TONE_WAITING,\n PROCESSING: TONE_WAITING,\n AWAITING_STOCK: TONE_WAITING,\n AWAITING_REPLY: TONE_WAITING,\n UNDERPAID: TONE_WAITING,\n TRIALING: TONE_WAITING,\n PAUSED: TONE_WAITING,\n INCOMPLETE: TONE_WAITING,\n REQUESTED: TONE_WAITING,\n // Something the buyer would want to notice.\n PAST_DUE: TONE_BAD,\n UNPAID: TONE_BAD,\n DISPUTED: TONE_BAD,\n EXPIRED: TONE_BAD,\n VOIDED: TONE_BAD,\n REVOKED: TONE_BAD,\n REJECTED: TONE_BAD,\n SUSPENDED: TONE_BAD,\n FAILED: TONE_BAD,\n CANCELED: TONE_BAD,\n CANCELLED: TONE_BAD,\n};\n\n/*\n * Deliberately untoned, and neutral is the honest answer for each:\n * REFUNDED / PARTIAL_REFUND (settled, and the buyer has their money),\n * INACTIVE, OPEN / CLOSED (a support thread's two normal ends).\n *\n * `delivery.*` statuses — DELIVERED, AWAITING_FULFILLMENT — are a DIFFERENT\n * namespace and belong to the per-line delivery chip, not here. They sat in\n * this table until the guard test caught them: the lookup could never hit, so\n * the tone never applied.\n */\n\nexport function StatusChip({ status }: { status: string }) {\n const tone = STATUS_TONES[status.trim().toUpperCase()] ?? 'sxa:meta-chip--neutral';\n return (\n <span className={`sx-account-status sx-account-chip sxa:meta-chip sxa:meta-chip--status ${tone} sxa:shrink-0`}>{statusLabel(status)}</span>\n );\n}\n\n/** The card surface every panel section sits on. */\nexport function AccountCard({\n children,\n className = '',\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return (\n <div className={`sx-account-card sxa:rounded-input sxa:border sxa:bg-surface sxa:shadow-card ${className}`}>{children}</div>\n );\n}\n\nexport function AccountSectionTitle({ children }: { children: ReactNode }) {\n return <h2 className=\"sx-account-section-title sxa:font-heading sxa:text-body sxa:font-semibold\">{children}</h2>;\n}\n\nexport function AccountRowsSkeleton({ rows = 3, label }: { rows?: number; label: string }) {\n return (\n <div role=\"status\" aria-label={label} className=\"sx-account-skeleton sxa:space-y-3\">\n {Array.from({ length: rows }, (_, index) => (\n <div key={index} className=\"sxa:h-16 sxa:animate-pulse sxa:rounded-input sxa:border sxa:bg-bg\" />\n ))}\n </div>\n );\n}\n\n/**\n * A failure, in the producer's own words where it gave any.\n *\n * The retry is the point: a buyer who cannot see their orders wants to try\n * again, not read an apology.\n */\nexport function AccountError({\n message,\n onRetry,\n}: {\n message: string;\n onRetry?: () => void;\n}) {\n return (\n <AccountCard className=\"sx-account-error sxa:px-6 sxa:py-10 sxa:text-center\">\n <div className=\"sxa:mx-auto sxa:mb-4 sxa:flex sxa:h-12 sxa:w-12 sxa:items-center sxa:justify-center sxa:rounded-input sxa:border sxa:bg-bg\">\n <CircleAlertIcon className=\"sxa:h-5 sxa:w-5 sxa:text-muted\" />\n </div>\n <p role=\"alert\" className=\"sxa:text-small sxa:text-muted\">{message}</p>\n {onRetry ? (\n <button type=\"button\" onClick={onRetry} className=\"sx-account-cta sxa:cta-button sxa:mt-5 sxa:h-9 sxa:px-4 sxa:text-small\">\n {t('common.retry')}\n </button>\n ) : null}\n </AccountCard>\n );\n}\n\nexport function AccountNotice({ message }: { message: string }) {\n return (\n <p role=\"status\" className=\"sx-account-notice sxa:mt-3 sxa:inline-flex sxa:items-center sxa:gap-1.5 sxa:text-small sxa:text-success\">\n <CheckIcon className=\"sxa:h-4 sxa:w-4 sxa:shrink-0\" />\n {message}\n </p>\n );\n}\n\nexport function AccountFieldError({ message }: { message: string }) {\n return <p role=\"alert\" className=\"sx-account-field-error sxa:mt-3 sxa:text-small sxa:text-error\">{message}</p>;\n}\n\nexport function AccountEmpty({\n title,\n body,\n action,\n}: {\n title: string;\n body: string;\n action?: ReactNode;\n}) {\n return (\n <AccountCard className=\"sx-account-empty sxa:px-8 sxa:py-16 sxa:text-center\">\n <p className=\"sxa:font-heading sxa:font-semibold\">{title}</p>\n <p className=\"sxa:mx-auto sxa:mt-2 sxa:max-w-md sxa:text-small sxa:text-muted\">{body}</p>\n {action ? <div className=\"sxa:mt-5\">{action}</div> : null}\n </AccountCard>\n );\n}\n\nexport function AccountBackLink({ to, label }: { to: string; label: string }) {\n return (\n <Link to={to} className=\"sx-account-back sxa:inline-flex sxa:items-center sxa:gap-1.5 sxa:text-small sxa:transition-opacity sxa:hover:opacity-80\">\n <ArrowLeftIcon className=\"sxa:h-4 sxa:w-4 sxa:shrink-0\" />\n {label}\n </Link>\n );\n}\n\nexport function AccountBackButton({ onClick, label }: { onClick: () => void; label: string }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"sx-account-back sxa:inline-flex sxa:items-center sxa:gap-1.5 sxa:text-small sxa:transition-opacity sxa:hover:opacity-80\"\n >\n <ArrowLeftIcon className=\"sxa:h-4 sxa:w-4 sxa:shrink-0\" />\n {label}\n </button>\n );\n}\n\n/**\n * Copies what the row actually shows.\n *\n * The confirmation is time-boxed rather than sticky: a \"Copied\" that never\n * clears is a claim about the clipboard the page cannot keep checking.\n */\nexport function CopyButton({ value, className = '' }: { value: string; className?: string }) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => () => {\n if (timer.current) clearTimeout(timer.current);\n }, []);\n\n return (\n <button\n type=\"button\"\n className={`sx-account-copy sx-account-button sxa:card-button sxa:card-button--add ${className}`}\n onClick={() => {\n void navigator.clipboard?.writeText(value).then(() => {\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 1500);\n });\n }}\n >\n {copied ? <CheckIcon className=\"sxa:h-3.5 sxa:w-3.5\" /> : <CopyIcon className=\"sxa:h-3.5 sxa:w-3.5\" />}\n <span className=\"sxa:ml-1.5\">{copied ? t('common.copied') : t('common.copy')}</span>\n </button>\n );\n}\n\n/** The spinner a control shows while its own request is in flight. */\nexport function BusySpinner({ className = '' }: { className?: string }) {\n return <LoaderIcon className={`sxa:h-4 sxa:w-4 sxa:shrink-0 sxa:animate-spin ${className}`} />;\n}\n","/**\n * The icons the account draws, inlined.\n *\n * Storefront artifacts are served behind a strict CSP and build with no\n * network, so there is no icon CDN. Every icon is a plain SVG that takes its\n * size and colour from the classes around it (`currentColor`).\n *\n * Outline marks are the 24x24 / stroke-2 Lucide geometry (ISC).\n */\n\nimport type { SVGProps } from 'react';\n\ntype IconProps = SVGProps<SVGSVGElement>;\n\nfunction OutlineIcon({ children, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n {children}\n </svg>\n );\n}\n\nexport function ArrowLeftIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"m12 19-7-7 7-7\" />\n <path d=\"M19 12H5\" />\n </OutlineIcon>\n );\n}\n\nexport function ArrowRightIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </OutlineIcon>\n );\n}\n\n/** Placeholder art for a bundle with no image of its own. */\nexport function BoxIcon(props: IconProps) {\n return (\n <OutlineIcon strokeWidth=\"1.25\" {...props}>\n <path d=\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\" />\n <path d=\"M3.3 7 12 12l8.7-5\" />\n <path d=\"M12 22V12\" />\n </OutlineIcon>\n );\n}\n\n/** The tick inside a selected variant pill or a ticked addon box. */\nexport function CheckIcon(props: IconProps) {\n return (\n <OutlineIcon strokeWidth=\"3\" {...props}>\n <path d=\"m5 12 5 5L20 7\" />\n </OutlineIcon>\n );\n}\n\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"m6 9 6 6 6-6\" />\n </OutlineIcon>\n );\n}\n\nexport function CircleAlertIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\" />\n </OutlineIcon>\n );\n}\n\n/** Lucide `copy`. The account surface copies licence keys and referral links. */\nexport function CopyIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </OutlineIcon>\n );\n}\n\n/** Leaves the storefront — every community and portal link carries it. */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </OutlineIcon>\n );\n}\n\n/** The reward-program teaser's mark. */\nexport function GiftIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <rect x=\"3\" y=\"8\" width=\"18\" height=\"4\" rx=\"1\" />\n <path d=\"M12 8v13\" />\n <path d=\"M19 12v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-7\" />\n <path d=\"M7.5 8a2.5 2.5 0 0 1 0-5A4.8 8 0 0 1 12 8a4.8 8 0 0 1 4.5-5 2.5 2.5 0 0 1 0 5\" />\n </OutlineIcon>\n );\n}\n\n/** The spinner on a submitting form. It is the only mark the theme rotates. */\nexport function LoaderIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </OutlineIcon>\n );\n}\n\nexport function LockIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </OutlineIcon>\n );\n}\n\nexport function MailIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\" />\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n </OutlineIcon>\n );\n}\n\n/** The reviews badge, the contact form's header and its message field. */\nexport function MessageSquareIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z\" />\n </OutlineIcon>\n );\n}\n\n/** Placeholder art for a product with no image. */\nexport function ProductPlaceholderIcon(props: IconProps) {\n return (\n <OutlineIcon strokeWidth=\"1.25\" {...props}>\n <path d=\"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\" />\n <path d=\"M12 22V12\" />\n <polyline points=\"3.29 7 12 12 20.71 7\" />\n <path d=\"m7.5 4.27 9 5.15\" />\n </OutlineIcon>\n );\n}\n\n/** Marks the order/invoice field the merchant can make mandatory. */\nexport function ReceiptIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"M12 17V7\" />\n <path d=\"M16 8h-6a2 2 0 0 0 0 4h4a2 2 0 0 1 0 4H8\" />\n <path d=\"M4 3a1 1 0 0 1 1-1 1.3 1.3 0 0 1 .7.2l.933.6a1.3 1.3 0 0 0 1.4 0l.934-.6a1.3 1.3 0 0 1 1.4 0l.933.6a1.3 1.3 0 0 0 1.4 0l.933-.6a1.3 1.3 0 0 1 1.4 0l.934.6a1.3 1.3 0 0 0 1.4 0l.933-.6a1.3 1.3 0 0 1 1.4 0l.934.6a1.3 1.3 0 0 0 1.4 0l.933-.6A1.3 1.3 0 0 1 19 2a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1 1.3 1.3 0 0 1-.7-.2l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.934.6a1.3 1.3 0 0 1-1.4 0l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-1.4 0l-.934-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-.7.2 1 1 0 0 1-1-1z\" />\n </OutlineIcon>\n );\n}\n\nexport function SearchIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"m21 21-4.34-4.34\" />\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n </OutlineIcon>\n );\n}\n\n/** Shared by the trust strip and the why-choose-us feature panels. */\nexport function ShieldIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </OutlineIcon>\n );\n}\n\nexport function TagIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\" />\n <circle cx=\"7.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n </OutlineIcon>\n );\n}\n\n/** Shared by the trust strip and the buy box's delivery badge. */\nexport function ZapIcon(props: IconProps) {\n return (\n <OutlineIcon {...props}>\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </OutlineIcon>\n );\n}\n","/**\n * Everything the shop has already handed over: license keys, files, codes and\n * access links.\n *\n * There is no `GET /deliverables` and no `GET /licenses`. Both lists arrive\n * inside `dashboard()`, which is why this panel loads the same payload the\n * overview does. They are two halves of one answer: the deliverable carries the\n * key itself, the license row carries its expiry, its hardware lock and whether\n * it can be renewed at all. `account/account-downloads.ts` performs the join\n * and refuses to render a half of it that contradicts the other.\n *\n * Renewal is a purchase, so it is a link into the store rather than a call.\n * `POST /licenses/:id/renew` raises an invoice, and ADR-0064 keeps that off the\n * account API for good: a renewal invoice created by markup the buyer never\n * clicked has no cause they could point at.\n */\n\nimport { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { accountOrderHref } from '../account-route';\nimport {\n buildDownloadGroups,\n isEmptyDownloadGroups,\n licenseExpiryDate,\n offersRenewal,\n type DownloadContractError,\n type FileDownload,\n type LicenseDownload,\n} from './account-downloads';\nimport { callCustomerApi, safeExternalHref } from './customer-account';\nimport type { SdkCustomerDeliverable } from '../sdk';\nimport { t } from './i18n';\nimport { ArrowRightIcon, BoxIcon, ExternalLinkIcon, LockIcon, TagIcon } from './icons';\nimport { useAccountDashboard } from './dashboard';\nimport {\n AccountCard,\n AccountEmpty,\n AccountError,\n AccountNotice,\n AccountRowsSkeleton,\n AccountSectionTitle,\n BusySpinner,\n CopyButton,\n StatusChip,\n formatAccountDate,\n} from './shared';\n\nexport function AccountDownloads() {\n const { state, reload } = useAccountDashboard();\n const [notice, setNotice] = useState<string | null>(null);\n const [actionError, setActionError] = useState<string | null>(null);\n const [resettingUniqid, setResettingUniqid] = useState<string | null>(null);\n\n if (state.status === 'loading') {\n return <AccountRowsSkeleton rows={4} label={t('downloads.loading')} />;\n }\n\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n const grouped = buildDownloadGroups(state.data.deliverables, state.data.licenses);\n\n // The producer contradicting itself is not an empty account. A key with no\n // license behind it, or a file with nothing to fetch, is said out loud rather\n // than rendered as a row that names something the page cannot hand over.\n if (!grouped.ok) {\n return (\n <div className=\"sxa:space-y-4\">\n <AccountSectionTitle>{t('downloads.brokenTitle')}</AccountSectionTitle>\n <AccountError message={contractErrorMessage(grouped.error)} onRetry={reload} />\n </div>\n );\n }\n\n const { groups } = grouped;\n\n if (isEmptyDownloadGroups(groups)) {\n return (\n <AccountEmpty\n title={t('downloads.emptyTitle')}\n body={t('downloads.emptyBody')}\n action={(\n <Link to=\"/all-products\" className=\"sx-account-button sxa:card-button sxa:card-button--add\">\n {t('common.browseStore')}\n </Link>\n )}\n />\n );\n }\n\n const resetHardwareId = async (uniqid: string) => {\n setResettingUniqid(uniqid);\n setNotice(null);\n setActionError(null);\n const result = await callCustomerApi((sdk) => sdk.resetLicenseHwid(uniqid));\n setResettingUniqid(null);\n\n if (!result.success) {\n setActionError(result.message?.trim() || t('downloads.hwidResetFailed'));\n return;\n }\n\n setNotice(t('downloads.hwidResetDone'));\n // The lock lives on the license row, so the payload is read again. Clearing\n // it locally would show a buyer a released license the server never agreed\n // to release.\n reload();\n };\n\n return (\n <div className=\"sxa:space-y-8\">\n {notice ? <AccountNotice message={notice} /> : null}\n {actionError ? <AccountError message={actionError} /> : null}\n\n {groups.licenses.length ? (\n <section>\n <AccountSectionTitle>{t('downloads.licensesTitle')}</AccountSectionTitle>\n <ul className=\"sxa:mt-4 sxa:space-y-3\">\n {groups.licenses.map((entry) => (\n <li key={entry.deliverable.id}>\n <LicenseRow\n entry={entry}\n resetting={resettingUniqid === entry.license.uniqid}\n disabled={resettingUniqid !== null}\n onResetHardwareId={() => void resetHardwareId(entry.license.uniqid)}\n />\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n\n {groups.files.length ? (\n <section>\n <AccountSectionTitle>{t('downloads.filesTitle')}</AccountSectionTitle>\n <ul className=\"sxa:mt-4 sxa:space-y-3\">\n {groups.files.map((file) => (\n <li key={file.id}>\n <FileRow file={file} />\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n\n {groups.codes.length ? (\n <section>\n <AccountSectionTitle>{t('downloads.codesTitle')}</AccountSectionTitle>\n <ul className=\"sxa:mt-4 sxa:space-y-3\">\n {groups.codes.map((code) => (\n <li key={code.id}>\n <CodeRow code={code} />\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n </div>\n );\n}\n\nfunction contractErrorMessage(error: DownloadContractError): string {\n return error.reason === 'license-missing'\n ? t('downloads.brokenBody', { id: error.id })\n : t('downloads.brokenFileBody', { id: error.id });\n}\n\n/** A delivered value the buyer has to be able to read and copy exactly. */\nfunction DeliverableValue({ value }: { value: string }) {\n return (\n <p className=\"sxa:rounded-input sxa:border sxa:bg-bg sxa:px-3 sxa:py-2 sxa:font-mono sxa:text-micro sxa:break-all\">{value}</p>\n );\n}\n\nfunction ViewOrderLink({ orderId }: { orderId: string }) {\n return (\n <Link\n to={accountOrderHref(orderId)}\n className=\"sxa:inline-flex sxa:items-center sxa:gap-1.5 sxa:text-small sxa:transition-opacity sxa:hover:opacity-80\"\n >\n {t('downloads.viewOrder')}\n <ArrowRightIcon className=\"sxa:h-4 sxa:w-4 sxa:shrink-0\" />\n </Link>\n );\n}\n\nfunction LicenseRow({\n entry,\n resetting,\n disabled,\n onResetHardwareId,\n}: {\n entry: LicenseDownload;\n resetting: boolean;\n disabled: boolean;\n onResetHardwareId: () => void;\n}) {\n const { deliverable, license } = entry;\n const expiry = licenseExpiryDate(license);\n\n return (\n <AccountCard className=\"sxa:px-5 sxa:py-4\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-3\">\n <div className=\"sxa:flex sxa:min-w-0 sxa:items-start sxa:gap-3\">\n <LockIcon className=\"sxa:mt-0.5 sxa:h-4 sxa:w-4 sxa:shrink-0 sxa:text-muted\" />\n <div className=\"sxa:min-w-0\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{deliverable.product_title}</p>\n {/* A null expiry means the license never ends — a different fact\n from an expiry nobody could read, and stated as its own sentence. */}\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {expiry\n ? t('downloads.expires', { date: formatAccountDate(expiry) })\n : t('downloads.neverExpires')}\n </p>\n </div>\n </div>\n <StatusChip status={license.status} />\n </div>\n\n <div className=\"sxa:mt-3 sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2\">\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <DeliverableValue value={deliverable.value} />\n </div>\n <CopyButton value={deliverable.value} />\n </div>\n\n {license.hardware_id ? (\n <div className=\"sxa:mt-3 sxa:flex sxa:flex-wrap sxa:items-center sxa:justify-between sxa:gap-2\">\n <p className=\"sxa:min-w-0 sxa:text-micro sxa:break-all sxa:text-muted\">\n {t('downloads.lockedTo', { hardwareId: license.hardware_id })}\n </p>\n <button\n type=\"button\"\n onClick={onResetHardwareId}\n disabled={disabled}\n aria-busy={resetting || undefined}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {resetting ? <BusySpinner className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" /> : null}\n {resetting ? t('downloads.resettingHwid') : t('downloads.resetHwid')}\n </button>\n </div>\n ) : null}\n\n {/* `renewable` is the server's call — only the backend can see whether the\n product still exists and still sells — and it is paired with an expiry,\n so a perpetual license is never offered an end date it never had. */}\n {offersRenewal(license) ? (\n <div className=\"sxa:mt-4 sxa:border-t sxa:pt-4\">\n <p className=\"sxa:text-micro sxa:font-semibold sxa:tracking-[0.12em] sxa:text-muted sxa:uppercase\">\n {t('downloads.renewTitle')}\n </p>\n <p className=\"sxa:mt-1.5 sxa:text-small sxa:leading-relaxed sxa:text-muted\">\n {t('downloads.renewBody')}\n </p>\n <Link to=\"/all-products\" className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:mt-3\">\n {t('downloads.renewAction')}\n </Link>\n </div>\n ) : null}\n\n <div className=\"sxa:mt-3\">\n <ViewOrderLink orderId={license.invoice_id} />\n </div>\n </AccountCard>\n );\n}\n\nfunction FileRow({ file }: { file: FileDownload }) {\n /*\n * A plain link, not a fetch. The path is same-origin under `/api/customer/`,\n * so the browser sends the session cookie the Shoppex worker owns — there is\n * no token to attach here, and nothing in this bundle could attach one.\n *\n * It is still checked: a path is merchant-adjacent data, and an anchor whose\n * href turns out to be a script URL runs on the buyer's own origin with their\n * session. A value that does not survive the check gets no anchor at all,\n * because a dead link dressed as a button is worse than a plain refusal.\n */\n const href = safeExternalHref(file.href);\n\n return (\n <AccountCard className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-4 sxa:px-5 sxa:py-4\">\n <BoxIcon className=\"sxa:h-4 sxa:w-4 sxa:shrink-0 sxa:text-muted\" />\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{file.label}</p>\n <p className=\"sxa:mt-1 sxa:truncate sxa:text-micro sxa:text-muted\">{file.product_title}</p>\n </div>\n {href === null ? (\n <span className=\"sx-account-chip sxa:meta-chip sxa:meta-chip--neutral\">{t('common.unavailable')}</span>\n ) : (\n <a href={href} download className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:shrink-0\">\n {t('downloads.download')}\n </a>\n )}\n </AccountCard>\n );\n}\n\nfunction CodeRow({ code }: { code: SdkCustomerDeliverable }) {\n // A code delivery may carry an access link the merchant typed themselves.\n // Checked before it becomes an anchor, for the same reason as a file path.\n const href = safeExternalHref(code.href);\n\n return (\n <AccountCard className=\"sxa:px-5 sxa:py-4\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-3\">\n <div className=\"sxa:flex sxa:min-w-0 sxa:items-start sxa:gap-3\">\n <TagIcon className=\"sxa:mt-0.5 sxa:h-4 sxa:w-4 sxa:shrink-0 sxa:text-muted\" />\n <div className=\"sxa:min-w-0\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{code.label}</p>\n <p className=\"sxa:mt-1 sxa:truncate sxa:text-micro sxa:text-muted\">{code.product_title}</p>\n </div>\n </div>\n {href === null ? (\n <CopyButton value={code.value} className=\"sxa:shrink-0\" />\n ) : (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:shrink-0\"\n >\n <ExternalLinkIcon className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" />\n {t('downloads.openLink')}\n </a>\n )}\n </div>\n\n {/* The value is what the buyer keeps when there is no link to follow. */}\n {href === null ? (\n <div className=\"sxa:mt-3\">\n <DeliverableValue value={code.value} />\n </div>\n ) : null}\n\n <div className=\"sxa:mt-3\">\n <ViewOrderLink orderId={code.invoice_uniqid} />\n </div>\n </AccountCard>\n );\n}\n","import type { SdkCustomerDeliverable, SdkCustomerLicense } from '../sdk';\n\n/**\n * The downloads panel's pure half.\n *\n * The panel renders two lists that arrive as one: `deliverables` is what the\n * shop handed over (keys, files, codes), `licenses` is the standing of each\n * license behind those keys. They are joined on the `license:<uniqid>` id the\n * producer builds in `buildCustomerPortalDeliverables`, and that join is the\n * only place the two payloads meet.\n */\n\nexport const LICENSE_DELIVERABLE_PREFIX = 'license:';\n\nexport interface LicenseDownload {\n deliverable: SdkCustomerDeliverable;\n license: SdkCustomerLicense;\n}\n\n/** A file deliverable, narrowed: a file with nothing to fetch never gets here. */\nexport interface FileDownload extends SdkCustomerDeliverable {\n href: string;\n}\n\nexport interface DownloadGroups {\n /** License keys, each paired with the license row that describes it. */\n licenses: LicenseDownload[];\n /** Files, each with a same-origin download path. */\n files: FileDownload[];\n /** Codes and access links delivered with an order. */\n codes: SdkCustomerDeliverable[];\n}\n\n/**\n * Why a payload could not be listed.\n *\n * Both cases are the producer contradicting itself, not a buyer with nothing\n * to download: a license key whose license is missing, and a file with nothing\n * to fetch. Neither is rendered as a blank row — a buyer told \"here is your\n * file\" with no way to get it has been lied to, and a licence with no expiry\n * shown might be an expiry that was never read.\n */\nexport type DownloadContractError =\n | { reason: 'license-missing'; id: string }\n | { reason: 'file-without-link'; id: string };\n\nexport type DownloadGroupsResult =\n | { ok: true; groups: DownloadGroups }\n | { ok: false; error: DownloadContractError };\n\n/** The license uniqid a `license:` deliverable names, or null for other kinds. */\nexport function licenseUniqidFromDeliverable(deliverable: SdkCustomerDeliverable): string | null {\n if (deliverable.kind !== 'license') return null;\n if (!deliverable.id.startsWith(LICENSE_DELIVERABLE_PREFIX)) return null;\n const uniqid = deliverable.id.slice(LICENSE_DELIVERABLE_PREFIX.length);\n return uniqid.length > 0 ? uniqid : null;\n}\n\nexport function buildDownloadGroups(\n deliverables: readonly SdkCustomerDeliverable[],\n licenses: readonly SdkCustomerLicense[],\n): DownloadGroupsResult {\n const licensesByUniqid = new Map(licenses.map((license) => [license.uniqid, license]));\n const groups: DownloadGroups = { licenses: [], files: [], codes: [] };\n\n for (const deliverable of deliverables) {\n if (deliverable.kind === 'license') {\n const uniqid = licenseUniqidFromDeliverable(deliverable);\n const license = uniqid === null ? undefined : licensesByUniqid.get(uniqid);\n if (!license) return { ok: false, error: { reason: 'license-missing', id: deliverable.id } };\n groups.licenses.push({ deliverable, license });\n continue;\n }\n\n if (deliverable.kind === 'file') {\n if (!deliverable.href) {\n return { ok: false, error: { reason: 'file-without-link', id: deliverable.id } };\n }\n groups.files.push({ ...deliverable, href: deliverable.href });\n continue;\n }\n\n groups.codes.push(deliverable);\n }\n\n return { ok: true, groups };\n}\n\nexport function isEmptyDownloadGroups(groups: DownloadGroups): boolean {\n return groups.licenses.length === 0 && groups.files.length === 0 && groups.codes.length === 0;\n}\n\n/**\n * A license's end date.\n *\n * `expires_at` is EPOCH SECONDS and `null` means the license never ends — a\n * different statement from \"we could not read the expiry\", which is why this\n * returns `null` only for the first and nothing else can produce it.\n */\nexport function licenseExpiryDate(license: SdkCustomerLicense): Date | null {\n if (license.expires_at === null) return null;\n return new Date(license.expires_at * 1000);\n}\n\n/**\n * Whether to offer the buyer a way to renew.\n *\n * Both halves are required. `renewable` alone would offer a renewal on a\n * perpetual license, which would hand it an end date it never had; an expiry\n * alone would offer one for a product that has stopped selling.\n *\n * The offer is a link into the store, never a call: a renewal is a purchase,\n * and purchases carry their authorisation in checkout (ADR-0064).\n */\nexport function offersRenewal(license: SdkCustomerLicense): boolean {\n return license.renewable && license.expires_at !== null;\n}\n\n","/**\n * The products a buyer saved for later.\n *\n * The one panel with a list route of its own (`GET /favorites`), and the only\n * one whose collection the dashboard payload does not carry.\n *\n * No price is shown, and that is a decision rather than an omission. The\n * producer sends `price_display` as a bare number with no currency beside it —\n * it is the product's stored display price, and nothing in this payload says\n * which currency it was measured in. Labelling it with whatever currency the\n * page happens to be pricing in turns 19.99 EUR into 19.99 USD on every shop\n * where the two differ, which is worse than not saying.\n */\n\nimport { useEffect, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n favoriteProductHref,\n narrowFavorites,\n withoutFavorite,\n type CustomerFavorite,\n} from './account-favorites';\nimport { callCustomerApi } from './customer-account';\nimport { t } from './i18n';\nimport { ProductPlaceholderIcon } from './icons';\nimport {\n AccountEmpty,\n AccountError,\n AccountRowsSkeleton,\n BusySpinner,\n formatAccountDate,\n useAccountResource,\n} from './shared';\n\nexport function AccountFavorites() {\n const { state, reload } = useAccountResource('favorites', () =>\n callCustomerApi((sdk) => sdk.favorites()));\n const [favorites, setFavorites] = useState<CustomerFavorite[] | null>(null);\n const [contractBroken, setContractBroken] = useState(false);\n const [removing, setRemoving] = useState<string | null>(null);\n const [removeError, setRemoveError] = useState<string | null>(null);\n\n /*\n * The list is copied into state because removing writes to it. Narrowing runs\n * once per load rather than on every render, and a payload that does not\n * match the producer is RECORDED as broken — never rendered as an empty\n * wishlist, which would tell a buyer their saved products are gone.\n */\n useEffect(() => {\n if (state.status !== 'ready') return;\n const narrowed = narrowFavorites(state.data);\n setContractBroken(!narrowed.ok);\n setFavorites(narrowed.ok ? narrowed.favorites : null);\n setRemoveError(null);\n }, [state]);\n\n if (state.status === 'loading') {\n return <AccountRowsSkeleton rows={3} label={t('favorites.loading')} />;\n }\n\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n if (contractBroken) {\n return <AccountError message={t('common.genericError')} onRetry={reload} />;\n }\n\n // The response landed but the effect that narrows it has not run yet.\n if (favorites === null) {\n return <AccountRowsSkeleton rows={3} label={t('favorites.loading')} />;\n }\n\n if (favorites.length === 0) {\n return (\n <AccountEmpty\n title={t('favorites.emptyTitle')}\n body={t('favorites.emptyBody')}\n action={(\n <Link to=\"/all-products\" className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small\">\n {t('common.browseStore')}\n </Link>\n )}\n />\n );\n }\n\n const remove = async (favorite: CustomerFavorite) => {\n setRemoving(favorite.product_uniqid);\n setRemoveError(null);\n const result = await callCustomerApi((sdk) => sdk.removeFavorite(favorite.product_uniqid));\n setRemoving(null);\n\n if (!result.success) {\n setRemoveError(result.message?.trim() || t('favorites.removeFailed'));\n return;\n }\n\n // Dropped only once the server confirmed it. Removing the card first and\n // putting it back on failure makes the buyer watch their own action undo\n // itself, and leaves the two lists disagreeing whenever a retry is slow.\n setFavorites((current) => (\n current ? withoutFavorite(current, favorite.product_uniqid) : current\n ));\n };\n\n return (\n <div>\n {removeError ? (\n <div className=\"sxa:mb-6\">\n <AccountError message={removeError} />\n </div>\n ) : null}\n\n <ul className=\"sxa:grid sxa:gap-4 sxa:sm:grid-cols-2 sxa:lg:grid-cols-3\">\n {favorites.map((favorite) => (\n <li\n key={favorite.product_uniqid}\n className=\"sxa:flex sxa:flex-col sxa:overflow-hidden sxa:rounded-input sxa:border sxa:bg-surface sxa:shadow-card\"\n >\n <FavoriteImage favorite={favorite} />\n <div className=\"sxa:flex sxa:flex-1 sxa:flex-col sxa:p-5\">\n <p className=\"sxa:text-small sxa:font-semibold\">{favorite.title}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {t('favorites.added', { date: formatAccountDate(favorite.created_at) })}\n </p>\n {/* The merchant deleted the product. The row stays so the buyer\n can clear it; the link is what goes away. */}\n {favorite.unavailable ? (\n <p className=\"sxa:mt-2 sxa:text-micro sxa:font-medium sxa:text-muted\">{t('favorites.gone')}</p>\n ) : null}\n\n <div className=\"sxa:mt-auto sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2 sxa:pt-4\">\n <FavoriteLink favorite={favorite} />\n <button\n type=\"button\"\n onClick={() => void remove(favorite)}\n disabled={removing !== null}\n aria-busy={removing === favorite.product_uniqid || undefined}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {removing === favorite.product_uniqid ? (\n <BusySpinner className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" />\n ) : null}\n {removing === favorite.product_uniqid\n ? t('favorites.removing')\n : t('favorites.remove')}\n </button>\n </div>\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\n/**\n * The saved product's picture, or the same placeholder tile the cart draws.\n *\n * An image URL that fails to load falls back to the placeholder rather than\n * leaving a broken-image icon in the grid — the product is still saved either\n * way, and the card must stay readable.\n */\nfunction FavoriteImage({ favorite }: { favorite: CustomerFavorite }) {\n const [failed, setFailed] = useState(false);\n\n if (!favorite.image_url || failed) {\n return (\n <div\n className=\"sxa:flex sxa:aspect-[4/3] sxa:items-center sxa:justify-center sxa:border-b sxa:bg-bg\"\n role=\"img\"\n aria-label={t('favorites.noImage', { title: favorite.title })}\n >\n <ProductPlaceholderIcon className=\"sxa:h-6 sxa:w-6 sxa:text-muted\" strokeWidth=\"1.25\" />\n </div>\n );\n }\n\n return (\n <img\n src={favorite.image_url}\n alt={favorite.title}\n loading=\"lazy\"\n decoding=\"async\"\n onError={() => setFailed(true)}\n className=\"sxa:aspect-[4/3] sxa:w-full sxa:border-b sxa:object-cover\"\n />\n );\n}\n\n/** Nothing at all for a product with nowhere to go — see `favoriteProductHref`. */\nfunction FavoriteLink({ favorite }: { favorite: CustomerFavorite }) {\n const href = favoriteProductHref(favorite);\n if (!href) return null;\n return (\n <Link to={href} className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-8 sxa:items-center sxa:px-4 sxa:text-micro sxa:font-semibold\">\n {t('favorites.view')}\n </Link>\n );\n}\n","/**\n * The favorites panel's pure half.\n *\n * `GET /favorites` is one of the endpoints `@shoppex/contracts` does not\n * describe, so the SDK answers `unknown` and the narrowing is here, written\n * against what `customer-favorites.ts` actually selects. Every field it sends\n * is required: a saved product with no title and no price is not a favorite the\n * buyer can act on, and rendering it as an empty card would hide the fault.\n */\n\nexport interface CustomerFavorite {\n product_uniqid: string;\n title: string;\n /** Null for a product with no slug — such a product has no page to open. */\n slug: string | null;\n image_url: string | null;\n price_display: number;\n /** True once the merchant deletes the product. The row stays, the link goes. */\n unavailable: boolean;\n created_at: string;\n}\n\nexport type FavoritesResult =\n | { ok: true; favorites: CustomerFavorite[] }\n | { ok: false };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readNullableString(record: Record<string, unknown>, key: string): string | null | undefined {\n const value = record[key];\n if (value === null || typeof value === 'string') return value;\n return undefined;\n}\n\nexport function narrowFavorites(payload: unknown): FavoritesResult {\n if (!isRecord(payload) || !Array.isArray(payload.favorites)) return { ok: false };\n\n const favorites: CustomerFavorite[] = [];\n for (const entry of payload.favorites) {\n if (!isRecord(entry)) return { ok: false };\n\n const productUniqid = entry.product_uniqid;\n const title = entry.title;\n const slug = readNullableString(entry, 'slug');\n const imageUrl = readNullableString(entry, 'image_url');\n const priceDisplay = entry.price_display;\n const unavailable = entry.unavailable;\n const createdAt = entry.created_at;\n\n if (\n typeof productUniqid !== 'string'\n || typeof title !== 'string'\n || slug === undefined\n || imageUrl === undefined\n || typeof priceDisplay !== 'number'\n || !Number.isFinite(priceDisplay)\n || typeof unavailable !== 'boolean'\n || typeof createdAt !== 'string'\n ) {\n return { ok: false };\n }\n\n favorites.push({\n product_uniqid: productUniqid,\n title,\n slug,\n image_url: imageUrl,\n price_display: priceDisplay,\n unavailable,\n created_at: createdAt,\n });\n }\n\n return { ok: true, favorites };\n}\n\n/**\n * Where a saved product lives in this storefront, or null when it has nowhere\n * to go.\n *\n * A product the merchant deleted keeps its row so the buyer can clear it, but\n * it must not keep its link: `/product/<slug>` would answer with the storefront's\n * not-found page, which reads as a broken shop rather than a removed product.\n */\nexport function favoriteProductHref(favorite: CustomerFavorite): string | null {\n if (favorite.unavailable || !favorite.slug) return null;\n return `/product/${encodeURIComponent(favorite.slug)}`;\n}\n\n/** Drops one product from a list, used after the server confirms the removal. */\nexport function withoutFavorite(\n favorites: readonly CustomerFavorite[],\n productUniqid: string,\n): CustomerFavorite[] {\n return favorites.filter((favorite) => favorite.product_uniqid !== productUniqid);\n}\n\n","/**\n * Sign-in, in the page the buyer is already standing on.\n *\n * Two steps and no password: ask for a code, type it back, and the same panel\n * becomes the account. There is no redirect and no second surface to keep in\n * sync.\n *\n * Two things this component must never do, on any theme:\n * - touch a session token. `verifyOtp` resolves with nothing secret — the\n * Shoppex worker reads the response and sets an HttpOnly cookie the bundle\n * cannot see. Storefront code that stored a token would be holding a\n * credential the platform deliberately kept out of its reach.\n * - send a shop. The worker derives the tenant from the host the buyer is on.\n * A shop chosen in the page would put a tenant boundary behind a text field\n * on an unauthenticated route.\n *\n * Every refusal is printed in the server's own sentence. The code's lifetime,\n * the attempt limit and the lockout rule are all decided server-side, so a\n * storefront that paraphrases them is telling the buyer something that may\n * already be false.\n */\n\nimport { useState } from 'react';\nimport type { AccountSignInPrefill } from './account-signin-link';\nimport { callCustomerApi } from './customer-account';\nimport { t } from './i18n';\nimport { MailIcon } from './icons';\nimport { AccountCard, AccountFieldError, AccountNotice, BusySpinner } from './shared';\n\n/** Long enough for any code the producer mints, short enough to reject a paste of a page. */\nconst OTP_MAX_LENGTH = 32;\n\ntype Step =\n | { name: 'email' }\n | { name: 'code'; email: string };\n\n/** The template's field skin — the same one the checkout and contact forms wear. */\nconst FIELD =\n 'sx-account-field sxa:w-full sxa:border sxa:bg-[color-mix(in_oklab,_var(--sx-bg)_40%,_transparent)] sxa:px-3 sxa:py-2.5 sxa:text-small sxa:shadow-card sxa:placeholder:text-muted sxa:focus-visible:border-accent sxa:focus-visible:ring-[3px] sxa:focus-visible:ring-[color-mix(in_oklab,_var(--sx-accent)_50%,_transparent)] sxa:focus-visible:outline-none sxa:disabled:opacity-50';\n\nconst LABEL = 'sx-account-label sxa:block sxa:text-small sxa:font-medium sxa:text-muted';\n\nconst ERROR_ID = 'account-login-error';\n\n/**\n * A prefill puts the buyer on the code step with both fields already filled —\n * and stops there. It never submits: the code stays unspent until the buyer\n * presses the button, which is the only reason the link is allowed to carry\n * one at all.\n */\nexport function AccountLogin({\n onSignedIn,\n prefill = null,\n}: {\n onSignedIn: () => void;\n prefill?: AccountSignInPrefill | null;\n}) {\n const [step, setStep] = useState<Step>(\n prefill ? { name: 'code', email: prefill.email } : { name: 'email' },\n );\n const [email, setEmail] = useState(prefill?.email ?? '');\n const [otp, setOtp] = useState(prefill?.code ?? '');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n\n const sendCode = async (address: string, resend = false) => {\n setBusy(true);\n setError(null);\n setNotice(null);\n const result = await callCustomerApi((sdk) => sdk.requestOtp(address));\n setBusy(false);\n\n if (!result.success) {\n setError(result.message?.trim() || t('login.sendFailed'));\n return;\n }\n\n setStep({ name: 'code', email: address });\n // Only a resend is worth announcing. The step's own intro already names the\n // address the first code went to, so repeating it under the field is noise.\n if (resend) setNotice(t('login.resent', { email: address }));\n };\n\n const submitEmail = () => {\n const address = email.trim();\n // The cheapest check that catches a real mistake — a missing local part or\n // a missing domain. Anything stricter would refuse an address the server\n // would have accepted, and the server is the one that has to deliver to it.\n const at = address.indexOf('@');\n if (at < 1 || at === address.length - 1) {\n setError(t('login.invalidEmail'));\n return;\n }\n void sendCode(address);\n };\n\n const submitCode = async (address: string) => {\n const code = otp.trim();\n if (!code) {\n setError(t('login.missingCode'));\n return;\n }\n\n setBusy(true);\n setError(null);\n const result = await callCustomerApi((sdk) => sdk.verifyOtp(address, code));\n setBusy(false);\n\n if (!result.success) {\n setError(result.message?.trim() || t('login.verifyFailed'));\n return;\n }\n\n // The session cookie rode back on that response. Nothing is kept here.\n onSignedIn();\n };\n\n return (\n <AccountCard className=\"sxa:mx-auto sxa:w-full sxa:max-w-md sxa:px-6 sxa:py-8 sxa:sm:px-8\">\n <div className=\"sxa:flex sxa:h-10 sxa:w-10 sxa:items-center sxa:justify-center sxa:rounded-card sxa:bg-[color-mix(in_oklab,_var(--sx-accent)_10%,_transparent)]\">\n <MailIcon className=\"sxa:h-5 sxa:w-5 sxa:text-accent\" />\n </div>\n <h2 className=\"sxa:font-heading sxa:mt-5 sxa:text-h3 sxa:font-semibold\">\n {step.name === 'email' ? t('login.titleEmail') : t('login.titleCode')}\n </h2>\n <p className=\"sxa:mt-2 sxa:text-small sxa:leading-relaxed sxa:text-muted\">\n {step.name === 'email'\n ? t('login.introEmail')\n : t('login.introCode', { email: step.email })}\n </p>\n\n {step.name === 'email' ? (\n <form\n noValidate\n className=\"sxa:mt-6 sxa:space-y-1.5\"\n onSubmit={(event) => {\n event.preventDefault();\n submitEmail();\n }}\n >\n <label htmlFor=\"account-email\" className={LABEL}>\n {t('login.emailLabel')}\n </label>\n <input\n id=\"account-email\"\n name=\"email\"\n type=\"email\"\n required\n autoComplete=\"email\"\n value={email}\n disabled={busy}\n aria-invalid={error !== null}\n aria-describedby={error ? ERROR_ID : undefined}\n className={`${FIELD} sxa:h-10 sxa:rounded-input ${error ? 'sxa:border-error' : ''}`}\n onChange={(event) => {\n setEmail(event.target.value);\n setError(null);\n }}\n />\n {error ? (\n <div id={ERROR_ID}>\n <AccountFieldError message={error} />\n </div>\n ) : null}\n <button\n type=\"submit\"\n disabled={busy}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:mt-5 sxa:inline-flex sxa:h-11 sxa:w-full sxa:items-center sxa:justify-center sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {busy ? <BusySpinner className=\"sxa:mr-2\" /> : null}\n {busy ? t('login.sending') : t('login.send')}\n </button>\n </form>\n ) : (\n <form\n noValidate\n className=\"sxa:mt-6 sxa:space-y-1.5\"\n onSubmit={(event) => {\n event.preventDefault();\n void submitCode(step.email);\n }}\n >\n <label htmlFor=\"account-otp\" className={LABEL}>\n {t('login.codeLabel')}\n </label>\n <input\n id=\"account-otp\"\n name=\"otp\"\n type=\"text\"\n required\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={OTP_MAX_LENGTH}\n value={otp}\n disabled={busy}\n aria-invalid={error !== null}\n aria-describedby={error ? ERROR_ID : undefined}\n className={`${FIELD} sxa:font-mono sxa:tracking-[0.3em] sxa:tabular-nums sxa:h-10 sxa:rounded-input ${error ? 'sxa:border-error' : ''}`}\n onChange={(event) => {\n setOtp(event.target.value);\n setError(null);\n }}\n />\n {notice ? <AccountNotice message={notice} /> : null}\n {error ? (\n <div id={ERROR_ID}>\n <AccountFieldError message={error} />\n </div>\n ) : null}\n <button\n type=\"submit\"\n disabled={busy}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:mt-5 sxa:inline-flex sxa:h-11 sxa:w-full sxa:items-center sxa:justify-center sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {busy ? <BusySpinner className=\"sxa:mr-2\" /> : null}\n {busy ? t('login.submitting') : t('login.submit')}\n </button>\n <div className=\"sxa:mt-4 sxa:flex sxa:flex-wrap sxa:items-center sxa:justify-between sxa:gap-3\">\n <button\n type=\"button\"\n disabled={busy}\n className=\"sxa:text-small sxa:text-muted sxa:transition-opacity sxa:hover:opacity-80 sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => {\n setStep({ name: 'email' });\n setOtp('');\n setError(null);\n setNotice(null);\n }}\n >\n {t('login.changeEmail')}\n </button>\n <button\n type=\"button\"\n disabled={busy}\n className=\"sxa:text-small sxa:font-semibold sxa:text-accent sxa:transition-opacity sxa:hover:opacity-80 sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => {\n // The old code is dead the moment a new one is minted; leaving\n // it in the field invites the buyer to submit it anyway.\n setOtp('');\n void sendCode(step.email, true);\n }}\n >\n {t('login.resend')}\n </button>\n </div>\n </form>\n )}\n </AccountCard>\n );\n}\n","/**\n * Order history, and one order in full.\n *\n * Pagination is PAGE based because the producer is: it reads `page` and `limit`\n * and answers with `has_more`. There is no cursor to carry, and inventing one\n * would be ignored upstream and quietly return page one for ever.\n *\n * The invoice search and the status filter travel WITH the request. The list is\n * paged, so filtering the rows already in hand would search only the ten rows\n * the buyer happens to be looking at and call the rest of their history missing.\n *\n * List and detail are two views of the same panel, chosen by the route — see\n * `account-route.ts`. Order detail is not a page of its own.\n */\n\nimport { useState, type ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\nimport { paymentMethodLabel } from './account-payment-method';\nimport { accountOrderHref, accountTabHref } from '../account-route';\nimport {\n WARRANTY_CLAIM_MESSAGE_MAX,\n canClaimWarranty,\n warrantiesForOrder,\n warrantyClaimKey,\n warrantyClaimMessage,\n warrantyCoverage,\n type WarrantyCoverage,\n warrantyDate,\n} from './account-warranties';\nimport { callCustomerApi, safeExternalHref } from './customer-account';\nimport type { SdkCustomerDeliverySummary, SdkCustomerWarranty } from '../sdk';\nimport { t, tOptional } from './i18n';\nimport {\n ArrowLeftIcon,\n ArrowRightIcon,\n ChevronDownIcon,\n ReceiptIcon,\n ShieldIcon,\n} from './icons';\nimport {\n AccountBackLink,\n AccountCard,\n AccountEmpty,\n AccountError,\n AccountFieldError,\n AccountNotice,\n AccountRowsSkeleton,\n AccountSectionTitle,\n BusySpinner,\n StatusChip,\n formatAccountAmount,\n formatAccountDate,\n formatInvoiceAmount,\n useAccountResource,\n} from './shared';\n\nconst ORDERS_PER_PAGE = 10;\n\n/** The producer's invoice-status enum, in the order the hosted portal lists it. */\nconst STATUS_FILTERS = [\n 'COMPLETED',\n 'PENDING',\n 'PROCESSING',\n 'REFUNDED',\n 'DISPUTED',\n 'EXPIRED',\n] as const;\n\nconst STATUS_LABEL_KEYS: Record<(typeof STATUS_FILTERS)[number], string> = {\n COMPLETED: 'orders.statusCompleted',\n PENDING: 'orders.statusPending',\n PROCESSING: 'orders.statusProcessing',\n REFUNDED: 'orders.statusRefunded',\n DISPUTED: 'orders.statusDisputed',\n EXPIRED: 'orders.statusExpired',\n};\n\n/** The template's field skin, shared with the checkout and contact forms. */\nconst FIELD =\n 'sx-account-field sxa:w-full sxa:border sxa:bg-[color-mix(in_oklab,_var(--sx-bg)_40%,_transparent)] sxa:px-3 sxa:py-2.5 sxa:text-small sxa:shadow-card sxa:placeholder:text-muted sxa:focus-visible:border-accent sxa:focus-visible:ring-[3px] sxa:focus-visible:ring-[color-mix(in_oklab,_var(--sx-accent)_50%,_transparent)] sxa:focus-visible:outline-none';\n\nexport function moreItemsLabel(count: number): string {\n return count === 1 ? t('orders.andMoreOne') : t('orders.andMoreOther', { count });\n}\n\n/**\n * What to call an order in a list.\n *\n * The first line's product title, and the count of the lines behind it. A line\n * whose title the producer sent as null is named by the order's own id rather\n * than by a product this template guessed at.\n */\nexport function orderRowTitle(\n firstTitle: string | null | undefined,\n lineCount: number,\n uniqid: string,\n): string {\n const head = firstTitle ?? t('orders.fallbackTitle', { id: uniqid });\n return lineCount > 1 ? `${head} ${moreItemsLabel(lineCount - 1)}` : head;\n}\n\n/** One order, as a row that opens it. Both this panel and the overview use it. */\nexport function OrderRow({\n uniqid,\n title,\n createdAt,\n amount,\n status,\n}: {\n uniqid: string;\n title: string;\n createdAt: string;\n amount: string;\n status: string;\n}) {\n return (\n <Link to={accountOrderHref(uniqid)} className=\"sxa:block sxa:transition-opacity sxa:hover:opacity-80\">\n <AccountCard className=\"sxa:flex sxa:items-center sxa:gap-4 sxa:px-5 sxa:py-4\">\n <ReceiptIcon className=\"sxa:h-4 sxa:w-4 sxa:shrink-0 sxa:text-muted\" />\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{title}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{formatAccountDate(createdAt)}</p>\n </div>\n <span className=\"sxa:shrink-0 sxa:text-small sxa:font-semibold sxa:tabular-nums\">{amount}</span>\n <StatusChip status={status} />\n </AccountCard>\n </Link>\n );\n}\n\nexport function AccountOrders() {\n const [page, setPage] = useState(1);\n const [status, setStatus] = useState('');\n const [search, setSearch] = useState('');\n /** What was last SENT, as against what is currently being typed. */\n const [applied, setApplied] = useState({ status: '', search: '' });\n\n const { state, reload } = useAccountResource(\n `orders:${page}:${applied.status}:${applied.search}`,\n () => callCustomerApi((sdk) => sdk.orders({\n page,\n limit: ORDERS_PER_PAGE,\n ...(applied.status ? { status: applied.status } : {}),\n ...(applied.search ? { search: applied.search } : {}),\n })),\n );\n\n // A changed filter is a different list. Staying on page four of the old one\n // would ask for a page the new list may not have and answer with nothing.\n const applyFilters = (next: { status?: string; search?: string }) => {\n const merged = { status: next.status ?? status, search: next.search ?? search };\n setStatus(merged.status);\n setSearch(merged.search);\n setApplied(merged);\n setPage(1);\n };\n\n const filtering = applied.status !== '' || applied.search !== '';\n\n const filterBar = (\n <form\n className=\"sxa:mb-5 sxa:flex sxa:flex-col sxa:gap-2 sxa:sm:flex-row\"\n onSubmit={(event) => {\n event.preventDefault();\n applyFilters({});\n }}\n >\n <input\n type=\"search\"\n value={search}\n placeholder={t('orders.searchPlaceholder')}\n aria-label={t('orders.search')}\n onChange={(event) => setSearch(event.target.value)}\n className={`sxa:min-w-0 sxa:flex-1 ${FIELD} sxa:h-10 sxa:rounded-input`}\n />\n <div className=\"sxa:relative\">\n <select\n value={status}\n aria-label={t('orders.status')}\n onChange={(event) => applyFilters({ status: event.target.value })}\n className=\"sxa:h-10 sxa:w-full sxa:appearance-none sxa:border sxa:bg-surface sxa:pr-9 sxa:pl-4 sxa:text-small sxa:focus:outline-none sxa:sm:w-auto sxa:rounded-input\"\n >\n <option value=\"\">{t('orders.statusAll')}</option>\n {STATUS_FILTERS.map((value) => (\n <option key={value} value={value}>{t(STATUS_LABEL_KEYS[value])}</option>\n ))}\n </select>\n <div className=\"sxa:pointer-events-none sxa:absolute sxa:inset-y-0 sxa:right-0 sxa:flex sxa:items-center sxa:px-3 sxa:text-muted\">\n <ChevronDownIcon className=\"sxa:h-4 sxa:w-4\" />\n </div>\n </div>\n <button type=\"submit\" className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:shrink-0\">\n {t('orders.search')}\n </button>\n </form>\n );\n\n if (state.status === 'loading') {\n return (\n <div>\n {filterBar}\n <AccountRowsSkeleton rows={4} label={t('orders.loading')} />\n </div>\n );\n }\n\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n const { invoices, pagination } = state.data;\n\n if (invoices.length === 0) {\n // A filter that matched nothing is not an empty account. Telling a buyer\n // they have never ordered anything because they mistyped an invoice id is a\n // lie the control they just used caused.\n if (filtering && pagination.page === 1) {\n return (\n <div>\n {filterBar}\n <AccountEmpty title={t('orders.movedTitle')} body={t('orders.emptyFiltered')} />\n </div>\n );\n }\n\n // An empty page one means the account has no orders. A later page coming\n // back empty means the list moved underneath the buyer, and the way out of\n // that is page one — not a message that pretends they never bought anything.\n return pagination.page > 1 ? (\n <AccountEmpty\n title={t('orders.movedTitle')}\n body={t('orders.movedBody')}\n action={(\n <button\n type=\"button\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add\"\n onClick={() => setPage(1)}\n >\n {t('orders.backToFirstPage')}\n </button>\n )}\n />\n ) : (\n <AccountEmpty\n title={t('orders.emptyTitle')}\n body={t('orders.emptyBody')}\n action={(\n <Link to=\"/all-products\" className=\"sx-account-button sxa:card-button sxa:card-button--add\">\n {t('common.browseStore')}\n </Link>\n )}\n />\n );\n }\n\n return (\n <div>\n {filterBar}\n <ul className=\"sxa:space-y-3\">\n {invoices.map((order) => (\n <li key={order.uniqid}>\n <OrderRow\n uniqid={order.uniqid}\n title={orderRowTitle(\n order.lineItems[0]?.productTitle,\n order.lineItems.length,\n order.uniqid,\n )}\n createdAt={order.createdAt}\n amount={formatInvoiceAmount(order.totalDisplay, order.total, order.currency)}\n status={order.status}\n />\n </li>\n ))}\n </ul>\n\n {pagination.page > 1 || pagination.has_more ? (\n <nav className=\"sxa:mt-6 sxa:flex sxa:items-center sxa:justify-between sxa:gap-4\" aria-label={t('orders.pagesLabel')}>\n <button\n type=\"button\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-40\"\n disabled={pagination.page <= 1}\n onClick={() => setPage((current) => Math.max(1, current - 1))}\n >\n <ArrowLeftIcon className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" />\n {t('orders.previous')}\n </button>\n <p className=\"sxa:text-small sxa:tabular-nums sxa:text-muted\">\n {t('orders.page', { page: pagination.page })}\n </p>\n <button\n type=\"button\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-40\"\n disabled={!pagination.has_more}\n onClick={() => setPage((current) => current + 1)}\n >\n {t('orders.next')}\n <ArrowRightIcon className=\"sxa:ml-1.5 sxa:h-3.5 sxa:w-3.5\" />\n </button>\n </nav>\n ) : null}\n </div>\n );\n}\n\nexport function AccountOrderDetail({ orderId }: { orderId: string }) {\n const { state, reload } = useAccountResource(`order:${orderId}`, () =>\n callCustomerApi((sdk) => sdk.order(orderId)));\n\n const backLink = <AccountBackLink to={accountTabHref('orders')} label={t('orders.allOrders')} />;\n\n if (state.status === 'loading') {\n return (\n <div>\n {backLink}\n <div className=\"sxa:mt-5\">\n <AccountRowsSkeleton rows={3} label={t('orders.loadingOne')} />\n </div>\n </div>\n );\n }\n\n if (state.status === 'error') {\n return (\n <div>\n {backLink}\n <div className=\"sxa:mt-5\">\n <AccountError message={state.message} onRetry={reload} />\n </div>\n </div>\n );\n }\n\n const order = state.data;\n\n return (\n <div>\n {backLink}\n\n <div className=\"sxa:mt-5 sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-4\">\n <div>\n <AccountSectionTitle>{t('orders.detailTitle', { id: order.uniqid })}</AccountSectionTitle>\n <p className=\"sxa:mt-1 sxa:text-small sxa:text-muted\">{formatAccountDate(order.createdAt)}</p>\n </div>\n <StatusChip status={order.status} />\n </div>\n\n {/*\n The server's own sentence about this status, printed verbatim and only\n when it sent one. It is the single place a buyer learns that a paid\n order did not deliver, or why a refund is still moving — no storefront\n can reconstruct that from the status word alone.\n */}\n {order.statusDetails ? (\n <p className=\"sxa:mt-3 sxa:text-small sxa:leading-relaxed sxa:text-muted\">{order.statusDetails}</p>\n ) : null}\n\n <ul className=\"sxa:mt-6 sxa:space-y-3\">\n {order.lineItems.map((item) => (\n <li key={item.id}>\n <AccountCard className=\"sxa:px-5 sxa:py-4\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-3\">\n <div className=\"sxa:min-w-0\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{item.productTitle}</p>\n {item.variantTitle ? (\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{item.variantTitle}</p>\n ) : null}\n <p className=\"sxa:mt-1.5 sxa:text-micro sxa:tabular-nums sxa:text-muted\">\n {item.quantity} × {formatAccountAmount(item.unitPrice, order.currency)}\n </p>\n </div>\n <div className=\"sxa:text-right\">\n <p className=\"sxa:text-small sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(item.total, order.currency)}\n </p>\n {/*\n Fulfillment is decided per LINE and server-side, and it is\n independent of payment: a completed, fully paid invoice can\n still carry a line that never reached the buyer. This chip is\n the only thing on the page that says so, which is why it is\n rendered for every line rather than only for the unhappy ones.\n */}\n <p className=\"sxa:mt-1.5\">\n <DeliveryChip status={item.deliveryStatus} />\n </p>\n </div>\n </div>\n\n {/*\n What the shop actually handed over for this line, when it handed\n over anything. The presence of a summary is NOT a delivery state\n — the chip above owns that — and nothing here is derived from the\n payment status.\n */}\n {item.deliverySummary ? <DeliveredItems summary={item.deliverySummary} /> : null}\n </AccountCard>\n </li>\n ))}\n </ul>\n\n <AccountCard className=\"sxa:mt-6 sxa:px-5 sxa:py-5\">\n <dl className=\"sxa:space-y-2.5\">\n <SummaryRow label={t('orders.subtotal')}>\n {formatAccountAmount(order.subtotal, order.currency)}\n </SummaryRow>\n {/*\n `discount` is the USD-normalized figure and `discountDisplay` the\n same amount in the buyer's currency, exactly like the total. Display\n first is the producer's rule; the row itself only appears when the\n order carried a discount at all.\n */}\n {Number(order.discountDisplay ?? order.discount) > 0 ? (\n <SummaryRow label={t('orders.discount')}>\n −{formatInvoiceAmount(order.discountDisplay, order.discount, order.currency)}\n </SummaryRow>\n ) : null}\n {Number(order.tax) > 0 ? (\n <SummaryRow label={t('orders.tax')}>\n {formatAccountAmount(order.tax, order.currency)}\n </SummaryRow>\n ) : null}\n <SummaryRow label={t('orders.total')} emphasis>\n {formatInvoiceAmount(order.totalDisplay, order.total, order.currency)}\n </SummaryRow>\n {/*\n The coin or the alternative method the buyer picked — never the\n internal rail. `gateway` says NATIVE_CRYPTO where the buyer chose\n USDT, which names a thing they never dealt with.\n */}\n {order.currentPayment ? (\n <SummaryRow label={t('orders.paidWith')}>\n {paymentMethodLabel(order.currentPayment)}\n </SummaryRow>\n ) : null}\n </dl>\n </AccountCard>\n\n {/*\n Below the receipt, not inside it. The lines and the totals are one\n block — a warranty list between a row and the sum it belongs to breaks\n a reading order buyers already know — and cover is what happens to this\n order AFTER it was paid for.\n */}\n <OrderWarranties orderUniqid={order.uniqid} />\n </div>\n );\n}\n\n/**\n * What the shop still covers on this order.\n *\n * The route filters on `invoices.uniqid` when it is handed one, and that is the\n * id this order carries, so the read asks for this order's cover by name. The\n * answer is still filtered here: there is no line-item id on that wire, a\n * warranty belongs to the order rather than to the row that sold it, and a\n * client that renders whatever a list contains cannot be wrong about whose\n * order it is showing.\n *\n * Most orders carry none, which is why nothing is drawn while the read is in\n * flight — a \"Warranty\" heading that appears and then disappears on every\n * order without cover is worse than one that arrives a moment late. A failed\n * read IS shown: it cannot be told apart from \"no cover on this order\", and\n * the buyer who has cover is the one who would be left without it.\n */\nfunction OrderWarranties({ orderUniqid }: { orderUniqid: string }) {\n const { state, reload } = useAccountResource(`warranties:${orderUniqid}`, () =>\n callCustomerApi((sdk) => sdk.warranties(orderUniqid)));\n /** Rows the server returned from a claim, replacing the ones it was read with. */\n const [claimed, setClaimed] = useState<Record<string, SdkCustomerWarranty>>({});\n\n if (state.status === 'loading') return null;\n\n if (state.status === 'error') {\n return (\n <WarrantySection>\n <AccountError message={state.message} onRetry={reload} />\n </WarrantySection>\n );\n }\n\n const warranties = warrantiesForOrder(state.data.warranties, orderUniqid)\n .map((warranty) => claimed[warranty.uniqid] ?? warranty);\n\n if (warranties.length === 0) return null;\n\n return (\n <WarrantySection>\n <ul className=\"sxa:space-y-3\">\n {warranties.map((warranty) => (\n <li key={warranty.uniqid}>\n <WarrantyRow\n warranty={warranty}\n onClaimed={(updated) => setClaimed((rows) => ({ ...rows, [updated.uniqid]: updated }))}\n />\n </li>\n ))}\n </ul>\n </WarrantySection>\n );\n}\n\nfunction WarrantySection({ children }: { children: ReactNode }) {\n return (\n <section className=\"sxa:mt-8\">\n <AccountSectionTitle>{t('orders.warrantyTitle')}</AccountSectionTitle>\n <div className=\"sxa:mt-4\">{children}</div>\n </section>\n );\n}\n\nfunction WarrantyRow({\n warranty,\n onClaimed,\n}: {\n warranty: SdkCustomerWarranty;\n onClaimed: (warranty: SdkCustomerWarranty) => void;\n}) {\n const [writing, setWriting] = useState(false);\n const [message, setMessage] = useState('');\n const [sending, setSending] = useState(false);\n const [sent, setSent] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const claimKey = warrantyClaimKey(warranty.claim_status);\n const fieldId = `warranty-claim-${warranty.uniqid}`;\n\n const send = async () => {\n setSending(true);\n setError(null);\n const response = await callCustomerApi((sdk) => sdk.claimWarranty(\n warranty.uniqid,\n warrantyClaimMessage(message),\n ));\n setSending(false);\n\n if (!response.success || response.data === undefined) {\n setError(response.message?.trim() || t('orders.warrantyClaimFailed'));\n return;\n }\n\n // The row is replaced by the one the server answered with, rather than\n // edited in place: it is the only party that knows what the claim did.\n setWriting(false);\n setMessage('');\n setSent(true);\n onClaimed(response.data.warranty);\n };\n\n return (\n <AccountCard className=\"sxa:px-5 sxa:py-4\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-3\">\n <div className=\"sxa:flex sxa:min-w-0 sxa:items-start sxa:gap-3\">\n <ShieldIcon className=\"sxa:mt-0.5 sxa:h-4 sxa:w-4 sxa:shrink-0 sxa:text-muted\" />\n <div className=\"sxa:min-w-0\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{warranty.product_title}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {coverageLabel(warrantyCoverage(warranty))}\n {claimKey ? ` · ${t(claimKey)}` : ''}\n </p>\n </div>\n </div>\n\n {/* Offered only while there is cover left and nothing has been claimed\n against it. Both are the producer's facts, and neither is a button\n that gets disabled instead of removed. */}\n {canClaimWarranty(warranty) && !writing ? (\n <button\n type=\"button\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add\"\n onClick={() => setWriting(true)}\n >\n {t('orders.warrantyClaimStart')}\n </button>\n ) : null}\n </div>\n\n {sent ? <AccountNotice message={t('orders.warrantyClaimDone')} /> : null}\n\n {writing ? (\n <div className=\"sxa:mt-4 sxa:border-t sxa:pt-4\">\n <label htmlFor={fieldId} className=\"sxa:mb-1.5 sxa:block sxa:text-small sxa:font-medium\">\n {t('orders.warrantyClaimLabel')}\n <span className=\"sxa:ml-2 sxa:text-micro sxa:font-normal sxa:text-muted\">\n {t('orders.warrantyClaimOptional')}\n </span>\n </label>\n <textarea\n id={fieldId}\n rows={3}\n value={message}\n disabled={sending}\n maxLength={WARRANTY_CLAIM_MESSAGE_MAX}\n onChange={(event) => {\n setMessage(event.target.value);\n setError(null);\n }}\n className={`${FIELD} sxa:resize-none`}\n />\n\n <div className=\"sxa:mt-3 sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2\">\n <button\n type=\"button\"\n disabled={sending}\n aria-busy={sending || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-9 sxa:items-center sxa:px-4 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => void send()}\n >\n {sending ? <BusySpinner className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" /> : null}\n {sending ? t('orders.warrantyClaimSending') : t('orders.warrantyClaimSend')}\n </button>\n <button\n type=\"button\"\n disabled={sending}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => {\n setWriting(false);\n setError(null);\n }}\n >\n {t('common.cancel')}\n </button>\n </div>\n\n {error ? <AccountFieldError message={error} /> : null}\n </div>\n ) : null}\n </AccountCard>\n );\n}\n\n/** Cover as a sentence. Cancelled cover names no date, because it has none. */\nfunction coverageLabel(coverage: WarrantyCoverage): string {\n switch (coverage.kind) {\n case 'covered':\n return t('orders.warrantyCoveredUntil', { date: formatAccountDate(warrantyDate(coverage.expiresAt)) });\n case 'ended':\n return t('orders.warrantyEnded', { date: formatAccountDate(warrantyDate(coverage.expiresAt)) });\n case 'cancelled':\n return t('orders.warrantyCancelled');\n }\n}\n\nfunction SummaryRow({\n label,\n emphasis = false,\n children,\n}: {\n label: string;\n emphasis?: boolean;\n children: ReactNode;\n}) {\n return (\n <div\n className={`sxa:flex sxa:items-baseline sxa:justify-between sxa:gap-4 ${\n emphasis ? 'sxa:border-t sxa:pt-3 sxa:text-body' : 'sxa:text-small'\n }`}\n >\n <dt className={emphasis ? 'sxa:text-small sxa:font-semibold' : 'sxa:text-muted'}>{label}</dt>\n <dd className={`sxa:tabular-nums ${emphasis ? 'sxa:text-h3 sxa:font-bold' : 'sxa:font-medium'}`}>\n {children}\n </dd>\n </div>\n );\n}\n\n/**\n * The per-line fulfillment state, in a word.\n *\n * `tOptional` first: delivery status is an open wire enum, so a state this\n * catalog has not heard of is printed as the producer spelled it rather than as\n * a blank or a guess. `FAILED` reads \"Delivery failed\" — a buyer looking at a\n * completed invoice has to be able to see that one of its lines never arrived.\n */\nfunction DeliveryChip({ status }: { status: string }) {\n const normalized = status.trim().toUpperCase();\n const tone = normalized === 'DELIVERED'\n ? 'sxa:meta-chip--in_stock'\n : normalized === 'FAILED'\n ? 'sxa:meta-chip--sold_out'\n : 'sxa:meta-chip--neutral';\n\n return (\n <span className={`sx-account-chip sxa:meta-chip ${tone}`}>\n {tOptional(`delivery.${normalized}`) ?? status}\n </span>\n );\n}\n\nfunction DeliveredItems({ summary }: { summary: SdkCustomerDeliverySummary }) {\n const hasContent =\n summary.codes.length > 0\n || summary.links.length > 0\n || summary.notes.length > 0\n || summary.serials.length > 0;\n\n if (!hasContent) return null;\n\n return (\n <div className=\"sxa:mt-4 sxa:border-t sxa:pt-4\">\n <p className=\"sxa:text-micro sxa:font-semibold sxa:tracking-[0.12em] sxa:text-muted sxa:uppercase\">\n {t('orders.deliveryTitle')}\n </p>\n\n {summary.codes.length ? (\n <ul className=\"sxa:mt-3 sxa:space-y-1.5\">\n {summary.codes.map((code) => (\n <li\n key={code}\n className=\"sxa:rounded-input sxa:border sxa:bg-bg sxa:px-3 sxa:py-2 sxa:font-mono sxa:text-micro sxa:break-all\"\n >\n {code}\n </li>\n ))}\n </ul>\n ) : null}\n\n {summary.serials.length ? (\n <ul className=\"sxa:mt-3 sxa:space-y-1.5\">\n {summary.serials.map((serial) => (\n <li\n key={serial.value}\n className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2 sxa:rounded-input sxa:border sxa:bg-bg sxa:px-3 sxa:py-2 sxa:font-mono sxa:text-micro sxa:break-all\"\n >\n {/* A replaced serial is struck through rather than dropped: it is\n the one the buyer may already have installed somewhere. */}\n <span className={serial.is_replaced ? 'sxa:line-through sxa:opacity-60' : ''}>\n {serial.value}\n </span>\n {serial.is_replacement ? (\n <span className=\"sx-account-chip sxa:meta-chip sxa:meta-chip--neutral\">{t('orders.replacement')}</span>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n\n {summary.links.length ? (\n <ul className=\"sxa:mt-3 sxa:space-y-1.5\">\n {summary.links.map((link) => (\n <li key={`${link.label}-${link.value}`} className=\"sxa:text-small\">\n <DeliveryLink label={link.label} value={link.value} href={link.href} />\n </li>\n ))}\n </ul>\n ) : null}\n\n {summary.notes.length ? (\n <div className=\"sxa:mt-3 sxa:space-y-1.5\">\n {summary.notes.map((note) => (\n <p key={note} className=\"sxa:text-small sxa:leading-relaxed sxa:text-muted\">{note}</p>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\n/**\n * A delivery link the MERCHANT typed into their own product.\n *\n * `javascript:` is a URL, and an anchor carrying one runs on the origin the\n * buyer is standing on with the session cookie they are signed in with. So the\n * scheme is checked before an anchor exists at all: a link that does not survive\n * `safeExternalHref` is shown as the text it is, never as something to click.\n */\nfunction DeliveryLink({\n label,\n value,\n href,\n}: {\n label: string;\n value: string;\n href?: string | null;\n}) {\n const safeHref = safeExternalHref(href);\n\n if (safeHref === null) {\n return <span className=\"sxa:break-all sxa:text-muted\">{label}: {value}</span>;\n }\n\n return (\n <a\n href={safeHref}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"sxa:font-medium sxa:text-accent sxa:underline sxa:underline-offset-2 sxa:transition-opacity sxa:hover:opacity-80\"\n >\n {label}\n </a>\n );\n}\n","/**\n * What the buyer paid with, in the buyer's vocabulary.\n *\n * The producer sends two different things: the internal rail (`gateway` —\n * NATIVE_CRYPTO, NOWPAYMENTS, CRYPTOMUS…) and the concrete method the buyer\n * actually chose (`apmMethod`, `cryptoGateway`). Someone who paid in USDT\n * never picked \"NOWPAYMENTS\" and does not recognise the word — showing the\n * rail names a company they never dealt with.\n *\n * The precedence is the customer portal's, kept identical on purpose: this\n * account page replaces the portal, and a buyer's order history must not\n * change wording underneath them at cutover.\n */\n\nconst GATEWAY_LABELS: Record<string, string> = {\n STRIPE: 'Stripe',\n PAYPAL: 'PayPal',\n CASHAPP: 'Cash App',\n SQUARE: 'Square',\n BITCOIN: 'Bitcoin',\n LITECOIN: 'Litecoin',\n ETHEREUM: 'Ethereum',\n SOLANA: 'Solana',\n CONCORDIUM: 'Concordium',\n NANO: 'Nano',\n MONERO: 'Monero',\n BALANCE: 'Store Balance',\n MOLLIE: 'Mollie',\n LEX_PAYMENTS: 'Lex Payments',\n SELLIX_PAY: 'Sellix Pay',\n // Internal crypto rails — buyers see the coin (via cryptoGateway) or the\n // generic \"Crypto\", never rail or provider vocabulary.\n NATIVE_CRYPTO: 'Crypto',\n NOWPAYMENTS: 'Crypto',\n NOWPAYMENTS_WHITELABEL: 'Crypto',\n OXAPAY: 'Crypto',\n CRYPTOMUS: 'Crypto',\n};\n\nconst CRYPTO_COIN_LABELS: Record<string, string> = {\n BITCOIN: 'Bitcoin',\n BITCOIN_CASH: 'Bitcoin Cash',\n BITCOIN_LN: 'Lightning',\n LITECOIN: 'Litecoin',\n ETHEREUM: 'Ethereum',\n SOLANA: 'Solana',\n MONERO: 'Monero',\n TRON: 'Tron',\n POLYGON: 'Polygon',\n BINANCE_COIN: 'BNB',\n RIPPLE: 'Ripple',\n DOGECOIN: 'Dogecoin',\n DASH: 'Dash',\n CRONOS: 'Cronos',\n NANO: 'Nano',\n};\n\nconst NOWPAYMENTS_DYNAMIC_PREFIX = 'NOWPAYMENTS:';\nconst NOWPAYMENTS_CURRENCY_CODE = /^[A-Z0-9]{2,12}$/;\n\n/** `NOWPAYMENTS:ton` → `TON`. The prefix is the provider, never buyer-facing. */\nfunction parseDynamicNowPaymentsCurrency(gateway: string): string | null {\n const normalized = gateway.trim().toUpperCase();\n if (!normalized.startsWith(NOWPAYMENTS_DYNAMIC_PREFIX)) return null;\n const code = normalized.slice(NOWPAYMENTS_DYNAMIC_PREFIX.length);\n return NOWPAYMENTS_CURRENCY_CODE.test(code) ? code : null;\n}\n\n/** `USDT_TRC20` → `USDT (TRC20)`; known chains map to their display names. */\nexport function cryptoCoinLabel(coinKey: string): string {\n const dynamic = parseDynamicNowPaymentsCurrency(coinKey);\n if (dynamic) return dynamic;\n const upper = coinKey.trim().toUpperCase();\n if (CRYPTO_COIN_LABELS[upper]) return CRYPTO_COIN_LABELS[upper];\n const [symbol, ...network] = upper.split(/[_:]+/);\n return network.length > 0 ? `${symbol} (${network.join(' ')})` : symbol;\n}\n\nexport type PaymentMethodSource = {\n /** The internal rail. Only ever shown when nothing more concrete exists. */\n gateway: string;\n displayName: string | null;\n cryptoGateway: string | null;\n blockchain: string | null;\n apmMethod: string | null;\n};\n\n/**\n * displayName → apmMethod → coin → rail label. Each step is more specific\n * about what the buyer chose than the one after it.\n */\nexport function paymentMethodLabel(payment: PaymentMethodSource): string {\n if (payment.displayName) return payment.displayName;\n if (payment.apmMethod) return payment.apmMethod;\n // Crypto payments show the concrete coin; the rail stays internal.\n if (payment.cryptoGateway) return cryptoCoinLabel(payment.cryptoGateway);\n const base = GATEWAY_LABELS[payment.gateway] ?? payment.gateway;\n return payment.blockchain ? `${base} (${payment.blockchain})` : base;\n}\n","import type { SdkCustomerWarranty, SdkCustomerWarrantyClaimStatus } from '../sdk';\n\n/**\n * The order detail's warranty half, decided without a word of prose.\n *\n * The route filters on `invoices.uniqid` when it is given one, which is the id\n * the order on screen carries, so a detail asks for its own cover by name.\n * There is no line-item id on that wire, so a warranty cannot be attached to\n * the row that sold it — it belongs to the order, and this is why the order\n * detail carries one warranty section rather than a chip inside each line.\n */\n\nexport function warrantiesForOrder(\n warranties: readonly SdkCustomerWarranty[],\n invoiceUniqid: string,\n): SdkCustomerWarranty[] {\n return warranties.filter((warranty) => warranty.invoice_uniqid === invoiceUniqid);\n}\n\n/**\n * What the buyer is covered for, and until when.\n *\n * A VOIDED warranty carries an `expires_at` like any other row, and printing it\n * would tell a buyer whose cover was cancelled that they are protected until\n * next March. Cancelled cover names no date at all, which is why that variant\n * has no field to name one with.\n *\n * The two that do keep the producer's own string rather than a parsed Date: the\n * panel's date formatter prints an unreadable timestamp as it came instead of\n * as \"Invalid Date\", and a Date built here would have thrown that away.\n */\nexport type WarrantyCoverage =\n | { kind: 'covered'; expiresAt: string }\n | { kind: 'ended'; expiresAt: string }\n | { kind: 'cancelled' };\n\nexport function warrantyCoverage(warranty: SdkCustomerWarranty): WarrantyCoverage {\n switch (warranty.status) {\n case 'ACTIVE':\n return { kind: 'covered', expiresAt: warranty.expires_at };\n case 'EXPIRED':\n return { kind: 'ended', expiresAt: warranty.expires_at };\n case 'VOIDED':\n return { kind: 'cancelled' };\n }\n}\n\nconst CLAIM_KEYS: Readonly<Record<SdkCustomerWarrantyClaimStatus, string>> = {\n REQUESTED: 'orders.warrantyClaimSubmitted',\n APPROVED: 'orders.warrantyClaimApproved',\n DENIED: 'orders.warrantyClaimDeclined',\n};\n\n/** Null when nothing was ever claimed — the row then says only what it covers. */\nexport function warrantyClaimKey(status: SdkCustomerWarrantyClaimStatus | null): string | null {\n return status === null ? null : CLAIM_KEYS[status];\n}\n\n/**\n * A producer timestamp, read the way the producer wrote it: naive strings\n * (\"2027-08-05 00:00:00.000\") are UTC, not local time. Only the claim GATE\n * parses — displayed dates keep the producer's own string (see above).\n */\nfunction parseWarrantyTimestamp(value: string): number | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n const hasTimezone = /(?:Z|[+-]\\d{2}(?::?\\d{2})?)$/i.test(trimmed);\n const hasTimePart = trimmed.includes(' ') || trimmed.includes('T');\n const normalized = hasTimezone || !hasTimePart ? trimmed : `${trimmed.replace(' ', 'T')}Z`;\n const parsed = Date.parse(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\n/**\n * The producer's timestamp as a Date for display, or the string as it came\n * when it cannot be read — the panel's formatter then prints the original\n * rather than \"Invalid Date\". Same UTC rule as the claim gate: a naive\n * PostgreSQL timestamp is UTC, not the buyer's local zone.\n */\nexport function warrantyDate(value: string): Date | string {\n const parsed = parseWarrantyTimestamp(value);\n return parsed === null ? value : new Date(parsed);\n}\n\n/**\n * Whether a claim can still be made.\n *\n * All three halves matter. Cover that ended or was cancelled has nothing left\n * to claim against, and a claim the shop is still reading — or has approved —\n * would take a second one nobody asked for. A DECLINED claim is the exception\n * the route itself makes: `requestClaim` refuses only a pending or approved\n * one, and takes a declined warranty back to REQUESTED. And a stored ACTIVE\n * whose `expires_at` has already passed is a sweep that has not run yet, not\n * live cover — the route refuses the crossed timestamp regardless of the\n * status, so a control shown for it would reliably answer 409. An unreadable\n * timestamp fails closed.\n */\nexport function canClaimWarranty(warranty: SdkCustomerWarranty, now: Date = new Date()): boolean {\n if (warranty.status !== 'ACTIVE') return false;\n if (warranty.claim_status !== null && warranty.claim_status !== 'DENIED') return false;\n const expires = parseWarrantyTimestamp(warranty.expires_at);\n return expires !== null && expires > now.getTime();\n}\n\n/** The producer's ceiling for the message a buyer may attach to a claim. */\nexport const WARRANTY_CLAIM_MESSAGE_MAX = 2000;\n\n/**\n * The buyer's own words, or nothing at all.\n *\n * The field is optional upstream, and sending an empty string is not the same\n * as omitting it: it stores a blank message the shop then reads as \"the buyer\n * had nothing to say\" rather than \"the buyer did not write anything\".\n */\nexport function warrantyClaimMessage(input: string): string | undefined {\n const message = input.trim();\n return message.length === 0 ? undefined : message;\n}\n","/**\n * The account overview: who is signed in, what the shop is holding for them,\n * and the last few orders.\n *\n * One request carries all of it. `dashboard()` is the overview payload and the\n * collection route for five other panels, so everything on this screen comes out\n * of a single response — nothing is counted in the browser and nothing is filled\n * in where the server sent nothing. A buyer never reads a figure this storefront\n * made up.\n */\n\nimport { Link } from 'react-router-dom';\nimport { accountTabHref } from '../account-route';\nimport { t } from './i18n';\nimport { ArrowRightIcon } from './icons';\nimport { OrderRow, orderRowTitle } from './orders';\nimport { useAccountDashboard } from './dashboard';\nimport {\n AccountCard,\n AccountEmpty,\n AccountError,\n AccountRowsSkeleton,\n AccountSectionTitle,\n formatAccountAmount,\n formatInvoiceAmount,\n} from './shared';\n\n/** As many as the panel can show without becoming the orders page. */\nconst RECENT_ORDER_COUNT = 5;\n\nexport function AccountOverview() {\n const { state, reload } = useAccountDashboard();\n\n if (state.status === 'loading') {\n return <AccountRowsSkeleton rows={4} label={t('overview.loading')} />;\n }\n\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n const account = state.data;\n const recentOrders = account.invoices.slice(0, RECENT_ORDER_COUNT);\n\n return (\n <div className=\"sxa:space-y-6\">\n <AccountCard className=\"sxa:px-6 sxa:py-6\">\n <p className=\"sxa:text-small sxa:text-muted\">{t('overview.signedInAs')}</p>\n <p className=\"sxa:font-heading sxa:mt-1 sxa:truncate sxa:text-h3 sxa:font-semibold\">{account.customer.name}</p>\n <p className=\"sxa:mt-0.5 sxa:truncate sxa:text-small sxa:text-muted\">{account.customer.email}</p>\n </AccountCard>\n\n {/* Four counters the server keeps. Each is printed as it arrived — none of\n them is the length of a list this page happens to be holding. */}\n <div className=\"sxa:grid sxa:grid-cols-2 sxa:gap-3 sxa:sm:grid-cols-4\">\n <StatTile label={t('overview.statOrders')} value={account.stats.invoices_count} />\n <StatTile label={t('overview.statLicenses')} value={account.stats.licenses_count} />\n <StatTile label={t('overview.statDownloads')} value={account.stats.deliverables_count} />\n <StatTile label={t('overview.statTickets')} value={account.stats.tickets_count} />\n </div>\n\n {/*\n Store credit is a section, not a tab, and it exists only for shops that\n run one: `wallet` is null otherwise, and that null IS the gate. Printing\n a zero balance for a shop with no wallet would advertise a feature the\n merchant never switched on.\n\n The balance is read from this payload and never adjusted here.\n */}\n {account.wallet && account.wallet.enabled ? (\n <AccountCard className=\"sxa:px-6 sxa:py-6\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-baseline sxa:justify-between sxa:gap-3\">\n <div>\n <p className=\"sxa:text-small sxa:text-muted\">{t('overview.walletLabel')}</p>\n <p className=\"sxa:mt-1 sxa:text-h2 sxa:font-bold sxa:tabular-nums\">\n {formatAccountAmount(account.wallet.available, account.wallet.currency)}\n </p>\n </div>\n <p className=\"sxa:text-small sxa:text-muted\">{t('overview.walletNote')}</p>\n </div>\n </AccountCard>\n ) : null}\n\n <section>\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:justify-between sxa:gap-4\">\n <AccountSectionTitle>{t('overview.recentOrders')}</AccountSectionTitle>\n {recentOrders.length ? (\n <Link\n to={accountTabHref('orders')}\n className=\"sxa:inline-flex sxa:items-center sxa:gap-1.5 sxa:text-small sxa:transition-opacity sxa:hover:opacity-80\"\n >\n {t('overview.allOrders')}\n <ArrowRightIcon className=\"sxa:h-4 sxa:w-4 sxa:shrink-0\" />\n </Link>\n ) : null}\n </div>\n\n <div className=\"sxa:mt-4\">\n {recentOrders.length === 0 ? (\n <AccountEmpty\n title={t('orders.emptyTitle')}\n body={t('orders.emptyBody')}\n action={(\n <Link to=\"/all-products\" className=\"sx-account-button sxa:card-button sxa:card-button--add\">\n {t('common.browseStore')}\n </Link>\n )}\n />\n ) : (\n <ul className=\"sxa:space-y-3\">\n {recentOrders.map((order) => (\n <li key={order.uniqid}>\n {/*\n The dashboard spells its order rows in snake_case while the\n orders list spells the same fields in camelCase. Both are the\n producer's own naming, so neither is renamed on the way in —\n the mapping happens here, at the row.\n */}\n <OrderRow\n uniqid={order.uniqid}\n title={orderRowTitle(\n order.line_items[0]?.product_title,\n order.line_items.length,\n order.uniqid,\n )}\n createdAt={order.created_at}\n amount={formatInvoiceAmount(order.total_display, order.total, order.currency)}\n status={order.status}\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n </section>\n </div>\n );\n}\n\nfunction StatTile({ label, value }: { label: string; value: number }) {\n return (\n <div className=\"sxa:rounded-input sxa:border sxa:bg-bg sxa:px-4 sxa:py-4\">\n <p className=\"sxa:text-h2 sxa:font-bold sxa:tabular-nums\">{value}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{label}</p>\n </div>\n );\n}\n","import type { SdkCustomerAffiliateLink, SdkCustomerAffiliateSummary } from '../sdk';\n\n/**\n * The referrals panel's pure half.\n *\n * Read-only by design. Converting a referral balance into store credit and\n * requesting a payout both move money toward the buyer, and ADR-0064 keeps\n * money paths off the account API for good — theme code shares the origin with\n * the session cookie, so an allowlisted payout endpoint would be a transaction\n * primitive sitting next to untrusted markup. The panel therefore shows what\n * has been earned and says where the payout is arranged.\n *\n * Nothing here adds two balances together either. The server sends five\n * figures; summing them into a friendlier one produces a number no other\n * surface agrees with.\n */\n\n/**\n * Whether the buyer is in the programme at all.\n *\n * `not_enrolled` is the availability gate the hosted portal used to hide the\n * whole tab. This template keeps the tab reachable — its link may already be in\n * a sent email — and answers with the state instead, which tells the buyer\n * something true rather than showing an empty balance sheet.\n */\nexport function isEnrolledInReferrals(summary: SdkCustomerAffiliateSummary): boolean {\n return summary.state !== 'not_enrolled';\n}\n\n/**\n * The link a buyer shares, or null when the server built none.\n *\n * The URL is the server's: it knows the shop's own storefront host. Assembling\n * one here out of the current origin would hand out a link that works from\n * wherever the buyer happens to be standing, including a preview host.\n */\nexport function referralShareUrl(link: SdkCustomerAffiliateLink): string | null {\n const url = link.url?.trim();\n return url ? url : null;\n}\n\n/** A link the shop has not approved yet earns nothing if it is shared today. */\nexport function isAwaitingApproval(link: SdkCustomerAffiliateLink): boolean {\n return link.status === 'pending';\n}\n\nconst CLAIM_TYPE_KEYS: Readonly<Record<string, string>> = {\n STORE_CREDIT: 'referrals.claimStoreCredit',\n CRYPTO_PAYOUT_REQUEST: 'referrals.claimCryptoPayout',\n MIGRATION_ADJUSTMENT: 'referrals.claimAdjustment',\n};\n\n/** Null for a claim type this catalog does not know — the raw value is shown. */\nexport function claimTypeKey(type: string): string | null {\n return CLAIM_TYPE_KEYS[type] ?? null;\n}\n\n/**\n * Whether the referral balance is held in a different currency than the shop\n * prices in, which is worth saying before a buyer compares the two numbers.\n */\nexport function isForeignBalanceCurrency(\n summary: SdkCustomerAffiliateSummary,\n shopCurrency: string,\n): boolean {\n return summary.balance_currency.toUpperCase() !== shopCurrency.toUpperCase();\n}\n\n","/**\n * What the buyer has earned by sending other buyers to this shop.\n *\n * Read-only, and deliberately so. The hosted portal let an affiliate turn a\n * balance into store credit and request a crypto payout; both move money toward\n * the buyer, and ADR-0064 keeps money paths off the account API — theme code\n * runs on the same origin as the session cookie, so an allowlisted payout would\n * be a transaction primitive standing next to untrusted markup. This panel\n * shows the standing and says where the payout is arranged. Issuing a link is\n * the same story: `POST /affiliate/links` is not allowlisted either, so the\n * links below are the ones the shop issued.\n */\n\nimport {\n claimTypeKey,\n isAwaitingApproval,\n isEnrolledInReferrals,\n isForeignBalanceCurrency,\n referralShareUrl,\n} from './account-referrals';\nimport { safeExternalHref } from './customer-account';\nimport type { SdkCustomerAffiliateLink } from '../sdk';\nimport { t } from './i18n';\nimport { ExternalLinkIcon } from './icons';\nimport { useAccountDashboard } from './dashboard';\nimport {\n AccountCard,\n AccountEmpty,\n AccountError,\n AccountRowsSkeleton,\n AccountSectionTitle,\n CopyButton,\n StatusChip,\n formatAccountAmount,\n formatAccountDate,\n statusLabel,\n} from './shared';\n\nexport function AccountReferrals() {\n const { state, reload } = useAccountDashboard();\n\n if (state.status === 'loading') {\n return <AccountRowsSkeleton rows={3} label={t('referrals.loading')} />;\n }\n\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n const summary = state.data.affiliate;\n\n /*\n * `not_enrolled` is the shop's answer, not an empty list. The hosted portal\n * hid the whole tab on it; this template keeps the tab reachable — the link\n * may already be sitting in a sent email — and says what the state is instead\n * of showing a balance sheet full of zeroes.\n */\n if (!isEnrolledInReferrals(summary)) {\n return (\n <AccountEmpty title={t('referrals.notEnrolledTitle')} body={t('referrals.notEnrolledBody')} />\n );\n }\n\n const { balances, balance_currency: currency } = summary;\n\n return (\n <div className=\"sxa:space-y-8\">\n <div>\n <AccountCard className=\"sxa:p-6 sxa:md:p-7\">\n <p className=\"sxa:text-small sxa:text-muted\">{t('referrals.availableLabel')}</p>\n <p className=\"sxa:mt-1 sxa:text-h1 sxa:font-bold sxa:tabular-nums\">\n {formatAccountAmount(balances.available, currency)}\n </p>\n <p className=\"sxa:mt-3 sxa:text-small sxa:text-muted\">{t('referrals.payoutsElsewhere')}</p>\n </AccountCard>\n\n {/*\n Four separate figures, exactly as the server sends them. Folding\n \"converted\" and \"paid\" into one friendlier \"withdrawn\" total would put\n a number on screen that no other Shoppex surface reports.\n */}\n <div className=\"sxa:mt-4 sxa:grid sxa:grid-cols-2 sxa:gap-4 sxa:sm:grid-cols-4\">\n <BalanceTile\n label={t('referrals.pendingLabel')}\n amount={balances.pending}\n currency={currency}\n />\n <BalanceTile\n label={t('referrals.requestedLabel')}\n amount={balances.requested}\n currency={currency}\n />\n <BalanceTile\n label={t('referrals.convertedLabel')}\n amount={balances.converted}\n currency={currency}\n />\n <BalanceTile\n label={t('referrals.paidLabel')}\n amount={balances.paid}\n currency={currency}\n />\n </div>\n\n {isForeignBalanceCurrency(summary, state.data.shop.currency) ? (\n <p className=\"sxa:mt-3 sxa:text-small sxa:text-muted\">\n {t('referrals.differentCurrency', { currency })}\n </p>\n ) : null}\n </div>\n\n <section>\n <AccountSectionTitle>{t('referrals.linksTitle')}</AccountSectionTitle>\n <p className=\"sxa:mt-1 sxa:text-small sxa:text-muted\">\n {summary.affiliate_codes_accepted_at_checkout\n ? t('referrals.codesAccepted')\n : t('referrals.codesNotAccepted')}\n </p>\n <div className=\"sxa:mt-4\">\n {summary.links.length === 0 ? (\n <AccountEmpty\n title={t('referrals.linksEmptyTitle')}\n body={t('referrals.linksEmptyBody')}\n />\n ) : (\n <ul className=\"sxa:space-y-4\">\n {summary.links.map((link) => (\n <li key={link.id}>\n <ReferralLinkCard link={link} currency={currency} />\n </li>\n ))}\n </ul>\n )}\n </div>\n </section>\n\n <section>\n <AccountSectionTitle>{t('referrals.commissionsTitle')}</AccountSectionTitle>\n <div className=\"sxa:mt-4\">\n {summary.commissions.length === 0 ? (\n <AccountEmpty\n title={t('referrals.commissionsEmptyTitle')}\n body={t('referrals.commissionsEmptyBody')}\n />\n ) : (\n <ul className=\"sxa:space-y-4\">\n {summary.commissions.map((commission) => (\n <li\n key={commission.id}\n className=\"sxa:flex sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:shadow-card\"\n >\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">\n {t('referrals.commissionFor', { id: commission.invoice_id })}\n </p>\n {/* `created_at` is nullable on this row. No date is printed\n when the producer sent none. */}\n {commission.created_at ? (\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {formatAccountDate(commission.created_at)}\n </p>\n ) : null}\n </div>\n <span className=\"sxa:shrink-0 sxa:text-small sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(commission.commission_amount, currency)}\n </span>\n <StatusChip status={commission.status} />\n </li>\n ))}\n </ul>\n )}\n </div>\n </section>\n\n <section>\n <AccountSectionTitle>{t('referrals.balanceTitle')}</AccountSectionTitle>\n <div className=\"sxa:mt-4\">\n {summary.claims.length === 0 ? (\n <AccountEmpty\n title={t('referrals.balanceEmptyTitle')}\n body={t('referrals.balanceEmptyBody')}\n />\n ) : (\n <ul className=\"sxa:space-y-4\">\n {summary.claims.map((claim) => {\n const typeKey = claimTypeKey(claim.type);\n return (\n <li\n key={claim.id}\n className=\"sxa:flex sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:shadow-card\"\n >\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n {/* An unlisted claim type keeps the producer's own word\n rather than being renamed into one we recognise. */}\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">\n {typeKey ? t(typeKey) : statusLabel(claim.type)}\n </p>\n {claim.created_at ? (\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {formatAccountDate(claim.created_at)}\n </p>\n ) : null}\n </div>\n <span className=\"sxa:shrink-0 sxa:text-small sxa:font-semibold sxa:tabular-nums\">\n {/* The claim carries its own currency; the balance\n currency above is not necessarily the same one. */}\n {formatAccountAmount(claim.amount, claim.currency)}\n </span>\n <StatusChip status={claim.status} />\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </section>\n </div>\n );\n}\n\nfunction BalanceTile({\n label,\n amount,\n currency,\n}: {\n label: string;\n amount: string;\n currency: string;\n}) {\n return (\n <AccountCard className=\"sxa:p-5\">\n <p className=\"sxa:text-h3 sxa:font-semibold sxa:tabular-nums\">{formatAccountAmount(amount, currency)}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{label}</p>\n </AccountCard>\n );\n}\n\nfunction ReferralLinkCard({\n link,\n currency,\n}: {\n link: SdkCustomerAffiliateLink;\n currency: string;\n}) {\n /*\n * The shareable URL is the SERVER's — it knows the shop's own storefront\n * host. Assembling one from whatever origin this bundle happens to be loaded\n * from would hand out a link that works from a preview domain and nowhere\n * else. It is also nullable: a shop with no storefront URL to build one from\n * gets `null`, and then there is no link row to draw — but the code beside it\n * is still the buyer's, so that is what the row carries.\n *\n * `safeExternalHref` runs before anything is rendered as an anchor. The URL\n * ultimately comes from merchant-controlled data, and `javascript:` is a URL:\n * an anchor carrying one executes on the buyer's own origin, with their\n * session. A scheme that does not survive the check is dropped rather than\n * shown, so nothing invites the buyer to copy it either.\n */\n const shareUrl = safeExternalHref(referralShareUrl(link));\n const shareValue = shareUrl ?? link.code;\n\n return (\n <AccountCard className=\"sxa:p-5\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-3\">\n <div className=\"sxa:min-w-0\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{link.label ?? link.code}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {t('referrals.commission', { percent: link.effective_commission_percent })}\n {' · '}\n {t('referrals.buyerDiscount', { percent: link.effective_customer_discount_percent })}\n </p>\n </div>\n <div className=\"sxa:flex sxa:shrink-0 sxa:items-center sxa:gap-2\">\n {link.is_primary ? (\n <span className=\"sx-account-chip sxa:meta-chip sxa:meta-chip--neutral sxa:shrink-0\">{t('referrals.primary')}</span>\n ) : null}\n <StatusChip status={link.status} />\n </div>\n </div>\n\n {isAwaitingApproval(link) ? (\n <p className=\"sxa:mt-3 sxa:text-small sxa:text-muted\">{t('referrals.awaitingApproval')}</p>\n ) : null}\n\n <div className=\"sxa:mt-3 sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2\">\n <code className=\"sxa:min-w-0 sxa:flex-1 sxa:truncate sxa:rounded-input sxa:border sxa:bg-bg sxa:px-3 sxa:py-2 sxa:font-mono sxa:text-micro\">\n {shareValue}\n </code>\n <div className=\"sxa:flex sxa:shrink-0 sxa:items-center sxa:gap-2\">\n {shareUrl ? (\n <a\n href={shareUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add\"\n >\n <ExternalLinkIcon className=\"sxa:h-3.5 sxa:w-3.5\" />\n {/* `downloads.openLink` is the catalog's one label for \"this\n anchor leaves the storefront\", and it is written generically\n enough to be it here too. */}\n <span className=\"sxa:ml-1.5\">{t('downloads.openLink')}</span>\n </a>\n ) : null}\n <CopyButton value={shareValue} />\n </div>\n </div>\n\n <dl className=\"sxa:mt-4 sxa:grid sxa:grid-cols-3 sxa:gap-4 sxa:border-t sxa:pt-4\">\n <StatCell label={t('referrals.clicks')} value={String(link.total_clicks)} />\n <StatCell label={t('referrals.sales')} value={String(link.total_sales)} />\n <StatCell\n label={t('referrals.revenue')}\n value={formatAccountAmount(link.total_revenue, currency)}\n />\n </dl>\n </AccountCard>\n );\n}\n\nfunction StatCell({ label, value }: { label: string; value: string }) {\n return (\n <div>\n <dt className=\"sxa:text-micro sxa:text-muted\">{label}</dt>\n <dd className=\"sxa:mt-1 sxa:text-small sxa:font-semibold sxa:tabular-nums\">{value}</dd>\n </div>\n );\n}\n","/**\n * The wholesale account.\n *\n * The producer's relationship has FIVE states and this panel answers each of\n * them separately: ACTIVE gets the working surface, APPLIED gets \"your\n * application is with the shop\", SUSPENDED and REJECTED each get their own\n * sentence, and INVITED — like having no relationship at all — goes to the entry\n * form. There is no PENDING. Folding two of those together tells a suspended\n * reseller they were rejected, or hands a rejected one a catalog.\n *\n * Three controls a wholesale surface would normally carry are ABSENT rather\n * than disabled: placing an order, minting an API key and creating a wallet\n * top-up. The storefront edge allowlists none of those mutations\n * (`workers/storefront/src/customer-api.ts`).\n *\n * Pricing a basket stays, because it writes nothing. The quoted total is the\n * only total shown, and a basket that has moved since its quote shows no total\n * at all rather than the one that no longer applies.\n */\n\nimport { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport {\n RESELLER_QUANTITY_MAX_UNITS,\n RESELLER_QUANTITY_MIN_UNITS,\n narrowResellerApiKeys,\n narrowResellerCatalog,\n narrowResellerMutation,\n narrowResellerOrderDetail,\n narrowResellerOrders,\n narrowResellerProgram,\n narrowResellerQuote,\n narrowResellerWallet,\n quoteMatchesBasket,\n resellerBasketKey,\n resellerEntryMode,\n type ResellerCatalogItem,\n type ResellerCatalogVariant,\n type ResellerOrderItemInput,\n type ResellerOrderLine,\n type ResellerOrderListItem,\n type ResellerProgramState,\n type ResellerQuote,\n type ResellerRelationship,\n} from './account-reseller';\nimport { callCustomerApi } from './customer-account';\nimport {\n clearAccountResellerInvite,\n peekAccountResellerInvite,\n} from './account-reseller-invite';\nimport type { SdkResponse, ShoppexSdk } from '../sdk';\nimport { t } from './i18n';\nimport { SearchIcon } from './icons';\nimport {\n AccountBackButton,\n AccountCard,\n AccountEmpty,\n AccountError,\n AccountFieldError,\n AccountRowsSkeleton,\n AccountSectionTitle,\n BusySpinner,\n CopyButton,\n StatusChip,\n formatAccountAmount,\n formatAccountDate,\n formatAccountDateTime,\n useAccountResource,\n} from './shared';\nimport { useAccountResellerProgram } from './dashboard';\n\n/** The contact form's control skin — see `components/contact/contact-form.tsx`. */\nconst FIELD =\n 'sx-account-field sxa:w-full sxa:rounded-card sxa:border sxa:bg-[color-mix(in_oklab,_var(--sx-bg)_40%,_transparent)] sxa:px-3 sxa:py-2.5 sxa:text-small sxa:shadow-card sxa:placeholder:text-muted sxa:focus-visible:border-accent sxa:focus-visible:ring-[3px] sxa:focus-visible:ring-[color-mix(in_oklab,_var(--sx-accent)_50%,_transparent)] sxa:focus-visible:outline-none';\n\nconst PAGE_SIZE = 20;\n\n/** One basket row: what the producer needs, plus the words to show it by. */\ninterface BasketLine extends ResellerOrderItemInput {\n title: string;\n variant_title: string | null;\n}\n\n/** A quote, pinned to the exact basket it priced. */\ninterface PricedBasket {\n basketKey: string;\n quote: ResellerQuote;\n}\n\nexport function AccountReseller() {\n /*\n * The SAME response the navigation gate reads. Two separate reads could\n * disagree — the gate's failing while this one succeeded — and the buyer\n * would be shown an active wholesale account by a panel the navigation had\n * just dropped the tab for. Retrying here reopens the gate with it.\n */\n const { state, reload } = useAccountResellerProgram();\n\n if (state.status === 'loading') {\n return <AccountRowsSkeleton rows={4} label={t('overview.loading')} />;\n }\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n const narrowed = narrowResellerProgram(state.data);\n if (!narrowed.ok) {\n return <AccountError message={t('common.genericError')} onRetry={reload} />;\n }\n const program = narrowed.data;\n\n if (!program.program_enabled) {\n return (\n <AccountEmpty\n title={t('reseller.disabledTitle')}\n body={t('reseller.disabledBody')}\n />\n );\n }\n\n const reseller = program.reseller;\n const status = reseller?.status;\n\n if (reseller && status === 'ACTIVE') {\n return <ActiveReseller relationship={reseller} />;\n }\n\n if (status === 'APPLIED') {\n return (\n <AccountEmpty\n title={t('reseller.pendingTitle')}\n body={t('reseller.pendingBody')}\n />\n );\n }\n\n if (status === 'SUSPENDED') {\n return (\n <AccountEmpty\n title={t('reseller.suspendedTitle')}\n body={t('reseller.suspendedBody')}\n />\n );\n }\n\n if (status === 'REJECTED') {\n return (\n <AccountEmpty\n title={t('reseller.rejectedTitle')}\n body={t('reseller.rejectedBody')}\n />\n );\n }\n\n // INVITED and \"no relationship at all\" are the two ways into the program, and\n // `resellerEntryMode` is what tells them apart from the shop's own mode.\n return <ResellerEntry program={program} onDone={reload} />;\n}\n\nfunction ResellerEntry({\n program,\n onDone,\n}: {\n program: ResellerProgramState;\n onDone: () => void;\n}) {\n const fieldId = useId();\n const [note, setNote] = useState('');\n const [token, setToken] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const attemptedInviteToken = useRef<string | null>(null);\n\n useEffect(() => {\n // The cookie belongs to the invited email. Another authenticated buyer must\n // be able to switch accounts while the cookie lives.\n if (program.reseller?.status !== 'INVITED') return;\n\n const inviteToken = peekAccountResellerInvite(document);\n if (!inviteToken || attemptedInviteToken.current === inviteToken) return;\n attemptedInviteToken.current = inviteToken;\n\n setBusy(true);\n setError(null);\n void (async () => {\n const result = await callCustomerApi((sdk) => sdk.acceptResellerInvite(inviteToken));\n setBusy(false);\n\n // Only success spends the cookie: a failure can mean this browser is\n // signed into another invited customer, and the actually invited one\n // still needs the token after switching accounts.\n if (!result.success) {\n setToken(inviteToken);\n setError(result.message?.trim() || t('common.genericError'));\n return;\n }\n if (!narrowResellerMutation(result.data).ok) {\n setToken(inviteToken);\n setError(t('common.genericError'));\n return;\n }\n clearAccountResellerInvite(document);\n onDone();\n })();\n }, [program.reseller?.status, onDone]);\n\n const run = async (operation: (sdk: ShoppexSdk) => Promise<SdkResponse<unknown>>) => {\n setBusy(true);\n setError(null);\n const result = await callCustomerApi(operation);\n setBusy(false);\n\n if (!result.success) {\n setError(result.message?.trim() || t('common.genericError'));\n return;\n }\n // The enrolment routes answer with the relationship they just wrote. A body\n // that is not one is not proof of anything, so it is not celebrated.\n if (!narrowResellerMutation(result.data).ok) {\n setError(t('common.genericError'));\n return;\n }\n onDone();\n };\n\n /*\n * Not `program.enrollment_mode`. An invitation outranks the shop's mode:\n * `ResellerEnrollmentService.invite` only requires an ENABLED program, so a\n * shop taking open sign-ups can still have invited this buyer. Offering them\n * the join button offers the one call the producer answers 409 to, while the\n * token in their mail has nowhere to go.\n */\n const entry = resellerEntryMode(program);\n\n if (entry === 'OPEN') {\n return (\n <AccountEmpty\n title={t('reseller.openTitle')}\n body={program.application_message ?? t('reseller.openBody')}\n action={(\n <button\n type=\"button\"\n disabled={busy}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => void run((sdk) => sdk.enrollAsReseller())}\n >\n {busy ? <BusySpinner className=\"sxa:mr-1.5\" /> : null}\n {t('reseller.join')}\n </button>\n )}\n />\n );\n }\n\n if (entry === 'MANUAL') {\n return (\n <AccountCard className=\"sxa:mx-auto sxa:max-w-xl sxa:p-6\">\n <h2 className=\"sxa:font-heading sxa:text-body sxa:font-semibold\">{t('reseller.manualTitle')}</h2>\n <p className=\"sxa:mt-2 sxa:text-small sxa:leading-relaxed sxa:text-muted\">\n {program.application_message ?? t('reseller.manualBody')}\n </p>\n <form\n noValidate\n className=\"sxa:mt-5\"\n onSubmit={(event) => {\n event.preventDefault();\n void run((sdk) => sdk.acceptResellerInvite(token.trim()));\n }}\n >\n <label htmlFor={`${fieldId}-token`} className=\"sxa:mb-1.5 sxa:block sxa:text-small sxa:font-medium\">\n {t('reseller.inviteToken')}\n </label>\n <input\n id={`${fieldId}-token`}\n type=\"text\"\n value={token}\n disabled={busy}\n aria-invalid={error ? true : undefined}\n onChange={(event) => {\n setToken(event.target.value);\n setError(null);\n }}\n className={FIELD}\n />\n {error ? <AccountFieldError message={error} /> : null}\n <button\n type=\"submit\"\n disabled={busy || token.trim().length === 0}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:mt-5 sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {busy ? <BusySpinner className=\"sxa:mr-1.5\" /> : null}\n {t('reseller.acceptInvite')}\n </button>\n </form>\n </AccountCard>\n );\n }\n\n const apply = () => {\n if (program.require_application_note && note.trim().length === 0) {\n setError(t('reseller.noteRequired'));\n return;\n }\n void run((sdk) => sdk.applyForReseller(note.trim() || undefined));\n };\n\n return (\n <AccountCard className=\"sxa:mx-auto sxa:max-w-xl sxa:p-6\">\n <h2 className=\"sxa:font-heading sxa:text-body sxa:font-semibold\">{t('reseller.applicationTitle')}</h2>\n <p className=\"sxa:mt-2 sxa:text-small sxa:leading-relaxed sxa:text-muted\">\n {program.application_message ?? t('reseller.applicationBody')}\n </p>\n <form\n noValidate\n className=\"sxa:mt-5\"\n onSubmit={(event) => {\n event.preventDefault();\n apply();\n }}\n >\n <label htmlFor={`${fieldId}-note`} className=\"sxa:mb-1.5 sxa:block sxa:text-small sxa:font-medium\">\n {t('reseller.applicationNote')}\n </label>\n <textarea\n id={`${fieldId}-note`}\n rows={4}\n value={note}\n disabled={busy}\n aria-invalid={error ? true : undefined}\n onChange={(event) => {\n setNote(event.target.value);\n setError(null);\n }}\n className={`${FIELD} sxa:resize-none`}\n />\n {error ? <AccountFieldError message={error} /> : null}\n <button\n type=\"submit\"\n disabled={busy}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:mt-5 sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {busy ? <BusySpinner className=\"sxa:mr-1.5\" /> : null}\n {t('reseller.apply')}\n </button>\n </form>\n </AccountCard>\n );\n}\n\nfunction ActiveReseller({ relationship }: { relationship: ResellerRelationship }) {\n /*\n * The basket lives HERE, above the catalog, because the catalog paginates and\n * a buyer builds one order across several pages. A basket owned by the list\n * would empty itself every time the buyer asked for more products.\n */\n const [basket, setBasket] = useState<BasketLine[]>([]);\n const [priced, setPriced] = useState<PricedBasket | null>(null);\n\n /** Any change to the basket retires the quote that priced the old one. */\n const replaceBasket = (next: BasketLine[]) => {\n setBasket(next);\n setPriced(null);\n };\n\n const add = (line: BasketLine) => {\n const existing = basket.findIndex(\n (entry) => entry.product_id === line.product_id && entry.variant_id === line.variant_id,\n );\n if (existing === -1) {\n replaceBasket([...basket, line]);\n return;\n }\n replaceBasket(basket.map((entry, index) => (\n index === existing\n ? { ...entry, quantity: Math.min(RESELLER_QUANTITY_MAX_UNITS, entry.quantity + 1) }\n : entry\n )));\n };\n\n const discount = relationship.tier?.discount_percent;\n\n return (\n <div className=\"sxa:space-y-8\">\n <section>\n <AccountSectionTitle>{t('reseller.activeTitle')}</AccountSectionTitle>\n <div className=\"sxa:mt-4 sxa:grid sxa:gap-3 sxa:sm:grid-cols-2\">\n <Metric\n label={t('reseller.tier')}\n value={relationship.tier?.name ?? t('common.unavailable')}\n />\n <Metric\n label={t('orders.discount')}\n value={discount === null || discount === undefined\n ? t('common.unavailable')\n : `${discount}%`}\n />\n {/*\n The relationship carries a lifetime figure and NO currency to read\n it in, so it is printed exactly as the producer spelled it. Running\n it through a formatter would mean picking a currency nobody sent.\n */}\n <Metric label={t('referrals.revenue')} value={relationship.lifetime_revenue} />\n <Metric label={t('overview.statOrders')} value={relationship.lifetime_orders} />\n </div>\n </section>\n\n <WholesaleWallet />\n <WholesaleCatalog onAdd={add} />\n <WholesaleBasket\n basket={basket}\n priced={priced}\n onBasketChange={replaceBasket}\n onPriced={setPriced}\n />\n <WholesaleOrders />\n <ResellerApiKeys />\n </div>\n );\n}\n\nfunction Metric({ label, value }: { label: string; value: string | number }) {\n return (\n <div className=\"sxa:rounded-input sxa:border sxa:bg-bg sxa:p-5\">\n <p className=\"sxa:truncate sxa:text-h3 sxa:font-semibold sxa:tabular-nums\">{value}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{label}</p>\n </div>\n );\n}\n\n/* --- Wholesale balance ---------------------------------------------------- */\n\nfunction WholesaleWallet() {\n const { state, reload } = useAccountResource('reseller-wallet', () =>\n callCustomerApi((sdk) => sdk.resellerWallet()));\n\n const heading = <AccountSectionTitle>{t('reseller.walletTitle')}</AccountSectionTitle>;\n\n if (state.status === 'loading') {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountRowsSkeleton rows={1} label={t('overview.loading')} />\n </div>\n </section>\n );\n }\n if (state.status === 'error') {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountError message={state.message} onRetry={reload} />\n </div>\n </section>\n );\n }\n\n const narrowed = narrowResellerWallet(state.data);\n if (!narrowed.ok) {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountError message={t('common.genericError')} onRetry={reload} />\n </div>\n </section>\n );\n }\n const wallet = narrowed.data;\n\n return (\n <section>\n {heading}\n <AccountCard className=\"sxa:mt-4 sxa:p-6\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:justify-between sxa:gap-3\">\n <p className=\"sxa:text-small sxa:font-medium\">{t('rewards.available')}</p>\n <StatusChip status={wallet.is_active ? 'ACTIVE' : 'INACTIVE'} />\n </div>\n <p className=\"sxa:mt-1 sxa:text-h2 sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(wallet.available, wallet.currency)}\n </p>\n\n <div className=\"sxa:mt-4 sxa:grid sxa:gap-3 sxa:sm:grid-cols-2\">\n <Metric\n label={t('reseller.balance')}\n value={formatAccountAmount(wallet.balance, wallet.currency)}\n />\n <Metric\n label={t('reseller.held')}\n value={formatAccountAmount(wallet.hold_balance, wallet.currency)}\n />\n </div>\n\n </AccountCard>\n </section>\n );\n}\n\n/* --- Paging --------------------------------------------------------------- */\n\ninterface PageSlice<T> {\n items: T[];\n page: number;\n perPage: number;\n total: number;\n}\n\ntype PageRead<T> = Promise<\n { ok: true; slice: PageSlice<T> } | { ok: false; message: string }\n>;\n\ntype PagedState<T> =\n | { status: 'loading' }\n | { status: 'error'; message: string }\n | { status: 'ready'; slice: PageSlice<T> };\n\n/**\n * A list that GROWS a page at a time.\n *\n * Both wholesale lists append rather than replace. The catalog has to: a basket\n * is built across pages, and swapping page one for page two would take the\n * products the buyer had just been looking at off the screen while their basket\n * still names them. The order history follows the same shape so the two read\n * alike.\n *\n * The page number advances only on a SUCCESSFUL read, and it advances to the\n * page the producer says it answered. A failed \"next\" leaves the list exactly\n * where it was, so pressing it again asks for the page that failed rather than\n * skipping it.\n */\nfunction usePagedList<T>(resetKey: string, read: (page: number) => PageRead<T>) {\n const [state, setState] = useState<PagedState<T>>({ status: 'loading' });\n const [attempt, setAttempt] = useState(0);\n const [moreBusy, setMoreBusy] = useState(false);\n const [moreError, setMoreError] = useState<string | null>(null);\n const readRef = useRef(read);\n readRef.current = read;\n const stateRef = useRef(state);\n stateRef.current = state;\n /** Bumped on every reset, so a page that arrives late cannot land in a list\n * the buyer has since re-filtered. */\n const generation = useRef(0);\n\n useEffect(() => {\n generation.current += 1;\n const mine = generation.current;\n setState({ status: 'loading' });\n setMoreBusy(false);\n setMoreError(null);\n\n void readRef.current(1).then((result) => {\n if (generation.current !== mine) return;\n setState(result.ok\n ? { status: 'ready', slice: result.slice }\n : { status: 'error', message: result.message });\n });\n }, [resetKey, attempt]);\n\n const loadMore = useCallback(() => {\n const current = stateRef.current;\n if (current.status !== 'ready') return;\n const mine = generation.current;\n setMoreBusy(true);\n setMoreError(null);\n\n void readRef.current(current.slice.page + 1).then((result) => {\n if (generation.current !== mine) return;\n setMoreBusy(false);\n if (!result.ok) {\n setMoreError(result.message);\n return;\n }\n setState((previous) => (previous.status === 'ready'\n ? {\n status: 'ready',\n slice: {\n items: [...previous.slice.items, ...result.slice.items],\n page: result.slice.page,\n perPage: result.slice.perPage,\n total: result.slice.total,\n },\n }\n : previous));\n });\n }, []);\n\n const reload = useCallback(() => setAttempt((value) => value + 1), []);\n\n return { state, moreBusy, moreError, loadMore, reload };\n}\n\nfunction hasMorePages<T>(slice: PageSlice<T>): boolean {\n return slice.page * slice.perPage < slice.total;\n}\n\nfunction MorePages({\n slice,\n busy,\n error,\n onMore,\n}: {\n slice: PageSlice<unknown>;\n busy: boolean;\n error: string | null;\n onMore: () => void;\n}) {\n const more = hasMorePages(slice);\n if (slice.page <= 1 && !more) return null;\n\n return (\n <div>\n <nav\n className=\"sxa:mt-4 sxa:flex sxa:flex-wrap sxa:items-center sxa:justify-between sxa:gap-3\"\n aria-label={t('orders.pagesLabel')}\n >\n <span className=\"sxa:text-micro sxa:text-muted\">{t('orders.page', { page: slice.page })}</span>\n <button\n type=\"button\"\n disabled={!more || busy}\n aria-busy={busy || undefined}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-40\"\n onClick={onMore}\n >\n {busy ? <BusySpinner className=\"sxa:mr-1.5\" /> : null}\n {t('orders.next')}\n </button>\n </nav>\n {error ? <AccountFieldError message={error} /> : null}\n </div>\n );\n}\n\n/* --- Catalog -------------------------------------------------------------- */\n\n/** One catalog row, carrying the currency the producer sent WITH its page. */\ninterface CatalogRow {\n item: ResellerCatalogItem;\n currency: string;\n}\n\nfunction WholesaleCatalog({ onAdd }: { onAdd: (line: BasketLine) => void }) {\n const searchId = useId();\n const [search, setSearch] = useState('');\n const [query, setQuery] = useState('');\n\n const { state, moreBusy, moreError, loadMore, reload } = usePagedList<CatalogRow>(\n `reseller-catalog:${query}`,\n async (page) => {\n const response = await callCustomerApi((sdk) => sdk.resellerCatalog({\n ...(query ? { search: query } : {}),\n page,\n per_page: PAGE_SIZE,\n }));\n if (!response.success) {\n return { ok: false, message: response.message?.trim() || t('common.genericError') };\n }\n const narrowed = narrowResellerCatalog(response.data);\n if (!narrowed.ok) return { ok: false, message: t('common.genericError') };\n\n const { catalog } = narrowed.data;\n return {\n ok: true,\n slice: {\n items: catalog.items.map((item) => ({ item, currency: catalog.currency })),\n page: catalog.page,\n perPage: catalog.per_page,\n total: catalog.total,\n },\n };\n },\n );\n\n const heading = (\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-end sxa:justify-between sxa:gap-3\">\n <AccountSectionTitle>{t('reseller.catalogTitle')}</AccountSectionTitle>\n <form\n noValidate\n className=\"sxa:flex sxa:items-center sxa:gap-2\"\n onSubmit={(event) => {\n event.preventDefault();\n // A new search restarts the list at page one. The basket is held\n // above this component, so it survives the reset intact.\n setQuery(search.trim());\n }}\n >\n <label htmlFor={searchId} className=\"sxa:sr-only\">\n {t('reseller.search')}\n </label>\n <input\n id={searchId}\n type=\"search\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n className={`${FIELD} sxa:w-36`}\n />\n <button\n type=\"submit\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add\"\n aria-label={t('reseller.search')}\n >\n <SearchIcon className=\"sxa:h-3 sxa:w-3\" />\n </button>\n </form>\n </div>\n );\n\n if (state.status === 'loading') {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountRowsSkeleton label={t('overview.loading')} />\n </div>\n </section>\n );\n }\n if (state.status === 'error') {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountError message={state.message} onRetry={reload} />\n </div>\n </section>\n );\n }\n\n const { slice } = state;\n\n return (\n <section>\n {heading}\n {slice.items.length === 0 ? (\n <div className=\"sxa:mt-4\">\n <AccountEmpty\n title={t('reseller.catalogEmptyTitle')}\n body={t('reseller.catalogEmptyBody')}\n />\n </div>\n ) : (\n <ul className=\"sxa:mt-4 sxa:space-y-3\">\n {slice.items.map((row) => (\n <li key={row.item.product_id}>\n <CatalogProduct item={row.item} currency={row.currency} onAdd={onAdd} />\n </li>\n ))}\n </ul>\n )}\n <MorePages slice={slice} busy={moreBusy} error={moreError} onMore={loadMore} />\n </section>\n );\n}\n\nfunction CatalogProduct({\n item,\n currency,\n onAdd,\n}: {\n item: ResellerCatalogItem;\n currency: string;\n onAdd: (line: BasketLine) => void;\n}) {\n return (\n <AccountCard className=\"sxa:p-5\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-3\">\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{item.title}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {formatAccountAmount(item.unit_price, currency)}\n {item.volume_discount_enabled ? ` · ${t('reseller.volumePricing')}` : ''}\n {item.supplier_backed ? ` · ${t('reseller.supplierBacked')}` : ''}\n </p>\n </div>\n {item.variants.length === 0 ? (\n item.orderable ? (\n <button\n type=\"button\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add\"\n onClick={() => onAdd({\n product_id: item.product_id,\n quantity: RESELLER_QUANTITY_MIN_UNITS,\n title: item.title,\n variant_title: null,\n })}\n >\n {t('reseller.add')}\n </button>\n ) : (\n <span className=\"sxa:text-micro sxa:text-muted\">{t('common.unavailable')}</span>\n )\n ) : null}\n </div>\n\n {item.variants.length > 0 ? (\n <ul className=\"sxa:mt-4 sxa:space-y-2 sxa:border-t sxa:pt-4\">\n {item.variants.map((variant) => (\n <CatalogVariant\n key={variant.variant_id}\n item={item}\n variant={variant}\n currency={currency}\n onAdd={onAdd}\n />\n ))}\n </ul>\n ) : null}\n </AccountCard>\n );\n}\n\nfunction CatalogVariant({\n item,\n variant,\n currency,\n onAdd,\n}: {\n item: ResellerCatalogItem;\n variant: ResellerCatalogVariant;\n currency: string;\n onAdd: (line: BasketLine) => void;\n}) {\n return (\n <li className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-3 sxa:rounded-input sxa:border sxa:bg-bg sxa:px-3 sxa:py-3\">\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small\">{variant.title}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {formatAccountAmount(variant.unit_price, currency)}\n {variant.supplier_backed ? ` · ${t('reseller.supplierBacked')}` : ''}\n </p>\n </div>\n {/* Both flags have to say yes: an orderable variant of an unorderable\n product is still not orderable. */}\n {item.orderable && variant.orderable ? (\n <button\n type=\"button\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add\"\n onClick={() => onAdd({\n product_id: item.product_id,\n variant_id: variant.variant_id,\n quantity: RESELLER_QUANTITY_MIN_UNITS,\n title: item.title,\n variant_title: variant.title,\n })}\n >\n {t('reseller.add')}\n </button>\n ) : (\n <span className=\"sxa:text-micro sxa:text-muted\">{t('common.unavailable')}</span>\n )}\n </li>\n );\n}\n\n/* --- Basket and quote ----------------------------------------------------- */\n\n/**\n * A typed quantity, as whole units.\n *\n * `ResellerOrderItemSchema` is `.int()`, and it rejects the WHOLE basket over\n * one fractional line rather than that line alone. The quote button is not a\n * form submit either, so the number input's implicit step never runs and a\n * typed `1.5` would travel all the way to that refusal. `Math.trunc`, never a\n * bare `Number`.\n */\nfunction wholesaleQuantity(raw: string): number {\n const units = Math.trunc(Number(raw));\n if (!Number.isFinite(units) || units < RESELLER_QUANTITY_MIN_UNITS) {\n return RESELLER_QUANTITY_MIN_UNITS;\n }\n return Math.min(RESELLER_QUANTITY_MAX_UNITS, units);\n}\n\nfunction WholesaleBasket({\n basket,\n priced,\n onBasketChange,\n onPriced,\n}: {\n basket: BasketLine[];\n priced: PricedBasket | null;\n onBasketChange: (basket: BasketLine[]) => void;\n onPriced: (priced: PricedBasket) => void;\n}) {\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const items: ResellerOrderItemInput[] = basket.map(({ product_id, variant_id, quantity }) => ({\n product_id,\n variant_id,\n quantity,\n }));\n const quoteIsCurrent = priced !== null && quoteMatchesBasket(priced.basketKey, items);\n\n const price = async () => {\n setBusy(true);\n setError(null);\n const result = await callCustomerApi((sdk) => sdk.quoteResellerOrder(items));\n setBusy(false);\n\n if (!result.success) {\n setError(result.message?.trim() || t('common.genericError'));\n return;\n }\n const narrowed = narrowResellerQuote(result.data);\n if (!narrowed.ok) {\n setError(t('common.genericError'));\n return;\n }\n onPriced({ basketKey: resellerBasketKey(items), quote: narrowed.data });\n };\n\n return (\n <section>\n <AccountSectionTitle>{t('reseller.basketTitle')}</AccountSectionTitle>\n <AccountCard className=\"sxa:mt-4 sxa:p-6\">\n {basket.length === 0 ? (\n <p className=\"sxa:text-small sxa:text-muted\">{t('reseller.basketEmpty')}</p>\n ) : (\n <>\n <ul className=\"sxa:space-y-3\">\n {basket.map((line) => (\n <li\n key={`${line.product_id}:${line.variant_id ?? ''}`}\n className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-3\"\n >\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-medium\">{line.title}</p>\n {line.variant_title ? (\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{line.variant_title}</p>\n ) : null}\n </div>\n <label className=\"sxa:flex sxa:items-center sxa:gap-2 sxa:text-micro sxa:text-muted\">\n {t('reseller.quantity')}\n <input\n type=\"number\"\n min={RESELLER_QUANTITY_MIN_UNITS}\n max={RESELLER_QUANTITY_MAX_UNITS}\n step={1}\n value={line.quantity}\n disabled={busy}\n className={`${FIELD} sxa:w-24 sxa:tabular-nums`}\n onChange={(event) => onBasketChange(basket.map((entry) => (\n entry === line\n ? { ...entry, quantity: wholesaleQuantity(event.target.value) }\n : entry\n )))}\n />\n </label>\n <button\n type=\"button\"\n disabled={busy}\n className=\"sxa:text-micro sxa:font-medium sxa:text-muted sxa:transition-colors sxa:hover:text-error sxa:disabled:opacity-50\"\n onClick={() => onBasketChange(basket.filter((entry) => entry !== line))}\n >\n {t('favorites.remove')}\n </button>\n </li>\n ))}\n </ul>\n\n <div className=\"sxa:mt-5 sxa:border-t sxa:pt-4\">\n {/*\n The quoted total is the only total this panel knows. A basket\n that has moved since it was priced shows NONE — the previous\n total belongs to a basket that no longer exists, and printing it\n beside the new one is how a buyer plans against a price the\n producer will not honour.\n */}\n {quoteIsCurrent && priced ? (\n <dl className=\"sxa:space-y-2\">\n <div className=\"sxa:flex sxa:items-baseline sxa:justify-between sxa:gap-3 sxa:text-small\">\n <dt className=\"sxa:text-muted\">{t('orders.subtotal')}</dt>\n <dd className=\"sxa:font-medium sxa:tabular-nums\">\n {formatAccountAmount(priced.quote.subtotal, priced.quote.currency)}\n </dd>\n </div>\n {Number(priced.quote.volume_discount_total) > 0 ? (\n <div className=\"sxa:flex sxa:items-baseline sxa:justify-between sxa:gap-3 sxa:text-small\">\n <dt className=\"sxa:text-success\">{t('orders.discount')}</dt>\n <dd className=\"sxa:font-medium sxa:tabular-nums sxa:text-success\">\n {formatAccountAmount(\n priced.quote.volume_discount_total,\n priced.quote.currency,\n )}\n </dd>\n </div>\n ) : null}\n <div className=\"sxa:flex sxa:items-baseline sxa:justify-between sxa:gap-3 sxa:border-t sxa:pt-3\">\n <dt className=\"sxa:text-small sxa:font-semibold\">{t('orders.total')}</dt>\n <dd className=\"sxa:text-h2 sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(priced.quote.total, priced.quote.currency)}\n </dd>\n </div>\n </dl>\n ) : (\n <p className=\"sxa:text-small sxa:text-muted\">{t('reseller.basketNeedsQuote')}</p>\n )}\n\n <button\n type=\"button\"\n disabled={busy}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:mt-4 sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => void price()}\n >\n {busy ? <BusySpinner className=\"sxa:mr-1.5\" /> : null}\n {t('reseller.quote')}\n </button>\n\n {/*\n Where \"Place order\" would have been. The edge allowlists no\n wholesale order-placement route, so this says where the order is\n actually placed instead of offering a button that 404s.\n */}\n <p className=\"sxa:mt-4 sxa:rounded-input sxa:border sxa:bg-bg sxa:p-5 sxa:text-small sxa:leading-relaxed sxa:text-muted\">\n {t('reseller.orderElsewhere')}\n </p>\n </div>\n </>\n )}\n {error ? <AccountFieldError message={error} /> : null}\n </AccountCard>\n </section>\n );\n}\n\n/* --- Order history -------------------------------------------------------- */\n\nfunction WholesaleOrders() {\n const [selected, setSelected] = useState<string | null>(null);\n const { state, moreBusy, moreError, loadMore, reload } = usePagedList<ResellerOrderListItem>(\n 'reseller-orders',\n async (page) => {\n const response = await callCustomerApi((sdk) => sdk.resellerOrders({\n page,\n per_page: PAGE_SIZE,\n }));\n if (!response.success) {\n return { ok: false, message: response.message?.trim() || t('common.genericError') };\n }\n const narrowed = narrowResellerOrders(response.data);\n if (!narrowed.ok) return { ok: false, message: t('common.genericError') };\n\n return {\n ok: true,\n slice: {\n items: narrowed.data.items,\n page: narrowed.data.page,\n perPage: narrowed.data.per_page,\n total: narrowed.data.total,\n },\n };\n },\n );\n\n if (selected !== null) {\n return <WholesaleOrderDetail uniqid={selected} onBack={() => setSelected(null)} />;\n }\n\n const heading = <AccountSectionTitle>{t('reseller.ordersTitle')}</AccountSectionTitle>;\n\n if (state.status === 'loading') {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountRowsSkeleton label={t('orders.loading')} />\n </div>\n </section>\n );\n }\n if (state.status === 'error') {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountError message={state.message} onRetry={reload} />\n </div>\n </section>\n );\n }\n\n const { slice } = state;\n\n return (\n <section>\n {heading}\n {slice.items.length === 0 ? (\n <div className=\"sxa:mt-4\">\n <AccountEmpty\n title={t('reseller.ordersEmptyTitle')}\n body={t('reseller.ordersEmptyBody')}\n />\n </div>\n ) : (\n <ul className=\"sxa:mt-4 sxa:space-y-3\">\n {slice.items.map((order) => (\n <li key={order.uniqid}>\n <button\n type=\"button\"\n onClick={() => setSelected(order.uniqid)}\n className=\"sxa:flex sxa:w-full sxa:flex-wrap sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:text-left sxa:shadow-card sxa:transition-colors sxa:hover:bg-raised\"\n >\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">\n {t('orders.fallbackTitle', { id: order.uniqid })}\n </p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {formatAccountDate(order.created_at)}\n {' · '}\n {t('reseller.lineQuantity', { count: order.item_count })}\n </p>\n </div>\n <span className=\"sxa:text-small sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(order.total, order.currency)}\n </span>\n <StatusChip status={order.status} />\n </button>\n </li>\n ))}\n </ul>\n )}\n <MorePages slice={slice} busy={moreBusy} error={moreError} onMore={loadMore} />\n </section>\n );\n}\n\nfunction WholesaleOrderDetail({ uniqid, onBack }: { uniqid: string; onBack: () => void }) {\n const { state, reload } = useAccountResource(`reseller-order:${uniqid}`, () =>\n callCustomerApi((sdk) => sdk.resellerOrder(uniqid)));\n\n const back = <AccountBackButton onClick={onBack} label={t('orders.allOrders')} />;\n\n if (state.status === 'loading') {\n return (\n <section>\n {back}\n <div className=\"sxa:mt-5\">\n <AccountRowsSkeleton label={t('orders.loadingOne')} />\n </div>\n </section>\n );\n }\n if (state.status === 'error') {\n return (\n <section>\n {back}\n <div className=\"sxa:mt-5\">\n <AccountError message={state.message} onRetry={reload} />\n </div>\n </section>\n );\n }\n\n const narrowed = narrowResellerOrderDetail(state.data);\n if (!narrowed.ok) {\n return (\n <section>\n {back}\n <div className=\"sxa:mt-5\">\n <AccountError message={t('common.genericError')} onRetry={reload} />\n </div>\n </section>\n );\n }\n const order = narrowed.data;\n\n return (\n <section>\n {back}\n <div className=\"sxa:mt-5 sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-4\">\n <div className=\"sxa:min-w-0\">\n <h2 className=\"sxa:font-heading sxa:truncate sxa:text-h3 sxa:font-semibold\">\n {t('orders.detailTitle', { id: order.uniqid })}\n </h2>\n <p className=\"sxa:mt-1 sxa:text-small sxa:text-muted\">\n {formatAccountDateTime(order.created_at)}\n </p>\n </div>\n <StatusChip status={order.status} />\n </div>\n\n <AccountCard className=\"sxa:mt-5 sxa:p-6\">\n <div className=\"sxa:flex sxa:items-baseline sxa:justify-between sxa:gap-3 sxa:text-small\">\n <span className=\"sxa:text-muted\">{t('orders.total')}</span>\n <span className=\"sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(order.total, order.currency)}\n </span>\n </div>\n {order.refunded_amount !== null ? (\n <div className=\"sxa:mt-2 sxa:flex sxa:items-baseline sxa:justify-between sxa:gap-3 sxa:text-small\">\n <span className=\"sxa:text-muted\">{t('reseller.refunded')}</span>\n <span className=\"sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(order.refunded_amount, order.currency)}\n </span>\n </div>\n ) : null}\n <div className=\"sxa:mt-2 sxa:flex sxa:items-baseline sxa:justify-between sxa:gap-3 sxa:text-small\">\n <span className=\"sxa:text-muted\">{t('reseller.tier')}</span>\n <span className=\"sxa:font-medium\">\n {order.tier_name}\n {' · '}\n {`${order.tier_discount_percent}%`}\n </span>\n </div>\n </AccountCard>\n\n <ul className=\"sxa:mt-4 sxa:space-y-3\">\n {order.lines.map((line, index) => (\n <li key={`${line.product_id ?? ''}:${line.variant_id ?? ''}:${index}`}>\n <OrderLine line={line} currency={order.currency} />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction OrderLine({ line, currency }: { line: ResellerOrderLine; currency: string }) {\n return (\n <AccountCard className=\"sxa:p-5\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-3\">\n <div className=\"sxa:min-w-0\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{line.product_title}</p>\n {line.variant_title ? (\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{line.variant_title}</p>\n ) : null}\n </div>\n <p className=\"sxa:text-small sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(line.total, currency)}\n </p>\n </div>\n <p className=\"sxa:mt-2 sxa:text-micro sxa:text-muted\">\n {t('reseller.lineQuantity', { count: line.quantity })}\n {' · '}\n {line.delivered ? t('delivery.DELIVERED') : t('delivery.PENDING')}\n {line.delivered_at !== null ? ` · ${formatAccountDateTime(line.delivered_at)}` : ''}\n </p>\n\n {line.serials.length > 0 ? (\n <div className=\"sxa:mt-4 sxa:space-y-2 sxa:border-t sxa:pt-4\">\n <p className=\"sxa:text-micro sxa:font-semibold sxa:text-muted\">{t('reseller.serials')}</p>\n {line.serials.map((serial) => (\n <div key={serial} className=\"sxa:flex sxa:items-center sxa:gap-3\">\n <p className=\"sxa:min-w-0 sxa:flex-1 sxa:truncate sxa:font-mono sxa:text-micro\">{serial}</p>\n <CopyButton value={serial} />\n </div>\n ))}\n </div>\n ) : null}\n </AccountCard>\n );\n}\n\n/* --- API keys ------------------------------------------------------------- */\n\nfunction ResellerApiKeys() {\n const { state, reload } = useAccountResource('reseller-api-keys', () =>\n callCustomerApi((sdk) => sdk.resellerApiKeys()));\n const [error, setError] = useState<string | null>(null);\n\n const heading = <AccountSectionTitle>{t('reseller.apiKeysTitle')}</AccountSectionTitle>;\n\n /*\n * Where \"Create key\" would have been. Issuing a key is not an allowlisted\n * route at the edge, and a key the buyer cannot mint is not a control that\n * belongs on the page — so this names where they come from instead.\n */\n const elsewhere = (\n <p className=\"sxa:mt-4 sxa:rounded-input sxa:border sxa:bg-bg sxa:p-5 sxa:text-small sxa:leading-relaxed sxa:text-muted\">\n {t('reseller.keysElsewhere')}\n </p>\n );\n\n if (state.status === 'loading') {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountRowsSkeleton rows={2} label={t('overview.loading')} />\n </div>\n {elsewhere}\n </section>\n );\n }\n if (state.status === 'error') {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountError message={state.message} onRetry={reload} />\n </div>\n {elsewhere}\n </section>\n );\n }\n\n const narrowed = narrowResellerApiKeys(state.data);\n if (!narrowed.ok) {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountError message={t('common.genericError')} onRetry={reload} />\n </div>\n {elsewhere}\n </section>\n );\n }\n const keys = narrowed.data;\n\n return (\n <section>\n {heading}\n {error ? (\n <div className=\"sxa:mt-4\">\n <AccountError message={error} />\n </div>\n ) : null}\n\n {keys.length === 0 ? (\n <p className=\"sxa:mt-4 sxa:text-small sxa:text-muted\">{t('reseller.apiKeysEmpty')}</p>\n ) : (\n <ul className=\"sxa:mt-4 sxa:space-y-3\">\n {keys.map((key) => (\n <li\n key={key.id}\n className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:shadow-card\"\n >\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">\n {key.name}\n {' · '}\n <span className=\"sxa:font-mono\">{key.key_last4}</span>\n </p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {key.last_used_at\n ? t('reseller.lastUsed', {\n date: formatAccountDateTime(key.last_used_at),\n })\n : t('reseller.neverUsed')}\n </p>\n </div>\n\n {/* A revoked key stays on the list, stamped. Removing the row\n would hide the fact that the key ever existed.\n\n Read-only: revoking is irreversible and breaks the buyer's\n external integrations at once, and this page is\n merchant-authored JavaScript — a hostile theme could revoke\n every key silently, past a confirmation it renders itself.\n The route is off the worker's allowlist for that reason. */}\n {key.revoked_at !== null ? <StatusChip status=\"REVOKED\" /> : null}\n </li>\n ))}\n </ul>\n )}\n\n {elsewhere}\n </section>\n );\n}\n","/**\n * Store credit and coupons the shop has granted this buyer.\n *\n * Every figure on screen is the server's own. The summary comes out of the\n * wallet and the grant ledger already summed; adding up the activity list here\n * would put a second number for the same money on the page, and the two would\n * disagree the moment a grant is pending or expired.\n *\n * A coupon is copied and pasted at checkout and the store credit a grant paid\n * out is applied there — the wallet routes are not open to storefront code, so\n * there is no balance to move from this page.\n *\n * Points are the exception, and the only one: the loyalty route offers a\n * conversion INTO store credit, which is why this panel has a control that\n * writes at all. It is a separate read from the dashboard payload — a shop\n * running no points programme answers `enabled: false`, and the section that\n * depends on that answer must not hold up the coupons above it.\n */\n\nimport { useState, type ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n loyaltyDate,\n loyaltyLifetimePoints,\n loyaltyPointsBalance,\n loyaltyTransactionKey,\n redeemOffer,\n redeemPreview,\n redeemSubmissionKey,\n resolveRedeemKey,\n signedPoints,\n type RedeemOffer,\n} from './account-loyalty';\nimport {\n epochSecondsToDate,\n optionalEpochSecondsToDate,\n rewardReasonKey,\n rewardStatusKey,\n rewardTitle,\n usableCoupons,\n type UsableCoupon,\n} from './account-rewards';\nimport { callCustomerApi, type AccountPanelState } from './customer-account';\nimport type { SdkCustomerLoyalty, SdkCustomerRewardActivity } from '../sdk';\nimport { t } from './i18n';\nimport { GiftIcon, TagIcon, ZapIcon } from './icons';\nimport { useAccountDashboard } from './dashboard';\nimport {\n AccountCard,\n AccountEmpty,\n AccountError,\n AccountFieldError,\n AccountNotice,\n AccountRowsSkeleton,\n AccountSectionTitle,\n BusySpinner,\n CopyButton,\n formatAccountAmount,\n formatAccountDate,\n statusLabel,\n useAccountResource,\n} from './shared';\n\n/** The contact form's control skin — see `components/contact/contact-form.tsx`. */\nconst FIELD =\n 'sx-account-field sxa:w-full sxa:rounded-card sxa:border sxa:bg-[color-mix(in_oklab,_var(--sx-bg)_40%,_transparent)] sxa:px-3 sxa:py-2.5 sxa:text-small sxa:shadow-card sxa:placeholder:text-muted sxa:focus-visible:border-accent sxa:focus-visible:ring-[3px] sxa:focus-visible:ring-[color-mix(in_oklab,_var(--sx-accent)_50%,_transparent)] sxa:focus-visible:outline-none';\n\nexport function AccountRewards() {\n const { state, reload } = useAccountDashboard();\n const loyalty = useAccountResource('loyalty', () =>\n callCustomerApi((sdk) => sdk.loyalty()), { keepStale: true });\n\n if (state.status === 'loading') {\n return <AccountRowsSkeleton rows={3} label={t('rewards.loading')} />;\n }\n\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n const { summary, activity } = state.data.rewards;\n const coupons = usableCoupons(activity);\n // A background refresh of the shell payload that failed: the tiles below\n // kept their figures instead of the page falling to an error, but the buyer\n // is told they may be out of date, with the same retry the error shows.\n const shellStale = state.staleMessage;\n\n return (\n <div className=\"sxa:space-y-8\">\n {shellStale ? <AccountError message={shellStale} onRetry={reload} /> : null}\n <div className=\"sxa:grid sxa:grid-cols-1 sxa:gap-4 sxa:sm:grid-cols-3\">\n <RewardTile\n label={t('rewards.available')}\n amount={summary.available}\n currency={summary.currency}\n />\n <RewardTile\n label={t('rewards.pending')}\n amount={summary.pending}\n currency={summary.currency}\n />\n <RewardTile\n label={t('rewards.lifetime')}\n amount={summary.lifetime_earned}\n currency={summary.currency}\n />\n </div>\n\n {/*\n The shop's currency, not the wallet's and not the rewards summary's.\n `redeem_value_per_point` is quoted in the currency the SHOP prices in,\n so it is the only one the preview may be multiplied into; the credited\n amount afterwards carries the currency the redeem response names.\n\n `reload` is the SHELL's, and it is handed down for one reason: a\n conversion credits the wallet, and the wallet is what the three tiles\n directly above are read from. Without it this panel says \"€5.00 added\n to your store credit\" under an Available tile still showing the balance\n before it — two numbers for the same money, disagreeing until a reload.\n */}\n <LoyaltyPoints\n resource={loyalty}\n currency={state.data.shop.currency}\n onCredited={reload}\n />\n\n {/*\n Only coupons that would actually be accepted at checkout: a pending\n grant has no code yet, a revoked one has a code the till will refuse,\n and wallet credit is not something to paste. The narrowing decides;\n this section simply disappears when it returns nothing.\n */}\n {coupons.length ? (\n <section>\n <AccountSectionTitle>{t('rewards.couponsTitle')}</AccountSectionTitle>\n <p className=\"sxa:mt-1 sxa:text-small sxa:text-muted\">{t('rewards.couponsBody')}</p>\n <ul className=\"sxa:mt-4 sxa:space-y-4\">\n {coupons.map((coupon) => (\n <li key={coupon.id}>\n <CouponCard coupon={coupon} />\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n\n <section>\n <AccountSectionTitle>{t('rewards.activityTitle')}</AccountSectionTitle>\n <div className=\"sxa:mt-4\">\n {activity.length === 0 ? (\n <AccountEmpty\n title={t('rewards.emptyTitle')}\n body={t('rewards.emptyBody')}\n action={(\n <Link\n to=\"/all-products\"\n className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small\"\n >\n {t('common.browseStore')}\n </Link>\n )}\n />\n ) : (\n <ul className=\"sxa:space-y-4\">\n {activity.map((item) => (\n <li\n key={item.id}\n className=\"sxa:flex sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:shadow-card\"\n >\n <span className=\"sxa:flex sxa:h-10 sxa:w-10 sxa:shrink-0 sxa:items-center sxa:justify-center sxa:rounded-input sxa:border sxa:bg-bg\">\n <GiftIcon className=\"sxa:h-4 sxa:w-4 sxa:text-muted\" />\n </span>\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{rewardTitleText(item)}</p>\n <p className=\"sxa:mt-1 sxa:truncate sxa:text-micro sxa:text-muted\">\n {t(rewardReasonKey(item.reason))}\n {' · '}\n {formatAccountDate(epochSecondsToDate(item.created_at))}\n </p>\n </div>\n <span className=\"sxa:shrink-0 sxa:text-micro sxa:font-medium sxa:text-muted\">\n {grantStatusLabel(item.status)}\n </span>\n </li>\n ))}\n </ul>\n )}\n </div>\n </section>\n </div>\n );\n}\n\n/**\n * The points a buyer holds, what they are worth, and how they were earned.\n *\n * Three things decide whether this renders at all, and none of them is known\n * before the loyalty route answers: a shop may run no programme (`enabled`\n * false), a buyer may have no account on one that exists (`account` null), and\n * a shop may offer no conversion (`settings` null). Nothing is sketched in\n * while that answer is in flight — a heading that appears and then vanishes\n * once the shop turns out to have no points is worse than a section that\n * arrives a moment late.\n *\n * A FAILED read is shown, though. It cannot be told apart from \"no programme\n * here\", and staying silent would strand exactly the buyers this section\n * exists for: the ones holding points they now cannot see.\n */\nfunction LoyaltyPoints({\n resource,\n currency,\n onCredited,\n}: {\n resource: { state: AccountPanelState<SdkCustomerLoyalty>; reload: () => void };\n currency: string;\n /** Re-read the shell's dashboard: a conversion moved the store credit it holds. */\n onCredited: () => void;\n}) {\n const { state, reload } = resource;\n const [notice, setNotice] = useState<string | null>(null);\n\n /*\n * A conversion re-reads the route so the balance and the activity list come\n * back from the producer rather than being patched together here — the\n * response carries a new balance but no new activity row, and inventing one\n * would put a made-up timestamp on the page. `useAccountResource` holds the\n * last answer across a reload of the SAME key, so that re-read no longer\n * empties the section and takes the \"credited\" notice with it one frame after\n * the buyer pressed the button. Nothing is kept a second time here.\n */\n const loyalty = state.status === 'ready' ? state.data : null;\n\n if (loyalty === null) {\n return state.status === 'error' ? (\n <PointsSection>\n <AccountError message={state.message} onRetry={reload} />\n </PointsSection>\n ) : null;\n }\n\n if (!loyalty.enabled) return null;\n\n /*\n * A re-read that failed kept these figures on screen — better than tearing\n * the section down under the buyer — but they may be out of date, and the\n * credited notice above a stale balance would read as the server confirming\n * it. The same error the first read would show, with the same retry.\n */\n const stale = state.status === 'ready' ? state.staleMessage : undefined;\n\n const offer = redeemOffer(loyalty);\n\n return (\n <PointsSection>\n <div className={`sxa:grid sxa:grid-cols-1 sxa:gap-4 ${loyalty.account ? 'sxa:sm:grid-cols-2' : ''}`}>\n <PointsTile label={t('rewards.pointsBalance')} points={loyaltyPointsBalance(loyalty.account)} />\n {loyalty.account ? (\n <PointsTile\n label={t('rewards.pointsLifetime')}\n points={loyaltyLifetimePoints(loyalty.account)}\n />\n ) : null}\n </div>\n\n {/* A programme this buyer has not started. Zero points is the true\n balance, and this is the sentence that makes it read as a beginning\n rather than as something that went missing. */}\n {loyalty.account === null ? (\n <p className=\"sxa:mt-3 sxa:text-small sxa:text-muted\">{t('rewards.pointsEarnHint')}</p>\n ) : null}\n\n {stale ? <AccountError message={stale} onRetry={reload} /> : null}\n\n {notice ? <AccountNotice message={notice} /> : null}\n\n {/* The minimum, for a balance that cannot clear it yet. The form is gone\n because the route would refuse it, but the figure it refuses below is\n what the buyer is collecting towards. */}\n {offer.kind === 'below-minimum' && loyalty.account !== null ? (\n <p className=\"sxa:mt-3 sxa:text-small sxa:text-muted\">\n {t('rewards.redeemMinimum', { points: offer.minimumPoints })}\n </p>\n ) : null}\n\n {offer.kind === 'offered' ? (\n <RedeemPoints\n offer={offer}\n currency={currency}\n onRedeemed={(message) => {\n setNotice(message);\n reload();\n onCredited();\n }}\n />\n ) : null}\n\n {loyalty.transactions.length ? (\n <PointsActivity transactions={loyalty.transactions} />\n ) : null}\n </PointsSection>\n );\n}\n\nfunction PointsSection({ children }: { children: ReactNode }) {\n return (\n <section>\n <AccountSectionTitle>{t('rewards.pointsTitle')}</AccountSectionTitle>\n <div className=\"sxa:mt-4\">{children}</div>\n </section>\n );\n}\n\nfunction PointsTile({ label, points }: { label: string; points: number }) {\n return (\n <AccountCard className=\"sxa:p-6\">\n <p className=\"sxa:text-h2 sxa:font-bold sxa:tabular-nums\">{points}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{label}</p>\n </AccountCard>\n );\n}\n\n/**\n * Converting points into store credit — the one control on this panel that\n * moves anything.\n *\n * It asks before it acts, and the question names both figures: the points that\n * leave the balance and roughly what arrives as credit. \"Roughly\" is honest —\n * the server holds the authoritative rounding — and the amount the buyer is\n * told afterwards is the one it actually credited, not this estimate.\n */\nfunction RedeemPoints({\n offer,\n currency,\n onRedeemed,\n}: {\n offer: Extract<RedeemOffer, { kind: 'offered' }>;\n currency: string;\n onRedeemed: (message: string) => void;\n}) {\n const [typed, setTyped] = useState('');\n const [confirming, setConfirming] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n /*\n * The seed of the conversion in hand, or '' while there is none. The\n * submission key is DERIVED from (seed, amount) at send time, never minted\n * per keystroke: a request that never reached the server and one the server\n * committed before the connection dropped look identical from here, and with\n * a derived key every path back to the same amount — retype,\n * clear-and-repeat — is the same submission, so the retry replays instead of\n * spending the points twice. A different amount derives a different key on\n * its own. Only a success clears the seed, and the next intent mints a new\n * one.\n *\n * A ref rather than state, minted on the first send rather than while\n * rendering: a buyer who never converts anything makes the browser produce\n * nothing, and minting cannot throw in the middle of a render.\n */\n\n\n const preview = redeemPreview(typed, offer);\n\n const retype = (value: string) => {\n setTyped(value);\n setConfirming(false);\n setError(null);\n };\n\n const submit = async () => {\n if (preview.kind !== 'ready') return;\n\n setSubmitting(true);\n setError(null);\n try {\n // Remembered per amount at MODULE level until that amount answers\n // success (see account-loyalty.ts): the memory has to survive this\n // component unmounting on a tab switch, or a committed-but-unanswered\n // conversion would debit twice on the retry after coming back.\n const idempotencyKey = await redeemSubmissionKey(preview.points);\n const response = await callCustomerApi((sdk) => sdk.redeemLoyaltyPoints({\n points: preview.points,\n idempotencyKey,\n }));\n\n if (!response.success || response.data === undefined) {\n // The server's own sentence: \"below the minimum\", \"not enough points\"\n // and \"the programme was switched off\" are all 400s, and only it knows\n // which one happened.\n setError(response.message?.trim() || t('rewards.redeemFailed'));\n return;\n }\n\n // `replayed` is this conversion answered a second time, not a refusal —\n // the points were converted and the credit exists either way.\n const credited = response.data;\n setTyped('');\n setConfirming(false);\n resolveRedeemKey(preview.points);\n onRedeemed(t('rewards.redeemDone', {\n amount: formatAccountAmount(credited.wallet_amount, credited.currency),\n }));\n } catch {\n // A browser that cannot derive the key — no Web Crypto, no secure\n // context — is a conversion that cannot be sent, not a button stuck on\n // \"Converting…\" for the rest of the session.\n setError(t('rewards.redeemFailed'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <AccountCard className=\"sxa:mt-4 sxa:p-6\">\n <p className=\"sxa:font-heading sxa:font-semibold\">{t('rewards.redeemTitle')}</p>\n <p className=\"sxa:mt-2 sxa:text-small sxa:text-muted\">{t('rewards.redeemBody')}</p>\n\n <div className=\"sxa:mt-4 sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2\">\n <label htmlFor=\"loyalty-points\" className=\"sxa:sr-only\">{t('rewards.redeemLabel')}</label>\n <input\n id=\"loyalty-points\"\n type=\"number\"\n inputMode=\"numeric\"\n min={offer.minimumPoints}\n max={offer.balance}\n step={1}\n value={typed}\n disabled={submitting}\n placeholder={String(offer.minimumPoints)}\n aria-invalid={preview.kind === 'not-a-number' || preview.kind === 'zero-value' ? true : undefined}\n onChange={(event) => retype(event.target.value)}\n className={`${FIELD} sxa:w-36 sxa:tabular-nums`}\n />\n {!confirming ? (\n <button\n type=\"button\"\n disabled={preview.kind !== 'ready' || submitting}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => setConfirming(true)}\n >\n {t('rewards.redeemContinue')}\n </button>\n ) : null}\n </div>\n\n <RedeemPreviewLine preview={preview} currency={currency} />\n\n {/*\n The step between typing an amount and spending it. The question repeats\n both figures because the field above it is a number without a unit, and\n \"convert 500\" and \"convert 500 into €25\" are different decisions.\n */}\n {confirming && preview.kind === 'ready' ? (\n <div className=\"sxa:mt-4 sxa:border-t sxa:pt-4\">\n <p className=\"sxa:text-small sxa:font-semibold\">\n {t('rewards.redeemConfirm', {\n points: preview.points,\n amount: formatAccountAmount(preview.amount, currency),\n })}\n </p>\n <div className=\"sxa:mt-3 sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2\">\n <button\n type=\"button\"\n disabled={submitting}\n aria-busy={submitting || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-9 sxa:items-center sxa:px-4 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => void submit()}\n >\n {submitting ? <BusySpinner className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" /> : null}\n {submitting ? t('rewards.redeemWorking') : t('rewards.redeemConfirmAction')}\n </button>\n <button\n type=\"button\"\n disabled={submitting}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => setConfirming(false)}\n >\n {t('common.cancel')}\n </button>\n </div>\n </div>\n ) : null}\n\n {error ? <AccountFieldError message={error} /> : null}\n </AccountCard>\n );\n}\n\n/** What the typed amount is worth, or the one thing wrong with it. */\nfunction RedeemPreviewLine({\n preview,\n currency,\n}: {\n preview: ReturnType<typeof redeemPreview>;\n currency: string;\n}) {\n if (preview.kind === 'empty') return null;\n\n if (preview.kind === 'ready') {\n return (\n <p className=\"sxa:mt-2.5 sxa:text-small sxa:text-muted\">\n {t('rewards.redeemPreview', { amount: formatAccountAmount(preview.amount, currency) })}\n </p>\n );\n }\n\n // An amount worth nothing is an amount the field cannot use, and it is told\n // apart from a mistyped one by nobody: both say \"this number will not do\".\n const message = preview.kind === 'not-a-number' || preview.kind === 'zero-value'\n ? t('rewards.redeemInvalid')\n : preview.kind === 'below-minimum'\n ? t('rewards.redeemMinimum', { points: preview.minimumPoints })\n : t('rewards.redeemOverBalance', { points: preview.balance });\n\n return <p role=\"alert\" className=\"sxa:mt-2.5 sxa:text-small sxa:text-error\">{message}</p>;\n}\n\nfunction PointsActivity({ transactions }: { transactions: SdkCustomerLoyalty['transactions'] }) {\n return (\n <div className=\"sxa:mt-6\">\n <h3 className=\"sxa:text-micro sxa:font-semibold sxa:uppercase sxa:tracking-wider sxa:text-muted\">\n {t('rewards.pointsActivityTitle')}\n </h3>\n <ul className=\"sxa:mt-3 sxa:space-y-4\">\n {/*\n The wire carries no id for a points row, so the position in a list the\n server sends whole is the key. It is stable for as long as the list\n is: a reload replaces every row at once.\n */}\n {transactions.map((entry, index) => (\n <li\n key={`${entry.created_at}:${index}`}\n className=\"sxa:flex sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:shadow-card\"\n >\n <span className=\"sxa:flex sxa:h-10 sxa:w-10 sxa:shrink-0 sxa:items-center sxa:justify-center sxa:rounded-input sxa:border sxa:bg-bg\">\n <ZapIcon className=\"sxa:h-4 sxa:w-4 sxa:text-muted\" />\n </span>\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{t(loyaltyTransactionKey(entry.type))}</p>\n <p className=\"sxa:mt-1 sxa:truncate sxa:text-micro sxa:text-muted\">\n {/* The shop's own note on the row, where it wrote one — the only\n place a manual adjustment ever explains itself. */}\n {entry.description ? `${entry.description} · ` : ''}\n {formatAccountDate(loyaltyDate(entry.created_at))}\n </p>\n </div>\n <span\n className={`sxa:shrink-0 sxa:text-small sxa:font-semibold sxa:tabular-nums ${\n entry.points > 0 ? 'sxa:text-success' : 'sxa:text-muted'\n }`}\n >\n {signedPoints(entry.points)}\n </span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction RewardTile({\n label,\n amount,\n currency,\n}: {\n label: string;\n amount: string;\n currency: string;\n}) {\n return (\n <AccountCard className=\"sxa:p-6\">\n <p className=\"sxa:text-h2 sxa:font-bold sxa:tabular-nums\">{formatAccountAmount(amount, currency)}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{label}</p>\n </AccountCard>\n );\n}\n\nfunction CouponCard({ coupon }: { coupon: UsableCoupon }) {\n const expiry = optionalEpochSecondsToDate(coupon.expires_at);\n\n return (\n <AccountCard className=\"sxa:p-5\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-3\">\n <div className=\"sxa:flex sxa:min-w-0 sxa:items-start sxa:gap-3\">\n <TagIcon className=\"sxa:mt-0.5 sxa:h-4 sxa:w-4 sxa:shrink-0 sxa:text-muted\" />\n <div className=\"sxa:min-w-0\">\n <p className=\"sxa:text-small sxa:font-semibold\">\n {/* The producer sends a percentage only sometimes; without one\n the coupon is named as a coupon rather than as \"0% off\". */}\n {coupon.amount\n ? t('rewards.percentOff', { percent: coupon.amount })\n : t('rewards.couponGeneric')}\n </p>\n {expiry ? (\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {t('rewards.expiresOn', { date: formatAccountDate(expiry) })}\n </p>\n ) : null}\n </div>\n </div>\n <CopyButton value={coupon.coupon_code} />\n </div>\n <code className=\"sxa:mt-3 sxa:block sxa:truncate sxa:rounded-input sxa:border sxa:bg-bg sxa:px-3 sxa:py-2 sxa:font-mono sxa:text-micro\">\n {coupon.coupon_code}\n </code>\n </AccountCard>\n );\n}\n\n/** One reward as a sentence. The pure half decided WHAT it is; this spells it. */\nfunction rewardTitleText(item: SdkCustomerRewardActivity): string {\n const title = rewardTitle(item);\n switch (title.kind) {\n case 'store-credit-amount':\n return t('rewards.storeCredit', {\n amount: formatAccountAmount(title.amount, title.currency),\n });\n case 'store-credit':\n return t('rewards.storeCreditGeneric');\n case 'coupon-code':\n return t('rewards.couponNamed', { code: title.code });\n case 'coupon-percent':\n return t('rewards.percentOff', { percent: title.percent });\n case 'coupon':\n return t('rewards.couponUnnamed');\n case 'other':\n return t('rewards.otherReward');\n }\n}\n\n/**\n * A grant state this catalog names, or the producer's own word for it.\n *\n * Grant status is an open set — the server may ship a state before this\n * template has heard of it — so an unknown one is shown as the server spelled\n * it rather than mapped onto the nearest state we do know.\n */\nfunction grantStatusLabel(status: string): string {\n const key = rewardStatusKey(status);\n return key ? t(key) : statusLabel(status);\n}\n","import type { SdkCustomerLoyalty, SdkCustomerLoyaltyTransactionType } from '../sdk';\n\n/**\n * The points section's pure half.\n *\n * Every figure here is the server's. Nothing recomputes a balance from the\n * activity list: the list is capped at fifty entries, so adding it up would\n * produce a second, smaller number for the same points and the two would\n * disagree on every account older than fifty transactions.\n *\n * The one number this module does compute is the redeem PREVIEW, and it is\n * labelled as an estimate wherever it is shown. The server converts the points\n * and answers with the amount it actually credited; that answer is what the\n * buyer is told afterwards.\n */\n\n/** The balance the server holds. No account yet is zero points, not \"unknown\". */\nexport function loyaltyPointsBalance(account: SdkCustomerLoyalty['account']): number {\n return account?.points_balance ?? 0;\n}\n\nexport function loyaltyLifetimePoints(account: SdkCustomerLoyalty['account']): number {\n return account?.lifetime_points ?? 0;\n}\n\n/**\n * Why a row exists, as a message key.\n *\n * The four types are a CLOSED set on this wire — the SDK validates the payload\n * against them, so a type invented upstream fails the whole read rather than\n * arriving here. That is why this map is total and has no \"something else\"\n * branch: an unreachable one would be a label nobody could ever see.\n */\nconst TRANSACTION_KEYS: Readonly<Record<SdkCustomerLoyaltyTransactionType, string>> = {\n EARN_ORDER: 'rewards.pointsFromOrder',\n EARN_REVIEW: 'rewards.pointsFromReview',\n REDEEM: 'rewards.pointsConverted',\n ADJUST: 'rewards.pointsAdjusted',\n};\n\nexport function loyaltyTransactionKey(type: SdkCustomerLoyaltyTransactionType): string {\n return TRANSACTION_KEYS[type];\n}\n\n/**\n * `+120` for points that arrived, `-500` for points that were spent.\n *\n * The sign is the producer's: REDEEM and a negative ADJUST already carry a\n * negative number, so nothing here decides direction. The plus is added because\n * a bare `120` beside a `-500` reads as two unrelated figures.\n */\nexport function signedPoints(points: number): string {\n return points > 0 ? `+${points}` : String(points);\n}\n\n/**\n * Whether the buyer can convert points at all, and on what terms.\n *\n * A shop with no settings, or points worth nothing per point, runs no\n * conversion: nothing is offered and nothing is said, because there is no\n * conversion to talk about. The control is removed rather than disabled — a\n * disabled button still promises that pressing it would have worked.\n *\n * A balance under the minimum is a THIRD answer, not the same as the first two.\n * The form would be a control the route refuses, but the number it refuses\n * below is the whole point of collecting points, so the caller keeps it and\n * names it. A balance with nothing beside it tells the buyer nothing about what\n * they are collecting towards.\n *\n * The minimum is floored at one because the route refuses anything below it: a\n * shop that set `min_redeem_points` to zero has not made zero points\n * convertible, it has left the field at its default.\n */\nexport type RedeemOffer =\n | { kind: 'hidden' }\n | { kind: 'below-minimum'; balance: number; minimumPoints: number }\n | { kind: 'offered'; balance: number; minimumPoints: number; valuePerPoint: number };\n\nexport function redeemOffer(loyalty: SdkCustomerLoyalty): RedeemOffer {\n const settings = loyalty.settings;\n if (settings === null) return { kind: 'hidden' };\n if (settings.redeem_value_per_point <= 0) return { kind: 'hidden' };\n\n const minimumPoints = Math.max(1, settings.min_redeem_points);\n const balance = loyaltyPointsBalance(loyalty.account);\n if (balance < minimumPoints) return { kind: 'below-minimum', balance, minimumPoints };\n\n return {\n kind: 'offered',\n balance,\n minimumPoints,\n valuePerPoint: settings.redeem_value_per_point,\n };\n}\n\n/**\n * What the typed amount is worth, or why it is not an amount yet.\n *\n * The wire takes a whole number of one or more, so `1.5`, `-20` and `2e3` are\n * refused HERE rather than sent and rejected: a buyer who mistyped learns it\n * while the field is still under their cursor.\n *\n * `below-minimum` and `above-balance` are separate answers because they need\n * different sentences — one names the floor the shop set, the other names the\n * points the buyer actually has.\n */\nexport type RedeemPreview =\n | { kind: 'empty' }\n | { kind: 'not-a-number' }\n | { kind: 'below-minimum'; minimumPoints: number }\n | { kind: 'above-balance'; balance: number }\n | { kind: 'zero-value' }\n | { kind: 'ready'; points: number; amount: string };\n\nexport function redeemPreview(\n input: string,\n offer: { balance: number; minimumPoints: number; valuePerPoint: number },\n): RedeemPreview {\n const typed = input.trim();\n if (typed.length === 0) return { kind: 'empty' };\n if (!/^\\d+$/.test(typed)) return { kind: 'not-a-number' };\n\n const points = Number(typed);\n if (!Number.isSafeInteger(points) || points < 1) return { kind: 'not-a-number' };\n if (points < offer.minimumPoints) return { kind: 'below-minimum', minimumPoints: offer.minimumPoints };\n if (points > offer.balance) return { kind: 'above-balance', balance: offer.balance };\n\n const amount = storeCreditAmount(points, offer.valuePerPoint);\n // A rate low enough that this many points still round to nothing. The offer\n // itself is real — the shop converts, and a larger amount would be worth\n // something — so this is a fact about the number typed, not about the shop,\n // and it is refused the way any other unusable entry is.\n if (!(Number(amount) > 0)) return { kind: 'zero-value' };\n\n return { kind: 'ready', points, amount };\n}\n\n/**\n * Points as a decimal string in the SHOP currency, which is the currency\n * `redeem_value_per_point` is measured in.\n *\n * A STRING because that is what this template's money formatter takes\n * everywhere else, and because a float carried to the screen is how `5` becomes\n * `5.000000000000001`. Two decimals, and the buyer is told the figure is\n * approximate: the server holds the authoritative rounding and answers with the\n * amount it credited.\n */\nexport function storeCreditAmount(points: number, valuePerPoint: number): string {\n return (points * valuePerPoint).toFixed(2);\n}\n\n/**\n * A loyalty movement's timestamp as a Date for display, or the string as it\n * came when it cannot be read — the panel's formatter then prints the\n * original rather than \"Invalid Date\". Same UTC rule as the warranty dates:\n * the producer's naive PostgreSQL timestamp is UTC, not the buyer's local\n * zone, and the space-separated form is not something every engine parses.\n */\nexport function loyaltyDate(value: string): Date | string {\n const trimmed = value.trim();\n if (!trimmed) return value;\n const hasTimezone = /(?:Z|[+-]\\d{2}(?::?\\d{2})?)$/i.test(trimmed);\n const hasTimePart = trimmed.includes(' ') || trimmed.includes('T');\n const normalized = hasTimezone || !hasTimePart ? trimmed : `${trimmed.replace(' ', 'T')}Z`;\n const parsed = Date.parse(normalized);\n return Number.isFinite(parsed) ? new Date(parsed) : value;\n}\n\n/** A unique per-intent seed. randomUUID where available, otherwise hex from\n * getRandomValues — the derived key stamps its own RFC 4122 shape, so the\n * seed only has to be unique, and minting must never throw during render. */\nexport function mintRedeemSeed(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * The idempotency key for one redeem intent, derived from a per-intent seed\n * and the amount instead of minted per keystroke. Any way the buyer arrives\n * back at the same amount — retype, clear-and-repeat, edit-and-undo — yields\n * the SAME key while the seed lives, so a retry after a dropped connection can\n * never spend the points twice; the seed is rotated only when the server has\n * answered success. A different amount derives a different key, so a stale key\n * can never replay the wrong conversion.\n */\nexport async function deriveRedeemIdempotencyKey(seed: string, points: number): Promise<string> {\n // A deliberate, checked use of the global: this derivation is pure — it takes\n // the seed it is handed and returns a string — so it owns no window state.\n // The seed still arrives through the React seam. `crypto.subtle` exists only\n // in a secure context, and a storefront that is not one has to say so rather\n // than throw a DOM exception at the buyer.\n if (!globalThis.crypto?.subtle) throw new Error('Redeeming points needs Web Crypto (a secure context).');\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(`${seed}:${points}`));\n const bytes = new Uint8Array(digest).slice(0, 16);\n // RFC 4122 shape (version + variant bits): the route validates the key with\n // `format: 'uuid'`.\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/**\n * The redeem intent's state, at MODULE level on purpose: a buyer who\n * navigates to another account tab unmounts the rewards view, and a\n * component-held key for a committed-but-unanswered conversion would die\n * with it — retrying after coming back would derive a fresh key and debit\n * the points a second time. Module state lives as long as the page, the\n * same lifetime the document lane's panel surface has.\n *\n * A different signed-in buyer reusing a leftover key is harmless: the\n * producer scopes idempotency to the account, so an unknown key simply\n * executes as a first attempt.\n */\nlet redeemSeed = '';\nconst pendingRedeemKeys = new Map<number, string>();\n\n/**\n * The submission key for this amount: the remembered one while the amount\n * is still unanswered, otherwise derived from the current seed and\n * remembered until `resolveRedeemKey` drops it on success.\n */\nexport async function redeemSubmissionKey(points: number): Promise<string> {\n const pending = pendingRedeemKeys.get(points);\n if (pending !== undefined) return pending;\n if (redeemSeed === '') redeemSeed = mintRedeemSeed();\n const key = await deriveRedeemIdempotencyKey(redeemSeed, points);\n pendingRedeemKeys.set(points, key);\n return key;\n}\n\n/**\n * THIS amount answered success: its key is dropped so the same amount can\n * be a genuinely new conversion later, and the seed rotates lazily — the\n * next submission mints its own. Unanswered amounts keep their keys.\n */\nexport function resolveRedeemKey(points: number): void {\n pendingRedeemKeys.delete(points);\n redeemSeed = '';\n}\n","import type { SdkCustomerRewardActivity } from '../sdk';\n\n/**\n * The rewards panel's pure half.\n *\n * Rewards arrive inside the dashboard payload, already summed by the server.\n * Nothing here recomputes a balance: the available figure is the buyer's wallet\n * minus what is on hold, and a storefront adding up the activity list would\n * produce a second, different number for the same money.\n */\n\n/**\n * The coupons a buyer can actually use.\n *\n * All three conditions matter. A pending coupon has no code yet, a revoked one\n * has a code that will be refused at checkout, and a wallet grant is credit\n * rather than something to paste. Any of them in this list would send a buyer\n * to checkout with a code that does not work.\n */\nexport interface UsableCoupon extends SdkCustomerRewardActivity {\n /** Narrowed: a coupon without a code is not in this list at all. */\n coupon_code: string;\n}\n\nexport function usableCoupons(\n activity: readonly SdkCustomerRewardActivity[],\n): UsableCoupon[] {\n const coupons: UsableCoupon[] = [];\n for (const item of activity) {\n if (item.type !== 'COUPON' || item.status !== 'FULFILLED') continue;\n if (typeof item.coupon_code !== 'string' || item.coupon_code.length === 0) continue;\n coupons.push({ ...item, coupon_code: item.coupon_code });\n }\n return coupons;\n}\n\n/**\n * What one reward IS, decided without a word of prose.\n *\n * The panel turns this into a sentence, because only the panel knows the\n * locale and how this shop formats money. Store credit names its amount only\n * when the server sent BOTH the amount and the currency: a number without its\n * currency is not money, and printing one beside a currency it was not measured\n * in is how a buyer reads €5 as $5.\n */\nexport type RewardTitle =\n | { kind: 'store-credit-amount'; amount: string; currency: string }\n | { kind: 'store-credit' }\n | { kind: 'coupon-code'; code: string }\n | { kind: 'coupon-percent'; percent: string }\n | { kind: 'coupon' }\n | { kind: 'other' };\n\nexport function rewardTitle(item: SdkCustomerRewardActivity): RewardTitle {\n if (item.type === 'WALLET_CREDIT') {\n return item.amount && item.currency\n ? { kind: 'store-credit-amount', amount: item.amount, currency: item.currency }\n : { kind: 'store-credit' };\n }\n\n if (item.type === 'COUPON') {\n if (item.coupon_code) return { kind: 'coupon-code', code: item.coupon_code };\n if (item.amount) return { kind: 'coupon-percent', percent: item.amount };\n return { kind: 'coupon' };\n }\n\n return { kind: 'other' };\n}\n\nconst REASON_KEYS: Readonly<Record<string, string>> = {\n ORDER_COMPLETED: 'rewards.reasonOrderCompleted',\n ORDER_COUNT_REACHED: 'rewards.reasonOrderCount',\n SPEND_AMOUNT_REACHED: 'rewards.reasonSpendAmount',\n POSITIVE_REVIEW_LEFT: 'rewards.reasonReview',\n FIRST_PURCHASE_COMPLETED: 'rewards.reasonFirstPurchase',\n};\n\n/** Why the buyer earned it. An unknown trigger says \"Reward\", never its enum. */\nexport function rewardReasonKey(reason: string): string {\n return REASON_KEYS[reason] ?? 'rewards.reasonOther';\n}\n\nconst GRANT_STATUS_KEYS: Readonly<Record<string, string>> = {\n FULFILLED: 'rewards.grantFulfilled',\n PENDING: 'rewards.grantPending',\n FAILED: 'rewards.grantFailed',\n REVOKED: 'rewards.grantRevoked',\n};\n\n/** Null for a status this catalog has never heard of — the caller shows the raw value. */\nexport function rewardStatusKey(status: string): string | null {\n return GRANT_STATUS_KEYS[status] ?? null;\n}\n\n/** Epoch SECONDS — the unit `RewardReadService` emits — to a date. */\nexport function epochSecondsToDate(value: number): Date {\n return new Date(value * 1000);\n}\n\n/** The same, for the fields where `null` means \"no date\", not \"unreadable\". */\nexport function optionalEpochSecondsToDate(value: number | null): Date | null {\n return value === null ? null : epochSecondsToDate(value);\n}\n\n","/**\n * The buyer's own details, their marketing consent, and their signed-in devices.\n *\n * Three producers, three sections, and nothing pretending to be a fourth. The\n * email address is not editable — changing it is gated behind a fresh code and\n * has no allowlisted path — there is no password field, because this account\n * signs in with a code, and there is no \"delete account\", because no endpoint\n * exists. A control for any of them would be a control that cannot work.\n *\n * Signing a device out cannot be undone from here, so it is asked before it is\n * done: the row arms, then commits. `window.confirm` is not used — it is a\n * modal the theme cannot style, cannot translate and cannot place next to the\n * row it is about.\n */\n\nimport { useEffect, useId, useRef, useState } from 'react';\nimport {\n describeUserAgent,\n hasOtherSessions,\n isAcceptableAvatarSize,\n isSaveableName,\n narrowCustomerSessions,\n narrowEmailPreferences,\n profileInitials,\n type CustomerSession,\n type EmailPreferences,\n} from './account-settings';\nimport {\n callCustomerApi,\n safeExternalHref,\n type AccountPanelState,\n} from './customer-account';\nimport { t } from './i18n';\nimport { useAccountDashboard } from './dashboard';\nimport {\n AccountCard,\n AccountError,\n AccountFieldError,\n AccountNotice,\n AccountRowsSkeleton,\n AccountSectionTitle,\n BusySpinner,\n formatAccountDateTime,\n useAccountResource,\n} from './shared';\n\n/** The contact form's control skin — see `components/contact/contact-form.tsx`. */\nconst FIELD =\n 'sx-account-field sxa:w-full sxa:rounded-card sxa:border sxa:bg-[color-mix(in_oklab,_var(--sx-bg)_40%,_transparent)] sxa:px-3 sxa:py-2.5 sxa:text-small sxa:shadow-card sxa:placeholder:text-muted sxa:focus-visible:border-accent sxa:focus-visible:ring-[3px] sxa:focus-visible:ring-[color-mix(in_oklab,_var(--sx-accent)_50%,_transparent)] sxa:focus-visible:outline-none';\n\nexport function AccountSettings() {\n const { state, reload } = useAccountDashboard();\n\n if (state.status === 'loading') {\n return <AccountRowsSkeleton rows={4} label={t('settings.loading')} />;\n }\n\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n return (\n <div className=\"sxa:space-y-8\">\n <ProfileSection\n name={state.data.customer.name}\n email={state.data.customer.email}\n onSaved={reload}\n />\n <EmailPreferencesSection />\n <DevicesSection />\n </div>\n );\n}\n\n/**\n * Keeps the last COMPLETE read on screen while the next one is in flight.\n *\n * These two sections re-read after every write, because the producer decides\n * what a change to one list does to the rest of the record. Without this the\n * list a buyer just ticked would blank out on each tick and come back a moment\n * later, which reads as the setting having been lost.\n *\n * A read that cannot be narrowed drops the held copy rather than keeping it\n * beside the error: a consent state the server may no longer hold is worse than\n * no consent state at all.\n */\nfunction useLastCompleteRead<T>(\n state: AccountPanelState<unknown>,\n narrow: (payload: unknown) => { ok: true; value: T } | { ok: false },\n): { shown: T | null; broken: boolean } {\n const [shown, setShown] = useState<T | null>(null);\n const [broken, setBroken] = useState(false);\n const narrowRef = useRef(narrow);\n narrowRef.current = narrow;\n\n useEffect(() => {\n if (state.status !== 'ready') return;\n const result = narrowRef.current(state.data);\n setBroken(!result.ok);\n setShown(result.ok ? result.value : null);\n }, [state]);\n\n return { shown, broken };\n}\n\n/**\n * What is known about the buyer's photo.\n *\n * `unread` is a third answer, not a spelling of \"no photo\". A `/me` that failed\n * leaves this panel without an answer, and drawing initials there would tell a\n * buyer who HAS a photo that they have none — while hiding the control that\n * removes it. The absence of an answer is not evidence of absence.\n */\ntype AvatarState =\n | { status: 'reading' }\n | { status: 'known'; url: string | null }\n | { status: 'unread' };\n\nfunction ProfileSection({\n name,\n email,\n onSaved,\n}: {\n name: string;\n email: string;\n onSaved: () => void;\n}) {\n const nameId = useId();\n const [value, setValue] = useState(name);\n const [busy, setBusy] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [avatar, setAvatar] = useState<AvatarState>({ status: 'reading' });\n const [avatarAttempt, setAvatarAttempt] = useState(0);\n /** Set once a write has landed, so the mount read can no longer speak. */\n const avatarSettled = useRef(false);\n const [avatarBusy, setAvatarBusy] = useState<'upload' | 'remove' | null>(null);\n const avatarUrl = avatar.status === 'known' ? avatar.url : null;\n const fileInput = useRef<HTMLInputElement>(null);\n\n /*\n * The avatar lives on `/me`, NOT on the dashboard payload this panel is\n * built from — the dashboard's customer object carries a name and an email\n * and nothing else. Reading only the dashboard left every buyer who has a\n * photo looking at their initials, with no way to remove the picture they\n * had uploaded.\n *\n * Asked separately from the dashboard so that a slow or failed `/me` costs\n * the avatar and nothing else: the name, the email, the preferences and the\n * devices all still render.\n */\n useEffect(() => {\n let live = true;\n void callCustomerApi((sdk) => sdk.me()).then((result) => {\n if (!live) return;\n\n /*\n * A slow `/me` must not undo a change the buyer already made. The file\n * picker gives this read all the time it needs: the buyer opens it,\n * chooses a photo, the upload lands — and this response, in flight since\n * mount, would then put the OLD picture back on a screen that had\n * already shown the new one. The mutation is the newer truth, so once\n * one has landed this read has nothing left to say.\n */\n if (avatarSettled.current) return;\n\n if (!result.success) {\n // Said, not swallowed. `null` here would draw initials, which tells a\n // buyer who HAS a photo that they have none — and hides the control\n // that would let them remove it.\n setAvatar({ status: 'unread' });\n return;\n }\n setAvatar({ status: 'known', url: readAvatarUrl(result.data) });\n });\n return () => {\n live = false;\n };\n }, [avatarAttempt]);\n\n const save = async () => {\n if (!isSaveableName(value)) {\n setError(t('settings.nameTooShort'));\n return;\n }\n\n setBusy(true);\n setError(null);\n setNotice(null);\n const result = await callCustomerApi((sdk) => sdk.updateProfile({ name: value.trim() }));\n setBusy(false);\n\n if (!result.success) {\n setError(result.message?.trim() || t('settings.profileFailed'));\n return;\n }\n\n setNotice(t('settings.profileSaved'));\n onSaved();\n };\n\n const uploadAvatar = async (file: File) => {\n if (!isAcceptableAvatarSize(file.size)) {\n // The producer refuses anything larger, but only after buffering it.\n setError(t('settings.avatarTooLarge'));\n return;\n }\n\n setAvatarBusy('upload');\n setError(null);\n setNotice(null);\n const result = await callCustomerApi((sdk) => sdk.updateAvatar(file));\n setAvatarBusy(null);\n\n if (!result.success) {\n setError(result.message?.trim() || t('settings.avatarFailed'));\n return;\n }\n\n avatarSettled.current = true;\n setAvatar({ status: 'known', url: readAvatarUrl(result.data) });\n };\n\n const removeAvatar = async () => {\n setAvatarBusy('remove');\n setError(null);\n setNotice(null);\n const result = await callCustomerApi((sdk) => sdk.removeAvatar());\n setAvatarBusy(null);\n\n if (!result.success) {\n setError(result.message?.trim() || t('settings.avatarRemoveFailed'));\n return;\n }\n\n avatarSettled.current = true;\n setAvatar({ status: 'known', url: null });\n };\n\n return (\n <section>\n <AccountSectionTitle>{t('settings.profileTitle')}</AccountSectionTitle>\n\n <AccountCard className=\"sxa:mt-4 sxa:p-6\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-4\">\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className=\"sxa:h-16 sxa:w-16 sxa:rounded-full sxa:border sxa:object-cover\"\n />\n ) : (\n <div\n aria-hidden=\"true\"\n className=\"sxa:flex sxa:h-16 sxa:w-16 sxa:items-center sxa:justify-center sxa:rounded-full sxa:border sxa:bg-bg sxa:text-h3 sxa:font-semibold\"\n >\n {profileInitials(value, email)}\n </div>\n )}\n\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2\">\n {/*\n The input is cleared before every upload so that re-picking the\n same file still fires a change event — otherwise a failed upload\n can never be retried with the same photo.\n */}\n <input\n ref={fileInput}\n type=\"file\"\n accept=\"image/*\"\n className=\"sxa:hidden\"\n onChange={(event) => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (file) void uploadAvatar(file);\n }}\n />\n <button\n type=\"button\"\n disabled={avatarBusy !== null}\n aria-busy={avatarBusy === 'upload' || undefined}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => fileInput.current?.click()}\n >\n {avatarBusy === 'upload' ? t('settings.uploadingAvatar') : t('settings.uploadAvatar')}\n </button>\n {avatarUrl ? (\n <button\n type=\"button\"\n disabled={avatarBusy !== null}\n aria-busy={avatarBusy === 'remove' || undefined}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => void removeAvatar()}\n >\n {avatarBusy === 'remove' ? t('settings.removingAvatar') : t('settings.removeAvatar')}\n </button>\n ) : null}\n </div>\n </div>\n {avatar.status === 'unread' ? (\n <p role=\"alert\" className=\"sxa:mt-3 sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2 sxa:text-micro sxa:text-muted\">\n {t('common.notLoaded')}\n <button\n type=\"button\"\n onClick={() => {\n setAvatar({ status: 'reading' });\n setAvatarAttempt((attempt) => attempt + 1);\n }}\n className=\"sxa:underline sxa:underline-offset-2 sxa:transition-opacity sxa:hover:opacity-80\"\n >\n {t('common.retry')}\n </button>\n </p>\n ) : null}\n <p className=\"sxa:mt-2 sxa:text-micro sxa:text-muted\">{t('settings.avatarHint')}</p>\n\n <form\n noValidate\n className=\"sxa:mt-6 sxa:border-t sxa:pt-6\"\n onSubmit={(event) => {\n event.preventDefault();\n void save();\n }}\n >\n <p className=\"sxa:text-small sxa:font-medium\">{t('settings.emailLabel')}</p>\n <p className=\"sxa:mt-1 sxa:truncate sxa:text-small sxa:text-muted\">{email}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:leading-relaxed sxa:text-muted\">\n {t('settings.emailNote')}\n </p>\n\n <label htmlFor={nameId} className=\"sxa:mt-5 sxa:mb-1.5 sxa:block sxa:text-small sxa:font-medium\">\n {t('settings.nameLabel')}\n </label>\n <input\n id={nameId}\n type=\"text\"\n value={value}\n autoComplete=\"name\"\n disabled={busy}\n aria-invalid={error ? true : undefined}\n onChange={(event) => {\n setValue(event.target.value);\n setError(null);\n }}\n className={`${FIELD} sxa:max-w-md`}\n />\n\n {notice ? <AccountNotice message={notice} /> : null}\n {error ? <AccountFieldError message={error} /> : null}\n\n <button\n type=\"submit\"\n disabled={busy}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:mt-5 sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {busy ? <BusySpinner className=\"sxa:mr-1.5\" /> : null}\n {busy ? t('settings.savingProfile') : t('settings.saveProfile')}\n </button>\n </form>\n </AccountCard>\n </section>\n );\n}\n\nfunction EmailPreferencesSection() {\n const { state, reload } = useAccountResource('email-preferences', () =>\n callCustomerApi((sdk) => sdk.emailPreferences()));\n const { shown, broken } = useLastCompleteRead<EmailPreferences>(state, (payload) => {\n const narrowed = narrowEmailPreferences(payload);\n return narrowed.ok ? { ok: true, value: narrowed.preferences } : { ok: false };\n });\n const [pendingKey, setPendingKey] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const heading = <AccountSectionTitle>{t('settings.emailsTitle')}</AccountSectionTitle>;\n\n if (state.status === 'error' || broken) {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountError\n message={state.status === 'error' ? state.message : t('settings.emailsFailed')}\n onRetry={reload}\n />\n </div>\n </section>\n );\n }\n\n if (shown === null) {\n return (\n <section>\n {heading}\n <p role=\"status\" className=\"sxa:mt-4 sxa:text-small sxa:text-muted\">\n {t('settings.emailsLoading')}\n </p>\n </section>\n );\n }\n\n const write = async (\n key: string,\n call: () => Promise<{ success: boolean; message?: string }>,\n ) => {\n setPendingKey(key);\n setError(null);\n const result = await call();\n setPendingKey(null);\n\n if (!result.success) {\n setError(result.message?.trim() || t('settings.emailsSaveFailed'));\n return;\n }\n\n // Re-read rather than flip the box locally: the producer decides what a\n // change to one list does to the suppression record, and guessing that here\n // would show a consent state the server does not hold.\n reload();\n };\n\n return (\n <section>\n {heading}\n <AccountCard className=\"sxa:mt-4 sxa:p-6\">\n {error ? <AccountFieldError message={error} /> : null}\n\n <label className=\"sxa:flex sxa:items-start sxa:gap-3\">\n <input\n type=\"checkbox\"\n checked={shown.global_unsubscribed}\n disabled={pendingKey !== null}\n className=\"sxa:mt-1 sxa:h-4 sxa:w-4 sxa:shrink-0\"\n onChange={(event) => void write('global', () => callCustomerApi((sdk) =>\n sdk.updateEmailPreferences({ global_unsubscribed: event.target.checked })))}\n />\n <span className=\"sxa:min-w-0\">\n <span className=\"sxa:block sxa:text-small sxa:font-medium\">{t('settings.unsubscribeAll')}</span>\n <span className=\"sxa:mt-1 sxa:block sxa:text-micro sxa:text-muted\">\n {t('settings.unsubscribeAllNote')}\n </span>\n </span>\n </label>\n\n <div className=\"sxa:mt-5 sxa:space-y-4 sxa:border-t sxa:pt-4\">\n {shown.lists.length === 0 ? (\n <p className=\"sxa:text-small sxa:text-muted\">{t('settings.listsEmpty')}</p>\n ) : (\n shown.lists.map((list) => (\n <label key={list.id} className=\"sxa:flex sxa:items-start sxa:gap-3\">\n <input\n type=\"checkbox\"\n checked={list.subscribed}\n disabled={pendingKey !== null}\n className=\"sxa:mt-1 sxa:h-4 sxa:w-4 sxa:shrink-0\"\n onChange={(event) => void write(list.id, () => callCustomerApi((sdk) =>\n sdk.updateEmailPreferences({\n list_subscriptions: [{ list_id: list.id, subscribed: event.target.checked }],\n })))}\n />\n <span className=\"sxa:min-w-0\">\n <span className=\"sxa:block sxa:text-small sxa:font-medium\">{list.name}</span>\n {list.description ? (\n <span className=\"sxa:mt-1 sxa:block sxa:text-micro sxa:text-muted\">{list.description}</span>\n ) : null}\n </span>\n </label>\n ))\n )}\n </div>\n </AccountCard>\n </section>\n );\n}\n\nfunction DevicesSection() {\n const { state, reload } = useAccountResource('sessions', () =>\n callCustomerApi((sdk) => sdk.sessions()));\n const { shown, broken } = useLastCompleteRead<CustomerSession[]>(state, (payload) => {\n const narrowed = narrowCustomerSessions(payload);\n return narrowed.ok ? { ok: true, value: narrowed.sessions } : { ok: false };\n });\n /**\n * Which row is currently asking. One value for the whole section, so opening\n * a second question closes the first — two armed rows beside each other is\n * how the wrong device gets signed out.\n */\n const [armed, setArmed] = useState<string | null>(null);\n const [pendingId, setPendingId] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n\n const heading = <AccountSectionTitle>{t('settings.devicesTitle')}</AccountSectionTitle>;\n\n if (state.status === 'error' || broken) {\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4\">\n <AccountError\n message={state.status === 'error' ? state.message : t('settings.devicesFailed')}\n onRetry={reload}\n />\n </div>\n </section>\n );\n }\n\n if (shown === null) {\n return (\n <section>\n {heading}\n <p role=\"status\" className=\"sxa:mt-4 sxa:text-small sxa:text-muted\">\n {t('settings.devicesLoading')}\n </p>\n </section>\n );\n }\n\n const revoke = async (\n id: string,\n call: () => Promise<{ success: boolean; message?: string }>,\n done: string | null,\n ) => {\n setPendingId(id);\n setError(null);\n setNotice(null);\n const result = await call();\n setPendingId(null);\n\n if (!result.success) {\n setError(result.message?.trim() || t('settings.signOutDeviceFailed'));\n return;\n }\n\n setArmed(null);\n if (done) setNotice(done);\n reload();\n };\n\n return (\n <section>\n {heading}\n <div className=\"sxa:mt-4 sxa:space-y-3\">\n {error ? <AccountError message={error} /> : null}\n {notice ? <AccountNotice message={notice} /> : null}\n\n {shown.length === 0 ? (\n <p className=\"sxa:text-small sxa:text-muted\">{t('settings.devicesEmpty')}</p>\n ) : (\n <ul className=\"sxa:space-y-3\">\n {shown.map((session) => (\n <li\n key={session.id}\n className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:shadow-card\"\n >\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-medium\">\n {deviceLabel(session)}\n {session.current ? (\n <span className=\"sxa:ml-2 sxa:text-micro sxa:font-normal sxa:text-muted\">\n {t('settings.thisDevice')}\n </span>\n ) : null}\n </p>\n <p className=\"sxa:mt-1 sxa:truncate sxa:text-micro sxa:text-muted\">\n {session.ip_address ?? t('common.unavailable')}\n {' · '}\n {t('settings.signedInOn', {\n date: formatAccountDateTime(session.created_at),\n })}\n </p>\n </div>\n\n {/* The session making this request is never offered a sign-out\n of its own: the account shell's own control does that. */}\n {session.current ? null : armed === session.id ? (\n <ConfirmPair\n busy={pendingId === session.id}\n disabled={pendingId !== null}\n confirmLabel={t('settings.signOutDevice')}\n busyLabel={t('settings.signingOutDevice')}\n onConfirm={() => void revoke(\n session.id,\n () => callCustomerApi((sdk) => sdk.revokeSession(session.id)),\n null,\n )}\n onCancel={() => setArmed(null)}\n />\n ) : (\n <button\n type=\"button\"\n disabled={pendingId !== null}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => setArmed(session.id)}\n >\n {t('settings.signOutDevice')}\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n\n {hasOtherSessions(shown) ? (\n armed === 'others' ? (\n <ConfirmPair\n busy={pendingId === 'others'}\n disabled={pendingId !== null}\n confirmLabel={t('settings.signOutOthers')}\n busyLabel={t('settings.signingOutDevice')}\n onConfirm={() => void revoke(\n 'others',\n () => callCustomerApi((sdk) => sdk.revokeAllSessions()),\n t('settings.signOutOthersDone'),\n )}\n onCancel={() => setArmed(null)}\n />\n ) : (\n <button\n type=\"button\"\n disabled={pendingId !== null}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => setArmed('others')}\n >\n {t('settings.signOutOthers')}\n </button>\n )\n ) : null}\n </div>\n </section>\n );\n}\n\n/**\n * The second half of an armed control: commit, or step back.\n *\n * Signing a device out cannot be undone by the buyer — the device has to sign\n * in again — so the plain button is only ever the question, and this pair is\n * the answer.\n */\nexport function ConfirmPair({\n busy,\n disabled,\n confirmLabel,\n busyLabel,\n onConfirm,\n onCancel,\n}: {\n busy: boolean;\n disabled: boolean;\n confirmLabel: string;\n busyLabel: string;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n return (\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2\">\n <button\n type=\"button\"\n disabled={disabled}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-9 sxa:items-center sxa:px-4 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={onConfirm}\n >\n {busy ? <BusySpinner className=\"sxa:mr-1.5\" /> : null}\n {busy ? busyLabel : confirmLabel}\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={onCancel}\n >\n {t('subscriptions.keep')}\n </button>\n </div>\n );\n}\n\nfunction deviceLabel(session: CustomerSession): string {\n const described = describeUserAgent(session.user_agent);\n if (!described) return t('settings.unknownDevice');\n if (!described.os) return described.browser;\n return t('settings.deviceOn', { browser: described.browser, os: described.os });\n}\n\n/**\n * The avatar URL the producer answered with, or null when it sent none.\n *\n * Checked before it is rendered for the same reason a delivery link is: it is\n * a URL this template did not write, and the check is one call away.\n */\nfunction readAvatarUrl(data: unknown): string | null {\n if (typeof data !== 'object' || data === null) return null;\n const url = (data as { avatar_url?: unknown }).avatar_url;\n return typeof url === 'string' ? safeExternalHref(url) : null;\n}\n","/**\n * The settings panel's pure half: the two payloads it narrows, and the small\n * rules around what the buyer may change.\n *\n * What is deliberately absent: the email address (changing it is gated behind a\n * fresh code in the backend and has no allowlisted path), a password field\n * (this account signs in with a code, and `/security/password` is not open to\n * storefront code), and account deletion (there is no endpoint at all). A\n * control for any of them would be a control that cannot work.\n */\n\nexport interface EmailList {\n id: string;\n name: string;\n description: string | null;\n subscribed: boolean;\n}\n\nexport interface EmailPreferences {\n /** True when the buyer is suppressed from every marketing send. */\n global_unsubscribed: boolean;\n lists: EmailList[];\n}\n\nexport type EmailPreferencesResult =\n | { ok: true; preferences: EmailPreferences }\n | { ok: false };\n\nexport interface CustomerSession {\n id: string;\n created_at: string;\n expires_at: string;\n ip_address: string | null;\n user_agent: string | null;\n /** The session making the request. Never offered a \"sign out\" of its own. */\n current: boolean;\n}\n\nexport type CustomerSessionsResult =\n | { ok: true; sessions: CustomerSession[] }\n | { ok: false };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readNullableString(record: Record<string, unknown>, key: string): string | null | undefined {\n const value = record[key];\n if (value === null || typeof value === 'string') return value;\n return undefined;\n}\n\nexport function narrowEmailPreferences(payload: unknown): EmailPreferencesResult {\n if (!isRecord(payload) || typeof payload.global_unsubscribed !== 'boolean') return { ok: false };\n if (!Array.isArray(payload.lists)) return { ok: false };\n\n const lists: EmailList[] = [];\n for (const entry of payload.lists) {\n if (!isRecord(entry)) return { ok: false };\n const description = readNullableString(entry, 'description');\n if (\n typeof entry.id !== 'string'\n || typeof entry.name !== 'string'\n || description === undefined\n || typeof entry.subscribed !== 'boolean'\n ) {\n return { ok: false };\n }\n lists.push({ id: entry.id, name: entry.name, description, subscribed: entry.subscribed });\n }\n\n return { ok: true, preferences: { global_unsubscribed: payload.global_unsubscribed, lists } };\n}\n\nexport function narrowCustomerSessions(payload: unknown): CustomerSessionsResult {\n if (!isRecord(payload) || !Array.isArray(payload.sessions)) return { ok: false };\n\n const sessions: CustomerSession[] = [];\n for (const entry of payload.sessions) {\n if (!isRecord(entry)) return { ok: false };\n const ipAddress = readNullableString(entry, 'ip_address');\n const userAgent = readNullableString(entry, 'user_agent');\n if (\n typeof entry.id !== 'string'\n || typeof entry.created_at !== 'string'\n || typeof entry.expires_at !== 'string'\n || ipAddress === undefined\n || userAgent === undefined\n || typeof entry.current !== 'boolean'\n ) {\n return { ok: false };\n }\n sessions.push({\n id: entry.id,\n created_at: entry.created_at,\n expires_at: entry.expires_at,\n ip_address: ipAddress,\n user_agent: userAgent,\n current: entry.current,\n });\n }\n\n return { ok: true, sessions };\n}\n\n/** Whether any device other than this one is signed in. */\nexport function hasOtherSessions(sessions: readonly CustomerSession[]): boolean {\n return sessions.some((session) => !session.current);\n}\n\n/**\n * A device, in words a buyer recognises.\n *\n * Browser and system names are product names, so they are not translated; the\n * catalog owns the sentence they sit in. Order matters: Edge reports itself as\n * Chrome, and Chrome reports itself as Safari, so the most specific claim has\n * to be tested first or every device is a Safari.\n */\nexport function describeUserAgent(\n userAgent: string | null,\n): { browser: string; os: string | null } | null {\n const value = userAgent?.trim();\n if (!value) return null;\n\n const browser = value.includes('Edg/')\n ? 'Edge'\n : value.includes('OPR/') || value.includes('Opera')\n ? 'Opera'\n : value.includes('Firefox/')\n ? 'Firefox'\n : value.includes('Chrome/')\n ? 'Chrome'\n : value.includes('Safari/')\n ? 'Safari'\n : null;\n\n if (!browser) return null;\n\n const os = value.includes('Windows')\n ? 'Windows'\n : value.includes('Android')\n ? 'Android'\n : value.includes('iPhone') || value.includes('iPad')\n ? 'iOS'\n : value.includes('Mac OS X') || value.includes('Macintosh')\n ? 'macOS'\n : value.includes('Linux')\n ? 'Linux'\n : null;\n\n return { browser, os };\n}\n\n/**\n * The two letters shown while a buyer has no photo.\n *\n * The email is the fallback because it is the one thing every account has —\n * `ensurePortalIdentity` fills the name from it when the buyer never set one.\n */\nexport function profileInitials(name: string, email: string): string {\n const source = name.trim() || email.split('@')[0]?.trim() || '';\n const words = source.split(/\\s+/).filter(Boolean);\n if (words.length === 0) return '?';\n if (words.length === 1) return (words[0] ?? '').slice(0, 2).toLocaleUpperCase();\n const first = (words[0] ?? '').charAt(0);\n const last = (words[words.length - 1] ?? '').charAt(0);\n return `${first}${last}`.toLocaleUpperCase();\n}\n\n/** A name the producer will accept: `CustomerProfileUpdateBodySchema` requires one. */\nexport function isSaveableName(value: string): boolean {\n return value.trim().length >= 2;\n}\n\n/** The producer refuses anything larger, after buffering it. Stop it here. */\nexport const MAX_AVATAR_BYTES = 10 * 1024 * 1024;\n\nexport function isAcceptableAvatarSize(bytes: number): boolean {\n return bytes > 0 && bytes <= MAX_AVATAR_BYTES;\n}\n\n","/**\n * The buyer's recurring purchases.\n *\n * Subscriptions have no list route of their own — they ride along in the\n * dashboard payload — and the only per-item routes this panel calls are the\n * three the edge admits: pause, resume, cancel. All three END an obligation\n * instead of creating one, which is the reason storefront code may call them at\n * all.\n *\n * The payment-method portal is NOT one of them. That route answers with a\n * signed redirect into the provider's own portal, and any script sharing this\n * origin could fetch the link and forward it, so the lane renders no control\n * for it whatsoever — not a disabled one, which would promise that pressing it\n * would work. The buyer reaches the portal from the store's own emails, and the\n * panel says so rather than pretending the capability does not exist.\n *\n * List and detail are two views of one panel. The platform defines a detail\n * path for orders and for nothing else, so a `/dashboard/subscriptions/<id>`\n * URL would be this template inventing platform route shape; the selection\n * lives in component state instead.\n */\n\nimport { useState, type ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\nimport {\n billingMessage,\n cancelsAtPeriodEnd,\n narrowBillingHistory,\n subscriptionTiming,\n subscriptionTimingKey,\n} from './account-subscriptions';\nimport { callCustomerApi } from './customer-account';\nimport type { SdkCustomerSubscription } from '../sdk';\nimport { t } from './i18n';\nimport { LockIcon } from './icons';\nimport { useAccountDashboard } from './dashboard';\nimport {\n AccountBackButton,\n AccountCard,\n AccountEmpty,\n AccountError,\n AccountNotice,\n AccountRowsSkeleton,\n AccountSectionTitle,\n BusySpinner,\n StatusChip,\n formatAccountAmount,\n formatAccountDate,\n useAccountResource,\n} from './shared';\n\nexport function AccountSubscriptions() {\n const { state, reload } = useAccountDashboard();\n const [selectedUniqid, setSelectedUniqid] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n\n if (state.status === 'loading') {\n return <AccountRowsSkeleton rows={3} label={t('subscriptions.loading')} />;\n }\n\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n const subscriptions = state.data.subscriptions;\n\n if (subscriptions.length === 0) {\n return (\n <AccountEmpty\n title={t('subscriptions.emptyTitle')}\n body={t('subscriptions.emptyBody')}\n action={<BrowseStoreLink />}\n />\n );\n }\n\n /*\n * The selection is an id, never a copy of the row. Reloading after a cancel\n * replaces the payload, and holding the object would leave the detail view\n * describing the plan as it stood before the buyer changed it. An id that no\n * longer matches anything falls back to the list — which is exactly what a\n * subscription leaving the payload should look like.\n */\n const selected = subscriptions.find((entry) => entry.uniqid === selectedUniqid);\n\n if (selected) {\n return (\n <SubscriptionDetail\n subscription={selected}\n notice={notice}\n onBack={() => {\n setSelectedUniqid(null);\n setNotice(null);\n }}\n onChanged={(message) => {\n setNotice(message);\n reload();\n }}\n />\n );\n }\n\n return (\n <ul className=\"sxa:space-y-4\">\n {subscriptions.map((subscription) => (\n <li key={subscription.uniqid}>\n <button\n type=\"button\"\n onClick={() => {\n setNotice(null);\n setSelectedUniqid(subscription.uniqid);\n }}\n className=\"sxa:flex sxa:w-full sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:text-left sxa:shadow-card sxa:transition-opacity sxa:hover:opacity-80\"\n >\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">\n {subscription.plan?.name ?? t('subscriptions.unnamedPlan')}\n </p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">{timingLabel(subscription)}</p>\n </div>\n {/* A plan the producer did not send has no price to print, and a\n dash in its place would read as \"free\". */}\n {subscription.plan ? (\n <span className=\"sxa:shrink-0 sxa:text-small sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(subscription.plan.price, subscription.plan.currency)}\n </span>\n ) : null}\n <StatusChip status={subscription.status} />\n </button>\n </li>\n ))}\n </ul>\n );\n}\n\nfunction BrowseStoreLink() {\n return (\n <Link to=\"/all-products\" className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small\">\n {t('common.browseStore')}\n </Link>\n );\n}\n\nfunction timingLabel(subscription: SdkCustomerSubscription): string {\n const timing = subscriptionTiming(subscription);\n return t(subscriptionTimingKey(timing), { date: formatAccountDate(timing.date) });\n}\n\nfunction SubscriptionDetail({\n subscription,\n notice,\n onBack,\n onChanged,\n}: {\n subscription: SdkCustomerSubscription;\n notice: string | null;\n onBack: () => void;\n onChanged: (message: string) => void;\n}) {\n const [pendingAction, setPendingAction] = useState<'pause' | 'resume' | 'cancel' | null>(null);\n const [confirmingCancel, setConfirmingCancel] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const atPeriodEnd = cancelsAtPeriodEnd(subscription.gateway);\n\n const run = async (\n action: 'pause' | 'resume' | 'cancel',\n call: () => Promise<{ success: boolean; message?: string }>,\n doneMessage: string,\n ) => {\n setPendingAction(action);\n setActionError(null);\n const result = await call();\n setPendingAction(null);\n\n if (!result.success) {\n setActionError(result.message?.trim() || t('subscriptions.actionFailed'));\n return;\n }\n\n setConfirmingCancel(false);\n onChanged(doneMessage);\n };\n\n const billing = subscription.plan ? billingMessage(subscription.plan) : null;\n\n return (\n <div>\n <AccountBackButton onClick={onBack} label={t('subscriptions.allSubscriptions')} />\n\n <div className=\"sxa:mt-5 sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-4\">\n <div className=\"sxa:min-w-0\">\n <h2 className=\"sxa:font-heading sxa:text-h3 sxa:font-semibold\">\n {subscription.plan?.name ?? t('subscriptions.unnamedPlan')}\n </h2>\n <p className=\"sxa:mt-1 sxa:text-small sxa:text-muted\">\n {t('subscriptions.startedOn', { date: formatAccountDate(subscription.created_at) })}\n </p>\n </div>\n <StatusChip status={subscription.status} />\n </div>\n\n {notice ? <AccountNotice message={notice} /> : null}\n {actionError ? <div className=\"sxa:mt-3\"><AccountError message={actionError} /></div> : null}\n\n <AccountCard className=\"sxa:mt-5 sxa:p-6\">\n {subscription.plan ? (\n <>\n <p className=\"sxa:text-h2 sxa:font-bold sxa:tabular-nums\">\n {formatAccountAmount(subscription.plan.price, subscription.plan.currency)}\n </p>\n {billing ? (\n <p className=\"sxa:mt-1 sxa:text-small sxa:text-muted\">{t(billing.key, billing.params)}</p>\n ) : null}\n </>\n ) : null}\n\n <p className=\"sxa:mt-2 sxa:text-small sxa:text-muted\">{timingLabel(subscription)}</p>\n\n <dl className=\"sxa:mt-5 sxa:space-y-2.5 sxa:border-t sxa:pt-4 sxa:text-small\">\n <DetailRow label={t('subscriptions.gateway')}>{subscription.gateway}</DetailRow>\n <DetailRow label={t('subscriptions.paymentMethod')}>\n {/* Brand AND last four, or the producer's own word for the method.\n Half a card (\"Visa ending —\") is not a payment method. */}\n {subscription.payment_method?.card_brand && subscription.payment_method.card_last4\n ? t('subscriptions.cardOnFile', {\n brand: subscription.payment_method.card_brand,\n last4: subscription.payment_method.card_last4,\n })\n : subscription.payment_method?.type ?? t('subscriptions.noPaymentMethod')}\n </DetailRow>\n </dl>\n </AccountCard>\n\n {/*\n Where a \"Manage payment method\" button would have gone. The flag is true\n for every Stripe plan, cancelled ones included, and the route behind it\n answers with a signed provider URL — so this lane renders the sentence\n and no control at all.\n */}\n {subscription.actions.can_manage_payment_method ? (\n <p className=\"sxa:mt-4 sxa:flex sxa:items-start sxa:gap-2 sxa:text-small sxa:text-muted\">\n <LockIcon className=\"sxa:mt-0.5 sxa:h-4 sxa:w-4 sxa:shrink-0\" />\n {t('subscriptions.paymentMethodElsewhere')}\n </p>\n ) : null}\n\n {/*\n The producer's `actions` decide which controls exist. A flag that is\n false removes the button; it never disables one, because a disabled\n control still promises that pressing it would have worked.\n */}\n <div className=\"sxa:mt-6 sxa:flex sxa:flex-wrap sxa:gap-2\">\n {subscription.actions.can_pause ? (\n <button\n type=\"button\"\n disabled={pendingAction !== null}\n aria-busy={pendingAction === 'pause' || undefined}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => void run(\n 'pause',\n () => callCustomerApi((sdk) => sdk.pauseSubscription(subscription.uniqid)),\n t('subscriptions.paused'),\n )}\n >\n {pendingAction === 'pause' ? <BusySpinner className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" /> : null}\n {pendingAction === 'pause' ? t('subscriptions.pausing') : t('subscriptions.pause')}\n </button>\n ) : null}\n\n {subscription.actions.can_resume ? (\n <button\n type=\"button\"\n disabled={pendingAction !== null}\n aria-busy={pendingAction === 'resume' || undefined}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => void run(\n 'resume',\n () => callCustomerApi((sdk) => sdk.resumeSubscription(subscription.uniqid)),\n t('subscriptions.resumed'),\n )}\n >\n {pendingAction === 'resume' ? <BusySpinner className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" /> : null}\n {pendingAction === 'resume' ? t('subscriptions.resuming') : t('subscriptions.resume')}\n </button>\n ) : null}\n\n {subscription.actions.can_cancel && !confirmingCancel ? (\n <button\n type=\"button\"\n disabled={pendingAction !== null}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => setConfirmingCancel(true)}\n >\n {t('subscriptions.cancel')}\n </button>\n ) : null}\n </div>\n\n {/*\n Cancelling asks first, and the question names what cancelling does on\n THIS gateway. PayPal cannot stop a billing agreement at the period\n boundary, so telling that buyer they keep the days they already paid for\n would be a promise this template cannot keep.\n */}\n {confirmingCancel ? (\n <AccountCard className=\"sxa:mt-4 sxa:p-6\">\n <p className=\"sxa:font-heading sxa:font-semibold\">{t('subscriptions.confirmCancelTitle')}</p>\n <p className=\"sxa:mt-2 sxa:text-small sxa:text-muted\">\n {atPeriodEnd\n ? t('subscriptions.confirmCancelAtPeriodEnd', {\n date: formatAccountDate(subscription.current_period_end),\n })\n : t('subscriptions.confirmCancelNow')}\n </p>\n <div className=\"sxa:mt-4 sxa:flex sxa:flex-wrap sxa:items-center sxa:gap-2\">\n <button\n type=\"button\"\n disabled={pendingAction !== null}\n className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-8 sxa:items-center sxa:px-4 sxa:text-micro sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => setConfirmingCancel(false)}\n >\n {t('subscriptions.keep')}\n </button>\n <button\n type=\"button\"\n disabled={pendingAction !== null}\n aria-busy={pendingAction === 'cancel' || undefined}\n className=\"sx-account-button sxa:card-button sxa:card-button--add sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n onClick={() => void run(\n 'cancel',\n () => callCustomerApi((sdk) => sdk.cancelSubscription(subscription.uniqid, {\n cancel_at_period_end: atPeriodEnd,\n })),\n t('subscriptions.cancelled'),\n )}\n >\n {pendingAction === 'cancel' ? <BusySpinner className=\"sxa:mr-1.5 sxa:h-3.5 sxa:w-3.5\" /> : null}\n {pendingAction === 'cancel' ? t('subscriptions.cancelling') : t('subscriptions.cancel')}\n </button>\n </div>\n </AccountCard>\n ) : null}\n\n <BillingHistory uniqid={subscription.uniqid} />\n </div>\n );\n}\n\nfunction DetailRow({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"sxa:flex sxa:items-center sxa:justify-between sxa:gap-4\">\n <dt className=\"sxa:text-muted\">{label}</dt>\n <dd className=\"sxa:min-w-0 sxa:truncate sxa:text-right sxa:font-medium\">{children}</dd>\n </div>\n );\n}\n\nfunction BillingHistory({ uniqid }: { uniqid: string }) {\n const { state, reload } = useAccountResource(`billing:${uniqid}`, () =>\n callCustomerApi((sdk) => sdk.subscriptionBillingHistory(uniqid)));\n\n return (\n <section className=\"sxa:mt-8\">\n <AccountSectionTitle>{t('subscriptions.historyTitle')}</AccountSectionTitle>\n <div className=\"sxa:mt-4\">\n {state.status === 'loading' ? (\n <AccountRowsSkeleton rows={2} label={t('subscriptions.historyLoading')} />\n ) : null}\n\n {state.status === 'error' ? (\n <AccountError message={state.message} onRetry={reload} />\n ) : null}\n\n {state.status === 'ready' ? (\n <BillingHistoryList payload={state.data} reload={reload} />\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction BillingHistoryList({ payload, reload }: { payload: unknown; reload: () => void }) {\n const history = narrowBillingHistory(payload);\n\n /*\n * A payload that does not match the producer is not drawn as an empty\n * history. \"You were never billed\" and \"we could not read your invoices\" are\n * different answers, and only one of them is about the buyer's money.\n */\n if (!history.ok) {\n return <AccountError message={t('common.genericError')} onRetry={reload} />;\n }\n\n if (history.invoices.length === 0) {\n return (\n <AccountEmpty\n title={t('subscriptions.historyEmptyTitle')}\n body={t('subscriptions.historyEmptyBody')}\n />\n );\n }\n\n return (\n <ul className=\"sxa:space-y-4\">\n {history.invoices.map((invoice) => (\n <li key={invoice.uniqid} className=\"sxa:flex sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:shadow-card\">\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold sxa:tabular-nums\">\n {formatAccountAmount(invoice.total, invoice.currency)}\n </p>\n <p className=\"sxa:mt-1 sxa:truncate sxa:text-micro sxa:text-muted\">\n {formatAccountDate(invoice.created_at)}\n </p>\n </div>\n <StatusChip status={invoice.status} />\n </li>\n ))}\n </ul>\n );\n}\n","import type { SdkCustomerSubscription } from '../sdk';\n\n/**\n * The subscriptions panel's pure half: which date matters, how the plan bills,\n * what cancelling actually does, and the shape of the billing history.\n */\n\n/**\n * The one date worth showing, and what it means.\n *\n * Order matters and is not cosmetic. A cancelled subscription that still has a\n * period end would otherwise read \"Renews 1 Apr\" — the opposite of the truth —\n * and a subscription already set to stop must say so rather than advertise the\n * renewal it will never take.\n */\nexport type SubscriptionTiming =\n | { kind: 'canceled'; date: string }\n | { kind: 'ends'; date: string }\n | { kind: 'trial'; date: string }\n | { kind: 'renews'; date: string };\n\nexport function subscriptionTiming(subscription: SdkCustomerSubscription): SubscriptionTiming {\n if (subscription.status.toUpperCase() === 'CANCELED' && subscription.canceled_at) {\n return { kind: 'canceled', date: subscription.canceled_at };\n }\n if (subscription.cancel_at_period_end) {\n return { kind: 'ends', date: subscription.current_period_end };\n }\n if (subscription.status.toUpperCase() === 'TRIALING' && subscription.trial_end) {\n return { kind: 'trial', date: subscription.trial_end };\n }\n return { kind: 'renews', date: subscription.current_period_end };\n}\n\n/** The catalog key for a timing, so the panel never spells one itself. */\nexport function subscriptionTimingKey(timing: SubscriptionTiming): string {\n return `subscriptions.${timing.kind}`;\n}\n\nconst KNOWN_INTERVALS: ReadonlySet<string> = new Set(['day', 'week', 'month', 'year']);\n\n/**\n * How often the plan bills, as a catalog key plus its parameters.\n *\n * Singular and plural are separate keys rather than one string with a number in\n * it: \"every 1 months\" is wrong in English and worse in the languages that\n * decline the noun. An interval the gateway spells in a way this catalog does\n * not know keeps the raw word instead of being renamed into one that is close.\n */\nexport function billingMessage(\n plan: NonNullable<SdkCustomerSubscription['plan']>,\n): { key: string; params: { count: number; interval: string } } {\n const interval = plan.interval.trim().toLowerCase();\n // A gateway that reports 0 or a negative count still bills once per interval.\n const count = plan.interval_count > 0 ? plan.interval_count : 1;\n const params = { count, interval: plan.interval };\n\n if (!KNOWN_INTERVALS.has(interval)) {\n return { key: 'subscriptions.billingOther', params };\n }\n\n const suffix = count === 1 ? 'One' : 'Other';\n const name = interval.charAt(0).toUpperCase() + interval.slice(1);\n return { key: `subscriptions.billing${name}${suffix}`, params };\n}\n\n/**\n * Whether a cancellation lets the buyer keep the time they already paid for.\n *\n * PayPal cannot end a billing agreement at the period boundary, so a PayPal\n * cancellation takes effect at once. Every other gateway can, and does — which\n * is why the confirmation copy differs: telling a PayPal buyer they keep access\n * until April would be a promise this template cannot keep.\n */\nexport function cancelsAtPeriodEnd(gateway: string): boolean {\n return gateway.trim().toUpperCase() !== 'PAYPAL';\n}\n\nexport interface BillingHistoryInvoice {\n uniqid: string;\n total: string;\n currency: string;\n status: string;\n created_at: string;\n}\n\nexport type BillingHistoryResult =\n | { ok: true; invoices: BillingHistoryInvoice[] }\n | { ok: false };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readString(record: Record<string, unknown>, key: string): string | null {\n const value = record[key];\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * `GET /subscriptions/:uniqid/billing-history`, narrowed.\n *\n * The SDK hands this back as `unknown` because `@shoppex/contracts` defines no\n * schema for it, so the narrowing lives here — with a test against the shape\n * `SubscriptionService.getBillingHistory` really emits. A row missing any of\n * these fields fails the whole read rather than rendering an invoice with a\n * blank amount, which is the one thing a billing history must never do.\n */\nexport function narrowBillingHistory(payload: unknown): BillingHistoryResult {\n if (!isRecord(payload) || !Array.isArray(payload.invoices)) return { ok: false };\n\n const invoices: BillingHistoryInvoice[] = [];\n for (const entry of payload.invoices) {\n if (!isRecord(entry)) return { ok: false };\n\n const uniqid = readString(entry, 'uniqid');\n const total = readString(entry, 'total');\n const currency = readString(entry, 'currency');\n const status = readString(entry, 'status');\n const createdAt = readString(entry, 'created_at');\n if (uniqid === null || total === null || currency === null || status === null || createdAt === null) {\n return { ok: false };\n }\n\n invoices.push({ uniqid, total, currency, status, created_at: createdAt });\n }\n\n return { ok: true, invoices };\n}\n\n","/**\n * The buyer's conversations with the shop.\n *\n * The ticket LIST arrives inside the dashboard payload — `tickets.routes.ts`\n * publishes per-ticket routes and no collection — while a thread is a read of\n * its own. Opening a ticket and replying to one are the only writes this lane\n * admits. Closing is the merchant's, so a closed ticket loses its reply box\n * rather than gaining a control the producer answers 400 to.\n *\n * Three panels, three states each: a skeleton while a read is out, the\n * producer's own sentence plus a retry when one fails, and an empty state that\n * still offers the one thing a buyer with no tickets wants — a new ticket.\n */\n\nimport { useId, useState } from 'react';\nimport {\n isOwnMessage,\n isSendableMessage,\n isTicketClosed,\n messageAuthorKey,\n narrowSupportTicket,\n readCreatedTicketUniqid,\n ticketTitleToSend,\n type SupportTicket,\n} from './account-support';\nimport { callCustomerApi } from './customer-account';\nimport { t } from './i18n';\nimport { MessageSquareIcon } from './icons';\nimport { useAccountDashboard } from './dashboard';\nimport {\n AccountBackButton,\n AccountCard,\n AccountEmpty,\n AccountError,\n AccountFieldError,\n AccountRowsSkeleton,\n AccountSectionTitle,\n BusySpinner,\n StatusChip,\n formatAccountDateTime,\n useAccountResource,\n} from './shared';\n\n/** The contact form's control skin — see `components/contact/contact-form.tsx`. */\nconst FIELD =\n 'sx-account-field sxa:w-full sxa:rounded-card sxa:border sxa:bg-[color-mix(in_oklab,_var(--sx-bg)_40%,_transparent)] sxa:px-3 sxa:py-2.5 sxa:text-small sxa:shadow-card sxa:placeholder:text-muted sxa:focus-visible:border-accent sxa:focus-visible:ring-[3px] sxa:focus-visible:ring-[color-mix(in_oklab,_var(--sx-accent)_50%,_transparent)] sxa:focus-visible:outline-none';\n\ntype Mode =\n | { name: 'list' }\n | { name: 'create' }\n | { name: 'thread'; uniqid: string };\n\nexport function AccountSupport() {\n const { state, reload } = useAccountDashboard();\n const [mode, setMode] = useState<Mode>({ name: 'list' });\n\n if (state.status === 'loading') {\n return <AccountRowsSkeleton rows={3} label={t('support.loading')} />;\n }\n\n if (state.status === 'error') {\n return <AccountError message={state.message} onRetry={reload} />;\n }\n\n const tickets = state.data.tickets;\n\n if (mode.name === 'create') {\n return (\n <CreateTicket\n canGoBack={tickets.length > 0}\n onCancel={() => setMode({ name: 'list' })}\n onCreated={(uniqid) => {\n // The list lives in the dashboard payload, so a new ticket only\n // exists here once that payload has been read again.\n reload();\n setMode({ name: 'thread', uniqid });\n }}\n />\n );\n }\n\n if (mode.name === 'thread') {\n return (\n <SupportThread\n uniqid={mode.uniqid}\n onBack={() => setMode({ name: 'list' })}\n onReplied={reload}\n />\n );\n }\n\n if (tickets.length === 0) {\n return (\n <AccountEmpty\n title={t('support.emptyTitle')}\n body={t('support.emptyBody')}\n action={(\n <button\n type=\"button\"\n className=\"sx-account-cta sxa:cta-button sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small sxa:font-semibold\"\n onClick={() => setMode({ name: 'create' })}\n >\n {t('support.newTicket')}\n </button>\n )}\n />\n );\n }\n\n return (\n <div>\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-center sxa:justify-between sxa:gap-3\">\n <AccountSectionTitle>{t('support.ticketsTitle')}</AccountSectionTitle>\n <button\n type=\"button\"\n className=\"sx-account-button sxa:card-button sxa:card-button--add\"\n onClick={() => setMode({ name: 'create' })}\n >\n {t('support.newTicket')}\n </button>\n </div>\n\n <ul className=\"sxa:mt-4 sxa:space-y-3\">\n {tickets.map((ticket) => (\n <li key={ticket.uniqid}>\n <button\n type=\"button\"\n onClick={() => setMode({ name: 'thread', uniqid: ticket.uniqid })}\n className=\"sxa:flex sxa:w-full sxa:items-center sxa:gap-4 sxa:rounded-input sxa:border sxa:bg-surface sxa:p-5 sxa:text-left sxa:shadow-card sxa:transition-colors sxa:hover:bg-raised\"\n >\n <MessageSquareIcon className=\"sxa:h-4 sxa:w-4 sxa:shrink-0 sxa:text-muted\" />\n <div className=\"sxa:min-w-0 sxa:flex-1\">\n <p className=\"sxa:truncate sxa:text-small sxa:font-semibold\">{ticket.title}</p>\n <p className=\"sxa:mt-1 sxa:text-micro sxa:text-muted\">\n {t('support.updated', {\n date: formatAccountDateTime(ticket.updated_at),\n })}\n </p>\n </div>\n <StatusChip status={ticket.status} />\n </button>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction CreateTicket({\n canGoBack,\n onCancel,\n onCreated,\n}: {\n canGoBack: boolean;\n onCancel: () => void;\n onCreated: (uniqid: string) => void;\n}) {\n const fieldId = useId();\n const [title, setTitle] = useState('');\n const [message, setMessage] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async () => {\n if (!isSendableMessage(message)) {\n setError(t('support.tooShort'));\n return;\n }\n\n const subject = ticketTitleToSend(title);\n\n setBusy(true);\n setError(null);\n const result = await callCustomerApi((sdk) => sdk.createTicket({\n ...(subject === undefined ? {} : { title: subject }),\n message: message.trim(),\n }));\n setBusy(false);\n\n if (!result.success) {\n setError(result.message?.trim() || t('support.createFailed'));\n return;\n }\n\n const uniqid = readCreatedTicketUniqid(result.data);\n if (uniqid === null) {\n // The ticket may well exist, but without its id there is nothing to\n // open — saying so beats sending the buyer into a blank thread.\n setError(t('support.createFailed'));\n return;\n }\n\n onCreated(uniqid);\n };\n\n return (\n <div>\n {canGoBack ? (\n <AccountBackButton onClick={onCancel} label={t('support.backToTickets')} />\n ) : null}\n\n <AccountCard className={`sxa:p-6 ${canGoBack ? 'sxa:mt-5' : ''}`}>\n <form\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n void submit();\n }}\n >\n <label htmlFor={`${fieldId}-title`} className=\"sxa:mb-1.5 sxa:block sxa:text-small sxa:font-medium\">\n {t('support.subjectLabel')}\n <span className=\"sxa:ml-2 sxa:text-micro sxa:font-normal sxa:text-muted\">\n {t('support.subjectOptional')}\n </span>\n </label>\n <input\n id={`${fieldId}-title`}\n type=\"text\"\n value={title}\n disabled={busy}\n onChange={(event) => setTitle(event.target.value)}\n className={FIELD}\n />\n\n <label\n htmlFor={`${fieldId}-message`}\n className=\"sxa:mt-5 sxa:mb-1.5 sxa:block sxa:text-small sxa:font-medium\"\n >\n {t('support.messageLabel')}\n </label>\n <textarea\n id={`${fieldId}-message`}\n rows={5}\n value={message}\n disabled={busy}\n aria-invalid={error ? true : undefined}\n onChange={(event) => {\n setMessage(event.target.value);\n setError(null);\n }}\n className={`${FIELD} sxa:resize-none`}\n />\n\n {error ? <AccountFieldError message={error} /> : null}\n\n <button\n type=\"submit\"\n disabled={busy}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:mt-5 sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {busy ? <BusySpinner className=\"sxa:mr-1.5\" /> : null}\n {busy ? t('support.creating') : t('support.create')}\n </button>\n </form>\n </AccountCard>\n </div>\n );\n}\n\nfunction SupportThread({\n uniqid,\n onBack,\n onReplied,\n}: {\n uniqid: string;\n onBack: () => void;\n onReplied: () => void;\n}) {\n const { state, reload } = useAccountResource(`ticket:${uniqid}`, () =>\n callCustomerApi((sdk) => sdk.ticket(uniqid)));\n\n const back = <AccountBackButton onClick={onBack} label={t('support.backToTickets')} />;\n\n if (state.status === 'loading') {\n return (\n <div>\n {back}\n <div className=\"sxa:mt-5\">\n <AccountRowsSkeleton rows={3} label={t('support.loadingThread')} />\n </div>\n </div>\n );\n }\n\n if (state.status === 'error') {\n return (\n <div>\n {back}\n <div className=\"sxa:mt-5\">\n <AccountError message={state.message} onRetry={reload} />\n </div>\n </div>\n );\n }\n\n const narrowed = narrowSupportTicket(state.data);\n if (!narrowed.ok) {\n // A thread missing one message reads as the merchant never having answered,\n // so a partial read is not shown at all.\n return (\n <div>\n {back}\n <div className=\"sxa:mt-5\">\n <AccountError message={t('common.genericError')} onRetry={reload} />\n </div>\n </div>\n );\n }\n\n return (\n <div>\n {back}\n <ThreadBody\n ticket={narrowed.ticket}\n onReplied={() => {\n // Both reads move: the thread gains a message, and the dashboard's\n // row for it gains a new status and \"updated\" time.\n reload();\n onReplied();\n }}\n />\n </div>\n );\n}\n\nfunction ThreadBody({\n ticket,\n onReplied,\n}: {\n ticket: SupportTicket;\n onReplied: () => void;\n}) {\n const replyId = useId();\n const [reply, setReply] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const closed = isTicketClosed(ticket.status);\n\n const send = async () => {\n if (!isSendableMessage(reply)) {\n setError(t('support.tooShort'));\n return;\n }\n\n setBusy(true);\n setError(null);\n const result = await callCustomerApi((sdk) => sdk.replyToTicket(ticket.uniqid, reply.trim()));\n setBusy(false);\n\n if (!result.success) {\n setError(result.message?.trim() || t('support.replyFailed'));\n return;\n }\n\n setReply('');\n onReplied();\n };\n\n return (\n <div className=\"sxa:mt-5\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-start sxa:justify-between sxa:gap-4\">\n <div className=\"sxa:min-w-0\">\n <h2 className=\"sxa:font-heading sxa:truncate sxa:text-h3 sxa:font-semibold\">\n {ticket.title ?? t('support.untitled')}\n </h2>\n <p className=\"sxa:mt-1 sxa:text-small sxa:text-muted\">\n {t('support.updated', { date: formatAccountDateTime(ticket.updated_at) })}\n </p>\n {ticket.invoice_id ? (\n <p className=\"sxa:mt-1 sxa:text-small sxa:text-muted\">\n {t('support.aboutOrder', { id: ticket.invoice_id })}\n </p>\n ) : null}\n </div>\n <StatusChip status={ticket.status} />\n </div>\n\n {ticket.messages.length === 0 ? (\n <p className=\"sxa:mt-5 sxa:text-small sxa:leading-relaxed sxa:text-muted\">\n {t('support.noMessages')}\n </p>\n ) : (\n <ul className=\"sxa:mt-5 sxa:space-y-3\">\n {ticket.messages.map((message) => (\n <li key={message.id}>\n <AccountCard className=\"sxa:p-5\">\n <div className=\"sxa:flex sxa:flex-wrap sxa:items-baseline sxa:justify-between sxa:gap-2\">\n <p\n className={`sxa:text-small sxa:font-semibold ${isOwnMessage(message.role) ? 'sxa:text-accent' : ''}`}\n >\n {t(messageAuthorKey(message.role))}\n </p>\n <p className=\"sxa:text-micro sxa:text-muted\">\n {formatAccountDateTime(message.created_at)}\n </p>\n </div>\n {/* A written message keeps its own line breaks. */}\n <p className=\"sxa:mt-2 sxa:text-small sxa:leading-relaxed sxa:text-muted sxa:whitespace-pre-wrap\">\n {message.message}\n </p>\n </AccountCard>\n </li>\n ))}\n </ul>\n )}\n\n {closed ? (\n <AccountCard className=\"sxa:mt-5 sxa:p-5\">\n <p className=\"sxa:text-small sxa:font-semibold\">{t('support.closedTitle')}</p>\n <p className=\"sxa:mt-1 sxa:text-small sxa:leading-relaxed sxa:text-muted\">\n {t('support.closedBody')}\n </p>\n </AccountCard>\n ) : (\n <form\n noValidate\n className=\"sxa:mt-5\"\n onSubmit={(event) => {\n event.preventDefault();\n void send();\n }}\n >\n <label htmlFor={replyId} className=\"sxa:mb-1.5 sxa:block sxa:text-small sxa:font-medium\">\n {t('support.replyLabel')}\n </label>\n <textarea\n id={replyId}\n rows={4}\n value={reply}\n disabled={busy}\n aria-invalid={error ? true : undefined}\n onChange={(event) => {\n setReply(event.target.value);\n setError(null);\n }}\n className={`${FIELD} sxa:resize-none`}\n />\n {error ? <AccountFieldError message={error} /> : null}\n <button\n type=\"submit\"\n disabled={busy}\n aria-busy={busy || undefined}\n className=\"sx-account-cta sxa:cta-button sxa:mt-4 sxa:inline-flex sxa:h-10 sxa:items-center sxa:px-5 sxa:text-small sxa:font-semibold sxa:disabled:cursor-not-allowed sxa:disabled:opacity-50\"\n >\n {busy ? <BusySpinner className=\"sxa:mr-1.5\" /> : null}\n {busy ? t('support.replying') : t('support.reply')}\n </button>\n </form>\n )}\n </div>\n );\n}\n","/**\n * The support panel's pure half: the ticket thread's shape, what closes a\n * ticket, and what counts as a message worth sending.\n */\n\nexport type SupportMessageRole = 'CUSTOMER' | 'MERCHANT' | 'SYSTEM';\n\nexport interface SupportMessage {\n id: string;\n /** 'CUSTOMER' | 'MERCHANT' | 'SYSTEM' as the producer stores it. */\n role: SupportMessageRole;\n message: string;\n created_at: string;\n}\n\nexport interface SupportTicket {\n uniqid: string;\n /** Null when the ticket was opened without one. */\n title: string | null;\n status: string;\n /** The order this ticket is about, when the buyer named one. */\n invoice_id: string | null;\n created_at: string;\n updated_at: string;\n messages: SupportMessage[];\n}\n\nexport type SupportTicketResult =\n | { ok: true; ticket: SupportTicket }\n | { ok: false };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readNullableString(record: Record<string, unknown>, key: string): string | null | undefined {\n const value = record[key];\n if (value === null || typeof value === 'string') return value;\n return undefined;\n}\n\nfunction isSupportMessageRole(value: unknown): value is SupportMessageRole {\n return value === 'CUSTOMER' || value === 'MERCHANT' || value === 'SYSTEM';\n}\n\n/**\n * `GET /tickets/:uniqid`, narrowed.\n *\n * The producer nests the ticket one level down (`{ ticket: { … } }`) and its\n * messages come back as a flat, already-ordered array. A thread that cannot be\n * read completely is not shown at all: a conversation missing a message reads\n * as the merchant never answering.\n */\nexport function narrowSupportTicket(payload: unknown): SupportTicketResult {\n if (!isRecord(payload) || !isRecord(payload.ticket)) return { ok: false };\n\n const raw = payload.ticket;\n const uniqid = raw.uniqid;\n const title = readNullableString(raw, 'title');\n const status = raw.status;\n const invoiceId = readNullableString(raw, 'invoice_id');\n const createdAt = raw.created_at;\n const updatedAt = raw.updated_at;\n\n if (\n typeof uniqid !== 'string'\n || title === undefined\n || typeof status !== 'string'\n || invoiceId === undefined\n || typeof createdAt !== 'string'\n || typeof updatedAt !== 'string'\n || !Array.isArray(raw.messages)\n ) {\n return { ok: false };\n }\n\n const messages: SupportMessage[] = [];\n for (const entry of raw.messages) {\n if (!isRecord(entry)) return { ok: false };\n const { id, role, message, created_at: messageCreatedAt } = entry;\n if (\n typeof id !== 'string'\n || !isSupportMessageRole(role)\n || typeof message !== 'string'\n || typeof messageCreatedAt !== 'string'\n ) {\n return { ok: false };\n }\n messages.push({ id, role, message, created_at: messageCreatedAt });\n }\n\n return {\n ok: true,\n ticket: {\n uniqid,\n title,\n status,\n invoice_id: invoiceId,\n created_at: createdAt,\n updated_at: updatedAt,\n messages,\n },\n };\n}\n\n/**\n * A closed ticket takes no replies — the producer answers 400 for one — so the\n * form is replaced rather than left to fail on submit.\n */\nexport function isTicketClosed(status: string): boolean {\n return status.trim().toUpperCase() === 'CLOSED';\n}\n\n/**\n * Whether there is a message here at all.\n *\n * Two characters, matching the hosted portal, and measured after trimming: a\n * field holding three spaces is an empty ticket that costs the merchant a\n * notification and the buyer an answer to nothing.\n */\nexport function isSendableMessage(value: string): boolean {\n return value.trim().length >= 2;\n}\n\n/** The title to send, or nothing at all when the buyer left it blank. */\nexport function ticketTitleToSend(value: string): string | undefined {\n const title = value.trim();\n return title.length > 0 ? title : undefined;\n}\n\n/** Who wrote a message, as a catalog key. */\nexport function messageAuthorKey(role: SupportMessageRole): string {\n if (role === 'CUSTOMER') return 'support.fromYou';\n if (role === 'SYSTEM') return 'support.fromSystem';\n return 'support.fromMerchant';\n}\n\n/**\n * The id of a ticket that was just created, or null when the response did not\n * carry one.\n *\n * `POST /tickets` answers `{ uniqid }` and the panel opens that thread next.\n * Without an id there is nothing to open, and guessing one would send the buyer\n * to somebody else's ticket or to a 404 dressed as their own.\n */\nexport function readCreatedTicketUniqid(data: unknown): string | null {\n if (!isRecord(data)) return null;\n const uniqid = data.uniqid;\n return typeof uniqid === 'string' && uniqid.length > 0 ? uniqid : null;\n}\n\n/** Whether this message sits on the buyer's side of the thread. */\nexport function isOwnMessage(role: SupportMessageRole): boolean {\n return role === 'CUSTOMER';\n}\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,aAAAA,YAAW,YAAAC,kBAAuE;AAC3F,SAAS,QAAAC,OAAM,UAAU,mBAAmB;;;AC+D5C,IAAM,YAAuD;AAAA,EAC3D,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AACZ;AAEO,SAAS,eAAe,KAA8B;AAC3D,SAAO,UAAU,GAAG;AACtB;AAEO,SAAS,wBACd,QACA,UACqB;AACrB,SAAO;AAAA,IACL,WAAW,OAAO,gBAAgB,KAAK,OAAO,oBAAoB;AAAA,IAClE,eAAe,OAAO,qBAAqB;AAAA,IAC3C,QAAQ,OAAO;AAAA,IACf,SAAS;AAAA,IACT,WAAW,OAAO,mBAAmB;AAAA,IACrC,WAAW;AAAA,IACX,UAAU,yBAAyB,QAAQ;AAAA,EAC7C;AACF;AAQO,SAAS,yBAAyB,SAA+C;AACtF,MAAI,CAAC,SAAS,gBAAiB,QAAO;AACtC,SAAO,QAAQ,aAAa,QAAQ,QAAQ,gBAAgB,YAAY,MAAM;AAChF;AAiBO,SAAS,2BACd,WACA,SACA,WAC4B;AAC5B,MAAI,cAAc,KAAM,QAAO;AAE/B,QAAM,eAAe,wBAAwB,WAAW,OAAO;AAW/D,MAAI,YAAY,QAAQ,cAAc,MAAM;AAC1C,WAAO,EAAE,GAAG,cAAc,UAAU,UAAU,SAAS;AAAA,EACzD;AAEA,SAAO;AACT;AAUO,SAAS,oBACd,KACA,cACA,WACS;AACT,MAAI,QAAQ,UAAW,QAAO;AAE9B,QAAM,OAAO,eAAe,GAAG;AAC/B,MAAI,SAAS,SAAU,QAAO;AAI9B,MAAI,iBAAiB,KAAM,QAAO;AAElC,SAAO,aAAa,IAAI;AAC1B;;;ACxJO,IAAM,iCAAiC;AAGvC,IAAM,gCAAgC;AAE7C,IAAM,qBAAqB;AAE3B,IAAM,+BAA+B,GAAG,8BAA8B;AAYtE,SAAS,YAAY,KAAa,MAA6B;AAC7D,aAAW,SAAS,IAAI,MAAM,GAAG,GAAG;AAClC,UAAM,YAAY,MAAM,QAAQ,GAAG;AACnC,QAAI,YAAY,EAAG;AACnB,QAAI,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,MAAM,KAAM;AAC/C,WAAO,MAAM,MAAM,YAAY,CAAC,EAAE,KAAK;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAmC;AAC5D,MAAI,CAAC,OAAO,CAAC,mBAAmB,KAAK,GAAG,EAAG,QAAO;AAClD,SAAO;AACT;AASO,SAAS,6BACd,KACA,KACM;AACN,QAAM,SAAS,IAAI,gBAAgB,IAAI,SAAS,MAAM;AACtD,MAAI,CAAC,OAAO,IAAI,6BAA6B,EAAG;AAEhD,QAAM,QAAQ,kBAAkB,OAAO,IAAI,6BAA6B,CAAC;AACzE,SAAO,OAAO,6BAA6B;AAC3C,QAAM,QAAQ,OAAO,SAAS;AAC9B,MAAI,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,IACA,GAAG,IAAI,SAAS,QAAQ,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE,GAAG,IAAI,SAAS,IAAI;AAAA,EACzE;AAEA,MAAI,CAAC,MAAO;AACZ,MAAI,SAAS,GAAG,8BAA8B,IAAI,KAAK,2CAA2C,kBAAkB;AACtH;AAGO,SAAS,0BAA0B,KAAoD;AAC5F,SAAO,kBAAkB,YAAY,IAAI,QAAQ,8BAA8B,CAAC;AAClF;AAGO,SAAS,2BAA2B,KAA2C;AACpF,MAAI,SAAS;AACf;;;ACjDO,IAAM,iCAAiC;AAE9C,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AASxB,IAAM,uBAAuB,GAAG,8BAA8B;AAa9D,SAAS,OAAO,KAAc,WAA2B;AACvD,QAAM,QAAQ,OAAO,QAAQ,WAAW,IAAI,KAAK,IAAI;AACrD,MAAI,CAAC,SAAS,MAAM,SAAS,UAAW,QAAO;AAC/C,SAAO,KAAK,KAAK,KAAK,IAAI,KAAK;AACjC;AAGA,SAASC,aAAY,KAAa,MAA6B;AAC7D,aAAW,SAAS,IAAI,MAAM,GAAG,GAAG;AAClC,UAAM,YAAY,MAAM,QAAQ,GAAG;AACnC,QAAI,YAAY,EAAG;AACnB,QAAI,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,MAAM,KAAM;AAC/C,WAAO,MAAM,MAAM,YAAY,CAAC,EAAE,KAAK;AAAA,EACzC;AACA,SAAO;AACT;AAOA,SAAS,aAAa,KAA0C;AAC9D,MAAI;AACJ,MAAI;AACF,YAAQ,KAAK,MAAM,mBAAmB,GAAG,CAAC;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AAExE,QAAM,SAAS;AACf,QAAM,QAAQ,OAAO,OAAO,OAAO,gBAAgB;AACnD,QAAM,OAAO,OAAO,OAAO,MAAM,eAAe;AAChD,MAAI,CAAC,SAAS,CAAC,KAAM,QAAO;AAC5B,SAAO,EAAE,OAAO,KAAK;AACvB;AAeO,SAAS,yBAAyB,KAAoD;AAC3F,QAAM,MAAMA,aAAY,IAAI,QAAQ,8BAA8B;AAClE,MAAI,QAAQ,KAAM,QAAO;AAEzB,MAAI,SAAS;AACb,SAAO,aAAa,GAAG;AACzB;;;ACxHA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC9cA;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,OAAS;AAAA,IACT,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,MAAQ;AAAA,MACN,UAAY;AAAA,MACZ,QAAU;AAAA,MACV,WAAa;AAAA,MACb,eAAiB;AAAA,MACjB,SAAW;AAAA,MACX,WAAa;AAAA,MACb,WAAa;AAAA,MACb,SAAW;AAAA,MACX,UAAY;AAAA,MACZ,UAAY;AAAA,IACd;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,YAAc;AAAA,IACd,QAAU;AAAA,IACV,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,QAAU;AAAA,IACR,WAAa;AAAA,IACb,YAAc;AAAA,IACd,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,WAAa;AAAA,IACb,sBAAwB;AAAA,IACxB,SAAW;AAAA,IACX,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,YAAc;AAAA,IACd,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,WAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,YAAc;AAAA,IACd,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,WAAa;AAAA,IACb,iBAAmB;AAAA,IACnB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,wBAA0B;AAAA,IAC1B,uBAAyB;AAAA,IACzB,uBAAyB;AAAA,IACzB,oBAAsB;AAAA,IACtB,oBAAsB;AAAA,IACtB,uBAAyB;AAAA,IACzB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,mBAAqB;AAAA,IACrB,qBAAuB;AAAA,EACzB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,aAAe;AAAA,IACf,YAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,kBAAoB;AAAA,IACpB,aAAe;AAAA,IACf,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,wBAA0B;AAAA,IAC1B,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,oBAAsB;AAAA,IACtB,0BAA4B;AAAA,IAC5B,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,SAAW;AAAA,IACX,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,OAAS;AAAA,EACX;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,EACb;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,WAAa;AAAA,IACb,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,sBAAwB;AAAA,IACxB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,qBAAuB;AAAA,IACvB,aAAe;AAAA,IACf,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,gBAAkB;AAAA,IAClB,qBAAuB;AAAA,IACvB,iBAAmB;AAAA,IACnB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,cAAgB;AAAA,EAClB;AAAA,EACA,WAAa;AAAA,IACX,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,YAAc;AAAA,IACd,iBAAmB;AAAA,IACnB,gBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,SAAW;AAAA,IACX,kBAAoB;AAAA,IACpB,uBAAyB;AAAA,IACzB,sBAAwB;AAAA,IACxB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,IACpB,mBAAqB;AAAA,IACrB,iBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,gBAAkB;AAAA,IAClB,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,eAAiB;AAAA,IACjB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,YAAc;AAAA,IACd,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,UAAY;AAAA,EACd;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,WAAa;AAAA,IACb,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,oBAAsB;AAAA,IACtB,gBAAkB;AAAA,IAClB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,oBAAsB;AAAA,IACtB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,YAAc;AAAA,IACd,eAAiB;AAAA,IACjB,eAAiB;AAAA,IACjB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,qBAAuB;AAAA,IACvB,UAAY;AAAA,EACd;AAAA,EACA,aAAe;AAAA,IACb,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,QAAU;AAAA,EACZ;AAAA,EACA,UAAY;AAAA,IACV,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,YAAc;AAAA,IACd,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,iBAAmB;AAAA,IACnB,cAAgB;AAAA,IAChB,OAAS;AAAA,IACT,cAAgB;AAAA,IAChB,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAgB;AAAA,IAChB,QAAU;AAAA,IACV,mBAAqB;AAAA,IACrB,kBAAoB;AAAA,IACpB,eAAiB;AAAA,IACjB,gBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,aAAe;AAAA,IACf,aAAe;AAAA,IACf,UAAY;AAAA,IACZ,kBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,kBAAoB;AAAA,IACpB,iBAAmB;AAAA,IACnB,UAAY;AAAA,IACZ,cAAgB;AAAA,IAChB,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,gBAAkB;AAAA,IAClB,eAAiB;AAAA,IACjB,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,cAAgB;AAAA,EAClB;AACF;;;AC1ZO,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1C;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAC5C;AAIO,IAAM,iBAAyB;AAE/B,IAAM,mBAA6D;AAAA,EACxE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,cAA8B,iBAAiB;AAKrD,SAAS,kBAAkB,OAAgC;AAChE,SAAQ,kBAAwC,SAAS,KAAK;AAChE;AAUO,SAAS,cAAc,MAAyC;AACrE,QAAM,QAAQ,QAAQ,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,EAAE,CAAC,KAAK;AACnE,SAAO,kBAAkB,IAAI,IAAI,OAAO;AAC1C;AAMA,SAAS,UAAU,SAAqC,KAAiC;AACvF,MAAI,QAA6C;AACjD,aAAW,WAAW,IAAI,MAAM,GAAG,GAAG;AACpC,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,YAAQ,MAAM,OAAO;AAAA,EACvB;AACA,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,YAAY,SAAiB,QAA2C;AAC/E,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,QAAQ,QAAQ,iBAAiB,CAAC,OAAO,SAC9C,OAAO,UAAU,eAAe,KAAK,QAAQ,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC,IAAI,KAC7E;AACH;AAGO,SAAS,WAAW,KAAsB;AAC/C,SAAO,UAAU,aAAa,GAAG,MAAM;AACzC;AAEO,SAAS,UAAU,QAAgB,KAAa,QAAgC;AACrF,QAAM,UAAU,UAAU,iBAAiB,MAAM,GAAG,GAAG,KAAK,UAAU,aAAa,GAAG;AAEtF,MAAI,YAAY,OAAW,QAAO;AAClC,SAAO,YAAY,SAAS,MAAM;AACpC;AAUO,SAAS,kBACd,QACA,KACA,QACoB;AACpB,SAAO,WAAW,GAAG,IAAI,UAAU,QAAQ,KAAK,MAAM,IAAI;AAC5D;AAEA,IAAI;AAEJ,SAAS,iBAAyB;AAChC,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,SAAO,cAAc,SAAS,gBAAgB,aAAa,MAAM,CAAC;AACpE;AAGO,SAAS,kBAA0B;AACxC,MAAI,iBAAiB,OAAW,gBAAe,eAAe;AAC9D,SAAO;AACT;AAOO,SAAS,EAAE,KAAa,QAAgC;AAC7D,SAAO,UAAU,gBAAgB,GAAG,KAAK,MAAM;AACjD;AAEO,SAAS,UAAU,KAAa,QAA4C;AACjF,SAAO,kBAAkB,gBAAgB,GAAG,KAAK,MAAM;AACzD;;;AC3JA,eAAsB,gBACpB,WACyB;AACzB,MAAI;AACF,WAAO,MAAM,UAAU,WAAW,CAAC;AAAA,EACrC,SAAS,OAAO;AAOd,QAAI,iBAAiB,UAAW,QAAO,EAAE,SAAS,MAAM;AACxD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAChE;AAAA,EACF;AACF;AAwBO,SAAS,sBAA8B;AAC5C,SAAO,EAAE,qBAAqB;AAChC;AAUO,SAAS,iBAAiB,MAAgD;AAC/E,QAAM,MAAM,MAAM,KAAK,KAAK;AAC5B,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,IAAI,WAAW,GAAG,EAAG,QAAO;AAEhC,QAAM,SAAS,IAAI,MAAM,GAAG,IAAI,QAAQ,GAAG,CAAC,EAAE,YAAY;AAC1D,MAAI,IAAI,SAAS,GAAG,KAAK,WAAW,UAAU,WAAW,QAAS,QAAO;AACzE,SAAO;AACT;AAEO,SAAS,aAAgB,UAAgD;AAC9E,MAAI,CAAC,SAAS,WAAW,SAAS,SAAS,QAAW;AACpD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,SAAS,SAAS,KAAK,KAAK,oBAAoB;AAAA,IAC3D;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,SAAS,MAAM,SAAS,KAAK;AAChD;;;AC5EA,SAAS,eAAe,YAAY,UAAAC,eAA8B;;;AC4E3D,IAAM,8BAA8B;AACpC,IAAM,8BAA8B;AAEpC,SAAS,wBAAwB,OAAwB;AAC9D,SAAO,OAAO,UAAU,KAAK,KACxB,SAAS,+BACT,SAAS;AAChB;AAyFA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,iBAAiB,OAAwC;AAChE,SAAO,UAAU,QAAQ,OAAO,UAAU;AAC5C;AAEA,SAAS,eAAe,OAAiC;AACvD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAC3D;AAEA,SAAS,iBAAiB,OAAiD;AACzE,SAAO,UAAU,YAAY,UAAU,iBAAiB,UAAU;AACpE;AAEA,SAAS,iBAAiB,OAAyC;AACjE,SACE,UAAU,aACV,UAAU,aACV,UAAU,YACV,UAAU,eACV,UAAU;AAEd;AAEA,SAAS,kBAAkB,OAAkD;AAC3E,SAAO,UAAU,aAAa,UAAU,aAAa,UAAU;AACjE;AAEA,SAAS,WACP,OACA,iBAAiB,OACgB;AACjC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,OAAO,SAAU,QAAO;AAC7D,MAAI,gBAAgB;AAClB,QACE,CAAC,iBAAiB,MAAM,IAAI,KAC5B,EACE,MAAM,qBAAqB,QAC3B,eAAe,MAAM,gBAAgB,IAEvC;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,kBAAkB,MAAM;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,OAAO,MAAM,SAAS,YAAY,CAAC,eAAe,MAAM,gBAAgB;AAC1E,WAAO;AACT,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,kBAAkB,MAAM;AAAA,EAC1B;AACF;AAEA,SAAS,mBACP,OACyC;AACzC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,QAAM,OAAO,WAAW,MAAM,MAAM,IAAI;AACxC,MACE,OAAO,MAAM,OAAO,YACpB,CAAC,iBAAiB,MAAM,MAAM,KAC9B,SAAS,UACT,CAAC,iBAAiB,MAAM,gBAAgB,KACxC,OAAO,MAAM,qBAAqB,YAClC,CAAC,eAAe,MAAM,eAAe,KACrC,CAAC,iBAAiB,MAAM,WAAW,KACnC,OAAO,MAAM,eAAe,UAC5B;AACA,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,QAAQ,MAAM;AAAA,IACd;AAAA,IACA,kBAAkB,MAAM;AAAA,IACxB,kBAAkB,MAAM;AAAA,IACxB,iBAAiB,MAAM;AAAA,IACvB,aAAa,MAAM;AAAA,IACnB,YAAY,MAAM;AAAA,EACpB;AACF;AAGO,SAAS,sBACd,SACoC;AACpC,MAAI,CAAC,SAAS,OAAO,EAAG,QAAO,EAAE,IAAI,MAAM;AAC3C,QAAM,WAAW,mBAAmB,QAAQ,QAAQ;AACpD,MACE,OAAO,QAAQ,oBAAoB,aACnC,CAAC,iBAAiB,QAAQ,eAAe,KACzC,CAAC,iBAAiB,QAAQ,mBAAmB,KAC7C,OAAO,QAAQ,6BAA6B,aAC5C,aAAa,QACb;AACA,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,iBAAiB,QAAQ;AAAA,MACzB,iBAAiB,QAAQ;AAAA,MACzB,qBAAqB,QAAQ;AAAA,MAC7B,0BAA0B,QAAQ;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,uBACd,SACoC;AACpC,MAAI,CAAC,SAAS,OAAO,EAAG,QAAO,EAAE,IAAI,MAAM;AAC3C,QAAM,WAAW,mBAAmB,QAAQ,QAAQ;AACpD,SAAO,WAAW,EAAE,IAAI,MAAM,MAAM,SAAS,IAAI,EAAE,IAAI,MAAM;AAC/D;AAEA,SAAS,qBAAqB,OAA+C;AAC3E,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MACE,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,UAAU,YACvB,CAAC,eAAe,MAAM,KAAK,KAC3B,OAAO,MAAM,oBAAoB,aACjC,OAAO,MAAM,cAAc,aAC3B,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,eAAe,YAC5B,CAAC,eAAe,MAAM,gBAAgB,KACtC,CAAC,kBAAkB,MAAM,gBAAgB;AAEzC,WAAO;AACT,SAAO;AACT;AAEA,SAAS,kBAAkB,OAA4C;AACrE,MAAI,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,QAAQ,EAAG,QAAO;AAC/D,QAAM,WAAqC,CAAC;AAC5C,aAAW,OAAO,MAAM,UAAU;AAChC,UAAM,UAAU,qBAAqB,GAAG;AACxC,QAAI,CAAC,QAAS,QAAO;AACrB,aAAS,KAAK,OAAO;AAAA,EACvB;AACA,MACE,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,UAAU,YACvB,OAAO,MAAM,SAAS,YACtB,CAAC,eAAe,MAAM,KAAK,KAC3B,OAAO,MAAM,oBAAoB,aACjC,OAAO,MAAM,cAAc,aAC3B,OAAO,MAAM,4BAA4B,aACzC,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,eAAe,YAC5B,CAAC,eAAe,MAAM,gBAAgB,KACtC,CAAC,kBAAkB,MAAM,gBAAgB;AAEzC,WAAO;AACT,SAAO;AAAA,IACL,YAAY,MAAM;AAAA,IAClB,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,iBAAiB,MAAM;AAAA,IACvB,WAAW,MAAM;AAAA,IACjB,yBAAyB,MAAM;AAAA,IAC/B,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,kBAAkB,MAAM;AAAA,IACxB,kBAAkB,MAAM;AAAA,IACxB;AAAA,EACF;AACF;AAGO,SAAS,sBACd,SACsC;AACtC,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,QAAQ,OAAO,EAAG,QAAO,EAAE,IAAI,MAAM;AACzE,QAAM,OAAO,WAAW,QAAQ,IAAI;AACpC,QAAM,MAAM,QAAQ;AACpB,MACE,CAAC,QACD,OAAO,KAAK,SAAS,YACrB,OAAO,KAAK,qBAAqB,YACjC,OAAO,IAAI,aAAa,YACxB,CAAC,eAAe,IAAI,KAAK,KACzB,CAAC,eAAe,IAAI,IAAI,KACxB,CAAC,eAAe,IAAI,QAAQ,KAC5B,CAAC,MAAM,QAAQ,IAAI,KAAK;AAExB,WAAO,EAAE,IAAI,MAAM;AACrB,QAAM,QAA+B,CAAC;AACtC,aAAW,SAAS,IAAI,OAAO;AAC7B,UAAM,OAAO,kBAAkB,KAAK;AACpC,QAAI,CAAC,KAAM,QAAO,EAAE,IAAI,MAAM;AAC9B,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,kBAAkB,KAAK;AAAA,MACzB;AAAA,MACA,SAAS;AAAA,QACP,UAAU,IAAI;AAAA,QACd,OAAO,IAAI;AAAA,QACX,MAAM,IAAI;AAAA,QACV,UAAU,IAAI;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAA0C;AACjE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MACE,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,kBAAkB,YAC/B,OAAO,MAAM,iBAAiB,YAC9B,CAAC,iBAAiB,MAAM,UAAU,KAClC,CAAC,iBAAiB,MAAM,aAAa,KACrC,CAAC,wBAAwB,MAAM,QAAkB,KACjD,OAAO,MAAM,eAAe,YAC5B,CAAC,eAAe,MAAM,gBAAgB,KACtC,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,eAAe,YAC5B,CAAC,kBAAkB,MAAM,gBAAgB,KACzC,OAAO,MAAM,4BAA4B;AAEzC,WAAO;AACT,SAAO;AACT;AAGO,SAAS,oBACd,SAC6B;AAC7B,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,QAAQ,KAAK,EAAG,QAAO,EAAE,IAAI,MAAM;AACvE,QAAM,MAAM,QAAQ;AACpB,QAAM,OAAO,WAAW,IAAI,IAAI;AAChC,MACE,CAAC,QACD,OAAO,KAAK,SAAS,YACrB,OAAO,KAAK,qBAAqB,YACjC,OAAO,IAAI,aAAa,YACxB,CAAC,MAAM,QAAQ,IAAI,KAAK,KACxB,OAAO,IAAI,aAAa,YACxB,OAAO,IAAI,0BAA0B,YACrC,OAAO,IAAI,UAAU,YACrB,OAAO,IAAI,YAAY;AAEvB,WAAO,EAAE,IAAI,MAAM;AACrB,QAAM,QAA6B,CAAC;AACpC,aAAW,SAAS,IAAI,OAAO;AAC7B,UAAM,OAAO,gBAAgB,KAAK;AAClC,QAAI,CAAC,KAAM,QAAO,EAAE,IAAI,MAAM;AAC9B,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,UAAU,IAAI;AAAA,MACd,MAAM;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,kBAAkB,KAAK;AAAA,MACzB;AAAA,MACA;AAAA,MACA,UAAU,IAAI;AAAA,MACd,uBAAuB,IAAI;AAAA,MAC3B,OAAO,IAAI;AAAA,MACX,SAAS,IAAI;AAAA,IACf;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAA8C;AACzE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MACE,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,aAAa,YAC1B,OAAO,MAAM,UAAU,YACvB,CAAC,eAAe,MAAM,UAAU,KAChC,OAAO,MAAM,eAAe;AAE5B,WAAO;AACT,SAAO;AACT;AAGO,SAAS,qBACd,SACiC;AACjC,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,QAAQ,MAAM,EAAG,QAAO,EAAE,IAAI,MAAM;AACxE,QAAM,MAAM,QAAQ;AACpB,MACE,CAAC,eAAe,IAAI,KAAK,KACzB,CAAC,eAAe,IAAI,IAAI,KACxB,CAAC,eAAe,IAAI,QAAQ,KAC5B,CAAC,MAAM,QAAQ,IAAI,KAAK;AAExB,WAAO,EAAE,IAAI,MAAM;AACrB,QAAM,QAAiC,CAAC;AACxC,aAAW,SAAS,IAAI,OAAO;AAC7B,UAAM,OAAO,oBAAoB,KAAK;AACtC,QAAI,CAAC,KAAM,QAAO,EAAE,IAAI,MAAM;AAC9B,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,EAAE,OAAO,IAAI,OAAO,MAAM,IAAI,MAAM,UAAU,IAAI,UAAU,MAAM;AAAA,EAC1E;AACF;AAEA,SAAS,gBAAgB,OAA0C;AACjE,MACE,CAAC,SAAS,KAAK,KACf,CAAC,MAAM,QAAQ,MAAM,OAAO,KAC5B,CAAC,MAAM,QAAQ,MAAM,CAAC,WAAW,OAAO,WAAW,QAAQ,GAC3D;AACA,WAAO;AAAA,EACT;AACA,MACE,CAAC,iBAAiB,MAAM,UAAU,KAClC,OAAO,MAAM,kBAAkB,YAC/B,CAAC,iBAAiB,MAAM,UAAU,KAClC,CAAC,iBAAiB,MAAM,aAAa,KACrC,CAAC,wBAAwB,MAAM,QAAkB,KACjD,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,UAAU,YACvB,OAAO,MAAM,cAAc,aAC3B,CAAC,iBAAiB,MAAM,YAAY;AAEpC,WAAO;AACT,SAAO;AACT;AAGO,SAAS,0BACd,SACmC;AACnC,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,QAAQ,KAAK,EAAG,QAAO,EAAE,IAAI,MAAM;AACvE,QAAM,MAAM,QAAQ;AACpB,MACE,OAAO,IAAI,WAAW,YACtB,OAAO,IAAI,WAAW,YACtB,OAAO,IAAI,aAAa,YACxB,OAAO,IAAI,UAAU,YACrB,CAAC,eAAe,IAAI,UAAU,KAC9B,OAAO,IAAI,eAAe,YAC1B,OAAO,IAAI,cAAc,YACzB,CAAC,eAAe,IAAI,qBAAqB,KACzC,OAAO,IAAI,wBAAwB,aACnC,CAAC,iBAAiB,IAAI,eAAe,KACrC,CAAC,MAAM,QAAQ,IAAI,KAAK;AAExB,WAAO,EAAE,IAAI,MAAM;AACrB,QAAM,QAA6B,CAAC;AACpC,aAAW,SAAS,IAAI,OAAO;AAC7B,UAAM,OAAO,gBAAgB,KAAK;AAClC,QAAI,CAAC,KAAM,QAAO,EAAE,IAAI,MAAM;AAC9B,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,QAAQ,IAAI;AAAA,MACZ,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI;AAAA,MACd,OAAO,IAAI;AAAA,MACX,YAAY,IAAI;AAAA,MAChB,YAAY,IAAI;AAAA,MAChB,WAAW,IAAI;AAAA,MACf,uBAAuB,IAAI;AAAA,MAC3B,qBAAqB,IAAI;AAAA,MACzB,iBAAiB,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,qBACd,SAC8B;AAC9B,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,SAAS,QAAQ,MAAM,EAAG,QAAO,EAAE,IAAI,MAAM;AACxE,QAAM,MAAM,QAAQ;AACpB,MACE,OAAO,IAAI,aAAa,YACxB,OAAO,IAAI,YAAY,YACvB,OAAO,IAAI,iBAAiB,YAC5B,OAAO,IAAI,cAAc,YACzB,OAAO,IAAI,cAAc;AAEzB,WAAO,EAAE,IAAI,MAAM;AACrB,SAAO,EAAE,IAAI,MAAM,MAAM,IAAiC;AAC5D;AAEA,SAAS,aAAa,OAAuC;AAC3D,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,MACE,OAAO,MAAM,OAAO,YACpB,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,cAAc,YAC3B,CAAC,iBAAiB,MAAM,YAAY,KACpC,CAAC,iBAAiB,MAAM,UAAU,KAClC,OAAO,MAAM,eAAe;AAE5B,WAAO;AACT,SAAO;AACT;AAGO,SAAS,sBACd,SACgC;AAChC,MAAI,CAAC,SAAS,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,QAAQ;AACvD,WAAO,EAAE,IAAI,MAAM;AACrB,QAAM,OAAyB,CAAC;AAChC,aAAW,SAAS,QAAQ,UAAU;AACpC,UAAM,MAAM,aAAa,KAAK;AAC9B,QAAI,CAAC,IAAK,QAAO,EAAE,IAAI,MAAM;AAC7B,SAAK,KAAK,GAAG;AAAA,EACf;AACA,SAAO,EAAE,IAAI,MAAM,MAAM,KAAK;AAChC;AAGO,SAAS,kBACd,OACQ;AACR,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,wBAAwB,KAAK,QAAQ,GAAG;AAC3C,YAAM,IAAI;AAAA,QACR,kDAAkD,2BAA2B,OAAO,2BAA2B,oBAAoB,OAAO,KAAK,QAAQ,CAAC;AAAA,MAC1J;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK;AAAA,IACV,CAAC,GAAG,KAAK,EACN,IAAI,CAAC,UAAU;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,YAAY,KAAK,cAAc;AAAA,MAC/B,UAAU,KAAK;AAAA,IACjB,EAAE,EACD,KAAK,CAAC,MAAM,UAAU;AACrB,YAAM,UAAU,KAAK,WAAW,cAAc,MAAM,UAAU;AAC9D,aACE,YACC,KAAK,cAAc,IAAI,cAAc,MAAM,cAAc,EAAE;AAAA,IAEhE,CAAC;AAAA,EACL;AACF;AAYO,SAAS,kBACd,SACwB;AACxB,SAAO,QAAQ,UAAU,WAAW,YAChC,WACA,QAAQ;AACd;AAGO,SAAS,mBACd,iBACA,OACS;AACT,SACE,oBAAoB,QAAQ,oBAAoB,kBAAkB,KAAK;AAE3E;;;AC9pBA,SAAS,aAAa,WAAW,QAAQ,gBAAgC;AACzE,SAAS,YAAY;;;ACCjB,cAoBA,YApBA;AAFJ,SAAS,YAAY,EAAE,UAAU,GAAG,MAAM,GAAc;AACtD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MACX,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,cAAc,OAAkB;AAC9C,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,oBAAC,UAAK,GAAE,YAAW;AAAA,KACrB;AAEJ;AAEO,SAAS,eAAe,OAAkB;AAC/C,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,GAAE,YAAW;AAAA,IACnB,oBAAC,UAAK,GAAE,iBAAgB;AAAA,KAC1B;AAEJ;AAGO,SAAS,QAAQ,OAAkB;AACxC,SACE,qBAAC,eAAY,aAAY,QAAQ,GAAG,OAClC;AAAA,wBAAC,UAAK,GAAE,4HAA2H;AAAA,IACnI,oBAAC,UAAK,GAAE,sBAAqB;AAAA,IAC7B,oBAAC,UAAK,GAAE,aAAY;AAAA,KACtB;AAEJ;AAGO,SAAS,UAAU,OAAkB;AAC1C,SACE,oBAAC,eAAY,aAAY,KAAK,GAAG,OAC/B,8BAAC,UAAK,GAAE,kBAAiB,GAC3B;AAEJ;AAEO,SAAS,gBAAgB,OAAkB;AAChD,SACE,oBAAC,eAAa,GAAG,OACf,8BAAC,UAAK,GAAE,gBAAe,GACzB;AAEJ;AAEO,SAAS,gBAAgB,OAAkB;AAChD,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/B,oBAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,IACrC,oBAAC,UAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,MAAK,IAAG,MAAK;AAAA,KAC3C;AAEJ;AAGO,SAAS,SAAS,OAAkB;AACzC,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,IACvD,oBAAC,UAAK,GAAE,2DAA0D;AAAA,KACpE;AAEJ;AAGO,SAAS,iBAAiB,OAAkB;AACjD,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,GAAE,aAAY;AAAA,IACpB,oBAAC,UAAK,GAAE,eAAc;AAAA,IACtB,oBAAC,UAAK,GAAE,4DAA2D;AAAA,KACrE;AAEJ;AAGO,SAAS,SAAS,OAAkB;AACzC,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,KAAI,IAAG,KAAI;AAAA,IAC/C,oBAAC,UAAK,GAAE,YAAW;AAAA,IACnB,oBAAC,UAAK,GAAE,6CAA4C;AAAA,IACpD,oBAAC,UAAK,GAAE,iFAAgF;AAAA,KAC1F;AAEJ;AAGO,SAAS,WAAW,OAAkB;AAC3C,SACE,oBAAC,eAAa,GAAG,OACf,8BAAC,UAAK,GAAE,+BAA8B,GACxC;AAEJ;AAEO,SAAS,SAAS,OAAkB;AACzC,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,IACxD,oBAAC,UAAK,GAAE,4BAA2B;AAAA,KACrC;AAEJ;AAEO,SAAS,SAAS,OAAkB;AACzC,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,GAAE,2CAA0C;AAAA,IAClD,oBAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,KAClD;AAEJ;AAGO,SAAS,kBAAkB,OAAkB;AAClD,SACE,oBAAC,eAAa,GAAG,OACf,8BAAC,UAAK,GAAE,uHAAsH,GAChI;AAEJ;AAGO,SAAS,uBAAuB,OAAkB;AACvD,SACE,qBAAC,eAAY,aAAY,QAAQ,GAAG,OAClC;AAAA,wBAAC,UAAK,GAAE,4HAA2H;AAAA,IACnI,oBAAC,UAAK,GAAE,aAAY;AAAA,IACpB,oBAAC,cAAS,QAAO,wBAAuB;AAAA,IACxC,oBAAC,UAAK,GAAE,oBAAmB;AAAA,KAC7B;AAEJ;AAGO,SAAS,YAAY,OAAkB;AAC5C,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,GAAE,YAAW;AAAA,IACnB,oBAAC,UAAK,GAAE,4CAA2C;AAAA,IACnD,oBAAC,UAAK,GAAE,gfAA+e;AAAA,KACzf;AAEJ;AAEO,SAAS,WAAW,OAAkB;AAC3C,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,GAAE,oBAAmB;AAAA,IAC3B,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,KAChC;AAEJ;AAGO,SAAS,WAAW,OAAkB;AAC3C,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,GAAE,sKAAqK;AAAA,IAC7K,oBAAC,UAAK,GAAE,iBAAgB;AAAA,KAC1B;AAEJ;AAEO,SAAS,QAAQ,OAAkB;AACxC,SACE,qBAAC,eAAa,GAAG,OACf;AAAA,wBAAC,UAAK,GAAE,wJAAuJ;AAAA,IAC/J,oBAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,MAAK,MAAK,gBAAe;AAAA,KACvD;AAEJ;AAGO,SAAS,QAAQ,OAAkB;AACxC,SACE,oBAAC,eAAa,GAAG,OACf,8BAAC,UAAK,GAAE,+JAA8J,GACxK;AAEJ;;;ADiCI,gBAAAC,MA6CA,QAAAC,aA7CA;AAxNG,SAAS,mBACd,KACA,MACA,UASI,CAAC,GACgD;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA+B,EAAE,QAAQ,UAAU,CAAC;AAC9E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,CAAC;AACxC,QAAM,UAAU,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAClB,QAAM,eAAe,OAAO,QAAQ,cAAc,IAAI;AACtD,eAAa,UAAU,QAAQ,cAAc;AAqB7C,QAAM,QAAQ,GAAG,GAAG,KAAK,OAAO;AAChC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AACvD,MAAI,UAAU,SAAS,OAAO;AAC5B,gBAAY,EAAE,OAAO,IAAI,CAAC;AAC1B,QAAI,QAAQ,SAAS,OAAO,MAAM,WAAW,QAAS,UAAS,EAAE,QAAQ,UAAU,CAAC;AAAA,EACtF;AAEA,YAAU,MAAM;AACd,QAAI,SAAS;AAEb,YAAQ,QAAQ,EACb,KAAK,CAAC,aAAa;AAClB,UAAI,CAAC,OAAQ;AAOb,eAAS,CAAC,aAAa;AACrB,cAAM,OAAO,aAAa,QAAQ;AAClC,YAAI,KAAK,WAAW,WAAW,SAAS,WAAW,SAAS;AAC1D,iBAAO,aAAa,UAAU,EAAE,GAAG,UAAU,cAAc,KAAK,QAAQ,IAAI;AAAA,QAC9E;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,UAAI,CAAC,OAAQ;AACb,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,eAAS,CAAC,aAAc,SAAS,WAAW,WAAW,aAAa,UAChE,EAAE,GAAG,UAAU,cAAc,QAAQ,IACrC,EAAE,QAAQ,SAAS,QAAQ,CAAE;AAAA,IACnC,CAAC;AAEH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO,EAAE,OAAO,QAAQ,YAAY,MAAM,WAAW,CAAC,UAAU,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;AAClF;AAWO,SAAS,oBACd,eACA,kBACA,UACQ;AACR,SAAO,oBAAoB,iBAAiB,kBAAkB,QAAQ;AACxE;AAEO,SAAS,oBAAoB,QAAgB,UAA0B;AAC5E,QAAM,QAAQ,OAAO,MAAM;AAC3B,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,gBAAgB,GAAG;AAAA,MAC9C,OAAO;AAAA,MACP,UAAU,YAAY;AAAA,IACxB,CAAC,EAAE,OAAO,KAAK;AAAA,EACjB,QAAQ;AAEN,WAAO,GAAG,MAAM,IAAI,QAAQ,GAAG,KAAK;AAAA,EACtC;AACF;AAEO,SAAS,kBAAkB,OAA8B;AAC9D,QAAM,OAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,KAAK;AAC3D,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO,OAAO,UAAU,WAAW,QAAQ;AAC7E,SAAO,IAAI,KAAK,eAAe,gBAAgB,GAAG;AAAA,IAChD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC,EAAE,OAAO,IAAI;AAChB;AAEO,SAAS,sBAAsB,OAA8B;AAClE,QAAM,OAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,KAAK;AAC3D,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO,OAAO,UAAU,WAAW,QAAQ;AAC7E,SAAO,IAAI,KAAK,eAAe,gBAAgB,GAAG;AAAA,IAChD,WAAW;AAAA,IACX,WAAW;AAAA,EACb,CAAC,EAAE,OAAO,IAAI;AAChB;AAcO,SAAS,YAAY,QAAwB;AAClD,SAAO,UAAU,UAAU,OAAO,KAAK,EAAE,YAAY,CAAC,EAAE,KAAK,eAAe,MAAM;AACpF;AAEA,SAAS,eAAe,QAAwB;AAC9C,SAAO,OACJ,YAAY,EACZ,MAAM,GAAG,EACT,IAAI,CAAC,SAAU,OAAO,KAAK,CAAC,EAAG,YAAY,IAAI,KAAK,MAAM,CAAC,IAAI,IAAK,EACpE,KAAK,GAAG;AACb;AAUA,IAAM,YAAY;AAClB,IAAM,eAAe;AACrB,IAAM,WAAW;AAEjB,IAAM,eAAuC;AAAA;AAAA,EAE3C,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA;AAAA,EAEX,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA;AAAA,EAEX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AACb;AAaO,SAAS,WAAW,EAAE,OAAO,GAAuB;AACzD,QAAM,OAAO,aAAa,OAAO,KAAK,EAAE,YAAY,CAAC,KAAK;AAC1D,SACE,gBAAAD,KAAC,UAAK,WAAW,yEAAyE,IAAI,iBAAkB,sBAAY,MAAM,GAAE;AAExI;AAGO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,YAAY;AACd,GAGG;AACD,SACE,gBAAAA,KAAC,SAAI,WAAW,+EAA+E,SAAS,IAAK,UAAS;AAE1H;AAEO,SAAS,oBAAoB,EAAE,SAAS,GAA4B;AACzE,SAAO,gBAAAA,KAAC,QAAG,WAAU,6EAA6E,UAAS;AAC7G;AAEO,SAAS,oBAAoB,EAAE,OAAO,GAAG,MAAM,GAAqC;AACzF,SACE,gBAAAA,KAAC,SAAI,MAAK,UAAS,cAAY,OAAO,WAAU,qCAC7C,gBAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,UAChC,gBAAAA,KAAC,SAAgB,WAAU,uEAAjB,KAAqF,CAChG,GACH;AAEJ;AAQO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAC,MAAC,eAAY,WAAU,uDACrB;AAAA,oBAAAD,KAAC,SAAI,WAAU,8HACb,0BAAAA,KAAC,mBAAgB,WAAU,kCAAiC,GAC9D;AAAA,IACA,gBAAAA,KAAC,OAAE,MAAK,SAAQ,WAAU,iCAAiC,mBAAQ;AAAA,IAClE,UACC,gBAAAA,KAAC,YAAO,MAAK,UAAS,SAAS,SAAS,WAAU,0EAC/C,YAAE,cAAc,GACnB,IACE;AAAA,KACN;AAEJ;AAEO,SAAS,cAAc,EAAE,QAAQ,GAAwB;AAC9D,SACE,gBAAAC,MAAC,OAAE,MAAK,UAAS,WAAU,2GACzB;AAAA,oBAAAD,KAAC,aAAU,WAAU,gCAA+B;AAAA,IACnD;AAAA,KACH;AAEJ;AAEO,SAAS,kBAAkB,EAAE,QAAQ,GAAwB;AAClE,SAAO,gBAAAA,KAAC,OAAE,MAAK,SAAQ,WAAU,iEAAiE,mBAAQ;AAC5G;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAC,MAAC,eAAY,WAAU,uDACrB;AAAA,oBAAAD,KAAC,OAAE,WAAU,sCAAsC,iBAAM;AAAA,IACzD,gBAAAA,KAAC,OAAE,WAAU,mEAAmE,gBAAK;AAAA,IACpF,SAAS,gBAAAA,KAAC,SAAI,WAAU,YAAY,kBAAO,IAAS;AAAA,KACvD;AAEJ;AAEO,SAAS,gBAAgB,EAAE,IAAI,MAAM,GAAkC;AAC5E,SACE,gBAAAC,MAAC,QAAK,IAAQ,WAAU,2HACtB;AAAA,oBAAAD,KAAC,iBAAc,WAAU,gCAA+B;AAAA,IACvD;AAAA,KACH;AAEJ;AAEO,SAAS,kBAAkB,EAAE,SAAS,MAAM,GAA2C;AAC5F,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,WAAU;AAAA,MAEV;AAAA,wBAAAD,KAAC,iBAAc,WAAU,gCAA+B;AAAA,QACvD;AAAA;AAAA;AAAA,EACH;AAEJ;AAQO,SAAS,WAAW,EAAE,OAAO,YAAY,GAAG,GAA0C;AAC3F,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,QAAQ,OAA6C,IAAI;AAE/D,YAAU,MAAM,MAAM;AACpB,QAAI,MAAM,QAAS,cAAa,MAAM,OAAO;AAAA,EAC/C,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,0EAA0E,SAAS;AAAA,MAC9F,SAAS,MAAM;AACb,aAAK,UAAU,WAAW,UAAU,KAAK,EAAE,KAAK,MAAM;AACpD,oBAAU,IAAI;AACd,cAAI,MAAM,QAAS,cAAa,MAAM,OAAO;AAC7C,gBAAM,UAAU,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,QACzD,CAAC;AAAA,MACH;AAAA,MAEC;AAAA,iBAAS,gBAAAD,KAAC,aAAU,WAAU,uBAAsB,IAAK,gBAAAA,KAAC,YAAS,WAAU,uBAAsB;AAAA,QACpG,gBAAAA,KAAC,UAAK,WAAU,cAAc,mBAAS,EAAE,eAAe,IAAI,EAAE,aAAa,GAAE;AAAA;AAAA;AAAA,EAC/E;AAEJ;AAGO,SAAS,YAAY,EAAE,YAAY,GAAG,GAA2B;AACtE,SAAO,gBAAAA,KAAC,cAAW,WAAW,iDAAiD,SAAS,IAAI;AAC9F;;;AFpQS,gBAAAE,YAAA;AArGT,IAAM,oBAAoB,cAAwC,IAAI;AAEtE,SAAS,gBAAmC;AAC1C,QAAM,QAAQ,WAAW,iBAAiB;AAC1C,MAAI,UAAU,MAAM;AAClB,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;AAGO,SAAS,sBAA6D;AAC3E,SAAO,cAAc,EAAE;AACzB;AAUO,SAAS,4BAAsD;AACpE,SAAO,cAAc,EAAE;AACzB;AAUO,SAAS,qBAAqB,UAAqC;AAKxE,QAAM,YAAY,mBAAmB,aAAa,QAAQ,IAAI,MAC5D,gBAAgB,CAAC,QAAQ,IAAI,UAAU,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,QAAM,kBAAkB,mBAAmB,oBAAoB,QAAQ,IAAI,MACzE,gBAAgB,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;AAC1C,SAAO,EAAE,WAAW,gBAAgB;AACtC;AAgBO,SAAS,uBAAuB,OAAsD;AAC3F,QAAM,YAAYC,QAAmC,IAAI;AACzD,QAAM,EAAE,WAAW,gBAAgB,IAAI;AASvC,QAAM,UAAU,gBAAgB,MAAM,WAAW,UAC7C,sBAAsB,gBAAgB,MAAM,IAAI,IAChD;AAEJ,QAAM,eAAe;AAAA,IACnB,UAAU,MAAM,WAAW,UACvB;AAAA,MACA,eAAe,UAAU,MAAM,KAAK,MAAM;AAAA,MAC1C,mBAAmB,UAAU,MAAM,KAAK,MAAM;AAAA,MAC9C,oBAAoB,UAAU,MAAM,KAAK,cAAc;AAAA,MACvD,eAAe,UAAU,MAAM,KAAK,WAAW;AAAA,MAC/C,gBAAgB,UAAU,MAAM,KAAK,UAAU;AAAA,IACjD,IACE;AAAA,IACJ,SAAS,KAAK,QAAQ,OAAO;AAAA,IAC7B,UAAU;AAAA,EACZ;AAEA,YAAU,UAAU;AACpB,SAAO;AACT;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGG;AACD,SAAO,gBAAAD,KAAC,kBAAkB,UAAlB,EAA2B,OAAe,UAAS;AAC7D;;;AIzHA,SAAS,YAAAE,iBAAgB;AACzB,SAAS,QAAAC,aAAY;;;ACNd,IAAM,6BAA6B;AAuCnC,SAAS,6BAA6B,aAAoD;AAC/F,MAAI,YAAY,SAAS,UAAW,QAAO;AAC3C,MAAI,CAAC,YAAY,GAAG,WAAW,0BAA0B,EAAG,QAAO;AACnE,QAAM,SAAS,YAAY,GAAG,MAAM,2BAA2B,MAAM;AACrE,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEO,SAAS,oBACd,cACA,UACsB;AACtB,QAAM,mBAAmB,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,QAAQ,OAAO,CAAC,CAAC;AACrF,QAAM,SAAyB,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE;AAEpE,aAAW,eAAe,cAAc;AACtC,QAAI,YAAY,SAAS,WAAW;AAClC,YAAM,SAAS,6BAA6B,WAAW;AACvD,YAAM,UAAU,WAAW,OAAO,SAAY,iBAAiB,IAAI,MAAM;AACzE,UAAI,CAAC,QAAS,QAAO,EAAE,IAAI,OAAO,OAAO,EAAE,QAAQ,mBAAmB,IAAI,YAAY,GAAG,EAAE;AAC3F,aAAO,SAAS,KAAK,EAAE,aAAa,QAAQ,CAAC;AAC7C;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,QAAQ;AAC/B,UAAI,CAAC,YAAY,MAAM;AACrB,eAAO,EAAE,IAAI,OAAO,OAAO,EAAE,QAAQ,qBAAqB,IAAI,YAAY,GAAG,EAAE;AAAA,MACjF;AACA,aAAO,MAAM,KAAK,EAAE,GAAG,aAAa,MAAM,YAAY,KAAK,CAAC;AAC5D;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,WAAW;AAAA,EAC/B;AAEA,SAAO,EAAE,IAAI,MAAM,OAAO;AAC5B;AAEO,SAAS,sBAAsB,QAAiC;AACrE,SAAO,OAAO,SAAS,WAAW,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,MAAM,WAAW;AAC9F;AASO,SAAS,kBAAkB,SAA0C;AAC1E,MAAI,QAAQ,eAAe,KAAM,QAAO;AACxC,SAAO,IAAI,KAAK,QAAQ,aAAa,GAAI;AAC3C;AAYO,SAAS,cAAc,SAAsC;AAClE,SAAO,QAAQ,aAAa,QAAQ,eAAe;AACrD;;;AD9DW,gBAAAC,MAcL,QAAAC,aAdK;AAPJ,SAAS,mBAAmB;AACjC,QAAM,EAAE,OAAO,OAAO,IAAI,oBAAoB;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAwB,IAAI;AACxD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAwB,IAAI;AAClE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAwB,IAAI;AAE1E,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO,gBAAAF,KAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,mBAAmB,GAAG;AAAA,EACtE;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,KAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,QAAM,UAAU,oBAAoB,MAAM,KAAK,cAAc,MAAM,KAAK,QAAQ;AAKhF,MAAI,CAAC,QAAQ,IAAI;AACf,WACE,gBAAAC,MAAC,SAAI,WAAU,iBACb;AAAA,sBAAAD,KAAC,uBAAqB,YAAE,uBAAuB,GAAE;AAAA,MACjD,gBAAAA,KAAC,gBAAa,SAAS,qBAAqB,QAAQ,KAAK,GAAG,SAAS,QAAQ;AAAA,OAC/E;AAAA,EAEJ;AAEA,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,sBAAsB,MAAM,GAAG;AACjC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,sBAAsB;AAAA,QAC/B,MAAM,EAAE,qBAAqB;AAAA,QAC7B,QACE,gBAAAA,KAACG,OAAA,EAAK,IAAG,iBAAgB,WAAU,0DAChC,YAAE,oBAAoB,GACzB;AAAA;AAAA,IAEJ;AAAA,EAEJ;AAEA,QAAM,kBAAkB,OAAO,WAAmB;AAChD,uBAAmB,MAAM;AACzB,cAAU,IAAI;AACd,mBAAe,IAAI;AACnB,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,iBAAiB,MAAM,CAAC;AAC1E,uBAAmB,IAAI;AAEvB,QAAI,CAAC,OAAO,SAAS;AACnB,qBAAe,OAAO,SAAS,KAAK,KAAK,EAAE,2BAA2B,CAAC;AACvE;AAAA,IACF;AAEA,cAAU,EAAE,yBAAyB,CAAC;AAItC,WAAO;AAAA,EACT;AAEA,SACE,gBAAAF,MAAC,SAAI,WAAU,iBACZ;AAAA,aAAS,gBAAAD,KAAC,iBAAc,SAAS,QAAQ,IAAK;AAAA,IAC9C,cAAc,gBAAAA,KAAC,gBAAa,SAAS,aAAa,IAAK;AAAA,IAEvD,OAAO,SAAS,SACf,gBAAAC,MAAC,aACC;AAAA,sBAAAD,KAAC,uBAAqB,YAAE,yBAAyB,GAAE;AAAA,MACnD,gBAAAA,KAAC,QAAG,WAAU,0BACX,iBAAO,SAAS,IAAI,CAAC,UACpB,gBAAAA,KAAC,QACC,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAW,oBAAoB,MAAM,QAAQ;AAAA,UAC7C,UAAU,oBAAoB;AAAA,UAC9B,mBAAmB,MAAM,KAAK,gBAAgB,MAAM,QAAQ,MAAM;AAAA;AAAA,MACpE,KANO,MAAM,YAAY,EAO3B,CACD,GACH;AAAA,OACF,IACE;AAAA,IAEH,OAAO,MAAM,SACZ,gBAAAC,MAAC,aACC;AAAA,sBAAAD,KAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAAA,MAChD,gBAAAA,KAAC,QAAG,WAAU,0BACX,iBAAO,MAAM,IAAI,CAAC,SACjB,gBAAAA,KAAC,QACC,0BAAAA,KAAC,WAAQ,MAAY,KADd,KAAK,EAEd,CACD,GACH;AAAA,OACF,IACE;AAAA,IAEH,OAAO,MAAM,SACZ,gBAAAC,MAAC,aACC;AAAA,sBAAAD,KAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAAA,MAChD,gBAAAA,KAAC,QAAG,WAAU,0BACX,iBAAO,MAAM,IAAI,CAAC,SACjB,gBAAAA,KAAC,QACC,0BAAAA,KAAC,WAAQ,MAAY,KADd,KAAK,EAEd,CACD,GACH;AAAA,OACF,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,qBAAqB,OAAsC;AAClE,SAAO,MAAM,WAAW,oBACpB,EAAE,wBAAwB,EAAE,IAAI,MAAM,GAAG,CAAC,IAC1C,EAAE,4BAA4B,EAAE,IAAI,MAAM,GAAG,CAAC;AACpD;AAGA,SAAS,iBAAiB,EAAE,MAAM,GAAsB;AACtD,SACE,gBAAAA,KAAC,OAAE,WAAU,uGAAuG,iBAAM;AAE9H;AAEA,SAAS,cAAc,EAAE,QAAQ,GAAwB;AACvD,SACE,gBAAAC;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,IAAI,iBAAiB,OAAO;AAAA,MAC5B,WAAU;AAAA,MAET;AAAA,UAAE,qBAAqB;AAAA,QACxB,gBAAAH,KAAC,kBAAe,WAAU,gCAA+B;AAAA;AAAA;AAAA,EAC3D;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,EAAE,aAAa,QAAQ,IAAI;AACjC,QAAM,SAAS,kBAAkB,OAAO;AAExC,SACE,gBAAAC,MAAC,eAAY,WAAU,qBACrB;AAAA,oBAAAA,MAAC,SAAI,WAAU,wEACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,kDACb;AAAA,wBAAAD,KAAC,YAAS,WAAU,0DAAyD;AAAA,QAC7E,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,0BAAAD,KAAC,OAAE,WAAU,iDAAiD,sBAAY,eAAc;AAAA,UAGxF,gBAAAA,KAAC,OAAE,WAAU,0CACV,mBACG,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,MAAM,EAAE,CAAC,IAC1D,EAAE,wBAAwB,GAChC;AAAA,WACF;AAAA,SACF;AAAA,MACA,gBAAAA,KAAC,cAAW,QAAQ,QAAQ,QAAQ;AAAA,OACtC;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,8DACb;AAAA,sBAAAD,KAAC,SAAI,WAAU,0BACb,0BAAAA,KAAC,oBAAiB,OAAO,YAAY,OAAO,GAC9C;AAAA,MACA,gBAAAA,KAAC,cAAW,OAAO,YAAY,OAAO;AAAA,OACxC;AAAA,IAEC,QAAQ,cACP,gBAAAC,MAAC,SAAI,WAAU,kFACb;AAAA,sBAAAD,KAAC,OAAE,WAAU,2DACV,YAAE,sBAAsB,EAAE,YAAY,QAAQ,YAAY,CAAC,GAC9D;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT;AAAA,UACA,aAAW,aAAa;AAAA,UACxB,WAAU;AAAA,UAET;AAAA,wBAAY,gBAAAD,KAAC,eAAY,WAAU,kCAAiC,IAAK;AAAA,YACzE,YAAY,EAAE,yBAAyB,IAAI,EAAE,qBAAqB;AAAA;AAAA;AAAA,MACrE;AAAA,OACF,IACE;AAAA,IAKH,cAAc,OAAO,IACpB,gBAAAC,MAAC,SAAI,WAAU,kCACb;AAAA,sBAAAD,KAAC,OAAE,WAAU,uFACV,YAAE,sBAAsB,GAC3B;AAAA,MACA,gBAAAA,KAAC,OAAE,WAAU,gEACV,YAAE,qBAAqB,GAC1B;AAAA,MACA,gBAAAA,KAACG,OAAA,EAAK,IAAG,iBAAgB,WAAU,mEAChC,YAAE,uBAAuB,GAC5B;AAAA,OACF,IACE;AAAA,IAEJ,gBAAAH,KAAC,SAAI,WAAU,YACb,0BAAAA,KAAC,iBAAc,SAAS,QAAQ,YAAY,GAC9C;AAAA,KACF;AAEJ;AAEA,SAAS,QAAQ,EAAE,KAAK,GAA2B;AAWjD,QAAM,OAAO,iBAAiB,KAAK,IAAI;AAEvC,SACE,gBAAAC,MAAC,eAAY,WAAU,uEACrB;AAAA,oBAAAD,KAAC,WAAQ,WAAU,+CAA8C;AAAA,IACjE,gBAAAC,MAAC,SAAI,WAAU,0BACb;AAAA,sBAAAD,KAAC,OAAE,WAAU,iDAAiD,eAAK,OAAM;AAAA,MACzE,gBAAAA,KAAC,OAAE,WAAU,uDAAuD,eAAK,eAAc;AAAA,OACzF;AAAA,IACC,SAAS,OACR,gBAAAA,KAAC,UAAK,WAAU,wDAAwD,YAAE,oBAAoB,GAAE,IAEhG,gBAAAA,KAAC,OAAE,MAAY,UAAQ,MAAC,WAAU,uEAC/B,YAAE,oBAAoB,GACzB;AAAA,KAEJ;AAEJ;AAEA,SAAS,QAAQ,EAAE,KAAK,GAAqC;AAG3D,QAAM,OAAO,iBAAiB,KAAK,IAAI;AAEvC,SACE,gBAAAC,MAAC,eAAY,WAAU,qBACrB;AAAA,oBAAAA,MAAC,SAAI,WAAU,wEACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,kDACb;AAAA,wBAAAD,KAAC,WAAQ,WAAU,0DAAyD;AAAA,QAC5E,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,0BAAAD,KAAC,OAAE,WAAU,iDAAiD,eAAK,OAAM;AAAA,UACzE,gBAAAA,KAAC,OAAE,WAAU,uDAAuD,eAAK,eAAc;AAAA,WACzF;AAAA,SACF;AAAA,MACC,SAAS,OACR,gBAAAA,KAAC,cAAW,OAAO,KAAK,OAAO,WAAU,gBAAe,IAExD,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UAEV;AAAA,4BAAAD,KAAC,oBAAiB,WAAU,kCAAiC;AAAA,YAC5D,EAAE,oBAAoB;AAAA;AAAA;AAAA,MACzB;AAAA,OAEJ;AAAA,IAGC,SAAS,OACR,gBAAAA,KAAC,SAAI,WAAU,YACb,0BAAAA,KAAC,oBAAiB,OAAO,KAAK,OAAO,GACvC,IACE;AAAA,IAEJ,gBAAAA,KAAC,SAAI,WAAU,YACb,0BAAAA,KAAC,iBAAc,SAAS,KAAK,gBAAgB,GAC/C;AAAA,KACF;AAEJ;;;AExUA,SAAS,aAAAI,YAAW,YAAAC,iBAAgB;AACpC,SAAS,QAAAC,aAAY;;;ACWrB,SAASC,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,mBAAmB,QAAiC,KAAwC;AACnG,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,SAAO;AACT;AAEO,SAAS,gBAAgB,SAAmC;AACjE,MAAI,CAACA,UAAS,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,SAAS,EAAG,QAAO,EAAE,IAAI,MAAM;AAEhF,QAAM,YAAgC,CAAC;AACvC,aAAW,SAAS,QAAQ,WAAW;AACrC,QAAI,CAACA,UAAS,KAAK,EAAG,QAAO,EAAE,IAAI,MAAM;AAEzC,UAAM,gBAAgB,MAAM;AAC5B,UAAM,QAAQ,MAAM;AACpB,UAAM,OAAO,mBAAmB,OAAO,MAAM;AAC7C,UAAM,WAAW,mBAAmB,OAAO,WAAW;AACtD,UAAM,eAAe,MAAM;AAC3B,UAAM,cAAc,MAAM;AAC1B,UAAM,YAAY,MAAM;AAExB,QACE,OAAO,kBAAkB,YACtB,OAAO,UAAU,YACjB,SAAS,UACT,aAAa,UACb,OAAO,iBAAiB,YACxB,CAAC,OAAO,SAAS,YAAY,KAC7B,OAAO,gBAAgB,aACvB,OAAO,cAAc,UACxB;AACA,aAAO,EAAE,IAAI,MAAM;AAAA,IACrB;AAEA,cAAU,KAAK;AAAA,MACb,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,eAAe;AAAA,MACf;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,IAAI,MAAM,UAAU;AAC/B;AAUO,SAAS,oBAAoB,UAA2C;AAC7E,MAAI,SAAS,eAAe,CAAC,SAAS,KAAM,QAAO;AACnD,SAAO,YAAY,mBAAmB,SAAS,IAAI,CAAC;AACtD;AAGO,SAAS,gBACd,WACA,eACoB;AACpB,SAAO,UAAU,OAAO,CAAC,aAAa,SAAS,mBAAmB,aAAa;AACjF;;;ADxCW,gBAAAC,MA6EK,QAAAC,aA7EL;AAvBJ,SAAS,mBAAmB;AACjC,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,aAAa,MACxD,gBAAgB,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAoC,IAAI;AAC1E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAwB,IAAI;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAwB,IAAI;AAQlE,EAAAC,WAAU,MAAM;AACd,QAAI,MAAM,WAAW,QAAS;AAC9B,UAAM,WAAW,gBAAgB,MAAM,IAAI;AAC3C,sBAAkB,CAAC,SAAS,EAAE;AAC9B,iBAAa,SAAS,KAAK,SAAS,YAAY,IAAI;AACpD,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,KAAK,CAAC;AAEV,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO,gBAAAH,KAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,mBAAmB,GAAG;AAAA,EACtE;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,KAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,MAAI,gBAAgB;AAClB,WAAO,gBAAAA,KAAC,gBAAa,SAAS,EAAE,qBAAqB,GAAG,SAAS,QAAQ;AAAA,EAC3E;AAGA,MAAI,cAAc,MAAM;AACtB,WAAO,gBAAAA,KAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,mBAAmB,GAAG;AAAA,EACtE;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,sBAAsB;AAAA,QAC/B,MAAM,EAAE,qBAAqB;AAAA,QAC7B,QACE,gBAAAA,KAACI,OAAA,EAAK,IAAG,iBAAgB,WAAU,mGAChC,YAAE,oBAAoB,GACzB;AAAA;AAAA,IAEJ;AAAA,EAEJ;AAEA,QAAM,SAAS,OAAO,aAA+B;AACnD,gBAAY,SAAS,cAAc;AACnC,mBAAe,IAAI;AACnB,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,eAAe,SAAS,cAAc,CAAC;AACzF,gBAAY,IAAI;AAEhB,QAAI,CAAC,OAAO,SAAS;AACnB,qBAAe,OAAO,SAAS,KAAK,KAAK,EAAE,wBAAwB,CAAC;AACpE;AAAA,IACF;AAKA,iBAAa,CAAC,YACZ,UAAU,gBAAgB,SAAS,SAAS,cAAc,IAAI,OAC/D;AAAA,EACH;AAEA,SACE,gBAAAH,MAAC,SACE;AAAA,kBACC,gBAAAD,KAAC,SAAI,WAAU,YACb,0BAAAA,KAAC,gBAAa,SAAS,aAAa,GACtC,IACE;AAAA,IAEJ,gBAAAA,KAAC,QAAG,WAAU,4DACX,oBAAU,IAAI,CAAC,aACd,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAEV;AAAA,0BAAAD,KAAC,iBAAc,UAAoB;AAAA,UACnC,gBAAAC,MAAC,SAAI,WAAU,4CACb;AAAA,4BAAAD,KAAC,OAAE,WAAU,oCAAoC,mBAAS,OAAM;AAAA,YAChE,gBAAAA,KAAC,OAAE,WAAU,0CACV,YAAE,mBAAmB,EAAE,MAAM,kBAAkB,SAAS,UAAU,EAAE,CAAC,GACxE;AAAA,YAGC,SAAS,cACR,gBAAAA,KAAC,OAAE,WAAU,0DAA0D,YAAE,gBAAgB,GAAE,IACzF;AAAA,YAEJ,gBAAAC,MAAC,SAAI,WAAU,0EACb;AAAA,8BAAAD,KAAC,gBAAa,UAAoB;AAAA,cAClC,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,KAAK,OAAO,QAAQ;AAAA,kBACnC,UAAU,aAAa;AAAA,kBACvB,aAAW,aAAa,SAAS,kBAAkB;AAAA,kBACnD,WAAU;AAAA,kBAET;AAAA,iCAAa,SAAS,iBACrB,gBAAAD,KAAC,eAAY,WAAU,kCAAiC,IACtD;AAAA,oBACH,aAAa,SAAS,iBACnB,EAAE,oBAAoB,IACtB,EAAE,kBAAkB;AAAA;AAAA;AAAA,cAC1B;AAAA,eACF;AAAA,aACF;AAAA;AAAA;AAAA,MAhCK,SAAS;AAAA,IAiChB,CACD,GACH;AAAA,KACF;AAEJ;AASA,SAAS,cAAc,EAAE,SAAS,GAAmC;AACnE,QAAM,CAAC,QAAQ,SAAS,IAAIE,UAAS,KAAK;AAE1C,MAAI,CAAC,SAAS,aAAa,QAAQ;AACjC,WACE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAY,EAAE,qBAAqB,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,QAE5D,0BAAAA,KAAC,0BAAuB,WAAU,kCAAiC,aAAY,QAAO;AAAA;AAAA,IACxF;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,SAAS;AAAA,MACd,KAAK,SAAS;AAAA,MACd,SAAQ;AAAA,MACR,UAAS;AAAA,MACT,SAAS,MAAM,UAAU,IAAI;AAAA,MAC7B,WAAU;AAAA;AAAA,EACZ;AAEJ;AAGA,SAAS,aAAa,EAAE,SAAS,GAAmC;AAClE,QAAM,OAAO,oBAAoB,QAAQ;AACzC,MAAI,CAAC,KAAM,QAAO;AAClB,SACE,gBAAAA,KAACI,OAAA,EAAK,IAAI,MAAM,WAAU,oHACvB,YAAE,gBAAgB,GACrB;AAEJ;;;AElLA,SAAS,YAAAC,iBAAgB;AAmGjB,gBAAAC,MA4CE,QAAAC,aA5CF;AA3FR,IAAM,iBAAiB;AAOvB,IAAM,QACJ;AAEF,IAAM,QAAQ;AAEd,IAAM,WAAW;AAQV,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,UAAU;AACZ,GAGG;AACD,QAAM,CAAC,MAAM,OAAO,IAAIC;AAAA,IACtB,UAAU,EAAE,MAAM,QAAQ,OAAO,QAAQ,MAAM,IAAI,EAAE,MAAM,QAAQ;AAAA,EACrE;AACA,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,SAAS,SAAS,EAAE;AACvD,QAAM,CAAC,KAAK,MAAM,IAAIA,UAAS,SAAS,QAAQ,EAAE;AAClD,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAwB,IAAI;AAExD,QAAM,WAAW,OAAO,SAAiB,SAAS,UAAU;AAC1D,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,cAAU,IAAI;AACd,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,WAAW,OAAO,CAAC;AACrE,YAAQ,KAAK;AAEb,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,kBAAkB,CAAC;AACxD;AAAA,IACF;AAEA,YAAQ,EAAE,MAAM,QAAQ,OAAO,QAAQ,CAAC;AAGxC,QAAI,OAAQ,WAAU,EAAE,gBAAgB,EAAE,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC7D;AAEA,QAAM,cAAc,MAAM;AACxB,UAAM,UAAU,MAAM,KAAK;AAI3B,UAAM,KAAK,QAAQ,QAAQ,GAAG;AAC9B,QAAI,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACvC,eAAS,EAAE,oBAAoB,CAAC;AAChC;AAAA,IACF;AACA,SAAK,SAAS,OAAO;AAAA,EACvB;AAEA,QAAM,aAAa,OAAO,YAAoB;AAC5C,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,CAAC,MAAM;AACT,eAAS,EAAE,mBAAmB,CAAC;AAC/B;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,UAAU,SAAS,IAAI,CAAC;AAC1E,YAAQ,KAAK;AAEb,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,oBAAoB,CAAC;AAC1D;AAAA,IACF;AAGA,eAAW;AAAA,EACb;AAEA,SACE,gBAAAD,MAAC,eAAY,WAAU,qEACrB;AAAA,oBAAAD,KAAC,SAAI,WAAU,mJACb,0BAAAA,KAAC,YAAS,WAAU,mCAAkC,GACxD;AAAA,IACA,gBAAAA,KAAC,QAAG,WAAU,2DACX,eAAK,SAAS,UAAU,EAAE,kBAAkB,IAAI,EAAE,iBAAiB,GACtE;AAAA,IACA,gBAAAA,KAAC,OAAE,WAAU,8DACV,eAAK,SAAS,UACX,EAAE,kBAAkB,IACpB,EAAE,mBAAmB,EAAE,OAAO,KAAK,MAAM,CAAC,GAChD;AAAA,IAEC,KAAK,SAAS,UACb,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,YAAU;AAAA,QACV,WAAU;AAAA,QACV,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,sBAAY;AAAA,QACd;AAAA,QAEA;AAAA,0BAAAD,KAAC,WAAM,SAAQ,iBAAgB,WAAW,OACvC,YAAE,kBAAkB,GACvB;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,MAAK;AAAA,cACL,UAAQ;AAAA,cACR,cAAa;AAAA,cACb,OAAO;AAAA,cACP,UAAU;AAAA,cACV,gBAAc,UAAU;AAAA,cACxB,oBAAkB,QAAQ,WAAW;AAAA,cACrC,WAAW,GAAG,KAAK,+BAA+B,QAAQ,qBAAqB,EAAE;AAAA,cACjF,UAAU,CAAC,UAAU;AACnB,yBAAS,MAAM,OAAO,KAAK;AAC3B,yBAAS,IAAI;AAAA,cACf;AAAA;AAAA,UACF;AAAA,UACC,QACC,gBAAAA,KAAC,SAAI,IAAI,UACP,0BAAAA,KAAC,qBAAkB,SAAS,OAAO,GACrC,IACE;AAAA,UACJ,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU;AAAA,cACV,aAAW,QAAQ;AAAA,cACnB,WAAU;AAAA,cAET;AAAA,uBAAO,gBAAAD,KAAC,eAAY,WAAU,YAAW,IAAK;AAAA,gBAC9C,OAAO,EAAE,eAAe,IAAI,EAAE,YAAY;AAAA;AAAA;AAAA,UAC7C;AAAA;AAAA;AAAA,IACF,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,YAAU;AAAA,QACV,WAAU;AAAA,QACV,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,eAAK,WAAW,KAAK,KAAK;AAAA,QAC5B;AAAA,QAEA;AAAA,0BAAAD,KAAC,WAAM,SAAQ,eAAc,WAAW,OACrC,YAAE,iBAAiB,GACtB;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,MAAK;AAAA,cACL,UAAQ;AAAA,cACR,WAAU;AAAA,cACV,cAAa;AAAA,cACb,WAAW;AAAA,cACX,OAAO;AAAA,cACP,UAAU;AAAA,cACV,gBAAc,UAAU;AAAA,cACxB,oBAAkB,QAAQ,WAAW;AAAA,cACrC,WAAW,GAAG,KAAK,mFAAmF,QAAQ,qBAAqB,EAAE;AAAA,cACrI,UAAU,CAAC,UAAU;AACnB,uBAAO,MAAM,OAAO,KAAK;AACzB,yBAAS,IAAI;AAAA,cACf;AAAA;AAAA,UACF;AAAA,UACC,SAAS,gBAAAA,KAAC,iBAAc,SAAS,QAAQ,IAAK;AAAA,UAC9C,QACC,gBAAAA,KAAC,SAAI,IAAI,UACP,0BAAAA,KAAC,qBAAkB,SAAS,OAAO,GACrC,IACE;AAAA,UACJ,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU;AAAA,cACV,aAAW,QAAQ;AAAA,cACnB,WAAU;AAAA,cAET;AAAA,uBAAO,gBAAAD,KAAC,eAAY,WAAU,YAAW,IAAK;AAAA,gBAC9C,OAAO,EAAE,kBAAkB,IAAI,EAAE,cAAc;AAAA;AAAA;AAAA,UAClD;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,kFACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,WAAU;AAAA,gBACV,SAAS,MAAM;AACb,0BAAQ,EAAE,MAAM,QAAQ,CAAC;AACzB,yBAAO,EAAE;AACT,2BAAS,IAAI;AACb,4BAAU,IAAI;AAAA,gBAChB;AAAA,gBAEC,YAAE,mBAAmB;AAAA;AAAA,YACxB;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,WAAU;AAAA,gBACV,SAAS,MAAM;AAGb,yBAAO,EAAE;AACT,uBAAK,SAAS,KAAK,OAAO,IAAI;AAAA,gBAChC;AAAA,gBAEC,YAAE,cAAc;AAAA;AAAA,YACnB;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;AC7OA,SAAS,YAAAG,iBAAgC;AACzC,SAAS,QAAAC,aAAY;;;ACFrB,IAAM,iBAAyC;AAAA,EAC7C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA;AAAA;AAAA,EAGZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,QAAQ;AAAA,EACR,WAAW;AACb;AAEA,IAAM,qBAA6C;AAAA,EACjD,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,IAAM,6BAA6B;AACnC,IAAM,4BAA4B;AAGlC,SAAS,gCAAgC,SAAgC;AACvE,QAAM,aAAa,QAAQ,KAAK,EAAE,YAAY;AAC9C,MAAI,CAAC,WAAW,WAAW,0BAA0B,EAAG,QAAO;AAC/D,QAAM,OAAO,WAAW,MAAM,2BAA2B,MAAM;AAC/D,SAAO,0BAA0B,KAAK,IAAI,IAAI,OAAO;AACvD;AAGO,SAAS,gBAAgB,SAAyB;AACvD,QAAM,UAAU,gCAAgC,OAAO;AACvD,MAAI,QAAS,QAAO;AACpB,QAAM,QAAQ,QAAQ,KAAK,EAAE,YAAY;AACzC,MAAI,mBAAmB,KAAK,EAAG,QAAO,mBAAmB,KAAK;AAC9D,QAAM,CAAC,QAAQ,GAAG,OAAO,IAAI,MAAM,MAAM,OAAO;AAChD,SAAO,QAAQ,SAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC,MAAM;AACnE;AAeO,SAAS,mBAAmB,SAAsC;AACvE,MAAI,QAAQ,YAAa,QAAO,QAAQ;AACxC,MAAI,QAAQ,UAAW,QAAO,QAAQ;AAEtC,MAAI,QAAQ,cAAe,QAAO,gBAAgB,QAAQ,aAAa;AACvE,QAAM,OAAO,eAAe,QAAQ,OAAO,KAAK,QAAQ;AACxD,SAAO,QAAQ,aAAa,GAAG,IAAI,KAAK,QAAQ,UAAU,MAAM;AAClE;;;ACtFO,SAAS,mBACd,YACA,eACuB;AACvB,SAAO,WAAW,OAAO,CAAC,aAAa,SAAS,mBAAmB,aAAa;AAClF;AAmBO,SAAS,iBAAiB,UAAiD;AAChF,UAAQ,SAAS,QAAQ;AAAA,IACvB,KAAK;AACH,aAAO,EAAE,MAAM,WAAW,WAAW,SAAS,WAAW;AAAA,IAC3D,KAAK;AACH,aAAO,EAAE,MAAM,SAAS,WAAW,SAAS,WAAW;AAAA,IACzD,KAAK;AACH,aAAO,EAAE,MAAM,YAAY;AAAA,EAC/B;AACF;AAEA,IAAM,aAAuE;AAAA,EAC3E,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AACV;AAGO,SAAS,iBAAiB,QAA8D;AAC7F,SAAO,WAAW,OAAO,OAAO,WAAW,MAAM;AACnD;AAOA,SAAS,uBAAuB,OAA8B;AAC5D,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,cAAc,gCAAgC,KAAK,OAAO;AAChE,QAAM,cAAc,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG;AACjE,QAAM,aAAa,eAAe,CAAC,cAAc,UAAU,GAAG,QAAQ,QAAQ,KAAK,GAAG,CAAC;AACvF,QAAM,SAAS,KAAK,MAAM,UAAU;AACpC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAQO,SAAS,aAAa,OAA8B;AACzD,QAAM,SAAS,uBAAuB,KAAK;AAC3C,SAAO,WAAW,OAAO,QAAQ,IAAI,KAAK,MAAM;AAClD;AAeO,SAAS,iBAAiB,UAA+B,MAAY,oBAAI,KAAK,GAAY;AAC/F,MAAI,SAAS,WAAW,SAAU,QAAO;AACzC,MAAI,SAAS,iBAAiB,QAAQ,SAAS,iBAAiB,SAAU,QAAO;AACjF,QAAM,UAAU,uBAAuB,SAAS,UAAU;AAC1D,SAAO,YAAY,QAAQ,UAAU,IAAI,QAAQ;AACnD;AAGO,IAAM,6BAA6B;AASnC,SAAS,qBAAqB,OAAmC;AACtE,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,WAAW,IAAI,SAAY;AAC5C;;;AFCQ,gBAAAC,MACA,QAAAC,aADA;AA9DR,IAAM,kBAAkB;AAGxB,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,oBAAqE;AAAA,EACzE,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AACX;AAGA,IAAMC,SACJ;AAEK,SAAS,eAAe,OAAuB;AACpD,SAAO,UAAU,IAAI,EAAE,mBAAmB,IAAI,EAAE,uBAAuB,EAAE,MAAM,CAAC;AAClF;AASO,SAAS,cACd,YACA,WACA,QACQ;AACR,QAAM,OAAO,cAAc,EAAE,wBAAwB,EAAE,IAAI,OAAO,CAAC;AACnE,SAAO,YAAY,IAAI,GAAG,IAAI,IAAI,eAAe,YAAY,CAAC,CAAC,KAAK;AACtE;AAGO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,gBAAAF,KAACG,OAAA,EAAK,IAAI,iBAAiB,MAAM,GAAG,WAAU,yDAC5C,0BAAAF,MAAC,eAAY,WAAU,yDACrB;AAAA,oBAAAD,KAAC,eAAY,WAAU,+CAA8C;AAAA,IACrE,gBAAAC,MAAC,SAAI,WAAU,0BACb;AAAA,sBAAAD,KAAC,OAAE,WAAU,iDAAiD,iBAAM;AAAA,MACpE,gBAAAA,KAAC,OAAE,WAAU,0CAA0C,4BAAkB,SAAS,GAAE;AAAA,OACtF;AAAA,IACA,gBAAAA,KAAC,UAAK,WAAU,kEAAkE,kBAAO;AAAA,IACzF,gBAAAA,KAAC,cAAW,QAAgB;AAAA,KAC9B,GACF;AAEJ;AAEO,SAAS,gBAAgB;AAC9B,QAAM,CAAC,MAAM,OAAO,IAAII,UAAS,CAAC;AAClC,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,EAAE;AACvC,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,EAAE;AAEvC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,EAAE,QAAQ,IAAI,QAAQ,GAAG,CAAC;AAEjE,QAAM,EAAE,OAAO,OAAO,IAAI;AAAA,IACxB,UAAU,IAAI,IAAI,QAAQ,MAAM,IAAI,QAAQ,MAAM;AAAA,IAClD,MAAM,gBAAgB,CAAC,QAAQ,IAAI,OAAO;AAAA,MACxC;AAAA,MACA,OAAO;AAAA,MACP,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,MACnD,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,IACrD,CAAC,CAAC;AAAA,EACJ;AAIA,QAAM,eAAe,CAAC,SAA+C;AACnE,UAAM,SAAS,EAAE,QAAQ,KAAK,UAAU,QAAQ,QAAQ,KAAK,UAAU,OAAO;AAC9E,cAAU,OAAO,MAAM;AACvB,cAAU,OAAO,MAAM;AACvB,eAAW,MAAM;AACjB,YAAQ,CAAC;AAAA,EACX;AAEA,QAAM,YAAY,QAAQ,WAAW,MAAM,QAAQ,WAAW;AAE9D,QAAM,YACJ,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,UAAU,CAAC,UAAU;AACnB,cAAM,eAAe;AACrB,qBAAa,CAAC,CAAC;AAAA,MACjB;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,aAAa,EAAE,0BAA0B;AAAA,YACzC,cAAY,EAAE,eAAe;AAAA,YAC7B,UAAU,CAAC,UAAU,UAAU,MAAM,OAAO,KAAK;AAAA,YACjD,WAAW,0BAA0BE,MAAK;AAAA;AAAA,QAC5C;AAAA,QACA,gBAAAD,MAAC,SAAI,WAAU,gBACb;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,cAAY,EAAE,eAAe;AAAA,cAC7B,UAAU,CAAC,UAAU,aAAa,EAAE,QAAQ,MAAM,OAAO,MAAM,CAAC;AAAA,cAChE,WAAU;AAAA,cAEV;AAAA,gCAAAD,KAAC,YAAO,OAAM,IAAI,YAAE,kBAAkB,GAAE;AAAA,gBACvC,eAAe,IAAI,CAAC,UACnB,gBAAAA,KAAC,YAAmB,OAAe,YAAE,kBAAkB,KAAK,CAAC,KAAhD,KAAkD,CAChE;AAAA;AAAA;AAAA,UACH;AAAA,UACA,gBAAAA,KAAC,SAAI,WAAU,oHACb,0BAAAA,KAAC,mBAAgB,WAAU,mBAAkB,GAC/C;AAAA,WACF;AAAA,QACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,uEAC7B,YAAE,eAAe,GACpB;AAAA;AAAA;AAAA,EACF;AAGF,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,gBAAAC,MAAC,SACE;AAAA;AAAA,MACD,gBAAAD,KAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,gBAAgB,GAAG;AAAA,OAC5D;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,KAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,QAAM,EAAE,UAAU,WAAW,IAAI,MAAM;AAEvC,MAAI,SAAS,WAAW,GAAG;AAIzB,QAAI,aAAa,WAAW,SAAS,GAAG;AACtC,aACE,gBAAAC,MAAC,SACE;AAAA;AAAA,QACD,gBAAAD,KAAC,gBAAa,OAAO,EAAE,mBAAmB,GAAG,MAAM,EAAE,sBAAsB,GAAG;AAAA,SAChF;AAAA,IAEJ;AAKA,WAAO,WAAW,OAAO,IACvB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,mBAAmB;AAAA,QAC5B,MAAM,EAAE,kBAAkB;AAAA,QAC1B,QACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,QAAQ,CAAC;AAAA,YAEvB,YAAE,wBAAwB;AAAA;AAAA,QAC7B;AAAA;AAAA,IAEJ,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,mBAAmB;AAAA,QAC5B,MAAM,EAAE,kBAAkB;AAAA,QAC1B,QACE,gBAAAA,KAACG,OAAA,EAAK,IAAG,iBAAgB,WAAU,0DAChC,YAAE,oBAAoB,GACzB;AAAA;AAAA,IAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAF,MAAC,SACE;AAAA;AAAA,IACD,gBAAAD,KAAC,QAAG,WAAU,iBACX,mBAAS,IAAI,CAAC,UACb,gBAAAA,KAAC,QACC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,MAAM;AAAA,QACd,OAAO;AAAA,UACL,MAAM,UAAU,CAAC,GAAG;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM;AAAA,QACR;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,QAAQ,oBAAoB,MAAM,cAAc,MAAM,OAAO,MAAM,QAAQ;AAAA,QAC3E,QAAQ,MAAM;AAAA;AAAA,IAChB,KAXO,MAAM,MAYf,CACD,GACH;AAAA,IAEC,WAAW,OAAO,KAAK,WAAW,WACjC,gBAAAC,MAAC,SAAI,WAAU,oEAAmE,cAAY,EAAE,mBAAmB,GACjH;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,WAAW,QAAQ;AAAA,UAC7B,SAAS,MAAM,QAAQ,CAAC,YAAY,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC;AAAA,UAE5D;AAAA,4BAAAD,KAAC,iBAAc,WAAU,kCAAiC;AAAA,YACzD,EAAE,iBAAiB;AAAA;AAAA;AAAA,MACtB;AAAA,MACA,gBAAAA,KAAC,OAAE,WAAU,kDACV,YAAE,eAAe,EAAE,MAAM,WAAW,KAAK,CAAC,GAC7C;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,CAAC,WAAW;AAAA,UACtB,SAAS,MAAM,QAAQ,CAAC,YAAY,UAAU,CAAC;AAAA,UAE9C;AAAA,cAAE,aAAa;AAAA,YAChB,gBAAAD,KAAC,kBAAe,WAAU,kCAAiC;AAAA;AAAA;AAAA,MAC7D;AAAA,OACF,IACE;AAAA,KACN;AAEJ;AAEO,SAAS,mBAAmB,EAAE,QAAQ,GAAwB;AACnE,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,SAAS,OAAO,IAAI,MAC/D,gBAAgB,CAAC,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC;AAE9C,QAAM,WAAW,gBAAAA,KAAC,mBAAgB,IAAI,eAAe,QAAQ,GAAG,OAAO,EAAE,kBAAkB,GAAG;AAE9F,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,gBAAAC,MAAC,SACE;AAAA;AAAA,MACD,gBAAAD,KAAC,SAAI,WAAU,YACb,0BAAAA,KAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,mBAAmB,GAAG,GAC/D;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WACE,gBAAAC,MAAC,SACE;AAAA;AAAA,MACD,gBAAAD,KAAC,SAAI,WAAU,YACb,0BAAAA,KAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,GACzD;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,QAAQ,MAAM;AAEpB,SACE,gBAAAC,MAAC,SACE;AAAA;AAAA,IAED,gBAAAA,MAAC,SAAI,WAAU,iFACb;AAAA,sBAAAA,MAAC,SACC;AAAA,wBAAAD,KAAC,uBAAqB,YAAE,sBAAsB,EAAE,IAAI,MAAM,OAAO,CAAC,GAAE;AAAA,QACpE,gBAAAA,KAAC,OAAE,WAAU,0CAA0C,4BAAkB,MAAM,SAAS,GAAE;AAAA,SAC5F;AAAA,MACA,gBAAAA,KAAC,cAAW,QAAQ,MAAM,QAAQ;AAAA,OACpC;AAAA,IAQC,MAAM,gBACL,gBAAAA,KAAC,OAAE,WAAU,8DAA8D,gBAAM,eAAc,IAC7F;AAAA,IAEJ,gBAAAA,KAAC,QAAG,WAAU,0BACX,gBAAM,UAAU,IAAI,CAAC,SACpB,gBAAAA,KAAC,QACC,0BAAAC,MAAC,eAAY,WAAU,qBACrB;AAAA,sBAAAA,MAAC,SAAI,WAAU,wEACb;AAAA,wBAAAA,MAAC,SAAI,WAAU,eACb;AAAA,0BAAAD,KAAC,OAAE,WAAU,iDAAiD,eAAK,cAAa;AAAA,UAC/E,KAAK,eACJ,gBAAAA,KAAC,OAAE,WAAU,0CAA0C,eAAK,cAAa,IACvE;AAAA,UACJ,gBAAAC,MAAC,OAAE,WAAU,6DACV;AAAA,iBAAK;AAAA,YAAS;AAAA,YAAI,oBAAoB,KAAK,WAAW,MAAM,QAAQ;AAAA,aACvE;AAAA,WACF;AAAA,QACA,gBAAAA,MAAC,SAAI,WAAU,kBACb;AAAA,0BAAAD,KAAC,OAAE,WAAU,qDACV,8BAAoB,KAAK,OAAO,MAAM,QAAQ,GACjD;AAAA,UAQA,gBAAAA,KAAC,OAAE,WAAU,cACX,0BAAAA,KAAC,gBAAa,QAAQ,KAAK,gBAAgB,GAC7C;AAAA,WACF;AAAA,SACF;AAAA,MAQC,KAAK,kBAAkB,gBAAAA,KAAC,kBAAe,SAAS,KAAK,iBAAiB,IAAK;AAAA,OAC9E,KApCO,KAAK,EAqCd,CACD,GACH;AAAA,IAEA,gBAAAA,KAAC,eAAY,WAAU,8BACrB,0BAAAC,MAAC,QAAG,WAAU,mBACZ;AAAA,sBAAAD,KAAC,cAAW,OAAO,EAAE,iBAAiB,GACnC,8BAAoB,MAAM,UAAU,MAAM,QAAQ,GACrD;AAAA,MAOC,OAAO,MAAM,mBAAmB,MAAM,QAAQ,IAAI,IACjD,gBAAAC,MAAC,cAAW,OAAO,EAAE,iBAAiB,GAAG;AAAA;AAAA,QACrC,oBAAoB,MAAM,iBAAiB,MAAM,UAAU,MAAM,QAAQ;AAAA,SAC7E,IACE;AAAA,MACH,OAAO,MAAM,GAAG,IAAI,IACnB,gBAAAD,KAAC,cAAW,OAAO,EAAE,YAAY,GAC9B,8BAAoB,MAAM,KAAK,MAAM,QAAQ,GAChD,IACE;AAAA,MACJ,gBAAAA,KAAC,cAAW,OAAO,EAAE,cAAc,GAAG,UAAQ,MAC3C,8BAAoB,MAAM,cAAc,MAAM,OAAO,MAAM,QAAQ,GACtE;AAAA,MAMC,MAAM,iBACL,gBAAAA,KAAC,cAAW,OAAO,EAAE,iBAAiB,GACnC,6BAAmB,MAAM,cAAc,GAC1C,IACE;AAAA,OACN,GACF;AAAA,IAQA,gBAAAA,KAAC,mBAAgB,aAAa,MAAM,QAAQ;AAAA,KAC9C;AAEJ;AAkBA,SAAS,gBAAgB,EAAE,YAAY,GAA4B;AACjE,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,cAAc,WAAW,IAAI,MACxE,gBAAgB,CAAC,QAAQ,IAAI,WAAW,WAAW,CAAC,CAAC;AAEvD,QAAM,CAAC,SAAS,UAAU,IAAII,UAA8C,CAAC,CAAC;AAE9E,MAAI,MAAM,WAAW,UAAW,QAAO;AAEvC,MAAI,MAAM,WAAW,SAAS;AAC5B,WACE,gBAAAJ,KAAC,mBACC,0BAAAA,KAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,GACzD;AAAA,EAEJ;AAEA,QAAM,aAAa,mBAAmB,MAAM,KAAK,YAAY,WAAW,EACrE,IAAI,CAAC,aAAa,QAAQ,SAAS,MAAM,KAAK,QAAQ;AAEzD,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,SACE,gBAAAA,KAAC,mBACC,0BAAAA,KAAC,QAAG,WAAU,iBACX,qBAAW,IAAI,CAAC,aACf,gBAAAA,KAAC,QACC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,CAAC,YAAY,WAAW,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,QAAQ,MAAM,GAAG,QAAQ,EAAE;AAAA;AAAA,EACvF,KAJO,SAAS,MAKlB,CACD,GACH,GACF;AAEJ;AAEA,SAAS,gBAAgB,EAAE,SAAS,GAA4B;AAC9D,SACE,gBAAAC,MAAC,aAAQ,WAAU,YACjB;AAAA,oBAAAD,KAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAAA,IAChD,gBAAAA,KAAC,SAAI,WAAU,YAAY,UAAS;AAAA,KACtC;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,SAAS,UAAU,IAAII,UAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,EAAE;AACzC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,QAAM,WAAW,iBAAiB,SAAS,YAAY;AACvD,QAAM,UAAU,kBAAkB,SAAS,MAAM;AAEjD,QAAM,OAAO,YAAY;AACvB,eAAW,IAAI;AACf,aAAS,IAAI;AACb,UAAM,WAAW,MAAM,gBAAgB,CAAC,QAAQ,IAAI;AAAA,MAClD,SAAS;AAAA,MACT,qBAAqB,OAAO;AAAA,IAC9B,CAAC;AACD,eAAW,KAAK;AAEhB,QAAI,CAAC,SAAS,WAAW,SAAS,SAAS,QAAW;AACpD,eAAS,SAAS,SAAS,KAAK,KAAK,EAAE,4BAA4B,CAAC;AACpE;AAAA,IACF;AAIA,eAAW,KAAK;AAChB,eAAW,EAAE;AACb,YAAQ,IAAI;AACZ,cAAU,SAAS,KAAK,QAAQ;AAAA,EAClC;AAEA,SACE,gBAAAH,MAAC,eAAY,WAAU,qBACrB;AAAA,oBAAAA,MAAC,SAAI,WAAU,wEACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,kDACb;AAAA,wBAAAD,KAAC,cAAW,WAAU,0DAAyD;AAAA,QAC/E,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,0BAAAD,KAAC,OAAE,WAAU,iDAAiD,mBAAS,eAAc;AAAA,UACrF,gBAAAC,MAAC,OAAE,WAAU,0CACV;AAAA,0BAAc,iBAAiB,QAAQ,CAAC;AAAA,YACxC,WAAW,SAAM,EAAE,QAAQ,CAAC,KAAK;AAAA,aACpC;AAAA,WACF;AAAA,SACF;AAAA,MAKC,iBAAiB,QAAQ,KAAK,CAAC,UAC9B,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM,WAAW,IAAI;AAAA,UAE7B,YAAE,2BAA2B;AAAA;AAAA,MAChC,IACE;AAAA,OACN;AAAA,IAEC,OAAO,gBAAAA,KAAC,iBAAc,SAAS,EAAE,0BAA0B,GAAG,IAAK;AAAA,IAEnE,UACC,gBAAAC,MAAC,SAAI,WAAU,kCACb;AAAA,sBAAAA,MAAC,WAAM,SAAS,SAAS,WAAU,uDAChC;AAAA,UAAE,2BAA2B;AAAA,QAC9B,gBAAAD,KAAC,UAAK,WAAU,0DACb,YAAE,8BAA8B,GACnC;AAAA,SACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,UACV,WAAW;AAAA,UACX,UAAU,CAAC,UAAU;AACnB,uBAAW,MAAM,OAAO,KAAK;AAC7B,qBAAS,IAAI;AAAA,UACf;AAAA,UACA,WAAW,GAAGE,MAAK;AAAA;AAAA,MACrB;AAAA,MAEA,gBAAAD,MAAC,SAAI,WAAU,8DACb;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,aAAW,WAAW;AAAA,YACtB,WAAU;AAAA,YACV,SAAS,MAAM,KAAK,KAAK;AAAA,YAExB;AAAA,wBAAU,gBAAAD,KAAC,eAAY,WAAU,kCAAiC,IAAK;AAAA,cACvE,UAAU,EAAE,6BAA6B,IAAI,EAAE,0BAA0B;AAAA;AAAA;AAAA,QAC5E;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,WAAU;AAAA,YACV,SAAS,MAAM;AACb,yBAAW,KAAK;AAChB,uBAAS,IAAI;AAAA,YACf;AAAA,YAEC,YAAE,eAAe;AAAA;AAAA,QACpB;AAAA,SACF;AAAA,MAEC,QAAQ,gBAAAA,KAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,OACnD,IACE;AAAA,KACN;AAEJ;AAGA,SAAS,cAAc,UAAoC;AACzD,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK;AACH,aAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,aAAa,SAAS,SAAS,CAAC,EAAE,CAAC;AAAA,IACvG,KAAK;AACH,aAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,aAAa,SAAS,SAAS,CAAC,EAAE,CAAC;AAAA,IAChG,KAAK;AACH,aAAO,EAAE,0BAA0B;AAAA,EACvC;AACF;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAIG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,6DACT,WAAW,wCAAwC,gBACrD;AAAA,MAEA;AAAA,wBAAAD,KAAC,QAAG,WAAW,WAAW,qCAAqC,kBAAmB,iBAAM;AAAA,QACxF,gBAAAA,KAAC,QAAG,WAAW,oBAAoB,WAAW,8BAA8B,iBAAiB,IAC1F,UACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAUA,SAAS,aAAa,EAAE,OAAO,GAAuB;AACpD,QAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,QAAM,OAAO,eAAe,cACxB,4BACA,eAAe,WACb,4BACA;AAEN,SACE,gBAAAA,KAAC,UAAK,WAAW,iCAAiC,IAAI,IACnD,oBAAU,YAAY,UAAU,EAAE,KAAK,QAC1C;AAEJ;AAEA,SAAS,eAAe,EAAE,QAAQ,GAA4C;AAC5E,QAAM,aACJ,QAAQ,MAAM,SAAS,KACpB,QAAQ,MAAM,SAAS,KACvB,QAAQ,MAAM,SAAS,KACvB,QAAQ,QAAQ,SAAS;AAE9B,MAAI,CAAC,WAAY,QAAO;AAExB,SACE,gBAAAC,MAAC,SAAI,WAAU,kCACb;AAAA,oBAAAD,KAAC,OAAE,WAAU,uFACV,YAAE,sBAAsB,GAC3B;AAAA,IAEC,QAAQ,MAAM,SACb,gBAAAA,KAAC,QAAG,WAAU,4BACX,kBAAQ,MAAM,IAAI,CAAC,SAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAET;AAAA;AAAA,MAHI;AAAA,IAIP,CACD,GACH,IACE;AAAA,IAEH,QAAQ,QAAQ,SACf,gBAAAA,KAAC,QAAG,WAAU,4BACX,kBAAQ,QAAQ,IAAI,CAAC,WACpB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAIV;AAAA,0BAAAD,KAAC,UAAK,WAAW,OAAO,cAAc,oCAAoC,IACvE,iBAAO,OACV;AAAA,UACC,OAAO,iBACN,gBAAAA,KAAC,UAAK,WAAU,wDAAwD,YAAE,oBAAoB,GAAE,IAC9F;AAAA;AAAA;AAAA,MAVC,OAAO;AAAA,IAWd,CACD,GACH,IACE;AAAA,IAEH,QAAQ,MAAM,SACb,gBAAAA,KAAC,QAAG,WAAU,4BACX,kBAAQ,MAAM,IAAI,CAAC,SAClB,gBAAAA,KAAC,QAAuC,WAAU,kBAChD,0BAAAA,KAAC,gBAAa,OAAO,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,KAAK,MAAM,KAD9D,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,EAEpC,CACD,GACH,IACE;AAAA,IAEH,QAAQ,MAAM,SACb,gBAAAA,KAAC,SAAI,WAAU,4BACZ,kBAAQ,MAAM,IAAI,CAAC,SAClB,gBAAAA,KAAC,OAAa,WAAU,qDAAqD,kBAArE,IAA0E,CACnF,GACH,IACE;AAAA,KACN;AAEJ;AAUA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,WAAW,iBAAiB,IAAI;AAEtC,MAAI,aAAa,MAAM;AACrB,WAAO,gBAAAC,MAAC,UAAK,WAAU,gCAAgC;AAAA;AAAA,MAAM;AAAA,MAAG;AAAA,OAAM;AAAA,EACxE;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAU;AAAA,MAET;AAAA;AAAA,EACH;AAEJ;;;AG3wBA,SAAS,QAAAK,aAAY;AAuBV,gBAAAC,MAYL,QAAAC,aAZK;AANX,IAAM,qBAAqB;AAEpB,SAAS,kBAAkB;AAChC,QAAM,EAAE,OAAO,OAAO,IAAI,oBAAoB;AAE9C,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO,gBAAAD,KAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,kBAAkB,GAAG;AAAA,EACrE;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,KAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,QAAM,UAAU,MAAM;AACtB,QAAM,eAAe,QAAQ,SAAS,MAAM,GAAG,kBAAkB;AAEjE,SACE,gBAAAC,MAAC,SAAI,WAAU,iBACb;AAAA,oBAAAA,MAAC,eAAY,WAAU,qBACrB;AAAA,sBAAAD,KAAC,OAAE,WAAU,iCAAiC,YAAE,qBAAqB,GAAE;AAAA,MACvE,gBAAAA,KAAC,OAAE,WAAU,wEAAwE,kBAAQ,SAAS,MAAK;AAAA,MAC3G,gBAAAA,KAAC,OAAE,WAAU,yDAAyD,kBAAQ,SAAS,OAAM;AAAA,OAC/F;AAAA,IAIA,gBAAAC,MAAC,SAAI,WAAU,yDACb;AAAA,sBAAAD,KAAC,YAAS,OAAO,EAAE,qBAAqB,GAAG,OAAO,QAAQ,MAAM,gBAAgB;AAAA,MAChF,gBAAAA,KAAC,YAAS,OAAO,EAAE,uBAAuB,GAAG,OAAO,QAAQ,MAAM,gBAAgB;AAAA,MAClF,gBAAAA,KAAC,YAAS,OAAO,EAAE,wBAAwB,GAAG,OAAO,QAAQ,MAAM,oBAAoB;AAAA,MACvF,gBAAAA,KAAC,YAAS,OAAO,EAAE,sBAAsB,GAAG,OAAO,QAAQ,MAAM,eAAe;AAAA,OAClF;AAAA,IAUC,QAAQ,UAAU,QAAQ,OAAO,UAChC,gBAAAA,KAAC,eAAY,WAAU,qBACrB,0BAAAC,MAAC,SAAI,WAAU,2EACb;AAAA,sBAAAA,MAAC,SACC;AAAA,wBAAAD,KAAC,OAAE,WAAU,iCAAiC,YAAE,sBAAsB,GAAE;AAAA,QACxE,gBAAAA,KAAC,OAAE,WAAU,uDACV,8BAAoB,QAAQ,OAAO,WAAW,QAAQ,OAAO,QAAQ,GACxE;AAAA,SACF;AAAA,MACA,gBAAAA,KAAC,OAAE,WAAU,iCAAiC,YAAE,qBAAqB,GAAE;AAAA,OACzE,GACF,IACE;AAAA,IAEJ,gBAAAC,MAAC,aACC;AAAA,sBAAAA,MAAC,SAAI,WAAU,yEACb;AAAA,wBAAAD,KAAC,uBAAqB,YAAE,uBAAuB,GAAE;AAAA,QAChD,aAAa,SACZ,gBAAAC;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,IAAI,eAAe,QAAQ;AAAA,YAC3B,WAAU;AAAA,YAET;AAAA,gBAAE,oBAAoB;AAAA,cACvB,gBAAAF,KAAC,kBAAe,WAAU,gCAA+B;AAAA;AAAA;AAAA,QAC3D,IACE;AAAA,SACN;AAAA,MAEA,gBAAAA,KAAC,SAAI,WAAU,YACZ,uBAAa,WAAW,IACvB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,mBAAmB;AAAA,UAC5B,MAAM,EAAE,kBAAkB;AAAA,UAC1B,QACE,gBAAAA,KAACE,OAAA,EAAK,IAAG,iBAAgB,WAAU,0DAChC,YAAE,oBAAoB,GACzB;AAAA;AAAA,MAEJ,IAEA,gBAAAF,KAAC,QAAG,WAAU,iBACX,uBAAa,IAAI,CAAC,UACjB,gBAAAA,KAAC,QAOC,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ,MAAM;AAAA,UACd,OAAO;AAAA,YACL,MAAM,WAAW,CAAC,GAAG;AAAA,YACrB,MAAM,WAAW;AAAA,YACjB,MAAM;AAAA,UACR;AAAA,UACA,WAAW,MAAM;AAAA,UACjB,QAAQ,oBAAoB,MAAM,eAAe,MAAM,OAAO,MAAM,QAAQ;AAAA,UAC5E,QAAQ,MAAM;AAAA;AAAA,MAChB,KAjBO,MAAM,MAkBf,CACD,GACH,GAEJ;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,SAAS,EAAE,OAAO,MAAM,GAAqC;AACpE,SACE,gBAAAC,MAAC,SAAI,WAAU,4DACb;AAAA,oBAAAD,KAAC,OAAE,WAAU,8CAA8C,iBAAM;AAAA,IACjE,gBAAAA,KAAC,OAAE,WAAU,0CAA0C,iBAAM;AAAA,KAC/D;AAEJ;;;ACzHO,SAAS,sBAAsB,SAA+C;AACnF,SAAO,QAAQ,UAAU;AAC3B;AASO,SAAS,iBAAiB,MAA+C;AAC9E,QAAM,MAAM,KAAK,KAAK,KAAK;AAC3B,SAAO,MAAM,MAAM;AACrB;AAGO,SAAS,mBAAmB,MAAyC;AAC1E,SAAO,KAAK,WAAW;AACzB;AAEA,IAAM,kBAAoD;AAAA,EACxD,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,sBAAsB;AACxB;AAGO,SAAS,aAAa,MAA6B;AACxD,SAAO,gBAAgB,IAAI,KAAK;AAClC;AAMO,SAAS,yBACd,SACA,cACS;AACT,SAAO,QAAQ,iBAAiB,YAAY,MAAM,aAAa,YAAY;AAC7E;;;ACxBW,gBAAAG,MA0BH,QAAAC,aA1BG;AAJJ,SAAS,mBAAmB;AACjC,QAAM,EAAE,OAAO,OAAO,IAAI,oBAAoB;AAE9C,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO,gBAAAD,KAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,mBAAmB,GAAG;AAAA,EACtE;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,KAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,QAAM,UAAU,MAAM,KAAK;AAQ3B,MAAI,CAAC,sBAAsB,OAAO,GAAG;AACnC,WACE,gBAAAA,KAAC,gBAAa,OAAO,EAAE,4BAA4B,GAAG,MAAM,EAAE,2BAA2B,GAAG;AAAA,EAEhG;AAEA,QAAM,EAAE,UAAU,kBAAkB,SAAS,IAAI;AAEjD,SACE,gBAAAC,MAAC,SAAI,WAAU,iBACb;AAAA,oBAAAA,MAAC,SACC;AAAA,sBAAAA,MAAC,eAAY,WAAU,sBACrB;AAAA,wBAAAD,KAAC,OAAE,WAAU,iCAAiC,YAAE,0BAA0B,GAAE;AAAA,QAC5E,gBAAAA,KAAC,OAAE,WAAU,uDACV,8BAAoB,SAAS,WAAW,QAAQ,GACnD;AAAA,QACA,gBAAAA,KAAC,OAAE,WAAU,0CAA0C,YAAE,4BAA4B,GAAE;AAAA,SACzF;AAAA,MAOA,gBAAAC,MAAC,SAAI,WAAU,kEACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,wBAAwB;AAAA,YACjC,QAAQ,SAAS;AAAA,YACjB;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,0BAA0B;AAAA,YACnC,QAAQ,SAAS;AAAA,YACjB;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,0BAA0B;AAAA,YACnC,QAAQ,SAAS;AAAA,YACjB;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,qBAAqB;AAAA,YAC9B,QAAQ,SAAS;AAAA,YACjB;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAEC,yBAAyB,SAAS,MAAM,KAAK,KAAK,QAAQ,IACzD,gBAAAA,KAAC,OAAE,WAAU,0CACV,YAAE,+BAA+B,EAAE,SAAS,CAAC,GAChD,IACE;AAAA,OACN;AAAA,IAEA,gBAAAC,MAAC,aACC;AAAA,sBAAAD,KAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAAA,MAChD,gBAAAA,KAAC,OAAE,WAAU,0CACV,kBAAQ,uCACL,EAAE,yBAAyB,IAC3B,EAAE,4BAA4B,GACpC;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAU,YACZ,kBAAQ,MAAM,WAAW,IACxB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,2BAA2B;AAAA,UACpC,MAAM,EAAE,0BAA0B;AAAA;AAAA,MACpC,IAEA,gBAAAA,KAAC,QAAG,WAAU,iBACX,kBAAQ,MAAM,IAAI,CAAC,SAClB,gBAAAA,KAAC,QACC,0BAAAA,KAAC,oBAAiB,MAAY,UAAoB,KAD3C,KAAK,EAEd,CACD,GACH,GAEJ;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,aACC;AAAA,sBAAAD,KAAC,uBAAqB,YAAE,4BAA4B,GAAE;AAAA,MACtD,gBAAAA,KAAC,SAAI,WAAU,YACZ,kBAAQ,YAAY,WAAW,IAC9B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,iCAAiC;AAAA,UAC1C,MAAM,EAAE,gCAAgC;AAAA;AAAA,MAC1C,IAEA,gBAAAA,KAAC,QAAG,WAAU,iBACX,kBAAQ,YAAY,IAAI,CAAC,eACxB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA,4BAAAA,MAAC,SAAI,WAAU,0BACb;AAAA,8BAAAD,KAAC,OAAE,WAAU,iDACV,YAAE,2BAA2B,EAAE,IAAI,WAAW,WAAW,CAAC,GAC7D;AAAA,cAGC,WAAW,aACV,gBAAAA,KAAC,OAAE,WAAU,0CACV,4BAAkB,WAAW,UAAU,GAC1C,IACE;AAAA,eACN;AAAA,YACA,gBAAAA,KAAC,UAAK,WAAU,kEACb,8BAAoB,WAAW,mBAAmB,QAAQ,GAC7D;AAAA,YACA,gBAAAA,KAAC,cAAW,QAAQ,WAAW,QAAQ;AAAA;AAAA;AAAA,QAlBlC,WAAW;AAAA,MAmBlB,CACD,GACH,GAEJ;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,aACC;AAAA,sBAAAD,KAAC,uBAAqB,YAAE,wBAAwB,GAAE;AAAA,MAClD,gBAAAA,KAAC,SAAI,WAAU,YACZ,kBAAQ,OAAO,WAAW,IACzB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,6BAA6B;AAAA,UACtC,MAAM,EAAE,4BAA4B;AAAA;AAAA,MACtC,IAEA,gBAAAA,KAAC,QAAG,WAAU,iBACX,kBAAQ,OAAO,IAAI,CAAC,UAAU;AAC7B,cAAM,UAAU,aAAa,MAAM,IAAI;AACvC,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YAEV;AAAA,8BAAAA,MAAC,SAAI,WAAU,0BAGb;AAAA,gCAAAD,KAAC,OAAE,WAAU,iDACV,oBAAU,EAAE,OAAO,IAAI,YAAY,MAAM,IAAI,GAChD;AAAA,gBACC,MAAM,aACL,gBAAAA,KAAC,OAAE,WAAU,0CACV,4BAAkB,MAAM,UAAU,GACrC,IACE;AAAA,iBACN;AAAA,cACA,gBAAAA,KAAC,UAAK,WAAU,kEAGb,8BAAoB,MAAM,QAAQ,MAAM,QAAQ,GACnD;AAAA,cACA,gBAAAA,KAAC,cAAW,QAAQ,MAAM,QAAQ;AAAA;AAAA;AAAA,UApB7B,MAAM;AAAA,QAqBb;AAAA,MAEJ,CAAC,GACH,GAEJ;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAC,MAAC,eAAY,WAAU,WACrB;AAAA,oBAAAD,KAAC,OAAE,WAAU,kDAAkD,8BAAoB,QAAQ,QAAQ,GAAE;AAAA,IACrG,gBAAAA,KAAC,OAAE,WAAU,0CAA0C,iBAAM;AAAA,KAC/D;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AACF,GAGG;AAeD,QAAM,WAAW,iBAAiB,iBAAiB,IAAI,CAAC;AACxD,QAAM,aAAa,YAAY,KAAK;AAEpC,SACE,gBAAAC,MAAC,eAAY,WAAU,WACrB;AAAA,oBAAAA,MAAC,SAAI,WAAU,wEACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,eACb;AAAA,wBAAAD,KAAC,OAAE,WAAU,iDAAiD,eAAK,SAAS,KAAK,MAAK;AAAA,QACtF,gBAAAC,MAAC,OAAE,WAAU,0CACV;AAAA,YAAE,wBAAwB,EAAE,SAAS,KAAK,6BAA6B,CAAC;AAAA,UACxE;AAAA,UACA,EAAE,2BAA2B,EAAE,SAAS,KAAK,oCAAoC,CAAC;AAAA,WACrF;AAAA,SACF;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,oDACZ;AAAA,aAAK,aACJ,gBAAAD,KAAC,UAAK,WAAU,qEAAqE,YAAE,mBAAmB,GAAE,IAC1G;AAAA,QACJ,gBAAAA,KAAC,cAAW,QAAQ,KAAK,QAAQ;AAAA,SACnC;AAAA,OACF;AAAA,IAEC,mBAAmB,IAAI,IACtB,gBAAAA,KAAC,OAAE,WAAU,0CAA0C,YAAE,4BAA4B,GAAE,IACrF;AAAA,IAEJ,gBAAAC,MAAC,SAAI,WAAU,8DACb;AAAA,sBAAAD,KAAC,UAAK,WAAU,6HACb,sBACH;AAAA,MACA,gBAAAC,MAAC,SAAI,WAAU,oDACZ;AAAA,mBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAEV;AAAA,8BAAAD,KAAC,oBAAiB,WAAU,uBAAsB;AAAA,cAIlD,gBAAAA,KAAC,UAAK,WAAU,cAAc,YAAE,oBAAoB,GAAE;AAAA;AAAA;AAAA,QACxD,IACE;AAAA,QACJ,gBAAAA,KAAC,cAAW,OAAO,YAAY;AAAA,SACjC;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,QAAG,WAAU,qEACZ;AAAA,sBAAAD,KAAC,YAAS,OAAO,EAAE,kBAAkB,GAAG,OAAO,OAAO,KAAK,YAAY,GAAG;AAAA,MAC1E,gBAAAA,KAAC,YAAS,OAAO,EAAE,iBAAiB,GAAG,OAAO,OAAO,KAAK,WAAW,GAAG;AAAA,MACxE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,mBAAmB;AAAA,UAC5B,OAAO,oBAAoB,KAAK,eAAe,QAAQ;AAAA;AAAA,MACzD;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,SAAS,EAAE,OAAO,MAAM,GAAqC;AACpE,SACE,gBAAAC,MAAC,SACC;AAAA,oBAAAD,KAAC,QAAG,WAAU,iCAAiC,iBAAM;AAAA,IACrD,gBAAAA,KAAC,QAAG,WAAU,8DAA8D,iBAAM;AAAA,KACpF;AAEJ;;;AClTA,SAAS,eAAAE,cAAa,aAAAC,YAAW,OAAO,UAAAC,SAAQ,YAAAC,iBAAgB;AA8ErD,SAuzBD,UAvzBC,OAAAC,OA6ID,QAAAC,aA7IC;AA3BX,IAAMC,SACJ;AAEF,IAAM,YAAY;AAcX,SAAS,kBAAkB;AAOhC,QAAM,EAAE,OAAO,OAAO,IAAI,0BAA0B;AAEpD,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO,gBAAAF,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,kBAAkB,GAAG;AAAA,EACrE;AACA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,QAAM,WAAW,sBAAsB,MAAM,IAAI;AACjD,MAAI,CAAC,SAAS,IAAI;AAChB,WAAO,gBAAAA,MAAC,gBAAa,SAAS,EAAE,qBAAqB,GAAG,SAAS,QAAQ;AAAA,EAC3E;AACA,QAAM,UAAU,SAAS;AAEzB,MAAI,CAAC,QAAQ,iBAAiB;AAC5B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,wBAAwB;AAAA,QACjC,MAAM,EAAE,uBAAuB;AAAA;AAAA,IACjC;AAAA,EAEJ;AAEA,QAAM,WAAW,QAAQ;AACzB,QAAM,SAAS,UAAU;AAEzB,MAAI,YAAY,WAAW,UAAU;AACnC,WAAO,gBAAAA,MAAC,kBAAe,cAAc,UAAU;AAAA,EACjD;AAEA,MAAI,WAAW,WAAW;AACxB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,uBAAuB;AAAA,QAChC,MAAM,EAAE,sBAAsB;AAAA;AAAA,IAChC;AAAA,EAEJ;AAEA,MAAI,WAAW,aAAa;AAC1B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,yBAAyB;AAAA,QAClC,MAAM,EAAE,wBAAwB;AAAA;AAAA,IAClC;AAAA,EAEJ;AAEA,MAAI,WAAW,YAAY;AACzB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,wBAAwB;AAAA,QACjC,MAAM,EAAE,uBAAuB;AAAA;AAAA,IACjC;AAAA,EAEJ;AAIA,SAAO,gBAAAA,MAAC,iBAAc,SAAkB,QAAQ,QAAQ;AAC1D;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAGG;AACD,QAAM,UAAU,MAAM;AACtB,QAAM,CAAC,MAAM,OAAO,IAAIG,UAAS,EAAE;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,uBAAuBC,QAAsB,IAAI;AAEvD,EAAAC,WAAU,MAAM;AAGd,QAAI,QAAQ,UAAU,WAAW,UAAW;AAE5C,UAAM,cAAc,0BAA0B,QAAQ;AACtD,QAAI,CAAC,eAAe,qBAAqB,YAAY,YAAa;AAClE,yBAAqB,UAAU;AAE/B,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,UAAM,YAAY;AAChB,YAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,qBAAqB,WAAW,CAAC;AACnF,cAAQ,KAAK;AAKb,UAAI,CAAC,OAAO,SAAS;AACnB,iBAAS,WAAW;AACpB,iBAAS,OAAO,SAAS,KAAK,KAAK,EAAE,qBAAqB,CAAC;AAC3D;AAAA,MACF;AACA,UAAI,CAAC,uBAAuB,OAAO,IAAI,EAAE,IAAI;AAC3C,iBAAS,WAAW;AACpB,iBAAS,EAAE,qBAAqB,CAAC;AACjC;AAAA,MACF;AACA,iCAA2B,QAAQ;AACnC,aAAO;AAAA,IACT,GAAG;AAAA,EACL,GAAG,CAAC,QAAQ,UAAU,QAAQ,MAAM,CAAC;AAErC,QAAM,MAAM,OAAO,cAAkE;AACnF,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,UAAM,SAAS,MAAM,gBAAgB,SAAS;AAC9C,YAAQ,KAAK;AAEb,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,qBAAqB,CAAC;AAC3D;AAAA,IACF;AAGA,QAAI,CAAC,uBAAuB,OAAO,IAAI,EAAE,IAAI;AAC3C,eAAS,EAAE,qBAAqB,CAAC;AACjC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AASA,QAAM,QAAQ,kBAAkB,OAAO;AAEvC,MAAI,UAAU,QAAQ;AACpB,WACE,gBAAAL;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,oBAAoB;AAAA,QAC7B,MAAM,QAAQ,uBAAuB,EAAE,mBAAmB;AAAA,QAC1D,QACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,aAAW,QAAQ;AAAA,YACnB,WAAU;AAAA,YACV,SAAS,MAAM,KAAK,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC;AAAA,YAEtD;AAAA,qBAAO,gBAAAD,MAAC,eAAY,WAAU,cAAa,IAAK;AAAA,cAChD,EAAE,eAAe;AAAA;AAAA;AAAA,QACpB;AAAA;AAAA,IAEJ;AAAA,EAEJ;AAEA,MAAI,UAAU,UAAU;AACtB,WACE,gBAAAC,MAAC,eAAY,WAAU,oCACrB;AAAA,sBAAAD,MAAC,QAAG,WAAU,oDAAoD,YAAE,sBAAsB,GAAE;AAAA,MAC5F,gBAAAA,MAAC,OAAE,WAAU,8DACV,kBAAQ,uBAAuB,EAAE,qBAAqB,GACzD;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,YAAU;AAAA,UACV,WAAU;AAAA,UACV,UAAU,CAAC,UAAU;AACnB,kBAAM,eAAe;AACrB,iBAAK,IAAI,CAAC,QAAQ,IAAI,qBAAqB,MAAM,KAAK,CAAC,CAAC;AAAA,UAC1D;AAAA,UAEA;AAAA,4BAAAD,MAAC,WAAM,SAAS,GAAG,OAAO,UAAU,WAAU,uDAC3C,YAAE,sBAAsB,GAC3B;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,GAAG,OAAO;AAAA,gBACd,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,gBAAc,QAAQ,OAAO;AAAA,gBAC7B,UAAU,CAAC,UAAU;AACnB,2BAAS,MAAM,OAAO,KAAK;AAC3B,2BAAS,IAAI;AAAA,gBACf;AAAA,gBACA,WAAWE;AAAA;AAAA,YACb;AAAA,YACC,QAAQ,gBAAAF,MAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,YACjD,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU,QAAQ,MAAM,KAAK,EAAE,WAAW;AAAA,gBAC1C,aAAW,QAAQ;AAAA,gBACnB,WAAU;AAAA,gBAET;AAAA,yBAAO,gBAAAD,MAAC,eAAY,WAAU,cAAa,IAAK;AAAA,kBAChD,EAAE,uBAAuB;AAAA;AAAA;AAAA,YAC5B;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,QAAQ,MAAM;AAClB,QAAI,QAAQ,4BAA4B,KAAK,KAAK,EAAE,WAAW,GAAG;AAChE,eAAS,EAAE,uBAAuB,CAAC;AACnC;AAAA,IACF;AACA,SAAK,IAAI,CAAC,QAAQ,IAAI,iBAAiB,KAAK,KAAK,KAAK,MAAS,CAAC;AAAA,EAClE;AAEA,SACE,gBAAAC,MAAC,eAAY,WAAU,oCACrB;AAAA,oBAAAD,MAAC,QAAG,WAAU,oDAAoD,YAAE,2BAA2B,GAAE;AAAA,IACjG,gBAAAA,MAAC,OAAE,WAAU,8DACV,kBAAQ,uBAAuB,EAAE,0BAA0B,GAC9D;AAAA,IACA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,YAAU;AAAA,QACV,WAAU;AAAA,QACV,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,gBAAM;AAAA,QACR;AAAA,QAEA;AAAA,0BAAAD,MAAC,WAAM,SAAS,GAAG,OAAO,SAAS,WAAU,uDAC1C,YAAE,0BAA0B,GAC/B;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,GAAG,OAAO;AAAA,cACd,MAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU;AAAA,cACV,gBAAc,QAAQ,OAAO;AAAA,cAC7B,UAAU,CAAC,UAAU;AACnB,wBAAQ,MAAM,OAAO,KAAK;AAC1B,yBAAS,IAAI;AAAA,cACf;AAAA,cACA,WAAW,GAAGE,MAAK;AAAA;AAAA,UACrB;AAAA,UACC,QAAQ,gBAAAF,MAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,UACjD,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU;AAAA,cACV,aAAW,QAAQ;AAAA,cACnB,WAAU;AAAA,cAET;AAAA,uBAAO,gBAAAD,MAAC,eAAY,WAAU,cAAa,IAAK;AAAA,gBAChD,EAAE,gBAAgB;AAAA;AAAA;AAAA,UACrB;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe,EAAE,aAAa,GAA2C;AAMhF,QAAM,CAAC,QAAQ,SAAS,IAAIG,UAAuB,CAAC,CAAC;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAA8B,IAAI;AAG9D,QAAM,gBAAgB,CAAC,SAAuB;AAC5C,cAAU,IAAI;AACd,cAAU,IAAI;AAAA,EAChB;AAEA,QAAM,MAAM,CAAC,SAAqB;AAChC,UAAM,WAAW,OAAO;AAAA,MACtB,CAAC,UAAU,MAAM,eAAe,KAAK,cAAc,MAAM,eAAe,KAAK;AAAA,IAC/E;AACA,QAAI,aAAa,IAAI;AACnB,oBAAc,CAAC,GAAG,QAAQ,IAAI,CAAC;AAC/B;AAAA,IACF;AACA,kBAAc,OAAO,IAAI,CAAC,OAAO,UAC/B,UAAU,WACN,EAAE,GAAG,OAAO,UAAU,KAAK,IAAI,6BAA6B,MAAM,WAAW,CAAC,EAAE,IAChF,KACL,CAAC;AAAA,EACJ;AAEA,QAAM,WAAW,aAAa,MAAM;AAEpC,SACE,gBAAAF,MAAC,SAAI,WAAU,iBACb;AAAA,oBAAAA,MAAC,aACC;AAAA,sBAAAD,MAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAAA,MAChD,gBAAAC,MAAC,SAAI,WAAU,kDACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,eAAe;AAAA,YACxB,OAAO,aAAa,MAAM,QAAQ,EAAE,oBAAoB;AAAA;AAAA,QAC1D;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,iBAAiB;AAAA,YAC1B,OAAO,aAAa,QAAQ,aAAa,SACrC,EAAE,oBAAoB,IACtB,GAAG,QAAQ;AAAA;AAAA,QACjB;AAAA,QAMA,gBAAAA,MAAC,UAAO,OAAO,EAAE,mBAAmB,GAAG,OAAO,aAAa,kBAAkB;AAAA,QAC7E,gBAAAA,MAAC,UAAO,OAAO,EAAE,qBAAqB,GAAG,OAAO,aAAa,iBAAiB;AAAA,SAChF;AAAA,OACF;AAAA,IAEA,gBAAAA,MAAC,mBAAgB;AAAA,IACjB,gBAAAA,MAAC,oBAAiB,OAAO,KAAK;AAAA,IAC9B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,UAAU;AAAA;AAAA,IACZ;AAAA,IACA,gBAAAA,MAAC,mBAAgB;AAAA,IACjB,gBAAAA,MAAC,mBAAgB;AAAA,KACnB;AAEJ;AAEA,SAAS,OAAO,EAAE,OAAO,MAAM,GAA8C;AAC3E,SACE,gBAAAC,MAAC,SAAI,WAAU,kDACb;AAAA,oBAAAD,MAAC,OAAE,WAAU,+DAA+D,iBAAM;AAAA,IAClF,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,iBAAM;AAAA,KAC/D;AAEJ;AAIA,SAAS,kBAAkB;AACzB,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,mBAAmB,MAC9D,gBAAgB,CAAC,QAAQ,IAAI,eAAe,CAAC,CAAC;AAEhD,QAAM,UAAU,gBAAAA,MAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAEhE,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,kBAAkB,GAAG,GAC9D;AAAA,OACF;AAAA,EAEJ;AACA,MAAI,MAAM,WAAW,SAAS;AAC5B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,GACzD;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,WAAW,qBAAqB,MAAM,IAAI;AAChD,MAAI,CAAC,SAAS,IAAI;AAChB,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,EAAE,qBAAqB,GAAG,SAAS,QAAQ,GACpE;AAAA,OACF;AAAA,EAEJ;AACA,QAAM,SAAS,SAAS;AAExB,SACE,gBAAAC,MAAC,aACE;AAAA;AAAA,IACD,gBAAAA,MAAC,eAAY,WAAU,oBACrB;AAAA,sBAAAA,MAAC,SAAI,WAAU,yEACb;AAAA,wBAAAD,MAAC,OAAE,WAAU,kCAAkC,YAAE,mBAAmB,GAAE;AAAA,QACtE,gBAAAA,MAAC,cAAW,QAAQ,OAAO,YAAY,WAAW,YAAY;AAAA,SAChE;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,2DACV,8BAAoB,OAAO,WAAW,OAAO,QAAQ,GACxD;AAAA,MAEA,gBAAAC,MAAC,SAAI,WAAU,kDACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,kBAAkB;AAAA,YAC3B,OAAO,oBAAoB,OAAO,SAAS,OAAO,QAAQ;AAAA;AAAA,QAC5D;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,eAAe;AAAA,YACxB,OAAO,oBAAoB,OAAO,cAAc,OAAO,QAAQ;AAAA;AAAA,QACjE;AAAA,SACF;AAAA,OAEF;AAAA,KACF;AAEJ;AAkCA,SAAS,aAAgB,UAAkB,MAAqC;AAC9E,QAAM,CAAC,OAAO,QAAQ,IAAIG,UAAwB,EAAE,QAAQ,UAAU,CAAC;AACvE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,CAAC;AACxC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAC9D,QAAM,UAAUC,QAAO,IAAI;AAC3B,UAAQ,UAAU;AAClB,QAAM,WAAWA,QAAO,KAAK;AAC7B,WAAS,UAAU;AAGnB,QAAM,aAAaA,QAAO,CAAC;AAE3B,EAAAC,WAAU,MAAM;AACd,eAAW,WAAW;AACtB,UAAM,OAAO,WAAW;AACxB,aAAS,EAAE,QAAQ,UAAU,CAAC;AAC9B,gBAAY,KAAK;AACjB,iBAAa,IAAI;AAEjB,SAAK,QAAQ,QAAQ,CAAC,EAAE,KAAK,CAAC,WAAW;AACvC,UAAI,WAAW,YAAY,KAAM;AACjC,eAAS,OAAO,KACZ,EAAE,QAAQ,SAAS,OAAO,OAAO,MAAM,IACvC,EAAE,QAAQ,SAAS,SAAS,OAAO,QAAQ,CAAC;AAAA,IAClD,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,OAAO,CAAC;AAEtB,QAAM,WAAWC,aAAY,MAAM;AACjC,UAAM,UAAU,SAAS;AACzB,QAAI,QAAQ,WAAW,QAAS;AAChC,UAAM,OAAO,WAAW;AACxB,gBAAY,IAAI;AAChB,iBAAa,IAAI;AAEjB,SAAK,QAAQ,QAAQ,QAAQ,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW;AAC5D,UAAI,WAAW,YAAY,KAAM;AACjC,kBAAY,KAAK;AACjB,UAAI,CAAC,OAAO,IAAI;AACd,qBAAa,OAAO,OAAO;AAC3B;AAAA,MACF;AACA,eAAS,CAAC,aAAc,SAAS,WAAW,UACxC;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO,CAAC,GAAG,SAAS,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK;AAAA,UACtD,MAAM,OAAO,MAAM;AAAA,UACnB,SAAS,OAAO,MAAM;AAAA,UACtB,OAAO,OAAO,MAAM;AAAA,QACtB;AAAA,MACF,IACA,QAAS;AAAA,IACf,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,SAASA,aAAY,MAAM,WAAW,CAAC,UAAU,QAAQ,CAAC,GAAG,CAAC,CAAC;AAErE,SAAO,EAAE,OAAO,UAAU,WAAW,UAAU,OAAO;AACxD;AAEA,SAAS,aAAgB,OAA8B;AACrD,SAAO,MAAM,OAAO,MAAM,UAAU,MAAM;AAC5C;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,OAAO,aAAa,KAAK;AAC/B,MAAI,MAAM,QAAQ,KAAK,CAAC,KAAM,QAAO;AAErC,SACE,gBAAAL,MAAC,SACC;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,cAAY,EAAE,mBAAmB;AAAA,QAEjC;AAAA,0BAAAD,MAAC,UAAK,WAAU,iCAAiC,YAAE,eAAe,EAAE,MAAM,MAAM,KAAK,CAAC,GAAE;AAAA,UACxF,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,CAAC,QAAQ;AAAA,cACnB,aAAW,QAAQ;AAAA,cACnB,WAAU;AAAA,cACV,SAAS;AAAA,cAER;AAAA,uBAAO,gBAAAD,MAAC,eAAY,WAAU,cAAa,IAAK;AAAA,gBAChD,EAAE,aAAa;AAAA;AAAA;AAAA,UAClB;AAAA;AAAA;AAAA,IACF;AAAA,IACC,QAAQ,gBAAAA,MAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,KACnD;AAEJ;AAUA,SAAS,iBAAiB,EAAE,MAAM,GAA0C;AAC1E,QAAM,WAAW,MAAM;AACvB,QAAM,CAAC,QAAQ,SAAS,IAAIG,UAAS,EAAE;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AAErC,QAAM,EAAE,OAAO,UAAU,WAAW,UAAU,OAAO,IAAI;AAAA,IACvD,oBAAoB,KAAK;AAAA,IACzB,OAAO,SAAS;AACd,YAAM,WAAW,MAAM,gBAAgB,CAAC,QAAQ,IAAI,gBAAgB;AAAA,QAClE,GAAI,QAAQ,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,QACjC;AAAA,QACA,UAAU;AAAA,MACZ,CAAC,CAAC;AACF,UAAI,CAAC,SAAS,SAAS;AACrB,eAAO,EAAE,IAAI,OAAO,SAAS,SAAS,SAAS,KAAK,KAAK,EAAE,qBAAqB,EAAE;AAAA,MACpF;AACA,YAAM,WAAW,sBAAsB,SAAS,IAAI;AACpD,UAAI,CAAC,SAAS,GAAI,QAAO,EAAE,IAAI,OAAO,SAAS,EAAE,qBAAqB,EAAE;AAExE,YAAM,EAAE,QAAQ,IAAI,SAAS;AAC7B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,OAAO,QAAQ,MAAM,IAAI,CAAC,UAAU,EAAE,MAAM,UAAU,QAAQ,SAAS,EAAE;AAAA,UACzE,MAAM,QAAQ;AAAA,UACd,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UACJ,gBAAAF,MAAC,SAAI,WAAU,sEACb;AAAA,oBAAAD,MAAC,uBAAqB,YAAE,uBAAuB,GAAE;AAAA,IACjD,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,YAAU;AAAA,QACV,WAAU;AAAA,QACV,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AAGrB,mBAAS,OAAO,KAAK,CAAC;AAAA,QACxB;AAAA,QAEA;AAAA,0BAAAD,MAAC,WAAM,SAAS,UAAU,WAAU,eACjC,YAAE,iBAAiB,GACtB;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,UAAU,UAAU,MAAM,OAAO,KAAK;AAAA,cACjD,WAAW,GAAGE,MAAK;AAAA;AAAA,UACrB;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,cAAY,EAAE,iBAAiB;AAAA,cAE/B,0BAAAA,MAAC,cAAW,WAAU,mBAAkB;AAAA;AAAA,UAC1C;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAGF,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,uBAAoB,OAAO,EAAE,kBAAkB,GAAG,GACrD;AAAA,OACF;AAAA,EAEJ;AACA,MAAI,MAAM,WAAW,SAAS;AAC5B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,GACzD;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,EAAE,MAAM,IAAI;AAElB,SACE,gBAAAC,MAAC,aACE;AAAA;AAAA,IACA,MAAM,MAAM,WAAW,IACtB,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,4BAA4B;AAAA,QACrC,MAAM,EAAE,2BAA2B;AAAA;AAAA,IACrC,GACF,IAEA,gBAAAA,MAAC,QAAG,WAAU,0BACX,gBAAM,MAAM,IAAI,CAAC,QAChB,gBAAAA,MAAC,QACC,0BAAAA,MAAC,kBAAe,MAAM,IAAI,MAAM,UAAU,IAAI,UAAU,OAAc,KAD/D,IAAI,KAAK,UAElB,CACD,GACH;AAAA,IAEF,gBAAAA,MAAC,aAAU,OAAc,MAAM,UAAU,OAAO,WAAW,QAAQ,UAAU;AAAA,KAC/E;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAC,MAAC,eAAY,WAAU,WACrB;AAAA,oBAAAA,MAAC,SAAI,WAAU,qDACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,0BACb;AAAA,wBAAAD,MAAC,OAAE,WAAU,iDAAiD,eAAK,OAAM;AAAA,QACzE,gBAAAC,MAAC,OAAE,WAAU,0CACV;AAAA,8BAAoB,KAAK,YAAY,QAAQ;AAAA,UAC7C,KAAK,0BAA0B,SAAM,EAAE,wBAAwB,CAAC,KAAK;AAAA,UACrE,KAAK,kBAAkB,SAAM,EAAE,yBAAyB,CAAC,KAAK;AAAA,WACjE;AAAA,SACF;AAAA,MACC,KAAK,SAAS,WAAW,IACxB,KAAK,YACH,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM,MAAM;AAAA,YACnB,YAAY,KAAK;AAAA,YACjB,UAAU;AAAA,YACV,OAAO,KAAK;AAAA,YACZ,eAAe;AAAA,UACjB,CAAC;AAAA,UAEA,YAAE,cAAc;AAAA;AAAA,MACnB,IAEA,gBAAAA,MAAC,UAAK,WAAU,iCAAiC,YAAE,oBAAoB,GAAE,IAEzE;AAAA,OACN;AAAA,IAEC,KAAK,SAAS,SAAS,IACtB,gBAAAA,MAAC,QAAG,WAAU,gDACX,eAAK,SAAS,IAAI,CAAC,YAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MAJK,QAAQ;AAAA,IAKf,CACD,GACH,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE,gBAAAC,MAAC,QAAG,WAAU,8GACZ;AAAA,oBAAAA,MAAC,SAAI,WAAU,0BACb;AAAA,sBAAAD,MAAC,OAAE,WAAU,+BAA+B,kBAAQ,OAAM;AAAA,MAC1D,gBAAAC,MAAC,OAAE,WAAU,0CACV;AAAA,4BAAoB,QAAQ,YAAY,QAAQ;AAAA,QAChD,QAAQ,kBAAkB,SAAM,EAAE,yBAAyB,CAAC,KAAK;AAAA,SACpE;AAAA,OACF;AAAA,IAGC,KAAK,aAAa,QAAQ,YACzB,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,MAAM;AAAA,UACnB,YAAY,KAAK;AAAA,UACjB,YAAY,QAAQ;AAAA,UACpB,UAAU;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,eAAe,QAAQ;AAAA,QACzB,CAAC;AAAA,QAEA,YAAE,cAAc;AAAA;AAAA,IACnB,IAEA,gBAAAA,MAAC,UAAK,WAAU,iCAAiC,YAAE,oBAAoB,GAAE;AAAA,KAE7E;AAEJ;AAaA,SAAS,kBAAkB,KAAqB;AAC9C,QAAM,QAAQ,KAAK,MAAM,OAAO,GAAG,CAAC;AACpC,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,6BAA6B;AAClE,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,6BAA6B,KAAK;AACpD;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,CAAC,MAAM,OAAO,IAAIG,UAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,QAAM,QAAkC,OAAO,IAAI,CAAC,EAAE,YAAY,YAAY,SAAS,OAAO;AAAA,IAC5F;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE;AACF,QAAM,iBAAiB,WAAW,QAAQ,mBAAmB,OAAO,WAAW,KAAK;AAEpF,QAAM,QAAQ,YAAY;AACxB,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,mBAAmB,KAAK,CAAC;AAC3E,YAAQ,KAAK;AAEb,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,qBAAqB,CAAC;AAC3D;AAAA,IACF;AACA,UAAM,WAAW,oBAAoB,OAAO,IAAI;AAChD,QAAI,CAAC,SAAS,IAAI;AAChB,eAAS,EAAE,qBAAqB,CAAC;AACjC;AAAA,IACF;AACA,aAAS,EAAE,WAAW,kBAAkB,KAAK,GAAG,OAAO,SAAS,KAAK,CAAC;AAAA,EACxE;AAEA,SACE,gBAAAF,MAAC,aACC;AAAA,oBAAAD,MAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAAA,IAChD,gBAAAC,MAAC,eAAY,WAAU,oBACpB;AAAA,aAAO,WAAW,IACjB,gBAAAD,MAAC,OAAE,WAAU,iCAAiC,YAAE,sBAAsB,GAAE,IAExE,gBAAAC,MAAA,YACE;AAAA,wBAAAD,MAAC,QAAG,WAAU,iBACX,iBAAO,IAAI,CAAC,SACX,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YAEV;AAAA,8BAAAA,MAAC,SAAI,WAAU,0BACb;AAAA,gCAAAD,MAAC,OAAE,WAAU,+CAA+C,eAAK,OAAM;AAAA,gBACtE,KAAK,gBACJ,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,eAAK,eAAc,IACxE;AAAA,iBACN;AAAA,cACA,gBAAAC,MAAC,WAAM,WAAU,qEACd;AAAA,kBAAE,mBAAmB;AAAA,gBACtB,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,KAAK;AAAA,oBACL,KAAK;AAAA,oBACL,MAAM;AAAA,oBACN,OAAO,KAAK;AAAA,oBACZ,UAAU;AAAA,oBACV,WAAW,GAAGE,MAAK;AAAA,oBACnB,UAAU,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC,UAC9C,UAAU,OACN,EAAE,GAAG,OAAO,UAAU,kBAAkB,MAAM,OAAO,KAAK,EAAE,IAC5D,KACL,CAAC;AAAA;AAAA,gBACJ;AAAA,iBACF;AAAA,cACA,gBAAAF;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UAAU;AAAA,kBACV,WAAU;AAAA,kBACV,SAAS,MAAM,eAAe,OAAO,OAAO,CAAC,UAAU,UAAU,IAAI,CAAC;AAAA,kBAErE,YAAE,kBAAkB;AAAA;AAAA,cACvB;AAAA;AAAA;AAAA,UAjCK,GAAG,KAAK,UAAU,IAAI,KAAK,cAAc,EAAE;AAAA,QAkClD,CACD,GACH;AAAA,QAEA,gBAAAC,MAAC,SAAI,WAAU,kCAQZ;AAAA,4BAAkB,SACjB,gBAAAA,MAAC,QAAG,WAAU,iBACZ;AAAA,4BAAAA,MAAC,SAAI,WAAU,4EACb;AAAA,8BAAAD,MAAC,QAAG,WAAU,kBAAkB,YAAE,iBAAiB,GAAE;AAAA,cACrD,gBAAAA,MAAC,QAAG,WAAU,oCACX,8BAAoB,OAAO,MAAM,UAAU,OAAO,MAAM,QAAQ,GACnE;AAAA,eACF;AAAA,YACC,OAAO,OAAO,MAAM,qBAAqB,IAAI,IAC5C,gBAAAC,MAAC,SAAI,WAAU,4EACb;AAAA,8BAAAD,MAAC,QAAG,WAAU,oBAAoB,YAAE,iBAAiB,GAAE;AAAA,cACvD,gBAAAA,MAAC,QAAG,WAAU,qDACX;AAAA,gBACC,OAAO,MAAM;AAAA,gBACb,OAAO,MAAM;AAAA,cACf,GACF;AAAA,eACF,IACE;AAAA,YACJ,gBAAAC,MAAC,SAAI,WAAU,mFACb;AAAA,8BAAAD,MAAC,QAAG,WAAU,oCAAoC,YAAE,cAAc,GAAE;AAAA,cACpE,gBAAAA,MAAC,QAAG,WAAU,kDACX,8BAAoB,OAAO,MAAM,OAAO,OAAO,MAAM,QAAQ,GAChE;AAAA,eACF;AAAA,aACF,IAEA,gBAAAA,MAAC,OAAE,WAAU,iCAAiC,YAAE,2BAA2B,GAAE;AAAA,UAG/E,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU;AAAA,cACV,aAAW,QAAQ;AAAA,cACnB,WAAU;AAAA,cACV,SAAS,MAAM,KAAK,MAAM;AAAA,cAEzB;AAAA,uBAAO,gBAAAD,MAAC,eAAY,WAAU,cAAa,IAAK;AAAA,gBAChD,EAAE,gBAAgB;AAAA;AAAA;AAAA,UACrB;AAAA,UAOA,gBAAAA,MAAC,OAAE,WAAU,6GACV,YAAE,yBAAyB,GAC9B;AAAA,WACF;AAAA,SACF;AAAA,MAED,QAAQ,gBAAAA,MAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,OACnD;AAAA,KACF;AAEJ;AAIA,SAAS,kBAAkB;AACzB,QAAM,CAAC,UAAU,WAAW,IAAIG,UAAwB,IAAI;AAC5D,QAAM,EAAE,OAAO,UAAU,WAAW,UAAU,OAAO,IAAI;AAAA,IACvD;AAAA,IACA,OAAO,SAAS;AACd,YAAM,WAAW,MAAM,gBAAgB,CAAC,QAAQ,IAAI,eAAe;AAAA,QACjE;AAAA,QACA,UAAU;AAAA,MACZ,CAAC,CAAC;AACF,UAAI,CAAC,SAAS,SAAS;AACrB,eAAO,EAAE,IAAI,OAAO,SAAS,SAAS,SAAS,KAAK,KAAK,EAAE,qBAAqB,EAAE;AAAA,MACpF;AACA,YAAM,WAAW,qBAAqB,SAAS,IAAI;AACnD,UAAI,CAAC,SAAS,GAAI,QAAO,EAAE,IAAI,OAAO,SAAS,EAAE,qBAAqB,EAAE;AAExE,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,OAAO,SAAS,KAAK;AAAA,UACrB,MAAM,SAAS,KAAK;AAAA,UACpB,SAAS,SAAS,KAAK;AAAA,UACvB,OAAO,SAAS,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa,MAAM;AACrB,WAAO,gBAAAH,MAAC,wBAAqB,QAAQ,UAAU,QAAQ,MAAM,YAAY,IAAI,GAAG;AAAA,EAClF;AAEA,QAAM,UAAU,gBAAAA,MAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAEhE,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,uBAAoB,OAAO,EAAE,gBAAgB,GAAG,GACnD;AAAA,OACF;AAAA,EAEJ;AACA,MAAI,MAAM,WAAW,SAAS;AAC5B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,GACzD;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,EAAE,MAAM,IAAI;AAElB,SACE,gBAAAC,MAAC,aACE;AAAA;AAAA,IACA,MAAM,MAAM,WAAW,IACtB,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,2BAA2B;AAAA,QACpC,MAAM,EAAE,0BAA0B;AAAA;AAAA,IACpC,GACF,IAEA,gBAAAA,MAAC,QAAG,WAAU,0BACX,gBAAM,MAAM,IAAI,CAAC,UAChB,gBAAAA,MAAC,QACC,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,YAAY,MAAM,MAAM;AAAA,QACvC,WAAU;AAAA,QAEV;AAAA,0BAAAA,MAAC,SAAI,WAAU,0BACb;AAAA,4BAAAD,MAAC,OAAE,WAAU,iDACV,YAAE,wBAAwB,EAAE,IAAI,MAAM,OAAO,CAAC,GACjD;AAAA,YACA,gBAAAC,MAAC,OAAE,WAAU,0CACV;AAAA,gCAAkB,MAAM,UAAU;AAAA,cAClC;AAAA,cACA,EAAE,yBAAyB,EAAE,OAAO,MAAM,WAAW,CAAC;AAAA,eACzD;AAAA,aACF;AAAA,UACA,gBAAAD,MAAC,UAAK,WAAU,qDACb,8BAAoB,MAAM,OAAO,MAAM,QAAQ,GAClD;AAAA,UACA,gBAAAA,MAAC,cAAW,QAAQ,MAAM,QAAQ;AAAA;AAAA;AAAA,IACpC,KApBO,MAAM,MAqBf,CACD,GACH;AAAA,IAEF,gBAAAA,MAAC,aAAU,OAAc,MAAM,UAAU,OAAO,WAAW,QAAQ,UAAU;AAAA,KAC/E;AAEJ;AAEA,SAAS,qBAAqB,EAAE,QAAQ,OAAO,GAA2C;AACxF,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,kBAAkB,MAAM,IAAI,MACvE,gBAAgB,CAAC,QAAQ,IAAI,cAAc,MAAM,CAAC,CAAC;AAErD,QAAM,OAAO,gBAAAA,MAAC,qBAAkB,SAAS,QAAQ,OAAO,EAAE,kBAAkB,GAAG;AAE/E,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,uBAAoB,OAAO,EAAE,mBAAmB,GAAG,GACtD;AAAA,OACF;AAAA,EAEJ;AACA,MAAI,MAAM,WAAW,SAAS;AAC5B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,GACzD;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,WAAW,0BAA0B,MAAM,IAAI;AACrD,MAAI,CAAC,SAAS,IAAI;AAChB,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,EAAE,qBAAqB,GAAG,SAAS,QAAQ,GACpE;AAAA,OACF;AAAA,EAEJ;AACA,QAAM,QAAQ,SAAS;AAEvB,SACE,gBAAAC,MAAC,aACE;AAAA;AAAA,IACD,gBAAAA,MAAC,SAAI,WAAU,iFACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,eACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,+DACX,YAAE,sBAAsB,EAAE,IAAI,MAAM,OAAO,CAAC,GAC/C;AAAA,QACA,gBAAAA,MAAC,OAAE,WAAU,0CACV,gCAAsB,MAAM,UAAU,GACzC;AAAA,SACF;AAAA,MACA,gBAAAA,MAAC,cAAW,QAAQ,MAAM,QAAQ;AAAA,OACpC;AAAA,IAEA,gBAAAC,MAAC,eAAY,WAAU,oBACrB;AAAA,sBAAAA,MAAC,SAAI,WAAU,4EACb;AAAA,wBAAAD,MAAC,UAAK,WAAU,kBAAkB,YAAE,cAAc,GAAE;AAAA,QACpD,gBAAAA,MAAC,UAAK,WAAU,sCACb,8BAAoB,MAAM,OAAO,MAAM,QAAQ,GAClD;AAAA,SACF;AAAA,MACC,MAAM,oBAAoB,OACzB,gBAAAC,MAAC,SAAI,WAAU,qFACb;AAAA,wBAAAD,MAAC,UAAK,WAAU,kBAAkB,YAAE,mBAAmB,GAAE;AAAA,QACzD,gBAAAA,MAAC,UAAK,WAAU,sCACb,8BAAoB,MAAM,iBAAiB,MAAM,QAAQ,GAC5D;AAAA,SACF,IACE;AAAA,MACJ,gBAAAC,MAAC,SAAI,WAAU,qFACb;AAAA,wBAAAD,MAAC,UAAK,WAAU,kBAAkB,YAAE,eAAe,GAAE;AAAA,QACrD,gBAAAC,MAAC,UAAK,WAAU,mBACb;AAAA,gBAAM;AAAA,UACN;AAAA,UACA,GAAG,MAAM,qBAAqB;AAAA,WACjC;AAAA,SACF;AAAA,OACF;AAAA,IAEA,gBAAAD,MAAC,QAAG,WAAU,0BACX,gBAAM,MAAM,IAAI,CAAC,MAAM,UACtB,gBAAAA,MAAC,QACC,0BAAAA,MAAC,aAAU,MAAY,UAAU,MAAM,UAAU,KAD1C,GAAG,KAAK,cAAc,EAAE,IAAI,KAAK,cAAc,EAAE,IAAI,KAAK,EAEnE,CACD,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,UAAU,EAAE,MAAM,SAAS,GAAkD;AACpF,SACE,gBAAAC,MAAC,eAAY,WAAU,WACrB;AAAA,oBAAAA,MAAC,SAAI,WAAU,wEACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,eACb;AAAA,wBAAAD,MAAC,OAAE,WAAU,iDAAiD,eAAK,eAAc;AAAA,QAChF,KAAK,gBACJ,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,eAAK,eAAc,IACxE;AAAA,SACN;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,qDACV,8BAAoB,KAAK,OAAO,QAAQ,GAC3C;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,OAAE,WAAU,0CACV;AAAA,QAAE,yBAAyB,EAAE,OAAO,KAAK,SAAS,CAAC;AAAA,MACnD;AAAA,MACA,KAAK,YAAY,EAAE,oBAAoB,IAAI,EAAE,kBAAkB;AAAA,MAC/D,KAAK,iBAAiB,OAAO,SAAM,sBAAsB,KAAK,YAAY,CAAC,KAAK;AAAA,OACnF;AAAA,IAEC,KAAK,QAAQ,SAAS,IACrB,gBAAAA,MAAC,SAAI,WAAU,gDACb;AAAA,sBAAAD,MAAC,OAAE,WAAU,mDAAmD,YAAE,kBAAkB,GAAE;AAAA,MACrF,KAAK,QAAQ,IAAI,CAAC,WACjB,gBAAAC,MAAC,SAAiB,WAAU,uCAC1B;AAAA,wBAAAD,MAAC,OAAE,WAAU,oEAAoE,kBAAO;AAAA,QACxF,gBAAAA,MAAC,cAAW,OAAO,QAAQ;AAAA,WAFnB,MAGV,CACD;AAAA,OACH,IACE;AAAA,KACN;AAEJ;AAIA,SAAS,kBAAkB;AACzB,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,qBAAqB,MAChE,gBAAgB,CAAC,QAAQ,IAAI,gBAAgB,CAAC,CAAC;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAIG,UAAwB,IAAI;AAEtD,QAAM,UAAU,gBAAAH,MAAC,uBAAqB,YAAE,uBAAuB,GAAE;AAOjE,QAAM,YACJ,gBAAAA,MAAC,OAAE,WAAU,6GACV,YAAE,wBAAwB,GAC7B;AAGF,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,kBAAkB,GAAG,GAC9D;AAAA,MACC;AAAA,OACH;AAAA,EAEJ;AACA,MAAI,MAAM,WAAW,SAAS;AAC5B,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,GACzD;AAAA,MACC;AAAA,OACH;AAAA,EAEJ;AAEA,QAAM,WAAW,sBAAsB,MAAM,IAAI;AACjD,MAAI,CAAC,SAAS,IAAI;AAChB,WACE,gBAAAC,MAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,EAAE,qBAAqB,GAAG,SAAS,QAAQ,GACpE;AAAA,MACC;AAAA,OACH;AAAA,EAEJ;AACA,QAAM,OAAO,SAAS;AAEtB,SACE,gBAAAC,MAAC,aACE;AAAA;AAAA,IACA,QACC,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,OAAO,GAChC,IACE;AAAA,IAEH,KAAK,WAAW,IACf,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,YAAE,uBAAuB,GAAE,IAElF,gBAAAA,MAAC,QAAG,WAAU,0BACX,eAAK,IAAI,CAAC,QACT,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAEV;AAAA,0BAAAA,MAAC,SAAI,WAAU,0BACb;AAAA,4BAAAA,MAAC,OAAE,WAAU,iDACV;AAAA,kBAAI;AAAA,cACJ;AAAA,cACD,gBAAAD,MAAC,UAAK,WAAU,iBAAiB,cAAI,WAAU;AAAA,eACjD;AAAA,YACA,gBAAAA,MAAC,OAAE,WAAU,0CACV,cAAI,eACD,EAAE,qBAAqB;AAAA,cACrB,MAAM,sBAAsB,IAAI,YAAY;AAAA,YAC9C,CAAC,IACD,EAAE,oBAAoB,GAC5B;AAAA,aACF;AAAA,UAUC,IAAI,eAAe,OAAO,gBAAAA,MAAC,cAAW,QAAO,WAAU,IAAK;AAAA;AAAA;AAAA,MA1BxD,IAAI;AAAA,IA2BX,CACD,GACH;AAAA,IAGD;AAAA,KACH;AAEJ;;;ACj0CA,SAAS,YAAAO,iBAAgC;AACzC,SAAS,QAAAC,aAAY;;;ACHd,SAAS,qBAAqB,SAAgD;AACnF,SAAO,SAAS,kBAAkB;AACpC;AAEO,SAAS,sBAAsB,SAAgD;AACpF,SAAO,SAAS,mBAAmB;AACrC;AAUA,IAAM,mBAAgF;AAAA,EACpF,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,sBAAsB,MAAiD;AACrF,SAAO,iBAAiB,IAAI;AAC9B;AASO,SAAS,aAAa,QAAwB;AACnD,SAAO,SAAS,IAAI,IAAI,MAAM,KAAK,OAAO,MAAM;AAClD;AAyBO,SAAS,YAAY,SAA0C;AACpE,QAAM,WAAW,QAAQ;AACzB,MAAI,aAAa,KAAM,QAAO,EAAE,MAAM,SAAS;AAC/C,MAAI,SAAS,0BAA0B,EAAG,QAAO,EAAE,MAAM,SAAS;AAElE,QAAM,gBAAgB,KAAK,IAAI,GAAG,SAAS,iBAAiB;AAC5D,QAAM,UAAU,qBAAqB,QAAQ,OAAO;AACpD,MAAI,UAAU,cAAe,QAAO,EAAE,MAAM,iBAAiB,SAAS,cAAc;AAEpF,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,eAAe,SAAS;AAAA,EAC1B;AACF;AAqBO,SAAS,cACd,OACA,OACe;AACf,QAAM,QAAQ,MAAM,KAAK;AACzB,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,MAAM,QAAQ;AAC/C,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAG,QAAO,EAAE,MAAM,eAAe;AAExD,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,EAAG,QAAO,EAAE,MAAM,eAAe;AAC/E,MAAI,SAAS,MAAM,cAAe,QAAO,EAAE,MAAM,iBAAiB,eAAe,MAAM,cAAc;AACrG,MAAI,SAAS,MAAM,QAAS,QAAO,EAAE,MAAM,iBAAiB,SAAS,MAAM,QAAQ;AAEnF,QAAM,SAAS,kBAAkB,QAAQ,MAAM,aAAa;AAK5D,MAAI,EAAE,OAAO,MAAM,IAAI,GAAI,QAAO,EAAE,MAAM,aAAa;AAEvD,SAAO,EAAE,MAAM,SAAS,QAAQ,OAAO;AACzC;AAYO,SAAS,kBAAkB,QAAgB,eAA+B;AAC/E,UAAQ,SAAS,eAAe,QAAQ,CAAC;AAC3C;AASO,SAAS,YAAY,OAA8B;AACxD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,cAAc,gCAAgC,KAAK,OAAO;AAChE,QAAM,cAAc,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG;AACjE,QAAM,aAAa,eAAe,CAAC,cAAc,UAAU,GAAG,QAAQ,QAAQ,KAAK,GAAG,CAAC;AACvF,QAAM,SAAS,KAAK,MAAM,UAAU;AACpC,SAAO,OAAO,SAAS,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI;AACtD;AAKO,SAAS,iBAAyB;AACvC,MAAI,OAAO,OAAO,eAAe,WAAY,QAAO,OAAO,WAAW;AACtE,QAAM,QAAQ,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC;AACvD,SAAO,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAChF;AAWA,eAAsB,2BAA2B,MAAc,QAAiC;AAM9F,MAAI,CAAC,WAAW,QAAQ,OAAQ,OAAM,IAAI,MAAM,uDAAuD;AACvG,QAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI,YAAY,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;AAClG,QAAM,QAAQ,IAAI,WAAW,MAAM,EAAE,MAAM,GAAG,EAAE;AAGhD,QAAM,CAAC,IAAK,MAAM,CAAC,IAAI,KAAQ;AAC/B,QAAM,CAAC,IAAK,MAAM,CAAC,IAAI,KAAQ;AAC/B,QAAM,MAAM,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACnF,SAAO,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;AAC1G;AAcA,IAAI,aAAa;AACjB,IAAM,oBAAoB,oBAAI,IAAoB;AAOlD,eAAsB,oBAAoB,QAAiC;AACzE,QAAM,UAAU,kBAAkB,IAAI,MAAM;AAC5C,MAAI,YAAY,OAAW,QAAO;AAClC,MAAI,eAAe,GAAI,cAAa,eAAe;AACnD,QAAM,MAAM,MAAM,2BAA2B,YAAY,MAAM;AAC/D,oBAAkB,IAAI,QAAQ,GAAG;AACjC,SAAO;AACT;AAOO,SAAS,iBAAiB,QAAsB;AACrD,oBAAkB,OAAO,MAAM;AAC/B,eAAa;AACf;;;ACxNO,SAAS,cACd,UACgB;AAChB,QAAM,UAA0B,CAAC;AACjC,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,SAAS,YAAY,KAAK,WAAW,YAAa;AAC3D,QAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,YAAY,WAAW,EAAG;AAC3E,YAAQ,KAAK,EAAE,GAAG,MAAM,aAAa,KAAK,YAAY,CAAC;AAAA,EACzD;AACA,SAAO;AACT;AAmBO,SAAS,YAAY,MAA8C;AACxE,MAAI,KAAK,SAAS,iBAAiB;AACjC,WAAO,KAAK,UAAU,KAAK,WACvB,EAAE,MAAM,uBAAuB,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,IAC5E,EAAE,MAAM,eAAe;AAAA,EAC7B;AAEA,MAAI,KAAK,SAAS,UAAU;AAC1B,QAAI,KAAK,YAAa,QAAO,EAAE,MAAM,eAAe,MAAM,KAAK,YAAY;AAC3E,QAAI,KAAK,OAAQ,QAAO,EAAE,MAAM,kBAAkB,SAAS,KAAK,OAAO;AACvE,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAEA,SAAO,EAAE,MAAM,QAAQ;AACzB;AAEA,IAAM,cAAgD;AAAA,EACpD,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,0BAA0B;AAC5B;AAGO,SAAS,gBAAgB,QAAwB;AACtD,SAAO,YAAY,MAAM,KAAK;AAChC;AAEA,IAAM,oBAAsD;AAAA,EAC1D,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAGO,SAAS,gBAAgB,QAA+B;AAC7D,SAAO,kBAAkB,MAAM,KAAK;AACtC;AAGO,SAAS,mBAAmB,OAAqB;AACtD,SAAO,IAAI,KAAK,QAAQ,GAAI;AAC9B;AAGO,SAAS,2BAA2B,OAAmC;AAC5E,SAAO,UAAU,OAAO,OAAO,mBAAmB,KAAK;AACzD;;;AF7BW,gBAAAC,OAiBL,QAAAC,cAjBK;AATX,IAAMC,SACJ;AAEK,SAAS,iBAAiB;AAC/B,QAAM,EAAE,OAAO,OAAO,IAAI,oBAAoB;AAC9C,QAAM,UAAU,mBAAmB,WAAW,MAC5C,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAE9D,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO,gBAAAF,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,iBAAiB,GAAG;AAAA,EACpE;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,QAAM,EAAE,SAAS,SAAS,IAAI,MAAM,KAAK;AACzC,QAAM,UAAU,cAAc,QAAQ;AAItC,QAAM,aAAa,MAAM;AAEzB,SACE,gBAAAC,OAAC,SAAI,WAAU,iBACZ;AAAA,iBAAa,gBAAAD,MAAC,gBAAa,SAAS,YAAY,SAAS,QAAQ,IAAK;AAAA,IACvE,gBAAAC,OAAC,SAAI,WAAU,yDACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,mBAAmB;AAAA,UAC5B,QAAQ,QAAQ;AAAA,UAChB,UAAU,QAAQ;AAAA;AAAA,MACpB;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,iBAAiB;AAAA,UAC1B,QAAQ,QAAQ;AAAA,UAChB,UAAU,QAAQ;AAAA;AAAA,MACpB;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,kBAAkB;AAAA,UAC3B,QAAQ,QAAQ;AAAA,UAChB,UAAU,QAAQ;AAAA;AAAA,MACpB;AAAA,OACF;AAAA,IAcA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,UAAU,MAAM,KAAK,KAAK;AAAA,QAC1B,YAAY;AAAA;AAAA,IACd;AAAA,IAQC,QAAQ,SACP,gBAAAC,OAAC,aACC;AAAA,sBAAAD,MAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAAA,MAChD,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,YAAE,qBAAqB,GAAE;AAAA,MAChF,gBAAAA,MAAC,QAAG,WAAU,0BACX,kBAAQ,IAAI,CAAC,WACZ,gBAAAA,MAAC,QACC,0BAAAA,MAAC,cAAW,QAAgB,KADrB,OAAO,EAEhB,CACD,GACH;AAAA,OACF,IACE;AAAA,IAEJ,gBAAAC,OAAC,aACC;AAAA,sBAAAD,MAAC,uBAAqB,YAAE,uBAAuB,GAAE;AAAA,MACjD,gBAAAA,MAAC,SAAI,WAAU,YACZ,mBAAS,WAAW,IACnB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,oBAAoB;AAAA,UAC7B,MAAM,EAAE,mBAAmB;AAAA,UAC3B,QACE,gBAAAA;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,IAAG;AAAA,cACH,WAAU;AAAA,cAET,YAAE,oBAAoB;AAAA;AAAA,UACzB;AAAA;AAAA,MAEJ,IAEA,gBAAAH,MAAC,QAAG,WAAU,iBACX,mBAAS,IAAI,CAAC,SACb,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA,4BAAAD,MAAC,UAAK,WAAU,sHACd,0BAAAA,MAAC,YAAS,WAAU,kCAAiC,GACvD;AAAA,YACA,gBAAAC,OAAC,SAAI,WAAU,0BACb;AAAA,8BAAAD,MAAC,OAAE,WAAU,iDAAiD,0BAAgB,IAAI,GAAE;AAAA,cACpF,gBAAAC,OAAC,OAAE,WAAU,uDACV;AAAA,kBAAE,gBAAgB,KAAK,MAAM,CAAC;AAAA,gBAC9B;AAAA,gBACA,kBAAkB,mBAAmB,KAAK,UAAU,CAAC;AAAA,iBACxD;AAAA,eACF;AAAA,YACA,gBAAAD,MAAC,UAAK,WAAU,8DACb,2BAAiB,KAAK,MAAM,GAC/B;AAAA;AAAA;AAAA,QAhBK,KAAK;AAAA,MAiBZ,CACD,GACH,GAEJ;AAAA,OACF;AAAA,KACF;AAEJ;AAiBA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,CAAC,QAAQ,SAAS,IAAII,UAAwB,IAAI;AAWxD,QAAM,UAAU,MAAM,WAAW,UAAU,MAAM,OAAO;AAExD,MAAI,YAAY,MAAM;AACpB,WAAO,MAAM,WAAW,UACtB,gBAAAJ,MAAC,iBACC,0BAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,GACzD,IACE;AAAA,EACN;AAEA,MAAI,CAAC,QAAQ,QAAS,QAAO;AAQ7B,QAAM,QAAQ,MAAM,WAAW,UAAU,MAAM,eAAe;AAE9D,QAAM,QAAQ,YAAY,OAAO;AAEjC,SACE,gBAAAC,OAAC,iBACC;AAAA,oBAAAA,OAAC,SAAI,WAAW,sCAAsC,QAAQ,UAAU,uBAAuB,EAAE,IAC/F;AAAA,sBAAAD,MAAC,cAAW,OAAO,EAAE,uBAAuB,GAAG,QAAQ,qBAAqB,QAAQ,OAAO,GAAG;AAAA,MAC7F,QAAQ,UACP,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,wBAAwB;AAAA,UACjC,QAAQ,sBAAsB,QAAQ,OAAO;AAAA;AAAA,MAC/C,IACE;AAAA,OACN;AAAA,IAKC,QAAQ,YAAY,OACnB,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,YAAE,wBAAwB,GAAE,IACjF;AAAA,IAEH,QAAQ,gBAAAA,MAAC,gBAAa,SAAS,OAAO,SAAS,QAAQ,IAAK;AAAA,IAE5D,SAAS,gBAAAA,MAAC,iBAAc,SAAS,QAAQ,IAAK;AAAA,IAK9C,MAAM,SAAS,mBAAmB,QAAQ,YAAY,OACrD,gBAAAA,MAAC,OAAE,WAAU,0CACV,YAAE,yBAAyB,EAAE,QAAQ,MAAM,cAAc,CAAC,GAC7D,IACE;AAAA,IAEH,MAAM,SAAS,YACd,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,YAAY,CAAC,YAAY;AACvB,oBAAU,OAAO;AACjB,iBAAO;AACP,qBAAW;AAAA,QACb;AAAA;AAAA,IACF,IACE;AAAA,IAEH,QAAQ,aAAa,SACpB,gBAAAA,MAAC,kBAAe,cAAc,QAAQ,cAAc,IAClD;AAAA,KACN;AAEJ;AAEA,SAAS,cAAc,EAAE,SAAS,GAA4B;AAC5D,SACE,gBAAAC,OAAC,aACC;AAAA,oBAAAD,MAAC,uBAAqB,YAAE,qBAAqB,GAAE;AAAA,IAC/C,gBAAAA,MAAC,SAAI,WAAU,YAAY,UAAS;AAAA,KACtC;AAEJ;AAEA,SAAS,WAAW,EAAE,OAAO,OAAO,GAAsC;AACxE,SACE,gBAAAC,OAAC,eAAY,WAAU,WACrB;AAAA,oBAAAD,MAAC,OAAE,WAAU,8CAA8C,kBAAO;AAAA,IAClE,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,iBAAM;AAAA,KAC/D;AAEJ;AAWA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,CAAC,OAAO,QAAQ,IAAII,UAAS,EAAE;AACrC,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAmBtD,QAAM,UAAU,cAAc,OAAO,KAAK;AAE1C,QAAM,SAAS,CAAC,UAAkB;AAChC,aAAS,KAAK;AACd,kBAAc,KAAK;AACnB,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,SAAS,YAAY;AACzB,QAAI,QAAQ,SAAS,QAAS;AAE9B,kBAAc,IAAI;AAClB,aAAS,IAAI;AACb,QAAI;AAKF,YAAM,iBAAiB,MAAM,oBAAoB,QAAQ,MAAM;AAC/D,YAAM,WAAW,MAAM,gBAAgB,CAAC,QAAQ,IAAI,oBAAoB;AAAA,QACtE,QAAQ,QAAQ;AAAA,QAChB;AAAA,MACF,CAAC,CAAC;AAEF,UAAI,CAAC,SAAS,WAAW,SAAS,SAAS,QAAW;AAIpD,iBAAS,SAAS,SAAS,KAAK,KAAK,EAAE,sBAAsB,CAAC;AAC9D;AAAA,MACF;AAIA,YAAM,WAAW,SAAS;AAC1B,eAAS,EAAE;AACX,oBAAc,KAAK;AACnB,uBAAiB,QAAQ,MAAM;AAC/B,iBAAW,EAAE,sBAAsB;AAAA,QACjC,QAAQ,oBAAoB,SAAS,eAAe,SAAS,QAAQ;AAAA,MACvE,CAAC,CAAC;AAAA,IACJ,QAAQ;AAIN,eAAS,EAAE,sBAAsB,CAAC;AAAA,IACpC,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,SACE,gBAAAH,OAAC,eAAY,WAAU,oBACrB;AAAA,oBAAAD,MAAC,OAAE,WAAU,sCAAsC,YAAE,qBAAqB,GAAE;AAAA,IAC5E,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,YAAE,oBAAoB,GAAE;AAAA,IAE/E,gBAAAC,OAAC,SAAI,WAAU,8DACb;AAAA,sBAAAD,MAAC,WAAM,SAAQ,kBAAiB,WAAU,eAAe,YAAE,qBAAqB,GAAE;AAAA,MAClF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,WAAU;AAAA,UACV,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,UACX,MAAM;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,UACV,aAAa,OAAO,MAAM,aAAa;AAAA,UACvC,gBAAc,QAAQ,SAAS,kBAAkB,QAAQ,SAAS,eAAe,OAAO;AAAA,UACxF,UAAU,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK;AAAA,UAC9C,WAAW,GAAGE,MAAK;AAAA;AAAA,MACrB;AAAA,MACC,CAAC,aACA,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU,QAAQ,SAAS,WAAW;AAAA,UACtC,WAAU;AAAA,UACV,SAAS,MAAM,cAAc,IAAI;AAAA,UAEhC,YAAE,wBAAwB;AAAA;AAAA,MAC7B,IACE;AAAA,OACN;AAAA,IAEA,gBAAAA,MAAC,qBAAkB,SAAkB,UAAoB;AAAA,IAOxD,cAAc,QAAQ,SAAS,UAC9B,gBAAAC,OAAC,SAAI,WAAU,kCACb;AAAA,sBAAAD,MAAC,OAAE,WAAU,oCACV,YAAE,yBAAyB;AAAA,QAC1B,QAAQ,QAAQ;AAAA,QAChB,QAAQ,oBAAoB,QAAQ,QAAQ,QAAQ;AAAA,MACtD,CAAC,GACH;AAAA,MACA,gBAAAC,OAAC,SAAI,WAAU,8DACb;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,aAAW,cAAc;AAAA,YACzB,WAAU;AAAA,YACV,SAAS,MAAM,KAAK,OAAO;AAAA,YAE1B;AAAA,2BAAa,gBAAAD,MAAC,eAAY,WAAU,kCAAiC,IAAK;AAAA,cAC1E,aAAa,EAAE,uBAAuB,IAAI,EAAE,6BAA6B;AAAA;AAAA;AAAA,QAC5E;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,WAAU;AAAA,YACV,SAAS,MAAM,cAAc,KAAK;AAAA,YAEjC,YAAE,eAAe;AAAA;AAAA,QACpB;AAAA,SACF;AAAA,OACF,IACE;AAAA,IAEH,QAAQ,gBAAAA,MAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,KACnD;AAEJ;AAGA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AACF,GAGG;AACD,MAAI,QAAQ,SAAS,QAAS,QAAO;AAErC,MAAI,QAAQ,SAAS,SAAS;AAC5B,WACE,gBAAAA,MAAC,OAAE,WAAU,4CACV,YAAE,yBAAyB,EAAE,QAAQ,oBAAoB,QAAQ,QAAQ,QAAQ,EAAE,CAAC,GACvF;AAAA,EAEJ;AAIA,QAAM,UAAU,QAAQ,SAAS,kBAAkB,QAAQ,SAAS,eAChE,EAAE,uBAAuB,IACzB,QAAQ,SAAS,kBACf,EAAE,yBAAyB,EAAE,QAAQ,QAAQ,cAAc,CAAC,IAC5D,EAAE,6BAA6B,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAEhE,SAAO,gBAAAA,MAAC,OAAE,MAAK,SAAQ,WAAU,4CAA4C,mBAAQ;AACvF;AAEA,SAAS,eAAe,EAAE,aAAa,GAAyD;AAC9F,SACE,gBAAAC,OAAC,SAAI,WAAU,YACb;AAAA,oBAAAD,MAAC,QAAG,WAAU,oFACX,YAAE,6BAA6B,GAClC;AAAA,IACA,gBAAAA,MAAC,QAAG,WAAU,0BAMX,uBAAa,IAAI,CAAC,OAAO,UACxB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAEV;AAAA,0BAAAD,MAAC,UAAK,WAAU,sHACd,0BAAAA,MAAC,WAAQ,WAAU,kCAAiC,GACtD;AAAA,UACA,gBAAAC,OAAC,SAAI,WAAU,0BACb;AAAA,4BAAAD,MAAC,OAAE,WAAU,iDAAiD,YAAE,sBAAsB,MAAM,IAAI,CAAC,GAAE;AAAA,YACnG,gBAAAC,OAAC,OAAE,WAAU,uDAGV;AAAA,oBAAM,cAAc,GAAG,MAAM,WAAW,WAAQ;AAAA,cAChD,kBAAkB,YAAY,MAAM,UAAU,CAAC;AAAA,eAClD;AAAA,aACF;AAAA,UACA,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,kEACT,MAAM,SAAS,IAAI,qBAAqB,gBAC1C;AAAA,cAEC,uBAAa,MAAM,MAAM;AAAA;AAAA,UAC5B;AAAA;AAAA;AAAA,MArBK,GAAG,MAAM,UAAU,IAAI,KAAK;AAAA,IAsBnC,CACD,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAC,OAAC,eAAY,WAAU,WACrB;AAAA,oBAAAD,MAAC,OAAE,WAAU,8CAA8C,8BAAoB,QAAQ,QAAQ,GAAE;AAAA,IACjG,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,iBAAM;AAAA,KAC/D;AAEJ;AAEA,SAAS,WAAW,EAAE,OAAO,GAA6B;AACxD,QAAM,SAAS,2BAA2B,OAAO,UAAU;AAE3D,SACE,gBAAAC,OAAC,eAAY,WAAU,WACrB;AAAA,oBAAAA,OAAC,SAAI,WAAU,wEACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,kDACb;AAAA,wBAAAD,MAAC,WAAQ,WAAU,0DAAyD;AAAA,QAC5E,gBAAAC,OAAC,SAAI,WAAU,eACb;AAAA,0BAAAD,MAAC,OAAE,WAAU,oCAGV,iBAAO,SACJ,EAAE,sBAAsB,EAAE,SAAS,OAAO,OAAO,CAAC,IAClD,EAAE,uBAAuB,GAC/B;AAAA,UACC,SACC,gBAAAA,MAAC,OAAE,WAAU,0CACV,YAAE,qBAAqB,EAAE,MAAM,kBAAkB,MAAM,EAAE,CAAC,GAC7D,IACE;AAAA,WACN;AAAA,SACF;AAAA,MACA,gBAAAA,MAAC,cAAW,OAAO,OAAO,aAAa;AAAA,OACzC;AAAA,IACA,gBAAAA,MAAC,UAAK,WAAU,yHACb,iBAAO,aACV;AAAA,KACF;AAEJ;AAGA,SAAS,gBAAgB,MAAyC;AAChE,QAAM,QAAQ,YAAY,IAAI;AAC9B,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,EAAE,uBAAuB;AAAA,QAC9B,QAAQ,oBAAoB,MAAM,QAAQ,MAAM,QAAQ;AAAA,MAC1D,CAAC;AAAA,IACH,KAAK;AACH,aAAO,EAAE,4BAA4B;AAAA,IACvC,KAAK;AACH,aAAO,EAAE,uBAAuB,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,EAAE,sBAAsB,EAAE,SAAS,MAAM,QAAQ,CAAC;AAAA,IAC3D,KAAK;AACH,aAAO,EAAE,uBAAuB;AAAA,IAClC,KAAK;AACH,aAAO,EAAE,qBAAqB;AAAA,EAClC;AACF;AASA,SAAS,iBAAiB,QAAwB;AAChD,QAAM,MAAM,gBAAgB,MAAM;AAClC,SAAO,MAAM,EAAE,GAAG,IAAI,YAAY,MAAM;AAC1C;;;AGjnBA,SAAS,aAAAK,YAAW,SAAAC,QAAO,UAAAC,SAAQ,YAAAC,iBAAgB;;;AC2BnD,SAASC,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASC,oBAAmB,QAAiC,KAAwC;AACnG,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,SAAO;AACT;AAEO,SAAS,uBAAuB,SAA0C;AAC/E,MAAI,CAACD,UAAS,OAAO,KAAK,OAAO,QAAQ,wBAAwB,UAAW,QAAO,EAAE,IAAI,MAAM;AAC/F,MAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,EAAG,QAAO,EAAE,IAAI,MAAM;AAEtD,QAAM,QAAqB,CAAC;AAC5B,aAAW,SAAS,QAAQ,OAAO;AACjC,QAAI,CAACA,UAAS,KAAK,EAAG,QAAO,EAAE,IAAI,MAAM;AACzC,UAAM,cAAcC,oBAAmB,OAAO,aAAa;AAC3D,QACE,OAAO,MAAM,OAAO,YACjB,OAAO,MAAM,SAAS,YACtB,gBAAgB,UAChB,OAAO,MAAM,eAAe,WAC/B;AACA,aAAO,EAAE,IAAI,MAAM;AAAA,IACrB;AACA,UAAM,KAAK,EAAE,IAAI,MAAM,IAAI,MAAM,MAAM,MAAM,aAAa,YAAY,MAAM,WAAW,CAAC;AAAA,EAC1F;AAEA,SAAO,EAAE,IAAI,MAAM,aAAa,EAAE,qBAAqB,QAAQ,qBAAqB,MAAM,EAAE;AAC9F;AAEO,SAAS,uBAAuB,SAA0C;AAC/E,MAAI,CAACD,UAAS,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,QAAQ,EAAG,QAAO,EAAE,IAAI,MAAM;AAE/E,QAAM,WAA8B,CAAC;AACrC,aAAW,SAAS,QAAQ,UAAU;AACpC,QAAI,CAACA,UAAS,KAAK,EAAG,QAAO,EAAE,IAAI,MAAM;AACzC,UAAM,YAAYC,oBAAmB,OAAO,YAAY;AACxD,UAAM,YAAYA,oBAAmB,OAAO,YAAY;AACxD,QACE,OAAO,MAAM,OAAO,YACjB,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,eAAe,YAC5B,cAAc,UACd,cAAc,UACd,OAAO,MAAM,YAAY,WAC5B;AACA,aAAO,EAAE,IAAI,MAAM;AAAA,IACrB;AACA,aAAS,KAAK;AAAA,MACZ,IAAI,MAAM;AAAA,MACV,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,IAAI,MAAM,SAAS;AAC9B;AAGO,SAAS,iBAAiB,UAA+C;AAC9E,SAAO,SAAS,KAAK,CAAC,YAAY,CAAC,QAAQ,OAAO;AACpD;AAUO,SAAS,kBACd,WAC+C;AAC/C,QAAM,QAAQ,WAAW,KAAK;AAC9B,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,UAAU,MAAM,SAAS,MAAM,IACjC,SACA,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,IAC9C,UACA,MAAM,SAAS,UAAU,IACvB,YACA,MAAM,SAAS,SAAS,IACtB,WACA,MAAM,SAAS,SAAS,IACtB,WACA;AAEZ,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,KAAK,MAAM,SAAS,SAAS,IAC/B,YACA,MAAM,SAAS,SAAS,IACtB,YACA,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,MAAM,IAC/C,QACA,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,WAAW,IACtD,UACA,MAAM,SAAS,OAAO,IACpB,UACA;AAEZ,SAAO,EAAE,SAAS,GAAG;AACvB;AAQO,SAAS,gBAAgB,MAAc,OAAuB;AACnE,QAAM,SAAS,KAAK,KAAK,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,KAAK;AAC7D,QAAM,QAAQ,OAAO,MAAM,KAAK,EAAE,OAAO,OAAO;AAChD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,MAAI,MAAM,WAAW,EAAG,SAAQ,MAAM,CAAC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,kBAAkB;AAC9E,QAAM,SAAS,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;AACvC,QAAM,QAAQ,MAAM,MAAM,SAAS,CAAC,KAAK,IAAI,OAAO,CAAC;AACrD,SAAO,GAAG,KAAK,GAAG,IAAI,GAAG,kBAAkB;AAC7C;AAGO,SAAS,eAAe,OAAwB;AACrD,SAAO,MAAM,KAAK,EAAE,UAAU;AAChC;AAGO,IAAM,mBAAmB,KAAK,OAAO;AAErC,SAAS,uBAAuB,OAAwB;AAC7D,SAAO,QAAQ,KAAK,SAAS;AAC/B;;;AD7HW,gBAAAC,OAQP,QAAAC,cARO;AAPX,IAAMC,SACJ;AAEK,SAAS,kBAAkB;AAChC,QAAM,EAAE,OAAO,OAAO,IAAI,oBAAoB;AAE9C,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO,gBAAAF,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,kBAAkB,GAAG;AAAA,EACrE;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,iBACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM,KAAK,SAAS;AAAA,QAC1B,OAAO,MAAM,KAAK,SAAS;AAAA,QAC3B,SAAS;AAAA;AAAA,IACX;AAAA,IACA,gBAAAA,MAAC,2BAAwB;AAAA,IACzB,gBAAAA,MAAC,kBAAe;AAAA,KAClB;AAEJ;AAcA,SAAS,oBACP,OACA,QACsC;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIG,UAAmB,IAAI;AACjD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,KAAK;AAC1C,QAAM,YAAYC,QAAO,MAAM;AAC/B,YAAU,UAAU;AAEpB,EAAAC,WAAU,MAAM;AACd,QAAI,MAAM,WAAW,QAAS;AAC9B,UAAM,SAAS,UAAU,QAAQ,MAAM,IAAI;AAC3C,cAAU,CAAC,OAAO,EAAE;AACpB,aAAS,OAAO,KAAK,OAAO,QAAQ,IAAI;AAAA,EAC1C,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO,EAAE,OAAO,OAAO;AACzB;AAeA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,SAASC,OAAM;AACrB,QAAM,CAAC,OAAO,QAAQ,IAAIH,UAAS,IAAI;AACvC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAwB,IAAI;AACxD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAsB,EAAE,QAAQ,UAAU,CAAC;AACvE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,CAAC;AAEpD,QAAM,gBAAgBC,QAAO,KAAK;AAClC,QAAM,CAAC,YAAY,aAAa,IAAID,UAAqC,IAAI;AAC7E,QAAM,YAAY,OAAO,WAAW,UAAU,OAAO,MAAM;AAC3D,QAAM,YAAYC,QAAyB,IAAI;AAa/C,EAAAC,WAAU,MAAM;AACd,QAAI,OAAO;AACX,SAAK,gBAAgB,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,WAAW;AACvD,UAAI,CAAC,KAAM;AAUX,UAAI,cAAc,QAAS;AAE3B,UAAI,CAAC,OAAO,SAAS;AAInB,kBAAU,EAAE,QAAQ,SAAS,CAAC;AAC9B;AAAA,MACF;AACA,gBAAU,EAAE,QAAQ,SAAS,KAAK,cAAc,OAAO,IAAI,EAAE,CAAC;AAAA,IAChE,CAAC;AACD,WAAO,MAAM;AACX,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,OAAO,YAAY;AACvB,QAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,eAAS,EAAE,uBAAuB,CAAC;AACnC;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,cAAU,IAAI;AACd,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,cAAc,EAAE,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;AACvF,YAAQ,KAAK;AAEb,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,wBAAwB,CAAC;AAC9D;AAAA,IACF;AAEA,cAAU,EAAE,uBAAuB,CAAC;AACpC,YAAQ;AAAA,EACV;AAEA,QAAM,eAAe,OAAO,SAAe;AACzC,QAAI,CAAC,uBAAuB,KAAK,IAAI,GAAG;AAEtC,eAAS,EAAE,yBAAyB,CAAC;AACrC;AAAA,IACF;AAEA,kBAAc,QAAQ;AACtB,aAAS,IAAI;AACb,cAAU,IAAI;AACd,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,aAAa,IAAI,CAAC;AACpE,kBAAc,IAAI;AAElB,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,uBAAuB,CAAC;AAC7D;AAAA,IACF;AAEA,kBAAc,UAAU;AACxB,cAAU,EAAE,QAAQ,SAAS,KAAK,cAAc,OAAO,IAAI,EAAE,CAAC;AAAA,EAChE;AAEA,QAAM,eAAe,YAAY;AAC/B,kBAAc,QAAQ;AACtB,aAAS,IAAI;AACb,cAAU,IAAI;AACd,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,aAAa,CAAC;AAChE,kBAAc,IAAI;AAElB,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,6BAA6B,CAAC;AACnE;AAAA,IACF;AAEA,kBAAc,UAAU;AACxB,cAAU,EAAE,QAAQ,SAAS,KAAK,KAAK,CAAC;AAAA,EAC1C;AAEA,SACE,gBAAAJ,OAAC,aACC;AAAA,oBAAAD,MAAC,uBAAqB,YAAE,uBAAuB,GAAE;AAAA,IAEjD,gBAAAC,OAAC,eAAY,WAAU,oBACrB;AAAA,sBAAAA,OAAC,SAAI,WAAU,qDACZ;AAAA,oBACC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,WAAU;AAAA;AAAA,QACZ,IAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA,YAET,0BAAgB,OAAO,KAAK;AAAA;AAAA,QAC/B;AAAA,QAGF,gBAAAC,OAAC,SAAI,WAAU,qDAMb;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,QAAO;AAAA,cACP,WAAU;AAAA,cACV,UAAU,CAAC,UAAU;AACnB,sBAAM,OAAO,MAAM,OAAO,QAAQ,CAAC;AACnC,sBAAM,OAAO,QAAQ;AACrB,oBAAI,KAAM,MAAK,aAAa,IAAI;AAAA,cAClC;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,eAAe;AAAA,cACzB,aAAW,eAAe,YAAY;AAAA,cACtC,WAAU;AAAA,cACV,SAAS,MAAM,UAAU,SAAS,MAAM;AAAA,cAEvC,yBAAe,WAAW,EAAE,0BAA0B,IAAI,EAAE,uBAAuB;AAAA;AAAA,UACtF;AAAA,UACC,YACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,eAAe;AAAA,cACzB,aAAW,eAAe,YAAY;AAAA,cACtC,WAAU;AAAA,cACV,SAAS,MAAM,KAAK,aAAa;AAAA,cAEhC,yBAAe,WAAW,EAAE,yBAAyB,IAAI,EAAE,uBAAuB;AAAA;AAAA,UACrF,IACE;AAAA,WACN;AAAA,SACF;AAAA,MACC,OAAO,WAAW,WACjB,gBAAAC,OAAC,OAAE,MAAK,SAAQ,WAAU,4FACvB;AAAA,UAAE,kBAAkB;AAAA,QACrB,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AACb,wBAAU,EAAE,QAAQ,UAAU,CAAC;AAC/B,+BAAiB,CAAC,YAAY,UAAU,CAAC;AAAA,YAC3C;AAAA,YACA,WAAU;AAAA,YAET,YAAE,cAAc;AAAA;AAAA,QACnB;AAAA,SACF,IACE;AAAA,MACJ,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,YAAE,qBAAqB,GAAE;AAAA,MAEhF,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,YAAU;AAAA,UACV,WAAU;AAAA,UACV,UAAU,CAAC,UAAU;AACnB,kBAAM,eAAe;AACrB,iBAAK,KAAK;AAAA,UACZ;AAAA,UAEA;AAAA,4BAAAD,MAAC,OAAE,WAAU,kCAAkC,YAAE,qBAAqB,GAAE;AAAA,YACxE,gBAAAA,MAAC,OAAE,WAAU,uDAAuD,iBAAM;AAAA,YAC1E,gBAAAA,MAAC,OAAE,WAAU,8DACV,YAAE,oBAAoB,GACzB;AAAA,YAEA,gBAAAA,MAAC,WAAM,SAAS,QAAQ,WAAU,gEAC/B,YAAE,oBAAoB,GACzB;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBACJ,MAAK;AAAA,gBACL;AAAA,gBACA,cAAa;AAAA,gBACb,UAAU;AAAA,gBACV,gBAAc,QAAQ,OAAO;AAAA,gBAC7B,UAAU,CAAC,UAAU;AACnB,2BAAS,MAAM,OAAO,KAAK;AAC3B,2BAAS,IAAI;AAAA,gBACf;AAAA,gBACA,WAAW,GAAGE,MAAK;AAAA;AAAA,YACrB;AAAA,YAEC,SAAS,gBAAAF,MAAC,iBAAc,SAAS,QAAQ,IAAK;AAAA,YAC9C,QAAQ,gBAAAA,MAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,YAEjD,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,aAAW,QAAQ;AAAA,gBACnB,WAAU;AAAA,gBAET;AAAA,yBAAO,gBAAAD,MAAC,eAAY,WAAU,cAAa,IAAK;AAAA,kBAChD,OAAO,EAAE,wBAAwB,IAAI,EAAE,sBAAsB;AAAA;AAAA;AAAA,YAChE;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,0BAA0B;AACjC,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,qBAAqB,MAChE,gBAAgB,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAC;AAClD,QAAM,EAAE,OAAO,OAAO,IAAI,oBAAsC,OAAO,CAAC,YAAY;AAClF,UAAM,WAAW,uBAAuB,OAAO;AAC/C,WAAO,SAAS,KAAK,EAAE,IAAI,MAAM,OAAO,SAAS,YAAY,IAAI,EAAE,IAAI,MAAM;AAAA,EAC/E,CAAC;AACD,QAAM,CAAC,YAAY,aAAa,IAAIG,UAAwB,IAAI;AAChE,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,QAAM,UAAU,gBAAAH,MAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAEhE,MAAI,MAAM,WAAW,WAAW,QAAQ;AACtC,WACE,gBAAAC,OAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,WAAW,UAAU,MAAM,UAAU,EAAE,uBAAuB;AAAA,UAC7E,SAAS;AAAA;AAAA,MACX,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,UAAU,MAAM;AAClB,WACE,gBAAAC,OAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,OAAE,MAAK,UAAS,WAAU,0CACxB,YAAE,wBAAwB,GAC7B;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,QAAQ,OACZ,KACA,SACG;AACH,kBAAc,GAAG;AACjB,aAAS,IAAI;AACb,UAAM,SAAS,MAAM,KAAK;AAC1B,kBAAc,IAAI;AAElB,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,2BAA2B,CAAC;AACjE;AAAA,IACF;AAKA,WAAO;AAAA,EACT;AAEA,SACE,gBAAAC,OAAC,aACE;AAAA;AAAA,IACD,gBAAAA,OAAC,eAAY,WAAU,oBACpB;AAAA,cAAQ,gBAAAD,MAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,MAEjD,gBAAAC,OAAC,WAAM,WAAU,sCACf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AAAA,YACf,UAAU,eAAe;AAAA,YACzB,WAAU;AAAA,YACV,UAAU,CAAC,UAAU,KAAK,MAAM,UAAU,MAAM,gBAAgB,CAAC,QAC/D,IAAI,uBAAuB,EAAE,qBAAqB,MAAM,OAAO,QAAQ,CAAC,CAAC,CAAC;AAAA;AAAA,QAC9E;AAAA,QACA,gBAAAC,OAAC,UAAK,WAAU,eACd;AAAA,0BAAAD,MAAC,UAAK,WAAU,4CAA4C,YAAE,yBAAyB,GAAE;AAAA,UACzF,gBAAAA,MAAC,UAAK,WAAU,oDACb,YAAE,6BAA6B,GAClC;AAAA,WACF;AAAA,SACF;AAAA,MAEA,gBAAAA,MAAC,SAAI,WAAU,gDACZ,gBAAM,MAAM,WAAW,IACtB,gBAAAA,MAAC,OAAE,WAAU,iCAAiC,YAAE,qBAAqB,GAAE,IAEvE,MAAM,MAAM,IAAI,CAAC,SACf,gBAAAC,OAAC,WAAoB,WAAU,sCAC7B;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,KAAK;AAAA,YACd,UAAU,eAAe;AAAA,YACzB,WAAU;AAAA,YACV,UAAU,CAAC,UAAU,KAAK,MAAM,KAAK,IAAI,MAAM,gBAAgB,CAAC,QAC9D,IAAI,uBAAuB;AAAA,cACzB,oBAAoB,CAAC,EAAE,SAAS,KAAK,IAAI,YAAY,MAAM,OAAO,QAAQ,CAAC;AAAA,YAC7E,CAAC,CAAC,CAAC;AAAA;AAAA,QACP;AAAA,QACA,gBAAAC,OAAC,UAAK,WAAU,eACd;AAAA,0BAAAD,MAAC,UAAK,WAAU,4CAA4C,eAAK,MAAK;AAAA,UACrE,KAAK,cACJ,gBAAAA,MAAC,UAAK,WAAU,oDAAoD,eAAK,aAAY,IACnF;AAAA,WACN;AAAA,WAhBU,KAAK,EAiBjB,CACD,GAEL;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,iBAAiB;AACxB,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,YAAY,MACvD,gBAAgB,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;AAC1C,QAAM,EAAE,OAAO,OAAO,IAAI,oBAAuC,OAAO,CAAC,YAAY;AACnF,UAAM,WAAW,uBAAuB,OAAO;AAC/C,WAAO,SAAS,KAAK,EAAE,IAAI,MAAM,OAAO,SAAS,SAAS,IAAI,EAAE,IAAI,MAAM;AAAA,EAC5E,CAAC;AAMD,QAAM,CAAC,OAAO,QAAQ,IAAIG,UAAwB,IAAI;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAC9D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAwB,IAAI;AAExD,QAAM,UAAU,gBAAAH,MAAC,uBAAqB,YAAE,uBAAuB,GAAE;AAEjE,MAAI,MAAM,WAAW,WAAW,QAAQ;AACtC,WACE,gBAAAC,OAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,WAAW,UAAU,MAAM,UAAU,EAAE,wBAAwB;AAAA,UAC9E,SAAS;AAAA;AAAA,MACX,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,UAAU,MAAM;AAClB,WACE,gBAAAC,OAAC,aACE;AAAA;AAAA,MACD,gBAAAD,MAAC,OAAE,MAAK,UAAS,WAAU,0CACxB,YAAE,yBAAyB,GAC9B;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,SAAS,OACb,IACA,MACA,SACG;AACH,iBAAa,EAAE;AACf,aAAS,IAAI;AACb,cAAU,IAAI;AACd,UAAM,SAAS,MAAM,KAAK;AAC1B,iBAAa,IAAI;AAEjB,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,8BAA8B,CAAC;AACpE;AAAA,IACF;AAEA,aAAS,IAAI;AACb,QAAI,KAAM,WAAU,IAAI;AACxB,WAAO;AAAA,EACT;AAEA,SACE,gBAAAC,OAAC,aACE;AAAA;AAAA,IACD,gBAAAA,OAAC,SAAI,WAAU,0BACZ;AAAA,cAAQ,gBAAAD,MAAC,gBAAa,SAAS,OAAO,IAAK;AAAA,MAC3C,SAAS,gBAAAA,MAAC,iBAAc,SAAS,QAAQ,IAAK;AAAA,MAE9C,MAAM,WAAW,IAChB,gBAAAA,MAAC,OAAE,WAAU,iCAAiC,YAAE,uBAAuB,GAAE,IAEzE,gBAAAA,MAAC,QAAG,WAAU,iBACX,gBAAM,IAAI,CAAC,YACV,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA,4BAAAA,OAAC,SAAI,WAAU,0BACb;AAAA,8BAAAA,OAAC,OAAE,WAAU,+CACV;AAAA,4BAAY,OAAO;AAAA,gBACnB,QAAQ,UACP,gBAAAD,MAAC,UAAK,WAAU,0DACb,YAAE,qBAAqB,GAC1B,IACE;AAAA,iBACN;AAAA,cACA,gBAAAC,OAAC,OAAE,WAAU,uDACV;AAAA,wBAAQ,cAAc,EAAE,oBAAoB;AAAA,gBAC5C;AAAA,gBACA,EAAE,uBAAuB;AAAA,kBACxB,MAAM,sBAAsB,QAAQ,UAAU;AAAA,gBAChD,CAAC;AAAA,iBACH;AAAA,eACF;AAAA,YAIC,QAAQ,UAAU,OAAO,UAAU,QAAQ,KAC1C,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,cAAc,QAAQ;AAAA,gBAC5B,UAAU,cAAc;AAAA,gBACxB,cAAc,EAAE,wBAAwB;AAAA,gBACxC,WAAW,EAAE,2BAA2B;AAAA,gBACxC,WAAW,MAAM,KAAK;AAAA,kBACpB,QAAQ;AAAA,kBACR,MAAM,gBAAgB,CAAC,QAAQ,IAAI,cAAc,QAAQ,EAAE,CAAC;AAAA,kBAC5D;AAAA,gBACF;AAAA,gBACA,UAAU,MAAM,SAAS,IAAI;AAAA;AAAA,YAC/B,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU,cAAc;AAAA,gBACxB,WAAU;AAAA,gBACV,SAAS,MAAM,SAAS,QAAQ,EAAE;AAAA,gBAEjC,YAAE,wBAAwB;AAAA;AAAA,YAC7B;AAAA;AAAA;AAAA,QA5CG,QAAQ;AAAA,MA8Cf,CACD,GACH;AAAA,MAGD,iBAAiB,KAAK,IACrB,UAAU,WACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,cAAc;AAAA,UACpB,UAAU,cAAc;AAAA,UACxB,cAAc,EAAE,wBAAwB;AAAA,UACxC,WAAW,EAAE,2BAA2B;AAAA,UACxC,WAAW,MAAM,KAAK;AAAA,YACpB;AAAA,YACA,MAAM,gBAAgB,CAAC,QAAQ,IAAI,kBAAkB,CAAC;AAAA,YACtD,EAAE,4BAA4B;AAAA,UAChC;AAAA,UACA,UAAU,MAAM,SAAS,IAAI;AAAA;AAAA,MAC/B,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU,cAAc;AAAA,UACxB,WAAU;AAAA,UACV,SAAS,MAAM,SAAS,QAAQ;AAAA,UAE/B,YAAE,wBAAwB;AAAA;AAAA,MAC7B,IAEA;AAAA,OACN;AAAA,KACF;AAEJ;AASO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACE,gBAAAC,OAAC,SAAI,WAAU,qDACb;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA,aAAW,QAAQ;AAAA,QACnB,WAAU;AAAA,QACV,SAAS;AAAA,QAER;AAAA,iBAAO,gBAAAD,MAAC,eAAY,WAAU,cAAa,IAAK;AAAA,UAChD,OAAO,YAAY;AAAA;AAAA;AAAA,IACtB;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA,WAAU;AAAA,QACV,SAAS;AAAA,QAER,YAAE,oBAAoB;AAAA;AAAA,IACzB;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY,SAAkC;AACrD,QAAM,YAAY,kBAAkB,QAAQ,UAAU;AACtD,MAAI,CAAC,UAAW,QAAO,EAAE,wBAAwB;AACjD,MAAI,CAAC,UAAU,GAAI,QAAO,UAAU;AACpC,SAAO,EAAE,qBAAqB,EAAE,SAAS,UAAU,SAAS,IAAI,UAAU,GAAG,CAAC;AAChF;AAQA,SAAS,cAAc,MAA8B;AACnD,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,QAAM,MAAO,KAAkC;AAC/C,SAAO,OAAO,QAAQ,WAAW,iBAAiB,GAAG,IAAI;AAC3D;;;AEpqBA,SAAS,YAAAO,iBAAgC;AACzC,SAAS,QAAAC,aAAY;;;ACFd,SAAS,mBAAmB,cAA2D;AAC5F,MAAI,aAAa,OAAO,YAAY,MAAM,cAAc,aAAa,aAAa;AAChF,WAAO,EAAE,MAAM,YAAY,MAAM,aAAa,YAAY;AAAA,EAC5D;AACA,MAAI,aAAa,sBAAsB;AACrC,WAAO,EAAE,MAAM,QAAQ,MAAM,aAAa,mBAAmB;AAAA,EAC/D;AACA,MAAI,aAAa,OAAO,YAAY,MAAM,cAAc,aAAa,WAAW;AAC9E,WAAO,EAAE,MAAM,SAAS,MAAM,aAAa,UAAU;AAAA,EACvD;AACA,SAAO,EAAE,MAAM,UAAU,MAAM,aAAa,mBAAmB;AACjE;AAGO,SAAS,sBAAsB,QAAoC;AACxE,SAAO,iBAAiB,OAAO,IAAI;AACrC;AAEA,IAAM,kBAAuC,oBAAI,IAAI,CAAC,OAAO,QAAQ,SAAS,MAAM,CAAC;AAU9E,SAAS,eACd,MAC8D;AAC9D,QAAM,WAAW,KAAK,SAAS,KAAK,EAAE,YAAY;AAElD,QAAM,QAAQ,KAAK,iBAAiB,IAAI,KAAK,iBAAiB;AAC9D,QAAM,SAAS,EAAE,OAAO,UAAU,KAAK,SAAS;AAEhD,MAAI,CAAC,gBAAgB,IAAI,QAAQ,GAAG;AAClC,WAAO,EAAE,KAAK,8BAA8B,OAAO;AAAA,EACrD;AAEA,QAAM,SAAS,UAAU,IAAI,QAAQ;AACrC,QAAM,OAAO,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC;AAChE,SAAO,EAAE,KAAK,wBAAwB,IAAI,GAAG,MAAM,IAAI,OAAO;AAChE;AAUO,SAAS,mBAAmB,SAA0B;AAC3D,SAAO,QAAQ,KAAK,EAAE,YAAY,MAAM;AAC1C;AAcA,SAASC,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,WAAW,QAAiC,KAA4B;AAC/E,QAAM,QAAQ,OAAO,GAAG;AACxB,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAWO,SAAS,qBAAqB,SAAwC;AAC3E,MAAI,CAACA,UAAS,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,QAAQ,EAAG,QAAO,EAAE,IAAI,MAAM;AAE/E,QAAM,WAAoC,CAAC;AAC3C,aAAW,SAAS,QAAQ,UAAU;AACpC,QAAI,CAACA,UAAS,KAAK,EAAG,QAAO,EAAE,IAAI,MAAM;AAEzC,UAAM,SAAS,WAAW,OAAO,QAAQ;AACzC,UAAM,QAAQ,WAAW,OAAO,OAAO;AACvC,UAAM,WAAW,WAAW,OAAO,UAAU;AAC7C,UAAM,SAAS,WAAW,OAAO,QAAQ;AACzC,UAAM,YAAY,WAAW,OAAO,YAAY;AAChD,QAAI,WAAW,QAAQ,UAAU,QAAQ,aAAa,QAAQ,WAAW,QAAQ,cAAc,MAAM;AACnG,aAAO,EAAE,IAAI,MAAM;AAAA,IACrB;AAEA,aAAS,KAAK,EAAE,QAAQ,OAAO,UAAU,QAAQ,YAAY,UAAU,CAAC;AAAA,EAC1E;AAEA,SAAO,EAAE,IAAI,MAAM,SAAS;AAC9B;;;ADvEW,SAsJD,YAAAC,WAtJC,OAAAC,OAyDC,QAAAC,cAzDD;AANJ,SAAS,uBAAuB;AACrC,QAAM,EAAE,OAAO,OAAO,IAAI,oBAAoB;AAC9C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,UAAwB,IAAI;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAwB,IAAI;AAExD,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO,gBAAAF,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,uBAAuB,GAAG;AAAA,EAC1E;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,QAAM,gBAAgB,MAAM,KAAK;AAEjC,MAAI,cAAc,WAAW,GAAG;AAC9B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,0BAA0B;AAAA,QACnC,MAAM,EAAE,yBAAyB;AAAA,QACjC,QAAQ,gBAAAA,MAAC,mBAAgB;AAAA;AAAA,IAC3B;AAAA,EAEJ;AASA,QAAM,WAAW,cAAc,KAAK,CAAC,UAAU,MAAM,WAAW,cAAc;AAE9E,MAAI,UAAU;AACZ,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAc;AAAA,QACd;AAAA,QACA,QAAQ,MAAM;AACZ,4BAAkB,IAAI;AACtB,oBAAU,IAAI;AAAA,QAChB;AAAA,QACA,WAAW,CAAC,YAAY;AACtB,oBAAU,OAAO;AACjB,iBAAO;AAAA,QACT;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,QAAG,WAAU,iBACX,wBAAc,IAAI,CAAC,iBAClB,gBAAAA,MAAC,QACC,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS,MAAM;AACb,kBAAU,IAAI;AACd,0BAAkB,aAAa,MAAM;AAAA,MACvC;AAAA,MACA,WAAU;AAAA,MAEV;AAAA,wBAAAA,OAAC,SAAI,WAAU,0BACb;AAAA,0BAAAD,MAAC,OAAE,WAAU,iDACV,uBAAa,MAAM,QAAQ,EAAE,2BAA2B,GAC3D;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,sBAAY,YAAY,GAAE;AAAA,WACnF;AAAA,QAGC,aAAa,OACZ,gBAAAA,MAAC,UAAK,WAAU,kEACb,8BAAoB,aAAa,KAAK,OAAO,aAAa,KAAK,QAAQ,GAC1E,IACE;AAAA,QACJ,gBAAAA,MAAC,cAAW,QAAQ,aAAa,QAAQ;AAAA;AAAA;AAAA,EAC3C,KAvBO,aAAa,MAwBtB,CACD,GACH;AAEJ;AAEA,SAAS,kBAAkB;AACzB,SACE,gBAAAA,MAACG,OAAA,EAAK,IAAG,iBAAgB,WAAU,mGAChC,YAAE,oBAAoB,GACzB;AAEJ;AAEA,SAAS,YAAY,cAA+C;AAClE,QAAM,SAAS,mBAAmB,YAAY;AAC9C,SAAO,EAAE,sBAAsB,MAAM,GAAG,EAAE,MAAM,kBAAkB,OAAO,IAAI,EAAE,CAAC;AAClF;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,CAAC,eAAe,gBAAgB,IAAID,UAA+C,IAAI;AAC7F,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAC9D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAwB,IAAI;AAElE,QAAM,cAAc,mBAAmB,aAAa,OAAO;AAE3D,QAAM,MAAM,OACV,QACA,MACA,gBACG;AACH,qBAAiB,MAAM;AACvB,mBAAe,IAAI;AACnB,UAAM,SAAS,MAAM,KAAK;AAC1B,qBAAiB,IAAI;AAErB,QAAI,CAAC,OAAO,SAAS;AACnB,qBAAe,OAAO,SAAS,KAAK,KAAK,EAAE,4BAA4B,CAAC;AACxE;AAAA,IACF;AAEA,wBAAoB,KAAK;AACzB,cAAU,WAAW;AAAA,EACvB;AAEA,QAAM,UAAU,aAAa,OAAO,eAAe,aAAa,IAAI,IAAI;AAExE,SACE,gBAAAD,OAAC,SACC;AAAA,oBAAAD,MAAC,qBAAkB,SAAS,QAAQ,OAAO,EAAE,gCAAgC,GAAG;AAAA,IAEhF,gBAAAC,OAAC,SAAI,WAAU,iFACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,eACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,kDACX,uBAAa,MAAM,QAAQ,EAAE,2BAA2B,GAC3D;AAAA,QACA,gBAAAA,MAAC,OAAE,WAAU,0CACV,YAAE,2BAA2B,EAAE,MAAM,kBAAkB,aAAa,UAAU,EAAE,CAAC,GACpF;AAAA,SACF;AAAA,MACA,gBAAAA,MAAC,cAAW,QAAQ,aAAa,QAAQ;AAAA,OAC3C;AAAA,IAEC,SAAS,gBAAAA,MAAC,iBAAc,SAAS,QAAQ,IAAK;AAAA,IAC9C,cAAc,gBAAAA,MAAC,SAAI,WAAU,YAAW,0BAAAA,MAAC,gBAAa,SAAS,aAAa,GAAE,IAAS;AAAA,IAExF,gBAAAC,OAAC,eAAY,WAAU,oBACpB;AAAA,mBAAa,OACZ,gBAAAA,OAAAF,WAAA,EACE;AAAA,wBAAAC,MAAC,OAAE,WAAU,8CACV,8BAAoB,aAAa,KAAK,OAAO,aAAa,KAAK,QAAQ,GAC1E;AAAA,QACC,UACC,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,YAAE,QAAQ,KAAK,QAAQ,MAAM,GAAE,IACpF;AAAA,SACN,IACE;AAAA,MAEJ,gBAAAA,MAAC,OAAE,WAAU,0CAA0C,sBAAY,YAAY,GAAE;AAAA,MAEjF,gBAAAC,OAAC,QAAG,WAAU,iEACZ;AAAA,wBAAAD,MAAC,aAAU,OAAO,EAAE,uBAAuB,GAAI,uBAAa,SAAQ;AAAA,QACpE,gBAAAA,MAAC,aAAU,OAAO,EAAE,6BAA6B,GAG9C,uBAAa,gBAAgB,cAAc,aAAa,eAAe,aACpE,EAAE,4BAA4B;AAAA,UAC9B,OAAO,aAAa,eAAe;AAAA,UACnC,OAAO,aAAa,eAAe;AAAA,QACrC,CAAC,IACC,aAAa,gBAAgB,QAAQ,EAAE,+BAA+B,GAC5E;AAAA,SACF;AAAA,OACF;AAAA,IAQC,aAAa,QAAQ,4BACpB,gBAAAC,OAAC,OAAE,WAAU,6EACX;AAAA,sBAAAD,MAAC,YAAS,WAAU,2CAA0C;AAAA,MAC7D,EAAE,sCAAsC;AAAA,OAC3C,IACE;AAAA,IAOJ,gBAAAC,OAAC,SAAI,WAAU,6CACZ;AAAA,mBAAa,QAAQ,YACpB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU,kBAAkB;AAAA,UAC5B,aAAW,kBAAkB,WAAW;AAAA,UACxC,WAAU;AAAA,UACV,SAAS,MAAM,KAAK;AAAA,YAClB;AAAA,YACA,MAAM,gBAAgB,CAAC,QAAQ,IAAI,kBAAkB,aAAa,MAAM,CAAC;AAAA,YACzE,EAAE,sBAAsB;AAAA,UAC1B;AAAA,UAEC;AAAA,8BAAkB,UAAU,gBAAAD,MAAC,eAAY,WAAU,kCAAiC,IAAK;AAAA,YACzF,kBAAkB,UAAU,EAAE,uBAAuB,IAAI,EAAE,qBAAqB;AAAA;AAAA;AAAA,MACnF,IACE;AAAA,MAEH,aAAa,QAAQ,aACpB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU,kBAAkB;AAAA,UAC5B,aAAW,kBAAkB,YAAY;AAAA,UACzC,WAAU;AAAA,UACV,SAAS,MAAM,KAAK;AAAA,YAClB;AAAA,YACA,MAAM,gBAAgB,CAAC,QAAQ,IAAI,mBAAmB,aAAa,MAAM,CAAC;AAAA,YAC1E,EAAE,uBAAuB;AAAA,UAC3B;AAAA,UAEC;AAAA,8BAAkB,WAAW,gBAAAD,MAAC,eAAY,WAAU,kCAAiC,IAAK;AAAA,YAC1F,kBAAkB,WAAW,EAAE,wBAAwB,IAAI,EAAE,sBAAsB;AAAA;AAAA;AAAA,MACtF,IACE;AAAA,MAEH,aAAa,QAAQ,cAAc,CAAC,mBACnC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU,kBAAkB;AAAA,UAC5B,WAAU;AAAA,UACV,SAAS,MAAM,oBAAoB,IAAI;AAAA,UAEtC,YAAE,sBAAsB;AAAA;AAAA,MAC3B,IACE;AAAA,OACN;AAAA,IAQC,mBACC,gBAAAC,OAAC,eAAY,WAAU,oBACrB;AAAA,sBAAAD,MAAC,OAAE,WAAU,sCAAsC,YAAE,kCAAkC,GAAE;AAAA,MACzF,gBAAAA,MAAC,OAAE,WAAU,0CACV,wBACG,EAAE,0CAA0C;AAAA,QAC5C,MAAM,kBAAkB,aAAa,kBAAkB;AAAA,MACzD,CAAC,IACC,EAAE,gCAAgC,GACxC;AAAA,MACA,gBAAAC,OAAC,SAAI,WAAU,8DACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,kBAAkB;AAAA,YAC5B,WAAU;AAAA,YACV,SAAS,MAAM,oBAAoB,KAAK;AAAA,YAEvC,YAAE,oBAAoB;AAAA;AAAA,QACzB;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,kBAAkB;AAAA,YAC5B,aAAW,kBAAkB,YAAY;AAAA,YACzC,WAAU;AAAA,YACV,SAAS,MAAM,KAAK;AAAA,cAClB;AAAA,cACA,MAAM,gBAAgB,CAAC,QAAQ,IAAI,mBAAmB,aAAa,QAAQ;AAAA,gBACzE,sBAAsB;AAAA,cACxB,CAAC,CAAC;AAAA,cACF,EAAE,yBAAyB;AAAA,YAC7B;AAAA,YAEC;AAAA,gCAAkB,WAAW,gBAAAD,MAAC,eAAY,WAAU,kCAAiC,IAAK;AAAA,cAC1F,kBAAkB,WAAW,EAAE,0BAA0B,IAAI,EAAE,sBAAsB;AAAA;AAAA;AAAA,QACxF;AAAA,SACF;AAAA,OACF,IACE;AAAA,IAEJ,gBAAAA,MAAC,kBAAe,QAAQ,aAAa,QAAQ;AAAA,KAC/C;AAEJ;AAEA,SAAS,UAAU,EAAE,OAAO,SAAS,GAA2C;AAC9E,SACE,gBAAAC,OAAC,SAAI,WAAU,2DACb;AAAA,oBAAAD,MAAC,QAAG,WAAU,kBAAkB,iBAAM;AAAA,IACtC,gBAAAA,MAAC,QAAG,WAAU,2DAA2D,UAAS;AAAA,KACpF;AAEJ;AAEA,SAAS,eAAe,EAAE,OAAO,GAAuB;AACtD,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,WAAW,MAAM,IAAI,MAChE,gBAAgB,CAAC,QAAQ,IAAI,2BAA2B,MAAM,CAAC,CAAC;AAElE,SACE,gBAAAC,OAAC,aAAQ,WAAU,YACjB;AAAA,oBAAAD,MAAC,uBAAqB,YAAE,4BAA4B,GAAE;AAAA,IACtD,gBAAAC,OAAC,SAAI,WAAU,YACZ;AAAA,YAAM,WAAW,YAChB,gBAAAD,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,8BAA8B,GAAG,IACtE;AAAA,MAEH,MAAM,WAAW,UAChB,gBAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,IACrD;AAAA,MAEH,MAAM,WAAW,UAChB,gBAAAA,MAAC,sBAAmB,SAAS,MAAM,MAAM,QAAgB,IACvD;AAAA,OACN;AAAA,KACF;AAEJ;AAEA,SAAS,mBAAmB,EAAE,SAAS,OAAO,GAA6C;AACzF,QAAM,UAAU,qBAAqB,OAAO;AAO5C,MAAI,CAAC,QAAQ,IAAI;AACf,WAAO,gBAAAA,MAAC,gBAAa,SAAS,EAAE,qBAAqB,GAAG,SAAS,QAAQ;AAAA,EAC3E;AAEA,MAAI,QAAQ,SAAS,WAAW,GAAG;AACjC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,iCAAiC;AAAA,QAC1C,MAAM,EAAE,gCAAgC;AAAA;AAAA,IAC1C;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,QAAG,WAAU,iBACX,kBAAQ,SAAS,IAAI,CAAC,YACrB,gBAAAC,OAAC,QAAwB,WAAU,2GACjC;AAAA,oBAAAA,OAAC,SAAI,WAAU,0BACb;AAAA,sBAAAD,MAAC,OAAE,WAAU,kEACV,8BAAoB,QAAQ,OAAO,QAAQ,QAAQ,GACtD;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,uDACV,4BAAkB,QAAQ,UAAU,GACvC;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,cAAW,QAAQ,QAAQ,QAAQ;AAAA,OAT7B,QAAQ,MAUjB,CACD,GACH;AAEJ;;;AEtZA,SAAS,SAAAI,QAAO,YAAAC,kBAAgB;;;ACiBhC,SAASC,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASC,oBAAmB,QAAiC,KAAwC;AACnG,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,SAAO;AACT;AAEA,SAAS,qBAAqB,OAA6C;AACzE,SAAO,UAAU,cAAc,UAAU,cAAc,UAAU;AACnE;AAUO,SAAS,oBAAoB,SAAuC;AACzE,MAAI,CAACD,UAAS,OAAO,KAAK,CAACA,UAAS,QAAQ,MAAM,EAAG,QAAO,EAAE,IAAI,MAAM;AAExE,QAAM,MAAM,QAAQ;AACpB,QAAM,SAAS,IAAI;AACnB,QAAM,QAAQC,oBAAmB,KAAK,OAAO;AAC7C,QAAM,SAAS,IAAI;AACnB,QAAM,YAAYA,oBAAmB,KAAK,YAAY;AACtD,QAAM,YAAY,IAAI;AACtB,QAAM,YAAY,IAAI;AAEtB,MACE,OAAO,WAAW,YACf,UAAU,UACV,OAAO,WAAW,YAClB,cAAc,UACd,OAAO,cAAc,YACrB,OAAO,cAAc,YACrB,CAAC,MAAM,QAAQ,IAAI,QAAQ,GAC9B;AACA,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB;AAEA,QAAM,WAA6B,CAAC;AACpC,aAAW,SAAS,IAAI,UAAU;AAChC,QAAI,CAACD,UAAS,KAAK,EAAG,QAAO,EAAE,IAAI,MAAM;AACzC,UAAM,EAAE,IAAI,MAAM,SAAS,YAAY,iBAAiB,IAAI;AAC5D,QACE,OAAO,OAAO,YACX,CAAC,qBAAqB,IAAI,KAC1B,OAAO,YAAY,YACnB,OAAO,qBAAqB,UAC/B;AACA,aAAO,EAAE,IAAI,MAAM;AAAA,IACrB;AACA,aAAS,KAAK,EAAE,IAAI,MAAM,SAAS,YAAY,iBAAiB,CAAC;AAAA,EACnE;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,eAAe,QAAyB;AACtD,SAAO,OAAO,KAAK,EAAE,YAAY,MAAM;AACzC;AASO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,MAAM,KAAK,EAAE,UAAU;AAChC;AAGO,SAAS,kBAAkB,OAAmC;AACnE,QAAM,QAAQ,MAAM,KAAK;AACzB,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAGO,SAAS,iBAAiB,MAAkC;AACjE,MAAI,SAAS,WAAY,QAAO;AAChC,MAAI,SAAS,SAAU,QAAO;AAC9B,SAAO;AACT;AAUO,SAAS,wBAAwB,MAA8B;AACpE,MAAI,CAACA,UAAS,IAAI,EAAG,QAAO;AAC5B,QAAM,SAAS,KAAK;AACpB,SAAO,OAAO,WAAW,YAAY,OAAO,SAAS,IAAI,SAAS;AACpE;AAGO,SAAS,aAAa,MAAmC;AAC9D,SAAO,SAAS;AAClB;;;ADjGW,gBAAAE,OAsDL,QAAAC,cAtDK;AAbX,IAAMC,SACJ;AAOK,SAAS,iBAAiB;AAC/B,QAAM,EAAE,OAAO,OAAO,IAAI,oBAAoB;AAC9C,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAe,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO,gBAAAH,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,iBAAiB,GAAG;AAAA,EACpE;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO,gBAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAChE;AAEA,QAAM,UAAU,MAAM,KAAK;AAE3B,MAAI,KAAK,SAAS,UAAU;AAC1B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,QAAQ,SAAS;AAAA,QAC5B,UAAU,MAAM,QAAQ,EAAE,MAAM,OAAO,CAAC;AAAA,QACxC,WAAW,CAAC,WAAW;AAGrB,iBAAO;AACP,kBAAQ,EAAE,MAAM,UAAU,OAAO,CAAC;AAAA,QACpC;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,KAAK,SAAS,UAAU;AAC1B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,QAAQ,MAAM,QAAQ,EAAE,MAAM,OAAO,CAAC;AAAA,QACtC,WAAW;AAAA;AAAA,IACb;AAAA,EAEJ;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,oBAAoB;AAAA,QAC7B,MAAM,EAAE,mBAAmB;AAAA,QAC3B,QACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,QAAQ,EAAE,MAAM,SAAS,CAAC;AAAA,YAExC,YAAE,mBAAmB;AAAA;AAAA,QACxB;AAAA;AAAA,IAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SACC;AAAA,oBAAAA,OAAC,SAAI,WAAU,yEACb;AAAA,sBAAAD,MAAC,uBAAqB,YAAE,sBAAsB,GAAE;AAAA,MAChD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM,QAAQ,EAAE,MAAM,SAAS,CAAC;AAAA,UAExC,YAAE,mBAAmB;AAAA;AAAA,MACxB;AAAA,OACF;AAAA,IAEA,gBAAAA,MAAC,QAAG,WAAU,0BACX,kBAAQ,IAAI,CAAC,WACZ,gBAAAA,MAAC,QACC,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,QAAQ,EAAE,MAAM,UAAU,QAAQ,OAAO,OAAO,CAAC;AAAA,QAChE,WAAU;AAAA,QAEV;AAAA,0BAAAD,MAAC,qBAAkB,WAAU,+CAA8C;AAAA,UAC3E,gBAAAC,OAAC,SAAI,WAAU,0BACb;AAAA,4BAAAD,MAAC,OAAE,WAAU,iDAAiD,iBAAO,OAAM;AAAA,YAC3E,gBAAAA,MAAC,OAAE,WAAU,0CACV,YAAE,mBAAmB;AAAA,cACpB,MAAM,sBAAsB,OAAO,UAAU;AAAA,YAC/C,CAAC,GACH;AAAA,aACF;AAAA,UACA,gBAAAA,MAAC,cAAW,QAAQ,OAAO,QAAQ;AAAA;AAAA;AAAA,IACrC,KAhBO,OAAO,MAiBhB,CACD,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,UAAUI,OAAM;AACtB,QAAM,CAAC,OAAO,QAAQ,IAAID,WAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE;AACzC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AAEtD,QAAM,SAAS,YAAY;AACzB,QAAI,CAAC,kBAAkB,OAAO,GAAG;AAC/B,eAAS,EAAE,kBAAkB,CAAC;AAC9B;AAAA,IACF;AAEA,UAAM,UAAU,kBAAkB,KAAK;AAEvC,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,aAAa;AAAA,MAC7D,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ;AAAA,MAClD,SAAS,QAAQ,KAAK;AAAA,IACxB,CAAC,CAAC;AACF,YAAQ,KAAK;AAEb,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,sBAAsB,CAAC;AAC5D;AAAA,IACF;AAEA,UAAM,SAAS,wBAAwB,OAAO,IAAI;AAClD,QAAI,WAAW,MAAM;AAGnB,eAAS,EAAE,sBAAsB,CAAC;AAClC;AAAA,IACF;AAEA,cAAU,MAAM;AAAA,EAClB;AAEA,SACE,gBAAAF,OAAC,SACE;AAAA,gBACC,gBAAAD,MAAC,qBAAkB,SAAS,UAAU,OAAO,EAAE,uBAAuB,GAAG,IACvE;AAAA,IAEJ,gBAAAA,MAAC,eAAY,WAAW,WAAW,YAAY,aAAa,EAAE,IAC5D,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,YAAU;AAAA,QACV,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,eAAK,OAAO;AAAA,QACd;AAAA,QAEA;AAAA,0BAAAA,OAAC,WAAM,SAAS,GAAG,OAAO,UAAU,WAAU,uDAC3C;AAAA,cAAE,sBAAsB;AAAA,YACzB,gBAAAD,MAAC,UAAK,WAAU,0DACb,YAAE,yBAAyB,GAC9B;AAAA,aACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,GAAG,OAAO;AAAA,cACd,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU;AAAA,cACV,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,cAChD,WAAWE;AAAA;AAAA,UACb;AAAA,UAEA,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,GAAG,OAAO;AAAA,cACnB,WAAU;AAAA,cAET,YAAE,sBAAsB;AAAA;AAAA,UAC3B;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,GAAG,OAAO;AAAA,cACd,MAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU;AAAA,cACV,gBAAc,QAAQ,OAAO;AAAA,cAC7B,UAAU,CAAC,UAAU;AACnB,2BAAW,MAAM,OAAO,KAAK;AAC7B,yBAAS,IAAI;AAAA,cACf;AAAA,cACA,WAAW,GAAGE,MAAK;AAAA;AAAA,UACrB;AAAA,UAEC,QAAQ,gBAAAF,MAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,UAEjD,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU;AAAA,cACV,aAAW,QAAQ;AAAA,cACnB,WAAU;AAAA,cAET;AAAA,uBAAO,gBAAAD,MAAC,eAAY,WAAU,cAAa,IAAK;AAAA,gBAChD,OAAO,EAAE,kBAAkB,IAAI,EAAE,gBAAgB;AAAA;AAAA;AAAA,UACpD;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,OAAO,OAAO,IAAI,mBAAmB,UAAU,MAAM,IAAI,MAC/D,gBAAgB,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,CAAC;AAE9C,QAAM,OAAO,gBAAAA,MAAC,qBAAkB,SAAS,QAAQ,OAAO,EAAE,uBAAuB,GAAG;AAEpF,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,gBAAAC,OAAC,SACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,uBAAuB,GAAG,GACnE;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,WACE,gBAAAC,OAAC,SACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,MAAM,SAAS,SAAS,QAAQ,GACzD;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,WAAW,oBAAoB,MAAM,IAAI;AAC/C,MAAI,CAAC,SAAS,IAAI;AAGhB,WACE,gBAAAC,OAAC,SACE;AAAA;AAAA,MACD,gBAAAD,MAAC,SAAI,WAAU,YACb,0BAAAA,MAAC,gBAAa,SAAS,EAAE,qBAAqB,GAAG,SAAS,QAAQ,GACpE;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SACE;AAAA;AAAA,IACD,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,SAAS;AAAA,QACjB,WAAW,MAAM;AAGf,iBAAO;AACP,oBAAU;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AACF,GAGG;AACD,QAAM,UAAUI,OAAM;AACtB,QAAM,CAAC,OAAO,QAAQ,IAAID,WAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,SAAS,eAAe,OAAO,MAAM;AAE3C,QAAM,OAAO,YAAY;AACvB,QAAI,CAAC,kBAAkB,KAAK,GAAG;AAC7B,eAAS,EAAE,kBAAkB,CAAC;AAC9B;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,cAAc,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC;AAC5F,YAAQ,KAAK;AAEb,QAAI,CAAC,OAAO,SAAS;AACnB,eAAS,OAAO,SAAS,KAAK,KAAK,EAAE,qBAAqB,CAAC;AAC3D;AAAA,IACF;AAEA,aAAS,EAAE;AACX,cAAU;AAAA,EACZ;AAEA,SACE,gBAAAF,OAAC,SAAI,WAAU,YACb;AAAA,oBAAAA,OAAC,SAAI,WAAU,wEACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,eACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,+DACX,iBAAO,SAAS,EAAE,kBAAkB,GACvC;AAAA,QACA,gBAAAA,MAAC,OAAE,WAAU,0CACV,YAAE,mBAAmB,EAAE,MAAM,sBAAsB,OAAO,UAAU,EAAE,CAAC,GAC1E;AAAA,QACC,OAAO,aACN,gBAAAA,MAAC,OAAE,WAAU,0CACV,YAAE,sBAAsB,EAAE,IAAI,OAAO,WAAW,CAAC,GACpD,IACE;AAAA,SACN;AAAA,MACA,gBAAAA,MAAC,cAAW,QAAQ,OAAO,QAAQ;AAAA,OACrC;AAAA,IAEC,OAAO,SAAS,WAAW,IAC1B,gBAAAA,MAAC,OAAE,WAAU,8DACV,YAAE,oBAAoB,GACzB,IAEA,gBAAAA,MAAC,QAAG,WAAU,0BACX,iBAAO,SAAS,IAAI,CAAC,YACpB,gBAAAA,MAAC,QACC,0BAAAC,OAAC,eAAY,WAAU,WACrB;AAAA,sBAAAA,OAAC,SAAI,WAAU,2EACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,oCAAoC,aAAa,QAAQ,IAAI,IAAI,oBAAoB,EAAE;AAAA,YAEjG,YAAE,iBAAiB,QAAQ,IAAI,CAAC;AAAA;AAAA,QACnC;AAAA,QACA,gBAAAA,MAAC,OAAE,WAAU,iCACV,gCAAsB,QAAQ,UAAU,GAC3C;AAAA,SACF;AAAA,MAEA,gBAAAA,MAAC,OAAE,WAAU,sFACV,kBAAQ,SACX;AAAA,OACF,KAhBO,QAAQ,EAiBjB,CACD,GACH;AAAA,IAGD,SACC,gBAAAC,OAAC,eAAY,WAAU,oBACrB;AAAA,sBAAAD,MAAC,OAAE,WAAU,oCAAoC,YAAE,qBAAqB,GAAE;AAAA,MAC1E,gBAAAA,MAAC,OAAE,WAAU,8DACV,YAAE,oBAAoB,GACzB;AAAA,OACF,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,YAAU;AAAA,QACV,WAAU;AAAA,QACV,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,eAAK,KAAK;AAAA,QACZ;AAAA,QAEA;AAAA,0BAAAD,MAAC,WAAM,SAAS,SAAS,WAAU,uDAChC,YAAE,oBAAoB,GACzB;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU;AAAA,cACV,gBAAc,QAAQ,OAAO;AAAA,cAC7B,UAAU,CAAC,UAAU;AACnB,yBAAS,MAAM,OAAO,KAAK;AAC3B,yBAAS,IAAI;AAAA,cACf;AAAA,cACA,WAAW,GAAGE,MAAK;AAAA;AAAA,UACrB;AAAA,UACC,QAAQ,gBAAAF,MAAC,qBAAkB,SAAS,OAAO,IAAK;AAAA,UACjD,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU;AAAA,cACV,aAAW,QAAQ;AAAA,cACnB,WAAU;AAAA,cAET;AAAA,uBAAO,gBAAAD,MAAC,eAAY,WAAU,cAAa,IAAK;AAAA,gBAChD,OAAO,EAAE,kBAAkB,IAAI,EAAE,eAAe;AAAA;AAAA;AAAA,UACnD;AAAA;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;A7CvPiC,SASS,YAAAK,WATT,OAAAC,OAmBrB,QAAAC,cAnBqB;AAtIjC,IAAI;AAEG,SAAS,wBAAqD;AACnE,MAAI,iBAAiB,OAAW,gBAAe,yBAAyB,QAAQ;AAChF,SAAO;AACT;AAWO,SAAS,qBAA2B;AACzC,iBAAe;AACf,SAAO;AACT;AAGA,SAAS,gBAAgB,QAAiC;AACxD,QAAM,OAAO,IAAI,gBAAgB,MAAM;AACvC,OAAK,OAAO,KAAK;AACjB,OAAK,OAAO,OAAO;AAInB,OAAK,OAAO,SAAS;AACrB,QAAM,QAAQ,KAAK,SAAS;AAC5B,SAAO,QAAQ,IAAI,KAAK,KAAK;AAC/B;AAkBO,SAAS,YAAY,EAAE,OAAO,OAAO,SAAS,GAAqB;AACxE,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAS,IAAI,gBAAgB,SAAS,MAAM;AAClD,QAAM,YAAY,qBAAqB,SAAS,UAAU,MAAM;AAChE,QAAM,OAAO,mBAAmB,SAAS,UAAU,MAAM;AACzD,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAuB,EAAE,QAAQ,WAAW,CAAC;AAC3E,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAwB,IAAI;AACpE,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,CAAC;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,qBAAqB;AAE5D,EAAAC,WAAU,MAAM;AACd,QAAI,SAAS;AAMb,iCAA6B,UAAU,MAAM;AAc7C,SAAK,gBAAgB,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,WAAW;AACvD,UAAI,CAAC,OAAQ;AAEb,UAAI,OAAO,SAAS;AAGlB,mBAAW,mBAAmB,CAAC;AAC/B,mBAAW,EAAE,QAAQ,YAAY,CAAC;AAClC;AAAA,MACF;AAEA,UAAI,OAAO,WAAW,KAAK;AACzB,mBAAW,EAAE,QAAQ,aAAa,CAAC;AACnC;AAAA,MACF;AAEA,iBAAW;AAAA,QACT,QAAQ;AAAA,QACR,SAAS,OAAO,SAAS,KAAK,KAAK,EAAE,wBAAwB;AAAA,MAC/D,CAAC;AAAA,IACH,CAAC;AAED,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,UAAU,YAAY;AAC1B,kBAAc,IAAI;AAClB,oBAAgB,IAAI;AACpB,UAAM,SAAS,MAAM,gBAAgB,CAAC,QAAQ,IAAI,OAAO,CAAC;AAC1D,kBAAc,KAAK;AAOnB,QAAI,CAAC,OAAO,WAAW,OAAO,WAAW,QAAW;AAClD,sBAAgB,OAAO,SAAS,KAAK,KAAK,EAAE,uBAAuB,CAAC;AACpE;AAAA,IACF;AACA,eAAW,EAAE,QAAQ,aAAa,CAAC;AAAA,EACrC;AASA,MAAI,cAAc,KAAM,QAAO,gBAAAH,MAAC,YAAS,IAAI,GAAG,SAAS,GAAG,gBAAgB,MAAM,CAAC,IAAI,SAAO,MAAC;AAS/F,MAAI,KAAK,SAAS,cAAe,QAAO,gBAAAA,MAAAD,WAAA,EAAG,oBAAS;AAEpD,SACE,gBAAAC,MAAC,SACC,0BAAAC,OAAC,aAAQ,WAAU,iDAAgD,2BAAyB,QAAQ,QAClG;AAAA,oBAAAA,OAAC,SAAI,WAAU,wFACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,iDACX,YAAE,eAAe,GACpB;AAAA,MACC,QAAQ,WAAW,cAClB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,KAAK,QAAQ;AAAA,UAC5B,UAAU;AAAA,UACV,aAAW,cAAc;AAAA,UACzB,WAAU;AAAA,UAET;AAAA,yBAAa,gBAAAD,MAAC,eAAY,WAAU,kCAAiC,IAAK;AAAA,YAC1E,aAAa,EAAE,oBAAoB,IAAI,EAAE,iBAAiB;AAAA;AAAA;AAAA,MAC7D,IACE;AAAA,OACN;AAAA,IAEC,QAAQ,WAAW,aAClB,gBAAAA,MAAC,uBAAoB,MAAM,GAAG,OAAO,EAAE,yBAAyB,GAAG,IACjE;AAAA,IAEH,QAAQ,WAAW,eAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,YAAY,MAAM;AAKhB,qBAAW,mBAAmB,CAAC;AAC/B,qBAAW,EAAE,QAAQ,YAAY,CAAC;AAAA,QACpC;AAAA;AAAA,IACF,IACE;AAAA,IAEH,QAAQ,WAAW,YAClB,gBAAAA,MAAC,SAAI,WAAU,uCACb,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,QAAQ;AAAA,QACjB,SAAS,MAAM;AACb,qBAAW,EAAE,QAAQ,WAAW,CAAC;AACjC,wBAAc,CAAC,UAAU,QAAQ,CAAC;AAAA,QACpC;AAAA;AAAA,IACF,GACF,IACE;AAAA,IAEH,QAAQ,WAAW,cAClB,gBAAAA,MAAC,mBAAgB,MAAY,cAA4B,IACvD;AAAA,KACN,GACF;AAEJ;AAWA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AACF,GAGG;AAMD,QAAM,WAAW,KAAK,SAAS,UAAU,KAAK,MAAM;AACpD,QAAM,QAAQ,qBAAqB,QAAQ;AAC3C,QAAM,eAAe,uBAAuB,KAAK;AAEjD,SACE,gBAAAC,OAAC,wBAAqB,OAAO,OAC1B;AAAA,mBAAe,gBAAAD,MAAC,gBAAa,SAAS,cAAc,IAAK;AAAA,IAC1D,gBAAAA,MAAC,cAAW,MAAY,cAA4B;AAAA,IACpD,gBAAAA,MAAC,SAAI,WAAU,oBAAmB,wBAAsB,KAAK,SAAS,UAAU,KAAK,MAAM,KAAK,MAC9F,0BAAAA,MAAC,gBAAa,MAAY,GAC5B;AAAA,KACF;AAEJ;AAYA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AACF,GAGG;AACD,QAAM,YAA+B,KAAK,SAAS,UAC/C,KAAK,MACL,KAAK,SAAS,UACZ,WACA;AAEN,SACE,gBAAAA,MAAC,SAAI,WAAU,mDAAkD,cAAY,EAAE,kBAAkB,GAC9F,mCACE,OAAO,CAAC,QAAQ,oBAAoB,KAAK,cAAc,SAAS,CAAC,EACjE,IAAI,CAAC,QACJ,gBAAAA;AAAA,IAACI;AAAA,IAAA;AAAA,MAEC,IAAI,eAAe,GAAG;AAAA,MACtB,gBAAc,cAAc,MAAM,SAAS;AAAA,MAC3C,WAAW,yFAAyF,cAAc,MAAM,yBAAyB,EAAE;AAAA,MAElJ,YAAE,mBAAmB,GAAG,CAAC;AAAA;AAAA,IALrB;AAAA,EAMP,CACD,GACL;AAEJ;AAWA,IAAM,iBAA8E;AAAA,EAClF,UAAU,MAAM,gBAAAJ,MAAC,mBAAgB;AAAA,EACjC,QAAQ,MAAM,gBAAAA,MAAC,iBAAc;AAAA,EAC7B,WAAW,MAAM,gBAAAA,MAAC,oBAAiB;AAAA,EACnC,eAAe,MAAM,gBAAAA,MAAC,wBAAqB;AAAA,EAC3C,SAAS,MAAM,gBAAAA,MAAC,kBAAe;AAAA,EAC/B,WAAW,MAAM,gBAAAA,MAAC,oBAAiB;AAAA,EACnC,WAAW,MAAM,gBAAAA,MAAC,oBAAiB;AAAA,EACnC,SAAS,MAAM,gBAAAA,MAAC,kBAAe;AAAA,EAC/B,UAAU,MAAM,gBAAAA,MAAC,mBAAgB;AAAA,EACjC,UAAU,MAAM,gBAAAA,MAAC,mBAAgB;AACnC;AAEA,SAAS,aAAa,EAAE,KAAK,GAA0B;AACrD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,eAAe,KAAK,GAAG,EAAE;AAAA,IAClC,KAAK;AACH,aAAO,gBAAAA,MAAC,sBAAmB,SAAS,KAAK,SAAS;AAAA,IACpD,KAAK;AAMH,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,0BAA0B,EAAE,KAAK,EAAE,mBAAmB,KAAK,GAAG,CAAC,EAAE,CAAC;AAAA,UAC3E,MAAM,EAAE,uBAAuB;AAAA,UAC/B,QAAQ,gBAAAA,MAAC,gBAAa;AAAA;AAAA,MACxB;AAAA,IAEJ,KAAK;AAGH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe;AACtB,SACE,gBAAAA;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,IAAI,eAAe,UAAU;AAAA,MAC7B,WAAU;AAAA,MAET,YAAE,sBAAsB;AAAA;AAAA,EAC3B;AAEJ;","names":["useEffect","useState","Link","cookieValue","useRef","jsx","jsxs","jsx","useRef","useState","Link","jsx","jsxs","useState","Link","useEffect","useState","Link","isRecord","jsx","jsxs","useState","useEffect","Link","useState","jsx","jsxs","useState","useState","Link","jsx","jsxs","FIELD","Link","useState","Link","jsx","jsxs","Link","jsx","jsxs","useCallback","useEffect","useRef","useState","jsx","jsxs","FIELD","useState","useRef","useEffect","useCallback","useState","Link","jsx","jsxs","FIELD","Link","useState","useEffect","useId","useRef","useState","isRecord","readNullableString","jsx","jsxs","FIELD","useState","useRef","useEffect","useId","useState","Link","isRecord","Fragment","jsx","jsxs","useState","Link","useId","useState","isRecord","readNullableString","jsx","jsxs","FIELD","useState","useId","Fragment","jsx","jsxs","useState","useEffect","Link"]}
|