@createstore/createstore 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/createStore.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useSyncExternalStore,\n RSC,\n cache,\n ClientRoot,\n type ReactElement,\n type ReactNode,\n} from './react-bindings';\n\n// ---- Server Components (Next.js App Router) -------------------------------------------------\n// <AppStore.Root> in a Server Component hands its snapshot down by store name; the store's first\n// hook below picks it up, and later snapshots (client-side navigation) merge their server data in.\ntype PendingSnapshots = Record<string, { snapshot: unknown; scope?: unknown }>;\nexport const __SnapshotContext = (RSC ? null : createContext<PendingSnapshots | null>(null)) as ReturnType<\n typeof createContext<PendingSnapshots | null>\n>;\nconst storesByName = new Map<string, object>(); // the browser's stores, by name\nconst MERGE = Symbol('createStore.merge');\nconst QUIET = Symbol('createStore.quiet');\nconst APP_PERSIST = Symbol('createStore.appPersist');\nconst ALL_PAGES = Symbol('createStore.allPages');\n/** Internal: ClientRoot merges a later page's server data into the store named `name` */\nexport function __mergeSnapshot(name: string, snapshot: unknown) {\n const store = storesByName.get(name) as Record<symbol, ((s: unknown) => void) | undefined> | undefined;\n store?.[MERGE]?.(snapshot);\n}\n\n/**\n * Global state that works like useState, shared by every component:\n *\n * const store = createStore({ todos: [] as Todo[] });\n * const [todos, setTodos] = store.useGlobalState('todos');\n *\n * No provider, no reducers, no action types. Everything else is optional and\n * stays off until you use it: computed values, server data (query(), with or\n * without params or pages), persist, offline, history (undo/redo), syncTabs,\n * events, keyActions, actions, batch, reset, server rendering.\n *\n * Reading: useGlobalState('key') returns [value, setter, status] for every key,\n * computed ones too: const [total] = useGlobalState('total');\n * Only the selector form returns the value itself: useGlobalState((get) => ...).\n *\n * React comes in through ./react-bindings. The package ships it (with a server\n * version and client-root.tsx); if you copy this file in instead, that module\n * must export:\n * createContext, createElement, useCallback, useContext, useEffect, useRef,\n * useSyncExternalStore React's. In Server Components React has no hooks or\n * createContext: undefined there is fine (a namespace\n * import), the store doesn't call them there.\n * RSC true only in Server Components (typeof React.useState !== 'function')\n * cache React's cache() in Server Components (per-request stores), else undefined\n * ClientRoot a 'use client' component ({ name, snapshot, children }): provides\n * { ...parent, [name]: { snapshot } }, memoised, via __SnapshotContext,\n * and calls __mergeSnapshot(name, snapshot) in a useLayoutEffect (with\n * useEffect a new page's components would fetch before the merge).\n *\n * Map of this file: public types → createStore → build(), which holds state\n * and computed values, persistence, history, apply() (the one place every\n * change goes through), optimistic saves, queries, events, then the hooks.\n */\n\n/* =========================================================================\n Types\n ========================================================================= */\n\ntype Updater<T> = T | ((prev: T) => T);\n\n/** Options of `query(fetch, options)` */\n/** What a query reports after its first load was cancelled: see QueryOptions.whenAborted */\nexport type WhenAborted = 'loading' | 'idle';\n\nexport interface QueryOptions<T, R = T> {\n select?: (data: T) => R; // expose a transformed value; the store keeps the raw data\n initial?: T; // the value before the first response, without params (default: undefined, like a query with params)\n /**\n * What status.state says when the first load was cancelled (abort()), so nothing loaded and nothing\n * is running: 'loading' (as if still loading, until it's fetched again) or 'idle' (a fifth state,\n * only for this query). Left out: 'ready', as before.\n */\n whenAborted?: WhenAborted;\n staleTime?: number; // ms the data stays fresh (default: 30s)\n retry?: number; // retries on failure (default: 2)\n retryDelay?: RetryDelay; // ms before each retry (default: 500, 1000, 2000...)\n gcTime?: number; // ms data for params nobody shows stays cached (default: 5 minutes)\n refetchAfterMutation?: boolean; // reload after a successful server save\n}\n\n/** `pages` in `query(fetchPage, { pages: { first, next, max } })` */\nexport interface PagesOptions<TPage, TParam> {\n first: TParam; // the first request's page: 1, null for a cursor...\n next: (lastPage: TPage, pages: TPage[], page: TParam) => TParam | undefined | null; // undefined/null = no more\n max?: number; // keep only the newest N pages\n /**\n * When the list refreshes (stale when shown again, refetch(), invalidate()): 'first' (default) starts\n * over from the first page; 'loaded' fetches as many pages as were loaded, then swaps them in at\n * once, so a long list keeps its length (one request per page).\n */\n refresh?: 'first' | 'loaded';\n}\n\n/** Options of a paged query: `query(fetchPage, { pages: { ... }, staleTime, ... })` */\nexport interface PagedQueryOptions<TPage, TParam> {\n pages: PagesOptions<TPage, TParam>;\n whenAborted?: WhenAborted; // see QueryOptions.whenAborted\n staleTime?: number;\n retry?: number;\n retryDelay?: RetryDelay;\n gcTime?: number;\n}\n\n/** The third argument of `useGlobalState(key, params, options)` */\nexport interface UseOptions {\n enabled?: boolean; // false: don't load (yet), e.g. { enabled: !!id }\n /** Wait until these queries have data: pass their statuses. Gives you blocked, blockedBy and rootError. */\n waitFor?: Status | readonly Status[];\n}\n\n/** What `useGlobalState(pagedKey)` gives as its status: a Status plus page controls */\nexport interface PagedStatus extends Status {\n hasNextPage: boolean;\n fetchNextPage: () => Promise<void>; // never rejects: errors show up in `error`\n isFetchingNextPage: boolean;\n}\n\n/** `true` (or leaving it out) = the default; or your own: `attempt => 1000 * attempt` (attempt starts at 1) */\nexport type RetryDelay = true | ((attempt: number) => number);\n\n/** The default retry delay: 500ms, then 1s, 2s, 4s... */\nexport const defaultRetryDelay = (attempt: number) => 500 * 2 ** (attempt - 1);\n\n/** `U`: what the key holds before the first response: undefined, or nothing extra when `initial` is given */\nexport interface QueryDef<T, R = T, P = unknown, U = undefined, A extends WhenAborted | undefined = undefined> {\n readonly __kind: 'query';\n fetch: (params: P, signal: AbortSignal) => Promise<T>;\n options: QueryOptions<T, R>;\n /** type only: carries U (before the first response) and A (whenAborted) */\n readonly __before?: [U];\n readonly __aborted?: [A];\n}\n\n/** What `query(fetchPage, { pages })` returns */\nexport interface PagedQueryDef<TPage, TParam, P = unknown, A extends WhenAborted | undefined = undefined> {\n readonly __kind: 'pages';\n readonly __aborted?: [A];\n fetch: (page: TParam, params: P, signal: AbortSignal) => Promise<TPage>;\n options: PagedQueryOptions<TPage, TParam>;\n}\n\n/**\n * What selectors and computed functions receive. It works three ways:\n * get('todos') call it\n * state.todos read a property\n * ({ todos }) => ... destructure it\n * Every key you read is tracked as a dependency.\n */\nexport type StateReader<V> = V & (<K extends keyof V & string>(key: K) => V[K]);\n\n/** One layer of computed values. Each function can read state and every earlier layer. */\n// Returns `any`, not `unknown`: with `unknown` TypeScript stops inferring the later layers\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- see above\nexport type ComputedLayer<V> = Record<string, (get: StateReader<V>) => any>;\n\n/** `{ total: (get) => number }` becomes `{ total: number }` */\nexport type LayerValues<C> = { [K in keyof C]: C[K] extends (...args: never[]) => infer R ? R : never };\n/** An object type with no keys: adds nothing to an intersection */\nexport type NoKeys = Record<never, never>;\n// A layer that wasn't passed is inferred as the bare constraint (string keys); it adds no keys\nexport type AddedValues<C> = string extends keyof C ? NoKeys : LayerValues<C>;\n\n/** Internal: how a query with params is run */\ninterface QueryConfig {\n whenAborted?: WhenAborted;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- params are typed by the user's fetch; `unknown` would block its annotation\n fetch: (params: any, signal: AbortSignal) => Promise<unknown>;\n staleTime?: number;\n retry?: number;\n retryDelay?: RetryDelay; // ms before each retry (default: 500, 1000, 2000...)\n gcTime?: number; // ms an unused entry stays cached (default: 5 minutes)\n}\n\n/** What any InfiniteQuery fits (its callbacks take whatever their pages are) */\ntype AnyInfinite = {\n readonly __kind: 'infinite';\n firstPage: unknown;\n refresh?: 'first' | 'loaded';\n fetch: (page: never, signal: AbortSignal, params: never) => Promise<unknown>;\n nextPage: (lastPage: never, pages: never[], page: never) => unknown;\n maxPages?: number;\n retry?: number;\n retryDelay?: RetryDelay;\n gcTime?: number;\n};\n\n/** Turns `{ todos: query(fn) }` into `{ todos: Todo[] }` */\n// QueryDef is invariant in T (select's input), so both parts are inferred: [raw, selected]\ntype ValueOf<D> = D extends QueryDef<infer T, infer R, infer P, infer U> ? [T, R, P][1] | U : D;\n/** What setters write: the raw data, also for a query with `select` */\ntype RawOf<D> = D extends QueryDef<infer T, infer R, infer P, infer U> ? [T, R, P][0] | U : D;\n// Paged queries aren't state: they're read with useGlobalState(key) only\ntype NotPaged<S, K extends keyof S> = S[K] extends { readonly __kind: 'pages' } ? never : K;\nexport type RawValues<S> = { [K in keyof S as NotPaged<S, K>]: RawOf<S[K]> };\nexport type Values<S> = { [K in keyof S as NotPaged<S, K>]: ValueOf<S[K]> };\n/** Keys declared with query(...) (not paged), and with pages */\ntype QueryKeysOf<S> = { [K in keyof S]: S[K] extends { readonly __kind: 'query' } ? K : never }[keyof S] & string;\ntype PagedKeysOf<S> = { [K in keyof S]: S[K] extends { readonly __kind: 'pages' } ? K : never }[keyof S] & string;\ntype ParamsOf<D> = D extends { fetch: (params: infer P, ...rest: never[]) => unknown } ? P : never;\ntype PagedParamsOf<D> = D extends { fetch: (page: never, params: infer P, ...rest: never[]) => unknown } ? P : never;\ntype PageOf<D> = D extends { fetch: (...a: never[]) => Promise<infer Page> } ? Page : never;\n/** The hook's status for a key: with whenAborted: 'idle', its state can also be 'idle' */\ntype StatusFor<D> = D extends { readonly __aborted?: ['idle'] } ? IdleStatus : Status;\ntype PagedStatusFor<D> = D extends { readonly __aborted?: ['idle'] } ? PagedIdleStatus : PagedStatus;\n/** A query declared without params takes no params argument (not even undefined): leave it out */\ntype TakesParams<P> = [P] extends [undefined] ? never : P | undefined;\n\n/** The setter returned by useGlobalState */\nexport type SetValue<T> = <R = void>(\n value: Updater<T>,\n serverCall?: () => Promise<R> | R\n) => Promise<R>; // resolves with what the save returned (a refund, the saved record...)\n\n\n/** A per-key action: `(current, ...args) => next`, or `{ run, save }` to also save it to a server */\nexport type KeyAction<T> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- action arguments are whatever the user declares\n | ((current: T, ...args: any[]) => T)\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- same\n run: (current: T, ...args: any[]) => T;\n save?: (next: T) => Promise<unknown> | unknown; // a failed save rolls the change back\n };\n\nconst MAX_SNAPSHOT_DEPTH = 1000;\n// A path inside a message: the start and the end, not a thousand \".child\" segments\nconst shortPath = (p: string) => (p.length > 120 ? `${p.slice(0, 60)}…${p.slice(-40)}` : p);\nconst HISTORY_CHANNEL = '\\u0000history';\nconst entryChannel = (k: string) => `\\u0000${k}`; // a cache entry's channel\n/**\n * Why `value` wouldn't come back unchanged from JSON.stringify + JSON.parse, with where it is,\n * or null when it would. `at` is the path so far, like `cart[2].addedAt`.\n */\nfunction notJsonSafe(value: unknown, at: string, inArray: boolean): string | null {\n // A loop, not recursion: deeply nested state can't overflow the stack\n type Item = { v: unknown; at: string; inArray: boolean; depth: number } | { leave: object };\n const stack: Item[] = [{ v: value, at, inArray, depth: 0 }];\n const onPath = new Set<object>(); // the objects between the root and the current value: a cycle\n while (stack.length) {\n const item = stack.pop()!;\n if ('leave' in item) {\n onPath.delete(item.leave);\n continue;\n }\n const { v, at: where, inArray: inArr, depth } = item;\n switch (typeof v) {\n case 'string':\n case 'boolean':\n continue;\n case 'number':\n if (Number.isFinite(v)) continue;\n return `${where} is ${v} (JSON turns it into null)`;\n case 'undefined':\n // An object property that's undefined is simply absent after JSON, which reads the same\n if (inArr) return `${where} is undefined (JSON turns it into null)`;\n continue;\n case 'bigint':\n return `${where} is a BigInt (JSON can't hold it)`;\n case 'symbol':\n return `${where} is a symbol (JSON drops it)`;\n case 'function':\n return `${where} is a function (JSON drops it)`;\n }\n if (v === null) continue;\n const obj = v as object;\n if (onPath.has(obj)) return `${where} refers back to itself (JSON can't hold a cycle)`;\n if (depth >= MAX_SNAPSHOT_DEPTH) return `${shortPath(where)} is nested more than ${MAX_SNAPSHOT_DEPTH} levels deep (too deep to send as JSON reliably)`;\n if (!Array.isArray(obj)) {\n const proto = Object.getPrototypeOf(obj);\n if (proto !== Object.prototype && proto !== null) {\n if (obj instanceof Date) return `${where} is a Date (JSON turns it into a string)`;\n if (obj instanceof Map) return `${where} is a Map (JSON turns it into {})`;\n if (obj instanceof Set) return `${where} is a Set (JSON turns it into {})`;\n return `${where} is ${(obj.constructor?.name && `a ${obj.constructor.name}`) || 'a class instance'} (JSON keeps only its own fields, as a plain object)`;\n }\n }\n onPath.add(obj);\n stack.push({ leave: obj });\n // Children in reverse, so the first problem reported is the first one in reading order\n if (Array.isArray(obj)) {\n for (let i = obj.length - 1; i >= 0; i--) stack.push({ v: obj[i], at: `${where}[${i}]`, inArray: true, depth: depth + 1 });\n } else {\n const keys = Object.keys(obj);\n for (let i = keys.length - 1; i >= 0; i--) {\n const k = keys[i];\n stack.push({ v: (obj as Record<string, unknown>)[k], at: /^[A-Za-z_$][\\w$]*$/.test(k) ? `${where}.${k}` : `${where}[${JSON.stringify(k)}]`, inArray: false, depth: depth + 1 });\n }\n }\n }\n return null;\n}\n\n/** The id of a store's data tag: <script type=\"application/json\" id=\"createstore:<name>\"> */\nconst dataTagId = (name: string) => `createstore:${name}`;\nconst escapeAttr = (s: string) => s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n\n/**\n * A snapshot as text that's safe inside an HTML <script> tag: JSON, with every character that\n * could end the tag or the script escaped. Use it instead of JSON.stringify:\n * `<script>window.__STATE__ = ${serializeSnapshot(scope.snapshot())}</script>`\n */\nexport function serializeSnapshot(snapshot: unknown): string {\n return JSON.stringify(snapshot)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n\n/** No keys outside the state: `keyActions: { nope: ... }` is a type error */\nexport type NoExtraKeys<KA, S> = Exclude<keyof KA, keyof S> extends never ? unknown : { [K in Exclude<keyof KA, keyof S>]: never };\n\nexport type KeyActionsMap<S> = {\n [K in keyof S]?: Record<string, KeyAction<RawOf<S[K]>>>;\n};\n\ntype ActionArgs<F> = F extends (current: never, ...args: infer P) => unknown\n ? P\n : F extends { run: (current: never, ...args: infer P) => unknown }\n ? P\n : never;\n\n/** `{ add: (todos, text: string) => ... }` becomes `{ add: (text: string) => Promise<void> }` */\ntype BoundActions<M> = {\n [N in keyof M]: (...args: ActionArgs<M[N]>) => Promise<void>;\n};\n// Without keyActions, KA is inferred as its bare constraint (an index signature per key): no actions\ntype ActionsFor<KA, K> = K extends keyof KA\n ? string extends keyof NonNullable<KA[K]> ? unknown : BoundActions<NonNullable<KA[K]>>\n : unknown;\n\n/** Store members a state key can't shadow when it's exposed directly as `store.<key>` */\nexport type ReservedName =\n | 'useGlobalState' | 'getState' | 'setState' | 'set' | 'actions'\n | 'undo' | 'redo' | 'goTo' | 'useHistory' | 'subscribe' | 'reset' | 'destroy' | 'hydrated'\n | 'emit' | 'on' | 'fetchQuery' | 'setQueryData' | 'invalidate' | 'whenOnline' | 'batch' | 'abort'\n | 'createScope' | 'Root' | 'hydrate' | 'snapshot';\n\n/** `store.cart.add(...)`: every state key's setter, with its key actions, unless its name is reserved */\nexport type DirectSetters<S, KA> = Omit<SettersOf<S, KA>, ReservedName>;\n\n/** In actions: api.cart.add(...) and api.cart(value), like on the store (minus the api's own names) */\nexport type ApiSetters<S, KA> = Omit<SettersOf<S, KA>, keyof StoreApi<NoKeys>>;\n\n/** `store.set`: the setter (with its actions) of every state key */\ntype SettersOf<S, KA> = {\n [K in keyof S & string as NotPaged<S, K>]: SetValue<RawOf<S[K]>> & ActionsFor<KA, K>;\n};\n\n/** What a status means, in one word: switch on it instead of checking flags in the right order */\nexport type StatusState = 'waiting' | 'loading' | 'error' | 'ready';\n/** The status of a query with whenAborted: 'idle': its first load was cancelled, nothing is running */\nexport interface IdleStatus extends Omit<Status, 'state'> {\n state: StatusState | 'idle';\n}\n/** ...and of a paged one */\nexport interface PagedIdleStatus extends Omit<PagedStatus, 'state'> {\n state: StatusState | 'idle';\n}\n\nexport interface Status {\n /**\n * 'waiting': params not known yet, enabled: false, or a waitFor query isn't ready (no request).\n * 'loading': first load, nothing to show yet. 'error': it failed and there's no data to show.\n * 'ready': there's data (also while refreshing in the background, or after a refresh failed).\n */\n state: StatusState;\n loading: boolean; // first load, no data yet\n fetching: boolean; // any request in progress\n error: unknown; // last error, or null\n /** Waiting, not loading: its params aren't known yet, `enabled` is false, or a `waitFor` query isn't ready */\n blocked: boolean;\n /** The query it's waiting for (through a whole waitFor chain), or null */\n blockedBy: string | null;\n /** Why it's waiting: the error of the query at the start of a waitFor chain that failed, or null */\n rootError: unknown;\n refetch: () => Promise<void>; // does nothing while blocked\n}\n\nexport interface ChangeEvent {\n key: string;\n prev: unknown;\n next: unknown;\n source: 'local' | 'server' | 'remote' | 'history' | 'devtools' | 'storage' | 'hydrate';\n time: number;\n}\n\n/** Default when no `events` option is given: any name, any payload (the old behavior) */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- untyped events accept any payload on purpose\nexport type AnyEvents = Record<string, any>;\n\nexport interface EmitOptions {\n /** Also run the handlers in other tabs (needs `syncTabs: true`). Default: this tab only. */\n broadcast?: boolean;\n}\n\n/** emit's arguments after the name: the payload (optional when it allows undefined or is void), then options */\nexport type EmitArgs<E, K extends keyof E> = undefined extends E[K]\n ? [payload?: E[K], options?: EmitOptions]\n : [payload: E[K], options?: EmitOptions];\n\nexport interface StoreApi<V, E extends object = AnyEvents, W = V> {\n getState<K extends keyof V & string>(key: K): V[K];\n setState<K extends keyof W & string, R = void>(\n key: K,\n value: Updater<W[K]>,\n serverCall?: () => Promise<R> | R\n ): Promise<R>; // resolves with what the save returned\n emit<K extends keyof E & string>(event: K, ...args: EmitArgs<E, K>): void;\n on<K extends keyof E & string>(event: K, handler: (payload: E[K]) => void): () => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- untyped by name; `unknown` would force a cast at every call site\n fetchQuery(name: string, params?: unknown, force?: boolean): Promise<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- same; also lets `(old) => ...` updaters go unannotated\n setQueryData(name: string, updater: any, params?: unknown): void;\n invalidate(name: string): Promise<void>;\n /** Runs the task now, or once back online. Read state inside the task, not before (see below). */\n whenOnline(task: () => Promise<unknown> | unknown): Promise<unknown>;\n batch<T>(fn: () => T): T;\n abort(name: string): void;\n}\n\n/**\n * Where persisted state is kept. localStorage and sessionStorage already fit;\n * adapters for IndexedDB, Capacitor, Electron or React Native AsyncStorage can\n * return Promises.\n */\nexport interface StorageAdapter {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem?(key: string): void | Promise<void>;\n}\n\nexport interface PersistOptions<S = Record<string, unknown>> {\n storage?: 'local' | 'session' | StorageAdapter; // default: 'local'\n keys?: (keyof S)[]; // save only these\n exclude?: (keyof S)[]; // save every plain key except these (e.g. an access token)\n /** Bump when the saved shape changes (default: 0; data saved before versioning counts as 0) */\n version?: number;\n /** Turn data saved by an older version into the current shape. Without it, old data is dropped. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- old data has the shape an older version saved; the user types it\n migrate?: (persisted: any, version: number) => unknown;\n /** Wait this many ms after the last change before saving (typing doesn't write on every key). Flushed when the page is hidden. */\n debounce?: number;\n}\n\nexport interface StoreOptions<S, A, KA = NoKeys, E extends object = AnyEvents> {\n name?: string;\n persist?: boolean | 'local' | 'session' | PersistOptions<S>;\n /** Keep other tabs in sync. `{ keys }` sends only those keys; `{ exclude }` sends everything else (e.g. tokens) */\n syncTabs?: boolean | { keys?: (keyof S & string)[]; exclude?: (keyof S & string)[] };\n history?: boolean | { limit?: number; keys?: (keyof S & string)[] };\n devtools?: boolean;\n /**\n * Reuse one instance per page under `name` (survives hot reload).\n * Never use it on the server: every request would share the same store and\n * leak one user's state to another. For SSR, create the store per request\n * (call createStore inside a function) and pass it down, e.g. via context.\n */\n shared?: boolean;\n /**\n * One store per request, guaranteed. Wrap the app in `<store.Root initialState={...}>`:\n * on the server every render gets its own store; in the browser Root fills the\n * app's store with the same initial state, so hydration matches. Using the store\n * on the server outside a Root or Scope throws instead of sharing data between requests.\n */\n ssr?: boolean | { keys?: (keyof S & string)[]; exclude?: (keyof S & string)[]; version?: number };\n logger?: boolean;\n onChange?: (e: ChangeEvent) => void;\n /**\n * Keep server data and queue saves while offline. `maxSize`: the most characters one saved copy may take\n * (default 2,000,000). Kept in localStorage: queries without params under `<name>:inline`, with params and\n * paged under `<name>:queries`. It holds per-user data until `reset()`, so call that on sign-out.\n */\n offline?: boolean | { maxSize?: number };\n /**\n * Check data the store didn't write itself before using it: saved state, the offline copy and\n * other tabs' changes. Return false (or throw) to ignore that value; the key keeps what it had.\n */\n validate?: (key: string, value: unknown, from: 'storage' | 'offline' | 'remote') => boolean;\n actions?: (api: StoreApi<Values<S>, E, RawValues<S>> & ApiSetters<S, KA>) => A;\n /** Event names and payload types: `events: defineEvents<{ toast: string }>()`. Type-only. */\n events?: E;\n /** Actions per state key, used as `setTodos.add(...)`: `{ todos: { add: (todos, text) => [...] } }` */\n keyActions?: KA;\n /** Called for every keyActions call that has a `save` */\n onSaveStart?: (key: string, action: string) => void;\n onSaveSuccess?: (key: string, action: string) => void;\n onSaveError?: (key: string, action: string, error: unknown) => void;\n}\n\n/* =========================================================================\n Helpers you use inside the initial state\n ========================================================================= */\n\nconst QUERY_OPTIONS = new Set(['select', 'initial', 'staleTime', 'retry', 'retryDelay', 'gcTime', 'refetchAfterMutation', 'whenAborted']);\nconst PAGED_OPTIONS = new Set(['pages', 'staleTime', 'retry', 'retryDelay', 'gcTime', 'whenAborted']);\nconst PAGES_OPTIONS = new Set(['first', 'next', 'max', 'refresh']);\n// Options that exist, but somewhere else: where each one belongs\nconst BELONGS: Record<string, string> = {\n enabled: 'enabled is an option of the hook: useGlobalState(key, params, { enabled }), not of query()',\n first: 'first goes inside pages: query(fetchPage, { pages: { first, next } })',\n next: 'next goes inside pages: query(fetchPage, { pages: { first, next } })',\n max: 'max goes inside pages: query(fetchPage, { pages: { first, next, max } })',\n maxPages: 'maxPages is now pages.max: query(fetchPage, { pages: { first, next, max } })',\n firstPage: 'firstPage is now pages.first: query(fetchPage, { pages: { first, next } })',\n nextPage: 'nextPage is now pages.next: query(fetchPage, { pages: { first, next } })',\n fetch: 'the fetch function is query()\\'s first argument: query(fetch, options)',\n};\n\n/** Throws a clear error for an option in the wrong place or a typo */\nfunction checkQueryOptions(options: Record<string, unknown>) {\n if (!options || typeof options !== 'object') throw new Error(`query(fetch, options): options must be an object.`);\n const wa = options.whenAborted;\n if (wa !== undefined && wa !== 'loading' && wa !== 'idle')\n throw new Error(`query(): whenAborted is 'loading' or 'idle' (or left out, for 'ready'), not ${JSON.stringify(wa)}.`);\n const paged = 'pages' in options;\n for (const k of Object.keys(options)) {\n if ((paged ? PAGED_OPTIONS : QUERY_OPTIONS).has(k)) continue;\n if (paged && QUERY_OPTIONS.has(k))\n throw new Error(`query(): ${k} can't be used with pages. A paged query's value is its list of pages; ${k} is for queries without pages.`);\n throw new Error(`query(): ${BELONGS[k] ?? `there's no option \"${k}\". Options: ${[...(paged ? PAGED_OPTIONS : QUERY_OPTIONS)].join(', ')}`}.`);\n }\n if (paged) {\n const pages = options.pages as Record<string, unknown> | null;\n if (!pages || typeof pages !== 'object') throw new Error(`query(): pages must be an object: { first, next }.`);\n for (const k of Object.keys(pages))\n if (!PAGES_OPTIONS.has(k))\n throw new Error(`query(): pages has no option \"${k}\". Inside pages: first, next, max, refresh${QUERY_OPTIONS.has(k) || PAGED_OPTIONS.has(k) ? ` (${k} goes next to pages, not inside it)` : ''}.`);\n if (!('first' in pages)) throw new Error(`query(): pages needs first, the first request's page (1, or null for a cursor).`);\n if (typeof pages.next !== 'function') throw new Error(`query(): pages.next must be a function: (lastPage, pages, page) => the next page, or undefined at the end.`);\n if (pages.refresh !== undefined && pages.refresh !== 'first' && pages.refresh !== 'loaded')\n throw new Error(`query(): pages.refresh is 'first' (start over, the default) or 'loaded' (refetch as many pages as were loaded), not ${JSON.stringify(pages.refresh)}.`);\n }\n}\n\n/**\n * Data from your server, read like any other key.\n * todos: query(fetchTodos) read as useGlobalState('todos')\n * user: query((id, signal) => fetchUser(id, signal)) read as useGlobalState('user', id)\n * feed: query((page) => fetchFeed(page), { pages: { first: 1, next } })\n * Without params, a query is a state key (undo, persist, key actions, computed values work with it).\n * With params, each params gets its own cached entry. With pages, it's a paged list.\n * Until its first response it holds undefined (typed so), unless you give `initial` (e.g. [] for a list).\n * The AbortSignal is always the argument after params, so a query without params takes a placeholder:\n * sports: query((_: undefined, signal) => fetchSports(signal))\n */\nexport function query<TPage, TParam, P = undefined, A extends WhenAborted | undefined = undefined>(\n fetch: (page: TParam, params: P, signal: AbortSignal) => Promise<TPage>,\n options: PagedQueryOptions<TPage, TParam> & { whenAborted?: A }\n): PagedQueryDef<TPage, TParam, P, A>;\nexport function query<T, R = T, P = undefined, A extends WhenAborted | undefined = undefined>(\n fetch: (params: P, signal: AbortSignal) => Promise<T>,\n options: QueryOptions<T, R> & { initial: T; whenAborted?: A }\n): QueryDef<T, R, P, never, A>;\nexport function query<T, R = T, P = undefined, A extends WhenAborted | undefined = undefined>(\n fetch: (params: P, signal: AbortSignal) => Promise<T>,\n options?: QueryOptions<T, R> & { whenAborted?: A }\n): QueryDef<T, R, P, undefined, A>;\nexport function query(fetch: (...args: never[]) => Promise<unknown>, options: object = {}): unknown {\n if (typeof fetch !== 'function') throw new Error(`query(fetch, options): fetch must be a function that returns a promise.`);\n checkQueryOptions(options as Record<string, unknown>);\n return { __kind: 'pages' in options ? 'pages' : 'query', fetch, options };\n}\n\n/** Throws a clear error for a hook option in the wrong place or a typo */\nfunction checkUseOptions(options: unknown, key: string) {\n if (options === undefined) return;\n if (!options || typeof options !== 'object')\n throw new Error(`useGlobalState(\"${key}\", params, options): options must be an object like { enabled }.`);\n for (const k of Object.keys(options))\n if (k !== 'enabled' && k !== 'waitFor')\n throw new Error(\n `useGlobalState(\"${key}\", params, options): ${QUERY_OPTIONS.has(k) || PAGED_OPTIONS.has(k) ? `${k} is an option of the query: query(fetch, { ${k} }), not of the hook` : `there's no option \"${k}\"; the hook takes { enabled, waitFor }`}.`\n );\n const w = (options as UseOptions).waitFor;\n if (w !== undefined && !(Array.isArray(w) ? w : [w]).every((s) => s && typeof s === 'object' && 'loading' in s && 'blocked' in s))\n throw new Error(\n `useGlobalState(\"${key}\", params, { waitFor }): waitFor takes the status of another query (the third item of its ` +\n `useGlobalState), or a list of them: const [user, , userStatus] = useGlobalState('currentUser'), then { waitFor: userStatus }.`\n );\n}\n\n/**\n * Declares the store's events and their payload types:\n * events: defineEvents<{ toast: string; saved: { id: number } }>()\n * It only carries the type; nothing happens at runtime.\n */\nexport function defineEvents<E extends object>(): E {\n return undefined as unknown as E;\n}\n\n\n/* =========================================================================\n Public entry\n ========================================================================= */\n\ntype L<C> = LayerValues<C>;\ntype AllComputed<C1, C2, C3, C4, C5, C6, C7, C8> = AddedValues<C1> & AddedValues<C2> &\n AddedValues<C3> & AddedValues<C4> & AddedValues<C5> & AddedValues<C6> & AddedValues<C7> &\n AddedValues<C8>;\n\n/**\n * `computed` is a list of layers (up to 8). A layer's functions can read state and every\n * earlier layer, so a value that reads another computed value goes in a later layer.\n */\nexport function createStore<\n S extends object,\n C1 extends ComputedLayer<Values<S>>,\n C2 extends ComputedLayer<Values<S> & L<C1>>,\n C3 extends ComputedLayer<Values<S> & L<C1> & L<C2>>,\n C4 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3>>,\n C5 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3> & L<C4>>,\n C6 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3> & L<C4> & L<C5>>,\n C7 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3> & L<C4> & L<C5> & L<C6>>,\n C8 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3> & L<C4> & L<C5> & L<C6> & L<C7>>,\n KA extends KeyActionsMap<S> & NoExtraKeys<KA, S>,\n A extends Record<string, (...args: never[]) => unknown> = NoKeys,\n E extends object = AnyEvents\n>(\n initialState: S,\n options: StoreOptions<S, A, KA, E> & {\n computed?:\n | [C1]\n | [C1, C2]\n | [C1, C2, C3]\n | [C1, C2, C3, C4]\n | [C1, C2, C3, C4, C5]\n | [C1, C2, C3, C4, C5, C6]\n | [C1, C2, C3, C4, C5, C6, C7]\n | [C1, C2, C3, C4, C5, C6, C7, C8];\n } = {}\n): Store<S, A, KA, AllComputed<C1, C2, C3, C4, C5, C6, C7, C8>, E> &\n ScopeApi<S, Store<S, A, KA, AllComputed<C1, C2, C3, C4, C5, C6, C7, C8>, E>> {\n type CV = AllComputed<C1, C2, C3, C4, C5, C6, C7, C8>;\n if ('queries' in options)\n throw new Error(\n `[${options.name ?? 'store'}] the queries option was replaced: declare each query in the state with ` +\n `query(fetch, options), e.g. { product: query((id, signal) => api.product(id, signal)) }, and read it with useGlobalState('product', id).`\n );\n return withScopes<S, A, KA, CV, E>(initialState, options, makeBase<S, A, KA, CV, E>(initialState, options));\n}\n\n/** The app's own store: shared under its name in the browser when `shared` is set */\nconst warnedSharedOnServer = new Set<string>();\nconst warnedShape = new Set<symbol>();\nconst SHAPE = Symbol('createStore.shape');\n/** What a hot reload can change about a store: its keys, computed values, key actions, options */\nfunction definitionShape(initialState: object, opts: object): string {\n const options = opts as Record<string, unknown>;\n const names = (o: unknown) => (o && typeof o === 'object' ? Object.keys(o).sort().join(',') : '');\n const computed = ((options.computed as Record<string, unknown>[] | undefined) ?? []).map(names).join('|');\n const keyActions = Object.entries((options.keyActions as Record<string, object> | undefined) ?? {}).map(([k, v]) => `${k}:${names(v)}`).sort().join(';');\n return [names(initialState), computed, keyActions, names(options)].join('#');\n}\n\nfunction makeBase<\n S extends object,\n A,\n KA,\n CV,\n E extends object\n>(initialState: S, options: StoreOptions<S, A, KA, E> & { computed?: readonly Record<string, (get: never) => unknown>[] }): Store<S, A, KA, CV, E> {\n if (!options.shared) return build<S, A, KA, CV, E>(initialState, options);\n if (typeof window === 'undefined') {\n // On the server a shared store would be one store for every request (one user's\n // state leaking to another), so `shared` is ignored there: each call gets its own.\n // Said once per store, and not at all with ssr: true (which already gives per-request stores).\n const id = options.name ?? 'store';\n if (!options.ssr && !warnedSharedOnServer.has(id) && warnedSharedOnServer.add(id))\n console.warn(\n `[${options.name ?? 'store'}] shared: true is ignored on the server: each createStore() call gets ` +\n `its own store. Also don't keep per-user data in a module-level store there; create it per request.`\n );\n return build<S, A, KA, CV, E>(initialState, options);\n }\n const slot = Symbol.for(`createStore:${options.name ?? 'store'}`);\n const g = globalThis as unknown as Record<symbol, unknown>;\n // #12: a hot reload that changed the definition gets the old store (that's what `shared` is\n // for), so say so instead of silently using the old keys, computed values and actions\n const shape = definitionShape(initialState, options);\n const existing = g[slot] as (Store<S, A, KA, CV, E> & Record<symbol, string>) | undefined;\n if (existing && existing[SHAPE] !== shape && !warnedShape.has(slot) && warnedShape.add(slot))\n console.warn(\n `[${options.name ?? 'store'}] the store's definition changed (a hot reload?), but shared: true keeps the existing store, ` +\n `with its old keys, computed values and actions. Reload the page to use the new definition.`\n );\n if (existing) return existing;\n const store = build<S, A, KA, CV, E>(initialState, options);\n Object.defineProperty(store, SHAPE, { value: shape });\n return (g[slot] = store) as Store<S, A, KA, CV, E>;\n}\n\n/**\n * What `snapshot()` returns and `hydrate()` takes: plain values of state keys, plus `$queries`,\n * the loaded data of named and infinite queries (by cache entry; treat it as opaque).\n */\nexport type Snapshot<S> = Partial<RawValues<S>> & { $version?: number; $queries?: Record<string, unknown>; $ages?: Record<string, number> };\n\n/**\n * The store in a React Server Component (the server build): every request gets its own store,\n * through React's per-request cache(), so `AppStore.fetchQuery(...)` in a page is that request's.\n * <Root> with no props sends it to the browser. Outside a render (Server Actions, Route Handlers)\n * there's no request store, so it says to use createScope() there.\n */\nfunction serverComponentStore(name: string, named: boolean, createScope: () => unknown): object {\n const requestStore = cache!(() => ({ scope: createScope() as Record<string | symbol, unknown> }));\n const current = (what: string) => {\n const store = requestStore();\n if (store !== requestStore())\n throw new Error(\n `[${name}] ${what} was used outside a Server Component render, so there's no request store to use. ` +\n `In Server Actions and Route Handlers, create one: const scope = createScope(), then scope.fetchQuery(...).`\n );\n return store.scope;\n };\n const clientOnly = (hook: string) => () => {\n throw new Error(`[${name}] ${hook}() only works in Client Components ('use client'). In a Server Component, load the data directly: await fetchQuery(...).`);\n };\n const Root = ({ scope, children }: { scope?: { snapshot: () => unknown }; children?: ReactNode }) => {\n if (!named)\n throw new Error(`[${name}] <Root> in a Server Component needs the store's name, so the browser can find its data: createStore(state, { name: 'shop', ssr: true }).`);\n const store = scope ?? (current('<Root>') as unknown as { snapshot: () => unknown });\n return createElement(ClientRoot as never, { name, snapshot: store.snapshot() }, children);\n };\n const own: Record<string, unknown> = {\n createScope, Root,\n useGlobalState: clientOnly('useGlobalState'), useHistory: clientOnly('useHistory'),\n hydrate: () => {\n throw new Error(`[${name}] hydrate() is for the browser. In a Server Component, load data with fetchQuery(...) and render <Root>.`);\n },\n };\n return new Proxy({}, {\n get(_t, p) {\n if (typeof p !== 'string' || p === 'then') return undefined;\n if (p in own) return own[p];\n return current(`${p}()`)[p]; // the request's store: its methods, setters and key actions\n },\n has: (_t, p) => typeof p === 'string' && (p in own || p in current(`${String(p)}`)),\n });\n}\n\n/** What createStore adds on top of a store, for server rendering */\nexport interface ScopeApi<S, Inst> {\n /**\n * A new, independent store: the same keys, computed values and options, its own state.\n * `initial` replaces initial values (query keys given data count as loaded). This is the\n * request's store on the server. Scopes don't persist, sync tabs, keep an offline cache\n * or connect to devtools.\n */\n createScope(initial?: Partial<RawValues<S>> | Snapshot<S>): Inst;\n /**\n * Browser only: fills the app's store with the snapshot the server sent, once, and returns\n * it for `<Root scope={...}>`. With no argument, reads the data tag the server wrote with\n * scope.toScript(). Keys the store doesn't have are ignored with a warning.\n */\n hydrate(snapshot?: Snapshot<S> | null): Inst;\n /**\n * Components inside use `scope`: `<Root scope={scope}>`. Needs `ssr: true`. In a Server Component,\n * leave `scope` out: <Root> sends the request's store (`await AppStore.fetchQuery(...)` first).\n */\n Root(props: { scope?: Inst; children?: ReactNode }): ReactElement;\n}\n\n// Browser stores already filled from a snapshot (kept across hot reloads: a shared store\n// is the same object every time, and it must not be filled again)\nconst hydratedStores = new WeakSet<object>();\n\n// The store's own hooks, kept before createStore puts routed ones in their place\nconst OWN_HOOKS = Symbol('createStore.ownHooks');\ntype OwnHooks = Record<'useGlobalState' | 'useHistory', (...args: never[]) => unknown>;\n\nfunction withScopes<\n S extends object,\n A,\n KA,\n CV,\n E extends object\n>(\n initialState: S,\n options: StoreOptions<S, A, KA, E> & { computed?: readonly Record<string, (get: never) => unknown>[] },\n base: Store<S, A, KA, CV, E>\n): Store<S, A, KA, CV, E> & ScopeApi<S, Store<S, A, KA, CV, E>> {\n type Inst = Store<S, A, KA, CV, E>;\n const name = options.name ?? 'store';\n const onServer = () => typeof window === 'undefined';\n const guard = !!options.ssr;\n // React's server build has no createContext; the Server Component path below never uses Ctx\n const Ctx = (RSC ? null : createContext<Inst | null>(null)) as ReturnType<typeof createContext<Inst | null>>;\n const seedOf = (inst: Inst) => (inst as unknown as Record<symbol, (v: Record<string, unknown>) => void>)[SEED];\n const b = base as unknown as Record<string | symbol, unknown>;\n // A shared store is wrapped again after hot reloading: keep its original hooks from the first time\n const own = (b[OWN_HOOKS] ??= {\n useGlobalState: b.useGlobalState, useHistory: b.useHistory,\n }) as OwnHooks;\n const stateKeys = new Set([...Object.keys(initialState), '$queries', '$ages', '$version']);\n const ssrVersion = (options.ssr && typeof options.ssr === 'object' && options.ssr.version) || 0;\n\n // The stores a <Root> may provide: this store and its own scopes, not another store's\n const ownScopes = new WeakSet<object>([base]);\n const createScope = (initial?: Partial<RawValues<S>> | Snapshot<S>): Inst => {\n const scope = build<S, A, KA, CV, E>(initialState, {\n ...options, shared: false, persist: false, syncTabs: false, offline: false, devtools: false,\n ...({ [APP_PERSIST]: (options as Record<symbol, unknown>)[APP_PERSIST] ?? options.persist } as object), // what the app saves: kept out of snapshots\n }, (base as unknown as Record<symbol, Definition>)[DEFINITION]);\n if (initial) seedOf(scope)(initial as Record<string, unknown>);\n ownScopes.add(scope);\n return scope;\n };\n\n // The data tag scope.toScript() wrote, read once and removed (null if there isn't one)\n const readDataTag = (): Snapshot<S> | null => {\n if (!options.name) {\n console.warn(`[${name}] hydrate() with no argument needs the store's name to find its data tag: createStore(state, { name: 'shop', ssr: true }).`);\n return null;\n }\n // Only a <script type=\"application/json\"> is data, and of those the LAST one: the server writes\n // toScript() after the page's content, so an element in that content carrying the same id (user\n // HTML like a profile bio: sanitizers keep ids on divs) can never be read as server data.\n const id = dataTagId(name);\n const tags = Array.from(document.getElementsByTagName('script')).filter((s) => s.id === id && s.type === 'application/json');\n const el = tags[tags.length - 1];\n const others = document.querySelectorAll(`[id=\"${id.replace(/\"/g, '\\\\\"')}\"]`).length - (el ? 1 : 0);\n if (others > 0)\n console.warn(`[${name}] hydrate() found ${others} other element(s) with the data tag's id \"${id}\" and ignored them: only the last <script type=\"application/json\"> (the one toScript() writes after the page) is read. If the page shows user-written HTML, that's where they came from.`);\n if (!el) {\n console.warn(`[${name}] hydrate() found no data tag (id \"${dataTagId(name)}\"), so the app starts from its initial state. Did the server add scope.toScript() to the page?`);\n return null;\n }\n el.remove();\n try {\n return JSON.parse(el.textContent ?? 'null') as Snapshot<S> | null;\n } catch {\n console.warn(`[${name}] hydrate() couldn't read the data tag (not valid JSON), so the app starts from its initial state.`);\n return null;\n }\n };\n const hydrate = (...args: [(Snapshot<S> | null)?]): Inst => {\n let snapshot = args[0];\n if (onServer())\n throw new Error(`[${name}] hydrate() is for the browser. On the server, create the request's store with createScope(...).`);\n // The browser has one store. Fill it once: like useState's initial value, a later call (a\n // remount, StrictMode's second render, hot reload) doesn't overwrite what changed since.\n if (!hydratedStores.has(base)) {\n hydratedStores.add(base);\n if (args.length === 0) snapshot = readDataTag(); // hydrate(): the data the server put in the page\n // A snapshot made for another state shape (an old cached page after a deployment) is\n // ignored rather than seeded: React then renders this page fresh in the browser.\n const given = snapshot && typeof snapshot === 'object' ? ((snapshot as { $version?: unknown }).$version ?? 0) : ssrVersion;\n if (given !== ssrVersion) {\n console.warn(`[${name}] hydrate() ignored a snapshot made for version ${String(given)}; this app expects version ${ssrVersion} (ssr.version). The page renders from the initial state instead.`);\n return base;\n }\n if (snapshot && typeof snapshot === 'object') {\n const known: Record<string, unknown> = {};\n const notInStore: string[] = [];\n for (const [k, v] of Object.entries(snapshot)) {\n if (stateKeys.has(k)) known[k] = v;\n else notInStore.push(k);\n }\n // A snapshot can come from an older deployment: a removed key shouldn't break the page\n if (notInStore.length)\n console.warn(`[${name}] hydrate() ignored ${notInStore.map((k) => `\"${k}\"`).join(', ')}: not in the store. Was the snapshot made by another version of the app?`);\n seedOf(base)(known);\n }\n }\n return base;\n };\n\n let warnedNested = false;\n // Snapshots from Server Components already applied: the first fills the store (hydrate), later\n // ones (client-side navigation) only add server data, so nothing the user changed is overwritten\n const appliedSnapshots = new WeakSet<object>();\n const fromServer = (snapshot: unknown) => {\n if (!snapshot || typeof snapshot !== 'object' || appliedSnapshots.has(snapshot)) return;\n appliedSnapshots.add(snapshot);\n if (!hydratedStores.has(base)) {\n hydrate(snapshot as Snapshot<S>);\n return;\n }\n const snap = snapshot as Record<string, unknown>;\n if ((snap.$version ?? 0) !== ssrVersion) return; // another version's data: not merged\n const queryDefs = (b[DEFINITION] as Definition | undefined)?.queryDefs ?? {};\n const serverData: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(snap)) if (k === '$queries' || k === '$ages' || k in queryDefs) serverData[k] = v;\n seedOf(base)(serverData);\n };\n b[MERGE] = fromServer;\n const withHeldNotify = (fn: () => void) => ((b[QUIET] as ((f: () => void) => void) | undefined) ?? ((f: () => void) => f()))(fn);\n if (options.name && !onServer()) storesByName.set(name, base);\n\n const Root = ({ scope, children }: { scope?: Inst; children?: ReactNode }) => {\n const parent = useContext(Ctx);\n // Nesting a Root with its own createScope() in the browser is how part of a page gets an\n // isolated store. These two are mistakes: two request stores in one server render, and the\n // browser's app store under another Root.\n if (parent && scope && !warnedNested && (onServer() || scope === base)) {\n warnedNested = true;\n console.warn(\n onServer()\n ? `[${name}] <Root> is nested inside another <Root> during server rendering, so part of the page uses a ` +\n `different store than the request's. Render <Root scope={...}> once, at the top of the app.`\n : `[${name}] the app's store (from hydrate()) is given to a <Root> nested inside another <Root>. ` +\n `Render <Root scope={hydrate(snapshot)}> once, at the top of the app.`\n );\n }\n if (!scope)\n throw new Error(\n `[${name}] <Root> needs a scope here: <Root scope={createScope(...)}> on the server, <Root scope={hydrate(snapshot)}> in the browser. ` +\n `(Only in a Server Component can <Root> go without one: there it sends the request's store.)`\n );\n if (!ownScopes.has(scope))\n throw new Error(`[${name}] <Root> got a scope made by a different store. Pass ${name === 'store' ? 'this store' : name}'s own: createScope() or hydrate() of the same store whose hooks the components use.`);\n return createElement(Ctx.Provider, { value: scope }, children);\n };\n\n // Hooks use the nearest Root, else the app's store. Plain parameters, no spreading:\n // these run on every render of every component.\n const useInstance = (hook: string): Inst | null => {\n const scoped = useContext(Ctx);\n const pending = useContext(__SnapshotContext); // a Server Component's <Root>, if any (always read: same hooks every render)\n if (scoped) return scoped !== base ? scoped : null;\n const mine = pending?.[name];\n if (mine) {\n if (onServer()) {\n // Next.js rendering Client Components for one request: a store for this request, from its snapshot\n return (mine.scope ??= createScope(mine.snapshot as Partial<RawValues<S>>)) as Inst;\n }\n // The browser: fill the app's store (the first snapshot) or add a later page's server data.\n // It must be there for this render (hydration compares with the server HTML), but other\n // components mustn't be updated while this one renders: so write now, notify right after.\n withHeldNotify(() => fromServer(mine.snapshot));\n return null;\n }\n if (guard && onServer())\n throw new Error(\n `[${name}] ${hook}() ran during server rendering outside <Root>. On the server every request needs its own ` +\n `store: render the app inside <Root scope={createScope(...)}>.`\n );\n return null; // the app's store: call its own hook directly\n };\n type H = (a?: never, b?: never, c?: never) => unknown;\n const scopedHook = (inst: Inst, hook: string) => (inst as unknown as Record<string, H>)[hook];\n function useGlobalState(a?: never, c?: never, d?: never) {\n const inst = useInstance('useGlobalState');\n const hook = inst ? scopedHook(inst, 'useGlobalState') : (own.useGlobalState as H);\n // Forward exactly what was passed: useGlobalState(key, undefined) means \"params not known yet\"\n // (arguments.length, not a rest array: that would be allocated on every render)\n const n = arguments.length;\n return n === 1 ? hook(a) : n === 2 ? hook(a, c) : hook(a, c, d);\n }\n function useHistory() {\n const inst = useInstance('useHistory');\n return inst ? scopedHook(inst, 'useHistory')() : (own.useHistory as H)();\n }\n const added: Record<string, unknown> = { useGlobalState, useHistory, createScope, hydrate, Root };\n if (RSC) return serverComponentStore(name, options.name !== undefined, createScope) as Inst & ScopeApi<S, Inst>;\n\n if (!guard) {\n // Without ssr: true, nothing reads a context: hooks stay the store's own, so apps that don't\n // server-render pay nothing for scopes. createScope() works here too; Root and hydrate\n // need ssr: true, because only then do hooks look for a Root.\n const needsSsr = (what: string) => () => {\n throw new Error(`[${name}] ${what} needs ssr: true in createStore's options: only then do hooks look for a Root.`);\n };\n b.createScope = createScope;\n b.Root = needsSsr('<Root>');\n b.hydrate = needsSsr('hydrate()');\n return base as Inst & ScopeApi<S, Inst>;\n }\n if (!onServer()) {\n // In the browser the store itself carries the routed hooks and the scope API. It stays\n // the same object, so shared stores are still identical across createStore calls.\n for (const [k, v] of Object.entries(added)) b[k] = v;\n return base as Inst & ScopeApi<S, Inst>;\n }\n\n // On the server with ssr: true, the app's store must not be used: one store would serve every\n // request. Its members are handed out as traps that throw when called, so module-level code\n // like `const { actions } = store` still loads; only a real call throws.\n const trap = (path: string): unknown =>\n new Proxy(function () {}, {\n get: (_t, p) => (p === 'then' || typeof p === 'symbol' ? undefined : trap(`${path}.${String(p)}`)),\n apply: () => {\n throw new Error(\n `[${name}] Cannot call ${path}() during server rendering: on the server every request has its own store, ` +\n `and this call can't tell which one it's for. Use the request's scope instead: scope.${path}(...), ` +\n `with const scope = createScope(...).`\n );\n },\n });\n return new Proxy(base, {\n get(target, p, receiver) {\n if (typeof p === 'string') {\n if (p in added) return added[p];\n if (p in target) return trap(p);\n }\n return Reflect.get(target, p, receiver);\n },\n }) as Inst & ScopeApi<S, Inst>;\n}\n\nexport type Store<\n S extends object,\n A,\n KA = NoKeys,\n CV = NoKeys,\n E extends object = AnyEvents\n> = ReturnType<typeof build<S, A, KA, CV, E>>;\n\n/* =========================================================================\n Implementation\n ========================================================================= */\n\n/** Internal: how createScope and Root give a store its initial state */\nconst SEED = Symbol('createStore.seed');\nconst RESERVED_EXTRAS = new Set(['createScope', 'Root', 'hydrate']);\nconst warnedReserved = new Set<string>();\n\n/** Waits ms, or rejects as soon as the signal aborts */\nconst sleep = (ms: number, signal: AbortSignal) =>\n new Promise<void>((resolve, reject) => {\n if (signal.aborted) return reject(signal.reason);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal.reason);\n };\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal.addEventListener('abort', onAbort, { once: true });\n });\nconst isThenable = (v: unknown): v is PromiseLike<unknown> =>\n v != null && typeof (v as { then?: unknown }).then === 'function';\n\n/* ---------- Stable keys for query params ---------- */\n\nconst MAX_KEY_DEPTH = 100;\n// Params past these limits throw instead of costing CPU on every render and request\nconst MAX_KEY_VALUES = 10_000;\nconst MAX_KEY_CHARS = 1_000_000;\nlet keyValues = 0;\nlet keyChars = 0;\nconst UNSUPPORTED_TAGS = new Set([\n '[object WeakMap]', '[object WeakSet]', '[object WeakRef]', '[object Promise]',\n '[object Generator]', '[object AsyncGenerator]', '[object URLSearchParams]',\n]);\n\n/**\n * Turns query params into a string, so that:\n * - equal params always give the same string, whatever the property order\n * (and Map/Set insertion order), and\n * - different params never give the same string.\n * JSON.stringify can't promise the second part: it turns every Map and Set\n * into {}, NaN and Infinity into null, and throws on BigInt and cycles.\n * Values that can't be keyed reliably (functions, symbols, WeakMap, Promise...)\n * throw a clear error instead of silently sharing an entry.\n */\nfunction stableKey(value: unknown): string {\n keyValues = 0;\n keyChars = 0;\n return keyOf(value, [], 0);\n}\n// keyOf's \"too many values\" error (keyOf is a function declaration further down)\nkeyOf.tooLarge = (): never => {\n throw new Error(`Query params are too large (more than ${MAX_KEY_VALUES.toLocaleString('en')} values) to use as a cache key. Pass an id or a small filter object instead.`);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- inspects arbitrary values (Map, Date, boxed...)\nfunction keyOf(v: any, ancestors: object[], depth: number): string {\n if (++keyValues > MAX_KEY_VALUES)\n throw new Error(`Query params are too large (more than ${MAX_KEY_VALUES.toLocaleString('en')} values) to use as a cache key. Pass an id or a small filter object instead.`);\n switch (typeof v) {\n case 'string':\n if ((keyChars += v.length) > MAX_KEY_CHARS)\n throw new Error(`Query params are too large (more than ${MAX_KEY_CHARS.toLocaleString('en')} characters) to use as a cache key. Pass an id or a small filter object instead.`);\n return JSON.stringify(v);\n case 'number': return Object.is(v, -0) ? '-0' : String(v); // also \"NaN\", \"Infinity\", \"-Infinity\"\n case 'boolean': return v ? 'true' : 'false';\n case 'bigint': return `${v}n`;\n case 'undefined': return 'undefined';\n case 'symbol': throw new Error(`Query params can't contain a symbol (${String(v)}).`);\n case 'function': throw new Error(`Query params can't contain a function, so they can't be used as a cache key.`);\n }\n if (v === null) return 'null';\n if (depth >= MAX_KEY_DEPTH)\n throw new Error(`Query params are nested too deeply (more than ${MAX_KEY_DEPTH} levels) to use as a cache key.`);\n if (ancestors.includes(v)) throw new Error(`Query params contain a circular reference, so they can't be used as a cache key.`);\n\n const isArray = Array.isArray(v);\n const proto = isArray ? Array.prototype : Object.getPrototypeOf(v);\n const plain = proto === Object.prototype || proto === null;\n\n // Plain objects and arrays (nearly all params) skip the checks for special types\n let tag = '[object Object]';\n if (!isArray && !plain) {\n tag = Object.prototype.toString.call(v);\n if (UNSUPPORTED_TAGS.has(tag)) throw new Error(`A ${tag.slice(8, -1)} can't be used in query params.`);\n if (v instanceof Date) return `#Date(${v.getTime()})`; // NaN for an invalid date\n if (v instanceof RegExp) return `#RegExp(${String(v)})`;\n if (v instanceof Error) return `#Error(${JSON.stringify(v.name)},${JSON.stringify(v.message)})`;\n if (tag === '[object Number]' || tag === '[object String]' || tag === '[object Boolean]' || tag === '[object BigInt]')\n return `#Boxed(${keyOf(v.valueOf(), ancestors, depth + 1)})`;\n if (v instanceof ArrayBuffer) return `#ArrayBuffer(${Array.from(new Uint8Array(v)).join(',')})`;\n if (ArrayBuffer.isView(v))\n return `#${v.constructor?.name ?? 'View'}(${Array.from(new Uint8Array(v.buffer, v.byteOffset, v.byteLength)).join(',')})`;\n }\n\n ancestors.push(v);\n try {\n const next = depth + 1;\n if (isArray) {\n if (keyValues + v.length > MAX_KEY_VALUES) keyOf.tooLarge();\n const parts: string[] = [];\n for (let i = 0; i < v.length; i++) parts.push(keyOf(v[i], ancestors, next)); // holes count as undefined\n return `[${parts.join(',')}]`;\n }\n if (!plain) {\n if (v instanceof Map) {\n const parts = [...v].map(([k, val]) => `${keyOf(k, ancestors, next)}=>${keyOf(val, ancestors, next)}`).sort();\n return `#Map{${parts.join(',')}}`;\n }\n if (v instanceof Set) return `#Set{${[...v].map((x) => keyOf(x, ancestors, next)).sort().join(',')}}`;\n if (tag !== '[object Object]') throw new Error(`A ${tag.slice(8, -1)} can't be used in query params.`);\n }\n if (typeof v.toJSON === 'function') return `#toJSON(${keyOf(v.toJSON(), ancestors, next)})`;\n\n const keys = Object.keys(v);\n if (keyValues + keys.length > MAX_KEY_VALUES) keyOf.tooLarge(); // before sorting thousands of keys\n if (keys.length > 1) keys.sort();\n let out = '';\n for (const k of keys) {\n const item = v[k];\n if (item !== undefined) out += `${out ? ',' : ''}${JSON.stringify(k)}:${keyOf(item, ancestors, next)}`; // undefined = absent, like JSON\n }\n const prefix = plain ? '' : v.constructor?.name || '<anonymous>';\n return `${prefix}{${out}}`;\n } finally {\n ancestors.pop();\n }\n}\n\nasync function withRetry<T>(\n fn: (params: unknown, signal: AbortSignal) => Promise<T>,\n params: unknown,\n retries: number,\n signal: AbortSignal,\n retryDelay?: RetryDelay\n): Promise<T> {\n const delayOf = typeof retryDelay === 'function' ? retryDelay : defaultRetryDelay;\n for (let attempt = 0; ; attempt++) {\n try {\n const data = await fn(params, signal);\n if (signal.aborted) throw signal.reason; // a fetch that ignored the signal\n return data;\n } catch (e) {\n if (attempt >= retries || signal.aborted) throw e;\n await sleep(delayOf(attempt + 1), signal);\n }\n }\n}\n\n/**\n * What a store's declared state works out to: its keys, queries and initial values, and the\n * prototypes that hold its setters. It only depends on the object passed to createStore, so it's\n * computed once and shared by every scope (a server creates one per request).\n */\ninterface Definition {\n source: Record<string, unknown>; // what the object held when this was worked out\n keys: string[];\n values: Record<string, unknown>; // the declared initial values; never changed\n queryDefs: Record<string, QueryDef<unknown>>;\n namedDefs: Record<string, QueryConfig | AnyInfinite>;\n pagedKeys: Set<string>;\n setProto: object; // store.set.<key>: a getter per key, shared, that asks the store it's read on\n directProto: object | null; // store.<key>: the same, minus names the store itself uses (made on first use)\n apiProto: object | null; // api.<key> in actions\n}\nconst SETTER_OF = Symbol('createStore.setterOf');\nconst DEFINITION = Symbol('createStore.definition');\n/** Same keys, same values (by identity): no allocation beyond the key list */\nfunction sameEntries(a: Record<string, unknown>, b: object): boolean {\n const keys = Object.keys(b);\n if (keys.length !== Object.keys(a).length) return false;\n for (const k of keys) if (!(k in a) || !Object.is(a[k], (b as Record<string, unknown>)[k])) return false;\n return true;\n}\nconst definitions = new WeakMap<object, Definition>();\n\nfunction definitionOf(initialState: object, name: string): Definition {\n const known = definitions.get(initialState);\n if (known && sameEntries(known.source, initialState)) return known;\n for (const key of Object.keys(initialState)) {\n if (key === '$version' || key === '$queries' || key === '$ages')\n throw new Error(`[${name}] \"${key}\" can't be a state key: server-rendering snapshots use that name. Rename the key.`);\n if (key.startsWith('\\u0000')) throw new Error(`[${name}] state keys can't start with \\\\u0000 (the store uses those names internally).`);\n }\n // Objects without a prototype, so names like \"toString\" or \"constructor\" are never mistaken for keys\n const queryDefs: Record<string, QueryDef<unknown>> = Object.create(null);\n // Every query() is also a named query (one cache entry per params); paged ones only that\n const namedDefs: Record<string, QueryConfig | AnyInfinite> = Object.create(null);\n const values: Record<string, unknown> = Object.create(null);\n for (const [key, def] of Object.entries(initialState) as [string, unknown][]) {\n const kind = (def as { __kind?: unknown } | null)?.__kind;\n if (kind === 'query') {\n const q = def as QueryDef<unknown>;\n queryDefs[key] = q;\n values[key] = 'initial' in q.options ? q.options.initial : undefined; // nothing yet, like a query with params\n const o = q.options;\n namedDefs[key] = { fetch: (params: unknown, signal: AbortSignal) => q.fetch(params, signal), whenAborted: o.whenAborted, staleTime: o.staleTime, retry: o.retry, retryDelay: o.retryDelay, gcTime: o.gcTime };\n } else if (kind === 'pages') {\n const q = def as PagedQueryDef<unknown, unknown>;\n const o = q.options;\n namedDefs[key] = {\n __kind: 'infinite', firstPage: o.pages.first,\n fetch: (page: unknown, signal: AbortSignal, params: unknown) => q.fetch(page, params, signal),\n nextPage: o.pages.next as AnyInfinite['nextPage'], maxPages: o.pages.max, refresh: o.pages.refresh, whenAborted: o.whenAborted, staleTime: o.staleTime, retry: o.retry, retryDelay: o.retryDelay, gcTime: o.gcTime,\n } as unknown as AnyInfinite;\n } else {\n values[key] = def;\n }\n }\n const keys = Object.keys(values);\n const setProto = Object.create(null);\n for (const k of keys)\n Object.defineProperty(setProto, k, {\n enumerable: true,\n get(this: Record<symbol, (key: string) => unknown>) {\n return this[SETTER_OF](k);\n },\n });\n const definition: Definition = {\n source: { ...initialState } as Record<string, unknown>,\n keys, values, queryDefs, namedDefs,\n pagedKeys: new Set(Object.keys(namedDefs).filter((k) => '__kind' in namedDefs[k])),\n setProto, directProto: null, apiProto: null,\n };\n definitions.set(initialState, definition);\n return definition;\n}\n\nconst API_NAMES = { getState: 1, setState: 1, emit: 1, on: 1, fetchQuery: 1, setQueryData: 1, invalidate: 1, whenOnline: 1, batch: 1, abort: 1 };\n/** api.<key> in actions: the same shared getters, minus the api's own names (the store already warned) */\nfunction setterProtoOf(def: Definition, memberNames: object, field: 'apiProto'): object {\n const known = def[field];\n if (known) return known;\n const proto = {};\n for (const k of def.keys) {\n if (k in memberNames || k in Object.prototype) continue;\n Object.defineProperty(proto, k, {\n enumerable: true,\n get(this: Record<symbol, (key: string) => unknown>) {\n return this[SETTER_OF](k);\n },\n });\n }\n return (def[field] = proto);\n}\n\n/** store.<key>: the setter getters, without the names the store itself uses (warned about once) */\nfunction directProtoOf(def: Definition, memberNames: object, name: string): object {\n if (def.directProto) return def.directProto;\n const proto = {};\n for (const k of def.keys) {\n if (k in memberNames || k in Object.prototype || RESERVED_EXTRAS.has(k)) {\n if (!warnedReserved.has(`${name}:${k}`)) {\n warnedReserved.add(`${name}:${k}`);\n console.warn(`[${name}] \"${k}\" is also the name of a store method, so it isn't available as store.${k}. Use store.set.${k}(...) instead.`);\n }\n continue;\n }\n Object.defineProperty(proto, k, {\n enumerable: true,\n get(this: Record<symbol, (key: string) => unknown>) {\n return this[SETTER_OF](k);\n },\n });\n }\n return (def.directProto = proto);\n}\n\nfunction build<\n S extends object,\n A,\n KA,\n CV,\n E extends object = AnyEvents\n>(\n initialState: S,\n options: StoreOptions<S, A, KA, E> & {\n computed?: readonly Record<string, (get: never) => unknown>[];\n },\n sharedDefinition?: Definition // a scope passes its store's: the same definition by design\n) {\n type SV = Values<S>; // state values\n type RV = RawValues<S>; // what setters write (the raw data for a query with select)\n type V = SV & CV; // state and computed values\n type Key = keyof V & string;\n type StateKey = keyof S & string;\n const name = options.name ?? 'store';\n const isBrowser = typeof window !== 'undefined';\n\n /* ---------- Sort keys into plain, query and computed ---------- */\n\n // Worked out once per store, shared by its scopes\n const def = sharedDefinition ?? definitionOf(initialState, name);\n const queryDefs = def.queryDefs;\n const namedDefs = def.namedDefs;\n const computedDefs: Record<string, (get: never) => unknown> = Object.create(null);\n // This store's initial values: the declared ones, plus what hydrate() or createScope() fill in\n // (own properties). Inheriting means a scope doesn't copy every declared value.\n const initialValues: Record<string, unknown> = Object.create(def.values);\n const pagedKeys = def.pagedKeys;\n const isPaged = (k: string) => pagedKeys.has(k); // runs on every render: one set lookup\n // What reset() goes back to: the values declared in createStore, never changed\n const declaredValues = def.values;\n // Layers only matter for typing; at runtime dependencies are tracked per key\n for (const layer of options.computed ?? []) {\n for (const [key, read] of Object.entries(layer)) {\n if (key in initialValues || key in computedDefs)\n throw new Error(`computed \"${key}\" is defined twice (as a state key or in two layers).`);\n if (typeof read !== 'function')\n throw new Error(`computed \"${key}\" must be a function, e.g. ${key}: (get) => ...`);\n computedDefs[key] = read;\n }\n }\n const isQuery = (k: string) => typeof k === 'string' && k in queryDefs;\n const isComputed = (k: string) => typeof k === 'string' && k in computedDefs;\n // The same keys as initialValues, without walking its prototype chain (this runs on every read)\n const stateKeySet = def.values;\n const isStateKey = (k: string) => typeof k === 'string' && k in stateKeySet;\n const hasKey = (k: string) => isStateKey(k) || isComputed(k);\n // Built once: the keys never change after the store is created\n const STATE_KEYS = def.keys; // the same list for every scope (initialValues only holds overrides)\n const ALL_KEYS = [...STATE_KEYS, ...Object.keys(computedDefs)];\n const allKeys = () => ALL_KEYS;\n\n /* ---------- The state reader used by selectors and computed functions ---------- */\n\n // Names that libraries, devtools and console.log probe on objects.\n // Reading them returns undefined without a warning.\n const PROBES = new Set([\n 'then', 'toJSON', 'constructor', '$$typeof', 'valueOf', 'toString',\n 'inspect', 'nodeType', 'tagName', 'asymmetricMatch', 'prototype',\n ]);\n const warned = new Set<string>();\n const readers = new WeakSet<object>();\n const rejectReader = (value: unknown, where: string) => {\n if (typeof value === 'function' && readers.has(value as object))\n throw new Error(\n `${where} returns the state itself. Return the values you need instead, e.g. ({ todos }) => todos.`\n );\n };\n\n /**\n * Builds the value a selector or computed function receives. It is a function\n * (so get('todos') works) wrapped in a Proxy (so state.todos and\n * ({ todos }) => ... work). Every key read is passed to `track`.\n */\n function makeReader(\n read: (key: string) => unknown,\n track: (key: string) => void,\n where: string\n ): unknown {\n const get = (key: string) => {\n if (!hasKey(key))\n throw new Error(\n isPaged(key)\n ? `${where} reads \"${key}\", a paged query: pages aren't state, so read them with useGlobalState('${key}').`\n : `${where} reads \"${key}\", which is not in the store.`\n );\n track(key);\n return read(key);\n };\n const readOnly = () => {\n throw new Error(\n `State is read-only inside ${where}. Use setState() or a setter from useGlobalState() instead.`\n );\n };\n const proxy = new Proxy(get, {\n apply: (_t, _this, args) => get(args[0]),\n get: (_t, key) => {\n if (typeof key !== 'string') return undefined;\n if (hasKey(key)) {\n track(key);\n return read(key);\n }\n if (!PROBES.has(key) && !warned.has(key)) {\n warned.add(key);\n console.warn(`[${name}] ${where} reads \"${key}\", which is not in the store.`);\n }\n return undefined;\n },\n has: (_t, key) => typeof key === 'string' && hasKey(key),\n ownKeys: () => {\n // {...state} or Object.keys(state) reads (and tracks) every key\n const keys = allKeys();\n keys.forEach(track);\n return keys.slice(); // a copy: callers must not be able to change the store's list\n },\n getOwnPropertyDescriptor: (_t, key) =>\n typeof key === 'string' && hasKey(key)\n ? { enumerable: true, configurable: true, writable: false, value: get(key) }\n : undefined,\n set: readOnly,\n deleteProperty: readOnly,\n defineProperty: readOnly,\n });\n readers.add(proxy);\n return proxy;\n }\n\n /** Same top-level values? Used so `state => ({ a, b })` doesn't re-render needlessly. */\n function shallowEqual(a: unknown, b: unknown) {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || !a || !b) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) return false;\n const ra = a as Record<string, unknown>;\n const rb = b as Record<string, unknown>;\n const ka = Object.keys(ra);\n const kb = Object.keys(rb);\n return ka.length === kb.length && ka.every((k) => Object.is(ra[k], rb[k]));\n }\n\n // Holds plain and query values. Computed values live in computedCache.\n const state: Record<string, unknown> = { ...def.values };\n\n /* ---------- Subscriptions (one channel per key) ---------- */\n\n const listeners = new Map<string, Set<() => void>>();\n const subscribers = new Map<string, (cb: () => void) => () => void>();\n // While `holdNotify`, notifications wait for a microtask (writes made during a render: #1)\n let holdNotify = 0;\n const held = new Set<string>();\n const heldEvents: (() => void)[] = []; // change events for subscribe/onChange/logger, delivered after the render\n const notify = (channel: string) => {\n if (holdNotify > 0) {\n held.add(channel);\n return;\n }\n listeners.get(channel)?.forEach((cb) => cb());\n };\n const hasListeners = (channel: string) =>\n (listeners.get(channel)?.size ?? 0) > 0;\n const subscribeTo = (channel: string) => {\n if (!subscribers.has(channel)) {\n subscribers.set(channel, (cb) => {\n if (!listeners.has(channel)) listeners.set(channel, new Set());\n listeners.get(channel)!.add(cb);\n return () => {\n const set = listeners.get(channel);\n set?.delete(cb);\n if (set && set.size === 0) listeners.delete(channel);\n };\n });\n }\n return subscribers.get(channel)!;\n };\n const noSubscribe = () => () => {};\n\n /* ---------- Computed engine ---------- */\n\n interface ComputedEntry {\n value: unknown; // FAILED when it threw: `error` holds what it threw\n deps: Set<string>;\n dirty: boolean;\n error?: unknown;\n }\n const computedCache = new Map<string, ComputedEntry>();\n const computedReaders = new Map<string, { holder: { deps: Set<string> | null }; reader: unknown }>();\n const NO_VALUE = Symbol('no value');\n const FAILED = Symbol('failed');\n const THREW = Symbol('threw');\n const dependents = new Map<string, Set<string>>(); // key -> computed keys that read it\n // Keys components show, and the queries those keys read (directly or through computed values)\n const roots = new Map<string, number>(); // key -> how many components show it\n let rootQueries = new Set<string>();\n // Computed keys whose dependencies changed, handled after the current render/update\n let relinked = new Set<string>();\n let relinkScheduled = false;\n const evaluating: string[] = []; // the chain of computed keys being calculated right now\n\n /** \"a → b → c → a\", shortened in the middle for very long loops */\n const describeLoop = (chain: string[], key: string) => {\n const loop = [...chain.slice(chain.indexOf(key)), key];\n const shown = loop.length > 12 ? [...loop.slice(0, 6), '…', ...loop.slice(-3)] : loop;\n return `${shown.join(' → ')}${loop.length > 12 ? ` (${loop.length - 1} keys)` : ''}`;\n };\n\n function readKey(key: string): unknown {\n return isComputed(key) ? readComputed(key) : readState(key);\n }\n\n // query(fn, { select }): state keeps the raw data; reads see select(raw),\n // recalculated only when the raw data changes\n const selectMemo = new Map<string, { raw: unknown; out: unknown }>();\n function readState(key: string): unknown {\n const select = queryDefs[key]?.options.select;\n const raw = state[key];\n if (!select || raw === undefined) return raw; // select isn't run on \"nothing loaded yet\" \n const m = selectMemo.get(key);\n if (m && Object.is(m.raw, raw)) return m.out;\n const out = select(raw);\n selectMemo.set(key, { raw, out });\n return out;\n }\n\n function readComputed(key: string): unknown {\n const entry = computedCache.get(key);\n if (!entry || entry.dirty) return evaluate(key);\n if (entry.value === FAILED) throw entry.error; // same inputs, same error: don't run it again\n return entry.value;\n }\n\n /** Save a computed result, re-linking dependencies only if they changed. */\n function storeComputed(key: string, value: unknown, deps: Set<string>, dirty: boolean) {\n const entry = computedCache.get(key);\n const old = entry?.deps;\n let same = !!old && old.size === deps.size;\n if (same) for (const d of deps) if (!old!.has(d)) { same = false; break; }\n if (!same) {\n // Its status depends on which keys it reads; so do the statuses that include it\n if (old) onRelink(key);\n else computedStatusCache.delete(key);\n if (old)\n for (const d of old) {\n const set = dependents.get(d);\n if (!set) continue;\n set.delete(key);\n if (set.size === 0) dependents.delete(d); // don't keep empty sets around\n }\n for (const d of deps) {\n let set = dependents.get(d);\n if (!set) dependents.set(d, (set = new Set()));\n set.add(key);\n }\n }\n if (entry) {\n entry.value = value;\n entry.deps = same ? old! : deps;\n entry.dirty = dirty;\n entry.error = undefined;\n } else computedCache.set(key, { value, deps, dirty });\n }\n\n /** Drop the cached status of key and of every computed value that reads it */\n function dropStatusCaches(key: string, seen = new Set<string>()) {\n if (seen.has(key)) return;\n seen.add(key);\n computedStatusCache.delete(key);\n dependents.get(key)?.forEach((c) => dropStatusCaches(c, seen));\n }\n\n /**\n * A computed key now reads different keys (mode ? a : b). Its cached statuses\n * are dropped right away; notifying and loading newly read queries waits for a\n * microtask, because this can happen while React is rendering.\n */\n function onRelink(key: string) {\n dropStatusCaches(key);\n relinked.add(key);\n if (relinkScheduled) return;\n relinkScheduled = true;\n queueMicrotask(() => {\n relinkScheduled = false;\n const keys = relinked;\n relinked = new Set();\n keys.forEach((k) => statusChanged(k)); // re-render whoever shows these statuses\n if (roots.size) syncMountedQueries();\n });\n }\n\n function evaluate(key: string): unknown {\n if (evaluating.includes(key))\n throw new Error(\n `computed \"${evaluating[0]}\" depends on itself through a loop: ${describeLoop(evaluating, key)}. ` +\n `Break the loop so one of these keys doesn't read the next.`\n );\n evaluating.push(key);\n const deps = new Set<string>();\n // One reader per computed key, reused on every run; it records into `deps`\n let r = computedReaders.get(key);\n if (!r) {\n const holder = { deps: null as Set<string> | null };\n r = { holder, reader: makeReader(readKey, (d) => void holder.deps?.add(d), `computed \"${key}\"`) };\n computedReaders.set(key, r);\n }\n const holder = r.holder;\n const outerDeps = holder.deps;\n holder.deps = deps;\n const reader = r.reader;\n try {\n const value = computedDefs[key](reader as never);\n rejectReader(value, `computed \"${key}\"`);\n storeComputed(key, value, deps, false);\n return value;\n } catch (error) {\n // Stay linked to what it read, so a change to the inputs re-runs it;\n // until then reads rethrow the same error instead of running it again\n storeComputed(key, FAILED, deps, false);\n computedCache.get(key)!.error = error;\n throw error;\n } finally {\n holder.deps = outerDeps;\n evaluating.pop();\n }\n }\n\n // Store-wide selectors, indexed by the keys they read last time, so a change\n // wakes only the selectors that read that key (not every selector).\n const selectorIndex = new Map<string, Set<() => void>>();\n const notifyAll = (key: string) => {\n notify(key);\n const set = selectorIndex.get(key);\n if (set) [...set].forEach((cb) => cb());\n };\n function indexSelector(cb: () => void, from: string[], to: string[]) {\n for (const k of from) {\n const set = selectorIndex.get(k);\n set?.delete(cb);\n if (set && set.size === 0) selectorIndex.delete(k);\n }\n for (const k of to) {\n if (!selectorIndex.has(k)) selectorIndex.set(k, new Set());\n selectorIndex.get(k)!.add(cb);\n }\n }\n\n /**\n * A key changed. Two phases, so nobody ever sees a half-updated graph:\n * 1. mark every computed key that depends on it (directly or not) as dirty\n * 2. notify the key, then each computed key whose value actually changed\n * Computed values are recalculated lazily when read, so in phase 2 every\n * read sees fresh inputs (no \"diamond\" glitches).\n */\n function changed(...keys: string[]) {\n const stale: { key: string; prev: unknown }[] = [];\n const seen = new Set<string>();\n const visit = (k: string) => {\n for (const c of dependents.get(k) ?? []) {\n if (seen.has(c)) continue;\n seen.add(c);\n const entry = computedCache.get(c);\n if (!entry) continue;\n stale.push({ key: c, prev: entry.dirty ? NO_VALUE : entry.value });\n entry.dirty = true;\n visit(c);\n }\n };\n keys.forEach(visit);\n\n keys.forEach(notifyAll);\n for (const { key: c, prev } of stale) {\n // Nobody is listening: leave it dirty until someone reads it\n if (!hasListeners(c) && !selectorIndex.has(c)) continue;\n let next: unknown;\n try {\n next = readComputed(c);\n } catch {\n notifyAll(c); // let the component re-render and hit its error boundary\n continue;\n }\n if (prev === NO_VALUE || !Object.is(prev, next)) notifyAll(c);\n }\n }\n\n /* ---------- Persistence ---------- */\n\n const p = options.persist;\n const persistCfg: PersistOptions<S> | null = !p\n ? null\n : p === true || p === 'local'\n ? { storage: 'local' }\n : p === 'session'\n ? { storage: 'session' }\n : p;\n const persistVersion = persistCfg?.version ?? 0;\n const storage = (type: 'local' | 'session') => {\n try {\n return isBrowser\n ? type === 'session'\n ? sessionStorage\n : localStorage\n : null;\n } catch {\n return null;\n }\n };\n // The offline cache (options.offline): JSON in localStorage; failures are ignored\n const offlineMax = (typeof options.offline === 'object' && options.offline.maxSize) || 2_000_000;\n let warnedOfflineSize = false;\n const writeOffline = (suffix: string, data: unknown) => {\n try {\n const text = JSON.stringify(data);\n const ls = storage('local');\n if (text.length > offlineMax) {\n // Too big to keep: skip it, and drop the older copy so it can't come back stale\n ls?.removeItem(`${name}:${suffix}`);\n if (!warnedOfflineSize) {\n warnedOfflineSize = true;\n console.warn(`[${name}] the offline copy of server data is ${text.length.toLocaleString('en')} characters, more than offline.maxSize (${offlineMax.toLocaleString('en')}), so it isn't saved. Raise offline: { maxSize }, or keep large responses out of the store.`);\n }\n return;\n }\n ls?.setItem(`${name}:${suffix}`, text);\n } catch {}\n };\n const readOffline = <T,>(suffix: string): Record<string, T> => {\n if (!options.offline) return {};\n try {\n const saved = JSON.parse(storage('local')?.getItem(`${name}:${suffix}`) ?? '{}');\n return saved && typeof saved === 'object' ? saved : {};\n } catch {\n return {};\n }\n };\n\n // By default, persist plain keys only. Query keys reload from the server.\n const warnedInvalid = new Set<string>();\n /** options.validate on data the store didn't write itself; rejected values are left out */\n function trusted<T>(values: Record<string, T>, from: 'storage' | 'offline' | 'remote', nameOf = (k: string) => k): Record<string, T> {\n if (!options.validate) return values;\n const out: Record<string, T> = {};\n for (const [k, v] of Object.entries(values)) {\n let ok = false;\n try {\n ok = options.validate(nameOf(k), v, from) !== false;\n } catch {}\n if (ok) out[k] = v;\n else if (!warnedInvalid.has(`${from}:${nameOf(k)}`)) {\n warnedInvalid.add(`${from}:${nameOf(k)}`);\n console.warn(`[${name}] validate() rejected \"${nameOf(k)}\" from ${from === 'remote' ? 'another tab' : from === 'offline' ? 'the offline copy' : 'saved state'}: ${from === 'remote' ? 'it keeps its current value' : 'it falls back to its initial value'}.`);\n }\n }\n return out;\n }\n // keys: only these; exclude: every plain key but these; neither: every plain key (queries reload)\n const persistExclude = new Set((persistCfg?.exclude as string[] | undefined) ?? []);\n const persistedKeys = !persistCfg\n ? []\n : ((persistCfg.keys as string[] | undefined) ?? STATE_KEYS.filter((k) => !isQuery(k) && !persistExclude.has(k))).filter((k) => !isComputed(k));\n const persistedKeySet = new Set(persistedKeys);\n // The keys the app persists, also in a scope (which itself saves nothing): snapshots leave them out\n const appPersist = ((options as Record<symbol, unknown>)[APP_PERSIST] ?? p) as StoreOptions<S, A, KA, E>['persist'];\n const appPersistedKeys = new Set(\n !appPersist\n ? []\n : ((typeof appPersist === 'object' && (appPersist.keys as string[] | undefined)) ||\n STATE_KEYS.filter((k) => !isQuery(k) && !(typeof appPersist === 'object' && ((appPersist.exclude as string[] | undefined) ?? []).includes(k))))\n );\n\n if (persistCfg?.keys && persistCfg.exclude)\n throw new Error(`[${name}] persist takes keys or exclude, not both: keys lists what's saved, exclude what isn't.`);\n for (const k of [...((persistCfg?.keys as string[] | undefined) ?? []), ...((persistCfg?.exclude as string[] | undefined) ?? [])])\n if (!isStateKey(k))\n throw new Error(\n `[${name}] persist lists \"${k}\", ` +\n (isComputed(k) ? 'a computed value: those are recalculated, not saved.' : isPaged(k) ? \"a paged query: pages aren't state, so they can't be saved.\" : \"which isn't a state key.\")\n );\n const persistStorage: StorageAdapter | null = !persistCfg\n ? null\n : typeof persistCfg.storage === 'object'\n ? persistCfg.storage\n : storage(persistCfg.storage ?? 'local');\n const persistKey = `${name}:state`;\n /** Ignore failures, sync or async: storage must never break the store */\n const quietly = (fn: () => unknown) => {\n try {\n const r = fn();\n if (isThenable(r)) r.then(undefined, () => {});\n } catch {}\n };\n\n // Nothing is saved until the saved data has loaded, so an async storage\n // isn't overwritten with the initial state.\n let hydrated = !persistStorage;\n let resolveHydrated!: () => void;\n const whenHydrated = new Promise<void>((r) => (resolveHydrated = r));\n\n // Async storage (IndexedDB...) commits after setItem returns; a page that goes away first loses the\n // write. So we track writes that haven't committed, and when the page is hidden or left with one\n // pending, the same text also goes to localStorage (synchronous) as a rescue copy. The next load\n // uses whichever is newer ($saved), then removes the rescue copy.\n let storageIsAsync = false;\n let uncommitted = 0;\n let lastSavedText: string | null = null;\n const rescueKey = `${persistKey}:rescue`;\n const isSavedState = (text: string) => {\n try {\n const v = JSON.parse(text) as unknown;\n return !!v && typeof v === 'object' && 'state' in (v as object);\n } catch {\n return false;\n }\n };\n const savedAt = (text: string | null) => {\n try {\n return text ? Number((JSON.parse(text) as { $saved?: unknown }).$saved) || 0 : 0;\n } catch {\n return 0;\n }\n };\n const saveNow = () => {\n clearTimeout(saveTimer);\n saveTimer = undefined;\n if (!persistStorage || !hydrated) return;\n const data = Object.fromEntries(persistedKeys.map((k) => [k, state[k]]));\n // $saved (when it was written) only matters for async storage, to compare with a rescue copy\n const text = JSON.stringify(storageIsAsync ? { $version: persistVersion, $saved: Date.now(), state: data } : { $version: persistVersion, state: data });\n lastSavedText = text;\n quietly(() => {\n const written = persistStorage.setItem(persistKey, text);\n if (isThenable(written)) {\n storageIsAsync = true;\n uncommitted++;\n const done = () => { uncommitted--; };\n (written as Promise<unknown>).then(done, done);\n }\n return written;\n });\n };\n const writeRescue = () => {\n if (!storageIsAsync || uncommitted === 0 || !lastSavedText) return;\n const local = storage('local');\n if (!local || local === (persistStorage as unknown)) return;\n try {\n local.setItem(rescueKey, lastSavedText);\n } catch {} // full or unavailable: as before, the async write may or may not make it\n };\n // persist: { debounce }: one write after the changes stop, not one per keystroke\n const persistDebounce = (typeof options.persist === 'object' && options.persist.debounce) || 0;\n let saveTimer: ReturnType<typeof setTimeout> | undefined;\n const saveState = () => {\n if (!persistStorage || !hydrated) return;\n if (!persistDebounce) return saveNow();\n clearTimeout(saveTimer);\n saveTimer = setTimeout(saveNow, persistDebounce);\n };\n // A pending save is written when the page is hidden or closed, so nothing typed is lost; with async\n // storage, a write that hasn't committed yet is also kept as a rescue copy (see writeRescue)\n const flushSave = () => {\n if (saveTimer !== undefined) saveNow();\n writeRescue();\n };\n const flushWhenHidden = () => { if (document.visibilityState === 'hidden') flushSave(); };\n if (isBrowser && persistStorage && typeof window.addEventListener === 'function') {\n window.addEventListener('pagehide', flushSave);\n document.addEventListener('visibilitychange', flushWhenHidden);\n }\n\n /** Saved text → values to use, migrated to the current version. null = nothing usable. */\n let rewrite = false; // migrated or dropped: save the current shape right away\n function readSaved(raw: string | null): Record<string, unknown> | null {\n if (raw == null) return null;\n let saved: unknown;\n try {\n saved = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!saved || typeof saved !== 'object') return null;\n const obj = saved as Record<string, unknown>;\n const legacy = !('$version' in obj); // saved before versioning: the state itself\n const from = legacy ? 0 : (obj.$version as number);\n let values: unknown = legacy ? obj : obj.state;\n if (from !== persistVersion) {\n rewrite = true;\n if (!persistCfg!.migrate) {\n console.warn(`[${name}] dropped saved state from version ${from}: no persist.migrate for version ${persistVersion}.`);\n return null;\n }\n try {\n values = persistCfg!.migrate(values, from);\n } catch (error) {\n console.error(`[${name}] persist.migrate threw; starting from the initial state:`, error);\n return null;\n }\n }\n return values && typeof values === 'object' ? (values as Record<string, unknown>) : null;\n }\n const pick = (values: Record<string, unknown> | null) => {\n const out: Record<string, unknown> = {};\n if (values) for (const k of persistedKeys) if (k in values) out[k] = values[k];\n return out;\n };\n const finishHydration = () => {\n hydrated = true;\n if (rewrite) saveState();\n resolveHydrated();\n };\n\n if (!persistStorage) resolveHydrated();\n else {\n let raw: string | null | Promise<string | null> = null;\n try {\n raw = persistStorage.getItem(persistKey);\n } catch {}\n if (isThenable(raw)) {\n // Async storage: load after startup, then show the saved values\n storageIsAsync = true;\n (raw as Promise<string | null>).then(\n (stored) => {\n // A rescue copy from a page that went away mid-write: used when it's newer than what committed\n let text = stored;\n const local = storage('local');\n let rescued: string | null = null;\n try {\n rescued = local && local !== (persistStorage as unknown) ? local.getItem(rescueKey) : null;\n if (rescued != null) local!.removeItem(rescueKey);\n } catch {}\n // Used only when it's real saved state and strictly newer; garbage or a tie keeps what's stored\n if (rescued != null && isSavedState(rescued) && savedAt(rescued) > savedAt(stored)) text = rescued;\n const values = trusted(pick(readSaved(text)), 'storage');\n hydrated = true; // so applying them also saves the current version\n if (!destroyed) apply(values, 'storage', 'loaded from storage', false);\n if (!destroyed && text === rescued && rescued != null) saveNow(); // the rescued copy goes back into the storage\n finishHydration();\n },\n (error) => {\n console.error(`[${name}] couldn't load persisted state:`, error);\n finishHydration();\n }\n );\n } else {\n // Sync storage (localStorage...): load before anything renders\n Object.assign(state, trusted(pick(readSaved(raw as string | null)), 'storage'));\n // Nothing reads these this early today; clear them so loaded values can never be shadowed\n computedCache.clear();\n selectMemo.clear();\n finishHydration();\n }\n }\n\n /* ---------- Cross-tab sync ---------- */\n\n const channel =\n options.syncTabs && isBrowser && 'BroadcastChannel' in window\n ? new BroadcastChannel(`createStore:${name}`)\n : null;\n // syncTabs: { keys } or { exclude }: which keys other tabs get (e.g. never an access token)\n const syncCfg = typeof options.syncTabs === 'object' ? options.syncTabs : null;\n if (syncCfg?.keys && syncCfg.exclude)\n throw new Error(`[${name}] syncTabs takes keys or exclude, not both: keys lists what's sent, exclude what isn't.`);\n for (const k of [...(syncCfg?.keys ?? []), ...(syncCfg?.exclude ?? [])])\n if (!(k in initialValues)) throw new Error(`[${name}] syncTabs lists \"${String(k)}\", which isn't a state key.`);\n const syncKeys = syncCfg?.keys ? new Set<string>(syncCfg.keys) : null;\n const syncExclude = new Set<string>(syncCfg?.exclude ?? []);\n const syncable = (k: string) => (syncKeys ? syncKeys.has(k) : !syncExclude.has(k));\n\n // Logical clock, so tabs that write at the same moment agree on a winner:\n // every change gets [counter, tabId]; a tab only accepts newer stamps.\n type Stamp = [number, string];\n const tabId = Math.random().toString(36).slice(2) + Date.now().toString(36);\n let clock = 0;\n const stamps = new Map<string, Stamp>();\n const isNewer = (a: Stamp, b?: Stamp) =>\n !b || a[0] > b[0] || (a[0] === b[0] && a[1] > b[1]);\n\n /* ---------- DevTools ---------- */\n\n // The parts of the Redux DevTools extension this store uses\n interface DevtoolsConnection {\n init(state: unknown): void;\n send(action: unknown, state: unknown): void;\n subscribe(listener: (msg: unknown) => void): unknown;\n unsubscribe?(): void;\n }\n const ext =\n options.devtools &&\n isBrowser &&\n (window as unknown as { __REDUX_DEVTOOLS_EXTENSION__?: { connect(o: { name: string }): DevtoolsConnection } })\n .__REDUX_DEVTOOLS_EXTENSION__;\n let destroyed = false; // set by destroy(); declared early because devtools code checks it\n let devtools: DevtoolsConnection | null = null;\n try {\n devtools = ext ? ext.connect({ name }) : null;\n } catch (error) {\n console.error(`[${name}] couldn't connect to Redux DevTools:`, error);\n }\n let warnedDevtools = false;\n /** Send to the extension without ever letting it break the store */\n const sendDevtools = (action: unknown, st: unknown) => {\n if (!devtools || destroyed) return;\n try {\n devtools.send(action, st);\n } catch (error) {\n if (!warnedDevtools) {\n warnedDevtools = true;\n console.error(`[${name}] Redux DevTools send failed:`, error);\n }\n }\n };\n\n /* ---------- Observability ---------- */\n\n const changeListeners = new Set<(e: ChangeEvent) => void>();\n\n /* ---------- History (undo / redo / time travel) ---------- */\n\n const h = options.history;\n const historyLimit = !h ? 0 : h === true ? 100 : h.limit ?? 100;\n // null = track every state key (the old behavior)\n const historyKeys: Set<string> | null =\n h && h !== true && h.keys ? new Set(h.keys as string[]) : null;\n if (historyKeys)\n for (const k of historyKeys) {\n if (isComputed(k))\n throw new Error(\n `history.keys has \"${k}\", which is computed. Track the state keys it reads; it follows them on undo.`\n );\n if (!isStateKey(k)) throw new Error(`history.keys has \"${k}\", which is not in the store.`);\n }\n const tracksHistory = (k: string) => !historyKeys || historyKeys.has(k);\n // Each step stores only the keys it changed: { key: [before, after] }.\n // So undo never touches data that loaded from the server in between.\n interface Step {\n changes: Record<string, [unknown, unknown]>;\n seq: number;\n }\n let past: Step[] = [];\n let future: Step[] = [];\n let stepSeq = 0;\n // batch(): changes made inside are collected here and saved as one undo step\n let batchDepth = 0;\n let batchChanges: Record<string, [unknown, unknown]> | null = null;\n let warnedAsyncBatch = false;\n // Promises the store itself returns (setters with a server call); returning one from batch() is fine\n const ownPromises = new WeakSet<object>();\n const hasOwn = (o: object, k: string) => Object.prototype.hasOwnProperty.call(o, k);\n\n /** After a failed save, drop the steps for that key made since the save started. */\n function trimHistory(key: string, fromSeq: number) {\n if (!historyLimit || !tracksHistory(key)) return;\n let trimmed = false;\n const strip = (list: Step[]) =>\n list.flatMap((st) => {\n if (st.seq < fromSeq || !hasOwn(st.changes, key)) return [st];\n trimmed = true;\n const rest = { ...st.changes };\n delete rest[key];\n return Object.keys(rest).length ? [{ ...st, changes: rest }] : [];\n });\n past = strip(past);\n future = strip(future);\n if (trimmed) updateHistoryInfo();\n }\n let historyInfo = { canUndo: false, canRedo: false, position: 0, length: 1 };\n const updateHistoryInfo = () => {\n historyInfo = {\n canUndo: past.length > 0,\n canRedo: future.length > 0,\n position: past.length,\n length: past.length + 1 + future.length,\n };\n notify(HISTORY_CHANNEL);\n };\n\n /** Save everything collected by the outermost batch() as one undo step. */\n function flushBatch() {\n const changes = batchChanges;\n batchChanges = null;\n if (!changes) return;\n // A key that ended where it started (a → b → a) is not a change\n for (const k of Object.keys(changes))\n if (Object.is(changes[k][0], changes[k][1])) delete changes[k];\n if (Object.keys(changes).length === 0) return;\n past = [...past, { changes, seq: stepSeq++ } as Step].slice(-historyLimit);\n future = [];\n updateHistoryInfo();\n }\n\n /**\n * Run several updates as one undo step:\n * store.batch(() => { setState('cart', []); setState('step', 'success'); });\n * Updates still apply and notify immediately; only history is grouped.\n * Batches can nest; the outermost one creates the step. If fn throws, the\n * changes it already made stay and are saved as one step (undo reverts them).\n */\n function batch<T>(fn: () => T): T {\n batchDepth++;\n if (batchDepth === 1 && historyLimit) batchChanges = Object.create(null);\n let result: T;\n try {\n result = fn();\n } finally {\n if (--batchDepth === 0) {\n flushBatch();\n if (saveAfterBatch) {\n saveAfterBatch = false;\n saveState();\n }\n if (saveInlineAfterBatch) {\n saveInlineAfterBatch = false;\n saveInline();\n }\n }\n }\n // Async work (an async function, a returned fetch...) runs after the batch has\n // ended, so updates made there aren't grouped. The store's own save promises are fine.\n if (!warnedAsyncBatch && isThenable(result) && !ownPromises.has(result as object)) {\n warnedAsyncBatch = true;\n console.warn(\n `[${name}] batch() returned a promise. Only the updates made before it returned are grouped; ` +\n `group updates made later (after an await) in their own batch().`\n );\n }\n return result;\n }\n\n /* ---------- Inline query bookkeeping ---------- */\n\n interface Meta {\n loaded: boolean;\n updatedAt: number;\n aborted?: boolean; // the last load was cancelled\n inflight?: Promise<unknown>;\n mounted: number; // components currently showing this key\n version: number; // bumped on every non-server change, to spot stale responses\n needsRefetch: boolean; // a response was discarded; reload when saves settle\n }\n const metas = new Map<string, Meta>();\n const inlineAborts = new Map<string, AbortController>(); // inline query key -> its request\n const meta = (k: string): Meta => {\n if (!metas.has(k))\n metas.set(k, { loaded: false, updatedAt: 0, mounted: 0, version: 0, needsRefetch: false });\n return metas.get(k)!;\n };\n\n const saveInline = () => {\n if (!options.offline) return;\n const data = Object.fromEntries(\n Object.keys(queryDefs)\n .filter((k) => meta(k).loaded)\n .map((k) => [k, { data: state[k], updatedAt: meta(k).updatedAt }])\n );\n writeOffline('inline', data);\n };\n for (const [k, e] of Object.entries(trusted(readOffline<{ data: unknown; updatedAt: number } | null>('inline'), 'offline'))) {\n if (!isQuery(k) || !e || typeof e !== 'object' || !('data' in e)) continue; // malformed saved data: skip it\n state[k] = e.data;\n Object.assign(meta(k), { loaded: true, updatedAt: e.updatedAt });\n selectMemo.delete(k);\n }\n\n /* ---------- The one place every change goes through ---------- */\n\n /** Run a user callback without letting it break the store. */\n const safely = (fn: () => void, what: string) => {\n try {\n fn();\n } catch (error) {\n console.error(`[${name}] ${what} threw an error:`, error);\n }\n };\n\n let warnedSync = false;\n const broadcast = (message: unknown) => {\n if (!channel) return;\n try {\n channel.postMessage(message);\n } catch (error) {\n // e.g. a function or class instance in state can't be sent to other tabs\n if (!warnedSync) {\n warnedSync = true;\n console.warn(`[${name}] couldn't sync a change to other tabs:`, error);\n }\n }\n };\n\n // Listeners may update state, which notifies listeners again. A real cascade\n // is short; this many nested updates means a listener is feeding itself.\n const MAX_NESTING = 100;\n let applyDepth = 0;\n\n let warnedDestroyed = false;\n const afterDestroy = (what: string) => {\n if (!warnedDestroyed) {\n warnedDestroyed = true;\n console.warn(`[${name}] ${what} after destroy(): ignored. A destroyed store doesn't change, load or notify any more.`);\n }\n };\n function apply(\n values: Record<string, unknown>,\n source: ChangeEvent['source'],\n label: string,\n recordHistory = true\n ) {\n if (destroyed) return afterDestroy(label.startsWith('set ') ? `setState(\"${label.slice(4)}\")` : label);\n if (applyDepth >= MAX_NESTING)\n throw new Error(\n `[${name}] update loop: ${MAX_NESTING} updates happened inside each other (last: ${label}). ` +\n `A subscribe/onChange listener is probably updating a key it also reacts to.`\n );\n applyDepth++;\n try {\n applyNow(values, source, label, recordHistory);\n } finally {\n applyDepth--;\n }\n }\n\n function applyNow(\n values: Record<string, unknown>,\n source: ChangeEvent['source'],\n label: string,\n recordHistory: boolean\n ) {\n const keys = Object.keys(values).filter(\n (k) => isStateKey(k) && !Object.is(state[k], values[k])\n );\n if (keys.length === 0) return;\n // Update in place: copying the whole state object on every change would make\n // each update slower the more keys the store has. Only changed keys are touched.\n const prev: Record<string, unknown> = {};\n for (const k of keys) {\n prev[k] = state[k];\n state[k] = values[k];\n }\n\n if (source === 'local' && recordHistory) recordStep(keys, prev);\n settlePendingWork(keys, source);\n persistChanges(keys);\n if (source !== 'remote' && source !== 'storage' && source !== 'hydrate') broadcastChanges(keys);\n if (source !== 'devtools') sendDevtools({ type: label }, state);\n changed(...keys); // computed values, then subscribers\n emitChangeEvents(keys, prev, source, label);\n }\n\n /** Undo history: one step, or part of the current batch() */\n function recordStep(keys: string[], prev: Record<string, unknown>) {\n if (!historyLimit) return;\n const tracked = keys.filter(tracksHistory);\n // A change to untracked keys only (modalOpen, searchText...) adds no step\n // and leaves the redo stack alone.\n if (!tracked.length) return;\n if (batchChanges) {\n // Inside batch(): keep each key's first \"before\" and latest \"after\"\n for (const k of tracked) {\n if (hasOwn(batchChanges, k)) batchChanges[k][1] = state[k];\n else batchChanges[k] = [prev[k], state[k]];\n }\n return;\n }\n const changes = Object.fromEntries(tracked.map((k) => [k, [prev[k], state[k]]]));\n past = [...past, { changes, seq: stepSeq++ } as Step].slice(-historyLimit);\n future = [];\n updateHistoryInfo();\n }\n\n /** Optimistic edits and in-flight responses that this change makes obsolete */\n function settlePendingWork(keys: string[], source: ChangeEvent['source']) {\n for (const k of keys) {\n // Changes from history, other tabs or devtools replace any pending\n // optimistic edits: there's nothing sensible to roll back to any more.\n if (source !== 'local' && source !== 'server') journals.delete(k);\n // Any non-server change makes in-flight responses for this key stale\n if (source !== 'server' && isQuery(k)) meta(k).version++;\n }\n }\n\n /** Persisted state and the offline query cache: once per batch(), not once per change in it */\n let saveAfterBatch = false;\n let saveInlineAfterBatch = false;\n function persistChanges(keys: string[]) {\n const saved = keys.some((k) => persistedKeySet.has(k)); // other keys don't touch saved state, or the debounce\n const inline = keys.some(isQuery);\n if (batchDepth > 0) {\n saveAfterBatch ||= saved;\n saveInlineAfterBatch ||= inline;\n return;\n }\n if (saved) saveState();\n if (inline) saveInline();\n }\n\n /** Other tabs (syncTabs): changes in the same tick go out as one message */\n const pendingSync = new Set<string>();\n let syncQueued = false;\n function broadcastChanges(keys: string[]) {\n if (!channel) return;\n for (const k of keys) if (syncable(k)) pendingSync.add(k);\n if (pendingSync.size && !syncQueued) {\n syncQueued = true;\n queueMicrotask(flushBroadcast);\n }\n }\n function flushBroadcast() {\n syncQueued = false;\n if (!channel || !pendingSync.size) return;\n // Stamped when sent: nothing from another tab can arrive in between (messages are macrotasks)\n const stamp: Stamp = [++clock, tabId];\n const keys = [...pendingSync];\n pendingSync.clear();\n keys.forEach((k) => stamps.set(k, stamp));\n broadcast({ type: 'state', stamp, values: Object.fromEntries(keys.map((k) => [k, state[k]])) });\n }\n\n /** onChange, subscribe() listeners and the logger */\n function emitChangeEvents(\n keys: string[],\n prev: Record<string, unknown>,\n source: ChangeEvent['source'],\n label: string\n ) {\n for (const key of keys) {\n const event: ChangeEvent = {\n key,\n prev: prev[key],\n next: state[key],\n source,\n time: Date.now(),\n };\n const deliver = () => {\n if (options.onChange) safely(() => options.onChange!(event), 'onChange');\n [...changeListeners].forEach((l) => safely(() => l(event), 'subscribe listener'));\n if (options.logger) console.log(`[${name}] ${label}`, event.prev, '→', event.next);\n };\n // While a render writes server data (heldNotify), listeners hear it right after the render,\n // with the same event: one of them updating React state mustn't happen during that render\n if (holdNotify > 0) heldEvents.push(deliver);\n else deliver();\n }\n }\n\n /* ---------- Reading and writing ---------- */\n\n function getState(): V;\n function getState<K extends Key>(key: K): V[K];\n function getState(key?: string): unknown {\n if (key !== undefined) return readKey(key);\n const derived = Object.keys(computedDefs).map((k) => [k, readComputed(k)]);\n const selected = Object.keys(queryDefs).map((k) => [k, readState(k)]);\n return { ...state, ...Object.fromEntries(selected), ...Object.fromEntries(derived) };\n }\n\n let selecting = 0; // > 0 while a selector function is running\n\n // Internal: the typed public versions are setStateWithServer and the setters\n function setState(key: string, value: unknown): void {\n if (evaluating.length)\n throw new Error(\n `setState(\"${key}\") was called while computed \"${evaluating[evaluating.length - 1]}\" was calculating. ` +\n `A computed function must only calculate a value; update state in an event handler or action instead.`\n );\n if (selecting > 0)\n throw new Error(\n `setState(\"${key}\") was called inside a selector. Selectors must only read state; ` +\n `update it in an event handler, effect or action instead.`\n );\n if (isComputed(key))\n throw new Error(\n `\"${key}\" is computed and read-only. Change the state keys it reads instead.`\n );\n if (!isStateKey(key))\n throw new Error(`\"${key}\" is not in the store.`);\n // A setter called while an updater runs (setCount(c => { setCount(...); return c + 1 })) waits for\n // that updater's result to be written, then runs: like React, no update is lost\n if (inUpdater > 0) {\n afterUpdater.push(() => setState(key, value));\n return;\n }\n let next: unknown;\n if (typeof value === 'function') {\n inUpdater++;\n try {\n next = (value as (prev: unknown) => unknown)(state[key]);\n } catch (error) {\n afterUpdater.length = 0; // updates made inside a failed update fail with it\n throw error;\n } finally {\n inUpdater--;\n }\n if (next && typeof (next as { then?: unknown }).then === 'function') warnOnce(`promise:${key}`,\n `[${name}] the updater for \"${key}\" returned a promise, so the promise itself was stored. Updaters must be synchronous: await first, then set the value.`);\n } else {\n next = value;\n if (next && typeof next === 'object' && 'nativeEvent' in next && typeof (next as { preventDefault?: unknown }).preventDefault === 'function')\n warnOnce(`event:${key}`, `[${name}] setState(\"${key}\") got a browser event as its value, probably from onClick={setter}. Use onClick={() => setter(...)} instead.`);\n }\n journal(key, value);\n apply({ [key]: next }, 'local', `set ${key}`);\n if (inUpdater === 0 && afterUpdater.length) for (const run of afterUpdater.splice(0)) run();\n }\n let inUpdater = 0;\n const afterUpdater: (() => void)[] = [];\n const warnedSetter = new Set<string>();\n const warnOnce = (id: string, message: string) => {\n if (warnedSetter.has(id)) return;\n warnedSetter.add(id);\n console.warn(message);\n };\n\n /* ---------- Optimistic updates ---------- */\n\n // While a save is pending on a key, every write to that key is recorded.\n // If the save fails, its write is removed and the others are replayed on\n // top of the value from before, so overlapping saves and local edits all\n // end up correct no matter which order they finish in.\n interface JournalEntry {\n op: number; // 0 for a plain local write\n change: unknown; // the value or updater that was passed in\n pending: boolean;\n }\n const journals = new Map<string, { base: unknown; entries: JournalEntry[] }>();\n let currentOp = 0;\n let opCounter = 0;\n const hasPending = (k: string) =>\n journals.get(k)?.entries.some((e) => e.pending) ?? false;\n\n const SUPERSEDED = Symbol('superseded');\n\n function journal(key: string, change: unknown) {\n let j = journals.get(key);\n if (!j && !currentOp) return;\n if (j && !currentOp && typeof change !== 'function') {\n // A plain local value replaces everything before it, so earlier records\n // are no longer needed to rebuild the value. Keep only the pending saves\n // (to know when they settle), without their changes.\n j.base = change;\n j.entries = j.entries.filter((e) => e.pending).map((e) => ({ ...e, change: SUPERSEDED }));\n if (j.entries.length === 0) journals.delete(key);\n return;\n }\n if (!j) {\n j = { base: state[key], entries: [] };\n journals.set(key, j);\n }\n j.entries.push({ op: currentOp, change, pending: currentOp !== 0 });\n }\n\n /**\n * The setter behind useGlobalState. With a serverCall it updates instantly,\n * runs the call, and rolls back if the call fails.\n */\n function update(\n key: string,\n value: unknown,\n serverCall?: () => Promise<unknown> | unknown\n ): Promise<void> {\n if (!serverCall) {\n setState(key, value);\n const done = Promise.resolve();\n ownPromises.add(done);\n return done;\n }\n\n const op = ++opCounter;\n const startSeq = stepSeq;\n const outer = currentOp;\n currentOp = op;\n try {\n setState(key, value); // an updater that throws stops here\n } finally {\n currentOp = outer;\n }\n const touched = [...journals]\n .filter(([, j]) => j.entries.some((e) => e.op === op))\n .map(([k]) => k);\n\n const settle = (ok: boolean, error?: unknown) => {\n const reload: string[] = [];\n for (const k of touched) {\n const j = journals.get(k);\n if (j) {\n if (ok) {\n j.entries.forEach((e) => { if (e.op === op) e.pending = false; });\n } else {\n j.entries = j.entries.filter((e) => e.op !== op);\n let next = j.base;\n for (const e of j.entries) {\n if (e.change === SUPERSEDED) continue;\n try {\n next = typeof e.change === 'function' ? (e.change as (prev: unknown) => unknown)(next) : e.change;\n } catch {}\n }\n apply({ [k]: next }, 'local', `rollback ${key}`, false);\n }\n if (!j.entries.some((e) => e.pending)) journals.delete(k);\n } else if (!ok && isQuery(k)) {\n // The record was dropped because another tab or undo changed this key\n // meanwhile, so the failed change may be baked into what we have now.\n // The server knows the truth: reload (and the result syncs to other tabs).\n meta(k).needsRefetch = true;\n }\n if (!ok) trimHistory(k, startSeq);\n\n if (isQuery(k)) {\n const m = meta(k);\n m.version++; // responses that started before this save are out of date\n if (!ok) setStatus(k, { error });\n if (ok && queryDefs[k].options.refetchAfterMutation) m.needsRefetch = true;\n if (m.needsRefetch && !hasPending(k)) {\n m.needsRefetch = false;\n reload.push(k);\n }\n }\n }\n return Promise.all(reload.map((k) => loadKey(k, true).catch(() => {})));\n };\n\n const promise = Promise.resolve()\n .then(serverCall)\n .then(\n async (result) => {\n await settle(true);\n return result as void; // what the save returned (a refund amount, the saved record...)\n },\n (error) => {\n // The page is going away (reload, navigation) and the browser cancelled the request: it may\n // well have reached the server, so keep the change rather than roll it back (and save that)\n if (!leavingPage) settle(false, error);\n throw error;\n }\n );\n promise.catch(() => {}); // avoid \"unhandled rejection\" when not awaited\n ownPromises.add(promise);\n return promise;\n }\n\n // Set while the page is being left (pagehide), cleared if it's shown again (back/forward cache)\n let leavingPage = false;\n if (isBrowser && typeof window.addEventListener === 'function') {\n window.addEventListener('pagehide', () => { leavingPage = true; });\n window.addEventListener('pageshow', () => { leavingPage = false; });\n }\n\n /* ---------- Loading and error status ---------- */\n // How a query the server didn't load looked there: loading\n const SERVER_LOADING: Status = Object.freeze({\n state: 'loading', loading: true, fetching: false, error: null, blocked: false, blockedBy: null, rootError: null,\n refetch: () => Promise.resolve(),\n });\n\n const hydratedKeys = new Set<string>();\n const PLAIN_STATUS: Status = Object.freeze({\n state: 'ready',\n loading: false,\n fetching: false,\n error: null,\n blocked: false,\n blockedBy: null,\n rootError: null,\n refetch: () => Promise.resolve(),\n });\n // Whose status an object is, and whether that query has data: what waitFor needs to know\n const statusInfo = new WeakMap<Status, { key: string; hasData: () => boolean }>();\n const owned = <T extends Status>(status: T, key: string, hasData: () => boolean): T => {\n statusInfo.set(status, { key, hasData });\n return status;\n };\n const statuses = new Map<string, Status>();\n const computedStatusCache = new Map<string, Status>();\n // Internal channels start with \\u0000, which no state key can (see above): a key named\n // \"status:todos\" or \"__history\" can't collide with them\n const statusChannel = (k: string) => `\\u0000status:${k}`;\n\n const baseStatus = (key: string): Status =>\n owned({\n state: meta(key).loaded ? 'ready' : 'loading',\n loading: !meta(key).loaded,\n fetching: false,\n error: null,\n blocked: false,\n blockedBy: null,\n rootError: null,\n refetch: () => loadKey(key, true).then(() => {}, () => {}),\n }, key, () => meta(key).loaded);\n\n function setStatus(key: string, patch: Partial<Status>) {\n const next = { ...(statuses.get(key) ?? baseStatus(key)), ...patch };\n next.state = stateOf(next.loading, next.error, meta(key).loaded, false);\n const asked = abortedState(key, !!meta(key).aborted, next.loading || next.fetching, meta(key).loaded, false);\n if (asked === 'loading') {\n next.state = 'loading';\n next.loading = true;\n } else if (asked === 'idle') (next as { state: string }).state = 'idle';\n statuses.set(key, owned(next, key, () => meta(key).loaded));\n statusChanged(key);\n }\n /** The one place the precedence is decided: waiting, then loading, then error without data, then ready */\n /** A first load that was cancelled (nothing loaded, nothing running): what the query asked to report */\n function abortedState(q: string, aborted: boolean, loading: boolean, hasData: boolean, waiting: boolean): WhenAborted | null {\n if (!aborted || loading || hasData || waiting) return null;\n return (namedDefs[q] as { whenAborted?: WhenAborted } | undefined)?.whenAborted ?? null;\n }\n function stateOf(loading: boolean, error: unknown, hasData: boolean, waiting: boolean): StatusState {\n if (waiting) return 'waiting';\n if (loading) return 'loading';\n if (error != null && !hasData) return 'error';\n return 'ready';\n }\n\n function statusChanged(key: string, seen = new Set<string>()) {\n if (seen.has(key)) return; // a computed loop can make the dependency map circular\n seen.add(key);\n notify(statusChannel(key));\n dependents.get(key)?.forEach((c) => {\n computedStatusCache.delete(c);\n statusChanged(c, seen);\n });\n }\n\n function getStatus(key: string): Status {\n if (isQuery(key)) {\n if (!statuses.has(key)) statuses.set(key, baseStatus(key));\n return statuses.get(key)!;\n }\n if (isComputed(key)) {\n const cached = computedStatusCache.get(key);\n if (cached) return cached;\n readComputed(key);\n const parts = [...computedCache.get(key)!.deps].map(getStatus);\n const combined: Status = owned({\n state: parts.some((s) => s.state === 'loading') ? 'loading' : parts.some((s) => s.state === 'error') ? 'error' : 'ready',\n loading: parts.some((s) => s.loading),\n fetching: parts.some((s) => s.fetching),\n error: parts.find((s) => s.error)?.error ?? null,\n blocked: false,\n blockedBy: null,\n rootError: null,\n refetch: () => Promise.all(parts.map((s) => s.refetch())).then(() => {}),\n }, key, () => !parts.some((s) => s.loading));\n computedStatusCache.set(key, combined);\n return combined;\n }\n return PLAIN_STATUS;\n }\n\n /* ---------- Inline queries: query(fn) ---------- */\n\n function loadKey(key: string, force = false): Promise<unknown> {\n if (destroyed) return Promise.reject(new Error(`[${name}] \"${key}\" can't load after destroy().`));\n const def = queryDefs[key];\n const m = meta(key);\n const fresh =\n m.loaded && Date.now() - m.updatedAt < (def.options.staleTime ?? 30_000);\n if (fresh && !force) return Promise.resolve(state[key]);\n if (m.inflight) return m.inflight; // ten components, one request\n if (isBrowser && !navigator.onLine && m.loaded)\n return Promise.resolve(state[key]);\n\n m.aborted = false; // a new load: whatever was cancelled before is running again\n setStatus(key, { fetching: true, loading: !m.loaded });\n const startVersion = m.version;\n const controller = new AbortController();\n inlineAborts.set(key, controller);\n const request: Promise<unknown> = withRetry(\n (_params, signal) => def.fetch(undefined, signal),\n undefined,\n def.options.retry ?? 2,\n controller.signal,\n def.options.retryDelay\n ).then(\n (data) => {\n if (m.inflight === request) m.inflight = undefined;\n // The key changed locally while this request was out, or a save is\n // still pending: this response may be out of date, so don't show it.\n if (m.version !== startVersion || hasPending(key)) {\n m.updatedAt = 0;\n if (hasPending(key)) {\n m.needsRefetch = true; // reload once the saves settle\n setStatus(key, { fetching: false });\n return state[key];\n }\n return loadKey(key, true);\n }\n m.loaded = true;\n m.updatedAt = Date.now();\n m.needsRefetch = false;\n apply({ [key]: data }, 'server', `loaded ${key}`);\n setStatus(key, { loading: false, fetching: false, error: null });\n return data;\n },\n (error) => {\n if (m.inflight === request) m.inflight = undefined;\n // Aborted is a cancel, not a failure: no error status\n if (controller.signal.aborted) {\n // After reset() the controller is gone: leave the fresh status alone\n if (inlineAborts.get(key) === controller) {\n m.aborted = true;\n setStatus(key, { loading: false, fetching: false });\n }\n } else setStatus(key, { loading: false, fetching: false, error });\n throw error;\n }\n ).finally(() => {\n if (inlineAborts.get(key) === controller) inlineAborts.delete(key);\n });\n m.inflight = request;\n return request;\n }\n\n /** All query keys a key depends on, following computed keys. */\n function queryKeysOf(\n key: string,\n seen = new Set<string>(),\n out = new Set<string>()\n ): Set<string> {\n if (seen.has(key)) return out;\n seen.add(key);\n if (isQuery(key)) out.add(key);\n else if (isComputed(key)) {\n try {\n readComputed(key);\n } catch {\n // A failing computed still records what it read, so keep going\n }\n computedCache.get(key)?.deps.forEach((d) => queryKeysOf(d, seen, out));\n }\n return out;\n }\n\n /* ---------- Time travel ---------- */\n\n function goTo(position: number) {\n if (batchDepth > 0)\n throw new Error(`[${name}] undo, redo and goTo can't run inside batch(). Call them after it.`);\n if (\n !Number.isInteger(position) ||\n position < 0 ||\n position > past.length + future.length ||\n position === past.length\n )\n return;\n // Collect every key the jump touches, then apply them in one go\n const values: Record<string, unknown> = {};\n while (past.length > position) {\n const st = past.pop()!;\n future.unshift(st);\n for (const [k, [before]] of Object.entries(st.changes)) values[k] = before;\n }\n while (past.length < position) {\n const st = future.shift()!;\n past.push(st);\n for (const [k, [, after]] of Object.entries(st.changes)) values[k] = after;\n }\n apply(values, 'history', `history ${position}`);\n updateHistoryInfo();\n }\n const undo = () => goTo(past.length - 1);\n const redo = () => goTo(past.length + 1);\n\n /* ---------- Event bus ---------- */\n\n const handlers = new Map<string, Set<(payload: unknown) => void>>();\n function on(event: string, handler: (payload: unknown) => void) {\n if (!handlers.has(event)) handlers.set(event, new Set());\n handlers.get(event)!.add(handler);\n let held: typeof handler | undefined = handler; // released after unsubscribing\n return () => {\n if (!held) return;\n const set = handlers.get(event);\n set?.delete(held);\n if (set && set.size === 0) handlers.delete(event);\n held = undefined;\n };\n }\n let emitDepth = 0;\n function emit(event: string, payload?: unknown, shouldBroadcast = false) {\n if (emitDepth >= MAX_NESTING)\n throw new Error(\n `[${name}] event loop: \"${event}\" was emitted ${MAX_NESTING} times inside its own handlers.`\n );\n emitDepth++;\n try {\n emitNow(event, payload, shouldBroadcast);\n } finally {\n emitDepth--;\n }\n }\n function emitNow(event: string, payload: unknown, shouldBroadcast: boolean) {\n if (destroyed) return afterDestroy(`emit(\"${event}\")`);\n if (options.logger) console.log(`[${name}] event ${event}`, payload);\n sendDevtools({ type: `event ${event}`, payload }, state);\n if (shouldBroadcast) {\n flushBroadcast(); // the state this event is about reaches other tabs first\n broadcast({ type: 'event', event, payload });\n }\n [...(handlers.get(event) ?? [])].forEach((fn) =>\n safely(() => fn(payload), `handler for \"${event}\"`)\n );\n }\n\n /** Public, typed versions: names and payloads come from the `events` option. */\n let warnedNoChannel = false;\n function publicEmit<K extends keyof E & string>(event: K, ...args: EmitArgs<E, K>): void {\n const shouldBroadcast = args[1]?.broadcast === true;\n if (shouldBroadcast && !channel && isBrowser && !warnedNoChannel) {\n warnedNoChannel = true;\n console.warn(\n `[${name}] emit(\"${event}\", ..., { broadcast: true }) only reaches this tab: ` +\n `turn on syncTabs (and use a browser with BroadcastChannel) to reach other tabs.`\n );\n }\n emit(event, args[0], shouldBroadcast);\n }\n function publicOn<K extends keyof E & string>(\n event: K,\n handler: (payload: E[K]) => void\n ): () => void {\n return on(event, handler as (payload: unknown) => void);\n }\n\n if (channel) {\n channel.onmessage = ({ data }) => {\n // Any script on this origin can post to the channel: ignore anything that isn't a well-formed message\n if (!data || typeof data !== 'object') return;\n if (data.type === 'state') {\n const stamp = data.stamp as Stamp;\n if (!Array.isArray(stamp) || stamp.length !== 2 || !Number.isSafeInteger(stamp[0]) || stamp[0] < 0 || typeof stamp[1] !== 'string') return;\n if (!data.values || typeof data.values !== 'object' || Array.isArray(data.values)) return;\n clock = Math.max(clock, stamp[0]);\n // Keep only keys where this change is newer than what we already have\n const fresh: Record<string, unknown> = {};\n for (const [k, v] of Object.entries<unknown>(data.values)) {\n if (!isStateKey(k) || !syncable(k) || !isNewer(stamp, stamps.get(k))) continue; // excluded keys are ignored, also when sent\n stamps.set(k, stamp);\n fresh[k] = v;\n }\n apply(trusted(fresh, 'remote'), 'remote', 'from other tab');\n }\n if (data.type === 'event' && typeof data.event === 'string') emit(data.event, data.payload); // local only: never re-broadcast\n };\n }\n let unsubscribeDevtools: (() => void) | undefined;\n if (devtools) {\n try {\n devtools.init(state);\n } catch (error) {\n console.error(`[${name}] Redux DevTools init failed:`, error);\n }\n const onDevtoolsMessage = (raw: unknown) => {\n if (destroyed) return;\n const msg = raw as { type?: unknown; payload?: { type?: unknown }; state?: unknown } | null;\n const t = msg?.payload?.type;\n if (msg?.type !== 'DISPATCH' || (t !== 'JUMP_TO_STATE' && t !== 'JUMP_TO_ACTION')) return;\n try {\n const next: unknown = typeof msg.state === 'string' ? JSON.parse(msg.state) : msg.state;\n if (next && typeof next === 'object') apply(next as Record<string, unknown>, 'devtools', 'time travel');\n } catch (error) {\n console.error(`[${name}] ignored a malformed Redux DevTools message:`, error);\n }\n };\n try {\n const off = devtools.subscribe(onDevtoolsMessage);\n // Newer extensions return an unsubscribe function; older ones have unsubscribe()\n unsubscribeDevtools = typeof off === 'function' ? (off as () => void) : () => devtools?.unsubscribe?.();\n } catch (error) {\n console.error(`[${name}] couldn't subscribe to Redux DevTools:`, error);\n }\n }\n\n /* ---------- Named queries: useQuery(name, params) ---------- */\n\n interface Entry {\n data?: unknown;\n error?: unknown;\n status: 'idle' | 'loading' | 'success' | 'error';\n isFetching: boolean;\n updatedAt: number;\n fetchingNext?: boolean; // infinite queries: loading the next page\n aborted?: boolean; // the last request was cancelled (matters while status is 'idle': nothing loaded)\n }\n const EMPTY: Entry = { status: 'idle', isFetching: false, updatedAt: 0 };\n // What an enabled query with no entry yet shows: it's about to load\n const PENDING: Entry = { status: 'loading', isFetching: false, updatedAt: 0 };\n const cache = new Map<string, Entry>();\n const hydratedEntries = new Map<string, Entry>(); // query entries restored by hydrate()\n const inflight = new Map<string, Promise<unknown>>();\n const namedAborts = new Map<string, AbortController>(); // cache key -> its request\n const versions = new Map<string, number>(); // cache key -> bumped by invalidate()\n const onScreen = new Map<\n string,\n { name: string; params: unknown; count: number }\n >();\n // The name is encoded so it can never contain \":\", which keeps keys unambiguous\n // even for names like \"todo:detail\" (key = query:<name>[:<params>]).\n const queryPrefix = (q: string) => `query:${encodeURIComponent(q)}`;\n const cacheKey = (q: string, params?: unknown) =>\n params === undefined ? queryPrefix(q) : `${queryPrefix(q)}:${stableKey(params)}`;\n /** Does cache key k belong to query q (any params)? */\n const belongsTo = (k: string, q: string) => k === queryPrefix(q) || k.startsWith(`${queryPrefix(q)}:`);\n const queryNameOf = (k: string) => {\n const raw = k.slice('query:'.length).split(':')[0];\n try { return decodeURIComponent(raw); } catch { return raw; }\n };\n\n const saveCache = () => {\n if (!options.offline) return;\n const data = Object.fromEntries(\n [...cache].filter(([, e]) => e.status === 'success')\n );\n writeOffline('queries', data);\n };\n for (const [k, e] of Object.entries(trusted(readOffline<Entry>('queries'), 'offline', (key) => queryNameOf(key))))\n if (k.startsWith('query:') && e && typeof e === 'object' && e.data !== undefined) // malformed saved data: skip it\n cache.set(k, { data: e.data, status: 'success', isFetching: false, updatedAt: typeof e.updatedAt === 'number' ? e.updatedAt : 0 });\n // Entries nobody shows are evicted after gcTime, so viewing thousands of\n // different ids over a long session doesn't grow memory forever.\n const gcTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const gcTimeOf = (k: string) => {\n const q = queryNameOf(k);\n return namedDefs[q]?.gcTime ?? 5 * 60_000;\n };\n function scheduleGc(k: string) {\n clearTimeout(gcTimers.get(k));\n gcTimers.delete(k);\n if (!isBrowser) return; // on the server a store lives as long as its request: no timers to hold it\n if (onScreen.get(k)?.count) return;\n const ms = gcTimeOf(k);\n if (!Number.isFinite(ms)) return;\n gcTimers.set(k, setTimeout(() => {\n gcTimers.delete(k);\n if (onScreen.get(k)?.count || inflight.has(k)) return;\n releaseEntry(k);\n saveCache();\n }, ms));\n }\n\n /** Runs fn with notifications held, and sends them in a microtask (after the current render) */\n function holdingNotify(fn: () => void) {\n holdNotify++;\n try {\n fn();\n } finally {\n holdNotify--;\n }\n if (holdNotify === 0 && (held.size || heldEvents.length))\n queueMicrotask(() => {\n const channels = [...held];\n held.clear();\n channels.forEach((ch) => listeners.get(ch)?.forEach((cb) => cb()));\n heldEvents.splice(0).forEach((deliver) => deliver()); // hooks first, then listeners, as without holding\n });\n }\n\n /** Everything kept for one cache entry, released together (the entry, its setter, its select memo...) */\n function releaseEntry(k: string) {\n cache.delete(k);\n versions.delete(k);\n onScreen.delete(k);\n entrySetters.delete(k);\n entrySelect.delete(k);\n hydratedEntries.delete(k);\n const ch = entryChannel(k);\n subscribers.delete(ch);\n if (!listeners.get(ch)?.size) listeners.delete(ch);\n }\n\n const setEntry = (k: string, patch: Partial<Entry>) => {\n cache.set(k, { ...(cache.get(k) ?? EMPTY), ...patch });\n notify(entryChannel(k));\n saveCache();\n if (!onScreen.get(k)?.count) scheduleGc(k);\n };\n // Entries restored from offline storage are evicted too, unless shown again\n [...cache.keys()].forEach(scheduleGc);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- see StoreApi.fetchQuery\n function fetchQuery(q: string, params?: unknown, force = false): Promise<any> {\n if (destroyed) return Promise.reject(new Error(`[${name}] fetchQuery(\"${q}\") after destroy(): a destroyed store doesn't load anything.`));\n // Without params: the query's own state key (its selected value)\n if (isQuery(q) && params === undefined) return loadKey(q, force).then(() => readKey(q));\n const config = namedDefs[q];\n if (!config)\n return Promise.reject(new Error(`Query \"${q}\" is not in the store.`));\n if ('__kind' in config) return fetchInfinite(q, config, params, 'first', force);\n let k: string;\n try {\n k = cacheKey(q, params);\n } catch (error) {\n return Promise.reject(error); // params that can't be keyed\n }\n const entry = cache.get(k) ?? EMPTY;\n const fresh =\n entry.status === 'success' &&\n Date.now() - entry.updatedAt < (config.staleTime ?? 30_000);\n if (fresh && !force) return Promise.resolve(entry.data);\n if (inflight.has(k)) return inflight.get(k)!;\n if (isBrowser && !navigator.onLine && entry.data !== undefined)\n return Promise.resolve(entry.data);\n\n setEntry(k, {\n isFetching: true,\n status: entry.data === undefined ? 'loading' : entry.status,\n });\n return runEntry(\n k,\n (signal) => config.fetch(params, signal),\n config,\n (data) => data,\n () => fetchQuery(q, params, true)\n );\n }\n\n /**\n * Runs one request for a cache entry (named and infinite queries): retries,\n * abort, and the entry's status. `toData` turns the response into what's stored.\n */\n function runEntry(\n k: string,\n load: (signal: AbortSignal) => Promise<unknown>,\n opts: { retry?: number; retryDelay?: RetryDelay },\n toData: (response: unknown) => unknown,\n restart: () => Promise<unknown>\n ): Promise<unknown> {\n const version = versions.get(k) ?? 0;\n const controller = new AbortController();\n namedAborts.set(k, controller);\n const promise: Promise<unknown> = withRetry(\n (_params, signal) => load(signal),\n undefined,\n opts.retry ?? 2,\n controller.signal,\n opts.retryDelay\n )\n .then(\n (response) => {\n if ((versions.get(k) ?? 0) !== version) {\n // invalidate() ran while this was loading: load again instead of storing it\n if (inflight.get(k) === promise) inflight.delete(k);\n return restart();\n }\n const data = toData(response);\n setEntry(k, {\n data,\n error: undefined,\n status: 'success',\n isFetching: false,\n fetchingNext: false,\n updatedAt: Date.now(),\n });\n return data;\n },\n (error) => {\n const idle = { isFetching: false, fetchingNext: false };\n if (!controller.signal.aborted) setEntry(k, { ...idle, error, status: 'error' });\n // Aborted is a cancel, not a failure: keep any data, no error status.\n // After reset() the controller is gone: leave the fresh cache alone.\n else if (namedAborts.get(k) === controller)\n setEntry(k, { ...idle, status: cache.get(k)?.data === undefined ? 'idle' : 'success', aborted: true });\n throw error;\n }\n )\n .finally(() => {\n if (inflight.get(k) === promise) inflight.delete(k);\n if (namedAborts.get(k) === controller) namedAborts.delete(k);\n });\n inflight.set(k, promise);\n return promise;\n }\n\n /* ---------- Infinite queries ---------- */\n\n interface InfiniteData {\n pages: unknown[];\n pageParams: unknown[];\n next: unknown; // undefined or null = no more pages\n }\n\n /**\n * 'first': load the first page (once; `force` refreshes it). 'next': add the next page.\n * A list that's on screen is never refreshed by focus or coming back online, so nobody's scroll\n * jumps. It refreshes when it's shown again after staleTime (a page reopened, a reload), and on\n * refetch()/invalidate(): starting over (pages.refresh 'first') or refetching every loaded page\n * ('loaded').\n */\n function fetchInfinite(\n q: string,\n def: AnyInfinite,\n params: unknown,\n mode: 'first' | 'next',\n force = false\n ): Promise<unknown> {\n if (destroyed) return Promise.reject(new Error(`[${name}] \"${q}\" can't load after destroy().`));\n let k: string;\n try {\n k = cacheKey(q, params);\n } catch (error) {\n return Promise.reject(error);\n }\n const entry = cache.get(k) ?? EMPTY;\n const data = entry.data as InfiniteData | undefined;\n const running = inflight.get(k);\n if (running && !force) return running;\n if (!data) mode = 'first';\n // Fresh, or already on screen elsewhere (no reshuffling under someone scrolling): keep the pages.\n // Stale and shown by nobody else (a page opened again, or restored after a reload): start over.\n const staleTime = (def as { staleTime?: number }).staleTime ?? 30_000;\n const stale = Date.now() - entry.updatedAt > staleTime;\n // (\"Shown again\" means a mount or a reload: a focus/online refresh never starts an on-screen list over.)\n const shownAgain = stale && inFocusRefresh === 0 && (onScreen.get(k)?.count ?? 0) <= 1;\n if (mode === 'first' && data && entry.status === 'success' && !force && !shownAgain)\n return Promise.resolve(data);\n if (mode === 'next' && data!.next == null) return Promise.resolve(data); // no more pages\n\n namedAborts.get(k)?.abort(); // a forced refetch replaces a running request\n const page = mode === 'first' ? def.firstPage : data!.next;\n setEntry(k, {\n isFetching: true,\n fetchingNext: mode === 'next',\n status: data ? entry.status : 'loading',\n });\n // refresh: 'loaded': the same number of pages, fetched in order (each from the fresh previous page's\n // next, so cursors stay right), kept off-screen until all have arrived, then swapped in at once\n const refreshCount = mode === 'first' && data && def.refresh === 'loaded' ? data.pages.length : 1;\n if (refreshCount > 1)\n return runEntry(k, async (signal) => {\n const pages: unknown[] = [];\n const pageParams: unknown[] = [];\n // From the oldest page kept: the first page, or with `max` the start of the kept window\n let p: unknown = data!.pageParams.length ? data!.pageParams[0] : def.firstPage;\n let next: unknown = undefined;\n for (let i = 0; i < refreshCount; i++) {\n const response = await def.fetch(p as never, signal, params as never);\n pages.push(response);\n pageParams.push(p);\n next = def.nextPage(response as never, pages as never[], p as never);\n if (next == null) break; // the list got shorter: stop where it ends now\n p = next;\n }\n return { [ALL_PAGES]: true, pages, pageParams, next };\n }, def, (all) => {\n const { pages, pageParams, next } = all as InfiniteData;\n return { pages, pageParams, next } satisfies InfiniteData;\n }, () => fetchInfinite(q, def, params, 'first', true));\n return runEntry(k, (signal) => def.fetch(page as never, signal, params as never), def, (response) => {\n const base = mode === 'next' && data ? data : { pages: [], pageParams: [] };\n let pages = [...base.pages, response];\n let pageParams = [...base.pageParams, page];\n if (def.maxPages && pages.length > def.maxPages) {\n pages = pages.slice(-def.maxPages);\n pageParams = pageParams.slice(-def.maxPages);\n }\n const next = def.nextPage(response as never, pages as never[], page as never);\n return { pages, pageParams, next } satisfies InfiniteData;\n }, () => fetchInfinite(q, def, params, 'first', true));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- see StoreApi.setQueryData\n function setQueryData(q: string, updater: any, params?: unknown) {\n if (isQuery(q) && params === undefined) {\n setState(q, updater); // the query's own state key\n return;\n }\n const k = cacheKey(q, params);\n const prev = cache.get(k)?.data;\n setEntry(k, {\n data: typeof updater === 'function' ? updater(prev) : updater,\n status: 'success',\n });\n }\n\n /** Cancel a query's in-flight requests (every params of a named query). */\n function abort(q: string) {\n if (isQuery(q)) inlineAborts.get(q)?.abort(); // without params, and below every params\n for (const [k, c] of [...namedAborts])\n if (belongsTo(k, q)) c.abort();\n }\n\n async function invalidate(q: string) {\n if (isQuery(q)) {\n // Inline query: reload now if on screen, otherwise on next read\n const m = meta(q);\n m.updatedAt = 0;\n m.version++; // a response already on its way may predate the change: it reloads instead\n if (m.mounted > 0) await loadKey(q, true).catch(() => {});\n }\n // ...and every params of it\n const jobs: Promise<unknown>[] = [];\n for (const [k, entry] of cache) {\n if (!belongsTo(k, q)) continue;\n cache.set(k, { ...entry, updatedAt: 0 });\n versions.set(k, (versions.get(k) ?? 0) + 1); // in-flight responses are now out of date\n const visible = onScreen.get(k);\n if (visible?.count)\n jobs.push(fetchQuery(visible.name, visible.params, true).catch(() => {}));\n }\n // The offline copy learns it's stale too, or a reload would restore it as fresh\n saveCache();\n if (isQuery(q)) saveInline();\n await Promise.all(jobs);\n }\n\n /* ---------- Offline queue and refresh on focus ---------- */\n\n const queue: (() => void)[] = [];\n /**\n * Runs the task now, or once the connection is back. It may run much later,\n * so read the latest state inside it:\n * whenOnline(() => api.save(store.getState('todos'))) // sends what's current then\n * not a value captured earlier:\n * whenOnline(() => api.save(todos)) // may send stale data\n */\n function whenOnline(task: () => Promise<unknown> | unknown) {\n if (destroyed) return Promise.reject(new Error(`[${name}] whenOnline() after destroy().`));\n if (!isBrowser || navigator.onLine) return Promise.resolve().then(task);\n const waiting = new Promise((resolve, reject) =>\n queue.push(() => Promise.resolve().then(task).then(resolve, reject))\n );\n updateWindowListeners();\n return waiting;\n }\n\n // Focus and coming back online refresh what's on screen. A paged list on screen keeps its pages\n // (inFocusRefresh): starting it over would drop everything below page 1 under someone's scroll.\n let inFocusRefresh = 0;\n const refreshVisible = () => {\n for (const q of Object.keys(queryDefs))\n if (meta(q).mounted > 0) loadKey(q).catch(() => {});\n inFocusRefresh++;\n try {\n for (const { name: q, params, count } of onScreen.values())\n if (count) fetchQuery(q, params).catch(() => {});\n } finally {\n inFocusRefresh--;\n }\n };\n const onOnline = () => {\n queue.splice(0).forEach((task) => task());\n refreshVisible();\n updateWindowListeners();\n };\n // Listening to window keeps the store alive, so only listen while something\n // needs it: a query on screen, or tasks waiting for the connection.\n let listening = false;\n function updateWindowListeners() {\n if (!isBrowser) return;\n const needed =\n !destroyed &&\n (queue.length > 0 ||\n Object.keys(queryDefs).some((q) => meta(q).mounted > 0) ||\n [...onScreen.values()].some((v) => v.count > 0));\n if (needed === listening) return;\n listening = needed;\n const method = needed ? 'addEventListener' : 'removeEventListener';\n window[method]('focus', refreshVisible);\n window[method]('online', onOnline);\n }\n\n const abortAll = () => {\n inlineAborts.forEach((c) => c.abort());\n namedAborts.forEach((c) => c.abort());\n };\n\n /** Stop syncing tabs and listening to the window. Useful in tests and hot reloading. */\n function destroy() {\n flushSave();\n flushBroadcast();\n if (isBrowser && persistStorage && typeof window.removeEventListener === 'function') {\n window.removeEventListener('pagehide', flushSave);\n document.removeEventListener('visibilitychange', flushWhenHidden);\n }\n destroyed = true;\n // Without this the extension keeps calling back into a store nobody uses,\n // which also keeps the whole store alive.\n try {\n unsubscribeDevtools?.();\n } catch {}\n unsubscribeDevtools = undefined;\n channel?.close();\n updateWindowListeners();\n gcTimers.forEach((t) => clearTimeout(t));\n gcTimers.clear();\n abortAll();\n queue.length = 0; // saves waiting for the connection won't run on a destroyed store\n entrySetters.clear();\n entrySelect.clear();\n if (options.shared) {\n const slot = Symbol.for(`createStore:${name}`);\n const g = globalThis as unknown as Record<symbol, unknown>;\n if (g[slot] === store) delete g[slot];\n }\n }\n\n /**\n * Back to a fresh store, e.g. `afterEach(() => store.reset())`: initial state,\n * no history, empty query cache, in-flight requests aborted. Subscribers and\n * event handlers stay, so mounted components keep working.\n */\n function reset() {\n abortAll();\n inlineAborts.clear();\n namedAborts.clear();\n inflight.clear();\n gcTimers.forEach((t) => clearTimeout(t));\n gcTimers.clear();\n const cachedKeys = [...cache.keys()];\n cachedKeys.forEach(releaseEntry);\n cache.clear();\n saveCache();\n cachedKeys.forEach((k) => notify(entryChannel(k))); // components show the empty entry\n for (const m of metas.values())\n Object.assign(m, { loaded: false, updatedAt: 0, inflight: undefined, needsRefetch: false, version: m.version + 1 });\n statuses.clear();\n computedStatusCache.clear();\n journals.clear();\n versions.clear();\n for (const k of Object.keys(initialValues)) delete initialValues[k]; // drop overrides: back to the declared values\n apply({ ...declaredValues }, 'local', 'reset', false);\n saveInline();\n Object.keys(queryDefs).forEach((k) => statusChanged(k));\n past = [];\n future = [];\n updateHistoryInfo();\n }\n\n /* ---------- Actions ---------- */\n\n // The api actions get: these members, plus every key's setter and key actions (api.cart.add),\n // from a prototype shared by the store's scopes\n const apiMembers: StoreApi<SV, E, RV> = {\n getState: (key) => readKey(key) as SV[typeof key],\n setState: (key, value, serverCall) => update(key, value, serverCall) as Promise<never>,\n emit: publicEmit,\n on: publicOn,\n fetchQuery,\n setQueryData,\n invalidate,\n whenOnline,\n batch,\n abort,\n };\n const api = Object.assign(Object.create(setterProtoOf(def, API_NAMES, 'apiProto')), apiMembers) as StoreApi<SV, E, RV>;\n Object.defineProperty(api, SETTER_OF, { value: (k: string) => setterFor(k) });\n const actions = (options.actions?.(api as StoreApi<SV, E, RV> & ApiSetters<S, KA>) ?? {}) as A;\n\n /* ---------- Per-key actions: setTodos.add(...) ---------- */\n\n const keyActionDefs = (options.keyActions ?? {}) as Record<string, Record<string, KeyAction<unknown>>>;\n const ssrCfg = options.ssr;\n const snapshotVersion = (ssrCfg && typeof ssrCfg === 'object' && ssrCfg.version) || 0;\n if (ssrCfg && typeof ssrCfg === 'object') {\n if ('serialize' in ssrCfg) throw new Error(`[${name}] ssr.serialize is now ssr.keys (or ssr.exclude, for everything but some keys).`);\n if (ssrCfg.keys && ssrCfg.exclude) throw new Error(`[${name}] ssr takes keys or exclude, not both: keys lists what's sent, exclude what isn't.`);\n for (const k of [...(ssrCfg.keys ?? []), ...(ssrCfg.exclude ?? [])])\n if (!isStateKey(k as string) && !(k in namedDefs))\n throw new Error(`[${name}] ssr lists \"${String(k)}\", which isn't a state key or query${isComputed(k as string) ? ' (computed values are recalculated, not sent)' : ''}.`);\n }\n\n for (const [key, defs] of Object.entries(keyActionDefs)) {\n if (!isStateKey(key))\n throw new Error(\n `keyActions has \"${key}\", which is not a plain or query key in the store.`\n );\n for (const [action, def] of Object.entries(defs ?? {}))\n if (typeof def !== 'function' && typeof def?.run !== 'function')\n throw new Error(`keyActions.${key}.${action} must be a function or { run, save }.`);\n }\n\n function bindAction(key: string, action: string, def: KeyAction<unknown>) {\n const run = typeof def === 'function' ? def : def.run;\n const save = typeof def === 'function' ? undefined : def.save;\n return (...args: unknown[]): Promise<void> => {\n const reducer = (current: unknown) => run(current, ...args);\n if (!save) return update(key, reducer);\n\n // Reads the value when the save runs, so a queued offline save sends the latest one.\n // The raw stored value, like run gets: not the select()-ed view of a query key.\n const send = () => save(state[key]);\n const promise = update(key, reducer, options.offline ? () => whenOnline(send) : send);\n if (options.onSaveStart) safely(() => options.onSaveStart!(key, action), 'onSaveStart');\n promise.then(\n () => {\n if (options.onSaveSuccess) safely(() => options.onSaveSuccess!(key, action), 'onSaveSuccess');\n },\n (error) => {\n if (options.onSaveError) safely(() => options.onSaveError!(key, action, error), 'onSaveError');\n }\n );\n return promise;\n };\n }\n\n // Stable setter per key, so it's safe in dependency arrays\n const setters = new Map<string, SetValue<unknown>>();\n function setterFor(key: string) {\n if (isComputed(key)) return undefined;\n if (!setters.has(key)) {\n const setter: SetValue<unknown> = (value, serverCall) => update(key, value, serverCall) as Promise<never>;\n const defs = hasOwn(keyActionDefs, key) ? keyActionDefs[key] : {};\n // defineProperty, because names like \"name\" or \"length\" are read-only on functions\n for (const [action, def] of Object.entries(defs ?? {}))\n Object.defineProperty(setter, action, { value: bindAction(key, action, def), enumerable: true });\n setters.set(key, setter);\n }\n return setters.get(key);\n }\n\n // Each setter (with its key actions) is made the first time it's used: a store with a thousand\n // keys, or a server creating a scope per request, doesn't build a thousand functions up front.\n // One shared getter: it reads its key from a per-key descriptor, so no closure per key either.\n // store.set: the definition's shared getters, asking this store for its setters (made on first use)\n const set = Object.create(def.setProto) as SettersOf<S, KA>;\n Object.defineProperty(set, SETTER_OF, { value: setterFor });\n\n /* ---------- React hooks ---------- */\n\n // Values React's server snapshot reads. On the server: the store as it is now, so\n // per-request data set before rendering (setState) is in the HTML. In the browser,\n // while hydrating: the initial values (ignoring saved state), which is what the\n // server rendered when the store was created the same way, so hydration matches.\n const readServer = (key: string): unknown => (isBrowser ? readInitial(key) : readKey(key));\n\n // Initial values for hydration (ignores saved state)\n const serverCache = new Map<string, unknown>();\n function readInitial(key: string): unknown {\n if (serverCache.has(key)) return serverCache.get(key);\n const value = isComputed(key)\n ? computedDefs[key](makeReader(readInitial, () => {}, `computed \"${key}\"`) as never)\n : queryDefs[key]?.options.select && initialValues[key] !== undefined\n ? queryDefs[key].options.select!(initialValues[key])\n : initialValues[key];\n serverCache.set(key, value);\n return value;\n }\n\n /**\n * The queries the shown keys read, directly or through computed values, are\n * \"on screen\". Recomputed when components mount/unmount and whenever a\n * computed value starts reading different keys, so a newly read query loads.\n */\n function syncMountedQueries() {\n const next = new Set<string>();\n for (const k of roots.keys()) queryKeysOf(k, new Set(), next);\n for (const q of rootQueries) if (!next.has(q)) meta(q).mounted--;\n for (const q of next)\n if (!rootQueries.has(q)) {\n meta(q).mounted++;\n loadKey(q).catch(() => {});\n }\n rootQueries = next;\n updateWindowListeners();\n }\n\n /**\n * Initial state from createScope() or <Root>: replaces initial values (so hydration\n * renders them, as the server did) and current values. Query keys given here count\n * as loaded, so they don't refetch until stale. Computed keys are skipped.\n */\n function seed(values: Record<string, unknown>) {\n for (const k of Object.keys(values)) hydratedKeys.add(k); // what the server sent (hydration renders these)\n const fresh: Record<string, unknown> = {};\n const queries = values.$queries;\n const ageOf = (age: unknown) => (typeof age === 'number' && age > 0 ? age : 0);\n if (queries && typeof queries === 'object')\n for (const [k, item] of Object.entries(queries as Record<string, { data?: unknown; age?: unknown } | null>)) {\n if (!k.startsWith('query:') || !item || typeof item !== 'object' || !('data' in item)) continue;\n const entry: Entry = { data: item.data, status: 'success', isFetching: false, updatedAt: Date.now() - ageOf(item.age) };\n cache.set(k, entry);\n hydratedEntries.set(k, entry); // what the server rendered: the browser's server snapshot\n notify(entryChannel(k));\n }\n for (const [k, v] of Object.entries(values)) {\n if (k === '$queries' || k === '$ages' || k === '$version' || isComputed(k)) continue;\n if (!isStateKey(k)) throw new Error(`[${name}] initialState has \"${k}\", which is not in the store.`);\n initialValues[k] = v;\n fresh[k] = v;\n }\n serverCache.clear();\n apply(fresh, 'hydrate', 'initial state', false);\n const ages = (values.$ages && typeof values.$ages === 'object' ? values.$ages : {}) as Record<string, unknown>;\n for (const k of Object.keys(fresh))\n if (isQuery(k)) {\n Object.assign(meta(k), { loaded: true, updatedAt: Date.now() - ageOf(ages[k]) });\n setStatus(k, { loading: false, fetching: false, error: null });\n }\n }\n\n /** Marks the keys a component shows as on screen while mounted, and loads their queries if needed. */\n function useLoadQueries(id: string) {\n useEffect(() => showKeys(id), [id]);\n }\n\n /** Marks keys as shown (on screen) and loads their queries; returns the cleanup */\n function showKeys(id: string): (() => void) | undefined {\n {\n if (!id) return; // plain keys: nothing to load\n const keys = id.split('\\u0000');\n keys.forEach((k) => roots.set(k, (roots.get(k) ?? 0) + 1));\n syncMountedQueries();\n // A mounting component also refreshes stale data it shows (no-op when fresh)\n const queries = new Set<string>();\n keys.forEach((k) => queryKeysOf(k, new Set(), queries));\n queries.forEach((q) => loadKey(q).catch(() => {}));\n return () => {\n keys.forEach((k) => {\n const n = (roots.get(k) ?? 1) - 1;\n if (n > 0) roots.set(k, n);\n else roots.delete(k);\n });\n syncMountedQueries();\n };\n }\n }\n\n // Functions a component needs for one key, created once per key instead of\n // on every render (this matters with hundreds of components re-rendering).\n interface KeyHooks {\n getValue: () => unknown;\n getServerValue: () => unknown;\n getStatus: () => Status;\n statusSubscribe: (cb: () => void) => () => void;\n statusCanChange: boolean;\n cell: () => Cell; // the key's value and status, the same object while neither changes\n serverCell: () => Cell;\n idleCell: () => Cell; // the same, for { enabled: false }\n serverIdleCell: () => Cell;\n }\n interface Cell {\n v: unknown;\n s: Status;\n }\n const keyHooks = new Map<string, KeyHooks>();\n // What one useGlobalState(key) call remembers between renders (kept in a single ref)\n interface KeyHookState {\n key: string | null;\n setter: SetValue<unknown> | undefined;\n arr: unknown[] | null; // the last array returned\n statusUsed: boolean; // the component read the status: status changes re-render it\n renderStatus?: Status; // the status read with the value this render\n memo: { input: unknown; output: unknown; selector: unknown } | null;\n h: KeyHooks | null;\n sub: (cb: () => void) => () => void;\n subSelect: (cb: () => void) => () => void;\n enabled: boolean;\n }\n\n // The array useGlobalState(key) returns: [value, setter, status]. Reading index 2\n // marks the status as used (so status changes re-render that component) and returns\n // the live status. The getter lives once on this class's prototype: defining it on\n // every returned array put V8 arrays in slow dictionary mode (~20% of render time\n // with 1000 components re-rendering).\n const STATUS_OF = Symbol('status');\n class KeyTuple extends Array<unknown> {\n [STATUS_OF]!: KeyHookState;\n }\n Object.defineProperty(KeyTuple.prototype, 2, {\n enumerable: true,\n configurable: true,\n get(this: KeyTuple) {\n const s = this[STATUS_OF];\n s.statusUsed = true;\n return s.renderStatus ?? (s.enabled ? s.h!.getStatus() : s.h!.idleCell().s);\n },\n });\n function hooksFor(key: string): KeyHooks {\n let h = keyHooks.get(key);\n if (!h) {\n const canChange = isQuery(key) || isComputed(key);\n let last: Cell | null = null;\n let lastServer: Cell | null = null;\n const cellOf = (prev: Cell | null, v: unknown): Cell => {\n const s = canChange ? getStatus(key) : PLAIN_STATUS;\n return prev && Object.is(prev.v, v) && prev.s === s ? prev : { v, s };\n };\n // During hydration the browser must render what the server did: a query the server didn't\n // load was loading there, even if the offline copy has restored it here already (#10)\n const serverCellOf = (prev: Cell | null, v: unknown): Cell => {\n const s = isBrowser && isQuery(key) && !hydratedKeys.has(key) ? SERVER_LOADING : canChange ? getStatus(key) : PLAIN_STATUS;\n return prev && Object.is(prev.v, v) && prev.s === s ? prev : { v, s };\n };\n // { enabled: false }: a query that hasn't loaded is waiting, not loading\n let lastIdle: Cell | null = null;\n let lastServerIdle: Cell | null = null;\n const idleOf = (prev: Cell | null, v: unknown): Cell => {\n const s = isQuery(key) && !meta(key).loaded ? PLAIN_STATUS : canChange ? getStatus(key) : PLAIN_STATUS;\n return prev && Object.is(prev.v, v) && prev.s === s ? prev : { v, s };\n };\n h = {\n getValue: () => readKey(key),\n getServerValue: () => readServer(key),\n getStatus: () => getStatus(key),\n statusSubscribe: canChange ? subscribeTo(statusChannel(key)) : noSubscribe,\n statusCanChange: canChange,\n cell: () => (last = cellOf(last, readKey(key))),\n serverCell: () => (lastServer = serverCellOf(lastServer, readServer(key))),\n idleCell: () => (lastIdle = idleOf(lastIdle, readKey(key))),\n serverIdleCell: () => (lastServerIdle = idleOf(lastServerIdle, readServer(key))),\n };\n keyHooks.set(key, h);\n }\n return h;\n }\n\n /* useGlobalState('todos') and useGlobalState('todos', selector) */\n function useKeyState(key: string, selector?: (value: never) => unknown, enabled = true): unknown {\n if (!hasKey(key))\n throw new Error(\n `\"${key}\" is not in the store. Add it to the object you pass to createStore().`\n );\n // Everything this hook remembers lives in one ref. This hook runs in every component that\n // reads state, on every render, and React does bookkeeping per hook: one ref instead of\n // three refs and a callback cut the hooks per component from 7 to 4.\n const ref = useRef<EntryHookState | KeyHookState | null>(null);\n // The ref is shared with the other paths of useGlobalState: start over if it was theirs\n if (!ref.current || !('statusUsed' in ref.current))\n ref.current = { key: null, arr: null, statusUsed: false, memo: null, h: null, setter: undefined, sub: noSubscribe, subSelect: noSubscribe, enabled: true };\n const c = ref.current;\n if (c.key !== key || c.enabled !== enabled) {\n c.enabled = enabled;\n // The key's helpers and setter, looked up once per component (and again only if the key changes)\n const h = hooksFor(key);\n c.key = key;\n c.setter = setterFor(key);\n // One subscription for the value and the status. Status changes (fetching → idle) only\n // re-render components that actually read the status; one that destructures just\n // [value, setValue] is left alone.\n const onValue = subscribeTo(key);\n c.h = h;\n c.arr = null;\n // Query and computed keys are also marked as shown while subscribed, which loads them\n c.sub = h.statusCanChange\n ? (cb: () => void) => {\n const offValue = onValue(cb);\n const offStatus = h.statusSubscribe(() => { if (c.statusUsed) cb(); });\n const hide = enabled ? showKeys(key) : undefined; // { enabled: false }: don't load\n return () => { offValue(); offStatus(); hide?.(); };\n }\n : onValue;\n c.subSelect = h.statusCanChange\n ? (cb: () => void) => {\n const offValue = onValue(cb);\n const hide = enabled ? showKeys(key) : undefined;\n return () => { offValue(); hide?.(); };\n }\n : onValue;\n }\n\n // Remember the last selector result so we only re-render when it changes\n const select = (input: unknown) => {\n if (!selector) return input;\n const m = c.memo;\n if (m && m.selector === selector && Object.is(m.input, input))\n return m.output;\n selecting++;\n let output: unknown;\n try {\n output = selector(input as never);\n } finally {\n selecting--;\n }\n const keep = m && shallowEqual(m.output, output) ? m.output : output;\n c.memo = { input, output: keep, selector };\n return keep;\n };\n\n const h = c.h!;\n const snap = useSyncExternalStore(\n selector ? c.subSelect : c.sub,\n selector ? () => select(readKey(key)) : enabled ? h.cell : h.idleCell,\n selector ? () => select(readServer(key)) : enabled ? h.serverCell : h.serverIdleCell\n );\n\n if (selector) return snap;\n const value = (snap as Cell).v;\n c.renderStatus = (snap as Cell).s; // the status that goes with this value (also during hydration)\n // Return the same array while the value and setter are unchanged.\n // Index 2 is a getter: reading it marks the status as used, and it always\n // returns the live status (also when read later, outside of render).\n if (c.arr && c.arr[0] === value) return c.arr;\n const arr = new KeyTuple(3); // index 2 stays empty: reads go to the prototype getter\n arr[0] = value;\n arr[1] = c.setter;\n arr[STATUS_OF] = c; // the component's own bookkeeping: no separate link object\n c.arr = arr;\n return arr;\n }\n\n /* useGlobalState(state => ...), useGlobalState(get => ...), useGlobalState(({ a, b }) => ...) */\n function useStoreSelector(select: (state: never) => unknown): unknown {\n const memo = useRef<{\n select: unknown;\n deps: string[];\n values: unknown[];\n output: unknown;\n server: boolean;\n } | null>(null);\n\n const run = (read: (k: string) => unknown, server: boolean) => {\n // A key that throws (e.g. a computed loop the selector catches itself)\n // is recorded as THREW, and always makes the selector run again.\n const safeRead = (k: string) => {\n try {\n return read(k);\n } catch {\n return THREW;\n }\n };\n const m = memo.current;\n // Same selector, same inputs: reuse the last result\n if (\n m &&\n m.select === select &&\n m.server === server &&\n m.deps.every((d, i) => m.values[i] !== THREW && Object.is(safeRead(d), m.values[i]))\n )\n return m.output;\n\n // One reader per component, pointed at this run's read function and dependency set\n // (building a Proxy on every run was a sixth of the time when many selectors re-run)\n const r = (readerRef.current ??= { read, deps: new Set<string>(), reader: null as unknown });\n r.read = read;\n r.deps.clear();\n r.reader ??= makeReader((k) => r.read(k), (k) => r.deps.add(k), 'a selector');\n const deps = r.deps;\n selecting++;\n let output: unknown;\n try {\n output = select(r.reader as never);\n } finally {\n selecting--;\n }\n rejectReader(output, 'A selector');\n const list = [...deps];\n const keep = m && shallowEqual(m.output, output) ? m.output : output;\n memo.current = { select, deps: list, values: list.map(safeRead), output: keep, server };\n // Dependencies can change between runs (mode ? a : b). During render, only\n // add the new keys: with concurrent rendering this render may never commit,\n // and the screen must keep updating for the keys it actually shows. Keys\n // the committed render no longer reads are dropped after commit (below).\n const sub = subscription.current;\n if (sub.cb && !server) {\n const added = list.filter((k) => !sub.keys.includes(k));\n if (added.length) {\n indexSelector(sub.cb, [], added);\n sub.keys = [...sub.keys, ...added];\n }\n }\n return keep;\n };\n\n // Subscribed only to the keys this selector read last time\n const subscription = useRef<{ cb?: () => void; keys: string[] }>({ keys: [] });\n const readerRef = useRef<{ read: (k: string) => unknown; deps: Set<string>; reader: unknown } | null>(null);\n const subscribe = useCallback((cb: () => void) => {\n const sub = subscription.current;\n sub.cb = cb;\n sub.keys = memo.current?.deps ?? [];\n indexSelector(cb, [], sub.keys);\n return () => {\n indexSelector(cb, sub.keys, []);\n if (sub.cb === cb) { sub.cb = undefined; sub.keys = []; }\n };\n }, []);\n\n const value = useSyncExternalStore(\n subscribe,\n () => run(readKey, false),\n () => run(readServer, true)\n );\n // After commit: subscribe to exactly the keys the committed render read. The effect only\n // runs when that list changed, not on every render of every component using a selector.\n const committedDeps = memo.current?.deps ?? [];\n const depsId = committedDeps.join('\\u0000');\n useEffect(() => {\n const sub = subscription.current;\n if (!sub.cb) return;\n const drop = sub.keys.filter((k) => !committedDeps.includes(k));\n const add = committedDeps.filter((k) => !sub.keys.includes(k));\n if (drop.length || add.length) {\n indexSelector(sub.cb, drop, add);\n sub.keys = committedDeps;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- depsId is committedDeps, as a string\n }, [depsId]);\n useLoadQueries(committedDeps.some((k) => isQuery(k) || isComputed(k)) ? committedDeps.filter((k) => isQuery(k) || isComputed(k)).join('\\u0000') : '');\n return value;\n }\n\n function useGlobalState<K extends PagedKeysOf<S>>(key: K): [PageOf<S[K]>[], undefined, PagedStatusFor<S[K]>];\n function useGlobalState<K extends PagedKeysOf<S>>(\n key: K,\n params: TakesParams<PagedParamsOf<S[K]>>,\n options?: UseOptions\n ): [PageOf<S[K]>[], undefined, PagedStatusFor<S[K]>];\n function useGlobalState<K extends QueryKeysOf<S> & keyof SV>(\n key: K,\n params: TakesParams<ParamsOf<S[K]>>,\n options?: UseOptions\n ): [SV[K] | undefined, SetValue<RV[K & keyof RV]>, StatusFor<S[K & keyof S]>];\n function useGlobalState<K extends Key>(\n key: K\n ): [V[K], K extends StateKey ? SetValue<RV[K & keyof RV]> & ActionsFor<KA, K> : undefined, StatusFor<S[K & keyof S]>];\n function useGlobalState<K extends Key, R>(\n key: K,\n selector: (value: V[K]) => R\n ): R;\n function useGlobalState<R>(select: (state: StateReader<V>) => R): R;\n function useGlobalState(\n keyOrSelect: string | ((state: never) => unknown),\n second?: unknown,\n options?: UseOptions\n ): unknown {\n // Every path below uses the same two hooks (a ref and one subscription), so a component\n // can move between them, e.g. useGlobalState('user', id) while id goes from undefined to set.\n if (typeof keyOrSelect === 'function')\n // eslint-disable-next-line react-hooks/rules-of-hooks -- same kind of argument on every render\n return useStoreSelector(keyOrSelect);\n // Params passed but undefined (user?.id before the user has loaded): they aren't known yet, so\n // the query waits. Leaving the params out is what reads a query without params.\n // (arguments.length, not a rest array: that would be allocated on every render)\n const paramsGiven = arguments.length >= 2 && typeof second !== 'function';\n if (paramsGiven) checkUseOptions(options, keyOrSelect);\n if (isPaged(keyOrSelect))\n // eslint-disable-next-line react-hooks/rules-of-hooks -- same two hooks as the other paths\n return usePaged(keyOrSelect, second, paramsGiven && second === undefined, blockOf(options));\n if (paramsGiven && (second !== undefined || isQuery(keyOrSelect))) {\n if (!isQuery(keyOrSelect))\n throw new Error(\n `useGlobalState(\"${keyOrSelect}\", params): \"${keyOrSelect}\" ${hasKey(keyOrSelect) ? \"isn't a query, so it doesn't take params\" : 'is not in the store'}. ` +\n `The second argument is params for a query(...) key, or a selector function.`\n );\n // eslint-disable-next-line react-hooks/rules-of-hooks -- same two hooks as the other paths\n return useEntryState(keyOrSelect, second, second === undefined, blockOf(options));\n }\n // eslint-disable-next-line react-hooks/rules-of-hooks -- same two hooks as the other paths\n return useKeyState(keyOrSelect, second as ((value: never) => unknown) | undefined);\n }\n\n interface Block {\n blocked: boolean;\n blockedBy: string | null;\n rootError: unknown;\n }\n const NOT_BLOCKED: Block = { blocked: false, blockedBy: null, rootError: null };\n /** What enabled and waitFor say: waiting or not, on which query, and why */\n function blockOf(options: UseOptions | undefined): Block {\n if (!options) return NOT_BLOCKED;\n const enabled = options.enabled !== false;\n const ups = options.waitFor === undefined ? [] : Array.isArray(options.waitFor) ? options.waitFor : [options.waitFor as Status];\n let blockedBy: string | null = null;\n let rootError: unknown = null;\n let waiting = false;\n // An upstream that failed without data wins: its error is the reason\n for (const u of ups as Status[]) {\n const info = statusInfo.get(u);\n if (u.blocked && u.rootError != null) return { blocked: true, blockedBy: u.blockedBy, rootError: u.rootError };\n if (u.error != null && !(info?.hasData() ?? false)) return { blocked: true, blockedBy: info?.key ?? null, rootError: u.error };\n }\n for (const u of ups as Status[]) {\n if (u.blocked || u.loading) {\n waiting = true;\n blockedBy ??= u.blocked ? u.blockedBy ?? statusInfo.get(u)?.key ?? null : statusInfo.get(u)?.key ?? null;\n rootError ??= u.rootError ?? null;\n }\n }\n if (!waiting && enabled) return NOT_BLOCKED;\n return { blocked: true, blockedBy, rootError };\n }\n const sameBlock = (a: Block, b: Block) => a.blocked === b.blocked && a.blockedBy === b.blockedBy && Object.is(a.rootError, b.rootError);\n const noop = () => Promise.resolve();\n\n /** Marks a cache entry as on screen and loads it; returns the cleanup (it runs in the subscription) */\n function showEntry(q: string, params: unknown, k: string): () => void {\n const visible = onScreen.get(k) ?? { name: q, params, count: 0 };\n visible.count++;\n onScreen.set(k, visible);\n clearTimeout(gcTimers.get(k));\n gcTimers.delete(k);\n updateWindowListeners();\n fetchQuery(q, params).catch(() => {});\n return () => {\n visible.count--;\n if (visible.count === 0) scheduleGc(k);\n updateWindowListeners();\n };\n }\n\n // The selected value of a cache entry, recalculated only when its data changes\n const entrySelect = new Map<string, { raw: unknown; out: unknown }>();\n function selectedData(q: string, k: string, raw: unknown): unknown {\n const select = queryDefs[q]?.options.select;\n if (!select || raw === undefined) return raw;\n const m = entrySelect.get(k);\n if (m && Object.is(m.raw, raw)) return m.out;\n const out = select(raw);\n entrySelect.set(k, { raw, out });\n return out;\n }\n\n // The setter of one params' entry: writes it, and with a server call, rolls back on failure\n const entrySetters = new Map<string, SetValue<unknown>>();\n function entrySetter(q: string, params: unknown, k: string): SetValue<unknown> {\n let setter = entrySetters.get(k);\n if (!setter) {\n setter = (value, serverCall) => {\n const prev = cache.get(k)?.data;\n const next = typeof value === 'function' ? (value as (p: unknown) => unknown)(prev) : value;\n setEntry(k, { data: next, status: 'success' });\n if (!serverCall) return Promise.resolve() as Promise<never>;\n const done = Promise.resolve()\n .then(serverCall)\n .then(\n (result) => {\n if (queryDefs[q]?.options.refetchAfterMutation) return fetchQuery(q, params, true).then(() => result, () => result);\n return result; // what the save returned\n },\n (error) => {\n // Roll back, unless something newer has replaced the value since, or the page is being left\n // (the browser cancelled a request that may well have reached the server: #3)\n if (!leavingPage && Object.is(cache.get(k)?.data, next)) setEntry(k, { data: prev, status: prev === undefined ? 'idle' : 'success' });\n throw error;\n }\n );\n done.catch(() => {});\n ownPromises.add(done);\n return done as Promise<never>;\n };\n entrySetters.set(k, setter);\n }\n return setter;\n }\n\n /** state and loading for an entry's status, with a cancelled first load reported as the query asked */\n function entryState(q: string, entry: Entry, hasData: boolean, enabled: boolean): { state: StatusState; loading: boolean } {\n const loading = entry.status === 'loading';\n const asked = abortedState(q, entry.status === 'idle' && !!entry.aborted, loading, hasData, !enabled);\n if (asked === 'loading') return { state: 'loading', loading: true };\n if (asked === 'idle') return { state: 'idle' as StatusState, loading: false };\n return { state: stateOf(loading, entry.error, hasData, !enabled), loading };\n }\n\n interface EntryHookState {\n mode: 'entry' | 'paged';\n q: string;\n params: unknown; // the last params object: the same one again reuses k (React's Object.is, like hook deps)\n k: string;\n enabled: boolean;\n block: Block;\n sub: (cb: () => void) => () => void;\n snap: () => unknown;\n serverSnap: () => unknown;\n }\n\n // A setter for params that aren't known yet: there's no entry to write\n const waitingSetter = (q: string): SetValue<unknown> => () => {\n throw new Error(`useGlobalState(\"${q}\", params): the params aren't known yet (they're undefined), so there's no entry to write.`);\n };\n\n // useGlobalState(\"feed\", undefined) on a query whose function takes no params: almost surely a\n // wrapper forwarding an empty argument. It waits forever, so say so (once per query).\n const warnedNoParams = new Set<string>();\n function checkWaiting(q: string, paged: boolean) {\n if (warnedNoParams.has(q)) return;\n const fn = (initialState as Record<string, { fetch?: (...a: never[]) => unknown } | undefined>)[q]?.fetch;\n if (typeof fn !== 'function' || fn.length > (paged ? 1 : 0)) return; // it declares params: waiting is right\n warnedNoParams.add(q);\n console.warn(\n `[${name}] useGlobalState(\"${q}\", undefined) is waiting for params, but ${q}'s fetch function takes none${paged ? ' besides the page' : ''}. ` +\n `To read it without params, leave the argument out: useGlobalState(\"${q}\").`\n );\n }\n\n /** useGlobalState(key, params): one params' entry, as [value, setter, status] */\n function useEntryState(q: string, params: unknown, waitingForParams: boolean, block: Block): unknown {\n if (waitingForParams) checkWaiting(q, false);\n const ref = useRef<EntryHookState | KeyHookState | null>(null);\n let c = ref.current as EntryHookState | null;\n const same = c !== null && c.mode === 'entry' && c.q === q && Object.is(c.params, params);\n const k = waitingForParams ? '' : same ? c!.k : cacheKey(q, params); // big filters: keyed once, not per render\n const enabled = !waitingForParams && !block.blocked;\n if (!c || c.mode !== 'entry' || c.k !== k || c.enabled !== enabled || !sameBlock(c.block, block)) {\n const missing = enabled ? PENDING : EMPTY;\n const setter = waitingForParams ? waitingSetter(q) : entrySetter(q, params, k);\n const refetch = enabled ? () => fetchQuery(q, params, true).then(() => {}, () => {}) : noop;\n const why = enabled ? NOT_BLOCKED : { ...block, blocked: true };\n let last: { entry: Entry; tuple: unknown[] } | null = null;\n const tupleOf = (entry: Entry) => {\n if (last && last.entry === entry) return last.tuple;\n const status: Status = owned(\n { ...entryState(q, entry, entry.data !== undefined, enabled), fetching: entry.isFetching, error: entry.error ?? null, ...why, refetch },\n q, () => entry.data !== undefined\n );\n const tuple = [waitingForParams ? undefined : selectedData(q, k, entry.data), setter, status];\n last = { entry, tuple };\n return tuple;\n };\n const onEntry = waitingForParams ? noSubscribe : subscribeTo(entryChannel(k));\n c = {\n mode: 'entry', q, params, k, enabled, block,\n sub: (cb) => {\n const off = onEntry(cb);\n const hide = enabled ? showEntry(q, params, k) : undefined;\n return () => { off(); hide?.(); };\n },\n snap: () => tupleOf((waitingForParams ? undefined : cache.get(k)) ?? missing),\n serverSnap: () => tupleOf((waitingForParams ? undefined : isBrowser ? hydratedEntries.get(k) : cache.get(k)) ?? missing),\n };\n ref.current = c;\n }\n return useSyncExternalStore(c.sub, c.snap, c.serverSnap);\n }\n\n const NO_PAGES: never[] = [];\n\n /** useGlobalState(pagedKey, params?): [pages, undefined, status with page controls] */\n function usePaged(q: string, params: unknown, waitingForParams: boolean, block: Block): unknown {\n if (waitingForParams) checkWaiting(q, true);\n const ref = useRef<EntryHookState | KeyHookState | null>(null);\n let c = ref.current as EntryHookState | null;\n const same = c !== null && c.mode === 'paged' && c.q === q && Object.is(c.params, params);\n const k = waitingForParams ? '' : same ? c!.k : cacheKey(q, params); // big filters: keyed once, not per render\n const enabled = !waitingForParams && !block.blocked;\n if (!c || c.mode !== 'paged' || c.k !== k || c.enabled !== enabled || !sameBlock(c.block, block)) {\n const def = namedDefs[q] as AnyInfinite;\n const missing = enabled ? PENDING : EMPTY;\n // While blocked, the page controls do nothing: no requests until it can run\n const fetchNextPage = enabled ? () => fetchInfinite(q, def, params, 'next').then(() => {}, () => {}) : noop;\n const refetch = enabled ? () => fetchInfinite(q, def, params, 'first', true).then(() => {}, () => {}) : noop;\n const why = enabled ? NOT_BLOCKED : { ...block, blocked: true };\n let last: { entry: Entry; tuple: unknown[] } | null = null;\n const tupleOf = (entry: Entry) => {\n if (last && last.entry === entry) return last.tuple;\n const data = entry.data as InfiniteData | undefined;\n const status: PagedStatus = owned({\n ...entryState(q, entry, data !== undefined, enabled), // more pages loading: still 'ready'\n fetching: entry.isFetching, error: entry.error ?? null, ...why, refetch,\n hasNextPage: enabled && data ? data.next != null : false, fetchNextPage, isFetchingNextPage: !!entry.fetchingNext,\n }, q, () => data !== undefined);\n const tuple = [(waitingForParams ? undefined : data?.pages) ?? NO_PAGES, undefined, status];\n last = { entry, tuple };\n return tuple;\n };\n const onEntry = waitingForParams ? noSubscribe : subscribeTo(entryChannel(k));\n c = {\n mode: 'paged', q, params, k, enabled, block,\n sub: (cb) => {\n const off = onEntry(cb);\n const hide = enabled ? showEntry(q, params, k) : undefined;\n return () => { off(); hide?.(); };\n },\n snap: () => tupleOf((waitingForParams ? undefined : cache.get(k)) ?? missing),\n serverSnap: () => tupleOf((waitingForParams ? undefined : isBrowser ? hydratedEntries.get(k) : cache.get(k)) ?? missing),\n };\n ref.current = c;\n }\n return useSyncExternalStore(c.sub, c.snap, c.serverSnap);\n }\n\n function useHistory() {\n return useSyncExternalStore(\n subscribeTo(HISTORY_CHANNEL),\n () => historyInfo,\n () => historyInfo\n );\n }\n\n function subscribe(listener: (e: ChangeEvent) => void) {\n changeListeners.add(listener);\n let held: typeof listener | undefined = listener; // released after unsubscribing\n return () => {\n if (held) changeListeners.delete(held);\n held = undefined;\n };\n }\n\n /** Public setState: same as the hook setter, so it can also save to the server. */\n function setStateWithServer<K extends StateKey, R = void>(\n key: K,\n value: Updater<RV[K & keyof RV]>,\n serverCall?: () => Promise<R> | R\n ): Promise<R> {\n return update(key, value, serverCall) as Promise<never>; // resolves with what the save returned\n }\n\n /**\n * The state to send to the browser: plain values of every state key (or of the keys `ssr.keys`/`ssr.exclude` choose\n * keys). Query keys are included only once they've loaded, so the browser never mistakes an\n * empty initial value for data. Computed values aren't included; they're recalculated.\n */\n function snapshot(): Partial<RV> & { $queries?: Record<string, unknown>; $ages?: Record<string, number> } {\n const cfg = options.ssr;\n const only = cfg && typeof cfg === 'object' && cfg.keys ? new Set(cfg.keys as string[]) : null;\n const skip = new Set((cfg && typeof cfg === 'object' && (cfg.exclude as string[] | undefined)) || []);\n // ssr: { keys } or { exclude }. By default, a key that persists is left out while the server hasn't\n // changed it: its declared value would overwrite what the browser just restored (a logged-in user\n // would look logged out). A value the server set for this request (createScope({ user }), setState)\n // is sent, so the page hydrates as the server rendered it. ssr.keys sends a key regardless.\n const untouchedSaved = (k: string) => appPersistedKeys.has(k) && Object.is(state[k], (initialState as Record<string, unknown>)[k]);\n const list = { has: (k: string) => (only ? only.has(k) : !skip.has(k) && !untouchedSaved(k)) };\n const now = Date.now();\n // Fails here, naming the value, rather than later as different data in the browser\n const check = (what: string, at: string, value: unknown) => {\n const bad = notJsonSafe(value, at, false);\n if (!bad) return;\n throw new Error(\n `[${name}] snapshot() can't send ${what}: ${bad}. Snapshots travel as JSON, so keep that state to ` +\n `strings, numbers, booleans, null, arrays and plain objects (a Date as an ISO string or a timestamp), ` +\n `or leave it out with ssr: { exclude: [...] }.`\n );\n };\n const out: Record<string, unknown> = { $version: snapshotVersion };\n const ages: Record<string, number> = {};\n for (const k of STATE_KEYS) {\n if (list && !list.has(k)) continue;\n if (isQuery(k) && !meta(k).loaded) continue;\n if (state[k] === undefined)\n throw new Error(\n `[${name}] snapshot() can't send state key \"${k}\": it's undefined, and JSON drops undefined, so the browser ` +\n `would start from the initial value instead. Use null for \"no value\", or leave the key out with ssr: { exclude: [...] }.`\n );\n check(`state key \"${k}\"`, k, state[k]);\n out[k] = state[k];\n // How long ago it loaded, so the browser knows how fresh it is. An age, not a time:\n // the server's and the browser's clocks can disagree by minutes.\n if (isQuery(k)) ages[k] = Math.max(0, now - meta(k).updatedAt);\n }\n // Named and infinite queries that have data (by cache entry), so the browser can render\n // the same HTML and doesn't fetch them again\n const queries: Record<string, { data: unknown; age: number }> = {};\n for (const [k, e] of cache)\n if (e.status === 'success' && e.data !== undefined && (!list || list.has(queryNameOf(k)))) {\n check(`query \"${queryNameOf(k)}\"`, 'data', e.data);\n queries[k] = { data: e.data, age: Math.max(0, now - e.updatedAt) };\n }\n if (Object.keys(queries).length) out.$queries = queries;\n if (Object.keys(ages).length) out.$ages = ages;\n return out as Partial<RV> & { $queries?: Record<string, unknown>; $ages?: Record<string, number> };\n }\n\n function toScript(): string {\n if (!options.name)\n throw new Error(\n `[${name}] toScript() needs the store's name, so the browser can find its data: createStore(state, { name: 'shop', ssr: true }).`\n );\n return `<script type=\"application/json\" id=\"${escapeAttr(dataTagId(name))}\">${serializeSnapshot(snapshot())}</script>`;\n }\n\n const members = {\n ...api, // emit, on, fetchQuery, setQueryData, invalidate, whenOnline, batch, abort\n useGlobalState,\n getState,\n setState: setStateWithServer,\n set,\n actions,\n undo,\n redo,\n goTo,\n useHistory,\n subscribe,\n reset,\n destroy,\n /** Resolves once persisted state has loaded (right away for sync storage) */\n hydrated: whenHydrated,\n /** Undo/redo state now, outside React: { canUndo, canRedo, position, length } */\n getHistory: () => ({ ...historyInfo }),\n snapshot,\n /**\n * The snapshot as a data tag for the HTML: <script type=\"application/json\" id=\"createstore:<name>\">.\n * It never runs (so it works under a strict Content Security Policy) and is escaped, so data like\n * \"</script>\" can't end it. In the browser, hydrate() with no argument finds it.\n */\n toScript,\n };\n // store.cart.add(...): each state key's setter, with its key actions, on the store. They live on\n // its prototype, so the store's own members stay a small object that's fast to read (thousands\n // of keys defined on the store itself made every store.useGlobalState lookup slow).\n // A key named like a store member (reset, set...) stays available as store.set.<key>.\n // Built through a constructor whose prototype holds the setters: V8 keeps such objects in\n // fast-property mode (Object.create + assign left the store in slow dictionary mode).\n const Store = function (this: object) {\n Object.assign(this, members);\n } as unknown as { new (): typeof members; prototype: object };\n Store.prototype = directProtoOf(def, members, name); // shared by every scope of this store\n const store = new Store();\n Object.defineProperty(store, SETTER_OF, { value: setterFor });\n Object.defineProperty(store, SEED, { value: seed });\n Object.defineProperty(store, QUIET, { value: holdingNotify });\n Object.defineProperty(store, DEFINITION, { value: def });\n return store as typeof members & DirectSetters<S, KA>;\n}"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAMA,MAAM,oBAAqB,MAAM,OAAO,cAAuC,IAAI;AAG1F,MAAM,eAAe,oBAAI,IAAoB;AAC7C,MAAM,QAAQ,uBAAO,mBAAmB;AACxC,MAAM,QAAQ,uBAAO,mBAAmB;AACxC,MAAM,cAAc,uBAAO,wBAAwB;AACnD,MAAM,YAAY,uBAAO,sBAAsB;AAExC,SAAS,gBAAgB,MAAc,UAAmB;AAC/D,QAAM,QAAQ,aAAa,IAAI,IAAI;AACnC,UAAQ,KAAK,IAAI,QAAQ;AAC3B;AAuGO,MAAM,oBAAoB,CAAC,YAAoB,MAAM,MAAM,UAAU;AAuG5E,MAAM,qBAAqB;AAE3B,MAAM,YAAY,CAAC,MAAe,EAAE,SAAS,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,SAAI,EAAE,MAAM,GAAG,CAAC,KAAK;AACzF,MAAM,kBAAkB;AACxB,MAAM,eAAe,CAAC,MAAc,KAAS,CAAC;AAK9C,SAAS,YAAY,OAAgB,IAAY,SAAiC;AAGhF,QAAM,QAAgB,CAAC,EAAE,GAAG,OAAO,IAAI,SAAS,OAAO,EAAE,CAAC;AAC1D,QAAM,SAAS,oBAAI,IAAY;AAC/B,SAAO,MAAM,QAAQ;AACnB,UAAM,OAAO,MAAM,IAAI;AACvB,QAAI,WAAW,MAAM;AACnB,aAAO,OAAO,KAAK,KAAK;AACxB;AAAA,IACF;AACA,UAAM,EAAE,GAAG,IAAI,OAAO,SAAS,OAAO,MAAM,IAAI;AAChD,YAAQ,OAAO,GAAG;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AACH;AAAA,MACF,KAAK;AACH,YAAI,OAAO,SAAS,CAAC,EAAG;AACxB,eAAO,GAAG,KAAK,OAAO,CAAC;AAAA,MACzB,KAAK;AAEH,YAAI,MAAO,QAAO,GAAG,KAAK;AAC1B;AAAA,MACF,KAAK;AACH,eAAO,GAAG,KAAK;AAAA,MACjB,KAAK;AACH,eAAO,GAAG,KAAK;AAAA,MACjB,KAAK;AACH,eAAO,GAAG,KAAK;AAAA,IACnB;AACA,QAAI,MAAM,KAAM;AAChB,UAAM,MAAM;AACZ,QAAI,OAAO,IAAI,GAAG,EAAG,QAAO,GAAG,KAAK;AACpC,QAAI,SAAS,mBAAoB,QAAO,GAAG,UAAU,KAAK,CAAC,wBAAwB,kBAAkB;AACrG,QAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,YAAM,QAAQ,OAAO,eAAe,GAAG;AACvC,UAAI,UAAU,OAAO,aAAa,UAAU,MAAM;AAChD,YAAI,eAAe,KAAM,QAAO,GAAG,KAAK;AACxC,YAAI,eAAe,IAAK,QAAO,GAAG,KAAK;AACvC,YAAI,eAAe,IAAK,QAAO,GAAG,KAAK;AACvC,eAAO,GAAG,KAAK,OAAQ,IAAI,aAAa,QAAQ,KAAK,IAAI,YAAY,IAAI,MAAO,kBAAkB;AAAA,MACpG;AAAA,IACF;AACA,WAAO,IAAI,GAAG;AACd,UAAM,KAAK,EAAE,OAAO,IAAI,CAAC;AAEzB,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,eAAS,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,IAAK,OAAM,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK,SAAS,MAAM,OAAO,QAAQ,EAAE,CAAC;AAAA,IAC3H,OAAO;AACL,YAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,eAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,cAAM,IAAI,KAAK,CAAC;AAChB,cAAM,KAAK,EAAE,GAAI,IAAgC,CAAC,GAAG,IAAI,qBAAqB,KAAK,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,KAAK,UAAU,CAAC,CAAC,KAAK,SAAS,OAAO,OAAO,QAAQ,EAAE,CAAC;AAAA,MAChL;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,MAAM,YAAY,CAAC,SAAiB,eAAe,IAAI;AACvD,MAAM,aAAa,CAAC,MAAc,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,QAAQ,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM;AAOtH,SAAS,kBAAkB,UAA2B;AAC3D,SAAO,KAAK,UAAU,QAAQ,EAC3B,QAAQ,MAAM,SAAS,EACvB,QAAQ,MAAM,SAAS,EACvB,QAAQ,MAAM,SAAS,EACvB,QAAQ,WAAW,SAAS,EAC5B,QAAQ,WAAW,SAAS;AACjC;AA4LA,MAAM,gBAAgB,oBAAI,IAAI,CAAC,UAAU,WAAW,aAAa,SAAS,cAAc,UAAU,wBAAwB,aAAa,CAAC;AACxI,MAAM,gBAAgB,oBAAI,IAAI,CAAC,SAAS,aAAa,SAAS,cAAc,UAAU,aAAa,CAAC;AACpG,MAAM,gBAAgB,oBAAI,IAAI,CAAC,SAAS,QAAQ,OAAO,SAAS,CAAC;AAEjE,MAAM,UAAkC;AAAA,EACtC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AACT;AAGA,SAAS,kBAAkB,SAAkC;AAC3D,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,OAAM,IAAI,MAAM,mDAAmD;AAChH,QAAM,KAAK,QAAQ;AACnB,MAAI,OAAO,UAAa,OAAO,aAAa,OAAO;AACjD,UAAM,IAAI,MAAM,+EAA+E,KAAK,UAAU,EAAE,CAAC,GAAG;AACtH,QAAM,QAAQ,WAAW;AACzB,aAAW,KAAK,OAAO,KAAK,OAAO,GAAG;AACpC,SAAK,QAAQ,gBAAgB,eAAe,IAAI,CAAC,EAAG;AACpD,QAAI,SAAS,cAAc,IAAI,CAAC;AAC9B,YAAM,IAAI,MAAM,YAAY,CAAC,0EAA0E,CAAC,gCAAgC;AAC1I,UAAM,IAAI,MAAM,YAAY,QAAQ,CAAC,KAAK,sBAAsB,CAAC,eAAe,CAAC,GAAI,QAAQ,gBAAgB,aAAc,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG;AAAA,EAC9I;AACA,MAAI,OAAO;AACT,UAAM,QAAQ,QAAQ;AACtB,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU,OAAM,IAAI,MAAM,oDAAoD;AAC7G,eAAW,KAAK,OAAO,KAAK,KAAK;AAC/B,UAAI,CAAC,cAAc,IAAI,CAAC;AACtB,cAAM,IAAI,MAAM,iCAAiC,CAAC,6CAA6C,cAAc,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,IAAI,KAAK,CAAC,wCAAwC,EAAE,GAAG;AACrM,QAAI,EAAE,WAAW,OAAQ,OAAM,IAAI,MAAM,iFAAiF;AAC1H,QAAI,OAAO,MAAM,SAAS,WAAY,OAAM,IAAI,MAAM,4GAA4G;AAClK,QAAI,MAAM,YAAY,UAAa,MAAM,YAAY,WAAW,MAAM,YAAY;AAChF,YAAM,IAAI,MAAM,uHAAuH,KAAK,UAAU,MAAM,OAAO,CAAC,GAAG;AAAA,EAC3K;AACF;AAyBO,SAAS,MAAM,OAA+C,UAAkB,CAAC,GAAY;AAClG,MAAI,OAAO,UAAU,WAAY,OAAM,IAAI,MAAM,yEAAyE;AAC1H,oBAAkB,OAAkC;AACpD,SAAO,EAAE,QAAQ,WAAW,UAAU,UAAU,SAAS,OAAO,QAAQ;AAC1E;AAGA,SAAS,gBAAgB,SAAkB,KAAa;AACtD,MAAI,YAAY,OAAW;AAC3B,MAAI,CAAC,WAAW,OAAO,YAAY;AACjC,UAAM,IAAI,MAAM,mBAAmB,GAAG,kEAAkE;AAC1G,aAAW,KAAK,OAAO,KAAK,OAAO;AACjC,QAAI,MAAM,aAAa,MAAM;AAC3B,YAAM,IAAI;AAAA,QACR,mBAAmB,GAAG,wBAAwB,cAAc,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,IAAI,GAAG,CAAC,8CAA8C,CAAC,yBAAyB,sBAAsB,CAAC,wCAAwC;AAAA,MAC1O;AACJ,QAAM,IAAK,QAAuB;AAClC,MAAI,MAAM,UAAa,EAAE,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,OAAO,MAAM,YAAY,aAAa,KAAK,aAAa,CAAC;AAC9H,UAAM,IAAI;AAAA,MACR,mBAAmB,GAAG;AAAA,IAExB;AACJ;AAOO,SAAS,eAAoC;AAClD,SAAO;AACT;AAgBO,SAAS,YAcd,cACA,UAUI,CAAC,GAEwE;AAE7E,MAAI,aAAa;AACf,UAAM,IAAI;AAAA,MACR,IAAI,QAAQ,QAAQ,OAAO;AAAA,IAE7B;AACF,SAAO,WAA4B,cAAc,SAAS,SAA0B,cAAc,OAAO,CAAC;AAC5G;AAGA,MAAM,uBAAuB,oBAAI,IAAY;AAC7C,MAAM,cAAc,oBAAI,IAAY;AACpC,MAAM,QAAQ,uBAAO,mBAAmB;AAExC,SAAS,gBAAgB,cAAsB,MAAsB;AACnE,QAAM,UAAU;AAChB,QAAM,QAAQ,CAAC,MAAgB,KAAK,OAAO,MAAM,WAAW,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;AAC9F,QAAM,YAAa,QAAQ,YAAsD,CAAC,GAAG,IAAI,KAAK,EAAE,KAAK,GAAG;AACxG,QAAM,aAAa,OAAO,QAAS,QAAQ,cAAqD,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG;AACvJ,SAAO,CAAC,MAAM,YAAY,GAAG,UAAU,YAAY,MAAM,OAAO,CAAC,EAAE,KAAK,GAAG;AAC7E;AAEA,SAAS,SAMP,cAAiB,SAAgI;AACjJ,MAAI,CAAC,QAAQ,OAAQ,QAAO,MAAuB,cAAc,OAAO;AACxE,MAAI,OAAO,WAAW,aAAa;AAIjC,UAAM,KAAK,QAAQ,QAAQ;AAC3B,QAAI,CAAC,QAAQ,OAAO,CAAC,qBAAqB,IAAI,EAAE,KAAK,qBAAqB,IAAI,EAAE;AAC9E,cAAQ;AAAA,QACR,IAAI,QAAQ,QAAQ,OAAO;AAAA,MAE7B;AACA,WAAO,MAAuB,cAAc,OAAO;AAAA,EACrD;AACA,QAAM,OAAO,uBAAO,IAAI,eAAe,QAAQ,QAAQ,OAAO,EAAE;AAChE,QAAM,IAAI;AAGV,QAAM,QAAQ,gBAAgB,cAAc,OAAO;AACnD,QAAM,WAAW,EAAE,IAAI;AACvB,MAAI,YAAY,SAAS,KAAK,MAAM,SAAS,CAAC,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI;AACzF,YAAQ;AAAA,MACN,IAAI,QAAQ,QAAQ,OAAO;AAAA,IAE7B;AACF,MAAI,SAAU,QAAO;AACrB,QAAM,QAAQ,MAAuB,cAAc,OAAO;AAC1D,SAAO,eAAe,OAAO,OAAO,EAAE,OAAO,MAAM,CAAC;AACpD,SAAQ,EAAE,IAAI,IAAI;AACpB;AAcA,SAAS,qBAAqB,MAAc,OAAgB,aAAoC;AAC9F,QAAM,eAAe,MAAO,OAAO,EAAE,OAAO,YAAY,EAAsC,EAAE;AAChG,QAAM,UAAU,CAAC,SAAiB;AAChC,UAAM,QAAQ,aAAa;AAC3B,QAAI,UAAU,aAAa;AACzB,YAAM,IAAI;AAAA,QACR,IAAI,IAAI,KAAK,IAAI;AAAA,MAEnB;AACF,WAAO,MAAM;AAAA,EACf;AACA,QAAM,aAAa,CAAC,SAAiB,MAAM;AACzC,UAAM,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,0HAA0H;AAAA,EAC7J;AACA,QAAM,OAAO,CAAC,EAAE,OAAO,SAAS,MAAqE;AACnG,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,IAAI,IAAI,2IAA2I;AACrK,UAAM,QAAQ,SAAU,QAAQ,QAAQ;AACxC,WAAO,cAAc,YAAqB,EAAE,MAAM,UAAU,MAAM,SAAS,EAAE,GAAG,QAAQ;AAAA,EAC1F;AACA,QAAM,MAA+B;AAAA,IACnC;AAAA,IAAa;AAAA,IACb,gBAAgB,WAAW,gBAAgB;AAAA,IAAG,YAAY,WAAW,YAAY;AAAA,IACjF,SAAS,MAAM;AACb,YAAM,IAAI,MAAM,IAAI,IAAI,0GAA0G;AAAA,IACpI;AAAA,EACF;AACA,SAAO,IAAI,MAAM,CAAC,GAAG;AAAA,IACnB,IAAI,IAAI,GAAG;AACT,UAAI,OAAO,MAAM,YAAY,MAAM,OAAQ,QAAO;AAClD,UAAI,KAAK,IAAK,QAAO,IAAI,CAAC;AAC1B,aAAO,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;AAAA,IAC5B;AAAA,IACA,KAAK,CAAC,IAAI,MAAM,OAAO,MAAM,aAAa,KAAK,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,CAAC,EAAE;AAAA,EACnF,CAAC;AACH;AA0BA,MAAM,iBAAiB,oBAAI,QAAgB;AAG3C,MAAM,YAAY,uBAAO,sBAAsB;AAG/C,SAAS,WAOP,cACA,SACA,MAC8D;AAE9D,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,WAAW,MAAM,OAAO,WAAW;AACzC,QAAM,QAAQ,CAAC,CAAC,QAAQ;AAExB,QAAM,MAAO,MAAM,OAAO,cAA2B,IAAI;AACzD,QAAM,SAAS,CAAC,SAAgB,KAAyE,IAAI;AAC7G,QAAM,IAAI;AAEV,QAAM,MAAO,EAAE,SAAS,MAAM;AAAA,IAC5B,gBAAgB,EAAE;AAAA,IAAgB,YAAY,EAAE;AAAA,EAClD;AACA,QAAM,YAAY,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,YAAY,GAAG,YAAY,SAAS,UAAU,CAAC;AACzF,QAAM,aAAc,QAAQ,OAAO,OAAO,QAAQ,QAAQ,YAAY,QAAQ,IAAI,WAAY;AAG9F,QAAM,YAAY,IAAI,QAAgB,CAAC,IAAI,CAAC;AAC5C,QAAM,cAAc,CAAC,YAAwD;AAC3E,UAAM,QAAQ,MAAuB,cAAc;AAAA,MACjD,GAAG;AAAA,MAAS,QAAQ;AAAA,MAAO,SAAS;AAAA,MAAO,UAAU;AAAA,MAAO,SAAS;AAAA,MAAO,UAAU;AAAA,MACtF,GAAI,EAAE,CAAC,WAAW,GAAI,QAAoC,WAAW,KAAK,QAAQ,QAAQ;AAAA;AAAA,IAC5F,GAAI,KAA+C,UAAU,CAAC;AAC9D,QAAI,QAAS,QAAO,KAAK,EAAE,OAAkC;AAC7D,cAAU,IAAI,KAAK;AACnB,WAAO;AAAA,EACT;AAGA,QAAM,cAAc,MAA0B;AAC5C,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,KAAK,IAAI,IAAI,4HAA4H;AACjJ,aAAO;AAAA,IACT;AAIA,UAAM,KAAK,UAAU,IAAI;AACzB,UAAM,OAAO,MAAM,KAAK,SAAS,qBAAqB,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,SAAS,kBAAkB;AAC3H,UAAM,KAAK,KAAK,KAAK,SAAS,CAAC;AAC/B,UAAM,SAAS,SAAS,iBAAiB,QAAQ,GAAG,QAAQ,MAAM,KAAK,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI;AACjG,QAAI,SAAS;AACX,cAAQ,KAAK,IAAI,IAAI,qBAAqB,MAAM,6CAA6C,EAAE,0LAA0L;AAC3R,QAAI,CAAC,IAAI;AACP,cAAQ,KAAK,IAAI,IAAI,sCAAsC,UAAU,IAAI,CAAC,gGAAgG;AAC1K,aAAO;AAAA,IACT;AACA,OAAG,OAAO;AACV,QAAI;AACF,aAAO,KAAK,MAAM,GAAG,eAAe,MAAM;AAAA,IAC5C,QAAQ;AACN,cAAQ,KAAK,IAAI,IAAI,oGAAoG;AACzH,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,UAAU,IAAI,SAAwC;AAC1D,QAAI,WAAW,KAAK,CAAC;AACrB,QAAI,SAAS;AACX,YAAM,IAAI,MAAM,IAAI,IAAI,kGAAkG;AAG5H,QAAI,CAAC,eAAe,IAAI,IAAI,GAAG;AAC7B,qBAAe,IAAI,IAAI;AACvB,UAAI,KAAK,WAAW,EAAG,YAAW,YAAY;AAG9C,YAAM,QAAQ,YAAY,OAAO,aAAa,WAAa,SAAoC,YAAY,IAAK;AAChH,UAAI,UAAU,YAAY;AACxB,gBAAQ,KAAK,IAAI,IAAI,mDAAmD,OAAO,KAAK,CAAC,8BAA8B,UAAU,kEAAkE;AAC/L,eAAO;AAAA,MACT;AACA,UAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,cAAM,QAAiC,CAAC;AACxC,cAAM,aAAuB,CAAC;AAC9B,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC7C,cAAI,UAAU,IAAI,CAAC,EAAG,OAAM,CAAC,IAAI;AAAA,cAC5B,YAAW,KAAK,CAAC;AAAA,QACxB;AAEA,YAAI,WAAW;AACb,kBAAQ,KAAK,IAAI,IAAI,uBAAuB,WAAW,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,0EAA0E;AAClK,eAAO,IAAI,EAAE,KAAK;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,eAAe;AAGnB,QAAM,mBAAmB,oBAAI,QAAgB;AAC7C,QAAM,aAAa,CAAC,aAAsB;AACxC,QAAI,CAAC,YAAY,OAAO,aAAa,YAAY,iBAAiB,IAAI,QAAQ,EAAG;AACjF,qBAAiB,IAAI,QAAQ;AAC7B,QAAI,CAAC,eAAe,IAAI,IAAI,GAAG;AAC7B,cAAQ,QAAuB;AAC/B;AAAA,IACF;AACA,UAAM,OAAO;AACb,SAAK,KAAK,YAAY,OAAO,WAAY;AACzC,UAAM,YAAa,EAAE,UAAU,GAA8B,aAAa,CAAC;AAC3E,UAAM,aAAsC,CAAC;AAC7C,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,EAAG,KAAI,MAAM,cAAc,MAAM,WAAW,KAAK,UAAW,YAAW,CAAC,IAAI;AACpH,WAAO,IAAI,EAAE,UAAU;AAAA,EACzB;AACA,IAAE,KAAK,IAAI;AACX,QAAM,iBAAiB,CAAC,QAAqB,EAAE,KAAK,MAAgD,CAAC,MAAkB,EAAE,IAAI,EAAE;AAC/H,MAAI,QAAQ,QAAQ,CAAC,SAAS,EAAG,cAAa,IAAI,MAAM,IAAI;AAE5D,QAAM,OAAO,CAAC,EAAE,OAAO,SAAS,MAA8C;AAC5E,UAAM,SAAS,WAAW,GAAG;AAI7B,QAAI,UAAU,SAAS,CAAC,iBAAiB,SAAS,KAAK,UAAU,OAAO;AACtE,qBAAe;AACf,cAAQ;AAAA,QACN,SAAS,IACL,IAAI,IAAI,4LAER,IAAI,IAAI;AAAA,MAEd;AAAA,IACF;AACA,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR,IAAI,IAAI;AAAA,MAEV;AACF,QAAI,CAAC,UAAU,IAAI,KAAK;AACtB,YAAM,IAAI,MAAM,IAAI,IAAI,wDAAwD,SAAS,UAAU,eAAe,IAAI,sFAAsF;AAC9M,WAAO,cAAc,IAAI,UAAU,EAAE,OAAO,MAAM,GAAG,QAAQ;AAAA,EAC/D;AAIA,QAAM,cAAc,CAAC,SAA8B;AACjD,UAAM,SAAS,WAAW,GAAG;AAC7B,UAAM,UAAU,WAAW,iBAAiB;AAC5C,QAAI,OAAQ,QAAO,WAAW,OAAO,SAAS;AAC9C,UAAM,OAAO,UAAU,IAAI;AAC3B,QAAI,MAAM;AACR,UAAI,SAAS,GAAG;AAEd,eAAQ,KAAK,UAAU,YAAY,KAAK,QAAiC;AAAA,MAC3E;AAIA,qBAAe,MAAM,WAAW,KAAK,QAAQ,CAAC;AAC9C,aAAO;AAAA,IACT;AACA,QAAI,SAAS,SAAS;AACpB,YAAM,IAAI;AAAA,QACR,IAAI,IAAI,KAAK,IAAI;AAAA,MAEnB;AACF,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,MAAY,SAAkB,KAAsC,IAAI;AAC5F,WAAS,eAAe,GAAW,GAAW,GAAW;AACvD,UAAM,OAAO,YAAY,gBAAgB;AACzC,UAAM,OAAO,OAAO,WAAW,MAAM,gBAAgB,IAAK,IAAI;AAG9D,UAAM,IAAI,UAAU;AACpB,WAAO,MAAM,IAAI,KAAK,CAAC,IAAI,MAAM,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,CAAC;AAAA,EAChE;AACA,WAAS,aAAa;AACpB,UAAM,OAAO,YAAY,YAAY;AACrC,WAAO,OAAO,WAAW,MAAM,YAAY,EAAE,IAAK,IAAI,WAAiB;AAAA,EACzE;AACA,QAAM,QAAiC,EAAE,gBAAgB,YAAY,aAAa,SAAS,KAAK;AAChG,MAAI,IAAK,QAAO,qBAAqB,MAAM,QAAQ,SAAS,QAAW,WAAW;AAElF,MAAI,CAAC,OAAO;AAIV,UAAM,WAAW,CAAC,SAAiB,MAAM;AACvC,YAAM,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,gFAAgF;AAAA,IACnH;AACA,MAAE,cAAc;AAChB,MAAE,OAAO,SAAS,QAAQ;AAC1B,MAAE,UAAU,SAAS,WAAW;AAChC,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS,GAAG;AAGf,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,EAAG,GAAE,CAAC,IAAI;AACnD,WAAO;AAAA,EACT;AAKA,QAAM,OAAO,CAAC,SACZ,IAAI,MAAM,WAAY;AAAA,EAAC,GAAG;AAAA,IACxB,KAAK,CAAC,IAAI,MAAO,MAAM,UAAU,OAAO,MAAM,WAAW,SAAY,KAAK,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,IAChG,OAAO,MAAM;AACX,YAAM,IAAI;AAAA,QACR,IAAI,IAAI,iBAAiB,IAAI,kKAC4D,IAAI;AAAA,MAE/F;AAAA,IACF;AAAA,EACF,CAAC;AACH,SAAO,IAAI,MAAM,MAAM;AAAA,IACrB,IAAI,QAAQ,GAAG,UAAU;AACvB,UAAI,OAAO,MAAM,UAAU;AACzB,YAAI,KAAK,MAAO,QAAO,MAAM,CAAC;AAC9B,YAAI,KAAK,OAAQ,QAAO,KAAK,CAAC;AAAA,MAChC;AACA,aAAO,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AAAA,IACxC;AAAA,EACF,CAAC;AACH;AAeA,MAAM,OAAO,uBAAO,kBAAkB;AACtC,MAAM,kBAAkB,oBAAI,IAAI,CAAC,eAAe,QAAQ,SAAS,CAAC;AAClE,MAAM,iBAAiB,oBAAI,IAAY;AAGvC,MAAM,QAAQ,CAAC,IAAY,WACzB,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,MAAI,OAAO,QAAS,QAAO,OAAO,OAAO,MAAM;AAC/C,QAAM,UAAU,MAAM;AACpB,iBAAa,KAAK;AAClB,WAAO,OAAO,MAAM;AAAA,EACtB;AACA,QAAM,QAAQ,WAAW,MAAM;AAC7B,WAAO,oBAAoB,SAAS,OAAO;AAC3C,YAAQ;AAAA,EACV,GAAG,EAAE;AACL,SAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAC1D,CAAC;AACH,MAAM,aAAa,CAAC,MAClB,KAAK,QAAQ,OAAQ,EAAyB,SAAS;AAIzD,MAAM,gBAAgB;AAEtB,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AACtB,IAAI,YAAY;AAChB,IAAI,WAAW;AACf,MAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EAAoB;AAAA,EAAoB;AAAA,EAAoB;AAAA,EAC5D;AAAA,EAAsB;AAAA,EAA2B;AACnD,CAAC;AAYD,SAAS,UAAU,OAAwB;AACzC,cAAY;AACZ,aAAW;AACX,SAAO,MAAM,OAAO,CAAC,GAAG,CAAC;AAC3B;AAEA,MAAM,WAAW,MAAa;AAC5B,QAAM,IAAI,MAAM,yCAAyC,eAAe,eAAe,IAAI,CAAC,8EAA8E;AAC5K;AAGA,SAAS,MAAM,GAAQ,WAAqB,OAAuB;AACjE,MAAI,EAAE,YAAY;AAChB,UAAM,IAAI,MAAM,yCAAyC,eAAe,eAAe,IAAI,CAAC,8EAA8E;AAC5K,UAAQ,OAAO,GAAG;AAAA,IAChB,KAAK;AACH,WAAK,YAAY,EAAE,UAAU;AAC3B,cAAM,IAAI,MAAM,yCAAyC,cAAc,eAAe,IAAI,CAAC,kFAAkF;AAC/K,aAAO,KAAK,UAAU,CAAC;AAAA,IACzB,KAAK;AAAU,aAAO,OAAO,GAAG,GAAG,EAAE,IAAI,OAAO,OAAO,CAAC;AAAA;AAAA,IACxD,KAAK;AAAW,aAAO,IAAI,SAAS;AAAA,IACpC,KAAK;AAAU,aAAO,GAAG,CAAC;AAAA,IAC1B,KAAK;AAAa,aAAO;AAAA,IACzB,KAAK;AAAU,YAAM,IAAI,MAAM,wCAAwC,OAAO,CAAC,CAAC,IAAI;AAAA,IACpF,KAAK;AAAY,YAAM,IAAI,MAAM,8EAA8E;AAAA,EACjH;AACA,MAAI,MAAM,KAAM,QAAO;AACvB,MAAI,SAAS;AACX,UAAM,IAAI,MAAM,iDAAiD,aAAa,iCAAiC;AACjH,MAAI,UAAU,SAAS,CAAC,EAAG,OAAM,IAAI,MAAM,kFAAkF;AAE7H,QAAM,UAAU,MAAM,QAAQ,CAAC;AAC/B,QAAM,QAAQ,UAAU,MAAM,YAAY,OAAO,eAAe,CAAC;AACjE,QAAM,QAAQ,UAAU,OAAO,aAAa,UAAU;AAGtD,MAAI,MAAM;AACV,MAAI,CAAC,WAAW,CAAC,OAAO;AACtB,UAAM,OAAO,UAAU,SAAS,KAAK,CAAC;AACtC,QAAI,iBAAiB,IAAI,GAAG,EAAG,OAAM,IAAI,MAAM,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC,iCAAiC;AACrG,QAAI,aAAa,KAAM,QAAO,SAAS,EAAE,QAAQ,CAAC;AAClD,QAAI,aAAa,OAAQ,QAAO,WAAW,OAAO,CAAC,CAAC;AACpD,QAAI,aAAa,MAAO,QAAO,UAAU,KAAK,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,OAAO,CAAC;AAC5F,QAAI,QAAQ,qBAAqB,QAAQ,qBAAqB,QAAQ,sBAAsB,QAAQ;AAClG,aAAO,UAAU,MAAM,EAAE,QAAQ,GAAG,WAAW,QAAQ,CAAC,CAAC;AAC3D,QAAI,aAAa,YAAa,QAAO,gBAAgB,MAAM,KAAK,IAAI,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAC5F,QAAI,YAAY,OAAO,CAAC;AACtB,aAAO,IAAI,EAAE,aAAa,QAAQ,MAAM,IAAI,MAAM,KAAK,IAAI,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EAC1H;AAEA,YAAU,KAAK,CAAC;AAChB,MAAI;AACF,UAAM,OAAO,QAAQ;AACrB,QAAI,SAAS;AACX,UAAI,YAAY,EAAE,SAAS,eAAgB,OAAM,SAAS;AAC1D,YAAM,QAAkB,CAAC;AACzB,eAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,OAAM,KAAK,MAAM,EAAE,CAAC,GAAG,WAAW,IAAI,CAAC;AAC1E,aAAO,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,IAC5B;AACA,QAAI,CAAC,OAAO;AACV,UAAI,aAAa,KAAK;AACpB,cAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,IAAI,CAAC,KAAK,MAAM,KAAK,WAAW,IAAI,CAAC,EAAE,EAAE,KAAK;AAC5G,eAAO,QAAQ,MAAM,KAAK,GAAG,CAAC;AAAA,MAChC;AACA,UAAI,aAAa,IAAK,QAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,GAAG,WAAW,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC;AAClG,UAAI,QAAQ,kBAAmB,OAAM,IAAI,MAAM,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC,iCAAiC;AAAA,IACvG;AACA,QAAI,OAAO,EAAE,WAAW,WAAY,QAAO,WAAW,MAAM,EAAE,OAAO,GAAG,WAAW,IAAI,CAAC;AAExF,UAAM,OAAO,OAAO,KAAK,CAAC;AAC1B,QAAI,YAAY,KAAK,SAAS,eAAgB,OAAM,SAAS;AAC7D,QAAI,KAAK,SAAS,EAAG,MAAK,KAAK;AAC/B,QAAI,MAAM;AACV,eAAW,KAAK,MAAM;AACpB,YAAM,OAAO,EAAE,CAAC;AAChB,UAAI,SAAS,OAAW,QAAO,GAAG,MAAM,MAAM,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC,IAAI,MAAM,MAAM,WAAW,IAAI,CAAC;AAAA,IACtG;AACA,UAAM,SAAS,QAAQ,KAAK,EAAE,aAAa,QAAQ;AACnD,WAAO,GAAG,MAAM,IAAI,GAAG;AAAA,EACzB,UAAE;AACA,cAAU,IAAI;AAAA,EAChB;AACF;AAEA,eAAe,UACb,IACA,QACA,SACA,QACA,YACY;AACZ,QAAM,UAAU,OAAO,eAAe,aAAa,aAAa;AAChE,WAAS,UAAU,KAAK,WAAW;AACjC,QAAI;AACF,YAAM,OAAO,MAAM,GAAG,QAAQ,MAAM;AACpC,UAAI,OAAO,QAAS,OAAM,OAAO;AACjC,aAAO;AAAA,IACT,SAAS,GAAG;AACV,UAAI,WAAW,WAAW,OAAO,QAAS,OAAM;AAChD,YAAM,MAAM,QAAQ,UAAU,CAAC,GAAG,MAAM;AAAA,IAC1C;AAAA,EACF;AACF;AAkBA,MAAM,YAAY,uBAAO,sBAAsB;AAC/C,MAAM,aAAa,uBAAO,wBAAwB;AAElD,SAAS,YAAY,GAA4B,GAAoB;AACnE,QAAM,OAAO,OAAO,KAAK,CAAC;AAC1B,MAAI,KAAK,WAAW,OAAO,KAAK,CAAC,EAAE,OAAQ,QAAO;AAClD,aAAW,KAAK,KAAM,KAAI,EAAE,KAAK,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,GAAI,EAA8B,CAAC,CAAC,EAAG,QAAO;AACnG,SAAO;AACT;AACA,MAAM,cAAc,oBAAI,QAA4B;AAEpD,SAAS,aAAa,cAAsB,MAA0B;AACpE,QAAM,QAAQ,YAAY,IAAI,YAAY;AAC1C,MAAI,SAAS,YAAY,MAAM,QAAQ,YAAY,EAAG,QAAO;AAC7D,aAAW,OAAO,OAAO,KAAK,YAAY,GAAG;AAC3C,QAAI,QAAQ,cAAc,QAAQ,cAAc,QAAQ;AACtD,YAAM,IAAI,MAAM,IAAI,IAAI,MAAM,GAAG,mFAAmF;AACtH,QAAI,IAAI,WAAW,IAAQ,EAAG,OAAM,IAAI,MAAM,IAAI,IAAI,gFAAgF;AAAA,EACxI;AAEA,QAAM,YAA+C,uBAAO,OAAO,IAAI;AAEvE,QAAM,YAAuD,uBAAO,OAAO,IAAI;AAC/E,QAAM,SAAkC,uBAAO,OAAO,IAAI;AAC1D,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,YAAY,GAA0B;AAC5E,UAAM,OAAQ,KAAqC;AACnD,QAAI,SAAS,SAAS;AACpB,YAAM,IAAI;AACV,gBAAU,GAAG,IAAI;AACjB,aAAO,GAAG,IAAI,aAAa,EAAE,UAAU,EAAE,QAAQ,UAAU;AAC3D,YAAM,IAAI,EAAE;AACZ,gBAAU,GAAG,IAAI,EAAE,OAAO,CAAC,QAAiB,WAAwB,EAAE,MAAM,QAAQ,MAAM,GAAG,aAAa,EAAE,aAAa,WAAW,EAAE,WAAW,OAAO,EAAE,OAAO,YAAY,EAAE,YAAY,QAAQ,EAAE,OAAO;AAAA,IAC9M,WAAW,SAAS,SAAS;AAC3B,YAAM,IAAI;AACV,YAAM,IAAI,EAAE;AACZ,gBAAU,GAAG,IAAI;AAAA,QACf,QAAQ;AAAA,QAAY,WAAW,EAAE,MAAM;AAAA,QACvC,OAAO,CAAC,MAAe,QAAqB,WAAoB,EAAE,MAAM,MAAM,QAAQ,MAAM;AAAA,QAC5F,UAAU,EAAE,MAAM;AAAA,QAAiC,UAAU,EAAE,MAAM;AAAA,QAAK,SAAS,EAAE,MAAM;AAAA,QAAS,aAAa,EAAE;AAAA,QAAa,WAAW,EAAE;AAAA,QAAW,OAAO,EAAE;AAAA,QAAO,YAAY,EAAE;AAAA,QAAY,QAAQ,EAAE;AAAA,MAC9M;AAAA,IACF,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,QAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,QAAM,WAAW,uBAAO,OAAO,IAAI;AACnC,aAAW,KAAK;AACd,WAAO,eAAe,UAAU,GAAG;AAAA,MACjC,YAAY;AAAA,MACZ,MAAoD;AAClD,eAAO,KAAK,SAAS,EAAE,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AACH,QAAM,aAAyB;AAAA,IAC7B,QAAQ,EAAE,GAAG,aAAa;AAAA,IAC1B;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAW;AAAA,IACzB,WAAW,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,OAAO,CAAC,MAAM,YAAY,UAAU,CAAC,CAAC,CAAC;AAAA,IACjF;AAAA,IAAU,aAAa;AAAA,IAAM,UAAU;AAAA,EACzC;AACA,cAAY,IAAI,cAAc,UAAU;AACxC,SAAO;AACT;AAEA,MAAM,YAAY,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,EAAE;AAE/I,SAAS,cAAc,KAAiB,aAAqB,OAA2B;AACtF,QAAM,QAAQ,IAAI,KAAK;AACvB,MAAI,MAAO,QAAO;AAClB,QAAM,QAAQ,CAAC;AACf,aAAW,KAAK,IAAI,MAAM;AACxB,QAAI,KAAK,eAAe,KAAK,OAAO,UAAW;AAC/C,WAAO,eAAe,OAAO,GAAG;AAAA,MAC9B,YAAY;AAAA,MACZ,MAAoD;AAClD,eAAO,KAAK,SAAS,EAAE,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAQ,IAAI,KAAK,IAAI;AACvB;AAGA,SAAS,cAAc,KAAiB,aAAqB,MAAsB;AACjF,MAAI,IAAI,YAAa,QAAO,IAAI;AAChC,QAAM,QAAQ,CAAC;AACf,aAAW,KAAK,IAAI,MAAM;AACxB,QAAI,KAAK,eAAe,KAAK,OAAO,aAAa,gBAAgB,IAAI,CAAC,GAAG;AACvE,UAAI,CAAC,eAAe,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,GAAG;AACvC,uBAAe,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE;AACjC,gBAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,wEAAwE,CAAC,mBAAmB,CAAC,gBAAgB;AAAA,MAC3I;AACA;AAAA,IACF;AACA,WAAO,eAAe,OAAO,GAAG;AAAA,MAC9B,YAAY;AAAA,MACZ,MAAoD;AAClD,eAAO,KAAK,SAAS,EAAE,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAQ,IAAI,cAAc;AAC5B;AAEA,SAAS,MAOP,cACA,SAGA,kBACA;AAMA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,YAAY,OAAO,WAAW;AAKpC,QAAM,MAAM,oBAAoB,aAAa,cAAc,IAAI;AAC/D,QAAM,YAAY,IAAI;AACtB,QAAM,YAAY,IAAI;AACtB,QAAM,eAAwD,uBAAO,OAAO,IAAI;AAGhF,QAAM,gBAAyC,OAAO,OAAO,IAAI,MAAM;AACvE,QAAM,YAAY,IAAI;AACtB,QAAM,UAAU,CAAC,MAAc,UAAU,IAAI,CAAC;AAE9C,QAAM,iBAAiB,IAAI;AAE3B,aAAW,SAAS,QAAQ,YAAY,CAAC,GAAG;AAC1C,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,UAAI,OAAO,iBAAiB,OAAO;AACjC,cAAM,IAAI,MAAM,aAAa,GAAG,uDAAuD;AACzF,UAAI,OAAO,SAAS;AAClB,cAAM,IAAI,MAAM,aAAa,GAAG,8BAA8B,GAAG,gBAAgB;AACnF,mBAAa,GAAG,IAAI;AAAA,IACtB;AAAA,EACF;AACA,QAAM,UAAU,CAAC,MAAc,OAAO,MAAM,YAAY,KAAK;AAC7D,QAAM,aAAa,CAAC,MAAc,OAAO,MAAM,YAAY,KAAK;AAEhE,QAAM,cAAc,IAAI;AACxB,QAAM,aAAa,CAAC,MAAc,OAAO,MAAM,YAAY,KAAK;AAChE,QAAM,SAAS,CAAC,MAAc,WAAW,CAAC,KAAK,WAAW,CAAC;AAE3D,QAAM,aAAa,IAAI;AACvB,QAAM,WAAW,CAAC,GAAG,YAAY,GAAG,OAAO,KAAK,YAAY,CAAC;AAC7D,QAAM,UAAU,MAAM;AAMtB,QAAM,SAAS,oBAAI,IAAI;AAAA,IACrB;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAe;AAAA,IAAY;AAAA,IAAW;AAAA,IACxD;AAAA,IAAW;AAAA,IAAY;AAAA,IAAW;AAAA,IAAmB;AAAA,EACvD,CAAC;AACD,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,UAAU,oBAAI,QAAgB;AACpC,QAAM,eAAe,CAAC,OAAgB,UAAkB;AACtD,QAAI,OAAO,UAAU,cAAc,QAAQ,IAAI,KAAe;AAC5D,YAAM,IAAI;AAAA,QACR,GAAG,KAAK;AAAA,MACV;AAAA,EACJ;AAOA,WAAS,WACP,MACA,OACA,OACS;AACT,UAAM,MAAM,CAAC,QAAgB;AAC3B,UAAI,CAAC,OAAO,GAAG;AACb,cAAM,IAAI;AAAA,UACR,QAAQ,GAAG,IACP,GAAG,KAAK,WAAW,GAAG,2EAA2E,GAAG,QACpG,GAAG,KAAK,WAAW,GAAG;AAAA,QAC5B;AACF,YAAM,GAAG;AACT,aAAO,KAAK,GAAG;AAAA,IACjB;AACA,UAAM,WAAW,MAAM;AACrB,YAAM,IAAI;AAAA,QACR,6BAA6B,KAAK;AAAA,MACpC;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,MAAM,KAAK;AAAA,MAC3B,OAAO,CAAC,IAAI,OAAO,SAAS,IAAI,KAAK,CAAC,CAAC;AAAA,MACvC,KAAK,CAAC,IAAI,QAAQ;AAChB,YAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,YAAI,OAAO,GAAG,GAAG;AACf,gBAAM,GAAG;AACT,iBAAO,KAAK,GAAG;AAAA,QACjB;AACA,YAAI,CAAC,OAAO,IAAI,GAAG,KAAK,CAAC,OAAO,IAAI,GAAG,GAAG;AACxC,iBAAO,IAAI,GAAG;AACd,kBAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,WAAW,GAAG,+BAA+B;AAAA,QAC9E;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,CAAC,IAAI,QAAQ,OAAO,QAAQ,YAAY,OAAO,GAAG;AAAA,MACvD,SAAS,MAAM;AAEb,cAAM,OAAO,QAAQ;AACrB,aAAK,QAAQ,KAAK;AAClB,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA,MACA,0BAA0B,CAAC,IAAI,QAC7B,OAAO,QAAQ,YAAY,OAAO,GAAG,IACjC,EAAE,YAAY,MAAM,cAAc,MAAM,UAAU,OAAO,OAAO,IAAI,GAAG,EAAE,IACzE;AAAA,MACN,KAAK;AAAA,MACL,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB,CAAC;AACD,YAAQ,IAAI,KAAK;AACjB,WAAO;AAAA,EACT;AAGA,WAAS,aAAa,GAAY,GAAY;AAC5C,QAAI,OAAO,GAAG,GAAG,CAAC,EAAG,QAAO;AAC5B,QAAI,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,CAAC,KAAK,CAAC,EAAG,QAAO;AACvE,QAAI,MAAM,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,EAAG,QAAO;AAClD,QAAI,OAAO,eAAe,CAAC,MAAM,OAAO,eAAe,CAAC,EAAG,QAAO;AAClE,UAAM,KAAK;AACX,UAAM,KAAK;AACX,UAAM,KAAK,OAAO,KAAK,EAAE;AACzB,UAAM,KAAK,OAAO,KAAK,EAAE;AACzB,WAAO,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EAC3E;AAGA,QAAM,QAAiC,EAAE,GAAG,IAAI,OAAO;AAIvD,QAAM,YAAY,oBAAI,IAA6B;AACnD,QAAM,cAAc,oBAAI,IAA4C;AAEpE,MAAI,aAAa;AACjB,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,aAA6B,CAAC;AACpC,QAAM,SAAS,CAACA,aAAoB;AAClC,QAAI,aAAa,GAAG;AAClB,WAAK,IAAIA,QAAO;AAChB;AAAA,IACF;AACA,cAAU,IAAIA,QAAO,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,EAC9C;AACA,QAAM,eAAe,CAACA,cACnB,UAAU,IAAIA,QAAO,GAAG,QAAQ,KAAK;AACxC,QAAM,cAAc,CAACA,aAAoB;AACvC,QAAI,CAAC,YAAY,IAAIA,QAAO,GAAG;AAC7B,kBAAY,IAAIA,UAAS,CAAC,OAAO;AAC/B,YAAI,CAAC,UAAU,IAAIA,QAAO,EAAG,WAAU,IAAIA,UAAS,oBAAI,IAAI,CAAC;AAC7D,kBAAU,IAAIA,QAAO,EAAG,IAAI,EAAE;AAC9B,eAAO,MAAM;AACX,gBAAMC,OAAM,UAAU,IAAID,QAAO;AACjC,UAAAC,MAAK,OAAO,EAAE;AACd,cAAIA,QAAOA,KAAI,SAAS,EAAG,WAAU,OAAOD,QAAO;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,YAAY,IAAIA,QAAO;AAAA,EAChC;AACA,QAAM,cAAc,MAAM,MAAM;AAAA,EAAC;AAUjC,QAAM,gBAAgB,oBAAI,IAA2B;AACrD,QAAM,kBAAkB,oBAAI,IAAuE;AACnG,QAAM,WAAW,uBAAO,UAAU;AAClC,QAAM,SAAS,uBAAO,QAAQ;AAC9B,QAAM,QAAQ,uBAAO,OAAO;AAC5B,QAAM,aAAa,oBAAI,IAAyB;AAEhD,QAAM,QAAQ,oBAAI,IAAoB;AACtC,MAAI,cAAc,oBAAI,IAAY;AAElC,MAAI,WAAW,oBAAI,IAAY;AAC/B,MAAI,kBAAkB;AACtB,QAAM,aAAuB,CAAC;AAG9B,QAAM,eAAe,CAAC,OAAiB,QAAgB;AACrD,UAAM,OAAO,CAAC,GAAG,MAAM,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG;AACrD,UAAM,QAAQ,KAAK,SAAS,KAAK,CAAC,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG,UAAK,GAAG,KAAK,MAAM,EAAE,CAAC,IAAI;AACjF,WAAO,GAAG,MAAM,KAAK,UAAK,CAAC,GAAG,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,CAAC,WAAW,EAAE;AAAA,EACpF;AAEA,WAAS,QAAQ,KAAsB;AACrC,WAAO,WAAW,GAAG,IAAI,aAAa,GAAG,IAAI,UAAU,GAAG;AAAA,EAC5D;AAIA,QAAM,aAAa,oBAAI,IAA4C;AACnE,WAAS,UAAU,KAAsB;AACvC,UAAM,SAAS,UAAU,GAAG,GAAG,QAAQ;AACvC,UAAM,MAAM,MAAM,GAAG;AACrB,QAAI,CAAC,UAAU,QAAQ,OAAW,QAAO;AACzC,UAAM,IAAI,WAAW,IAAI,GAAG;AAC5B,QAAI,KAAK,OAAO,GAAG,EAAE,KAAK,GAAG,EAAG,QAAO,EAAE;AACzC,UAAM,MAAM,OAAO,GAAG;AACtB,eAAW,IAAI,KAAK,EAAE,KAAK,IAAI,CAAC;AAChC,WAAO;AAAA,EACT;AAEA,WAAS,aAAa,KAAsB;AAC1C,UAAM,QAAQ,cAAc,IAAI,GAAG;AACnC,QAAI,CAAC,SAAS,MAAM,MAAO,QAAO,SAAS,GAAG;AAC9C,QAAI,MAAM,UAAU,OAAQ,OAAM,MAAM;AACxC,WAAO,MAAM;AAAA,EACf;AAGA,WAAS,cAAc,KAAa,OAAgB,MAAmB,OAAgB;AACrF,UAAM,QAAQ,cAAc,IAAI,GAAG;AACnC,UAAM,MAAM,OAAO;AACnB,QAAI,OAAO,CAAC,CAAC,OAAO,IAAI,SAAS,KAAK;AACtC,QAAI;AAAM,iBAAW,KAAK,KAAM,KAAI,CAAC,IAAK,IAAI,CAAC,GAAG;AAAE,eAAO;AAAO;AAAA,MAAO;AAAA;AACzE,QAAI,CAAC,MAAM;AAET,UAAI,IAAK,UAAS,GAAG;AAAA,UAChB,qBAAoB,OAAO,GAAG;AACnC,UAAI;AACF,mBAAW,KAAK,KAAK;AACnB,gBAAMC,OAAM,WAAW,IAAI,CAAC;AAC5B,cAAI,CAACA,KAAK;AACV,UAAAA,KAAI,OAAO,GAAG;AACd,cAAIA,KAAI,SAAS,EAAG,YAAW,OAAO,CAAC;AAAA,QACzC;AACF,iBAAW,KAAK,MAAM;AACpB,YAAIA,OAAM,WAAW,IAAI,CAAC;AAC1B,YAAI,CAACA,KAAK,YAAW,IAAI,GAAIA,OAAM,oBAAI,IAAI,CAAE;AAC7C,QAAAA,KAAI,IAAI,GAAG;AAAA,MACb;AAAA,IACF;AACA,QAAI,OAAO;AACT,YAAM,QAAQ;AACd,YAAM,OAAO,OAAO,MAAO;AAC3B,YAAM,QAAQ;AACd,YAAM,QAAQ;AAAA,IAChB,MAAO,eAAc,IAAI,KAAK,EAAE,OAAO,MAAM,MAAM,CAAC;AAAA,EACtD;AAGA,WAAS,iBAAiB,KAAa,OAAO,oBAAI,IAAY,GAAG;AAC/D,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,wBAAoB,OAAO,GAAG;AAC9B,eAAW,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAAA,EAC/D;AAOA,WAAS,SAAS,KAAa;AAC7B,qBAAiB,GAAG;AACpB,aAAS,IAAI,GAAG;AAChB,QAAI,gBAAiB;AACrB,sBAAkB;AAClB,mBAAe,MAAM;AACnB,wBAAkB;AAClB,YAAM,OAAO;AACb,iBAAW,oBAAI,IAAI;AACnB,WAAK,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;AACpC,UAAI,MAAM,KAAM,oBAAmB;AAAA,IACrC,CAAC;AAAA,EACH;AAEA,WAAS,SAAS,KAAsB;AACtC,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,aAAa,WAAW,CAAC,CAAC,uCAAuC,aAAa,YAAY,GAAG,CAAC;AAAA,MAEhG;AACF,eAAW,KAAK,GAAG;AACnB,UAAM,OAAO,oBAAI,IAAY;AAE7B,QAAI,IAAI,gBAAgB,IAAI,GAAG;AAC/B,QAAI,CAAC,GAAG;AACN,YAAMC,UAAS,EAAE,MAAM,KAA2B;AAClD,UAAI,EAAE,QAAAA,SAAQ,QAAQ,WAAW,SAAS,CAAC,MAAM,KAAKA,QAAO,MAAM,IAAI,CAAC,GAAG,aAAa,GAAG,GAAG,EAAE;AAChG,sBAAgB,IAAI,KAAK,CAAC;AAAA,IAC5B;AACA,UAAM,SAAS,EAAE;AACjB,UAAM,YAAY,OAAO;AACzB,WAAO,OAAO;AACd,UAAM,SAAS,EAAE;AACjB,QAAI;AACF,YAAM,QAAQ,aAAa,GAAG,EAAE,MAAe;AAC/C,mBAAa,OAAO,aAAa,GAAG,GAAG;AACvC,oBAAc,KAAK,OAAO,MAAM,KAAK;AACrC,aAAO;AAAA,IACT,SAAS,OAAO;AAGd,oBAAc,KAAK,QAAQ,MAAM,KAAK;AACtC,oBAAc,IAAI,GAAG,EAAG,QAAQ;AAChC,YAAM;AAAA,IACR,UAAE;AACA,aAAO,OAAO;AACd,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF;AAIA,QAAM,gBAAgB,oBAAI,IAA6B;AACvD,QAAM,YAAY,CAAC,QAAgB;AACjC,WAAO,GAAG;AACV,UAAMD,OAAM,cAAc,IAAI,GAAG;AACjC,QAAIA,KAAK,EAAC,GAAGA,IAAG,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,EACxC;AACA,WAAS,cAAc,IAAgB,MAAgB,IAAc;AACnE,eAAW,KAAK,MAAM;AACpB,YAAMA,OAAM,cAAc,IAAI,CAAC;AAC/B,MAAAA,MAAK,OAAO,EAAE;AACd,UAAIA,QAAOA,KAAI,SAAS,EAAG,eAAc,OAAO,CAAC;AAAA,IACnD;AACA,eAAW,KAAK,IAAI;AAClB,UAAI,CAAC,cAAc,IAAI,CAAC,EAAG,eAAc,IAAI,GAAG,oBAAI,IAAI,CAAC;AACzD,oBAAc,IAAI,CAAC,EAAG,IAAI,EAAE;AAAA,IAC9B;AAAA,EACF;AASA,WAAS,WAAW,MAAgB;AAClC,UAAM,QAA0C,CAAC;AACjD,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,QAAQ,CAAC,MAAc;AAC3B,iBAAW,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG;AACvC,YAAI,KAAK,IAAI,CAAC,EAAG;AACjB,aAAK,IAAI,CAAC;AACV,cAAM,QAAQ,cAAc,IAAI,CAAC;AACjC,YAAI,CAAC,MAAO;AACZ,cAAM,KAAK,EAAE,KAAK,GAAG,MAAM,MAAM,QAAQ,WAAW,MAAM,MAAM,CAAC;AACjE,cAAM,QAAQ;AACd,cAAM,CAAC;AAAA,MACT;AAAA,IACF;AACA,SAAK,QAAQ,KAAK;AAElB,SAAK,QAAQ,SAAS;AACtB,eAAW,EAAE,KAAK,GAAG,KAAK,KAAK,OAAO;AAEpC,UAAI,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,EAAG;AAC/C,UAAI;AACJ,UAAI;AACF,eAAO,aAAa,CAAC;AAAA,MACvB,QAAQ;AACN,kBAAU,CAAC;AACX;AAAA,MACF;AACA,UAAI,SAAS,YAAY,CAAC,OAAO,GAAG,MAAM,IAAI,EAAG,WAAU,CAAC;AAAA,IAC9D;AAAA,EACF;AAIA,QAAM,IAAI,QAAQ;AAClB,QAAM,aAAuC,CAAC,IAC1C,OACA,MAAM,QAAQ,MAAM,UACpB,EAAE,SAAS,QAAQ,IACnB,MAAM,YACN,EAAE,SAAS,UAAU,IACrB;AACJ,QAAM,iBAAiB,YAAY,WAAW;AAC9C,QAAM,UAAU,CAAC,SAA8B;AAC7C,QAAI;AACF,aAAO,YACH,SAAS,YACP,iBACA,eACF;AAAA,IACN,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,aAAc,OAAO,QAAQ,YAAY,YAAY,QAAQ,QAAQ,WAAY;AACvF,MAAI,oBAAoB;AACxB,QAAM,eAAe,CAAC,QAAgB,SAAkB;AACtD,QAAI;AACF,YAAM,OAAO,KAAK,UAAU,IAAI;AAChC,YAAM,KAAK,QAAQ,OAAO;AAC1B,UAAI,KAAK,SAAS,YAAY;AAE5B,YAAI,WAAW,GAAG,IAAI,IAAI,MAAM,EAAE;AAClC,YAAI,CAAC,mBAAmB;AACtB,8BAAoB;AACpB,kBAAQ,KAAK,IAAI,IAAI,wCAAwC,KAAK,OAAO,eAAe,IAAI,CAAC,2CAA2C,WAAW,eAAe,IAAI,CAAC,6FAA6F;AAAA,QACtQ;AACA;AAAA,MACF;AACA,UAAI,QAAQ,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI;AAAA,IACvC,QAAQ;AAAA,IAAC;AAAA,EACX;AACA,QAAM,cAAc,CAAK,WAAsC;AAC7D,QAAI,CAAC,QAAQ,QAAS,QAAO,CAAC;AAC9B,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,QAAQ,OAAO,GAAG,QAAQ,GAAG,IAAI,IAAI,MAAM,EAAE,KAAK,IAAI;AAC/E,aAAO,SAAS,OAAO,UAAU,WAAW,QAAQ,CAAC;AAAA,IACvD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAGA,QAAM,gBAAgB,oBAAI,IAAY;AAEtC,WAAS,QAAW,QAA2B,MAAwC,SAAS,CAAC,MAAc,GAAsB;AACnI,QAAI,CAAC,QAAQ,SAAU,QAAO;AAC9B,UAAM,MAAyB,CAAC;AAChC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,UAAI,KAAK;AACT,UAAI;AACF,aAAK,QAAQ,SAAS,OAAO,CAAC,GAAG,GAAG,IAAI,MAAM;AAAA,MAChD,QAAQ;AAAA,MAAC;AACT,UAAI,GAAI,KAAI,CAAC,IAAI;AAAA,eACR,CAAC,cAAc,IAAI,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,GAAG;AACnD,sBAAc,IAAI,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE;AACxC,gBAAQ,KAAK,IAAI,IAAI,0BAA0B,OAAO,CAAC,CAAC,UAAU,SAAS,WAAW,gBAAgB,SAAS,YAAY,qBAAqB,aAAa,KAAK,SAAS,WAAW,+BAA+B,oCAAoC,GAAG;AAAA,MAC9P;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,IAAI,IAAK,YAAY,WAAoC,CAAC,CAAC;AAClF,QAAM,gBAAgB,CAAC,aACnB,CAAC,KACC,WAAW,QAAiC,WAAW,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC/I,QAAM,kBAAkB,IAAI,IAAI,aAAa;AAE7C,QAAM,aAAe,QAAoC,WAAW,KAAK;AACzE,QAAM,mBAAmB,IAAI;AAAA,IAC3B,CAAC,aACG,CAAC,IACC,OAAO,eAAe,YAAa,WAAW,QAC9C,WAAW,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,eAAe,aAAc,WAAW,WAAoC,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,EACrJ;AAEA,MAAI,YAAY,QAAQ,WAAW;AACjC,UAAM,IAAI,MAAM,IAAI,IAAI,yFAAyF;AACnH,aAAW,KAAK,CAAC,GAAK,YAAY,QAAiC,CAAC,GAAI,GAAK,YAAY,WAAoC,CAAC,CAAE;AAC9H,QAAI,CAAC,WAAW,CAAC;AACf,YAAM,IAAI;AAAA,QACR,IAAI,IAAI,oBAAoB,CAAC,SAC1B,WAAW,CAAC,IAAI,yDAAyD,QAAQ,CAAC,IAAI,+DAA+D;AAAA,MAC1J;AACJ,QAAM,iBAAwC,CAAC,aAC3C,OACA,OAAO,WAAW,YAAY,WAC9B,WAAW,UACX,QAAQ,WAAW,WAAW,OAAO;AACzC,QAAM,aAAa,GAAG,IAAI;AAE1B,QAAM,UAAU,CAAC,OAAsB;AACrC,QAAI;AACF,YAAM,IAAI,GAAG;AACb,UAAI,WAAW,CAAC,EAAG,GAAE,KAAK,QAAW,MAAM;AAAA,MAAC,CAAC;AAAA,IAC/C,QAAQ;AAAA,IAAC;AAAA,EACX;AAIA,MAAI,WAAW,CAAC;AAChB,MAAI;AACJ,QAAM,eAAe,IAAI,QAAc,CAAC,MAAO,kBAAkB,CAAE;AAMnE,MAAI,iBAAiB;AACrB,MAAI,cAAc;AAClB,MAAI,gBAA+B;AACnC,QAAM,YAAY,GAAG,UAAU;AAC/B,QAAM,eAAe,CAAC,SAAiB;AACrC,QAAI;AACF,YAAM,IAAI,KAAK,MAAM,IAAI;AACzB,aAAO,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,WAAY;AAAA,IACrD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,UAAU,CAAC,SAAwB;AACvC,QAAI;AACF,aAAO,OAAO,OAAQ,KAAK,MAAM,IAAI,EAA2B,MAAM,KAAK,IAAI;AAAA,IACjF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,UAAU,MAAM;AACpB,iBAAa,SAAS;AACtB,gBAAY;AACZ,QAAI,CAAC,kBAAkB,CAAC,SAAU;AAClC,UAAM,OAAO,OAAO,YAAY,cAAc,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAEvE,UAAM,OAAO,KAAK,UAAU,iBAAiB,EAAE,UAAU,gBAAgB,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,IAAI,EAAE,UAAU,gBAAgB,OAAO,KAAK,CAAC;AACtJ,oBAAgB;AAChB,YAAQ,MAAM;AACZ,YAAM,UAAU,eAAe,QAAQ,YAAY,IAAI;AACvD,UAAI,WAAW,OAAO,GAAG;AACvB,yBAAiB;AACjB;AACA,cAAM,OAAO,MAAM;AAAE;AAAA,QAAe;AACpC,QAAC,QAA6B,KAAK,MAAM,IAAI;AAAA,MAC/C;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,QAAM,cAAc,MAAM;AACxB,QAAI,CAAC,kBAAkB,gBAAgB,KAAK,CAAC,cAAe;AAC5D,UAAM,QAAQ,QAAQ,OAAO;AAC7B,QAAI,CAAC,SAAS,UAAW,eAA4B;AACrD,QAAI;AACF,YAAM,QAAQ,WAAW,aAAa;AAAA,IACxC,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,QAAM,kBAAmB,OAAO,QAAQ,YAAY,YAAY,QAAQ,QAAQ,YAAa;AAC7F,MAAI;AACJ,QAAM,YAAY,MAAM;AACtB,QAAI,CAAC,kBAAkB,CAAC,SAAU;AAClC,QAAI,CAAC,gBAAiB,QAAO,QAAQ;AACrC,iBAAa,SAAS;AACtB,gBAAY,WAAW,SAAS,eAAe;AAAA,EACjD;AAGA,QAAM,YAAY,MAAM;AACtB,QAAI,cAAc,OAAW,SAAQ;AACrC,gBAAY;AAAA,EACd;AACA,QAAM,kBAAkB,MAAM;AAAE,QAAI,SAAS,oBAAoB,SAAU,WAAU;AAAA,EAAG;AACxF,MAAI,aAAa,kBAAkB,OAAO,OAAO,qBAAqB,YAAY;AAChF,WAAO,iBAAiB,YAAY,SAAS;AAC7C,aAAS,iBAAiB,oBAAoB,eAAe;AAAA,EAC/D;AAGA,MAAI,UAAU;AACd,WAAS,UAAU,KAAoD;AACrE,QAAI,OAAO,KAAM,QAAO;AACxB,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,GAAG;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AACA,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,UAAM,MAAM;AACZ,UAAM,SAAS,EAAE,cAAc;AAC/B,UAAM,OAAO,SAAS,IAAK,IAAI;AAC/B,QAAI,SAAkB,SAAS,MAAM,IAAI;AACzC,QAAI,SAAS,gBAAgB;AAC3B,gBAAU;AACV,UAAI,CAAC,WAAY,SAAS;AACxB,gBAAQ,KAAK,IAAI,IAAI,sCAAsC,IAAI,oCAAoC,cAAc,GAAG;AACpH,eAAO;AAAA,MACT;AACA,UAAI;AACF,iBAAS,WAAY,QAAQ,QAAQ,IAAI;AAAA,MAC3C,SAAS,OAAO;AACd,gBAAQ,MAAM,IAAI,IAAI,6DAA6D,KAAK;AACxF,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,UAAU,OAAO,WAAW,WAAY,SAAqC;AAAA,EACtF;AACA,QAAM,OAAO,CAAC,WAA2C;AACvD,UAAM,MAA+B,CAAC;AACtC,QAAI;AAAQ,iBAAW,KAAK,cAAe,KAAI,KAAK,OAAQ,KAAI,CAAC,IAAI,OAAO,CAAC;AAAA;AAC7E,WAAO;AAAA,EACT;AACA,QAAM,kBAAkB,MAAM;AAC5B,eAAW;AACX,QAAI,QAAS,WAAU;AACvB,oBAAgB;AAAA,EAClB;AAEA,MAAI,CAAC,eAAgB,iBAAgB;AAAA,OAChC;AACH,QAAI,MAA8C;AAClD,QAAI;AACF,YAAM,eAAe,QAAQ,UAAU;AAAA,IACzC,QAAQ;AAAA,IAAC;AACT,QAAI,WAAW,GAAG,GAAG;AAEnB,uBAAiB;AACjB,MAAC,IAA+B;AAAA,QAC9B,CAAC,WAAW;AAEV,cAAI,OAAO;AACX,gBAAM,QAAQ,QAAQ,OAAO;AAC7B,cAAI,UAAyB;AAC7B,cAAI;AACF,sBAAU,SAAS,UAAW,iBAA6B,MAAM,QAAQ,SAAS,IAAI;AACtF,gBAAI,WAAW,KAAM,OAAO,WAAW,SAAS;AAAA,UAClD,QAAQ;AAAA,UAAC;AAET,cAAI,WAAW,QAAQ,aAAa,OAAO,KAAK,QAAQ,OAAO,IAAI,QAAQ,MAAM,EAAG,QAAO;AAC3F,gBAAM,SAAS,QAAQ,KAAK,UAAU,IAAI,CAAC,GAAG,SAAS;AACvD,qBAAW;AACX,cAAI,CAAC,UAAW,OAAM,QAAQ,WAAW,uBAAuB,KAAK;AACrE,cAAI,CAAC,aAAa,SAAS,WAAW,WAAW,KAAM,SAAQ;AAC/D,0BAAgB;AAAA,QAClB;AAAA,QACA,CAAC,UAAU;AACT,kBAAQ,MAAM,IAAI,IAAI,oCAAoC,KAAK;AAC/D,0BAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF,OAAO;AAEL,aAAO,OAAO,OAAO,QAAQ,KAAK,UAAU,GAAoB,CAAC,GAAG,SAAS,CAAC;AAE9E,oBAAc,MAAM;AACpB,iBAAW,MAAM;AACjB,sBAAgB;AAAA,IAClB;AAAA,EACF;AAIA,QAAM,UACJ,QAAQ,YAAY,aAAa,sBAAsB,SACnD,IAAI,iBAAiB,eAAe,IAAI,EAAE,IAC1C;AAEN,QAAM,UAAU,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;AAC1E,MAAI,SAAS,QAAQ,QAAQ;AAC3B,UAAM,IAAI,MAAM,IAAI,IAAI,yFAAyF;AACnH,aAAW,KAAK,CAAC,GAAI,SAAS,QAAQ,CAAC,GAAI,GAAI,SAAS,WAAW,CAAC,CAAE;AACpE,QAAI,EAAE,KAAK,eAAgB,OAAM,IAAI,MAAM,IAAI,IAAI,qBAAqB,OAAO,CAAC,CAAC,6BAA6B;AAChH,QAAM,WAAW,SAAS,OAAO,IAAI,IAAY,QAAQ,IAAI,IAAI;AACjE,QAAM,cAAc,IAAI,IAAY,SAAS,WAAW,CAAC,CAAC;AAC1D,QAAM,WAAW,CAAC,MAAe,WAAW,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC;AAKhF,QAAM,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE;AAC1E,MAAI,QAAQ;AACZ,QAAM,SAAS,oBAAI,IAAmB;AACtC,QAAM,UAAU,CAAC,GAAU,MACzB,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;AAWnD,QAAM,MACJ,QAAQ,YACR,aACC,OACE;AACL,MAAI,YAAY;AAChB,MAAI,WAAsC;AAC1C,MAAI;AACF,eAAW,MAAM,IAAI,QAAQ,EAAE,KAAK,CAAC,IAAI;AAAA,EAC3C,SAAS,OAAO;AACd,YAAQ,MAAM,IAAI,IAAI,yCAAyC,KAAK;AAAA,EACtE;AACA,MAAI,iBAAiB;AAErB,QAAM,eAAe,CAAC,QAAiB,OAAgB;AACrD,QAAI,CAAC,YAAY,UAAW;AAC5B,QAAI;AACF,eAAS,KAAK,QAAQ,EAAE;AAAA,IAC1B,SAAS,OAAO;AACd,UAAI,CAAC,gBAAgB;AACnB,yBAAiB;AACjB,gBAAQ,MAAM,IAAI,IAAI,iCAAiC,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAIA,QAAM,kBAAkB,oBAAI,IAA8B;AAI1D,QAAM,IAAI,QAAQ;AAClB,QAAM,eAAe,CAAC,IAAI,IAAI,MAAM,OAAO,MAAM,EAAE,SAAS;AAE5D,QAAM,cACJ,KAAK,MAAM,QAAQ,EAAE,OAAO,IAAI,IAAI,EAAE,IAAgB,IAAI;AAC5D,MAAI;AACF,eAAW,KAAK,aAAa;AAC3B,UAAI,WAAW,CAAC;AACd,cAAM,IAAI;AAAA,UACR,qBAAqB,CAAC;AAAA,QACxB;AACF,UAAI,CAAC,WAAW,CAAC,EAAG,OAAM,IAAI,MAAM,qBAAqB,CAAC,+BAA+B;AAAA,IAC3F;AACF,QAAM,gBAAgB,CAAC,MAAc,CAAC,eAAe,YAAY,IAAI,CAAC;AAOtE,MAAI,OAAe,CAAC;AACpB,MAAI,SAAiB,CAAC;AACtB,MAAI,UAAU;AAEd,MAAI,aAAa;AACjB,MAAI,eAA0D;AAC9D,MAAI,mBAAmB;AAEvB,QAAM,cAAc,oBAAI,QAAgB;AACxC,QAAM,SAAS,CAAC,GAAW,MAAc,OAAO,UAAU,eAAe,KAAK,GAAG,CAAC;AAGlF,WAAS,YAAY,KAAa,SAAiB;AACjD,QAAI,CAAC,gBAAgB,CAAC,cAAc,GAAG,EAAG;AAC1C,QAAI,UAAU;AACd,UAAM,QAAQ,CAAC,SACb,KAAK,QAAQ,CAAC,OAAO;AACnB,UAAI,GAAG,MAAM,WAAW,CAAC,OAAO,GAAG,SAAS,GAAG,EAAG,QAAO,CAAC,EAAE;AAC5D,gBAAU;AACV,YAAM,OAAO,EAAE,GAAG,GAAG,QAAQ;AAC7B,aAAO,KAAK,GAAG;AACf,aAAO,OAAO,KAAK,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI,SAAS,KAAK,CAAC,IAAI,CAAC;AAAA,IAClE,CAAC;AACH,WAAO,MAAM,IAAI;AACjB,aAAS,MAAM,MAAM;AACrB,QAAI,QAAS,mBAAkB;AAAA,EACjC;AACA,MAAI,cAAc,EAAE,SAAS,OAAO,SAAS,OAAO,UAAU,GAAG,QAAQ,EAAE;AAC3E,QAAM,oBAAoB,MAAM;AAC9B,kBAAc;AAAA,MACZ,SAAS,KAAK,SAAS;AAAA,MACvB,SAAS,OAAO,SAAS;AAAA,MACzB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK,SAAS,IAAI,OAAO;AAAA,IACnC;AACA,WAAO,eAAe;AAAA,EACxB;AAGA,WAAS,aAAa;AACpB,UAAM,UAAU;AAChB,mBAAe;AACf,QAAI,CAAC,QAAS;AAEd,eAAW,KAAK,OAAO,KAAK,OAAO;AACjC,UAAI,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAG,QAAO,QAAQ,CAAC;AAC/D,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,EAAG;AACvC,WAAO,CAAC,GAAG,MAAM,EAAE,SAAS,KAAK,UAAU,CAAS,EAAE,MAAM,CAAC,YAAY;AACzE,aAAS,CAAC;AACV,sBAAkB;AAAA,EACpB;AASA,WAAS,MAAS,IAAgB;AAChC;AACA,QAAI,eAAe,KAAK,aAAc,gBAAe,uBAAO,OAAO,IAAI;AACvE,QAAI;AACJ,QAAI;AACF,eAAS,GAAG;AAAA,IACd,UAAE;AACA,UAAI,EAAE,eAAe,GAAG;AACtB,mBAAW;AACX,YAAI,gBAAgB;AAClB,2BAAiB;AACjB,oBAAU;AAAA,QACZ;AACA,YAAI,sBAAsB;AACxB,iCAAuB;AACvB,qBAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,oBAAoB,WAAW,MAAM,KAAK,CAAC,YAAY,IAAI,MAAgB,GAAG;AACjF,yBAAmB;AACnB,cAAQ;AAAA,QACN,IAAI,IAAI;AAAA,MAEV;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAaA,QAAM,QAAQ,oBAAI,IAAkB;AACpC,QAAM,eAAe,oBAAI,IAA6B;AACtD,QAAM,OAAO,CAAC,MAAoB;AAChC,QAAI,CAAC,MAAM,IAAI,CAAC;AACd,YAAM,IAAI,GAAG,EAAE,QAAQ,OAAO,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,MAAM,CAAC;AAC3F,WAAO,MAAM,IAAI,CAAC;AAAA,EACpB;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,QAAQ,QAAS;AACtB,UAAM,OAAO,OAAO;AAAA,MAClB,OAAO,KAAK,SAAS,EAClB,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,GAAG,WAAW,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,IACrE;AACA,iBAAa,UAAU,IAAI;AAAA,EAC7B;AACA,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,YAAyD,QAAQ,GAAG,SAAS,CAAC,GAAG;AAC3H,QAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,OAAO,MAAM,YAAY,EAAE,UAAU,GAAI;AAClE,UAAM,CAAC,IAAI,EAAE;AACb,WAAO,OAAO,KAAK,CAAC,GAAG,EAAE,QAAQ,MAAM,WAAW,EAAE,UAAU,CAAC;AAC/D,eAAW,OAAO,CAAC;AAAA,EACrB;AAKA,QAAM,SAAS,CAAC,IAAgB,SAAiB;AAC/C,QAAI;AACF,SAAG;AAAA,IACL,SAAS,OAAO;AACd,cAAQ,MAAM,IAAI,IAAI,KAAK,IAAI,oBAAoB,KAAK;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,aAAa;AACjB,QAAM,YAAY,CAAC,YAAqB;AACtC,QAAI,CAAC,QAAS;AACd,QAAI;AACF,cAAQ,YAAY,OAAO;AAAA,IAC7B,SAAS,OAAO;AAEd,UAAI,CAAC,YAAY;AACf,qBAAa;AACb,gBAAQ,KAAK,IAAI,IAAI,2CAA2C,KAAK;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAIA,QAAM,cAAc;AACpB,MAAI,aAAa;AAEjB,MAAI,kBAAkB;AACtB,QAAM,eAAe,CAAC,SAAiB;AACrC,QAAI,CAAC,iBAAiB;AACpB,wBAAkB;AAClB,cAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,uFAAuF;AAAA,IACvH;AAAA,EACF;AACA,WAAS,MACP,QACA,QACA,OACA,gBAAgB,MAChB;AACA,QAAI,UAAW,QAAO,aAAa,MAAM,WAAW,MAAM,IAAI,aAAa,MAAM,MAAM,CAAC,CAAC,OAAO,KAAK;AACrG,QAAI,cAAc;AAChB,YAAM,IAAI;AAAA,QACR,IAAI,IAAI,kBAAkB,WAAW,8CAA8C,KAAK;AAAA,MAE1F;AACF;AACA,QAAI;AACF,eAAS,QAAQ,QAAQ,OAAO,aAAa;AAAA,IAC/C,UAAE;AACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,SACP,QACA,QACA,OACA,eACA;AACA,UAAM,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,MAC/B,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,IACxD;AACA,QAAI,KAAK,WAAW,EAAG;AAGvB,UAAM,OAAgC,CAAC;AACvC,eAAW,KAAK,MAAM;AACpB,WAAK,CAAC,IAAI,MAAM,CAAC;AACjB,YAAM,CAAC,IAAI,OAAO,CAAC;AAAA,IACrB;AAEA,QAAI,WAAW,WAAW,cAAe,YAAW,MAAM,IAAI;AAC9D,sBAAkB,MAAM,MAAM;AAC9B,mBAAe,IAAI;AACnB,QAAI,WAAW,YAAY,WAAW,aAAa,WAAW,UAAW,kBAAiB,IAAI;AAC9F,QAAI,WAAW,WAAY,cAAa,EAAE,MAAM,MAAM,GAAG,KAAK;AAC9D,YAAQ,GAAG,IAAI;AACf,qBAAiB,MAAM,MAAM,QAAQ,KAAK;AAAA,EAC5C;AAGA,WAAS,WAAW,MAAgB,MAA+B;AACjE,QAAI,CAAC,aAAc;AACnB,UAAM,UAAU,KAAK,OAAO,aAAa;AAGzC,QAAI,CAAC,QAAQ,OAAQ;AACrB,QAAI,cAAc;AAEhB,iBAAW,KAAK,SAAS;AACvB,YAAI,OAAO,cAAc,CAAC,EAAG,cAAa,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC;AAAA,YACpD,cAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,MAC3C;AACA;AAAA,IACF;AACA,UAAM,UAAU,OAAO,YAAY,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,WAAO,CAAC,GAAG,MAAM,EAAE,SAAS,KAAK,UAAU,CAAS,EAAE,MAAM,CAAC,YAAY;AACzE,aAAS,CAAC;AACV,sBAAkB;AAAA,EACpB;AAGA,WAAS,kBAAkB,MAAgB,QAA+B;AACxE,eAAW,KAAK,MAAM;AAGpB,UAAI,WAAW,WAAW,WAAW,SAAU,UAAS,OAAO,CAAC;AAEhE,UAAI,WAAW,YAAY,QAAQ,CAAC,EAAG,MAAK,CAAC,EAAE;AAAA,IACjD;AAAA,EACF;AAGA,MAAI,iBAAiB;AACrB,MAAI,uBAAuB;AAC3B,WAAS,eAAe,MAAgB;AACtC,UAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,gBAAgB,IAAI,CAAC,CAAC;AACrD,UAAM,SAAS,KAAK,KAAK,OAAO;AAChC,QAAI,aAAa,GAAG;AAClB,yBAAmB;AACnB,+BAAyB;AACzB;AAAA,IACF;AACA,QAAI,MAAO,WAAU;AACrB,QAAI,OAAQ,YAAW;AAAA,EACzB;AAGA,QAAM,cAAc,oBAAI,IAAY;AACpC,MAAI,aAAa;AACjB,WAAS,iBAAiB,MAAgB;AACxC,QAAI,CAAC,QAAS;AACd,eAAW,KAAK,KAAM,KAAI,SAAS,CAAC,EAAG,aAAY,IAAI,CAAC;AACxD,QAAI,YAAY,QAAQ,CAAC,YAAY;AACnC,mBAAa;AACb,qBAAe,cAAc;AAAA,IAC/B;AAAA,EACF;AACA,WAAS,iBAAiB;AACxB,iBAAa;AACb,QAAI,CAAC,WAAW,CAAC,YAAY,KAAM;AAEnC,UAAM,QAAe,CAAC,EAAE,OAAO,KAAK;AACpC,UAAM,OAAO,CAAC,GAAG,WAAW;AAC5B,gBAAY,MAAM;AAClB,SAAK,QAAQ,CAAC,MAAM,OAAO,IAAI,GAAG,KAAK,CAAC;AACxC,cAAU,EAAE,MAAM,SAAS,OAAO,QAAQ,OAAO,YAAY,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAAA,EAChG;AAGA,WAAS,iBACP,MACA,MACA,QACA,OACA;AACA,eAAW,OAAO,MAAM;AACtB,YAAM,QAAqB;AAAA,QACzB;AAAA,QACA,MAAM,KAAK,GAAG;AAAA,QACd,MAAM,MAAM,GAAG;AAAA,QACf;AAAA,QACA,MAAM,KAAK,IAAI;AAAA,MACjB;AACA,YAAM,UAAU,MAAM;AACpB,YAAI,QAAQ,SAAU,QAAO,MAAM,QAAQ,SAAU,KAAK,GAAG,UAAU;AACvE,SAAC,GAAG,eAAe,EAAE,QAAQ,CAAC,MAAM,OAAO,MAAM,EAAE,KAAK,GAAG,oBAAoB,CAAC;AAChF,YAAI,QAAQ,OAAQ,SAAQ,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,UAAK,MAAM,IAAI;AAAA,MACnF;AAGA,UAAI,aAAa,EAAG,YAAW,KAAK,OAAO;AAAA,UACtC,SAAQ;AAAA,IACf;AAAA,EACF;AAMA,WAAS,SAAS,KAAuB;AACvC,QAAI,QAAQ,OAAW,QAAO,QAAQ,GAAG;AACzC,UAAM,UAAU,OAAO,KAAK,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;AACzE,UAAM,WAAW,OAAO,KAAK,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AACpE,WAAO,EAAE,GAAG,OAAO,GAAG,OAAO,YAAY,QAAQ,GAAG,GAAG,OAAO,YAAY,OAAO,EAAE;AAAA,EACrF;AAEA,MAAI,YAAY;AAGhB,WAAS,SAAS,KAAa,OAAsB;AACnD,QAAI,WAAW;AACb,YAAM,IAAI;AAAA,QACR,aAAa,GAAG,iCAAiC,WAAW,WAAW,SAAS,CAAC,CAAC;AAAA,MAEpF;AACF,QAAI,YAAY;AACd,YAAM,IAAI;AAAA,QACR,aAAa,GAAG;AAAA,MAElB;AACF,QAAI,WAAW,GAAG;AAChB,YAAM,IAAI;AAAA,QACR,IAAI,GAAG;AAAA,MACT;AACF,QAAI,CAAC,WAAW,GAAG;AACjB,YAAM,IAAI,MAAM,IAAI,GAAG,wBAAwB;AAGjD,QAAI,YAAY,GAAG;AACjB,mBAAa,KAAK,MAAM,SAAS,KAAK,KAAK,CAAC;AAC5C;AAAA,IACF;AACA,QAAI;AACJ,QAAI,OAAO,UAAU,YAAY;AAC/B;AACA,UAAI;AACF,eAAQ,MAAqC,MAAM,GAAG,CAAC;AAAA,MACzD,SAAS,OAAO;AACd,qBAAa,SAAS;AACtB,cAAM;AAAA,MACR,UAAE;AACA;AAAA,MACF;AACA,UAAI,QAAQ,OAAQ,KAA4B,SAAS,WAAY;AAAA,QAAS,WAAW,GAAG;AAAA,QAC1F,IAAI,IAAI,sBAAsB,GAAG;AAAA,MAAwH;AAAA,IAC7J,OAAO;AACL,aAAO;AACP,UAAI,QAAQ,OAAO,SAAS,YAAY,iBAAiB,QAAQ,OAAQ,KAAsC,mBAAmB;AAChI,iBAAS,SAAS,GAAG,IAAI,IAAI,IAAI,eAAe,GAAG,+GAA+G;AAAA,IACtK;AACA,YAAQ,KAAK,KAAK;AAClB,UAAM,EAAE,CAAC,GAAG,GAAG,KAAK,GAAG,SAAS,OAAO,GAAG,EAAE;AAC5C,QAAI,cAAc,KAAK,aAAa,OAAQ,YAAW,OAAO,aAAa,OAAO,CAAC,EAAG,KAAI;AAAA,EAC5F;AACA,MAAI,YAAY;AAChB,QAAM,eAA+B,CAAC;AACtC,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,WAAW,CAAC,IAAY,YAAoB;AAChD,QAAI,aAAa,IAAI,EAAE,EAAG;AAC1B,iBAAa,IAAI,EAAE;AACnB,YAAQ,KAAK,OAAO;AAAA,EACtB;AAaA,QAAM,WAAW,oBAAI,IAAwD;AAC7E,MAAI,YAAY;AAChB,MAAI,YAAY;AAChB,QAAM,aAAa,CAAC,MAClB,SAAS,IAAI,CAAC,GAAG,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAErD,QAAM,aAAa,uBAAO,YAAY;AAEtC,WAAS,QAAQ,KAAa,QAAiB;AAC7C,QAAI,IAAI,SAAS,IAAI,GAAG;AACxB,QAAI,CAAC,KAAK,CAAC,UAAW;AACtB,QAAI,KAAK,CAAC,aAAa,OAAO,WAAW,YAAY;AAInD,QAAE,OAAO;AACT,QAAE,UAAU,EAAE,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,WAAW,EAAE;AACxF,UAAI,EAAE,QAAQ,WAAW,EAAG,UAAS,OAAO,GAAG;AAC/C;AAAA,IACF;AACA,QAAI,CAAC,GAAG;AACN,UAAI,EAAE,MAAM,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE;AACpC,eAAS,IAAI,KAAK,CAAC;AAAA,IACrB;AACA,MAAE,QAAQ,KAAK,EAAE,IAAI,WAAW,QAAQ,SAAS,cAAc,EAAE,CAAC;AAAA,EACpE;AAMA,WAAS,OACP,KACA,OACA,YACe;AACf,QAAI,CAAC,YAAY;AACf,eAAS,KAAK,KAAK;AACnB,YAAM,OAAO,QAAQ,QAAQ;AAC7B,kBAAY,IAAI,IAAI;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,EAAE;AACb,UAAM,WAAW;AACjB,UAAM,QAAQ;AACd,gBAAY;AACZ,QAAI;AACF,eAAS,KAAK,KAAK;AAAA,IACrB,UAAE;AACA,kBAAY;AAAA,IACd;AACA,UAAM,UAAU,CAAC,GAAG,QAAQ,EACzB,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EACpD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAEjB,UAAM,SAAS,CAAC,IAAa,UAAoB;AAC/C,YAAM,SAAmB,CAAC;AAC1B,iBAAW,KAAK,SAAS;AACvB,cAAM,IAAI,SAAS,IAAI,CAAC;AACxB,YAAI,GAAG;AACL,cAAI,IAAI;AACN,cAAE,QAAQ,QAAQ,CAAC,MAAM;AAAE,kBAAI,EAAE,OAAO,GAAI,GAAE,UAAU;AAAA,YAAO,CAAC;AAAA,UAClE,OAAO;AACL,cAAE,UAAU,EAAE,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAC/C,gBAAI,OAAO,EAAE;AACb,uBAAW,KAAK,EAAE,SAAS;AACzB,kBAAI,EAAE,WAAW,WAAY;AAC7B,kBAAI;AACF,uBAAO,OAAO,EAAE,WAAW,aAAc,EAAE,OAAsC,IAAI,IAAI,EAAE;AAAA,cAC7F,QAAQ;AAAA,cAAC;AAAA,YACX;AACA,kBAAM,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,SAAS,YAAY,GAAG,IAAI,KAAK;AAAA,UACxD;AACA,cAAI,CAAC,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAG,UAAS,OAAO,CAAC;AAAA,QAC1D,WAAW,CAAC,MAAM,QAAQ,CAAC,GAAG;AAI5B,eAAK,CAAC,EAAE,eAAe;AAAA,QACzB;AACA,YAAI,CAAC,GAAI,aAAY,GAAG,QAAQ;AAEhC,YAAI,QAAQ,CAAC,GAAG;AACd,gBAAM,IAAI,KAAK,CAAC;AAChB,YAAE;AACF,cAAI,CAAC,GAAI,WAAU,GAAG,EAAE,MAAM,CAAC;AAC/B,cAAI,MAAM,UAAU,CAAC,EAAE,QAAQ,qBAAsB,GAAE,eAAe;AACtE,cAAI,EAAE,gBAAgB,CAAC,WAAW,CAAC,GAAG;AACpC,cAAE,eAAe;AACjB,mBAAO,KAAK,CAAC;AAAA,UACf;AAAA,QACF;AAAA,MACF;AACA,aAAO,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,QAAQ,GAAG,IAAI,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAC,CAAC;AAAA,IACxE;AAEA,UAAM,UAAU,QAAQ,QAAQ,EAC7B,KAAK,UAAU,EACf;AAAA,MACC,OAAO,WAAW;AAChB,cAAM,OAAO,IAAI;AACjB,eAAO;AAAA,MACT;AAAA,MACA,CAAC,UAAU;AAGT,YAAI,CAAC,YAAa,QAAO,OAAO,KAAK;AACrC,cAAM;AAAA,MACR;AAAA,IACF;AACF,YAAQ,MAAM,MAAM;AAAA,IAAC,CAAC;AACtB,gBAAY,IAAI,OAAO;AACvB,WAAO;AAAA,EACT;AAGA,MAAI,cAAc;AAClB,MAAI,aAAa,OAAO,OAAO,qBAAqB,YAAY;AAC9D,WAAO,iBAAiB,YAAY,MAAM;AAAE,oBAAc;AAAA,IAAM,CAAC;AACjE,WAAO,iBAAiB,YAAY,MAAM;AAAE,oBAAc;AAAA,IAAO,CAAC;AAAA,EACpE;AAIA,QAAM,iBAAyB,OAAO,OAAO;AAAA,IAC3C,OAAO;AAAA,IAAW,SAAS;AAAA,IAAM,UAAU;AAAA,IAAO,OAAO;AAAA,IAAM,SAAS;AAAA,IAAO,WAAW;AAAA,IAAM,WAAW;AAAA,IAC3G,SAAS,MAAM,QAAQ,QAAQ;AAAA,EACjC,CAAC;AAED,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,eAAuB,OAAO,OAAO;AAAA,IACzC,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,SAAS,MAAM,QAAQ,QAAQ;AAAA,EACjC,CAAC;AAED,QAAM,aAAa,oBAAI,QAAyD;AAChF,QAAM,QAAQ,CAAmB,QAAW,KAAa,YAA8B;AACrF,eAAW,IAAI,QAAQ,EAAE,KAAK,QAAQ,CAAC;AACvC,WAAO;AAAA,EACT;AACA,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,sBAAsB,oBAAI,IAAoB;AAGpD,QAAM,gBAAgB,CAAC,MAAc,YAAgB,CAAC;AAEtD,QAAM,aAAa,CAAC,QAClB,MAAM;AAAA,IACJ,OAAO,KAAK,GAAG,EAAE,SAAS,UAAU;AAAA,IACpC,SAAS,CAAC,KAAK,GAAG,EAAE;AAAA,IACpB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,SAAS,MAAM,QAAQ,KAAK,IAAI,EAAE,KAAK,MAAM;AAAA,IAAC,GAAG,MAAM;AAAA,IAAC,CAAC;AAAA,EAC3D,GAAG,KAAK,MAAM,KAAK,GAAG,EAAE,MAAM;AAEhC,WAAS,UAAU,KAAa,OAAwB;AACtD,UAAM,OAAO,EAAE,GAAI,SAAS,IAAI,GAAG,KAAK,WAAW,GAAG,GAAI,GAAG,MAAM;AACnE,SAAK,QAAQ,QAAQ,KAAK,SAAS,KAAK,OAAO,KAAK,GAAG,EAAE,QAAQ,KAAK;AACtE,UAAM,QAAQ,aAAa,KAAK,CAAC,CAAC,KAAK,GAAG,EAAE,SAAS,KAAK,WAAW,KAAK,UAAU,KAAK,GAAG,EAAE,QAAQ,KAAK;AAC3G,QAAI,UAAU,WAAW;AACvB,WAAK,QAAQ;AACb,WAAK,UAAU;AAAA,IACjB,WAAW,UAAU,OAAQ,CAAC,KAA2B,QAAQ;AACjE,aAAS,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,KAAK,GAAG,EAAE,MAAM,CAAC;AAC1D,kBAAc,GAAG;AAAA,EACnB;AAGA,WAAS,aAAa,GAAW,SAAkB,SAAkB,SAAkB,SAAsC;AAC3H,QAAI,CAAC,WAAW,WAAW,WAAW,QAAS,QAAO;AACtD,WAAQ,UAAU,CAAC,GAAiD,eAAe;AAAA,EACrF;AACA,WAAS,QAAQ,SAAkB,OAAgB,SAAkB,SAA+B;AAClG,QAAI,QAAS,QAAO;AACpB,QAAI,QAAS,QAAO;AACpB,QAAI,SAAS,QAAQ,CAAC,QAAS,QAAO;AACtC,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,KAAa,OAAO,oBAAI,IAAY,GAAG;AAC5D,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,WAAO,cAAc,GAAG,CAAC;AACzB,eAAW,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM;AAClC,0BAAoB,OAAO,CAAC;AAC5B,oBAAc,GAAG,IAAI;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,WAAS,UAAU,KAAqB;AACtC,QAAI,QAAQ,GAAG,GAAG;AAChB,UAAI,CAAC,SAAS,IAAI,GAAG,EAAG,UAAS,IAAI,KAAK,WAAW,GAAG,CAAC;AACzD,aAAO,SAAS,IAAI,GAAG;AAAA,IACzB;AACA,QAAI,WAAW,GAAG,GAAG;AACnB,YAAM,SAAS,oBAAoB,IAAI,GAAG;AAC1C,UAAI,OAAQ,QAAO;AACnB,mBAAa,GAAG;AAChB,YAAM,QAAQ,CAAC,GAAG,cAAc,IAAI,GAAG,EAAG,IAAI,EAAE,IAAI,SAAS;AAC7D,YAAM,WAAmB,MAAM;AAAA,QAC7B,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS,IAAI,YAAY,MAAM,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO,IAAI,UAAU;AAAA,QACjH,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,QACpC,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ;AAAA,QACtC,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS;AAAA,QAC5C,SAAS;AAAA,QACT,WAAW;AAAA,QACX,WAAW;AAAA,QACX,SAAS,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,MAAM;AAAA,QAAC,CAAC;AAAA,MACzE,GAAG,KAAK,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;AAC3C,0BAAoB,IAAI,KAAK,QAAQ;AACrC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAIA,WAAS,QAAQ,KAAa,QAAQ,OAAyB;AAC7D,QAAI,UAAW,QAAO,QAAQ,OAAO,IAAI,MAAM,IAAI,IAAI,MAAM,GAAG,+BAA+B,CAAC;AAChG,UAAME,OAAM,UAAU,GAAG;AACzB,UAAM,IAAI,KAAK,GAAG;AAClB,UAAM,QACJ,EAAE,UAAU,KAAK,IAAI,IAAI,EAAE,aAAaA,KAAI,QAAQ,aAAa;AACnE,QAAI,SAAS,CAAC,MAAO,QAAO,QAAQ,QAAQ,MAAM,GAAG,CAAC;AACtD,QAAI,EAAE,SAAU,QAAO,EAAE;AACzB,QAAI,aAAa,CAAC,UAAU,UAAU,EAAE;AACtC,aAAO,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAEnC,MAAE,UAAU;AACZ,cAAU,KAAK,EAAE,UAAU,MAAM,SAAS,CAAC,EAAE,OAAO,CAAC;AACrD,UAAM,eAAe,EAAE;AACvB,UAAM,aAAa,IAAI,gBAAgB;AACvC,iBAAa,IAAI,KAAK,UAAU;AAChC,UAAM,UAA4B;AAAA,MAChC,CAAC,SAAS,WAAWA,KAAI,MAAM,QAAW,MAAM;AAAA,MAChD;AAAA,MACAA,KAAI,QAAQ,SAAS;AAAA,MACrB,WAAW;AAAA,MACXA,KAAI,QAAQ;AAAA,IACd,EAAE;AAAA,MACA,CAAC,SAAS;AACR,YAAI,EAAE,aAAa,QAAS,GAAE,WAAW;AAGzC,YAAI,EAAE,YAAY,gBAAgB,WAAW,GAAG,GAAG;AACjD,YAAE,YAAY;AACd,cAAI,WAAW,GAAG,GAAG;AACnB,cAAE,eAAe;AACjB,sBAAU,KAAK,EAAE,UAAU,MAAM,CAAC;AAClC,mBAAO,MAAM,GAAG;AAAA,UAClB;AACA,iBAAO,QAAQ,KAAK,IAAI;AAAA,QAC1B;AACA,UAAE,SAAS;AACX,UAAE,YAAY,KAAK,IAAI;AACvB,UAAE,eAAe;AACjB,cAAM,EAAE,CAAC,GAAG,GAAG,KAAK,GAAG,UAAU,UAAU,GAAG,EAAE;AAChD,kBAAU,KAAK,EAAE,SAAS,OAAO,UAAU,OAAO,OAAO,KAAK,CAAC;AAC/D,eAAO;AAAA,MACT;AAAA,MACA,CAAC,UAAU;AACT,YAAI,EAAE,aAAa,QAAS,GAAE,WAAW;AAEzC,YAAI,WAAW,OAAO,SAAS;AAE7B,cAAI,aAAa,IAAI,GAAG,MAAM,YAAY;AACxC,cAAE,UAAU;AACZ,sBAAU,KAAK,EAAE,SAAS,OAAO,UAAU,MAAM,CAAC;AAAA,UACpD;AAAA,QACF,MAAO,WAAU,KAAK,EAAE,SAAS,OAAO,UAAU,OAAO,MAAM,CAAC;AAChE,cAAM;AAAA,MACR;AAAA,IACF,EAAE,QAAQ,MAAM;AACd,UAAI,aAAa,IAAI,GAAG,MAAM,WAAY,cAAa,OAAO,GAAG;AAAA,IACnE,CAAC;AACD,MAAE,WAAW;AACb,WAAO;AAAA,EACT;AAGA,WAAS,YACP,KACA,OAAO,oBAAI,IAAY,GACvB,MAAM,oBAAI,IAAY,GACT;AACb,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,SAAK,IAAI,GAAG;AACZ,QAAI,QAAQ,GAAG,EAAG,KAAI,IAAI,GAAG;AAAA,aACpB,WAAW,GAAG,GAAG;AACxB,UAAI;AACF,qBAAa,GAAG;AAAA,MAClB,QAAQ;AAAA,MAER;AACA,oBAAc,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AAIA,WAAS,KAAK,UAAkB;AAC9B,QAAI,aAAa;AACf,YAAM,IAAI,MAAM,IAAI,IAAI,qEAAqE;AAC/F,QACE,CAAC,OAAO,UAAU,QAAQ,KAC1B,WAAW,KACX,WAAW,KAAK,SAAS,OAAO,UAChC,aAAa,KAAK;AAElB;AAEF,UAAM,SAAkC,CAAC;AACzC,WAAO,KAAK,SAAS,UAAU;AAC7B,YAAM,KAAK,KAAK,IAAI;AACpB,aAAO,QAAQ,EAAE;AACjB,iBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,GAAG,OAAO,EAAG,QAAO,CAAC,IAAI;AAAA,IACtE;AACA,WAAO,KAAK,SAAS,UAAU;AAC7B,YAAM,KAAK,OAAO,MAAM;AACxB,WAAK,KAAK,EAAE;AACZ,iBAAW,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,OAAO,QAAQ,GAAG,OAAO,EAAG,QAAO,CAAC,IAAI;AAAA,IACvE;AACA,UAAM,QAAQ,WAAW,WAAW,QAAQ,EAAE;AAC9C,sBAAkB;AAAA,EACpB;AACA,QAAM,OAAO,MAAM,KAAK,KAAK,SAAS,CAAC;AACvC,QAAM,OAAO,MAAM,KAAK,KAAK,SAAS,CAAC;AAIvC,QAAM,WAAW,oBAAI,IAA6C;AAClE,WAAS,GAAG,OAAe,SAAqC;AAC9D,QAAI,CAAC,SAAS,IAAI,KAAK,EAAG,UAAS,IAAI,OAAO,oBAAI,IAAI,CAAC;AACvD,aAAS,IAAI,KAAK,EAAG,IAAI,OAAO;AAChC,QAAIC,QAAmC;AACvC,WAAO,MAAM;AACX,UAAI,CAACA,MAAM;AACX,YAAMH,OAAM,SAAS,IAAI,KAAK;AAC9B,MAAAA,MAAK,OAAOG,KAAI;AAChB,UAAIH,QAAOA,KAAI,SAAS,EAAG,UAAS,OAAO,KAAK;AAChD,MAAAG,QAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,YAAY;AAChB,WAAS,KAAK,OAAe,SAAmB,kBAAkB,OAAO;AACvE,QAAI,aAAa;AACf,YAAM,IAAI;AAAA,QACR,IAAI,IAAI,kBAAkB,KAAK,iBAAiB,WAAW;AAAA,MAC7D;AACF;AACA,QAAI;AACF,cAAQ,OAAO,SAAS,eAAe;AAAA,IACzC,UAAE;AACA;AAAA,IACF;AAAA,EACF;AACA,WAAS,QAAQ,OAAe,SAAkB,iBAA0B;AAC1E,QAAI,UAAW,QAAO,aAAa,SAAS,KAAK,IAAI;AACrD,QAAI,QAAQ,OAAQ,SAAQ,IAAI,IAAI,IAAI,WAAW,KAAK,IAAI,OAAO;AACnE,iBAAa,EAAE,MAAM,SAAS,KAAK,IAAI,QAAQ,GAAG,KAAK;AACvD,QAAI,iBAAiB;AACnB,qBAAe;AACf,gBAAU,EAAE,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,IAC7C;AACA,KAAC,GAAI,SAAS,IAAI,KAAK,KAAK,CAAC,CAAE,EAAE;AAAA,MAAQ,CAAC,OACxC,OAAO,MAAM,GAAG,OAAO,GAAG,gBAAgB,KAAK,GAAG;AAAA,IACpD;AAAA,EACF;AAGA,MAAI,kBAAkB;AACtB,WAAS,WAAuC,UAAa,MAA4B;AACvF,UAAM,kBAAkB,KAAK,CAAC,GAAG,cAAc;AAC/C,QAAI,mBAAmB,CAAC,WAAW,aAAa,CAAC,iBAAiB;AAChE,wBAAkB;AAClB,cAAQ;AAAA,QACN,IAAI,IAAI,WAAW,KAAK;AAAA,MAE1B;AAAA,IACF;AACA,SAAK,OAAO,KAAK,CAAC,GAAG,eAAe;AAAA,EACtC;AACA,WAAS,SACP,OACA,SACY;AACZ,WAAO,GAAG,OAAO,OAAqC;AAAA,EACxD;AAEA,MAAI,SAAS;AACX,YAAQ,YAAY,CAAC,EAAE,KAAK,MAAM;AAEhC,UAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAI,KAAK,SAAS,SAAS;AACzB,cAAM,QAAQ,KAAK;AACnB,YAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,KAAK,CAAC,OAAO,cAAc,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,KAAK,OAAO,MAAM,CAAC,MAAM,SAAU;AACpI,YAAI,CAAC,KAAK,UAAU,OAAO,KAAK,WAAW,YAAY,MAAM,QAAQ,KAAK,MAAM,EAAG;AACnF,gBAAQ,KAAK,IAAI,OAAO,MAAM,CAAC,CAAC;AAEhC,cAAM,QAAiC,CAAC;AACxC,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAiB,KAAK,MAAM,GAAG;AACzD,cAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,OAAO,OAAO,IAAI,CAAC,CAAC,EAAG;AACtE,iBAAO,IAAI,GAAG,KAAK;AACnB,gBAAM,CAAC,IAAI;AAAA,QACb;AACA,cAAM,QAAQ,OAAO,QAAQ,GAAG,UAAU,gBAAgB;AAAA,MAC5D;AACA,UAAI,KAAK,SAAS,WAAW,OAAO,KAAK,UAAU,SAAU,MAAK,KAAK,OAAO,KAAK,OAAO;AAAA,IAC5F;AAAA,EACF;AACA,MAAI;AACJ,MAAI,UAAU;AACZ,QAAI;AACF,eAAS,KAAK,KAAK;AAAA,IACrB,SAAS,OAAO;AACd,cAAQ,MAAM,IAAI,IAAI,iCAAiC,KAAK;AAAA,IAC9D;AACA,UAAM,oBAAoB,CAAC,QAAiB;AAC1C,UAAI,UAAW;AACf,YAAM,MAAM;AACZ,YAAM,IAAI,KAAK,SAAS;AACxB,UAAI,KAAK,SAAS,cAAe,MAAM,mBAAmB,MAAM,iBAAmB;AACnF,UAAI;AACF,cAAM,OAAgB,OAAO,IAAI,UAAU,WAAW,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAClF,YAAI,QAAQ,OAAO,SAAS,SAAU,OAAM,MAAiC,YAAY,aAAa;AAAA,MACxG,SAAS,OAAO;AACd,gBAAQ,MAAM,IAAI,IAAI,iDAAiD,KAAK;AAAA,MAC9E;AAAA,IACF;AACA,QAAI;AACF,YAAM,MAAM,SAAS,UAAU,iBAAiB;AAEhD,4BAAsB,OAAO,QAAQ,aAAc,MAAqB,MAAM,UAAU,cAAc;AAAA,IACxG,SAAS,OAAO;AACd,cAAQ,MAAM,IAAI,IAAI,2CAA2C,KAAK;AAAA,IACxE;AAAA,EACF;AAaA,QAAM,QAAe,EAAE,QAAQ,QAAQ,YAAY,OAAO,WAAW,EAAE;AAEvE,QAAM,UAAiB,EAAE,QAAQ,WAAW,YAAY,OAAO,WAAW,EAAE;AAC5E,QAAMC,SAAQ,oBAAI,IAAmB;AACrC,QAAM,kBAAkB,oBAAI,IAAmB;AAC/C,QAAM,WAAW,oBAAI,IAA8B;AACnD,QAAM,cAAc,oBAAI,IAA6B;AACrD,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,WAAW,oBAAI,IAGnB;AAGF,QAAM,cAAc,CAAC,MAAc,SAAS,mBAAmB,CAAC,CAAC;AACjE,QAAM,WAAW,CAAC,GAAW,WAC3B,WAAW,SAAY,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,IAAI,UAAU,MAAM,CAAC;AAEhF,QAAM,YAAY,CAAC,GAAW,MAAc,MAAM,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC,GAAG;AACrG,QAAM,cAAc,CAAC,MAAc;AACjC,UAAM,MAAM,EAAE,MAAM,SAAS,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;AACjD,QAAI;AAAE,aAAO,mBAAmB,GAAG;AAAA,IAAG,QAAQ;AAAE,aAAO;AAAA,IAAK;AAAA,EAC9D;AAEA,QAAM,YAAY,MAAM;AACtB,QAAI,CAAC,QAAQ,QAAS;AACtB,UAAM,OAAO,OAAO;AAAA,MAClB,CAAC,GAAGA,MAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,SAAS;AAAA,IACrD;AACA,iBAAa,WAAW,IAAI;AAAA,EAC9B;AACA,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,YAAmB,SAAS,GAAG,WAAW,CAAC,QAAQ,YAAY,GAAG,CAAC,CAAC;AAC9G,QAAI,EAAE,WAAW,QAAQ,KAAK,KAAK,OAAO,MAAM,YAAY,EAAE,SAAS;AACrE,MAAAA,OAAM,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,QAAQ,WAAW,YAAY,OAAO,WAAW,OAAO,EAAE,cAAc,WAAW,EAAE,YAAY,EAAE,CAAC;AAGrI,QAAM,WAAW,oBAAI,IAA2C;AAChE,QAAM,WAAW,CAAC,MAAc;AAC9B,UAAM,IAAI,YAAY,CAAC;AACvB,WAAO,UAAU,CAAC,GAAG,UAAU,IAAI;AAAA,EACrC;AACA,WAAS,WAAW,GAAW;AAC7B,iBAAa,SAAS,IAAI,CAAC,CAAC;AAC5B,aAAS,OAAO,CAAC;AACjB,QAAI,CAAC,UAAW;AAChB,QAAI,SAAS,IAAI,CAAC,GAAG,MAAO;AAC5B,UAAM,KAAK,SAAS,CAAC;AACrB,QAAI,CAAC,OAAO,SAAS,EAAE,EAAG;AAC1B,aAAS,IAAI,GAAG,WAAW,MAAM;AAC/B,eAAS,OAAO,CAAC;AACjB,UAAI,SAAS,IAAI,CAAC,GAAG,SAAS,SAAS,IAAI,CAAC,EAAG;AAC/C,mBAAa,CAAC;AACd,gBAAU;AAAA,IACZ,GAAG,EAAE,CAAC;AAAA,EACR;AAGA,WAAS,cAAc,IAAgB;AACrC;AACA,QAAI;AACF,SAAG;AAAA,IACL,UAAE;AACA;AAAA,IACF;AACA,QAAI,eAAe,MAAM,KAAK,QAAQ,WAAW;AAC/C,qBAAe,MAAM;AACnB,cAAM,WAAW,CAAC,GAAG,IAAI;AACzB,aAAK,MAAM;AACX,iBAAS,QAAQ,CAAC,OAAO,UAAU,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;AACjE,mBAAW,OAAO,CAAC,EAAE,QAAQ,CAAC,YAAY,QAAQ,CAAC;AAAA,MACrD,CAAC;AAAA,EACL;AAGA,WAAS,aAAa,GAAW;AAC/B,IAAAA,OAAM,OAAO,CAAC;AACd,aAAS,OAAO,CAAC;AACjB,aAAS,OAAO,CAAC;AACjB,iBAAa,OAAO,CAAC;AACrB,gBAAY,OAAO,CAAC;AACpB,oBAAgB,OAAO,CAAC;AACxB,UAAM,KAAK,aAAa,CAAC;AACzB,gBAAY,OAAO,EAAE;AACrB,QAAI,CAAC,UAAU,IAAI,EAAE,GAAG,KAAM,WAAU,OAAO,EAAE;AAAA,EACnD;AAEA,QAAM,WAAW,CAAC,GAAW,UAA0B;AACrD,IAAAA,OAAM,IAAI,GAAG,EAAE,GAAIA,OAAM,IAAI,CAAC,KAAK,OAAQ,GAAG,MAAM,CAAC;AACrD,WAAO,aAAa,CAAC,CAAC;AACtB,cAAU;AACV,QAAI,CAAC,SAAS,IAAI,CAAC,GAAG,MAAO,YAAW,CAAC;AAAA,EAC3C;AAEA,GAAC,GAAGA,OAAM,KAAK,CAAC,EAAE,QAAQ,UAAU;AAGpC,WAAS,WAAW,GAAW,QAAkB,QAAQ,OAAqB;AAC5E,QAAI,UAAW,QAAO,QAAQ,OAAO,IAAI,MAAM,IAAI,IAAI,iBAAiB,CAAC,8DAA8D,CAAC;AAExI,QAAI,QAAQ,CAAC,KAAK,WAAW,OAAW,QAAO,QAAQ,GAAG,KAAK,EAAE,KAAK,MAAM,QAAQ,CAAC,CAAC;AACtF,UAAM,SAAS,UAAU,CAAC;AAC1B,QAAI,CAAC;AACH,aAAO,QAAQ,OAAO,IAAI,MAAM,UAAU,CAAC,wBAAwB,CAAC;AACtE,QAAI,YAAY,OAAQ,QAAO,cAAc,GAAG,QAAQ,QAAQ,SAAS,KAAK;AAC9E,QAAI;AACJ,QAAI;AACF,UAAI,SAAS,GAAG,MAAM;AAAA,IACxB,SAAS,OAAO;AACd,aAAO,QAAQ,OAAO,KAAK;AAAA,IAC7B;AACA,UAAM,QAAQA,OAAM,IAAI,CAAC,KAAK;AAC9B,UAAM,QACJ,MAAM,WAAW,aACjB,KAAK,IAAI,IAAI,MAAM,aAAa,OAAO,aAAa;AACtD,QAAI,SAAS,CAAC,MAAO,QAAO,QAAQ,QAAQ,MAAM,IAAI;AACtD,QAAI,SAAS,IAAI,CAAC,EAAG,QAAO,SAAS,IAAI,CAAC;AAC1C,QAAI,aAAa,CAAC,UAAU,UAAU,MAAM,SAAS;AACnD,aAAO,QAAQ,QAAQ,MAAM,IAAI;AAEnC,aAAS,GAAG;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ,MAAM,SAAS,SAAY,YAAY,MAAM;AAAA,IACvD,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA,CAAC,WAAW,OAAO,MAAM,QAAQ,MAAM;AAAA,MACvC;AAAA,MACA,CAAC,SAAS;AAAA,MACV,MAAM,WAAW,GAAG,QAAQ,IAAI;AAAA,IAClC;AAAA,EACF;AAMA,WAAS,SACP,GACA,MACA,MACA,QACA,SACkB;AAClB,UAAM,UAAU,SAAS,IAAI,CAAC,KAAK;AACnC,UAAM,aAAa,IAAI,gBAAgB;AACvC,gBAAY,IAAI,GAAG,UAAU;AAC7B,UAAM,UAA4B;AAAA,MAChC,CAAC,SAAS,WAAW,KAAK,MAAM;AAAA,MAChC;AAAA,MACA,KAAK,SAAS;AAAA,MACd,WAAW;AAAA,MACX,KAAK;AAAA,IACP,EACG;AAAA,MACC,CAAC,aAAa;AACZ,aAAK,SAAS,IAAI,CAAC,KAAK,OAAO,SAAS;AAEtC,cAAI,SAAS,IAAI,CAAC,MAAM,QAAS,UAAS,OAAO,CAAC;AAClD,iBAAO,QAAQ;AAAA,QACjB;AACA,cAAM,OAAO,OAAO,QAAQ;AAC5B,iBAAS,GAAG;AAAA,UACV;AAAA,UACA,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,CAAC,UAAU;AACT,cAAM,OAAO,EAAE,YAAY,OAAO,cAAc,MAAM;AACtD,YAAI,CAAC,WAAW,OAAO,QAAS,UAAS,GAAG,EAAE,GAAG,MAAM,OAAO,QAAQ,QAAQ,CAAC;AAAA,iBAGtE,YAAY,IAAI,CAAC,MAAM;AAC9B,mBAAS,GAAG,EAAE,GAAG,MAAM,QAAQA,OAAM,IAAI,CAAC,GAAG,SAAS,SAAY,SAAS,WAAW,SAAS,KAAK,CAAC;AACvG,cAAM;AAAA,MACR;AAAA,IACF,EACC,QAAQ,MAAM;AACb,UAAI,SAAS,IAAI,CAAC,MAAM,QAAS,UAAS,OAAO,CAAC;AAClD,UAAI,YAAY,IAAI,CAAC,MAAM,WAAY,aAAY,OAAO,CAAC;AAAA,IAC7D,CAAC;AACH,aAAS,IAAI,GAAG,OAAO;AACvB,WAAO;AAAA,EACT;AAiBA,WAAS,cACP,GACAF,MACA,QACA,MACA,QAAQ,OACU;AAClB,QAAI,UAAW,QAAO,QAAQ,OAAO,IAAI,MAAM,IAAI,IAAI,MAAM,CAAC,+BAA+B,CAAC;AAC9F,QAAI;AACJ,QAAI;AACF,UAAI,SAAS,GAAG,MAAM;AAAA,IACxB,SAAS,OAAO;AACd,aAAO,QAAQ,OAAO,KAAK;AAAA,IAC7B;AACA,UAAM,QAAQE,OAAM,IAAI,CAAC,KAAK;AAC9B,UAAM,OAAO,MAAM;AACnB,UAAM,UAAU,SAAS,IAAI,CAAC;AAC9B,QAAI,WAAW,CAAC,MAAO,QAAO;AAC9B,QAAI,CAAC,KAAM,QAAO;AAGlB,UAAM,YAAaF,KAA+B,aAAa;AAC/D,UAAM,QAAQ,KAAK,IAAI,IAAI,MAAM,YAAY;AAE7C,UAAM,aAAa,SAAS,mBAAmB,MAAM,SAAS,IAAI,CAAC,GAAG,SAAS,MAAM;AACrF,QAAI,SAAS,WAAW,QAAQ,MAAM,WAAW,aAAa,CAAC,SAAS,CAAC;AACvE,aAAO,QAAQ,QAAQ,IAAI;AAC7B,QAAI,SAAS,UAAU,KAAM,QAAQ,KAAM,QAAO,QAAQ,QAAQ,IAAI;AAEtE,gBAAY,IAAI,CAAC,GAAG,MAAM;AAC1B,UAAM,OAAO,SAAS,UAAUA,KAAI,YAAY,KAAM;AACtD,aAAS,GAAG;AAAA,MACV,YAAY;AAAA,MACZ,cAAc,SAAS;AAAA,MACvB,QAAQ,OAAO,MAAM,SAAS;AAAA,IAChC,CAAC;AAGD,UAAM,eAAe,SAAS,WAAW,QAAQA,KAAI,YAAY,WAAW,KAAK,MAAM,SAAS;AAChG,QAAI,eAAe;AACjB,aAAO,SAAS,GAAG,OAAO,WAAW;AACnC,cAAM,QAAmB,CAAC;AAC1B,cAAM,aAAwB,CAAC;AAE/B,YAAIG,KAAa,KAAM,WAAW,SAAS,KAAM,WAAW,CAAC,IAAIH,KAAI;AACrE,YAAI,OAAgB;AACpB,iBAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACrC,gBAAM,WAAW,MAAMA,KAAI,MAAMG,IAAY,QAAQ,MAAe;AACpE,gBAAM,KAAK,QAAQ;AACnB,qBAAW,KAAKA,EAAC;AACjB,iBAAOH,KAAI,SAAS,UAAmB,OAAkBG,EAAU;AACnE,cAAI,QAAQ,KAAM;AAClB,UAAAA,KAAI;AAAA,QACN;AACA,eAAO,EAAE,CAAC,SAAS,GAAG,MAAM,OAAO,YAAY,KAAK;AAAA,MACtD,GAAGH,MAAK,CAAC,QAAQ;AACf,cAAM,EAAE,OAAO,YAAY,KAAK,IAAI;AACpC,eAAO,EAAE,OAAO,YAAY,KAAK;AAAA,MACnC,GAAG,MAAM,cAAc,GAAGA,MAAK,QAAQ,SAAS,IAAI,CAAC;AACvD,WAAO,SAAS,GAAG,CAAC,WAAWA,KAAI,MAAM,MAAe,QAAQ,MAAe,GAAGA,MAAK,CAAC,aAAa;AACnG,YAAM,OAAO,SAAS,UAAU,OAAO,OAAO,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,EAAE;AAC1E,UAAI,QAAQ,CAAC,GAAG,KAAK,OAAO,QAAQ;AACpC,UAAI,aAAa,CAAC,GAAG,KAAK,YAAY,IAAI;AAC1C,UAAIA,KAAI,YAAY,MAAM,SAASA,KAAI,UAAU;AAC/C,gBAAQ,MAAM,MAAM,CAACA,KAAI,QAAQ;AACjC,qBAAa,WAAW,MAAM,CAACA,KAAI,QAAQ;AAAA,MAC7C;AACA,YAAM,OAAOA,KAAI,SAAS,UAAmB,OAAkB,IAAa;AAC5E,aAAO,EAAE,OAAO,YAAY,KAAK;AAAA,IACnC,GAAG,MAAM,cAAc,GAAGA,MAAK,QAAQ,SAAS,IAAI,CAAC;AAAA,EACvD;AAGA,WAAS,aAAa,GAAW,SAAc,QAAkB;AAC/D,QAAI,QAAQ,CAAC,KAAK,WAAW,QAAW;AACtC,eAAS,GAAG,OAAO;AACnB;AAAA,IACF;AACA,UAAM,IAAI,SAAS,GAAG,MAAM;AAC5B,UAAM,OAAOE,OAAM,IAAI,CAAC,GAAG;AAC3B,aAAS,GAAG;AAAA,MACV,MAAM,OAAO,YAAY,aAAa,QAAQ,IAAI,IAAI;AAAA,MACtD,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAGA,WAAS,MAAM,GAAW;AACxB,QAAI,QAAQ,CAAC,EAAG,cAAa,IAAI,CAAC,GAAG,MAAM;AAC3C,eAAW,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,WAAW;AAClC,UAAI,UAAU,GAAG,CAAC,EAAG,GAAE,MAAM;AAAA,EACjC;AAEA,iBAAe,WAAW,GAAW;AACnC,QAAI,QAAQ,CAAC,GAAG;AAEd,YAAM,IAAI,KAAK,CAAC;AAChB,QAAE,YAAY;AACd,QAAE;AACF,UAAI,EAAE,UAAU,EAAG,OAAM,QAAQ,GAAG,IAAI,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC1D;AAEA,UAAM,OAA2B,CAAC;AAClC,eAAW,CAAC,GAAG,KAAK,KAAKA,QAAO;AAC9B,UAAI,CAAC,UAAU,GAAG,CAAC,EAAG;AACtB,MAAAA,OAAM,IAAI,GAAG,EAAE,GAAG,OAAO,WAAW,EAAE,CAAC;AACvC,eAAS,IAAI,IAAI,SAAS,IAAI,CAAC,KAAK,KAAK,CAAC;AAC1C,YAAM,UAAU,SAAS,IAAI,CAAC;AAC9B,UAAI,SAAS;AACX,aAAK,KAAK,WAAW,QAAQ,MAAM,QAAQ,QAAQ,IAAI,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAC;AAAA,IAC5E;AAEA,cAAU;AACV,QAAI,QAAQ,CAAC,EAAG,YAAW;AAC3B,UAAM,QAAQ,IAAI,IAAI;AAAA,EACxB;AAIA,QAAM,QAAwB,CAAC;AAQ/B,WAAS,WAAW,MAAwC;AAC1D,QAAI,UAAW,QAAO,QAAQ,OAAO,IAAI,MAAM,IAAI,IAAI,iCAAiC,CAAC;AACzF,QAAI,CAAC,aAAa,UAAU,OAAQ,QAAO,QAAQ,QAAQ,EAAE,KAAK,IAAI;AACtE,UAAM,UAAU,IAAI;AAAA,MAAQ,CAAC,SAAS,WACpC,MAAM,KAAK,MAAM,QAAQ,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IACrE;AACA,0BAAsB;AACtB,WAAO;AAAA,EACT;AAIA,MAAI,iBAAiB;AACrB,QAAM,iBAAiB,MAAM;AAC3B,eAAW,KAAK,OAAO,KAAK,SAAS;AACnC,UAAI,KAAK,CAAC,EAAE,UAAU,EAAG,SAAQ,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACpD;AACA,QAAI;AACF,iBAAW,EAAE,MAAM,GAAG,QAAQ,MAAM,KAAK,SAAS,OAAO;AACvD,YAAI,MAAO,YAAW,GAAG,MAAM,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,IACnD,UAAE;AACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,MAAM;AACrB,UAAM,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,KAAK,CAAC;AACxC,mBAAe;AACf,0BAAsB;AAAA,EACxB;AAGA,MAAI,YAAY;AAChB,WAAS,wBAAwB;AAC/B,QAAI,CAAC,UAAW;AAChB,UAAM,SACJ,CAAC,cACA,MAAM,SAAS,KACd,OAAO,KAAK,SAAS,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,UAAU,CAAC,KACtD,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AAClD,QAAI,WAAW,UAAW;AAC1B,gBAAY;AACZ,UAAM,SAAS,SAAS,qBAAqB;AAC7C,WAAO,MAAM,EAAE,SAAS,cAAc;AACtC,WAAO,MAAM,EAAE,UAAU,QAAQ;AAAA,EACnC;AAEA,QAAM,WAAW,MAAM;AACrB,iBAAa,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;AACrC,gBAAY,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;AAAA,EACtC;AAGA,WAAS,UAAU;AACjB,cAAU;AACV,mBAAe;AACf,QAAI,aAAa,kBAAkB,OAAO,OAAO,wBAAwB,YAAY;AACnF,aAAO,oBAAoB,YAAY,SAAS;AAChD,eAAS,oBAAoB,oBAAoB,eAAe;AAAA,IAClE;AACA,gBAAY;AAGZ,QAAI;AACF,4BAAsB;AAAA,IACxB,QAAQ;AAAA,IAAC;AACT,0BAAsB;AACtB,aAAS,MAAM;AACf,0BAAsB;AACtB,aAAS,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;AACvC,aAAS,MAAM;AACf,aAAS;AACT,UAAM,SAAS;AACf,iBAAa,MAAM;AACnB,gBAAY,MAAM;AAClB,QAAI,QAAQ,QAAQ;AAClB,YAAM,OAAO,uBAAO,IAAI,eAAe,IAAI,EAAE;AAC7C,YAAM,IAAI;AACV,UAAI,EAAE,IAAI,MAAM,MAAO,QAAO,EAAE,IAAI;AAAA,IACtC;AAAA,EACF;AAOA,WAAS,QAAQ;AACf,aAAS;AACT,iBAAa,MAAM;AACnB,gBAAY,MAAM;AAClB,aAAS,MAAM;AACf,aAAS,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;AACvC,aAAS,MAAM;AACf,UAAM,aAAa,CAAC,GAAGA,OAAM,KAAK,CAAC;AACnC,eAAW,QAAQ,YAAY;AAC/B,IAAAA,OAAM,MAAM;AACZ,cAAU;AACV,eAAW,QAAQ,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC,CAAC;AACjD,eAAW,KAAK,MAAM,OAAO;AAC3B,aAAO,OAAO,GAAG,EAAE,QAAQ,OAAO,WAAW,GAAG,UAAU,QAAW,cAAc,OAAO,SAAS,EAAE,UAAU,EAAE,CAAC;AACpH,aAAS,MAAM;AACf,wBAAoB,MAAM;AAC1B,aAAS,MAAM;AACf,aAAS,MAAM;AACf,eAAW,KAAK,OAAO,KAAK,aAAa,EAAG,QAAO,cAAc,CAAC;AAClE,UAAM,EAAE,GAAG,eAAe,GAAG,SAAS,SAAS,KAAK;AACpD,eAAW;AACX,WAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;AACtD,WAAO,CAAC;AACR,aAAS,CAAC;AACV,sBAAkB;AAAA,EACpB;AAMA,QAAM,aAAkC;AAAA,IACtC,UAAU,CAAC,QAAQ,QAAQ,GAAG;AAAA,IAC9B,UAAU,CAAC,KAAK,OAAO,eAAe,OAAO,KAAK,OAAO,UAAU;AAAA,IACnE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,MAAM,OAAO,OAAO,OAAO,OAAO,cAAc,KAAK,WAAW,UAAU,CAAC,GAAG,UAAU;AAC9F,SAAO,eAAe,KAAK,WAAW,EAAE,OAAO,CAAC,MAAc,UAAU,CAAC,EAAE,CAAC;AAC5E,QAAM,UAAW,QAAQ,UAAU,GAA8C,KAAK,CAAC;AAIvF,QAAM,gBAAiB,QAAQ,cAAc,CAAC;AAC9C,QAAM,SAAS,QAAQ;AACvB,QAAM,kBAAmB,UAAU,OAAO,WAAW,YAAY,OAAO,WAAY;AACpF,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,QAAI,eAAe,OAAQ,OAAM,IAAI,MAAM,IAAI,IAAI,iFAAiF;AACpI,QAAI,OAAO,QAAQ,OAAO,QAAS,OAAM,IAAI,MAAM,IAAI,IAAI,oFAAoF;AAC/I,eAAW,KAAK,CAAC,GAAI,OAAO,QAAQ,CAAC,GAAI,GAAI,OAAO,WAAW,CAAC,CAAE;AAChE,UAAI,CAAC,WAAW,CAAW,KAAK,EAAE,KAAK;AACrC,cAAM,IAAI,MAAM,IAAI,IAAI,gBAAgB,OAAO,CAAC,CAAC,sCAAsC,WAAW,CAAW,IAAI,kDAAkD,EAAE,GAAG;AAAA,EAC9K;AAEA,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,aAAa,GAAG;AACvD,QAAI,CAAC,WAAW,GAAG;AACjB,YAAM,IAAI;AAAA,QACR,mBAAmB,GAAG;AAAA,MACxB;AACF,eAAW,CAAC,QAAQF,IAAG,KAAK,OAAO,QAAQ,QAAQ,CAAC,CAAC;AACnD,UAAI,OAAOA,SAAQ,cAAc,OAAOA,MAAK,QAAQ;AACnD,cAAM,IAAI,MAAM,cAAc,GAAG,IAAI,MAAM,uCAAuC;AAAA,EACxF;AAEA,WAAS,WAAW,KAAa,QAAgBA,MAAyB;AACxE,UAAM,MAAM,OAAOA,SAAQ,aAAaA,OAAMA,KAAI;AAClD,UAAM,OAAO,OAAOA,SAAQ,aAAa,SAAYA,KAAI;AACzD,WAAO,IAAI,SAAmC;AAC5C,YAAM,UAAU,CAAC,YAAqB,IAAI,SAAS,GAAG,IAAI;AAC1D,UAAI,CAAC,KAAM,QAAO,OAAO,KAAK,OAAO;AAIrC,YAAM,OAAO,MAAM,KAAK,MAAM,GAAG,CAAC;AAClC,YAAM,UAAU,OAAO,KAAK,SAAS,QAAQ,UAAU,MAAM,WAAW,IAAI,IAAI,IAAI;AACpF,UAAI,QAAQ,YAAa,QAAO,MAAM,QAAQ,YAAa,KAAK,MAAM,GAAG,aAAa;AACtF,cAAQ;AAAA,QACN,MAAM;AACJ,cAAI,QAAQ,cAAe,QAAO,MAAM,QAAQ,cAAe,KAAK,MAAM,GAAG,eAAe;AAAA,QAC9F;AAAA,QACA,CAAC,UAAU;AACT,cAAI,QAAQ,YAAa,QAAO,MAAM,QAAQ,YAAa,KAAK,QAAQ,KAAK,GAAG,aAAa;AAAA,QAC/F;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,UAAU,oBAAI,IAA+B;AACnD,WAAS,UAAU,KAAa;AAC9B,QAAI,WAAW,GAAG,EAAG,QAAO;AAC5B,QAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;AACrB,YAAM,SAA4B,CAAC,OAAO,eAAe,OAAO,KAAK,OAAO,UAAU;AACtF,YAAM,OAAO,OAAO,eAAe,GAAG,IAAI,cAAc,GAAG,IAAI,CAAC;AAEhE,iBAAW,CAAC,QAAQA,IAAG,KAAK,OAAO,QAAQ,QAAQ,CAAC,CAAC;AACnD,eAAO,eAAe,QAAQ,QAAQ,EAAE,OAAO,WAAW,KAAK,QAAQA,IAAG,GAAG,YAAY,KAAK,CAAC;AACjG,cAAQ,IAAI,KAAK,MAAM;AAAA,IACzB;AACA,WAAO,QAAQ,IAAI,GAAG;AAAA,EACxB;AAMA,QAAM,MAAM,OAAO,OAAO,IAAI,QAAQ;AACtC,SAAO,eAAe,KAAK,WAAW,EAAE,OAAO,UAAU,CAAC;AAQ1D,QAAM,aAAa,CAAC,QAA0B,YAAY,YAAY,GAAG,IAAI,QAAQ,GAAG;AAGxF,QAAM,cAAc,oBAAI,IAAqB;AAC7C,WAAS,YAAY,KAAsB;AACzC,QAAI,YAAY,IAAI,GAAG,EAAG,QAAO,YAAY,IAAI,GAAG;AACpD,UAAM,QAAQ,WAAW,GAAG,IACxB,aAAa,GAAG,EAAE,WAAW,aAAa,MAAM;AAAA,IAAC,GAAG,aAAa,GAAG,GAAG,CAAU,IACjF,UAAU,GAAG,GAAG,QAAQ,UAAU,cAAc,GAAG,MAAM,SACzD,UAAU,GAAG,EAAE,QAAQ,OAAQ,cAAc,GAAG,CAAC,IACjD,cAAc,GAAG;AACrB,gBAAY,IAAI,KAAK,KAAK;AAC1B,WAAO;AAAA,EACT;AAOA,WAAS,qBAAqB;AAC5B,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,KAAK,MAAM,KAAK,EAAG,aAAY,GAAG,oBAAI,IAAI,GAAG,IAAI;AAC5D,eAAW,KAAK,YAAa,KAAI,CAAC,KAAK,IAAI,CAAC,EAAG,MAAK,CAAC,EAAE;AACvD,eAAW,KAAK;AACd,UAAI,CAAC,YAAY,IAAI,CAAC,GAAG;AACvB,aAAK,CAAC,EAAE;AACR,gBAAQ,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAC3B;AACF,kBAAc;AACd,0BAAsB;AAAA,EACxB;AAOA,WAAS,KAAK,QAAiC;AAC7C,eAAW,KAAK,OAAO,KAAK,MAAM,EAAG,cAAa,IAAI,CAAC;AACvD,UAAM,QAAiC,CAAC;AACxC,UAAM,UAAU,OAAO;AACvB,UAAM,QAAQ,CAAC,QAAkB,OAAO,QAAQ,YAAY,MAAM,IAAI,MAAM;AAC5E,QAAI,WAAW,OAAO,YAAY;AAChC,iBAAW,CAAC,GAAG,IAAI,KAAK,OAAO,QAAQ,OAAmE,GAAG;AAC3G,YAAI,CAAC,EAAE,WAAW,QAAQ,KAAK,CAAC,QAAQ,OAAO,SAAS,YAAY,EAAE,UAAU,MAAO;AACvF,cAAM,QAAe,EAAE,MAAM,KAAK,MAAM,QAAQ,WAAW,YAAY,OAAO,WAAW,KAAK,IAAI,IAAI,MAAM,KAAK,GAAG,EAAE;AACtH,QAAAE,OAAM,IAAI,GAAG,KAAK;AAClB,wBAAgB,IAAI,GAAG,KAAK;AAC5B,eAAO,aAAa,CAAC,CAAC;AAAA,MACxB;AACF,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,UAAI,MAAM,cAAc,MAAM,WAAW,MAAM,cAAc,WAAW,CAAC,EAAG;AAC5E,UAAI,CAAC,WAAW,CAAC,EAAG,OAAM,IAAI,MAAM,IAAI,IAAI,uBAAuB,CAAC,+BAA+B;AACnG,oBAAc,CAAC,IAAI;AACnB,YAAM,CAAC,IAAI;AAAA,IACb;AACA,gBAAY,MAAM;AAClB,UAAM,OAAO,WAAW,iBAAiB,KAAK;AAC9C,UAAM,OAAQ,OAAO,SAAS,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,CAAC;AACjF,eAAW,KAAK,OAAO,KAAK,KAAK;AAC/B,UAAI,QAAQ,CAAC,GAAG;AACd,eAAO,OAAO,KAAK,CAAC,GAAG,EAAE,QAAQ,MAAM,WAAW,KAAK,IAAI,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;AAC/E,kBAAU,GAAG,EAAE,SAAS,OAAO,UAAU,OAAO,OAAO,KAAK,CAAC;AAAA,MAC/D;AAAA,EACJ;AAGA,WAAS,eAAe,IAAY;AAClC,cAAU,MAAM,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;AAAA,EACpC;AAGA,WAAS,SAAS,IAAsC;AACtD;AACE,UAAI,CAAC,GAAI;AACT,YAAM,OAAO,GAAG,MAAM,IAAQ;AAC9B,WAAK,QAAQ,CAAC,MAAM,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;AACzD,yBAAmB;AAEnB,YAAM,UAAU,oBAAI,IAAY;AAChC,WAAK,QAAQ,CAAC,MAAM,YAAY,GAAG,oBAAI,IAAI,GAAG,OAAO,CAAC;AACtD,cAAQ,QAAQ,CAAC,MAAM,QAAQ,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAC;AACjD,aAAO,MAAM;AACX,aAAK,QAAQ,CAAC,MAAM;AAClB,gBAAM,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK;AAChC,cAAI,IAAI,EAAG,OAAM,IAAI,GAAG,CAAC;AAAA,cACpB,OAAM,OAAO,CAAC;AAAA,QACrB,CAAC;AACD,2BAAmB;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAmBA,QAAM,WAAW,oBAAI,IAAsB;AAoB3C,QAAM,YAAY,uBAAO,QAAQ;AAAA,EACjC,MAAM,iBAAiB,MAAe;AAAA,IACpC,CAAC,SAAS;AAAA,EACZ;AACA,SAAO,eAAe,SAAS,WAAW,GAAG;AAAA,IAC3C,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,MAAoB;AAClB,YAAM,IAAI,KAAK,SAAS;AACxB,QAAE,aAAa;AACf,aAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,EAAG,UAAU,IAAI,EAAE,EAAG,SAAS,EAAE;AAAA,IAC3E;AAAA,EACF,CAAC;AACD,WAAS,SAAS,KAAuB;AACvC,QAAIE,KAAI,SAAS,IAAI,GAAG;AACxB,QAAI,CAACA,IAAG;AACN,YAAM,YAAY,QAAQ,GAAG,KAAK,WAAW,GAAG;AAChD,UAAI,OAAoB;AACxB,UAAI,aAA0B;AAC9B,YAAM,SAAS,CAAC,MAAmB,MAAqB;AACtD,cAAM,IAAI,YAAY,UAAU,GAAG,IAAI;AACvC,eAAO,QAAQ,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,EAAE,GAAG,EAAE;AAAA,MACtE;AAGA,YAAM,eAAe,CAAC,MAAmB,MAAqB;AAC5D,cAAM,IAAI,aAAa,QAAQ,GAAG,KAAK,CAAC,aAAa,IAAI,GAAG,IAAI,iBAAiB,YAAY,UAAU,GAAG,IAAI;AAC9G,eAAO,QAAQ,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,EAAE,GAAG,EAAE;AAAA,MACtE;AAEA,UAAI,WAAwB;AAC5B,UAAI,iBAA8B;AAClC,YAAM,SAAS,CAAC,MAAmB,MAAqB;AACtD,cAAM,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,EAAE,SAAS,eAAe,YAAY,UAAU,GAAG,IAAI;AAC1F,eAAO,QAAQ,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,EAAE,GAAG,EAAE;AAAA,MACtE;AACA,MAAAA,KAAI;AAAA,QACF,UAAU,MAAM,QAAQ,GAAG;AAAA,QAC3B,gBAAgB,MAAM,WAAW,GAAG;AAAA,QACpC,WAAW,MAAM,UAAU,GAAG;AAAA,QAC9B,iBAAiB,YAAY,YAAY,cAAc,GAAG,CAAC,IAAI;AAAA,QAC/D,iBAAiB;AAAA,QACjB,MAAM,MAAO,OAAO,OAAO,MAAM,QAAQ,GAAG,CAAC;AAAA,QAC7C,YAAY,MAAO,aAAa,aAAa,YAAY,WAAW,GAAG,CAAC;AAAA,QACxE,UAAU,MAAO,WAAW,OAAO,UAAU,QAAQ,GAAG,CAAC;AAAA,QACzD,gBAAgB,MAAO,iBAAiB,OAAO,gBAAgB,WAAW,GAAG,CAAC;AAAA,MAChF;AACA,eAAS,IAAI,KAAKA,EAAC;AAAA,IACrB;AACA,WAAOA;AAAA,EACT;AAGA,WAAS,YAAY,KAAa,UAAsC,UAAU,MAAe;AAC/F,QAAI,CAAC,OAAO,GAAG;AACb,YAAM,IAAI;AAAA,QACR,IAAI,GAAG;AAAA,MACT;AAIF,UAAM,MAAM,OAA6C,IAAI;AAE7D,QAAI,CAAC,IAAI,WAAW,EAAE,gBAAgB,IAAI;AACxC,UAAI,UAAU,EAAE,KAAK,MAAM,KAAK,MAAM,YAAY,OAAO,MAAM,MAAM,GAAG,MAAM,QAAQ,QAAW,KAAK,aAAa,WAAW,aAAa,SAAS,KAAK;AAC3J,UAAM,IAAI,IAAI;AACd,QAAI,EAAE,QAAQ,OAAO,EAAE,YAAY,SAAS;AAC1C,QAAE,UAAU;AAEZ,YAAMA,KAAI,SAAS,GAAG;AACtB,QAAE,MAAM;AACR,QAAE,SAAS,UAAU,GAAG;AAIxB,YAAM,UAAU,YAAY,GAAG;AAC/B,QAAE,IAAIA;AACN,QAAE,MAAM;AAER,QAAE,MAAMA,GAAE,kBACN,CAAC,OAAmB;AAClB,cAAM,WAAW,QAAQ,EAAE;AAC3B,cAAM,YAAYA,GAAE,gBAAgB,MAAM;AAAE,cAAI,EAAE,WAAY,IAAG;AAAA,QAAG,CAAC;AACrE,cAAM,OAAO,UAAU,SAAS,GAAG,IAAI;AACvC,eAAO,MAAM;AAAE,mBAAS;AAAG,oBAAU;AAAG,iBAAO;AAAA,QAAG;AAAA,MACpD,IACA;AACJ,QAAE,YAAYA,GAAE,kBACZ,CAAC,OAAmB;AAClB,cAAM,WAAW,QAAQ,EAAE;AAC3B,cAAM,OAAO,UAAU,SAAS,GAAG,IAAI;AACvC,eAAO,MAAM;AAAE,mBAAS;AAAG,iBAAO;AAAA,QAAG;AAAA,MACvC,IACA;AAAA,IACN;AAGA,UAAM,SAAS,CAAC,UAAmB;AACjC,UAAI,CAAC,SAAU,QAAO;AACtB,YAAM,IAAI,EAAE;AACZ,UAAI,KAAK,EAAE,aAAa,YAAY,OAAO,GAAG,EAAE,OAAO,KAAK;AAC1D,eAAO,EAAE;AACX;AACA,UAAI;AACJ,UAAI;AACF,iBAAS,SAAS,KAAc;AAAA,MAClC,UAAE;AACA;AAAA,MACF;AACA,YAAM,OAAO,KAAK,aAAa,EAAE,QAAQ,MAAM,IAAI,EAAE,SAAS;AAC9D,QAAE,OAAO,EAAE,OAAO,QAAQ,MAAM,SAAS;AACzC,aAAO;AAAA,IACT;AAEA,UAAMA,KAAI,EAAE;AACZ,UAAM,OAAO;AAAA,MACX,WAAW,EAAE,YAAY,EAAE;AAAA,MAC3B,WAAW,MAAM,OAAO,QAAQ,GAAG,CAAC,IAAI,UAAUA,GAAE,OAAOA,GAAE;AAAA,MAC7D,WAAW,MAAM,OAAO,WAAW,GAAG,CAAC,IAAI,UAAUA,GAAE,aAAaA,GAAE;AAAA,IACxE;AAEA,QAAI,SAAU,QAAO;AACrB,UAAM,QAAS,KAAc;AAC7B,MAAE,eAAgB,KAAc;AAIhC,QAAI,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,MAAO,QAAO,EAAE;AAC1C,UAAM,MAAM,IAAI,SAAS,CAAC;AAC1B,QAAI,CAAC,IAAI;AACT,QAAI,CAAC,IAAI,EAAE;AACX,QAAI,SAAS,IAAI;AACjB,MAAE,MAAM;AACR,WAAO;AAAA,EACT;AAGA,WAAS,iBAAiB,QAA4C;AACpE,UAAM,OAAO,OAMH,IAAI;AAEd,UAAM,MAAM,CAAC,MAA8B,WAAoB;AAG7D,YAAM,WAAW,CAAC,MAAc;AAC9B,YAAI;AACF,iBAAO,KAAK,CAAC;AAAA,QACf,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AACA,YAAM,IAAI,KAAK;AAEf,UACE,KACA,EAAE,WAAW,UACb,EAAE,WAAW,UACb,EAAE,KAAK,MAAM,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,MAAM,SAAS,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnF,eAAO,EAAE;AAIX,YAAM,IAAK,UAAU,YAAY,EAAE,MAAM,MAAM,oBAAI,IAAY,GAAG,QAAQ,KAAgB;AAC1F,QAAE,OAAO;AACT,QAAE,KAAK,MAAM;AACb,QAAE,WAAW,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,GAAG,YAAY;AAC5E,YAAM,OAAO,EAAE;AACf;AACA,UAAI;AACJ,UAAI;AACF,iBAAS,OAAO,EAAE,MAAe;AAAA,MACnC,UAAE;AACA;AAAA,MACF;AACA,mBAAa,QAAQ,YAAY;AACjC,YAAM,OAAO,CAAC,GAAG,IAAI;AACrB,YAAM,OAAO,KAAK,aAAa,EAAE,QAAQ,MAAM,IAAI,EAAE,SAAS;AAC9D,WAAK,UAAU,EAAE,QAAQ,MAAM,MAAM,QAAQ,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,OAAO;AAKtF,YAAM,MAAM,aAAa;AACzB,UAAI,IAAI,MAAM,CAAC,QAAQ;AACrB,cAAM,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AACtD,YAAI,MAAM,QAAQ;AAChB,wBAAc,IAAI,IAAI,CAAC,GAAG,KAAK;AAC/B,cAAI,OAAO,CAAC,GAAG,IAAI,MAAM,GAAG,KAAK;AAAA,QACnC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,OAA4C,EAAE,MAAM,CAAC,EAAE,CAAC;AAC7E,UAAM,YAAY,OAAoF,IAAI;AAC1G,UAAMC,aAAY,YAAY,CAAC,OAAmB;AAChD,YAAM,MAAM,aAAa;AACzB,UAAI,KAAK;AACT,UAAI,OAAO,KAAK,SAAS,QAAQ,CAAC;AAClC,oBAAc,IAAI,CAAC,GAAG,IAAI,IAAI;AAC9B,aAAO,MAAM;AACX,sBAAc,IAAI,IAAI,MAAM,CAAC,CAAC;AAC9B,YAAI,IAAI,OAAO,IAAI;AAAE,cAAI,KAAK;AAAW,cAAI,OAAO,CAAC;AAAA,QAAG;AAAA,MAC1D;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,UAAM,QAAQ;AAAA,MACZA;AAAA,MACA,MAAM,IAAI,SAAS,KAAK;AAAA,MACxB,MAAM,IAAI,YAAY,IAAI;AAAA,IAC5B;AAGA,UAAM,gBAAgB,KAAK,SAAS,QAAQ,CAAC;AAC7C,UAAM,SAAS,cAAc,KAAK,IAAQ;AAC1C,cAAU,MAAM;AACd,YAAM,MAAM,aAAa;AACzB,UAAI,CAAC,IAAI,GAAI;AACb,YAAM,OAAO,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,cAAc,SAAS,CAAC,CAAC;AAC9D,YAAM,MAAM,cAAc,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AAC7D,UAAI,KAAK,UAAU,IAAI,QAAQ;AAC7B,sBAAc,IAAI,IAAI,MAAM,GAAG;AAC/B,YAAI,OAAO;AAAA,MACb;AAAA,IAEF,GAAG,CAAC,MAAM,CAAC;AACX,mBAAe,cAAc,KAAK,CAAC,MAAM,QAAQ,CAAC,KAAK,WAAW,CAAC,CAAC,IAAI,cAAc,OAAO,CAAC,MAAM,QAAQ,CAAC,KAAK,WAAW,CAAC,CAAC,EAAE,KAAK,IAAQ,IAAI,EAAE;AACpJ,WAAO;AAAA,EACT;AAqBA,WAAS,eACP,aACA,QACAC,UACS;AAGT,QAAI,OAAO,gBAAgB;AAEzB,aAAO,iBAAiB,WAAW;AAIrC,UAAM,cAAc,UAAU,UAAU,KAAK,OAAO,WAAW;AAC/D,QAAI,YAAa,iBAAgBA,UAAS,WAAW;AACrD,QAAI,QAAQ,WAAW;AAErB,aAAO,SAAS,aAAa,QAAQ,eAAe,WAAW,QAAW,QAAQA,QAAO,CAAC;AAC5F,QAAI,gBAAgB,WAAW,UAAa,QAAQ,WAAW,IAAI;AACjE,UAAI,CAAC,QAAQ,WAAW;AACtB,cAAM,IAAI;AAAA,UACR,mBAAmB,WAAW,gBAAgB,WAAW,KAAK,OAAO,WAAW,IAAI,6CAA6C,qBAAqB;AAAA,QAExJ;AAEF,aAAO,cAAc,aAAa,QAAQ,WAAW,QAAW,QAAQA,QAAO,CAAC;AAAA,IAClF;AAEA,WAAO,YAAY,aAAa,MAAiD;AAAA,EACnF;AAOA,QAAM,cAAqB,EAAE,SAAS,OAAO,WAAW,MAAM,WAAW,KAAK;AAE9E,WAAS,QAAQA,UAAwC;AACvD,QAAI,CAACA,SAAS,QAAO;AACrB,UAAM,UAAUA,SAAQ,YAAY;AACpC,UAAM,MAAMA,SAAQ,YAAY,SAAY,CAAC,IAAI,MAAM,QAAQA,SAAQ,OAAO,IAAIA,SAAQ,UAAU,CAACA,SAAQ,OAAiB;AAC9H,QAAI,YAA2B;AAC/B,QAAI,YAAqB;AACzB,QAAI,UAAU;AAEd,eAAW,KAAK,KAAiB;AAC/B,YAAM,OAAO,WAAW,IAAI,CAAC;AAC7B,UAAI,EAAE,WAAW,EAAE,aAAa,KAAM,QAAO,EAAE,SAAS,MAAM,WAAW,EAAE,WAAW,WAAW,EAAE,UAAU;AAC7G,UAAI,EAAE,SAAS,QAAQ,EAAE,MAAM,QAAQ,KAAK,OAAQ,QAAO,EAAE,SAAS,MAAM,WAAW,MAAM,OAAO,MAAM,WAAW,EAAE,MAAM;AAAA,IAC/H;AACA,eAAW,KAAK,KAAiB;AAC/B,UAAI,EAAE,WAAW,EAAE,SAAS;AAC1B,kBAAU;AACV,sBAAc,EAAE,UAAU,EAAE,aAAa,WAAW,IAAI,CAAC,GAAG,OAAO,OAAO,WAAW,IAAI,CAAC,GAAG,OAAO;AACpG,sBAAc,EAAE,aAAa;AAAA,MAC/B;AAAA,IACF;AACA,QAAI,CAAC,WAAW,QAAS,QAAO;AAChC,WAAO,EAAE,SAAS,MAAM,WAAW,UAAU;AAAA,EAC/C;AACA,QAAM,YAAY,CAAC,GAAU,MAAa,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,OAAO,GAAG,EAAE,WAAW,EAAE,SAAS;AACtI,QAAM,OAAO,MAAM,QAAQ,QAAQ;AAGnC,WAAS,UAAU,GAAW,QAAiB,GAAuB;AACpE,UAAM,UAAU,SAAS,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,OAAO,EAAE;AAC/D,YAAQ;AACR,aAAS,IAAI,GAAG,OAAO;AACvB,iBAAa,SAAS,IAAI,CAAC,CAAC;AAC5B,aAAS,OAAO,CAAC;AACjB,0BAAsB;AACtB,eAAW,GAAG,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACpC,WAAO,MAAM;AACX,cAAQ;AACR,UAAI,QAAQ,UAAU,EAAG,YAAW,CAAC;AACrC,4BAAsB;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,cAAc,oBAAI,IAA4C;AACpE,WAAS,aAAa,GAAW,GAAW,KAAuB;AACjE,UAAM,SAAS,UAAU,CAAC,GAAG,QAAQ;AACrC,QAAI,CAAC,UAAU,QAAQ,OAAW,QAAO;AACzC,UAAM,IAAI,YAAY,IAAI,CAAC;AAC3B,QAAI,KAAK,OAAO,GAAG,EAAE,KAAK,GAAG,EAAG,QAAO,EAAE;AACzC,UAAM,MAAM,OAAO,GAAG;AACtB,gBAAY,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC;AAC/B,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,oBAAI,IAA+B;AACxD,WAAS,YAAY,GAAW,QAAiB,GAA8B;AAC7E,QAAI,SAAS,aAAa,IAAI,CAAC;AAC/B,QAAI,CAAC,QAAQ;AACX,eAAS,CAAC,OAAO,eAAe;AAC9B,cAAM,OAAOJ,OAAM,IAAI,CAAC,GAAG;AAC3B,cAAM,OAAO,OAAO,UAAU,aAAc,MAAkC,IAAI,IAAI;AACtF,iBAAS,GAAG,EAAE,MAAM,MAAM,QAAQ,UAAU,CAAC;AAC7C,YAAI,CAAC,WAAY,QAAO,QAAQ,QAAQ;AACxC,cAAM,OAAO,QAAQ,QAAQ,EAC1B,KAAK,UAAU,EACf;AAAA,UACC,CAAC,WAAW;AACV,gBAAI,UAAU,CAAC,GAAG,QAAQ,qBAAsB,QAAO,WAAW,GAAG,QAAQ,IAAI,EAAE,KAAK,MAAM,QAAQ,MAAM,MAAM;AAClH,mBAAO;AAAA,UACT;AAAA,UACA,CAAC,UAAU;AAGT,gBAAI,CAAC,eAAe,OAAO,GAAGA,OAAM,IAAI,CAAC,GAAG,MAAM,IAAI,EAAG,UAAS,GAAG,EAAE,MAAM,MAAM,QAAQ,SAAS,SAAY,SAAS,UAAU,CAAC;AACpI,kBAAM;AAAA,UACR;AAAA,QACF;AACF,aAAK,MAAM,MAAM;AAAA,QAAC,CAAC;AACnB,oBAAY,IAAI,IAAI;AACpB,eAAO;AAAA,MACT;AACA,mBAAa,IAAI,GAAG,MAAM;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAGA,WAAS,WAAW,GAAW,OAAc,SAAkB,SAA4D;AACzH,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,QAAQ,aAAa,GAAG,MAAM,WAAW,UAAU,CAAC,CAAC,MAAM,SAAS,SAAS,SAAS,CAAC,OAAO;AACpG,QAAI,UAAU,UAAW,QAAO,EAAE,OAAO,WAAW,SAAS,KAAK;AAClE,QAAI,UAAU,OAAQ,QAAO,EAAE,OAAO,QAAuB,SAAS,MAAM;AAC5E,WAAO,EAAE,OAAO,QAAQ,SAAS,MAAM,OAAO,SAAS,CAAC,OAAO,GAAG,QAAQ;AAAA,EAC5E;AAeA,QAAM,gBAAgB,CAAC,MAAiC,MAAM;AAC5D,UAAM,IAAI,MAAM,mBAAmB,CAAC,4FAA4F;AAAA,EAClI;AAIA,QAAM,iBAAiB,oBAAI,IAAY;AACvC,WAAS,aAAa,GAAW,OAAgB;AAC/C,QAAI,eAAe,IAAI,CAAC,EAAG;AAC3B,UAAM,KAAM,aAAoF,CAAC,GAAG;AACpG,QAAI,OAAO,OAAO,cAAc,GAAG,UAAU,QAAQ,IAAI,GAAI;AAC7D,mBAAe,IAAI,CAAC;AACpB,YAAQ;AAAA,MACN,IAAI,IAAI,qBAAqB,CAAC,4CAA4C,CAAC,+BAA+B,QAAQ,sBAAsB,EAAE,wEAClE,CAAC;AAAA,IAC3E;AAAA,EACF;AAGA,WAAS,cAAc,GAAW,QAAiB,kBAA2B,OAAuB;AACnG,QAAI,iBAAkB,cAAa,GAAG,KAAK;AAC3C,UAAM,MAAM,OAA6C,IAAI;AAC7D,QAAI,IAAI,IAAI;AACZ,UAAM,OAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EAAE,MAAM,KAAK,OAAO,GAAG,EAAE,QAAQ,MAAM;AACxF,UAAM,IAAI,mBAAmB,KAAK,OAAO,EAAG,IAAI,SAAS,GAAG,MAAM;AAClE,UAAM,UAAU,CAAC,oBAAoB,CAAC,MAAM;AAC5C,QAAI,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,MAAM,KAAK,EAAE,YAAY,WAAW,CAAC,UAAU,EAAE,OAAO,KAAK,GAAG;AAChG,YAAM,UAAU,UAAU,UAAU;AACpC,YAAM,SAAS,mBAAmB,cAAc,CAAC,IAAI,YAAY,GAAG,QAAQ,CAAC;AAC7E,YAAM,UAAU,UAAU,MAAM,WAAW,GAAG,QAAQ,IAAI,EAAE,KAAK,MAAM;AAAA,MAAC,GAAG,MAAM;AAAA,MAAC,CAAC,IAAI;AACvF,YAAM,MAAM,UAAU,cAAc,EAAE,GAAG,OAAO,SAAS,KAAK;AAC9D,UAAI,OAAkD;AACtD,YAAM,UAAU,CAAC,UAAiB;AAChC,YAAI,QAAQ,KAAK,UAAU,MAAO,QAAO,KAAK;AAC9C,cAAM,SAAiB;AAAA,UACrB,EAAE,GAAG,WAAW,GAAG,OAAO,MAAM,SAAS,QAAW,OAAO,GAAG,UAAU,MAAM,YAAY,OAAO,MAAM,SAAS,MAAM,GAAG,KAAK,QAAQ;AAAA,UACtI;AAAA,UAAG,MAAM,MAAM,SAAS;AAAA,QAC1B;AACA,cAAM,QAAQ,CAAC,mBAAmB,SAAY,aAAa,GAAG,GAAG,MAAM,IAAI,GAAG,QAAQ,MAAM;AAC5F,eAAO,EAAE,OAAO,MAAM;AACtB,eAAO;AAAA,MACT;AACA,YAAM,UAAU,mBAAmB,cAAc,YAAY,aAAa,CAAC,CAAC;AAC5E,UAAI;AAAA,QACF,MAAM;AAAA,QAAS;AAAA,QAAG;AAAA,QAAQ;AAAA,QAAG;AAAA,QAAS;AAAA,QACtC,KAAK,CAAC,OAAO;AACX,gBAAM,MAAM,QAAQ,EAAE;AACtB,gBAAM,OAAO,UAAU,UAAU,GAAG,QAAQ,CAAC,IAAI;AACjD,iBAAO,MAAM;AAAE,gBAAI;AAAG,mBAAO;AAAA,UAAG;AAAA,QAClC;AAAA,QACA,MAAM,MAAM,SAAS,mBAAmB,SAAYA,OAAM,IAAI,CAAC,MAAM,OAAO;AAAA,QAC5E,YAAY,MAAM,SAAS,mBAAmB,SAAY,YAAY,gBAAgB,IAAI,CAAC,IAAIA,OAAM,IAAI,CAAC,MAAM,OAAO;AAAA,MACzH;AACA,UAAI,UAAU;AAAA,IAChB;AACA,WAAO,qBAAqB,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU;AAAA,EACzD;AAEA,QAAM,WAAoB,CAAC;AAG3B,WAAS,SAAS,GAAW,QAAiB,kBAA2B,OAAuB;AAC9F,QAAI,iBAAkB,cAAa,GAAG,IAAI;AAC1C,UAAM,MAAM,OAA6C,IAAI;AAC7D,QAAI,IAAI,IAAI;AACZ,UAAM,OAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EAAE,MAAM,KAAK,OAAO,GAAG,EAAE,QAAQ,MAAM;AACxF,UAAM,IAAI,mBAAmB,KAAK,OAAO,EAAG,IAAI,SAAS,GAAG,MAAM;AAClE,UAAM,UAAU,CAAC,oBAAoB,CAAC,MAAM;AAC5C,QAAI,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,MAAM,KAAK,EAAE,YAAY,WAAW,CAAC,UAAU,EAAE,OAAO,KAAK,GAAG;AAChG,YAAMF,OAAM,UAAU,CAAC;AACvB,YAAM,UAAU,UAAU,UAAU;AAEpC,YAAM,gBAAgB,UAAU,MAAM,cAAc,GAAGA,MAAK,QAAQ,MAAM,EAAE,KAAK,MAAM;AAAA,MAAC,GAAG,MAAM;AAAA,MAAC,CAAC,IAAI;AACvG,YAAM,UAAU,UAAU,MAAM,cAAc,GAAGA,MAAK,QAAQ,SAAS,IAAI,EAAE,KAAK,MAAM;AAAA,MAAC,GAAG,MAAM;AAAA,MAAC,CAAC,IAAI;AACxG,YAAM,MAAM,UAAU,cAAc,EAAE,GAAG,OAAO,SAAS,KAAK;AAC9D,UAAI,OAAkD;AACtD,YAAM,UAAU,CAAC,UAAiB;AAChC,YAAI,QAAQ,KAAK,UAAU,MAAO,QAAO,KAAK;AAC9C,cAAM,OAAO,MAAM;AACnB,cAAM,SAAsB,MAAM;AAAA,UAChC,GAAG,WAAW,GAAG,OAAO,SAAS,QAAW,OAAO;AAAA;AAAA,UACnD,UAAU,MAAM;AAAA,UAAY,OAAO,MAAM,SAAS;AAAA,UAAM,GAAG;AAAA,UAAK;AAAA,UAChE,aAAa,WAAW,OAAO,KAAK,QAAQ,OAAO;AAAA,UAAO;AAAA,UAAe,oBAAoB,CAAC,CAAC,MAAM;AAAA,QACvG,GAAG,GAAG,MAAM,SAAS,MAAS;AAC9B,cAAM,QAAQ,EAAE,mBAAmB,SAAY,MAAM,UAAU,UAAU,QAAW,MAAM;AAC1F,eAAO,EAAE,OAAO,MAAM;AACtB,eAAO;AAAA,MACT;AACA,YAAM,UAAU,mBAAmB,cAAc,YAAY,aAAa,CAAC,CAAC;AAC5E,UAAI;AAAA,QACF,MAAM;AAAA,QAAS;AAAA,QAAG;AAAA,QAAQ;AAAA,QAAG;AAAA,QAAS;AAAA,QACtC,KAAK,CAAC,OAAO;AACX,gBAAM,MAAM,QAAQ,EAAE;AACtB,gBAAM,OAAO,UAAU,UAAU,GAAG,QAAQ,CAAC,IAAI;AACjD,iBAAO,MAAM;AAAE,gBAAI;AAAG,mBAAO;AAAA,UAAG;AAAA,QAClC;AAAA,QACA,MAAM,MAAM,SAAS,mBAAmB,SAAYE,OAAM,IAAI,CAAC,MAAM,OAAO;AAAA,QAC5E,YAAY,MAAM,SAAS,mBAAmB,SAAY,YAAY,gBAAgB,IAAI,CAAC,IAAIA,OAAM,IAAI,CAAC,MAAM,OAAO;AAAA,MACzH;AACA,UAAI,UAAU;AAAA,IAChB;AACA,WAAO,qBAAqB,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU;AAAA,EACzD;AAEA,WAAS,aAAa;AACpB,WAAO;AAAA,MACL,YAAY,eAAe;AAAA,MAC3B,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,WAAS,UAAU,UAAoC;AACrD,oBAAgB,IAAI,QAAQ;AAC5B,QAAID,QAAoC;AACxC,WAAO,MAAM;AACX,UAAIA,MAAM,iBAAgB,OAAOA,KAAI;AACrC,MAAAA,QAAO;AAAA,IACT;AAAA,EACF;AAGA,WAAS,mBACP,KACA,OACA,YACY;AACZ,WAAO,OAAO,KAAK,OAAO,UAAU;AAAA,EACtC;AAOA,WAAS,WAAiG;AACxG,UAAM,MAAM,QAAQ;AACpB,UAAM,OAAO,OAAO,OAAO,QAAQ,YAAY,IAAI,OAAO,IAAI,IAAI,IAAI,IAAgB,IAAI;AAC1F,UAAM,OAAO,IAAI,IAAK,OAAO,OAAO,QAAQ,YAAa,IAAI,WAAqC,CAAC,CAAC;AAKpG,UAAM,iBAAiB,CAAC,MAAc,iBAAiB,IAAI,CAAC,KAAK,OAAO,GAAG,MAAM,CAAC,GAAI,aAAyC,CAAC,CAAC;AACjI,UAAM,OAAO,EAAE,KAAK,CAAC,MAAe,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAG;AAC7F,UAAM,MAAM,KAAK,IAAI;AAErB,UAAM,QAAQ,CAAC,MAAc,IAAY,UAAmB;AAC1D,YAAM,MAAM,YAAY,OAAO,IAAI,KAAK;AACxC,UAAI,CAAC,IAAK;AACV,YAAM,IAAI;AAAA,QACR,IAAI,IAAI,2BAA2B,IAAI,KAAK,GAAG;AAAA,MAGjD;AAAA,IACF;AACA,UAAM,MAA+B,EAAE,UAAU,gBAAgB;AACjE,UAAM,OAA+B,CAAC;AACtC,eAAW,KAAK,YAAY;AAC1B,UAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAG;AAC1B,UAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAQ;AACnC,UAAI,MAAM,CAAC,MAAM;AACf,cAAM,IAAI;AAAA,UACR,IAAI,IAAI,sCAAsC,CAAC;AAAA,QAEjD;AACF,YAAM,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;AACrC,UAAI,CAAC,IAAI,MAAM,CAAC;AAGhB,UAAI,QAAQ,CAAC,EAAG,MAAK,CAAC,IAAI,KAAK,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE,SAAS;AAAA,IAC/D;AAGA,UAAM,UAA0D,CAAC;AACjE,eAAW,CAAC,GAAG,CAAC,KAAKC;AACnB,UAAI,EAAE,WAAW,aAAa,EAAE,SAAS,WAAc,CAAC,QAAQ,KAAK,IAAI,YAAY,CAAC,CAAC,IAAI;AACzF,cAAM,UAAU,YAAY,CAAC,CAAC,KAAK,QAAQ,EAAE,IAAI;AACjD,gBAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,KAAK,IAAI,GAAG,MAAM,EAAE,SAAS,EAAE;AAAA,MACnE;AACF,QAAI,OAAO,KAAK,OAAO,EAAE,OAAQ,KAAI,WAAW;AAChD,QAAI,OAAO,KAAK,IAAI,EAAE,OAAQ,KAAI,QAAQ;AAC1C,WAAO;AAAA,EACT;AAEA,WAAS,WAAmB;AAC1B,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR,IAAI,IAAI;AAAA,MACV;AACF,WAAO,uCAAuC,WAAW,UAAU,IAAI,CAAC,CAAC,KAAK,kBAAkB,SAAS,CAAC,CAAC;AAAA,EAC7G;AAEA,QAAM,UAAU;AAAA,IACd,GAAG;AAAA;AAAA,IACH;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA,UAAU;AAAA;AAAA,IAEV,YAAY,OAAO,EAAE,GAAG,YAAY;AAAA,IACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA;AAAA,EACF;AAOA,QAAM,QAAQ,WAAwB;AACpC,WAAO,OAAO,MAAM,OAAO;AAAA,EAC7B;AACA,QAAM,YAAY,cAAc,KAAK,SAAS,IAAI;AAClD,QAAM,QAAQ,IAAI,MAAM;AACxB,SAAO,eAAe,OAAO,WAAW,EAAE,OAAO,UAAU,CAAC;AAC5D,SAAO,eAAe,OAAO,MAAM,EAAE,OAAO,KAAK,CAAC;AAClD,SAAO,eAAe,OAAO,OAAO,EAAE,OAAO,cAAc,CAAC;AAC5D,SAAO,eAAe,OAAO,YAAY,EAAE,OAAO,IAAI,CAAC;AACvD,SAAO;AACT;","names":["channel","set","holder","def","held","cache","p","h","subscribe","options"]}
|
|
1
|
+
{"version":3,"sources":["../../src/createStore.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useSyncExternalStore,\n RSC,\n cache,\n ClientRoot,\n type ReactElement,\n type ReactNode,\n} from './react-bindings';\n\n// ---- Server Components (Next.js App Router) -------------------------------------------------\n// <AppStore.Root> in a Server Component hands its snapshot down by store name; the store's first\n// hook below picks it up, and later snapshots (client-side navigation) merge their server data in.\ntype PendingSnapshots = Record<string, { snapshot: unknown; scope?: unknown }>;\nexport const __SnapshotContext = (RSC ? null : createContext<PendingSnapshots | null>(null)) as ReturnType<\n typeof createContext<PendingSnapshots | null>\n>;\n// Set while the page is being left (pagehide), cleared if it's shown again (back/forward cache).\n// One pair of listeners for every store: a pair per store was never removed, so each store (and each\n// createScope() in the browser) stayed alive for as long as the page did.\nlet leavingPage = false;\nif (typeof window !== 'undefined' && typeof window.addEventListener === 'function') {\n window.addEventListener('pagehide', () => { leavingPage = true; });\n window.addEventListener('pageshow', () => { leavingPage = false; });\n}\nconst storesByName = new Map<string, object>(); // the browser's stores, by name\nconst MERGE = Symbol('createStore.merge');\nconst QUIET = Symbol('createStore.quiet');\nconst APP_PERSIST = Symbol('createStore.appPersist');\nconst ALL_PAGES = Symbol('createStore.allPages');\n/** Internal: ClientRoot merges a later page's server data into the store named `name` */\nexport function __mergeSnapshot(name: string, snapshot: unknown) {\n const store = storesByName.get(name) as Record<symbol, ((s: unknown) => void) | undefined> | undefined;\n store?.[MERGE]?.(snapshot);\n}\n\n/**\n * Global state that works like useState, shared by every component:\n *\n * const store = createStore({ todos: [] as Todo[] });\n * const [todos, setTodos] = store.useGlobalState('todos');\n *\n * No provider, no reducers, no action types. Everything else is optional and\n * stays off until you use it: computed values, server data (query(), with or\n * without params or pages), persist, offline, history (undo/redo), syncTabs,\n * events, keyActions, actions, batch, reset, server rendering.\n *\n * Reading: useGlobalState('key') returns [value, setter, status] for every key,\n * computed ones too: const [total] = useGlobalState('total');\n * Only the selector form returns the value itself: useGlobalState((get) => ...).\n *\n * React comes in through ./react-bindings. The package ships it (with a server\n * version and client-root.tsx); if you copy this file in instead, that module\n * must export:\n * createContext, createElement, useCallback, useContext, useEffect, useRef,\n * useSyncExternalStore React's. In Server Components React has no hooks or\n * createContext: undefined there is fine (a namespace\n * import), the store doesn't call them there.\n * RSC true only in Server Components (typeof React.useState !== 'function')\n * cache React's cache() in Server Components (per-request stores), else undefined\n * ClientRoot a 'use client' component ({ name, snapshot, children }): provides\n * { ...parent, [name]: { snapshot } }, memoised, via __SnapshotContext,\n * and calls __mergeSnapshot(name, snapshot) in a useLayoutEffect (with\n * useEffect a new page's components would fetch before the merge).\n *\n * Map of this file: public types → createStore → build(), which holds state\n * and computed values, persistence, history, apply() (the one place every\n * change goes through), optimistic saves, queries, events, then the hooks.\n */\n\n/* =========================================================================\n Types\n ========================================================================= */\n\ntype Updater<T> = T | ((prev: T) => T);\n\n/** Options of `query(fetch, options)` */\n/** What a query reports after its first load was cancelled: see QueryOptions.whenAborted */\nexport type WhenAborted = 'loading' | 'idle';\n\nexport interface QueryOptions<T, R = T> {\n select?: (data: T) => R; // expose a transformed value; the store keeps the raw data\n initial?: T; // the value before the first response, without params (default: undefined, like a query with params)\n /**\n * What status.state says when the first load was cancelled (abort()), so nothing loaded and nothing\n * is running: 'loading' (as if still loading, until it's fetched again) or 'idle' (a fifth state,\n * only for this query). Left out: 'ready', as before.\n */\n whenAborted?: WhenAborted;\n staleTime?: number; // ms the data stays fresh (default: 30s)\n retry?: number; // retries on failure (default: 2)\n retryDelay?: RetryDelay; // ms before each retry (default: 500, 1000, 2000...)\n gcTime?: number; // ms data for params nobody shows stays cached (default: 5 minutes)\n refetchAfterMutation?: boolean; // reload after a successful server save\n}\n\n/** `pages` in `query(fetchPage, { pages: { first, next, max } })` */\nexport interface PagesOptions<TPage, TParam> {\n first: TParam; // the first request's page: 1, null for a cursor...\n next: (lastPage: TPage, pages: TPage[], page: TParam) => TParam | undefined | null; // undefined/null = no more\n max?: number; // keep only the newest N pages\n /**\n * When the list refreshes (stale when shown again, refetch(), invalidate()): 'first' (default) starts\n * over from the first page; 'loaded' fetches as many pages as were loaded, then swaps them in at\n * once, so a long list keeps its length (one request per page).\n */\n refresh?: 'first' | 'loaded';\n}\n\n/** Options of a paged query: `query(fetchPage, { pages: { ... }, staleTime, ... })` */\nexport interface PagedQueryOptions<TPage, TParam> {\n pages: PagesOptions<TPage, TParam>;\n whenAborted?: WhenAborted; // see QueryOptions.whenAborted\n staleTime?: number;\n retry?: number;\n retryDelay?: RetryDelay;\n gcTime?: number;\n}\n\n/** The third argument of `useGlobalState(key, params, options)` */\nexport interface UseOptions {\n enabled?: boolean; // false: don't load (yet), e.g. { enabled: !!id }\n /** Wait until these queries have data: pass their statuses. Gives you blocked, blockedBy and rootError. */\n waitFor?: Status | readonly Status[];\n}\n\n/** What `useGlobalState(pagedKey)` gives as its status: a Status plus page controls */\nexport interface PagedStatus extends Status {\n hasNextPage: boolean;\n fetchNextPage: () => Promise<void>; // never rejects: errors show up in `error`\n isFetchingNextPage: boolean;\n}\n\n/** `true` (or leaving it out) = the default; or your own: `attempt => 1000 * attempt` (attempt starts at 1) */\nexport type RetryDelay = true | ((attempt: number) => number);\n\n/** The default retry delay: 500ms, then 1s, 2s, 4s... */\nexport const defaultRetryDelay = (attempt: number) => 500 * 2 ** (attempt - 1);\n\n/** `U`: what the key holds before the first response: undefined, or nothing extra when `initial` is given */\nexport interface QueryDef<T, R = T, P = unknown, U = undefined, A extends WhenAborted | undefined = undefined> {\n readonly __kind: 'query';\n fetch: (params: P, signal: AbortSignal) => Promise<T>;\n options: QueryOptions<T, R>;\n /** type only: carries U (before the first response) and A (whenAborted) */\n readonly __before?: [U];\n readonly __aborted?: [A];\n}\n\n/** What `query(fetchPage, { pages })` returns */\nexport interface PagedQueryDef<TPage, TParam, P = unknown, A extends WhenAborted | undefined = undefined> {\n readonly __kind: 'pages';\n readonly __aborted?: [A];\n fetch: (page: TParam, params: P, signal: AbortSignal) => Promise<TPage>;\n options: PagedQueryOptions<TPage, TParam>;\n}\n\n/**\n * What selectors and computed functions receive. It works three ways:\n * get('todos') call it\n * state.todos read a property\n * ({ todos }) => ... destructure it\n * Every key you read is tracked as a dependency.\n */\nexport type StateReader<V> = V & (<K extends keyof V & string>(key: K) => V[K]);\n\n/** One layer of computed values. Each function can read state and every earlier layer. */\n// Returns `any`, not `unknown`: with `unknown` TypeScript stops inferring the later layers\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- see above\nexport type ComputedLayer<V> = Record<string, (get: StateReader<V>) => any>;\n\n/** `{ total: (get) => number }` becomes `{ total: number }` */\nexport type LayerValues<C> = { [K in keyof C]: C[K] extends (...args: never[]) => infer R ? R : never };\n/** An object type with no keys: adds nothing to an intersection */\nexport type NoKeys = Record<never, never>;\n// A layer that wasn't passed is inferred as the bare constraint (string keys); it adds no keys\nexport type AddedValues<C> = string extends keyof C ? NoKeys : LayerValues<C>;\n\n/** Internal: how a query with params is run */\ninterface QueryConfig {\n whenAborted?: WhenAborted;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- params are typed by the user's fetch; `unknown` would block its annotation\n fetch: (params: any, signal: AbortSignal) => Promise<unknown>;\n staleTime?: number;\n retry?: number;\n retryDelay?: RetryDelay; // ms before each retry (default: 500, 1000, 2000...)\n gcTime?: number; // ms an unused entry stays cached (default: 5 minutes)\n}\n\n/** What any InfiniteQuery fits (its callbacks take whatever their pages are) */\ntype AnyInfinite = {\n readonly __kind: 'infinite';\n firstPage: unknown;\n refresh?: 'first' | 'loaded';\n fetch: (page: never, signal: AbortSignal, params: never) => Promise<unknown>;\n nextPage: (lastPage: never, pages: never[], page: never) => unknown;\n maxPages?: number;\n retry?: number;\n retryDelay?: RetryDelay;\n gcTime?: number;\n};\n\n/** Turns `{ todos: query(fn) }` into `{ todos: Todo[] }` */\n// QueryDef is invariant in T (select's input), so both parts are inferred: [raw, selected]\ntype ValueOf<D> = D extends QueryDef<infer T, infer R, infer P, infer U> ? [T, R, P][1] | U : D;\n/** What setters write: the raw data, also for a query with `select` */\ntype RawOf<D> = D extends QueryDef<infer T, infer R, infer P, infer U> ? [T, R, P][0] | U : D;\n// Paged queries aren't state: they're read with useGlobalState(key) only\ntype NotPaged<S, K extends keyof S> = S[K] extends { readonly __kind: 'pages' } ? never : K;\nexport type RawValues<S> = { [K in keyof S as NotPaged<S, K>]: RawOf<S[K]> };\nexport type Values<S> = { [K in keyof S as NotPaged<S, K>]: ValueOf<S[K]> };\n/** Keys declared with query(...) (not paged), and with pages */\ntype QueryKeysOf<S> = { [K in keyof S]: S[K] extends { readonly __kind: 'query' } ? K : never }[keyof S] & string;\ntype PagedKeysOf<S> = { [K in keyof S]: S[K] extends { readonly __kind: 'pages' } ? K : never }[keyof S] & string;\ntype ParamsOf<D> = D extends { fetch: (params: infer P, ...rest: never[]) => unknown } ? P : never;\ntype PagedParamsOf<D> = D extends { fetch: (page: never, params: infer P, ...rest: never[]) => unknown } ? P : never;\ntype PageOf<D> = D extends { fetch: (...a: never[]) => Promise<infer Page> } ? Page : never;\n/** The hook's status for a key: with whenAborted: 'idle', its state can also be 'idle' */\ntype StatusFor<D> = D extends { readonly __aborted?: ['idle'] } ? IdleStatus : Status;\ntype PagedStatusFor<D> = D extends { readonly __aborted?: ['idle'] } ? PagedIdleStatus : PagedStatus;\n/** A query declared without params takes no params argument (not even undefined): leave it out */\ntype TakesParams<P> = [P] extends [undefined] ? never : P | undefined;\n\n/** The setter returned by useGlobalState */\nexport type SetValue<T> = <R = void>(\n value: Updater<T>,\n serverCall?: () => Promise<R> | R\n) => Promise<R>; // resolves with what the save returned (a refund, the saved record...)\n\n\n/** A per-key action: `(current, ...args) => next`, or `{ run, save }` to also save it to a server */\nexport type KeyAction<T> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- action arguments are whatever the user declares\n | ((current: T, ...args: any[]) => T)\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- same\n run: (current: T, ...args: any[]) => T;\n save?: (next: T) => Promise<unknown> | unknown; // a failed save rolls the change back\n };\n\nconst MAX_SNAPSHOT_DEPTH = 1000;\n// A path inside a message: the start and the end, not a thousand \".child\" segments\nconst shortPath = (p: string) => (p.length > 120 ? `${p.slice(0, 60)}…${p.slice(-40)}` : p);\nconst HISTORY_CHANNEL = '\\u0000history';\nconst entryChannel = (k: string) => `\\u0000${k}`; // a cache entry's channel\n/**\n * Why `value` wouldn't come back unchanged from JSON.stringify + JSON.parse, with where it is,\n * or null when it would. `at` is the path so far, like `cart[2].addedAt`.\n */\nfunction notJsonSafe(value: unknown, at: string, inArray: boolean): string | null {\n // A loop, not recursion: deeply nested state can't overflow the stack\n type Item = { v: unknown; at: string; inArray: boolean; depth: number } | { leave: object };\n const stack: Item[] = [{ v: value, at, inArray, depth: 0 }];\n const onPath = new Set<object>(); // the objects between the root and the current value: a cycle\n while (stack.length) {\n const item = stack.pop()!;\n if ('leave' in item) {\n onPath.delete(item.leave);\n continue;\n }\n const { v, at: where, inArray: inArr, depth } = item;\n switch (typeof v) {\n case 'string':\n case 'boolean':\n continue;\n case 'number':\n if (Number.isFinite(v)) continue;\n return `${where} is ${v} (JSON turns it into null)`;\n case 'undefined':\n // An object property that's undefined is simply absent after JSON, which reads the same\n if (inArr) return `${where} is undefined (JSON turns it into null)`;\n continue;\n case 'bigint':\n return `${where} is a BigInt (JSON can't hold it)`;\n case 'symbol':\n return `${where} is a symbol (JSON drops it)`;\n case 'function':\n return `${where} is a function (JSON drops it)`;\n }\n if (v === null) continue;\n const obj = v as object;\n if (onPath.has(obj)) return `${where} refers back to itself (JSON can't hold a cycle)`;\n if (depth >= MAX_SNAPSHOT_DEPTH) return `${shortPath(where)} is nested more than ${MAX_SNAPSHOT_DEPTH} levels deep (too deep to send as JSON reliably)`;\n if (!Array.isArray(obj)) {\n const proto = Object.getPrototypeOf(obj);\n if (proto !== Object.prototype && proto !== null) {\n if (obj instanceof Date) return `${where} is a Date (JSON turns it into a string)`;\n if (obj instanceof Map) return `${where} is a Map (JSON turns it into {})`;\n if (obj instanceof Set) return `${where} is a Set (JSON turns it into {})`;\n return `${where} is ${(obj.constructor?.name && `a ${obj.constructor.name}`) || 'a class instance'} (JSON keeps only its own fields, as a plain object)`;\n }\n }\n onPath.add(obj);\n stack.push({ leave: obj });\n // Children in reverse, so the first problem reported is the first one in reading order\n if (Array.isArray(obj)) {\n for (let i = obj.length - 1; i >= 0; i--) stack.push({ v: obj[i], at: `${where}[${i}]`, inArray: true, depth: depth + 1 });\n } else {\n const keys = Object.keys(obj);\n for (let i = keys.length - 1; i >= 0; i--) {\n const k = keys[i];\n stack.push({ v: (obj as Record<string, unknown>)[k], at: /^[A-Za-z_$][\\w$]*$/.test(k) ? `${where}.${k}` : `${where}[${JSON.stringify(k)}]`, inArray: false, depth: depth + 1 });\n }\n }\n }\n return null;\n}\n\n/** The id of a store's data tag: <script type=\"application/json\" id=\"createstore:<name>\"> */\nconst dataTagId = (name: string) => `createstore:${name}`;\nconst escapeAttr = (s: string) => s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n\n/**\n * A snapshot as text that's safe inside an HTML <script> tag: JSON, with every character that\n * could end the tag or the script escaped. Use it instead of JSON.stringify:\n * `<script>window.__STATE__ = ${serializeSnapshot(scope.snapshot())}</script>`\n */\nexport function serializeSnapshot(snapshot: unknown): string {\n return JSON.stringify(snapshot)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n\n/** No keys outside the state: `keyActions: { nope: ... }` is a type error */\nexport type NoExtraKeys<KA, S> = Exclude<keyof KA, keyof S> extends never ? unknown : { [K in Exclude<keyof KA, keyof S>]: never };\n\nexport type KeyActionsMap<S> = {\n [K in keyof S]?: Record<string, KeyAction<RawOf<S[K]>>>;\n};\n\ntype ActionArgs<F> = F extends (current: never, ...args: infer P) => unknown\n ? P\n : F extends { run: (current: never, ...args: infer P) => unknown }\n ? P\n : never;\n\n/** `{ add: (todos, text: string) => ... }` becomes `{ add: (text: string) => Promise<void> }` */\ntype BoundActions<M> = {\n [N in keyof M]: (...args: ActionArgs<M[N]>) => Promise<void>;\n};\n// Without keyActions, KA is inferred as its bare constraint (an index signature per key): no actions\ntype ActionsFor<KA, K> = K extends keyof KA\n ? string extends keyof NonNullable<KA[K]> ? unknown : BoundActions<NonNullable<KA[K]>>\n : unknown;\n\n/** Store members a state key can't shadow when it's exposed directly as `store.<key>` */\nexport type ReservedName =\n | 'useGlobalState' | 'getState' | 'setState' | 'set' | 'actions'\n | 'undo' | 'redo' | 'goTo' | 'useHistory' | 'subscribe' | 'reset' | 'destroy' | 'hydrated'\n | 'emit' | 'on' | 'fetchQuery' | 'setQueryData' | 'invalidate' | 'whenOnline' | 'batch' | 'abort'\n | 'createScope' | 'Root' | 'hydrate' | 'snapshot';\n\n/** `store.cart.add(...)`: every state key's setter, with its key actions, unless its name is reserved */\nexport type DirectSetters<S, KA> = Omit<SettersOf<S, KA>, ReservedName>;\n\n/** In actions: api.cart.add(...) and api.cart(value), like on the store (minus the api's own names) */\nexport type ApiSetters<S, KA> = Omit<SettersOf<S, KA>, keyof StoreApi<NoKeys>>;\n\n/** `store.set`: the setter (with its actions) of every state key */\ntype SettersOf<S, KA> = {\n [K in keyof S & string as NotPaged<S, K>]: SetValue<RawOf<S[K]>> & ActionsFor<KA, K>;\n};\n\n/** What a status means, in one word: switch on it instead of checking flags in the right order */\nexport type StatusState = 'waiting' | 'loading' | 'error' | 'ready';\n/** The status of a query with whenAborted: 'idle': its first load was cancelled, nothing is running */\nexport interface IdleStatus extends Omit<Status, 'state'> {\n state: StatusState | 'idle';\n}\n/** ...and of a paged one */\nexport interface PagedIdleStatus extends Omit<PagedStatus, 'state'> {\n state: StatusState | 'idle';\n}\n\nexport interface Status {\n /**\n * 'waiting': params not known yet, enabled: false, or a waitFor query isn't ready (no request).\n * 'loading': first load, nothing to show yet. 'error': it failed and there's no data to show.\n * 'ready': there's data (also while refreshing in the background, or after a refresh failed).\n */\n state: StatusState;\n loading: boolean; // first load, no data yet\n fetching: boolean; // any request in progress\n error: unknown; // last error, or null\n /** Waiting, not loading: its params aren't known yet, `enabled` is false, or a `waitFor` query isn't ready */\n blocked: boolean;\n /** The query it's waiting for (through a whole waitFor chain), or null */\n blockedBy: string | null;\n /** Why it's waiting: the error of the query at the start of a waitFor chain that failed, or null */\n rootError: unknown;\n refetch: () => Promise<void>; // does nothing while blocked\n}\n\nexport interface ChangeEvent {\n key: string;\n prev: unknown;\n next: unknown;\n source: 'local' | 'server' | 'remote' | 'history' | 'devtools' | 'storage' | 'hydrate';\n time: number;\n}\n\n/** Default when no `events` option is given: any name, any payload (the old behavior) */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- untyped events accept any payload on purpose\nexport type AnyEvents = Record<string, any>;\n\nexport interface EmitOptions {\n /** Also run the handlers in other tabs (needs `syncTabs: true`). Default: this tab only. */\n broadcast?: boolean;\n}\n\n/** emit's arguments after the name: the payload (optional when it allows undefined or is void), then options */\nexport type EmitArgs<E, K extends keyof E> = undefined extends E[K]\n ? [payload?: E[K], options?: EmitOptions]\n : [payload: E[K], options?: EmitOptions];\n\nexport interface StoreApi<V, E extends object = AnyEvents, W = V> {\n getState<K extends keyof V & string>(key: K): V[K];\n setState<K extends keyof W & string, R = void>(\n key: K,\n value: Updater<W[K]>,\n serverCall?: () => Promise<R> | R\n ): Promise<R>; // resolves with what the save returned\n emit<K extends keyof E & string>(event: K, ...args: EmitArgs<E, K>): void;\n on<K extends keyof E & string>(event: K, handler: (payload: E[K]) => void): () => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- untyped by name; `unknown` would force a cast at every call site\n fetchQuery(name: string, params?: unknown, force?: boolean): Promise<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- same; also lets `(old) => ...` updaters go unannotated\n setQueryData(name: string, updater: any, params?: unknown): void;\n invalidate(name: string): Promise<void>;\n /** Runs the task now, or once back online. Read state inside the task, not before (see below). */\n whenOnline(task: () => Promise<unknown> | unknown): Promise<unknown>;\n batch<T>(fn: () => T): T;\n abort(name: string): void;\n}\n\n/**\n * Where persisted state is kept. localStorage and sessionStorage already fit;\n * adapters for IndexedDB, Capacitor, Electron or React Native AsyncStorage can\n * return Promises.\n */\nexport interface StorageAdapter {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem?(key: string): void | Promise<void>;\n}\n\nexport interface PersistOptions<S = Record<string, unknown>> {\n storage?: 'local' | 'session' | StorageAdapter; // default: 'local'\n keys?: (keyof S)[]; // save only these\n exclude?: (keyof S)[]; // save every plain key except these (e.g. an access token)\n /** Bump when the saved shape changes (default: 0; data saved before versioning counts as 0) */\n version?: number;\n /** Turn data saved by an older version into the current shape. Without it, old data is dropped. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- old data has the shape an older version saved; the user types it\n migrate?: (persisted: any, version: number) => unknown;\n /** Wait this many ms after the last change before saving (typing doesn't write on every key). Flushed when the page is hidden. */\n debounce?: number;\n}\n\nexport interface StoreOptions<S, A, KA = NoKeys, E extends object = AnyEvents> {\n name?: string;\n persist?: boolean | 'local' | 'session' | PersistOptions<S>;\n /** Keep other tabs in sync. `{ keys }` sends only those keys; `{ exclude }` sends everything else (e.g. tokens) */\n syncTabs?: boolean | { keys?: (keyof S & string)[]; exclude?: (keyof S & string)[] };\n history?: boolean | { limit?: number; keys?: (keyof S & string)[] };\n devtools?: boolean;\n /**\n * Reuse one instance per page under `name` (survives hot reload).\n * Never use it on the server: every request would share the same store and\n * leak one user's state to another. For SSR, create the store per request\n * (call createStore inside a function) and pass it down, e.g. via context.\n */\n shared?: boolean;\n /**\n * One store per request, guaranteed. Wrap the app in `<store.Root initialState={...}>`:\n * on the server every render gets its own store; in the browser Root fills the\n * app's store with the same initial state, so hydration matches. Using the store\n * on the server outside a Root or Scope throws instead of sharing data between requests.\n */\n ssr?: boolean | { keys?: (keyof S & string)[]; exclude?: (keyof S & string)[]; version?: number };\n logger?: boolean;\n onChange?: (e: ChangeEvent) => void;\n /**\n * Keep server data and queue saves while offline. `maxSize`: the most characters one saved copy may take\n * (default 2,000,000). Kept in localStorage: queries without params under `<name>:inline`, with params and\n * paged under `<name>:queries`. It holds per-user data until `reset()`, so call that on sign-out.\n */\n offline?: boolean | { maxSize?: number };\n /**\n * Check data the store didn't write itself before using it: saved state, the offline copy and\n * other tabs' changes. Return false (or throw) to ignore that value; the key keeps what it had.\n */\n validate?: (key: string, value: unknown, from: 'storage' | 'offline' | 'remote') => boolean;\n actions?: (api: StoreApi<Values<S>, E, RawValues<S>> & ApiSetters<S, KA>) => A;\n /** Event names and payload types: `events: defineEvents<{ toast: string }>()`. Type-only. */\n events?: E;\n /** Actions per state key, used as `setTodos.add(...)`: `{ todos: { add: (todos, text) => [...] } }` */\n keyActions?: KA;\n /** Called for every keyActions call that has a `save` */\n onSaveStart?: (key: string, action: string) => void;\n onSaveSuccess?: (key: string, action: string) => void;\n onSaveError?: (key: string, action: string, error: unknown) => void;\n}\n\n/* =========================================================================\n Helpers you use inside the initial state\n ========================================================================= */\n\nconst QUERY_OPTIONS = new Set(['select', 'initial', 'staleTime', 'retry', 'retryDelay', 'gcTime', 'refetchAfterMutation', 'whenAborted']);\nconst PAGED_OPTIONS = new Set(['pages', 'staleTime', 'retry', 'retryDelay', 'gcTime', 'whenAborted']);\nconst PAGES_OPTIONS = new Set(['first', 'next', 'max', 'refresh']);\n// Options that exist, but somewhere else: where each one belongs\nconst BELONGS: Record<string, string> = {\n enabled: 'enabled is an option of the hook: useGlobalState(key, params, { enabled }), not of query()',\n first: 'first goes inside pages: query(fetchPage, { pages: { first, next } })',\n next: 'next goes inside pages: query(fetchPage, { pages: { first, next } })',\n max: 'max goes inside pages: query(fetchPage, { pages: { first, next, max } })',\n maxPages: 'maxPages is now pages.max: query(fetchPage, { pages: { first, next, max } })',\n firstPage: 'firstPage is now pages.first: query(fetchPage, { pages: { first, next } })',\n nextPage: 'nextPage is now pages.next: query(fetchPage, { pages: { first, next } })',\n fetch: 'the fetch function is query()\\'s first argument: query(fetch, options)',\n};\n\n/** Throws a clear error for an option in the wrong place or a typo */\nfunction checkQueryOptions(options: Record<string, unknown>) {\n if (!options || typeof options !== 'object') throw new Error(`query(fetch, options): options must be an object.`);\n const wa = options.whenAborted;\n if (wa !== undefined && wa !== 'loading' && wa !== 'idle')\n throw new Error(`query(): whenAborted is 'loading' or 'idle' (or left out, for 'ready'), not ${JSON.stringify(wa)}.`);\n const paged = 'pages' in options;\n for (const k of Object.keys(options)) {\n if ((paged ? PAGED_OPTIONS : QUERY_OPTIONS).has(k)) continue;\n if (paged && QUERY_OPTIONS.has(k))\n throw new Error(`query(): ${k} can't be used with pages. A paged query's value is its list of pages; ${k} is for queries without pages.`);\n throw new Error(`query(): ${BELONGS[k] ?? `there's no option \"${k}\". Options: ${[...(paged ? PAGED_OPTIONS : QUERY_OPTIONS)].join(', ')}`}.`);\n }\n if (paged) {\n const pages = options.pages as Record<string, unknown> | null;\n if (!pages || typeof pages !== 'object') throw new Error(`query(): pages must be an object: { first, next }.`);\n for (const k of Object.keys(pages))\n if (!PAGES_OPTIONS.has(k))\n throw new Error(`query(): pages has no option \"${k}\". Inside pages: first, next, max, refresh${QUERY_OPTIONS.has(k) || PAGED_OPTIONS.has(k) ? ` (${k} goes next to pages, not inside it)` : ''}.`);\n if (!('first' in pages)) throw new Error(`query(): pages needs first, the first request's page (1, or null for a cursor).`);\n if (typeof pages.next !== 'function') throw new Error(`query(): pages.next must be a function: (lastPage, pages, page) => the next page, or undefined at the end.`);\n if (pages.refresh !== undefined && pages.refresh !== 'first' && pages.refresh !== 'loaded')\n throw new Error(`query(): pages.refresh is 'first' (start over, the default) or 'loaded' (refetch as many pages as were loaded), not ${JSON.stringify(pages.refresh)}.`);\n }\n}\n\n/**\n * Data from your server, read like any other key.\n * todos: query(fetchTodos) read as useGlobalState('todos')\n * user: query((id, signal) => fetchUser(id, signal)) read as useGlobalState('user', id)\n * feed: query((page) => fetchFeed(page), { pages: { first: 1, next } })\n * Without params, a query is a state key (undo, persist, key actions, computed values work with it).\n * With params, each params gets its own cached entry. With pages, it's a paged list.\n * Until its first response it holds undefined (typed so), unless you give `initial` (e.g. [] for a list).\n * The AbortSignal is always the argument after params, so a query without params takes a placeholder:\n * sports: query((_: undefined, signal) => fetchSports(signal))\n */\nexport function query<TPage, TParam, P = undefined, A extends WhenAborted | undefined = undefined>(\n fetch: (page: TParam, params: P, signal: AbortSignal) => Promise<TPage>,\n options: PagedQueryOptions<TPage, TParam> & { whenAborted?: A }\n): PagedQueryDef<TPage, TParam, P, A>;\nexport function query<T, R = T, P = undefined, A extends WhenAborted | undefined = undefined>(\n fetch: (params: P, signal: AbortSignal) => Promise<T>,\n options: QueryOptions<T, R> & { initial: T; whenAborted?: A }\n): QueryDef<T, R, P, never, A>;\nexport function query<T, R = T, P = undefined, A extends WhenAborted | undefined = undefined>(\n fetch: (params: P, signal: AbortSignal) => Promise<T>,\n options?: QueryOptions<T, R> & { whenAborted?: A }\n): QueryDef<T, R, P, undefined, A>;\nexport function query(fetch: (...args: never[]) => Promise<unknown>, options: object = {}): unknown {\n if (typeof fetch !== 'function') throw new Error(`query(fetch, options): fetch must be a function that returns a promise.`);\n checkQueryOptions(options as Record<string, unknown>);\n return { __kind: 'pages' in options ? 'pages' : 'query', fetch, options };\n}\n\n/** Throws a clear error for a hook option in the wrong place or a typo */\nfunction checkUseOptions(options: unknown, key: string) {\n if (options === undefined) return;\n if (!options || typeof options !== 'object')\n throw new Error(`useGlobalState(\"${key}\", params, options): options must be an object like { enabled }.`);\n for (const k of Object.keys(options))\n if (k !== 'enabled' && k !== 'waitFor')\n throw new Error(\n `useGlobalState(\"${key}\", params, options): ${QUERY_OPTIONS.has(k) || PAGED_OPTIONS.has(k) ? `${k} is an option of the query: query(fetch, { ${k} }), not of the hook` : `there's no option \"${k}\"; the hook takes { enabled, waitFor }`}.`\n );\n const w = (options as UseOptions).waitFor;\n if (w !== undefined && !(Array.isArray(w) ? w : [w]).every((s) => s && typeof s === 'object' && 'loading' in s && 'blocked' in s))\n throw new Error(\n `useGlobalState(\"${key}\", params, { waitFor }): waitFor takes the status of another query (the third item of its ` +\n `useGlobalState), or a list of them: const [user, , userStatus] = useGlobalState('currentUser'), then { waitFor: userStatus }.`\n );\n}\n\n/**\n * Declares the store's events and their payload types:\n * events: defineEvents<{ toast: string; saved: { id: number } }>()\n * It only carries the type; nothing happens at runtime.\n */\nexport function defineEvents<E extends object>(): E {\n return undefined as unknown as E;\n}\n\n\n/* =========================================================================\n Public entry\n ========================================================================= */\n\ntype L<C> = LayerValues<C>;\ntype AllComputed<C1, C2, C3, C4, C5, C6, C7, C8> = AddedValues<C1> & AddedValues<C2> &\n AddedValues<C3> & AddedValues<C4> & AddedValues<C5> & AddedValues<C6> & AddedValues<C7> &\n AddedValues<C8>;\n\n/**\n * `computed` is a list of layers (up to 8). A layer's functions can read state and every\n * earlier layer, so a value that reads another computed value goes in a later layer.\n */\nexport function createStore<\n S extends object,\n C1 extends ComputedLayer<Values<S>>,\n C2 extends ComputedLayer<Values<S> & L<C1>>,\n C3 extends ComputedLayer<Values<S> & L<C1> & L<C2>>,\n C4 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3>>,\n C5 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3> & L<C4>>,\n C6 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3> & L<C4> & L<C5>>,\n C7 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3> & L<C4> & L<C5> & L<C6>>,\n C8 extends ComputedLayer<Values<S> & L<C1> & L<C2> & L<C3> & L<C4> & L<C5> & L<C6> & L<C7>>,\n KA extends KeyActionsMap<S> & NoExtraKeys<KA, S>,\n A extends Record<string, (...args: never[]) => unknown> = NoKeys,\n E extends object = AnyEvents\n>(\n initialState: S,\n options: StoreOptions<S, A, KA, E> & {\n computed?:\n | [C1]\n | [C1, C2]\n | [C1, C2, C3]\n | [C1, C2, C3, C4]\n | [C1, C2, C3, C4, C5]\n | [C1, C2, C3, C4, C5, C6]\n | [C1, C2, C3, C4, C5, C6, C7]\n | [C1, C2, C3, C4, C5, C6, C7, C8];\n } = {}\n): Store<S, A, KA, AllComputed<C1, C2, C3, C4, C5, C6, C7, C8>, E> &\n ScopeApi<S, Store<S, A, KA, AllComputed<C1, C2, C3, C4, C5, C6, C7, C8>, E>> {\n type CV = AllComputed<C1, C2, C3, C4, C5, C6, C7, C8>;\n checkStoreOptions(options);\n if ('queries' in options)\n throw new Error(\n `[${options.name ?? 'store'}] the queries option was replaced: declare each query in the state with ` +\n `query(fetch, options), e.g. { product: query((id, signal) => api.product(id, signal)) }, and read it with useGlobalState('product', id).`\n );\n return withScopes<S, A, KA, CV, E>(initialState, options, makeBase<S, A, KA, CV, E>(initialState, options));\n}\n\nconst STORE_OPTIONS = new Set([\n 'name', 'persist', 'syncTabs', 'history', 'devtools', 'shared', 'ssr', 'logger', 'onChange', 'offline',\n 'validate', 'events', 'computed', 'keyActions', 'actions', 'queries',\n]);\nconst warnedOptions = new Set<string>();\n/** A typo in an option (\"persits\") or a persisted store with no name is a silent bug: say so, once */\nfunction checkStoreOptions(opts: object) {\n const options = opts as Record<string, unknown>;\n const warn = (message: string) => {\n if (warnedOptions.has(message)) return;\n warnedOptions.add(message);\n console.warn(message);\n };\n const id = (options.name as string | undefined) ?? 'store';\n for (const k of Object.keys(options))\n if (!STORE_OPTIONS.has(k))\n warn(`[${id}] createStore() has no option \"${k}\", so it is ignored. Options: ${[...STORE_OPTIONS].filter((o) => o !== 'queries').join(', ')}.`);\n if (!options.name && (options.persist || options.syncTabs || options.offline || options.shared))\n warn(\n `[store] persist, syncTabs, offline and shared use the store's name to tell stores apart. Without { name: '...' }, every unnamed ` +\n `store uses \"store\", so two of them would overwrite each other's saved data and mix up their tabs. Give this one a name.`\n );\n}\n\n/** The app's own store: shared under its name in the browser when `shared` is set */\nconst warnedSharedOnServer = new Set<string>();\nconst warnedShape = new Set<symbol>();\nconst SHAPE = Symbol('createStore.shape');\n/** What a hot reload can change about a store: its keys, computed values, key actions, options */\nfunction definitionShape(initialState: object, opts: object): string {\n const options = opts as Record<string, unknown>;\n const names = (o: unknown) => (o && typeof o === 'object' ? Object.keys(o).sort().join(',') : '');\n const computed = ((options.computed as Record<string, unknown>[] | undefined) ?? []).map(names).join('|');\n const keyActions = Object.entries((options.keyActions as Record<string, object> | undefined) ?? {}).map(([k, v]) => `${k}:${names(v)}`).sort().join(';');\n return [names(initialState), computed, keyActions, names(options)].join('#');\n}\n\nfunction makeBase<\n S extends object,\n A,\n KA,\n CV,\n E extends object\n>(initialState: S, options: StoreOptions<S, A, KA, E> & { computed?: readonly Record<string, (get: never) => unknown>[] }): Store<S, A, KA, CV, E> {\n if (!options.shared) return build<S, A, KA, CV, E>(initialState, options);\n if (typeof window === 'undefined') {\n // On the server a shared store would be one store for every request (one user's\n // state leaking to another), so `shared` is ignored there: each call gets its own.\n // Said once per store, and not at all with ssr: true (which already gives per-request stores).\n const id = options.name ?? 'store';\n if (!options.ssr && !warnedSharedOnServer.has(id) && warnedSharedOnServer.add(id))\n console.warn(\n `[${options.name ?? 'store'}] shared: true is ignored on the server: each createStore() call gets ` +\n `its own store. Also don't keep per-user data in a module-level store there; create it per request.`\n );\n return build<S, A, KA, CV, E>(initialState, options);\n }\n const slot = Symbol.for(`createStore:${options.name ?? 'store'}`);\n const g = globalThis as unknown as Record<symbol, unknown>;\n // #12: a hot reload that changed the definition gets the old store (that's what `shared` is\n // for), so say so instead of silently using the old keys, computed values and actions\n const shape = definitionShape(initialState, options);\n const existing = g[slot] as (Store<S, A, KA, CV, E> & Record<symbol, string>) | undefined;\n if (existing && existing[SHAPE] !== shape && !warnedShape.has(slot) && warnedShape.add(slot))\n console.warn(\n `[${options.name ?? 'store'}] the store's definition changed (a hot reload?), but shared: true keeps the existing store, ` +\n `with its old keys, computed values and actions. Reload the page to use the new definition.`\n );\n if (existing) return existing;\n const store = build<S, A, KA, CV, E>(initialState, options);\n Object.defineProperty(store, SHAPE, { value: shape });\n return (g[slot] = store) as Store<S, A, KA, CV, E>;\n}\n\n/**\n * What `snapshot()` returns and `hydrate()` takes: plain values of state keys, plus `$queries`,\n * the loaded data of named and infinite queries (by cache entry; treat it as opaque).\n */\nexport type Snapshot<S> = Partial<RawValues<S>> & { $version?: number; $queries?: Record<string, unknown>; $ages?: Record<string, number> };\n\n/**\n * The store in a React Server Component (the server build): every request gets its own store,\n * through React's per-request cache(), so `AppStore.fetchQuery(...)` in a page is that request's.\n * <Root> with no props sends it to the browser. Outside a render (Server Actions, Route Handlers)\n * there's no request store, so it says to use createScope() there.\n */\nfunction serverComponentStore(name: string, named: boolean, createScope: () => unknown): object {\n const requestStore = cache!(() => ({ scope: createScope() as Record<string | symbol, unknown> }));\n const current = (what: string) => {\n const store = requestStore();\n if (store !== requestStore())\n throw new Error(\n `[${name}] ${what} was used outside a Server Component render, so there's no request store to use. ` +\n `In Server Actions and Route Handlers, create one: const scope = createScope(), then scope.fetchQuery(...).`\n );\n return store.scope;\n };\n const clientOnly = (hook: string) => () => {\n throw new Error(`[${name}] ${hook}() only works in Client Components ('use client'). In a Server Component, load the data directly: await fetchQuery(...).`);\n };\n const Root = ({ scope, children }: { scope?: { snapshot: () => unknown }; children?: ReactNode }) => {\n if (!named)\n throw new Error(`[${name}] <Root> in a Server Component needs the store's name, so the browser can find its data: createStore(state, { name: 'shop', ssr: true }).`);\n const store = scope ?? (current('<Root>') as unknown as { snapshot: () => unknown });\n return createElement(ClientRoot as never, { name, snapshot: store.snapshot() }, children);\n };\n const own: Record<string, unknown> = {\n createScope, Root,\n useGlobalState: clientOnly('useGlobalState'), useHistory: clientOnly('useHistory'),\n hydrate: () => {\n throw new Error(`[${name}] hydrate() is for the browser. In a Server Component, load data with fetchQuery(...) and render <Root>.`);\n },\n };\n return new Proxy({}, {\n get(_t, p) {\n if (typeof p !== 'string' || p === 'then') return undefined;\n if (p in own) return own[p];\n return current(`${p}()`)[p]; // the request's store: its methods, setters and key actions\n },\n has: (_t, p) => typeof p === 'string' && (p in own || p in current(`${String(p)}`)),\n });\n}\n\n/** What createStore adds on top of a store, for server rendering */\nexport interface ScopeApi<S, Inst> {\n /**\n * A new, independent store: the same keys, computed values and options, its own state.\n * `initial` replaces initial values (query keys given data count as loaded). This is the\n * request's store on the server. Scopes don't persist, sync tabs, keep an offline cache\n * or connect to devtools.\n */\n createScope(initial?: Partial<RawValues<S>> | Snapshot<S>): Inst;\n /**\n * Browser only: fills the app's store with the snapshot the server sent, once, and returns\n * it for `<Root scope={...}>`. With no argument, reads the data tag the server wrote with\n * scope.toScript(). Keys the store doesn't have are ignored with a warning.\n */\n hydrate(snapshot?: Snapshot<S> | null): Inst;\n /**\n * Components inside use `scope`: `<Root scope={scope}>`. Needs `ssr: true`. In a Server Component,\n * leave `scope` out: <Root> sends the request's store (`await AppStore.fetchQuery(...)` first).\n */\n Root(props: { scope?: Inst; children?: ReactNode }): ReactElement;\n}\n\n// Browser stores already filled from a snapshot (kept across hot reloads: a shared store\n// is the same object every time, and it must not be filled again)\nconst hydratedStores = new WeakSet<object>();\n\n// The store's own hooks, kept before createStore puts routed ones in their place\nconst OWN_HOOKS = Symbol('createStore.ownHooks');\ntype OwnHooks = Record<'useGlobalState' | 'useHistory', (...args: never[]) => unknown>;\n\nfunction withScopes<\n S extends object,\n A,\n KA,\n CV,\n E extends object\n>(\n initialState: S,\n options: StoreOptions<S, A, KA, E> & { computed?: readonly Record<string, (get: never) => unknown>[] },\n base: Store<S, A, KA, CV, E>\n): Store<S, A, KA, CV, E> & ScopeApi<S, Store<S, A, KA, CV, E>> {\n type Inst = Store<S, A, KA, CV, E>;\n const name = options.name ?? 'store';\n const onServer = () => typeof window === 'undefined';\n const guard = !!options.ssr;\n // React's server build has no createContext; the Server Component path below never uses Ctx\n const Ctx = (RSC ? null : createContext<Inst | null>(null)) as ReturnType<typeof createContext<Inst | null>>;\n const seedOf = (inst: Inst) => (inst as unknown as Record<symbol, (v: Record<string, unknown>) => void>)[SEED];\n const b = base as unknown as Record<string | symbol, unknown>;\n // A shared store is wrapped again after hot reloading: keep its original hooks from the first time\n const own = (b[OWN_HOOKS] ??= {\n useGlobalState: b.useGlobalState, useHistory: b.useHistory,\n }) as OwnHooks;\n const stateKeys = new Set([...Object.keys(initialState), '$queries', '$ages', '$version']);\n const ssrVersion = (options.ssr && typeof options.ssr === 'object' && options.ssr.version) || 0;\n\n // The stores a <Root> may provide: this store and its own scopes, not another store's\n const ownScopes = new WeakSet<object>([base]);\n const createScope = (initial?: Partial<RawValues<S>> | Snapshot<S>): Inst => {\n const scope = build<S, A, KA, CV, E>(initialState, {\n ...options, shared: false, persist: false, syncTabs: false, offline: false, devtools: false,\n ...({ [APP_PERSIST]: (options as Record<symbol, unknown>)[APP_PERSIST] ?? options.persist } as object), // what the app saves: kept out of snapshots\n }, (base as unknown as Record<symbol, Definition>)[DEFINITION]);\n if (initial) seedOf(scope)(initial as Record<string, unknown>);\n ownScopes.add(scope);\n return scope;\n };\n\n // The data tag scope.toScript() wrote, read once and removed (null if there isn't one)\n const readDataTag = (): Snapshot<S> | null => {\n if (!options.name) {\n console.warn(`[${name}] hydrate() with no argument needs the store's name to find its data tag: createStore(state, { name: 'shop', ssr: true }).`);\n return null;\n }\n // Only a <script type=\"application/json\"> is data, and of those the LAST one: the server writes\n // toScript() after the page's content, so an element in that content carrying the same id (user\n // HTML like a profile bio: sanitizers keep ids on divs) can never be read as server data.\n const id = dataTagId(name);\n const tags = Array.from(document.getElementsByTagName('script')).filter((s) => s.id === id && s.type === 'application/json');\n const el = tags[tags.length - 1];\n const others = document.querySelectorAll(`[id=\"${id.replace(/\"/g, '\\\\\"')}\"]`).length - (el ? 1 : 0);\n if (others > 0)\n console.warn(`[${name}] hydrate() found ${others} other element(s) with the data tag's id \"${id}\" and ignored them: only the last <script type=\"application/json\"> (the one toScript() writes after the page) is read. If the page shows user-written HTML, that's where they came from.`);\n if (!el) {\n console.warn(`[${name}] hydrate() found no data tag (id \"${dataTagId(name)}\"), so the app starts from its initial state. Did the server add scope.toScript() to the page?`);\n return null;\n }\n el.remove();\n try {\n return JSON.parse(el.textContent ?? 'null') as Snapshot<S> | null;\n } catch {\n console.warn(`[${name}] hydrate() couldn't read the data tag (not valid JSON), so the app starts from its initial state.`);\n return null;\n }\n };\n const hydrate = (...args: [(Snapshot<S> | null)?]): Inst => {\n let snapshot = args[0];\n if (onServer())\n throw new Error(`[${name}] hydrate() is for the browser. On the server, create the request's store with createScope(...).`);\n // The browser has one store. Fill it once: like useState's initial value, a later call (a\n // remount, StrictMode's second render, hot reload) doesn't overwrite what changed since.\n if (!hydratedStores.has(base)) {\n hydratedStores.add(base);\n if (args.length === 0) snapshot = readDataTag(); // hydrate(): the data the server put in the page\n // A snapshot made for another state shape (an old cached page after a deployment) is\n // ignored rather than seeded: React then renders this page fresh in the browser.\n const given = snapshot && typeof snapshot === 'object' ? ((snapshot as { $version?: unknown }).$version ?? 0) : ssrVersion;\n if (given !== ssrVersion) {\n console.warn(`[${name}] hydrate() ignored a snapshot made for version ${String(given)}; this app expects version ${ssrVersion} (ssr.version). The page renders from the initial state instead.`);\n return base;\n }\n if (snapshot && typeof snapshot === 'object') {\n const known: Record<string, unknown> = {};\n const notInStore: string[] = [];\n for (const [k, v] of Object.entries(snapshot)) {\n if (stateKeys.has(k)) known[k] = v;\n else notInStore.push(k);\n }\n // A snapshot can come from an older deployment: a removed key shouldn't break the page\n if (notInStore.length)\n console.warn(`[${name}] hydrate() ignored ${notInStore.map((k) => `\"${k}\"`).join(', ')}: not in the store. Was the snapshot made by another version of the app?`);\n seedOf(base)(known);\n }\n }\n return base;\n };\n\n let warnedNested = false;\n // Snapshots from Server Components already applied: the first fills the store (hydrate), later\n // ones (client-side navigation) only add server data, so nothing the user changed is overwritten\n const appliedSnapshots = new WeakSet<object>();\n const fromServer = (snapshot: unknown) => {\n if (!snapshot || typeof snapshot !== 'object' || appliedSnapshots.has(snapshot)) return;\n appliedSnapshots.add(snapshot);\n if (!hydratedStores.has(base)) {\n hydrate(snapshot as Snapshot<S>);\n return;\n }\n const snap = snapshot as Record<string, unknown>;\n if ((snap.$version ?? 0) !== ssrVersion) return; // another version's data: not merged\n const queryDefs = (b[DEFINITION] as Definition | undefined)?.queryDefs ?? {};\n const serverData: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(snap)) if (k === '$queries' || k === '$ages' || k in queryDefs) serverData[k] = v;\n seedOf(base)(serverData);\n };\n b[MERGE] = fromServer;\n const withHeldNotify = (fn: () => void) => ((b[QUIET] as ((f: () => void) => void) | undefined) ?? ((f: () => void) => f()))(fn);\n if (options.name && !onServer()) storesByName.set(name, base);\n\n const Root = ({ scope, children }: { scope?: Inst; children?: ReactNode }) => {\n const parent = useContext(Ctx);\n // Nesting a Root with its own createScope() in the browser is how part of a page gets an\n // isolated store. These two are mistakes: two request stores in one server render, and the\n // browser's app store under another Root.\n if (parent && scope && !warnedNested && (onServer() || scope === base)) {\n warnedNested = true;\n console.warn(\n onServer()\n ? `[${name}] <Root> is nested inside another <Root> during server rendering, so part of the page uses a ` +\n `different store than the request's. Render <Root scope={...}> once, at the top of the app.`\n : `[${name}] the app's store (from hydrate()) is given to a <Root> nested inside another <Root>. ` +\n `Render <Root scope={hydrate(snapshot)}> once, at the top of the app.`\n );\n }\n if (!scope)\n throw new Error(\n `[${name}] <Root> needs a scope here: <Root scope={createScope(...)}> on the server, <Root scope={hydrate(snapshot)}> in the browser. ` +\n `(Only in a Server Component can <Root> go without one: there it sends the request's store.)`\n );\n if (!ownScopes.has(scope))\n throw new Error(`[${name}] <Root> got a scope made by a different store. Pass ${name === 'store' ? 'this store' : name}'s own: createScope() or hydrate() of the same store whose hooks the components use.`);\n return createElement(Ctx.Provider, { value: scope }, children);\n };\n\n // Hooks use the nearest Root, else the app's store. Plain parameters, no spreading:\n // these run on every render of every component.\n const useInstance = (hook: string): Inst | null => {\n const scoped = useContext(Ctx);\n const pending = useContext(__SnapshotContext); // a Server Component's <Root>, if any (always read: same hooks every render)\n if (scoped) return scoped !== base ? scoped : null;\n const mine = pending?.[name];\n if (mine) {\n if (onServer()) {\n // Next.js rendering Client Components for one request: a store for this request, from its snapshot\n return (mine.scope ??= createScope(mine.snapshot as Partial<RawValues<S>>)) as Inst;\n }\n // The browser: fill the app's store (the first snapshot) or add a later page's server data.\n // It must be there for this render (hydration compares with the server HTML), but other\n // components mustn't be updated while this one renders: so write now, notify right after.\n withHeldNotify(() => fromServer(mine.snapshot));\n return null;\n }\n if (guard && onServer())\n throw new Error(\n `[${name}] ${hook}() ran during server rendering outside <Root>. On the server every request needs its own ` +\n `store: render the app inside <Root scope={createScope(...)}>.`\n );\n return null; // the app's store: call its own hook directly\n };\n type H = (a?: never, b?: never, c?: never) => unknown;\n const scopedHook = (inst: Inst, hook: string) => (inst as unknown as Record<string, H>)[hook];\n function useGlobalState(a?: never, c?: never, d?: never) {\n const inst = useInstance('useGlobalState');\n const hook = inst ? scopedHook(inst, 'useGlobalState') : (own.useGlobalState as H);\n // Forward exactly what was passed: useGlobalState(key, undefined) means \"params not known yet\"\n // (arguments.length, not a rest array: that would be allocated on every render)\n const n = arguments.length;\n return n === 1 ? hook(a) : n === 2 ? hook(a, c) : hook(a, c, d);\n }\n function useHistory() {\n const inst = useInstance('useHistory');\n return inst ? scopedHook(inst, 'useHistory')() : (own.useHistory as H)();\n }\n const added: Record<string, unknown> = { useGlobalState, useHistory, createScope, hydrate, Root };\n if (RSC) return serverComponentStore(name, options.name !== undefined, createScope) as Inst & ScopeApi<S, Inst>;\n\n if (!guard) {\n // Without ssr: true, nothing reads a context: hooks stay the store's own, so apps that don't\n // server-render pay nothing for scopes. createScope() works here too; Root and hydrate\n // need ssr: true, because only then do hooks look for a Root.\n const needsSsr = (what: string) => () => {\n throw new Error(`[${name}] ${what} needs ssr: true in createStore's options: only then do hooks look for a Root.`);\n };\n b.createScope = createScope;\n b.Root = needsSsr('<Root>');\n b.hydrate = needsSsr('hydrate()');\n return base as Inst & ScopeApi<S, Inst>;\n }\n if (!onServer()) {\n // In the browser the store itself carries the routed hooks and the scope API. It stays\n // the same object, so shared stores are still identical across createStore calls.\n for (const [k, v] of Object.entries(added)) b[k] = v;\n return base as Inst & ScopeApi<S, Inst>;\n }\n\n // On the server with ssr: true, the app's store must not be used: one store would serve every\n // request. Its members are handed out as traps that throw when called, so module-level code\n // like `const { actions } = store` still loads; only a real call throws.\n const trap = (path: string): unknown =>\n new Proxy(function () {}, {\n get: (_t, p) => (p === 'then' || typeof p === 'symbol' ? undefined : trap(`${path}.${String(p)}`)),\n apply: () => {\n throw new Error(\n `[${name}] Cannot call ${path}() during server rendering: on the server every request has its own store, ` +\n `and this call can't tell which one it's for. Use the request's scope instead: scope.${path}(...), ` +\n `with const scope = createScope(...).`\n );\n },\n });\n return new Proxy(base, {\n get(target, p, receiver) {\n if (typeof p === 'string') {\n if (p in added) return added[p];\n if (p in target) return trap(p);\n }\n return Reflect.get(target, p, receiver);\n },\n }) as Inst & ScopeApi<S, Inst>;\n}\n\nexport type Store<\n S extends object,\n A,\n KA = NoKeys,\n CV = NoKeys,\n E extends object = AnyEvents\n> = ReturnType<typeof build<S, A, KA, CV, E>>;\n\n/* =========================================================================\n Implementation\n ========================================================================= */\n\n/** Internal: how createScope and Root give a store its initial state */\nconst SEED = Symbol('createStore.seed');\nconst RESERVED_EXTRAS = new Set(['createScope', 'Root', 'hydrate']);\nconst warnedReserved = new Set<string>();\n\n/** Waits ms, or rejects as soon as the signal aborts */\nconst sleep = (ms: number, signal: AbortSignal) =>\n new Promise<void>((resolve, reject) => {\n if (signal.aborted) return reject(signal.reason);\n const onAbort = () => {\n clearTimeout(timer);\n reject(signal.reason);\n };\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal.addEventListener('abort', onAbort, { once: true });\n });\nconst isThenable = (v: unknown): v is PromiseLike<unknown> =>\n v != null && typeof (v as { then?: unknown }).then === 'function';\n\n/* ---------- Stable keys for query params ---------- */\n\nconst MAX_KEY_DEPTH = 100;\n// Params past these limits throw instead of costing CPU on every render and request\nconst MAX_KEY_VALUES = 10_000;\nconst MAX_KEY_CHARS = 1_000_000;\nlet keyValues = 0;\nlet keyChars = 0;\nconst UNSUPPORTED_TAGS = new Set([\n '[object WeakMap]', '[object WeakSet]', '[object WeakRef]', '[object Promise]',\n '[object Generator]', '[object AsyncGenerator]', '[object URLSearchParams]',\n]);\n\n/**\n * Turns query params into a string, so that:\n * - equal params always give the same string, whatever the property order\n * (and Map/Set insertion order), and\n * - different params never give the same string.\n * JSON.stringify can't promise the second part: it turns every Map and Set\n * into {}, NaN and Infinity into null, and throws on BigInt and cycles.\n * Values that can't be keyed reliably (functions, symbols, WeakMap, Promise...)\n * throw a clear error instead of silently sharing an entry.\n */\nfunction stableKey(value: unknown): string {\n keyValues = 0;\n keyChars = 0;\n return keyOf(value, [], 0);\n}\n// keyOf's \"too many values\" error (keyOf is a function declaration further down)\nkeyOf.tooLarge = (): never => {\n throw new Error(`Query params are too large (more than ${MAX_KEY_VALUES.toLocaleString('en')} values) to use as a cache key. Pass an id or a small filter object instead.`);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- inspects arbitrary values (Map, Date, boxed...)\nfunction keyOf(v: any, ancestors: object[], depth: number): string {\n if (++keyValues > MAX_KEY_VALUES)\n throw new Error(`Query params are too large (more than ${MAX_KEY_VALUES.toLocaleString('en')} values) to use as a cache key. Pass an id or a small filter object instead.`);\n switch (typeof v) {\n case 'string':\n if ((keyChars += v.length) > MAX_KEY_CHARS)\n throw new Error(`Query params are too large (more than ${MAX_KEY_CHARS.toLocaleString('en')} characters) to use as a cache key. Pass an id or a small filter object instead.`);\n return JSON.stringify(v);\n case 'number': return Object.is(v, -0) ? '-0' : String(v); // also \"NaN\", \"Infinity\", \"-Infinity\"\n case 'boolean': return v ? 'true' : 'false';\n case 'bigint': return `${v}n`;\n case 'undefined': return 'undefined';\n case 'symbol': throw new Error(`Query params can't contain a symbol (${String(v)}).`);\n case 'function': throw new Error(`Query params can't contain a function, so they can't be used as a cache key.`);\n }\n if (v === null) return 'null';\n if (depth >= MAX_KEY_DEPTH)\n throw new Error(`Query params are nested too deeply (more than ${MAX_KEY_DEPTH} levels) to use as a cache key.`);\n if (ancestors.includes(v)) throw new Error(`Query params contain a circular reference, so they can't be used as a cache key.`);\n\n const isArray = Array.isArray(v);\n const proto = isArray ? Array.prototype : Object.getPrototypeOf(v);\n const plain = proto === Object.prototype || proto === null;\n\n // Plain objects and arrays (nearly all params) skip the checks for special types\n let tag = '[object Object]';\n if (!isArray && !plain) {\n tag = Object.prototype.toString.call(v);\n if (UNSUPPORTED_TAGS.has(tag)) throw new Error(`A ${tag.slice(8, -1)} can't be used in query params.`);\n if (v instanceof Date) return `#Date(${v.getTime()})`; // NaN for an invalid date\n if (v instanceof RegExp) return `#RegExp(${String(v)})`;\n if (v instanceof Error) return `#Error(${JSON.stringify(v.name)},${JSON.stringify(v.message)})`;\n if (tag === '[object Number]' || tag === '[object String]' || tag === '[object Boolean]' || tag === '[object BigInt]')\n return `#Boxed(${keyOf(v.valueOf(), ancestors, depth + 1)})`;\n if (v instanceof ArrayBuffer) return `#ArrayBuffer(${Array.from(new Uint8Array(v)).join(',')})`;\n if (ArrayBuffer.isView(v))\n return `#${v.constructor?.name ?? 'View'}(${Array.from(new Uint8Array(v.buffer, v.byteOffset, v.byteLength)).join(',')})`;\n }\n\n ancestors.push(v);\n try {\n const next = depth + 1;\n if (isArray) {\n if (keyValues + v.length > MAX_KEY_VALUES) keyOf.tooLarge();\n const parts: string[] = [];\n for (let i = 0; i < v.length; i++) parts.push(keyOf(v[i], ancestors, next)); // holes count as undefined\n return `[${parts.join(',')}]`;\n }\n if (!plain) {\n if (v instanceof Map) {\n const parts = [...v].map(([k, val]) => `${keyOf(k, ancestors, next)}=>${keyOf(val, ancestors, next)}`).sort();\n return `#Map{${parts.join(',')}}`;\n }\n if (v instanceof Set) return `#Set{${[...v].map((x) => keyOf(x, ancestors, next)).sort().join(',')}}`;\n if (tag !== '[object Object]') throw new Error(`A ${tag.slice(8, -1)} can't be used in query params.`);\n }\n if (typeof v.toJSON === 'function') return `#toJSON(${keyOf(v.toJSON(), ancestors, next)})`;\n\n const keys = Object.keys(v);\n if (keyValues + keys.length > MAX_KEY_VALUES) keyOf.tooLarge(); // before sorting thousands of keys\n if (keys.length > 1) keys.sort();\n let out = '';\n for (const k of keys) {\n const item = v[k];\n if (item !== undefined) out += `${out ? ',' : ''}${JSON.stringify(k)}:${keyOf(item, ancestors, next)}`; // undefined = absent, like JSON\n }\n const prefix = plain ? '' : v.constructor?.name || '<anonymous>';\n return `${prefix}{${out}}`;\n } finally {\n ancestors.pop();\n }\n}\n\nasync function withRetry<T>(\n fn: (params: unknown, signal: AbortSignal) => Promise<T>,\n params: unknown,\n retries: number,\n signal: AbortSignal,\n retryDelay?: RetryDelay\n): Promise<T> {\n const delayOf = typeof retryDelay === 'function' ? retryDelay : defaultRetryDelay;\n for (let attempt = 0; ; attempt++) {\n try {\n const data = await fn(params, signal);\n if (signal.aborted) throw signal.reason; // a fetch that ignored the signal\n return data;\n } catch (e) {\n if (attempt >= retries || signal.aborted) throw e;\n await sleep(delayOf(attempt + 1), signal);\n }\n }\n}\n\n/**\n * What a store's declared state works out to: its keys, queries and initial values, and the\n * prototypes that hold its setters. It only depends on the object passed to createStore, so it's\n * computed once and shared by every scope (a server creates one per request).\n */\ninterface Definition {\n source: Record<string, unknown>; // what the object held when this was worked out\n keys: string[];\n values: Record<string, unknown>; // the declared initial values; never changed\n queryDefs: Record<string, QueryDef<unknown>>;\n namedDefs: Record<string, QueryConfig | AnyInfinite>;\n pagedKeys: Set<string>;\n setProto: object; // store.set.<key>: a getter per key, shared, that asks the store it's read on\n directProto: object | null; // store.<key>: the same, minus names the store itself uses (made on first use)\n apiProto: object | null; // api.<key> in actions\n}\nconst SETTER_OF = Symbol('createStore.setterOf');\nconst DEFINITION = Symbol('createStore.definition');\n/** Same keys, same values (by identity): no allocation beyond the key list */\nfunction sameEntries(a: Record<string, unknown>, b: object): boolean {\n const keys = Object.keys(b);\n if (keys.length !== Object.keys(a).length) return false;\n for (const k of keys) if (!(k in a) || !Object.is(a[k], (b as Record<string, unknown>)[k])) return false;\n return true;\n}\nconst definitions = new WeakMap<object, Definition>();\n\nfunction definitionOf(initialState: object, name: string): Definition {\n const known = definitions.get(initialState);\n if (known && sameEntries(known.source, initialState)) return known;\n for (const key of Object.keys(initialState)) {\n if (key === '$version' || key === '$queries' || key === '$ages')\n throw new Error(`[${name}] \"${key}\" can't be a state key: server-rendering snapshots use that name. Rename the key.`);\n if (key.startsWith('\\u0000')) throw new Error(`[${name}] state keys can't start with \\\\u0000 (the store uses those names internally).`);\n }\n // Objects without a prototype, so names like \"toString\" or \"constructor\" are never mistaken for keys\n const queryDefs: Record<string, QueryDef<unknown>> = Object.create(null);\n // Every query() is also a named query (one cache entry per params); paged ones only that\n const namedDefs: Record<string, QueryConfig | AnyInfinite> = Object.create(null);\n const values: Record<string, unknown> = Object.create(null);\n for (const [key, def] of Object.entries(initialState) as [string, unknown][]) {\n const kind = (def as { __kind?: unknown } | null)?.__kind;\n if (kind === 'query') {\n const q = def as QueryDef<unknown>;\n queryDefs[key] = q;\n values[key] = 'initial' in q.options ? q.options.initial : undefined; // nothing yet, like a query with params\n const o = q.options;\n namedDefs[key] = { fetch: (params: unknown, signal: AbortSignal) => q.fetch(params, signal), whenAborted: o.whenAborted, staleTime: o.staleTime, retry: o.retry, retryDelay: o.retryDelay, gcTime: o.gcTime };\n } else if (kind === 'pages') {\n const q = def as PagedQueryDef<unknown, unknown>;\n const o = q.options;\n namedDefs[key] = {\n __kind: 'infinite', firstPage: o.pages.first,\n fetch: (page: unknown, signal: AbortSignal, params: unknown) => q.fetch(page, params, signal),\n nextPage: o.pages.next as AnyInfinite['nextPage'], maxPages: o.pages.max, refresh: o.pages.refresh, whenAborted: o.whenAborted, staleTime: o.staleTime, retry: o.retry, retryDelay: o.retryDelay, gcTime: o.gcTime,\n } as unknown as AnyInfinite;\n } else {\n values[key] = def;\n }\n }\n const keys = Object.keys(values);\n const setProto = Object.create(null);\n for (const k of keys)\n Object.defineProperty(setProto, k, {\n enumerable: true,\n get(this: Record<symbol, (key: string) => unknown>) {\n return this[SETTER_OF](k);\n },\n });\n const definition: Definition = {\n source: { ...initialState } as Record<string, unknown>,\n keys, values, queryDefs, namedDefs,\n pagedKeys: new Set(Object.keys(namedDefs).filter((k) => '__kind' in namedDefs[k])),\n setProto, directProto: null, apiProto: null,\n };\n definitions.set(initialState, definition);\n return definition;\n}\n\nconst API_NAMES = { getState: 1, setState: 1, emit: 1, on: 1, fetchQuery: 1, setQueryData: 1, invalidate: 1, whenOnline: 1, batch: 1, abort: 1 };\n/** api.<key> in actions: the same shared getters, minus the api's own names (the store already warned) */\nfunction setterProtoOf(def: Definition, memberNames: object, field: 'apiProto'): object {\n const known = def[field];\n if (known) return known;\n const proto = {};\n for (const k of def.keys) {\n if (k in memberNames || k in Object.prototype) continue;\n Object.defineProperty(proto, k, {\n enumerable: true,\n get(this: Record<symbol, (key: string) => unknown>) {\n return this[SETTER_OF](k);\n },\n });\n }\n return (def[field] = proto);\n}\n\n/** store.<key>: the setter getters, without the names the store itself uses (warned about once) */\nfunction directProtoOf(def: Definition, memberNames: object, name: string): object {\n if (def.directProto) return def.directProto;\n const proto = {};\n for (const k of def.keys) {\n if (k in memberNames || k in Object.prototype || RESERVED_EXTRAS.has(k)) {\n if (!warnedReserved.has(`${name}:${k}`)) {\n warnedReserved.add(`${name}:${k}`);\n console.warn(`[${name}] \"${k}\" is also the name of a store method, so it isn't available as store.${k}. Use store.set.${k}(...) instead.`);\n }\n continue;\n }\n Object.defineProperty(proto, k, {\n enumerable: true,\n get(this: Record<symbol, (key: string) => unknown>) {\n return this[SETTER_OF](k);\n },\n });\n }\n return (def.directProto = proto);\n}\n\nfunction build<\n S extends object,\n A,\n KA,\n CV,\n E extends object = AnyEvents\n>(\n initialState: S,\n options: StoreOptions<S, A, KA, E> & {\n computed?: readonly Record<string, (get: never) => unknown>[];\n },\n sharedDefinition?: Definition // a scope passes its store's: the same definition by design\n) {\n type SV = Values<S>; // state values\n type RV = RawValues<S>; // what setters write (the raw data for a query with select)\n type V = SV & CV; // state and computed values\n type Key = keyof V & string;\n type StateKey = keyof S & string;\n const name = options.name ?? 'store';\n const isBrowser = typeof window !== 'undefined';\n\n /* ---------- Sort keys into plain, query and computed ---------- */\n\n // Worked out once per store, shared by its scopes\n const def = sharedDefinition ?? definitionOf(initialState, name);\n const queryDefs = def.queryDefs;\n const namedDefs = def.namedDefs;\n const computedDefs: Record<string, (get: never) => unknown> = Object.create(null);\n // This store's initial values: the declared ones, plus what hydrate() or createScope() fill in\n // (own properties). Inheriting means a scope doesn't copy every declared value.\n const initialValues: Record<string, unknown> = Object.create(def.values);\n const pagedKeys = def.pagedKeys;\n const isPaged = (k: string) => pagedKeys.has(k); // runs on every render: one set lookup\n // What reset() goes back to: the values declared in createStore, never changed\n const declaredValues = def.values;\n // Layers only matter for typing; at runtime dependencies are tracked per key\n for (const layer of options.computed ?? []) {\n for (const [key, read] of Object.entries(layer)) {\n if (key in initialValues || key in computedDefs)\n throw new Error(`computed \"${key}\" is defined twice (as a state key or in two layers).`);\n if (typeof read !== 'function')\n throw new Error(`computed \"${key}\" must be a function, e.g. ${key}: (get) => ...`);\n computedDefs[key] = read;\n }\n }\n const isQuery = (k: string) => typeof k === 'string' && k in queryDefs;\n const isComputed = (k: string) => typeof k === 'string' && k in computedDefs;\n // The same keys as initialValues, without walking its prototype chain (this runs on every read)\n const stateKeySet = def.values;\n const isStateKey = (k: string) => typeof k === 'string' && k in stateKeySet;\n const hasKey = (k: string) => isStateKey(k) || isComputed(k);\n // Built once: the keys never change after the store is created\n const STATE_KEYS = def.keys; // the same list for every scope (initialValues only holds overrides)\n const ALL_KEYS = [...STATE_KEYS, ...Object.keys(computedDefs)];\n const allKeys = () => ALL_KEYS;\n\n /* ---------- The state reader used by selectors and computed functions ---------- */\n\n // Names that libraries, devtools and console.log probe on objects.\n // Reading them returns undefined without a warning.\n const PROBES = new Set([\n 'then', 'toJSON', 'constructor', '$$typeof', 'valueOf', 'toString',\n 'inspect', 'nodeType', 'tagName', 'asymmetricMatch', 'prototype',\n ]);\n const warned = new Set<string>();\n const readers = new WeakSet<object>();\n const rejectReader = (value: unknown, where: string) => {\n if (typeof value === 'function' && readers.has(value as object))\n throw new Error(\n `${where} returns the state itself. Return the values you need instead, e.g. ({ todos }) => todos.`\n );\n };\n\n /**\n * Builds the value a selector or computed function receives. It is a function\n * (so get('todos') works) wrapped in a Proxy (so state.todos and\n * ({ todos }) => ... work). Every key read is passed to `track`.\n */\n function makeReader(\n read: (key: string) => unknown,\n track: (key: string) => void,\n where: string\n ): unknown {\n const get = (key: string) => {\n if (!hasKey(key))\n throw new Error(\n isPaged(key)\n ? `${where} reads \"${key}\", a paged query: pages aren't state, so read them with useGlobalState('${key}').`\n : `${where} reads \"${key}\", which is not in the store.`\n );\n track(key);\n return read(key);\n };\n const readOnly = () => {\n throw new Error(\n `State is read-only inside ${where}. Use setState() or a setter from useGlobalState() instead.`\n );\n };\n const proxy = new Proxy(get, {\n apply: (_t, _this, args) => get(args[0]),\n get: (_t, key) => {\n if (typeof key !== 'string') return undefined;\n if (hasKey(key)) {\n track(key);\n return read(key);\n }\n if (!PROBES.has(key) && !warned.has(key)) {\n warned.add(key);\n console.warn(`[${name}] ${where} reads \"${key}\", which is not in the store.`);\n }\n return undefined;\n },\n has: (_t, key) => typeof key === 'string' && hasKey(key),\n ownKeys: () => {\n // {...state} or Object.keys(state) reads (and tracks) every key\n const keys = allKeys();\n keys.forEach(track);\n return keys.slice(); // a copy: callers must not be able to change the store's list\n },\n getOwnPropertyDescriptor: (_t, key) =>\n typeof key === 'string' && hasKey(key)\n ? { enumerable: true, configurable: true, writable: false, value: get(key) }\n : undefined,\n set: readOnly,\n deleteProperty: readOnly,\n defineProperty: readOnly,\n });\n readers.add(proxy);\n return proxy;\n }\n\n /** Same top-level values? Used so `state => ({ a, b })` doesn't re-render needlessly. */\n function shallowEqual(a: unknown, b: unknown) {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || !a || !b) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) return false;\n const ra = a as Record<string, unknown>;\n const rb = b as Record<string, unknown>;\n const ka = Object.keys(ra);\n const kb = Object.keys(rb);\n return ka.length === kb.length && ka.every((k) => Object.is(ra[k], rb[k]));\n }\n\n // Holds plain and query values. Computed values live in computedCache.\n const state: Record<string, unknown> = { ...def.values };\n\n /* ---------- Subscriptions (one channel per key) ---------- */\n\n const listeners = new Map<string, Set<() => void>>();\n const subscribers = new Map<string, (cb: () => void) => () => void>();\n // While `holdNotify`, notifications wait for a microtask (writes made during a render: #1)\n let holdNotify = 0;\n const held = new Set<string>();\n const heldEvents: (() => void)[] = []; // change events for subscribe/onChange/logger, delivered after the render\n const notify = (channel: string) => {\n if (holdNotify > 0) {\n held.add(channel);\n return;\n }\n listeners.get(channel)?.forEach((cb) => cb());\n };\n const hasListeners = (channel: string) =>\n (listeners.get(channel)?.size ?? 0) > 0;\n const subscribeTo = (channel: string) => {\n if (!subscribers.has(channel)) {\n subscribers.set(channel, (cb) => {\n if (!listeners.has(channel)) listeners.set(channel, new Set());\n listeners.get(channel)!.add(cb);\n return () => {\n const set = listeners.get(channel);\n set?.delete(cb);\n if (set && set.size === 0) listeners.delete(channel);\n };\n });\n }\n return subscribers.get(channel)!;\n };\n const noSubscribe = () => () => {};\n\n /* ---------- Computed engine ---------- */\n\n interface ComputedEntry {\n value: unknown; // FAILED when it threw: `error` holds what it threw\n deps: Set<string>;\n dirty: boolean;\n error?: unknown;\n }\n const computedCache = new Map<string, ComputedEntry>();\n const computedReaders = new Map<string, { holder: { deps: Set<string> | null }; reader: unknown }>();\n const NO_VALUE = Symbol('no value');\n const FAILED = Symbol('failed');\n const THREW = Symbol('threw');\n const dependents = new Map<string, Set<string>>(); // key -> computed keys that read it\n // Keys components show, and the queries those keys read (directly or through computed values)\n const roots = new Map<string, number>(); // key -> how many components show it\n let rootQueries = new Set<string>();\n // Computed keys whose dependencies changed, handled after the current render/update\n let relinked = new Set<string>();\n let relinkScheduled = false;\n const evaluating: string[] = []; // the chain of computed keys being calculated right now\n\n /** \"a → b → c → a\", shortened in the middle for very long loops */\n const describeLoop = (chain: string[], key: string) => {\n const loop = [...chain.slice(chain.indexOf(key)), key];\n const shown = loop.length > 12 ? [...loop.slice(0, 6), '…', ...loop.slice(-3)] : loop;\n return `${shown.join(' → ')}${loop.length > 12 ? ` (${loop.length - 1} keys)` : ''}`;\n };\n\n function readKey(key: string): unknown {\n return isComputed(key) ? readComputed(key) : readState(key);\n }\n\n // query(fn, { select }): state keeps the raw data; reads see select(raw),\n // recalculated only when the raw data changes\n const selectMemo = new Map<string, { raw: unknown; out: unknown }>();\n function readState(key: string): unknown {\n const select = queryDefs[key]?.options.select;\n const raw = state[key];\n if (!select || raw === undefined) return raw; // select isn't run on \"nothing loaded yet\" \n const m = selectMemo.get(key);\n if (m && Object.is(m.raw, raw)) return m.out;\n const out = select(raw);\n selectMemo.set(key, { raw, out });\n return out;\n }\n\n function readComputed(key: string): unknown {\n const entry = computedCache.get(key);\n if (!entry || entry.dirty) return evaluate(key);\n if (entry.value === FAILED) throw entry.error; // same inputs, same error: don't run it again\n return entry.value;\n }\n\n /** Save a computed result, re-linking dependencies only if they changed. */\n function storeComputed(key: string, value: unknown, deps: Set<string>, dirty: boolean) {\n const entry = computedCache.get(key);\n const old = entry?.deps;\n let same = !!old && old.size === deps.size;\n if (same) for (const d of deps) if (!old!.has(d)) { same = false; break; }\n if (!same) {\n // Its status depends on which keys it reads; so do the statuses that include it\n if (old) onRelink(key);\n else computedStatusCache.delete(key);\n if (old)\n for (const d of old) {\n const set = dependents.get(d);\n if (!set) continue;\n set.delete(key);\n if (set.size === 0) dependents.delete(d); // don't keep empty sets around\n }\n for (const d of deps) {\n let set = dependents.get(d);\n if (!set) dependents.set(d, (set = new Set()));\n set.add(key);\n }\n }\n if (entry) {\n entry.value = value;\n entry.deps = same ? old! : deps;\n entry.dirty = dirty;\n entry.error = undefined;\n } else computedCache.set(key, { value, deps, dirty });\n }\n\n /** Drop the cached status of key and of every computed value that reads it */\n function dropStatusCaches(key: string, seen = new Set<string>()) {\n if (seen.has(key)) return;\n seen.add(key);\n computedStatusCache.delete(key);\n dependents.get(key)?.forEach((c) => dropStatusCaches(c, seen));\n }\n\n /**\n * A computed key now reads different keys (mode ? a : b). Its cached statuses\n * are dropped right away; notifying and loading newly read queries waits for a\n * microtask, because this can happen while React is rendering.\n */\n function onRelink(key: string) {\n dropStatusCaches(key);\n relinked.add(key);\n if (relinkScheduled) return;\n relinkScheduled = true;\n queueMicrotask(() => {\n relinkScheduled = false;\n const keys = relinked;\n relinked = new Set();\n keys.forEach((k) => statusChanged(k)); // re-render whoever shows these statuses\n if (roots.size) syncMountedQueries();\n });\n }\n\n function evaluate(key: string): unknown {\n if (evaluating.includes(key))\n throw new Error(\n `computed \"${evaluating[0]}\" depends on itself through a loop: ${describeLoop(evaluating, key)}. ` +\n `Break the loop so one of these keys doesn't read the next.`\n );\n evaluating.push(key);\n const deps = new Set<string>();\n // One reader per computed key, reused on every run; it records into `deps`\n let r = computedReaders.get(key);\n if (!r) {\n const holder = { deps: null as Set<string> | null };\n r = { holder, reader: makeReader(readKey, (d) => void holder.deps?.add(d), `computed \"${key}\"`) };\n computedReaders.set(key, r);\n }\n const holder = r.holder;\n const outerDeps = holder.deps;\n holder.deps = deps;\n const reader = r.reader;\n try {\n const value = computedDefs[key](reader as never);\n rejectReader(value, `computed \"${key}\"`);\n storeComputed(key, value, deps, false);\n return value;\n } catch (error) {\n // Stay linked to what it read, so a change to the inputs re-runs it;\n // until then reads rethrow the same error instead of running it again\n storeComputed(key, FAILED, deps, false);\n computedCache.get(key)!.error = error;\n throw error;\n } finally {\n holder.deps = outerDeps;\n evaluating.pop();\n }\n }\n\n // Store-wide selectors, indexed by the keys they read last time, so a change\n // wakes only the selectors that read that key (not every selector).\n const selectorIndex = new Map<string, Set<() => void>>();\n const notifyAll = (key: string) => {\n notify(key);\n const set = selectorIndex.get(key);\n if (set) [...set].forEach((cb) => cb());\n };\n function indexSelector(cb: () => void, from: string[], to: string[]) {\n for (const k of from) {\n const set = selectorIndex.get(k);\n set?.delete(cb);\n if (set && set.size === 0) selectorIndex.delete(k);\n }\n for (const k of to) {\n if (!selectorIndex.has(k)) selectorIndex.set(k, new Set());\n selectorIndex.get(k)!.add(cb);\n }\n }\n\n /**\n * A key changed. Two phases, so nobody ever sees a half-updated graph:\n * 1. mark every computed key that depends on it (directly or not) as dirty\n * 2. notify the key, then each computed key whose value actually changed\n * Computed values are recalculated lazily when read, so in phase 2 every\n * read sees fresh inputs (no \"diamond\" glitches).\n */\n function changed(...keys: string[]) {\n const stale: { key: string; prev: unknown }[] = [];\n const seen = new Set<string>();\n const visit = (k: string) => {\n for (const c of dependents.get(k) ?? []) {\n if (seen.has(c)) continue;\n seen.add(c);\n const entry = computedCache.get(c);\n if (!entry) continue;\n stale.push({ key: c, prev: entry.dirty ? NO_VALUE : entry.value });\n entry.dirty = true;\n visit(c);\n }\n };\n keys.forEach(visit);\n\n keys.forEach(notifyAll);\n for (const { key: c, prev } of stale) {\n // Nobody is listening: leave it dirty until someone reads it\n if (!hasListeners(c) && !selectorIndex.has(c)) continue;\n let next: unknown;\n try {\n next = readComputed(c);\n } catch {\n notifyAll(c); // let the component re-render and hit its error boundary\n continue;\n }\n if (prev === NO_VALUE || !Object.is(prev, next)) notifyAll(c);\n }\n }\n\n /* ---------- Persistence ---------- */\n\n const p = options.persist;\n const persistCfg: PersistOptions<S> | null = !p\n ? null\n : p === true || p === 'local'\n ? { storage: 'local' }\n : p === 'session'\n ? { storage: 'session' }\n : p;\n const persistVersion = persistCfg?.version ?? 0;\n const storage = (type: 'local' | 'session') => {\n try {\n return isBrowser\n ? type === 'session'\n ? sessionStorage\n : localStorage\n : null;\n } catch {\n return null;\n }\n };\n // The offline cache (options.offline): JSON in localStorage; failures are ignored\n const offlineMax = (typeof options.offline === 'object' && options.offline.maxSize) || 2_000_000;\n let warnedOfflineSize = false;\n const writeOffline = (suffix: string, data: unknown) => {\n try {\n const text = JSON.stringify(data);\n const ls = storage('local');\n if (text.length > offlineMax) {\n // Too big to keep: skip it, and drop the older copy so it can't come back stale\n ls?.removeItem(`${name}:${suffix}`);\n if (!warnedOfflineSize) {\n warnedOfflineSize = true;\n console.warn(`[${name}] the offline copy of server data is ${text.length.toLocaleString('en')} characters, more than offline.maxSize (${offlineMax.toLocaleString('en')}), so it isn't saved. Raise offline: { maxSize }, or keep large responses out of the store.`);\n }\n return;\n }\n ls?.setItem(`${name}:${suffix}`, text);\n } catch {}\n };\n const readOffline = <T,>(suffix: string): Record<string, T> => {\n if (!options.offline) return {};\n try {\n const saved = JSON.parse(storage('local')?.getItem(`${name}:${suffix}`) ?? '{}');\n return saved && typeof saved === 'object' ? saved : {};\n } catch {\n return {};\n }\n };\n\n // By default, persist plain keys only. Query keys reload from the server.\n const warnedInvalid = new Set<string>();\n /** options.validate on data the store didn't write itself; rejected values are left out */\n function trusted<T>(values: Record<string, T>, from: 'storage' | 'offline' | 'remote', nameOf = (k: string) => k): Record<string, T> {\n if (!options.validate) return values;\n const out: Record<string, T> = {};\n for (const [k, v] of Object.entries(values)) {\n let ok = false;\n try {\n ok = options.validate(nameOf(k), v, from) !== false;\n } catch {}\n if (ok) out[k] = v;\n else if (!warnedInvalid.has(`${from}:${nameOf(k)}`)) {\n warnedInvalid.add(`${from}:${nameOf(k)}`);\n console.warn(`[${name}] validate() rejected \"${nameOf(k)}\" from ${from === 'remote' ? 'another tab' : from === 'offline' ? 'the offline copy' : 'saved state'}: ${from === 'remote' ? 'it keeps its current value' : 'it falls back to its initial value'}.`);\n }\n }\n return out;\n }\n // keys: only these; exclude: every plain key but these; neither: every plain key (queries reload)\n const persistExclude = new Set((persistCfg?.exclude as string[] | undefined) ?? []);\n const persistedKeys = !persistCfg\n ? []\n : ((persistCfg.keys as string[] | undefined) ?? STATE_KEYS.filter((k) => !isQuery(k) && !persistExclude.has(k))).filter((k) => !isComputed(k));\n const persistedKeySet = new Set(persistedKeys);\n // The keys the app persists, also in a scope (which itself saves nothing): snapshots leave them out\n const appPersist = ((options as Record<symbol, unknown>)[APP_PERSIST] ?? p) as StoreOptions<S, A, KA, E>['persist'];\n const appPersistedKeys = new Set(\n !appPersist\n ? []\n : ((typeof appPersist === 'object' && (appPersist.keys as string[] | undefined)) ||\n STATE_KEYS.filter((k) => !isQuery(k) && !(typeof appPersist === 'object' && ((appPersist.exclude as string[] | undefined) ?? []).includes(k))))\n );\n\n if (persistCfg?.keys && persistCfg.exclude)\n throw new Error(`[${name}] persist takes keys or exclude, not both: keys lists what's saved, exclude what isn't.`);\n for (const k of [...((persistCfg?.keys as string[] | undefined) ?? []), ...((persistCfg?.exclude as string[] | undefined) ?? [])])\n if (!isStateKey(k))\n throw new Error(\n `[${name}] persist lists \"${k}\", ` +\n (isComputed(k) ? 'a computed value: those are recalculated, not saved.' : isPaged(k) ? \"a paged query: pages aren't state, so they can't be saved.\" : \"which isn't a state key.\")\n );\n const persistStorage: StorageAdapter | null = !persistCfg\n ? null\n : typeof persistCfg.storage === 'object'\n ? persistCfg.storage\n : storage(persistCfg.storage ?? 'local');\n const persistKey = `${name}:state`;\n /** Ignore failures, sync or async: storage must never break the store */\n const quietly = (fn: () => unknown) => {\n try {\n const r = fn();\n if (isThenable(r)) r.then(undefined, () => {});\n } catch {}\n };\n\n // Nothing is saved until the saved data has loaded, so an async storage\n // isn't overwritten with the initial state.\n let hydrated = !persistStorage;\n let resolveHydrated!: () => void;\n const whenHydrated = new Promise<void>((r) => (resolveHydrated = r));\n\n // Async storage (IndexedDB...) commits after setItem returns; a page that goes away first loses the\n // write. So we track writes that haven't committed, and when the page is hidden or left with one\n // pending, the same text also goes to localStorage (synchronous) as a rescue copy. The next load\n // uses whichever is newer ($saved), then removes the rescue copy.\n let storageIsAsync = false;\n let uncommitted = 0;\n let lastSavedText: string | null = null;\n const rescueKey = `${persistKey}:rescue`;\n const isSavedState = (text: string) => {\n try {\n const v = JSON.parse(text) as unknown;\n return !!v && typeof v === 'object' && 'state' in (v as object);\n } catch {\n return false;\n }\n };\n const savedAt = (text: string | null) => {\n try {\n return text ? Number((JSON.parse(text) as { $saved?: unknown }).$saved) || 0 : 0;\n } catch {\n return 0;\n }\n };\n const saveNow = () => {\n clearTimeout(saveTimer);\n saveTimer = undefined;\n if (!persistStorage || !hydrated) return;\n const data = Object.fromEntries(persistedKeys.map((k) => [k, state[k]]));\n // $saved (when it was written) only matters for async storage, to compare with a rescue copy\n const text = JSON.stringify(storageIsAsync ? { $version: persistVersion, $saved: Date.now(), state: data } : { $version: persistVersion, state: data });\n lastSavedText = text;\n quietly(() => {\n const written = persistStorage.setItem(persistKey, text);\n if (isThenable(written)) {\n storageIsAsync = true;\n uncommitted++;\n const done = () => { uncommitted--; };\n (written as Promise<unknown>).then(done, done);\n }\n return written;\n });\n };\n const writeRescue = () => {\n if (!storageIsAsync || uncommitted === 0 || !lastSavedText) return;\n const local = storage('local');\n if (!local || local === (persistStorage as unknown)) return;\n try {\n local.setItem(rescueKey, lastSavedText);\n } catch {} // full or unavailable: as before, the async write may or may not make it\n };\n // persist: { debounce }: one write after the changes stop, not one per keystroke\n const persistDebounce = (typeof options.persist === 'object' && options.persist.debounce) || 0;\n let saveTimer: ReturnType<typeof setTimeout> | undefined;\n const saveState = () => {\n if (!persistStorage || !hydrated) return;\n if (!persistDebounce) return saveNow();\n clearTimeout(saveTimer);\n saveTimer = setTimeout(saveNow, persistDebounce);\n };\n // A pending save is written when the page is hidden or closed, so nothing typed is lost; with async\n // storage, a write that hasn't committed yet is also kept as a rescue copy (see writeRescue)\n const flushSave = () => {\n if (saveTimer !== undefined) saveNow();\n writeRescue();\n };\n const flushWhenHidden = () => { if (document.visibilityState === 'hidden') flushSave(); };\n if (isBrowser && persistStorage && typeof window.addEventListener === 'function') {\n window.addEventListener('pagehide', flushSave);\n document.addEventListener('visibilitychange', flushWhenHidden);\n }\n\n /** Saved text → values to use, migrated to the current version. null = nothing usable. */\n let rewrite = false; // migrated or dropped: save the current shape right away\n function readSaved(raw: string | null): Record<string, unknown> | null {\n if (raw == null) return null;\n let saved: unknown;\n try {\n saved = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!saved || typeof saved !== 'object') return null;\n const obj = saved as Record<string, unknown>;\n const legacy = !('$version' in obj); // saved before versioning: the state itself\n const from = legacy ? 0 : (obj.$version as number);\n let values: unknown = legacy ? obj : obj.state;\n if (from !== persistVersion) {\n rewrite = true;\n if (!persistCfg!.migrate) {\n console.warn(`[${name}] dropped saved state from version ${from}: no persist.migrate for version ${persistVersion}.`);\n return null;\n }\n try {\n values = persistCfg!.migrate(values, from);\n } catch (error) {\n console.error(`[${name}] persist.migrate threw; starting from the initial state:`, error);\n return null;\n }\n }\n return values && typeof values === 'object' ? (values as Record<string, unknown>) : null;\n }\n const pick = (values: Record<string, unknown> | null) => {\n const out: Record<string, unknown> = {};\n if (values) for (const k of persistedKeys) if (k in values) out[k] = values[k];\n return out;\n };\n const finishHydration = () => {\n hydrated = true;\n if (rewrite) saveState();\n resolveHydrated();\n };\n\n if (!persistStorage) resolveHydrated();\n else {\n let raw: string | null | Promise<string | null> = null;\n try {\n raw = persistStorage.getItem(persistKey);\n } catch {}\n if (isThenable(raw)) {\n // Async storage: load after startup, then show the saved values\n storageIsAsync = true;\n (raw as Promise<string | null>).then(\n (stored) => {\n // A rescue copy from a page that went away mid-write: used when it's newer than what committed\n let text = stored;\n const local = storage('local');\n let rescued: string | null = null;\n try {\n rescued = local && local !== (persistStorage as unknown) ? local.getItem(rescueKey) : null;\n if (rescued != null) local!.removeItem(rescueKey);\n } catch {}\n // Used only when it's real saved state and strictly newer; garbage or a tie keeps what's stored\n if (rescued != null && isSavedState(rescued) && savedAt(rescued) > savedAt(stored)) text = rescued;\n const values = trusted(pick(readSaved(text)), 'storage');\n hydrated = true; // so applying them also saves the current version\n if (!destroyed) apply(values, 'storage', 'loaded from storage', false);\n if (!destroyed && text === rescued && rescued != null) saveNow(); // the rescued copy goes back into the storage\n finishHydration();\n },\n (error) => {\n console.error(`[${name}] couldn't load persisted state:`, error);\n finishHydration();\n }\n );\n } else {\n // Sync storage (localStorage...): load before anything renders\n Object.assign(state, trusted(pick(readSaved(raw as string | null)), 'storage'));\n // Nothing reads these this early today; clear them so loaded values can never be shadowed\n computedCache.clear();\n selectMemo.clear();\n finishHydration();\n }\n }\n\n /* ---------- Cross-tab sync ---------- */\n\n const channel =\n options.syncTabs && isBrowser && 'BroadcastChannel' in window\n ? new BroadcastChannel(`createStore:${name}`)\n : null;\n // syncTabs: { keys } or { exclude }: which keys other tabs get (e.g. never an access token)\n const syncCfg = typeof options.syncTabs === 'object' ? options.syncTabs : null;\n if (syncCfg?.keys && syncCfg.exclude)\n throw new Error(`[${name}] syncTabs takes keys or exclude, not both: keys lists what's sent, exclude what isn't.`);\n for (const k of [...(syncCfg?.keys ?? []), ...(syncCfg?.exclude ?? [])])\n if (!(k in initialValues)) throw new Error(`[${name}] syncTabs lists \"${String(k)}\", which isn't a state key.`);\n const syncKeys = syncCfg?.keys ? new Set<string>(syncCfg.keys) : null;\n const syncExclude = new Set<string>(syncCfg?.exclude ?? []);\n const syncable = (k: string) => (syncKeys ? syncKeys.has(k) : !syncExclude.has(k));\n\n // Logical clock, so tabs that write at the same moment agree on a winner:\n // every change gets [counter, tabId]; a tab only accepts newer stamps.\n type Stamp = [number, string];\n const tabId = Math.random().toString(36).slice(2) + Date.now().toString(36);\n let clock = 0;\n const stamps = new Map<string, Stamp>();\n const isNewer = (a: Stamp, b?: Stamp) =>\n !b || a[0] > b[0] || (a[0] === b[0] && a[1] > b[1]);\n\n /* ---------- DevTools ---------- */\n\n // The parts of the Redux DevTools extension this store uses\n interface DevtoolsConnection {\n init(state: unknown): void;\n send(action: unknown, state: unknown): void;\n subscribe(listener: (msg: unknown) => void): unknown;\n unsubscribe?(): void;\n }\n const ext =\n options.devtools &&\n isBrowser &&\n (window as unknown as { __REDUX_DEVTOOLS_EXTENSION__?: { connect(o: { name: string }): DevtoolsConnection } })\n .__REDUX_DEVTOOLS_EXTENSION__;\n let destroyed = false; // set by destroy(); declared early because devtools code checks it\n let devtools: DevtoolsConnection | null = null;\n try {\n devtools = ext ? ext.connect({ name }) : null;\n } catch (error) {\n console.error(`[${name}] couldn't connect to Redux DevTools:`, error);\n }\n let warnedDevtools = false;\n /** Send to the extension without ever letting it break the store */\n const sendDevtools = (action: unknown, st: unknown) => {\n if (!devtools || destroyed) return;\n try {\n devtools.send(action, st);\n } catch (error) {\n if (!warnedDevtools) {\n warnedDevtools = true;\n console.error(`[${name}] Redux DevTools send failed:`, error);\n }\n }\n };\n\n /* ---------- Observability ---------- */\n\n const changeListeners = new Set<(e: ChangeEvent) => void>();\n\n /* ---------- History (undo / redo / time travel) ---------- */\n\n const h = options.history;\n const historyLimit = !h ? 0 : h === true ? 100 : h.limit ?? 100;\n // null = track every state key (the old behavior)\n const historyKeys: Set<string> | null =\n h && h !== true && h.keys ? new Set(h.keys as string[]) : null;\n if (historyKeys)\n for (const k of historyKeys) {\n if (isComputed(k))\n throw new Error(\n `history.keys has \"${k}\", which is computed. Track the state keys it reads; it follows them on undo.`\n );\n if (!isStateKey(k)) throw new Error(`history.keys has \"${k}\", which is not in the store.`);\n }\n const tracksHistory = (k: string) => !historyKeys || historyKeys.has(k);\n // Each step stores only the keys it changed: { key: [before, after] }.\n // So undo never touches data that loaded from the server in between.\n interface Step {\n changes: Record<string, [unknown, unknown]>;\n seq: number;\n }\n let past: Step[] = [];\n let future: Step[] = [];\n let stepSeq = 0;\n // batch(): changes made inside are collected here and saved as one undo step\n let batchDepth = 0;\n let batchChanges: Record<string, [unknown, unknown]> | null = null;\n let warnedAsyncBatch = false;\n // Promises the store itself returns (setters with a server call); returning one from batch() is fine\n const ownPromises = new WeakSet<object>();\n const hasOwn = (o: object, k: string) => Object.prototype.hasOwnProperty.call(o, k);\n\n /** After a failed save, drop the steps for that key made since the save started. */\n function trimHistory(key: string, fromSeq: number) {\n if (!historyLimit || !tracksHistory(key)) return;\n let trimmed = false;\n const strip = (list: Step[]) =>\n list.flatMap((st) => {\n if (st.seq < fromSeq || !hasOwn(st.changes, key)) return [st];\n trimmed = true;\n const rest = { ...st.changes };\n delete rest[key];\n return Object.keys(rest).length ? [{ ...st, changes: rest }] : [];\n });\n past = strip(past);\n future = strip(future);\n if (trimmed) updateHistoryInfo();\n }\n let historyInfo = { canUndo: false, canRedo: false, position: 0, length: 1 };\n const updateHistoryInfo = () => {\n historyInfo = {\n canUndo: past.length > 0,\n canRedo: future.length > 0,\n position: past.length,\n length: past.length + 1 + future.length,\n };\n notify(HISTORY_CHANNEL);\n };\n\n /** Save everything collected by the outermost batch() as one undo step. */\n function flushBatch() {\n const changes = batchChanges;\n batchChanges = null;\n if (!changes) return;\n // A key that ended where it started (a → b → a) is not a change\n for (const k of Object.keys(changes))\n if (Object.is(changes[k][0], changes[k][1])) delete changes[k];\n if (Object.keys(changes).length === 0) return;\n past = [...past, { changes, seq: stepSeq++ } as Step].slice(-historyLimit);\n future = [];\n updateHistoryInfo();\n }\n\n /**\n * Run several updates as one undo step:\n * store.batch(() => { setState('cart', []); setState('step', 'success'); });\n * Updates still apply and notify immediately; only history is grouped.\n * Batches can nest; the outermost one creates the step. If fn throws, the\n * changes it already made stay and are saved as one step (undo reverts them).\n */\n function batch<T>(fn: () => T): T {\n if (typeof fn !== 'function') throw new Error(`[${name}] batch() takes a function that makes the changes: store.batch(() => { store.setState('a', 1); store.setState('b', 2); }).`);\n batchDepth++;\n if (batchDepth === 1 && historyLimit) batchChanges = Object.create(null);\n let result: T;\n try {\n result = fn();\n } finally {\n if (--batchDepth === 0) {\n flushBatch();\n if (saveAfterBatch) {\n saveAfterBatch = false;\n saveState();\n }\n if (saveInlineAfterBatch) {\n saveInlineAfterBatch = false;\n saveInline();\n }\n }\n }\n // Async work (an async function, a returned fetch...) runs after the batch has\n // ended, so updates made there aren't grouped. The store's own save promises are fine.\n if (!warnedAsyncBatch && isThenable(result) && !ownPromises.has(result as object)) {\n warnedAsyncBatch = true;\n console.warn(\n `[${name}] batch() returned a promise. Only the updates made before it returned are grouped; ` +\n `group updates made later (after an await) in their own batch().`\n );\n }\n return result;\n }\n\n /* ---------- Inline query bookkeeping ---------- */\n\n interface Meta {\n loaded: boolean;\n updatedAt: number;\n aborted?: boolean; // the last load was cancelled\n inflight?: Promise<unknown>;\n mounted: number; // components currently showing this key\n version: number; // bumped on every non-server change, to spot stale responses\n needsRefetch: boolean; // a response was discarded; reload when saves settle\n }\n const metas = new Map<string, Meta>();\n const inlineAborts = new Map<string, AbortController>(); // inline query key -> its request\n const meta = (k: string): Meta => {\n if (!metas.has(k))\n metas.set(k, { loaded: false, updatedAt: 0, mounted: 0, version: 0, needsRefetch: false });\n return metas.get(k)!;\n };\n\n const saveInline = () => {\n if (!options.offline) return;\n const data = Object.fromEntries(\n Object.keys(queryDefs)\n .filter((k) => meta(k).loaded)\n .map((k) => [k, { data: state[k], updatedAt: meta(k).updatedAt }])\n );\n writeOffline('inline', data);\n };\n for (const [k, e] of Object.entries(trusted(readOffline<{ data: unknown; updatedAt: number } | null>('inline'), 'offline'))) {\n if (!isQuery(k) || !e || typeof e !== 'object' || !('data' in e)) continue; // malformed saved data: skip it\n state[k] = e.data;\n Object.assign(meta(k), { loaded: true, updatedAt: e.updatedAt });\n selectMemo.delete(k);\n }\n\n /* ---------- The one place every change goes through ---------- */\n\n /** Run a user callback without letting it break the store. */\n const safely = (fn: () => void, what: string) => {\n try {\n fn();\n } catch (error) {\n console.error(`[${name}] ${what} threw an error:`, error);\n }\n };\n\n let warnedSync = false;\n const broadcast = (message: unknown) => {\n if (!channel) return;\n try {\n channel.postMessage(message);\n } catch (error) {\n // e.g. a function or class instance in state can't be sent to other tabs\n if (!warnedSync) {\n warnedSync = true;\n console.warn(`[${name}] couldn't sync a change to other tabs:`, error);\n }\n }\n };\n\n // Listeners may update state, which notifies listeners again. A real cascade\n // is short; this many nested updates means a listener is feeding itself.\n const MAX_NESTING = 100;\n let applyDepth = 0;\n\n let warnedDestroyed = false;\n const afterDestroy = (what: string) => {\n if (!warnedDestroyed) {\n warnedDestroyed = true;\n console.warn(`[${name}] ${what} after destroy(): ignored. A destroyed store doesn't change, load or notify any more.`);\n }\n };\n function apply(\n values: Record<string, unknown>,\n source: ChangeEvent['source'],\n label: string,\n recordHistory = true\n ) {\n if (destroyed) return afterDestroy(label.startsWith('set ') ? `setState(\"${label.slice(4)}\")` : label);\n if (applyDepth >= MAX_NESTING)\n throw new Error(\n `[${name}] update loop: ${MAX_NESTING} updates happened inside each other (last: ${label}). ` +\n `A subscribe/onChange listener is probably updating a key it also reacts to.`\n );\n applyDepth++;\n try {\n applyNow(values, source, label, recordHistory);\n } finally {\n applyDepth--;\n }\n }\n\n function applyNow(\n values: Record<string, unknown>,\n source: ChangeEvent['source'],\n label: string,\n recordHistory: boolean\n ) {\n const keys = Object.keys(values).filter(\n (k) => isStateKey(k) && !Object.is(state[k], values[k])\n );\n if (keys.length === 0) return;\n // Update in place: copying the whole state object on every change would make\n // each update slower the more keys the store has. Only changed keys are touched.\n const prev: Record<string, unknown> = {};\n for (const k of keys) {\n prev[k] = state[k];\n state[k] = values[k];\n }\n\n if (source === 'local' && recordHistory) recordStep(keys, prev);\n settlePendingWork(keys, source);\n persistChanges(keys);\n if (source !== 'remote' && source !== 'storage' && source !== 'hydrate') broadcastChanges(keys);\n if (source !== 'devtools') sendDevtools({ type: label }, state);\n changed(...keys); // computed values, then subscribers\n emitChangeEvents(keys, prev, source, label);\n }\n\n /** Undo history: one step, or part of the current batch() */\n function recordStep(keys: string[], prev: Record<string, unknown>) {\n if (!historyLimit) return;\n const tracked = keys.filter(tracksHistory);\n // A change to untracked keys only (modalOpen, searchText...) adds no step\n // and leaves the redo stack alone.\n if (!tracked.length) return;\n if (batchChanges) {\n // Inside batch(): keep each key's first \"before\" and latest \"after\"\n for (const k of tracked) {\n if (hasOwn(batchChanges, k)) batchChanges[k][1] = state[k];\n else batchChanges[k] = [prev[k], state[k]];\n }\n return;\n }\n const changes = Object.fromEntries(tracked.map((k) => [k, [prev[k], state[k]]]));\n past = [...past, { changes, seq: stepSeq++ } as Step].slice(-historyLimit);\n future = [];\n updateHistoryInfo();\n }\n\n /** Optimistic edits and in-flight responses that this change makes obsolete */\n function settlePendingWork(keys: string[], source: ChangeEvent['source']) {\n for (const k of keys) {\n // Changes from history, other tabs or devtools replace any pending\n // optimistic edits: there's nothing sensible to roll back to any more.\n if (source !== 'local' && source !== 'server') journals.delete(k);\n // Any non-server change makes in-flight responses for this key stale\n if (source !== 'server' && isQuery(k)) meta(k).version++;\n }\n }\n\n /** Persisted state and the offline query cache: once per batch(), not once per change in it */\n let saveAfterBatch = false;\n let saveInlineAfterBatch = false;\n function persistChanges(keys: string[]) {\n const saved = keys.some((k) => persistedKeySet.has(k)); // other keys don't touch saved state, or the debounce\n const inline = keys.some(isQuery);\n if (batchDepth > 0) {\n saveAfterBatch ||= saved;\n saveInlineAfterBatch ||= inline;\n return;\n }\n if (saved) saveState();\n if (inline) saveInline();\n }\n\n /** Other tabs (syncTabs): changes in the same tick go out as one message */\n const pendingSync = new Set<string>();\n let syncQueued = false;\n function broadcastChanges(keys: string[]) {\n if (!channel) return;\n for (const k of keys) if (syncable(k)) pendingSync.add(k);\n if (pendingSync.size && !syncQueued) {\n syncQueued = true;\n queueMicrotask(flushBroadcast);\n }\n }\n function flushBroadcast() {\n syncQueued = false;\n if (!channel || !pendingSync.size) return;\n // Stamped when sent: nothing from another tab can arrive in between (messages are macrotasks)\n const stamp: Stamp = [++clock, tabId];\n const keys = [...pendingSync];\n pendingSync.clear();\n keys.forEach((k) => stamps.set(k, stamp));\n broadcast({ type: 'state', stamp, values: Object.fromEntries(keys.map((k) => [k, state[k]])) });\n }\n\n /** onChange, subscribe() listeners and the logger */\n function emitChangeEvents(\n keys: string[],\n prev: Record<string, unknown>,\n source: ChangeEvent['source'],\n label: string\n ) {\n for (const key of keys) {\n const event: ChangeEvent = {\n key,\n prev: prev[key],\n next: state[key],\n source,\n time: Date.now(),\n };\n const deliver = () => {\n if (options.onChange) safely(() => options.onChange!(event), 'onChange');\n [...changeListeners].forEach((l) => safely(() => l(event), 'subscribe listener'));\n if (options.logger) console.log(`[${name}] ${label}`, event.prev, '→', event.next);\n };\n // While a render writes server data (heldNotify), listeners hear it right after the render,\n // with the same event: one of them updating React state mustn't happen during that render\n if (holdNotify > 0) heldEvents.push(deliver);\n else deliver();\n }\n }\n\n /* ---------- Reading and writing ---------- */\n\n function getState(): V;\n function getState<K extends Key>(key: K): V[K];\n function getState(key?: string): unknown {\n if (key !== undefined) return readKey(key);\n const derived = Object.keys(computedDefs).map((k) => [k, readComputed(k)]);\n const selected = Object.keys(queryDefs).map((k) => [k, readState(k)]);\n return { ...state, ...Object.fromEntries(selected), ...Object.fromEntries(derived) };\n }\n\n let selecting = 0; // > 0 while a selector function is running\n\n // Internal: the typed public versions are setStateWithServer and the setters\n function setState(key: string, value: unknown): void {\n if (evaluating.length)\n throw new Error(\n `setState(\"${key}\") was called while computed \"${evaluating[evaluating.length - 1]}\" was calculating. ` +\n `A computed function must only calculate a value; update state in an event handler or action instead.`\n );\n if (selecting > 0)\n throw new Error(\n `setState(\"${key}\") was called inside a selector. Selectors must only read state; ` +\n `update it in an event handler, effect or action instead.`\n );\n if (isComputed(key))\n throw new Error(\n `\"${key}\" is computed and read-only. Change the state keys it reads instead.`\n );\n if (!isStateKey(key))\n throw new Error(`\"${key}\" is not in the store.`);\n // A setter called while an updater runs (setCount(c => { setCount(...); return c + 1 })) waits for\n // that updater's result to be written, then runs: like React, no update is lost\n if (inUpdater > 0) {\n afterUpdater.push(() => setState(key, value));\n return;\n }\n let next: unknown;\n if (typeof value === 'function') {\n inUpdater++;\n try {\n next = (value as (prev: unknown) => unknown)(state[key]);\n } catch (error) {\n afterUpdater.length = 0; // updates made inside a failed update fail with it\n throw error;\n } finally {\n inUpdater--;\n }\n if (next && typeof (next as { then?: unknown }).then === 'function') warnOnce(`promise:${key}`,\n `[${name}] the updater for \"${key}\" returned a promise, so the promise itself was stored. Updaters must be synchronous: await first, then set the value.`);\n } else {\n next = value;\n if (next && typeof next === 'object' && 'nativeEvent' in next && typeof (next as { preventDefault?: unknown }).preventDefault === 'function')\n warnOnce(`event:${key}`, `[${name}] setState(\"${key}\") got a browser event as its value, probably from onClick={setter}. Use onClick={() => setter(...)} instead.`);\n }\n journal(key, value);\n apply({ [key]: next }, 'local', `set ${key}`);\n if (inUpdater === 0 && afterUpdater.length) for (const run of afterUpdater.splice(0)) run();\n }\n let inUpdater = 0;\n const afterUpdater: (() => void)[] = [];\n const warnedSetter = new Set<string>();\n const warnOnce = (id: string, message: string) => {\n if (warnedSetter.has(id)) return;\n warnedSetter.add(id);\n console.warn(message);\n };\n\n /* ---------- Optimistic updates ---------- */\n\n // While a save is pending on a key, every write to that key is recorded.\n // If the save fails, its write is removed and the others are replayed on\n // top of the value from before, so overlapping saves and local edits all\n // end up correct no matter which order they finish in.\n interface JournalEntry {\n op: number; // 0 for a plain local write\n change: unknown; // the value or updater that was passed in\n pending: boolean;\n }\n const journals = new Map<string, { base: unknown; entries: JournalEntry[] }>();\n let currentOp = 0;\n let opCounter = 0;\n const hasPending = (k: string) =>\n journals.get(k)?.entries.some((e) => e.pending) ?? false;\n\n const SUPERSEDED = Symbol('superseded');\n\n function journal(key: string, change: unknown) {\n let j = journals.get(key);\n if (!j && !currentOp) return;\n if (j && !currentOp && typeof change !== 'function') {\n // A plain local value replaces everything before it, so earlier records\n // are no longer needed to rebuild the value. Keep only the pending saves\n // (to know when they settle), without their changes.\n j.base = change;\n j.entries = j.entries.filter((e) => e.pending).map((e) => ({ ...e, change: SUPERSEDED }));\n if (j.entries.length === 0) journals.delete(key);\n return;\n }\n if (!j) {\n j = { base: state[key], entries: [] };\n journals.set(key, j);\n }\n j.entries.push({ op: currentOp, change, pending: currentOp !== 0 });\n }\n\n /**\n * The setter behind useGlobalState. With a serverCall it updates instantly,\n * runs the call, and rolls back if the call fails.\n */\n function update(\n key: string,\n value: unknown,\n serverCall?: () => Promise<unknown> | unknown\n ): Promise<void> {\n if (!serverCall) {\n setState(key, value);\n const done = Promise.resolve();\n ownPromises.add(done);\n return done;\n }\n\n const op = ++opCounter;\n const startSeq = stepSeq;\n const outer = currentOp;\n currentOp = op;\n try {\n setState(key, value); // an updater that throws stops here\n } finally {\n currentOp = outer;\n }\n const touched = [...journals]\n .filter(([, j]) => j.entries.some((e) => e.op === op))\n .map(([k]) => k);\n\n const settle = (ok: boolean, error?: unknown) => {\n const reload: string[] = [];\n for (const k of touched) {\n const j = journals.get(k);\n if (j) {\n if (ok) {\n j.entries.forEach((e) => { if (e.op === op) e.pending = false; });\n } else {\n j.entries = j.entries.filter((e) => e.op !== op);\n let next = j.base;\n for (const e of j.entries) {\n if (e.change === SUPERSEDED) continue;\n try {\n next = typeof e.change === 'function' ? (e.change as (prev: unknown) => unknown)(next) : e.change;\n } catch {}\n }\n apply({ [k]: next }, 'local', `rollback ${key}`, false);\n }\n if (!j.entries.some((e) => e.pending)) journals.delete(k);\n } else if (!ok && isQuery(k)) {\n // The record was dropped because another tab or undo changed this key\n // meanwhile, so the failed change may be baked into what we have now.\n // The server knows the truth: reload (and the result syncs to other tabs).\n meta(k).needsRefetch = true;\n }\n if (!ok) trimHistory(k, startSeq);\n\n if (isQuery(k)) {\n const m = meta(k);\n m.version++; // responses that started before this save are out of date\n if (!ok) setStatus(k, { error });\n if (ok && queryDefs[k].options.refetchAfterMutation) m.needsRefetch = true;\n if (m.needsRefetch && !hasPending(k)) {\n m.needsRefetch = false;\n reload.push(k);\n }\n }\n }\n return Promise.all(reload.map((k) => loadKey(k, true).catch(() => {})));\n };\n\n const promise = Promise.resolve()\n .then(serverCall)\n .then(\n async (result) => {\n await settle(true);\n return result as void; // what the save returned (a refund amount, the saved record...)\n },\n (error) => {\n // The page is going away (reload, navigation) and the browser cancelled the request: it may\n // well have reached the server, so keep the change rather than roll it back (and save that)\n if (!leavingPage) settle(false, error);\n throw error;\n }\n );\n promise.catch(() => {}); // avoid \"unhandled rejection\" when not awaited\n ownPromises.add(promise);\n return promise;\n }\n\n /* ---------- Loading and error status ---------- */\n // How a query the server didn't load looked there: loading\n const SERVER_LOADING: Status = Object.freeze({\n state: 'loading', loading: true, fetching: false, error: null, blocked: false, blockedBy: null, rootError: null,\n refetch: () => Promise.resolve(),\n });\n\n const hydratedKeys = new Set<string>();\n const PLAIN_STATUS: Status = Object.freeze({\n state: 'ready',\n loading: false,\n fetching: false,\n error: null,\n blocked: false,\n blockedBy: null,\n rootError: null,\n refetch: () => Promise.resolve(),\n });\n // Whose status an object is, and whether that query has data: what waitFor needs to know\n const statusInfo = new WeakMap<Status, { key: string; hasData: () => boolean }>();\n const owned = <T extends Status>(status: T, key: string, hasData: () => boolean): T => {\n statusInfo.set(status, { key, hasData });\n return status;\n };\n const statuses = new Map<string, Status>();\n const computedStatusCache = new Map<string, Status>();\n // Internal channels start with \\u0000, which no state key can (see above): a key named\n // \"status:todos\" or \"__history\" can't collide with them\n const statusChannel = (k: string) => `\\u0000status:${k}`;\n\n const baseStatus = (key: string): Status =>\n owned({\n state: meta(key).loaded ? 'ready' : 'loading',\n loading: !meta(key).loaded,\n fetching: false,\n error: null,\n blocked: false,\n blockedBy: null,\n rootError: null,\n refetch: () => loadKey(key, true).then(() => {}, () => {}),\n }, key, () => meta(key).loaded);\n\n function setStatus(key: string, patch: Partial<Status>) {\n const next = { ...(statuses.get(key) ?? baseStatus(key)), ...patch };\n next.state = stateOf(next.loading, next.error, meta(key).loaded, false);\n const asked = abortedState(key, !!meta(key).aborted, next.loading || next.fetching, meta(key).loaded, false);\n if (asked === 'loading') {\n next.state = 'loading';\n next.loading = true;\n } else if (asked === 'idle') (next as { state: string }).state = 'idle';\n statuses.set(key, owned(next, key, () => meta(key).loaded));\n statusChanged(key);\n }\n /** The one place the precedence is decided: waiting, then loading, then error without data, then ready */\n /** A first load that was cancelled (nothing loaded, nothing running): what the query asked to report */\n function abortedState(q: string, aborted: boolean, loading: boolean, hasData: boolean, waiting: boolean): WhenAborted | null {\n if (!aborted || loading || hasData || waiting) return null;\n return (namedDefs[q] as { whenAborted?: WhenAborted } | undefined)?.whenAborted ?? null;\n }\n function stateOf(loading: boolean, error: unknown, hasData: boolean, waiting: boolean): StatusState {\n if (waiting) return 'waiting';\n if (loading) return 'loading';\n if (error != null && !hasData) return 'error';\n return 'ready';\n }\n\n function statusChanged(key: string, seen = new Set<string>()) {\n if (seen.has(key)) return; // a computed loop can make the dependency map circular\n seen.add(key);\n notify(statusChannel(key));\n dependents.get(key)?.forEach((c) => {\n computedStatusCache.delete(c);\n statusChanged(c, seen);\n });\n }\n\n function getStatus(key: string): Status {\n if (isQuery(key)) {\n if (!statuses.has(key)) statuses.set(key, baseStatus(key));\n return statuses.get(key)!;\n }\n if (isComputed(key)) {\n const cached = computedStatusCache.get(key);\n if (cached) return cached;\n readComputed(key);\n const parts = [...computedCache.get(key)!.deps].map(getStatus);\n const combined: Status = owned({\n state: parts.some((s) => s.state === 'loading') ? 'loading' : parts.some((s) => s.state === 'error') ? 'error' : 'ready',\n loading: parts.some((s) => s.loading),\n fetching: parts.some((s) => s.fetching),\n error: parts.find((s) => s.error)?.error ?? null,\n blocked: false,\n blockedBy: null,\n rootError: null,\n refetch: () => Promise.all(parts.map((s) => s.refetch())).then(() => {}),\n }, key, () => !parts.some((s) => s.loading));\n computedStatusCache.set(key, combined);\n return combined;\n }\n return PLAIN_STATUS;\n }\n\n /* ---------- Inline queries: query(fn) ---------- */\n\n function loadKey(key: string, force = false): Promise<unknown> {\n if (destroyed) return Promise.reject(new Error(`[${name}] \"${key}\" can't load after destroy().`));\n const def = queryDefs[key];\n const m = meta(key);\n const fresh =\n m.loaded && Date.now() - m.updatedAt < (def.options.staleTime ?? 30_000);\n if (fresh && !force) return Promise.resolve(state[key]);\n if (m.inflight) return m.inflight; // ten components, one request\n if (isBrowser && !navigator.onLine && m.loaded)\n return Promise.resolve(state[key]);\n\n m.aborted = false; // a new load: whatever was cancelled before is running again\n setStatus(key, { fetching: true, loading: !m.loaded });\n const startVersion = m.version;\n const controller = new AbortController();\n inlineAborts.set(key, controller);\n const request: Promise<unknown> = withRetry(\n (_params, signal) => def.fetch(undefined, signal),\n undefined,\n def.options.retry ?? 2,\n controller.signal,\n def.options.retryDelay\n ).then(\n (data) => {\n if (m.inflight === request) m.inflight = undefined;\n // The key changed locally while this request was out, or a save is\n // still pending: this response may be out of date, so don't show it.\n if (m.version !== startVersion || hasPending(key)) {\n m.updatedAt = 0;\n if (hasPending(key)) {\n m.needsRefetch = true; // reload once the saves settle\n setStatus(key, { fetching: false });\n return state[key];\n }\n return loadKey(key, true);\n }\n m.loaded = true;\n m.updatedAt = Date.now();\n m.needsRefetch = false;\n apply({ [key]: data }, 'server', `loaded ${key}`);\n setStatus(key, { loading: false, fetching: false, error: null });\n return data;\n },\n (error) => {\n if (m.inflight === request) m.inflight = undefined;\n // Aborted is a cancel, not a failure: no error status\n if (controller.signal.aborted) {\n // After reset() the controller is gone: leave the fresh status alone\n if (inlineAborts.get(key) === controller) {\n m.aborted = true;\n setStatus(key, { loading: false, fetching: false });\n }\n } else setStatus(key, { loading: false, fetching: false, error });\n throw error;\n }\n ).finally(() => {\n if (inlineAborts.get(key) === controller) inlineAborts.delete(key);\n });\n m.inflight = request;\n return request;\n }\n\n /** All query keys a key depends on, following computed keys. */\n function queryKeysOf(\n key: string,\n seen = new Set<string>(),\n out = new Set<string>()\n ): Set<string> {\n if (seen.has(key)) return out;\n seen.add(key);\n if (isQuery(key)) out.add(key);\n else if (isComputed(key)) {\n try {\n readComputed(key);\n } catch {\n // A failing computed still records what it read, so keep going\n }\n computedCache.get(key)?.deps.forEach((d) => queryKeysOf(d, seen, out));\n }\n return out;\n }\n\n /* ---------- Time travel ---------- */\n\n function goTo(position: number) {\n if (batchDepth > 0)\n throw new Error(`[${name}] undo, redo and goTo can't run inside batch(). Call them after it.`);\n if (\n !Number.isInteger(position) ||\n position < 0 ||\n position > past.length + future.length ||\n position === past.length\n )\n return;\n // Collect every key the jump touches, then apply them in one go\n const values: Record<string, unknown> = {};\n while (past.length > position) {\n const st = past.pop()!;\n future.unshift(st);\n for (const [k, [before]] of Object.entries(st.changes)) values[k] = before;\n }\n while (past.length < position) {\n const st = future.shift()!;\n past.push(st);\n for (const [k, [, after]] of Object.entries(st.changes)) values[k] = after;\n }\n apply(values, 'history', `history ${position}`);\n updateHistoryInfo();\n }\n const undo = () => goTo(past.length - 1);\n const redo = () => goTo(past.length + 1);\n\n /* ---------- Event bus ---------- */\n\n const handlers = new Map<string, Set<(payload: unknown) => void>>();\n function on(event: string, handler: (payload: unknown) => void) {\n if (!handlers.has(event)) handlers.set(event, new Set());\n handlers.get(event)!.add(handler);\n let held: typeof handler | undefined = handler; // released after unsubscribing\n return () => {\n if (!held) return;\n const set = handlers.get(event);\n set?.delete(held);\n if (set && set.size === 0) handlers.delete(event);\n held = undefined;\n };\n }\n let emitDepth = 0;\n function emit(event: string, payload?: unknown, shouldBroadcast = false) {\n if (emitDepth >= MAX_NESTING)\n throw new Error(\n `[${name}] event loop: \"${event}\" was emitted ${MAX_NESTING} times inside its own handlers.`\n );\n emitDepth++;\n try {\n emitNow(event, payload, shouldBroadcast);\n } finally {\n emitDepth--;\n }\n }\n function emitNow(event: string, payload: unknown, shouldBroadcast: boolean) {\n if (destroyed) return afterDestroy(`emit(\"${event}\")`);\n if (options.logger) console.log(`[${name}] event ${event}`, payload);\n sendDevtools({ type: `event ${event}`, payload }, state);\n if (shouldBroadcast) {\n flushBroadcast(); // the state this event is about reaches other tabs first\n broadcast({ type: 'event', event, payload });\n }\n [...(handlers.get(event) ?? [])].forEach((fn) =>\n safely(() => fn(payload), `handler for \"${event}\"`)\n );\n }\n\n /** Public, typed versions: names and payloads come from the `events` option. */\n let warnedNoChannel = false;\n function publicEmit<K extends keyof E & string>(event: K, ...args: EmitArgs<E, K>): void {\n const shouldBroadcast = args[1]?.broadcast === true;\n if (shouldBroadcast && !channel && isBrowser && !warnedNoChannel) {\n warnedNoChannel = true;\n console.warn(\n `[${name}] emit(\"${event}\", ..., { broadcast: true }) only reaches this tab: ` +\n `turn on syncTabs (and use a browser with BroadcastChannel) to reach other tabs.`\n );\n }\n emit(event, args[0], shouldBroadcast);\n }\n function publicOn<K extends keyof E & string>(\n event: K,\n handler: (payload: E[K]) => void\n ): () => void {\n return on(event, handler as (payload: unknown) => void);\n }\n\n if (channel) {\n channel.onmessage = ({ data }) => {\n // Any script on this origin can post to the channel: ignore anything that isn't a well-formed message\n if (!data || typeof data !== 'object') return;\n if (data.type === 'state') {\n const stamp = data.stamp as Stamp;\n if (!Array.isArray(stamp) || stamp.length !== 2 || !Number.isSafeInteger(stamp[0]) || stamp[0] < 0 || typeof stamp[1] !== 'string') return;\n if (!data.values || typeof data.values !== 'object' || Array.isArray(data.values)) return;\n clock = Math.max(clock, stamp[0]);\n // Keep only keys where this change is newer than what we already have\n const fresh: Record<string, unknown> = {};\n for (const [k, v] of Object.entries<unknown>(data.values)) {\n if (!isStateKey(k) || !syncable(k) || !isNewer(stamp, stamps.get(k))) continue; // excluded keys are ignored, also when sent\n stamps.set(k, stamp);\n fresh[k] = v;\n }\n apply(trusted(fresh, 'remote'), 'remote', 'from other tab');\n }\n if (data.type === 'event' && typeof data.event === 'string') emit(data.event, data.payload); // local only: never re-broadcast\n };\n }\n let unsubscribeDevtools: (() => void) | undefined;\n if (devtools) {\n try {\n devtools.init(state);\n } catch (error) {\n console.error(`[${name}] Redux DevTools init failed:`, error);\n }\n const onDevtoolsMessage = (raw: unknown) => {\n if (destroyed) return;\n const msg = raw as { type?: unknown; payload?: { type?: unknown }; state?: unknown } | null;\n const t = msg?.payload?.type;\n if (msg?.type !== 'DISPATCH' || (t !== 'JUMP_TO_STATE' && t !== 'JUMP_TO_ACTION')) return;\n try {\n const next: unknown = typeof msg.state === 'string' ? JSON.parse(msg.state) : msg.state;\n if (next && typeof next === 'object') apply(next as Record<string, unknown>, 'devtools', 'time travel');\n } catch (error) {\n console.error(`[${name}] ignored a malformed Redux DevTools message:`, error);\n }\n };\n try {\n const off = devtools.subscribe(onDevtoolsMessage);\n // Newer extensions return an unsubscribe function; older ones have unsubscribe()\n unsubscribeDevtools = typeof off === 'function' ? (off as () => void) : () => devtools?.unsubscribe?.();\n } catch (error) {\n console.error(`[${name}] couldn't subscribe to Redux DevTools:`, error);\n }\n }\n\n /* ---------- Named queries: useQuery(name, params) ---------- */\n\n interface Entry {\n data?: unknown;\n error?: unknown;\n status: 'idle' | 'loading' | 'success' | 'error';\n isFetching: boolean;\n updatedAt: number;\n fetchingNext?: boolean; // infinite queries: loading the next page\n aborted?: boolean; // the last request was cancelled (matters while status is 'idle': nothing loaded)\n }\n const EMPTY: Entry = { status: 'idle', isFetching: false, updatedAt: 0 };\n // What an enabled query with no entry yet shows: it's about to load\n const PENDING: Entry = { status: 'loading', isFetching: false, updatedAt: 0 };\n const cache = new Map<string, Entry>();\n const hydratedEntries = new Map<string, Entry>(); // query entries restored by hydrate()\n const inflight = new Map<string, Promise<unknown>>();\n const namedAborts = new Map<string, AbortController>(); // cache key -> its request\n const versions = new Map<string, number>(); // cache key -> bumped by invalidate()\n const onScreen = new Map<\n string,\n { name: string; params: unknown; count: number }\n >();\n // The name is encoded so it can never contain \":\", which keeps keys unambiguous\n // even for names like \"todo:detail\" (key = query:<name>[:<params>]).\n const queryPrefix = (q: string) => `query:${encodeURIComponent(q)}`;\n const cacheKey = (q: string, params?: unknown) =>\n params === undefined ? queryPrefix(q) : `${queryPrefix(q)}:${stableKey(params)}`;\n /** Does cache key k belong to query q (any params)? */\n const belongsTo = (k: string, q: string) => k === queryPrefix(q) || k.startsWith(`${queryPrefix(q)}:`);\n const queryNameOf = (k: string) => {\n const raw = k.slice('query:'.length).split(':')[0];\n try { return decodeURIComponent(raw); } catch { return raw; }\n };\n\n const saveCache = () => {\n if (!options.offline) return;\n const data = Object.fromEntries(\n [...cache].filter(([, e]) => e.status === 'success')\n );\n writeOffline('queries', data);\n };\n for (const [k, e] of Object.entries(trusted(readOffline<Entry>('queries'), 'offline', (key) => queryNameOf(key))))\n if (k.startsWith('query:') && e && typeof e === 'object' && e.data !== undefined) // malformed saved data: skip it\n cache.set(k, { data: e.data, status: 'success', isFetching: false, updatedAt: typeof e.updatedAt === 'number' ? e.updatedAt : 0 });\n // Entries nobody shows are evicted after gcTime, so viewing thousands of\n // different ids over a long session doesn't grow memory forever.\n const gcTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const gcTimeOf = (k: string) => {\n const q = queryNameOf(k);\n return namedDefs[q]?.gcTime ?? 5 * 60_000;\n };\n function scheduleGc(k: string) {\n clearTimeout(gcTimers.get(k));\n gcTimers.delete(k);\n if (!isBrowser) return; // on the server a store lives as long as its request: no timers to hold it\n if (onScreen.get(k)?.count) return;\n const ms = gcTimeOf(k);\n if (!Number.isFinite(ms)) return;\n gcTimers.set(k, setTimeout(() => {\n gcTimers.delete(k);\n if (onScreen.get(k)?.count || inflight.has(k)) return;\n releaseEntry(k);\n saveCache();\n }, ms));\n }\n\n /** Runs fn with notifications held, and sends them in a microtask (after the current render) */\n function holdingNotify(fn: () => void) {\n holdNotify++;\n try {\n fn();\n } finally {\n holdNotify--;\n }\n if (holdNotify === 0 && (held.size || heldEvents.length))\n queueMicrotask(() => {\n const channels = [...held];\n held.clear();\n channels.forEach((ch) => listeners.get(ch)?.forEach((cb) => cb()));\n heldEvents.splice(0).forEach((deliver) => deliver()); // hooks first, then listeners, as without holding\n });\n }\n\n /** Everything kept for one cache entry, released together (the entry, its setter, its select memo...) */\n function releaseEntry(k: string) {\n cache.delete(k);\n versions.delete(k);\n onScreen.delete(k);\n entrySetters.delete(k);\n entrySelect.delete(k);\n hydratedEntries.delete(k);\n const ch = entryChannel(k);\n subscribers.delete(ch);\n if (!listeners.get(ch)?.size) listeners.delete(ch);\n }\n\n const setEntry = (k: string, patch: Partial<Entry>) => {\n cache.set(k, { ...(cache.get(k) ?? EMPTY), ...patch });\n notify(entryChannel(k));\n saveCache();\n if (!onScreen.get(k)?.count) scheduleGc(k);\n };\n // Entries restored from offline storage are evicted too, unless shown again\n [...cache.keys()].forEach(scheduleGc);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- see StoreApi.fetchQuery\n function fetchQuery(q: string, params?: unknown, force = false): Promise<any> {\n if (destroyed) return Promise.reject(new Error(`[${name}] fetchQuery(\"${q}\") after destroy(): a destroyed store doesn't load anything.`));\n // Without params: the query's own state key (its selected value)\n if (isQuery(q) && params === undefined) return loadKey(q, force).then(() => readKey(q));\n const config = namedDefs[q];\n if (!config)\n return Promise.reject(new Error(`Query \"${q}\" is not in the store.`));\n if ('__kind' in config) return fetchInfinite(q, config, params, 'first', force);\n let k: string;\n try {\n k = cacheKey(q, params);\n } catch (error) {\n return Promise.reject(error); // params that can't be keyed\n }\n const entry = cache.get(k) ?? EMPTY;\n const fresh =\n entry.status === 'success' &&\n Date.now() - entry.updatedAt < (config.staleTime ?? 30_000);\n if (fresh && !force) return Promise.resolve(entry.data);\n if (inflight.has(k)) return inflight.get(k)!;\n if (isBrowser && !navigator.onLine && entry.data !== undefined)\n return Promise.resolve(entry.data);\n\n setEntry(k, {\n isFetching: true,\n status: entry.data === undefined ? 'loading' : entry.status,\n });\n return runEntry(\n k,\n (signal) => config.fetch(params, signal),\n config,\n (data) => data,\n () => fetchQuery(q, params, true)\n );\n }\n\n /**\n * Runs one request for a cache entry (named and infinite queries): retries,\n * abort, and the entry's status. `toData` turns the response into what's stored.\n */\n function runEntry(\n k: string,\n load: (signal: AbortSignal) => Promise<unknown>,\n opts: { retry?: number; retryDelay?: RetryDelay },\n toData: (response: unknown) => unknown,\n restart: () => Promise<unknown>\n ): Promise<unknown> {\n const version = versions.get(k) ?? 0;\n const controller = new AbortController();\n namedAborts.set(k, controller);\n const promise: Promise<unknown> = withRetry(\n (_params, signal) => load(signal),\n undefined,\n opts.retry ?? 2,\n controller.signal,\n opts.retryDelay\n )\n .then(\n (response) => {\n if ((versions.get(k) ?? 0) !== version) {\n // invalidate() ran while this was loading: load again instead of storing it\n if (inflight.get(k) === promise) inflight.delete(k);\n return restart();\n }\n const data = toData(response);\n setEntry(k, {\n data,\n error: undefined,\n status: 'success',\n isFetching: false,\n fetchingNext: false,\n updatedAt: Date.now(),\n });\n return data;\n },\n (error) => {\n const idle = { isFetching: false, fetchingNext: false };\n if (!controller.signal.aborted) setEntry(k, { ...idle, error, status: 'error' });\n // Aborted is a cancel, not a failure: keep any data, no error status.\n // After reset() the controller is gone: leave the fresh cache alone.\n else if (namedAborts.get(k) === controller)\n setEntry(k, { ...idle, status: cache.get(k)?.data === undefined ? 'idle' : 'success', aborted: true });\n throw error;\n }\n )\n .finally(() => {\n if (inflight.get(k) === promise) inflight.delete(k);\n if (namedAborts.get(k) === controller) namedAborts.delete(k);\n });\n inflight.set(k, promise);\n return promise;\n }\n\n /* ---------- Infinite queries ---------- */\n\n interface InfiniteData {\n pages: unknown[];\n pageParams: unknown[];\n next: unknown; // undefined or null = no more pages\n }\n\n /**\n * 'first': load the first page (once; `force` refreshes it). 'next': add the next page.\n * A list that's on screen is never refreshed by focus or coming back online, so nobody's scroll\n * jumps. It refreshes when it's shown again after staleTime (a page reopened, a reload), and on\n * refetch()/invalidate(): starting over (pages.refresh 'first') or refetching every loaded page\n * ('loaded').\n */\n function fetchInfinite(\n q: string,\n def: AnyInfinite,\n params: unknown,\n mode: 'first' | 'next',\n force = false\n ): Promise<unknown> {\n if (destroyed) return Promise.reject(new Error(`[${name}] \"${q}\" can't load after destroy().`));\n let k: string;\n try {\n k = cacheKey(q, params);\n } catch (error) {\n return Promise.reject(error);\n }\n const entry = cache.get(k) ?? EMPTY;\n const data = entry.data as InfiniteData | undefined;\n const running = inflight.get(k);\n if (running && !force) return running;\n if (!data) mode = 'first';\n // Fresh, or already on screen elsewhere (no reshuffling under someone scrolling): keep the pages.\n // Stale and shown by nobody else (a page opened again, or restored after a reload): start over.\n const staleTime = (def as { staleTime?: number }).staleTime ?? 30_000;\n const stale = Date.now() - entry.updatedAt > staleTime;\n // (\"Shown again\" means a mount or a reload: a focus/online refresh never starts an on-screen list over.)\n const shownAgain = stale && inFocusRefresh === 0 && (onScreen.get(k)?.count ?? 0) <= 1;\n if (mode === 'first' && data && entry.status === 'success' && !force && !shownAgain)\n return Promise.resolve(data);\n if (mode === 'next' && data!.next == null) return Promise.resolve(data); // no more pages\n\n namedAborts.get(k)?.abort(); // a forced refetch replaces a running request\n const page = mode === 'first' ? def.firstPage : data!.next;\n setEntry(k, {\n isFetching: true,\n fetchingNext: mode === 'next',\n status: data ? entry.status : 'loading',\n });\n // refresh: 'loaded': the same number of pages, fetched in order (each from the fresh previous page's\n // next, so cursors stay right), kept off-screen until all have arrived, then swapped in at once\n const refreshCount = mode === 'first' && data && def.refresh === 'loaded' ? data.pages.length : 1;\n if (refreshCount > 1)\n return runEntry(k, async (signal) => {\n const pages: unknown[] = [];\n const pageParams: unknown[] = [];\n // From the oldest page kept: the first page, or with `max` the start of the kept window\n let p: unknown = data!.pageParams.length ? data!.pageParams[0] : def.firstPage;\n let next: unknown = undefined;\n for (let i = 0; i < refreshCount; i++) {\n const response = await def.fetch(p as never, signal, params as never);\n pages.push(response);\n pageParams.push(p);\n next = def.nextPage(response as never, pages as never[], p as never);\n if (next == null) break; // the list got shorter: stop where it ends now\n p = next;\n }\n return { [ALL_PAGES]: true, pages, pageParams, next };\n }, def, (all) => {\n const { pages, pageParams, next } = all as InfiniteData;\n return { pages, pageParams, next } satisfies InfiniteData;\n }, () => fetchInfinite(q, def, params, 'first', true));\n return runEntry(k, (signal) => def.fetch(page as never, signal, params as never), def, (response) => {\n const base = mode === 'next' && data ? data : { pages: [], pageParams: [] };\n let pages = [...base.pages, response];\n let pageParams = [...base.pageParams, page];\n if (def.maxPages && pages.length > def.maxPages) {\n pages = pages.slice(-def.maxPages);\n pageParams = pageParams.slice(-def.maxPages);\n }\n const next = def.nextPage(response as never, pages as never[], page as never);\n return { pages, pageParams, next } satisfies InfiniteData;\n }, () => fetchInfinite(q, def, params, 'first', true));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- see StoreApi.setQueryData\n function setQueryData(q: string, updater: any, params?: unknown) {\n if (isQuery(q) && params === undefined) {\n setState(q, updater); // the query's own state key\n return;\n }\n const k = cacheKey(q, params);\n const prev = cache.get(k)?.data;\n setEntry(k, {\n data: typeof updater === 'function' ? updater(prev) : updater,\n status: 'success',\n });\n }\n\n /** Cancel a query's in-flight requests (every params of a named query). */\n function abort(q: string) {\n if (isQuery(q)) inlineAborts.get(q)?.abort(); // without params, and below every params\n for (const [k, c] of [...namedAborts])\n if (belongsTo(k, q)) c.abort();\n }\n\n async function invalidate(q: string) {\n if (isQuery(q)) {\n // Inline query: reload now if on screen, otherwise on next read\n const m = meta(q);\n m.updatedAt = 0;\n m.version++; // a response already on its way may predate the change: it reloads instead\n if (m.mounted > 0) await loadKey(q, true).catch(() => {});\n }\n // ...and every params of it\n const jobs: Promise<unknown>[] = [];\n for (const [k, entry] of cache) {\n if (!belongsTo(k, q)) continue;\n cache.set(k, { ...entry, updatedAt: 0 });\n versions.set(k, (versions.get(k) ?? 0) + 1); // in-flight responses are now out of date\n const visible = onScreen.get(k);\n if (visible?.count)\n jobs.push(fetchQuery(visible.name, visible.params, true).catch(() => {}));\n }\n // The offline copy learns it's stale too, or a reload would restore it as fresh\n saveCache();\n if (isQuery(q)) saveInline();\n await Promise.all(jobs);\n }\n\n /* ---------- Offline queue and refresh on focus ---------- */\n\n const queue: (() => void)[] = [];\n /**\n * Runs the task now, or once the connection is back. It may run much later,\n * so read the latest state inside it:\n * whenOnline(() => api.save(store.getState('todos'))) // sends what's current then\n * not a value captured earlier:\n * whenOnline(() => api.save(todos)) // may send stale data\n */\n function whenOnline(task: () => Promise<unknown> | unknown) {\n if (destroyed) return Promise.reject(new Error(`[${name}] whenOnline() after destroy().`));\n if (!isBrowser || navigator.onLine) return Promise.resolve().then(task);\n const waiting = new Promise((resolve, reject) =>\n queue.push(() => Promise.resolve().then(task).then(resolve, reject))\n );\n updateWindowListeners();\n return waiting;\n }\n\n // Focus and coming back online refresh what's on screen. A paged list on screen keeps its pages\n // (inFocusRefresh): starting it over would drop everything below page 1 under someone's scroll.\n let inFocusRefresh = 0;\n const refreshVisible = () => {\n for (const q of Object.keys(queryDefs))\n if (meta(q).mounted > 0) loadKey(q).catch(() => {});\n inFocusRefresh++;\n try {\n for (const { name: q, params, count } of onScreen.values())\n if (count) fetchQuery(q, params).catch(() => {});\n } finally {\n inFocusRefresh--;\n }\n };\n const onOnline = () => {\n queue.splice(0).forEach((task) => task());\n refreshVisible();\n updateWindowListeners();\n };\n // Listening to window keeps the store alive, so only listen while something\n // needs it: a query on screen, or tasks waiting for the connection.\n let listening = false;\n function updateWindowListeners() {\n if (!isBrowser) return;\n const needed =\n !destroyed &&\n (queue.length > 0 ||\n Object.keys(queryDefs).some((q) => meta(q).mounted > 0) ||\n [...onScreen.values()].some((v) => v.count > 0));\n if (needed === listening) return;\n listening = needed;\n const method = needed ? 'addEventListener' : 'removeEventListener';\n window[method]('focus', refreshVisible);\n window[method]('online', onOnline);\n }\n\n const abortAll = () => {\n inlineAborts.forEach((c) => c.abort());\n namedAborts.forEach((c) => c.abort());\n };\n\n /** Stop syncing tabs and listening to the window. Useful in tests and hot reloading. */\n function destroy() {\n flushSave();\n flushBroadcast();\n if (isBrowser && persistStorage && typeof window.removeEventListener === 'function') {\n window.removeEventListener('pagehide', flushSave);\n document.removeEventListener('visibilitychange', flushWhenHidden);\n }\n destroyed = true;\n // Without this the extension keeps calling back into a store nobody uses,\n // which also keeps the whole store alive.\n try {\n unsubscribeDevtools?.();\n } catch {}\n unsubscribeDevtools = undefined;\n channel?.close();\n updateWindowListeners();\n gcTimers.forEach((t) => clearTimeout(t));\n gcTimers.clear();\n abortAll();\n queue.length = 0; // saves waiting for the connection won't run on a destroyed store\n entrySetters.clear();\n entrySelect.clear();\n if (options.shared) {\n const slot = Symbol.for(`createStore:${name}`);\n const g = globalThis as unknown as Record<symbol, unknown>;\n if (g[slot] === store) delete g[slot];\n }\n }\n\n /**\n * Back to a fresh store, e.g. `afterEach(() => store.reset())`: initial state,\n * no history, empty query cache, in-flight requests aborted. Subscribers and\n * event handlers stay, so mounted components keep working.\n */\n function reset() {\n abortAll();\n inlineAborts.clear();\n namedAborts.clear();\n inflight.clear();\n gcTimers.forEach((t) => clearTimeout(t));\n gcTimers.clear();\n const cachedKeys = [...cache.keys()];\n cachedKeys.forEach(releaseEntry);\n cache.clear();\n saveCache();\n cachedKeys.forEach((k) => notify(entryChannel(k))); // components show the empty entry\n for (const m of metas.values())\n Object.assign(m, { loaded: false, updatedAt: 0, inflight: undefined, needsRefetch: false, version: m.version + 1 });\n statuses.clear();\n computedStatusCache.clear();\n journals.clear();\n versions.clear();\n for (const k of Object.keys(initialValues)) delete initialValues[k]; // drop overrides: back to the declared values\n apply({ ...declaredValues }, 'local', 'reset', false);\n saveInline();\n Object.keys(queryDefs).forEach((k) => statusChanged(k));\n past = [];\n future = [];\n updateHistoryInfo();\n }\n\n /* ---------- Actions ---------- */\n\n // The api actions get: these members, plus every key's setter and key actions (api.cart.add),\n // from a prototype shared by the store's scopes\n const apiMembers: StoreApi<SV, E, RV> = {\n getState: (key) => readKey(key) as SV[typeof key],\n setState: (key, value, serverCall) => update(key, value, serverCall) as Promise<never>,\n emit: publicEmit,\n on: publicOn,\n fetchQuery,\n setQueryData,\n invalidate,\n whenOnline,\n batch,\n abort,\n };\n const api = Object.assign(Object.create(setterProtoOf(def, API_NAMES, 'apiProto')), apiMembers) as StoreApi<SV, E, RV>;\n Object.defineProperty(api, SETTER_OF, { value: (k: string) => setterFor(k) });\n if (options.actions != null && typeof options.actions !== 'function')\n throw new Error(`[${name}] actions must be a function that receives the store's api and returns your actions: createStore(state, { actions: (api) => ({ add(x) { api.setState('items', (i) => [...i, x]); } }) }).`);\n const actions = (options.actions?.(api as StoreApi<SV, E, RV> & ApiSetters<S, KA>) ?? {}) as A;\n\n /* ---------- Per-key actions: setTodos.add(...) ---------- */\n\n const keyActionDefs = (options.keyActions ?? {}) as Record<string, Record<string, KeyAction<unknown>>>;\n const ssrCfg = options.ssr;\n const snapshotVersion = (ssrCfg && typeof ssrCfg === 'object' && ssrCfg.version) || 0;\n if (ssrCfg && typeof ssrCfg === 'object') {\n if ('serialize' in ssrCfg) throw new Error(`[${name}] ssr.serialize is now ssr.keys (or ssr.exclude, for everything but some keys).`);\n if (ssrCfg.keys && ssrCfg.exclude) throw new Error(`[${name}] ssr takes keys or exclude, not both: keys lists what's sent, exclude what isn't.`);\n for (const k of [...(ssrCfg.keys ?? []), ...(ssrCfg.exclude ?? [])])\n if (!isStateKey(k as string) && !(k in namedDefs))\n throw new Error(`[${name}] ssr lists \"${String(k)}\", which isn't a state key or query${isComputed(k as string) ? ' (computed values are recalculated, not sent)' : ''}.`);\n }\n\n for (const [key, defs] of Object.entries(keyActionDefs)) {\n if (!isStateKey(key))\n throw new Error(\n `keyActions has \"${key}\", which is not a plain or query key in the store.`\n );\n for (const [action, def] of Object.entries(defs ?? {}))\n if (typeof def !== 'function' && typeof def?.run !== 'function')\n throw new Error(`keyActions.${key}.${action} must be a function or { run, save }.`);\n }\n\n function bindAction(key: string, action: string, def: KeyAction<unknown>) {\n const run = typeof def === 'function' ? def : def.run;\n const save = typeof def === 'function' ? undefined : def.save;\n return (...args: unknown[]): Promise<void> => {\n const reducer = (current: unknown) => run(current, ...args);\n if (!save) return update(key, reducer);\n\n // Reads the value when the save runs, so a queued offline save sends the latest one.\n // The raw stored value, like run gets: not the select()-ed view of a query key.\n const send = () => save(state[key]);\n const promise = update(key, reducer, options.offline ? () => whenOnline(send) : send);\n if (options.onSaveStart) safely(() => options.onSaveStart!(key, action), 'onSaveStart');\n promise.then(\n () => {\n if (options.onSaveSuccess) safely(() => options.onSaveSuccess!(key, action), 'onSaveSuccess');\n },\n (error) => {\n if (options.onSaveError) safely(() => options.onSaveError!(key, action, error), 'onSaveError');\n }\n );\n return promise;\n };\n }\n\n // Stable setter per key, so it's safe in dependency arrays\n const setters = new Map<string, SetValue<unknown>>();\n function setterFor(key: string) {\n if (isComputed(key)) return undefined;\n if (!setters.has(key)) {\n const setter: SetValue<unknown> = (value, serverCall) => update(key, value, serverCall) as Promise<never>;\n const defs = hasOwn(keyActionDefs, key) ? keyActionDefs[key] : {};\n // defineProperty, because names like \"name\" or \"length\" are read-only on functions\n for (const [action, def] of Object.entries(defs ?? {}))\n Object.defineProperty(setter, action, { value: bindAction(key, action, def), enumerable: true });\n setters.set(key, setter);\n }\n return setters.get(key);\n }\n\n // Each setter (with its key actions) is made the first time it's used: a store with a thousand\n // keys, or a server creating a scope per request, doesn't build a thousand functions up front.\n // One shared getter: it reads its key from a per-key descriptor, so no closure per key either.\n // store.set: the definition's shared getters, asking this store for its setters (made on first use)\n const set = Object.create(def.setProto) as SettersOf<S, KA>;\n Object.defineProperty(set, SETTER_OF, { value: setterFor });\n\n /* ---------- React hooks ---------- */\n\n // Values React's server snapshot reads. On the server: the store as it is now, so\n // per-request data set before rendering (setState) is in the HTML. In the browser,\n // while hydrating: the initial values (ignoring saved state), which is what the\n // server rendered when the store was created the same way, so hydration matches.\n const readServer = (key: string): unknown => (isBrowser ? readInitial(key) : readKey(key));\n\n // Initial values for hydration (ignores saved state)\n const serverCache = new Map<string, unknown>();\n function readInitial(key: string): unknown {\n if (serverCache.has(key)) return serverCache.get(key);\n const value = isComputed(key)\n ? computedDefs[key](makeReader(readInitial, () => {}, `computed \"${key}\"`) as never)\n : queryDefs[key]?.options.select && initialValues[key] !== undefined\n ? queryDefs[key].options.select!(initialValues[key])\n : initialValues[key];\n serverCache.set(key, value);\n return value;\n }\n\n /**\n * The queries the shown keys read, directly or through computed values, are\n * \"on screen\". Recomputed when components mount/unmount and whenever a\n * computed value starts reading different keys, so a newly read query loads.\n */\n function syncMountedQueries() {\n const next = new Set<string>();\n for (const k of roots.keys()) queryKeysOf(k, new Set(), next);\n for (const q of rootQueries) if (!next.has(q)) meta(q).mounted--;\n for (const q of next)\n if (!rootQueries.has(q)) {\n meta(q).mounted++;\n loadKey(q).catch(() => {});\n }\n rootQueries = next;\n updateWindowListeners();\n }\n\n /**\n * Initial state from createScope() or <Root>: replaces initial values (so hydration\n * renders them, as the server did) and current values. Query keys given here count\n * as loaded, so they don't refetch until stale. Computed keys are skipped.\n */\n function seed(values: Record<string, unknown>) {\n for (const k of Object.keys(values)) hydratedKeys.add(k); // what the server sent (hydration renders these)\n const fresh: Record<string, unknown> = {};\n const queries = values.$queries;\n const ageOf = (age: unknown) => (typeof age === 'number' && age > 0 ? age : 0);\n if (queries && typeof queries === 'object')\n for (const [k, item] of Object.entries(queries as Record<string, { data?: unknown; age?: unknown } | null>)) {\n if (!k.startsWith('query:') || !item || typeof item !== 'object' || !('data' in item)) continue;\n const entry: Entry = { data: item.data, status: 'success', isFetching: false, updatedAt: Date.now() - ageOf(item.age) };\n cache.set(k, entry);\n hydratedEntries.set(k, entry); // what the server rendered: the browser's server snapshot\n notify(entryChannel(k));\n }\n for (const [k, v] of Object.entries(values)) {\n if (k === '$queries' || k === '$ages' || k === '$version' || isComputed(k)) continue;\n if (!isStateKey(k)) throw new Error(`[${name}] initialState has \"${k}\", which is not in the store.`);\n initialValues[k] = v;\n fresh[k] = v;\n }\n serverCache.clear();\n apply(fresh, 'hydrate', 'initial state', false);\n const ages = (values.$ages && typeof values.$ages === 'object' ? values.$ages : {}) as Record<string, unknown>;\n for (const k of Object.keys(fresh))\n if (isQuery(k)) {\n Object.assign(meta(k), { loaded: true, updatedAt: Date.now() - ageOf(ages[k]) });\n setStatus(k, { loading: false, fetching: false, error: null });\n }\n }\n\n /** Marks the keys a component shows as on screen while mounted, and loads their queries if needed. */\n function useLoadQueries(id: string) {\n useEffect(() => showKeys(id), [id]);\n }\n\n /** Marks keys as shown (on screen) and loads their queries; returns the cleanup */\n function showKeys(id: string): (() => void) | undefined {\n {\n if (!id) return; // plain keys: nothing to load\n const keys = id.split('\\u0000');\n keys.forEach((k) => roots.set(k, (roots.get(k) ?? 0) + 1));\n syncMountedQueries();\n // A mounting component also refreshes stale data it shows (no-op when fresh)\n const queries = new Set<string>();\n keys.forEach((k) => queryKeysOf(k, new Set(), queries));\n queries.forEach((q) => loadKey(q).catch(() => {}));\n return () => {\n keys.forEach((k) => {\n const n = (roots.get(k) ?? 1) - 1;\n if (n > 0) roots.set(k, n);\n else roots.delete(k);\n });\n syncMountedQueries();\n };\n }\n }\n\n // Functions a component needs for one key, created once per key instead of\n // on every render (this matters with hundreds of components re-rendering).\n interface KeyHooks {\n getValue: () => unknown;\n getServerValue: () => unknown;\n getStatus: () => Status;\n statusSubscribe: (cb: () => void) => () => void;\n statusCanChange: boolean;\n cell: () => Cell; // the key's value and status, the same object while neither changes\n serverCell: () => Cell;\n idleCell: () => Cell; // the same, for { enabled: false }\n serverIdleCell: () => Cell;\n }\n interface Cell {\n v: unknown;\n s: Status;\n }\n const keyHooks = new Map<string, KeyHooks>();\n // What one useGlobalState(key) call remembers between renders (kept in a single ref)\n interface KeyHookState {\n key: string | null;\n setter: SetValue<unknown> | undefined;\n arr: unknown[] | null; // the last array returned\n statusUsed: boolean; // the component read the status: status changes re-render it\n renderStatus?: Status; // the status read with the value this render\n memo: { input: unknown; output: unknown; selector: unknown } | null;\n h: KeyHooks | null;\n sub: (cb: () => void) => () => void;\n subSelect: (cb: () => void) => () => void;\n enabled: boolean;\n }\n\n // The array useGlobalState(key) returns: [value, setter, status]. Reading index 2\n // marks the status as used (so status changes re-render that component) and returns\n // the live status. The getter lives once on this class's prototype: defining it on\n // every returned array put V8 arrays in slow dictionary mode (~20% of render time\n // with 1000 components re-rendering).\n const STATUS_OF = Symbol('status');\n class KeyTuple extends Array<unknown> {\n [STATUS_OF]!: KeyHookState;\n }\n Object.defineProperty(KeyTuple.prototype, 2, {\n enumerable: true,\n configurable: true,\n get(this: KeyTuple) {\n const s = this[STATUS_OF];\n s.statusUsed = true;\n return s.renderStatus ?? (s.enabled ? s.h!.getStatus() : s.h!.idleCell().s);\n },\n });\n function hooksFor(key: string): KeyHooks {\n let h = keyHooks.get(key);\n if (!h) {\n const canChange = isQuery(key) || isComputed(key);\n let last: Cell | null = null;\n let lastServer: Cell | null = null;\n const cellOf = (prev: Cell | null, v: unknown): Cell => {\n const s = canChange ? getStatus(key) : PLAIN_STATUS;\n return prev && Object.is(prev.v, v) && prev.s === s ? prev : { v, s };\n };\n // During hydration the browser must render what the server did: a query the server didn't\n // load was loading there, even if the offline copy has restored it here already (#10)\n const serverCellOf = (prev: Cell | null, v: unknown): Cell => {\n const s = isBrowser && isQuery(key) && !hydratedKeys.has(key) ? SERVER_LOADING : canChange ? getStatus(key) : PLAIN_STATUS;\n return prev && Object.is(prev.v, v) && prev.s === s ? prev : { v, s };\n };\n // { enabled: false }: a query that hasn't loaded is waiting, not loading\n let lastIdle: Cell | null = null;\n let lastServerIdle: Cell | null = null;\n const idleOf = (prev: Cell | null, v: unknown): Cell => {\n const s = isQuery(key) && !meta(key).loaded ? PLAIN_STATUS : canChange ? getStatus(key) : PLAIN_STATUS;\n return prev && Object.is(prev.v, v) && prev.s === s ? prev : { v, s };\n };\n h = {\n getValue: () => readKey(key),\n getServerValue: () => readServer(key),\n getStatus: () => getStatus(key),\n statusSubscribe: canChange ? subscribeTo(statusChannel(key)) : noSubscribe,\n statusCanChange: canChange,\n cell: () => (last = cellOf(last, readKey(key))),\n serverCell: () => (lastServer = serverCellOf(lastServer, readServer(key))),\n idleCell: () => (lastIdle = idleOf(lastIdle, readKey(key))),\n serverIdleCell: () => (lastServerIdle = idleOf(lastServerIdle, readServer(key))),\n };\n keyHooks.set(key, h);\n }\n return h;\n }\n\n /* useGlobalState('todos') and useGlobalState('todos', selector) */\n function useKeyState(key: string, selector?: (value: never) => unknown, enabled = true): unknown {\n if (!hasKey(key))\n throw new Error(\n `\"${key}\" is not in the store. Add it to the object you pass to createStore().`\n );\n // Everything this hook remembers lives in one ref. This hook runs in every component that\n // reads state, on every render, and React does bookkeeping per hook: one ref instead of\n // three refs and a callback cut the hooks per component from 7 to 4.\n const ref = useRef<EntryHookState | KeyHookState | null>(null);\n // The ref is shared with the other paths of useGlobalState: start over if it was theirs\n if (!ref.current || !('statusUsed' in ref.current))\n ref.current = { key: null, arr: null, statusUsed: false, memo: null, h: null, setter: undefined, sub: noSubscribe, subSelect: noSubscribe, enabled: true };\n const c = ref.current;\n if (c.key !== key || c.enabled !== enabled) {\n c.enabled = enabled;\n // The key's helpers and setter, looked up once per component (and again only if the key changes)\n const h = hooksFor(key);\n c.key = key;\n c.setter = setterFor(key);\n // One subscription for the value and the status. Status changes (fetching → idle) only\n // re-render components that actually read the status; one that destructures just\n // [value, setValue] is left alone.\n const onValue = subscribeTo(key);\n c.h = h;\n c.arr = null;\n // Query and computed keys are also marked as shown while subscribed, which loads them\n c.sub = h.statusCanChange\n ? (cb: () => void) => {\n const offValue = onValue(cb);\n const offStatus = h.statusSubscribe(() => { if (c.statusUsed) cb(); });\n const hide = enabled ? showKeys(key) : undefined; // { enabled: false }: don't load\n return () => { offValue(); offStatus(); hide?.(); };\n }\n : onValue;\n c.subSelect = h.statusCanChange\n ? (cb: () => void) => {\n const offValue = onValue(cb);\n const hide = enabled ? showKeys(key) : undefined;\n return () => { offValue(); hide?.(); };\n }\n : onValue;\n }\n\n // Remember the last selector result so we only re-render when it changes\n const select = (input: unknown) => {\n if (!selector) return input;\n const m = c.memo;\n if (m && m.selector === selector && Object.is(m.input, input))\n return m.output;\n selecting++;\n let output: unknown;\n try {\n output = selector(input as never);\n } finally {\n selecting--;\n }\n const keep = m && shallowEqual(m.output, output) ? m.output : output;\n c.memo = { input, output: keep, selector };\n return keep;\n };\n\n const h = c.h!;\n const snap = useSyncExternalStore(\n selector ? c.subSelect : c.sub,\n selector ? () => select(readKey(key)) : enabled ? h.cell : h.idleCell,\n selector ? () => select(readServer(key)) : enabled ? h.serverCell : h.serverIdleCell\n );\n\n if (selector) return snap;\n const value = (snap as Cell).v;\n c.renderStatus = (snap as Cell).s; // the status that goes with this value (also during hydration)\n // Return the same array while the value and setter are unchanged.\n // Index 2 is a getter: reading it marks the status as used, and it always\n // returns the live status (also when read later, outside of render).\n if (c.arr && c.arr[0] === value) return c.arr;\n const arr = new KeyTuple(3); // index 2 stays empty: reads go to the prototype getter\n arr[0] = value;\n arr[1] = c.setter;\n arr[STATUS_OF] = c; // the component's own bookkeeping: no separate link object\n c.arr = arr;\n return arr;\n }\n\n /* useGlobalState(state => ...), useGlobalState(get => ...), useGlobalState(({ a, b }) => ...) */\n function useStoreSelector(select: (state: never) => unknown): unknown {\n const memo = useRef<{\n select: unknown;\n deps: string[];\n values: unknown[];\n output: unknown;\n server: boolean;\n } | null>(null);\n\n const run = (read: (k: string) => unknown, server: boolean) => {\n // A key that throws (e.g. a computed loop the selector catches itself)\n // is recorded as THREW, and always makes the selector run again.\n const safeRead = (k: string) => {\n try {\n return read(k);\n } catch {\n return THREW;\n }\n };\n const m = memo.current;\n // Same selector, same inputs: reuse the last result\n if (\n m &&\n m.select === select &&\n m.server === server &&\n m.deps.every((d, i) => m.values[i] !== THREW && Object.is(safeRead(d), m.values[i]))\n )\n return m.output;\n\n // One reader per component, pointed at this run's read function and dependency set\n // (building a Proxy on every run was a sixth of the time when many selectors re-run)\n const r = (readerRef.current ??= { read, deps: new Set<string>(), reader: null as unknown });\n r.read = read;\n r.deps.clear();\n r.reader ??= makeReader((k) => r.read(k), (k) => r.deps.add(k), 'a selector');\n const deps = r.deps;\n selecting++;\n let output: unknown;\n try {\n output = select(r.reader as never);\n } finally {\n selecting--;\n }\n rejectReader(output, 'A selector');\n const list = [...deps];\n const keep = m && shallowEqual(m.output, output) ? m.output : output;\n memo.current = { select, deps: list, values: list.map(safeRead), output: keep, server };\n // Dependencies can change between runs (mode ? a : b). During render, only\n // add the new keys: with concurrent rendering this render may never commit,\n // and the screen must keep updating for the keys it actually shows. Keys\n // the committed render no longer reads are dropped after commit (below).\n const sub = subscription.current;\n if (sub.cb && !server) {\n const added = list.filter((k) => !sub.keys.includes(k));\n if (added.length) {\n indexSelector(sub.cb, [], added);\n sub.keys = [...sub.keys, ...added];\n }\n }\n return keep;\n };\n\n // Subscribed only to the keys this selector read last time\n const subscription = useRef<{ cb?: () => void; keys: string[] }>({ keys: [] });\n const readerRef = useRef<{ read: (k: string) => unknown; deps: Set<string>; reader: unknown } | null>(null);\n const subscribe = useCallback((cb: () => void) => {\n const sub = subscription.current;\n sub.cb = cb;\n sub.keys = memo.current?.deps ?? [];\n indexSelector(cb, [], sub.keys);\n return () => {\n indexSelector(cb, sub.keys, []);\n if (sub.cb === cb) { sub.cb = undefined; sub.keys = []; }\n };\n }, []);\n\n const value = useSyncExternalStore(\n subscribe,\n () => run(readKey, false),\n () => run(readServer, true)\n );\n // After commit: subscribe to exactly the keys the committed render read. The effect only\n // runs when that list changed, not on every render of every component using a selector.\n const committedDeps = memo.current?.deps ?? [];\n const depsId = committedDeps.join('\\u0000');\n useEffect(() => {\n const sub = subscription.current;\n if (!sub.cb) return;\n const drop = sub.keys.filter((k) => !committedDeps.includes(k));\n const add = committedDeps.filter((k) => !sub.keys.includes(k));\n if (drop.length || add.length) {\n indexSelector(sub.cb, drop, add);\n sub.keys = committedDeps;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- depsId is committedDeps, as a string\n }, [depsId]);\n useLoadQueries(committedDeps.some((k) => isQuery(k) || isComputed(k)) ? committedDeps.filter((k) => isQuery(k) || isComputed(k)).join('\\u0000') : '');\n return value;\n }\n\n function useGlobalState<K extends PagedKeysOf<S>>(key: K): [PageOf<S[K]>[], undefined, PagedStatusFor<S[K]>];\n function useGlobalState<K extends PagedKeysOf<S>>(\n key: K,\n params: TakesParams<PagedParamsOf<S[K]>>,\n options?: UseOptions\n ): [PageOf<S[K]>[], undefined, PagedStatusFor<S[K]>];\n function useGlobalState<K extends QueryKeysOf<S> & keyof SV>(\n key: K,\n params: TakesParams<ParamsOf<S[K]>>,\n options?: UseOptions\n ): [SV[K] | undefined, SetValue<RV[K & keyof RV]>, StatusFor<S[K & keyof S]>];\n function useGlobalState<K extends Key>(\n key: K\n ): [V[K], K extends StateKey ? SetValue<RV[K & keyof RV]> & ActionsFor<KA, K> : undefined, StatusFor<S[K & keyof S]>];\n function useGlobalState<K extends Key, R>(\n key: K,\n selector: (value: V[K]) => R\n ): R;\n function useGlobalState<R>(select: (state: StateReader<V>) => R): R;\n function useGlobalState(\n keyOrSelect: string | ((state: never) => unknown),\n second?: unknown,\n options?: UseOptions\n ): unknown {\n // Every path below uses the same two hooks (a ref and one subscription), so a component\n // can move between them, e.g. useGlobalState('user', id) while id goes from undefined to set.\n if (typeof keyOrSelect === 'function')\n // eslint-disable-next-line react-hooks/rules-of-hooks -- same kind of argument on every render\n return useStoreSelector(keyOrSelect);\n // Params passed but undefined (user?.id before the user has loaded): they aren't known yet, so\n // the query waits. Leaving the params out is what reads a query without params.\n // (arguments.length, not a rest array: that would be allocated on every render)\n const paramsGiven = arguments.length >= 2 && typeof second !== 'function';\n if (paramsGiven) checkUseOptions(options, keyOrSelect);\n if (isPaged(keyOrSelect))\n // eslint-disable-next-line react-hooks/rules-of-hooks -- same two hooks as the other paths\n return usePaged(keyOrSelect, second, paramsGiven && second === undefined, blockOf(options));\n if (paramsGiven && (second !== undefined || isQuery(keyOrSelect))) {\n if (!isQuery(keyOrSelect))\n throw new Error(\n `useGlobalState(\"${keyOrSelect}\", params): \"${keyOrSelect}\" ${hasKey(keyOrSelect) ? \"isn't a query, so it doesn't take params\" : 'is not in the store'}. ` +\n `The second argument is params for a query(...) key, or a selector function.`\n );\n // eslint-disable-next-line react-hooks/rules-of-hooks -- same two hooks as the other paths\n return useEntryState(keyOrSelect, second, second === undefined, blockOf(options));\n }\n // eslint-disable-next-line react-hooks/rules-of-hooks -- same two hooks as the other paths\n return useKeyState(keyOrSelect, second as ((value: never) => unknown) | undefined);\n }\n\n interface Block {\n blocked: boolean;\n blockedBy: string | null;\n rootError: unknown;\n }\n const NOT_BLOCKED: Block = { blocked: false, blockedBy: null, rootError: null };\n /** What enabled and waitFor say: waiting or not, on which query, and why */\n function blockOf(options: UseOptions | undefined): Block {\n if (!options) return NOT_BLOCKED;\n const enabled = options.enabled !== false;\n const ups = options.waitFor === undefined ? [] : Array.isArray(options.waitFor) ? options.waitFor : [options.waitFor as Status];\n let blockedBy: string | null = null;\n let rootError: unknown = null;\n let waiting = false;\n // An upstream that failed without data wins: its error is the reason\n for (const u of ups as Status[]) {\n const info = statusInfo.get(u);\n if (u.blocked && u.rootError != null) return { blocked: true, blockedBy: u.blockedBy, rootError: u.rootError };\n if (u.error != null && !(info?.hasData() ?? false)) return { blocked: true, blockedBy: info?.key ?? null, rootError: u.error };\n }\n for (const u of ups as Status[]) {\n if (u.blocked || u.loading) {\n waiting = true;\n blockedBy ??= u.blocked ? u.blockedBy ?? statusInfo.get(u)?.key ?? null : statusInfo.get(u)?.key ?? null;\n rootError ??= u.rootError ?? null;\n }\n }\n if (!waiting && enabled) return NOT_BLOCKED;\n return { blocked: true, blockedBy, rootError };\n }\n const sameBlock = (a: Block, b: Block) => a.blocked === b.blocked && a.blockedBy === b.blockedBy && Object.is(a.rootError, b.rootError);\n const noop = () => Promise.resolve();\n\n /** Marks a cache entry as on screen and loads it; returns the cleanup (it runs in the subscription) */\n function showEntry(q: string, params: unknown, k: string): () => void {\n const visible = onScreen.get(k) ?? { name: q, params, count: 0 };\n visible.count++;\n onScreen.set(k, visible);\n clearTimeout(gcTimers.get(k));\n gcTimers.delete(k);\n updateWindowListeners();\n fetchQuery(q, params).catch(() => {});\n return () => {\n visible.count--;\n if (visible.count === 0) scheduleGc(k);\n updateWindowListeners();\n };\n }\n\n // The selected value of a cache entry, recalculated only when its data changes\n const entrySelect = new Map<string, { raw: unknown; out: unknown }>();\n function selectedData(q: string, k: string, raw: unknown): unknown {\n const select = queryDefs[q]?.options.select;\n if (!select || raw === undefined) return raw;\n const m = entrySelect.get(k);\n if (m && Object.is(m.raw, raw)) return m.out;\n const out = select(raw);\n entrySelect.set(k, { raw, out });\n return out;\n }\n\n // The setter of one params' entry: writes it, and with a server call, rolls back on failure\n const entrySetters = new Map<string, SetValue<unknown>>();\n function entrySetter(q: string, params: unknown, k: string): SetValue<unknown> {\n let setter = entrySetters.get(k);\n if (!setter) {\n setter = (value, serverCall) => {\n const prev = cache.get(k)?.data;\n const next = typeof value === 'function' ? (value as (p: unknown) => unknown)(prev) : value;\n setEntry(k, { data: next, status: 'success' });\n if (!serverCall) return Promise.resolve() as Promise<never>;\n const done = Promise.resolve()\n .then(serverCall)\n .then(\n (result) => {\n if (queryDefs[q]?.options.refetchAfterMutation) return fetchQuery(q, params, true).then(() => result, () => result);\n return result; // what the save returned\n },\n (error) => {\n // Roll back, unless something newer has replaced the value since, or the page is being left\n // (the browser cancelled a request that may well have reached the server: #3)\n if (!leavingPage && Object.is(cache.get(k)?.data, next)) setEntry(k, { data: prev, status: prev === undefined ? 'idle' : 'success' });\n throw error;\n }\n );\n done.catch(() => {});\n ownPromises.add(done);\n return done as Promise<never>;\n };\n entrySetters.set(k, setter);\n }\n return setter;\n }\n\n /** state and loading for an entry's status, with a cancelled first load reported as the query asked */\n function entryState(q: string, entry: Entry, hasData: boolean, enabled: boolean): { state: StatusState; loading: boolean } {\n const loading = entry.status === 'loading';\n const asked = abortedState(q, entry.status === 'idle' && !!entry.aborted, loading, hasData, !enabled);\n if (asked === 'loading') return { state: 'loading', loading: true };\n if (asked === 'idle') return { state: 'idle' as StatusState, loading: false };\n return { state: stateOf(loading, entry.error, hasData, !enabled), loading };\n }\n\n interface EntryHookState {\n mode: 'entry' | 'paged';\n q: string;\n params: unknown; // the last params object: the same one again reuses k (React's Object.is, like hook deps)\n k: string;\n enabled: boolean;\n block: Block;\n sub: (cb: () => void) => () => void;\n snap: () => unknown;\n serverSnap: () => unknown;\n }\n\n // A setter for params that aren't known yet: there's no entry to write\n const waitingSetter = (q: string): SetValue<unknown> => () => {\n throw new Error(`useGlobalState(\"${q}\", params): the params aren't known yet (they're undefined), so there's no entry to write.`);\n };\n\n // useGlobalState(\"feed\", undefined) on a query whose function takes no params: almost surely a\n // wrapper forwarding an empty argument. It waits forever, so say so (once per query).\n const warnedNoParams = new Set<string>();\n function checkWaiting(q: string, paged: boolean) {\n if (warnedNoParams.has(q)) return;\n const fn = (initialState as Record<string, { fetch?: (...a: never[]) => unknown } | undefined>)[q]?.fetch;\n if (typeof fn !== 'function' || fn.length > (paged ? 1 : 0)) return; // it declares params: waiting is right\n warnedNoParams.add(q);\n console.warn(\n `[${name}] useGlobalState(\"${q}\", undefined) is waiting for params, but ${q}'s fetch function takes none${paged ? ' besides the page' : ''}. ` +\n `To read it without params, leave the argument out: useGlobalState(\"${q}\").`\n );\n }\n\n /** useGlobalState(key, params): one params' entry, as [value, setter, status] */\n function useEntryState(q: string, params: unknown, waitingForParams: boolean, block: Block): unknown {\n if (waitingForParams) checkWaiting(q, false);\n const ref = useRef<EntryHookState | KeyHookState | null>(null);\n let c = ref.current as EntryHookState | null;\n const same = c !== null && c.mode === 'entry' && c.q === q && Object.is(c.params, params);\n const k = waitingForParams ? '' : same ? c!.k : cacheKey(q, params); // big filters: keyed once, not per render\n const enabled = !waitingForParams && !block.blocked;\n if (!c || c.mode !== 'entry' || c.k !== k || c.enabled !== enabled || !sameBlock(c.block, block)) {\n const missing = enabled ? PENDING : EMPTY;\n const setter = waitingForParams ? waitingSetter(q) : entrySetter(q, params, k);\n const refetch = enabled ? () => fetchQuery(q, params, true).then(() => {}, () => {}) : noop;\n const why = enabled ? NOT_BLOCKED : { ...block, blocked: true };\n let last: { entry: Entry; tuple: unknown[] } | null = null;\n const tupleOf = (entry: Entry) => {\n if (last && last.entry === entry) return last.tuple;\n const status: Status = owned(\n { ...entryState(q, entry, entry.data !== undefined, enabled), fetching: entry.isFetching, error: entry.error ?? null, ...why, refetch },\n q, () => entry.data !== undefined\n );\n const tuple = [waitingForParams ? undefined : selectedData(q, k, entry.data), setter, status];\n last = { entry, tuple };\n return tuple;\n };\n const onEntry = waitingForParams ? noSubscribe : subscribeTo(entryChannel(k));\n c = {\n mode: 'entry', q, params, k, enabled, block,\n sub: (cb) => {\n const off = onEntry(cb);\n const hide = enabled ? showEntry(q, params, k) : undefined;\n return () => { off(); hide?.(); };\n },\n snap: () => tupleOf((waitingForParams ? undefined : cache.get(k)) ?? missing),\n serverSnap: () => tupleOf((waitingForParams ? undefined : isBrowser ? hydratedEntries.get(k) : cache.get(k)) ?? missing),\n };\n ref.current = c;\n }\n return useSyncExternalStore(c.sub, c.snap, c.serverSnap);\n }\n\n const NO_PAGES: never[] = [];\n\n /** useGlobalState(pagedKey, params?): [pages, undefined, status with page controls] */\n function usePaged(q: string, params: unknown, waitingForParams: boolean, block: Block): unknown {\n if (waitingForParams) checkWaiting(q, true);\n const ref = useRef<EntryHookState | KeyHookState | null>(null);\n let c = ref.current as EntryHookState | null;\n const same = c !== null && c.mode === 'paged' && c.q === q && Object.is(c.params, params);\n const k = waitingForParams ? '' : same ? c!.k : cacheKey(q, params); // big filters: keyed once, not per render\n const enabled = !waitingForParams && !block.blocked;\n if (!c || c.mode !== 'paged' || c.k !== k || c.enabled !== enabled || !sameBlock(c.block, block)) {\n const def = namedDefs[q] as AnyInfinite;\n const missing = enabled ? PENDING : EMPTY;\n // While blocked, the page controls do nothing: no requests until it can run\n const fetchNextPage = enabled ? () => fetchInfinite(q, def, params, 'next').then(() => {}, () => {}) : noop;\n const refetch = enabled ? () => fetchInfinite(q, def, params, 'first', true).then(() => {}, () => {}) : noop;\n const why = enabled ? NOT_BLOCKED : { ...block, blocked: true };\n let last: { entry: Entry; tuple: unknown[] } | null = null;\n const tupleOf = (entry: Entry) => {\n if (last && last.entry === entry) return last.tuple;\n const data = entry.data as InfiniteData | undefined;\n const status: PagedStatus = owned({\n ...entryState(q, entry, data !== undefined, enabled), // more pages loading: still 'ready'\n fetching: entry.isFetching, error: entry.error ?? null, ...why, refetch,\n hasNextPage: enabled && data ? data.next != null : false, fetchNextPage, isFetchingNextPage: !!entry.fetchingNext,\n }, q, () => data !== undefined);\n const tuple = [(waitingForParams ? undefined : data?.pages) ?? NO_PAGES, undefined, status];\n last = { entry, tuple };\n return tuple;\n };\n const onEntry = waitingForParams ? noSubscribe : subscribeTo(entryChannel(k));\n c = {\n mode: 'paged', q, params, k, enabled, block,\n sub: (cb) => {\n const off = onEntry(cb);\n const hide = enabled ? showEntry(q, params, k) : undefined;\n return () => { off(); hide?.(); };\n },\n snap: () => tupleOf((waitingForParams ? undefined : cache.get(k)) ?? missing),\n serverSnap: () => tupleOf((waitingForParams ? undefined : isBrowser ? hydratedEntries.get(k) : cache.get(k)) ?? missing),\n };\n ref.current = c;\n }\n return useSyncExternalStore(c.sub, c.snap, c.serverSnap);\n }\n\n function useHistory() {\n return useSyncExternalStore(\n subscribeTo(HISTORY_CHANNEL),\n () => historyInfo,\n () => historyInfo\n );\n }\n\n function subscribe(listener: (e: ChangeEvent) => void) {\n changeListeners.add(listener);\n let held: typeof listener | undefined = listener; // released after unsubscribing\n return () => {\n if (held) changeListeners.delete(held);\n held = undefined;\n };\n }\n\n /** Public setState: same as the hook setter, so it can also save to the server. */\n function setStateWithServer<K extends StateKey, R = void>(\n key: K,\n value: Updater<RV[K & keyof RV]>,\n serverCall?: () => Promise<R> | R\n ): Promise<R> {\n return update(key, value, serverCall) as Promise<never>; // resolves with what the save returned\n }\n\n /**\n * The state to send to the browser: plain values of every state key (or of the keys `ssr.keys`/`ssr.exclude` choose\n * keys). Query keys are included only once they've loaded, so the browser never mistakes an\n * empty initial value for data. Computed values aren't included; they're recalculated.\n */\n function snapshot(): Partial<RV> & { $queries?: Record<string, unknown>; $ages?: Record<string, number> } {\n const cfg = options.ssr;\n const only = cfg && typeof cfg === 'object' && cfg.keys ? new Set(cfg.keys as string[]) : null;\n const skip = new Set((cfg && typeof cfg === 'object' && (cfg.exclude as string[] | undefined)) || []);\n // ssr: { keys } or { exclude }. By default, a key that persists is left out while the server hasn't\n // changed it: its declared value would overwrite what the browser just restored (a logged-in user\n // would look logged out). A value the server set for this request (createScope({ user }), setState)\n // is sent, so the page hydrates as the server rendered it. ssr.keys sends a key regardless.\n const untouchedSaved = (k: string) => appPersistedKeys.has(k) && Object.is(state[k], (initialState as Record<string, unknown>)[k]);\n const list = { has: (k: string) => (only ? only.has(k) : !skip.has(k) && !untouchedSaved(k)) };\n const now = Date.now();\n // Fails here, naming the value, rather than later as different data in the browser\n const check = (what: string, at: string, value: unknown) => {\n const bad = notJsonSafe(value, at, false);\n if (!bad) return;\n throw new Error(\n `[${name}] snapshot() can't send ${what}: ${bad}. Snapshots travel as JSON, so keep that state to ` +\n `strings, numbers, booleans, null, arrays and plain objects (a Date as an ISO string or a timestamp), ` +\n `or leave it out with ssr: { exclude: [...] }.`\n );\n };\n const out: Record<string, unknown> = { $version: snapshotVersion };\n const ages: Record<string, number> = {};\n for (const k of STATE_KEYS) {\n if (list && !list.has(k)) continue;\n if (isQuery(k) && !meta(k).loaded) continue;\n if (state[k] === undefined)\n throw new Error(\n `[${name}] snapshot() can't send state key \"${k}\": it's undefined, and JSON drops undefined, so the browser ` +\n `would start from the initial value instead. Use null for \"no value\", or leave the key out with ssr: { exclude: [...] }.`\n );\n check(`state key \"${k}\"`, k, state[k]);\n out[k] = state[k];\n // How long ago it loaded, so the browser knows how fresh it is. An age, not a time:\n // the server's and the browser's clocks can disagree by minutes.\n if (isQuery(k)) ages[k] = Math.max(0, now - meta(k).updatedAt);\n }\n // Named and infinite queries that have data (by cache entry), so the browser can render\n // the same HTML and doesn't fetch them again\n const queries: Record<string, { data: unknown; age: number }> = {};\n for (const [k, e] of cache)\n if (e.status === 'success' && e.data !== undefined && (!list || list.has(queryNameOf(k)))) {\n check(`query \"${queryNameOf(k)}\"`, 'data', e.data);\n queries[k] = { data: e.data, age: Math.max(0, now - e.updatedAt) };\n }\n if (Object.keys(queries).length) out.$queries = queries;\n if (Object.keys(ages).length) out.$ages = ages;\n return out as Partial<RV> & { $queries?: Record<string, unknown>; $ages?: Record<string, number> };\n }\n\n function toScript(): string {\n if (!options.name)\n throw new Error(\n `[${name}] toScript() needs the store's name, so the browser can find its data: createStore(state, { name: 'shop', ssr: true }).`\n );\n return `<script type=\"application/json\" id=\"${escapeAttr(dataTagId(name))}\">${serializeSnapshot(snapshot())}</script>`;\n }\n\n const members = {\n ...api, // emit, on, fetchQuery, setQueryData, invalidate, whenOnline, batch, abort\n useGlobalState,\n getState,\n setState: setStateWithServer,\n set,\n actions,\n undo,\n redo,\n goTo,\n useHistory,\n subscribe,\n reset,\n destroy,\n /** Resolves once persisted state has loaded (right away for sync storage) */\n hydrated: whenHydrated,\n /** Undo/redo state now, outside React: { canUndo, canRedo, position, length } */\n getHistory: () => ({ ...historyInfo }),\n snapshot,\n /**\n * The snapshot as a data tag for the HTML: <script type=\"application/json\" id=\"createstore:<name>\">.\n * It never runs (so it works under a strict Content Security Policy) and is escaped, so data like\n * \"</script>\" can't end it. In the browser, hydrate() with no argument finds it.\n */\n toScript,\n };\n // store.cart.add(...): each state key's setter, with its key actions, on the store. They live on\n // its prototype, so the store's own members stay a small object that's fast to read (thousands\n // of keys defined on the store itself made every store.useGlobalState lookup slow).\n // A key named like a store member (reset, set...) stays available as store.set.<key>.\n // Built through a constructor whose prototype holds the setters: V8 keeps such objects in\n // fast-property mode (Object.create + assign left the store in slow dictionary mode).\n const Store = function (this: object) {\n Object.assign(this, members);\n } as unknown as { new (): typeof members; prototype: object };\n Store.prototype = directProtoOf(def, members, name); // shared by every scope of this store\n const store = new Store();\n Object.defineProperty(store, SETTER_OF, { value: setterFor });\n Object.defineProperty(store, SEED, { value: seed });\n Object.defineProperty(store, QUIET, { value: holdingNotify });\n Object.defineProperty(store, DEFINITION, { value: def });\n return store as typeof members & DirectSetters<S, KA>;\n}"],"mappings":"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","names":["channel","set","holder","def","held","cache","p","h","subscribe","options"]}
|