@opendatalabs/personal-server-ts-lite 0.0.1-canary.00328bf

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/bridge.d.ts +23 -0
  2. package/dist/bridge.d.ts.map +1 -0
  3. package/dist/bridge.js +53 -0
  4. package/dist/bridge.js.map +1 -0
  5. package/dist/browser-runtime.d.ts +58 -0
  6. package/dist/browser-runtime.d.ts.map +1 -0
  7. package/dist/browser-runtime.js +214 -0
  8. package/dist/browser-runtime.js.map +1 -0
  9. package/dist/browser-tls-rustls/browser_tls_rustls.d.ts +49 -0
  10. package/dist/browser-tls-rustls/browser_tls_rustls.js +401 -0
  11. package/dist/browser-tls-rustls/browser_tls_rustls_bg.wasm +0 -0
  12. package/dist/client.d.ts +22 -0
  13. package/dist/client.d.ts.map +1 -0
  14. package/dist/client.js +408 -0
  15. package/dist/client.js.map +1 -0
  16. package/dist/derivatives.d.ts +51 -0
  17. package/dist/derivatives.d.ts.map +1 -0
  18. package/dist/derivatives.js +87 -0
  19. package/dist/derivatives.js.map +1 -0
  20. package/dist/diagnostics.d.ts +166 -0
  21. package/dist/diagnostics.d.ts.map +1 -0
  22. package/dist/diagnostics.js +265 -0
  23. package/dist/diagnostics.js.map +1 -0
  24. package/dist/index.d.ts +18 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +19 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/mcp-store.d.ts +35 -0
  29. package/dist/mcp-store.d.ts.map +1 -0
  30. package/dist/mcp-store.js +208 -0
  31. package/dist/mcp-store.js.map +1 -0
  32. package/dist/owner-binding.d.ts +7 -0
  33. package/dist/owner-binding.d.ts.map +1 -0
  34. package/dist/owner-binding.js +18 -0
  35. package/dist/owner-binding.js.map +1 -0
  36. package/dist/persistence.d.ts +69 -0
  37. package/dist/persistence.d.ts.map +1 -0
  38. package/dist/persistence.js +58 -0
  39. package/dist/persistence.js.map +1 -0
  40. package/dist/relay-tls.d.ts +61 -0
  41. package/dist/relay-tls.d.ts.map +1 -0
  42. package/dist/relay-tls.js +316 -0
  43. package/dist/relay-tls.js.map +1 -0
  44. package/dist/relay.d.ts +149 -0
  45. package/dist/relay.d.ts.map +1 -0
  46. package/dist/relay.js +646 -0
  47. package/dist/relay.js.map +1 -0
  48. package/dist/runtime.d.ts +188 -0
  49. package/dist/runtime.d.ts.map +1 -0
  50. package/dist/runtime.js +1178 -0
  51. package/dist/runtime.js.map +1 -0
  52. package/dist/state.d.ts +72 -0
  53. package/dist/state.d.ts.map +1 -0
  54. package/dist/state.js +366 -0
  55. package/dist/state.js.map +1 -0
  56. package/dist/storage-utils.d.ts +8 -0
  57. package/dist/storage-utils.d.ts.map +1 -0
  58. package/dist/storage-utils.js +67 -0
  59. package/dist/storage-utils.js.map +1 -0
  60. package/dist/storage.d.ts +61 -0
  61. package/dist/storage.d.ts.map +1 -0
  62. package/dist/storage.js +718 -0
  63. package/dist/storage.js.map +1 -0
  64. package/dist/sync.d.ts +58 -0
  65. package/dist/sync.d.ts.map +1 -0
  66. package/dist/sync.js +216 -0
  67. package/dist/sync.js.map +1 -0
  68. package/package.json +40 -0
@@ -0,0 +1,188 @@
1
+ import { type SessionTokenVerifierPort } from "@opendatalabs/personal-server-ts-core/auth";
2
+ import { type PersonalServerApiAuthPort, type PersonalServerReadAuthInput, type PersonalServerReadAuthResult, type PersonalServerReadFulfillmentReporter } from "@opendatalabs/personal-server-ts-core/api";
3
+ import { type QuestionStore, type RecomputeScheduler } from "@opendatalabs/personal-server-ts-core/derivatives";
4
+ import type { LineageGatewayPort } from "@opendatalabs/personal-server-ts-core/lineage";
5
+ import { type DataReadPolicyPorts, type DataWritePolicyPorts } from "@opendatalabs/personal-server-ts-core/policy";
6
+ import { type WriteProofReplayStore, type WriteSessionStore } from "@opendatalabs/personal-server-ts-core/write";
7
+ import type { DataStoragePort, RuntimeAvailabilityPort } from "@opendatalabs/personal-server-ts-core/ports";
8
+ import type { ScopeDeletionTracker } from "@opendatalabs/personal-server-ts-core/sync";
9
+ import type { DataPortabilityGatewayConfig, GatewayClient } from "@opendatalabs/vana-sdk/browser";
10
+ import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
11
+ import type { AccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
12
+ import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
13
+ import type { SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
14
+ import { type McpConnectionStore, type McpOAuthAuthorizationStore } from "@opendatalabs/personal-server-ts-core/mcp";
15
+ import { DiagnosticsRecorder } from "./diagnostics.js";
16
+ export interface PsLiteStorageAdapter {
17
+ kind: "indexeddb" | "opfs" | "custom";
18
+ }
19
+ export type PsLiteReadAuthInput = PersonalServerReadAuthInput;
20
+ export type PsLiteReadAuthResult = PersonalServerReadAuthResult;
21
+ export type PsLiteAuthAdapter = PersonalServerApiAuthPort;
22
+ export interface PsLiteRuntimeOptions {
23
+ storage: PsLiteStorageAdapter | DataStoragePort;
24
+ auth?: PsLiteAuthAdapter;
25
+ active?: boolean;
26
+ now?: () => Date;
27
+ config?: {
28
+ server?: {
29
+ origin?: string;
30
+ };
31
+ gateway?: Partial<DataPortabilityGatewayConfig> & {
32
+ url?: string;
33
+ };
34
+ /** X402 read enforcement. Off by default in the browser runtime. */
35
+ payment?: {
36
+ enabled?: boolean;
37
+ };
38
+ };
39
+ saveConfig?: (config: unknown) => Promise<void>;
40
+ identity?: {
41
+ address: `0x${string}`;
42
+ publicKey: `0x${string}`;
43
+ };
44
+ gateway?: GatewayClient;
45
+ serverOwner?: `0x${string}`;
46
+ serverSigner?: Pick<ServerSigner, "signGrantRegistration"> & Partial<Pick<ServerSigner, "signGrantRevocation" | "signRecordDataAccess" | "address">>;
47
+ syncManager?: (Pick<SyncManager, "trigger" | "getStatus"> & Partial<Pick<SyncManager, "start" | "stop" | "deleteScope">>) | null;
48
+ /**
49
+ * Read-side tombstone memory; reads of a scope the gateway reports deleted
50
+ * answer 410 (stale local copy or not). Built by the browser runtime
51
+ * alongside the sync manager, which keeps it current.
52
+ */
53
+ scopeDeletions?: ScopeDeletionTracker;
54
+ accessLogReader?: AccessLogReader;
55
+ accessLogWriter?: AccessLogWriter;
56
+ readFulfillmentReporter?: PersonalServerReadFulfillmentReporter;
57
+ /**
58
+ * Derivative data: gateway lineage access for the data routes (source
59
+ * lookups on write, signed lineage read, cascade delete walk).
60
+ */
61
+ lineageGateway?: LineageGatewayPort;
62
+ /**
63
+ * Derivative compute layer (store + scheduler). Omit to leave
64
+ * /v1/derivatives answering 503; see createPsLiteDerivativeCompute.
65
+ */
66
+ derivatives?: {
67
+ store: QuestionStore;
68
+ scheduler: RecomputeScheduler;
69
+ } | null;
70
+ accessToken?: string;
71
+ /**
72
+ * Write API sessions. When present, POST /v1/write/session is mounted and
73
+ * mints the bearer tokens the auth adapter redeems on POST /v1/data/:scope
74
+ * and the derivative question routes. The SAME store must be wired into the
75
+ * adapter (`writeSessions.store`); `createIndexedDbPsLiteRuntime` does both.
76
+ * Absent = owner-only ingest and no handshake endpoint.
77
+ *
78
+ * KNOWN LIMITATION, same as the Node build: sessions and the proof replay
79
+ * guard are in-memory, so a reload drops live tokens and the builder
80
+ * re-handshakes. Because both live in the same memory, a reload can never
81
+ * leave a replayable proof for a session that survived it.
82
+ */
83
+ writeSessionStore?: WriteSessionStore;
84
+ /**
85
+ * Replay guard shared by the handshake proof and the per-write proofs.
86
+ * Defaults to a fresh in-memory store.
87
+ */
88
+ writeProofReplayStore?: WriteProofReplayStore;
89
+ /**
90
+ * The audience every builder proof must name. It MUST be the origin the
91
+ * auth adapter verifies write proofs against, or a builder would have to
92
+ * sign the handshake for one audience and its writes for another. Defaults
93
+ * to the request's own origin.
94
+ */
95
+ serverOrigin?: string | (() => string);
96
+ tokenStore?: PsLiteTokenStore;
97
+ stateCapabilities?: Partial<PsLiteRuntimeStateCapabilities>;
98
+ /**
99
+ * Per-runtime MCP connection store. Omit to disable the MCP endpoints
100
+ * (`/mcp/:token` + `/v1/mcp/connections`). Pass `createInMemoryMcpConnectionStore()`
101
+ * to enable with non-persistent storage, or `createIndexedDbMcpConnectionStore()`
102
+ * for the production browser default.
103
+ */
104
+ mcpConnectionStore?: McpConnectionStore;
105
+ mcpOAuthAuthorizationStore?: McpOAuthAuthorizationStore;
106
+ mcpOAuthApprovalUrl?: string | (() => string);
107
+ /**
108
+ * Optional diagnostics recorder. When provided, GET /v1/diagnostics (owner-only)
109
+ * returns a structured snapshot useful for debugging stuck approval pages.
110
+ */
111
+ diagnostics?: DiagnosticsRecorder;
112
+ }
113
+ export interface PsLiteRuntimeStateCapabilities {
114
+ tokens: "indexeddb" | "memory" | "custom";
115
+ accessLogs: "indexeddb" | "memory" | "custom";
116
+ config: "indexeddb" | "memory" | "custom";
117
+ }
118
+ export interface PsLiteTokenStore {
119
+ getTokens(): Promise<string[]>;
120
+ isValid(token: string): Promise<boolean>;
121
+ addToken(token: string, options?: {
122
+ expiresAt?: string | Date | null;
123
+ }): Promise<void>;
124
+ removeToken(token: string): Promise<void>;
125
+ }
126
+ export interface PsLiteRuntime extends RuntimeAvailabilityPort {
127
+ readonly kind: "ps-lite";
128
+ readonly storage: PsLiteStorageAdapter | DataStoragePort;
129
+ activate(): void;
130
+ deactivate(): void;
131
+ fetch(request: Request): Promise<Response>;
132
+ }
133
+ /**
134
+ * Delegated-write (Write API) wiring for a PS-Lite auth adapter.
135
+ *
136
+ * A builder holding `write:<scope>` opens a session at POST /v1/write/session
137
+ * and then writes through the ordinary ingest endpoint. The adapter and the
138
+ * handshake route MUST share one `store` (the route mints what the adapter
139
+ * redeems) and one `replayStore` (the handshake proof and the per-write proofs
140
+ * are guarded by the same memory). `createIndexedDbPsLiteRuntime` wires both
141
+ * for you; supply them yourself only when you build the adapter by hand.
142
+ */
143
+ export interface PsLiteWriteSessionAuthOptions {
144
+ /** Live write sessions, shared with the handshake route. */
145
+ store: WriteSessionStore;
146
+ /**
147
+ * Replay guard for the per-write `X-Vana-Write-Signature` proofs. Defaults
148
+ * to a fresh in-memory store, so replay protection is always on; pass the
149
+ * runtime's store to share one guard with the handshake route.
150
+ */
151
+ replayStore?: WriteProofReplayStore;
152
+ /**
153
+ * Live builder/grant verification, re-run on EVERY delegated write, so a
154
+ * revoked or narrowed grant stops writes at the next one.
155
+ */
156
+ policyPorts: DataWritePolicyPorts;
157
+ }
158
+ export interface BearerTokenPsLiteAuthOptions {
159
+ ownerToken: string;
160
+ builderToken: string;
161
+ /**
162
+ * Optional delegated-write support. The static builder token never gains
163
+ * write access through it: a delegated write still needs a real session
164
+ * token plus the builder's signed payload proof, verified exactly as the
165
+ * Node server verifies it.
166
+ */
167
+ writeSessions?: PsLiteWriteSessionAuthOptions & {
168
+ serverOrigin: string | (() => string);
169
+ serverOwner: `0x${string}`;
170
+ };
171
+ }
172
+ export interface Web3SignedPsLiteAuthOptions {
173
+ origin: string | (() => string);
174
+ ownerAddress: `0x${string}`;
175
+ dataReadPolicyPorts?: DataReadPolicyPorts;
176
+ accessToken?: string;
177
+ tokenStore?: SessionTokenVerifierPort;
178
+ now?: () => number;
179
+ /**
180
+ * Optional delegated-write support. Absent = owner-only ingest, exactly as
181
+ * before write sessions existed.
182
+ */
183
+ writeSessions?: PsLiteWriteSessionAuthOptions;
184
+ }
185
+ export declare function createBearerTokenPsLiteAuth(options: BearerTokenPsLiteAuthOptions): PsLiteAuthAdapter;
186
+ export declare function createWeb3SignedPsLiteAuth(options: Web3SignedPsLiteAuthOptions): PsLiteAuthAdapter;
187
+ export declare function createPsLiteRuntime(options: PsLiteRuntimeOptions): PsLiteRuntime;
188
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,4CAA4C,CAAC;AAUpD,OAAO,EAOL,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,qCAAqC,EAC3C,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAIL,KAAK,qBAAqB,EAE1B,KAAK,iBAAiB,EACvB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,KAAK,EACV,4BAA4B,EAC5B,aAAa,EACd,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AACnG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAyBL,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAChC,MAAM,2CAA2C,CAAC;AAOnD,OAAO,EAEL,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;CACvC;AAED,MAAM,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,oBAAoB,GAAG,eAAe,CAAC;IAChD,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B,OAAO,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,GAAG;YAAE,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACnE,oEAAoE;QACpE,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KACjC,CAAC;IACF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,KAAK,MAAM,EAAE,CAAA;KAAE,CAAC;IAChE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAK5B,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC,GACxD,OAAO,CACL,IAAI,CACF,YAAY,EACZ,qBAAqB,GAAG,sBAAsB,GAAG,SAAS,CAC3D,CACF,CAAC;IACJ,WAAW,CAAC,EACR,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,WAAW,CAAC,GACzC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAC/D,IAAI,CAAC;IACT;;;;OAIG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,uBAAuB,CAAC,EAAE,qCAAqC,CAAC;IAChE;;;OAGG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,kBAAkB,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC5D;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,mBAAmB,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IAC9C;;;OAGG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,UAAU,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC9C,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,QAAQ,CACN,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;KAAE,GAC7C,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAMD,MAAM,WAAW,aAAc,SAAQ,uBAAuB;IAC5D,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,eAAe,CAAC;IACzD,QAAQ,IAAI,IAAI,CAAC;IACjB,UAAU,IAAI,IAAI,CAAC;IACnB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5C;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,6BAA6B;IAC5C,4DAA4D;IAC5D,KAAK,EAAE,iBAAiB,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC;;;OAGG;IACH,WAAW,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,6BAA6B,GAAG;QAC9C,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;QACtC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;KAC5B,CAAC;CACH;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,6BAA6B,CAAC;CAC/C;AA2MD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,iBAAiB,CAmCnB;AAkCD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,iBAAiB,CAgEnB;AAoFD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CA8jBf"}