@fayz-ai/shop 0.55.2 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data/provider.d.ts +3 -1
- package/dist/data/provider.d.ts.map +1 -1
- package/dist/data/supabase-provider.d.ts +16 -1
- package/dist/data/supabase-provider.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/commerce.ts","../src/lib/optimize-upload.ts","../src/data/functions.ts","../src/data/checkout-gateways.ts","../src/data/customer-search.ts","../src/data/supabase-provider.ts","../src/shipping/label-provider.ts","../src/lib/document.ts","../src/lib/emails.ts","../src/lib/message-events.ts","../src/lib/image-delivery.ts"],"names":["canvas","ctx","payload","error"],"mappings":"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","file":"index.js","sourcesContent":["import { getShopProvider } from './runtime'\nimport type { ShopProvider } from '../data/provider'\nimport type {\n CartTotals, DiscountValidation, InventoryCheck, InventoryIssue, InventoryLine, Order,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Commerce primitive APIs (FAY-1193)\n//\n// Provider-agnostic helpers that custom app workflows call instead of re-deriving\n// discount/inventory/total logic. They take an explicit ShopProvider (default:\n// the configured runtime provider) so they work the same against mock or Supabase.\n//\n// NOTE: when run in the browser these compute the *advisory* answer (UI preview).\n// The authoritative values are recomputed server-side in the shop_place_order RPC\n// — the browser can never set what it pays.\n// ---------------------------------------------------------------------------\n\nfunction round2(n: number): number {\n return Math.round(n * 100) / 100\n}\n\n/** Validate a discount code against the provider: existence, status, date window, usage limit, supported type. */\nexport async function validateDiscount(\n input: { code: string; subtotal?: number; customerId?: string },\n provider: ShopProvider = getShopProvider(),\n): Promise<DiscountValidation> {\n const code = input.code.trim()\n if (!code) return { valid: false, code: null, type: null, value: 0, reason: 'empty' }\n\n // A porta certa primeiro: valida UM código no servidor. A listagem abaixo\n // continua para provider que não a tem (mock, broker), mas ela não serve à\n // vitrine — `anon` não pode ler a tabela, e se pudesse levaria todos os\n // cupons da loja para o navegador.\n if (typeof provider.validateDiscountCode === 'function') {\n return await provider.validateDiscountCode(code, input.subtotal)\n }\n\n const list = await provider.listDiscounts({ status: 'active' })\n const discount = list.find((d) => (d.code ?? '').toUpperCase() === code.toUpperCase())\n if (!discount) return { valid: false, code: null, type: null, value: 0, reason: 'not_found' }\n\n const now = new Date().toISOString()\n if (discount.startsAt > now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'not_started' }\n if (discount.endsAt && discount.endsAt < now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'expired' }\n if (discount.usageLimit != null && discount.timesUsed >= discount.usageLimit) {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'usage_limit' }\n }\n // Same gate shop_validate_discount applies (0057), so mock mode and the live\n // store refuse the same cart for the same reason.\n if (discount.minSubtotal != null && (input.subtotal ?? 0) < discount.minSubtotal) {\n return {\n valid: false, code: discount.code, type: discount.type, value: 0,\n reason: 'min_subtotal', minSubtotal: discount.minSubtotal,\n }\n }\n // free_shipping carries no monetary value — the cart zeroes freight by type,\n // and echoing the row's `value` here would discount the subtotal twice.\n if (discount.type === 'free_shipping') {\n return { valid: true, code: discount.code, type: discount.type, value: 0 }\n }\n if (discount.type !== 'percentage' && discount.type !== 'fixed_amount') {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'unsupported' }\n }\n return { valid: true, code: discount.code, type: discount.type, value: discount.value }\n}\n\n/** Apply a validated discount to a subtotal, clamped to [0, subtotal]. Pure. */\nexport function applyDiscount(validation: DiscountValidation, subtotal: number): { discountTotal: number; code: string | null } {\n if (!validation.valid) return { discountTotal: 0, code: null }\n if (validation.type === 'percentage') {\n return { discountTotal: round2(Math.min(subtotal, (subtotal * validation.value) / 100)), code: validation.code }\n }\n if (validation.type === 'fixed_amount') {\n return { discountTotal: round2(Math.min(subtotal, validation.value)), code: validation.code }\n }\n return { discountTotal: 0, code: validation.code }\n}\n\n/** Report out-of-stock / unavailable lines against current catalog inventory. No mutation. */\nexport async function checkInventory(\n lines: InventoryLine[],\n provider: ShopProvider = getShopProvider(),\n): Promise<InventoryCheck> {\n const issues: InventoryIssue[] = []\n for (const line of lines) {\n const product = await provider.getProduct(line.productId)\n if (!product || product.status !== 'active') {\n issues.push({ productId: line.productId, name: product?.name ?? line.productId, requested: line.quantity, available: 0 })\n continue\n }\n if (product.inventoryCount < line.quantity) {\n issues.push({ productId: line.productId, name: product.name, requested: line.quantity, available: product.inventoryCount })\n }\n }\n return { ok: issues.length === 0, issues }\n}\n\n/**\n * Recompute cart totals from authoritative catalog prices (ignores any client\n * unitPrice), applying a validated discount and shipping. Tax is 0 in v1 (hook).\n */\nexport async function computeCartTotals(\n input: { lines: InventoryLine[]; discountCode?: string; customerId?: string; shipping?: number },\n provider: ShopProvider = getShopProvider(),\n): Promise<CartTotals> {\n const lines: CartTotals['lines'] = []\n let subtotal = 0\n for (const line of input.lines) {\n const product = await provider.getProduct(line.productId)\n if (!product) continue\n const lineTotal = round2(product.price * line.quantity)\n subtotal += lineTotal\n lines.push({ productId: product.id, name: product.name, sku: product.sku, unitPrice: product.price, quantity: line.quantity, lineTotal })\n }\n subtotal = round2(subtotal)\n\n let discountTotal = 0\n let discountCode: string | null = null\n if (input.discountCode) {\n const applied = applyDiscount(\n await validateDiscount({ code: input.discountCode, subtotal, customerId: input.customerId }, provider),\n subtotal,\n )\n discountTotal = applied.discountTotal\n discountCode = applied.code\n }\n\n const shippingTotal = round2(Math.max(input.shipping ?? 0, 0))\n const taxTotal = 0\n const total = round2(Math.max(subtotal - discountTotal + shippingTotal + taxTotal, 0))\n return { lines, subtotal, discountTotal, discountCode, taxTotal, shippingTotal, total }\n}\n\n/** A customer's orders (scoped by id; RLS-enforced to the owner on Supabase). */\nexport async function getCustomerOrders(\n customerId: string,\n provider: ShopProvider = getShopProvider(),\n): Promise<Order[]> {\n return provider.listOrders({ customerId, limit: 100 })\n}\n","// ---------------------------------------------------------------------------\n// Optimisation at upload, in the browser, before a photo reaches storage.\n//\n// A merchant uploads what the camera gave her: a 4000×3000 JPEG of 6 MB. The\n// storefront serves variants of it (see ./image-delivery), so the ORIGINAL is\n// only ever the source for renders — and there is no reason for that source\n// to be six megabytes when a 2000-pixel WebP is visually the same and a tenth\n// of the size: it uploads faster on a café connection, it stores cheaper, and\n// the renderer resizes from something sane.\n//\n// Pure decision (`planUpload`) separated from the browser work\n// (`optimizeImageForUpload`), so the rule is testable without a canvas.\n// Anything this cannot or should not touch — a GIF (animation), an SVG, a\n// file that is already within bounds and small, an environment without\n// canvas — passes through untouched. Never worse than before.\n// ---------------------------------------------------------------------------\n\nexport interface OptimizeUploadOptions {\n /** The longest edge a source needs. 2000 px covers every slot the storefront draws, at 2×. */\n maxEdge?: number\n /** WebP quality, 0–1. */\n quality?: number\n /** Files at most this many bytes AND within bounds are kept as they are. */\n keepUnderBytes?: number\n}\n\nexport interface UploadPlan {\n action: 'keep' | 'reencode'\n /** Target dimensions when re-encoding. */\n width: number\n height: number\n reason: string\n}\n\nconst RE_ENCODABLE = new Set(['image/jpeg', 'image/png', 'image/webp', 'image/avif', 'image/heic', 'image/heif', 'image/tiff', 'image/bmp'])\n\n/** What to do with a file of this type/size/dimensions. */\nexport function planUpload(\n meta: { type: string; size: number; width: number; height: number },\n options: OptimizeUploadOptions = {},\n): UploadPlan {\n const maxEdge = options.maxEdge ?? 2000\n const keepUnder = options.keepUnderBytes ?? 400 * 1024\n const { type, size, width, height } = meta\n if (!RE_ENCODABLE.has(type)) {\n return { action: 'keep', width, height, reason: `${type || 'unknown type'} is left as uploaded (animation, vector, or not an image)` }\n }\n const scale = Math.min(1, maxEdge / Math.max(width, height))\n const target = { width: Math.max(1, Math.round(width * scale)), height: Math.max(1, Math.round(height * scale)) }\n if (scale === 1 && size <= keepUnder) {\n return { action: 'keep', ...target, reason: `already within ${maxEdge}px and ${Math.round(keepUnder / 1024)} kB` }\n }\n return {\n action: 'reencode',\n ...target,\n reason: scale < 1 ? `resized from ${width}×${height} to fit ${maxEdge}px` : `re-encoded (${Math.round(size / 1024)} kB source)`,\n }\n}\n\n/**\n * The file to upload: `file` itself, or a WebP re-encoding of it, per\n * `planUpload`. Browser-only; anywhere without `createImageBitmap` and a\n * canvas returns `file` unchanged.\n */\nexport async function optimizeImageForUpload(file: File, options: OptimizeUploadOptions = {}): Promise<File> {\n if (typeof createImageBitmap !== 'function') return file\n if (typeof OffscreenCanvas !== 'function' && typeof document === 'undefined') return file\n if (!file.type.startsWith('image/')) return file\n\n let bitmap: ImageBitmap\n try {\n // Camera photos carry their rotation in EXIF; decode honouring it, or a\n // portrait shot re-encodes sideways.\n bitmap = await createImageBitmap(file, { imageOrientation: 'from-image' })\n } catch {\n return file // undecodable here (HEIC on a browser without it, a corrupt file) — the server sees the original\n }\n\n const plan = planUpload({ type: file.type, size: file.size, width: bitmap.width, height: bitmap.height }, options)\n if (plan.action === 'keep') {\n bitmap.close()\n return file\n }\n\n const quality = options.quality ?? 0.82\n try {\n const blob = await drawToWebp(bitmap, plan.width, plan.height, quality)\n if (!blob || blob.size >= file.size) return file // no gain — keep the original bytes\n const base = file.name.replace(/\\.[a-z0-9]+$/i, '') || 'image'\n return new File([blob], `${base}.webp`, { type: 'image/webp', lastModified: file.lastModified })\n } catch {\n return file\n } finally {\n bitmap.close()\n }\n}\n\nasync function drawToWebp(bitmap: ImageBitmap, width: number, height: number, quality: number): Promise<Blob | null> {\n if (typeof OffscreenCanvas === 'function') {\n const canvas = new OffscreenCanvas(width, height)\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n ctx.drawImage(bitmap, 0, 0, width, height)\n return canvas.convertToBlob({ type: 'image/webp', quality })\n }\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n ctx.drawImage(bitmap, 0, 0, width, height)\n return new Promise((resolve) => canvas.toBlob(resolve, 'image/webp', quality))\n}\n","// Calling the store's edge functions from the BACK OFFICE.\n//\n// The storefront talks to them through the REST client, which carries its own\n// `functionsUrl`. The console talks through the Supabase client, whose URL is\n// derived from the project — enough in production, not enough in development,\n// where the acquirer's key may live in a local vault and a local bench answers\n// instead of the cloud. Hence the optional override, set by the app the same\n// way `setShopTenantResolver` is: the SDK reads nobody's env.\n\nlet _functionsUrl: string | null = null\n\nexport function setShopFunctionsUrl(url: string | null): void {\n _functionsUrl = url ? url.replace(/\\/+$/u, '') : null\n}\n\nexport function getShopFunctionsUrl(): string | null {\n return _functionsUrl\n}\n\n// The Fayz integration service (ADR 0003 phase 2). When set, the functions it\n// hosts are called there, by path, instead of as edge functions. Unset, every\n// call stays on the edge functions.\nlet _serviceUrl: string | null = null\n\nexport function setShopServiceUrl(url: string | null): void {\n _serviceUrl = url ? url.replace(/\\/+$/u, '') : null\n}\n\nexport function getShopServiceUrl(): string | null {\n return _serviceUrl\n}\n\n/** Edge function slug → the service route that replaced it. */\nexport const SERVICE_ROUTES: Readonly<Record<string, string>> = Object.freeze({\n 'mercadopago-checkout-open': '/v1/payments/mercadopago/checkout',\n 'mercadopago-checkout-settle': '/v1/payments/mercadopago/settle',\n 'stripe-checkout-open': '/v1/payments/stripe/checkout',\n 'stripe-checkout-settle': '/v1/payments/stripe/settle',\n 'shop-checkout-open': '/v1/payments/abacatepay/checkout',\n 'shop-checkout-settle': '/v1/payments/abacatepay/settle',\n 'shop-shipping-quote': '/v1/shipping/quote',\n})\n\n/**\n * Quanto tempo esperar antes de desistir.\n *\n * Não havia limite nenhum, e o custo aparecia exatamente onde dói: o adquirente\n * demorava, a tela ficava rodando sem dizer nada, e o poll de 4 em 4 segundos\n * empilhava chamadas em cima da que ainda não voltou. Um teto transforma \"a\n * tela travou\" numa frase que o lojista pode ler e agir.\n */\nconst DEFAULT_TIMEOUT_MS = 25_000\n\n/** Answers `ok` apart from the body: a refusal carries a message worth showing. */\nexport async function callShopFunction(\n db: any,\n slug: string,\n body: Record<string, unknown>,\n options?: { timeoutMs?: number },\n): Promise<{ ok: boolean; status: number; payload: any }> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n let timer: ReturnType<typeof setTimeout> | undefined\n const bounded = <T>(work: Promise<T>): Promise<T> => Promise.race([\n work,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`A função ${slug} não respondeu em ${Math.round(timeoutMs / 1000)}s.`)),\n timeoutMs,\n )\n }),\n ]).finally(() => { if (timer) clearTimeout(timer) })\n const service = getShopServiceUrl()\n const servicePath = SERVICE_ROUTES[slug]\n const override = service && servicePath ? null : getShopFunctionsUrl()\n if ((service && servicePath) || override) {\n const target = service && servicePath ? `${service}${servicePath}` : `${override}/${slug}`\n // The session token rides along, exactly as functions.invoke would attach\n // it. A function that guards on membership (labels spend money) refuses\n // every call without it, and the bench would look broken when it is not.\n let token: string | null = null\n try {\n token = (await db?.auth?.getSession?.())?.data?.session?.access_token ?? null\n } catch {\n /* signed out, or a client without auth: the function decides */\n }\n let response: Response\n try {\n response = await bounded(fetch(target, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n },\n body: JSON.stringify(body),\n }))\n } catch (cause) {\n // A bancada desligada é o caso comum aqui, e o navegador conta a pior\n // versão dessa história: o preflight não completa, o console diz \"CORS\",\n // e a tela mostra \"Failed to fetch\" — três nomes para \"não tem ninguém\n // atendendo nessa porta\". O override é ajuste de máquina de quem\n // desenvolve, então a frase pode dizer exatamente isso.\n // `cause` não entra: o alvo de compilação desta biblioteca é anterior a\n // ele, e a mensagem já carrega o que se pode agir.\n void cause\n if (!override) throw new Error(`O serviço de integrações não respondeu (${slug}). Tente de novo.`)\n throw new Error(\n `A bancada de funções em ${override} não respondeu (${slug}). ` +\n 'Suba-a, ou tire PUBLIC_SUPABASE_FUNCTIONS_URL do .env para usar as funções publicadas.',\n )\n }\n const payload = await response.json().catch(() => null)\n return { ok: response.ok, status: response.status, payload }\n }\n\n const { data, error } = await bounded<{ data: any; error: any }>(db.functions.invoke(slug, { body }))\n if (!error) return { ok: true, status: 200, payload: data }\n\n // supabase-js hides the function's own body inside the error context. Without\n // digging it out, a refusal written for the merchant reads as \"Edge Function\n // returned a non-2xx status code\".\n const status = Number((error as any)?.context?.status ?? 502)\n let payload: any = null\n try {\n payload = await (error as any)?.context?.json?.()\n } catch {\n /* non-JSON body: the status stands */\n }\n return { ok: false, status, payload: payload ?? { error: error.message } }\n}\n","// Which edge function charges for which acquirer.\n//\n// This table is what replaces the sentence that used to sit in CheckoutPage:\n// *\"a função tem UM provedor gravado dentro dela: pedir a ela uma cobrança de\n// outro adquirente não dá cobrança errada, dá erro na cara do comprador.\"* That\n// is still true of each function — they disagree about their body, their host,\n// their credential and their status vocabulary, so they are separate functions —\n// and a store with two acquirers on the shelf needs something that knows which\n// door to knock on.\n//\n// It is a MAP and not a switch, and it lives here rather than in the storefront,\n// because three places were about to hold the same list: the page that decides\n// whether the buyer sees a QR code at all, and the two provider methods that\n// call the functions. A gateway present in one and missing from another is a\n// checkout that offers to charge and then cannot.\n//\n// A provider absent from this table is not broken — it is an acquirer the\n// merchant selected for their own records, whose money arrives some other way.\n// The buyer is then routed to the no-charge path and the order stays `pending`\n// until the merchant confirms, which is exactly what happened before any gateway\n// existed.\n\n/** The pair of functions one acquirer needs: one to open a charge, one to settle it. */\nexport interface CheckoutGateway {\n /** Reprices the cart, freezes a session and opens the charge. Creates no order. */\n open: string\n /** Asks the acquirer whether the money landed, and writes the order if it did. */\n settle: string\n /**\n * Whether this acquirer can hand back a PAYMENT LINK — one URL, hosted by the\n * provider, that a merchant copies and sends to a customer who is not at the\n * counter and not on the site.\n *\n * A capability and not a second gateway, because everything around it is\n * already shared: the same `open` function mints it, the same session freezes\n * the cart, the same `settle` writes the order when the webhook lands. What\n * differs is one flag on the request and one field on the answer.\n *\n * It is declared rather than assumed because it is genuinely not universal.\n * AbacatePay's session path opens a transparent Pix and answers with a code,\n * not an address; giving the panel a \"gerar link\" button for it would offer a\n * link no function can produce. When that changes, this flag changes with it —\n * in one place, next to the functions it describes.\n */\n link: boolean\n /**\n * Whether this acquirer can charge a CARD at all.\n *\n * Not a store setting and not a merchant preference: a property of the\n * acquirer's own account world. AbacatePay discontinued card for new clients\n * and new integrations — it survives only for accounts that had already taken\n * real production card money before the cutoff — so for every store this repo\n * connects today the answer is no, and no toggle in Loja → Integrações can\n * change it.\n *\n * It earns a flag because asking anyway is not a soft failure.\n * `/checkouts/create` rejects the WHOLE request when CARD is among `methods`,\n * so a Pix payment link that politely also offered card came back as an error\n * instead of as a link. Declaring the capability here keeps it next to the\n * functions that act on it, and lets the storefront send the buyer down the\n * no-charge path — the maquininha at the door — before a charge is attempted.\n */\n card: boolean\n /**\n * What to CALL this acquirer in front of a buyer.\n *\n * The slug is ours and reads like an internal id (`abacatepay`); the name on\n * the button is the one printed on the page the buyer is about to land on, and\n * a mismatch there is what makes a redirect feel like a hijack. It lives with\n * the rest of the acquirer's facts so a screen never has to keep its own map.\n */\n label: string\n}\n\n/**\n * Every acquirer this repo can actually charge with, by the slug stored in\n * `plg_shop_settings.payment_provider` — which is the `ConnectorDefinition.id`,\n * not the catalogue slug.\n *\n * AppMax is deliberately absent. Its pair (`shop-checkout-pay` /\n * `shop-payment-status`) belongs to the older shape where the order was written\n * BEFORE the charge, so it does not answer this contract; it is reached by its\n * own path and is not a session gateway.\n *\n */\nconst GATEWAYS: Readonly<Record<string, CheckoutGateway>> = Object.freeze({\n abacatepay: Object.freeze({ open: 'shop-checkout-open', settle: 'shop-checkout-settle', link: true, card: false, label: 'AbacatePay' }),\n vindi: Object.freeze({ open: 'vindi-checkout-open', settle: 'vindi-checkout-settle', link: true, card: true, label: 'Vindi' }),\n // The first acquirer here that charges a card IN THE STORE: Mercado Pago\n // tokenises in the browser, so no PAN crosses the pool and card needs no\n // hosted page. `link: false` because nothing mints a shareable URL yet.\n mercadopago: Object.freeze({ open: 'mercadopago-checkout-open', settle: 'mercadopago-checkout-settle', link: false, card: true, label: 'Mercado Pago' }),\n // Stripe: card, Pix and boleto are all paid on Stripe's hosted Checkout\n // page, and a page URL is a shareable link for up to 24 hours. Keyed by the\n // ConnectorDefinition id, which carries the \"-connect\" the catalogue slug\n // does not.\n 'stripe-connect': Object.freeze({ open: 'stripe-checkout-open', settle: 'stripe-checkout-settle', link: true, card: true, label: 'Stripe' }),\n})\n\n/**\n * The acquirers a storefront may offer an online charge for.\n *\n * Derived from the table rather than written beside it: a gateway added to one\n * and forgotten in the other is the failure this module exists to make\n * impossible.\n */\nexport const CHARGEABLE_PROVIDERS: readonly string[] = Object.freeze(Object.keys(GATEWAYS))\n\n/** Whether this acquirer can take money online here. */\nexport function isChargeableProvider(provider: string | null | undefined): boolean {\n return checkoutGateway(provider) !== null\n}\n\n/**\n * Whether this acquirer can mint a link the merchant sends to a customer.\n *\n * Asked by the panel BEFORE it offers the button, so a store whose gateway\n * cannot do it never sees an action that would fail. The question is about the\n * acquirer and never about the order — an order is paid by whoever the store\n * connected, and the screen that shows it should not learn four provider names\n * to decide what to render.\n */\nexport function supportsPaymentLink(provider: string | null | undefined): boolean {\n return checkoutGateway(provider)?.link === true\n}\n\n/**\n * Whether this acquirer can take CARD money online here.\n *\n * Asked before the card option is offered as an online charge, so a store whose\n * acquirer cannot do it never reaches the provider to be told no. False is not\n * \"card is refused\" — the buyer still picks card and still gets an order; it is\n * paid the way card was always paid before any gateway existed.\n */\nexport function supportsCard(provider: string | null | undefined): boolean {\n return checkoutGateway(provider)?.card === true\n}\n\n/**\n * The acquirer's name as a buyer should read it, or null when we have none.\n *\n * Null rather than the slug, so a caller decides what to say about an acquirer\n * this table does not carry — \"pagar\" beats \"pagar com stripe-connect\".\n */\nexport function gatewayLabel(provider: string | null | undefined): string | null {\n return checkoutGateway(provider)?.label ?? null\n}\n\n/**\n * The pair for an acquirer, or null.\n *\n * Null for an unknown provider AND for an absent one, because they mean the same\n * thing to every caller: there is no online charge, take the other path. An\n * empty string is the merchant's explicit *\"eu confirmo à mão\"* and lands here\n * too — see `resolvePaymentProvider`, which treats it as a decision rather than\n * an absence.\n */\nexport function checkoutGateway(provider: string | null | undefined): CheckoutGateway | null {\n const slug = String(provider ?? '').trim()\n if (!slug) return null\n return GATEWAYS[slug] ?? null\n}\n\n/**\n * Qual adquirente cobra: o que a chamada pediu, senão o que a LOJA configurou,\n * senão AbacatePay.\n *\n * A última perna é herança, não escolha: era o padrão de quando havia um\n * gateway só, e uma loja antiga sem o ajuste preenchido continua cobrando como\n * sempre cobrou. O bug que isto fecha é a perna do MEIO nunca ter existido —\n * nenhuma tela do console passava o provedor, então uma loja na Vindi abria a\n * cobrança na AbacatePay, que não conhece a conta dela.\n *\n * `null` e ausente querem dizer a mesma coisa: \"não escolhi\".\n */\nexport function resolveCheckoutProvider(\n explicit: string | null | undefined,\n configured: string | null | undefined,\n): string {\n const asked = String(explicit ?? '').trim()\n if (asked) return asked\n const store = String(configured ?? '').trim()\n return store || 'abacatepay'\n}\n","// ---------------------------------------------------------------------------\n// Finding a customer by what the merchant actually types.\n//\n// The console searched with ONE `or()` over the whole string, so \"maria silva\"\n// was matched against first_name, last_name and email as a single value and\n// found nobody — the customer was there, spelled exactly like that, split over\n// two columns. Every word now has to match SOMETHING, and the words are ANDed:\n// \"maria silva\" needs maria in one column and silva in another.\n// ---------------------------------------------------------------------------\n\nconst COLUMNS = ['first_name', 'last_name', 'email', 'phone'] as const\n\n/** One PostgREST `or()` expression per word. Chained, they AND together. */\nexport function customerSearchFilters(term: string | undefined | null): string[] {\n return String(term ?? '')\n .trim()\n .split(/\\s+/u)\n // PostgREST reads these as syntax, and a stray comma would split the filter\n // into two conditions the caller never wrote.\n .map((word) => word.replace(/[%,()]/gu, ''))\n .filter(Boolean)\n .map((word) => COLUMNS.map((column) => `${column}.ilike.%${word}%`).join(','))\n}\n","import { optimizeImageForUpload } from '../lib/optimize-upload'\nimport { emitOrderEvent } from '../lib/order-events'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { resolveEntityStore } from '../entities/entity-store'\nimport type { EntityRecord, EntityRecordInput, ListEntityRecordsOptions } from '../entities/entity-store'\nimport { createSupabaseEntityStore } from '../entities/supabase-entity-store'\nimport type { ShopProvider } from './provider'\nimport type { ComputeAction, RuleCartSnapshot } from '../rules/rule-types'\nimport { getShopTenantId } from './tenant'\nimport { callShopFunction } from './functions'\nimport { checkoutGateway, resolveCheckoutProvider } from './checkout-gateways'\nimport { customerSearchFilters } from './customer-search'\nimport { T, V } from './tables'\nimport { displayNameOf, mediaKindOf, mergeMediaFiles, productImageToMediaFile, storagePathOf } from './media'\nimport { resolveStockStore } from '../inventory/stock-store'\nimport { createSupabaseStockStore, rowToStockLocation } from '../inventory/supabase-stock-store'\nimport type {\n StockLocation, CreateStockLocationInput, UpdateStockLocationInput,\n} from '../inventory/stock-types'\nimport { OPENING_BALANCE_REASON } from '../inventory/vocabulary'\nimport { normalizeVariantAxes, validateVariantAxes, variantOptionsKey } from '../lib/variant-matrix'\nimport type {\n Product, ProductImage, ProductOption, ProductOptionInput, ProductVariant, ProductVariantSet,\n CreateProductVariantInput, UpdateProductVariantInput, Category,\n Order, ShopCustomer, Discount,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateCategoryInput, UpdateCategoryInput,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions, PlaceOrderInput,\n CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput,\n CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions, OrderItem,\n CheckoutSessionInput, CheckoutSession, CheckoutSettlement, ShippingQuoteOption, CustomerAddress, ShippingAgency,\n SalesChannel, CreateSalesChannelInput, UpdateSalesChannelInput,\n ShippingZone, CreateShippingZoneInput, UpdateShippingZoneInput,\n ShippingProfile, CreateShippingProfileInput, UpdateShippingProfileInput,\n ShippingPackage, ShippingPackageKind, CreateShippingPackageInput, UpdateShippingPackageInput,\n ShippingSettings, UpdateShippingSettingsInput,\n StoreSettings, UpdateStoreSettingsInput, PaymentMethodKind, CheckoutFieldKey, CheckoutFieldPolicy,\n DeliveryCheck,\n FulfillmentType, ServiceStatus, ServiceHours, ScheduleSlot,\n PostalAddressHint,\n AreaCandidate,\n Collection, CreateCollectionInput, UpdateCollectionInput, CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput, CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, GiftCard, CreateGiftCardInput, UpdateGiftCardInput, EmailTemplate, UpsertEmailTemplateInput, MediaFile, MarketPrice, ShopMarket, AdminShopMarket, CatalogMarketPrice } from '../types'\n\nfunction getDb(): any {\n const supabase = getSupabaseClientOptional()\n if (!supabase) throw new Error('@fayz-ai/shop: Supabase client not initialized. Call setGlobalSupabaseClient() first.')\n return supabase\n}\n\nconst getTenantId = getShopTenantId\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction asUuid(value: string | null | undefined): string | null {\n if (!value) return null\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n ? value\n : null\n}\n\n/** 8 bare digits, zero-padded — the shape shipping_zones stores and compares. */\nfunction toPostalDigits(value: string | undefined | null): string | undefined {\n const digits = String(value ?? '').replace(/\\D/g, '')\n return digits ? digits.padStart(8, '0').slice(0, 8) : undefined\n}\n\nfunction rowToVariant(row: any): ProductVariant {\n return {\n id: row.id,\n productId: row.product_id,\n options: row.options && typeof row.options === 'object' ? row.options : {},\n sku: row.sku ?? null,\n // numeric(12,2) arrives as a string on the wire; Number() once, here.\n price: row.price == null ? null : Number(row.price),\n compareAtPrice: row.compare_at_price == null ? null : Number(row.compare_at_price),\n inventoryCount: row.inventory_count ?? 0,\n position: row.position ?? 0,\n status: row.status ?? 'active',\n imageId: row.image_id ?? null,\n isDefaultVariant: row.is_default_variant ?? false,\n // Null inherits the product's, the way `price` has since 0028.\n weight: numOrNull(row.weight),\n weightUnit: row.weight_unit ?? null,\n heightCm: numOrNull(row.height_cm),\n widthCm: numOrNull(row.width_cm),\n lengthCm: numOrNull(row.length_cm),\n }\n}\n\n/**\n * The writable variant columns, and only the ones actually present in the input\n * — `undefined` must mean \"leave it\" while `null` means \"clear it\", because on\n * this table null is the load-bearing value: it is what \"inherit the product's\"\n * is spelled as, for price since 0028 and for the dimensions since 0046.\n */\nfunction variantPatch(input: UpdateProductVariantInput): Record<string, unknown> {\n const patch: Record<string, unknown> = {}\n // What the SHOP owns. `sku` and `price` are gone from here: 0086 dropped them\n // from plg_shop_product_variants because a variant's identity belongs to\n // public.product_variants (ADR 0024). They are routed by `variantCorePatch`.\n const map: Record<string, string> = {\n compareAtPrice: 'compare_at_price', position: 'position',\n status: 'status', imageId: 'image_id', weight: 'weight', weightUnit: 'weight_unit',\n heightCm: 'height_cm', widthCm: 'width_cm', lengthCm: 'length_cm',\n }\n for (const [key, column] of Object.entries(map)) {\n const value = (input as Record<string, unknown>)[key]\n if (value === undefined) continue\n patch[column] = value\n }\n return patch\n}\n\n/**\n * The other half of the same input: what `public.product_variants` owns.\n *\n * 0086 dropped `sku`, `price` and `options` from the shop's extension, and\n * `shop_ensure_default_variant` was rewritten to write the archetype row plus\n * an extension pointing at it. This path — a variant a MERCHANT creates, with\n * options — was not, so saving one failed on \"Could not find the 'options'\n * column of 'plg_shop_product_variants' in the schema cache\".\n */\nfunction variantCorePatch(input: UpdateProductVariantInput): Record<string, unknown> {\n const patch: Record<string, unknown> = {}\n if (input.sku !== undefined) {\n // A blank SKU is NO sku. 0028's unique index is partial on `sku IS NOT NULL`,\n // so two variants left empty in the grid would collide on '' instead.\n patch.sku = typeof input.sku === 'string' && input.sku.trim() === '' ? null : input.sku\n }\n if (input.price !== undefined) patch.price = input.price\n const options = (input as { options?: Record<string, string> }).options\n if (options !== undefined) {\n patch.attributes = options\n patch.name = variantDisplayName(options)\n }\n if (input.status !== undefined) patch.is_active = input.status === 'active'\n if (input.position !== undefined) patch.sort_order = input.position\n return patch\n}\n\n/** \"GG / Azul\" — the archetype requires a name, and the options ARE the name of\n * a variant. Falls back rather than writing an empty string. */\nfunction variantDisplayName(options: Record<string, string>): string {\n const parts = Object.values(options ?? {}).filter(Boolean)\n return parts.length > 0 ? parts.join(' / ') : 'Variante'\n}\n\n/**\n * plg_shop_settings → StoreSettings, and the reason this is not a `{...row}`\n * spread: EVERY absent column has to come back as `undefined`, not as `false` or\n * `[]`. `undefined` is how the whole stack says \"the merchant has not decided\",\n * which is what keeps eight live storefronts on their existing behaviour. A\n * mapper that coalesced to false would silently turn every unset toggle into a\n * decision to turn it off.\n *\n * The RPC (shop_store_settings) returns a SUBSET of these columns, so the same\n * mapper serves both reads: a key the RPC does not select is simply undefined.\n */\nfunction rowToStoreSettings(row: any): StoreSettings {\n const bool = (v: unknown): boolean | undefined => (v == null ? undefined : Boolean(v))\n const methods = Array.isArray(row.payment_methods) && row.payment_methods.length > 0\n ? (row.payment_methods as PaymentMethodKind[])\n : undefined\n const fields = row.checkout_fields && typeof row.checkout_fields === 'object' && Object.keys(row.checkout_fields).length > 0\n ? (row.checkout_fields as Partial<Record<CheckoutFieldKey, CheckoutFieldPolicy>>)\n : undefined\n return {\n // O jsonb já vem na forma de ShippingAddressInput (a 0094 guarda assim\n // justamente para não traduzir aqui). Objeto vazio conta como ausente:\n // um endereço sem rua não é um balcão.\n pickupAddress: row.pickup_address && typeof row.pickup_address === 'object'\n && Object.keys(row.pickup_address).length > 0\n ? (row.pickup_address as StoreSettings['pickupAddress'])\n : undefined,\n currency: row.currency ?? undefined,\n locale: row.locale ?? undefined,\n showOutOfStock: bool(row.show_out_of_stock),\n requireSku: bool(row.require_sku),\n stockOwnership: row.stock_ownership ?? undefined,\n paymentMethods: methods,\n paymentProvider: row.payment_provider ?? undefined,\n guestCheckout: bool(row.guest_checkout),\n requireConfirmedEmail: bool(row.require_confirmed_email),\n marketingOptIn: bool(row.marketing_opt_in),\n discountsEnabled: bool(row.discounts_enabled),\n checkoutFields: fields,\n autoFulfill: row.auto_fulfill ?? undefined,\n notifyNewOrder: bool(row.notify_new_order),\n notifyLowStock: bool(row.notify_low_stock),\n handlingNote: row.handling_note ?? undefined,\n carrierQuotes: bool(row.carrier_quotes),\n receivingAccounts: row.receiving_accounts && typeof row.receiving_accounts === 'object'\n && Object.keys(row.receiving_accounts).length > 0\n ? (row.receiving_accounts as StoreSettings['receivingAccounts'])\n : undefined,\n }\n}\n\n/**\n * The write side of the same asymmetry: only keys the caller actually passed are\n * sent. A screen that renders one section must be able to save that section\n * without restating — and thereby overwriting — every other one.\n */\nfunction storeSettingsPayload(input: UpdateStoreSettingsInput): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.currency !== undefined) payload.currency = input.currency\n if (input.locale !== undefined) payload.locale = input.locale\n if (input.showOutOfStock !== undefined) payload.show_out_of_stock = input.showOutOfStock\n if (input.requireSku !== undefined) payload.require_sku = input.requireSku\n if (input.stockOwnership !== undefined) payload.stock_ownership = input.stockOwnership\n if (input.paymentMethods !== undefined) payload.payment_methods = input.paymentMethods\n // '' is STORED, not turned into NULL: it is the merchant answering \"nenhum,\n // confirmo à mão\", and NULL is never having answered. Collapsing the two made\n // the payments screen re-adopt the connected gateway on the next load, so the\n // choice could not be made at all.\n if (input.paymentProvider !== undefined) payload.payment_provider = input.paymentProvider ?? null\n if (input.guestCheckout !== undefined) payload.guest_checkout = input.guestCheckout\n if (input.requireConfirmedEmail !== undefined) payload.require_confirmed_email = input.requireConfirmedEmail\n if (input.marketingOptIn !== undefined) payload.marketing_opt_in = input.marketingOptIn\n if (input.discountsEnabled !== undefined) payload.discounts_enabled = input.discountsEnabled\n if (input.checkoutFields !== undefined) payload.checkout_fields = input.checkoutFields ?? {}\n if (input.autoFulfill !== undefined) payload.auto_fulfill = input.autoFulfill\n if (input.notifyNewOrder !== undefined) payload.notify_new_order = input.notifyNewOrder\n if (input.notifyLowStock !== undefined) payload.notify_low_stock = input.notifyLowStock\n if (input.handlingNote !== undefined) payload.handling_note = input.handlingNote || null\n if (input.carrierQuotes !== undefined) payload.carrier_quotes = input.carrierQuotes\n if (input.receivingAccounts !== undefined) payload.receiving_accounts = input.receivingAccounts ?? {}\n return payload\n}\n\nfunction rowToShippingZone(row: any): ShippingZone {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n carrier: row.carrier ?? null,\n // A pool that has not reached 0081 answers undefined on both: a rule with no\n // declared matcher is a postal range that delivers, which is what every row\n // written before 0081 is.\n matchKind: row.match_kind ?? 'postal_range',\n cityCode: row.city_code ?? null,\n districtKey: row.district_key ?? null,\n outcome: row.outcome ?? (row.excluded ? 'refuse' : 'deliver'),\n postalFrom: row.postal_from == null ? null : String(row.postal_from).trim(),\n postalTo: row.postal_to == null ? null : String(row.postal_to).trim(),\n rate: Number(row.rate ?? 0),\n freeAbove: row.free_above == null ? null : Number(row.free_above),\n etaMinDays: row.eta_min_days ?? null,\n etaMaxDays: row.eta_max_days ?? null,\n active: row.active ?? true,\n sortOrder: row.sort_order ?? 0,\n excluded: row.excluded ?? false,\n profileId: row.profile_id ?? null,\n }\n}\n\nfunction rowToShippingProfile(row: any): ShippingProfile {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n // undefined, never false: NULL means \"inherit the store's decision\", and a\n // mapper that coalesced would turn every new profile into one that refuses\n // the gateway.\n carrierQuotes: row.carrier_quotes == null ? undefined : Boolean(row.carrier_quotes),\n isDefault: row.is_default ?? false,\n }\n}\n\nfunction shippingProfilePayload(input: Partial<CreateShippingProfileInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.carrierQuotes !== undefined) payload.carrier_quotes = input.carrierQuotes ?? null\n if (input.isDefault !== undefined) payload.is_default = input.isDefault\n return payload\n}\n\n/** 8 bare digits, or null for \"not told yet\". Refuses a half-typed postcode\n * instead of storing it — 0058's CHECK would refuse it anyway, in Postgrese. */\nfunction toOriginPostalCode(raw: string | null | undefined): string | null {\n const digits = String(raw ?? '').replace(/\\D/g, '')\n if (!digits) return null\n if (digits.length !== 8) throw new Error('O CEP do local precisa ter 8 dígitos.')\n return digits\n}\n\n/** A stable handle for imports and ERP connectors, derived from the name so the\n * merchant is never asked for one. */\nfunction toLocationCode(name: string): string {\n const slug = name.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 40)\n return slug || 'local'\n}\n\n/**\n * The two refusals a merchant can actually trigger, said in Portuguese. Both\n * come back as Postgres codes the settings screen would otherwise print raw.\n */\nfunction locationWriteError(error: { code?: string; message?: string }): Error {\n if (error?.code === '23505') return new Error('Já existe um local com esse nome.')\n if (error?.code === '23503') {\n return new Error(\n 'Este local já tem movimentações de estoque. Arquive-o em vez de excluir — o histórico aponta para ele.',\n )\n }\n return new Error(error?.message ?? 'Não foi possível salvar o local.')\n}\n\nfunction stockLocationPayload(input: Partial<CreateStockLocationInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.code !== undefined) payload.code = input.code\n if (input.kind !== undefined) payload.kind = input.kind\n if (input.isSellable !== undefined) payload.is_sellable = input.isSellable\n if (input.isDefault !== undefined) payload.is_default = input.isDefault\n if (input.status !== undefined) payload.status = input.status\n if (input.postalCode !== undefined) payload.postal_code = toOriginPostalCode(input.postalCode)\n if (input.city !== undefined) payload.city = input.city || null\n if (input.state !== undefined) payload.state = input.state || null\n if (input.street !== undefined) payload.street = input.street || null\n // What a carrier label needs on top of a postcode (0061).\n if (input.number !== undefined) payload.number = input.number || null\n if (input.district !== undefined) payload.district = input.district || null\n if (input.complement !== undefined) payload.complement = input.complement || null\n if (input.document !== undefined) payload.document = String(input.document ?? '').replace(/\\D/gu, '') || null\n if (input.phone !== undefined) payload.phone = String(input.phone ?? '').replace(/\\D/gu, '') || null\n if (input.email !== undefined) payload.email = input.email || null\n if (input.carrierAgencies !== undefined) payload.carrier_agencies = input.carrierAgencies ?? {}\n if (input.shipsOnline !== undefined) payload.ships_online = input.shipsOnline\n if (input.fulfillmentProvider !== undefined) {\n payload.fulfillment_provider = input.fulfillmentProvider || null\n }\n return payload\n}\n\n/**\n * The address hint, in the snake_case shape shop_resolve_area reads. Null when\n * there is nothing useful to say — an empty object would look like a claim.\n */\nfunction addressHintPayload(hint?: PostalAddressHint): Record<string, unknown> | null {\n if (!hint) return null\n const out: Record<string, unknown> = {}\n if (hint.district) out.district = hint.district\n if (hint.city) out.city = hint.city\n if (hint.state) out.state = hint.state\n if (hint.cityCode) out.city_code = hint.cityCode\n return Object.keys(out).length > 0 ? out : null\n}\n\nfunction shippingZonePayload(input: Partial<CreateShippingZoneInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.carrier !== undefined) payload.carrier = input.carrier || null\n if (input.matchKind != null) payload.match_kind = input.matchKind\n if (input.cityCode !== undefined) payload.city_code = input.cityCode || null\n if (input.districtKey !== undefined) payload.district_key = input.districtKey || null\n if (input.outcome != null) payload.outcome = input.outcome\n // Null, not '': a city/district rule has no range, and toPostalDigits would\n // left-pad the empty string into '00000000' and match Acre. 0081 drops the\n // NOT NULL on both columns for exactly this.\n if (input.postalFrom !== undefined)\n payload.postal_from = input.postalFrom ? toPostalDigits(input.postalFrom) : null\n if (input.postalTo !== undefined)\n payload.postal_to = input.postalTo ? toPostalDigits(input.postalTo) : null\n // `!= null` on every NOT NULL WITH DEFAULT column — match_kind and outcome\n // from 0081, rate/active/sort_order/excluded from 0021. A column default only\n // applies when the column is ABSENT from the INSERT; an explicit null is\n // refused, not defaulted. The admin form sends null for an optional field\n // nobody touched, which is how an empty «Ordem» became `null value in column\n // \"sort_order\" violates not-null`. Null here means \"leave it to the column\".\n if (input.rate != null) payload.rate = input.rate\n if (input.freeAbove !== undefined) payload.free_above = input.freeAbove ?? null\n if (input.etaMinDays !== undefined) payload.eta_min_days = input.etaMinDays ?? null\n if (input.etaMaxDays !== undefined) payload.eta_max_days = input.etaMaxDays ?? null\n if (input.active != null) payload.active = input.active\n if (input.sortOrder != null) payload.sort_order = input.sortOrder\n if (input.excluded != null) payload.excluded = input.excluded\n if (input.profileId !== undefined) payload.profile_id = input.profileId ?? null\n return payload\n}\n\nfunction rowToShippingPackage(row: any): ShippingPackage {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n kind: (row.kind ?? 'box') as ShippingPackageKind,\n heightCm: Number(row.height_cm ?? 0),\n widthCm: Number(row.width_cm ?? 0),\n lengthCm: Number(row.length_cm ?? 0),\n emptyWeightGrams: Number(row.empty_weight_grams ?? 0),\n isDefault: row.is_default ?? false,\n active: row.active ?? true,\n }\n}\n\nfunction shippingPackagePayload(input: Partial<CreateShippingPackageInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.kind !== undefined) payload.kind = input.kind\n if (input.heightCm !== undefined) payload.height_cm = input.heightCm\n if (input.widthCm !== undefined) payload.width_cm = input.widthCm\n if (input.lengthCm !== undefined) payload.length_cm = input.lengthCm\n if (input.emptyWeightGrams !== undefined) payload.empty_weight_grams = input.emptyWeightGrams\n if (input.isDefault !== undefined) payload.is_default = input.isDefault\n if (input.active !== undefined) payload.active = input.active\n return payload\n}\n\nfunction rowToProduct(row: any): Product {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n seoTitle: row.seo_title ?? null,\n seoDescription: row.seo_description ?? null,\n description: row.description,\n price: row.price ?? 0,\n compareAtPrice: row.compare_at_price,\n currency: row.currency ?? 'BRL',\n status: row.status ?? 'active',\n inventoryCount: row.inventory_count ?? 0,\n sku: row.sku,\n sortOrder: row.sort_order ?? 0,\n metadata: row.metadata ?? {},\n images: Array.isArray(row.images) ? row.images.map(rowToImage) : [],\n categoryId: row.category_id,\n categoryName: row.category_name ?? null,\n isPhysical: row.is_physical ?? true,\n weight: row.weight,\n weightUnit: row.weight_unit ?? 'kg',\n heightCm: numOrNull(row.height_cm),\n widthCm: numOrNull(row.width_cm),\n lengthCm: numOrNull(row.length_cm),\n packageId: row.package_id ?? null,\n handling: Array.isArray(row.handling) ? row.handling : [],\n shippingProfileId: row.shipping_profile_id ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\n/** PostgREST hands `numeric` back as a string. Null survives as null: \"not\n * measured\" is what the packing code degrades on, and 0 would read as a\n * measurement of zero. */\nfunction numOrNull(value: unknown): number | null {\n if (value == null || value === '') return null\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n}\n\nfunction rowToImage(row: any): ProductImage {\n return {\n id: row.id,\n productId: row.product_id,\n url: row.url,\n altText: row.alt_text,\n sortOrder: row.sort_order ?? 0,\n isPrimary: row.is_primary ?? false,\n createdAt: row.created_at,\n }\n}\n\nfunction rowToCategory(row: any): Category {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n parentId: row.parent_id,\n sortOrder: row.sort_order ?? 0,\n createdAt: row.created_at,\n }\n}\n\n/**\n * Order items were being passed through raw, so every snake_case column arrived\n * undefined on the camelCase type: unit_price, image_url and product_id were all\n * lost. `total` survived only because the name matches in both, which is exactly\n * why the bug looked like \"price is zero\" instead of \"nothing is mapped\".\n */\nfunction rowToOrderItem(row: any): OrderItem {\n return {\n id: row.id,\n orderId: row.order_id,\n productId: row.product_id ?? null,\n variantId: row.variant_id ?? null,\n name: row.name,\n sku: row.sku ?? null,\n quantity: row.quantity ?? 0,\n unitPrice: row.unit_price ?? 0,\n total: row.total ?? 0,\n imageUrl: row.image_url ?? null,\n }\n}\n\nfunction rowToOrder(row: any): Order {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n orderNumber: row.order_number,\n status: row.status ?? 'open',\n financialStatus: row.financial_status ?? 'pending',\n fulfillmentStatus: row.fulfillment_status ?? 'unfulfilled',\n currency: row.currency ?? 'BRL',\n subtotal: row.subtotal ?? 0,\n taxTotal: row.tax_total ?? 0,\n discountTotal: row.discount_total ?? 0,\n shippingTotal: row.shipping_total ?? 0,\n total: row.total ?? 0,\n customerId: row.customer_id,\n customerName: row.customer_name,\n customerEmail: row.customer_email,\n discountCode: row.discount_code,\n notes: row.notes,\n shippingAddress: row.shipping_address ?? null,\n paymentMethodKind: row.payment_method_kind ?? null,\n paidAt: row.paid_at ?? null,\n items: Array.isArray(row.items) ? row.items.map(rowToOrderItem) : [],\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToCustomer(row: any): ShopCustomer {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n firstName: row.first_name,\n lastName: row.last_name ?? '',\n email: row.email,\n phone: row.phone,\n document: row.document ?? null,\n notes: row.notes,\n ordersCount: row.orders_count ?? 0,\n totalSpent: row.total_spent ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToDiscount(row: any): Discount {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n code: row.code,\n type: row.type,\n method: row.method ?? 'code',\n value: row.value ?? 0,\n usageLimit: row.usage_limit,\n oncePerCustomer: row.once_per_customer ?? false,\n minSubtotal: row.min_subtotal ?? null,\n appliesTo: row.applies_to ?? 'all',\n productIds: row.product_ids ?? [],\n categoryIds: row.category_ids ?? [],\n startsAt: row.starts_at,\n endsAt: row.ends_at,\n status: row.status ?? 'active',\n timesUsed: row.times_used ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToSalesChannel(row: any): SalesChannel {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n kind: row.kind,\n label: row.label,\n url: row.url,\n enabled: row.enabled ?? true,\n position: row.position ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction segmentPayload(input: Partial<CreateCustomerSegmentInput>): Record<string, unknown> {\n const p: Record<string, unknown> = {}\n if (input.name !== undefined) p.name = input.name\n if (input.description !== undefined) p.description = input.description\n if (input.minOrders !== undefined) p.min_orders = nullableNumber(input.minOrders)\n if (input.maxOrders !== undefined) p.max_orders = nullableNumber(input.maxOrders)\n if (input.minSpent !== undefined) p.min_spent = nullableNumber(input.minSpent)\n if (input.maxSpent !== undefined) p.max_spent = nullableNumber(input.maxSpent)\n if (input.joinedAfter !== undefined) p.joined_after = input.joinedAfter || null\n if (input.joinedBefore !== undefined) p.joined_before = input.joinedBefore || null\n return p\n}\n\nconst GIFT_CODE_ALPHABET = 'ABCDEFGHJKLMNPQRTUVWXY2346789'\n\nfunction generateGiftCardCode(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto.getRandomValues(bytes)\n const chars = Array.from(bytes, (b) => GIFT_CODE_ALPHABET[b % GIFT_CODE_ALPHABET.length])\n return `${chars.slice(0, 4).join('')}-${chars.slice(4, 8).join('')}-${chars.slice(8, 12).join('')}`\n}\n\n// Kept exported from here: it was part of this module's surface before the media\n// helpers moved to ./media.\nexport { mediaKindOf }\n\n/**\n * Every object this provider writes lands at a path of its own — a timestamp\n * prefix, never an overwrite (a replaced photo is a NEW path; see\n * replaceProductImage) — so the bytes behind a URL never change and the\n * browser and the CDN may keep them for a year. supabase-js turns the\n * seconds into `Cache-Control: max-age=…`. The default it would otherwise\n * send is one hour, which on the free-plan CDN means every image variant is\n * re-rendered from the original every hour, per point of presence — a\n * cold transform is 0.5–1.5 s, a warm one ~100 ms.\n */\nconst IMMUTABLE_OBJECT = { cacheControl: '31536000' } as const\n\n/** Where hand-uploaded assets live, as opposed to `products/{id}`. */\nconst LIBRARY_FOLDER = 'library'\n\n// ---------------------------------------------------------------------------\n// Mapeadores das entidades resgatadas da onda de 04-ago. Nenhum toca variante\n// nem o ledger de estoque — esses seguem os desta branch.\n// ---------------------------------------------------------------------------\n\nfunction nullableNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n}\n\nfunction rowToCollection(row: any): Collection {\n // Members arrive as the embedded join rows; the editorial order lives on the\n // join, so sort by it here rather than trusting PostgREST's arrival order.\n const members = (row.members ?? []) as Array<{ product_id: string; position: number | null }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n handle: row.handle ?? slugify(row.title ?? ''),\n description: row.description ?? null,\n imageUrl: row.image_url ?? null,\n seoTitle: row.seo_title ?? null,\n seoDescription: row.seo_description ?? null,\n published: row.published ?? true,\n sortOrder: row.sort_order ?? 0,\n productIds: [...members]\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n .map((m) => m.product_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerGroup(row: any): CustomerGroup {\n const members = (row.members ?? []) as Array<{ customer_id: string }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n color: row.color ?? null,\n customerIds: members.map((m) => m.customer_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerSegment(row: any): CustomerSegment {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n minOrders: nullableNumber(row.min_orders),\n maxOrders: nullableNumber(row.max_orders),\n minSpent: nullableNumber(row.min_spent),\n maxSpent: nullableNumber(row.max_spent),\n joinedAfter: row.joined_after ?? null,\n joinedBefore: row.joined_before ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\n// A plg_automations_templates row: `event_key` carries the owning module\n// ('shop.order_shipped') and the shop's own vocabulary is what follows the dot.\nconst SHOP_EVENT_PREFIX = 'shop.'\nconst EMAIL_CHANNEL = 'email'\n\nfunction rowToEmailTemplate(row: any): EmailTemplate {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n event: String(row.event_key ?? '').slice(SHOP_EVENT_PREFIX.length) as EmailTemplate['event'],\n // NULL stays NULL: the catalog resolves the default (resolveEmailTemplates),\n // not this mapping. Collapsing to `false` here would silently disable every\n // template whose row exists only because its text was edited.\n enabled: row.enabled ?? null,\n // Empty string and NULL both mean \"no override\" — a subject the merchant\n // cleared should fall back to the default, not send a blank subject line.\n subject: row.subject || null,\n body: row.body || null,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToGiftCard(row: any): GiftCard {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n code: String(row.code ?? '').toUpperCase(),\n initialBalance: Number(row.initial_balance ?? 0),\n balance: Number(row.balance ?? 0),\n currency: row.currency ?? 'BRL',\n status: (row.status ?? 'active') as GiftCard['status'],\n expiresAt: row.expires_at ?? null,\n customerId: row.customer_id ?? null,\n customerEmail: row.customer_email ?? null,\n note: row.note ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\n/**\n * O endereço do carrinho hospedado, montado como a função de borda monta.\n *\n * Uma cópia de três linhas, e de propósito: o outro lado é Deno e não é\n * importável daqui. `vindi-runtime.test.mjs` grada a original, e a regra é\n * simples o bastante para as duas concordarem — o token pendurado no fim, uma\n * vez só.\n */\nfunction cartPaymentUrl(url: unknown, token: unknown): string | null {\n const base = String(url ?? '').trim()\n const handle = String(token ?? '').trim()\n if (!base) return null\n if (!handle || base.includes(handle)) return base\n return `${base.replace(/\\/+$/u, '')}/${handle}`\n}\n\nexport class SupabaseShopProvider implements ShopProvider {\n // ---------------------------------------------------------------------------\n // Products\n // ---------------------------------------------------------------------------\n\n async listProducts(options?: ListProductsOptions): Promise<Product[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.products).select(`*, images:${T.productImages}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.categoryId) q = q.eq('category_id', options.categoryId)\n if (options?.slug) q = q.eq('slug', options.slug)\n if (options?.search) q = q.ilike('name', `%${options.search}%`)\n q = q.order(options?.orderBy ?? 'sort_order', { ascending: options?.order !== 'desc' })\n if (options?.limit) q = q.limit(options.limit)\n if (options?.offset) q = q.range(options.offset, (options.offset ?? 0) + (options.limit ?? 50) - 1)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToProduct)\n }\n\n async getProduct(id: string): Promise<Product | null> {\n const db = getDb()\n const { data, error } = await db\n .from(T.products)\n .select(`*, images:${T.productImages}(*)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToProduct(data) : null\n }\n\n async getProductByCatalogId(catalogProductId: string): Promise<Product | null> {\n const db = getDb()\n const { data, error } = await db\n .from(T.products)\n .select(`*, images:${T.productImages}(*)`)\n .eq('product_id', catalogProductId)\n .limit(1)\n .maybeSingle()\n if (error) throw error\n return data ? rowToProduct(data) : null\n }\n\n /** Option axes + variants from the 0028 tables (spine M5). The storefront\n * RLS on both tables already restricts anon reads to active variants of\n * publicly readable products; the status filter here keeps the admin path\n * (authenticated tenant member, who CAN see archived rows) consistent. */\n async getProductVariants(\n productId: string,\n opts?: { includeArchived?: boolean },\n ): Promise<ProductVariantSet> {\n const db = getDb()\n // Reads the archetype-backed view (0084, ADR 0024): the name, sku, price and\n // options come from `public.product_variants`, which is the truth for them.\n // Filtered on the SHOP's product id, because that is the id this method is\n // given and the view carries both.\n let variantQuery = db.from(V.productVariants).select('*').eq('shop_product_id', productId)\n // The storefront must never see an archived variant (0028's public policy\n // says the same in SQL); the admin MUST, because reviving an archived row is\n // the only legal answer to re-adding a removed option value.\n if (!opts?.includeArchived) variantQuery = variantQuery.eq('status', 'active')\n const [optionsRes, variantsRes] = await Promise.all([\n db.from(T.productOptions).select('*').eq('product_id', productId).order('position', { ascending: true }),\n variantQuery.order('position', { ascending: true }),\n ])\n if (optionsRes.error) throw optionsRes.error\n if (variantsRes.error) throw variantsRes.error\n const options: ProductOption[] = (optionsRes.data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n values: Array.isArray(row.values) ? row.values.map(String) : [],\n position: row.position ?? 0,\n }))\n const variants: ProductVariant[] = (variantsRes.data ?? []).map(rowToVariant)\n return { options, variants }\n }\n\n // --- The variant admin ------------------------------------------------------\n\n async saveProductOptions(productId: string, input: ProductOptionInput[]): Promise<ProductOption[]> {\n const db = getDb()\n const tenantId = getTenantId()\n const clean = normalizeVariantAxes(input)\n const refusal = validateVariantAxes(clean)\n if (refusal) throw new Error(refusal)\n\n const { data: existing, error: readError } = await db\n .from(T.productOptions).select('*').eq('product_id', productId)\n if (readError) throw readError\n\n const byName = new Map<string, any>((existing ?? []).map((row: any) => [row.name, row]))\n const wanted = new Set(clean.map((axis) => axis.name))\n\n // Removed first: an axis renamed P→Q would otherwise collide with 0028's\n // UNIQUE (product_id, name) while the old row is still there.\n const stale = (existing ?? []).filter((row: any) => !wanted.has(row.name)).map((row: any) => row.id)\n if (stale.length > 0) {\n const { error } = await db.from(T.productOptions).delete().in('id', stale)\n if (error) throw error\n }\n\n for (const [position, axis] of clean.entries()) {\n const row = byName.get(axis.name)\n if (row) {\n const { error } = await db\n .from(T.productOptions).update({ values: axis.values, position }).eq('id', row.id)\n if (error) throw error\n } else {\n const { error } = await db.from(T.productOptions).insert({\n product_id: productId, tenant_id: tenantId, name: axis.name, values: axis.values, position,\n })\n if (error) throw error\n }\n }\n\n const { data, error } = await db\n .from(T.productOptions).select('*').eq('product_id', productId).order('position', { ascending: true })\n if (error) throw error\n return (data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n values: Array.isArray(row.values) ? row.values.map(String) : [],\n position: row.position ?? 0,\n }))\n }\n\n async createProductVariant(productId: string, input: CreateProductVariantInput): Promise<ProductVariant> {\n const db = getDb()\n const tenantId = getTenantId()\n if (Object.keys(input.options).length === 0) {\n throw new Error('Uma variante sem opções é a variante padrão (0037), criada pelo banco. Declare ao menos um eixo.')\n }\n\n // Revive before insert. 0028 declares UNIQUE (product_id, options) and this\n // screen archives rather than deletes, so \"add GG back\" meets the row it\n // archived an hour ago — and an INSERT would fail with a constraint error\n // the merchant cannot act on.\n const { data: existing, error: readError } = await db\n .from(V.productVariants).select('*').eq('shop_product_id', productId)\n if (readError) throw readError\n const wantedKey = variantOptionsKey(input.options)\n const match = (existing ?? []).find((row: any) => variantOptionsKey(row.options ?? {}) === wantedKey)\n if (match) return this.updateProductVariant(match.id, { ...input, status: input.status ?? 'active' })\n\n // Two rows, in this order, because the extension points AT the archetype:\n // public.product_variants holds the identity (name, sku, price, options as\n // `attributes`) and plg_shop_product_variants holds what is the shop's\n // (position, weight, image, tracking). The same shape 0086 already gave\n // `shop_ensure_default_variant` — this path, a variant a MERCHANT creates,\n // was the one nobody rewrote.\n const { data: shopProduct, error: productError } = await db\n .from(T.products).select('id, product_id, tenant_id').eq('id', productId).single()\n if (productError) throw productError\n\n // The canonical product this shop row extends — or the row itself, which is\n // 0009's bridge for a shop-native product whose id IS the canonical id.\n const canonicalProductId = shopProduct.product_id ?? shopProduct.id\n\n const { data: coreVariant, error: coreError } = await db\n .from('product_variants')\n .insert({\n tenant_id: tenantId,\n product_id: canonicalProductId,\n attributes: input.options,\n name: variantDisplayName(input.options),\n ...variantCorePatch(input),\n is_default: false,\n })\n .select('id')\n .single()\n if (coreError) throw coreError\n\n const { data, error } = await db\n .from(T.productVariants)\n .insert({\n product_id: productId,\n tenant_id: tenantId,\n variant_id: coreVariant.id,\n ...variantPatch(input),\n // NOT copied from the product: 0028 defines a null price as \"inherit the\n // product's\", and 0037's header spells out why a copy is a bug — the\n // storefront would show the new product price and the server charge the\n // frozen variant one.\n status: input.status ?? 'active',\n is_default_variant: false,\n })\n .select('id')\n .single()\n if (error) throw error\n // Read back through the view: the insert returned the extension alone, and\n // sku, price and options live on the other row.\n return this.readVariant(data.id)\n }\n\n /** One variant, as the view assembles it from both rows. */\n private async readVariant(shopVariantId: string): Promise<ProductVariant> {\n const db = getDb()\n const { data, error } = await db\n .from(V.productVariants).select('*').eq('id', shopVariantId).single()\n if (error) throw error\n return rowToVariant(data)\n }\n\n async updateProductVariant(variantId: string, input: UpdateProductVariantInput): Promise<ProductVariant> {\n const db = getDb()\n // Routed by owner, the same split as the insert. `variantId` is the SHOP\n // row's id (the view keeps it as `id`), so the archetype is reached through\n // the bridge column rather than assumed to share it.\n const { data: row, error: readError } = await db\n .from(T.productVariants).select('id, variant_id').eq('id', variantId).single()\n if (readError) throw readError\n\n const corePatch = variantCorePatch(input)\n if (Object.keys(corePatch).length > 0 && row.variant_id) {\n const { error } = await db\n .from('product_variants').update(corePatch).eq('id', row.variant_id)\n if (error) throw error\n }\n\n const shopPatch = variantPatch(input)\n if (Object.keys(shopPatch).length > 0) {\n const { error } = await db\n .from(T.productVariants).update(shopPatch).eq('id', variantId)\n if (error) throw error\n }\n\n return this.readVariant(variantId)\n }\n\n async archiveProductVariant(variantId: string): Promise<void> {\n const db = getDb()\n const { error } = await db.from(T.productVariants).update({ status: 'archived' }).eq('id', variantId)\n if (error) throw error\n }\n\n async setVariantStock(variantId: string, count: number, note?: string): Promise<number> {\n const target = Math.max(0, Math.trunc(count))\n // '' when no tenant is resolved: resolveStockStore only looks the key up in\n // the ERP-override map, and no override is ever registered under a blank id.\n const store = resolveStockStore(getTenantId() ?? '', () => createSupabaseStockStore())\n const current = await store.getAvailable(variantId)\n const delta = target - current\n if (delta === 0) return current\n\n // A variant that has never had a ledger position is not being CORRECTED, it\n // is being opened — the same taxonomy 0035 and 0037 stamp, so the movement\n // history reads honestly instead of showing every new SKU as an adjustment\n // against a balance that never existed.\n const priorMovements = await store.listMovements({ variantId, limit: 1 })\n const opening = priorMovements.length === 0 && delta > 0\n await store.recordMovement({\n variantId,\n kind: opening ? 'receipt' : 'adjustment',\n reasonCode: opening ? OPENING_BALANCE_REASON : 'correction',\n quantity: delta,\n note: note ?? 'Estoque definido na matriz de variantes.',\n })\n return target\n }\n\n async receiveVariantStock(\n variantId: string,\n quantity: number,\n options?: { reasonCode?: string; note?: string; occurredAt?: string },\n ): Promise<number> {\n const amount = Math.trunc(quantity)\n if (amount <= 0) throw new Error('A quantidade recebida precisa ser maior que zero.')\n const store = resolveStockStore(getTenantId() ?? '', () => createSupabaseStockStore())\n await store.recordMovement({\n variantId,\n kind: 'receipt',\n reasonCode: options?.reasonCode ?? 'purchase',\n quantity: amount,\n note: options?.note,\n occurredAt: options?.occurredAt,\n })\n return store.getAvailable(variantId)\n }\n\n async receiveProductStock(\n productId: string,\n quantity: number,\n options?: { variantId?: string | null; reasonCode?: string; note?: string; occurredAt?: string },\n ): Promise<number> {\n const amount = Math.trunc(quantity)\n if (amount <= 0) throw new Error('A quantidade recebida precisa ser maior que zero.')\n if (options?.variantId) {\n return this.receiveVariantStock(options.variantId, amount, options)\n }\n const { variants } = await this.getProductVariants(productId)\n if (variants.length === 1) return this.receiveVariantStock(variants[0].id, amount, options)\n if (variants.length > 1) {\n throw new Error('Este produto tem mais de uma variação — escolha qual recebeu a entrada.')\n }\n // No variant row at all: the product's own count is the stock this store\n // keeps, and shop_place_order reads it. Written through the ordinary update\n // so 0036's shim records the movement.\n //\n // A DATA não sobrevive a esta perna, e é melhor dizer isso do que fingir:\n // um UPDATE de contador não tem \"quando\", e o movimento que o shim de 0036\n // escreve nasce com occurred_at = agora. A quantidade fica certa, a data\n // vira hoje. Some junto com a perna, quando 0037 tiver rodado em todo pool.\n const product = await this.getProduct(productId)\n const now = Math.max(0, (product?.inventoryCount ?? 0)) + amount\n await this.updateProduct(productId, { inventoryCount: now })\n return now\n }\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.products)\n .insert({\n tenant_id: tenantId,\n // Null lets shop_ensure_canonical_product mint the catalogue row; an id\n // makes it adopt the one the stock already has.\n product_id: input.catalogProductId ?? null,\n name: input.name,\n slug: input.slug ?? slugify(input.name),\n seo_title: input.seoTitle ?? null,\n seo_description: input.seoDescription ?? null,\n description: input.description ?? null,\n price: input.price,\n compare_at_price: input.compareAtPrice ?? null,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n inventory_count: input.inventoryCount ?? 0,\n sku: input.sku ?? null,\n sort_order: input.sortOrder ?? 0,\n metadata: input.metadata ?? {},\n category_id: input.categoryId ?? null,\n is_physical: input.isPhysical ?? true,\n weight: input.weight ?? null,\n weight_unit: input.weightUnit ?? 'kg',\n height_cm: input.heightCm ?? null,\n width_cm: input.widthCm ?? null,\n length_cm: input.lengthCm ?? null,\n // Null = a padrão da loja (0047). É o estado normal, não um campo vazio.\n package_id: input.packageId ?? null,\n // NULL and not []: \"nothing declared\" and \"declared as needing nothing\"\n // are the same fact about a box, and one representation of it keeps the\n // `&&` overlap test in the 0048 trigger reading one way.\n handling: input.handling?.length ? input.handling : null,\n shipping_profile_id: input.shippingProfileId ?? null,\n })\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async updateProduct(id: string, input: UpdateProductInput): Promise<Product> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) { updates.name = input.name; updates.slug = input.slug ?? slugify(input.name) }\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.seoTitle !== undefined) updates.seo_title = input.seoTitle\n if (input.seoDescription !== undefined) updates.seo_description = input.seoDescription\n if (input.description !== undefined) updates.description = input.description\n if (input.price !== undefined) updates.price = input.price\n if (input.compareAtPrice !== undefined) updates.compare_at_price = input.compareAtPrice\n if (input.currency !== undefined) updates.currency = input.currency\n if (input.status !== undefined) updates.status = input.status\n if (input.inventoryCount !== undefined) updates.inventory_count = input.inventoryCount\n if (input.sku !== undefined) updates.sku = input.sku\n if (input.categoryId !== undefined) updates.category_id = input.categoryId\n if (input.isPhysical !== undefined) updates.is_physical = input.isPhysical\n if (input.weight !== undefined) updates.weight = input.weight\n if (input.weightUnit !== undefined) updates.weight_unit = input.weightUnit\n if (input.heightCm !== undefined) updates.height_cm = input.heightCm\n if (input.widthCm !== undefined) updates.width_cm = input.widthCm\n if (input.lengthCm !== undefined) updates.length_cm = input.lengthCm\n if (input.packageId !== undefined) updates.package_id = input.packageId || null\n if (input.handling !== undefined) updates.handling = input.handling.length ? input.handling : null\n if (input.shippingProfileId !== undefined) updates.shipping_profile_id = input.shippingProfileId ?? null\n const { data, error } = await db\n .from(T.products).update(updates).eq('id', id)\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async deleteProduct(id: string): Promise<void> {\n const { error } = await getDb().from(T.products).delete().eq('id', id)\n if (error) throw error\n }\n\n async uploadProductImage(productId: string, rawFile: File): Promise<ProductImage> {\n const db = getDb()\n const tenantId = getTenantId()\n // The camera's original is only ever a source for renders; store a\n // bounded WebP of it (see lib/optimize-upload). Falls through untouched\n // outside a browser or for anything it should not re-encode.\n const file = await optimizeImageForUpload(rawFile)\n const path = `${tenantId}/products/${productId}/${Date.now()}-${file.name}`\n const { error: uploadErr } = await db.storage.from('shop-images').upload(path, file, IMMUTABLE_OBJECT)\n if (uploadErr) throw uploadErr\n const { data: { publicUrl } } = db.storage.from('shop-images').getPublicUrl(path)\n\n // Every upload used to land as sort_order 0 / is_primary false, so a product\n // whose only photo was uploaded here had NO primary at all, and a second one\n // tied with the first for position. New photos now go to the end, and the\n // first photo a product ever gets becomes its primary.\n const { data: existing } = await db\n .from(T.productImages)\n .select('id,sort_order')\n .eq('product_id', productId)\n .order('sort_order', { ascending: false })\n .limit(1)\n const first = !existing || existing.length === 0\n const nextOrder = first ? 0 : (existing[0].sort_order ?? 0) + 1\n\n const { data, error } = await db\n .from(T.productImages)\n .insert({\n product_id: productId, tenant_id: tenantId, url: publicUrl,\n sort_order: nextOrder, is_primary: first,\n })\n .select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async updateProductImage(\n imageId: string,\n input: { isPrimary?: boolean; sortOrder?: number; altText?: string | null },\n ): Promise<ProductImage> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n if (input.altText !== undefined) updates.alt_text = input.altText\n if (input.isPrimary !== undefined) updates.is_primary = input.isPrimary\n\n // Demote the incumbent first. Doing it after would leave a window with two\n // primaries, and if the second statement failed the product would keep two\n // for good.\n if (input.isPrimary) {\n const { data: target } = await db\n .from(T.productImages).select('product_id').eq('id', imageId).single()\n if (target?.product_id) {\n await db.from(T.productImages)\n .update({ is_primary: false })\n .eq('product_id', target.product_id)\n .neq('id', imageId)\n }\n }\n\n const { data, error } = await db\n .from(T.productImages).update(updates).eq('id', imageId).select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async replaceProductImage(imageId: string, file: File): Promise<ProductImage> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data: row, error: readErr } = await db\n .from(T.productImages).select('id,url,product_id').eq('id', imageId).single()\n if (readErr) throw readErr\n\n // New object, same row. Overwriting the old path would keep the URL — and\n // the CDN would keep serving the old photo from cache, which is exactly the\n // thing the merchant is here to fix.\n const path = `${tenantId}/products/${row.product_id}/${Date.now()}-${file.name}`\n const bucket = db.storage.from(T.mediaBucket)\n const { error: uploadErr } = await bucket.upload(path, file, IMMUTABLE_OBJECT)\n if (uploadErr) throw uploadErr\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n\n const { data, error } = await db\n .from(T.productImages).update({ url: publicUrl }).eq('id', imageId).select().single()\n if (error) throw error\n\n // Only after the row points somewhere else: a failure above leaves the photo\n // intact, and dropping the old file first would leave it pointing at nothing.\n await this.removeUnreferencedObject(row.url)\n return rowToImage(data)\n }\n\n async deleteProductImage(imageId: string): Promise<void> {\n const db = getDb()\n const { data: row } = await db\n .from(T.productImages).select('url').eq('id', imageId).maybeSingle()\n const { error } = await db.from(T.productImages).delete().eq('id', imageId)\n if (error) throw error\n if (row?.url) await this.removeUnreferencedObject(row.url)\n }\n\n /**\n * Drop a stored file once nothing points at it anymore.\n *\n * The row was the only thing keeping the object reachable, so leaving it\n * behind is a file nobody can see and nobody can delete — and the bill for it\n * arrives all the same. Two rows can share one URL (a duplicated product), and\n * the survivor has to keep working, so the count decides.\n */\n private async removeUnreferencedObject(url: string | null | undefined): Promise<void> {\n const path = url ? storagePathOf(url) : null\n if (!path) return\n const db = getDb()\n const { count } = await db\n .from(T.productImages).select('id', { count: 'exact', head: true }).eq('url', url)\n if (count) return\n await db.storage.from(T.mediaBucket).remove([path])\n }\n\n // ---------------------------------------------------------------------------\n // Categories\n // ---------------------------------------------------------------------------\n\n async listCategories(): Promise<Category[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.categories).select('*').order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCategory)\n }\n\n async createCategory(input: CreateCategoryInput): Promise<Category> {\n const db = getDb()\n const { data, error } = await db\n .from(T.categories)\n .insert({ tenant_id: getTenantId(), name: input.name, slug: input.slug ?? slugify(input.name), description: input.description ?? null, parent_id: input.parentId ?? null, sort_order: input.sortOrder ?? 0 })\n .select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async updateCategory(id: string, input: UpdateCategoryInput): Promise<Category> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.parentId !== undefined) updates.parent_id = input.parentId\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n const { data, error } = await db.from(T.categories).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async deleteCategory(id: string): Promise<void> {\n const { error } = await getDb().from(T.categories).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Orders\n // ---------------------------------------------------------------------------\n\n async listOrders(options?: ListOrdersOptions): Promise<Order[]> {\n const db = getDb()\n const tenantId = getTenantId()\n // Read through the archetype (V), write through the plugin table (T) —\n // see the note on `V` in ./tables. Reaching the archetype needs the tenant\n // header the client now sends (145); without it these answered zero for\n // anyone with more than one account.\n let q = db.from(V.orders).select(`*, items:${V.orderItems}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.financialStatus) q = q.eq('financial_status', options.financialStatus)\n if (options?.fulfillmentStatus) q = q.eq('fulfillment_status', options.fulfillmentStatus)\n if (options?.customerId) q = q.eq('customer_id', options.customerId)\n if (options?.customerEmail) q = q.eq('customer_email', options.customerEmail)\n if (options?.search) q = q.or(`customer_name.ilike.%${options.search}%,customer_email.ilike.%${options.search}%`)\n q = q.order('created_at', { ascending: false })\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToOrder)\n }\n\n async getOrder(id: string): Promise<Order | null> {\n const db = getDb()\n const { data, error } = await db\n .from(V.orders).select(`*, items:${V.orderItems}(*)`)\n .eq('id', id).maybeSingle()\n if (error) throw error\n if (!data) return null\n const order = rowToOrder(data)\n // Nasceu na vitrine? A sessão de checkout é a marca. Uma consulta a mais só\n // no detalhe — a listagem não precisa saber, e pagaria por linha.\n const { data: session } = await db\n .from(T.checkoutSessions).select('id').eq('order_id', id).limit(1)\n order.origin = (session?.length ?? 0) > 0 ? 'storefront' : 'admin'\n return order\n }\n\n async createOrder(input: CreateOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = getTenantId()\n const subtotal = input.items.reduce((s, i) => s + i.quantity * i.unitPrice, 0)\n const discountTotal = input.discountTotal ?? 0\n const shippingTotal = input.shippingTotal ?? 0\n const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100\n const { data: order, error: orderErr } = await db\n .from(T.orders)\n .insert({ tenant_id: tenantId, customer_id: input.customerId ?? null, customer_name: input.customerName ?? null, customer_email: input.customerEmail ?? null, currency: input.currency ?? 'BRL', notes: input.notes ?? null, subtotal, discount_total: discountTotal, shipping_total: shippingTotal, discount_code: input.discountCode ?? null, total, status: 'open', financial_status: 'pending', fulfillment_status: 'unfulfilled' })\n .select().single()\n if (orderErr) throw orderErr\n const items = input.items.map(i => ({ order_id: order.id, product_id: asUuid(i.productId), name: i.name, sku: i.sku ?? null, quantity: i.quantity, unit_price: i.unitPrice, total: i.quantity * i.unitPrice, image_url: i.imageUrl ?? null }))\n await db.from(T.orderItems).insert(items)\n return this.getOrder(order.id) as Promise<Order>\n }\n\n async updateOrder(id: string, input: UpdateOrderInput): Promise<Order> {\n const updates: Record<string, unknown> = {}\n if (input.status !== undefined) updates.status = input.status\n if (input.financialStatus !== undefined) updates.financial_status = input.financialStatus\n if (input.fulfillmentStatus !== undefined) updates.fulfillment_status = input.fulfillmentStatus\n if (input.notes !== undefined) updates.notes = input.notes\n const { error } = await getDb().from(T.orders).update(updates).eq('id', id)\n if (error) throw error\n return this.getOrder(id) as Promise<Order>\n }\n\n // -------------------------------------------------------------------------\n // Delivery zones\n //\n // Postal codes are stored as 8 bare digits so the range test in\n // shop_quote_shipping is a plain BETWEEN. Accepting '22.041-001' from the\n // form and normalising here means the merchant never has to think about it.\n // -------------------------------------------------------------------------\n async listShippingZones(): Promise<ShippingZone[]> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .select('*')\n .eq('tenant_id', tenantId)\n .order('sort_order', { ascending: true })\n .order('postal_from', { ascending: true })\n if (error) throw error\n return (data ?? []).map(rowToShippingZone)\n }\n\n async createShippingZone(input: CreateShippingZoneInput): Promise<ShippingZone> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingZone requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .insert({ tenant_id: tenantId, ...shippingZonePayload(input) })\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n async updateShippingZone(id: string, input: UpdateShippingZoneInput): Promise<ShippingZone> {\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .update(shippingZonePayload(input))\n .eq('id', id)\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n // -------------------------------------------------------------------------\n // Embalagens (0046)\n //\n // `is_default` has a partial unique index behind it, so promoting a box has\n // to demote the previous one in the same round trip — otherwise the second\n // default is refused by the database and the merchant sees a save that\n // failed for a reason the screen cannot explain.\n // -------------------------------------------------------------------------\n async listShippingPackages(): Promise<ShippingPackage[]> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingPackages)\n .select('*')\n .eq('tenant_id', tenantId)\n .order('is_default', { ascending: false })\n .order('name', { ascending: true })\n if (error) throw error\n return (data ?? []).map(rowToShippingPackage)\n }\n\n async createShippingPackage(input: CreateShippingPackageInput): Promise<ShippingPackage> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingPackage requires a tenant id.')\n if (input.isDefault) await this.clearDefaultPackage(tenantId)\n const { data, error } = await getDb()\n .from(T.shippingPackages)\n .insert({ tenant_id: tenantId, ...shippingPackagePayload(input) })\n .select()\n .single()\n if (error) throw error\n return rowToShippingPackage(data)\n }\n\n async updateShippingPackage(id: string, input: UpdateShippingPackageInput): Promise<ShippingPackage> {\n const tenantId = getTenantId()\n if (input.isDefault && tenantId) await this.clearDefaultPackage(tenantId, id)\n const { data, error } = await getDb()\n .from(T.shippingPackages)\n .update(shippingPackagePayload(input))\n .eq('id', id)\n .select()\n .single()\n if (error) throw error\n return rowToShippingPackage(data)\n }\n\n async deleteShippingPackage(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingPackages).delete().eq('id', id)\n if (error) throw error\n }\n\n private async clearDefaultPackage(tenantId: string, exceptId?: string): Promise<void> {\n let query = getDb()\n .from(T.shippingPackages)\n .update({ is_default: false })\n .eq('tenant_id', tenantId)\n .eq('is_default', true)\n if (exceptId) query = query.neq('id', exceptId)\n const { error } = await query\n if (error) throw error\n }\n\n async deleteShippingZone(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingZones).delete().eq('id', id)\n if (error) throw error\n }\n\n // -------------------------------------------------------------------------\n // Store policy + delivery fallback (0044b / 0015)\n //\n // Both are ONE ROW PER TENANT, and both are upserted rather than\n // insert-or-update: a store that never opened these screens has no row, and\n // making the first save conditional on discovering that is two round trips to\n // learn something the primary key already knows.\n // -------------------------------------------------------------------------\n async getShippingSettings(): Promise<ShippingSettings | null> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingSettings)\n .select('flat_rate, free_above, currency')\n .eq('tenant_id', tenantId)\n .maybeSingle()\n if (error) throw error\n if (!data) return null\n return {\n flatRate: Number(data.flat_rate ?? 0),\n freeAbove: data.free_above == null ? null : Number(data.free_above),\n currency: data.currency ?? 'BRL',\n }\n }\n\n async updateShippingSettings(input: UpdateShippingSettingsInput): Promise<ShippingSettings> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: updateShippingSettings requires a tenant id.')\n const payload: Record<string, unknown> = { tenant_id: tenantId }\n if (input.flatRate !== undefined) payload.flat_rate = input.flatRate\n // Null is a VALUE here — \"no free-delivery threshold\" — so it is written\n // rather than skipped. Only `undefined` means \"leave it alone\".\n if (input.freeAbove !== undefined) payload.free_above = input.freeAbove\n if (input.currency !== undefined) payload.currency = input.currency\n const { data, error } = await getDb()\n .from(T.shippingSettings)\n .upsert(payload, { onConflict: 'tenant_id' })\n .select('flat_rate, free_above, currency')\n .single()\n if (error) throw error\n return {\n flatRate: Number(data.flat_rate ?? 0),\n freeAbove: data.free_above == null ? null : Number(data.free_above),\n currency: data.currency ?? 'BRL',\n }\n }\n\n /**\n * \"Does this store deliver here?\" — asked with the address, before the card.\n *\n * Degrades to \"yes, and not our own zone\" on any failure. A store that cannot\n * reach the check must not stop selling: the order itself is still refused by\n * the 0048 trigger if the region really is excluded, so the worst case is the\n * shopper learning it one screen later instead of never selling at all.\n */\n async listShippingProfiles(): Promise<ShippingProfile[]> {\n const { data, error } = await getDb()\n .from(T.shippingProfiles)\n .select('*')\n .eq('tenant_id', getTenantId())\n .order('is_default', { ascending: false })\n .order('name')\n if (error) throw error\n return (data ?? []).map(rowToShippingProfile)\n }\n\n async createShippingProfile(input: CreateShippingProfileInput): Promise<ShippingProfile> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingProfile requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.shippingProfiles)\n .insert({ tenant_id: tenantId, ...shippingProfilePayload(input) })\n .select('*')\n .single()\n if (error) throw error\n return rowToShippingProfile(data)\n }\n\n async updateShippingProfile(id: string, input: UpdateShippingProfileInput): Promise<ShippingProfile> {\n const { data, error } = await getDb()\n .from(T.shippingProfiles)\n .update(shippingProfilePayload(input))\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw error\n return rowToShippingProfile(data)\n }\n\n async deleteShippingProfile(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingProfiles).delete().eq('id', id)\n if (error) throw error\n }\n\n // Places the store ships from (0058). Default first, then by name — the same\n // order the ledger's listLocations() uses, so the two screens agree.\n async listStockLocations(): Promise<StockLocation[]> {\n const { data, error } = await getDb()\n .from(T.stockLocations)\n .select('*')\n .eq('tenant_id', getTenantId())\n .order('is_default', { ascending: false })\n .order('name')\n if (error) throw error\n return (data ?? []).map(rowToStockLocation)\n }\n\n async createStockLocation(input: CreateStockLocationInput): Promise<StockLocation> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createStockLocation requires a tenant id.')\n if (input.isDefault) await this.clearDefaultStockLocation(tenantId)\n const payload = stockLocationPayload(input)\n if (payload.code === undefined) payload.code = toLocationCode(input.name)\n const { data, error } = await getDb()\n .from(T.stockLocations)\n .insert({ tenant_id: tenantId, ...payload })\n .select('*')\n .single()\n if (error) throw locationWriteError(error)\n return rowToStockLocation(data)\n }\n\n async updateStockLocation(id: string, input: UpdateStockLocationInput): Promise<StockLocation> {\n const tenantId = getTenantId()\n // Clear the old default first: 0034's partial unique index allows exactly\n // one, so writing the new one first fails instead of moving the flag.\n if (input.isDefault && tenantId) await this.clearDefaultStockLocation(tenantId, id)\n const { data, error } = await getDb()\n .from(T.stockLocations)\n .update(stockLocationPayload(input))\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw locationWriteError(error)\n return rowToStockLocation(data)\n }\n\n async deleteStockLocation(id: string): Promise<void> {\n const { error } = await getDb().from(T.stockLocations).delete().eq('id', id)\n if (error) throw locationWriteError(error)\n }\n\n private async clearDefaultStockLocation(tenantId: string, exceptId?: string): Promise<void> {\n let query = getDb()\n .from(T.stockLocations)\n .update({ is_default: false })\n .eq('tenant_id', tenantId)\n .eq('is_default', true)\n if (exceptId) query = query.neq('id', exceptId)\n const { error } = await query\n if (error) throw error\n }\n\n async findAreas(query: string, limit = 12): Promise<AreaCandidate[]> {\n const text = String(query ?? '').trim()\n if (text.length < 2) return []\n const { data, error } = await getDb().rpc('shop_find_areas', {\n p_query: text,\n p_limit: limit,\n // What the store's own state is, so \"Ipanema\" does not offer a town in\n // Minas Gerais above the Rio neighbourhood to a store dispatching from\n // Barra da Tijuca. Null is fine — the search just stops ranking by it.\n p_tenant_id: getTenantId() ?? null,\n })\n if (error) return []\n return (data ?? []).map((row: any) => ({\n kind: row.kind,\n label: row.label ?? '',\n cityCode: row.city_code ?? null,\n cityName: row.city_name ?? null,\n state: row.state ?? null,\n districtKey: row.district_key ?? null,\n members: Array.isArray(row.members)\n ? row.members.map((m: any) => ({\n kind: m.kind,\n label: m.label ?? '',\n cityCode: m.city_code ?? null,\n districtKey: m.district_key ?? null,\n }))\n : undefined,\n knownPostalCodes: Number(row.known_postal_codes ?? 0),\n matchedAs: row.matched_as ?? null,\n }))\n }\n\n /**\n * Está aberta agora? (0094)\n *\n * `null` é uma resposta de primeira classe e a mais importante delas: a base\n * ainda não recebeu a 0094, a função não existe, e quem chama trata isso como\n * \"sempre aberta\" — que é exatamente o que a loja era ontem. Um throw aqui\n * derrubaria a vitrine de sete lojas por causa de uma migration que não é\n * delas.\n */\n async getServiceStatus(fulfillmentType?: FulfillmentType): Promise<ServiceStatus | null> {\n const tenantId = getTenantId()\n if (!tenantId) return null\n const { data, error } = await getDb().rpc('shop_service_status', {\n p_tenant_id: tenantId,\n p_fulfillment_type: fulfillmentType ?? 'delivery',\n })\n if (error) return null\n const row = Array.isArray(data) ? data[0] : data\n if (!row) return null\n return {\n open: Boolean(row.open),\n configured: Boolean(row.configured),\n timezone: row.timezone ?? 'America/Sao_Paulo',\n closesAt: row.closes_at ?? null,\n nextOpenAt: row.next_open_at ?? null,\n reason: row.reason ?? 'open',\n }\n }\n\n /** As janelas agendáveis. Vazio = esta loja não agenda, e a tela não oferece. */\n async listScheduleSlots(\n fulfillmentType?: FulfillmentType,\n from?: string,\n ): Promise<ScheduleSlot[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb().rpc('shop_schedule_slots', {\n p_tenant_id: tenantId,\n p_fulfillment_type: fulfillmentType ?? 'delivery',\n ...(from ? { p_from: from } : {}),\n })\n if (error) return []\n return (data ?? []).map((row: any) => ({\n startsAt: row.starts_at,\n endsAt: row.ends_at,\n }))\n }\n\n /** O horário semanal, para a tela que o mostra. Vazio = nada declarado. */\n async listServiceHours(fulfillmentType?: FulfillmentType): Promise<ServiceHours[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb()\n .from('plg_shop_service_hours')\n .select('weekday,opens_at,closes_at,fulfillment_type')\n .eq('tenant_id', tenantId)\n .eq('active', true)\n .order('weekday', { ascending: true })\n .order('opens_at', { ascending: true })\n // Base sem a 0094: a tabela não existe. Ausência, não erro — a loja\n // simplesmente não declara horário, que é o estado de todas elas ontem.\n if (error) return []\n const type = fulfillmentType ?? 'delivery'\n return (data ?? [])\n .filter((row: any) => row.fulfillment_type == null || row.fulfillment_type === type)\n .map((row: any) => ({\n weekday: Number(row.weekday),\n opensAt: String(row.opens_at),\n closesAt: String(row.closes_at),\n fulfillmentType: row.fulfillment_type ?? null,\n }))\n }\n\n async checkDelivery(postalCode: string, address?: PostalAddressHint): Promise<DeliveryCheck> {\n const tenantId = getTenantId()\n // The raw digits, not toPostalDigits: that one left-pads, which turns a\n // half-typed '20' into '00000020' and would answer about a zone in Acre.\n const digits = String(postalCode ?? '').replace(/\\D/g, '')\n if (!tenantId || digits.length !== 8) return { refused: false, ownZone: false }\n const { data, error } = await getDb().rpc('shop_delivery_check', {\n p_tenant_id: tenantId,\n p_postal_code: digits,\n // Only ever a HINT. The server prefers what it resolved itself\n // (public.postal_areas) and answers address_resolved=false when it had to\n // fall back to this — 0081 §4.\n p_address: addressHintPayload(address),\n })\n if (error) return { refused: false, ownZone: false }\n const row = Array.isArray(data) ? data[0] : data\n return {\n refused: Boolean(row?.refused),\n refusedZone: row?.refused_zone ?? null,\n ownZone: Boolean(row?.own_zone),\n outcome: row?.outcome ?? null,\n zoneName: row?.zone_name ?? null,\n addressResolved: row?.address_resolved !== false,\n }\n }\n\n async getStoreSettings(): Promise<StoreSettings | null> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.settings)\n .select('*')\n .eq('tenant_id', tenantId)\n .maybeSingle()\n if (error) throw error\n return data ? rowToStoreSettings(data) : null\n }\n\n async updateStoreSettings(input: UpdateStoreSettingsInput): Promise<StoreSettings> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: updateStoreSettings requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.settings)\n .upsert({ tenant_id: tenantId, ...storeSettingsPayload(input) }, { onConflict: 'tenant_id' })\n .select('*')\n .single()\n if (error) throw error\n return rowToStoreSettings(data)\n }\n\n /**\n * The shopper's read. Through the RPC, not the table: the table is closed to\n * anon on purpose (0029) and shop_store_settings() is the narrow window —\n * storefront fields only, and only for a published store.\n */\n async getPublicStoreSettings(): Promise<StoreSettings | null> {\n const tenantId = getTenantId()\n if (!tenantId) return null\n const { data, error } = await getDb().rpc('shop_store_settings', { p_tenant_id: tenantId })\n if (error) throw error\n const row = Array.isArray(data) ? data[0] : data\n return row ? rowToStoreSettings(row) : null\n }\n\n /** Markets (0116), through the anon-safe RPC. A pool without 0116: none. */\n async listMarkets(): Promise<ShopMarket[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb().rpc('shop_public_markets', { p_tenant_id: tenantId })\n if (error) return []\n return ((data ?? []) as Record<string, unknown>[]).map((row: Record<string, unknown>) => ({\n code: String(row.code),\n name: String(row.name),\n currency: String(row.currency),\n locale: (row.locale as string | null) ?? null,\n countries: Array.isArray(row.countries) ? (row.countries as string[]) : [],\n isDefault: Boolean(row.is_default),\n paymentProvider: (row.payment_provider as string | null) ?? null,\n shippingFlatRate: Number(row.shipping_flat_rate ?? 0),\n shippingFreeAbove: row.shipping_free_above == null ? null : Number(row.shipping_free_above),\n }))\n }\n\n async listAdminMarkets(): Promise<AdminShopMarket[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb()\n .from('plg_shop_markets')\n .select('*')\n .eq('tenant_id', tenantId)\n .order('is_default', { ascending: false })\n .order('code')\n if (error) throw error\n return ((data ?? []) as Record<string, unknown>[]).map((row: Record<string, unknown>): AdminShopMarket => ({\n id: String(row.id),\n code: String(row.code),\n name: String(row.name),\n currency: String(row.currency),\n locale: (row.locale as string | null) ?? null,\n countries: Array.isArray(row.countries) ? (row.countries as string[]) : [],\n isDefault: Boolean(row.is_default),\n isActive: Boolean(row.is_active),\n paymentProvider: (row.payment_provider as string | null) ?? null,\n shippingFlatRate: Number(row.shipping_flat_rate ?? 0),\n shippingFreeAbove: row.shipping_free_above == null ? null : Number(row.shipping_free_above),\n priceTableId: (row.price_table_id as string | null) ?? null,\n}))\n }\n\n /**\n * Product-level rows of each market's price table for a CATALOGUE product\n * (public.products.id — what price_table_items keys on). Variant rows are\n * left alone: this is the product's price, a variant can still override it.\n */\n async getCatalogMarketPrices(catalogProductId: string): Promise<CatalogMarketPrice[]> {\n const markets = await this.listAdminMarkets()\n const tables = markets.map((m) => m.priceTableId).filter((id): id is string => !!id)\n if (!tables.length) return markets.map((m) => ({ marketId: m.id, price: null }))\n const { data, error } = await getDb()\n .from('price_table_items')\n .select('price_table_id, price')\n .eq('product_id', catalogProductId)\n .is('variant_id', null)\n .eq('min_qty', 1)\n .in('price_table_id', tables)\n if (error) throw error\n const byTable = new Map(((data ?? []) as { price_table_id: string; price: number }[]).map((r) => [r.price_table_id, Number(r.price)]))\n return markets.map((m) => ({ marketId: m.id, price: m.priceTableId ? byTable.get(m.priceTableId) ?? null : null }))\n }\n\n async setCatalogMarketPrice(catalogProductId: string, marketId: string, price: number | null): Promise<void> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('Nenhuma loja selecionada')\n const market = (await this.listAdminMarkets()).find((m) => m.id === marketId)\n if (!market?.priceTableId) throw new Error('Este mercado ainda não tem tabela de preço')\n const db = getDb()\n const { data: existing, error: readError } = await db\n .from('price_table_items')\n .select('id')\n .eq('price_table_id', market.priceTableId)\n .eq('product_id', catalogProductId)\n .is('variant_id', null)\n .eq('min_qty', 1)\n .maybeSingle()\n if (readError) throw readError\n if (price == null) {\n if (existing) {\n const { error } = await db.from('price_table_items').delete().eq('id', (existing as { id: string }).id)\n if (error) throw error\n }\n return\n }\n if (existing) {\n const { error } = await db.from('price_table_items').update({ price }).eq('id', (existing as { id: string }).id)\n if (error) throw error\n return\n }\n const { error } = await db.from('price_table_items').insert({\n tenant_id: tenantId,\n price_table_id: market.priceTableId,\n product_id: catalogProductId,\n price,\n min_qty: 1,\n })\n if (error) throw error\n }\n\n async getMarketPrices(market: string): Promise<MarketPrice[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb().rpc('shop_public_market_prices', { p_tenant_id: tenantId, p_market: market })\n if (error) return []\n return ((data ?? []) as Record<string, unknown>[]).map((row) => ({\n productId: String(row.product_id),\n variantId: (row.variant_id as string | null) ?? null,\n price: Number(row.price),\n }))\n }\n\n /**\n * Settle a pending order: the merchant confirming that the money arrived.\n *\n * Goes through the RPC rather than an UPDATE so the payment ledger row in\n * public.transactions closes in the same transaction as the order — set\n * financial_status by hand and the order says paid while the ledger still\n * says pending. Since 0019 the RPC also enforces who may call it: a member of\n * the owning tenant, or a PSP webhook with the service role.\n */\n async confirmPayment(id: string, reference?: string): Promise<Order | null> {\n const { error } = await getDb().rpc('shop_confirm_payment', {\n p_order_id: id,\n p_reference: reference ?? null,\n })\n if (error) throw error\n return this.getOrder(id)\n }\n\n // ---------------------------------------------------------------------------\n // Carrier labels. Everything goes through the function: the token never\n // reaches the browser, and `buy` is the one call that spends money.\n // ---------------------------------------------------------------------------\n\n private async labelCall(orderId: string, action: string, extra: Record<string, unknown> = {}) {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: shipping labels require a tenant id.')\n const { ok, payload } = await callShopFunction(getDb(), 'shop-shipping-label', {\n tenantId, orderId, action, ...extra,\n })\n if (!ok) throw new Error(payload?.error ?? 'A transportadora não respondeu agora.')\n return payload\n }\n\n async quoteShippingLabel(orderId: string, carrier?: string) {\n const payload = await this.labelCall(orderId, 'quote', carrier ? { carrier } : {})\n return {\n options: (payload?.options ?? []).map((option: any) => ({\n serviceId: Number(option.service_id ?? option.serviceId),\n name: String(option.name ?? 'Entrega'),\n carrier: String(option.carrier ?? ''),\n price: Number(option.price ?? 0),\n etaMinDays: option.eta_min_days ?? null,\n etaMaxDays: option.eta_max_days ?? null,\n })),\n label: payload?.label\n ? {\n labelId: String(payload.label.external_id),\n labelUrl: payload.label.url ?? null,\n status: payload.label.status ?? null,\n tracking: payload.label.payload?.tracking ?? null,\n }\n : null,\n }\n }\n\n /** Spends the merchant's balance at the carrier. Never call it on a whim. */\n async buyShippingLabel(orderId: string, serviceId: number, carrier?: string) {\n const payload = await this.labelCall(orderId, 'buy', { serviceId, ...(carrier ? { carrier } : {}) })\n return {\n labelId: String(payload?.labelId ?? ''),\n labelUrl: payload?.labelUrl ?? null,\n status: 'bought',\n tracking: payload?.tracking ?? null,\n }\n }\n\n async printShippingLabel(orderId: string, carrier?: string) {\n const payload = await this.labelCall(orderId, 'print', carrier ? { carrier } : {})\n return payload?.labelUrl ?? null\n }\n\n /** Drop-off points near a place. Store configuration — no order involved. */\n async listShippingAgencies(query: { state?: string; city?: string; carrier?: string }) {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { ok, payload } = await callShopFunction(getDb(), 'shop-shipping-label', {\n tenantId,\n action: 'agencies',\n state: query.state ?? '',\n city: query.city ?? '',\n ...(query.carrier ? { carrier: query.carrier } : {}),\n })\n if (!ok) throw new Error(payload?.error ?? 'A transportadora não respondeu agora.')\n return (payload?.agencies ?? []) as ShippingAgency[]\n }\n\n async trackShippingLabel(orderId: string, carrier?: string) {\n const payload = await this.labelCall(orderId, 'track', carrier ? { carrier } : {})\n return payload?.tracking ?? null\n }\n\n /**\n * The customer's address book, for the console. `shop_place_order` files a\n * new one here on every delivered order, and until now only the storefront\n * read them back — so a repeat customer had their address retyped by hand.\n */\n async listCustomerAddresses(customerId: string): Promise<CustomerAddress[]> {\n if (!asUuid(customerId)) return []\n const { data, error } = await getDb()\n .from('addresses')\n .select('id,label,recipient,phone,postal_code,street,number,complement,district,city,state,country,is_default')\n .eq('owner_type', 'shop_customer')\n .eq('owner_id', customerId)\n .order('is_default', { ascending: false })\n .order('created_at', { ascending: false })\n if (error) return []\n return (data ?? []).map((row: any) => ({\n id: row.id,\n label: row.label ?? undefined,\n recipient: row.recipient ?? undefined,\n phone: row.phone ?? undefined,\n postalCode: row.postal_code ?? '',\n street: row.street ?? '',\n number: row.number ?? undefined,\n complement: row.complement ?? undefined,\n district: row.district ?? undefined,\n city: row.city ?? '',\n state: row.state ?? '',\n country: row.country ?? undefined,\n isDefault: row.is_default ?? false,\n }))\n }\n\n /**\n * What delivery costs to a postcode — the same answer the shopper gets.\n *\n * The console needs it to quote a price out loud while the customer is on the\n * line. Carrier first (when the merchant did not turn gateway quotes off),\n * zones as the fallback, exactly as the storefront resolves it. Advisory\n * either way: shop_place_order requotes and ignores whatever a client sends.\n */\n async quoteShipping(\n postalCode: string,\n subtotal: number,\n address?: PostalAddressHint,\n ): Promise<ShippingQuoteOption[]> {\n const digits = toPostalDigits(postalCode)\n if (!digits) return []\n const tenantId = getTenantId()\n if (!tenantId) return []\n\n // Refusal is checked BEFORE the carrier, not after. The gateway does not\n // know the store refuses a region, so asking it first would put a price on\n // an address the order is going to reject — 0081 §6 does the same inside\n // shop_quote_shipping, and this is the same rule on the branch that never\n // reaches it.\n const refusal = await this.checkDelivery(digits, address).catch(() => null)\n if (refusal?.refused) return []\n\n const settings = await this.getStoreSettings().catch(() => null)\n if (settings?.carrierQuotes !== false) {\n try {\n const { ok, payload } = await callShopFunction(getDb(), 'shop-shipping-quote', {\n tenantId, postalCode: digits, subtotal,\n })\n const rows: any[] = ok ? (payload?.options ?? []) : []\n if (rows.length > 0) {\n return rows.map((row) => ({\n zoneId: String(row.service_id ?? ''),\n name: String(row.name ?? 'Entrega'),\n carrier: row.carrier ?? undefined,\n rate: Number(row.price ?? 0),\n baseRate: Number(row.price ?? 0),\n freeAbove: null,\n etaMinDays: row.eta_min_days ?? undefined,\n etaMaxDays: row.eta_max_days ?? undefined,\n free: Number(row.price ?? 0) === 0,\n }))\n }\n } catch {\n /* no carrier connected, or the bench is down: the zones still answer */\n }\n }\n\n const { data, error } = await getDb().rpc('shop_quote_shipping', {\n p_tenant_id: tenantId,\n p_postal_code: digits,\n p_subtotal: subtotal,\n p_address: addressHintPayload(address),\n })\n if (error) return []\n if (!data?.length) {\n // No zone answered: what shop_place_order charges (shop_shipping_for) is\n // the store's base rate, and [] would read as \"not delivered here\".\n const { data: rate } = await getDb().rpc('shop_shipping_for', {\n p_tenant_id: tenantId, p_subtotal: subtotal, p_postal_code: digits,\n })\n if (rate == null) return []\n const value = Number(rate)\n return [{ zoneId: 'store-base-rate', name: 'Entrega', rate: value, baseRate: value, freeAbove: null, free: value === 0 }]\n }\n return (data ?? []).map((row: any) => ({\n zoneId: row.zone_id,\n name: row.name,\n carrier: row.carrier ?? undefined,\n rate: Number(row.rate ?? 0),\n baseRate: Number(row.base_rate ?? row.rate ?? 0),\n freeAbove: row.free_above == null ? null : Number(row.free_above),\n etaMinDays: row.eta_min_days ?? undefined,\n etaMaxDays: row.eta_max_days ?? undefined,\n free: Boolean(row.free),\n }))\n }\n\n /**\n * Charge a cart that is not an order yet — the phone sale, from the counter's\n * side. Same door the storefront uses, on purpose: `shop_price_cart` inside\n * the function reprices everything, so the console sends products and\n * quantities and never money. The order is born in `settleCheckoutSession`,\n * once the acquirer says the Pix landed, so an abandoned charge leaves no\n * ghost order holding stock.\n */\n async openCheckoutSession(input: CheckoutSessionInput): Promise<CheckoutSession> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: openCheckoutSession requires a tenant id.')\n // Qual porta bater. Quem chama pode dizer; quem não diz, herda o que a LOJA\n // configurou em Ajustes › Pagamento.\n //\n // O padrão era 'abacatepay' direto — o que fazia sentido quando havia um\n // gateway só, e virou um bug silencioso quando passou a haver dois: uma\n // loja na Vindi pedia um link e a cobrança ia abrir na AbacatePay, que não\n // conhece a conta dela. Nenhuma das duas telas passava `provider`, então\n // TODA cobrança do console saía pela porta errada.\n //\n // 'abacatepay' segue como último recurso, para uma loja antiga cujo ajuste\n // nunca foi preenchido continuar cobrando como sempre cobrou.\n const provider = resolveCheckoutProvider(\n input.provider,\n // Só vai ao banco quando ninguém disse: a vitrine já sabe o seu.\n input.provider == null\n ? (await this.getStoreSettings().catch(() => null))?.paymentProvider\n : null,\n )\n const gateway = checkoutGateway(provider)\n if (!gateway) {\n throw new Error('Esta loja ainda não tem um meio de cobrança conectado.')\n }\n // A link is a capability, not a provider: the panel asks the table whether\n // this acquirer mints one, and a store whose gateway cannot is told here\n // rather than by a function answering something the screen cannot use.\n if (input.asLink && !gateway.link) {\n throw new Error('O meio de cobrança desta loja ainda não gera link de pagamento.')\n }\n\n const { ok, status, payload } = await callShopFunction(getDb(), gateway.open, {\n tenantId,\n items: input.items.map((item) => ({\n productId: item.productId,\n optionsLabel: item.optionsLabel ?? null,\n quantity: item.quantity,\n })),\n customer: input.customer,\n shippingAddress: input.shippingAddress ?? null,\n discountCode: input.discountCode ?? null,\n market: input.market ?? null,\n country: input.country ?? input.shippingAddress?.country ?? null,\n // What the buyer chose, in the store's words. The gateway translates it to\n // whatever its own API calls that method, and refuses if the merchant\n // never enabled it — which is a different answer from \"no acquirer\".\n method: input.paymentMethod ?? null,\n returnUrl: input.returnUrl ?? null,\n asLink: input.asLink === true,\n // The card, when it is typed INSIDE the store — a single-use token from\n // the acquirer's own browser SDK, never a card number. Forwarded here for\n // the same reason it is forwarded in @fayz-ai/sdk's provider: this body is\n // assembled field by field, so anything the list omits is dropped in\n // silence, and the buyer is told \"we did not receive the card details\"\n // after filling in a perfectly good card.\n cardToken: input.cardToken ?? null,\n installments: input.installments ?? null,\n paymentMethodId: input.paymentMethodId ?? null,\n issuerId: input.issuerId ?? null,\n deviceId: input.deviceId ?? null,\n })\n\n if (!ok || !payload?.sessionId) {\n // 404 arrives by two roads — no acquirer connected, or the function was\n // never deployed to this pool — and both mean \"charge some other way\".\n const failure = new Error(payload?.error ?? (status === 404\n ? 'Esta loja ainda não tem um meio de cobrança conectado.'\n : 'Não conseguimos abrir a cobrança agora.')) as Error & {\n status?: number\n code?: string\n }\n // The STATUS and the CODE travel with the message, because the checkout\n // asks about them to tell a refusal apart from a failure: 404 (no\n // acquirer) and 409 `method_unavailable` (an acquirer that does not sell\n // this method) both mean \"offer the order without an online charge\",\n // while anything else is genuinely broken and deserves to be shown.\n //\n // A bare Error carries neither, so both of those questions were answered\n // \"no\" no matter what the server said — and a store that simply does not\n // charge card was painting the provider's refusal as an error with a\n // \"Tentar de novo\" button that could never succeed.\n failure.status = status\n if (payload?.code) failure.code = String(payload.code)\n throw failure\n }\n\n return {\n sessionId: payload.sessionId,\n total: Number(payload.total ?? 0),\n state: 'open',\n provider,\n method: payload.method ?? input.paymentMethod ?? null,\n // One field for two situations that are the same thing from here: a link\n // the merchant sends, and the page a card buyer is redirected to. Both are\n // \"this payment happens on the acquirer's page\", and the caller decides\n // whether to copy it or to go there.\n paymentUrl: payload.redirectUrl ?? payload.paymentUrl ?? null,\n charge: payload.brCode\n ? {\n emv: payload.brCode,\n // AbacatePay embeds the `data:` prefix; the type promises bare\n // base64. Left in, the view prefixes it again and the QR is a\n // silently broken <img>.\n //\n // Vindi sends no base64 at all — its `qrCodeUrl` is a URL to an SVG,\n // which cannot be squeezed into this field without lying about what\n // it is. It travels beside it instead, and the view draws whichever\n // arrived.\n qrcodeBase64: String(payload.brCodeBase64 ?? '').replace(/^data:image\\/\\w+;base64,/u, '') || null,\n qrcodeUrl: String(payload.qrCodeUrl ?? '').trim() || null,\n expiresAt: payload.expiresAt ?? '',\n }\n : null,\n }\n }\n\n /**\n * Ask whether the money landed. Runs on a timer, so a network blip must read\n * as \"still waiting\" (`unknown`) and never as a refused payment.\n *\n * `provider` names which gateway opened the session — handed back by\n * `openCheckoutSession` rather than re-read from settings, because a merchant\n * who switches acquirer mid-checkout would otherwise have the new gateway\n * asked about a transaction that lives in the old one.\n */\n async settleCheckoutSession(\n sessionId: string,\n provider?: string | null,\n chargeToken?: string | null,\n ): Promise<CheckoutSettlement> {\n const tenantId = getTenantId()\n if (!tenantId) return { state: 'unknown' }\n const gateway = checkoutGateway(String(provider ?? '').trim() || 'abacatepay')\n if (!gateway) return { state: 'unknown' }\n try {\n // `chargeToken` is a HINT and never a claim — see the settle function. It\n // is what the acquirer put in the URL a buyer came back on, and it settles\n // the sale on their return instead of leaving them waiting for a webhook.\n const { ok, payload } = await callShopFunction(getDb(), gateway.settle, {\n tenantId,\n sessionId,\n ...(chargeToken ? { chargeToken } : {}),\n }, { timeoutMs: 12_000 })\n if (!ok || !payload?.state) return { state: 'unknown' }\n return { state: payload.state, orderId: payload.orderId ?? null, reason: payload.reason ?? null }\n } catch {\n return { state: 'unknown' }\n }\n }\n\n /**\n * Remember the contact details of whoever is signed in.\n *\n * Called when the buyer leaves the contact step, not when an order completes:\n * an abandoned checkout teaches the store nothing, and the person who most\n * needs the field remembered is the one who did not finish. The function\n * decides what may be written and to whose row — this only carries the values.\n */\n async paymentPublicKey(provider: string): Promise<string | null> {\n const tenantId = getTenantId()\n const gateway = checkoutGateway(provider)\n if (!tenantId || !gateway) return null\n const { ok, payload } = await callShopFunction(getDb(), gateway.open, {\n tenantId,\n action: 'public_key',\n })\n // Null and not a throw: a store whose acquirer needs no browser key is the\n // normal case, and the caller decides what to render without it.\n return ok ? (payload?.publicKey ?? null) : null\n }\n\n async saveCustomerContact(input: { phone?: string | null; document?: string | null }): Promise<void> {\n const tenantId = getTenantId()\n if (!tenantId) return\n const { error } = await getDb().rpc('shop_save_customer_contact', {\n p_tenant_id: tenantId,\n p_phone: input.phone ?? null,\n p_document: input.document ?? null,\n })\n // Never blocking: failing to remember a phone must not stop a purchase.\n if (error) console.warn('[shop] could not save customer contact:', error.message)\n }\n\n // Trusted placement — delegates all price/discount/inventory authority to the\n // shop_place_order RPC (SECURITY DEFINER). The browser never sets a price.\n /**\n * The argument mapping placing and revising share. Two copies of it would\n * drift on the first field either screen learns to send — and the one that\n * forgot would silently drop it from the order.\n */\n private orderRpcArgs(input: PlaceOrderInput): Record<string, unknown> {\n // Entrega/retirada e agendamento (0094) viajam DENTRO de p_metadata, pela\n // mesma razão que o `document` acima viaja dentro do endereço: a assinatura\n // de shop_place_order não cresce sem um DROP, e um trigger sobe estes dois\n // para as colunas do pedido. Só monta a chave quando há o que dizer — um\n // servidor pré-0029 recusa argumento NOMEADO desconhecido.\n const deliveryMeta =\n input.fulfillmentType !== undefined || input.scheduledFor !== undefined\n ? {\n ...(input.fulfillmentType !== undefined\n ? { fulfillment_type: input.fulfillmentType }\n : {}),\n ...(input.scheduledFor !== undefined ? { scheduled_for: input.scheduledFor } : {}),\n }\n : null\n const metadata =\n deliveryMeta || input.metadata !== undefined\n ? { ...(input.metadata ?? {}), ...(deliveryMeta ?? {}) }\n : undefined\n\n return {\n // variant_id rides on each line (0029): the RPC prices and decrements\n // the variant when present, product-level otherwise. Pre-0029 servers\n // ignore unknown jsonb keys, so this stays compatible either way.\n p_items: input.items.map(i => ({\n product_id: i.productId,\n variant_id: asUuid(i.variantId) ?? undefined,\n quantity: i.quantity,\n options_label: i.optionsLabel ?? null,\n // 0094. Chave jsonb desconhecida é ignorada por servidor antigo, então\n // isto é seguro de mandar sempre — ao contrário de um argumento nomeado.\n notes: i.notes ?? null,\n })),\n p_customer_id: asUuid(input.customerId),\n p_customer_name: input.customer?.name ?? null,\n p_customer_email: input.customer?.email ?? null,\n p_currency: input.currency ?? 'BRL',\n p_discount_code: input.discountCode ?? null,\n p_shipping_total: input.shippingTotal ?? 0,\n // snake_case keys on purpose: the RPC freezes this jsonb onto the\n // order and public.addresses uses these exact column names.\n p_shipping_address: input.shippingAddress\n ? {\n postal_code: input.shippingAddress.postalCode,\n street: input.shippingAddress.street,\n number: input.shippingAddress.number ?? null,\n complement: input.shippingAddress.complement ?? null,\n district: input.shippingAddress.district ?? null,\n city: input.shippingAddress.city,\n state: input.shippingAddress.state,\n country: input.shippingAddress.country ?? 'BR',\n recipient: input.shippingAddress.recipient ?? null,\n phone: input.shippingAddress.phone ?? null,\n label: input.shippingAddress.label ?? null,\n // Not an address field: it rides here because shop_place_order's\n // signature cannot grow without a DROP, and 0050's trigger lifts it to\n // plg_shop_orders.customer_document. The storefront already sent it;\n // the console did not, so a phone sale was born with no CPF.\n document: input.shippingAddress.document ?? null,\n }\n : null,\n p_payment_method: input.paymentMethod ?? null,\n p_notes: input.notes ?? null,\n // Only when something contributed: p_metadata exists from 0029 on, and\n // a pre-0029 server rejects unknown NAMED arguments (unlike unknown\n // jsonb keys). Absent metadata therefore must not send the key at all.\n ...(metadata !== undefined ? { p_metadata: metadata } : {}),\n }\n }\n\n async placeOrder(input: PlaceOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: placeOrder requires a tenant id (configure the shop tenant resolver).')\n const { data, error } = await db.rpc('shop_place_order', {\n p_tenant_id: tenantId,\n ...this.orderRpcArgs(input),\n })\n if (error) throw error\n const orderId = typeof data === 'string' ? data : (data?.id ?? data?.order_id ?? data)\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: placeOrder did not return a persisted order.')\n emitOrderEvent('order_confirmation', order)\n return order\n }\n\n async findOpenOrderCharge(orderId: string): Promise<CheckoutSession | null> {\n const { data, error } = await getDb()\n .from(T.checkoutSessions)\n .select('id,total,currency,provider,payment_method,charge_payload,expires_at,status')\n .eq('order_id', orderId)\n .eq('status', 'open')\n .gt('expires_at', new Date().toISOString())\n .order('created_at', { ascending: false })\n .limit(1)\n // Uma loja sem a tabela (pool anterior a 0059) não tem cobrança aberta para\n // mostrar — não é erro, é ausência.\n if (error || !data?.length) return null\n\n const row = data[0] as Record<string, any>\n const payload = (row.charge_payload ?? {}) as Record<string, any>\n const link = payload.redirectUrl ?? payload.paymentUrl ?? payload.url\n ?? cartPaymentUrl(payload.url_car, payload.cart_token)\n // Nem código, nem link: a abertura não chegou ao fim. Devolver isso seria\n // entregar ao painel uma cobrança que não existe — e, pior, impedir que uma\n // de verdade fosse aberta no lugar dela.\n if (!payload.brCode && !link) return null\n\n return {\n sessionId: row.id,\n total: Number(row.total ?? 0),\n state: 'open',\n provider: row.provider ?? null,\n method: row.payment_method ?? null,\n // Cada adquirente guarda o endereço com o nome dele. A AbacatePay grava\n // `url`; a Vindi grava o carrinho da Yapay em `url_car` + `cart_token`, e\n // a URL de pagamento é a junção dos dois — foi por não conhecer esse par\n // que \"Ver cobrança\" abria uma janela sem link nenhum, com um link que\n // estava gravado ali do lado.\n paymentUrl: link ?? null,\n // O MESMO mapeamento de openCheckoutSession, e pelas mesmas razões: a\n // AbacatePay devolve bytes base64 (com prefixo `data:`, que a tela\n // prefixaria de novo) e a Vindi devolve a URL de um SVG. Desenhar um como\n // o outro é um <img> quebrado na hora exata em que alguém vai pagar.\n charge: payload.brCode\n ? {\n emv: String(payload.brCode),\n qrcodeBase64: String(payload.brCodeBase64 ?? '').replace(/^data:image\\/\\w+;base64,/u, '') || null,\n qrcodeUrl: String(payload.qrCodeUrl ?? '').trim() || null,\n expiresAt: row.expires_at ?? null,\n }\n : null,\n } as CheckoutSession\n }\n\n async chargeExistingOrder(\n orderId: string,\n options?: { asLink?: boolean; paymentMethod?: PaymentMethodKind; returnUrl?: string },\n ): Promise<CheckoutSession> {\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: chargeExistingOrder requires an existing order.')\n if (order.status !== 'open' || order.financialStatus !== 'pending') {\n throw new Error('Este pedido não está aberto e sem pagamento.')\n }\n // O adquirente exige o e-mail do pagador, e é a MESMA exigência que a tela\n // de venda faz antes de gerar um link. Recusar aqui nomeia o que falta; sem\n // isto o erro viria do outro lado do mundo, em inglês.\n const email = order.customerEmail?.trim()\n if (!email) {\n throw new Error('Para cobrar este pedido o cadastro do cliente precisa de e-mail.')\n }\n // Já existe uma em aberto? Então o ato é MOSTRAR, não cobrar de novo.\n const standing = await this.findOpenOrderCharge(orderId)\n if (standing) return standing\n\n const address = order.shippingAddress\n const session = await this.openCheckoutSession!({\n // Os itens do pedido, sem preço: a sessão reprecifica pelo catálogo, e é\n // a amarração que confere se o resultado bate com o que o pedido pede.\n items: order.items\n .filter((item) => item.productId)\n .map((item) => ({ productId: item.productId as string, quantity: item.quantity })),\n customer: { name: order.customerName, email },\n shippingAddress: address\n ? {\n postalCode: address.postal_code ?? '',\n street: address.street ?? '',\n number: address.number,\n complement: address.complement,\n district: address.district,\n city: address.city ?? '',\n state: address.state ?? '',\n country: address.country,\n recipient: address.recipient,\n phone: address.phone,\n }\n : undefined,\n discountCode: order.discountCode ?? undefined,\n paymentMethod: options?.paymentMethod,\n returnUrl: options?.returnUrl,\n asLink: options?.asLink,\n })\n\n const { error } = await getDb().rpc('shop_bind_session_to_order', {\n p_session_id: session.sessionId,\n p_order_id: orderId,\n })\n if (error) {\n // A cobrança já existe no adquirente neste ponto. Uma sessão sem dono que\n // alguém pague depois vira um pedido NOVO — a duplicata exata que este\n // caminho existe para evitar. Fechá-la é o que impede isso; se a loja não\n // puder escrever na linha, o erro original ainda é o que sobe.\n await getDb().from(T.checkoutSessions)\n .update({ status: 'cancelled', failure_reason: 'bind_failed' })\n .eq('id', session.sessionId)\n .then(undefined, () => undefined)\n const text = String((error as { message?: string }).message ?? '')\n if (/shop_bind_session_to_order/u.test(text) && /find the function|does not exist/iu.test(text)) {\n throw new Error('Cobrar um pedido salvo ainda não foi aplicado nesta loja (migration 0073).')\n }\n throw error\n }\n return session\n }\n\n async reviseOrder(orderId: string, input: PlaceOrderInput): Promise<Order> {\n const args = this.orderRpcArgs(input)\n // shop_update_order takes the order, not the tenant: the order already\n // belongs to one, and letting the caller name a different one would be a\n // door into another store's documents.\n const { error } = await getDb().rpc('shop_update_order', {\n p_order_id: orderId,\n p_items: args.p_items,\n p_customer_id: args.p_customer_id,\n p_customer_name: args.p_customer_name,\n p_customer_email: args.p_customer_email,\n p_discount_code: args.p_discount_code,\n p_notes: args.p_notes,\n p_shipping_address: args.p_shipping_address,\n p_payment_method: args.p_payment_method,\n })\n if (error) {\n // A loja que ainda não recebeu a 0072 responde com o texto do PostgREST\n // sobre cache de schema, que não diz ao lojista nada acionável.\n const text = String((error as { message?: string }).message ?? '')\n if (/shop_update_order/u.test(text) && /find the function|does not exist/iu.test(text)) {\n throw new Error('A edição de pedidos ainda não foi aplicada nesta loja (migration 0072).')\n }\n throw error\n }\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: reviseOrder did not return a persisted order.')\n return order\n }\n\n // ---------------------------------------------------------------------------\n // Customers\n // ---------------------------------------------------------------------------\n\n async listCustomers(options?: ListCustomersOptions): Promise<ShopCustomer[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(V.customers).select('*').order('first_name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n // Word by word, ANDed — see customerSearchFilters.\n for (const filter of customerSearchFilters(options?.search)) q = q.or(filter)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomer)\n }\n\n async getCustomer(id: string): Promise<ShopCustomer | null> {\n const { data, error } = await getDb().from(V.customers).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToCustomer(data) : null\n }\n\n async createCustomer(input: CreateCustomerInput): Promise<ShopCustomer> {\n const { data, error } = await getDb()\n .from(T.customers)\n .insert({\n tenant_id: getTenantId(),\n first_name: input.firstName,\n last_name: input.lastName ?? '',\n email: input.email ?? null,\n phone: input.phone ?? null,\n document: input.document ?? null,\n notes: input.notes ?? null,\n })\n .select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async updateCustomer(id: string, input: UpdateCustomerInput): Promise<ShopCustomer> {\n const updates: Record<string, unknown> = {}\n if (input.firstName !== undefined) updates.first_name = input.firstName\n if (input.lastName !== undefined) updates.last_name = input.lastName\n if (input.email !== undefined) updates.email = input.email\n if (input.phone !== undefined) updates.phone = input.phone\n if (input.document !== undefined) updates.document = input.document\n if (input.notes !== undefined) updates.notes = input.notes\n const { data, error } = await getDb().from(T.customers).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async deleteCustomer(id: string): Promise<void> {\n const { error } = await getDb().from(T.customers).delete().eq('id', id)\n if (error) throw error\n }\n\n // Find-or-create + link to auth.uid server-side (SECURITY DEFINER RPC), so the\n // browser never supplies the auth id and \"my orders\" is RLS-scoped to the owner.\n async resolveCustomer(input: ResolveCustomerInput): Promise<ShopCustomer> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: resolveCustomer requires a tenant id.')\n const { data, error } = await db.rpc('shop_resolve_customer', {\n p_tenant_id: tenantId,\n p_email: input.email,\n p_name: input.name ?? null,\n })\n if (error) throw error\n const row = Array.isArray(data) ? data[0] : data\n if (!row) throw new Error('@fayz-ai/shop: resolveCustomer returned no row.')\n return rowToCustomer(row)\n }\n\n // ---------------------------------------------------------------------------\n // Promotions (spine M6) — evaluation happens INSIDE the database via the\n // SECURITY DEFINER function (migrations/0033), so an anonymous storefront\n // never reads promotion rows or codes directly: it sends the cart snapshot\n // and receives ordered actions. The function mirrors the TS reference\n // evaluator (src/rules/evaluator.ts), which is the tested spec.\n // ---------------------------------------------------------------------------\n\n async evaluatePromotions(input: { cart: RuleCartSnapshot }): Promise<ComputeAction[]> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: evaluatePromotions requires a tenant id (configure the shop tenant resolver).')\n const cart = input.cart\n const { data, error } = await db.rpc('shop_compute_promotion_actions', {\n p_tenant_id: tenantId,\n // The serializable RuleCartSnapshot, snake_case on the wire — the same\n // contract 0033 documents for p_cart.\n p_cart: {\n items: cart.items.map((item) => ({\n id: item.id ?? item.productId,\n product_id: item.productId,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n category_id: item.categoryId ?? null,\n collection_id: item.collectionId ?? null,\n })),\n shipping_total: cart.shippingTotal ?? null,\n region: cart.region ?? null,\n customer: cart.customer\n ? { email: cart.customer.email ?? null, tags: cart.customer.tags ?? [] }\n : null,\n codes: cart.codes ?? [],\n },\n })\n if (error) throw error\n const rows: Array<Record<string, unknown>> = Array.isArray(data) ? data : []\n return rows.map((row): ComputeAction => {\n const code = (row.code as string | null) ?? null\n if (row.action === 'addShippingDiscount') {\n return { action: 'addShippingDiscount', promotionId: String(row.promotion_id), code, amount: Number(row.amount) }\n }\n if (row.action === 'addFreeItem') {\n return { action: 'addFreeItem', promotionId: String(row.promotion_id), code, productId: String(row.product_id), quantity: Number(row.quantity) }\n }\n return { action: 'addItemDiscount', promotionId: String(row.promotion_id), code, itemId: String(row.item_id), amount: Number(row.amount) }\n })\n }\n\n // ---------------------------------------------------------------------------\n // Discounts\n // ---------------------------------------------------------------------------\n\n async listDiscounts(options?: ListDiscountsOptions): Promise<Discount[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.discounts).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.type) q = q.eq('type', options.type)\n if (options?.search) q = q.ilike('title', `%${options.search}%`)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToDiscount)\n }\n\n async getDiscount(id: string): Promise<Discount | null> {\n const { data, error } = await getDb().from(T.discounts).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToDiscount(data) : null\n }\n\n async createDiscount(input: CreateDiscountInput): Promise<Discount> {\n const { data, error } = await getDb()\n .from(T.discounts)\n .insert({ tenant_id: getTenantId(), title: input.title, code: input.code ?? null, type: input.type, method: input.method ?? 'code', value: input.value, usage_limit: input.usageLimit ?? null, once_per_customer: input.oncePerCustomer ?? false, min_subtotal: input.minSubtotal ?? null, applies_to: input.appliesTo ?? 'all', product_ids: input.productIds ?? [], category_ids: input.categoryIds ?? [], starts_at: input.startsAt ?? new Date().toISOString(), ends_at: input.endsAt ?? null, status: input.status ?? 'active', times_used: 0 })\n .select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async updateDiscount(id: string, input: UpdateDiscountInput): Promise<Discount> {\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.code !== undefined) updates.code = input.code\n if (input.type !== undefined) updates.type = input.type\n if (input.value !== undefined) updates.value = input.value\n if (input.usageLimit !== undefined) updates.usage_limit = input.usageLimit\n if (input.minSubtotal !== undefined) updates.min_subtotal = input.minSubtotal\n if (input.appliesTo !== undefined) updates.applies_to = input.appliesTo\n if (input.productIds !== undefined) updates.product_ids = input.productIds\n if (input.categoryIds !== undefined) updates.category_ids = input.categoryIds\n if (input.status !== undefined) updates.status = input.status\n if (input.endsAt !== undefined) updates.ends_at = input.endsAt\n const { data, error } = await getDb().from(T.discounts).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async deleteDiscount(id: string): Promise<void> {\n const { error } = await getDb().from(T.discounts).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Sales channels\n // ---------------------------------------------------------------------------\n\n async listSalesChannels(): Promise<SalesChannel[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.salesChannels).select('*').order('position', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToSalesChannel)\n }\n\n async createSalesChannel(input: CreateSalesChannelInput): Promise<SalesChannel> {\n const { data, error } = await getDb()\n .from(T.salesChannels)\n .insert({ tenant_id: getTenantId(), kind: input.kind, label: input.label, url: input.url ?? null, enabled: input.enabled ?? true, position: input.position ?? 0 })\n .select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async updateSalesChannel(id: string, input: UpdateSalesChannelInput): Promise<SalesChannel> {\n const updates: Record<string, unknown> = {}\n if (input.kind !== undefined) updates.kind = input.kind\n if (input.label !== undefined) updates.label = input.label\n if (input.url !== undefined) updates.url = input.url\n if (input.enabled !== undefined) updates.enabled = input.enabled\n if (input.position !== undefined) updates.position = input.position\n const { data, error } = await getDb().from(T.salesChannels).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async deleteSalesChannel(id: string): Promise<void> {\n const { error } = await getDb().from(T.salesChannels).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Custom entities (spine M4). Storage resolves through the EntityStore\n // indirection (I5): a promoted entity's registered store wins; everything\n // else reads/writes the generic jsonb table (migration 0030), whose row\n // access is the RLS generated from each declaration (I6).\n // ---------------------------------------------------------------------------\n\n private entityStore(entity: string) {\n return resolveEntityStore(entity, createSupabaseEntityStore)\n }\n\n async listEntityRecords(entity: string, options?: ListEntityRecordsOptions): Promise<EntityRecord[]> {\n return this.entityStore(entity).list(options)\n }\n\n async getEntityRecord(entity: string, id: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).get(id)\n }\n\n async getEntityRecordBySlug(entity: string, slug: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).getBySlug(slug)\n }\n\n async createEntityRecord(entity: string, input: EntityRecordInput): Promise<EntityRecord> {\n return this.entityStore(entity).create(input)\n }\n\n async updateEntityRecord(entity: string, id: string, input: Partial<EntityRecordInput>): Promise<EntityRecord> {\n return this.entityStore(entity).update(id, input)\n }\n\n async deleteEntityRecord(entity: string, id: string): Promise<void> {\n return this.entityStore(entity).delete(id)\n }\n\n // -------------------------------------------------------------------------\n // Coleções, grupos/segmentos, vale-presente, e-mails e mídia.\n // -------------------------------------------------------------------------\n\nasync listCollections(): Promise<Collection[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCollection)\n }\n\n async getCollection(id: string): Promise<Collection | null> {\n const { data, error } = await getDb()\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToCollection(data) : null\n }\n\n async createCollection(input: CreateCollectionInput): Promise<Collection> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.collections)\n .insert({\n tenant_id: tenantId,\n title: input.title,\n handle: input.handle?.trim() || slugify(input.title),\n description: input.description ?? null,\n image_url: input.imageUrl ?? null,\n seo_title: input.seoTitle ?? null,\n seo_description: input.seoDescription ?? null,\n published: input.published ?? true,\n sort_order: input.sortOrder ?? 0,\n })\n .select().single()\n if (error) throw error\n await this.syncCollectionProducts(data.id, tenantId, input.productIds)\n return (await this.getCollection(data.id)) ?? rowToCollection(data)\n }\n\n async updateCollection(id: string, input: UpdateCollectionInput): Promise<Collection> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.handle !== undefined) updates.handle = input.handle?.trim() || slugify(String(input.title ?? ''))\n if (input.description !== undefined) updates.description = input.description\n if (input.imageUrl !== undefined) updates.image_url = input.imageUrl\n if (input.seoTitle !== undefined) updates.seo_title = input.seoTitle\n if (input.seoDescription !== undefined) updates.seo_description = input.seoDescription\n if (input.published !== undefined) updates.published = input.published\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.collections).update(updates).eq('id', id)\n if (error) throw error\n }\n // `undefined` means \"leave the membership alone\" — an edit that only renamed\n // the collection must not empty it.\n if (input.productIds !== undefined) {\n await this.syncCollectionProducts(id, getTenantId(), input.productIds)\n }\n const updated = await this.getCollection(id)\n if (!updated) throw new Error('Collection not found')\n return updated\n }\n\n async deleteCollection(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE.\n const { error } = await getDb().from(T.collections).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerGroups(): Promise<CustomerGroup[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .order('name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomerGroup)\n }\n\n async createCustomerGroup(input: CreateCustomerGroupInput): Promise<CustomerGroup> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.customerGroups)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n description: input.description ?? null,\n color: input.color ?? null,\n })\n .select().single()\n if (error) throw error\n await this.syncGroupMembers(data.id, tenantId, input.customerIds)\n return { ...rowToCustomerGroup(data), customerIds: input.customerIds ?? [] }\n }\n\n async updateCustomerGroup(id: string, input: UpdateCustomerGroupInput): Promise<CustomerGroup> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.description !== undefined) updates.description = input.description\n if (input.color !== undefined) updates.color = input.color\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.customerGroups).update(updates).eq('id', id)\n if (error) throw error\n }\n // undefined means \"leave the membership alone\" — renaming a group must not\n // empty it.\n if (input.customerIds !== undefined) {\n await this.syncGroupMembers(id, getTenantId(), input.customerIds)\n }\n const { data, error } = await db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .eq('id', id).single()\n if (error) throw error\n return rowToCustomerGroup(data)\n }\n\n async deleteCustomerGroup(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE. The CUSTOMERS are untouched —\n // deleting a grouping must never delete the people in it.\n const { error } = await getDb().from(T.customerGroups).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerSegments(): Promise<CustomerSegment[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.customerSegments).select('*').order('name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomerSegment)\n }\n\n async createCustomerSegment(input: CreateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments)\n .insert({ tenant_id: getTenantId(), ...segmentPayload(input), name: input.name })\n .select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async updateCustomerSegment(id: string, input: UpdateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments).update(segmentPayload(input)).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async deleteCustomerSegment(id: string): Promise<void> {\n const { error } = await getDb().from(T.customerSegments).delete().eq('id', id)\n if (error) throw error\n }\n\n async listGiftCards(): Promise<GiftCard[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.giftCards).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToGiftCard)\n }\n\n async createGiftCard(input: CreateGiftCardInput): Promise<GiftCard> {\n const amount = Number(input.initialBalance) || 0\n const { data, error } = await getDb()\n .from(T.giftCards)\n .insert({\n tenant_id: getTenantId(),\n code: (input.code?.trim() || generateGiftCardCode()).toUpperCase(),\n initial_balance: amount,\n // A new card is worth its face value. The admin never types the\n // remaining balance at issue — that is what redemption is for.\n balance: amount,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n expires_at: input.expiresAt ?? null,\n customer_id: asUuid(input.customerId),\n customer_email: input.customerEmail ?? null,\n note: input.note ?? null,\n })\n .select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async updateGiftCard(id: string, input: UpdateGiftCardInput): Promise<GiftCard> {\n const updates: Record<string, unknown> = {}\n if (input.code !== undefined) updates.code = input.code.trim().toUpperCase()\n if (input.balance !== undefined) updates.balance = input.balance\n if (input.status !== undefined) updates.status = input.status\n if (input.expiresAt !== undefined) updates.expires_at = input.expiresAt\n if (input.customerId !== undefined) updates.customer_id = asUuid(input.customerId)\n if (input.customerEmail !== undefined) updates.customer_email = input.customerEmail\n if (input.note !== undefined) updates.note = input.note\n const { data, error } = await getDb().from(T.giftCards).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async deleteGiftCard(id: string): Promise<void> {\n const { error } = await getDb().from(T.giftCards).delete().eq('id', id)\n if (error) throw error\n }\n\n async listEmailTemplates(): Promise<EmailTemplate[]> {\n const db = getDb()\n const tenantId = getTenantId()\n // Only this store's own events: the table is shared with every other module\n // that sends a message, so an unfiltered read would hand the shop screens\n // rows whose event key their catalog cannot resolve.\n let q = db.from(T.messageTemplates).select('*')\n .like('event_key', `${SHOP_EVENT_PREFIX}%`)\n .eq('channel', EMAIL_CHANNEL)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToEmailTemplate)\n }\n\n async upsertEmailTemplate(input: UpsertEmailTemplateInput): Promise<EmailTemplate> {\n const payload: Record<string, unknown> = {\n tenant_id: getTenantId(),\n event_key: `${SHOP_EVENT_PREFIX}${input.event}`,\n channel: EMAIL_CHANNEL,\n }\n if (input.enabled !== undefined) payload.enabled = input.enabled\n if (input.subject !== undefined) payload.subject = input.subject\n if (input.body !== undefined) payload.body = input.body\n // Upsert on (tenant, event, channel): the row is an override that may not\n // exist yet, and toggling a never-customised template is the common case.\n const { data, error } = await getDb()\n .from(T.messageTemplates)\n .upsert(payload, { onConflict: 'tenant_id,event_key,channel' })\n .select().single()\n if (error) throw error\n return rowToEmailTemplate(data)\n }\n\n async listMediaFiles(): Promise<MediaFile[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n // Two sources, on purpose. The bucket answers \"what files exist\"; the\n // product_images rows answer \"what is attached to what\", which storage\n // cannot say — and a product photo sits at {tenant}/products/{id}/…, one\n // level below where a bounded walk reaches, so it was invisible here.\n // Reading the rows also keeps a photo that was detached from its product\n // out of the library instead of showing a file of nothing.\n const [attached, library] = await Promise.all([\n this.listAttachedMedia(tenantId),\n this.listLibraryFiles(tenantId),\n ])\n return mergeMediaFiles(attached, library)\n }\n\n /** Every product photo in the store, each one carrying its product. */\n private async listAttachedMedia(tenantId: string): Promise<MediaFile[]> {\n const db = getDb()\n const { data: rows, error } = await db\n .from(T.productImages)\n .select('id,product_id,url,alt_text,sort_order,is_primary,created_at')\n .eq('tenant_id', tenantId)\n .order('created_at', { ascending: false })\n .limit(1000)\n if (error || !rows?.length) return []\n\n // Names in one read: a catalogue of 200 products with four photos each is\n // still one query, where a lookup per photo would be 800.\n const productIds = [...new Set(rows.map((r: any) => r.product_id).filter(Boolean))]\n const { data: products } = await db\n .from(T.products).select('id,name').in('id', productIds)\n const nameById = new Map<string, string>((products ?? []).map((p: any) => [p.id, p.name]))\n\n return rows.map((row: any) =>\n productImageToMediaFile(rowToImage(row), nameById.get(row.product_id)))\n }\n\n /** What the merchant uploaded straight to the library — owned by nothing. */\n private async listLibraryFiles(tenantId: string): Promise<MediaFile[]> {\n const bucket = getDb().storage.from(T.mediaBucket)\n\n // The bucket is laid out {tenant}/library and {tenant}/products/{id}, and\n // storage.list walks one level at a time. Bounded to the tenant root plus\n // one level: products are covered by the rows above, so there is nothing\n // left down there worth an unbounded recursion.\n const listAt = async (prefix: string): Promise<{ prefix: string; entry: any }[]> => {\n const { data, error } = await bucket.list(prefix, {\n limit: 1000,\n sortBy: { column: 'created_at', order: 'desc' },\n })\n if (error) return []\n return (data ?? []).map((entry: any) => ({ prefix, entry }))\n }\n\n const top = await listAt(tenantId)\n // An entry with no `id` is a folder placeholder, not an object. Only the\n // library folder is worth descending into.\n const folders = top\n .filter(({ entry }) => !entry.id && entry.name === LIBRARY_FOLDER)\n .map(({ entry }) => `${tenantId}/${entry.name}`)\n const nested = (await Promise.all(folders.map(listAt))).flat()\n\n return [...top, ...nested]\n .filter(({ entry }) => entry.id)\n .map(({ prefix, entry }) => {\n const path = `${prefix}/${entry.name}`\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n const name = displayNameOf(entry.name)\n const file: MediaFile = {\n id: path,\n name,\n url: publicUrl,\n kind: mediaKindOf(entry.name, entry.metadata?.mimetype),\n size: Number(entry.metadata?.size ?? 0),\n extension: (entry.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: entry.created_at ?? entry.updated_at ?? '',\n }\n return file\n })\n }\n\n async uploadMediaFile(rawFile: File): Promise<MediaFile> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: no active tenant for media upload')\n // Same rule as product photos: a bounded WebP source, or the file itself\n // when it is not a photo this can improve (a PDF, a GIF, an SVG).\n const file = await optimizeImageForUpload(rawFile)\n // `library/` keeps hand-uploaded assets out of products/{id}, so deleting a\n // product never takes a banner the merchant uploaded here down with it.\n const path = `${tenantId}/${LIBRARY_FOLDER}/${Date.now()}-${file.name}`\n const bucket = db.storage.from(T.mediaBucket)\n const { error } = await bucket.upload(path, file, IMMUTABLE_OBJECT)\n if (error) throw error\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n return {\n id: path,\n name: file.name,\n url: publicUrl,\n kind: mediaKindOf(file.name, file.type),\n size: file.size,\n extension: (file.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: new Date().toISOString(),\n }\n }\n\n async deleteMediaFile(id: string): Promise<void> {\n const { error } = await getDb().storage.from(T.mediaBucket).remove([id])\n if (error) throw error\n }\n\nprivate async syncCollectionProducts(\n collectionId: string,\n tenantId: string | undefined,\n productIds: string[] | undefined,\n ): Promise<void> {\n if (productIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.collectionProducts).delete().eq('collection_id', collectionId)\n if (delErr) throw delErr\n if (productIds.length === 0) return\n const rows = productIds.map((productId, position) => ({\n collection_id: collectionId, product_id: productId, tenant_id: tenantId, position,\n }))\n const { error } = await db.from(T.collectionProducts).insert(rows)\n if (error) throw error\n }\n\n private async syncGroupMembers(\n groupId: string,\n tenantId: string | undefined,\n customerIds: string[] | undefined,\n ): Promise<void> {\n if (customerIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.customerGroupMembers).delete().eq('group_id', groupId)\n if (delErr) throw delErr\n if (customerIds.length === 0) return\n const rows = customerIds.map((customerId) => ({\n group_id: groupId, customer_id: customerId, tenant_id: tenantId,\n }))\n const { error } = await db.from(T.customerGroupMembers).insert(rows)\n if (error) throw error\n }\n}\n\nexport function createSupabaseShopProvider(): ShopProvider {\n return new SupabaseShopProvider()\n}\n","import type { ShippingLabel, ShippingLabelOption } from '../types'\n\n// ---------------------------------------------------------------------------\n// Labels as a PORT, and the carrier as an implementation of it.\n//\n// Melhor Envio is what this store has connected today; Correios, Kangu, Frenet\n// and a merchant's own courier contract are the same four verbs. Writing the\n// panel against the carrier's name would put \"melhorEnvio\" in a screen that has\n// no business knowing who carries the box — and the second carrier would then\n// be a second button next to the first, forever.\n//\n// Same shape the stock ledger uses (registerStockStore/resolveStockStore): a\n// registry keyed by id, and a resolver that answers WHICH one is in play. The\n// registry is filled at plugin install; the resolver reads what the merchant\n// connected and chose, never a hard-coded name.\n// ---------------------------------------------------------------------------\n\nexport interface ShippingLabelProvider {\n /** Connector slug — the id `connections.connector_id` carries. */\n id: string\n /** How the merchant knows them (\"Melhor Envio\"). Shown in the panel. */\n label: string\n /** Services and prices for one order. Free, repeatable, spends nothing. */\n quote(orderId: string): Promise<{ options: ShippingLabelOption[]; label: ShippingLabel | null }>\n /** SPENDS the merchant's balance. Idempotent per order by contract. */\n buy(orderId: string, serviceId: number): Promise<ShippingLabel>\n /** The label PDF, as many times as the merchant needs it. */\n print(orderId: string): Promise<string | null>\n /** What the carrier says now. */\n track(orderId: string): Promise<ShippingLabel['tracking']>\n}\n\nconst registry = new Map<string, ShippingLabelProvider>()\n\nexport function registerShippingLabelProvider(provider: ShippingLabelProvider): void {\n registry.set(provider.id, provider)\n}\n\nexport function listShippingLabelProviders(): ShippingLabelProvider[] {\n return [...registry.values()]\n}\n\n/** Test seam — the registry is module state, and a test that registers a fake\n * must not leak it into the next one. */\nexport function resetShippingLabelProviders(): void {\n registry.clear()\n}\n\nexport interface ResolveShippingLabelOptions {\n /** Connector ids the store has ACTIVE, in the order the panel lists them. */\n connected: readonly string[]\n /**\n * The merchant's explicit choice, when they made one.\n *\n * `''` (empty, not undefined) is a decision too — \"I print labels myself\" —\n * and it must beat every connected carrier, exactly as the payment provider\n * setting treats \"confirmo à mão\".\n */\n preferred?: string | null\n}\n\n/**\n * Which carrier issues this store's labels — or nobody.\n *\n * Null is a first-class answer and the common one: most stores dispatch by hand,\n * and the panel must show them the manual path without a dead button beside it.\n */\nexport function resolveShippingLabelProvider(\n options: ResolveShippingLabelOptions,\n): ShippingLabelProvider | null {\n const { connected, preferred } = options\n\n // An explicit empty string means the merchant turned it off.\n if (preferred === '') return null\n\n if (preferred) {\n const chosen = registry.get(preferred)\n // Chosen but no longer connected: the panel must not offer to spend money\n // through a grant that was revoked.\n return chosen && connected.includes(preferred) ? chosen : null\n }\n\n for (const id of connected) {\n const found = registry.get(id)\n if (found) return found\n }\n return null\n}\n","// ---------------------------------------------------------------------------\n// CPF / CNPJ — the one field a Brazilian checkout cannot fake.\n//\n// The gateway rejects a malformed document with an opaque error and the buyer is\n// left staring at \"não foi possível concluir o pedido\". Checking the digits here\n// turns that into a message under the field, before the charge is even opened.\n// ---------------------------------------------------------------------------\n\nexport type DocumentKind = 'cpf' | 'cnpj'\n\nexport const documentDigits = (value: string | null | undefined): string =>\n String(value ?? '').replace(/\\D/g, '')\n\n/** Weighted modulo-11 check digit, the shared half of both algorithms. */\nfunction checkDigit(digits: string, weights: readonly number[]): number {\n const sum = weights.reduce((acc, weight, index) => acc + Number(digits[index]) * weight, 0)\n const rest = sum % 11\n return rest < 2 ? 0 : 11 - rest\n}\n\nconst CPF_FIRST = [10, 9, 8, 7, 6, 5, 4, 3, 2] as const\nconst CPF_SECOND = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2] as const\nconst CNPJ_FIRST = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const\nconst CNPJ_SECOND = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const\n\nexport function isValidCpf(value: string | null | undefined): boolean {\n const digits = documentDigits(value)\n // 111.111.111-11 and its siblings satisfy the checksum, which is why every\n // implementation has to reject them by hand.\n if (digits.length !== 11 || /^(\\d)\\1{10}$/.test(digits)) return false\n return (\n checkDigit(digits, CPF_FIRST) === Number(digits[9]) &&\n checkDigit(digits, CPF_SECOND) === Number(digits[10])\n )\n}\n\nexport function isValidCnpj(value: string | null | undefined): boolean {\n const digits = documentDigits(value)\n if (digits.length !== 14 || /^(\\d)\\1{13}$/.test(digits)) return false\n return (\n checkDigit(digits, CNPJ_FIRST) === Number(digits[12]) &&\n checkDigit(digits, CNPJ_SECOND) === Number(digits[13])\n )\n}\n\n/** Which document this is, by length — `null` when it is neither yet. */\nexport function documentKind(value: string | null | undefined): DocumentKind | null {\n const length = documentDigits(value).length\n if (length === 11) return 'cpf'\n if (length === 14) return 'cnpj'\n return null\n}\n\nexport function isValidDocument(value: string | null | undefined): boolean {\n const kind = documentKind(value)\n return kind === 'cpf' ? isValidCpf(value) : kind === 'cnpj' ? isValidCnpj(value) : false\n}\n\n/**\n * Progressive mask: formats what is typed so far and never blocks typing.\n * A mask that only formats complete input leaves the field jumping at the end.\n */\nexport function formatDocument(value: string | null | undefined): string {\n const digits = documentDigits(value).slice(0, 14)\n if (digits.length <= 11) {\n return digits\n .replace(/^(\\d{3})(\\d)/, '$1.$2')\n .replace(/^(\\d{3})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/\\.(\\d{3})(\\d{1,2})$/, '.$1-$2')\n }\n return digits\n .replace(/^(\\d{2})(\\d)/, '$1.$2')\n .replace(/^(\\d{2})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/\\.(\\d{3})(\\d)/, '.$1/$2')\n .replace(/(\\d{4})(\\d{1,2})$/, '$1-$2')\n}\n","import type { EmailEventKey, EmailTemplate, EmailTemplateKind } from '../types'\n\n// ---------------------------------------------------------------------------\n// The store's email event catalog.\n//\n// It lives in CODE, not the database: fulfilment is what fires \"order shipped\",\n// so an event only exists if code emits it. A catalog table would need a\n// migration per new event and would keep orphan rows when one went away.\n//\n// The database holds only the merchant's OVERRIDE (plg_automations_templates):\n// on or off, and the text where they rewrote it. No row means \"use the default\n// here\" — true for most stores, and it lets improvements to the default text\n// reach everyone who never customised.\n// ---------------------------------------------------------------------------\n\nexport interface EmailEventDef {\n event: EmailEventKey\n kind: EmailTemplateKind\n /** Template name in the list. */\n title: string\n /** What it does, in one line. */\n description: string\n /** When it fires — the \"event\" half of the pair. */\n trigger: string\n defaultSubject: string\n defaultBody: string\n /** lucide icon for the row. */\n icon: string\n /** On by default in a new store. Order confirmation is the only email a buyer\n * EXPECTS; the rest are the merchant's choice. */\n defaultEnabled: boolean\n}\n\n/** Placeholders the send substitutes. Documented here because this is what the\n * merchant may type in the editor without breaking anything. */\nexport const EMAIL_PLACEHOLDERS = [\n '{{store_name}}', '{{customer_name}}', '{{order_number}}', '{{order_total}}',\n '{{order_items}}', '{{tracking_code}}', '{{cart_url}}',\n] as const\n\nexport const SHOP_EMAIL_EVENTS: EmailEventDef[] = [\n {\n event: 'order_confirmation', kind: 'transactional', icon: 'CircleCheck',\n title: 'Confirmação de pedido',\n description: 'Enviado quando o cliente conclui a compra',\n trigger: 'Imediatamente após o checkout',\n defaultSubject: 'Pedido #{{order_number}} confirmado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nRecebemos seu pedido #{{order_number}}.\\n\\n{{order_items}}\\n\\nTotal: {{order_total}}\\n\\nObrigado por comprar na {{store_name}}!',\n defaultEnabled: true,\n },\n {\n event: 'order_paid', kind: 'transactional', icon: 'CreditCard',\n title: 'Pagamento aprovado',\n description: 'Enviado quando o pagamento é confirmado',\n trigger: 'Quando o pagamento é aprovado',\n defaultSubject: 'Pagamento aprovado — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pagamento de {{order_total}} foi aprovado. Já estamos preparando o pedido #{{order_number}}.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_shipped', kind: 'transactional', icon: 'Truck',\n title: 'Pedido enviado',\n description: 'Enviado quando o pedido sai para entrega, com o rastreio',\n trigger: 'Quando a entrega é marcada como enviada',\n defaultSubject: 'Seu pedido saiu para entrega — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} está a caminho.\\n\\nRastreio: {{tracking_code}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_delivered', kind: 'transactional', icon: 'PackageCheck',\n title: 'Pedido entregue',\n description: 'Enviado quando a entrega é concluída',\n trigger: 'Quando a entrega é marcada como concluída',\n defaultSubject: 'Seu pedido chegou — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi entregue. Esperamos que goste!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_cancelled', kind: 'transactional', icon: 'CircleX',\n title: 'Pedido cancelado',\n description: 'Enviado quando um pedido é cancelado',\n trigger: 'Quando o pedido é cancelado',\n defaultSubject: 'Pedido #{{order_number}} cancelado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi cancelado. Se você não pediu isso, responda este e-mail.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'refund_confirmation', kind: 'transactional', icon: 'RotateCcw',\n title: 'Reembolso processado',\n description: 'Enviado quando um reembolso é processado',\n trigger: 'Quando o pagamento é estornado',\n defaultSubject: 'Reembolso emitido — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nO reembolso de {{order_total}} do pedido #{{order_number}} foi processado. O prazo de crédito depende do seu banco.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'customer_welcome', kind: 'transactional', icon: 'Mail',\n title: 'Boas-vindas',\n description: 'Enviado quando um cliente cria conta na loja',\n trigger: 'Quando o cliente se cadastra',\n defaultSubject: 'Bem-vindo(a) à {{store_name}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSua conta na {{store_name}} está pronta. Bom proveito!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'abandoned_cart', kind: 'marketing', icon: 'ShoppingCart',\n title: 'Carrinho abandonado',\n description: 'Enviado quando o cliente deixa itens no carrinho sem finalizar',\n trigger: '1 hora após o abandono do carrinho',\n defaultSubject: 'Você esqueceu alguns itens no carrinho',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeus itens ainda estão te esperando.\\n\\n{{cart_url}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n]\n\n/**\n * Substitutes the placeholders. Beside the catalog because PREVIEW and SEND must\n * agree: a screen doing its own `replace` has the merchant approve one text and\n * the customer receive another.\n *\n * An unknown placeholder stays visible as `{{foo}}` on purpose — in the preview\n * that exposes the typo; hiding it would hide the gap until the email had gone.\n */\nexport function renderEmailTemplate(text: string, values: Record<string, string>): string {\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (whole, key: string) => values[key] ?? whole)\n}\n\n/** Sample data for the preview. From no real order — the screen says so. */\nexport const EMAIL_PREVIEW_SAMPLE: Record<string, string> = {\n store_name: 'Sua Loja',\n customer_name: 'Maria Silva',\n order_number: '1042',\n order_total: 'R$ 189,90',\n order_items: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00',\n tracking_code: 'BR123456789BR',\n cart_url: 'https://sualoja.com.br/carrinho',\n}\n\nexport interface ResolvedEmailTemplate extends EmailEventDef {\n /** The merchant's override, when there is one. */\n override: EmailTemplate | null\n enabled: boolean\n /** Text in force: the merchant's if any, else the default. */\n subject: string\n body: string\n /** true when the merchant rewrote the text — the list flags it. */\n customized: boolean\n}\n\n/**\n * Joins the code catalog with the database overrides. A function and not a\n * query: the merge must give the same answer in the list, the editor and the\n * send, and three places doing the same `??` is how they start to disagree.\n */\nexport function resolveEmailTemplates(overrides: EmailTemplate[]): ResolvedEmailTemplate[] {\n const byEvent = new Map(overrides.map((o) => [o.event, o]))\n return SHOP_EMAIL_EVENTS.map((def) => {\n const override = byEvent.get(def.event) ?? null\n return {\n ...def,\n override,\n enabled: override?.enabled ?? def.defaultEnabled,\n subject: override?.subject ?? def.defaultSubject,\n body: override?.body ?? def.defaultBody,\n customized: Boolean(override?.subject || override?.body),\n }\n })\n}\n","import type { PluginEventDefinition, MessageDefaultsDef, EventField } from '@fayz-ai/core'\nimport { SHOP_EMAIL_EVENTS } from './emails'\n\n// ---------------------------------------------------------------------------\n// The FACTS the store emits and, separately, the text we suggest for each.\n//\n// buildShopDomainEvents() the fact's contract: what happened, what data\n// comes with it, whether it is audited. Webhooks\n// and the audit trail read this.\n// buildShopMessageDefaults() a REACTION to the fact: which channel, which\n// text. Only automations read it.\n//\n// Merging the two would mean whoever writes a Google Calendar integration has to\n// import email vocabulary to find out what fields \"order paid\" carries — and an\n// event with no text could not exist.\n// ---------------------------------------------------------------------------\n\n/** The fields every order event carries. */\nconst ORDER_FIELDS: EventField[] = [\n { name: 'order_number', label: 'Número do pedido', type: 'string', example: '1042' },\n { name: 'order_total', label: 'Total', type: 'money', example: 'R$ 189,90' },\n { name: 'order_items', label: 'Itens', type: 'string', example: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00' },\n { name: 'customer_name', label: 'Cliente', type: 'string', example: 'Maria Silva' },\n // Where the notification GOES — the automation reads its recipient from\n // these (recipientField), same contract as agenda's customer_phone.\n { name: 'customer_email', label: 'E-mail do cliente', type: 'string', example: 'maria@exemplo.com' },\n { name: 'customer_phone', label: 'Telefone do cliente', type: 'string', example: '(21) 99889-9889' },\n // Not in the emitter's payload on purpose: the browser has no reliable\n // source for the store's public name — the SENDER fills this slot.\n { name: 'store_name', label: 'Loja', type: 'string', example: 'Sua Loja' },\n]\n\nconst TRACKING_FIELD: EventField = {\n name: 'tracking_code', label: 'Código de rastreio', type: 'string', example: 'BR123456789BR',\n}\nconst CART_FIELD: EventField = {\n name: 'cart_url', label: 'Link do carrinho', type: 'url', example: 'https://sualoja.com.br/carrinho',\n}\n\n/** Fields per event — what the emitter actually sends in each. */\nconst FIELDS_BY_EVENT: Record<string, EventField[]> = {\n order_shipped: [...ORDER_FIELDS, TRACKING_FIELD],\n order_delivered: [...ORDER_FIELDS, TRACKING_FIELD],\n abandoned_cart: [...ORDER_FIELDS, CART_FIELD],\n}\n\n/**\n * Facts that are NOT audited: nobody performed them. \"Abandoned cart\" is the\n * absence of an act, and a trail full of non-acts is a trail nobody reads.\n */\nconst NOT_AUDITED = new Set(['abandoned_cart'])\n\nexport function buildShopDomainEvents(): PluginEventDefinition[] {\n return SHOP_EMAIL_EVENTS.map((def) => ({\n name: `shop.${def.event}`,\n title: def.title,\n description: def.description,\n trigger: def.trigger,\n icon: def.icon,\n fields: FIELDS_BY_EVENT[def.event] ?? ORDER_FIELDS,\n audit: !NOT_AUDITED.has(def.event),\n }))\n}\n\n/** Events whose WhatsApp notification is routine in a Brazilian store. */\nconst WHATSAPP_EVENTS = new Set(['order_confirmation', 'order_shipped', 'abandoned_cart'])\n\n/** WhatsApp text is short and subject-less — not the email body, truncated. */\nconst WHATSAPP_BODY: Record<string, string> = {\n order_confirmation:\n 'Oi {{customer_name}}! Recebemos seu pedido e ele já está confirmado por aqui ✅\\n\\nPedido: #{{order_number}}\\nTotal: {{order_total}}\\n\\nVamos te avisando por aqui a cada passo — e qualquer dúvida, é só responder esta mensagem.\\n\\nEquipe {{store_name}} agradece a preferência!',\n order_shipped:\n 'Oi {{customer_name}}! Boa notícia: seu pedido saiu para entrega 🚚\\n\\nPedido: #{{order_number}}\\nCódigo de rastreio: {{tracking_code}}\\n\\nQualquer coisa no caminho, é só responder esta mensagem que a gente resolve.\\n\\nEquipe {{store_name}} agradece a preferência!',\n abandoned_cart:\n 'Oi {{customer_name}}! Vi que ficaram itens no seu carrinho 🛒\\n\\nQuer que eu segure para você?\\n{{cart_url}}\\n\\n— {{store_name}}',\n}\n\nexport function buildShopMessageDefaults(): MessageDefaultsDef[] {\n return SHOP_EMAIL_EVENTS.map((def) => {\n const whatsapp = WHATSAPP_EVENTS.has(def.event) ? WHATSAPP_BODY[def.event] : undefined\n return {\n eventKey: `shop.${def.event}`,\n kind: def.kind,\n channels: whatsapp ? (['email', 'whatsapp'] as const).slice() : ['email' as const],\n defaults: {\n email: { subject: def.defaultSubject, body: def.defaultBody },\n ...(whatsapp ? { whatsapp: { body: whatsapp } } : {}),\n },\n // Only email inherits \"on by default\". WhatsApp bills per message and\n // needs an approved number — switching itself on would spend someone's\n // money unasked.\n defaultEnabled: { email: def.defaultEnabled },\n }\n })\n}\n","// ---------------------------------------------------------------------------\n// Delivery-time image variants for the store's own storage.\n//\n// A product photo lands in the store's bucket as the merchant uploaded it —\n// a 4000-pixel JPEG, often — and every card, thumbnail and gallery drew that\n// same file. Supabase Storage renders variants on request\n// (`/render/image/public/…?width=…`), resized once per size, cached at its\n// CDN, and encoded as WebP for a browser that accepts it. This module writes\n// those URLs. Nothing here fetches; it only knows the shape of an object URL\n// and how a variant of it is spelled.\n//\n// It is DELIBERATELY passthrough for anything that is not the store's own\n// storage: an image still hotlinked from somewhere else comes back untouched.\n// Whether the store's storage renders variants at all is a property of the\n// project (a plan feature), so the storefront asks its config before using\n// this — see `imageLoading.transform` in @fayz-ai/storefront.\n// ---------------------------------------------------------------------------\n\nexport interface ImageVariantOptions {\n /** Target width in CSS pixels; the render keeps the aspect ratio unless `height` is set too. */\n width?: number\n height?: number\n /** 20–100. Default 80: visibly lossless for photos at a third of the bytes. */\n quality?: number\n /** How to fit when both dimensions are given. */\n resize?: 'cover' | 'contain' | 'fill'\n /** Keep the original encoding instead of negotiating WebP. */\n format?: 'origin'\n}\n\n/** The srcset ladder a product image is offered at. */\nexport const IMAGE_SRCSET_WIDTHS: readonly number[] = Object.freeze([320, 480, 640, 960, 1280, 1600])\n\nconst PUBLIC_OBJECT = /^(https?:\\/\\/[^/]+\\/storage\\/v1)\\/(?:object|render\\/image)\\/public\\/([^?#]+)(?:\\?[^#]*)?(#.*)?$/\n\n/** Is this URL a public object in a Supabase Storage bucket (ours or a variant of it)? */\nexport function isStorageImageUrl(url: string | null | undefined): boolean {\n return typeof url === 'string' && PUBLIC_OBJECT.test(url)\n}\n\n/**\n * The URL of `url` rendered at `options`, or `url` itself when it is not a\n * storage object (a hotlink, a data URL, a placeholder). Idempotent: a\n * variant URL is re-derived from its object, never stacked.\n */\nexport function imageVariantUrl(url: string, options: ImageVariantOptions = {}): string {\n const match = PUBLIC_OBJECT.exec(url)\n if (!match) return url\n const [, storageBase, objectPath] = match\n const params = new URLSearchParams()\n if (options.width) params.set('width', String(Math.round(options.width)))\n if (options.height) params.set('height', String(Math.round(options.height)))\n // `contain` whenever the caller asked for one dimension and left the other\n // open. The docs say a single dimension keeps the aspect ratio; the CDN does\n // not — `?width=960` on a 1740×2609 photo answers 960×2609, the width forced\n // and the height untouched, and every image in the store came back stretched\n // (a 64px thumbnail of a square photo was 64×1254). With `contain` the same\n // request answers 960×1439. A caller that pins BOTH dimensions has said what\n // shape it wants and keeps the CDN's default.\n const resize = options.resize ?? (options.width && options.height ? undefined : 'contain')\n if (resize) params.set('resize', resize)\n params.set('quality', String(clampQuality(options.quality ?? 80)))\n if (options.format) params.set('format', options.format)\n return `${storageBase}/render/image/public/${objectPath}?${params.toString()}`\n}\n\n/**\n * A `srcset` for `url` across `widths`, or undefined when `url` is not a\n * storage object — the caller then leaves the attribute off and the browser\n * loads the one file, as before.\n */\nexport function imageSrcSet(\n url: string,\n widths: readonly number[] = IMAGE_SRCSET_WIDTHS,\n options: Omit<ImageVariantOptions, 'width'> = {},\n): string | undefined {\n if (!isStorageImageUrl(url)) return undefined\n return widths.map((w) => `${imageVariantUrl(url, { ...options, width: w })} ${w}w`).join(', ')\n}\n\nfunction clampQuality(q: number): number {\n return Math.min(100, Math.max(20, Math.round(q)))\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/commerce.ts","../src/lib/optimize-upload.ts","../src/data/functions.ts","../src/data/checkout-gateways.ts","../src/data/customer-search.ts","../src/data/supabase-provider.ts","../src/shipping/label-provider.ts","../src/lib/document.ts","../src/lib/emails.ts","../src/lib/message-events.ts","../src/lib/image-delivery.ts"],"names":["canvas","ctx","payload","error"],"mappings":";;;;;;;;;;;;;;;AAkBA,SAAS,OAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC/B;AAGA,eAAsB,gBAAA,CACpB,KAAA,EACA,QAAA,GAAyB,eAAA,EAAgB,EACZ;AAC7B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,QAAQ,OAAA,EAAQ;AAMpF,EAAA,IAAI,OAAO,QAAA,CAAS,oBAAA,KAAyB,UAAA,EAAY;AACvD,IAAA,OAAO,MAAM,QAAA,CAAS,oBAAA,CAAqB,IAAA,EAAM,MAAM,QAAQ,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,OAAO,MAAM,QAAA,CAAS,cAAc,EAAE,MAAA,EAAQ,UAAU,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY,KAAM,IAAA,CAAK,WAAA,EAAa,CAAA;AACrF,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,QAAQ,WAAA,EAAY;AAE5F,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,EAAA,IAAI,SAAS,QAAA,GAAW,GAAA,EAAK,OAAO,EAAE,OAAO,KAAA,EAAO,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,QAAQ,aAAA,EAAc;AAC9H,EAAA,IAAI,SAAS,MAAA,IAAU,QAAA,CAAS,SAAS,GAAA,EAAK,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,QAAA,CAAS,MAAM,IAAA,EAAM,QAAA,CAAS,MAAM,KAAA,EAAO,CAAA,EAAG,QAAQ,SAAA,EAAU;AAC3I,EAAA,IAAI,SAAS,UAAA,IAAc,IAAA,IAAQ,QAAA,CAAS,SAAA,IAAa,SAAS,UAAA,EAAY;AAC5E,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,aAAA,EAAc;AAAA,EACnG;AAGA,EAAA,IAAI,SAAS,WAAA,IAAe,IAAA,IAAA,CAAS,MAAM,QAAA,IAAY,CAAA,IAAK,SAAS,WAAA,EAAa;AAChF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MAAO,MAAM,QAAA,CAAS,IAAA;AAAA,MAAM,MAAM,QAAA,CAAS,IAAA;AAAA,MAAM,KAAA,EAAO,CAAA;AAAA,MAC/D,MAAA,EAAQ,cAAA;AAAA,MAAgB,aAAa,QAAA,CAAS;AAAA,KAChD;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,CAAS,SAAS,eAAA,EAAiB;AACrC,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,QAAA,CAAS,MAAM,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE;AAAA,EAC3E;AACA,EAAA,IAAI,QAAA,CAAS,IAAA,KAAS,YAAA,IAAgB,QAAA,CAAS,SAAS,cAAA,EAAgB;AACtE,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,aAAA,EAAc;AAAA,EACnG;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,QAAA,CAAS,KAAA,EAAM;AACxF;AAGO,SAAS,aAAA,CAAc,YAAgC,QAAA,EAAkE;AAC9H,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO,OAAO,EAAE,aAAA,EAAe,CAAA,EAAG,MAAM,IAAA,EAAK;AAC7D,EAAA,IAAI,UAAA,CAAW,SAAS,YAAA,EAAc;AACpC,IAAA,OAAO,EAAE,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,IAAI,QAAA,EAAW,QAAA,GAAW,UAAA,CAAW,KAAA,GAAS,GAAG,CAAC,CAAA,EAAG,IAAA,EAAM,WAAW,IAAA,EAAK;AAAA,EACjH;AACA,EAAA,IAAI,UAAA,CAAW,SAAS,cAAA,EAAgB;AACtC,IAAA,OAAO,EAAE,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG,IAAA,EAAM,UAAA,CAAW,IAAA,EAAK;AAAA,EAC9F;AACA,EAAA,OAAO,EAAE,aAAA,EAAe,CAAA,EAAG,IAAA,EAAM,WAAW,IAAA,EAAK;AACnD;AAGA,eAAsB,cAAA,CACpB,KAAA,EACA,QAAA,GAAyB,eAAA,EAAgB,EAChB;AACzB,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,CAAW,KAAK,SAAS,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,QAAA,EAAU;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,IAAA,CAAK,WAAW,IAAA,EAAM,OAAA,EAAS,IAAA,IAAQ,IAAA,CAAK,WAAW,SAAA,EAAW,IAAA,CAAK,QAAA,EAAU,SAAA,EAAW,GAAG,CAAA;AACxH,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,cAAA,GAAiB,IAAA,CAAK,QAAA,EAAU;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,IAAA,CAAK,WAAW,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,QAAA,EAAU,SAAA,EAAW,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IAC5H;AAAA,EACF;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,MAAA,KAAW,GAAG,MAAA,EAAO;AAC3C;AAMA,eAAsB,iBAAA,CACpB,KAAA,EACA,QAAA,GAAyB,eAAA,EAAgB,EACpB;AACrB,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,CAAW,KAAK,SAAS,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,KAAA,GAAQ,KAAK,QAAQ,CAAA;AACtD,IAAA,QAAA,IAAY,SAAA;AACZ,IAAA,KAAA,CAAM,KAAK,EAAE,SAAA,EAAW,QAAQ,EAAA,EAAI,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,WAAW,OAAA,CAAQ,KAAA,EAAO,UAAU,IAAA,CAAK,QAAA,EAAU,WAAW,CAAA;AAAA,EAC1I;AACA,EAAA,QAAA,GAAW,OAAO,QAAQ,CAAA;AAE1B,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,MAAM,OAAA,GAAU,aAAA;AAAA,MACd,MAAM,gBAAA,CAAiB,EAAE,IAAA,EAAM,KAAA,CAAM,YAAA,EAAc,QAAA,EAAU,UAAA,EAAY,KAAA,CAAM,UAAA,EAAW,EAAG,QAAQ,CAAA;AAAA,MACrG;AAAA,KACF;AACA,IAAA,aAAA,GAAgB,OAAA,CAAQ,aAAA;AACxB,IAAA,YAAA,GAAe,OAAA,CAAQ,IAAA;AAAA,EACzB;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,GAAA,CAAI,MAAM,QAAA,IAAY,CAAA,EAAG,CAAC,CAAC,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,CAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,GAAA,CAAI,WAAW,aAAA,GAAgB,aAAA,GAAgB,QAAA,EAAU,CAAC,CAAC,CAAA;AACrF,EAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,eAAe,YAAA,EAAc,QAAA,EAAU,eAAe,KAAA,EAAM;AACxF;AAGA,eAAsB,iBAAA,CACpB,UAAA,EACA,QAAA,GAAyB,eAAA,EAAgB,EACvB;AAClB,EAAA,OAAO,SAAS,UAAA,CAAW,EAAE,UAAA,EAAY,KAAA,EAAO,KAAK,CAAA;AACvD;;;AC1GA,IAAM,YAAA,mBAAe,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,WAAA,EAAa,YAAA,EAAc,YAAA,EAAc,YAAA,EAAc,YAAA,EAAc,YAAA,EAAc,WAAW,CAAC,CAAA;AAGpI,SAAS,UAAA,CACd,IAAA,EACA,OAAA,GAAiC,EAAC,EACtB;AACZ,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AACnC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,cAAA,IAAkB,GAAA,GAAM,IAAA;AAClD,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,QAAO,GAAI,IAAA;AACtC,EAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,CAAA,EAAG,IAAA,IAAQ,cAAc,CAAA,yDAAA,CAAA,EAA4D;AAAA,EACvI;AACA,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,UAAU,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAC,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,EAAE,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA,EAAG,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,KAAK,CAAC,CAAA,EAAE;AAChH,EAAA,IAAI,KAAA,KAAU,CAAA,IAAK,IAAA,IAAQ,SAAA,EAAW;AACpC,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,GAAG,QAAQ,MAAA,EAAQ,CAAA,eAAA,EAAkB,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAI,CAAC,CAAA,GAAA,CAAA,EAAM;AAAA,EACnH;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,UAAA;AAAA,IACR,GAAG,MAAA;AAAA,IACH,MAAA,EAAQ,KAAA,GAAQ,CAAA,GAAI,CAAA,aAAA,EAAgB,KAAK,CAAA,IAAA,EAAI,MAAM,CAAA,QAAA,EAAW,OAAO,OAAO,CAAA,YAAA,EAAe,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,IAAI,CAAC,CAAA,WAAA;AAAA,GACpH;AACF;AAOA,eAAsB,sBAAA,CAAuB,IAAA,EAAY,OAAA,GAAiC,EAAC,EAAkB;AAC3G,EAAA,IAAI,OAAO,iBAAA,KAAsB,UAAA,EAAY,OAAO,IAAA;AACpD,EAAA,IAAI,OAAO,eAAA,KAAoB,UAAA,IAAc,OAAO,QAAA,KAAa,aAAa,OAAO,IAAA;AACrF,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,GAAG,OAAO,IAAA;AAE5C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AAGF,IAAA,MAAA,GAAS,MAAM,iBAAA,CAAkB,IAAA,EAAM,EAAE,gBAAA,EAAkB,cAAc,CAAA;AAAA,EAC3E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAO,UAAA,CAAW,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,OAAO,CAAA;AACjH,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,IAAA;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,MAAA,EAAQ,KAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,OAAO,CAAA;AACtE,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,MAAM,OAAO,IAAA;AAC5C,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,IAAK,OAAA;AACvD,IAAA,OAAO,IAAI,IAAA,CAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA,EAAS,EAAE,IAAA,EAAM,YAAA,EAAc,YAAA,EAAc,IAAA,CAAK,cAAc,CAAA;AAAA,EACjG,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf;AACF;AAEA,eAAe,UAAA,CAAW,MAAA,EAAqB,KAAA,EAAe,MAAA,EAAgB,OAAA,EAAuC;AACnH,EAAA,IAAI,OAAO,oBAAoB,UAAA,EAAY;AACzC,IAAA,MAAMA,OAAAA,GAAS,IAAI,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AAChD,IAAA,MAAMC,IAAAA,GAAMD,OAAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,IAAA,IAAI,CAACC,MAAK,OAAO,IAAA;AACjB,IAAAA,KAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACzC,IAAA,OAAOD,QAAO,aAAA,CAAc,EAAE,IAAA,EAAM,YAAA,EAAc,SAAS,CAAA;AAAA,EAC7D;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACzC,EAAA,OAAO,IAAI,QAAQ,CAAC,OAAA,KAAY,OAAO,MAAA,CAAO,OAAA,EAAS,YAAA,EAAc,OAAO,CAAC,CAAA;AAC/E;;;ACvGA,IAAI,aAAA,GAA+B,IAAA;AAE5B,SAAS,oBAAoB,GAAA,EAA0B;AAC5D,EAAA,aAAA,GAAgB,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI,IAAA;AACnD;AAEO,SAAS,mBAAA,GAAqC;AACnD,EAAA,OAAO,aAAA;AACT;AAKA,IAAI,WAAA,GAA6B,IAAA;AAE1B,SAAS,kBAAkB,GAAA,EAA0B;AAC1D,EAAA,WAAA,GAAc,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI,IAAA;AACjD;AAEO,SAAS,iBAAA,GAAmC;AACjD,EAAA,OAAO,WAAA;AACT;AAGO,IAAM,cAAA,GAAmD,OAAO,MAAA,CAAO;AAAA,EAC5E,2BAAA,EAA6B,mCAAA;AAAA,EAC7B,6BAAA,EAA+B,iCAAA;AAAA,EAC/B,sBAAA,EAAwB,8BAAA;AAAA,EACxB,wBAAA,EAA0B,4BAAA;AAAA,EAC1B,oBAAA,EAAsB,kCAAA;AAAA,EACtB,sBAAA,EAAwB,gCAAA;AAAA,EACxB,qBAAA,EAAuB;AACzB,CAAC,CAAA;AAUD,IAAM,kBAAA,GAAqB,IAAA;AAG3B,eAAsB,gBAAA,CACpB,EAAA,EACA,IAAA,EACA,IAAA,EACA,OAAA,EACwD;AACxD,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,kBAAA;AACxC,EAAA,IAAI,KAAA;AACJ,EAAA,MAAM,OAAA,GAAU,CAAI,IAAA,KAAiC,OAAA,CAAQ,IAAA,CAAK;AAAA,IAChE,IAAA;AAAA,IACA,IAAI,OAAA,CAAe,CAAC,CAAA,EAAG,MAAA,KAAW;AAChC,MAAA,KAAA,GAAQ,UAAA;AAAA,QACN,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,eAAA,EAAY,IAAI,CAAA,qBAAA,EAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,GAAI,CAAC,IAAI,CAAC,CAAA;AAAA,QAC7F;AAAA,OACF;AAAA,IACF,CAAC;AAAA,GACF,CAAA,CAAE,OAAA,CAAQ,MAAM;AAAE,IAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAAA,EAAE,CAAC,CAAA;AACnD,EAAA,MAAM,UAAU,iBAAA,EAAkB;AAClC,EAAA,MAAM,WAAA,GAAc,eAAe,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,OAAA,IAAW,WAAA,GAAc,IAAA,GAAO,mBAAA,EAAoB;AACrE,EAAA,IAAK,OAAA,IAAW,eAAgB,QAAA,EAAU;AACxC,IAAA,MAAM,MAAA,GAAS,OAAA,IAAW,WAAA,GAAc,CAAA,EAAG,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,GAAK,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAIxF,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI;AACF,MAAA,KAAA,GAAA,CAAS,MAAM,EAAA,EAAI,IAAA,EAAM,cAAa,GAAI,IAAA,EAAM,SAAS,YAAA,IAAgB,IAAA;AAAA,IAC3E,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ;AAAA,QACrC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAI,QAAQ,EAAE,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA,KAAO;AAAC,SACtD;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,OAC1B,CAAC,CAAA;AAAA,IACJ,SAAS,KAAA,EAAO;AASd,MAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,oDAAA,EAA2C,IAAI,CAAA,iBAAA,CAAmB,CAAA;AACjG,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,8BAAA,EAA2B,QAAQ,CAAA,mBAAA,EAAmB,IAAI,CAAA,+FAAA;AAAA,OAE5D;AAAA,IACF;AACA,IAAA,MAAME,WAAU,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AACtD,IAAA,OAAO,EAAE,IAAI,QAAA,CAAS,EAAA,EAAI,QAAQ,QAAA,CAAS,MAAA,EAAQ,SAAAA,QAAAA,EAAQ;AAAA,EAC7D;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAA,CAAmC,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,EAAE,IAAA,EAAM,CAAC,CAAA;AACpG,EAAA,IAAI,CAAC,OAAO,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,IAAA,EAAK;AAK1D,EAAA,MAAM,MAAA,GAAS,MAAA,CAAQ,KAAA,EAAe,OAAA,EAAS,UAAU,GAAG,CAAA;AAC5D,EAAA,IAAI,OAAA,GAAe,IAAA;AACnB,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAO,KAAA,EAAe,OAAA,EAAS,IAAA,IAAO;AAAA,EAClD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,WAAW,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAQ,EAAE;AAC3E;;;AC3CA,IAAM,QAAA,GAAsD,OAAO,MAAA,CAAO;AAAA,EACxE,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,EAAE,MAAM,oBAAA,EAAsB,MAAA,EAAQ,sBAAA,EAAwB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,cAAc,CAAA;AAAA,EACtI,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,EAAE,MAAM,qBAAA,EAAuB,MAAA,EAAQ,uBAAA,EAAyB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,EAI7H,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,EAAE,MAAM,2BAAA,EAA6B,MAAA,EAAQ,6BAAA,EAA+B,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvJ,gBAAA,EAAkB,MAAA,CAAO,MAAA,CAAO,EAAE,MAAM,sBAAA,EAAwB,MAAA,EAAQ,wBAAA,EAA0B,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,UAAU;AAC7I,CAAC,CAAA;AASM,IAAM,uBAA0C,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC;AAGnF,SAAS,qBAAqB,QAAA,EAA8C;AACjF,EAAA,OAAO,eAAA,CAAgB,QAAQ,CAAA,KAAM,IAAA;AACvC;AAWO,SAAS,oBAAoB,QAAA,EAA8C;AAChF,EAAA,OAAO,eAAA,CAAgB,QAAQ,CAAA,EAAG,IAAA,KAAS,IAAA;AAC7C;AAUO,SAAS,aAAa,QAAA,EAA8C;AACzE,EAAA,OAAO,eAAA,CAAgB,QAAQ,CAAA,EAAG,IAAA,KAAS,IAAA;AAC7C;AAQO,SAAS,aAAa,QAAA,EAAoD;AAC/E,EAAA,OAAO,eAAA,CAAgB,QAAQ,CAAA,EAAG,KAAA,IAAS,IAAA;AAC7C;AAWO,SAAS,gBAAgB,QAAA,EAA6D;AAC3F,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,IAAY,EAAE,EAAE,IAAA,EAAK;AACzC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA;AAC3B;AAcO,SAAS,uBAAA,CACd,UACA,UAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,IAAY,EAAE,EAAE,IAAA,EAAK;AAC1C,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,IAAc,EAAE,EAAE,IAAA,EAAK;AAC5C,EAAA,OAAO,KAAA,IAAS,YAAA;AAClB;;;AC7KA,IAAM,OAAA,GAAU,CAAC,YAAA,EAAc,WAAA,EAAa,SAAS,OAAO,CAAA;AAGrD,SAAS,sBAAsB,IAAA,EAA2C;AAC/E,EAAA,OAAO,OAAO,IAAA,IAAQ,EAAE,CAAA,CACrB,IAAA,GACA,KAAA,CAAM,MAAM,CAAA,CAGZ,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA,CAC1C,MAAA,CAAO,OAAO,EACd,GAAA,CAAI,CAAC,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAC,MAAA,KAAW,CAAA,EAAG,MAAM,WAAW,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AACjF;;;ACqBA,SAAS,KAAA,GAAa;AACpB,EAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,uFAAuF,CAAA;AACtH,EAAA,OAAO,QAAA;AACT;AAEA,IAAM,WAAA,GAAc,eAAA;AAEpB,SAAS,QAAQ,IAAA,EAAsB;AACrC,EAAA,OAAO,IAAA,CAAK,aAAY,CAAE,OAAA,CAAQ,eAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC5E;AAEA,SAAS,OAAO,KAAA,EAAiD;AAC/D,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO,4EAAA,CAA6E,IAAA,CAAK,KAAK,CAAA,GAC1F,KAAA,GACA,IAAA;AACN;AAGA,SAAS,eAAe,KAAA,EAAsD;AAC5E,EAAA,MAAM,SAAS,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACpD,EAAA,OAAO,MAAA,GAAS,OAAO,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,MAAA;AACxD;AAEA,SAAS,aAAa,GAAA,EAA0B;AAC9C,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,OAAA,EAAS,IAAI,OAAA,IAAW,OAAO,IAAI,OAAA,KAAY,QAAA,GAAW,GAAA,CAAI,OAAA,GAAU,EAAC;AAAA,IACzE,GAAA,EAAK,IAAI,GAAA,IAAO,IAAA;AAAA;AAAA,IAEhB,OAAO,GAAA,CAAI,KAAA,IAAS,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,IAClD,gBAAgB,GAAA,CAAI,gBAAA,IAAoB,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,gBAAgB,CAAA;AAAA,IACjF,cAAA,EAAgB,IAAI,eAAA,IAAmB,CAAA;AAAA,IACvC,QAAA,EAAU,IAAI,QAAA,IAAY,CAAA;AAAA,IAC1B,MAAA,EAAQ,IAAI,MAAA,IAAU,QAAA;AAAA,IACtB,OAAA,EAAS,IAAI,QAAA,IAAY,IAAA;AAAA,IACzB,gBAAA,EAAkB,IAAI,kBAAA,IAAsB,KAAA;AAAA;AAAA,IAE5C,MAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,IAC5B,UAAA,EAAY,IAAI,WAAA,IAAe,IAAA;AAAA,IAC/B,QAAA,EAAU,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAAA,IACjC,OAAA,EAAS,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAAA,IAC/B,QAAA,EAAU,SAAA,CAAU,GAAA,CAAI,SAAS;AAAA,GACnC;AACF;AAQA,SAAS,aAAa,KAAA,EAA2D;AAC/E,EAAA,MAAM,QAAiC,EAAC;AAIxC,EAAA,MAAM,GAAA,GAA8B;AAAA,IAClC,cAAA,EAAgB,kBAAA;AAAA,IAAoB,QAAA,EAAU,UAAA;AAAA,IAC9C,MAAA,EAAQ,QAAA;AAAA,IAAU,OAAA,EAAS,UAAA;AAAA,IAAY,MAAA,EAAQ,QAAA;AAAA,IAAU,UAAA,EAAY,aAAA;AAAA,IACrE,QAAA,EAAU,WAAA;AAAA,IAAa,OAAA,EAAS,UAAA;AAAA,IAAY,QAAA,EAAU;AAAA,GACxD;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC/C,IAAA,MAAM,KAAA,GAAS,MAAkC,GAAG,CAAA;AACpD,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,KAAA,CAAM,MAAM,CAAA,GAAI,KAAA;AAAA,EAClB;AACA,EAAA,OAAO,KAAA;AACT;AAWA,SAAS,iBAAiB,KAAA,EAA2D;AACnF,EAAA,MAAM,QAAiC,EAAC;AACxC,EAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAW;AAG3B,IAAA,KAAA,CAAM,GAAA,GAAM,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,KAAA,CAAM,GAAA,CAAI,IAAA,EAAK,KAAM,EAAA,GAAK,IAAA,GAAO,KAAA,CAAM,GAAA;AAAA,EACtF;AACA,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA;AACnD,EAAA,MAAM,UAAW,KAAA,CAA+C,OAAA;AAChE,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,KAAA,CAAM,UAAA,GAAa,OAAA;AACnB,IAAA,KAAA,CAAM,IAAA,GAAO,mBAAmB,OAAO,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,MAAM,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,SAAA,GAAY,MAAM,MAAA,KAAW,QAAA;AACnE,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,KAAA,CAAM,aAAa,KAAA,CAAM,QAAA;AAC3D,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,mBAAmB,OAAA,EAAyC;AACnE,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA,CAAE,OAAO,OAAO,CAAA;AACzD,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,GAAI,UAAA;AAChD;AAcO,SAAS,uBAAuB,GAAA,EAAuC;AAC5E,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,MAAM,GAAA,CAAI,eAAA,IAAmB,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,eAAe,CAAA;AAC3E,EAAA,MAAM,MAAM,GAAA,CAAI,oBAAA,IAAwB,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,oBAAoB,CAAA;AACrF,EAAA,OAAO,EAAE,aAAA,EAAe,GAAA,IAAO,GAAA,GAAM,CAAA,GAAI,MAAM,IAAA,EAAM,UAAA,EAAY,GAAA,IAAO,GAAA,GAAM,IAAI,GAAA,GAAM,IAAA,EAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,EAAE;AACzI;AAEA,SAAS,mBAAmB,GAAA,EAAyB;AACnD,EAAA,MAAM,OAAO,CAAC,CAAA,KAAqC,KAAK,IAAA,GAAO,MAAA,GAAY,QAAQ,CAAC,CAAA;AACpF,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,IAAK,GAAA,CAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,GAC9E,GAAA,CAAI,eAAA,GACL,MAAA;AACJ,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,eAAA,IAAmB,OAAO,IAAI,eAAA,KAAoB,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,IAAI,eAAe,CAAA,CAAE,MAAA,GAAS,CAAA,GACtH,IAAI,eAAA,GACL,MAAA;AACJ,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL,aAAA,EAAe,GAAA,CAAI,cAAA,IAAkB,OAAO,IAAI,cAAA,KAAmB,QAAA,IAC9D,MAAA,CAAO,IAAA,CAAK,IAAI,cAAc,CAAA,CAAE,MAAA,GAAS,CAAA,GACzC,IAAI,cAAA,GACL,MAAA;AAAA,IACJ,QAAA,EAAU,IAAI,QAAA,IAAY,MAAA;AAAA,IAC1B,MAAA,EAAQ,IAAI,MAAA,IAAU,MAAA;AAAA,IACtB,cAAA,EAAgB,IAAA,CAAK,GAAA,CAAI,iBAAiB,CAAA;AAAA,IAC1C,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA;AAAA,IAChC,cAAA,EAAgB,IAAI,eAAA,IAAmB,MAAA;AAAA,IACvC,cAAA,EAAgB,OAAA;AAAA,IAChB,eAAA,EAAiB,IAAI,gBAAA,IAAoB,MAAA;AAAA,IACzC,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,cAAc,CAAA;AAAA,IACtC,qBAAA,EAAuB,IAAA,CAAK,GAAA,CAAI,uBAAuB,CAAA;AAAA,IACvD,cAAA,EAAgB,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACzC,gBAAA,EAAkB,IAAA,CAAK,GAAA,CAAI,iBAAiB,CAAA;AAAA,IAC5C,cAAA,EAAgB,MAAA;AAAA,IAChB,WAAA,EAAa,IAAI,YAAA,IAAgB,MAAA;AAAA,IACjC,cAAA,EAAgB,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACzC,cAAA,EAAgB,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA;AAAA,IACzC,YAAA,EAAc,IAAI,aAAA,IAAiB,MAAA;AAAA,IACnC,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,cAAc,CAAA;AAAA,IACtC,iBAAA,EAAmB,GAAA,CAAI,kBAAA,IAAsB,OAAO,IAAI,kBAAA,KAAuB,QAAA,IAC1E,MAAA,CAAO,IAAA,CAAK,IAAI,kBAAkB,CAAA,CAAE,MAAA,GAAS,CAAA,GAC7C,IAAI,kBAAA,GACL,MAAA;AAAA,IACJ,YAAA,EAAc,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA;AAAA,IACpC,eAAe,GAAA,CAAI,eAAA,IAAmB,OAAO,MAAA,GAAY,MAAA,CAAO,IAAI,eAAe,CAAA;AAAA,IACnF,oBAAoB,GAAA,CAAI,oBAAA,IAAwB,OAAO,MAAA,GAAY,MAAA,CAAO,IAAI,oBAAoB;AAAA,GACpG;AACF;AAOA,SAAS,qBAAqB,KAAA,EAA0D;AACtF,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AAC3D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,EAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,oBAAoB,KAAA,CAAM,cAAA;AAC1E,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,UAAA;AAChE,EAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,kBAAkB,KAAA,CAAM,cAAA;AACxE,EAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,kBAAkB,KAAA,CAAM,cAAA;AAKxE,EAAA,IAAI,MAAM,eAAA,KAAoB,MAAA,EAAW,OAAA,CAAQ,gBAAA,GAAmB,MAAM,eAAA,IAAmB,IAAA;AAC7F,EAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,MAAA,EAAW,OAAA,CAAQ,iBAAiB,KAAA,CAAM,aAAA;AACtE,EAAA,IAAI,KAAA,CAAM,qBAAA,KAA0B,MAAA,EAAW,OAAA,CAAQ,0BAA0B,KAAA,CAAM,qBAAA;AACvF,EAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,mBAAmB,KAAA,CAAM,cAAA;AACzE,EAAA,IAAI,KAAA,CAAM,gBAAA,KAAqB,MAAA,EAAW,OAAA,CAAQ,oBAAoB,KAAA,CAAM,gBAAA;AAC5E,EAAA,IAAI,MAAM,cAAA,KAAmB,MAAA,UAAmB,eAAA,GAAkB,KAAA,CAAM,kBAAkB,EAAC;AAC3F,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,eAAe,KAAA,CAAM,WAAA;AAClE,EAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,mBAAmB,KAAA,CAAM,cAAA;AACzE,EAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,mBAAmB,KAAA,CAAM,cAAA;AACzE,EAAA,IAAI,MAAM,YAAA,KAAiB,MAAA,EAAW,OAAA,CAAQ,aAAA,GAAgB,MAAM,YAAA,IAAgB,IAAA;AACpF,EAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,MAAA,EAAW,OAAA,CAAQ,iBAAiB,KAAA,CAAM,aAAA;AACtE,EAAA,IAAI,MAAM,iBAAA,KAAsB,MAAA,UAAmB,kBAAA,GAAqB,KAAA,CAAM,qBAAqB,EAAC;AACpG,EAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAW,OAAA,CAAQ,gBAAgB,KAAA,CAAM,YAAA;AAEpE,EAAA,IAAI,KAAA,CAAM,kBAAkB,MAAA,EAAW,OAAA,CAAQ,kBAAkB,KAAA,CAAM,aAAA,GAAgB,MAAM,aAAA,GAAgB,IAAA;AAC7G,EAAA,IAAI,KAAA,CAAM,kBAAA,KAAuB,MAAA,EAAW,OAAA,CAAQ,oBAAA,GAAuB,KAAA,CAAM,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,kBAAkB,CAAA,GAAI,IAAA;AAC7I,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,kBAAkB,GAAA,EAAwB;AACjD,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAA,EAAS,IAAI,OAAA,IAAW,IAAA;AAAA;AAAA;AAAA;AAAA,IAIxB,SAAA,EAAW,IAAI,UAAA,IAAc,cAAA;AAAA,IAC7B,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,IAC3B,WAAA,EAAa,IAAI,YAAA,IAAgB,IAAA;AAAA,IACjC,OAAA,EAAS,GAAA,CAAI,OAAA,KAAY,GAAA,CAAI,WAAW,QAAA,GAAW,SAAA,CAAA;AAAA,IACnD,UAAA,EAAY,IAAI,WAAA,IAAe,IAAA,GAAO,OAAO,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,CAAE,IAAA,EAAK;AAAA,IAC1E,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA,GAAO,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,CAAE,IAAA,EAAK;AAAA,IACpE,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,CAAC,CAAA;AAAA,IAC1B,WAAW,GAAA,CAAI,UAAA,IAAc,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,UAAU,CAAA;AAAA,IAChE,UAAA,EAAY,IAAI,YAAA,IAAgB,IAAA;AAAA,IAChC,UAAA,EAAY,IAAI,YAAA,IAAgB,IAAA;AAAA,IAChC,MAAA,EAAQ,IAAI,MAAA,IAAU,IAAA;AAAA,IACtB,SAAA,EAAW,IAAI,UAAA,IAAc,CAAA;AAAA,IAC7B,QAAA,EAAU,IAAI,QAAA,IAAY,KAAA;AAAA,IAC1B,SAAA,EAAW,IAAI,UAAA,IAAc;AAAA,GAC/B;AACF;AAEA,SAAS,qBAAqB,GAAA,EAA2B;AACvD,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA;AAAA;AAAA;AAAA,IAIV,eAAe,GAAA,CAAI,cAAA,IAAkB,OAAO,MAAA,GAAY,OAAA,CAAQ,IAAI,cAAc,CAAA;AAAA,IAClF,SAAA,EAAW,IAAI,UAAA,IAAc;AAAA,GAC/B;AACF;AAEA,SAAS,uBAAuB,KAAA,EAAqE;AACnG,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,EAAA,IAAI,MAAM,aAAA,KAAkB,MAAA,EAAW,OAAA,CAAQ,cAAA,GAAiB,MAAM,aAAA,IAAiB,IAAA;AACvF,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAC9D,EAAA,OAAO,OAAA;AACT;AAIA,SAAS,mBAAmB,GAAA,EAA+C;AACzE,EAAA,MAAM,SAAS,MAAA,CAAO,GAAA,IAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAClD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,0CAAuC,CAAA;AAChF,EAAA,OAAO,MAAA;AACT;AAIA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,KAAK,EAAE,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAC9D,WAAA,GAAc,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC9E,EAAA,OAAO,IAAA,IAAQ,OAAA;AACjB;AAMA,SAAS,mBAAmB,KAAA,EAAmD;AAC7E,EAAA,IAAI,OAAO,IAAA,KAAS,OAAA,EAAS,OAAO,IAAI,MAAM,sCAAmC,CAAA;AACjF,EAAA,IAAI,KAAA,EAAO,SAAS,OAAA,EAAS;AAC3B,IAAA,OAAO,IAAI,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,IAAI,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW,wCAAkC,CAAA;AACvE;AAEA,SAAS,qBAAqB,KAAA,EAAmE;AAC/F,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,UAAA;AAChE,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA,UAAmB,WAAA,GAAc,kBAAA,CAAmB,MAAM,UAAU,CAAA;AAC7F,EAAA,IAAI,MAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,IAAA,GAAO,MAAM,IAAA,IAAQ,IAAA;AAC3D,EAAA,IAAI,MAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,KAAA,GAAQ,MAAM,KAAA,IAAS,IAAA;AAC9D,EAAA,IAAI,MAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,MAAA,GAAS,MAAM,MAAA,IAAU,IAAA;AAEjE,EAAA,IAAI,MAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,MAAA,GAAS,MAAM,MAAA,IAAU,IAAA;AACjE,EAAA,IAAI,MAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,QAAA,GAAW,MAAM,QAAA,IAAY,IAAA;AACvE,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,UAAA,GAAa,MAAM,UAAA,IAAc,IAAA;AAC7E,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,IAAA;AACzG,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,IAAA;AAChG,EAAA,IAAI,MAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,KAAA,GAAQ,MAAM,KAAA,IAAS,IAAA;AAC9D,EAAA,IAAI,MAAM,eAAA,KAAoB,MAAA,UAAmB,gBAAA,GAAmB,KAAA,CAAM,mBAAmB,EAAC;AAC9F,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,eAAe,KAAA,CAAM,WAAA;AAClE,EAAA,IAAI,KAAA,CAAM,wBAAwB,MAAA,EAAW;AAC3C,IAAA,OAAA,CAAQ,oBAAA,GAAuB,MAAM,mBAAA,IAAuB,IAAA;AAAA,EAC9D;AACA,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,mBAAmB,IAAA,EAA0D;AACpF,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,IAAI,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,QAAA,GAAW,IAAA,CAAK,QAAA;AACvC,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,GAAA,CAAI,IAAA,GAAO,IAAA,CAAK,IAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,KAAA;AACjC,EAAA,IAAI,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,SAAA,GAAY,IAAA,CAAK,QAAA;AACxC,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,GAAA,GAAM,IAAA;AAC7C;AAEA,SAAS,oBAAoB,KAAA,EAAkE;AAC7F,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,EAAA,IAAI,MAAM,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,MAAM,OAAA,IAAW,IAAA;AACpE,EAAA,IAAI,KAAA,CAAM,SAAA,IAAa,IAAA,EAAM,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AACxD,EAAA,IAAI,MAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,SAAA,GAAY,MAAM,QAAA,IAAY,IAAA;AACxE,EAAA,IAAI,MAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,YAAA,GAAe,MAAM,WAAA,IAAe,IAAA;AACjF,EAAA,IAAI,KAAA,CAAM,OAAA,IAAW,IAAA,EAAM,OAAA,CAAQ,UAAU,KAAA,CAAM,OAAA;AAInD,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA;AACvB,IAAA,OAAA,CAAQ,cAAc,KAAA,CAAM,UAAA,GAAa,cAAA,CAAe,KAAA,CAAM,UAAU,CAAA,GAAI,IAAA;AAC9E,EAAA,IAAI,MAAM,QAAA,KAAa,MAAA;AACrB,IAAA,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA,GAAW,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAA,GAAI,IAAA;AAOxE,EAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,IAAA,EAAM,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AAC7C,EAAA,IAAI,MAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,UAAA,GAAa,MAAM,SAAA,IAAa,IAAA;AAC3E,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,YAAA,GAAe,MAAM,UAAA,IAAc,IAAA;AAC/E,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,YAAA,GAAe,MAAM,UAAA,IAAc,IAAA;AAC/E,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,IAAA,EAAM,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACjD,EAAA,IAAI,KAAA,CAAM,SAAA,IAAa,IAAA,EAAM,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AACxD,EAAA,IAAI,KAAA,CAAM,QAAA,IAAY,IAAA,EAAM,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AACrD,EAAA,IAAI,MAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,UAAA,GAAa,MAAM,SAAA,IAAa,IAAA;AAC3E,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,qBAAqB,GAAA,EAA2B;AACvD,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,IAAA,EAAO,IAAI,IAAA,IAAQ,KAAA;AAAA,IACnB,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,SAAA,IAAa,CAAC,CAAA;AAAA,IACnC,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,CAAC,CAAA;AAAA,IACjC,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,SAAA,IAAa,CAAC,CAAA;AAAA,IACnC,gBAAA,EAAkB,MAAA,CAAO,GAAA,CAAI,kBAAA,IAAsB,CAAC,CAAA;AAAA,IACpD,SAAA,EAAW,IAAI,UAAA,IAAc,KAAA;AAAA,IAC7B,MAAA,EAAQ,IAAI,MAAA,IAAU;AAAA,GACxB;AACF;AAEA,SAAS,uBAAuB,KAAA,EAAqE;AACnG,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,OAAA;AAC1D,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,gBAAA,KAAqB,MAAA,EAAW,OAAA,CAAQ,qBAAqB,KAAA,CAAM,gBAAA;AAC7E,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAa,GAAA,EAAmB;AACvC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,IAAA,EAAM,GAAA,CAAI,IAAA,IAAQ,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,IAClC,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,IAC3B,cAAA,EAAgB,IAAI,eAAA,IAAmB,IAAA;AAAA,IACvC,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,KAAA,EAAO,IAAI,KAAA,IAAS,CAAA;AAAA,IACpB,gBAAgB,GAAA,CAAI,gBAAA;AAAA,IACpB,QAAA,EAAU,IAAI,QAAA,IAAY,KAAA;AAAA,IAC1B,MAAA,EAAQ,IAAI,MAAA,IAAU,QAAA;AAAA,IACtB,cAAA,EAAgB,IAAI,eAAA,IAAmB,CAAA;AAAA,IACvC,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,SAAA,EAAW,IAAI,UAAA,IAAc,CAAA;AAAA,IAC7B,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,EAAC;AAAA,IAC3B,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,GAAI,EAAC;AAAA,IAClE,YAAY,GAAA,CAAI,WAAA;AAAA,IAChB,YAAA,EAAc,IAAI,aAAA,IAAiB,IAAA;AAAA,IACnC,UAAA,EAAY,IAAI,WAAA,IAAe,IAAA;AAAA,IAC/B,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,UAAA,EAAY,IAAI,WAAA,IAAe,IAAA;AAAA,IAC/B,QAAA,EAAU,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAAA,IACjC,OAAA,EAAS,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAAA,IAC/B,QAAA,EAAU,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAAA,IACjC,SAAA,EAAW,IAAI,UAAA,IAAc,IAAA;AAAA,IAC7B,QAAA,EAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,GAAI,GAAA,CAAI,WAAW,EAAC;AAAA,IACxD,iBAAA,EAAmB,IAAI,mBAAA,IAAuB,IAAA;AAAA,IAC9C,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;AAKA,SAAS,UAAU,KAAA,EAA+B;AAChD,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI,OAAO,IAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAClC;AAEA,SAAS,WAAW,GAAA,EAAwB;AAC1C,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,SAAS,GAAA,CAAI,QAAA;AAAA,IACb,SAAA,EAAW,IAAI,UAAA,IAAc,CAAA;AAAA,IAC7B,SAAA,EAAW,IAAI,UAAA,IAAc,KAAA;AAAA,IAC7B,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;AAEA,SAAS,cAAc,GAAA,EAAoB;AACzC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,IAAA,EAAM,GAAA,CAAI,IAAA,IAAQ,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,IAClC,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,SAAA,EAAW,IAAI,UAAA,IAAc,CAAA;AAAA,IAC7B,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;AAQA,SAAS,eAAe,GAAA,EAAqB;AAC3C,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,SAAS,GAAA,CAAI,QAAA;AAAA,IACb,SAAA,EAAW,IAAI,UAAA,IAAc,IAAA;AAAA,IAC7B,SAAA,EAAW,IAAI,UAAA,IAAc,IAAA;AAAA,IAC7B,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,GAAA,EAAK,IAAI,GAAA,IAAO,IAAA;AAAA,IAChB,QAAA,EAAU,IAAI,QAAA,IAAY,CAAA;AAAA,IAC1B,SAAA,EAAW,IAAI,UAAA,IAAc,CAAA;AAAA,IAC7B,KAAA,EAAO,IAAI,KAAA,IAAS,CAAA;AAAA,IACpB,QAAA,EAAU,IAAI,SAAA,IAAa;AAAA,GAC7B;AACF;AAEA,SAAS,WAAW,GAAA,EAAiB;AACnC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,aAAa,GAAA,CAAI,YAAA;AAAA,IACjB,MAAA,EAAQ,IAAI,MAAA,IAAU,MAAA;AAAA,IACtB,eAAA,EAAiB,IAAI,gBAAA,IAAoB,SAAA;AAAA,IACzC,iBAAA,EAAmB,IAAI,kBAAA,IAAsB,aAAA;AAAA,IAC7C,QAAA,EAAU,IAAI,QAAA,IAAY,KAAA;AAAA,IAC1B,QAAA,EAAU,IAAI,QAAA,IAAY,CAAA;AAAA,IAC1B,QAAA,EAAU,IAAI,SAAA,IAAa,CAAA;AAAA,IAC3B,aAAA,EAAe,IAAI,cAAA,IAAkB,CAAA;AAAA,IACrC,aAAA,EAAe,IAAI,cAAA,IAAkB,CAAA;AAAA,IACrC,KAAA,EAAO,IAAI,KAAA,IAAS,CAAA;AAAA,IACpB,YAAY,GAAA,CAAI,WAAA;AAAA,IAChB,cAAc,GAAA,CAAI,aAAA;AAAA,IAClB,eAAe,GAAA,CAAI,cAAA;AAAA,IACnB,cAAc,GAAA,CAAI,aAAA;AAAA,IAClB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,eAAA,EAAiB,IAAI,gBAAA,IAAoB,IAAA;AAAA,IACzC,iBAAA,EAAmB,IAAI,mBAAA,IAAuB,IAAA;AAAA,IAC9C,MAAA,EAAQ,IAAI,OAAA,IAAW,IAAA;AAAA,IACvB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,cAAc,CAAA,GAAI,EAAC;AAAA,IACnE,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;AAEA,SAAS,cAAc,GAAA,EAAwB;AAC7C,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,QAAA,EAAU,IAAI,SAAA,IAAa,EAAA;AAAA,IAC3B,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,QAAA,EAAU,IAAI,QAAA,IAAY,IAAA;AAAA,IAC1B,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,WAAA,EAAa,IAAI,YAAA,IAAgB,CAAA;AAAA,IACjC,UAAA,EAAY,IAAI,WAAA,IAAe,CAAA;AAAA,IAC/B,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;AAEA,SAAS,cAAc,GAAA,EAAoB;AACzC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAA,EAAQ,IAAI,MAAA,IAAU,MAAA;AAAA,IACtB,KAAA,EAAO,IAAI,KAAA,IAAS,CAAA;AAAA,IACpB,YAAY,GAAA,CAAI,WAAA;AAAA,IAChB,eAAA,EAAiB,IAAI,iBAAA,IAAqB,KAAA;AAAA,IAC1C,WAAA,EAAa,IAAI,YAAA,IAAgB,IAAA;AAAA,IACjC,SAAA,EAAW,IAAI,UAAA,IAAc,KAAA;AAAA,IAC7B,UAAA,EAAY,GAAA,CAAI,WAAA,IAAe,EAAC;AAAA,IAChC,WAAA,EAAa,GAAA,CAAI,YAAA,IAAgB,EAAC;AAAA,IAClC,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,QAAQ,GAAA,CAAI,OAAA;AAAA,IACZ,MAAA,EAAQ,IAAI,MAAA,IAAU,QAAA;AAAA,IACtB,SAAA,EAAW,IAAI,UAAA,IAAc,CAAA;AAAA,IAC7B,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;AAEA,SAAS,kBAAkB,GAAA,EAAwB;AACjD,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,OAAA,EAAS,IAAI,OAAA,IAAW,IAAA;AAAA,IACxB,QAAA,EAAU,IAAI,QAAA,IAAY,CAAA;AAAA,IAC1B,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,WAAW,GAAA,CAAI;AAAA,GACjB;AACF;AAEA,SAAS,eAAe,KAAA,EAAqE;AAC3F,EAAA,MAAM,IAA6B,EAAC;AACpC,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,CAAA,CAAE,OAAO,KAAA,CAAM,IAAA;AAC7C,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,CAAA,CAAE,cAAc,KAAA,CAAM,WAAA;AAC3D,EAAA,IAAI,MAAM,SAAA,KAAc,MAAA,IAAa,UAAA,GAAa,cAAA,CAAe,MAAM,SAAS,CAAA;AAChF,EAAA,IAAI,MAAM,SAAA,KAAc,MAAA,IAAa,UAAA,GAAa,cAAA,CAAe,MAAM,SAAS,CAAA;AAChF,EAAA,IAAI,MAAM,QAAA,KAAa,MAAA,IAAa,SAAA,GAAY,cAAA,CAAe,MAAM,QAAQ,CAAA;AAC7E,EAAA,IAAI,MAAM,QAAA,KAAa,MAAA,IAAa,SAAA,GAAY,cAAA,CAAe,MAAM,QAAQ,CAAA;AAC7E,EAAA,IAAI,MAAM,WAAA,KAAgB,MAAA,EAAW,CAAA,CAAE,YAAA,GAAe,MAAM,WAAA,IAAe,IAAA;AAC3E,EAAA,IAAI,MAAM,YAAA,KAAiB,MAAA,EAAW,CAAA,CAAE,aAAA,GAAgB,MAAM,YAAA,IAAgB,IAAA;AAC9E,EAAA,OAAO,CAAA;AACT;AAEA,IAAM,kBAAA,GAAqB,+BAAA;AAE3B,SAAS,oBAAA,GAA+B;AACtC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,UAAA,CAAW,MAAA,CAAO,gBAAgB,KAAK,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,MAAM,kBAAA,CAAmB,CAAA,GAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACxF,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AACnG;AAgBA,IAAM,gBAAA,GAAmB,EAAE,YAAA,EAAc,UAAA,EAAW;AAGpD,IAAM,cAAA,GAAiB,SAAA;AAOvB,SAAS,eAAe,KAAA,EAA+B;AACrD,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAI,OAAO,IAAA;AAClE,EAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAClC;AAEA,SAAS,gBAAgB,GAAA,EAAsB;AAG7C,EAAA,MAAM,OAAA,GAAW,GAAA,CAAI,OAAA,IAAW,EAAC;AACjC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,QAAQ,GAAA,CAAI,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,SAAS,EAAE,CAAA;AAAA,IAC7C,WAAA,EAAa,IAAI,WAAA,IAAe,IAAA;AAAA,IAChC,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,IAC3B,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,IAC3B,cAAA,EAAgB,IAAI,eAAA,IAAmB,IAAA;AAAA,IACvC,SAAA,EAAW,IAAI,SAAA,IAAa,IAAA;AAAA,IAC5B,SAAA,EAAW,IAAI,UAAA,IAAc,CAAA;AAAA,IAC7B,UAAA,EAAY,CAAC,GAAG,OAAO,EACpB,IAAA,CAAK,CAAC,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,YAAY,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA,CACpD,IAAI,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAAA,IAC1B,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI;AAAA,GACnC;AACF;AAEA,SAAS,mBAAmB,GAAA,EAAyB;AACnD,EAAA,MAAM,OAAA,GAAW,GAAA,CAAI,OAAA,IAAW,EAAC;AACjC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,WAAA,EAAa,IAAI,WAAA,IAAe,IAAA;AAAA,IAChC,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,IACpB,aAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAAA,IAC7C,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI;AAAA,GACnC;AACF;AAEA,SAAS,qBAAqB,GAAA,EAA2B;AACvD,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,WAAA,EAAa,IAAI,WAAA,IAAe,IAAA;AAAA,IAChC,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACxC,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAAA,IACxC,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACtC,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACtC,WAAA,EAAa,IAAI,YAAA,IAAgB,IAAA;AAAA,IACjC,YAAA,EAAc,IAAI,aAAA,IAAiB,IAAA;AAAA,IACnC,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI;AAAA,GACnC;AACF;AAIA,IAAM,iBAAA,GAAoB,OAAA;AAC1B,IAAM,aAAA,GAAgB,OAAA;AAEtB,SAAS,mBAAmB,GAAA,EAAyB;AACnD,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,KAAA,EAAO,OAAO,GAAA,CAAI,SAAA,IAAa,EAAE,CAAA,CAAE,KAAA,CAAM,kBAAkB,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,IAIjE,OAAA,EAAS,IAAI,OAAA,IAAW,IAAA;AAAA;AAAA;AAAA,IAGxB,OAAA,EAAS,IAAI,OAAA,IAAW,IAAA;AAAA,IACxB,IAAA,EAAM,IAAI,IAAA,IAAQ,IAAA;AAAA,IAClB,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI;AAAA,GACnC;AACF;AAEA,SAAS,cAAc,GAAA,EAAoB;AACzC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,MAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,EAAE,EAAE,WAAA,EAAY;AAAA,IACzC,cAAA,EAAgB,MAAA,CAAO,GAAA,CAAI,eAAA,IAAmB,CAAC,CAAA;AAAA,IAC/C,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,OAAA,IAAW,CAAC,CAAA;AAAA,IAChC,QAAA,EAAU,IAAI,QAAA,IAAY,KAAA;AAAA,IAC1B,MAAA,EAAS,IAAI,MAAA,IAAU,QAAA;AAAA,IACvB,SAAA,EAAW,IAAI,UAAA,IAAc,IAAA;AAAA,IAC7B,UAAA,EAAY,IAAI,WAAA,IAAe,IAAA;AAAA,IAC/B,aAAA,EAAe,IAAI,cAAA,IAAkB,IAAA;AAAA,IACrC,IAAA,EAAM,IAAI,IAAA,IAAQ,IAAA;AAAA,IAClB,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,SAAA,EAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI;AAAA,GACnC;AACF;AAUA,SAAS,cAAA,CAAe,KAAc,KAAA,EAA+B;AACnE,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,IAAO,EAAE,EAAE,IAAA,EAAK;AACpC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AACxC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,CAAC,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AAC7C,EAAA,OAAO,GAAG,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,CAAC,IAAI,MAAM,CAAA,CAAA;AAC/C;AAEO,IAAM,uBAAN,MAAmD;AAAA;AAAA;AAAA;AAAA,EAKxD,MAAM,aAAa,OAAA,EAAmD;AACpE,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,QAAQ,EAAE,MAAA,CAAO,CAAA,UAAA,EAAa,CAAA,CAAE,aAAa,CAAA,GAAA,CAAK,CAAA;AACpE,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,IAAI,SAAS,MAAA,EAAQ,CAAA,GAAI,EAAE,EAAA,CAAG,QAAA,EAAU,QAAQ,MAAM,CAAA;AACtD,IAAA,IAAI,SAAS,UAAA,EAAY,CAAA,GAAI,EAAE,EAAA,CAAG,aAAA,EAAe,QAAQ,UAAU,CAAA;AACnE,IAAA,IAAI,SAAS,IAAA,EAAM,CAAA,GAAI,EAAE,EAAA,CAAG,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAChD,IAAA,IAAI,OAAA,EAAS,QAAQ,CAAA,GAAI,CAAA,CAAE,MAAM,MAAA,EAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAG,CAAA;AAC9D,IAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,OAAA,EAAS,OAAA,IAAW,YAAA,EAAc,EAAE,SAAA,EAAW,OAAA,EAAS,KAAA,KAAU,MAAA,EAAQ,CAAA;AACtF,IAAA,IAAI,SAAS,KAAA,EAAO,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC7C,IAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAA,CAAS,OAAA,CAAQ,MAAA,IAAU,CAAA,KAAM,OAAA,CAAQ,KAAA,IAAS,MAAM,CAAC,CAAA;AAClG,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,YAAY,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,WAAW,EAAA,EAAqC;AACpD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,EAAA,CAC3B,IAAA,CAAK,EAAE,QAAQ,CAAA,CACf,OAAO,CAAA,UAAA,EAAa,CAAA,CAAE,aAAa,CAAA,GAAA,CAAK,CAAA,CACxC,GAAG,IAAA,EAAM,EAAE,EACX,WAAA,EAAY;AACf,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,IAAA,GAAO,YAAA,CAAa,IAAI,CAAA,GAAI,IAAA;AAAA,EACrC;AAAA,EAEA,MAAM,sBAAsB,gBAAA,EAAmD;AAC7E,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,EAAA,CAC3B,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAA,CACf,MAAA,CAAO,aAAa,CAAA,CAAE,aAAa,CAAA,GAAA,CAAK,CAAA,CACxC,EAAA,CAAG,YAAA,EAAc,gBAAgB,CAAA,CACjC,KAAA,CAAM,CAAC,CAAA,CACP,WAAA,EAAY;AACf,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,IAAA,GAAO,YAAA,CAAa,IAAI,CAAA,GAAI,IAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAA,CACJ,SAAA,EACA,IAAA,EAC4B;AAC5B,IAAA,MAAM,KAAK,KAAA,EAAM;AAKjB,IAAA,IAAI,YAAA,GAAe,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAIzF,IAAA,IAAI,CAAC,IAAA,EAAM,eAAA,iBAAgC,YAAA,CAAa,EAAA,CAAG,UAAU,QAAQ,CAAA;AAC7E,IAAA,MAAM,CAAC,UAAA,EAAY,WAAW,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAClD,GAAG,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,EAAA,CAAG,YAAA,EAAc,SAAS,CAAA,CAAE,KAAA,CAAM,YAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MACvG,aAAa,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM;AAAA,KACnD,CAAA;AACD,IAAA,IAAI,UAAA,CAAW,KAAA,EAAO,MAAM,UAAA,CAAW,KAAA;AACvC,IAAA,IAAI,WAAA,CAAY,KAAA,EAAO,MAAM,WAAA,CAAY,KAAA;AACzC,IAAA,MAAM,WAA4B,UAAA,CAAW,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MAC1E,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AAAA,MAC9D,QAAA,EAAU,IAAI,QAAA,IAAY;AAAA,KAC5B,CAAE,CAAA;AACF,IAAA,MAAM,YAA8B,WAAA,CAAY,IAAA,IAAQ,EAAC,EAAG,IAAI,YAAY,CAAA;AAC5E,IAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAAA,EAC7B;AAAA;AAAA,EAIA,MAAM,kBAAA,CAAmB,SAAA,EAAmB,KAAA,EAAuD;AACjG,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,KAAA,GAAQ,qBAAqB,KAAK,CAAA;AACxC,IAAA,MAAM,OAAA,GAAU,oBAAoB,KAAK,CAAA;AACzC,IAAA,IAAI,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,OAAO,CAAA;AAEpC,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,SAAA,KAAc,MAAM,EAAA,CAChD,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,EAAA,CAAG,cAAc,SAAS,CAAA;AAChE,IAAA,IAAI,WAAW,MAAM,SAAA;AAErB,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAA,CAAkB,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAa,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACvF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AAIrD,IAAA,MAAM,SAAS,QAAA,IAAY,IAAI,MAAA,CAAO,CAAC,QAAa,CAAC,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,GAAA,KAAa,IAAI,EAAE,CAAA;AACnG,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,EAAE,KAAA,EAAAC,MAAAA,EAAM,GAAI,MAAM,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,KAAK,CAAA;AACzE,MAAA,IAAIA,QAAO,MAAMA,MAAAA;AAAA,IACnB;AAEA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,IAAI,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AAC9C,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAChC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,EAAE,OAAAA,MAAAA,EAAM,GAAI,MAAM,EAAA,CACrB,IAAA,CAAK,EAAE,cAAc,CAAA,CAAE,OAAO,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,QAAA,EAAU,CAAA,CAAE,EAAA,CAAG,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AACnF,QAAA,IAAIA,QAAO,MAAMA,MAAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,MAAM,EAAE,KAAA,EAAAA,MAAAA,EAAM,GAAI,MAAM,GAAG,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CAAE,MAAA,CAAO;AAAA,UACvD,UAAA,EAAY,SAAA;AAAA,UAAW,SAAA,EAAW,QAAA;AAAA,UAAU,MAAM,IAAA,CAAK,IAAA;AAAA,UAAM,QAAQ,IAAA,CAAK,MAAA;AAAA,UAAQ;AAAA,SACnF,CAAA;AACD,QAAA,IAAIA,QAAO,MAAMA,MAAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,EAAA,CAC3B,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,EAAA,CAAG,cAAc,SAAS,CAAA,CAAE,MAAM,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACvG,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACrC,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AAAA,MAC9D,QAAA,EAAU,IAAI,QAAA,IAAY;AAAA,KAC5B,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,oBAAA,CAAqB,SAAA,EAAmB,KAAA,EAA2D;AACvG,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,OAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AAC3C,MAAA,MAAM,IAAI,MAAM,8GAAkG,CAAA;AAAA,IACpH;AAMA,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,SAAA,KAAc,MAAM,EAAA,CAChD,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,EAAA,CAAG,mBAAmB,SAAS,CAAA;AACtE,IAAA,IAAI,WAAW,MAAM,SAAA;AACrB,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,KAAA,CAAM,OAAO,CAAA;AACjD,IAAA,MAAM,KAAA,GAAA,CAAS,QAAA,IAAY,EAAC,EAAG,IAAA,CAAK,CAAC,GAAA,KAAa,iBAAA,CAAkB,GAAA,CAAI,OAAA,IAAW,EAAE,MAAM,SAAS,CAAA;AACpG,IAAA,IAAI,KAAA,EAAO,OAAO,IAAA,CAAK,oBAAA,CAAqB,KAAA,CAAM,EAAA,EAAI,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,UAAU,CAAA;AAQpG,IAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,OAAO,YAAA,EAAa,GAAI,MAAM,EAAA,CACtD,IAAA,CAAK,EAAE,QAAQ,CAAA,CAAE,OAAO,2BAA2B,CAAA,CAAE,GAAG,IAAA,EAAM,SAAS,EAAE,MAAA,EAAO;AACnF,IAAA,IAAI,cAAc,MAAM,YAAA;AAIxB,IAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,UAAA,IAAc,WAAA,CAAY,EAAA;AAEjE,IAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,SAAA,EAAU,GAAI,MAAM,EAAA,CACnD,IAAA,CAAK,kBAAkB,CAAA,CACvB,MAAA,CAAO;AAAA,MACN,SAAA,EAAW,QAAA;AAAA,MACX,UAAA,EAAY,kBAAA;AAAA,MACZ,YAAY,KAAA,CAAM,OAAA;AAAA,MAClB,IAAA,EAAM,kBAAA,CAAmB,KAAA,CAAM,OAAO,CAAA;AAAA,MACtC,GAAG,iBAAiB,KAAK,CAAA;AAAA,MACzB,UAAA,EAAY;AAAA,KACb,CAAA,CACA,MAAA,CAAO,IAAI,EACX,MAAA,EAAO;AACV,IAAA,IAAI,WAAW,MAAM,SAAA;AAErB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,GAC3B,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA,CACtB,MAAA,CAAO;AAAA,MACN,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,QAAA;AAAA,MACX,YAAY,WAAA,CAAY,EAAA;AAAA,MACxB,GAAG,aAAa,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKrB,MAAA,EAAQ,MAAM,MAAA,IAAU,QAAA;AAAA,MACxB,kBAAA,EAAoB;AAAA,KACrB,CAAA,CACA,MAAA,CAAO,IAAI,EACX,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AAGjB,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,MAAc,YAAY,aAAA,EAAgD;AACxE,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,GAC3B,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,GAAG,IAAA,EAAM,aAAa,EAAE,MAAA,EAAO;AACtE,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,aAAa,IAAI,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,oBAAA,CAAqB,SAAA,EAAmB,KAAA,EAA2D;AACvG,IAAA,MAAM,KAAK,KAAA,EAAM;AAIjB,IAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,SAAA,EAAU,GAAI,MAAM,EAAA,CAC3C,IAAA,CAAK,EAAE,eAAe,CAAA,CAAE,OAAO,gBAAgB,CAAA,CAAE,GAAG,IAAA,EAAM,SAAS,EAAE,MAAA,EAAO;AAC/E,IAAA,IAAI,WAAW,MAAM,SAAA;AAErB,IAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AACxC,IAAA,IAAI,OAAO,IAAA,CAAK,SAAS,EAAE,MAAA,GAAS,CAAA,IAAK,IAAI,UAAA,EAAY;AACvD,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,GACrB,IAAA,CAAK,kBAAkB,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,CAAE,EAAA,CAAG,IAAA,EAAM,IAAI,UAAU,CAAA;AACrE,MAAA,IAAI,OAAO,MAAM,KAAA;AAAA,IACnB;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AACpC,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AACrC,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,GACrB,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS,CAAA;AAC/D,MAAA,IAAI,OAAO,MAAM,KAAA;AAAA,IACnB;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,sBAAsB,SAAA,EAAkC;AAC5D,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,EAAA,CAAG,KAAK,CAAA,CAAE,eAAe,CAAA,CAAE,MAAA,CAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA,CAAE,EAAA,CAAG,MAAM,SAAS,CAAA;AACpG,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAM,eAAA,CAAgB,SAAA,EAAmB,KAAA,EAAe,IAAA,EAAgC;AACtF,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAG5C,IAAA,MAAM,QAAQ,iBAAA,CAAkB,WAAA,MAAiB,EAAA,EAAI,MAAM,0BAA0B,CAAA;AACrF,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,YAAA,CAAa,SAAS,CAAA;AAClD,IAAA,MAAM,QAAQ,MAAA,GAAS,OAAA;AACvB,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,OAAA;AAMxB,IAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,CAAM,aAAA,CAAc,EAAE,SAAA,EAAW,KAAA,EAAO,GAAG,CAAA;AACxE,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,KAAW,CAAA,IAAK,KAAA,GAAQ,CAAA;AACvD,IAAA,MAAM,MAAM,cAAA,CAAe;AAAA,MACzB,SAAA;AAAA,MACA,IAAA,EAAM,UAAU,SAAA,GAAY,YAAA;AAAA,MAC5B,UAAA,EAAY,UAAU,sBAAA,GAAyB,YAAA;AAAA,MAC/C,QAAA,EAAU,KAAA;AAAA,MACV,MAAM,IAAA,IAAQ;AAAA,KACf,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,mBAAA,CACJ,SAAA,EACA,QAAA,EACA,OAAA,EACiB;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAClC,IAAA,IAAI,MAAA,IAAU,CAAA,EAAG,MAAM,IAAI,MAAM,mDAAmD,CAAA;AACpF,IAAA,MAAM,QAAQ,iBAAA,CAAkB,WAAA,MAAiB,EAAA,EAAI,MAAM,0BAA0B,CAAA;AACrF,IAAA,MAAM,MAAM,cAAA,CAAe;AAAA,MACzB,SAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,UAAA,EAAY,SAAS,UAAA,IAAc,UAAA;AAAA,MACnC,QAAA,EAAU,MAAA;AAAA,MACV,MAAM,OAAA,EAAS,IAAA;AAAA,MACf,YAAY,OAAA,EAAS;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,KAAA,CAAM,aAAa,SAAS,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,mBAAA,CACJ,SAAA,EACA,QAAA,EACA,OAAA,EACiB;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAClC,IAAA,IAAI,MAAA,IAAU,CAAA,EAAG,MAAM,IAAI,MAAM,mDAAmD,CAAA;AACpF,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,OAAA,CAAQ,SAAA,EAAW,QAAQ,OAAO,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,IAAA,CAAK,mBAAmB,SAAS,CAAA;AAC5D,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA,CAAK,mBAAA,CAAoB,QAAA,CAAS,CAAC,CAAA,CAAE,EAAA,EAAI,MAAA,EAAQ,OAAO,CAAA;AAC1F,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,MAAM,oFAAyE,CAAA;AAAA,IAC3F;AASA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC/C,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAI,OAAA,EAAS,cAAA,IAAkB,CAAE,CAAA,GAAI,MAAA;AAC1D,IAAA,MAAM,KAAK,aAAA,CAAc,SAAA,EAAW,EAAE,cAAA,EAAgB,KAAK,CAAA;AAC3D,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,KAAA,EAA6C;AAC/D,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,GAC3B,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAA,CACf,MAAA,CAAO;AAAA,MACN,SAAA,EAAW,QAAA;AAAA;AAAA;AAAA,MAGX,UAAA,EAAY,MAAM,gBAAA,IAAoB,IAAA;AAAA,MACtC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,MACtC,SAAA,EAAW,MAAM,QAAA,IAAY,IAAA;AAAA,MAC7B,eAAA,EAAiB,MAAM,cAAA,IAAkB,IAAA;AAAA,MACzC,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,MAClC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,gBAAA,EAAkB,MAAM,cAAA,IAAkB,IAAA;AAAA,MAC1C,QAAA,EAAU,MAAM,QAAA,IAAY,KAAA;AAAA,MAC5B,MAAA,EAAQ,MAAM,MAAA,IAAU,QAAA;AAAA,MACxB,eAAA,EAAiB,MAAM,cAAA,IAAkB,CAAA;AAAA,MACzC,GAAA,EAAK,MAAM,GAAA,IAAO,IAAA;AAAA,MAClB,UAAA,EAAY,MAAM,SAAA,IAAa,CAAA;AAAA,MAC/B,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAA,EAAa,MAAM,UAAA,IAAc,IAAA;AAAA,MACjC,WAAA,EAAa,MAAM,UAAA,IAAc,IAAA;AAAA,MACjC,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,MACxB,WAAA,EAAa,MAAM,UAAA,IAAc,IAAA;AAAA,MACjC,SAAA,EAAW,MAAM,QAAA,IAAY,IAAA;AAAA,MAC7B,QAAA,EAAU,MAAM,OAAA,IAAW,IAAA;AAAA,MAC3B,SAAA,EAAW,MAAM,QAAA,IAAY,IAAA;AAAA;AAAA,MAE7B,UAAA,EAAY,MAAM,SAAA,IAAa,IAAA;AAAA;AAAA;AAAA;AAAA,MAI/B,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,MAAA,GAAS,MAAM,QAAA,GAAW,IAAA;AAAA,MACpD,mBAAA,EAAqB,MAAM,iBAAA,IAAqB;AAAA,KACjD,EACA,MAAA,CAAO,CAAA,UAAA,EAAa,EAAE,aAAa,CAAA,GAAA,CAAK,EACxC,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,aAAa,IAAI,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,aAAA,CAAc,EAAA,EAAY,KAAA,EAA6C;AAC3E,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAAE,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AAAM,MAAA,OAAA,CAAQ,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,IAAE;AAC5G,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,IAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,kBAAkB,KAAA,CAAM,cAAA;AACxE,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,WAAA;AACjE,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,mBAAmB,KAAA,CAAM,cAAA;AACzE,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AAC3D,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,IAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,kBAAkB,KAAA,CAAM,cAAA;AACxE,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,MAAA,EAAW,OAAA,CAAQ,MAAM,KAAA,CAAM,GAAA;AACjD,IAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,UAAA;AAChE,IAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,UAAA;AAChE,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,IAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,UAAA;AAChE,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,OAAA;AAC1D,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,IAAA,IAAI,MAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,UAAA,GAAa,MAAM,SAAA,IAAa,IAAA;AAC3E,IAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,QAAA,GAAW,IAAA;AAC9F,IAAA,IAAI,MAAM,iBAAA,KAAsB,MAAA,EAAW,OAAA,CAAQ,mBAAA,GAAsB,MAAM,iBAAA,IAAqB,IAAA;AACpG,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,EAAA,CAC3B,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CAC5C,MAAA,CAAO,aAAa,CAAA,CAAE,aAAa,CAAA,GAAA,CAAK,CAAA,CACxC,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,aAAa,IAAI,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,cAAc,EAAA,EAA2B;AAC7C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AACrE,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAM,kBAAA,CAAmB,SAAA,EAAmB,OAAA,EAAsC;AAChF,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAI7B,IAAA,MAAM,IAAA,GAAO,MAAM,sBAAA,CAAuB,OAAO,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AACzE,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,MAAM,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA,CAAO,IAAA,EAAM,MAAM,gBAAgB,CAAA;AACrG,IAAA,IAAI,WAAW,MAAM,SAAA;AACrB,IAAA,MAAM,EAAE,IAAA,EAAM,EAAE,SAAA,EAAU,EAAE,GAAI,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA,CAAE,YAAA,CAAa,IAAI,CAAA;AAMhF,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,MAAM,GAC9B,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CACpB,MAAA,CAAO,eAAe,EACtB,EAAA,CAAG,YAAA,EAAc,SAAS,CAAA,CAC1B,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CACxC,KAAA,CAAM,CAAC,CAAA;AACV,IAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA;AAC/C,IAAA,MAAM,YAAY,KAAA,GAAQ,CAAA,GAAA,CAAK,SAAS,CAAC,CAAA,CAAE,cAAc,CAAA,IAAK,CAAA;AAE9D,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,GAC3B,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CACpB,MAAA,CAAO;AAAA,MACN,UAAA,EAAY,SAAA;AAAA,MAAW,SAAA,EAAW,QAAA;AAAA,MAAU,GAAA,EAAK,SAAA;AAAA,MACjD,UAAA,EAAY,SAAA;AAAA,MAAW,UAAA,EAAY;AAAA,KACpC,CAAA,CACA,MAAA,EAAO,CAAE,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,WAAW,IAAI,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,kBAAA,CACJ,OAAA,EACA,KAAA,EACuB;AACvB,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAC9D,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,OAAA;AAC1D,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAK9D,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,GAC5B,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CAAE,OAAO,YAAY,CAAA,CAAE,GAAG,IAAA,EAAM,OAAO,EAAE,MAAA,EAAO;AACvE,MAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,QAAA,MAAM,GAAG,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CAC1B,MAAA,CAAO,EAAE,UAAA,EAAY,KAAA,EAAO,CAAA,CAC5B,GAAG,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA,CAClC,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,EAAA,CAC3B,KAAK,CAAA,CAAE,aAAa,EAAE,MAAA,CAAO,OAAO,EAAE,EAAA,CAAG,IAAA,EAAM,OAAO,CAAA,CAAE,MAAA,GAAS,MAAA,EAAO;AAC3E,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,WAAW,IAAI,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,mBAAA,CAAoB,OAAA,EAAiB,IAAA,EAAmC;AAC5E,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,OAAA,EAAQ,GAAI,MAAM,EAAA,CACzC,IAAA,CAAK,EAAE,aAAa,CAAA,CAAE,OAAO,mBAAmB,CAAA,CAAE,GAAG,IAAA,EAAM,OAAO,EAAE,MAAA,EAAO;AAC9E,IAAA,IAAI,SAAS,MAAM,OAAA;AAKnB,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,UAAA,EAAa,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AAC9E,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,EAAE,WAAW,CAAA;AAC5C,IAAA,MAAM,EAAE,OAAO,SAAA,EAAU,GAAI,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,gBAAgB,CAAA;AAC7E,IAAA,IAAI,WAAW,MAAM,SAAA;AACrB,IAAA,MAAM,EAAE,MAAM,EAAE,SAAA,IAAY,GAAI,MAAA,CAAO,aAAa,IAAI,CAAA;AAExD,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,EAAA,CAC3B,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CAAE,MAAA,CAAO,EAAE,GAAA,EAAK,SAAA,EAAW,CAAA,CAAE,EAAA,CAAG,MAAM,OAAO,CAAA,CAAE,MAAA,EAAO,CAAE,MAAA,EAAO;AACtF,IAAA,IAAI,OAAO,MAAM,KAAA;AAIjB,IAAA,MAAM,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,GAAG,CAAA;AAC3C,IAAA,OAAO,WAAW,IAAI,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,mBAAmB,OAAA,EAAgC;AACvD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAI,GAAI,MAAM,GACzB,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,GAAG,IAAA,EAAM,OAAO,EAAE,WAAA,EAAY;AACrE,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,OAAO,CAAA;AAC1E,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,IAAI,KAAK,GAAA,EAAK,MAAM,IAAA,CAAK,wBAAA,CAAyB,IAAI,GAAG,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,yBAAyB,GAAA,EAA+C;AACpF,IAAA,MAAM,IAAA,GAAO,GAAA,GAAM,aAAA,CAAc,GAAG,CAAA,GAAI,IAAA;AACxC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,OAAM,GAAI,MAAM,GACrB,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CAAE,MAAA,CAAO,MAAM,EAAE,KAAA,EAAO,SAAS,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,CAAG,OAAO,GAAG,CAAA;AACnF,IAAA,IAAI,KAAA,EAAO;AACX,IAAA,MAAM,EAAA,CAAG,QAAQ,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA,CAAO,CAAC,IAAI,CAAC,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,GAAsC;AAC1C,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AACjF,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,aAAa,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,eAAe,KAAA,EAA+C;AAClE,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,EAAA,CAC3B,KAAK,CAAA,CAAE,UAAU,CAAA,CACjB,MAAA,CAAO,EAAE,SAAA,EAAW,WAAA,IAAe,IAAA,EAAM,KAAA,CAAM,MAAM,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,OAAA,CAAQ,MAAM,IAAI,CAAA,EAAG,aAAa,KAAA,CAAM,WAAA,IAAe,MAAM,SAAA,EAAW,KAAA,CAAM,YAAY,IAAA,EAAM,UAAA,EAAY,MAAM,SAAA,IAAa,CAAA,EAAG,CAAA,CAC3M,MAAA,GAAS,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,cAAA,CAAe,EAAA,EAAY,KAAA,EAA+C;AAC9E,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,WAAA;AACjE,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAC9D,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,EAAA,CAAG,KAAK,CAAA,CAAE,UAAU,EAAE,MAAA,CAAO,OAAO,EAAE,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CAAE,MAAA,GAAS,MAAA,EAAO;AACjG,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,eAAe,EAAA,EAA2B;AAC9C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AACvE,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,OAAA,EAA+C;AAC9D,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAK7B,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,MAAM,EAAE,MAAA,CAAO,CAAA,SAAA,EAAY,CAAA,CAAE,UAAU,CAAA,GAAA,CAAK,CAAA;AAC9D,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,IAAI,SAAS,MAAA,EAAQ,CAAA,GAAI,EAAE,EAAA,CAAG,QAAA,EAAU,QAAQ,MAAM,CAAA;AACtD,IAAA,IAAI,SAAS,eAAA,EAAiB,CAAA,GAAI,EAAE,EAAA,CAAG,kBAAA,EAAoB,QAAQ,eAAe,CAAA;AAClF,IAAA,IAAI,SAAS,iBAAA,EAAmB,CAAA,GAAI,EAAE,EAAA,CAAG,oBAAA,EAAsB,QAAQ,iBAAiB,CAAA;AACxF,IAAA,IAAI,SAAS,UAAA,EAAY,CAAA,GAAI,EAAE,EAAA,CAAG,aAAA,EAAe,QAAQ,UAAU,CAAA;AACnE,IAAA,IAAI,SAAS,aAAA,EAAe,CAAA,GAAI,EAAE,EAAA,CAAG,gBAAA,EAAkB,QAAQ,aAAa,CAAA;AAC5E,IAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,CAAA,qBAAA,EAAwB,OAAA,CAAQ,MAAM,CAAA,wBAAA,EAA2B,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAG,CAAA;AAChH,IAAA,CAAA,GAAI,EAAE,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,OAAO,CAAA;AAC9C,IAAA,IAAI,SAAS,KAAA,EAAO,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,UAAU,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,SAAS,EAAA,EAAmC;AAChD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,EAAA,CAC3B,IAAA,CAAK,EAAE,MAAM,CAAA,CAAE,OAAO,CAAA,SAAA,EAAY,CAAA,CAAE,UAAU,CAAA,GAAA,CAAK,CAAA,CACnD,GAAG,IAAA,EAAM,EAAE,EAAE,WAAA,EAAY;AAC5B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,KAAA,GAAQ,WAAW,IAAI,CAAA;AAG7B,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,KAAY,MAAM,EAAA,CAC7B,KAAK,CAAA,CAAE,gBAAgB,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE,EAAA,CAAG,YAAY,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AACnE,IAAA,KAAA,CAAM,MAAA,GAAA,CAAU,OAAA,EAAS,MAAA,IAAU,CAAA,IAAK,IAAI,YAAA,GAAe,OAAA;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,KAAA,EAAyC;AACzD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,SAAA,EAAW,CAAC,CAAA;AAC7E,IAAA,MAAM,aAAA,GAAgB,MAAM,aAAA,IAAiB,CAAA;AAC7C,IAAA,MAAM,aAAA,GAAgB,MAAM,aAAA,IAAiB,CAAA;AAC7C,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAA,CAAO,WAAW,aAAA,GAAgB,aAAA,IAAiB,GAAG,CAAA,GAAI,GAAA;AAC7E,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,QAAA,EAAS,GAAI,MAAM,EAAA,CAC5C,IAAA,CAAK,CAAA,CAAE,MAAM,CAAA,CACb,MAAA,CAAO,EAAE,SAAA,EAAW,QAAA,EAAU,WAAA,EAAa,KAAA,CAAM,UAAA,IAAc,IAAA,EAAM,aAAA,EAAe,KAAA,CAAM,YAAA,IAAgB,IAAA,EAAM,cAAA,EAAgB,KAAA,CAAM,aAAA,IAAiB,IAAA,EAAM,UAAU,KAAA,CAAM,QAAA,IAAY,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,IAAA,EAAM,QAAA,EAAU,cAAA,EAAgB,aAAA,EAAe,cAAA,EAAgB,aAAA,EAAe,aAAA,EAAe,KAAA,CAAM,gBAAgB,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,gBAAA,EAAkB,SAAA,EAAW,kBAAA,EAAoB,aAAA,EAAe,CAAA,CACta,MAAA,EAAO,CAAE,MAAA,EAAO;AACnB,IAAA,IAAI,UAAU,MAAM,QAAA;AACpB,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,QAAA,EAAU,KAAA,CAAM,EAAA,EAAI,UAAA,EAAY,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG,IAAA,EAAM,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,CAAE,GAAA,IAAO,MAAM,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,UAAA,EAAY,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CAAE,QAAA,GAAW,EAAE,SAAA,EAAW,SAAA,EAAW,CAAA,CAAE,QAAA,IAAY,MAAK,CAAE,CAAA;AAC7O,IAAA,MAAM,GAAG,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AACxC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,WAAA,CAAY,EAAA,EAAY,KAAA,EAAyC;AACrE,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,IAAA,IAAI,KAAA,CAAM,eAAA,KAAoB,MAAA,EAAW,OAAA,CAAQ,mBAAmB,KAAA,CAAM,eAAA;AAC1E,IAAA,IAAI,KAAA,CAAM,iBAAA,KAAsB,MAAA,EAAW,OAAA,CAAQ,qBAAqB,KAAA,CAAM,iBAAA;AAC9E,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,MAAM,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC1E,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAA,GAA6C;AACjD,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CACpB,MAAA,CAAO,GAAG,CAAA,CACV,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA,CACvC,KAAA,CAAM,aAAA,EAAe,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3C,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,iBAAiB,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,mBAAmB,KAAA,EAAuD;AAC9E,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,yDAAyD,CAAA;AACxF,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CACpB,OAAO,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,mBAAA,CAAoB,KAAK,GAAG,CAAA,CAC7D,MAAA,EAAO,CACP,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,kBAAkB,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,kBAAA,CAAmB,EAAA,EAAY,KAAA,EAAuD;AAC1F,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CACpB,OAAO,mBAAA,CAAoB,KAAK,CAAC,CAAA,CACjC,EAAA,CAAG,MAAM,EAAE,CAAA,CACX,MAAA,EAAO,CACP,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,kBAAkB,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,oBAAA,GAAmD;AACvD,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CACvB,MAAA,CAAO,GAAG,CAAA,CACV,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CACxC,KAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,oBAAoB,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,sBAAsB,KAAA,EAA6D;AACvF,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAC3F,IAAA,IAAI,KAAA,CAAM,SAAA,EAAW,MAAM,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAC5D,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CACvB,OAAO,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,sBAAA,CAAuB,KAAK,GAAG,CAAA,CAChE,MAAA,EAAO,CACP,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,qBAAqB,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,qBAAA,CAAsB,EAAA,EAAY,KAAA,EAA6D;AACnG,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,MAAM,SAAA,IAAa,QAAA,QAAgB,IAAA,CAAK,mBAAA,CAAoB,UAAU,EAAE,CAAA;AAC5E,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CACvB,OAAO,sBAAA,CAAuB,KAAK,CAAC,CAAA,CACpC,EAAA,CAAG,MAAM,EAAE,CAAA,CACX,MAAA,EAAO,CACP,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,qBAAqB,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,sBAAsB,EAAA,EAA2B;AACrD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC7E,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAc,mBAAA,CAAoB,QAAA,EAAkB,QAAA,EAAkC;AACpF,IAAA,IAAI,QAAQ,KAAA,EAAM,CACf,KAAK,CAAA,CAAE,gBAAgB,EACvB,MAAA,CAAO,EAAE,YAAY,KAAA,EAAO,EAC5B,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,cAAc,IAAI,CAAA;AACxB,IAAA,IAAI,QAAA,EAAU,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC9C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAA;AACxB,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAM,mBAAmB,EAAA,EAA2B;AAClD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC1E,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,mBAAA,GAAwD;AAC5D,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,KAAA,GAC3B,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CACvB,OAAO,iCAAiC,CAAA,CACxC,GAAG,WAAA,EAAa,QAAQ,EACxB,WAAA,EAAY;AACf,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,CAAC,CAAA;AAAA,MACpC,WAAW,IAAA,CAAK,UAAA,IAAc,OAAO,IAAA,GAAO,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,MAClE,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,KAC7B;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,KAAA,EAA+D;AAC1F,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAC5F,IAAA,MAAM,OAAA,GAAmC,EAAE,SAAA,EAAW,QAAA,EAAS;AAC/D,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAG5D,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAC9D,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AAC3D,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,KAAK,CAAA,CAAE,gBAAgB,EACvB,MAAA,CAAO,OAAA,EAAS,EAAE,UAAA,EAAY,WAAA,EAAa,CAAA,CAC3C,MAAA,CAAO,iCAAiC,CAAA,CACxC,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,CAAC,CAAA;AAAA,MACpC,WAAW,IAAA,CAAK,UAAA,IAAc,OAAO,IAAA,GAAO,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,MAClE,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,oBAAA,GAAmD;AACvD,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CACvB,MAAA,CAAO,GAAG,CAAA,CACV,EAAA,CAAG,WAAA,EAAa,WAAA,EAAa,CAAA,CAC7B,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CACxC,KAAA,CAAM,MAAM,CAAA;AACf,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,oBAAoB,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,sBAAsB,KAAA,EAA6D;AACvF,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAC3F,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAM,CACjC,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CACvB,MAAA,CAAO,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,sBAAA,CAAuB,KAAK,CAAA,EAAG,CAAA,CAChE,MAAA,CAAO,GAAG,CAAA,CACV,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,qBAAqB,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,qBAAA,CAAsB,EAAA,EAAY,KAAA,EAA6D;AACnG,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CACvB,OAAO,sBAAA,CAAuB,KAAK,CAAC,CAAA,CACpC,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CACX,MAAA,CAAO,GAAG,CAAA,CACV,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,qBAAqB,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,sBAAsB,EAAA,EAA2B;AACrD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC7E,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA,EAIA,MAAM,kBAAA,GAA+C;AACnD,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CACrB,MAAA,CAAO,GAAG,CAAA,CACV,EAAA,CAAG,WAAA,EAAa,WAAA,EAAa,CAAA,CAC7B,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CACxC,KAAA,CAAM,MAAM,CAAA;AACf,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,kBAAkB,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,oBAAoB,KAAA,EAAyD;AACjF,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,0DAA0D,CAAA;AACzF,IAAA,IAAI,KAAA,CAAM,SAAA,EAAW,MAAM,IAAA,CAAK,0BAA0B,QAAQ,CAAA;AAClE,IAAA,MAAM,OAAA,GAAU,qBAAqB,KAAK,CAAA;AAC1C,IAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,UAAmB,IAAA,GAAO,cAAA,CAAe,MAAM,IAAI,CAAA;AACxE,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CACrB,OAAO,EAAE,SAAA,EAAW,UAAU,GAAG,OAAA,EAAS,CAAA,CAC1C,MAAA,CAAO,GAAG,CAAA,CACV,MAAA,EAAO;AACV,IAAA,IAAI,KAAA,EAAO,MAAM,kBAAA,CAAmB,KAAK,CAAA;AACzC,IAAA,OAAO,mBAAmB,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,mBAAA,CAAoB,EAAA,EAAY,KAAA,EAAyD;AAC7F,IAAA,MAAM,WAAW,WAAA,EAAY;AAG7B,IAAA,IAAI,MAAM,SAAA,IAAa,QAAA,QAAgB,IAAA,CAAK,yBAAA,CAA0B,UAAU,EAAE,CAAA;AAClF,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CACrB,OAAO,oBAAA,CAAqB,KAAK,CAAC,CAAA,CAClC,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CACX,MAAA,CAAO,GAAG,CAAA,CACV,MAAA,EAAO;AACV,IAAA,IAAI,KAAA,EAAO,MAAM,kBAAA,CAAmB,KAAK,CAAA;AACzC,IAAA,OAAO,mBAAmB,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,oBAAoB,EAAA,EAA2B;AACnD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC3E,IAAA,IAAI,KAAA,EAAO,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAc,yBAAA,CAA0B,QAAA,EAAkB,QAAA,EAAkC;AAC1F,IAAA,IAAI,QAAQ,KAAA,EAAM,CACf,KAAK,CAAA,CAAE,cAAc,EACrB,MAAA,CAAO,EAAE,YAAY,KAAA,EAAO,EAC5B,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,cAAc,IAAI,CAAA;AACxB,IAAA,IAAI,QAAA,EAAU,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC9C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAA;AACxB,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAe,KAAA,GAAQ,EAAA,EAA8B;AACnE,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AACtC,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAC7B,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,iBAAA,EAAmB;AAAA,MAC3D,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,KAAA;AAAA;AAAA;AAAA;AAAA,MAIT,WAAA,EAAa,aAAY,IAAK;AAAA,KAC/B,CAAA;AACD,IAAA,IAAI,KAAA,SAAc,EAAC;AACnB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACrC,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,KAAA,EAAO,IAAI,KAAA,IAAS,EAAA;AAAA,MACpB,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,MAC3B,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,MAC3B,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,MACpB,WAAA,EAAa,IAAI,YAAA,IAAgB,IAAA;AAAA,MACjC,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,IAC9B,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,QAC3B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,KAAA,EAAO,EAAE,KAAA,IAAS,EAAA;AAAA,QAClB,QAAA,EAAU,EAAE,SAAA,IAAa,IAAA;AAAA,QACzB,WAAA,EAAa,EAAE,YAAA,IAAgB;AAAA,QAC/B,CAAA,GACF,MAAA;AAAA,MACJ,gBAAA,EAAkB,MAAA,CAAO,GAAA,CAAI,kBAAA,IAAsB,CAAC,CAAA;AAAA,MACpD,SAAA,EAAW,IAAI,UAAA,IAAc;AAAA,KAC/B,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,iBAAiB,eAAA,EAAkE;AACvF,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,qBAAA,EAAuB;AAAA,MAC/D,WAAA,EAAa,QAAA;AAAA,MACb,oBAAoB,eAAA,IAAmB;AAAA,KACxC,CAAA;AACD,IAAA,IAAI,OAAO,OAAO,IAAA;AAClB,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,MACtB,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAAA,MAClC,QAAA,EAAU,IAAI,QAAA,IAAY,mBAAA;AAAA,MAC1B,QAAA,EAAU,IAAI,SAAA,IAAa,IAAA;AAAA,MAC3B,UAAA,EAAY,IAAI,YAAA,IAAgB,IAAA;AAAA,MAChC,MAAA,EAAQ,IAAI,MAAA,IAAU;AAAA,KACxB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,iBAAA,CACJ,eAAA,EACA,IAAA,EACyB;AACzB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,qBAAA,EAAuB;AAAA,MAC/D,WAAA,EAAa,QAAA;AAAA,MACb,oBAAoB,eAAA,IAAmB,UAAA;AAAA,MACvC,GAAI,IAAA,GAAO,EAAE,MAAA,EAAQ,IAAA,KAAS;AAAC,KAChC,CAAA;AACD,IAAA,IAAI,KAAA,SAAc,EAAC;AACnB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACrC,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,QAAQ,GAAA,CAAI;AAAA,KACd,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,eAAA,EAA4D;AACjF,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,wBAAwB,CAAA,CAC7B,MAAA,CAAO,6CAA6C,CAAA,CACpD,GAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,QAAA,EAAU,IAAI,CAAA,CACjB,KAAA,CAAM,WAAW,EAAE,SAAA,EAAW,IAAA,EAAM,EACpC,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAGxC,IAAA,IAAI,KAAA,SAAc,EAAC;AACnB,IAAA,MAAM,OAAO,eAAA,IAAmB,UAAA;AAChC,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EACd,MAAA,CAAO,CAAC,GAAA,KAAa,GAAA,CAAI,gBAAA,IAAoB,IAAA,IAAQ,IAAI,gBAAA,KAAqB,IAAI,CAAA,CAClF,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MAClB,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAAA,MAC3B,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAAA,MAC5B,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA,MAC9B,eAAA,EAAiB,IAAI,gBAAA,IAAoB;AAAA,KAC3C,CAAE,CAAA;AAAA,EACN;AAAA,EAEA,MAAM,aAAA,CAAc,UAAA,EAAoB,OAAA,EAAqD;AAC3F,IAAA,MAAM,WAAW,WAAA,EAAY;AAG7B,IAAA,MAAM,SAAS,MAAA,CAAO,UAAA,IAAc,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACzD,IAAA,IAAI,CAAC,QAAA,IAAY,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AAC9E,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,qBAAA,EAAuB;AAAA,MAC/D,WAAA,EAAa,QAAA;AAAA,MACb,aAAA,EAAe,MAAA;AAAA;AAAA;AAAA;AAAA,MAIf,SAAA,EAAW,mBAAmB,OAAO;AAAA,KACtC,CAAA;AACD,IAAA,IAAI,OAAO,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,SAAS,KAAA,EAAM;AACnD,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAC5C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA;AAAA,MAC7B,WAAA,EAAa,KAAK,YAAA,IAAgB,IAAA;AAAA,MAClC,OAAA,EAAS,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAA;AAAA,MAC9B,OAAA,EAAS,KAAK,OAAA,IAAW,IAAA;AAAA,MACzB,QAAA,EAAU,KAAK,SAAA,IAAa,IAAA;AAAA,MAC5B,eAAA,EAAiB,KAAK,gBAAA,KAAqB;AAAA,KAC7C;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,GAAkD;AACtD,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,KAAA,GAC3B,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAA,CACf,OAAO,GAAG,CAAA,CACV,GAAG,WAAA,EAAa,QAAQ,EACxB,WAAA,EAAY;AACf,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,IAAA,GAAO,kBAAA,CAAmB,IAAI,CAAA,GAAI,IAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,oBAAoB,KAAA,EAAyD;AACjF,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,0DAA0D,CAAA;AACzF,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,QAAQ,CAAA,CACf,MAAA,CAAO,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,oBAAA,CAAqB,KAAK,CAAA,EAAE,EAAG,EAAE,UAAA,EAAY,WAAA,EAAa,CAAA,CAC3F,MAAA,CAAO,GAAG,CAAA,CACV,MAAA,EAAO;AACV,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,mBAAmB,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAA,GAAwD;AAC5D,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,GAAA,CAAI,qBAAA,EAAuB,EAAE,WAAA,EAAa,QAAA,EAAU,CAAA;AAC1F,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAC5C,IAAA,OAAO,GAAA,GAAM,kBAAA,CAAmB,GAAG,CAAA,GAAI,IAAA;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,uBAAA,GAAgE;AACpE,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,GAAA,CAAI,sBAAA,EAAwB,EAAE,WAAA,EAAa,QAAA,EAAU,CAAA;AAC3F,IAAA,IAAI,OAAO,OAAO,IAAA;AAClB,IAAA,OAAO,sBAAA,CAAuB,MAAM,OAAA,CAAQ,IAAI,IAAI,IAAA,CAAK,CAAC,IAAI,IAAI,CAAA;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,WAAA,GAAqC;AACzC,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,GAAA,CAAI,qBAAA,EAAuB,EAAE,WAAA,EAAa,QAAA,EAAU,CAAA;AAC1F,IAAA,IAAI,KAAA,SAAc,EAAC;AACnB,IAAA,OAAA,CAAS,IAAA,IAAQ,EAAC,EAAiC,GAAA,CAAI,CAAC,GAAA,MAAkC;AAAA,MACxF,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,MACrB,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,MACrB,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAAA,MAC7B,MAAA,EAAS,IAAI,MAAA,IAA4B,IAAA;AAAA,MACzC,SAAA,EAAW,MAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAK,GAAA,CAAI,YAAyB,EAAC;AAAA,MACzE,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,eAAA,EAAkB,IAAI,gBAAA,IAAsC,IAAA;AAAA,MAC5D,gBAAA,EAAkB,MAAA,CAAO,GAAA,CAAI,kBAAA,IAAsB,CAAC,CAAA;AAAA,MACpD,mBAAmB,GAAA,CAAI,mBAAA,IAAuB,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,mBAAmB;AAAA,KAC5F,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,gBAAA,GAA+C;AACnD,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAM,CACjC,IAAA,CAAK,kBAAkB,CAAA,CACvB,MAAA,CAAO,GAAG,EACV,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CACxC,KAAA,CAAM,MAAM,CAAA;AACf,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAS,IAAA,IAAQ,EAAC,EAAiC,GAAA,CAAI,CAAC,GAAA,MAAmD;AAAA,MAC7G,EAAA,EAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,MACjB,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,MACrB,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,MACrB,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAAA,MAC7B,MAAA,EAAS,IAAI,MAAA,IAA4B,IAAA;AAAA,MACzC,SAAA,EAAW,MAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAK,GAAA,CAAI,YAAyB,EAAC;AAAA,MACzE,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAAA,MACjC,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AAAA,MAC/B,eAAA,EAAkB,IAAI,gBAAA,IAAsC,IAAA;AAAA,MAC5D,gBAAA,EAAkB,MAAA,CAAO,GAAA,CAAI,kBAAA,IAAsB,CAAC,CAAA;AAAA,MACpD,mBAAmB,GAAA,CAAI,mBAAA,IAAuB,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,mBAAmB,CAAA;AAAA,MAC1F,YAAA,EAAe,IAAI,cAAA,IAAoC;AAAA,KACzD,CAAE,CAAA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,uBAAuB,gBAAA,EAAyD;AACpF,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAC5C,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAqB,CAAC,CAAC,EAAE,CAAA;AACnF,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,QAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,QAAA,EAAU,CAAA,CAAE,EAAA,EAAI,KAAA,EAAO,MAAK,CAAE,CAAA;AAC/E,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,mBAAmB,CAAA,CACxB,MAAA,CAAO,uBAAuB,CAAA,CAC9B,EAAA,CAAG,YAAA,EAAc,gBAAgB,CAAA,CACjC,EAAA,CAAG,YAAA,EAAc,IAAI,CAAA,CACrB,EAAA,CAAG,SAAA,EAAW,CAAC,CAAA,CACf,EAAA,CAAG,gBAAA,EAAkB,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,MAAM,UAAU,IAAI,GAAA,CAAA,CAAM,IAAA,IAAQ,IAAoD,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,EAAE,cAAA,EAAgB,MAAA,CAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;AACrI,IAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,OAAO,EAAE,QAAA,EAAU,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,YAAA,GAAe,QAAQ,GAAA,CAAI,CAAA,CAAE,YAAY,CAAA,IAAK,IAAA,GAAO,MAAK,CAAE,CAAA;AAAA,EACpH;AAAA,EAEA,MAAM,qBAAA,CAAsB,gBAAA,EAA0B,QAAA,EAAkB,KAAA,EAAqC;AAC3G,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,0BAA0B,CAAA;AACzD,IAAA,MAAM,MAAA,GAAA,CAAU,MAAM,IAAA,CAAK,gBAAA,EAAiB,EAAG,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,QAAQ,CAAA;AAC5E,IAAA,IAAI,CAAC,MAAA,EAAQ,YAAA,EAAc,MAAM,IAAI,MAAM,kDAA4C,CAAA;AACvF,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,SAAA,EAAU,GAAI,MAAM,EAAA,CAChD,IAAA,CAAK,mBAAmB,CAAA,CACxB,MAAA,CAAO,IAAI,CAAA,CACX,EAAA,CAAG,gBAAA,EAAkB,MAAA,CAAO,YAAY,CAAA,CACxC,EAAA,CAAG,YAAA,EAAc,gBAAgB,CAAA,CACjC,EAAA,CAAG,YAAA,EAAc,IAAI,CAAA,CACrB,EAAA,CAAG,SAAA,EAAW,CAAC,EACf,WAAA,EAAY;AACf,IAAA,IAAI,WAAW,MAAM,SAAA;AACrB,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,EAAE,KAAA,EAAAA,MAAAA,EAAM,GAAI,MAAM,EAAA,CAAG,IAAA,CAAK,mBAAmB,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,IAAA,EAAO,SAA4B,EAAE,CAAA;AACtG,QAAA,IAAIA,QAAO,MAAMA,MAAAA;AAAA,MACnB;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,EAAE,KAAA,EAAAA,MAAAA,EAAM,GAAI,MAAM,GAAG,IAAA,CAAK,mBAAmB,CAAA,CAAE,MAAA,CAAO,EAAE,KAAA,EAAO,EAAE,EAAA,CAAG,IAAA,EAAO,SAA4B,EAAE,CAAA;AAC/G,MAAA,IAAIA,QAAO,MAAMA,MAAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAE,OAAM,GAAI,MAAM,GAAG,IAAA,CAAK,mBAAmB,EAAE,MAAA,CAAO;AAAA,MAC1D,SAAA,EAAW,QAAA;AAAA,MACX,gBAAgB,MAAA,CAAO,YAAA;AAAA,MACvB,UAAA,EAAY,gBAAA;AAAA,MACZ,KAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAAwC;AAC5D,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,GAAA,CAAI,2BAAA,EAA6B,EAAE,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA;AAClH,IAAA,IAAI,KAAA,SAAc,EAAC;AACnB,IAAA,OAAA,CAAS,IAAA,IAAQ,EAAC,EAAiC,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC/D,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,MAChC,SAAA,EAAY,IAAI,UAAA,IAAgC,IAAA;AAAA,MAChD,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAK;AAAA,KACzB,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAA,CAAe,EAAA,EAAY,SAAA,EAA2C;AAC1E,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,sBAAA,EAAwB;AAAA,MAC1D,UAAA,EAAY,EAAA;AAAA,MACZ,aAAa,SAAA,IAAa;AAAA,KAC3B,CAAA;AACD,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,SAAA,CAAU,OAAA,EAAiB,MAAA,EAAgB,KAAA,GAAiC,EAAC,EAAG;AAC5F,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,qDAAqD,CAAA;AACpF,IAAA,MAAM,EAAE,IAAI,OAAA,EAAQ,GAAI,MAAM,gBAAA,CAAiB,KAAA,IAAS,qBAAA,EAAuB;AAAA,MAC7E,QAAA;AAAA,MAAU,OAAA;AAAA,MAAS,MAAA;AAAA,MAAQ,GAAG;AAAA,KAC/B,CAAA;AACD,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,OAAA,EAAS,SAAS,0CAAuC,CAAA;AAClF,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,kBAAA,CAAmB,OAAA,EAAiB,OAAA,EAAkB;AAC1D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAQ,GAAI,EAAE,CAAA;AACjF,IAAA,OAAO;AAAA,MACL,UAAU,OAAA,EAAS,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,MAAA,MAAiB;AAAA,QACtD,SAAA,EAAW,MAAA,CAAO,MAAA,CAAO,UAAA,IAAc,OAAO,SAAS,CAAA;AAAA,QACvD,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,IAAA,IAAQ,SAAS,CAAA;AAAA,QACrC,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA;AAAA,QACpC,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,CAAC,CAAA;AAAA,QAC/B,UAAA,EAAY,OAAO,YAAA,IAAgB,IAAA;AAAA,QACnC,UAAA,EAAY,OAAO,YAAA,IAAgB;AAAA,OACrC,CAAE,CAAA;AAAA,MACF,KAAA,EAAO,SAAS,KAAA,GACZ;AAAA,QACE,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AAAA,QACzC,QAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,GAAA,IAAO,IAAA;AAAA,QAC/B,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,IAAU,IAAA;AAAA,QAChC,QAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,QAAA,IAAY;AAAA,OAC/C,GACA;AAAA,KACN;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAA,CAAiB,OAAA,EAAiB,SAAA,EAAmB,OAAA,EAAkB;AAC3E,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,KAAA,EAAO,EAAE,SAAA,EAAW,GAAI,UAAU,EAAE,OAAA,EAAQ,GAAI,IAAK,CAAA;AACnG,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,EAAE,CAAA;AAAA,MACtC,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,MAC/B,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,SAAS,QAAA,IAAY;AAAA,KACjC;AAAA,EACF;AAAA,EAEA,MAAM,kBAAA,CAAmB,OAAA,EAAiB,OAAA,EAAkB;AAC1D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAQ,GAAI,EAAE,CAAA;AACjF,IAAA,OAAO,SAAS,QAAA,IAAY,IAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,MAAM,qBAAqB,KAAA,EAA4D;AACrF,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,EAAE,IAAI,OAAA,EAAQ,GAAI,MAAM,gBAAA,CAAiB,KAAA,IAAS,qBAAA,EAAuB;AAAA,MAC7E,QAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO,MAAM,KAAA,IAAS,EAAA;AAAA,MACtB,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,MACpB,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY;AAAC,KACnD,CAAA;AACD,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,OAAA,EAAS,SAAS,0CAAuC,CAAA;AAClF,IAAA,OAAQ,OAAA,EAAS,YAAY,EAAC;AAAA,EAChC;AAAA,EAEA,MAAM,kBAAA,CAAmB,OAAA,EAAiB,OAAA,EAAkB;AAC1D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAQ,GAAI,EAAE,CAAA;AACjF,IAAA,OAAO,SAAS,QAAA,IAAY,IAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAsB,UAAA,EAAgD;AAC1E,IAAA,IAAI,CAAC,MAAA,CAAO,UAAU,CAAA,SAAU,EAAC;AACjC,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,WAAW,CAAA,CAChB,MAAA,CAAO,sGAAsG,CAAA,CAC7G,GAAG,YAAA,EAAc,eAAe,CAAA,CAChC,EAAA,CAAG,UAAA,EAAY,UAAU,CAAA,CACzB,KAAA,CAAM,cAAc,EAAE,SAAA,EAAW,KAAA,EAAO,EACxC,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,OAAO,CAAA;AAC3C,IAAA,IAAI,KAAA,SAAc,EAAC;AACnB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACrC,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,KAAA,EAAO,IAAI,KAAA,IAAS,MAAA;AAAA,MACpB,SAAA,EAAW,IAAI,SAAA,IAAa,MAAA;AAAA,MAC5B,KAAA,EAAO,IAAI,KAAA,IAAS,MAAA;AAAA,MACpB,UAAA,EAAY,IAAI,WAAA,IAAe,EAAA;AAAA,MAC/B,MAAA,EAAQ,IAAI,MAAA,IAAU,EAAA;AAAA,MACtB,MAAA,EAAQ,IAAI,MAAA,IAAU,MAAA;AAAA,MACtB,UAAA,EAAY,IAAI,UAAA,IAAc,MAAA;AAAA,MAC9B,QAAA,EAAU,IAAI,QAAA,IAAY,MAAA;AAAA,MAC1B,IAAA,EAAM,IAAI,IAAA,IAAQ,EAAA;AAAA,MAClB,KAAA,EAAO,IAAI,KAAA,IAAS,EAAA;AAAA,MACpB,OAAA,EAAS,IAAI,OAAA,IAAW,MAAA;AAAA,MACxB,SAAA,EAAW,IAAI,UAAA,IAAc;AAAA,KAC/B,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAA,CACJ,UAAA,EACA,QAAA,EACA,OAAA,EACgC;AAChC,IAAA,MAAM,MAAA,GAAS,eAAe,UAAU,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAOvB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,aAAA,CAAc,QAAQ,OAAO,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC1E,IAAA,IAAI,OAAA,EAAS,OAAA,EAAS,OAAO,EAAC;AAE9B,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,kBAAiB,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC/D,IAAA,IAAI,QAAA,EAAU,kBAAkB,KAAA,EAAO;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,IAAI,OAAA,EAAQ,GAAI,MAAM,gBAAA,CAAiB,KAAA,IAAS,qBAAA,EAAuB;AAAA,UAC7E,QAAA;AAAA,UAAU,UAAA,EAAY,MAAA;AAAA,UAAQ;AAAA,SAC/B,CAAA;AACD,QAAA,MAAM,OAAc,EAAA,GAAM,OAAA,EAAS,OAAA,IAAW,KAAM,EAAC;AACrD,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,YACxB,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,EAAE,CAAA;AAAA,YACnC,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,SAAS,CAAA;AAAA,YAClC,OAAA,EAAS,IAAI,OAAA,IAAW,KAAA,CAAA;AAAA,YACxB,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AAAA,YAC3B,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AAAA,YAC/B,SAAA,EAAW,IAAA;AAAA,YACX,UAAA,EAAY,IAAI,YAAA,IAAgB,KAAA,CAAA;AAAA,YAChC,UAAA,EAAY,IAAI,YAAA,IAAgB,KAAA,CAAA;AAAA,YAChC,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA,KAAM;AAAA,WACnC,CAAE,CAAA;AAAA,QACJ;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,qBAAA,EAAuB;AAAA,MAC/D,WAAA,EAAa,QAAA;AAAA,MACb,aAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAY,QAAA;AAAA,MACZ,SAAA,EAAW,mBAAmB,OAAO;AAAA,KACtC,CAAA;AACD,IAAA,IAAI,KAAA,SAAc,EAAC;AACnB,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AAGjB,MAAA,MAAM,EAAE,MAAM,IAAA,EAAK,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,mBAAA,EAAqB;AAAA,QAC5D,WAAA,EAAa,QAAA;AAAA,QAAU,UAAA,EAAY,QAAA;AAAA,QAAU,aAAA,EAAe;AAAA,OAC7D,CAAA;AACD,MAAA,IAAI,IAAA,IAAQ,IAAA,EAAM,OAAO,EAAC;AAC1B,MAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,MAAA,OAAO,CAAC,EAAE,MAAA,EAAQ,iBAAA,EAAmB,MAAM,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,OAAO,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,KAAA,KAAU,GAAG,CAAA;AAAA,IAC1H;AACA,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,MACrC,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,IAAI,OAAA,IAAW,MAAA;AAAA,MACxB,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,CAAC,CAAA;AAAA,MAC1B,UAAU,MAAA,CAAO,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,MAC/C,WAAW,GAAA,CAAI,UAAA,IAAc,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,UAAU,CAAA;AAAA,MAChE,UAAA,EAAY,IAAI,YAAA,IAAgB,MAAA;AAAA,MAChC,UAAA,EAAY,IAAI,YAAA,IAAgB,MAAA;AAAA,MAChC,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,IAAI;AAAA,KACxB,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,oBAAoB,KAAA,EAAuD;AAC/E,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAYzF,IAAA,MAAM,QAAA,GAAW,uBAAA;AAAA,MACf,KAAA,CAAM,QAAA;AAAA;AAAA,MAEN,KAAA,CAAM,QAAA,IAAY,IAAA,GAAA,CACb,MAAM,IAAA,CAAK,gBAAA,EAAiB,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA,GAAI,eAAA,GACnD;AAAA,KACN;AACA,IAAA,MAAM,OAAA,GAAU,gBAAgB,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,8DAAwD,CAAA;AAAA,IAC1E;AAIA,IAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAC,OAAA,CAAQ,IAAA,EAAM;AACjC,MAAA,MAAM,IAAI,MAAM,uEAAiE,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,OAAA,EAAQ,GAAI,MAAM,gBAAA,CAAiB,KAAA,EAAM,EAAG,OAAA,CAAQ,IAAA,EAAM;AAAA,MAC5E,QAAA;AAAA,MACA,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAChC,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,YAAA,EAAc,KAAK,YAAA,IAAgB,IAAA;AAAA,QACnC,UAAU,IAAA,CAAK;AAAA,OACjB,CAAE,CAAA;AAAA,MACF,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,eAAA,EAAiB,MAAM,eAAA,IAAmB,IAAA;AAAA,MAC1C,YAAA,EAAc,MAAM,YAAA,IAAgB,IAAA;AAAA,MACpC,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,MACxB,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,iBAAiB,OAAA,IAAW,IAAA;AAAA;AAAA;AAAA;AAAA,MAI5D,MAAA,EAAQ,MAAM,aAAA,IAAiB,IAAA;AAAA,MAC/B,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,MAC9B,MAAA,EAAQ,MAAM,MAAA,KAAW,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOzB,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,MAC9B,YAAA,EAAc,MAAM,YAAA,IAAgB,IAAA;AAAA,MACpC,eAAA,EAAiB,MAAM,eAAA,IAAmB,IAAA;AAAA,MAC1C,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,MAC5B,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,KAC7B,CAAA;AAED,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,OAAA,EAAS,SAAA,EAAW;AAG9B,MAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,OAAA,EAAS,UAAU,MAAA,KAAW,GAAA,GACpD,iEACA,+CAAA,CAA0C,CAAA;AAc9C,MAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AACjB,MAAA,IAAI,SAAS,IAAA,EAAM,OAAA,CAAQ,IAAA,GAAO,MAAA,CAAO,QAAQ,IAAI,CAAA;AACrD,MAAA,MAAM,OAAA;AAAA,IACR;AAEA,IAAA,OAAO;AAAA,MACL,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,IAAS,CAAC,CAAA;AAAA,MAChC,KAAA,EAAO,MAAA;AAAA,MACP,QAAA;AAAA,MACA,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,KAAA,CAAM,aAAA,IAAiB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKjD,UAAA,EAAY,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,UAAA,IAAc,IAAA;AAAA,MACzD,MAAA,EAAQ,QAAQ,MAAA,GACZ;AAAA,QACE,KAAK,OAAA,CAAQ,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASb,YAAA,EAAc,OAAO,OAAA,CAAQ,YAAA,IAAgB,EAAE,CAAA,CAAE,OAAA,CAAQ,2BAAA,EAA6B,EAAE,CAAA,IAAK,IAAA;AAAA,QAC7F,WAAW,MAAA,CAAO,OAAA,CAAQ,aAAa,EAAE,CAAA,CAAE,MAAK,IAAK,IAAA;AAAA,QACrD,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,OAClC,GACA;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,qBAAA,CACJ,SAAA,EACA,QAAA,EACA,WAAA,EAC6B;AAC7B,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAE,OAAO,SAAA,EAAU;AACzC,IAAA,MAAM,OAAA,GAAU,gBAAgB,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA,CAAE,IAAA,MAAU,YAAY,CAAA;AAC7E,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,OAAO,SAAA,EAAU;AACxC,IAAA,IAAI;AAIF,MAAA,MAAM,EAAE,IAAI,OAAA,EAAQ,GAAI,MAAM,gBAAA,CAAiB,KAAA,EAAM,EAAG,OAAA,CAAQ,MAAA,EAAQ;AAAA,QACtE,QAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB;AAAC,OACvC,EAAG,EAAE,SAAA,EAAW,IAAA,EAAQ,CAAA;AACxB,MAAA,IAAI,CAAC,MAAM,CAAC,OAAA,EAAS,OAAO,OAAO,EAAE,OAAO,SAAA,EAAU;AACtD,MAAA,OAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,IAAA,EAAM,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,IAAA,EAAK;AAAA,IAClG,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,OAAO,SAAA,EAAU;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,iBAAiB,QAAA,EAA0C;AAC/D,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,OAAA,GAAU,gBAAgB,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,EAAS,OAAO,IAAA;AAClC,IAAA,MAAM,EAAE,IAAI,OAAA,EAAQ,GAAI,MAAM,gBAAA,CAAiB,KAAA,EAAM,EAAG,OAAA,CAAQ,IAAA,EAAM;AAAA,MACpE,QAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AAGD,IAAA,OAAO,EAAA,GAAM,OAAA,EAAS,SAAA,IAAa,IAAA,GAAQ,IAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,oBAAoB,KAAA,EAA2E;AACnG,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,4BAAA,EAA8B;AAAA,MAChE,WAAA,EAAa,QAAA;AAAA,MACb,OAAA,EAAS,MAAM,KAAA,IAAS,IAAA;AAAA,MACxB,UAAA,EAAY,MAAM,QAAA,IAAY;AAAA,KAC/B,CAAA;AAED,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,yCAAA,EAA2C,MAAM,OAAO,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,aAAa,KAAA,EAAiD;AAMpE,IAAA,MAAM,eACJ,KAAA,CAAM,eAAA,KAAoB,MAAA,IAAa,KAAA,CAAM,iBAAiB,MAAA,GAC1D;AAAA,MACE,GAAI,MAAM,eAAA,KAAoB,MAAA,GAC1B,EAAE,gBAAA,EAAkB,KAAA,CAAM,eAAA,EAAgB,GAC1C,EAAC;AAAA,MACL,GAAI,MAAM,YAAA,KAAiB,MAAA,GAAY,EAAE,aAAA,EAAe,KAAA,CAAM,YAAA,EAAa,GAAI;AAAC,KAClF,GACA,IAAA;AACN,IAAA,MAAM,QAAA,GACJ,YAAA,IAAgB,KAAA,CAAM,QAAA,KAAa,SAC/B,EAAE,GAAI,KAAA,CAAM,QAAA,IAAY,EAAC,EAAI,GAAI,YAAA,IAAgB,IAAI,GACrD,MAAA;AAEN,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,MAIL,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC7B,YAAY,CAAA,CAAE,SAAA;AAAA,QACd,UAAA,EAAY,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,IAAK,MAAA;AAAA,QACnC,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,aAAA,EAAe,EAAE,YAAA,IAAgB,IAAA;AAAA;AAAA;AAAA,QAGjC,KAAA,EAAO,EAAE,KAAA,IAAS;AAAA,OACpB,CAAE,CAAA;AAAA,MACF,aAAA,EAAe,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,MACtC,eAAA,EAAiB,KAAA,CAAM,QAAA,EAAU,IAAA,IAAQ,IAAA;AAAA,MACzC,gBAAA,EAAkB,KAAA,CAAM,QAAA,EAAU,KAAA,IAAS,IAAA;AAAA,MAC3C,UAAA,EAAY,MAAM,QAAA,IAAY,KAAA;AAAA,MAC9B,eAAA,EAAiB,MAAM,YAAA,IAAgB,IAAA;AAAA,MACnC,gBAAA,EAAkB,MAAM,aAAA,IAAiB,CAAA;AAAA;AAAA;AAAA,MAG7C,kBAAA,EAAoB,MAAM,eAAA,GACtB;AAAA,QACF,WAAA,EAAa,MAAM,eAAA,CAAgB,UAAA;AAAA,QACnC,MAAA,EAAQ,MAAM,eAAA,CAAgB,MAAA;AAAA,QAC9B,MAAA,EAAQ,KAAA,CAAM,eAAA,CAAgB,MAAA,IAAU,IAAA;AAAA,QACxC,UAAA,EAAY,KAAA,CAAM,eAAA,CAAgB,UAAA,IAAc,IAAA;AAAA,QAChD,QAAA,EAAU,KAAA,CAAM,eAAA,CAAgB,QAAA,IAAY,IAAA;AAAA,QAC5C,IAAA,EAAM,MAAM,eAAA,CAAgB,IAAA;AAAA,QAC5B,KAAA,EAAO,MAAM,eAAA,CAAgB,KAAA;AAAA,QAC7B,OAAA,EAAS,KAAA,CAAM,eAAA,CAAgB,OAAA,IAAW,IAAA;AAAA,QAC1C,SAAA,EAAW,KAAA,CAAM,eAAA,CAAgB,SAAA,IAAa,IAAA;AAAA,QAC9C,KAAA,EAAO,KAAA,CAAM,eAAA,CAAgB,KAAA,IAAS,IAAA;AAAA,QACtC,KAAA,EAAO,KAAA,CAAM,eAAA,CAAgB,KAAA,IAAS,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKtC,QAAA,EAAU,KAAA,CAAM,eAAA,CAAgB,QAAA,IAAY;AAAA,OAC1C,GACA,IAAA;AAAA,MACJ,gBAAA,EAAkB,MAAM,aAAA,IAAiB,IAAA;AAAA,MACzC,OAAA,EAAS,MAAM,KAAA,IAAS,IAAA;AAAA;AAAA;AAAA;AAAA,MAIxB,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,UAAA,EAAY,QAAA,KAAa;AAAC,KAC3D;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,KAAA,EAAwC;AACvD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,WAAA,EAAY;AAC/C,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,sFAAsF,CAAA;AACrH,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,EAAA,CAAG,IAAI,kBAAA,EAAoB;AAAA,MACvD,WAAA,EAAa,QAAA;AAAA,MACb,GAAG,IAAA,CAAK,YAAA,CAAa,KAAK;AAAA,KAC3B,CAAA;AACD,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAS,QAAA,GAAW,OAAQ,IAAA,EAAM,EAAA,IAAM,MAAM,QAAA,IAAY,IAAA;AACjF,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,6DAA6D,CAAA;AACzF,IAAA,cAAA,CAAe,sBAAsB,KAAK,CAAA;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,oBAAoB,OAAA,EAAkD;AAC1E,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAM,CACjC,IAAA,CAAK,CAAA,CAAE,gBAAgB,EACvB,MAAA,CAAO,4EAA4E,EACnF,EAAA,CAAG,UAAA,EAAY,OAAO,CAAA,CACtB,EAAA,CAAG,QAAA,EAAU,MAAM,EACnB,EAAA,CAAG,YAAA,EAAA,iBAAc,IAAI,IAAA,IAAO,WAAA,EAAa,CAAA,CACzC,KAAA,CAAM,cAAc,EAAE,SAAA,EAAW,OAAO,CAAA,CACxC,MAAM,CAAC,CAAA;AAGV,IAAA,IAAI,KAAA,IAAS,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAO,IAAA;AAEnC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,OAAA,GAAW,GAAA,CAAI,cAAA,IAAkB,EAAC;AACxC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,GAAA,IAC7D,cAAA,CAAe,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA;AAIvD,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,MAAM,OAAO,IAAA;AAErC,IAAA,OAAO;AAAA,MACL,WAAW,GAAA,CAAI,EAAA;AAAA,MACf,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAC,CAAA;AAAA,MAC5B,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,IAAI,QAAA,IAAY,IAAA;AAAA,MAC1B,MAAA,EAAQ,IAAI,cAAA,IAAkB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM9B,YAAY,IAAA,IAAQ,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKpB,MAAA,EAAQ,QAAQ,MAAA,GACZ;AAAA,QACE,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AAAA,QAC1B,YAAA,EAAc,OAAO,OAAA,CAAQ,YAAA,IAAgB,EAAE,CAAA,CAAE,OAAA,CAAQ,2BAAA,EAA6B,EAAE,CAAA,IAAK,IAAA;AAAA,QAC7F,WAAW,MAAA,CAAO,OAAA,CAAQ,aAAa,EAAE,CAAA,CAAE,MAAK,IAAK,IAAA;AAAA,QACrD,SAAA,EAAW,IAAI,UAAA,IAAc;AAAA,OAC/B,GACA;AAAA,KACN;AAAA,EACF;AAAA,EAEA,MAAM,mBAAA,CACJ,OAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAC5F,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,IAAU,KAAA,CAAM,oBAAoB,SAAA,EAAW;AAClE,MAAA,MAAM,IAAI,MAAM,oDAA8C,CAAA;AAAA,IAChE;AAIA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,EAAe,IAAA,EAAK;AACxC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AACvD,IAAA,IAAI,UAAU,OAAO,QAAA;AAErB,IAAA,MAAM,UAAU,KAAA,CAAM,eAAA;AACtB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,mBAAA,CAAqB;AAAA;AAAA;AAAA,MAG9C,OAAO,KAAA,CAAM,KAAA,CACV,OAAO,CAAC,IAAA,KAAS,KAAK,SAAS,CAAA,CAC/B,IAAI,CAAC,IAAA,MAAU,EAAE,SAAA,EAAW,IAAA,CAAK,WAAqB,QAAA,EAAU,IAAA,CAAK,UAAS,CAAE,CAAA;AAAA,MACnF,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,CAAM,cAAc,KAAA,EAAM;AAAA,MAC5C,iBAAiB,OAAA,GACb;AAAA,QACE,UAAA,EAAY,QAAQ,WAAA,IAAe,EAAA;AAAA,QACnC,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,QAC1B,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,QACtB,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,QACxB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,OAAO,OAAA,CAAQ;AAAA,OACjB,GACA,MAAA;AAAA,MACJ,YAAA,EAAc,MAAM,YAAA,IAAgB,MAAA;AAAA,MACpC,eAAe,OAAA,EAAS,aAAA;AAAA,MACxB,WAAW,OAAA,EAAS,SAAA;AAAA,MACpB,QAAQ,OAAA,EAAS;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,4BAAA,EAA8B;AAAA,MAChE,cAAc,OAAA,CAAQ,SAAA;AAAA,MACtB,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,IAAI,KAAA,EAAO;AAKT,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CAClC,MAAA,CAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,cAAA,EAAgB,eAAe,CAAA,CAC7D,GAAG,IAAA,EAAM,OAAA,CAAQ,SAAS,CAAA,CAC1B,IAAA,CAAK,MAAA,EAAW,MAAM,MAAS,CAAA;AAClC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAQ,KAAA,CAA+B,OAAA,IAAW,EAAE,CAAA;AACjE,MAAA,IAAI,8BAA8B,IAAA,CAAK,IAAI,KAAK,oCAAA,CAAqC,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/F,QAAA,MAAM,IAAI,MAAM,+EAA4E,CAAA;AAAA,MAC9F;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAA,CAAY,OAAA,EAAiB,KAAA,EAAwC;AACzE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAIpC,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,IAAI,mBAAA,EAAqB;AAAA,MACvD,UAAA,EAAY,OAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,kBAAkB,IAAA,CAAK;AAAA,KACxB,CAAA;AACD,IAAA,IAAI,KAAA,EAAO;AAGT,MAAA,MAAM,IAAA,GAAO,MAAA,CAAQ,KAAA,CAA+B,OAAA,IAAW,EAAE,CAAA;AACjE,MAAA,IAAI,qBAAqB,IAAA,CAAK,IAAI,KAAK,oCAAA,CAAqC,IAAA,CAAK,IAAI,CAAA,EAAG;AACtF,QAAA,MAAM,IAAI,MAAM,kFAAyE,CAAA;AAAA,MAC3F;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAC1F,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,OAAA,EAAyD;AAC3E,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAChF,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAE5C,IAAA,KAAA,MAAW,MAAA,IAAU,sBAAsB,OAAA,EAAS,MAAM,GAAG,CAAA,GAAI,CAAA,CAAE,GAAG,MAAM,CAAA;AAC5E,IAAA,IAAI,SAAS,KAAA,EAAO,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,aAAa,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,YAAY,EAAA,EAA0C;AAC1D,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,GAAG,IAAA,EAAM,EAAE,EAAE,WAAA,EAAY;AAC7F,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,IAAA,GAAO,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA;AAAA,EACtC;AAAA,EAEA,MAAM,eAAe,KAAA,EAAmD;AACtE,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAChB,MAAA,CAAO;AAAA,MACN,WAAW,WAAA,EAAY;AAAA,MACvB,YAAY,KAAA,CAAM,SAAA;AAAA,MAClB,SAAA,EAAW,MAAM,QAAA,IAAY,EAAA;AAAA,MAC7B,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,MACtB,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,MACtB,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,MAC5B,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,KACvB,CAAA,CACA,MAAA,EAAO,CAAE,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,cAAA,CAAe,EAAA,EAAY,KAAA,EAAmD;AAClF,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAC9D,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AAC3D,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,KAAK,CAAA,CAAE,SAAS,EAAE,MAAA,CAAO,OAAO,EAAE,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CAAE,MAAA,GAAS,MAAA,EAAO;AACrG,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,eAAe,EAAA,EAA2B;AAC9C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AACtE,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA,EAIA,MAAM,gBAAgB,KAAA,EAAoD;AACxE,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,WAAA,EAAY;AAC/C,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,sDAAsD,CAAA;AACrF,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,EAAA,CAAG,IAAI,uBAAA,EAAyB;AAAA,MAC5D,WAAA,EAAa,QAAA;AAAA,MACb,SAAS,KAAA,CAAM,KAAA;AAAA,MACf,MAAA,EAAQ,MAAM,IAAA,IAAQ;AAAA,KACvB,CAAA;AACD,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAC5C,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAC3E,IAAA,OAAO,cAAc,GAAG,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,mBAAmB,KAAA,EAA6D;AACpF,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,8FAA8F,CAAA;AAC7H,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,EAAA,CAAG,IAAI,gCAAA,EAAkC;AAAA,MACrE,WAAA,EAAa,QAAA;AAAA;AAAA;AAAA,MAGb,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UAC/B,EAAA,EAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,SAAA;AAAA,UACpB,YAAY,IAAA,CAAK,SAAA;AAAA,UACjB,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,YAAY,IAAA,CAAK,SAAA;AAAA,UACjB,WAAA,EAAa,KAAK,UAAA,IAAc,IAAA;AAAA,UAChC,aAAA,EAAe,KAAK,YAAA,IAAgB;AAAA,SACtC,CAAE,CAAA;AAAA,QACF,cAAA,EAAgB,KAAK,aAAA,IAAiB,IAAA;AAAA,QACtC,MAAA,EAAQ,KAAK,MAAA,IAAU,IAAA;AAAA,QACvB,QAAA,EAAU,IAAA,CAAK,QAAA,GACX,EAAE,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,IAAS,IAAA,EAAM,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,IAAQ,IAAG,GACrE,IAAA;AAAA,QACJ,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS;AAAC;AACxB,KACD,CAAA;AACD,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,MAAM,OAAuC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAO,EAAC;AAC3E,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAuB;AACtC,MAAA,MAAM,IAAA,GAAQ,IAAI,IAAA,IAA0B,IAAA;AAC5C,MAAA,IAAI,GAAA,CAAI,WAAW,qBAAA,EAAuB;AACxC,QAAA,OAAO,EAAE,MAAA,EAAQ,qBAAA,EAAuB,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,EAAE;AAAA,MAClH;AACA,MAAA,IAAI,GAAA,CAAI,WAAW,aAAA,EAAe;AAChC,QAAA,OAAO,EAAE,MAAA,EAAQ,aAAA,EAAe,aAAa,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA,EAAG,IAAA,EAAM,SAAA,EAAW,MAAA,CAAO,IAAI,UAAU,CAAA,EAAG,UAAU,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,EAAE;AAAA,MACjJ;AACA,MAAA,OAAO,EAAE,MAAA,EAAQ,iBAAA,EAAmB,aAAa,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,IAAI,OAAO,CAAA,EAAG,QAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,EAAE;AAAA,IAC3I,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,OAAA,EAAqD;AACvE,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,OAAO,CAAA;AACjF,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,IAAI,SAAS,MAAA,EAAQ,CAAA,GAAI,EAAE,EAAA,CAAG,QAAA,EAAU,QAAQ,MAAM,CAAA;AACtD,IAAA,IAAI,SAAS,IAAA,EAAM,CAAA,GAAI,EAAE,EAAA,CAAG,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAChD,IAAA,IAAI,OAAA,EAAS,QAAQ,CAAA,GAAI,CAAA,CAAE,MAAM,OAAA,EAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAG,CAAA;AAC/D,IAAA,IAAI,SAAS,KAAA,EAAO,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,aAAa,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,YAAY,EAAA,EAAsC;AACtD,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,GAAG,IAAA,EAAM,EAAE,EAAE,WAAA,EAAY;AAC7F,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,IAAA,GAAO,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA;AAAA,EACtC;AAAA,EAEA,MAAM,eAAe,KAAA,EAA+C;AAClE,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAM,CACjC,IAAA,CAAK,CAAA,CAAE,SAAS,EAChB,MAAA,CAAO,EAAE,WAAW,WAAA,EAAY,EAAG,OAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,QAAQ,IAAA,EAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,QAAQ,KAAA,CAAM,MAAA,IAAU,MAAA,EAAQ,KAAA,EAAO,MAAM,KAAA,EAAO,WAAA,EAAa,MAAM,UAAA,IAAc,IAAA,EAAM,mBAAmB,KAAA,CAAM,eAAA,IAAmB,KAAA,EAAO,YAAA,EAAc,MAAM,WAAA,IAAe,IAAA,EAAM,UAAA,EAAY,KAAA,CAAM,aAAa,KAAA,EAAO,WAAA,EAAa,KAAA,CAAM,UAAA,IAAc,EAAC,EAAG,YAAA,EAAc,MAAM,WAAA,IAAe,IAAI,SAAA,EAAW,KAAA,CAAM,QAAA,IAAA,iBAAY,IAAI,MAAK,EAAE,WAAA,IAAe,OAAA,EAAS,KAAA,CAAM,UAAU,IAAA,EAAM,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,UAAU,UAAA,EAAY,CAAA,EAAG,CAAA,CACnhB,MAAA,GAAS,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,cAAA,CAAe,EAAA,EAAY,KAAA,EAA+C;AAC9E,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,UAAA;AAChE,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,eAAe,KAAA,CAAM,WAAA;AAClE,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAC9D,IAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,UAAA;AAChE,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,eAAe,KAAA,CAAM,WAAA;AAClE,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,UAAU,KAAA,CAAM,MAAA;AACxD,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,KAAK,CAAA,CAAE,SAAS,EAAE,MAAA,CAAO,OAAO,EAAE,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CAAE,MAAA,GAAS,MAAA,EAAO;AACrG,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,eAAe,EAAA,EAA2B;AAC9C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AACtE,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAA,GAA6C;AACjD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAClF,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,iBAAiB,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,mBAAmB,KAAA,EAAuD;AAC9E,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAM,CACjC,IAAA,CAAK,CAAA,CAAE,aAAa,EACpB,MAAA,CAAO,EAAE,WAAW,WAAA,EAAY,EAAG,MAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,KAAA,CAAM,OAAO,GAAA,EAAK,KAAA,CAAM,GAAA,IAAO,IAAA,EAAM,SAAS,KAAA,CAAM,OAAA,IAAW,IAAA,EAAM,QAAA,EAAU,MAAM,QAAA,IAAY,CAAA,EAAG,CAAA,CAChK,MAAA,GAAS,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,kBAAkB,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,kBAAA,CAAmB,EAAA,EAAY,KAAA,EAAuD;AAC1F,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,MAAA,EAAW,OAAA,CAAQ,MAAM,KAAA,CAAM,GAAA;AACjD,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,UAAU,KAAA,CAAM,OAAA;AACzD,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AAC3D,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,KAAK,CAAA,CAAE,aAAa,EAAE,MAAA,CAAO,OAAO,EAAE,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CAAE,MAAA,GAAS,MAAA,EAAO;AACzG,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,kBAAkB,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,mBAAmB,EAAA,EAA2B;AAClD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC1E,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,YAAY,MAAA,EAAgB;AAClC,IAAA,OAAO,kBAAA,CAAmB,QAAQ,yBAAyB,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,iBAAA,CAAkB,MAAA,EAAgB,OAAA,EAA6D;AACnG,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,eAAA,CAAgB,MAAA,EAAgB,EAAA,EAA0C;AAC9E,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,qBAAA,CAAsB,MAAA,EAAgB,IAAA,EAA4C;AACtF,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,CAAE,UAAU,IAAI,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,kBAAA,CAAmB,MAAA,EAAgB,KAAA,EAAiD;AACxF,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,kBAAA,CAAmB,MAAA,EAAgB,EAAA,EAAY,KAAA,EAA0D;AAC7G,IAAA,OAAO,KAAK,WAAA,CAAY,MAAM,CAAA,CAAE,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,kBAAA,CAAmB,MAAA,EAAgB,EAAA,EAA2B;AAClE,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAMF,MAAM,eAAA,GAAyC;AAC3C,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,IAAI,EAAA,CACL,IAAA,CAAK,CAAA,CAAE,WAAW,EAClB,MAAA,CAAO,CAAA,WAAA,EAAc,CAAA,CAAE,kBAAkB,wBAAwB,CAAA,CACjE,KAAA,CAAM,cAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1C,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,eAAe,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,cAAc,EAAA,EAAwC;AAC1D,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,KAAK,CAAA,CAAE,WAAW,EAClB,MAAA,CAAO,CAAA,WAAA,EAAc,EAAE,kBAAkB,CAAA,sBAAA,CAAwB,EACjE,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CACX,WAAA,EAAY;AACf,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,IAAA,GAAO,eAAA,CAAgB,IAAI,CAAA,GAAI,IAAA;AAAA,EACxC;AAAA,EAEA,MAAM,iBAAiB,KAAA,EAAmD;AACxE,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,GAC3B,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAClB,MAAA,CAAO;AAAA,MACN,SAAA,EAAW,QAAA;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA,EAAQ,MAAK,IAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,MACnD,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,MAClC,SAAA,EAAW,MAAM,QAAA,IAAY,IAAA;AAAA,MAC7B,SAAA,EAAW,MAAM,QAAA,IAAY,IAAA;AAAA,MAC7B,eAAA,EAAiB,MAAM,cAAA,IAAkB,IAAA;AAAA,MACzC,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,MAC9B,UAAA,EAAY,MAAM,SAAA,IAAa;AAAA,KAChC,CAAA,CACA,MAAA,EAAO,CAAE,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,MAAM,KAAK,sBAAA,CAAuB,IAAA,CAAK,EAAA,EAAI,QAAA,EAAU,MAAM,UAAU,CAAA;AACrE,IAAA,OAAQ,MAAM,IAAA,CAAK,aAAA,CAAc,KAAK,EAAE,CAAA,IAAM,gBAAgB,IAAI,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,gBAAA,CAAiB,EAAA,EAAY,KAAA,EAAmD;AACpF,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAK,IAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,IAAS,EAAE,CAAC,CAAA;AAC1G,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,WAAA;AACjE,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAA;AAC5D,IAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,kBAAkB,KAAA,CAAM,cAAA;AACxE,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,SAAA;AAC7D,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAE9D,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,GAAG,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC1E,MAAA,IAAI,OAAO,MAAM,KAAA;AAAA,IACnB;AAGA,IAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,MAAA,MAAM,KAAK,sBAAA,CAAuB,EAAA,EAAI,WAAA,EAAY,EAAG,MAAM,UAAU,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,sBAAsB,CAAA;AACpD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,EAAA,EAA2B;AAEhD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AACxE,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAM,kBAAA,GAA+C;AACnD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,IAAI,EAAA,CACL,IAAA,CAAK,CAAA,CAAE,cAAc,EACrB,MAAA,CAAO,CAAA,WAAA,EAAc,CAAA,CAAE,oBAAoB,eAAe,CAAA,CAC1D,KAAA,CAAM,QAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,kBAAkB,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,oBAAoB,KAAA,EAAyD;AACjF,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CACrB,MAAA,CAAO;AAAA,MACN,SAAA,EAAW,QAAA;AAAA,MACX,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,MAClC,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,KACvB,CAAA,CACA,MAAA,EAAO,CAAE,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,MAAM,KAAK,gBAAA,CAAiB,IAAA,CAAK,EAAA,EAAI,QAAA,EAAU,MAAM,WAAW,CAAA;AAChE,IAAA,OAAO,EAAE,GAAG,kBAAA,CAAmB,IAAI,GAAG,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,EAAC,EAAE;AAAA,EAC7E;AAAA,EAEA,MAAM,mBAAA,CAAoB,EAAA,EAAY,KAAA,EAAyD;AAC7F,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,WAAA;AACjE,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,MAAA,MAAM,EAAE,KAAA,EAAAA,MAAAA,EAAM,GAAI,MAAM,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,cAAc,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC7E,MAAA,IAAIA,QAAO,MAAMA,MAAAA;AAAA,IACnB;AAGA,IAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,MAAA,MAAM,KAAK,gBAAA,CAAiB,EAAA,EAAI,WAAA,EAAY,EAAG,MAAM,WAAW,CAAA;AAAA,IAClE;AACA,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,EAAA,CAC3B,IAAA,CAAK,EAAE,cAAc,CAAA,CACrB,OAAO,CAAA,WAAA,EAAc,CAAA,CAAE,oBAAoB,CAAA,aAAA,CAAe,CAAA,CAC1D,GAAG,IAAA,EAAM,EAAE,EAAE,MAAA,EAAO;AACvB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,mBAAmB,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,oBAAoB,EAAA,EAA2B;AAGnD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC3E,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAM,oBAAA,GAAmD;AACvD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AACjF,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,oBAAoB,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,sBAAsB,KAAA,EAA6D;AACvF,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CACvB,MAAA,CAAO,EAAE,SAAA,EAAW,WAAA,EAAY,EAAG,GAAG,cAAA,CAAe,KAAK,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA,CAC/E,MAAA,EAAO,CAAE,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,qBAAqB,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,qBAAA,CAAsB,EAAA,EAAY,KAAA,EAA6D;AACnG,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CAAE,OAAO,cAAA,CAAe,KAAK,CAAC,CAAA,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA,CAAE,MAAA,EAAO,CAAE,MAAA,EAAO;AACvF,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,qBAAqB,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,sBAAsB,EAAA,EAA2B;AACrD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AAC7E,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAM,aAAA,GAAqC;AACzC,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,OAAO,CAAA;AACjF,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,aAAa,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,eAAe,KAAA,EAA+C;AAClE,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,cAAc,CAAA,IAAK,CAAA;AAC/C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAChB,MAAA,CAAO;AAAA,MACN,WAAW,WAAA,EAAY;AAAA,MACvB,OAAO,KAAA,CAAM,IAAA,EAAM,MAAK,IAAK,oBAAA,IAAwB,WAAA,EAAY;AAAA,MACjE,eAAA,EAAiB,MAAA;AAAA;AAAA;AAAA,MAGjB,OAAA,EAAS,MAAA;AAAA,MACT,QAAA,EAAU,MAAM,QAAA,IAAY,KAAA;AAAA,MAC5B,MAAA,EAAQ,MAAM,MAAA,IAAU,QAAA;AAAA,MACxB,UAAA,EAAY,MAAM,SAAA,IAAa,IAAA;AAAA,MAC/B,WAAA,EAAa,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,MACpC,cAAA,EAAgB,MAAM,aAAA,IAAiB,IAAA;AAAA,MACvC,IAAA,EAAM,MAAM,IAAA,IAAQ;AAAA,KACrB,CAAA,CACA,MAAA,EAAO,CAAE,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,cAAA,CAAe,EAAA,EAAY,KAAA,EAA+C;AAC9E,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY;AAC3E,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,UAAU,KAAA,CAAM,OAAA;AACzD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,aAAa,KAAA,CAAM,SAAA;AAC9D,IAAA,IAAI,MAAM,UAAA,KAAe,MAAA,UAAmB,WAAA,GAAc,MAAA,CAAO,MAAM,UAAU,CAAA;AACjF,IAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,MAAA,EAAW,OAAA,CAAQ,iBAAiB,KAAA,CAAM,aAAA;AACtE,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CAAE,KAAK,CAAA,CAAE,SAAS,EAAE,MAAA,CAAO,OAAO,EAAE,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CAAE,MAAA,GAAS,MAAA,EAAO;AACrG,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,eAAe,EAAA,EAA2B;AAC9C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,MAAM,EAAE,CAAA;AACtE,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAM,kBAAA,GAA+C;AACnD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAI7B,IAAA,IAAI,IAAI,EAAA,CAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,EAAE,MAAA,CAAO,GAAG,CAAA,CAC3C,IAAA,CAAK,aAAa,CAAA,EAAG,iBAAiB,GAAG,CAAA,CACzC,EAAA,CAAG,WAAW,aAAa,CAAA;AAC9B,IAAA,IAAI,QAAA,EAAU,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ,CAAA;AAC5C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,kBAAkB,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,oBAAoB,KAAA,EAAyD;AACjF,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,WAAW,WAAA,EAAY;AAAA,MACvB,SAAA,EAAW,CAAA,EAAG,iBAAiB,CAAA,EAAG,MAAM,KAAK,CAAA,CAAA;AAAA,MAC7C,OAAA,EAAS;AAAA,KACX;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,UAAU,KAAA,CAAM,OAAA;AACzD,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,UAAU,KAAA,CAAM,OAAA;AACzD,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AAGnD,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM,CACjC,KAAK,CAAA,CAAE,gBAAgB,EACvB,MAAA,CAAO,OAAA,EAAS,EAAE,UAAA,EAAY,6BAAA,EAA+B,CAAA,CAC7D,MAAA,GAAS,MAAA,EAAO;AACnB,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,OAAO,mBAAmB,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,cAAA,GAAuC;AAC3C,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAOvB,IAAA,MAAM,CAAC,QAAA,EAAU,OAAO,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC5C,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAAA,MAC/B,IAAA,CAAK,iBAAiB,QAAQ;AAAA,KAC/B,CAAA;AACD,IAAA,OAAO,eAAA,CAAgB,UAAU,OAAO,CAAA;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAc,kBAAkB,QAAA,EAAwC;AACtE,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,EAAA,CACjC,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA,CACpB,MAAA,CAAO,6DAA6D,EACpE,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CACxC,KAAA,CAAM,GAAI,CAAA;AACb,IAAA,IAAI,KAAA,IAAS,CAAC,IAAA,EAAM,MAAA,SAAe,EAAC;AAIpC,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,IAAI,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,UAAU,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA;AAClF,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,MAAM,EAAA,CAC9B,IAAA,CAAK,CAAA,CAAE,QAAQ,EAAE,MAAA,CAAO,SAAS,CAAA,CAAE,EAAA,CAAG,MAAM,UAAU,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAA,CAAqB,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAEzF,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KACf,uBAAA,CAAwB,UAAA,CAAW,GAAG,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,UAAU,CAAC,CAAC,CAAA;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAc,iBAAiB,QAAA,EAAwC;AACrE,IAAA,MAAM,SAAS,KAAA,EAAM,CAAE,OAAA,CAAQ,IAAA,CAAK,EAAE,WAAW,CAAA;AAMjD,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,KAA8D;AAClF,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,MAAA,CAAO,KAAK,MAAA,EAAQ;AAAA,QAChD,KAAA,EAAO,GAAA;AAAA,QACP,MAAA,EAAQ,EAAE,MAAA,EAAQ,YAAA,EAAc,OAAO,MAAA;AAAO,OAC/C,CAAA;AACD,MAAA,IAAI,KAAA,SAAc,EAAC;AACnB,MAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,KAAA,MAAgB,EAAE,MAAA,EAAQ,KAAA,EAAM,CAAE,CAAA;AAAA,IAC7D,CAAA;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,QAAQ,CAAA;AAGjC,IAAA,MAAM,OAAA,GAAU,GAAA,CACb,MAAA,CAAO,CAAC,EAAE,OAAM,KAAM,CAAC,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM,IAAA,KAAS,cAAc,CAAA,CAChE,GAAA,CAAI,CAAC,EAAE,KAAA,EAAM,KAAM,GAAG,QAAQ,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AACjD,IAAA,MAAM,MAAA,GAAA,CAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAA,CAAI,MAAM,CAAC,CAAA,EAAG,IAAA,EAAK;AAE7D,IAAA,OAAO,CAAC,GAAG,GAAA,EAAK,GAAG,MAAM,CAAA,CACtB,OAAO,CAAC,EAAE,OAAM,KAAM,KAAA,CAAM,EAAE,CAAA,CAC9B,GAAA,CAAI,CAAC,EAAE,MAAA,EAAQ,OAAM,KAAM;AAC1B,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,CAAA;AACpC,MAAA,MAAM,EAAE,MAAM,EAAE,SAAA,IAAY,GAAI,MAAA,CAAO,aAAa,IAAI,CAAA;AACxD,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AACrC,MAAA,MAAM,IAAA,GAAkB;AAAA,QACtB,EAAA,EAAI,IAAA;AAAA,QACJ,IAAA;AAAA,QACA,GAAA,EAAK,SAAA;AAAA,QACL,MAAM,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,UAAU,QAAQ,CAAA;AAAA,QACtD,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,QACtC,SAAA,EAAA,CAAY,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA,EAAI,WAAA,EAAY;AAAA,QAC3D,SAAA,EAAW,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,UAAA,IAAc;AAAA,OACrD;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAAmC;AACvD,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAGjF,IAAA,MAAM,IAAA,GAAO,MAAM,sBAAA,CAAuB,OAAO,CAAA;AAGjD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AACrE,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,EAAE,WAAW,CAAA;AAC5C,IAAA,MAAM,EAAE,OAAM,GAAI,MAAM,OAAO,MAAA,CAAO,IAAA,EAAM,MAAM,gBAAgB,CAAA;AAClE,IAAA,IAAI,OAAO,MAAM,KAAA;AACjB,IAAA,MAAM,EAAE,MAAM,EAAE,SAAA,IAAY,GAAI,MAAA,CAAO,aAAa,IAAI,CAAA;AACxD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA,EAAK,SAAA;AAAA,MACL,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,MACtC,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAA,CAAY,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA,EAAI,WAAA,EAAY;AAAA,MAC1D,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,EAAA,EAA2B;AAC/C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAM,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA;AACvE,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEF,MAAc,sBAAA,CACV,YAAA,EACA,QAAA,EACA,UAAA,EACe;AACf,IAAA,IAAI,eAAe,MAAA,EAAW;AAC9B,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAM,EAAA,CAC7B,IAAA,CAAK,CAAA,CAAE,kBAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,iBAAiB,YAAY,CAAA;AACvE,IAAA,IAAI,QAAQ,MAAM,MAAA;AAClB,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,CAAC,WAAW,QAAA,MAAc;AAAA,MACpD,aAAA,EAAe,YAAA;AAAA,MAAc,UAAA,EAAY,SAAA;AAAA,MAAW,SAAA,EAAW,QAAA;AAAA,MAAU;AAAA,KAC3E,CAAE,CAAA;AACF,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,EAAA,CAAG,KAAK,CAAA,CAAE,kBAAkB,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AACjE,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AAAA,EAEA,MAAc,gBAAA,CACZ,OAAA,EACA,QAAA,EACA,WAAA,EACe;AACf,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC/B,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAM,EAAA,CAC7B,IAAA,CAAK,CAAA,CAAE,oBAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,EAAA,CAAG,YAAY,OAAO,CAAA;AAC/D,IAAA,IAAI,QAAQ,MAAM,MAAA;AAClB,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,MAAgB;AAAA,MAC5C,QAAA,EAAU,OAAA;AAAA,MAAS,WAAA,EAAa,UAAA;AAAA,MAAY,SAAA,EAAW;AAAA,KACzD,CAAE,CAAA;AACF,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,EAAA,CAAG,KAAK,CAAA,CAAE,oBAAoB,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AACnE,IAAA,IAAI,OAAO,MAAM,KAAA;AAAA,EACnB;AACF;AAEO,SAAS,0BAAA,GAA2C;AACzD,EAAA,OAAO,IAAI,oBAAA,EAAqB;AAClC;;;ACnoGA,IAAM,QAAA,uBAAe,GAAA,EAAmC;AAEjD,SAAS,8BAA8B,QAAA,EAAuC;AACnF,EAAA,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAA;AACpC;AAEO,SAAS,0BAAA,GAAsD;AACpE,EAAA,OAAO,CAAC,GAAG,QAAA,CAAS,MAAA,EAAQ,CAAA;AAC9B;AAIO,SAAS,2BAAA,GAAoC;AAClD,EAAA,QAAA,CAAS,KAAA,EAAM;AACjB;AAqBO,SAAS,6BACd,OAAA,EAC8B;AAC9B,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,OAAA;AAGjC,EAAA,IAAI,SAAA,KAAc,IAAI,OAAO,IAAA;AAE7B,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAGrC,IAAA,OAAO,MAAA,IAAU,SAAA,CAAU,QAAA,CAAS,SAAS,IAAI,MAAA,GAAS,IAAA;AAAA,EAC5D;AAEA,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,IAAA;AACT;;;AC7EO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAC7B,MAAA,CAAO,SAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE;AAGvC,SAAS,UAAA,CAAW,QAAgB,OAAA,EAAoC;AACtE,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAK,MAAA,EAAQ,KAAA,KAAU,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA,GAAI,QAAQ,CAAC,CAAA;AAC1F,EAAA,MAAM,OAAO,GAAA,GAAM,EAAA;AACnB,EAAA,OAAO,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,IAAA;AAC7B;AAEA,IAAM,SAAA,GAAY,CAAC,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC7C,IAAM,UAAA,GAAa,CAAC,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAClD,IAAM,UAAA,GAAa,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACtD,IAAM,WAAA,GAAc,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAEnD,SAAS,WAAW,KAAA,EAA2C;AACpE,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AAGnC,EAAA,IAAI,OAAO,MAAA,KAAW,EAAA,IAAM,eAAe,IAAA,CAAK,MAAM,GAAG,OAAO,KAAA;AAChE,EAAA,OACE,WAAW,MAAA,EAAQ,SAAS,CAAA,KAAM,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA,IAClD,UAAA,CAAW,QAAQ,UAAU,CAAA,KAAM,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAExD;AAEO,SAAS,YAAY,KAAA,EAA2C;AACrE,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,EAAA,IAAI,OAAO,MAAA,KAAW,EAAA,IAAM,eAAe,IAAA,CAAK,MAAM,GAAG,OAAO,KAAA;AAChE,EAAA,OACE,WAAW,MAAA,EAAQ,UAAU,CAAA,KAAM,MAAA,CAAO,OAAO,EAAE,CAAC,CAAA,IACpD,UAAA,CAAW,QAAQ,WAAW,CAAA,KAAM,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAEzD;AAGO,SAAS,aAAa,KAAA,EAAuD;AAClF,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAK,CAAA,CAAE,MAAA;AACrC,EAAA,IAAI,MAAA,KAAW,IAAI,OAAO,KAAA;AAC1B,EAAA,IAAI,MAAA,KAAW,IAAI,OAAO,MAAA;AAC1B,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,gBAAgB,KAAA,EAA2C;AACzE,EAAA,MAAM,IAAA,GAAO,aAAa,KAAK,CAAA;AAC/B,EAAA,OAAO,IAAA,KAAS,QAAQ,UAAA,CAAW,KAAK,IAAI,IAAA,KAAS,MAAA,GAAS,WAAA,CAAY,KAAK,CAAA,GAAI,KAAA;AACrF;AAMO,SAAS,eAAe,KAAA,EAA0C;AACvE,EAAA,MAAM,SAAS,cAAA,CAAe,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAChD,EAAA,IAAI,MAAA,CAAO,UAAU,EAAA,EAAI;AACvB,IAAA,OAAO,MAAA,CACJ,OAAA,CAAQ,cAAA,EAAgB,OAAO,CAAA,CAC/B,OAAA,CAAQ,uBAAA,EAAyB,UAAU,CAAA,CAC3C,OAAA,CAAQ,qBAAA,EAAuB,QAAQ,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA,CACJ,OAAA,CAAQ,cAAA,EAAgB,OAAO,EAC/B,OAAA,CAAQ,uBAAA,EAAyB,UAAU,CAAA,CAC3C,QAAQ,eAAA,EAAiB,QAAQ,CAAA,CACjC,OAAA,CAAQ,qBAAqB,OAAO,CAAA;AACzC;;;ACxCO,IAAM,kBAAA,GAAqB;AAAA,EAChC,gBAAA;AAAA,EAAkB,mBAAA;AAAA,EAAqB,kBAAA;AAAA,EAAoB,iBAAA;AAAA,EAC3D,iBAAA;AAAA,EAAmB,mBAAA;AAAA,EAAqB;AAC1C;AAEO,IAAM,iBAAA,GAAqC;AAAA,EAChD;AAAA,IACE,KAAA,EAAO,oBAAA;AAAA,IAAsB,IAAA,EAAM,eAAA;AAAA,IAAiB,IAAA,EAAM,aAAA;AAAA,IAC1D,KAAA,EAAO,6BAAA;AAAA,IACP,WAAA,EAAa,2CAAA;AAAA,IACb,OAAA,EAAS,kCAAA;AAAA,IACT,cAAA,EAAgB,qCAAA;AAAA,IAChB,WAAA,EACE,8JAAA;AAAA,IACF,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA;AAAA,IACE,KAAA,EAAO,YAAA;AAAA,IAAc,IAAA,EAAM,eAAA;AAAA,IAAiB,IAAA,EAAM,YAAA;AAAA,IAClD,KAAA,EAAO,oBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,OAAA,EAAS,kCAAA;AAAA,IACT,cAAA,EAAgB,oDAAA;AAAA,IAChB,WAAA,EACE,oJAAA;AAAA,IACF,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA;AAAA,IACE,KAAA,EAAO,eAAA;AAAA,IAAiB,IAAA,EAAM,eAAA;AAAA,IAAiB,IAAA,EAAM,OAAA;AAAA,IACrD,KAAA,EAAO,gBAAA;AAAA,IACP,WAAA,EAAa,0DAAA;AAAA,IACb,OAAA,EAAS,4CAAA;AAAA,IACT,cAAA,EAAgB,uDAAA;AAAA,IAChB,WAAA,EACE,+HAAA;AAAA,IACF,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA;AAAA,IACE,KAAA,EAAO,iBAAA;AAAA,IAAmB,IAAA,EAAM,eAAA;AAAA,IAAiB,IAAA,EAAM,cAAA;AAAA,IACvD,KAAA,EAAO,iBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,OAAA,EAAS,iDAAA;AAAA,IACT,cAAA,EAAgB,4CAAA;AAAA,IAChB,WAAA,EACE,gHAAA;AAAA,IACF,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA;AAAA,IACE,KAAA,EAAO,iBAAA;AAAA,IAAmB,IAAA,EAAM,eAAA;AAAA,IAAiB,IAAA,EAAM,SAAA;AAAA,IACvD,KAAA,EAAO,kBAAA;AAAA,IACP,WAAA,EAAa,yCAAA;AAAA,IACb,OAAA,EAAS,gCAAA;AAAA,IACT,cAAA,EAAgB,oCAAA;AAAA,IAChB,WAAA,EACE,gJAAA;AAAA,IACF,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA;AAAA,IACE,KAAA,EAAO,qBAAA;AAAA,IAAuB,IAAA,EAAM,eAAA;AAAA,IAAiB,IAAA,EAAM,WAAA;AAAA,IAC3D,KAAA,EAAO,sBAAA;AAAA,IACP,WAAA,EAAa,6CAAA;AAAA,IACb,OAAA,EAAS,mCAAA;AAAA,IACT,cAAA,EAAgB,mDAAA;AAAA,IAChB,WAAA,EACE,uKAAA;AAAA,IACF,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA;AAAA,IACE,KAAA,EAAO,kBAAA;AAAA,IAAoB,IAAA,EAAM,eAAA;AAAA,IAAiB,IAAA,EAAM,MAAA;AAAA,IACxD,KAAA,EAAO,aAAA;AAAA,IACP,WAAA,EAAa,8CAAA;AAAA,IACb,OAAA,EAAS,8BAAA;AAAA,IACT,cAAA,EAAgB,kCAAA;AAAA,IAChB,WAAA,EACE,0GAAA;AAAA,IACF,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IAAkB,IAAA,EAAM,WAAA;AAAA,IAAa,IAAA,EAAM,cAAA;AAAA,IAClD,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,gEAAA;AAAA,IACb,OAAA,EAAS,uCAAA;AAAA,IACT,cAAA,EAAgB,2CAAA;AAAA,IAChB,WAAA,EACE,wGAAA;AAAA,IACF,cAAA,EAAgB;AAAA;AAEpB;AAUO,SAAS,mBAAA,CAAoB,MAAc,MAAA,EAAwC;AACxF,EAAA,OAAO,IAAA,CAAK,QAAQ,sBAAA,EAAwB,CAAC,OAAO,GAAA,KAAgB,MAAA,CAAO,GAAG,CAAA,IAAK,KAAK,CAAA;AAC1F;AAGO,IAAM,oBAAA,GAA+C;AAAA,EAC1D,UAAA,EAAY,UAAA;AAAA,EACZ,aAAA,EAAe,aAAA;AAAA,EACf,YAAA,EAAc,MAAA;AAAA,EACd,WAAA,EAAa,WAAA;AAAA,EACb,WAAA,EAAa,uFAAA;AAAA,EACb,aAAA,EAAe,eAAA;AAAA,EACf,QAAA,EAAU;AACZ;AAkBO,SAAS,sBAAsB,SAAA,EAAqD;AACzF,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAC,CAAC,CAAC,CAAA;AAC1D,EAAA,OAAO,iBAAA,CAAkB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACpC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA;AAC3C,IAAA,OAAO;AAAA,MACL,GAAG,GAAA;AAAA,MACH,QAAA;AAAA,MACA,OAAA,EAAS,QAAA,EAAU,OAAA,IAAW,GAAA,CAAI,cAAA;AAAA,MAClC,OAAA,EAAS,QAAA,EAAU,OAAA,IAAW,GAAA,CAAI,cAAA;AAAA,MAClC,IAAA,EAAM,QAAA,EAAU,IAAA,IAAQ,GAAA,CAAI,WAAA;AAAA,MAC5B,UAAA,EAAY,OAAA,CAAQ,QAAA,EAAU,OAAA,IAAW,UAAU,IAAI;AAAA,KACzD;AAAA,EACF,CAAC,CAAA;AACH;;;AC7JA,IAAM,YAAA,GAA6B;AAAA,EACjC,EAAE,MAAM,cAAA,EAAgB,KAAA,EAAO,uBAAoB,IAAA,EAAM,QAAA,EAAU,SAAS,MAAA,EAAO;AAAA,EACnF,EAAE,MAAM,aAAA,EAAe,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,SAAS,WAAA,EAAY;AAAA,EAC3E,EAAE,MAAM,aAAA,EAAe,KAAA,EAAO,SAAS,IAAA,EAAM,QAAA,EAAU,SAAS,uFAAA,EAAqE;AAAA,EACrI,EAAE,MAAM,eAAA,EAAiB,KAAA,EAAO,WAAW,IAAA,EAAM,QAAA,EAAU,SAAS,aAAA,EAAc;AAAA;AAAA;AAAA,EAGlF,EAAE,MAAM,gBAAA,EAAkB,KAAA,EAAO,qBAAqB,IAAA,EAAM,QAAA,EAAU,SAAS,mBAAA,EAAoB;AAAA,EACnG,EAAE,MAAM,gBAAA,EAAkB,KAAA,EAAO,uBAAuB,IAAA,EAAM,QAAA,EAAU,SAAS,iBAAA,EAAkB;AAAA;AAAA;AAAA,EAGnG,EAAE,MAAM,YAAA,EAAc,KAAA,EAAO,QAAQ,IAAA,EAAM,QAAA,EAAU,SAAS,UAAA;AAChE,CAAA;AAEA,IAAM,cAAA,GAA6B;AAAA,EACjC,IAAA,EAAM,eAAA;AAAA,EAAiB,KAAA,EAAO,uBAAA;AAAA,EAAsB,IAAA,EAAM,QAAA;AAAA,EAAU,OAAA,EAAS;AAC/E,CAAA;AACA,IAAM,UAAA,GAAyB;AAAA,EAC7B,IAAA,EAAM,UAAA;AAAA,EAAY,KAAA,EAAO,kBAAA;AAAA,EAAoB,IAAA,EAAM,KAAA;AAAA,EAAO,OAAA,EAAS;AACrE,CAAA;AAGA,IAAM,eAAA,GAAgD;AAAA,EACpD,aAAA,EAAe,CAAC,GAAG,YAAA,EAAc,cAAc,CAAA;AAAA,EAC/C,eAAA,EAAiB,CAAC,GAAG,YAAA,EAAc,cAAc,CAAA;AAAA,EACjD,cAAA,EAAgB,CAAC,GAAG,YAAA,EAAc,UAAU;AAC9C,CAAA;AAMA,IAAM,WAAA,mBAAc,IAAI,GAAA,CAAI,CAAC,gBAAgB,CAAC,CAAA;AAEvC,SAAS,qBAAA,GAAiD;AAC/D,EAAA,OAAO,iBAAA,CAAkB,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACrC,IAAA,EAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,KAAK,CAAA,CAAA;AAAA,IACvB,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,IAAK,YAAA;AAAA,IACtC,KAAA,EAAO,CAAC,WAAA,CAAY,GAAA,CAAI,IAAI,KAAK;AAAA,GACnC,CAAE,CAAA;AACJ;AAGA,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,oBAAA,EAAsB,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAGzF,IAAM,aAAA,GAAwC;AAAA,EAC5C,kBAAA,EACE,gTAAA;AAAA,EACF,aAAA,EACE,+RAAA;AAAA,EACF,cAAA,EACE;AACJ,CAAA;AAEO,SAAS,wBAAA,GAAiD;AAC/D,EAAA,OAAO,iBAAA,CAAkB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACpC,IAAA,MAAM,QAAA,GAAW,gBAAgB,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA;AAC7E,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,CAAA,KAAA,EAAQ,GAAA,CAAI,KAAK,CAAA,CAAA;AAAA,MAC3B,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,QAAA,EAAU,WAAY,CAAC,OAAA,EAAS,UAAU,CAAA,CAAY,KAAA,EAAM,GAAI,CAAC,OAAgB,CAAA;AAAA,MACjF,QAAA,EAAU;AAAA,QACR,OAAO,EAAE,OAAA,EAAS,IAAI,cAAA,EAAgB,IAAA,EAAM,IAAI,WAAA,EAAY;AAAA,QAC5D,GAAI,WAAW,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE,GAAI;AAAC,OACrD;AAAA;AAAA;AAAA;AAAA,MAIA,cAAA,EAAgB,EAAE,KAAA,EAAO,GAAA,CAAI,cAAA;AAAe,KAC9C;AAAA,EACF,CAAC,CAAA;AACH;;;AC/DO,IAAM,mBAAA,GAAyC,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC;AAEpG,IAAM,aAAA,GAAgB,iGAAA;AAGf,SAAS,kBAAkB,GAAA,EAAyC;AACzE,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,aAAA,CAAc,KAAK,GAAG,CAAA;AAC1D;AAOO,SAAS,eAAA,CAAgB,GAAA,EAAa,OAAA,GAA+B,EAAC,EAAW;AACtF,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA;AACpC,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA;AACnB,EAAA,MAAM,GAAG,WAAA,EAAa,UAAU,CAAA,GAAI,KAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AACxE,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAC,CAAA;AAQ3E,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,KAAW,QAAQ,KAAA,IAAS,OAAA,CAAQ,SAAS,MAAA,GAAY,SAAA,CAAA;AAChF,EAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AACvC,EAAA,MAAA,CAAO,GAAA,CAAI,WAAW,MAAA,CAAO,YAAA,CAAa,QAAQ,OAAA,IAAW,EAAE,CAAC,CAAC,CAAA;AACjE,EAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACvD,EAAA,OAAO,GAAG,WAAW,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AAC9E;AAOO,SAAS,YACd,GAAA,EACA,MAAA,GAA4B,mBAAA,EAC5B,OAAA,GAA8C,EAAC,EAC3B;AACpB,EAAA,IAAI,CAAC,iBAAA,CAAkB,GAAG,CAAA,EAAG,OAAO,MAAA;AACpC,EAAA,OAAO,OAAO,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,eAAA,CAAgB,KAAK,EAAE,GAAG,SAAS,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC/F;AAEA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAClD","file":"index.js","sourcesContent":["import { getShopProvider } from './runtime'\nimport type { ShopProvider } from '../data/provider'\nimport type {\n CartTotals, DiscountValidation, InventoryCheck, InventoryIssue, InventoryLine, Order,\n} from '../types'\n\n// ---------------------------------------------------------------------------\n// Commerce primitive APIs (FAY-1193)\n//\n// Provider-agnostic helpers that custom app workflows call instead of re-deriving\n// discount/inventory/total logic. They take an explicit ShopProvider (default:\n// the configured runtime provider) so they work the same against mock or Supabase.\n//\n// NOTE: when run in the browser these compute the *advisory* answer (UI preview).\n// The authoritative values are recomputed server-side in the shop_place_order RPC\n// — the browser can never set what it pays.\n// ---------------------------------------------------------------------------\n\nfunction round2(n: number): number {\n return Math.round(n * 100) / 100\n}\n\n/** Validate a discount code against the provider: existence, status, date window, usage limit, supported type. */\nexport async function validateDiscount(\n input: { code: string; subtotal?: number; customerId?: string },\n provider: ShopProvider = getShopProvider(),\n): Promise<DiscountValidation> {\n const code = input.code.trim()\n if (!code) return { valid: false, code: null, type: null, value: 0, reason: 'empty' }\n\n // A porta certa primeiro: valida UM código no servidor. A listagem abaixo\n // continua para provider que não a tem (mock, broker), mas ela não serve à\n // vitrine — `anon` não pode ler a tabela, e se pudesse levaria todos os\n // cupons da loja para o navegador.\n if (typeof provider.validateDiscountCode === 'function') {\n return await provider.validateDiscountCode(code, input.subtotal)\n }\n\n const list = await provider.listDiscounts({ status: 'active' })\n const discount = list.find((d) => (d.code ?? '').toUpperCase() === code.toUpperCase())\n if (!discount) return { valid: false, code: null, type: null, value: 0, reason: 'not_found' }\n\n const now = new Date().toISOString()\n if (discount.startsAt > now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'not_started' }\n if (discount.endsAt && discount.endsAt < now) return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'expired' }\n if (discount.usageLimit != null && discount.timesUsed >= discount.usageLimit) {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'usage_limit' }\n }\n // Same gate shop_validate_discount applies (0057), so mock mode and the live\n // store refuse the same cart for the same reason.\n if (discount.minSubtotal != null && (input.subtotal ?? 0) < discount.minSubtotal) {\n return {\n valid: false, code: discount.code, type: discount.type, value: 0,\n reason: 'min_subtotal', minSubtotal: discount.minSubtotal,\n }\n }\n // free_shipping carries no monetary value — the cart zeroes freight by type,\n // and echoing the row's `value` here would discount the subtotal twice.\n if (discount.type === 'free_shipping') {\n return { valid: true, code: discount.code, type: discount.type, value: 0 }\n }\n if (discount.type !== 'percentage' && discount.type !== 'fixed_amount') {\n return { valid: false, code: discount.code, type: discount.type, value: 0, reason: 'unsupported' }\n }\n return { valid: true, code: discount.code, type: discount.type, value: discount.value }\n}\n\n/** Apply a validated discount to a subtotal, clamped to [0, subtotal]. Pure. */\nexport function applyDiscount(validation: DiscountValidation, subtotal: number): { discountTotal: number; code: string | null } {\n if (!validation.valid) return { discountTotal: 0, code: null }\n if (validation.type === 'percentage') {\n return { discountTotal: round2(Math.min(subtotal, (subtotal * validation.value) / 100)), code: validation.code }\n }\n if (validation.type === 'fixed_amount') {\n return { discountTotal: round2(Math.min(subtotal, validation.value)), code: validation.code }\n }\n return { discountTotal: 0, code: validation.code }\n}\n\n/** Report out-of-stock / unavailable lines against current catalog inventory. No mutation. */\nexport async function checkInventory(\n lines: InventoryLine[],\n provider: ShopProvider = getShopProvider(),\n): Promise<InventoryCheck> {\n const issues: InventoryIssue[] = []\n for (const line of lines) {\n const product = await provider.getProduct(line.productId)\n if (!product || product.status !== 'active') {\n issues.push({ productId: line.productId, name: product?.name ?? line.productId, requested: line.quantity, available: 0 })\n continue\n }\n if (product.inventoryCount < line.quantity) {\n issues.push({ productId: line.productId, name: product.name, requested: line.quantity, available: product.inventoryCount })\n }\n }\n return { ok: issues.length === 0, issues }\n}\n\n/**\n * Recompute cart totals from authoritative catalog prices (ignores any client\n * unitPrice), applying a validated discount and shipping. Tax is 0 in v1 (hook).\n */\nexport async function computeCartTotals(\n input: { lines: InventoryLine[]; discountCode?: string; customerId?: string; shipping?: number },\n provider: ShopProvider = getShopProvider(),\n): Promise<CartTotals> {\n const lines: CartTotals['lines'] = []\n let subtotal = 0\n for (const line of input.lines) {\n const product = await provider.getProduct(line.productId)\n if (!product) continue\n const lineTotal = round2(product.price * line.quantity)\n subtotal += lineTotal\n lines.push({ productId: product.id, name: product.name, sku: product.sku, unitPrice: product.price, quantity: line.quantity, lineTotal })\n }\n subtotal = round2(subtotal)\n\n let discountTotal = 0\n let discountCode: string | null = null\n if (input.discountCode) {\n const applied = applyDiscount(\n await validateDiscount({ code: input.discountCode, subtotal, customerId: input.customerId }, provider),\n subtotal,\n )\n discountTotal = applied.discountTotal\n discountCode = applied.code\n }\n\n const shippingTotal = round2(Math.max(input.shipping ?? 0, 0))\n const taxTotal = 0\n const total = round2(Math.max(subtotal - discountTotal + shippingTotal + taxTotal, 0))\n return { lines, subtotal, discountTotal, discountCode, taxTotal, shippingTotal, total }\n}\n\n/** A customer's orders (scoped by id; RLS-enforced to the owner on Supabase). */\nexport async function getCustomerOrders(\n customerId: string,\n provider: ShopProvider = getShopProvider(),\n): Promise<Order[]> {\n return provider.listOrders({ customerId, limit: 100 })\n}\n","// ---------------------------------------------------------------------------\n// Optimisation at upload, in the browser, before a photo reaches storage.\n//\n// A merchant uploads what the camera gave her: a 4000×3000 JPEG of 6 MB. The\n// storefront serves variants of it (see ./image-delivery), so the ORIGINAL is\n// only ever the source for renders — and there is no reason for that source\n// to be six megabytes when a 2000-pixel WebP is visually the same and a tenth\n// of the size: it uploads faster on a café connection, it stores cheaper, and\n// the renderer resizes from something sane.\n//\n// Pure decision (`planUpload`) separated from the browser work\n// (`optimizeImageForUpload`), so the rule is testable without a canvas.\n// Anything this cannot or should not touch — a GIF (animation), an SVG, a\n// file that is already within bounds and small, an environment without\n// canvas — passes through untouched. Never worse than before.\n// ---------------------------------------------------------------------------\n\nexport interface OptimizeUploadOptions {\n /** The longest edge a source needs. 2000 px covers every slot the storefront draws, at 2×. */\n maxEdge?: number\n /** WebP quality, 0–1. */\n quality?: number\n /** Files at most this many bytes AND within bounds are kept as they are. */\n keepUnderBytes?: number\n}\n\nexport interface UploadPlan {\n action: 'keep' | 'reencode'\n /** Target dimensions when re-encoding. */\n width: number\n height: number\n reason: string\n}\n\nconst RE_ENCODABLE = new Set(['image/jpeg', 'image/png', 'image/webp', 'image/avif', 'image/heic', 'image/heif', 'image/tiff', 'image/bmp'])\n\n/** What to do with a file of this type/size/dimensions. */\nexport function planUpload(\n meta: { type: string; size: number; width: number; height: number },\n options: OptimizeUploadOptions = {},\n): UploadPlan {\n const maxEdge = options.maxEdge ?? 2000\n const keepUnder = options.keepUnderBytes ?? 400 * 1024\n const { type, size, width, height } = meta\n if (!RE_ENCODABLE.has(type)) {\n return { action: 'keep', width, height, reason: `${type || 'unknown type'} is left as uploaded (animation, vector, or not an image)` }\n }\n const scale = Math.min(1, maxEdge / Math.max(width, height))\n const target = { width: Math.max(1, Math.round(width * scale)), height: Math.max(1, Math.round(height * scale)) }\n if (scale === 1 && size <= keepUnder) {\n return { action: 'keep', ...target, reason: `already within ${maxEdge}px and ${Math.round(keepUnder / 1024)} kB` }\n }\n return {\n action: 'reencode',\n ...target,\n reason: scale < 1 ? `resized from ${width}×${height} to fit ${maxEdge}px` : `re-encoded (${Math.round(size / 1024)} kB source)`,\n }\n}\n\n/**\n * The file to upload: `file` itself, or a WebP re-encoding of it, per\n * `planUpload`. Browser-only; anywhere without `createImageBitmap` and a\n * canvas returns `file` unchanged.\n */\nexport async function optimizeImageForUpload(file: File, options: OptimizeUploadOptions = {}): Promise<File> {\n if (typeof createImageBitmap !== 'function') return file\n if (typeof OffscreenCanvas !== 'function' && typeof document === 'undefined') return file\n if (!file.type.startsWith('image/')) return file\n\n let bitmap: ImageBitmap\n try {\n // Camera photos carry their rotation in EXIF; decode honouring it, or a\n // portrait shot re-encodes sideways.\n bitmap = await createImageBitmap(file, { imageOrientation: 'from-image' })\n } catch {\n return file // undecodable here (HEIC on a browser without it, a corrupt file) — the server sees the original\n }\n\n const plan = planUpload({ type: file.type, size: file.size, width: bitmap.width, height: bitmap.height }, options)\n if (plan.action === 'keep') {\n bitmap.close()\n return file\n }\n\n const quality = options.quality ?? 0.82\n try {\n const blob = await drawToWebp(bitmap, plan.width, plan.height, quality)\n if (!blob || blob.size >= file.size) return file // no gain — keep the original bytes\n const base = file.name.replace(/\\.[a-z0-9]+$/i, '') || 'image'\n return new File([blob], `${base}.webp`, { type: 'image/webp', lastModified: file.lastModified })\n } catch {\n return file\n } finally {\n bitmap.close()\n }\n}\n\nasync function drawToWebp(bitmap: ImageBitmap, width: number, height: number, quality: number): Promise<Blob | null> {\n if (typeof OffscreenCanvas === 'function') {\n const canvas = new OffscreenCanvas(width, height)\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n ctx.drawImage(bitmap, 0, 0, width, height)\n return canvas.convertToBlob({ type: 'image/webp', quality })\n }\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n ctx.drawImage(bitmap, 0, 0, width, height)\n return new Promise((resolve) => canvas.toBlob(resolve, 'image/webp', quality))\n}\n","// Calling the store's edge functions from the BACK OFFICE.\n//\n// The storefront talks to them through the REST client, which carries its own\n// `functionsUrl`. The console talks through the Supabase client, whose URL is\n// derived from the project — enough in production, not enough in development,\n// where the acquirer's key may live in a local vault and a local bench answers\n// instead of the cloud. Hence the optional override, set by the app the same\n// way `setShopTenantResolver` is: the SDK reads nobody's env.\n\nlet _functionsUrl: string | null = null\n\nexport function setShopFunctionsUrl(url: string | null): void {\n _functionsUrl = url ? url.replace(/\\/+$/u, '') : null\n}\n\nexport function getShopFunctionsUrl(): string | null {\n return _functionsUrl\n}\n\n// The Fayz integration service (ADR 0003 phase 2). When set, the functions it\n// hosts are called there, by path, instead of as edge functions. Unset, every\n// call stays on the edge functions.\nlet _serviceUrl: string | null = null\n\nexport function setShopServiceUrl(url: string | null): void {\n _serviceUrl = url ? url.replace(/\\/+$/u, '') : null\n}\n\nexport function getShopServiceUrl(): string | null {\n return _serviceUrl\n}\n\n/** Edge function slug → the service route that replaced it. */\nexport const SERVICE_ROUTES: Readonly<Record<string, string>> = Object.freeze({\n 'mercadopago-checkout-open': '/v1/payments/mercadopago/checkout',\n 'mercadopago-checkout-settle': '/v1/payments/mercadopago/settle',\n 'stripe-checkout-open': '/v1/payments/stripe/checkout',\n 'stripe-checkout-settle': '/v1/payments/stripe/settle',\n 'shop-checkout-open': '/v1/payments/abacatepay/checkout',\n 'shop-checkout-settle': '/v1/payments/abacatepay/settle',\n 'shop-shipping-quote': '/v1/shipping/quote',\n})\n\n/**\n * Quanto tempo esperar antes de desistir.\n *\n * Não havia limite nenhum, e o custo aparecia exatamente onde dói: o adquirente\n * demorava, a tela ficava rodando sem dizer nada, e o poll de 4 em 4 segundos\n * empilhava chamadas em cima da que ainda não voltou. Um teto transforma \"a\n * tela travou\" numa frase que o lojista pode ler e agir.\n */\nconst DEFAULT_TIMEOUT_MS = 25_000\n\n/** Answers `ok` apart from the body: a refusal carries a message worth showing. */\nexport async function callShopFunction(\n db: any,\n slug: string,\n body: Record<string, unknown>,\n options?: { timeoutMs?: number },\n): Promise<{ ok: boolean; status: number; payload: any }> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n let timer: ReturnType<typeof setTimeout> | undefined\n const bounded = <T>(work: Promise<T>): Promise<T> => Promise.race([\n work,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`A função ${slug} não respondeu em ${Math.round(timeoutMs / 1000)}s.`)),\n timeoutMs,\n )\n }),\n ]).finally(() => { if (timer) clearTimeout(timer) })\n const service = getShopServiceUrl()\n const servicePath = SERVICE_ROUTES[slug]\n const override = service && servicePath ? null : getShopFunctionsUrl()\n if ((service && servicePath) || override) {\n const target = service && servicePath ? `${service}${servicePath}` : `${override}/${slug}`\n // The session token rides along, exactly as functions.invoke would attach\n // it. A function that guards on membership (labels spend money) refuses\n // every call without it, and the bench would look broken when it is not.\n let token: string | null = null\n try {\n token = (await db?.auth?.getSession?.())?.data?.session?.access_token ?? null\n } catch {\n /* signed out, or a client without auth: the function decides */\n }\n let response: Response\n try {\n response = await bounded(fetch(target, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n },\n body: JSON.stringify(body),\n }))\n } catch (cause) {\n // A bancada desligada é o caso comum aqui, e o navegador conta a pior\n // versão dessa história: o preflight não completa, o console diz \"CORS\",\n // e a tela mostra \"Failed to fetch\" — três nomes para \"não tem ninguém\n // atendendo nessa porta\". O override é ajuste de máquina de quem\n // desenvolve, então a frase pode dizer exatamente isso.\n // `cause` não entra: o alvo de compilação desta biblioteca é anterior a\n // ele, e a mensagem já carrega o que se pode agir.\n void cause\n if (!override) throw new Error(`O serviço de integrações não respondeu (${slug}). Tente de novo.`)\n throw new Error(\n `A bancada de funções em ${override} não respondeu (${slug}). ` +\n 'Suba-a, ou tire PUBLIC_SUPABASE_FUNCTIONS_URL do .env para usar as funções publicadas.',\n )\n }\n const payload = await response.json().catch(() => null)\n return { ok: response.ok, status: response.status, payload }\n }\n\n const { data, error } = await bounded<{ data: any; error: any }>(db.functions.invoke(slug, { body }))\n if (!error) return { ok: true, status: 200, payload: data }\n\n // supabase-js hides the function's own body inside the error context. Without\n // digging it out, a refusal written for the merchant reads as \"Edge Function\n // returned a non-2xx status code\".\n const status = Number((error as any)?.context?.status ?? 502)\n let payload: any = null\n try {\n payload = await (error as any)?.context?.json?.()\n } catch {\n /* non-JSON body: the status stands */\n }\n return { ok: false, status, payload: payload ?? { error: error.message } }\n}\n","// Which edge function charges for which acquirer.\n//\n// This table is what replaces the sentence that used to sit in CheckoutPage:\n// *\"a função tem UM provedor gravado dentro dela: pedir a ela uma cobrança de\n// outro adquirente não dá cobrança errada, dá erro na cara do comprador.\"* That\n// is still true of each function — they disagree about their body, their host,\n// their credential and their status vocabulary, so they are separate functions —\n// and a store with two acquirers on the shelf needs something that knows which\n// door to knock on.\n//\n// It is a MAP and not a switch, and it lives here rather than in the storefront,\n// because three places were about to hold the same list: the page that decides\n// whether the buyer sees a QR code at all, and the two provider methods that\n// call the functions. A gateway present in one and missing from another is a\n// checkout that offers to charge and then cannot.\n//\n// A provider absent from this table is not broken — it is an acquirer the\n// merchant selected for their own records, whose money arrives some other way.\n// The buyer is then routed to the no-charge path and the order stays `pending`\n// until the merchant confirms, which is exactly what happened before any gateway\n// existed.\n\n/** The pair of functions one acquirer needs: one to open a charge, one to settle it. */\nexport interface CheckoutGateway {\n /** Reprices the cart, freezes a session and opens the charge. Creates no order. */\n open: string\n /** Asks the acquirer whether the money landed, and writes the order if it did. */\n settle: string\n /**\n * Whether this acquirer can hand back a PAYMENT LINK — one URL, hosted by the\n * provider, that a merchant copies and sends to a customer who is not at the\n * counter and not on the site.\n *\n * A capability and not a second gateway, because everything around it is\n * already shared: the same `open` function mints it, the same session freezes\n * the cart, the same `settle` writes the order when the webhook lands. What\n * differs is one flag on the request and one field on the answer.\n *\n * It is declared rather than assumed because it is genuinely not universal.\n * AbacatePay's session path opens a transparent Pix and answers with a code,\n * not an address; giving the panel a \"gerar link\" button for it would offer a\n * link no function can produce. When that changes, this flag changes with it —\n * in one place, next to the functions it describes.\n */\n link: boolean\n /**\n * Whether this acquirer can charge a CARD at all.\n *\n * Not a store setting and not a merchant preference: a property of the\n * acquirer's own account world. AbacatePay discontinued card for new clients\n * and new integrations — it survives only for accounts that had already taken\n * real production card money before the cutoff — so for every store this repo\n * connects today the answer is no, and no toggle in Loja → Integrações can\n * change it.\n *\n * It earns a flag because asking anyway is not a soft failure.\n * `/checkouts/create` rejects the WHOLE request when CARD is among `methods`,\n * so a Pix payment link that politely also offered card came back as an error\n * instead of as a link. Declaring the capability here keeps it next to the\n * functions that act on it, and lets the storefront send the buyer down the\n * no-charge path — the maquininha at the door — before a charge is attempted.\n */\n card: boolean\n /**\n * What to CALL this acquirer in front of a buyer.\n *\n * The slug is ours and reads like an internal id (`abacatepay`); the name on\n * the button is the one printed on the page the buyer is about to land on, and\n * a mismatch there is what makes a redirect feel like a hijack. It lives with\n * the rest of the acquirer's facts so a screen never has to keep its own map.\n */\n label: string\n}\n\n/**\n * Every acquirer this repo can actually charge with, by the slug stored in\n * `plg_shop_settings.payment_provider` — which is the `ConnectorDefinition.id`,\n * not the catalogue slug.\n *\n * AppMax is deliberately absent. Its pair (`shop-checkout-pay` /\n * `shop-payment-status`) belongs to the older shape where the order was written\n * BEFORE the charge, so it does not answer this contract; it is reached by its\n * own path and is not a session gateway.\n *\n */\nconst GATEWAYS: Readonly<Record<string, CheckoutGateway>> = Object.freeze({\n abacatepay: Object.freeze({ open: 'shop-checkout-open', settle: 'shop-checkout-settle', link: true, card: false, label: 'AbacatePay' }),\n vindi: Object.freeze({ open: 'vindi-checkout-open', settle: 'vindi-checkout-settle', link: true, card: true, label: 'Vindi' }),\n // The first acquirer here that charges a card IN THE STORE: Mercado Pago\n // tokenises in the browser, so no PAN crosses the pool and card needs no\n // hosted page. `link: false` because nothing mints a shareable URL yet.\n mercadopago: Object.freeze({ open: 'mercadopago-checkout-open', settle: 'mercadopago-checkout-settle', link: false, card: true, label: 'Mercado Pago' }),\n // Stripe: card, Pix and boleto are all paid on Stripe's hosted Checkout\n // page, and a page URL is a shareable link for up to 24 hours. Keyed by the\n // ConnectorDefinition id, which carries the \"-connect\" the catalogue slug\n // does not.\n 'stripe-connect': Object.freeze({ open: 'stripe-checkout-open', settle: 'stripe-checkout-settle', link: true, card: true, label: 'Stripe' }),\n})\n\n/**\n * The acquirers a storefront may offer an online charge for.\n *\n * Derived from the table rather than written beside it: a gateway added to one\n * and forgotten in the other is the failure this module exists to make\n * impossible.\n */\nexport const CHARGEABLE_PROVIDERS: readonly string[] = Object.freeze(Object.keys(GATEWAYS))\n\n/** Whether this acquirer can take money online here. */\nexport function isChargeableProvider(provider: string | null | undefined): boolean {\n return checkoutGateway(provider) !== null\n}\n\n/**\n * Whether this acquirer can mint a link the merchant sends to a customer.\n *\n * Asked by the panel BEFORE it offers the button, so a store whose gateway\n * cannot do it never sees an action that would fail. The question is about the\n * acquirer and never about the order — an order is paid by whoever the store\n * connected, and the screen that shows it should not learn four provider names\n * to decide what to render.\n */\nexport function supportsPaymentLink(provider: string | null | undefined): boolean {\n return checkoutGateway(provider)?.link === true\n}\n\n/**\n * Whether this acquirer can take CARD money online here.\n *\n * Asked before the card option is offered as an online charge, so a store whose\n * acquirer cannot do it never reaches the provider to be told no. False is not\n * \"card is refused\" — the buyer still picks card and still gets an order; it is\n * paid the way card was always paid before any gateway existed.\n */\nexport function supportsCard(provider: string | null | undefined): boolean {\n return checkoutGateway(provider)?.card === true\n}\n\n/**\n * The acquirer's name as a buyer should read it, or null when we have none.\n *\n * Null rather than the slug, so a caller decides what to say about an acquirer\n * this table does not carry — \"pagar\" beats \"pagar com stripe-connect\".\n */\nexport function gatewayLabel(provider: string | null | undefined): string | null {\n return checkoutGateway(provider)?.label ?? null\n}\n\n/**\n * The pair for an acquirer, or null.\n *\n * Null for an unknown provider AND for an absent one, because they mean the same\n * thing to every caller: there is no online charge, take the other path. An\n * empty string is the merchant's explicit *\"eu confirmo à mão\"* and lands here\n * too — see `resolvePaymentProvider`, which treats it as a decision rather than\n * an absence.\n */\nexport function checkoutGateway(provider: string | null | undefined): CheckoutGateway | null {\n const slug = String(provider ?? '').trim()\n if (!slug) return null\n return GATEWAYS[slug] ?? null\n}\n\n/**\n * Qual adquirente cobra: o que a chamada pediu, senão o que a LOJA configurou,\n * senão AbacatePay.\n *\n * A última perna é herança, não escolha: era o padrão de quando havia um\n * gateway só, e uma loja antiga sem o ajuste preenchido continua cobrando como\n * sempre cobrou. O bug que isto fecha é a perna do MEIO nunca ter existido —\n * nenhuma tela do console passava o provedor, então uma loja na Vindi abria a\n * cobrança na AbacatePay, que não conhece a conta dela.\n *\n * `null` e ausente querem dizer a mesma coisa: \"não escolhi\".\n */\nexport function resolveCheckoutProvider(\n explicit: string | null | undefined,\n configured: string | null | undefined,\n): string {\n const asked = String(explicit ?? '').trim()\n if (asked) return asked\n const store = String(configured ?? '').trim()\n return store || 'abacatepay'\n}\n","// ---------------------------------------------------------------------------\n// Finding a customer by what the merchant actually types.\n//\n// The console searched with ONE `or()` over the whole string, so \"maria silva\"\n// was matched against first_name, last_name and email as a single value and\n// found nobody — the customer was there, spelled exactly like that, split over\n// two columns. Every word now has to match SOMETHING, and the words are ANDed:\n// \"maria silva\" needs maria in one column and silva in another.\n// ---------------------------------------------------------------------------\n\nconst COLUMNS = ['first_name', 'last_name', 'email', 'phone'] as const\n\n/** One PostgREST `or()` expression per word. Chained, they AND together. */\nexport function customerSearchFilters(term: string | undefined | null): string[] {\n return String(term ?? '')\n .trim()\n .split(/\\s+/u)\n // PostgREST reads these as syntax, and a stray comma would split the filter\n // into two conditions the caller never wrote.\n .map((word) => word.replace(/[%,()]/gu, ''))\n .filter(Boolean)\n .map((word) => COLUMNS.map((column) => `${column}.ilike.%${word}%`).join(','))\n}\n","import { optimizeImageForUpload } from '../lib/optimize-upload'\nimport { emitOrderEvent } from '../lib/order-events'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { resolveEntityStore } from '../entities/entity-store'\nimport type { EntityRecord, EntityRecordInput, ListEntityRecordsOptions } from '../entities/entity-store'\nimport { createSupabaseEntityStore } from '../entities/supabase-entity-store'\nimport type { ShopProvider } from './provider'\nimport type { ComputeAction, RuleCartSnapshot } from '../rules/rule-types'\nimport { getShopTenantId } from './tenant'\nimport { callShopFunction } from './functions'\nimport { checkoutGateway, resolveCheckoutProvider } from './checkout-gateways'\nimport { customerSearchFilters } from './customer-search'\nimport { T, V } from './tables'\nimport { displayNameOf, mediaKindOf, mergeMediaFiles, productImageToMediaFile, storagePathOf } from './media'\nimport { resolveStockStore } from '../inventory/stock-store'\nimport { createSupabaseStockStore, rowToStockLocation } from '../inventory/supabase-stock-store'\nimport type {\n StockLocation, CreateStockLocationInput, UpdateStockLocationInput,\n} from '../inventory/stock-types'\nimport { OPENING_BALANCE_REASON } from '../inventory/vocabulary'\nimport { normalizeVariantAxes, validateVariantAxes, variantOptionsKey } from '../lib/variant-matrix'\nimport type {\n Product, ProductImage, ProductOption, ProductOptionInput, ProductVariant, ProductVariantSet,\n CreateProductVariantInput, UpdateProductVariantInput, Category,\n Order, ShopCustomer, Discount,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateCategoryInput, UpdateCategoryInput,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions, PlaceOrderInput,\n CreateCustomerInput, UpdateCustomerInput, ListCustomersOptions, ResolveCustomerInput,\n CreateDiscountInput, UpdateDiscountInput, ListDiscountsOptions, OrderItem,\n CheckoutSessionInput, CheckoutSession, CheckoutSettlement, ShippingQuoteOption, CustomerAddress, ShippingAgency,\n SalesChannel, CreateSalesChannelInput, UpdateSalesChannelInput,\n ShippingZone, CreateShippingZoneInput, UpdateShippingZoneInput,\n ShippingProfile, CreateShippingProfileInput, UpdateShippingProfileInput,\n ShippingPackage, ShippingPackageKind, CreateShippingPackageInput, UpdateShippingPackageInput,\n ShippingSettings, UpdateShippingSettingsInput,\n StoreSettings, PublicDeliveryPolicy, UpdateStoreSettingsInput, PaymentMethodKind, CheckoutFieldKey, CheckoutFieldPolicy,\n DeliveryCheck,\n FulfillmentType, ServiceStatus, ServiceHours, ScheduleSlot,\n PostalAddressHint,\n AreaCandidate,\n Collection, CreateCollectionInput, UpdateCollectionInput, CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput, CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, GiftCard, CreateGiftCardInput, UpdateGiftCardInput, EmailTemplate, UpsertEmailTemplateInput, MediaFile, MarketPrice, ShopMarket, AdminShopMarket, CatalogMarketPrice } from '../types'\n\nfunction getDb(): any {\n const supabase = getSupabaseClientOptional()\n if (!supabase) throw new Error('@fayz-ai/shop: Supabase client not initialized. Call setGlobalSupabaseClient() first.')\n return supabase\n}\n\nconst getTenantId = getShopTenantId\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction asUuid(value: string | null | undefined): string | null {\n if (!value) return null\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n ? value\n : null\n}\n\n/** 8 bare digits, zero-padded — the shape shipping_zones stores and compares. */\nfunction toPostalDigits(value: string | undefined | null): string | undefined {\n const digits = String(value ?? '').replace(/\\D/g, '')\n return digits ? digits.padStart(8, '0').slice(0, 8) : undefined\n}\n\nfunction rowToVariant(row: any): ProductVariant {\n return {\n id: row.id,\n productId: row.product_id,\n options: row.options && typeof row.options === 'object' ? row.options : {},\n sku: row.sku ?? null,\n // numeric(12,2) arrives as a string on the wire; Number() once, here.\n price: row.price == null ? null : Number(row.price),\n compareAtPrice: row.compare_at_price == null ? null : Number(row.compare_at_price),\n inventoryCount: row.inventory_count ?? 0,\n position: row.position ?? 0,\n status: row.status ?? 'active',\n imageId: row.image_id ?? null,\n isDefaultVariant: row.is_default_variant ?? false,\n // Null inherits the product's, the way `price` has since 0028.\n weight: numOrNull(row.weight),\n weightUnit: row.weight_unit ?? null,\n heightCm: numOrNull(row.height_cm),\n widthCm: numOrNull(row.width_cm),\n lengthCm: numOrNull(row.length_cm),\n }\n}\n\n/**\n * The writable variant columns, and only the ones actually present in the input\n * — `undefined` must mean \"leave it\" while `null` means \"clear it\", because on\n * this table null is the load-bearing value: it is what \"inherit the product's\"\n * is spelled as, for price since 0028 and for the dimensions since 0046.\n */\nfunction variantPatch(input: UpdateProductVariantInput): Record<string, unknown> {\n const patch: Record<string, unknown> = {}\n // What the SHOP owns. `sku` and `price` are gone from here: 0086 dropped them\n // from plg_shop_product_variants because a variant's identity belongs to\n // public.product_variants (ADR 0024). They are routed by `variantCorePatch`.\n const map: Record<string, string> = {\n compareAtPrice: 'compare_at_price', position: 'position',\n status: 'status', imageId: 'image_id', weight: 'weight', weightUnit: 'weight_unit',\n heightCm: 'height_cm', widthCm: 'width_cm', lengthCm: 'length_cm',\n }\n for (const [key, column] of Object.entries(map)) {\n const value = (input as Record<string, unknown>)[key]\n if (value === undefined) continue\n patch[column] = value\n }\n return patch\n}\n\n/**\n * The other half of the same input: what `public.product_variants` owns.\n *\n * 0086 dropped `sku`, `price` and `options` from the shop's extension, and\n * `shop_ensure_default_variant` was rewritten to write the archetype row plus\n * an extension pointing at it. This path — a variant a MERCHANT creates, with\n * options — was not, so saving one failed on \"Could not find the 'options'\n * column of 'plg_shop_product_variants' in the schema cache\".\n */\nfunction variantCorePatch(input: UpdateProductVariantInput): Record<string, unknown> {\n const patch: Record<string, unknown> = {}\n if (input.sku !== undefined) {\n // A blank SKU is NO sku. 0028's unique index is partial on `sku IS NOT NULL`,\n // so two variants left empty in the grid would collide on '' instead.\n patch.sku = typeof input.sku === 'string' && input.sku.trim() === '' ? null : input.sku\n }\n if (input.price !== undefined) patch.price = input.price\n const options = (input as { options?: Record<string, string> }).options\n if (options !== undefined) {\n patch.attributes = options\n patch.name = variantDisplayName(options)\n }\n if (input.status !== undefined) patch.is_active = input.status === 'active'\n if (input.position !== undefined) patch.sort_order = input.position\n return patch\n}\n\n/** \"GG / Azul\" — the archetype requires a name, and the options ARE the name of\n * a variant. Falls back rather than writing an empty string. */\nfunction variantDisplayName(options: Record<string, string>): string {\n const parts = Object.values(options ?? {}).filter(Boolean)\n return parts.length > 0 ? parts.join(' / ') : 'Variante'\n}\n\n/**\n * plg_shop_settings → StoreSettings, and the reason this is not a `{...row}`\n * spread: EVERY absent column has to come back as `undefined`, not as `false` or\n * `[]`. `undefined` is how the whole stack says \"the merchant has not decided\",\n * which is what keeps eight live storefronts on their existing behaviour. A\n * mapper that coalesced to false would silently turn every unset toggle into a\n * decision to turn it off.\n *\n * The RPC (shop_store_settings) returns a SUBSET of these columns, so the same\n * mapper serves both reads: a key the RPC does not select is simply undefined.\n */\n/** shop_public_delivery's row, as the storefront reads it. */\nexport function toPublicDeliveryPolicy(row: any): PublicDeliveryPolicy | null {\n if (!row) return null\n const min = row.min_order_total == null ? null : Number(row.min_order_total)\n const eta = row.delivery_eta_minutes == null ? null : Number(row.delivery_eta_minutes)\n return { minOrderTotal: min && min > 0 ? min : null, etaMinutes: eta && eta > 0 ? eta : null, deliveryFlow: Boolean(row.delivery_flow) }\n}\n\nfunction rowToStoreSettings(row: any): StoreSettings {\n const bool = (v: unknown): boolean | undefined => (v == null ? undefined : Boolean(v))\n const methods = Array.isArray(row.payment_methods) && row.payment_methods.length > 0\n ? (row.payment_methods as PaymentMethodKind[])\n : undefined\n const fields = row.checkout_fields && typeof row.checkout_fields === 'object' && Object.keys(row.checkout_fields).length > 0\n ? (row.checkout_fields as Partial<Record<CheckoutFieldKey, CheckoutFieldPolicy>>)\n : undefined\n return {\n // O jsonb já vem na forma de ShippingAddressInput (a 0094 guarda assim\n // justamente para não traduzir aqui). Objeto vazio conta como ausente:\n // um endereço sem rua não é um balcão.\n pickupAddress: row.pickup_address && typeof row.pickup_address === 'object'\n && Object.keys(row.pickup_address).length > 0\n ? (row.pickup_address as StoreSettings['pickupAddress'])\n : undefined,\n currency: row.currency ?? undefined,\n locale: row.locale ?? undefined,\n showOutOfStock: bool(row.show_out_of_stock),\n requireSku: bool(row.require_sku),\n stockOwnership: row.stock_ownership ?? undefined,\n paymentMethods: methods,\n paymentProvider: row.payment_provider ?? undefined,\n guestCheckout: bool(row.guest_checkout),\n requireConfirmedEmail: bool(row.require_confirmed_email),\n marketingOptIn: bool(row.marketing_opt_in),\n discountsEnabled: bool(row.discounts_enabled),\n checkoutFields: fields,\n autoFulfill: row.auto_fulfill ?? undefined,\n notifyNewOrder: bool(row.notify_new_order),\n notifyLowStock: bool(row.notify_low_stock),\n handlingNote: row.handling_note ?? undefined,\n carrierQuotes: bool(row.carrier_quotes),\n receivingAccounts: row.receiving_accounts && typeof row.receiving_accounts === 'object'\n && Object.keys(row.receiving_accounts).length > 0\n ? (row.receiving_accounts as StoreSettings['receivingAccounts'])\n : undefined,\n deliveryFlow: bool(row.delivery_flow),\n minOrderTotal: row.min_order_total == null ? undefined : Number(row.min_order_total),\n deliveryEtaMinutes: row.delivery_eta_minutes == null ? undefined : Number(row.delivery_eta_minutes),\n }\n}\n\n/**\n * The write side of the same asymmetry: only keys the caller actually passed are\n * sent. A screen that renders one section must be able to save that section\n * without restating — and thereby overwriting — every other one.\n */\nfunction storeSettingsPayload(input: UpdateStoreSettingsInput): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.currency !== undefined) payload.currency = input.currency\n if (input.locale !== undefined) payload.locale = input.locale\n if (input.showOutOfStock !== undefined) payload.show_out_of_stock = input.showOutOfStock\n if (input.requireSku !== undefined) payload.require_sku = input.requireSku\n if (input.stockOwnership !== undefined) payload.stock_ownership = input.stockOwnership\n if (input.paymentMethods !== undefined) payload.payment_methods = input.paymentMethods\n // '' is STORED, not turned into NULL: it is the merchant answering \"nenhum,\n // confirmo à mão\", and NULL is never having answered. Collapsing the two made\n // the payments screen re-adopt the connected gateway on the next load, so the\n // choice could not be made at all.\n if (input.paymentProvider !== undefined) payload.payment_provider = input.paymentProvider ?? null\n if (input.guestCheckout !== undefined) payload.guest_checkout = input.guestCheckout\n if (input.requireConfirmedEmail !== undefined) payload.require_confirmed_email = input.requireConfirmedEmail\n if (input.marketingOptIn !== undefined) payload.marketing_opt_in = input.marketingOptIn\n if (input.discountsEnabled !== undefined) payload.discounts_enabled = input.discountsEnabled\n if (input.checkoutFields !== undefined) payload.checkout_fields = input.checkoutFields ?? {}\n if (input.autoFulfill !== undefined) payload.auto_fulfill = input.autoFulfill\n if (input.notifyNewOrder !== undefined) payload.notify_new_order = input.notifyNewOrder\n if (input.notifyLowStock !== undefined) payload.notify_low_stock = input.notifyLowStock\n if (input.handlingNote !== undefined) payload.handling_note = input.handlingNote || null\n if (input.carrierQuotes !== undefined) payload.carrier_quotes = input.carrierQuotes\n if (input.receivingAccounts !== undefined) payload.receiving_accounts = input.receivingAccounts ?? {}\n if (input.deliveryFlow !== undefined) payload.delivery_flow = input.deliveryFlow\n // 0 and empty both mean \"no minimum\"; stored as NULL so the check reads one value.\n if (input.minOrderTotal !== undefined) payload.min_order_total = input.minOrderTotal ? input.minOrderTotal : null\n if (input.deliveryEtaMinutes !== undefined) payload.delivery_eta_minutes = input.deliveryEtaMinutes ? Math.round(input.deliveryEtaMinutes) : null\n return payload\n}\n\nfunction rowToShippingZone(row: any): ShippingZone {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n carrier: row.carrier ?? null,\n // A pool that has not reached 0081 answers undefined on both: a rule with no\n // declared matcher is a postal range that delivers, which is what every row\n // written before 0081 is.\n matchKind: row.match_kind ?? 'postal_range',\n cityCode: row.city_code ?? null,\n districtKey: row.district_key ?? null,\n outcome: row.outcome ?? (row.excluded ? 'refuse' : 'deliver'),\n postalFrom: row.postal_from == null ? null : String(row.postal_from).trim(),\n postalTo: row.postal_to == null ? null : String(row.postal_to).trim(),\n rate: Number(row.rate ?? 0),\n freeAbove: row.free_above == null ? null : Number(row.free_above),\n etaMinDays: row.eta_min_days ?? null,\n etaMaxDays: row.eta_max_days ?? null,\n active: row.active ?? true,\n sortOrder: row.sort_order ?? 0,\n excluded: row.excluded ?? false,\n profileId: row.profile_id ?? null,\n }\n}\n\nfunction rowToShippingProfile(row: any): ShippingProfile {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n // undefined, never false: NULL means \"inherit the store's decision\", and a\n // mapper that coalesced would turn every new profile into one that refuses\n // the gateway.\n carrierQuotes: row.carrier_quotes == null ? undefined : Boolean(row.carrier_quotes),\n isDefault: row.is_default ?? false,\n }\n}\n\nfunction shippingProfilePayload(input: Partial<CreateShippingProfileInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.carrierQuotes !== undefined) payload.carrier_quotes = input.carrierQuotes ?? null\n if (input.isDefault !== undefined) payload.is_default = input.isDefault\n return payload\n}\n\n/** 8 bare digits, or null for \"not told yet\". Refuses a half-typed postcode\n * instead of storing it — 0058's CHECK would refuse it anyway, in Postgrese. */\nfunction toOriginPostalCode(raw: string | null | undefined): string | null {\n const digits = String(raw ?? '').replace(/\\D/g, '')\n if (!digits) return null\n if (digits.length !== 8) throw new Error('O CEP do local precisa ter 8 dígitos.')\n return digits\n}\n\n/** A stable handle for imports and ERP connectors, derived from the name so the\n * merchant is never asked for one. */\nfunction toLocationCode(name: string): string {\n const slug = name.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 40)\n return slug || 'local'\n}\n\n/**\n * The two refusals a merchant can actually trigger, said in Portuguese. Both\n * come back as Postgres codes the settings screen would otherwise print raw.\n */\nfunction locationWriteError(error: { code?: string; message?: string }): Error {\n if (error?.code === '23505') return new Error('Já existe um local com esse nome.')\n if (error?.code === '23503') {\n return new Error(\n 'Este local já tem movimentações de estoque. Arquive-o em vez de excluir — o histórico aponta para ele.',\n )\n }\n return new Error(error?.message ?? 'Não foi possível salvar o local.')\n}\n\nfunction stockLocationPayload(input: Partial<CreateStockLocationInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.code !== undefined) payload.code = input.code\n if (input.kind !== undefined) payload.kind = input.kind\n if (input.isSellable !== undefined) payload.is_sellable = input.isSellable\n if (input.isDefault !== undefined) payload.is_default = input.isDefault\n if (input.status !== undefined) payload.status = input.status\n if (input.postalCode !== undefined) payload.postal_code = toOriginPostalCode(input.postalCode)\n if (input.city !== undefined) payload.city = input.city || null\n if (input.state !== undefined) payload.state = input.state || null\n if (input.street !== undefined) payload.street = input.street || null\n // What a carrier label needs on top of a postcode (0061).\n if (input.number !== undefined) payload.number = input.number || null\n if (input.district !== undefined) payload.district = input.district || null\n if (input.complement !== undefined) payload.complement = input.complement || null\n if (input.document !== undefined) payload.document = String(input.document ?? '').replace(/\\D/gu, '') || null\n if (input.phone !== undefined) payload.phone = String(input.phone ?? '').replace(/\\D/gu, '') || null\n if (input.email !== undefined) payload.email = input.email || null\n if (input.carrierAgencies !== undefined) payload.carrier_agencies = input.carrierAgencies ?? {}\n if (input.shipsOnline !== undefined) payload.ships_online = input.shipsOnline\n if (input.fulfillmentProvider !== undefined) {\n payload.fulfillment_provider = input.fulfillmentProvider || null\n }\n return payload\n}\n\n/**\n * The address hint, in the snake_case shape shop_resolve_area reads. Null when\n * there is nothing useful to say — an empty object would look like a claim.\n */\nfunction addressHintPayload(hint?: PostalAddressHint): Record<string, unknown> | null {\n if (!hint) return null\n const out: Record<string, unknown> = {}\n if (hint.district) out.district = hint.district\n if (hint.city) out.city = hint.city\n if (hint.state) out.state = hint.state\n if (hint.cityCode) out.city_code = hint.cityCode\n return Object.keys(out).length > 0 ? out : null\n}\n\nfunction shippingZonePayload(input: Partial<CreateShippingZoneInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.carrier !== undefined) payload.carrier = input.carrier || null\n if (input.matchKind != null) payload.match_kind = input.matchKind\n if (input.cityCode !== undefined) payload.city_code = input.cityCode || null\n if (input.districtKey !== undefined) payload.district_key = input.districtKey || null\n if (input.outcome != null) payload.outcome = input.outcome\n // Null, not '': a city/district rule has no range, and toPostalDigits would\n // left-pad the empty string into '00000000' and match Acre. 0081 drops the\n // NOT NULL on both columns for exactly this.\n if (input.postalFrom !== undefined)\n payload.postal_from = input.postalFrom ? toPostalDigits(input.postalFrom) : null\n if (input.postalTo !== undefined)\n payload.postal_to = input.postalTo ? toPostalDigits(input.postalTo) : null\n // `!= null` on every NOT NULL WITH DEFAULT column — match_kind and outcome\n // from 0081, rate/active/sort_order/excluded from 0021. A column default only\n // applies when the column is ABSENT from the INSERT; an explicit null is\n // refused, not defaulted. The admin form sends null for an optional field\n // nobody touched, which is how an empty «Ordem» became `null value in column\n // \"sort_order\" violates not-null`. Null here means \"leave it to the column\".\n if (input.rate != null) payload.rate = input.rate\n if (input.freeAbove !== undefined) payload.free_above = input.freeAbove ?? null\n if (input.etaMinDays !== undefined) payload.eta_min_days = input.etaMinDays ?? null\n if (input.etaMaxDays !== undefined) payload.eta_max_days = input.etaMaxDays ?? null\n if (input.active != null) payload.active = input.active\n if (input.sortOrder != null) payload.sort_order = input.sortOrder\n if (input.excluded != null) payload.excluded = input.excluded\n if (input.profileId !== undefined) payload.profile_id = input.profileId ?? null\n return payload\n}\n\nfunction rowToShippingPackage(row: any): ShippingPackage {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n kind: (row.kind ?? 'box') as ShippingPackageKind,\n heightCm: Number(row.height_cm ?? 0),\n widthCm: Number(row.width_cm ?? 0),\n lengthCm: Number(row.length_cm ?? 0),\n emptyWeightGrams: Number(row.empty_weight_grams ?? 0),\n isDefault: row.is_default ?? false,\n active: row.active ?? true,\n }\n}\n\nfunction shippingPackagePayload(input: Partial<CreateShippingPackageInput>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (input.name !== undefined) payload.name = input.name\n if (input.kind !== undefined) payload.kind = input.kind\n if (input.heightCm !== undefined) payload.height_cm = input.heightCm\n if (input.widthCm !== undefined) payload.width_cm = input.widthCm\n if (input.lengthCm !== undefined) payload.length_cm = input.lengthCm\n if (input.emptyWeightGrams !== undefined) payload.empty_weight_grams = input.emptyWeightGrams\n if (input.isDefault !== undefined) payload.is_default = input.isDefault\n if (input.active !== undefined) payload.active = input.active\n return payload\n}\n\nfunction rowToProduct(row: any): Product {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n seoTitle: row.seo_title ?? null,\n seoDescription: row.seo_description ?? null,\n description: row.description,\n price: row.price ?? 0,\n compareAtPrice: row.compare_at_price,\n currency: row.currency ?? 'BRL',\n status: row.status ?? 'active',\n inventoryCount: row.inventory_count ?? 0,\n sku: row.sku,\n sortOrder: row.sort_order ?? 0,\n metadata: row.metadata ?? {},\n images: Array.isArray(row.images) ? row.images.map(rowToImage) : [],\n categoryId: row.category_id,\n categoryName: row.category_name ?? null,\n isPhysical: row.is_physical ?? true,\n weight: row.weight,\n weightUnit: row.weight_unit ?? 'kg',\n heightCm: numOrNull(row.height_cm),\n widthCm: numOrNull(row.width_cm),\n lengthCm: numOrNull(row.length_cm),\n packageId: row.package_id ?? null,\n handling: Array.isArray(row.handling) ? row.handling : [],\n shippingProfileId: row.shipping_profile_id ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\n/** PostgREST hands `numeric` back as a string. Null survives as null: \"not\n * measured\" is what the packing code degrades on, and 0 would read as a\n * measurement of zero. */\nfunction numOrNull(value: unknown): number | null {\n if (value == null || value === '') return null\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n}\n\nfunction rowToImage(row: any): ProductImage {\n return {\n id: row.id,\n productId: row.product_id,\n url: row.url,\n altText: row.alt_text,\n sortOrder: row.sort_order ?? 0,\n isPrimary: row.is_primary ?? false,\n createdAt: row.created_at,\n }\n}\n\nfunction rowToCategory(row: any): Category {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n slug: row.slug ?? slugify(row.name),\n description: row.description,\n parentId: row.parent_id,\n sortOrder: row.sort_order ?? 0,\n createdAt: row.created_at,\n }\n}\n\n/**\n * Order items were being passed through raw, so every snake_case column arrived\n * undefined on the camelCase type: unit_price, image_url and product_id were all\n * lost. `total` survived only because the name matches in both, which is exactly\n * why the bug looked like \"price is zero\" instead of \"nothing is mapped\".\n */\nfunction rowToOrderItem(row: any): OrderItem {\n return {\n id: row.id,\n orderId: row.order_id,\n productId: row.product_id ?? null,\n variantId: row.variant_id ?? null,\n name: row.name,\n sku: row.sku ?? null,\n quantity: row.quantity ?? 0,\n unitPrice: row.unit_price ?? 0,\n total: row.total ?? 0,\n imageUrl: row.image_url ?? null,\n }\n}\n\nfunction rowToOrder(row: any): Order {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n orderNumber: row.order_number,\n status: row.status ?? 'open',\n financialStatus: row.financial_status ?? 'pending',\n fulfillmentStatus: row.fulfillment_status ?? 'unfulfilled',\n currency: row.currency ?? 'BRL',\n subtotal: row.subtotal ?? 0,\n taxTotal: row.tax_total ?? 0,\n discountTotal: row.discount_total ?? 0,\n shippingTotal: row.shipping_total ?? 0,\n total: row.total ?? 0,\n customerId: row.customer_id,\n customerName: row.customer_name,\n customerEmail: row.customer_email,\n discountCode: row.discount_code,\n notes: row.notes,\n shippingAddress: row.shipping_address ?? null,\n paymentMethodKind: row.payment_method_kind ?? null,\n paidAt: row.paid_at ?? null,\n items: Array.isArray(row.items) ? row.items.map(rowToOrderItem) : [],\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToCustomer(row: any): ShopCustomer {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n firstName: row.first_name,\n lastName: row.last_name ?? '',\n email: row.email,\n phone: row.phone,\n document: row.document ?? null,\n notes: row.notes,\n ordersCount: row.orders_count ?? 0,\n totalSpent: row.total_spent ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToDiscount(row: any): Discount {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n code: row.code,\n type: row.type,\n method: row.method ?? 'code',\n value: row.value ?? 0,\n usageLimit: row.usage_limit,\n oncePerCustomer: row.once_per_customer ?? false,\n minSubtotal: row.min_subtotal ?? null,\n appliesTo: row.applies_to ?? 'all',\n productIds: row.product_ids ?? [],\n categoryIds: row.category_ids ?? [],\n startsAt: row.starts_at,\n endsAt: row.ends_at,\n status: row.status ?? 'active',\n timesUsed: row.times_used ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction rowToSalesChannel(row: any): SalesChannel {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n kind: row.kind,\n label: row.label,\n url: row.url,\n enabled: row.enabled ?? true,\n position: row.position ?? 0,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction segmentPayload(input: Partial<CreateCustomerSegmentInput>): Record<string, unknown> {\n const p: Record<string, unknown> = {}\n if (input.name !== undefined) p.name = input.name\n if (input.description !== undefined) p.description = input.description\n if (input.minOrders !== undefined) p.min_orders = nullableNumber(input.minOrders)\n if (input.maxOrders !== undefined) p.max_orders = nullableNumber(input.maxOrders)\n if (input.minSpent !== undefined) p.min_spent = nullableNumber(input.minSpent)\n if (input.maxSpent !== undefined) p.max_spent = nullableNumber(input.maxSpent)\n if (input.joinedAfter !== undefined) p.joined_after = input.joinedAfter || null\n if (input.joinedBefore !== undefined) p.joined_before = input.joinedBefore || null\n return p\n}\n\nconst GIFT_CODE_ALPHABET = 'ABCDEFGHJKLMNPQRTUVWXY2346789'\n\nfunction generateGiftCardCode(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto.getRandomValues(bytes)\n const chars = Array.from(bytes, (b) => GIFT_CODE_ALPHABET[b % GIFT_CODE_ALPHABET.length])\n return `${chars.slice(0, 4).join('')}-${chars.slice(4, 8).join('')}-${chars.slice(8, 12).join('')}`\n}\n\n// Kept exported from here: it was part of this module's surface before the media\n// helpers moved to ./media.\nexport { mediaKindOf }\n\n/**\n * Every object this provider writes lands at a path of its own — a timestamp\n * prefix, never an overwrite (a replaced photo is a NEW path; see\n * replaceProductImage) — so the bytes behind a URL never change and the\n * browser and the CDN may keep them for a year. supabase-js turns the\n * seconds into `Cache-Control: max-age=…`. The default it would otherwise\n * send is one hour, which on the free-plan CDN means every image variant is\n * re-rendered from the original every hour, per point of presence — a\n * cold transform is 0.5–1.5 s, a warm one ~100 ms.\n */\nconst IMMUTABLE_OBJECT = { cacheControl: '31536000' } as const\n\n/** Where hand-uploaded assets live, as opposed to `products/{id}`. */\nconst LIBRARY_FOLDER = 'library'\n\n// ---------------------------------------------------------------------------\n// Mapeadores das entidades resgatadas da onda de 04-ago. Nenhum toca variante\n// nem o ledger de estoque — esses seguem os desta branch.\n// ---------------------------------------------------------------------------\n\nfunction nullableNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n}\n\nfunction rowToCollection(row: any): Collection {\n // Members arrive as the embedded join rows; the editorial order lives on the\n // join, so sort by it here rather than trusting PostgREST's arrival order.\n const members = (row.members ?? []) as Array<{ product_id: string; position: number | null }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n title: row.title,\n handle: row.handle ?? slugify(row.title ?? ''),\n description: row.description ?? null,\n imageUrl: row.image_url ?? null,\n seoTitle: row.seo_title ?? null,\n seoDescription: row.seo_description ?? null,\n published: row.published ?? true,\n sortOrder: row.sort_order ?? 0,\n productIds: [...members]\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0))\n .map((m) => m.product_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerGroup(row: any): CustomerGroup {\n const members = (row.members ?? []) as Array<{ customer_id: string }>\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n color: row.color ?? null,\n customerIds: members.map((m) => m.customer_id),\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToCustomerSegment(row: any): CustomerSegment {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description ?? null,\n minOrders: nullableNumber(row.min_orders),\n maxOrders: nullableNumber(row.max_orders),\n minSpent: nullableNumber(row.min_spent),\n maxSpent: nullableNumber(row.max_spent),\n joinedAfter: row.joined_after ?? null,\n joinedBefore: row.joined_before ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\n// A plg_automations_templates row: `event_key` carries the owning module\n// ('shop.order_shipped') and the shop's own vocabulary is what follows the dot.\nconst SHOP_EVENT_PREFIX = 'shop.'\nconst EMAIL_CHANNEL = 'email'\n\nfunction rowToEmailTemplate(row: any): EmailTemplate {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n event: String(row.event_key ?? '').slice(SHOP_EVENT_PREFIX.length) as EmailTemplate['event'],\n // NULL stays NULL: the catalog resolves the default (resolveEmailTemplates),\n // not this mapping. Collapsing to `false` here would silently disable every\n // template whose row exists only because its text was edited.\n enabled: row.enabled ?? null,\n // Empty string and NULL both mean \"no override\" — a subject the merchant\n // cleared should fall back to the default, not send a blank subject line.\n subject: row.subject || null,\n body: row.body || null,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nfunction rowToGiftCard(row: any): GiftCard {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n code: String(row.code ?? '').toUpperCase(),\n initialBalance: Number(row.initial_balance ?? 0),\n balance: Number(row.balance ?? 0),\n currency: row.currency ?? 'BRL',\n status: (row.status ?? 'active') as GiftCard['status'],\n expiresAt: row.expires_at ?? null,\n customerId: row.customer_id ?? null,\n customerEmail: row.customer_email ?? null,\n note: row.note ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\n/**\n * O endereço do carrinho hospedado, montado como a função de borda monta.\n *\n * Uma cópia de três linhas, e de propósito: o outro lado é Deno e não é\n * importável daqui. `vindi-runtime.test.mjs` grada a original, e a regra é\n * simples o bastante para as duas concordarem — o token pendurado no fim, uma\n * vez só.\n */\nfunction cartPaymentUrl(url: unknown, token: unknown): string | null {\n const base = String(url ?? '').trim()\n const handle = String(token ?? '').trim()\n if (!base) return null\n if (!handle || base.includes(handle)) return base\n return `${base.replace(/\\/+$/u, '')}/${handle}`\n}\n\nexport class SupabaseShopProvider implements ShopProvider {\n // ---------------------------------------------------------------------------\n // Products\n // ---------------------------------------------------------------------------\n\n async listProducts(options?: ListProductsOptions): Promise<Product[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.products).select(`*, images:${T.productImages}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.categoryId) q = q.eq('category_id', options.categoryId)\n if (options?.slug) q = q.eq('slug', options.slug)\n if (options?.search) q = q.ilike('name', `%${options.search}%`)\n q = q.order(options?.orderBy ?? 'sort_order', { ascending: options?.order !== 'desc' })\n if (options?.limit) q = q.limit(options.limit)\n if (options?.offset) q = q.range(options.offset, (options.offset ?? 0) + (options.limit ?? 50) - 1)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToProduct)\n }\n\n async getProduct(id: string): Promise<Product | null> {\n const db = getDb()\n const { data, error } = await db\n .from(T.products)\n .select(`*, images:${T.productImages}(*)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToProduct(data) : null\n }\n\n async getProductByCatalogId(catalogProductId: string): Promise<Product | null> {\n const db = getDb()\n const { data, error } = await db\n .from(T.products)\n .select(`*, images:${T.productImages}(*)`)\n .eq('product_id', catalogProductId)\n .limit(1)\n .maybeSingle()\n if (error) throw error\n return data ? rowToProduct(data) : null\n }\n\n /** Option axes + variants from the 0028 tables (spine M5). The storefront\n * RLS on both tables already restricts anon reads to active variants of\n * publicly readable products; the status filter here keeps the admin path\n * (authenticated tenant member, who CAN see archived rows) consistent. */\n async getProductVariants(\n productId: string,\n opts?: { includeArchived?: boolean },\n ): Promise<ProductVariantSet> {\n const db = getDb()\n // Reads the archetype-backed view (0084, ADR 0024): the name, sku, price and\n // options come from `public.product_variants`, which is the truth for them.\n // Filtered on the SHOP's product id, because that is the id this method is\n // given and the view carries both.\n let variantQuery = db.from(V.productVariants).select('*').eq('shop_product_id', productId)\n // The storefront must never see an archived variant (0028's public policy\n // says the same in SQL); the admin MUST, because reviving an archived row is\n // the only legal answer to re-adding a removed option value.\n if (!opts?.includeArchived) variantQuery = variantQuery.eq('status', 'active')\n const [optionsRes, variantsRes] = await Promise.all([\n db.from(T.productOptions).select('*').eq('product_id', productId).order('position', { ascending: true }),\n variantQuery.order('position', { ascending: true }),\n ])\n if (optionsRes.error) throw optionsRes.error\n if (variantsRes.error) throw variantsRes.error\n const options: ProductOption[] = (optionsRes.data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n values: Array.isArray(row.values) ? row.values.map(String) : [],\n position: row.position ?? 0,\n }))\n const variants: ProductVariant[] = (variantsRes.data ?? []).map(rowToVariant)\n return { options, variants }\n }\n\n // --- The variant admin ------------------------------------------------------\n\n async saveProductOptions(productId: string, input: ProductOptionInput[]): Promise<ProductOption[]> {\n const db = getDb()\n const tenantId = getTenantId()\n const clean = normalizeVariantAxes(input)\n const refusal = validateVariantAxes(clean)\n if (refusal) throw new Error(refusal)\n\n const { data: existing, error: readError } = await db\n .from(T.productOptions).select('*').eq('product_id', productId)\n if (readError) throw readError\n\n const byName = new Map<string, any>((existing ?? []).map((row: any) => [row.name, row]))\n const wanted = new Set(clean.map((axis) => axis.name))\n\n // Removed first: an axis renamed P→Q would otherwise collide with 0028's\n // UNIQUE (product_id, name) while the old row is still there.\n const stale = (existing ?? []).filter((row: any) => !wanted.has(row.name)).map((row: any) => row.id)\n if (stale.length > 0) {\n const { error } = await db.from(T.productOptions).delete().in('id', stale)\n if (error) throw error\n }\n\n for (const [position, axis] of clean.entries()) {\n const row = byName.get(axis.name)\n if (row) {\n const { error } = await db\n .from(T.productOptions).update({ values: axis.values, position }).eq('id', row.id)\n if (error) throw error\n } else {\n const { error } = await db.from(T.productOptions).insert({\n product_id: productId, tenant_id: tenantId, name: axis.name, values: axis.values, position,\n })\n if (error) throw error\n }\n }\n\n const { data, error } = await db\n .from(T.productOptions).select('*').eq('product_id', productId).order('position', { ascending: true })\n if (error) throw error\n return (data ?? []).map((row: any) => ({\n id: row.id,\n name: row.name,\n values: Array.isArray(row.values) ? row.values.map(String) : [],\n position: row.position ?? 0,\n }))\n }\n\n async createProductVariant(productId: string, input: CreateProductVariantInput): Promise<ProductVariant> {\n const db = getDb()\n const tenantId = getTenantId()\n if (Object.keys(input.options).length === 0) {\n throw new Error('Uma variante sem opções é a variante padrão (0037), criada pelo banco. Declare ao menos um eixo.')\n }\n\n // Revive before insert. 0028 declares UNIQUE (product_id, options) and this\n // screen archives rather than deletes, so \"add GG back\" meets the row it\n // archived an hour ago — and an INSERT would fail with a constraint error\n // the merchant cannot act on.\n const { data: existing, error: readError } = await db\n .from(V.productVariants).select('*').eq('shop_product_id', productId)\n if (readError) throw readError\n const wantedKey = variantOptionsKey(input.options)\n const match = (existing ?? []).find((row: any) => variantOptionsKey(row.options ?? {}) === wantedKey)\n if (match) return this.updateProductVariant(match.id, { ...input, status: input.status ?? 'active' })\n\n // Two rows, in this order, because the extension points AT the archetype:\n // public.product_variants holds the identity (name, sku, price, options as\n // `attributes`) and plg_shop_product_variants holds what is the shop's\n // (position, weight, image, tracking). The same shape 0086 already gave\n // `shop_ensure_default_variant` — this path, a variant a MERCHANT creates,\n // was the one nobody rewrote.\n const { data: shopProduct, error: productError } = await db\n .from(T.products).select('id, product_id, tenant_id').eq('id', productId).single()\n if (productError) throw productError\n\n // The canonical product this shop row extends — or the row itself, which is\n // 0009's bridge for a shop-native product whose id IS the canonical id.\n const canonicalProductId = shopProduct.product_id ?? shopProduct.id\n\n const { data: coreVariant, error: coreError } = await db\n .from('product_variants')\n .insert({\n tenant_id: tenantId,\n product_id: canonicalProductId,\n attributes: input.options,\n name: variantDisplayName(input.options),\n ...variantCorePatch(input),\n is_default: false,\n })\n .select('id')\n .single()\n if (coreError) throw coreError\n\n const { data, error } = await db\n .from(T.productVariants)\n .insert({\n product_id: productId,\n tenant_id: tenantId,\n variant_id: coreVariant.id,\n ...variantPatch(input),\n // NOT copied from the product: 0028 defines a null price as \"inherit the\n // product's\", and 0037's header spells out why a copy is a bug — the\n // storefront would show the new product price and the server charge the\n // frozen variant one.\n status: input.status ?? 'active',\n is_default_variant: false,\n })\n .select('id')\n .single()\n if (error) throw error\n // Read back through the view: the insert returned the extension alone, and\n // sku, price and options live on the other row.\n return this.readVariant(data.id)\n }\n\n /** One variant, as the view assembles it from both rows. */\n private async readVariant(shopVariantId: string): Promise<ProductVariant> {\n const db = getDb()\n const { data, error } = await db\n .from(V.productVariants).select('*').eq('id', shopVariantId).single()\n if (error) throw error\n return rowToVariant(data)\n }\n\n async updateProductVariant(variantId: string, input: UpdateProductVariantInput): Promise<ProductVariant> {\n const db = getDb()\n // Routed by owner, the same split as the insert. `variantId` is the SHOP\n // row's id (the view keeps it as `id`), so the archetype is reached through\n // the bridge column rather than assumed to share it.\n const { data: row, error: readError } = await db\n .from(T.productVariants).select('id, variant_id').eq('id', variantId).single()\n if (readError) throw readError\n\n const corePatch = variantCorePatch(input)\n if (Object.keys(corePatch).length > 0 && row.variant_id) {\n const { error } = await db\n .from('product_variants').update(corePatch).eq('id', row.variant_id)\n if (error) throw error\n }\n\n const shopPatch = variantPatch(input)\n if (Object.keys(shopPatch).length > 0) {\n const { error } = await db\n .from(T.productVariants).update(shopPatch).eq('id', variantId)\n if (error) throw error\n }\n\n return this.readVariant(variantId)\n }\n\n async archiveProductVariant(variantId: string): Promise<void> {\n const db = getDb()\n const { error } = await db.from(T.productVariants).update({ status: 'archived' }).eq('id', variantId)\n if (error) throw error\n }\n\n async setVariantStock(variantId: string, count: number, note?: string): Promise<number> {\n const target = Math.max(0, Math.trunc(count))\n // '' when no tenant is resolved: resolveStockStore only looks the key up in\n // the ERP-override map, and no override is ever registered under a blank id.\n const store = resolveStockStore(getTenantId() ?? '', () => createSupabaseStockStore())\n const current = await store.getAvailable(variantId)\n const delta = target - current\n if (delta === 0) return current\n\n // A variant that has never had a ledger position is not being CORRECTED, it\n // is being opened — the same taxonomy 0035 and 0037 stamp, so the movement\n // history reads honestly instead of showing every new SKU as an adjustment\n // against a balance that never existed.\n const priorMovements = await store.listMovements({ variantId, limit: 1 })\n const opening = priorMovements.length === 0 && delta > 0\n await store.recordMovement({\n variantId,\n kind: opening ? 'receipt' : 'adjustment',\n reasonCode: opening ? OPENING_BALANCE_REASON : 'correction',\n quantity: delta,\n note: note ?? 'Estoque definido na matriz de variantes.',\n })\n return target\n }\n\n async receiveVariantStock(\n variantId: string,\n quantity: number,\n options?: { reasonCode?: string; note?: string; occurredAt?: string },\n ): Promise<number> {\n const amount = Math.trunc(quantity)\n if (amount <= 0) throw new Error('A quantidade recebida precisa ser maior que zero.')\n const store = resolveStockStore(getTenantId() ?? '', () => createSupabaseStockStore())\n await store.recordMovement({\n variantId,\n kind: 'receipt',\n reasonCode: options?.reasonCode ?? 'purchase',\n quantity: amount,\n note: options?.note,\n occurredAt: options?.occurredAt,\n })\n return store.getAvailable(variantId)\n }\n\n async receiveProductStock(\n productId: string,\n quantity: number,\n options?: { variantId?: string | null; reasonCode?: string; note?: string; occurredAt?: string },\n ): Promise<number> {\n const amount = Math.trunc(quantity)\n if (amount <= 0) throw new Error('A quantidade recebida precisa ser maior que zero.')\n if (options?.variantId) {\n return this.receiveVariantStock(options.variantId, amount, options)\n }\n const { variants } = await this.getProductVariants(productId)\n if (variants.length === 1) return this.receiveVariantStock(variants[0].id, amount, options)\n if (variants.length > 1) {\n throw new Error('Este produto tem mais de uma variação — escolha qual recebeu a entrada.')\n }\n // No variant row at all: the product's own count is the stock this store\n // keeps, and shop_place_order reads it. Written through the ordinary update\n // so 0036's shim records the movement.\n //\n // A DATA não sobrevive a esta perna, e é melhor dizer isso do que fingir:\n // um UPDATE de contador não tem \"quando\", e o movimento que o shim de 0036\n // escreve nasce com occurred_at = agora. A quantidade fica certa, a data\n // vira hoje. Some junto com a perna, quando 0037 tiver rodado em todo pool.\n const product = await this.getProduct(productId)\n const now = Math.max(0, (product?.inventoryCount ?? 0)) + amount\n await this.updateProduct(productId, { inventoryCount: now })\n return now\n }\n\n async createProduct(input: CreateProductInput): Promise<Product> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.products)\n .insert({\n tenant_id: tenantId,\n // Null lets shop_ensure_canonical_product mint the catalogue row; an id\n // makes it adopt the one the stock already has.\n product_id: input.catalogProductId ?? null,\n name: input.name,\n slug: input.slug ?? slugify(input.name),\n seo_title: input.seoTitle ?? null,\n seo_description: input.seoDescription ?? null,\n description: input.description ?? null,\n price: input.price,\n compare_at_price: input.compareAtPrice ?? null,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n inventory_count: input.inventoryCount ?? 0,\n sku: input.sku ?? null,\n sort_order: input.sortOrder ?? 0,\n metadata: input.metadata ?? {},\n category_id: input.categoryId ?? null,\n is_physical: input.isPhysical ?? true,\n weight: input.weight ?? null,\n weight_unit: input.weightUnit ?? 'kg',\n height_cm: input.heightCm ?? null,\n width_cm: input.widthCm ?? null,\n length_cm: input.lengthCm ?? null,\n // Null = a padrão da loja (0047). É o estado normal, não um campo vazio.\n package_id: input.packageId ?? null,\n // NULL and not []: \"nothing declared\" and \"declared as needing nothing\"\n // are the same fact about a box, and one representation of it keeps the\n // `&&` overlap test in the 0048 trigger reading one way.\n handling: input.handling?.length ? input.handling : null,\n shipping_profile_id: input.shippingProfileId ?? null,\n })\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async updateProduct(id: string, input: UpdateProductInput): Promise<Product> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) { updates.name = input.name; updates.slug = input.slug ?? slugify(input.name) }\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.seoTitle !== undefined) updates.seo_title = input.seoTitle\n if (input.seoDescription !== undefined) updates.seo_description = input.seoDescription\n if (input.description !== undefined) updates.description = input.description\n if (input.price !== undefined) updates.price = input.price\n if (input.compareAtPrice !== undefined) updates.compare_at_price = input.compareAtPrice\n if (input.currency !== undefined) updates.currency = input.currency\n if (input.status !== undefined) updates.status = input.status\n if (input.inventoryCount !== undefined) updates.inventory_count = input.inventoryCount\n if (input.sku !== undefined) updates.sku = input.sku\n if (input.categoryId !== undefined) updates.category_id = input.categoryId\n if (input.isPhysical !== undefined) updates.is_physical = input.isPhysical\n if (input.weight !== undefined) updates.weight = input.weight\n if (input.weightUnit !== undefined) updates.weight_unit = input.weightUnit\n if (input.heightCm !== undefined) updates.height_cm = input.heightCm\n if (input.widthCm !== undefined) updates.width_cm = input.widthCm\n if (input.lengthCm !== undefined) updates.length_cm = input.lengthCm\n if (input.packageId !== undefined) updates.package_id = input.packageId || null\n if (input.handling !== undefined) updates.handling = input.handling.length ? input.handling : null\n if (input.shippingProfileId !== undefined) updates.shipping_profile_id = input.shippingProfileId ?? null\n const { data, error } = await db\n .from(T.products).update(updates).eq('id', id)\n .select(`*, images:${T.productImages}(*)`)\n .single()\n if (error) throw error\n return rowToProduct(data)\n }\n\n async deleteProduct(id: string): Promise<void> {\n const { error } = await getDb().from(T.products).delete().eq('id', id)\n if (error) throw error\n }\n\n async uploadProductImage(productId: string, rawFile: File): Promise<ProductImage> {\n const db = getDb()\n const tenantId = getTenantId()\n // The camera's original is only ever a source for renders; store a\n // bounded WebP of it (see lib/optimize-upload). Falls through untouched\n // outside a browser or for anything it should not re-encode.\n const file = await optimizeImageForUpload(rawFile)\n const path = `${tenantId}/products/${productId}/${Date.now()}-${file.name}`\n const { error: uploadErr } = await db.storage.from('shop-images').upload(path, file, IMMUTABLE_OBJECT)\n if (uploadErr) throw uploadErr\n const { data: { publicUrl } } = db.storage.from('shop-images').getPublicUrl(path)\n\n // Every upload used to land as sort_order 0 / is_primary false, so a product\n // whose only photo was uploaded here had NO primary at all, and a second one\n // tied with the first for position. New photos now go to the end, and the\n // first photo a product ever gets becomes its primary.\n const { data: existing } = await db\n .from(T.productImages)\n .select('id,sort_order')\n .eq('product_id', productId)\n .order('sort_order', { ascending: false })\n .limit(1)\n const first = !existing || existing.length === 0\n const nextOrder = first ? 0 : (existing[0].sort_order ?? 0) + 1\n\n const { data, error } = await db\n .from(T.productImages)\n .insert({\n product_id: productId, tenant_id: tenantId, url: publicUrl,\n sort_order: nextOrder, is_primary: first,\n })\n .select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async updateProductImage(\n imageId: string,\n input: { isPrimary?: boolean; sortOrder?: number; altText?: string | null },\n ): Promise<ProductImage> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n if (input.altText !== undefined) updates.alt_text = input.altText\n if (input.isPrimary !== undefined) updates.is_primary = input.isPrimary\n\n // Demote the incumbent first. Doing it after would leave a window with two\n // primaries, and if the second statement failed the product would keep two\n // for good.\n if (input.isPrimary) {\n const { data: target } = await db\n .from(T.productImages).select('product_id').eq('id', imageId).single()\n if (target?.product_id) {\n await db.from(T.productImages)\n .update({ is_primary: false })\n .eq('product_id', target.product_id)\n .neq('id', imageId)\n }\n }\n\n const { data, error } = await db\n .from(T.productImages).update(updates).eq('id', imageId).select().single()\n if (error) throw error\n return rowToImage(data)\n }\n\n async replaceProductImage(imageId: string, file: File): Promise<ProductImage> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data: row, error: readErr } = await db\n .from(T.productImages).select('id,url,product_id').eq('id', imageId).single()\n if (readErr) throw readErr\n\n // New object, same row. Overwriting the old path would keep the URL — and\n // the CDN would keep serving the old photo from cache, which is exactly the\n // thing the merchant is here to fix.\n const path = `${tenantId}/products/${row.product_id}/${Date.now()}-${file.name}`\n const bucket = db.storage.from(T.mediaBucket)\n const { error: uploadErr } = await bucket.upload(path, file, IMMUTABLE_OBJECT)\n if (uploadErr) throw uploadErr\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n\n const { data, error } = await db\n .from(T.productImages).update({ url: publicUrl }).eq('id', imageId).select().single()\n if (error) throw error\n\n // Only after the row points somewhere else: a failure above leaves the photo\n // intact, and dropping the old file first would leave it pointing at nothing.\n await this.removeUnreferencedObject(row.url)\n return rowToImage(data)\n }\n\n async deleteProductImage(imageId: string): Promise<void> {\n const db = getDb()\n const { data: row } = await db\n .from(T.productImages).select('url').eq('id', imageId).maybeSingle()\n const { error } = await db.from(T.productImages).delete().eq('id', imageId)\n if (error) throw error\n if (row?.url) await this.removeUnreferencedObject(row.url)\n }\n\n /**\n * Drop a stored file once nothing points at it anymore.\n *\n * The row was the only thing keeping the object reachable, so leaving it\n * behind is a file nobody can see and nobody can delete — and the bill for it\n * arrives all the same. Two rows can share one URL (a duplicated product), and\n * the survivor has to keep working, so the count decides.\n */\n private async removeUnreferencedObject(url: string | null | undefined): Promise<void> {\n const path = url ? storagePathOf(url) : null\n if (!path) return\n const db = getDb()\n const { count } = await db\n .from(T.productImages).select('id', { count: 'exact', head: true }).eq('url', url)\n if (count) return\n await db.storage.from(T.mediaBucket).remove([path])\n }\n\n // ---------------------------------------------------------------------------\n // Categories\n // ---------------------------------------------------------------------------\n\n async listCategories(): Promise<Category[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.categories).select('*').order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCategory)\n }\n\n async createCategory(input: CreateCategoryInput): Promise<Category> {\n const db = getDb()\n const { data, error } = await db\n .from(T.categories)\n .insert({ tenant_id: getTenantId(), name: input.name, slug: input.slug ?? slugify(input.name), description: input.description ?? null, parent_id: input.parentId ?? null, sort_order: input.sortOrder ?? 0 })\n .select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async updateCategory(id: string, input: UpdateCategoryInput): Promise<Category> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.slug !== undefined) updates.slug = input.slug\n if (input.description !== undefined) updates.description = input.description\n if (input.parentId !== undefined) updates.parent_id = input.parentId\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n const { data, error } = await db.from(T.categories).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCategory(data)\n }\n\n async deleteCategory(id: string): Promise<void> {\n const { error } = await getDb().from(T.categories).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Orders\n // ---------------------------------------------------------------------------\n\n async listOrders(options?: ListOrdersOptions): Promise<Order[]> {\n const db = getDb()\n const tenantId = getTenantId()\n // Read through the archetype (V), write through the plugin table (T) —\n // see the note on `V` in ./tables. Reaching the archetype needs the tenant\n // header the client now sends (145); without it these answered zero for\n // anyone with more than one account.\n let q = db.from(V.orders).select(`*, items:${V.orderItems}(*)`)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.financialStatus) q = q.eq('financial_status', options.financialStatus)\n if (options?.fulfillmentStatus) q = q.eq('fulfillment_status', options.fulfillmentStatus)\n if (options?.customerId) q = q.eq('customer_id', options.customerId)\n if (options?.customerEmail) q = q.eq('customer_email', options.customerEmail)\n if (options?.search) q = q.or(`customer_name.ilike.%${options.search}%,customer_email.ilike.%${options.search}%`)\n q = q.order('created_at', { ascending: false })\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToOrder)\n }\n\n async getOrder(id: string): Promise<Order | null> {\n const db = getDb()\n const { data, error } = await db\n .from(V.orders).select(`*, items:${V.orderItems}(*)`)\n .eq('id', id).maybeSingle()\n if (error) throw error\n if (!data) return null\n const order = rowToOrder(data)\n // Nasceu na vitrine? A sessão de checkout é a marca. Uma consulta a mais só\n // no detalhe — a listagem não precisa saber, e pagaria por linha.\n const { data: session } = await db\n .from(T.checkoutSessions).select('id').eq('order_id', id).limit(1)\n order.origin = (session?.length ?? 0) > 0 ? 'storefront' : 'admin'\n return order\n }\n\n async createOrder(input: CreateOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = getTenantId()\n const subtotal = input.items.reduce((s, i) => s + i.quantity * i.unitPrice, 0)\n const discountTotal = input.discountTotal ?? 0\n const shippingTotal = input.shippingTotal ?? 0\n const total = Math.round((subtotal - discountTotal + shippingTotal) * 100) / 100\n const { data: order, error: orderErr } = await db\n .from(T.orders)\n .insert({ tenant_id: tenantId, customer_id: input.customerId ?? null, customer_name: input.customerName ?? null, customer_email: input.customerEmail ?? null, currency: input.currency ?? 'BRL', notes: input.notes ?? null, subtotal, discount_total: discountTotal, shipping_total: shippingTotal, discount_code: input.discountCode ?? null, total, status: 'open', financial_status: 'pending', fulfillment_status: 'unfulfilled' })\n .select().single()\n if (orderErr) throw orderErr\n const items = input.items.map(i => ({ order_id: order.id, product_id: asUuid(i.productId), name: i.name, sku: i.sku ?? null, quantity: i.quantity, unit_price: i.unitPrice, total: i.quantity * i.unitPrice, image_url: i.imageUrl ?? null }))\n await db.from(T.orderItems).insert(items)\n return this.getOrder(order.id) as Promise<Order>\n }\n\n async updateOrder(id: string, input: UpdateOrderInput): Promise<Order> {\n const updates: Record<string, unknown> = {}\n if (input.status !== undefined) updates.status = input.status\n if (input.financialStatus !== undefined) updates.financial_status = input.financialStatus\n if (input.fulfillmentStatus !== undefined) updates.fulfillment_status = input.fulfillmentStatus\n if (input.notes !== undefined) updates.notes = input.notes\n const { error } = await getDb().from(T.orders).update(updates).eq('id', id)\n if (error) throw error\n return this.getOrder(id) as Promise<Order>\n }\n\n // -------------------------------------------------------------------------\n // Delivery zones\n //\n // Postal codes are stored as 8 bare digits so the range test in\n // shop_quote_shipping is a plain BETWEEN. Accepting '22.041-001' from the\n // form and normalising here means the merchant never has to think about it.\n // -------------------------------------------------------------------------\n async listShippingZones(): Promise<ShippingZone[]> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .select('*')\n .eq('tenant_id', tenantId)\n .order('sort_order', { ascending: true })\n .order('postal_from', { ascending: true })\n if (error) throw error\n return (data ?? []).map(rowToShippingZone)\n }\n\n async createShippingZone(input: CreateShippingZoneInput): Promise<ShippingZone> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingZone requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .insert({ tenant_id: tenantId, ...shippingZonePayload(input) })\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n async updateShippingZone(id: string, input: UpdateShippingZoneInput): Promise<ShippingZone> {\n const { data, error } = await getDb()\n .from(T.shippingZones)\n .update(shippingZonePayload(input))\n .eq('id', id)\n .select()\n .single()\n if (error) throw error\n return rowToShippingZone(data)\n }\n\n // -------------------------------------------------------------------------\n // Embalagens (0046)\n //\n // `is_default` has a partial unique index behind it, so promoting a box has\n // to demote the previous one in the same round trip — otherwise the second\n // default is refused by the database and the merchant sees a save that\n // failed for a reason the screen cannot explain.\n // -------------------------------------------------------------------------\n async listShippingPackages(): Promise<ShippingPackage[]> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingPackages)\n .select('*')\n .eq('tenant_id', tenantId)\n .order('is_default', { ascending: false })\n .order('name', { ascending: true })\n if (error) throw error\n return (data ?? []).map(rowToShippingPackage)\n }\n\n async createShippingPackage(input: CreateShippingPackageInput): Promise<ShippingPackage> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingPackage requires a tenant id.')\n if (input.isDefault) await this.clearDefaultPackage(tenantId)\n const { data, error } = await getDb()\n .from(T.shippingPackages)\n .insert({ tenant_id: tenantId, ...shippingPackagePayload(input) })\n .select()\n .single()\n if (error) throw error\n return rowToShippingPackage(data)\n }\n\n async updateShippingPackage(id: string, input: UpdateShippingPackageInput): Promise<ShippingPackage> {\n const tenantId = getTenantId()\n if (input.isDefault && tenantId) await this.clearDefaultPackage(tenantId, id)\n const { data, error } = await getDb()\n .from(T.shippingPackages)\n .update(shippingPackagePayload(input))\n .eq('id', id)\n .select()\n .single()\n if (error) throw error\n return rowToShippingPackage(data)\n }\n\n async deleteShippingPackage(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingPackages).delete().eq('id', id)\n if (error) throw error\n }\n\n private async clearDefaultPackage(tenantId: string, exceptId?: string): Promise<void> {\n let query = getDb()\n .from(T.shippingPackages)\n .update({ is_default: false })\n .eq('tenant_id', tenantId)\n .eq('is_default', true)\n if (exceptId) query = query.neq('id', exceptId)\n const { error } = await query\n if (error) throw error\n }\n\n async deleteShippingZone(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingZones).delete().eq('id', id)\n if (error) throw error\n }\n\n // -------------------------------------------------------------------------\n // Store policy + delivery fallback (0044b / 0015)\n //\n // Both are ONE ROW PER TENANT, and both are upserted rather than\n // insert-or-update: a store that never opened these screens has no row, and\n // making the first save conditional on discovering that is two round trips to\n // learn something the primary key already knows.\n // -------------------------------------------------------------------------\n async getShippingSettings(): Promise<ShippingSettings | null> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.shippingSettings)\n .select('flat_rate, free_above, currency')\n .eq('tenant_id', tenantId)\n .maybeSingle()\n if (error) throw error\n if (!data) return null\n return {\n flatRate: Number(data.flat_rate ?? 0),\n freeAbove: data.free_above == null ? null : Number(data.free_above),\n currency: data.currency ?? 'BRL',\n }\n }\n\n async updateShippingSettings(input: UpdateShippingSettingsInput): Promise<ShippingSettings> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: updateShippingSettings requires a tenant id.')\n const payload: Record<string, unknown> = { tenant_id: tenantId }\n if (input.flatRate !== undefined) payload.flat_rate = input.flatRate\n // Null is a VALUE here — \"no free-delivery threshold\" — so it is written\n // rather than skipped. Only `undefined` means \"leave it alone\".\n if (input.freeAbove !== undefined) payload.free_above = input.freeAbove\n if (input.currency !== undefined) payload.currency = input.currency\n const { data, error } = await getDb()\n .from(T.shippingSettings)\n .upsert(payload, { onConflict: 'tenant_id' })\n .select('flat_rate, free_above, currency')\n .single()\n if (error) throw error\n return {\n flatRate: Number(data.flat_rate ?? 0),\n freeAbove: data.free_above == null ? null : Number(data.free_above),\n currency: data.currency ?? 'BRL',\n }\n }\n\n /**\n * \"Does this store deliver here?\" — asked with the address, before the card.\n *\n * Degrades to \"yes, and not our own zone\" on any failure. A store that cannot\n * reach the check must not stop selling: the order itself is still refused by\n * the 0048 trigger if the region really is excluded, so the worst case is the\n * shopper learning it one screen later instead of never selling at all.\n */\n async listShippingProfiles(): Promise<ShippingProfile[]> {\n const { data, error } = await getDb()\n .from(T.shippingProfiles)\n .select('*')\n .eq('tenant_id', getTenantId())\n .order('is_default', { ascending: false })\n .order('name')\n if (error) throw error\n return (data ?? []).map(rowToShippingProfile)\n }\n\n async createShippingProfile(input: CreateShippingProfileInput): Promise<ShippingProfile> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createShippingProfile requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.shippingProfiles)\n .insert({ tenant_id: tenantId, ...shippingProfilePayload(input) })\n .select('*')\n .single()\n if (error) throw error\n return rowToShippingProfile(data)\n }\n\n async updateShippingProfile(id: string, input: UpdateShippingProfileInput): Promise<ShippingProfile> {\n const { data, error } = await getDb()\n .from(T.shippingProfiles)\n .update(shippingProfilePayload(input))\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw error\n return rowToShippingProfile(data)\n }\n\n async deleteShippingProfile(id: string): Promise<void> {\n const { error } = await getDb().from(T.shippingProfiles).delete().eq('id', id)\n if (error) throw error\n }\n\n // Places the store ships from (0058). Default first, then by name — the same\n // order the ledger's listLocations() uses, so the two screens agree.\n async listStockLocations(): Promise<StockLocation[]> {\n const { data, error } = await getDb()\n .from(T.stockLocations)\n .select('*')\n .eq('tenant_id', getTenantId())\n .order('is_default', { ascending: false })\n .order('name')\n if (error) throw error\n return (data ?? []).map(rowToStockLocation)\n }\n\n async createStockLocation(input: CreateStockLocationInput): Promise<StockLocation> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: createStockLocation requires a tenant id.')\n if (input.isDefault) await this.clearDefaultStockLocation(tenantId)\n const payload = stockLocationPayload(input)\n if (payload.code === undefined) payload.code = toLocationCode(input.name)\n const { data, error } = await getDb()\n .from(T.stockLocations)\n .insert({ tenant_id: tenantId, ...payload })\n .select('*')\n .single()\n if (error) throw locationWriteError(error)\n return rowToStockLocation(data)\n }\n\n async updateStockLocation(id: string, input: UpdateStockLocationInput): Promise<StockLocation> {\n const tenantId = getTenantId()\n // Clear the old default first: 0034's partial unique index allows exactly\n // one, so writing the new one first fails instead of moving the flag.\n if (input.isDefault && tenantId) await this.clearDefaultStockLocation(tenantId, id)\n const { data, error } = await getDb()\n .from(T.stockLocations)\n .update(stockLocationPayload(input))\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw locationWriteError(error)\n return rowToStockLocation(data)\n }\n\n async deleteStockLocation(id: string): Promise<void> {\n const { error } = await getDb().from(T.stockLocations).delete().eq('id', id)\n if (error) throw locationWriteError(error)\n }\n\n private async clearDefaultStockLocation(tenantId: string, exceptId?: string): Promise<void> {\n let query = getDb()\n .from(T.stockLocations)\n .update({ is_default: false })\n .eq('tenant_id', tenantId)\n .eq('is_default', true)\n if (exceptId) query = query.neq('id', exceptId)\n const { error } = await query\n if (error) throw error\n }\n\n async findAreas(query: string, limit = 12): Promise<AreaCandidate[]> {\n const text = String(query ?? '').trim()\n if (text.length < 2) return []\n const { data, error } = await getDb().rpc('shop_find_areas', {\n p_query: text,\n p_limit: limit,\n // What the store's own state is, so \"Ipanema\" does not offer a town in\n // Minas Gerais above the Rio neighbourhood to a store dispatching from\n // Barra da Tijuca. Null is fine — the search just stops ranking by it.\n p_tenant_id: getTenantId() ?? null,\n })\n if (error) return []\n return (data ?? []).map((row: any) => ({\n kind: row.kind,\n label: row.label ?? '',\n cityCode: row.city_code ?? null,\n cityName: row.city_name ?? null,\n state: row.state ?? null,\n districtKey: row.district_key ?? null,\n members: Array.isArray(row.members)\n ? row.members.map((m: any) => ({\n kind: m.kind,\n label: m.label ?? '',\n cityCode: m.city_code ?? null,\n districtKey: m.district_key ?? null,\n }))\n : undefined,\n knownPostalCodes: Number(row.known_postal_codes ?? 0),\n matchedAs: row.matched_as ?? null,\n }))\n }\n\n /**\n * Está aberta agora? (0094)\n *\n * `null` é uma resposta de primeira classe e a mais importante delas: a base\n * ainda não recebeu a 0094, a função não existe, e quem chama trata isso como\n * \"sempre aberta\" — que é exatamente o que a loja era ontem. Um throw aqui\n * derrubaria a vitrine de sete lojas por causa de uma migration que não é\n * delas.\n */\n async getServiceStatus(fulfillmentType?: FulfillmentType): Promise<ServiceStatus | null> {\n const tenantId = getTenantId()\n if (!tenantId) return null\n const { data, error } = await getDb().rpc('shop_service_status', {\n p_tenant_id: tenantId,\n p_fulfillment_type: fulfillmentType ?? 'delivery',\n })\n if (error) return null\n const row = Array.isArray(data) ? data[0] : data\n if (!row) return null\n return {\n open: Boolean(row.open),\n configured: Boolean(row.configured),\n timezone: row.timezone ?? 'America/Sao_Paulo',\n closesAt: row.closes_at ?? null,\n nextOpenAt: row.next_open_at ?? null,\n reason: row.reason ?? 'open',\n }\n }\n\n /** As janelas agendáveis. Vazio = esta loja não agenda, e a tela não oferece. */\n async listScheduleSlots(\n fulfillmentType?: FulfillmentType,\n from?: string,\n ): Promise<ScheduleSlot[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb().rpc('shop_schedule_slots', {\n p_tenant_id: tenantId,\n p_fulfillment_type: fulfillmentType ?? 'delivery',\n ...(from ? { p_from: from } : {}),\n })\n if (error) return []\n return (data ?? []).map((row: any) => ({\n startsAt: row.starts_at,\n endsAt: row.ends_at,\n }))\n }\n\n /** O horário semanal, para a tela que o mostra. Vazio = nada declarado. */\n async listServiceHours(fulfillmentType?: FulfillmentType): Promise<ServiceHours[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb()\n .from('plg_shop_service_hours')\n .select('weekday,opens_at,closes_at,fulfillment_type')\n .eq('tenant_id', tenantId)\n .eq('active', true)\n .order('weekday', { ascending: true })\n .order('opens_at', { ascending: true })\n // Base sem a 0094: a tabela não existe. Ausência, não erro — a loja\n // simplesmente não declara horário, que é o estado de todas elas ontem.\n if (error) return []\n const type = fulfillmentType ?? 'delivery'\n return (data ?? [])\n .filter((row: any) => row.fulfillment_type == null || row.fulfillment_type === type)\n .map((row: any) => ({\n weekday: Number(row.weekday),\n opensAt: String(row.opens_at),\n closesAt: String(row.closes_at),\n fulfillmentType: row.fulfillment_type ?? null,\n }))\n }\n\n async checkDelivery(postalCode: string, address?: PostalAddressHint): Promise<DeliveryCheck> {\n const tenantId = getTenantId()\n // The raw digits, not toPostalDigits: that one left-pads, which turns a\n // half-typed '20' into '00000020' and would answer about a zone in Acre.\n const digits = String(postalCode ?? '').replace(/\\D/g, '')\n if (!tenantId || digits.length !== 8) return { refused: false, ownZone: false }\n const { data, error } = await getDb().rpc('shop_delivery_check', {\n p_tenant_id: tenantId,\n p_postal_code: digits,\n // Only ever a HINT. The server prefers what it resolved itself\n // (public.postal_areas) and answers address_resolved=false when it had to\n // fall back to this — 0081 §4.\n p_address: addressHintPayload(address),\n })\n if (error) return { refused: false, ownZone: false }\n const row = Array.isArray(data) ? data[0] : data\n return {\n refused: Boolean(row?.refused),\n refusedZone: row?.refused_zone ?? null,\n ownZone: Boolean(row?.own_zone),\n outcome: row?.outcome ?? null,\n zoneName: row?.zone_name ?? null,\n addressResolved: row?.address_resolved !== false,\n }\n }\n\n async getStoreSettings(): Promise<StoreSettings | null> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.settings)\n .select('*')\n .eq('tenant_id', tenantId)\n .maybeSingle()\n if (error) throw error\n return data ? rowToStoreSettings(data) : null\n }\n\n async updateStoreSettings(input: UpdateStoreSettingsInput): Promise<StoreSettings> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: updateStoreSettings requires a tenant id.')\n const { data, error } = await getDb()\n .from(T.settings)\n .upsert({ tenant_id: tenantId, ...storeSettingsPayload(input) }, { onConflict: 'tenant_id' })\n .select('*')\n .single()\n if (error) throw error\n return rowToStoreSettings(data)\n }\n\n /**\n * The shopper's read. Through the RPC, not the table: the table is closed to\n * anon on purpose (0029) and shop_store_settings() is the narrow window —\n * storefront fields only, and only for a published store.\n */\n async getPublicStoreSettings(): Promise<StoreSettings | null> {\n const tenantId = getTenantId()\n if (!tenantId) return null\n const { data, error } = await getDb().rpc('shop_store_settings', { p_tenant_id: tenantId })\n if (error) throw error\n const row = Array.isArray(data) ? data[0] : data\n return row ? rowToStoreSettings(row) : null\n }\n\n /** The delivery policy a shopper may know (0130). A pool without it: none. */\n async getPublicDeliveryPolicy(): Promise<PublicDeliveryPolicy | null> {\n const tenantId = getTenantId()\n if (!tenantId) return null\n const { data, error } = await getDb().rpc('shop_public_delivery', { p_tenant_id: tenantId })\n if (error) return null\n return toPublicDeliveryPolicy(Array.isArray(data) ? data[0] : data)\n }\n\n /** Markets (0116), through the anon-safe RPC. A pool without 0116: none. */\n async listMarkets(): Promise<ShopMarket[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb().rpc('shop_public_markets', { p_tenant_id: tenantId })\n if (error) return []\n return ((data ?? []) as Record<string, unknown>[]).map((row: Record<string, unknown>) => ({\n code: String(row.code),\n name: String(row.name),\n currency: String(row.currency),\n locale: (row.locale as string | null) ?? null,\n countries: Array.isArray(row.countries) ? (row.countries as string[]) : [],\n isDefault: Boolean(row.is_default),\n paymentProvider: (row.payment_provider as string | null) ?? null,\n shippingFlatRate: Number(row.shipping_flat_rate ?? 0),\n shippingFreeAbove: row.shipping_free_above == null ? null : Number(row.shipping_free_above),\n }))\n }\n\n async listAdminMarkets(): Promise<AdminShopMarket[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb()\n .from('plg_shop_markets')\n .select('*')\n .eq('tenant_id', tenantId)\n .order('is_default', { ascending: false })\n .order('code')\n if (error) throw error\n return ((data ?? []) as Record<string, unknown>[]).map((row: Record<string, unknown>): AdminShopMarket => ({\n id: String(row.id),\n code: String(row.code),\n name: String(row.name),\n currency: String(row.currency),\n locale: (row.locale as string | null) ?? null,\n countries: Array.isArray(row.countries) ? (row.countries as string[]) : [],\n isDefault: Boolean(row.is_default),\n isActive: Boolean(row.is_active),\n paymentProvider: (row.payment_provider as string | null) ?? null,\n shippingFlatRate: Number(row.shipping_flat_rate ?? 0),\n shippingFreeAbove: row.shipping_free_above == null ? null : Number(row.shipping_free_above),\n priceTableId: (row.price_table_id as string | null) ?? null,\n}))\n }\n\n /**\n * Product-level rows of each market's price table for a CATALOGUE product\n * (public.products.id — what price_table_items keys on). Variant rows are\n * left alone: this is the product's price, a variant can still override it.\n */\n async getCatalogMarketPrices(catalogProductId: string): Promise<CatalogMarketPrice[]> {\n const markets = await this.listAdminMarkets()\n const tables = markets.map((m) => m.priceTableId).filter((id): id is string => !!id)\n if (!tables.length) return markets.map((m) => ({ marketId: m.id, price: null }))\n const { data, error } = await getDb()\n .from('price_table_items')\n .select('price_table_id, price')\n .eq('product_id', catalogProductId)\n .is('variant_id', null)\n .eq('min_qty', 1)\n .in('price_table_id', tables)\n if (error) throw error\n const byTable = new Map(((data ?? []) as { price_table_id: string; price: number }[]).map((r) => [r.price_table_id, Number(r.price)]))\n return markets.map((m) => ({ marketId: m.id, price: m.priceTableId ? byTable.get(m.priceTableId) ?? null : null }))\n }\n\n async setCatalogMarketPrice(catalogProductId: string, marketId: string, price: number | null): Promise<void> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('Nenhuma loja selecionada')\n const market = (await this.listAdminMarkets()).find((m) => m.id === marketId)\n if (!market?.priceTableId) throw new Error('Este mercado ainda não tem tabela de preço')\n const db = getDb()\n const { data: existing, error: readError } = await db\n .from('price_table_items')\n .select('id')\n .eq('price_table_id', market.priceTableId)\n .eq('product_id', catalogProductId)\n .is('variant_id', null)\n .eq('min_qty', 1)\n .maybeSingle()\n if (readError) throw readError\n if (price == null) {\n if (existing) {\n const { error } = await db.from('price_table_items').delete().eq('id', (existing as { id: string }).id)\n if (error) throw error\n }\n return\n }\n if (existing) {\n const { error } = await db.from('price_table_items').update({ price }).eq('id', (existing as { id: string }).id)\n if (error) throw error\n return\n }\n const { error } = await db.from('price_table_items').insert({\n tenant_id: tenantId,\n price_table_id: market.priceTableId,\n product_id: catalogProductId,\n price,\n min_qty: 1,\n })\n if (error) throw error\n }\n\n async getMarketPrices(market: string): Promise<MarketPrice[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data, error } = await getDb().rpc('shop_public_market_prices', { p_tenant_id: tenantId, p_market: market })\n if (error) return []\n return ((data ?? []) as Record<string, unknown>[]).map((row) => ({\n productId: String(row.product_id),\n variantId: (row.variant_id as string | null) ?? null,\n price: Number(row.price),\n }))\n }\n\n /**\n * Settle a pending order: the merchant confirming that the money arrived.\n *\n * Goes through the RPC rather than an UPDATE so the payment ledger row in\n * public.transactions closes in the same transaction as the order — set\n * financial_status by hand and the order says paid while the ledger still\n * says pending. Since 0019 the RPC also enforces who may call it: a member of\n * the owning tenant, or a PSP webhook with the service role.\n */\n async confirmPayment(id: string, reference?: string): Promise<Order | null> {\n const { error } = await getDb().rpc('shop_confirm_payment', {\n p_order_id: id,\n p_reference: reference ?? null,\n })\n if (error) throw error\n return this.getOrder(id)\n }\n\n // ---------------------------------------------------------------------------\n // Carrier labels. Everything goes through the function: the token never\n // reaches the browser, and `buy` is the one call that spends money.\n // ---------------------------------------------------------------------------\n\n private async labelCall(orderId: string, action: string, extra: Record<string, unknown> = {}) {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: shipping labels require a tenant id.')\n const { ok, payload } = await callShopFunction(getDb(), 'shop-shipping-label', {\n tenantId, orderId, action, ...extra,\n })\n if (!ok) throw new Error(payload?.error ?? 'A transportadora não respondeu agora.')\n return payload\n }\n\n async quoteShippingLabel(orderId: string, carrier?: string) {\n const payload = await this.labelCall(orderId, 'quote', carrier ? { carrier } : {})\n return {\n options: (payload?.options ?? []).map((option: any) => ({\n serviceId: Number(option.service_id ?? option.serviceId),\n name: String(option.name ?? 'Entrega'),\n carrier: String(option.carrier ?? ''),\n price: Number(option.price ?? 0),\n etaMinDays: option.eta_min_days ?? null,\n etaMaxDays: option.eta_max_days ?? null,\n })),\n label: payload?.label\n ? {\n labelId: String(payload.label.external_id),\n labelUrl: payload.label.url ?? null,\n status: payload.label.status ?? null,\n tracking: payload.label.payload?.tracking ?? null,\n }\n : null,\n }\n }\n\n /** Spends the merchant's balance at the carrier. Never call it on a whim. */\n async buyShippingLabel(orderId: string, serviceId: number, carrier?: string) {\n const payload = await this.labelCall(orderId, 'buy', { serviceId, ...(carrier ? { carrier } : {}) })\n return {\n labelId: String(payload?.labelId ?? ''),\n labelUrl: payload?.labelUrl ?? null,\n status: 'bought',\n tracking: payload?.tracking ?? null,\n }\n }\n\n async printShippingLabel(orderId: string, carrier?: string) {\n const payload = await this.labelCall(orderId, 'print', carrier ? { carrier } : {})\n return payload?.labelUrl ?? null\n }\n\n /** Drop-off points near a place. Store configuration — no order involved. */\n async listShippingAgencies(query: { state?: string; city?: string; carrier?: string }) {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { ok, payload } = await callShopFunction(getDb(), 'shop-shipping-label', {\n tenantId,\n action: 'agencies',\n state: query.state ?? '',\n city: query.city ?? '',\n ...(query.carrier ? { carrier: query.carrier } : {}),\n })\n if (!ok) throw new Error(payload?.error ?? 'A transportadora não respondeu agora.')\n return (payload?.agencies ?? []) as ShippingAgency[]\n }\n\n async trackShippingLabel(orderId: string, carrier?: string) {\n const payload = await this.labelCall(orderId, 'track', carrier ? { carrier } : {})\n return payload?.tracking ?? null\n }\n\n /**\n * The customer's address book, for the console. `shop_place_order` files a\n * new one here on every delivered order, and until now only the storefront\n * read them back — so a repeat customer had their address retyped by hand.\n */\n async listCustomerAddresses(customerId: string): Promise<CustomerAddress[]> {\n if (!asUuid(customerId)) return []\n const { data, error } = await getDb()\n .from('addresses')\n .select('id,label,recipient,phone,postal_code,street,number,complement,district,city,state,country,is_default')\n .eq('owner_type', 'shop_customer')\n .eq('owner_id', customerId)\n .order('is_default', { ascending: false })\n .order('created_at', { ascending: false })\n if (error) return []\n return (data ?? []).map((row: any) => ({\n id: row.id,\n label: row.label ?? undefined,\n recipient: row.recipient ?? undefined,\n phone: row.phone ?? undefined,\n postalCode: row.postal_code ?? '',\n street: row.street ?? '',\n number: row.number ?? undefined,\n complement: row.complement ?? undefined,\n district: row.district ?? undefined,\n city: row.city ?? '',\n state: row.state ?? '',\n country: row.country ?? undefined,\n isDefault: row.is_default ?? false,\n }))\n }\n\n /**\n * What delivery costs to a postcode — the same answer the shopper gets.\n *\n * The console needs it to quote a price out loud while the customer is on the\n * line. Carrier first (when the merchant did not turn gateway quotes off),\n * zones as the fallback, exactly as the storefront resolves it. Advisory\n * either way: shop_place_order requotes and ignores whatever a client sends.\n */\n async quoteShipping(\n postalCode: string,\n subtotal: number,\n address?: PostalAddressHint,\n ): Promise<ShippingQuoteOption[]> {\n const digits = toPostalDigits(postalCode)\n if (!digits) return []\n const tenantId = getTenantId()\n if (!tenantId) return []\n\n // Refusal is checked BEFORE the carrier, not after. The gateway does not\n // know the store refuses a region, so asking it first would put a price on\n // an address the order is going to reject — 0081 §6 does the same inside\n // shop_quote_shipping, and this is the same rule on the branch that never\n // reaches it.\n const refusal = await this.checkDelivery(digits, address).catch(() => null)\n if (refusal?.refused) return []\n\n const settings = await this.getStoreSettings().catch(() => null)\n if (settings?.carrierQuotes !== false) {\n try {\n const { ok, payload } = await callShopFunction(getDb(), 'shop-shipping-quote', {\n tenantId, postalCode: digits, subtotal,\n })\n const rows: any[] = ok ? (payload?.options ?? []) : []\n if (rows.length > 0) {\n return rows.map((row) => ({\n zoneId: String(row.service_id ?? ''),\n name: String(row.name ?? 'Entrega'),\n carrier: row.carrier ?? undefined,\n rate: Number(row.price ?? 0),\n baseRate: Number(row.price ?? 0),\n freeAbove: null,\n etaMinDays: row.eta_min_days ?? undefined,\n etaMaxDays: row.eta_max_days ?? undefined,\n free: Number(row.price ?? 0) === 0,\n }))\n }\n } catch {\n /* no carrier connected, or the bench is down: the zones still answer */\n }\n }\n\n const { data, error } = await getDb().rpc('shop_quote_shipping', {\n p_tenant_id: tenantId,\n p_postal_code: digits,\n p_subtotal: subtotal,\n p_address: addressHintPayload(address),\n })\n if (error) return []\n if (!data?.length) {\n // No zone answered: what shop_place_order charges (shop_shipping_for) is\n // the store's base rate, and [] would read as \"not delivered here\".\n const { data: rate } = await getDb().rpc('shop_shipping_for', {\n p_tenant_id: tenantId, p_subtotal: subtotal, p_postal_code: digits,\n })\n if (rate == null) return []\n const value = Number(rate)\n return [{ zoneId: 'store-base-rate', name: 'Entrega', rate: value, baseRate: value, freeAbove: null, free: value === 0 }]\n }\n return (data ?? []).map((row: any) => ({\n zoneId: row.zone_id,\n name: row.name,\n carrier: row.carrier ?? undefined,\n rate: Number(row.rate ?? 0),\n baseRate: Number(row.base_rate ?? row.rate ?? 0),\n freeAbove: row.free_above == null ? null : Number(row.free_above),\n etaMinDays: row.eta_min_days ?? undefined,\n etaMaxDays: row.eta_max_days ?? undefined,\n free: Boolean(row.free),\n }))\n }\n\n /**\n * Charge a cart that is not an order yet — the phone sale, from the counter's\n * side. Same door the storefront uses, on purpose: `shop_price_cart` inside\n * the function reprices everything, so the console sends products and\n * quantities and never money. The order is born in `settleCheckoutSession`,\n * once the acquirer says the Pix landed, so an abandoned charge leaves no\n * ghost order holding stock.\n */\n async openCheckoutSession(input: CheckoutSessionInput): Promise<CheckoutSession> {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: openCheckoutSession requires a tenant id.')\n // Qual porta bater. Quem chama pode dizer; quem não diz, herda o que a LOJA\n // configurou em Ajustes › Pagamento.\n //\n // O padrão era 'abacatepay' direto — o que fazia sentido quando havia um\n // gateway só, e virou um bug silencioso quando passou a haver dois: uma\n // loja na Vindi pedia um link e a cobrança ia abrir na AbacatePay, que não\n // conhece a conta dela. Nenhuma das duas telas passava `provider`, então\n // TODA cobrança do console saía pela porta errada.\n //\n // 'abacatepay' segue como último recurso, para uma loja antiga cujo ajuste\n // nunca foi preenchido continuar cobrando como sempre cobrou.\n const provider = resolveCheckoutProvider(\n input.provider,\n // Só vai ao banco quando ninguém disse: a vitrine já sabe o seu.\n input.provider == null\n ? (await this.getStoreSettings().catch(() => null))?.paymentProvider\n : null,\n )\n const gateway = checkoutGateway(provider)\n if (!gateway) {\n throw new Error('Esta loja ainda não tem um meio de cobrança conectado.')\n }\n // A link is a capability, not a provider: the panel asks the table whether\n // this acquirer mints one, and a store whose gateway cannot is told here\n // rather than by a function answering something the screen cannot use.\n if (input.asLink && !gateway.link) {\n throw new Error('O meio de cobrança desta loja ainda não gera link de pagamento.')\n }\n\n const { ok, status, payload } = await callShopFunction(getDb(), gateway.open, {\n tenantId,\n items: input.items.map((item) => ({\n productId: item.productId,\n optionsLabel: item.optionsLabel ?? null,\n quantity: item.quantity,\n })),\n customer: input.customer,\n shippingAddress: input.shippingAddress ?? null,\n discountCode: input.discountCode ?? null,\n market: input.market ?? null,\n country: input.country ?? input.shippingAddress?.country ?? null,\n // What the buyer chose, in the store's words. The gateway translates it to\n // whatever its own API calls that method, and refuses if the merchant\n // never enabled it — which is a different answer from \"no acquirer\".\n method: input.paymentMethod ?? null,\n returnUrl: input.returnUrl ?? null,\n asLink: input.asLink === true,\n // The card, when it is typed INSIDE the store — a single-use token from\n // the acquirer's own browser SDK, never a card number. Forwarded here for\n // the same reason it is forwarded in @fayz-ai/sdk's provider: this body is\n // assembled field by field, so anything the list omits is dropped in\n // silence, and the buyer is told \"we did not receive the card details\"\n // after filling in a perfectly good card.\n cardToken: input.cardToken ?? null,\n installments: input.installments ?? null,\n paymentMethodId: input.paymentMethodId ?? null,\n issuerId: input.issuerId ?? null,\n deviceId: input.deviceId ?? null,\n })\n\n if (!ok || !payload?.sessionId) {\n // 404 arrives by two roads — no acquirer connected, or the function was\n // never deployed to this pool — and both mean \"charge some other way\".\n const failure = new Error(payload?.error ?? (status === 404\n ? 'Esta loja ainda não tem um meio de cobrança conectado.'\n : 'Não conseguimos abrir a cobrança agora.')) as Error & {\n status?: number\n code?: string\n }\n // The STATUS and the CODE travel with the message, because the checkout\n // asks about them to tell a refusal apart from a failure: 404 (no\n // acquirer) and 409 `method_unavailable` (an acquirer that does not sell\n // this method) both mean \"offer the order without an online charge\",\n // while anything else is genuinely broken and deserves to be shown.\n //\n // A bare Error carries neither, so both of those questions were answered\n // \"no\" no matter what the server said — and a store that simply does not\n // charge card was painting the provider's refusal as an error with a\n // \"Tentar de novo\" button that could never succeed.\n failure.status = status\n if (payload?.code) failure.code = String(payload.code)\n throw failure\n }\n\n return {\n sessionId: payload.sessionId,\n total: Number(payload.total ?? 0),\n state: 'open',\n provider,\n method: payload.method ?? input.paymentMethod ?? null,\n // One field for two situations that are the same thing from here: a link\n // the merchant sends, and the page a card buyer is redirected to. Both are\n // \"this payment happens on the acquirer's page\", and the caller decides\n // whether to copy it or to go there.\n paymentUrl: payload.redirectUrl ?? payload.paymentUrl ?? null,\n charge: payload.brCode\n ? {\n emv: payload.brCode,\n // AbacatePay embeds the `data:` prefix; the type promises bare\n // base64. Left in, the view prefixes it again and the QR is a\n // silently broken <img>.\n //\n // Vindi sends no base64 at all — its `qrCodeUrl` is a URL to an SVG,\n // which cannot be squeezed into this field without lying about what\n // it is. It travels beside it instead, and the view draws whichever\n // arrived.\n qrcodeBase64: String(payload.brCodeBase64 ?? '').replace(/^data:image\\/\\w+;base64,/u, '') || null,\n qrcodeUrl: String(payload.qrCodeUrl ?? '').trim() || null,\n expiresAt: payload.expiresAt ?? '',\n }\n : null,\n }\n }\n\n /**\n * Ask whether the money landed. Runs on a timer, so a network blip must read\n * as \"still waiting\" (`unknown`) and never as a refused payment.\n *\n * `provider` names which gateway opened the session — handed back by\n * `openCheckoutSession` rather than re-read from settings, because a merchant\n * who switches acquirer mid-checkout would otherwise have the new gateway\n * asked about a transaction that lives in the old one.\n */\n async settleCheckoutSession(\n sessionId: string,\n provider?: string | null,\n chargeToken?: string | null,\n ): Promise<CheckoutSettlement> {\n const tenantId = getTenantId()\n if (!tenantId) return { state: 'unknown' }\n const gateway = checkoutGateway(String(provider ?? '').trim() || 'abacatepay')\n if (!gateway) return { state: 'unknown' }\n try {\n // `chargeToken` is a HINT and never a claim — see the settle function. It\n // is what the acquirer put in the URL a buyer came back on, and it settles\n // the sale on their return instead of leaving them waiting for a webhook.\n const { ok, payload } = await callShopFunction(getDb(), gateway.settle, {\n tenantId,\n sessionId,\n ...(chargeToken ? { chargeToken } : {}),\n }, { timeoutMs: 12_000 })\n if (!ok || !payload?.state) return { state: 'unknown' }\n return { state: payload.state, orderId: payload.orderId ?? null, reason: payload.reason ?? null }\n } catch {\n return { state: 'unknown' }\n }\n }\n\n /**\n * Remember the contact details of whoever is signed in.\n *\n * Called when the buyer leaves the contact step, not when an order completes:\n * an abandoned checkout teaches the store nothing, and the person who most\n * needs the field remembered is the one who did not finish. The function\n * decides what may be written and to whose row — this only carries the values.\n */\n async paymentPublicKey(provider: string): Promise<string | null> {\n const tenantId = getTenantId()\n const gateway = checkoutGateway(provider)\n if (!tenantId || !gateway) return null\n const { ok, payload } = await callShopFunction(getDb(), gateway.open, {\n tenantId,\n action: 'public_key',\n })\n // Null and not a throw: a store whose acquirer needs no browser key is the\n // normal case, and the caller decides what to render without it.\n return ok ? (payload?.publicKey ?? null) : null\n }\n\n async saveCustomerContact(input: { phone?: string | null; document?: string | null }): Promise<void> {\n const tenantId = getTenantId()\n if (!tenantId) return\n const { error } = await getDb().rpc('shop_save_customer_contact', {\n p_tenant_id: tenantId,\n p_phone: input.phone ?? null,\n p_document: input.document ?? null,\n })\n // Never blocking: failing to remember a phone must not stop a purchase.\n if (error) console.warn('[shop] could not save customer contact:', error.message)\n }\n\n // Trusted placement — delegates all price/discount/inventory authority to the\n // shop_place_order RPC (SECURITY DEFINER). The browser never sets a price.\n /**\n * The argument mapping placing and revising share. Two copies of it would\n * drift on the first field either screen learns to send — and the one that\n * forgot would silently drop it from the order.\n */\n private orderRpcArgs(input: PlaceOrderInput): Record<string, unknown> {\n // Entrega/retirada e agendamento (0094) viajam DENTRO de p_metadata, pela\n // mesma razão que o `document` acima viaja dentro do endereço: a assinatura\n // de shop_place_order não cresce sem um DROP, e um trigger sobe estes dois\n // para as colunas do pedido. Só monta a chave quando há o que dizer — um\n // servidor pré-0029 recusa argumento NOMEADO desconhecido.\n const deliveryMeta =\n input.fulfillmentType !== undefined || input.scheduledFor !== undefined\n ? {\n ...(input.fulfillmentType !== undefined\n ? { fulfillment_type: input.fulfillmentType }\n : {}),\n ...(input.scheduledFor !== undefined ? { scheduled_for: input.scheduledFor } : {}),\n }\n : null\n const metadata =\n deliveryMeta || input.metadata !== undefined\n ? { ...(input.metadata ?? {}), ...(deliveryMeta ?? {}) }\n : undefined\n\n return {\n // variant_id rides on each line (0029): the RPC prices and decrements\n // the variant when present, product-level otherwise. Pre-0029 servers\n // ignore unknown jsonb keys, so this stays compatible either way.\n p_items: input.items.map(i => ({\n product_id: i.productId,\n variant_id: asUuid(i.variantId) ?? undefined,\n quantity: i.quantity,\n options_label: i.optionsLabel ?? null,\n // 0094. Chave jsonb desconhecida é ignorada por servidor antigo, então\n // isto é seguro de mandar sempre — ao contrário de um argumento nomeado.\n notes: i.notes ?? null,\n })),\n p_customer_id: asUuid(input.customerId),\n p_customer_name: input.customer?.name ?? null,\n p_customer_email: input.customer?.email ?? null,\n p_currency: input.currency ?? 'BRL',\n p_discount_code: input.discountCode ?? null,\n p_shipping_total: input.shippingTotal ?? 0,\n // snake_case keys on purpose: the RPC freezes this jsonb onto the\n // order and public.addresses uses these exact column names.\n p_shipping_address: input.shippingAddress\n ? {\n postal_code: input.shippingAddress.postalCode,\n street: input.shippingAddress.street,\n number: input.shippingAddress.number ?? null,\n complement: input.shippingAddress.complement ?? null,\n district: input.shippingAddress.district ?? null,\n city: input.shippingAddress.city,\n state: input.shippingAddress.state,\n country: input.shippingAddress.country ?? 'BR',\n recipient: input.shippingAddress.recipient ?? null,\n phone: input.shippingAddress.phone ?? null,\n label: input.shippingAddress.label ?? null,\n // Not an address field: it rides here because shop_place_order's\n // signature cannot grow without a DROP, and 0050's trigger lifts it to\n // plg_shop_orders.customer_document. The storefront already sent it;\n // the console did not, so a phone sale was born with no CPF.\n document: input.shippingAddress.document ?? null,\n }\n : null,\n p_payment_method: input.paymentMethod ?? null,\n p_notes: input.notes ?? null,\n // Only when something contributed: p_metadata exists from 0029 on, and\n // a pre-0029 server rejects unknown NAMED arguments (unlike unknown\n // jsonb keys). Absent metadata therefore must not send the key at all.\n ...(metadata !== undefined ? { p_metadata: metadata } : {}),\n }\n }\n\n async placeOrder(input: PlaceOrderInput): Promise<Order> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: placeOrder requires a tenant id (configure the shop tenant resolver).')\n const { data, error } = await db.rpc('shop_place_order', {\n p_tenant_id: tenantId,\n ...this.orderRpcArgs(input),\n })\n if (error) throw error\n const orderId = typeof data === 'string' ? data : (data?.id ?? data?.order_id ?? data)\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: placeOrder did not return a persisted order.')\n emitOrderEvent('order_confirmation', order)\n return order\n }\n\n async findOpenOrderCharge(orderId: string): Promise<CheckoutSession | null> {\n const { data, error } = await getDb()\n .from(T.checkoutSessions)\n .select('id,total,currency,provider,payment_method,charge_payload,expires_at,status')\n .eq('order_id', orderId)\n .eq('status', 'open')\n .gt('expires_at', new Date().toISOString())\n .order('created_at', { ascending: false })\n .limit(1)\n // Uma loja sem a tabela (pool anterior a 0059) não tem cobrança aberta para\n // mostrar — não é erro, é ausência.\n if (error || !data?.length) return null\n\n const row = data[0] as Record<string, any>\n const payload = (row.charge_payload ?? {}) as Record<string, any>\n const link = payload.redirectUrl ?? payload.paymentUrl ?? payload.url\n ?? cartPaymentUrl(payload.url_car, payload.cart_token)\n // Nem código, nem link: a abertura não chegou ao fim. Devolver isso seria\n // entregar ao painel uma cobrança que não existe — e, pior, impedir que uma\n // de verdade fosse aberta no lugar dela.\n if (!payload.brCode && !link) return null\n\n return {\n sessionId: row.id,\n total: Number(row.total ?? 0),\n state: 'open',\n provider: row.provider ?? null,\n method: row.payment_method ?? null,\n // Cada adquirente guarda o endereço com o nome dele. A AbacatePay grava\n // `url`; a Vindi grava o carrinho da Yapay em `url_car` + `cart_token`, e\n // a URL de pagamento é a junção dos dois — foi por não conhecer esse par\n // que \"Ver cobrança\" abria uma janela sem link nenhum, com um link que\n // estava gravado ali do lado.\n paymentUrl: link ?? null,\n // O MESMO mapeamento de openCheckoutSession, e pelas mesmas razões: a\n // AbacatePay devolve bytes base64 (com prefixo `data:`, que a tela\n // prefixaria de novo) e a Vindi devolve a URL de um SVG. Desenhar um como\n // o outro é um <img> quebrado na hora exata em que alguém vai pagar.\n charge: payload.brCode\n ? {\n emv: String(payload.brCode),\n qrcodeBase64: String(payload.brCodeBase64 ?? '').replace(/^data:image\\/\\w+;base64,/u, '') || null,\n qrcodeUrl: String(payload.qrCodeUrl ?? '').trim() || null,\n expiresAt: row.expires_at ?? null,\n }\n : null,\n } as CheckoutSession\n }\n\n async chargeExistingOrder(\n orderId: string,\n options?: { asLink?: boolean; paymentMethod?: PaymentMethodKind; returnUrl?: string },\n ): Promise<CheckoutSession> {\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: chargeExistingOrder requires an existing order.')\n if (order.status !== 'open' || order.financialStatus !== 'pending') {\n throw new Error('Este pedido não está aberto e sem pagamento.')\n }\n // O adquirente exige o e-mail do pagador, e é a MESMA exigência que a tela\n // de venda faz antes de gerar um link. Recusar aqui nomeia o que falta; sem\n // isto o erro viria do outro lado do mundo, em inglês.\n const email = order.customerEmail?.trim()\n if (!email) {\n throw new Error('Para cobrar este pedido o cadastro do cliente precisa de e-mail.')\n }\n // Já existe uma em aberto? Então o ato é MOSTRAR, não cobrar de novo.\n const standing = await this.findOpenOrderCharge(orderId)\n if (standing) return standing\n\n const address = order.shippingAddress\n const session = await this.openCheckoutSession!({\n // Os itens do pedido, sem preço: a sessão reprecifica pelo catálogo, e é\n // a amarração que confere se o resultado bate com o que o pedido pede.\n items: order.items\n .filter((item) => item.productId)\n .map((item) => ({ productId: item.productId as string, quantity: item.quantity })),\n customer: { name: order.customerName, email },\n shippingAddress: address\n ? {\n postalCode: address.postal_code ?? '',\n street: address.street ?? '',\n number: address.number,\n complement: address.complement,\n district: address.district,\n city: address.city ?? '',\n state: address.state ?? '',\n country: address.country,\n recipient: address.recipient,\n phone: address.phone,\n }\n : undefined,\n discountCode: order.discountCode ?? undefined,\n paymentMethod: options?.paymentMethod,\n returnUrl: options?.returnUrl,\n asLink: options?.asLink,\n })\n\n const { error } = await getDb().rpc('shop_bind_session_to_order', {\n p_session_id: session.sessionId,\n p_order_id: orderId,\n })\n if (error) {\n // A cobrança já existe no adquirente neste ponto. Uma sessão sem dono que\n // alguém pague depois vira um pedido NOVO — a duplicata exata que este\n // caminho existe para evitar. Fechá-la é o que impede isso; se a loja não\n // puder escrever na linha, o erro original ainda é o que sobe.\n await getDb().from(T.checkoutSessions)\n .update({ status: 'cancelled', failure_reason: 'bind_failed' })\n .eq('id', session.sessionId)\n .then(undefined, () => undefined)\n const text = String((error as { message?: string }).message ?? '')\n if (/shop_bind_session_to_order/u.test(text) && /find the function|does not exist/iu.test(text)) {\n throw new Error('Cobrar um pedido salvo ainda não foi aplicado nesta loja (migration 0073).')\n }\n throw error\n }\n return session\n }\n\n async reviseOrder(orderId: string, input: PlaceOrderInput): Promise<Order> {\n const args = this.orderRpcArgs(input)\n // shop_update_order takes the order, not the tenant: the order already\n // belongs to one, and letting the caller name a different one would be a\n // door into another store's documents.\n const { error } = await getDb().rpc('shop_update_order', {\n p_order_id: orderId,\n p_items: args.p_items,\n p_customer_id: args.p_customer_id,\n p_customer_name: args.p_customer_name,\n p_customer_email: args.p_customer_email,\n p_discount_code: args.p_discount_code,\n p_notes: args.p_notes,\n p_shipping_address: args.p_shipping_address,\n p_payment_method: args.p_payment_method,\n })\n if (error) {\n // A loja que ainda não recebeu a 0072 responde com o texto do PostgREST\n // sobre cache de schema, que não diz ao lojista nada acionável.\n const text = String((error as { message?: string }).message ?? '')\n if (/shop_update_order/u.test(text) && /find the function|does not exist/iu.test(text)) {\n throw new Error('A edição de pedidos ainda não foi aplicada nesta loja (migration 0072).')\n }\n throw error\n }\n const order = await this.getOrder(orderId)\n if (!order) throw new Error('@fayz-ai/shop: reviseOrder did not return a persisted order.')\n return order\n }\n\n // ---------------------------------------------------------------------------\n // Customers\n // ---------------------------------------------------------------------------\n\n async listCustomers(options?: ListCustomersOptions): Promise<ShopCustomer[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(V.customers).select('*').order('first_name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n // Word by word, ANDed — see customerSearchFilters.\n for (const filter of customerSearchFilters(options?.search)) q = q.or(filter)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomer)\n }\n\n async getCustomer(id: string): Promise<ShopCustomer | null> {\n const { data, error } = await getDb().from(V.customers).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToCustomer(data) : null\n }\n\n async createCustomer(input: CreateCustomerInput): Promise<ShopCustomer> {\n const { data, error } = await getDb()\n .from(T.customers)\n .insert({\n tenant_id: getTenantId(),\n first_name: input.firstName,\n last_name: input.lastName ?? '',\n email: input.email ?? null,\n phone: input.phone ?? null,\n document: input.document ?? null,\n notes: input.notes ?? null,\n })\n .select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async updateCustomer(id: string, input: UpdateCustomerInput): Promise<ShopCustomer> {\n const updates: Record<string, unknown> = {}\n if (input.firstName !== undefined) updates.first_name = input.firstName\n if (input.lastName !== undefined) updates.last_name = input.lastName\n if (input.email !== undefined) updates.email = input.email\n if (input.phone !== undefined) updates.phone = input.phone\n if (input.document !== undefined) updates.document = input.document\n if (input.notes !== undefined) updates.notes = input.notes\n const { data, error } = await getDb().from(T.customers).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomer(data)\n }\n\n async deleteCustomer(id: string): Promise<void> {\n const { error } = await getDb().from(T.customers).delete().eq('id', id)\n if (error) throw error\n }\n\n // Find-or-create + link to auth.uid server-side (SECURITY DEFINER RPC), so the\n // browser never supplies the auth id and \"my orders\" is RLS-scoped to the owner.\n async resolveCustomer(input: ResolveCustomerInput): Promise<ShopCustomer> {\n const db = getDb()\n const tenantId = input.tenantId ?? getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: resolveCustomer requires a tenant id.')\n const { data, error } = await db.rpc('shop_resolve_customer', {\n p_tenant_id: tenantId,\n p_email: input.email,\n p_name: input.name ?? null,\n })\n if (error) throw error\n const row = Array.isArray(data) ? data[0] : data\n if (!row) throw new Error('@fayz-ai/shop: resolveCustomer returned no row.')\n return rowToCustomer(row)\n }\n\n // ---------------------------------------------------------------------------\n // Promotions (spine M6) — evaluation happens INSIDE the database via the\n // SECURITY DEFINER function (migrations/0033), so an anonymous storefront\n // never reads promotion rows or codes directly: it sends the cart snapshot\n // and receives ordered actions. The function mirrors the TS reference\n // evaluator (src/rules/evaluator.ts), which is the tested spec.\n // ---------------------------------------------------------------------------\n\n async evaluatePromotions(input: { cart: RuleCartSnapshot }): Promise<ComputeAction[]> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: evaluatePromotions requires a tenant id (configure the shop tenant resolver).')\n const cart = input.cart\n const { data, error } = await db.rpc('shop_compute_promotion_actions', {\n p_tenant_id: tenantId,\n // The serializable RuleCartSnapshot, snake_case on the wire — the same\n // contract 0033 documents for p_cart.\n p_cart: {\n items: cart.items.map((item) => ({\n id: item.id ?? item.productId,\n product_id: item.productId,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n category_id: item.categoryId ?? null,\n collection_id: item.collectionId ?? null,\n })),\n shipping_total: cart.shippingTotal ?? null,\n region: cart.region ?? null,\n customer: cart.customer\n ? { email: cart.customer.email ?? null, tags: cart.customer.tags ?? [] }\n : null,\n codes: cart.codes ?? [],\n },\n })\n if (error) throw error\n const rows: Array<Record<string, unknown>> = Array.isArray(data) ? data : []\n return rows.map((row): ComputeAction => {\n const code = (row.code as string | null) ?? null\n if (row.action === 'addShippingDiscount') {\n return { action: 'addShippingDiscount', promotionId: String(row.promotion_id), code, amount: Number(row.amount) }\n }\n if (row.action === 'addFreeItem') {\n return { action: 'addFreeItem', promotionId: String(row.promotion_id), code, productId: String(row.product_id), quantity: Number(row.quantity) }\n }\n return { action: 'addItemDiscount', promotionId: String(row.promotion_id), code, itemId: String(row.item_id), amount: Number(row.amount) }\n })\n }\n\n // ---------------------------------------------------------------------------\n // Discounts\n // ---------------------------------------------------------------------------\n\n async listDiscounts(options?: ListDiscountsOptions): Promise<Discount[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.discounts).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n if (options?.status) q = q.eq('status', options.status)\n if (options?.type) q = q.eq('type', options.type)\n if (options?.search) q = q.ilike('title', `%${options.search}%`)\n if (options?.limit) q = q.limit(options.limit)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToDiscount)\n }\n\n async getDiscount(id: string): Promise<Discount | null> {\n const { data, error } = await getDb().from(T.discounts).select('*').eq('id', id).maybeSingle()\n if (error) throw error\n return data ? rowToDiscount(data) : null\n }\n\n async createDiscount(input: CreateDiscountInput): Promise<Discount> {\n const { data, error } = await getDb()\n .from(T.discounts)\n .insert({ tenant_id: getTenantId(), title: input.title, code: input.code ?? null, type: input.type, method: input.method ?? 'code', value: input.value, usage_limit: input.usageLimit ?? null, once_per_customer: input.oncePerCustomer ?? false, min_subtotal: input.minSubtotal ?? null, applies_to: input.appliesTo ?? 'all', product_ids: input.productIds ?? [], category_ids: input.categoryIds ?? [], starts_at: input.startsAt ?? new Date().toISOString(), ends_at: input.endsAt ?? null, status: input.status ?? 'active', times_used: 0 })\n .select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async updateDiscount(id: string, input: UpdateDiscountInput): Promise<Discount> {\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.code !== undefined) updates.code = input.code\n if (input.type !== undefined) updates.type = input.type\n if (input.value !== undefined) updates.value = input.value\n if (input.usageLimit !== undefined) updates.usage_limit = input.usageLimit\n if (input.minSubtotal !== undefined) updates.min_subtotal = input.minSubtotal\n if (input.appliesTo !== undefined) updates.applies_to = input.appliesTo\n if (input.productIds !== undefined) updates.product_ids = input.productIds\n if (input.categoryIds !== undefined) updates.category_ids = input.categoryIds\n if (input.status !== undefined) updates.status = input.status\n if (input.endsAt !== undefined) updates.ends_at = input.endsAt\n const { data, error } = await getDb().from(T.discounts).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToDiscount(data)\n }\n\n async deleteDiscount(id: string): Promise<void> {\n const { error } = await getDb().from(T.discounts).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Sales channels\n // ---------------------------------------------------------------------------\n\n async listSalesChannels(): Promise<SalesChannel[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.salesChannels).select('*').order('position', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToSalesChannel)\n }\n\n async createSalesChannel(input: CreateSalesChannelInput): Promise<SalesChannel> {\n const { data, error } = await getDb()\n .from(T.salesChannels)\n .insert({ tenant_id: getTenantId(), kind: input.kind, label: input.label, url: input.url ?? null, enabled: input.enabled ?? true, position: input.position ?? 0 })\n .select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async updateSalesChannel(id: string, input: UpdateSalesChannelInput): Promise<SalesChannel> {\n const updates: Record<string, unknown> = {}\n if (input.kind !== undefined) updates.kind = input.kind\n if (input.label !== undefined) updates.label = input.label\n if (input.url !== undefined) updates.url = input.url\n if (input.enabled !== undefined) updates.enabled = input.enabled\n if (input.position !== undefined) updates.position = input.position\n const { data, error } = await getDb().from(T.salesChannels).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToSalesChannel(data)\n }\n\n async deleteSalesChannel(id: string): Promise<void> {\n const { error } = await getDb().from(T.salesChannels).delete().eq('id', id)\n if (error) throw error\n }\n\n // ---------------------------------------------------------------------------\n // Custom entities (spine M4). Storage resolves through the EntityStore\n // indirection (I5): a promoted entity's registered store wins; everything\n // else reads/writes the generic jsonb table (migration 0030), whose row\n // access is the RLS generated from each declaration (I6).\n // ---------------------------------------------------------------------------\n\n private entityStore(entity: string) {\n return resolveEntityStore(entity, createSupabaseEntityStore)\n }\n\n async listEntityRecords(entity: string, options?: ListEntityRecordsOptions): Promise<EntityRecord[]> {\n return this.entityStore(entity).list(options)\n }\n\n async getEntityRecord(entity: string, id: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).get(id)\n }\n\n async getEntityRecordBySlug(entity: string, slug: string): Promise<EntityRecord | null> {\n return this.entityStore(entity).getBySlug(slug)\n }\n\n async createEntityRecord(entity: string, input: EntityRecordInput): Promise<EntityRecord> {\n return this.entityStore(entity).create(input)\n }\n\n async updateEntityRecord(entity: string, id: string, input: Partial<EntityRecordInput>): Promise<EntityRecord> {\n return this.entityStore(entity).update(id, input)\n }\n\n async deleteEntityRecord(entity: string, id: string): Promise<void> {\n return this.entityStore(entity).delete(id)\n }\n\n // -------------------------------------------------------------------------\n // Coleções, grupos/segmentos, vale-presente, e-mails e mídia.\n // -------------------------------------------------------------------------\n\nasync listCollections(): Promise<Collection[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .order('sort_order', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCollection)\n }\n\n async getCollection(id: string): Promise<Collection | null> {\n const { data, error } = await getDb()\n .from(T.collections)\n .select(`*, members:${T.collectionProducts}(product_id, position)`)\n .eq('id', id)\n .maybeSingle()\n if (error) throw error\n return data ? rowToCollection(data) : null\n }\n\n async createCollection(input: CreateCollectionInput): Promise<Collection> {\n const db = getDb()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.collections)\n .insert({\n tenant_id: tenantId,\n title: input.title,\n handle: input.handle?.trim() || slugify(input.title),\n description: input.description ?? null,\n image_url: input.imageUrl ?? null,\n seo_title: input.seoTitle ?? null,\n seo_description: input.seoDescription ?? null,\n published: input.published ?? true,\n sort_order: input.sortOrder ?? 0,\n })\n .select().single()\n if (error) throw error\n await this.syncCollectionProducts(data.id, tenantId, input.productIds)\n return (await this.getCollection(data.id)) ?? rowToCollection(data)\n }\n\n async updateCollection(id: string, input: UpdateCollectionInput): Promise<Collection> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.title !== undefined) updates.title = input.title\n if (input.handle !== undefined) updates.handle = input.handle?.trim() || slugify(String(input.title ?? ''))\n if (input.description !== undefined) updates.description = input.description\n if (input.imageUrl !== undefined) updates.image_url = input.imageUrl\n if (input.seoTitle !== undefined) updates.seo_title = input.seoTitle\n if (input.seoDescription !== undefined) updates.seo_description = input.seoDescription\n if (input.published !== undefined) updates.published = input.published\n if (input.sortOrder !== undefined) updates.sort_order = input.sortOrder\n\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.collections).update(updates).eq('id', id)\n if (error) throw error\n }\n // `undefined` means \"leave the membership alone\" — an edit that only renamed\n // the collection must not empty it.\n if (input.productIds !== undefined) {\n await this.syncCollectionProducts(id, getTenantId(), input.productIds)\n }\n const updated = await this.getCollection(id)\n if (!updated) throw new Error('Collection not found')\n return updated\n }\n\n async deleteCollection(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE.\n const { error } = await getDb().from(T.collections).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerGroups(): Promise<CustomerGroup[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .order('name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomerGroup)\n }\n\n async createCustomerGroup(input: CreateCustomerGroupInput): Promise<CustomerGroup> {\n const tenantId = getTenantId()\n const { data, error } = await getDb()\n .from(T.customerGroups)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n description: input.description ?? null,\n color: input.color ?? null,\n })\n .select().single()\n if (error) throw error\n await this.syncGroupMembers(data.id, tenantId, input.customerIds)\n return { ...rowToCustomerGroup(data), customerIds: input.customerIds ?? [] }\n }\n\n async updateCustomerGroup(id: string, input: UpdateCustomerGroupInput): Promise<CustomerGroup> {\n const db = getDb()\n const updates: Record<string, unknown> = {}\n if (input.name !== undefined) updates.name = input.name\n if (input.description !== undefined) updates.description = input.description\n if (input.color !== undefined) updates.color = input.color\n if (Object.keys(updates).length > 0) {\n const { error } = await db.from(T.customerGroups).update(updates).eq('id', id)\n if (error) throw error\n }\n // undefined means \"leave the membership alone\" — renaming a group must not\n // empty it.\n if (input.customerIds !== undefined) {\n await this.syncGroupMembers(id, getTenantId(), input.customerIds)\n }\n const { data, error } = await db\n .from(T.customerGroups)\n .select(`*, members:${T.customerGroupMembers}(customer_id)`)\n .eq('id', id).single()\n if (error) throw error\n return rowToCustomerGroup(data)\n }\n\n async deleteCustomerGroup(id: string): Promise<void> {\n // Members go with it via ON DELETE CASCADE. The CUSTOMERS are untouched —\n // deleting a grouping must never delete the people in it.\n const { error } = await getDb().from(T.customerGroups).delete().eq('id', id)\n if (error) throw error\n }\n\n async listCustomerSegments(): Promise<CustomerSegment[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.customerSegments).select('*').order('name', { ascending: true })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToCustomerSegment)\n }\n\n async createCustomerSegment(input: CreateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments)\n .insert({ tenant_id: getTenantId(), ...segmentPayload(input), name: input.name })\n .select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async updateCustomerSegment(id: string, input: UpdateCustomerSegmentInput): Promise<CustomerSegment> {\n const { data, error } = await getDb()\n .from(T.customerSegments).update(segmentPayload(input)).eq('id', id).select().single()\n if (error) throw error\n return rowToCustomerSegment(data)\n }\n\n async deleteCustomerSegment(id: string): Promise<void> {\n const { error } = await getDb().from(T.customerSegments).delete().eq('id', id)\n if (error) throw error\n }\n\n async listGiftCards(): Promise<GiftCard[]> {\n const db = getDb()\n const tenantId = getTenantId()\n let q = db.from(T.giftCards).select('*').order('created_at', { ascending: false })\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToGiftCard)\n }\n\n async createGiftCard(input: CreateGiftCardInput): Promise<GiftCard> {\n const amount = Number(input.initialBalance) || 0\n const { data, error } = await getDb()\n .from(T.giftCards)\n .insert({\n tenant_id: getTenantId(),\n code: (input.code?.trim() || generateGiftCardCode()).toUpperCase(),\n initial_balance: amount,\n // A new card is worth its face value. The admin never types the\n // remaining balance at issue — that is what redemption is for.\n balance: amount,\n currency: input.currency ?? 'BRL',\n status: input.status ?? 'active',\n expires_at: input.expiresAt ?? null,\n customer_id: asUuid(input.customerId),\n customer_email: input.customerEmail ?? null,\n note: input.note ?? null,\n })\n .select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async updateGiftCard(id: string, input: UpdateGiftCardInput): Promise<GiftCard> {\n const updates: Record<string, unknown> = {}\n if (input.code !== undefined) updates.code = input.code.trim().toUpperCase()\n if (input.balance !== undefined) updates.balance = input.balance\n if (input.status !== undefined) updates.status = input.status\n if (input.expiresAt !== undefined) updates.expires_at = input.expiresAt\n if (input.customerId !== undefined) updates.customer_id = asUuid(input.customerId)\n if (input.customerEmail !== undefined) updates.customer_email = input.customerEmail\n if (input.note !== undefined) updates.note = input.note\n const { data, error } = await getDb().from(T.giftCards).update(updates).eq('id', id).select().single()\n if (error) throw error\n return rowToGiftCard(data)\n }\n\n async deleteGiftCard(id: string): Promise<void> {\n const { error } = await getDb().from(T.giftCards).delete().eq('id', id)\n if (error) throw error\n }\n\n async listEmailTemplates(): Promise<EmailTemplate[]> {\n const db = getDb()\n const tenantId = getTenantId()\n // Only this store's own events: the table is shared with every other module\n // that sends a message, so an unfiltered read would hand the shop screens\n // rows whose event key their catalog cannot resolve.\n let q = db.from(T.messageTemplates).select('*')\n .like('event_key', `${SHOP_EVENT_PREFIX}%`)\n .eq('channel', EMAIL_CHANNEL)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToEmailTemplate)\n }\n\n async upsertEmailTemplate(input: UpsertEmailTemplateInput): Promise<EmailTemplate> {\n const payload: Record<string, unknown> = {\n tenant_id: getTenantId(),\n event_key: `${SHOP_EVENT_PREFIX}${input.event}`,\n channel: EMAIL_CHANNEL,\n }\n if (input.enabled !== undefined) payload.enabled = input.enabled\n if (input.subject !== undefined) payload.subject = input.subject\n if (input.body !== undefined) payload.body = input.body\n // Upsert on (tenant, event, channel): the row is an override that may not\n // exist yet, and toggling a never-customised template is the common case.\n const { data, error } = await getDb()\n .from(T.messageTemplates)\n .upsert(payload, { onConflict: 'tenant_id,event_key,channel' })\n .select().single()\n if (error) throw error\n return rowToEmailTemplate(data)\n }\n\n async listMediaFiles(): Promise<MediaFile[]> {\n const tenantId = getTenantId()\n if (!tenantId) return []\n // Two sources, on purpose. The bucket answers \"what files exist\"; the\n // product_images rows answer \"what is attached to what\", which storage\n // cannot say — and a product photo sits at {tenant}/products/{id}/…, one\n // level below where a bounded walk reaches, so it was invisible here.\n // Reading the rows also keeps a photo that was detached from its product\n // out of the library instead of showing a file of nothing.\n const [attached, library] = await Promise.all([\n this.listAttachedMedia(tenantId),\n this.listLibraryFiles(tenantId),\n ])\n return mergeMediaFiles(attached, library)\n }\n\n /** Every product photo in the store, each one carrying its product. */\n private async listAttachedMedia(tenantId: string): Promise<MediaFile[]> {\n const db = getDb()\n const { data: rows, error } = await db\n .from(T.productImages)\n .select('id,product_id,url,alt_text,sort_order,is_primary,created_at')\n .eq('tenant_id', tenantId)\n .order('created_at', { ascending: false })\n .limit(1000)\n if (error || !rows?.length) return []\n\n // Names in one read: a catalogue of 200 products with four photos each is\n // still one query, where a lookup per photo would be 800.\n const productIds = [...new Set(rows.map((r: any) => r.product_id).filter(Boolean))]\n const { data: products } = await db\n .from(T.products).select('id,name').in('id', productIds)\n const nameById = new Map<string, string>((products ?? []).map((p: any) => [p.id, p.name]))\n\n return rows.map((row: any) =>\n productImageToMediaFile(rowToImage(row), nameById.get(row.product_id)))\n }\n\n /** What the merchant uploaded straight to the library — owned by nothing. */\n private async listLibraryFiles(tenantId: string): Promise<MediaFile[]> {\n const bucket = getDb().storage.from(T.mediaBucket)\n\n // The bucket is laid out {tenant}/library and {tenant}/products/{id}, and\n // storage.list walks one level at a time. Bounded to the tenant root plus\n // one level: products are covered by the rows above, so there is nothing\n // left down there worth an unbounded recursion.\n const listAt = async (prefix: string): Promise<{ prefix: string; entry: any }[]> => {\n const { data, error } = await bucket.list(prefix, {\n limit: 1000,\n sortBy: { column: 'created_at', order: 'desc' },\n })\n if (error) return []\n return (data ?? []).map((entry: any) => ({ prefix, entry }))\n }\n\n const top = await listAt(tenantId)\n // An entry with no `id` is a folder placeholder, not an object. Only the\n // library folder is worth descending into.\n const folders = top\n .filter(({ entry }) => !entry.id && entry.name === LIBRARY_FOLDER)\n .map(({ entry }) => `${tenantId}/${entry.name}`)\n const nested = (await Promise.all(folders.map(listAt))).flat()\n\n return [...top, ...nested]\n .filter(({ entry }) => entry.id)\n .map(({ prefix, entry }) => {\n const path = `${prefix}/${entry.name}`\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n const name = displayNameOf(entry.name)\n const file: MediaFile = {\n id: path,\n name,\n url: publicUrl,\n kind: mediaKindOf(entry.name, entry.metadata?.mimetype),\n size: Number(entry.metadata?.size ?? 0),\n extension: (entry.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: entry.created_at ?? entry.updated_at ?? '',\n }\n return file\n })\n }\n\n async uploadMediaFile(rawFile: File): Promise<MediaFile> {\n const db = getDb()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('@fayz-ai/shop: no active tenant for media upload')\n // Same rule as product photos: a bounded WebP source, or the file itself\n // when it is not a photo this can improve (a PDF, a GIF, an SVG).\n const file = await optimizeImageForUpload(rawFile)\n // `library/` keeps hand-uploaded assets out of products/{id}, so deleting a\n // product never takes a banner the merchant uploaded here down with it.\n const path = `${tenantId}/${LIBRARY_FOLDER}/${Date.now()}-${file.name}`\n const bucket = db.storage.from(T.mediaBucket)\n const { error } = await bucket.upload(path, file, IMMUTABLE_OBJECT)\n if (error) throw error\n const { data: { publicUrl } } = bucket.getPublicUrl(path)\n return {\n id: path,\n name: file.name,\n url: publicUrl,\n kind: mediaKindOf(file.name, file.type),\n size: file.size,\n extension: (file.name.split('.').pop() ?? '').toUpperCase(),\n createdAt: new Date().toISOString(),\n }\n }\n\n async deleteMediaFile(id: string): Promise<void> {\n const { error } = await getDb().storage.from(T.mediaBucket).remove([id])\n if (error) throw error\n }\n\nprivate async syncCollectionProducts(\n collectionId: string,\n tenantId: string | undefined,\n productIds: string[] | undefined,\n ): Promise<void> {\n if (productIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.collectionProducts).delete().eq('collection_id', collectionId)\n if (delErr) throw delErr\n if (productIds.length === 0) return\n const rows = productIds.map((productId, position) => ({\n collection_id: collectionId, product_id: productId, tenant_id: tenantId, position,\n }))\n const { error } = await db.from(T.collectionProducts).insert(rows)\n if (error) throw error\n }\n\n private async syncGroupMembers(\n groupId: string,\n tenantId: string | undefined,\n customerIds: string[] | undefined,\n ): Promise<void> {\n if (customerIds === undefined) return\n const db = getDb()\n const { error: delErr } = await db\n .from(T.customerGroupMembers).delete().eq('group_id', groupId)\n if (delErr) throw delErr\n if (customerIds.length === 0) return\n const rows = customerIds.map((customerId) => ({\n group_id: groupId, customer_id: customerId, tenant_id: tenantId,\n }))\n const { error } = await db.from(T.customerGroupMembers).insert(rows)\n if (error) throw error\n }\n}\n\nexport function createSupabaseShopProvider(): ShopProvider {\n return new SupabaseShopProvider()\n}\n","import type { ShippingLabel, ShippingLabelOption } from '../types'\n\n// ---------------------------------------------------------------------------\n// Labels as a PORT, and the carrier as an implementation of it.\n//\n// Melhor Envio is what this store has connected today; Correios, Kangu, Frenet\n// and a merchant's own courier contract are the same four verbs. Writing the\n// panel against the carrier's name would put \"melhorEnvio\" in a screen that has\n// no business knowing who carries the box — and the second carrier would then\n// be a second button next to the first, forever.\n//\n// Same shape the stock ledger uses (registerStockStore/resolveStockStore): a\n// registry keyed by id, and a resolver that answers WHICH one is in play. The\n// registry is filled at plugin install; the resolver reads what the merchant\n// connected and chose, never a hard-coded name.\n// ---------------------------------------------------------------------------\n\nexport interface ShippingLabelProvider {\n /** Connector slug — the id `connections.connector_id` carries. */\n id: string\n /** How the merchant knows them (\"Melhor Envio\"). Shown in the panel. */\n label: string\n /** Services and prices for one order. Free, repeatable, spends nothing. */\n quote(orderId: string): Promise<{ options: ShippingLabelOption[]; label: ShippingLabel | null }>\n /** SPENDS the merchant's balance. Idempotent per order by contract. */\n buy(orderId: string, serviceId: number): Promise<ShippingLabel>\n /** The label PDF, as many times as the merchant needs it. */\n print(orderId: string): Promise<string | null>\n /** What the carrier says now. */\n track(orderId: string): Promise<ShippingLabel['tracking']>\n}\n\nconst registry = new Map<string, ShippingLabelProvider>()\n\nexport function registerShippingLabelProvider(provider: ShippingLabelProvider): void {\n registry.set(provider.id, provider)\n}\n\nexport function listShippingLabelProviders(): ShippingLabelProvider[] {\n return [...registry.values()]\n}\n\n/** Test seam — the registry is module state, and a test that registers a fake\n * must not leak it into the next one. */\nexport function resetShippingLabelProviders(): void {\n registry.clear()\n}\n\nexport interface ResolveShippingLabelOptions {\n /** Connector ids the store has ACTIVE, in the order the panel lists them. */\n connected: readonly string[]\n /**\n * The merchant's explicit choice, when they made one.\n *\n * `''` (empty, not undefined) is a decision too — \"I print labels myself\" —\n * and it must beat every connected carrier, exactly as the payment provider\n * setting treats \"confirmo à mão\".\n */\n preferred?: string | null\n}\n\n/**\n * Which carrier issues this store's labels — or nobody.\n *\n * Null is a first-class answer and the common one: most stores dispatch by hand,\n * and the panel must show them the manual path without a dead button beside it.\n */\nexport function resolveShippingLabelProvider(\n options: ResolveShippingLabelOptions,\n): ShippingLabelProvider | null {\n const { connected, preferred } = options\n\n // An explicit empty string means the merchant turned it off.\n if (preferred === '') return null\n\n if (preferred) {\n const chosen = registry.get(preferred)\n // Chosen but no longer connected: the panel must not offer to spend money\n // through a grant that was revoked.\n return chosen && connected.includes(preferred) ? chosen : null\n }\n\n for (const id of connected) {\n const found = registry.get(id)\n if (found) return found\n }\n return null\n}\n","// ---------------------------------------------------------------------------\n// CPF / CNPJ — the one field a Brazilian checkout cannot fake.\n//\n// The gateway rejects a malformed document with an opaque error and the buyer is\n// left staring at \"não foi possível concluir o pedido\". Checking the digits here\n// turns that into a message under the field, before the charge is even opened.\n// ---------------------------------------------------------------------------\n\nexport type DocumentKind = 'cpf' | 'cnpj'\n\nexport const documentDigits = (value: string | null | undefined): string =>\n String(value ?? '').replace(/\\D/g, '')\n\n/** Weighted modulo-11 check digit, the shared half of both algorithms. */\nfunction checkDigit(digits: string, weights: readonly number[]): number {\n const sum = weights.reduce((acc, weight, index) => acc + Number(digits[index]) * weight, 0)\n const rest = sum % 11\n return rest < 2 ? 0 : 11 - rest\n}\n\nconst CPF_FIRST = [10, 9, 8, 7, 6, 5, 4, 3, 2] as const\nconst CPF_SECOND = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2] as const\nconst CNPJ_FIRST = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const\nconst CNPJ_SECOND = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] as const\n\nexport function isValidCpf(value: string | null | undefined): boolean {\n const digits = documentDigits(value)\n // 111.111.111-11 and its siblings satisfy the checksum, which is why every\n // implementation has to reject them by hand.\n if (digits.length !== 11 || /^(\\d)\\1{10}$/.test(digits)) return false\n return (\n checkDigit(digits, CPF_FIRST) === Number(digits[9]) &&\n checkDigit(digits, CPF_SECOND) === Number(digits[10])\n )\n}\n\nexport function isValidCnpj(value: string | null | undefined): boolean {\n const digits = documentDigits(value)\n if (digits.length !== 14 || /^(\\d)\\1{13}$/.test(digits)) return false\n return (\n checkDigit(digits, CNPJ_FIRST) === Number(digits[12]) &&\n checkDigit(digits, CNPJ_SECOND) === Number(digits[13])\n )\n}\n\n/** Which document this is, by length — `null` when it is neither yet. */\nexport function documentKind(value: string | null | undefined): DocumentKind | null {\n const length = documentDigits(value).length\n if (length === 11) return 'cpf'\n if (length === 14) return 'cnpj'\n return null\n}\n\nexport function isValidDocument(value: string | null | undefined): boolean {\n const kind = documentKind(value)\n return kind === 'cpf' ? isValidCpf(value) : kind === 'cnpj' ? isValidCnpj(value) : false\n}\n\n/**\n * Progressive mask: formats what is typed so far and never blocks typing.\n * A mask that only formats complete input leaves the field jumping at the end.\n */\nexport function formatDocument(value: string | null | undefined): string {\n const digits = documentDigits(value).slice(0, 14)\n if (digits.length <= 11) {\n return digits\n .replace(/^(\\d{3})(\\d)/, '$1.$2')\n .replace(/^(\\d{3})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/\\.(\\d{3})(\\d{1,2})$/, '.$1-$2')\n }\n return digits\n .replace(/^(\\d{2})(\\d)/, '$1.$2')\n .replace(/^(\\d{2})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/\\.(\\d{3})(\\d)/, '.$1/$2')\n .replace(/(\\d{4})(\\d{1,2})$/, '$1-$2')\n}\n","import type { EmailEventKey, EmailTemplate, EmailTemplateKind } from '../types'\n\n// ---------------------------------------------------------------------------\n// The store's email event catalog.\n//\n// It lives in CODE, not the database: fulfilment is what fires \"order shipped\",\n// so an event only exists if code emits it. A catalog table would need a\n// migration per new event and would keep orphan rows when one went away.\n//\n// The database holds only the merchant's OVERRIDE (plg_automations_templates):\n// on or off, and the text where they rewrote it. No row means \"use the default\n// here\" — true for most stores, and it lets improvements to the default text\n// reach everyone who never customised.\n// ---------------------------------------------------------------------------\n\nexport interface EmailEventDef {\n event: EmailEventKey\n kind: EmailTemplateKind\n /** Template name in the list. */\n title: string\n /** What it does, in one line. */\n description: string\n /** When it fires — the \"event\" half of the pair. */\n trigger: string\n defaultSubject: string\n defaultBody: string\n /** lucide icon for the row. */\n icon: string\n /** On by default in a new store. Order confirmation is the only email a buyer\n * EXPECTS; the rest are the merchant's choice. */\n defaultEnabled: boolean\n}\n\n/** Placeholders the send substitutes. Documented here because this is what the\n * merchant may type in the editor without breaking anything. */\nexport const EMAIL_PLACEHOLDERS = [\n '{{store_name}}', '{{customer_name}}', '{{order_number}}', '{{order_total}}',\n '{{order_items}}', '{{tracking_code}}', '{{cart_url}}',\n] as const\n\nexport const SHOP_EMAIL_EVENTS: EmailEventDef[] = [\n {\n event: 'order_confirmation', kind: 'transactional', icon: 'CircleCheck',\n title: 'Confirmação de pedido',\n description: 'Enviado quando o cliente conclui a compra',\n trigger: 'Imediatamente após o checkout',\n defaultSubject: 'Pedido #{{order_number}} confirmado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nRecebemos seu pedido #{{order_number}}.\\n\\n{{order_items}}\\n\\nTotal: {{order_total}}\\n\\nObrigado por comprar na {{store_name}}!',\n defaultEnabled: true,\n },\n {\n event: 'order_paid', kind: 'transactional', icon: 'CreditCard',\n title: 'Pagamento aprovado',\n description: 'Enviado quando o pagamento é confirmado',\n trigger: 'Quando o pagamento é aprovado',\n defaultSubject: 'Pagamento aprovado — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pagamento de {{order_total}} foi aprovado. Já estamos preparando o pedido #{{order_number}}.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_shipped', kind: 'transactional', icon: 'Truck',\n title: 'Pedido enviado',\n description: 'Enviado quando o pedido sai para entrega, com o rastreio',\n trigger: 'Quando a entrega é marcada como enviada',\n defaultSubject: 'Seu pedido saiu para entrega — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} está a caminho.\\n\\nRastreio: {{tracking_code}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_delivered', kind: 'transactional', icon: 'PackageCheck',\n title: 'Pedido entregue',\n description: 'Enviado quando a entrega é concluída',\n trigger: 'Quando a entrega é marcada como concluída',\n defaultSubject: 'Seu pedido chegou — #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi entregue. Esperamos que goste!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'order_cancelled', kind: 'transactional', icon: 'CircleX',\n title: 'Pedido cancelado',\n description: 'Enviado quando um pedido é cancelado',\n trigger: 'Quando o pedido é cancelado',\n defaultSubject: 'Pedido #{{order_number}} cancelado',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeu pedido #{{order_number}} foi cancelado. Se você não pediu isso, responda este e-mail.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'refund_confirmation', kind: 'transactional', icon: 'RotateCcw',\n title: 'Reembolso processado',\n description: 'Enviado quando um reembolso é processado',\n trigger: 'Quando o pagamento é estornado',\n defaultSubject: 'Reembolso emitido — pedido #{{order_number}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nO reembolso de {{order_total}} do pedido #{{order_number}} foi processado. O prazo de crédito depende do seu banco.\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'customer_welcome', kind: 'transactional', icon: 'Mail',\n title: 'Boas-vindas',\n description: 'Enviado quando um cliente cria conta na loja',\n trigger: 'Quando o cliente se cadastra',\n defaultSubject: 'Bem-vindo(a) à {{store_name}}',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSua conta na {{store_name}} está pronta. Bom proveito!\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n {\n event: 'abandoned_cart', kind: 'marketing', icon: 'ShoppingCart',\n title: 'Carrinho abandonado',\n description: 'Enviado quando o cliente deixa itens no carrinho sem finalizar',\n trigger: '1 hora após o abandono do carrinho',\n defaultSubject: 'Você esqueceu alguns itens no carrinho',\n defaultBody:\n 'Olá {{customer_name}},\\n\\nSeus itens ainda estão te esperando.\\n\\n{{cart_url}}\\n\\n{{store_name}}',\n defaultEnabled: false,\n },\n]\n\n/**\n * Substitutes the placeholders. Beside the catalog because PREVIEW and SEND must\n * agree: a screen doing its own `replace` has the merchant approve one text and\n * the customer receive another.\n *\n * An unknown placeholder stays visible as `{{foo}}` on purpose — in the preview\n * that exposes the typo; hiding it would hide the gap until the email had gone.\n */\nexport function renderEmailTemplate(text: string, values: Record<string, string>): string {\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (whole, key: string) => values[key] ?? whole)\n}\n\n/** Sample data for the preview. From no real order — the screen says so. */\nexport const EMAIL_PREVIEW_SAMPLE: Record<string, string> = {\n store_name: 'Sua Loja',\n customer_name: 'Maria Silva',\n order_number: '1042',\n order_total: 'R$ 189,90',\n order_items: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00',\n tracking_code: 'BR123456789BR',\n cart_url: 'https://sualoja.com.br/carrinho',\n}\n\nexport interface ResolvedEmailTemplate extends EmailEventDef {\n /** The merchant's override, when there is one. */\n override: EmailTemplate | null\n enabled: boolean\n /** Text in force: the merchant's if any, else the default. */\n subject: string\n body: string\n /** true when the merchant rewrote the text — the list flags it. */\n customized: boolean\n}\n\n/**\n * Joins the code catalog with the database overrides. A function and not a\n * query: the merge must give the same answer in the list, the editor and the\n * send, and three places doing the same `??` is how they start to disagree.\n */\nexport function resolveEmailTemplates(overrides: EmailTemplate[]): ResolvedEmailTemplate[] {\n const byEvent = new Map(overrides.map((o) => [o.event, o]))\n return SHOP_EMAIL_EVENTS.map((def) => {\n const override = byEvent.get(def.event) ?? null\n return {\n ...def,\n override,\n enabled: override?.enabled ?? def.defaultEnabled,\n subject: override?.subject ?? def.defaultSubject,\n body: override?.body ?? def.defaultBody,\n customized: Boolean(override?.subject || override?.body),\n }\n })\n}\n","import type { PluginEventDefinition, MessageDefaultsDef, EventField } from '@fayz-ai/core'\nimport { SHOP_EMAIL_EVENTS } from './emails'\n\n// ---------------------------------------------------------------------------\n// The FACTS the store emits and, separately, the text we suggest for each.\n//\n// buildShopDomainEvents() the fact's contract: what happened, what data\n// comes with it, whether it is audited. Webhooks\n// and the audit trail read this.\n// buildShopMessageDefaults() a REACTION to the fact: which channel, which\n// text. Only automations read it.\n//\n// Merging the two would mean whoever writes a Google Calendar integration has to\n// import email vocabulary to find out what fields \"order paid\" carries — and an\n// event with no text could not exist.\n// ---------------------------------------------------------------------------\n\n/** The fields every order event carries. */\nconst ORDER_FIELDS: EventField[] = [\n { name: 'order_number', label: 'Número do pedido', type: 'string', example: '1042' },\n { name: 'order_total', label: 'Total', type: 'money', example: 'R$ 189,90' },\n { name: 'order_items', label: 'Itens', type: 'string', example: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00' },\n { name: 'customer_name', label: 'Cliente', type: 'string', example: 'Maria Silva' },\n // Where the notification GOES — the automation reads its recipient from\n // these (recipientField), same contract as agenda's customer_phone.\n { name: 'customer_email', label: 'E-mail do cliente', type: 'string', example: 'maria@exemplo.com' },\n { name: 'customer_phone', label: 'Telefone do cliente', type: 'string', example: '(21) 99889-9889' },\n // Not in the emitter's payload on purpose: the browser has no reliable\n // source for the store's public name — the SENDER fills this slot.\n { name: 'store_name', label: 'Loja', type: 'string', example: 'Sua Loja' },\n]\n\nconst TRACKING_FIELD: EventField = {\n name: 'tracking_code', label: 'Código de rastreio', type: 'string', example: 'BR123456789BR',\n}\nconst CART_FIELD: EventField = {\n name: 'cart_url', label: 'Link do carrinho', type: 'url', example: 'https://sualoja.com.br/carrinho',\n}\n\n/** Fields per event — what the emitter actually sends in each. */\nconst FIELDS_BY_EVENT: Record<string, EventField[]> = {\n order_shipped: [...ORDER_FIELDS, TRACKING_FIELD],\n order_delivered: [...ORDER_FIELDS, TRACKING_FIELD],\n abandoned_cart: [...ORDER_FIELDS, CART_FIELD],\n}\n\n/**\n * Facts that are NOT audited: nobody performed them. \"Abandoned cart\" is the\n * absence of an act, and a trail full of non-acts is a trail nobody reads.\n */\nconst NOT_AUDITED = new Set(['abandoned_cart'])\n\nexport function buildShopDomainEvents(): PluginEventDefinition[] {\n return SHOP_EMAIL_EVENTS.map((def) => ({\n name: `shop.${def.event}`,\n title: def.title,\n description: def.description,\n trigger: def.trigger,\n icon: def.icon,\n fields: FIELDS_BY_EVENT[def.event] ?? ORDER_FIELDS,\n audit: !NOT_AUDITED.has(def.event),\n }))\n}\n\n/** Events whose WhatsApp notification is routine in a Brazilian store. */\nconst WHATSAPP_EVENTS = new Set(['order_confirmation', 'order_shipped', 'abandoned_cart'])\n\n/** WhatsApp text is short and subject-less — not the email body, truncated. */\nconst WHATSAPP_BODY: Record<string, string> = {\n order_confirmation:\n 'Oi {{customer_name}}! Recebemos seu pedido e ele já está confirmado por aqui ✅\\n\\nPedido: #{{order_number}}\\nTotal: {{order_total}}\\n\\nVamos te avisando por aqui a cada passo — e qualquer dúvida, é só responder esta mensagem.\\n\\nEquipe {{store_name}} agradece a preferência!',\n order_shipped:\n 'Oi {{customer_name}}! Boa notícia: seu pedido saiu para entrega 🚚\\n\\nPedido: #{{order_number}}\\nCódigo de rastreio: {{tracking_code}}\\n\\nQualquer coisa no caminho, é só responder esta mensagem que a gente resolve.\\n\\nEquipe {{store_name}} agradece a preferência!',\n abandoned_cart:\n 'Oi {{customer_name}}! Vi que ficaram itens no seu carrinho 🛒\\n\\nQuer que eu segure para você?\\n{{cart_url}}\\n\\n— {{store_name}}',\n}\n\nexport function buildShopMessageDefaults(): MessageDefaultsDef[] {\n return SHOP_EMAIL_EVENTS.map((def) => {\n const whatsapp = WHATSAPP_EVENTS.has(def.event) ? WHATSAPP_BODY[def.event] : undefined\n return {\n eventKey: `shop.${def.event}`,\n kind: def.kind,\n channels: whatsapp ? (['email', 'whatsapp'] as const).slice() : ['email' as const],\n defaults: {\n email: { subject: def.defaultSubject, body: def.defaultBody },\n ...(whatsapp ? { whatsapp: { body: whatsapp } } : {}),\n },\n // Only email inherits \"on by default\". WhatsApp bills per message and\n // needs an approved number — switching itself on would spend someone's\n // money unasked.\n defaultEnabled: { email: def.defaultEnabled },\n }\n })\n}\n","// ---------------------------------------------------------------------------\n// Delivery-time image variants for the store's own storage.\n//\n// A product photo lands in the store's bucket as the merchant uploaded it —\n// a 4000-pixel JPEG, often — and every card, thumbnail and gallery drew that\n// same file. Supabase Storage renders variants on request\n// (`/render/image/public/…?width=…`), resized once per size, cached at its\n// CDN, and encoded as WebP for a browser that accepts it. This module writes\n// those URLs. Nothing here fetches; it only knows the shape of an object URL\n// and how a variant of it is spelled.\n//\n// It is DELIBERATELY passthrough for anything that is not the store's own\n// storage: an image still hotlinked from somewhere else comes back untouched.\n// Whether the store's storage renders variants at all is a property of the\n// project (a plan feature), so the storefront asks its config before using\n// this — see `imageLoading.transform` in @fayz-ai/storefront.\n// ---------------------------------------------------------------------------\n\nexport interface ImageVariantOptions {\n /** Target width in CSS pixels; the render keeps the aspect ratio unless `height` is set too. */\n width?: number\n height?: number\n /** 20–100. Default 80: visibly lossless for photos at a third of the bytes. */\n quality?: number\n /** How to fit when both dimensions are given. */\n resize?: 'cover' | 'contain' | 'fill'\n /** Keep the original encoding instead of negotiating WebP. */\n format?: 'origin'\n}\n\n/** The srcset ladder a product image is offered at. */\nexport const IMAGE_SRCSET_WIDTHS: readonly number[] = Object.freeze([320, 480, 640, 960, 1280, 1600])\n\nconst PUBLIC_OBJECT = /^(https?:\\/\\/[^/]+\\/storage\\/v1)\\/(?:object|render\\/image)\\/public\\/([^?#]+)(?:\\?[^#]*)?(#.*)?$/\n\n/** Is this URL a public object in a Supabase Storage bucket (ours or a variant of it)? */\nexport function isStorageImageUrl(url: string | null | undefined): boolean {\n return typeof url === 'string' && PUBLIC_OBJECT.test(url)\n}\n\n/**\n * The URL of `url` rendered at `options`, or `url` itself when it is not a\n * storage object (a hotlink, a data URL, a placeholder). Idempotent: a\n * variant URL is re-derived from its object, never stacked.\n */\nexport function imageVariantUrl(url: string, options: ImageVariantOptions = {}): string {\n const match = PUBLIC_OBJECT.exec(url)\n if (!match) return url\n const [, storageBase, objectPath] = match\n const params = new URLSearchParams()\n if (options.width) params.set('width', String(Math.round(options.width)))\n if (options.height) params.set('height', String(Math.round(options.height)))\n // `contain` whenever the caller asked for one dimension and left the other\n // open. The docs say a single dimension keeps the aspect ratio; the CDN does\n // not — `?width=960` on a 1740×2609 photo answers 960×2609, the width forced\n // and the height untouched, and every image in the store came back stretched\n // (a 64px thumbnail of a square photo was 64×1254). With `contain` the same\n // request answers 960×1439. A caller that pins BOTH dimensions has said what\n // shape it wants and keeps the CDN's default.\n const resize = options.resize ?? (options.width && options.height ? undefined : 'contain')\n if (resize) params.set('resize', resize)\n params.set('quality', String(clampQuality(options.quality ?? 80)))\n if (options.format) params.set('format', options.format)\n return `${storageBase}/render/image/public/${objectPath}?${params.toString()}`\n}\n\n/**\n * A `srcset` for `url` across `widths`, or undefined when `url` is not a\n * storage object — the caller then leaves the attribute off and the browser\n * loads the one file, as before.\n */\nexport function imageSrcSet(\n url: string,\n widths: readonly number[] = IMAGE_SRCSET_WIDTHS,\n options: Omit<ImageVariantOptions, 'width'> = {},\n): string | undefined {\n if (!isStorageImageUrl(url)) return undefined\n return widths.map((w) => `${imageVariantUrl(url, { ...options, width: w })} ${w}w`).join(', ')\n}\n\nfunction clampQuality(q: number): number {\n return Math.min(100, Math.max(20, Math.round(q)))\n}\n"]}
|