@rpcbase/client 0.392.0 → 0.394.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -11,5 +11,5 @@ export * from './components/RouteErrorBoundary';
11
11
  export * from './notifications';
12
12
  export * from './notificationsRealtime';
13
13
  export * from './errorReporting';
14
- export { STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY, RtsSsrRuntimeProvider, clearHydratedRtsQueryData, hydrateRtsFromWindow, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, type RtsSsrHydrationQueryData, type RtsSsrQueryRegistration, type RtsSsrRuntime, type StaticRpcbaseRtsHydrationData, } from './rts/ssrHydration';
14
+ export { STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY, RtsSsrRuntimeProvider, clearHydratedRtsQueryData, hydrateRtsFromWindow, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, peekHydratedRtsQueryTotalCount, type RtsSsrHydrationQueryData, type RtsSsrQueryRegistration, type RtsSsrRuntime, type StaticRpcbaseRtsHydrationData, } from './rts/ssrHydration';
15
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,kBAAkB,CAAA;AAChC,OAAO,EACL,qCAAqC,EACrC,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,6BAA6B,GACnC,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,kBAAkB,CAAA;AAChC,OAAO,EACL,qCAAqC,EACrC,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,6BAA6B,GACnC,MAAM,oBAAoB,CAAA"}
package/dist/index.js CHANGED
@@ -6,8 +6,8 @@ import { getNavigationGuards, createRoutesFromElements, createBrowserRouter, Rou
6
6
  import { hydrateRoot } from "react-dom/client";
7
7
  import { r as reportClientException } from "./errorReporting-CVoUUKxW.js";
8
8
  import { s } from "./errorReporting-CVoUUKxW.js";
9
- import { n as hydrateRtsFromWindow, v as useQuery } from "./useQuery-CUjwBdkK.js";
10
- import { R, S, p, q, t } from "./useQuery-CUjwBdkK.js";
9
+ import { n as hydrateRtsFromWindow, w as useQuery } from "./useQuery-Q5Bygu9_.js";
10
+ import { R, S, p, q, t, v } from "./useQuery-Q5Bygu9_.js";
11
11
  const emptyUnsubscribe = () => {
12
12
  };
13
13
  const useMediaQuery = (query) => {
@@ -3065,6 +3065,7 @@ export {
3065
3065
  peekClientSsrErrorState,
3066
3066
  q as peekHydratedRtsQueryData,
3067
3067
  t as peekHydratedRtsQueryPageInfo,
3068
+ v as peekHydratedRtsQueryTotalCount,
3068
3069
  reportClientException,
3069
3070
  runNotificationDigest,
3070
3071
  serializeSsrErrorState,
@@ -1,6 +1,6 @@
1
1
  export { configureRtsPouchStore, destroyAllCollections, destroyCollection, deleteDocs, getCollection, resetRtsPouchStore, runQuery, updateDocs, type RtsPouchQueryContext, type RtsPouchQueryOptions, type RtsPouchStoreConfig, } from './pouchStore';
2
2
  export { addLocalTxn, connect, disconnect, onMessage, reconnect, registerQuery, runNetworkQuery, sendMessage, syncRtsChanges, type RtsConnectOptions, type RtsQueryContext, type RtsQueryOptions, } from './wsClient';
3
- export { hydrateRtsFromWindow, clearHydratedRtsQueryData, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, RtsSsrRuntimeProvider, STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY, type RtsSsrHydrationQueryData, type RtsSsrQueryRegistration, type RtsSsrRuntime, type StaticRpcbaseRtsHydrationData, } from './ssrHydration';
3
+ export { hydrateRtsFromWindow, clearHydratedRtsQueryData, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, peekHydratedRtsQueryTotalCount, RtsSsrRuntimeProvider, STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY, type RtsSsrHydrationQueryData, type RtsSsrQueryRegistration, type RtsSsrRuntime, type StaticRpcbaseRtsHydrationData, } from './ssrHydration';
4
4
  export { type RtsModelMap, type RtsModelName, } from './modelTypes';
5
5
  export { useQuery, type UseRtsQueryOptions, type UseRtsQueryResult, } from './useQuery';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,eAAe,EACf,WAAW,EACX,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,qBAAqB,EACrB,qCAAqC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,6BAA6B,GACnC,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,QAAQ,EACR,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,eAAe,EACf,WAAW,EACX,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,qBAAqB,EACrB,qCAAqC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,6BAA6B,GACnC,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,QAAQ,EACR,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAA"}
package/dist/rts/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { R, S, f, p, c, h, b, d, a, i, g, n, o, q, t, j, k, r, l, e, s, m, u, v } from "../useQuery-CUjwBdkK.js";
1
+ import { R, S, f, p, c, h, b, d, a, i, g, n, o, q, t, v, j, k, r, l, e, s, m, u, w } from "../useQuery-Q5Bygu9_.js";
2
2
  export {
3
3
  R as RtsSsrRuntimeProvider,
4
4
  S as STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY,
@@ -15,6 +15,7 @@ export {
15
15
  o as onMessage,
16
16
  q as peekHydratedRtsQueryData,
17
17
  t as peekHydratedRtsQueryPageInfo,
18
+ v as peekHydratedRtsQueryTotalCount,
18
19
  j as reconnect,
19
20
  k as registerQuery,
20
21
  r as resetRtsPouchStore,
@@ -23,6 +24,6 @@ export {
23
24
  s as sendMessage,
24
25
  m as syncRtsChanges,
25
26
  u as updateDocs,
26
- v as useQuery
27
+ w as useQuery
27
28
  };
28
29
  //# sourceMappingURL=index.js.map
@@ -9,6 +9,7 @@ export type RtsSsrHydrationQueryData = {
9
9
  queryKey: string;
10
10
  data: unknown[];
11
11
  pageInfo?: PaginationPageInfo;
12
+ totalCount?: number;
12
13
  };
13
14
  export type StaticRpcbaseRtsHydrationData = {
14
15
  v: 1;
@@ -26,10 +27,12 @@ export type RtsSsrRuntime = {
26
27
  registerQuery: (query: RtsSsrQueryRegistration) => void;
27
28
  getQueryData: (modelName: RtsModelName, queryKey: string) => unknown[] | undefined;
28
29
  getQueryPageInfo: (modelName: RtsModelName, queryKey: string) => PaginationPageInfo | undefined;
30
+ getQueryTotalCount: (modelName: RtsModelName, queryKey: string) => number | undefined;
29
31
  };
30
32
  export declare const hydrateRtsFromWindow: () => void;
31
33
  export declare const peekHydratedRtsQueryData: (modelName: RtsModelName, queryKey: string) => unknown[] | undefined;
32
34
  export declare const peekHydratedRtsQueryPageInfo: (modelName: RtsModelName, queryKey: string) => PaginationPageInfo | undefined;
35
+ export declare const peekHydratedRtsQueryTotalCount: (modelName: RtsModelName, queryKey: string) => number | undefined;
33
36
  export declare const consumeHydratedRtsQueryData: (modelName: RtsModelName, queryKey: string) => void;
34
37
  export declare const clearHydratedRtsQueryData: () => void;
35
38
  export declare const RtsSsrRuntimeProvider: ({ value, children, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"ssrHydration.d.ts","sourceRoot":"","sources":["../../src/rts/ssrHydration.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAGjD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,eAAO,MAAM,qCAAqC,oCAAoC,CAAA;AAEtF,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,YAAY,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,QAAQ,CAAC,EAAE,kBAAkB,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,CAAC,EAAE,CAAC,CAAA;IACJ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,EAAE,wBAAwB,EAAE,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,YAAY,CAAA;IACvB,KAAK,EAAE,UAAU,CAAA;IACjB,OAAO,EAAE,eAAe,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAA;IACvD,YAAY,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,EAAE,GAAG,SAAS,CAAA;IAClF,gBAAgB,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAA;CAChG,CAAA;AAoFD,eAAO,MAAM,oBAAoB,QAAO,IAgBvC,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,WAAW,YAAY,EACvB,UAAU,MAAM,KACf,OAAO,EAAE,GAAG,SAEd,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,WAAW,YAAY,EACvB,UAAU,MAAM,KACf,kBAAkB,GAAG,SAEvB,CAAA;AAED,eAAO,MAAM,2BAA2B,GACtC,WAAW,YAAY,EACvB,UAAU,MAAM,KACf,IAIF,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,IAG5C,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,sBAGnC;IACD,KAAK,EAAE,aAAa,CAAA;IACpB,QAAQ,EAAE,SAAS,CAAA;CACpB,4CAMA,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,aAAa,GAAG,IAEnD,CAAA"}
1
+ {"version":3,"file":"ssrHydration.d.ts","sourceRoot":"","sources":["../../src/rts/ssrHydration.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAGjD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,eAAO,MAAM,qCAAqC,oCAAoC,CAAA;AAEtF,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,YAAY,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,CAAC,EAAE,CAAC,CAAA;IACJ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,OAAO,EAAE,wBAAwB,EAAE,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,YAAY,CAAA;IACvB,KAAK,EAAE,UAAU,CAAA;IACjB,OAAO,EAAE,eAAe,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAA;IACvD,YAAY,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,EAAE,GAAG,SAAS,CAAA;IAClF,gBAAgB,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAA;IAC/F,kBAAkB,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;CACtF,CAAA;AA8FD,eAAO,MAAM,oBAAoB,QAAO,IAkBvC,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,WAAW,YAAY,EACvB,UAAU,MAAM,KACf,OAAO,EAAE,GAAG,SAEd,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,WAAW,YAAY,EACvB,UAAU,MAAM,KACf,kBAAkB,GAAG,SAEvB,CAAA;AAED,eAAO,MAAM,8BAA8B,GACzC,WAAW,YAAY,EACvB,UAAU,MAAM,KACf,MAAM,GAAG,SAEX,CAAA;AAED,eAAO,MAAM,2BAA2B,GACtC,WAAW,YAAY,EACvB,UAAU,MAAM,KACf,IAKF,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,IAI5C,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,sBAGnC;IACD,KAAK,EAAE,aAAa,CAAA;IACpB,QAAQ,EAAE,SAAS,CAAA;CACpB,4CAMA,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,aAAa,GAAG,IAEnD,CAAA"}
@@ -11,6 +11,7 @@ export type UseRtsQueryOptions = RtsQueryOptions & {
11
11
  export type UseRtsQueryResult<T> = {
12
12
  data: T[] | undefined;
13
13
  pageInfo?: PaginationPageInfo;
14
+ totalCount?: number;
14
15
  source: RtsQueryContext["source"] | undefined;
15
16
  error: unknown | undefined;
16
17
  loading: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/rts/useQuery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAIhD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIlE,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AA4EzC,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG;IACjD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACtB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAA;IACrB,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAA;IAC7C,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,aAAa,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACrC,eAAe,EAAE,MAAM,IAAI,CAAA;CAC5B,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClF,WAAW,YAAY,EACvB,QAAO,UAAe,EACtB,UAAS,kBAAuB,KAC/B,iBAAiB,CAAC,CAAC,CA0brB,CAAA"}
1
+ {"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/rts/useQuery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAIhD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIlE,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAkFzC,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG;IACjD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACtB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAA;IACrB,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAA;IAC7C,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,aAAa,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACrC,eAAe,EAAE,MAAM,IAAI,CAAA;CAC5B,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClF,WAAW,YAAY,EACvB,QAAO,UAAe,EACtB,UAAS,kBAAuB,KAC/B,iBAAiB,CAAC,CAAC,CAudrB,CAAA"}
@@ -18,6 +18,7 @@ export type RtsNetworkQueryContext = {
18
18
  isLocal: boolean;
19
19
  txnId?: string;
20
20
  pageInfo?: PaginationPageInfo;
21
+ totalCount?: number;
21
22
  };
22
23
  export type RtsCacheQueryContext = {
23
24
  source: "cache";
@@ -1 +1 @@
1
- {"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../src/rts/wsClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../src/rts/wsClient.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ const STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY = "__staticRpcbaseRtsHydrationData";
5
5
  const RtsSsrRuntimeContext = createContext(null);
6
6
  const hydrationDataStore = /* @__PURE__ */ new Map();
7
7
  const hydrationPageInfoStore = /* @__PURE__ */ new Map();
8
+ const hydrationTotalCountStore = /* @__PURE__ */ new Map();
8
9
  const makeStoreKey = (modelName, queryKey) => `${modelName}.${queryKey}`;
9
10
  const normalizeStringOrNull = (value) => {
10
11
  if (typeof value !== "string") return null;
@@ -28,6 +29,11 @@ const normalizePageInfo$2 = (value) => {
28
29
  } : {}
29
30
  };
30
31
  };
32
+ const normalizeTotalCount$2 = (value) => {
33
+ if (typeof value !== "number") return void 0;
34
+ if (!Number.isFinite(value) || value < 0) return void 0;
35
+ return Math.floor(value);
36
+ };
31
37
  const parseHydrationData = (value) => {
32
38
  if (!value || typeof value !== "object") return null;
33
39
  const raw = value;
@@ -42,12 +48,16 @@ const parseHydrationData = (value) => {
42
48
  if (!modelName || !queryKey) continue;
43
49
  if (!Array.isArray(query.data)) continue;
44
50
  const pageInfo = normalizePageInfo$2(query.pageInfo);
51
+ const totalCount = normalizeTotalCount$2(query.totalCount);
45
52
  queries.push({
46
53
  modelName,
47
54
  queryKey,
48
55
  data: query.data,
49
56
  ...pageInfo ? {
50
57
  pageInfo
58
+ } : {},
59
+ ...totalCount !== void 0 ? {
60
+ totalCount
51
61
  } : {}
52
62
  });
53
63
  }
@@ -67,9 +77,11 @@ const hydrateRtsFromWindow = () => {
67
77
  if (!parsed) return;
68
78
  hydrationDataStore.clear();
69
79
  hydrationPageInfoStore.clear();
80
+ hydrationTotalCountStore.clear();
70
81
  for (const query of parsed.queries) {
71
82
  hydrationDataStore.set(makeStoreKey(query.modelName, query.queryKey), query.data);
72
83
  hydrationPageInfoStore.set(makeStoreKey(query.modelName, query.queryKey), query.pageInfo);
84
+ hydrationTotalCountStore.set(makeStoreKey(query.modelName, query.queryKey), query.totalCount);
73
85
  }
74
86
  };
75
87
  const peekHydratedRtsQueryData = (modelName, queryKey) => {
@@ -78,14 +90,19 @@ const peekHydratedRtsQueryData = (modelName, queryKey) => {
78
90
  const peekHydratedRtsQueryPageInfo = (modelName, queryKey) => {
79
91
  return hydrationPageInfoStore.get(makeStoreKey(modelName, queryKey));
80
92
  };
93
+ const peekHydratedRtsQueryTotalCount = (modelName, queryKey) => {
94
+ return hydrationTotalCountStore.get(makeStoreKey(modelName, queryKey));
95
+ };
81
96
  const consumeHydratedRtsQueryData = (modelName, queryKey) => {
82
97
  const key = makeStoreKey(modelName, queryKey);
83
98
  hydrationDataStore.delete(key);
84
99
  hydrationPageInfoStore.delete(key);
100
+ hydrationTotalCountStore.delete(key);
85
101
  };
86
102
  const clearHydratedRtsQueryData = () => {
87
103
  hydrationDataStore.clear();
88
104
  hydrationPageInfoStore.clear();
105
+ hydrationTotalCountStore.clear();
89
106
  };
90
107
  const RtsSsrRuntimeProvider = (t0) => {
91
108
  const $ = c(3);
@@ -1156,6 +1173,11 @@ const normalizePageInfo$1 = (value) => {
1156
1173
  } : {}
1157
1174
  };
1158
1175
  };
1176
+ const normalizeTotalCount$1 = (value) => {
1177
+ if (typeof value !== "number") return void 0;
1178
+ if (!Number.isFinite(value) || value < 0) return void 0;
1179
+ return Math.floor(value);
1180
+ };
1159
1181
  const handleQueryPayload = (payload) => {
1160
1182
  const {
1161
1183
  modelName,
@@ -1169,9 +1191,10 @@ const handleQueryPayload = (payload) => {
1169
1191
  if (!callbacks || !callbacks.size) return;
1170
1192
  const subscription = subscriptions.get(cbKey);
1171
1193
  const pageInfo = normalizePageInfo$1(payload.pageInfo);
1194
+ const totalCount = normalizeTotalCount$1(payload.totalCount);
1172
1195
  const populateCache = subscription?.populateCache;
1173
1196
  const hasPopulate = Boolean(populateCache);
1174
- const hasPagination = Boolean(subscription?.options?.pagination || pageInfo);
1197
+ const hasPagination = Boolean(subscription?.options?.pagination || pageInfo || totalCount !== void 0);
1175
1198
  const isLocal = !!(txnId && localTxnBuf.includes(txnId));
1176
1199
  const context = {
1177
1200
  source: "network",
@@ -1179,6 +1202,9 @@ const handleQueryPayload = (payload) => {
1179
1202
  txnId,
1180
1203
  ...pageInfo ? {
1181
1204
  pageInfo
1205
+ } : {},
1206
+ ...totalCount !== void 0 ? {
1207
+ totalCount
1182
1208
  } : {}
1183
1209
  };
1184
1210
  if (error) {
@@ -1693,6 +1719,11 @@ const normalizePageInfo = (value) => {
1693
1719
  } : {}
1694
1720
  };
1695
1721
  };
1722
+ const normalizeTotalCount = (value) => {
1723
+ if (typeof value !== "number") return void 0;
1724
+ if (!Number.isFinite(value) || value < 0) return void 0;
1725
+ return Math.floor(value);
1726
+ };
1696
1727
  const getDocId = (doc) => {
1697
1728
  if (!doc || typeof doc !== "object") return "";
1698
1729
  const id = doc._id;
@@ -1772,9 +1803,11 @@ const useQuery = (modelName, query = {}, options = {}) => {
1772
1803
  }
1773
1804
  const seedDataRaw = useMemo(() => enabled && ssrEnabled ? ssrRuntime ? ssrRuntime.getQueryData(modelName, queryKey) : peekHydratedRtsQueryData(modelName, queryKey) : void 0, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey]);
1774
1805
  const seedPageInfoRaw = useMemo(() => enabled && ssrEnabled ? ssrRuntime ? ssrRuntime.getQueryPageInfo(modelName, queryKey) : peekHydratedRtsQueryPageInfo(modelName, queryKey) : void 0, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey]);
1806
+ const seedTotalCountRaw = useMemo(() => enabled && ssrEnabled ? ssrRuntime ? ssrRuntime.getQueryTotalCount(modelName, queryKey) : peekHydratedRtsQueryTotalCount(modelName, queryKey) : void 0, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey]);
1775
1807
  const hasSeedData = Array.isArray(seedDataRaw);
1776
1808
  const seedData = hasSeedData ? seedDataRaw : void 0;
1777
1809
  const seedPageInfo = normalizePageInfo(seedPageInfoRaw);
1810
+ const seedTotalCount = normalizeTotalCount(seedTotalCountRaw);
1778
1811
  const seedJson = (() => {
1779
1812
  if (!hasSeedData) return "";
1780
1813
  try {
@@ -1791,6 +1824,7 @@ const useQuery = (modelName, query = {}, options = {}) => {
1791
1824
  return "";
1792
1825
  }
1793
1826
  })();
1827
+ const seedTotalCountStr = seedTotalCount !== void 0 ? String(seedTotalCount) : "";
1794
1828
  const [data, setData] = useState(() => isPaginated ? void 0 : seedData);
1795
1829
  const [headPage, setHeadPage] = useState(() => isPaginated && seedData ? {
1796
1830
  nodes: seedData,
@@ -1798,6 +1832,7 @@ const useQuery = (modelName, query = {}, options = {}) => {
1798
1832
  pageInfo: seedPageInfo
1799
1833
  } : {}
1800
1834
  } : null);
1835
+ const [totalCount, setTotalCount] = useState(() => isPaginated ? seedTotalCount : void 0);
1801
1836
  const [previousPages, setPreviousPages] = useState([]);
1802
1837
  const [nextPages, setNextPages] = useState([]);
1803
1838
  const [source, setSource] = useState(() => hasSeedData ? "cache" : void 0);
@@ -1837,6 +1872,7 @@ const useQuery = (modelName, query = {}, options = {}) => {
1837
1872
  setLoading(false);
1838
1873
  setData(void 0);
1839
1874
  setHeadPage(null);
1875
+ setTotalCount(void 0);
1840
1876
  setSource(void 0);
1841
1877
  return;
1842
1878
  }
@@ -1851,17 +1887,20 @@ const useQuery = (modelName, query = {}, options = {}) => {
1851
1887
  pageInfo: seedPageInfo
1852
1888
  } : {}
1853
1889
  });
1890
+ setTotalCount(seedTotalCount);
1854
1891
  setData(void 0);
1855
1892
  } else {
1856
1893
  setData(nextSeedData);
1894
+ setTotalCount(void 0);
1857
1895
  setHeadPage(null);
1858
1896
  }
1859
1897
  return;
1860
1898
  }
1861
1899
  setData(void 0);
1862
1900
  setHeadPage(null);
1901
+ setTotalCount(void 0);
1863
1902
  setLoading(true);
1864
- }, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey, hasSeedData, seedJson, seedPageInfoJson, isPaginated]);
1903
+ }, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey, hasSeedData, seedJson, seedPageInfoJson, seedTotalCountStr, isPaginated]);
1865
1904
  useEffect(() => {
1866
1905
  if (!enabled) return;
1867
1906
  const runInitialNetworkQuery = refreshOnMount || !hasSeedData;
@@ -1889,9 +1928,11 @@ const useQuery = (modelName, query = {}, options = {}) => {
1889
1928
  }
1890
1929
  hasFirstReply.current = true;
1891
1930
  const networkPageInfo = context.source === "network" ? context.pageInfo : void 0;
1931
+ const networkTotalCount = context.source === "network" ? context.totalCount : void 0;
1892
1932
  const payloadForHash = isPaginated ? {
1893
1933
  result,
1894
- pageInfo: networkPageInfo
1934
+ pageInfo: networkPageInfo,
1935
+ totalCount: networkTotalCount
1895
1936
  } : result;
1896
1937
  let nextJson = "";
1897
1938
  try {
@@ -1913,9 +1954,11 @@ const useQuery = (modelName, query = {}, options = {}) => {
1913
1954
  pageInfo: networkPageInfo
1914
1955
  } : {}
1915
1956
  });
1957
+ setTotalCount((current) => networkTotalCount === void 0 ? current : networkTotalCount);
1916
1958
  return;
1917
1959
  }
1918
1960
  setData(result);
1961
+ setTotalCount(void 0);
1919
1962
  }, {
1920
1963
  runInitialNetworkQuery,
1921
1964
  runInitialLocalQuery
@@ -1985,7 +2028,10 @@ const useQuery = (modelName, query = {}, options = {}) => {
1985
2028
  } : {}
1986
2029
  };
1987
2030
  setSource("network");
1988
- setNextPages((current) => [...current, page]);
2031
+ if (response.context.source === "network" && response.context.totalCount !== void 0) {
2032
+ setTotalCount(response.context.totalCount);
2033
+ }
2034
+ setNextPages((current_0) => [...current_0, page]);
1989
2035
  return true;
1990
2036
  } catch (err_0) {
1991
2037
  setError(err_0);
@@ -2031,7 +2077,10 @@ const useQuery = (modelName, query = {}, options = {}) => {
2031
2077
  } : {}
2032
2078
  };
2033
2079
  setSource("network");
2034
- setPreviousPages((current_0) => [page_0, ...current_0]);
2080
+ if (response_0.context.source === "network" && response_0.context.totalCount !== void 0) {
2081
+ setTotalCount(response_0.context.totalCount);
2082
+ }
2083
+ setPreviousPages((current_1) => [page_0, ...current_1]);
2035
2084
  return true;
2036
2085
  } catch (err_1) {
2037
2086
  setError(err_1);
@@ -2049,13 +2098,14 @@ const useQuery = (modelName, query = {}, options = {}) => {
2049
2098
  return useMemo(() => ({
2050
2099
  data: isPaginated ? mergedPaginatedData : data,
2051
2100
  pageInfo: effectivePageInfo,
2101
+ totalCount: isPaginated ? totalCount : void 0,
2052
2102
  source,
2053
2103
  error,
2054
2104
  loading,
2055
2105
  fetchNext,
2056
2106
  fetchPrevious,
2057
2107
  resetPagination
2058
- }), [data, effectivePageInfo, error, fetchNext, fetchPrevious, isPaginated, loading, mergedPaginatedData, source]);
2108
+ }), [data, effectivePageInfo, error, fetchNext, fetchPrevious, isPaginated, loading, mergedPaginatedData, source, totalCount]);
2059
2109
  };
2060
2110
  export {
2061
2111
  RtsSsrRuntimeProvider as R,
@@ -2081,6 +2131,7 @@ export {
2081
2131
  sendMessage as s,
2082
2132
  peekHydratedRtsQueryPageInfo as t,
2083
2133
  updateDocs as u,
2084
- useQuery as v
2134
+ peekHydratedRtsQueryTotalCount as v,
2135
+ useQuery as w
2085
2136
  };
2086
- //# sourceMappingURL=useQuery-CUjwBdkK.js.map
2137
+ //# sourceMappingURL=useQuery-Q5Bygu9_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery-Q5Bygu9_.js","sources":["../src/rts/ssrHydration.tsx","../src/rts/pouchStore.ts","../src/rts/populateCache.ts","../src/rts/queryKey.ts","../src/rts/wsClient.ts","../src/rts/useQuery.ts"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\"\nimport type { PaginationPageInfo } from \"@rpcbase/api\"\n\nimport type { RtsModelName } from \"./modelTypes\"\nimport type { RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport const STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY = \"__staticRpcbaseRtsHydrationData\"\n\nexport type RtsSsrHydrationQueryData = {\n modelName: RtsModelName\n queryKey: string\n data: unknown[]\n pageInfo?: PaginationPageInfo\n totalCount?: number\n}\n\nexport type StaticRpcbaseRtsHydrationData = {\n v: 1\n tenantId: string | null\n uid: string | null\n queries: RtsSsrHydrationQueryData[]\n}\n\nexport type RtsSsrQueryRegistration = {\n modelName: RtsModelName\n query: JsonObject\n options: RtsQueryOptions\n queryKey: string\n}\n\nexport type RtsSsrRuntime = {\n registerQuery: (query: RtsSsrQueryRegistration) => void\n getQueryData: (modelName: RtsModelName, queryKey: string) => unknown[] | undefined\n getQueryPageInfo: (modelName: RtsModelName, queryKey: string) => PaginationPageInfo | undefined\n getQueryTotalCount: (modelName: RtsModelName, queryKey: string) => number | undefined\n}\n\nconst RtsSsrRuntimeContext = createContext<RtsSsrRuntime | null>(null)\n\nconst hydrationDataStore = new Map<string, unknown[]>()\nconst hydrationPageInfoStore = new Map<string, PaginationPageInfo | undefined>()\nconst hydrationTotalCountStore = new Map<string, number | undefined>()\n\nconst makeStoreKey = (modelName: string, queryKey: string): string => `${modelName}.${queryKey}`\n\nconst normalizeStringOrNull = (value: unknown): string | null => {\n if (typeof value !== \"string\") return null\n const normalized = value.trim()\n return normalized ? normalized : null\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst normalizeTotalCount = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\n}\n\nconst parseHydrationData = (value: unknown): StaticRpcbaseRtsHydrationData | null => {\n if (!value || typeof value !== \"object\") return null\n\n const raw = value as {\n v?: unknown\n tenantId?: unknown\n uid?: unknown\n queries?: unknown\n }\n\n if (raw.v !== 1) return null\n if (!Array.isArray(raw.queries)) return null\n\n const queries: RtsSsrHydrationQueryData[] = []\n for (const entry of raw.queries) {\n if (!entry || typeof entry !== \"object\") continue\n\n const query = entry as {\n modelName?: unknown\n queryKey?: unknown\n data?: unknown\n pageInfo?: unknown\n totalCount?: unknown\n }\n\n const modelName = normalizeStringOrNull(query.modelName)\n const queryKey = normalizeStringOrNull(query.queryKey)\n if (!modelName || !queryKey) continue\n if (!Array.isArray(query.data)) continue\n const pageInfo = normalizePageInfo(query.pageInfo)\n const totalCount = normalizeTotalCount(query.totalCount)\n\n queries.push({\n modelName: modelName as RtsModelName,\n queryKey,\n data: query.data,\n ...(pageInfo ? { pageInfo } : {}),\n ...(totalCount !== undefined ? { totalCount } : {}),\n })\n }\n\n return {\n v: 1,\n tenantId: normalizeStringOrNull(raw.tenantId),\n uid: normalizeStringOrNull(raw.uid),\n queries,\n }\n}\n\nexport const hydrateRtsFromWindow = (): void => {\n if (typeof window === \"undefined\") return\n\n const browserWindow = window as unknown as Record<string, unknown>\n const raw = browserWindow[STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY]\n delete browserWindow[STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY]\n\n const parsed = parseHydrationData(raw)\n if (!parsed) return\n\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n hydrationTotalCountStore.clear()\n for (const query of parsed.queries) {\n hydrationDataStore.set(makeStoreKey(query.modelName, query.queryKey), query.data)\n hydrationPageInfoStore.set(makeStoreKey(query.modelName, query.queryKey), query.pageInfo)\n hydrationTotalCountStore.set(makeStoreKey(query.modelName, query.queryKey), query.totalCount)\n }\n}\n\nexport const peekHydratedRtsQueryData = (\n modelName: RtsModelName,\n queryKey: string,\n): unknown[] | undefined => {\n return hydrationDataStore.get(makeStoreKey(modelName, queryKey))\n}\n\nexport const peekHydratedRtsQueryPageInfo = (\n modelName: RtsModelName,\n queryKey: string,\n): PaginationPageInfo | undefined => {\n return hydrationPageInfoStore.get(makeStoreKey(modelName, queryKey))\n}\n\nexport const peekHydratedRtsQueryTotalCount = (\n modelName: RtsModelName,\n queryKey: string,\n): number | undefined => {\n return hydrationTotalCountStore.get(makeStoreKey(modelName, queryKey))\n}\n\nexport const consumeHydratedRtsQueryData = (\n modelName: RtsModelName,\n queryKey: string,\n): void => {\n const key = makeStoreKey(modelName, queryKey)\n hydrationDataStore.delete(key)\n hydrationPageInfoStore.delete(key)\n hydrationTotalCountStore.delete(key)\n}\n\nexport const clearHydratedRtsQueryData = (): void => {\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n hydrationTotalCountStore.clear()\n}\n\nexport const RtsSsrRuntimeProvider = ({\n value,\n children,\n}: {\n value: RtsSsrRuntime\n children: ReactNode\n}) => {\n return (\n <RtsSsrRuntimeContext.Provider value={value}>\n {children}\n </RtsSsrRuntimeContext.Provider>\n )\n}\n\nexport const useRtsSsrRuntime = (): RtsSsrRuntime | null => {\n return useContext(RtsSsrRuntimeContext)\n}\n","import type { PreparedPopulateEntry, ProjectionSpec } from \"./populateCache\"\n\n\ntype PouchDbStatic = {\n plugin: (plugin: unknown) => void\n prefix?: string\n defaults?: (options: Record<string, unknown>) => PouchDbStatic\n new (name: string, options?: Record<string, unknown>): PouchDbDatabase\n}\n\ntype PouchDbDatabase = {\n find: (options: Record<string, unknown>) => Promise<{ docs: Record<string, unknown>[] }>\n bulkDocs: (docs: Record<string, unknown>[]) => Promise<unknown>\n destroy: () => Promise<unknown>\n}\n\nexport type RtsPouchStoreConfig = {\n tenantId: string\n appName?: string\n prefix?: string\n}\n\nexport type RtsPouchQueryOptions = {\n uid: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n}\n\nexport type RtsPouchQueryContext = {\n source: \"cache\"\n}\n\nconst UNDERSCORE_PREFIX = \"$_\"\nconst DEFAULT_FIND_LIMIT = 4096\n\nlet storeConfig: RtsPouchStoreConfig | null = null\n\nlet pouchDbPromise: Promise<PouchDbStatic> | null = null\nlet lastAppliedPrefix: string | null = null\n\nconst collections = new Map<string, PouchDbDatabase>()\nconst dbNamesByPrefix = new Map<string, Set<string>>()\n\nconst unwrapDefault = (mod: unknown): unknown => {\n if (!mod || typeof mod !== \"object\") return mod\n const maybe = mod as { default?: unknown }\n return maybe.default ?? mod\n}\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS PouchDB store can only be used in the browser\")\n }\n}\n\nconst computeBasePrefix = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n let prefix = \"rb/\"\n if (appName) prefix += `${appName}/`\n prefix += `${tenantId}/`\n return prefix\n}\n\nconst getDbNamesKey = (prefix: string): string => `rb:rts:pouchDbs:${prefix}`\n\nconst getPrefixOverrideKey = ({ tenantId, appName }: { tenantId: string; appName?: string }): string =>\n `rb:rts:pouchPrefix:${appName ?? \"\"}:${tenantId}`\n\nconst readPrefixOverride = ({ tenantId, appName }: { tenantId: string; appName?: string }): string | null => {\n try {\n const value = window.localStorage.getItem(getPrefixOverrideKey({ tenantId, appName }))\n if (!value) return null\n if (!value.endsWith(\"/\")) return `${value}/`\n return value\n } catch {\n return null\n }\n}\n\nconst getPrefix = (): string => {\n if (!storeConfig) {\n throw new Error(\"RTS PouchDB store is not configured\")\n }\n\n if (storeConfig.prefix) return storeConfig.prefix\n\n const basePrefix = computeBasePrefix({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n const override = readPrefixOverride({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n return override ?? basePrefix\n}\n\nconst loadDbNames = (prefix: string): Set<string> => {\n const existing = dbNamesByPrefix.get(prefix)\n if (existing) return existing\n\n const names = new Set<string>()\n try {\n const raw = window.localStorage.getItem(getDbNamesKey(prefix))\n if (raw) {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed)) {\n for (const value of parsed) {\n if (typeof value === \"string\" && value) names.add(value)\n }\n }\n }\n } catch {\n return names\n }\n\n dbNamesByPrefix.set(prefix, names)\n return names\n}\n\nconst persistDbNames = (prefix: string, names: Set<string>): void => {\n try {\n if (!names.size) {\n window.localStorage.removeItem(getDbNamesKey(prefix))\n dbNamesByPrefix.delete(prefix)\n return\n }\n\n window.localStorage.setItem(getDbNamesKey(prefix), JSON.stringify(Array.from(names)))\n dbNamesByPrefix.set(prefix, names)\n } catch {\n return\n }\n}\n\nconst registerDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (names.has(dbName)) return\n names.add(dbName)\n persistDbNames(prefix, names)\n}\n\nconst unregisterDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (!names.delete(dbName)) return\n persistDbNames(prefix, names)\n}\n\nconst getPouchDb = async (): Promise<PouchDbStatic> => {\n ensureBrowser()\n\n if (!pouchDbPromise) {\n pouchDbPromise = (async () => {\n const [core, indexedDbAdapter, findPlugin] = await Promise.all([\n import(\"pouchdb-core\"),\n import(\"pouchdb-adapter-indexeddb\"),\n import(\"pouchdb-find\"),\n ])\n\n const PouchDB = unwrapDefault(core) as PouchDbStatic\n PouchDB.plugin(unwrapDefault(indexedDbAdapter))\n PouchDB.plugin(unwrapDefault(findPlugin))\n\n return PouchDB\n })()\n }\n\n return pouchDbPromise\n}\n\nconst applyPrefix = (PouchDB: PouchDbStatic) => {\n const prefix = getPrefix()\n if (prefix === lastAppliedPrefix) return\n PouchDB.prefix = prefix\n lastAppliedPrefix = prefix\n}\n\nexport const configureRtsPouchStore = (config: RtsPouchStoreConfig | null) => {\n storeConfig = config\n lastAppliedPrefix = null\n collections.clear()\n}\n\nexport const getCollection = async (modelName: string, options: { uid: string }): Promise<PouchDbDatabase> => {\n const PouchDB = await getPouchDb()\n applyPrefix(PouchDB)\n\n const prefix = getPrefix()\n const dbName = `${options.uid}/${modelName}`\n const dbKey = `${prefix}${dbName}`\n\n const existing = collections.get(dbKey)\n if (existing) return existing\n\n registerDbName(prefix, dbName)\n const db = new PouchDB(dbName, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n collections.set(dbKey, db)\n return db\n}\n\nconst replaceQueryKeys = (value: unknown, replaceKey: (key: string) => string): unknown => {\n if (typeof value !== \"object\" || value === null) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => replaceQueryKeys(item, replaceKey))\n }\n\n const obj = value as Record<string, unknown>\n const next: Record<string, unknown> = Object.create(Object.getPrototypeOf(obj))\n\n for (const key of Object.keys(obj)) {\n if (/^\\$/.test(key) || /\\.\\d+$/.test(key)) {\n throw new Error(`replaceQueryKeys: Unexpected key format: ${key}`)\n }\n\n const newKey = replaceKey(key)\n next[newKey] = replaceQueryKeys(obj[key], replaceKey)\n }\n\n return next\n}\n\nconst getKeys = (obj: Record<string, unknown>, parentKey = \"\"): string[] => {\n const keys: string[] = []\n\n for (const key of Object.keys(obj)) {\n const nextKey = parentKey ? `${parentKey}.${key}` : key\n const value = obj[key]\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n keys.push(...getKeys(value as Record<string, unknown>, nextKey))\n } else {\n keys.push(nextKey)\n }\n }\n\n return keys\n}\n\nconst satisfiesProjection = (doc: Record<string, unknown>, projection: Record<string, 0 | 1>): boolean => {\n const docKeys = new Set(getKeys(doc))\n const projectionKeys = new Set(Object.keys(projection).filter((key) => projection[key] === 1))\n\n if (!projectionKeys.has(\"_id\")) {\n docKeys.delete(\"_id\")\n }\n\n if (projectionKeys.size > docKeys.size) return false\n for (const key of projectionKeys) {\n if (!docKeys.has(key)) return false\n }\n return true\n}\n\nconst getValueAtPath = (doc: Record<string, unknown>, path: string): unknown => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return undefined\n\n let current: unknown = doc\n for (const part of parts) {\n if (!current || typeof current !== \"object\" || Array.isArray(current)) return undefined\n current = (current as Record<string, unknown>)[part]\n }\n return current\n}\n\nconst setValueAtPath = (doc: Record<string, unknown>, path: string, value: unknown): void => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return\n\n let current: Record<string, unknown> = doc\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i]!\n const existing = current[key]\n if (!existing || typeof existing !== \"object\" || Array.isArray(existing)) {\n current[key] = {}\n }\n current = current[key] as Record<string, unknown>\n }\n\n current[parts[parts.length - 1]!] = value\n}\n\nconst unsetValueAtPath = (doc: Record<string, unknown>, path: string): void => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return\n\n let current: Record<string, unknown> = doc\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i]!\n const next = current[key]\n if (!next || typeof next !== \"object\" || Array.isArray(next)) return\n current = next as Record<string, unknown>\n }\n\n delete current[parts[parts.length - 1]!]\n}\n\nconst cloneDoc = <T extends Record<string, unknown>>(doc: T): T => {\n try {\n return structuredClone(doc)\n } catch {\n return JSON.parse(JSON.stringify(doc)) as T\n }\n}\n\nconst toProjectionSpec = (projection: Record<string, 0 | 1>): ProjectionSpec => {\n const spec: ProjectionSpec = {}\n for (const [key, value] of Object.entries(projection)) {\n const path = key.trim()\n if (!path) continue\n if (value === 1 || value === 0) {\n spec[path] = value\n }\n }\n return spec\n}\n\nconst applyProjection = <T extends Record<string, unknown>>(\n doc: T,\n projection: Record<string, 0 | 1>,\n): T => {\n const spec = toProjectionSpec(projection)\n const includeKeys = Object.keys(spec).filter((key) => spec[key] === 1)\n const excludeKeys = Object.keys(spec).filter((key) => spec[key] === 0)\n\n if (includeKeys.length > 0) {\n const projected: Record<string, unknown> = {}\n for (const key of includeKeys) {\n const value = getValueAtPath(doc, key)\n if (value !== undefined) setValueAtPath(projected, key, value)\n }\n\n if (spec._id !== 0 && Object.hasOwn(doc, \"_id\")) {\n projected._id = doc._id\n }\n\n return projected as T\n }\n\n const projected = cloneDoc(doc)\n for (const key of excludeKeys) {\n unsetValueAtPath(projected, key)\n }\n return projected\n}\n\nconst compareSort = (\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n sort: Record<string, 1 | -1>,\n): number => {\n for (const key of Object.keys(sort)) {\n const dir = sort[key]\n const aVal = getValueAtPath(a, key)\n const bVal = getValueAtPath(b, key)\n\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n\n if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n }\n return 0\n}\n\nconst extractDocId = (value: unknown): string => {\n if (typeof value === \"string\") return value\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return \"\"\n const id = (value as { _id?: unknown })._id\n return typeof id === \"string\" ? id : \"\"\n}\n\nconst matchValue = (docValue: unknown, matchValueRaw: unknown): boolean | null => {\n if (Array.isArray(matchValueRaw)) {\n if (!Array.isArray(docValue)) return false\n if (docValue.length !== matchValueRaw.length) return false\n for (let i = 0; i < matchValueRaw.length; i += 1) {\n const matched = matchValue(docValue[i], matchValueRaw[i])\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n }\n\n if (matchValueRaw && typeof matchValueRaw === \"object\") {\n const matchObj = matchValueRaw as Record<string, unknown>\n if (Object.keys(matchObj).some((key) => key.startsWith(\"$\"))) return null\n if (!docValue || typeof docValue !== \"object\" || Array.isArray(docValue)) return false\n const docObj = docValue as Record<string, unknown>\n for (const key of Object.keys(matchObj)) {\n const matched = matchValue(docObj[key], matchObj[key])\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n }\n\n return Object.is(docValue, matchValueRaw)\n}\n\nconst matchesSimpleQuery = (doc: Record<string, unknown>, query: Record<string, unknown>): boolean | null => {\n for (const [key, expected] of Object.entries(query)) {\n if (key.startsWith(\"$\")) return null\n const actual = getValueAtPath(doc, key)\n const matched = matchValue(actual, expected)\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n}\n\nconst remapDocFromStorage = (doc: Record<string, unknown>): Record<string, unknown> => {\n const next: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(doc)) {\n const newKey = key.startsWith(UNDERSCORE_PREFIX) ? key.replace(/^\\$_/, \"\") : key\n next[newKey] = value\n }\n\n return next\n}\n\nconst runQueryInternal = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n strictProjection = false,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n strictProjection?: boolean\n}): Promise<{ data: T[]; context: RtsPouchQueryContext; projectionMismatch: boolean }> => {\n const collection = await getCollection(modelName, { uid: options.uid })\n\n const replacedQuery = replaceQueryKeys(query, (key) =>\n key.startsWith(\"_\") && key !== \"_id\" ? `${UNDERSCORE_PREFIX}${key}` : key,\n ) as Record<string, unknown>\n\n const limit = typeof options.limit === \"number\" ? Math.abs(options.limit) : DEFAULT_FIND_LIMIT\n\n const { docs } = await collection.find({\n selector: replacedQuery,\n limit,\n })\n\n const mappedDocs = docs.map(({ _rev: _revIgnored, ...rest }) => remapDocFromStorage(rest) as T)\n let filteredDocs = mappedDocs\n\n if (options.projection) {\n if (strictProjection && mappedDocs.some((entry) => !satisfiesProjection(entry, options.projection!))) {\n return {\n data: [],\n context: { source: \"cache\" },\n projectionMismatch: true,\n }\n }\n\n filteredDocs = filteredDocs.filter((entry) => satisfiesProjection(entry, options.projection!))\n }\n\n let result: T[] = filteredDocs\n\n if (options.sort) {\n result = result.sort((a, b) => compareSort(a, b, options.sort!))\n }\n\n return { data: result, context: { source: \"cache\" }, projectionMismatch: false }\n}\n\nexport const runQuery = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n}): Promise<{ data: T[]; context: RtsPouchQueryContext }> => {\n const result = await runQueryInternal<T>({ modelName, query, options })\n return { data: result.data, context: result.context }\n}\n\nconst addWriteDoc = (\n writes: Map<string, Map<string, Record<string, unknown> & { _id: string }>>,\n modelName: string,\n doc: Record<string, unknown> & { _id: string },\n): void => {\n const docsById = writes.get(modelName) ?? new Map()\n docsById.set(doc._id, doc)\n writes.set(modelName, docsById)\n}\n\nconst sanitizePopulatedDoc = (\n doc: Record<string, unknown> & { _id: string },\n populate: PreparedPopulateEntry[],\n writes: Map<string, Map<string, Record<string, unknown> & { _id: string }>>,\n): Record<string, unknown> & { _id: string } => {\n const next = cloneDoc(doc)\n\n for (const entry of populate) {\n const value = getValueAtPath(next, entry.path)\n if (value === undefined) continue\n\n if (Array.isArray(value)) {\n const ids: string[] = []\n for (const candidate of value) {\n const id = extractDocId(candidate)\n if (!id) continue\n ids.push(id)\n\n if (!entry.model) continue\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue\n\n const candidateDoc = candidate as Record<string, unknown> & { _id: string }\n const nested = entry.populate?.length ? sanitizePopulatedDoc(candidateDoc, entry.populate, writes) : cloneDoc(candidateDoc)\n addWriteDoc(writes, entry.model, nested)\n }\n\n setValueAtPath(next, entry.path, ids)\n continue\n }\n\n const id = extractDocId(value)\n setValueAtPath(next, entry.path, id || null)\n if (!id) continue\n if (!entry.model) continue\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue\n\n const valueDoc = value as Record<string, unknown> & { _id: string }\n const nested = entry.populate?.length ? sanitizePopulatedDoc(valueDoc, entry.populate, writes) : cloneDoc(valueDoc)\n addWriteDoc(writes, entry.model, nested)\n }\n\n return next\n}\n\nexport const updatePopulatedDocs = async ({\n modelName,\n data,\n uid,\n populate,\n}: {\n modelName: string\n data: Array<Record<string, unknown> & { _id: string }>\n uid: string\n populate: PreparedPopulateEntry[]\n}): Promise<void> => {\n if (!data.length) return\n\n const writes = new Map<string, Map<string, Record<string, unknown> & { _id: string }>>()\n const roots = data.map((doc) => sanitizePopulatedDoc(doc, populate, writes))\n await updateDocs(modelName, roots, uid)\n\n for (const [targetModelName, docsById] of writes.entries()) {\n if (!docsById.size) continue\n await updateDocs(\n targetModelName,\n Array.from(docsById.values()),\n uid,\n )\n }\n}\n\nconst loadProjectedDocsByIds = async ({\n modelName,\n ids,\n uid,\n projection,\n}: {\n modelName: string\n ids: string[]\n uid: string\n projection: ProjectionSpec\n}): Promise<{\n rawDocsById: Map<string, Record<string, unknown>>\n projectedDocsById: Map<string, Record<string, unknown>>\n projectionMismatch: boolean\n}> => {\n const uniqueIds = Array.from(new Set(ids.filter(Boolean)))\n if (!uniqueIds.length) {\n return { rawDocsById: new Map(), projectedDocsById: new Map(), projectionMismatch: false }\n }\n\n const collection = await getCollection(modelName, { uid })\n const { docs } = await collection.find({\n selector: { _id: { $in: uniqueIds } },\n limit: uniqueIds.length,\n })\n\n const rawDocsById = new Map<string, Record<string, unknown>>()\n const projectedDocsById = new Map<string, Record<string, unknown>>()\n let projectionMismatch = false\n\n for (const rawDoc of docs) {\n const id = typeof rawDoc._id === \"string\" ? rawDoc._id : \"\"\n if (!id) continue\n\n const { _rev: _revIgnored, ...rest } = rawDoc\n const remapped = remapDocFromStorage(rest)\n if (!satisfiesProjection(remapped, projection)) {\n projectionMismatch = true\n continue\n }\n\n rawDocsById.set(id, remapped)\n projectedDocsById.set(id, applyProjection(remapped, projection))\n }\n\n if (projectedDocsById.size < uniqueIds.length) {\n projectionMismatch = true\n }\n\n return { rawDocsById, projectedDocsById, projectionMismatch }\n}\n\nconst hydratePopulateEntries = async ({\n docs,\n populate,\n uid,\n}: {\n docs: Array<Record<string, unknown>>\n populate: PreparedPopulateEntry[]\n uid: string\n}): Promise<{ hit: boolean; data: Array<Record<string, unknown>> }> => {\n const currentDocs = docs\n\n for (const entry of populate) {\n if (!entry.model) {\n return { hit: false, data: [] }\n }\n\n const descriptors = currentDocs.map((doc) => {\n const rawValue = getValueAtPath(doc, entry.path)\n const isArray = Array.isArray(rawValue)\n const ids = (isArray ? rawValue : [rawValue])\n .map((candidate) => extractDocId(candidate))\n .filter(Boolean)\n\n return {\n doc,\n hasValue: rawValue !== undefined,\n isArray,\n ids,\n }\n })\n\n const allIds = descriptors.flatMap((descriptor) => descriptor.ids)\n const loaded = await loadProjectedDocsByIds({\n modelName: entry.model,\n ids: allIds,\n uid,\n projection: entry.select,\n })\n\n if (loaded.projectionMismatch) {\n return { hit: false, data: [] }\n }\n\n let populatedDocsById = loaded.projectedDocsById\n\n if (entry.match) {\n const filtered = new Map<string, Record<string, unknown>>()\n for (const [id, candidate] of loaded.rawDocsById.entries()) {\n const matched = matchesSimpleQuery(candidate, entry.match)\n if (matched === null) return { hit: false, data: [] }\n if (!matched) continue\n const projected = populatedDocsById.get(id)\n if (projected) filtered.set(id, projected)\n }\n populatedDocsById = filtered\n }\n\n if (entry.populate?.length) {\n const nestedResult = await hydratePopulateEntries({\n docs: Array.from(populatedDocsById.values()).map((candidate) => cloneDoc(candidate)),\n populate: entry.populate,\n uid,\n })\n if (!nestedResult.hit) {\n return { hit: false, data: [] }\n }\n\n populatedDocsById = nestedResult.data.reduce((acc, candidate) => {\n const id = extractDocId(candidate)\n if (id) acc.set(id, candidate)\n return acc\n }, new Map<string, Record<string, unknown>>())\n }\n\n for (const descriptor of descriptors) {\n if (!descriptor.hasValue) continue\n\n if (!descriptor.ids.length) {\n setValueAtPath(descriptor.doc, entry.path, descriptor.isArray ? [] : null)\n continue\n }\n\n if (descriptor.isArray) {\n let values = descriptor.ids\n .map((id) => populatedDocsById.get(id))\n .filter((candidate): candidate is Record<string, unknown> => Boolean(candidate))\n\n if (entry.options?.sort) {\n values = values.sort((a, b) => compareSort(a, b, entry.options!.sort!))\n }\n\n if (typeof entry.options?.limit === \"number\" && Number.isFinite(entry.options.limit)) {\n values = values.slice(0, Math.max(0, Math.floor(Math.abs(entry.options.limit))))\n }\n\n setValueAtPath(descriptor.doc, entry.path, values)\n continue\n }\n\n const value = populatedDocsById.get(descriptor.ids[0]!)\n setValueAtPath(descriptor.doc, entry.path, value ?? null)\n }\n }\n\n return { hit: true, data: currentDocs }\n}\n\nexport const runPopulatedQuery = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions & {\n projection: ProjectionSpec\n populate: PreparedPopulateEntry[]\n }\n}): Promise<{ hit: boolean; data: T[]; context: RtsPouchQueryContext }> => {\n const rootResult = await runQueryInternal<Record<string, unknown>>({\n modelName,\n query,\n options: {\n uid: options.uid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n strictProjection: true,\n })\n\n if (rootResult.projectionMismatch) {\n return {\n hit: false,\n data: [],\n context: rootResult.context,\n }\n }\n\n const projectedRoots = rootResult.data.map((doc) => applyProjection(doc, options.projection))\n const hydrated = await hydratePopulateEntries({\n docs: projectedRoots.map((doc) => cloneDoc(doc)),\n populate: options.populate,\n uid: options.uid,\n })\n\n if (!hydrated.hit) {\n return {\n hit: false,\n data: [],\n context: rootResult.context,\n }\n }\n\n return {\n hit: true,\n data: hydrated.data as T[],\n context: rootResult.context,\n }\n}\n\nexport const updateDocs = async (\n modelName: string,\n data: Array<Record<string, unknown> & { _id: string }>,\n uid: string,\n): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = data.map((doc) => doc._id).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const currentDocsById = currentDocs.reduce<Record<string, Record<string, unknown>>>((acc, doc) => {\n const id = String(doc._id ?? \"\")\n if (id) acc[id] = doc\n return acc\n }, {})\n\n const newDocs = data.map((mongoDoc) => {\n const currentDoc = currentDocsById[mongoDoc._id] ?? { _id: mongoDoc._id }\n const nextDoc = Object.entries(mongoDoc).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const newKey = key !== \"_id\" && key.startsWith(\"_\") ? `${UNDERSCORE_PREFIX}${key}` : key\n acc[newKey] = value\n return acc\n }, { ...currentDoc })\n\n const rev = currentDoc._rev\n if (typeof rev === \"string\" && rev) {\n nextDoc._rev = rev\n } else {\n delete nextDoc._rev\n }\n\n return nextDoc\n })\n\n await collection.bulkDocs(newDocs)\n}\n\nexport const deleteDocs = async (modelName: string, ids: string[], uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = ids.map((id) => String(id ?? \"\")).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const deletions = currentDocs\n .map((doc) => ({\n _id: String((doc as { _id?: unknown })?._id ?? \"\"),\n _rev: (doc as { _rev?: unknown })?._rev,\n _deleted: true,\n }))\n .filter((doc) => doc._id && typeof doc._rev === \"string\" && doc._rev)\n\n if (!deletions.length) return\n await collection.bulkDocs(deletions)\n}\n\nexport const destroyCollection = async (modelName: string, uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n const prefix = getPrefix()\n const dbName = `${uid}/${modelName}`\n collections.delete(`${prefix}${dbName}`)\n unregisterDbName(prefix, dbName)\n await collection.destroy()\n}\n\nexport const resetRtsPouchStore = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n ensureBrowser()\n const basePrefix = computeBasePrefix({ tenantId, appName })\n const oldPrefix = readPrefixOverride({ tenantId, appName }) ?? basePrefix\n const dbNames = Array.from(loadDbNames(oldPrefix))\n const openDbs = Array.from(collections.entries())\n .filter(([key]) => key.startsWith(oldPrefix))\n .map(([, db]) => db)\n\n void (async () => {\n const remaining = new Set(dbNames)\n\n await Promise.all(openDbs.map((db) => db.destroy().catch(() => {})))\n\n if (remaining.size) {\n const PouchDB = await getPouchDb()\n const PouchDBForPrefix = (PouchDB.defaults?.({}) ?? PouchDB) as PouchDbStatic\n PouchDBForPrefix.prefix = oldPrefix\n\n await Promise.all(Array.from(remaining).map(async (name) => {\n const db = new PouchDBForPrefix(name, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n await db.destroy().then(() => {\n remaining.delete(name)\n }).catch(() => {})\n }))\n }\n\n if (remaining.size) {\n persistDbNames(oldPrefix, remaining)\n } else {\n persistDbNames(oldPrefix, new Set())\n }\n })()\n\n const newPrefix = `${basePrefix}reset-${Date.now().toString(16)}/`\n try {\n window.localStorage.setItem(getPrefixOverrideKey({ tenantId, appName }), newPrefix)\n } catch {\n return newPrefix\n }\n\n lastAppliedPrefix = null\n collections.clear()\n return newPrefix\n}\n\nexport const destroyAllCollections = async (): Promise<void> => {\n const dbs = Array.from(collections.values())\n await Promise.all(dbs.map((db) => db.destroy()))\n collections.clear()\n}\n","import type { RtsPopulateObject, RtsPopulateOption, RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type ProjectionSpec = Record<string, 0 | 1>\nconst EXCLUDE_PROJECTION_ERROR = \"must be include-only (value 1); exclusion projection is not supported\"\n\nexport type PreparedPopulateEntry = {\n path: string\n model?: string\n select: ProjectionSpec\n match?: JsonObject\n options?: {\n sort?: Record<string, 1 | -1>\n limit?: number\n }\n populate?: PreparedPopulateEntry[]\n}\n\nexport type PreparedPopulateCacheOptions = {\n rootProjection: ProjectionSpec\n populate: PreparedPopulateEntry[]\n}\n\nconst sortProjectionSpec = (projection: ProjectionSpec): ProjectionSpec => {\n const sorted: ProjectionSpec = {}\n for (const key of Object.keys(projection).sort()) {\n sorted[key] = projection[key]\n }\n return sorted\n}\n\nconst normalizeProjectionSpec = (\n value: unknown,\n source: string,\n label: string,\n): ProjectionSpec | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const raw = value as Record<string, unknown>\n const normalized: ProjectionSpec = {}\n let hasExclude = false\n\n for (const [key, rawValue] of Object.entries(raw)) {\n const path = key.trim()\n if (!path) continue\n if (rawValue === 1 || rawValue === true) {\n normalized[path] = 1\n continue\n }\n if (rawValue === 0 || rawValue === false) {\n hasExclude = true\n continue\n }\n if (typeof rawValue === \"number\" && Number.isFinite(rawValue)) {\n if (rawValue === 1) normalized[path] = 1\n if (rawValue === 0) hasExclude = true\n }\n }\n\n if (hasExclude) {\n throw new Error(`${source}: ${label} ${EXCLUDE_PROJECTION_ERROR}`)\n }\n\n return Object.keys(normalized).length > 0 ? sortProjectionSpec(normalized) : undefined\n}\n\nconst normalizeSelectString = (value: string, source: string): ProjectionSpec | undefined => {\n const tokens = value\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter(Boolean)\n\n if (!tokens.length) return undefined\n const normalized: ProjectionSpec = {}\n\n for (const token of tokens) {\n let path = token\n\n if (token.startsWith(\"-\")) {\n throw new Error(`${source}: populate select ${EXCLUDE_PROJECTION_ERROR}`)\n } else if (token.startsWith(\"+\")) {\n path = token.slice(1)\n }\n\n path = path.trim()\n if (!path) continue\n normalized[path] = 1\n }\n\n return Object.keys(normalized).length > 0 ? sortProjectionSpec(normalized) : undefined\n}\n\nconst normalizePopulateSelect = (value: unknown, source: string): ProjectionSpec | undefined => {\n if (typeof value === \"string\") {\n return normalizeSelectString(value, source)\n }\n return normalizeProjectionSpec(value, source, \"populate select\")\n}\n\nconst normalizePopulateOptions = (value: unknown): PreparedPopulateEntry[\"options\"] | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const raw = value as Record<string, unknown>\n const normalized: PreparedPopulateEntry[\"options\"] = {}\n\n if (raw.sort && typeof raw.sort === \"object\" && !Array.isArray(raw.sort)) {\n const sortRaw = raw.sort as Record<string, unknown>\n const sort: Record<string, 1 | -1> = {}\n\n for (const [key, rawDirection] of Object.entries(sortRaw)) {\n const path = key.trim()\n if (!path) continue\n if (rawDirection === 1 || rawDirection === \"asc\") {\n sort[path] = 1\n continue\n }\n if (rawDirection === -1 || rawDirection === \"desc\") {\n sort[path] = -1\n }\n }\n\n if (Object.keys(sort).length > 0) {\n normalized.sort = sort\n }\n }\n\n if (typeof raw.limit === \"number\" && Number.isFinite(raw.limit)) {\n normalized.limit = Math.max(0, Math.floor(Math.abs(raw.limit)))\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\nconst normalizeString = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") return undefined\n const normalized = value.trim()\n return normalized || undefined\n}\n\nconst normalizeObject = (value: unknown): JsonObject | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n return value as JsonObject\n}\n\nconst normalizePopulateObject = (\n value: RtsPopulateObject,\n source: string,\n): PreparedPopulateEntry => {\n const path = normalizeString(value.path)\n if (!path) {\n throw new Error(`${source}: populate entries must define a non-empty path`)\n }\n\n const select = normalizePopulateSelect(value.select, source)\n if (!select) {\n throw new Error(`${source}: populate entries must define a select projection`)\n }\n\n const nested = value.populate !== undefined\n ? normalizePopulateOption(value.populate, source)\n : undefined\n\n return {\n path,\n select,\n ...(normalizeString(value.model) ? { model: normalizeString(value.model) } : {}),\n ...(normalizeObject(value.match) ? { match: normalizeObject(value.match) } : {}),\n ...(normalizePopulateOptions(value.options) ? { options: normalizePopulateOptions(value.options) } : {}),\n ...(nested && nested.length > 0 ? { populate: nested } : {}),\n }\n}\n\nconst normalizePopulateOption = (\n value: RtsPopulateOption,\n source: string,\n): PreparedPopulateEntry[] => {\n if (typeof value === \"string\") {\n throw new Error(`${source}: populate string syntax is not supported; use object entries with select`)\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n throw new Error(`${source}: populate must contain at least one entry`)\n }\n return value.map((entry) => {\n if (typeof entry === \"string\") {\n throw new Error(`${source}: populate string syntax is not supported; use object entries with select`)\n }\n return normalizePopulateObject(entry, source)\n })\n }\n\n return [normalizePopulateObject(value, source)]\n}\n\nexport const preparePopulateCacheOptions = (\n options: Pick<RtsQueryOptions, \"projection\" | \"populate\">,\n source: string,\n): PreparedPopulateCacheOptions | undefined => {\n if (!options.populate) return undefined\n\n const rootProjection = normalizeProjectionSpec(options.projection, source, \"projection\")\n if (!rootProjection) {\n throw new Error(`${source}: projection is required when populate is used`)\n }\n\n const populate = normalizePopulateOption(options.populate, source)\n if (!populate.length) {\n throw new Error(`${source}: populate must contain at least one entry`)\n }\n\n return {\n rootProjection,\n populate,\n }\n}\n","import type { RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport const computeRtsQueryKey = (query: JsonObject, options: RtsQueryOptions): string => {\n const key = options.key ?? \"\"\n const projection = options.projection ? JSON.stringify(options.projection) : \"\"\n const sort = options.sort ? JSON.stringify(options.sort) : \"\"\n const limit = typeof options.limit === \"number\" ? String(options.limit) : \"\"\n const populate = options.populate ? JSON.stringify(options.populate) : \"\"\n const pagination = options.pagination ? JSON.stringify(options.pagination) : \"\"\n return `${key}${JSON.stringify(query)}${projection}${sort}${limit}${populate}${pagination}`\n}\n","import type { PaginationPageInfo, PaginationSpec } from \"@rpcbase/api\"\n\nimport { preparePopulateCacheOptions } from \"./populateCache\"\nimport type { PreparedPopulateCacheOptions } from \"./populateCache\"\nimport { configureRtsPouchStore, deleteDocs, destroyCollection, resetRtsPouchStore, runPopulatedQuery, runQuery, updateDocs, updatePopulatedDocs } from \"./pouchStore\"\nimport type { RtsModelName } from \"./modelTypes\"\nimport { computeRtsQueryKey } from \"./queryKey\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type RtsPopulateObject = {\n path: string\n model?: string\n select?: string | JsonObject\n match?: JsonObject\n options?: {\n sort?: Record<string, 1 | -1>\n limit?: number\n }\n populate?: RtsPopulateOption\n}\n\nexport type RtsPopulateOption =\n | string\n | RtsPopulateObject\n | Array<string | RtsPopulateObject>\n\nexport type RtsNetworkQueryContext = {\n source: \"network\"\n isLocal: boolean\n txnId?: string\n pageInfo?: PaginationPageInfo\n totalCount?: number\n}\n\nexport type RtsCacheQueryContext = {\n source: \"cache\"\n}\n\nexport type RtsQueryContext = RtsNetworkQueryContext | RtsCacheQueryContext\n\nexport type RtsQueryOptions = {\n key?: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n populate?: RtsPopulateOption\n pagination?: PaginationSpec\n}\n\nexport type RtsConnectOptions = {\n url?: string\n path?: string\n appName?: string\n configureStore?: boolean\n syncChanges?: boolean\n reconnect?: {\n attempts?: number\n delayMs?: number\n delayMaxMs?: number\n }\n}\n\ntype QueryCallback = (error: unknown | null, data: unknown, context: RtsQueryContext) => void\n\ntype QuerySubscription = {\n modelName: RtsModelName\n query: JsonObject\n options: RtsQueryOptions\n queryKey: string\n runInitialNetworkQuery: boolean\n populateCache?: PreparedPopulateCacheOptions\n}\n\ntype ServerMessage =\n | {\n type: \"query-payload\"\n modelName: string\n queryKey: string\n data?: unknown\n error?: string\n txnId?: string\n pageInfo?: unknown\n totalCount?: unknown\n }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype ClientMessage =\n | { type: \"run-query\"; modelName: string; queryKey: string; query: JsonObject; options?: RtsQueryOptions }\n | {\n type: \"register-query\"\n modelName: string\n queryKey: string\n query: JsonObject\n options?: RtsQueryOptions\n runInitialQuery?: boolean\n }\n | { type: \"remove-query\"; modelName: string; queryKey: string }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype DocWithId = Record<string, unknown> & { _id: string }\ntype SyncChangesPayload = {\n ok?: unknown\n latestSeq?: unknown\n needsFullResync?: unknown\n changes?: unknown\n}\ntype RawSyncChangeRecord = {\n seq?: unknown\n modelName?: unknown\n op?: unknown\n docId?: unknown\n}\n\nconst TENANT_ID_QUERY_PARAM = \"rb-tenant-id\"\nconst RTS_CHANGES_ROUTE = \"/api/rb/rts/changes\"\nconst MAX_TXN_BUF = 2048\nconst SERVER_RECONNECT_DELAY_MIN_MS = 10_000\nconst SERVER_RECONNECT_DELAY_MAX_MS = 15_000\nconst RUN_NETWORK_QUERY_TIMEOUT_ERROR = \"runNetworkQuery: request timed out\"\n\nlet socket: WebSocket | null = null\nlet connectPromise: Promise<void> | null = null\nlet explicitDisconnect = false\n\nlet currentTenantId: string | null = null\nlet currentUid: string | null = null\nlet connectOptions: RtsConnectOptions = {}\n\nconst localTxnBuf: string[] = []\n\nconst queryCallbacks = new Map<string, Set<QueryCallback>>()\nconst subscriptions = new Map<string, QuerySubscription>()\nconst messageCallbacks = new Map<string, Set<(payload: unknown) => void>>()\n\nlet reconnectTimer: number | null = null\nlet reconnectAttempts = 0\nlet hasEstablishedConnection = false\nlet pendingServerReconnectJitter = false\n\nlet syncPromise: Promise<void> | null = null\nlet syncKey: string | null = null\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS websocket client can only be used in the browser\")\n }\n}\n\nconst buildSocketUrl = (tenantId: string, _uid: string, options: RtsConnectOptions): string => {\n if (options.url) {\n const url = new URL(options.url)\n url.searchParams.set(TENANT_ID_QUERY_PARAM, tenantId)\n return url.toString()\n }\n\n const base = new URL(window.location.href)\n base.protocol = base.protocol === \"https:\" ? \"wss:\" : \"ws:\"\n base.pathname = options.path ?? \"/rts\"\n base.search = \"\"\n base.hash = \"\"\n base.searchParams.set(TENANT_ID_QUERY_PARAM, tenantId)\n return base.toString()\n}\n\nconst sendToServer = (message: ClientMessage): void => {\n if (!socket) return\n if (socket.readyState !== WebSocket.OPEN) return\n socket.send(JSON.stringify(message))\n}\n\nconst resubscribeAll = ({ forceInitialQuery }: { forceInitialQuery: boolean }): void => {\n for (const sub of subscriptions.values()) {\n const runInitialQuery = forceInitialQuery || sub.runInitialNetworkQuery\n sendToServer({\n type: \"register-query\",\n modelName: sub.modelName,\n queryKey: sub.queryKey,\n query: sub.query,\n options: sub.options,\n runInitialQuery,\n })\n }\n}\n\nconst clearReconnectTimer = () => {\n if (reconnectTimer === null) return\n if (typeof window !== \"undefined\") {\n window.clearTimeout(reconnectTimer)\n }\n reconnectTimer = null\n}\n\nconst scheduleReconnect = () => {\n clearReconnectTimer()\n if (explicitDisconnect) {\n pendingServerReconnectJitter = false\n return\n }\n if (!currentTenantId || !currentUid) return\n\n const cfg = connectOptions.reconnect ?? {}\n const maxAttempts = cfg.attempts ?? 128\n const delayMs = cfg.delayMs ?? 400\n const delayMaxMs = cfg.delayMaxMs ?? 10_000\n\n if (reconnectAttempts >= maxAttempts) return\n\n let delay = Math.min(delayMaxMs, delayMs * Math.pow(2, reconnectAttempts))\n if (pendingServerReconnectJitter) {\n const span = SERVER_RECONNECT_DELAY_MAX_MS - SERVER_RECONNECT_DELAY_MIN_MS\n delay = SERVER_RECONNECT_DELAY_MIN_MS + Math.floor(Math.random() * (span + 1))\n pendingServerReconnectJitter = false\n }\n reconnectAttempts += 1\n reconnectTimer = window.setTimeout(() => {\n void connectInternal(currentTenantId!, currentUid!, connectOptions, { resetReconnectAttempts: false })\n }, delay)\n}\n\nconst isDocWithId = (doc: unknown): doc is DocWithId => {\n if (!doc || typeof doc !== \"object\") return false\n return typeof (doc as { _id?: unknown })._id === \"string\"\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\") return undefined\n if (Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst normalizeTotalCount = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\n}\n\nconst handleQueryPayload = (payload: Extract<ServerMessage, { type: \"query-payload\" }>) => {\n const { modelName, queryKey, data, error, txnId } = payload\n const cbKey = `${modelName}.${queryKey}`\n const callbacks = queryCallbacks.get(cbKey)\n if (!callbacks || !callbacks.size) return\n const subscription = subscriptions.get(cbKey)\n const pageInfo = normalizePageInfo(payload.pageInfo)\n const totalCount = normalizeTotalCount(payload.totalCount)\n const populateCache = subscription?.populateCache\n const hasPopulate = Boolean(populateCache)\n const hasPagination = Boolean(subscription?.options?.pagination || pageInfo || totalCount !== undefined)\n\n const isLocal = !!(txnId && localTxnBuf.includes(txnId))\n const context: RtsNetworkQueryContext = {\n source: \"network\",\n isLocal,\n txnId,\n ...(pageInfo ? { pageInfo } : {}),\n ...(totalCount !== undefined ? { totalCount } : {}),\n }\n\n if (error) {\n for (const cb of callbacks) cb(error, undefined, context)\n return\n }\n\n for (const cb of callbacks) cb(null, data, context)\n\n if (!currentUid) return\n\n const docs = Array.isArray(data) ? data.filter(isDocWithId) : []\n\n if (hasPagination) return\n\n if (!docs.length) return\n\n if (hasPopulate && populateCache) {\n void updatePopulatedDocs({\n modelName,\n data: docs,\n uid: currentUid,\n populate: populateCache.populate,\n }).catch(() => {})\n return\n }\n\n void updateDocs(modelName, docs, currentUid)\n .catch(() => {})\n}\n\nconst handleEvent = (payload: Extract<ServerMessage, { type: \"event\" }>) => {\n const callbacks = messageCallbacks.get(payload.event)\n if (!callbacks || !callbacks.size) return\n for (const cb of callbacks) cb(payload.payload)\n}\n\nconst handleMessage = (event: MessageEvent) => {\n let parsed: unknown\n try {\n parsed = JSON.parse(typeof event.data === \"string\" ? event.data : String(event.data))\n } catch {\n return\n }\n\n if (!parsed || typeof parsed !== \"object\") return\n const message = parsed as ServerMessage\n\n if (message.type === \"query-payload\") {\n handleQueryPayload(message)\n return\n }\n\n if (message.type === \"event\") {\n handleEvent(message)\n }\n}\n\nexport const addLocalTxn = (txnId: string): void => {\n if (!txnId) return\n localTxnBuf.push(txnId)\n if (localTxnBuf.length > MAX_TXN_BUF) {\n localTxnBuf.shift()\n }\n}\n\ntype RtsChangeRecord = {\n seq: number\n modelName: string\n op: \"delete\" | \"reset_model\"\n docId?: string\n}\n\nconst getSyncStorageKey = ({ tenantId, uid, appName }: { tenantId: string; uid: string; appName?: string }): string =>\n `rb:rts:changesSeq:${appName ?? \"\"}:${tenantId}:${uid}`\n\nconst readStoredSeq = (key: string): number => {\n try {\n const raw = window.localStorage.getItem(key)\n const num = raw ? Number(raw) : 0\n return Number.isFinite(num) && num >= 0 ? Math.floor(num) : 0\n } catch {\n return 0\n }\n}\n\nconst writeStoredSeq = (key: string, value: number): void => {\n try {\n window.localStorage.setItem(key, String(Math.max(0, Math.floor(value))))\n } catch {\n return\n }\n}\n\nconst applyChangeBatch = async (changes: RtsChangeRecord[], uid: string): Promise<void> => {\n const resetModels = new Set<string>()\n const deletesByModel = new Map<string, string[]>()\n\n for (const change of changes) {\n const modelName = typeof change.modelName === \"string\" ? change.modelName : \"\"\n if (!modelName) continue\n\n if (change.op === \"reset_model\") {\n resetModels.add(modelName)\n continue\n }\n\n if (change.op === \"delete\") {\n const docId = typeof change.docId === \"string\" ? change.docId : \"\"\n if (!docId) continue\n const existing = deletesByModel.get(modelName) ?? []\n existing.push(docId)\n deletesByModel.set(modelName, existing)\n }\n }\n\n for (const modelName of resetModels) {\n await destroyCollection(modelName, uid).catch(() => {})\n }\n\n for (const [modelName, ids] of deletesByModel.entries()) {\n if (resetModels.has(modelName)) continue\n await deleteDocs(modelName, ids, uid).catch(() => {})\n }\n}\n\nexport const syncRtsChanges = async (tenantId: string, uid: string, options: Pick<RtsConnectOptions, \"appName\"> = {}): Promise<void> => {\n ensureBrowser()\n if (!tenantId || !uid) return\n\n const storageKey = getSyncStorageKey({ tenantId, uid, appName: options.appName })\n let sinceSeq = readStoredSeq(storageKey)\n\n for (let i = 0; i < 32; i += 1) {\n const url = `${RTS_CHANGES_ROUTE}?${TENANT_ID_QUERY_PARAM}=${encodeURIComponent(tenantId)}`\n const response = await fetch(url, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sinceSeq, limit: 2000 }),\n })\n\n if (!response.ok) return\n\n const payload: unknown = await response.json().catch(() => null)\n if (!payload || typeof payload !== \"object\") return\n const payloadObj = payload as SyncChangesPayload\n const ok = payloadObj.ok\n if (ok !== true) return\n\n const latestSeq = Number(payloadObj.latestSeq ?? 0)\n const needsFullResync = Boolean(payloadObj.needsFullResync)\n\n if (needsFullResync) {\n resetRtsPouchStore({ tenantId, appName: options.appName })\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n const changesRaw = payloadObj.changes\n const changes = Array.isArray(changesRaw) ? changesRaw : []\n const normalized = changes\n .map((c): RtsChangeRecord | null => {\n if (!c || typeof c !== \"object\") return null\n const obj = c as RawSyncChangeRecord\n\n const seq = Number(obj.seq ?? 0)\n const modelName = typeof obj.modelName === \"string\" ? obj.modelName : String(obj.modelName ?? \"\")\n const op = obj.op === \"reset_model\" ? \"reset_model\" : \"delete\"\n const docId = typeof obj.docId === \"string\" && obj.docId ? obj.docId : obj.docId ? String(obj.docId) : undefined\n\n return { seq, modelName, op, ...(docId ? { docId } : {}) }\n })\n .filter((c): c is RtsChangeRecord => c !== null)\n .filter((c: RtsChangeRecord) =>\n Number.isFinite(c.seq) && c.seq > 0 && c.modelName && (c.op === \"reset_model\" || !!c.docId),\n )\n\n if (!normalized.length) {\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n await applyChangeBatch(normalized, uid)\n\n const lastSeq = normalized.reduce((max, c) => (c.seq > max ? c.seq : max), sinceSeq)\n sinceSeq = lastSeq\n writeStoredSeq(storageKey, sinceSeq)\n\n if (latestSeq > 0 && sinceSeq >= latestSeq) {\n return\n }\n }\n}\n\nconst ensureSynced = (tenantId: string, uid: string, options: RtsConnectOptions): void => {\n if (options.syncChanges === false) return\n const key = `${options.appName ?? \"\"}:${tenantId}:${uid}`\n if (syncPromise && syncKey === key) return\n\n syncKey = key\n syncPromise = syncRtsChanges(tenantId, uid, { appName: options.appName })\n .catch(() => {})\n .finally(() => {\n if (syncKey === key) {\n syncPromise = null\n }\n })\n}\n\nconst connectInternal = (\n tenantId: string,\n uid: string,\n options: RtsConnectOptions,\n { resetReconnectAttempts }: { resetReconnectAttempts: boolean },\n): Promise<void> => {\n ensureBrowser()\n\n if (!tenantId) return Promise.resolve()\n if (!uid) throw new Error(\"Missing uid\")\n\n currentTenantId = tenantId\n currentUid = uid\n connectOptions = options\n\n if (options.configureStore !== false) {\n configureRtsPouchStore({ tenantId, appName: options.appName })\n }\n ensureSynced(tenantId, uid, options)\n\n if (socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)) {\n return connectPromise ?? Promise.resolve()\n }\n\n explicitDisconnect = false\n clearReconnectTimer()\n\n const url = buildSocketUrl(tenantId, uid, options)\n\n connectPromise = new Promise((resolve, reject) => {\n if (resetReconnectAttempts) reconnectAttempts = 0\n\n let opened = false\n let settled = false\n socket = new WebSocket(url)\n\n socket.addEventListener(\"open\", () => {\n opened = true\n settled = true\n reconnectAttempts = 0\n pendingServerReconnectJitter = false\n const forceInitialQuery = hasEstablishedConnection\n resubscribeAll({ forceInitialQuery })\n hasEstablishedConnection = true\n resolve()\n })\n\n socket.addEventListener(\"message\", handleMessage)\n\n socket.addEventListener(\"close\", (event) => {\n if (!opened && !settled) {\n settled = true\n reject(new Error(`RTS WebSocket closed before opening (code=${event.code})`))\n }\n if (!explicitDisconnect) {\n pendingServerReconnectJitter = opened\n }\n\n socket = null\n connectPromise = null\n scheduleReconnect()\n })\n\n socket.addEventListener(\"error\", (err) => {\n if (settled) return\n settled = true\n reject(err instanceof Error ? err : new Error(\"RTS WebSocket error\"))\n })\n })\n\n return connectPromise\n}\n\nexport const connect = (tenantId: string, uid: string, options: RtsConnectOptions = {}): Promise<void> => {\n return connectInternal(tenantId, uid, options, { resetReconnectAttempts: true })\n}\n\nexport const disconnect = (): void => {\n explicitDisconnect = true\n clearReconnectTimer()\n hasEstablishedConnection = false\n pendingServerReconnectJitter = false\n if (socket) {\n try {\n socket.close()\n } catch {\n // ignore\n }\n }\n socket = null\n connectPromise = null\n}\n\nexport const reconnect = (tenantId: string, uid: string, options: RtsConnectOptions = {}): Promise<void> => {\n explicitDisconnect = true\n clearReconnectTimer()\n pendingServerReconnectJitter = false\n if (socket) {\n try {\n socket.close()\n } catch {\n // ignore\n }\n }\n socket = null\n connectPromise = null\n return connect(tenantId, uid, options)\n}\n\nexport const registerQuery = (\n modelName: RtsModelName,\n query: JsonObject,\n optionsOrCallback?: RtsQueryOptions | QueryCallback,\n callbackMaybe?: QueryCallback,\n behavior?: {\n runInitialNetworkQuery?: boolean\n runInitialLocalQuery?: boolean\n },\n): (() => void) | undefined => {\n let options: RtsQueryOptions\n let callback: QueryCallback | undefined\n\n if (typeof optionsOrCallback === \"function\") {\n options = {}\n callback = optionsOrCallback\n } else {\n options = optionsOrCallback ?? {}\n callback = callbackMaybe\n }\n\n if (!callback) return undefined\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"registerQuery: modelName must be a non-empty string\")\n }\n\n const queryKey = computeRtsQueryKey(query, options)\n const cbKey = `${modelName}.${queryKey}`\n const runInitialNetworkQuery = behavior?.runInitialNetworkQuery !== false\n const runInitialLocalQuery = behavior?.runInitialLocalQuery !== false\n const populateCache = preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"registerQuery\",\n )\n const hasPopulate = Boolean(populateCache)\n const hasPagination = Boolean(options.pagination)\n\n const set = queryCallbacks.get(cbKey) ?? new Set<QueryCallback>()\n set.add(callback)\n queryCallbacks.set(cbKey, set)\n\n subscriptions.set(cbKey, { modelName, query, options, queryKey, runInitialNetworkQuery, ...(populateCache ? { populateCache } : {}) })\n\n if (currentUid && runInitialLocalQuery && !hasPagination) {\n if (hasPopulate && populateCache) {\n void runPopulatedQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: populateCache.rootProjection,\n sort: options.sort,\n limit: options.limit,\n populate: populateCache.populate,\n },\n }).then(({ hit, data, context }) => {\n if (!hit) return\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n } else {\n void runQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n }).then(({ data, context }) => {\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n }\n }\n\n sendToServer({ type: \"register-query\", modelName, queryKey, query, options, runInitialQuery: runInitialNetworkQuery })\n\n return () => {\n sendToServer({ type: \"remove-query\", modelName, queryKey })\n\n const callbacks = queryCallbacks.get(cbKey)\n callbacks?.delete(callback!)\n if (callbacks && callbacks.size === 0) {\n queryCallbacks.delete(cbKey)\n subscriptions.delete(cbKey)\n }\n }\n}\n\nconst makeRunQueryKey = (): string => `run-query.${Date.now().toString(36)}.${Math.random().toString(36).slice(2, 10)}`\n\nexport const runNetworkQuery = async ({\n modelName,\n query,\n options = {},\n timeoutMs = 10_000,\n}: {\n modelName: RtsModelName\n query: JsonObject\n options?: RtsQueryOptions\n timeoutMs?: number\n}): Promise<{ data: unknown; context: RtsQueryContext }> => {\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"runNetworkQuery: modelName must be a non-empty string\")\n }\n preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"runNetworkQuery\",\n )\n\n const hasTimeout = typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0\n const timeoutStartedAt = hasTimeout ? Date.now() : 0\n\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n if (currentTenantId && currentUid) {\n try {\n const connectAttempt = connectInternal(\n currentTenantId,\n currentUid,\n connectOptions,\n { resetReconnectAttempts: false },\n )\n if (hasTimeout) {\n await new Promise<void>((resolve, reject) => {\n const timeoutId = window.setTimeout(() => {\n reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR))\n }, timeoutMs)\n connectAttempt.then(\n () => {\n window.clearTimeout(timeoutId)\n resolve()\n },\n (error) => {\n window.clearTimeout(timeoutId)\n reject(error)\n },\n )\n })\n } else {\n await connectAttempt\n }\n } catch {\n // ignore; fallback to the hard failure below\n }\n }\n }\n\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n if (hasTimeout && Date.now() - timeoutStartedAt >= timeoutMs) {\n throw new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)\n }\n throw new Error(\"runNetworkQuery: RTS socket is not connected\")\n }\n\n const remainingTimeoutMs = hasTimeout ? Math.max(0, timeoutMs - (Date.now() - timeoutStartedAt)) : null\n if (remainingTimeoutMs !== null && remainingTimeoutMs <= 0) {\n throw new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)\n }\n\n const resolvedOptions = options.key ? options : { ...options, key: makeRunQueryKey() }\n const queryKey = computeRtsQueryKey(query, resolvedOptions)\n const cbKey = `${modelName}.${queryKey}`\n\n return await new Promise<{ data: unknown; context: RtsQueryContext }>((resolve, reject) => {\n let settled = false\n let timeoutId: number | null = null\n\n const cleanup = () => {\n const callbacks = queryCallbacks.get(cbKey)\n callbacks?.delete(callback)\n if (callbacks && callbacks.size === 0) queryCallbacks.delete(cbKey)\n if (timeoutId !== null && typeof window !== \"undefined\") {\n window.clearTimeout(timeoutId)\n }\n }\n\n const settle = (next: () => void) => {\n if (settled) return\n settled = true\n cleanup()\n next()\n }\n\n const callback: QueryCallback = (error, data, context) => {\n if (error) {\n settle(() => reject(error))\n return\n }\n settle(() => resolve({ data, context }))\n }\n\n const callbacks = queryCallbacks.get(cbKey) ?? new Set<QueryCallback>()\n callbacks.add(callback)\n queryCallbacks.set(cbKey, callbacks)\n\n if (remainingTimeoutMs !== null) {\n timeoutId = window.setTimeout(() => {\n settle(() => reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)))\n }, remainingTimeoutMs)\n }\n\n sendToServer({ type: \"run-query\", modelName, queryKey, query, options: resolvedOptions })\n })\n}\n\nexport const sendMessage = (event: string, payload?: unknown): void => {\n sendToServer({ type: \"event\", event, payload })\n}\n\nexport const onMessage = (event: string, callback: (payload: unknown) => void): (() => void) => {\n const set = messageCallbacks.get(event) ?? new Set()\n set.add(callback)\n messageCallbacks.set(event, set)\n\n return () => {\n const callbacks = messageCallbacks.get(event)\n callbacks?.delete(callback)\n if (callbacks && callbacks.size === 0) messageCallbacks.delete(event)\n }\n}\n","import { useEffect, useId, useMemo, useRef, useState } from \"react\"\nimport type { PaginationPageInfo } from \"@rpcbase/api\"\n\nimport type { RtsModelName } from \"./modelTypes\"\nimport { preparePopulateCacheOptions } from \"./populateCache\"\nimport { computeRtsQueryKey } from \"./queryKey\"\nimport { consumeHydratedRtsQueryData, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, peekHydratedRtsQueryTotalCount, useRtsSsrRuntime } from \"./ssrHydration\"\nimport type { RtsQueryContext, RtsQueryOptions } from \"./wsClient\"\nimport { registerQuery, runNetworkQuery } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\ntype LoadedPage<T> = {\n nodes: T[]\n pageInfo?: PaginationPageInfo\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\") return undefined\n if (Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst normalizeTotalCount = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\n}\n\nconst getDocId = (doc: unknown): string => {\n if (!doc || typeof doc !== \"object\") return \"\"\n const id = (doc as { _id?: unknown })._id\n return typeof id === \"string\" ? id.trim() : \"\"\n}\n\nconst dedupeById = <T extends Record<string, unknown>>(docs: T[]): T[] => {\n const seen = new Set<string>()\n const merged: T[] = []\n\n for (const doc of docs) {\n const id = getDocId(doc)\n if (id && seen.has(id)) continue\n if (id) seen.add(id)\n merged.push(doc)\n }\n\n return merged\n}\n\nconst flattenLoadedPages = <T extends Record<string, unknown>>(\n previousPages: Array<LoadedPage<T>>,\n headPage: LoadedPage<T> | null,\n nextPages: Array<LoadedPage<T>>,\n): T[] => {\n const merged: T[] = []\n for (const page of previousPages) merged.push(...page.nodes)\n if (headPage) merged.push(...headPage.nodes)\n for (const page of nextPages) merged.push(...page.nodes)\n return dedupeById(merged)\n}\n\nconst assertIncludeOnlyProjection = (\n projection: Record<string, 0 | 1> | undefined,\n): void => {\n if (!projection) return\n\n for (const [path, value] of Object.entries(projection)) {\n if (!path.trim()) continue\n if (value !== 1) {\n throw new Error(\"useQuery: projection must be include-only (value 1); exclusion projection is not supported\")\n }\n }\n}\n\nexport type UseRtsQueryOptions = RtsQueryOptions & {\n enabled?: boolean\n skipLocal?: boolean\n ssr?: \"auto\" | boolean\n refreshOnMount?: boolean\n}\n\nexport type UseRtsQueryResult<T> = {\n data: T[] | undefined\n pageInfo?: PaginationPageInfo\n totalCount?: number\n source: RtsQueryContext[\"source\"] | undefined\n error: unknown | undefined\n loading: boolean\n fetchNext: () => Promise<boolean>\n fetchPrevious: () => Promise<boolean>\n resetPagination: () => void\n}\n\nexport const useQuery = <T extends Record<string, unknown> = Record<string, unknown>>(\n modelName: RtsModelName,\n query: JsonObject = {},\n options: UseRtsQueryOptions = {},\n): UseRtsQueryResult<T> => {\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"useQuery: modelName must be a non-empty string\")\n }\n assertIncludeOnlyProjection(options.projection)\n\n const id = useId()\n\n const enabled = options.enabled ?? true\n const ssrEnabled = options.ssr !== false\n const refreshOnMount = options.refreshOnMount === true\n const key = options.key ?? id\n const queryJson = JSON.stringify(query)\n const projectionJson = options.projection ? JSON.stringify(options.projection) : \"\"\n const sortJson = options.sort ? JSON.stringify(options.sort) : \"\"\n const limitStr = typeof options.limit === \"number\" ? String(options.limit) : \"\"\n const populateJson = options.populate ? JSON.stringify(options.populate) : \"\"\n const paginationJson = options.pagination ? JSON.stringify(options.pagination) : \"\"\n preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"useQuery\",\n )\n const isPaginated = Boolean(options.pagination)\n\n const queryKey = computeRtsQueryKey(query, {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n })\n\n const ssrRuntime = useRtsSsrRuntime()\n if (enabled && ssrEnabled && ssrRuntime) {\n ssrRuntime.registerQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n },\n queryKey,\n })\n }\n\n const seedDataRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryData(modelName, queryKey)\n : peekHydratedRtsQueryData(modelName, queryKey)\n : undefined\n ),\n [enabled, ssrEnabled, ssrRuntime, modelName, queryKey],\n )\n\n const seedPageInfoRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryPageInfo(modelName, queryKey)\n : peekHydratedRtsQueryPageInfo(modelName, queryKey)\n : undefined\n ),\n [enabled, ssrEnabled, ssrRuntime, modelName, queryKey],\n )\n\n const seedTotalCountRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryTotalCount(modelName, queryKey)\n : peekHydratedRtsQueryTotalCount(modelName, queryKey)\n : undefined\n ),\n [enabled, ssrEnabled, ssrRuntime, modelName, queryKey],\n )\n\n const hasSeedData = Array.isArray(seedDataRaw)\n const seedData = hasSeedData ? seedDataRaw as T[] : undefined\n const seedPageInfo = normalizePageInfo(seedPageInfoRaw)\n const seedTotalCount = normalizeTotalCount(seedTotalCountRaw)\n const seedJson = (() => {\n if (!hasSeedData) return \"\"\n try {\n return JSON.stringify(seedDataRaw)\n } catch {\n return \"\"\n }\n })()\n const seedPageInfoJson = (() => {\n if (!seedPageInfo) return \"\"\n try {\n return JSON.stringify(seedPageInfo)\n } catch {\n return \"\"\n }\n })()\n const seedTotalCountStr = seedTotalCount !== undefined ? String(seedTotalCount) : \"\"\n\n const [data, setData] = useState<T[] | undefined>(() => (isPaginated ? undefined : seedData))\n const [headPage, setHeadPage] = useState<LoadedPage<T> | null>(() => (\n isPaginated && seedData ? { nodes: seedData, ...(seedPageInfo ? { pageInfo: seedPageInfo } : {}) } : null\n ))\n const [totalCount, setTotalCount] = useState<number | undefined>(() => (isPaginated ? seedTotalCount : undefined))\n const [previousPages, setPreviousPages] = useState<Array<LoadedPage<T>>>([])\n const [nextPages, setNextPages] = useState<Array<LoadedPage<T>>>([])\n const [source, setSource] = useState<RtsQueryContext[\"source\"] | undefined>(() => (hasSeedData ? \"cache\" : undefined))\n const [error, setError] = useState<unknown | undefined>(undefined)\n const [loading, setLoading] = useState<boolean>(enabled && !hasSeedData)\n const [pagingDirection, setPagingDirection] = useState<\"next\" | \"prev\" | null>(null)\n\n const hasFirstReply = useRef(false)\n const hasNetworkReply = useRef(false)\n const lastDataJsonRef = useRef<string>(\"\")\n const previousPagesRef = useRef<Array<LoadedPage<T>>>([])\n const nextPagesRef = useRef<Array<LoadedPage<T>>>([])\n const headPageRef = useRef<LoadedPage<T> | null>(null)\n const pagingDirectionRef = useRef<\"next\" | \"prev\" | null>(null)\n\n useEffect(() => {\n previousPagesRef.current = previousPages\n }, [previousPages])\n\n useEffect(() => {\n nextPagesRef.current = nextPages\n }, [nextPages])\n\n useEffect(() => {\n headPageRef.current = headPage\n }, [headPage])\n\n useEffect(() => {\n pagingDirectionRef.current = pagingDirection\n }, [pagingDirection])\n\n useEffect(() => {\n if (!ssrRuntime && enabled && ssrEnabled && hasSeedData) {\n consumeHydratedRtsQueryData(modelName, queryKey)\n }\n\n hasFirstReply.current = hasSeedData\n hasNetworkReply.current = false\n lastDataJsonRef.current = seedJson\n setError(undefined)\n setPreviousPages([])\n setNextPages([])\n\n if (!enabled) {\n setLoading(false)\n setData(undefined)\n setHeadPage(null)\n setTotalCount(undefined)\n setSource(undefined)\n return\n }\n\n if (hasSeedData) {\n const nextSeedData = seedData as T[]\n setLoading(false)\n setSource(\"cache\")\n if (isPaginated) {\n setHeadPage({\n nodes: nextSeedData,\n ...(seedPageInfo ? { pageInfo: seedPageInfo } : {}),\n })\n setTotalCount(seedTotalCount)\n setData(undefined)\n } else {\n setData(nextSeedData)\n setTotalCount(undefined)\n setHeadPage(null)\n }\n return\n }\n\n setData(undefined)\n setHeadPage(null)\n setTotalCount(undefined)\n setLoading(true)\n }, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey, hasSeedData, seedJson, seedPageInfoJson, seedTotalCountStr, isPaginated])\n\n useEffect(() => {\n if (!enabled) return\n\n const runInitialNetworkQuery = refreshOnMount || !hasSeedData\n const runInitialLocalQuery = !hasSeedData && !isPaginated\n\n const unsubscribe = registerQuery(\n modelName,\n query,\n {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n },\n (err, result, context) => {\n if (context.source === \"cache\" && hasNetworkReply.current) return\n\n if (context.source === \"network\") {\n hasNetworkReply.current = true\n }\n\n setLoading(false)\n\n if (err) {\n setError(err)\n return\n }\n\n if (!Array.isArray(result)) return\n\n if (context.source === \"network\" && context.isLocal && options.skipLocal && hasFirstReply.current) {\n return\n }\n\n hasFirstReply.current = true\n const networkPageInfo = context.source === \"network\" ? context.pageInfo : undefined\n const networkTotalCount = context.source === \"network\" ? context.totalCount : undefined\n\n const payloadForHash = isPaginated\n ? { result, pageInfo: networkPageInfo, totalCount: networkTotalCount }\n : result\n\n let nextJson = \"\"\n try {\n nextJson = JSON.stringify(payloadForHash)\n } catch {\n nextJson = \"\"\n }\n\n if (nextJson && nextJson === lastDataJsonRef.current) {\n setSource(context.source)\n return\n }\n\n lastDataJsonRef.current = nextJson\n setSource(context.source)\n setError(undefined)\n\n if (isPaginated) {\n setHeadPage({\n nodes: result as T[],\n ...(networkPageInfo ? { pageInfo: networkPageInfo } : {}),\n })\n setTotalCount((current) => (networkTotalCount === undefined ? current : networkTotalCount))\n return\n }\n\n setData(result as T[])\n setTotalCount(undefined)\n },\n {\n runInitialNetworkQuery,\n runInitialLocalQuery,\n },\n )\n\n return () => {\n unsubscribe?.()\n }\n }, [\n enabled,\n modelName,\n queryKey,\n queryJson,\n projectionJson,\n sortJson,\n limitStr,\n populateJson,\n paginationJson,\n hasSeedData,\n refreshOnMount,\n isPaginated,\n ])\n\n const effectivePageInfo = useMemo<PaginationPageInfo | undefined>(() => {\n if (!isPaginated) return undefined\n\n const firstPageInfo = previousPages.length > 0\n ? previousPages[0]?.pageInfo\n : headPage?.pageInfo\n\n const lastPageInfo = nextPages.length > 0\n ? nextPages[nextPages.length - 1]?.pageInfo\n : headPage?.pageInfo\n\n if (!firstPageInfo && !lastPageInfo) return undefined\n\n const hasPrevPage = Boolean(firstPageInfo?.hasPrevPage)\n const hasNextPage = Boolean(lastPageInfo?.hasNextPage)\n const prevCursor = firstPageInfo?.prevCursor\n const nextCursor = lastPageInfo?.nextCursor\n\n return {\n hasPrevPage,\n hasNextPage,\n ...(prevCursor ? { prevCursor } : {}),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }, [headPage, isPaginated, nextPages, previousPages])\n\n const mergedPaginatedData = useMemo<T[] | undefined>(() => {\n if (!isPaginated) return undefined\n if (!headPage && previousPages.length === 0 && nextPages.length === 0) return undefined\n return flattenLoadedPages(previousPages, headPage, nextPages)\n }, [headPage, isPaginated, nextPages, previousPages])\n\n const fetchNext = async (): Promise<boolean> => {\n if (!enabled || !isPaginated || !options.pagination) return false\n if (pagingDirectionRef.current) return false\n\n const currentHead = headPageRef.current\n const currentNextPages = nextPagesRef.current\n const cursor = currentNextPages.length > 0\n ? currentNextPages[currentNextPages.length - 1]?.pageInfo?.nextCursor\n : currentHead?.pageInfo?.nextCursor\n\n const hasNextPage = currentNextPages.length > 0\n ? Boolean(currentNextPages[currentNextPages.length - 1]?.pageInfo?.hasNextPage)\n : Boolean(currentHead?.pageInfo?.hasNextPage)\n\n if (!cursor || !hasNextPage) return false\n\n setPagingDirection(\"next\")\n setLoading(true)\n setError(undefined)\n\n try {\n const response = await runNetworkQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: {\n ...options.pagination,\n direction: \"next\",\n cursor,\n },\n },\n })\n\n if (!Array.isArray(response.data)) return false\n\n const page: LoadedPage<T> = {\n nodes: response.data as T[],\n ...(response.context.source === \"network\" && response.context.pageInfo\n ? { pageInfo: response.context.pageInfo }\n : {}),\n }\n\n setSource(\"network\")\n if (response.context.source === \"network\" && response.context.totalCount !== undefined) {\n setTotalCount(response.context.totalCount)\n }\n setNextPages((current) => [...current, page])\n return true\n } catch (err) {\n setError(err)\n return false\n } finally {\n setPagingDirection(null)\n setLoading(false)\n }\n }\n\n const fetchPrevious = async (): Promise<boolean> => {\n if (!enabled || !isPaginated || !options.pagination) return false\n if (pagingDirectionRef.current) return false\n\n const currentHead = headPageRef.current\n const currentPreviousPages = previousPagesRef.current\n const cursor = currentPreviousPages.length > 0\n ? currentPreviousPages[0]?.pageInfo?.prevCursor\n : currentHead?.pageInfo?.prevCursor\n\n const hasPrevPage = currentPreviousPages.length > 0\n ? Boolean(currentPreviousPages[0]?.pageInfo?.hasPrevPage)\n : Boolean(currentHead?.pageInfo?.hasPrevPage)\n\n if (!cursor || !hasPrevPage) return false\n\n setPagingDirection(\"prev\")\n setLoading(true)\n setError(undefined)\n\n try {\n const response = await runNetworkQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: {\n ...options.pagination,\n direction: \"prev\",\n cursor,\n },\n },\n })\n\n if (!Array.isArray(response.data)) return false\n\n const page: LoadedPage<T> = {\n nodes: response.data as T[],\n ...(response.context.source === \"network\" && response.context.pageInfo\n ? { pageInfo: response.context.pageInfo }\n : {}),\n }\n\n setSource(\"network\")\n if (response.context.source === \"network\" && response.context.totalCount !== undefined) {\n setTotalCount(response.context.totalCount)\n }\n setPreviousPages((current) => [page, ...current])\n return true\n } catch (err) {\n setError(err)\n return false\n } finally {\n setPagingDirection(null)\n setLoading(false)\n }\n }\n\n const resetPagination = () => {\n if (!isPaginated) return\n setPreviousPages([])\n setNextPages([])\n }\n\n return useMemo(\n () => ({\n data: isPaginated ? mergedPaginatedData : data,\n pageInfo: effectivePageInfo,\n totalCount: isPaginated ? totalCount : undefined,\n source,\n error,\n loading,\n fetchNext,\n fetchPrevious,\n resetPagination,\n }),\n [\n data,\n effectivePageInfo,\n error,\n fetchNext,\n fetchPrevious,\n isPaginated,\n loading,\n mergedPaginatedData,\n source,\n totalCount,\n ],\n )\n}\n"],"names":["STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY","RtsSsrRuntimeContext","createContext","hydrationDataStore","Map","hydrationPageInfoStore","hydrationTotalCountStore","makeStoreKey","modelName","queryKey","normalizeStringOrNull","value","normalized","trim","normalizePageInfo","Array","isArray","undefined","raw","hasNextPage","hasPrevPage","nextCursor","prevCursor","normalizeTotalCount","Number","isFinite","Math","floor","parseHydrationData","v","queries","entry","query","data","pageInfo","totalCount","push","tenantId","uid","hydrateRtsFromWindow","window","browserWindow","parsed","clear","set","peekHydratedRtsQueryData","get","peekHydratedRtsQueryPageInfo","peekHydratedRtsQueryTotalCount","consumeHydratedRtsQueryData","key","delete","clearHydratedRtsQueryData","RtsSsrRuntimeProvider","t0","$","_c","children","t1","useRtsSsrRuntime","useContext","UNDERSCORE_PREFIX","DEFAULT_FIND_LIMIT","storeConfig","pouchDbPromise","lastAppliedPrefix","collections","dbNamesByPrefix","unwrapDefault","mod","maybe","default","ensureBrowser","Error","computeBasePrefix","appName","prefix","getDbNamesKey","getPrefixOverrideKey","readPrefixOverride","localStorage","getItem","endsWith","getPrefix","basePrefix","override","loadDbNames","existing","names","Set","JSON","parse","add","persistDbNames","size","removeItem","setItem","stringify","from","registerDbName","dbName","has","unregisterDbName","getPouchDb","core","indexedDbAdapter","findPlugin","Promise","all","PouchDB","plugin","applyPrefix","configureRtsPouchStore","config","getCollection","options","dbKey","db","adapter","revs_limit","replaceQueryKeys","replaceKey","map","item","obj","next","Object","create","getPrototypeOf","keys","test","newKey","getKeys","parentKey","nextKey","satisfiesProjection","doc","projection","docKeys","projectionKeys","filter","getValueAtPath","path","parts","split","part","Boolean","length","current","setValueAtPath","i","unsetValueAtPath","cloneDoc","structuredClone","toProjectionSpec","spec","entries","applyProjection","includeKeys","excludeKeys","projected","_id","hasOwn","compareSort","a","b","sort","dir","aVal","bVal","extractDocId","id","matchValue","docValue","matchValueRaw","matched","matchObj","some","startsWith","docObj","is","matchesSimpleQuery","expected","actual","remapDocFromStorage","replace","runQueryInternal","strictProjection","collection","replacedQuery","limit","abs","docs","find","selector","mappedDocs","_rev","_revIgnored","rest","filteredDocs","context","source","projectionMismatch","result","runQuery","addWriteDoc","writes","docsById","sanitizePopulatedDoc","populate","ids","candidate","model","candidateDoc","nested","valueDoc","updatePopulatedDocs","roots","updateDocs","targetModelName","values","loadProjectedDocsByIds","uniqueIds","rawDocsById","projectedDocsById","$in","rawDoc","remapped","hydratePopulateEntries","currentDocs","hit","descriptors","rawValue","hasValue","allIds","flatMap","descriptor","loaded","select","populatedDocsById","match","filtered","nestedResult","reduce","acc","slice","max","runPopulatedQuery","rootResult","projectedRoots","hydrated","fields","currentDocsById","String","newDocs","mongoDoc","currentDoc","nextDoc","rev","bulkDocs","deleteDocs","deletions","_deleted","destroyCollection","destroy","resetRtsPouchStore","oldPrefix","dbNames","openDbs","remaining","catch","PouchDBForPrefix","defaults","name","then","newPrefix","Date","now","toString","destroyAllCollections","dbs","EXCLUDE_PROJECTION_ERROR","sortProjectionSpec","sorted","normalizeProjectionSpec","label","hasExclude","normalizeSelectString","tokens","token","normalizePopulateSelect","normalizePopulateOptions","sortRaw","rawDirection","normalizeString","normalizeObject","normalizePopulateObject","normalizePopulateOption","preparePopulateCacheOptions","rootProjection","computeRtsQueryKey","pagination","TENANT_ID_QUERY_PARAM","RTS_CHANGES_ROUTE","MAX_TXN_BUF","SERVER_RECONNECT_DELAY_MIN_MS","SERVER_RECONNECT_DELAY_MAX_MS","RUN_NETWORK_QUERY_TIMEOUT_ERROR","socket","connectPromise","explicitDisconnect","currentTenantId","currentUid","connectOptions","localTxnBuf","queryCallbacks","subscriptions","messageCallbacks","reconnectTimer","reconnectAttempts","hasEstablishedConnection","pendingServerReconnectJitter","syncPromise","syncKey","buildSocketUrl","_uid","url","URL","searchParams","base","location","href","protocol","pathname","search","hash","sendToServer","message","readyState","WebSocket","OPEN","send","resubscribeAll","forceInitialQuery","sub","runInitialQuery","runInitialNetworkQuery","type","clearReconnectTimer","clearTimeout","scheduleReconnect","cfg","reconnect","maxAttempts","attempts","delayMs","delayMaxMs","delay","min","pow","span","random","setTimeout","connectInternal","resetReconnectAttempts","isDocWithId","handleQueryPayload","payload","error","txnId","cbKey","callbacks","subscription","populateCache","hasPopulate","hasPagination","isLocal","includes","cb","handleEvent","event","handleMessage","addLocalTxn","shift","getSyncStorageKey","readStoredSeq","num","writeStoredSeq","applyChangeBatch","changes","resetModels","deletesByModel","change","op","docId","syncRtsChanges","storageKey","sinceSeq","encodeURIComponent","response","fetch","method","credentials","headers","body","ok","json","payloadObj","latestSeq","needsFullResync","changesRaw","c","seq","lastSeq","ensureSynced","syncChanges","finally","resolve","configureStore","CONNECTING","reject","opened","settled","addEventListener","code","err","connect","disconnect","close","registerQuery","optionsOrCallback","callbackMaybe","behavior","callback","runInitialLocalQuery","makeRunQueryKey","runNetworkQuery","timeoutMs","hasTimeout","timeoutStartedAt","connectAttempt","timeoutId","remainingTimeoutMs","resolvedOptions","cleanup","settle","sendMessage","onMessage","getDocId","dedupeById","seen","merged","flattenLoadedPages","previousPages","headPage","nextPages","page","nodes","assertIncludeOnlyProjection","useQuery","useId","enabled","ssrEnabled","ssr","refreshOnMount","queryJson","projectionJson","sortJson","limitStr","populateJson","paginationJson","isPaginated","ssrRuntime","seedDataRaw","useMemo","getQueryData","seedPageInfoRaw","getQueryPageInfo","seedTotalCountRaw","getQueryTotalCount","hasSeedData","seedData","seedPageInfo","seedTotalCount","seedJson","seedPageInfoJson","seedTotalCountStr","setData","useState","setHeadPage","setTotalCount","setPreviousPages","setNextPages","setSource","setError","loading","setLoading","pagingDirection","setPagingDirection","hasFirstReply","useRef","hasNetworkReply","lastDataJsonRef","previousPagesRef","nextPagesRef","headPageRef","pagingDirectionRef","useEffect","nextSeedData","unsubscribe","skipLocal","networkPageInfo","networkTotalCount","payloadForHash","nextJson","effectivePageInfo","firstPageInfo","lastPageInfo","mergedPaginatedData","fetchNext","currentHead","currentNextPages","cursor","direction","fetchPrevious","currentPreviousPages","resetPagination"],"mappings":";;;AASO,MAAMA,wCAAwC;AA+BrD,MAAMC,uBAAuBC,cAAoC,IAAI;AAErE,MAAMC,yCAAyBC,IAAAA;AAC/B,MAAMC,6CAA6BD,IAAAA;AACnC,MAAME,+CAA+BF,IAAAA;AAErC,MAAMG,eAAeA,CAACC,WAAmBC,aAA6B,GAAGD,SAAS,IAAIC,QAAQ;AAE9F,MAAMC,wBAAwBA,CAACC,UAAkC;AAC/D,MAAI,OAAOA,UAAU,SAAU,QAAO;AACtC,QAAMC,aAAaD,MAAME,KAAAA;AACzB,SAAOD,aAAaA,aAAa;AACnC;AAEA,MAAME,sBAAoBA,CAACH,UAAmD;AAC5E,MAAI,CAACA,SAAS,OAAOA,UAAU,YAAYI,MAAMC,QAAQL,KAAK,EAAG,QAAOM;AAExE,QAAMC,MAAMP;AAOZ,MAAI,OAAOO,IAAIC,gBAAgB,aAAa,OAAOD,IAAIE,gBAAgB,UAAW,QAAOH;AAEzF,QAAMI,aAAa,OAAOH,IAAIG,eAAe,YAAYH,IAAIG,aAAaH,IAAIG,aAAaJ;AAC3F,QAAMK,aAAa,OAAOJ,IAAII,eAAe,YAAYJ,IAAII,aAAaJ,IAAII,aAAaL;AAE3F,SAAO;AAAA,IACLE,aAAaD,IAAIC;AAAAA,IACjBC,aAAaF,IAAIE;AAAAA,IACjB,GAAIC,aAAa;AAAA,MAAEA;AAAAA,IAAAA,IAAe,CAAA;AAAA,IAClC,GAAIC,aAAa;AAAA,MAAEA;AAAAA,IAAAA,IAAe,CAAA;AAAA,EAAC;AAEvC;AAEA,MAAMC,wBAAsBA,CAACZ,UAAuC;AAClE,MAAI,OAAOA,UAAU,SAAU,QAAOM;AACtC,MAAI,CAACO,OAAOC,SAASd,KAAK,KAAKA,QAAQ,EAAG,QAAOM;AACjD,SAAOS,KAAKC,MAAMhB,KAAK;AACzB;AAEA,MAAMiB,qBAAqBA,CAACjB,UAAyD;AACnF,MAAI,CAACA,SAAS,OAAOA,UAAU,SAAU,QAAO;AAEhD,QAAMO,MAAMP;AAOZ,MAAIO,IAAIW,MAAM,EAAG,QAAO;AACxB,MAAI,CAACd,MAAMC,QAAQE,IAAIY,OAAO,EAAG,QAAO;AAExC,QAAMA,UAAsC,CAAA;AAC5C,aAAWC,SAASb,IAAIY,SAAS;AAC/B,QAAI,CAACC,SAAS,OAAOA,UAAU,SAAU;AAEzC,UAAMC,QAAQD;AAQd,UAAMvB,YAAYE,sBAAsBsB,MAAMxB,SAAS;AACvD,UAAMC,WAAWC,sBAAsBsB,MAAMvB,QAAQ;AACrD,QAAI,CAACD,aAAa,CAACC,SAAU;AAC7B,QAAI,CAACM,MAAMC,QAAQgB,MAAMC,IAAI,EAAG;AAChC,UAAMC,WAAWpB,oBAAkBkB,MAAME,QAAQ;AACjD,UAAMC,aAAaZ,sBAAoBS,MAAMG,UAAU;AAEvDL,YAAQM,KAAK;AAAA,MACX5B;AAAAA,MACAC;AAAAA,MACAwB,MAAMD,MAAMC;AAAAA,MACZ,GAAIC,WAAW;AAAA,QAAEA;AAAAA,MAAAA,IAAa,CAAA;AAAA,MAC9B,GAAIC,eAAelB,SAAY;AAAA,QAAEkB;AAAAA,MAAAA,IAAe,CAAA;AAAA,IAAC,CAClD;AAAA,EACH;AAEA,SAAO;AAAA,IACLN,GAAG;AAAA,IACHQ,UAAU3B,sBAAsBQ,IAAImB,QAAQ;AAAA,IAC5CC,KAAK5B,sBAAsBQ,IAAIoB,GAAG;AAAA,IAClCR;AAAAA,EAAAA;AAEJ;AAEO,MAAMS,uBAAuBA,MAAY;AAC9C,MAAI,OAAOC,WAAW,YAAa;AAEnC,QAAMC,gBAAgBD;AACtB,QAAMtB,MAAMuB,cAAczC,qCAAqC;AAC/D,SAAOyC,cAAczC,qCAAqC;AAE1D,QAAM0C,SAASd,mBAAmBV,GAAG;AACrC,MAAI,CAACwB,OAAQ;AAEbvC,qBAAmBwC,MAAAA;AACnBtC,yBAAuBsC,MAAAA;AACvBrC,2BAAyBqC,MAAAA;AACzB,aAAWX,SAASU,OAAOZ,SAAS;AAClC3B,uBAAmByC,IAAIrC,aAAayB,MAAMxB,WAAWwB,MAAMvB,QAAQ,GAAGuB,MAAMC,IAAI;AAChF5B,2BAAuBuC,IAAIrC,aAAayB,MAAMxB,WAAWwB,MAAMvB,QAAQ,GAAGuB,MAAME,QAAQ;AACxF5B,6BAAyBsC,IAAIrC,aAAayB,MAAMxB,WAAWwB,MAAMvB,QAAQ,GAAGuB,MAAMG,UAAU;AAAA,EAC9F;AACF;AAEO,MAAMU,2BAA2BA,CACtCrC,WACAC,aAC0B;AAC1B,SAAON,mBAAmB2C,IAAIvC,aAAaC,WAAWC,QAAQ,CAAC;AACjE;AAEO,MAAMsC,+BAA+BA,CAC1CvC,WACAC,aACmC;AACnC,SAAOJ,uBAAuByC,IAAIvC,aAAaC,WAAWC,QAAQ,CAAC;AACrE;AAEO,MAAMuC,iCAAiCA,CAC5CxC,WACAC,aACuB;AACvB,SAAOH,yBAAyBwC,IAAIvC,aAAaC,WAAWC,QAAQ,CAAC;AACvE;AAEO,MAAMwC,8BAA8BA,CACzCzC,WACAC,aACS;AACT,QAAMyC,MAAM3C,aAAaC,WAAWC,QAAQ;AAC5CN,qBAAmBgD,OAAOD,GAAG;AAC7B7C,yBAAuB8C,OAAOD,GAAG;AACjC5C,2BAAyB6C,OAAOD,GAAG;AACrC;AAEO,MAAME,4BAA4BA,MAAY;AACnDjD,qBAAmBwC,MAAAA;AACnBtC,yBAAuBsC,MAAAA;AACvBrC,2BAAyBqC,MAAAA;AAC3B;AAEO,MAAMU,wBAAwBC,CAAAA,OAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA;AAAC,QAAA;AAAA,IAAA7C;AAAAA,IAAA8C;AAAAA,EAAAA,IAAAH;AAMrC,MAAAI;AAAA,MAAAH,EAAA,CAAA,MAAAE,YAAAF,SAAA5C,OAAA;AAEG+C,SAAA,oBAAA,qBAAA,UAAA,EAAsC/C,OACnC8C,UACH;AAAgCF,WAAAE;AAAAF,WAAA5C;AAAA4C,WAAAG;AAAAA,EAAA,OAAA;AAAAA,SAAAH,EAAA,CAAA;AAAA,EAAA;AAAA,SAFhCG;AAEgC;AAI7B,MAAMC,mBAAmBA,MAAA;AAAA,SACvBC,WAAW3D,oBAAoB;AAAC;AC3KzC,MAAM4D,oBAAoB;AAC1B,MAAMC,qBAAqB;AAE3B,IAAIC,cAA0C;AAE9C,IAAIC,iBAAgD;AACpD,IAAIC,oBAAmC;AAEvC,MAAMC,kCAAkB9D,IAAAA;AACxB,MAAM+D,sCAAsB/D,IAAAA;AAE5B,MAAMgE,gBAAgBA,CAACC,QAA0B;AAC/C,MAAI,CAACA,OAAO,OAAOA,QAAQ,SAAU,QAAOA;AAC5C,QAAMC,QAAQD;AACd,SAAOC,MAAMC,WAAWF;AAC1B;AAEA,MAAMG,kBAAgBA,MAAM;AAC1B,MAAI,OAAOhC,WAAW,aAAa;AACjC,UAAM,IAAIiC,MAAM,mDAAmD;AAAA,EACrE;AACF;AAEA,MAAMC,oBAAoBA,CAAC;AAAA,EAAErC;AAAAA,EAAUsC;AAAgD,MAAc;AACnG,MAAIC,SAAS;AACb,MAAID,QAASC,WAAU,GAAGD,OAAO;AACjCC,YAAU,GAAGvC,QAAQ;AACrB,SAAOuC;AACT;AAEA,MAAMC,gBAAgBA,CAACD,WAA2B,mBAAmBA,MAAM;AAE3E,MAAME,uBAAuBA,CAAC;AAAA,EAAEzC;AAAAA,EAAUsC;AAAgD,MACxF,sBAAsBA,WAAW,EAAE,IAAItC,QAAQ;AAEjD,MAAM0C,qBAAqBA,CAAC;AAAA,EAAE1C;AAAAA,EAAUsC;AAAgD,MAAqB;AAC3G,MAAI;AACF,UAAMhE,QAAQ6B,OAAOwC,aAAaC,QAAQH,qBAAqB;AAAA,MAAEzC;AAAAA,MAAUsC;AAAAA,IAAAA,CAAS,CAAC;AACrF,QAAI,CAAChE,MAAO,QAAO;AACnB,QAAI,CAACA,MAAMuE,SAAS,GAAG,EAAG,QAAO,GAAGvE,KAAK;AACzC,WAAOA;AAAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,MAAMwE,YAAYA,MAAc;AAC9B,MAAI,CAACpB,aAAa;AAChB,UAAM,IAAIU,MAAM,qCAAqC;AAAA,EACvD;AAEA,MAAIV,YAAYa,OAAQ,QAAOb,YAAYa;AAE3C,QAAMQ,aAAaV,kBAAkB;AAAA,IAAErC,UAAU0B,YAAY1B;AAAAA,IAAUsC,SAASZ,YAAYY;AAAAA,EAAAA,CAAS;AACrG,QAAMU,WAAWN,mBAAmB;AAAA,IAAE1C,UAAU0B,YAAY1B;AAAAA,IAAUsC,SAASZ,YAAYY;AAAAA,EAAAA,CAAS;AACpG,SAAOU,YAAYD;AACrB;AAEA,MAAME,cAAcA,CAACV,WAAgC;AACnD,QAAMW,WAAWpB,gBAAgBrB,IAAI8B,MAAM;AAC3C,MAAIW,SAAU,QAAOA;AAErB,QAAMC,4BAAYC,IAAAA;AAClB,MAAI;AACF,UAAMvE,MAAMsB,OAAOwC,aAAaC,QAAQJ,cAAcD,MAAM,CAAC;AAC7D,QAAI1D,KAAK;AACP,YAAMwB,SAASgD,KAAKC,MAAMzE,GAAG;AAC7B,UAAIH,MAAMC,QAAQ0B,MAAM,GAAG;AACzB,mBAAW/B,SAAS+B,QAAQ;AAC1B,cAAI,OAAO/B,UAAU,YAAYA,MAAO6E,OAAMI,IAAIjF,KAAK;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO6E;AAAAA,EACT;AAEArB,kBAAgBvB,IAAIgC,QAAQY,KAAK;AACjC,SAAOA;AACT;AAEA,MAAMK,iBAAiBA,CAACjB,QAAgBY,UAA6B;AACnE,MAAI;AACF,QAAI,CAACA,MAAMM,MAAM;AACftD,aAAOwC,aAAae,WAAWlB,cAAcD,MAAM,CAAC;AACpDT,sBAAgBhB,OAAOyB,MAAM;AAC7B;AAAA,IACF;AAEApC,WAAOwC,aAAagB,QAAQnB,cAAcD,MAAM,GAAGc,KAAKO,UAAUlF,MAAMmF,KAAKV,KAAK,CAAC,CAAC;AACpFrB,oBAAgBvB,IAAIgC,QAAQY,KAAK;AAAA,EACnC,QAAQ;AACN;AAAA,EACF;AACF;AAEA,MAAMW,iBAAiBA,CAACvB,QAAgBwB,WAAyB;AAC/D,MAAI,CAACxB,UAAU,CAACwB,OAAQ;AACxB,QAAMZ,QAAQF,YAAYV,MAAM;AAChC,MAAIY,MAAMa,IAAID,MAAM,EAAG;AACvBZ,QAAMI,IAAIQ,MAAM;AAChBP,iBAAejB,QAAQY,KAAK;AAC9B;AAEA,MAAMc,mBAAmBA,CAAC1B,QAAgBwB,WAAyB;AACjE,MAAI,CAACxB,UAAU,CAACwB,OAAQ;AACxB,QAAMZ,QAAQF,YAAYV,MAAM;AAChC,MAAI,CAACY,MAAMrC,OAAOiD,MAAM,EAAG;AAC3BP,iBAAejB,QAAQY,KAAK;AAC9B;AAEA,MAAMe,aAAa,YAAoC;AACrD/B,kBAAAA;AAEA,MAAI,CAACR,gBAAgB;AACnBA,sBAAkB,YAAY;AAC5B,YAAM,CAACwC,MAAMC,kBAAkBC,UAAU,IAAI,MAAMC,QAAQC,IAAI,CAC7D,OAAO,cAAc,GACrB,OAAO,2BAA2B,GAClC,OAAO,cAAc,CAAC,CACvB;AAED,YAAMC,UAAUzC,cAAcoC,IAAI;AAClCK,cAAQC,OAAO1C,cAAcqC,gBAAgB,CAAC;AAC9CI,cAAQC,OAAO1C,cAAcsC,UAAU,CAAC;AAExC,aAAOG;AAAAA,IACT,GAAA;AAAA,EACF;AAEA,SAAO7C;AACT;AAEA,MAAM+C,cAAcA,CAACF,YAA2B;AAC9C,QAAMjC,SAASO,UAAAA;AACf,MAAIP,WAAWX,kBAAmB;AAClC4C,UAAQjC,SAASA;AACjBX,sBAAoBW;AACtB;AAEO,MAAMoC,yBAAyBA,CAACC,WAAuC;AAC5ElD,gBAAckD;AACdhD,sBAAoB;AACpBC,cAAYvB,MAAAA;AACd;AAEO,MAAMuE,gBAAgB,OAAO1G,WAAmB2G,YAAuD;AAC5G,QAAMN,UAAU,MAAMN,WAAAA;AACtBQ,cAAYF,OAAO;AAEnB,QAAMjC,SAASO,UAAAA;AACf,QAAMiB,SAAS,GAAGe,QAAQ7E,GAAG,IAAI9B,SAAS;AAC1C,QAAM4G,QAAQ,GAAGxC,MAAM,GAAGwB,MAAM;AAEhC,QAAMb,WAAWrB,YAAYpB,IAAIsE,KAAK;AACtC,MAAI7B,SAAU,QAAOA;AAErBY,iBAAevB,QAAQwB,MAAM;AAC7B,QAAMiB,KAAK,IAAIR,QAAQT,QAAQ;AAAA,IAAEkB,SAAS;AAAA,IAAaC,YAAY;AAAA,EAAA,CAAG;AACtErD,cAAYtB,IAAIwE,OAAOC,EAAE;AACzB,SAAOA;AACT;AAEA,MAAMG,mBAAmBA,CAAC7G,OAAgB8G,eAAiD;AACzF,MAAI,OAAO9G,UAAU,YAAYA,UAAU,MAAM;AAC/C,WAAOA;AAAAA,EACT;AAEA,MAAII,MAAMC,QAAQL,KAAK,GAAG;AACxB,WAAOA,MAAM+G,IAAKC,CAAAA,SAASH,iBAAiBG,MAAMF,UAAU,CAAC;AAAA,EAC/D;AAEA,QAAMG,MAAMjH;AACZ,QAAMkH,OAAgCC,OAAOC,OAAOD,OAAOE,eAAeJ,GAAG,CAAC;AAE9E,aAAW1E,OAAO4E,OAAOG,KAAKL,GAAG,GAAG;AAClC,QAAI,MAAMM,KAAKhF,GAAG,KAAK,SAASgF,KAAKhF,GAAG,GAAG;AACzC,YAAM,IAAIuB,MAAM,4CAA4CvB,GAAG,EAAE;AAAA,IACnE;AAEA,UAAMiF,SAASV,WAAWvE,GAAG;AAC7B2E,SAAKM,MAAM,IAAIX,iBAAiBI,IAAI1E,GAAG,GAAGuE,UAAU;AAAA,EACtD;AAEA,SAAOI;AACT;AAEA,MAAMO,UAAUA,CAACR,KAA8BS,YAAY,OAAiB;AAC1E,QAAMJ,OAAiB,CAAA;AAEvB,aAAW/E,OAAO4E,OAAOG,KAAKL,GAAG,GAAG;AAClC,UAAMU,UAAUD,YAAY,GAAGA,SAAS,IAAInF,GAAG,KAAKA;AACpD,UAAMvC,QAAQiH,IAAI1E,GAAG;AAErB,QAAI,OAAOvC,UAAU,YAAYA,UAAU,QAAQ,CAACI,MAAMC,QAAQL,KAAK,GAAG;AACxEsH,WAAK7F,KAAK,GAAGgG,QAAQzH,OAAkC2H,OAAO,CAAC;AAAA,IACjE,OAAO;AACLL,WAAK7F,KAAKkG,OAAO;AAAA,IACnB;AAAA,EACF;AAEA,SAAOL;AACT;AAEA,MAAMM,sBAAsBA,CAACC,KAA8BC,eAA+C;AACxG,QAAMC,UAAU,IAAIjD,IAAI2C,QAAQI,GAAG,CAAC;AACpC,QAAMG,iBAAiB,IAAIlD,IAAIqC,OAAOG,KAAKQ,UAAU,EAAEG,OAAQ1F,CAAAA,QAAQuF,WAAWvF,GAAG,MAAM,CAAC,CAAC;AAE7F,MAAI,CAACyF,eAAetC,IAAI,KAAK,GAAG;AAC9BqC,YAAQvF,OAAO,KAAK;AAAA,EACtB;AAEA,MAAIwF,eAAe7C,OAAO4C,QAAQ5C,KAAM,QAAO;AAC/C,aAAW5C,OAAOyF,gBAAgB;AAChC,QAAI,CAACD,QAAQrC,IAAInD,GAAG,EAAG,QAAO;AAAA,EAChC;AACA,SAAO;AACT;AAEA,MAAM2F,iBAAiBA,CAACL,KAA8BM,SAA0B;AAC9E,QAAMC,QAAQD,KAAKE,MAAM,GAAG,EAAEtB,IAAKuB,CAAAA,SAASA,KAAKpI,KAAAA,CAAM,EAAE+H,OAAOM,OAAO;AACvE,MAAI,CAACH,MAAMI,OAAQ,QAAOlI;AAE1B,MAAImI,UAAmBZ;AACvB,aAAWS,QAAQF,OAAO;AACxB,QAAI,CAACK,WAAW,OAAOA,YAAY,YAAYrI,MAAMC,QAAQoI,OAAO,EAAG,QAAOnI;AAC9EmI,cAAWA,QAAoCH,IAAI;AAAA,EACrD;AACA,SAAOG;AACT;AAEA,MAAMC,iBAAiBA,CAACb,KAA8BM,MAAcnI,UAAyB;AAC3F,QAAMoI,QAAQD,KAAKE,MAAM,GAAG,EAAEtB,IAAKuB,CAAAA,SAASA,KAAKpI,KAAAA,CAAM,EAAE+H,OAAOM,OAAO;AACvE,MAAI,CAACH,MAAMI,OAAQ;AAEnB,MAAIC,UAAmCZ;AACvC,WAASc,IAAI,GAAGA,IAAIP,MAAMI,SAAS,GAAGG,KAAK,GAAG;AAC5C,UAAMpG,MAAM6F,MAAMO,CAAC;AACnB,UAAM/D,WAAW6D,QAAQlG,GAAG;AAC5B,QAAI,CAACqC,YAAY,OAAOA,aAAa,YAAYxE,MAAMC,QAAQuE,QAAQ,GAAG;AACxE6D,cAAQlG,GAAG,IAAI,CAAA;AAAA,IACjB;AACAkG,cAAUA,QAAQlG,GAAG;AAAA,EACvB;AAEAkG,UAAQL,MAAMA,MAAMI,SAAS,CAAC,CAAE,IAAIxI;AACtC;AAEA,MAAM4I,mBAAmBA,CAACf,KAA8BM,SAAuB;AAC7E,QAAMC,QAAQD,KAAKE,MAAM,GAAG,EAAEtB,IAAKuB,CAAAA,SAASA,KAAKpI,KAAAA,CAAM,EAAE+H,OAAOM,OAAO;AACvE,MAAI,CAACH,MAAMI,OAAQ;AAEnB,MAAIC,UAAmCZ;AACvC,WAASc,IAAI,GAAGA,IAAIP,MAAMI,SAAS,GAAGG,KAAK,GAAG;AAC5C,UAAMpG,MAAM6F,MAAMO,CAAC;AACnB,UAAMzB,OAAOuB,QAAQlG,GAAG;AACxB,QAAI,CAAC2E,QAAQ,OAAOA,SAAS,YAAY9G,MAAMC,QAAQ6G,IAAI,EAAG;AAC9DuB,cAAUvB;AAAAA,EACZ;AAEA,SAAOuB,QAAQL,MAAMA,MAAMI,SAAS,CAAC,CAAE;AACzC;AAEA,MAAMK,WAAW,CAAoChB,QAAc;AACjE,MAAI;AACF,WAAOiB,gBAAgBjB,GAAG;AAAA,EAC5B,QAAQ;AACN,WAAO9C,KAAKC,MAAMD,KAAKO,UAAUuC,GAAG,CAAC;AAAA,EACvC;AACF;AAEA,MAAMkB,mBAAmBA,CAACjB,eAAsD;AAC9E,QAAMkB,OAAuB,CAAA;AAC7B,aAAW,CAACzG,KAAKvC,KAAK,KAAKmH,OAAO8B,QAAQnB,UAAU,GAAG;AACrD,UAAMK,OAAO5F,IAAIrC,KAAAA;AACjB,QAAI,CAACiI,KAAM;AACX,QAAInI,UAAU,KAAKA,UAAU,GAAG;AAC9BgJ,WAAKb,IAAI,IAAInI;AAAAA,IACf;AAAA,EACF;AACA,SAAOgJ;AACT;AAEA,MAAME,kBAAkB,CACtBrB,KACAC,eACM;AACN,QAAMkB,OAAOD,iBAAiBjB,UAAU;AACxC,QAAMqB,cAAchC,OAAOG,KAAK0B,IAAI,EAAEf,OAAQ1F,CAAAA,QAAQyG,KAAKzG,GAAG,MAAM,CAAC;AACrE,QAAM6G,cAAcjC,OAAOG,KAAK0B,IAAI,EAAEf,OAAQ1F,CAAAA,QAAQyG,KAAKzG,GAAG,MAAM,CAAC;AAErE,MAAI4G,YAAYX,SAAS,GAAG;AAC1B,UAAMa,aAAqC,CAAA;AAC3C,eAAW9G,OAAO4G,aAAa;AAC7B,YAAMnJ,QAAQkI,eAAeL,KAAKtF,GAAG;AACrC,UAAIvC,UAAUM,OAAWoI,gBAAeW,YAAW9G,KAAKvC,KAAK;AAAA,IAC/D;AAEA,QAAIgJ,KAAKM,QAAQ,KAAKnC,OAAOoC,OAAO1B,KAAK,KAAK,GAAG;AAC/CwB,iBAAUC,MAAMzB,IAAIyB;AAAAA,IACtB;AAEA,WAAOD;AAAAA,EACT;AAEA,QAAMA,YAAYR,SAAShB,GAAG;AAC9B,aAAWtF,OAAO6G,aAAa;AAC7BR,qBAAiBS,WAAW9G,GAAG;AAAA,EACjC;AACA,SAAO8G;AACT;AAEA,MAAMG,cAAcA,CAClBC,GACAC,GACAC,SACW;AACX,aAAWpH,OAAO4E,OAAOG,KAAKqC,IAAI,GAAG;AACnC,UAAMC,MAAMD,KAAKpH,GAAG;AACpB,UAAMsH,OAAO3B,eAAeuB,GAAGlH,GAAG;AAClC,UAAMuH,OAAO5B,eAAewB,GAAGnH,GAAG;AAElC,QAAI,OAAOsH,SAAS,YAAY,OAAOC,SAAS,UAAU;AACxD,UAAID,OAAOC,KAAM,QAAO,KAAKF;AAC7B,UAAIC,OAAOC,KAAM,QAAO,IAAIF;AAC5B;AAAA,IACF;AAEA,QAAI,OAAOC,SAAS,YAAY,OAAOC,SAAS,UAAU;AACxD,UAAID,OAAOC,KAAM,QAAO,KAAKF;AAC7B,UAAIC,OAAOC,KAAM,QAAO,IAAIF;AAC5B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,MAAMG,eAAeA,CAAC/J,UAA2B;AAC/C,MAAI,OAAOA,UAAU,SAAU,QAAOA;AACtC,MAAI,CAACA,SAAS,OAAOA,UAAU,YAAYI,MAAMC,QAAQL,KAAK,EAAG,QAAO;AACxE,QAAMgK,KAAMhK,MAA4BsJ;AACxC,SAAO,OAAOU,OAAO,WAAWA,KAAK;AACvC;AAEA,MAAMC,aAAaA,CAACC,UAAmBC,kBAA2C;AAChF,MAAI/J,MAAMC,QAAQ8J,aAAa,GAAG;AAChC,QAAI,CAAC/J,MAAMC,QAAQ6J,QAAQ,EAAG,QAAO;AACrC,QAAIA,SAAS1B,WAAW2B,cAAc3B,OAAQ,QAAO;AACrD,aAASG,IAAI,GAAGA,IAAIwB,cAAc3B,QAAQG,KAAK,GAAG;AAChD,YAAMyB,UAAUH,WAAWC,SAASvB,CAAC,GAAGwB,cAAcxB,CAAC,CAAC;AACxD,UAAIyB,YAAY,KAAM,QAAO;AAC7B,UAAI,CAACA,QAAS,QAAO;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAEA,MAAID,iBAAiB,OAAOA,kBAAkB,UAAU;AACtD,UAAME,WAAWF;AACjB,QAAIhD,OAAOG,KAAK+C,QAAQ,EAAEC,KAAM/H,CAAAA,QAAQA,IAAIgI,WAAW,GAAG,CAAC,EAAG,QAAO;AACrE,QAAI,CAACL,YAAY,OAAOA,aAAa,YAAY9J,MAAMC,QAAQ6J,QAAQ,EAAG,QAAO;AACjF,UAAMM,SAASN;AACf,eAAW3H,OAAO4E,OAAOG,KAAK+C,QAAQ,GAAG;AACvC,YAAMD,UAAUH,WAAWO,OAAOjI,GAAG,GAAG8H,SAAS9H,GAAG,CAAC;AACrD,UAAI6H,YAAY,KAAM,QAAO;AAC7B,UAAI,CAACA,QAAS,QAAO;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAEA,SAAOjD,OAAOsD,GAAGP,UAAUC,aAAa;AAC1C;AAEA,MAAMO,qBAAqBA,CAAC7C,KAA8BxG,UAAmD;AAC3G,aAAW,CAACkB,KAAKoI,QAAQ,KAAKxD,OAAO8B,QAAQ5H,KAAK,GAAG;AACnD,QAAIkB,IAAIgI,WAAW,GAAG,EAAG,QAAO;AAChC,UAAMK,SAAS1C,eAAeL,KAAKtF,GAAG;AACtC,UAAM6H,UAAUH,WAAWW,QAAQD,QAAQ;AAC3C,QAAIP,YAAY,KAAM,QAAO;AAC7B,QAAI,CAACA,QAAS,QAAO;AAAA,EACvB;AACA,SAAO;AACT;AAEA,MAAMS,sBAAsBA,CAAChD,QAA0D;AACrF,QAAMX,OAAgC,CAAA;AAEtC,aAAW,CAAC3E,KAAKvC,KAAK,KAAKmH,OAAO8B,QAAQpB,GAAG,GAAG;AAC9C,UAAML,SAASjF,IAAIgI,WAAWrH,iBAAiB,IAAIX,IAAIuI,QAAQ,QAAQ,EAAE,IAAIvI;AAC7E2E,SAAKM,MAAM,IAAIxH;AAAAA,EACjB;AAEA,SAAOkH;AACT;AAEA,MAAM6D,mBAAmB,OAA0C;AAAA,EACjElL;AAAAA,EACAwB,QAAQ,CAAA;AAAA,EACRmF;AAAAA,EACAwE,mBAAmB;AAMrB,MAA0F;AACxF,QAAMC,aAAa,MAAM1E,cAAc1G,WAAW;AAAA,IAAE8B,KAAK6E,QAAQ7E;AAAAA,EAAAA,CAAK;AAEtE,QAAMuJ,gBAAgBrE,iBAAiBxF,OAAQkB,CAAAA,QAC7CA,IAAIgI,WAAW,GAAG,KAAKhI,QAAQ,QAAQ,GAAGW,iBAAiB,GAAGX,GAAG,KAAKA,GACxE;AAEA,QAAM4I,QAAQ,OAAO3E,QAAQ2E,UAAU,WAAWpK,KAAKqK,IAAI5E,QAAQ2E,KAAK,IAAIhI;AAE5E,QAAM;AAAA,IAAEkI;AAAAA,EAAAA,IAAS,MAAMJ,WAAWK,KAAK;AAAA,IACrCC,UAAUL;AAAAA,IACVC;AAAAA,EAAAA,CACD;AAED,QAAMK,aAAaH,KAAKtE,IAAI,CAAC;AAAA,IAAE0E,MAAMC;AAAAA,IAAa,GAAGC;AAAAA,EAAAA,MAAWd,oBAAoBc,IAAI,CAAM;AAC9F,MAAIC,eAAeJ;AAEnB,MAAIhF,QAAQsB,YAAY;AACtB,QAAIkD,oBAAoBQ,WAAWlB,KAAMlJ,CAAAA,UAAU,CAACwG,oBAAoBxG,OAAOoF,QAAQsB,UAAW,CAAC,GAAG;AACpG,aAAO;AAAA,QACLxG,MAAM,CAAA;AAAA,QACNuK,SAAS;AAAA,UAAEC,QAAQ;AAAA,QAAA;AAAA,QACnBC,oBAAoB;AAAA,MAAA;AAAA,IAExB;AAEAH,mBAAeA,aAAa3D,OAAQ7G,CAAAA,UAAUwG,oBAAoBxG,OAAOoF,QAAQsB,UAAW,CAAC;AAAA,EAC/F;AAEA,MAAIkE,SAAcJ;AAElB,MAAIpF,QAAQmD,MAAM;AAChBqC,aAASA,OAAOrC,KAAK,CAACF,GAAGC,MAAMF,YAAYC,GAAGC,GAAGlD,QAAQmD,IAAK,CAAC;AAAA,EACjE;AAEA,SAAO;AAAA,IAAErI,MAAM0K;AAAAA,IAAQH,SAAS;AAAA,MAAEC,QAAQ;AAAA,IAAA;AAAA,IAAWC,oBAAoB;AAAA,EAAA;AAC3E;AAEO,MAAME,WAAW,OAA0C;AAAA,EAChEpM;AAAAA,EACAwB,QAAQ,CAAA;AAAA,EACRmF;AAKF,MAA6D;AAC3D,QAAMwF,SAAS,MAAMjB,iBAAoB;AAAA,IAAElL;AAAAA,IAAWwB;AAAAA,IAAOmF;AAAAA,EAAAA,CAAS;AACtE,SAAO;AAAA,IAAElF,MAAM0K,OAAO1K;AAAAA,IAAMuK,SAASG,OAAOH;AAAAA,EAAAA;AAC9C;AAEA,MAAMK,cAAcA,CAClBC,QACAtM,WACAgI,QACS;AACT,QAAMuE,WAAWD,OAAOhK,IAAItC,SAAS,yBAASJ,IAAAA;AAC9C2M,WAASnK,IAAI4F,IAAIyB,KAAKzB,GAAG;AACzBsE,SAAOlK,IAAIpC,WAAWuM,QAAQ;AAChC;AAEA,MAAMC,uBAAuBA,CAC3BxE,KACAyE,UACAH,WAC8C;AAC9C,QAAMjF,OAAO2B,SAAShB,GAAG;AAEzB,aAAWzG,SAASkL,UAAU;AAC5B,UAAMtM,QAAQkI,eAAehB,MAAM9F,MAAM+G,IAAI;AAC7C,QAAInI,UAAUM,OAAW;AAEzB,QAAIF,MAAMC,QAAQL,KAAK,GAAG;AACxB,YAAMuM,MAAgB,CAAA;AACtB,iBAAWC,aAAaxM,OAAO;AAC7B,cAAMgK,MAAKD,aAAayC,SAAS;AACjC,YAAI,CAACxC,IAAI;AACTuC,YAAI9K,KAAKuI,GAAE;AAEX,YAAI,CAAC5I,MAAMqL,MAAO;AAClB,YAAI,CAACD,aAAa,OAAOA,cAAc,YAAYpM,MAAMC,QAAQmM,SAAS,EAAG;AAE7E,cAAME,eAAeF;AACrB,cAAMG,UAASvL,MAAMkL,UAAU9D,SAAS6D,qBAAqBK,cAActL,MAAMkL,UAAUH,MAAM,IAAItD,SAAS6D,YAAY;AAC1HR,oBAAYC,QAAQ/K,MAAMqL,OAAOE,OAAM;AAAA,MACzC;AAEAjE,qBAAexB,MAAM9F,MAAM+G,MAAMoE,GAAG;AACpC;AAAA,IACF;AAEA,UAAMvC,KAAKD,aAAa/J,KAAK;AAC7B0I,mBAAexB,MAAM9F,MAAM+G,MAAM6B,MAAM,IAAI;AAC3C,QAAI,CAACA,GAAI;AACT,QAAI,CAAC5I,MAAMqL,MAAO;AAClB,QAAI,CAACzM,SAAS,OAAOA,UAAU,YAAYI,MAAMC,QAAQL,KAAK,EAAG;AAEjE,UAAM4M,WAAW5M;AACjB,UAAM2M,SAASvL,MAAMkL,UAAU9D,SAAS6D,qBAAqBO,UAAUxL,MAAMkL,UAAUH,MAAM,IAAItD,SAAS+D,QAAQ;AAClHV,gBAAYC,QAAQ/K,MAAMqL,OAAOE,MAAM;AAAA,EACzC;AAEA,SAAOzF;AACT;AAEO,MAAM2F,sBAAsB,OAAO;AAAA,EACxChN;AAAAA,EACAyB;AAAAA,EACAK;AAAAA,EACA2K;AAMF,MAAqB;AACnB,MAAI,CAAChL,KAAKkH,OAAQ;AAElB,QAAM2D,6BAAa1M,IAAAA;AACnB,QAAMqN,QAAQxL,KAAKyF,IAAKc,CAAAA,QAAQwE,qBAAqBxE,KAAKyE,UAAUH,MAAM,CAAC;AAC3E,QAAMY,WAAWlN,WAAWiN,OAAOnL,GAAG;AAEtC,aAAW,CAACqL,iBAAiBZ,QAAQ,KAAKD,OAAOlD,WAAW;AAC1D,QAAI,CAACmD,SAASjH,KAAM;AACpB,UAAM4H,WACJC,iBACA5M,MAAMmF,KAAK6G,SAASa,OAAAA,CAAQ,GAC5BtL,GACF;AAAA,EACF;AACF;AAEA,MAAMuL,yBAAyB,OAAO;AAAA,EACpCrN;AAAAA,EACA0M;AAAAA,EACA5K;AAAAA,EACAmG;AAMF,MAIM;AACJ,QAAMqF,YAAY/M,MAAMmF,KAAK,IAAIT,IAAIyH,IAAItE,OAAOM,OAAO,CAAC,CAAC;AACzD,MAAI,CAAC4E,UAAU3E,QAAQ;AACrB,WAAO;AAAA,MAAE4E,iCAAiB3N,IAAAA;AAAAA,MAAO4N,uCAAuB5N,IAAAA;AAAAA,MAAOsM,oBAAoB;AAAA,IAAA;AAAA,EACrF;AAEA,QAAMd,aAAa,MAAM1E,cAAc1G,WAAW;AAAA,IAAE8B;AAAAA,EAAAA,CAAK;AACzD,QAAM;AAAA,IAAE0J;AAAAA,EAAAA,IAAS,MAAMJ,WAAWK,KAAK;AAAA,IACrCC,UAAU;AAAA,MAAEjC,KAAK;AAAA,QAAEgE,KAAKH;AAAAA,MAAAA;AAAAA,IAAU;AAAA,IAClChC,OAAOgC,UAAU3E;AAAAA,EAAAA,CAClB;AAED,QAAM4E,kCAAkB3N,IAAAA;AACxB,QAAM4N,wCAAwB5N,IAAAA;AAC9B,MAAIsM,qBAAqB;AAEzB,aAAWwB,UAAUlC,MAAM;AACzB,UAAMrB,KAAK,OAAOuD,OAAOjE,QAAQ,WAAWiE,OAAOjE,MAAM;AACzD,QAAI,CAACU,GAAI;AAET,UAAM;AAAA,MAAEyB,MAAMC;AAAAA,MAAa,GAAGC;AAAAA,IAAAA,IAAS4B;AACvC,UAAMC,WAAW3C,oBAAoBc,IAAI;AACzC,QAAI,CAAC/D,oBAAoB4F,UAAU1F,UAAU,GAAG;AAC9CiE,2BAAqB;AACrB;AAAA,IACF;AAEAqB,gBAAYnL,IAAI+H,IAAIwD,QAAQ;AAC5BH,sBAAkBpL,IAAI+H,IAAId,gBAAgBsE,UAAU1F,UAAU,CAAC;AAAA,EACjE;AAEA,MAAIuF,kBAAkBlI,OAAOgI,UAAU3E,QAAQ;AAC7CuD,yBAAqB;AAAA,EACvB;AAEA,SAAO;AAAA,IAAEqB;AAAAA,IAAaC;AAAAA,IAAmBtB;AAAAA,EAAAA;AAC3C;AAEA,MAAM0B,yBAAyB,OAAO;AAAA,EACpCpC;AAAAA,EACAiB;AAAAA,EACA3K;AAKF,MAAuE;AACrE,QAAM+L,cAAcrC;AAEpB,aAAWjK,SAASkL,UAAU;AAC5B,QAAI,CAAClL,MAAMqL,OAAO;AAChB,aAAO;AAAA,QAAEkB,KAAK;AAAA,QAAOrM,MAAM,CAAA;AAAA,MAAA;AAAA,IAC7B;AAEA,UAAMsM,cAAcF,YAAY3G,IAAKc,CAAAA,QAAQ;AAC3C,YAAMgG,WAAW3F,eAAeL,KAAKzG,MAAM+G,IAAI;AAC/C,YAAM9H,UAAUD,MAAMC,QAAQwN,QAAQ;AACtC,YAAMtB,OAAOlM,UAAUwN,WAAW,CAACA,QAAQ,GACxC9G,IAAKyF,CAAAA,cAAczC,aAAayC,SAAS,CAAC,EAC1CvE,OAAOM,OAAO;AAEjB,aAAO;AAAA,QACLV;AAAAA,QACAiG,UAAUD,aAAavN;AAAAA,QACvBD;AAAAA,QACAkM;AAAAA,MAAAA;AAAAA,IAEJ,CAAC;AAED,UAAMwB,SAASH,YAAYI,QAASC,CAAAA,eAAeA,WAAW1B,GAAG;AACjE,UAAM2B,SAAS,MAAMhB,uBAAuB;AAAA,MAC1CrN,WAAWuB,MAAMqL;AAAAA,MACjBF,KAAKwB;AAAAA,MACLpM;AAAAA,MACAmG,YAAY1G,MAAM+M;AAAAA,IAAAA,CACnB;AAED,QAAID,OAAOnC,oBAAoB;AAC7B,aAAO;AAAA,QAAE4B,KAAK;AAAA,QAAOrM,MAAM,CAAA;AAAA,MAAA;AAAA,IAC7B;AAEA,QAAI8M,oBAAoBF,OAAOb;AAE/B,QAAIjM,MAAMiN,OAAO;AACf,YAAMC,+BAAe7O,IAAAA;AACrB,iBAAW,CAACuK,IAAIwC,SAAS,KAAK0B,OAAOd,YAAYnE,WAAW;AAC1D,cAAMmB,UAAUM,mBAAmB8B,WAAWpL,MAAMiN,KAAK;AACzD,YAAIjE,YAAY,KAAM,QAAO;AAAA,UAAEuD,KAAK;AAAA,UAAOrM,MAAM,CAAA;AAAA,QAAA;AACjD,YAAI,CAAC8I,QAAS;AACd,cAAMf,YAAY+E,kBAAkBjM,IAAI6H,EAAE;AAC1C,YAAIX,UAAWiF,UAASrM,IAAI+H,IAAIX,SAAS;AAAA,MAC3C;AACA+E,0BAAoBE;AAAAA,IACtB;AAEA,QAAIlN,MAAMkL,UAAU9D,QAAQ;AAC1B,YAAM+F,eAAe,MAAMd,uBAAuB;AAAA,QAChDpC,MAAMjL,MAAMmF,KAAK6I,kBAAkBnB,OAAAA,CAAQ,EAAElG,IAAKyF,CAAAA,cAAc3D,SAAS2D,SAAS,CAAC;AAAA,QACnFF,UAAUlL,MAAMkL;AAAAA,QAChB3K;AAAAA,MAAAA,CACD;AACD,UAAI,CAAC4M,aAAaZ,KAAK;AACrB,eAAO;AAAA,UAAEA,KAAK;AAAA,UAAOrM,MAAM,CAAA;AAAA,QAAA;AAAA,MAC7B;AAEA8M,0BAAoBG,aAAajN,KAAKkN,OAAO,CAACC,KAAKjC,cAAc;AAC/D,cAAMxC,KAAKD,aAAayC,SAAS;AACjC,YAAIxC,GAAIyE,KAAIxM,IAAI+H,IAAIwC,SAAS;AAC7B,eAAOiC;AAAAA,MACT,GAAG,oBAAIhP,KAAsC;AAAA,IAC/C;AAEA,eAAWwO,cAAcL,aAAa;AACpC,UAAI,CAACK,WAAWH,SAAU;AAE1B,UAAI,CAACG,WAAW1B,IAAI/D,QAAQ;AAC1BE,uBAAeuF,WAAWpG,KAAKzG,MAAM+G,MAAM8F,WAAW5N,UAAU,CAAA,IAAK,IAAI;AACzE;AAAA,MACF;AAEA,UAAI4N,WAAW5N,SAAS;AACtB,YAAI4M,SAASgB,WAAW1B,IACrBxF,IAAKiD,QAAOoE,kBAAkBjM,IAAI6H,EAAE,CAAC,EACrC/B,OAAO,CAACuE,cAAoDjE,QAAQiE,SAAS,CAAC;AAEjF,YAAIpL,MAAMoF,SAASmD,MAAM;AACvBsD,mBAASA,OAAOtD,KAAK,CAACF,GAAGC,MAAMF,YAAYC,GAAGC,GAAGtI,MAAMoF,QAASmD,IAAK,CAAC;AAAA,QACxE;AAEA,YAAI,OAAOvI,MAAMoF,SAAS2E,UAAU,YAAYtK,OAAOC,SAASM,MAAMoF,QAAQ2E,KAAK,GAAG;AACpF8B,mBAASA,OAAOyB,MAAM,GAAG3N,KAAK4N,IAAI,GAAG5N,KAAKC,MAAMD,KAAKqK,IAAIhK,MAAMoF,QAAQ2E,KAAK,CAAC,CAAC,CAAC;AAAA,QACjF;AAEAzC,uBAAeuF,WAAWpG,KAAKzG,MAAM+G,MAAM8E,MAAM;AACjD;AAAA,MACF;AAEA,YAAMjN,QAAQoO,kBAAkBjM,IAAI8L,WAAW1B,IAAI,CAAC,CAAE;AACtD7D,qBAAeuF,WAAWpG,KAAKzG,MAAM+G,MAAMnI,SAAS,IAAI;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO;AAAA,IAAE2N,KAAK;AAAA,IAAMrM,MAAMoM;AAAAA,EAAAA;AAC5B;AAEO,MAAMkB,oBAAoB,OAA0C;AAAA,EACzE/O;AAAAA,EACAwB,QAAQ,CAAA;AAAA,EACRmF;AAQF,MAA2E;AACzE,QAAMqI,aAAa,MAAM9D,iBAA0C;AAAA,IACjElL;AAAAA,IACAwB;AAAAA,IACAmF,SAAS;AAAA,MACP7E,KAAK6E,QAAQ7E;AAAAA,MACbmG,YAAYtB,QAAQsB;AAAAA,MACpB6B,MAAMnD,QAAQmD;AAAAA,MACdwB,OAAO3E,QAAQ2E;AAAAA,IAAAA;AAAAA,IAEjBH,kBAAkB;AAAA,EAAA,CACnB;AAED,MAAI6D,WAAW9C,oBAAoB;AACjC,WAAO;AAAA,MACL4B,KAAK;AAAA,MACLrM,MAAM,CAAA;AAAA,MACNuK,SAASgD,WAAWhD;AAAAA,IAAAA;AAAAA,EAExB;AAEA,QAAMiD,iBAAiBD,WAAWvN,KAAKyF,IAAKc,SAAQqB,gBAAgBrB,KAAKrB,QAAQsB,UAAU,CAAC;AAC5F,QAAMiH,WAAW,MAAMtB,uBAAuB;AAAA,IAC5CpC,MAAMyD,eAAe/H,IAAKc,CAAAA,QAAQgB,SAAShB,GAAG,CAAC;AAAA,IAC/CyE,UAAU9F,QAAQ8F;AAAAA,IAClB3K,KAAK6E,QAAQ7E;AAAAA,EAAAA,CACd;AAED,MAAI,CAACoN,SAASpB,KAAK;AACjB,WAAO;AAAA,MACLA,KAAK;AAAA,MACLrM,MAAM,CAAA;AAAA,MACNuK,SAASgD,WAAWhD;AAAAA,IAAAA;AAAAA,EAExB;AAEA,SAAO;AAAA,IACL8B,KAAK;AAAA,IACLrM,MAAMyN,SAASzN;AAAAA,IACfuK,SAASgD,WAAWhD;AAAAA,EAAAA;AAExB;AAEO,MAAMkB,aAAa,OACxBlN,WACAyB,MACAK,QACkB;AAClB,QAAMsJ,aAAa,MAAM1E,cAAc1G,WAAW;AAAA,IAAE8B;AAAAA,EAAAA,CAAK;AAEzD,QAAMoM,SAASzM,KAAKyF,IAAKc,CAAAA,QAAQA,IAAIyB,GAAG,EAAErB,OAAOM,OAAO;AACxD,MAAI,CAACwF,OAAOvF,OAAQ;AAEpB,QAAM;AAAA,IAAE6C,MAAMqC;AAAAA,EAAAA,IAAgB,MAAMzC,WAAWK,KAAK;AAAA,IAClDC,UAAU;AAAA,MAAEjC,KAAK;AAAA,QAAEgE,KAAKS;AAAAA,MAAAA;AAAAA,IAAO;AAAA,IAC/BiB,QAAQ,CAAC,OAAO,MAAM;AAAA,IACtB7D,OAAO4C,OAAOvF;AAAAA,EAAAA,CACf;AAED,QAAMyG,kBAAkBvB,YAAYc,OAAgD,CAACC,KAAK5G,QAAQ;AAChG,UAAMmC,KAAKkF,OAAOrH,IAAIyB,OAAO,EAAE;AAC/B,QAAIU,GAAIyE,KAAIzE,EAAE,IAAInC;AAClB,WAAO4G;AAAAA,EACT,GAAG,CAAA,CAAE;AAEL,QAAMU,UAAU7N,KAAKyF,IAAKqI,CAAAA,aAAa;AACrC,UAAMC,aAAaJ,gBAAgBG,SAAS9F,GAAG,KAAK;AAAA,MAAEA,KAAK8F,SAAS9F;AAAAA,IAAAA;AACpE,UAAMgG,UAAUnI,OAAO8B,QAAQmG,QAAQ,EAAEZ,OAAgC,CAACC,KAAK,CAAClM,KAAKvC,KAAK,MAAM;AAC9F,YAAMwH,SAASjF,QAAQ,SAASA,IAAIgI,WAAW,GAAG,IAAI,GAAGrH,iBAAiB,GAAGX,GAAG,KAAKA;AACrFkM,UAAIjH,MAAM,IAAIxH;AACd,aAAOyO;AAAAA,IACT,GAAG;AAAA,MAAE,GAAGY;AAAAA,IAAAA,CAAY;AAEpB,UAAME,MAAMF,WAAW5D;AACvB,QAAI,OAAO8D,QAAQ,YAAYA,KAAK;AAClCD,cAAQ7D,OAAO8D;AAAAA,IACjB,OAAO;AACL,aAAOD,QAAQ7D;AAAAA,IACjB;AAEA,WAAO6D;AAAAA,EACT,CAAC;AAED,QAAMrE,WAAWuE,SAASL,OAAO;AACnC;AAEO,MAAMM,aAAa,OAAO5P,WAAmB0M,KAAe5K,QAA+B;AAChG,QAAMsJ,aAAa,MAAM1E,cAAc1G,WAAW;AAAA,IAAE8B;AAAAA,EAAAA,CAAK;AAEzD,QAAMoM,SAASxB,IAAIxF,IAAKiD,CAAAA,OAAOkF,OAAOlF,MAAM,EAAE,CAAC,EAAE/B,OAAOM,OAAO;AAC/D,MAAI,CAACwF,OAAOvF,OAAQ;AAEpB,QAAM;AAAA,IAAE6C,MAAMqC;AAAAA,EAAAA,IAAgB,MAAMzC,WAAWK,KAAK;AAAA,IAClDC,UAAU;AAAA,MAAEjC,KAAK;AAAA,QAAEgE,KAAKS;AAAAA,MAAAA;AAAAA,IAAO;AAAA,IAC/BiB,QAAQ,CAAC,OAAO,MAAM;AAAA,IACtB7D,OAAO4C,OAAOvF;AAAAA,EAAAA,CACf;AAED,QAAMkH,YAAYhC,YACf3G,IAAKc,CAAAA,SAAS;AAAA,IACbyB,KAAK4F,OAAQrH,KAA2ByB,OAAO,EAAE;AAAA,IACjDmC,MAAO5D,KAA4B4D;AAAAA,IACnCkE,UAAU;AAAA,EAAA,EACV,EACD1H,OAAQJ,CAAAA,QAAQA,IAAIyB,OAAO,OAAOzB,IAAI4D,SAAS,YAAY5D,IAAI4D,IAAI;AAEtE,MAAI,CAACiE,UAAUlH,OAAQ;AACvB,QAAMyC,WAAWuE,SAASE,SAAS;AACrC;AAEO,MAAME,oBAAoB,OAAO/P,WAAmB8B,QAA+B;AACxF,QAAMsJ,aAAa,MAAM1E,cAAc1G,WAAW;AAAA,IAAE8B;AAAAA,EAAAA,CAAK;AACzD,QAAMsC,SAASO,UAAAA;AACf,QAAMiB,SAAS,GAAG9D,GAAG,IAAI9B,SAAS;AAClC0D,cAAYf,OAAO,GAAGyB,MAAM,GAAGwB,MAAM,EAAE;AACvCE,mBAAiB1B,QAAQwB,MAAM;AAC/B,QAAMwF,WAAW4E,QAAAA;AACnB;AAEO,MAAMC,qBAAqBA,CAAC;AAAA,EAAEpO;AAAAA,EAAUsC;AAAgD,MAAc;AAC3GH,kBAAAA;AACA,QAAMY,aAAaV,kBAAkB;AAAA,IAAErC;AAAAA,IAAUsC;AAAAA,EAAAA,CAAS;AAC1D,QAAM+L,YAAY3L,mBAAmB;AAAA,IAAE1C;AAAAA,IAAUsC;AAAAA,EAAAA,CAAS,KAAKS;AAC/D,QAAMuL,UAAU5P,MAAMmF,KAAKZ,YAAYoL,SAAS,CAAC;AACjD,QAAME,UAAU7P,MAAMmF,KAAKhC,YAAY0F,SAAS,EAC7ChB,OAAO,CAAC,CAAC1F,GAAG,MAAMA,IAAIgI,WAAWwF,SAAS,CAAC,EAC3ChJ,IAAI,CAAC,CAAA,EAAGL,EAAE,MAAMA,EAAE;AAErB,QAAM,YAAY;AAChB,UAAMwJ,YAAY,IAAIpL,IAAIkL,OAAO;AAEjC,UAAMhK,QAAQC,IAAIgK,QAAQlJ,IAAKL,QAAOA,GAAGmJ,UAAUM,MAAM,MAAM;AAAA,IAAC,CAAC,CAAC,CAAC;AAEnE,QAAID,UAAU/K,MAAM;AAClB,YAAMe,UAAU,MAAMN,WAAAA;AACtB,YAAMwK,mBAAoBlK,QAAQmK,WAAW,CAAA,CAAE,KAAKnK;AACpDkK,uBAAiBnM,SAAS8L;AAE1B,YAAM/J,QAAQC,IAAI7F,MAAMmF,KAAK2K,SAAS,EAAEnJ,IAAI,OAAOuJ,SAAS;AAC1D,cAAM5J,KAAK,IAAI0J,iBAAiBE,MAAM;AAAA,UAAE3J,SAAS;AAAA,UAAaC,YAAY;AAAA,QAAA,CAAG;AAC7E,cAAMF,GAAGmJ,UAAUU,KAAK,MAAM;AAC5BL,oBAAU1N,OAAO8N,IAAI;AAAA,QACvB,CAAC,EAAEH,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACnB,CAAC,CAAC;AAAA,IACJ;AAEA,QAAID,UAAU/K,MAAM;AAClBD,qBAAe6K,WAAWG,SAAS;AAAA,IACrC,OAAO;AACLhL,qBAAe6K,WAAW,oBAAIjL,KAAK;AAAA,IACrC;AAAA,EACF,GAAA;AAEA,QAAM0L,YAAY,GAAG/L,UAAU,SAASgM,KAAKC,IAAAA,EAAMC,SAAS,EAAE,CAAC;AAC/D,MAAI;AACF9O,WAAOwC,aAAagB,QAAQlB,qBAAqB;AAAA,MAAEzC;AAAAA,MAAUsC;AAAAA,IAAAA,CAAS,GAAGwM,SAAS;AAAA,EACpF,QAAQ;AACN,WAAOA;AAAAA,EACT;AAEAlN,sBAAoB;AACpBC,cAAYvB,MAAAA;AACZ,SAAOwO;AACT;AAEO,MAAMI,wBAAwB,YAA2B;AAC9D,QAAMC,MAAMzQ,MAAMmF,KAAKhC,YAAY0J,QAAQ;AAC3C,QAAMjH,QAAQC,IAAI4K,IAAI9J,IAAKL,QAAOA,GAAGmJ,QAAAA,CAAS,CAAC;AAC/CtM,cAAYvB,MAAAA;AACd;ACt4BA,MAAM8O,2BAA2B;AAmBjC,MAAMC,qBAAqBA,CAACjJ,eAA+C;AACzE,QAAMkJ,SAAyB,CAAA;AAC/B,aAAWzO,OAAO4E,OAAOG,KAAKQ,UAAU,EAAE6B,QAAQ;AAChDqH,WAAOzO,GAAG,IAAIuF,WAAWvF,GAAG;AAAA,EAC9B;AACA,SAAOyO;AACT;AAEA,MAAMC,0BAA0BA,CAC9BjR,OACA8L,QACAoF,UAC+B;AAC/B,MAAI,CAAClR,SAAS,OAAOA,UAAU,YAAYI,MAAMC,QAAQL,KAAK,EAAG,QAAOM;AACxE,QAAMC,MAAMP;AACZ,QAAMC,aAA6B,CAAA;AACnC,MAAIkR,aAAa;AAEjB,aAAW,CAAC5O,KAAKsL,QAAQ,KAAK1G,OAAO8B,QAAQ1I,GAAG,GAAG;AACjD,UAAM4H,OAAO5F,IAAIrC,KAAAA;AACjB,QAAI,CAACiI,KAAM;AACX,QAAI0F,aAAa,KAAKA,aAAa,MAAM;AACvC5N,iBAAWkI,IAAI,IAAI;AACnB;AAAA,IACF;AACA,QAAI0F,aAAa,KAAKA,aAAa,OAAO;AACxCsD,mBAAa;AACb;AAAA,IACF;AACA,QAAI,OAAOtD,aAAa,YAAYhN,OAAOC,SAAS+M,QAAQ,GAAG;AAC7D,UAAIA,aAAa,EAAG5N,YAAWkI,IAAI,IAAI;AACvC,UAAI0F,aAAa,EAAGsD,cAAa;AAAA,IACnC;AAAA,EACF;AAEA,MAAIA,YAAY;AACd,UAAM,IAAIrN,MAAM,GAAGgI,MAAM,KAAKoF,KAAK,IAAIJ,wBAAwB,EAAE;AAAA,EACnE;AAEA,SAAO3J,OAAOG,KAAKrH,UAAU,EAAEuI,SAAS,IAAIuI,mBAAmB9Q,UAAU,IAAIK;AAC/E;AAEA,MAAM8Q,wBAAwBA,CAACpR,OAAe8L,WAA+C;AAC3F,QAAMuF,SAASrR,MACZqI,MAAM,KAAK,EACXtB,IAAKuK,CAAAA,UAAUA,MAAMpR,KAAAA,CAAM,EAC3B+H,OAAOM,OAAO;AAEjB,MAAI,CAAC8I,OAAO7I,OAAQ,QAAOlI;AAC3B,QAAML,aAA6B,CAAA;AAEnC,aAAWqR,SAASD,QAAQ;AAC1B,QAAIlJ,OAAOmJ;AAEX,QAAIA,MAAM/G,WAAW,GAAG,GAAG;AACzB,YAAM,IAAIzG,MAAM,GAAGgI,MAAM,qBAAqBgF,wBAAwB,EAAE;AAAA,IAC1E,WAAWQ,MAAM/G,WAAW,GAAG,GAAG;AAChCpC,aAAOmJ,MAAM5C,MAAM,CAAC;AAAA,IACtB;AAEAvG,WAAOA,KAAKjI,KAAAA;AACZ,QAAI,CAACiI,KAAM;AACXlI,eAAWkI,IAAI,IAAI;AAAA,EACrB;AAEA,SAAOhB,OAAOG,KAAKrH,UAAU,EAAEuI,SAAS,IAAIuI,mBAAmB9Q,UAAU,IAAIK;AAC/E;AAEA,MAAMiR,0BAA0BA,CAACvR,OAAgB8L,WAA+C;AAC9F,MAAI,OAAO9L,UAAU,UAAU;AAC7B,WAAOoR,sBAAsBpR,OAAO8L,MAAM;AAAA,EAC5C;AACA,SAAOmF,wBAAwBjR,OAAO8L,QAAQ,iBAAiB;AACjE;AAEA,MAAM0F,2BAA2BA,CAACxR,UAAiE;AACjG,MAAI,CAACA,SAAS,OAAOA,UAAU,YAAYI,MAAMC,QAAQL,KAAK,EAAG,QAAOM;AACxE,QAAMC,MAAMP;AACZ,QAAMC,aAA+C,CAAA;AAErD,MAAIM,IAAIoJ,QAAQ,OAAOpJ,IAAIoJ,SAAS,YAAY,CAACvJ,MAAMC,QAAQE,IAAIoJ,IAAI,GAAG;AACxE,UAAM8H,UAAUlR,IAAIoJ;AACpB,UAAMA,OAA+B,CAAA;AAErC,eAAW,CAACpH,KAAKmP,YAAY,KAAKvK,OAAO8B,QAAQwI,OAAO,GAAG;AACzD,YAAMtJ,OAAO5F,IAAIrC,KAAAA;AACjB,UAAI,CAACiI,KAAM;AACX,UAAIuJ,iBAAiB,KAAKA,iBAAiB,OAAO;AAChD/H,aAAKxB,IAAI,IAAI;AACb;AAAA,MACF;AACA,UAAIuJ,iBAAiB,MAAMA,iBAAiB,QAAQ;AAClD/H,aAAKxB,IAAI,IAAI;AAAA,MACf;AAAA,IACF;AAEA,QAAIhB,OAAOG,KAAKqC,IAAI,EAAEnB,SAAS,GAAG;AAChCvI,iBAAW0J,OAAOA;AAAAA,IACpB;AAAA,EACF;AAEA,MAAI,OAAOpJ,IAAI4K,UAAU,YAAYtK,OAAOC,SAASP,IAAI4K,KAAK,GAAG;AAC/DlL,eAAWkL,QAAQpK,KAAK4N,IAAI,GAAG5N,KAAKC,MAAMD,KAAKqK,IAAI7K,IAAI4K,KAAK,CAAC,CAAC;AAAA,EAChE;AAEA,SAAOhE,OAAOG,KAAKrH,UAAU,EAAEuI,SAAS,IAAIvI,aAAaK;AAC3D;AAEA,MAAMqR,kBAAkBA,CAAC3R,UAAuC;AAC9D,MAAI,OAAOA,UAAU,SAAU,QAAOM;AACtC,QAAML,aAAaD,MAAME,KAAAA;AACzB,SAAOD,cAAcK;AACvB;AAEA,MAAMsR,kBAAkBA,CAAC5R,UAA2C;AAClE,MAAI,CAACA,SAAS,OAAOA,UAAU,YAAYI,MAAMC,QAAQL,KAAK,EAAG,QAAOM;AACxE,SAAON;AACT;AAEA,MAAM6R,0BAA0BA,CAC9B7R,OACA8L,WAC0B;AAC1B,QAAM3D,OAAOwJ,gBAAgB3R,MAAMmI,IAAI;AACvC,MAAI,CAACA,MAAM;AACT,UAAM,IAAIrE,MAAM,GAAGgI,MAAM,iDAAiD;AAAA,EAC5E;AAEA,QAAMqC,SAASoD,wBAAwBvR,MAAMmO,QAAQrC,MAAM;AAC3D,MAAI,CAACqC,QAAQ;AACX,UAAM,IAAIrK,MAAM,GAAGgI,MAAM,oDAAoD;AAAA,EAC/E;AAEA,QAAMa,SAAS3M,MAAMsM,aAAahM,SAC9BwR,wBAAwB9R,MAAMsM,UAAUR,MAAM,IAC9CxL;AAEJ,SAAO;AAAA,IACL6H;AAAAA,IACAgG;AAAAA,IACA,GAAIwD,gBAAgB3R,MAAMyM,KAAK,IAAI;AAAA,MAAEA,OAAOkF,gBAAgB3R,MAAMyM,KAAK;AAAA,IAAA,IAAM,CAAA;AAAA,IAC7E,GAAImF,gBAAgB5R,MAAMqO,KAAK,IAAI;AAAA,MAAEA,OAAOuD,gBAAgB5R,MAAMqO,KAAK;AAAA,IAAA,IAAM,CAAA;AAAA,IAC7E,GAAImD,yBAAyBxR,MAAMwG,OAAO,IAAI;AAAA,MAAEA,SAASgL,yBAAyBxR,MAAMwG,OAAO;AAAA,IAAA,IAAM,CAAA;AAAA,IACrG,GAAImG,UAAUA,OAAOnE,SAAS,IAAI;AAAA,MAAE8D,UAAUK;AAAAA,IAAAA,IAAW,CAAA;AAAA,EAAC;AAE9D;AAEA,MAAMmF,0BAA0BA,CAC9B9R,OACA8L,WAC4B;AAC5B,MAAI,OAAO9L,UAAU,UAAU;AAC7B,UAAM,IAAI8D,MAAM,GAAGgI,MAAM,2EAA2E;AAAA,EACtG;AAEA,MAAI1L,MAAMC,QAAQL,KAAK,GAAG;AACxB,QAAIA,MAAMwI,WAAW,GAAG;AACtB,YAAM,IAAI1E,MAAM,GAAGgI,MAAM,4CAA4C;AAAA,IACvE;AACA,WAAO9L,MAAM+G,IAAK3F,CAAAA,UAAU;AAC1B,UAAI,OAAOA,UAAU,UAAU;AAC7B,cAAM,IAAI0C,MAAM,GAAGgI,MAAM,2EAA2E;AAAA,MACtG;AACA,aAAO+F,wBAAwBzQ,OAAO0K,MAAM;AAAA,IAC9C,CAAC;AAAA,EACH;AAEA,SAAO,CAAC+F,wBAAwB7R,OAAO8L,MAAM,CAAC;AAChD;AAEO,MAAMiG,8BAA8BA,CACzCvL,SACAsF,WAC6C;AAC7C,MAAI,CAACtF,QAAQ8F,SAAU,QAAOhM;AAE9B,QAAM0R,iBAAiBf,wBAAwBzK,QAAQsB,YAAYgE,QAAQ,YAAY;AACvF,MAAI,CAACkG,gBAAgB;AACnB,UAAM,IAAIlO,MAAM,GAAGgI,MAAM,gDAAgD;AAAA,EAC3E;AAEA,QAAMQ,WAAWwF,wBAAwBtL,QAAQ8F,UAAUR,MAAM;AACjE,MAAI,CAACQ,SAAS9D,QAAQ;AACpB,UAAM,IAAI1E,MAAM,GAAGgI,MAAM,4CAA4C;AAAA,EACvE;AAEA,SAAO;AAAA,IACLkG;AAAAA,IACA1F;AAAAA,EAAAA;AAEJ;AClNO,MAAM2F,qBAAqBA,CAAC5Q,OAAmBmF,YAAqC;AACzF,QAAMjE,MAAMiE,QAAQjE,OAAO;AAC3B,QAAMuF,aAAatB,QAAQsB,aAAa/C,KAAKO,UAAUkB,QAAQsB,UAAU,IAAI;AAC7E,QAAM6B,OAAOnD,QAAQmD,OAAO5E,KAAKO,UAAUkB,QAAQmD,IAAI,IAAI;AAC3D,QAAMwB,QAAQ,OAAO3E,QAAQ2E,UAAU,WAAW+D,OAAO1I,QAAQ2E,KAAK,IAAI;AAC1E,QAAMmB,WAAW9F,QAAQ8F,WAAWvH,KAAKO,UAAUkB,QAAQ8F,QAAQ,IAAI;AACvE,QAAM4F,aAAa1L,QAAQ0L,aAAanN,KAAKO,UAAUkB,QAAQ0L,UAAU,IAAI;AAC7E,SAAO,GAAG3P,GAAG,GAAGwC,KAAKO,UAAUjE,KAAK,CAAC,GAAGyG,UAAU,GAAG6B,IAAI,GAAGwB,KAAK,GAAGmB,QAAQ,GAAG4F,UAAU;AAC3F;ACsGA,MAAMC,wBAAwB;AAC9B,MAAMC,oBAAoB;AAC1B,MAAMC,cAAc;AACpB,MAAMC,gCAAgC;AACtC,MAAMC,gCAAgC;AACtC,MAAMC,kCAAkC;AAExC,IAAIC,SAA2B;AAC/B,IAAIC,iBAAuC;AAC3C,IAAIC,qBAAqB;AAEzB,IAAIC,kBAAiC;AACrC,IAAIC,aAA4B;AAChC,IAAIC,iBAAoC,CAAA;AAExC,MAAMC,cAAwB,CAAA;AAE9B,MAAMC,qCAAqBvT,IAAAA;AAC3B,MAAMwT,oCAAoBxT,IAAAA;AAC1B,MAAMyT,uCAAuBzT,IAAAA;AAE7B,IAAI0T,iBAAgC;AACpC,IAAIC,oBAAoB;AACxB,IAAIC,2BAA2B;AAC/B,IAAIC,+BAA+B;AAEnC,IAAIC,cAAoC;AACxC,IAAIC,UAAyB;AAE7B,MAAM3P,gBAAgBA,MAAM;AAC1B,MAAI,OAAOhC,WAAW,aAAa;AACjC,UAAM,IAAIiC,MAAM,sDAAsD;AAAA,EACxE;AACF;AAEA,MAAM2P,iBAAiBA,CAAC/R,UAAkBgS,MAAclN,YAAuC;AAC7F,MAAIA,QAAQmN,KAAK;AACf,UAAMA,MAAM,IAAIC,IAAIpN,QAAQmN,GAAG;AAC/BA,QAAIE,aAAa5R,IAAIkQ,uBAAuBzQ,QAAQ;AACpD,WAAOiS,IAAIhD,SAAAA;AAAAA,EACb;AAEA,QAAMmD,OAAO,IAAIF,IAAI/R,OAAOkS,SAASC,IAAI;AACzCF,OAAKG,WAAWH,KAAKG,aAAa,WAAW,SAAS;AACtDH,OAAKI,WAAW1N,QAAQ2B,QAAQ;AAChC2L,OAAKK,SAAS;AACdL,OAAKM,OAAO;AACZN,OAAKD,aAAa5R,IAAIkQ,uBAAuBzQ,QAAQ;AACrD,SAAOoS,KAAKnD,SAAAA;AACd;AAEA,MAAM0D,eAAeA,CAACC,YAAiC;AACrD,MAAI,CAAC7B,OAAQ;AACb,MAAIA,OAAO8B,eAAeC,UAAUC,KAAM;AAC1ChC,SAAOiC,KAAK3P,KAAKO,UAAUgP,OAAO,CAAC;AACrC;AAEA,MAAMK,iBAAiBA,CAAC;AAAA,EAAEC;AAAkD,MAAY;AACtF,aAAWC,OAAO5B,cAAchG,UAAU;AACxC,UAAM6H,kBAAkBF,qBAAqBC,IAAIE;AACjDV,iBAAa;AAAA,MACXW,MAAM;AAAA,MACNnV,WAAWgV,IAAIhV;AAAAA,MACfC,UAAU+U,IAAI/U;AAAAA,MACduB,OAAOwT,IAAIxT;AAAAA,MACXmF,SAASqO,IAAIrO;AAAAA,MACbsO;AAAAA,IAAAA,CACD;AAAA,EACH;AACF;AAEA,MAAMG,sBAAsBA,MAAM;AAChC,MAAI9B,mBAAmB,KAAM;AAC7B,MAAI,OAAOtR,WAAW,aAAa;AACjCA,WAAOqT,aAAa/B,cAAc;AAAA,EACpC;AACAA,mBAAiB;AACnB;AAEA,MAAMgC,oBAAoBA,MAAM;AAC9BF,sBAAAA;AACA,MAAItC,oBAAoB;AACtBW,mCAA+B;AAC/B;AAAA,EACF;AACA,MAAI,CAACV,mBAAmB,CAACC,WAAY;AAErC,QAAMuC,MAAMtC,eAAeuC,aAAa,CAAA;AACxC,QAAMC,cAAcF,IAAIG,YAAY;AACpC,QAAMC,UAAUJ,IAAII,WAAW;AAC/B,QAAMC,aAAaL,IAAIK,cAAc;AAErC,MAAIrC,qBAAqBkC,YAAa;AAEtC,MAAII,QAAQ3U,KAAK4U,IAAIF,YAAYD,UAAUzU,KAAK6U,IAAI,GAAGxC,iBAAiB,CAAC;AACzE,MAAIE,8BAA8B;AAChC,UAAMuC,OAAOtD,gCAAgCD;AAC7CoD,YAAQpD,gCAAgCvR,KAAKC,MAAMD,KAAK+U,OAAAA,KAAYD,OAAO,EAAE;AAC7EvC,mCAA+B;AAAA,EACjC;AACAF,uBAAqB;AACrBD,mBAAiBtR,OAAOkU,WAAW,MAAM;AACvC,SAAKC,gBAAgBpD,iBAAkBC,YAAaC,gBAAgB;AAAA,MAAEmD,wBAAwB;AAAA,IAAA,CAAO;AAAA,EACvG,GAAGP,KAAK;AACV;AAEA,MAAMQ,cAAcA,CAACrO,QAAmC;AACtD,MAAI,CAACA,OAAO,OAAOA,QAAQ,SAAU,QAAO;AAC5C,SAAO,OAAQA,IAA0ByB,QAAQ;AACnD;AAEA,MAAMnJ,sBAAoBA,CAACH,UAAmD;AAC5E,MAAI,CAACA,SAAS,OAAOA,UAAU,SAAU,QAAOM;AAChD,MAAIF,MAAMC,QAAQL,KAAK,EAAG,QAAOM;AAEjC,QAAMC,MAAMP;AAOZ,MAAI,OAAOO,IAAIC,gBAAgB,aAAa,OAAOD,IAAIE,gBAAgB,UAAW,QAAOH;AAEzF,QAAMI,aAAa,OAAOH,IAAIG,eAAe,YAAYH,IAAIG,aAAaH,IAAIG,aAAaJ;AAC3F,QAAMK,aAAa,OAAOJ,IAAII,eAAe,YAAYJ,IAAII,aAAaJ,IAAII,aAAaL;AAE3F,SAAO;AAAA,IACLE,aAAaD,IAAIC;AAAAA,IACjBC,aAAaF,IAAIE;AAAAA,IACjB,GAAIC,aAAa;AAAA,MAAEA;AAAAA,IAAAA,IAAe,CAAA;AAAA,IAClC,GAAIC,aAAa;AAAA,MAAEA;AAAAA,IAAAA,IAAe,CAAA;AAAA,EAAC;AAEvC;AAEA,MAAMC,wBAAsBA,CAACZ,UAAuC;AAClE,MAAI,OAAOA,UAAU,SAAU,QAAOM;AACtC,MAAI,CAACO,OAAOC,SAASd,KAAK,KAAKA,QAAQ,EAAG,QAAOM;AACjD,SAAOS,KAAKC,MAAMhB,KAAK;AACzB;AAEA,MAAMmW,qBAAqBA,CAACC,YAA+D;AACzF,QAAM;AAAA,IAAEvW;AAAAA,IAAWC;AAAAA,IAAUwB;AAAAA,IAAM+U;AAAAA,IAAOC;AAAAA,EAAAA,IAAUF;AACpD,QAAMG,QAAQ,GAAG1W,SAAS,IAAIC,QAAQ;AACtC,QAAM0W,YAAYxD,eAAe7Q,IAAIoU,KAAK;AAC1C,MAAI,CAACC,aAAa,CAACA,UAAUrR,KAAM;AACnC,QAAMsR,eAAexD,cAAc9Q,IAAIoU,KAAK;AAC5C,QAAMhV,WAAWpB,oBAAkBiW,QAAQ7U,QAAQ;AACnD,QAAMC,aAAaZ,sBAAoBwV,QAAQ5U,UAAU;AACzD,QAAMkV,gBAAgBD,cAAcC;AACpC,QAAMC,cAAcpO,QAAQmO,aAAa;AACzC,QAAME,gBAAgBrO,QAAQkO,cAAcjQ,SAAS0L,cAAc3Q,YAAYC,eAAelB,MAAS;AAEvG,QAAMuW,UAAU,CAAC,EAAEP,SAASvD,YAAY+D,SAASR,KAAK;AACtD,QAAMzK,UAAkC;AAAA,IACtCC,QAAQ;AAAA,IACR+K;AAAAA,IACAP;AAAAA,IACA,GAAI/U,WAAW;AAAA,MAAEA;AAAAA,IAAAA,IAAa,CAAA;AAAA,IAC9B,GAAIC,eAAelB,SAAY;AAAA,MAAEkB;AAAAA,IAAAA,IAAe,CAAA;AAAA,EAAC;AAGnD,MAAI6U,OAAO;AACT,eAAWU,MAAMP,UAAWO,IAAGV,OAAO/V,QAAWuL,OAAO;AACxD;AAAA,EACF;AAEA,aAAWkL,MAAMP,UAAWO,IAAG,MAAMzV,MAAMuK,OAAO;AAElD,MAAI,CAACgH,WAAY;AAEjB,QAAMxH,OAAOjL,MAAMC,QAAQiB,IAAI,IAAIA,KAAK2G,OAAOiO,WAAW,IAAI,CAAA;AAE9D,MAAIU,cAAe;AAEnB,MAAI,CAACvL,KAAK7C,OAAQ;AAElB,MAAImO,eAAeD,eAAe;AAChC,SAAK7J,oBAAoB;AAAA,MACvBhN;AAAAA,MACAyB,MAAM+J;AAAAA,MACN1J,KAAKkR;AAAAA,MACLvG,UAAUoK,cAAcpK;AAAAA,IAAAA,CACzB,EAAE6D,MAAM,MAAM;AAAA,IAAC,CAAC;AACjB;AAAA,EACF;AAEA,OAAKpD,WAAWlN,WAAWwL,MAAMwH,UAAU,EACxC1C,MAAM,MAAM;AAAA,EAAC,CAAC;AACnB;AAEA,MAAM6G,cAAcA,CAACZ,YAAuD;AAC1E,QAAMI,YAAYtD,iBAAiB/Q,IAAIiU,QAAQa,KAAK;AACpD,MAAI,CAACT,aAAa,CAACA,UAAUrR,KAAM;AACnC,aAAW4R,MAAMP,UAAWO,IAAGX,QAAQA,OAAO;AAChD;AAEA,MAAMc,gBAAgBA,CAACD,UAAwB;AAC7C,MAAIlV;AACJ,MAAI;AACFA,aAASgD,KAAKC,MAAM,OAAOiS,MAAM3V,SAAS,WAAW2V,MAAM3V,OAAO4N,OAAO+H,MAAM3V,IAAI,CAAC;AAAA,EACtF,QAAQ;AACN;AAAA,EACF;AAEA,MAAI,CAACS,UAAU,OAAOA,WAAW,SAAU;AAC3C,QAAMuS,UAAUvS;AAEhB,MAAIuS,QAAQU,SAAS,iBAAiB;AACpCmB,uBAAmB7B,OAAO;AAC1B;AAAA,EACF;AAEA,MAAIA,QAAQU,SAAS,SAAS;AAC5BgC,gBAAY1C,OAAO;AAAA,EACrB;AACF;AAEO,MAAM6C,cAAcA,CAACb,UAAwB;AAClD,MAAI,CAACA,MAAO;AACZvD,cAAYtR,KAAK6U,KAAK;AACtB,MAAIvD,YAAYvK,SAAS6J,aAAa;AACpCU,gBAAYqE,MAAAA;AAAAA,EACd;AACF;AASA,MAAMC,oBAAoBA,CAAC;AAAA,EAAE3V;AAAAA,EAAUC;AAAAA,EAAKqC;AAA6D,MACvG,qBAAqBA,WAAW,EAAE,IAAItC,QAAQ,IAAIC,GAAG;AAEvD,MAAM2V,gBAAgBA,CAAC/U,QAAwB;AAC7C,MAAI;AACF,UAAMhC,MAAMsB,OAAOwC,aAAaC,QAAQ/B,GAAG;AAC3C,UAAMgV,MAAMhX,MAAMM,OAAON,GAAG,IAAI;AAChC,WAAOM,OAAOC,SAASyW,GAAG,KAAKA,OAAO,IAAIxW,KAAKC,MAAMuW,GAAG,IAAI;AAAA,EAC9D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,MAAMC,iBAAiBA,CAACjV,KAAavC,UAAwB;AAC3D,MAAI;AACF6B,WAAOwC,aAAagB,QAAQ9C,KAAK2M,OAAOnO,KAAK4N,IAAI,GAAG5N,KAAKC,MAAMhB,KAAK,CAAC,CAAC,CAAC;AAAA,EACzE,QAAQ;AACN;AAAA,EACF;AACF;AAEA,MAAMyX,mBAAmB,OAAOC,SAA4B/V,QAA+B;AACzF,QAAMgW,kCAAkB7S,IAAAA;AACxB,QAAM8S,qCAAqBnY,IAAAA;AAE3B,aAAWoY,UAAUH,SAAS;AAC5B,UAAM7X,YAAY,OAAOgY,OAAOhY,cAAc,WAAWgY,OAAOhY,YAAY;AAC5E,QAAI,CAACA,UAAW;AAEhB,QAAIgY,OAAOC,OAAO,eAAe;AAC/BH,kBAAY1S,IAAIpF,SAAS;AACzB;AAAA,IACF;AAEA,QAAIgY,OAAOC,OAAO,UAAU;AAC1B,YAAMC,QAAQ,OAAOF,OAAOE,UAAU,WAAWF,OAAOE,QAAQ;AAChE,UAAI,CAACA,MAAO;AACZ,YAAMnT,WAAWgT,eAAezV,IAAItC,SAAS,KAAK,CAAA;AAClD+E,eAASnD,KAAKsW,KAAK;AACnBH,qBAAe3V,IAAIpC,WAAW+E,QAAQ;AAAA,IACxC;AAAA,EACF;AAEA,aAAW/E,aAAa8X,aAAa;AACnC,UAAM/H,kBAAkB/P,WAAW8B,GAAG,EAAEwO,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACxD;AAEA,aAAW,CAACtQ,WAAW0M,GAAG,KAAKqL,eAAe3O,WAAW;AACvD,QAAI0O,YAAYjS,IAAI7F,SAAS,EAAG;AAChC,UAAM4P,WAAW5P,WAAW0M,KAAK5K,GAAG,EAAEwO,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACtD;AACF;AAEO,MAAM6H,iBAAiB,OAAOtW,UAAkBC,KAAa6E,UAA8C,CAAA,MAAsB;AACtI3C,gBAAAA;AACA,MAAI,CAACnC,YAAY,CAACC,IAAK;AAEvB,QAAMsW,aAAaZ,kBAAkB;AAAA,IAAE3V;AAAAA,IAAUC;AAAAA,IAAKqC,SAASwC,QAAQxC;AAAAA,EAAAA,CAAS;AAChF,MAAIkU,WAAWZ,cAAcW,UAAU;AAEvC,WAAStP,IAAI,GAAGA,IAAI,IAAIA,KAAK,GAAG;AAC9B,UAAMgL,MAAM,GAAGvB,iBAAiB,IAAID,qBAAqB,IAAIgG,mBAAmBzW,QAAQ,CAAC;AACzF,UAAM0W,WAAW,MAAMC,MAAM1E,KAAK;AAAA,MAChC2E,QAAQ;AAAA,MACRC,aAAa;AAAA,MACbC,SAAS;AAAA,QAAE,gBAAgB;AAAA,MAAA;AAAA,MAC3BC,MAAM1T,KAAKO,UAAU;AAAA,QAAE4S;AAAAA,QAAU/M,OAAO;AAAA,MAAA,CAAM;AAAA,IAAA,CAC/C;AAED,QAAI,CAACiN,SAASM,GAAI;AAElB,UAAMtC,UAAmB,MAAMgC,SAASO,OAAOxI,MAAM,MAAM,IAAI;AAC/D,QAAI,CAACiG,WAAW,OAAOA,YAAY,SAAU;AAC7C,UAAMwC,aAAaxC;AACnB,UAAMsC,KAAKE,WAAWF;AACtB,QAAIA,OAAO,KAAM;AAEjB,UAAMG,YAAYhY,OAAO+X,WAAWC,aAAa,CAAC;AAClD,UAAMC,kBAAkBvQ,QAAQqQ,WAAWE,eAAe;AAE1D,QAAIA,iBAAiB;AACnBhJ,yBAAmB;AAAA,QAAEpO;AAAAA,QAAUsC,SAASwC,QAAQxC;AAAAA,MAAAA,CAAS;AACzDwT,qBAAeS,YAAYY,SAAS;AACpC;AAAA,IACF;AAEA,UAAME,aAAaH,WAAWlB;AAC9B,UAAMA,UAAUtX,MAAMC,QAAQ0Y,UAAU,IAAIA,aAAa,CAAA;AACzD,UAAM9Y,aAAayX,QAChB3Q,IAAI,CAACiS,OAA8B;AAClC,UAAI,CAACA,MAAK,OAAOA,OAAM,SAAU,QAAO;AACxC,YAAM/R,MAAM+R;AAEZ,YAAMC,MAAMpY,OAAOoG,IAAIgS,OAAO,CAAC;AAC/B,YAAMpZ,YAAY,OAAOoH,IAAIpH,cAAc,WAAWoH,IAAIpH,YAAYqP,OAAOjI,IAAIpH,aAAa,EAAE;AAChG,YAAMiY,KAAK7Q,IAAI6Q,OAAO,gBAAgB,gBAAgB;AACtD,YAAMC,QAAQ,OAAO9Q,IAAI8Q,UAAU,YAAY9Q,IAAI8Q,QAAQ9Q,IAAI8Q,QAAQ9Q,IAAI8Q,QAAQ7I,OAAOjI,IAAI8Q,KAAK,IAAIzX;AAEvG,aAAO;AAAA,QAAE2Y;AAAAA,QAAKpZ;AAAAA,QAAWiY;AAAAA,QAAI,GAAIC,QAAQ;AAAA,UAAEA;AAAAA,QAAAA,IAAU,CAAA;AAAA,MAAC;AAAA,IACxD,CAAC,EACA9P,OAAO,CAAC+Q,OAA4BA,OAAM,IAAI,EAC9C/Q,OAAO,CAAC+Q,OACPnY,OAAOC,SAASkY,GAAEC,GAAG,KAAKD,GAAEC,MAAM,KAAKD,GAAEnZ,cAAcmZ,GAAElB,OAAO,iBAAiB,CAAC,CAACkB,GAAEjB,MACvF;AAEF,QAAI,CAAC9X,WAAWuI,QAAQ;AACtBgP,qBAAeS,YAAYY,SAAS;AACpC;AAAA,IACF;AAEA,UAAMpB,iBAAiBxX,YAAY0B,GAAG;AAEtC,UAAMuX,UAAUjZ,WAAWuO,OAAO,CAACG,KAAKqK,OAAOA,GAAEC,MAAMtK,MAAMqK,GAAEC,MAAMtK,KAAMuJ,QAAQ;AACnFA,eAAWgB;AACX1B,mBAAeS,YAAYC,QAAQ;AAEnC,QAAIW,YAAY,KAAKX,YAAYW,WAAW;AAC1C;AAAA,IACF;AAAA,EACF;AACF;AAEA,MAAMM,eAAeA,CAACzX,UAAkBC,KAAa6E,YAAqC;AACxF,MAAIA,QAAQ4S,gBAAgB,MAAO;AACnC,QAAM7W,MAAM,GAAGiE,QAAQxC,WAAW,EAAE,IAAItC,QAAQ,IAAIC,GAAG;AACvD,MAAI4R,eAAeC,YAAYjR,IAAK;AAEpCiR,YAAUjR;AACVgR,gBAAcyE,eAAetW,UAAUC,KAAK;AAAA,IAAEqC,SAASwC,QAAQxC;AAAAA,EAAAA,CAAS,EACrEmM,MAAM,MAAM;AAAA,EAAC,CAAC,EACdkJ,QAAQ,MAAM;AACb,QAAI7F,YAAYjR,KAAK;AACnBgR,oBAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAEA,MAAMyC,kBAAkBA,CACtBtU,UACAC,KACA6E,SACA;AAAA,EAAEyP;AAA4D,MAC5C;AAClBpS,gBAAAA;AAEA,MAAI,CAACnC,SAAU,QAAOsE,QAAQsT,QAAAA;AAC9B,MAAI,CAAC3X,IAAK,OAAM,IAAImC,MAAM,aAAa;AAEvC8O,oBAAkBlR;AAClBmR,eAAalR;AACbmR,mBAAiBtM;AAEjB,MAAIA,QAAQ+S,mBAAmB,OAAO;AACpClT,2BAAuB;AAAA,MAAE3E;AAAAA,MAAUsC,SAASwC,QAAQxC;AAAAA,IAAAA,CAAS;AAAA,EAC/D;AACAmV,eAAazX,UAAUC,KAAK6E,OAAO;AAEnC,MAAIiM,WAAWA,OAAO8B,eAAeC,UAAUC,QAAQhC,OAAO8B,eAAeC,UAAUgF,aAAa;AAClG,WAAO9G,kBAAkB1M,QAAQsT,QAAAA;AAAAA,EACnC;AAEA3G,uBAAqB;AACrBsC,sBAAAA;AAEA,QAAMtB,MAAMF,eAAe/R,UAAUC,KAAK6E,OAAO;AAEjDkM,mBAAiB,IAAI1M,QAAQ,CAACsT,SAASG,WAAW;AAChD,QAAIxD,uBAAwB7C,qBAAoB;AAEhD,QAAIsG,SAAS;AACb,QAAIC,UAAU;AACdlH,aAAS,IAAI+B,UAAUb,GAAG;AAE1BlB,WAAOmH,iBAAiB,QAAQ,MAAM;AACpCF,eAAS;AACTC,gBAAU;AACVvG,0BAAoB;AACpBE,qCAA+B;AAC/B,YAAMsB,oBAAoBvB;AAC1BsB,qBAAe;AAAA,QAAEC;AAAAA,MAAAA,CAAmB;AACpCvB,iCAA2B;AAC3BiG,cAAAA;AAAAA,IACF,CAAC;AAED7G,WAAOmH,iBAAiB,WAAW1C,aAAa;AAEhDzE,WAAOmH,iBAAiB,SAAU3C,CAAAA,UAAU;AAC1C,UAAI,CAACyC,UAAU,CAACC,SAAS;AACvBA,kBAAU;AACVF,eAAO,IAAI3V,MAAM,6CAA6CmT,MAAM4C,IAAI,GAAG,CAAC;AAAA,MAC9E;AACA,UAAI,CAAClH,oBAAoB;AACvBW,uCAA+BoG;AAAAA,MACjC;AAEAjH,eAAS;AACTC,uBAAiB;AACjByC,wBAAAA;AAAAA,IACF,CAAC;AAED1C,WAAOmH,iBAAiB,SAAUE,CAAAA,QAAQ;AACxC,UAAIH,QAAS;AACbA,gBAAU;AACVF,aAAOK,eAAehW,QAAQgW,MAAM,IAAIhW,MAAM,qBAAqB,CAAC;AAAA,IACtE,CAAC;AAAA,EACH,CAAC;AAED,SAAO4O;AACT;AAEO,MAAMqH,UAAUA,CAACrY,UAAkBC,KAAa6E,UAA6B,CAAA,MAAsB;AACxG,SAAOwP,gBAAgBtU,UAAUC,KAAK6E,SAAS;AAAA,IAAEyP,wBAAwB;AAAA,EAAA,CAAM;AACjF;AAEO,MAAM+D,aAAaA,MAAY;AACpCrH,uBAAqB;AACrBsC,sBAAAA;AACA5B,6BAA2B;AAC3BC,iCAA+B;AAC/B,MAAIb,QAAQ;AACV,QAAI;AACFA,aAAOwH,MAAAA;AAAAA,IACT,QAAQ;AAAA,IACN;AAAA,EAEJ;AACAxH,WAAS;AACTC,mBAAiB;AACnB;AAEO,MAAM2C,YAAYA,CAAC3T,UAAkBC,KAAa6E,UAA6B,CAAA,MAAsB;AAC1GmM,uBAAqB;AACrBsC,sBAAAA;AACA3B,iCAA+B;AAC/B,MAAIb,QAAQ;AACV,QAAI;AACFA,aAAOwH,MAAAA;AAAAA,IACT,QAAQ;AAAA,IACN;AAAA,EAEJ;AACAxH,WAAS;AACTC,mBAAiB;AACjB,SAAOqH,QAAQrY,UAAUC,KAAK6E,OAAO;AACvC;AAEO,MAAM0T,gBAAgBA,CAC3Bra,WACAwB,OACA8Y,mBACAC,eACAC,aAI6B;AAC7B,MAAI7T;AACJ,MAAI8T;AAEJ,MAAI,OAAOH,sBAAsB,YAAY;AAC3C3T,cAAU,CAAA;AACV8T,eAAWH;AAAAA,EACb,OAAO;AACL3T,cAAU2T,qBAAqB,CAAA;AAC/BG,eAAWF;AAAAA,EACb;AAEA,MAAI,CAACE,SAAU,QAAOha;AACtB,MAAI,OAAOT,cAAc,YAAYA,UAAUK,KAAAA,EAAOsI,WAAW,GAAG;AAClE,UAAM,IAAI1E,MAAM,qDAAqD;AAAA,EACvE;AAEA,QAAMhE,WAAWmS,mBAAmB5Q,OAAOmF,OAAO;AAClD,QAAM+P,QAAQ,GAAG1W,SAAS,IAAIC,QAAQ;AACtC,QAAMiV,yBAAyBsF,UAAUtF,2BAA2B;AACpE,QAAMwF,uBAAuBF,UAAUE,yBAAyB;AAChE,QAAM7D,gBAAgB3E,4BACpB;AAAA,IAAEjK,YAAYtB,QAAQsB;AAAAA,IAAYwE,UAAU9F,QAAQ8F;AAAAA,EAAAA,GACpD,eACF;AACA,QAAMqK,cAAcpO,QAAQmO,aAAa;AACzC,QAAME,gBAAgBrO,QAAQ/B,QAAQ0L,UAAU;AAEhD,QAAMjQ,MAAM+Q,eAAe7Q,IAAIoU,KAAK,yBAASzR,IAAAA;AAC7C7C,MAAIgD,IAAIqV,QAAQ;AAChBtH,iBAAe/Q,IAAIsU,OAAOtU,GAAG;AAE7BgR,gBAAchR,IAAIsU,OAAO;AAAA,IAAE1W;AAAAA,IAAWwB;AAAAA,IAAOmF;AAAAA,IAAS1G;AAAAA,IAAUiV;AAAAA,IAAwB,GAAI2B,gBAAgB;AAAA,MAAEA;AAAAA,IAAAA,IAAkB,CAAA;AAAA,EAAC,CAAI;AAErI,MAAI7D,cAAc0H,wBAAwB,CAAC3D,eAAe;AACxD,QAAID,eAAeD,eAAe;AAChC,WAAK9H,kBAAkB;AAAA,QACrB/O;AAAAA,QACAwB;AAAAA,QACAmF,SAAS;AAAA,UACP7E,KAAKkR;AAAAA,UACL/K,YAAY4O,cAAc1E;AAAAA,UAC1BrI,MAAMnD,QAAQmD;AAAAA,UACdwB,OAAO3E,QAAQ2E;AAAAA,UACfmB,UAAUoK,cAAcpK;AAAAA,QAAAA;AAAAA,MAC1B,CACD,EAAEiE,KAAK,CAAC;AAAA,QAAE5C;AAAAA,QAAKrM;AAAAA,QAAMuK;AAAAA,MAAAA,MAAc;AAClC,YAAI,CAAC8B,IAAK;AACV2M,mBAAW,MAAMhZ,MAAMuK,OAAO;AAAA,MAChC,CAAC,EAAEsE,MAAM,MAAM;AAAA,MACb,CACD;AAAA,IACH,OAAO;AACL,WAAKlE,SAAS;AAAA,QACZpM;AAAAA,QACAwB;AAAAA,QACAmF,SAAS;AAAA,UACP7E,KAAKkR;AAAAA,UACL/K,YAAYtB,QAAQsB;AAAAA,UACpB6B,MAAMnD,QAAQmD;AAAAA,UACdwB,OAAO3E,QAAQ2E;AAAAA,QAAAA;AAAAA,MACjB,CACD,EAAEoF,KAAK,CAAC;AAAA,QAAEjP;AAAAA,QAAMuK;AAAAA,MAAAA,MAAc;AAC7ByO,mBAAW,MAAMhZ,MAAMuK,OAAO;AAAA,MAChC,CAAC,EAAEsE,MAAM,MAAM;AAAA,MACb,CACD;AAAA,IACH;AAAA,EACF;AAEAkE,eAAa;AAAA,IAAEW,MAAM;AAAA,IAAkBnV;AAAAA,IAAWC;AAAAA,IAAUuB;AAAAA,IAAOmF;AAAAA,IAASsO,iBAAiBC;AAAAA,EAAAA,CAAwB;AAErH,SAAO,MAAM;AACXV,iBAAa;AAAA,MAAEW,MAAM;AAAA,MAAgBnV;AAAAA,MAAWC;AAAAA,IAAAA,CAAU;AAE1D,UAAM0W,YAAYxD,eAAe7Q,IAAIoU,KAAK;AAC1CC,eAAWhU,OAAO8X,QAAS;AAC3B,QAAI9D,aAAaA,UAAUrR,SAAS,GAAG;AACrC6N,qBAAexQ,OAAO+T,KAAK;AAC3BtD,oBAAczQ,OAAO+T,KAAK;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,MAAMiE,kBAAkBA,MAAc,aAAa/J,KAAKC,MAAMC,SAAS,EAAE,CAAC,IAAI5P,KAAK+U,OAAAA,EAASnF,SAAS,EAAE,EAAEjC,MAAM,GAAG,EAAE,CAAC;AAE9G,MAAM+L,kBAAkB,OAAO;AAAA,EACpC5a;AAAAA,EACAwB;AAAAA,EACAmF,UAAU,CAAA;AAAA,EACVkU,YAAY;AAMd,MAA4D;AAC1D,MAAI,OAAO7a,cAAc,YAAYA,UAAUK,KAAAA,EAAOsI,WAAW,GAAG;AAClE,UAAM,IAAI1E,MAAM,uDAAuD;AAAA,EACzE;AACAiO,8BACE;AAAA,IAAEjK,YAAYtB,QAAQsB;AAAAA,IAAYwE,UAAU9F,QAAQ8F;AAAAA,EAAAA,GACpD,iBACF;AAEA,QAAMqO,aAAa,OAAOD,cAAc,YAAY7Z,OAAOC,SAAS4Z,SAAS,KAAKA,YAAY;AAC9F,QAAME,mBAAmBD,aAAalK,KAAKC,IAAAA,IAAQ;AAEnD,MAAI,CAAC+B,UAAUA,OAAO8B,eAAeC,UAAUC,MAAM;AACnD,QAAI7B,mBAAmBC,YAAY;AACjC,UAAI;AACF,cAAMgI,iBAAiB7E,gBACrBpD,iBACAC,YACAC,gBACA;AAAA,UAAEmD,wBAAwB;AAAA,QAAA,CAC5B;AACA,YAAI0E,YAAY;AACd,gBAAM,IAAI3U,QAAc,CAACsT,SAASG,WAAW;AAC3C,kBAAMqB,YAAYjZ,OAAOkU,WAAW,MAAM;AACxC0D,qBAAO,IAAI3V,MAAM0O,+BAA+B,CAAC;AAAA,YACnD,GAAGkI,SAAS;AACZG,2BAAetK,KACb,MAAM;AACJ1O,qBAAOqT,aAAa4F,SAAS;AAC7BxB,sBAAAA;AAAAA,YACF,GACCjD,CAAAA,UAAU;AACTxU,qBAAOqT,aAAa4F,SAAS;AAC7BrB,qBAAOpD,KAAK;AAAA,YACd,CACF;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,gBAAMwE;AAAAA,QACR;AAAA,MACF,QAAQ;AAAA,MACN;AAAA,IAEJ;AAAA,EACF;AAEA,MAAI,CAACpI,UAAUA,OAAO8B,eAAeC,UAAUC,MAAM;AACnD,QAAIkG,cAAclK,KAAKC,IAAAA,IAAQkK,oBAAoBF,WAAW;AAC5D,YAAM,IAAI5W,MAAM0O,+BAA+B;AAAA,IACjD;AACA,UAAM,IAAI1O,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAMiX,qBAAqBJ,aAAa5Z,KAAK4N,IAAI,GAAG+L,aAAajK,KAAKC,IAAAA,IAAQkK,iBAAiB,IAAI;AACnG,MAAIG,uBAAuB,QAAQA,sBAAsB,GAAG;AAC1D,UAAM,IAAIjX,MAAM0O,+BAA+B;AAAA,EACjD;AAEA,QAAMwI,kBAAkBxU,QAAQjE,MAAMiE,UAAU;AAAA,IAAE,GAAGA;AAAAA,IAASjE,KAAKiY,gBAAAA;AAAAA,EAAgB;AACnF,QAAM1a,WAAWmS,mBAAmB5Q,OAAO2Z,eAAe;AAC1D,QAAMzE,QAAQ,GAAG1W,SAAS,IAAIC,QAAQ;AAEtC,SAAO,MAAM,IAAIkG,QAAqD,CAACsT,SAASG,WAAW;AACzF,QAAIE,UAAU;AACd,QAAImB,YAA2B;AAE/B,UAAMG,UAAUA,MAAM;AACpB,YAAMzE,aAAYxD,eAAe7Q,IAAIoU,KAAK;AAC1CC,kBAAWhU,OAAO8X,QAAQ;AAC1B,UAAI9D,cAAaA,WAAUrR,SAAS,EAAG6N,gBAAexQ,OAAO+T,KAAK;AAClE,UAAIuE,cAAc,QAAQ,OAAOjZ,WAAW,aAAa;AACvDA,eAAOqT,aAAa4F,SAAS;AAAA,MAC/B;AAAA,IACF;AAEA,UAAMI,SAASA,CAAChU,SAAqB;AACnC,UAAIyS,QAAS;AACbA,gBAAU;AACVsB,cAAAA;AACA/T,WAAAA;AAAAA,IACF;AAEA,UAAMoT,WAA0BA,CAACjE,OAAO/U,MAAMuK,YAAY;AACxD,UAAIwK,OAAO;AACT6E,eAAO,MAAMzB,OAAOpD,KAAK,CAAC;AAC1B;AAAA,MACF;AACA6E,aAAO,MAAM5B,QAAQ;AAAA,QAAEhY;AAAAA,QAAMuK;AAAAA,MAAAA,CAAS,CAAC;AAAA,IACzC;AAEA,UAAM2K,YAAYxD,eAAe7Q,IAAIoU,KAAK,yBAASzR,IAAAA;AACnD0R,cAAUvR,IAAIqV,QAAQ;AACtBtH,mBAAe/Q,IAAIsU,OAAOC,SAAS;AAEnC,QAAIuE,uBAAuB,MAAM;AAC/BD,kBAAYjZ,OAAOkU,WAAW,MAAM;AAClCmF,eAAO,MAAMzB,OAAO,IAAI3V,MAAM0O,+BAA+B,CAAC,CAAC;AAAA,MACjE,GAAGuI,kBAAkB;AAAA,IACvB;AAEA1G,iBAAa;AAAA,MAAEW,MAAM;AAAA,MAAanV;AAAAA,MAAWC;AAAAA,MAAUuB;AAAAA,MAAOmF,SAASwU;AAAAA,IAAAA,CAAiB;AAAA,EAC1F,CAAC;AACH;AAEO,MAAMG,cAAcA,CAAClE,OAAeb,YAA4B;AACrE/B,eAAa;AAAA,IAAEW,MAAM;AAAA,IAASiC;AAAAA,IAAOb;AAAAA,EAAAA,CAAS;AAChD;AAEO,MAAMgF,YAAYA,CAACnE,OAAeqD,aAAuD;AAC9F,QAAMrY,MAAMiR,iBAAiB/Q,IAAI8U,KAAK,yBAASnS,IAAAA;AAC/C7C,MAAIgD,IAAIqV,QAAQ;AAChBpH,mBAAiBjR,IAAIgV,OAAOhV,GAAG;AAE/B,SAAO,MAAM;AACX,UAAMuU,YAAYtD,iBAAiB/Q,IAAI8U,KAAK;AAC5CT,eAAWhU,OAAO8X,QAAQ;AAC1B,QAAI9D,aAAaA,UAAUrR,SAAS,EAAG+N,kBAAiB1Q,OAAOyU,KAAK;AAAA,EACtE;AACF;AC/xBA,MAAM9W,oBAAoBA,CAACH,UAAmD;AAC5E,MAAI,CAACA,SAAS,OAAOA,UAAU,SAAU,QAAOM;AAChD,MAAIF,MAAMC,QAAQL,KAAK,EAAG,QAAOM;AAEjC,QAAMC,MAAMP;AAOZ,MAAI,OAAOO,IAAIC,gBAAgB,aAAa,OAAOD,IAAIE,gBAAgB,UAAW,QAAOH;AAEzF,QAAMI,aAAa,OAAOH,IAAIG,eAAe,YAAYH,IAAIG,aAAaH,IAAIG,aAAaJ;AAC3F,QAAMK,aAAa,OAAOJ,IAAII,eAAe,YAAYJ,IAAII,aAAaJ,IAAII,aAAaL;AAE3F,SAAO;AAAA,IACLE,aAAaD,IAAIC;AAAAA,IACjBC,aAAaF,IAAIE;AAAAA,IACjB,GAAIC,aAAa;AAAA,MAAEA;AAAAA,IAAAA,IAAe,CAAA;AAAA,IAClC,GAAIC,aAAa;AAAA,MAAEA;AAAAA,IAAAA,IAAe,CAAA;AAAA,EAAC;AAEvC;AAEA,MAAMC,sBAAsBA,CAACZ,UAAuC;AAClE,MAAI,OAAOA,UAAU,SAAU,QAAOM;AACtC,MAAI,CAACO,OAAOC,SAASd,KAAK,KAAKA,QAAQ,EAAG,QAAOM;AACjD,SAAOS,KAAKC,MAAMhB,KAAK;AACzB;AAEA,MAAMqb,WAAWA,CAACxT,QAAyB;AACzC,MAAI,CAACA,OAAO,OAAOA,QAAQ,SAAU,QAAO;AAC5C,QAAMmC,KAAMnC,IAA0ByB;AACtC,SAAO,OAAOU,OAAO,WAAWA,GAAG9J,SAAS;AAC9C;AAEA,MAAMob,aAAa,CAAoCjQ,SAAmB;AACxE,QAAMkQ,2BAAWzW,IAAAA;AACjB,QAAM0W,SAAc,CAAA;AAEpB,aAAW3T,OAAOwD,MAAM;AACtB,UAAMrB,KAAKqR,SAASxT,GAAG;AACvB,QAAImC,MAAMuR,KAAK7V,IAAIsE,EAAE,EAAG;AACxB,QAAIA,GAAIuR,MAAKtW,IAAI+E,EAAE;AACnBwR,WAAO/Z,KAAKoG,GAAG;AAAA,EACjB;AAEA,SAAO2T;AACT;AAEA,MAAMC,qBAAqB,CACzBC,eACAC,UACAC,cACQ;AACR,QAAMJ,SAAc,CAAA;AACpB,aAAWK,QAAQH,cAAeF,QAAO/Z,KAAK,GAAGoa,KAAKC,KAAK;AAC3D,MAAIH,SAAUH,QAAO/Z,KAAK,GAAGka,SAASG,KAAK;AAC3C,aAAWD,QAAQD,UAAWJ,QAAO/Z,KAAK,GAAGoa,KAAKC,KAAK;AACvD,SAAOR,WAAWE,MAAM;AAC1B;AAEA,MAAMO,8BAA8BA,CAClCjU,eACS;AACT,MAAI,CAACA,WAAY;AAEjB,aAAW,CAACK,MAAMnI,KAAK,KAAKmH,OAAO8B,QAAQnB,UAAU,GAAG;AACtD,QAAI,CAACK,KAAKjI,OAAQ;AAClB,QAAIF,UAAU,GAAG;AACf,YAAM,IAAI8D,MAAM,4FAA4F;AAAA,IAC9G;AAAA,EACF;AACF;AAqBO,MAAMkY,WAAW,CACtBnc,WACAwB,QAAoB,CAAA,GACpBmF,UAA8B,CAAA,MACL;AACzB,MAAI,OAAO3G,cAAc,YAAYA,UAAUK,KAAAA,EAAOsI,WAAW,GAAG;AAClE,UAAM,IAAI1E,MAAM,gDAAgD;AAAA,EAClE;AACAiY,8BAA4BvV,QAAQsB,UAAU;AAE9C,QAAMkC,KAAKiS,MAAAA;AAEX,QAAMC,UAAU1V,QAAQ0V,WAAW;AACnC,QAAMC,aAAa3V,QAAQ4V,QAAQ;AACnC,QAAMC,iBAAiB7V,QAAQ6V,mBAAmB;AAClD,QAAM9Z,MAAMiE,QAAQjE,OAAOyH;AAC3B,QAAMsS,YAAYvX,KAAKO,UAAUjE,KAAK;AACtC,QAAMkb,iBAAiB/V,QAAQsB,aAAa/C,KAAKO,UAAUkB,QAAQsB,UAAU,IAAI;AACjF,QAAM0U,WAAWhW,QAAQmD,OAAO5E,KAAKO,UAAUkB,QAAQmD,IAAI,IAAI;AAC/D,QAAM8S,WAAW,OAAOjW,QAAQ2E,UAAU,WAAW+D,OAAO1I,QAAQ2E,KAAK,IAAI;AAC7E,QAAMuR,eAAelW,QAAQ8F,WAAWvH,KAAKO,UAAUkB,QAAQ8F,QAAQ,IAAI;AAC3E,QAAMqQ,iBAAiBnW,QAAQ0L,aAAanN,KAAKO,UAAUkB,QAAQ0L,UAAU,IAAI;AACjFH,8BACE;AAAA,IAAEjK,YAAYtB,QAAQsB;AAAAA,IAAYwE,UAAU9F,QAAQ8F;AAAAA,EAAAA,GACpD,UACF;AACA,QAAMsQ,cAAcrU,QAAQ/B,QAAQ0L,UAAU;AAE9C,QAAMpS,WAAWmS,mBAAmB5Q,OAAO;AAAA,IACzCkB;AAAAA,IACAuF,YAAYtB,QAAQsB;AAAAA,IACpB6B,MAAMnD,QAAQmD;AAAAA,IACdwB,OAAO3E,QAAQ2E;AAAAA,IACfmB,UAAU9F,QAAQ8F;AAAAA,IAClB4F,YAAY1L,QAAQ0L;AAAAA,EAAAA,CACrB;AAED,QAAM2K,aAAa7Z,iBAAAA;AACnB,MAAIkZ,WAAWC,cAAcU,YAAY;AACvCA,eAAW3C,cAAc;AAAA,MACvBra;AAAAA,MACAwB;AAAAA,MACAmF,SAAS;AAAA,QACPjE;AAAAA,QACAuF,YAAYtB,QAAQsB;AAAAA,QACpB6B,MAAMnD,QAAQmD;AAAAA,QACdwB,OAAO3E,QAAQ2E;AAAAA,QACfmB,UAAU9F,QAAQ8F;AAAAA,QAClB4F,YAAY1L,QAAQ0L;AAAAA,MAAAA;AAAAA,MAEtBpS;AAAAA,IAAAA,CACD;AAAA,EACH;AAEA,QAAMgd,cAAcC,QAClB,MACEb,WAAWC,aACPU,aACEA,WAAWG,aAAand,WAAWC,QAAQ,IAC3CoC,yBAAyBrC,WAAWC,QAAQ,IAC9CQ,QAEN,CAAC4b,SAASC,YAAYU,YAAYhd,WAAWC,QAAQ,CACvD;AAEA,QAAMmd,kBAAkBF,QACtB,MACEb,WAAWC,aACPU,aACEA,WAAWK,iBAAiBrd,WAAWC,QAAQ,IAC/CsC,6BAA6BvC,WAAWC,QAAQ,IAClDQ,QAEN,CAAC4b,SAASC,YAAYU,YAAYhd,WAAWC,QAAQ,CACvD;AAEA,QAAMqd,oBAAoBJ,QACxB,MACEb,WAAWC,aACPU,aACEA,WAAWO,mBAAmBvd,WAAWC,QAAQ,IACjDuC,+BAA+BxC,WAAWC,QAAQ,IACpDQ,QAEN,CAAC4b,SAASC,YAAYU,YAAYhd,WAAWC,QAAQ,CACvD;AAEA,QAAMud,cAAcjd,MAAMC,QAAQyc,WAAW;AAC7C,QAAMQ,WAAWD,cAAcP,cAAqBxc;AACpD,QAAMid,eAAepd,kBAAkB8c,eAAe;AACtD,QAAMO,iBAAiB5c,oBAAoBuc,iBAAiB;AAC5D,QAAMM,YAAY,MAAM;AACtB,QAAI,CAACJ,YAAa,QAAO;AACzB,QAAI;AACF,aAAOtY,KAAKO,UAAUwX,WAAW;AAAA,IACnC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAA;AACA,QAAMY,oBAAoB,MAAM;AAC9B,QAAI,CAACH,aAAc,QAAO;AAC1B,QAAI;AACF,aAAOxY,KAAKO,UAAUiY,YAAY;AAAA,IACpC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAA;AACA,QAAMI,oBAAoBH,mBAAmBld,SAAY4O,OAAOsO,cAAc,IAAI;AAElF,QAAM,CAAClc,MAAMsc,OAAO,IAAIC,SAA0B,MAAOjB,cAActc,SAAYgd,QAAS;AAC5F,QAAM,CAAC3B,UAAUmC,WAAW,IAAID,SAA+B,MAC7DjB,eAAeU,WAAW;AAAA,IAAExB,OAAOwB;AAAAA,IAAU,GAAIC,eAAe;AAAA,MAAEhc,UAAUgc;AAAAA,IAAAA,IAAiB,CAAA;AAAA,EAAC,IAAO,IACtG;AACD,QAAM,CAAC/b,YAAYuc,aAAa,IAAIF,SAA6B,MAAOjB,cAAcY,iBAAiBld,MAAU;AACjH,QAAM,CAACob,eAAesC,gBAAgB,IAAIH,SAA+B,CAAA,CAAE;AAC3E,QAAM,CAACjC,WAAWqC,YAAY,IAAIJ,SAA+B,CAAA,CAAE;AACnE,QAAM,CAAC/R,QAAQoS,SAAS,IAAIL,SAAgD,MAAOR,cAAc,UAAU/c,MAAU;AACrH,QAAM,CAAC+V,OAAO8H,QAAQ,IAAIN,SAA8Bvd,MAAS;AACjE,QAAM,CAAC8d,SAASC,UAAU,IAAIR,SAAkB3B,WAAW,CAACmB,WAAW;AACvE,QAAM,CAACiB,iBAAiBC,kBAAkB,IAAIV,SAAiC,IAAI;AAEnF,QAAMW,gBAAgBC,OAAO,KAAK;AAClC,QAAMC,kBAAkBD,OAAO,KAAK;AACpC,QAAME,kBAAkBF,OAAe,EAAE;AACzC,QAAMG,mBAAmBH,OAA6B,EAAE;AACxD,QAAMI,eAAeJ,OAA6B,EAAE;AACpD,QAAMK,cAAcL,OAA6B,IAAI;AACrD,QAAMM,qBAAqBN,OAA+B,IAAI;AAE9DO,YAAU,MAAM;AACdJ,qBAAiBnW,UAAUiT;AAAAA,EAC7B,GAAG,CAACA,aAAa,CAAC;AAElBsD,YAAU,MAAM;AACdH,iBAAapW,UAAUmT;AAAAA,EACzB,GAAG,CAACA,SAAS,CAAC;AAEdoD,YAAU,MAAM;AACdF,gBAAYrW,UAAUkT;AAAAA,EACxB,GAAG,CAACA,QAAQ,CAAC;AAEbqD,YAAU,MAAM;AACdD,uBAAmBtW,UAAU6V;AAAAA,EAC/B,GAAG,CAACA,eAAe,CAAC;AAEpBU,YAAU,MAAM;AACd,QAAI,CAACnC,cAAcX,WAAWC,cAAckB,aAAa;AACvD/a,kCAA4BzC,WAAWC,QAAQ;AAAA,IACjD;AAEA0e,kBAAc/V,UAAU4U;AACxBqB,oBAAgBjW,UAAU;AAC1BkW,oBAAgBlW,UAAUgV;AAC1BU,aAAS7d,MAAS;AAClB0d,qBAAiB,CAAA,CAAE;AACnBC,iBAAa,CAAA,CAAE;AAEf,QAAI,CAAC/B,SAAS;AACZmC,iBAAW,KAAK;AAChBT,cAAQtd,MAAS;AACjBwd,kBAAY,IAAI;AAChBC,oBAAczd,MAAS;AACvB4d,gBAAU5d,MAAS;AACnB;AAAA,IACF;AAEA,QAAI+c,aAAa;AACf,YAAM4B,eAAe3B;AACrBe,iBAAW,KAAK;AAChBH,gBAAU,OAAO;AACjB,UAAItB,aAAa;AACfkB,oBAAY;AAAA,UACVhC,OAAOmD;AAAAA,UACP,GAAI1B,eAAe;AAAA,YAAEhc,UAAUgc;AAAAA,UAAAA,IAAiB,CAAA;AAAA,QAAC,CAClD;AACDQ,sBAAcP,cAAc;AAC5BI,gBAAQtd,MAAS;AAAA,MACnB,OAAO;AACLsd,gBAAQqB,YAAY;AACpBlB,sBAAczd,MAAS;AACvBwd,oBAAY,IAAI;AAAA,MAClB;AACA;AAAA,IACF;AAEAF,YAAQtd,MAAS;AACjBwd,gBAAY,IAAI;AAChBC,kBAAczd,MAAS;AACvB+d,eAAW,IAAI;AAAA,EACjB,GAAG,CAACnC,SAASC,YAAYU,YAAYhd,WAAWC,UAAUud,aAAaI,UAAUC,kBAAkBC,mBAAmBf,WAAW,CAAC;AAElIoC,YAAU,MAAM;AACd,QAAI,CAAC9C,QAAS;AAEd,UAAMnH,yBAAyBsH,kBAAkB,CAACgB;AAClD,UAAM9C,uBAAuB,CAAC8C,eAAe,CAACT;AAE9C,UAAMsC,cAAchF,cAClBra,WACAwB,OACA;AAAA,MACEkB;AAAAA,MACAuF,YAAYtB,QAAQsB;AAAAA,MACpB6B,MAAMnD,QAAQmD;AAAAA,MACdwB,OAAO3E,QAAQ2E;AAAAA,MACfmB,UAAU9F,QAAQ8F;AAAAA,MAClB4F,YAAY1L,QAAQ0L;AAAAA,IAAAA,GAEtB,CAAC4H,KAAK9N,QAAQH,YAAY;AACxB,UAAIA,QAAQC,WAAW,WAAW4S,gBAAgBjW,QAAS;AAE3D,UAAIoD,QAAQC,WAAW,WAAW;AAChC4S,wBAAgBjW,UAAU;AAAA,MAC5B;AAEA4V,iBAAW,KAAK;AAEhB,UAAIvE,KAAK;AACPqE,iBAASrE,GAAG;AACZ;AAAA,MACF;AAEA,UAAI,CAAC1Z,MAAMC,QAAQ2L,MAAM,EAAG;AAE5B,UAAIH,QAAQC,WAAW,aAAaD,QAAQgL,WAAWrQ,QAAQ2Y,aAAaX,cAAc/V,SAAS;AACjG;AAAA,MACF;AAEA+V,oBAAc/V,UAAU;AACxB,YAAM2W,kBAAkBvT,QAAQC,WAAW,YAAYD,QAAQtK,WAAWjB;AAC1E,YAAM+e,oBAAoBxT,QAAQC,WAAW,YAAYD,QAAQrK,aAAalB;AAE9E,YAAMgf,iBAAiB1C,cACnB;AAAA,QAAE5Q;AAAAA,QAAQzK,UAAU6d;AAAAA,QAAiB5d,YAAY6d;AAAAA,MAAAA,IACjDrT;AAEJ,UAAIuT,WAAW;AACf,UAAI;AACFA,mBAAWxa,KAAKO,UAAUga,cAAc;AAAA,MAC1C,QAAQ;AACNC,mBAAW;AAAA,MACb;AAEA,UAAIA,YAAYA,aAAaZ,gBAAgBlW,SAAS;AACpDyV,kBAAUrS,QAAQC,MAAM;AACxB;AAAA,MACF;AAEA6S,sBAAgBlW,UAAU8W;AAC1BrB,gBAAUrS,QAAQC,MAAM;AACxBqS,eAAS7d,MAAS;AAElB,UAAIsc,aAAa;AACfkB,oBAAY;AAAA,UACVhC,OAAO9P;AAAAA,UACP,GAAIoT,kBAAkB;AAAA,YAAE7d,UAAU6d;AAAAA,UAAAA,IAAoB,CAAA;AAAA,QAAC,CACxD;AACDrB,sBAAetV,CAAAA,YAAa4W,sBAAsB/e,SAAYmI,UAAU4W,iBAAkB;AAC1F;AAAA,MACF;AAEAzB,cAAQ5R,MAAa;AACrB+R,oBAAczd,MAAS;AAAA,IACzB,GACA;AAAA,MACEyU;AAAAA,MACAwF;AAAAA,IAAAA,CAEJ;AAEA,WAAO,MAAM;AACX2E,oBAAAA;AAAAA,IACF;AAAA,EACF,GAAG,CACDhD,SACArc,WACAC,UACAwc,WACAC,gBACAC,UACAC,UACAC,cACAC,gBACAU,aACAhB,gBACAO,WAAW,CACZ;AAED,QAAM4C,oBAAoBzC,QAAwC,MAAM;AACtE,QAAI,CAACH,YAAa,QAAOtc;AAEzB,UAAMmf,gBAAgB/D,cAAclT,SAAS,IACzCkT,cAAc,CAAC,GAAGna,WAClBoa,UAAUpa;AAEd,UAAMme,eAAe9D,UAAUpT,SAAS,IACpCoT,UAAUA,UAAUpT,SAAS,CAAC,GAAGjH,WACjCoa,UAAUpa;AAEd,QAAI,CAACke,iBAAiB,CAACC,aAAc,QAAOpf;AAE5C,UAAMG,cAAc8H,QAAQkX,eAAehf,WAAW;AACtD,UAAMD,cAAc+H,QAAQmX,cAAclf,WAAW;AACrD,UAAMG,aAAa8e,eAAe9e;AAClC,UAAMD,aAAagf,cAAchf;AAEjC,WAAO;AAAA,MACLD;AAAAA,MACAD;AAAAA,MACA,GAAIG,aAAa;AAAA,QAAEA;AAAAA,MAAAA,IAAe,CAAA;AAAA,MAClC,GAAID,aAAa;AAAA,QAAEA;AAAAA,MAAAA,IAAe,CAAA;AAAA,IAAC;AAAA,EAEvC,GAAG,CAACib,UAAUiB,aAAahB,WAAWF,aAAa,CAAC;AAEpD,QAAMiE,sBAAsB5C,QAAyB,MAAM;AACzD,QAAI,CAACH,YAAa,QAAOtc;AACzB,QAAI,CAACqb,YAAYD,cAAclT,WAAW,KAAKoT,UAAUpT,WAAW,EAAG,QAAOlI;AAC9E,WAAOmb,mBAAmBC,eAAeC,UAAUC,SAAS;AAAA,EAC9D,GAAG,CAACD,UAAUiB,aAAahB,WAAWF,aAAa,CAAC;AAEpD,QAAMkE,YAAY,YAA8B;AAC9C,QAAI,CAAC1D,WAAW,CAACU,eAAe,CAACpW,QAAQ0L,WAAY,QAAO;AAC5D,QAAI6M,mBAAmBtW,QAAS,QAAO;AAEvC,UAAMoX,cAAcf,YAAYrW;AAChC,UAAMqX,mBAAmBjB,aAAapW;AACtC,UAAMsX,SAASD,iBAAiBtX,SAAS,IACrCsX,iBAAiBA,iBAAiBtX,SAAS,CAAC,GAAGjH,UAAUb,aACzDmf,aAAate,UAAUb;AAE3B,UAAMF,gBAAcsf,iBAAiBtX,SAAS,IAC1CD,QAAQuX,iBAAiBA,iBAAiBtX,SAAS,CAAC,GAAGjH,UAAUf,WAAW,IAC5E+H,QAAQsX,aAAate,UAAUf,WAAW;AAE9C,QAAI,CAACuf,UAAU,CAACvf,cAAa,QAAO;AAEpC+d,uBAAmB,MAAM;AACzBF,eAAW,IAAI;AACfF,aAAS7d,MAAS;AAElB,QAAI;AACF,YAAM8X,WAAW,MAAMqC,gBAAgB;AAAA,QACrC5a;AAAAA,QACAwB;AAAAA,QACAmF,SAAS;AAAA,UACPjE;AAAAA,UACAuF,YAAYtB,QAAQsB;AAAAA,UACpB6B,MAAMnD,QAAQmD;AAAAA,UACdwB,OAAO3E,QAAQ2E;AAAAA,UACfmB,UAAU9F,QAAQ8F;AAAAA,UAClB4F,YAAY;AAAA,YACV,GAAG1L,QAAQ0L;AAAAA,YACX8N,WAAW;AAAA,YACXD;AAAAA,UAAAA;AAAAA,QACF;AAAA,MACF,CACD;AAED,UAAI,CAAC3f,MAAMC,QAAQ+X,SAAS9W,IAAI,EAAG,QAAO;AAE1C,YAAMua,OAAsB;AAAA,QAC1BC,OAAO1D,SAAS9W;AAAAA,QAChB,GAAI8W,SAASvM,QAAQC,WAAW,aAAasM,SAASvM,QAAQtK,WAC1D;AAAA,UAAEA,UAAU6W,SAASvM,QAAQtK;AAAAA,QAAAA,IAC7B,CAAA;AAAA,MAAC;AAGP2c,gBAAU,SAAS;AACnB,UAAI9F,SAASvM,QAAQC,WAAW,aAAasM,SAASvM,QAAQrK,eAAelB,QAAW;AACtFyd,sBAAc3F,SAASvM,QAAQrK,UAAU;AAAA,MAC3C;AACAyc,mBAAcxV,CAAAA,cAAY,CAAC,GAAGA,WAASoT,IAAI,CAAC;AAC5C,aAAO;AAAA,IACT,SAAS/B,OAAK;AACZqE,eAASrE,KAAG;AACZ,aAAO;AAAA,IACT,UAAA;AACEyE,yBAAmB,IAAI;AACvBF,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM4B,gBAAgB,YAA8B;AAClD,QAAI,CAAC/D,WAAW,CAACU,eAAe,CAACpW,QAAQ0L,WAAY,QAAO;AAC5D,QAAI6M,mBAAmBtW,QAAS,QAAO;AAEvC,UAAMoX,gBAAcf,YAAYrW;AAChC,UAAMyX,uBAAuBtB,iBAAiBnW;AAC9C,UAAMsX,WAASG,qBAAqB1X,SAAS,IACzC0X,qBAAqB,CAAC,GAAG3e,UAAUZ,aACnCkf,eAAate,UAAUZ;AAE3B,UAAMF,gBAAcyf,qBAAqB1X,SAAS,IAC9CD,QAAQ2X,qBAAqB,CAAC,GAAG3e,UAAUd,WAAW,IACtD8H,QAAQsX,eAAate,UAAUd,WAAW;AAE9C,QAAI,CAACsf,YAAU,CAACtf,cAAa,QAAO;AAEpC8d,uBAAmB,MAAM;AACzBF,eAAW,IAAI;AACfF,aAAS7d,MAAS;AAElB,QAAI;AACF,YAAM8X,aAAW,MAAMqC,gBAAgB;AAAA,QACrC5a;AAAAA,QACAwB;AAAAA,QACAmF,SAAS;AAAA,UACPjE;AAAAA,UACAuF,YAAYtB,QAAQsB;AAAAA,UACpB6B,MAAMnD,QAAQmD;AAAAA,UACdwB,OAAO3E,QAAQ2E;AAAAA,UACfmB,UAAU9F,QAAQ8F;AAAAA,UAClB4F,YAAY;AAAA,YACV,GAAG1L,QAAQ0L;AAAAA,YACX8N,WAAW;AAAA,YACXD,QAAAA;AAAAA,UAAAA;AAAAA,QACF;AAAA,MACF,CACD;AAED,UAAI,CAAC3f,MAAMC,QAAQ+X,WAAS9W,IAAI,EAAG,QAAO;AAE1C,YAAMua,SAAsB;AAAA,QAC1BC,OAAO1D,WAAS9W;AAAAA,QAChB,GAAI8W,WAASvM,QAAQC,WAAW,aAAasM,WAASvM,QAAQtK,WAC1D;AAAA,UAAEA,UAAU6W,WAASvM,QAAQtK;AAAAA,QAAAA,IAC7B,CAAA;AAAA,MAAC;AAGP2c,gBAAU,SAAS;AACnB,UAAI9F,WAASvM,QAAQC,WAAW,aAAasM,WAASvM,QAAQrK,eAAelB,QAAW;AACtFyd,sBAAc3F,WAASvM,QAAQrK,UAAU;AAAA,MAC3C;AACAwc,uBAAkBvV,CAAAA,cAAY,CAACoT,QAAM,GAAGpT,SAAO,CAAC;AAChD,aAAO;AAAA,IACT,SAASqR,OAAK;AACZqE,eAASrE,KAAG;AACZ,aAAO;AAAA,IACT,UAAA;AACEyE,yBAAmB,IAAI;AACvBF,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM8B,kBAAkBA,MAAM;AAC5B,QAAI,CAACvD,YAAa;AAClBoB,qBAAiB,CAAA,CAAE;AACnBC,iBAAa,CAAA,CAAE;AAAA,EACjB;AAEA,SAAOlB,QACL,OAAO;AAAA,IACLzb,MAAMsb,cAAc+C,sBAAsBre;AAAAA,IAC1CC,UAAUie;AAAAA,IACVhe,YAAYob,cAAcpb,aAAalB;AAAAA,IACvCwL;AAAAA,IACAuK;AAAAA,IACA+H;AAAAA,IACAwB;AAAAA,IACAK;AAAAA,IACAE;AAAAA,EAAAA,IAEF,CACE7e,MACAke,mBACAnJ,OACAuJ,WACAK,eACArD,aACAwB,SACAuB,qBACA7T,QACAtK,UAAU,CAEd;AACF;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/client",
3
- "version": "0.392.0",
3
+ "version": "0.394.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -1 +0,0 @@
1
- {"version":3,"file":"useQuery-CUjwBdkK.js","sources":["../src/rts/ssrHydration.tsx","../src/rts/pouchStore.ts","../src/rts/populateCache.ts","../src/rts/queryKey.ts","../src/rts/wsClient.ts","../src/rts/useQuery.ts"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\"\nimport type { PaginationPageInfo } from \"@rpcbase/api\"\n\nimport type { RtsModelName } from \"./modelTypes\"\nimport type { RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport const STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY = \"__staticRpcbaseRtsHydrationData\"\n\nexport type RtsSsrHydrationQueryData = {\n modelName: RtsModelName\n queryKey: string\n data: unknown[]\n pageInfo?: PaginationPageInfo\n}\n\nexport type StaticRpcbaseRtsHydrationData = {\n v: 1\n tenantId: string | null\n uid: string | null\n queries: RtsSsrHydrationQueryData[]\n}\n\nexport type RtsSsrQueryRegistration = {\n modelName: RtsModelName\n query: JsonObject\n options: RtsQueryOptions\n queryKey: string\n}\n\nexport type RtsSsrRuntime = {\n registerQuery: (query: RtsSsrQueryRegistration) => void\n getQueryData: (modelName: RtsModelName, queryKey: string) => unknown[] | undefined\n getQueryPageInfo: (modelName: RtsModelName, queryKey: string) => PaginationPageInfo | undefined\n}\n\nconst RtsSsrRuntimeContext = createContext<RtsSsrRuntime | null>(null)\n\nconst hydrationDataStore = new Map<string, unknown[]>()\nconst hydrationPageInfoStore = new Map<string, PaginationPageInfo | undefined>()\n\nconst makeStoreKey = (modelName: string, queryKey: string): string => `${modelName}.${queryKey}`\n\nconst normalizeStringOrNull = (value: unknown): string | null => {\n if (typeof value !== \"string\") return null\n const normalized = value.trim()\n return normalized ? normalized : null\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst parseHydrationData = (value: unknown): StaticRpcbaseRtsHydrationData | null => {\n if (!value || typeof value !== \"object\") return null\n\n const raw = value as {\n v?: unknown\n tenantId?: unknown\n uid?: unknown\n queries?: unknown\n }\n\n if (raw.v !== 1) return null\n if (!Array.isArray(raw.queries)) return null\n\n const queries: RtsSsrHydrationQueryData[] = []\n for (const entry of raw.queries) {\n if (!entry || typeof entry !== \"object\") continue\n\n const query = entry as {\n modelName?: unknown\n queryKey?: unknown\n data?: unknown\n pageInfo?: unknown\n }\n\n const modelName = normalizeStringOrNull(query.modelName)\n const queryKey = normalizeStringOrNull(query.queryKey)\n if (!modelName || !queryKey) continue\n if (!Array.isArray(query.data)) continue\n const pageInfo = normalizePageInfo(query.pageInfo)\n\n queries.push({\n modelName: modelName as RtsModelName,\n queryKey,\n data: query.data,\n ...(pageInfo ? { pageInfo } : {}),\n })\n }\n\n return {\n v: 1,\n tenantId: normalizeStringOrNull(raw.tenantId),\n uid: normalizeStringOrNull(raw.uid),\n queries,\n }\n}\n\nexport const hydrateRtsFromWindow = (): void => {\n if (typeof window === \"undefined\") return\n\n const browserWindow = window as unknown as Record<string, unknown>\n const raw = browserWindow[STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY]\n delete browserWindow[STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY]\n\n const parsed = parseHydrationData(raw)\n if (!parsed) return\n\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n for (const query of parsed.queries) {\n hydrationDataStore.set(makeStoreKey(query.modelName, query.queryKey), query.data)\n hydrationPageInfoStore.set(makeStoreKey(query.modelName, query.queryKey), query.pageInfo)\n }\n}\n\nexport const peekHydratedRtsQueryData = (\n modelName: RtsModelName,\n queryKey: string,\n): unknown[] | undefined => {\n return hydrationDataStore.get(makeStoreKey(modelName, queryKey))\n}\n\nexport const peekHydratedRtsQueryPageInfo = (\n modelName: RtsModelName,\n queryKey: string,\n): PaginationPageInfo | undefined => {\n return hydrationPageInfoStore.get(makeStoreKey(modelName, queryKey))\n}\n\nexport const consumeHydratedRtsQueryData = (\n modelName: RtsModelName,\n queryKey: string,\n): void => {\n const key = makeStoreKey(modelName, queryKey)\n hydrationDataStore.delete(key)\n hydrationPageInfoStore.delete(key)\n}\n\nexport const clearHydratedRtsQueryData = (): void => {\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n}\n\nexport const RtsSsrRuntimeProvider = ({\n value,\n children,\n}: {\n value: RtsSsrRuntime\n children: ReactNode\n}) => {\n return (\n <RtsSsrRuntimeContext.Provider value={value}>\n {children}\n </RtsSsrRuntimeContext.Provider>\n )\n}\n\nexport const useRtsSsrRuntime = (): RtsSsrRuntime | null => {\n return useContext(RtsSsrRuntimeContext)\n}\n","import type { PreparedPopulateEntry, ProjectionSpec } from \"./populateCache\"\n\n\ntype PouchDbStatic = {\n plugin: (plugin: unknown) => void\n prefix?: string\n defaults?: (options: Record<string, unknown>) => PouchDbStatic\n new (name: string, options?: Record<string, unknown>): PouchDbDatabase\n}\n\ntype PouchDbDatabase = {\n find: (options: Record<string, unknown>) => Promise<{ docs: Record<string, unknown>[] }>\n bulkDocs: (docs: Record<string, unknown>[]) => Promise<unknown>\n destroy: () => Promise<unknown>\n}\n\nexport type RtsPouchStoreConfig = {\n tenantId: string\n appName?: string\n prefix?: string\n}\n\nexport type RtsPouchQueryOptions = {\n uid: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n}\n\nexport type RtsPouchQueryContext = {\n source: \"cache\"\n}\n\nconst UNDERSCORE_PREFIX = \"$_\"\nconst DEFAULT_FIND_LIMIT = 4096\n\nlet storeConfig: RtsPouchStoreConfig | null = null\n\nlet pouchDbPromise: Promise<PouchDbStatic> | null = null\nlet lastAppliedPrefix: string | null = null\n\nconst collections = new Map<string, PouchDbDatabase>()\nconst dbNamesByPrefix = new Map<string, Set<string>>()\n\nconst unwrapDefault = (mod: unknown): unknown => {\n if (!mod || typeof mod !== \"object\") return mod\n const maybe = mod as { default?: unknown }\n return maybe.default ?? mod\n}\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS PouchDB store can only be used in the browser\")\n }\n}\n\nconst computeBasePrefix = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n let prefix = \"rb/\"\n if (appName) prefix += `${appName}/`\n prefix += `${tenantId}/`\n return prefix\n}\n\nconst getDbNamesKey = (prefix: string): string => `rb:rts:pouchDbs:${prefix}`\n\nconst getPrefixOverrideKey = ({ tenantId, appName }: { tenantId: string; appName?: string }): string =>\n `rb:rts:pouchPrefix:${appName ?? \"\"}:${tenantId}`\n\nconst readPrefixOverride = ({ tenantId, appName }: { tenantId: string; appName?: string }): string | null => {\n try {\n const value = window.localStorage.getItem(getPrefixOverrideKey({ tenantId, appName }))\n if (!value) return null\n if (!value.endsWith(\"/\")) return `${value}/`\n return value\n } catch {\n return null\n }\n}\n\nconst getPrefix = (): string => {\n if (!storeConfig) {\n throw new Error(\"RTS PouchDB store is not configured\")\n }\n\n if (storeConfig.prefix) return storeConfig.prefix\n\n const basePrefix = computeBasePrefix({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n const override = readPrefixOverride({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n return override ?? basePrefix\n}\n\nconst loadDbNames = (prefix: string): Set<string> => {\n const existing = dbNamesByPrefix.get(prefix)\n if (existing) return existing\n\n const names = new Set<string>()\n try {\n const raw = window.localStorage.getItem(getDbNamesKey(prefix))\n if (raw) {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed)) {\n for (const value of parsed) {\n if (typeof value === \"string\" && value) names.add(value)\n }\n }\n }\n } catch {\n return names\n }\n\n dbNamesByPrefix.set(prefix, names)\n return names\n}\n\nconst persistDbNames = (prefix: string, names: Set<string>): void => {\n try {\n if (!names.size) {\n window.localStorage.removeItem(getDbNamesKey(prefix))\n dbNamesByPrefix.delete(prefix)\n return\n }\n\n window.localStorage.setItem(getDbNamesKey(prefix), JSON.stringify(Array.from(names)))\n dbNamesByPrefix.set(prefix, names)\n } catch {\n return\n }\n}\n\nconst registerDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (names.has(dbName)) return\n names.add(dbName)\n persistDbNames(prefix, names)\n}\n\nconst unregisterDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (!names.delete(dbName)) return\n persistDbNames(prefix, names)\n}\n\nconst getPouchDb = async (): Promise<PouchDbStatic> => {\n ensureBrowser()\n\n if (!pouchDbPromise) {\n pouchDbPromise = (async () => {\n const [core, indexedDbAdapter, findPlugin] = await Promise.all([\n import(\"pouchdb-core\"),\n import(\"pouchdb-adapter-indexeddb\"),\n import(\"pouchdb-find\"),\n ])\n\n const PouchDB = unwrapDefault(core) as PouchDbStatic\n PouchDB.plugin(unwrapDefault(indexedDbAdapter))\n PouchDB.plugin(unwrapDefault(findPlugin))\n\n return PouchDB\n })()\n }\n\n return pouchDbPromise\n}\n\nconst applyPrefix = (PouchDB: PouchDbStatic) => {\n const prefix = getPrefix()\n if (prefix === lastAppliedPrefix) return\n PouchDB.prefix = prefix\n lastAppliedPrefix = prefix\n}\n\nexport const configureRtsPouchStore = (config: RtsPouchStoreConfig | null) => {\n storeConfig = config\n lastAppliedPrefix = null\n collections.clear()\n}\n\nexport const getCollection = async (modelName: string, options: { uid: string }): Promise<PouchDbDatabase> => {\n const PouchDB = await getPouchDb()\n applyPrefix(PouchDB)\n\n const prefix = getPrefix()\n const dbName = `${options.uid}/${modelName}`\n const dbKey = `${prefix}${dbName}`\n\n const existing = collections.get(dbKey)\n if (existing) return existing\n\n registerDbName(prefix, dbName)\n const db = new PouchDB(dbName, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n collections.set(dbKey, db)\n return db\n}\n\nconst replaceQueryKeys = (value: unknown, replaceKey: (key: string) => string): unknown => {\n if (typeof value !== \"object\" || value === null) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => replaceQueryKeys(item, replaceKey))\n }\n\n const obj = value as Record<string, unknown>\n const next: Record<string, unknown> = Object.create(Object.getPrototypeOf(obj))\n\n for (const key of Object.keys(obj)) {\n if (/^\\$/.test(key) || /\\.\\d+$/.test(key)) {\n throw new Error(`replaceQueryKeys: Unexpected key format: ${key}`)\n }\n\n const newKey = replaceKey(key)\n next[newKey] = replaceQueryKeys(obj[key], replaceKey)\n }\n\n return next\n}\n\nconst getKeys = (obj: Record<string, unknown>, parentKey = \"\"): string[] => {\n const keys: string[] = []\n\n for (const key of Object.keys(obj)) {\n const nextKey = parentKey ? `${parentKey}.${key}` : key\n const value = obj[key]\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n keys.push(...getKeys(value as Record<string, unknown>, nextKey))\n } else {\n keys.push(nextKey)\n }\n }\n\n return keys\n}\n\nconst satisfiesProjection = (doc: Record<string, unknown>, projection: Record<string, 0 | 1>): boolean => {\n const docKeys = new Set(getKeys(doc))\n const projectionKeys = new Set(Object.keys(projection).filter((key) => projection[key] === 1))\n\n if (!projectionKeys.has(\"_id\")) {\n docKeys.delete(\"_id\")\n }\n\n if (projectionKeys.size > docKeys.size) return false\n for (const key of projectionKeys) {\n if (!docKeys.has(key)) return false\n }\n return true\n}\n\nconst getValueAtPath = (doc: Record<string, unknown>, path: string): unknown => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return undefined\n\n let current: unknown = doc\n for (const part of parts) {\n if (!current || typeof current !== \"object\" || Array.isArray(current)) return undefined\n current = (current as Record<string, unknown>)[part]\n }\n return current\n}\n\nconst setValueAtPath = (doc: Record<string, unknown>, path: string, value: unknown): void => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return\n\n let current: Record<string, unknown> = doc\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i]!\n const existing = current[key]\n if (!existing || typeof existing !== \"object\" || Array.isArray(existing)) {\n current[key] = {}\n }\n current = current[key] as Record<string, unknown>\n }\n\n current[parts[parts.length - 1]!] = value\n}\n\nconst unsetValueAtPath = (doc: Record<string, unknown>, path: string): void => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return\n\n let current: Record<string, unknown> = doc\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i]!\n const next = current[key]\n if (!next || typeof next !== \"object\" || Array.isArray(next)) return\n current = next as Record<string, unknown>\n }\n\n delete current[parts[parts.length - 1]!]\n}\n\nconst cloneDoc = <T extends Record<string, unknown>>(doc: T): T => {\n try {\n return structuredClone(doc)\n } catch {\n return JSON.parse(JSON.stringify(doc)) as T\n }\n}\n\nconst toProjectionSpec = (projection: Record<string, 0 | 1>): ProjectionSpec => {\n const spec: ProjectionSpec = {}\n for (const [key, value] of Object.entries(projection)) {\n const path = key.trim()\n if (!path) continue\n if (value === 1 || value === 0) {\n spec[path] = value\n }\n }\n return spec\n}\n\nconst applyProjection = <T extends Record<string, unknown>>(\n doc: T,\n projection: Record<string, 0 | 1>,\n): T => {\n const spec = toProjectionSpec(projection)\n const includeKeys = Object.keys(spec).filter((key) => spec[key] === 1)\n const excludeKeys = Object.keys(spec).filter((key) => spec[key] === 0)\n\n if (includeKeys.length > 0) {\n const projected: Record<string, unknown> = {}\n for (const key of includeKeys) {\n const value = getValueAtPath(doc, key)\n if (value !== undefined) setValueAtPath(projected, key, value)\n }\n\n if (spec._id !== 0 && Object.hasOwn(doc, \"_id\")) {\n projected._id = doc._id\n }\n\n return projected as T\n }\n\n const projected = cloneDoc(doc)\n for (const key of excludeKeys) {\n unsetValueAtPath(projected, key)\n }\n return projected\n}\n\nconst compareSort = (\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n sort: Record<string, 1 | -1>,\n): number => {\n for (const key of Object.keys(sort)) {\n const dir = sort[key]\n const aVal = getValueAtPath(a, key)\n const bVal = getValueAtPath(b, key)\n\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n\n if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n }\n return 0\n}\n\nconst extractDocId = (value: unknown): string => {\n if (typeof value === \"string\") return value\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return \"\"\n const id = (value as { _id?: unknown })._id\n return typeof id === \"string\" ? id : \"\"\n}\n\nconst matchValue = (docValue: unknown, matchValueRaw: unknown): boolean | null => {\n if (Array.isArray(matchValueRaw)) {\n if (!Array.isArray(docValue)) return false\n if (docValue.length !== matchValueRaw.length) return false\n for (let i = 0; i < matchValueRaw.length; i += 1) {\n const matched = matchValue(docValue[i], matchValueRaw[i])\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n }\n\n if (matchValueRaw && typeof matchValueRaw === \"object\") {\n const matchObj = matchValueRaw as Record<string, unknown>\n if (Object.keys(matchObj).some((key) => key.startsWith(\"$\"))) return null\n if (!docValue || typeof docValue !== \"object\" || Array.isArray(docValue)) return false\n const docObj = docValue as Record<string, unknown>\n for (const key of Object.keys(matchObj)) {\n const matched = matchValue(docObj[key], matchObj[key])\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n }\n\n return Object.is(docValue, matchValueRaw)\n}\n\nconst matchesSimpleQuery = (doc: Record<string, unknown>, query: Record<string, unknown>): boolean | null => {\n for (const [key, expected] of Object.entries(query)) {\n if (key.startsWith(\"$\")) return null\n const actual = getValueAtPath(doc, key)\n const matched = matchValue(actual, expected)\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n}\n\nconst remapDocFromStorage = (doc: Record<string, unknown>): Record<string, unknown> => {\n const next: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(doc)) {\n const newKey = key.startsWith(UNDERSCORE_PREFIX) ? key.replace(/^\\$_/, \"\") : key\n next[newKey] = value\n }\n\n return next\n}\n\nconst runQueryInternal = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n strictProjection = false,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n strictProjection?: boolean\n}): Promise<{ data: T[]; context: RtsPouchQueryContext; projectionMismatch: boolean }> => {\n const collection = await getCollection(modelName, { uid: options.uid })\n\n const replacedQuery = replaceQueryKeys(query, (key) =>\n key.startsWith(\"_\") && key !== \"_id\" ? `${UNDERSCORE_PREFIX}${key}` : key,\n ) as Record<string, unknown>\n\n const limit = typeof options.limit === \"number\" ? Math.abs(options.limit) : DEFAULT_FIND_LIMIT\n\n const { docs } = await collection.find({\n selector: replacedQuery,\n limit,\n })\n\n const mappedDocs = docs.map(({ _rev: _revIgnored, ...rest }) => remapDocFromStorage(rest) as T)\n let filteredDocs = mappedDocs\n\n if (options.projection) {\n if (strictProjection && mappedDocs.some((entry) => !satisfiesProjection(entry, options.projection!))) {\n return {\n data: [],\n context: { source: \"cache\" },\n projectionMismatch: true,\n }\n }\n\n filteredDocs = filteredDocs.filter((entry) => satisfiesProjection(entry, options.projection!))\n }\n\n let result: T[] = filteredDocs\n\n if (options.sort) {\n result = result.sort((a, b) => compareSort(a, b, options.sort!))\n }\n\n return { data: result, context: { source: \"cache\" }, projectionMismatch: false }\n}\n\nexport const runQuery = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n}): Promise<{ data: T[]; context: RtsPouchQueryContext }> => {\n const result = await runQueryInternal<T>({ modelName, query, options })\n return { data: result.data, context: result.context }\n}\n\nconst addWriteDoc = (\n writes: Map<string, Map<string, Record<string, unknown> & { _id: string }>>,\n modelName: string,\n doc: Record<string, unknown> & { _id: string },\n): void => {\n const docsById = writes.get(modelName) ?? new Map()\n docsById.set(doc._id, doc)\n writes.set(modelName, docsById)\n}\n\nconst sanitizePopulatedDoc = (\n doc: Record<string, unknown> & { _id: string },\n populate: PreparedPopulateEntry[],\n writes: Map<string, Map<string, Record<string, unknown> & { _id: string }>>,\n): Record<string, unknown> & { _id: string } => {\n const next = cloneDoc(doc)\n\n for (const entry of populate) {\n const value = getValueAtPath(next, entry.path)\n if (value === undefined) continue\n\n if (Array.isArray(value)) {\n const ids: string[] = []\n for (const candidate of value) {\n const id = extractDocId(candidate)\n if (!id) continue\n ids.push(id)\n\n if (!entry.model) continue\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue\n\n const candidateDoc = candidate as Record<string, unknown> & { _id: string }\n const nested = entry.populate?.length ? sanitizePopulatedDoc(candidateDoc, entry.populate, writes) : cloneDoc(candidateDoc)\n addWriteDoc(writes, entry.model, nested)\n }\n\n setValueAtPath(next, entry.path, ids)\n continue\n }\n\n const id = extractDocId(value)\n setValueAtPath(next, entry.path, id || null)\n if (!id) continue\n if (!entry.model) continue\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue\n\n const valueDoc = value as Record<string, unknown> & { _id: string }\n const nested = entry.populate?.length ? sanitizePopulatedDoc(valueDoc, entry.populate, writes) : cloneDoc(valueDoc)\n addWriteDoc(writes, entry.model, nested)\n }\n\n return next\n}\n\nexport const updatePopulatedDocs = async ({\n modelName,\n data,\n uid,\n populate,\n}: {\n modelName: string\n data: Array<Record<string, unknown> & { _id: string }>\n uid: string\n populate: PreparedPopulateEntry[]\n}): Promise<void> => {\n if (!data.length) return\n\n const writes = new Map<string, Map<string, Record<string, unknown> & { _id: string }>>()\n const roots = data.map((doc) => sanitizePopulatedDoc(doc, populate, writes))\n await updateDocs(modelName, roots, uid)\n\n for (const [targetModelName, docsById] of writes.entries()) {\n if (!docsById.size) continue\n await updateDocs(\n targetModelName,\n Array.from(docsById.values()),\n uid,\n )\n }\n}\n\nconst loadProjectedDocsByIds = async ({\n modelName,\n ids,\n uid,\n projection,\n}: {\n modelName: string\n ids: string[]\n uid: string\n projection: ProjectionSpec\n}): Promise<{\n rawDocsById: Map<string, Record<string, unknown>>\n projectedDocsById: Map<string, Record<string, unknown>>\n projectionMismatch: boolean\n}> => {\n const uniqueIds = Array.from(new Set(ids.filter(Boolean)))\n if (!uniqueIds.length) {\n return { rawDocsById: new Map(), projectedDocsById: new Map(), projectionMismatch: false }\n }\n\n const collection = await getCollection(modelName, { uid })\n const { docs } = await collection.find({\n selector: { _id: { $in: uniqueIds } },\n limit: uniqueIds.length,\n })\n\n const rawDocsById = new Map<string, Record<string, unknown>>()\n const projectedDocsById = new Map<string, Record<string, unknown>>()\n let projectionMismatch = false\n\n for (const rawDoc of docs) {\n const id = typeof rawDoc._id === \"string\" ? rawDoc._id : \"\"\n if (!id) continue\n\n const { _rev: _revIgnored, ...rest } = rawDoc\n const remapped = remapDocFromStorage(rest)\n if (!satisfiesProjection(remapped, projection)) {\n projectionMismatch = true\n continue\n }\n\n rawDocsById.set(id, remapped)\n projectedDocsById.set(id, applyProjection(remapped, projection))\n }\n\n if (projectedDocsById.size < uniqueIds.length) {\n projectionMismatch = true\n }\n\n return { rawDocsById, projectedDocsById, projectionMismatch }\n}\n\nconst hydratePopulateEntries = async ({\n docs,\n populate,\n uid,\n}: {\n docs: Array<Record<string, unknown>>\n populate: PreparedPopulateEntry[]\n uid: string\n}): Promise<{ hit: boolean; data: Array<Record<string, unknown>> }> => {\n const currentDocs = docs\n\n for (const entry of populate) {\n if (!entry.model) {\n return { hit: false, data: [] }\n }\n\n const descriptors = currentDocs.map((doc) => {\n const rawValue = getValueAtPath(doc, entry.path)\n const isArray = Array.isArray(rawValue)\n const ids = (isArray ? rawValue : [rawValue])\n .map((candidate) => extractDocId(candidate))\n .filter(Boolean)\n\n return {\n doc,\n hasValue: rawValue !== undefined,\n isArray,\n ids,\n }\n })\n\n const allIds = descriptors.flatMap((descriptor) => descriptor.ids)\n const loaded = await loadProjectedDocsByIds({\n modelName: entry.model,\n ids: allIds,\n uid,\n projection: entry.select,\n })\n\n if (loaded.projectionMismatch) {\n return { hit: false, data: [] }\n }\n\n let populatedDocsById = loaded.projectedDocsById\n\n if (entry.match) {\n const filtered = new Map<string, Record<string, unknown>>()\n for (const [id, candidate] of loaded.rawDocsById.entries()) {\n const matched = matchesSimpleQuery(candidate, entry.match)\n if (matched === null) return { hit: false, data: [] }\n if (!matched) continue\n const projected = populatedDocsById.get(id)\n if (projected) filtered.set(id, projected)\n }\n populatedDocsById = filtered\n }\n\n if (entry.populate?.length) {\n const nestedResult = await hydratePopulateEntries({\n docs: Array.from(populatedDocsById.values()).map((candidate) => cloneDoc(candidate)),\n populate: entry.populate,\n uid,\n })\n if (!nestedResult.hit) {\n return { hit: false, data: [] }\n }\n\n populatedDocsById = nestedResult.data.reduce((acc, candidate) => {\n const id = extractDocId(candidate)\n if (id) acc.set(id, candidate)\n return acc\n }, new Map<string, Record<string, unknown>>())\n }\n\n for (const descriptor of descriptors) {\n if (!descriptor.hasValue) continue\n\n if (!descriptor.ids.length) {\n setValueAtPath(descriptor.doc, entry.path, descriptor.isArray ? [] : null)\n continue\n }\n\n if (descriptor.isArray) {\n let values = descriptor.ids\n .map((id) => populatedDocsById.get(id))\n .filter((candidate): candidate is Record<string, unknown> => Boolean(candidate))\n\n if (entry.options?.sort) {\n values = values.sort((a, b) => compareSort(a, b, entry.options!.sort!))\n }\n\n if (typeof entry.options?.limit === \"number\" && Number.isFinite(entry.options.limit)) {\n values = values.slice(0, Math.max(0, Math.floor(Math.abs(entry.options.limit))))\n }\n\n setValueAtPath(descriptor.doc, entry.path, values)\n continue\n }\n\n const value = populatedDocsById.get(descriptor.ids[0]!)\n setValueAtPath(descriptor.doc, entry.path, value ?? null)\n }\n }\n\n return { hit: true, data: currentDocs }\n}\n\nexport const runPopulatedQuery = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions & {\n projection: ProjectionSpec\n populate: PreparedPopulateEntry[]\n }\n}): Promise<{ hit: boolean; data: T[]; context: RtsPouchQueryContext }> => {\n const rootResult = await runQueryInternal<Record<string, unknown>>({\n modelName,\n query,\n options: {\n uid: options.uid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n strictProjection: true,\n })\n\n if (rootResult.projectionMismatch) {\n return {\n hit: false,\n data: [],\n context: rootResult.context,\n }\n }\n\n const projectedRoots = rootResult.data.map((doc) => applyProjection(doc, options.projection))\n const hydrated = await hydratePopulateEntries({\n docs: projectedRoots.map((doc) => cloneDoc(doc)),\n populate: options.populate,\n uid: options.uid,\n })\n\n if (!hydrated.hit) {\n return {\n hit: false,\n data: [],\n context: rootResult.context,\n }\n }\n\n return {\n hit: true,\n data: hydrated.data as T[],\n context: rootResult.context,\n }\n}\n\nexport const updateDocs = async (\n modelName: string,\n data: Array<Record<string, unknown> & { _id: string }>,\n uid: string,\n): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = data.map((doc) => doc._id).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const currentDocsById = currentDocs.reduce<Record<string, Record<string, unknown>>>((acc, doc) => {\n const id = String(doc._id ?? \"\")\n if (id) acc[id] = doc\n return acc\n }, {})\n\n const newDocs = data.map((mongoDoc) => {\n const currentDoc = currentDocsById[mongoDoc._id] ?? { _id: mongoDoc._id }\n const nextDoc = Object.entries(mongoDoc).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const newKey = key !== \"_id\" && key.startsWith(\"_\") ? `${UNDERSCORE_PREFIX}${key}` : key\n acc[newKey] = value\n return acc\n }, { ...currentDoc })\n\n const rev = currentDoc._rev\n if (typeof rev === \"string\" && rev) {\n nextDoc._rev = rev\n } else {\n delete nextDoc._rev\n }\n\n return nextDoc\n })\n\n await collection.bulkDocs(newDocs)\n}\n\nexport const deleteDocs = async (modelName: string, ids: string[], uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = ids.map((id) => String(id ?? \"\")).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const deletions = currentDocs\n .map((doc) => ({\n _id: String((doc as { _id?: unknown })?._id ?? \"\"),\n _rev: (doc as { _rev?: unknown })?._rev,\n _deleted: true,\n }))\n .filter((doc) => doc._id && typeof doc._rev === \"string\" && doc._rev)\n\n if (!deletions.length) return\n await collection.bulkDocs(deletions)\n}\n\nexport const destroyCollection = async (modelName: string, uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n const prefix = getPrefix()\n const dbName = `${uid}/${modelName}`\n collections.delete(`${prefix}${dbName}`)\n unregisterDbName(prefix, dbName)\n await collection.destroy()\n}\n\nexport const resetRtsPouchStore = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n ensureBrowser()\n const basePrefix = computeBasePrefix({ tenantId, appName })\n const oldPrefix = readPrefixOverride({ tenantId, appName }) ?? basePrefix\n const dbNames = Array.from(loadDbNames(oldPrefix))\n const openDbs = Array.from(collections.entries())\n .filter(([key]) => key.startsWith(oldPrefix))\n .map(([, db]) => db)\n\n void (async () => {\n const remaining = new Set(dbNames)\n\n await Promise.all(openDbs.map((db) => db.destroy().catch(() => {})))\n\n if (remaining.size) {\n const PouchDB = await getPouchDb()\n const PouchDBForPrefix = (PouchDB.defaults?.({}) ?? PouchDB) as PouchDbStatic\n PouchDBForPrefix.prefix = oldPrefix\n\n await Promise.all(Array.from(remaining).map(async (name) => {\n const db = new PouchDBForPrefix(name, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n await db.destroy().then(() => {\n remaining.delete(name)\n }).catch(() => {})\n }))\n }\n\n if (remaining.size) {\n persistDbNames(oldPrefix, remaining)\n } else {\n persistDbNames(oldPrefix, new Set())\n }\n })()\n\n const newPrefix = `${basePrefix}reset-${Date.now().toString(16)}/`\n try {\n window.localStorage.setItem(getPrefixOverrideKey({ tenantId, appName }), newPrefix)\n } catch {\n return newPrefix\n }\n\n lastAppliedPrefix = null\n collections.clear()\n return newPrefix\n}\n\nexport const destroyAllCollections = async (): Promise<void> => {\n const dbs = Array.from(collections.values())\n await Promise.all(dbs.map((db) => db.destroy()))\n collections.clear()\n}\n","import type { RtsPopulateObject, RtsPopulateOption, RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type ProjectionSpec = Record<string, 0 | 1>\nconst EXCLUDE_PROJECTION_ERROR = \"must be include-only (value 1); exclusion projection is not supported\"\n\nexport type PreparedPopulateEntry = {\n path: string\n model?: string\n select: ProjectionSpec\n match?: JsonObject\n options?: {\n sort?: Record<string, 1 | -1>\n limit?: number\n }\n populate?: PreparedPopulateEntry[]\n}\n\nexport type PreparedPopulateCacheOptions = {\n rootProjection: ProjectionSpec\n populate: PreparedPopulateEntry[]\n}\n\nconst sortProjectionSpec = (projection: ProjectionSpec): ProjectionSpec => {\n const sorted: ProjectionSpec = {}\n for (const key of Object.keys(projection).sort()) {\n sorted[key] = projection[key]\n }\n return sorted\n}\n\nconst normalizeProjectionSpec = (\n value: unknown,\n source: string,\n label: string,\n): ProjectionSpec | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const raw = value as Record<string, unknown>\n const normalized: ProjectionSpec = {}\n let hasExclude = false\n\n for (const [key, rawValue] of Object.entries(raw)) {\n const path = key.trim()\n if (!path) continue\n if (rawValue === 1 || rawValue === true) {\n normalized[path] = 1\n continue\n }\n if (rawValue === 0 || rawValue === false) {\n hasExclude = true\n continue\n }\n if (typeof rawValue === \"number\" && Number.isFinite(rawValue)) {\n if (rawValue === 1) normalized[path] = 1\n if (rawValue === 0) hasExclude = true\n }\n }\n\n if (hasExclude) {\n throw new Error(`${source}: ${label} ${EXCLUDE_PROJECTION_ERROR}`)\n }\n\n return Object.keys(normalized).length > 0 ? sortProjectionSpec(normalized) : undefined\n}\n\nconst normalizeSelectString = (value: string, source: string): ProjectionSpec | undefined => {\n const tokens = value\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter(Boolean)\n\n if (!tokens.length) return undefined\n const normalized: ProjectionSpec = {}\n\n for (const token of tokens) {\n let path = token\n\n if (token.startsWith(\"-\")) {\n throw new Error(`${source}: populate select ${EXCLUDE_PROJECTION_ERROR}`)\n } else if (token.startsWith(\"+\")) {\n path = token.slice(1)\n }\n\n path = path.trim()\n if (!path) continue\n normalized[path] = 1\n }\n\n return Object.keys(normalized).length > 0 ? sortProjectionSpec(normalized) : undefined\n}\n\nconst normalizePopulateSelect = (value: unknown, source: string): ProjectionSpec | undefined => {\n if (typeof value === \"string\") {\n return normalizeSelectString(value, source)\n }\n return normalizeProjectionSpec(value, source, \"populate select\")\n}\n\nconst normalizePopulateOptions = (value: unknown): PreparedPopulateEntry[\"options\"] | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const raw = value as Record<string, unknown>\n const normalized: PreparedPopulateEntry[\"options\"] = {}\n\n if (raw.sort && typeof raw.sort === \"object\" && !Array.isArray(raw.sort)) {\n const sortRaw = raw.sort as Record<string, unknown>\n const sort: Record<string, 1 | -1> = {}\n\n for (const [key, rawDirection] of Object.entries(sortRaw)) {\n const path = key.trim()\n if (!path) continue\n if (rawDirection === 1 || rawDirection === \"asc\") {\n sort[path] = 1\n continue\n }\n if (rawDirection === -1 || rawDirection === \"desc\") {\n sort[path] = -1\n }\n }\n\n if (Object.keys(sort).length > 0) {\n normalized.sort = sort\n }\n }\n\n if (typeof raw.limit === \"number\" && Number.isFinite(raw.limit)) {\n normalized.limit = Math.max(0, Math.floor(Math.abs(raw.limit)))\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\nconst normalizeString = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") return undefined\n const normalized = value.trim()\n return normalized || undefined\n}\n\nconst normalizeObject = (value: unknown): JsonObject | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n return value as JsonObject\n}\n\nconst normalizePopulateObject = (\n value: RtsPopulateObject,\n source: string,\n): PreparedPopulateEntry => {\n const path = normalizeString(value.path)\n if (!path) {\n throw new Error(`${source}: populate entries must define a non-empty path`)\n }\n\n const select = normalizePopulateSelect(value.select, source)\n if (!select) {\n throw new Error(`${source}: populate entries must define a select projection`)\n }\n\n const nested = value.populate !== undefined\n ? normalizePopulateOption(value.populate, source)\n : undefined\n\n return {\n path,\n select,\n ...(normalizeString(value.model) ? { model: normalizeString(value.model) } : {}),\n ...(normalizeObject(value.match) ? { match: normalizeObject(value.match) } : {}),\n ...(normalizePopulateOptions(value.options) ? { options: normalizePopulateOptions(value.options) } : {}),\n ...(nested && nested.length > 0 ? { populate: nested } : {}),\n }\n}\n\nconst normalizePopulateOption = (\n value: RtsPopulateOption,\n source: string,\n): PreparedPopulateEntry[] => {\n if (typeof value === \"string\") {\n throw new Error(`${source}: populate string syntax is not supported; use object entries with select`)\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n throw new Error(`${source}: populate must contain at least one entry`)\n }\n return value.map((entry) => {\n if (typeof entry === \"string\") {\n throw new Error(`${source}: populate string syntax is not supported; use object entries with select`)\n }\n return normalizePopulateObject(entry, source)\n })\n }\n\n return [normalizePopulateObject(value, source)]\n}\n\nexport const preparePopulateCacheOptions = (\n options: Pick<RtsQueryOptions, \"projection\" | \"populate\">,\n source: string,\n): PreparedPopulateCacheOptions | undefined => {\n if (!options.populate) return undefined\n\n const rootProjection = normalizeProjectionSpec(options.projection, source, \"projection\")\n if (!rootProjection) {\n throw new Error(`${source}: projection is required when populate is used`)\n }\n\n const populate = normalizePopulateOption(options.populate, source)\n if (!populate.length) {\n throw new Error(`${source}: populate must contain at least one entry`)\n }\n\n return {\n rootProjection,\n populate,\n }\n}\n","import type { RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport const computeRtsQueryKey = (query: JsonObject, options: RtsQueryOptions): string => {\n const key = options.key ?? \"\"\n const projection = options.projection ? JSON.stringify(options.projection) : \"\"\n const sort = options.sort ? JSON.stringify(options.sort) : \"\"\n const limit = typeof options.limit === \"number\" ? String(options.limit) : \"\"\n const populate = options.populate ? JSON.stringify(options.populate) : \"\"\n const pagination = options.pagination ? JSON.stringify(options.pagination) : \"\"\n return `${key}${JSON.stringify(query)}${projection}${sort}${limit}${populate}${pagination}`\n}\n","import type { PaginationPageInfo, PaginationSpec } from \"@rpcbase/api\"\n\nimport { preparePopulateCacheOptions } from \"./populateCache\"\nimport type { PreparedPopulateCacheOptions } from \"./populateCache\"\nimport { configureRtsPouchStore, deleteDocs, destroyCollection, resetRtsPouchStore, runPopulatedQuery, runQuery, updateDocs, updatePopulatedDocs } from \"./pouchStore\"\nimport type { RtsModelName } from \"./modelTypes\"\nimport { computeRtsQueryKey } from \"./queryKey\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type RtsPopulateObject = {\n path: string\n model?: string\n select?: string | JsonObject\n match?: JsonObject\n options?: {\n sort?: Record<string, 1 | -1>\n limit?: number\n }\n populate?: RtsPopulateOption\n}\n\nexport type RtsPopulateOption =\n | string\n | RtsPopulateObject\n | Array<string | RtsPopulateObject>\n\nexport type RtsNetworkQueryContext = {\n source: \"network\"\n isLocal: boolean\n txnId?: string\n pageInfo?: PaginationPageInfo\n}\n\nexport type RtsCacheQueryContext = {\n source: \"cache\"\n}\n\nexport type RtsQueryContext = RtsNetworkQueryContext | RtsCacheQueryContext\n\nexport type RtsQueryOptions = {\n key?: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n populate?: RtsPopulateOption\n pagination?: PaginationSpec\n}\n\nexport type RtsConnectOptions = {\n url?: string\n path?: string\n appName?: string\n configureStore?: boolean\n syncChanges?: boolean\n reconnect?: {\n attempts?: number\n delayMs?: number\n delayMaxMs?: number\n }\n}\n\ntype QueryCallback = (error: unknown | null, data: unknown, context: RtsQueryContext) => void\n\ntype QuerySubscription = {\n modelName: RtsModelName\n query: JsonObject\n options: RtsQueryOptions\n queryKey: string\n runInitialNetworkQuery: boolean\n populateCache?: PreparedPopulateCacheOptions\n}\n\ntype ServerMessage =\n | {\n type: \"query-payload\"\n modelName: string\n queryKey: string\n data?: unknown\n error?: string\n txnId?: string\n pageInfo?: unknown\n }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype ClientMessage =\n | { type: \"run-query\"; modelName: string; queryKey: string; query: JsonObject; options?: RtsQueryOptions }\n | {\n type: \"register-query\"\n modelName: string\n queryKey: string\n query: JsonObject\n options?: RtsQueryOptions\n runInitialQuery?: boolean\n }\n | { type: \"remove-query\"; modelName: string; queryKey: string }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype DocWithId = Record<string, unknown> & { _id: string }\ntype SyncChangesPayload = {\n ok?: unknown\n latestSeq?: unknown\n needsFullResync?: unknown\n changes?: unknown\n}\ntype RawSyncChangeRecord = {\n seq?: unknown\n modelName?: unknown\n op?: unknown\n docId?: unknown\n}\n\nconst TENANT_ID_QUERY_PARAM = \"rb-tenant-id\"\nconst RTS_CHANGES_ROUTE = \"/api/rb/rts/changes\"\nconst MAX_TXN_BUF = 2048\nconst SERVER_RECONNECT_DELAY_MIN_MS = 10_000\nconst SERVER_RECONNECT_DELAY_MAX_MS = 15_000\nconst RUN_NETWORK_QUERY_TIMEOUT_ERROR = \"runNetworkQuery: request timed out\"\n\nlet socket: WebSocket | null = null\nlet connectPromise: Promise<void> | null = null\nlet explicitDisconnect = false\n\nlet currentTenantId: string | null = null\nlet currentUid: string | null = null\nlet connectOptions: RtsConnectOptions = {}\n\nconst localTxnBuf: string[] = []\n\nconst queryCallbacks = new Map<string, Set<QueryCallback>>()\nconst subscriptions = new Map<string, QuerySubscription>()\nconst messageCallbacks = new Map<string, Set<(payload: unknown) => void>>()\n\nlet reconnectTimer: number | null = null\nlet reconnectAttempts = 0\nlet hasEstablishedConnection = false\nlet pendingServerReconnectJitter = false\n\nlet syncPromise: Promise<void> | null = null\nlet syncKey: string | null = null\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS websocket client can only be used in the browser\")\n }\n}\n\nconst buildSocketUrl = (tenantId: string, _uid: string, options: RtsConnectOptions): string => {\n if (options.url) {\n const url = new URL(options.url)\n url.searchParams.set(TENANT_ID_QUERY_PARAM, tenantId)\n return url.toString()\n }\n\n const base = new URL(window.location.href)\n base.protocol = base.protocol === \"https:\" ? \"wss:\" : \"ws:\"\n base.pathname = options.path ?? \"/rts\"\n base.search = \"\"\n base.hash = \"\"\n base.searchParams.set(TENANT_ID_QUERY_PARAM, tenantId)\n return base.toString()\n}\n\nconst sendToServer = (message: ClientMessage): void => {\n if (!socket) return\n if (socket.readyState !== WebSocket.OPEN) return\n socket.send(JSON.stringify(message))\n}\n\nconst resubscribeAll = ({ forceInitialQuery }: { forceInitialQuery: boolean }): void => {\n for (const sub of subscriptions.values()) {\n const runInitialQuery = forceInitialQuery || sub.runInitialNetworkQuery\n sendToServer({\n type: \"register-query\",\n modelName: sub.modelName,\n queryKey: sub.queryKey,\n query: sub.query,\n options: sub.options,\n runInitialQuery,\n })\n }\n}\n\nconst clearReconnectTimer = () => {\n if (reconnectTimer === null) return\n if (typeof window !== \"undefined\") {\n window.clearTimeout(reconnectTimer)\n }\n reconnectTimer = null\n}\n\nconst scheduleReconnect = () => {\n clearReconnectTimer()\n if (explicitDisconnect) {\n pendingServerReconnectJitter = false\n return\n }\n if (!currentTenantId || !currentUid) return\n\n const cfg = connectOptions.reconnect ?? {}\n const maxAttempts = cfg.attempts ?? 128\n const delayMs = cfg.delayMs ?? 400\n const delayMaxMs = cfg.delayMaxMs ?? 10_000\n\n if (reconnectAttempts >= maxAttempts) return\n\n let delay = Math.min(delayMaxMs, delayMs * Math.pow(2, reconnectAttempts))\n if (pendingServerReconnectJitter) {\n const span = SERVER_RECONNECT_DELAY_MAX_MS - SERVER_RECONNECT_DELAY_MIN_MS\n delay = SERVER_RECONNECT_DELAY_MIN_MS + Math.floor(Math.random() * (span + 1))\n pendingServerReconnectJitter = false\n }\n reconnectAttempts += 1\n reconnectTimer = window.setTimeout(() => {\n void connectInternal(currentTenantId!, currentUid!, connectOptions, { resetReconnectAttempts: false })\n }, delay)\n}\n\nconst isDocWithId = (doc: unknown): doc is DocWithId => {\n if (!doc || typeof doc !== \"object\") return false\n return typeof (doc as { _id?: unknown })._id === \"string\"\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\") return undefined\n if (Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst handleQueryPayload = (payload: Extract<ServerMessage, { type: \"query-payload\" }>) => {\n const { modelName, queryKey, data, error, txnId } = payload\n const cbKey = `${modelName}.${queryKey}`\n const callbacks = queryCallbacks.get(cbKey)\n if (!callbacks || !callbacks.size) return\n const subscription = subscriptions.get(cbKey)\n const pageInfo = normalizePageInfo(payload.pageInfo)\n const populateCache = subscription?.populateCache\n const hasPopulate = Boolean(populateCache)\n const hasPagination = Boolean(subscription?.options?.pagination || pageInfo)\n\n const isLocal = !!(txnId && localTxnBuf.includes(txnId))\n const context: RtsNetworkQueryContext = { source: \"network\", isLocal, txnId, ...(pageInfo ? { pageInfo } : {}) }\n\n if (error) {\n for (const cb of callbacks) cb(error, undefined, context)\n return\n }\n\n for (const cb of callbacks) cb(null, data, context)\n\n if (!currentUid) return\n\n const docs = Array.isArray(data) ? data.filter(isDocWithId) : []\n\n if (hasPagination) return\n\n if (!docs.length) return\n\n if (hasPopulate && populateCache) {\n void updatePopulatedDocs({\n modelName,\n data: docs,\n uid: currentUid,\n populate: populateCache.populate,\n }).catch(() => {})\n return\n }\n\n void updateDocs(modelName, docs, currentUid)\n .catch(() => {})\n}\n\nconst handleEvent = (payload: Extract<ServerMessage, { type: \"event\" }>) => {\n const callbacks = messageCallbacks.get(payload.event)\n if (!callbacks || !callbacks.size) return\n for (const cb of callbacks) cb(payload.payload)\n}\n\nconst handleMessage = (event: MessageEvent) => {\n let parsed: unknown\n try {\n parsed = JSON.parse(typeof event.data === \"string\" ? event.data : String(event.data))\n } catch {\n return\n }\n\n if (!parsed || typeof parsed !== \"object\") return\n const message = parsed as ServerMessage\n\n if (message.type === \"query-payload\") {\n handleQueryPayload(message)\n return\n }\n\n if (message.type === \"event\") {\n handleEvent(message)\n }\n}\n\nexport const addLocalTxn = (txnId: string): void => {\n if (!txnId) return\n localTxnBuf.push(txnId)\n if (localTxnBuf.length > MAX_TXN_BUF) {\n localTxnBuf.shift()\n }\n}\n\ntype RtsChangeRecord = {\n seq: number\n modelName: string\n op: \"delete\" | \"reset_model\"\n docId?: string\n}\n\nconst getSyncStorageKey = ({ tenantId, uid, appName }: { tenantId: string; uid: string; appName?: string }): string =>\n `rb:rts:changesSeq:${appName ?? \"\"}:${tenantId}:${uid}`\n\nconst readStoredSeq = (key: string): number => {\n try {\n const raw = window.localStorage.getItem(key)\n const num = raw ? Number(raw) : 0\n return Number.isFinite(num) && num >= 0 ? Math.floor(num) : 0\n } catch {\n return 0\n }\n}\n\nconst writeStoredSeq = (key: string, value: number): void => {\n try {\n window.localStorage.setItem(key, String(Math.max(0, Math.floor(value))))\n } catch {\n return\n }\n}\n\nconst applyChangeBatch = async (changes: RtsChangeRecord[], uid: string): Promise<void> => {\n const resetModels = new Set<string>()\n const deletesByModel = new Map<string, string[]>()\n\n for (const change of changes) {\n const modelName = typeof change.modelName === \"string\" ? change.modelName : \"\"\n if (!modelName) continue\n\n if (change.op === \"reset_model\") {\n resetModels.add(modelName)\n continue\n }\n\n if (change.op === \"delete\") {\n const docId = typeof change.docId === \"string\" ? change.docId : \"\"\n if (!docId) continue\n const existing = deletesByModel.get(modelName) ?? []\n existing.push(docId)\n deletesByModel.set(modelName, existing)\n }\n }\n\n for (const modelName of resetModels) {\n await destroyCollection(modelName, uid).catch(() => {})\n }\n\n for (const [modelName, ids] of deletesByModel.entries()) {\n if (resetModels.has(modelName)) continue\n await deleteDocs(modelName, ids, uid).catch(() => {})\n }\n}\n\nexport const syncRtsChanges = async (tenantId: string, uid: string, options: Pick<RtsConnectOptions, \"appName\"> = {}): Promise<void> => {\n ensureBrowser()\n if (!tenantId || !uid) return\n\n const storageKey = getSyncStorageKey({ tenantId, uid, appName: options.appName })\n let sinceSeq = readStoredSeq(storageKey)\n\n for (let i = 0; i < 32; i += 1) {\n const url = `${RTS_CHANGES_ROUTE}?${TENANT_ID_QUERY_PARAM}=${encodeURIComponent(tenantId)}`\n const response = await fetch(url, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sinceSeq, limit: 2000 }),\n })\n\n if (!response.ok) return\n\n const payload: unknown = await response.json().catch(() => null)\n if (!payload || typeof payload !== \"object\") return\n const payloadObj = payload as SyncChangesPayload\n const ok = payloadObj.ok\n if (ok !== true) return\n\n const latestSeq = Number(payloadObj.latestSeq ?? 0)\n const needsFullResync = Boolean(payloadObj.needsFullResync)\n\n if (needsFullResync) {\n resetRtsPouchStore({ tenantId, appName: options.appName })\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n const changesRaw = payloadObj.changes\n const changes = Array.isArray(changesRaw) ? changesRaw : []\n const normalized = changes\n .map((c): RtsChangeRecord | null => {\n if (!c || typeof c !== \"object\") return null\n const obj = c as RawSyncChangeRecord\n\n const seq = Number(obj.seq ?? 0)\n const modelName = typeof obj.modelName === \"string\" ? obj.modelName : String(obj.modelName ?? \"\")\n const op = obj.op === \"reset_model\" ? \"reset_model\" : \"delete\"\n const docId = typeof obj.docId === \"string\" && obj.docId ? obj.docId : obj.docId ? String(obj.docId) : undefined\n\n return { seq, modelName, op, ...(docId ? { docId } : {}) }\n })\n .filter((c): c is RtsChangeRecord => c !== null)\n .filter((c: RtsChangeRecord) =>\n Number.isFinite(c.seq) && c.seq > 0 && c.modelName && (c.op === \"reset_model\" || !!c.docId),\n )\n\n if (!normalized.length) {\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n await applyChangeBatch(normalized, uid)\n\n const lastSeq = normalized.reduce((max, c) => (c.seq > max ? c.seq : max), sinceSeq)\n sinceSeq = lastSeq\n writeStoredSeq(storageKey, sinceSeq)\n\n if (latestSeq > 0 && sinceSeq >= latestSeq) {\n return\n }\n }\n}\n\nconst ensureSynced = (tenantId: string, uid: string, options: RtsConnectOptions): void => {\n if (options.syncChanges === false) return\n const key = `${options.appName ?? \"\"}:${tenantId}:${uid}`\n if (syncPromise && syncKey === key) return\n\n syncKey = key\n syncPromise = syncRtsChanges(tenantId, uid, { appName: options.appName })\n .catch(() => {})\n .finally(() => {\n if (syncKey === key) {\n syncPromise = null\n }\n })\n}\n\nconst connectInternal = (\n tenantId: string,\n uid: string,\n options: RtsConnectOptions,\n { resetReconnectAttempts }: { resetReconnectAttempts: boolean },\n): Promise<void> => {\n ensureBrowser()\n\n if (!tenantId) return Promise.resolve()\n if (!uid) throw new Error(\"Missing uid\")\n\n currentTenantId = tenantId\n currentUid = uid\n connectOptions = options\n\n if (options.configureStore !== false) {\n configureRtsPouchStore({ tenantId, appName: options.appName })\n }\n ensureSynced(tenantId, uid, options)\n\n if (socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)) {\n return connectPromise ?? Promise.resolve()\n }\n\n explicitDisconnect = false\n clearReconnectTimer()\n\n const url = buildSocketUrl(tenantId, uid, options)\n\n connectPromise = new Promise((resolve, reject) => {\n if (resetReconnectAttempts) reconnectAttempts = 0\n\n let opened = false\n let settled = false\n socket = new WebSocket(url)\n\n socket.addEventListener(\"open\", () => {\n opened = true\n settled = true\n reconnectAttempts = 0\n pendingServerReconnectJitter = false\n const forceInitialQuery = hasEstablishedConnection\n resubscribeAll({ forceInitialQuery })\n hasEstablishedConnection = true\n resolve()\n })\n\n socket.addEventListener(\"message\", handleMessage)\n\n socket.addEventListener(\"close\", (event) => {\n if (!opened && !settled) {\n settled = true\n reject(new Error(`RTS WebSocket closed before opening (code=${event.code})`))\n }\n if (!explicitDisconnect) {\n pendingServerReconnectJitter = opened\n }\n\n socket = null\n connectPromise = null\n scheduleReconnect()\n })\n\n socket.addEventListener(\"error\", (err) => {\n if (settled) return\n settled = true\n reject(err instanceof Error ? err : new Error(\"RTS WebSocket error\"))\n })\n })\n\n return connectPromise\n}\n\nexport const connect = (tenantId: string, uid: string, options: RtsConnectOptions = {}): Promise<void> => {\n return connectInternal(tenantId, uid, options, { resetReconnectAttempts: true })\n}\n\nexport const disconnect = (): void => {\n explicitDisconnect = true\n clearReconnectTimer()\n hasEstablishedConnection = false\n pendingServerReconnectJitter = false\n if (socket) {\n try {\n socket.close()\n } catch {\n // ignore\n }\n }\n socket = null\n connectPromise = null\n}\n\nexport const reconnect = (tenantId: string, uid: string, options: RtsConnectOptions = {}): Promise<void> => {\n explicitDisconnect = true\n clearReconnectTimer()\n pendingServerReconnectJitter = false\n if (socket) {\n try {\n socket.close()\n } catch {\n // ignore\n }\n }\n socket = null\n connectPromise = null\n return connect(tenantId, uid, options)\n}\n\nexport const registerQuery = (\n modelName: RtsModelName,\n query: JsonObject,\n optionsOrCallback?: RtsQueryOptions | QueryCallback,\n callbackMaybe?: QueryCallback,\n behavior?: {\n runInitialNetworkQuery?: boolean\n runInitialLocalQuery?: boolean\n },\n): (() => void) | undefined => {\n let options: RtsQueryOptions\n let callback: QueryCallback | undefined\n\n if (typeof optionsOrCallback === \"function\") {\n options = {}\n callback = optionsOrCallback\n } else {\n options = optionsOrCallback ?? {}\n callback = callbackMaybe\n }\n\n if (!callback) return undefined\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"registerQuery: modelName must be a non-empty string\")\n }\n\n const queryKey = computeRtsQueryKey(query, options)\n const cbKey = `${modelName}.${queryKey}`\n const runInitialNetworkQuery = behavior?.runInitialNetworkQuery !== false\n const runInitialLocalQuery = behavior?.runInitialLocalQuery !== false\n const populateCache = preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"registerQuery\",\n )\n const hasPopulate = Boolean(populateCache)\n const hasPagination = Boolean(options.pagination)\n\n const set = queryCallbacks.get(cbKey) ?? new Set<QueryCallback>()\n set.add(callback)\n queryCallbacks.set(cbKey, set)\n\n subscriptions.set(cbKey, { modelName, query, options, queryKey, runInitialNetworkQuery, ...(populateCache ? { populateCache } : {}) })\n\n if (currentUid && runInitialLocalQuery && !hasPagination) {\n if (hasPopulate && populateCache) {\n void runPopulatedQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: populateCache.rootProjection,\n sort: options.sort,\n limit: options.limit,\n populate: populateCache.populate,\n },\n }).then(({ hit, data, context }) => {\n if (!hit) return\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n } else {\n void runQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n }).then(({ data, context }) => {\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n }\n }\n\n sendToServer({ type: \"register-query\", modelName, queryKey, query, options, runInitialQuery: runInitialNetworkQuery })\n\n return () => {\n sendToServer({ type: \"remove-query\", modelName, queryKey })\n\n const callbacks = queryCallbacks.get(cbKey)\n callbacks?.delete(callback!)\n if (callbacks && callbacks.size === 0) {\n queryCallbacks.delete(cbKey)\n subscriptions.delete(cbKey)\n }\n }\n}\n\nconst makeRunQueryKey = (): string => `run-query.${Date.now().toString(36)}.${Math.random().toString(36).slice(2, 10)}`\n\nexport const runNetworkQuery = async ({\n modelName,\n query,\n options = {},\n timeoutMs = 10_000,\n}: {\n modelName: RtsModelName\n query: JsonObject\n options?: RtsQueryOptions\n timeoutMs?: number\n}): Promise<{ data: unknown; context: RtsQueryContext }> => {\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"runNetworkQuery: modelName must be a non-empty string\")\n }\n preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"runNetworkQuery\",\n )\n\n const hasTimeout = typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0\n const timeoutStartedAt = hasTimeout ? Date.now() : 0\n\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n if (currentTenantId && currentUid) {\n try {\n const connectAttempt = connectInternal(\n currentTenantId,\n currentUid,\n connectOptions,\n { resetReconnectAttempts: false },\n )\n if (hasTimeout) {\n await new Promise<void>((resolve, reject) => {\n const timeoutId = window.setTimeout(() => {\n reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR))\n }, timeoutMs)\n connectAttempt.then(\n () => {\n window.clearTimeout(timeoutId)\n resolve()\n },\n (error) => {\n window.clearTimeout(timeoutId)\n reject(error)\n },\n )\n })\n } else {\n await connectAttempt\n }\n } catch {\n // ignore; fallback to the hard failure below\n }\n }\n }\n\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n if (hasTimeout && Date.now() - timeoutStartedAt >= timeoutMs) {\n throw new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)\n }\n throw new Error(\"runNetworkQuery: RTS socket is not connected\")\n }\n\n const remainingTimeoutMs = hasTimeout ? Math.max(0, timeoutMs - (Date.now() - timeoutStartedAt)) : null\n if (remainingTimeoutMs !== null && remainingTimeoutMs <= 0) {\n throw new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)\n }\n\n const resolvedOptions = options.key ? options : { ...options, key: makeRunQueryKey() }\n const queryKey = computeRtsQueryKey(query, resolvedOptions)\n const cbKey = `${modelName}.${queryKey}`\n\n return await new Promise<{ data: unknown; context: RtsQueryContext }>((resolve, reject) => {\n let settled = false\n let timeoutId: number | null = null\n\n const cleanup = () => {\n const callbacks = queryCallbacks.get(cbKey)\n callbacks?.delete(callback)\n if (callbacks && callbacks.size === 0) queryCallbacks.delete(cbKey)\n if (timeoutId !== null && typeof window !== \"undefined\") {\n window.clearTimeout(timeoutId)\n }\n }\n\n const settle = (next: () => void) => {\n if (settled) return\n settled = true\n cleanup()\n next()\n }\n\n const callback: QueryCallback = (error, data, context) => {\n if (error) {\n settle(() => reject(error))\n return\n }\n settle(() => resolve({ data, context }))\n }\n\n const callbacks = queryCallbacks.get(cbKey) ?? new Set<QueryCallback>()\n callbacks.add(callback)\n queryCallbacks.set(cbKey, callbacks)\n\n if (remainingTimeoutMs !== null) {\n timeoutId = window.setTimeout(() => {\n settle(() => reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)))\n }, remainingTimeoutMs)\n }\n\n sendToServer({ type: \"run-query\", modelName, queryKey, query, options: resolvedOptions })\n })\n}\n\nexport const sendMessage = (event: string, payload?: unknown): void => {\n sendToServer({ type: \"event\", event, payload })\n}\n\nexport const onMessage = (event: string, callback: (payload: unknown) => void): (() => void) => {\n const set = messageCallbacks.get(event) ?? new Set()\n set.add(callback)\n messageCallbacks.set(event, set)\n\n return () => {\n const callbacks = messageCallbacks.get(event)\n callbacks?.delete(callback)\n if (callbacks && callbacks.size === 0) messageCallbacks.delete(event)\n }\n}\n","import { useEffect, useId, useMemo, useRef, useState } from \"react\"\nimport type { PaginationPageInfo } from \"@rpcbase/api\"\n\nimport type { RtsModelName } from \"./modelTypes\"\nimport { preparePopulateCacheOptions } from \"./populateCache\"\nimport { computeRtsQueryKey } from \"./queryKey\"\nimport { consumeHydratedRtsQueryData, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, useRtsSsrRuntime } from \"./ssrHydration\"\nimport type { RtsQueryContext, RtsQueryOptions } from \"./wsClient\"\nimport { registerQuery, runNetworkQuery } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\ntype LoadedPage<T> = {\n nodes: T[]\n pageInfo?: PaginationPageInfo\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\") return undefined\n if (Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst getDocId = (doc: unknown): string => {\n if (!doc || typeof doc !== \"object\") return \"\"\n const id = (doc as { _id?: unknown })._id\n return typeof id === \"string\" ? id.trim() : \"\"\n}\n\nconst dedupeById = <T extends Record<string, unknown>>(docs: T[]): T[] => {\n const seen = new Set<string>()\n const merged: T[] = []\n\n for (const doc of docs) {\n const id = getDocId(doc)\n if (id && seen.has(id)) continue\n if (id) seen.add(id)\n merged.push(doc)\n }\n\n return merged\n}\n\nconst flattenLoadedPages = <T extends Record<string, unknown>>(\n previousPages: Array<LoadedPage<T>>,\n headPage: LoadedPage<T> | null,\n nextPages: Array<LoadedPage<T>>,\n): T[] => {\n const merged: T[] = []\n for (const page of previousPages) merged.push(...page.nodes)\n if (headPage) merged.push(...headPage.nodes)\n for (const page of nextPages) merged.push(...page.nodes)\n return dedupeById(merged)\n}\n\nconst assertIncludeOnlyProjection = (\n projection: Record<string, 0 | 1> | undefined,\n): void => {\n if (!projection) return\n\n for (const [path, value] of Object.entries(projection)) {\n if (!path.trim()) continue\n if (value !== 1) {\n throw new Error(\"useQuery: projection must be include-only (value 1); exclusion projection is not supported\")\n }\n }\n}\n\nexport type UseRtsQueryOptions = RtsQueryOptions & {\n enabled?: boolean\n skipLocal?: boolean\n ssr?: \"auto\" | boolean\n refreshOnMount?: boolean\n}\n\nexport type UseRtsQueryResult<T> = {\n data: T[] | undefined\n pageInfo?: PaginationPageInfo\n source: RtsQueryContext[\"source\"] | undefined\n error: unknown | undefined\n loading: boolean\n fetchNext: () => Promise<boolean>\n fetchPrevious: () => Promise<boolean>\n resetPagination: () => void\n}\n\nexport const useQuery = <T extends Record<string, unknown> = Record<string, unknown>>(\n modelName: RtsModelName,\n query: JsonObject = {},\n options: UseRtsQueryOptions = {},\n): UseRtsQueryResult<T> => {\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"useQuery: modelName must be a non-empty string\")\n }\n assertIncludeOnlyProjection(options.projection)\n\n const id = useId()\n\n const enabled = options.enabled ?? true\n const ssrEnabled = options.ssr !== false\n const refreshOnMount = options.refreshOnMount === true\n const key = options.key ?? id\n const queryJson = JSON.stringify(query)\n const projectionJson = options.projection ? JSON.stringify(options.projection) : \"\"\n const sortJson = options.sort ? JSON.stringify(options.sort) : \"\"\n const limitStr = typeof options.limit === \"number\" ? String(options.limit) : \"\"\n const populateJson = options.populate ? JSON.stringify(options.populate) : \"\"\n const paginationJson = options.pagination ? JSON.stringify(options.pagination) : \"\"\n preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"useQuery\",\n )\n const isPaginated = Boolean(options.pagination)\n\n const queryKey = computeRtsQueryKey(query, {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n })\n\n const ssrRuntime = useRtsSsrRuntime()\n if (enabled && ssrEnabled && ssrRuntime) {\n ssrRuntime.registerQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n },\n queryKey,\n })\n }\n\n const seedDataRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryData(modelName, queryKey)\n : peekHydratedRtsQueryData(modelName, queryKey)\n : undefined\n ),\n [enabled, ssrEnabled, ssrRuntime, modelName, queryKey],\n )\n\n const seedPageInfoRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryPageInfo(modelName, queryKey)\n : peekHydratedRtsQueryPageInfo(modelName, queryKey)\n : undefined\n ),\n [enabled, ssrEnabled, ssrRuntime, modelName, queryKey],\n )\n\n const hasSeedData = Array.isArray(seedDataRaw)\n const seedData = hasSeedData ? seedDataRaw as T[] : undefined\n const seedPageInfo = normalizePageInfo(seedPageInfoRaw)\n const seedJson = (() => {\n if (!hasSeedData) return \"\"\n try {\n return JSON.stringify(seedDataRaw)\n } catch {\n return \"\"\n }\n })()\n const seedPageInfoJson = (() => {\n if (!seedPageInfo) return \"\"\n try {\n return JSON.stringify(seedPageInfo)\n } catch {\n return \"\"\n }\n })()\n\n const [data, setData] = useState<T[] | undefined>(() => (isPaginated ? undefined : seedData))\n const [headPage, setHeadPage] = useState<LoadedPage<T> | null>(() => (\n isPaginated && seedData ? { nodes: seedData, ...(seedPageInfo ? { pageInfo: seedPageInfo } : {}) } : null\n ))\n const [previousPages, setPreviousPages] = useState<Array<LoadedPage<T>>>([])\n const [nextPages, setNextPages] = useState<Array<LoadedPage<T>>>([])\n const [source, setSource] = useState<RtsQueryContext[\"source\"] | undefined>(() => (hasSeedData ? \"cache\" : undefined))\n const [error, setError] = useState<unknown | undefined>(undefined)\n const [loading, setLoading] = useState<boolean>(enabled && !hasSeedData)\n const [pagingDirection, setPagingDirection] = useState<\"next\" | \"prev\" | null>(null)\n\n const hasFirstReply = useRef(false)\n const hasNetworkReply = useRef(false)\n const lastDataJsonRef = useRef<string>(\"\")\n const previousPagesRef = useRef<Array<LoadedPage<T>>>([])\n const nextPagesRef = useRef<Array<LoadedPage<T>>>([])\n const headPageRef = useRef<LoadedPage<T> | null>(null)\n const pagingDirectionRef = useRef<\"next\" | \"prev\" | null>(null)\n\n useEffect(() => {\n previousPagesRef.current = previousPages\n }, [previousPages])\n\n useEffect(() => {\n nextPagesRef.current = nextPages\n }, [nextPages])\n\n useEffect(() => {\n headPageRef.current = headPage\n }, [headPage])\n\n useEffect(() => {\n pagingDirectionRef.current = pagingDirection\n }, [pagingDirection])\n\n useEffect(() => {\n if (!ssrRuntime && enabled && ssrEnabled && hasSeedData) {\n consumeHydratedRtsQueryData(modelName, queryKey)\n }\n\n hasFirstReply.current = hasSeedData\n hasNetworkReply.current = false\n lastDataJsonRef.current = seedJson\n setError(undefined)\n setPreviousPages([])\n setNextPages([])\n\n if (!enabled) {\n setLoading(false)\n setData(undefined)\n setHeadPage(null)\n setSource(undefined)\n return\n }\n\n if (hasSeedData) {\n const nextSeedData = seedData as T[]\n setLoading(false)\n setSource(\"cache\")\n if (isPaginated) {\n setHeadPage({\n nodes: nextSeedData,\n ...(seedPageInfo ? { pageInfo: seedPageInfo } : {}),\n })\n setData(undefined)\n } else {\n setData(nextSeedData)\n setHeadPage(null)\n }\n return\n }\n\n setData(undefined)\n setHeadPage(null)\n setLoading(true)\n }, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey, hasSeedData, seedJson, seedPageInfoJson, isPaginated])\n\n useEffect(() => {\n if (!enabled) return\n\n const runInitialNetworkQuery = refreshOnMount || !hasSeedData\n const runInitialLocalQuery = !hasSeedData && !isPaginated\n\n const unsubscribe = registerQuery(\n modelName,\n query,\n {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n },\n (err, result, context) => {\n if (context.source === \"cache\" && hasNetworkReply.current) return\n\n if (context.source === \"network\") {\n hasNetworkReply.current = true\n }\n\n setLoading(false)\n\n if (err) {\n setError(err)\n return\n }\n\n if (!Array.isArray(result)) return\n\n if (context.source === \"network\" && context.isLocal && options.skipLocal && hasFirstReply.current) {\n return\n }\n\n hasFirstReply.current = true\n const networkPageInfo = context.source === \"network\" ? context.pageInfo : undefined\n\n const payloadForHash = isPaginated\n ? { result, pageInfo: networkPageInfo }\n : result\n\n let nextJson = \"\"\n try {\n nextJson = JSON.stringify(payloadForHash)\n } catch {\n nextJson = \"\"\n }\n\n if (nextJson && nextJson === lastDataJsonRef.current) {\n setSource(context.source)\n return\n }\n\n lastDataJsonRef.current = nextJson\n setSource(context.source)\n setError(undefined)\n\n if (isPaginated) {\n setHeadPage({\n nodes: result as T[],\n ...(networkPageInfo ? { pageInfo: networkPageInfo } : {}),\n })\n return\n }\n\n setData(result as T[])\n },\n {\n runInitialNetworkQuery,\n runInitialLocalQuery,\n },\n )\n\n return () => {\n unsubscribe?.()\n }\n }, [\n enabled,\n modelName,\n queryKey,\n queryJson,\n projectionJson,\n sortJson,\n limitStr,\n populateJson,\n paginationJson,\n hasSeedData,\n refreshOnMount,\n isPaginated,\n ])\n\n const effectivePageInfo = useMemo<PaginationPageInfo | undefined>(() => {\n if (!isPaginated) return undefined\n\n const firstPageInfo = previousPages.length > 0\n ? previousPages[0]?.pageInfo\n : headPage?.pageInfo\n\n const lastPageInfo = nextPages.length > 0\n ? nextPages[nextPages.length - 1]?.pageInfo\n : headPage?.pageInfo\n\n if (!firstPageInfo && !lastPageInfo) return undefined\n\n const hasPrevPage = Boolean(firstPageInfo?.hasPrevPage)\n const hasNextPage = Boolean(lastPageInfo?.hasNextPage)\n const prevCursor = firstPageInfo?.prevCursor\n const nextCursor = lastPageInfo?.nextCursor\n\n return {\n hasPrevPage,\n hasNextPage,\n ...(prevCursor ? { prevCursor } : {}),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }, [headPage, isPaginated, nextPages, previousPages])\n\n const mergedPaginatedData = useMemo<T[] | undefined>(() => {\n if (!isPaginated) return undefined\n if (!headPage && previousPages.length === 0 && nextPages.length === 0) return undefined\n return flattenLoadedPages(previousPages, headPage, nextPages)\n }, [headPage, isPaginated, nextPages, previousPages])\n\n const fetchNext = async (): Promise<boolean> => {\n if (!enabled || !isPaginated || !options.pagination) return false\n if (pagingDirectionRef.current) return false\n\n const currentHead = headPageRef.current\n const currentNextPages = nextPagesRef.current\n const cursor = currentNextPages.length > 0\n ? currentNextPages[currentNextPages.length - 1]?.pageInfo?.nextCursor\n : currentHead?.pageInfo?.nextCursor\n\n const hasNextPage = currentNextPages.length > 0\n ? Boolean(currentNextPages[currentNextPages.length - 1]?.pageInfo?.hasNextPage)\n : Boolean(currentHead?.pageInfo?.hasNextPage)\n\n if (!cursor || !hasNextPage) return false\n\n setPagingDirection(\"next\")\n setLoading(true)\n setError(undefined)\n\n try {\n const response = await runNetworkQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: {\n ...options.pagination,\n direction: \"next\",\n cursor,\n },\n },\n })\n\n if (!Array.isArray(response.data)) return false\n\n const page: LoadedPage<T> = {\n nodes: response.data as T[],\n ...(response.context.source === \"network\" && response.context.pageInfo\n ? { pageInfo: response.context.pageInfo }\n : {}),\n }\n\n setSource(\"network\")\n setNextPages((current) => [...current, page])\n return true\n } catch (err) {\n setError(err)\n return false\n } finally {\n setPagingDirection(null)\n setLoading(false)\n }\n }\n\n const fetchPrevious = async (): Promise<boolean> => {\n if (!enabled || !isPaginated || !options.pagination) return false\n if (pagingDirectionRef.current) return false\n\n const currentHead = headPageRef.current\n const currentPreviousPages = previousPagesRef.current\n const cursor = currentPreviousPages.length > 0\n ? currentPreviousPages[0]?.pageInfo?.prevCursor\n : currentHead?.pageInfo?.prevCursor\n\n const hasPrevPage = currentPreviousPages.length > 0\n ? Boolean(currentPreviousPages[0]?.pageInfo?.hasPrevPage)\n : Boolean(currentHead?.pageInfo?.hasPrevPage)\n\n if (!cursor || !hasPrevPage) return false\n\n setPagingDirection(\"prev\")\n setLoading(true)\n setError(undefined)\n\n try {\n const response = await runNetworkQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: {\n ...options.pagination,\n direction: \"prev\",\n cursor,\n },\n },\n })\n\n if (!Array.isArray(response.data)) return false\n\n const page: LoadedPage<T> = {\n nodes: response.data as T[],\n ...(response.context.source === \"network\" && response.context.pageInfo\n ? { pageInfo: response.context.pageInfo }\n : {}),\n }\n\n setSource(\"network\")\n setPreviousPages((current) => [page, ...current])\n return true\n } catch (err) {\n setError(err)\n return false\n } finally {\n setPagingDirection(null)\n setLoading(false)\n }\n }\n\n const resetPagination = () => {\n if (!isPaginated) return\n setPreviousPages([])\n setNextPages([])\n }\n\n return useMemo(\n () => ({\n data: isPaginated ? mergedPaginatedData : data,\n pageInfo: effectivePageInfo,\n source,\n error,\n loading,\n fetchNext,\n fetchPrevious,\n resetPagination,\n }),\n [\n data,\n effectivePageInfo,\n error,\n fetchNext,\n fetchPrevious,\n isPaginated,\n loading,\n mergedPaginatedData,\n source,\n ],\n )\n}\n"],"names":["STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY","RtsSsrRuntimeContext","createContext","hydrationDataStore","Map","hydrationPageInfoStore","makeStoreKey","modelName","queryKey","normalizeStringOrNull","value","normalized","trim","normalizePageInfo","Array","isArray","undefined","raw","hasNextPage","hasPrevPage","nextCursor","prevCursor","parseHydrationData","v","queries","entry","query","data","pageInfo","push","tenantId","uid","hydrateRtsFromWindow","window","browserWindow","parsed","clear","set","peekHydratedRtsQueryData","get","peekHydratedRtsQueryPageInfo","consumeHydratedRtsQueryData","key","delete","clearHydratedRtsQueryData","RtsSsrRuntimeProvider","t0","$","_c","children","t1","useRtsSsrRuntime","useContext","UNDERSCORE_PREFIX","DEFAULT_FIND_LIMIT","storeConfig","pouchDbPromise","lastAppliedPrefix","collections","dbNamesByPrefix","unwrapDefault","mod","maybe","default","ensureBrowser","Error","computeBasePrefix","appName","prefix","getDbNamesKey","getPrefixOverrideKey","readPrefixOverride","localStorage","getItem","endsWith","getPrefix","basePrefix","override","loadDbNames","existing","names","Set","JSON","parse","add","persistDbNames","size","removeItem","setItem","stringify","from","registerDbName","dbName","has","unregisterDbName","getPouchDb","core","indexedDbAdapter","findPlugin","Promise","all","PouchDB","plugin","applyPrefix","configureRtsPouchStore","config","getCollection","options","dbKey","db","adapter","revs_limit","replaceQueryKeys","replaceKey","map","item","obj","next","Object","create","getPrototypeOf","keys","test","newKey","getKeys","parentKey","nextKey","satisfiesProjection","doc","projection","docKeys","projectionKeys","filter","getValueAtPath","path","parts","split","part","Boolean","length","current","setValueAtPath","i","unsetValueAtPath","cloneDoc","structuredClone","toProjectionSpec","spec","entries","applyProjection","includeKeys","excludeKeys","projected","_id","hasOwn","compareSort","a","b","sort","dir","aVal","bVal","extractDocId","id","matchValue","docValue","matchValueRaw","matched","matchObj","some","startsWith","docObj","is","matchesSimpleQuery","expected","actual","remapDocFromStorage","replace","runQueryInternal","strictProjection","collection","replacedQuery","limit","Math","abs","docs","find","selector","mappedDocs","_rev","_revIgnored","rest","filteredDocs","context","source","projectionMismatch","result","runQuery","addWriteDoc","writes","docsById","sanitizePopulatedDoc","populate","ids","candidate","model","candidateDoc","nested","valueDoc","updatePopulatedDocs","roots","updateDocs","targetModelName","values","loadProjectedDocsByIds","uniqueIds","rawDocsById","projectedDocsById","$in","rawDoc","remapped","hydratePopulateEntries","currentDocs","hit","descriptors","rawValue","hasValue","allIds","flatMap","descriptor","loaded","select","populatedDocsById","match","filtered","nestedResult","reduce","acc","Number","isFinite","slice","max","floor","runPopulatedQuery","rootResult","projectedRoots","hydrated","fields","currentDocsById","String","newDocs","mongoDoc","currentDoc","nextDoc","rev","bulkDocs","deleteDocs","deletions","_deleted","destroyCollection","destroy","resetRtsPouchStore","oldPrefix","dbNames","openDbs","remaining","catch","PouchDBForPrefix","defaults","name","then","newPrefix","Date","now","toString","destroyAllCollections","dbs","EXCLUDE_PROJECTION_ERROR","sortProjectionSpec","sorted","normalizeProjectionSpec","label","hasExclude","normalizeSelectString","tokens","token","normalizePopulateSelect","normalizePopulateOptions","sortRaw","rawDirection","normalizeString","normalizeObject","normalizePopulateObject","normalizePopulateOption","preparePopulateCacheOptions","rootProjection","computeRtsQueryKey","pagination","TENANT_ID_QUERY_PARAM","RTS_CHANGES_ROUTE","MAX_TXN_BUF","SERVER_RECONNECT_DELAY_MIN_MS","SERVER_RECONNECT_DELAY_MAX_MS","RUN_NETWORK_QUERY_TIMEOUT_ERROR","socket","connectPromise","explicitDisconnect","currentTenantId","currentUid","connectOptions","localTxnBuf","queryCallbacks","subscriptions","messageCallbacks","reconnectTimer","reconnectAttempts","hasEstablishedConnection","pendingServerReconnectJitter","syncPromise","syncKey","buildSocketUrl","_uid","url","URL","searchParams","base","location","href","protocol","pathname","search","hash","sendToServer","message","readyState","WebSocket","OPEN","send","resubscribeAll","forceInitialQuery","sub","runInitialQuery","runInitialNetworkQuery","type","clearReconnectTimer","clearTimeout","scheduleReconnect","cfg","reconnect","maxAttempts","attempts","delayMs","delayMaxMs","delay","min","pow","span","random","setTimeout","connectInternal","resetReconnectAttempts","isDocWithId","handleQueryPayload","payload","error","txnId","cbKey","callbacks","subscription","populateCache","hasPopulate","hasPagination","isLocal","includes","cb","handleEvent","event","handleMessage","addLocalTxn","shift","getSyncStorageKey","readStoredSeq","num","writeStoredSeq","applyChangeBatch","changes","resetModels","deletesByModel","change","op","docId","syncRtsChanges","storageKey","sinceSeq","encodeURIComponent","response","fetch","method","credentials","headers","body","ok","json","payloadObj","latestSeq","needsFullResync","changesRaw","c","seq","lastSeq","ensureSynced","syncChanges","finally","resolve","configureStore","CONNECTING","reject","opened","settled","addEventListener","code","err","connect","disconnect","close","registerQuery","optionsOrCallback","callbackMaybe","behavior","callback","runInitialLocalQuery","makeRunQueryKey","runNetworkQuery","timeoutMs","hasTimeout","timeoutStartedAt","connectAttempt","timeoutId","remainingTimeoutMs","resolvedOptions","cleanup","settle","sendMessage","onMessage","getDocId","dedupeById","seen","merged","flattenLoadedPages","previousPages","headPage","nextPages","page","nodes","assertIncludeOnlyProjection","useQuery","useId","enabled","ssrEnabled","ssr","refreshOnMount","queryJson","projectionJson","sortJson","limitStr","populateJson","paginationJson","isPaginated","ssrRuntime","seedDataRaw","useMemo","getQueryData","seedPageInfoRaw","getQueryPageInfo","hasSeedData","seedData","seedPageInfo","seedJson","seedPageInfoJson","setData","useState","setHeadPage","setPreviousPages","setNextPages","setSource","setError","loading","setLoading","pagingDirection","setPagingDirection","hasFirstReply","useRef","hasNetworkReply","lastDataJsonRef","previousPagesRef","nextPagesRef","headPageRef","pagingDirectionRef","useEffect","nextSeedData","unsubscribe","skipLocal","networkPageInfo","payloadForHash","nextJson","effectivePageInfo","firstPageInfo","lastPageInfo","mergedPaginatedData","fetchNext","currentHead","currentNextPages","cursor","direction","fetchPrevious","currentPreviousPages","resetPagination"],"mappings":"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"}