@pythia-software/query-table-react 0.9.9 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useQueryFilters.ts","../src/useGrouping.ts","../src/useQueryTable.ts","../src/useItemDetails.ts","../src/usePropertyView.ts","../src/computedExecution.ts","../src/previewRows.ts","../src/useComputedColumns.ts","../src/formulaWorker.ts","../src/useRequestActivity.ts","../src/useAggregations.ts","../src/metricExecution.ts","../src/useSelection.ts","../src/useSelect.ts","../src/useColumnDrag.ts","../src/useSavedQueries.ts","../src/useQueryLinks.ts","../src/useObjectReferences.ts"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport {\n branchesOf,\n isOrGroup,\n isWhereConjunction,\n negateClause,\n opsForField,\n type FieldSchema,\n type WhereBranch,\n type WhereClause,\n type WhereTerm,\n} from \"@pythia-software/query-table-core\";\nimport type { QueryTableApi } from \"./useQueryTable\";\n\n/** Edit the `predIndex`-th literal of an OR of conjunctions, counted in\n * `predicatesOf` order; `edit` returning null removes it. Returns the term in\n * canonical form: a conjunction of one is its literal, a group of one branch\n * its literal(s), and an emptied group nothing. */\nfunction editBranchPredicate(\n term: { any: WhereBranch[] },\n predIndex: number,\n edit: (clause: WhereClause) => WhereClause | null,\n): WhereTerm[] {\n let k = 0;\n const any: WhereBranch[] = [];\n for (const member of term.any) {\n const kept: WhereClause[] = [];\n for (const clause of isWhereConjunction(member) ? member.all : [member]) {\n const next = k++ === predIndex ? edit(clause) : clause;\n if (next) kept.push(next);\n }\n if (kept.length === 1) any.push(kept[0]!);\n else if (kept.length > 1) any.push({ all: kept });\n }\n if (any.length > 1) return [{ any } as WhereTerm];\n const only = any[0];\n return !only ? [] : isWhereConjunction(only) ? only.all : [only];\n}\n\n/** Filter controls for either the result query or grouping's source query. */\nexport type QueryFilterApi<Row> = Pick<\n QueryTableApi<Row>,\n | \"query\"\n | \"setQuery\"\n | \"loading\"\n | \"addFilter\"\n | \"updateFilter\"\n | \"removeFilter\"\n | \"clearFilters\"\n | \"updatePredicate\"\n | \"removePredicate\"\n | \"negatePredicate\"\n | \"reorderFilters\"\n | \"mergeFilters\"\n | \"filterValues\"\n | \"fieldStats\"\n>;\n\n/** Bind filter intents to a query stage, including the source WHERE of grouping. */\nexport function useQueryFilters<Row>(\n schema: FieldSchema<Row>,\n setQuery: QueryTableApi<Row>[\"setQuery\"],\n) {\n const byName = useMemo(\n () => new Map(schema.fields.map((field) => [field.name, field])),\n [schema],\n );\n const addFilter = useCallback(\n (clause: WhereClause) =>\n setQuery((q) => ({ ...q, offset: 0, where: [...q.where, clause] })),\n [setQuery],\n );\n const updateFilter = useCallback(\n (index: number, clause: WhereClause) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n where: q.where.map((t, i) => (i === index ? clause : t)),\n })),\n [setQuery],\n );\n const removeFilter = useCallback(\n (index: number) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n where: q.where.filter((_, i) => i !== index),\n })),\n [setQuery],\n );\n const clearFilters = useCallback(\n () => setQuery((q) => ({ ...q, offset: 0, where: [] })),\n [setQuery],\n );\n\n const updatePredicate = useCallback<QueryTableApi<Row>[\"updatePredicate\"]>(\n (termIndex, predIndex, clause) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n where: q.where.map((term, i) => {\n if (i !== termIndex) return term;\n if (isOrGroup(term))\n return {\n any: term.any.map((c, j) => (j === predIndex ? clause : c)),\n };\n if (\"any\" in term) return editBranchPredicate(term, predIndex, () => clause);\n return clause;\n }).flat(),\n })),\n [setQuery],\n );\n const removePredicate = useCallback<QueryTableApi<Row>[\"removePredicate\"]>(\n (termIndex, predIndex) =>\n setQuery((q) => {\n const where: WhereTerm[] = [];\n q.where.forEach((term, i) => {\n if (i !== termIndex) {\n where.push(term);\n return;\n }\n if (isOrGroup(term)) {\n const members = term.any.filter((_, j) => j !== predIndex);\n if (members.length === 1) where.push(members[0]!);\n else if (members.length > 1) where.push({ any: members });\n return; // 0 members → drop the term\n }\n if (\"any\" in term) {\n where.push(...editBranchPredicate(term, predIndex, () => null));\n return;\n }\n // literal term → removing its predicate drops the whole term\n });\n return { ...q, offset: 0, where };\n }),\n [setQuery],\n );\n const negateOne = useCallback(\n (clause: WhereClause): WhereClause => {\n const field = byName.get(clause.field);\n return negateClause(clause, field ? opsForField(field) : undefined);\n },\n [byName],\n );\n const negatePredicate = useCallback<QueryTableApi<Row>[\"negatePredicate\"]>(\n (termIndex, predIndex) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n where: q.where.map((term, i) => {\n if (i !== termIndex) return term;\n if (isOrGroup(term))\n return {\n any: term.any.map((c, j) => (j === predIndex ? negateOne(c) : c)),\n };\n if (\"any\" in term) return editBranchPredicate(term, predIndex, negateOne);\n return negateOne(term);\n }).flat(),\n })),\n [setQuery, negateOne],\n );\n const reorderFilters = useCallback<QueryTableApi<Row>[\"reorderFilters\"]>(\n (fromIndex, toIndex) =>\n setQuery((q) => {\n if (fromIndex < 0 || fromIndex >= q.where.length) return q;\n const where = [...q.where];\n const [moved] = where.splice(fromIndex, 1);\n where.splice(Math.max(0, Math.min(toIndex, where.length)), 0, moved!);\n return { ...q, offset: 0, where };\n }),\n [setQuery],\n );\n const mergeFilters = useCallback<QueryTableApi<Row>[\"mergeFilters\"]>(\n (sourceIndex, targetIndex) =>\n setQuery((q) => {\n if (sourceIndex === targetIndex) return q;\n const source = q.where[sourceIndex];\n const target = q.where[targetIndex];\n if (!source || !target) return q;\n // OR the two terms' branches, so a conjunction stays one branch.\n const merged = {\n any: [...branchesOf(target), ...branchesOf(source)].map(\n (branch): WhereBranch => (branch.length === 1 ? branch[0]! : { all: branch }),\n ),\n } as WhereTerm;\n const where: WhereTerm[] = [];\n q.where.forEach((term, i) => {\n if (i === sourceIndex) return; // remove the dragged term\n where.push(i === targetIndex ? merged : term);\n });\n return { ...q, offset: 0, where };\n }),\n [setQuery],\n );\n return {\n addFilter,\n updateFilter,\n removeFilter,\n clearFilters,\n updatePredicate,\n removePredicate,\n negatePredicate,\n reorderFilters,\n mergeFilters,\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n groupKeyFields,\n MAX_SUMMARY_COLUMNS,\n normalizeQueryState,\n predicatesOf,\n withGroupingKeys,\n withoutGrouping,\n type FieldSchema,\n type GroupKey,\n type GroupedRow,\n type GroupingModel,\n queriesEqual,\n type GroupingView,\n type QueryState,\n type RepresentativeRow,\n type SelectColumn,\n type SummaryColumn,\n type SummaryOp,\n} from \"@pythia-software/query-table-core\";\nimport type { QueryFilterApi } from \"./useQueryFilters\";\nimport type { QueryTableApi } from \"./useQueryTable\";\n\n/** Source-stage controls. Rows/columns/metrics remain on the active result API. */\nexport type GroupingSourceApi<Row> = QueryFilterApi<Row> &\n Pick<QueryTableApi<Row>, \"itemDetails\" | \"rowId\"> & {\n schema: FieldSchema<Row>;\n };\n\nexport interface GroupingApi<Row> {\n inputsReady?: boolean;\n preview?: (query: QueryState, signal?: AbortSignal) => Promise<{ rows: GroupedRow[]; sourceTotal: number; total: number }>;\n supported: boolean;\n model: GroupingModel<Row>;\n api: QueryTableApi<Row>;\n source: GroupingSourceApi<Row>;\n grouped: QueryTableApi<Row>;\n schema: FieldSchema<Row>;\n view: GroupingView;\n /** Problems with link columns. They never block the grouped table: an\n * invalid link renders as plain text. Unregistered host targets are\n * reported when rendering. */\n diagnostics: string[];\n inputs: Row[];\n notice: string;\n setNotice: (notice: string) => void;\n /** Field names, or calendar keys (`{ field, interval, timeZone }`) for\n * datetime fields. */\n changeKeys: (keys: GroupKey[]) => void;\n addSummary: (op: SummaryOp, field?: string) => void;\n changeSummary: (id: string, op: SummaryOp) => void;\n changeRepresentative: (rule: RepresentativeRow | null) => void;\n representativeImpact: () => string;\n applyColumns: (summaries: SummaryColumn[], columns: SelectColumn[]) => void;\n}\n\n/** Structural edits are one normal QueryState transaction: persistence,\n * sharing, undo and redo all retain the original source query and result view. */\nexport function useGroupingController<Row>(\n api: QueryTableApi<Row>,\n source: GroupingSourceApi<Row>,\n model: GroupingModel<Row>,\n inputs: Row[],\n supported: boolean,\n viewRevision: number,\n execution: Pick<GroupingApi<Row>, \"inputsReady\" | \"preview\"> = {},\n): GroupingApi<Row> {\n const [notice, setNotice] = useState(\"\");\n useEffect(() => setNotice(\"\"), [viewRevision]);\n const previous = useRef<{ query: QueryState; revision: number } | null>(null);\n const stage = api.query.grouping;\n const view: GroupingView = {\n version: 2,\n mode: stage ? \"groups\" : \"rows\",\n keys: groupKeyFields(stage?.keys ?? []),\n groupKeys: stage?.keys ?? [],\n summaries: stage?.summaries ?? [],\n representative: stage?.representative ?? null,\n input: source.query,\n result: withoutGrouping(api.query),\n };\n const outputSchema = {\n ...api.schema!,\n fields: api.computed.catalogue,\n } as unknown as FieldSchema<GroupedRow>;\n function changeKeys(keys: GroupKey[]) {\n if (keys.length && !supported) return;\n const cached =\n previous.current?.revision === viewRevision\n ? previous.current.query\n : null;\n const canRestore = (current: QueryState) =>\n !current.grouping && cached?.grouping &&\n queriesEqual(cached.grouping.source, current) &&\n JSON.stringify(cached.grouping.keys) === JSON.stringify(keys);\n // Reject at the intent boundary, where callers can display the error.\n // Throwing inside a state updater instead fails React's next render.\n if (keys.length)\n model.validate(canRestore(api.query) ? cached!.grouping! : {\n ...(stage ?? { summaries: [], representative: null }),\n keys,\n });\n if (!keys.length && stage)\n previous.current = { query: api.query, revision: viewRevision };\n api.setQuery((current) => {\n // Restore a previous grouped layout only for the same explicit keys.\n if (keys.length && !current.grouping && cached?.grouping && canRestore(current))\n return {\n ...cached,\n grouping: { ...cached.grouping, source: current },\n };\n return withGroupingKeys(current, keys);\n });\n setNotice(\n stage && api.query.aggregations?.length && keys.length\n ? \"Grouping changed. Group metrics cleared; Undo restores them.\"\n : \"\",\n );\n api.selection.clear();\n }\n function applyColumns(summaries: SummaryColumn[], columns: SelectColumn[]) {\n if (!stage) {\n api.setQuery((q) => ({ ...q, select: columns }));\n return;\n }\n model.validate({ ...stage, summaries });\n const changed = new Set(\n stage.summaries\n .filter((before) => {\n const after = summaries.find((column) => column.id === before.id);\n return (\n !after ||\n before.op !== after.op ||\n before.field !== after.field ||\n before.expression !== after.expression\n );\n })\n .map((column) => column.id),\n );\n api.setQuery((q) =>\n q.grouping\n ? {\n ...q,\n grouping: { ...q.grouping, summaries },\n select: columns,\n ...(changed.size\n ? {\n offset: 0,\n aggregations: [],\n where: q.where.filter(\n (term) =>\n !predicatesOf(term).some((p) => changed.has(p.field)),\n ),\n orderBy: q.orderBy.filter((term) => !changed.has(term.field)),\n }\n : {}),\n }\n : q,\n );\n setNotice(\n changed.size &&\n (api.query.where.some((term) =>\n predicatesOf(term).some((p) => changed.has(p.field)),\n ) ||\n api.query.orderBy.some((term) => changed.has(term.field)) ||\n api.query.aggregations?.length)\n ? \"Columns updated. Affected filters, sorts, and metrics cleared; Undo restores them.\"\n : \"\",\n );\n }\n function addSummary(op: SummaryOp, field?: string) {\n if (!stage || (op === \"row\" && !stage.representative)) return;\n const existing = stage.summaries.find(\n (column) => column.op === op && column.field === field,\n );\n if (!existing && stage.summaries.length >= MAX_SUMMARY_COLUMNS) {\n setNotice(\n `A grouped view supports up to ${MAX_SUMMARY_COLUMNS} aggregate columns.`,\n );\n return;\n }\n const column = existing ?? {\n id: `summary_${crypto.randomUUID().replace(/-/g, \"\")}`,\n op,\n ...(field ? { field } : {}),\n };\n applyColumns(\n existing ? stage.summaries : [...stage.summaries, column],\n api.select.visible.some((c) => c.field === column.id)\n ? api.select.visible\n : [...api.select.visible, { field: column.id }],\n );\n }\n function changeSummary(id: string, op: SummaryOp) {\n if (!stage) return;\n applyColumns(\n stage.summaries.map((column) => {\n if (column.id !== id) return column;\n // A row value keeps the source field's rendering, not an aggregate format.\n const { display: _display, ...rest } = column;\n return op === \"row\" ? { ...rest, op } : { ...column, op };\n }),\n api.select.visible,\n );\n }\n function representativeImpact() {\n if (!stage) return \"\";\n const before = api.query;\n const after = model.reconcileRepresentative(\n before,\n stage.summaries,\n outputSchema,\n false,\n );\n return [\n before.where.length !== after.where.length ? \"row-value filters\" : \"\",\n before.orderBy.length !== after.orderBy.length ? \"row-value sorts\" : \"\",\n (before.aggregations?.length ?? 0) !== (after.aggregations?.length ?? 0)\n ? \"dependent metrics\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n }\n function changeRepresentative(representative: RepresentativeRow | null) {\n if (\n !stage ||\n JSON.stringify(stage.representative) === JSON.stringify(representative)\n )\n return;\n const summaries = representative\n ? stage.summaries\n : stage.summaries.filter((column) => column.op !== \"row\");\n model.validate({ ...stage, summaries, representative });\n const impact = representativeImpact();\n api.setQuery((q) =>\n q.grouping\n ? normalizeQueryState({\n ...model.reconcileRepresentative(\n q,\n stage.summaries,\n outputSchema,\n !representative,\n ),\n grouping: { ...q.grouping, summaries, representative },\n })\n : q,\n );\n setNotice(\n impact\n ? `Representative row changed. Cleared ${impact}; Undo restores them.`\n : \"\",\n );\n }\n return {\n ...execution,\n supported,\n model,\n api,\n source,\n grouped: api,\n schema: api.schema!,\n view,\n diagnostics: stage ? model.linkDiagnostics(stage) : [],\n inputs,\n notice,\n setNotice,\n changeKeys,\n addSummary,\n changeSummary,\n applyColumns,\n changeRepresentative,\n representativeImpact,\n };\n}\n","import { useQueryFilters } from \"./useQueryFilters\";\nimport { useGroupingController, type GroupingApi, type GroupingSourceApi } from \"./useGrouping\";\nimport { createGroupingModel, prepareGrouping, withoutGrouping,\n sourceExecutionSchema, toQueryRequestV3, validateQueryResultV3, metricPopulationError } from \"@pythia-software/query-table-core\";\nimport { ITEM_DETAILS_COLUMN, itemPageFields } from \"@pythia-software/query-table-core\";\nimport { useItemDetails, initialDetailModes, type ItemDetailsApi, type ItemDetailsOptions } from \"./useItemDetails\";\n// useQueryTable — the one hook that owns everything.\n//\n// The headless brain of the table: it holds the QueryState, keeps it in sync\n// with the URL (`?q=`) and the StorageAdapter, orchestrates fetches through the\n// Transport (debounced + abortable), and exposes intent-level mutators so a UI\n// never hand-edits QueryState. @pythia-software/query-table-ui is a thin layer over this; you\n// can also build an entirely custom table on it.\n\nimport {\n executionRevision,\n validateComputedResponse,\n} from \"./computedExecution\";\nimport {\n useComputedColumns,\n type ComputedColumnsApi,\n} from \"./useComputedColumns\";\nimport type { FormulaWorkerFactory } from \"./formulaWorker\";\nimport type {\n ComputedColumnStore,\n ComputedExecution,\n RowComputedValues,\n} from \"@pythia-software/query-table-core\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n EMPTY_QUERY,\n applyQuery,\n memoryStorageAdapter,\n normalizeQueryState,\n parseHostQueryState,\n readFieldValue,\n selectedFields,\n toServerQuery,\n queriesEqual,\n isWhereConjunction,\n isWhereGroup,\n predicatesOf,\n negateClause,\n opsForField,\n metricPlans,\n validateMetric,\n metricDependencies,\n isComputedField,\n computedFieldName,\n toServerQueryV2,\n groupKeyField,\n groupKeyFields,\n} from \"@pythia-software/query-table-core\";\n\nconst AUTOCOMPLETE_LIMIT = 50;\nconst MAX_AUTO_REFRESH_POLLS = 1000;\nimport type {\n QueryState,\n HostQueryState,\n WhereClause,\n WhereBranch,\n WhereTerm,\n OrderByClause,\n AggOp,\n AggregationClause,\n AggregationResult,\n RowId,\n FieldDef,\n FieldSchema,\n Transport,\n StorageAdapter,\n DistinctValuesResult,\n FieldStats,\n} from \"@pythia-software/query-table-core\";\nimport {\n useRequestActivity,\n type RequestActivityApi,\n} from \"./useRequestActivity\";\nimport { useAggregations } from \"./useAggregations\";\nimport { useSelection, type SelectionApi } from \"./useSelection\";\nimport { useSelect, type SelectApi } from \"./useSelect\";\nimport { useColumnDrag, type ColumnDragApi } from \"./useColumnDrag\";\nimport { useSavedQueries, type SavedQueriesApi } from \"./useSavedQueries\";\nimport { useQueryLinks, type QueryLinksApi } from \"./useQueryLinks\";\nimport { createQueryLinkService, type QueryLinkOptions } from \"@pythia-software/query-table-core\";\n\nexport interface UseQueryTableOptions<Row> {\n\n /** Pause execution and URL synchronization while a mounted host view is hidden. */\n active?: boolean;\n /** Capture evaluation time for grouped executions and remote query requests. */\n evaluationNow?: () => number;\n /** Normalize external aliases without storing presentation in query state. Must be pure and not throw. */\n canonicalizeQuery?: (query: QueryState) => QueryState;\n /** Reject an entire query before rows or metrics execute. Errors retain editable query state. */\n validateQuery?: (query: QueryState) => void;\n\n /** Disable row-producing grouping for this instance. Enabled for complete client datasets by default. */\n grouping?: boolean;\n schema: FieldSchema<Row>;\n /** Row data access. Omit to filter, sort, and page `clientRows` locally. */\n transport?: Transport<Row>;\n /** Metric-only data access; defaults to transport and never selects server row mode. */\n metricTransport?: Transport<Row>;\n /** Authoritative metric handshake; defaults to the existing row execution selection. */\n metricExecution?: ComputedExecution;\n /** Additional host readiness gate for committed-page metrics and previews.\n * Does not delay remote allMatching requests. Re-evaluated on each render. */\n metricRowsReady?: (query: QueryState) => boolean;\n /** Dataset already available in memory. Remote grouping/aggregation belongs\n * on the server; do not download a population to supply this option. */\n clientRows?: Row[];\n /** Saved/last-query persistence. Defaults to a non-durable in-memory adapter.\n * Pass localStorageAdapter() explicitly only when filter values are safe to\n * retain as cleartext JSON on the device. */\n storage?: StorageAdapter;\n /** When `storage.saveLast` records the last-used query: \"always\" (default)\n * 400 ms after every change, or \"succeeded\" once rows and every metric of\n * that exact query have loaded. A failure, timeout or cancellation keeps the\n * previous last-used query; explicit links, named saves and the default are\n * separate choices and are never touched by it. */\n persistLast?: \"always\" | \"succeeded\";\n /** Host-owned query state that travels with the table query as one\n * definition: saved, restored, shared, reset and undone together. The host\n * keeps rendering and running its own clauses from `api.definition`. */\n hostQuery?: HostQueryOptions;\n /** Shared reusable definitions, independent of saved-query storage. */\n computedColumnStore?: ComputedColumnStore;\n /** Authoritative host handshake for versioned server SELECT, sorts, and metrics. */\n computedExecution?: ComputedExecution;\n /** Override the worker factory when CSP disallows blob workers. */\n formulaWorkerFactory?: FormulaWorkerFactory;\n /** Seed query, normalized and resource-bounded before use. When omitted the\n * hook resolves: opted-in URL → storage.loadLast → schema defaults. */\n initialQuery?: QueryState;\n /** Mirror QueryState to `?q=` via history.replaceState. Default false because\n * base64url is encoding, not encryption: filters will appear in browser\n * history, referrers, logs, analytics, and screenshots when enabled. */\n syncUrl?: boolean;\n /** Collection URL parameter, independent of item views. Takes precedence\n * over the legacy itemDetails.queryParameter; otherwise defaults to q. */\n queryParameter?: string;\n /** URL budget and browser-local FIFO cache; remote snapshots come from storage.snapshots. */\n links?: QueryLinkOptions;\n /** Enable schema-driven click popovers, item modals and row expansion. */\n itemDetails?: boolean | ItemDetailsOptions<Row>;\n /** Debounce (ms) between a query change and the fetch it triggers. Default 200. */\n debounceMs?: number;\n /** Injected clock for deterministic saved-query timestamps. Default Date.now. */\n now?: () => number;\n /** Side-effect to run on every refresh — both manual `api.refresh()` and each\n * auto-refresh tick. Fires *in addition to* the internal `setNonce` re-query,\n * so manual and auto stay identical. Use it in client mode (no transport) to\n * bridge a UI refresh to your own server fetch without monkey-patching the\n * returned `api`. Always read through a ref, so supplying it never tears down\n * and recreates the auto-refresh interval. */\n onRefresh?: () => void;\n}\n\nexport interface AutoRefreshConfig {\n frequencyMs: number;\n turnOffAfterMs: number;\n}\n\nexport interface AutoRefreshStatus extends AutoRefreshConfig {\n startedAt: number;\n stopsAt: number;\n pollCount: number;\n}\n\nexport interface AutoRefreshApi {\n status: AutoRefreshStatus | null;\n start: (config: AutoRefreshConfig) => void;\n stop: () => void;\n}\n\n/** A patch for one metric. `field`/`label` accept an explicit `undefined` to\n * CLEAR them (e.g. switching to an op whose measure no longer applies); an\n * absent key leaves the existing value untouched. */\nexport type AggregationPatch = { op?: AggOp; groupBy?: string[] } & {\n [K in keyof Omit<AggregationClause, \"id\" | \"op\" | \"groupBy\">]?:\n AggregationClause[K] | undefined;\n};\n\nexport interface AggregationsApi {\n /** The metric specs currently in the query. */\n clauses: AggregationClause[];\n /** Server (or client-mirror) results, one entry per clause; null when none. */\n results: AggregationResult | null;\n loading: boolean;\n error: Error | null;\n /** Append a metric. Defaults to \"count all rows\"; pass a partial to override.\n * Returns the generated id. */\n add: (partial?: Partial<Omit<AggregationClause, \"id\">>) => string;\n /** Patch a metric by id. */\n update: (id: string, patch: AggregationPatch) => void;\n /** Reorder: move the metric `id` to `toIndex` (an index in the list with the\n * metric removed, so a drag preview's slot maps straight to the result). */\n move: (id: string, toIndex: number) => void;\n /** Remove a metric by id. */\n remove: (id: string) => void;\n /** Remove all metrics. */\n clear: () => void;\n /** Evaluate a draft without modifying the query. */\n preview?: (\n clauses: AggregationClause[],\n signal?: AbortSignal,\n ) => Promise<AggregationResult>;\n /** Commit the complete draft as one undoable change. */\n replace?: (\n clauses: AggregationClause[],\n expected?: AggregationClause[],\n ) => void;\n /** Validate a clause, including reusable computed dependencies. */\n compile?: (clause: AggregationClause) => unknown;\n /** Invalidation token for page, refresh, schema, and definition changes. */\n contextKey?: string;\n}\n\n/** Registers host-owned query state with `useQueryTable`. */\nexport interface HostQueryOptions {\n /** URL parameters that mirror `hostState.params` when `syncUrl` is on. URL\n * writes replace exactly these, keeping every other parameter. They may not\n * include the table's own query parameter. */\n ownedParameters: readonly string[];\n /** The state a query without host state takes, including every save made\n * before the host registered, and the state Reset restores. */\n defaults: HostQueryState;\n /** Validate, migrate and canonicalize; throw to reject. A rejected state\n * rejects the whole restore or edit, leaving the live definition as it was. */\n normalize?: (state: HostQueryState) => HostQueryState;\n}\n/** The committed table query and host state, as one unit. */\nexport interface QueryDefinition {\n query: QueryState;\n hostState: HostQueryState;\n}\n\n/** The outcome of executing one exact query; see `QueryTableApi.execution`. */\nexport interface QueryExecutionReceipt {\n /** The query whose rows and metrics this receipt describes. */\n query: QueryState;\n /** Execution identity: changes with every row- or metric-affecting edit and\n * refresh, but not with presentation such as widths. */\n key: string;\n /** Increases with every new execution identity of this table. */\n generation: number;\n /** \"succeeded\" only when rows and every metric loaded; an empty result,\n * including a page past the end, is a success. */\n status: \"running\" | \"succeeded\" | \"failed\";\n rows: \"running\" | \"succeeded\" | \"failed\";\n /** \"none\" when the query has no metrics. A metric error fails the receipt. */\n metrics: \"none\" | \"running\" | \"succeeded\" | \"failed\";\n /** The row or metric error behind a failure. */\n error: Error | null;\n}\nexport interface QueryTableApi<Row> {\n /** Dependent source fetches can use ready without parsing display errors. */\n restoration: { status: \"resolving\" | \"ready\" | \"error\"; ready: boolean; error: Error | null };\n /** Execution of the current query, separate from restoration. Null while\n * restoring, after a restoration error and while the table is inactive, so\n * a cancelled or hidden table never publishes a stale receipt. */\n execution: QueryExecutionReceipt | null;\n /** With `hostQuery`: the committed definition (`query` without its\n * `hostState`, and the host state). */\n definition?: QueryDefinition;\n /** With `hostQuery`: commit a new definition as one history entry and one\n * execution. Throws, changing nothing, when `hostQuery.normalize` rejects. */\n setDefinition?: (next: QueryDefinition | ((previous: QueryDefinition) => QueryDefinition)) => void;\n /** Call after a host pushState/router update, with an absolute URL or a location\n * relative to window.location.href. Supersedes prior resolution;\n * abort or an intervening query edit prevents stale publication. */\n restoreLocation: (location: string | URL, signal?: AbortSignal) => Promise<void>;\n /** Row-producing GROUP BY controls and source stage, when supported. */\n grouping?: GroupingApi<Row>;\n /** Current result schema; changes when entering or leaving grouping. */\n schema?: FieldSchema<Row>;\n links: QueryLinksApi;\n /** Built-in item details, enabled by the instance creator. */\n itemDetails?: ItemDetailsApi<Row>;\n // state\n query: QueryState;\n /** Schema defaults used for reset controls. */\n defaults: QueryState;\n setQuery: (next: QueryState | ((prev: QueryState) => QueryState)) => void;\n /** Can move back to a previously applied local query state. */\n canUndo: boolean;\n /** Can move forward to a previously undone local query state. */\n canRedo: boolean;\n /** Move backward through local, unsaved query history. Empty history leaves\n * incoming link restoration and errors unchanged. */\n undo: () => void;\n /** Move forward through local, unsaved query history. Empty history leaves\n * incoming link restoration and errors unchanged. */\n redo: () => void;\n\n requestActivity: RequestActivityApi;\n\n // data\n rows: Row[];\n total: number | null;\n loading: boolean;\n error: Error | null;\n refresh: () => void;\n autoRefresh: AutoRefreshApi;\n /** Refresh one legacy row, or schedule a full V2 page refresh so computed\n * values and page membership remain coherent. Track V2 completion via loading/error. */\n refreshRow: (id: RowId) => Promise<void>;\n\n // aggregation metrics (the dashboard panel above the table)\n aggregations: AggregationsApi;\n\n // filters — WHERE is CNF: `query.where` is an array of terms (a literal or an\n // OR group), ANDed together. The top-level intents address a whole term by\n // index; the predicate-level intents address one literal within a term.\n /** Append a predicate as its own AND term. */\n addFilter: (clause: WhereClause) => void;\n /** Replace the whole term at `index` with a single predicate. */\n updateFilter: (index: number, clause: WhereClause) => void;\n /** Remove the whole term at `index`. */\n removeFilter: (index: number) => void;\n clearFilters: () => void;\n /** Replace one predicate inside a term (predIndex 0 for a literal term). In\n * an OR of conjunctions, predIndex counts literals in `predicatesOf` order. */\n updatePredicate: (\n termIndex: number,\n predIndex: number,\n clause: WhereClause,\n ) => void;\n /** Remove one predicate; a group of one flattens to a literal, an emptied term drops. */\n removePredicate: (termIndex: number, predIndex: number) => void;\n /** Logically invert one predicate (flips the op, else toggles its NOT flag). */\n negatePredicate: (termIndex: number, predIndex: number) => void;\n /** Move the term at `fromIndex` to `toIndex` (an index in the list with the\n * dragged term removed, so a drag preview's slot maps straight to the result). */\n reorderFilters: (fromIndex: number, toIndex: number) => void;\n /** OR-merge the term at `sourceIndex` into the term at `targetIndex`: the\n * target becomes (or stays) an OR group holding both terms' branches (a\n * conjunction stays one AND branch), and the source term is removed. This is the drag-onto-another-filter gesture. */\n mergeFilters: (sourceIndex: number, targetIndex: number) => void;\n /** Reset the complete query state back to schema defaults. */\n resetAll: () => void;\n /** Keystroke-driven filter-value autocomplete (Transport.fetchDistinctValues). */\n filterValues: (\n field: string,\n search: string,\n ) => Promise<DistinctValuesResult>;\n /** Dataset-wide field statistics for catalogue and picker affordances. */\n fieldStats: (\n fields: string[],\n signal?: AbortSignal,\n ) => Promise<Record<string, FieldStats>>;\n\n // sorting (multi-sort): click header sets/cycles primary; shift-click appends.\n toggleSort: (field: string, additive?: boolean) => void;\n setSort: (orderBy: OrderByClause[]) => void;\n\n // select + pagination + selection + saved\n select: SelectApi<Row>;\n computed: ComputedColumnsApi<Row>;\n setLimit: (limit: number) => void;\n setOffset: (offset: number) => void;\n nextPage: () => void;\n prevPage: () => void;\n selection: SelectionApi;\n saved: SavedQueriesApi;\n /** Shared, transient column-reorder drag state (table headers + select chips). */\n columnDrag: ColumnDragApi;\n\n // resolved view\n visibleFields: FieldDef<Row>[];\n rowId: (row: Row) => RowId | null;\n}\n\nfunction detailColumnSchema<Row>(schema: FieldSchema<Row>, enabled: boolean): FieldSchema<Row> {\n if (!enabled) return schema;\n return { ...schema,\n defaultSelect: [...(schema.defaultSelect ?? selectedFields(schema, { select: [] }).map(field => ({ field: field.name }))), { field: ITEM_DETAILS_COLUMN }],\n fields: [...schema.fields, { name: ITEM_DETAILS_COLUMN, label: \"Detail\", type: \"text\",\n source: { kind: \"derived\", accessor: () => null }, select: { default: true, width: 112 },\n filter: { enabled: false }, sort: { enabled: false }, aggregate: { measure: false, groupable: false },\n property: { enabled: false },\n }],\n };\n}\nfunction defaultsFor<Row>(schema: FieldSchema<Row>, details = false): QueryState {\n schema = detailColumnSchema(schema, details);\n return normalizeQueryState({\n select: schema.defaultSelect ?? [],\n where: [],\n orderBy: schema.defaultSort ?? [],\n limit: schema.defaultLimit ?? EMPTY_QUERY.limit,\n offset: 0,\n });\n}\n\nfunction cloneWhereTerm(term: WhereTerm): WhereTerm {\n const copy: WhereTerm = isWhereGroup(term)\n ? { ...term, any: term.any.map((c: WhereBranch) => (isWhereConjunction(c) ? { all: c.all.map((m) => ({ ...m })) } : { ...c })) }\n : { ...term };\n if (term.setFilter)\n copy.setFilter = { ...term.setFilter, values: [...term.setFilter.values] };\n return copy;\n}\n\nfunction cloneQueryState(q: QueryState): QueryState {\n const clone: QueryState = {\n select: q.select.map((column) => ({ ...column })),\n where: q.where.map(cloneWhereTerm),\n orderBy: q.orderBy.map((term) =>\n term.extract ? { ...term, extract: { ...term.extract } } : { ...term },\n ),\n limit: q.limit,\n offset: q.offset,\n };\n if (q.fitToScreen) clone.fitToScreen = true;\n if (q.hostState) clone.hostState = { version: q.hostState.version, params: Object.fromEntries(Object.entries(q.hostState.params).map(([name, values]) => [name, [...values]])) };\n if (q.aggregations)\n clone.aggregations = JSON.parse(\n JSON.stringify(q.aggregations),\n ) as AggregationClause[];\n if (q.grouping) clone.grouping = normalizeQueryState(q).grouping!;\n if (q.itemDetails) clone.itemDetails = JSON.parse(JSON.stringify(q.itemDetails)) as NonNullable<QueryState[\"itemDetails\"]>;\n return clone;\n}\n\n/** Apply a patch to a metric, building a fresh clause so optional `field`/`label`\n * can be dropped (passing them as `undefined` clears; omitting the key keeps the\n * current value) without ever materializing an `undefined`-valued property. */\nfunction mergeAggregation(\n a: AggregationClause,\n patch: AggregationPatch,\n): AggregationClause {\n const next = { ...a, ...patch } as AggregationClause;\n for (const key of Object.keys(next) as Array<keyof AggregationClause>) {\n if (next[key] === undefined) delete next[key];\n }\n return next;\n}\n\nfunction isNullLike(value: unknown): boolean {\n return value == null || (Array.isArray(value) && value.length === 0);\n}\n\nfunction asDistinctValue(value: unknown): string | null {\n if (isNullLike(value)) return null;\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n return null;\n}\n\nfunction fieldHasNullInRows<Row>(field: FieldDef<Row>, rows: Row[]): boolean {\n for (const row of rows) {\n if (isNullLike(readFieldValue(field, row))) return true;\n }\n return false;\n}\n\nfunction distinctValuesFromRows<Row>(\n field: FieldDef<Row>,\n rows: Row[],\n search: string,\n): { values: string[]; hasMore: boolean } {\n const target = search.trim().toLowerCase();\n const values: string[] = [];\n const seen = new Set<string>();\n let hasMore = false;\n\n rowsLoop: for (const row of rows) {\n const value = readFieldValue(field, row);\n const candidates =\n field.type === \"textarray\" && Array.isArray(value) ? value : [value];\n for (const candidate of candidates) {\n const raw = asDistinctValue(candidate);\n if (raw == null || seen.has(raw)) continue;\n if (target && !raw.toLowerCase().includes(target)) continue;\n\n if (values.length < AUTOCOMPLETE_LIMIT) {\n seen.add(raw);\n values.push(raw);\n continue;\n }\n\n hasMore = true;\n break rowsLoop;\n }\n }\n\n return { values: values.sort((a, b) => a.localeCompare(b)), hasMore };\n}\n\nfunction hasQueryLink(url: string, parameter: string): boolean {\n const values = new URL(url).searchParams.getAll(parameter);\n return values.length > 1 || (values.length === 1 && values[0] !== \"\");\n}\n\nfunction queryParameter<Row>(opts: UseQueryTableOptions<Row>): string {\n return opts.queryParameter ?? (typeof opts.itemDetails === \"object\" ? opts.itemDetails.queryParameter : undefined) ?? \"q\";\n}\n\n/** The query with the host state it runs with: the host defaults when it has\n * none, otherwise the host's normalized form. Throws when the state cannot\n * be accepted, including host state on a table that registers none. */\nfunction withHostState(query: QueryState, host: HostQueryOptions | undefined): QueryState {\n if (!host) {\n if (query.hostState) throw Error(\"This query includes host state that this table does not support.\");\n return query;\n }\n const raw = query.hostState ?? host.defaults;\n if (raw.version === 0) throw Error(\"This query's host state could not be read.\");\n const state = parseHostQueryState(host.normalize ? host.normalize(parseHostQueryState(raw)) : raw);\n return { ...query, hostState: state };\n}\nfunction withoutHostState(query: QueryState): QueryState {\n const { hostState: _hostState, ...rest } = query;\n return rest;\n}\n/** Host state mirrored into a URL's owned parameters, or undefined when it has none. */\nfunction hostStateFromUrl(location: string, host: HostQueryOptions): HostQueryState | undefined {\n const url = new URL(location);\n const params: Record<string, string[]> = {};\n for (const name of host.ownedParameters) {\n const values = url.searchParams.getAll(name);\n if (values.length) params[name] = values;\n }\n return Object.keys(params).length ? { version: host.defaults.version, params } : undefined;\n}\n/** Replace exactly the owned parameters of `url` with `state`. */\nfunction writeHostParameters(url: string, host: HostQueryOptions, state: HostQueryState | undefined): string {\n const next = new URL(url);\n for (const name of host.ownedParameters) next.searchParams.delete(name);\n for (const name of host.ownedParameters)\n for (const value of state?.params[name] ?? []) next.searchParams.append(name, value);\n return next.toString();\n}\nconst HOST_REQUEST_METHODS = new Set([\"fetchRows\", \"fetchRowsV2\", \"fetchQueryV3\", \"fetchMetrics\", \"fetchAggregations\", \"fetchDistinctValues\"]);\n/** Requests carry the host state of the query they execute. The wrapper is\n * rebuilt with every host state, alongside the query, so a request never\n * pairs one definition's table query with another's host state. */\nfunction withHostTransport<T extends object>(transport: T | undefined, hostStateKey: string): T | undefined {\n if (!transport || !hostStateKey) return transport;\n const hostState = JSON.parse(hostStateKey) as HostQueryState;\n const wrappers = new Map<PropertyKey, unknown>();\n return new Proxy(Object.create(transport) as T, {\n get(_target, key) {\n const method = Reflect.get(transport, key, transport) as unknown;\n if (!HOST_REQUEST_METHODS.has(String(key)) || typeof method !== \"function\") return method;\n if (!wrappers.has(key))\n wrappers.set(key, (request: object, signal?: AbortSignal) =>\n (method as (request: object, signal?: AbortSignal) => unknown).call(transport, { ...request, hostState }, signal));\n return wrappers.get(key);\n },\n });\n}\n\nfunction resolveInitial<Row>(opts: UseQueryTableOptions<Row>): {\n q: QueryState;\n fromUrl: boolean;\n} {\n const defaults = withHostState(defaultsFor(opts.schema, Boolean(opts.itemDetails)), opts.hostQuery);\n if (opts.initialQuery)\n return {\n q: withHostState(normalizeQueryState(opts.initialQuery, defaults), opts.hostQuery),\n fromUrl: false,\n };\n if (opts.syncUrl === true && opts.active !== false && typeof window !== \"undefined\") {\n const parameter = queryParameter(opts);\n if (hasQueryLink(window.location.href, parameter) || (opts.hostQuery && hostStateFromUrl(window.location.href, opts.hostQuery)))\n return {\n q: defaults,\n fromUrl: true,\n };\n }\n return { q: defaults, fromUrl: false };\n}\n\nexport function useQueryTable<Row>(\n opts: UseQueryTableOptions<Row>,\n): QueryTableApi<Row> {\n const {\n schema: sourceSchema,\n transport: sourceTransport,\n clientRows: providedRows,\n initialQuery,\n debounceMs = 200,\n } = opts;\n const active = opts.active !== false;\n const urlSyncEnabled = opts.syncUrl === true;\n const syncUrl = urlSyncEnabled && active;\n const { transport: activityTransport, metricTransport: activityMetricTransport, activity: requestActivity } =\n useRequestActivity(sourceTransport, opts.metricTransport);\n const host = opts.hostQuery;\n const hostRef = useRef(host);\n hostRef.current = host;\n const hostDefaultsKey = host ? JSON.stringify(host.defaults) : \"\";\n if (host?.ownedParameters.includes(queryParameter(opts)))\n throw Error(`hostQuery.ownedParameters cannot include the table's own \"${queryParameter(opts)}\" parameter.`);\n const storage = useMemo(\n () => opts.storage ?? memoryStorageAdapter(),\n [opts.storage],\n );\n const parameter = queryParameter(opts);\n const linkService = useMemo(() => createQueryLinkService(sourceSchema.name, storage.snapshots, opts.links),\n [sourceSchema.name, storage.snapshots, opts.links?.cache, opts.links?.maxUrlBytes]);\n const now = opts.now ?? Date.now;\n const nowRef = useRef(now);\n const onRefreshRef = useRef(opts.onRefresh);\n const defaults = useMemo(() => withHostState(defaultsFor(sourceSchema, Boolean(opts.itemDetails)), hostRef.current),\n [sourceSchema, Boolean(opts.itemDetails), hostDefaultsKey]);\n\n const initRef = useRef(resolveInitial(opts));\n const [restoration, setRestoration] = useState<{ loading: boolean; error: Error | null }>({ loading: initRef.current.fromUrl, error: null });\n const [storageReady, setStorageReady] = useState(Boolean(initialQuery));\n const restorationCurrent = useRef({ storageReady, restoration, active });\n restorationCurrent.current = { storageReady, restoration, active };\n const manualQueryEpoch = useRef(0);\n const restoreController = useRef<AbortController | null>(null);\n const restoreHandler = useRef<((location: string, signal?: AbortSignal) => Promise<void>) | null>(null);\n const initialRestore = useRef<(() => Promise<void>) | null>(null);\n const initialRestorationStarted = useRef(false);\n const restoreLocation = useCallback((location: string | URL, signal?: AbortSignal) => {\n if (!restoreHandler.current) return Promise.reject(Error(\"Query controller is not mounted.\"));\n return restoreHandler.current(String(location), signal);\n }, []);\n const aggIdRef = useRef(0);\n // A null baseline follows current host defaults. Explicit views keep their\n // snapshot, scoped to the source so reset cannot restore another table.\n const savedBaseline = useRef<{ source: string; query: QueryState } | null>(\n initRef.current.q.grouping\n ? { source: sourceSchema.name, query: cloneQueryState(initRef.current.q) }\n : null,\n );\n const viewRevision = useRef(0);\n const [queryHistory, setQueryHistory] = useState<{ query: QueryState; past: QueryState[]; future: QueryState[] }>(\n () => ({ query: initRef.current.q, past: [], future: [] }),\n );\n // Keep history current even when React batches several edits or\n // undo/redo calls. History updates stay pure and cancellation stays outside\n // React state updaters, which may run more than once.\n const queryHistoryRef = useRef(queryHistory);\n const updateQueryHistory = useCallback((update: (history: typeof queryHistory) => typeof queryHistory) => {\n const previous = queryHistoryRef.current;\n const next = update(previous);\n if (next === previous) return;\n queryHistoryRef.current = next;\n setQueryHistory(next);\n }, []);\n const storedQuery = queryHistory.query;\n const [nonce, setNonce] = useState(0);\n const query = useMemo(\n () => opts.canonicalizeQuery?.(storedQuery) ?? storedQuery,\n [storedQuery, opts.canonicalizeQuery],\n );\n const hostStateKey = host && query.hostState ? JSON.stringify(query.hostState) : \"\";\n const metadataTransport = useMemo(() => withHostTransport(activityTransport, hostStateKey), [activityTransport, hostStateKey]);\n const metricTransport = useMemo(() => withHostTransport(activityMetricTransport, hostStateKey), [activityMetricTransport, hostStateKey]);\n const transport = metadataTransport;\n const sourceCatalogue = useMemo(() => sourceExecutionSchema(sourceSchema, opts.computedExecution), [sourceSchema, opts.computedExecution]);\n const sourceRows = providedRows;\n const groupingModel = useMemo(() => createGroupingModel(sourceCatalogue), [sourceCatalogue]);\n const remoteGrouping = !!transport?.fetchQueryV3 && transport.queryCapabilities?.version === 3 && transport.queryCapabilities.groupedRows;\n const groupingSupported = ((!transport && sourceRows !== undefined) || remoteGrouping) && opts.grouping !== false;\n const groupKey = JSON.stringify(query.grouping ?? null);\n // Capture the grouped evaluation clock with its population. Debounced rows,\n // metric previews and committed metrics must use the same relative bounds.\n // Ordinary V3 requests capture their clock when each execution begins.\n const groupingNow = useMemo(() => query.grouping ? (opts.evaluationNow ?? Date.now)() : undefined,\n [sourceRows, sourceSchema, groupingSupported, groupKey, nonce, opts.evaluationNow]);\n const prepared = useMemo(() => {\n if (!query.grouping) return null;\n try {\n if (!groupingSupported) throw new Error(\"Grouped queries require a server with grouped-query support or a dataset already in memory.\");\n if (remoteGrouping) { groupingModel.validate(query.grouping); return { inputs: [] as Row[], rows: [], error: null }; }\n return { ...prepareGrouping(sourceRows!, sourceCatalogue, query.grouping, { now: groupingNow! }), error: null };\n } catch (error) {\n return { inputs: [] as Row[], rows: [], error: error as Error };\n }\n }, [sourceRows, sourceCatalogue, groupingModel, groupingSupported, groupKey, nonce, groupingNow, remoteGrouping]);\n // Result fields depend on the projection, not the current population. Keep\n // their identity across refresh/WHERE changes so committed rows stay visible\n // during debounce, while real shape changes still invalidate them below.\n const projectionKey = JSON.stringify(query.grouping\n ? [query.grouping.keys, query.grouping.summaries] : null);\n const schema = useMemo(() => (query.grouping\n ? groupingModel.resultSchema(query.grouping.keys, query.grouping.summaries)\n : sourceSchema) as FieldSchema<Row>, [sourceSchema, groupingModel, projectionKey]);\n const clientRows = (prepared?.rows ?? sourceRows) as Row[] | undefined;\n const executionQuery = useMemo(() => withoutGrouping(query), [query]);\n const byName = useMemo(() => new Map(schema.fields.map(field => [field.name, field])), [schema]);\n const detailsEnabled = Boolean(opts.itemDetails) && !query.grouping;\n const groupDetailsEnabled = Boolean(opts.itemDetails) && Boolean(query.grouping);\n // Normalization clones grouping even for presentation edits. Only a change\n // in its content should invalidate row and metric execution.\n const validateExecution = useCallback((q: QueryState) => {\n if (prepared?.error) throw prepared.error;\n // Previews carry draft metrics in q. Reattach the source stage without\n // replacing those drafts with the currently committed dashboard.\n opts.validateQuery?.(query.grouping ? { ...q, grouping: query.grouping } : q);\n }, [prepared?.error, opts.validateQuery, groupKey]);\n const [committedRows, setRows] = useState<Row[]>([]);\n const [serverComputed, setServerComputed] = useState<\n Map<RowId, RowComputedValues>\n >(new Map());\n const [committedFields, setCommittedFields] = useState<string[]>([]);\n const [serverExecution, setServerExecution] = useState<\n ComputedExecution | undefined\n >();\n const [total, setTotal] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [committedPage, setCommittedPage] = useState<string | null>(null);\n // The page context whose execution set `error`; errors of superseded runs do not describe the current query.\n const [failedPage, setFailedPage] = useState<string | null>(null);\n const [committedSource, setCommittedSource] = useState<{\n schema: FieldSchema<Row>;\n transport: Transport<Row> | undefined;\n clientRows: Row[] | undefined;\n } | null>(null);\n // A schema transition changes row shape and identity. Never render records\n // from the previous result shape while the next page is being prepared.\n const rows = useMemo(() => committedSource?.schema === schema ? committedRows : [], [committedSource?.schema, schema, committedRows]);\n const [autoRefreshStatus, setAutoRefreshStatus] =\n useState<AutoRefreshStatus | null>(null);\n\n useEffect(() => {\n nowRef.current = now;\n }, [now]);\n\n useEffect(() => {\n onRefreshRef.current = opts.onRefresh;\n }, [opts.onRefresh]);\n\n const setQuery = useCallback<QueryTableApi<Row>[\"setQuery\"]>(\n (next) => {\n manualQueryEpoch.current++;\n initialRestorationStarted.current = true;\n restoreController.current?.abort();\n setStorageReady(true);\n setRestoration(previous => !previous.loading && !previous.error ? previous : { loading: false, error: null });\n updateQueryHistory((history) => {\n const prev = history.query;\n const candidate =\n typeof next === \"function\"\n ? (next as (p: QueryState) => QueryState)(prev)\n : next;\n // An edit that does not mention host state keeps the current one.\n const normalized = normalizeQueryState(candidate, defaults);\n const nextQuery = withHostState(normalized.hostState || !prev.hostState ? normalized : { ...normalized, hostState: prev.hostState }, hostRef.current);\n if (queriesEqual(prev, nextQuery)) return history;\n return { query: cloneQueryState(nextQuery), past: [...history.past, cloneQueryState(prev)], future: [] };\n });\n },\n [defaults, updateQueryHistory],\n );\n\n const sourceQuery = query.grouping?.source ?? query;\n const setSourceQuery = useCallback<QueryTableApi<Row>[\"setQuery\"]>((next) => {\n setQuery(current => {\n const previous = current.grouping?.source ?? current;\n const source = withoutGrouping(typeof next === \"function\" ? next(previous) : next);\n return current.grouping ? { ...current, offset: 0, grouping: { ...current.grouping, source } } : source;\n });\n }, [setQuery]);\n const sourceFilters = useQueryFilters(sourceCatalogue, setSourceQuery);\n\n // Track only this table's URL parameter and the host's owned parameters,\n // including duplicates. Host routes, anchors and unrelated history.state\n // changes do not restore table state.\n const observedQueryUrl = useRef<string | null>(null);\n const tableUrlKey = (url: string) => {\n const params = new URL(url).searchParams;\n return JSON.stringify([params.getAll(parameter), ...(hostRef.current?.ownedParameters ?? []).map(name => params.getAll(name))]);\n };\n const recordQueryUrl = useCallback((url: string) => {\n observedQueryUrl.current = tableUrlKey(url);\n }, [parameter]);\n const ownedParametersKey = JSON.stringify(host?.ownedParameters ?? null);\n const decorateLink = useCallback((url: string, q: QueryState) =>\n hostRef.current ? writeHostParameters(url, hostRef.current, q.hostState) : url, [ownedParametersKey]);\n const links = useQueryLinks(query, linkService, syncUrl, storageReady && !restoration.loading && !restoration.error,\n parameter, opts.links?.maxUrlBytes ?? 2000, recordQueryUrl, decorateLink);\n const restoreSources = useRef({ storage, linkService, defaults, initialQuery });\n restoreSources.current = { storage, linkService, defaults, initialQuery };\n\n // Resolve URL references before rows, metrics, persistence, or address-bar writes.\n useEffect(() => {\n let cancelled = false;\n let controller = new AbortController();\n let generation = 0;\n initialRestorationStarted.current = Boolean(restoreSources.current.initialQuery);\n async function restore(navigation = false, location = typeof window !== \"undefined\" ? window.location.href : \"\", signal?: AbortSignal) {\n initialRestorationStarted.current = true;\n const { storage, linkService, defaults } = restoreSources.current;\n const run = ++generation;\n const epoch = manualQueryEpoch.current;\n controller.abort(); controller = new AbortController();\n restoreController.current = controller;\n const currentController = controller;\n const abort = () => currentController.abort();\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) currentController.abort();\n setStorageReady(false);\n // The host's own URL parameters are part of the link, with or without\n // the table's query parameter.\n const host = hostRef.current;\n const hostFromUrl = host && location && (navigation || urlSyncEnabled) ? hostStateFromUrl(location, host) : undefined;\n const explicitLink = !!location && (navigation || urlSyncEnabled) && (hasQueryLink(location, parameter) || !!hostFromUrl);\n setRestoration({ loading: true, error: null });\n try {\n if (currentController.signal.aborted) throw new DOMException(\"Query restoration cancelled.\", \"AbortError\");\n const fromUrl = location && (navigation || urlSyncEnabled) ? await linkService.resolve(location, parameter, currentController.signal) : null;\n // Host parameters alone open the default table query with that host state.\n const linked = fromUrl ?? (hostFromUrl ? defaults : null);\n const defaultSaved = linked ? null : await storage.loadDefaultSaved?.(sourceSchema.name);\n let restored = linked ?? defaultSaved?.query ?? (navigation ? defaults : await storage.loadLast(sourceSchema.name));\n if (currentController.signal.aborted) throw new DOMException(\"Query restoration cancelled.\", \"AbortError\");\n // A link without host state reads the host's own URL parameters.\n if (linked && !fromUrl?.hostState && hostFromUrl) restored = { ...linked, hostState: hostFromUrl };\n if (!cancelled && run === generation && epoch === manualQueryEpoch.current) {\n if (restored) {\n // Host state is resolved before anything commits; a rejected one\n // fails the whole restore and leaves the live definition alone.\n const normalized = withHostState(normalizeQueryState(restored, defaults), host);\n savedBaseline.current = defaultSaved || fromUrl?.grouping\n ? { source: sourceSchema.name, query: cloneQueryState(normalized) }\n : null;\n viewRevision.current++;\n updateQueryHistory(() => ({ query: normalized, past: [], future: [] }));\n }\n setStorageReady(true);\n setRestoration(previous => !previous.loading && !previous.error ? previous : { loading: false, error: null });\n }\n } catch (e) {\n if (!cancelled && run === generation && epoch === manualQueryEpoch.current) {\n if (explicitLink || navigation && currentController.signal.aborted) {\n setRestoration({ loading: false, error: e instanceof Error ? e : Error(String(e)) });\n } else {\n // Last/default saved queries are optional restoration sources.\n // A failed host read should still leave a usable default table.\n updateQueryHistory(() => ({ query: defaults, past: [], future: [] }));\n setRestoration({ loading: false, error: null });\n }\n setStorageReady(true);\n }\n if (navigation && !cancelled && run === generation && epoch === manualQueryEpoch.current) throw e;\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n }\n }\n restoreHandler.current = async (location, signal) => {\n location = new URL(location, typeof window !== \"undefined\" ? window.location.href : undefined).href;\n const key = tableUrlKey(location);\n const current = restorationCurrent.current;\n if (key === observedQueryUrl.current && current.storageReady && !current.restoration.loading && !current.restoration.error) return;\n recordQueryUrl(location);\n await restore(true, location, signal);\n };\n initialRestore.current = () => restore();\n if (typeof window !== \"undefined\") recordQueryUrl(window.location.href);\n const navigate = () => {\n if (!restorationCurrent.current.active) return;\n const key = tableUrlKey(window.location.href);\n if (key === observedQueryUrl.current) return;\n observedQueryUrl.current = key;\n void restore(true).catch(() => { /* Restoration state owns the display error. */ });\n };\n if (urlSyncEnabled && typeof window !== \"undefined\") window.addEventListener(\"popstate\", navigate);\n return () => {\n cancelled = true; controller.abort();\n restoreHandler.current = null;\n initialRestore.current = null;\n if (urlSyncEnabled && typeof window !== \"undefined\") window.removeEventListener(\"popstate\", navigate);\n };\n }, [sourceSchema.name, urlSyncEnabled, parameter, recordQueryUrl, updateQueryHistory]);\n // Activation pauses a mounted controller; it only initiates restoration if\n // this dataset has never started, preserving edits and history on tab switches.\n useEffect(() => {\n if (active && !initialRestorationStarted.current) void initialRestore.current?.();\n }, [active, sourceSchema.name, urlSyncEnabled, parameter, recordQueryUrl]);\n\n const { api: computed, displaySchema } = useComputedColumns({\n schema,\n query: executionQuery,\n sourceSchema,\n previewQuery: query,\n ...(groupingNow !== undefined ? { now: groupingNow } : {}),\n rows,\n serverComputed,\n ...(serverExecution ? { serverExecution } : {}),\n ...(opts.computedExecution ? { execution: opts.computedExecution } : {}),\n ...(metricTransport ? { metricTransport } : {}),\n ...(opts.metricExecution ? { metricExecution: opts.metricExecution } : {}),\n ...(opts.computedColumnStore ? { store: opts.computedColumnStore } : {}),\n ...(opts.formulaWorkerFactory\n ? { workerFactory: opts.formulaWorkerFactory }\n : {}),\n ...(transport ? { transport } : {}),\n ...(clientRows ? { clientRows } : {}),\n });\n\n const resolveComputed = useCallback(\n (name: string) =>\n isComputedField(name)\n ? computed.compile(`[${name.replace(/]/g, \"]] \".trim())}]`)\n : undefined,\n [computed.compile],\n );\n const metricCompileSchema = useMemo(() => opts.metricExecution\n ? sourceExecutionSchema(displaySchema, opts.metricExecution, computed.definitions)\n : displaySchema, [displaySchema, opts.metricExecution, computed.definitions]);\n const metricCompile = useCallback(\n (clause: AggregationClause) => {\n const diagnostics = validateMetric(\n clause,\n metricCompileSchema,\n resolveComputed,\n );\n if (diagnostics.length)\n throw new Error(diagnostics.map((d) => d.message).join(\" \"));\n return metricPlans(clause, metricCompileSchema, resolveComputed);\n },\n [metricCompileSchema, resolveComputed],\n );\n const computedRevisions = useMemo(\n () =>\n Object.fromEntries(computed.definitions.map((d) => [d.id, d.revision])),\n [computed.definitions],\n );\n const definitionKey = JSON.stringify(computedRevisions);\n\n // Fetch (debounced + abortable). Transport mode, or client-side applyQuery.\n const queryKey = useMemo(() => JSON.stringify(query), [query]);\n const serverRowQuery = useMemo(() => {\n const execution = opts.computedExecution;\n const detailConfig = typeof opts.itemDetails === \"object\" ? opts.itemDetails : undefined;\n const page = query.itemDetails?.page ?? detailConfig?.page;\n const pageEnabled = Boolean(opts.itemDetails) && (query.itemDetails?.modes ?? initialDetailModes(detailConfig)).includes(\"page\")\n && (!detailConfig?.modes || detailConfig.modes.includes(\"page\"));\n const pageFields = pageEnabled ? itemPageFields(page?.urlTemplate ?? \"\") : [];\n // Page templates can use fields outside the visible projection. Ask the\n // transport for those dependencies through its usual SELECT planning.\n const requestQuery = pageFields.length ? { ...executionQuery, select: [...(query.select.length ? query.select : defaults.select),\n ...pageFields.filter(name => displaySchema.fields.some(field => field.name === name)).map(field => ({ field }))] } : executionQuery;\n const v2Request =\n execution && transport?.fetchRowsV2\n ? toServerQueryV2(requestQuery, displaySchema, execution)\n : undefined;\n const request = v2Request ?? toServerQuery(requestQuery, displaySchema);\n if (v2Request)\n for (const definition of computed.definitions) {\n if (\n (execution?.fields[computedFieldName(definition.id)]?.select ||\n v2Request.orderBy.some(\n (term) => term.field === computedFieldName(definition.id),\n )) &&\n executionRevision(execution, definition.id) !== undefined &&\n executionRevision(execution, definition.id) !== definition.revision\n )\n v2Request.diagnostics.push({\n from: 0,\n to: 1,\n code: \"definition_changed\",\n message:\n \"Computed definitions changed. Refresh the server execution handshake.\",\n });\n }\n // A shown-row metric may refer to columns outside the visible projection.\n for (const clause of query.aggregations ?? [])\n if (clause.scope === \"shownRows\") {\n try {\n for (const name of metricDependencies(\n clause,\n schema,\n resolveComputed,\n )) {\n const field = schema.fields.find((f) => f.name === name);\n if (field?.source.kind === \"backend\") request.select.push(name);\n else\n for (const dep of field?.source.kind === \"derived\"\n ? (field.source.dependencies ?? [])\n : [])\n request.select.push(dep);\n }\n } catch {\n /* Invalid metric stays editable and fails metric validation. */\n }\n }\n request.select = [...new Set(request.select)].sort();\n return request;\n }, [\n queryKey,\n displaySchema,\n transport,\n computedRevisions,\n schema,\n resolveComputed,\n opts.computedExecution,\n opts.itemDetails,\n defaults,\n ]);\n // Keep presentation-only query changes out of the expensive row pipeline.\n // Widths do not leave the client at all, and SELECT does not affect client-side\n // filtering/sorting/paging. The full queryKey still drives URL + persistence.\n const rowQueryKey = useMemo(\n () =>\n transport\n ? `server:${JSON.stringify(serverRowQuery)}:${transport.fetchQueryV3 ? JSON.stringify([groupKey, groupingNow,\n query.select.map(column => column.field), query.where, query.orderBy, query.limit, query.offset]) : \"\"}`\n : `client:${JSON.stringify([query.where, query.orderBy, query.limit, query.offset])}`,\n [\n transport,\n serverRowQuery,\n groupKey,\n groupingNow,\n query.select,\n query.where,\n query.orderBy,\n query.limit,\n query.offset,\n ],\n );\n const executionKey = JSON.stringify(opts.computedExecution ?? null);\n // Host state is part of what a page shows: a result or failure under one\n // host state never stands for another.\n const pageContext = `${schema.name}:${rowQueryKey}:${nonce}:${executionKey}:${hostStateKey}`;\n useEffect(() => {\n if (!active || !storageReady || restoration.loading || restoration.error) {\n setRows(previous => previous.length ? [] : previous); setTotal(null); setCommittedPage(null); setLoading(false);\n return;\n }\n const ac = new AbortController();\n let cancelled = false;\n const run = async () => {\n setLoading(true);\n setError(null);\n setFailedPage(null);\n try {\n validateExecution(query);\n if (transport) {\n if (transport.fetchQueryV3 && transport.queryCapabilities?.version === 3 &&\n (query.grouping || query.select.some(column => isComputedField(column.field)) || query.orderBy.some(term => isComputedField(term.field)) ||\n query.where.some(term => predicatesOf(term).some(predicate => isComputedField(predicate.field))) ||\n !transport.fetchRows && !(transport.fetchRowsV2 && opts.computedExecution))) {\n const request = toQueryRequestV3({ ...query, aggregations: [], select: [...query.select.filter(column => isComputedField(column.field)),\n ...serverRowQuery.select.map(field => ({ field }))] }, sourceSchema,\n transport.queryCapabilities, opts.computedExecution, { now: groupingNow ?? (opts.evaluationNow ?? Date.now)() });\n if (request.diagnostics.length) throw Error(request.diagnostics.join(\" \"));\n const result = await transport.fetchQueryV3(request, ac.signal);\n validateQueryResultV3(result, request, query.grouping ? schema : sourceCatalogue);\n if (!cancelled) {\n setCommittedFields(request.result.select); setServerExecution(result.execution);\n setServerComputed(new Map(result.rows.map(row => [row[schema.idField] as RowId,\n Object.fromEntries(Object.entries(row).filter(([name]) => isComputedField(name)).map(([name, value]) =>\n [name.slice(10), value && typeof value === \"object\" && \"computedError\" in value\n ? { value: null, error: { code: String(value.computedError) } } : { value: value as import(\"@pythia-software/query-table-core\").MetricValue }]))])));\n setRows(result.rows as Row[]); setTotal(result.total); setCommittedPage(pageContext);\n setCommittedSource({ schema, transport, clientRows });\n }\n return;\n }\n const useV2 = \"version\" in serverRowQuery && transport.fetchRowsV2;\n if (!useV2 && !transport.fetchRows)\n throw Error(\"Row execution requires fetchRows, negotiated fetchRowsV2, or negotiated fetchQueryV3.\");\n if (\n \"diagnostics\" in serverRowQuery &&\n Array.isArray(serverRowQuery.diagnostics) &&\n serverRowQuery.diagnostics.length\n )\n throw Error(\n serverRowQuery.diagnostics.map((d) => d.message).join(\" \"),\n );\n if (!useV2 && query.orderBy.some((s) => isComputedField(s.field)))\n throw Error(\n \"Global computed sorting requires a server execution handshake and fetchRowsV2.\",\n );\n const res = useV2\n ? await transport.fetchRowsV2!(\n serverRowQuery as ReturnType<typeof toServerQueryV2<Row>>,\n ac.signal,\n )\n : await transport.fetchRows!(serverRowQuery, ac.signal);\n if (useV2)\n validateComputedResponse(\n serverRowQuery as ReturnType<typeof toServerQueryV2<Row>>,\n res as import(\"@pythia-software/query-table-core\").FetchRowsResultV2<Row>,\n schema,\n );\n if (!cancelled) {\n setCommittedFields(serverRowQuery.select);\n setServerExecution(\n useV2\n ? (\n res as import(\"@pythia-software/query-table-core\").FetchRowsResultV2<Row>\n ).execution\n : undefined,\n );\n if (\"computed\" in res && Array.isArray(res.computed))\n setServerComputed(\n new Map(res.computed.map((c) => [c.id, c.values])),\n );\n else setServerComputed(new Map());\n setRows(res.rows);\n setTotal(res.total);\n setCommittedPage(pageContext);\n setCommittedSource({ schema, transport, clientRows });\n }\n } else {\n const res = applyQuery(clientRows ?? [], executionQuery, schema,\n groupingNow !== undefined ? { now: groupingNow } : {});\n if (!cancelled) {\n setRows(res.rows);\n setTotal(res.total);\n setCommittedPage(pageContext);\n setCommittedSource({ schema, transport, clientRows });\n }\n }\n } catch (e) {\n if (!cancelled && !ac.signal.aborted) {\n setError(e as Error);\n setFailedPage(pageContext);\n setRows([]);\n setTotal(null);\n setCommittedPage(null);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n const t = setTimeout(run, debounceMs);\n return () => {\n cancelled = true;\n clearTimeout(t);\n ac.abort();\n };\n // rowQueryKey captures only row-affecting query state; clientRows/nonce\n // force refetch. Presentation changes still sync/persist via queryKey below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n rowQueryKey,\n transport,\n clientRows,\n schema,\n debounceMs,\n nonce,\n validateExecution,\n executionKey,\n groupingNow,\n restoration,\n active,\n storageReady,\n ]);\n\n // Persist last query (debounced). The \"succeeded\" policy waits for the\n // execution receipt below.\n const persistLast = opts.persistLast ?? \"always\";\n // Last-used state through storage that drops host state would restore a table-only query.\n const hostStorageUnsupported = Boolean(host) && !storage.storesHostState;\n useEffect(() => {\n if (persistLast !== \"always\" || !storageReady || restoration.loading || restoration.error || hostStorageUnsupported) return;\n const t = setTimeout(() => void storage.saveLast(sourceSchema.name, query), 400);\n return () => clearTimeout(t);\n }, [persistLast, queryKey, storage, sourceSchema.name, query, restoration, storageReady, hostStorageUnsupported]);\n\n // Resolved id accessor.\n const idField = useMemo(\n () => schema.fields.find((f) => f.name === schema.idField),\n [schema],\n );\n const rowId = useCallback(\n (row: Row): RowId | null =>\n (() => {\n const value = idField ? readFieldValue(idField, row) : (row as Record<string, unknown> | null)?.[schema.idField];\n return typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value)) ? value : null;\n })(),\n [idField, schema.idField],\n );\n\n // Sub-APIs.\n const displayedIds = useMemo(\n () => rows.map(rowId).filter((id): id is RowId => id != null),\n [rows, rowId],\n );\n const selection = useSelection(displayedIds);\n const identityScope = JSON.stringify([sourceSchema.name, query.grouping?.keys ?? null]);\n useEffect(() => { selection.clear(); }, [identityScope, selection.clear]);\n const columnSchema = useMemo(() => detailColumnSchema(displaySchema, detailsEnabled || groupDetailsEnabled), [displaySchema, detailsEnabled, groupDetailsEnabled]);\n const resultDefaults = useMemo(() => query.grouping ? defaultsFor(schema) : defaults, [Boolean(query.grouping), schema, defaults]);\n const select = useSelect(query, setQuery, columnSchema);\n const columnDrag = useColumnDrag();\n const savedQueries = useSavedQueries(\n sourceSchema.name,\n query,\n (q) => {\n // A save without host state takes the host defaults rather than keep\n // the live state; an unacceptable one throws before anything changes.\n const normalized = withHostState(normalizeQueryState(q, defaults), hostRef.current);\n savedBaseline.current = { source: sourceSchema.name, query: cloneQueryState(normalized) };\n viewRevision.current++;\n setQuery(normalized);\n },\n storage,\n now,\n links.snapshot,\n );\n // With host state, saved items compare as the definitions they load, and\n // saving refuses storage that would drop the host state.\n const hostStorageError = host && !storage.storesHostState\n ? \"This storage adapter cannot save host query state (set StorageAdapter.storesHostState once it keeps QueryState.hostState).\" : null;\n const savedItems = useMemo(() => !host ? savedQueries.items : savedQueries.items.map(item => {\n try { return { ...item, query: withHostState(normalizeQueryState(item.query, defaults), hostRef.current) }; } catch { return item; }\n }), [savedQueries.items, Boolean(host), defaults]);\n const saved: SavedQueriesApi = { ...savedQueries, items: savedItems, save: async name => {\n if (hostStorageError) throw Error(hostStorageError);\n const item = await savedQueries.save(name);\n savedBaseline.current = { source: sourceSchema.name, query: cloneQueryState(withHostState(normalizeQueryState(item.query, defaults), hostRef.current)) };\n viewRevision.current++;\n return item;\n }, update: async id => {\n if (hostStorageError) throw Error(hostStorageError);\n return savedQueries.update(id);\n } };\n const pageReady =\n committedPage === pageContext &&\n committedSource?.schema === schema &&\n committedSource?.transport === transport &&\n committedSource?.clientRows === clientRows &&\n !error;\n const dataToken = useRef(0);\n const dataVersion = useMemo(\n () => ++dataToken.current,\n [schema, transport, clientRows, rows, nonce, definitionKey, executionKey, metricTransport, opts.metricExecution],\n );\n const metricRowsReady = pageReady && (opts.metricRowsReady?.(query) ?? true);\n const metricExecution = opts.metricExecution ?? (opts.computedExecution\n ? pageReady && serverExecution ? serverExecution : opts.computedExecution\n : undefined);\n const v3MetricExecution = opts.metricExecution ?? opts.computedExecution;\n const metricSourceCatalogue = useMemo(() => sourceExecutionSchema(sourceSchema, v3MetricExecution),\n [sourceSchema, v3MetricExecution]);\n const executeV3Metrics = useCallback(async (metricQuery: QueryState, signal?: AbortSignal) => {\n if (!metricTransport?.fetchQueryV3 || metricTransport.queryCapabilities?.version !== 3) throw Error(\"The v3 query executor is unavailable.\");\n const capabilities = metricTransport.queryCapabilities;\n // Unsupported population controls fail their own cards, never the batch.\n const refused = new Map<string, string>();\n for (const clause of metricQuery.aggregations ?? []) {\n const issue = metricPopulationError(clause, { filters: capabilities.metricFilters, minCount: capabilities.metricMinCount, minCountMeasures: capabilities.metricMinCountMeasures });\n if (issue) refused.set(clause.id, issue);\n }\n const runnable = (metricQuery.aggregations ?? []).filter(clause => !refused.has(clause.id));\n let metrics: AggregationResult[\"metrics\"] = [];\n if (runnable.length) {\n const scoped = { ...metricQuery, aggregations: runnable };\n const request = toQueryRequestV3(query.grouping ? { ...scoped, grouping: query.grouping } : scoped,\n sourceSchema, capabilities, v3MetricExecution, { now: groupingNow ?? (opts.evaluationNow ?? Date.now)(), rows: false });\n if (request.diagnostics.length) throw Error(request.diagnostics.join(\" \"));\n const result = await metricTransport.fetchQueryV3(request, signal);\n validateQueryResultV3(result, request, query.grouping ? schema : metricSourceCatalogue);\n metrics = result.metrics;\n }\n if (!refused.size) return { metrics };\n const byId = new Map(metrics.map(metric => [metric.id, metric]));\n return { metrics: (metricQuery.aggregations ?? []).flatMap((clause): AggregationResult[\"metrics\"] => {\n const issue = refused.get(clause.id);\n if (issue) return [{ id: clause.id, buckets: [], error: issue }];\n const metric = byId.get(clause.id);\n return metric ? [metric] : [];\n }) };\n }, [metricTransport, sourceSchema, metricSourceCatalogue, schema, v3MetricExecution, groupKey, groupingNow, opts.evaluationNow]);\n const previewGrouping = useCallback(async (draft: QueryState, signal?: AbortSignal) => {\n if (!active || !storageReady || restoration.loading || restoration.error) throw Error(\"Wait for query restoration before previewing groups.\");\n if (!transport?.fetchQueryV3 || !transport.queryCapabilities?.groupedRows || !draft.grouping) throw Error(\"The server group preview is unavailable.\");\n const request = toQueryRequestV3({ ...draft, aggregations: [] }, sourceSchema, transport.queryCapabilities,\n opts.computedExecution, { now: groupingNow ?? (opts.evaluationNow ?? Date.now)() });\n if (request.diagnostics.length) throw Error(request.diagnostics.join(\" \"));\n const result = await transport.fetchQueryV3(request, signal);\n validateQueryResultV3(result, request, groupingModel.resultSchema(draft.grouping.keys, draft.grouping.summaries));\n return { rows: result.rows, total: result.total, sourceTotal: result.sourceTotal };\n }, [transport, sourceSchema, opts.computedExecution, groupingModel, groupingNow, opts.evaluationNow, active, storageReady, restoration.loading, restoration.error]);\n const aggState = useAggregations(\n executionQuery,\n schema,\n metricTransport,\n clientRows,\n debounceMs,\n nonce,\n validateExecution,\n {\n ...(metricTransport?.fetchQueryV3 && metricTransport.queryCapabilities?.version === 3 &&\n (query.grouping || query.aggregations?.some(metric => metric.dateGrouping) ||\n query.where.some(term => predicatesOf(term).some(predicate => isComputedField(predicate.field))))\n ? { executeV3: executeV3Metrics, queryContextKey: groupKey } : {}),\n ...(groupingNow !== undefined ? { now: groupingNow, strictLocalMetrics: true } : {}),\n shownRows: rows,\n rowsReady: metricRowsReady,\n rowsError: error,\n ...(transport ? { shownFields: committedFields } : {}),\n resolveComputed,\n revisions: computedRevisions,\n ...(metricExecution ? { execution: metricExecution } : {}),\n ...(opts.formulaWorkerFactory\n ? { workerFactory: opts.formulaWorkerFactory }\n : {}),\n },\n active && storageReady && !restoration.loading && !restoration.error,\n );\n const queryRef = useRef(query);\n queryRef.current = query;\n const replaceAggregations = useCallback(\n (clauses: AggregationClause[], expected?: AggregationClause[]) => {\n if (\n expected &&\n JSON.stringify(queryRef.current.aggregations ?? []) !==\n JSON.stringify(expected)\n )\n throw new Error(\n \"Metrics changed while editing. Reopen the editor to use the latest configuration.\",\n );\n for (const clause of clauses) metricCompile(clause);\n setQuery((q) => ({\n ...q,\n aggregations: JSON.parse(\n JSON.stringify(clauses),\n ) as AggregationClause[],\n }));\n },\n [setQuery, metricCompile],\n );\n\n const canUndo = queryHistory.past.length > 0;\n const canRedo = queryHistory.future.length > 0;\n\n const undo = useCallback(() => {\n if (!queryHistoryRef.current.past.length) return;\n manualQueryEpoch.current++;\n restoreController.current?.abort();\n setStorageReady(true);\n setRestoration({ loading: false, error: null });\n updateQueryHistory((history) => {\n const previous = history.past[history.past.length - 1];\n if (!previous) return history;\n return { query: cloneQueryState(previous), past: history.past.slice(0, -1), future: [...history.future, cloneQueryState(history.query)] };\n });\n }, [updateQueryHistory]);\n\n const redo = useCallback(() => {\n if (!queryHistoryRef.current.future.length) return;\n manualQueryEpoch.current++;\n restoreController.current?.abort();\n setStorageReady(true);\n setRestoration({ loading: false, error: null });\n updateQueryHistory((history) => {\n const next = history.future[history.future.length - 1];\n if (!next) return history;\n return { query: cloneQueryState(next), past: [...history.past, cloneQueryState(history.query)], future: history.future.slice(0, -1) };\n });\n }, [updateQueryHistory]);\n\n // ---- intent helpers (keep offset/url/storage coherent) ----\n const patch = useCallback(\n (p: Partial<QueryState>) => setQuery((prev) => ({ ...prev, ...p })),\n [setQuery],\n );\n\n const { addFilter, updateFilter, removeFilter, clearFilters, updatePredicate, removePredicate, negatePredicate, reorderFilters, mergeFilters } = useQueryFilters(schema, setQuery);\n\n const resetAll = useCallback(\n () => {\n const baseline = savedBaseline.current;\n viewRevision.current++;\n setQuery(cloneQueryState(baseline?.source === sourceSchema.name ? baseline.query : defaults));\n },\n [setQuery, defaults, sourceSchema.name],\n );\n\n // ---- aggregation metric mutators (don't touch paging — scope is the whole set) ----\n const addAggregation = useCallback<AggregationsApi[\"add\"]>(\n (partial) => {\n const id = `a${nowRef.current()}-${aggIdRef.current++}`;\n const clause: AggregationClause = {\n id,\n op: \"count\",\n groupBy: [],\n ...partial,\n };\n setQuery((q) => ({\n ...q,\n aggregations: [...(q.aggregations ?? []), clause],\n }));\n return id;\n },\n [setQuery],\n );\n const updateAggregation = useCallback<AggregationsApi[\"update\"]>(\n (id, patch) =>\n setQuery((q) => ({\n ...q,\n aggregations: (q.aggregations ?? []).map((a) =>\n a.id === id ? mergeAggregation(a, patch) : a,\n ),\n })),\n [setQuery],\n );\n const moveAggregation = useCallback<AggregationsApi[\"move\"]>(\n (id, toIndex) =>\n setQuery((q) => {\n const current = q.aggregations ?? [];\n const from = current.findIndex((a) => a.id === id);\n if (from === -1) return q;\n const next = [...current];\n const [item] = next.splice(from, 1);\n next.splice(Math.max(0, Math.min(toIndex, next.length)), 0, item!);\n return { ...q, aggregations: next };\n }),\n [setQuery],\n );\n const removeAggregation = useCallback<AggregationsApi[\"remove\"]>(\n (id) =>\n setQuery((q) => ({\n ...q,\n aggregations: (q.aggregations ?? []).filter((a) => a.id !== id),\n })),\n [setQuery],\n );\n const clearAggregations = useCallback<AggregationsApi[\"clear\"]>(\n () => setQuery((q) => ({ ...q, aggregations: [] })),\n [setQuery],\n );\n\n const setSort = useCallback(\n (orderBy: OrderByClause[]) =>\n setQuery((q) => ({ ...q, offset: 0, orderBy })),\n [setQuery],\n );\n const toggleSort = useCallback(\n (field: string, additive = false) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n orderBy: nextOrderBy(q.orderBy, field, additive),\n })),\n [setQuery],\n );\n\n const setLimit = useCallback(\n (limit: number) => patch({ limit, offset: 0 }),\n [patch],\n );\n const setOffset = useCallback((offset: number) => patch({ offset }), [patch]);\n const nextPage = useCallback(\n () => setQuery((q) => ({ ...q, offset: q.offset + q.limit })),\n [setQuery],\n );\n const prevPage = useCallback(\n () => setQuery((q) => ({ ...q, offset: Math.max(0, q.offset - q.limit) })),\n [setQuery],\n );\n\n const filterValues = useCallback(\n async (field: string, search: string): Promise<DistinctValuesResult> => {\n // A calendar key's values are interval starts, not source values.\n if (!metadataTransport?.fetchDistinctValues || query.grouping && !query.grouping.keys.includes(field)) {\n const f = byName.get(field);\n if (!f || !clientRows) return { values: [], hasMore: false };\n\n const fieldHasNull = fieldHasNullInRows(f, clientRows);\n const matches = distinctValuesFromRows(f, clientRows, search);\n\n return {\n values: matches.values,\n hasMore: matches.hasMore,\n hasNull: fieldHasNull,\n };\n }\n return metadataTransport.fetchDistinctValues({ field, search });\n },\n [metadataTransport, byName, clientRows, groupKey],\n );\n\n const fieldStats = useCallback<QueryTableApi<Row>[\"fieldStats\"]>(\n async (fields, signal) => {\n const requested = [...new Set(fields)];\n if (metadataTransport?.fetchFieldStats && !query.grouping) {\n const backendFields = requested.filter(\n (name) => byName.get(name)?.source.kind === \"backend\",\n );\n return backendFields.length\n ? metadataTransport.fetchFieldStats(backendFields, signal)\n : {};\n }\n if (!clientRows) return {};\n\n const result: Record<string, FieldStats> = {};\n for (const name of requested) {\n if (signal?.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n const field = byName.get(name);\n if (!field) continue;\n const distinct = new Set<string>();\n for (const row of clientRows) {\n const value = readFieldValue(field, row);\n if (value !== null) distinct.add(JSON.stringify(value));\n }\n result[name] = { distinct: distinct.size };\n }\n return result;\n },\n [metadataTransport, byName, clientRows, groupKey],\n );\n\n // Single refresh seam: re-runs the internal query (setNonce) and fires the\n // consumer's onRefresh, if any. Both the manual `api.refresh()` and every\n // auto-refresh tick go through here, so they stay observably identical. Read\n // onRefresh through a ref to keep this callback (and the interval that depends\n // on it) stable across renders.\n const refresh = useCallback(() => {\n setNonce((n) => n + 1);\n onRefreshRef.current?.();\n }, []);\n const stopAutoRefresh = useCallback(() => setAutoRefreshStatus(null), []);\n const startAutoRefresh = useCallback(\n ({ frequencyMs, turnOffAfterMs }: AutoRefreshConfig) => {\n const pollCount =\n frequencyMs > 0 && turnOffAfterMs > 0\n ? Math.floor(turnOffAfterMs / frequencyMs)\n : 0;\n if (pollCount < 1 || pollCount > MAX_AUTO_REFRESH_POLLS) {\n throw new Error(\"Auto-refresh must schedule between 1 and 1000 polls.\");\n }\n\n const startedAt = nowRef.current();\n refresh();\n setAutoRefreshStatus({\n frequencyMs,\n turnOffAfterMs,\n startedAt,\n stopsAt: startedAt + turnOffAfterMs,\n pollCount: 1,\n });\n },\n [refresh],\n );\n\n const autoRefreshFrequencyMs = autoRefreshStatus?.frequencyMs ?? null;\n const autoRefreshStopsAt = autoRefreshStatus?.stopsAt ?? null;\n\n useEffect(() => {\n if (autoRefreshFrequencyMs == null || autoRefreshStopsAt == null) return;\n\n const tick = () => {\n if (nowRef.current() >= autoRefreshStopsAt) {\n setAutoRefreshStatus((current) =>\n current?.stopsAt === autoRefreshStopsAt ? null : current,\n );\n return;\n }\n\n refresh();\n setAutoRefreshStatus((current) => {\n if (!current) return current;\n if (current.stopsAt !== autoRefreshStopsAt) return current;\n return { ...current, pollCount: current.pollCount + 1 };\n });\n };\n\n const interval = setInterval(tick, autoRefreshFrequencyMs);\n const timeout = setTimeout(\n () =>\n setAutoRefreshStatus((current) =>\n current?.stopsAt === autoRefreshStopsAt ? null : current,\n ),\n Math.max(0, autoRefreshStopsAt - nowRef.current()),\n );\n\n return () => {\n clearInterval(interval);\n clearTimeout(timeout);\n };\n }, [autoRefreshFrequencyMs, autoRefreshStopsAt, refresh]);\n\n const autoRefresh = useMemo<AutoRefreshApi>(\n () => ({\n status: autoRefreshStatus,\n start: startAutoRefresh,\n stop: stopAutoRefresh,\n }),\n [autoRefreshStatus, startAutoRefresh, stopAutoRefresh],\n );\n\n const refreshRow = useCallback(\n async (id: RowId) => {\n if (opts.computedExecution && transport?.fetchRowsV2) {\n // Base rows and computed sidecars belong to one committed page. A\n // single-row fetch cannot replace either independently, and changes\n // to a computed sort may also change page membership.\n refresh();\n return;\n }\n if (!transport?.fetchRow) return;\n const updated = await transport.fetchRow(id);\n setRows((prev) =>\n prev.map((r) => (rowId(r) === id ? (updated ?? r) : r)),\n );\n },\n [transport, rowId, opts.computedExecution, refresh],\n );\n\n const visibleFields = useMemo(\n () => selectedFields(columnSchema, query),\n [columnSchema, query],\n );\n\n const aggregations = useMemo<AggregationsApi>(\n () => ({\n clauses: query.aggregations ?? [],\n results: aggState.results,\n loading: aggState.loading,\n error: aggState.error,\n add: addAggregation,\n update: updateAggregation,\n move: moveAggregation,\n remove: removeAggregation,\n clear: clearAggregations,\n preview: aggState.preview,\n replace: replaceAggregations,\n compile: metricCompile,\n contextKey: `${dataVersion}:${pageContext}:${metricRowsReady}:${JSON.stringify(query.where)}`,\n }),\n [\n query.aggregations,\n aggState.results,\n aggState.loading,\n aggState.error,\n addAggregation,\n updateAggregation,\n moveAggregation,\n removeAggregation,\n clearAggregations,\n aggState.preview,\n replaceAggregations,\n metricCompile,\n pageContext,\n metricRowsReady,\n dataVersion,\n query.where,\n ],\n );\n\n // One receipt per execution identity. Rows and metrics are keyed by the\n // current page context and metric state, so a slower earlier execution can\n // never mark this one healthy.\n const executionIdentity = JSON.stringify([pageContext, query.aggregations ?? [], query.where, groupKey, nonce]);\n const executionGeneration = useRef({ key: \"\", generation: 0 });\n if (executionGeneration.current.key !== executionIdentity)\n executionGeneration.current = { key: executionIdentity, generation: executionGeneration.current.generation + 1 };\n const execution = useMemo((): QueryExecutionReceipt | null => {\n if (!active || !storageReady || restoration.loading || restoration.error) return null;\n const rowsStatus = pageReady ? \"succeeded\" : error && failedPage === pageContext ? \"failed\" : \"running\";\n const metricError = aggState.error ?? aggState.results?.metrics.find(entry => entry.error)?.error;\n const metricsStatus = !(query.aggregations?.length) ? \"none\"\n : aggState.loading || (!aggState.results && !aggState.error) ? \"running\"\n : metricError ? \"failed\" : \"succeeded\";\n const status = rowsStatus === \"failed\" || metricsStatus === \"failed\" ? \"failed\"\n : rowsStatus === \"succeeded\" && metricsStatus !== \"running\" ? \"succeeded\" : \"running\";\n return {\n query, key: executionIdentity, generation: executionGeneration.current.generation,\n status, rows: rowsStatus, metrics: metricsStatus,\n error: rowsStatus === \"failed\" ? error : metricError ? (metricError instanceof Error ? metricError : Error(String(metricError))) : null,\n };\n }, [active, storageReady, restoration.loading, restoration.error, pageReady, error, failedPage, pageContext,\n aggState.error, aggState.results, aggState.loading, query, executionIdentity]);\n const succeededQuery = execution?.status === \"succeeded\" ? execution.query : null;\n // A success stays pending until saved: a later edit that is still running\n // or fails does not cancel it, and a refresh of the same query does not\n // restart the debounce. Only a newer success replaces it.\n const pendingLast = useRef<{ key: string; save: () => void; timer: ReturnType<typeof setTimeout> } | null>(null);\n const savedLast = useRef<string | null>(null);\n useEffect(() => {\n if (persistLast !== \"succeeded\" || !succeededQuery || hostStorageUnsupported) return;\n const key = JSON.stringify([sourceSchema.name, succeededQuery]);\n if (pendingLast.current?.key === key || (!pendingLast.current && savedLast.current === key)) return;\n if (pendingLast.current) clearTimeout(pendingLast.current.timer);\n const save = () => {\n pendingLast.current = null;\n savedLast.current = key;\n void storage.saveLast(sourceSchema.name, succeededQuery);\n };\n pendingLast.current = { key, save, timer: setTimeout(save, 400) };\n }, [persistLast, succeededQuery, storage, sourceSchema.name, hostStorageUnsupported]);\n // Unmounting writes a pending success rather than dropping it.\n useEffect(() => () => {\n const pending = pendingLast.current;\n if (pending) { clearTimeout(pending.timer); pending.save(); }\n }, []);\n\n const sourceRowId = useCallback((row: Row): RowId | null => {\n const field = sourceSchema.fields.find(f => f.name === sourceSchema.idField);\n const value = field ? readFieldValue(field, row) : (row as Record<string, unknown>)[sourceSchema.idField];\n return typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value)) ? value : null;\n }, [sourceSchema]);\n\n const itemDetails = useItemDetails({\n schema: query.grouping ? sourceSchema : displaySchema,\n query: sourceQuery, setQuery: setSourceQuery, options: opts.itemDetails,\n rows: query.grouping ? sourceRows ?? [] : rows, clientRows: sourceRows,\n rowId: sourceRowId, transport: metadataTransport, refreshKey: nonce, links, queryParameter: parameter,\n queryReady: storageReady && !restoration.loading && !restoration.error,\n });\n\n // Group Detail reads grouped rows already held, by their group identity; it\n // never loads a source item by that ID. Rows seen for this population stay\n // readable across pages and sorts, and a changed population drops them.\n // A population is the grouped query and host state over one data source;\n // new rows, a new transport or a new schema start it afresh.\n const groupPopulation = query.grouping ? JSON.stringify([query.grouping, query.where, nonce, hostStateKey]) : \"\";\n const groupRecords = useRef({ population: \"\", source: [] as unknown[], rows: new Map<RowId, Row>() });\n const groupSource = [clientRows, transport, schema];\n if (groupRecords.current.population !== groupPopulation || groupSource.some((part, i) => part !== groupRecords.current.source[i]))\n groupRecords.current = { population: groupPopulation, source: groupSource, rows: new Map() };\n // Only rows committed for the current page context belong to this population.\n const groupsSettled = groupDetailsEnabled && pageReady && !restoration.loading;\n if (groupsSettled) for (const row of rows) {\n const id = rowId(row);\n if (id != null) groupRecords.current.rows.set(id, row);\n }\n const groupDetailOptions = useMemo((): ItemDetailsOptions<Row> | undefined => {\n if (!groupDetailsEnabled) return undefined;\n const config = typeof opts.itemDetails === \"object\" ? opts.itemDetails : undefined;\n // Page templates address source items, so groups offer the in-place modes.\n const modes = (config?.modes ?? [\"hover\", \"modal\", \"expand\"]).filter(mode => mode !== \"page\");\n return { modes, defaultModes: initialDetailModes(config).filter(mode => (modes as string[]).includes(mode)),\n objectType: `${config?.objectType ?? sourceSchema.name}:groups`,\n ...(config?.storage ? { storage: config.storage } : {}) };\n }, [groupDetailsEnabled, opts.itemDetails, sourceSchema.name]);\n // Group properties default to every key and summary, links included.\n const groupDetailSchema = useMemo(() => ({ ...displaySchema,\n defaultSelect: displaySchema.fields.filter(field => field.name !== displaySchema.idField).map(field => ({ field: field.name })),\n fields: displaySchema.fields.map(field =>\n field.name === displaySchema.idField ? { ...field, property: { enabled: false } } : field) }), [displaySchema]);\n // Property-view writes that land after grouping ends must not reach the source query.\n const setGroupQuery = useCallback<QueryTableApi<Row>[\"setQuery\"]>((next) => setQuery(current =>\n current.grouping ? typeof next === \"function\" ? next(current) : next : current), [setQuery]);\n const groupDetails = useItemDetails({\n schema: groupDetailSchema, query, setQuery: setGroupQuery, options: groupDetailOptions, rows, clientRows: undefined,\n rowId, transport: undefined, refreshKey: nonce, links, queryParameter: parameter,\n queryReady: storageReady && !restoration.loading && !restoration.error,\n lookupRow: (id) => {\n const row = groupRecords.current.rows.get(id);\n return row ? { row } : groupsSettled || error ? null : undefined;\n },\n subject: \"group\",\n });\n\n const api: QueryTableApi<Row> = {\n restoration: { status: restoration.error ? \"error\" : !storageReady || restoration.loading ? \"resolving\" : \"ready\",\n ready: active && storageReady && !restoration.loading && !restoration.error, error: restoration.error },\n execution,\n ...(host && query.hostState ? {\n definition: { query: withoutHostState(query), hostState: query.hostState },\n setDefinition: (next: QueryDefinition | ((previous: QueryDefinition) => QueryDefinition)) => {\n const current = queryHistoryRef.current.query;\n const value = typeof next === \"function\"\n ? next({ query: withoutHostState(current), hostState: current.hostState! })\n : next;\n // Validate before committing, so a rejected host state changes nothing.\n setQuery(withHostState({ ...normalizeQueryState(value.query, defaults), hostState: value.hostState }, hostRef.current));\n },\n } : {}),\n restoreLocation,\n links,\n schema: columnSchema,\n ...(itemDetails && detailsEnabled ? { itemDetails } : groupDetails ? { itemDetails: groupDetails } : {}),\n query,\n defaults: resultDefaults,\n setQuery,\n rows,\n total,\n loading: loading || restoration.loading,\n error: restoration.error ?? error,\n requestActivity,\n canUndo,\n canRedo,\n undo,\n redo,\n refresh,\n autoRefresh,\n refreshRow,\n aggregations,\n addFilter,\n updateFilter,\n removeFilter,\n clearFilters,\n updatePredicate,\n removePredicate,\n negatePredicate,\n reorderFilters,\n mergeFilters,\n resetAll,\n filterValues,\n fieldStats,\n toggleSort,\n setSort,\n select,\n computed,\n setLimit,\n setOffset,\n nextPage,\n prevPage,\n selection,\n saved,\n columnDrag,\n visibleFields,\n rowId,\n };\n // Source filter controls key their metadata reads by these identities, so\n // they must not change on every render of a grouped view.\n const sourceFilterValues = useCallback<GroupingSourceApi<Row>[\"filterValues\"]>(async (name, search) => {\n if (metadataTransport?.fetchDistinctValues) return metadataTransport.fetchDistinctValues({ field: name, search });\n const field = groupingModel.sourceField(name);\n return field && sourceRows ? { ...distinctValuesFromRows(field, sourceRows, search), hasNull: fieldHasNullInRows(field, sourceRows) } : { values: [], hasMore: false };\n }, [metadataTransport, groupingModel, sourceRows]);\n const sourceFieldStats = useCallback<GroupingSourceApi<Row>[\"fieldStats\"]>(async (names, signal) => {\n if (signal?.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n const requested = [...new Set(names)];\n if (metadataTransport?.fetchFieldStats) {\n const backendFields = requested.filter(\n name => sourceCatalogue.fields.find(field => field.name === name)?.source.kind === \"backend\",\n );\n return backendFields.length ? metadataTransport.fetchFieldStats(backendFields, signal) : {};\n }\n return Object.fromEntries(requested.flatMap(name => {\n const field = groupingModel.sourceField(name);\n return field && sourceRows ? [[name, { distinct: new Set(sourceRows.map(row => JSON.stringify(readFieldValue(field, row)))).size }]] : [];\n }));\n }, [metadataTransport, groupingModel, sourceRows, sourceCatalogue]);\n const sourceApi: GroupingSourceApi<Row> = {\n ...sourceFilters, loading, rowId: sourceRowId, query: sourceQuery, setQuery: setSourceQuery,\n ...(itemDetails ? { itemDetails } : {}),\n schema: sourceCatalogue,\n filterValues: sourceFilterValues,\n fieldStats: sourceFieldStats,\n };\n const grouping = useGroupingController(api, sourceApi, groupingModel, prepared?.inputs ?? sourceRows ?? [], groupingSupported, viewRevision.current,\n { inputsReady: !remoteGrouping, ...(remoteGrouping ? { preview: previewGrouping } : {}) });\n return {\n ...api,\n ...(groupingSupported || query.grouping ? { grouping } : {}),\n select: { ...select, hide: field => query.grouping && groupKeyFields(query.grouping.keys).includes(field)\n ? grouping.changeKeys(query.grouping.keys.filter(key => groupKeyField(key) !== field)) : select.hide(field) },\n };\n}\n\n/** Multi-sort header click logic.\n * - plain click on the sole sorted column → flip its direction\n * - plain click on another column → make it the only sort (desc)\n * - shift-click a new column → append it (desc) as a secondary term\n * - shift-click an existing term → cycle desc → asc → remove */\nfunction nextOrderBy(\n existing: OrderByClause[],\n field: string,\n additive: boolean,\n): OrderByClause[] {\n const i = existing.findIndex((s) => s.field === field);\n if (!additive) {\n if (i === 0 && existing.length === 1) {\n const flipped: \"asc\" | \"desc\" =\n existing[0]!.dir === \"desc\" ? \"asc\" : \"desc\";\n return [{ ...existing[0]!, dir: flipped }];\n }\n return [{ field, dir: \"desc\" }];\n }\n if (i === -1) return [...existing, { field, dir: \"desc\" }];\n const cur = existing[i]!;\n if (cur.dir === \"desc\") {\n const next = [...existing];\n next[i] = { ...cur, dir: \"asc\" };\n return next;\n }\n return existing.filter((_, k) => k !== i); // asc → remove\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type {\n FieldSchema, ItemDetailMode, ItemPropertyMode, ItemPageOptions, ItemDetailsState, PropertyViewStorage,\n QueryState, RelationshipAdapter, RowId, Transport, PropertyViewState, ScopedJsonInspectionState, AttentionRegistry, AttentionProvider,\n} from \"@pythia-software/query-table-core\";\nimport { isPropertyFieldLoaded, jsonInspectionScopeKey, MAX_JSON_INSPECTIONS } from \"@pythia-software/query-table-core\";\nimport { usePropertyView, type PropertyViewApi } from \"./usePropertyView\";\nimport type { QueryLinksApi } from \"./useQueryLinks\";\n\nexport interface ItemDetailRecord<Row> {\n row: Row;\n /** Omit for complete records. Supply for a projection to distinguish missing values from NULL. */\n loadedFields?: readonly string[];\n}\nexport interface ItemDetailsOptions<Row> {\n /** Detail catalogue; defaults to the table catalogue. Useful for non-column properties. */\n schema?: FieldSchema<Row>;\n /** Optional semantic reveal service, shared with host attention navigation. */\n attention?: AttentionRegistry;\n /** Legacy collection URL parameter. useQueryTable.queryParameter takes precedence. */\n queryParameter?: string;\n /** Creator-approved modalities; users can enable/disable these in Select columns. Defaults to all. */\n modes?: ItemDetailMode[];\n /** Initially selected buttons. Defaults to Modal (or the first allowed mode). */\n defaultModes?: ItemDetailMode[];\n /** Creator's initial Page link settings; users can override in the column editor. */\n page?: ItemPageOptions;\n storage?: PropertyViewStorage;\n objectType?: string;\n relationships?: RelationshipAdapter;\n /** Defaults to complete clientRows or Transport.fetchRow, then the current projected row. */\n loadRow?: (id: RowId, signal: AbortSignal) => Promise<ItemDetailRecord<Row> | null>;\n}\nexport interface ItemDetailsApi<Row> {\n /** \"group\" details describe grouped result rows, identified by their group identity. */\n subject?: \"item\" | \"group\";\n links?: QueryLinksApi;\n jsonInspections?: readonly ScopedJsonInspectionState[];\n setJsonInspection?: (inspection: ScopedJsonInspectionState) => void;\n attention?: AttentionRegistry;\n preserveFocus?: boolean;\n /** Ephemeral request counter; virtual tables rematerialize an expanded row per reveal. */\n attentionRevision?: number;\n /** Keep the requested virtual detail materialized until its reveal settles. */\n attentionPending?: boolean;\n schema: FieldSchema<Row>;\n /** Collection catalogue used to resolve Page template fields. */\n pageSchema: FieldSchema<Row>;\n queryParameter: string;\n /** Modal controller, retained for standalone cards. */\n properties: PropertyViewApi;\n propertiesByMode: Record<ItemPropertyMode, PropertyViewApi>;\n page: ItemPageOptions;\n availableModes: ItemDetailMode[];\n modes: ItemDetailMode[];\n active: ItemDetailsState[\"active\"] | null;\n record: ItemDetailRecord<Row> | null;\n loading: boolean;\n error: Error | null;\n relationships?: RelationshipAdapter;\n setModes(modes: ItemDetailMode[]): void;\n open(id: RowId, mode: \"modal\" | \"expand\"): void;\n close(): void;\n retry(): void;\n loadRow(id: RowId, signal: AbortSignal): Promise<ItemDetailRecord<Row> | null>;\n}\nconst ALL_MODES: ItemDetailMode[] = [\"hover\", \"modal\", \"expand\", \"page\"];\nexport function initialDetailModes<Row>(config: ItemDetailsOptions<Row> | undefined): ItemDetailMode[] {\n const available = ALL_MODES.filter(mode => !config?.modes || config.modes.includes(mode));\n return config?.defaultModes ? available.filter(mode => config.defaultModes!.includes(mode))\n : available.includes(\"modal\") ? [\"modal\"] : available.slice(0, 1);\n}\n\n/** Synchronize a single modality without overwriting its siblings. */\nfunction useDetailProperties<Row>(mode: ItemPropertyMode, schema: FieldSchema<Row>, config: ItemDetailsOptions<Row> | undefined,\n query: QueryState, setQuery: (next: QueryState | ((previous: QueryState) => QueryState)) => void, enabled: boolean,\n readOnly = false): PropertyViewApi {\n const snapshot = query.itemDetails?.views?.[mode] ?? query.itemDetails?.view;\n const seed = useRef(snapshot);\n const properties = usePropertyView({ schema,\n ...(config?.storage ? { storage: config.storage } : {}),\n key: `${config?.objectType ?? schema.name}:${mode}`,\n ...(seed.current ? { initialView: seed.current } : {}),\n });\n const queryViewKey = JSON.stringify(snapshot);\n const localViewKey = JSON.stringify(properties.view);\n const previousView = useRef({ query: queryViewKey, local: localViewKey });\n const baselineView = useRef(properties.view);\n const baselineReady = useRef(false);\n const pendingView = useRef<{ query: string | undefined; local: string } | null>(null);\n useEffect(() => {\n if (!enabled) return;\n if (!properties.loading && !baselineReady.current) {\n baselineView.current = properties.view;\n baselineReady.current = true;\n }\n const previous = previousView.current;\n previousView.current = { query: queryViewKey, local: localViewKey };\n if (queryViewKey !== previous.query) {\n const next = snapshot ?? baselineView.current;\n const target = JSON.stringify(next);\n pendingView.current = target !== localViewKey ? { query: queryViewKey, local: target } : null;\n if (target !== localViewKey) properties.setView(next);\n } else if (pendingView.current && pendingView.current.query === queryViewKey) {\n if (pendingView.current.local === localViewKey) pendingView.current = null;\n } else if (!readOnly && !properties.loading && localViewKey !== queryViewKey && (queryViewKey !== undefined || localViewKey !== previous.local)) {\n setQuery((current) => ({ ...current, itemDetails: {\n modes: current.itemDetails?.modes ?? initialDetailModes(config),\n ...current.itemDetails,\n views: { ...current.itemDetails?.views, [mode]: properties.view },\n } }));\n }\n }, [enabled, queryViewKey, localViewKey, properties.loading, properties.setView, setQuery]);\n return properties;\n}\n\n/** Independent, type-level property controllers for each detail modality. */\nexport function useItemDetails<Row>({\n schema, query, setQuery, options, rows, clientRows, rowId, transport, refreshKey, links, queryReady = true, queryParameter, lookupRow, subject,\n}: {\n schema: FieldSchema<Row>;\n query: QueryState;\n setQuery: (next: QueryState | ((previous: QueryState) => QueryState)) => void;\n options: boolean | ItemDetailsOptions<Row> | undefined;\n rows: Row[];\n clientRows: Row[] | undefined;\n rowId: (row: Row) => RowId | null;\n transport: Transport<Row> | undefined;\n refreshKey: number;\n links?: QueryLinksApi;\n queryParameter?: string;\n /** Hold property-view synchronization while the collection query is restoring. */\n queryReady?: boolean;\n /** Resolves records synchronously from rows already held, without loading\n * by ID; `undefined` means still loading and `null` unavailable. */\n lookupRow?: (id: RowId) => ItemDetailRecord<Row> | null | undefined;\n subject?: \"item\" | \"group\";\n}): ItemDetailsApi<Row> | undefined {\n const enabled = Boolean(options);\n const config = typeof options === \"object\" ? options : undefined;\n const detailSchema = config?.schema ?? schema;\n const availableModes = ALL_MODES.filter((mode) => !config?.modes || config.modes.includes(mode));\n const modes = availableModes.filter((mode) => (query.itemDetails?.modes ?? initialDetailModes(config)).includes(mode));\n const page = query.itemDetails?.page ?? config?.page ?? { urlTemplate: \"\", target: \"_blank\" as const };\n const requested = query.itemDetails?.active;\n const sharedModal = requested?.mode === \"modal\" && query.itemDetails?.modes.includes(\"modal\")\n && (availableModes.includes(\"hover\") || (availableModes.includes(\"page\") && !page.urlTemplate.trim()));\n const active = requested && (modes.includes(requested.mode) || sharedModal) ? requested : null;\n // Property storage can hydrate independently, but must not apply its view to\n // a placeholder query and thereby cancel a pending URL/saved-query restore.\n const syncProperties = enabled && queryReady;\n // A group schema changes with every summary edit. Group views reach the\n // query when a group is opened or shared, never as a side effect of one.\n const readOnly = subject === \"group\";\n const modalProperties = useDetailProperties(\"modal\", detailSchema, config, query, setQuery, syncProperties, readOnly);\n const hoverProperties = useDetailProperties(\"hover\", detailSchema, config, query, setQuery, syncProperties, readOnly);\n const expandProperties = useDetailProperties(\"expand\", detailSchema, config, query, setQuery, syncProperties, readOnly);\n const propertiesByMode = { modal: modalProperties, hover: hoverProperties, expand: expandProperties };\n const views: Record<ItemPropertyMode, PropertyViewState> = {\n modal: modalProperties.view, hover: hoverProperties.view, expand: expandProperties.view,\n };\n\n const customLoad = config?.loadRow;\n const customLoadRef = useRef(customLoad);\n customLoadRef.current = customLoad;\n const lookupRef = useRef(lookupRow);\n lookupRef.current = lookupRow;\n const hasLookup = Boolean(lookupRow);\n // Inline host callbacks should not restart a request on every controller\n // render. Data-source/type changes and explicit refresh/retry still reload.\n const hasCustomLoad = Boolean(customLoad);\n const sourceType = config?.objectType ?? detailSchema.name;\n const fallbackRows = !customLoad && !clientRows && !transport?.fetchRow ? rows : undefined;\n const loadRow = useCallback(async (id: RowId, signal: AbortSignal): Promise<ItemDetailRecord<Row> | null> => {\n if (lookupRef.current) return lookupRef.current(id) ?? null;\n if (customLoadRef.current) return customLoadRef.current(id, signal);\n if (clientRows) {\n const row = clientRows.find((row) => rowId(row) === id);\n return row ? { row } : null;\n }\n if (transport?.fetchRow) {\n const row = await transport.fetchRow(id, signal);\n return row ? { row } : null;\n }\n const row = rows.find((row) => rowId(row) === id);\n return row ? { row, loadedFields: Object.keys(row as object) } : null;\n }, [hasLookup, hasCustomLoad, sourceType, clientRows, transport?.fetchRow, fallbackRows, rowId]);\n const [retryKey, setRetryKey] = useState(0);\n const [result, setResult] = useState<{\n source: typeof loadRow | undefined; epoch: string; id: RowId | undefined; record: ItemDetailRecord<Row> | null; loading: boolean; error: Error | null;\n }>({ source: undefined, epoch: \"\", id: undefined, record: null, loading: false, error: null });\n const activeId = enabled && !lookupRow ? active?.id : undefined;\n const epoch = `${refreshKey}:${retryKey}`;\n const currentResult = result.id === activeId && result.source === loadRow && result.epoch === epoch;\n useEffect(() => {\n const controller = new AbortController();\n if (activeId === undefined) {\n setResult((previous) => previous.id === undefined && !previous.loading && !previous.error && !previous.record ? previous : { source: undefined, epoch: \"\", id: undefined, record: null, loading: false, error: null });\n return;\n }\n setResult(previous => ({ source: loadRow, epoch, id: activeId, record: previous.id === activeId && previous.source === loadRow ? previous.record : null, loading: true, error: null }));\n void Promise.resolve().then(() => loadRow(activeId, controller.signal)).then((record) => {\n if (!controller.signal.aborted) setResult({ source: loadRow, epoch, id: activeId, record, loading: false, error: null });\n }).catch((error) => {\n if (!controller.signal.aborted) setResult({ source: loadRow, epoch, id: activeId, record: null, loading: false,\n error: error instanceof Error ? error : new Error(String(error)) });\n });\n return () => controller.abort();\n }, [activeId, loadRow, refreshKey, retryKey]);\n const preserveFocus = useRef(false);\n const attentionSequence = useRef(0);\n const [attentionRequest, setAttentionRequest] = useState({ revision: 0, pending: false });\n const attentionLatest = useRef({ loadRow, setQuery, modes, views, active, query });\n attentionLatest.current = { loadRow, setQuery, modes, views, active, query };\n useEffect(() => {\n const registry = config?.attention;\n if (!enabled || !registry) return;\n const provider: AttentionProvider = { reveal: async (target, signal) => {\n if (target.rowId === undefined || signal.aborted) return false;\n const current = attentionLatest.current;\n const record = await current.loadRow(target.rowId, signal);\n if (!record || signal.aborted) return false;\n if (target.field !== undefined && !detailSchema.fields.some(field => field.name === target.field\n && field.property?.enabled !== false && isPropertyFieldLoaded(field, record.loadedFields))) return false;\n const mode = current.active?.id === target.rowId ? current.active.mode : current.modes.includes(\"expand\") ? \"expand\" : current.modes.includes(\"modal\") ? \"modal\" : null;\n if (!mode || (target.field !== undefined && !current.views[mode].properties.some(property => property.field === target.field))) return false;\n preserveFocus.current = true;\n const revision = ++attentionSequence.current;\n setAttentionRequest({ revision, pending: true });\n try {\n current.setQuery(previous => ({ ...previous, itemDetails: { ...previous.itemDetails, modes: previous.itemDetails?.modes ?? current.modes,\n views: current.views, active: { id: target.rowId!, mode } } }));\n const mounted = await registry.whenRegistered({ dataset: detailSchema.name, rowId: target.rowId }, signal);\n if (mounted.ready) await mounted.ready(signal);\n return signal.aborted ? false : await mounted.reveal(target, signal);\n } finally {\n setAttentionRequest(previous => previous.revision === revision ? { revision, pending: false } : previous);\n }\n } };\n return registry.register({ dataset: detailSchema.name }, provider);\n }, [enabled, config?.attention, detailSchema]);\n if (!enabled) return;\n const looked = lookupRow && active ? lookupRow(active.id) : null;\n return {\n ...(subject ? { subject } : {}),\n ...(links ? { links } : {}),\n ...(config?.attention ? { attention: config.attention } : {}),\n preserveFocus: preserveFocus.current,\n attentionRevision: attentionRequest.revision,\n attentionPending: attentionRequest.pending,\n jsonInspections: query.itemDetails?.jsonInspections ?? [],\n setJsonInspection(entry) {\n if (entry.dataset !== detailSchema.name) return;\n setQuery(current => {\n // Most recently edited scopes stay at the end. Prefer evicting a closed\n // inspector, and always make room before strict query normalization.\n const inspections = (current.itemDetails?.jsonInspections ?? []).filter(previous => jsonInspectionScopeKey(previous) !== jsonInspectionScopeKey(entry));\n while (inspections.length >= MAX_JSON_INSPECTIONS) {\n const closed = inspections.findIndex(previous => !previous.state.open);\n inspections.splice(closed < 0 ? 0 : closed, 1);\n }\n return { ...current, itemDetails: { ...current.itemDetails, modes: current.itemDetails?.modes ?? modes,\n jsonInspections: [...inspections, entry] } };\n });\n },\n schema: detailSchema, queryParameter: queryParameter ?? config?.queryParameter ?? \"q\", properties: modalProperties, propertiesByMode, availableModes, modes, active,\n page, pageSchema: schema,\n record: lookupRow ? looked ?? null : result.id === activeId && result.source === loadRow ? result.record : null,\n loading: lookupRow ? looked === undefined : activeId !== undefined && (!currentResult || result.loading),\n error: lookupRow ? null : currentResult ? result.error : null,\n ...(config?.relationships ? { relationships: config.relationships } : {}),\n loadRow,\n retry: () => setRetryKey((value) => value + 1),\n setModes(next) {\n setQuery((current) => {\n const allowed = availableModes.filter((mode) => next.includes(mode));\n const state: ItemDetailsState = { ...current.itemDetails, modes: allowed, views };\n if (state.active && !allowed.includes(state.active.mode)) delete state.active;\n return { ...current, itemDetails: state };\n });\n },\n open(id, mode) {\n config?.attention?.cancel();\n preserveFocus.current = false;\n if (!modes.includes(mode)) return;\n setQuery((current) => ({ ...current, itemDetails: {\n ...current.itemDetails, modes: current.itemDetails?.modes ?? modes,\n views, active: { id, mode },\n } }));\n },\n close() {\n config?.attention?.cancel();\n setQuery((current) => {\n if (!current.itemDetails?.active) return current;\n const { active: _active, ...state } = current.itemDetails;\n return { ...current, itemDetails: state };\n });\n },\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n createPropertyView,\n memoryPropertyViewStorage,\n normalizePropertyView,\n type FieldSchema,\n type PropertyViewState,\n type PropertyViewStorage,\n type SavedPropertyView,\n} from \"@pythia-software/query-table-core\";\n\nexport interface UsePropertyViewOptions<Row> {\n schema: FieldSchema<Row>;\n /** Object type, never object ID. Defaults to schema.name. */\n key?: string;\n storage?: PropertyViewStorage;\n initialView?: PropertyViewState;\n}\nexport interface PropertyViewApi {\n view: PropertyViewState;\n loading: boolean;\n error: Error | null;\n saved: SavedPropertyView[];\n defaultId: string | null;\n setView(view: PropertyViewState): void;\n reset(): void;\n undo(): void;\n redo(): void;\n canUndo: boolean;\n canRedo: boolean;\n load(id: string): void;\n save(name: string): Promise<SavedPropertyView>;\n remove(id: string): Promise<void>;\n setDefault(id: string | null): Promise<void>;\n}\nconst asError = (error: unknown) =>\n error instanceof Error ? error : new Error(String(error));\n\n/** Owns presentation only. Changing the inspected row never resets this controller. */\nexport function usePropertyView<Row>(\n options: UsePropertyViewOptions<Row>,\n): PropertyViewApi {\n const [memory] = useState(memoryPropertyViewStorage);\n const storage = options.storage ?? memory;\n const key = options.key ?? options.schema.name;\n const schemaDefault = useMemo(() => createPropertyView(options.schema), [options.schema]);\n const fallback = useMemo(\n () =>\n options.initialView\n ? normalizePropertyView(options.initialView)\n : schemaDefault,\n [options.initialView, schemaDefault],\n );\n const defaults = useRef(schemaDefault);\n defaults.current = schemaDefault;\n const initial = useRef(options.initialView);\n initial.current = options.initialView;\n const [state, setState] = useState({\n key,\n storage,\n history: [fallback],\n index: 0,\n loading: true,\n error: null as Error | null,\n saved: [] as SavedPropertyView[],\n defaultId: null as string | null,\n });\n const generation = useRef(0);\n const edits = useRef(0);\n const saveQueue = useRef(Promise.resolve());\n const current = state.key === key && state.storage === storage;\n const view = current ? state.history[state.index]! : fallback;\n\n useEffect(() => {\n const token = ++generation.current;\n const editToken = edits.current;\n setState({\n key,\n storage,\n history: [defaults.current],\n index: 0,\n loading: true,\n error: null,\n saved: [],\n defaultId: null,\n });\n void Promise.resolve()\n .then(() =>\n Promise.all([\n storage.loadLast(key),\n storage.listSaved(key),\n storage.loadDefaultSaved(key),\n ]),\n )\n .then(([last, saved, defaultView]) => {\n if (generation.current !== token) return;\n const restored = normalizePropertyView(\n initial.current ?? last ?? defaultView?.view ?? defaults.current,\n );\n const items = saved.map((item) => ({\n ...item,\n view: normalizePropertyView(item.view),\n }));\n setState((previous) => ({\n ...previous,\n ...(edits.current === editToken\n ? { history: [restored], index: 0 }\n : {}),\n saved: items,\n defaultId: defaultView?.id ?? null,\n loading: false,\n }));\n })\n .catch((error) => {\n if (generation.current === token)\n setState((previous) => ({\n ...previous,\n loading: false,\n error: asError(error),\n }));\n });\n return () => {\n generation.current++;\n };\n }, [key, storage]);\n\n useEffect(() => {\n if (!current || state.loading || state.error) return;\n const token = generation.current;\n const snapshot = normalizePropertyView(view);\n // Serial writes prevent a slower old save from replacing a newer view.\n saveQueue.current = saveQueue.current\n .then(() => storage.saveLast(key, snapshot))\n .catch((error) => {\n if (generation.current === token)\n setState((previous) => ({ ...previous, error: asError(error) }));\n });\n }, [view, current, state.loading, state.error, key, storage]);\n\n const setView = useCallback(\n (next: PropertyViewState) => {\n const normalized = normalizePropertyView(next);\n edits.current++;\n setState((previous) => {\n const history =\n previous.key === key && previous.storage === storage\n ? previous.history.slice(0, previous.index + 1)\n : [defaults.current];\n if (\n JSON.stringify(history[history.length - 1]) ===\n JSON.stringify(normalized)\n )\n return { ...previous, error: null };\n const nextHistory = [...history, normalized].slice(-50);\n return {\n ...previous,\n key,\n storage,\n history: nextHistory,\n index: nextHistory.length - 1,\n error: null,\n };\n });\n },\n [key, storage],\n );\n const refresh = useCallback(\n async (token: number) => {\n const [saved, defaultView] = await Promise.all([\n storage.listSaved(key),\n storage.loadDefaultSaved(key),\n ]);\n if (generation.current === token)\n setState((previous) => ({\n ...previous,\n saved: saved.map((item) => ({\n ...item,\n view: normalizePropertyView(item.view),\n })),\n defaultId: defaultView?.id ?? null,\n error: null,\n }));\n },\n [key, storage],\n );\n return {\n view,\n loading: !current || state.loading,\n error: current ? state.error : null,\n saved: current ? state.saved : [],\n defaultId: current ? state.defaultId : null,\n setView,\n reset: () => setView(defaults.current),\n canUndo: current && state.index > 0,\n canRedo: current && state.index < state.history.length - 1,\n undo() {\n edits.current++;\n setState((previous) => ({\n ...previous,\n index: Math.max(0, previous.index - 1),\n error: null,\n }));\n },\n redo() {\n edits.current++;\n setState((previous) => ({\n ...previous,\n index: Math.min(previous.history.length - 1, previous.index + 1),\n error: null,\n }));\n },\n load(id) {\n const found = state.saved.find((item) => item.id === id);\n if (found && current) setView(found.view);\n },\n async save(name) {\n const token = generation.current;\n const saved = await storage.saveNamed(key, name, view, Date.now());\n await refresh(token);\n return saved;\n },\n async remove(id) {\n const token = generation.current;\n await storage.deleteSaved(key, id);\n await refresh(token);\n },\n async setDefault(id) {\n const token = generation.current;\n await storage.setDefaultSaved(key, id);\n await refresh(token);\n },\n };\n}\n","import {\n predicatesOf,\n isComputedField,\n readFieldValue,\n type ComputedExecution,\n type FetchRowsResultV2,\n type FieldSchema,\n type ServerQueryV2,\n} from \"@pythia-software/query-table-core\";\nexport function executionRevision(\n execution: ComputedExecution | undefined,\n id: string,\n): string | undefined {\n return (\n execution?.resolvedRevisions[id] ??\n execution?.resolvedRevisions[`@computed/${id}`]\n );\n}\n/** Reject mismatched sidecars before they can be attached to committed row identities. */\nexport function validateComputedResponse<Row>(\n request: ServerQueryV2,\n result: FetchRowsResultV2<Row>,\n schema: FieldSchema<Row>,\n): void {\n const execution = result.execution;\n if (\n result.version !== 2 ||\n !execution ||\n execution.profile !== request.profile ||\n (request.planToken && execution.planToken !== request.planToken) ||\n (request.snapshot !== undefined && execution.snapshot !== request.snapshot)\n )\n throw Error(\n \"Server computed execution identity changed. Refresh the handshake.\",\n );\n // The backend validates the full transitive envelope. Browser response checks\n // concern only fields actually executed for this row request; a catalogue can\n // also contain revisions for browser-only definitions.\n const executed = new Set([\n ...request.select.filter(isComputedField),\n ...request.orderBy.map((term) => term.field).filter(isComputedField),\n ...request.where.flatMap(term => predicatesOf(term).map(predicate => predicate.field)).filter(isComputedField),\n ]);\n for (const [name, revision] of Object.entries(request.expectedRevisions)) {\n const id = name.replace(/^@computed\\//, \"\");\n if (!executed.has(`@computed/${id}`)) continue;\n if (executionRevision(execution, id) !== revision)\n throw Error(\n \"Server computed definition revision changed. Refresh the handshake.\",\n );\n }\n const idField = schema.fields.find((f) => f.name === schema.idField);\n if (!idField)\n throw Error(\"Stable row identity is required for computed values.\");\n const ids = new Set(result.rows.map((row) => readFieldValue(idField, row)));\n if (ids.has(null) || ids.has(undefined) || ids.size !== result.rows.length)\n throw Error(\n \"Computed response contains missing or duplicate row identities.\",\n );\n const sidecars = new Map(\n result.computed.map((item) => [item.id, item.values]),\n );\n if (\n sidecars.size !== result.computed.length ||\n [...sidecars.keys()].some((id) => !ids.has(id))\n )\n throw Error(\"Computed sidecars do not match returned row identities.\");\n for (const field of request.select.filter(isComputedField)) {\n const id = field.slice(\"@computed/\".length);\n for (const rowId of ids) {\n const value = sidecars.get(rowId as string | number)?.[id];\n if (\n !value ||\n (value.value !== null &&\n ![\"string\", \"number\", \"boolean\"].includes(typeof value.value)) ||\n (typeof value.value === \"number\" && !Number.isFinite(value.value))\n )\n throw Error(`Missing or invalid server computed result: ${field}.`);\n }\n }\n}\n","import {\n predicatesOf,\n sourceExecutionSchema,\n toQueryRequestV3,\n toServerQuery,\n toServerQueryV2,\n validateQueryResultV3,\n type ComputedColumn,\n type ComputedExecution,\n type FetchRowsResult,\n type FieldSchema,\n type QueryState,\n type Transport,\n} from \"@pythia-software/query-table-core\";\nimport { executionRevision, validateComputedResponse } from \"./computedExecution\";\n\n/** Fetch inputs for local draft evaluation using the negotiated row protocol.\n * The draft source is never sent to a server or substituted for a saved ID. */\nexport async function fetchPreviewRows<Row>(\n transport: Transport<Row>,\n query: QueryState,\n schema: FieldSchema<Row>,\n execution: ComputedExecution | undefined,\n definitions: ComputedColumn[],\n now: number,\n signal: AbortSignal,\n baseSchema: FieldSchema<Row> = schema,\n): Promise<FetchRowsResult<Row>> {\n if (signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n const sourceSchema = sourceExecutionSchema(baseSchema, execution, definitions);\n let result: FetchRowsResult<Row>;\n const computedFilter = query.where.some(term => predicatesOf(term)\n .some(predicate => predicate.field.startsWith(\"@computed/\")));\n if (transport.fetchRowsV2 && execution && !query.grouping && !computedFilter) {\n const request = toServerQueryV2(query, sourceSchema, execution);\n if (request.diagnostics.length)\n throw Error(request.diagnostics.map(issue => issue.message).join(\" \"));\n for (const definition of definitions) {\n if (executionRevision(execution, definition.id) !== definition.revision &&\n (request.select.includes(`@computed/${definition.id}`) ||\n request.orderBy.some(term => term.field === `@computed/${definition.id}`) ||\n request.where.some(term => predicatesOf(term).some(predicate => predicate.field === `@computed/${definition.id}`))))\n throw Error(\"Computed definitions changed. Refresh the server execution handshake.\");\n }\n const response = await transport.fetchRowsV2(request, signal);\n validateComputedResponse(request, response, sourceSchema);\n result = response;\n } else if (transport.fetchQueryV3 && transport.queryCapabilities?.version === 3) {\n const request = toQueryRequestV3({ ...query, aggregations: [] }, sourceSchema,\n transport.queryCapabilities, execution, { now });\n if (request.diagnostics.length) throw Error(request.diagnostics.join(\" \"));\n const response = await transport.fetchQueryV3(request, signal);\n validateQueryResultV3(response, request, query.grouping ? schema : sourceSchema);\n result = { rows: response.rows as Row[], total: response.total };\n } else if (transport.fetchRows && !query.grouping && !(computedFilter && transport.fetchRowsV2 && execution)) {\n result = await transport.fetchRows(toServerQuery(query, schema), signal);\n } else {\n throw Error(\"Row execution requires fetchRows, negotiated fetchRowsV2, or negotiated fetchQueryV3.\");\n }\n // Transports may ignore abort while completing I/O; never publish that page.\n if (signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n if (!Number.isSafeInteger(result.total) || result.total < 0 || !Array.isArray(result.rows) || result.rows.length > query.limit)\n throw Error(\"Invalid preview row response.\");\n return result;\n}\n","import { executionRevision } from \"./computedExecution\";\nimport { fetchPreviewRows } from \"./previewRows\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n predicatesOf,\n isGroupLinkField,\n applyQuery,\n compileFormula,\n computedFieldName,\n groupPreview,\n isComputedField,\n memoryComputedColumnStore,\n readFieldValue,\n validateComputedColumn,\n isSelectable,\n hasRegex,\n type ColumnPreview,\n type ComputedColumn,\n type ComputedExecution,\n type RowComputedValues,\n type RowId,\n type ComputedColumnDraft,\n type ComputedColumnStore,\n type FieldDef,\n type FieldSchema,\n type FormulaPlan,\n type FormulaResult,\n type FormulaValue,\n type QueryState,\n type Transport,\n} from \"@pythia-software/query-table-core\";\nimport {\n evaluateFormulaRows,\n type FormulaWorkerFactory,\n} from \"./formulaWorker\";\n\nexport interface ComputedColumnsApi<Row> {\n definitions: ComputedColumn[];\n catalogue: FieldDef<Row>[];\n loading: boolean;\n error: string | null;\n reload: () => Promise<void>;\n save: (\n column: ComputedColumnDraft,\n expectedRevision: string | null,\n ) => Promise<ComputedColumn>;\n compile: (source: string, editingId?: string) => FormulaPlan;\n /** Sample the first N matching rows in current sort order, independent of table paging. */\n preview: (\n source: string,\n count: number,\n signal?: AbortSignal,\n editingId?: string,\n includeInputs?: boolean,\n ) => Promise<ColumnPreview>;\n}\ninterface Options<Row> {\n schema: FieldSchema<Row>;\n query: QueryState;\n /** V3 previews retain the source/grouping stages behind a result schema. */\n sourceSchema?: FieldSchema<Row>;\n previewQuery?: QueryState;\n now?: number;\n rows: Row[];\n store?: ComputedColumnStore;\n transport?: Transport<Row>;\n clientRows?: Row[];\n workerFactory?: FormulaWorkerFactory;\n execution?: ComputedExecution;\n /** Metric authority affects aggregate capabilities only, independently of rows. */\n metricTransport?: Transport<Row>;\n metricExecution?: ComputedExecution;\n serverComputed?: Map<RowId, RowComputedValues>;\n serverExecution?: ComputedExecution;\n}\nexport function useComputedColumns<Row>(options: Options<Row>): {\n api: ComputedColumnsApi<Row>;\n displaySchema: FieldSchema<Row>;\n} {\n const { schema, query, rows, transport, clientRows, workerFactory } = options;\n const metricTransport = options.metricTransport ?? transport;\n const metricExecution = options.metricExecution ?? options.execution;\n const store = useMemo(\n () => options.store ?? memoryComputedColumnStore(),\n [options.store],\n );\n const [catalogue, setCatalogue] = useState<{\n dataset: string;\n store: ComputedColumnStore;\n items: ComputedColumn[];\n } | null>(null);\n const definitions = useMemo(\n () =>\n catalogue?.dataset === schema.name && catalogue.store === store\n ? catalogue.items\n : [],\n [catalogue, schema.name, store],\n );\n const [loading, setLoading] = useState(false),\n [error, setError] = useState<string | null>(null);\n const catalogueRequest = useRef<AbortController | null>(null);\n const reload = useCallback(async () => {\n catalogueRequest.current?.abort();\n const ac = new AbortController();\n catalogueRequest.current = ac;\n setLoading(true);\n setError(null);\n try {\n const items = await store.list(schema.name, ac.signal);\n if (ac.signal.aborted) return;\n const valid = items\n .map(validateComputedColumn)\n .sort((a, b) => a.id.localeCompare(b.id));\n if (new Set(valid.map((c) => c.id)).size !== valid.length)\n throw new Error(\"Duplicate computed column IDs.\");\n setCatalogue((previous) =>\n previous?.dataset === schema.name &&\n previous.store === store &&\n JSON.stringify(previous.items) === JSON.stringify(valid)\n ? previous\n : { dataset: schema.name, store, items: valid },\n );\n } catch (e) {\n if (!ac.signal.aborted)\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n if (!ac.signal.aborted) setLoading(false);\n }\n }, [store, schema.name]);\n useEffect(() => {\n void reload();\n return () => catalogueRequest.current?.abort();\n }, [reload]);\n useEffect(\n () =>\n store.subscribe?.(schema.name, () => {\n void reload();\n }),\n [store, schema.name, reload],\n );\n useEffect(() => {\n const focus = () => {\n void reload();\n };\n window.addEventListener(\"focus\", focus);\n return () => window.removeEventListener(\"focus\", focus);\n }, [reload]);\n const inputFields = useMemo(\n () =>\n schema.fields\n .filter(isSelectable)\n .filter(\n (f) =>\n f.source.kind === \"backend\" ||\n (f.source.accessor && f.source.dependencies && !isGroupLinkField(f)),\n ),\n [schema],\n );\n const compile = useCallback(\n (source: string, editingId?: string): FormulaPlan => {\n const stack = new Set<string>(editingId ? [editingId] : []);\n let expanded = 0;\n const resolve = (name: string): FormulaPlan | undefined => {\n if (!isComputedField(name)) return undefined;\n const id = name.slice(\"@computed/\".length),\n def = definitions.find((d) => d.id === id);\n if (!def) throw new Error(`Computed column unavailable: ${id}`);\n if (stack.has(id))\n throw new Error(`Circular computed-column reference: ${def.label}`);\n if (stack.size >= 20 || ++expanded > 100)\n throw new Error(\"Computed dependency graph is too large.\");\n stack.add(id);\n try {\n return compileFormula(def.expression.source, inputFields, resolve);\n } finally {\n stack.delete(id);\n }\n };\n return compileFormula(source, inputFields, resolve);\n },\n [inputFields, definitions],\n );\n const plans = useMemo(\n () =>\n new Map<string, { plan?: FormulaPlan; error?: string }>(\n definitions.map((def) => {\n try {\n return [\n def.id,\n { plan: compile(def.expression.source, def.id) },\n ] as const;\n } catch (e) {\n return [\n def.id,\n { error: e instanceof Error ? e.message : String(e) },\n ] as const;\n }\n }),\n ),\n [definitions, compile],\n );\n const backendDependencies = useCallback(\n (plan: FormulaPlan) =>\n [\n ...new Set(\n plan.dependencies.flatMap((name) => {\n const f = inputFields.find((f) => f.name === name);\n return f?.source.kind === \"backend\"\n ? [name]\n : (f?.source.dependencies ?? []);\n }),\n ),\n ]\n .filter((name) =>\n schema.fields.some(\n (f) => f.name === name && f.source.kind === \"backend\",\n ),\n )\n .sort(),\n [schema, inputFields],\n );\n const inputsFor = useCallback(\n (plan: FormulaPlan, batch: Row[]) => {\n let size = 0;\n return batch.map((row) => {\n const values: Record<string, FormulaValue> = Object.create(null);\n for (const name of plan.dependencies) {\n const field = inputFields.find((f) => f.name === name)!;\n const raw = readFieldValue(field, row);\n values[name] =\n raw instanceof Date ? raw.toISOString() : (raw as FormulaValue);\n }\n size += JSON.stringify(values).length;\n if (size > 16000000)\n throw new Error(\n \"Input sample exceeds 16 MB. Reduce the rows to process.\",\n );\n return values;\n });\n },\n [inputFields],\n );\n const activeSelect = query.select.length\n ? query.select\n : (schema.defaultSelect ?? []);\n const activeIds = activeSelect\n .filter((c) => isComputedField(c.field))\n .map((c) => c.field.slice(\"@computed/\".length))\n .sort()\n .join(\",\");\n const [evaluated, setEvaluated] = useState<{\n rows: Row[];\n plans: typeof plans;\n values: Map<string, FormulaResult[]>;\n } | null>(null);\n useEffect(() => {\n const ac = new AbortController();\n const values = new Map<string, FormulaResult[]>();\n void (async () => {\n for (const id of activeIds.split(\",\").filter(Boolean)) {\n if (\n options.execution?.fields[computedFieldName(id)]?.select &&\n (transport?.fetchRowsV2 || transport?.fetchQueryV3)\n )\n continue;\n const entry = plans.get(id);\n if (!entry?.plan) continue;\n try {\n values.set(\n id,\n await evaluateFormulaRows(\n entry.plan.ast,\n inputsFor(entry.plan, rows),\n ac.signal,\n workerFactory,\n ),\n );\n } catch (e) {\n if (ac.signal.aborted) return;\n values.set(\n id,\n rows.map(() => ({\n value: null,\n error: e instanceof Error ? e.message : String(e),\n })),\n );\n }\n }\n if (!ac.signal.aborted) setEvaluated({ rows, plans, values });\n })();\n return () => ac.abort();\n }, [\n activeIds,\n rows,\n plans,\n inputsFor,\n workerFactory,\n options.execution,\n transport,\n ]);\n const displaySchema = useMemo<FieldSchema<Row>>(() => {\n const indices = new Map(rows.map((row, i) => [row, i]));\n const fields: FieldDef<Row>[] = definitions.map((def) => {\n const entry = plans.get(def.id);\n return {\n name: computedFieldName(def.id),\n label: def.label,\n type:\n entry?.plan?.type === \"null\" ? \"text\" : (entry?.plan?.type ?? \"text\"),\n group: \"Computed columns\",\n source: {\n kind: \"derived\",\n computedId: def.id,\n dependencies: entry?.plan ? backendDependencies(entry.plan) : [],\n accessor: (row: Row) => {\n if (entry?.error) return { computedError: entry.error };\n if (\n options.execution?.fields[computedFieldName(def.id)]?.select &&\n (transport?.fetchRowsV2 || transport?.fetchQueryV3)\n ) {\n if (\n options.serverExecution?.profile !==\n options.execution.profile ||\n options.serverExecution?.planToken !==\n options.execution.planToken ||\n options.serverExecution?.snapshot !==\n options.execution.snapshot ||\n executionRevision(options.execution, def.id) !== def.revision ||\n executionRevision(options.serverExecution, def.id) !==\n def.revision\n )\n return {\n computedError:\n \"Definition changed or values are pending. Refresh the server handshake.\",\n };\n const idField = schema.fields.find(\n (f) => f.name === schema.idField,\n );\n const id = idField\n ? (readFieldValue(idField, row) as RowId)\n : null;\n const server =\n id === null\n ? undefined\n : options.serverComputed?.get(id)?.[def.id];\n return server\n ? server.error\n ? { computedError: server.error.code }\n : server.value\n : { computedError: \"Server computed result unavailable.\" };\n }\n const result =\n evaluated?.rows === rows && evaluated.plans === plans\n ? evaluated.values.get(def.id)?.[indices.get(row) ?? -1]\n : undefined;\n return result?.error\n ? { computedError: result.error }\n : result\n ? result.value\n : { computedError: \"Calculating…\" };\n },\n },\n filter: { enabled: options.execution?.fields[computedFieldName(def.id)]?.filter === true &&\n executionRevision(options.execution, def.id) === def.revision && !!entry?.plan && !hasRegex(entry.plan) },\n sort: {\n enabled:\n !!(transport?.fetchRowsV2 || transport?.fetchQueryV3) &&\n !!options.execution?.fields[computedFieldName(def.id)]?.sort &&\n executionRevision(options.execution, def.id) === def.revision &&\n !!entry?.plan &&\n !hasRegex(entry.plan),\n },\n aggregate: {\n measure: !!entry?.plan,\n groupable:\n (!!metricTransport?.fetchMetrics && metricTransport.metricCapabilities?.version === 2 || !!metricTransport?.fetchQueryV3) &&\n !!metricExecution?.fields[computedFieldName(def.id)]?.group &&\n executionRevision(metricExecution, def.id) === def.revision &&\n !!entry?.plan &&\n !hasRegex(entry.plan),\n },\n };\n });\n for (const col of activeSelect)\n if (\n isComputedField(col.field) &&\n !fields.some((f) => f.name === col.field)\n )\n fields.push({\n name: col.field,\n label: col.field.slice(10),\n type: \"text\",\n source: {\n kind: \"derived\",\n computedId: col.field.slice(10),\n accessor: () => ({\n computedError: loading\n ? \"Loading definition…\"\n : \"Definition unavailable. Reload the catalogue or contact its owner.\",\n }),\n },\n filter: { enabled: false },\n sort: { enabled: false },\n aggregate: { measure: false, groupable: false },\n });\n return { ...schema, fields: [...schema.fields, ...fields] };\n }, [\n schema,\n definitions,\n plans,\n backendDependencies,\n evaluated,\n rows,\n query.select,\n schema.defaultSelect,\n loading,\n transport,\n options.execution,\n metricTransport,\n metricExecution,\n options.serverComputed,\n options.serverExecution,\n ]);\n const save = useCallback(\n async (column: ComputedColumnDraft, expectedRevision: string | null) => {\n compile(column.expression.source, column.id);\n const saved = validateComputedColumn(\n await store.save(schema.name, column, expectedRevision),\n );\n setCatalogue((prev) => ({\n dataset: schema.name,\n store,\n items: [\n ...(prev?.dataset === schema.name && prev.store === store\n ? prev.items.filter((d) => d.id !== saved.id)\n : []),\n saved,\n ],\n }));\n return saved;\n },\n [compile, store, schema.name],\n );\n const previewRequest = useRef<AbortController | null>(null);\n const preview = useCallback(\n async (\n source: string,\n count: number,\n signal?: AbortSignal,\n editingId?: string,\n includeInputs = true,\n ): Promise<ColumnPreview> => {\n previewRequest.current?.abort();\n const controller = new AbortController();\n previewRequest.current = controller;\n const abort = () => controller.abort();\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) controller.abort();\n try {\n if (!Number.isInteger(count) || count < 1 || count > 10000)\n throw new Error(\"Choose between 1 and 10,000 rows.\");\n const plan = compile(source, editingId);\n let batch: Row[] = [],\n total = 0;\n if (transport) {\n const request = {\n ...query,\n ...(options.previewQuery?.grouping\n ? { grouping: options.previewQuery.grouping } : {}),\n select: [\n ...new Set([schema.idField, ...backendDependencies(plan)]),\n ].map((field) => ({ field })),\n limit: Math.min(count, 500),\n offset: 0,\n };\n const now = options.now ?? Date.now();\n const computedFilter = request.where.some(term => predicatesOf(term)\n .some(predicate => isComputedField(predicate.field)));\n const v3 = !(transport.fetchRowsV2 && options.execution && !request.grouping && !computedFilter) &&\n transport.fetchQueryV3 && transport.queryCapabilities?.version === 3;\n const pageSize = Math.min(500, v3 ? transport.queryCapabilities!.maxRows : 500);\n if (!Number.isInteger(pageSize) || pageSize < 1) throw Error(\"Invalid negotiated preview row limit.\");\n while (batch.length < count) {\n const res = await fetchPreviewRows(transport,\n {\n ...request,\n offset: batch.length,\n limit: Math.min(pageSize, count - batch.length),\n },\n schema, options.execution, definitions, now, controller.signal, options.sourceSchema,\n );\n total = res.total;\n batch.push(...res.rows.slice(0, count - batch.length));\n if (!res.rows.length || batch.length >= total) break;\n }\n } else {\n const result = applyQuery(\n clientRows ?? [],\n { ...query, limit: count, offset: 0 },\n schema,\n );\n batch = result.rows;\n total = result.total;\n }\n const inputs = inputsFor(plan, batch),\n results = await evaluateFormulaRows(\n plan.ast,\n inputs,\n controller.signal,\n workerFactory,\n );\n if (controller.signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n return groupPreview(\n includeInputs ? plan.dependencies : [],\n inputs,\n results,\n total,\n );\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n if (previewRequest.current === controller) previewRequest.current = null;\n }\n },\n [\n compile,\n transport,\n query,\n schema,\n backendDependencies,\n clientRows,\n inputsFor,\n workerFactory,\n options.execution,\n definitions,\n options.sourceSchema,\n options.previewQuery?.grouping,\n options.now,\n ],\n );\n useEffect(() => () => previewRequest.current?.abort(), [preview]);\n return {\n displaySchema,\n api: {\n definitions,\n catalogue: displaySchema.fields,\n loading,\n error,\n reload,\n save,\n compile,\n preview,\n },\n };\n}\n","import {\n formulaRuntime,\n type FormulaNode,\n type FormulaResult,\n type FormulaValue,\n} from \"@pythia-software/query-table-core\";\n\nexport type FormulaWorkerFactory = () => Worker;\n/** Host applications with a restrictive CSP can supply their own worker factory. */\nexport const createFormulaWorker: FormulaWorkerFactory = () => {\n const code = `const evaluate = ${formulaRuntime.toString()}; self.onmessage = e => { const { ast, inputs } = e.data; self.postMessage(inputs.map(row => evaluate(ast, row))); };`;\n const url = URL.createObjectURL(\n new Blob([code], { type: \"text/javascript\" }),\n );\n try {\n return new Worker(url);\n } finally {\n URL.revokeObjectURL(url);\n }\n};\nexport function evaluateFormulaRows(\n ast: FormulaNode,\n inputs: Record<string, FormulaValue>[],\n signal?: AbortSignal,\n factory: FormulaWorkerFactory = createFormulaWorker,\n): Promise<FormulaResult[]> {\n if (signal?.aborted)\n return Promise.reject(new DOMException(\"Aborted\", \"AbortError\"));\n if (!inputs.length) return Promise.resolve([]);\n return new Promise((resolve, reject) => {\n let worker: Worker;\n try {\n worker = factory();\n } catch (e) {\n reject(\n new Error(\n `Formula worker unavailable: ${e instanceof Error ? e.message : String(e)}`,\n ),\n );\n return;\n }\n let timer: ReturnType<typeof setTimeout>;\n const started = Date.now();\n let offset = 0;\n const results: FormulaResult[] = [];\n const cleanup = () => {\n clearTimeout(timer);\n worker.terminate();\n signal?.removeEventListener(\"abort\", abort);\n };\n const abort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n const send = () => {\n if (Date.now() - started > 30000) {\n cleanup();\n reject(\n new Error(\n \"Formula exceeded the 30-second processing budget. Reduce the row count or simplify the formula.\",\n ),\n );\n return;\n }\n timer = setTimeout(() => {\n cleanup();\n reject(\n new Error(\n \"Formula timed out. Check the regex or reduce the row count.\",\n ),\n );\n }, 2000);\n try {\n worker.postMessage({ ast, inputs: inputs.slice(offset, offset + 200) });\n } catch (e) {\n cleanup();\n reject(e);\n }\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n worker.onerror = () => {\n cleanup();\n reject(new Error(\"Formula worker failed.\"));\n };\n worker.onmessage = (event: MessageEvent<FormulaResult[]>) => {\n clearTimeout(timer);\n results.push(...event.data);\n offset += event.data.length;\n if (offset >= inputs.length) {\n cleanup();\n resolve(results);\n } else send();\n };\n send();\n });\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { Transport } from \"@pythia-software/query-table-core\";\n\nexport interface RequestActivityEntry {\n id: number;\n kind: string;\n startedAt: number;\n status: \"pending\" | \"success\" | \"error\" | \"aborted\";\n durationMs?: number;\n error?: string;\n}\nexport interface RequestActivityApi {\n /** Newest first; bounded to the latest 100 calls. Query values and results are never retained. */\n entries: readonly RequestActivityEntry[];\n clear: () => void;\n}\nconst methods = new Set([\n \"fetchRows\",\n \"fetchRowsV2\",\n \"fetchQueryV3\",\n \"fetchMetrics\",\n \"fetchAggregations\",\n \"fetchRow\",\n \"fetchDistinctValues\",\n \"fetchFieldStats\",\n]);\n\n/** Observe the transport boundary without changing receiver, arguments or errors. */\nexport function observeTransport<Row>(\n transport: Transport<Row>,\n publish: (entry: RequestActivityEntry) => void,\n nextId: () => number,\n): Transport<Row> {\n const wrappers = new Map<PropertyKey, unknown>();\n return new Proxy(Object.create(transport) as Transport<Row>, {\n get(_target, key) {\n const method = Reflect.get(transport, key, transport);\n if (!methods.has(String(key)) || typeof method !== \"function\")\n return method;\n if (!wrappers.has(key))\n wrappers.set(key, async (...args: unknown[]) => {\n const signal = args[1] as AbortSignal | undefined;\n const start = performance.now();\n const entry: RequestActivityEntry = {\n id: nextId(),\n kind: String(key).replace(/^fetch/, \"\"),\n startedAt: Date.now(),\n status: \"pending\",\n };\n publish(entry);\n let done = false;\n const finish = (\n status: RequestActivityEntry[\"status\"],\n error?: unknown,\n ) => {\n if (done) return;\n done = true;\n publish({\n ...entry,\n status,\n durationMs: Math.max(0, performance.now() - start),\n ...(error !== undefined\n ? {\n error:\n error instanceof Error ? error.message : String(error),\n }\n : {}),\n });\n };\n const abort = () => finish(\"aborted\");\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) abort();\n try {\n const result = await method.apply(transport, args);\n finish(signal?.aborted ? \"aborted\" : \"success\");\n return result;\n } catch (error) {\n finish(\n signal?.aborted ||\n (error instanceof Error && error.name === \"AbortError\")\n ? \"aborted\"\n : \"error\",\n error,\n );\n throw error;\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n }\n });\n return wrappers.get(key);\n },\n });\n}\n\nexport function useRequestActivity<Row>(\n source: Transport<Row> | undefined,\n metricSource?: Transport<Row>,\n) {\n const [entries, setEntries] = useState<RequestActivityEntry[]>([]);\n const sequence = useRef(0),\n mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n const publish = useCallback((entry: RequestActivityEntry) => {\n if (mounted.current)\n setEntries((previous) =>\n [entry, ...previous.filter((e) => e.id !== entry.id)]\n .sort((a, b) => b.id - a.id)\n .slice(0, 100),\n );\n }, []);\n const transport = useMemo(\n () =>\n source\n ? observeTransport(source, publish, () => ++sequence.current)\n : undefined,\n [source, publish],\n );\n const clear = useCallback(\n () =>\n setEntries((previous) => previous.filter((e) => e.status === \"pending\")),\n [],\n );\n const metricTransport = useMemo(\n () => !metricSource || metricSource === source\n ? transport\n : observeTransport(metricSource, publish, () => ++sequence.current),\n [metricSource, source, transport, publish],\n );\n const activity: RequestActivityApi = useMemo(\n () => ({ entries, clear }),\n [entries, clear],\n );\n return { transport, metricTransport, activity };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n metricComputationKey,\n type AggregationClause,\n type AggregationResult,\n type FieldSchema,\n type QueryState,\n type Transport,\n} from \"@pythia-software/query-table-core\";\nimport { executeMetrics, usesLocalMetricPage, type MetricExecutionContext } from \"./metricExecution\";\n\nexport interface AggregationsApiState {\n results: AggregationResult | null;\n loading: boolean;\n error: Error | null;\n preview: (\n clauses: AggregationClause[],\n signal?: AbortSignal,\n ) => Promise<AggregationResult>;\n}\n\ntype BatchState = Pick<AggregationsApiState, \"results\" | \"loading\" | \"error\">;\n\nfunction localPage<Row>(clause: AggregationClause, context: MetricExecutionContext<Row>) {\n try {\n return usesLocalMetricPage(clause, context);\n } catch {\n // Keep invalid page inputs behind the readiness gate; execution reports\n // their diagnostics once the page is available.\n return !context.executeV3 && clause.scope === \"shownRows\";\n }\n}\n\n/** Separate lifecycles let remote populations run while a local page loads. */\nfunction useMetricBatch<Row>(\n query: QueryState,\n clauses: AggregationClause[],\n context: MetricExecutionContext<Row>,\n debounceMs: number,\n nonce: number,\n validateQuery: ((q: QueryState) => void) | undefined,\n enabled: boolean,\n page: boolean,\n): BatchState {\n const shown = clauses.some(c => c.scope === \"shownRows\");\n const key = JSON.stringify([\n query.where,\n metricComputationKey(clauses),\n shown ? [query.orderBy, query.limit, query.offset] : null,\n context.revisions ?? {}, context.execution ?? null, context.now,\n context.strictLocalMetrics, context.queryContextKey,\n page ? context.shownFields : null,\n ]);\n const localDataset = !context.executeV3 &&\n !(context.transport?.fetchMetrics && context.transport.metricCapabilities?.version === 2) &&\n !context.transport?.fetchAggregations;\n // Standalone callers can derive the page from a complete client dataset.\n // useQueryTable supplies an explicit gate for its committed-page lifecycle.\n const pageReady = context.rowsReady ?? (localDataset && context.clientRows !== undefined);\n const validationToken = useMemo(() => ({}), [\n key, context.schema, context.transport, nonce, validateQuery, enabled,\n ]);\n const token = useMemo(() => ({}), [\n key, context.schema, context.transport,\n localDataset ? context.clientRows : undefined,\n debounceMs, nonce, validateQuery, enabled, page, context.workerFactory,\n page ? context.shownRows : undefined,\n page ? context.rowsReady : undefined,\n page ? context.rowsError : undefined,\n ]);\n const latest = useRef({ query, clauses, context, validateQuery });\n latest.current = { query, clauses, context, validateQuery };\n const [state, setState] = useState<BatchState & { token: object; validationToken?: object }>(\n { token, results: null, loading: enabled && clauses.length > 0, error: null },\n );\n useEffect(() => {\n if (!enabled || !latest.current.clauses.length) return;\n const ac = new AbortController();\n const timer = setTimeout(() => {\n const current = latest.current;\n // Validate even while waiting so an invalid query remains repairable.\n try {\n current.validateQuery?.(current.query);\n } catch (e) {\n setState({ token, validationToken, results: null, loading: false, error: e instanceof Error ? e : Error(String(e)) });\n return;\n }\n if (page && !pageReady) return;\n void executeMetrics({ ...current.query, aggregations: current.clauses }, current.context, ac.signal)\n .then(results => {\n if (!ac.signal.aborted) setState({ token, results, loading: false, error: null });\n })\n .catch(e => {\n if (!ac.signal.aborted) setState({ token, results: null, loading: false, error: e instanceof Error ? e : Error(String(e)) });\n });\n }, debounceMs);\n return () => { ac.abort(); clearTimeout(timer); };\n }, [token]);\n if (!enabled || !clauses.length) return { results: null, loading: false, error: null };\n // Query rejection does not become obsolete just because a host allocates\n // another rows array while repairing the same invalid query.\n if (state.validationToken === validationToken && state.error) return state;\n if (page && !pageReady && context.rowsError)\n return { results: null, loading: false, error: context.rowsError };\n // Invalidate during render too: an old page must never look current between\n // the host's render and the effect that starts its replacement request.\n if (state.token !== token) return { results: null, loading: true, error: null };\n return state;\n}\n\n/** Fetch state is keyed by computation and scope, never card presentation. */\nexport function useAggregations<Row>(\n query: QueryState,\n schema: FieldSchema<Row>,\n transport: Transport<Row> | undefined,\n clientRows: Row[] | undefined,\n debounceMs: number,\n nonce: number,\n validateQuery?: (q: QueryState) => void,\n options: Omit<MetricExecutionContext<Row>, \"schema\" | \"transport\" | \"clientRows\"> = {},\n enabled = true,\n): AggregationsApiState {\n const context = { schema, transport, clientRows, ...options };\n const clauses = query.aggregations ?? [];\n const pageClauses = clauses.filter(c => localPage(c, context));\n const otherClauses = clauses.filter(c => !pageClauses.includes(c));\n const other = useMetricBatch(query, otherClauses, context, debounceMs, nonce, validateQuery, enabled, false);\n const page = useMetricBatch(query, pageClauses, context, debounceMs, nonce, validateQuery, enabled, true);\n\n const previewKey = JSON.stringify([\n query.where, query.orderBy, query.limit, query.offset,\n metricComputationKey(clauses), options.revisions, options.execution,\n options.now, options.strictLocalMetrics, options.queryContextKey,\n ]);\n const previewToken = useMemo(() => ({}), [previewKey, schema, transport, nonce, validateQuery, enabled, options.workerFactory]);\n const pageKey = JSON.stringify([query.orderBy, query.limit, query.offset, options.shownFields]);\n const pageToken = useMemo(() => ({}), [previewToken, pageKey, clientRows, options.shownRows, options.rowsReady, options.rowsError]);\n const latest = useRef({ query, context, validateQuery, enabled, previewToken, pageToken });\n latest.current = { query, context, validateQuery, enabled, previewToken, pageToken };\n const previews = useRef(new Set<{\n controller: AbortController;\n page: boolean;\n previewToken: object;\n pageToken: object;\n }>());\n useEffect(() => () => {\n for (const pending of previews.current)\n if (pending.previewToken === previewToken) pending.controller.abort();\n }, [previewToken]);\n useEffect(() => () => {\n for (const pending of previews.current)\n if (pending.page && pending.pageToken === pageToken) pending.controller.abort();\n }, [pageToken]);\n const preview = useCallback(async (draftClauses: AggregationClause[], signal?: AbortSignal) => {\n const current = latest.current;\n if (!current.enabled) throw Error(\"Resolve the query link before previewing metrics.\");\n const draft = { ...current.query, aggregations: draftClauses };\n current.validateQuery?.(draft);\n const pending = {\n controller: new AbortController(),\n page: draftClauses.some(c => localPage(c, current.context)),\n previewToken: current.previewToken,\n pageToken: current.pageToken,\n };\n const cancel = () => pending.controller.abort();\n signal?.addEventListener(\"abort\", cancel, { once: true });\n if (signal?.aborted) cancel();\n previews.current.add(pending);\n try {\n const result = await executeMetrics(draft, current.context, pending.controller.signal);\n if (pending.controller.signal.aborted || current.previewToken !== latest.current.previewToken ||\n (pending.page && current.pageToken !== latest.current.pageToken))\n throw new DOMException(\"Aborted\", \"AbortError\");\n return result;\n } finally {\n previews.current.delete(pending);\n signal?.removeEventListener(\"abort\", cancel);\n }\n }, []);\n\n const orderKey = JSON.stringify(clauses.map(c => c.id));\n const results = useMemo(() => {\n if (!pageClauses.length) return other.results;\n if (!otherClauses.length) return page.results;\n if (!page.results || !other.results) return null;\n const byId = new Map([...page.results.metrics, ...other.results.metrics].map(m => [m.id, m]));\n return { metrics: clauses.flatMap(c => byId.get(c.id) ?? []) };\n }, [orderKey, pageClauses.length, otherClauses.length, page.results, other.results]);\n return { results, loading: page.loading || other.loading, error: page.error ?? other.error, preview };\n}\n","import {\n applyAggregations,\n normalizeQueryState,\n evaluateMetrics,\n metricPlans,\n metricDependencies,\n hasRegex,\n metricPopulationError,\n hasMetricSeries,\n planMetricSeries,\n predicatesOf,\n toAggregationQuery,\n toMetricQuery,\n validateMetric,\n selectMetricShownRows,\n readFieldValue,\n resolveFieldName,\n isComputedField,\n type AggregationClause,\n type AggregationResult,\n type FieldSchema,\n type FormulaNode,\n type FormulaPlan,\n type FormulaResult,\n type FormulaValue,\n type QueryState,\n type Transport,\n type ComputedExecution,\n} from \"@pythia-software/query-table-core\";\nimport {\n evaluateFormulaRows,\n type FormulaWorkerFactory,\n} from \"./formulaWorker\";\n\nexport interface MetricExecutionContext<Row> {\n executeV3?: (query: QueryState, signal?: AbortSignal) => Promise<AggregationResult>;\n queryContextKey?: string;\n schema: FieldSchema<Row>;\n /** One clock shared by source grouping, HAVING, rows and local metrics. */\n now?: number;\n /** Group projections use typed semantics even for shorthand metric clauses. */\n strictLocalMetrics?: boolean;\n transport?: Transport<Row> | undefined;\n clientRows?: Row[] | undefined;\n shownRows?: Row[] | undefined;\n rowsReady?: boolean | undefined;\n rowsError?: Error | null | undefined;\n shownFields?: readonly string[] | undefined;\n resolveComputed?: ((name: string) => FormulaPlan | undefined) | undefined;\n workerFactory?: FormulaWorkerFactory | undefined;\n revisions?: Record<string, string> | undefined;\n execution?: ComputedExecution;\n}\nconst abort = (signal?: AbortSignal) => {\n if (signal?.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n};\n\n/** Keep dispatch and the hook's committed-page lifecycle on the same route. */\nexport function usesLocalMetricPage<Row>(\n clause: AggregationClause,\n context: MetricExecutionContext<Row>,\n): boolean {\n return !context.executeV3 && clause.scope === \"shownRows\" && (\n !context.transport?.fetchMetrics ||\n context.transport.metricCapabilities?.version !== 2 ||\n context.transport.metricCapabilities.shownRows !== true ||\n !!clause.dateGrouping ||\n metricPlans(clause, context.schema, context.resolveComputed).some(hasRegex)\n );\n}\n\n/** Local regex inputs run in terminable workers; reduction uses only cached values. */\nasync function localMetrics<Row>(\n rows: Row[],\n query: QueryState,\n context: MetricExecutionContext<Row>,\n signal?: AbortSignal,\n): Promise<AggregationResult> {\n // Keep legacy aggregates on their permissive compatibility path. Advanced\n // metrics still use the typed formula engine and isolated regex workers.\n const originalClauses = query.aggregations ?? [];\n const advanced = (query.aggregations ?? []).filter(\n (c) =>\n context.strictLocalMetrics ||\n c.dateGrouping ||\n isComputedField(c.field ?? \"\") ||\n c.groupBy.some(isComputedField) ||\n c.diagnostics?.length ||\n c.expression !== undefined ||\n c.expressionY !== undefined ||\n c.scope !== undefined ||\n c.distribution ||\n c.sort ||\n c.groupLimit !== undefined ||\n c.where !== undefined ||\n c.minCount !== undefined ||\n hasMetricSeries(c),\n );\n if (\n advanced.length &&\n (originalClauses.length > 20 ||\n normalizeQueryState(query).aggregations?.length !==\n originalClauses.length)\n )\n return evaluateMetrics(rows, query, context.schema, {\n ...(context.now !== undefined ? { now: context.now } : {}),\n ...(signal ? { signal } : {}),\n ...(context.resolveComputed\n ? { resolveComputed: context.resolveComputed }\n : {}),\n });\n const legacy = (query.aggregations ?? []).filter(\n (c) => !advanced.includes(c),\n );\n const compatible = applyAggregations(\n rows,\n { ...query, aggregations: legacy },\n context.schema,\n {\n ...(context.now !== undefined ? { now: context.now } : {}),\n ...(signal ? { signal } : {}),\n },\n );\n if (!advanced.length) return compatible;\n query = { ...query, aggregations: advanced };\n const options = {\n ...(context.now !== undefined ? { now: context.now } : {}),\n ...(context.resolveComputed\n ? { resolveComputed: context.resolveComputed }\n : {}),\n ...(signal ? { signal } : {}),\n };\n for (const clause of query.aggregations ?? []) {\n const diagnostics = validateMetric(\n clause,\n context.schema,\n context.resolveComputed,\n );\n if (diagnostics.length)\n throw Error(diagnostics.map((d) => d.message).join(\" \"));\n }\n const requiresPage = (query.aggregations ?? []).some(\n (clause) => clause.scope === \"shownRows\",\n );\n const page = requiresPage\n ? selectMetricShownRows(rows, query, context.schema, {\n ...options,\n ...(context.rowsReady && context.shownRows\n ? { shownRows: context.shownRows }\n : {}),\n })\n : [];\n const caches = new Map<string, Map<Row, FormulaResult>>();\n for (const clause of query.aggregations ?? []) {\n for (const plan of metricPlans(\n clause,\n context.schema,\n context.resolveComputed,\n )) {\n if (!hasRegex(plan)) continue;\n const nodes =\n \"aggregates\" in plan\n ? (\n plan as FormulaPlan & {\n aggregates: Array<{ args: FormulaNode[] }>;\n }\n ).aggregates.flatMap((a) => a.args)\n : [plan.ast];\n for (const node of nodes) {\n if (!hasRegex({ ...plan, ast: node })) continue;\n const key = JSON.stringify(node);\n if (caches.has(key)) continue;\n let bytes = 0;\n const inputs = page.map((row) => {\n const values: Record<string, FormulaValue> = Object.create(null);\n for (const name of plan.dependencies) {\n const field = context.schema.fields.find((f) => f.name === name);\n if (!field) throw Error(`Unavailable metric input: ${name}`);\n const raw = readFieldValue(field, row);\n values[name] =\n raw instanceof Date\n ? raw.toISOString()\n : ((raw ?? null) as FormulaValue);\n }\n bytes += JSON.stringify(values).length;\n if (bytes > 16000000)\n throw Error(\n \"Metric worker input exceeds 16 MB. Reduce the shown rows.\",\n );\n return values;\n });\n const values = await evaluateFormulaRows(\n node,\n inputs,\n signal,\n context.workerFactory,\n );\n caches.set(\n key,\n new Map(page.map((row, i) => [row, values[i]!] as const)),\n );\n }\n }\n }\n abort(signal);\n const typed = evaluateMetrics(rows, query, context.schema, {\n ...options,\n shownRows: page,\n ...(caches.size\n ? {\n evaluateInput: (node: FormulaNode, row: Row, plan: FormulaPlan) => {\n const cached = caches.get(JSON.stringify(node));\n if (cached)\n return (\n cached.get(row) ?? {\n value: null,\n error: \"Metric worker result missing.\",\n }\n );\n // Core calls the override only for regex inputs.\n throw Error(\"Metric regex input was not evaluated in a worker.\");\n },\n }\n : {}),\n });\n const byId = new Map(\n [...compatible.metrics, ...typed.metrics].map((m) => [m.id, m]),\n );\n return { metrics: originalClauses.flatMap((c) => byId.get(c.id) ?? []) };\n}\n\nexport async function executeMetrics<Row>(\n query: QueryState,\n context: MetricExecutionContext<Row>,\n signal?: AbortSignal,\n): Promise<AggregationResult> {\n abort(signal);\n const clauses = query.aggregations ?? [];\n if (!clauses.length) return { metrics: [] };\n // Windows, shares and whole intervals are combined from plain metrics, so\n // every engine below runs them.\n const series = planMetricSeries(query, context.schema, {\n ...(context.now !== undefined ? { now: context.now } : {}),\n ...(context.resolveComputed ? { resolveComputed: context.resolveComputed } : {}),\n });\n if (series) {\n const parts = await Promise.all(\n series.queries.map((part) => executeMetrics(part, context, signal)),\n );\n return { metrics: series.combine(parts.flatMap((part) => part.metrics)) };\n }\n if (context.executeV3) return context.executeV3(query, signal);\n if (context.rowsReady === false && clauses.some(c => usesLocalMetricPage(c, context)))\n throw Error(\"Wait for the current table page before previewing shown-row metrics.\");\n const supportsV2 =\n !!context.transport?.fetchMetrics &&\n context.transport.metricCapabilities?.version === 2;\n if (\n context.clientRows &&\n !supportsV2 &&\n !context.transport?.fetchAggregations\n )\n return localMetrics(context.clientRows, query, context, signal);\n const shown = clauses.filter(c => usesLocalMetricPage(c, context));\n let matching = clauses.filter(c => !shown.includes(c));\n const results: AggregationResult[\"metrics\"] = [];\n if (shown.length) {\n if (!context.rowsReady || !context.shownRows)\n throw Error(\n \"Wait for the current table page before previewing shown-row metrics.\",\n );\n // Only committed inputs can claim \"shown rows\". Never hydrate them from a\n // newer response with the same IDs; that would mix data snapshots.\n const names = new Set(\n shown.flatMap((clause) => [\n ...clause.groupBy,\n ...(clause.where ?? []).flatMap((term) =>\n predicatesOf(term).map((predicate) => predicate.field),\n ),\n // Includes a measured minimum's field, which the page must also hold.\n ...metricDependencies(clause, context.schema, context.resolveComputed),\n ]),\n );\n for (const name of names) {\n const canonical = resolveFieldName(context.schema, name) ?? name;\n const field = context.schema.fields.find((f) => f.name === canonical);\n const dependencies =\n field?.source.kind === \"derived\"\n ? (field.source.dependencies ?? [])\n : [canonical];\n const loaded = context.shownFields\n ? dependencies.every((dep) => context.shownFields!.includes(dep))\n : field &&\n context.shownRows.every(\n (row) =>\n field.source.kind === \"derived\" ||\n loadedPath(\n row,\n field.source.kind === \"backend\"\n ? (field.source.path ?? field.name)\n : field.name,\n ),\n );\n if (!field || !loaded)\n throw Error(\n `Shown-page input ${name} is not loaded. Add it to the selected columns and refresh, or use a snapshot-capable metric transport.`,\n );\n }\n // Committed shown rows supply the population; original filters still define\n // the calendar domain for completing empty dates.\n const pageQuery = {\n ...query,\n orderBy: [],\n limit: Math.max(1, context.shownRows.length),\n offset: 0,\n aggregations: shown,\n };\n results.push(\n ...(await localMetrics(context.shownRows, pageQuery, context, signal))\n .metrics,\n );\n }\n // A capability the server lacks fails only the clauses that need it; the\n // rest of the batch is still sent.\n const unsupported = (clause: AggregationClause, error: string) =>\n results.push({ id: clause.id, buckets: [], error });\n const calendar = matching.filter((c) => c.dateGrouping);\n for (const clause of calendar)\n unsupported(\n clause,\n \"This server does not support calendar grouping. Enable the v3 query executor.\",\n );\n matching = matching.filter((c) => !c.dateGrouping);\n // Population controls are never dropped: a v1 endpoint, or a v2 server that\n // does not advertise them, fails only the clauses that use them.\n {\n const transport = context.transport;\n if (transport?.fetchMetrics || transport?.fetchAggregations) {\n const support =\n transport.fetchMetrics && transport.metricCapabilities?.version === 2\n ? transport.metricCapabilities\n : {};\n matching = matching.filter((c) => {\n const error = metricPopulationError(c, support);\n if (error) unsupported(c, error);\n return !error;\n });\n }\n }\n if (matching.length) {\n const transport = context.transport;\n if (\n transport?.fetchMetrics &&\n transport.metricCapabilities?.version === 2\n ) {\n const capabilities = transport.metricCapabilities;\n const request = toMetricQuery(\n { ...query, aggregations: matching },\n context.schema,\n context.execution,\n );\n if (request.diagnostics.length)\n throw Error(request.diagnostics.map((d) => d.message).join(\" \"));\n if (\n request.profile &&\n capabilities.profile &&\n request.profile !== capabilities.profile\n )\n throw Error(\n \"Metric transport and computed execution profiles do not match. Refresh the handshake.\",\n );\n const remoteFields = new Map(\n context.schema.fields.map((field) => [field.name, field]),\n );\n for (const [name, capability] of Object.entries(\n context.execution?.fields ?? {},\n ))\n if (isComputedField(name))\n remoteFields.set(name, {\n name,\n label: name,\n type: capability.type,\n source: { kind: \"backend\" },\n });\n const remoteSchema = {\n ...context.schema,\n fields: [...remoteFields.values()],\n };\n const wire = new Map(request.metrics.map((m) => [m.id, m]));\n const limitation = (clause: AggregationClause): string | undefined => {\n if (clause.scope === \"shownRows\" && !capabilities.shownRows)\n return \"This server does not support shown-row metrics.\";\n if (\n !capabilities.computedFields &&\n [\n ...clause.groupBy,\n ...metricPlans(clause, remoteSchema).flatMap(\n (plan) => plan.dependencies,\n ),\n ].some(isComputedField)\n )\n return \"This metric server does not support computed fields.\";\n const sent = wire.get(clause.id);\n if (\n !capabilities.expressions &&\n sent &&\n !sent.distribution &&\n (sent.expression !== undefined || sent.expressionY !== undefined)\n )\n return \"This server does not support composed metric expressions.\";\n if (\n !capabilities.distributions &&\n clause.distribution &&\n (!clause.display ||\n [\"box\", \"histogram\"].includes(clause.display.kind))\n )\n return \"This server does not support distributions.\";\n return undefined;\n };\n const rejected = new Set<string>();\n for (const clause of matching) {\n const error = limitation(clause);\n if (error) {\n rejected.add(clause.id);\n unsupported(clause, error);\n }\n }\n const metrics = request.metrics.filter((m) => !rejected.has(m.id));\n if (metrics.length)\n results.push(\n ...(await transport.fetchMetrics({ ...request, metrics }, signal))\n .metrics,\n );\n } else if (transport?.fetchAggregations) {\n const request = toAggregationQuery(\n { ...query, aggregations: matching },\n context.schema,\n );\n if (request.diagnostics?.length)\n throw Error(request.diagnostics.map((d) => d.message).join(\" \"));\n results.push(\n ...(await transport.fetchAggregations(request, signal)).metrics,\n );\n } else\n throw Error(\n \"Remote all-matching metrics require a metric-capable server transport.\",\n );\n }\n abort(signal);\n const byId = new Map(results.map((r) => [r.id, r]));\n return {\n metrics: clauses.map(\n (c) =>\n byId.get(c.id) ?? {\n id: c.id,\n buckets: [],\n error: \"Server omitted this metric.\",\n },\n ),\n };\n}\n\nfunction loadedPath(row: unknown, path: string): boolean {\n if (!row || typeof row !== \"object\") return false;\n if (path in row) return true;\n let value: unknown = row;\n for (const part of path.split(\".\")) {\n if (value === null) return true;\n if (!value || typeof value !== \"object\" || !(part in value)) return false;\n value = (value as Record<string, unknown>)[part];\n }\n return true;\n}\n","// useSelection — row selection for paged and re-sortable datasets.\n//\n// - Editable Shift-click ranges with a fixed row-ID anchor and a snapshot of\n// the selection before the range, so earlier selections survive resizing.\n// - Display-order changes commit the selection and reset the active range.\n// - Indeterminate header checkbox + select-all-on-page.\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { RowId } from \"@pythia-software/query-table-core\";\n\nexport interface SelectionApi {\n selected: Set<RowId>;\n isSelected: (id: RowId) => boolean;\n /** Toggle one row and start an editable range. With `shiftKey`, resize that\n * range in the current page's order, checking or unchecking according to the\n * anchor's toggle. `additive` + Shift adds a span to the current selection.\n * Missing anchors or changed display order fall back to a plain toggle. */\n toggle: (id: RowId, shiftKey?: boolean, additive?: boolean) => void;\n /** Select / clear every row currently on the page. */\n setPage: (ids: RowId[], selected: boolean) => void;\n /** Atomically replace the complete selection with arbitrary stable row ids. */\n replace: (ids: Iterable<RowId>) => void;\n /** Atomically retain only selected ids that are also present in `ids`. */\n retain: (ids: Iterable<RowId>) => void;\n /** Header checkbox tri-state for the current page. */\n pageState: (pageIds: RowId[]) => \"none\" | \"some\" | \"all\";\n clear: () => void;\n count: number;\n}\n\ninterface SelectionRange {\n anchor: RowId;\n baseline: Set<RowId>;\n selecting: boolean;\n displayedIds: RowId[];\n}\n\ninterface SelectionState {\n selected: Set<RowId>;\n range: SelectionRange | null;\n}\n\nfunction sameOrder(left: RowId[], right: RowId[]): boolean {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\n/** `displayedIds` is the page's id list in display order; the hook uses it to\n * resolve shift-ranges and header tri-state against what the user sees. */\nexport function useSelection(displayedIds: RowId[]): SelectionApi {\n const [{ selected }, setState] = useState<SelectionState>(() => ({\n selected: new Set(),\n range: null,\n }));\n\n useEffect(() => {\n setState((prev) => prev.range && !sameOrder(prev.range.displayedIds, displayedIds)\n ? { selected: prev.selected, range: null }\n : prev);\n }, [displayedIds]);\n\n const toggle = useCallback(\n (id: RowId, shiftKey = false, additive = false) => {\n setState((prev) => {\n const range = prev.range;\n if (shiftKey && range && sameOrder(range.displayedIds, displayedIds)) {\n const i = displayedIds.indexOf(range.anchor);\n const j = displayedIds.indexOf(id);\n if (i !== -1 && j !== -1) {\n const [lo, hi] = i <= j ? [i, j] : [j, i];\n // Additive gestures commit the current range before adding another\n // span. Ordinary Shift gestures always rebuild from its baseline.\n const activeRange = additive\n ? { ...range, baseline: prev.selected, selecting: true }\n : range;\n const next = new Set(activeRange.baseline);\n for (const rowId of displayedIds.slice(lo, hi + 1)) {\n if (activeRange.selecting) next.add(rowId);\n else next.delete(rowId);\n }\n return { selected: next, range: activeRange };\n }\n }\n const next = new Set(prev.selected);\n const selecting = !next.has(id);\n if (selecting) next.add(id);\n else next.delete(id);\n return {\n selected: next,\n range: { anchor: id, baseline: prev.selected, selecting, displayedIds: [...displayedIds] },\n };\n });\n },\n [displayedIds],\n );\n\n const setPage = useCallback((ids: RowId[], select: boolean) => {\n setState((prev) => {\n const next = new Set(prev.selected);\n for (const id of ids) {\n if (select) next.add(id);\n else next.delete(id);\n }\n return { selected: next, range: null };\n });\n }, []);\n\n const replace = useCallback((ids: Iterable<RowId>) => {\n const next = new Set(ids);\n setState({ selected: next, range: null });\n }, []);\n\n const retain = useCallback((ids: Iterable<RowId>) => {\n const allowed = new Set(ids);\n setState((prev) => {\n const next = new Set<RowId>();\n for (const id of prev.selected) if (allowed.has(id)) next.add(id);\n return { selected: next, range: null };\n });\n }, []);\n\n const pageState = useCallback(\n (pageIds: RowId[]): \"none\" | \"some\" | \"all\" => {\n if (pageIds.length === 0) return \"none\";\n let n = 0;\n for (const id of pageIds) if (selected.has(id)) n++;\n return n === 0 ? \"none\" : n === pageIds.length ? \"all\" : \"some\";\n },\n [selected],\n );\n\n const clear = useCallback(() => {\n setState({ selected: new Set(), range: null });\n }, []);\n\n return useMemo<SelectionApi>(\n () => ({\n selected,\n isSelected: (id) => selected.has(id),\n toggle,\n setPage,\n replace,\n retain,\n pageState,\n clear,\n count: selected.size,\n }),\n [selected, toggle, setPage, replace, retain, pageState, clear],\n );\n}\n","// useSelect — the SELECT list: visible columns, their order, and their widths,\n// all persisted INTO the query (decision #5, so one URL renders identically\n// anywhere). This API mutates QueryState.select; it holds no state of its own.\n// Width changes should be debounced by the caller before they hit the query to\n// avoid flooding history during a drag (useQueryTable does this).\n\nimport { useCallback, useMemo } from \"react\";\nimport type { QueryState, SelectColumn, FieldDef, FieldSchema } from \"@pythia-software/query-table-core\";\nimport { selectedFields } from \"@pythia-software/query-table-core\";\n\nexport interface SelectApi<Row> {\n /** Ordered visible columns (resolved: schema defaults when query.select is empty). */\n visible: SelectColumn[];\n /** The corresponding FieldDefs, same order. */\n fields: FieldDef<Row>[];\n /** Selectable fields not currently shown (for the \"add column\" picker). */\n hidden: FieldDef<Row>[];\n\n show: (field: string) => void;\n hide: (field: string) => void;\n /** Reorder via drag-drop: move `field` to `toIndex` in the visible order. */\n move: (field: string, toIndex: number) => void;\n /** Set a column's pixel width. */\n setWidth: (field: string, width: number) => void;\n /** Reset to the schema's default columns (clears query.select). */\n reset: () => void;\n}\n\ntype SetQuery = (next: QueryState | ((prev: QueryState) => QueryState)) => void;\n\nexport function useSelect<Row>(query: QueryState, setQuery: SetQuery, schema: FieldSchema<Row>): SelectApi<Row> {\n const fields = useMemo(() => selectedFields(schema, query), [schema, query]);\n\n // The materialized SelectColumn[] (resolve defaults so the UI always has a\n // concrete, reorderable list even before the user customizes it).\n const visible = useMemo<SelectColumn[]>(() => fields.map((f) => columnFor(query.select, f.name)), [fields, query.select]);\n\n const hidden = useMemo<FieldDef<Row>[]>(() => {\n const shown = new Set(fields.map((f) => f.name));\n return schema.fields.filter((f) => !shown.has(f.name) && (f.select?.enabled ?? true));\n }, [schema, fields]);\n\n const writeSelect = useCallback(\n (mutate: (cols: SelectColumn[]) => SelectColumn[], clearFitToScreen = false) => {\n setQuery((prev) => {\n // Materialize current (resolved) columns the first time we diverge from defaults.\n const current = prev.select.length ? prev.select : visible;\n const next = { ...prev, select: mutate([...current]) };\n if (clearFitToScreen) delete next.fitToScreen;\n return next;\n });\n },\n [setQuery, visible],\n );\n\n const show = useCallback((field: string) => writeSelect((c) => (c.some((x) => x.field === field) ? c : [...c, { field }])), [writeSelect]);\n const hide = useCallback((field: string) => writeSelect((c) => c.filter((x) => x.field !== field)), [writeSelect]);\n const move = useCallback(\n (field: string, toIndex: number) =>\n writeSelect((c) => {\n const from = c.findIndex((x) => x.field === field);\n if (from === -1) return c;\n const [item] = c.splice(from, 1);\n c.splice(Math.max(0, Math.min(toIndex, c.length)), 0, item!);\n return c;\n }),\n [writeSelect],\n );\n const setWidth = useCallback(\n (field: string, width: number) =>\n writeSelect((c) => c.map((x) => (x.field === field ? { ...x, width: Math.round(width) } : x)), true),\n [writeSelect],\n );\n const reset = useCallback(() => setQuery((prev) => ({ ...prev, select: [] })), [setQuery]);\n\n return { visible, fields, hidden, show, hide, move, setWidth, reset };\n}\n\nfunction columnFor(select: SelectColumn[], name: string): SelectColumn {\n const found = select.find((c) => c.field === name);\n return found ?? { field: name };\n}\n","// useColumnDrag — transient, SHARED state for a column-reorder drag. One instance\n// is owned by useQueryTable and read by BOTH the table headers and the\n// QueryBuilder select chips, so a drag started in either surface live-previews\n// (and dims) the same column in the other. It holds no query state; the reorder\n// is committed to QueryState.select by whichever surface handles the drop.\n\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport interface ColumnDragApi {\n /** Field name currently being dragged, or null when idle. */\n source: string | null;\n /** Insertion index within the order with `source` removed (0..n; n = append). */\n overIndex: number | null;\n /** True while a column drag is in progress. */\n active: boolean;\n /** Changes only for confirmed drops, so surfaces can persist auxiliary positions. */\n dropRevision?: number;\n /** Begin dragging `field` at `index`. Supply the surface order for cross-surface mapping. */\n start: (field: string, index: number, order?: string[]) => void;\n /** Update the insertion slot and optional surface order (no-op if unchanged). */\n over: (index: number, order?: string[]) => void;\n /** End the drag (on drop or cancel). */\n end: (committed?: boolean) => void;\n /** The live order to render while dragging: `source` moved to `overIndex`.\n * Returns `order` unchanged when idle, or when `source` isn't in `order`. */\n preview: (order: string[]) => string[];\n}\n\ninterface DragState {\n source: string;\n overIndex: number;\n order: string[] | undefined;\n moved: boolean;\n}\n\nexport function useColumnDrag(): ColumnDragApi {\n const [state, setState] = useState<DragState | null>(null);\n const [dropRevision, setDropRevision] = useState(0);\n\n const start = useCallback(\n (field: string, index: number, order?: string[]) =>\n setState({\n source: field,\n overIndex: index,\n order: order?.slice(),\n moved: false,\n }),\n [],\n );\n const over = useCallback(\n (index: number, order?: string[]) =>\n // Keep the SAME object reference when unchanged so React can bail out of the\n // re-render — onDragOver fires continuously while the cursor moves.\n setState((s) => {\n if (!s) return s;\n if (\n s.moved &&\n s.overIndex === index &&\n ((!order && !s.order) ||\n (order &&\n s.order &&\n order.length === s.order.length &&\n order.every((name, i) => name === s.order![i])))\n )\n return s;\n return {\n source: s.source,\n overIndex: index,\n order: order?.slice(),\n moved: true,\n };\n }),\n [],\n );\n const end = useCallback((committed = false) => {\n if (committed) setDropRevision((revision) => revision + 1);\n setState(null);\n }, []);\n\n const preview = useCallback(\n (order: string[]): string[] => {\n if (!state || (state.order && !state.moved)) return order;\n const without = order.filter((n) => n !== state.source);\n if (without.length === order.length) return order; // source not part of this list\n let at = Math.max(0, Math.min(state.overIndex, without.length));\n if (state.order) {\n // Surfaces can contain different auxiliary columns (e.g. selection).\n // Resolve the slot against shared neighboring fields, not raw indices.\n const reference = state.order.filter((name) => name !== state.source);\n const slot = Math.max(0, Math.min(state.overIndex, reference.length));\n const following = reference\n .slice(slot)\n .find((name) => without.includes(name));\n const preceding = reference\n .slice(0, slot)\n .reverse()\n .find((name) => without.includes(name));\n if (following != null) at = without.indexOf(following);\n else if (preceding != null) at = without.indexOf(preceding) + 1;\n }\n return [...without.slice(0, at), state.source, ...without.slice(at)];\n },\n [state],\n );\n\n return useMemo(\n () => ({\n source: state?.source ?? null,\n overIndex: state?.overIndex ?? null,\n active: state != null,\n dropRevision,\n start,\n over,\n end,\n preview,\n }),\n [state, dropRevision, start, over, end, preview],\n );\n}\n","// useSavedQueries — named query snapshots over a StorageAdapter.\n//\n// \"Last query\" auto-restore and named saves both flow through the injected\n// StorageAdapter (in-memory by default, explicitly durable when the caller\n// provides one). Loading a saved query pushes its QueryState into the controller.\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { QueryState, SavedQuery, StorageAdapter, QuerySnapshot } from \"@pythia-software/query-table-core\";\n\nexport interface SavedQueriesApi {\n items: SavedQuery[];\n loading: boolean;\n /** Saved query id used as the default view when no query is specified. */\n defaultId: string | null;\n /** Persist the current query under a name. Rejects on duplicate names. */\n save: (name: string) => Promise<SavedQuery>;\n /** Whether the storage adapter supports atomic updates. */\n canUpdate: boolean;\n /** Replace a saved query with the current state, retaining its id and default. */\n update: (id: string) => Promise<SavedQuery>;\n /** Load a saved query into the live controller. Throws, changing nothing,\n * when the table cannot accept it (for example unreadable host state). */\n load: (id: string) => void;\n /** Mark a saved query as the default view. No-op when storage lacks support. */\n setDefault: (id: string) => Promise<void>;\n /** Clear the saved-query default view. */\n clearDefault: () => Promise<void>;\n remove: (id: string) => Promise<void>;\n}\n\nexport function useSavedQueries(\n key: string,\n currentQuery: QueryState,\n applyQueryState: (q: QueryState) => void,\n storage: StorageAdapter,\n /** Injected clock so saves are deterministic/testable. */\n now: () => number,\n snapshot?: (query: QueryState) => Promise<QuerySnapshot | null>,\n): SavedQueriesApi {\n const [items, setItems] = useState<SavedQuery[]>([]);\n const [defaultId, setDefaultId] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const storageRef = useRef(storage);\n storageRef.current = storage;\n\n const refresh = useCallback(async () => {\n const storage = storageRef.current;\n setLoading(true);\n try {\n const [savedItems, defaultSaved] = await Promise.allSettled([\n storage.listSaved(key),\n storage.loadDefaultSaved?.(key) ?? Promise.resolve(null),\n ]);\n // Optional catalogue reads must not block the table or turn a committed\n // save into a reported failure. Keep the last successful data on failure.\n if (savedItems.status === \"fulfilled\") setItems(savedItems.value);\n if (defaultSaved.status === \"fulfilled\") setDefaultId(defaultSaved.value?.id ?? null);\n } finally {\n setLoading(false);\n }\n }, [key]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const save = useCallback(\n async (name: string) => {\n name = name.trim();\n if (!name || name.length > 200) throw Error(\"Saved query name must be between 1 and 200 characters.\");\n const immutable = await snapshot?.(currentQuery);\n const saved = await storage.saveNamed(key, name, currentQuery, now(), immutable?.code);\n await refresh();\n return saved;\n },\n [storage, key, currentQuery, now, refresh, snapshot],\n );\n\n const load = useCallback(\n (id: string) => {\n const found = items.find((q) => q.id === id);\n if (found) applyQueryState(found.query);\n },\n [items, applyQueryState],\n );\n\n const update = useCallback(\n async (id: string) => {\n if (!storage.updateNamed) throw Error(\"This storage adapter does not support saved-query updates.\");\n const immutable = await snapshot?.(currentQuery);\n const saved = await storage.updateNamed(key, id, currentQuery, now(), immutable?.code);\n await refresh();\n return saved;\n },\n [storage, key, currentQuery, now, refresh, snapshot],\n );\n\n const setDefault = useCallback(\n async (id: string) => {\n await storage.setDefaultSaved?.(key, id);\n await refresh();\n },\n [storage, key, refresh],\n );\n\n const clearDefault = useCallback(async () => {\n await storage.setDefaultSaved?.(key, null);\n await refresh();\n }, [storage, key, refresh]);\n\n const remove = useCallback(\n async (id: string) => {\n if (id === defaultId) await storage.setDefaultSaved?.(key, null);\n await storage.deleteSaved(key, id);\n await refresh();\n },\n [storage, key, defaultId, refresh],\n );\n\n return { items, loading, defaultId, save, canUpdate: Boolean(storage.updateNamed), update, load, setDefault, clearDefault, remove };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { encodeQuery, type QueryLink, type QueryLinkService, type QueryState, type QuerySnapshot } from \"@pythia-software/query-table-core\";\n\nexport interface QueryLinksApi {\n maxUrlBytes: number;\n kind: QueryLink[\"kind\"] | null;\n busy: boolean;\n error: Error | null;\n /** Explicit Share/Bookmark: server snapshot if configured, otherwise a fitting inline link. */\n create(query?: QueryState, options?: { baseUrl?: string; parameter?: string }): Promise<QueryLink>;\n /** Synchronous local-only URL for navigation, never a server write. */\n local(query: QueryState, baseUrl?: string, parameter?: string): QueryLink;\n /** Save uses the same immutable snapshot and promotion path as Share. */\n snapshot(query: QueryState): Promise<QuerySnapshot | null>;\n}\n\nexport function useQueryLinks(query: QueryState, service: QueryLinkService, syncUrl: boolean, ready: boolean, parameter: string, maxUrlBytes: number,\n onUrlChange: (url: string) => void,\n /** Rewrites parameters the host owns for this query, such as host state. */\n decorate: (url: string, query: QueryState) => string = (url) => url): QueryLinksApi {\n const latest = useRef(query); latest.current = query;\n const [kind, setKind] = useState<QueryLink[\"kind\"] | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useRef(true);\n const operations = useRef(0);\n useEffect(() => { mounted.current = true; return () => { mounted.current = false; }; }, []);\n const queryKey = JSON.stringify(query);\n useEffect(() => {\n if (!syncUrl || !ready || typeof window === \"undefined\") return;\n try {\n // Preserve an already-promoted link until the query actually changes.\n const result = service.local(query, window.location.href, parameter);\n const url = decorate(result.url, query);\n window.history.replaceState(window.history.state, \"\", url);\n onUrlChange(url);\n setKind(result.kind); setError(null);\n } catch (e) { setError(e instanceof Error ? e : Error(String(e))); }\n }, [queryKey, syncUrl, ready, service, parameter, onUrlChange, decorate]);\n\n const snapshot = useCallback(async (q: QueryState) => {\n const captured = encodeQuery(q);\n const base = typeof window !== \"undefined\" ? window.location.href : undefined;\n operations.current++; setBusy(true); setError(null);\n try {\n if (!ready) throw Error(\"Resolve or reset the query link before saving it.\");\n const saved = await service.snapshot(q);\n if (saved && base && mounted.current && syncUrl && ready && window.location.href === base && encodeQuery(latest.current) === captured) {\n const url = new URL(base); url.searchParams.set(parameter, \"@\" + saved.code);\n const result = service.local(q, url.toString(), parameter);\n const next = decorate(result.url, q);\n window.history.replaceState(window.history.state, \"\", next); onUrlChange(next); setKind(\"durable\");\n }\n return saved;\n }\n catch (e) { if (mounted.current) setError(e instanceof Error ? e : Error(String(e))); throw e; }\n finally { operations.current--; if (mounted.current) setBusy(operations.current > 0); }\n }, [service, syncUrl, ready, parameter, onUrlChange, decorate]);\n const create = useCallback(async (q = latest.current, options: { baseUrl?: string; parameter?: string } = {}) => {\n const baseUrl = options.baseUrl ?? window.location.href;\n const param = options.parameter ?? parameter;\n const captured = encodeQuery(q);\n operations.current++; setBusy(true); setError(null);\n try {\n if (!ready) throw Error(\"Resolve or reset the query link before sharing it.\");\n const durable = await service.durable(q, baseUrl, param);\n const result = param === parameter ? { ...durable, url: decorate(durable.url, q) } : durable;\n if (mounted.current && syncUrl && ready && param === parameter &&\n window.location.href === baseUrl && encodeQuery(latest.current) === captured) {\n window.history.replaceState(window.history.state, \"\", result.url);\n onUrlChange(result.url);\n setKind(result.kind);\n }\n return result;\n } catch (e) { if (mounted.current) setError(e instanceof Error ? e : Error(String(e))); throw e; }\n finally { operations.current--; if (mounted.current) setBusy(operations.current > 0); }\n }, [service, syncUrl, ready, parameter, onUrlChange, decorate]);\n const local = useCallback((q: QueryState, base = window.location.href, param = parameter) => {\n const result = service.local(q, base, param);\n return param === parameter ? { ...result, url: decorate(result.url, q) } : result;\n }, [service, parameter, decorate]);\n return { maxUrlBytes, kind, busy, error, create, local, snapshot };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport {\n objectReferenceKey,\n type ObjectReference,\n type RelationshipAdapter,\n type ResolvedObjectReference,\n} from \"@pythia-software/query-table-core\";\n\n/** One cancellable batch per displayed reference set; rejects unrelated results. */\nexport function useObjectReferences(\n references: ObjectReference[],\n adapter?: RelationshipAdapter,\n) {\n const fingerprint = JSON.stringify(references.map(objectReferenceKey).sort());\n const batch = useMemo(\n () => [\n ...new Map(\n references.map((reference) => [\n objectReferenceKey(reference),\n reference,\n ]),\n ).values(),\n ],\n [fingerprint],\n );\n const [state, setState] = useState({\n fingerprint: \"\",\n adapter: undefined as RelationshipAdapter | undefined,\n values: new Map<string, ResolvedObjectReference>(),\n error: null as Error | null,\n });\n useEffect(() => {\n const controller = new AbortController();\n if (!adapter || batch.length === 0) return;\n const allowed = new Set(batch.map(objectReferenceKey));\n void Promise.resolve()\n .then(() => adapter.resolve(batch, controller.signal))\n .then((results) => {\n if (controller.signal.aborted) return;\n const values = new Map<string, ResolvedObjectReference>();\n for (const result of results) {\n const key = objectReferenceKey(result.reference);\n if (allowed.has(key)) values.set(key, result);\n }\n setState({ fingerprint, adapter, values, error: null });\n })\n .catch((error) => {\n if (!controller.signal.aborted)\n setState({\n fingerprint,\n adapter,\n values: new Map(),\n error: error instanceof Error ? error : new Error(String(error)),\n });\n });\n return () => controller.abort();\n }, [batch, adapter]);\n const current =\n state.fingerprint === fingerprint && state.adapter === adapter;\n return {\n values: current ? state.values : new Map<string, ResolvedObjectReference>(),\n error: current ? state.error : null,\n };\n}\n"],"mappings":"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","names":["column","withoutGrouping","sourceExecutionSchema","toQueryRequestV3","validateQueryResultV3","metricPopulationError","useCallback","useEffect","useRef","useState","useCallback","useEffect","useMemo","useRef","useState","useRef","useEffect","queryParameter","useCallback","row","useState","predicatesOf","predicatesOf","predicatesOf","useCallback","useEffect","useMemo","useRef","useState","predicatesOf","isComputedField","readFieldValue","abort","useMemo","useState","useRef","useCallback","useEffect","isComputedField","f","readFieldValue","abort","predicatesOf","useCallback","useEffect","useMemo","useRef","useState","applyQuery","normalizeQueryState","readFieldValue","selectedFields","toServerQuery","queriesEqual","isWhereConjunction","predicatesOf","metricPlans","validateMetric","metricDependencies","isComputedField","computedFieldName","toServerQueryV2","groupKeyFields","useCallback","useEffect","useMemo","useRef","useState","abort","useCallback","useEffect","useMemo","useRef","useState","normalizeQueryState","hasRegex","predicatesOf","readFieldValue","isComputedField","hasRegex","isComputedField","normalizeQueryState","values","readFieldValue","predicatesOf","useMemo","useRef","useState","useEffect","useCallback","useCallback","useEffect","useMemo","useState","next","useCallback","useMemo","useCallback","useMemo","useState","useCallback","useEffect","useRef","useState","storage","useCallback","useEffect","useRef","useState","selectedFields","normalizeQueryState","isWhereConjunction","readFieldValue","useRef","useMemo","useState","useCallback","sourceExecutionSchema","error","withoutGrouping","useEffect","queriesEqual","storage","linkService","defaults","abort","host","isComputedField","validateMetric","metricPlans","execution","toServerQueryV2","toServerQuery","computedFieldName","metricDependencies","predicatesOf","toQueryRequestV3","validateQueryResultV3","applyQuery","metricPopulationError","patch","groupKeyFields","useEffect","useMemo","useState"]}
1
+ {"version":3,"sources":["../src/useQueryFilters.ts","../src/useGrouping.ts","../src/useQueryTable.ts","../src/useItemDetails.ts","../src/usePropertyView.ts","../src/computedExecution.ts","../src/previewRows.ts","../src/useComputedColumns.ts","../src/formulaWorker.ts","../src/useRequestActivity.ts","../src/useAggregations.ts","../src/metricExecution.ts","../src/useSelection.ts","../src/useSelect.ts","../src/useColumnDrag.ts","../src/useSavedQueries.ts","../src/useQueryLinks.ts","../src/useObjectReferences.ts"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport {\n branchesOf,\n isOrGroup,\n isWhereConjunction,\n negateClause,\n opsForField,\n type FieldSchema,\n type WhereBranch,\n type WhereClause,\n type WhereTerm,\n} from \"@pythia-software/query-table-core\";\nimport type { QueryTableApi } from \"./useQueryTable\";\n\n/** Edit the `predIndex`-th literal of an OR of conjunctions, counted in\n * `predicatesOf` order; `edit` returning null removes it. Returns the term in\n * canonical form: a conjunction of one is its literal, a group of one branch\n * its literal(s), and an emptied group nothing. */\nfunction editBranchPredicate(\n term: { any: WhereBranch[] },\n predIndex: number,\n edit: (clause: WhereClause) => WhereClause | null,\n): WhereTerm[] {\n let k = 0;\n const any: WhereBranch[] = [];\n for (const member of term.any) {\n const kept: WhereClause[] = [];\n for (const clause of isWhereConjunction(member) ? member.all : [member]) {\n const next = k++ === predIndex ? edit(clause) : clause;\n if (next) kept.push(next);\n }\n if (kept.length === 1) any.push(kept[0]!);\n else if (kept.length > 1) any.push({ all: kept });\n }\n if (any.length > 1) return [{ any } as WhereTerm];\n const only = any[0];\n return !only ? [] : isWhereConjunction(only) ? only.all : [only];\n}\n\n/** Filter controls for either the result query or grouping's source query. */\nexport type QueryFilterApi<Row> = Pick<\n QueryTableApi<Row>,\n | \"query\"\n | \"setQuery\"\n | \"loading\"\n | \"addFilter\"\n | \"updateFilter\"\n | \"removeFilter\"\n | \"clearFilters\"\n | \"updatePredicate\"\n | \"removePredicate\"\n | \"negatePredicate\"\n | \"reorderFilters\"\n | \"mergeFilters\"\n | \"filterValues\"\n | \"fieldStats\"\n>;\n\n/** Bind filter intents to a query stage, including the source WHERE of grouping. */\nexport function useQueryFilters<Row>(\n schema: FieldSchema<Row>,\n setQuery: QueryTableApi<Row>[\"setQuery\"],\n) {\n const byName = useMemo(\n () => new Map(schema.fields.map((field) => [field.name, field])),\n [schema],\n );\n const addFilter = useCallback(\n (clause: WhereClause) =>\n setQuery((q) => ({ ...q, offset: 0, where: [...q.where, clause] })),\n [setQuery],\n );\n const updateFilter = useCallback(\n (index: number, clause: WhereClause) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n where: q.where.map((t, i) => (i === index ? clause : t)),\n })),\n [setQuery],\n );\n const removeFilter = useCallback(\n (index: number) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n where: q.where.filter((_, i) => i !== index),\n })),\n [setQuery],\n );\n const clearFilters = useCallback(\n () => setQuery((q) => ({ ...q, offset: 0, where: [] })),\n [setQuery],\n );\n\n const updatePredicate = useCallback<QueryTableApi<Row>[\"updatePredicate\"]>(\n (termIndex, predIndex, clause) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n where: q.where.map((term, i) => {\n if (i !== termIndex) return term;\n if (isOrGroup(term))\n return {\n any: term.any.map((c, j) => (j === predIndex ? clause : c)),\n };\n if (\"any\" in term) return editBranchPredicate(term, predIndex, () => clause);\n return clause;\n }).flat(),\n })),\n [setQuery],\n );\n const removePredicate = useCallback<QueryTableApi<Row>[\"removePredicate\"]>(\n (termIndex, predIndex) =>\n setQuery((q) => {\n const where: WhereTerm[] = [];\n q.where.forEach((term, i) => {\n if (i !== termIndex) {\n where.push(term);\n return;\n }\n if (isOrGroup(term)) {\n const members = term.any.filter((_, j) => j !== predIndex);\n if (members.length === 1) where.push(members[0]!);\n else if (members.length > 1) where.push({ any: members });\n return; // 0 members → drop the term\n }\n if (\"any\" in term) {\n where.push(...editBranchPredicate(term, predIndex, () => null));\n return;\n }\n // literal term → removing its predicate drops the whole term\n });\n return { ...q, offset: 0, where };\n }),\n [setQuery],\n );\n const negateOne = useCallback(\n (clause: WhereClause): WhereClause => {\n const field = byName.get(clause.field);\n return negateClause(clause, field ? opsForField(field) : undefined);\n },\n [byName],\n );\n const negatePredicate = useCallback<QueryTableApi<Row>[\"negatePredicate\"]>(\n (termIndex, predIndex) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n where: q.where.map((term, i) => {\n if (i !== termIndex) return term;\n if (isOrGroup(term))\n return {\n any: term.any.map((c, j) => (j === predIndex ? negateOne(c) : c)),\n };\n if (\"any\" in term) return editBranchPredicate(term, predIndex, negateOne);\n return negateOne(term);\n }).flat(),\n })),\n [setQuery, negateOne],\n );\n const reorderFilters = useCallback<QueryTableApi<Row>[\"reorderFilters\"]>(\n (fromIndex, toIndex) =>\n setQuery((q) => {\n if (fromIndex < 0 || fromIndex >= q.where.length) return q;\n const where = [...q.where];\n const [moved] = where.splice(fromIndex, 1);\n where.splice(Math.max(0, Math.min(toIndex, where.length)), 0, moved!);\n return { ...q, offset: 0, where };\n }),\n [setQuery],\n );\n const mergeFilters = useCallback<QueryTableApi<Row>[\"mergeFilters\"]>(\n (sourceIndex, targetIndex) =>\n setQuery((q) => {\n if (sourceIndex === targetIndex) return q;\n const source = q.where[sourceIndex];\n const target = q.where[targetIndex];\n if (!source || !target) return q;\n // OR the two terms' branches, so a conjunction stays one branch.\n const merged = {\n any: [...branchesOf(target), ...branchesOf(source)].map(\n (branch): WhereBranch => (branch.length === 1 ? branch[0]! : { all: branch }),\n ),\n } as WhereTerm;\n const where: WhereTerm[] = [];\n q.where.forEach((term, i) => {\n if (i === sourceIndex) return; // remove the dragged term\n where.push(i === targetIndex ? merged : term);\n });\n return { ...q, offset: 0, where };\n }),\n [setQuery],\n );\n return {\n addFilter,\n updateFilter,\n removeFilter,\n clearFilters,\n updatePredicate,\n removePredicate,\n negatePredicate,\n reorderFilters,\n mergeFilters,\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n groupKeyFields,\n MAX_SUMMARY_COLUMNS,\n normalizeQueryState,\n predicatesOf,\n withGroupingKeys,\n withoutGrouping,\n type FieldSchema,\n type GroupKey,\n type GroupedRow,\n type GroupingModel,\n queriesEqual,\n type GroupingView,\n type QueryState,\n type RepresentativeRow,\n type SelectColumn,\n type SummaryColumn,\n type SummaryOp,\n} from \"@pythia-software/query-table-core\";\nimport type { QueryFilterApi } from \"./useQueryFilters\";\nimport type { QueryTableApi } from \"./useQueryTable\";\n\n/** Source-stage controls. Rows/columns/metrics remain on the active result API. */\nexport type GroupingSourceApi<Row> = QueryFilterApi<Row> &\n Pick<QueryTableApi<Row>, \"itemDetails\" | \"rowId\"> & {\n schema: FieldSchema<Row>;\n };\n\nexport interface GroupingApi<Row> {\n inputsReady?: boolean;\n preview?: (query: QueryState, signal?: AbortSignal) => Promise<{ rows: GroupedRow[]; sourceTotal: number; total: number }>;\n supported: boolean;\n model: GroupingModel<Row>;\n api: QueryTableApi<Row>;\n source: GroupingSourceApi<Row>;\n grouped: QueryTableApi<Row>;\n schema: FieldSchema<Row>;\n view: GroupingView;\n /** Problems with link columns. They never block the grouped table: an\n * invalid link renders as plain text. Unregistered host targets are\n * reported when rendering. */\n diagnostics: string[];\n inputs: Row[];\n notice: string;\n setNotice: (notice: string) => void;\n /** Field names, or calendar keys (`{ field, interval, timeZone }`) for\n * datetime fields. */\n changeKeys: (keys: GroupKey[]) => void;\n addSummary: (op: SummaryOp, field?: string) => void;\n changeSummary: (id: string, op: SummaryOp) => void;\n changeRepresentative: (rule: RepresentativeRow | null) => void;\n representativeImpact: () => string;\n applyColumns: (summaries: SummaryColumn[], columns: SelectColumn[]) => void;\n}\n\n/** Structural edits are one normal QueryState transaction: persistence,\n * sharing, undo and redo all retain the original source query and result view. */\nexport function useGroupingController<Row>(\n api: QueryTableApi<Row>,\n source: GroupingSourceApi<Row>,\n model: GroupingModel<Row>,\n inputs: Row[],\n supported: boolean,\n viewRevision: number,\n execution: Pick<GroupingApi<Row>, \"inputsReady\" | \"preview\"> = {},\n): GroupingApi<Row> {\n const [notice, setNotice] = useState(\"\");\n useEffect(() => setNotice(\"\"), [viewRevision]);\n const previous = useRef<{ query: QueryState; revision: number } | null>(null);\n const stage = api.query.grouping;\n const view: GroupingView = {\n version: 2,\n mode: stage ? \"groups\" : \"rows\",\n keys: groupKeyFields(stage?.keys ?? []),\n groupKeys: stage?.keys ?? [],\n summaries: stage?.summaries ?? [],\n representative: stage?.representative ?? null,\n input: source.query,\n result: withoutGrouping(api.query),\n };\n const outputSchema = {\n ...api.schema!,\n fields: api.computed.catalogue,\n } as unknown as FieldSchema<GroupedRow>;\n function changeKeys(keys: GroupKey[]) {\n if (keys.length && !supported) return;\n const cached =\n previous.current?.revision === viewRevision\n ? previous.current.query\n : null;\n const canRestore = (current: QueryState) =>\n !current.grouping && cached?.grouping &&\n queriesEqual(cached.grouping.source, current) &&\n JSON.stringify(cached.grouping.keys) === JSON.stringify(keys);\n // Reject at the intent boundary, where callers can display the error.\n // Throwing inside a state updater instead fails React's next render.\n if (keys.length)\n model.validate(canRestore(api.query) ? cached!.grouping! : {\n ...(stage ?? { summaries: [], representative: null }),\n keys,\n });\n if (!keys.length && stage)\n previous.current = { query: api.query, revision: viewRevision };\n api.setQuery((current) => {\n // Restore a previous grouped layout only for the same explicit keys.\n if (keys.length && !current.grouping && cached?.grouping && canRestore(current))\n return {\n ...cached,\n grouping: { ...cached.grouping, source: current },\n };\n return withGroupingKeys(current, keys);\n });\n setNotice(\n stage && api.query.aggregations?.length && keys.length\n ? \"Grouping changed. Group metrics cleared; Undo restores them.\"\n : \"\",\n );\n api.selection.clear();\n }\n function applyColumns(summaries: SummaryColumn[], columns: SelectColumn[]) {\n if (!stage) {\n api.setQuery((q) => ({ ...q, select: columns }));\n return;\n }\n model.validate({ ...stage, summaries });\n const changed = new Set(\n stage.summaries\n .filter((before) => {\n const after = summaries.find((column) => column.id === before.id);\n return (\n !after ||\n before.op !== after.op ||\n before.field !== after.field ||\n before.expression !== after.expression\n );\n })\n .map((column) => column.id),\n );\n api.setQuery((q) =>\n q.grouping\n ? {\n ...q,\n grouping: { ...q.grouping, summaries },\n select: columns,\n ...(changed.size\n ? {\n offset: 0,\n aggregations: [],\n where: q.where.filter(\n (term) =>\n !predicatesOf(term).some((p) => changed.has(p.field)),\n ),\n orderBy: q.orderBy.filter((term) => !changed.has(term.field)),\n }\n : {}),\n }\n : q,\n );\n setNotice(\n changed.size &&\n (api.query.where.some((term) =>\n predicatesOf(term).some((p) => changed.has(p.field)),\n ) ||\n api.query.orderBy.some((term) => changed.has(term.field)) ||\n api.query.aggregations?.length)\n ? \"Columns updated. Affected filters, sorts, and metrics cleared; Undo restores them.\"\n : \"\",\n );\n }\n function addSummary(op: SummaryOp, field?: string) {\n if (!stage || (op === \"row\" && !stage.representative)) return;\n const existing = stage.summaries.find(\n (column) => column.op === op && column.field === field,\n );\n if (!existing && stage.summaries.length >= MAX_SUMMARY_COLUMNS) {\n setNotice(\n `A grouped view supports up to ${MAX_SUMMARY_COLUMNS} aggregate columns.`,\n );\n return;\n }\n const column = existing ?? {\n id: `summary_${crypto.randomUUID().replace(/-/g, \"\")}`,\n op,\n ...(field ? { field } : {}),\n };\n applyColumns(\n existing ? stage.summaries : [...stage.summaries, column],\n api.select.visible.some((c) => c.field === column.id)\n ? api.select.visible\n : [...api.select.visible, { field: column.id }],\n );\n }\n function changeSummary(id: string, op: SummaryOp) {\n if (!stage) return;\n applyColumns(\n stage.summaries.map((column) => {\n if (column.id !== id) return column;\n // A row value keeps the source field's rendering, not an aggregate format.\n const { display: _display, ...rest } = column;\n return op === \"row\" ? { ...rest, op } : { ...column, op };\n }),\n api.select.visible,\n );\n }\n function representativeImpact() {\n if (!stage) return \"\";\n const before = api.query;\n const after = model.reconcileRepresentative(\n before,\n stage.summaries,\n outputSchema,\n false,\n );\n return [\n before.where.length !== after.where.length ? \"row-value filters\" : \"\",\n before.orderBy.length !== after.orderBy.length ? \"row-value sorts\" : \"\",\n (before.aggregations?.length ?? 0) !== (after.aggregations?.length ?? 0)\n ? \"dependent metrics\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n }\n function changeRepresentative(representative: RepresentativeRow | null) {\n if (\n !stage ||\n JSON.stringify(stage.representative) === JSON.stringify(representative)\n )\n return;\n const summaries = representative\n ? stage.summaries\n : stage.summaries.filter((column) => column.op !== \"row\");\n model.validate({ ...stage, summaries, representative });\n const impact = representativeImpact();\n api.setQuery((q) =>\n q.grouping\n ? normalizeQueryState({\n ...model.reconcileRepresentative(\n q,\n stage.summaries,\n outputSchema,\n !representative,\n ),\n grouping: { ...q.grouping, summaries, representative },\n })\n : q,\n );\n setNotice(\n impact\n ? `Representative row changed. Cleared ${impact}; Undo restores them.`\n : \"\",\n );\n }\n return {\n ...execution,\n supported,\n model,\n api,\n source,\n grouped: api,\n schema: api.schema!,\n view,\n diagnostics: stage ? model.linkDiagnostics(stage) : [],\n inputs,\n notice,\n setNotice,\n changeKeys,\n addSummary,\n changeSummary,\n applyColumns,\n changeRepresentative,\n representativeImpact,\n };\n}\n","import { useQueryFilters } from \"./useQueryFilters\";\nimport { useGroupingController, type GroupingApi, type GroupingSourceApi } from \"./useGrouping\";\nimport { createGroupingModel, prepareGrouping, withoutGrouping, sourceExecutionSchema, toQueryRequestV3, validateQueryResultV3,\n fetchDistinctValuesV3, fetchFieldStatsV3, fetchRowV3, isPushdownFilter, type AuxiliaryRequestOptions } from \"@pythia-software/query-table-core\";\nimport { ITEM_DETAILS_COLUMN, itemPageFields, QueryError } from \"@pythia-software/query-table-core\";\nimport { useItemDetails, initialDetailModes, type ItemDetailsApi, type ItemDetailsOptions } from \"./useItemDetails\";\n// useQueryTable — the one hook that owns everything.\n//\n// The headless brain of the table: it holds the QueryState, keeps it in sync\n// with the URL (`?q=`) and the StorageAdapter, orchestrates fetches through the\n// Transport (debounced + abortable), and exposes intent-level mutators so a UI\n// never hand-edits QueryState. @pythia-software/query-table-ui is a thin layer over this; you\n// can also build an entirely custom table on it.\n\nimport {\n useComputedColumns,\n type ComputedColumnsApi,\n} from \"./useComputedColumns\";\nimport type { FormulaWorkerFactory } from \"./formulaWorker\";\nimport type {\n ComputedColumnStore,\n ComputedExecution,\n RowComputedValues,\n} from \"@pythia-software/query-table-core\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n EMPTY_QUERY,\n applyQuery,\n memoryStorageAdapter,\n normalizeQueryState,\n parseHostQueryState,\n readFieldValue,\n selectedFields,\n toServerQuery,\n queriesEqual,\n isWhereConjunction,\n isWhereGroup,\n predicatesOf,\n negateClause,\n opsForField,\n metricPlans,\n validateMetric,\n metricDependencies,\n isComputedField,\n computedFieldName,\n groupKeyField,\n groupKeyFields,\n} from \"@pythia-software/query-table-core\";\n\nconst AUTOCOMPLETE_LIMIT = 50;\nconst MAX_AUTO_REFRESH_POLLS = 1000;\nimport type {\n QueryState,\n HostQueryState,\n WhereClause,\n WhereBranch,\n WhereTerm,\n OrderByClause,\n AggOp,\n AggregationClause,\n AggregationResult,\n RowId,\n FieldDef,\n FieldSchema,\n Transport,\n StorageAdapter,\n DistinctValuesResult,\n FieldStats,\n} from \"@pythia-software/query-table-core\";\nimport {\n useRequestActivity,\n type RequestActivityApi,\n} from \"./useRequestActivity\";\nimport { useAggregations } from \"./useAggregations\";\nimport { executionRevision } from \"./computedExecution\";\nimport { executeV3Metrics as runV3Metrics } from \"./metricExecution\";\nimport { useSelection, type SelectionApi } from \"./useSelection\";\nimport { useSelect, type SelectApi } from \"./useSelect\";\nimport { useColumnDrag, type ColumnDragApi } from \"./useColumnDrag\";\nimport { useSavedQueries, type SavedQueriesApi } from \"./useSavedQueries\";\nimport { useQueryLinks, type QueryLinksApi } from \"./useQueryLinks\";\nimport { createQueryLinkService, type QueryLinkOptions } from \"@pythia-software/query-table-core\";\n\nexport interface UseQueryTableOptions<Row> {\n\n /** Pause execution and URL synchronization while a mounted host view is hidden. */\n active?: boolean;\n /** Capture evaluation time for grouped executions and remote query requests. */\n evaluationNow?: () => number;\n /** Normalize external aliases without storing presentation in query state. Must be pure and not throw. */\n canonicalizeQuery?: (query: QueryState) => QueryState;\n /** Reject an entire query before rows or metrics execute. Errors retain editable query state. */\n validateQuery?: (query: QueryState) => void;\n\n /** Disable row-producing grouping for this instance. Enabled for complete client datasets by default. */\n grouping?: boolean;\n schema: FieldSchema<Row>;\n /** Row data access. Omit to filter, sort, and page `clientRows` locally. */\n transport?: Transport<Row>;\n /** Metric-only data access; defaults to transport and never selects server row mode. */\n metricTransport?: Transport<Row>;\n /** Authoritative metric handshake; defaults to the existing row execution selection. */\n metricExecution?: ComputedExecution;\n /** Additional host readiness gate for committed-page metrics and previews.\n * Does not delay remote allMatching requests. Re-evaluated on each render. */\n metricRowsReady?: (query: QueryState) => boolean;\n /** Dataset already available in memory. Remote grouping/aggregation belongs\n * on the server; do not download a population to supply this option. */\n clientRows?: Row[];\n /** Saved/last-query persistence. Defaults to a non-durable in-memory adapter.\n * Pass localStorageAdapter() explicitly only when filter values are safe to\n * retain as cleartext JSON on the device. */\n storage?: StorageAdapter;\n /** When `storage.saveLast` records the last-used query: \"always\" (default)\n * 400 ms after every change, or \"succeeded\" once rows and every metric of\n * that exact query have loaded. A failure, timeout or cancellation keeps the\n * previous last-used query; explicit links, named saves and the default are\n * separate choices and are never touched by it. */\n persistLast?: \"always\" | \"succeeded\";\n /** Host-owned query state that travels with the table query as one\n * definition: saved, restored, shared, reset and undone together. The host\n * keeps rendering and running its own clauses from `api.definition`. */\n hostQuery?: HostQueryOptions;\n /** Shared reusable definitions, independent of saved-query storage. */\n computedColumnStore?: ComputedColumnStore;\n /** Authoritative host handshake for versioned server SELECT, sorts, and metrics. */\n computedExecution?: ComputedExecution;\n /** Override the worker factory when CSP disallows blob workers. */\n formulaWorkerFactory?: FormulaWorkerFactory;\n /** Seed query, normalized and resource-bounded before use. When omitted the\n * hook resolves: opted-in URL → storage.loadLast → schema defaults. */\n initialQuery?: QueryState;\n /** Mirror QueryState to `?q=` via history.replaceState. Default false because\n * base64url is encoding, not encryption: filters will appear in browser\n * history, referrers, logs, analytics, and screenshots when enabled. */\n syncUrl?: boolean;\n /** Collection URL parameter, independent of item views. Takes precedence\n * over the legacy itemDetails.queryParameter; otherwise defaults to q. */\n queryParameter?: string;\n /** URL budget and browser-local FIFO cache; remote snapshots come from storage.snapshots. */\n links?: QueryLinkOptions;\n /** Enable schema-driven click popovers, item modals and row expansion. */\n itemDetails?: boolean | ItemDetailsOptions<Row>;\n /** Ask the transport for field statistics (distinct count, min, max) when\n * the column picker or a metric filter editor opens. Each request reduces\n * the whole dataset, so it is off by default; complete clientRows always\n * provide them. */\n remoteFieldStats?: boolean;\n /** Debounce (ms) between a query change and the fetch it triggers. Default 200. */\n debounceMs?: number;\n /** Injected clock for deterministic saved-query timestamps. Default Date.now. */\n now?: () => number;\n /** Side-effect to run on every refresh — both manual `api.refresh()` and each\n * auto-refresh tick. Fires *in addition to* the internal `setNonce` re-query,\n * so manual and auto stay identical. Use it in client mode (no transport) to\n * bridge a UI refresh to your own server fetch without monkey-patching the\n * returned `api`. Always read through a ref, so supplying it never tears down\n * and recreates the auto-refresh interval. */\n onRefresh?: () => void;\n}\n\nexport interface AutoRefreshConfig {\n frequencyMs: number;\n turnOffAfterMs: number;\n}\n\nexport interface AutoRefreshStatus extends AutoRefreshConfig {\n startedAt: number;\n stopsAt: number;\n pollCount: number;\n}\n\nexport interface AutoRefreshApi {\n status: AutoRefreshStatus | null;\n start: (config: AutoRefreshConfig) => void;\n stop: () => void;\n}\n\n/** A patch for one metric. `field`/`label` accept an explicit `undefined` to\n * CLEAR them (e.g. switching to an op whose measure no longer applies); an\n * absent key leaves the existing value untouched. */\nexport type AggregationPatch = { op?: AggOp; groupBy?: string[] } & {\n [K in keyof Omit<AggregationClause, \"id\" | \"op\" | \"groupBy\">]?:\n AggregationClause[K] | undefined;\n};\n\nexport interface AggregationsApi {\n /** The metric specs currently in the query. */\n clauses: AggregationClause[];\n /** Server (or client-mirror) results, one entry per clause; null when none. */\n results: AggregationResult | null;\n loading: boolean;\n /** A QueryError (with a code from docs/errors.md) for server and client refusals. */\n error: QueryError | Error | null;\n /** Append a metric. Defaults to \"count all rows\"; pass a partial to override.\n * Returns the generated id. */\n add: (partial?: Partial<Omit<AggregationClause, \"id\">>) => string;\n /** Patch a metric by id. */\n update: (id: string, patch: AggregationPatch) => void;\n /** Reorder: move the metric `id` to `toIndex` (an index in the list with the\n * metric removed, so a drag preview's slot maps straight to the result). */\n move: (id: string, toIndex: number) => void;\n /** Remove a metric by id. */\n remove: (id: string) => void;\n /** Remove all metrics. */\n clear: () => void;\n /** Evaluate a draft without modifying the query. */\n preview?: (\n clauses: AggregationClause[],\n signal?: AbortSignal,\n ) => Promise<AggregationResult>;\n /** Commit the complete draft as one undoable change. */\n replace?: (\n clauses: AggregationClause[],\n expected?: AggregationClause[],\n ) => void;\n /** Validate a clause, including reusable computed dependencies. */\n compile?: (clause: AggregationClause) => unknown;\n /** Invalidation token for page, refresh, schema, and definition changes. */\n contextKey?: string;\n}\n\n/** Registers host-owned query state with `useQueryTable`. */\nexport interface HostQueryOptions {\n /** URL parameters that mirror `hostState.params` when `syncUrl` is on. URL\n * writes replace exactly these, keeping every other parameter. They may not\n * include the table's own query parameter. */\n ownedParameters: readonly string[];\n /** The state a query without host state takes, including every save made\n * before the host registered, and the state Reset restores. */\n defaults: HostQueryState;\n /** Validate, migrate and canonicalize; throw to reject. A rejected state\n * rejects the whole restore or edit, leaving the live definition as it was. */\n normalize?: (state: HostQueryState) => HostQueryState;\n}\n/** The committed table query and host state, as one unit. */\nexport interface QueryDefinition {\n query: QueryState;\n hostState: HostQueryState;\n}\n\n/** The outcome of executing one exact query; see `QueryTableApi.execution`. */\nexport interface QueryExecutionReceipt {\n /** The query whose rows and metrics this receipt describes. */\n query: QueryState;\n /** Execution identity: changes with every row- or metric-affecting edit and\n * refresh, but not with presentation such as widths. */\n key: string;\n /** Increases with every new execution identity of this table. */\n generation: number;\n /** \"succeeded\" only when rows and every metric loaded; an empty result,\n * including a page past the end, is a success. */\n status: \"running\" | \"succeeded\" | \"failed\";\n rows: \"running\" | \"succeeded\" | \"failed\";\n /** \"none\" when the query has no metrics. A metric error fails the receipt. */\n metrics: \"none\" | \"running\" | \"succeeded\" | \"failed\";\n /** The row or metric error behind a failure. */\n /** A QueryError (with a code from docs/errors.md) for server and client refusals. */\n error: QueryError | Error | null;\n}\nexport interface QueryTableApi<Row> {\n /** Dependent source fetches can use ready without parsing display errors. */\n restoration: { status: \"resolving\" | \"ready\" | \"error\"; ready: boolean; error: QueryError | Error | null };\n /** Execution of the current query, separate from restoration. Null while\n * restoring, after a restoration error and while the table is inactive, so\n * a cancelled or hidden table never publishes a stale receipt. */\n execution: QueryExecutionReceipt | null;\n /** With `hostQuery`: the committed definition (`query` without its\n * `hostState`, and the host state). */\n definition?: QueryDefinition;\n /** With `hostQuery`: commit a new definition as one history entry and one\n * execution. Throws, changing nothing, when `hostQuery.normalize` rejects. */\n setDefinition?: (next: QueryDefinition | ((previous: QueryDefinition) => QueryDefinition)) => void;\n /** Call after a host pushState/router update, with an absolute URL or a location\n * relative to window.location.href. Supersedes prior resolution;\n * abort or an intervening query edit prevents stale publication. */\n restoreLocation: (location: string | URL, signal?: AbortSignal) => Promise<void>;\n /** Row-producing GROUP BY controls and source stage, when supported. */\n grouping?: GroupingApi<Row>;\n /** Current result schema; changes when entering or leaving grouping. */\n schema?: FieldSchema<Row>;\n links: QueryLinksApi;\n /** Built-in item details, enabled by the instance creator. */\n itemDetails?: ItemDetailsApi<Row>;\n // state\n query: QueryState;\n /** Schema defaults used for reset controls. */\n defaults: QueryState;\n setQuery: (next: QueryState | ((prev: QueryState) => QueryState)) => void;\n /** Can move back to a previously applied local query state. */\n canUndo: boolean;\n /** Can move forward to a previously undone local query state. */\n canRedo: boolean;\n /** Move backward through local, unsaved query history. Empty history leaves\n * incoming link restoration and errors unchanged. */\n undo: () => void;\n /** Move forward through local, unsaved query history. Empty history leaves\n * incoming link restoration and errors unchanged. */\n redo: () => void;\n\n requestActivity: RequestActivityApi;\n\n // data\n rows: Row[];\n total: number | null;\n loading: boolean;\n /** A QueryError (with a code from docs/errors.md) for server and client refusals. */\n error: QueryError | Error | null;\n refresh: () => void;\n autoRefresh: AutoRefreshApi;\n /** Refresh one row in place through a v3 identity lookup. A grouped page or\n * one with computed columns or sorts refreshes as a whole instead, so computed\n * values and page membership remain coherent; track that through loading/error. */\n refreshRow: (id: RowId) => Promise<void>;\n\n // aggregation metrics (the dashboard panel above the table)\n aggregations: AggregationsApi;\n\n // filters — WHERE is CNF: `query.where` is an array of terms (a literal or an\n // OR group), ANDed together. The top-level intents address a whole term by\n // index; the predicate-level intents address one literal within a term.\n /** Append a predicate as its own AND term. */\n addFilter: (clause: WhereClause) => void;\n /** Replace the whole term at `index` with a single predicate. */\n updateFilter: (index: number, clause: WhereClause) => void;\n /** Remove the whole term at `index`. */\n removeFilter: (index: number) => void;\n clearFilters: () => void;\n /** Replace one predicate inside a term (predIndex 0 for a literal term). In\n * an OR of conjunctions, predIndex counts literals in `predicatesOf` order. */\n updatePredicate: (\n termIndex: number,\n predIndex: number,\n clause: WhereClause,\n ) => void;\n /** Remove one predicate; a group of one flattens to a literal, an emptied term drops. */\n removePredicate: (termIndex: number, predIndex: number) => void;\n /** Logically invert one predicate (flips the op, else toggles its NOT flag). */\n negatePredicate: (termIndex: number, predIndex: number) => void;\n /** Move the term at `fromIndex` to `toIndex` (an index in the list with the\n * dragged term removed, so a drag preview's slot maps straight to the result). */\n reorderFilters: (fromIndex: number, toIndex: number) => void;\n /** OR-merge the term at `sourceIndex` into the term at `targetIndex`: the\n * target becomes (or stays) an OR group holding both terms' branches (a\n * conjunction stays one AND branch), and the source term is removed. This is the drag-onto-another-filter gesture. */\n mergeFilters: (sourceIndex: number, targetIndex: number) => void;\n /** Reset the complete query state back to schema defaults. */\n resetAll: () => void;\n /** Keystroke-driven filter-value autocomplete (a v3 `distinct` request, or\n * the complete clientRows). Aborting the signal cancels the request. */\n filterValues: (\n field: string,\n search: string,\n signal?: AbortSignal,\n ) => Promise<DistinctValuesResult>;\n /** Dataset-wide field statistics for catalogue and picker affordances. */\n fieldStats: (\n fields: string[],\n signal?: AbortSignal,\n ) => Promise<Record<string, FieldStats>>;\n\n // sorting (multi-sort): click header sets/cycles primary; shift-click appends.\n toggleSort: (field: string, additive?: boolean) => void;\n setSort: (orderBy: OrderByClause[]) => void;\n\n // select + pagination + selection + saved\n select: SelectApi<Row>;\n computed: ComputedColumnsApi<Row>;\n setLimit: (limit: number) => void;\n setOffset: (offset: number) => void;\n nextPage: () => void;\n prevPage: () => void;\n selection: SelectionApi;\n saved: SavedQueriesApi;\n /** Shared, transient column-reorder drag state (table headers + select chips). */\n columnDrag: ColumnDragApi;\n\n // resolved view\n visibleFields: FieldDef<Row>[];\n rowId: (row: Row) => RowId | null;\n}\n\nfunction detailColumnSchema<Row>(schema: FieldSchema<Row>, enabled: boolean): FieldSchema<Row> {\n if (!enabled) return schema;\n return { ...schema,\n defaultSelect: [...(schema.defaultSelect ?? selectedFields(schema, { select: [] }).map(field => ({ field: field.name }))), { field: ITEM_DETAILS_COLUMN }],\n fields: [...schema.fields, { name: ITEM_DETAILS_COLUMN, label: \"Detail\", type: \"text\",\n source: { kind: \"derived\", accessor: () => null }, select: { default: true, width: 112 },\n filter: { enabled: false }, sort: { enabled: false }, aggregate: { measure: false, groupable: false },\n property: { enabled: false },\n }],\n };\n}\nfunction defaultsFor<Row>(schema: FieldSchema<Row>, details = false): QueryState {\n schema = detailColumnSchema(schema, details);\n return normalizeQueryState({\n select: schema.defaultSelect ?? [],\n where: [],\n orderBy: schema.defaultSort ?? [],\n limit: schema.defaultLimit ?? EMPTY_QUERY.limit,\n offset: 0,\n });\n}\n\nfunction cloneWhereTerm(term: WhereTerm): WhereTerm {\n const copy: WhereTerm = isWhereGroup(term)\n ? { ...term, any: term.any.map((c: WhereBranch) => (isWhereConjunction(c) ? { all: c.all.map((m) => ({ ...m })) } : { ...c })) }\n : { ...term };\n if (term.setFilter)\n copy.setFilter = { ...term.setFilter, values: [...term.setFilter.values] };\n return copy;\n}\n\nfunction cloneQueryState(q: QueryState): QueryState {\n const clone: QueryState = {\n select: q.select.map((column) => ({ ...column })),\n where: q.where.map(cloneWhereTerm),\n orderBy: q.orderBy.map((term) =>\n term.extract ? { ...term, extract: { ...term.extract } } : { ...term },\n ),\n limit: q.limit,\n offset: q.offset,\n };\n if (q.fit) clone.fit = q.fit;\n if (q.hostState) clone.hostState = { version: q.hostState.version, params: Object.fromEntries(Object.entries(q.hostState.params).map(([name, values]) => [name, [...values]])) };\n if (q.aggregations)\n clone.aggregations = JSON.parse(\n JSON.stringify(q.aggregations),\n ) as AggregationClause[];\n if (q.grouping) clone.grouping = normalizeQueryState(q).grouping!;\n if (q.itemDetails) clone.itemDetails = JSON.parse(JSON.stringify(q.itemDetails)) as NonNullable<QueryState[\"itemDetails\"]>;\n return clone;\n}\n\n/** Apply a patch to a metric, building a fresh clause so optional `field`/`label`\n * can be dropped (passing them as `undefined` clears; omitting the key keeps the\n * current value) without ever materializing an `undefined`-valued property. */\nfunction mergeAggregation(\n a: AggregationClause,\n patch: AggregationPatch,\n): AggregationClause {\n const next = { ...a, ...patch } as AggregationClause;\n for (const key of Object.keys(next) as Array<keyof AggregationClause>) {\n if (next[key] === undefined) delete next[key];\n }\n return next;\n}\n\nfunction isNullLike(value: unknown): boolean {\n return value == null || (Array.isArray(value) && value.length === 0);\n}\n\nfunction asDistinctValue(value: unknown): string | null {\n if (isNullLike(value)) return null;\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n return null;\n}\n\nfunction fieldHasNullInRows<Row>(field: FieldDef<Row>, rows: Row[]): boolean {\n for (const row of rows) {\n if (isNullLike(readFieldValue(field, row))) return true;\n }\n return false;\n}\n\nfunction distinctValuesFromRows<Row>(\n field: FieldDef<Row>,\n rows: Row[],\n search: string,\n): { values: string[]; hasMore: boolean } {\n const target = search.trim().toLowerCase();\n const values: string[] = [];\n const seen = new Set<string>();\n let hasMore = false;\n\n rowsLoop: for (const row of rows) {\n const value = readFieldValue(field, row);\n const candidates =\n field.type === \"textarray\" && Array.isArray(value) ? value : [value];\n for (const candidate of candidates) {\n const raw = asDistinctValue(candidate);\n if (raw == null || seen.has(raw)) continue;\n if (target && !raw.toLowerCase().includes(target)) continue;\n\n if (values.length < AUTOCOMPLETE_LIMIT) {\n seen.add(raw);\n values.push(raw);\n continue;\n }\n\n hasMore = true;\n break rowsLoop;\n }\n }\n\n return { values: values.sort((a, b) => a.localeCompare(b)), hasMore };\n}\n\nfunction hasQueryLink(url: string, parameter: string): boolean {\n const values = new URL(url).searchParams.getAll(parameter);\n return values.length > 1 || (values.length === 1 && values[0] !== \"\");\n}\n\nfunction queryParameter<Row>(opts: UseQueryTableOptions<Row>): string {\n return opts.queryParameter ?? (typeof opts.itemDetails === \"object\" ? opts.itemDetails.queryParameter : undefined) ?? \"q\";\n}\n\n/** The query with the host state it runs with: the host defaults when it has\n * none, otherwise the host's normalized form. Throws when the state cannot\n * be accepted, including host state on a table that registers none. */\nfunction withHostState(query: QueryState, host: HostQueryOptions | undefined): QueryState {\n if (!host) {\n if (query.hostState) throw Error(\"This query includes host state that this table does not support.\");\n return query;\n }\n const raw = query.hostState ?? host.defaults;\n if (raw.version === 0) throw Error(\"This query's host state could not be read.\");\n const state = parseHostQueryState(host.normalize ? host.normalize(parseHostQueryState(raw)) : raw);\n return { ...query, hostState: state };\n}\nfunction withoutHostState(query: QueryState): QueryState {\n const { hostState: _hostState, ...rest } = query;\n return rest;\n}\n/** Host state mirrored into a URL's owned parameters, or undefined when it has none. */\nfunction hostStateFromUrl(location: string, host: HostQueryOptions): HostQueryState | undefined {\n const url = new URL(location);\n const params: Record<string, string[]> = {};\n for (const name of host.ownedParameters) {\n const values = url.searchParams.getAll(name);\n if (values.length) params[name] = values;\n }\n return Object.keys(params).length ? { version: host.defaults.version, params } : undefined;\n}\n/** Replace exactly the owned parameters of `url` with `state`. */\nfunction writeHostParameters(url: string, host: HostQueryOptions, state: HostQueryState | undefined): string {\n const next = new URL(url);\n for (const name of host.ownedParameters) next.searchParams.delete(name);\n for (const name of host.ownedParameters)\n for (const value of state?.params[name] ?? []) next.searchParams.append(name, value);\n return next.toString();\n}\n/** Requests carry the host state of the query they execute. The wrapper is\n * rebuilt with every host state, alongside the query, so a request never\n * pairs one definition's table query with another's host state. */\nfunction withHostTransport<T extends object>(transport: T | undefined, hostStateKey: string): T | undefined {\n if (!transport || !hostStateKey) return transport;\n const hostState = JSON.parse(hostStateKey) as HostQueryState;\n const wrappers = new Map<PropertyKey, unknown>();\n return new Proxy(Object.create(transport) as T, {\n get(_target, key) {\n const method = Reflect.get(transport, key, transport) as unknown;\n if (key !== \"fetchQueryV3\" || typeof method !== \"function\") return method;\n if (!wrappers.has(key))\n wrappers.set(key, (request: object, signal?: AbortSignal) =>\n (method as (request: object, signal?: AbortSignal) => unknown).call(transport, { ...request, hostState }, signal));\n return wrappers.get(key);\n },\n });\n}\n\nfunction resolveInitial<Row>(opts: UseQueryTableOptions<Row>): {\n q: QueryState;\n fromUrl: boolean;\n} {\n const defaults = withHostState(defaultsFor(opts.schema, Boolean(opts.itemDetails)), opts.hostQuery);\n if (opts.initialQuery)\n return {\n q: withHostState(normalizeQueryState(opts.initialQuery, defaults), opts.hostQuery),\n fromUrl: false,\n };\n if (opts.syncUrl === true && opts.active !== false && typeof window !== \"undefined\") {\n const parameter = queryParameter(opts);\n if (hasQueryLink(window.location.href, parameter) || (opts.hostQuery && hostStateFromUrl(window.location.href, opts.hostQuery)))\n return {\n q: defaults,\n fromUrl: true,\n };\n }\n return { q: defaults, fromUrl: false };\n}\n\nexport function useQueryTable<Row>(\n opts: UseQueryTableOptions<Row>,\n): QueryTableApi<Row> {\n const {\n schema: sourceSchema,\n transport: sourceTransport,\n clientRows: providedRows,\n initialQuery,\n debounceMs = 200,\n } = opts;\n const active = opts.active !== false;\n const urlSyncEnabled = opts.syncUrl === true;\n const syncUrl = urlSyncEnabled && active;\n const { transport: activityTransport, metricTransport: activityMetricTransport, activity: requestActivity } =\n useRequestActivity(sourceTransport, opts.metricTransport);\n const host = opts.hostQuery;\n const hostRef = useRef(host);\n hostRef.current = host;\n const hostDefaultsKey = host ? JSON.stringify(host.defaults) : \"\";\n if (host?.ownedParameters.includes(queryParameter(opts)))\n throw Error(`hostQuery.ownedParameters cannot include the table's own \"${queryParameter(opts)}\" parameter.`);\n const storage = useMemo(\n () => opts.storage ?? memoryStorageAdapter(),\n [opts.storage],\n );\n const parameter = queryParameter(opts);\n const linkService = useMemo(() => createQueryLinkService(sourceSchema.name, storage.snapshots, opts.links),\n [sourceSchema.name, storage.snapshots, opts.links?.cache, opts.links?.maxUrlBytes]);\n const now = opts.now ?? Date.now;\n const nowRef = useRef(now);\n const onRefreshRef = useRef(opts.onRefresh);\n const defaults = useMemo(() => withHostState(defaultsFor(sourceSchema, Boolean(opts.itemDetails)), hostRef.current),\n [sourceSchema, Boolean(opts.itemDetails), hostDefaultsKey]);\n\n const initRef = useRef(resolveInitial(opts));\n const [restoration, setRestoration] = useState<{ loading: boolean; error: Error | null }>({ loading: initRef.current.fromUrl, error: null });\n const [storageReady, setStorageReady] = useState(Boolean(initialQuery));\n const restorationCurrent = useRef({ storageReady, restoration, active });\n restorationCurrent.current = { storageReady, restoration, active };\n const manualQueryEpoch = useRef(0);\n const restoreController = useRef<AbortController | null>(null);\n const restoreHandler = useRef<((location: string, signal?: AbortSignal) => Promise<void>) | null>(null);\n const initialRestore = useRef<(() => Promise<void>) | null>(null);\n const initialRestorationStarted = useRef(false);\n const restoreLocation = useCallback((location: string | URL, signal?: AbortSignal) => {\n if (!restoreHandler.current) return Promise.reject(Error(\"Query controller is not mounted.\"));\n return restoreHandler.current(String(location), signal);\n }, []);\n const aggIdRef = useRef(0);\n // A null baseline follows current host defaults. Explicit views keep their\n // snapshot, scoped to the source so reset cannot restore another table.\n const savedBaseline = useRef<{ source: string; query: QueryState } | null>(\n initRef.current.q.grouping\n ? { source: sourceSchema.name, query: cloneQueryState(initRef.current.q) }\n : null,\n );\n const viewRevision = useRef(0);\n const [queryHistory, setQueryHistory] = useState<{ query: QueryState; past: QueryState[]; future: QueryState[] }>(\n () => ({ query: initRef.current.q, past: [], future: [] }),\n );\n // Keep history current even when React batches several edits or\n // undo/redo calls. History updates stay pure and cancellation stays outside\n // React state updaters, which may run more than once.\n const queryHistoryRef = useRef(queryHistory);\n const updateQueryHistory = useCallback((update: (history: typeof queryHistory) => typeof queryHistory) => {\n const previous = queryHistoryRef.current;\n const next = update(previous);\n if (next === previous) return;\n queryHistoryRef.current = next;\n setQueryHistory(next);\n }, []);\n const storedQuery = queryHistory.query;\n const [nonce, setNonce] = useState(0);\n const query = useMemo(\n () => opts.canonicalizeQuery?.(storedQuery) ?? storedQuery,\n [storedQuery, opts.canonicalizeQuery],\n );\n const hostStateKey = host && query.hostState ? JSON.stringify(query.hostState) : \"\";\n const metadataTransport = useMemo(() => withHostTransport(activityTransport, hostStateKey), [activityTransport, hostStateKey]);\n const metricTransport = useMemo(() => withHostTransport(activityMetricTransport, hostStateKey), [activityMetricTransport, hostStateKey]);\n const transport = metadataTransport;\n const sourceCatalogue = useMemo(() => sourceExecutionSchema(sourceSchema, opts.computedExecution), [sourceSchema, opts.computedExecution]);\n const sourceRows = providedRows;\n const groupingModel = useMemo(() => createGroupingModel(sourceCatalogue), [sourceCatalogue]);\n const remoteGrouping = !!transport && transport.queryCapabilities.version === 3 && transport.queryCapabilities.groupedRows;\n const groupingSupported = ((!transport && sourceRows !== undefined) || remoteGrouping) && opts.grouping !== false;\n const groupKey = JSON.stringify(query.grouping ?? null);\n // Capture the grouped evaluation clock with its population. Debounced rows,\n // metric previews and committed metrics must use the same relative bounds.\n // Ordinary V3 requests capture their clock when each execution begins.\n const groupingNow = useMemo(() => query.grouping ? (opts.evaluationNow ?? Date.now)() : undefined,\n [sourceRows, sourceSchema, groupingSupported, groupKey, nonce, opts.evaluationNow]);\n const prepared = useMemo(() => {\n if (!query.grouping) return null;\n try {\n if (!groupingSupported) throw new Error(\"Grouped queries require a server with grouped-query support or a dataset already in memory.\");\n if (remoteGrouping) { groupingModel.validate(query.grouping); return { inputs: [] as Row[], rows: [], error: null }; }\n return { ...prepareGrouping(sourceRows!, sourceCatalogue, query.grouping, { now: groupingNow! }), error: null };\n } catch (error) {\n return { inputs: [] as Row[], rows: [], error: error as Error };\n }\n }, [sourceRows, sourceCatalogue, groupingModel, groupingSupported, groupKey, nonce, groupingNow, remoteGrouping]);\n // Result fields depend on the projection, not the current population. Keep\n // their identity across refresh/WHERE changes so committed rows stay visible\n // during debounce, while real shape changes still invalidate them below.\n const projectionKey = JSON.stringify(query.grouping\n ? [query.grouping.keys, query.grouping.summaries] : null);\n const schema = useMemo(() => (query.grouping\n ? groupingModel.resultSchema(query.grouping.keys, query.grouping.summaries)\n : sourceSchema) as FieldSchema<Row>, [sourceSchema, groupingModel, projectionKey]);\n const clientRows = (prepared?.rows ?? sourceRows) as Row[] | undefined;\n const executionQuery = useMemo(() => withoutGrouping(query), [query]);\n const byName = useMemo(() => new Map(schema.fields.map(field => [field.name, field])), [schema]);\n const detailsEnabled = Boolean(opts.itemDetails) && !query.grouping;\n const groupDetailsEnabled = Boolean(opts.itemDetails) && Boolean(query.grouping);\n // Normalization clones grouping even for presentation edits. Only a change\n // in its content should invalidate row and metric execution.\n const validateExecution = useCallback((q: QueryState) => {\n if (prepared?.error) throw prepared.error;\n // Previews carry draft metrics in q. Reattach the source stage without\n // replacing those drafts with the currently committed dashboard.\n opts.validateQuery?.(query.grouping ? { ...q, grouping: query.grouping } : q);\n }, [prepared?.error, opts.validateQuery, groupKey]);\n const [committedRows, setRows] = useState<Row[]>([]);\n const [serverComputed, setServerComputed] = useState<\n Map<RowId, RowComputedValues>\n >(new Map());\n const [committedFields, setCommittedFields] = useState<string[]>([]);\n const [serverExecution, setServerExecution] = useState<\n ComputedExecution | undefined\n >();\n const [total, setTotal] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [committedPage, setCommittedPage] = useState<string | null>(null);\n // The page context whose execution set `error`; errors of superseded runs do not describe the current query.\n const [failedPage, setFailedPage] = useState<string | null>(null);\n const [committedSource, setCommittedSource] = useState<{\n schema: FieldSchema<Row>;\n transport: Transport<Row> | undefined;\n clientRows: Row[] | undefined;\n } | null>(null);\n // A schema transition changes row shape and identity. Never render records\n // from the previous result shape while the next page is being prepared.\n const rows = useMemo(() => committedSource?.schema === schema ? committedRows : [], [committedSource?.schema, schema, committedRows]);\n const [autoRefreshStatus, setAutoRefreshStatus] =\n useState<AutoRefreshStatus | null>(null);\n\n useEffect(() => {\n nowRef.current = now;\n }, [now]);\n\n useEffect(() => {\n onRefreshRef.current = opts.onRefresh;\n }, [opts.onRefresh]);\n\n const setQuery = useCallback<QueryTableApi<Row>[\"setQuery\"]>(\n (next) => {\n manualQueryEpoch.current++;\n initialRestorationStarted.current = true;\n restoreController.current?.abort();\n setStorageReady(true);\n setRestoration(previous => !previous.loading && !previous.error ? previous : { loading: false, error: null });\n updateQueryHistory((history) => {\n const prev = history.query;\n const candidate =\n typeof next === \"function\"\n ? (next as (p: QueryState) => QueryState)(prev)\n : next;\n // An edit that does not mention host state keeps the current one.\n const normalized = normalizeQueryState(candidate, defaults);\n const nextQuery = withHostState(normalized.hostState || !prev.hostState ? normalized : { ...normalized, hostState: prev.hostState }, hostRef.current);\n if (queriesEqual(prev, nextQuery)) return history;\n return { query: cloneQueryState(nextQuery), past: [...history.past, cloneQueryState(prev)], future: [] };\n });\n },\n [defaults, updateQueryHistory],\n );\n\n const sourceQuery = query.grouping?.source ?? query;\n const setSourceQuery = useCallback<QueryTableApi<Row>[\"setQuery\"]>((next) => {\n setQuery(current => {\n const previous = current.grouping?.source ?? current;\n const source = withoutGrouping(typeof next === \"function\" ? next(previous) : next);\n return current.grouping ? { ...current, offset: 0, grouping: { ...current.grouping, source } } : source;\n });\n }, [setQuery]);\n const sourceFilters = useQueryFilters(sourceCatalogue, setSourceQuery);\n\n // Track only this table's URL parameter and the host's owned parameters,\n // including duplicates. Host routes, anchors and unrelated history.state\n // changes do not restore table state.\n const observedQueryUrl = useRef<string | null>(null);\n const tableUrlKey = (url: string) => {\n const params = new URL(url).searchParams;\n return JSON.stringify([params.getAll(parameter), ...(hostRef.current?.ownedParameters ?? []).map(name => params.getAll(name))]);\n };\n const recordQueryUrl = useCallback((url: string) => {\n observedQueryUrl.current = tableUrlKey(url);\n }, [parameter]);\n const ownedParametersKey = JSON.stringify(host?.ownedParameters ?? null);\n const decorateLink = useCallback((url: string, q: QueryState) =>\n hostRef.current ? writeHostParameters(url, hostRef.current, q.hostState) : url, [ownedParametersKey]);\n const links = useQueryLinks(query, linkService, syncUrl, storageReady && !restoration.loading && !restoration.error,\n parameter, opts.links?.maxUrlBytes ?? 2000, recordQueryUrl, decorateLink);\n const restoreSources = useRef({ storage, linkService, defaults, initialQuery });\n restoreSources.current = { storage, linkService, defaults, initialQuery };\n\n // Resolve URL references before rows, metrics, persistence, or address-bar writes.\n useEffect(() => {\n let cancelled = false;\n let controller = new AbortController();\n let generation = 0;\n initialRestorationStarted.current = Boolean(restoreSources.current.initialQuery);\n async function restore(navigation = false, location = typeof window !== \"undefined\" ? window.location.href : \"\", signal?: AbortSignal) {\n initialRestorationStarted.current = true;\n const { storage, linkService, defaults } = restoreSources.current;\n const run = ++generation;\n const epoch = manualQueryEpoch.current;\n controller.abort(); controller = new AbortController();\n restoreController.current = controller;\n const currentController = controller;\n const abort = () => currentController.abort();\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) currentController.abort();\n setStorageReady(false);\n // The host's own URL parameters are part of the link, with or without\n // the table's query parameter.\n const host = hostRef.current;\n const hostFromUrl = host && location && (navigation || urlSyncEnabled) ? hostStateFromUrl(location, host) : undefined;\n const explicitLink = !!location && (navigation || urlSyncEnabled) && (hasQueryLink(location, parameter) || !!hostFromUrl);\n setRestoration({ loading: true, error: null });\n try {\n if (currentController.signal.aborted) throw new DOMException(\"Query restoration cancelled.\", \"AbortError\");\n const fromUrl = location && (navigation || urlSyncEnabled) ? await linkService.resolve(location, parameter, currentController.signal) : null;\n // Host parameters alone open the default table query with that host state.\n const linked = fromUrl ?? (hostFromUrl ? defaults : null);\n const defaultSaved = linked ? null : await storage.loadDefaultSaved?.(sourceSchema.name);\n let restored = linked ?? defaultSaved?.query ?? (navigation ? defaults : await storage.loadLast(sourceSchema.name));\n if (currentController.signal.aborted) throw new DOMException(\"Query restoration cancelled.\", \"AbortError\");\n // A link without host state reads the host's own URL parameters.\n if (linked && !fromUrl?.hostState && hostFromUrl) restored = { ...linked, hostState: hostFromUrl };\n if (!cancelled && run === generation && epoch === manualQueryEpoch.current) {\n if (restored) {\n // Host state is resolved before anything commits; a rejected one\n // fails the whole restore and leaves the live definition alone.\n const normalized = withHostState(normalizeQueryState(restored, defaults), host);\n savedBaseline.current = defaultSaved || fromUrl?.grouping\n ? { source: sourceSchema.name, query: cloneQueryState(normalized) }\n : null;\n viewRevision.current++;\n updateQueryHistory(() => ({ query: normalized, past: [], future: [] }));\n }\n setStorageReady(true);\n setRestoration(previous => !previous.loading && !previous.error ? previous : { loading: false, error: null });\n }\n } catch (e) {\n if (!cancelled && run === generation && epoch === manualQueryEpoch.current) {\n if (explicitLink || navigation && currentController.signal.aborted) {\n setRestoration({ loading: false, error: e instanceof Error ? e : Error(String(e)) });\n } else {\n // Last/default saved queries are optional restoration sources.\n // A failed host read should still leave a usable default table.\n updateQueryHistory(() => ({ query: defaults, past: [], future: [] }));\n setRestoration({ loading: false, error: null });\n }\n setStorageReady(true);\n }\n if (navigation && !cancelled && run === generation && epoch === manualQueryEpoch.current) throw e;\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n }\n }\n restoreHandler.current = async (location, signal) => {\n location = new URL(location, typeof window !== \"undefined\" ? window.location.href : undefined).href;\n const key = tableUrlKey(location);\n const current = restorationCurrent.current;\n if (key === observedQueryUrl.current && current.storageReady && !current.restoration.loading && !current.restoration.error) return;\n recordQueryUrl(location);\n await restore(true, location, signal);\n };\n initialRestore.current = () => restore();\n if (typeof window !== \"undefined\") recordQueryUrl(window.location.href);\n const navigate = () => {\n if (!restorationCurrent.current.active) return;\n const key = tableUrlKey(window.location.href);\n if (key === observedQueryUrl.current) return;\n observedQueryUrl.current = key;\n void restore(true).catch(() => { /* Restoration state owns the display error. */ });\n };\n if (urlSyncEnabled && typeof window !== \"undefined\") window.addEventListener(\"popstate\", navigate);\n return () => {\n cancelled = true; controller.abort();\n restoreHandler.current = null;\n initialRestore.current = null;\n if (urlSyncEnabled && typeof window !== \"undefined\") window.removeEventListener(\"popstate\", navigate);\n };\n }, [sourceSchema.name, urlSyncEnabled, parameter, recordQueryUrl, updateQueryHistory]);\n // Activation pauses a mounted controller; it only initiates restoration if\n // this dataset has never started, preserving edits and history on tab switches.\n useEffect(() => {\n if (active && !initialRestorationStarted.current) void initialRestore.current?.();\n }, [active, sourceSchema.name, urlSyncEnabled, parameter, recordQueryUrl]);\n\n const { api: computed, displaySchema } = useComputedColumns({\n schema,\n query: executionQuery,\n sourceSchema,\n previewQuery: query,\n ...(groupingNow !== undefined ? { now: groupingNow } : {}),\n rows,\n serverComputed,\n ...(serverExecution ? { serverExecution } : {}),\n ...(opts.computedExecution ? { execution: opts.computedExecution } : {}),\n ...(metricTransport ? { metricTransport } : {}),\n ...(opts.metricExecution ? { metricExecution: opts.metricExecution } : {}),\n ...(opts.computedColumnStore ? { store: opts.computedColumnStore } : {}),\n ...(opts.formulaWorkerFactory\n ? { workerFactory: opts.formulaWorkerFactory }\n : {}),\n ...(transport ? { transport } : {}),\n ...(clientRows ? { clientRows } : {}),\n });\n\n const resolveComputed = useCallback(\n (name: string) =>\n isComputedField(name)\n ? computed.compile(`[${name.replace(/]/g, \"]] \".trim())}]`)\n : undefined,\n [computed.compile],\n );\n const metricCompileSchema = useMemo(() => opts.metricExecution\n ? sourceExecutionSchema(displaySchema, opts.metricExecution, computed.definitions)\n : displaySchema, [displaySchema, opts.metricExecution, computed.definitions]);\n const metricCompile = useCallback(\n (clause: AggregationClause) => {\n const diagnostics = validateMetric(\n clause,\n metricCompileSchema,\n resolveComputed,\n );\n if (diagnostics.length)\n throw new QueryError(\"invalid_metric\", diagnostics.map((d) => d.message).join(\" \"), { metricId: clause.id });\n return metricPlans(clause, metricCompileSchema, resolveComputed);\n },\n [metricCompileSchema, resolveComputed],\n );\n const computedRevisions = useMemo(\n () =>\n Object.fromEntries(computed.definitions.map((d) => [d.id, d.revision])),\n [computed.definitions],\n );\n const definitionKey = JSON.stringify(computedRevisions);\n\n // Fetch (debounced + abortable). Transport mode, or client-side applyQuery.\n const queryKey = useMemo(() => JSON.stringify(query), [query]);\n const serverRowQuery = useMemo(() => {\n const detailConfig = typeof opts.itemDetails === \"object\" ? opts.itemDetails : undefined;\n const page = query.itemDetails?.page ?? detailConfig?.page;\n const pageEnabled = Boolean(opts.itemDetails) && (query.itemDetails?.modes ?? initialDetailModes(detailConfig)).includes(\"page\")\n && (!detailConfig?.modes || detailConfig.modes.includes(\"page\"));\n const pageFields = pageEnabled ? itemPageFields(page?.urlTemplate ?? \"\") : [];\n // Page templates can use fields outside the visible projection. Ask the\n // transport for those dependencies through its usual SELECT planning.\n const requestQuery = pageFields.length ? { ...executionQuery, select: [...(query.select.length ? query.select : defaults.select),\n ...pageFields.filter(name => displaySchema.fields.some(field => field.name === name)).map(field => ({ field }))] } : executionQuery;\n const request = toServerQuery(requestQuery, displaySchema);\n // A shown-row metric may refer to columns outside the visible projection.\n for (const clause of query.aggregations ?? [])\n if (clause.scope === \"shownRows\") {\n try {\n for (const name of metricDependencies(\n clause,\n schema,\n resolveComputed,\n )) {\n const field = schema.fields.find((f) => f.name === name);\n if (field?.source.kind === \"backend\") request.select.push(name);\n else\n for (const dep of field?.source.kind === \"derived\"\n ? (field.source.dependencies ?? [])\n : [])\n request.select.push(dep);\n }\n } catch {\n /* Invalid metric stays editable and fails metric validation. */\n }\n }\n request.select = [...new Set(request.select)].sort();\n return request;\n }, [\n queryKey,\n displaySchema,\n schema,\n resolveComputed,\n opts.itemDetails,\n defaults,\n ]);\n // Revisions of definitions the server also executes: a local edit to one\n // invalidates its server values.\n const serverDefinitionKey = JSON.stringify(computed.definitions.flatMap(definition =>\n executionRevision(opts.computedExecution, definition.id) !== undefined ? [[definition.id, definition.revision]] : []));\n // Keep presentation-only query changes out of the expensive row pipeline.\n // Widths do not leave the client at all, and SELECT does not affect client-side\n // filtering/sorting/paging. The full queryKey still drives URL + persistence.\n const rowQueryKey = useMemo(\n () =>\n transport\n ? `server:${JSON.stringify(serverRowQuery)}:${serverDefinitionKey}:${JSON.stringify([groupKey, groupingNow,\n query.select.map(column => column.field), query.where, query.orderBy, query.limit, query.offset])}`\n : `client:${JSON.stringify([query.where, query.orderBy, query.limit, query.offset])}`,\n [\n transport,\n serverRowQuery,\n serverDefinitionKey,\n groupKey,\n groupingNow,\n query.select,\n query.where,\n query.orderBy,\n query.limit,\n query.offset,\n ],\n );\n const executionKey = JSON.stringify(opts.computedExecution ?? null);\n // Host state is part of what a page shows: a result or failure under one\n // host state never stands for another.\n const pageContext = `${schema.name}:${rowQueryKey}:${nonce}:${executionKey}:${hostStateKey}`;\n useEffect(() => {\n if (!active || !storageReady || restoration.loading || restoration.error) {\n setRows(previous => previous.length ? [] : previous); setTotal(null); setCommittedPage(null); setLoading(false);\n return;\n }\n const ac = new AbortController();\n let cancelled = false;\n const run = async () => {\n setLoading(true);\n setError(null);\n setFailedPage(null);\n try {\n validateExecution(query);\n if (transport) {\n const request = toQueryRequestV3({ ...query, aggregations: [], select: [...query.select.filter(column => isComputedField(column.field)),\n ...serverRowQuery.select.map(field => ({ field }))] }, sourceSchema,\n transport.queryCapabilities, opts.computedExecution, { now: groupingNow ?? (opts.evaluationNow ?? Date.now)() });\n // The server executes its own revision; never show values of a definition changed since the handshake.\n const executed = new Set([...request.result.select, ...request.result.orderBy.map(term => term.field),\n ...[...request.source.where, ...request.result.where].flatMap(term => predicatesOf(term).map(predicate => predicate.field))]);\n for (const definition of computed.definitions) {\n const revision = executionRevision(opts.computedExecution, definition.id);\n if (executed.has(computedFieldName(definition.id)) && revision !== undefined && revision !== definition.revision)\n throw Error(\"Computed definitions changed. Refresh the server execution handshake.\");\n }\n const result = await transport.fetchQueryV3(request, ac.signal);\n validateQueryResultV3(result, request, query.grouping ? schema : sourceCatalogue);\n if (!cancelled) {\n setCommittedFields(request.result.select); setServerExecution(result.execution);\n setServerComputed(new Map(result.rows.map(row => [row[schema.idField] as RowId,\n Object.fromEntries(Object.entries(row).filter(([name]) => isComputedField(name)).map(([name, value]) =>\n [name.slice(10), value && typeof value === \"object\" && \"computedError\" in value\n ? { value: null, error: { code: String(value.computedError) } } : { value: value as import(\"@pythia-software/query-table-core\").MetricValue }]))])));\n setRows(result.rows as Row[]); setTotal(result.total); setCommittedPage(pageContext);\n setCommittedSource({ schema, transport, clientRows });\n }\n } else {\n const res = applyQuery(clientRows ?? [], executionQuery, schema,\n groupingNow !== undefined ? { now: groupingNow } : {});\n if (!cancelled) {\n setRows(res.rows);\n setTotal(res.total);\n setCommittedPage(pageContext);\n setCommittedSource({ schema, transport, clientRows });\n }\n }\n } catch (e) {\n if (!cancelled && !ac.signal.aborted) {\n setError(e as Error);\n setFailedPage(pageContext);\n setRows([]);\n setTotal(null);\n setCommittedPage(null);\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n const t = setTimeout(run, debounceMs);\n return () => {\n cancelled = true;\n clearTimeout(t);\n ac.abort();\n };\n // rowQueryKey captures only row-affecting query state; clientRows/nonce\n // force refetch. Presentation changes still sync/persist via queryKey below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n rowQueryKey,\n transport,\n clientRows,\n schema,\n debounceMs,\n nonce,\n validateExecution,\n executionKey,\n groupingNow,\n restoration,\n active,\n storageReady,\n ]);\n\n // Persist last query (debounced). The \"succeeded\" policy waits for the\n // execution receipt below.\n const persistLast = opts.persistLast ?? \"always\";\n // Last-used state through storage that drops host state would restore a table-only query.\n const hostStorageUnsupported = Boolean(host) && !storage.storesHostState;\n useEffect(() => {\n if (persistLast !== \"always\" || !storageReady || restoration.loading || restoration.error || hostStorageUnsupported) return;\n const t = setTimeout(() => void storage.saveLast(sourceSchema.name, query), 400);\n return () => clearTimeout(t);\n }, [persistLast, queryKey, storage, sourceSchema.name, query, restoration, storageReady, hostStorageUnsupported]);\n\n // Resolved id accessor.\n const idField = useMemo(\n () => schema.fields.find((f) => f.name === schema.idField),\n [schema],\n );\n const rowId = useCallback(\n (row: Row): RowId | null =>\n (() => {\n const value = idField ? readFieldValue(idField, row) : (row as Record<string, unknown> | null)?.[schema.idField];\n return typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value)) ? value : null;\n })(),\n [idField, schema.idField],\n );\n\n // Sub-APIs.\n const displayedIds = useMemo(\n () => rows.map(rowId).filter((id): id is RowId => id != null),\n [rows, rowId],\n );\n const selection = useSelection(displayedIds);\n const identityScope = JSON.stringify([sourceSchema.name, query.grouping?.keys ?? null]);\n useEffect(() => { selection.clear(); }, [identityScope, selection.clear]);\n const columnSchema = useMemo(() => detailColumnSchema(displaySchema, detailsEnabled || groupDetailsEnabled), [displaySchema, detailsEnabled, groupDetailsEnabled]);\n const resultDefaults = useMemo(() => query.grouping ? defaultsFor(schema) : defaults, [Boolean(query.grouping), schema, defaults]);\n const select = useSelect(query, setQuery, columnSchema);\n const columnDrag = useColumnDrag();\n const savedQueries = useSavedQueries(\n sourceSchema.name,\n query,\n (q) => {\n // A save without host state takes the host defaults rather than keep\n // the live state; an unacceptable one throws before anything changes.\n const normalized = withHostState(normalizeQueryState(q, defaults), hostRef.current);\n savedBaseline.current = { source: sourceSchema.name, query: cloneQueryState(normalized) };\n viewRevision.current++;\n setQuery(normalized);\n },\n storage,\n now,\n links.snapshot,\n );\n // With host state, saved items compare as the definitions they load, and\n // saving refuses storage that would drop the host state.\n const hostStorageError = host && !storage.storesHostState\n ? \"This storage adapter cannot save host query state (set StorageAdapter.storesHostState once it keeps QueryState.hostState).\" : null;\n const savedItems = useMemo(() => !host ? savedQueries.items : savedQueries.items.map(item => {\n try { return { ...item, query: withHostState(normalizeQueryState(item.query, defaults), hostRef.current) }; } catch { return item; }\n }), [savedQueries.items, Boolean(host), defaults]);\n const saved: SavedQueriesApi = { ...savedQueries, items: savedItems, save: async name => {\n if (hostStorageError) throw Error(hostStorageError);\n const item = await savedQueries.save(name);\n savedBaseline.current = { source: sourceSchema.name, query: cloneQueryState(withHostState(normalizeQueryState(item.query, defaults), hostRef.current)) };\n viewRevision.current++;\n return item;\n }, update: async id => {\n if (hostStorageError) throw Error(hostStorageError);\n return savedQueries.update(id);\n } };\n const pageReady =\n committedPage === pageContext &&\n committedSource?.schema === schema &&\n committedSource?.transport === transport &&\n committedSource?.clientRows === clientRows &&\n !error;\n const dataToken = useRef(0);\n const dataVersion = useMemo(\n () => ++dataToken.current,\n [schema, transport, clientRows, rows, nonce, definitionKey, executionKey, metricTransport, opts.metricExecution],\n );\n const metricRowsReady = pageReady && (opts.metricRowsReady?.(query) ?? true);\n const metricExecution = opts.metricExecution ?? (opts.computedExecution\n ? pageReady && serverExecution ? serverExecution : opts.computedExecution\n : undefined);\n const v3MetricExecution = opts.metricExecution ?? opts.computedExecution;\n const metricSourceCatalogue = useMemo(() => sourceExecutionSchema(sourceSchema, v3MetricExecution),\n [sourceSchema, v3MetricExecution]);\n const executeV3Metrics = useCallback(async (metricQuery: QueryState, signal?: AbortSignal) => {\n if (!metricTransport) throw Error(\"The v3 query executor is unavailable.\");\n return runV3Metrics(metricTransport, query.grouping ? { ...metricQuery, grouping: query.grouping } : metricQuery,\n sourceSchema, query.grouping ? schema : metricSourceCatalogue, v3MetricExecution, groupingNow ?? (opts.evaluationNow ?? Date.now)(), signal);\n }, [metricTransport, sourceSchema, metricSourceCatalogue, schema, v3MetricExecution, groupKey, groupingNow, opts.evaluationNow]);\n const previewGrouping = useCallback(async (draft: QueryState, signal?: AbortSignal) => {\n if (!active || !storageReady || restoration.loading || restoration.error) throw Error(\"Wait for query restoration before previewing groups.\");\n if (!transport?.queryCapabilities.groupedRows || !draft.grouping) throw Error(\"The server group preview is unavailable.\");\n const request = toQueryRequestV3({ ...draft, aggregations: [] }, sourceSchema, transport.queryCapabilities,\n opts.computedExecution, { now: groupingNow ?? (opts.evaluationNow ?? Date.now)() });\n const result = await transport.fetchQueryV3(request, signal);\n validateQueryResultV3(result, request, groupingModel.resultSchema(draft.grouping.keys, draft.grouping.summaries));\n return { rows: result.rows, total: result.total, sourceTotal: result.sourceTotal };\n }, [transport, sourceSchema, opts.computedExecution, groupingModel, groupingNow, opts.evaluationNow, active, storageReady, restoration.loading, restoration.error]);\n const aggState = useAggregations(\n executionQuery,\n schema,\n metricTransport,\n clientRows,\n debounceMs,\n nonce,\n validateExecution,\n {\n ...(metricTransport ? { executeV3: executeV3Metrics, queryContextKey: groupKey } : {}),\n ...(groupingNow !== undefined ? { now: groupingNow, strictLocalMetrics: true } : {}),\n shownRows: rows,\n rowsReady: metricRowsReady,\n rowsError: error,\n ...(transport ? { shownFields: committedFields } : {}),\n resolveComputed,\n revisions: computedRevisions,\n ...(metricExecution ? { execution: metricExecution } : {}),\n ...(opts.formulaWorkerFactory\n ? { workerFactory: opts.formulaWorkerFactory }\n : {}),\n },\n active && storageReady && !restoration.loading && !restoration.error,\n );\n const queryRef = useRef(query);\n queryRef.current = query;\n const replaceAggregations = useCallback(\n (clauses: AggregationClause[], expected?: AggregationClause[]) => {\n if (\n expected &&\n JSON.stringify(queryRef.current.aggregations ?? []) !==\n JSON.stringify(expected)\n )\n throw new Error(\n \"Metrics changed while editing. Reopen the editor to use the latest configuration.\",\n );\n for (const clause of clauses) metricCompile(clause);\n setQuery((q) => ({\n ...q,\n aggregations: JSON.parse(\n JSON.stringify(clauses),\n ) as AggregationClause[],\n }));\n },\n [setQuery, metricCompile],\n );\n\n const canUndo = queryHistory.past.length > 0;\n const canRedo = queryHistory.future.length > 0;\n\n const undo = useCallback(() => {\n if (!queryHistoryRef.current.past.length) return;\n manualQueryEpoch.current++;\n restoreController.current?.abort();\n setStorageReady(true);\n setRestoration({ loading: false, error: null });\n updateQueryHistory((history) => {\n const previous = history.past[history.past.length - 1];\n if (!previous) return history;\n return { query: cloneQueryState(previous), past: history.past.slice(0, -1), future: [...history.future, cloneQueryState(history.query)] };\n });\n }, [updateQueryHistory]);\n\n const redo = useCallback(() => {\n if (!queryHistoryRef.current.future.length) return;\n manualQueryEpoch.current++;\n restoreController.current?.abort();\n setStorageReady(true);\n setRestoration({ loading: false, error: null });\n updateQueryHistory((history) => {\n const next = history.future[history.future.length - 1];\n if (!next) return history;\n return { query: cloneQueryState(next), past: [...history.past, cloneQueryState(history.query)], future: history.future.slice(0, -1) };\n });\n }, [updateQueryHistory]);\n\n // ---- intent helpers (keep offset/url/storage coherent) ----\n const patch = useCallback(\n (p: Partial<QueryState>) => setQuery((prev) => ({ ...prev, ...p })),\n [setQuery],\n );\n\n const { addFilter, updateFilter, removeFilter, clearFilters, updatePredicate, removePredicate, negatePredicate, reorderFilters, mergeFilters } = useQueryFilters(schema, setQuery);\n\n const resetAll = useCallback(\n () => {\n const baseline = savedBaseline.current;\n viewRevision.current++;\n setQuery(cloneQueryState(baseline?.source === sourceSchema.name ? baseline.query : defaults));\n },\n [setQuery, defaults, sourceSchema.name],\n );\n\n // ---- aggregation metric mutators (don't touch paging — scope is the whole set) ----\n const addAggregation = useCallback<AggregationsApi[\"add\"]>(\n (partial) => {\n const id = `a${nowRef.current()}-${aggIdRef.current++}`;\n const clause: AggregationClause = {\n id,\n op: \"count\",\n groupBy: [],\n ...partial,\n };\n setQuery((q) => ({\n ...q,\n aggregations: [...(q.aggregations ?? []), clause],\n }));\n return id;\n },\n [setQuery],\n );\n const updateAggregation = useCallback<AggregationsApi[\"update\"]>(\n (id, patch) =>\n setQuery((q) => ({\n ...q,\n aggregations: (q.aggregations ?? []).map((a) =>\n a.id === id ? mergeAggregation(a, patch) : a,\n ),\n })),\n [setQuery],\n );\n const moveAggregation = useCallback<AggregationsApi[\"move\"]>(\n (id, toIndex) =>\n setQuery((q) => {\n const current = q.aggregations ?? [];\n const from = current.findIndex((a) => a.id === id);\n if (from === -1) return q;\n const next = [...current];\n const [item] = next.splice(from, 1);\n next.splice(Math.max(0, Math.min(toIndex, next.length)), 0, item!);\n return { ...q, aggregations: next };\n }),\n [setQuery],\n );\n const removeAggregation = useCallback<AggregationsApi[\"remove\"]>(\n (id) =>\n setQuery((q) => ({\n ...q,\n aggregations: (q.aggregations ?? []).filter((a) => a.id !== id),\n })),\n [setQuery],\n );\n const clearAggregations = useCallback<AggregationsApi[\"clear\"]>(\n () => setQuery((q) => ({ ...q, aggregations: [] })),\n [setQuery],\n );\n\n const setSort = useCallback(\n (orderBy: OrderByClause[]) =>\n setQuery((q) => ({ ...q, offset: 0, orderBy })),\n [setQuery],\n );\n const toggleSort = useCallback(\n (field: string, additive = false) =>\n setQuery((q) => ({\n ...q,\n offset: 0,\n orderBy: nextOrderBy(q.orderBy, field, additive),\n })),\n [setQuery],\n );\n\n const setLimit = useCallback(\n (limit: number) => patch({ limit, offset: 0 }),\n [patch],\n );\n const setOffset = useCallback((offset: number) => patch({ offset }), [patch]);\n const nextPage = useCallback(\n () => setQuery((q) => ({ ...q, offset: q.offset + q.limit })),\n [setQuery],\n );\n const prevPage = useCallback(\n () => setQuery((q) => ({ ...q, offset: Math.max(0, q.offset - q.limit) })),\n [setQuery],\n );\n\n // Filter suggestions, field statistics and row lookups are v3 requests in\n // the table's negotiated execution context.\n // Read at request time, so inline host options never change the identity\n // of the lookup and suggestion callbacks (which would restart their effects).\n const auxiliaryRef = useRef({ evaluationNow: opts.evaluationNow, execution: opts.computedExecution });\n auxiliaryRef.current = { evaluationNow: opts.evaluationNow, execution: opts.computedExecution };\n const auxiliaryOptions = useCallback((): AuxiliaryRequestOptions => {\n const { evaluationNow, execution } = auxiliaryRef.current;\n return { now: (evaluationNow ?? Date.now)(), ...(execution ? { execution } : {}) };\n }, []);\n const remoteDistinct = useCallback(async (field: string, search: string, signal?: AbortSignal): Promise<DistinctValuesResult> => {\n const definition = sourceCatalogue.fields.find(f => f.name === field);\n if (!metadataTransport || !definition || !isPushdownFilter(definition)) return { values: [], hasMore: false };\n return fetchDistinctValuesV3(metadataTransport, sourceCatalogue, field, search.slice(0, 2000), { ...auxiliaryOptions(), limit: AUTOCOMPLETE_LIMIT }, signal);\n }, [metadataTransport, sourceCatalogue, auxiliaryOptions]);\n const remoteFieldStats = useCallback(async (fields: string[], signal?: AbortSignal): Promise<Record<string, FieldStats>> =>\n metadataTransport && opts.remoteFieldStats ? fetchFieldStatsV3(metadataTransport, sourceCatalogue, fields, auxiliaryOptions(), signal) : {},\n [metadataTransport, sourceCatalogue, auxiliaryOptions, opts.remoteFieldStats]);\n\n const filterValues = useCallback(\n async (field: string, search: string, signal?: AbortSignal): Promise<DistinctValuesResult> => {\n // A calendar key's values are interval starts, not source values.\n if (!metadataTransport || query.grouping && !query.grouping.keys.includes(field)) {\n const f = byName.get(field);\n if (!f || !clientRows) return { values: [], hasMore: false };\n\n const fieldHasNull = fieldHasNullInRows(f, clientRows);\n const matches = distinctValuesFromRows(f, clientRows, search);\n\n return {\n values: matches.values,\n hasMore: matches.hasMore,\n hasNull: fieldHasNull,\n };\n }\n return remoteDistinct(field, search, signal);\n },\n [metadataTransport, remoteDistinct, byName, clientRows, groupKey],\n );\n\n const fieldStats = useCallback<QueryTableApi<Row>[\"fieldStats\"]>(\n async (fields, signal) => {\n const requested = [...new Set(fields)];\n if (metadataTransport && !query.grouping)\n return remoteFieldStats(requested.filter((name) => byName.get(name)?.source.kind === \"backend\"), signal);\n if (!clientRows) return {};\n\n // Field names are data: entries keep one such as __proto__ an own key.\n const result: [string, FieldStats][] = [];\n for (const name of requested) {\n if (signal?.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n const field = byName.get(name);\n if (!field) continue;\n const distinct = new Set<string>();\n for (const row of clientRows) {\n const value = readFieldValue(field, row);\n if (value !== null) distinct.add(JSON.stringify(value));\n }\n result.push([name, { distinct: distinct.size }]);\n }\n return Object.fromEntries(result);\n },\n [metadataTransport, remoteFieldStats, byName, clientRows, groupKey],\n );\n // A lookup filters the identity with \"=\": the server refuses it when the\n // field's filtering is off or \"=\" is not among its operators. An identity\n // the catalogue does not declare is left to the server.\n const identityLookup = useMemo(() => {\n const identity = sourceCatalogue.fields.find(field => field.name === sourceCatalogue.idField);\n return !identity || isPushdownFilter(identity) && opsForField(identity).includes(\"=\");\n }, [sourceCatalogue]);\n const fetchRow = useCallback(async (id: RowId, signal?: AbortSignal, select?: string[]) =>\n fetchRowV3<Row>(metadataTransport!, sourceCatalogue, id, { ...auxiliaryOptions(), ...(select?.length ? { select } : {}) }, signal),\n [metadataTransport, sourceCatalogue, auxiliaryOptions]);\n\n // Single refresh seam: re-runs the internal query (setNonce) and fires the\n // consumer's onRefresh, if any. Both the manual `api.refresh()` and every\n // auto-refresh tick go through here, so they stay observably identical. Read\n // onRefresh through a ref to keep this callback (and the interval that depends\n // on it) stable across renders.\n const refresh = useCallback(() => {\n setNonce((n) => n + 1);\n onRefreshRef.current?.();\n }, []);\n const stopAutoRefresh = useCallback(() => setAutoRefreshStatus(null), []);\n const startAutoRefresh = useCallback(\n ({ frequencyMs, turnOffAfterMs }: AutoRefreshConfig) => {\n const pollCount =\n frequencyMs > 0 && turnOffAfterMs > 0\n ? Math.floor(turnOffAfterMs / frequencyMs)\n : 0;\n if (pollCount < 1 || pollCount > MAX_AUTO_REFRESH_POLLS) {\n throw new Error(\"Auto-refresh must schedule between 1 and 1000 polls.\");\n }\n\n const startedAt = nowRef.current();\n refresh();\n setAutoRefreshStatus({\n frequencyMs,\n turnOffAfterMs,\n startedAt,\n stopsAt: startedAt + turnOffAfterMs,\n pollCount: 1,\n });\n },\n [refresh],\n );\n\n const autoRefreshFrequencyMs = autoRefreshStatus?.frequencyMs ?? null;\n const autoRefreshStopsAt = autoRefreshStatus?.stopsAt ?? null;\n\n useEffect(() => {\n if (autoRefreshFrequencyMs == null || autoRefreshStopsAt == null) return;\n\n const tick = () => {\n if (nowRef.current() >= autoRefreshStopsAt) {\n setAutoRefreshStatus((current) =>\n current?.stopsAt === autoRefreshStopsAt ? null : current,\n );\n return;\n }\n\n refresh();\n setAutoRefreshStatus((current) => {\n if (!current) return current;\n if (current.stopsAt !== autoRefreshStopsAt) return current;\n return { ...current, pollCount: current.pollCount + 1 };\n });\n };\n\n const interval = setInterval(tick, autoRefreshFrequencyMs);\n const timeout = setTimeout(\n () =>\n setAutoRefreshStatus((current) =>\n current?.stopsAt === autoRefreshStopsAt ? null : current,\n ),\n Math.max(0, autoRefreshStopsAt - nowRef.current()),\n );\n\n return () => {\n clearInterval(interval);\n clearTimeout(timeout);\n };\n }, [autoRefreshFrequencyMs, autoRefreshStopsAt, refresh]);\n\n const autoRefresh = useMemo<AutoRefreshApi>(\n () => ({\n status: autoRefreshStatus,\n start: startAutoRefresh,\n stop: stopAutoRefresh,\n }),\n [autoRefreshStatus, startAutoRefresh, stopAutoRefresh],\n );\n\n const refreshRow = useCallback(\n async (id: RowId) => {\n if (!transport) return;\n if (!identityLookup || query.grouping || committedFields.some(isComputedField) || query.orderBy.some((term) => isComputedField(term.field))) {\n // Grouped rows and computed values belong to one committed page, and a\n // computed sort may also change page membership. Without an identity\n // lookup the page is the only way to read the row again.\n refresh();\n return;\n }\n const updated = await fetchRow(id, undefined, committedFields);\n setRows((prev) =>\n prev.map((r) => (rowId(r) === id ? (updated ?? r) : r)),\n );\n },\n [transport, fetchRow, rowId, groupKey, committedFields, query.orderBy, refresh, identityLookup],\n );\n\n const visibleFields = useMemo(\n () => selectedFields(columnSchema, query),\n [columnSchema, query],\n );\n\n const aggregations = useMemo<AggregationsApi>(\n () => ({\n clauses: query.aggregations ?? [],\n results: aggState.results,\n loading: aggState.loading,\n error: aggState.error,\n add: addAggregation,\n update: updateAggregation,\n move: moveAggregation,\n remove: removeAggregation,\n clear: clearAggregations,\n preview: aggState.preview,\n replace: replaceAggregations,\n compile: metricCompile,\n contextKey: `${dataVersion}:${pageContext}:${metricRowsReady}:${JSON.stringify(query.where)}`,\n }),\n [\n query.aggregations,\n aggState.results,\n aggState.loading,\n aggState.error,\n addAggregation,\n updateAggregation,\n moveAggregation,\n removeAggregation,\n clearAggregations,\n aggState.preview,\n replaceAggregations,\n metricCompile,\n pageContext,\n metricRowsReady,\n dataVersion,\n query.where,\n ],\n );\n\n // One receipt per execution identity. Rows and metrics are keyed by the\n // current page context and metric state, so a slower earlier execution can\n // never mark this one healthy.\n const executionIdentity = JSON.stringify([pageContext, query.aggregations ?? [], query.where, groupKey, nonce]);\n const executionGeneration = useRef({ key: \"\", generation: 0 });\n if (executionGeneration.current.key !== executionIdentity)\n executionGeneration.current = { key: executionIdentity, generation: executionGeneration.current.generation + 1 };\n const execution = useMemo((): QueryExecutionReceipt | null => {\n if (!active || !storageReady || restoration.loading || restoration.error) return null;\n const rowsStatus = pageReady ? \"succeeded\" : error && failedPage === pageContext ? \"failed\" : \"running\";\n const metricError = aggState.error ?? aggState.results?.metrics.find(entry => entry.error)?.error;\n const metricsStatus = !(query.aggregations?.length) ? \"none\"\n : aggState.loading || (!aggState.results && !aggState.error) ? \"running\"\n : metricError ? \"failed\" : \"succeeded\";\n const status = rowsStatus === \"failed\" || metricsStatus === \"failed\" ? \"failed\"\n : rowsStatus === \"succeeded\" && metricsStatus !== \"running\" ? \"succeeded\" : \"running\";\n return {\n query, key: executionIdentity, generation: executionGeneration.current.generation,\n status, rows: rowsStatus, metrics: metricsStatus,\n error: rowsStatus === \"failed\" ? error : metricError ? (metricError instanceof Error ? metricError : Error(String(metricError))) : null,\n };\n }, [active, storageReady, restoration.loading, restoration.error, pageReady, error, failedPage, pageContext,\n aggState.error, aggState.results, aggState.loading, query, executionIdentity]);\n const succeededQuery = execution?.status === \"succeeded\" ? execution.query : null;\n // A success stays pending until saved: a later edit that is still running\n // or fails does not cancel it, and a refresh of the same query does not\n // restart the debounce. Only a newer success replaces it.\n const pendingLast = useRef<{ key: string; save: () => void; timer: ReturnType<typeof setTimeout> } | null>(null);\n const savedLast = useRef<string | null>(null);\n useEffect(() => {\n if (persistLast !== \"succeeded\" || !succeededQuery || hostStorageUnsupported) return;\n const key = JSON.stringify([sourceSchema.name, succeededQuery]);\n if (pendingLast.current?.key === key || (!pendingLast.current && savedLast.current === key)) return;\n if (pendingLast.current) clearTimeout(pendingLast.current.timer);\n const save = () => {\n pendingLast.current = null;\n savedLast.current = key;\n void storage.saveLast(sourceSchema.name, succeededQuery);\n };\n pendingLast.current = { key, save, timer: setTimeout(save, 400) };\n }, [persistLast, succeededQuery, storage, sourceSchema.name, hostStorageUnsupported]);\n // Unmounting writes a pending success rather than dropping it.\n useEffect(() => () => {\n const pending = pendingLast.current;\n if (pending) { clearTimeout(pending.timer); pending.save(); }\n }, []);\n\n const sourceRowId = useCallback((row: Row): RowId | null => {\n const field = sourceSchema.fields.find(f => f.name === sourceSchema.idField);\n const value = field ? readFieldValue(field, row) : (row as Record<string, unknown>)[sourceSchema.idField];\n return typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value)) ? value : null;\n }, [sourceSchema]);\n\n // An item lookup reads the detail catalogue's properties too, including\n // backend fields defined only in itemDetails.schema.\n const detailCatalogue = typeof opts.itemDetails === \"object\" ? opts.itemDetails.schema : undefined;\n const lookupCatalogue = useMemo(() => !detailCatalogue ? sourceCatalogue : { ...sourceCatalogue,\n fields: [...sourceCatalogue.fields, ...detailCatalogue.fields.filter(field => !sourceCatalogue.fields.some(f => f.name === field.name))] },\n [sourceCatalogue, detailCatalogue]);\n const lookupCatalogueRef = useRef(lookupCatalogue);\n lookupCatalogueRef.current = lookupCatalogue;\n const fetchItem = useCallback(async (id: RowId, signal?: AbortSignal) =>\n fetchRowV3<Row>(metadataTransport!, lookupCatalogueRef.current, id, auxiliaryOptions(), signal),\n [metadataTransport, auxiliaryOptions]);\n const itemDetails = useItemDetails({\n schema: query.grouping ? sourceSchema : displaySchema,\n query: sourceQuery, setQuery: setSourceQuery, options: opts.itemDetails,\n rows: query.grouping ? sourceRows ?? [] : rows, clientRows: sourceRows,\n // Without an identity lookup, item details read the rows on the page.\n rowId: sourceRowId, fetchRow: metadataTransport && identityLookup ? fetchItem : undefined, refreshKey: nonce, links, queryParameter: parameter,\n queryReady: storageReady && !restoration.loading && !restoration.error,\n });\n\n // Group Detail reads grouped rows already held, by their group identity; it\n // never loads a source item by that ID. Rows seen for this population stay\n // readable across pages and sorts, and a changed population drops them.\n // A population is the grouped query and host state over one data source;\n // new rows, a new transport or a new schema start it afresh.\n const groupPopulation = query.grouping ? JSON.stringify([query.grouping, query.where, nonce, hostStateKey]) : \"\";\n const groupRecords = useRef({ population: \"\", source: [] as unknown[], rows: new Map<RowId, Row>() });\n const groupSource = [clientRows, transport, schema];\n if (groupRecords.current.population !== groupPopulation || groupSource.some((part, i) => part !== groupRecords.current.source[i]))\n groupRecords.current = { population: groupPopulation, source: groupSource, rows: new Map() };\n // Only rows committed for the current page context belong to this population.\n const groupsSettled = groupDetailsEnabled && pageReady && !restoration.loading;\n if (groupsSettled) for (const row of rows) {\n const id = rowId(row);\n if (id != null) groupRecords.current.rows.set(id, row);\n }\n const groupDetailOptions = useMemo((): ItemDetailsOptions<Row> | undefined => {\n if (!groupDetailsEnabled) return undefined;\n const config = typeof opts.itemDetails === \"object\" ? opts.itemDetails : undefined;\n // Page templates address source items, so groups offer the in-place modes.\n const modes = (config?.modes ?? [\"hover\", \"modal\", \"expand\"]).filter(mode => mode !== \"page\");\n return { modes, defaultModes: initialDetailModes(config).filter(mode => (modes as string[]).includes(mode)),\n objectType: `${config?.objectType ?? sourceSchema.name}:groups`,\n ...(config?.storage ? { storage: config.storage } : {}) };\n }, [groupDetailsEnabled, opts.itemDetails, sourceSchema.name]);\n // Group properties default to every key and summary, links included.\n const groupDetailSchema = useMemo(() => ({ ...displaySchema,\n defaultSelect: displaySchema.fields.filter(field => field.name !== displaySchema.idField).map(field => ({ field: field.name })),\n fields: displaySchema.fields.map(field =>\n field.name === displaySchema.idField ? { ...field, property: { enabled: false } } : field) }), [displaySchema]);\n // Property-view writes that land after grouping ends must not reach the source query.\n const setGroupQuery = useCallback<QueryTableApi<Row>[\"setQuery\"]>((next) => setQuery(current =>\n current.grouping ? typeof next === \"function\" ? next(current) : next : current), [setQuery]);\n const groupDetails = useItemDetails({\n schema: groupDetailSchema, query, setQuery: setGroupQuery, options: groupDetailOptions, rows, clientRows: undefined,\n rowId, fetchRow: undefined, refreshKey: nonce, links, queryParameter: parameter,\n queryReady: storageReady && !restoration.loading && !restoration.error,\n lookupRow: (id) => {\n const row = groupRecords.current.rows.get(id);\n return row ? { row } : groupsSettled || error ? null : undefined;\n },\n subject: \"group\",\n });\n\n const api: QueryTableApi<Row> = {\n restoration: { status: restoration.error ? \"error\" : !storageReady || restoration.loading ? \"resolving\" : \"ready\",\n ready: active && storageReady && !restoration.loading && !restoration.error, error: restoration.error },\n execution,\n ...(host && query.hostState ? {\n definition: { query: withoutHostState(query), hostState: query.hostState },\n setDefinition: (next: QueryDefinition | ((previous: QueryDefinition) => QueryDefinition)) => {\n const current = queryHistoryRef.current.query;\n const value = typeof next === \"function\"\n ? next({ query: withoutHostState(current), hostState: current.hostState! })\n : next;\n // Validate before committing, so a rejected host state changes nothing.\n setQuery(withHostState({ ...normalizeQueryState(value.query, defaults), hostState: value.hostState }, hostRef.current));\n },\n } : {}),\n restoreLocation,\n links,\n schema: columnSchema,\n ...(itemDetails && detailsEnabled ? { itemDetails } : groupDetails ? { itemDetails: groupDetails } : {}),\n query,\n defaults: resultDefaults,\n setQuery,\n rows,\n total,\n loading: loading || restoration.loading,\n error: restoration.error ?? error,\n requestActivity,\n canUndo,\n canRedo,\n undo,\n redo,\n refresh,\n autoRefresh,\n refreshRow,\n aggregations,\n addFilter,\n updateFilter,\n removeFilter,\n clearFilters,\n updatePredicate,\n removePredicate,\n negatePredicate,\n reorderFilters,\n mergeFilters,\n resetAll,\n filterValues,\n fieldStats,\n toggleSort,\n setSort,\n select,\n computed,\n setLimit,\n setOffset,\n nextPage,\n prevPage,\n selection,\n saved,\n columnDrag,\n visibleFields,\n rowId,\n };\n // Source filter controls key their metadata reads by these identities, so\n // they must not change on every render of a grouped view.\n const sourceFilterValues = useCallback<GroupingSourceApi<Row>[\"filterValues\"]>(async (name, search, signal) => {\n if (metadataTransport) return remoteDistinct(name, search, signal);\n const field = groupingModel.sourceField(name);\n return field && sourceRows ? { ...distinctValuesFromRows(field, sourceRows, search), hasNull: fieldHasNullInRows(field, sourceRows) } : { values: [], hasMore: false };\n }, [metadataTransport, remoteDistinct, groupingModel, sourceRows]);\n const sourceFieldStats = useCallback<GroupingSourceApi<Row>[\"fieldStats\"]>(async (names, signal) => {\n if (signal?.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n const requested = [...new Set(names)];\n if (metadataTransport) return remoteFieldStats(requested, signal);\n return Object.fromEntries(requested.flatMap(name => {\n const field = groupingModel.sourceField(name);\n return field && sourceRows ? [[name, { distinct: new Set(sourceRows.map(row => JSON.stringify(readFieldValue(field, row)))).size }]] : [];\n }));\n }, [metadataTransport, remoteFieldStats, groupingModel, sourceRows]);\n const sourceApi: GroupingSourceApi<Row> = {\n ...sourceFilters, loading, rowId: sourceRowId, query: sourceQuery, setQuery: setSourceQuery,\n ...(itemDetails ? { itemDetails } : {}),\n schema: sourceCatalogue,\n filterValues: sourceFilterValues,\n fieldStats: sourceFieldStats,\n };\n const grouping = useGroupingController(api, sourceApi, groupingModel, prepared?.inputs ?? sourceRows ?? [], groupingSupported, viewRevision.current,\n { inputsReady: !remoteGrouping, ...(remoteGrouping ? { preview: previewGrouping } : {}) });\n return {\n ...api,\n ...(groupingSupported || query.grouping ? { grouping } : {}),\n select: { ...select, hide: field => query.grouping && groupKeyFields(query.grouping.keys).includes(field)\n ? grouping.changeKeys(query.grouping.keys.filter(key => groupKeyField(key) !== field)) : select.hide(field) },\n };\n}\n\n/** Multi-sort header click logic.\n * - plain click on the sole sorted column → flip its direction\n * - plain click on another column → make it the only sort (desc)\n * - shift-click a new column → append it (desc) as a secondary term\n * - shift-click an existing term → cycle desc → asc → remove */\nfunction nextOrderBy(\n existing: OrderByClause[],\n field: string,\n additive: boolean,\n): OrderByClause[] {\n const i = existing.findIndex((s) => s.field === field);\n if (!additive) {\n if (i === 0 && existing.length === 1) {\n const flipped: \"asc\" | \"desc\" =\n existing[0]!.dir === \"desc\" ? \"asc\" : \"desc\";\n return [{ ...existing[0]!, dir: flipped }];\n }\n return [{ field, dir: \"desc\" }];\n }\n if (i === -1) return [...existing, { field, dir: \"desc\" }];\n const cur = existing[i]!;\n if (cur.dir === \"desc\") {\n const next = [...existing];\n next[i] = { ...cur, dir: \"asc\" };\n return next;\n }\n return existing.filter((_, k) => k !== i); // asc → remove\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type {\n FieldSchema, ItemDetailMode, ItemPropertyMode, ItemPageOptions, ItemDetailsState, PropertyViewStorage,\n QueryState, RelationshipAdapter, RowId, PropertyViewState, ScopedJsonInspectionState, AttentionRegistry, AttentionProvider,\n} from \"@pythia-software/query-table-core\";\nimport { isPropertyFieldLoaded, jsonInspectionScopeKey, MAX_JSON_INSPECTIONS } from \"@pythia-software/query-table-core\";\nimport { usePropertyView, type PropertyViewApi } from \"./usePropertyView\";\nimport type { QueryLinksApi } from \"./useQueryLinks\";\n\nexport interface ItemDetailRecord<Row> {\n row: Row;\n /** Omit for complete records. Supply for a projection to distinguish missing values from NULL. */\n loadedFields?: readonly string[];\n}\nexport interface ItemDetailsOptions<Row> {\n /** Detail catalogue; defaults to the table catalogue. Useful for non-column properties. */\n schema?: FieldSchema<Row>;\n /** Optional semantic reveal service, shared with host attention navigation. */\n attention?: AttentionRegistry;\n /** Legacy collection URL parameter. useQueryTable.queryParameter takes precedence. */\n queryParameter?: string;\n /** Creator-approved modalities; users can enable/disable these in Select columns. Defaults to all. */\n modes?: ItemDetailMode[];\n /** Initially selected buttons. Defaults to Modal (or the first allowed mode). */\n defaultModes?: ItemDetailMode[];\n /** Creator's initial Page link settings; users can override in the column editor. */\n page?: ItemPageOptions;\n storage?: PropertyViewStorage;\n objectType?: string;\n relationships?: RelationshipAdapter;\n /** Defaults to complete clientRows or a v3 identity lookup, then the current projected row. */\n loadRow?: (id: RowId, signal: AbortSignal) => Promise<ItemDetailRecord<Row> | null>;\n}\nexport interface ItemDetailsApi<Row> {\n /** \"group\" details describe grouped result rows, identified by their group identity. */\n subject?: \"item\" | \"group\";\n links?: QueryLinksApi;\n jsonInspections?: readonly ScopedJsonInspectionState[];\n setJsonInspection?: (inspection: ScopedJsonInspectionState) => void;\n attention?: AttentionRegistry;\n preserveFocus?: boolean;\n /** Ephemeral request counter; virtual tables rematerialize an expanded row per reveal. */\n attentionRevision?: number;\n /** Keep the requested virtual detail materialized until its reveal settles. */\n attentionPending?: boolean;\n schema: FieldSchema<Row>;\n /** Collection catalogue used to resolve Page template fields. */\n pageSchema: FieldSchema<Row>;\n queryParameter: string;\n /** Modal controller, retained for standalone cards. */\n properties: PropertyViewApi;\n propertiesByMode: Record<ItemPropertyMode, PropertyViewApi>;\n page: ItemPageOptions;\n availableModes: ItemDetailMode[];\n modes: ItemDetailMode[];\n active: ItemDetailsState[\"active\"] | null;\n record: ItemDetailRecord<Row> | null;\n loading: boolean;\n error: Error | null;\n relationships?: RelationshipAdapter;\n setModes(modes: ItemDetailMode[]): void;\n open(id: RowId, mode: \"modal\" | \"expand\"): void;\n close(): void;\n retry(): void;\n loadRow(id: RowId, signal: AbortSignal): Promise<ItemDetailRecord<Row> | null>;\n}\nconst ALL_MODES: ItemDetailMode[] = [\"hover\", \"modal\", \"expand\", \"page\"];\nexport function initialDetailModes<Row>(config: ItemDetailsOptions<Row> | undefined): ItemDetailMode[] {\n const available = ALL_MODES.filter(mode => !config?.modes || config.modes.includes(mode));\n return config?.defaultModes ? available.filter(mode => config.defaultModes!.includes(mode))\n : available.includes(\"modal\") ? [\"modal\"] : available.slice(0, 1);\n}\n\n/** Synchronize a single modality without overwriting its siblings. */\nfunction useDetailProperties<Row>(mode: ItemPropertyMode, schema: FieldSchema<Row>, config: ItemDetailsOptions<Row> | undefined,\n query: QueryState, setQuery: (next: QueryState | ((previous: QueryState) => QueryState)) => void, enabled: boolean,\n readOnly = false): PropertyViewApi {\n const snapshot = query.itemDetails?.views?.[mode] ?? query.itemDetails?.view;\n const seed = useRef(snapshot);\n const properties = usePropertyView({ schema,\n ...(config?.storage ? { storage: config.storage } : {}),\n key: `${config?.objectType ?? schema.name}:${mode}`,\n ...(seed.current ? { initialView: seed.current } : {}),\n });\n const queryViewKey = JSON.stringify(snapshot);\n const localViewKey = JSON.stringify(properties.view);\n const previousView = useRef({ query: queryViewKey, local: localViewKey });\n const baselineView = useRef(properties.view);\n const baselineReady = useRef(false);\n const pendingView = useRef<{ query: string | undefined; local: string } | null>(null);\n useEffect(() => {\n if (!enabled) return;\n if (!properties.loading && !baselineReady.current) {\n baselineView.current = properties.view;\n baselineReady.current = true;\n }\n const previous = previousView.current;\n previousView.current = { query: queryViewKey, local: localViewKey };\n if (queryViewKey !== previous.query) {\n const next = snapshot ?? baselineView.current;\n const target = JSON.stringify(next);\n pendingView.current = target !== localViewKey ? { query: queryViewKey, local: target } : null;\n if (target !== localViewKey) properties.setView(next);\n } else if (pendingView.current && pendingView.current.query === queryViewKey) {\n if (pendingView.current.local === localViewKey) pendingView.current = null;\n } else if (!readOnly && !properties.loading && localViewKey !== queryViewKey && (queryViewKey !== undefined || localViewKey !== previous.local)) {\n setQuery((current) => ({ ...current, itemDetails: {\n modes: current.itemDetails?.modes ?? initialDetailModes(config),\n ...current.itemDetails,\n views: { ...current.itemDetails?.views, [mode]: properties.view },\n } }));\n }\n }, [enabled, queryViewKey, localViewKey, properties.loading, properties.setView, setQuery]);\n return properties;\n}\n\n/** Independent, type-level property controllers for each detail modality. */\n/** The fields a projected row carries: a key of the field's name, or of the\n * first segment of its path (`payload` for `payload.name`). */\nfunction projectedFields<Row>(schema: FieldSchema<Row>, row: Row): string[] {\n const keys = new Set(Object.keys(row as object));\n return schema.fields.filter((field) => keys.has(field.name) ||\n keys.has((field.source.kind === \"backend\" ? field.source.path ?? field.name : field.name).split(\".\")[0]!)).map((field) => field.name);\n}\nexport function useItemDetails<Row>({\n schema, query, setQuery, options, rows, clientRows, rowId, fetchRow, refreshKey, links, queryReady = true, queryParameter, lookupRow, subject,\n}: {\n schema: FieldSchema<Row>;\n query: QueryState;\n setQuery: (next: QueryState | ((previous: QueryState) => QueryState)) => void;\n options: boolean | ItemDetailsOptions<Row> | undefined;\n rows: Row[];\n clientRows: Row[] | undefined;\n rowId: (row: Row) => RowId | null;\n /** Loads one source row by identity (the table's transport). */\n fetchRow: ((id: RowId, signal: AbortSignal) => Promise<Row | null>) | undefined;\n refreshKey: number;\n links?: QueryLinksApi;\n queryParameter?: string;\n /** Hold property-view synchronization while the collection query is restoring. */\n queryReady?: boolean;\n /** Resolves records synchronously from rows already held, without loading\n * by ID; `undefined` means still loading and `null` unavailable. */\n lookupRow?: (id: RowId) => ItemDetailRecord<Row> | null | undefined;\n subject?: \"item\" | \"group\";\n}): ItemDetailsApi<Row> | undefined {\n const enabled = Boolean(options);\n const config = typeof options === \"object\" ? options : undefined;\n const detailSchema = config?.schema ?? schema;\n const availableModes = ALL_MODES.filter((mode) => !config?.modes || config.modes.includes(mode));\n const modes = availableModes.filter((mode) => (query.itemDetails?.modes ?? initialDetailModes(config)).includes(mode));\n const page = query.itemDetails?.page ?? config?.page ?? { urlTemplate: \"\", target: \"_blank\" as const };\n const requested = query.itemDetails?.active;\n const sharedModal = requested?.mode === \"modal\" && query.itemDetails?.modes.includes(\"modal\")\n && (availableModes.includes(\"hover\") || (availableModes.includes(\"page\") && !page.urlTemplate.trim()));\n const active = requested && (modes.includes(requested.mode) || sharedModal) ? requested : null;\n // Property storage can hydrate independently, but must not apply its view to\n // a placeholder query and thereby cancel a pending URL/saved-query restore.\n const syncProperties = enabled && queryReady;\n // A group schema changes with every summary edit. Group views reach the\n // query when a group is opened or shared, never as a side effect of one.\n const readOnly = subject === \"group\";\n const modalProperties = useDetailProperties(\"modal\", detailSchema, config, query, setQuery, syncProperties, readOnly);\n const hoverProperties = useDetailProperties(\"hover\", detailSchema, config, query, setQuery, syncProperties, readOnly);\n const expandProperties = useDetailProperties(\"expand\", detailSchema, config, query, setQuery, syncProperties, readOnly);\n const propertiesByMode = { modal: modalProperties, hover: hoverProperties, expand: expandProperties };\n const views: Record<ItemPropertyMode, PropertyViewState> = {\n modal: modalProperties.view, hover: hoverProperties.view, expand: expandProperties.view,\n };\n\n const customLoad = config?.loadRow;\n const customLoadRef = useRef(customLoad);\n customLoadRef.current = customLoad;\n const lookupRef = useRef(lookupRow);\n lookupRef.current = lookupRow;\n const hasLookup = Boolean(lookupRow);\n // Inline host callbacks should not restart a request on every controller\n // render. Data-source/type changes and explicit refresh/retry still reload.\n const hasCustomLoad = Boolean(customLoad);\n const sourceType = config?.objectType ?? detailSchema.name;\n const fallbackRows = !customLoad && !clientRows && !fetchRow ? rows : undefined;\n const detailSchemaRef = useRef(detailSchema);\n detailSchemaRef.current = detailSchema;\n const loadRow = useCallback(async (id: RowId, signal: AbortSignal): Promise<ItemDetailRecord<Row> | null> => {\n if (lookupRef.current) return lookupRef.current(id) ?? null;\n if (customLoadRef.current) return customLoadRef.current(id, signal);\n if (clientRows) {\n const row = clientRows.find((row) => rowId(row) === id);\n return row ? { row } : null;\n }\n if (fetchRow) {\n // A lookup projects the selectable backend fields; the rest are not loaded.\n const row = await fetchRow(id, signal);\n return row ? { row, loadedFields: projectedFields(detailSchemaRef.current, row) } : null;\n }\n const row = rows.find((row) => rowId(row) === id);\n return row ? { row, loadedFields: projectedFields(detailSchemaRef.current, row) } : null;\n }, [hasLookup, hasCustomLoad, sourceType, clientRows, fetchRow, fallbackRows, rowId]);\n const [retryKey, setRetryKey] = useState(0);\n const [result, setResult] = useState<{\n source: typeof loadRow | undefined; epoch: string; id: RowId | undefined; record: ItemDetailRecord<Row> | null; loading: boolean; error: Error | null;\n }>({ source: undefined, epoch: \"\", id: undefined, record: null, loading: false, error: null });\n const activeId = enabled && !lookupRow ? active?.id : undefined;\n const epoch = `${refreshKey}:${retryKey}`;\n const currentResult = result.id === activeId && result.source === loadRow && result.epoch === epoch;\n useEffect(() => {\n const controller = new AbortController();\n if (activeId === undefined) {\n setResult((previous) => previous.id === undefined && !previous.loading && !previous.error && !previous.record ? previous : { source: undefined, epoch: \"\", id: undefined, record: null, loading: false, error: null });\n return;\n }\n setResult(previous => ({ source: loadRow, epoch, id: activeId, record: previous.id === activeId && previous.source === loadRow ? previous.record : null, loading: true, error: null }));\n void Promise.resolve().then(() => loadRow(activeId, controller.signal)).then((record) => {\n if (!controller.signal.aborted) setResult({ source: loadRow, epoch, id: activeId, record, loading: false, error: null });\n }).catch((error) => {\n if (!controller.signal.aborted) setResult({ source: loadRow, epoch, id: activeId, record: null, loading: false,\n error: error instanceof Error ? error : new Error(String(error)) });\n });\n return () => controller.abort();\n }, [activeId, loadRow, refreshKey, retryKey]);\n const preserveFocus = useRef(false);\n const attentionSequence = useRef(0);\n const [attentionRequest, setAttentionRequest] = useState({ revision: 0, pending: false });\n const attentionLatest = useRef({ loadRow, setQuery, modes, views, active, query });\n attentionLatest.current = { loadRow, setQuery, modes, views, active, query };\n useEffect(() => {\n const registry = config?.attention;\n if (!enabled || !registry) return;\n const provider: AttentionProvider = { reveal: async (target, signal) => {\n if (target.rowId === undefined || signal.aborted) return false;\n const current = attentionLatest.current;\n const record = await current.loadRow(target.rowId, signal);\n if (!record || signal.aborted) return false;\n if (target.field !== undefined && !detailSchema.fields.some(field => field.name === target.field\n && field.property?.enabled !== false && isPropertyFieldLoaded(field, record.loadedFields))) return false;\n const mode = current.active?.id === target.rowId ? current.active.mode : current.modes.includes(\"expand\") ? \"expand\" : current.modes.includes(\"modal\") ? \"modal\" : null;\n if (!mode || (target.field !== undefined && !current.views[mode].properties.some(property => property.field === target.field))) return false;\n preserveFocus.current = true;\n const revision = ++attentionSequence.current;\n setAttentionRequest({ revision, pending: true });\n try {\n current.setQuery(previous => ({ ...previous, itemDetails: { ...previous.itemDetails, modes: previous.itemDetails?.modes ?? current.modes,\n views: current.views, active: { id: target.rowId!, mode } } }));\n const mounted = await registry.whenRegistered({ dataset: detailSchema.name, rowId: target.rowId }, signal);\n if (mounted.ready) await mounted.ready(signal);\n return signal.aborted ? false : await mounted.reveal(target, signal);\n } finally {\n setAttentionRequest(previous => previous.revision === revision ? { revision, pending: false } : previous);\n }\n } };\n return registry.register({ dataset: detailSchema.name }, provider);\n }, [enabled, config?.attention, detailSchema]);\n if (!enabled) return;\n const looked = lookupRow && active ? lookupRow(active.id) : null;\n return {\n ...(subject ? { subject } : {}),\n ...(links ? { links } : {}),\n ...(config?.attention ? { attention: config.attention } : {}),\n preserveFocus: preserveFocus.current,\n attentionRevision: attentionRequest.revision,\n attentionPending: attentionRequest.pending,\n jsonInspections: query.itemDetails?.jsonInspections ?? [],\n setJsonInspection(entry) {\n if (entry.dataset !== detailSchema.name) return;\n setQuery(current => {\n // Most recently edited scopes stay at the end. Prefer evicting a closed\n // inspector, and always make room before strict query normalization.\n const inspections = (current.itemDetails?.jsonInspections ?? []).filter(previous => jsonInspectionScopeKey(previous) !== jsonInspectionScopeKey(entry));\n while (inspections.length >= MAX_JSON_INSPECTIONS) {\n const closed = inspections.findIndex(previous => !previous.state.open);\n inspections.splice(closed < 0 ? 0 : closed, 1);\n }\n return { ...current, itemDetails: { ...current.itemDetails, modes: current.itemDetails?.modes ?? modes,\n jsonInspections: [...inspections, entry] } };\n });\n },\n schema: detailSchema, queryParameter: queryParameter ?? config?.queryParameter ?? \"q\", properties: modalProperties, propertiesByMode, availableModes, modes, active,\n page, pageSchema: schema,\n record: lookupRow ? looked ?? null : result.id === activeId && result.source === loadRow ? result.record : null,\n loading: lookupRow ? looked === undefined : activeId !== undefined && (!currentResult || result.loading),\n error: lookupRow ? null : currentResult ? result.error : null,\n ...(config?.relationships ? { relationships: config.relationships } : {}),\n loadRow,\n retry: () => setRetryKey((value) => value + 1),\n setModes(next) {\n setQuery((current) => {\n const allowed = availableModes.filter((mode) => next.includes(mode));\n const state: ItemDetailsState = { ...current.itemDetails, modes: allowed, views };\n if (state.active && !allowed.includes(state.active.mode)) delete state.active;\n return { ...current, itemDetails: state };\n });\n },\n open(id, mode) {\n config?.attention?.cancel();\n preserveFocus.current = false;\n if (!modes.includes(mode)) return;\n setQuery((current) => ({ ...current, itemDetails: {\n ...current.itemDetails, modes: current.itemDetails?.modes ?? modes,\n views, active: { id, mode },\n } }));\n },\n close() {\n config?.attention?.cancel();\n setQuery((current) => {\n if (!current.itemDetails?.active) return current;\n const { active: _active, ...state } = current.itemDetails;\n return { ...current, itemDetails: state };\n });\n },\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n createPropertyView,\n memoryPropertyViewStorage,\n normalizePropertyView,\n type FieldSchema,\n type PropertyViewState,\n type PropertyViewStorage,\n type SavedPropertyView,\n} from \"@pythia-software/query-table-core\";\n\nexport interface UsePropertyViewOptions<Row> {\n schema: FieldSchema<Row>;\n /** Object type, never object ID. Defaults to schema.name. */\n key?: string;\n storage?: PropertyViewStorage;\n initialView?: PropertyViewState;\n}\nexport interface PropertyViewApi {\n view: PropertyViewState;\n loading: boolean;\n error: Error | null;\n saved: SavedPropertyView[];\n defaultId: string | null;\n setView(view: PropertyViewState): void;\n reset(): void;\n undo(): void;\n redo(): void;\n canUndo: boolean;\n canRedo: boolean;\n load(id: string): void;\n save(name: string): Promise<SavedPropertyView>;\n remove(id: string): Promise<void>;\n setDefault(id: string | null): Promise<void>;\n}\nconst asError = (error: unknown) =>\n error instanceof Error ? error : new Error(String(error));\n\n/** Owns presentation only. Changing the inspected row never resets this controller. */\nexport function usePropertyView<Row>(\n options: UsePropertyViewOptions<Row>,\n): PropertyViewApi {\n const [memory] = useState(memoryPropertyViewStorage);\n const storage = options.storage ?? memory;\n const key = options.key ?? options.schema.name;\n const schemaDefault = useMemo(() => createPropertyView(options.schema), [options.schema]);\n const fallback = useMemo(\n () =>\n options.initialView\n ? normalizePropertyView(options.initialView)\n : schemaDefault,\n [options.initialView, schemaDefault],\n );\n const defaults = useRef(schemaDefault);\n defaults.current = schemaDefault;\n const initial = useRef(options.initialView);\n initial.current = options.initialView;\n const [state, setState] = useState({\n key,\n storage,\n history: [fallback],\n index: 0,\n loading: true,\n error: null as Error | null,\n saved: [] as SavedPropertyView[],\n defaultId: null as string | null,\n });\n const generation = useRef(0);\n const edits = useRef(0);\n const saveQueue = useRef(Promise.resolve());\n const current = state.key === key && state.storage === storage;\n const view = current ? state.history[state.index]! : fallback;\n\n useEffect(() => {\n const token = ++generation.current;\n const editToken = edits.current;\n setState({\n key,\n storage,\n history: [defaults.current],\n index: 0,\n loading: true,\n error: null,\n saved: [],\n defaultId: null,\n });\n void Promise.resolve()\n .then(() =>\n Promise.all([\n storage.loadLast(key),\n storage.listSaved(key),\n storage.loadDefaultSaved(key),\n ]),\n )\n .then(([last, saved, defaultView]) => {\n if (generation.current !== token) return;\n const restored = normalizePropertyView(\n initial.current ?? last ?? defaultView?.view ?? defaults.current,\n );\n const items = saved.map((item) => ({\n ...item,\n view: normalizePropertyView(item.view),\n }));\n setState((previous) => ({\n ...previous,\n ...(edits.current === editToken\n ? { history: [restored], index: 0 }\n : {}),\n saved: items,\n defaultId: defaultView?.id ?? null,\n loading: false,\n }));\n })\n .catch((error) => {\n if (generation.current === token)\n setState((previous) => ({\n ...previous,\n loading: false,\n error: asError(error),\n }));\n });\n return () => {\n generation.current++;\n };\n }, [key, storage]);\n\n useEffect(() => {\n if (!current || state.loading || state.error) return;\n const token = generation.current;\n const snapshot = normalizePropertyView(view);\n // Serial writes prevent a slower old save from replacing a newer view.\n saveQueue.current = saveQueue.current\n .then(() => storage.saveLast(key, snapshot))\n .catch((error) => {\n if (generation.current === token)\n setState((previous) => ({ ...previous, error: asError(error) }));\n });\n }, [view, current, state.loading, state.error, key, storage]);\n\n const setView = useCallback(\n (next: PropertyViewState) => {\n const normalized = normalizePropertyView(next);\n edits.current++;\n setState((previous) => {\n const history =\n previous.key === key && previous.storage === storage\n ? previous.history.slice(0, previous.index + 1)\n : [defaults.current];\n if (\n JSON.stringify(history[history.length - 1]) ===\n JSON.stringify(normalized)\n )\n return { ...previous, error: null };\n const nextHistory = [...history, normalized].slice(-50);\n return {\n ...previous,\n key,\n storage,\n history: nextHistory,\n index: nextHistory.length - 1,\n error: null,\n };\n });\n },\n [key, storage],\n );\n const refresh = useCallback(\n async (token: number) => {\n const [saved, defaultView] = await Promise.all([\n storage.listSaved(key),\n storage.loadDefaultSaved(key),\n ]);\n if (generation.current === token)\n setState((previous) => ({\n ...previous,\n saved: saved.map((item) => ({\n ...item,\n view: normalizePropertyView(item.view),\n })),\n defaultId: defaultView?.id ?? null,\n error: null,\n }));\n },\n [key, storage],\n );\n return {\n view,\n loading: !current || state.loading,\n error: current ? state.error : null,\n saved: current ? state.saved : [],\n defaultId: current ? state.defaultId : null,\n setView,\n reset: () => setView(defaults.current),\n canUndo: current && state.index > 0,\n canRedo: current && state.index < state.history.length - 1,\n undo() {\n edits.current++;\n setState((previous) => ({\n ...previous,\n index: Math.max(0, previous.index - 1),\n error: null,\n }));\n },\n redo() {\n edits.current++;\n setState((previous) => ({\n ...previous,\n index: Math.min(previous.history.length - 1, previous.index + 1),\n error: null,\n }));\n },\n load(id) {\n const found = state.saved.find((item) => item.id === id);\n if (found && current) setView(found.view);\n },\n async save(name) {\n const token = generation.current;\n const saved = await storage.saveNamed(key, name, view, Date.now());\n await refresh(token);\n return saved;\n },\n async remove(id) {\n const token = generation.current;\n await storage.deleteSaved(key, id);\n await refresh(token);\n },\n async setDefault(id) {\n const token = generation.current;\n await storage.setDefaultSaved(key, id);\n await refresh(token);\n },\n };\n}\n","import type { ComputedExecution } from \"@pythia-software/query-table-core\";\nexport function executionRevision(\n execution: ComputedExecution | undefined,\n id: string,\n): string | undefined {\n return (\n execution?.resolvedRevisions[id] ??\n execution?.resolvedRevisions[`@computed/${id}`]\n );\n}\n","import {\n predicatesOf,\n sourceExecutionSchema,\n toQueryRequestV3,\n validateQueryResultV3,\n type ComputedColumn,\n type ComputedExecution,\n type FieldSchema,\n type QueryState,\n type Transport,\n} from \"@pythia-software/query-table-core\";\nimport { executionRevision } from \"./computedExecution\";\n\n/** Fetch inputs for local draft evaluation through the v3 executor. The draft\n * source is never sent to a server or substituted for a saved ID. */\nexport async function fetchPreviewRows<Row>(\n transport: Transport<Row>,\n query: QueryState,\n schema: FieldSchema<Row>,\n execution: ComputedExecution | undefined,\n definitions: ComputedColumn[],\n now: number,\n signal: AbortSignal,\n baseSchema: FieldSchema<Row> = schema,\n): Promise<{ rows: Row[]; total: number }> {\n if (signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n const sourceSchema = sourceExecutionSchema(baseSchema, execution, definitions);\n const request = toQueryRequestV3({ ...query, aggregations: [] }, sourceSchema,\n transport.queryCapabilities, execution, { now });\n // The server executes its own revision; never preview a changed local definition with it.\n const executed = new Set([...request.result.select, ...request.result.orderBy.map(term => term.field),\n ...[...request.source.where, ...request.result.where].flatMap(term => predicatesOf(term).map(predicate => predicate.field))]);\n for (const definition of definitions)\n if (executed.has(`@computed/${definition.id}`) && executionRevision(execution, definition.id) !== definition.revision)\n throw Error(\"Computed definitions changed. Refresh the server execution handshake.\");\n const response = await transport.fetchQueryV3(request, signal);\n // Transports may ignore abort while completing I/O; never publish that page.\n if (signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n validateQueryResultV3(response, request, query.grouping ? schema : sourceSchema);\n if (response.rows.length > query.limit) throw Error(\"Invalid preview row response.\");\n return { rows: response.rows as Row[], total: response.total };\n}\n","import { executionRevision } from \"./computedExecution\";\nimport { fetchPreviewRows } from \"./previewRows\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n isGroupLinkField,\n applyQuery,\n compileFormula,\n computedFieldName,\n groupPreview,\n isComputedField,\n memoryComputedColumnStore,\n readFieldValue,\n validateComputedColumn,\n isSelectable,\n hasRegex,\n type ColumnPreview,\n type ComputedColumn,\n type ComputedExecution,\n type RowComputedValues,\n type RowId,\n type ComputedColumnDraft,\n type ComputedColumnStore,\n type FieldDef,\n type FieldSchema,\n type FormulaPlan,\n type FormulaResult,\n type FormulaValue,\n type QueryState,\n type Transport,\n} from \"@pythia-software/query-table-core\";\nimport {\n evaluateFormulaRows,\n type FormulaWorkerFactory,\n} from \"./formulaWorker\";\n\nexport interface ComputedColumnsApi<Row> {\n definitions: ComputedColumn[];\n catalogue: FieldDef<Row>[];\n loading: boolean;\n error: string | null;\n reload: () => Promise<void>;\n save: (\n column: ComputedColumnDraft,\n expectedRevision: string | null,\n ) => Promise<ComputedColumn>;\n compile: (source: string, editingId?: string) => FormulaPlan;\n /** Sample the first N matching rows in current sort order, independent of table paging. */\n preview: (\n source: string,\n count: number,\n signal?: AbortSignal,\n editingId?: string,\n includeInputs?: boolean,\n ) => Promise<ColumnPreview>;\n}\ninterface Options<Row> {\n schema: FieldSchema<Row>;\n query: QueryState;\n /** V3 previews retain the source/grouping stages behind a result schema. */\n sourceSchema?: FieldSchema<Row>;\n previewQuery?: QueryState;\n now?: number;\n rows: Row[];\n store?: ComputedColumnStore;\n transport?: Transport<Row>;\n clientRows?: Row[];\n workerFactory?: FormulaWorkerFactory;\n execution?: ComputedExecution;\n /** Metric authority affects aggregate capabilities only, independently of rows. */\n metricTransport?: Transport<Row>;\n metricExecution?: ComputedExecution;\n serverComputed?: Map<RowId, RowComputedValues>;\n serverExecution?: ComputedExecution;\n}\nexport function useComputedColumns<Row>(options: Options<Row>): {\n api: ComputedColumnsApi<Row>;\n displaySchema: FieldSchema<Row>;\n} {\n const { schema, query, rows, transport, clientRows, workerFactory } = options;\n const metricTransport = options.metricTransport ?? transport;\n const metricExecution = options.metricExecution ?? options.execution;\n const store = useMemo(\n () => options.store ?? memoryComputedColumnStore(),\n [options.store],\n );\n const [catalogue, setCatalogue] = useState<{\n dataset: string;\n store: ComputedColumnStore;\n items: ComputedColumn[];\n } | null>(null);\n const definitions = useMemo(\n () =>\n catalogue?.dataset === schema.name && catalogue.store === store\n ? catalogue.items\n : [],\n [catalogue, schema.name, store],\n );\n const [loading, setLoading] = useState(false),\n [error, setError] = useState<string | null>(null);\n const catalogueRequest = useRef<AbortController | null>(null);\n const reload = useCallback(async () => {\n catalogueRequest.current?.abort();\n const ac = new AbortController();\n catalogueRequest.current = ac;\n setLoading(true);\n setError(null);\n try {\n const items = await store.list(schema.name, ac.signal);\n if (ac.signal.aborted) return;\n const valid = items\n .map(validateComputedColumn)\n .sort((a, b) => a.id.localeCompare(b.id));\n if (new Set(valid.map((c) => c.id)).size !== valid.length)\n throw new Error(\"Duplicate computed column IDs.\");\n setCatalogue((previous) =>\n previous?.dataset === schema.name &&\n previous.store === store &&\n JSON.stringify(previous.items) === JSON.stringify(valid)\n ? previous\n : { dataset: schema.name, store, items: valid },\n );\n } catch (e) {\n if (!ac.signal.aborted)\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n if (!ac.signal.aborted) setLoading(false);\n }\n }, [store, schema.name]);\n useEffect(() => {\n void reload();\n return () => catalogueRequest.current?.abort();\n }, [reload]);\n useEffect(\n () =>\n store.subscribe?.(schema.name, () => {\n void reload();\n }),\n [store, schema.name, reload],\n );\n useEffect(() => {\n const focus = () => {\n void reload();\n };\n window.addEventListener(\"focus\", focus);\n return () => window.removeEventListener(\"focus\", focus);\n }, [reload]);\n const inputFields = useMemo(\n () =>\n schema.fields\n .filter(isSelectable)\n .filter(\n (f) =>\n f.source.kind === \"backend\" ||\n (f.source.accessor && f.source.dependencies && !isGroupLinkField(f)),\n ),\n [schema],\n );\n const compile = useCallback(\n (source: string, editingId?: string): FormulaPlan => {\n const stack = new Set<string>(editingId ? [editingId] : []);\n let expanded = 0;\n const resolve = (name: string): FormulaPlan | undefined => {\n if (!isComputedField(name)) return undefined;\n const id = name.slice(\"@computed/\".length),\n def = definitions.find((d) => d.id === id);\n if (!def) throw new Error(`Computed column unavailable: ${id}`);\n if (stack.has(id))\n throw new Error(`Circular computed-column reference: ${def.label}`);\n if (stack.size >= 20 || ++expanded > 100)\n throw new Error(\"Computed dependency graph is too large.\");\n stack.add(id);\n try {\n return compileFormula(def.expression.source, inputFields, resolve);\n } finally {\n stack.delete(id);\n }\n };\n return compileFormula(source, inputFields, resolve);\n },\n [inputFields, definitions],\n );\n const plans = useMemo(\n () =>\n new Map<string, { plan?: FormulaPlan; error?: string }>(\n definitions.map((def) => {\n try {\n return [\n def.id,\n { plan: compile(def.expression.source, def.id) },\n ] as const;\n } catch (e) {\n return [\n def.id,\n { error: e instanceof Error ? e.message : String(e) },\n ] as const;\n }\n }),\n ),\n [definitions, compile],\n );\n const backendDependencies = useCallback(\n (plan: FormulaPlan) =>\n [\n ...new Set(\n plan.dependencies.flatMap((name) => {\n const f = inputFields.find((f) => f.name === name);\n return f?.source.kind === \"backend\"\n ? [name]\n : (f?.source.dependencies ?? []);\n }),\n ),\n ]\n .filter((name) =>\n schema.fields.some(\n (f) => f.name === name && f.source.kind === \"backend\",\n ),\n )\n .sort(),\n [schema, inputFields],\n );\n const inputsFor = useCallback(\n (plan: FormulaPlan, batch: Row[]) => {\n let size = 0;\n return batch.map((row) => {\n const values: Record<string, FormulaValue> = Object.create(null);\n for (const name of plan.dependencies) {\n const field = inputFields.find((f) => f.name === name)!;\n const raw = readFieldValue(field, row);\n values[name] =\n raw instanceof Date ? raw.toISOString() : (raw as FormulaValue);\n }\n size += JSON.stringify(values).length;\n if (size > 16000000)\n throw new Error(\n \"Input sample exceeds 16 MB. Reduce the rows to process.\",\n );\n return values;\n });\n },\n [inputFields],\n );\n const activeSelect = query.select.length\n ? query.select\n : (schema.defaultSelect ?? []);\n const activeIds = activeSelect\n .filter((c) => isComputedField(c.field))\n .map((c) => c.field.slice(\"@computed/\".length))\n .sort()\n .join(\",\");\n const [evaluated, setEvaluated] = useState<{\n rows: Row[];\n plans: typeof plans;\n values: Map<string, FormulaResult[]>;\n } | null>(null);\n useEffect(() => {\n const ac = new AbortController();\n const values = new Map<string, FormulaResult[]>();\n void (async () => {\n for (const id of activeIds.split(\",\").filter(Boolean)) {\n if (\n options.execution?.fields[computedFieldName(id)]?.select &&\n transport\n )\n continue;\n const entry = plans.get(id);\n if (!entry?.plan) continue;\n try {\n values.set(\n id,\n await evaluateFormulaRows(\n entry.plan.ast,\n inputsFor(entry.plan, rows),\n ac.signal,\n workerFactory,\n ),\n );\n } catch (e) {\n if (ac.signal.aborted) return;\n values.set(\n id,\n rows.map(() => ({\n value: null,\n error: e instanceof Error ? e.message : String(e),\n })),\n );\n }\n }\n if (!ac.signal.aborted) setEvaluated({ rows, plans, values });\n })();\n return () => ac.abort();\n }, [\n activeIds,\n rows,\n plans,\n inputsFor,\n workerFactory,\n options.execution,\n transport,\n ]);\n const displaySchema = useMemo<FieldSchema<Row>>(() => {\n const indices = new Map(rows.map((row, i) => [row, i]));\n const fields: FieldDef<Row>[] = definitions.map((def) => {\n const entry = plans.get(def.id);\n return {\n name: computedFieldName(def.id),\n label: def.label,\n type:\n entry?.plan?.type === \"null\" ? \"text\" : (entry?.plan?.type ?? \"text\"),\n group: \"Computed columns\",\n source: {\n kind: \"derived\",\n computedId: def.id,\n dependencies: entry?.plan ? backendDependencies(entry.plan) : [],\n accessor: (row: Row) => {\n if (entry?.error) return { computedError: entry.error };\n if (\n options.execution?.fields[computedFieldName(def.id)]?.select &&\n transport\n ) {\n if (\n options.serverExecution?.profile !==\n options.execution.profile ||\n options.serverExecution?.planToken !==\n options.execution.planToken ||\n options.serverExecution?.snapshot !==\n options.execution.snapshot ||\n executionRevision(options.execution, def.id) !== def.revision ||\n executionRevision(options.serverExecution, def.id) !==\n def.revision\n )\n return {\n computedError:\n \"Definition changed or values are pending. Refresh the server handshake.\",\n };\n const idField = schema.fields.find(\n (f) => f.name === schema.idField,\n );\n const id = idField\n ? (readFieldValue(idField, row) as RowId)\n : null;\n const server =\n id === null\n ? undefined\n : options.serverComputed?.get(id)?.[def.id];\n return server\n ? server.error\n ? { computedError: server.error.code }\n : server.value\n : { computedError: \"Server computed result unavailable.\" };\n }\n const result =\n evaluated?.rows === rows && evaluated.plans === plans\n ? evaluated.values.get(def.id)?.[indices.get(row) ?? -1]\n : undefined;\n return result?.error\n ? { computedError: result.error }\n : result\n ? result.value\n : { computedError: \"Calculating…\" };\n },\n },\n filter: { enabled: options.execution?.fields[computedFieldName(def.id)]?.filter === true &&\n executionRevision(options.execution, def.id) === def.revision && !!entry?.plan && !hasRegex(entry.plan) },\n sort: {\n enabled:\n !!transport &&\n !!options.execution?.fields[computedFieldName(def.id)]?.sort &&\n executionRevision(options.execution, def.id) === def.revision &&\n !!entry?.plan &&\n !hasRegex(entry.plan),\n },\n aggregate: {\n measure: !!entry?.plan,\n groupable:\n !!metricTransport &&\n !!metricExecution?.fields[computedFieldName(def.id)]?.group &&\n executionRevision(metricExecution, def.id) === def.revision &&\n !!entry?.plan &&\n !hasRegex(entry.plan),\n },\n };\n });\n for (const col of activeSelect)\n if (\n isComputedField(col.field) &&\n !fields.some((f) => f.name === col.field)\n )\n fields.push({\n name: col.field,\n label: col.field.slice(10),\n type: \"text\",\n source: {\n kind: \"derived\",\n computedId: col.field.slice(10),\n accessor: () => ({\n computedError: loading\n ? \"Loading definition…\"\n : \"Definition unavailable. Reload the catalogue or contact its owner.\",\n }),\n },\n filter: { enabled: false },\n sort: { enabled: false },\n aggregate: { measure: false, groupable: false },\n });\n return { ...schema, fields: [...schema.fields, ...fields] };\n }, [\n schema,\n definitions,\n plans,\n backendDependencies,\n evaluated,\n rows,\n query.select,\n schema.defaultSelect,\n loading,\n transport,\n options.execution,\n metricTransport,\n metricExecution,\n options.serverComputed,\n options.serverExecution,\n ]);\n const save = useCallback(\n async (column: ComputedColumnDraft, expectedRevision: string | null) => {\n compile(column.expression.source, column.id);\n const saved = validateComputedColumn(\n await store.save(schema.name, column, expectedRevision),\n );\n setCatalogue((prev) => ({\n dataset: schema.name,\n store,\n items: [\n ...(prev?.dataset === schema.name && prev.store === store\n ? prev.items.filter((d) => d.id !== saved.id)\n : []),\n saved,\n ],\n }));\n return saved;\n },\n [compile, store, schema.name],\n );\n const previewRequest = useRef<AbortController | null>(null);\n const preview = useCallback(\n async (\n source: string,\n count: number,\n signal?: AbortSignal,\n editingId?: string,\n includeInputs = true,\n ): Promise<ColumnPreview> => {\n previewRequest.current?.abort();\n const controller = new AbortController();\n previewRequest.current = controller;\n const abort = () => controller.abort();\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) controller.abort();\n try {\n if (!Number.isInteger(count) || count < 1 || count > 10000)\n throw new Error(\"Choose between 1 and 10,000 rows.\");\n const plan = compile(source, editingId);\n let batch: Row[] = [],\n total = 0;\n if (transport) {\n const request = {\n ...query,\n ...(options.previewQuery?.grouping\n ? { grouping: options.previewQuery.grouping } : {}),\n select: [\n ...new Set([schema.idField, ...backendDependencies(plan)]),\n ].map((field) => ({ field })),\n limit: Math.min(count, 500),\n offset: 0,\n };\n const now = options.now ?? Date.now();\n const pageSize = Math.min(500, transport.queryCapabilities.maxRows);\n if (!Number.isInteger(pageSize) || pageSize < 1) throw Error(\"Invalid negotiated preview row limit.\");\n while (batch.length < count) {\n const res = await fetchPreviewRows(transport,\n {\n ...request,\n offset: batch.length,\n limit: Math.min(pageSize, count - batch.length),\n },\n schema, options.execution, definitions, now, controller.signal, options.sourceSchema,\n );\n total = res.total;\n batch.push(...res.rows.slice(0, count - batch.length));\n if (!res.rows.length || batch.length >= total) break;\n }\n } else {\n const result = applyQuery(\n clientRows ?? [],\n { ...query, limit: count, offset: 0 },\n schema,\n );\n batch = result.rows;\n total = result.total;\n }\n const inputs = inputsFor(plan, batch),\n results = await evaluateFormulaRows(\n plan.ast,\n inputs,\n controller.signal,\n workerFactory,\n );\n if (controller.signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n return groupPreview(\n includeInputs ? plan.dependencies : [],\n inputs,\n results,\n total,\n );\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n if (previewRequest.current === controller) previewRequest.current = null;\n }\n },\n [\n compile,\n transport,\n query,\n schema,\n backendDependencies,\n clientRows,\n inputsFor,\n workerFactory,\n options.execution,\n definitions,\n options.sourceSchema,\n options.previewQuery?.grouping,\n options.now,\n ],\n );\n useEffect(() => () => previewRequest.current?.abort(), [preview]);\n return {\n displaySchema,\n api: {\n definitions,\n catalogue: displaySchema.fields,\n loading,\n error,\n reload,\n save,\n compile,\n preview,\n },\n };\n}\n","import {\n formulaRuntime,\n type FormulaNode,\n type FormulaResult,\n type FormulaValue,\n} from \"@pythia-software/query-table-core\";\n\nexport type FormulaWorkerFactory = () => Worker;\n/** Host applications with a restrictive CSP can supply their own worker factory. */\nexport const createFormulaWorker: FormulaWorkerFactory = () => {\n const code = `const evaluate = ${formulaRuntime.toString()}; self.onmessage = e => { const { ast, inputs } = e.data; self.postMessage(inputs.map(row => evaluate(ast, row))); };`;\n const url = URL.createObjectURL(\n new Blob([code], { type: \"text/javascript\" }),\n );\n try {\n return new Worker(url);\n } finally {\n URL.revokeObjectURL(url);\n }\n};\nexport function evaluateFormulaRows(\n ast: FormulaNode,\n inputs: Record<string, FormulaValue>[],\n signal?: AbortSignal,\n factory: FormulaWorkerFactory = createFormulaWorker,\n): Promise<FormulaResult[]> {\n if (signal?.aborted)\n return Promise.reject(new DOMException(\"Aborted\", \"AbortError\"));\n if (!inputs.length) return Promise.resolve([]);\n return new Promise((resolve, reject) => {\n let worker: Worker;\n try {\n worker = factory();\n } catch (e) {\n reject(\n new Error(\n `Formula worker unavailable: ${e instanceof Error ? e.message : String(e)}`,\n ),\n );\n return;\n }\n let timer: ReturnType<typeof setTimeout>;\n const started = Date.now();\n let offset = 0;\n const results: FormulaResult[] = [];\n const cleanup = () => {\n clearTimeout(timer);\n worker.terminate();\n signal?.removeEventListener(\"abort\", abort);\n };\n const abort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n const send = () => {\n if (Date.now() - started > 30000) {\n cleanup();\n reject(\n new Error(\n \"Formula exceeded the 30-second processing budget. Reduce the row count or simplify the formula.\",\n ),\n );\n return;\n }\n timer = setTimeout(() => {\n cleanup();\n reject(\n new Error(\n \"Formula timed out. Check the regex or reduce the row count.\",\n ),\n );\n }, 2000);\n try {\n worker.postMessage({ ast, inputs: inputs.slice(offset, offset + 200) });\n } catch (e) {\n cleanup();\n reject(e);\n }\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n worker.onerror = () => {\n cleanup();\n reject(new Error(\"Formula worker failed.\"));\n };\n worker.onmessage = (event: MessageEvent<FormulaResult[]>) => {\n clearTimeout(timer);\n results.push(...event.data);\n offset += event.data.length;\n if (offset >= inputs.length) {\n cleanup();\n resolve(results);\n } else send();\n };\n send();\n });\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { QueryRequestV3, Transport } from \"@pythia-software/query-table-core\";\n\nexport interface RequestActivityEntry {\n id: number;\n kind: string;\n startedAt: number;\n status: \"pending\" | \"success\" | \"error\" | \"aborted\";\n durationMs?: number;\n error?: string;\n}\nexport interface RequestActivityApi {\n /** Newest first; bounded to the latest 100 calls. Query values and results are never retained. */\n entries: readonly RequestActivityEntry[];\n clear: () => void;\n}\n/** What a v3 request asks for; values never leave the request. */\nfunction requestKind(request: QueryRequestV3 | undefined): string {\n return request?.distinct ? \"DistinctValues\" : request?.rows ? \"Rows\" : \"Metrics\";\n}\n\n/** Observe the transport boundary without changing receiver, arguments or errors. */\nexport function observeTransport<Row>(\n transport: Transport<Row>,\n publish: (entry: RequestActivityEntry) => void,\n nextId: () => number,\n): Transport<Row> {\n const wrappers = new Map<PropertyKey, unknown>();\n return new Proxy(Object.create(transport) as Transport<Row>, {\n get(_target, key) {\n const method = Reflect.get(transport, key, transport);\n if (key !== \"fetchQueryV3\" || typeof method !== \"function\")\n return method;\n if (!wrappers.has(key))\n wrappers.set(key, async (...args: unknown[]) => {\n const signal = args[1] as AbortSignal | undefined;\n const start = performance.now();\n const entry: RequestActivityEntry = {\n id: nextId(),\n kind: requestKind(args[0] as QueryRequestV3 | undefined),\n startedAt: Date.now(),\n status: \"pending\",\n };\n publish(entry);\n let done = false;\n const finish = (\n status: RequestActivityEntry[\"status\"],\n error?: unknown,\n ) => {\n if (done) return;\n done = true;\n publish({\n ...entry,\n status,\n durationMs: Math.max(0, performance.now() - start),\n ...(error !== undefined\n ? {\n error:\n error instanceof Error ? error.message : String(error),\n }\n : {}),\n });\n };\n const abort = () => finish(\"aborted\");\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) abort();\n try {\n const result = await method.apply(transport, args);\n finish(signal?.aborted ? \"aborted\" : \"success\");\n return result;\n } catch (error) {\n finish(\n signal?.aborted ||\n (error instanceof Error && error.name === \"AbortError\")\n ? \"aborted\"\n : \"error\",\n error,\n );\n throw error;\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n }\n });\n return wrappers.get(key);\n },\n });\n}\n\nexport function useRequestActivity<Row>(\n source: Transport<Row> | undefined,\n metricSource?: Transport<Row>,\n) {\n const [entries, setEntries] = useState<RequestActivityEntry[]>([]);\n const sequence = useRef(0),\n mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n const publish = useCallback((entry: RequestActivityEntry) => {\n if (mounted.current)\n setEntries((previous) =>\n [entry, ...previous.filter((e) => e.id !== entry.id)]\n .sort((a, b) => b.id - a.id)\n .slice(0, 100),\n );\n }, []);\n const transport = useMemo(\n () =>\n source\n ? observeTransport(source, publish, () => ++sequence.current)\n : undefined,\n [source, publish],\n );\n const clear = useCallback(\n () =>\n setEntries((previous) => previous.filter((e) => e.status === \"pending\")),\n [],\n );\n const metricTransport = useMemo(\n () => !metricSource || metricSource === source\n ? transport\n : observeTransport(metricSource, publish, () => ++sequence.current),\n [metricSource, source, transport, publish],\n );\n const activity: RequestActivityApi = useMemo(\n () => ({ entries, clear }),\n [entries, clear],\n );\n return { transport, metricTransport, activity };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n metricComputationKey,\n type AggregationClause,\n type AggregationResult,\n type FieldSchema,\n type QueryError,\n type QueryState,\n type Transport,\n} from \"@pythia-software/query-table-core\";\nimport { executeMetrics, usesLocalMetricPage, type MetricExecutionContext } from \"./metricExecution\";\n\nexport interface AggregationsApiState {\n results: AggregationResult | null;\n loading: boolean;\n error: QueryError | Error | null;\n preview: (\n clauses: AggregationClause[],\n signal?: AbortSignal,\n ) => Promise<AggregationResult>;\n}\n\ntype BatchState = Pick<AggregationsApiState, \"results\" | \"loading\" | \"error\">;\n\nfunction localPage<Row>(clause: AggregationClause, context: MetricExecutionContext<Row>) {\n try {\n return usesLocalMetricPage(clause, context);\n } catch {\n // Keep invalid page inputs behind the readiness gate; execution reports\n // their diagnostics once the page is available.\n return !context.executeV3 && clause.scope === \"shownRows\";\n }\n}\n\n/** Separate lifecycles let remote populations run while a local page loads. */\nfunction useMetricBatch<Row>(\n query: QueryState,\n clauses: AggregationClause[],\n context: MetricExecutionContext<Row>,\n debounceMs: number,\n nonce: number,\n validateQuery: ((q: QueryState) => void) | undefined,\n enabled: boolean,\n page: boolean,\n): BatchState {\n const shown = clauses.some(c => c.scope === \"shownRows\");\n const key = JSON.stringify([\n query.where,\n metricComputationKey(clauses),\n shown ? [query.orderBy, query.limit, query.offset] : null,\n context.revisions ?? {}, context.execution ?? null, context.now,\n context.strictLocalMetrics, context.queryContextKey,\n page ? context.shownFields : null,\n ]);\n const localDataset = !context.executeV3 && !context.transport;\n // Standalone callers can derive the page from a complete client dataset.\n // useQueryTable supplies an explicit gate for its committed-page lifecycle.\n const pageReady = context.rowsReady ?? (localDataset && context.clientRows !== undefined);\n const validationToken = useMemo(() => ({}), [\n key, context.schema, context.transport, nonce, validateQuery, enabled,\n ]);\n const token = useMemo(() => ({}), [\n key, context.schema, context.transport,\n localDataset ? context.clientRows : undefined,\n debounceMs, nonce, validateQuery, enabled, page, context.workerFactory,\n page ? context.shownRows : undefined,\n page ? context.rowsReady : undefined,\n page ? context.rowsError : undefined,\n ]);\n const latest = useRef({ query, clauses, context, validateQuery });\n latest.current = { query, clauses, context, validateQuery };\n const [state, setState] = useState<BatchState & { token: object; validationToken?: object }>(\n { token, results: null, loading: enabled && clauses.length > 0, error: null },\n );\n useEffect(() => {\n if (!enabled || !latest.current.clauses.length) return;\n const ac = new AbortController();\n const timer = setTimeout(() => {\n const current = latest.current;\n // Validate even while waiting so an invalid query remains repairable.\n try {\n current.validateQuery?.(current.query);\n } catch (e) {\n setState({ token, validationToken, results: null, loading: false, error: e instanceof Error ? e : Error(String(e)) });\n return;\n }\n if (page && !pageReady) return;\n void executeMetrics({ ...current.query, aggregations: current.clauses }, current.context, ac.signal)\n .then(results => {\n if (!ac.signal.aborted) setState({ token, results, loading: false, error: null });\n })\n .catch(e => {\n if (!ac.signal.aborted) setState({ token, results: null, loading: false, error: e instanceof Error ? e : Error(String(e)) });\n });\n }, debounceMs);\n return () => { ac.abort(); clearTimeout(timer); };\n }, [token]);\n if (!enabled || !clauses.length) return { results: null, loading: false, error: null };\n // Query rejection does not become obsolete just because a host allocates\n // another rows array while repairing the same invalid query.\n if (state.validationToken === validationToken && state.error) return state;\n if (page && !pageReady && context.rowsError)\n return { results: null, loading: false, error: context.rowsError };\n // Invalidate during render too: an old page must never look current between\n // the host's render and the effect that starts its replacement request.\n if (state.token !== token) return { results: null, loading: true, error: null };\n return state;\n}\n\n/** Fetch state is keyed by computation and scope, never card presentation. */\nexport function useAggregations<Row>(\n query: QueryState,\n schema: FieldSchema<Row>,\n transport: Transport<Row> | undefined,\n clientRows: Row[] | undefined,\n debounceMs: number,\n nonce: number,\n validateQuery?: (q: QueryState) => void,\n options: Omit<MetricExecutionContext<Row>, \"schema\" | \"transport\" | \"clientRows\"> = {},\n enabled = true,\n): AggregationsApiState {\n const context = { schema, transport, clientRows, ...options };\n const clauses = query.aggregations ?? [];\n const pageClauses = clauses.filter(c => localPage(c, context));\n const otherClauses = clauses.filter(c => !pageClauses.includes(c));\n const other = useMetricBatch(query, otherClauses, context, debounceMs, nonce, validateQuery, enabled, false);\n const page = useMetricBatch(query, pageClauses, context, debounceMs, nonce, validateQuery, enabled, true);\n\n const previewKey = JSON.stringify([\n query.where, query.orderBy, query.limit, query.offset,\n metricComputationKey(clauses), options.revisions, options.execution,\n options.now, options.strictLocalMetrics, options.queryContextKey,\n ]);\n const previewToken = useMemo(() => ({}), [previewKey, schema, transport, nonce, validateQuery, enabled, options.workerFactory]);\n const pageKey = JSON.stringify([query.orderBy, query.limit, query.offset, options.shownFields]);\n const pageToken = useMemo(() => ({}), [previewToken, pageKey, clientRows, options.shownRows, options.rowsReady, options.rowsError]);\n const latest = useRef({ query, context, validateQuery, enabled, previewToken, pageToken });\n latest.current = { query, context, validateQuery, enabled, previewToken, pageToken };\n const previews = useRef(new Set<{\n controller: AbortController;\n page: boolean;\n previewToken: object;\n pageToken: object;\n }>());\n useEffect(() => () => {\n for (const pending of previews.current)\n if (pending.previewToken === previewToken) pending.controller.abort();\n }, [previewToken]);\n useEffect(() => () => {\n for (const pending of previews.current)\n if (pending.page && pending.pageToken === pageToken) pending.controller.abort();\n }, [pageToken]);\n const preview = useCallback(async (draftClauses: AggregationClause[], signal?: AbortSignal) => {\n const current = latest.current;\n if (!current.enabled) throw Error(\"Resolve the query link before previewing metrics.\");\n const draft = { ...current.query, aggregations: draftClauses };\n current.validateQuery?.(draft);\n const pending = {\n controller: new AbortController(),\n page: draftClauses.some(c => localPage(c, current.context)),\n previewToken: current.previewToken,\n pageToken: current.pageToken,\n };\n const cancel = () => pending.controller.abort();\n signal?.addEventListener(\"abort\", cancel, { once: true });\n if (signal?.aborted) cancel();\n previews.current.add(pending);\n try {\n const result = await executeMetrics(draft, current.context, pending.controller.signal);\n if (pending.controller.signal.aborted || current.previewToken !== latest.current.previewToken ||\n (pending.page && current.pageToken !== latest.current.pageToken))\n throw new DOMException(\"Aborted\", \"AbortError\");\n return result;\n } finally {\n previews.current.delete(pending);\n signal?.removeEventListener(\"abort\", cancel);\n }\n }, []);\n\n const orderKey = JSON.stringify(clauses.map(c => c.id));\n const results = useMemo(() => {\n if (!pageClauses.length) return other.results;\n if (!otherClauses.length) return page.results;\n if (!page.results || !other.results) return null;\n const byId = new Map([...page.results.metrics, ...other.results.metrics].map(m => [m.id, m]));\n return { metrics: clauses.flatMap(c => byId.get(c.id) ?? []) };\n }, [orderKey, pageClauses.length, otherClauses.length, page.results, other.results]);\n return { results, loading: page.loading || other.loading, error: page.error ?? other.error, preview };\n}\n","import {\n QueryError,\n applyAggregations,\n normalizeQueryState,\n evaluateMetrics,\n metricPlans,\n metricDependencies,\n hasRegex,\n metricPopulationError,\n hasMetricSeries,\n planMetricSeries,\n predicatesOf,\n sourceExecutionSchema,\n toQueryRequestV3,\n validateQueryResultV3,\n validateMetric,\n selectMetricShownRows,\n readFieldValue,\n resolveFieldName,\n isComputedField,\n type AggregationClause,\n type AggregationResult,\n type FieldSchema,\n type FormulaNode,\n type FormulaPlan,\n type FormulaResult,\n type FormulaValue,\n type QueryState,\n type Transport,\n type ComputedExecution,\n} from \"@pythia-software/query-table-core\";\nimport {\n evaluateFormulaRows,\n type FormulaWorkerFactory,\n} from \"./formulaWorker\";\n\nexport interface MetricExecutionContext<Row> {\n /** Remote execution; defaults to executeV3Metrics over `transport`. */\n executeV3?: (query: QueryState, signal?: AbortSignal) => Promise<AggregationResult>;\n queryContextKey?: string;\n schema: FieldSchema<Row>;\n /** One clock shared by source grouping, HAVING, rows and local metrics. */\n now?: number;\n /** Group projections use typed semantics even for shorthand metric clauses. */\n strictLocalMetrics?: boolean;\n transport?: Transport<Row> | undefined;\n clientRows?: Row[] | undefined;\n shownRows?: Row[] | undefined;\n rowsReady?: boolean | undefined;\n rowsError?: Error | null | undefined;\n shownFields?: readonly string[] | undefined;\n resolveComputed?: ((name: string) => FormulaPlan | undefined) | undefined;\n workerFactory?: FormulaWorkerFactory | undefined;\n revisions?: Record<string, string> | undefined;\n execution?: ComputedExecution;\n}\nconst abort = (signal?: AbortSignal) => {\n if (signal?.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n};\n\n/** Keep dispatch and the hook's committed-page lifecycle on the same route:\n * without a remote executor, shown-row metrics read the committed page. So do\n * shown-row regex metrics a server does not advertise (regexAggregateExpressions),\n * which run in a formula worker over that page. */\nexport function usesLocalMetricPage<Row>(\n clause: AggregationClause,\n context: MetricExecutionContext<Row>,\n): boolean {\n if (clause.scope !== \"shownRows\") return false;\n if (!context.executeV3 && !context.transport) return true;\n if (context.transport?.queryCapabilities.regexAggregateExpressions) return false;\n try {\n return metricPlans(clause, context.schema, context.resolveComputed).some(hasRegex);\n } catch {\n return false; // An invalid metric fails on the server, with its diagnostic.\n }\n}\n\n/** Run a metric batch as one v3 request (`rows: false`). A clause using a\n * population control the server does not advertise fails on its own; the\n * rest of the batch is still sent. `query.grouping`, when present, is the\n * population the metrics describe. */\nexport async function executeV3Metrics<Row>(\n transport: Transport<Row>,\n query: QueryState,\n baseSchema: FieldSchema<Row>,\n resultSchema: FieldSchema<Row>,\n execution: ComputedExecution | undefined,\n now: number,\n signal?: AbortSignal,\n): Promise<AggregationResult> {\n const capabilities = transport.queryCapabilities;\n const refused = new Map<string, QueryError>();\n for (const clause of query.aggregations ?? []) {\n // An operation this client cannot read fails its own card, not the batch.\n if (clause.unsupportedOp) {\n refused.set(clause.id, new QueryError(\"invalid_metric\", `Metric ${clause.id} uses an unsupported operation: ${clause.unsupportedOp}.`, { metricId: clause.id }));\n continue;\n }\n const issue = metricPopulationError(clause, { filters: capabilities.metricFilters, minCount: capabilities.metricMinCount, minCountMeasures: capabilities.metricMinCountMeasures });\n if (issue) refused.set(clause.id, new QueryError(\"capability_unsupported\", issue, { metricId: clause.id }));\n }\n let runnable = (query.aggregations ?? []).filter(clause => !refused.has(clause.id));\n const refusal = (q: QueryState): QueryError | undefined => {\n try { toQueryRequestV3(q, baseSchema, capabilities, execution, { now, rows: false }); }\n catch (error) { if (error instanceof QueryError) return error; throw error; }\n };\n // Only shown-row metrics depend on the page. The rest omit its order and\n // window, so an order only the client can evaluate never refuses them.\n const unpaged = { ...query, orderBy: [], offset: 0 };\n const shown = runnable.filter(clause => clause.scope === \"shownRows\");\n // Probe the page without metrics, so an invalid metric is never mistaken\n // for an order the server cannot run (and never blocks the others).\n const page = shown.length ? refusal({ ...query, aggregations: [] }) : undefined;\n if (page && !refusal({ ...unpaged, aggregations: [] })) {\n for (const clause of shown) refused.set(clause.id, page);\n runnable = runnable.filter(clause => clause.scope !== \"shownRows\");\n }\n let metrics: AggregationResult[\"metrics\"] = [];\n if (runnable.length) {\n const paged = runnable.some(clause => clause.scope === \"shownRows\");\n const request = toQueryRequestV3({ ...(paged ? query : unpaged), aggregations: runnable }, baseSchema, capabilities, execution, { now, rows: false });\n const result = await transport.fetchQueryV3(request, signal);\n validateQueryResultV3(result, request, resultSchema);\n metrics = result.metrics;\n }\n if (!refused.size) return { metrics };\n const byId = new Map(metrics.map(metric => [metric.id, metric]));\n return { metrics: (query.aggregations ?? []).flatMap((clause): AggregationResult[\"metrics\"] => {\n const issue = refused.get(clause.id);\n if (issue) return [{ id: clause.id, buckets: [], error: issue.message, errorCode: issue.code }];\n const metric = byId.get(clause.id);\n return metric ? [metric] : [];\n }) };\n}\n\n/** Local regex inputs run in terminable workers; reduction uses only cached values. */\nasync function localMetrics<Row>(\n rows: Row[],\n query: QueryState,\n context: MetricExecutionContext<Row>,\n signal?: AbortSignal,\n): Promise<AggregationResult> {\n // Keep legacy aggregates on their permissive compatibility path. Advanced\n // metrics still use the typed formula engine and isolated regex workers.\n const originalClauses = query.aggregations ?? [];\n const advanced = (query.aggregations ?? []).filter(\n (c) =>\n context.strictLocalMetrics ||\n c.dateGrouping ||\n isComputedField(c.field ?? \"\") ||\n c.groupBy.some(isComputedField) ||\n c.diagnostics?.length ||\n c.expression !== undefined ||\n c.expressionY !== undefined ||\n c.scope !== undefined ||\n c.distribution ||\n c.sort ||\n c.groupLimit !== undefined ||\n c.where !== undefined ||\n c.minCount !== undefined ||\n hasMetricSeries(c),\n );\n if (\n advanced.length &&\n (originalClauses.length > 20 ||\n normalizeQueryState(query).aggregations?.length !==\n originalClauses.length)\n )\n return evaluateMetrics(rows, query, context.schema, {\n ...(context.now !== undefined ? { now: context.now } : {}),\n ...(signal ? { signal } : {}),\n ...(context.resolveComputed\n ? { resolveComputed: context.resolveComputed }\n : {}),\n });\n const legacy = (query.aggregations ?? []).filter(\n (c) => !advanced.includes(c),\n );\n const compatible = applyAggregations(\n rows,\n { ...query, aggregations: legacy },\n context.schema,\n {\n ...(context.now !== undefined ? { now: context.now } : {}),\n ...(signal ? { signal } : {}),\n },\n );\n if (!advanced.length) return compatible;\n query = { ...query, aggregations: advanced };\n const options = {\n ...(context.now !== undefined ? { now: context.now } : {}),\n ...(context.resolveComputed\n ? { resolveComputed: context.resolveComputed }\n : {}),\n ...(signal ? { signal } : {}),\n };\n for (const clause of query.aggregations ?? []) {\n const diagnostics = validateMetric(\n clause,\n context.schema,\n context.resolveComputed,\n );\n if (diagnostics.length)\n throw new QueryError(\"invalid_metric\", diagnostics.map((d) => d.message).join(\" \"), { metricId: clause.id });\n }\n const requiresPage = (query.aggregations ?? []).some(\n (clause) => clause.scope === \"shownRows\",\n );\n const page = requiresPage\n ? selectMetricShownRows(rows, query, context.schema, {\n ...options,\n ...(context.rowsReady && context.shownRows\n ? { shownRows: context.shownRows }\n : {}),\n })\n : [];\n const caches = new Map<string, Map<Row, FormulaResult>>();\n for (const clause of query.aggregations ?? []) {\n for (const plan of metricPlans(\n clause,\n context.schema,\n context.resolveComputed,\n )) {\n if (!hasRegex(plan)) continue;\n const nodes =\n \"aggregates\" in plan\n ? (\n plan as FormulaPlan & {\n aggregates: Array<{ args: FormulaNode[] }>;\n }\n ).aggregates.flatMap((a) => a.args)\n : [plan.ast];\n for (const node of nodes) {\n if (!hasRegex({ ...plan, ast: node })) continue;\n const key = JSON.stringify(node);\n if (caches.has(key)) continue;\n let bytes = 0;\n const inputs = page.map((row) => {\n const values: Record<string, FormulaValue> = Object.create(null);\n for (const name of plan.dependencies) {\n const field = context.schema.fields.find((f) => f.name === name);\n if (!field) throw Error(`Unavailable metric input: ${name}`);\n const raw = readFieldValue(field, row);\n values[name] =\n raw instanceof Date\n ? raw.toISOString()\n : ((raw ?? null) as FormulaValue);\n }\n bytes += JSON.stringify(values).length;\n if (bytes > 16000000)\n throw Error(\n \"Metric worker input exceeds 16 MB. Reduce the shown rows.\",\n );\n return values;\n });\n const values = await evaluateFormulaRows(\n node,\n inputs,\n signal,\n context.workerFactory,\n );\n caches.set(\n key,\n new Map(page.map((row, i) => [row, values[i]!] as const)),\n );\n }\n }\n }\n abort(signal);\n const typed = evaluateMetrics(rows, query, context.schema, {\n ...options,\n shownRows: page,\n ...(caches.size\n ? {\n evaluateInput: (node: FormulaNode, row: Row, plan: FormulaPlan) => {\n const cached = caches.get(JSON.stringify(node));\n if (cached)\n return (\n cached.get(row) ?? {\n value: null,\n error: \"Metric worker result missing.\",\n }\n );\n // Core calls the override only for regex inputs.\n throw Error(\"Metric regex input was not evaluated in a worker.\");\n },\n }\n : {}),\n });\n const byId = new Map(\n [...compatible.metrics, ...typed.metrics].map((m) => [m.id, m]),\n );\n return { metrics: originalClauses.flatMap((c) => byId.get(c.id) ?? []) };\n}\n\nexport async function executeMetrics<Row>(\n query: QueryState,\n context: MetricExecutionContext<Row>,\n signal?: AbortSignal,\n): Promise<AggregationResult> {\n abort(signal);\n const clauses = query.aggregations ?? [];\n if (!clauses.length) return { metrics: [] };\n // Windows, shares and whole intervals are combined from plain metrics, so\n // every engine below runs them.\n const series = planMetricSeries(query, context.schema, {\n ...(context.now !== undefined ? { now: context.now } : {}),\n ...(context.resolveComputed ? { resolveComputed: context.resolveComputed } : {}),\n });\n if (series) {\n const parts = await Promise.all(\n series.queries.map((part) => executeMetrics(part, context, signal)),\n );\n return { metrics: series.combine(parts.flatMap((part) => part.metrics)) };\n }\n if (context.executeV3 || context.transport) {\n const page = clauses.filter(c => usesLocalMetricPage(c, context));\n const remote = (q: QueryState) => context.executeV3 ? context.executeV3(q, signal)\n : executeV3Metrics(context.transport!, q, context.schema, sourceExecutionSchema(context.schema, context.execution),\n context.execution, context.now ?? Date.now(), signal);\n if (!page.length) return remote(query);\n const { executeV3: _executeV3, transport: _transport, ...local } = context;\n const rest = clauses.filter(c => !page.includes(c));\n const [own, served] = await Promise.all([executeMetrics({ ...query, aggregations: page }, local, signal),\n rest.length ? remote({ ...query, aggregations: rest }) : { metrics: [] }]);\n const byId = new Map([...own.metrics, ...served.metrics].map(metric => [metric.id, metric]));\n return { metrics: clauses.flatMap(c => byId.get(c.id) ?? []) };\n }\n if (context.rowsReady === false && clauses.some(c => usesLocalMetricPage(c, context)))\n throw Error(\"Wait for the current table page before previewing shown-row metrics.\");\n if (context.clientRows)\n return localMetrics(context.clientRows, query, context, signal);\n const shown = clauses.filter(c => usesLocalMetricPage(c, context));\n const matching = clauses.filter(c => !shown.includes(c));\n const results: AggregationResult[\"metrics\"] = [];\n if (shown.length) {\n if (!context.rowsReady || !context.shownRows)\n throw Error(\n \"Wait for the current table page before previewing shown-row metrics.\",\n );\n // Only committed inputs can claim \"shown rows\". Never hydrate them from a\n // newer response with the same IDs; that would mix data snapshots.\n const names = new Set(\n shown.flatMap((clause) => [\n ...clause.groupBy,\n ...(clause.where ?? []).flatMap((term) =>\n predicatesOf(term).map((predicate) => predicate.field),\n ),\n // Includes a measured minimum's field, which the page must also hold.\n ...metricDependencies(clause, context.schema, context.resolveComputed),\n ]),\n );\n for (const name of names) {\n const canonical = resolveFieldName(context.schema, name) ?? name;\n const field = context.schema.fields.find((f) => f.name === canonical);\n const dependencies =\n field?.source.kind === \"derived\"\n ? (field.source.dependencies ?? [])\n : [canonical];\n const loaded = context.shownFields\n ? dependencies.every((dep) => context.shownFields!.includes(dep))\n : field &&\n context.shownRows.every(\n (row) =>\n field.source.kind === \"derived\" ||\n loadedPath(\n row,\n field.source.kind === \"backend\"\n ? (field.source.path ?? field.name)\n : field.name,\n ),\n );\n if (!field || !loaded)\n throw Error(\n `Shown-page input ${name} is not loaded. Add it to the selected columns and refresh, or use a snapshot-capable metric transport.`,\n );\n }\n // Committed shown rows supply the population; original filters still define\n // the calendar domain for completing empty dates.\n const pageQuery = {\n ...query,\n orderBy: [],\n limit: Math.max(1, context.shownRows.length),\n offset: 0,\n aggregations: shown,\n };\n results.push(\n ...(await localMetrics(context.shownRows, pageQuery, context, signal))\n .metrics,\n );\n }\n if (matching.length)\n throw Error(\n \"Remote all-matching metrics require a metric-capable server transport.\",\n );\n abort(signal);\n const byId = new Map(results.map((r) => [r.id, r]));\n return {\n metrics: clauses.map(\n (c) =>\n byId.get(c.id) ?? {\n id: c.id,\n buckets: [],\n error: \"Server omitted this metric.\",\n errorCode: \"internal\" as const,\n },\n ),\n };\n}\n\nfunction loadedPath(row: unknown, path: string): boolean {\n if (!row || typeof row !== \"object\") return false;\n if (path in row) return true;\n let value: unknown = row;\n for (const part of path.split(\".\")) {\n if (value === null) return true;\n if (!value || typeof value !== \"object\" || !(part in value)) return false;\n value = (value as Record<string, unknown>)[part];\n }\n return true;\n}\n","// useSelection — row selection for paged and re-sortable datasets.\n//\n// - Editable Shift-click ranges with a fixed row-ID anchor and a snapshot of\n// the selection before the range, so earlier selections survive resizing.\n// - Display-order changes commit the selection and reset the active range.\n// - Indeterminate header checkbox + select-all-on-page.\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { RowId } from \"@pythia-software/query-table-core\";\n\nexport interface SelectionApi {\n selected: Set<RowId>;\n isSelected: (id: RowId) => boolean;\n /** Toggle one row and start an editable range. With `shiftKey`, resize that\n * range in the current page's order, checking or unchecking according to the\n * anchor's toggle. `additive` + Shift adds a span to the current selection.\n * Missing anchors or changed display order fall back to a plain toggle. */\n toggle: (id: RowId, shiftKey?: boolean, additive?: boolean) => void;\n /** Select / clear every row currently on the page. */\n setPage: (ids: RowId[], selected: boolean) => void;\n /** Atomically replace the complete selection with arbitrary stable row ids. */\n replace: (ids: Iterable<RowId>) => void;\n /** Atomically retain only selected ids that are also present in `ids`. */\n retain: (ids: Iterable<RowId>) => void;\n /** Header checkbox tri-state for the current page. */\n pageState: (pageIds: RowId[]) => \"none\" | \"some\" | \"all\";\n clear: () => void;\n count: number;\n}\n\ninterface SelectionRange {\n anchor: RowId;\n baseline: Set<RowId>;\n selecting: boolean;\n displayedIds: RowId[];\n}\n\ninterface SelectionState {\n selected: Set<RowId>;\n range: SelectionRange | null;\n}\n\nfunction sameOrder(left: RowId[], right: RowId[]): boolean {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\n/** `displayedIds` is the page's id list in display order; the hook uses it to\n * resolve shift-ranges and header tri-state against what the user sees. */\nexport function useSelection(displayedIds: RowId[]): SelectionApi {\n const [{ selected }, setState] = useState<SelectionState>(() => ({\n selected: new Set(),\n range: null,\n }));\n\n useEffect(() => {\n setState((prev) => prev.range && !sameOrder(prev.range.displayedIds, displayedIds)\n ? { selected: prev.selected, range: null }\n : prev);\n }, [displayedIds]);\n\n const toggle = useCallback(\n (id: RowId, shiftKey = false, additive = false) => {\n setState((prev) => {\n const range = prev.range;\n if (shiftKey && range && sameOrder(range.displayedIds, displayedIds)) {\n const i = displayedIds.indexOf(range.anchor);\n const j = displayedIds.indexOf(id);\n if (i !== -1 && j !== -1) {\n const [lo, hi] = i <= j ? [i, j] : [j, i];\n // Additive gestures commit the current range before adding another\n // span. Ordinary Shift gestures always rebuild from its baseline.\n const activeRange = additive\n ? { ...range, baseline: prev.selected, selecting: true }\n : range;\n const next = new Set(activeRange.baseline);\n for (const rowId of displayedIds.slice(lo, hi + 1)) {\n if (activeRange.selecting) next.add(rowId);\n else next.delete(rowId);\n }\n return { selected: next, range: activeRange };\n }\n }\n const next = new Set(prev.selected);\n const selecting = !next.has(id);\n if (selecting) next.add(id);\n else next.delete(id);\n return {\n selected: next,\n range: { anchor: id, baseline: prev.selected, selecting, displayedIds: [...displayedIds] },\n };\n });\n },\n [displayedIds],\n );\n\n const setPage = useCallback((ids: RowId[], select: boolean) => {\n setState((prev) => {\n const next = new Set(prev.selected);\n for (const id of ids) {\n if (select) next.add(id);\n else next.delete(id);\n }\n return { selected: next, range: null };\n });\n }, []);\n\n const replace = useCallback((ids: Iterable<RowId>) => {\n const next = new Set(ids);\n setState({ selected: next, range: null });\n }, []);\n\n const retain = useCallback((ids: Iterable<RowId>) => {\n const allowed = new Set(ids);\n setState((prev) => {\n const next = new Set<RowId>();\n for (const id of prev.selected) if (allowed.has(id)) next.add(id);\n return { selected: next, range: null };\n });\n }, []);\n\n const pageState = useCallback(\n (pageIds: RowId[]): \"none\" | \"some\" | \"all\" => {\n if (pageIds.length === 0) return \"none\";\n let n = 0;\n for (const id of pageIds) if (selected.has(id)) n++;\n return n === 0 ? \"none\" : n === pageIds.length ? \"all\" : \"some\";\n },\n [selected],\n );\n\n const clear = useCallback(() => {\n setState({ selected: new Set(), range: null });\n }, []);\n\n return useMemo<SelectionApi>(\n () => ({\n selected,\n isSelected: (id) => selected.has(id),\n toggle,\n setPage,\n replace,\n retain,\n pageState,\n clear,\n count: selected.size,\n }),\n [selected, toggle, setPage, replace, retain, pageState, clear],\n );\n}\n","// useSelect — the SELECT list: visible columns, their order, and their widths,\n// all persisted INTO the query (decision #5, so one URL renders identically\n// anywhere). This API mutates QueryState.select; it holds no state of its own.\n// Width changes should be debounced by the caller before they hit the query to\n// avoid flooding history during a drag (useQueryTable does this).\n\nimport { useCallback, useMemo } from \"react\";\nimport type { QueryState, SelectColumn, FieldDef, FieldSchema } from \"@pythia-software/query-table-core\";\nimport { selectedFields } from \"@pythia-software/query-table-core\";\n\nexport interface SelectApi<Row> {\n /** Ordered visible columns (resolved: schema defaults when query.select is empty). */\n visible: SelectColumn[];\n /** The corresponding FieldDefs, same order. */\n fields: FieldDef<Row>[];\n /** Selectable fields not currently shown (for the \"add column\" picker). */\n hidden: FieldDef<Row>[];\n\n show: (field: string) => void;\n hide: (field: string) => void;\n /** Reorder via drag-drop: move `field` to `toIndex` in the visible order. */\n move: (field: string, toIndex: number) => void;\n /** Set a column's pixel width. Other columns keep any live `fit`. */\n setWidth: (field: string, width: number) => void;\n /** Reset to the schema's default columns (clears query.select). */\n reset: () => void;\n}\n\ntype SetQuery = (next: QueryState | ((prev: QueryState) => QueryState)) => void;\n\nexport function useSelect<Row>(query: QueryState, setQuery: SetQuery, schema: FieldSchema<Row>): SelectApi<Row> {\n const fields = useMemo(() => selectedFields(schema, query), [schema, query]);\n\n // The materialized SelectColumn[] (resolve defaults so the UI always has a\n // concrete, reorderable list even before the user customizes it).\n const visible = useMemo<SelectColumn[]>(() => fields.map((f) => columnFor(query.select, f.name)), [fields, query.select]);\n\n const hidden = useMemo<FieldDef<Row>[]>(() => {\n const shown = new Set(fields.map((f) => f.name));\n return schema.fields.filter((f) => !shown.has(f.name) && (f.select?.enabled ?? true));\n }, [schema, fields]);\n\n const writeSelect = useCallback(\n (mutate: (cols: SelectColumn[]) => SelectColumn[]) => {\n setQuery((prev) => {\n // Materialize current (resolved) columns the first time we diverge from defaults.\n const current = prev.select.length ? prev.select : visible;\n return { ...prev, select: mutate([...current]) };\n });\n },\n [setQuery, visible],\n );\n\n const show = useCallback((field: string) => writeSelect((c) => (c.some((x) => x.field === field) ? c : [...c, { field }])), [writeSelect]);\n const hide = useCallback((field: string) => writeSelect((c) => c.filter((x) => x.field !== field)), [writeSelect]);\n const move = useCallback(\n (field: string, toIndex: number) =>\n writeSelect((c) => {\n const from = c.findIndex((x) => x.field === field);\n if (from === -1) return c;\n const [item] = c.splice(from, 1);\n c.splice(Math.max(0, Math.min(toIndex, c.length)), 0, item!);\n return c;\n }),\n [writeSelect],\n );\n const setWidth = useCallback(\n (field: string, width: number) =>\n writeSelect((c) => c.map((x) => (x.field === field ? { ...x, width: Math.round(width) } : x))),\n [writeSelect],\n );\n const reset = useCallback(() => setQuery((prev) => ({ ...prev, select: [] })), [setQuery]);\n\n return { visible, fields, hidden, show, hide, move, setWidth, reset };\n}\n\nfunction columnFor(select: SelectColumn[], name: string): SelectColumn {\n const found = select.find((c) => c.field === name);\n return found ?? { field: name };\n}\n","// useColumnDrag — transient, SHARED state for a column-reorder drag. One instance\n// is owned by useQueryTable and read by BOTH the table headers and the\n// QueryBuilder select chips, so a drag started in either surface live-previews\n// (and dims) the same column in the other. It holds no query state; the reorder\n// is committed to QueryState.select by whichever surface handles the drop.\n\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport interface ColumnDragApi {\n /** Field name currently being dragged, or null when idle. */\n source: string | null;\n /** Insertion index within the order with `source` removed (0..n; n = append). */\n overIndex: number | null;\n /** True while a column drag is in progress. */\n active: boolean;\n /** Changes only for confirmed drops, so surfaces can persist auxiliary positions. */\n dropRevision?: number;\n /** Begin dragging `field` at `index`. Supply the surface order for cross-surface mapping. */\n start: (field: string, index: number, order?: string[]) => void;\n /** Update the insertion slot and optional surface order (no-op if unchanged). */\n over: (index: number, order?: string[]) => void;\n /** End the drag (on drop or cancel). */\n end: (committed?: boolean) => void;\n /** The live order to render while dragging: `source` moved to `overIndex`.\n * Returns `order` unchanged when idle, or when `source` isn't in `order`. */\n preview: (order: string[]) => string[];\n}\n\ninterface DragState {\n source: string;\n overIndex: number;\n order: string[] | undefined;\n moved: boolean;\n}\n\nexport function useColumnDrag(): ColumnDragApi {\n const [state, setState] = useState<DragState | null>(null);\n const [dropRevision, setDropRevision] = useState(0);\n\n const start = useCallback(\n (field: string, index: number, order?: string[]) =>\n setState({\n source: field,\n overIndex: index,\n order: order?.slice(),\n moved: false,\n }),\n [],\n );\n const over = useCallback(\n (index: number, order?: string[]) =>\n // Keep the SAME object reference when unchanged so React can bail out of the\n // re-render — onDragOver fires continuously while the cursor moves.\n setState((s) => {\n if (!s) return s;\n if (\n s.moved &&\n s.overIndex === index &&\n ((!order && !s.order) ||\n (order &&\n s.order &&\n order.length === s.order.length &&\n order.every((name, i) => name === s.order![i])))\n )\n return s;\n return {\n source: s.source,\n overIndex: index,\n order: order?.slice(),\n moved: true,\n };\n }),\n [],\n );\n const end = useCallback((committed = false) => {\n if (committed) setDropRevision((revision) => revision + 1);\n setState(null);\n }, []);\n\n const preview = useCallback(\n (order: string[]): string[] => {\n if (!state || (state.order && !state.moved)) return order;\n const without = order.filter((n) => n !== state.source);\n if (without.length === order.length) return order; // source not part of this list\n let at = Math.max(0, Math.min(state.overIndex, without.length));\n if (state.order) {\n // Surfaces can contain different auxiliary columns (e.g. selection).\n // Resolve the slot against shared neighboring fields, not raw indices.\n const reference = state.order.filter((name) => name !== state.source);\n const slot = Math.max(0, Math.min(state.overIndex, reference.length));\n const following = reference\n .slice(slot)\n .find((name) => without.includes(name));\n const preceding = reference\n .slice(0, slot)\n .reverse()\n .find((name) => without.includes(name));\n if (following != null) at = without.indexOf(following);\n else if (preceding != null) at = without.indexOf(preceding) + 1;\n }\n return [...without.slice(0, at), state.source, ...without.slice(at)];\n },\n [state],\n );\n\n return useMemo(\n () => ({\n source: state?.source ?? null,\n overIndex: state?.overIndex ?? null,\n active: state != null,\n dropRevision,\n start,\n over,\n end,\n preview,\n }),\n [state, dropRevision, start, over, end, preview],\n );\n}\n","// useSavedQueries — named query snapshots over a StorageAdapter.\n//\n// \"Last query\" auto-restore and named saves both flow through the injected\n// StorageAdapter (in-memory by default, explicitly durable when the caller\n// provides one). Loading a saved query pushes its QueryState into the controller.\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { QueryState, SavedQuery, StorageAdapter, QuerySnapshot } from \"@pythia-software/query-table-core\";\n\nexport interface SavedQueriesApi {\n items: SavedQuery[];\n loading: boolean;\n /** Saved query id used as the default view when no query is specified. */\n defaultId: string | null;\n /** Persist the current query under a name. Rejects on duplicate names. */\n save: (name: string) => Promise<SavedQuery>;\n /** Whether the storage adapter supports atomic updates. */\n canUpdate: boolean;\n /** Replace a saved query with the current state, retaining its id and default. */\n update: (id: string) => Promise<SavedQuery>;\n /** Load a saved query into the live controller. Throws, changing nothing,\n * when the table cannot accept it (for example unreadable host state). */\n load: (id: string) => void;\n /** Mark a saved query as the default view. No-op when storage lacks support. */\n setDefault: (id: string) => Promise<void>;\n /** Clear the saved-query default view. */\n clearDefault: () => Promise<void>;\n remove: (id: string) => Promise<void>;\n}\n\nexport function useSavedQueries(\n key: string,\n currentQuery: QueryState,\n applyQueryState: (q: QueryState) => void,\n storage: StorageAdapter,\n /** Injected clock so saves are deterministic/testable. */\n now: () => number,\n snapshot?: (query: QueryState) => Promise<QuerySnapshot | null>,\n): SavedQueriesApi {\n const [items, setItems] = useState<SavedQuery[]>([]);\n const [defaultId, setDefaultId] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const storageRef = useRef(storage);\n storageRef.current = storage;\n\n const refresh = useCallback(async () => {\n const storage = storageRef.current;\n setLoading(true);\n try {\n const [savedItems, defaultSaved] = await Promise.allSettled([\n storage.listSaved(key),\n storage.loadDefaultSaved?.(key) ?? Promise.resolve(null),\n ]);\n // Optional catalogue reads must not block the table or turn a committed\n // save into a reported failure. Keep the last successful data on failure.\n if (savedItems.status === \"fulfilled\") setItems(savedItems.value);\n if (defaultSaved.status === \"fulfilled\") setDefaultId(defaultSaved.value?.id ?? null);\n } finally {\n setLoading(false);\n }\n }, [key]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const save = useCallback(\n async (name: string) => {\n name = name.trim();\n if (!name || name.length > 200) throw Error(\"Saved query name must be between 1 and 200 characters.\");\n const immutable = await snapshot?.(currentQuery);\n const saved = await storage.saveNamed(key, name, currentQuery, now(), immutable?.code);\n await refresh();\n return saved;\n },\n [storage, key, currentQuery, now, refresh, snapshot],\n );\n\n const load = useCallback(\n (id: string) => {\n const found = items.find((q) => q.id === id);\n if (found) applyQueryState(found.query);\n },\n [items, applyQueryState],\n );\n\n const update = useCallback(\n async (id: string) => {\n if (!storage.updateNamed) throw Error(\"This storage adapter does not support saved-query updates.\");\n const immutable = await snapshot?.(currentQuery);\n const saved = await storage.updateNamed(key, id, currentQuery, now(), immutable?.code);\n await refresh();\n return saved;\n },\n [storage, key, currentQuery, now, refresh, snapshot],\n );\n\n const setDefault = useCallback(\n async (id: string) => {\n await storage.setDefaultSaved?.(key, id);\n await refresh();\n },\n [storage, key, refresh],\n );\n\n const clearDefault = useCallback(async () => {\n await storage.setDefaultSaved?.(key, null);\n await refresh();\n }, [storage, key, refresh]);\n\n const remove = useCallback(\n async (id: string) => {\n if (id === defaultId) await storage.setDefaultSaved?.(key, null);\n await storage.deleteSaved(key, id);\n await refresh();\n },\n [storage, key, defaultId, refresh],\n );\n\n return { items, loading, defaultId, save, canUpdate: Boolean(storage.updateNamed), update, load, setDefault, clearDefault, remove };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { encodeQuery, type QueryLink, type QueryLinkService, type QueryState, type QuerySnapshot } from \"@pythia-software/query-table-core\";\n\nexport interface QueryLinksApi {\n maxUrlBytes: number;\n kind: QueryLink[\"kind\"] | null;\n busy: boolean;\n error: Error | null;\n /** Explicit Share/Bookmark: server snapshot if configured, otherwise a fitting inline link. */\n create(query?: QueryState, options?: { baseUrl?: string; parameter?: string }): Promise<QueryLink>;\n /** Synchronous local-only URL for navigation, never a server write. */\n local(query: QueryState, baseUrl?: string, parameter?: string): QueryLink;\n /** Save uses the same immutable snapshot and promotion path as Share. */\n snapshot(query: QueryState): Promise<QuerySnapshot | null>;\n}\n\nexport function useQueryLinks(query: QueryState, service: QueryLinkService, syncUrl: boolean, ready: boolean, parameter: string, maxUrlBytes: number,\n onUrlChange: (url: string) => void,\n /** Rewrites parameters the host owns for this query, such as host state. */\n decorate: (url: string, query: QueryState) => string = (url) => url): QueryLinksApi {\n const latest = useRef(query); latest.current = query;\n const [kind, setKind] = useState<QueryLink[\"kind\"] | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mounted = useRef(true);\n const operations = useRef(0);\n useEffect(() => { mounted.current = true; return () => { mounted.current = false; }; }, []);\n const queryKey = JSON.stringify(query);\n useEffect(() => {\n if (!syncUrl || !ready || typeof window === \"undefined\") return;\n try {\n // Preserve an already-promoted link until the query actually changes.\n const result = service.local(query, window.location.href, parameter);\n const url = decorate(result.url, query);\n window.history.replaceState(window.history.state, \"\", url);\n onUrlChange(url);\n setKind(result.kind); setError(null);\n } catch (e) { setError(e instanceof Error ? e : Error(String(e))); }\n }, [queryKey, syncUrl, ready, service, parameter, onUrlChange, decorate]);\n\n const snapshot = useCallback(async (q: QueryState) => {\n const captured = encodeQuery(q);\n const base = typeof window !== \"undefined\" ? window.location.href : undefined;\n operations.current++; setBusy(true); setError(null);\n try {\n if (!ready) throw Error(\"Resolve or reset the query link before saving it.\");\n const saved = await service.snapshot(q);\n if (saved && base && mounted.current && syncUrl && ready && window.location.href === base && encodeQuery(latest.current) === captured) {\n const url = new URL(base); url.searchParams.set(parameter, \"@\" + saved.code);\n const result = service.local(q, url.toString(), parameter);\n const next = decorate(result.url, q);\n window.history.replaceState(window.history.state, \"\", next); onUrlChange(next); setKind(\"durable\");\n }\n return saved;\n }\n catch (e) { if (mounted.current) setError(e instanceof Error ? e : Error(String(e))); throw e; }\n finally { operations.current--; if (mounted.current) setBusy(operations.current > 0); }\n }, [service, syncUrl, ready, parameter, onUrlChange, decorate]);\n const create = useCallback(async (q = latest.current, options: { baseUrl?: string; parameter?: string } = {}) => {\n const baseUrl = options.baseUrl ?? window.location.href;\n const param = options.parameter ?? parameter;\n const captured = encodeQuery(q);\n operations.current++; setBusy(true); setError(null);\n try {\n if (!ready) throw Error(\"Resolve or reset the query link before sharing it.\");\n const durable = await service.durable(q, baseUrl, param);\n const result = param === parameter ? { ...durable, url: decorate(durable.url, q) } : durable;\n if (mounted.current && syncUrl && ready && param === parameter &&\n window.location.href === baseUrl && encodeQuery(latest.current) === captured) {\n window.history.replaceState(window.history.state, \"\", result.url);\n onUrlChange(result.url);\n setKind(result.kind);\n }\n return result;\n } catch (e) { if (mounted.current) setError(e instanceof Error ? e : Error(String(e))); throw e; }\n finally { operations.current--; if (mounted.current) setBusy(operations.current > 0); }\n }, [service, syncUrl, ready, parameter, onUrlChange, decorate]);\n const local = useCallback((q: QueryState, base = window.location.href, param = parameter) => {\n const result = service.local(q, base, param);\n return param === parameter ? { ...result, url: decorate(result.url, q) } : result;\n }, [service, parameter, decorate]);\n return { maxUrlBytes, kind, busy, error, create, local, snapshot };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport {\n objectReferenceKey,\n type ObjectReference,\n type RelationshipAdapter,\n type ResolvedObjectReference,\n} from \"@pythia-software/query-table-core\";\n\n/** One cancellable batch per displayed reference set; rejects unrelated results. */\nexport function useObjectReferences(\n references: ObjectReference[],\n adapter?: RelationshipAdapter,\n) {\n const fingerprint = JSON.stringify(references.map(objectReferenceKey).sort());\n const batch = useMemo(\n () => [\n ...new Map(\n references.map((reference) => [\n objectReferenceKey(reference),\n reference,\n ]),\n ).values(),\n ],\n [fingerprint],\n );\n const [state, setState] = useState({\n fingerprint: \"\",\n adapter: undefined as RelationshipAdapter | undefined,\n values: new Map<string, ResolvedObjectReference>(),\n error: null as Error | null,\n });\n useEffect(() => {\n const controller = new AbortController();\n if (!adapter || batch.length === 0) return;\n const allowed = new Set(batch.map(objectReferenceKey));\n void Promise.resolve()\n .then(() => adapter.resolve(batch, controller.signal))\n .then((results) => {\n if (controller.signal.aborted) return;\n const values = new Map<string, ResolvedObjectReference>();\n for (const result of results) {\n const key = objectReferenceKey(result.reference);\n if (allowed.has(key)) values.set(key, result);\n }\n setState({ fingerprint, adapter, values, error: null });\n })\n .catch((error) => {\n if (!controller.signal.aborted)\n setState({\n fingerprint,\n adapter,\n values: new Map(),\n error: error instanceof Error ? error : new Error(String(error)),\n });\n });\n return () => controller.abort();\n }, [batch, adapter]);\n const current =\n state.fingerprint === fingerprint && state.adapter === adapter;\n return {\n values: current ? state.values : new Map<string, ResolvedObjectReference>(),\n error: current ? state.error : null,\n };\n}\n"],"mappings":";AAAA,SAAS,aAAa,eAAe;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AAOP,SAAS,oBACP,MACA,WACA,MACa;AACb,MAAI,IAAI;AACR,QAAM,MAAqB,CAAC;AAC5B,aAAW,UAAU,KAAK,KAAK;AAC7B,UAAM,OAAsB,CAAC;AAC7B,eAAW,UAAU,mBAAmB,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,GAAG;AACvE,YAAM,OAAO,QAAQ,YAAY,KAAK,MAAM,IAAI;AAChD,UAAI,KAAM,MAAK,KAAK,IAAI;AAAA,IAC1B;AACA,QAAI,KAAK,WAAW,EAAG,KAAI,KAAK,KAAK,CAAC,CAAE;AAAA,aAC/B,KAAK,SAAS,EAAG,KAAI,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA,EAClD;AACA,MAAI,IAAI,SAAS,EAAG,QAAO,CAAC,EAAE,IAAI,CAAc;AAChD,QAAM,OAAO,IAAI,CAAC;AAClB,SAAO,CAAC,OAAO,CAAC,IAAI,mBAAmB,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI;AACjE;AAsBO,SAAS,gBACd,QACA,UACA;AACA,QAAM,SAAS;AAAA,IACb,MAAM,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AAAA,IAC/D,CAAC,MAAM;AAAA,EACT;AACA,QAAM,YAAY;AAAA,IAChB,CAAC,WACC,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,MAAM,EAAE,EAAE;AAAA,IACpE,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,eAAe;AAAA,IACnB,CAAC,OAAe,WACd,SAAS,CAAC,OAAO;AAAA,MACf,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,OAAO,EAAE,MAAM,IAAI,CAAC,GAAG,MAAO,MAAM,QAAQ,SAAS,CAAE;AAAA,IACzD,EAAE;AAAA,IACJ,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,eAAe;AAAA,IACnB,CAAC,UACC,SAAS,CAAC,OAAO;AAAA,MACf,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AAAA,IAC7C,EAAE;AAAA,IACJ,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,eAAe;AAAA,IACnB,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,GAAG,OAAO,CAAC,EAAE,EAAE;AAAA,IACtD,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,kBAAkB;AAAA,IACtB,CAAC,WAAW,WAAW,WACrB,SAAS,CAAC,OAAO;AAAA,MACf,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,MAAM;AAC9B,YAAI,MAAM,UAAW,QAAO;AAC5B,YAAI,UAAU,IAAI;AAChB,iBAAO;AAAA,YACL,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,MAAO,MAAM,YAAY,SAAS,CAAE;AAAA,UAC5D;AACF,YAAI,SAAS,KAAM,QAAO,oBAAoB,MAAM,WAAW,MAAM,MAAM;AAC3E,eAAO;AAAA,MACT,CAAC,EAAE,KAAK;AAAA,IACV,EAAE;AAAA,IACJ,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,kBAAkB;AAAA,IACtB,CAAC,WAAW,cACV,SAAS,CAAC,MAAM;AACd,YAAM,QAAqB,CAAC;AAC5B,QAAE,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC3B,YAAI,MAAM,WAAW;AACnB,gBAAM,KAAK,IAAI;AACf;AAAA,QACF;AACA,YAAI,UAAU,IAAI,GAAG;AACnB,gBAAM,UAAU,KAAK,IAAI,OAAO,CAAC,GAAG,MAAM,MAAM,SAAS;AACzD,cAAI,QAAQ,WAAW,EAAG,OAAM,KAAK,QAAQ,CAAC,CAAE;AAAA,mBACvC,QAAQ,SAAS,EAAG,OAAM,KAAK,EAAE,KAAK,QAAQ,CAAC;AACxD;AAAA,QACF;AACA,YAAI,SAAS,MAAM;AACjB,gBAAM,KAAK,GAAG,oBAAoB,MAAM,WAAW,MAAM,IAAI,CAAC;AAC9D;AAAA,QACF;AAAA,MAEF,CAAC;AACD,aAAO,EAAE,GAAG,GAAG,QAAQ,GAAG,MAAM;AAAA,IAClC,CAAC;AAAA,IACH,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,YAAY;AAAA,IAChB,CAAC,WAAqC;AACpC,YAAM,QAAQ,OAAO,IAAI,OAAO,KAAK;AACrC,aAAO,aAAa,QAAQ,QAAQ,YAAY,KAAK,IAAI,MAAS;AAAA,IACpE;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACA,QAAM,kBAAkB;AAAA,IACtB,CAAC,WAAW,cACV,SAAS,CAAC,OAAO;AAAA,MACf,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,MAAM;AAC9B,YAAI,MAAM,UAAW,QAAO;AAC5B,YAAI,UAAU,IAAI;AAChB,iBAAO;AAAA,YACL,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,MAAO,MAAM,YAAY,UAAU,CAAC,IAAI,CAAE;AAAA,UAClE;AACF,YAAI,SAAS,KAAM,QAAO,oBAAoB,MAAM,WAAW,SAAS;AACxE,eAAO,UAAU,IAAI;AAAA,MACvB,CAAC,EAAE,KAAK;AAAA,IACV,EAAE;AAAA,IACJ,CAAC,UAAU,SAAS;AAAA,EACtB;AACA,QAAM,iBAAiB;AAAA,IACrB,CAAC,WAAW,YACV,SAAS,CAAC,MAAM;AACd,UAAI,YAAY,KAAK,aAAa,EAAE,MAAM,OAAQ,QAAO;AACzD,YAAM,QAAQ,CAAC,GAAG,EAAE,KAAK;AACzB,YAAM,CAAC,KAAK,IAAI,MAAM,OAAO,WAAW,CAAC;AACzC,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,MAAM,MAAM,CAAC,GAAG,GAAG,KAAM;AACpE,aAAO,EAAE,GAAG,GAAG,QAAQ,GAAG,MAAM;AAAA,IAClC,CAAC;AAAA,IACH,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,eAAe;AAAA,IACnB,CAAC,aAAa,gBACZ,SAAS,CAAC,MAAM;AACd,UAAI,gBAAgB,YAAa,QAAO;AACxC,YAAM,SAAS,EAAE,MAAM,WAAW;AAClC,YAAM,SAAS,EAAE,MAAM,WAAW;AAClC,UAAI,CAAC,UAAU,CAAC,OAAQ,QAAO;AAE/B,YAAM,SAAS;AAAA,QACb,KAAK,CAAC,GAAG,WAAW,MAAM,GAAG,GAAG,WAAW,MAAM,CAAC,EAAE;AAAA,UAClD,CAAC,WAAyB,OAAO,WAAW,IAAI,OAAO,CAAC,IAAK,EAAE,KAAK,OAAO;AAAA,QAC7E;AAAA,MACF;AACA,YAAM,QAAqB,CAAC;AAC5B,QAAE,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC3B,YAAI,MAAM,YAAa;AACvB,cAAM,KAAK,MAAM,cAAc,SAAS,IAAI;AAAA,MAC9C,CAAC;AACD,aAAO,EAAE,GAAG,GAAG,QAAQ,GAAG,MAAM;AAAA,IAClC,CAAC;AAAA,IACH,CAAC,QAAQ;AAAA,EACX;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC7MA,SAAS,WAAW,QAAQ,gBAAgB;AAC5C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAKA;AAAA,OAOK;AAuCA,SAAS,sBACd,KACA,QACA,OACA,QACA,WACA,cACA,YAA+D,CAAC,GAC9C;AAClB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,YAAU,MAAM,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC;AAC7C,QAAM,WAAW,OAAuD,IAAI;AAC5E,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,OAAqB;AAAA,IACzB,SAAS;AAAA,IACT,MAAM,QAAQ,WAAW;AAAA,IACzB,MAAM,eAAe,OAAO,QAAQ,CAAC,CAAC;AAAA,IACtC,WAAW,OAAO,QAAQ,CAAC;AAAA,IAC3B,WAAW,OAAO,aAAa,CAAC;AAAA,IAChC,gBAAgB,OAAO,kBAAkB;AAAA,IACzC,OAAO,OAAO;AAAA,IACd,QAAQ,gBAAgB,IAAI,KAAK;AAAA,EACnC;AACA,QAAM,eAAe;AAAA,IACnB,GAAG,IAAI;AAAA,IACP,QAAQ,IAAI,SAAS;AAAA,EACvB;AACA,WAAS,WAAW,MAAkB;AACpC,QAAI,KAAK,UAAU,CAAC,UAAW;AAC/B,UAAM,SACJ,SAAS,SAAS,aAAa,eAC3B,SAAS,QAAQ,QACjB;AACN,UAAM,aAAa,CAAC,YAClB,CAAC,QAAQ,YAAY,QAAQ,YAC7B,aAAa,OAAO,SAAS,QAAQ,OAAO,KAC5C,KAAK,UAAU,OAAO,SAAS,IAAI,MAAM,KAAK,UAAU,IAAI;AAG9D,QAAI,KAAK;AACP,YAAM,SAAS,WAAW,IAAI,KAAK,IAAI,OAAQ,WAAY;AAAA,QACzD,GAAI,SAAS,EAAE,WAAW,CAAC,GAAG,gBAAgB,KAAK;AAAA,QACnD;AAAA,MACF,CAAC;AACH,QAAI,CAAC,KAAK,UAAU;AAClB,eAAS,UAAU,EAAE,OAAO,IAAI,OAAO,UAAU,aAAa;AAChE,QAAI,SAAS,CAAC,YAAY;AAExB,UAAI,KAAK,UAAU,CAAC,QAAQ,YAAY,QAAQ,YAAY,WAAW,OAAO;AAC5E,eAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU,EAAE,GAAG,OAAO,UAAU,QAAQ,QAAQ;AAAA,QAClD;AACF,aAAO,iBAAiB,SAAS,IAAI;AAAA,IACvC,CAAC;AACD;AAAA,MACE,SAAS,IAAI,MAAM,cAAc,UAAU,KAAK,SAC5C,iEACA;AAAA,IACN;AACA,QAAI,UAAU,MAAM;AAAA,EACtB;AACA,WAAS,aAAa,WAA4B,SAAyB;AACzE,QAAI,CAAC,OAAO;AACV,UAAI,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,QAAQ,EAAE;AAC/C;AAAA,IACF;AACA,UAAM,SAAS,EAAE,GAAG,OAAO,UAAU,CAAC;AACtC,UAAM,UAAU,IAAI;AAAA,MAClB,MAAM,UACH,OAAO,CAAC,WAAW;AAClB,cAAM,QAAQ,UAAU,KAAK,CAAC,WAAW,OAAO,OAAO,OAAO,EAAE;AAChE,eACE,CAAC,SACD,OAAO,OAAO,MAAM,MACpB,OAAO,UAAU,MAAM,SACvB,OAAO,eAAe,MAAM;AAAA,MAEhC,CAAC,EACA,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,IAC9B;AACA,QAAI;AAAA,MAAS,CAAC,MACZ,EAAE,WACE;AAAA,QACE,GAAG;AAAA,QACH,UAAU,EAAE,GAAG,EAAE,UAAU,UAAU;AAAA,QACrC,QAAQ;AAAA,QACR,GAAI,QAAQ,OACR;AAAA,UACE,QAAQ;AAAA,UACR,cAAc,CAAC;AAAA,UACf,OAAO,EAAE,MAAM;AAAA,YACb,CAAC,SACC,CAAC,aAAa,IAAI,EAAE,KAAK,CAAC,MAAM,QAAQ,IAAI,EAAE,KAAK,CAAC;AAAA,UACxD;AAAA,UACA,SAAS,EAAE,QAAQ,OAAO,CAAC,SAAS,CAAC,QAAQ,IAAI,KAAK,KAAK,CAAC;AAAA,QAC9D,IACA,CAAC;AAAA,MACP,IACA;AAAA,IACN;AACA;AAAA,MACE,QAAQ,SACL,IAAI,MAAM,MAAM;AAAA,QAAK,CAAC,SACrB,aAAa,IAAI,EAAE,KAAK,CAAC,MAAM,QAAQ,IAAI,EAAE,KAAK,CAAC;AAAA,MACrD,KACE,IAAI,MAAM,QAAQ,KAAK,CAAC,SAAS,QAAQ,IAAI,KAAK,KAAK,CAAC,KACxD,IAAI,MAAM,cAAc,UACxB,uFACA;AAAA,IACN;AAAA,EACF;AACA,WAAS,WAAW,IAAe,OAAgB;AACjD,QAAI,CAAC,SAAU,OAAO,SAAS,CAAC,MAAM,eAAiB;AACvD,UAAM,WAAW,MAAM,UAAU;AAAA,MAC/B,CAACA,YAAWA,QAAO,OAAO,MAAMA,QAAO,UAAU;AAAA,IACnD;AACA,QAAI,CAAC,YAAY,MAAM,UAAU,UAAU,qBAAqB;AAC9D;AAAA,QACE,iCAAiC,mBAAmB;AAAA,MACtD;AACA;AAAA,IACF;AACA,UAAM,SAAS,YAAY;AAAA,MACzB,IAAI,WAAW,OAAO,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,MACpD;AAAA,MACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC3B;AACA;AAAA,MACE,WAAW,MAAM,YAAY,CAAC,GAAG,MAAM,WAAW,MAAM;AAAA,MACxD,IAAI,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO,EAAE,IAChD,IAAI,OAAO,UACX,CAAC,GAAG,IAAI,OAAO,SAAS,EAAE,OAAO,OAAO,GAAG,CAAC;AAAA,IAClD;AAAA,EACF;AACA,WAAS,cAAc,IAAY,IAAe;AAChD,QAAI,CAAC,MAAO;AACZ;AAAA,MACE,MAAM,UAAU,IAAI,CAAC,WAAW;AAC9B,YAAI,OAAO,OAAO,GAAI,QAAO;AAE7B,cAAM,EAAE,SAAS,UAAU,GAAG,KAAK,IAAI;AACvC,eAAO,OAAO,QAAQ,EAAE,GAAG,MAAM,GAAG,IAAI,EAAE,GAAG,QAAQ,GAAG;AAAA,MAC1D,CAAC;AAAA,MACD,IAAI,OAAO;AAAA,IACb;AAAA,EACF;AACA,WAAS,uBAAuB;AAC9B,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,SAAS,IAAI;AACnB,UAAM,QAAQ,MAAM;AAAA,MAClB;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO,MAAM,WAAW,MAAM,MAAM,SAAS,sBAAsB;AAAA,MACnE,OAAO,QAAQ,WAAW,MAAM,QAAQ,SAAS,oBAAoB;AAAA,OACpE,OAAO,cAAc,UAAU,QAAQ,MAAM,cAAc,UAAU,KAClE,sBACA;AAAA,IACN,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EACd;AACA,WAAS,qBAAqB,gBAA0C;AACtE,QACE,CAAC,SACD,KAAK,UAAU,MAAM,cAAc,MAAM,KAAK,UAAU,cAAc;AAEtE;AACF,UAAM,YAAY,iBACd,MAAM,YACN,MAAM,UAAU,OAAO,CAAC,WAAW,OAAO,OAAO,KAAK;AAC1D,UAAM,SAAS,EAAE,GAAG,OAAO,WAAW,eAAe,CAAC;AACtD,UAAM,SAAS,qBAAqB;AACpC,QAAI;AAAA,MAAS,CAAC,MACZ,EAAE,WACE,oBAAoB;AAAA,QAClB,GAAG,MAAM;AAAA,UACP;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,CAAC;AAAA,QACH;AAAA,QACA,UAAU,EAAE,GAAG,EAAE,UAAU,WAAW,eAAe;AAAA,MACvD,CAAC,IACD;AAAA,IACN;AACA;AAAA,MACE,SACI,uCAAuC,MAAM,0BAC7C;AAAA,IACN;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,QAAQ,IAAI;AAAA,IACZ;AAAA,IACA,aAAa,QAAQ,MAAM,gBAAgB,KAAK,IAAI,CAAC;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AChRA;AAAA,EAAS;AAAA,EAAqB;AAAA,EAAiB,mBAAAC;AAAA,EAAiB,yBAAAC;AAAA,EAAuB,oBAAAC;AAAA,EAAkB,yBAAAC;AAAA,EACvG;AAAA,EAAuB;AAAA,EAAmB;AAAA,EAAY;AAAA,OAAsD;AAC9G,SAAS,qBAAqB,gBAAgB,cAAAC,mBAAkB;;;ACJhE,SAAS,eAAAC,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAKzD,SAAS,uBAAuB,wBAAwB,4BAA4B;;;ACLpF,SAAS,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAClE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AA0BP,IAAM,UAAU,CAAC,UACf,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAGnD,SAAS,gBACd,SACiB;AACjB,QAAM,CAAC,MAAM,IAAIA,UAAS,yBAAyB;AACnD,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,MAAM,QAAQ,OAAO,QAAQ,OAAO;AAC1C,QAAM,gBAAgBF,SAAQ,MAAM,mBAAmB,QAAQ,MAAM,GAAG,CAAC,QAAQ,MAAM,CAAC;AACxF,QAAM,WAAWA;AAAA,IACf,MACE,QAAQ,cACJ,sBAAsB,QAAQ,WAAW,IACzC;AAAA,IACN,CAAC,QAAQ,aAAa,aAAa;AAAA,EACrC;AACA,QAAM,WAAWC,QAAO,aAAa;AACrC,WAAS,UAAU;AACnB,QAAM,UAAUA,QAAO,QAAQ,WAAW;AAC1C,UAAQ,UAAU,QAAQ;AAC1B,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS;AAAA,IACjC;AAAA,IACA;AAAA,IACA,SAAS,CAAC,QAAQ;AAAA,IAClB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO,CAAC;AAAA,IACR,WAAW;AAAA,EACb,CAAC;AACD,QAAM,aAAaD,QAAO,CAAC;AAC3B,QAAM,QAAQA,QAAO,CAAC;AACtB,QAAM,YAAYA,QAAO,QAAQ,QAAQ,CAAC;AAC1C,QAAM,UAAU,MAAM,QAAQ,OAAO,MAAM,YAAY;AACvD,QAAM,OAAO,UAAU,MAAM,QAAQ,MAAM,KAAK,IAAK;AAErD,EAAAF,WAAU,MAAM;AACd,UAAM,QAAQ,EAAE,WAAW;AAC3B,UAAM,YAAY,MAAM;AACxB,aAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA,SAAS,CAAC,SAAS,OAAO;AAAA,MAC1B,OAAO;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,MACP,OAAO,CAAC;AAAA,MACR,WAAW;AAAA,IACb,CAAC;AACD,SAAK,QAAQ,QAAQ,EAClB;AAAA,MAAK,MACJ,QAAQ,IAAI;AAAA,QACV,QAAQ,SAAS,GAAG;AAAA,QACpB,QAAQ,UAAU,GAAG;AAAA,QACrB,QAAQ,iBAAiB,GAAG;AAAA,MAC9B,CAAC;AAAA,IACH,EACC,KAAK,CAAC,CAAC,MAAM,OAAO,WAAW,MAAM;AACpC,UAAI,WAAW,YAAY,MAAO;AAClC,YAAM,WAAW;AAAA,QACf,QAAQ,WAAW,QAAQ,aAAa,QAAQ,SAAS;AAAA,MAC3D;AACA,YAAM,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,QACjC,GAAG;AAAA,QACH,MAAM,sBAAsB,KAAK,IAAI;AAAA,MACvC,EAAE;AACF,eAAS,CAAC,cAAc;AAAA,QACtB,GAAG;AAAA,QACH,GAAI,MAAM,YAAY,YAClB,EAAE,SAAS,CAAC,QAAQ,GAAG,OAAO,EAAE,IAChC,CAAC;AAAA,QACL,OAAO;AAAA,QACP,WAAW,aAAa,MAAM;AAAA,QAC9B,SAAS;AAAA,MACX,EAAE;AAAA,IACJ,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,UAAI,WAAW,YAAY;AACzB,iBAAS,CAAC,cAAc;AAAA,UACtB,GAAG;AAAA,UACH,SAAS;AAAA,UACT,OAAO,QAAQ,KAAK;AAAA,QACtB,EAAE;AAAA,IACN,CAAC;AACH,WAAO,MAAM;AACX,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,KAAK,OAAO,CAAC;AAEjB,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,MAAM,WAAW,MAAM,MAAO;AAC9C,UAAM,QAAQ,WAAW;AACzB,UAAM,WAAW,sBAAsB,IAAI;AAE3C,cAAU,UAAU,UAAU,QAC3B,KAAK,MAAM,QAAQ,SAAS,KAAK,QAAQ,CAAC,EAC1C,MAAM,CAAC,UAAU;AAChB,UAAI,WAAW,YAAY;AACzB,iBAAS,CAAC,cAAc,EAAE,GAAG,UAAU,OAAO,QAAQ,KAAK,EAAE,EAAE;AAAA,IACnE,CAAC;AAAA,EACL,GAAG,CAAC,MAAM,SAAS,MAAM,SAAS,MAAM,OAAO,KAAK,OAAO,CAAC;AAE5D,QAAM,UAAUD;AAAA,IACd,CAAC,SAA4B;AAC3B,YAAM,aAAa,sBAAsB,IAAI;AAC7C,YAAM;AACN,eAAS,CAAC,aAAa;AACrB,cAAM,UACJ,SAAS,QAAQ,OAAO,SAAS,YAAY,UACzC,SAAS,QAAQ,MAAM,GAAG,SAAS,QAAQ,CAAC,IAC5C,CAAC,SAAS,OAAO;AACvB,YACE,KAAK,UAAU,QAAQ,QAAQ,SAAS,CAAC,CAAC,MAC1C,KAAK,UAAU,UAAU;AAEzB,iBAAO,EAAE,GAAG,UAAU,OAAO,KAAK;AACpC,cAAM,cAAc,CAAC,GAAG,SAAS,UAAU,EAAE,MAAM,GAAG;AACtD,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,OAAO,YAAY,SAAS;AAAA,UAC5B,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,KAAK,OAAO;AAAA,EACf;AACA,QAAM,UAAUA;AAAA,IACd,OAAO,UAAkB;AACvB,YAAM,CAAC,OAAO,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC7C,QAAQ,UAAU,GAAG;AAAA,QACrB,QAAQ,iBAAiB,GAAG;AAAA,MAC9B,CAAC;AACD,UAAI,WAAW,YAAY;AACzB,iBAAS,CAAC,cAAc;AAAA,UACtB,GAAG;AAAA,UACH,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,YAC1B,GAAG;AAAA,YACH,MAAM,sBAAsB,KAAK,IAAI;AAAA,UACvC,EAAE;AAAA,UACF,WAAW,aAAa,MAAM;AAAA,UAC9B,OAAO;AAAA,QACT,EAAE;AAAA,IACN;AAAA,IACA,CAAC,KAAK,OAAO;AAAA,EACf;AACA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,CAAC,WAAW,MAAM;AAAA,IAC3B,OAAO,UAAU,MAAM,QAAQ;AAAA,IAC/B,OAAO,UAAU,MAAM,QAAQ,CAAC;AAAA,IAChC,WAAW,UAAU,MAAM,YAAY;AAAA,IACvC;AAAA,IACA,OAAO,MAAM,QAAQ,SAAS,OAAO;AAAA,IACrC,SAAS,WAAW,MAAM,QAAQ;AAAA,IAClC,SAAS,WAAW,MAAM,QAAQ,MAAM,QAAQ,SAAS;AAAA,IACzD,OAAO;AACL,YAAM;AACN,eAAS,CAAC,cAAc;AAAA,QACtB,GAAG;AAAA,QACH,OAAO,KAAK,IAAI,GAAG,SAAS,QAAQ,CAAC;AAAA,QACrC,OAAO;AAAA,MACT,EAAE;AAAA,IACJ;AAAA,IACA,OAAO;AACL,YAAM;AACN,eAAS,CAAC,cAAc;AAAA,QACtB,GAAG;AAAA,QACH,OAAO,KAAK,IAAI,SAAS,QAAQ,SAAS,GAAG,SAAS,QAAQ,CAAC;AAAA,QAC/D,OAAO;AAAA,MACT,EAAE;AAAA,IACJ;AAAA,IACA,KAAK,IAAI;AACP,YAAM,QAAQ,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACvD,UAAI,SAAS,QAAS,SAAQ,MAAM,IAAI;AAAA,IAC1C;AAAA,IACA,MAAM,KAAK,MAAM;AACf,YAAM,QAAQ,WAAW;AACzB,YAAM,QAAQ,MAAM,QAAQ,UAAU,KAAK,MAAM,MAAM,KAAK,IAAI,CAAC;AACjE,YAAM,QAAQ,KAAK;AACnB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,IAAI;AACf,YAAM,QAAQ,WAAW;AACzB,YAAM,QAAQ,YAAY,KAAK,EAAE;AACjC,YAAM,QAAQ,KAAK;AAAA,IACrB;AAAA,IACA,MAAM,WAAW,IAAI;AACnB,YAAM,QAAQ,WAAW;AACzB,YAAM,QAAQ,gBAAgB,KAAK,EAAE;AACrC,YAAM,QAAQ,KAAK;AAAA,IACrB;AAAA,EACF;AACF;;;ADtKA,IAAM,YAA8B,CAAC,SAAS,SAAS,UAAU,MAAM;AAChE,SAAS,mBAAwB,QAA+D;AACrG,QAAM,YAAY,UAAU,OAAO,UAAQ,CAAC,QAAQ,SAAS,OAAO,MAAM,SAAS,IAAI,CAAC;AACxF,SAAO,QAAQ,eAAe,UAAU,OAAO,UAAQ,OAAO,aAAc,SAAS,IAAI,CAAC,IACtF,UAAU,SAAS,OAAO,IAAI,CAAC,OAAO,IAAI,UAAU,MAAM,GAAG,CAAC;AACpE;AAGA,SAAS,oBAAyB,MAAwB,QAA0B,QAClF,OAAmB,UAA+E,SAClG,WAAW,OAAwB;AACnC,QAAM,WAAW,MAAM,aAAa,QAAQ,IAAI,KAAK,MAAM,aAAa;AACxE,QAAM,OAAOK,QAAO,QAAQ;AAC5B,QAAM,aAAa,gBAAgB;AAAA,IAAE;AAAA,IACnC,GAAI,QAAQ,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IACrD,KAAK,GAAG,QAAQ,cAAc,OAAO,IAAI,IAAI,IAAI;AAAA,IACjD,GAAI,KAAK,UAAU,EAAE,aAAa,KAAK,QAAQ,IAAI,CAAC;AAAA,EACtD,CAAC;AACD,QAAM,eAAe,KAAK,UAAU,QAAQ;AAC5C,QAAM,eAAe,KAAK,UAAU,WAAW,IAAI;AACnD,QAAM,eAAeA,QAAO,EAAE,OAAO,cAAc,OAAO,aAAa,CAAC;AACxE,QAAM,eAAeA,QAAO,WAAW,IAAI;AAC3C,QAAM,gBAAgBA,QAAO,KAAK;AAClC,QAAM,cAAcA,QAA4D,IAAI;AACpF,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,QAAI,CAAC,WAAW,WAAW,CAAC,cAAc,SAAS;AACjD,mBAAa,UAAU,WAAW;AAClC,oBAAc,UAAU;AAAA,IAC1B;AACA,UAAM,WAAW,aAAa;AAC9B,iBAAa,UAAU,EAAE,OAAO,cAAc,OAAO,aAAa;AAClE,QAAI,iBAAiB,SAAS,OAAO;AACnC,YAAM,OAAO,YAAY,aAAa;AACtC,YAAM,SAAS,KAAK,UAAU,IAAI;AAClC,kBAAY,UAAU,WAAW,eAAe,EAAE,OAAO,cAAc,OAAO,OAAO,IAAI;AACzF,UAAI,WAAW,aAAc,YAAW,QAAQ,IAAI;AAAA,IACtD,WAAW,YAAY,WAAW,YAAY,QAAQ,UAAU,cAAc;AAC5E,UAAI,YAAY,QAAQ,UAAU,aAAc,aAAY,UAAU;AAAA,IACxE,WAAW,CAAC,YAAY,CAAC,WAAW,WAAW,iBAAiB,iBAAiB,iBAAiB,UAAa,iBAAiB,SAAS,QAAQ;AAC/I,eAAS,CAAC,aAAa,EAAE,GAAG,SAAS,aAAa;AAAA,QAChD,OAAO,QAAQ,aAAa,SAAS,mBAAmB,MAAM;AAAA,QAC9D,GAAG,QAAQ;AAAA,QACX,OAAO,EAAE,GAAG,QAAQ,aAAa,OAAO,CAAC,IAAI,GAAG,WAAW,KAAK;AAAA,MAClE,EAAE,EAAE;AAAA,IACN;AAAA,EACF,GAAG,CAAC,SAAS,cAAc,cAAc,WAAW,SAAS,WAAW,SAAS,QAAQ,CAAC;AAC1F,SAAO;AACT;AAKA,SAAS,gBAAqB,QAA0B,KAAoB;AAC1E,QAAM,OAAO,IAAI,IAAI,OAAO,KAAK,GAAa,CAAC;AAC/C,SAAO,OAAO,OAAO,OAAO,CAAC,UAAU,KAAK,IAAI,MAAM,IAAI,KACxD,KAAK,KAAK,MAAM,OAAO,SAAS,YAAY,MAAM,OAAO,QAAQ,MAAM,OAAO,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC,CAAE,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI;AACxI;AACO,SAAS,eAAoB;AAAA,EAClC;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAU;AAAA,EAAS;AAAA,EAAM;AAAA,EAAY;AAAA,EAAO;AAAA,EAAU;AAAA,EAAY;AAAA,EAAO,aAAa;AAAA,EAAM,gBAAAC;AAAA,EAAgB;AAAA,EAAW;AACxI,GAmBoC;AAClC,QAAM,UAAU,QAAQ,OAAO;AAC/B,QAAM,SAAS,OAAO,YAAY,WAAW,UAAU;AACvD,QAAM,eAAe,QAAQ,UAAU;AACvC,QAAM,iBAAiB,UAAU,OAAO,CAAC,SAAS,CAAC,QAAQ,SAAS,OAAO,MAAM,SAAS,IAAI,CAAC;AAC/F,QAAM,QAAQ,eAAe,OAAO,CAAC,UAAU,MAAM,aAAa,SAAS,mBAAmB,MAAM,GAAG,SAAS,IAAI,CAAC;AACrH,QAAM,OAAO,MAAM,aAAa,QAAQ,QAAQ,QAAQ,EAAE,aAAa,IAAI,QAAQ,SAAkB;AACrG,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,cAAc,WAAW,SAAS,WAAW,MAAM,aAAa,MAAM,SAAS,OAAO,MACtF,eAAe,SAAS,OAAO,KAAM,eAAe,SAAS,MAAM,KAAK,CAAC,KAAK,YAAY,KAAK;AACrG,QAAM,SAAS,cAAc,MAAM,SAAS,UAAU,IAAI,KAAK,eAAe,YAAY;AAG1F,QAAM,iBAAiB,WAAW;AAGlC,QAAM,WAAW,YAAY;AAC7B,QAAM,kBAAkB,oBAAoB,SAAS,cAAc,QAAQ,OAAO,UAAU,gBAAgB,QAAQ;AACpH,QAAM,kBAAkB,oBAAoB,SAAS,cAAc,QAAQ,OAAO,UAAU,gBAAgB,QAAQ;AACpH,QAAM,mBAAmB,oBAAoB,UAAU,cAAc,QAAQ,OAAO,UAAU,gBAAgB,QAAQ;AACtH,QAAM,mBAAmB,EAAE,OAAO,iBAAiB,OAAO,iBAAiB,QAAQ,iBAAiB;AACpG,QAAM,QAAqD;AAAA,IACzD,OAAO,gBAAgB;AAAA,IAAM,OAAO,gBAAgB;AAAA,IAAM,QAAQ,iBAAiB;AAAA,EACrF;AAEA,QAAM,aAAa,QAAQ;AAC3B,QAAM,gBAAgBF,QAAO,UAAU;AACvC,gBAAc,UAAU;AACxB,QAAM,YAAYA,QAAO,SAAS;AAClC,YAAU,UAAU;AACpB,QAAM,YAAY,QAAQ,SAAS;AAGnC,QAAM,gBAAgB,QAAQ,UAAU;AACxC,QAAM,aAAa,QAAQ,cAAc,aAAa;AACtD,QAAM,eAAe,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,OAAO;AACtE,QAAM,kBAAkBA,QAAO,YAAY;AAC3C,kBAAgB,UAAU;AAC1B,QAAM,UAAUG,aAAY,OAAO,IAAW,WAA+D;AAC3G,QAAI,UAAU,QAAS,QAAO,UAAU,QAAQ,EAAE,KAAK;AACvD,QAAI,cAAc,QAAS,QAAO,cAAc,QAAQ,IAAI,MAAM;AAClE,QAAI,YAAY;AACd,YAAMC,OAAM,WAAW,KAAK,CAACA,SAAQ,MAAMA,IAAG,MAAM,EAAE;AACtD,aAAOA,OAAM,EAAE,KAAAA,KAAI,IAAI;AAAA,IACzB;AACA,QAAI,UAAU;AAEZ,YAAMA,OAAM,MAAM,SAAS,IAAI,MAAM;AACrC,aAAOA,OAAM,EAAE,KAAAA,MAAK,cAAc,gBAAgB,gBAAgB,SAASA,IAAG,EAAE,IAAI;AAAA,IACtF;AACA,UAAM,MAAM,KAAK,KAAK,CAACA,SAAQ,MAAMA,IAAG,MAAM,EAAE;AAChD,WAAO,MAAM,EAAE,KAAK,cAAc,gBAAgB,gBAAgB,SAAS,GAAG,EAAE,IAAI;AAAA,EACtF,GAAG,CAAC,WAAW,eAAe,YAAY,YAAY,UAAU,cAAc,KAAK,CAAC;AACpF,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,CAAC;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAEzB,EAAE,QAAQ,QAAW,OAAO,IAAI,IAAI,QAAW,QAAQ,MAAM,SAAS,OAAO,OAAO,KAAK,CAAC;AAC7F,QAAM,WAAW,WAAW,CAAC,YAAY,QAAQ,KAAK;AACtD,QAAM,QAAQ,GAAG,UAAU,IAAI,QAAQ;AACvC,QAAM,gBAAgB,OAAO,OAAO,YAAY,OAAO,WAAW,WAAW,OAAO,UAAU;AAC9F,EAAAJ,WAAU,MAAM;AACd,UAAM,aAAa,IAAI,gBAAgB;AACvC,QAAI,aAAa,QAAW;AAC1B,gBAAU,CAAC,aAAa,SAAS,OAAO,UAAa,CAAC,SAAS,WAAW,CAAC,SAAS,SAAS,CAAC,SAAS,SAAS,WAAW,EAAE,QAAQ,QAAW,OAAO,IAAI,IAAI,QAAW,QAAQ,MAAM,SAAS,OAAO,OAAO,KAAK,CAAC;AACrN;AAAA,IACF;AACA,cAAU,eAAa,EAAE,QAAQ,SAAS,OAAO,IAAI,UAAU,QAAQ,SAAS,OAAO,YAAY,SAAS,WAAW,UAAU,SAAS,SAAS,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AACtL,SAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,UAAU,WAAW,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW;AACvF,UAAI,CAAC,WAAW,OAAO,QAAS,WAAU,EAAE,QAAQ,SAAS,OAAO,IAAI,UAAU,QAAQ,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,IACzH,CAAC,EAAE,MAAM,CAAC,UAAU;AAClB,UAAI,CAAC,WAAW,OAAO,QAAS,WAAU;AAAA,QAAE,QAAQ;AAAA,QAAS;AAAA,QAAO,IAAI;AAAA,QAAU,QAAQ;AAAA,QAAM,SAAS;AAAA,QACvG,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MAAE,CAAC;AAAA,IACtE,CAAC;AACD,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,GAAG,CAAC,UAAU,SAAS,YAAY,QAAQ,CAAC;AAC5C,QAAM,gBAAgBD,QAAO,KAAK;AAClC,QAAM,oBAAoBA,QAAO,CAAC;AAClC,QAAM,CAAC,kBAAkB,mBAAmB,IAAIK,UAAS,EAAE,UAAU,GAAG,SAAS,MAAM,CAAC;AACxF,QAAM,kBAAkBL,QAAO,EAAE,SAAS,UAAU,OAAO,OAAO,QAAQ,MAAM,CAAC;AACjF,kBAAgB,UAAU,EAAE,SAAS,UAAU,OAAO,OAAO,QAAQ,MAAM;AAC3E,EAAAC,WAAU,MAAM;AACd,UAAM,WAAW,QAAQ;AACzB,QAAI,CAAC,WAAW,CAAC,SAAU;AAC3B,UAAM,WAA8B,EAAE,QAAQ,OAAO,QAAQ,WAAW;AACtE,UAAI,OAAO,UAAU,UAAa,OAAO,QAAS,QAAO;AACzD,YAAM,UAAU,gBAAgB;AAChC,YAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,OAAO,MAAM;AACzD,UAAI,CAAC,UAAU,OAAO,QAAS,QAAO;AACtC,UAAI,OAAO,UAAU,UAAa,CAAC,aAAa,OAAO,KAAK,WAAS,MAAM,SAAS,OAAO,SACtF,MAAM,UAAU,YAAY,SAAS,sBAAsB,OAAO,OAAO,YAAY,CAAC,EAAG,QAAO;AACrG,YAAM,OAAO,QAAQ,QAAQ,OAAO,OAAO,QAAQ,QAAQ,OAAO,OAAO,QAAQ,MAAM,SAAS,QAAQ,IAAI,WAAW,QAAQ,MAAM,SAAS,OAAO,IAAI,UAAU;AACnK,UAAI,CAAC,QAAS,OAAO,UAAU,UAAa,CAAC,QAAQ,MAAM,IAAI,EAAE,WAAW,KAAK,cAAY,SAAS,UAAU,OAAO,KAAK,EAAI,QAAO;AACvI,oBAAc,UAAU;AACxB,YAAM,WAAW,EAAE,kBAAkB;AACrC,0BAAoB,EAAE,UAAU,SAAS,KAAK,CAAC;AAC/C,UAAI;AACF,gBAAQ,SAAS,eAAa,EAAE,GAAG,UAAU,aAAa;AAAA,UAAE,GAAG,SAAS;AAAA,UAAa,OAAO,SAAS,aAAa,SAAS,QAAQ;AAAA,UACjI,OAAO,QAAQ;AAAA,UAAO,QAAQ,EAAE,IAAI,OAAO,OAAQ,KAAK;AAAA,QAAE,EAAE,EAAE;AAChE,cAAM,UAAU,MAAM,SAAS,eAAe,EAAE,SAAS,aAAa,MAAM,OAAO,OAAO,MAAM,GAAG,MAAM;AACzG,YAAI,QAAQ,MAAO,OAAM,QAAQ,MAAM,MAAM;AAC7C,eAAO,OAAO,UAAU,QAAQ,MAAM,QAAQ,OAAO,QAAQ,MAAM;AAAA,MACrE,UAAE;AACA,4BAAoB,cAAY,SAAS,aAAa,WAAW,EAAE,UAAU,SAAS,MAAM,IAAI,QAAQ;AAAA,MAC1G;AAAA,IACF,EAAE;AACF,WAAO,SAAS,SAAS,EAAE,SAAS,aAAa,KAAK,GAAG,QAAQ;AAAA,EACnE,GAAG,CAAC,SAAS,QAAQ,WAAW,YAAY,CAAC;AAC7C,MAAI,CAAC,QAAS;AACd,QAAM,SAAS,aAAa,SAAS,UAAU,OAAO,EAAE,IAAI;AAC5D,SAAO;AAAA,IACL,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC7B,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,QAAQ,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IAC3D,eAAe,cAAc;AAAA,IAC7B,mBAAmB,iBAAiB;AAAA,IACpC,kBAAkB,iBAAiB;AAAA,IACnC,iBAAiB,MAAM,aAAa,mBAAmB,CAAC;AAAA,IACxD,kBAAkB,OAAO;AACvB,UAAI,MAAM,YAAY,aAAa,KAAM;AACzC,eAAS,aAAW;AAGlB,cAAM,eAAe,QAAQ,aAAa,mBAAmB,CAAC,GAAG,OAAO,cAAY,uBAAuB,QAAQ,MAAM,uBAAuB,KAAK,CAAC;AACtJ,eAAO,YAAY,UAAU,sBAAsB;AACjD,gBAAM,SAAS,YAAY,UAAU,cAAY,CAAC,SAAS,MAAM,IAAI;AACrE,sBAAY,OAAO,SAAS,IAAI,IAAI,QAAQ,CAAC;AAAA,QAC/C;AACA,eAAO,EAAE,GAAG,SAAS,aAAa;AAAA,UAAE,GAAG,QAAQ;AAAA,UAAa,OAAO,QAAQ,aAAa,SAAS;AAAA,UAC/F,iBAAiB,CAAC,GAAG,aAAa,KAAK;AAAA,QAAE,EAAE;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,IACA,QAAQ;AAAA,IAAc,gBAAgBC,mBAAkB,QAAQ,kBAAkB;AAAA,IAAK,YAAY;AAAA,IAAiB;AAAA,IAAkB;AAAA,IAAgB;AAAA,IAAO;AAAA,IAC7J;AAAA,IAAM,YAAY;AAAA,IAClB,QAAQ,YAAY,UAAU,OAAO,OAAO,OAAO,YAAY,OAAO,WAAW,UAAU,OAAO,SAAS;AAAA,IAC3G,SAAS,YAAY,WAAW,SAAY,aAAa,WAAc,CAAC,iBAAiB,OAAO;AAAA,IAChG,OAAO,YAAY,OAAO,gBAAgB,OAAO,QAAQ;AAAA,IACzD,GAAI,QAAQ,gBAAgB,EAAE,eAAe,OAAO,cAAc,IAAI,CAAC;AAAA,IACvE;AAAA,IACA,OAAO,MAAM,YAAY,CAAC,UAAU,QAAQ,CAAC;AAAA,IAC7C,SAAS,MAAM;AACb,eAAS,CAAC,YAAY;AACpB,cAAM,UAAU,eAAe,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC;AACnE,cAAM,QAA0B,EAAE,GAAG,QAAQ,aAAa,OAAO,SAAS,MAAM;AAChF,YAAI,MAAM,UAAU,CAAC,QAAQ,SAAS,MAAM,OAAO,IAAI,EAAG,QAAO,MAAM;AACvE,eAAO,EAAE,GAAG,SAAS,aAAa,MAAM;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,IACA,KAAK,IAAI,MAAM;AACb,cAAQ,WAAW,OAAO;AAC1B,oBAAc,UAAU;AACxB,UAAI,CAAC,MAAM,SAAS,IAAI,EAAG;AAC3B,eAAS,CAAC,aAAa,EAAE,GAAG,SAAS,aAAa;AAAA,QAChD,GAAG,QAAQ;AAAA,QAAa,OAAO,QAAQ,aAAa,SAAS;AAAA,QAC7D;AAAA,QAAO,QAAQ,EAAE,IAAI,KAAK;AAAA,MAC5B,EAAE,EAAE;AAAA,IACN;AAAA,IACA,QAAQ;AACN,cAAQ,WAAW,OAAO;AAC1B,eAAS,CAAC,YAAY;AACpB,YAAI,CAAC,QAAQ,aAAa,OAAQ,QAAO;AACzC,cAAM,EAAE,QAAQ,SAAS,GAAG,MAAM,IAAI,QAAQ;AAC9C,eAAO,EAAE,GAAG,SAAS,aAAa,MAAM;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AErTO,SAAS,kBACd,WACA,IACoB;AACpB,SACE,WAAW,kBAAkB,EAAE,KAC/B,WAAW,kBAAkB,aAAa,EAAE,EAAE;AAElD;;;ACTA;AAAA,EACE,gBAAAI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AAKP,eAAsB,iBACpB,WACA,OACA,QACA,WACA,aACA,KACA,QACA,aAA+B,QACU;AACzC,MAAI,OAAO,QAAS,OAAM,IAAI,aAAa,WAAW,YAAY;AAClE,QAAM,eAAe,sBAAsB,YAAY,WAAW,WAAW;AAC7E,QAAM,UAAU;AAAA,IAAiB,EAAE,GAAG,OAAO,cAAc,CAAC,EAAE;AAAA,IAAG;AAAA,IAC/D,UAAU;AAAA,IAAmB;AAAA,IAAW,EAAE,IAAI;AAAA,EAAC;AAEjD,QAAM,WAAW,oBAAI,IAAI;AAAA,IAAC,GAAG,QAAQ,OAAO;AAAA,IAAQ,GAAG,QAAQ,OAAO,QAAQ,IAAI,UAAQ,KAAK,KAAK;AAAA,IAClG,GAAG,CAAC,GAAG,QAAQ,OAAO,OAAO,GAAG,QAAQ,OAAO,KAAK,EAAE,QAAQ,UAAQC,cAAa,IAAI,EAAE,IAAI,eAAa,UAAU,KAAK,CAAC;AAAA,EAAC,CAAC;AAC9H,aAAW,cAAc;AACvB,QAAI,SAAS,IAAI,aAAa,WAAW,EAAE,EAAE,KAAK,kBAAkB,WAAW,WAAW,EAAE,MAAM,WAAW;AAC3G,YAAM,MAAM,uEAAuE;AACvF,QAAM,WAAW,MAAM,UAAU,aAAa,SAAS,MAAM;AAE7D,MAAI,OAAO,QAAS,OAAM,IAAI,aAAa,WAAW,YAAY;AAClE,wBAAsB,UAAU,SAAS,MAAM,WAAW,SAAS,YAAY;AAC/E,MAAI,SAAS,KAAK,SAAS,MAAM,MAAO,OAAM,MAAM,+BAA+B;AACnF,SAAO,EAAE,MAAM,SAAS,MAAe,OAAO,SAAS,MAAM;AAC/D;;;ACvCA,SAAS,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAClE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAeK;;;AC7BP;AAAA,EACE;AAAA,OAIK;AAIA,IAAM,sBAA4C,MAAM;AAC7D,QAAM,OAAO,oBAAoB,eAAe,SAAS,CAAC;AAC1D,QAAM,MAAM,IAAI;AAAA,IACd,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAAA,EAC9C;AACA,MAAI;AACF,WAAO,IAAI,OAAO,GAAG;AAAA,EACvB,UAAE;AACA,QAAI,gBAAgB,GAAG;AAAA,EACzB;AACF;AACO,SAAS,oBACd,KACA,QACA,QACA,UAAgC,qBACN;AAC1B,MAAI,QAAQ;AACV,WAAO,QAAQ,OAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AACjE,MAAI,CAAC,OAAO,OAAQ,QAAO,QAAQ,QAAQ,CAAC,CAAC;AAC7C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI;AACJ,QAAI;AACF,eAAS,QAAQ;AAAA,IACnB,SAAS,GAAG;AACV;AAAA,QACE,IAAI;AAAA,UACF,+BAA+B,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,QAC3E;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI;AACJ,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI,SAAS;AACb,UAAM,UAA2B,CAAC;AAClC,UAAM,UAAU,MAAM;AACpB,mBAAa,KAAK;AAClB,aAAO,UAAU;AACjB,cAAQ,oBAAoB,SAASC,MAAK;AAAA,IAC5C;AACA,UAAMA,SAAQ,MAAM;AAClB,cAAQ;AACR,aAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,IAClD;AACA,UAAM,OAAO,MAAM;AACjB,UAAI,KAAK,IAAI,IAAI,UAAU,KAAO;AAChC,gBAAQ;AACR;AAAA,UACE,IAAI;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AACA,cAAQ,WAAW,MAAM;AACvB,gBAAQ;AACR;AAAA,UACE,IAAI;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,GAAG,GAAI;AACP,UAAI;AACF,eAAO,YAAY,EAAE,KAAK,QAAQ,OAAO,MAAM,QAAQ,SAAS,GAAG,EAAE,CAAC;AAAA,MACxE,SAAS,GAAG;AACV,gBAAQ;AACR,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AACA,YAAQ,iBAAiB,SAASA,QAAO,EAAE,MAAM,KAAK,CAAC;AACvD,WAAO,UAAU,MAAM;AACrB,cAAQ;AACR,aAAO,IAAI,MAAM,wBAAwB,CAAC;AAAA,IAC5C;AACA,WAAO,YAAY,CAAC,UAAyC;AAC3D,mBAAa,KAAK;AAClB,cAAQ,KAAK,GAAG,MAAM,IAAI;AAC1B,gBAAU,MAAM,KAAK;AACrB,UAAI,UAAU,OAAO,QAAQ;AAC3B,gBAAQ;AACR,gBAAQ,OAAO;AAAA,MACjB,MAAO,MAAK;AAAA,IACd;AACA,SAAK;AAAA,EACP,CAAC;AACH;;;ADrBO,SAAS,mBAAwB,SAGtC;AACA,QAAM,EAAE,QAAQ,OAAO,MAAM,WAAW,YAAY,cAAc,IAAI;AACtE,QAAM,kBAAkB,QAAQ,mBAAmB;AACnD,QAAM,kBAAkB,QAAQ,mBAAmB,QAAQ;AAC3D,QAAM,QAAQC;AAAA,IACZ,MAAM,QAAQ,SAAS,0BAA0B;AAAA,IACjD,CAAC,QAAQ,KAAK;AAAA,EAChB;AACA,QAAM,CAAC,WAAW,YAAY,IAAIC,UAIxB,IAAI;AACd,QAAM,cAAcD;AAAA,IAClB,MACE,WAAW,YAAY,OAAO,QAAQ,UAAU,UAAU,QACtD,UAAU,QACV,CAAC;AAAA,IACP,CAAC,WAAW,OAAO,MAAM,KAAK;AAAA,EAChC;AACA,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,KAAK,GAC1C,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAClD,QAAM,mBAAmBC,QAA+B,IAAI;AAC5D,QAAM,SAASC,aAAY,YAAY;AACrC,qBAAiB,SAAS,MAAM;AAChC,UAAM,KAAK,IAAI,gBAAgB;AAC/B,qBAAiB,UAAU;AAC3B,eAAW,IAAI;AACf,aAAS,IAAI;AACb,QAAI;AACF,YAAM,QAAQ,MAAM,MAAM,KAAK,OAAO,MAAM,GAAG,MAAM;AACrD,UAAI,GAAG,OAAO,QAAS;AACvB,YAAM,QAAQ,MACX,IAAI,sBAAsB,EAC1B,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AAC1C,UAAI,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM;AACjD,cAAM,IAAI,MAAM,gCAAgC;AAClD;AAAA,QAAa,CAAC,aACZ,UAAU,YAAY,OAAO,QAC7B,SAAS,UAAU,SACnB,KAAK,UAAU,SAAS,KAAK,MAAM,KAAK,UAAU,KAAK,IACnD,WACA,EAAE,SAAS,OAAO,MAAM,OAAO,OAAO,MAAM;AAAA,MAClD;AAAA,IACF,SAAS,GAAG;AACV,UAAI,CAAC,GAAG,OAAO;AACb,iBAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACvD,UAAE;AACA,UAAI,CAAC,GAAG,OAAO,QAAS,YAAW,KAAK;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,IAAI,CAAC;AACvB,EAAAC,WAAU,MAAM;AACd,SAAK,OAAO;AACZ,WAAO,MAAM,iBAAiB,SAAS,MAAM;AAAA,EAC/C,GAAG,CAAC,MAAM,CAAC;AACX,EAAAA;AAAA,IACE,MACE,MAAM,YAAY,OAAO,MAAM,MAAM;AACnC,WAAK,OAAO;AAAA,IACd,CAAC;AAAA,IACH,CAAC,OAAO,OAAO,MAAM,MAAM;AAAA,EAC7B;AACA,EAAAA,WAAU,MAAM;AACd,UAAM,QAAQ,MAAM;AAClB,WAAK,OAAO;AAAA,IACd;AACA,WAAO,iBAAiB,SAAS,KAAK;AACtC,WAAO,MAAM,OAAO,oBAAoB,SAAS,KAAK;AAAA,EACxD,GAAG,CAAC,MAAM,CAAC;AACX,QAAM,cAAcJ;AAAA,IAClB,MACE,OAAO,OACJ,OAAO,YAAY,EACnB;AAAA,MACC,CAAC,MACC,EAAE,OAAO,SAAS,aACjB,EAAE,OAAO,YAAY,EAAE,OAAO,gBAAgB,CAAC,iBAAiB,CAAC;AAAA,IACtE;AAAA,IACJ,CAAC,MAAM;AAAA,EACT;AACA,QAAM,UAAUG;AAAA,IACd,CAAC,QAAgB,cAAoC;AACnD,YAAM,QAAQ,IAAI,IAAY,YAAY,CAAC,SAAS,IAAI,CAAC,CAAC;AAC1D,UAAI,WAAW;AACf,YAAM,UAAU,CAAC,SAA0C;AACzD,YAAI,CAAC,gBAAgB,IAAI,EAAG,QAAO;AACnC,cAAM,KAAK,KAAK,MAAM,aAAa,MAAM,GACvC,MAAM,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC3C,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gCAAgC,EAAE,EAAE;AAC9D,YAAI,MAAM,IAAI,EAAE;AACd,gBAAM,IAAI,MAAM,uCAAuC,IAAI,KAAK,EAAE;AACpE,YAAI,MAAM,QAAQ,MAAM,EAAE,WAAW;AACnC,gBAAM,IAAI,MAAM,yCAAyC;AAC3D,cAAM,IAAI,EAAE;AACZ,YAAI;AACF,iBAAO,eAAe,IAAI,WAAW,QAAQ,aAAa,OAAO;AAAA,QACnE,UAAE;AACA,gBAAM,OAAO,EAAE;AAAA,QACjB;AAAA,MACF;AACA,aAAO,eAAe,QAAQ,aAAa,OAAO;AAAA,IACpD;AAAA,IACA,CAAC,aAAa,WAAW;AAAA,EAC3B;AACA,QAAM,QAAQH;AAAA,IACZ,MACE,IAAI;AAAA,MACF,YAAY,IAAI,CAAC,QAAQ;AACvB,YAAI;AACF,iBAAO;AAAA,YACL,IAAI;AAAA,YACJ,EAAE,MAAM,QAAQ,IAAI,WAAW,QAAQ,IAAI,EAAE,EAAE;AAAA,UACjD;AAAA,QACF,SAAS,GAAG;AACV,iBAAO;AAAA,YACL,IAAI;AAAA,YACJ,EAAE,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE;AAAA,UACtD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,CAAC,aAAa,OAAO;AAAA,EACvB;AACA,QAAM,sBAAsBG;AAAA,IAC1B,CAAC,SACC;AAAA,MACE,GAAG,IAAI;AAAA,QACL,KAAK,aAAa,QAAQ,CAAC,SAAS;AAClC,gBAAM,IAAI,YAAY,KAAK,CAACE,OAAMA,GAAE,SAAS,IAAI;AACjD,iBAAO,GAAG,OAAO,SAAS,YACtB,CAAC,IAAI,IACJ,GAAG,OAAO,gBAAgB,CAAC;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF,EACG;AAAA,MAAO,CAAC,SACP,OAAO,OAAO;AAAA,QACZ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,OAAO,SAAS;AAAA,MAC9C;AAAA,IACF,EACC,KAAK;AAAA,IACV,CAAC,QAAQ,WAAW;AAAA,EACtB;AACA,QAAM,YAAYF;AAAA,IAChB,CAAC,MAAmB,UAAiB;AACnC,UAAI,OAAO;AACX,aAAO,MAAM,IAAI,CAAC,QAAQ;AACxB,cAAM,SAAuC,uBAAO,OAAO,IAAI;AAC/D,mBAAW,QAAQ,KAAK,cAAc;AACpC,gBAAM,QAAQ,YAAY,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACrD,gBAAM,MAAM,eAAe,OAAO,GAAG;AACrC,iBAAO,IAAI,IACT,eAAe,OAAO,IAAI,YAAY,IAAK;AAAA,QAC/C;AACA,gBAAQ,KAAK,UAAU,MAAM,EAAE;AAC/B,YAAI,OAAO;AACT,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AACF,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AACA,QAAM,eAAe,MAAM,OAAO,SAC9B,MAAM,SACL,OAAO,iBAAiB,CAAC;AAC9B,QAAM,YAAY,aACf,OAAO,CAAC,MAAM,gBAAgB,EAAE,KAAK,CAAC,EACtC,IAAI,CAAC,MAAM,EAAE,MAAM,MAAM,aAAa,MAAM,CAAC,EAC7C,KAAK,EACL,KAAK,GAAG;AACX,QAAM,CAAC,WAAW,YAAY,IAAIF,UAIxB,IAAI;AACd,EAAAG,WAAU,MAAM;AACd,UAAM,KAAK,IAAI,gBAAgB;AAC/B,UAAM,SAAS,oBAAI,IAA6B;AAChD,UAAM,YAAY;AAChB,iBAAW,MAAM,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO,GAAG;AACrD,YACE,QAAQ,WAAW,OAAO,kBAAkB,EAAE,CAAC,GAAG,UAClD;AAEA;AACF,cAAM,QAAQ,MAAM,IAAI,EAAE;AAC1B,YAAI,CAAC,OAAO,KAAM;AAClB,YAAI;AACF,iBAAO;AAAA,YACL;AAAA,YACA,MAAM;AAAA,cACJ,MAAM,KAAK;AAAA,cACX,UAAU,MAAM,MAAM,IAAI;AAAA,cAC1B,GAAG;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,GAAG;AACV,cAAI,GAAG,OAAO,QAAS;AACvB,iBAAO;AAAA,YACL;AAAA,YACA,KAAK,IAAI,OAAO;AAAA,cACd,OAAO;AAAA,cACP,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAAA,YAClD,EAAE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,GAAG,OAAO,QAAS,cAAa,EAAE,MAAM,OAAO,OAAO,CAAC;AAAA,IAC9D,GAAG;AACH,WAAO,MAAM,GAAG,MAAM;AAAA,EACxB,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACD,QAAM,gBAAgBJ,SAA0B,MAAM;AACpD,UAAM,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACtD,UAAM,SAA0B,YAAY,IAAI,CAAC,QAAQ;AACvD,YAAM,QAAQ,MAAM,IAAI,IAAI,EAAE;AAC9B,aAAO;AAAA,QACL,MAAM,kBAAkB,IAAI,EAAE;AAAA,QAC9B,OAAO,IAAI;AAAA,QACX,MACE,OAAO,MAAM,SAAS,SAAS,SAAU,OAAO,MAAM,QAAQ;AAAA,QAChE,OAAO;AAAA,QACP,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,YAAY,IAAI;AAAA,UAChB,cAAc,OAAO,OAAO,oBAAoB,MAAM,IAAI,IAAI,CAAC;AAAA,UAC/D,UAAU,CAAC,QAAa;AACtB,gBAAI,OAAO,MAAO,QAAO,EAAE,eAAe,MAAM,MAAM;AACtD,gBACE,QAAQ,WAAW,OAAO,kBAAkB,IAAI,EAAE,CAAC,GAAG,UACtD,WACA;AACA,kBACE,QAAQ,iBAAiB,YACvB,QAAQ,UAAU,WACpB,QAAQ,iBAAiB,cACvB,QAAQ,UAAU,aACpB,QAAQ,iBAAiB,aACvB,QAAQ,UAAU,YACpB,kBAAkB,QAAQ,WAAW,IAAI,EAAE,MAAM,IAAI,YACrD,kBAAkB,QAAQ,iBAAiB,IAAI,EAAE,MAC/C,IAAI;AAEN,uBAAO;AAAA,kBACL,eACE;AAAA,gBACJ;AACF,oBAAM,UAAU,OAAO,OAAO;AAAA,gBAC5B,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,cAC3B;AACA,oBAAM,KAAK,UACN,eAAe,SAAS,GAAG,IAC5B;AACJ,oBAAM,SACJ,OAAO,OACH,SACA,QAAQ,gBAAgB,IAAI,EAAE,IAAI,IAAI,EAAE;AAC9C,qBAAO,SACH,OAAO,QACL,EAAE,eAAe,OAAO,MAAM,KAAK,IACnC,OAAO,QACT,EAAE,eAAe,sCAAsC;AAAA,YAC7D;AACA,kBAAM,SACJ,WAAW,SAAS,QAAQ,UAAU,UAAU,QAC5C,UAAU,OAAO,IAAI,IAAI,EAAE,IAAI,QAAQ,IAAI,GAAG,KAAK,EAAE,IACrD;AACN,mBAAO,QAAQ,QACX,EAAE,eAAe,OAAO,MAAM,IAC9B,SACE,OAAO,QACP,EAAE,eAAe,oBAAe;AAAA,UACxC;AAAA,QACF;AAAA,QACA,QAAQ,EAAE,SAAS,QAAQ,WAAW,OAAO,kBAAkB,IAAI,EAAE,CAAC,GAAG,WAAW,QAClF,kBAAkB,QAAQ,WAAW,IAAI,EAAE,MAAM,IAAI,YAAY,CAAC,CAAC,OAAO,QAAQ,CAAC,SAAS,MAAM,IAAI,EAAE;AAAA,QAC1G,MAAM;AAAA,UACJ,SACE,CAAC,CAAC,aACF,CAAC,CAAC,QAAQ,WAAW,OAAO,kBAAkB,IAAI,EAAE,CAAC,GAAG,QACxD,kBAAkB,QAAQ,WAAW,IAAI,EAAE,MAAM,IAAI,YACrD,CAAC,CAAC,OAAO,QACT,CAAC,SAAS,MAAM,IAAI;AAAA,QACxB;AAAA,QACA,WAAW;AAAA,UACT,SAAS,CAAC,CAAC,OAAO;AAAA,UAClB,WACE,CAAC,CAAC,mBACF,CAAC,CAAC,iBAAiB,OAAO,kBAAkB,IAAI,EAAE,CAAC,GAAG,SACtD,kBAAkB,iBAAiB,IAAI,EAAE,MAAM,IAAI,YACnD,CAAC,CAAC,OAAO,QACT,CAAC,SAAS,MAAM,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF,CAAC;AACD,eAAW,OAAO;AAChB,UACE,gBAAgB,IAAI,KAAK,KACzB,CAAC,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK;AAExC,eAAO,KAAK;AAAA,UACV,MAAM,IAAI;AAAA,UACV,OAAO,IAAI,MAAM,MAAM,EAAE;AAAA,UACzB,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAY,IAAI,MAAM,MAAM,EAAE;AAAA,YAC9B,UAAU,OAAO;AAAA,cACf,eAAe,UACX,6BACA;AAAA,YACN;AAAA,UACF;AAAA,UACA,QAAQ,EAAE,SAAS,MAAM;AAAA,UACzB,MAAM,EAAE,SAAS,MAAM;AAAA,UACvB,WAAW,EAAE,SAAS,OAAO,WAAW,MAAM;AAAA,QAChD,CAAC;AACL,WAAO,EAAE,GAAG,QAAQ,QAAQ,CAAC,GAAG,OAAO,QAAQ,GAAG,MAAM,EAAE;AAAA,EAC5D,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,OAAOG;AAAA,IACX,OAAO,QAA6B,qBAAoC;AACtE,cAAQ,OAAO,WAAW,QAAQ,OAAO,EAAE;AAC3C,YAAM,QAAQ;AAAA,QACZ,MAAM,MAAM,KAAK,OAAO,MAAM,QAAQ,gBAAgB;AAAA,MACxD;AACA,mBAAa,CAAC,UAAU;AAAA,QACtB,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,OAAO;AAAA,UACL,GAAI,MAAM,YAAY,OAAO,QAAQ,KAAK,UAAU,QAChD,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,IAC1C,CAAC;AAAA,UACL;AAAA,QACF;AAAA,MACF,EAAE;AACF,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS,OAAO,OAAO,IAAI;AAAA,EAC9B;AACA,QAAM,iBAAiBD,QAA+B,IAAI;AAC1D,QAAM,UAAUC;AAAA,IACd,OACE,QACA,OACA,QACA,WACA,gBAAgB,SACW;AAC3B,qBAAe,SAAS,MAAM;AAC9B,YAAM,aAAa,IAAI,gBAAgB;AACvC,qBAAe,UAAU;AACzB,YAAMG,SAAQ,MAAM,WAAW,MAAM;AACrC,cAAQ,iBAAiB,SAASA,QAAO,EAAE,MAAM,KAAK,CAAC;AACvD,UAAI,QAAQ,QAAS,YAAW,MAAM;AACtC,UAAI;AACF,YAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ;AACnD,gBAAM,IAAI,MAAM,mCAAmC;AACrD,cAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,YAAI,QAAe,CAAC,GAClB,QAAQ;AACV,YAAI,WAAW;AACb,gBAAM,UAAU;AAAA,YACd,GAAG;AAAA,YACH,GAAI,QAAQ,cAAc,WACtB,EAAE,UAAU,QAAQ,aAAa,SAAS,IAAI,CAAC;AAAA,YACnD,QAAQ;AAAA,cACN,GAAG,oBAAI,IAAI,CAAC,OAAO,SAAS,GAAG,oBAAoB,IAAI,CAAC,CAAC;AAAA,YAC3D,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAAA,YAC5B,OAAO,KAAK,IAAI,OAAO,GAAG;AAAA,YAC1B,QAAQ;AAAA,UACV;AACA,gBAAM,MAAM,QAAQ,OAAO,KAAK,IAAI;AACpC,gBAAM,WAAW,KAAK,IAAI,KAAK,UAAU,kBAAkB,OAAO;AAClE,cAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,EAAG,OAAM,MAAM,uCAAuC;AACpG,iBAAO,MAAM,SAAS,OAAO;AAC3B,kBAAM,MAAM,MAAM;AAAA,cAAiB;AAAA,cACjC;AAAA,gBACE,GAAG;AAAA,gBACH,QAAQ,MAAM;AAAA,gBACd,OAAO,KAAK,IAAI,UAAU,QAAQ,MAAM,MAAM;AAAA,cAChD;AAAA,cACA;AAAA,cAAQ,QAAQ;AAAA,cAAW;AAAA,cAAa;AAAA,cAAK,WAAW;AAAA,cAAQ,QAAQ;AAAA,YAC1E;AACA,oBAAQ,IAAI;AACZ,kBAAM,KAAK,GAAG,IAAI,KAAK,MAAM,GAAG,QAAQ,MAAM,MAAM,CAAC;AACrD,gBAAI,CAAC,IAAI,KAAK,UAAU,MAAM,UAAU,MAAO;AAAA,UACjD;AAAA,QACF,OAAO;AACL,gBAAM,SAAS;AAAA,YACb,cAAc,CAAC;AAAA,YACf,EAAE,GAAG,OAAO,OAAO,OAAO,QAAQ,EAAE;AAAA,YACpC;AAAA,UACF;AACA,kBAAQ,OAAO;AACf,kBAAQ,OAAO;AAAA,QACjB;AACA,cAAM,SAAS,UAAU,MAAM,KAAK,GAClC,UAAU,MAAM;AAAA,UACd,KAAK;AAAA,UACL;AAAA,UACA,WAAW;AAAA,UACX;AAAA,QACF;AACF,YAAI,WAAW,OAAO,QAAS,OAAM,IAAI,aAAa,WAAW,YAAY;AAC7E,eAAO;AAAA,UACL,gBAAgB,KAAK,eAAe,CAAC;AAAA,UACrC;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,UAAE;AACA,gBAAQ,oBAAoB,SAASA,MAAK;AAC1C,YAAI,eAAe,YAAY,WAAY,gBAAe,UAAU;AAAA,MACtE;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,cAAc;AAAA,MACtB,QAAQ;AAAA,IACV;AAAA,EACF;AACA,EAAAF,WAAU,MAAM,MAAM,eAAe,SAAS,MAAM,GAAG,CAAC,OAAO,CAAC;AAChE,SAAO;AAAA,IACL;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA,WAAW,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AL5gBA,SAAS,eAAAG,eAAa,aAAAC,aAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,kBAAgB;AAClE;AAAA,EACE;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA,uBAAAC;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EAEA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,OACK;;;AO/CP,SAAS,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAiBlE,SAAS,YAAY,SAA6C;AAChE,SAAO,SAAS,WAAW,mBAAmB,SAAS,OAAO,SAAS;AACzE;AAGO,SAAS,iBACd,WACA,SACA,QACgB;AAChB,QAAM,WAAW,oBAAI,IAA0B;AAC/C,SAAO,IAAI,MAAM,OAAO,OAAO,SAAS,GAAqB;AAAA,IAC3D,IAAI,SAAS,KAAK;AAChB,YAAM,SAAS,QAAQ,IAAI,WAAW,KAAK,SAAS;AACpD,UAAI,QAAQ,kBAAkB,OAAO,WAAW;AAC9C,eAAO;AACT,UAAI,CAAC,SAAS,IAAI,GAAG;AACnB,iBAAS,IAAI,KAAK,UAAU,SAAoB;AAC9C,gBAAM,SAAS,KAAK,CAAC;AACrB,gBAAM,QAAQ,YAAY,IAAI;AAC9B,gBAAM,QAA8B;AAAA,YAClC,IAAI,OAAO;AAAA,YACX,MAAM,YAAY,KAAK,CAAC,CAA+B;AAAA,YACvD,WAAW,KAAK,IAAI;AAAA,YACpB,QAAQ;AAAA,UACV;AACA,kBAAQ,KAAK;AACb,cAAI,OAAO;AACX,gBAAM,SAAS,CACb,QACA,UACG;AACH,gBAAI,KAAM;AACV,mBAAO;AACP,oBAAQ;AAAA,cACN,GAAG;AAAA,cACH;AAAA,cACA,YAAY,KAAK,IAAI,GAAG,YAAY,IAAI,IAAI,KAAK;AAAA,cACjD,GAAI,UAAU,SACV;AAAA,gBACE,OACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,cACzD,IACA,CAAC;AAAA,YACP,CAAC;AAAA,UACH;AACA,gBAAMC,SAAQ,MAAM,OAAO,SAAS;AACpC,kBAAQ,iBAAiB,SAASA,QAAO,EAAE,MAAM,KAAK,CAAC;AACvD,cAAI,QAAQ,QAAS,CAAAA,OAAM;AAC3B,cAAI;AACF,kBAAM,SAAS,MAAM,OAAO,MAAM,WAAW,IAAI;AACjD,mBAAO,QAAQ,UAAU,YAAY,SAAS;AAC9C,mBAAO;AAAA,UACT,SAAS,OAAO;AACd;AAAA,cACE,QAAQ,WACL,iBAAiB,SAAS,MAAM,SAAS,eACxC,YACA;AAAA,cACJ;AAAA,YACF;AACA,kBAAM;AAAA,UACR,UAAE;AACA,oBAAQ,oBAAoB,SAASA,MAAK;AAAA,UAC5C;AAAA,QACF,CAAC;AACH,aAAO,SAAS,IAAI,GAAG;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAEO,SAAS,mBACd,QACA,cACA;AACA,QAAM,CAAC,SAAS,UAAU,IAAID,UAAiC,CAAC,CAAC;AACjE,QAAM,WAAWD,QAAO,CAAC,GACvB,UAAUA,QAAO,IAAI;AACvB,EAAAF,WAAU,MAAM;AACd,YAAQ,UAAU;AAClB,WAAO,MAAM;AACX,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AACL,QAAM,UAAUD,aAAY,CAAC,UAAgC;AAC3D,QAAI,QAAQ;AACV;AAAA,QAAW,CAAC,aACV,CAAC,OAAO,GAAG,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,CAAC,EACjD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,EAC1B,MAAM,GAAG,GAAG;AAAA,MACjB;AAAA,EACJ,GAAG,CAAC,CAAC;AACL,QAAM,YAAYE;AAAA,IAChB,MACE,SACI,iBAAiB,QAAQ,SAAS,MAAM,EAAE,SAAS,OAAO,IAC1D;AAAA,IACN,CAAC,QAAQ,OAAO;AAAA,EAClB;AACA,QAAM,QAAQF;AAAA,IACZ,MACE,WAAW,CAAC,aAAa,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,CAAC;AAAA,IACzE,CAAC;AAAA,EACH;AACA,QAAM,kBAAkBE;AAAA,IACtB,MAAM,CAAC,gBAAgB,iBAAiB,SACpC,YACA,iBAAiB,cAAc,SAAS,MAAM,EAAE,SAAS,OAAO;AAAA,IACpE,CAAC,cAAc,QAAQ,WAAW,OAAO;AAAA,EAC3C;AACA,QAAM,WAA+BA;AAAA,IACnC,OAAO,EAAE,SAAS,MAAM;AAAA,IACxB,CAAC,SAAS,KAAK;AAAA,EACjB;AACA,SAAO,EAAE,WAAW,iBAAiB,SAAS;AAChD;;;ACpIA,SAAS,eAAAI,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AAClE;AAAA,EACE;AAAA,OAOK;;;ACTP;AAAA,EACE;AAAA,EACA;AAAA,EACA,uBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA,yBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,yBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA,mBAAAC;AAAA,OAWK;AA0BP,IAAM,QAAQ,CAAC,WAAyB;AACtC,MAAI,QAAQ,QAAS,OAAM,IAAI,aAAa,WAAW,YAAY;AACrE;AAMO,SAAS,oBACd,QACA,SACS;AACT,MAAI,OAAO,UAAU,YAAa,QAAO;AACzC,MAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,UAAW,QAAO;AACrD,MAAI,QAAQ,WAAW,kBAAkB,0BAA2B,QAAO;AAC3E,MAAI;AACF,WAAO,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,eAAe,EAAE,KAAKC,SAAQ;AAAA,EACnF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,iBACpB,WACA,OACA,YACA,cACA,WACA,KACA,QAC4B;AAC5B,QAAM,eAAe,UAAU;AAC/B,QAAM,UAAU,oBAAI,IAAwB;AAC5C,aAAW,UAAU,MAAM,gBAAgB,CAAC,GAAG;AAE7C,QAAI,OAAO,eAAe;AACxB,cAAQ,IAAI,OAAO,IAAI,IAAI,WAAW,kBAAkB,UAAU,OAAO,EAAE,mCAAmC,OAAO,aAAa,KAAK,EAAE,UAAU,OAAO,GAAG,CAAC,CAAC;AAC/J;AAAA,IACF;AACA,UAAM,QAAQ,sBAAsB,QAAQ,EAAE,SAAS,aAAa,eAAe,UAAU,aAAa,gBAAgB,kBAAkB,aAAa,uBAAuB,CAAC;AACjL,QAAI,MAAO,SAAQ,IAAI,OAAO,IAAI,IAAI,WAAW,0BAA0B,OAAO,EAAE,UAAU,OAAO,GAAG,CAAC,CAAC;AAAA,EAC5G;AACA,MAAI,YAAY,MAAM,gBAAgB,CAAC,GAAG,OAAO,YAAU,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;AAClF,QAAM,UAAU,CAAC,MAA0C;AACzD,QAAI;AAAE,MAAAC,kBAAiB,GAAG,YAAY,cAAc,WAAW,EAAE,KAAK,MAAM,MAAM,CAAC;AAAA,IAAG,SAC/E,OAAO;AAAE,UAAI,iBAAiB,WAAY,QAAO;AAAO,YAAM;AAAA,IAAO;AAAA,EAC9E;AAGA,QAAM,UAAU,EAAE,GAAG,OAAO,SAAS,CAAC,GAAG,QAAQ,EAAE;AACnD,QAAM,QAAQ,SAAS,OAAO,YAAU,OAAO,UAAU,WAAW;AAGpE,QAAM,OAAO,MAAM,SAAS,QAAQ,EAAE,GAAG,OAAO,cAAc,CAAC,EAAE,CAAC,IAAI;AACtE,MAAI,QAAQ,CAAC,QAAQ,EAAE,GAAG,SAAS,cAAc,CAAC,EAAE,CAAC,GAAG;AACtD,eAAW,UAAU,MAAO,SAAQ,IAAI,OAAO,IAAI,IAAI;AACvD,eAAW,SAAS,OAAO,YAAU,OAAO,UAAU,WAAW;AAAA,EACnE;AACA,MAAI,UAAwC,CAAC;AAC7C,MAAI,SAAS,QAAQ;AACnB,UAAM,QAAQ,SAAS,KAAK,YAAU,OAAO,UAAU,WAAW;AAClE,UAAM,UAAUA,kBAAiB,EAAE,GAAI,QAAQ,QAAQ,SAAU,cAAc,SAAS,GAAG,YAAY,cAAc,WAAW,EAAE,KAAK,MAAM,MAAM,CAAC;AACpJ,UAAM,SAAS,MAAM,UAAU,aAAa,SAAS,MAAM;AAC3D,IAAAC,uBAAsB,QAAQ,SAAS,YAAY;AACnD,cAAU,OAAO;AAAA,EACnB;AACA,MAAI,CAAC,QAAQ,KAAM,QAAO,EAAE,QAAQ;AACpC,QAAM,OAAO,IAAI,IAAI,QAAQ,IAAI,YAAU,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AAC/D,SAAO,EAAE,UAAU,MAAM,gBAAgB,CAAC,GAAG,QAAQ,CAAC,WAAyC;AAC7F,UAAM,QAAQ,QAAQ,IAAI,OAAO,EAAE;AACnC,QAAI,MAAO,QAAO,CAAC,EAAE,IAAI,OAAO,IAAI,SAAS,CAAC,GAAG,OAAO,MAAM,SAAS,WAAW,MAAM,KAAK,CAAC;AAC9F,UAAM,SAAS,KAAK,IAAI,OAAO,EAAE;AACjC,WAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAAA,EAC9B,CAAC,EAAE;AACL;AAGA,eAAe,aACb,MACA,OACA,SACA,QAC4B;AAG5B,QAAM,kBAAkB,MAAM,gBAAgB,CAAC;AAC/C,QAAM,YAAY,MAAM,gBAAgB,CAAC,GAAG;AAAA,IAC1C,CAAC,MACC,QAAQ,sBACR,EAAE,gBACFC,iBAAgB,EAAE,SAAS,EAAE,KAC7B,EAAE,QAAQ,KAAKA,gBAAe,KAC9B,EAAE,aAAa,UACf,EAAE,eAAe,UACjB,EAAE,gBAAgB,UAClB,EAAE,UAAU,UACZ,EAAE,gBACF,EAAE,QACF,EAAE,eAAe,UACjB,EAAE,UAAU,UACZ,EAAE,aAAa,UACf,gBAAgB,CAAC;AAAA,EACrB;AACA,MACE,SAAS,WACR,gBAAgB,SAAS,MACxBC,qBAAoB,KAAK,EAAE,cAAc,WACvC,gBAAgB;AAEpB,WAAO,gBAAgB,MAAM,OAAO,QAAQ,QAAQ;AAAA,MAClD,GAAI,QAAQ,QAAQ,SAAY,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,MACxD,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC3B,GAAI,QAAQ,kBACR,EAAE,iBAAiB,QAAQ,gBAAgB,IAC3C,CAAC;AAAA,IACP,CAAC;AACH,QAAM,UAAU,MAAM,gBAAgB,CAAC,GAAG;AAAA,IACxC,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA,EAC7B;AACA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,EAAE,GAAG,OAAO,cAAc,OAAO;AAAA,IACjC,QAAQ;AAAA,IACR;AAAA,MACE,GAAI,QAAQ,QAAQ,SAAY,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,MACxD,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,UAAQ,EAAE,GAAG,OAAO,cAAc,SAAS;AAC3C,QAAM,UAAU;AAAA,IACd,GAAI,QAAQ,QAAQ,SAAY,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,IACxD,GAAI,QAAQ,kBACR,EAAE,iBAAiB,QAAQ,gBAAgB,IAC3C,CAAC;AAAA,IACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B;AACA,aAAW,UAAU,MAAM,gBAAgB,CAAC,GAAG;AAC7C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,QAAI,YAAY;AACd,YAAM,IAAI,WAAW,kBAAkB,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,CAAC;AAAA,EAC/G;AACA,QAAM,gBAAgB,MAAM,gBAAgB,CAAC,GAAG;AAAA,IAC9C,CAAC,WAAW,OAAO,UAAU;AAAA,EAC/B;AACA,QAAM,OAAO,eACT,sBAAsB,MAAM,OAAO,QAAQ,QAAQ;AAAA,IACjD,GAAG;AAAA,IACH,GAAI,QAAQ,aAAa,QAAQ,YAC7B,EAAE,WAAW,QAAQ,UAAU,IAC/B,CAAC;AAAA,EACP,CAAC,IACD,CAAC;AACL,QAAM,SAAS,oBAAI,IAAqC;AACxD,aAAW,UAAU,MAAM,gBAAgB,CAAC,GAAG;AAC7C,eAAW,QAAQ;AAAA,MACjB;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,GAAG;AACD,UAAI,CAACJ,UAAS,IAAI,EAAG;AACrB,YAAM,QACJ,gBAAgB,OAEV,KAGA,WAAW,QAAQ,CAAC,MAAM,EAAE,IAAI,IAClC,CAAC,KAAK,GAAG;AACf,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAACA,UAAS,EAAE,GAAG,MAAM,KAAK,KAAK,CAAC,EAAG;AACvC,cAAM,MAAM,KAAK,UAAU,IAAI;AAC/B,YAAI,OAAO,IAAI,GAAG,EAAG;AACrB,YAAI,QAAQ;AACZ,cAAM,SAAS,KAAK,IAAI,CAAC,QAAQ;AAC/B,gBAAMK,UAAuC,uBAAO,OAAO,IAAI;AAC/D,qBAAW,QAAQ,KAAK,cAAc;AACpC,kBAAM,QAAQ,QAAQ,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAC/D,gBAAI,CAAC,MAAO,OAAM,MAAM,6BAA6B,IAAI,EAAE;AAC3D,kBAAM,MAAMC,gBAAe,OAAO,GAAG;AACrC,YAAAD,QAAO,IAAI,IACT,eAAe,OACX,IAAI,YAAY,IACd,OAAO;AAAA,UACjB;AACA,mBAAS,KAAK,UAAUA,OAAM,EAAE;AAChC,cAAI,QAAQ;AACV,kBAAM;AAAA,cACJ;AAAA,YACF;AACF,iBAAOA;AAAA,QACT,CAAC;AACD,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV;AACA,eAAO;AAAA,UACL;AAAA,UACA,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,OAAO,CAAC,CAAE,CAAU,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM;AACZ,QAAM,QAAQ,gBAAgB,MAAM,OAAO,QAAQ,QAAQ;AAAA,IACzD,GAAG;AAAA,IACH,WAAW;AAAA,IACX,GAAI,OAAO,OACP;AAAA,MACE,eAAe,CAAC,MAAmB,KAAU,SAAsB;AACjE,cAAM,SAAS,OAAO,IAAI,KAAK,UAAU,IAAI,CAAC;AAC9C,YAAI;AACF,iBACE,OAAO,IAAI,GAAG,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAGJ,cAAM,MAAM,mDAAmD;AAAA,MACjE;AAAA,IACF,IACA,CAAC;AAAA,EACP,CAAC;AACD,QAAM,OAAO,IAAI;AAAA,IACf,CAAC,GAAG,WAAW,SAAS,GAAG,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,EAChE;AACA,SAAO,EAAE,SAAS,gBAAgB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE;AACzE;AAEA,eAAsB,eACpB,OACA,SACA,QAC4B;AAC5B,QAAM,MAAM;AACZ,QAAM,UAAU,MAAM,gBAAgB,CAAC;AACvC,MAAI,CAAC,QAAQ,OAAQ,QAAO,EAAE,SAAS,CAAC,EAAE;AAG1C,QAAM,SAAS,iBAAiB,OAAO,QAAQ,QAAQ;AAAA,IACrD,GAAI,QAAQ,QAAQ,SAAY,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,IACxD,GAAI,QAAQ,kBAAkB,EAAE,iBAAiB,QAAQ,gBAAgB,IAAI,CAAC;AAAA,EAChF,CAAC;AACD,MAAI,QAAQ;AACV,UAAM,QAAQ,MAAM,QAAQ;AAAA,MAC1B,OAAO,QAAQ,IAAI,CAAC,SAAS,eAAe,MAAM,SAAS,MAAM,CAAC;AAAA,IACpE;AACA,WAAO,EAAE,SAAS,OAAO,QAAQ,MAAM,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE;AAAA,EAC1E;AACA,MAAI,QAAQ,aAAa,QAAQ,WAAW;AAC1C,UAAM,OAAO,QAAQ,OAAO,OAAK,oBAAoB,GAAG,OAAO,CAAC;AAChE,UAAM,SAAS,CAAC,MAAkB,QAAQ,YAAY,QAAQ,UAAU,GAAG,MAAM,IAC7E;AAAA,MAAiB,QAAQ;AAAA,MAAY;AAAA,MAAG,QAAQ;AAAA,MAAQE,uBAAsB,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MAC/G,QAAQ;AAAA,MAAW,QAAQ,OAAO,KAAK,IAAI;AAAA,MAAG;AAAA,IAAM;AACxD,QAAI,CAAC,KAAK,OAAQ,QAAO,OAAO,KAAK;AACrC,UAAM,EAAE,WAAW,YAAY,WAAW,YAAY,GAAG,MAAM,IAAI;AACnE,UAAM,OAAO,QAAQ,OAAO,OAAK,CAAC,KAAK,SAAS,CAAC,CAAC;AAClD,UAAM,CAAC,KAAK,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MAAC,eAAe,EAAE,GAAG,OAAO,cAAc,KAAK,GAAG,OAAO,MAAM;AAAA,MACrG,KAAK,SAAS,OAAO,EAAE,GAAG,OAAO,cAAc,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE;AAAA,IAAC,CAAC;AAC3E,UAAMC,QAAO,IAAI,IAAI,CAAC,GAAG,IAAI,SAAS,GAAG,OAAO,OAAO,EAAE,IAAI,YAAU,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AAC3F,WAAO,EAAE,SAAS,QAAQ,QAAQ,OAAKA,MAAK,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE;AAAA,EAC/D;AACA,MAAI,QAAQ,cAAc,SAAS,QAAQ,KAAK,OAAK,oBAAoB,GAAG,OAAO,CAAC;AAClF,UAAM,MAAM,sEAAsE;AACpF,MAAI,QAAQ;AACV,WAAO,aAAa,QAAQ,YAAY,OAAO,SAAS,MAAM;AAChE,QAAM,QAAQ,QAAQ,OAAO,OAAK,oBAAoB,GAAG,OAAO,CAAC;AACjE,QAAM,WAAW,QAAQ,OAAO,OAAK,CAAC,MAAM,SAAS,CAAC,CAAC;AACvD,QAAM,UAAwC,CAAC;AAC/C,MAAI,MAAM,QAAQ;AAChB,QAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ;AACjC,YAAM;AAAA,QACJ;AAAA,MACF;AAGF,UAAM,QAAQ,IAAI;AAAA,MAChB,MAAM,QAAQ,CAAC,WAAW;AAAA,QACxB,GAAG,OAAO;AAAA,QACV,IAAI,OAAO,SAAS,CAAC,GAAG;AAAA,UAAQ,CAAC,SAC/BC,cAAa,IAAI,EAAE,IAAI,CAAC,cAAc,UAAU,KAAK;AAAA,QACvD;AAAA;AAAA,QAEA,GAAG,mBAAmB,QAAQ,QAAQ,QAAQ,QAAQ,eAAe;AAAA,MACvE,CAAC;AAAA,IACH;AACA,eAAW,QAAQ,OAAO;AACxB,YAAM,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,KAAK;AAC5D,YAAM,QAAQ,QAAQ,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACpE,YAAM,eACJ,OAAO,OAAO,SAAS,YAClB,MAAM,OAAO,gBAAgB,CAAC,IAC/B,CAAC,SAAS;AAChB,YAAM,SAAS,QAAQ,cACnB,aAAa,MAAM,CAAC,QAAQ,QAAQ,YAAa,SAAS,GAAG,CAAC,IAC9D,SACA,QAAQ,UAAU;AAAA,QAChB,CAAC,QACC,MAAM,OAAO,SAAS,aACtB;AAAA,UACE;AAAA,UACA,MAAM,OAAO,SAAS,YACjB,MAAM,OAAO,QAAQ,MAAM,OAC5B,MAAM;AAAA,QACZ;AAAA,MACJ;AACJ,UAAI,CAAC,SAAS,CAAC;AACb,cAAM;AAAA,UACJ,oBAAoB,IAAI;AAAA,QAC1B;AAAA,IACJ;AAGA,UAAM,YAAY;AAAA,MAChB,GAAG;AAAA,MACH,SAAS,CAAC;AAAA,MACV,OAAO,KAAK,IAAI,GAAG,QAAQ,UAAU,MAAM;AAAA,MAC3C,QAAQ;AAAA,MACR,cAAc;AAAA,IAChB;AACA,YAAQ;AAAA,MACN,IAAI,MAAM,aAAa,QAAQ,WAAW,WAAW,SAAS,MAAM,GACjE;AAAA,IACL;AAAA,EACF;AACA,MAAI,SAAS;AACX,UAAM;AAAA,MACJ;AAAA,IACF;AACF,QAAM,MAAM;AACZ,QAAM,OAAO,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,SAAO;AAAA,IACL,SAAS,QAAQ;AAAA,MACf,CAAC,MACC,KAAK,IAAI,EAAE,EAAE,KAAK;AAAA,QAChB,IAAI,EAAE;AAAA,QACN,SAAS,CAAC;AAAA,QACV,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAAS,WAAW,KAAc,MAAuB;AACvD,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,MAAI,QAAQ,IAAK,QAAO;AACxB,MAAI,QAAiB;AACrB,aAAW,QAAQ,KAAK,MAAM,GAAG,GAAG;AAClC,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,QAAQ,OAAQ,QAAO;AACpE,YAAS,MAAkC,IAAI;AAAA,EACjD;AACA,SAAO;AACT;;;AD7YA,SAAS,UAAe,QAA2B,SAAsC;AACvF,MAAI;AACF,WAAO,oBAAoB,QAAQ,OAAO;AAAA,EAC5C,QAAQ;AAGN,WAAO,CAAC,QAAQ,aAAa,OAAO,UAAU;AAAA,EAChD;AACF;AAGA,SAAS,eACP,OACA,SACA,SACA,YACA,OACA,eACA,SACA,MACY;AACZ,QAAM,QAAQ,QAAQ,KAAK,OAAK,EAAE,UAAU,WAAW;AACvD,QAAM,MAAM,KAAK,UAAU;AAAA,IACzB,MAAM;AAAA,IACN,qBAAqB,OAAO;AAAA,IAC5B,QAAQ,CAAC,MAAM,SAAS,MAAM,OAAO,MAAM,MAAM,IAAI;AAAA,IACrD,QAAQ,aAAa,CAAC;AAAA,IAAG,QAAQ,aAAa;AAAA,IAAM,QAAQ;AAAA,IAC5D,QAAQ;AAAA,IAAoB,QAAQ;AAAA,IACpC,OAAO,QAAQ,cAAc;AAAA,EAC/B,CAAC;AACD,QAAM,eAAe,CAAC,QAAQ,aAAa,CAAC,QAAQ;AAGpD,QAAM,YAAY,QAAQ,cAAc,gBAAgB,QAAQ,eAAe;AAC/E,QAAM,kBAAkBC,SAAQ,OAAO,CAAC,IAAI;AAAA,IAC1C;AAAA,IAAK,QAAQ;AAAA,IAAQ,QAAQ;AAAA,IAAW;AAAA,IAAO;AAAA,IAAe;AAAA,EAChE,CAAC;AACD,QAAM,QAAQA,SAAQ,OAAO,CAAC,IAAI;AAAA,IAChC;AAAA,IAAK,QAAQ;AAAA,IAAQ,QAAQ;AAAA,IAC7B,eAAe,QAAQ,aAAa;AAAA,IACpC;AAAA,IAAY;AAAA,IAAO;AAAA,IAAe;AAAA,IAAS;AAAA,IAAM,QAAQ;AAAA,IACzD,OAAO,QAAQ,YAAY;AAAA,IAC3B,OAAO,QAAQ,YAAY;AAAA,IAC3B,OAAO,QAAQ,YAAY;AAAA,EAC7B,CAAC;AACD,QAAM,SAASC,QAAO,EAAE,OAAO,SAAS,SAAS,cAAc,CAAC;AAChE,SAAO,UAAU,EAAE,OAAO,SAAS,SAAS,cAAc;AAC1D,QAAM,CAAC,OAAO,QAAQ,IAAIC;AAAA,IACxB,EAAE,OAAO,SAAS,MAAM,SAAS,WAAW,QAAQ,SAAS,GAAG,OAAO,KAAK;AAAA,EAC9E;AACA,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,OAAO,QAAQ,QAAQ,OAAQ;AAChD,UAAM,KAAK,IAAI,gBAAgB;AAC/B,UAAM,QAAQ,WAAW,MAAM;AAC7B,YAAM,UAAU,OAAO;AAEvB,UAAI;AACF,gBAAQ,gBAAgB,QAAQ,KAAK;AAAA,MACvC,SAAS,GAAG;AACV,iBAAS,EAAE,OAAO,iBAAiB,SAAS,MAAM,SAAS,OAAO,OAAO,aAAa,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC;AACpH;AAAA,MACF;AACA,UAAI,QAAQ,CAAC,UAAW;AACxB,WAAK,eAAe,EAAE,GAAG,QAAQ,OAAO,cAAc,QAAQ,QAAQ,GAAG,QAAQ,SAAS,GAAG,MAAM,EAChG,KAAK,aAAW;AACf,YAAI,CAAC,GAAG,OAAO,QAAS,UAAS,EAAE,OAAO,SAAS,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,MAClF,CAAC,EACA,MAAM,OAAK;AACV,YAAI,CAAC,GAAG,OAAO,QAAS,UAAS,EAAE,OAAO,SAAS,MAAM,SAAS,OAAO,OAAO,aAAa,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC;AAAA,MAC7H,CAAC;AAAA,IACL,GAAG,UAAU;AACb,WAAO,MAAM;AAAE,SAAG,MAAM;AAAG,mBAAa,KAAK;AAAA,IAAG;AAAA,EAClD,GAAG,CAAC,KAAK,CAAC;AACV,MAAI,CAAC,WAAW,CAAC,QAAQ,OAAQ,QAAO,EAAE,SAAS,MAAM,SAAS,OAAO,OAAO,KAAK;AAGrF,MAAI,MAAM,oBAAoB,mBAAmB,MAAM,MAAO,QAAO;AACrE,MAAI,QAAQ,CAAC,aAAa,QAAQ;AAChC,WAAO,EAAE,SAAS,MAAM,SAAS,OAAO,OAAO,QAAQ,UAAU;AAGnE,MAAI,MAAM,UAAU,MAAO,QAAO,EAAE,SAAS,MAAM,SAAS,MAAM,OAAO,KAAK;AAC9E,SAAO;AACT;AAGO,SAAS,gBACd,OACA,QACA,WACA,YACA,YACA,OACA,eACA,UAAoF,CAAC,GACrF,UAAU,MACY;AACtB,QAAM,UAAU,EAAE,QAAQ,WAAW,YAAY,GAAG,QAAQ;AAC5D,QAAM,UAAU,MAAM,gBAAgB,CAAC;AACvC,QAAM,cAAc,QAAQ,OAAO,OAAK,UAAU,GAAG,OAAO,CAAC;AAC7D,QAAM,eAAe,QAAQ,OAAO,OAAK,CAAC,YAAY,SAAS,CAAC,CAAC;AACjE,QAAM,QAAQ,eAAe,OAAO,cAAc,SAAS,YAAY,OAAO,eAAe,SAAS,KAAK;AAC3G,QAAM,OAAO,eAAe,OAAO,aAAa,SAAS,YAAY,OAAO,eAAe,SAAS,IAAI;AAExG,QAAM,aAAa,KAAK,UAAU;AAAA,IAChC,MAAM;AAAA,IAAO,MAAM;AAAA,IAAS,MAAM;AAAA,IAAO,MAAM;AAAA,IAC/C,qBAAqB,OAAO;AAAA,IAAG,QAAQ;AAAA,IAAW,QAAQ;AAAA,IAC1D,QAAQ;AAAA,IAAK,QAAQ;AAAA,IAAoB,QAAQ;AAAA,EACnD,CAAC;AACD,QAAM,eAAeH,SAAQ,OAAO,CAAC,IAAI,CAAC,YAAY,QAAQ,WAAW,OAAO,eAAe,SAAS,QAAQ,aAAa,CAAC;AAC9H,QAAM,UAAU,KAAK,UAAU,CAAC,MAAM,SAAS,MAAM,OAAO,MAAM,QAAQ,QAAQ,WAAW,CAAC;AAC9F,QAAM,YAAYA,SAAQ,OAAO,CAAC,IAAI,CAAC,cAAc,SAAS,YAAY,QAAQ,WAAW,QAAQ,WAAW,QAAQ,SAAS,CAAC;AAClI,QAAM,SAASC,QAAO,EAAE,OAAO,SAAS,eAAe,SAAS,cAAc,UAAU,CAAC;AACzF,SAAO,UAAU,EAAE,OAAO,SAAS,eAAe,SAAS,cAAc,UAAU;AACnF,QAAM,WAAWA,QAAO,oBAAI,IAKzB,CAAC;AACJ,EAAAE,WAAU,MAAM,MAAM;AACpB,eAAW,WAAW,SAAS;AAC7B,UAAI,QAAQ,iBAAiB,aAAc,SAAQ,WAAW,MAAM;AAAA,EACxE,GAAG,CAAC,YAAY,CAAC;AACjB,EAAAA,WAAU,MAAM,MAAM;AACpB,eAAW,WAAW,SAAS;AAC7B,UAAI,QAAQ,QAAQ,QAAQ,cAAc,UAAW,SAAQ,WAAW,MAAM;AAAA,EAClF,GAAG,CAAC,SAAS,CAAC;AACd,QAAM,UAAUC,aAAY,OAAO,cAAmC,WAAyB;AAC7F,UAAM,UAAU,OAAO;AACvB,QAAI,CAAC,QAAQ,QAAS,OAAM,MAAM,mDAAmD;AACrF,UAAM,QAAQ,EAAE,GAAG,QAAQ,OAAO,cAAc,aAAa;AAC7D,YAAQ,gBAAgB,KAAK;AAC7B,UAAM,UAAU;AAAA,MACd,YAAY,IAAI,gBAAgB;AAAA,MAChC,MAAM,aAAa,KAAK,OAAK,UAAU,GAAG,QAAQ,OAAO,CAAC;AAAA,MAC1D,cAAc,QAAQ;AAAA,MACtB,WAAW,QAAQ;AAAA,IACrB;AACA,UAAM,SAAS,MAAM,QAAQ,WAAW,MAAM;AAC9C,YAAQ,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AACxD,QAAI,QAAQ,QAAS,QAAO;AAC5B,aAAS,QAAQ,IAAI,OAAO;AAC5B,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,OAAO,QAAQ,SAAS,QAAQ,WAAW,MAAM;AACrF,UAAI,QAAQ,WAAW,OAAO,WAAW,QAAQ,iBAAiB,OAAO,QAAQ,gBAC9E,QAAQ,QAAQ,QAAQ,cAAc,OAAO,QAAQ;AACtD,cAAM,IAAI,aAAa,WAAW,YAAY;AAChD,aAAO;AAAA,IACT,UAAE;AACA,eAAS,QAAQ,OAAO,OAAO;AAC/B,cAAQ,oBAAoB,SAAS,MAAM;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,KAAK,UAAU,QAAQ,IAAI,OAAK,EAAE,EAAE,CAAC;AACtD,QAAM,UAAUJ,SAAQ,MAAM;AAC5B,QAAI,CAAC,YAAY,OAAQ,QAAO,MAAM;AACtC,QAAI,CAAC,aAAa,OAAQ,QAAO,KAAK;AACtC,QAAI,CAAC,KAAK,WAAW,CAAC,MAAM,QAAS,QAAO;AAC5C,UAAM,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,SAAS,GAAG,MAAM,QAAQ,OAAO,EAAE,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5F,WAAO,EAAE,SAAS,QAAQ,QAAQ,OAAK,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE;AAAA,EAC/D,GAAG,CAAC,UAAU,YAAY,QAAQ,aAAa,QAAQ,KAAK,SAAS,MAAM,OAAO,CAAC;AACnF,SAAO,EAAE,SAAS,SAAS,KAAK,WAAW,MAAM,SAAS,OAAO,KAAK,SAAS,MAAM,OAAO,QAAQ;AACtG;;;AErLA,SAAS,eAAAK,cAAa,aAAAC,YAAW,WAAAC,UAAS,YAAAC,iBAAgB;AAmC1D,SAAS,UAAU,MAAe,OAAyB;AACzD,SAAO,KAAK,WAAW,MAAM,UAAU,KAAK,MAAM,CAAC,IAAI,UAAU,OAAO,MAAM,KAAK,CAAC;AACtF;AAIO,SAAS,aAAa,cAAqC;AAChE,QAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,IAAIA,UAAyB,OAAO;AAAA,IAC/D,UAAU,oBAAI,IAAI;AAAA,IAClB,OAAO;AAAA,EACT,EAAE;AAEF,EAAAF,WAAU,MAAM;AACd,aAAS,CAAC,SAAS,KAAK,SAAS,CAAC,UAAU,KAAK,MAAM,cAAc,YAAY,IAC7E,EAAE,UAAU,KAAK,UAAU,OAAO,KAAK,IACvC,IAAI;AAAA,EACV,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,SAASD;AAAA,IACb,CAAC,IAAW,WAAW,OAAO,WAAW,UAAU;AACjD,eAAS,CAAC,SAAS;AACjB,cAAM,QAAQ,KAAK;AACnB,YAAI,YAAY,SAAS,UAAU,MAAM,cAAc,YAAY,GAAG;AACpE,gBAAM,IAAI,aAAa,QAAQ,MAAM,MAAM;AAC3C,gBAAM,IAAI,aAAa,QAAQ,EAAE;AACjC,cAAI,MAAM,MAAM,MAAM,IAAI;AACxB,kBAAM,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AAGxC,kBAAM,cAAc,WAChB,EAAE,GAAG,OAAO,UAAU,KAAK,UAAU,WAAW,KAAK,IACrD;AACJ,kBAAMI,QAAO,IAAI,IAAI,YAAY,QAAQ;AACzC,uBAAW,SAAS,aAAa,MAAM,IAAI,KAAK,CAAC,GAAG;AAClD,kBAAI,YAAY,UAAW,CAAAA,MAAK,IAAI,KAAK;AAAA,kBACpC,CAAAA,MAAK,OAAO,KAAK;AAAA,YACxB;AACA,mBAAO,EAAE,UAAUA,OAAM,OAAO,YAAY;AAAA,UAC9C;AAAA,QACF;AACA,cAAM,OAAO,IAAI,IAAI,KAAK,QAAQ;AAClC,cAAM,YAAY,CAAC,KAAK,IAAI,EAAE;AAC9B,YAAI,UAAW,MAAK,IAAI,EAAE;AAAA,YACrB,MAAK,OAAO,EAAE;AACnB,eAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO,EAAE,QAAQ,IAAI,UAAU,KAAK,UAAU,WAAW,cAAc,CAAC,GAAG,YAAY,EAAE;AAAA,QAC3F;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,UAAUJ,aAAY,CAAC,KAAc,WAAoB;AAC7D,aAAS,CAAC,SAAS;AACjB,YAAM,OAAO,IAAI,IAAI,KAAK,QAAQ;AAClC,iBAAW,MAAM,KAAK;AACpB,YAAI,OAAQ,MAAK,IAAI,EAAE;AAAA,YAClB,MAAK,OAAO,EAAE;AAAA,MACrB;AACA,aAAO,EAAE,UAAU,MAAM,OAAO,KAAK;AAAA,IACvC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,UAAUA,aAAY,CAAC,QAAyB;AACpD,UAAM,OAAO,IAAI,IAAI,GAAG;AACxB,aAAS,EAAE,UAAU,MAAM,OAAO,KAAK,CAAC;AAAA,EAC1C,GAAG,CAAC,CAAC;AAEL,QAAM,SAASA,aAAY,CAAC,QAAyB;AACnD,UAAM,UAAU,IAAI,IAAI,GAAG;AAC3B,aAAS,CAAC,SAAS;AACjB,YAAM,OAAO,oBAAI,IAAW;AAC5B,iBAAW,MAAM,KAAK,SAAU,KAAI,QAAQ,IAAI,EAAE,EAAG,MAAK,IAAI,EAAE;AAChE,aAAO,EAAE,UAAU,MAAM,OAAO,KAAK;AAAA,IACvC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,YAAYA;AAAA,IAChB,CAAC,YAA8C;AAC7C,UAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAI,IAAI;AACR,iBAAW,MAAM,QAAS,KAAI,SAAS,IAAI,EAAE,EAAG;AAChD,aAAO,MAAM,IAAI,SAAS,MAAM,QAAQ,SAAS,QAAQ;AAAA,IAC3D;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,QAAQA,aAAY,MAAM;AAC9B,aAAS,EAAE,UAAU,oBAAI,IAAI,GAAG,OAAO,KAAK,CAAC;AAAA,EAC/C,GAAG,CAAC,CAAC;AAEL,SAAOE;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,YAAY,CAAC,OAAO,SAAS,IAAI,EAAE;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,IAClB;AAAA,IACA,CAAC,UAAU,QAAQ,SAAS,SAAS,QAAQ,WAAW,KAAK;AAAA,EAC/D;AACF;;;AC9IA,SAAS,eAAAG,cAAa,WAAAC,gBAAe;AAErC,SAAS,sBAAsB;AAsBxB,SAAS,UAAe,OAAmB,UAAoB,QAA0C;AAC9G,QAAM,SAASA,SAAQ,MAAM,eAAe,QAAQ,KAAK,GAAG,CAAC,QAAQ,KAAK,CAAC;AAI3E,QAAM,UAAUA,SAAwB,MAAM,OAAO,IAAI,CAAC,MAAM,UAAU,MAAM,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,MAAM,MAAM,CAAC;AAExH,QAAM,SAASA,SAAyB,MAAM;AAC5C,UAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC/C,WAAO,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,MAAM,EAAE,QAAQ,WAAW,KAAK;AAAA,EACtF,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,QAAM,cAAcD;AAAA,IAClB,CAAC,WAAqD;AACpD,eAAS,CAAC,SAAS;AAEjB,cAAM,UAAU,KAAK,OAAO,SAAS,KAAK,SAAS;AACnD,eAAO,EAAE,GAAG,MAAM,QAAQ,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,IACA,CAAC,UAAU,OAAO;AAAA,EACpB;AAEA,QAAM,OAAOA,aAAY,CAAC,UAAkB,YAAY,CAAC,MAAO,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,IAAI,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC,CAAE,GAAG,CAAC,WAAW,CAAC;AACzI,QAAM,OAAOA,aAAY,CAAC,UAAkB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;AACjH,QAAM,OAAOA;AAAA,IACX,CAAC,OAAe,YACd,YAAY,CAAC,MAAM;AACjB,YAAM,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,KAAK;AACjD,UAAI,SAAS,GAAI,QAAO;AACxB,YAAM,CAAC,IAAI,IAAI,EAAE,OAAO,MAAM,CAAC;AAC/B,QAAE,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,EAAE,MAAM,CAAC,GAAG,GAAG,IAAK;AAC3D,aAAO;AAAA,IACT,CAAC;AAAA,IACH,CAAC,WAAW;AAAA,EACd;AACA,QAAM,WAAWA;AAAA,IACf,CAAC,OAAe,UACd,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,MAAO,EAAE,UAAU,QAAQ,EAAE,GAAG,GAAG,OAAO,KAAK,MAAM,KAAK,EAAE,IAAI,CAAE,CAAC;AAAA,IAC/F,CAAC,WAAW;AAAA,EACd;AACA,QAAM,QAAQA,aAAY,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC;AAEzF,SAAO,EAAE,SAAS,QAAQ,QAAQ,MAAM,MAAM,MAAM,UAAU,MAAM;AACtE;AAEA,SAAS,UAAU,QAAwB,MAA4B;AACrE,QAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI;AACjD,SAAO,SAAS,EAAE,OAAO,KAAK;AAChC;;;ACzEA,SAAS,eAAAE,cAAa,WAAAC,UAAS,YAAAC,iBAAgB;AA6BxC,SAAS,gBAA+B;AAC7C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAA2B,IAAI;AACzD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,CAAC;AAElD,QAAM,QAAQF;AAAA,IACZ,CAAC,OAAe,OAAe,UAC7B,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO,OAAO,MAAM;AAAA,MACpB,OAAO;AAAA,IACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACA,QAAM,OAAOA;AAAA,IACX,CAAC,OAAe;AAAA;AAAA;AAAA,MAGd,SAAS,CAAC,MAAM;AACd,YAAI,CAAC,EAAG,QAAO;AACf,YACE,EAAE,SACF,EAAE,cAAc,UACd,CAAC,SAAS,CAAC,EAAE,SACZ,SACC,EAAE,SACF,MAAM,WAAW,EAAE,MAAM,UACzB,MAAM,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,MAAO,CAAC,CAAC;AAEjD,iBAAO;AACT,eAAO;AAAA,UACL,QAAQ,EAAE;AAAA,UACV,WAAW;AAAA,UACX,OAAO,OAAO,MAAM;AAAA,UACpB,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA;AAAA,IACH,CAAC;AAAA,EACH;AACA,QAAM,MAAMA,aAAY,CAAC,YAAY,UAAU;AAC7C,QAAI,UAAW,iBAAgB,CAAC,aAAa,WAAW,CAAC;AACzD,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,QAAM,UAAUA;AAAA,IACd,CAAC,UAA8B;AAC7B,UAAI,CAAC,SAAU,MAAM,SAAS,CAAC,MAAM,MAAQ,QAAO;AACpD,YAAM,UAAU,MAAM,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM;AACtD,UAAI,QAAQ,WAAW,MAAM,OAAQ,QAAO;AAC5C,UAAI,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,WAAW,QAAQ,MAAM,CAAC;AAC9D,UAAI,MAAM,OAAO;AAGf,cAAM,YAAY,MAAM,MAAM,OAAO,CAAC,SAAS,SAAS,MAAM,MAAM;AACpE,cAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,WAAW,UAAU,MAAM,CAAC;AACpE,cAAM,YAAY,UACf,MAAM,IAAI,EACV,KAAK,CAAC,SAAS,QAAQ,SAAS,IAAI,CAAC;AACxC,cAAM,YAAY,UACf,MAAM,GAAG,IAAI,EACb,QAAQ,EACR,KAAK,CAAC,SAAS,QAAQ,SAAS,IAAI,CAAC;AACxC,YAAI,aAAa,KAAM,MAAK,QAAQ,QAAQ,SAAS;AAAA,iBAC5C,aAAa,KAAM,MAAK,QAAQ,QAAQ,SAAS,IAAI;AAAA,MAChE;AACA,aAAO,CAAC,GAAG,QAAQ,MAAM,GAAG,EAAE,GAAG,MAAM,QAAQ,GAAG,QAAQ,MAAM,EAAE,CAAC;AAAA,IACrE;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AAEA,SAAOC;AAAA,IACL,OAAO;AAAA,MACL,QAAQ,OAAO,UAAU;AAAA,MACzB,WAAW,OAAO,aAAa;AAAA,MAC/B,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,cAAc,OAAO,MAAM,KAAK,OAAO;AAAA,EACjD;AACF;;;AChHA,SAAS,eAAAE,eAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAwBlD,SAAS,gBACd,KACA,cACA,iBACA,SAEA,KACA,UACiB;AACjB,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,aAAaD,QAAO,OAAO;AACjC,aAAW,UAAU;AAErB,QAAM,UAAUF,cAAY,YAAY;AACtC,UAAMI,WAAU,WAAW;AAC3B,eAAW,IAAI;AACf,QAAI;AACF,YAAM,CAAC,YAAY,YAAY,IAAI,MAAM,QAAQ,WAAW;AAAA,QAC1DA,SAAQ,UAAU,GAAG;AAAA,QACrBA,SAAQ,mBAAmB,GAAG,KAAK,QAAQ,QAAQ,IAAI;AAAA,MACzD,CAAC;AAGD,UAAI,WAAW,WAAW,YAAa,UAAS,WAAW,KAAK;AAChE,UAAI,aAAa,WAAW,YAAa,cAAa,aAAa,OAAO,MAAM,IAAI;AAAA,IACtF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,EAAAH,WAAU,MAAM;AACd,SAAK,QAAQ;AAAA,EACf,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,OAAOD;AAAA,IACX,OAAO,SAAiB;AACtB,aAAO,KAAK,KAAK;AACjB,UAAI,CAAC,QAAQ,KAAK,SAAS,IAAK,OAAM,MAAM,wDAAwD;AACpG,YAAM,YAAY,MAAM,WAAW,YAAY;AAC/C,YAAM,QAAQ,MAAM,QAAQ,UAAU,KAAK,MAAM,cAAc,IAAI,GAAG,WAAW,IAAI;AACrF,YAAM,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS,KAAK,cAAc,KAAK,SAAS,QAAQ;AAAA,EACrD;AAEA,QAAM,OAAOA;AAAA,IACX,CAAC,OAAe;AACd,YAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC3C,UAAI,MAAO,iBAAgB,MAAM,KAAK;AAAA,IACxC;AAAA,IACA,CAAC,OAAO,eAAe;AAAA,EACzB;AAEA,QAAM,SAASA;AAAA,IACb,OAAO,OAAe;AACpB,UAAI,CAAC,QAAQ,YAAa,OAAM,MAAM,4DAA4D;AAClG,YAAM,YAAY,MAAM,WAAW,YAAY;AAC/C,YAAM,QAAQ,MAAM,QAAQ,YAAY,KAAK,IAAI,cAAc,IAAI,GAAG,WAAW,IAAI;AACrF,YAAM,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,IACA,CAAC,SAAS,KAAK,cAAc,KAAK,SAAS,QAAQ;AAAA,EACrD;AAEA,QAAM,aAAaA;AAAA,IACjB,OAAO,OAAe;AACpB,YAAM,QAAQ,kBAAkB,KAAK,EAAE;AACvC,YAAM,QAAQ;AAAA,IAChB;AAAA,IACA,CAAC,SAAS,KAAK,OAAO;AAAA,EACxB;AAEA,QAAM,eAAeA,cAAY,YAAY;AAC3C,UAAM,QAAQ,kBAAkB,KAAK,IAAI;AACzC,UAAM,QAAQ;AAAA,EAChB,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC;AAE1B,QAAM,SAASA;AAAA,IACb,OAAO,OAAe;AACpB,UAAI,OAAO,UAAW,OAAM,QAAQ,kBAAkB,KAAK,IAAI;AAC/D,YAAM,QAAQ,YAAY,KAAK,EAAE;AACjC,YAAM,QAAQ;AAAA,IAChB;AAAA,IACA,CAAC,SAAS,KAAK,WAAW,OAAO;AAAA,EACnC;AAEA,SAAO,EAAE,OAAO,SAAS,WAAW,MAAM,WAAW,QAAQ,QAAQ,WAAW,GAAG,QAAQ,MAAM,YAAY,cAAc,OAAO;AACpI;;;ACxHA,SAAS,eAAAK,eAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,kBAAgB;AACzD,SAAS,mBAA+F;AAejG,SAAS,cAAc,OAAmB,SAA2B,SAAkB,OAAgB,WAAmB,aAC/H,aAEA,WAAuD,CAAC,QAAQ,KAAoB;AACpF,QAAM,SAASD,QAAO,KAAK;AAAG,SAAO,UAAU;AAC/C,QAAM,CAAC,MAAM,OAAO,IAAIC,WAAmC,IAAI;AAC/D,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAuB,IAAI;AACrD,QAAM,UAAUD,QAAO,IAAI;AAC3B,QAAM,aAAaA,QAAO,CAAC;AAC3B,EAAAD,WAAU,MAAM;AAAE,YAAQ,UAAU;AAAM,WAAO,MAAM;AAAE,cAAQ,UAAU;AAAA,IAAO;AAAA,EAAG,GAAG,CAAC,CAAC;AAC1F,QAAM,WAAW,KAAK,UAAU,KAAK;AACrC,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,SAAS,OAAO,WAAW,YAAa;AACzD,QAAI;AAEF,YAAM,SAAS,QAAQ,MAAM,OAAO,OAAO,SAAS,MAAM,SAAS;AACnE,YAAM,MAAM,SAAS,OAAO,KAAK,KAAK;AACtC,aAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,GAAG;AACzD,kBAAY,GAAG;AACf,cAAQ,OAAO,IAAI;AAAG,eAAS,IAAI;AAAA,IACrC,SAAS,GAAG;AAAE,eAAS,aAAa,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;AAAA,IAAG;AAAA,EACrE,GAAG,CAAC,UAAU,SAAS,OAAO,SAAS,WAAW,aAAa,QAAQ,CAAC;AAExE,QAAM,WAAWD,cAAY,OAAO,MAAkB;AACpD,UAAM,WAAW,YAAY,CAAC;AAC9B,UAAM,OAAO,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AACpE,eAAW;AAAW,YAAQ,IAAI;AAAG,aAAS,IAAI;AAClD,QAAI;AACF,UAAI,CAAC,MAAO,OAAM,MAAM,mDAAmD;AAC3E,YAAM,QAAQ,MAAM,QAAQ,SAAS,CAAC;AACtC,UAAI,SAAS,QAAQ,QAAQ,WAAW,WAAW,SAAS,OAAO,SAAS,SAAS,QAAQ,YAAY,OAAO,OAAO,MAAM,UAAU;AACrI,cAAM,MAAM,IAAI,IAAI,IAAI;AAAG,YAAI,aAAa,IAAI,WAAW,MAAM,MAAM,IAAI;AAC3E,cAAM,SAAS,QAAQ,MAAM,GAAG,IAAI,SAAS,GAAG,SAAS;AACzD,cAAM,OAAO,SAAS,OAAO,KAAK,CAAC;AACnC,eAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,IAAI;AAAG,oBAAY,IAAI;AAAG,gBAAQ,SAAS;AAAA,MACnG;AACA,aAAO;AAAA,IACT,SACO,GAAG;AAAE,UAAI,QAAQ,QAAS,UAAS,aAAa,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;AAAG,YAAM;AAAA,IAAG,UAC/F;AAAU,iBAAW;AAAW,UAAI,QAAQ,QAAS,SAAQ,WAAW,UAAU,CAAC;AAAA,IAAG;AAAA,EACxF,GAAG,CAAC,SAAS,SAAS,OAAO,WAAW,aAAa,QAAQ,CAAC;AAC9D,QAAM,SAASA,cAAY,OAAO,IAAI,OAAO,SAAS,UAAoD,CAAC,MAAM;AAC/G,UAAM,UAAU,QAAQ,WAAW,OAAO,SAAS;AACnD,UAAM,QAAQ,QAAQ,aAAa;AACnC,UAAM,WAAW,YAAY,CAAC;AAC9B,eAAW;AAAW,YAAQ,IAAI;AAAG,aAAS,IAAI;AAClD,QAAI;AACF,UAAI,CAAC,MAAO,OAAM,MAAM,oDAAoD;AAC5E,YAAM,UAAU,MAAM,QAAQ,QAAQ,GAAG,SAAS,KAAK;AACvD,YAAM,SAAS,UAAU,YAAY,EAAE,GAAG,SAAS,KAAK,SAAS,QAAQ,KAAK,CAAC,EAAE,IAAI;AACrF,UAAI,QAAQ,WAAW,WAAW,SAAS,UAAU,aACnD,OAAO,SAAS,SAAS,WAAW,YAAY,OAAO,OAAO,MAAM,UAAU;AAC9E,eAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,OAAO,GAAG;AAChE,oBAAY,OAAO,GAAG;AACtB,gBAAQ,OAAO,IAAI;AAAA,MACrB;AACA,aAAO;AAAA,IACT,SAAS,GAAG;AAAE,UAAI,QAAQ,QAAS,UAAS,aAAa,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;AAAG,YAAM;AAAA,IAAG,UACjG;AAAU,iBAAW;AAAW,UAAI,QAAQ,QAAS,SAAQ,WAAW,UAAU,CAAC;AAAA,IAAG;AAAA,EACxF,GAAG,CAAC,SAAS,SAAS,OAAO,WAAW,aAAa,QAAQ,CAAC;AAC9D,QAAM,QAAQA,cAAY,CAAC,GAAe,OAAO,OAAO,SAAS,MAAM,QAAQ,cAAc;AAC3F,UAAM,SAAS,QAAQ,MAAM,GAAG,MAAM,KAAK;AAC3C,WAAO,UAAU,YAAY,EAAE,GAAG,QAAQ,KAAK,SAAS,OAAO,KAAK,CAAC,EAAE,IAAI;AAAA,EAC7E,GAAG,CAAC,SAAS,WAAW,QAAQ,CAAC;AACjC,SAAO,EAAE,aAAa,MAAM,MAAM,OAAO,QAAQ,OAAO,SAAS;AACnE;;;AdDA,SAAS,8BAAqD;AAhC9D,IAAM,qBAAqB;AAC3B,IAAM,yBAAyB;AA4U/B,SAAS,mBAAwB,QAA0B,SAAoC;AAC7F,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO;AAAA,IAAE,GAAG;AAAA,IACV,eAAe,CAAC,GAAI,OAAO,iBAAiBI,gBAAe,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,YAAU,EAAE,OAAO,MAAM,KAAK,EAAE,GAAI,EAAE,OAAO,oBAAoB,CAAC;AAAA,IACzJ,QAAQ,CAAC,GAAG,OAAO,QAAQ;AAAA,MAAE,MAAM;AAAA,MAAqB,OAAO;AAAA,MAAU,MAAM;AAAA,MAC7E,QAAQ,EAAE,MAAM,WAAW,UAAU,MAAM,KAAK;AAAA,MAAG,QAAQ,EAAE,SAAS,MAAM,OAAO,IAAI;AAAA,MACvF,QAAQ,EAAE,SAAS,MAAM;AAAA,MAAG,MAAM,EAAE,SAAS,MAAM;AAAA,MAAG,WAAW,EAAE,SAAS,OAAO,WAAW,MAAM;AAAA,MACpG,UAAU,EAAE,SAAS,MAAM;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AACA,SAAS,YAAiB,QAA0B,UAAU,OAAmB;AAC/E,WAAS,mBAAmB,QAAQ,OAAO;AAC3C,SAAOC,qBAAoB;AAAA,IACzB,QAAQ,OAAO,iBAAiB,CAAC;AAAA,IACjC,OAAO,CAAC;AAAA,IACR,SAAS,OAAO,eAAe,CAAC;AAAA,IAChC,OAAO,OAAO,gBAAgB,YAAY;AAAA,IAC1C,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,SAAS,eAAe,MAA4B;AAClD,QAAM,OAAkB,aAAa,IAAI,IACrC,EAAE,GAAG,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,MAAoBC,oBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAE,EAAE,IAC7H,EAAE,GAAG,KAAK;AACd,MAAI,KAAK;AACP,SAAK,YAAY,EAAE,GAAG,KAAK,WAAW,QAAQ,CAAC,GAAG,KAAK,UAAU,MAAM,EAAE;AAC3E,SAAO;AACT;AAEA,SAAS,gBAAgB,GAA2B;AAClD,QAAM,QAAoB;AAAA,IACxB,QAAQ,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,EAAE;AAAA,IAChD,OAAO,EAAE,MAAM,IAAI,cAAc;AAAA,IACjC,SAAS,EAAE,QAAQ;AAAA,MAAI,CAAC,SACtB,KAAK,UAAU,EAAE,GAAG,MAAM,SAAS,EAAE,GAAG,KAAK,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK;AAAA,IACvE;AAAA,IACA,OAAO,EAAE;AAAA,IACT,QAAQ,EAAE;AAAA,EACZ;AACA,MAAI,EAAE,IAAK,OAAM,MAAM,EAAE;AACzB,MAAI,EAAE,UAAW,OAAM,YAAY,EAAE,SAAS,EAAE,UAAU,SAAS,QAAQ,OAAO,YAAY,OAAO,QAAQ,EAAE,UAAU,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE;AAC/K,MAAI,EAAE;AACJ,UAAM,eAAe,KAAK;AAAA,MACxB,KAAK,UAAU,EAAE,YAAY;AAAA,IAC/B;AACF,MAAI,EAAE,SAAU,OAAM,WAAWD,qBAAoB,CAAC,EAAE;AACxD,MAAI,EAAE,YAAa,OAAM,cAAc,KAAK,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;AAC/E,SAAO;AACT;AAKA,SAAS,iBACP,GACA,OACmB;AACnB,QAAM,OAAO,EAAE,GAAG,GAAG,GAAG,MAAM;AAC9B,aAAW,OAAO,OAAO,KAAK,IAAI,GAAqC;AACrE,QAAI,KAAK,GAAG,MAAM,OAAW,QAAO,KAAK,GAAG;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAyB;AAC3C,SAAO,SAAS,QAAS,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AACpE;AAEA,SAAS,gBAAgB,OAA+B;AACtD,MAAI,WAAW,KAAK,EAAG,QAAO;AAC9B,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,mBAAwB,OAAsB,MAAsB;AAC3E,aAAW,OAAO,MAAM;AACtB,QAAI,WAAWE,gBAAe,OAAO,GAAG,CAAC,EAAG,QAAO;AAAA,EACrD;AACA,SAAO;AACT;AAEA,SAAS,uBACP,OACA,MACA,QACwC;AACxC,QAAM,SAAS,OAAO,KAAK,EAAE,YAAY;AACzC,QAAM,SAAmB,CAAC;AAC1B,QAAM,OAAO,oBAAI,IAAY;AAC7B,MAAI,UAAU;AAEd,WAAU,YAAW,OAAO,MAAM;AAChC,UAAM,QAAQA,gBAAe,OAAO,GAAG;AACvC,UAAM,aACJ,MAAM,SAAS,eAAe,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACrE,eAAW,aAAa,YAAY;AAClC,YAAM,MAAM,gBAAgB,SAAS;AACrC,UAAI,OAAO,QAAQ,KAAK,IAAI,GAAG,EAAG;AAClC,UAAI,UAAU,CAAC,IAAI,YAAY,EAAE,SAAS,MAAM,EAAG;AAEnD,UAAI,OAAO,SAAS,oBAAoB;AACtC,aAAK,IAAI,GAAG;AACZ,eAAO,KAAK,GAAG;AACf;AAAA,MACF;AAEA,gBAAU;AACV,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG,QAAQ;AACtE;AAEA,SAAS,aAAa,KAAa,WAA4B;AAC7D,QAAM,SAAS,IAAI,IAAI,GAAG,EAAE,aAAa,OAAO,SAAS;AACzD,SAAO,OAAO,SAAS,KAAM,OAAO,WAAW,KAAK,OAAO,CAAC,MAAM;AACpE;AAEA,SAAS,eAAoB,MAAyC;AACpE,SAAO,KAAK,mBAAmB,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,iBAAiB,WAAc;AACxH;AAKA,SAAS,cAAc,OAAmB,MAAgD;AACxF,MAAI,CAAC,MAAM;AACT,QAAI,MAAM,UAAW,OAAM,MAAM,kEAAkE;AACnG,WAAO;AAAA,EACT;AACA,QAAM,MAAM,MAAM,aAAa,KAAK;AACpC,MAAI,IAAI,YAAY,EAAG,OAAM,MAAM,4CAA4C;AAC/E,QAAM,QAAQ,oBAAoB,KAAK,YAAY,KAAK,UAAU,oBAAoB,GAAG,CAAC,IAAI,GAAG;AACjG,SAAO,EAAE,GAAG,OAAO,WAAW,MAAM;AACtC;AACA,SAAS,iBAAiB,OAA+B;AACvD,QAAM,EAAE,WAAW,YAAY,GAAG,KAAK,IAAI;AAC3C,SAAO;AACT;AAEA,SAAS,iBAAiB,UAAkB,MAAoD;AAC9F,QAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,QAAM,SAAmC,CAAC;AAC1C,aAAW,QAAQ,KAAK,iBAAiB;AACvC,UAAM,SAAS,IAAI,aAAa,OAAO,IAAI;AAC3C,QAAI,OAAO,OAAQ,QAAO,IAAI,IAAI;AAAA,EACpC;AACA,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,EAAE,SAAS,KAAK,SAAS,SAAS,OAAO,IAAI;AACnF;AAEA,SAAS,oBAAoB,KAAa,MAAwB,OAA2C;AAC3G,QAAM,OAAO,IAAI,IAAI,GAAG;AACxB,aAAW,QAAQ,KAAK,gBAAiB,MAAK,aAAa,OAAO,IAAI;AACtE,aAAW,QAAQ,KAAK;AACtB,eAAW,SAAS,OAAO,OAAO,IAAI,KAAK,CAAC,EAAG,MAAK,aAAa,OAAO,MAAM,KAAK;AACrF,SAAO,KAAK,SAAS;AACvB;AAIA,SAAS,kBAAoC,WAA0B,cAAqC;AAC1G,MAAI,CAAC,aAAa,CAAC,aAAc,QAAO;AACxC,QAAM,YAAY,KAAK,MAAM,YAAY;AACzC,QAAM,WAAW,oBAAI,IAA0B;AAC/C,SAAO,IAAI,MAAM,OAAO,OAAO,SAAS,GAAQ;AAAA,IAC9C,IAAI,SAAS,KAAK;AAChB,YAAM,SAAS,QAAQ,IAAI,WAAW,KAAK,SAAS;AACpD,UAAI,QAAQ,kBAAkB,OAAO,WAAW,WAAY,QAAO;AACnE,UAAI,CAAC,SAAS,IAAI,GAAG;AACnB,iBAAS,IAAI,KAAK,CAAC,SAAiB,WACjC,OAA8D,KAAK,WAAW,EAAE,GAAG,SAAS,UAAU,GAAG,MAAM,CAAC;AACrH,aAAO,SAAS,IAAI,GAAG;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAoB,MAG3B;AACA,QAAM,WAAW,cAAc,YAAY,KAAK,QAAQ,QAAQ,KAAK,WAAW,CAAC,GAAG,KAAK,SAAS;AAClG,MAAI,KAAK;AACP,WAAO;AAAA,MACL,GAAG,cAAcF,qBAAoB,KAAK,cAAc,QAAQ,GAAG,KAAK,SAAS;AAAA,MACjF,SAAS;AAAA,IACX;AACF,MAAI,KAAK,YAAY,QAAQ,KAAK,WAAW,SAAS,OAAO,WAAW,aAAa;AACnF,UAAM,YAAY,eAAe,IAAI;AACrC,QAAI,aAAa,OAAO,SAAS,MAAM,SAAS,KAAM,KAAK,aAAa,iBAAiB,OAAO,SAAS,MAAM,KAAK,SAAS;AAC3H,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,MACX;AAAA,EACJ;AACA,SAAO,EAAE,GAAG,UAAU,SAAS,MAAM;AACvC;AAEO,SAAS,cACd,MACoB;AACpB,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA,aAAa;AAAA,EACf,IAAI;AACJ,QAAM,SAAS,KAAK,WAAW;AAC/B,QAAM,iBAAiB,KAAK,YAAY;AACxC,QAAM,UAAU,kBAAkB;AAClC,QAAM,EAAE,WAAW,mBAAmB,iBAAiB,yBAAyB,UAAU,gBAAgB,IACxG,mBAAmB,iBAAiB,KAAK,eAAe;AAC1D,QAAM,OAAO,KAAK;AAClB,QAAM,UAAUG,QAAO,IAAI;AAC3B,UAAQ,UAAU;AAClB,QAAM,kBAAkB,OAAO,KAAK,UAAU,KAAK,QAAQ,IAAI;AAC/D,MAAI,MAAM,gBAAgB,SAAS,eAAe,IAAI,CAAC;AACrD,UAAM,MAAM,6DAA6D,eAAe,IAAI,CAAC,cAAc;AAC7G,QAAM,UAAUC;AAAA,IACd,MAAM,KAAK,WAAW,qBAAqB;AAAA,IAC3C,CAAC,KAAK,OAAO;AAAA,EACf;AACA,QAAM,YAAY,eAAe,IAAI;AACrC,QAAM,cAAcA;AAAA,IAAQ,MAAM,uBAAuB,aAAa,MAAM,QAAQ,WAAW,KAAK,KAAK;AAAA,IACvG,CAAC,aAAa,MAAM,QAAQ,WAAW,KAAK,OAAO,OAAO,KAAK,OAAO,WAAW;AAAA,EAAC;AACpF,QAAM,MAAM,KAAK,OAAO,KAAK;AAC7B,QAAM,SAASD,QAAO,GAAG;AACzB,QAAM,eAAeA,QAAO,KAAK,SAAS;AAC1C,QAAM,WAAWC;AAAA,IAAQ,MAAM,cAAc,YAAY,cAAc,QAAQ,KAAK,WAAW,CAAC,GAAG,QAAQ,OAAO;AAAA,IAChH,CAAC,cAAc,QAAQ,KAAK,WAAW,GAAG,eAAe;AAAA,EAAC;AAE5D,QAAM,UAAUD,QAAO,eAAe,IAAI,CAAC;AAC3C,QAAM,CAAC,aAAa,cAAc,IAAIE,WAAoD,EAAE,SAAS,QAAQ,QAAQ,SAAS,OAAO,KAAK,CAAC;AAC3I,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,QAAQ,YAAY,CAAC;AACtE,QAAM,qBAAqBF,QAAO,EAAE,cAAc,aAAa,OAAO,CAAC;AACvE,qBAAmB,UAAU,EAAE,cAAc,aAAa,OAAO;AACjE,QAAM,mBAAmBA,QAAO,CAAC;AACjC,QAAM,oBAAoBA,QAA+B,IAAI;AAC7D,QAAM,iBAAiBA,QAA2E,IAAI;AACtG,QAAM,iBAAiBA,QAAqC,IAAI;AAChE,QAAM,4BAA4BA,QAAO,KAAK;AAC9C,QAAM,kBAAkBG,cAAY,CAAC,UAAwB,WAAyB;AACpF,QAAI,CAAC,eAAe,QAAS,QAAO,QAAQ,OAAO,MAAM,kCAAkC,CAAC;AAC5F,WAAO,eAAe,QAAQ,OAAO,QAAQ,GAAG,MAAM;AAAA,EACxD,GAAG,CAAC,CAAC;AACL,QAAM,WAAWH,QAAO,CAAC;AAGzB,QAAM,gBAAgBA;AAAA,IACpB,QAAQ,QAAQ,EAAE,WACd,EAAE,QAAQ,aAAa,MAAM,OAAO,gBAAgB,QAAQ,QAAQ,CAAC,EAAE,IACvE;AAAA,EACN;AACA,QAAM,eAAeA,QAAO,CAAC;AAC7B,QAAM,CAAC,cAAc,eAAe,IAAIE;AAAA,IACtC,OAAO,EAAE,OAAO,QAAQ,QAAQ,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC1D;AAIA,QAAM,kBAAkBF,QAAO,YAAY;AAC3C,QAAM,qBAAqBG,cAAY,CAAC,WAAkE;AACxG,UAAM,WAAW,gBAAgB;AACjC,UAAM,OAAO,OAAO,QAAQ;AAC5B,QAAI,SAAS,SAAU;AACvB,oBAAgB,UAAU;AAC1B,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AACL,QAAM,cAAc,aAAa;AACjC,QAAM,CAAC,OAAO,QAAQ,IAAID,WAAS,CAAC;AACpC,QAAM,QAAQD;AAAA,IACZ,MAAM,KAAK,oBAAoB,WAAW,KAAK;AAAA,IAC/C,CAAC,aAAa,KAAK,iBAAiB;AAAA,EACtC;AACA,QAAM,eAAe,QAAQ,MAAM,YAAY,KAAK,UAAU,MAAM,SAAS,IAAI;AACjF,QAAM,oBAAoBA,SAAQ,MAAM,kBAAkB,mBAAmB,YAAY,GAAG,CAAC,mBAAmB,YAAY,CAAC;AAC7H,QAAM,kBAAkBA,SAAQ,MAAM,kBAAkB,yBAAyB,YAAY,GAAG,CAAC,yBAAyB,YAAY,CAAC;AACvI,QAAM,YAAY;AAClB,QAAM,kBAAkBA,SAAQ,MAAMG,uBAAsB,cAAc,KAAK,iBAAiB,GAAG,CAAC,cAAc,KAAK,iBAAiB,CAAC;AACzI,QAAM,aAAa;AACnB,QAAM,gBAAgBH,SAAQ,MAAM,oBAAoB,eAAe,GAAG,CAAC,eAAe,CAAC;AAC3F,QAAM,iBAAiB,CAAC,CAAC,aAAa,UAAU,kBAAkB,YAAY,KAAK,UAAU,kBAAkB;AAC/G,QAAM,qBAAsB,CAAC,aAAa,eAAe,UAAc,mBAAmB,KAAK,aAAa;AAC5G,QAAM,WAAW,KAAK,UAAU,MAAM,YAAY,IAAI;AAItD,QAAM,cAAcA;AAAA,IAAQ,MAAM,MAAM,YAAY,KAAK,iBAAiB,KAAK,KAAK,IAAI;AAAA,IACtF,CAAC,YAAY,cAAc,mBAAmB,UAAU,OAAO,KAAK,aAAa;AAAA,EAAC;AACpF,QAAM,WAAWA,SAAQ,MAAM;AAC7B,QAAI,CAAC,MAAM,SAAU,QAAO;AAC5B,QAAI;AACF,UAAI,CAAC,kBAAmB,OAAM,IAAI,MAAM,6FAA6F;AACrI,UAAI,gBAAgB;AAAE,sBAAc,SAAS,MAAM,QAAQ;AAAG,eAAO,EAAE,QAAQ,CAAC,GAAY,MAAM,CAAC,GAAG,OAAO,KAAK;AAAA,MAAG;AACrH,aAAO,EAAE,GAAG,gBAAgB,YAAa,iBAAiB,MAAM,UAAU,EAAE,KAAK,YAAa,CAAC,GAAG,OAAO,KAAK;AAAA,IAChH,SAASI,QAAO;AACd,aAAO,EAAE,QAAQ,CAAC,GAAY,MAAM,CAAC,GAAG,OAAOA,OAAe;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,YAAY,iBAAiB,eAAe,mBAAmB,UAAU,OAAO,aAAa,cAAc,CAAC;AAIhH,QAAM,gBAAgB,KAAK,UAAU,MAAM,WACvC,CAAC,MAAM,SAAS,MAAM,MAAM,SAAS,SAAS,IAAI,IAAI;AAC1D,QAAM,SAASJ,SAAQ,MAAO,MAAM,WAChC,cAAc,aAAa,MAAM,SAAS,MAAM,MAAM,SAAS,SAAS,IACxE,cAAmC,CAAC,cAAc,eAAe,aAAa,CAAC;AACnF,QAAM,aAAc,UAAU,QAAQ;AACtC,QAAM,iBAAiBA,SAAQ,MAAMK,iBAAgB,KAAK,GAAG,CAAC,KAAK,CAAC;AACpE,QAAM,SAASL,SAAQ,MAAM,IAAI,IAAI,OAAO,OAAO,IAAI,WAAS,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/F,QAAM,iBAAiB,QAAQ,KAAK,WAAW,KAAK,CAAC,MAAM;AAC3D,QAAM,sBAAsB,QAAQ,KAAK,WAAW,KAAK,QAAQ,MAAM,QAAQ;AAG/E,QAAM,oBAAoBE,cAAY,CAAC,MAAkB;AACvD,QAAI,UAAU,MAAO,OAAM,SAAS;AAGpC,SAAK,gBAAgB,MAAM,WAAW,EAAE,GAAG,GAAG,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,EAC9E,GAAG,CAAC,UAAU,OAAO,KAAK,eAAe,QAAQ,CAAC;AAClD,QAAM,CAAC,eAAe,OAAO,IAAID,WAAgB,CAAC,CAAC;AACnD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAE1C,oBAAI,IAAI,CAAC;AACX,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAmB,CAAC,CAAC;AACnE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAE5C;AACF,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAuB,IAAI;AACrD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAwB,IAAI;AAEtE,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAwB,IAAI;AAChE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAIpC,IAAI;AAGd,QAAM,OAAOD,SAAQ,MAAM,iBAAiB,WAAW,SAAS,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,QAAQ,QAAQ,aAAa,CAAC;AACpI,QAAM,CAAC,mBAAmB,oBAAoB,IAC5CC,WAAmC,IAAI;AAEzC,EAAAK,YAAU,MAAM;AACd,WAAO,UAAU;AAAA,EACnB,GAAG,CAAC,GAAG,CAAC;AAER,EAAAA,YAAU,MAAM;AACd,iBAAa,UAAU,KAAK;AAAA,EAC9B,GAAG,CAAC,KAAK,SAAS,CAAC;AAEnB,QAAM,WAAWJ;AAAA,IACf,CAAC,SAAS;AACR,uBAAiB;AACjB,gCAA0B,UAAU;AACpC,wBAAkB,SAAS,MAAM;AACjC,sBAAgB,IAAI;AACpB,qBAAe,cAAY,CAAC,SAAS,WAAW,CAAC,SAAS,QAAQ,WAAW,EAAE,SAAS,OAAO,OAAO,KAAK,CAAC;AAC5G,yBAAmB,CAAC,YAAY;AAC9B,cAAM,OAAO,QAAQ;AACrB,cAAM,YACJ,OAAO,SAAS,aACX,KAAuC,IAAI,IAC5C;AAEN,cAAM,aAAaN,qBAAoB,WAAW,QAAQ;AAC1D,cAAM,YAAY,cAAc,WAAW,aAAa,CAAC,KAAK,YAAY,aAAa,EAAE,GAAG,YAAY,WAAW,KAAK,UAAU,GAAG,QAAQ,OAAO;AACpJ,YAAIW,cAAa,MAAM,SAAS,EAAG,QAAO;AAC1C,eAAO,EAAE,OAAO,gBAAgB,SAAS,GAAG,MAAM,CAAC,GAAG,QAAQ,MAAM,gBAAgB,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,MACzG,CAAC;AAAA,IACH;AAAA,IACA,CAAC,UAAU,kBAAkB;AAAA,EAC/B;AAEA,QAAM,cAAc,MAAM,UAAU,UAAU;AAC9C,QAAM,iBAAiBL,cAA4C,CAAC,SAAS;AAC3E,aAAS,aAAW;AAClB,YAAM,WAAW,QAAQ,UAAU,UAAU;AAC7C,YAAM,SAASG,iBAAgB,OAAO,SAAS,aAAa,KAAK,QAAQ,IAAI,IAAI;AACjF,aAAO,QAAQ,WAAW,EAAE,GAAG,SAAS,QAAQ,GAAG,UAAU,EAAE,GAAG,QAAQ,UAAU,OAAO,EAAE,IAAI;AAAA,IACnG,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,CAAC;AACb,QAAM,gBAAgB,gBAAgB,iBAAiB,cAAc;AAKrE,QAAM,mBAAmBN,QAAsB,IAAI;AACnD,QAAM,cAAc,CAAC,QAAgB;AACnC,UAAM,SAAS,IAAI,IAAI,GAAG,EAAE;AAC5B,WAAO,KAAK,UAAU,CAAC,OAAO,OAAO,SAAS,GAAG,IAAI,QAAQ,SAAS,mBAAmB,CAAC,GAAG,IAAI,UAAQ,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC;AAAA,EAChI;AACA,QAAM,iBAAiBG,cAAY,CAAC,QAAgB;AAClD,qBAAiB,UAAU,YAAY,GAAG;AAAA,EAC5C,GAAG,CAAC,SAAS,CAAC;AACd,QAAM,qBAAqB,KAAK,UAAU,MAAM,mBAAmB,IAAI;AACvE,QAAM,eAAeA,cAAY,CAAC,KAAa,MAC7C,QAAQ,UAAU,oBAAoB,KAAK,QAAQ,SAAS,EAAE,SAAS,IAAI,KAAK,CAAC,kBAAkB,CAAC;AACtG,QAAM,QAAQ;AAAA,IAAc;AAAA,IAAO;AAAA,IAAa;AAAA,IAAS,gBAAgB,CAAC,YAAY,WAAW,CAAC,YAAY;AAAA,IAC5G;AAAA,IAAW,KAAK,OAAO,eAAe;AAAA,IAAM;AAAA,IAAgB;AAAA,EAAY;AAC1E,QAAM,iBAAiBH,QAAO,EAAE,SAAS,aAAa,UAAU,aAAa,CAAC;AAC9E,iBAAe,UAAU,EAAE,SAAS,aAAa,UAAU,aAAa;AAGxE,EAAAO,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,QAAI,aAAa,IAAI,gBAAgB;AACrC,QAAI,aAAa;AACjB,8BAA0B,UAAU,QAAQ,eAAe,QAAQ,YAAY;AAC/E,mBAAe,QAAQ,aAAa,OAAO,WAAW,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO,IAAI,QAAsB;AACrI,gCAA0B,UAAU;AACpC,YAAM,EAAE,SAAAE,UAAS,aAAAC,cAAa,UAAAC,UAAS,IAAI,eAAe;AAC1D,YAAM,MAAM,EAAE;AACd,YAAM,QAAQ,iBAAiB;AAC/B,iBAAW,MAAM;AAAG,mBAAa,IAAI,gBAAgB;AACrD,wBAAkB,UAAU;AAC5B,YAAM,oBAAoB;AAC1B,YAAMC,SAAQ,MAAM,kBAAkB,MAAM;AAC5C,cAAQ,iBAAiB,SAASA,QAAO,EAAE,MAAM,KAAK,CAAC;AACvD,UAAI,QAAQ,QAAS,mBAAkB,MAAM;AAC7C,sBAAgB,KAAK;AAGrB,YAAMC,QAAO,QAAQ;AACrB,YAAM,cAAcA,SAAQ,aAAa,cAAc,kBAAkB,iBAAiB,UAAUA,KAAI,IAAI;AAC5G,YAAM,eAAe,CAAC,CAAC,aAAa,cAAc,oBAAoB,aAAa,UAAU,SAAS,KAAK,CAAC,CAAC;AAC7G,qBAAe,EAAE,SAAS,MAAM,OAAO,KAAK,CAAC;AAC7C,UAAI;AACF,YAAI,kBAAkB,OAAO,QAAS,OAAM,IAAI,aAAa,gCAAgC,YAAY;AACzG,cAAM,UAAU,aAAa,cAAc,kBAAkB,MAAMH,aAAY,QAAQ,UAAU,WAAW,kBAAkB,MAAM,IAAI;AAExI,cAAM,SAAS,YAAY,cAAcC,YAAW;AACpD,cAAM,eAAe,SAAS,OAAO,MAAMF,SAAQ,mBAAmB,aAAa,IAAI;AACvF,YAAI,WAAW,UAAU,cAAc,UAAU,aAAaE,YAAW,MAAMF,SAAQ,SAAS,aAAa,IAAI;AACjH,YAAI,kBAAkB,OAAO,QAAS,OAAM,IAAI,aAAa,gCAAgC,YAAY;AAEzG,YAAI,UAAU,CAAC,SAAS,aAAa,YAAa,YAAW,EAAE,GAAG,QAAQ,WAAW,YAAY;AACjG,YAAI,CAAC,aAAa,QAAQ,cAAc,UAAU,iBAAiB,SAAS;AAC1E,cAAI,UAAU;AAGZ,kBAAM,aAAa,cAAcZ,qBAAoB,UAAUc,SAAQ,GAAGE,KAAI;AAC9E,0BAAc,UAAU,gBAAgB,SAAS,WAC7C,EAAE,QAAQ,aAAa,MAAM,OAAO,gBAAgB,UAAU,EAAE,IAChE;AACJ,yBAAa;AACb,+BAAmB,OAAO,EAAE,OAAO,YAAY,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE;AAAA,UACxE;AACA,0BAAgB,IAAI;AACpB,yBAAe,cAAY,CAAC,SAAS,WAAW,CAAC,SAAS,QAAQ,WAAW,EAAE,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,QAC9G;AAAA,MACF,SAAS,GAAG;AACV,YAAI,CAAC,aAAa,QAAQ,cAAc,UAAU,iBAAiB,SAAS;AAC1E,cAAI,gBAAgB,cAAc,kBAAkB,OAAO,SAAS;AAClE,2BAAe,EAAE,SAAS,OAAO,OAAO,aAAa,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC;AAAA,UACrF,OAAO;AAGL,+BAAmB,OAAO,EAAE,OAAOF,WAAU,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE;AACpE,2BAAe,EAAE,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,UAChD;AACA,0BAAgB,IAAI;AAAA,QACtB;AACA,YAAI,cAAc,CAAC,aAAa,QAAQ,cAAc,UAAU,iBAAiB,QAAS,OAAM;AAAA,MAClG,UAAE;AACA,gBAAQ,oBAAoB,SAASC,MAAK;AAAA,MAC5C;AAAA,IACF;AACA,mBAAe,UAAU,OAAO,UAAU,WAAW;AACnD,iBAAW,IAAI,IAAI,UAAU,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO,MAAS,EAAE;AAC/F,YAAM,MAAM,YAAY,QAAQ;AAChC,YAAM,UAAU,mBAAmB;AACnC,UAAI,QAAQ,iBAAiB,WAAW,QAAQ,gBAAgB,CAAC,QAAQ,YAAY,WAAW,CAAC,QAAQ,YAAY,MAAO;AAC5H,qBAAe,QAAQ;AACvB,YAAM,QAAQ,MAAM,UAAU,MAAM;AAAA,IACtC;AACA,mBAAe,UAAU,MAAM,QAAQ;AACvC,QAAI,OAAO,WAAW,YAAa,gBAAe,OAAO,SAAS,IAAI;AACtE,UAAM,WAAW,MAAM;AACrB,UAAI,CAAC,mBAAmB,QAAQ,OAAQ;AACxC,YAAM,MAAM,YAAY,OAAO,SAAS,IAAI;AAC5C,UAAI,QAAQ,iBAAiB,QAAS;AACtC,uBAAiB,UAAU;AAC3B,WAAK,QAAQ,IAAI,EAAE,MAAM,MAAM;AAAA,MAAkD,CAAC;AAAA,IACpF;AACA,QAAI,kBAAkB,OAAO,WAAW,YAAa,QAAO,iBAAiB,YAAY,QAAQ;AACjG,WAAO,MAAM;AACX,kBAAY;AAAM,iBAAW,MAAM;AACnC,qBAAe,UAAU;AACzB,qBAAe,UAAU;AACzB,UAAI,kBAAkB,OAAO,WAAW,YAAa,QAAO,oBAAoB,YAAY,QAAQ;AAAA,IACtG;AAAA,EACF,GAAG,CAAC,aAAa,MAAM,gBAAgB,WAAW,gBAAgB,kBAAkB,CAAC;AAGrF,EAAAL,YAAU,MAAM;AACd,QAAI,UAAU,CAAC,0BAA0B,QAAS,MAAK,eAAe,UAAU;AAAA,EAClF,GAAG,CAAC,QAAQ,aAAa,MAAM,gBAAgB,WAAW,cAAc,CAAC;AAEzE,QAAM,EAAE,KAAK,UAAU,cAAc,IAAI,mBAAmB;AAAA,IAC1D;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,cAAc;AAAA,IACd,GAAI,gBAAgB,SAAY,EAAE,KAAK,YAAY,IAAI,CAAC;AAAA,IACxD;AAAA,IACA;AAAA,IACA,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,GAAI,KAAK,oBAAoB,EAAE,WAAW,KAAK,kBAAkB,IAAI,CAAC;AAAA,IACtE,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,GAAI,KAAK,kBAAkB,EAAE,iBAAiB,KAAK,gBAAgB,IAAI,CAAC;AAAA,IACxE,GAAI,KAAK,sBAAsB,EAAE,OAAO,KAAK,oBAAoB,IAAI,CAAC;AAAA,IACtE,GAAI,KAAK,uBACL,EAAE,eAAe,KAAK,qBAAqB,IAC3C,CAAC;AAAA,IACL,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,EACrC,CAAC;AAED,QAAM,kBAAkBJ;AAAA,IACtB,CAAC,SACCW,iBAAgB,IAAI,IAChB,SAAS,QAAQ,IAAI,KAAK,QAAQ,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,IACxD;AAAA,IACN,CAAC,SAAS,OAAO;AAAA,EACnB;AACA,QAAM,sBAAsBb,SAAQ,MAAM,KAAK,kBAC3CG,uBAAsB,eAAe,KAAK,iBAAiB,SAAS,WAAW,IAC/E,eAAe,CAAC,eAAe,KAAK,iBAAiB,SAAS,WAAW,CAAC;AAC9E,QAAM,gBAAgBD;AAAA,IACpB,CAAC,WAA8B;AAC7B,YAAM,cAAcY;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,YAAY;AACd,cAAM,IAAIC,YAAW,kBAAkB,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,GAAG,EAAE,UAAU,OAAO,GAAG,CAAC;AAC7G,aAAOC,aAAY,QAAQ,qBAAqB,eAAe;AAAA,IACjE;AAAA,IACA,CAAC,qBAAqB,eAAe;AAAA,EACvC;AACA,QAAM,oBAAoBhB;AAAA,IACxB,MACE,OAAO,YAAY,SAAS,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,IACxE,CAAC,SAAS,WAAW;AAAA,EACvB;AACA,QAAM,gBAAgB,KAAK,UAAU,iBAAiB;AAGtD,QAAM,WAAWA,SAAQ,MAAM,KAAK,UAAU,KAAK,GAAG,CAAC,KAAK,CAAC;AAC7D,QAAM,iBAAiBA,SAAQ,MAAM;AACnC,UAAM,eAAe,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAC/E,UAAM,OAAO,MAAM,aAAa,QAAQ,cAAc;AACtD,UAAM,cAAc,QAAQ,KAAK,WAAW,MAAM,MAAM,aAAa,SAAS,mBAAmB,YAAY,GAAG,SAAS,MAAM,MACzH,CAAC,cAAc,SAAS,aAAa,MAAM,SAAS,MAAM;AAChE,UAAM,aAAa,cAAc,eAAe,MAAM,eAAe,EAAE,IAAI,CAAC;AAG5E,UAAM,eAAe,WAAW,SAAS,EAAE,GAAG,gBAAgB,QAAQ;AAAA,MAAC,GAAI,MAAM,OAAO,SAAS,MAAM,SAAS,SAAS;AAAA,MACvH,GAAG,WAAW,OAAO,UAAQ,cAAc,OAAO,KAAK,WAAS,MAAM,SAAS,IAAI,CAAC,EAAE,IAAI,YAAU,EAAE,MAAM,EAAE;AAAA,IAAC,EAAE,IAAI;AACvH,UAAM,UAAU,cAAc,cAAc,aAAa;AAEzD,eAAW,UAAU,MAAM,gBAAgB,CAAC;AAC1C,UAAI,OAAO,UAAU,aAAa;AAChC,YAAI;AACF,qBAAW,QAAQiB;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,UACF,GAAG;AACD,kBAAM,QAAQ,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACvD,gBAAI,OAAO,OAAO,SAAS,UAAW,SAAQ,OAAO,KAAK,IAAI;AAAA;AAE5D,yBAAW,OAAO,OAAO,OAAO,SAAS,YACpC,MAAM,OAAO,gBAAgB,CAAC,IAC/B,CAAC;AACH,wBAAQ,OAAO,KAAK,GAAG;AAAA,UAC7B;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AACF,YAAQ,SAAS,CAAC,GAAG,IAAI,IAAI,QAAQ,MAAM,CAAC,EAAE,KAAK;AACnD,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,EACF,CAAC;AAGD,QAAM,sBAAsB,KAAK,UAAU,SAAS,YAAY,QAAQ,gBACtE,kBAAkB,KAAK,mBAAmB,WAAW,EAAE,MAAM,SAAY,CAAC,CAAC,WAAW,IAAI,WAAW,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAIvH,QAAM,cAAcjB;AAAA,IAClB,MACE,YACI,UAAU,KAAK,UAAU,cAAc,CAAC,IAAI,mBAAmB,IAAI,KAAK,UAAU;AAAA,MAAC;AAAA,MAAU;AAAA,MAC7F,MAAM,OAAO,IAAI,YAAU,OAAO,KAAK;AAAA,MAAG,MAAM;AAAA,MAAO,MAAM;AAAA,MAAS,MAAM;AAAA,MAAO,MAAM;AAAA,IAAM,CAAC,CAAC,KACjG,UAAU,KAAK,UAAU,CAAC,MAAM,OAAO,MAAM,SAAS,MAAM,OAAO,MAAM,MAAM,CAAC,CAAC;AAAA,IACvF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM,eAAe,KAAK,UAAU,KAAK,qBAAqB,IAAI;AAGlE,QAAM,cAAc,GAAG,OAAO,IAAI,IAAI,WAAW,IAAI,KAAK,IAAI,YAAY,IAAI,YAAY;AAC1F,EAAAM,YAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,gBAAgB,YAAY,WAAW,YAAY,OAAO;AACxE,cAAQ,cAAY,SAAS,SAAS,CAAC,IAAI,QAAQ;AAAG,eAAS,IAAI;AAAG,uBAAiB,IAAI;AAAG,iBAAW,KAAK;AAC9G;AAAA,IACF;AACA,UAAM,KAAK,IAAI,gBAAgB;AAC/B,QAAI,YAAY;AAChB,UAAM,MAAM,YAAY;AACtB,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,oBAAc,IAAI;AAClB,UAAI;AACF,0BAAkB,KAAK;AACvB,YAAI,WAAW;AACb,gBAAM,UAAUY;AAAA,YAAiB,EAAE,GAAG,OAAO,cAAc,CAAC,GAAG,QAAQ;AAAA,cAAC,GAAG,MAAM,OAAO,OAAO,YAAUL,iBAAgB,OAAO,KAAK,CAAC;AAAA,cACpI,GAAG,eAAe,OAAO,IAAI,YAAU,EAAE,MAAM,EAAE;AAAA,YAAC,EAAE;AAAA,YAAG;AAAA,YACvD,UAAU;AAAA,YAAmB,KAAK;AAAA,YAAmB,EAAE,KAAK,gBAAgB,KAAK,iBAAiB,KAAK,KAAK,EAAE;AAAA,UAAC;AAEjH,gBAAM,WAAW,oBAAI,IAAI;AAAA,YAAC,GAAG,QAAQ,OAAO;AAAA,YAAQ,GAAG,QAAQ,OAAO,QAAQ,IAAI,UAAQ,KAAK,KAAK;AAAA,YAClG,GAAG,CAAC,GAAG,QAAQ,OAAO,OAAO,GAAG,QAAQ,OAAO,KAAK,EAAE,QAAQ,UAAQM,cAAa,IAAI,EAAE,IAAI,eAAa,UAAU,KAAK,CAAC;AAAA,UAAC,CAAC;AAC9H,qBAAW,cAAc,SAAS,aAAa;AAC7C,kBAAM,WAAW,kBAAkB,KAAK,mBAAmB,WAAW,EAAE;AACxE,gBAAI,SAAS,IAAIC,mBAAkB,WAAW,EAAE,CAAC,KAAK,aAAa,UAAa,aAAa,WAAW;AACtG,oBAAM,MAAM,uEAAuE;AAAA,UACvF;AACA,gBAAM,SAAS,MAAM,UAAU,aAAa,SAAS,GAAG,MAAM;AAC9D,UAAAC,uBAAsB,QAAQ,SAAS,MAAM,WAAW,SAAS,eAAe;AAChF,cAAI,CAAC,WAAW;AACd,+BAAmB,QAAQ,OAAO,MAAM;AAAG,+BAAmB,OAAO,SAAS;AAC9E,8BAAkB,IAAI,IAAI,OAAO,KAAK,IAAI,SAAO;AAAA,cAAC,IAAI,OAAO,OAAO;AAAA,cAClE,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,MAAMR,iBAAgB,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAChG,CAAC,KAAK,MAAM,EAAE,GAAG,SAAS,OAAO,UAAU,YAAY,mBAAmB,QACtE,EAAE,OAAO,MAAM,OAAO,EAAE,MAAM,OAAO,MAAM,aAAa,EAAE,EAAE,IAAI,EAAE,MAAwE,CAAC,CAAC,CAAC;AAAA,YAAC,CAAC,CAAC,CAAC;AACzJ,oBAAQ,OAAO,IAAa;AAAG,qBAAS,OAAO,KAAK;AAAG,6BAAiB,WAAW;AACnF,+BAAmB,EAAE,QAAQ,WAAW,WAAW,CAAC;AAAA,UACtD;AAAA,QACF,OAAO;AACL,gBAAM,MAAMS;AAAA,YAAW,cAAc,CAAC;AAAA,YAAG;AAAA,YAAgB;AAAA,YACvD,gBAAgB,SAAY,EAAE,KAAK,YAAY,IAAI,CAAC;AAAA,UAAC;AACvD,cAAI,CAAC,WAAW;AACd,oBAAQ,IAAI,IAAI;AAChB,qBAAS,IAAI,KAAK;AAClB,6BAAiB,WAAW;AAC5B,+BAAmB,EAAE,QAAQ,WAAW,WAAW,CAAC;AAAA,UACtD;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV,YAAI,CAAC,aAAa,CAAC,GAAG,OAAO,SAAS;AACpC,mBAAS,CAAU;AACnB,wBAAc,WAAW;AACzB,kBAAQ,CAAC,CAAC;AACV,mBAAS,IAAI;AACb,2BAAiB,IAAI;AAAA,QACvB;AAAA,MACF,UAAE;AACA,YAAI,CAAC,UAAW,YAAW,KAAK;AAAA,MAClC;AAAA,IACF;AACA,UAAM,IAAI,WAAW,KAAK,UAAU;AACpC,WAAO,MAAM;AACX,kBAAY;AACZ,mBAAa,CAAC;AACd,SAAG,MAAM;AAAA,IACX;AAAA,EAIF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAID,QAAM,cAAc,KAAK,eAAe;AAExC,QAAM,yBAAyB,QAAQ,IAAI,KAAK,CAAC,QAAQ;AACzD,EAAAhB,YAAU,MAAM;AACd,QAAI,gBAAgB,YAAY,CAAC,gBAAgB,YAAY,WAAW,YAAY,SAAS,uBAAwB;AACrH,UAAM,IAAI,WAAW,MAAM,KAAK,QAAQ,SAAS,aAAa,MAAM,KAAK,GAAG,GAAG;AAC/E,WAAO,MAAM,aAAa,CAAC;AAAA,EAC7B,GAAG,CAAC,aAAa,UAAU,SAAS,aAAa,MAAM,OAAO,aAAa,cAAc,sBAAsB,CAAC;AAGhH,QAAM,UAAUN;AAAA,IACd,MAAM,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,OAAO;AAAA,IACzD,CAAC,MAAM;AAAA,EACT;AACA,QAAM,QAAQE;AAAA,IACZ,CAAC,SACE,MAAM;AACL,YAAM,QAAQ,UAAUJ,gBAAe,SAAS,GAAG,IAAK,MAAyC,OAAO,OAAO;AAC/G,aAAO,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAK,QAAQ;AAAA,IACtG,GAAG;AAAA,IACL,CAAC,SAAS,OAAO,OAAO;AAAA,EAC1B;AAGA,QAAM,eAAeE;AAAA,IACnB,MAAM,KAAK,IAAI,KAAK,EAAE,OAAO,CAAC,OAAoB,MAAM,IAAI;AAAA,IAC5D,CAAC,MAAM,KAAK;AAAA,EACd;AACA,QAAM,YAAY,aAAa,YAAY;AAC3C,QAAM,gBAAgB,KAAK,UAAU,CAAC,aAAa,MAAM,MAAM,UAAU,QAAQ,IAAI,CAAC;AACtF,EAAAM,YAAU,MAAM;AAAE,cAAU,MAAM;AAAA,EAAG,GAAG,CAAC,eAAe,UAAU,KAAK,CAAC;AACxE,QAAM,eAAeN,SAAQ,MAAM,mBAAmB,eAAe,kBAAkB,mBAAmB,GAAG,CAAC,eAAe,gBAAgB,mBAAmB,CAAC;AACjK,QAAM,iBAAiBA,SAAQ,MAAM,MAAM,WAAW,YAAY,MAAM,IAAI,UAAU,CAAC,QAAQ,MAAM,QAAQ,GAAG,QAAQ,QAAQ,CAAC;AACjI,QAAM,SAAS,UAAU,OAAO,UAAU,YAAY;AACtD,QAAM,aAAa,cAAc;AACjC,QAAM,eAAe;AAAA,IACnB,aAAa;AAAA,IACb;AAAA,IACA,CAAC,MAAM;AAGL,YAAM,aAAa,cAAcJ,qBAAoB,GAAG,QAAQ,GAAG,QAAQ,OAAO;AAClF,oBAAc,UAAU,EAAE,QAAQ,aAAa,MAAM,OAAO,gBAAgB,UAAU,EAAE;AACxF,mBAAa;AACb,eAAS,UAAU;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AAGA,QAAM,mBAAmB,QAAQ,CAAC,QAAQ,kBACtC,+HAA+H;AACnI,QAAM,aAAaI,SAAQ,MAAM,CAAC,OAAO,aAAa,QAAQ,aAAa,MAAM,IAAI,UAAQ;AAC3F,QAAI;AAAE,aAAO,EAAE,GAAG,MAAM,OAAO,cAAcJ,qBAAoB,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO,EAAE;AAAA,IAAG,QAAQ;AAAE,aAAO;AAAA,IAAM;AAAA,EACrI,CAAC,GAAG,CAAC,aAAa,OAAO,QAAQ,IAAI,GAAG,QAAQ,CAAC;AACjD,QAAM,QAAyB,EAAE,GAAG,cAAc,OAAO,YAAY,MAAM,OAAM,SAAQ;AACvF,QAAI,iBAAkB,OAAM,MAAM,gBAAgB;AAClD,UAAM,OAAO,MAAM,aAAa,KAAK,IAAI;AACzC,kBAAc,UAAU,EAAE,QAAQ,aAAa,MAAM,OAAO,gBAAgB,cAAcA,qBAAoB,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO,CAAC,EAAE;AACvJ,iBAAa;AACb,WAAO;AAAA,EACT,GAAG,QAAQ,OAAM,OAAM;AACrB,QAAI,iBAAkB,OAAM,MAAM,gBAAgB;AAClD,WAAO,aAAa,OAAO,EAAE;AAAA,EAC/B,EAAE;AACF,QAAM,YACJ,kBAAkB,eAClB,iBAAiB,WAAW,UAC5B,iBAAiB,cAAc,aAC/B,iBAAiB,eAAe,cAChC,CAAC;AACH,QAAM,YAAYG,QAAO,CAAC;AAC1B,QAAM,cAAcC;AAAA,IAClB,MAAM,EAAE,UAAU;AAAA,IAClB,CAAC,QAAQ,WAAW,YAAY,MAAM,OAAO,eAAe,cAAc,iBAAiB,KAAK,eAAe;AAAA,EACjH;AACA,QAAM,kBAAkB,cAAc,KAAK,kBAAkB,KAAK,KAAK;AACvE,QAAM,kBAAkB,KAAK,oBAAoB,KAAK,oBAClD,aAAa,kBAAkB,kBAAkB,KAAK,oBACtD;AACJ,QAAM,oBAAoB,KAAK,mBAAmB,KAAK;AACvD,QAAM,wBAAwBA;AAAA,IAAQ,MAAMG,uBAAsB,cAAc,iBAAiB;AAAA,IAC/F,CAAC,cAAc,iBAAiB;AAAA,EAAC;AACnC,QAAMoB,oBAAmBrB,cAAY,OAAO,aAAyB,WAAyB;AAC5F,QAAI,CAAC,gBAAiB,OAAM,MAAM,uCAAuC;AACzE,WAAO;AAAA,MAAa;AAAA,MAAiB,MAAM,WAAW,EAAE,GAAG,aAAa,UAAU,MAAM,SAAS,IAAI;AAAA,MACnG;AAAA,MAAc,MAAM,WAAW,SAAS;AAAA,MAAuB;AAAA,MAAmB,gBAAgB,KAAK,iBAAiB,KAAK,KAAK;AAAA,MAAG;AAAA,IAAM;AAAA,EAC/I,GAAG,CAAC,iBAAiB,cAAc,uBAAuB,QAAQ,mBAAmB,UAAU,aAAa,KAAK,aAAa,CAAC;AAC/H,QAAM,kBAAkBA,cAAY,OAAO,OAAmB,WAAyB;AACrF,QAAI,CAAC,UAAU,CAAC,gBAAgB,YAAY,WAAW,YAAY,MAAO,OAAM,MAAM,sDAAsD;AAC5I,QAAI,CAAC,WAAW,kBAAkB,eAAe,CAAC,MAAM,SAAU,OAAM,MAAM,0CAA0C;AACxH,UAAM,UAAUgB;AAAA,MAAiB,EAAE,GAAG,OAAO,cAAc,CAAC,EAAE;AAAA,MAAG;AAAA,MAAc,UAAU;AAAA,MACvF,KAAK;AAAA,MAAmB,EAAE,KAAK,gBAAgB,KAAK,iBAAiB,KAAK,KAAK,EAAE;AAAA,IAAC;AACpF,UAAM,SAAS,MAAM,UAAU,aAAa,SAAS,MAAM;AAC3D,IAAAG,uBAAsB,QAAQ,SAAS,cAAc,aAAa,MAAM,SAAS,MAAM,MAAM,SAAS,SAAS,CAAC;AAChH,WAAO,EAAE,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,aAAa,OAAO,YAAY;AAAA,EACnF,GAAG,CAAC,WAAW,cAAc,KAAK,mBAAmB,eAAe,aAAa,KAAK,eAAe,QAAQ,cAAc,YAAY,SAAS,YAAY,KAAK,CAAC;AAClK,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,GAAI,kBAAkB,EAAE,WAAWE,mBAAkB,iBAAiB,SAAS,IAAI,CAAC;AAAA,MACpF,GAAI,gBAAgB,SAAY,EAAE,KAAK,aAAa,oBAAoB,KAAK,IAAI,CAAC;AAAA,MAClF,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,GAAI,YAAY,EAAE,aAAa,gBAAgB,IAAI,CAAC;AAAA,MACpD;AAAA,MACA,WAAW;AAAA,MACX,GAAI,kBAAkB,EAAE,WAAW,gBAAgB,IAAI,CAAC;AAAA,MACxD,GAAI,KAAK,uBACL,EAAE,eAAe,KAAK,qBAAqB,IAC3C,CAAC;AAAA,IACP;AAAA,IACA,UAAU,gBAAgB,CAAC,YAAY,WAAW,CAAC,YAAY;AAAA,EACjE;AACA,QAAM,WAAWxB,QAAO,KAAK;AAC7B,WAAS,UAAU;AACnB,QAAM,sBAAsBG;AAAA,IAC1B,CAAC,SAA8B,aAAmC;AAChE,UACE,YACA,KAAK,UAAU,SAAS,QAAQ,gBAAgB,CAAC,CAAC,MAChD,KAAK,UAAU,QAAQ;AAEzB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,iBAAW,UAAU,QAAS,eAAc,MAAM;AAClD,eAAS,CAAC,OAAO;AAAA,QACf,GAAG;AAAA,QACH,cAAc,KAAK;AAAA,UACjB,KAAK,UAAU,OAAO;AAAA,QACxB;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,UAAU,aAAa;AAAA,EAC1B;AAEA,QAAM,UAAU,aAAa,KAAK,SAAS;AAC3C,QAAM,UAAU,aAAa,OAAO,SAAS;AAE7C,QAAM,OAAOA,cAAY,MAAM;AAC7B,QAAI,CAAC,gBAAgB,QAAQ,KAAK,OAAQ;AAC1C,qBAAiB;AACjB,sBAAkB,SAAS,MAAM;AACjC,oBAAgB,IAAI;AACpB,mBAAe,EAAE,SAAS,OAAO,OAAO,KAAK,CAAC;AAC9C,uBAAmB,CAAC,YAAY;AAC9B,YAAM,WAAW,QAAQ,KAAK,QAAQ,KAAK,SAAS,CAAC;AACrD,UAAI,CAAC,SAAU,QAAO;AACtB,aAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG,MAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,QAAQ,QAAQ,gBAAgB,QAAQ,KAAK,CAAC,EAAE;AAAA,IAC1I,CAAC;AAAA,EACH,GAAG,CAAC,kBAAkB,CAAC;AAEvB,QAAM,OAAOA,cAAY,MAAM;AAC7B,QAAI,CAAC,gBAAgB,QAAQ,OAAO,OAAQ;AAC5C,qBAAiB;AACjB,sBAAkB,SAAS,MAAM;AACjC,oBAAgB,IAAI;AACpB,mBAAe,EAAE,SAAS,OAAO,OAAO,KAAK,CAAC;AAC9C,uBAAmB,CAAC,YAAY;AAC9B,YAAM,OAAO,QAAQ,OAAO,QAAQ,OAAO,SAAS,CAAC;AACrD,UAAI,CAAC,KAAM,QAAO;AAClB,aAAO,EAAE,OAAO,gBAAgB,IAAI,GAAG,MAAM,CAAC,GAAG,QAAQ,MAAM,gBAAgB,QAAQ,KAAK,CAAC,GAAG,QAAQ,QAAQ,OAAO,MAAM,GAAG,EAAE,EAAE;AAAA,IACtI,CAAC;AAAA,EACH,GAAG,CAAC,kBAAkB,CAAC;AAGvB,QAAM,QAAQA;AAAA,IACZ,CAAC,MAA2B,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,EAAE,EAAE;AAAA,IAClE,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,EAAE,WAAW,cAAc,cAAc,cAAc,iBAAiB,iBAAiB,iBAAiB,gBAAgB,aAAa,IAAI,gBAAgB,QAAQ,QAAQ;AAEjL,QAAM,WAAWA;AAAA,IACf,MAAM;AACJ,YAAM,WAAW,cAAc;AAC/B,mBAAa;AACb,eAAS,gBAAgB,UAAU,WAAW,aAAa,OAAO,SAAS,QAAQ,QAAQ,CAAC;AAAA,IAC9F;AAAA,IACA,CAAC,UAAU,UAAU,aAAa,IAAI;AAAA,EACxC;AAGA,QAAM,iBAAiBA;AAAA,IACrB,CAAC,YAAY;AACX,YAAM,KAAK,IAAI,OAAO,QAAQ,CAAC,IAAI,SAAS,SAAS;AACrD,YAAM,SAA4B;AAAA,QAChC;AAAA,QACA,IAAI;AAAA,QACJ,SAAS,CAAC;AAAA,QACV,GAAG;AAAA,MACL;AACA,eAAS,CAAC,OAAO;AAAA,QACf,GAAG;AAAA,QACH,cAAc,CAAC,GAAI,EAAE,gBAAgB,CAAC,GAAI,MAAM;AAAA,MAClD,EAAE;AACF,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,oBAAoBA;AAAA,IACxB,CAAC,IAAIsB,WACH,SAAS,CAAC,OAAO;AAAA,MACf,GAAG;AAAA,MACH,eAAe,EAAE,gBAAgB,CAAC,GAAG;AAAA,QAAI,CAAC,MACxC,EAAE,OAAO,KAAK,iBAAiB,GAAGA,MAAK,IAAI;AAAA,MAC7C;AAAA,IACF,EAAE;AAAA,IACJ,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,kBAAkBtB;AAAA,IACtB,CAAC,IAAI,YACH,SAAS,CAAC,MAAM;AACd,YAAM,UAAU,EAAE,gBAAgB,CAAC;AACnC,YAAM,OAAO,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AACjD,UAAI,SAAS,GAAI,QAAO;AACxB,YAAM,OAAO,CAAC,GAAG,OAAO;AACxB,YAAM,CAAC,IAAI,IAAI,KAAK,OAAO,MAAM,CAAC;AAClC,WAAK,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,KAAK,MAAM,CAAC,GAAG,GAAG,IAAK;AACjE,aAAO,EAAE,GAAG,GAAG,cAAc,KAAK;AAAA,IACpC,CAAC;AAAA,IACH,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,oBAAoBA;AAAA,IACxB,CAAC,OACC,SAAS,CAAC,OAAO;AAAA,MACf,GAAG;AAAA,MACH,eAAe,EAAE,gBAAgB,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,IAChE,EAAE;AAAA,IACJ,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,oBAAoBA;AAAA,IACxB,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,cAAc,CAAC,EAAE,EAAE;AAAA,IAClD,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,UAAUA;AAAA,IACd,CAAC,YACC,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,GAAG,QAAQ,EAAE;AAAA,IAChD,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,aAAaA;AAAA,IACjB,CAAC,OAAe,WAAW,UACzB,SAAS,CAAC,OAAO;AAAA,MACf,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,SAAS,YAAY,EAAE,SAAS,OAAO,QAAQ;AAAA,IACjD,EAAE;AAAA,IACJ,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,WAAWA;AAAA,IACf,CAAC,UAAkB,MAAM,EAAE,OAAO,QAAQ,EAAE,CAAC;AAAA,IAC7C,CAAC,KAAK;AAAA,EACR;AACA,QAAM,YAAYA,cAAY,CAAC,WAAmB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5E,QAAM,WAAWA;AAAA,IACf,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE;AAAA,IAC5D,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,WAAWA;AAAA,IACf,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,KAAK,IAAI,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE;AAAA,IACzE,CAAC,QAAQ;AAAA,EACX;AAMA,QAAM,eAAeH,QAAO,EAAE,eAAe,KAAK,eAAe,WAAW,KAAK,kBAAkB,CAAC;AACpG,eAAa,UAAU,EAAE,eAAe,KAAK,eAAe,WAAW,KAAK,kBAAkB;AAC9F,QAAM,mBAAmBG,cAAY,MAA+B;AAClE,UAAM,EAAE,eAAe,WAAAuB,WAAU,IAAI,aAAa;AAClD,WAAO,EAAE,MAAM,iBAAiB,KAAK,KAAK,GAAG,GAAIA,aAAY,EAAE,WAAAA,WAAU,IAAI,CAAC,EAAG;AAAA,EACnF,GAAG,CAAC,CAAC;AACL,QAAM,iBAAiBvB,cAAY,OAAO,OAAe,QAAgB,WAAwD;AAC/H,UAAM,aAAa,gBAAgB,OAAO,KAAK,OAAK,EAAE,SAAS,KAAK;AACpE,QAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,iBAAiB,UAAU,EAAG,QAAO,EAAE,QAAQ,CAAC,GAAG,SAAS,MAAM;AAC5G,WAAO,sBAAsB,mBAAmB,iBAAiB,OAAO,OAAO,MAAM,GAAG,GAAI,GAAG,EAAE,GAAG,iBAAiB,GAAG,OAAO,mBAAmB,GAAG,MAAM;AAAA,EAC7J,GAAG,CAAC,mBAAmB,iBAAiB,gBAAgB,CAAC;AACzD,QAAM,mBAAmBA;AAAA,IAAY,OAAO,QAAkB,WAC5D,qBAAqB,KAAK,mBAAmB,kBAAkB,mBAAmB,iBAAiB,QAAQ,iBAAiB,GAAG,MAAM,IAAI,CAAC;AAAA,IAC5I,CAAC,mBAAmB,iBAAiB,kBAAkB,KAAK,gBAAgB;AAAA,EAAC;AAE7E,QAAM,eAAeA;AAAA,IACnB,OAAO,OAAe,QAAgB,WAAwD;AAE5F,UAAI,CAAC,qBAAqB,MAAM,YAAY,CAAC,MAAM,SAAS,KAAK,SAAS,KAAK,GAAG;AAChF,cAAM,IAAI,OAAO,IAAI,KAAK;AAC1B,YAAI,CAAC,KAAK,CAAC,WAAY,QAAO,EAAE,QAAQ,CAAC,GAAG,SAAS,MAAM;AAE3D,cAAM,eAAe,mBAAmB,GAAG,UAAU;AACrD,cAAM,UAAU,uBAAuB,GAAG,YAAY,MAAM;AAE5D,eAAO;AAAA,UACL,QAAQ,QAAQ;AAAA,UAChB,SAAS,QAAQ;AAAA,UACjB,SAAS;AAAA,QACX;AAAA,MACF;AACA,aAAO,eAAe,OAAO,QAAQ,MAAM;AAAA,IAC7C;AAAA,IACA,CAAC,mBAAmB,gBAAgB,QAAQ,YAAY,QAAQ;AAAA,EAClE;AAEA,QAAM,aAAaA;AAAA,IACjB,OAAO,QAAQ,WAAW;AACxB,YAAM,YAAY,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AACrC,UAAI,qBAAqB,CAAC,MAAM;AAC9B,eAAO,iBAAiB,UAAU,OAAO,CAAC,SAAS,OAAO,IAAI,IAAI,GAAG,OAAO,SAAS,SAAS,GAAG,MAAM;AACzG,UAAI,CAAC,WAAY,QAAO,CAAC;AAGzB,YAAM,SAAiC,CAAC;AACxC,iBAAW,QAAQ,WAAW;AAC5B,YAAI,QAAQ,QAAS,OAAM,IAAI,aAAa,WAAW,YAAY;AACnE,cAAM,QAAQ,OAAO,IAAI,IAAI;AAC7B,YAAI,CAAC,MAAO;AACZ,cAAM,WAAW,oBAAI,IAAY;AACjC,mBAAW,OAAO,YAAY;AAC5B,gBAAM,QAAQJ,gBAAe,OAAO,GAAG;AACvC,cAAI,UAAU,KAAM,UAAS,IAAI,KAAK,UAAU,KAAK,CAAC;AAAA,QACxD;AACA,eAAO,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS,KAAK,CAAC,CAAC;AAAA,MACjD;AACA,aAAO,OAAO,YAAY,MAAM;AAAA,IAClC;AAAA,IACA,CAAC,mBAAmB,kBAAkB,QAAQ,YAAY,QAAQ;AAAA,EACpE;AAIA,QAAM,iBAAiBE,SAAQ,MAAM;AACnC,UAAM,WAAW,gBAAgB,OAAO,KAAK,WAAS,MAAM,SAAS,gBAAgB,OAAO;AAC5F,WAAO,CAAC,YAAY,iBAAiB,QAAQ,KAAK0B,aAAY,QAAQ,EAAE,SAAS,GAAG;AAAA,EACtF,GAAG,CAAC,eAAe,CAAC;AACpB,QAAM,WAAWxB;AAAA,IAAY,OAAO,IAAW,QAAsByB,YACnE,WAAgB,mBAAoB,iBAAiB,IAAI,EAAE,GAAG,iBAAiB,GAAG,GAAIA,SAAQ,SAAS,EAAE,QAAAA,QAAO,IAAI,CAAC,EAAG,GAAG,MAAM;AAAA,IACnI,CAAC,mBAAmB,iBAAiB,gBAAgB;AAAA,EAAC;AAOtD,QAAM,UAAUzB,cAAY,MAAM;AAChC,aAAS,CAAC,MAAM,IAAI,CAAC;AACrB,iBAAa,UAAU;AAAA,EACzB,GAAG,CAAC,CAAC;AACL,QAAM,kBAAkBA,cAAY,MAAM,qBAAqB,IAAI,GAAG,CAAC,CAAC;AACxE,QAAM,mBAAmBA;AAAA,IACvB,CAAC,EAAE,aAAa,eAAe,MAAyB;AACtD,YAAM,YACJ,cAAc,KAAK,iBAAiB,IAChC,KAAK,MAAM,iBAAiB,WAAW,IACvC;AACN,UAAI,YAAY,KAAK,YAAY,wBAAwB;AACvD,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAEA,YAAM,YAAY,OAAO,QAAQ;AACjC,cAAQ;AACR,2BAAqB;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,YAAY;AAAA,QACrB,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,yBAAyB,mBAAmB,eAAe;AACjE,QAAM,qBAAqB,mBAAmB,WAAW;AAEzD,EAAAI,YAAU,MAAM;AACd,QAAI,0BAA0B,QAAQ,sBAAsB,KAAM;AAElE,UAAM,OAAO,MAAM;AACjB,UAAI,OAAO,QAAQ,KAAK,oBAAoB;AAC1C;AAAA,UAAqB,CAAC,YACpB,SAAS,YAAY,qBAAqB,OAAO;AAAA,QACnD;AACA;AAAA,MACF;AAEA,cAAQ;AACR,2BAAqB,CAAC,YAAY;AAChC,YAAI,CAAC,QAAS,QAAO;AACrB,YAAI,QAAQ,YAAY,mBAAoB,QAAO;AACnD,eAAO,EAAE,GAAG,SAAS,WAAW,QAAQ,YAAY,EAAE;AAAA,MACxD,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,YAAY,MAAM,sBAAsB;AACzD,UAAM,UAAU;AAAA,MACd,MACE;AAAA,QAAqB,CAAC,YACpB,SAAS,YAAY,qBAAqB,OAAO;AAAA,MACnD;AAAA,MACF,KAAK,IAAI,GAAG,qBAAqB,OAAO,QAAQ,CAAC;AAAA,IACnD;AAEA,WAAO,MAAM;AACX,oBAAc,QAAQ;AACtB,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,wBAAwB,oBAAoB,OAAO,CAAC;AAExD,QAAM,cAAcN;AAAA,IAClB,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,CAAC,mBAAmB,kBAAkB,eAAe;AAAA,EACvD;AAEA,QAAM,aAAaE;AAAA,IACjB,OAAO,OAAc;AACnB,UAAI,CAAC,UAAW;AAChB,UAAI,CAAC,kBAAkB,MAAM,YAAY,gBAAgB,KAAKW,gBAAe,KAAK,MAAM,QAAQ,KAAK,CAAC,SAASA,iBAAgB,KAAK,KAAK,CAAC,GAAG;AAI3I,gBAAQ;AACR;AAAA,MACF;AACA,YAAM,UAAU,MAAM,SAAS,IAAI,QAAW,eAAe;AAC7D;AAAA,QAAQ,CAAC,SACP,KAAK,IAAI,CAAC,MAAO,MAAM,CAAC,MAAM,KAAM,WAAW,IAAK,CAAE;AAAA,MACxD;AAAA,IACF;AAAA,IACA,CAAC,WAAW,UAAU,OAAO,UAAU,iBAAiB,MAAM,SAAS,SAAS,cAAc;AAAA,EAChG;AAEA,QAAM,gBAAgBb;AAAA,IACpB,MAAML,gBAAe,cAAc,KAAK;AAAA,IACxC,CAAC,cAAc,KAAK;AAAA,EACtB;AAEA,QAAM,eAAeK;AAAA,IACnB,OAAO;AAAA,MACL,SAAS,MAAM,gBAAgB,CAAC;AAAA,MAChC,SAAS,SAAS;AAAA,MAClB,SAAS,SAAS;AAAA,MAClB,OAAO,SAAS;AAAA,MAChB,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS,SAAS;AAAA,MAClB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY,GAAG,WAAW,IAAI,WAAW,IAAI,eAAe,IAAI,KAAK,UAAU,MAAM,KAAK,CAAC;AAAA,IAC7F;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AAKA,QAAM,oBAAoB,KAAK,UAAU,CAAC,aAAa,MAAM,gBAAgB,CAAC,GAAG,MAAM,OAAO,UAAU,KAAK,CAAC;AAC9G,QAAM,sBAAsBD,QAAO,EAAE,KAAK,IAAI,YAAY,EAAE,CAAC;AAC7D,MAAI,oBAAoB,QAAQ,QAAQ;AACtC,wBAAoB,UAAU,EAAE,KAAK,mBAAmB,YAAY,oBAAoB,QAAQ,aAAa,EAAE;AACjH,QAAM,YAAYC,SAAQ,MAAoC;AAC5D,QAAI,CAAC,UAAU,CAAC,gBAAgB,YAAY,WAAW,YAAY,MAAO,QAAO;AACjF,UAAM,aAAa,YAAY,cAAc,SAAS,eAAe,cAAc,WAAW;AAC9F,UAAM,cAAc,SAAS,SAAS,SAAS,SAAS,QAAQ,KAAK,WAAS,MAAM,KAAK,GAAG;AAC5F,UAAM,gBAAgB,CAAE,MAAM,cAAc,SAAU,SAClD,SAAS,WAAY,CAAC,SAAS,WAAW,CAAC,SAAS,QAAS,YAC7D,cAAc,WAAW;AAC7B,UAAM,SAAS,eAAe,YAAY,kBAAkB,WAAW,WACnE,eAAe,eAAe,kBAAkB,YAAY,cAAc;AAC9E,WAAO;AAAA,MACL;AAAA,MAAO,KAAK;AAAA,MAAmB,YAAY,oBAAoB,QAAQ;AAAA,MACvE;AAAA,MAAQ,MAAM;AAAA,MAAY,SAAS;AAAA,MACnC,OAAO,eAAe,WAAW,QAAQ,cAAe,uBAAuB,QAAQ,cAAc,MAAM,OAAO,WAAW,CAAC,IAAK;AAAA,IACrI;AAAA,EACF,GAAG;AAAA,IAAC;AAAA,IAAQ;AAAA,IAAc,YAAY;AAAA,IAAS,YAAY;AAAA,IAAO;AAAA,IAAW;AAAA,IAAO;AAAA,IAAY;AAAA,IAC9F,SAAS;AAAA,IAAO,SAAS;AAAA,IAAS,SAAS;AAAA,IAAS;AAAA,IAAO;AAAA,EAAiB,CAAC;AAC/E,QAAM,iBAAiB,WAAW,WAAW,cAAc,UAAU,QAAQ;AAI7E,QAAM,cAAcD,QAAuF,IAAI;AAC/G,QAAM,YAAYA,QAAsB,IAAI;AAC5C,EAAAO,YAAU,MAAM;AACd,QAAI,gBAAgB,eAAe,CAAC,kBAAkB,uBAAwB;AAC9E,UAAM,MAAM,KAAK,UAAU,CAAC,aAAa,MAAM,cAAc,CAAC;AAC9D,QAAI,YAAY,SAAS,QAAQ,OAAQ,CAAC,YAAY,WAAW,UAAU,YAAY,IAAM;AAC7F,QAAI,YAAY,QAAS,cAAa,YAAY,QAAQ,KAAK;AAC/D,UAAM,OAAO,MAAM;AACjB,kBAAY,UAAU;AACtB,gBAAU,UAAU;AACpB,WAAK,QAAQ,SAAS,aAAa,MAAM,cAAc;AAAA,IACzD;AACA,gBAAY,UAAU,EAAE,KAAK,MAAM,OAAO,WAAW,MAAM,GAAG,EAAE;AAAA,EAClE,GAAG,CAAC,aAAa,gBAAgB,SAAS,aAAa,MAAM,sBAAsB,CAAC;AAEpF,EAAAA,YAAU,MAAM,MAAM;AACpB,UAAM,UAAU,YAAY;AAC5B,QAAI,SAAS;AAAE,mBAAa,QAAQ,KAAK;AAAG,cAAQ,KAAK;AAAA,IAAG;AAAA,EAC9D,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcJ,cAAY,CAAC,QAA2B;AAC1D,UAAM,QAAQ,aAAa,OAAO,KAAK,OAAK,EAAE,SAAS,aAAa,OAAO;AAC3E,UAAM,QAAQ,QAAQJ,gBAAe,OAAO,GAAG,IAAK,IAAgC,aAAa,OAAO;AACxG,WAAO,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAK,QAAQ;AAAA,EACtG,GAAG,CAAC,YAAY,CAAC;AAIjB,QAAM,kBAAkB,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,SAAS;AACzF,QAAM,kBAAkBE;AAAA,IAAQ,MAAM,CAAC,kBAAkB,kBAAkB;AAAA,MAAE,GAAG;AAAA,MAC9E,QAAQ,CAAC,GAAG,gBAAgB,QAAQ,GAAG,gBAAgB,OAAO,OAAO,WAAS,CAAC,gBAAgB,OAAO,KAAK,OAAK,EAAE,SAAS,MAAM,IAAI,CAAC,CAAC;AAAA,IAAE;AAAA,IAC3I,CAAC,iBAAiB,eAAe;AAAA,EAAC;AAClC,QAAM,qBAAqBD,QAAO,eAAe;AACjD,qBAAmB,UAAU;AAC7B,QAAM,YAAYG;AAAA,IAAY,OAAO,IAAW,WAC9C,WAAgB,mBAAoB,mBAAmB,SAAS,IAAI,iBAAiB,GAAG,MAAM;AAAA,IAChG,CAAC,mBAAmB,gBAAgB;AAAA,EAAC;AACrC,QAAM,cAAc,eAAe;AAAA,IACjC,QAAQ,MAAM,WAAW,eAAe;AAAA,IACxC,OAAO;AAAA,IAAa,UAAU;AAAA,IAAgB,SAAS,KAAK;AAAA,IAC5D,MAAM,MAAM,WAAW,cAAc,CAAC,IAAI;AAAA,IAAM,YAAY;AAAA;AAAA,IAE5D,OAAO;AAAA,IAAa,UAAU,qBAAqB,iBAAiB,YAAY;AAAA,IAAW,YAAY;AAAA,IAAO;AAAA,IAAO,gBAAgB;AAAA,IACrI,YAAY,gBAAgB,CAAC,YAAY,WAAW,CAAC,YAAY;AAAA,EACnE,CAAC;AAOD,QAAM,kBAAkB,MAAM,WAAW,KAAK,UAAU,CAAC,MAAM,UAAU,MAAM,OAAO,OAAO,YAAY,CAAC,IAAI;AAC9G,QAAM,eAAeH,QAAO,EAAE,YAAY,IAAI,QAAQ,CAAC,GAAgB,MAAM,oBAAI,IAAgB,EAAE,CAAC;AACpG,QAAM,cAAc,CAAC,YAAY,WAAW,MAAM;AAClD,MAAI,aAAa,QAAQ,eAAe,mBAAmB,YAAY,KAAK,CAAC,MAAM,MAAM,SAAS,aAAa,QAAQ,OAAO,CAAC,CAAC;AAC9H,iBAAa,UAAU,EAAE,YAAY,iBAAiB,QAAQ,aAAa,MAAM,oBAAI,IAAI,EAAE;AAE7F,QAAM,gBAAgB,uBAAuB,aAAa,CAAC,YAAY;AACvE,MAAI,cAAe,YAAW,OAAO,MAAM;AACzC,UAAM,KAAK,MAAM,GAAG;AACpB,QAAI,MAAM,KAAM,cAAa,QAAQ,KAAK,IAAI,IAAI,GAAG;AAAA,EACvD;AACA,QAAM,qBAAqBC,SAAQ,MAA2C;AAC5E,QAAI,CAAC,oBAAqB,QAAO;AACjC,UAAM,SAAS,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAEzE,UAAM,SAAS,QAAQ,SAAS,CAAC,SAAS,SAAS,QAAQ,GAAG,OAAO,UAAQ,SAAS,MAAM;AAC5F,WAAO;AAAA,MAAE;AAAA,MAAO,cAAc,mBAAmB,MAAM,EAAE,OAAO,UAAS,MAAmB,SAAS,IAAI,CAAC;AAAA,MACxG,YAAY,GAAG,QAAQ,cAAc,aAAa,IAAI;AAAA,MACtD,GAAI,QAAQ,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IAAG;AAAA,EAC5D,GAAG,CAAC,qBAAqB,KAAK,aAAa,aAAa,IAAI,CAAC;AAE7D,QAAM,oBAAoBA,SAAQ,OAAO;AAAA,IAAE,GAAG;AAAA,IAC5C,eAAe,cAAc,OAAO,OAAO,WAAS,MAAM,SAAS,cAAc,OAAO,EAAE,IAAI,YAAU,EAAE,OAAO,MAAM,KAAK,EAAE;AAAA,IAC9H,QAAQ,cAAc,OAAO,IAAI,WAC/B,MAAM,SAAS,cAAc,UAAU,EAAE,GAAG,OAAO,UAAU,EAAE,SAAS,MAAM,EAAE,IAAI,KAAK;AAAA,EAAE,IAAI,CAAC,aAAa,CAAC;AAElH,QAAM,gBAAgBE,cAA4C,CAAC,SAAS,SAAS,aACnF,QAAQ,WAAW,OAAO,SAAS,aAAa,KAAK,OAAO,IAAI,OAAO,OAAO,GAAG,CAAC,QAAQ,CAAC;AAC7F,QAAM,eAAe,eAAe;AAAA,IAClC,QAAQ;AAAA,IAAmB;AAAA,IAAO,UAAU;AAAA,IAAe,SAAS;AAAA,IAAoB;AAAA,IAAM,YAAY;AAAA,IAC1G;AAAA,IAAO,UAAU;AAAA,IAAW,YAAY;AAAA,IAAO;AAAA,IAAO,gBAAgB;AAAA,IACtE,YAAY,gBAAgB,CAAC,YAAY,WAAW,CAAC,YAAY;AAAA,IACjE,WAAW,CAAC,OAAO;AACjB,YAAM,MAAM,aAAa,QAAQ,KAAK,IAAI,EAAE;AAC5C,aAAO,MAAM,EAAE,IAAI,IAAI,iBAAiB,QAAQ,OAAO;AAAA,IACzD;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AAED,QAAM,MAA0B;AAAA,IAC9B,aAAa;AAAA,MAAE,QAAQ,YAAY,QAAQ,UAAU,CAAC,gBAAgB,YAAY,UAAU,cAAc;AAAA,MACxG,OAAO,UAAU,gBAAgB,CAAC,YAAY,WAAW,CAAC,YAAY;AAAA,MAAO,OAAO,YAAY;AAAA,IAAM;AAAA,IACxG;AAAA,IACA,GAAI,QAAQ,MAAM,YAAY;AAAA,MAC5B,YAAY,EAAE,OAAO,iBAAiB,KAAK,GAAG,WAAW,MAAM,UAAU;AAAA,MACzE,eAAe,CAAC,SAA6E;AAC3F,cAAM,UAAU,gBAAgB,QAAQ;AACxC,cAAM,QAAQ,OAAO,SAAS,aAC1B,KAAK,EAAE,OAAO,iBAAiB,OAAO,GAAG,WAAW,QAAQ,UAAW,CAAC,IACxE;AAEJ,iBAAS,cAAc,EAAE,GAAGN,qBAAoB,MAAM,OAAO,QAAQ,GAAG,WAAW,MAAM,UAAU,GAAG,QAAQ,OAAO,CAAC;AAAA,MACxH;AAAA,IACF,IAAI,CAAC;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,GAAI,eAAe,iBAAiB,EAAE,YAAY,IAAI,eAAe,EAAE,aAAa,aAAa,IAAI,CAAC;AAAA,IACtG;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,WAAW,YAAY;AAAA,IAChC,OAAO,YAAY,SAAS;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,qBAAqBM,cAAoD,OAAO,MAAM,QAAQ,WAAW;AAC7G,QAAI,kBAAmB,QAAO,eAAe,MAAM,QAAQ,MAAM;AACjE,UAAM,QAAQ,cAAc,YAAY,IAAI;AAC5C,WAAO,SAAS,aAAa,EAAE,GAAG,uBAAuB,OAAO,YAAY,MAAM,GAAG,SAAS,mBAAmB,OAAO,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,SAAS,MAAM;AAAA,EACvK,GAAG,CAAC,mBAAmB,gBAAgB,eAAe,UAAU,CAAC;AACjE,QAAM,mBAAmBA,cAAkD,OAAO,OAAO,WAAW;AAClG,QAAI,QAAQ,QAAS,OAAM,IAAI,aAAa,WAAW,YAAY;AACnE,UAAM,YAAY,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AACpC,QAAI,kBAAmB,QAAO,iBAAiB,WAAW,MAAM;AAChE,WAAO,OAAO,YAAY,UAAU,QAAQ,UAAQ;AAClD,YAAM,QAAQ,cAAc,YAAY,IAAI;AAC5C,aAAO,SAAS,aAAa,CAAC,CAAC,MAAM,EAAE,UAAU,IAAI,IAAI,WAAW,IAAI,SAAO,KAAK,UAAUJ,gBAAe,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC;AAAA,IAC1I,CAAC,CAAC;AAAA,EACJ,GAAG,CAAC,mBAAmB,kBAAkB,eAAe,UAAU,CAAC;AACnE,QAAM,YAAoC;AAAA,IACxC,GAAG;AAAA,IAAe;AAAA,IAAS,OAAO;AAAA,IAAa,OAAO;AAAA,IAAa,UAAU;AAAA,IAC7E,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACrC,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AACA,QAAM,WAAW;AAAA,IAAsB;AAAA,IAAK;AAAA,IAAW;AAAA,IAAe,UAAU,UAAU,cAAc,CAAC;AAAA,IAAG;AAAA,IAAmB,aAAa;AAAA,IAC1I,EAAE,aAAa,CAAC,gBAAgB,GAAI,iBAAiB,EAAE,SAAS,gBAAgB,IAAI,CAAC,EAAG;AAAA,EAAC;AAC3F,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,qBAAqB,MAAM,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC1D,QAAQ,EAAE,GAAG,QAAQ,MAAM,WAAS,MAAM,YAAY8B,gBAAe,MAAM,SAAS,IAAI,EAAE,SAAS,KAAK,IACpG,SAAS,WAAW,MAAM,SAAS,KAAK,OAAO,SAAO,cAAc,GAAG,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,EAAE;AAAA,EAChH;AACF;AAOA,SAAS,YACP,UACA,OACA,UACiB;AACjB,QAAM,IAAI,SAAS,UAAU,CAAC,MAAM,EAAE,UAAU,KAAK;AACrD,MAAI,CAAC,UAAU;AACb,QAAI,MAAM,KAAK,SAAS,WAAW,GAAG;AACpC,YAAM,UACJ,SAAS,CAAC,EAAG,QAAQ,SAAS,QAAQ;AACxC,aAAO,CAAC,EAAE,GAAG,SAAS,CAAC,GAAI,KAAK,QAAQ,CAAC;AAAA,IAC3C;AACA,WAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;AAAA,EAChC;AACA,MAAI,MAAM,GAAI,QAAO,CAAC,GAAG,UAAU,EAAE,OAAO,KAAK,OAAO,CAAC;AACzD,QAAM,MAAM,SAAS,CAAC;AACtB,MAAI,IAAI,QAAQ,QAAQ;AACtB,UAAM,OAAO,CAAC,GAAG,QAAQ;AACzB,SAAK,CAAC,IAAI,EAAE,GAAG,KAAK,KAAK,MAAM;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,SAAS,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC;AAC1C;;;AelyDA,SAAS,aAAAC,aAAW,WAAAC,WAAS,YAAAC,kBAAgB;AAC7C;AAAA,EACE;AAAA,OAIK;AAGA,SAAS,oBACd,YACA,SACA;AACA,QAAM,cAAc,KAAK,UAAU,WAAW,IAAI,kBAAkB,EAAE,KAAK,CAAC;AAC5E,QAAM,QAAQD;AAAA,IACZ,MAAM;AAAA,MACJ,GAAG,IAAI;AAAA,QACL,WAAW,IAAI,CAAC,cAAc;AAAA,UAC5B,mBAAmB,SAAS;AAAA,UAC5B;AAAA,QACF,CAAC;AAAA,MACH,EAAE,OAAO;AAAA,IACX;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AACA,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAS;AAAA,IACjC,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ,oBAAI,IAAqC;AAAA,IACjD,OAAO;AAAA,EACT,CAAC;AACD,EAAAF,YAAU,MAAM;AACd,UAAM,aAAa,IAAI,gBAAgB;AACvC,QAAI,CAAC,WAAW,MAAM,WAAW,EAAG;AACpC,UAAM,UAAU,IAAI,IAAI,MAAM,IAAI,kBAAkB,CAAC;AACrD,SAAK,QAAQ,QAAQ,EAClB,KAAK,MAAM,QAAQ,QAAQ,OAAO,WAAW,MAAM,CAAC,EACpD,KAAK,CAAC,YAAY;AACjB,UAAI,WAAW,OAAO,QAAS;AAC/B,YAAM,SAAS,oBAAI,IAAqC;AACxD,iBAAW,UAAU,SAAS;AAC5B,cAAM,MAAM,mBAAmB,OAAO,SAAS;AAC/C,YAAI,QAAQ,IAAI,GAAG,EAAG,QAAO,IAAI,KAAK,MAAM;AAAA,MAC9C;AACA,eAAS,EAAE,aAAa,SAAS,QAAQ,OAAO,KAAK,CAAC;AAAA,IACxD,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,UAAI,CAAC,WAAW,OAAO;AACrB,iBAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,QAAQ,oBAAI,IAAI;AAAA,UAChB,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,QACjE,CAAC;AAAA,IACL,CAAC;AACH,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,GAAG,CAAC,OAAO,OAAO,CAAC;AACnB,QAAM,UACJ,MAAM,gBAAgB,eAAe,MAAM,YAAY;AACzD,SAAO;AAAA,IACL,QAAQ,UAAU,MAAM,SAAS,oBAAI,IAAqC;AAAA,IAC1E,OAAO,UAAU,MAAM,QAAQ;AAAA,EACjC;AACF;","names":["column","withoutGrouping","sourceExecutionSchema","toQueryRequestV3","validateQueryResultV3","QueryError","useCallback","useEffect","useRef","useState","useCallback","useEffect","useMemo","useRef","useState","useRef","useEffect","queryParameter","useCallback","row","useState","predicatesOf","predicatesOf","useCallback","useEffect","useMemo","useRef","useState","abort","useMemo","useState","useRef","useCallback","useEffect","f","abort","useCallback","useEffect","useMemo","useRef","useState","applyQuery","normalizeQueryState","readFieldValue","selectedFields","queriesEqual","isWhereConjunction","predicatesOf","opsForField","metricPlans","validateMetric","metricDependencies","isComputedField","computedFieldName","groupKeyFields","useCallback","useEffect","useMemo","useRef","useState","abort","useCallback","useEffect","useMemo","useRef","useState","normalizeQueryState","hasRegex","predicatesOf","sourceExecutionSchema","toQueryRequestV3","validateQueryResultV3","readFieldValue","isComputedField","hasRegex","toQueryRequestV3","validateQueryResultV3","isComputedField","normalizeQueryState","values","readFieldValue","sourceExecutionSchema","byId","predicatesOf","useMemo","useRef","useState","useEffect","useCallback","useCallback","useEffect","useMemo","useState","next","useCallback","useMemo","useCallback","useMemo","useState","useCallback","useEffect","useRef","useState","storage","useCallback","useEffect","useRef","useState","selectedFields","normalizeQueryState","isWhereConjunction","readFieldValue","useRef","useMemo","useState","useCallback","sourceExecutionSchema","error","withoutGrouping","useEffect","queriesEqual","storage","linkService","defaults","abort","host","isComputedField","validateMetric","QueryError","metricPlans","metricDependencies","toQueryRequestV3","predicatesOf","computedFieldName","validateQueryResultV3","applyQuery","executeV3Metrics","patch","execution","opsForField","select","groupKeyFields","useEffect","useMemo","useState"]}