@fayz-ai/ui 0.22.0 → 0.23.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.
Files changed (71) hide show
  1. package/dist/analytics/AnalyticsCard.d.ts.map +1 -1
  2. package/dist/analytics/AnalyticsControls.d.ts.map +1 -1
  3. package/dist/analytics/DateRangeControl.d.ts +14 -0
  4. package/dist/analytics/DateRangeControl.d.ts.map +1 -0
  5. package/dist/analytics/StatementTable.d.ts +22 -0
  6. package/dist/analytics/StatementTable.d.ts.map +1 -0
  7. package/dist/analytics/context.d.ts +8 -0
  8. package/dist/analytics/context.d.ts.map +1 -1
  9. package/dist/analytics/derive.d.ts +13 -0
  10. package/dist/analytics/derive.d.ts.map +1 -1
  11. package/dist/analytics/index.d.ts +7 -1
  12. package/dist/analytics/index.d.ts.map +1 -1
  13. package/dist/analytics/statement.d.ts +58 -0
  14. package/dist/analytics/statement.d.ts.map +1 -0
  15. package/dist/{chunk-E44WOPCR.js → chunk-HO2P2XB4.js} +428 -58
  16. package/dist/chunk-HO2P2XB4.js.map +1 -0
  17. package/dist/{chunk-7G3O54CC.js → chunk-L4TXDKMN.js} +5 -5
  18. package/dist/chunk-L4TXDKMN.js.map +1 -0
  19. package/dist/{chunk-DHNUZF2X.js → chunk-OWN3GFDG.js} +4 -3
  20. package/dist/chunk-OWN3GFDG.js.map +1 -0
  21. package/dist/{chunk-PQUS22JE.js → chunk-RRNMNFLF.js} +483 -794
  22. package/dist/chunk-RRNMNFLF.js.map +1 -0
  23. package/dist/chunk-UP7WVKSU.js +631 -0
  24. package/dist/chunk-UP7WVKSU.js.map +1 -0
  25. package/dist/{chunk-ZSOT7KTE.js → chunk-XEUIYSW2.js} +321 -361
  26. package/dist/chunk-XEUIYSW2.js.map +1 -0
  27. package/dist/{chunk-SUSW4LSW.js → chunk-XKFYX3DG.js} +5 -5
  28. package/dist/{chunk-SUSW4LSW.js.map → chunk-XKFYX3DG.js.map} +1 -1
  29. package/dist/dashboard/index.js +4 -4
  30. package/dist/icons.js +1 -1
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +672 -87
  34. package/dist/index.js.map +1 -1
  35. package/dist/layout/AppShell.d.ts +7 -1
  36. package/dist/layout/AppShell.d.ts.map +1 -1
  37. package/dist/layout/ShellSearch.d.ts +53 -0
  38. package/dist/layout/ShellSearch.d.ts.map +1 -0
  39. package/dist/layout/Sidebar.d.ts +10 -6
  40. package/dist/layout/Sidebar.d.ts.map +1 -1
  41. package/dist/layout/Takeover.d.ts.map +1 -1
  42. package/dist/layout/index.d.ts +1 -0
  43. package/dist/layout/index.d.ts.map +1 -1
  44. package/dist/layout/index.js +4 -4
  45. package/dist/primitives/data-table.d.ts.map +1 -1
  46. package/dist/primitives/date-range-chip.d.ts +32 -0
  47. package/dist/primitives/date-range-chip.d.ts.map +1 -0
  48. package/dist/primitives/header-tabs.d.ts.map +1 -1
  49. package/dist/primitives/index.d.ts +2 -1
  50. package/dist/primitives/index.d.ts.map +1 -1
  51. package/dist/primitives/index.js +5 -5
  52. package/dist/primitives/list-view.d.ts +43 -1
  53. package/dist/primitives/list-view.d.ts.map +1 -1
  54. package/dist/primitives/modal.d.ts +2 -0
  55. package/dist/primitives/modal.d.ts.map +1 -1
  56. package/dist/primitives/page-actions.d.ts +14 -0
  57. package/dist/primitives/page-actions.d.ts.map +1 -1
  58. package/dist/primitives/page-toolbar.d.ts +16 -1
  59. package/dist/primitives/page-toolbar.d.ts.map +1 -1
  60. package/dist/primitives/segmented-control.d.ts.map +1 -1
  61. package/dist/stores/layout.store.d.ts +20 -1
  62. package/dist/stores/layout.store.d.ts.map +1 -1
  63. package/dist/styles.css +58 -0
  64. package/package.json +2 -2
  65. package/dist/chunk-7G3O54CC.js.map +0 -1
  66. package/dist/chunk-DHNUZF2X.js.map +0 -1
  67. package/dist/chunk-E44WOPCR.js.map +0 -1
  68. package/dist/chunk-HKGTF2YA.js +0 -117
  69. package/dist/chunk-HKGTF2YA.js.map +0 -1
  70. package/dist/chunk-PQUS22JE.js.map +0 -1
  71. package/dist/chunk-ZSOT7KTE.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/primitives/Avatar.tsx","../src/analytics/range.ts","../src/analytics/derive.ts","../src/analytics/batch.ts","../src/analytics/context.tsx","../src/analytics/AnalyticsCard.tsx","../src/analytics/AnalyticsGrid.tsx","../src/analytics/AnalyticsControls.tsx","../src/tour/practice.store.ts","../src/tour/tour.store.ts","../src/tour/confetti.ts","../src/tour/TourSpotlight.tsx","../src/tour/types.ts","../src/tour/PracticeOverlay.tsx"],"names":["React","value","jsx","React3","React4","jsxs","create","React5","prev","Fragment","X","React6","createPortal","Check"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '../lib/cn'\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full',\n className\n )}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-muted',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import type { AnalyticsDateRange, AnalyticsCompare } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Date ranges and their comparison windows.\n//\n// All arithmetic is done on LOCAL calendar days and serialized as YYYY-MM-DD.\n// Using toISOString() here would silently shift every range by the UTC offset —\n// in America/Sao_Paulo \"today\" would start at 21:00 yesterday, which is exactly\n// how a dashboard ends up disagreeing with the orders list by one day.\n// ---------------------------------------------------------------------------\n\nexport type AnalyticsRangePreset =\n | 'today' | 'yesterday' | 'last_7_days' | 'last_30_days' | 'last_90_days'\n | 'this_month' | 'last_month' | 'this_quarter' | 'this_year' | 'custom'\n\nexport function toDayString(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nexport function parseDay(s: string): Date {\n // Noon avoids the DST edge where midnight does not exist on a spring-forward day.\n const [y, m, d] = s.split('-').map(Number)\n return new Date(y ?? 1970, (m ?? 1) - 1, d ?? 1, 12, 0, 0, 0)\n}\n\nfunction shiftDays(d: Date, days: number): Date {\n const next = new Date(d)\n next.setDate(next.getDate() + days)\n return next\n}\n\n/** Inclusive whole-day count, so a single-day range compares against one day. */\nexport function rangeLengthDays(range: AnalyticsDateRange): number {\n const from = parseDay(range.from)\n const to = parseDay(range.to)\n return Math.max(1, Math.round((to.getTime() - from.getTime()) / 86_400_000) + 1)\n}\n\nexport function resolveRangePreset(preset: AnalyticsRangePreset, today = new Date()): AnalyticsDateRange {\n const base = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 12)\n switch (preset) {\n case 'today':\n return { from: toDayString(base), to: toDayString(base) }\n case 'yesterday': {\n const y = shiftDays(base, -1)\n return { from: toDayString(y), to: toDayString(y) }\n }\n // \"Last 7 days\" includes today, so it spans today minus six — not minus\n // seven, which would be eight days of data under a seven-day label.\n case 'last_7_days':\n return { from: toDayString(shiftDays(base, -6)), to: toDayString(base) }\n case 'last_30_days':\n return { from: toDayString(shiftDays(base, -29)), to: toDayString(base) }\n case 'last_90_days':\n return { from: toDayString(shiftDays(base, -89)), to: toDayString(base) }\n case 'this_month':\n return {\n from: toDayString(new Date(base.getFullYear(), base.getMonth(), 1, 12)),\n to: toDayString(base),\n }\n case 'last_month': {\n const first = new Date(base.getFullYear(), base.getMonth() - 1, 1, 12)\n const last = new Date(base.getFullYear(), base.getMonth(), 0, 12)\n return { from: toDayString(first), to: toDayString(last) }\n }\n case 'this_quarter': {\n const q = Math.floor(base.getMonth() / 3)\n return {\n from: toDayString(new Date(base.getFullYear(), q * 3, 1, 12)),\n to: toDayString(base),\n }\n }\n case 'this_year':\n return { from: toDayString(new Date(base.getFullYear(), 0, 1, 12)), to: toDayString(base) }\n default:\n return { from: toDayString(shiftDays(base, -29)), to: toDayString(base) }\n }\n}\n\n/**\n * The window a range is compared against.\n *\n * 'previous_period' is the same NUMBER OF DAYS ending the day before `from`, so\n * a 7-day range compares against the 7 days before it — never an overlapping\n * window, which would double-count the boundary day in both halves.\n */\nexport function comparisonRange(\n range: AnalyticsDateRange,\n compare: AnalyticsCompare | undefined,\n): AnalyticsDateRange | null {\n if (!compare || compare === 'none') return null\n\n if (compare === 'previous_year') {\n const from = parseDay(range.from)\n const to = parseDay(range.to)\n from.setFullYear(from.getFullYear() - 1)\n to.setFullYear(to.getFullYear() - 1)\n return { from: toDayString(from), to: toDayString(to) }\n }\n\n const days = rangeLengthDays(range)\n const prevTo = shiftDays(parseDay(range.from), -1)\n const prevFrom = shiftDays(prevTo, -(days - 1))\n return { from: toDayString(prevFrom), to: toDayString(prevTo) }\n}\n\n/**\n * Bucket size that keeps a chart readable across the chosen range: hours for a\n * single day, days for a quarter, months for a year. A fixed 'day' grain turns\n * a 12-month range into 365 unreadable ticks.\n */\nexport function autoGrain(range: AnalyticsDateRange): 'hour' | 'day' | 'week' | 'month' {\n const days = rangeLengthDays(range)\n if (days <= 2) return 'hour'\n if (days <= 62) return 'day'\n if (days <= 180) return 'week'\n return 'month'\n}\n","import type {\n AnalyticsCardDef, AnalyticsMeasure, AnalyticsResult, AnalyticsRow,\n AnalyticsSummary, AnalyticsFormat, AnalyticsGrain,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Pure derivations shared by every analytics surface.\n//\n// These live apart from the components on purpose: the overview tile, the\n// report viewer and the CSV export must agree to the last decimal, and the only\n// way to guarantee that is for all three to call the same function rather than\n// each formatting \"close enough\" in its own JSX.\n// ---------------------------------------------------------------------------\n\n// `errorMessage` now lives in ../lib/error-message — every screen that catches\n// from Supabase needs it, not just the analytics cards. Re-exported here so the\n// analytics barrel keeps its shape.\nexport { errorMessage } from '../lib/error-message'\n\n/**\n * True when the failure is \"the analytics engine was never installed\" rather\n * than \"this query is wrong\" — a missing function, view or schema-cache entry.\n * Worth separating: one is a migration a developer has to run, the other is a\n * bug in a card, and telling a user \"unknown error\" for the first wastes an\n * afternoon.\n */\nexport function isEngineMissing(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false\n const e = err as Record<string, unknown>\n const code = typeof e.code === 'string' ? e.code : ''\n // 42883 undefined_function · 42P01 undefined_table · PGRST202 no such\n // function in the schema cache.\n if (['42883', '42P01', 'PGRST202'].includes(code)) return true\n const message = typeof e.message === 'string' ? e.message.toLowerCase() : ''\n // \"permission denied for function analytics_run\" names the engine too, but it\n // is installed — the caller is not allowed in. Sending that user to run a\n // migration is the wrong afternoon.\n if (message.includes('permission denied') || code === '42501') return false\n return message.includes('analytics_run') || message.includes('plg_shop_rep_')\n}\n\nexport function num(value: unknown): number {\n if (value == null) return 0\n const n = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(n) ? n : 0\n}\n\n/**\n * Resolve 'ratio' measures from the two measures they reference.\n *\n * Deliberately done HERE and not in SQL: a ratio aggregated per group and then\n * averaged is not the ratio of the totals. Average order value over a week is\n * sum(total)/count(orders) — not the mean of each day's average, which weights\n * a 1-order Sunday the same as a 400-order Friday.\n */\nexport function resolveRatios(\n summary: AnalyticsSummary | undefined,\n measures: AnalyticsMeasure[] = [],\n): AnalyticsSummary {\n const out: AnalyticsSummary = { ...(summary ?? {}) }\n for (const m of measures) {\n if (m.agg !== 'ratio' || !m.ratioOf) continue\n const [numeratorKey, denominatorKey] = m.ratioOf\n const denominator = num(out[denominatorKey])\n out[m.key] = denominator === 0 ? 0 : (num(out[numeratorKey]) / denominator) * (m.scale ?? 1)\n }\n return out\n}\n\n/** Apply ratio measures to every row of a grouped result, not just the rollup. */\nexport function resolveRowRatios(rows: AnalyticsRow[], measures: AnalyticsMeasure[] = []): AnalyticsRow[] {\n const ratios = measures.filter((m) => m.agg === 'ratio' && m.ratioOf)\n if (ratios.length === 0) return rows\n return rows.map((row) => ({ ...row, ...resolveRatios(row as AnalyticsSummary, ratios) }))\n}\n\n/**\n * Percentage change, or null when there is no honest answer.\n *\n * Growth from zero is not \"+100%\" and not \"+∞\" — it is undefined, and printing\n * a number there is how a dashboard claims a trend it cannot know. The card\n * shows a dash instead.\n */\nexport function deltaPercent(current: number, previous: number | undefined | null): number | null {\n if (previous == null || previous === 0) return null\n return ((current - previous) / Math.abs(previous)) * 100\n}\n\nexport function trendOf(current: number, previous: number | undefined | null): 'up' | 'down' | 'neutral' | undefined {\n if (previous == null) return undefined\n if (current > previous) return 'up'\n if (current < previous) return 'down'\n return 'neutral'\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsCurrency {\n code?: string\n locale?: string\n symbol?: string\n}\n\n/** Compact form for card headlines: 1.2K, 3.4M. */\nexport function formatCompact(value: number, locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { notation: 'compact', maximumFractionDigits: 1 }).format(value)\n}\n\nexport function formatAnalyticsValue(\n value: unknown,\n format: AnalyticsFormat | undefined,\n currency?: AnalyticsCurrency,\n opts?: { compact?: boolean },\n): string {\n const locale = currency?.locale ?? 'pt-BR'\n\n if (format === 'date') {\n if (!value) return '—'\n const d = new Date(String(value))\n return Number.isNaN(d.getTime()) ? String(value) : d.toLocaleDateString(locale)\n }\n if (format === 'text' || typeof value === 'string' && format == null) {\n return value == null || value === '' ? '—' : String(value)\n }\n\n const n = num(value)\n switch (format) {\n case 'currency':\n return opts?.compact && Math.abs(n) >= 10_000\n ? `${currency?.symbol ?? 'R$'}${formatCompact(n, locale)}`\n : new Intl.NumberFormat(locale, {\n style: 'currency', currency: currency?.code ?? 'BRL', maximumFractionDigits: 2,\n }).format(n)\n case 'percent':\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)}%`\n case 'duration':\n return formatDuration(n)\n default:\n return opts?.compact && Math.abs(n) >= 10_000\n ? formatCompact(n, locale)\n : new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)\n }\n}\n\n/** Durations are stored in HOURS (the read models emit hours_to_fulfillment). */\nexport function formatDuration(hours: number): string {\n if (!Number.isFinite(hours) || hours <= 0) return '0s'\n const totalMinutes = Math.round(hours * 60)\n if (totalMinutes < 1) return `${Math.round(hours * 3600)}s`\n if (totalMinutes < 60) return `${totalMinutes}min`\n const h = Math.floor(totalMinutes / 60)\n const m = totalMinutes % 60\n if (h < 24) return m ? `${h}h ${m}min` : `${h}h`\n const d = Math.floor(h / 24)\n return `${d}d ${h % 24}h`\n}\n\n/** Axis tick for a bucketed timestamp — short, locale-aware, grain-aware. */\nexport function formatBucket(value: unknown, grain: AnalyticsGrain | undefined, locale = 'pt-BR'): string {\n if (value == null) return '—'\n const d = new Date(String(value))\n if (Number.isNaN(d.getTime())) return String(value)\n switch (grain) {\n case 'hour': return d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })\n case 'month': return d.toLocaleDateString(locale, { month: 'short', year: '2-digit' })\n case 'quarter': return `Q${Math.floor(d.getMonth() / 3) + 1} ${d.getFullYear()}`\n case 'year': return String(d.getFullYear())\n default: return d.toLocaleDateString(locale, { day: '2-digit', month: 'short' })\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shaping — result rows into what each viz wants\n// ---------------------------------------------------------------------------\n\nexport interface BreakdownRow {\n label: string\n value: number\n /** Share of the largest row (0–1), for the inline bar width. */\n share: number\n formatted: string\n}\n\n/**\n * Rows for the \"sessions by device type\" style list. Bars are scaled to the\n * LARGEST row, not to the total: with one dominant category every other bar\n * collapses to an invisible sliver and the list stops communicating rank.\n */\nexport function toBreakdown(\n rows: AnalyticsRow[],\n categoryKey: string,\n measureKey: string,\n format: AnalyticsFormat | undefined,\n currency?: AnalyticsCurrency,\n limit?: number,\n): BreakdownRow[] {\n const mapped = rows.map((row) => ({\n label: row[categoryKey] == null || row[categoryKey] === '' ? '—' : String(row[categoryKey]),\n value: num(row[measureKey]),\n }))\n const max = mapped.reduce((m, r) => Math.max(m, Math.abs(r.value)), 0)\n const sliced = limit ? mapped.slice(0, limit) : mapped\n return sliced.map((r) => ({\n ...r,\n share: max === 0 ? 0 : Math.abs(r.value) / max,\n formatted: formatAnalyticsValue(r.value, format, currency),\n }))\n}\n\n/** The measures a card actually renders, in the order the viz asked for. */\nexport function vizMeasures(card: AnalyticsCardDef): AnalyticsMeasure[] {\n const all = card.query.measures ?? []\n const wanted = card.viz.measures\n if (!wanted?.length) return all\n return wanted\n .map((key) => all.find((m) => m.key === key))\n .filter((m): m is AnalyticsMeasure => Boolean(m))\n}\n\n/** The dimension a chart/breakdown puts on its category axis. */\nexport function vizCategory(card: AnalyticsCardDef) {\n // A hidden dimension carries an id, not a label — an axis of UUIDs is not a\n // category axis, so it can never be the default.\n const dims = (card.query.dimensions ?? []).filter((d) => !d.hidden)\n if (card.viz.categoryKey) return dims.find((d) => d.key === card.viz.categoryKey) ?? dims[0]\n return dims[0]\n}\n\n/**\n * Chart rows with the category axis pre-formatted.\n *\n * recharts renders whatever string it is handed, so bucketed timestamps must be\n * humanised BEFORE they reach it — otherwise the x-axis reads\n * \"2026-08-01T00:00:00+00:00\".\n */\nexport function toChartData(\n rows: AnalyticsRow[],\n categoryKey: string,\n grain: AnalyticsGrain | undefined,\n locale = 'pt-BR',\n): Array<Record<string, string | number>> {\n return rows.map((row) => {\n const out: Record<string, string | number> = {}\n for (const [k, v] of Object.entries(row)) {\n if (k === categoryKey) continue\n out[k] = typeof v === 'number' ? v : num(v)\n }\n out[categoryKey] = grain\n ? formatBucket(row[categoryKey], grain, locale)\n : (row[categoryKey] == null || row[categoryKey] === '' ? '—' : String(row[categoryKey]))\n return out\n })\n}\n\n/** Sparkline series for a KPI: the headline measure across the time buckets. */\nexport function toSpark(result: AnalyticsResult | null, measureKey: string): number[] | undefined {\n if (!result?.rows?.length || result.rows.length < 2) return undefined\n return result.rows.map((row) => num(row[measureKey]))\n}\n","import type {\n AnalyticsCardDef, AnalyticsProvider, AnalyticsQueryState, AnalyticsResult,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Two round-trip savings, wrapped around any provider.\n//\n// 1. DE-DUPLICATION. Identical queries issued in the same tick share one\n// request: the report viewer renders the chart and the table from the SAME\n// card, and an overview can hold two cards over one query.\n//\n// 2. BATCHING. Cards fetch themselves — the right ownership (a tile added to a\n// pack must not require editing a page-level query) and the reason an\n// overview of twenty-two tiles, most also asking for a comparison window,\n// issued FORTY-ONE requests, and issued them all again on every change of\n// date range. Everything queued within one frame leaves as a single\n// `runMany`; a provider that cannot answer several at once is unaffected and\n// still gets N calls.\n//\n// Deliberately transport-agnostic and outside React: what to coalesce is a\n// property of the queries, not of the render, and keeping it here is what lets\n// it be tested without mounting twenty-two cards.\n// ---------------------------------------------------------------------------\n\n/**\n * How long a queued query waits for its neighbours before going out.\n *\n * Long enough to catch every card of one render, short enough that nobody\n * perceives it — the request it joins takes two orders of magnitude longer.\n */\nexport const BATCH_WINDOW_MS = 16\n\ninterface Pending {\n card: AnalyticsCardDef\n state: AnalyticsQueryState\n resolve: (result: AnalyticsResult) => void\n reject: (error: unknown) => void\n}\n\nexport interface BatchingProviderOptions {\n /** Coalescing window. Exposed for tests; production uses the default. */\n windowMs?: number\n /**\n * Part of every de-duplication key. The surface bumps it on ↻ so a refresh\n * is not served the in-flight promise it is trying to replace.\n */\n refreshToken?: number\n}\n\nexport function createBatchingProvider(\n provider: AnalyticsProvider,\n options: BatchingProviderOptions = {},\n): AnalyticsProvider {\n const windowMs = options.windowMs ?? BATCH_WINDOW_MS\n const inflight = new Map<string, Promise<AnalyticsResult>>()\n let queue: Pending[] = []\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const flush = () => {\n timer = null\n const batch = queue\n queue = []\n if (batch.length === 0) return\n\n const individually = () => {\n for (const p of batch) provider.run(p.card, p.state).then(p.resolve, p.reject)\n }\n\n // One card is not a batch — routing it through runMany would only add a\n // layer between it and the identical single request.\n if (batch.length === 1 || !provider.runMany) { individually(); return }\n\n // Guarded because the feature check above can LIE. Providers reach here\n // through createSafeDataProvider, whose Proxy answers every property with a\n // function, so `runMany` is truthy even where the underlying provider has\n // none — and the throw lands synchronously, before any promise exists to\n // reject. Falling back keeps such a provider working at N requests instead\n // of blanking the surface.\n let batchCall: Promise<Array<AnalyticsResult | Error>>\n try {\n batchCall = provider.runMany(batch.map(({ card, state }) => ({ card, state })))\n } catch {\n individually()\n return\n }\n\n batchCall.then(\n (results) => batch.forEach((p, i) => {\n const result = results[i]\n // A provider that returns fewer answers than questions has mismatched\n // the two, and resolving with `undefined` would render a card of zeroes\n // that looks like real data.\n if (!result) p.reject(new Error('analytics: batch returned no result for this card'))\n else if (result instanceof Error) p.reject(result)\n else p.resolve(result)\n }),\n (error: unknown) => batch.forEach((p) => p.reject(error)),\n )\n }\n\n return {\n run(card, state) {\n const key = JSON.stringify([card.id, state, options.refreshToken ?? 0])\n const existing = inflight.get(key)\n if (existing) return existing\n\n const promise = new Promise<AnalyticsResult>((resolve, reject) => {\n queue.push({ card, state, resolve, reject })\n // A timeout and not a microtask: React does not guarantee that every\n // card's effect lands in one synchronous flush, and a microtask firing\n // between two of them splits one dashboard into several batches.\n if (timer == null) timer = setTimeout(flush, windowMs)\n }).finally(() => {\n // Held only for the duration of the request: this is de-duplication,\n // not caching. Keeping results would mean a stale dashboard after a\n // write, which is a worse bug than an extra fetch.\n inflight.delete(key)\n })\n\n inflight.set(key, promise)\n return promise\n },\n\n // Passed through so a caller that already has a batch of its own (an export\n // of every card, say) still reaches the provider's own batching.\n runMany: provider.runMany ? (requests) => provider.runMany!(requests) : undefined,\n }\n}\n","import * as React from 'react'\nimport type {\n AnalyticsCardDef, AnalyticsProvider, AnalyticsQueryState, AnalyticsResult,\n AnalyticsCompare, AnalyticsDateRange, AnalyticsGrain, AnalyticsRow,\n} from '@fayz-ai/core'\nimport { comparisonRange, resolveRangePreset, autoGrain, type AnalyticsRangePreset } from './range'\nimport { resolveRatios, resolveRowRatios, errorMessage, isEngineMissing, type AnalyticsCurrency } from './derive'\nimport { createBatchingProvider } from './batch'\n\n// ---------------------------------------------------------------------------\n// One page-level state for every card on the surface.\n//\n// The range, the comparison and the filters belong to the PAGE, not to each\n// tile: the control bar at the top of the overview must move all fourteen cards\n// at once, and a report opened from a card has to inherit what the user was\n// looking at. Card-local state would mean fourteen date pickers disagreeing.\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsContextValue {\n provider: AnalyticsProvider\n currency: AnalyticsCurrency\n state: AnalyticsQueryState\n preset: AnalyticsRangePreset\n setPreset: (preset: AnalyticsRangePreset) => void\n setDateRange: (range: AnalyticsDateRange) => void\n setCompare: (compare: AnalyticsCompare) => void\n setFilter: (key: string, value: unknown) => void\n setFilters: (filters: Record<string, unknown>) => void\n clearFilters: () => void\n setPage: (page: number) => void\n setPageSize: (pageSize: number) => void\n setSort: (sortBy: string, sortDir: 'asc' | 'desc') => void\n setSearch: (search: string) => void\n /** Bumped to force every mounted card to refetch (the ↻ button). */\n refreshToken: number\n refresh: () => void\n /** Open a card as a full-page report. Absent ⇒ cards render no open affordance. */\n onOpenCard?: (card: AnalyticsCardDef) => void\n /** \"Created by\" shown on cards a pack did not attribute individually. */\n createdBy?: string\n}\n\nconst AnalyticsContext = React.createContext<AnalyticsContextValue | null>(null)\n\nexport function useAnalyticsContext(): AnalyticsContextValue {\n const ctx = React.useContext(AnalyticsContext)\n if (!ctx) throw new Error('useAnalyticsContext must be used inside <AnalyticsContextProvider>')\n return ctx\n}\n\n/** Non-throwing variant for primitives that may render outside a surface. */\nexport function useAnalyticsContextOptional(): AnalyticsContextValue | null {\n return React.useContext(AnalyticsContext)\n}\n\nexport interface AnalyticsContextProviderProps {\n provider: AnalyticsProvider\n currency?: AnalyticsCurrency\n defaultPreset?: AnalyticsRangePreset\n defaultCompare?: AnalyticsCompare\n defaultPageSize?: number\n onOpenCard?: (card: AnalyticsCardDef) => void\n createdBy?: string\n children: React.ReactNode\n}\n\nexport function AnalyticsContextProvider({\n provider, currency, defaultPreset = 'last_30_days', defaultCompare = 'previous_period',\n defaultPageSize = 50, onOpenCard, createdBy, children,\n}: AnalyticsContextProviderProps) {\n const [preset, setPresetState] = React.useState<AnalyticsRangePreset>(defaultPreset)\n const [refreshToken, setRefreshToken] = React.useState(0)\n const [state, setState] = React.useState<AnalyticsQueryState>(() => ({\n dateRange: resolveRangePreset(defaultPreset),\n compare: defaultCompare,\n filters: {},\n page: 1,\n pageSize: defaultPageSize,\n }))\n\n const setPreset = React.useCallback((next: AnalyticsRangePreset) => {\n setPresetState(next)\n if (next !== 'custom') {\n setState((s) => ({ ...s, dateRange: resolveRangePreset(next), page: 1 }))\n }\n }, [])\n\n const setDateRange = React.useCallback((dateRange: AnalyticsDateRange) => {\n setPresetState('custom')\n setState((s) => ({ ...s, dateRange, page: 1 }))\n }, [])\n\n const setCompare = React.useCallback((compare: AnalyticsCompare) => {\n setState((s) => ({ ...s, compare }))\n }, [])\n\n const setFilter = React.useCallback((key: string, value: unknown) => {\n setState((s) => {\n const filters = { ...s.filters }\n // An empty value REMOVES the filter rather than sending \"\" downstream,\n // which a provider would otherwise translate into `col = ''`.\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) delete filters[key]\n else filters[key] = value\n return { ...s, filters, page: 1 }\n })\n }, [])\n\n const setFilters = React.useCallback((filters: Record<string, unknown>) => {\n setState((s) => ({ ...s, filters, page: 1 }))\n }, [])\n\n const clearFilters = React.useCallback(() => {\n setState((s) => ({ ...s, filters: {}, page: 1 }))\n }, [])\n\n const setPage = React.useCallback((page: number) => {\n setState((s) => ({ ...s, page: Math.max(1, page) }))\n }, [])\n\n const setPageSize = React.useCallback((pageSize: number) => {\n // Changing page size while on page 7 lands you somewhere arbitrary, so the\n // pager resets — the user asked for \"show more\", not \"jump elsewhere\".\n setState((s) => ({ ...s, pageSize, page: 1 }))\n }, [])\n\n const setSort = React.useCallback((sortBy: string, sortDir: 'asc' | 'desc') => {\n setState((s) => ({ ...s, sortBy, sortDir, page: 1 }))\n }, [])\n\n const setSearch = React.useCallback((search: string) => {\n setState((s) => ({ ...s, search, page: 1 }))\n }, [])\n\n const refresh = React.useCallback(() => setRefreshToken((t) => t + 1), [])\n\n // Coalescing lives in batch.ts, not here: what to merge is a property of the\n // queries, not of the render.\n const batched = React.useMemo<AnalyticsProvider>(\n () => createBatchingProvider(provider, { refreshToken }),\n [provider, refreshToken],\n )\n\n const value = React.useMemo<AnalyticsContextValue>(() => ({\n provider: batched,\n currency: currency ?? { code: 'BRL', locale: 'pt-BR', symbol: 'R$' },\n state, preset, setPreset, setDateRange, setCompare, setFilter, setFilters, clearFilters,\n setPage, setPageSize, setSort, setSearch,\n refreshToken, refresh, onOpenCard, createdBy,\n }), [batched, currency, state, preset, setPreset, setDateRange, setCompare, setFilter,\n setFilters, clearFilters, setPage, setPageSize, setSort, setSearch,\n refreshToken, refresh, onOpenCard, createdBy])\n\n return <AnalyticsContext.Provider value={value}>{children}</AnalyticsContext.Provider>\n}\n\n// ---------------------------------------------------------------------------\n// Per-card fetching\n// ---------------------------------------------------------------------------\n\nexport interface UseAnalyticsCardResult {\n result: AnalyticsResult | null\n /** Rollup with ratio measures resolved. Empty object until loaded. */\n summary: Record<string, number>\n /** Same for the comparison window, or null when not comparing. */\n previousSummary: Record<string, number> | null\n loading: boolean\n error: string | null\n /** The failure is a missing migration, not a bad card. */\n engineMissing: boolean\n refetch: () => void\n}\n\n/** Resolve 'auto' grains against the active range before the query is built. */\nfunction withResolvedGrain(card: AnalyticsCardDef, range: AnalyticsDateRange): AnalyticsCardDef {\n const dims = card.query.dimensions\n if (!dims?.some((d) => d.grain === 'auto')) return card\n const grain: AnalyticsGrain = autoGrain(range)\n return {\n ...card,\n query: {\n ...card.query,\n dimensions: dims.map((d) => (d.grain === 'auto' ? { ...d, grain } : d)),\n },\n }\n}\n\nexport function useAnalyticsCard(\n card: AnalyticsCardDef,\n options?: { stateOverride?: Partial<AnalyticsQueryState>; enabled?: boolean },\n): UseAnalyticsCardResult {\n const { provider, state, refreshToken } = useAnalyticsContext()\n const [result, setResult] = React.useState<AnalyticsResult | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [engineMissing, setEngineMissing] = React.useState(false)\n\n const enabled = (options?.enabled ?? true) && card.available !== false\n const merged = React.useMemo<AnalyticsQueryState>(\n () => ({ ...state, ...options?.stateOverride }),\n [state, options?.stateOverride],\n )\n const resolved = React.useMemo(() => withResolvedGrain(card, merged.dateRange), [card, merged.dateRange])\n\n // Serialized query identity — the effect must rerun when the QUERY changes,\n // not when React hands us a new object with identical contents.\n const key = React.useMemo(\n () => JSON.stringify([resolved.id, merged, refreshToken]),\n [resolved.id, merged, refreshToken],\n )\n\n React.useEffect(() => {\n if (!enabled) { setResult(null); return }\n let cancelled = false\n setLoading(true)\n setError(null)\n setEngineMissing(false)\n\n const comparison = resolved.compare ? comparisonRange(merged.dateRange, merged.compare) : null\n\n Promise.all([\n provider.run(resolved, merged),\n comparison\n ? provider.run(resolved, { ...merged, dateRange: comparison }).catch(() => null)\n : Promise.resolve(null),\n ])\n .then(([current, previous]) => {\n if (cancelled) return\n setResult({\n ...current,\n rows: resolveRowRatios(current.rows, resolved.query.measures),\n previous: previous\n ? { rows: previous.rows, summary: previous.summary }\n : undefined,\n })\n })\n .catch((err: unknown) => {\n if (cancelled) return\n setResult(null)\n setError(errorMessage(err))\n setEngineMissing(isEngineMissing(err))\n })\n .finally(() => { if (!cancelled) setLoading(false) })\n\n // The comparison fetch is allowed to fail on its own (.catch above): a\n // missing previous window costs a trend chip, it must not blank the card.\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, enabled, provider])\n\n const refetch = React.useCallback(() => {\n setResult(null)\n setLoading(true)\n }, [])\n\n const summary = React.useMemo(\n () => resolveRatios(result?.summary, resolved.query.measures),\n [result?.summary, resolved.query.measures],\n )\n const previousSummary = React.useMemo(\n () => (result?.previous ? resolveRatios(result.previous.summary, resolved.query.measures) : null),\n [result?.previous, resolved.query.measures],\n )\n\n return { result, summary, previousSummary, loading, error, engineMissing, refetch }\n}\n\n/**\n * Fetch EVERY row the card's current query returns, not just the page on\n * screen — what an export needs.\n *\n * The viewer paginates at 50, and a spreadsheet holding 50 of 4,000 leads is\n * worse than no spreadsheet: nothing on the file says it is a fragment, so it\n * gets mailed to an accountant as if it were the whole month. Pages through the\n * same provider with the same filters, the same range and the same sort, so the\n * file and the screen answer the same question.\n *\n * `compare` is dropped: the previous window costs a round trip and never lands\n * in the file.\n */\nexport function useAnalyticsCardRows(\n card: AnalyticsCardDef,\n): (limit?: number) => Promise<AnalyticsRow[]> {\n const { provider, state } = useAnalyticsContext()\n return React.useCallback(async (limit = EXPORT_ROW_CAP) => {\n const resolved = withResolvedGrain(card, state.dateRange)\n const rows: AnalyticsRow[] = []\n for (let page = 1; rows.length < limit; page++) {\n const res = await provider.run(resolved, {\n ...state, compare: 'none', page, pageSize: EXPORT_PAGE_SIZE,\n })\n rows.push(...resolveRowRatios(res.rows, resolved.query.measures))\n if (res.rows.length < EXPORT_PAGE_SIZE || rows.length >= (res.total ?? rows.length)) break\n }\n return rows.slice(0, limit)\n }, [provider, state, card])\n}\n\n/** One round trip per thousand rows — big enough that most exports are one\n * call, small enough that a mistyped filter does not pull a whole table. */\nconst EXPORT_PAGE_SIZE = 1000\n/** Hard stop. Past this a spreadsheet is the wrong tool and the browser says so\n * by freezing; the file is truncated rather than the tab lost. */\nconst EXPORT_ROW_CAP = 20000\n","import * as React from 'react'\nimport { ArrowUpRight, Info, TrendingUp, TrendingDown, Construction, DatabaseZap, AlertCircle } from 'lucide-react'\nimport type {\n AnalyticsCardDef, AnalyticsColumnDef, AnalyticsFormat, AnalyticsMeasure, AnalyticsRow,\n} from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { Card, CardContent } from '../primitives/card'\nimport { Hint } from '../primitives/hint'\nimport { Skeleton } from '../primitives/skeleton'\nimport { ChartWidget } from '../dashboard/ChartWidget'\nimport { Sparkline } from '../dashboard/Sparkline'\nimport type { ChartSeries, ChartType } from '../dashboard/types'\nimport { useAnalyticsContext, useAnalyticsCard } from './context'\nimport {\n formatAnalyticsValue, deltaPercent, trendOf, toBreakdown, toChartData,\n toSpark, vizMeasures, vizCategory, num, type AnalyticsCurrency,\n} from './derive'\n\n// ---------------------------------------------------------------------------\n// The card — one AnalyticsCardDef, rendered at tile size.\n//\n// Every viz shares the same chrome (title, the ⓘ that explains what the number\n// means, the ↗ that opens the same definition as a full report) because they\n// are the same object. The arrow is not navigation between two features; it is\n// a zoom level.\n// ---------------------------------------------------------------------------\n\nconst CHART_TYPES: Record<string, ChartType> = { line: 'line', bar: 'bar', area: 'area', donut: 'pie' }\n\nexport interface AnalyticsCardProps {\n card: AnalyticsCardDef\n className?: string\n /** Hide the ↗ affordance (the viewer renders the same card full-size). */\n hideOpen?: boolean\n}\n\nfunction CardChrome({\n card, hideOpen, children, dense,\n}: { card: AnalyticsCardDef; hideOpen?: boolean; children: React.ReactNode; dense?: boolean }) {\n const { onOpenCard } = useAnalyticsContext()\n const canOpen = Boolean(onOpenCard) && !hideOpen\n\n return (\n <Card className=\"group flex h-full flex-col\">\n <div className={cn('flex items-start justify-between gap-2', dense ? 'px-4 pt-3' : 'px-5 pt-4')}>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium text-muted-foreground\">{card.name}</span>\n {card.description ? (\n <Hint label={card.description} side=\"top\">\n <span\n tabIndex={0}\n role=\"note\"\n aria-label={card.description}\n className=\"shrink-0 text-muted-foreground/60 hover:text-muted-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </span>\n </Hint>\n ) : null}\n </div>\n {canOpen ? (\n <Hint label=\"Open as report\" side=\"top\">\n <button\n type=\"button\"\n onClick={() => onOpenCard?.(card)}\n aria-label={`Open ${card.name} as a report`}\n className=\"shrink-0 rounded-md p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n >\n <ArrowUpRight className=\"h-4 w-4\" />\n </button>\n </Hint>\n ) : null}\n </div>\n <CardContent className={cn('flex-1', dense ? 'p-4 pt-2' : 'p-5 pt-2')}>{children}</CardContent>\n </Card>\n )\n}\n\nfunction TrendChip({ current, previous }: { current: number; previous: number | null | undefined }) {\n const delta = deltaPercent(current, previous)\n const trend = trendOf(current, previous)\n // No previous window, or a previous of zero: there is no honest percentage to\n // print, so the card shows a dash rather than inventing \"+100%\".\n if (!trend || trend === 'neutral' || delta == null) {\n return <span className=\"text-xs text-muted-foreground\">—</span>\n }\n const Icon = trend === 'up' ? TrendingUp : TrendingDown\n return (\n <span className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n trend === 'up' ? 'text-emerald-600' : 'text-rose-600',\n )}>\n <Icon className=\"h-3 w-3\" />\n {`${delta > 0 ? '+' : ''}${delta.toFixed(1)}%`}\n </span>\n )\n}\n\nfunction BreakdownList({\n rows, categoryKey, measure, currency, limit,\n}: {\n rows: AnalyticsRow[]; categoryKey: string; measure: AnalyticsMeasure\n currency: AnalyticsCurrency; limit?: number\n}) {\n const items = toBreakdown(rows, categoryKey, measure.key, measure.format, currency, limit)\n if (items.length === 0) return <EmptyState />\n return (\n <ul className=\"space-y-2.5\">\n {items.map((item, i) => (\n <li key={`${item.label}-${i}`} className=\"flex items-center gap-3 text-sm\">\n <span className=\"w-2/5 truncate text-muted-foreground\" title={item.label}>{item.label}</span>\n <span className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\" role=\"presentation\">\n <span\n className=\"block h-full rounded-full bg-[hsl(var(--chart-1,var(--info)))]\"\n style={{ width: `${Math.max(item.share * 100, item.value === 0 ? 0 : 2)}%` }}\n />\n </span>\n <span className=\"shrink-0 tabular-nums font-medium\">{item.formatted}</span>\n </li>\n ))}\n </ul>\n )\n}\n\n/**\n * A column's type vocabulary is wider than the value formatter's: 'person',\n * 'email', 'select' and 'boolean' have no numeric shape, so they fall back to\n * text rather than to nothing. `undefined` would be worse than imprecise — an\n * unformatted NULL takes the numeric branch and prints \"0\", so a customer with\n * no name recorded showed up in the table as a zero.\n */\nconst VALUE_FORMATS = new Set<string>(['number', 'currency', 'percent', 'duration', 'date', 'text'])\nfunction columnFormat(type: AnalyticsColumnDef['type']): AnalyticsFormat {\n return VALUE_FORMATS.has(type) ? (type as AnalyticsFormat) : 'text'\n}\n\nfunction MiniTable({\n rows, card, currency, limit,\n}: { rows: AnalyticsRow[]; card: AnalyticsCardDef; currency: AnalyticsCurrency; limit?: number }) {\n // Hidden dimensions are grouped on, not shown: the tile would otherwise lead\n // with a column of UUIDs.\n const dims = (card.query.dimensions ?? []).filter((d) => !d.hidden)\n const measures = vizMeasures(card)\n const aggregated = [\n ...dims.map((d) => ({ key: d.key, label: d.label, format: d.format, align: 'left' as const })),\n ...measures.map((m) => ({ key: m.key, label: m.label, format: m.format, align: 'right' as const })),\n ]\n // A DETAIL card has neither dimensions nor measures — it reads the view row by\n // row, and `card.columns` is the only thing that says what a row looks like.\n // Building the header from dimensions alone left such a card with zero columns:\n // a table of empty rows under a title, which reads as \"no data\" while the\n // request came back 200 with everything in it.\n const cols = aggregated.length > 0\n ? aggregated\n : (card.columns ?? [])\n .filter((c) => c.visible !== false)\n .map((c) => ({\n key: c.key,\n label: c.label,\n format: columnFormat(c.type),\n align: c.align === 'right' ? ('right' as const) : ('left' as const),\n }))\n const shown = limit ? rows.slice(0, limit) : rows\n if (shown.length === 0 || cols.length === 0) return <EmptyState />\n\n return (\n <div className=\"-mx-1 overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b text-xs text-muted-foreground\">\n {cols.map((c) => (\n <th key={c.key} className={cn('px-1 pb-2 font-medium', c.align === 'right' ? 'text-right' : 'text-left')}>\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {shown.map((row, i) => (\n <tr key={i} className=\"border-b border-border/50 last:border-0\">\n {cols.map((c) => (\n <td key={c.key} className={cn('px-1 py-2', c.align === 'right' ? 'text-right tabular-nums' : 'truncate')}>\n {formatAnalyticsValue(row[c.key], c.format, currency)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction EmptyState({ label = 'No data for this date range' }: { label?: string }) {\n return (\n <div className=\"flex h-full min-h-[80px] items-center justify-center text-center text-sm text-muted-foreground\">\n {label}\n </div>\n )\n}\n\nexport function AnalyticsCard({ card, className, hideOpen }: AnalyticsCardProps) {\n const { currency } = useAnalyticsContext()\n const { result, summary, previousSummary, loading, error, engineMissing } = useAnalyticsCard(card)\n const measures = vizMeasures(card)\n const category = vizCategory(card)\n const rows = result?.rows ?? []\n\n const body = (() => {\n if (card.available === false) {\n return (\n <div className=\"flex h-full min-h-[80px] flex-col items-center justify-center gap-2 text-center\">\n <Construction className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-xs text-muted-foreground\">Not connected yet</p>\n </div>\n )\n }\n if (loading && !result) {\n return (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-7 w-24\" />\n <Skeleton className=\"h-4 w-16\" />\n </div>\n )\n }\n if (engineMissing) {\n // A missing migration is not a broken card, and saying \"error\" here sends\n // someone hunting through a card definition that is perfectly fine.\n return (\n <div className=\"flex h-full min-h-[80px] flex-col items-center justify-center gap-1.5 text-center\">\n <DatabaseZap className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-xs font-medium\">Analytics engine not installed</p>\n <p className=\"text-[11px] text-muted-foreground\">Run migration 0039 on this project.</p>\n </div>\n )\n }\n if (error) {\n return (\n <div className=\"flex h-full min-h-[60px] items-start gap-1.5 text-xs text-destructive\">\n <AlertCircle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"break-words\">{error}</span>\n </div>\n )\n }\n\n switch (card.viz.type) {\n case 'kpi': {\n const measure = measures[0]\n if (!measure) return <EmptyState />\n const value = num(summary[measure.key])\n const previous = previousSummary ? num(previousSummary[measure.key]) : null\n const spark = card.viz.spark ? toSpark(result, measure.key) : undefined\n return (\n <div className=\"flex h-full flex-col justify-between gap-2\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-2xl font-semibold tracking-tight tabular-nums\">\n {formatAnalyticsValue(value, measure.format, currency, { compact: true })}\n </span>\n <TrendChip current={value} previous={previous} />\n </div>\n {spark ? (\n <Sparkline\n data={spark} color=\"hsl(var(--chart-1,var(--info)))\"\n width={120} height={28} padding={2} className=\"h-7 w-full\"\n />\n ) : null}\n </div>\n )\n }\n\n case 'breakdown': {\n const measure = measures[0]\n if (!measure || !category) return <EmptyState />\n return (\n <BreakdownList\n rows={rows} categoryKey={category.key} measure={measure}\n currency={currency} limit={card.viz.limit}\n />\n )\n }\n\n case 'table':\n return <MiniTable rows={rows} card={card} currency={currency} limit={card.viz.limit ?? 5} />\n\n case 'funnel': {\n // A funnel is a breakdown whose bars are shares of the FIRST step, so\n // each stage reads as \"of everyone who started, this many got here\".\n const measure = measures[0]\n if (!measure || !category) return <EmptyState />\n const first = num(rows[0]?.[measure.key]) || 1\n return (\n <ul className=\"space-y-2.5\">\n {rows.map((row, i) => {\n const value = num(row[measure.key])\n return (\n <li key={i} className=\"text-sm\">\n <div className=\"mb-1 flex items-baseline justify-between gap-2\">\n <span className=\"truncate text-muted-foreground\">{String(row[category.key] ?? '—')}</span>\n <span className=\"shrink-0 tabular-nums font-medium\">\n {formatAnalyticsValue(value, measure.format, currency)}\n <span className=\"ml-1.5 text-xs text-muted-foreground\">\n {((value / first) * 100).toFixed(0)}%\n </span>\n </span>\n </div>\n <span className=\"block h-1.5 overflow-hidden rounded-full bg-muted\">\n <span className=\"block h-full rounded-full bg-[hsl(var(--chart-1,var(--info)))]\" style={{ width: `${(value / first) * 100}%` }} />\n </span>\n </li>\n )\n })}\n </ul>\n )\n }\n\n default: {\n if (rows.length === 0) return <EmptyState />\n if (!category) return <EmptyState />\n const chartType = CHART_TYPES[card.viz.type] ?? 'line'\n const data = toChartData(rows, category.key, category.grain, currency.locale)\n const series: ChartSeries[] = measures.map((m) => ({ dataKey: m.key, label: m.label }))\n return (\n <ChartWidget\n type={chartType}\n data={data}\n series={series}\n categoryKey={category.key}\n height={card.viz.height ?? 200}\n className=\"border-0 bg-transparent shadow-none [&>div]:p-0\"\n />\n )\n }\n }\n })()\n\n const dense = card.viz.type === 'kpi'\n return (\n <div className={className}>\n <CardChrome card={card} hideOpen={hideOpen} dense={dense}>{body}</CardChrome>\n </div>\n )\n}\n","import * as React from 'react'\nimport type { AnalyticsCardDef, AnalyticsFilterDef } from '@fayz-ai/core'\nimport { DashboardGrid } from '../dashboard/DashboardGrid'\nimport { AnalyticsCard } from './AnalyticsCard'\n\n// ---------------------------------------------------------------------------\n// The overview grid. Reuses DashboardGrid rather than growing a second\n// four-column layout that would drift out of alignment with the app home.\n// ---------------------------------------------------------------------------\n\n/** Default span by viz: a KPI is a quarter, a chart a half, a table a full row. */\nfunction defaultSpan(card: AnalyticsCardDef): 1 | 2 | 3 | 4 {\n if (card.dashboard?.span) return card.dashboard.span\n switch (card.viz.type) {\n case 'kpi': return 1\n case 'table': return 4\n default: return 2\n }\n}\n\nexport interface AnalyticsGridProps {\n cards: AnalyticsCardDef[]\n className?: string\n}\n\nexport function AnalyticsGrid({ cards, className }: AnalyticsGridProps) {\n const items = React.useMemo(\n () => cards.map((card) => ({\n id: card.id,\n span: defaultSpan(card),\n node: <AnalyticsCard card={card} />,\n })),\n [cards],\n )\n return <DashboardGrid items={items} className={className} />\n}\n\n/**\n * Every filter offered by the cards on screen, de-duplicated by key.\n *\n * The control bar shows the union rather than the intersection: a filter that\n * only narrows three of fourteen cards is still worth offering, and hiding it\n * until every card supports it would leave the picker permanently empty.\n */\nexport function collectFilters(cards: AnalyticsCardDef[]): AnalyticsFilterDef[] {\n const byKey = new Map<string, AnalyticsFilterDef>()\n for (const card of cards) {\n for (const filter of card.query.filters ?? []) {\n if (!byKey.has(filter.key)) byKey.set(filter.key, filter)\n }\n }\n return [...byKey.values()]\n}\n","import * as React from 'react'\nimport { Check, GitCompareArrows, SlidersHorizontal, Search, ChevronRight, X } from 'lucide-react'\nimport type { AnalyticsFilterDef, AnalyticsFilterOption } from '@fayz-ai/core'\nimport { useTranslation, getCurrentLocale } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { Button } from '../primitives/button'\nimport { Input } from '../primitives/input'\nimport { DatePicker } from '../primitives/date-picker'\nimport { Popover, PopoverTrigger, PopoverContent } from '../primitives/popover'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownSeparator } from '../primitives/dropdown'\nimport { PageToolbar, RangeControl, ToolbarButton } from '../primitives/page-toolbar'\nimport { useAnalyticsContext } from './context'\nimport { parseDay, type AnalyticsRangePreset } from './range'\n\n// ---------------------------------------------------------------------------\n// The one control bar every analytics surface shares.\n//\n// Range, comparison and filters sit here rather than on each card because they\n// describe the QUESTION, not the chart: changing \"last 7 days\" has to move\n// everything on screen at once, or two tiles end up answering about different\n// weeks and the page silently lies.\n//\n// Chrome is deliberately the same 26px toolbar the dashboard uses (Button `sm`,\n// SegmentedControl, DatePicker `toolbar`) — this bar sits above the very same\n// card grid as the app home, and a taller, lighter-weight row of its own read\n// as a different product bolted on top.\n// ---------------------------------------------------------------------------\n\nconst PRESETS: AnalyticsRangePreset[] = [\n 'today', 'yesterday', 'last_7_days', 'last_30_days', 'last_90_days',\n 'this_month', 'last_month', 'this_quarter', 'this_year',\n]\n\nconst COMPARE_OPTIONS = ['previous_period', 'previous_year', 'none'] as const\n\n/** \"15 jul – 13 ago\" — the window the numbers below actually cover. */\nfunction formatSpan(from: string, to: string, locale: string): string {\n const opts: Intl.DateTimeFormatOptions = { day: '2-digit', month: 'short' }\n const a = parseDay(from)\n const b = parseDay(to)\n const fmt = (d: Date) => d.toLocaleDateString(locale, {\n ...opts,\n // The year only earns its space when the range leaves the current one.\n ...(d.getFullYear() === new Date().getFullYear() ? {} : { year: 'numeric' }),\n })\n return from === to ? fmt(a) : `${fmt(a)} – ${fmt(b)}`\n}\n\n// ---------------------------------------------------------------------------\n// Filter picker — categorized, searchable, staged behind Apply.\n// ---------------------------------------------------------------------------\n\nfunction useFilterOptions(filter: AnalyticsFilterDef): AnalyticsFilterOption[] {\n const [options, setOptions] = React.useState<AnalyticsFilterOption[]>(\n Array.isArray(filter.options) ? filter.options : [],\n )\n React.useEffect(() => {\n if (typeof filter.options !== 'function') {\n setOptions(Array.isArray(filter.options) ? filter.options : [])\n return\n }\n let cancelled = false\n void filter.options().then((next) => { if (!cancelled) setOptions(next) }).catch(() => {})\n return () => { cancelled = true }\n }, [filter.options])\n return options\n}\n\nfunction FilterValues({\n filter, draft, onChange,\n}: { filter: AnalyticsFilterDef; draft: Record<string, unknown>; onChange: (key: string, value: unknown) => void }) {\n const t = useTranslation()\n const options = useFilterOptions(filter)\n const current = draft[filter.key]\n\n if (filter.type === 'text' || filter.type === 'number') {\n return (\n <Input\n type={filter.type === 'number' ? 'number' : 'text'}\n value={current == null ? '' : String(current)}\n placeholder={filter.placeholder}\n onChange={(e) => onChange(filter.key, e.target.value)}\n className=\"h-8 text-sm\"\n />\n )\n }\n\n if (filter.type === 'boolean') {\n return (\n <div className=\"space-y-1\">\n {[{ label: t('common.yes'), value: 'true' }, { label: t('common.no'), value: 'false' }].map((o) => (\n <label key={o.value} className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted\">\n <input\n type=\"radio\"\n name={filter.key}\n checked={String(current) === o.value}\n onChange={() => onChange(filter.key, o.value)}\n className=\"h-3.5 w-3.5\"\n />\n {o.label}\n </label>\n ))}\n </div>\n )\n }\n\n const multi = filter.type === 'multiselect'\n const selected = new Set(Array.isArray(current) ? current.map(String) : current != null ? [String(current)] : [])\n\n if (options.length === 0) {\n return <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">{t('analytics.filters.noOptions')}</p>\n }\n\n return (\n <div className=\"max-h-56 space-y-0.5 overflow-y-auto\">\n {options.map((o) => (\n <label key={o.value} className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted\">\n <input\n type={multi ? 'checkbox' : 'radio'}\n name={filter.key}\n checked={selected.has(o.value)}\n onChange={() => {\n if (!multi) { onChange(filter.key, selected.has(o.value) ? undefined : o.value); return }\n const next = new Set(selected)\n if (next.has(o.value)) next.delete(o.value)\n else next.add(o.value)\n onChange(filter.key, [...next])\n }}\n className=\"h-3.5 w-3.5\"\n />\n <span className=\"truncate\">{o.label}</span>\n </label>\n ))}\n </div>\n )\n}\n\nexport interface AnalyticsFilterPickerProps {\n /** Every filter offered on this surface, from the cards in view. */\n filters: AnalyticsFilterDef[]\n}\n\nexport function AnalyticsFilterPicker({ filters }: AnalyticsFilterPickerProps) {\n const t = useTranslation()\n const { state, setFilters, clearFilters } = useAnalyticsContext()\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState('')\n const [openGroup, setOpenGroup] = React.useState<string | null>(null)\n // Staged: edits do not hit the query until Apply, so a five-filter change is\n // one refetch instead of five — and Clear can be abandoned by closing.\n const [draft, setDraft] = React.useState<Record<string, unknown>>(state.filters)\n\n React.useEffect(() => { if (open) setDraft(state.filters) }, [open, state.filters])\n\n const groups = React.useMemo(() => {\n const q = search.trim().toLowerCase()\n const matching = q ? filters.filter((f) => f.label.toLowerCase().includes(q)) : filters\n const map = new Map<string, AnalyticsFilterDef[]>()\n for (const f of matching) {\n const key = f.group ?? t('analytics.filters.general')\n map.set(key, [...(map.get(key) ?? []), f])\n }\n return [...map.entries()].sort(([a], [b]) => a.localeCompare(b))\n }, [filters, search, t])\n\n const activeCount = Object.keys(state.filters).length\n if (filters.length === 0) return null\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <ToolbarButton icon={SlidersHorizontal} caret={false}>\n {t('analytics.filters')}\n {activeCount > 0 ? (\n <span className=\"ml-0.5 rounded-full bg-primary px-1.5 text-[10px] font-semibold text-primary-foreground\">\n {activeCount}\n </span>\n ) : null}\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-80 p-0\">\n <div className=\"border-b p-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('analytics.filters.search')}\n className=\"h-8 pl-8 text-sm\"\n />\n </div>\n </div>\n\n <div className=\"max-h-80 overflow-y-auto p-1\">\n {groups.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-muted-foreground\">{t('analytics.filters.none')}</p>\n ) : (\n groups.map(([group, groupFilters]) => (\n <div key={group}>\n <button\n type=\"button\"\n onClick={() => setOpenGroup((g) => (g === group ? null : group))}\n aria-expanded={openGroup === group}\n className=\"flex w-full items-center justify-between rounded-md px-2 py-2 text-sm hover:bg-muted\"\n >\n <span className=\"font-medium\">{group}</span>\n <ChevronRight className={cn('h-3.5 w-3.5 text-muted-foreground transition-transform', openGroup === group && 'rotate-90')} />\n </button>\n {openGroup === group ? (\n <div className=\"space-y-3 px-2 pb-3 pt-1\">\n {groupFilters.map((f) => (\n <div key={f.key}>\n <p className=\"mb-1 text-xs font-medium text-muted-foreground\">{f.label}</p>\n <FilterValues\n filter={f}\n draft={draft}\n onChange={(key, value) => setDraft((d) => {\n const next = { ...d }\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) delete next[key]\n else next[key] = value\n return next\n })}\n />\n </div>\n ))}\n </div>\n ) : null}\n </div>\n ))\n )}\n </div>\n\n <div className=\"flex items-center justify-between gap-2 border-t p-2\">\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => { setDraft({}); clearFilters(); setOpen(false) }}\n >\n {t('analytics.filters.clear')}\n </Button>\n <Button size=\"sm\" onClick={() => { setFilters(draft); setOpen(false) }}>\n {t('analytics.filters.apply')}\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Range control — presets, and the custom window they cannot express\n// ---------------------------------------------------------------------------\n\nfunction AnalyticsRangeControl() {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const { state, preset, setPreset, setDateRange } = useAnalyticsContext()\n const custom = preset === 'custom'\n const span = formatSpan(state.dateRange.from, state.dateRange.to, locale)\n\n // O MESMO controle de período que o dashboard usa (RangeControl); o que é\n // próprio daqui — a janela resolvida e o par de seletores do personalizado —\n // entra pelos vãos dele.\n return (\n <RangeControl\n options={PRESETS.map((p) => ({ value: p, label: t(`analytics.range.${p}`) }))}\n value={preset}\n onChange={(p) => setPreset(p as AnalyticsRangePreset)}\n label={custom ? t('analytics.range.custom') : undefined}\n // The resolved window, always. A preset name alone leaves the merchant\n // guessing whether \"this month\" already includes today.\n span={custom ? undefined : span}\n extra={\n <>\n <DropdownSeparator />\n {/* Re-committing the range the user is already on is what flips the\n bar into custom mode: `setDateRange` is the only path that sets the\n preset to 'custom', so opening the two pickers cannot be done by\n flipping a flag without also telling the query state. */}\n <DropdownItem onSelect={() => setDateRange({ ...state.dateRange })}>\n {t('analytics.range.custom')}\n {custom ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n </>\n }\n >\n {custom ? (\n <>\n <DatePicker\n variant=\"toolbar\"\n value={state.dateRange.from}\n // A start after the end is not a range, it is an empty answer the\n // page would render as \"no data\". Dragging one past the other moves\n // the other with it instead.\n onChange={(from) => setDateRange({\n from,\n to: from > state.dateRange.to ? from : state.dateRange.to,\n })}\n />\n <span className=\"text-xs text-muted-foreground\">–</span>\n <DatePicker\n variant=\"toolbar\"\n value={state.dateRange.to}\n onChange={(to) => setDateRange({\n from: to < state.dateRange.from ? to : state.dateRange.from,\n to,\n })}\n />\n </>\n ) : null}\n </RangeControl>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The bar\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsControlsProps {\n /** Filters offered in the picker — usually the union across visible cards. */\n filters?: AnalyticsFilterDef[]\n /** Hide the comparison control on surfaces where it means nothing. */\n showCompare?: boolean\n /** Right-aligned extras (e.g. Export, New report). */\n actions?: React.ReactNode\n /** Which cards/widgets show — same slot the dashboard fills. */\n customize?: React.ReactNode\n /** Solta a barra do topo (impressão, dentro de um modal). */\n sticky?: boolean\n className?: string\n}\n\nexport function AnalyticsControls({ filters = [], showCompare = true, actions, customize, sticky, className }: AnalyticsControlsProps) {\n const t = useTranslation()\n const { state, setCompare, refresh } = useAnalyticsContext()\n const compare = state.compare ?? 'none'\n\n const activeFilters = Object.entries(state.filters)\n const filterLabel = (key: string) => filters.find((f) => f.key === key)?.label ?? key\n\n return (\n // Sem cromo próprio: a superfície, o encosto à direita e o comportamento\n // grudado no topo vêm de PageToolbar — a mesma barra do dashboard. Aqui só\n // se diz O QUE ela carrega.\n <PageToolbar\n className={className}\n sticky={sticky}\n moveLabel={t('analytics.moveBar')}\n range={<AnalyticsRangeControl />}\n filters={\n <>\n {showCompare ? (\n <Dropdown>\n <DropdownTrigger asChild>\n <ToolbarButton\n icon={GitCompareArrows}\n // A comparison that is OFF should not look like a set filter; a\n // comparison that is on is what every trend chip on the page is\n // measured against, and worth reading at a glance.\n className={compare === 'none' ? 'text-muted-foreground' : undefined}\n >\n {t(`analytics.compare.${compare}`)}\n </ToolbarButton>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-48\">\n {COMPARE_OPTIONS.map((c) => (\n <DropdownItem key={c} onSelect={() => setCompare(c)}>\n {t(`analytics.compare.${c}`)}\n {compare === c ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\n ) : null}\n <AnalyticsFilterPicker filters={filters} />\n </>\n }\n /* Applied filters stay visible as removable chips: a filter you cannot\n see is a filter you forget you set, and every number below is wrong in\n a way the page never explains. */\n chips={activeFilters.map(([key, value]) => (\n <ActiveFilterChip key={key} label={filterLabel(key)} value={value} filterKey={key} />\n ))}\n customize={customize}\n actions={actions}\n onRefresh={refresh}\n refreshLabel={t('analytics.refresh')}\n />\n )\n}\n\nfunction ActiveFilterChip({ label, value, filterKey }: { label: string; value: unknown; filterKey: string }) {\n const t = useTranslation()\n const { setFilter } = useAnalyticsContext()\n // A single-valued filter shows the value; a multiselect shows how many, since\n // six statuses spelled out push every other chip off the row.\n const text = Array.isArray(value)\n ? (value.length === 1 ? String(value[0]) : t('analytics.filters.selected', { count: value.length }))\n : String(value)\n return (\n <span className=\"inline-flex h-[26px] shrink-0 items-center gap-1 rounded-full border border-primary/30 bg-primary/10 py-1 pl-2.5 pr-1 text-xs font-medium text-primary\">\n <span className=\"opacity-70\">{label}:</span>\n <span className=\"max-w-[10rem] truncate\">{text}</span>\n <button\n type=\"button\"\n onClick={() => setFilter(filterKey, undefined)}\n aria-label={`${t('analytics.filters.remove')}: ${label}`}\n className=\"rounded-full p-0.5 transition-colors hover:bg-primary/20\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n )\n}\n","import { create } from 'zustand'\nimport type { PracticeStep } from './types'\n\n/**\n * Practice mode — the second half of a guided feature.\n *\n * The tour DRIVES: a cursor walks the person to the create screen. Practice\n * WATCHES: numbered footprints pin to the real fields and the person fills them\n * in themselves, each ticking as they go, the last one (Save) raining confetti.\n * Watching teaches where things are; doing teaches how — this is the doing.\n *\n * A step is \"done\" the first time the person interacts inside its anchor\n * (types, picks, clicks). Interaction, not a value check: it is robust across\n * every field kind, and the goal is to fix the SEQUENCE in muscle memory, not\n * to validate the form (the form validates itself on save).\n */\n\nexport type { PracticeStep }\n\nexport interface PracticeState {\n title: string | null\n steps: PracticeStep[]\n /** Anchors already done, in the order they were completed. */\n done: string[]\n start: (title: string, steps: PracticeStep[]) => void\n markDone: (anchor: string) => void\n stop: () => void\n}\n\nexport const usePracticeStore = create<PracticeState>((set, get) => ({\n title: null,\n steps: [],\n done: [],\n\n start: (title, steps) => {\n if (!steps.length) return\n set({ title, steps, done: [] })\n },\n\n markDone: (anchor) => {\n const { steps, done } = get()\n if (!steps.some((s) => s.anchor === anchor)) return\n if (done.includes(anchor)) return\n set({ done: [...done, anchor] })\n },\n\n stop: () => set({ title: null, steps: [], done: [] }),\n}))\n\n/** The next footprint the person should touch — the first not-done step. */\nexport function nextPracticeStep(steps: PracticeStep[], done: string[]): PracticeStep | undefined {\n return steps.find((s) => !done.includes(s.anchor))\n}\n","import { create } from 'zustand'\nimport type { TourDef, TourStopDef } from './types'\nimport { usePracticeStore } from './practice.store'\n\n/**\n * The running tour.\n *\n * A store rather than a provider because everything that starts a tour is\n * somewhere else: a checklist item in the rail, the agent's tool executor, a\n * \"show me how\" link inside an empty state. None of them share a React parent\n * with the overlay, and threading a callback through the shell to reach them\n * would put the tour in the shell's props forever.\n */\n\n/** Set by the host once — the tour cannot know an app's router. */\nlet navigator: ((path: string) => void) | undefined\nexport function setTourNavigator(fn: ((path: string) => void) | undefined): void {\n navigator = fn\n}\nexport function getTourNavigator(): ((path: string) => void) | undefined {\n return navigator\n}\n\nexport interface TourState {\n tour: TourDef | null\n index: number\n /** Why the last tour ended — read by whoever started it (the agent reports back). */\n lastOutcome: { tourId: string; completed: boolean } | null\n /** The most recent tour, running or not — what \"restart\" restarts. */\n lastTour: TourDef | null\n start: (tour: TourDef) => void\n next: () => void\n prev: () => void\n goTo: (index: number) => void\n /** `completed` distinguishes finishing from skipping; both close the overlay. */\n stop: (completed?: boolean) => void\n /** Start the last tour over from stop 1 — running (reset) or ended (revive). */\n restart: () => void\n}\n\nexport const useTourStore = create<TourState>((set, get) => ({\n tour: null,\n index: 0,\n lastOutcome: null,\n lastTour: null,\n\n start: (tour) => {\n if (!tour.stops.length) return\n // A fresh guided run clears any practice left over from a previous one the\n // person walked away from — otherwise its footprints would linger under the\n // new tour.\n usePracticeStore.getState().stop()\n set({ tour, index: 0, lastOutcome: null, lastTour: tour })\n },\n\n next: () => {\n const { tour, index } = get()\n if (!tour) return\n if (index >= tour.stops.length - 1) {\n // The tour arrived. If it carries practice, hand off to it instead of\n // ending here: the person is on the form and now fills it themselves.\n if (tour.practice?.length) {\n usePracticeStore.getState().start(tour.title ?? '', tour.practice)\n }\n get().stop(true)\n return\n }\n set({ index: index + 1 })\n },\n\n prev: () => set((s) => ({ index: Math.max(0, s.index - 1) })),\n\n goTo: (index) => set((s) => (s.tour ? { index: Math.min(Math.max(0, index), s.tour.stops.length - 1) } : s)),\n\n stop: (completed = false) =>\n set((s) => ({\n tour: null,\n index: 0,\n lastOutcome: s.tour ? { tourId: s.tour.id, completed } : s.lastOutcome,\n })),\n\n restart: () => {\n const t = get().lastTour\n if (t) get().start(t)\n },\n}))\n\n/** The stop on screen right now, if any. */\nexport function currentStop(state: TourState): TourStopDef | undefined {\n return state.tour?.stops[state.index]\n}\n","/**\n * Confetti — the reward at the end of a tour, dependency-free.\n *\n * A short burst on a full-screen canvas that removes itself. No library: the\n * ui package ships in every app and this is ~40 lines of physics. Honours\n * reduced-motion by doing nothing. Deterministic-ish randomness seeded off the\n * call time is fine — this is decoration, never resumed.\n */\nexport function fireConfetti(opts?: { origin?: { x: number; y: number }; count?: number; fromBottom?: boolean }): void {\n if (typeof document === 'undefined') return\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches) return\n\n const canvas = document.createElement('canvas')\n const dpr = window.devicePixelRatio || 1\n const w = window.innerWidth\n const h = window.innerHeight\n canvas.width = w * dpr\n canvas.height = h * dpr\n canvas.style.cssText = `position:fixed;inset:0;width:${w}px;height:${h}px;pointer-events:none;z-index:200`\n document.body.appendChild(canvas)\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n canvas.remove()\n return\n }\n ctx.scale(dpr, dpr)\n\n // Reads the running theme so the burst is on-brand, not a fixed rainbow.\n const css = getComputedStyle(document.documentElement)\n const prim = (css.getPropertyValue('--primary') || '35 92% 50%').trim()\n const colors = [`hsl(${prim})`, '#22c55e', '#f59e0b', '#ec4899', '#3b82f6', '#ffffff']\n\n const n = opts?.count ?? 130\n const rnd = (a: number, b: number) => a + Math.random() * (b - a)\n const fromBottom = !!opts?.fromBottom\n\n // Two launch styles: a burst OUT of one point (a control they just used), or\n // a curtain rising off the WHOLE bottom edge (the finale). The finale reads\n // as \"the screen itself is celebrating\", not \"that button popped\".\n const ox = opts?.origin?.x ?? w / 2\n const oy = opts?.origin?.y ?? h * 0.32\n\n const parts = Array.from({ length: fromBottom ? Math.max(n, 180) : n }, () => {\n if (fromBottom) {\n return {\n x: rnd(0, w),\n y: h + rnd(0, 40),\n vx: rnd(-3, 3),\n vy: -rnd(13, 22), // straight up, hard\n rot: rnd(0, Math.PI * 2),\n vr: rnd(-0.3, 0.3),\n size: rnd(6, 12),\n color: colors[(Math.random() * colors.length) | 0],\n life: 0,\n }\n }\n const angle = rnd(-Math.PI, 0) // upward fan\n const speed = rnd(6, 15)\n return {\n x: ox,\n y: oy,\n vx: Math.cos(angle) * speed * rnd(0.6, 1.4),\n vy: Math.sin(angle) * speed - rnd(2, 6),\n rot: rnd(0, Math.PI * 2),\n vr: rnd(-0.3, 0.3),\n size: rnd(6, 11),\n color: colors[(Math.random() * colors.length) | 0],\n life: 0,\n }\n })\n\n const GRAVITY = 0.32\n const DRAG = 0.99\n const MAX_LIFE = 140\n let raf = 0\n\n const tick = () => {\n ctx.clearRect(0, 0, w, h)\n let alive = 0\n for (const p of parts) {\n if (p.life > MAX_LIFE) continue\n alive++\n p.life++\n p.vx *= DRAG\n p.vy = p.vy * DRAG + GRAVITY\n p.x += p.vx\n p.y += p.vy\n p.rot += p.vr\n const fade = Math.max(0, 1 - p.life / MAX_LIFE)\n ctx.save()\n ctx.translate(p.x, p.y)\n ctx.rotate(p.rot)\n ctx.globalAlpha = fade\n ctx.fillStyle = p.color\n ctx.fillRect(-p.size / 2, -p.size / 2, p.size, p.size * 0.6)\n ctx.restore()\n }\n if (alive > 0) {\n raf = requestAnimationFrame(tick)\n } else {\n cancelAnimationFrame(raf)\n canvas.remove()\n }\n }\n raf = requestAnimationFrame(tick)\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { useTourStore, getTourNavigator } from './tour.store'\nimport { usePracticeStore } from './practice.store'\nimport { fireConfetti } from './confetti'\n\nexport interface TourSpotlightProps {\n labels?: Partial<typeof DEFAULT_LABELS>\n className?: string\n}\n\nconst DEFAULT_LABELS = {\n next: 'Próximo',\n waiting: 'Faça agora — eu espero',\n back: 'Voltar',\n done: 'Entendi',\n skip: 'Pular',\n stepOf: '{current} de {total}',\n notFound: 'Essa parte não está nesta tela — siga em frente que eu te mostro depois.',\n}\n\n/** Padding around the highlighted element, so the ring never touches the label. */\n// `~=` and not `=`: one element may answer to SEVERAL anchors — the caret that\n// hides an action menu stands in for every action folded behind it — so the\n// attribute is a whitespace-separated list, matched the way `class` is.\nconst PAD = 8\n/** How long we wait for a stop's anchor to appear before giving up on it. */\nconst ANCHOR_TIMEOUT_MS = 4000\nconst BUBBLE_WIDTH = 300\nconst GAP = 14\n\ninterface Rect { top: number; left: number; width: number; height: number }\n\nfunction readRect(el: Element): Rect {\n const r = el.getBoundingClientRect()\n return { top: r.top - PAD, left: r.left - PAD, width: r.width + PAD * 2, height: r.height + PAD * 2 }\n}\n\n/** How long the cursor takes to travel between two stops. The ring and the\n * bubble wait for it: the pointer arriving IS the reveal. */\nconst CURSOR_TRAVEL_MS = 650\n\ninterface Point { x: number; y: number }\n\n/** Where the cursor lands: past the middle of the target, the way a hand\n * points at a control rather than covering its label. */\nfunction pointFor(rect: Rect): Point {\n return { x: rect.left + rect.width * 0.62, y: rect.top + rect.height * 0.62 }\n}\n\nfunction prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/**\n * How much of the RIGHT edge the overlay must leave alone.\n *\n * An element marked `data-tour-exempt` — the assistant's docked column — stays\n * outside the dim entirely: the person reads the narration and can even type\n * back while the light walks the rest of the screen. Only a right-docked\n * COLUMN counts: touching the right edge, tall, and narrower than the screen —\n * a full-screen sheet (the mobile chat) exempting itself would delete the\n * overlay instead.\n */\nfunction exemptRightInset(): number {\n if (typeof document === 'undefined') return 0\n let inset = 0\n for (const el of Array.from(document.querySelectorAll('[data-tour-exempt]'))) {\n const r = el.getBoundingClientRect()\n if (r.width === 0 || r.height === 0) continue\n if (r.right < window.innerWidth - 8) continue\n if (r.width > window.innerWidth * 0.7) continue\n if (r.height < window.innerHeight * 0.5) continue\n inset = Math.max(inset, window.innerWidth - r.left)\n }\n return Math.round(inset)\n}\n\n/**\n * The tour overlay: dim everything, cut a hole around one element, and put a\n * label next to it.\n *\n * The hole is FOUR dim panels rather than one panel with a mask, and that is the\n * whole trick: a masked overlay still swallows the click, so the \"click New\n * product\" stop would highlight a button nobody could press. With four panels\n * the hole is genuinely empty — the element underneath stays live, and somebody\n * being taught to use the app can actually use it while being taught.\n *\n * Mounted once by the shell. It renders nothing until a tour is running.\n */\nexport function TourSpotlight({ labels, className }: TourSpotlightProps) {\n const l = { ...DEFAULT_LABELS, ...labels }\n const tour = useTourStore((s) => s.tour)\n const index = useTourStore((s) => s.index)\n const next = useTourStore((s) => s.next)\n const prev = useTourStore((s) => s.prev)\n const stop = useTourStore((s) => s.stop)\n const lastOutcome = useTourStore((s) => s.lastOutcome)\n\n // The reward: a burst when a tour is FINISHED (not skipped). Keyed on the\n // outcome object so it fires once per completion, from the last anchor's\n // position so the confetti erupts out of the thing they just did.\n const firedFor = React.useRef<string | null>(null)\n React.useEffect(() => {\n if (!lastOutcome?.completed) return\n if (firedFor.current === lastOutcome.tourId) return\n firedFor.current = lastOutcome.tourId\n // A tour that hands off to practice is not the finale — the practice run\n // owns the celebration, at the bottom of the screen, once they SAVE.\n if (usePracticeStore.getState().steps.length > 0) return\n const origin = rect\n ? { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }\n : undefined\n fireConfetti({ origin })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lastOutcome])\n\n const stopDef = tour?.stops[index]\n const [rect, setRect] = React.useState<Rect | null>(null)\n const [missing, setMissing] = React.useState(false)\n // The big pointer that carries the person from stop to stop. `arrived` gates\n // the ring and the bubble: nothing is revealed until the cursor got there,\n // so the eye follows one moving thing instead of three appearing ones.\n const [cursor, setCursor] = React.useState<Point | null>(null)\n const [arrived, setArrived] = React.useState(false)\n // The person took the control: focus or a click landed INSIDE the anchored\n // element. The overlay steps back — the dim goes soft and click-through, the\n // bubble and the cursor get out of the way — because a dropdown that opens\n // from the highlighted field spills outside the hole, and a dim that eats\n // that click turns the lesson into a cage. Engaged is not done: leaving\n // focus brings the tour back where it was.\n const [engaged, setEngaged] = React.useState(false)\n const [rightInset, setRightInset] = React.useState(0)\n\n // The exempt column can open, close or resize mid-tour (the assistant panel\n // is exactly the thing likely to be doing both), so this is polled, cheap,\n // and only while a tour is running.\n React.useEffect(() => {\n if (!tour) return\n const sync = () => setRightInset(exemptRightInset())\n sync()\n const interval = window.setInterval(sync, 500)\n window.addEventListener('resize', sync)\n return () => {\n window.clearInterval(interval)\n window.removeEventListener('resize', sync)\n }\n }, [tour?.id])\n\n // Navigate first, then hunt for the anchor. Both halves live in one effect\n // because the hunt has to restart when the route lands, and a stop whose\n // element is still being fetched is normal — it is a page that just mounted.\n React.useEffect(() => {\n if (!stopDef) return\n setRect(null)\n setMissing(false)\n setArrived(false)\n setEngaged(false)\n\n if (stopDef.route) getTourNavigator()?.(stopDef.route)\n\n let raf = 0\n let travel = 0\n const deadline = Date.now() + ANCHOR_TIMEOUT_MS\n const hunt = () => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(stopDef.anchor)}\"]`)\n if (el) {\n el.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'smooth' })\n const found = readRect(el)\n const land = () => {\n // Re-measure on landing: smooth scrollIntoView may still have been\n // travelling when the anchor was first found.\n const at = document.querySelector(`[data-tour~=\"${CSS.escape(stopDef.anchor)}\"]`)\n const settled = at ? readRect(at) : found\n setRect(settled)\n setCursor(pointFor(settled))\n setArrived(true)\n }\n if (prefersReducedMotion()) {\n land()\n return\n }\n // The cursor departs from wherever it was — the previous stop, or the\n // middle of the screen on the first one. A first flight needs a painted\n // frame at the origin before the target is set, or the CSS transition\n // has nothing to travel from.\n setCursor((prev) => prev ?? { x: window.innerWidth / 2, y: window.innerHeight / 2 })\n raf = requestAnimationFrame(() => {\n raf = requestAnimationFrame(() => setCursor(pointFor(found)))\n })\n travel = window.setTimeout(land, CURSOR_TRAVEL_MS + 40)\n return\n }\n if (Date.now() > deadline) {\n setMissing(true)\n return\n }\n raf = requestAnimationFrame(hunt)\n }\n raf = requestAnimationFrame(hunt)\n return () => {\n cancelAnimationFrame(raf)\n window.clearTimeout(travel)\n }\n }, [stopDef?.anchor, stopDef?.route, tour?.id])\n\n // Follow the element: a sticky header that collapses on scroll, a sidebar\n // that finishes its transition, a table that finishes loading — all of them\n // move the target after the first measurement.\n //\n // And notice when it LEAVES. On a handover stop the control disappearing is\n // the whole point: they clicked it, the form opened, and the light is now\n // ringing an empty rectangle with no \"next\" button under it — which is where\n // this got stuck the first time somebody used it. Gone means done; the\n // overlay steps aside and the run keeps waiting on the sensor.\n React.useEffect(() => {\n if (!stopDef || missing || !arrived) return\n const anchor = stopDef.anchor\n const handover = Boolean(stopDef.waitForUser)\n let frame = 0\n let absent = 0\n const sync = () => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(anchor)}\"]`)\n if (el) {\n absent = 0\n const r = readRect(el)\n setRect(r)\n setCursor(pointFor(r))\n return\n }\n if (!handover) return\n // A couple of beats, not one: a re-render can drop the node for a frame,\n // and stepping aside on that would look like the tour giving up.\n absent += 1\n if (absent >= 3) stop(false)\n }\n const onFrame = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(sync)\n }\n window.addEventListener('scroll', onFrame, true)\n window.addEventListener('resize', onFrame)\n const interval = window.setInterval(sync, 400)\n return () => {\n cancelAnimationFrame(frame)\n window.clearInterval(interval)\n window.removeEventListener('scroll', onFrame, true)\n window.removeEventListener('resize', onFrame)\n }\n }, [stopDef?.anchor, stopDef?.waitForUser, missing, arrived, stop])\n\n // A tour that ended takes its pointer with it; the next one departs fresh\n // from the middle of the screen, not from wherever the last one died.\n React.useEffect(() => {\n if (tour) return\n setCursor(null)\n setArrived(false)\n setRect(null)\n setMissing(false)\n }, [tour])\n\n // Two ways the person touches the highlighted control, two different moves:\n //\n // • A FIELD (input, select, contenteditable) — they are WORKING in it. The\n // overlay retreats (engaged) and comes back when focus leaves. Moving\n // between the field and its own dropdown never flickers, because leaving\n // is decided by where focus LANDS, a tick later.\n // • Anything else (a button, a tab, a nav row) — the click IS the lesson\n // done. The tour advances by itself; a \"Próximo\" that asks them to\n // confirm a click they already made is homework about homework.\n React.useEffect(() => {\n // No `arrived` gate on purpose: an eager person clicks the highlighted\n // control before the cursor finishes its glide, and that click must still\n // advance the tour (and trigger the practice handoff). Requiring arrival\n // dropped those clicks on the floor and left the tour stuck at the door.\n if (!stopDef || missing) return\n const anchor = stopDef.anchor\n const within = (node: EventTarget | null): boolean => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(anchor)}\"]`)\n return !!el && node instanceof Node && el.contains(node)\n }\n const editable = (node: EventTarget | null): boolean =>\n node instanceof Element && !!node.closest('input, textarea, select, [contenteditable=\"true\"]')\n const onDown = (e: Event) => {\n if (!within(e.target)) return\n if (editable(e.target)) setEngaged(true)\n }\n const onFocus = (e: Event) => {\n if (within(e.target) && editable(e.target)) setEngaged(true)\n }\n const onClick = (e: Event) => {\n if (!within(e.target) || editable(e.target)) return\n // Advancing past the end completes — `next()` already folds that in.\n // On a handover stop the click may ALSO make the target vanish; the\n // absence watcher and this race benignly: both end at the same place.\n useTourStore.getState().next()\n }\n const onOut = () => {\n window.setTimeout(() => {\n if (!within(document.activeElement)) setEngaged(false)\n }, 0)\n }\n document.addEventListener('pointerdown', onDown, true)\n document.addEventListener('focusin', onFocus, true)\n document.addEventListener('click', onClick, true)\n document.addEventListener('focusout', onOut, true)\n return () => {\n document.removeEventListener('pointerdown', onDown, true)\n document.removeEventListener('focusin', onFocus, true)\n document.removeEventListener('click', onClick, true)\n document.removeEventListener('focusout', onOut, true)\n }\n }, [stopDef?.anchor, missing])\n\n React.useEffect(() => {\n if (!tour) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') stop(false)\n if (e.key === 'ArrowRight' && !tour.stops[index]?.waitForUser) next()\n if (e.key === 'ArrowLeft') prev()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [tour, index, next, prev, stop])\n\n if (!tour || !stopDef || typeof document === 'undefined') return null\n\n const total = tour.stops.length\n const isLast = index === total - 1\n const bubble = placeBubble(rect, stopDef.placement, rightInset)\n\n const body = (\n // `right` leaves the exempt column (the assistant narrating this tour)\n // outside the overlay entirely — bright, readable, clickable.\n <div\n className={cn('pointer-events-none fixed inset-y-0 left-0 z-[120]', className)}\n style={{ right: rightInset }}\n role=\"dialog\"\n aria-modal=\"false\"\n >\n {rect && !missing ? (\n <>\n {/* Four panels, not a mask — the hole has to be a real hole. While\n the person is USING the control, all four go soft: a dropdown\n that opens from the field spills past the hole, and the dim must\n neither cover it nor eat the click that picks an option.\n\n Clicking the dim does NOTHING on purpose. It used to skip the\n tour, and that was the number-one \"it stopped by itself\": any\n stray click outside the hole killed the run silently. Leaving is\n explicit now — the X, Escape, or \"Encerrar\" on the badge. */}\n <Dim soft={engaged} style={{ top: 0, left: 0, width: '100%', height: Math.max(0, rect.top) }} />\n <Dim soft={engaged} style={{ top: rect.top, left: 0, width: Math.max(0, rect.left), height: rect.height }} />\n <Dim soft={engaged} style={{ top: rect.top, left: rect.left + rect.width, right: 0, height: rect.height }} />\n <Dim soft={engaged} style={{ top: rect.top + rect.height, left: 0, width: '100%', bottom: 0 }} />\n <div\n aria-hidden\n className=\"fz-spotlight-ring pointer-events-none absolute motion-safe:transition-[top,left,width,height] motion-safe:duration-300\"\n style={{ top: rect.top, left: rect.left, width: rect.width, height: rect.height }}\n />\n </>\n ) : (\n <Dim style={{ inset: 0 }} />\n )}\n\n {cursor && !missing && !engaged && (\n <div\n aria-hidden\n className={cn(\n 'fz-tour-cursor',\n !arrived && 'fz-tour-cursor-travel',\n arrived && 'fz-tour-cursor-arrived',\n arrived && stopDef.waitForUser && 'fz-tour-cursor-nudge',\n )}\n style={{ transform: `translate3d(${cursor.x}px, ${cursor.y}px, 0)` }}\n >\n {/* A filled pointer, tip at the translate origin. Primary-coloured with\n a white outline so it reads on the dim AND inside the bright hole. */}\n <svg width=\"34\" height=\"34\" viewBox=\"0 0 24 24\" fill=\"hsl(var(--primary))\" stroke=\"white\" strokeWidth=\"1.4\" strokeLinejoin=\"round\">\n <path d=\"M5.5 3.2v17.6c0 .45.54.67.85.35l4.4-4.4a.5.5 0 0 1 .36-.15h6.24c.45 0 .67-.54.35-.85L6.35 2.85a.5.5 0 0 0-.85.35Z\" />\n </svg>\n </div>\n )}\n\n {(arrived || missing) && !engaged && (\n <div\n className={cn(\n 'pointer-events-auto absolute w-[300px] max-w-[calc(100vw-24px)] rounded-xl border border-border bg-popover p-4 text-popover-foreground shadow-2xl',\n 'motion-safe:animate-in motion-safe:fade-in motion-safe:zoom-in-95 motion-safe:duration-200',\n )}\n style={bubble}\n >\n <button\n type=\"button\"\n onClick={() => stop(false)}\n aria-label={l.skip}\n className=\"absolute right-2 top-2 rounded-md p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n <p className=\"pr-6 text-sm font-semibold leading-snug\">{stopDef.title}</p>\n {(missing ? l.notFound : stopDef.body) && (\n <p className=\"mt-1.5 text-[13px] leading-relaxed text-muted-foreground\">\n {missing ? l.notFound : stopDef.body}\n </p>\n )}\n <div className=\"mt-3 flex items-center gap-2\">\n <span className=\"text-[11px] tabular-nums text-muted-foreground\">\n {l.stepOf.replace('{current}', String(index + 1)).replace('{total}', String(total))}\n </span>\n <span className=\"flex-1\" />\n {/* A handover stop has no \"next\": the person is meant to use the\n control under the light, and the tour moves when the work lands.\n Offering a button here is what turns a walkthrough into a slide\n deck somebody clicks past. */}\n {stopDef.waitForUser && (\n <span className=\"inline-flex items-center gap-1.5 text-[12px] font-medium text-primary\">\n <span className=\"relative flex h-1.5 w-1.5\">\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-primary/70\" />\n <span className=\"relative inline-flex h-1.5 w-1.5 rounded-full bg-primary\" />\n </span>\n {l.waiting}\n </span>\n )}\n {index > 0 && !stopDef.waitForUser && (\n <button\n type=\"button\"\n onClick={prev}\n className=\"rounded-button px-2.5 py-1.5 text-[12.5px] font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {l.back}\n </button>\n )}\n {!stopDef.waitForUser && (\n <button\n type=\"button\"\n onClick={next}\n className=\"rounded-button bg-primary px-3 py-1.5 text-[12.5px] font-semibold text-primary-foreground shadow-button-primary transition-colors hover:bg-primary/90\"\n >\n {isLast ? l.done : l.next}\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n )\n\n return createPortal(body, document.body)\n}\n\n/**\n * One quarter of the dim.\n *\n * The colour is an inline style rather than a utility class on purpose: this\n * overlay is the whole affordance, and a Tailwind build that does not happen to\n * scan this file would drop the class and leave a tour that highlights nothing\n * — silently, with no error. Nothing here is themeable anyway; a scrim is a\n * scrim in both palettes.\n */\nfunction Dim({ style, soft }: { style: React.CSSProperties; soft?: boolean }) {\n return (\n <div\n className={cn(\n 'absolute motion-safe:transition-all motion-safe:duration-300',\n // Hard dim still swallows the click (so a stray click cannot press a\n // covered button) — it just no longer STOPS the tour. Soft is fully\n // click-through: the person is working inside the hole's overflow.\n soft ? 'pointer-events-none' : 'pointer-events-auto',\n )}\n style={{ backgroundColor: soft ? 'rgb(0 0 0 / 0.12)' : 'rgb(0 0 0 / 0.55)', ...style }}\n />\n )\n}\n\n/**\n * Where the label goes. Below the target by default, above when there is no\n * room below, and dead centre when there is no target at all.\n */\nfunction placeBubble(rect: Rect | null, placement: string | undefined, rightInset = 0): React.CSSProperties {\n if (typeof window === 'undefined' || !rect) {\n return { top: '50%', left: '50%', transform: 'translate(-50%, -50%)' }\n }\n // The bubble is positioned inside the overlay, whose right edge stops at the\n // exempt column — clamp against the overlay's width, not the window's.\n const vw = window.innerWidth - rightInset\n const vh = window.innerHeight\n const belowRoom = vh - (rect.top + rect.height)\n const rightRoom = vw - (rect.left + rect.width)\n\n let side = placement && placement !== 'auto' ? placement : belowRoom > 220 ? 'bottom' : rect.top > 220 ? 'top' : rightRoom > 340 ? 'right' : 'left'\n if (side === 'bottom' && belowRoom < 180) side = 'top'\n if (side === 'top' && rect.top < 180) side = 'bottom'\n\n const clampX = (x: number) => Math.min(Math.max(12, x), Math.max(12, vw - BUBBLE_WIDTH - 12))\n const clampY = (y: number) => Math.min(Math.max(12, y), Math.max(12, vh - 190))\n\n switch (side) {\n case 'top':\n return { left: clampX(rect.left + rect.width / 2 - BUBBLE_WIDTH / 2), bottom: Math.max(12, vh - rect.top + GAP) }\n case 'left':\n return { left: Math.max(12, rect.left - BUBBLE_WIDTH - GAP), top: clampY(rect.top) }\n case 'right':\n return { left: clampX(rect.left + rect.width + GAP), top: clampY(rect.top) }\n default:\n return { left: clampX(rect.left + rect.width / 2 - BUBBLE_WIDTH / 2), top: clampY(rect.top + rect.height + GAP) }\n }\n}\n","/**\n * Tour shapes.\n *\n * Mirrors `TourDef` in @fayz-ai/core so the UI kit stays importable on its own\n * (it does not depend on core), and so a plugin's declared tour and a tour the\n * agent invents at runtime are the same object.\n */\nexport interface TourStopDef {\n /** Matches `data-tour=\"<anchor>\"` in the document. */\n anchor: string\n title: string\n body?: string\n /** Navigate here before looking for the anchor. */\n route?: string\n placement?: 'top' | 'bottom' | 'left' | 'right' | 'auto'\n /** Wait for the person to use the control instead of offering \"next\". */\n waitForUser?: boolean\n}\n\n/**\n * A field the person fills themselves after the tour drops them on the form.\n * The one canonical shape for a practice footprint in the UI kit; `practice.store`\n * and `PracticeOverlay` use this, and @fayz-ai/core mirrors it as `PracticeAction`.\n */\nexport interface PracticeStep {\n anchor: string\n label: string\n /** Completing this ends practice and fires the finale. */\n final?: boolean\n}\n\nexport interface TourDef {\n id: string\n title?: string\n stops: TourStopDef[]\n /**\n * What to do AFTER the tour arrives. The stops walk them to the create\n * screen; these footprints let them fill it in themselves, ticking as they\n * go. Completing the whole tour hands off to practice instead of just ending.\n */\n practice?: PracticeStep[]\n}\n\n/** Spread onto the element a tour points at: `<Button {...tourAnchor('shop.new')} />`. */\nexport function tourAnchor(anchor: string): { 'data-tour': string } {\n return { 'data-tour': anchor }\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { Check } from 'lucide-react'\nimport { usePracticeStore, nextPracticeStep } from './practice.store'\nimport { fireConfetti } from './confetti'\n\n/**\n * The footprints. No dim, no cursor — the person is DRIVING now. Each field\n * wears a numbered badge that turns into a check the moment they touch it; the\n * one they should touch next pulses. Filling the last (Save) rains confetti\n * from the bottom of the whole screen.\n *\n * Mounted once by the shell, next to TourSpotlight. Renders nothing until a\n * practice run is active.\n */\nexport function PracticeOverlay() {\n const title = usePracticeStore((s) => s.title)\n const steps = usePracticeStore((s) => s.steps)\n const done = usePracticeStore((s) => s.done)\n const markDone = usePracticeStore((s) => s.markDone)\n const stop = usePracticeStore((s) => s.stop)\n\n const active = !!title && steps.length > 0\n const next = active ? nextPracticeStep(steps, done) : undefined\n\n // Where each badge sits — the top-left corner of its anchor, re-measured on\n // scroll/resize/mutation so it rides the field.\n const [rects, setRects] = React.useState<Record<string, { top: number; left: number } | null>>({})\n React.useEffect(() => {\n if (!active) return\n const measure = () => {\n const out: Record<string, { top: number; left: number } | null> = {}\n for (const s of steps) {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(s.anchor)}\"]`)\n if (el) {\n const r = el.getBoundingClientRect()\n out[s.anchor] = { top: r.top, left: r.left }\n } else {\n out[s.anchor] = null\n }\n }\n setRects(out)\n }\n measure()\n const interval = window.setInterval(measure, 300)\n window.addEventListener('scroll', measure, true)\n window.addEventListener('resize', measure)\n return () => {\n window.clearInterval(interval)\n window.removeEventListener('scroll', measure, true)\n window.removeEventListener('resize', measure)\n }\n }, [active, steps])\n\n // Interaction inside an anchor marks its step done. `pointerdown` + `input` +\n // `change` cover a picker, a text field and a chip alike.\n React.useEffect(() => {\n if (!active) return\n const within = (anchor: string, node: EventTarget | null): boolean => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(anchor)}\"]`)\n return !!el && node instanceof Node && el.contains(node)\n }\n const hit = (e: Event) => {\n for (const s of steps) {\n if (done.includes(s.anchor)) continue\n if (within(s.anchor, e.target)) {\n markDone(s.anchor)\n break\n }\n }\n }\n document.addEventListener('pointerdown', hit, true)\n document.addEventListener('input', hit, true)\n document.addEventListener('change', hit, true)\n return () => {\n document.removeEventListener('pointerdown', hit, true)\n document.removeEventListener('input', hit, true)\n document.removeEventListener('change', hit, true)\n }\n }, [active, steps, done, markDone])\n\n // The finale: when the final step is marked done, celebrate and end. Guarded\n // so it fires once.\n const finaleFired = React.useRef(false)\n React.useEffect(() => {\n if (!active) {\n finaleFired.current = false\n return\n }\n const finalStep = steps.find((s) => s.final) ?? steps[steps.length - 1]\n if (finalStep && done.includes(finalStep.anchor) && !finaleFired.current) {\n finaleFired.current = true\n fireConfetti({ fromBottom: true })\n // Leave the board up a beat so the last check is seen, then clear.\n window.setTimeout(() => stop(), 1400)\n }\n }, [active, done, steps, stop])\n\n if (!active || typeof document === 'undefined') return null\n\n const body = (\n <div className=\"pointer-events-none fixed inset-0 z-[118]\">\n {steps.map((s, i) => {\n const rect = rects[s.anchor]\n if (!rect) return null\n const isDone = done.includes(s.anchor)\n const isNext = next?.anchor === s.anchor\n return (\n <Footprint key={s.anchor} n={i + 1} label={s.label} top={rect.top} left={rect.left} done={isDone} next={isNext} />\n )\n })}\n </div>\n )\n return createPortal(body, document.body)\n}\n\nfunction Footprint({ n, label, top, left, done, next }: { n: number; label: string; top: number; left: number; done: boolean; next: boolean }) {\n return (\n <div\n className=\"absolute flex items-center gap-1.5 transition-all duration-300\"\n // Perch on the field's top-left, nudged out so the badge sits in the\n // margin rather than over the label.\n style={{ top: Math.max(4, top - 12), left: Math.max(4, left - 12) }}\n >\n <span\n className={\n 'flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-[12px] font-bold shadow-lg ring-2 ring-background ' +\n (done\n ? 'bg-primary text-primary-foreground'\n : next\n ? 'fz-practice-pulse bg-primary text-primary-foreground'\n : 'bg-card text-foreground')\n }\n >\n {done ? <Check className=\"h-3.5 w-3.5\" /> : n}\n </span>\n {next && !done && (\n <span className=\"rounded-md bg-primary px-2 py-1 text-[11.5px] font-medium text-primary-foreground shadow-lg\">\n {label}\n </span>\n )}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/primitives/Avatar.tsx","../src/analytics/range.ts","../src/analytics/derive.ts","../src/analytics/batch.ts","../src/analytics/context.tsx","../src/analytics/statement.ts","../src/analytics/StatementTable.tsx","../src/analytics/AnalyticsCard.tsx","../src/analytics/AnalyticsGrid.tsx","../src/analytics/AnalyticsControls.tsx","../src/analytics/DateRangeControl.tsx","../src/tour/practice.store.ts","../src/tour/tour.store.ts","../src/tour/confetti.ts","../src/tour/TourSpotlight.tsx","../src/tour/types.ts","../src/tour/PracticeOverlay.tsx"],"names":["React","value","jsx","node","_","jsxs","React4","React5","ChevronRight","formatSpan","useTranslation","getCurrentLocale","Fragment","Check","create","React6","prev","X","React7","createPortal"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAKA,IAAM,MAAA,GAAeA,kBAGnB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAiB,eAAA,CAAA,IAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,+DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,MAAA,CAAO,cAA8B,eAAA,CAAA,IAAA,CAAK,WAAA;AAE1C,IAAM,WAAA,GAAoBA,kBAGxB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAiB,eAAA,CAAA,KAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,IACrD,GAAG;AAAA;AACN,CACD;AACD,WAAA,CAAY,cAA8B,eAAA,CAAA,KAAA,CAAM,WAAA;AAEhD,IAAM,cAAA,GAAuBA,kBAG3B,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1B,GAAA;AAAA,EAAiB,eAAA,CAAA,QAAA;AAAA,EAAhB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,sEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,cAAA,CAAe,cAA8B,eAAA,CAAA,QAAA,CAAS,WAAA;;;AC9B/C,SAAS,YAAY,CAAA,EAAiB;AAC3C,EAAA,MAAM,CAAA,GAAI,EAAE,WAAA,EAAY;AACxB,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,OAAO,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAC/C,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,GAAG,CAAA,CAAA;AACzB;AAEO,SAAS,SAAS,CAAA,EAAiB;AAExC,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACzC,EAAA,OAAO,IAAI,IAAA,CAAK,CAAA,IAAK,IAAA,EAAA,CAAO,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC9D;AAEA,SAAS,SAAA,CAAU,GAAS,IAAA,EAAoB;AAC9C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,CAAA;AACvB,EAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAQ,GAAI,IAAI,CAAA;AAClC,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,gBAAgB,KAAA,EAAmC;AACjE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAC5B,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,EAAA,CAAG,OAAA,EAAQ,GAAI,IAAA,CAAK,OAAA,EAAQ,IAAK,KAAU,IAAI,CAAC,CAAA;AACjF;AAEO,SAAS,kBAAA,CAAmB,MAAA,EAA8B,KAAA,mBAAQ,IAAI,MAAK,EAAuB;AACvG,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY,EAAG,KAAA,CAAM,QAAA,EAAS,EAAG,KAAA,CAAM,OAAA,EAAQ,EAAG,EAAE,CAAA;AAChF,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,MAAM,WAAA,CAAY,IAAI,GAAG,EAAA,EAAI,WAAA,CAAY,IAAI,CAAA,EAAE;AAAA,IAC1D,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,IAAA,EAAM,EAAE,CAAA;AAC5B,MAAA,OAAO,EAAE,MAAM,WAAA,CAAY,CAAC,GAAG,EAAA,EAAI,WAAA,CAAY,CAAC,CAAA,EAAE;AAAA,IACpD;AAAA;AAAA;AAAA,IAGA,KAAK,aAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,CAAY,SAAA,CAAU,IAAA,EAAM,EAAE,CAAC,CAAA,EAAG,EAAA,EAAI,WAAA,CAAY,IAAI,CAAA,EAAE;AAAA,IACzE,KAAK,cAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,CAAY,SAAA,CAAU,IAAA,EAAM,GAAG,CAAC,CAAA,EAAG,EAAA,EAAI,WAAA,CAAY,IAAI,CAAA,EAAE;AAAA,IAC1E,KAAK,cAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,CAAY,SAAA,CAAU,IAAA,EAAM,GAAG,CAAC,CAAA,EAAG,EAAA,EAAI,WAAA,CAAY,IAAI,CAAA,EAAE;AAAA,IAC1E,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA,CAAY,IAAI,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,EAAG,IAAA,CAAK,QAAA,EAAS,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,QACtE,EAAA,EAAI,YAAY,IAAI;AAAA,OACtB;AAAA,IACF,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,EAAG,IAAA,CAAK,QAAA,EAAS,GAAI,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA;AACrE,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,QAAA,EAAS,EAAG,CAAA,EAAG,EAAE,CAAA;AAChE,MAAA,OAAO,EAAE,MAAM,WAAA,CAAY,KAAK,GAAG,EAAA,EAAI,WAAA,CAAY,IAAI,CAAA,EAAE;AAAA,IAC3D;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,KAAa,CAAC,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA,CAAY,IAAI,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,QAC5D,EAAA,EAAI,YAAY,IAAI;AAAA,OACtB;AAAA,IACF;AAAA,IACA,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,CAAY,IAAI,IAAA,CAAK,KAAK,WAAA,EAAY,EAAG,CAAA,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA,EAAG,EAAA,EAAI,WAAA,CAAY,IAAI,CAAA,EAAE;AAAA,IAC5F;AACE,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,CAAY,SAAA,CAAU,IAAA,EAAM,GAAG,CAAC,CAAA,EAAG,EAAA,EAAI,WAAA,CAAY,IAAI,CAAA,EAAE;AAAA;AAE9E;AASO,SAAS,eAAA,CACd,OACA,OAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,MAAA,EAAQ,OAAO,IAAA;AAE3C,EAAA,IAAI,YAAY,eAAA,EAAiB;AAC/B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAC5B,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,WAAA,EAAY,GAAI,CAAC,CAAA;AACvC,IAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,WAAA,EAAY,GAAI,CAAC,CAAA;AACnC,IAAA,OAAO,EAAE,MAAM,WAAA,CAAY,IAAI,GAAG,EAAA,EAAI,WAAA,CAAY,EAAE,CAAA,EAAE;AAAA,EACxD;AAEA,EAAA,MAAM,IAAA,GAAO,gBAAgB,KAAK,CAAA;AAClC,EAAA,MAAM,SAAS,SAAA,CAAU,QAAA,CAAS,KAAA,CAAM,IAAI,GAAG,EAAE,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,MAAA,EAAQ,EAAE,OAAO,CAAA,CAAE,CAAA;AAC9C,EAAA,OAAO,EAAE,MAAM,WAAA,CAAY,QAAQ,GAAG,EAAA,EAAI,WAAA,CAAY,MAAM,CAAA,EAAE;AAChE;AAOO,SAAS,UAAU,KAAA,EAA8D;AACtF,EAAA,MAAM,IAAA,GAAO,gBAAgB,KAAK,CAAA;AAClC,EAAA,IAAI,IAAA,IAAQ,GAAG,OAAO,MAAA;AACtB,EAAA,IAAI,IAAA,IAAQ,IAAI,OAAO,KAAA;AACvB,EAAA,IAAI,IAAA,IAAQ,KAAK,OAAO,MAAA;AACxB,EAAA,OAAO,OAAA;AACT;;;AC9FO,SAAS,gBAAgB,GAAA,EAAuB;AACrD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,MAAM,OAAO,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,EAAA;AAGnD,EAAA,IAAI,CAAC,SAAS,OAAA,EAAS,UAAU,EAAE,QAAA,CAAS,IAAI,GAAG,OAAO,IAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,CAAQ,aAAY,GAAI,EAAA;AAI1E,EAAA,IAAI,QAAQ,QAAA,CAAS,mBAAmB,CAAA,IAAK,IAAA,KAAS,SAAS,OAAO,KAAA;AACtE,EAAA,OAAO,QAAQ,QAAA,CAAS,eAAe,CAAA,IAAK,OAAA,CAAQ,SAAS,eAAe,CAAA;AAC9E;AAEO,SAAS,IAAI,KAAA,EAAwB;AAC1C,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,CAAA;AAC1B,EAAA,MAAM,IAAI,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAClC;AAUO,SAAS,aAAA,CACd,OAAA,EACA,QAAA,GAA+B,EAAC,EACd;AAClB,EAAA,MAAM,GAAA,GAAwB,EAAE,GAAI,OAAA,IAAW,EAAC,EAAG;AACnD,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,OAAA,EAAS;AACrC,IAAA,MAAM,CAAC,YAAA,EAAc,cAAc,CAAA,GAAI,CAAA,CAAE,OAAA;AACzC,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,GAAA,CAAI,cAAc,CAAC,CAAA;AAC3C,IAAA,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,GAAI,WAAA,KAAgB,CAAA,GAAI,CAAA,GAAK,GAAA,CAAI,GAAA,CAAI,YAAY,CAAC,CAAA,GAAI,WAAA,IAAgB,EAAE,KAAA,IAAS,CAAA,CAAA;AAAA,EAC5F;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,gBAAA,CAAiB,IAAA,EAAsB,QAAA,GAA+B,EAAC,EAAmB;AACxG,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,OAAO,CAAA;AACpE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,GAAG,GAAA,EAAK,GAAG,aAAA,CAAc,GAAA,EAAyB,MAAM,CAAA,EAAE,CAAE,CAAA;AAC1F;AASO,SAAS,YAAA,CAAa,SAAiB,QAAA,EAAoD;AAChG,EAAA,IAAI,QAAA,IAAY,IAAA,IAAQ,QAAA,KAAa,CAAA,EAAG,OAAO,IAAA;AAC/C,EAAA,OAAA,CAAS,OAAA,GAAU,QAAA,IAAY,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,GAAK,GAAA;AACvD;AAEO,SAAS,OAAA,CAAQ,SAAiB,QAAA,EAA4E;AACnH,EAAA,IAAI,QAAA,IAAY,MAAM,OAAO,MAAA;AAC7B,EAAA,IAAI,OAAA,GAAU,UAAU,OAAO,IAAA;AAC/B,EAAA,IAAI,OAAA,GAAU,UAAU,OAAO,MAAA;AAC/B,EAAA,OAAO,SAAA;AACT;AAaO,SAAS,aAAA,CAAc,KAAA,EAAe,MAAA,GAAS,OAAA,EAAiB;AACrE,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA,EAAW,qBAAA,EAAuB,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACtG;AAEO,SAAS,oBAAA,CACd,KAAA,EACA,MAAA,EACA,QAAA,EACA,IAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,UAAU,MAAA,IAAU,OAAA;AAEnC,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,IAAI,CAAC,OAAO,OAAO,QAAA;AACnB,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAChC,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,GAAI,CAAA,CAAE,kBAAA,CAAmB,MAAM,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,WAAW,MAAA,IAAU,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AACpE,IAAA,OAAO,SAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,GAAK,QAAA,GAAM,OAAO,KAAK,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,CAAA,GAAI,IAAI,KAAK,CAAA;AACnB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,UAAA;AACH,MAAA,OAAO,IAAA,EAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,IAAK,GAAA,GACnC,GAAG,QAAA,EAAU,MAAA,IAAU,IAAI,CAAA,EAAG,aAAA,CAAc,GAAG,MAAM,CAAC,KACtD,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAAA,QAC9B,KAAA,EAAO,UAAA;AAAA,QAAY,QAAA,EAAU,UAAU,IAAA,IAAQ,KAAA;AAAA,QAAO,qBAAA,EAAuB;AAAA,OAC9E,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AAAA,IACf,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAG,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,EAAE,qBAAA,EAAuB,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IACjF,KAAK,UAAA;AACH,MAAA,OAAO,eAAe,CAAC,CAAA;AAAA,IACzB;AACE,MAAA,OAAO,IAAA,EAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,IAAK,GAAA,GACnC,cAAc,CAAA,EAAG,MAAM,IACvB,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ,EAAE,uBAAuB,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AAAA;AAE9E;AAGO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,IAAS,GAAG,OAAO,IAAA;AAClD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA;AAC1C,EAAA,IAAI,YAAA,GAAe,GAAG,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,KAAA,GAAQ,IAAI,CAAC,CAAA,CAAA,CAAA;AACxD,EAAA,IAAI,YAAA,GAAe,EAAA,EAAI,OAAO,CAAA,EAAG,YAAY,CAAA,GAAA,CAAA;AAC7C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,EAAE,CAAA;AACtC,EAAA,MAAM,IAAI,YAAA,GAAe,EAAA;AACzB,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,GAAA,CAAA,GAAQ,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA;AAC7C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC3B,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAA,GAAI,EAAE,CAAA,CAAA,CAAA;AACxB;AAgBO,SAAS,YAAA,CAAa,KAAA,EAAgB,KAAA,EAAmC,MAAA,GAAS,OAAA,EAAiB;AACxG,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,QAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAChC,EAAA,IAAI,MAAA,CAAO,MAAM,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,OAAO,OAAO,KAAK,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,EAAE,QAAA,EAAU,KAAA,EAAM;AAC9B,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,MAAA;AAAW,MAAA,OAAO,CAAA,CAAE,mBAAmB,MAAA,EAAQ,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC1F,KAAK,OAAA;AAAW,MAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ,EAAE,GAAG,KAAK,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,IAC/F,KAAK,SAAA;AAAW,MAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,WAAA,EAAY,GAAI,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,cAAA,EAAgB,CAAA,CAAA;AAAA,IACpF,KAAK,MAAA;AAAW,MAAA,OAAO,MAAA,CAAO,CAAA,CAAE,cAAA,EAAgB,CAAA;AAAA,IAChD;AAAgB,MAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ,EAAE,GAAG,KAAK,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA;AAElG;AAmBO,SAAS,YACd,IAAA,EACA,WAAA,EACA,UAAA,EACA,MAAA,EACA,UACA,KAAA,EACgB;AAChB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IAChC,KAAA,EAAO,GAAA,CAAI,WAAW,CAAA,IAAK,IAAA,IAAQ,GAAA,CAAI,WAAW,CAAA,KAAM,EAAA,GAAK,QAAA,GAAM,MAAA,CAAO,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,IAC1F,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,UAAU,CAAC;AAAA,GAC5B,CAAE,CAAA;AACF,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,GAAG,CAAC,CAAA;AACrE,EAAA,MAAM,SAAS,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,MAAA;AAChD,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACxB,GAAG,CAAA;AAAA,IACH,KAAA,EAAO,QAAQ,CAAA,GAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,GAAI,GAAA;AAAA,IAC3C,SAAA,EAAW,oBAAA,CAAqB,CAAA,CAAE,KAAA,EAAO,QAAQ,QAAQ;AAAA,GAC3D,CAAE,CAAA;AACJ;AAGO,SAAS,YAAY,IAAA,EAA4C;AACtE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,QAAA,IAAY,EAAC;AACpC,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,QAAA;AACxB,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,GAAA;AAC5B,EAAA,OAAO,OACJ,GAAA,CAAI,CAAC,QAAQ,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,GAAG,CAAC,CAAA,CAC3C,MAAA,CAAO,CAAC,CAAA,KAA6B,OAAA,CAAQ,CAAC,CAAC,CAAA;AACpD;AAGO,SAAS,YAAY,IAAA,EAAwB;AAGlD,EAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAClE,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,OAAO,KAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,IAAK,KAAK,CAAC,CAAA;AAC3F,EAAA,OAAO,KAAK,CAAC,CAAA;AACf;AASO,SAAS,WAAA,CACd,IAAA,EACA,WAAA,EACA,KAAA,EACA,SAAS,OAAA,EAC+B;AACxC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,IAAA,MAAM,MAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,MAAM,WAAA,EAAa;AACvB,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,IAC5C;AACA,IAAA,GAAA,CAAI,WAAW,IAAI,KAAA,GACf,YAAA,CAAa,IAAI,WAAW,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA,GAC3C,GAAA,CAAI,WAAW,CAAA,IAAK,IAAA,IAAQ,IAAI,WAAW,CAAA,KAAM,KAAK,QAAA,GAAM,MAAA,CAAO,GAAA,CAAI,WAAW,CAAC,CAAA;AACxF,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACH;AAGO,SAAS,OAAA,CAAQ,QAAgC,UAAA,EAA0C;AAChG,EAAA,IAAI,CAAC,QAAQ,IAAA,EAAM,MAAA,IAAU,OAAO,IAAA,CAAK,MAAA,GAAS,GAAG,OAAO,MAAA;AAC5D,EAAA,OAAO,MAAA,CAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,GAAA,CAAI,GAAA,CAAI,UAAU,CAAC,CAAC,CAAA;AACtD;;;ACpPO,IAAM,eAAA,GAAkB;AAmBxB,SAAS,sBAAA,CACd,QAAA,EACA,OAAA,GAAmC,EAAC,EACjB;AACnB,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,eAAA;AACrC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAsC;AAC3D,EAAA,IAAI,QAAmB,EAAC;AACxB,EAAA,IAAI,KAAA,GAA8C,IAAA;AAElD,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,KAAA,GAAQ,IAAA;AACR,IAAA,MAAM,KAAA,GAAQ,KAAA;AACd,IAAA,KAAA,GAAQ,EAAC;AACT,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,CAAA,CAAE,OAAA,EAAS,EAAE,MAAM,CAAA;AAAA,IAC/E,CAAA;AAIA,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAAC,SAAS,OAAA,EAAS;AAAE,MAAA,YAAA,EAAa;AAAG,MAAA;AAAA,IAAO;AAQtE,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,KAAA,EAAM,MAAO,EAAE,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAA;AAAA,IAChF,CAAA,CAAA,MAAQ;AACN,MAAA,YAAA,EAAa;AACb,MAAA;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,IAAA;AAAA,MACR,CAAC,OAAA,KAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,CAAA,KAAM;AACnC,QAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AAIxB,QAAA,IAAI,CAAC,MAAA,EAAQ,CAAA,CAAE,OAAO,IAAI,KAAA,CAAM,mDAAmD,CAAC,CAAA;AAAA,aAAA,IAC3E,MAAA,YAAkB,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAAA,aAC5C,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,MACvB,CAAC,CAAA;AAAA,MACD,CAAC,UAAmB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC;AAAA,KAC1D;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,CAAK,IAAI,KAAA,EAAO,OAAA,CAAQ,YAAA,IAAgB,CAAC,CAAC,CAAA;AACtE,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACjC,MAAA,IAAI,UAAU,OAAO,QAAA;AAErB,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAyB,CAAC,SAAS,MAAA,KAAW;AAChE,QAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,QAAQ,CAAA;AAI3C,QAAA,IAAI,KAAA,IAAS,IAAA,EAAM,KAAA,GAAQ,UAAA,CAAW,OAAO,QAAQ,CAAA;AAAA,MACvD,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM;AAIf,QAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,MACrB,CAAC,CAAA;AAED,MAAA,QAAA,CAAS,GAAA,CAAI,KAAK,OAAO,CAAA;AACzB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA;AAAA;AAAA,IAIA,OAAA,EAAS,SAAS,OAAA,GAAU,CAAC,aAAa,QAAA,CAAS,OAAA,CAAS,QAAQ,CAAA,GAAI;AAAA,GAC1E;AACF;ACrFA,IAAM,gBAAA,GAAyB,qBAA4C,IAAI,CAAA;AAExE,SAAS,mBAAA,GAA6C;AAC3D,EAAA,MAAM,GAAA,GAAY,kBAAW,gBAAgB,CAAA;AAC7C,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAC9F,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,2BAAA,GAA4D;AAC1E,EAAA,OAAa,kBAAW,gBAAgB,CAAA;AAC1C;AAaO,SAAS,wBAAA,CAAyB;AAAA,EACvC,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,aAAA,GAAgB,cAAA;AAAA,EAAgB,cAAA,GAAiB,iBAAA;AAAA,EACrE,eAAA,GAAkB,EAAA;AAAA,EAAI,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW;AAC/C,CAAA,EAAkC;AAChC,EAAA,MAAM,CAAC,MAAA,EAAQ,cAAc,CAAA,GAAU,gBAA+B,aAAa,CAAA;AACnF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,gBAAS,CAAC,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAA8B,OAAO;AAAA,IACnE,SAAA,EAAW,mBAAmB,aAAa,CAAA;AAAA,IAC3C,OAAA,EAAS,cAAA;AAAA,IACT,SAAS,EAAC;AAAA,IACV,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ,CAAE,CAAA;AAEF,EAAA,MAAM,SAAA,GAAkB,MAAA,CAAA,WAAA,CAAY,CAAC,IAAA,KAA+B;AAClE,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,QAAA,CAAS,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,SAAA,EAAW,kBAAA,CAAmB,IAAI,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE,CAAE,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAqB,MAAA,CAAA,WAAA,CAAY,CAAC,SAAA,KAAkC;AACxE,IAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,IAAA,QAAA,CAAS,CAAC,OAAO,EAAE,GAAG,GAAG,SAAA,EAAW,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAChD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAmB,MAAA,CAAA,WAAA,CAAY,CAAC,OAAA,KAA8B;AAClE,IAAA,QAAA,CAAS,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,SAAQ,CAAE,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAkB,MAAA,CAAA,WAAA,CAAY,CAAC,GAAA,EAAaC,MAAAA,KAAmB;AACnE,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM;AACd,MAAA,MAAM,OAAA,GAAU,EAAE,GAAG,CAAA,CAAE,OAAA,EAAQ;AAG/B,MAAA,IAAIA,MAAAA,IAAS,IAAA,IAAQA,MAAAA,KAAU,EAAA,IAAO,KAAA,CAAM,OAAA,CAAQA,MAAK,CAAA,IAAKA,MAAAA,CAAM,MAAA,KAAW,CAAA,EAAI,OAAO,QAAQ,GAAG,CAAA;AAAA,WAChG,OAAA,CAAQ,GAAG,CAAA,GAAIA,MAAAA;AACpB,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,MAAM,CAAA,EAAE;AAAA,IAClC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAmB,MAAA,CAAA,WAAA,CAAY,CAAC,OAAA,KAAqC;AACzE,IAAA,QAAA,CAAS,CAAC,OAAO,EAAE,GAAG,GAAG,OAAA,EAAS,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAC9C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAqB,mBAAY,MAAM;AAC3C,IAAA,QAAA,CAAS,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,SAAS,EAAC,EAAG,IAAA,EAAM,CAAA,EAAE,CAAE,CAAA;AAAA,EAClD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,WAAA,CAAY,CAAC,IAAA,KAAiB;AAClD,IAAA,QAAA,CAAS,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,EAAE,CAAE,CAAA;AAAA,EACrD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAoB,MAAA,CAAA,WAAA,CAAY,CAAC,QAAA,KAAqB;AAG1D,IAAA,QAAA,CAAS,CAAC,OAAO,EAAE,GAAG,GAAG,QAAA,EAAU,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,WAAA,CAAY,CAAC,MAAA,EAAgB,OAAA,KAA4B;AAC7E,IAAA,QAAA,CAAS,CAAC,OAAO,EAAE,GAAG,GAAG,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA,EAAE,CAAE,CAAA;AAAA,EACtD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAkB,MAAA,CAAA,WAAA,CAAY,CAAC,MAAA,KAAmB;AACtD,IAAA,QAAA,CAAS,CAAC,OAAO,EAAE,GAAG,GAAG,MAAA,EAAQ,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAC7C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,WAAA,CAAY,MAAM,eAAA,CAAgB,CAAC,MAAM,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAIzE,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,OAAA;AAAA,IACpB,MAAM,sBAAA,CAAuB,QAAA,EAAU,EAAE,cAAc,CAAA;AAAA,IACvD,CAAC,UAAU,YAAY;AAAA,GACzB;AAEA,EAAA,MAAM,KAAA,GAAc,eAA+B,OAAO;AAAA,IACxD,QAAA,EAAU,OAAA;AAAA,IACV,QAAA,EAAU,YAAY,EAAE,IAAA,EAAM,OAAO,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA,EAAK;AAAA,IACnE,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,YAAA;AAAA,IAAc,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,YAAA;AAAA,IAC3E,OAAA;AAAA,IAAS,WAAA;AAAA,IAAa,OAAA;AAAA,IAAS,SAAA;AAAA,IAC/B,YAAA;AAAA,IAAc,OAAA;AAAA,IAAS,UAAA;AAAA,IAAY;AAAA,GACrC,CAAA,EAAI;AAAA,IAAC,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,YAAA;AAAA,IAAc,UAAA;AAAA,IAAY,SAAA;AAAA,IAC1E,UAAA;AAAA,IAAY,YAAA;AAAA,IAAc,OAAA;AAAA,IAAS,WAAA;AAAA,IAAa,OAAA;AAAA,IAAS,SAAA;AAAA,IACzD,YAAA;AAAA,IAAc,OAAA;AAAA,IAAS,UAAA;AAAA,IAAY;AAAA,GAAU,CAAA;AAE/C,EAAA,uBAAOC,GAAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OAAe,QAAA,EAAS,CAAA;AAC5D;AAoBA,SAAS,iBAAA,CAAkB,MAAwB,KAAA,EAA6C;AAC9F,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,UAAA;AACxB,EAAA,IAAI,CAAC,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,MAAM,CAAA,EAAG,OAAO,IAAA;AACnD,EAAA,MAAM,KAAA,GAAwB,UAAU,KAAK,CAAA;AAC7C,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,KAAA,EAAO;AAAA,MACL,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,KAAA,KAAU,MAAA,GAAS,EAAE,GAAG,CAAA,EAAG,KAAA,KAAU,CAAE;AAAA;AACxE,GACF;AACF;AAEO,SAAS,gBAAA,CACd,MACA,OAAA,EACwB;AACxB,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,YAAA,KAAiB,mBAAA,EAAoB;AAC9D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,gBAAiC,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,gBAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,gBAAS,KAAK,CAAA;AAE9D,EAAA,MAAM,OAAA,GAAA,CAAW,OAAA,EAAS,OAAA,IAAW,IAAA,KAAS,KAAK,SAAA,KAAc,KAAA;AACjE,EAAA,MAAM,MAAA,GAAe,MAAA,CAAA,OAAA;AAAA,IACnB,OAAO,EAAE,GAAG,KAAA,EAAO,GAAG,SAAS,aAAA,EAAc,CAAA;AAAA,IAC7C,CAAC,KAAA,EAAO,OAAA,EAAS,aAAa;AAAA,GAChC;AACA,EAAA,MAAM,QAAA,GAAiB,MAAA,CAAA,OAAA,CAAQ,MAAM,iBAAA,CAAkB,IAAA,EAAM,MAAA,CAAO,SAAS,CAAA,EAAG,CAAC,IAAA,EAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAIxG,EAAA,MAAM,GAAA,GAAY,MAAA,CAAA,OAAA;AAAA,IAChB,MAAM,KAAK,SAAA,CAAU,CAAC,SAAS,EAAA,EAAI,MAAA,EAAQ,YAAY,CAAC,CAAA;AAAA,IACxD,CAAC,QAAA,CAAS,EAAA,EAAI,MAAA,EAAQ,YAAY;AAAA,GACpC;AAEA,EAAM,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AAAE,MAAA,SAAA,CAAU,IAAI,CAAA;AAAG,MAAA;AAAA,IAAO;AACxC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAEtB,IAAA,MAAM,UAAA,GAAa,SAAS,OAAA,GAAU,eAAA,CAAgB,OAAO,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA,GAAI,IAAA;AAE1F,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,MACV,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AAAA,MAC7B,aACI,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,EAAE,KAAA,CAAM,MAAM,IAAI,CAAA,GAC7E,OAAA,CAAQ,QAAQ,IAAI;AAAA,KACzB,CAAA,CACE,IAAA,CAAK,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,KAAM;AAC7B,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,SAAA,CAAU;AAAA,QACR,GAAG,OAAA;AAAA,QACH,MAAM,gBAAA,CAAiB,OAAA,CAAQ,IAAA,EAAM,QAAA,CAAS,MAAM,QAAQ,CAAA;AAAA,QAC5D,QAAA,EAAU,WACN,EAAE,IAAA,EAAM,SAAS,IAAA,EAAM,OAAA,EAAS,QAAA,CAAS,OAAA,EAAQ,GACjD;AAAA,OACL,CAAA;AAAA,IACH,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,QAAA,CAAS,YAAA,CAAa,GAAG,CAAC,CAAA;AAC1B,MAAA,gBAAA,CAAiB,eAAA,CAAgB,GAAG,CAAC,CAAA;AAAA,IACvC,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,IAAE,CAAC,CAAA;AAItD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAElC,CAAA,EAAG,CAAC,GAAA,EAAK,OAAA,EAAS,QAAQ,CAAC,CAAA;AAE3B,EAAA,MAAM,OAAA,GAAgB,mBAAY,MAAM;AACtC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,OAAA;AAAA,IACpB,MAAM,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS,QAAA,CAAS,MAAM,QAAQ,CAAA;AAAA,IAC5D,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAA,CAAS,MAAM,QAAQ;AAAA,GAC3C;AACA,EAAA,MAAM,eAAA,GAAwB,MAAA,CAAA,OAAA;AAAA,IAC5B,MAAO,MAAA,EAAQ,QAAA,GAAW,aAAA,CAAc,MAAA,CAAO,SAAS,OAAA,EAAS,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,GAAI,IAAA;AAAA,IAC5F,CAAC,MAAA,EAAQ,QAAA,EAAU,QAAA,CAAS,MAAM,QAAQ;AAAA,GAC5C;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,iBAAiB,OAAA,EAAS,KAAA,EAAO,eAAe,OAAA,EAAQ;AACpF;AAeO,SAAS,qBACd,IAAA,EAC6C;AAC7C,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,mBAAA,EAAoB;AAChD,EAAA,OAAa,MAAA,CAAA,WAAA,CAAY,OAAO,KAAA,GAAQ,cAAA,KAAmB;AACzD,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,IAAA,EAAM,KAAA,CAAM,SAAS,CAAA;AACxD,IAAA,MAAM,OAAuB,EAAC;AAC9B,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,OAAO,IAAA,EAAA,EAAQ;AAC9C,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU;AAAA,QACvC,GAAG,KAAA;AAAA,QAAO,OAAA,EAAS,MAAA;AAAA,QAAQ,IAAA;AAAA,QAAM,QAAA,EAAU;AAAA,OAC5C,CAAA;AACD,MAAA,IAAA,CAAK,IAAA,CAAK,GAAG,gBAAA,CAAiB,GAAA,CAAI,MAAM,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE,MAAA,IAAI,GAAA,CAAI,KAAK,MAAA,GAAS,gBAAA,IAAoB,KAAK,MAAA,KAAW,GAAA,CAAI,KAAA,IAAS,IAAA,CAAK,MAAA,CAAA,EAAS;AAAA,IACvF;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,QAAA,EAAU,KAAA,EAAO,IAAI,CAAC,CAAA;AAC5B;AAmBO,IAAM,iBAAA,GAAoB;AAE1B,SAAS,mBAAA,CACd,IAAA,EACA,OAAA,GAAU,IAAA,EACwD;AAClE,EAAA,MAAM,SAAA,GAAY,qBAAqB,IAAI,CAAA;AAC3C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,mBAAA,EAAoB;AACtC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,MAAA,CAAA,QAAA,CAAyB,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,gBAAS,OAAO,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAK5D,EAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU;AAAA,IACzB,IAAA,CAAK,EAAA;AAAA,IAAI,KAAA,CAAM,SAAA;AAAA,IAAW,KAAA,CAAM,OAAA;AAAA,IAAS,KAAA,CAAM,MAAA;AAAA,IAAQ,KAAA,CAAM,MAAA;AAAA,IAAQ,KAAA,CAAM;AAAA,GAC5E,CAAA;AAED,EAAM,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AAAE,MAAA,UAAA,CAAW,KAAK,CAAA;AAAG,MAAA;AAAA,IAAO;AAC1C,IAAA,IAAI,IAAA,GAAO,IAAA;AACX,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,iBAAiB,CAAA,CACxB,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,IAAA,EAAM;AAAE,QAAA,OAAA,CAAQ,CAAC,CAAA;AAAG,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAAE;AAAA,IAAE,CAAC,CAAA,CAC3D,KAAA,CAAM,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,IAAA,EAAM;AAAE,QAAA,QAAA,CAAS,YAAA,CAAa,CAAC,CAAC,CAAA;AAAG,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAAE;AAAA,IAAE,CAAC,CAAA;AAC9E,IAAA,OAAO,MAAM;AAAE,MAAA,IAAA,GAAO,KAAA;AAAA,IAAM,CAAA;AAAA,EAE9B,CAAA,EAAG,CAAC,GAAA,EAAK,OAAO,CAAC,CAAA;AAEjB,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAChC;AAIA,IAAM,gBAAA,GAAmB,GAAA;AAGzB,IAAM,cAAA,GAAiB,GAAA;;;ACtRhB,SAAS,YAAA,CAAa,GAAW,CAAA,EAAmB;AACzD,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,EAAQ,EAAA,CAAG,MAAM,CAAA,EAAG,CAAA,EAAA,EAAK;AACvD,IAAA,MAAM,EAAA,GAAK,GAAG,CAAC,CAAA;AACf,IAAA,MAAM,EAAA,GAAK,GAAG,CAAC,CAAA;AACf,IAAA,IAAI,EAAA,KAAO,QAAW,OAAO,EAAA;AAC7B,IAAA,IAAI,EAAA,KAAO,QAAW,OAAO,CAAA;AAC7B,IAAA,MAAM,EAAA,GAAK,OAAO,EAAE,CAAA;AACpB,IAAA,MAAM,EAAA,GAAK,OAAO,EAAE,CAAA;AACpB,IAAA,IAAI,OAAO,QAAA,CAAS,EAAE,KAAK,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AAC9C,MAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,OAAO,EAAA,EAAI;AACpB,MAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,OAAO,CAAA;AACT;AAGO,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAC9B,EAAA,OAAO,IAAI,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AACrC;AAMA,IAAM,YAAA,GAAe,qBAAA;AAErB,SAAS,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,SAAA,EAAmC;AACjF,EAAA,OAAO;AAAA,IACL,KAAK,IAAA,IAAQ,KAAA;AAAA,IACb,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAO,IAAA,GAAO,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA;AAAA,IAC3C,SAAA;AAAA,IACA,KAAK,EAAC;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,KAAA,EAAO,CAAA;AAAA,IACP,UAAU;AAAC,GACb;AACF;AAEA,SAAS,GAAA,CAAI,GAAA,EAA6B,MAAA,EAAgB,KAAA,EAAe;AACvE,EAAA,GAAA,CAAI,MAAM,CAAA,GAAA,CAAK,GAAA,CAAI,MAAM,KAAK,CAAA,IAAK,KAAA;AACrC;AASA,SAAS,MAAA,CAAO,MAAqB,OAAA,EAAyB;AAC5D,EAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,aAAa,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACzD,EAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,IAAA,CAAK,GAAA,EAAI;AAC5B,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IAC1D;AAAA,EACF;AACA,EAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AACxE;AAEO,SAAS,cAAA,CACd,MACA,GAAA,EACW;AACX,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAwC;AAC9D,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,QAAA,EAAU,SAAA,CAAU,IAAI,CAAA,CAAE,KAAA,kBAAO,IAAI,GAAA,EAAK,CAAA;AAE9D,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,UAAU,KAAK,EAAE,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAMb,IAAA,MAAM,SAAS,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,SAAS,KAAK,EAAE,CAAA;AAC9C,IAAA,MAAM,YAAY,CAAC,MAAA;AACnB,IAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAEpC,IAAA,MAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,QAAQ,KAAK,CAAC,CAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAE7B,IAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,IAAK,EAAE,EAAE,IAAA,EAAK;AACjD,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAE,EAAE,IAAA,EAAK;AAEnD,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAIC,KAAAA,GAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAC1B,MAAA,IAAI,CAACA,KAAAA,EAAM;AACT,QAAAA,KAAAA,GAAO,SAAA,CAAU,IAAA,EAAM,KAAA,IAAS,MAAM,KAAK,CAAA;AAC3C,QAAA,MAAA,CAAO,GAAA,CAAI,MAAMA,KAAI,CAAA;AAAA,MACvB,CAAA,MAAO;AAGL,QAAAA,MAAK,SAAA,GAAY,KAAA;AACjB,QAAA,IAAI,KAAA,EAAOA,KAAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,MAC1B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AAKT,MAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,IAAA,CAAK,CAAC,GAAA,KAAmC,GAAA,CAAI,UAAU,OAAO,CAAA;AACxF,MAAA,IAAI,CAAC,MAAM,iBAAA,EAAmB;AAC9B,MAAA,IAAIA,KAAAA,GAAO,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AAClC,MAAA,IAAI,CAACA,KAAAA,EAAM;AACT,QAAAA,KAAAA,GAAO,SAAA,CAAU,EAAA,EAAI,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAClD,QAAAA,KAAAA,CAAK,GAAA,GAAM,CAAA,EAAG,OAAO,GAAG,YAAY,CAAA,CAAA;AACpC,QAAA,MAAA,CAAO,GAAA,CAAI,cAAcA,KAAI,CAAA;AAAA,MAC/B;AACA,MAAA,GAAA,CAAIA,KAAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,CAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAC1B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,SAAA,CAAU,IAAA,EAAM,KAAA,IAAS,IAAA,EAAM,KAAK,CAAA;AAC3C,MAAA,MAAA,CAAO,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,KAAK,SAAA,EAAW;AACzB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAI,KAAA,OAAY,KAAA,GAAQ,KAAA;AAAA,IAC1B;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,SAAS,EAAE,IAAA,EAAK;AAEpC,EAAA,MAAM,QAAyB,EAAC;AAChC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA+D;AAEzF,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,QAAA,EAAU;AAC/B,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAKvC,IAAA,KAAA,MAAW,QAAQ,CAAC,GAAG,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG;AACrC,MAAA,IAAI,SAAS,YAAA,EAAc;AAC3B,MAAA,IAAI,MAAA,GAAS,WAAW,IAAI,CAAA;AAC5B,MAAA,OAAO,MAAA,IAAU,CAAC,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,EAAG;AACpC,QAAA,MAAA,CAAO,IAAI,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAC,CAAA;AAClD,QAAA,MAAA,GAAS,WAAW,MAAM,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,MAAM,QAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,MAAA,EAAQ;AACjC,MAAA,IAAI,SAAS,YAAA,EAAc;AAC3B,MAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,CAAG,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,WACnE,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAA,CAAO,MAAM,OAAO,CAAA;AACpB,MAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IAC5E;AAIA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AACtC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,QAAQ,OAAO,CAAA;AACtB,MAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,IAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IAChF;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,aAAa,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACjD,IAAA,MAAM,QAAQ,MAAA,GAAS,CAAC,GAAG,KAAA,EAAO,MAAM,CAAA,GAAI,KAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAClE,IAAA,aAAA,CAAc,IAAI,IAAA,CAAK,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAO,CAAA;AAE/C,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC9F;AAKA,EAAA,MAAM,MAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAmC;AACxD,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,OAAA,KAAY,IAAA,CAAK,OAAO,CAAA;AAClF,MAAA,IAAI,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,CAAC,SAAS,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,EAAyB;AAC3E,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AACnC,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,IAAI,CAAA,CAAE,OAAO,CAAC,CAAA,EAAG,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAC,IAAI,IAAI,CAAA;AAAA,IAC7E;AACA,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAA;AAAA,MACA,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,CAAA,EAAI,CAAC;AAAA,KAC5D,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,GAAA,EAAI;AAC/B;AAGO,SAAS,YAAA,CACd,KAAA,EACA,IAAA,EACA,GAAA,GAAuB,EAAC,EACP;AACjB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,IAAU,IAAA,CAAK,IAAI,GAAG,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,IAAA,EAAM,GAAG,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,eAAA,CAAgB,OAAwB,KAAA,EAA4B;AAClF,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAA2B;AACvC,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,EAAE,KAAA,GAAQ,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,CAAA;AACnC,MAAA,IAAA,CAAK,EAAE,QAAQ,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW,IAAA,CAAK,KAAK,KAAK,CAAA;AACtE,EAAA,OAAO,IAAA;AACT;AC/QA,IAAM,KAAA,GAAQ,QAAA;AAUd,SAAS,IAAA,CACP,OACA,QAAA,EACQ;AACR,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAChC,EAAA,OAAO,oBAAA,CAAqB,KAAA,EAAO,UAAA,EAAY,QAAQ,CAAA;AACzD;AAEA,SAAS,GAAA,CAAI;AAAA,EACX,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,QAAA;AAAA,EAC5C,UAAA;AAAA,EAAY,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,IAAA;AAAA,EAAM;AACpC,CAAA,EAaG;AACD,EAAA,uBACE,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MAIC,OAAA,EAAS,aAAa,QAAA,GAAW,MAAA;AAAA,MACjC,SAAA,EAAW,EAAA;AAAA,QACT,2CAAA;AAAA,QACA,SAAS,QAAA,IAAY,2BAAA;AAAA,QACrB,SAAS,MAAA,IAAU,2DAAA;AAAA,QACnB,SAAS,SAAA,IAAa,yBAAA;AAAA,QACtB,CAAC,IAAA,IAAQ,mBAAA;AAAA,QACT,UAAA,IAAc;AAAA,OAChB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,KAAA;AAAA,YAGN,SAAA,EAAU,uEAAA;AAAA,YACV,OAAO,EAAE,WAAA,EAAa,GAAG,EAAA,GAAK,KAAA,GAAQ,EAAE,CAAA,EAAA,CAAA,EAAK;AAAA,YAE7C,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,cAAA,UAAA,mBACC,IAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBAGL,QAAA,EAAU,EAAA;AAAA,kBACV,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,oBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,oBAAA,QAAA,IAAW;AAAA,kBAAE,CAAA;AAAA,kBACpD,eAAA,EAAe,IAAA;AAAA,kBACf,SAAA,EAAU,kGAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAA,GAAAA;AAAA,sBAAC,YAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,IAAA,IAAQ,WAAW,CAAA;AAAA,wBACrE,aAAA,EAAW;AAAA;AAAA,qBACb;AAAA,oCACA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA;AAAA,sBAAA,IAAA,GAAO,UAAA,GAAa,UAAA;AAAA,sBAAW,GAAA;AAAA,sBAAE;AAAA,qBAAA,EAAM;AAAA;AAAA;AAAA,kCAGpEA,GAAAA,CAAC,UAAK,SAAA,EAAU,uBAAA,EAAwB,eAAW,IAAA,EAAC,CAAA;AAAA,cAErD,uBACCA,GAAAA,CAAC,UAAK,SAAA,EAAU,mEAAA,EACb,gBACH,CAAA,GACE,IAAA;AAAA,cAIH,KAAA,IAAS,KAAA,KAAU,IAAA,mBAClBA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,aAAa,uBAAuB,CAAA,EAAG,KAAA,EAAO,KAAA,EAC3E,iBACH,CAAA,GACE;AAAA,aAAA,EACN;AAAA;AAAA,SACF;AAAA,QACC,QAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,IAAC,IAAA,EAAA,EAAW,SAAA,EAAU,0DAAA,EACnB,QAAA,EAAA,IAAA,CAAK,OAAO,CAAC,CAAA,EAAG,QAAQ,CAAA,EAAA,EADlB,CAET,CACD,CAAA;AAAA,wBACDA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+FACX,QAAA,EAAA,IAAA,CAAK,KAAA,IAAS,MAAA,EAAW,QAAQ,CAAA,EACpC;AAAA;AAAA;AAAA,GACF;AAEJ;AAUA,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAM,KAAA,EAAM,EAAsC;AAC7E,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAoC,eAAW,IAAA,EAC5D,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0DAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,sBAC/BA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACpCA,GAAAA,CAAC,YAAiB,SAAA,EAAU,UAAA,EAAA,EAAb,CAAwB,CACxC,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IACC,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAC1C,MAAA,MAAM,QAAQ,CAAA,KAAM,CAAA,IAAK,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAClD,MAAA,uBACE,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,EAAA;AAAA,YACT,wEAAA;AAAA,YACA,QAAQ,QAAA,GAAW,QAAA;AAAA,YACnB,KAAA,IAAS;AAAA,WACX;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,KAAA,GAAQ,SAAS,MAAM,CAAA;AAAA,gBAC9C,KAAA,EAAO,EAAE,UAAA,EAAY,KAAA,GAAQ,IAAI,CAAA,EAAI,CAAA,GAAI,CAAA,GAAK,EAAE,CAAA,EAAA,CAAA;AAAK;AAAA,aACvD;AAAA,4BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,CAAI,CAACE,EAAAA,EAAG,CAAA,qBACpCF,GAAAA,CAAC,YAAiB,SAAA,EAAU,YAAA,EAAA,EAAb,CAA0B,CAC1C,CAAA,EACH;AAAA;AAAA,SAAA;AAAA,QAfK;AAAA,OAgBP;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,CAAA;AAEJ;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EAAM,GAAA;AAAA,EAAK,QAAA;AAAA,EAAU,YAAA;AAAA,EAAc,UAAA,GAAa,OAAA;AAAA,EAChD,YAAA,GAAe,OAAA;AAAA,EAAS,YAAA,GAAe,mCAAA;AAAA,EACvC,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS;AAC7B,CAAA,EAAwB;AACtB,EAAA,MAAM,SAAA,GAAuBF,eAAAA,CAAM,OAAA,CAAQ,MAAM,cAAA,CAAe,IAAA,EAAM,GAAG,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,CAAA;AACvF,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAIA,gBAAM,QAAA,CAAsB,sBAAM,IAAI,GAAA,EAAK,CAAA;AACnE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAAA,CAAM,SAAS,KAAK,CAAA;AAIlD,EAAAA,eAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,OAAA,CAAQ,gBAAgB,SAAA,CAAU,KAAA,EAAO,GAAA,CAAI,YAAA,IAAgB,CAAC,CAAC,CAAA;AAAA,EACjE,GAAG,CAAC,SAAA,EAAW,GAAA,CAAI,YAAA,EAAc,OAAO,CAAC,CAAA;AAEzC,EAAA,MAAM,MAAA,GAASA,eAAAA,CAAM,WAAA,CAAY,CAAC,GAAA,KAAgB;AAChD,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,KAAK,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,WAC7B,IAAA,CAAK,IAAI,GAAG,CAAA;AACjB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,eAAAA,CAAM,WAAA,CAAY,CAAC,MAAA,KAAoB;AACpD,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI,CAAC,MAAA,EAAQ;AAAE,MAAA,OAAA,iBAAQ,IAAI,KAAK,CAAA;AAAG,MAAA;AAAA,IAAO;AAC1C,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAA2B;AACvC,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AAAE,QAAA,GAAA,CAAI,GAAA,CAAI,EAAE,GAAG,CAAA;AAAG,QAAA,IAAA,CAAK,EAAE,QAAQ,CAAA;AAAA,MAAE;AAAA,IAC5D,CAAA;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,KAAA,EAAO,IAAI,KAAK,IAAA,KAAS,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAChF,IAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,EACb,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,SAAA;AAK3B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBAAOE,IAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,iBAAiB,KAAA,GAAQ,CAAA,GAAI,KAAK,KAAA,EAAc,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gHACZ,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAS,CAAC,CAAA,KAAqB,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,CAAA;AAEnD,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EACtC,QAAA,EAAA;AAAA,IAAA,CAAC,KAAA,mBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UAAS,OAAA,EAAS,MAAM,MAAA,CAAO,IAAI,CAAA;AAAA,UACxC,SAAA,EAAU,oFAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UAAS,OAAA,EAAS,MAAM,MAAA,CAAO,KAAK,CAAA;AAAA,UACzC,SAAA,EAAU,oFAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA,GACE,IAAA;AAAA,oBAIJA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,KAAA,GAAQ,SAAA,GAAY,SAAS,CAAA,EAC1E,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAG,WAAU,sBAAA,EACZ,QAAA,EAAA;AAAA,wBAAAA,IAAC,IAAA,EAAA,EAAG,KAAA,EAAM,KAAA,EAAM,SAAA,EAAU,+HACvB,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,QACC,QAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,IAAC,IAAA,EAAA,EAAW,KAAA,EAAM,KAAA,EAAM,SAAA,EAAU,iHAC/B,QAAA,EAAA,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,GAAI,CAAA,EAAA,EAD3B,CAET,CACD,CAAA;AAAA,wBACDA,GAAAA,CAAC,IAAA,EAAA,EAAG,OAAM,KAAA,EAAM,SAAA,EAAU,wIACvB,QAAA,EAAA,UAAA,EACH;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,OAAA,EAAA,EACE,gBAAM,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AACtB,QAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,UAAA,uBACEA,GAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cAEC,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,KAAA,EAAO,CAAA;AAAA,cACP,QAAQ,IAAA,CAAK,MAAA;AAAA,cACb,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,OAAA;AAAA,cACA,QAAA;AAAA,cACA,IAAA,EAAM,KAAK,QAAA,IAAY;AAAA,aAAA;AAAA,YAPlB,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA;AAAA,WAQ/B;AAAA,QAEJ;AACA,QAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA;AAC/C,QAAA,uBACEA,IAACF,eAAAA,CAAM,QAAA,EAAN,EACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,qBACZE,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YAEC,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,IAAA,EAAM,KAAK,IAAA,IAAQ,MAAA;AAAA,YACnB,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,OAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAA,EAAY,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,YACnC,IAAA,EAAM,OAAO,IAAI,CAAA;AAAA,YACjB,QAAA,EAAU,MAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,YAC/B,WAAW,IAAA,CAAK;AAAA,WAAA;AAAA,UAXX,IAAA,CAAK;AAAA,SAab,CAAA,EAAA,EAhBkB,CAAA,QAAA,EAAW,IAAA,CAAK,OAAO,CAAA,CAiB5C,CAAA;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACjTA,IAAM,WAAA,GAAyC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM;AAStG,SAAS,UAAA,CAAW;AAAA,EAClB,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU;AAC5B,CAAA,EAA+F;AAC7F,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,mBAAA,EAAoB;AAC3C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAU,CAAA,IAAK,CAAC,QAAA;AAExC,EAAA,uBACEG,IAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EACd,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,0CAA0C,KAAA,GAAQ,WAAA,GAAc,WAAW,CAAA,EAC5F,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EAAsD,eAAK,IAAA,EAAK,CAAA;AAAA,QAC/E,IAAA,CAAK,WAAA,mBACJA,GAAAA,CAAC,IAAA,EAAA,EAAK,OAAO,IAAA,CAAK,WAAA,EAAa,IAAA,EAAK,KAAA,EAClC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,CAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,cAAY,IAAA,CAAK,WAAA;AAAA,YACjB,SAAA,EAAU,0IAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA,WAElC,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MACC,OAAA,mBACCA,GAAAA,CAAC,IAAA,EAAA,EAAK,OAAM,gBAAA,EAAiB,IAAA,EAAK,OAChC,QAAA,kBAAAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,UAAA,GAAa,IAAI,CAAA;AAAA,UAChC,YAAA,EAAY,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,YAAA,CAAA;AAAA,UAC7B,SAAA,EAAU,6OAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SAEtC,CAAA,GACE;AAAA,KAAA,EACN,CAAA;AAAA,oBACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,EAAA,CAAG,UAAU,KAAA,GAAQ,UAAA,GAAa,UAAU,CAAA,EAAI,QAAA,EAAS;AAAA,GAAA,EACnF,CAAA;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,OAAA,EAAS,QAAA,EAAS,EAA6D;AAClG,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,EAAS,QAAQ,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA;AAGvC,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,KAAU,SAAA,IAAa,SAAS,IAAA,EAAM;AAClD,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,EAC1D;AACA,EAAA,MAAM,IAAA,GAAO,KAAA,KAAU,IAAA,GAAO,UAAA,GAAa,YAAA;AAC3C,EAAA,uBACEG,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA;AAAA,IACf,sDAAA;AAAA,IACA,KAAA,KAAU,OAAO,kBAAA,GAAqB;AAAA,GACxC,EACE,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,IACzB,CAAA,EAAG,QAAQ,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,GAAA,EAC7C,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EAAM,WAAA;AAAA,EAAa,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU;AACxC,CAAA,EAGG;AACD,EAAA,MAAM,KAAA,GAAQ,YAAY,IAAA,EAAM,WAAA,EAAa,QAAQ,GAAA,EAAK,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAA;AACzF,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,uBAAOA,IAAC,UAAA,EAAA,EAAW,CAAA;AAC3C,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChBG,IAAAA,CAAC,IAAA,EAAA,EAA8B,WAAU,iCAAA,EACvC,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAAC,UAAK,SAAA,EAAU,sCAAA,EAAuC,OAAO,IAAA,CAAK,KAAA,EAAQ,eAAK,KAAA,EAAM,CAAA;AAAA,oBACtFA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oDAAA,EAAqD,IAAA,EAAK,gBACxE,QAAA,kBAAAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gEAAA;AAAA,QACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,GAAQ,GAAA,EAAK,KAAK,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA,CAAA;AAAI;AAAA,KAC7E,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAqC,eAAK,SAAA,EAAU;AAAA,GAAA,EAAA,EAR7D,GAAG,IAAA,CAAK,KAAK,IAAI,CAAC,CAAA,CAS3B,CACD,CAAA,EACH,CAAA;AAEJ;AASA,IAAM,aAAA,mBAAgB,IAAI,GAAA,CAAY,CAAC,QAAA,EAAU,YAAY,SAAA,EAAW,UAAA,EAAY,MAAA,EAAQ,MAAM,CAAC,CAAA;AACnG,SAAS,aAAa,IAAA,EAAmD;AACvE,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,GAAK,IAAA,GAA2B,MAAA;AAC/D;AAEA,SAAS,SAAA,CAAU;AAAA,EACjB,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU;AACxB,CAAA,EAAkG;AAGhG,EAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAClE,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAgB,CAAE,CAAA;AAAA,IAC7F,GAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAiB,CAAE;AAAA,GACpG;AAMA,EAAA,MAAM,OAAO,UAAA,CAAW,MAAA,GAAS,IAC7B,UAAA,GAAA,CACC,IAAA,CAAK,WAAW,EAAC,EACjB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,KAAK,CAAA,CACjC,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACX,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,MAAA,EAAQ,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA;AAAA,IAC3B,KAAA,EAAO,CAAA,CAAE,KAAA,KAAU,OAAA,GAAW,OAAA,GAAqB;AAAA,GACrD,CAAE,CAAA;AACN,EAAA,MAAM,QAAQ,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,IAAA;AAC7C,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAG,uBAAOA,GAAAA,CAAC,UAAA,EAAA,EAAW,CAAA;AAEhE,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAAG,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gBAAA,EACf,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wCAAA,EACX,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,qBACTA,GAAAA,CAAC,IAAA,EAAA,EAAe,SAAA,EAAW,EAAA,CAAG,uBAAA,EAAyB,CAAA,CAAE,KAAA,KAAU,OAAA,GAAU,YAAA,GAAe,WAAW,CAAA,EACpG,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EADI,CAAA,CAAE,GAEX,CACD,GACH,CAAA,EACF,CAAA;AAAA,oBACAA,IAAC,OAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,GAAA,EAAK,sBACfA,GAAAA,CAAC,QAAW,SAAA,EAAU,yCAAA,EACnB,eAAK,GAAA,CAAI,CAAC,sBACTA,GAAAA,CAAC,QAAe,SAAA,EAAW,EAAA,CAAG,aAAa,CAAA,CAAE,KAAA,KAAU,UAAU,yBAAA,GAA4B,UAAU,GACpG,QAAA,EAAA,oBAAA,CAAqB,GAAA,CAAI,EAAE,GAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,QAAQ,KAD7C,CAAA,CAAE,GAEX,CACD,CAAA,EAAA,EALM,CAMT,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,KAAA,GAAQ,6BAAA,EAA8B,EAAuB;AACjF,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kGACZ,QAAA,EAAA,KAAA,EACH,CAAA;AAEJ;AAEO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAM,SAAA,EAAW,UAAS,EAAuB;AAC/E,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,mBAAA,EAAoB;AACzC,EAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,eAAA,EAAiB,SAAS,KAAA,EAAO,aAAA,EAAc,GAAI,gBAAA,CAAiB,IAAI,CAAA;AACjG,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,IAAQ,EAAC;AAE9B,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,IAAA,CAAK,cAAc,KAAA,EAAO;AAC5B,MAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,wBACxDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,mBAAA,EAAiB;AAAA,OAAA,EAChE,CAAA;AAAA,IAEJ;AAKA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,wBAC/BA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW;AAAA,OAAA,EACjC,CAAA;AAAA,IAEJ;AACA,IAAA,IAAI,aAAA,EAAe;AAGjB,MAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,wBACvDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAsB,QAAA,EAAA,gCAAA,EAA8B,CAAA;AAAA,wBACjEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAoC,QAAA,EAAA,qCAAA,EAAmC;AAAA,OAAA,EACtF,CAAA;AAAA,IAEJ;AACA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,wBACrDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAe,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EACvC,CAAA;AAAA,IAEJ;AAEA,IAAA,QAAQ,IAAA,CAAK,IAAI,IAAA;AAAM,MACrB,KAAK,KAAA,EAAO;AACV,QAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,QAAA,IAAI,CAAC,OAAA,EAAS,uBAAOA,IAAC,UAAA,EAAA,EAAW,CAAA;AACjC,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAC,CAAA;AACtC,QAAA,MAAM,WAAW,eAAA,GAAkB,GAAA,CAAI,gBAAgB,OAAA,CAAQ,GAAG,CAAC,CAAA,GAAI,IAAA;AACvE,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,GAAQ,QAAQ,MAAA,EAAQ,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAC9D,QAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EACb,QAAA,EAAA,oBAAA,CAAqB,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,EAC1E,CAAA;AAAA,4BACAA,GAAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAS,OAAO,QAAA,EAAoB;AAAA,WAAA,EACjD,CAAA;AAAA,UACC,wBACCA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,KAAA;AAAA,cAAO,KAAA,EAAM,iCAAA;AAAA,cACnB,KAAA,EAAO,GAAA;AAAA,cAAK,MAAA,EAAQ,EAAA;AAAA,cAAI,OAAA,EAAS,CAAA;AAAA,cAAG,SAAA,EAAU;AAAA;AAAA,WAChD,GACE;AAAA,SAAA,EACN,CAAA;AAAA,MAEJ;AAAA,MAEA,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,QAAA,IAAI,CAAC,OAAA,IAAW,CAAC,UAAU,uBAAOA,IAAC,UAAA,EAAA,EAAW,CAAA;AAC9C,QAAA,uBACEA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YAAY,aAAa,QAAA,CAAS,GAAA;AAAA,YAAK,OAAA;AAAA,YACvC,QAAA;AAAA,YAAoB,KAAA,EAAO,KAAK,GAAA,CAAI;AAAA;AAAA,SACtC;AAAA,MAEJ;AAAA,MAEA,KAAK,OAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAY,IAAA,EAAY,UAAoB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS,CAAA,EAAG,CAAA;AAAA,MAE5F,KAAK,WAAA,EAAa;AAIhB,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,WAAW,uBAAOA,IAAC,UAAA,EAAA,EAAW,CAAA;AAC5C,QAAA,uBACEA,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,KAAK,EAAE,GAAG,KAAK,GAAA,CAAI,SAAA,EAAW,cAAc,CAAA,EAAE;AAAA,YAC9C,QAAA;AAAA,YACA,YAAA,EAAc,CAAC,CAAA,KAAM,YAAA,CAAa,GAAG,OAAO,CAAA;AAAA,YAC5C,KAAA,EAAK;AAAA;AAAA,SACP;AAAA,MAEJ;AAAA,MAEA,KAAK,QAAA,EAAU;AAGb,QAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,QAAA,IAAI,CAAC,OAAA,IAAW,CAAC,UAAU,uBAAOA,IAAC,UAAA,EAAA,EAAW,CAAA;AAC9C,QAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,CAAC,IAAI,OAAA,CAAQ,GAAG,CAAC,CAAA,IAAK,CAAA;AAC7C,QAAA,uBACEA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACX,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AACpB,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAC,CAAA;AAClC,UAAA,uBACEG,IAAAA,CAAC,IAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EACpB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EACb,QAAA,EAAA;AAAA,8BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAA,MAAA,CAAO,IAAI,QAAA,CAAS,GAAG,CAAA,IAAK,QAAG,CAAA,EAAE,CAAA;AAAA,8BACnFG,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,gBAAA,oBAAA,CAAqB,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AAAA,gCACrDA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EACX,QAAA,EAAA;AAAA,kBAAA,CAAA,KAAA,GAAQ,KAAA,GAAS,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA;AAAA,kBAAE;AAAA,iBAAA,EACtC;AAAA,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BACAH,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mDAAA,EACd,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEAAiE,KAAA,EAAO,EAAE,OAAO,CAAA,EAAI,KAAA,GAAQ,QAAS,GAAG,CAAA,CAAA,CAAA,IAAO,CAAA,EAClI;AAAA,WAAA,EAAA,EAZO,CAaT,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH,CAAA;AAAA,MAEJ;AAAA,MAEA,SAAS;AACP,QAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,uBAAOA,IAAC,UAAA,EAAA,EAAW,CAAA;AAC1C,QAAA,IAAI,CAAC,QAAA,EAAU,uBAAOA,IAAC,UAAA,EAAA,EAAW,CAAA;AAClC,QAAA,MAAM,SAAA,GAAY,WAAA,CAAY,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,IAAK,MAAA;AAChD,QAAA,MAAM,IAAA,GAAO,YAAY,IAAA,EAAM,QAAA,CAAS,KAAK,QAAA,CAAS,KAAA,EAAO,SAAS,MAAM,CAAA;AAC5E,QAAA,MAAM,MAAA,GAAwB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AACtF,QAAA,uBACEA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,SAAA;AAAA,YACN,IAAA;AAAA,YACA,MAAA;AAAA,YACA,aAAa,QAAA,CAAS,GAAA;AAAA,YACtB,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,IAAU,GAAA;AAAA,YAC3B,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,MAEJ;AAAA;AACF,EACF,CAAA,GAAG;AAEH,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,KAAS,KAAA;AAChC,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAY,QAAA,EAAoB,KAAA,EAAe,QAAA,EAAA,IAAA,EAAK,CAAA,EAClE,CAAA;AAEJ;AC/VA,SAAS,YAAY,IAAA,EAAuC;AAC1D,EAAA,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,EAAM,OAAO,KAAK,SAAA,CAAU,IAAA;AAChD,EAAA,QAAQ,IAAA,CAAK,IAAI,IAAA;AAAM,IACrB,KAAK,KAAA;AAAO,MAAA,OAAO,CAAA;AAAA,IACnB,KAAK,OAAA;AAAS,MAAA,OAAO,CAAA;AAAA,IACrB;AAAS,MAAA,OAAO,CAAA;AAAA;AAEpB;AAOO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,SAAA,EAAU,EAAuB;AACtE,EAAA,MAAM,KAAA,GAAcI,MAAA,CAAA,OAAA;AAAA,IAClB,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACzB,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,IAAA,EAAM,YAAY,IAAI,CAAA;AAAA,MACtB,IAAA,kBAAMJ,GAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAY;AAAA,KACnC,CAAE,CAAA;AAAA,IACF,CAAC,KAAK;AAAA,GACR;AACA,EAAA,uBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,SAAA,EAAsB,CAAA;AAC5D;AASO,SAAS,eAAe,KAAA,EAAiD;AAC9E,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAgC;AAClD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,OAAA,IAAW,EAAC,EAAG;AAC7C,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAG,GAAG,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AAAA,IAC1D;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,MAAA,EAAQ,CAAA;AAC3B;ACvBA,IAAM,OAAA,GAAkC;AAAA,EACtC,OAAA;AAAA,EAAS,WAAA;AAAA,EAAa,aAAA;AAAA,EAAe,cAAA;AAAA,EAAgB,cAAA;AAAA,EACrD,YAAA;AAAA,EAAc,YAAA;AAAA,EAAc,cAAA;AAAA,EAAgB;AAC9C,CAAA;AAEA,IAAM,eAAA,GAAkB,CAAC,iBAAA,EAAmB,eAAA,EAAiB,MAAM,CAAA;AAGnE,SAAS,UAAA,CAAW,IAAA,EAAc,EAAA,EAAY,MAAA,EAAwB;AACpE,EAAA,MAAM,IAAA,GAAmC,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,OAAA,EAAQ;AAC1E,EAAA,MAAM,CAAA,GAAI,SAAS,IAAI,CAAA;AACvB,EAAA,MAAM,CAAA,GAAI,SAAS,EAAE,CAAA;AACrB,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAY,CAAA,CAAE,mBAAmB,MAAA,EAAQ;AAAA,IACpD,GAAG,IAAA;AAAA;AAAA,IAEH,GAAI,CAAA,CAAE,WAAA,EAAY,KAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,GAAI,EAAC,GAAI,EAAE,MAAM,SAAA;AAAU,GAC3E,CAAA;AACD,EAAA,OAAO,IAAA,KAAS,EAAA,GAAK,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,QAAA,EAAM,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA;AACrD;AAMA,SAAS,iBAAiB,MAAA,EAAqD;AAC7E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUK,MAAA,CAAA,QAAA;AAAA,IAClC,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,CAAO,UAAU;AAAC,GACpD;AACA,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,UAAA,EAAY;AACxC,MAAA,UAAA,CAAW,KAAA,CAAM,QAAQ,MAAA,CAAO,OAAO,IAAI,MAAA,CAAO,OAAA,GAAU,EAAE,CAAA;AAC9D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAK,MAAA,CAAO,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACzF,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAA,CAAO,OAAO,CAAC,CAAA;AACnB,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO;AACjB,CAAA,EAAoH;AAClH,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,OAAA,GAAU,iBAAiB,MAAM,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAEhC,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,IAAU,MAAA,CAAO,SAAS,QAAA,EAAU;AACtD,IAAA,uBACEL,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,QAAA,GAAW,MAAA;AAAA,QAC5C,KAAA,EAAO,OAAA,IAAW,IAAA,GAAO,EAAA,GAAK,OAAO,OAAO,CAAA;AAAA,QAC5C,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,OAAO,GAAA,EAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACpD,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,EAEJ;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,SAAA,EAAW;AAC7B,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,CAAC,EAAE,KAAA,EAAO,CAAA,CAAE,YAAY,CAAA,EAAG,KAAA,EAAO,QAAO,EAAG,EAAE,KAAA,EAAO,CAAA,CAAE,WAAW,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBAC3FG,IAAAA,CAAC,OAAA,EAAA,EAAoB,WAAU,sFAAA,EAC7B,QAAA,EAAA;AAAA,sBAAAH,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,MAAM,MAAA,CAAO,GAAA;AAAA,UACb,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA,KAAM,CAAA,CAAE,KAAA;AAAA,UAC/B,UAAU,MAAM,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,EAAE,KAAK,CAAA;AAAA,UAC5C,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MACC,CAAA,CAAE;AAAA,KAAA,EAAA,EARO,CAAA,CAAE,KASd,CACD,CAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,KAAS,aAAA;AAC9B,EAAA,MAAM,WAAW,IAAI,GAAA,CAAI,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,OAAA,IAAW,OAAO,CAAC,MAAA,CAAO,OAAO,CAAC,CAAA,GAAI,EAAE,CAAA;AAEhH,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2CAAA,EAA6C,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAAE,CAAA;AAAA,EACpG;AAEA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZG,IAAAA,CAAC,OAAA,EAAA,EAAoB,WAAU,sFAAA,EAQ5B,QAAA,EAAA;AAAA,IAAA,KAAA,mBACCH,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QAC7B,cAAY,CAAA,CAAE,KAAA;AAAA,QACd,UAAU,MAAM;AACd,UAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,UAAA,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,KAAK,GAAG,IAAA,CAAK,MAAA,CAAO,EAAE,KAAK,CAAA;AAAA,eACrC,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AACrB,UAAA,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAAA,QAChC;AAAA;AAAA,wBAGFA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,MAAM,MAAA,CAAO,GAAA;AAAA,QACb,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QAC7B,QAAA,EAAU,MAAM,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,GAAI,MAAA,GAAY,CAAA,CAAE,KAAK,CAAA;AAAA,QAChF,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,YAAE,KAAA,EAAM;AAAA,GAAA,EAAA,EA5B1B,CAAA,CAAE,KA6Bd,CACD,CAAA,EACH,CAAA;AAEJ;AAOO,SAAS,qBAAA,CAAsB,EAAE,OAAA,EAAQ,EAA+B;AAC7E,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,YAAA,KAAiB,mBAAA,EAAoB;AAMhE,EAAA,MAAM,UAAU,iBAAA,EAAkB;AAClC,EAAA,MAAM,SAAS,OAAA,KAAY,OAAA;AAC3B,EAAA,MAAM,aAAa,oBAAA,EAAqB;AACxC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUK,gBAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,gBAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,gBAAwB,IAAI,CAAA;AAGpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAkC,MAAM,OAAO,CAAA;AAE/E,EAAMA,iBAAU,MAAM;AAAE,IAAA,IAAI,IAAA,IAAQ,MAAA,EAAQ,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AAAA,EAAE,GAAG,CAAC,IAAA,EAAM,MAAA,EAAQ,KAAA,CAAM,OAAO,CAAC,CAAA;AAEpG,EAAA,MAAM,MAAA,GAAeA,eAAQ,MAAM;AACjC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACpC,IAAA,MAAM,QAAA,GAAW,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,GAAI,OAAA;AAChF,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAkC;AAClD,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,2BAA2B,CAAA;AACpD,MAAA,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,CAAC,GAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,IAAK,EAAC,EAAI,CAAC,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,CAAC,GAAG,GAAA,CAAI,OAAA,EAAS,EAAE,IAAA,CAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,CAAC,CAAC,CAAA;AAEvB,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,KAAA,mBACJF,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,GAAS,MAAA,GAAS,gBAChC,QAAA,kBAAAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,8EAAA,EAA+E,CAAA;AAAA,sBACjGA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,MAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACzC,WAAA,EAAa,EAAE,0BAA0B,CAAA;AAAA,UACzC,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,GAAS,mCAAmC,8BAAA,EACzD,QAAA,EAAA,MAAA,CAAO,MAAA,KAAW,CAAA,mBACjBA,GAAAA,CAAC,OAAE,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAAE,CAAA,GAEhG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,YAAY,CAAA,KAAM;AACpC,MAAA,MAAM,QAAA,GAAW,UAAU,SAAA,KAAc,KAAA;AACzC,MAAA,uBACEG,KAAC,KAAA,EAAA,EAGE,QAAA,EAAA;AAAA,QAAA,MAAA,mBACCH,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,oFAAA,EACV,QAAA,EAAA,KAAA,EACH,oBAEAG,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,MAAO,CAAA,KAAM,KAAA,GAAQ,OAAO,KAAM,CAAA;AAAA,YAC/D,eAAA,EAAe,QAAA;AAAA,YACf,SAAA,EAAU,sFAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,8BACrCA,IAACM,YAAAA,EAAA,EAAa,WAAW,EAAA,CAAG,wDAAA,EAA0D,QAAA,IAAY,WAAW,CAAA,EAAG;AAAA;AAAA;AAAA,SAClH;AAAA,QAED,QAAA,mBACCN,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,MAAA,GAAS,qBAAA,GAAwB,0BAAA,EAC9C,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,qBACjBG,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EAAkD,YAAE,KAAA,EAAM,CAAA;AAAA,0BACvEA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,CAAA;AAAA,cACR,KAAA;AAAA,cACA,UAAU,CAAC,GAAA,EAAK,KAAA,KAAU,QAAA,CAAS,CAAC,CAAA,KAAM;AACxC,gBAAA,MAAM,IAAA,GAAO,EAAE,GAAG,CAAA,EAAE;AACpB,gBAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,IAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAI,OAAO,KAAK,GAAG,CAAA;AAAA,qBAC7F,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AACjB,gBAAA,OAAO,IAAA;AAAA,cACT,CAAC;AAAA;AAAA;AACH,SAAA,EAAA,EAXQ,CAAA,CAAE,GAYZ,CACD,CAAA,EACH,CAAA,GACE;AAAA,OAAA,EAAA,EApCI,KAqCV,CAAA;AAAA,IAEJ,CAAC,CAAA,EAEL,CAAA;AAAA,oBAEAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,MACd,kDAAA;AAAA,MACA,SAAS,WAAA,GAAc;AAAA,KACzB,EACE,QAAA,EAAA;AAAA,sBAAAH,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UAAQ,IAAA,EAAK,IAAA;AAAA,UACrB,SAAS,MAAM;AAAE,YAAA,QAAA,CAAS,EAAE,CAAA;AAAG,YAAA,YAAA,EAAa;AAAG,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,YAAA,UAAA,EAAW;AAAA,UAAE,CAAA;AAAA,UAE3E,YAAE,yBAAyB;AAAA;AAAA,OAC9B;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,SAAS,MAAM;AAAE,QAAA,UAAA,CAAW,KAAK,CAAA;AAAG,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,QAAA,UAAA,EAAW;AAAA,MAAE,CAAA,EAChF,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAC9B;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,IAAI,QAAQ,uBAAOA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAyB,QAAA,EAAA,KAAA,EAAM,CAAA;AAEjE,EAAA,uBACEG,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAG,KAAC,aAAA,EAAA,EAAc,IAAA,EAAM,iBAAA,EAAmB,KAAA,EAAO,KAAA,EAC5C,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,mBAAmB,CAAA;AAAA,MACrB,WAAA,GAAc,oBACbH,GAAAA,CAAC,UAAK,SAAA,EAAU,yFAAA,EACb,uBACH,CAAA,GACE;AAAA,KAAA,EACN,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAM,KAAA,EAAM,SAAA,EAAU,YACnC,QAAA,EAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAMA,SAAS,qBAAA,GAAwB;AAC/B,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,UAAU,iBAAA,EAAkB;AAClC,EAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,YAAA,KAAiB,mBAAA,EAAoB;AACvE,EAAA,MAAM,SAAS,MAAA,KAAW,QAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,WAAW,KAAA,CAAM,SAAA,CAAU,MAAM,KAAA,CAAM,SAAA,CAAU,IAAI,MAAM,CAAA;AAQxE,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,uBACEG,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,wBAAAH,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAAE,CAAA;AAAA,wBACvFA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,MAAM,SAAA,CAAU,IAAA;AAAA,YAIvB,QAAA,EAAU,CAAC,IAAA,KAAS,YAAA,CAAa;AAAA,cAC/B,IAAA;AAAA,cACA,IAAI,IAAA,GAAO,KAAA,CAAM,UAAU,EAAA,GAAK,IAAA,GAAO,MAAM,SAAA,CAAU;AAAA,aACxD;AAAA;AAAA;AACH,OAAA,EACF,CAAA;AAAA,sBACAG,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,wBAAAH,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,wBACrFA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,MAAM,SAAA,CAAU,EAAA;AAAA,YACvB,QAAA,EAAU,CAAC,EAAA,KAAO,YAAA,CAAa;AAAA,cAC7B,MAAM,EAAA,GAAK,KAAA,CAAM,UAAU,IAAA,GAAO,EAAA,GAAK,MAAM,SAAA,CAAU,IAAA;AAAA,cACvD;AAAA,aACD;AAAA;AAAA;AACH,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAKA,EAAA,uBACEA,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,CAAA,gBAAA,EAAmB,CAAC,CAAA,CAAE,GAAE,CAAE,CAAA;AAAA,MAC5E,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAyB,CAAA;AAAA,MACpD,KAAA,EAAO,MAAA,GAAS,CAAA,CAAE,wBAAwB,CAAA,GAAI,MAAA;AAAA,MAG9C,IAAA,EAAM,SAAS,MAAA,GAAY,IAAA;AAAA,MAC3B,KAAA,kBACEG,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAH,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,wBAKnBG,IAAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAU,MAAM,YAAA,CAAa,EAAE,GAAG,KAAA,CAAM,SAAA,EAAW,CAAA,EAC9D,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,wBAAwB,CAAA;AAAA,UAC1B,yBAASH,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,qCAAoC,CAAA,GAAK;AAAA,SAAA,EACtE;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,QAAA,EAAA,MAAA,mBACCG,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,KAAA,EAAO,MAAM,SAAA,CAAU,IAAA;AAAA,YAIvB,QAAA,EAAU,CAAC,IAAA,KAAS,YAAA,CAAa;AAAA,cAC/B,IAAA;AAAA,cACA,IAAI,IAAA,GAAO,KAAA,CAAM,UAAU,EAAA,GAAK,IAAA,GAAO,MAAM,SAAA,CAAU;AAAA,aACxD;AAAA;AAAA,SACH;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjDA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,KAAA,EAAO,MAAM,SAAA,CAAU,EAAA;AAAA,YACvB,QAAA,EAAU,CAAC,EAAA,KAAO,YAAA,CAAa;AAAA,cAC7B,MAAM,EAAA,GAAK,KAAA,CAAM,UAAU,IAAA,GAAO,EAAA,GAAK,MAAM,SAAA,CAAU,IAAA;AAAA,cACvD;AAAA,aACD;AAAA;AAAA;AACH,OAAA,EACF,CAAA,GACE;AAAA;AAAA,GACN;AAEJ;AAoBO,SAAS,iBAAA,CAAkB,EAAE,OAAA,GAAU,EAAC,EAAG,WAAA,GAAc,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAU,EAA2B;AACrI,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,OAAA,KAAY,mBAAA,EAAoB;AAC3D,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,MAAA;AAEjC,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAgB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,GAAG,CAAA,EAAG,KAAA,IAAS,GAAA;AAElF,EAAA;AAAA;AAAA;AAAA;AAAA,oBAIEA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,EAAW,EAAE,mBAAmB,CAAA;AAAA,QAChC,KAAA,kBAAOA,GAAAA,CAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,QAC9B,OAAA,kBACEG,IAAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,WAAA,mBACCA,KAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAO,IAAA,EACtB,QAAA,kBAAAA,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,gBAAA;AAAA,gBAIN,SAAA,EAAW,OAAA,KAAY,MAAA,GAAS,uBAAA,GAA0B,MAAA;AAAA,gBAEzD,QAAA,EAAA,CAAA,CAAE,CAAA,kBAAA,EAAqB,OAAO,CAAA,CAAE;AAAA;AAAA,aACnC,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,OAAM,KAAA,EAAM,SAAA,EAAU,QACpC,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,qBACpBG,IAAAA,CAAC,YAAA,EAAA,EAAqB,UAAU,MAAM,UAAA,CAAW,CAAC,CAAA,EAC/C,QAAA,EAAA;AAAA,cAAA,CAAA,CAAE,CAAA,kBAAA,EAAqB,CAAC,CAAA,CAAE,CAAA;AAAA,cAC1B,YAAY,CAAA,mBAAIH,IAAC,KAAA,EAAA,EAAM,SAAA,EAAU,qCAAoC,CAAA,GAAK;AAAA,aAAA,EAAA,EAF1D,CAGnB,CACD,CAAA,EACH;AAAA,WAAA,EACF,CAAA,GACE,IAAA;AAAA,0BACJA,GAAAA,CAAC,qBAAA,EAAA,EAAsB,OAAA,EAAkB;AAAA,SAAA,EAC3C,CAAA;AAAA,QAKF,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,qBACnCA,IAAC,gBAAA,EAAA,EAA2B,KAAA,EAAO,YAAY,GAAG,CAAA,EAAG,OAAc,SAAA,EAAW,GAAA,EAAA,EAAvD,GAA4D,CACpF,CAAA;AAAA,QACD,SAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA,EAAW,OAAA;AAAA,QACX,YAAA,EAAc,EAAE,mBAAmB;AAAA;AAAA;AACrC;AAEJ;AAEA,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,KAAA,EAAO,WAAU,EAAyD;AAC3G,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,mBAAA,EAAoB;AAG1C,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,KAAK,IAC3B,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,CAAA,CAAE,8BAA8B,EAAE,KAAA,EAAO,MAAM,MAAA,EAAQ,CAAA,GAChG,MAAA,CAAO,KAAK,CAAA;AAChB,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMEG,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uJAAA,EACd,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,QAAM;AAAA,OAAA,EAAC,CAAA;AAAA,sBAC9CH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAA0B,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,sBAC/CA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,SAAA,CAAU,SAAA,EAAW,MAAS,CAAA;AAAA,UAC7C,cAAY,CAAA,EAAG,CAAA,CAAE,0BAA0B,CAAC,KAAK,KAAK,CAAA,CAAA;AAAA,UACtD,SAAA,EAAU,mEAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,KAAA,EACF;AAAA;AAEJ;AC3dO,IAAM,kBAAA,GAA6C;AAAA,EACxD,OAAA;AAAA,EAAS,WAAA;AAAA,EAAa,aAAA;AAAA,EAAe,cAAA;AAAA,EAAgB,cAAA;AAAA,EACrD,YAAA;AAAA,EAAc,YAAA;AAAA,EAAc;AAC9B;AAWA,SAASO,WAAAA,CAAW,IAAA,EAAc,EAAA,EAAY,MAAA,EAAwB;AACpE,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,CAAA;AAC9E,EAAA,MAAM,CAAA,GAAI,IAAI,MAAA,iBAAO,IAAI,KAAK,CAAA,EAAG,IAAI,WAAW,CAAC,CAAA;AACjD,EAAA,MAAM,CAAA,GAAI,IAAI,MAAA,iBAAO,IAAI,KAAK,CAAA,EAAG,EAAE,WAAW,CAAC,CAAA;AAC/C,EAAA,OAAO,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,WAAM,CAAC,CAAA,CAAA;AAClC;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,MAAA,GAAS,QAAA;AAAA,EAAU,cAAA;AAAA,EAAgB,OAAA,GAAU;AAChE,CAAA,EAA0B;AACxB,EAAA,MAAM,IAAIC,cAAAA,EAAe;AACzB,EAAA,MAAM,SAASC,gBAAAA,EAAiB;AAChC,EAAA,MAAM,SAAS,MAAA,KAAW,QAAA;AAE1B,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAA4B;AACxC,IAAA,cAAA,GAAiB,CAAC,CAAA;AAClB,IAAA,QAAA,CAAS,kBAAA,CAAmB,CAAC,CAAC,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,uBACET,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,CAAA,gBAAA,EAAmB,CAAC,CAAA,CAAE,GAAE,CAAE,CAAA;AAAA,MAC5E,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,CAAC,CAAA,KAAM,IAAA,CAAK,CAAyB,CAAA;AAAA,MAC/C,KAAA,EAAO,MAAA,GAAS,CAAA,CAAE,wBAAwB,CAAA,GAAI,MAAA;AAAA,MAG9C,IAAA,EAAM,SAAS,MAAA,GAAYO,WAAAA,CAAW,MAAM,IAAA,EAAM,KAAA,CAAM,IAAI,MAAM,CAAA;AAAA,MAClE,KAAA,kBACEJ,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAV,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,wBACnBG,IAAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAU,MAAM;AAAE,UAAA,cAAA,GAAiB,QAAQ,CAAA;AAAG,UAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,QAAE,CAAA,EAChF,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,wBAAwB,CAAA;AAAA,UAC1B,yBAASH,GAAAA,CAACW,OAAA,EAAM,SAAA,EAAU,qCAAoC,CAAA,GAAK;AAAA,SAAA,EACtE;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,QAAA,EAAA,MAAA,mBACCR,IAAAA,CAAAO,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAV,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,OAAO,KAAA,CAAM,IAAA;AAAA,YAIb,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,CAAS,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,GAAO,KAAA,CAAM,EAAA,GAAK,IAAA,GAAO,KAAA,CAAM,IAAI;AAAA;AAAA,SAC9E;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACjDA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,OAAO,KAAA,CAAM,EAAA;AAAA,YACb,QAAA,EAAU,CAAC,EAAA,KAAO,QAAA,CAAS,EAAE,IAAA,EAAM,EAAA,GAAK,KAAA,CAAM,IAAA,GAAO,EAAA,GAAK,KAAA,CAAM,IAAA,EAAM,IAAI;AAAA;AAAA;AAC5E,OAAA,EACF,CAAA,GACE;AAAA;AAAA,GACN;AAEJ;ACnEO,IAAM,gBAAA,GAAmB,MAAA,CAAsB,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,EACnE,KAAA,EAAO,IAAA;AAAA,EACP,OAAO,EAAC;AAAA,EACR,MAAM,EAAC;AAAA,EAEP,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AACvB,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,IAAA,GAAA,CAAI,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAI,CAAA;AAAA,EAChC,CAAA;AAAA,EAEA,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,GAAA,EAAI;AAC5B,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,EAAG;AAC7C,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,IAAA,GAAA,CAAI,EAAE,IAAA,EAAM,CAAC,GAAG,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,EACjC,CAAA;AAAA,EAEA,IAAA,EAAM,MAAM,GAAA,CAAI,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,EAAC,EAAG,IAAA,EAAM,EAAC,EAAG;AACtD,CAAA,CAAE;AAGK,SAAS,gBAAA,CAAiB,OAAuB,IAAA,EAA0C;AAChG,EAAA,OAAO,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,MAAM,CAAC,CAAA;AACnD;;;ACrCA,IAAI,SAAA;AACG,SAAS,iBAAiB,EAAA,EAAgD;AAC/E,EAAA,SAAA,GAAY,EAAA;AACd;AACO,SAAS,gBAAA,GAAyD;AACvE,EAAA,OAAO,SAAA;AACT;AAmBO,IAAM,YAAA,GAAeY,MAAAA,CAAkB,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,EAC3D,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,CAAA;AAAA,EACP,WAAA,EAAa,IAAA;AAAA,EACb,QAAA,EAAU,IAAA;AAAA,EAEV,KAAA,EAAO,CAAC,IAAA,KAAS;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ;AAIxB,IAAA,gBAAA,CAAiB,QAAA,GAAW,IAAA,EAAK;AACjC,IAAA,GAAA,CAAI,EAAE,MAAM,KAAA,EAAO,CAAA,EAAG,aAAa,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,EAC3D,CAAA;AAAA,EAEA,MAAM,MAAM;AACV,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,GAAA,EAAI;AAC5B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAGlC,MAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,QAAA,gBAAA,CAAiB,UAAS,CAAE,KAAA,CAAM,KAAK,KAAA,IAAS,EAAA,EAAI,KAAK,QAAQ,CAAA;AAAA,MACnE;AACA,MAAA,GAAA,EAAI,CAAE,KAAK,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,EAAE,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,CAAA;AAAA,EAC1B,CAAA;AAAA,EAEA,IAAA,EAAM,MAAM,GAAA,CAAI,CAAC,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,KAAA,GAAQ,CAAC,GAAE,CAAE,CAAA;AAAA,EAE5D,IAAA,EAAM,CAAC,KAAA,KAAU,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,IAAA,GAAO,EAAE,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,MAAM,MAAA,GAAS,CAAC,CAAA,EAAE,GAAI,CAAE,CAAA;AAAA,EAE3G,MAAM,CAAC,SAAA,GAAY,KAAA,KACjB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACV,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,CAAA,CAAE,IAAA,GAAO,EAAE,MAAA,EAAQ,EAAE,IAAA,CAAK,EAAA,EAAI,SAAA,EAAU,GAAI,CAAA,CAAE;AAAA,GAC7D,CAAE,CAAA;AAAA,EAEJ,SAAS,MAAM;AACb,IAAA,MAAM,CAAA,GAAI,KAAI,CAAE,QAAA;AAChB,IAAA,IAAI,CAAA,EAAG,GAAA,EAAI,CAAE,KAAA,CAAM,CAAC,CAAA;AAAA,EACtB;AACF,CAAA,CAAE;AAGK,SAAS,YAAY,KAAA,EAA2C;AACrE,EAAA,OAAO,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACtC;;;AClFO,SAAS,aAAa,IAAA,EAA0F;AACrH,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,UAAA,GAAa,kCAAkC,EAAE,OAAA,EAAS;AAEtG,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,EAAA,MAAM,IAAI,MAAA,CAAO,UAAA;AACjB,EAAA,MAAM,IAAI,MAAA,CAAO,WAAA;AACjB,EAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,GAAA;AACnB,EAAA,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA;AACpB,EAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,CAAA,6BAAA,EAAgC,CAAC,aAAa,CAAC,CAAA,kCAAA,CAAA;AACtE,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAA,CAAO,MAAA,EAAO;AACd,IAAA;AAAA,EACF;AACA,EAAA,GAAA,CAAI,KAAA,CAAM,KAAK,GAAG,CAAA;AAGlB,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,QAAA,CAAS,eAAe,CAAA;AACrD,EAAA,MAAM,QAAQ,GAAA,CAAI,gBAAA,CAAiB,WAAW,CAAA,IAAK,cAAc,IAAA,EAAK;AACtE,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,IAAA,EAAO,IAAI,KAAK,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS,CAAA;AAErF,EAAA,MAAM,CAAA,GAAI,MAAM,KAAA,IAAS,GAAA;AACzB,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAW,CAAA,KAAc,IAAI,IAAA,CAAK,MAAA,MAAY,CAAA,GAAI,CAAA,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,IAAA,EAAM,UAAA;AAK3B,EAAA,MAAM,EAAA,GAAK,IAAA,EAAM,MAAA,EAAQ,CAAA,IAAK,CAAA,GAAI,CAAA;AAClC,EAAA,MAAM,EAAA,GAAK,IAAA,EAAM,MAAA,EAAQ,CAAA,IAAK,CAAA,GAAI,IAAA;AAElC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,IAAK,MAAM;AAC5E,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO;AAAA,QACL,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAAA,QACX,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAAA,QAChB,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,CAAC,CAAA;AAAA,QACb,EAAA,EAAI,CAAC,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAAA;AAAA,QACf,GAAA,EAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,QACvB,EAAA,EAAI,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAAA,QACjB,IAAA,EAAM,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAAA,QACf,OAAO,MAAA,CAAQ,IAAA,CAAK,QAAO,GAAI,MAAA,CAAO,SAAU,CAAC,CAAA;AAAA,QACjD,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,CAAC,IAAA,CAAK,IAAI,CAAC,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AACvB,IAAA,OAAO;AAAA,MACL,CAAA,EAAG,EAAA;AAAA,MACH,CAAA,EAAG,EAAA;AAAA,MACH,EAAA,EAAI,KAAK,GAAA,CAAI,KAAK,IAAI,KAAA,GAAQ,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MAC1C,EAAA,EAAI,KAAK,GAAA,CAAI,KAAK,IAAI,KAAA,GAAQ,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,MACtC,GAAA,EAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACvB,EAAA,EAAI,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAAA,MACjB,IAAA,EAAM,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAAA,MACf,OAAO,MAAA,CAAQ,IAAA,CAAK,QAAO,GAAI,MAAA,CAAO,SAAU,CAAC,CAAA;AAAA,MACjD,IAAA,EAAM;AAAA,KACR;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAM,IAAA,GAAO,IAAA;AACb,EAAA,MAAM,QAAA,GAAW,GAAA;AACjB,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACxB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,CAAA,CAAE,OAAO,QAAA,EAAU;AACvB,MAAA,KAAA,EAAA;AACA,MAAA,CAAA,CAAE,IAAA,EAAA;AACF,MAAA,CAAA,CAAE,EAAA,IAAM,IAAA;AACR,MAAA,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,OAAA;AACrB,MAAA,CAAA,CAAE,KAAK,CAAA,CAAE,EAAA;AACT,MAAA,CAAA,CAAE,KAAK,CAAA,CAAE,EAAA;AACT,MAAA,CAAA,CAAE,OAAO,CAAA,CAAE,EAAA;AACX,MAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC9C,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,SAAA,CAAU,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,MAAA,CAAO,EAAE,GAAG,CAAA;AAChB,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,KAAA;AAClB,MAAA,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,GAAG,CAAA;AAC3D,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IACd;AACA,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,MAAA,MAAA,CAAO,MAAA,EAAO;AAAA,IAChB;AAAA,EACF,CAAA;AACA,EAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAClC;AC5FA,IAAM,cAAA,GAAiB;AAAA,EACrB,IAAA,EAAM,YAAA;AAAA,EACN,OAAA,EAAS,gCAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ,sBAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAMA,IAAM,GAAA,GAAM,CAAA;AAEZ,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,GAAA,GAAM,EAAA;AAIZ,SAAS,SAAS,EAAA,EAAmB;AACnC,EAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,EAAA,OAAO,EAAE,GAAA,EAAK,CAAA,CAAE,MAAM,GAAA,EAAK,IAAA,EAAM,EAAE,IAAA,GAAO,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,QAAQ,GAAA,GAAM,CAAA,EAAG,QAAQ,CAAA,CAAE,MAAA,GAAS,MAAM,CAAA,EAAE;AACtG;AAIA,IAAM,gBAAA,GAAmB,GAAA;AAMzB,SAAS,SAAS,IAAA,EAAmB;AACnC,EAAA,OAAO,EAAE,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,IAAA,EAAK;AAC9E;AAEA,SAAS,oBAAA,GAAgC;AACvC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,MAAA,CAAO,YAAY,OAAO,KAAA;AAChE,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC/D;AAYA,SAAS,gBAAA,GAA2B;AAClC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,CAAA;AAC5C,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,MAAM,KAAA,CAAM,IAAA,CAAK,SAAS,gBAAA,CAAiB,oBAAoB,CAAC,CAAA,EAAG;AAC5E,IAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,IAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACrC,IAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,CAAO,UAAA,GAAa,CAAA,EAAG;AACrC,IAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,CAAO,UAAA,GAAa,GAAA,EAAK;AACvC,IAAA,IAAI,CAAA,CAAE,MAAA,GAAS,MAAA,CAAO,WAAA,GAAc,GAAA,EAAK;AACzC,IAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,UAAA,GAAa,EAAE,IAAI,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AACzB;AAcO,SAAS,aAAA,CAAc,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAuB;AACvE,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AACzC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAKrD,EAAA,MAAM,QAAA,GAAiBC,cAAsB,IAAI,CAAA;AACjD,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC7B,IAAA,IAAI,QAAA,CAAS,OAAA,KAAY,WAAA,CAAY,MAAA,EAAQ;AAC7C,IAAA,QAAA,CAAS,UAAU,WAAA,CAAY,MAAA;AAG/B,IAAA,IAAI,gBAAA,CAAiB,QAAA,EAAS,CAAE,KAAA,CAAM,SAAS,CAAA,EAAG;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,GACX,EAAE,CAAA,EAAG,KAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,GAAG,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,GAAE,GAC/D,MAAA;AACJ,IAAA,YAAA,CAAa,EAAE,QAAQ,CAAA;AAAA,EAEzB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;AACjC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUA,gBAAsB,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,gBAAS,KAAK,CAAA;AAIlD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,gBAAuB,IAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,gBAAS,KAAK,CAAA;AAOlD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,gBAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAUA,gBAAS,CAAC,CAAA;AAKpD,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,gBAAA,EAAkB,CAAA;AACnD,IAAA,IAAA,EAAK;AACL,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,IAAA,EAAM,GAAG,CAAA;AAC7C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,IAAI,CAAA;AACtC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,cAAc,QAAQ,CAAA;AAC7B,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,IAAI,CAAA;AAAA,IAC3C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,EAAE,CAAC,CAAA;AAKb,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,UAAA,CAAW,KAAK,CAAA;AAEhB,IAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,gBAAA,EAAiB,GAAI,QAAQ,KAAK,CAAA;AAErD,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,iBAAA;AAC9B,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAM,EAAA,GAAK,SAAS,aAAA,CAAc,CAAA,aAAA,EAAgB,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA,EAAA,CAAI,CAAA;AAChF,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,EAAA,CAAG,cAAA,CAAe,EAAE,KAAA,EAAO,QAAA,EAAU,QAAQ,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAC5E,QAAA,MAAM,KAAA,GAAQ,SAAS,EAAE,CAAA;AACzB,QAAA,MAAM,OAAO,MAAM;AAGjB,UAAA,MAAM,EAAA,GAAK,SAAS,aAAA,CAAc,CAAA,aAAA,EAAgB,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA,EAAA,CAAI,CAAA;AAChF,UAAA,MAAM,OAAA,GAAU,EAAA,GAAK,QAAA,CAAS,EAAE,CAAA,GAAI,KAAA;AACpC,UAAA,OAAA,CAAQ,OAAO,CAAA;AACf,UAAA,SAAA,CAAU,QAAA,CAAS,OAAO,CAAC,CAAA;AAC3B,UAAA,UAAA,CAAW,IAAI,CAAA;AAAA,QACjB,CAAA;AACA,QAAA,IAAI,sBAAqB,EAAG;AAC1B,UAAA,IAAA,EAAK;AACL,UAAA;AAAA,QACF;AAKA,QAAA,SAAA,CAAU,CAACC,KAAAA,KAASA,KAAAA,IAAQ,EAAE,CAAA,EAAG,MAAA,CAAO,UAAA,GAAa,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,WAAA,GAAc,CAAA,EAAG,CAAA;AACnF,QAAA,GAAA,GAAM,sBAAsB,MAAM;AAChC,UAAA,GAAA,GAAM,sBAAsB,MAAM,SAAA,CAAU,QAAA,CAAS,KAAK,CAAC,CAAC,CAAA;AAAA,QAC9D,CAAC,CAAA;AACD,QAAA,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,gBAAA,GAAmB,EAAE,CAAA;AACtD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AACzB,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA;AAAA,MACF;AACA,MAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAAA,IAClC,CAAA;AACA,IAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAChC,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,MAAA,MAAA,CAAO,aAAa,MAAM,CAAA;AAAA,IAC5B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,SAAS,KAAA,EAAO,IAAA,EAAM,EAAE,CAAC,CAAA;AAW9C,EAAMD,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,IAAW,CAAC,OAAA,EAAS;AACrC,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA;AAC5C,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAM,EAAA,GAAK,SAAS,aAAA,CAAc,CAAA,aAAA,EAAgB,IAAI,MAAA,CAAO,MAAM,CAAC,CAAA,EAAA,CAAI,CAAA;AACxE,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAA,GAAS,CAAA;AACT,QAAA,MAAM,CAAA,GAAI,SAAS,EAAE,CAAA;AACrB,QAAA,OAAA,CAAQ,CAAC,CAAA;AACT,QAAA,SAAA,CAAU,QAAA,CAAS,CAAC,CAAC,CAAA;AACrB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,QAAA,EAAU;AAGf,MAAA,MAAA,IAAU,CAAA;AACV,MAAA,IAAI,MAAA,IAAU,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA;AAAA,IAC7B,CAAA;AACA,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAAA,IACpC,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAC/C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,OAAO,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,IAAA,EAAM,GAAG,CAAA;AAC7C,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,MAAA,CAAO,cAAc,QAAQ,CAAA;AAC7B,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAClD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,SAAS,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,IAAI,CAAC,CAAA;AAIlE,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,IAAA,EAAM;AACV,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAWT,EAAMA,iBAAU,MAAM;AAKpB,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAsC;AACpD,MAAA,MAAM,EAAA,GAAK,SAAS,aAAA,CAAc,CAAA,aAAA,EAAgB,IAAI,MAAA,CAAO,MAAM,CAAC,CAAA,EAAA,CAAI,CAAA;AACxE,MAAA,OAAO,CAAC,CAAC,EAAA,IAAM,gBAAgB,IAAA,IAAQ,EAAA,CAAG,SAAS,IAAI,CAAA;AAAA,IACzD,CAAA;AACA,IAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAChB,IAAA,YAAgB,WAAW,CAAC,CAAC,IAAA,CAAK,OAAA,CAAQ,mDAAmD,CAAA;AAC/F,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAa;AAC3B,MAAA,IAAI,CAAC,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA,EAAG;AACvB,MAAA,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,aAAc,IAAI,CAAA;AAAA,IACzC,CAAA;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,IAAI,MAAA,CAAO,EAAE,MAAM,CAAA,IAAK,SAAS,CAAA,CAAE,MAAM,CAAA,EAAG,UAAA,CAAW,IAAI,CAAA;AAAA,IAC7D,CAAA;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,IAAI,CAAC,OAAO,CAAA,CAAE,MAAM,KAAK,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AAI7C,MAAA,YAAA,CAAa,QAAA,GAAW,IAAA,EAAK;AAAA,IAC/B,CAAA;AACA,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,MAAA,CAAO,WAAW,MAAM;AACtB,QAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,aAAc,KAAK,CAAA;AAAA,MACvD,GAAG,CAAC,CAAA;AAAA,IACN,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AACrD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,OAAA,EAAS,IAAI,CAAA;AAClD,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAChD,IAAA,QAAA,CAAS,gBAAA,CAAiB,UAAA,EAAY,KAAA,EAAO,IAAI,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AACxD,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,OAAA,EAAS,IAAI,CAAA;AACrD,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AACnD,MAAA,QAAA,CAAS,mBAAA,CAAoB,UAAA,EAAY,KAAA,EAAO,IAAI,CAAA;AAAA,IACtD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAC,CAAA;AAE7B,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,IAAA,CAAK,KAAK,CAAA;AAClC,MAAA,IAAI,CAAA,CAAE,QAAQ,YAAA,IAAgB,CAAC,KAAK,KAAA,CAAM,KAAK,CAAA,EAAG,WAAA,EAAa,IAAA,EAAK;AACpE,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa,IAAA,EAAK;AAAA,IAClC,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,GAAG,CAAC,IAAA,EAAM,OAAO,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAElC,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,WAAW,OAAO,QAAA,KAAa,aAAa,OAAO,IAAA;AAEjE,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA;AACzB,EAAA,MAAM,MAAA,GAAS,UAAU,KAAA,GAAQ,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,WAAW,UAAU,CAAA;AAE9D,EAAA,MAAM,IAAA;AAAA;AAAA;AAAA,oBAGJV,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA,CAAG,oDAAA,EAAsD,SAAS,CAAA;AAAA,QAC7E,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAW;AAAA,QAC3B,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,OAAA;AAAA,QAEV,QAAA,EAAA;AAAA,UAAA,IAAA,IAAQ,CAAC,OAAA,mBACRA,IAAAA,CAAAO,UAAA,EAUE,QAAA,EAAA;AAAA,4BAAAV,IAAC,GAAA,EAAA,EAAI,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,KAAK,CAAA,EAAG,IAAA,EAAM,GAAG,KAAA,EAAO,MAAA,EAAQ,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAG,GAAE,EAAG,CAAA;AAAA,4BAC9FA,IAAC,GAAA,EAAA,EAAI,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,GAAG,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,EAAG,CAAA;AAAA,4BAC3GA,IAAC,GAAA,EAAA,EAAI,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,KAAK,IAAA,CAAK,GAAA,EAAK,MAAM,IAAA,CAAK,IAAA,GAAO,KAAK,KAAA,EAAO,KAAA,EAAO,GAAG,MAAA,EAAQ,IAAA,CAAK,QAAO,EAAG,CAAA;AAAA,4BAC3GA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAM,OAAA,EAAS,KAAA,EAAO,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,QAAQ,IAAA,EAAM,CAAA,EAAG,OAAO,MAAA,EAAQ,MAAA,EAAQ,GAAE,EAAG,CAAA;AAAA,4BAC/FA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAW,IAAA;AAAA,gBACX,SAAA,EAAU,wHAAA;AAAA,gBACV,KAAA,EAAO,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA;AAAO;AAAA;AAClF,WAAA,EACF,CAAA,mBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,GAAE,EAAG,CAAA;AAAA,UAG3B,MAAA,IAAU,CAAC,OAAA,IAAW,CAAC,2BACtBA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,EAAA;AAAA,gBACT,gBAAA;AAAA,gBACA,CAAC,OAAA,IAAW,uBAAA;AAAA,gBACZ,OAAA,IAAW,wBAAA;AAAA,gBACX,OAAA,IAAW,QAAQ,WAAA,IAAe;AAAA,eACpC;AAAA,cACA,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,YAAA,EAAe,OAAO,CAAC,CAAA,IAAA,EAAO,MAAA,CAAO,CAAC,CAAA,MAAA,CAAA,EAAS;AAAA,cAInE,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,qBAAA,EAAsB,QAAO,OAAA,EAAQ,WAAA,EAAY,OAAM,cAAA,EAAe,OAAA,EACzH,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mHAAA,EAAoH,CAAA,EAC9H;AAAA;AAAA,WACF;AAAA,UAAA,CAGA,OAAA,IAAW,OAAA,KAAY,CAAC,OAAA,oBAC1BG,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,mJAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,KAAA,EAAO,MAAA;AAAA,cAEP,QAAA,EAAA;AAAA,gCAAAH,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,MAAM,IAAA,CAAK,KAAK,CAAA;AAAA,oBACzB,cAAY,CAAA,CAAE,IAAA;AAAA,oBACd,SAAA,EAAU,oHAAA;AAAA,oBAEV,QAAA,kBAAAA,GAAAA,CAACe,CAAAA,EAAA,EAAE,WAAU,aAAA,EAAc;AAAA;AAAA,iBAC7B;AAAA,gCACAf,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yCAAA,EAA2C,kBAAQ,KAAA,EAAM,CAAA;AAAA,gBAAA,CACpE,OAAA,GAAU,CAAA,CAAE,QAAA,GAAW,OAAA,CAAQ,yBAC/BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0DAAA,EACV,QAAA,EAAA,OAAA,GAAU,CAAA,CAAE,QAAA,GAAW,QAAQ,IAAA,EAClC,CAAA;AAAA,gCAEFG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,kCAAAH,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDACb,QAAA,EAAA,CAAA,CAAE,MAAA,CAAO,QAAQ,WAAA,EAAa,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,WAAW,MAAA,CAAO,KAAK,CAAC,CAAA,EACpF,CAAA;AAAA,kCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,kBAKxB,QAAQ,WAAA,oBACPG,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uEAAA,EACd,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EACd,QAAA,EAAA;AAAA,sCAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4EAAA,EAA6E,CAAA;AAAA,sCAC7FA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EAA2D;AAAA,qBAAA,EAC7E,CAAA;AAAA,oBACC,CAAA,CAAE;AAAA,mBAAA,EACL,CAAA;AAAA,kBAED,KAAA,GAAQ,CAAA,IAAK,CAAC,OAAA,CAAQ,+BACrBA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,IAAA;AAAA,sBACT,SAAA,EAAU,qIAAA;AAAA,sBAET,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,mBACL;AAAA,kBAED,CAAC,OAAA,CAAQ,WAAA,oBACRA,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,IAAA;AAAA,sBACT,SAAA,EAAU,uJAAA;AAAA,sBAET,QAAA,EAAA,MAAA,GAAS,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE;AAAA;AAAA;AACvB,iBAAA,EAEJ;AAAA;AAAA;AAAA;AACF;AAAA;AAAA;AAEF,GAAA;AAGF,EAAA,OAAO,YAAA,CAAa,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AACzC;AAWA,SAAS,GAAA,CAAI,EAAE,KAAA,EAAO,IAAA,EAAK,EAAmD;AAC5E,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,8DAAA;AAAA;AAAA;AAAA;AAAA,QAIA,OAAO,qBAAA,GAAwB;AAAA,OACjC;AAAA,MACA,OAAO,EAAE,eAAA,EAAiB,OAAO,mBAAA,GAAsB,mBAAA,EAAqB,GAAG,KAAA;AAAM;AAAA,GACvF;AAEJ;AAMA,SAAS,WAAA,CAAY,IAAA,EAAmB,SAAA,EAA+B,UAAA,GAAa,CAAA,EAAwB;AAC1G,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,IAAA,EAAM;AAC1C,IAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,WAAW,uBAAA,EAAwB;AAAA,EACvE;AAGA,EAAA,MAAM,EAAA,GAAK,OAAO,UAAA,GAAa,UAAA;AAC/B,EAAA,MAAM,KAAK,MAAA,CAAO,WAAA;AAClB,EAAA,MAAM,SAAA,GAAY,EAAA,IAAM,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY,EAAA,IAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,CAAA;AAEzC,EAAA,IAAI,IAAA,GAAO,SAAA,IAAa,SAAA,KAAc,MAAA,GAAS,YAAY,SAAA,GAAY,GAAA,GAAM,QAAA,GAAW,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,KAAA,GAAQ,SAAA,GAAY,MAAM,OAAA,GAAU,MAAA;AAC7I,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,SAAA,GAAY,GAAA,EAAK,IAAA,GAAO,KAAA;AACjD,EAAA,IAAI,IAAA,KAAS,KAAA,IAAS,IAAA,CAAK,GAAA,GAAM,KAAK,IAAA,GAAO,QAAA;AAE7C,EAAA,MAAM,SAAS,CAAC,CAAA,KAAc,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,EAAA,EAAI,CAAC,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,YAAA,GAAe,EAAE,CAAC,CAAA;AAC5F,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAc,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,GAAG,CAAC,CAAA;AAE9E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,KAAK,IAAA,GAAO,IAAA,CAAK,QAAQ,CAAA,GAAI,YAAA,GAAe,CAAC,CAAA,EAAG,MAAA,EAAQ,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,IAAA,CAAK,GAAA,GAAM,GAAG,CAAA,EAAE;AAAA,IAClH,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,IAAA,GAAO,YAAA,GAAe,GAAG,CAAA,EAAG,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAE;AAAA,IACrF,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,GAAG,CAAA,EAAG,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAE;AAAA,IAC7E;AACE,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,KAAK,IAAA,GAAO,IAAA,CAAK,QAAQ,CAAA,GAAI,YAAA,GAAe,CAAC,CAAA,EAAG,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAE;AAAA;AAEtH;;;ACldO,SAAS,WAAW,MAAA,EAAyC;AAClE,EAAA,OAAO,EAAE,aAAa,MAAA,EAAO;AAC/B;AC/BO,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AACnD,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAE3C,EAAA,MAAM,MAAA,GAAS,CAAC,CAAC,KAAA,IAAS,MAAM,MAAA,GAAS,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,MAAA,GAAS,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,GAAI,MAAA;AAItD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUgB,MAAA,CAAA,QAAA,CAA+D,EAAE,CAAA;AACjG,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAM,MAA4D,EAAC;AACnE,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,MAAM,EAAA,GAAK,SAAS,aAAA,CAAc,CAAA,aAAA,EAAgB,IAAI,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA,EAAA,CAAI,CAAA;AAC1E,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,UAAA,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,GAAI,EAAE,KAAK,CAAA,CAAE,GAAA,EAAK,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,GAAI,IAAA;AAAA,QAClB;AAAA,MACF;AACA,MAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IACd,CAAA;AACA,IAAA,OAAA,EAAQ;AACR,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,OAAA,EAAS,GAAG,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAC/C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,OAAO,CAAA;AACzC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,cAAc,QAAQ,CAAA;AAC7B,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAClD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AAIlB,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,MAAA,GAAS,CAAC,MAAA,EAAgB,IAAA,KAAsC;AACpE,MAAA,MAAM,EAAA,GAAK,SAAS,aAAA,CAAc,CAAA,aAAA,EAAgB,IAAI,MAAA,CAAO,MAAM,CAAC,CAAA,EAAA,CAAI,CAAA;AACxE,MAAA,OAAO,CAAC,CAAC,EAAA,IAAM,gBAAgB,IAAA,IAAQ,EAAA,CAAG,SAAS,IAAI,CAAA;AAAA,IACzD,CAAA;AACA,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAa;AACxB,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AAC7B,QAAA,IAAI,MAAA,CAAO,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAA,EAAG;AAC9B,UAAA,QAAA,CAAS,EAAE,MAAM,CAAA;AACjB,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,GAAA,EAAK,IAAI,CAAA;AAClD,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,GAAA,EAAK,IAAI,CAAA;AAC5C,IAAA,QAAA,CAAS,gBAAA,CAAiB,QAAA,EAAU,GAAA,EAAK,IAAI,CAAA;AAC7C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,GAAA,EAAK,IAAI,CAAA;AACrD,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,GAAA,EAAK,IAAI,CAAA;AAC/C,MAAA,QAAA,CAAS,mBAAA,CAAoB,QAAA,EAAU,GAAA,EAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,QAAQ,CAAC,CAAA;AAIlC,EAAA,MAAM,WAAA,GAAoBA,cAAO,KAAK,CAAA;AACtC,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACtE,IAAA,IAAI,SAAA,IAAa,KAAK,QAAA,CAAS,SAAA,CAAU,MAAM,CAAA,IAAK,CAAC,YAAY,OAAA,EAAS;AACxE,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,YAAA,CAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAEjC,MAAA,MAAA,CAAO,UAAA,CAAW,MAAM,IAAA,EAAK,EAAG,IAAI,CAAA;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,IAAI,CAAC,CAAA;AAE9B,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,QAAA,KAAa,aAAa,OAAO,IAAA;AAEvD,EAAA,MAAM,IAAA,mBACJhB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA;AAC3B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA;AACrC,IAAA,MAAM,MAAA,GAAS,IAAA,EAAM,MAAA,KAAW,CAAA,CAAE,MAAA;AAClC,IAAA,uBACEA,IAAC,SAAA,EAAA,EAAyB,CAAA,EAAG,IAAI,CAAA,EAAG,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,EAAK,KAAK,GAAA,EAAK,IAAA,EAAM,KAAK,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,EAAM,MAAA,EAAA,EAAxF,EAAE,MAA8F,CAAA;AAAA,EAEpH,CAAC,CAAA,EACH,CAAA;AAEF,EAAA,OAAOiB,YAAAA,CAAa,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AACzC;AAEA,SAAS,SAAA,CAAU,EAAE,CAAA,EAAG,KAAA,EAAO,KAAK,IAAA,EAAM,IAAA,EAAM,MAAK,EAA0F;AAC7I,EAAA,uBACEd,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,gEAAA;AAAA,MAGV,KAAA,EAAO,EAAE,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,GAAM,EAAE,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,EAAE,CAAA,EAAE;AAAA,MAElE,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EACE,wHAAA,IACC,IAAA,GACG,oCAAA,GACA,OACE,sDAAA,GACA,yBAAA,CAAA;AAAA,YAGP,iCAAOA,GAAAA,CAACW,OAAA,EAAM,SAAA,EAAU,eAAc,CAAA,GAAK;AAAA;AAAA,SAC9C;AAAA,QACC,IAAA,IAAQ,CAAC,IAAA,oBACRX,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+FACb,QAAA,EAAA,KAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ","file":"index.js","sourcesContent":["import * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '../lib/cn'\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full',\n className\n )}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-muted',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import type { AnalyticsDateRange, AnalyticsCompare } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Date ranges and their comparison windows.\n//\n// All arithmetic is done on LOCAL calendar days and serialized as YYYY-MM-DD.\n// Using toISOString() here would silently shift every range by the UTC offset —\n// in America/Sao_Paulo \"today\" would start at 21:00 yesterday, which is exactly\n// how a dashboard ends up disagreeing with the orders list by one day.\n// ---------------------------------------------------------------------------\n\nexport type AnalyticsRangePreset =\n | 'today' | 'yesterday' | 'last_7_days' | 'last_30_days' | 'last_90_days'\n | 'this_month' | 'last_month' | 'this_quarter' | 'this_year' | 'custom'\n\nexport function toDayString(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nexport function parseDay(s: string): Date {\n // Noon avoids the DST edge where midnight does not exist on a spring-forward day.\n const [y, m, d] = s.split('-').map(Number)\n return new Date(y ?? 1970, (m ?? 1) - 1, d ?? 1, 12, 0, 0, 0)\n}\n\nfunction shiftDays(d: Date, days: number): Date {\n const next = new Date(d)\n next.setDate(next.getDate() + days)\n return next\n}\n\n/** Inclusive whole-day count, so a single-day range compares against one day. */\nexport function rangeLengthDays(range: AnalyticsDateRange): number {\n const from = parseDay(range.from)\n const to = parseDay(range.to)\n return Math.max(1, Math.round((to.getTime() - from.getTime()) / 86_400_000) + 1)\n}\n\nexport function resolveRangePreset(preset: AnalyticsRangePreset, today = new Date()): AnalyticsDateRange {\n const base = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 12)\n switch (preset) {\n case 'today':\n return { from: toDayString(base), to: toDayString(base) }\n case 'yesterday': {\n const y = shiftDays(base, -1)\n return { from: toDayString(y), to: toDayString(y) }\n }\n // \"Last 7 days\" includes today, so it spans today minus six — not minus\n // seven, which would be eight days of data under a seven-day label.\n case 'last_7_days':\n return { from: toDayString(shiftDays(base, -6)), to: toDayString(base) }\n case 'last_30_days':\n return { from: toDayString(shiftDays(base, -29)), to: toDayString(base) }\n case 'last_90_days':\n return { from: toDayString(shiftDays(base, -89)), to: toDayString(base) }\n case 'this_month':\n return {\n from: toDayString(new Date(base.getFullYear(), base.getMonth(), 1, 12)),\n to: toDayString(base),\n }\n case 'last_month': {\n const first = new Date(base.getFullYear(), base.getMonth() - 1, 1, 12)\n const last = new Date(base.getFullYear(), base.getMonth(), 0, 12)\n return { from: toDayString(first), to: toDayString(last) }\n }\n case 'this_quarter': {\n const q = Math.floor(base.getMonth() / 3)\n return {\n from: toDayString(new Date(base.getFullYear(), q * 3, 1, 12)),\n to: toDayString(base),\n }\n }\n case 'this_year':\n return { from: toDayString(new Date(base.getFullYear(), 0, 1, 12)), to: toDayString(base) }\n default:\n return { from: toDayString(shiftDays(base, -29)), to: toDayString(base) }\n }\n}\n\n/**\n * The window a range is compared against.\n *\n * 'previous_period' is the same NUMBER OF DAYS ending the day before `from`, so\n * a 7-day range compares against the 7 days before it — never an overlapping\n * window, which would double-count the boundary day in both halves.\n */\nexport function comparisonRange(\n range: AnalyticsDateRange,\n compare: AnalyticsCompare | undefined,\n): AnalyticsDateRange | null {\n if (!compare || compare === 'none') return null\n\n if (compare === 'previous_year') {\n const from = parseDay(range.from)\n const to = parseDay(range.to)\n from.setFullYear(from.getFullYear() - 1)\n to.setFullYear(to.getFullYear() - 1)\n return { from: toDayString(from), to: toDayString(to) }\n }\n\n const days = rangeLengthDays(range)\n const prevTo = shiftDays(parseDay(range.from), -1)\n const prevFrom = shiftDays(prevTo, -(days - 1))\n return { from: toDayString(prevFrom), to: toDayString(prevTo) }\n}\n\n/**\n * Bucket size that keeps a chart readable across the chosen range: hours for a\n * single day, days for a quarter, months for a year. A fixed 'day' grain turns\n * a 12-month range into 365 unreadable ticks.\n */\nexport function autoGrain(range: AnalyticsDateRange): 'hour' | 'day' | 'week' | 'month' {\n const days = rangeLengthDays(range)\n if (days <= 2) return 'hour'\n if (days <= 62) return 'day'\n if (days <= 180) return 'week'\n return 'month'\n}\n","import type {\n AnalyticsCardDef, AnalyticsMeasure, AnalyticsResult, AnalyticsRow,\n AnalyticsSummary, AnalyticsFormat, AnalyticsGrain,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Pure derivations shared by every analytics surface.\n//\n// These live apart from the components on purpose: the overview tile, the\n// report viewer and the CSV export must agree to the last decimal, and the only\n// way to guarantee that is for all three to call the same function rather than\n// each formatting \"close enough\" in its own JSX.\n// ---------------------------------------------------------------------------\n\n// `errorMessage` now lives in ../lib/error-message — every screen that catches\n// from Supabase needs it, not just the analytics cards. Re-exported here so the\n// analytics barrel keeps its shape.\nexport { errorMessage } from '../lib/error-message'\n\n/**\n * True when the failure is \"the analytics engine was never installed\" rather\n * than \"this query is wrong\" — a missing function, view or schema-cache entry.\n * Worth separating: one is a migration a developer has to run, the other is a\n * bug in a card, and telling a user \"unknown error\" for the first wastes an\n * afternoon.\n */\nexport function isEngineMissing(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false\n const e = err as Record<string, unknown>\n const code = typeof e.code === 'string' ? e.code : ''\n // 42883 undefined_function · 42P01 undefined_table · PGRST202 no such\n // function in the schema cache.\n if (['42883', '42P01', 'PGRST202'].includes(code)) return true\n const message = typeof e.message === 'string' ? e.message.toLowerCase() : ''\n // \"permission denied for function analytics_run\" names the engine too, but it\n // is installed — the caller is not allowed in. Sending that user to run a\n // migration is the wrong afternoon.\n if (message.includes('permission denied') || code === '42501') return false\n return message.includes('analytics_run') || message.includes('plg_shop_rep_')\n}\n\nexport function num(value: unknown): number {\n if (value == null) return 0\n const n = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(n) ? n : 0\n}\n\n/**\n * Resolve 'ratio' measures from the two measures they reference.\n *\n * Deliberately done HERE and not in SQL: a ratio aggregated per group and then\n * averaged is not the ratio of the totals. Average order value over a week is\n * sum(total)/count(orders) — not the mean of each day's average, which weights\n * a 1-order Sunday the same as a 400-order Friday.\n */\nexport function resolveRatios(\n summary: AnalyticsSummary | undefined,\n measures: AnalyticsMeasure[] = [],\n): AnalyticsSummary {\n const out: AnalyticsSummary = { ...(summary ?? {}) }\n for (const m of measures) {\n if (m.agg !== 'ratio' || !m.ratioOf) continue\n const [numeratorKey, denominatorKey] = m.ratioOf\n const denominator = num(out[denominatorKey])\n out[m.key] = denominator === 0 ? 0 : (num(out[numeratorKey]) / denominator) * (m.scale ?? 1)\n }\n return out\n}\n\n/** Apply ratio measures to every row of a grouped result, not just the rollup. */\nexport function resolveRowRatios(rows: AnalyticsRow[], measures: AnalyticsMeasure[] = []): AnalyticsRow[] {\n const ratios = measures.filter((m) => m.agg === 'ratio' && m.ratioOf)\n if (ratios.length === 0) return rows\n return rows.map((row) => ({ ...row, ...resolveRatios(row as AnalyticsSummary, ratios) }))\n}\n\n/**\n * Percentage change, or null when there is no honest answer.\n *\n * Growth from zero is not \"+100%\" and not \"+∞\" — it is undefined, and printing\n * a number there is how a dashboard claims a trend it cannot know. The card\n * shows a dash instead.\n */\nexport function deltaPercent(current: number, previous: number | undefined | null): number | null {\n if (previous == null || previous === 0) return null\n return ((current - previous) / Math.abs(previous)) * 100\n}\n\nexport function trendOf(current: number, previous: number | undefined | null): 'up' | 'down' | 'neutral' | undefined {\n if (previous == null) return undefined\n if (current > previous) return 'up'\n if (current < previous) return 'down'\n return 'neutral'\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsCurrency {\n code?: string\n locale?: string\n symbol?: string\n}\n\n/** Compact form for card headlines: 1.2K, 3.4M. */\nexport function formatCompact(value: number, locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { notation: 'compact', maximumFractionDigits: 1 }).format(value)\n}\n\nexport function formatAnalyticsValue(\n value: unknown,\n format: AnalyticsFormat | undefined,\n currency?: AnalyticsCurrency,\n opts?: { compact?: boolean },\n): string {\n const locale = currency?.locale ?? 'pt-BR'\n\n if (format === 'date') {\n if (!value) return '—'\n const d = new Date(String(value))\n return Number.isNaN(d.getTime()) ? String(value) : d.toLocaleDateString(locale)\n }\n if (format === 'text' || typeof value === 'string' && format == null) {\n return value == null || value === '' ? '—' : String(value)\n }\n\n const n = num(value)\n switch (format) {\n case 'currency':\n return opts?.compact && Math.abs(n) >= 10_000\n ? `${currency?.symbol ?? 'R$'}${formatCompact(n, locale)}`\n : new Intl.NumberFormat(locale, {\n style: 'currency', currency: currency?.code ?? 'BRL', maximumFractionDigits: 2,\n }).format(n)\n case 'percent':\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)}%`\n case 'duration':\n return formatDuration(n)\n default:\n return opts?.compact && Math.abs(n) >= 10_000\n ? formatCompact(n, locale)\n : new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)\n }\n}\n\n/** Durations are stored in HOURS (the read models emit hours_to_fulfillment). */\nexport function formatDuration(hours: number): string {\n if (!Number.isFinite(hours) || hours <= 0) return '0s'\n const totalMinutes = Math.round(hours * 60)\n if (totalMinutes < 1) return `${Math.round(hours * 3600)}s`\n if (totalMinutes < 60) return `${totalMinutes}min`\n const h = Math.floor(totalMinutes / 60)\n const m = totalMinutes % 60\n if (h < 24) return m ? `${h}h ${m}min` : `${h}h`\n const d = Math.floor(h / 24)\n return `${d}d ${h % 24}h`\n}\n\n/** Axis tick for a bucketed timestamp — short, locale-aware, grain-aware. */\n/**\n * Um balde de calendário não é um instante, e desenhá-lo no fuso de quem lê o\n * move de lugar.\n *\n * O motor produz os baldes com `date_trunc`, e eles chegam como meia-noite UTC\n * — `2026-09-01T00:00:00+00:00`. `toLocaleDateString` em São Paulo (UTC−3)\n * renderiza isso como 31 de agosto: a coluna de SETEMBRO aparecia rotulada\n * \"ago. de 26\". Número certo, coluna errada — pior do que um número faltando,\n * porque ninguém desconfia dele.\n *\n * `hour` é a exceção e continua local: ali o instante É o fato, e \"as vendas\n * das 19h\" quer dizer 19h de quem vende.\n */\nexport function formatBucket(value: unknown, grain: AnalyticsGrain | undefined, locale = 'pt-BR'): string {\n if (value == null) return '—'\n const d = new Date(String(value))\n if (Number.isNaN(d.getTime())) return String(value)\n const utc = { timeZone: 'UTC' } as const\n switch (grain) {\n case 'hour': return d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })\n case 'month': return d.toLocaleDateString(locale, { ...utc, month: 'short', year: '2-digit' })\n case 'quarter': return `Q${Math.floor(d.getUTCMonth() / 3) + 1} ${d.getUTCFullYear()}`\n case 'year': return String(d.getUTCFullYear())\n default: return d.toLocaleDateString(locale, { ...utc, day: '2-digit', month: 'short' })\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shaping — result rows into what each viz wants\n// ---------------------------------------------------------------------------\n\nexport interface BreakdownRow {\n label: string\n value: number\n /** Share of the largest row (0–1), for the inline bar width. */\n share: number\n formatted: string\n}\n\n/**\n * Rows for the \"sessions by device type\" style list. Bars are scaled to the\n * LARGEST row, not to the total: with one dominant category every other bar\n * collapses to an invisible sliver and the list stops communicating rank.\n */\nexport function toBreakdown(\n rows: AnalyticsRow[],\n categoryKey: string,\n measureKey: string,\n format: AnalyticsFormat | undefined,\n currency?: AnalyticsCurrency,\n limit?: number,\n): BreakdownRow[] {\n const mapped = rows.map((row) => ({\n label: row[categoryKey] == null || row[categoryKey] === '' ? '—' : String(row[categoryKey]),\n value: num(row[measureKey]),\n }))\n const max = mapped.reduce((m, r) => Math.max(m, Math.abs(r.value)), 0)\n const sliced = limit ? mapped.slice(0, limit) : mapped\n return sliced.map((r) => ({\n ...r,\n share: max === 0 ? 0 : Math.abs(r.value) / max,\n formatted: formatAnalyticsValue(r.value, format, currency),\n }))\n}\n\n/** The measures a card actually renders, in the order the viz asked for. */\nexport function vizMeasures(card: AnalyticsCardDef): AnalyticsMeasure[] {\n const all = card.query.measures ?? []\n const wanted = card.viz.measures\n if (!wanted?.length) return all\n return wanted\n .map((key) => all.find((m) => m.key === key))\n .filter((m): m is AnalyticsMeasure => Boolean(m))\n}\n\n/** The dimension a chart/breakdown puts on its category axis. */\nexport function vizCategory(card: AnalyticsCardDef) {\n // A hidden dimension carries an id, not a label — an axis of UUIDs is not a\n // category axis, so it can never be the default.\n const dims = (card.query.dimensions ?? []).filter((d) => !d.hidden)\n if (card.viz.categoryKey) return dims.find((d) => d.key === card.viz.categoryKey) ?? dims[0]\n return dims[0]\n}\n\n/**\n * Chart rows with the category axis pre-formatted.\n *\n * recharts renders whatever string it is handed, so bucketed timestamps must be\n * humanised BEFORE they reach it — otherwise the x-axis reads\n * \"2026-08-01T00:00:00+00:00\".\n */\nexport function toChartData(\n rows: AnalyticsRow[],\n categoryKey: string,\n grain: AnalyticsGrain | undefined,\n locale = 'pt-BR',\n): Array<Record<string, string | number>> {\n return rows.map((row) => {\n const out: Record<string, string | number> = {}\n for (const [k, v] of Object.entries(row)) {\n if (k === categoryKey) continue\n out[k] = typeof v === 'number' ? v : num(v)\n }\n out[categoryKey] = grain\n ? formatBucket(row[categoryKey], grain, locale)\n : (row[categoryKey] == null || row[categoryKey] === '' ? '—' : String(row[categoryKey]))\n return out\n })\n}\n\n/** Sparkline series for a KPI: the headline measure across the time buckets. */\nexport function toSpark(result: AnalyticsResult | null, measureKey: string): number[] | undefined {\n if (!result?.rows?.length || result.rows.length < 2) return undefined\n return result.rows.map((row) => num(row[measureKey]))\n}\n","import type {\n AnalyticsCardDef, AnalyticsProvider, AnalyticsQueryState, AnalyticsResult,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Two round-trip savings, wrapped around any provider.\n//\n// 1. DE-DUPLICATION. Identical queries issued in the same tick share one\n// request: the report viewer renders the chart and the table from the SAME\n// card, and an overview can hold two cards over one query.\n//\n// 2. BATCHING. Cards fetch themselves — the right ownership (a tile added to a\n// pack must not require editing a page-level query) and the reason an\n// overview of twenty-two tiles, most also asking for a comparison window,\n// issued FORTY-ONE requests, and issued them all again on every change of\n// date range. Everything queued within one frame leaves as a single\n// `runMany`; a provider that cannot answer several at once is unaffected and\n// still gets N calls.\n//\n// Deliberately transport-agnostic and outside React: what to coalesce is a\n// property of the queries, not of the render, and keeping it here is what lets\n// it be tested without mounting twenty-two cards.\n// ---------------------------------------------------------------------------\n\n/**\n * How long a queued query waits for its neighbours before going out.\n *\n * Long enough to catch every card of one render, short enough that nobody\n * perceives it — the request it joins takes two orders of magnitude longer.\n */\nexport const BATCH_WINDOW_MS = 16\n\ninterface Pending {\n card: AnalyticsCardDef\n state: AnalyticsQueryState\n resolve: (result: AnalyticsResult) => void\n reject: (error: unknown) => void\n}\n\nexport interface BatchingProviderOptions {\n /** Coalescing window. Exposed for tests; production uses the default. */\n windowMs?: number\n /**\n * Part of every de-duplication key. The surface bumps it on ↻ so a refresh\n * is not served the in-flight promise it is trying to replace.\n */\n refreshToken?: number\n}\n\nexport function createBatchingProvider(\n provider: AnalyticsProvider,\n options: BatchingProviderOptions = {},\n): AnalyticsProvider {\n const windowMs = options.windowMs ?? BATCH_WINDOW_MS\n const inflight = new Map<string, Promise<AnalyticsResult>>()\n let queue: Pending[] = []\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const flush = () => {\n timer = null\n const batch = queue\n queue = []\n if (batch.length === 0) return\n\n const individually = () => {\n for (const p of batch) provider.run(p.card, p.state).then(p.resolve, p.reject)\n }\n\n // One card is not a batch — routing it through runMany would only add a\n // layer between it and the identical single request.\n if (batch.length === 1 || !provider.runMany) { individually(); return }\n\n // Guarded because the feature check above can LIE. Providers reach here\n // through createSafeDataProvider, whose Proxy answers every property with a\n // function, so `runMany` is truthy even where the underlying provider has\n // none — and the throw lands synchronously, before any promise exists to\n // reject. Falling back keeps such a provider working at N requests instead\n // of blanking the surface.\n let batchCall: Promise<Array<AnalyticsResult | Error>>\n try {\n batchCall = provider.runMany(batch.map(({ card, state }) => ({ card, state })))\n } catch {\n individually()\n return\n }\n\n batchCall.then(\n (results) => batch.forEach((p, i) => {\n const result = results[i]\n // A provider that returns fewer answers than questions has mismatched\n // the two, and resolving with `undefined` would render a card of zeroes\n // that looks like real data.\n if (!result) p.reject(new Error('analytics: batch returned no result for this card'))\n else if (result instanceof Error) p.reject(result)\n else p.resolve(result)\n }),\n (error: unknown) => batch.forEach((p) => p.reject(error)),\n )\n }\n\n return {\n run(card, state) {\n const key = JSON.stringify([card.id, state, options.refreshToken ?? 0])\n const existing = inflight.get(key)\n if (existing) return existing\n\n const promise = new Promise<AnalyticsResult>((resolve, reject) => {\n queue.push({ card, state, resolve, reject })\n // A timeout and not a microtask: React does not guarantee that every\n // card's effect lands in one synchronous flush, and a microtask firing\n // between two of them splits one dashboard into several batches.\n if (timer == null) timer = setTimeout(flush, windowMs)\n }).finally(() => {\n // Held only for the duration of the request: this is de-duplication,\n // not caching. Keeping results would mean a stale dashboard after a\n // write, which is a worse bug than an extra fetch.\n inflight.delete(key)\n })\n\n inflight.set(key, promise)\n return promise\n },\n\n // Passed through so a caller that already has a batch of its own (an export\n // of every card, say) still reaches the provider's own batching.\n runMany: provider.runMany ? (requests) => provider.runMany!(requests) : undefined,\n }\n}\n","import * as React from 'react'\nimport type {\n AnalyticsCardDef, AnalyticsProvider, AnalyticsQueryState, AnalyticsResult,\n AnalyticsCompare, AnalyticsDateRange, AnalyticsGrain, AnalyticsRow,\n} from '@fayz-ai/core'\nimport { comparisonRange, resolveRangePreset, autoGrain, type AnalyticsRangePreset } from './range'\nimport { resolveRatios, resolveRowRatios, errorMessage, isEngineMissing, type AnalyticsCurrency } from './derive'\nimport { createBatchingProvider } from './batch'\n\n// ---------------------------------------------------------------------------\n// One page-level state for every card on the surface.\n//\n// The range, the comparison and the filters belong to the PAGE, not to each\n// tile: the control bar at the top of the overview must move all fourteen cards\n// at once, and a report opened from a card has to inherit what the user was\n// looking at. Card-local state would mean fourteen date pickers disagreeing.\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsContextValue {\n provider: AnalyticsProvider\n currency: AnalyticsCurrency\n state: AnalyticsQueryState\n preset: AnalyticsRangePreset\n setPreset: (preset: AnalyticsRangePreset) => void\n setDateRange: (range: AnalyticsDateRange) => void\n setCompare: (compare: AnalyticsCompare) => void\n setFilter: (key: string, value: unknown) => void\n setFilters: (filters: Record<string, unknown>) => void\n clearFilters: () => void\n setPage: (page: number) => void\n setPageSize: (pageSize: number) => void\n setSort: (sortBy: string, sortDir: 'asc' | 'desc') => void\n setSearch: (search: string) => void\n /** Bumped to force every mounted card to refetch (the ↻ button). */\n refreshToken: number\n refresh: () => void\n /** Open a card as a full-page report. Absent ⇒ cards render no open affordance. */\n onOpenCard?: (card: AnalyticsCardDef) => void\n /** \"Created by\" shown on cards a pack did not attribute individually. */\n createdBy?: string\n}\n\nconst AnalyticsContext = React.createContext<AnalyticsContextValue | null>(null)\n\nexport function useAnalyticsContext(): AnalyticsContextValue {\n const ctx = React.useContext(AnalyticsContext)\n if (!ctx) throw new Error('useAnalyticsContext must be used inside <AnalyticsContextProvider>')\n return ctx\n}\n\n/** Non-throwing variant for primitives that may render outside a surface. */\nexport function useAnalyticsContextOptional(): AnalyticsContextValue | null {\n return React.useContext(AnalyticsContext)\n}\n\nexport interface AnalyticsContextProviderProps {\n provider: AnalyticsProvider\n currency?: AnalyticsCurrency\n defaultPreset?: AnalyticsRangePreset\n defaultCompare?: AnalyticsCompare\n defaultPageSize?: number\n onOpenCard?: (card: AnalyticsCardDef) => void\n createdBy?: string\n children: React.ReactNode\n}\n\nexport function AnalyticsContextProvider({\n provider, currency, defaultPreset = 'last_30_days', defaultCompare = 'previous_period',\n defaultPageSize = 50, onOpenCard, createdBy, children,\n}: AnalyticsContextProviderProps) {\n const [preset, setPresetState] = React.useState<AnalyticsRangePreset>(defaultPreset)\n const [refreshToken, setRefreshToken] = React.useState(0)\n const [state, setState] = React.useState<AnalyticsQueryState>(() => ({\n dateRange: resolveRangePreset(defaultPreset),\n compare: defaultCompare,\n filters: {},\n page: 1,\n pageSize: defaultPageSize,\n }))\n\n const setPreset = React.useCallback((next: AnalyticsRangePreset) => {\n setPresetState(next)\n if (next !== 'custom') {\n setState((s) => ({ ...s, dateRange: resolveRangePreset(next), page: 1 }))\n }\n }, [])\n\n const setDateRange = React.useCallback((dateRange: AnalyticsDateRange) => {\n setPresetState('custom')\n setState((s) => ({ ...s, dateRange, page: 1 }))\n }, [])\n\n const setCompare = React.useCallback((compare: AnalyticsCompare) => {\n setState((s) => ({ ...s, compare }))\n }, [])\n\n const setFilter = React.useCallback((key: string, value: unknown) => {\n setState((s) => {\n const filters = { ...s.filters }\n // An empty value REMOVES the filter rather than sending \"\" downstream,\n // which a provider would otherwise translate into `col = ''`.\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) delete filters[key]\n else filters[key] = value\n return { ...s, filters, page: 1 }\n })\n }, [])\n\n const setFilters = React.useCallback((filters: Record<string, unknown>) => {\n setState((s) => ({ ...s, filters, page: 1 }))\n }, [])\n\n const clearFilters = React.useCallback(() => {\n setState((s) => ({ ...s, filters: {}, page: 1 }))\n }, [])\n\n const setPage = React.useCallback((page: number) => {\n setState((s) => ({ ...s, page: Math.max(1, page) }))\n }, [])\n\n const setPageSize = React.useCallback((pageSize: number) => {\n // Changing page size while on page 7 lands you somewhere arbitrary, so the\n // pager resets — the user asked for \"show more\", not \"jump elsewhere\".\n setState((s) => ({ ...s, pageSize, page: 1 }))\n }, [])\n\n const setSort = React.useCallback((sortBy: string, sortDir: 'asc' | 'desc') => {\n setState((s) => ({ ...s, sortBy, sortDir, page: 1 }))\n }, [])\n\n const setSearch = React.useCallback((search: string) => {\n setState((s) => ({ ...s, search, page: 1 }))\n }, [])\n\n const refresh = React.useCallback(() => setRefreshToken((t) => t + 1), [])\n\n // Coalescing lives in batch.ts, not here: what to merge is a property of the\n // queries, not of the render.\n const batched = React.useMemo<AnalyticsProvider>(\n () => createBatchingProvider(provider, { refreshToken }),\n [provider, refreshToken],\n )\n\n const value = React.useMemo<AnalyticsContextValue>(() => ({\n provider: batched,\n currency: currency ?? { code: 'BRL', locale: 'pt-BR', symbol: 'R$' },\n state, preset, setPreset, setDateRange, setCompare, setFilter, setFilters, clearFilters,\n setPage, setPageSize, setSort, setSearch,\n refreshToken, refresh, onOpenCard, createdBy,\n }), [batched, currency, state, preset, setPreset, setDateRange, setCompare, setFilter,\n setFilters, clearFilters, setPage, setPageSize, setSort, setSearch,\n refreshToken, refresh, onOpenCard, createdBy])\n\n return <AnalyticsContext.Provider value={value}>{children}</AnalyticsContext.Provider>\n}\n\n// ---------------------------------------------------------------------------\n// Per-card fetching\n// ---------------------------------------------------------------------------\n\nexport interface UseAnalyticsCardResult {\n result: AnalyticsResult | null\n /** Rollup with ratio measures resolved. Empty object until loaded. */\n summary: Record<string, number>\n /** Same for the comparison window, or null when not comparing. */\n previousSummary: Record<string, number> | null\n loading: boolean\n error: string | null\n /** The failure is a missing migration, not a bad card. */\n engineMissing: boolean\n refetch: () => void\n}\n\n/** Resolve 'auto' grains against the active range before the query is built. */\nfunction withResolvedGrain(card: AnalyticsCardDef, range: AnalyticsDateRange): AnalyticsCardDef {\n const dims = card.query.dimensions\n if (!dims?.some((d) => d.grain === 'auto')) return card\n const grain: AnalyticsGrain = autoGrain(range)\n return {\n ...card,\n query: {\n ...card.query,\n dimensions: dims.map((d) => (d.grain === 'auto' ? { ...d, grain } : d)),\n },\n }\n}\n\nexport function useAnalyticsCard(\n card: AnalyticsCardDef,\n options?: { stateOverride?: Partial<AnalyticsQueryState>; enabled?: boolean },\n): UseAnalyticsCardResult {\n const { provider, state, refreshToken } = useAnalyticsContext()\n const [result, setResult] = React.useState<AnalyticsResult | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [engineMissing, setEngineMissing] = React.useState(false)\n\n const enabled = (options?.enabled ?? true) && card.available !== false\n const merged = React.useMemo<AnalyticsQueryState>(\n () => ({ ...state, ...options?.stateOverride }),\n [state, options?.stateOverride],\n )\n const resolved = React.useMemo(() => withResolvedGrain(card, merged.dateRange), [card, merged.dateRange])\n\n // Serialized query identity — the effect must rerun when the QUERY changes,\n // not when React hands us a new object with identical contents.\n const key = React.useMemo(\n () => JSON.stringify([resolved.id, merged, refreshToken]),\n [resolved.id, merged, refreshToken],\n )\n\n React.useEffect(() => {\n if (!enabled) { setResult(null); return }\n let cancelled = false\n setLoading(true)\n setError(null)\n setEngineMissing(false)\n\n const comparison = resolved.compare ? comparisonRange(merged.dateRange, merged.compare) : null\n\n Promise.all([\n provider.run(resolved, merged),\n comparison\n ? provider.run(resolved, { ...merged, dateRange: comparison }).catch(() => null)\n : Promise.resolve(null),\n ])\n .then(([current, previous]) => {\n if (cancelled) return\n setResult({\n ...current,\n rows: resolveRowRatios(current.rows, resolved.query.measures),\n previous: previous\n ? { rows: previous.rows, summary: previous.summary }\n : undefined,\n })\n })\n .catch((err: unknown) => {\n if (cancelled) return\n setResult(null)\n setError(errorMessage(err))\n setEngineMissing(isEngineMissing(err))\n })\n .finally(() => { if (!cancelled) setLoading(false) })\n\n // The comparison fetch is allowed to fail on its own (.catch above): a\n // missing previous window costs a trend chip, it must not blank the card.\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, enabled, provider])\n\n const refetch = React.useCallback(() => {\n setResult(null)\n setLoading(true)\n }, [])\n\n const summary = React.useMemo(\n () => resolveRatios(result?.summary, resolved.query.measures),\n [result?.summary, resolved.query.measures],\n )\n const previousSummary = React.useMemo(\n () => (result?.previous ? resolveRatios(result.previous.summary, resolved.query.measures) : null),\n [result?.previous, resolved.query.measures],\n )\n\n return { result, summary, previousSummary, loading, error, engineMissing, refetch }\n}\n\n/**\n * Fetch EVERY row the card's current query returns, not just the page on\n * screen — what an export needs.\n *\n * The viewer paginates at 50, and a spreadsheet holding 50 of 4,000 leads is\n * worse than no spreadsheet: nothing on the file says it is a fragment, so it\n * gets mailed to an accountant as if it were the whole month. Pages through the\n * same provider with the same filters, the same range and the same sort, so the\n * file and the screen answer the same question.\n *\n * `compare` is dropped: the previous window costs a round trip and never lands\n * in the file.\n */\nexport function useAnalyticsCardRows(\n card: AnalyticsCardDef,\n): (limit?: number) => Promise<AnalyticsRow[]> {\n const { provider, state } = useAnalyticsContext()\n return React.useCallback(async (limit = EXPORT_ROW_CAP) => {\n const resolved = withResolvedGrain(card, state.dateRange)\n const rows: AnalyticsRow[] = []\n for (let page = 1; rows.length < limit; page++) {\n const res = await provider.run(resolved, {\n ...state, compare: 'none', page, pageSize: EXPORT_PAGE_SIZE,\n })\n rows.push(...resolveRowRatios(res.rows, resolved.query.measures))\n if (res.rows.length < EXPORT_PAGE_SIZE || rows.length >= (res.total ?? rows.length)) break\n }\n return rows.slice(0, limit)\n }, [provider, state, card])\n}\n\n// ---------------------------------------------------------------------------\n// Um demonstrativo não tem página.\n//\n// `useAnalyticsCard` devolve a PÁGINA que a tabela está mostrando — 50 linhas.\n// Para uma grade isso é o certo; para um demonstrativo é a diferença entre um\n// total e um pedaço de total, e o pedaço não se anuncia como pedaço. Foi o que\n// aconteceu no DRE: com `ORDER BY statement_code`, as primeiras 50 linhas\n// entregavam o ramo 10 em diante e deixavam de fora o ramo 1 inteiro e todas as\n// linhas sem classificação — a árvore começava no 2 e o resultado fechava com\n// um número que não era o resultado.\n//\n// Toda soma vertical tem a mesma exigência: ou se lê o conjunto, ou não se\n// soma.\n// ---------------------------------------------------------------------------\n\n/** Teto de um demonstrativo. Conta contábil × mês de um exercício não passa\n * disto; se passar, o relatório está agrupando pela coisa errada. */\nexport const STATEMENT_ROW_CAP = 5000\n\nexport function useAnalyticsAllRows(\n card: AnalyticsCardDef,\n enabled = true,\n): { rows: AnalyticsRow[]; loading: boolean; error: string | null } {\n const fetchRows = useAnalyticsCardRows(card)\n const { state } = useAnalyticsContext()\n const [rows, setRows] = React.useState<AnalyticsRow[]>([])\n const [loading, setLoading] = React.useState(enabled)\n const [error, setError] = React.useState<string | null>(null)\n\n // A chave é o que MUDA a resposta, e não a identidade do objeto de estado:\n // `state` é recriado a cada render do provider, e depender dele faria este\n // efeito disparar para sempre.\n const key = JSON.stringify([\n card.id, state.dateRange, state.filters, state.search, state.sortBy, state.sortDir,\n ])\n\n React.useEffect(() => {\n if (!enabled) { setLoading(false); return }\n let live = true\n setLoading(true)\n setError(null)\n fetchRows(STATEMENT_ROW_CAP)\n .then((r) => { if (live) { setRows(r); setLoading(false) } })\n .catch((e) => { if (live) { setError(errorMessage(e)); setLoading(false) } })\n return () => { live = false }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, enabled])\n\n return { rows, loading, error }\n}\n\n/** One round trip per thousand rows — big enough that most exports are one\n * call, small enough that a mistyped filter does not pull a whole table. */\nconst EXPORT_PAGE_SIZE = 1000\n/** Hard stop. Past this a spreadsheet is the wrong tool and the browser says so\n * by freezing; the file is truncated rather than the tab lost. */\nconst EXPORT_ROW_CAP = 20000\n","import type {\n AnalyticsRow, AnalyticsStatementDef, AnalyticsStatementLine, AnalyticsStatementSection,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// De linhas planas para um demonstrativo.\n//\n// O motor devolve uma linha por (conta × período). Um demonstrativo precisa de\n// três coisas que essa lista não tem:\n//\n// 1. a ÁRVORE — '2.1.10' mora dentro de '2.1', que mora dentro de '2';\n// 2. as COLUNAS — um período por coluna, na ordem do calendário;\n// 3. as linhas que NÃO são contas — RECEITA BRUTA, = RESULTADO.\n//\n// Tudo aqui é função pura sobre as linhas. Nada de React, nada de fetch: é o\n// que permite conferir a aritmética de um demonstrativo sem montar uma tela.\n// ---------------------------------------------------------------------------\n\nexport interface StatementNode {\n key: string\n code: string\n label: string\n depth: number\n /** Um nó que o dado não trouxe, criado para dar pai ao filho que veio. */\n synthetic: boolean\n /** Só deste nó. */\n own: Record<string, number>\n /** Deste nó e de toda a descendência — é o que a tela mostra. */\n rollup: Record<string, number>\n total: number\n children: StatementNode[]\n}\n\nexport interface StatementBlock {\n kind: 'section'\n section: string\n label: string\n nodes: StatementNode[]\n totals: Record<string, number>\n total: number\n}\n\nexport interface StatementTotalLine {\n kind: 'total'\n label: string\n emphasis?: 'strong' | 'rule'\n totals: Record<string, number>\n total: number\n}\n\nexport type StatementLine = StatementBlock | StatementTotalLine\n\nexport interface Statement {\n /** As colunas, na ordem do calendário. */\n periods: string[]\n lines: StatementLine[]\n}\n\n// ---------------------------------------------------------------------------\n// Ordenação\n// ---------------------------------------------------------------------------\n\n/**\n * Ordena '14.2' ANTES de '14.10'.\n *\n * Comparar código de conta como texto é o erro clássico e é visível na tela do\n * V1, que lista 14.1 · 14.10 · 14.11 · 14.2 · 14.3 — a décima conta entre a\n * primeira e a segunda. Aqui cada segmento é comparado como NÚMERO quando os\n * dois lados são numéricos, e como texto quando não são (um plano que use\n * '1.A' continua ordenável).\n *\n * É uma divergência deliberada da tela do V1, da mesma família das três que a\n * migration 034 já não reproduz: o V1 pretende ordem numérica e o `sort` dele\n * entrega ordem alfabética.\n */\nexport function compareCodes(a: string, b: string): number {\n const pa = a.split('.')\n const pb = b.split('.')\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n const sa = pa[i]\n const sb = pb[i]\n if (sa === undefined) return -1\n if (sb === undefined) return 1\n const na = Number(sa)\n const nb = Number(sb)\n if (Number.isFinite(na) && Number.isFinite(nb)) {\n if (na !== nb) return na - nb\n } else if (sa !== sb) {\n return sa < sb ? -1 : 1\n }\n }\n return 0\n}\n\n/** O código do pai: '2.1.10' → '2.1'. Raiz devolve ''. */\nexport function parentCode(code: string): string {\n const i = code.lastIndexOf('.')\n return i < 0 ? '' : code.slice(0, i)\n}\n\n// ---------------------------------------------------------------------------\n// Montagem\n// ---------------------------------------------------------------------------\n\nconst UNCLASSIFIED = '\\u0000sem-classificacao'\n\nfunction emptyNode(code: string, label: string, synthetic: boolean): StatementNode {\n return {\n key: code || label,\n code,\n label,\n depth: code ? code.split('.').length - 1 : 0,\n synthetic,\n own: {},\n rollup: {},\n total: 0,\n children: [],\n }\n}\n\nfunction add(bag: Record<string, number>, period: string, value: number) {\n bag[period] = (bag[period] ?? 0) + value\n}\n\n/**\n * Soma a descendência para cima e ordena os irmãos.\n *\n * O rollup existe porque uma conta sintética do plano ('2.1 INSUMOS') quase\n * nunca tem lançamento próprio: o valor dela É a soma dos filhos. Mostrar o\n * `own` nessas linhas deixaria a árvore inteira zerada acima do último nível.\n */\nfunction rollup(node: StatementNode, periods: string[]): void {\n node.children.sort((a, b) => compareCodes(a.code, b.code))\n node.rollup = { ...node.own }\n for (const child of node.children) {\n rollup(child, periods)\n for (const p of periods) {\n if (child.rollup[p]) add(node.rollup, p, child.rollup[p])\n }\n }\n node.total = periods.reduce((acc, p) => acc + (node.rollup[p] ?? 0), 0)\n}\n\nexport function buildStatement(\n rows: AnalyticsRow[],\n def: AnalyticsStatementDef,\n): Statement {\n const periodSet = new Set<string>()\n // section → code → node\n const bySection = new Map<string, Map<string, StatementNode>>()\n for (const s of def.sections) bySection.set(s.value, new Map())\n\n for (const row of rows) {\n const section = String(row[def.sectionKey] ?? '')\n const bucket = bySection.get(section)\n if (!bucket) continue // seção não declarada: fora do demonstrativo\n\n // Linha SEM período é ESTRUTURA, não fato: \"esta conta existe e não teve\n // movimento\". Ela cria o nó na árvore e não cria coluna — um zero numa\n // coluna afirmaria que houve movimento de zero naquele mês, que é outra\n // coisa. É o que faz a conta zerada aparecer com travessão, como no V1.\n const period = String(row[def.periodKey] ?? '')\n const estrutura = !period\n if (!estrutura) periodSet.add(period)\n\n const value = Number(row[def.valueKey] ?? 0)\n if (!Number.isFinite(value)) continue\n\n const code = String(row[def.codeKey] ?? '').trim()\n const label = String(row[def.labelKey] ?? '').trim()\n\n if (estrutura) {\n // Sem conta e sem mês não sobra nada para dizer.\n if (!code) continue\n let node = bucket.get(code)\n if (!node) {\n node = emptyNode(code, label || code, false)\n bucket.set(code, node)\n } else {\n // O plano é a fonte do NOME. O movimento traz o nome que o item\n // carregava; a conta traz o dela, e é a dela que vale.\n node.synthetic = false\n if (label) node.label = label\n }\n continue\n }\n\n if (!code) {\n // A linha sem conta é uma linha de verdade, não uma ausência. Ela domina\n // a tela do V1 (\"sem classificação\") e escondê-la faria a soma da árvore\n // não fechar com o cabeçalho — que é o jeito mais rápido de um\n // demonstrativo perder a confiança de quem o lê.\n const spec = def.sections.find((sec: AnalyticsStatementSection) => sec.value === section)\n if (!spec?.unclassifiedLabel) continue\n let node = bucket.get(UNCLASSIFIED)\n if (!node) {\n node = emptyNode('', spec.unclassifiedLabel, false)\n node.key = `${section}${UNCLASSIFIED}`\n bucket.set(UNCLASSIFIED, node)\n }\n add(node.own, period, value)\n continue\n }\n\n let node = bucket.get(code)\n if (!node) {\n node = emptyNode(code, label || code, false)\n bucket.set(code, node)\n } else if (node.synthetic) {\n node.synthetic = false\n if (label) node.label = label\n }\n add(node.own, period, value)\n }\n\n const periods = [...periodSet].sort()\n\n const lines: StatementLine[] = []\n const sectionTotals = new Map<string, { totals: Record<string, number>; total: number }>()\n\n for (const spec of def.sections) {\n const bucket = bySection.get(spec.value)!\n\n // Os ancestrais que o dado não trouxe. Uma conta '2.1.3' com movimento e um\n // '2.1' sem nenhum ainda precisa do '2.1' na tela — sem ele o filho fica\n // órfão na raiz e a árvore mente sobre a estrutura do plano.\n for (const code of [...bucket.keys()]) {\n if (code === UNCLASSIFIED) continue\n let parent = parentCode(code)\n while (parent && !bucket.has(parent)) {\n bucket.set(parent, emptyNode(parent, parent, true))\n parent = parentCode(parent)\n }\n }\n\n const roots: StatementNode[] = []\n for (const [code, node] of bucket) {\n if (code === UNCLASSIFIED) continue\n const parent = parentCode(code)\n if (parent && bucket.has(parent)) bucket.get(parent)!.children.push(node)\n else roots.push(node)\n }\n\n const totals: Record<string, number> = {}\n for (const node of roots) {\n rollup(node, periods)\n for (const p of periods) if (node.rollup[p]) add(totals, p, node.rollup[p])\n }\n\n // A linha sem classificação fica FORA da árvore e DENTRO do total: ela não\n // tem pai e não é filha de ninguém, mas o dinheiro dela é da seção.\n const orphan = bucket.get(UNCLASSIFIED)\n if (orphan) {\n rollup(orphan, periods)\n for (const p of periods) if (orphan.rollup[p]) add(totals, p, orphan.rollup[p])\n }\n\n roots.sort((a, b) => compareCodes(a.code, b.code))\n const nodes = orphan ? [...roots, orphan] : roots\n const total = periods.reduce((acc, p) => acc + (totals[p] ?? 0), 0)\n sectionTotals.set(spec.value, { totals, total })\n\n lines.push({ kind: 'section', section: spec.value, label: spec.label, nodes, totals, total })\n }\n\n // Agora o demonstrativo na ordem declarada, com os totais calculados a partir\n // das seções — nunca a partir das linhas, que é o que faria um subtotal\n // divergir da árvore que está logo acima dele.\n const out: StatementLine[] = []\n for (const line of def.lines as AnalyticsStatementLine[]) {\n if (line.kind === 'section') {\n const block = lines.find((l) => l.kind === 'section' && l.section === line.section)\n if (block) out.push(block)\n continue\n }\n const totals: Record<string, number> = {}\n for (const [section, sign] of Object.entries(line.of) as [string, 1 | -1][]) {\n const s = sectionTotals.get(section)\n if (!s) continue\n for (const p of periods) if (s.totals[p]) add(totals, p, s.totals[p] * sign)\n }\n out.push({\n kind: 'total',\n label: line.label,\n emphasis: line.emphasis,\n totals,\n total: periods.reduce((acc, p) => acc + (totals[p] ?? 0), 0),\n })\n }\n\n return { periods, lines: out }\n}\n\n/** Todo nó da árvore, achatado na ordem em que a tela os desenha. */\nexport function flattenNodes(\n nodes: StatementNode[],\n open: (node: StatementNode) => boolean,\n out: StatementNode[] = [],\n): StatementNode[] {\n for (const node of nodes) {\n out.push(node)\n if (node.children.length && open(node)) flattenNodes(node.children, open, out)\n }\n return out\n}\n\n/** As chaves abertas por padrão: tudo até `depth`. */\nexport function defaultOpenKeys(lines: StatementLine[], depth: number): Set<string> {\n const open = new Set<string>()\n const walk = (nodes: StatementNode[]) => {\n for (const n of nodes) {\n if (n.depth < depth) open.add(n.key)\n walk(n.children)\n }\n }\n for (const line of lines) if (line.kind === 'section') walk(line.nodes)\n return open\n}\n","import React from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport type { AnalyticsRow, AnalyticsStatementDef } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { Skeleton } from '../primitives/skeleton'\nimport { formatAnalyticsValue, type AnalyticsCurrency } from './derive'\nimport {\n buildStatement, defaultOpenKeys, flattenNodes,\n type StatementNode, type Statement,\n} from './statement'\n\n// ---------------------------------------------------------------------------\n// Um demonstrativo, e não uma tabela com recuo.\n//\n// O que distingue esta tela de um `DataTable` com uma coluna a mais:\n//\n// · a primeira coluna é ÁRVORE e não texto — abre, fecha, e o valor de um pai\n// é a soma dos filhos, não um lançamento dele;\n// · as colunas são PERÍODOS, descobertos no dado, não declarados no card;\n// · entre os blocos existem linhas que não são contas — RECEITA BRUTA,\n// = RESULTADO — calculadas a partir dos blocos, com a aritmética declarada\n// no card e executada aqui.\n//\n// Nenhuma dessas três coisas é específica de DRE. Balancete, fluxo de caixa e\n// balanço patrimonial têm a mesma forma; o que muda entre eles é o objeto de\n// configuração, não a tela.\n// ---------------------------------------------------------------------------\n\nexport interface StatementTableProps {\n rows: AnalyticsRow[]\n def: AnalyticsStatementDef\n currency: AnalyticsCurrency\n /** Rótulo de cada coluna. Recebe o valor cru do período. */\n formatPeriod?: (period: string) => string\n totalLabel?: string\n accountLabel?: string\n emptyMessage?: string\n className?: string\n /** Compacto: a versão que cabe num card da grade. */\n dense?: boolean\n /** Desenha o esqueleto no lugar do demonstrativo. */\n loading?: boolean\n /** Quantas linhas o esqueleto finge ter. */\n skeletonRows?: number\n}\n\nconst EMPTY = '—'\n\n/**\n * Zero não é vazio, e a diferença importa numa demonstração.\n *\n * Uma conta que existe no plano e não teve movimento no mês mostra travessão;\n * uma que teve movimento de exatamente zero mostra `R$ 0,00`. Imprimir zero nas\n * duas encheria a tela de números que não aconteceram — é por isso que a tela\n * do V1 também usa travessão.\n */\nfunction cell(\n value: number | undefined,\n currency: AnalyticsCurrency,\n): string {\n if (value === undefined) return EMPTY\n return formatAnalyticsValue(value, 'currency', currency)\n}\n\nfunction Row({\n label, code, depth, values, total, periods, currency,\n expandable, open, onToggle, tone, synthetic,\n}: {\n label: string\n code?: string\n depth: number\n values: Record<string, number>\n total: number\n periods: string[]\n currency: AnalyticsCurrency\n expandable?: boolean\n open?: boolean\n onToggle?: () => void\n tone?: 'strong' | 'rule' | 'section' | 'muted'\n synthetic?: boolean\n}) {\n return (\n <tr\n // A linha inteira abre e fecha. A setinha continua lá porque é o que diz\n // que a linha É clicável — mas exigir a pontaria dela faz o alvo ter\n // 14 pixels numa linha que tem a largura da tela.\n onClick={expandable ? onToggle : undefined}\n className={cn(\n 'border-b border-border/50 last:border-b-0',\n tone === 'strong' && 'bg-muted/60 font-semibold',\n tone === 'rule' && 'border-t-2 border-foreground/70 bg-muted/40 font-semibold',\n tone === 'section' && 'bg-muted/30 font-medium',\n !tone && 'hover:bg-muted/30',\n expandable && 'cursor-pointer select-none',\n )}\n >\n <th\n scope=\"row\"\n // `w-full` aqui é o que encolhe as colunas de valor: a coluna de contas\n // absorve toda a folga e as de número ficam do tamanho do número.\n className=\"sticky left-0 z-10 w-full bg-inherit px-3 py-2 text-left font-inherit\"\n style={{ paddingLeft: `${12 + depth * 16}px` }}\n >\n <span className=\"flex items-center gap-1.5\">\n {expandable ? (\n <button\n type=\"button\"\n // O clique já subiu pela linha; sem isto ele contaria duas vezes\n // e a linha abriria e fecharia no mesmo gesto.\n tabIndex={-1}\n onClick={(e) => { e.stopPropagation(); onToggle?.() }}\n aria-expanded={open}\n className=\"-ml-1 rounded p-0.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <ChevronRight\n className={cn('h-3.5 w-3.5 transition-transform', open && 'rotate-90')}\n aria-hidden\n />\n <span className=\"sr-only\">{open ? 'Recolher' : 'Expandir'} {label}</span>\n </button>\n ) : (\n <span className=\"inline-block w-[18px]\" aria-hidden />\n )}\n {code ? (\n <span className=\"shrink-0 font-mono text-[11px] tabular-nums text-muted-foreground\">\n {code}\n </span>\n ) : null}\n {/* Um nó sintético — o pai que o dado não trouxe porque não teve\n lançamento próprio — só conhece o código. Imprimir `2 2` seria\n anunciar duas vezes a única coisa que se sabe dele. */}\n {label && label !== code ? (\n <span className={cn('truncate', synthetic && 'text-muted-foreground')} title={label}>\n {label}\n </span>\n ) : null}\n </span>\n </th>\n {periods.map((p) => (\n <td key={p} className=\"w-px whitespace-nowrap px-3 py-2 text-right tabular-nums\">\n {cell(values[p], currency)}\n </td>\n ))}\n <td className=\"w-px whitespace-nowrap border-l border-border px-3 py-2 text-right font-medium tabular-nums\">\n {cell(total || undefined, currency)}\n </td>\n </tr>\n )\n}\n\n/**\n * O esqueleto tem a FORMA de um demonstrativo, não a de uma tabela qualquer.\n *\n * Um bloco cinza genérico avisa que algo carrega; este avisa o que carrega —\n * a coluna de contas larga à esquerda, as colunas estreitas de valor à direita,\n * e as duas linhas fortes de totalizador. O layout não salta quando o dado\n * chega, que é o que faz a espera parecer mais curta do que é.\n */\nfunction StatementSkeleton({ rows, dense }: { rows: number; dense?: boolean }) {\n const cols = 4\n return (\n <div className=\"overflow-hidden rounded-lg border\" aria-hidden>\n <div className=\"flex items-center gap-3 border-b bg-muted/50 px-3 py-2.5\">\n <Skeleton className=\"h-3 w-24\" />\n <div className=\"ml-auto flex gap-3\">\n {Array.from({ length: cols }).map((_, i) => (\n <Skeleton key={i} className=\"h-3 w-16\" />\n ))}\n </div>\n </div>\n {Array.from({ length: rows }).map((_, i) => {\n const total = i === 0 || i === Math.floor(rows / 2)\n return (\n <div\n key={i}\n className={cn(\n 'flex items-center gap-3 border-b border-border/50 px-3 last:border-b-0',\n dense ? 'py-1.5' : 'py-2.5',\n total && 'bg-muted/40',\n )}\n >\n <Skeleton\n className={cn('h-3.5', total ? 'w-48' : 'w-36')}\n style={{ marginLeft: total ? 0 : `${(i % 3) * 16}px` }}\n />\n <div className=\"ml-auto flex gap-3\">\n {Array.from({ length: cols }).map((_, c) => (\n <Skeleton key={c} className=\"h-3.5 w-16\" />\n ))}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport function StatementTable({\n rows, def, currency, formatPeriod, totalLabel = 'Total',\n accountLabel = 'Conta', emptyMessage = 'Sem lançamentos no período.',\n className, dense, loading, skeletonRows,\n}: StatementTableProps) {\n const statement: Statement = React.useMemo(() => buildStatement(rows, def), [rows, def])\n const [open, setOpen] = React.useState<Set<string>>(() => new Set())\n const [touched, setTouched] = React.useState(false)\n\n // O estado inicial vem do dado, não do primeiro render: a árvore só existe\n // depois que as linhas chegam, e abrir por padrão antes disso abriria nada.\n React.useEffect(() => {\n if (touched) return\n setOpen(defaultOpenKeys(statement.lines, def.defaultDepth ?? 1))\n }, [statement, def.defaultDepth, touched])\n\n const toggle = React.useCallback((key: string) => {\n setTouched(true)\n setOpen((prev) => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }, [])\n\n const setAll = React.useCallback((expand: boolean) => {\n setTouched(true)\n if (!expand) { setOpen(new Set()); return }\n const all = new Set<string>()\n const walk = (nodes: StatementNode[]) => {\n for (const n of nodes) { all.add(n.key); walk(n.children) }\n }\n for (const line of statement.lines) if (line.kind === 'section') walk(line.nodes)\n setOpen(all)\n }, [statement])\n\n const { periods, lines } = statement\n\n // O esqueleto ganha do vazio E do obsoleto: enquanto carrega, \"sem lançamentos\n // no período\" é uma resposta errada dada com confiança, e o demonstrativo do\n // recorte anterior sob o rótulo do novo é a mesma coisa com números.\n if (loading) {\n return <StatementSkeleton rows={skeletonRows ?? (dense ? 5 : 10)} dense={dense} />\n }\n if (periods.length === 0) {\n return (\n <div className=\"flex min-h-[120px] items-center justify-center rounded-lg border border-dashed text-sm text-muted-foreground\">\n {emptyMessage}\n </div>\n )\n }\n\n const isOpen = (n: StatementNode) => open.has(n.key)\n\n return (\n <div className={cn('space-y-2', className)}>\n {!dense ? (\n <div className=\"no-print flex gap-2\">\n <button\n type=\"button\" onClick={() => setAll(true)}\n className=\"rounded-md border px-2.5 py-1 text-xs font-medium transition-colors hover:bg-muted\"\n >\n Expandir tudo\n </button>\n <button\n type=\"button\" onClick={() => setAll(false)}\n className=\"rounded-md border px-2.5 py-1 text-xs font-medium transition-colors hover:bg-muted\"\n >\n Recolher tudo\n </button>\n </div>\n ) : null}\n\n {/* A largura é do conteúdo: doze meses não cabem em telefone nenhum, e o\n corpo da página não pode rolar de lado por causa disso. */}\n <div className=\"print-flow overflow-x-auto rounded-lg border\">\n <table className={cn('w-full border-collapse', dense ? 'text-xs' : 'text-sm')}>\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th scope=\"col\" className=\"sticky left-0 z-10 w-full bg-muted/50 px-3 py-2 text-left text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {accountLabel}\n </th>\n {periods.map((p) => (\n <th key={p} scope=\"col\" className=\"w-px whitespace-nowrap px-3 py-2 text-right text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {formatPeriod ? formatPeriod(p) : p}\n </th>\n ))}\n <th scope=\"col\" className=\"w-px whitespace-nowrap border-l border-border px-3 py-2 text-right text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {totalLabel}\n </th>\n </tr>\n </thead>\n <tbody>\n {lines.map((line, i) => {\n if (line.kind === 'total') {\n return (\n <Row\n key={`total-${i}-${line.label}`}\n label={line.label}\n depth={0}\n values={line.totals}\n total={line.total}\n periods={periods}\n currency={currency}\n tone={line.emphasis ?? 'strong'}\n />\n )\n }\n const visible = flattenNodes(line.nodes, isOpen)\n return (\n <React.Fragment key={`section-${line.section}`}>\n {visible.map((node) => (\n <Row\n key={node.key}\n label={node.label}\n code={node.code || undefined}\n depth={node.depth}\n values={node.rollup}\n total={node.total}\n periods={periods}\n currency={currency}\n expandable={node.children.length > 0}\n open={isOpen(node)}\n onToggle={() => toggle(node.key)}\n synthetic={node.synthetic}\n />\n ))}\n </React.Fragment>\n )\n })}\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { ArrowUpRight, Info, TrendingUp, TrendingDown, Construction, DatabaseZap, AlertCircle } from 'lucide-react'\nimport type {\n AnalyticsCardDef, AnalyticsColumnDef, AnalyticsFormat, AnalyticsMeasure, AnalyticsRow,\n} from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { StatementTable } from './StatementTable'\nimport { Card, CardContent } from '../primitives/card'\nimport { Hint } from '../primitives/hint'\nimport { Skeleton } from '../primitives/skeleton'\nimport { ChartWidget } from '../dashboard/ChartWidget'\nimport { Sparkline } from '../dashboard/Sparkline'\nimport type { ChartSeries, ChartType } from '../dashboard/types'\nimport { useAnalyticsContext, useAnalyticsCard } from './context'\nimport {\n formatAnalyticsValue, deltaPercent, trendOf, toBreakdown, toChartData,\n toSpark, vizMeasures, vizCategory, num, formatBucket, type AnalyticsCurrency,\n} from './derive'\n\n// ---------------------------------------------------------------------------\n// The card — one AnalyticsCardDef, rendered at tile size.\n//\n// Every viz shares the same chrome (title, the ⓘ that explains what the number\n// means, the ↗ that opens the same definition as a full report) because they\n// are the same object. The arrow is not navigation between two features; it is\n// a zoom level.\n// ---------------------------------------------------------------------------\n\nconst CHART_TYPES: Record<string, ChartType> = { line: 'line', bar: 'bar', area: 'area', donut: 'pie' }\n\nexport interface AnalyticsCardProps {\n card: AnalyticsCardDef\n className?: string\n /** Hide the ↗ affordance (the viewer renders the same card full-size). */\n hideOpen?: boolean\n}\n\nfunction CardChrome({\n card, hideOpen, children, dense,\n}: { card: AnalyticsCardDef; hideOpen?: boolean; children: React.ReactNode; dense?: boolean }) {\n const { onOpenCard } = useAnalyticsContext()\n const canOpen = Boolean(onOpenCard) && !hideOpen\n\n return (\n <Card className=\"group flex h-full flex-col\">\n <div className={cn('flex items-start justify-between gap-2', dense ? 'px-4 pt-3' : 'px-5 pt-4')}>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium text-muted-foreground\">{card.name}</span>\n {card.description ? (\n <Hint label={card.description} side=\"top\">\n <span\n tabIndex={0}\n role=\"note\"\n aria-label={card.description}\n className=\"shrink-0 text-muted-foreground/60 hover:text-muted-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </span>\n </Hint>\n ) : null}\n </div>\n {canOpen ? (\n <Hint label=\"Open as report\" side=\"top\">\n <button\n type=\"button\"\n onClick={() => onOpenCard?.(card)}\n aria-label={`Open ${card.name} as a report`}\n className=\"shrink-0 rounded-md p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n >\n <ArrowUpRight className=\"h-4 w-4\" />\n </button>\n </Hint>\n ) : null}\n </div>\n <CardContent className={cn('flex-1', dense ? 'p-4 pt-2' : 'p-5 pt-2')}>{children}</CardContent>\n </Card>\n )\n}\n\nfunction TrendChip({ current, previous }: { current: number; previous: number | null | undefined }) {\n const delta = deltaPercent(current, previous)\n const trend = trendOf(current, previous)\n // No previous window, or a previous of zero: there is no honest percentage to\n // print, so the card shows a dash rather than inventing \"+100%\".\n if (!trend || trend === 'neutral' || delta == null) {\n return <span className=\"text-xs text-muted-foreground\">—</span>\n }\n const Icon = trend === 'up' ? TrendingUp : TrendingDown\n return (\n <span className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n trend === 'up' ? 'text-emerald-600' : 'text-rose-600',\n )}>\n <Icon className=\"h-3 w-3\" />\n {`${delta > 0 ? '+' : ''}${delta.toFixed(1)}%`}\n </span>\n )\n}\n\nfunction BreakdownList({\n rows, categoryKey, measure, currency, limit,\n}: {\n rows: AnalyticsRow[]; categoryKey: string; measure: AnalyticsMeasure\n currency: AnalyticsCurrency; limit?: number\n}) {\n const items = toBreakdown(rows, categoryKey, measure.key, measure.format, currency, limit)\n if (items.length === 0) return <EmptyState />\n return (\n <ul className=\"space-y-2.5\">\n {items.map((item, i) => (\n <li key={`${item.label}-${i}`} className=\"flex items-center gap-3 text-sm\">\n <span className=\"w-2/5 truncate text-muted-foreground\" title={item.label}>{item.label}</span>\n <span className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\" role=\"presentation\">\n <span\n className=\"block h-full rounded-full bg-[hsl(var(--chart-1,var(--info)))]\"\n style={{ width: `${Math.max(item.share * 100, item.value === 0 ? 0 : 2)}%` }}\n />\n </span>\n <span className=\"shrink-0 tabular-nums font-medium\">{item.formatted}</span>\n </li>\n ))}\n </ul>\n )\n}\n\n/**\n * A column's type vocabulary is wider than the value formatter's: 'person',\n * 'email', 'select' and 'boolean' have no numeric shape, so they fall back to\n * text rather than to nothing. `undefined` would be worse than imprecise — an\n * unformatted NULL takes the numeric branch and prints \"0\", so a customer with\n * no name recorded showed up in the table as a zero.\n */\nconst VALUE_FORMATS = new Set<string>(['number', 'currency', 'percent', 'duration', 'date', 'text'])\nfunction columnFormat(type: AnalyticsColumnDef['type']): AnalyticsFormat {\n return VALUE_FORMATS.has(type) ? (type as AnalyticsFormat) : 'text'\n}\n\nfunction MiniTable({\n rows, card, currency, limit,\n}: { rows: AnalyticsRow[]; card: AnalyticsCardDef; currency: AnalyticsCurrency; limit?: number }) {\n // Hidden dimensions are grouped on, not shown: the tile would otherwise lead\n // with a column of UUIDs.\n const dims = (card.query.dimensions ?? []).filter((d) => !d.hidden)\n const measures = vizMeasures(card)\n const aggregated = [\n ...dims.map((d) => ({ key: d.key, label: d.label, format: d.format, align: 'left' as const })),\n ...measures.map((m) => ({ key: m.key, label: m.label, format: m.format, align: 'right' as const })),\n ]\n // A DETAIL card has neither dimensions nor measures — it reads the view row by\n // row, and `card.columns` is the only thing that says what a row looks like.\n // Building the header from dimensions alone left such a card with zero columns:\n // a table of empty rows under a title, which reads as \"no data\" while the\n // request came back 200 with everything in it.\n const cols = aggregated.length > 0\n ? aggregated\n : (card.columns ?? [])\n .filter((c) => c.visible !== false)\n .map((c) => ({\n key: c.key,\n label: c.label,\n format: columnFormat(c.type),\n align: c.align === 'right' ? ('right' as const) : ('left' as const),\n }))\n const shown = limit ? rows.slice(0, limit) : rows\n if (shown.length === 0 || cols.length === 0) return <EmptyState />\n\n return (\n <div className=\"-mx-1 overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b text-xs text-muted-foreground\">\n {cols.map((c) => (\n <th key={c.key} className={cn('px-1 pb-2 font-medium', c.align === 'right' ? 'text-right' : 'text-left')}>\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {shown.map((row, i) => (\n <tr key={i} className=\"border-b border-border/50 last:border-0\">\n {cols.map((c) => (\n <td key={c.key} className={cn('px-1 py-2', c.align === 'right' ? 'text-right tabular-nums' : 'truncate')}>\n {formatAnalyticsValue(row[c.key], c.format, currency)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction EmptyState({ label = 'No data for this date range' }: { label?: string }) {\n return (\n <div className=\"flex h-full min-h-[80px] items-center justify-center text-center text-sm text-muted-foreground\">\n {label}\n </div>\n )\n}\n\nexport function AnalyticsCard({ card, className, hideOpen }: AnalyticsCardProps) {\n const { currency } = useAnalyticsContext()\n const { result, summary, previousSummary, loading, error, engineMissing } = useAnalyticsCard(card)\n const measures = vizMeasures(card)\n const category = vizCategory(card)\n const rows = result?.rows ?? []\n\n const body = (() => {\n if (card.available === false) {\n return (\n <div className=\"flex h-full min-h-[80px] flex-col items-center justify-center gap-2 text-center\">\n <Construction className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-xs text-muted-foreground\">Not connected yet</p>\n </div>\n )\n }\n // `loading` basta — não `loading && !result`. Ao trocar o filtro o resultado\n // anterior ainda está na mão, e mantê-lo na tela mostra o número do recorte\n // ANTIGO sob o rótulo do NOVO por um instante. Um número errado que se\n // parece com um certo é pior que um esqueleto.\n if (loading) {\n return (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-7 w-24\" />\n <Skeleton className=\"h-4 w-16\" />\n </div>\n )\n }\n if (engineMissing) {\n // A missing migration is not a broken card, and saying \"error\" here sends\n // someone hunting through a card definition that is perfectly fine.\n return (\n <div className=\"flex h-full min-h-[80px] flex-col items-center justify-center gap-1.5 text-center\">\n <DatabaseZap className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-xs font-medium\">Analytics engine not installed</p>\n <p className=\"text-[11px] text-muted-foreground\">Run migration 0039 on this project.</p>\n </div>\n )\n }\n if (error) {\n return (\n <div className=\"flex h-full min-h-[60px] items-start gap-1.5 text-xs text-destructive\">\n <AlertCircle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"break-words\">{error}</span>\n </div>\n )\n }\n\n switch (card.viz.type) {\n case 'kpi': {\n const measure = measures[0]\n if (!measure) return <EmptyState />\n const value = num(summary[measure.key])\n const previous = previousSummary ? num(previousSummary[measure.key]) : null\n const spark = card.viz.spark ? toSpark(result, measure.key) : undefined\n return (\n <div className=\"flex h-full flex-col justify-between gap-2\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-2xl font-semibold tracking-tight tabular-nums\">\n {formatAnalyticsValue(value, measure.format, currency, { compact: true })}\n </span>\n <TrendChip current={value} previous={previous} />\n </div>\n {spark ? (\n <Sparkline\n data={spark} color=\"hsl(var(--chart-1,var(--info)))\"\n width={120} height={28} padding={2} className=\"h-7 w-full\"\n />\n ) : null}\n </div>\n )\n }\n\n case 'breakdown': {\n const measure = measures[0]\n if (!measure || !category) return <EmptyState />\n return (\n <BreakdownList\n rows={rows} categoryKey={category.key} measure={measure}\n currency={currency} limit={card.viz.limit}\n />\n )\n }\n\n case 'table':\n return <MiniTable rows={rows} card={card} currency={currency} limit={card.viz.limit ?? 5} />\n\n case 'statement': {\n // No card da grade o demonstrativo entra compacto e já recolhido: a\n // pergunta que um card responde é \"quanto deu\", e a árvore inteira é o\n // que o relatório aberto existe para mostrar.\n if (!card.viz.statement) return <EmptyState />\n return (\n <StatementTable\n rows={rows}\n def={{ ...card.viz.statement, defaultDepth: 0 }}\n currency={currency}\n formatPeriod={(p) => formatBucket(p, 'month')}\n dense\n />\n )\n }\n\n case 'funnel': {\n // A funnel is a breakdown whose bars are shares of the FIRST step, so\n // each stage reads as \"of everyone who started, this many got here\".\n const measure = measures[0]\n if (!measure || !category) return <EmptyState />\n const first = num(rows[0]?.[measure.key]) || 1\n return (\n <ul className=\"space-y-2.5\">\n {rows.map((row, i) => {\n const value = num(row[measure.key])\n return (\n <li key={i} className=\"text-sm\">\n <div className=\"mb-1 flex items-baseline justify-between gap-2\">\n <span className=\"truncate text-muted-foreground\">{String(row[category.key] ?? '—')}</span>\n <span className=\"shrink-0 tabular-nums font-medium\">\n {formatAnalyticsValue(value, measure.format, currency)}\n <span className=\"ml-1.5 text-xs text-muted-foreground\">\n {((value / first) * 100).toFixed(0)}%\n </span>\n </span>\n </div>\n <span className=\"block h-1.5 overflow-hidden rounded-full bg-muted\">\n <span className=\"block h-full rounded-full bg-[hsl(var(--chart-1,var(--info)))]\" style={{ width: `${(value / first) * 100}%` }} />\n </span>\n </li>\n )\n })}\n </ul>\n )\n }\n\n default: {\n if (rows.length === 0) return <EmptyState />\n if (!category) return <EmptyState />\n const chartType = CHART_TYPES[card.viz.type] ?? 'line'\n const data = toChartData(rows, category.key, category.grain, currency.locale)\n const series: ChartSeries[] = measures.map((m) => ({ dataKey: m.key, label: m.label }))\n return (\n <ChartWidget\n type={chartType}\n data={data}\n series={series}\n categoryKey={category.key}\n height={card.viz.height ?? 200}\n className=\"border-0 bg-transparent shadow-none [&>div]:p-0\"\n />\n )\n }\n }\n })()\n\n const dense = card.viz.type === 'kpi'\n return (\n <div className={className}>\n <CardChrome card={card} hideOpen={hideOpen} dense={dense}>{body}</CardChrome>\n </div>\n )\n}\n","import * as React from 'react'\nimport type { AnalyticsCardDef, AnalyticsFilterDef } from '@fayz-ai/core'\nimport { DashboardGrid } from '../dashboard/DashboardGrid'\nimport { AnalyticsCard } from './AnalyticsCard'\n\n// ---------------------------------------------------------------------------\n// The overview grid. Reuses DashboardGrid rather than growing a second\n// four-column layout that would drift out of alignment with the app home.\n// ---------------------------------------------------------------------------\n\n/** Default span by viz: a KPI is a quarter, a chart a half, a table a full row. */\nfunction defaultSpan(card: AnalyticsCardDef): 1 | 2 | 3 | 4 {\n if (card.dashboard?.span) return card.dashboard.span\n switch (card.viz.type) {\n case 'kpi': return 1\n case 'table': return 4\n default: return 2\n }\n}\n\nexport interface AnalyticsGridProps {\n cards: AnalyticsCardDef[]\n className?: string\n}\n\nexport function AnalyticsGrid({ cards, className }: AnalyticsGridProps) {\n const items = React.useMemo(\n () => cards.map((card) => ({\n id: card.id,\n span: defaultSpan(card),\n node: <AnalyticsCard card={card} />,\n })),\n [cards],\n )\n return <DashboardGrid items={items} className={className} />\n}\n\n/**\n * Every filter offered by the cards on screen, de-duplicated by key.\n *\n * The control bar shows the union rather than the intersection: a filter that\n * only narrows three of fourteen cards is still worth offering, and hiding it\n * until every card supports it would leave the picker permanently empty.\n */\nexport function collectFilters(cards: AnalyticsCardDef[]): AnalyticsFilterDef[] {\n const byKey = new Map<string, AnalyticsFilterDef>()\n for (const card of cards) {\n for (const filter of card.query.filters ?? []) {\n if (!byKey.has(filter.key)) byKey.set(filter.key, filter)\n }\n }\n return [...byKey.values()]\n}\n","import * as React from 'react'\nimport { Check, GitCompareArrows, SlidersHorizontal, Search, ChevronRight, X } from 'lucide-react'\nimport type { AnalyticsFilterDef, AnalyticsFilterOption } from '@fayz-ai/core'\nimport { useTranslation, getCurrentLocale } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { Button } from '../primitives/button'\nimport { Input } from '../primitives/input'\nimport { Checkbox } from '../primitives/checkbox'\nimport { DatePicker } from '../primitives/date-picker'\nimport { Popover, PopoverTrigger, PopoverContent } from '../primitives/popover'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownSeparator } from '../primitives/dropdown'\nimport { PageToolbar, RangeControl, ToolbarButton, useToolbarPanelClose, useToolbarSurface } from '../primitives/page-toolbar'\nimport { useAnalyticsContext } from './context'\nimport { parseDay, type AnalyticsRangePreset } from './range'\n\n// ---------------------------------------------------------------------------\n// The one control bar every analytics surface shares.\n//\n// Range, comparison and filters sit here rather than on each card because they\n// describe the QUESTION, not the chart: changing \"last 7 days\" has to move\n// everything on screen at once, or two tiles end up answering about different\n// weeks and the page silently lies.\n//\n// Chrome is deliberately the same 26px toolbar the dashboard uses (Button `sm`,\n// SegmentedControl, DatePicker `toolbar`) — this bar sits above the very same\n// card grid as the app home, and a taller, lighter-weight row of its own read\n// as a different product bolted on top.\n// ---------------------------------------------------------------------------\n\nconst PRESETS: AnalyticsRangePreset[] = [\n 'today', 'yesterday', 'last_7_days', 'last_30_days', 'last_90_days',\n 'this_month', 'last_month', 'this_quarter', 'this_year',\n]\n\nconst COMPARE_OPTIONS = ['previous_period', 'previous_year', 'none'] as const\n\n/** \"15 jul – 13 ago\" — the window the numbers below actually cover. */\nfunction formatSpan(from: string, to: string, locale: string): string {\n const opts: Intl.DateTimeFormatOptions = { day: '2-digit', month: 'short' }\n const a = parseDay(from)\n const b = parseDay(to)\n const fmt = (d: Date) => d.toLocaleDateString(locale, {\n ...opts,\n // The year only earns its space when the range leaves the current one.\n ...(d.getFullYear() === new Date().getFullYear() ? {} : { year: 'numeric' }),\n })\n return from === to ? fmt(a) : `${fmt(a)} – ${fmt(b)}`\n}\n\n// ---------------------------------------------------------------------------\n// Filter picker — categorized, searchable, staged behind Apply.\n// ---------------------------------------------------------------------------\n\nfunction useFilterOptions(filter: AnalyticsFilterDef): AnalyticsFilterOption[] {\n const [options, setOptions] = React.useState<AnalyticsFilterOption[]>(\n Array.isArray(filter.options) ? filter.options : [],\n )\n React.useEffect(() => {\n if (typeof filter.options !== 'function') {\n setOptions(Array.isArray(filter.options) ? filter.options : [])\n return\n }\n let cancelled = false\n void filter.options().then((next) => { if (!cancelled) setOptions(next) }).catch(() => {})\n return () => { cancelled = true }\n }, [filter.options])\n return options\n}\n\nfunction FilterValues({\n filter, draft, onChange,\n}: { filter: AnalyticsFilterDef; draft: Record<string, unknown>; onChange: (key: string, value: unknown) => void }) {\n const t = useTranslation()\n const options = useFilterOptions(filter)\n const current = draft[filter.key]\n\n if (filter.type === 'text' || filter.type === 'number') {\n return (\n <Input\n type={filter.type === 'number' ? 'number' : 'text'}\n value={current == null ? '' : String(current)}\n placeholder={filter.placeholder}\n onChange={(e) => onChange(filter.key, e.target.value)}\n className=\"h-8 text-sm\"\n />\n )\n }\n\n if (filter.type === 'boolean') {\n return (\n <div className=\"space-y-1\">\n {[{ label: t('common.yes'), value: 'true' }, { label: t('common.no'), value: 'false' }].map((o) => (\n <label key={o.value} className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted\">\n <input\n type=\"radio\"\n name={filter.key}\n checked={String(current) === o.value}\n onChange={() => onChange(filter.key, o.value)}\n className=\"h-3.5 w-3.5\"\n />\n {o.label}\n </label>\n ))}\n </div>\n )\n }\n\n const multi = filter.type === 'multiselect'\n const selected = new Set(Array.isArray(current) ? current.map(String) : current != null ? [String(current)] : [])\n\n if (options.length === 0) {\n return <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">{t('analytics.filters.noOptions')}</p>\n }\n\n return (\n <div className=\"max-h-56 space-y-0.5 overflow-y-auto\">\n {options.map((o) => (\n <label key={o.value} className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted\">\n {/* A caixa do design system, não a do sistema operacional. A nativa\n ignora o tema — vinha cinza-Chrome no meio de uma paleta inteira\n da casa —, muda de desenho entre macOS, Windows e Android, e é a\n ÚNICA caixa do produto que não acende na cor da marca quando\n marcada. O rádio continua nativo: o DS ainda não tem par para ele,\n e uma bolinha custom aqui seria a segunda forma de dizer a mesma\n coisa. */}\n {multi ? (\n <Checkbox\n checked={selected.has(o.value)}\n aria-label={o.label}\n onChange={() => {\n const next = new Set(selected)\n if (next.has(o.value)) next.delete(o.value)\n else next.add(o.value)\n onChange(filter.key, [...next])\n }}\n />\n ) : (\n <input\n type=\"radio\"\n name={filter.key}\n checked={selected.has(o.value)}\n onChange={() => onChange(filter.key, selected.has(o.value) ? undefined : o.value)}\n className=\"h-3.5 w-3.5\"\n />\n )}\n <span className=\"truncate\">{o.label}</span>\n </label>\n ))}\n </div>\n )\n}\n\nexport interface AnalyticsFilterPickerProps {\n /** Every filter offered on this surface, from the cards in view. */\n filters: AnalyticsFilterDef[]\n}\n\nexport function AnalyticsFilterPicker({ filters }: AnalyticsFilterPickerProps) {\n const t = useTranslation()\n const { state, setFilters, clearFilters } = useAnalyticsContext()\n // No painel do celular não existe \"fechado\": o controle JÁ é o conteúdo\n // aberto, e um popover a partir dele seria uma camada sobre a camada que\n // acabou de abrir. Os grupos também nascem abertos — com a tela inteira à\n // disposição, esconder seis checkboxes atrás de um acordeão só cobra um\n // toque para mostrar o que já cabia.\n const surface = useToolbarSurface()\n const inline = surface === 'panel'\n const closePanel = useToolbarPanelClose()\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState('')\n const [openGroup, setOpenGroup] = React.useState<string | null>(null)\n // Staged: edits do not hit the query until Apply, so a five-filter change is\n // one refetch instead of five — and Clear can be abandoned by closing.\n const [draft, setDraft] = React.useState<Record<string, unknown>>(state.filters)\n\n React.useEffect(() => { if (open || inline) setDraft(state.filters) }, [open, inline, state.filters])\n\n const groups = React.useMemo(() => {\n const q = search.trim().toLowerCase()\n const matching = q ? filters.filter((f) => f.label.toLowerCase().includes(q)) : filters\n const map = new Map<string, AnalyticsFilterDef[]>()\n for (const f of matching) {\n const key = f.group ?? t('analytics.filters.general')\n map.set(key, [...(map.get(key) ?? []), f])\n }\n return [...map.entries()].sort(([a], [b]) => a.localeCompare(b))\n }, [filters, search, t])\n\n const activeCount = Object.keys(state.filters).length\n if (filters.length === 0) return null\n\n const panel = (\n <>\n <div className={inline ? 'pb-2' : 'border-b p-2'}>\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('analytics.filters.search')}\n className=\"h-8 pl-8 text-sm\"\n />\n </div>\n </div>\n\n <div className={inline ? 'min-h-0 flex-1 overflow-y-auto' : 'max-h-80 overflow-y-auto p-1'}>\n {groups.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-muted-foreground\">{t('analytics.filters.none')}</p>\n ) : (\n groups.map(([group, groupFilters]) => {\n const expanded = inline || openGroup === group\n return (\n <div key={group}>\n {/* Na folha o nome do grupo é um CABEÇALHO, não um gatilho: não\n há nada para abrir, porque já está aberto. */}\n {inline ? (\n <p className=\"px-1 pb-1 pt-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group}\n </p>\n ) : (\n <button\n type=\"button\"\n onClick={() => setOpenGroup((g) => (g === group ? null : group))}\n aria-expanded={expanded}\n className=\"flex w-full items-center justify-between rounded-md px-2 py-2 text-sm hover:bg-muted\"\n >\n <span className=\"font-medium\">{group}</span>\n <ChevronRight className={cn('h-3.5 w-3.5 text-muted-foreground transition-transform', expanded && 'rotate-90')} />\n </button>\n )}\n {expanded ? (\n <div className={inline ? 'space-y-4 px-1 pb-2' : 'space-y-3 px-2 pb-3 pt-1'}>\n {groupFilters.map((f) => (\n <div key={f.key}>\n <p className=\"mb-1 text-xs font-medium text-muted-foreground\">{f.label}</p>\n <FilterValues\n filter={f}\n draft={draft}\n onChange={(key, value) => setDraft((d) => {\n const next = { ...d }\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) delete next[key]\n else next[key] = value\n return next\n })}\n />\n </div>\n ))}\n </div>\n ) : null}\n </div>\n )\n })\n )}\n </div>\n\n <div className={cn(\n 'flex items-center justify-between gap-2 border-t',\n inline ? 'mt-2 pt-3' : 'p-2',\n )}>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => { setDraft({}); clearFilters(); setOpen(false); closePanel() }}\n >\n {t('analytics.filters.clear')}\n </Button>\n <Button size=\"sm\" onClick={() => { setFilters(draft); setOpen(false); closePanel() }}>\n {t('analytics.filters.apply')}\n </Button>\n </div>\n </>\n )\n\n if (inline) return <div className=\"flex min-h-0 flex-col\">{panel}</div>\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <ToolbarButton icon={SlidersHorizontal} caret={false}>\n {t('analytics.filters')}\n {activeCount > 0 ? (\n <span className=\"ml-0.5 rounded-full bg-primary px-1.5 text-[10px] font-semibold text-primary-foreground\">\n {activeCount}\n </span>\n ) : null}\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-80 p-0\">\n {panel}\n </PopoverContent>\n </Popover>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Range control — presets, and the custom window they cannot express\n// ---------------------------------------------------------------------------\n\nfunction AnalyticsRangeControl() {\n const t = useTranslation()\n const surface = useToolbarSurface()\n const locale = getCurrentLocale()\n const { state, preset, setPreset, setDateRange } = useAnalyticsContext()\n const custom = preset === 'custom'\n const span = formatSpan(state.dateRange.from, state.dateRange.to, locale)\n\n // No painel do celular o período vira DUAS LINHAS rotuladas, sempre visíveis.\n // O gatilho de presets é uma barganha de barra estreita: economiza largura\n // cobrando um toque para descobrir que datas estão valendo, e esconde o par\n // de seletores atrás de um item de menu chamado \"personalizado\". No painel\n // não há largura para economizar — há uma coluna —, então as duas datas que\n // governam TODO número da tela ficam escritas, editáveis, uma por linha.\n if (surface === 'panel') {\n return (\n <>\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{t('analytics.range.from')}</span>\n <DatePicker\n value={state.dateRange.from}\n // Um início depois do fim não é um intervalo, é uma resposta vazia\n // que a página renderiza como \"sem dados\". Arrastar um para além do\n // outro leva o outro junto.\n onChange={(from) => setDateRange({\n from,\n to: from > state.dateRange.to ? from : state.dateRange.to,\n })}\n />\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted-foreground\">{t('analytics.range.to')}</span>\n <DatePicker\n value={state.dateRange.to}\n onChange={(to) => setDateRange({\n from: to < state.dateRange.from ? to : state.dateRange.from,\n to,\n })}\n />\n </label>\n </>\n )\n }\n\n // O MESMO controle de período que o dashboard usa (RangeControl); o que é\n // próprio daqui — a janela resolvida e o par de seletores do personalizado —\n // entra pelos vãos dele.\n return (\n <RangeControl\n options={PRESETS.map((p) => ({ value: p, label: t(`analytics.range.${p}`) }))}\n value={preset}\n onChange={(p) => setPreset(p as AnalyticsRangePreset)}\n label={custom ? t('analytics.range.custom') : undefined}\n // The resolved window, always. A preset name alone leaves the merchant\n // guessing whether \"this month\" already includes today.\n span={custom ? undefined : span}\n extra={\n <>\n <DropdownSeparator />\n {/* Re-committing the range the user is already on is what flips the\n bar into custom mode: `setDateRange` is the only path that sets the\n preset to 'custom', so opening the two pickers cannot be done by\n flipping a flag without also telling the query state. */}\n <DropdownItem onSelect={() => setDateRange({ ...state.dateRange })}>\n {t('analytics.range.custom')}\n {custom ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n </>\n }\n >\n {custom ? (\n <>\n <DatePicker\n variant=\"toolbar\"\n value={state.dateRange.from}\n // A start after the end is not a range, it is an empty answer the\n // page would render as \"no data\". Dragging one past the other moves\n // the other with it instead.\n onChange={(from) => setDateRange({\n from,\n to: from > state.dateRange.to ? from : state.dateRange.to,\n })}\n />\n <span className=\"text-xs text-muted-foreground\">–</span>\n <DatePicker\n variant=\"toolbar\"\n value={state.dateRange.to}\n onChange={(to) => setDateRange({\n from: to < state.dateRange.from ? to : state.dateRange.from,\n to,\n })}\n />\n </>\n ) : null}\n </RangeControl>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The bar\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsControlsProps {\n /** Filters offered in the picker — usually the union across visible cards. */\n filters?: AnalyticsFilterDef[]\n /** Hide the comparison control on surfaces where it means nothing. */\n showCompare?: boolean\n /** Right-aligned extras (e.g. Export, New report). */\n actions?: React.ReactNode\n /** Which cards/widgets show — same slot the dashboard fills. */\n customize?: React.ReactNode\n /** Solta a barra do topo (impressão, dentro de um modal). */\n sticky?: boolean\n className?: string\n}\n\nexport function AnalyticsControls({ filters = [], showCompare = true, actions, customize, sticky, className }: AnalyticsControlsProps) {\n const t = useTranslation()\n const { state, setCompare, refresh } = useAnalyticsContext()\n const compare = state.compare ?? 'none'\n\n const activeFilters = Object.entries(state.filters)\n const filterLabel = (key: string) => filters.find((f) => f.key === key)?.label ?? key\n\n return (\n // Sem cromo próprio: a superfície, o encosto à direita e o comportamento\n // grudado no topo vêm de PageToolbar — a mesma barra do dashboard. Aqui só\n // se diz O QUE ela carrega.\n <PageToolbar\n className={className}\n sticky={sticky}\n moveLabel={t('analytics.moveBar')}\n range={<AnalyticsRangeControl />}\n filters={\n <>\n {showCompare ? (\n <Dropdown>\n <DropdownTrigger asChild>\n <ToolbarButton\n icon={GitCompareArrows}\n // A comparison that is OFF should not look like a set filter; a\n // comparison that is on is what every trend chip on the page is\n // measured against, and worth reading at a glance.\n className={compare === 'none' ? 'text-muted-foreground' : undefined}\n >\n {t(`analytics.compare.${compare}`)}\n </ToolbarButton>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-48\">\n {COMPARE_OPTIONS.map((c) => (\n <DropdownItem key={c} onSelect={() => setCompare(c)}>\n {t(`analytics.compare.${c}`)}\n {compare === c ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\n ) : null}\n <AnalyticsFilterPicker filters={filters} />\n </>\n }\n /* Applied filters stay visible as removable chips: a filter you cannot\n see is a filter you forget you set, and every number below is wrong in\n a way the page never explains. */\n chips={activeFilters.map(([key, value]) => (\n <ActiveFilterChip key={key} label={filterLabel(key)} value={value} filterKey={key} />\n ))}\n customize={customize}\n actions={actions}\n onRefresh={refresh}\n refreshLabel={t('analytics.refresh')}\n />\n )\n}\n\nfunction ActiveFilterChip({ label, value, filterKey }: { label: string; value: unknown; filterKey: string }) {\n const t = useTranslation()\n const { setFilter } = useAnalyticsContext()\n // A single-valued filter shows the value; a multiselect shows how many, since\n // six statuses spelled out push every other chip off the row.\n const text = Array.isArray(value)\n ? (value.length === 1 ? String(value[0]) : t('analytics.filters.selected', { count: value.length }))\n : String(value)\n return (\n // `min-w-0` no lugar de `shrink-0`: na faixa estreita do celular a pastilha\n // inteira não cabia, e o que sobrava fora da tela era justamente o × — um\n // filtro visível que não se consegue tirar é pior do que um escondido.\n // Encolhendo, quem encurta é o VALOR (truncate), e o botão de remover é\n // `shrink-0`, então sobrevive a qualquer largura.\n <span className=\"inline-flex h-[26px] min-w-0 items-center gap-1 rounded-full border border-primary/30 bg-primary/10 py-1 pl-2.5 pr-1 text-xs font-medium text-primary\">\n <span className=\"shrink-0 opacity-70\">{label}:</span>\n <span className=\"max-w-[10rem] truncate\">{text}</span>\n <button\n type=\"button\"\n onClick={() => setFilter(filterKey, undefined)}\n aria-label={`${t('analytics.filters.remove')}: ${label}`}\n className=\"shrink-0 rounded-full p-0.5 transition-colors hover:bg-primary/20\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n )\n}\n","import * as React from 'react'\nimport { Check } from 'lucide-react'\nimport type { AnalyticsDateRange } from '@fayz-ai/core'\nimport { useTranslation, getCurrentLocale } from '@fayz-ai/core'\nimport { DatePicker } from '../primitives/date-picker'\nimport { DropdownItem, DropdownSeparator } from '../primitives/dropdown'\nimport { RangeControl } from '../primitives/page-toolbar'\nimport { resolveRangePreset, type AnalyticsRangePreset } from './range'\n\n// ---------------------------------------------------------------------------\n// O controle de período, sem contexto.\n//\n// Ele nasceu dentro do AnalyticsControls e só servia a quem estivesse dentro do\n// AnalyticsContextProvider. Isso deixava qualquer outra tela com duas saídas\n// ruins: copiar o componente (e ver as duas cópias divergirem na primeira\n// mudança) ou desenhar dois `<input type=date>` crus, que é o que o RH tinha —\n// sem presets, sem a janela resolvida escrita, sem a trava de início depois do\n// fim.\n//\n// Aqui ele recebe `value`/`onChange` e mais nada. O AnalyticsControls passou a\n// ser um consumidor como outro qualquer, e a barra continua idêntica porque é\n// literalmente o mesmo componente.\n// ---------------------------------------------------------------------------\n\nexport const DATE_RANGE_PRESETS: AnalyticsRangePreset[] = [\n 'today', 'yesterday', 'last_7_days', 'last_30_days', 'last_90_days',\n 'this_month', 'last_month', 'this_year',\n]\n\nexport interface DateRangeControlProps {\n value: AnalyticsDateRange\n onChange: (range: AnalyticsDateRange) => void\n /** Qual preset está ativo. `custom` abre os dois seletores de data. */\n preset?: AnalyticsRangePreset | 'custom'\n onPresetChange?: (preset: AnalyticsRangePreset | 'custom') => void\n presets?: AnalyticsRangePreset[]\n}\n\nfunction formatSpan(from: string, to: string, locale: string): string {\n const fmt = new Intl.DateTimeFormat(locale, { day: '2-digit', month: 'short' })\n const a = fmt.format(new Date(`${from}T12:00:00`))\n const b = fmt.format(new Date(`${to}T12:00:00`))\n return a === b ? a : `${a} – ${b}`\n}\n\nexport function DateRangeControl({\n value, onChange, preset = 'custom', onPresetChange, presets = DATE_RANGE_PRESETS,\n}: DateRangeControlProps) {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const custom = preset === 'custom'\n\n const pick = (p: AnalyticsRangePreset) => {\n onPresetChange?.(p)\n onChange(resolveRangePreset(p))\n }\n\n return (\n <RangeControl\n options={presets.map((p) => ({ value: p, label: t(`analytics.range.${p}`) }))}\n value={preset}\n onChange={(p) => pick(p as AnalyticsRangePreset)}\n label={custom ? t('analytics.range.custom') : undefined}\n // A janela resolvida, sempre. O nome do preset sozinho deixa quem lê\n // adivinhando se \"este mês\" já inclui hoje.\n span={custom ? undefined : formatSpan(value.from, value.to, locale)}\n extra={\n <>\n <DropdownSeparator />\n <DropdownItem onSelect={() => { onPresetChange?.('custom'); onChange({ ...value }) }}>\n {t('analytics.range.custom')}\n {custom ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n </>\n }\n >\n {custom ? (\n <>\n <DatePicker\n variant=\"toolbar\"\n value={value.from}\n // Início depois do fim não é um período, é uma resposta vazia que a\n // tela renderizaria como \"sem dados\". Arrastar um além do outro\n // move o outro junto.\n onChange={(from) => onChange({ from, to: from > value.to ? from : value.to })}\n />\n <span className=\"text-xs text-muted-foreground\">–</span>\n <DatePicker\n variant=\"toolbar\"\n value={value.to}\n onChange={(to) => onChange({ from: to < value.from ? to : value.from, to })}\n />\n </>\n ) : null}\n </RangeControl>\n )\n}\n","import { create } from 'zustand'\nimport type { PracticeStep } from './types'\n\n/**\n * Practice mode — the second half of a guided feature.\n *\n * The tour DRIVES: a cursor walks the person to the create screen. Practice\n * WATCHES: numbered footprints pin to the real fields and the person fills them\n * in themselves, each ticking as they go, the last one (Save) raining confetti.\n * Watching teaches where things are; doing teaches how — this is the doing.\n *\n * A step is \"done\" the first time the person interacts inside its anchor\n * (types, picks, clicks). Interaction, not a value check: it is robust across\n * every field kind, and the goal is to fix the SEQUENCE in muscle memory, not\n * to validate the form (the form validates itself on save).\n */\n\nexport type { PracticeStep }\n\nexport interface PracticeState {\n title: string | null\n steps: PracticeStep[]\n /** Anchors already done, in the order they were completed. */\n done: string[]\n start: (title: string, steps: PracticeStep[]) => void\n markDone: (anchor: string) => void\n stop: () => void\n}\n\nexport const usePracticeStore = create<PracticeState>((set, get) => ({\n title: null,\n steps: [],\n done: [],\n\n start: (title, steps) => {\n if (!steps.length) return\n set({ title, steps, done: [] })\n },\n\n markDone: (anchor) => {\n const { steps, done } = get()\n if (!steps.some((s) => s.anchor === anchor)) return\n if (done.includes(anchor)) return\n set({ done: [...done, anchor] })\n },\n\n stop: () => set({ title: null, steps: [], done: [] }),\n}))\n\n/** The next footprint the person should touch — the first not-done step. */\nexport function nextPracticeStep(steps: PracticeStep[], done: string[]): PracticeStep | undefined {\n return steps.find((s) => !done.includes(s.anchor))\n}\n","import { create } from 'zustand'\nimport type { TourDef, TourStopDef } from './types'\nimport { usePracticeStore } from './practice.store'\n\n/**\n * The running tour.\n *\n * A store rather than a provider because everything that starts a tour is\n * somewhere else: a checklist item in the rail, the agent's tool executor, a\n * \"show me how\" link inside an empty state. None of them share a React parent\n * with the overlay, and threading a callback through the shell to reach them\n * would put the tour in the shell's props forever.\n */\n\n/** Set by the host once — the tour cannot know an app's router. */\nlet navigator: ((path: string) => void) | undefined\nexport function setTourNavigator(fn: ((path: string) => void) | undefined): void {\n navigator = fn\n}\nexport function getTourNavigator(): ((path: string) => void) | undefined {\n return navigator\n}\n\nexport interface TourState {\n tour: TourDef | null\n index: number\n /** Why the last tour ended — read by whoever started it (the agent reports back). */\n lastOutcome: { tourId: string; completed: boolean } | null\n /** The most recent tour, running or not — what \"restart\" restarts. */\n lastTour: TourDef | null\n start: (tour: TourDef) => void\n next: () => void\n prev: () => void\n goTo: (index: number) => void\n /** `completed` distinguishes finishing from skipping; both close the overlay. */\n stop: (completed?: boolean) => void\n /** Start the last tour over from stop 1 — running (reset) or ended (revive). */\n restart: () => void\n}\n\nexport const useTourStore = create<TourState>((set, get) => ({\n tour: null,\n index: 0,\n lastOutcome: null,\n lastTour: null,\n\n start: (tour) => {\n if (!tour.stops.length) return\n // A fresh guided run clears any practice left over from a previous one the\n // person walked away from — otherwise its footprints would linger under the\n // new tour.\n usePracticeStore.getState().stop()\n set({ tour, index: 0, lastOutcome: null, lastTour: tour })\n },\n\n next: () => {\n const { tour, index } = get()\n if (!tour) return\n if (index >= tour.stops.length - 1) {\n // The tour arrived. If it carries practice, hand off to it instead of\n // ending here: the person is on the form and now fills it themselves.\n if (tour.practice?.length) {\n usePracticeStore.getState().start(tour.title ?? '', tour.practice)\n }\n get().stop(true)\n return\n }\n set({ index: index + 1 })\n },\n\n prev: () => set((s) => ({ index: Math.max(0, s.index - 1) })),\n\n goTo: (index) => set((s) => (s.tour ? { index: Math.min(Math.max(0, index), s.tour.stops.length - 1) } : s)),\n\n stop: (completed = false) =>\n set((s) => ({\n tour: null,\n index: 0,\n lastOutcome: s.tour ? { tourId: s.tour.id, completed } : s.lastOutcome,\n })),\n\n restart: () => {\n const t = get().lastTour\n if (t) get().start(t)\n },\n}))\n\n/** The stop on screen right now, if any. */\nexport function currentStop(state: TourState): TourStopDef | undefined {\n return state.tour?.stops[state.index]\n}\n","/**\n * Confetti — the reward at the end of a tour, dependency-free.\n *\n * A short burst on a full-screen canvas that removes itself. No library: the\n * ui package ships in every app and this is ~40 lines of physics. Honours\n * reduced-motion by doing nothing. Deterministic-ish randomness seeded off the\n * call time is fine — this is decoration, never resumed.\n */\nexport function fireConfetti(opts?: { origin?: { x: number; y: number }; count?: number; fromBottom?: boolean }): void {\n if (typeof document === 'undefined') return\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches) return\n\n const canvas = document.createElement('canvas')\n const dpr = window.devicePixelRatio || 1\n const w = window.innerWidth\n const h = window.innerHeight\n canvas.width = w * dpr\n canvas.height = h * dpr\n canvas.style.cssText = `position:fixed;inset:0;width:${w}px;height:${h}px;pointer-events:none;z-index:200`\n document.body.appendChild(canvas)\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n canvas.remove()\n return\n }\n ctx.scale(dpr, dpr)\n\n // Reads the running theme so the burst is on-brand, not a fixed rainbow.\n const css = getComputedStyle(document.documentElement)\n const prim = (css.getPropertyValue('--primary') || '35 92% 50%').trim()\n const colors = [`hsl(${prim})`, '#22c55e', '#f59e0b', '#ec4899', '#3b82f6', '#ffffff']\n\n const n = opts?.count ?? 130\n const rnd = (a: number, b: number) => a + Math.random() * (b - a)\n const fromBottom = !!opts?.fromBottom\n\n // Two launch styles: a burst OUT of one point (a control they just used), or\n // a curtain rising off the WHOLE bottom edge (the finale). The finale reads\n // as \"the screen itself is celebrating\", not \"that button popped\".\n const ox = opts?.origin?.x ?? w / 2\n const oy = opts?.origin?.y ?? h * 0.32\n\n const parts = Array.from({ length: fromBottom ? Math.max(n, 180) : n }, () => {\n if (fromBottom) {\n return {\n x: rnd(0, w),\n y: h + rnd(0, 40),\n vx: rnd(-3, 3),\n vy: -rnd(13, 22), // straight up, hard\n rot: rnd(0, Math.PI * 2),\n vr: rnd(-0.3, 0.3),\n size: rnd(6, 12),\n color: colors[(Math.random() * colors.length) | 0],\n life: 0,\n }\n }\n const angle = rnd(-Math.PI, 0) // upward fan\n const speed = rnd(6, 15)\n return {\n x: ox,\n y: oy,\n vx: Math.cos(angle) * speed * rnd(0.6, 1.4),\n vy: Math.sin(angle) * speed - rnd(2, 6),\n rot: rnd(0, Math.PI * 2),\n vr: rnd(-0.3, 0.3),\n size: rnd(6, 11),\n color: colors[(Math.random() * colors.length) | 0],\n life: 0,\n }\n })\n\n const GRAVITY = 0.32\n const DRAG = 0.99\n const MAX_LIFE = 140\n let raf = 0\n\n const tick = () => {\n ctx.clearRect(0, 0, w, h)\n let alive = 0\n for (const p of parts) {\n if (p.life > MAX_LIFE) continue\n alive++\n p.life++\n p.vx *= DRAG\n p.vy = p.vy * DRAG + GRAVITY\n p.x += p.vx\n p.y += p.vy\n p.rot += p.vr\n const fade = Math.max(0, 1 - p.life / MAX_LIFE)\n ctx.save()\n ctx.translate(p.x, p.y)\n ctx.rotate(p.rot)\n ctx.globalAlpha = fade\n ctx.fillStyle = p.color\n ctx.fillRect(-p.size / 2, -p.size / 2, p.size, p.size * 0.6)\n ctx.restore()\n }\n if (alive > 0) {\n raf = requestAnimationFrame(tick)\n } else {\n cancelAnimationFrame(raf)\n canvas.remove()\n }\n }\n raf = requestAnimationFrame(tick)\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { useTourStore, getTourNavigator } from './tour.store'\nimport { usePracticeStore } from './practice.store'\nimport { fireConfetti } from './confetti'\n\nexport interface TourSpotlightProps {\n labels?: Partial<typeof DEFAULT_LABELS>\n className?: string\n}\n\nconst DEFAULT_LABELS = {\n next: 'Próximo',\n waiting: 'Faça agora — eu espero',\n back: 'Voltar',\n done: 'Entendi',\n skip: 'Pular',\n stepOf: '{current} de {total}',\n notFound: 'Essa parte não está nesta tela — siga em frente que eu te mostro depois.',\n}\n\n/** Padding around the highlighted element, so the ring never touches the label. */\n// `~=` and not `=`: one element may answer to SEVERAL anchors — the caret that\n// hides an action menu stands in for every action folded behind it — so the\n// attribute is a whitespace-separated list, matched the way `class` is.\nconst PAD = 8\n/** How long we wait for a stop's anchor to appear before giving up on it. */\nconst ANCHOR_TIMEOUT_MS = 4000\nconst BUBBLE_WIDTH = 300\nconst GAP = 14\n\ninterface Rect { top: number; left: number; width: number; height: number }\n\nfunction readRect(el: Element): Rect {\n const r = el.getBoundingClientRect()\n return { top: r.top - PAD, left: r.left - PAD, width: r.width + PAD * 2, height: r.height + PAD * 2 }\n}\n\n/** How long the cursor takes to travel between two stops. The ring and the\n * bubble wait for it: the pointer arriving IS the reveal. */\nconst CURSOR_TRAVEL_MS = 650\n\ninterface Point { x: number; y: number }\n\n/** Where the cursor lands: past the middle of the target, the way a hand\n * points at a control rather than covering its label. */\nfunction pointFor(rect: Rect): Point {\n return { x: rect.left + rect.width * 0.62, y: rect.top + rect.height * 0.62 }\n}\n\nfunction prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/**\n * How much of the RIGHT edge the overlay must leave alone.\n *\n * An element marked `data-tour-exempt` — the assistant's docked column — stays\n * outside the dim entirely: the person reads the narration and can even type\n * back while the light walks the rest of the screen. Only a right-docked\n * COLUMN counts: touching the right edge, tall, and narrower than the screen —\n * a full-screen sheet (the mobile chat) exempting itself would delete the\n * overlay instead.\n */\nfunction exemptRightInset(): number {\n if (typeof document === 'undefined') return 0\n let inset = 0\n for (const el of Array.from(document.querySelectorAll('[data-tour-exempt]'))) {\n const r = el.getBoundingClientRect()\n if (r.width === 0 || r.height === 0) continue\n if (r.right < window.innerWidth - 8) continue\n if (r.width > window.innerWidth * 0.7) continue\n if (r.height < window.innerHeight * 0.5) continue\n inset = Math.max(inset, window.innerWidth - r.left)\n }\n return Math.round(inset)\n}\n\n/**\n * The tour overlay: dim everything, cut a hole around one element, and put a\n * label next to it.\n *\n * The hole is FOUR dim panels rather than one panel with a mask, and that is the\n * whole trick: a masked overlay still swallows the click, so the \"click New\n * product\" stop would highlight a button nobody could press. With four panels\n * the hole is genuinely empty — the element underneath stays live, and somebody\n * being taught to use the app can actually use it while being taught.\n *\n * Mounted once by the shell. It renders nothing until a tour is running.\n */\nexport function TourSpotlight({ labels, className }: TourSpotlightProps) {\n const l = { ...DEFAULT_LABELS, ...labels }\n const tour = useTourStore((s) => s.tour)\n const index = useTourStore((s) => s.index)\n const next = useTourStore((s) => s.next)\n const prev = useTourStore((s) => s.prev)\n const stop = useTourStore((s) => s.stop)\n const lastOutcome = useTourStore((s) => s.lastOutcome)\n\n // The reward: a burst when a tour is FINISHED (not skipped). Keyed on the\n // outcome object so it fires once per completion, from the last anchor's\n // position so the confetti erupts out of the thing they just did.\n const firedFor = React.useRef<string | null>(null)\n React.useEffect(() => {\n if (!lastOutcome?.completed) return\n if (firedFor.current === lastOutcome.tourId) return\n firedFor.current = lastOutcome.tourId\n // A tour that hands off to practice is not the finale — the practice run\n // owns the celebration, at the bottom of the screen, once they SAVE.\n if (usePracticeStore.getState().steps.length > 0) return\n const origin = rect\n ? { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }\n : undefined\n fireConfetti({ origin })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lastOutcome])\n\n const stopDef = tour?.stops[index]\n const [rect, setRect] = React.useState<Rect | null>(null)\n const [missing, setMissing] = React.useState(false)\n // The big pointer that carries the person from stop to stop. `arrived` gates\n // the ring and the bubble: nothing is revealed until the cursor got there,\n // so the eye follows one moving thing instead of three appearing ones.\n const [cursor, setCursor] = React.useState<Point | null>(null)\n const [arrived, setArrived] = React.useState(false)\n // The person took the control: focus or a click landed INSIDE the anchored\n // element. The overlay steps back — the dim goes soft and click-through, the\n // bubble and the cursor get out of the way — because a dropdown that opens\n // from the highlighted field spills outside the hole, and a dim that eats\n // that click turns the lesson into a cage. Engaged is not done: leaving\n // focus brings the tour back where it was.\n const [engaged, setEngaged] = React.useState(false)\n const [rightInset, setRightInset] = React.useState(0)\n\n // The exempt column can open, close or resize mid-tour (the assistant panel\n // is exactly the thing likely to be doing both), so this is polled, cheap,\n // and only while a tour is running.\n React.useEffect(() => {\n if (!tour) return\n const sync = () => setRightInset(exemptRightInset())\n sync()\n const interval = window.setInterval(sync, 500)\n window.addEventListener('resize', sync)\n return () => {\n window.clearInterval(interval)\n window.removeEventListener('resize', sync)\n }\n }, [tour?.id])\n\n // Navigate first, then hunt for the anchor. Both halves live in one effect\n // because the hunt has to restart when the route lands, and a stop whose\n // element is still being fetched is normal — it is a page that just mounted.\n React.useEffect(() => {\n if (!stopDef) return\n setRect(null)\n setMissing(false)\n setArrived(false)\n setEngaged(false)\n\n if (stopDef.route) getTourNavigator()?.(stopDef.route)\n\n let raf = 0\n let travel = 0\n const deadline = Date.now() + ANCHOR_TIMEOUT_MS\n const hunt = () => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(stopDef.anchor)}\"]`)\n if (el) {\n el.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'smooth' })\n const found = readRect(el)\n const land = () => {\n // Re-measure on landing: smooth scrollIntoView may still have been\n // travelling when the anchor was first found.\n const at = document.querySelector(`[data-tour~=\"${CSS.escape(stopDef.anchor)}\"]`)\n const settled = at ? readRect(at) : found\n setRect(settled)\n setCursor(pointFor(settled))\n setArrived(true)\n }\n if (prefersReducedMotion()) {\n land()\n return\n }\n // The cursor departs from wherever it was — the previous stop, or the\n // middle of the screen on the first one. A first flight needs a painted\n // frame at the origin before the target is set, or the CSS transition\n // has nothing to travel from.\n setCursor((prev) => prev ?? { x: window.innerWidth / 2, y: window.innerHeight / 2 })\n raf = requestAnimationFrame(() => {\n raf = requestAnimationFrame(() => setCursor(pointFor(found)))\n })\n travel = window.setTimeout(land, CURSOR_TRAVEL_MS + 40)\n return\n }\n if (Date.now() > deadline) {\n setMissing(true)\n return\n }\n raf = requestAnimationFrame(hunt)\n }\n raf = requestAnimationFrame(hunt)\n return () => {\n cancelAnimationFrame(raf)\n window.clearTimeout(travel)\n }\n }, [stopDef?.anchor, stopDef?.route, tour?.id])\n\n // Follow the element: a sticky header that collapses on scroll, a sidebar\n // that finishes its transition, a table that finishes loading — all of them\n // move the target after the first measurement.\n //\n // And notice when it LEAVES. On a handover stop the control disappearing is\n // the whole point: they clicked it, the form opened, and the light is now\n // ringing an empty rectangle with no \"next\" button under it — which is where\n // this got stuck the first time somebody used it. Gone means done; the\n // overlay steps aside and the run keeps waiting on the sensor.\n React.useEffect(() => {\n if (!stopDef || missing || !arrived) return\n const anchor = stopDef.anchor\n const handover = Boolean(stopDef.waitForUser)\n let frame = 0\n let absent = 0\n const sync = () => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(anchor)}\"]`)\n if (el) {\n absent = 0\n const r = readRect(el)\n setRect(r)\n setCursor(pointFor(r))\n return\n }\n if (!handover) return\n // A couple of beats, not one: a re-render can drop the node for a frame,\n // and stepping aside on that would look like the tour giving up.\n absent += 1\n if (absent >= 3) stop(false)\n }\n const onFrame = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(sync)\n }\n window.addEventListener('scroll', onFrame, true)\n window.addEventListener('resize', onFrame)\n const interval = window.setInterval(sync, 400)\n return () => {\n cancelAnimationFrame(frame)\n window.clearInterval(interval)\n window.removeEventListener('scroll', onFrame, true)\n window.removeEventListener('resize', onFrame)\n }\n }, [stopDef?.anchor, stopDef?.waitForUser, missing, arrived, stop])\n\n // A tour that ended takes its pointer with it; the next one departs fresh\n // from the middle of the screen, not from wherever the last one died.\n React.useEffect(() => {\n if (tour) return\n setCursor(null)\n setArrived(false)\n setRect(null)\n setMissing(false)\n }, [tour])\n\n // Two ways the person touches the highlighted control, two different moves:\n //\n // • A FIELD (input, select, contenteditable) — they are WORKING in it. The\n // overlay retreats (engaged) and comes back when focus leaves. Moving\n // between the field and its own dropdown never flickers, because leaving\n // is decided by where focus LANDS, a tick later.\n // • Anything else (a button, a tab, a nav row) — the click IS the lesson\n // done. The tour advances by itself; a \"Próximo\" that asks them to\n // confirm a click they already made is homework about homework.\n React.useEffect(() => {\n // No `arrived` gate on purpose: an eager person clicks the highlighted\n // control before the cursor finishes its glide, and that click must still\n // advance the tour (and trigger the practice handoff). Requiring arrival\n // dropped those clicks on the floor and left the tour stuck at the door.\n if (!stopDef || missing) return\n const anchor = stopDef.anchor\n const within = (node: EventTarget | null): boolean => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(anchor)}\"]`)\n return !!el && node instanceof Node && el.contains(node)\n }\n const editable = (node: EventTarget | null): boolean =>\n node instanceof Element && !!node.closest('input, textarea, select, [contenteditable=\"true\"]')\n const onDown = (e: Event) => {\n if (!within(e.target)) return\n if (editable(e.target)) setEngaged(true)\n }\n const onFocus = (e: Event) => {\n if (within(e.target) && editable(e.target)) setEngaged(true)\n }\n const onClick = (e: Event) => {\n if (!within(e.target) || editable(e.target)) return\n // Advancing past the end completes — `next()` already folds that in.\n // On a handover stop the click may ALSO make the target vanish; the\n // absence watcher and this race benignly: both end at the same place.\n useTourStore.getState().next()\n }\n const onOut = () => {\n window.setTimeout(() => {\n if (!within(document.activeElement)) setEngaged(false)\n }, 0)\n }\n document.addEventListener('pointerdown', onDown, true)\n document.addEventListener('focusin', onFocus, true)\n document.addEventListener('click', onClick, true)\n document.addEventListener('focusout', onOut, true)\n return () => {\n document.removeEventListener('pointerdown', onDown, true)\n document.removeEventListener('focusin', onFocus, true)\n document.removeEventListener('click', onClick, true)\n document.removeEventListener('focusout', onOut, true)\n }\n }, [stopDef?.anchor, missing])\n\n React.useEffect(() => {\n if (!tour) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') stop(false)\n if (e.key === 'ArrowRight' && !tour.stops[index]?.waitForUser) next()\n if (e.key === 'ArrowLeft') prev()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [tour, index, next, prev, stop])\n\n if (!tour || !stopDef || typeof document === 'undefined') return null\n\n const total = tour.stops.length\n const isLast = index === total - 1\n const bubble = placeBubble(rect, stopDef.placement, rightInset)\n\n const body = (\n // `right` leaves the exempt column (the assistant narrating this tour)\n // outside the overlay entirely — bright, readable, clickable.\n <div\n className={cn('pointer-events-none fixed inset-y-0 left-0 z-[120]', className)}\n style={{ right: rightInset }}\n role=\"dialog\"\n aria-modal=\"false\"\n >\n {rect && !missing ? (\n <>\n {/* Four panels, not a mask — the hole has to be a real hole. While\n the person is USING the control, all four go soft: a dropdown\n that opens from the field spills past the hole, and the dim must\n neither cover it nor eat the click that picks an option.\n\n Clicking the dim does NOTHING on purpose. It used to skip the\n tour, and that was the number-one \"it stopped by itself\": any\n stray click outside the hole killed the run silently. Leaving is\n explicit now — the X, Escape, or \"Encerrar\" on the badge. */}\n <Dim soft={engaged} style={{ top: 0, left: 0, width: '100%', height: Math.max(0, rect.top) }} />\n <Dim soft={engaged} style={{ top: rect.top, left: 0, width: Math.max(0, rect.left), height: rect.height }} />\n <Dim soft={engaged} style={{ top: rect.top, left: rect.left + rect.width, right: 0, height: rect.height }} />\n <Dim soft={engaged} style={{ top: rect.top + rect.height, left: 0, width: '100%', bottom: 0 }} />\n <div\n aria-hidden\n className=\"fz-spotlight-ring pointer-events-none absolute motion-safe:transition-[top,left,width,height] motion-safe:duration-300\"\n style={{ top: rect.top, left: rect.left, width: rect.width, height: rect.height }}\n />\n </>\n ) : (\n <Dim style={{ inset: 0 }} />\n )}\n\n {cursor && !missing && !engaged && (\n <div\n aria-hidden\n className={cn(\n 'fz-tour-cursor',\n !arrived && 'fz-tour-cursor-travel',\n arrived && 'fz-tour-cursor-arrived',\n arrived && stopDef.waitForUser && 'fz-tour-cursor-nudge',\n )}\n style={{ transform: `translate3d(${cursor.x}px, ${cursor.y}px, 0)` }}\n >\n {/* A filled pointer, tip at the translate origin. Primary-coloured with\n a white outline so it reads on the dim AND inside the bright hole. */}\n <svg width=\"34\" height=\"34\" viewBox=\"0 0 24 24\" fill=\"hsl(var(--primary))\" stroke=\"white\" strokeWidth=\"1.4\" strokeLinejoin=\"round\">\n <path d=\"M5.5 3.2v17.6c0 .45.54.67.85.35l4.4-4.4a.5.5 0 0 1 .36-.15h6.24c.45 0 .67-.54.35-.85L6.35 2.85a.5.5 0 0 0-.85.35Z\" />\n </svg>\n </div>\n )}\n\n {(arrived || missing) && !engaged && (\n <div\n className={cn(\n 'pointer-events-auto absolute w-[300px] max-w-[calc(100vw-24px)] rounded-xl border border-border bg-popover p-4 text-popover-foreground shadow-2xl',\n 'motion-safe:animate-in motion-safe:fade-in motion-safe:zoom-in-95 motion-safe:duration-200',\n )}\n style={bubble}\n >\n <button\n type=\"button\"\n onClick={() => stop(false)}\n aria-label={l.skip}\n className=\"absolute right-2 top-2 rounded-md p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n <p className=\"pr-6 text-sm font-semibold leading-snug\">{stopDef.title}</p>\n {(missing ? l.notFound : stopDef.body) && (\n <p className=\"mt-1.5 text-[13px] leading-relaxed text-muted-foreground\">\n {missing ? l.notFound : stopDef.body}\n </p>\n )}\n <div className=\"mt-3 flex items-center gap-2\">\n <span className=\"text-[11px] tabular-nums text-muted-foreground\">\n {l.stepOf.replace('{current}', String(index + 1)).replace('{total}', String(total))}\n </span>\n <span className=\"flex-1\" />\n {/* A handover stop has no \"next\": the person is meant to use the\n control under the light, and the tour moves when the work lands.\n Offering a button here is what turns a walkthrough into a slide\n deck somebody clicks past. */}\n {stopDef.waitForUser && (\n <span className=\"inline-flex items-center gap-1.5 text-[12px] font-medium text-primary\">\n <span className=\"relative flex h-1.5 w-1.5\">\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-primary/70\" />\n <span className=\"relative inline-flex h-1.5 w-1.5 rounded-full bg-primary\" />\n </span>\n {l.waiting}\n </span>\n )}\n {index > 0 && !stopDef.waitForUser && (\n <button\n type=\"button\"\n onClick={prev}\n className=\"rounded-button px-2.5 py-1.5 text-[12.5px] font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {l.back}\n </button>\n )}\n {!stopDef.waitForUser && (\n <button\n type=\"button\"\n onClick={next}\n className=\"rounded-button bg-primary px-3 py-1.5 text-[12.5px] font-semibold text-primary-foreground shadow-button-primary transition-colors hover:bg-primary/90\"\n >\n {isLast ? l.done : l.next}\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n )\n\n return createPortal(body, document.body)\n}\n\n/**\n * One quarter of the dim.\n *\n * The colour is an inline style rather than a utility class on purpose: this\n * overlay is the whole affordance, and a Tailwind build that does not happen to\n * scan this file would drop the class and leave a tour that highlights nothing\n * — silently, with no error. Nothing here is themeable anyway; a scrim is a\n * scrim in both palettes.\n */\nfunction Dim({ style, soft }: { style: React.CSSProperties; soft?: boolean }) {\n return (\n <div\n className={cn(\n 'absolute motion-safe:transition-all motion-safe:duration-300',\n // Hard dim still swallows the click (so a stray click cannot press a\n // covered button) — it just no longer STOPS the tour. Soft is fully\n // click-through: the person is working inside the hole's overflow.\n soft ? 'pointer-events-none' : 'pointer-events-auto',\n )}\n style={{ backgroundColor: soft ? 'rgb(0 0 0 / 0.12)' : 'rgb(0 0 0 / 0.55)', ...style }}\n />\n )\n}\n\n/**\n * Where the label goes. Below the target by default, above when there is no\n * room below, and dead centre when there is no target at all.\n */\nfunction placeBubble(rect: Rect | null, placement: string | undefined, rightInset = 0): React.CSSProperties {\n if (typeof window === 'undefined' || !rect) {\n return { top: '50%', left: '50%', transform: 'translate(-50%, -50%)' }\n }\n // The bubble is positioned inside the overlay, whose right edge stops at the\n // exempt column — clamp against the overlay's width, not the window's.\n const vw = window.innerWidth - rightInset\n const vh = window.innerHeight\n const belowRoom = vh - (rect.top + rect.height)\n const rightRoom = vw - (rect.left + rect.width)\n\n let side = placement && placement !== 'auto' ? placement : belowRoom > 220 ? 'bottom' : rect.top > 220 ? 'top' : rightRoom > 340 ? 'right' : 'left'\n if (side === 'bottom' && belowRoom < 180) side = 'top'\n if (side === 'top' && rect.top < 180) side = 'bottom'\n\n const clampX = (x: number) => Math.min(Math.max(12, x), Math.max(12, vw - BUBBLE_WIDTH - 12))\n const clampY = (y: number) => Math.min(Math.max(12, y), Math.max(12, vh - 190))\n\n switch (side) {\n case 'top':\n return { left: clampX(rect.left + rect.width / 2 - BUBBLE_WIDTH / 2), bottom: Math.max(12, vh - rect.top + GAP) }\n case 'left':\n return { left: Math.max(12, rect.left - BUBBLE_WIDTH - GAP), top: clampY(rect.top) }\n case 'right':\n return { left: clampX(rect.left + rect.width + GAP), top: clampY(rect.top) }\n default:\n return { left: clampX(rect.left + rect.width / 2 - BUBBLE_WIDTH / 2), top: clampY(rect.top + rect.height + GAP) }\n }\n}\n","/**\n * Tour shapes.\n *\n * Mirrors `TourDef` in @fayz-ai/core so the UI kit stays importable on its own\n * (it does not depend on core), and so a plugin's declared tour and a tour the\n * agent invents at runtime are the same object.\n */\nexport interface TourStopDef {\n /** Matches `data-tour=\"<anchor>\"` in the document. */\n anchor: string\n title: string\n body?: string\n /** Navigate here before looking for the anchor. */\n route?: string\n placement?: 'top' | 'bottom' | 'left' | 'right' | 'auto'\n /** Wait for the person to use the control instead of offering \"next\". */\n waitForUser?: boolean\n}\n\n/**\n * A field the person fills themselves after the tour drops them on the form.\n * The one canonical shape for a practice footprint in the UI kit; `practice.store`\n * and `PracticeOverlay` use this, and @fayz-ai/core mirrors it as `PracticeAction`.\n */\nexport interface PracticeStep {\n anchor: string\n label: string\n /** Completing this ends practice and fires the finale. */\n final?: boolean\n}\n\nexport interface TourDef {\n id: string\n title?: string\n stops: TourStopDef[]\n /**\n * What to do AFTER the tour arrives. The stops walk them to the create\n * screen; these footprints let them fill it in themselves, ticking as they\n * go. Completing the whole tour hands off to practice instead of just ending.\n */\n practice?: PracticeStep[]\n}\n\n/** Spread onto the element a tour points at: `<Button {...tourAnchor('shop.new')} />`. */\nexport function tourAnchor(anchor: string): { 'data-tour': string } {\n return { 'data-tour': anchor }\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { Check } from 'lucide-react'\nimport { usePracticeStore, nextPracticeStep } from './practice.store'\nimport { fireConfetti } from './confetti'\n\n/**\n * The footprints. No dim, no cursor — the person is DRIVING now. Each field\n * wears a numbered badge that turns into a check the moment they touch it; the\n * one they should touch next pulses. Filling the last (Save) rains confetti\n * from the bottom of the whole screen.\n *\n * Mounted once by the shell, next to TourSpotlight. Renders nothing until a\n * practice run is active.\n */\nexport function PracticeOverlay() {\n const title = usePracticeStore((s) => s.title)\n const steps = usePracticeStore((s) => s.steps)\n const done = usePracticeStore((s) => s.done)\n const markDone = usePracticeStore((s) => s.markDone)\n const stop = usePracticeStore((s) => s.stop)\n\n const active = !!title && steps.length > 0\n const next = active ? nextPracticeStep(steps, done) : undefined\n\n // Where each badge sits — the top-left corner of its anchor, re-measured on\n // scroll/resize/mutation so it rides the field.\n const [rects, setRects] = React.useState<Record<string, { top: number; left: number } | null>>({})\n React.useEffect(() => {\n if (!active) return\n const measure = () => {\n const out: Record<string, { top: number; left: number } | null> = {}\n for (const s of steps) {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(s.anchor)}\"]`)\n if (el) {\n const r = el.getBoundingClientRect()\n out[s.anchor] = { top: r.top, left: r.left }\n } else {\n out[s.anchor] = null\n }\n }\n setRects(out)\n }\n measure()\n const interval = window.setInterval(measure, 300)\n window.addEventListener('scroll', measure, true)\n window.addEventListener('resize', measure)\n return () => {\n window.clearInterval(interval)\n window.removeEventListener('scroll', measure, true)\n window.removeEventListener('resize', measure)\n }\n }, [active, steps])\n\n // Interaction inside an anchor marks its step done. `pointerdown` + `input` +\n // `change` cover a picker, a text field and a chip alike.\n React.useEffect(() => {\n if (!active) return\n const within = (anchor: string, node: EventTarget | null): boolean => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(anchor)}\"]`)\n return !!el && node instanceof Node && el.contains(node)\n }\n const hit = (e: Event) => {\n for (const s of steps) {\n if (done.includes(s.anchor)) continue\n if (within(s.anchor, e.target)) {\n markDone(s.anchor)\n break\n }\n }\n }\n document.addEventListener('pointerdown', hit, true)\n document.addEventListener('input', hit, true)\n document.addEventListener('change', hit, true)\n return () => {\n document.removeEventListener('pointerdown', hit, true)\n document.removeEventListener('input', hit, true)\n document.removeEventListener('change', hit, true)\n }\n }, [active, steps, done, markDone])\n\n // The finale: when the final step is marked done, celebrate and end. Guarded\n // so it fires once.\n const finaleFired = React.useRef(false)\n React.useEffect(() => {\n if (!active) {\n finaleFired.current = false\n return\n }\n const finalStep = steps.find((s) => s.final) ?? steps[steps.length - 1]\n if (finalStep && done.includes(finalStep.anchor) && !finaleFired.current) {\n finaleFired.current = true\n fireConfetti({ fromBottom: true })\n // Leave the board up a beat so the last check is seen, then clear.\n window.setTimeout(() => stop(), 1400)\n }\n }, [active, done, steps, stop])\n\n if (!active || typeof document === 'undefined') return null\n\n const body = (\n <div className=\"pointer-events-none fixed inset-0 z-[118]\">\n {steps.map((s, i) => {\n const rect = rects[s.anchor]\n if (!rect) return null\n const isDone = done.includes(s.anchor)\n const isNext = next?.anchor === s.anchor\n return (\n <Footprint key={s.anchor} n={i + 1} label={s.label} top={rect.top} left={rect.left} done={isDone} next={isNext} />\n )\n })}\n </div>\n )\n return createPortal(body, document.body)\n}\n\nfunction Footprint({ n, label, top, left, done, next }: { n: number; label: string; top: number; left: number; done: boolean; next: boolean }) {\n return (\n <div\n className=\"absolute flex items-center gap-1.5 transition-all duration-300\"\n // Perch on the field's top-left, nudged out so the badge sits in the\n // margin rather than over the label.\n style={{ top: Math.max(4, top - 12), left: Math.max(4, left - 12) }}\n >\n <span\n className={\n 'flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-[12px] font-bold shadow-lg ring-2 ring-background ' +\n (done\n ? 'bg-primary text-primary-foreground'\n : next\n ? 'fz-practice-pulse bg-primary text-primary-foreground'\n : 'bg-card text-foreground')\n }\n >\n {done ? <Check className=\"h-3.5 w-3.5\" /> : n}\n </span>\n {next && !done && (\n <span className=\"rounded-md bg-primary px-2 py-1 text-[11.5px] font-medium text-primary-foreground shadow-lg\">\n {label}\n </span>\n )}\n </div>\n )\n}\n"]}