@datafn/core 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/schema.ts","../src/normalize.ts","../src/envelope.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * DataFn Error Types and Envelopes\n */\n\nexport type DatafnErrorCode =\n | \"SCHEMA_INVALID\"\n | \"DFQL_INVALID\"\n | \"DFQL_UNKNOWN_RESOURCE\"\n | \"DFQL_UNKNOWN_FIELD\"\n | \"DFQL_UNKNOWN_RELATION\"\n | \"DFQL_UNSUPPORTED\"\n | \"LIMIT_EXCEEDED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"CONFLICT\"\n | \"INTERNAL\";\n\nexport type DatafnError = {\n code: DatafnErrorCode;\n message: string;\n details?: unknown;\n};\n\nexport type DatafnEnvelope<T> =\n | { ok: true; result: T }\n | { ok: false; error: DatafnError };\n\n/**\n * Helper functions for creating envelopes\n */\n\nexport function ok<T>(result: T): DatafnEnvelope<T> {\n return { ok: true, result };\n}\n\nexport function err<T = never>(\n code: DatafnErrorCode,\n message: string,\n details?: unknown\n): DatafnEnvelope<T> {\n return {\n ok: false,\n error: {\n code,\n message,\n details: details ?? { path: \"$\" },\n },\n };\n}\n","/**\n * Schema Validation\n *\n * Validates and normalizes DataFn schemas according to SCHEMA-001.\n */\n\nimport type { DatafnSchema, DatafnResourceSchema } from \"./types.js\";\nimport type { DatafnEnvelope } from \"./errors.js\";\nimport { ok, err } from \"./errors.js\";\n\n/**\n * Validates a schema and returns a normalized version.\n *\n * Normalization:\n * - Converts `indices: string[]` to `{ base: string[], search: [], vector: [] }`\n * - Ensures `relations` is present (defaults to [])\n *\n * Validation:\n * - `resources` must be present and be an array\n * - Each resource must have unique `name` and integer `version`\n * - Fields must have unique names within a resource\n */\nexport function validateSchema(schema: unknown): DatafnEnvelope<DatafnSchema> {\n // Check that schema is an object\n if (typeof schema !== \"object\" || schema === null || Array.isArray(schema)) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: expected object\", {\n path: \"$\",\n });\n }\n\n const s = schema as Record<string, unknown>;\n\n // Check resources exists and is an array\n if (!s.resources || !Array.isArray(s.resources)) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: missing resources\", {\n path: \"resources\",\n });\n }\n\n const resourceNames = new Set<string>();\n const normalizedResources: DatafnResourceSchema[] = [];\n\n for (const resource of s.resources) {\n if (\n typeof resource !== \"object\" ||\n resource === null ||\n Array.isArray(resource)\n ) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: resource must be object\", {\n path: \"resources\",\n });\n }\n\n const r = resource as Record<string, unknown>;\n\n // Validate name\n if (typeof r.name !== \"string\") {\n return err(\n \"SCHEMA_INVALID\",\n \"Invalid schema: resource.name must be string\",\n { path: \"resources\" }\n );\n }\n\n // Check for duplicate resource names\n if (resourceNames.has(r.name)) {\n return err(\n \"SCHEMA_INVALID\",\n `Invalid schema: duplicate resource name: ${r.name}`,\n { path: \"resources\" }\n );\n }\n resourceNames.add(r.name);\n\n // Validate version\n if (typeof r.version !== \"number\" || !Number.isInteger(r.version)) {\n return err(\n \"SCHEMA_INVALID\",\n \"Invalid schema: resource.version must be integer\",\n { path: \"resources\" }\n );\n }\n\n // Validate fields\n if (!Array.isArray(r.fields)) {\n return err(\n \"SCHEMA_INVALID\",\n \"Invalid schema: resource.fields must be array\",\n { path: \"resources\" }\n );\n }\n\n const fieldNames = new Set<string>();\n for (const field of r.fields) {\n if (typeof field !== \"object\" || field === null || Array.isArray(field)) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: field must be object\", {\n path: \"resources\",\n });\n }\n const f = field as Record<string, unknown>;\n if (typeof f.name !== \"string\") {\n return err(\n \"SCHEMA_INVALID\",\n \"Invalid schema: field.name must be string\",\n { path: \"resources\" }\n );\n }\n if (fieldNames.has(f.name)) {\n return err(\n \"SCHEMA_INVALID\",\n `Invalid schema: duplicate field name: ${f.name}`,\n { path: \"resources\" }\n );\n }\n fieldNames.add(f.name);\n }\n\n // Normalize indices\n let normalizedIndices: {\n base: string[];\n search: string[];\n vector: string[];\n };\n if (Array.isArray(r.indices)) {\n normalizedIndices = {\n base: r.indices as string[],\n search: [],\n vector: [],\n };\n } else if (r.indices && typeof r.indices === \"object\") {\n const idx = r.indices as Record<string, unknown>;\n normalizedIndices = {\n base: (idx.base as string[]) || [],\n search: (idx.search as string[]) || [],\n vector: (idx.vector as string[]) || [],\n };\n } else {\n normalizedIndices = { base: [], search: [], vector: [] };\n }\n\n normalizedResources.push({\n ...r,\n indices: normalizedIndices,\n } as DatafnResourceSchema);\n }\n\n // Normalize relations (default to empty array)\n const relations = Array.isArray(s.relations) ? s.relations : [];\n\n return ok({\n resources: normalizedResources,\n relations: relations as DatafnSchema[\"relations\"],\n });\n}\n","/**\n * DFQL Normalization\n *\n * Produces canonical JSON for DFQL objects to enable stable cache keys\n * and deterministic comparisons.\n */\n\n/**\n * Recursively normalizes a value:\n * - Sorts object keys alphabetically\n * - Removes undefined values\n * - Preserves arrays, primitives, and null as-is\n */\nexport function normalizeDfql(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value === null ? null : undefined;\n }\n\n if (typeof value !== \"object\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => normalizeDfql(item));\n }\n\n // Object: sort keys, remove undefined values, recursively normalize\n const normalized: Record<string, unknown> = {};\n const keys = Object.keys(value as Record<string, unknown>).sort();\n\n for (const key of keys) {\n const val = (value as Record<string, unknown>)[key];\n if (val !== undefined) {\n normalized[key] = normalizeDfql(val);\n }\n }\n\n return normalized;\n}\n\n/**\n * Returns a stable string key for a DFQL value.\n * This is the canonical form used for caching and comparison.\n */\nexport function dfqlKey(value: unknown): string {\n return JSON.stringify(normalizeDfql(value));\n}\n","/**\n * DataFn Envelope Utilities\n */\n\nimport type { DatafnEnvelope, DatafnError } from \"./errors.js\";\n\n/**\n * Unwraps a DatafnEnvelope, returning the result for ok:true\n * or throwing the exact error object for ok:false.\n *\n * This provides deterministic error handling for envelope-returning functions.\n *\n * @param env - The envelope to unwrap\n * @returns The result value for success envelopes\n * @throws The exact DatafnError object for failure envelopes\n */\nexport function unwrapEnvelope<T>(env: DatafnEnvelope<T>): T {\n if (env.ok) {\n return env.result;\n }\n // Throw the exact error object (code/message/details.path match)\n throw env.error;\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/capabilities.ts","../src/errors.ts","../src/schema.ts","../src/ns.ts","../src/normalize.ts","../src/envelope.ts","../src/kv.ts","../src/joins.ts","../src/schema-index.ts","../src/filters.ts","../src/relations.ts","../src/aggregate.ts","../src/sort.ts","../src/select.ts","../src/date.ts","../src/validate.ts","../src/hooks.ts"],"names":["err"],"mappings":";AA+IO,SAAS,aAOd,MAAA,EAAyF;AACzF,EAAA,OAAO,MAAA;AACT;;;AC7GO,IAAM,qBAAA,GAAqE;AAAA,EAChF,UAAA,EAAY;AAAA,IACV,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,IAClG,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA;AAAK,GACpG;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,IACpG,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA;AAAK,GACtG;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,IAClG,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA;AAAK,GACtG;AAAA,EACA,UAAA,EAAY,CAAC,EAAE,IAAA,EAAM,cAAc,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,UAAU,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA;AAAA,EACvH,SAAA,EAAW,CAAC,EAAE,IAAA,EAAM,cAAc,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,UAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,MAAM;AACpH;AAYO,IAAM,8BAAA,GAAsF;AAAA,EACjG,UAAA,EAAY;AAAA,IACV,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,IAClG,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA;AAAK,GACpG;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,IACpG,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,IAAA;AAAK;AAExG;AAMO,SAAS,gCAAgC,IAAA,EAA0B;AACxE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,IAAA,GAAO,8BAAA,CAA+B,GAA4B,CAAA,IAAK,EAAC;AAC9E,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA;AACjB,QAAA,KAAA,CAAM,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,gBAAgB,KAAA,EAAuC;AAC9D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,WAAA;AAC7C;AAEA,SAAS,mBAAmB,OAAA,EAA+C;AACzE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAmB;AACpC,EAAA,MAAM,UAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACpB;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,mBAAA,CACd,YACA,YAAA,EACmB;AACnB,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,aAAa,EAAC;AAEvD,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,OAAO,mBAAmB,IAAI,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/B,IAAA,OAAO,mBAAmB,CAAC,GAAG,IAAA,EAAM,GAAG,YAAY,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,SAAS,YAAY,CAAA,IAAK,MAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,EAAG;AACjE,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,YAAA,CAAa,OAAO,CAAA;AAC7C,IAAA,OAAO,kBAAA;AAAA,MACL,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAW,OAAO,KAAA,KAAU,QAAA,GAAW,CAAC,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,GAAI,IAAK;AAAA,KAClF;AAAA,EACF;AAEA,EAAA,OAAO,mBAAmB,IAAI,CAAA;AAChC;AAEO,SAAS,oBAAoB,YAAA,EAAsD;AACxF,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAEnC,EAAA,KAAA,MAAW,UAAA,IAAc,kBAAA,CAAmB,YAAY,CAAA,EAAG;AACzD,IAAA,MAAM,GAAA,GAAM,gBAAgB,UAAU,CAAA;AACtC,IAAA,KAAA,MAAW,QAAA,IAAY,qBAAA,CAAsB,GAAG,CAAA,EAAG;AACjD,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACnC,MAAA,UAAA,CAAW,GAAA,CAAI,SAAS,IAAI,CAAA;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,QAAA,EAAU,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1HO,SAAS,GAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAC5B;AAEO,SAAS,GAAA,CACd,IAAA,EACA,OAAA,EACA,OAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,KAAA,EAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,OAAA,IAAW,EAAE,IAAA,EAAM,GAAA;AAAI;AAClC,GACF;AACF;;;AChCA,IAAM,mBAAA,uBAAyD,GAAA,CAAI;AAAA,EACjE,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,QAAA,EAAU,OAAO,CAAC,CAAA;AAC9D,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AACxD,IAAM,gDAAgC,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAC,CAAA;AACzE,IAAM,yBAAA,mBAA4B,IAAI,GAAA,CAAI,CAAC,WAAW,CAAC,CAAA;AAEvD,IAAM,4BAAA,uBAA0E,GAAA,CAAI;AAAA,EAClF,YAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,mCAAA,GAAkE,CAAC,YAAA,EAAc,OAAO,CAAA;AASvF,SAAS,4BACd,YAAA,EAC4C;AAC5C,EAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,OAAO,EAAA,CAAG,EAAE,CAAA;AAC5C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAChC,IAAA,OAAO,GAAA,CAAI,kBAAkB,wCAAA,EAA0C;AAAA,MACrE,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,GAAA,CAAI,kBAAkB,4CAAA,EAA8C;AAAA,QACzE,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,4BAAA,CAA6B,GAAA,CAAI,KAAiC,CAAA,EAAG;AACxE,MAAA,OAAO,GAAA,CAAI,oBAAA,EAAsB,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,CAAA,EAAK;AAAA,QACzE,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,YAA0C,CAAA;AACnE,EAAA,OAAO,EAAA,CAAG,oCAAoC,MAAA,CAAO,CAAC,QAAQ,QAAA,CAAS,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA;AAClF;AAMA,SAAS,kBAAkB,CAAA,EAAqC;AAC9D,EAAA,IAAI,OAAO,CAAA,CAAE,UAAA,KAAe,SAAA,SAAkB,CAAA,CAAE,UAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,aAAa,MAAA,EAA+B;AAC1D,EAAA,IAAI,OAAO,MAAA,CAAO,UAAA,KAAe,SAAA,SAAkB,MAAA,CAAO,UAAA;AAC1D,EAAA,OAAO,IAAA;AACT;AAcO,SAAS,eAAe,MAAA,EAA+C;AAE5E,EAAA,IAAI,OAAO,WAAW,QAAA,IAAY,MAAA,KAAW,QAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1E,IAAA,OAAO,GAAA,CAAI,kBAAkB,iCAAA,EAAmC;AAAA,MAC9D,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,MAAM,gBAAA,GAAmB,uBAAA,CAAwB,CAAA,CAAE,YAAY,CAAA;AAC/D,EAAA,IAAI,CAAC,gBAAA,CAAiB,EAAA,EAAI,OAAO,gBAAA;AACjC,EAAA,MAAM,qBAAqB,gBAAA,CAAiB,MAAA;AAG5C,EAAA,IAAI,CAAC,EAAE,SAAA,IAAa,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/C,IAAA,OAAO,GAAA,CAAI,kBAAkB,mCAAA,EAAqC;AAAA,MAChE,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,aAAA,GAAgB,GAAA;AACtB,EAAA,IAAI,CAAA,CAAE,SAAA,CAAU,MAAA,GAAS,aAAA,EAAe;AACtC,IAAA,OAAO,GAAA,CAAI,gBAAA,EAAkB,CAAA,wCAAA,EAA2C,aAAa,CAAA,CAAA,CAAA,EAAK;AAAA,MACxF,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,MAAM,sBAA8C,EAAC;AAErD,EAAA,KAAA,MAAW,QAAA,IAAY,EAAE,SAAA,EAAW;AAClC,IAAA,IACE,OAAO,aAAa,QAAA,IACpB,QAAA,KAAa,QACb,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EACtB;AACA,MAAA,OAAO,GAAA,CAAI,kBAAkB,yCAAA,EAA2C;AAAA,QACtE,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,CAAA,GAAI,QAAA;AAGV,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,MAAA,OAAO,GAAA;AAAA,QACL,gBAAA;AAAA,QACA,8CAAA;AAAA,QACA,EAAE,MAAM,WAAA;AAAY,OACtB;AAAA,IACF;AAGA,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAC7B,MAAA,OAAO,GAAA;AAAA,QACL,gBAAA;AAAA,QACA,CAAA,yCAAA,EAA4C,EAAE,IAAI,CAAA,CAAA;AAAA,QAClD,EAAE,MAAM,WAAA;AAAY,OACtB;AAAA,IACF;AACA,IAAA,aAAA,CAAc,GAAA,CAAI,EAAE,IAAI,CAAA;AAGxB,IAAA,IAAI,OAAO,EAAE,OAAA,KAAY,QAAA,IAAY,CAAC,MAAA,CAAO,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA,EAAG;AACjE,MAAA,OAAO,GAAA;AAAA,QACL,gBAAA;AAAA,QACA,kDAAA;AAAA,QACA,EAAE,MAAM,WAAA;AAAY,OACtB;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,EAAG;AAC5B,MAAA,OAAO,GAAA;AAAA,QACL,gBAAA;AAAA,QACA,+CAAA;AAAA,QACA,EAAE,MAAM,WAAA;AAAY,OACtB;AAAA,IACF;AAGA,IAAA,MAAM,uBAAA,GAA0B,GAAA;AAChC,IAAA,IAAK,CAAA,CAAE,MAAA,CAAqB,MAAA,GAAS,uBAAA,EAAyB;AAC5D,MAAA,OAAO,GAAA;AAAA,QACL,gBAAA;AAAA,QACA,CAAA,0BAAA,EAA6B,CAAA,CAAE,IAAI,CAAA,2BAAA,EAA8B,uBAAuB,CAAA,CAAA,CAAA;AAAA,QACxF,EAAE,IAAA,EAAM,CAAA,UAAA,EAAa,CAAA,CAAE,IAAI,CAAA,OAAA,CAAA;AAAU,OACvC;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,IAAA,KAAA,MAAW,KAAA,IAAS,EAAE,MAAA,EAAQ;AAC5B,MAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,QAAA,OAAO,GAAA,CAAI,kBAAkB,sCAAA,EAAwC;AAAA,UACnE,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AACA,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,QAAA,OAAO,GAAA;AAAA,UACL,gBAAA;AAAA,UACA,2CAAA;AAAA,UACA,EAAE,MAAM,WAAA;AAAY,SACtB;AAAA,MACF;AACA,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAC1B,QAAA,OAAO,GAAA;AAAA,UACL,gBAAA;AAAA,UACA,CAAA,sCAAA,EAAyC,EAAE,IAAI,CAAA,CAAA;AAAA,UAC/C,EAAE,MAAM,WAAA;AAAY,SACtB;AAAA,MACF;AACA,MAAA,UAAA,CAAW,GAAA,CAAI,EAAE,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,MAAM,kBAAA,GAAqB,yBAAA,CAA0B,CAAA,CAAE,YAAY,CAAA;AACnE,IAAA,IAAI,CAAC,kBAAA,CAAmB,EAAA,EAAI,OAAO,kBAAA;AACnC,IAAA,MAAM,oBAAA,GAAuB,mBAAA;AAAA,MAC3B,kBAAA;AAAA,MACA,kBAAA,CAAmB;AAAA,KACrB;AAEA,IAAA,IAAI,aAAa,oBAAoB,CAAA,IAAK,CAAC,aAAA,CAAc,oBAAA,EAAsB,OAAO,CAAA,EAAG;AACvF,MAAA,OAAO,GAAA;AAAA,QACL,uBAAA;AAAA,QACA,CAAA,kDAAA,CAAA;AAAA,QACA,EAAE,IAAA,EAAM,CAAA,UAAA,EAAa,CAAA,CAAE,IAAI,CAAA,aAAA,CAAA;AAAgB,OAC7C;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,UAAA,EAAY,oBAAoB,CAAA;AAC/E,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,GAAA;AAAA,QACL,4BAAA;AAAA,QACA,CAAA,OAAA,EAAU,UAAU,KAAK,CAAA,eAAA,EAAkB,EAAE,IAAI,CAAA,gDAAA,EAAmD,UAAU,UAAU,CAAA,CAAA,CAAA;AAAA,QACxH,EAAE,MAAM,CAAA,UAAA,EAAa,CAAA,CAAE,IAAI,CAAA,QAAA,EAAW,SAAA,CAAU,KAAK,CAAA,CAAA;AAAG,OAC1D;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,oBAAoB,oBAAoB,CAAA;AAC/D,IAAA,KAAA,MAAW,iBAAiB,cAAA,EAAgB;AAC1C,MAAA,UAAA,CAAW,GAAA,CAAI,cAAc,IAAI,CAAA;AAAA,IACnC;AAGA,IAAA,IAAI,iBAAA;AAKJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AAC5B,MAAA,iBAAA,GAAoB;AAAA,QAClB,MAAM,CAAA,CAAE,OAAA;AAAA,QACR,QAAQ,EAAC;AAAA,QACT,QAAQ;AAAC,OACX;AAAA,IACF,WAAW,CAAA,CAAE,OAAA,IAAW,OAAO,CAAA,CAAE,YAAY,QAAA,EAAU;AACrD,MAAA,MAAM,MAAM,CAAA,CAAE,OAAA;AACd,MAAA,iBAAA,GAAoB;AAAA,QAClB,IAAA,EAAO,GAAA,CAAI,IAAA,IAAqB,EAAC;AAAA,QACjC,MAAA,EAAS,GAAA,CAAI,MAAA,IAAuB,EAAC;AAAA,QACrC,MAAA,EAAS,GAAA,CAAI,MAAA,IAAuB;AAAC,OACvC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,iBAAA,GAAoB,EAAE,MAAM,EAAC,EAAG,QAAQ,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAAA,IACzD;AAGA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AACrE,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,UAAA,OAAO,GAAA;AAAA,YACL,gBAAA;AAAA,YACA,CAAA,6BAAA,EAAgC,QAAQ,CAAA,aAAA,EAAgB,QAAQ,0CAA0C,CAAA,CAAE,IAAI,CAAA,qBAAA,EAAwB,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,YAClK,EAAE,IAAA,EAAM,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA;AAAG,WACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,MACvB,GAAG,CAAA;AAAA,MACH,cAAc,kBAAA,CAAmB,MAAA;AAAA,MACjC,QAAQ,CAAC,GAAI,CAAA,CAAE,MAAA,EAA2C,GAAG,cAAc,CAAA;AAAA,MAC3E,OAAA,EAAS;AAAA,KACc,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,YAAY,EAAC;AAG9D,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjE,MAAA,OAAO,GAAA,CAAI,kBAAkB,yCAAA,EAA2C;AAAA,QACtE,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,MAAM,CAAA,GAAI,GAAA;AAGV,IAAA,MAAM,mBAAA,GAAsB,CAAC,GAAA,EAAc,IAAA,KAAwB;AACjE,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,CAAC,GAAG,CAAA,GAAI,EAAC;AAC5E,MAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,QAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,EAAG;AACxD,UAAA,OAAO,GAAA;AAAA,YACL,gBAAA;AAAA,YACA,CAAA,yBAAA,EAA4B,IAAI,CAAA,8BAAA,EAAiC,IAAI,CAAA,cAAA,EAAiB,CAAC,GAAG,aAAa,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,YACnH,EAAE,IAAA,EAAM,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA;AAAG,WAC9B;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AACA,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAW;AACxB,MAAA,MAAM,CAAA,GAAI,mBAAA,CAAoB,CAAA,CAAE,IAAA,EAAM,MAAM,CAAA;AAC5C,MAAA,IAAI,GAAG,OAAO,CAAA;AAAA,IAChB;AACA,IAAA,IAAI,CAAA,CAAE,OAAO,MAAA,EAAW;AACtB,MAAA,MAAM,CAAA,GAAI,mBAAA,CAAoB,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA;AACxC,MAAA,IAAI,GAAG,OAAO,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,EAAE,SAAA,KAAc,MAAA,IAAa,OAAO,CAAA,CAAE,cAAc,QAAA,EAAU;AAChE,MAAA,OAAO,GAAA,CAAI,kBAAkB,mDAAA,EAAqD;AAAA,QAChF,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAA,CAAE,gBAAgB,MAAA,EAAW;AAC/B,MAAA,IAAI,OAAO,CAAA,CAAE,WAAA,KAAgB,QAAA,IAAY,CAAA,CAAE,WAAA,KAAgB,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,WAAW,CAAA,EAAG;AAC/F,QAAA,OAAO,GAAA,CAAI,kBAAkB,0EAAA,EAA4E;AAAA,UACvG,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AACA,MAAA,MAAM,KAAK,CAAA,CAAE,WAAA;AACb,MAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,YAAY,OAAO,EAAA,CAAG,OAAO,QAAA,EAAU;AAC5D,QAAA,OAAO,GAAA,CAAI,kBAAkB,mEAAA,EAAqE;AAAA,UAChG,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,CAAE,iBAAiB,MAAA,EAAW;AAChC,MAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC1B,QAAA,OAAO,GAAA;AAAA,UACL,gBAAA;AAAA,UACA,CAAA,sEAAA,EAAyE,EAAE,IAAI,CAAA,CAAA,CAAA;AAAA,UAC/E,EAAE,MAAM,WAAA;AAAY,SACtB;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,2BAAA,CAA4B,CAAA,CAAE,YAAY,CAAA;AAC5D,MAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAG1B,MAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,CAAE,QAAQ,KAAK,SAAA,CAAU,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5D,QAAA,MAAM,gBAAgB,IAAI,GAAA,CAAI,+BAAA,CAAgC,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/E,QAAA,MAAM,eAAe,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,EAAE,QAAA,GAAW,SAAA;AACnE,QAAA,KAAA,MAAW,SAAA,IAAa,EAAE,QAAA,EAA4C;AACpE,UAAA,IAAI,OAAO,WAAW,IAAA,KAAS,QAAA,IAAY,cAAc,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AAC5E,YAAA,OAAO,GAAA;AAAA,cACL,4BAAA;AAAA,cACA,CAAA,yBAAA,EAA4B,SAAA,CAAU,IAAI,CAAA,eAAA,EAAkB,YAAY,CAAA,kDAAA,CAAA;AAAA,cACxE,EAAE,IAAA,EAAM,CAAA,UAAA,EAAa,YAAY,CAAA,UAAA,EAAa,SAAA,CAAU,IAAI,CAAA,CAAA;AAAG,aACjE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,kBAAkB,CAAC,CAAA;AAEtC,EAAA,OAAO,EAAA,CAAG;AAAA,IACR,YAAA,EAAc,kBAAA;AAAA,IACd,SAAA,EAAW,mBAAA;AAAA,IACX,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAEA,SAAS,wBACP,KAAA,EACgD;AAChD,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA,CAAG,MAAS,CAAA;AAC5C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,GAAA,CAAI,6BAA6B,sCAAA,EAAwC;AAAA,MAC9E,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,OAAO,oBAAA,CAAqB,OAAO,cAAc,CAAA;AACnD;AAEA,SAAS,0BACP,KAAA,EACkD;AAClD,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA,CAAG,MAAS,CAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,oBAAA,CAAqB,OAAO,wBAAwB,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,8DAAA;AAAA,MACA,EAAE,MAAM,wBAAA;AAAyB,KACnC;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/B,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,uEAAA;AAAA,MACA,EAAE,MAAM,gCAAA;AAAiC,KAC3C;AAAA,EACF;AACA,EAAA,MAAM,WAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,OAAA,EAAS;AAC7B,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO,GAAA,CAAI,sBAAsB,kCAAA,EAAoC;AAAA,QACnE,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAI,GAAuB,CAAA,EAAG;AACrD,MAAA,OAAO,GAAA,CAAI,oBAAA,EAAsB,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAA,CAAA,EAAK;AAAA,QAC9D,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,QAAA,CAAS,KAAK,GAAuB,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,EAAA,CAAG,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA;AACjC;AAEA,SAAS,oBAAA,CACP,OACA,IAAA,EACmC;AACnC,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,UAAU,WAAA,EAAa;AACzB,QAAA,OAAO,GAAA;AAAA,UACL,2BAAA;AAAA,UACA,CAAA,6CAAA,CAAA;AAAA,UACA,EAAE,IAAA;AAAK,SACT;AAAA,MACF;AACA,MAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAI,KAAyB,CAAA,EAAG;AACvD,QAAA,OAAO,IAAI,oBAAA,EAAsB,CAAA,oBAAA,EAAuB,KAAK,CAAA,CAAA,CAAA,EAAK,EAAE,MAAM,CAAA;AAAA,MAC5E;AACA,MAAA,MAAA,CAAO,KAAK,KAAyB,CAAA;AACrC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,eAAA,GAAkB,wBAAA,CAAyB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAClC,MAAA;AAAA,IACF;AACA,IAAA,OAAO,eAAA;AAAA,EACT;AAGA,EAAA,OAAO,EAAA,CAAG,mBAAA,CAAoB,MAAA,EAAQ,MAAS,CAAC,CAAA;AAClD;AAEA,SAAS,wBAAA,CACP,OACA,IAAA,EACqC;AACrC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,OAAO,GAAA,CAAI,2BAAA,EAA6B,kCAAA,EAAoC,EAAE,MAAM,CAAA;AAAA,EACtF;AACA,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,IAAI,CAAC,GAAA,CAAI,SAAA,IAAa,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACvF,IAAA,OAAO,GAAA,CAAI,2BAAA,EAA6B,kCAAA,EAAoC,EAAE,MAAM,CAAA;AAAA,EACtF;AACA,EAAA,MAAM,YAAY,GAAA,CAAI,SAAA;AACtB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,MAAM,CAAA,EAAG;AACpC,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,CAAA,mCAAA,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,iBAAA,CAAA;AAAoB,KACrC;AAAA,EACF;AACA,EAAA,IACE,UAAU,MAAA,CAAO,MAAA,KAAW,CAAA,IAC5B,CAAC,UAAU,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAU,OAAO,KAAA,KAAU,QAAA,IAAY,iBAAiB,GAAA,CAAI,KAAK,CAAC,CAAA,EAC3F;AACA,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,CAAA,sEAAA,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,iBAAA,CAAA;AAAoB,KACrC;AAAA,EACF;AACA,EAAA,IACE,SAAA,CAAU,OAAA,KAAY,MAAA,KACrB,OAAO,SAAA,CAAU,OAAA,KAAY,QAAA,IAAY,CAAC,kBAAA,CAAmB,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA,CAAA,EACnF;AACA,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,CAAA,oDAAA,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,kBAAA,CAAA;AAAqB,KACtC;AAAA,EACF;AAEA,EAAA,IACE,SAAA,CAAU,iBAAA,KAAsB,MAAA,KAC/B,OAAO,SAAA,CAAU,iBAAA,KAAsB,QAAA,IACtC,CAAC,6BAAA,CAA8B,GAAA,CAAI,SAAA,CAAU,iBAAiB,CAAA,CAAA,EAChE;AACA,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,CAAA,kEAAA,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,4BAAA,CAAA;AAA+B,KAChD;AAAA,EACF;AACA,EAAA,IAAI,SAAA,CAAU,OAAA,KAAY,MAAA,IAAa,SAAA,CAAU,sBAAsB,MAAA,EAAW;AAChF,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,CAAA,qEAAA,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,UAAA,CAAA;AAAa,KAC9B;AAAA,EACF;AAEA,EAAA,IACE,UAAU,mBAAA,KAAwB,MAAA,IAClC,OAAO,SAAA,CAAU,wBAAwB,SAAA,EACzC;AACA,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,CAAA,+CAAA,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,8BAAA,CAAA;AAAiC,KAClD;AAAA,EACF;AAEA,EAAA,IACE,UAAU,gBAAA,KAAqB,MAAA,IAC/B,OAAO,SAAA,CAAU,qBAAqB,SAAA,EACtC;AACA,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,CAAA,4CAAA,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,2BAAA,CAAA;AAA8B,KAC/C;AAAA,EACF;AAEA,EAAA,IACE,SAAA,CAAU,aAAA,KAAkB,MAAA,KAC3B,OAAO,SAAA,CAAU,aAAA,KAAkB,QAAA,IAClC,CAAC,yBAAA,CAA0B,GAAA,CAAI,SAAA,CAAU,aAAa,CAAA,CAAA,EACxD;AACA,IAAA,OAAO,GAAA;AAAA,MACL,2BAAA;AAAA,MACA,CAAA,oDAAA,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,wBAAA,CAAA;AAA2B,KAC5C;AAAA,EACF;AAEA,EAAA,IAAI,mBAAA;AACJ,EAAA,IAAI,SAAA,CAAU,wBAAwB,MAAA,EAAW;AAC/C,IAAA,MAAM,MAAM,SAAA,CAAU,mBAAA;AACtB,IAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjE,MAAA,OAAO,GAAA;AAAA,QACL,2BAAA;AAAA,QACA,CAAA,iDAAA,CAAA;AAAA,QACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,8BAAA,CAAA;AAAiC,OAClD;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,GAAA;AACf,IAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,SAAA,EAAW;AACvC,MAAA,OAAO,GAAA;AAAA,QACL,2BAAA;AAAA,QACA,CAAA,uDAAA,CAAA;AAAA,QACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,sCAAA,CAAA;AAAyC,OAC1D;AAAA,IACF;AACA,IAAA,IACE,OAAO,SAAA,KAAc,MAAA,KACpB,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,SAAS,CAAA,IAC9B,CAAC,MAAA,CAAO,UAAU,KAAA,CAAM,CAAC,UAAU,OAAO,KAAA,KAAU,QAAQ,CAAA,CAAA,EAC9D;AACA,MAAA,OAAO,GAAA;AAAA,QACL,2BAAA;AAAA,QACA,CAAA,0DAAA,CAAA;AAAA,QACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,wCAAA,CAAA;AAA2C,OAC5D;AAAA,IACF;AACA,IAAA,IACE,OAAO,oBAAA,KAAyB,MAAA,IAChC,OAAO,MAAA,CAAO,yBAAyB,SAAA,EACvC;AACA,MAAA,OAAO,GAAA;AAAA,QACL,2BAAA;AAAA,QACA,CAAA,oEAAA,CAAA;AAAA,QACA,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,mDAAA,CAAA;AAAsD,OACvE;AAAA,IACF;AACA,IAAA,mBAAA,GAAsB;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,oBAAA,EAAuB,OAAO,oBAAA,IAAgD;AAAA,KAChF;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAkC;AAAA,IACtC,SAAA,EAAW;AAAA,MACT,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,SACG,SAAA,CAAU,OAAA,KACT,SAAA,CAAU,iBAAA,KAAgF,YACxF,SAAA,GACA,QAAA,CAAA;AAAA,MACN,iBAAA,EACG,SAAA,CAAU,iBAAA,IAGV,SAAA,CAAU,OAAA;AAAA,MAEb,mBAAA,EAAsB,UAAU,mBAAA,IAA+C,IAAA;AAAA,MAC/E,gBAAA,EAAmB,UAAU,gBAAA,IAA4C,IAAA;AAAA,MACzE,aAAA,EACG,UAAU,aAAA,IACX,WAAA;AAAA,MACF;AAAA;AACF,GACF;AAEA,EAAA,OAAO,GAAG,UAAU,CAAA;AACtB;AAEA,SAAS,aAAA,CAAc,MAAyB,UAAA,EAAuC;AACrF,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,QAAQ,UAAU,CAAA;AAC9C;AAEA,SAAS,aAAa,IAAA,EAAkC;AACtD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,OAAO,QAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,IAAQ,WAAA,IAAe,GAAG,CAAA;AACzF;AAEA,SAAS,4BAAA,CACP,gBACA,oBAAA,EAC8C;AAC9C,EAAA,KAAA,MAAW,OAAO,oBAAA,EAAsB;AACtC,IAAA,MAAM,GAAA,GAAM,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,WAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,sBAAsB,GAAG,CAAA;AAC9C,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,IAAI,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAClC,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,YAAY,GAAA,EAAI;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;;;ACroBO,SAAS,MAAM,QAAA,EAA4B;AAChD,EAAA,MAAM,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,IAAK,IAAA,IAAQ,MAAM,EAAE,CAAA;AAC7D,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,QAAA,CAAS,KAAK,GAAG,CAAA;AAC1B;;;ACAO,SAAS,cAAc,KAAA,EAAyB;AACrD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,KAAA,KAAU,OAAO,IAAA,GAAO,MAAA;AAAA,EACjC;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,EAChD;AAGA,EAAA,MAAM,aAAsC,EAAC;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAgC,EAAE,IAAA,EAAK;AAEhE,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,GAAA,GAAO,MAAkC,GAAG,CAAA;AAClD,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,aAAA,CAAc,GAAG,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAMO,SAAS,QAAQ,KAAA,EAAwB;AAC9C,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,KAAK,CAAC,CAAA;AAC5C;;;ACnCO,SAAS,eAAkB,GAAA,EAA2B;AAC3D,EAAA,IAAI,IAAI,EAAA,EAAI;AACV,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AAEA,EAAA,MAAM,GAAA,CAAI,KAAA;AACZ;;;ACbO,IAAM,gBAAA,GAAmB;AAMzB,SAAS,KAAK,GAAA,EAAqB;AACxC,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACnC;AAOO,SAAS,gBAAgB,MAAA,EAAoC;AAClE,EAAA,MAAM,UAAA,GAAa,OAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,gBAAgB,CAAA;AAE3E,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,IAAI,UAAA,CAAW,YAAY,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,8CAAA,EAAiD,WAAW,OAAO,CAAA;AAAA,OACrE;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAmC;AAAA,IACvC,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,gBAAA;AAAA,IACV,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,IACA,OAAA,EAAS,CAAC,IAAI,CAAA;AAAA,IACd,WAAA,EAAa;AAAA,MACX,MAAM,EAAE,MAAA,EAAQ,CAAC,IAAA,EAAM,OAAO,CAAA,EAAE;AAAA,MAChC,OAAO,EAAE,MAAA,EAAQ,CAAC,IAAA,EAAM,OAAO,CAAA;AAAE;AACnC,GACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAA,EAAW,CAAC,GAAG,MAAA,CAAO,WAAW,UAAU;AAAA,GAC7C;AACF;;;ACxDO,SAAS,eAAA,CACd,IAAA,EACA,QAAA,EACA,EAAA,EACQ;AACR,EAAA,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,QAAQ,IAAI,EAAE,CAAA,CAAA;AACvC;AAOO,SAAS,gBAAA,CACd,IAAA,EACA,QAAA,EACA,SAAA,EACQ;AACR,EAAA,OAAO,SAAA,IAAa,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACvD;AAWO,SAAS,sBAAA,CACd,WACA,cAAA,EACU;AACV,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,IAAI,GAAA,CAAI,IAAA,GAAO,CAAC,GAAA,CAAI,IAAI,CAAA;AAC5D,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,IAAI,GAAA,CAAI,EAAA,GAAK,CAAC,GAAA,CAAI,EAAE,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,IAAI,QAAA,IAAY,KAAA;AAChC,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,EAAG;AAC9C,MAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,QAAA,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,CAAA,EAAG,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;;;AC7CO,SAAS,iBAAiB,MAAA,EAAmC;AAClE,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAkC;AAC9D,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAA4C;AACzE,EAAA,MAAM,mBAAA,uBAA0B,GAAA,EAAoC;AACpE,EAAA,MAAM,qBAAA,uBAA4B,GAAA,EAAoC;AAEtE,EAAA,KAAA,MAAW,QAAA,IAAY,OAAO,SAAA,EAAW;AACvC,IAAA,eAAA,CAAgB,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAC3C,IAAA,MAAM,QAAA,uBAAe,GAAA,EAA+B;AACpD,IAAA,KAAA,MAAW,KAAA,IAAS,SAAS,MAAA,EAAQ;AACnC,MAAA,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IAChC;AACA,IAAA,gBAAA,CAAiB,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAC5C,IAAA,mBAAA,CAAoB,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AACzC,IAAA,qBAAA,CAAsB,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,KAAA,MAAW,GAAA,IAAO,OAAO,SAAA,EAAW;AAClC,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,IAAI,GAAA,CAAI,IAAA,GAAO,CAAC,GAAA,CAAI,IAAI,CAAA;AACpE,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,IAAI,GAAA,CAAI,EAAA,GAAK,CAAC,GAAA,CAAI,EAAE,CAAA;AAE5D,MAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,QAAA,MAAM,aAAA,GAAgB,qBAAA,CAAsB,GAAA,CAAI,OAAO,KAAK,EAAC;AAC7D,QAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AACtB,QAAA,qBAAA,CAAsB,GAAA,CAAI,SAAS,aAAa,CAAA;AAEhD,QAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,GAAA,CAAI,OAAO,KAAK,EAAC;AAC1D,QAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AACrB,QAAA,mBAAA,CAAoB,GAAA,CAAI,SAAS,YAAY,CAAA;AAAA,MAC/C;AAEA,MAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,QAAA,IAAI,IAAI,OAAA,EAAS;AACf,UAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,GAAA,CAAI,KAAK,KAAK,EAAC;AACxD,UAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/B,YAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AACrB,YAAA,mBAAA,CAAoB,GAAA,CAAI,OAAO,YAAY,CAAA;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,eAAA,EAAiB,gBAAA,EAAkB,mBAAA,EAAqB,qBAAA,EAAsB;AACzF;AAEO,SAAS,WAAA,CACd,OACA,IAAA,EACkC;AAClC,EAAA,OAAO,KAAA,CAAM,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AACvC;AAEO,SAAS,QAAA,CACd,KAAA,EACA,QAAA,EACA,KAAA,EAC+B;AAC/B,EAAA,OAAO,MAAM,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,EAAG,IAAI,KAAK,CAAA;AACxD;AAEO,SAAS,gBAAA,CACd,OACA,QAAA,EACwB;AACxB,EAAA,OAAO,KAAA,CAAM,qBAAA,CAAsB,GAAA,CAAI,QAAQ,KAAK,EAAC;AACvD;AAEO,SAAS,WAAA,CACd,KAAA,EACA,YAAA,EACA,YAAA,EACkC;AAClC,EAAA,MAAM,YAAY,KAAA,CAAM,qBAAA,CAAsB,GAAA,CAAI,YAAY,KAAK,EAAC;AACpE,EAAA,OAAO,UAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,YAAY,CAAA;AAC1D;AAEO,SAAS,kBAAkB,QAAA,EAAwC;AACxE,EAAA,OAAO,KAAA,CAAM,QAAQ,QAAA,CAAS,EAAE,IAAI,QAAA,CAAS,EAAA,CAAG,CAAC,CAAA,GAAI,QAAA,CAAS,EAAA;AAChE;AAMO,SAAS,yBAAA,CACd,MAAA,EACA,QAAA,EACA,YAAA,EACkC;AAClC,EAAA,OAAO,OAAO,SAAA,EAAW,IAAA;AAAA,IACvB,CAAC,CAAA,KACE,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,QAAA,KAAa,YAAA,IACtC,CAAA,CAAE,EAAA,KAAO,QAAA,IAAY,CAAA,CAAE,OAAA,KAAY;AAAA,GACxC;AACF;;;AC7GO,IAAM,QAAA,GAAmC;AAAA,EAC9C,EAAA,EAAI,KAAA;AAAA,EAAO,EAAA,EAAI,KAAA;AAAA,EAAO,EAAA,EAAI,KAAA;AAAA,EAAO,GAAA,EAAK,MAAA;AAAA,EAAQ,EAAA,EAAI,KAAA;AAAA,EAAO,GAAA,EAAK,MAAA;AAAA,EAC9D,EAAA,EAAI,KAAA;AAAA,EAAO,MAAA,EAAQ,MAAA;AAAA,EACnB,IAAA,EAAM,OAAA;AAAA,EAAS,KAAA,EAAO,QAAA;AAAA,EAAU,QAAA,EAAU,WAAA;AAAA,EAAa,SAAA,EAAW,YAAA;AAAA,EAClE,OAAA,EAAS,UAAA;AAAA,EAAY,WAAA,EAAa,cAAA;AAAA,EAClC,QAAA,EAAU,WAAA;AAAA,EAAa,YAAA,EAAc,eAAA;AAAA,EACrC,MAAA,EAAQ,SAAA;AAAA,EAAW,KAAA,EAAO,QAAA;AAAA,EAAU,OAAA,EAAS,UAAA;AAAA,EAAY,WAAA,EAAa;AACxE;AAGO,SAAS,mBAAmB,OAAA,EAA2D;AAC5F,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IAAA,CAAK,QAAQ,MAAA,IAAU,GAAA,KAAQ,UAAU,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC7D,MAAA,GAAA,CAAI,GAAG,CAAA,GAAK,KAAA,CAAoC,GAAA,CAAI,kBAAkB,CAAA;AAAA,IACxE,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/E,MAAA,MAAM,GAAA,GAAM,KAAA;AACZ,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7C,QAAA,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA,IAAK,EAAE,CAAA,GAAI,KAAA;AAAA,MACnC;AACA,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,UAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAOA,SAAS,SAAA,CAAU,MAA2B,OAAA,EAAwB;AACpE,EAAA,MAAMA,IAAAA,GAA8C,EAAE,IAAA,EAAM,OAAA,EAAQ;AACpE,EAAA,MAAMA,IAAAA;AACR;AAKA,SAAS,YAAA,CAAa,SAAiB,eAAA,EAAkC;AACvE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAClG,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAA,EAAK,eAAA,GAAkB,MAAM,EAAE,CAAA;AAC9D;AAKA,SAAS,WAAA,CAAY,QAAiC,KAAA,EAA0B;AAC9E,EAAA,IAAI,OAAA,GAAmB,MAAA;AACvB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,YAAY,IAAA,IAAQ,OAAA,KAAY,UAAa,OAAO,OAAA,KAAY,UAAU,OAAO,MAAA;AACrF,IAAA,OAAA,GAAW,QAAoC,IAAI,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,iBAAA,CAAkB,YAAqB,GAAA,EAAuC;AACrF,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7C,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,KAAA;AACH,QAAA,IAAI,UAAA,KAAe,OAAO,OAAO,KAAA;AACjC,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAI,UAAA,KAAe,OAAO,OAAO,KAAA;AACjC,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAI,EAAG,UAAA,GAAyB,KAAA,CAAA,EAAmB,OAAO,KAAA;AAC1D,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAI,EAAG,UAAA,IAA0B,KAAA,CAAA,EAAmB,OAAO,KAAA;AAC3D,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAI,EAAG,UAAA,GAAyB,KAAA,CAAA,EAAmB,OAAO,KAAA;AAC1D,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAI,EAAG,UAAA,IAA0B,KAAA,CAAA,EAAmB,OAAO,KAAA;AAC3D,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,SAAA,CAAU,gBAAgB,CAAA,kBAAA,CAAoB,CAAA;AACzE,QAAA,IAAI,CAAE,KAAA,CAAoB,QAAA,CAAS,UAAU,GAAG,OAAO,KAAA;AACvD,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,SAAA,CAAU,gBAAgB,CAAA,mBAAA,CAAqB,CAAA;AAC1E,QAAA,IAAK,KAAA,CAAoB,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,KAAA;AACtD,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,UAAA,IAAI,CAAE,UAAA,CAAsB,QAAA,CAAS,KAAe,GAAG,OAAO,KAAA;AAAA,QAChE,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AACpC,UAAA,IAAI,CAAE,UAAA,CAAyB,QAAA,CAAS,KAAK,GAAG,OAAO,KAAA;AAAA,QACzD,CAAA,MAAO;AACL,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,IAAI,OAAO,UAAA,KAAe,QAAA,EAAU,OAAO,KAAA;AAC3C,QAAA,IAAI,CAAE,UAAA,CAAsB,UAAA,CAAW,KAAe,GAAG,OAAO,KAAA;AAChE,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAI,OAAO,UAAA,KAAe,QAAA,EAAU,OAAO,KAAA;AAC3C,QAAA,IAAI,CAAE,UAAA,CAAsB,QAAA,CAAS,KAAe,GAAG,OAAO,KAAA;AAC9D,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AACxE,QAAA,IAAI,CAAC,aAAa,KAAA,EAAO,KAAK,EAAE,IAAA,CAAK,UAAU,GAAG,OAAO,KAAA;AACzD,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AACxE,QAAA,IAAI,CAAC,aAAa,KAAA,EAAO,IAAI,EAAE,IAAA,CAAK,UAAU,GAAG,OAAO,KAAA;AACxD,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AACxE,QAAA,IAAI,aAAa,KAAA,EAAO,KAAK,EAAE,IAAA,CAAK,UAAU,GAAG,OAAO,KAAA;AACxD,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AACxE,QAAA,IAAI,aAAa,KAAA,EAAO,IAAI,EAAE,IAAA,CAAK,UAAU,GAAG,OAAO,KAAA;AACvD,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,IAAI,UAAU,IAAA,IAAQ,UAAA,KAAe,IAAA,IAAQ,UAAA,KAAe,QAAW,OAAO,KAAA;AAC9E,QAAA,IAAI,UAAU,KAAA,KAAU,UAAA,KAAe,IAAA,IAAQ,UAAA,KAAe,SAAY,OAAO,KAAA;AACjF,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,IAAI,UAAU,IAAA,KAAS,UAAA,KAAe,IAAA,IAAQ,UAAA,KAAe,SAAY,OAAO,KAAA;AAChF,QAAA,IAAI,UAAU,KAAA,IAAS,UAAA,KAAe,IAAA,IAAQ,UAAA,KAAe,QAAW,OAAO,KAAA;AAC/E,QAAA;AAAA,MACF,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,OAAA,GACJ,UAAA,KAAe,IAAA,IACf,UAAA,KAAe,MAAA,IACf,UAAA,KAAe,EAAA,IACd,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAM,UAAA,CAAyB,MAAA,KAAW,CAAA;AACrE,QAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,CAAC,OAAA,EAAS,OAAO,KAAA;AACvC,QAAA,IAAI,KAAA,KAAU,KAAA,IAAS,OAAA,EAAS,OAAO,KAAA;AACvC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,OAAA,GACJ,UAAA,KAAe,IAAA,IACf,UAAA,KAAe,MAAA,IACf,UAAA,KAAe,EAAA,IACd,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAM,UAAA,CAAyB,MAAA,KAAW,CAAA;AACrE,QAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAA,EAAS,OAAO,KAAA;AACtC,QAAA,IAAI,KAAA,KAAU,KAAA,IAAS,CAAC,OAAA,EAAS,OAAO,KAAA;AACxC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,SAAA;AACH,QAAA,IAAI,EAAG,UAAA,GAAkC,KAAA,CAAA,EAA4B,OAAO,KAAA;AAC5E,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,EAAG,UAAA,GAAkC,KAAA,CAAA,EAA4B,OAAO,KAAA;AAC5E,QAAA;AAAA,MACF,KAAK,UAAA,EAAY;AACf,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAM,MAAoB,MAAA,KAAW,CAAA;AAC3D,UAAA,SAAA,CAAU,gBAAgB,CAAA,mCAAA,CAAqC,CAAA;AACjE,QAAA,MAAM,CAAC,GAAA,EAAK,IAAI,CAAA,GAAI,KAAA;AACpB,QAAA,MAAM,EAAA,GAAK,UAAA;AACX,QAAA,IAAI,EAAG,EAAA,IAAkB,GAAA,IAAmB,EAAA,IAAkB,OAAkB,OAAO,KAAA;AACvF,QAAA;AAAA,MACF;AAAA,MACA,KAAK,cAAA,EAAgB;AACnB,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAM,MAAoB,MAAA,KAAW,CAAA;AAC3D,UAAA,SAAA,CAAU,gBAAgB,CAAA,uCAAA,CAAyC,CAAA;AACrE,QAAA,MAAM,CAAC,GAAA,EAAK,IAAI,CAAA,GAAI,KAAA;AACpB,QAAA,MAAM,EAAA,GAAK,UAAA;AACX,QAAA,IAAI,EAAG,EAAA,GAAiB,GAAA,IAAmB,EAAA,GAAiB,OAAkB,OAAO,KAAA;AACrF,QAAA;AAAA,MACF;AAAA,MACA;AACE,QAAA,SAAA,CAAU,kBAAA,EAAoB,CAAA,2BAAA,EAA8B,EAAE,CAAA,CAAE,CAAA;AAAA;AACpE,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,IAAM,gBAAA,GAAmB,EAAA;AASlB,SAAS,cAAA,CACd,MAAA,EACA,OAAA,EACA,IAAA,EACA,SAAS,CAAA,EACA;AAET,EAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,IAAA,SAAA,CAAU,cAAA,EAAgB,CAAA,wCAAA,EAA2C,gBAAgB,CAAA,CAAE,CAAA;AAAA,EACzF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,SAAA,CAAU,gBAAgB,oBAAoB,CAAA;AACzE,MAAA,KAAA,MAAW,OAAO,KAAA,EAAoC;AACpD,QAAA,IAAI,CAAC,eAAe,MAAA,EAAQ,GAAA,EAAK,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,KAAA;AAAA,MAC7D;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,SAAA,CAAU,gBAAgB,mBAAmB,CAAA;AACxE,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,OAAO,KAAA,EAAoC;AACpD,QAAA,IAAI,eAAe,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,MAAA,GAAS,CAAC,CAAA,EAAG;AAAE,UAAA,OAAA,GAAU,IAAA;AAAM,UAAA;AAAA,QAAO;AAAA,MAC9E;AACA,MAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACrB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,MAAA,MAAM,QAAA,GAAW,OAAO,QAAQ,CAAA;AAEhC,MAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,IAAA,EAAM;AAE/C,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAC1C,QAAA,IAAI,CAAC,kBAAA,CAAmB,QAAA,EAAU,KAAK,GAAG,OAAO,KAAA;AAAA,MACnD,CAAA,MAAA,IAAW,MAAM,eAAA,EAAiB;AAEhC,QAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,EAAA;AAClC,QAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AACxB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,UAAU,QAAQ,CAAA;AACjE,QAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACjC,QAAA,MAAM,SAAA,GAAY,EAAE,CAAC,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,GAAG,KAAA,EAAM;AACtD,QAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AAAA,UAAK,CAAC,CAAA,KAC7B,cAAA,CAAe,CAAA,EAAG,WAAW,IAAI;AAAA,SACnC;AACA,QAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAAA,MACxB,CAAA,MAAO;AAEL,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,OAAO,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,kBAAA,CAAmB,UAAA,EAAY,KAAK,GAAG,OAAO,KAAA;AAAA,EACrD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,YAAqB,KAAA,EAAyB;AACxE,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxE,IAAA,OAAO,iBAAA,CAAkB,YAAY,KAAgC,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO,UAAA,KAAe,KAAA;AACxB;;;ACtPO,SAAS,yBACd,OAAA,EACsB;AACtB,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,SAAS,QAAA,EAAU,IAAI,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AAC3B,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,EAAC,EAAE;AAAA,MACpC;AACA,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,QAAA,MAAM,EAAE,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,IAAA;AAC1B,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,UAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,QAC1E;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAgB,QAAA,EAAU,IAAA,EAAK;AAAA,MAChD;AACA,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH;AACA,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,IAAA,MAAM,EAAE,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,OAAA;AAC1B,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,IAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AAAA,EAClD;AACA,EAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AACxF;;;ACvCO,SAAS,oBAAA,CACd,EAAA,EACA,KAAA,EACA,OAAA,EACS;AACT,EAAA,IAAI,OAAO,OAAA,EAAS;AAMlB,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CACZ,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,CACnB,OAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAA,IAAQ,MAAM,MAAS,CAAA;AAE9C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,IAAK,IAAI,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,IAAI,GAAA,GAAM,OAAO,CAAC,CAAA;AAClB,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,CAAA,GAAI,KAAK,GAAA,GAAM,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,IAAI,GAAA,GAAM,OAAO,CAAC,CAAA;AAClB,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,CAAA,GAAI,KAAK,GAAA,GAAM,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAA,CAAO,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,IAAK,IAAI,CAAC,CAAA;AAC1E,IAAA,OAAQ,MAAiB,MAAA,CAAO,MAAA;AAAA,EAClC;AACA,EAAA,OAAO,IAAA;AACT;;;AC1CO,SAAS,eAAe,IAAA,EAAwC;AACrE,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,SAAU,EAAC;AAExC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AACxB,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,WAAW,MAAA,EAAO;AAAA,IACnD;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,aAAa,EAAA,EAAI;AACnB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AACpC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AACzC,MAAA,OAAO,EAAE,OAAO,SAAA,EAAU;AAAA,IAC5B;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,KAAA,EAAM;AAAA,EACzC,CAAC,CAAA;AACH;AAMO,SAAS,WAAA,CACd,SACA,KAAA,EAC2B;AAC3B,EAAA,OAAO,CAAC,GAAG,OAAO,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACjC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAEzB,MAAA,IAAI,SAAS,IAAA,EAAM;AAEnB,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW;AACvC,QAAA,GAAA,GAAM,CAAA;AAAA,MACR,CAAA,MAAA,IAAW,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW;AAC9C,QAAA,GAAA,GAAM,EAAA;AAAA,MACR,WAAW,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,SAAS,QAAA,EAAU;AAC/D,QAAA,GAAA,GAAM,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MAC/B,WAAW,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,SAAS,QAAA,EAAU;AAC/D,QAAA,GAAA,GAAM,IAAA,GAAO,IAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,GAAA,GAAM,OAAO,IAAI,CAAA,CAAE,aAAA,CAAc,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,MAC/C;AAEA,MAAA,IAAI,QAAQ,CAAA,EAAG,OAAO,KAAK,SAAA,KAAc,KAAA,GAAQ,MAAM,CAAC,GAAA;AAAA,IAC1D;AAGA,IAAA,OAAO,MAAA,CAAO,CAAA,CAAE,EAAA,IAAM,EAAE,CAAA,CAAE,cAAc,MAAA,CAAO,CAAA,CAAE,EAAA,IAAM,EAAE,CAAC,CAAA;AAAA,EAC5D,CAAC,CAAA;AACH;;;ACjDO,SAAS,iBAAiB,KAAA,EAA4B;AAC3D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAEhE,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,SAAA,EAAU;AAC5C;;;ACZA,SAAS,YAAY,GAAA,EAAoB;AACvC,EAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAS,GAAA,EAAI;AAC7C;AAMO,SAAS,UAAU,KAAA,EAAwB;AAChD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,MAAM,EAAA,GAAK,MAAM,OAAA,EAAQ;AACzB,IAAA,IAAI,KAAA,CAAM,EAAE,CAAA,EAAG,WAAA,CAAY,CAAA,mBAAA,CAAqB,CAAA;AAChD,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,KAAK,EAAE,OAAA,EAAQ;AACnC,IAAA,IAAI,MAAM,EAAE,CAAA,EAAG,WAAA,CAAY,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAC1D,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,WAAA,CAAY,CAAA,4BAAA,EAA+B,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAC5D;AAMO,SAAS,YAAY,KAAA,EAAsB;AAChD,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,IAAI,MAAM,KAAA,CAAM,OAAA,EAAS,CAAA,cAAe,CAAA,mBAAA,CAAqB,CAAA;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAI,KAAK,KAAK,CAAA;AACpD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,IAAI,KAAA,CAAM,EAAE,OAAA,EAAS,GAAG,WAAA,CAAY,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AACnE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,WAAA,CAAY,CAAA,wBAAA,EAA2B,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AACxD;AAWO,SAAS,uBAAA,CACd,QACA,MAAA,EACyB;AACzB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AACvC,IAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,SAAA,CAAU,GAAG,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,qBAAA,CACd,QACA,MAAA,EACyB;AACzB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AACvC,IAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,WAAA,CAAY,GAAG,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,MAAA;AACT;;;ACjFA,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA;AAMzE,IAAM,WAAA,GAAc,yEAAA;AAMb,SAAS,wBAAwB,GAAA,EAA6C;AACnF,EAAA,MAAM,OAAA,uBAAc,OAAA,EAAgB;AAEpC,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAkD;AAC/D,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAEA,IAAA,MAAM,WAAA,GAAc,KAAA;AACpB,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AACA,IAAA,OAAA,CAAQ,IAAI,WAAW,CAAA;AAEvB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,MAAW,WAAW,KAAA,EAAO;AAC3B,QAAA,MAAM,YAAA,GAAe,MAAM,OAAO,CAAA;AAClC,QAAA,IAAI,CAAC,YAAA,CAAa,EAAA,EAAI,OAAO,YAAA;AAAA,MAC/B;AACA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA,EAAG;AAC/D,MAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAA,EAAI;AAAA,MAC1B;AACA,MAAA,MAAM,YAAA,GAAe,KAAA,CAAO,KAAA,CAAkC,GAAG,CAAC,CAAA;AAClE,MAAA,IAAI,CAAC,aAAa,EAAA,EAAI;AACpB,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,EACpB,CAAA;AAEA,EAAA,OAAO,MAAM,GAAG,CAAA;AAClB;AAMO,SAAS,kBAAA,CACd,UAAA,EACA,KAAA,EACA,QAAA,EACiC;AAEjC,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,IAAI,QAAA,EAAU,OAAO,EAAE,EAAA,EAAI,IAAA,EAAK;AAChC,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,SAAA,EAAY,UAAU,CAAA,UAAA,CAAA,EAAa;AAAA,EAChE;AAEA,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,QAAA;AACH,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,qBAAA,EAAwB,OAAO,KAAK,CAAA,CAAA,EAAG;AAAA,MACpE;AACA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IAEpB,KAAK,QAAA;AACH,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AACpD,QAAA,MAAM,MAAA,GAAS,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,OAAO,KAAA;AAC1D,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,qBAAA,EAAwB,MAAM,CAAA,CAAA,EAAG;AAAA,MAC9D;AACA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IAEpB,KAAK,SAAA;AACH,MAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,sBAAA,EAAyB,OAAO,KAAK,CAAA,CAAA,EAAG;AAAA,MACrE;AACA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IAEpB,KAAK,MAAA;AAEH,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG;AAC/D,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,wEAAA,CAAA,EAA2E;AAAA,QACxG;AACA,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AACA,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AACA,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,qDAAA,EAAwD,OAAO,KAAK,CAAA,CAAA,EAAG;AAAA,IAEpG,KAAK,QAAA;AAEH,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,QAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,UAAU,OAAO,KAAA;AACvD,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,qBAAA,EAAwB,MAAM,CAAA,CAAA,EAAG;AAAA,MAC9D;AACA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IAEpB,KAAK,OAAA;AACH,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,oBAAA,EAAuB,OAAO,KAAK,CAAA,CAAA,EAAG;AAAA,MACnE;AACA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IAEpB,KAAK,MAAA;AACH,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,4BAAA,EAA+B,OAAO,KAAK,CAAA,CAAA,EAAG;AAAA,MAC3E;AACA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IAEpB,KAAK,MAAA;AACH,MAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AACxF,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AACA,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AACA,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,mBAAA,EAAsB,OAAO,KAAK,CAAA,CAAA,EAAG;AAAA,IAElE;AACE,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAA,EAAG;AAAA;AAEtE;;;ACvHA,SAAS,SAAA,CAAUA,IAAAA,EAAc,UAAA,EAAoB,QAAA,EAA6B;AAChF,EAAA,IAAIA,IAAAA,IAAO,OAAOA,IAAAA,KAAQ,QAAA,EAAU;AAClC,IAAA,MAAM,CAAA,GAAIA,IAAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA,EAAO,EAAE,IAAA,IAAmB,UAAA;AAAA,MAC5B,OAAA,EAAU,EAAE,OAAA,IAAsB,cAAA;AAAA,MAClC,OAAA,EAAS,EAAE,IAAA,EAAM,CAAA,QAAA,EAAW,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,GAAK,CAAA,CAAE,OAAA,IAAuC,EAAC;AAAG,KAC1G;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,OAAOA,IAAG,CAAA;AAAA,IACnB,SAAS,EAAE,IAAA,EAAM,WAAW,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAG,GACvD;AACF;AASA,eAAsB,aAAA,CACpB,SACA,GAAA,EACA,QAAA,EACA,KACA,OAAA,EACA,OAAA,GAAqB,EAAC,EACQ;AAC9B,EAAA,IAAI,OAAA,GAAU,OAAA;AACd,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAE7D,EAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAA,GAAO,OAAO,QAAQ,CAAA;AAC5B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,EAAK,GAAG,SAAS,OAAO,CAAA;AAClD,MAAA,IAAI,MAAA,KAAW,QAAW,OAAA,GAAU,MAAA;AAAA,IACtC,SAASA,IAAAA,EAAK;AACZ,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,SAAA,CAAUA,IAAAA,EAAK,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAE;AAAA,IAC3E;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,OAAA,EAAQ;AACpC;AAQA,eAAsB,YAAA,CACpB,SACA,GAAA,EACA,QAAA,EACA,KACA,OAAA,EACA,MAAA,EACA,OAAA,GAAqB,EAAC,EACP;AACf,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAE7D,EAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAA,GAAO,OAAO,QAAQ,CAAA;AAC5B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,GAAA,EAAK,GAAG,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,IAC7C,SAASA,IAAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,UAAU,MAAA,CAAO,IAAI,IAAI,MAAA,CAAO,QAAQ,CAAC,CAAA,OAAA,CAAA,EAAWA,IAAG,CAAA;AAAA,IACvE;AAAA,EACF;AACF","file":"index.js","sourcesContent":["/**\n * DataFn Schema Types\n */\n\nimport type { DatafnError } from \"./errors.js\";\nimport type {\n CapabilityEntry,\n SchemaCapabilities,\n ResourceCapabilities,\n SimpleCapability,\n} from \"./capabilities.js\";\n\nexport type DatafnSchema = {\n capabilities?: SchemaCapabilities;\n resources: DatafnResourceSchema[];\n relations?: DatafnRelationSchema[];\n /** Defaults to true. Set to false to disable row-level namespace isolation. */\n namespaced?: boolean;\n};\n\n/**\n * Permissions policy shape for server-side authorization enforcement.\n * All field arrays are optional; if omitted, no fields are accessible.\n */\nexport type DatafnPermissionsPolicy = {\n /**\n * Read policy: controls which fields can be selected and filtered.\n */\n read?: {\n fields: string[];\n };\n /**\n * Write policy: controls which fields can be written via mutations.\n */\n write?: {\n fields: string[];\n };\n /**\n * Optional owner field for owner-scoped resources.\n * When set, additional owner-based authorization checks can be performed.\n */\n ownerField?: string;\n};\n\nexport type DatafnResourceSchema = {\n name: string;\n version: number;\n idPrefix?: string;\n isRemoteOnly?: boolean;\n /**\n * Resource capabilities.\n * For shareable resources, SPV2 extends shareable config with\n * visibility/membership/scope-related options while preserving legacy fields.\n */\n capabilities?: ResourceCapabilities;\n fields: DatafnFieldSchema[];\n indices?:\n | {\n base?: string[];\n search?: string[];\n vector?: string[];\n }\n | string[];\n permissions?: DatafnPermissionsPolicy;\n};\n\nexport type DatafnFieldSchema = {\n name: string;\n type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"date\" | \"file\" | \"json\";\n required: boolean;\n nullable?: boolean;\n readonly?: boolean;\n default?: unknown;\n enum?: unknown[];\n min?: number;\n max?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n unique?: boolean | string;\n encrypt?: boolean;\n volatile?: boolean;\n};\n\nexport type RelationSimpleCapability = \"timestamps\" | \"audit\";\n\nexport type DatafnRelationSchema = {\n from: string | string[];\n to: string | string[];\n type: \"one-many\" | \"many-one\" | \"many-many\" | \"htree\";\n relation?: string;\n inverse?: string;\n cache?: boolean;\n metadata?: Array<{\n name: string;\n type: \"string\" | \"number\" | \"boolean\" | \"date\" | \"object\" | \"json\";\n }>;\n fkField?: string;\n pathField?: string;\n joinTable?: string;\n joinColumns?: { from: string; to: string };\n capabilities?: RelationSimpleCapability[];\n};\n\n/**\n * Type-safe schema definition helper.\n * Uses const generic to preserve literal field name types and constrain\n * index entries to only declared field names within each resource.\n */\ntype DatafnFieldInput = {\n readonly name: string;\n readonly type: DatafnFieldSchema[\"type\"];\n readonly required: boolean;\n readonly [k: string]: unknown;\n};\n\ntype DatafnIndicesInput<FieldName extends string> =\n | { readonly base?: readonly FieldName[]; readonly search?: readonly FieldName[]; readonly vector?: readonly FieldName[] }\n | readonly FieldName[];\n\ntype SchemaCapabilitiesInput = readonly CapabilityEntry[];\ntype ResourceCapabilitiesInput =\n | SchemaCapabilitiesInput\n | { readonly exclude: readonly SimpleCapability[] };\n\ntype DatafnResourceBase = {\n readonly name: string;\n readonly version: number;\n readonly idPrefix?: string;\n readonly isRemoteOnly?: boolean;\n readonly capabilities?: ResourceCapabilitiesInput;\n readonly fields: readonly DatafnFieldInput[];\n readonly indices?: DatafnIndicesInput<string>;\n readonly permissions?: DatafnPermissionsPolicy;\n readonly [k: string]: unknown;\n};\n\ntype ValidateResources<R extends readonly DatafnResourceBase[]> = {\n readonly [K in keyof R]: R[K] extends { readonly fields: readonly { readonly name: infer N extends string }[] }\n ? Omit<R[K], \"indices\"> & { readonly indices?: DatafnIndicesInput<N> }\n : R[K];\n};\n\nexport function defineSchema<\n const T extends {\n readonly capabilities?: SchemaCapabilitiesInput;\n readonly resources: readonly DatafnResourceBase[];\n readonly relations?: readonly DatafnRelationSchema[] | DatafnRelationSchema[];\n readonly namespaced?: boolean;\n }\n>(schema: T & { readonly resources: ValidateResources<T[\"resources\"]> }): T & DatafnSchema {\n return schema as unknown as T & DatafnSchema;\n}\n\n/**\n * Event Types\n */\n\nexport interface DatafnEvent {\n type:\n | \"mutation_applied\"\n | \"mutation_rejected\"\n | \"sync_applied\"\n | \"sync_failed\"\n | \"sync_retry\"\n | \"connectivity_changed\"\n | \"ws_connected\"\n | \"ws_disconnected\";\n resource?: string;\n ids?: string[];\n mutationId?: string;\n clientId?: string;\n timestampMs: number;\n context?: unknown;\n action?: string;\n fields?: string[];\n // MUT-002: When true, marks mutation as system-initiated\n system?: boolean;\n // TAB-001: When true, marks event as received from another tab (prevents re-broadcast)\n fromRemoteTab?: boolean;\n}\n\nexport type DatafnEventFilter = Partial<{\n type: DatafnEvent[\"type\"] | Array<DatafnEvent[\"type\"]>;\n resource: string | string[];\n ids: string | string[];\n mutationId: string | string[];\n action: string | string[];\n fields: string | string[];\n contextKeys: string[];\n context: Record<string, unknown>;\n}>;\n\n/**\n * Signal Type\n */\n\nexport interface DatafnSignal<T> {\n get(): T;\n subscribe(handler: (value: T) => void): () => void;\n readonly loading: boolean;\n readonly error: DatafnError | null;\n readonly refreshing: boolean;\n readonly nextCursor: string | null | undefined;\n dispose(): void;\n}\n\n/**\n * Logger interface for structured, pluggable logging.\n */\nexport interface DatafnLogger {\n info(message: string, context?: Record<string, unknown>): void;\n warn(message: string, context?: Record<string, unknown>): void;\n error(message: string, context?: Record<string, unknown>): void;\n debug(message: string, context?: Record<string, unknown>): void;\n}\n\n/**\n * Limits configuration for server-side enforcement.\n */\nexport type DatafnLimitsConfig = {\n maxLimit?: number;\n maxTransactSteps?: number;\n maxPayloadBytes?: number;\n maxPullLimit?: number;\n maxBatchSize?: number;\n maxCloneRecords?: number;\n idempotencyTtlMs?: number;\n idempotencyMaxEntries?: number;\n maxSelectTokens?: number;\n maxFilterKeysPerLevel?: number;\n maxSortFields?: number;\n maxAggregations?: number;\n maxSearchQueryLength?: number;\n maxLikePatternLength?: number;\n maxIdLength?: number;\n maxFilterDepth?: number;\n};\n\n/**\n * WebSocket configuration for connection limits and heartbeat.\n */\nexport type DatafnWsConfig = {\n maxConnections?: number;\n maxConnectionsPerNamespace?: number;\n heartbeatIntervalMs?: number;\n heartbeatTimeoutMs?: number;\n};\n\n/**\n * Plugin Types\n */\n\nexport type DatafnHookContext = {\n env: \"client\" | \"server\";\n schema: DatafnSchema;\n context?: unknown;\n};\n\nexport interface DatafnPlugin {\n name: string;\n runsOn: Array<\"client\" | \"server\">;\n beforeQuery?: (\n ctx: DatafnHookContext,\n q: unknown,\n ) => Promise<unknown> | unknown;\n afterQuery?: (\n ctx: DatafnHookContext,\n q: unknown,\n result: unknown,\n ) => Promise<unknown> | unknown;\n beforeMutation?: (\n ctx: DatafnHookContext,\n m: unknown | unknown[],\n ) => Promise<unknown> | unknown;\n afterMutation?: (\n ctx: DatafnHookContext,\n m: unknown | unknown[],\n result: unknown,\n ) => Promise<void> | void;\n beforeSync?: (\n ctx: DatafnHookContext,\n phase: \"seed\" | \"clone\" | \"pull\" | \"push\" | \"cloneUp\" | \"reconcile\",\n payload: unknown,\n ) => Promise<unknown> | unknown;\n afterSync?: (\n ctx: DatafnHookContext,\n phase: \"seed\" | \"clone\" | \"pull\" | \"push\" | \"cloneUp\" | \"reconcile\",\n payload: unknown,\n result: unknown,\n ) => Promise<void> | void;\n}\n","import type { DatafnFieldSchema } from \"./types.js\";\n\nexport type SimpleCapability = \"timestamps\" | \"audit\" | \"trash\" | \"archivable\";\n\nexport type AccessLevel = \"viewer\" | \"editor\" | \"owner\";\n\nexport type ShareableVisibilityDefault = \"ns\" | \"private\" | \"shared\";\n\nexport type ShareablePrincipalMode = \"opaque-id\";\n\nexport type ShareableRelationInheritance = {\n enabled: boolean;\n relations?: string[];\n requireRelateConsent?: boolean;\n};\n\nexport type ShareableCapability = {\n shareable: {\n levels: AccessLevel[];\n // Legacy compatibility field retained for existing schemas/runtime behavior.\n default?: \"private\" | \"shared\";\n // SPV2 extensions (optional in schema input, defaulted during validation).\n visibilityDefault?: ShareableVisibilityDefault;\n supportsScopeGrants?: boolean;\n crossNsShareable?: boolean;\n principalMode?: ShareablePrincipalMode;\n relationInheritance?: ShareableRelationInheritance;\n };\n};\n\nexport type CapabilityEntry = SimpleCapability | ShareableCapability;\n\nexport type SchemaCapabilities = CapabilityEntry[];\n\nexport type ResourceCapabilities = CapabilityEntry[] | { exclude: SimpleCapability[] };\n\ntype CapabilityKey = SimpleCapability | \"shareable\";\n\ntype CapabilityFieldDef = Pick<\n DatafnFieldSchema,\n \"name\" | \"type\" | \"required\" | \"nullable\" | \"readonly\" | \"default\"\n>;\n\nexport const CAPABILITY_FIELD_DEFS: Record<CapabilityKey, CapabilityFieldDef[]> = {\n timestamps: [\n { name: \"createdAt\", type: \"date\", required: false, nullable: true, readonly: true, default: null },\n { name: \"updatedAt\", type: \"date\", required: false, nullable: true, readonly: true, default: null },\n ],\n audit: [\n { name: \"createdBy\", type: \"string\", required: false, nullable: true, readonly: true, default: null },\n { name: \"updatedBy\", type: \"string\", required: false, nullable: true, readonly: true, default: null },\n ],\n trash: [\n { name: \"trashedAt\", type: \"date\", required: false, nullable: true, readonly: true, default: null },\n { name: \"trashedBy\", type: \"string\", required: false, nullable: true, readonly: true, default: null },\n ],\n archivable: [{ name: \"isArchived\", type: \"boolean\", required: false, nullable: false, readonly: false, default: false }],\n shareable: [{ name: \"visibility\", type: \"string\", required: false, nullable: true, readonly: true, default: null }],\n};\n\n// ---------------------------------------------------------------------------\n// Relation capability field definitions (RCAP-001, RCAP-003)\n// ---------------------------------------------------------------------------\n\ntype RelationCapabilityKey = \"timestamps\" | \"audit\";\n\n/**\n * Field definitions injected into join tables for each relation capability.\n * Same field names as resource capabilities; kept separate for clarity.\n */\nexport const RELATION_CAPABILITY_FIELD_DEFS: Record<RelationCapabilityKey, CapabilityFieldDef[]> = {\n timestamps: [\n { name: \"createdAt\", type: \"date\", required: false, nullable: true, readonly: true, default: null },\n { name: \"updatedAt\", type: \"date\", required: false, nullable: true, readonly: true, default: null },\n ],\n audit: [\n { name: \"createdBy\", type: \"string\", required: false, nullable: true, readonly: true, default: null },\n { name: \"updatedBy\", type: \"string\", required: false, nullable: true, readonly: true, default: null },\n ],\n};\n\n/**\n * Returns the field names injected by the given resolved relation capabilities.\n * Output is deduplicated and ordered deterministically (canonical capability order).\n */\nexport function getRelationCapabilityFieldNames(caps: string[]): string[] {\n const names: string[] = [];\n const seen = new Set<string>();\n for (const cap of caps) {\n const defs = RELATION_CAPABILITY_FIELD_DEFS[cap as RelationCapabilityKey] ?? [];\n for (const def of defs) {\n if (!seen.has(def.name)) {\n seen.add(def.name);\n names.push(def.name);\n }\n }\n }\n return names;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction toCapabilityKey(entry: CapabilityEntry): CapabilityKey {\n return typeof entry === \"string\" ? entry : \"shareable\";\n}\n\nfunction dedupeCapabilities(entries: CapabilityEntry[]): CapabilityEntry[] {\n const seen = new Set<CapabilityKey>();\n const deduped: CapabilityEntry[] = [];\n\n for (const entry of entries) {\n const key = toCapabilityKey(entry);\n if (seen.has(key)) continue;\n seen.add(key);\n deduped.push(entry);\n }\n\n return deduped;\n}\n\nexport function resolveCapabilities(\n globalCaps?: SchemaCapabilities,\n resourceCaps?: ResourceCapabilities,\n): CapabilityEntry[] {\n const base = Array.isArray(globalCaps) ? globalCaps : [];\n\n if (resourceCaps === undefined) {\n return dedupeCapabilities(base);\n }\n\n if (Array.isArray(resourceCaps)) {\n return dedupeCapabilities([...base, ...resourceCaps]);\n }\n\n if (isObject(resourceCaps) && Array.isArray(resourceCaps.exclude)) {\n const excluded = new Set(resourceCaps.exclude);\n return dedupeCapabilities(\n base.filter((entry) => (typeof entry === \"string\" ? !excluded.has(entry) : true)),\n );\n }\n\n return dedupeCapabilities(base);\n}\n\nexport function getCapabilityFields(resolvedCaps: CapabilityEntry[]): DatafnFieldSchema[] {\n const fields: DatafnFieldSchema[] = [];\n const seenFields = new Set<string>();\n\n for (const capability of dedupeCapabilities(resolvedCaps)) {\n const key = toCapabilityKey(capability);\n for (const fieldDef of CAPABILITY_FIELD_DEFS[key]) {\n if (seenFields.has(fieldDef.name)) continue;\n seenFields.add(fieldDef.name);\n fields.push({ ...fieldDef });\n }\n }\n\n return fields;\n}\n","/**\n * DataFn Error Types and Envelopes\n */\n\nexport type DatafnErrorCode =\n | \"SCHEMA_INVALID\"\n | \"INVALID_CAPABILITY\"\n | \"INVALID_CAPABILITY_CONFIG\"\n | \"CAPABILITY_FIELD_COLLISION\"\n | \"CAPABILITY_DEPENDENCY\"\n | \"DFQL_INVALID\"\n | \"DFQL_UNKNOWN_RESOURCE\"\n | \"DFQL_UNKNOWN_FIELD\"\n | \"DFQL_UNKNOWN_RELATION\"\n | \"DFQL_UNSUPPORTED\"\n | \"DFQL_ABORTED\"\n | \"LIMIT_EXCEEDED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"CONFLICT\"\n | \"INTERNAL\"\n /** LOW-026: Network/transport-layer errors (timeouts, connection refused, etc.) */\n | \"TRANSPORT_ERROR\";\n\nexport type DatafnError = {\n code: DatafnErrorCode;\n message: string;\n details?: unknown;\n};\n\nexport type DatafnEnvelope<T> =\n | { ok: true; result: T }\n | { ok: false; error: DatafnError };\n\n/**\n * Helper functions for creating envelopes\n */\n\nexport function ok<T>(result: T): DatafnEnvelope<T> {\n return { ok: true, result };\n}\n\nexport function err<T = never>(\n code: DatafnErrorCode,\n message: string,\n details?: unknown\n): DatafnEnvelope<T> {\n return {\n ok: false,\n error: {\n code,\n message,\n details: details ?? { path: \"$\" },\n },\n };\n}\n","/**\n * Schema Validation\n *\n * Validates and normalizes DataFn schemas according to SCHEMA-001.\n */\n\nimport type { DatafnSchema, DatafnResourceSchema, RelationSimpleCapability } from \"./types.js\";\nimport type {\n CapabilityEntry,\n ResourceCapabilities,\n SchemaCapabilities,\n ShareableCapability,\n SimpleCapability,\n} from \"./capabilities.js\";\nimport type { DatafnEnvelope } from \"./errors.js\";\nimport { ok, err } from \"./errors.js\";\nimport {\n CAPABILITY_FIELD_DEFS,\n getCapabilityFields,\n getRelationCapabilityFieldNames,\n resolveCapabilities,\n} from \"./capabilities.js\";\n\nconst SIMPLE_CAPABILITIES: ReadonlySet<SimpleCapability> = new Set([\n \"timestamps\",\n \"audit\",\n \"trash\",\n \"archivable\",\n]);\n\nconst SHAREABLE_LEVELS = new Set([\"viewer\", \"editor\", \"owner\"]);\nconst SHAREABLE_DEFAULTS = new Set([\"private\", \"shared\"]);\nconst SHAREABLE_VISIBILITY_DEFAULTS = new Set([\"ns\", \"private\", \"shared\"]);\nconst SHAREABLE_PRINCIPAL_MODES = new Set([\"opaque-id\"]);\n\nconst RELATION_SIMPLE_CAPABILITIES: ReadonlySet<RelationSimpleCapability> = new Set([\n \"timestamps\",\n \"audit\",\n]);\n\n// Canonical ordering for relation capabilities (RCAP-004)\nconst RELATION_CAPABILITY_CANONICAL_ORDER: RelationSimpleCapability[] = [\"timestamps\", \"audit\"];\n\n/**\n * Resolves and validates relation capability declarations.\n * Returns canonical ordered, deduplicated array, or error.\n * - Returns ok([]) when capabilities is undefined.\n * - Rejects non-array, non-string entries, and unknown capability values.\n * - Returns deterministic canonical order: [\"timestamps\", \"audit\"] subset.\n */\nexport function resolveRelationCapabilities(\n capabilities: unknown,\n): DatafnEnvelope<RelationSimpleCapability[]> {\n if (capabilities === undefined) return ok([]);\n if (!Array.isArray(capabilities)) {\n return err(\"SCHEMA_INVALID\", \"Relation capabilities must be an array\", {\n path: \"capabilities\",\n });\n }\n for (const entry of capabilities) {\n if (typeof entry !== \"string\") {\n return err(\"SCHEMA_INVALID\", \"Relation capability values must be strings\", {\n path: \"capabilities\",\n });\n }\n if (!RELATION_SIMPLE_CAPABILITIES.has(entry as RelationSimpleCapability)) {\n return err(\"INVALID_CAPABILITY\", `Unknown relation capability \"${entry}\"`, {\n path: \"capabilities\",\n });\n }\n }\n const declared = new Set(capabilities as RelationSimpleCapability[]);\n return ok(RELATION_CAPABILITY_CANONICAL_ORDER.filter((cap) => declared.has(cap)));\n}\n\n/**\n * Resolve whether namespace isolation is enabled from a schema-like object.\n * Default is `true`.\n */\nfunction resolveNamespaced(s: Record<string, unknown>): boolean {\n if (typeof s.namespaced === \"boolean\") return s.namespaced;\n return true;\n}\n\n/**\n * Returns whether namespace isolation is enabled for a given schema.\n * Default is `true`.\n */\nexport function isNamespaced(schema: DatafnSchema): boolean {\n if (typeof schema.namespaced === \"boolean\") return schema.namespaced;\n return true;\n}\n\n/**\n * Validates a schema and returns a normalized version.\n *\n * Normalization:\n * - Converts `indices: string[]` to `{ base: string[], search: [], vector: [] }`\n * - Ensures `relations` is present (defaults to [])\n *\n * Validation:\n * - `resources` must be present and be an array\n * - Each resource must have unique `name` and integer `version`\n * - Fields must have unique names within a resource\n */\nexport function validateSchema(schema: unknown): DatafnEnvelope<DatafnSchema> {\n // Check that schema is an object\n if (typeof schema !== \"object\" || schema === null || Array.isArray(schema)) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: expected object\", {\n path: \"$\",\n });\n }\n\n const s = schema as Record<string, unknown>;\n const globalCapsResult = parseSchemaCapabilities(s.capabilities);\n if (!globalCapsResult.ok) return globalCapsResult;\n const globalCapabilities = globalCapsResult.result;\n\n // Check resources exists and is an array\n if (!s.resources || !Array.isArray(s.resources)) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: missing resources\", {\n path: \"resources\",\n });\n }\n\n // LOW-028: Enforce resource count limit\n const MAX_RESOURCES = 100;\n if (s.resources.length > MAX_RESOURCES) {\n return err(\"SCHEMA_INVALID\", `Invalid schema: too many resources (max ${MAX_RESOURCES})`, {\n path: \"resources\",\n });\n }\n\n const resourceNames = new Set<string>();\n const normalizedResources: DatafnResourceSchema[] = [];\n\n for (const resource of s.resources) {\n if (\n typeof resource !== \"object\" ||\n resource === null ||\n Array.isArray(resource)\n ) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: resource must be object\", {\n path: \"resources\",\n });\n }\n\n const r = resource as Record<string, unknown>;\n\n // Validate name\n if (typeof r.name !== \"string\") {\n return err(\n \"SCHEMA_INVALID\",\n \"Invalid schema: resource.name must be string\",\n { path: \"resources\" }\n );\n }\n\n // Check for duplicate resource names\n if (resourceNames.has(r.name)) {\n return err(\n \"SCHEMA_INVALID\",\n `Invalid schema: duplicate resource name: ${r.name}`,\n { path: \"resources\" }\n );\n }\n resourceNames.add(r.name);\n\n // Validate version\n if (typeof r.version !== \"number\" || !Number.isInteger(r.version)) {\n return err(\n \"SCHEMA_INVALID\",\n \"Invalid schema: resource.version must be integer\",\n { path: \"resources\" }\n );\n }\n\n // Validate fields\n if (!Array.isArray(r.fields)) {\n return err(\n \"SCHEMA_INVALID\",\n \"Invalid schema: resource.fields must be array\",\n { path: \"resources\" }\n );\n }\n\n // LOW-028: Enforce field count limit per resource\n const MAX_FIELDS_PER_RESOURCE = 200;\n if ((r.fields as unknown[]).length > MAX_FIELDS_PER_RESOURCE) {\n return err(\n \"SCHEMA_INVALID\",\n `Invalid schema: resource \"${r.name}\" has too many fields (max ${MAX_FIELDS_PER_RESOURCE})`,\n { path: `resources.${r.name}.fields` },\n );\n }\n\n const fieldNames = new Set<string>();\n for (const field of r.fields) {\n if (typeof field !== \"object\" || field === null || Array.isArray(field)) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: field must be object\", {\n path: \"resources\",\n });\n }\n const f = field as Record<string, unknown>;\n if (typeof f.name !== \"string\") {\n return err(\n \"SCHEMA_INVALID\",\n \"Invalid schema: field.name must be string\",\n { path: \"resources\" }\n );\n }\n if (fieldNames.has(f.name)) {\n return err(\n \"SCHEMA_INVALID\",\n `Invalid schema: duplicate field name: ${f.name}`,\n { path: \"resources\" }\n );\n }\n fieldNames.add(f.name);\n }\n\n const resourceCapsResult = parseResourceCapabilities(r.capabilities);\n if (!resourceCapsResult.ok) return resourceCapsResult;\n const resolvedCapabilities = resolveCapabilities(\n globalCapabilities,\n resourceCapsResult.result,\n );\n\n if (hasShareable(resolvedCapabilities) && !hasCapability(resolvedCapabilities, \"audit\")) {\n return err(\n \"CAPABILITY_DEPENDENCY\",\n `\"shareable\" capability requires \"audit\" capability`,\n { path: `resources.${r.name}.capabilities` },\n );\n }\n\n const collision = findCapabilityFieldCollision(fieldNames, resolvedCapabilities);\n if (collision) {\n return err(\n \"CAPABILITY_FIELD_COLLISION\",\n `Field \"${collision.field}\" on resource \"${r.name}\" collides with capability-injected field from \"${collision.capability}\"`,\n { path: `resources.${r.name}.fields.${collision.field}` },\n );\n }\n\n const injectedFields = getCapabilityFields(resolvedCapabilities);\n for (const injectedField of injectedFields) {\n fieldNames.add(injectedField.name);\n }\n\n // Normalize indices\n let normalizedIndices: {\n base: string[];\n search: string[];\n vector: string[];\n };\n if (Array.isArray(r.indices)) {\n normalizedIndices = {\n base: r.indices as string[],\n search: [],\n vector: [],\n };\n } else if (r.indices && typeof r.indices === \"object\") {\n const idx = r.indices as Record<string, unknown>;\n normalizedIndices = {\n base: (idx.base as string[]) || [],\n search: (idx.search as string[]) || [],\n vector: (idx.vector as string[]) || [],\n };\n } else {\n normalizedIndices = { base: [], search: [], vector: [] };\n }\n\n // Validate index field names against declared fields\n for (const [category, idxFields] of Object.entries(normalizedIndices)) {\n for (const idxField of idxFields) {\n if (!fieldNames.has(idxField)) {\n return err(\n \"SCHEMA_INVALID\",\n `Invalid schema: index field \"${idxField}\" in indices.${category} does not match any field in resource \"${r.name}\". Available fields: ${[...fieldNames].join(\", \")}`,\n { path: `resources.${r.name}.indices.${category}` }\n );\n }\n }\n }\n\n normalizedResources.push({\n ...r,\n capabilities: resourceCapsResult.result as DatafnResourceSchema[\"capabilities\"],\n fields: [...(r.fields as DatafnResourceSchema[\"fields\"]), ...injectedFields],\n indices: normalizedIndices,\n } as DatafnResourceSchema);\n }\n\n // Normalize relations (default to empty array)\n const relations = Array.isArray(s.relations) ? s.relations : [];\n\n // Validate relation fields\n for (const rel of relations) {\n if (typeof rel !== \"object\" || rel === null || Array.isArray(rel)) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: relation must be object\", {\n path: \"relations\",\n });\n }\n const r = rel as Record<string, unknown>;\n\n // CLI-004: Validate that from/to reference declared resource names\n const validateRelationRef = (ref: unknown, side: \"from\" | \"to\") => {\n const refs = Array.isArray(ref) ? ref : (typeof ref === \"string\" ? [ref] : []);\n for (const name of refs) {\n if (typeof name === \"string\" && !resourceNames.has(name)) {\n return err(\n \"SCHEMA_INVALID\",\n `Invalid schema: relation.${side} references unknown resource \"${name}\". Available: ${[...resourceNames].join(\", \")}`,\n { path: `relations.${side}` },\n );\n }\n }\n return null;\n };\n if (r.from !== undefined) {\n const e = validateRelationRef(r.from, \"from\");\n if (e) return e;\n }\n if (r.to !== undefined) {\n const e = validateRelationRef(r.to, \"to\");\n if (e) return e;\n }\n\n if (r.joinTable !== undefined && typeof r.joinTable !== \"string\") {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: relation.joinTable must be string\", {\n path: \"relations\",\n });\n }\n if (r.joinColumns !== undefined) {\n if (typeof r.joinColumns !== \"object\" || r.joinColumns === null || Array.isArray(r.joinColumns)) {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: relation.joinColumns must be object with from/to strings\", {\n path: \"relations\",\n });\n }\n const jc = r.joinColumns as Record<string, unknown>;\n if (typeof jc.from !== \"string\" || typeof jc.to !== \"string\") {\n return err(\"SCHEMA_INVALID\", \"Invalid schema: relation.joinColumns.from and .to must be strings\", {\n path: \"relations\",\n });\n }\n }\n\n // RCAP-001, RCAP-002, RCAP-003: Validate relation capabilities if present\n if (r.capabilities !== undefined) {\n if (r.type !== \"many-many\") {\n return err(\n \"SCHEMA_INVALID\",\n `Relation capabilities are only supported on many-many relations, got \"${r.type}\"`,\n { path: \"relations\" },\n );\n }\n const capResult = resolveRelationCapabilities(r.capabilities);\n if (!capResult.ok) return capResult;\n\n // RCAP-003: Detect collisions between relation metadata fields and injected capability fields\n if (Array.isArray(r.metadata) && capResult.result.length > 0) {\n const injectedNames = new Set(getRelationCapabilityFieldNames(capResult.result));\n const relationName = typeof r.relation === \"string\" ? r.relation : \"unknown\";\n for (const metaField of r.metadata as Array<Record<string, unknown>>) {\n if (typeof metaField?.name === \"string\" && injectedNames.has(metaField.name)) {\n return err(\n \"CAPABILITY_FIELD_COLLISION\",\n `Relation metadata field \"${metaField.name}\" on relation \"${relationName}\" collides with relation capability-injected field`,\n { path: `relations.${relationName}.metadata.${metaField.name}` },\n );\n }\n }\n }\n }\n }\n\n const namespaced = resolveNamespaced(s);\n\n return ok({\n capabilities: globalCapabilities,\n resources: normalizedResources,\n relations: relations as DatafnSchema[\"relations\"],\n namespaced,\n });\n}\n\nfunction parseSchemaCapabilities(\n value: unknown,\n): DatafnEnvelope<SchemaCapabilities | undefined> {\n if (value === undefined) return ok(undefined);\n if (!Array.isArray(value)) {\n return err(\"INVALID_CAPABILITY_CONFIG\", \"Schema capabilities must be an array\", {\n path: \"capabilities\",\n });\n }\n return parseCapabilityArray(value, \"capabilities\");\n}\n\nfunction parseResourceCapabilities(\n value: unknown,\n): DatafnEnvelope<ResourceCapabilities | undefined> {\n if (value === undefined) return ok(undefined);\n if (Array.isArray(value)) {\n return parseCapabilityArray(value, \"resources.capabilities\");\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n \"Resource capabilities must be an array or { exclude: [...] }\",\n { path: \"resources.capabilities\" },\n );\n }\n const obj = value as Record<string, unknown>;\n if (!Array.isArray(obj.exclude)) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n \"Resource capability exclusion must be { exclude: SimpleCapability[] }\",\n { path: \"resources.capabilities.exclude\" },\n );\n }\n const excluded: SimpleCapability[] = [];\n for (const cap of obj.exclude) {\n if (typeof cap !== \"string\") {\n return err(\"INVALID_CAPABILITY\", \"Capability name must be a string\", {\n path: \"resources.capabilities.exclude\",\n });\n }\n if (!SIMPLE_CAPABILITIES.has(cap as SimpleCapability)) {\n return err(\"INVALID_CAPABILITY\", `Unknown capability \"${cap}\"`, {\n path: \"resources.capabilities.exclude\",\n });\n }\n excluded.push(cap as SimpleCapability);\n }\n return ok({ exclude: excluded });\n}\n\nfunction parseCapabilityArray(\n input: unknown[],\n path: string,\n): DatafnEnvelope<CapabilityEntry[]> {\n const parsed: CapabilityEntry[] = [];\n for (const entry of input) {\n if (typeof entry === \"string\") {\n if (entry === \"shareable\") {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable\" capability requires object config`,\n { path },\n );\n }\n if (!SIMPLE_CAPABILITIES.has(entry as SimpleCapability)) {\n return err(\"INVALID_CAPABILITY\", `Unknown capability \"${entry}\"`, { path });\n }\n parsed.push(entry as SimpleCapability);\n continue;\n }\n const shareableResult = parseShareableCapability(entry, path);\n if (shareableResult.ok) {\n parsed.push(shareableResult.result);\n continue;\n }\n return shareableResult;\n }\n\n // VA-001: duplicate entries are deduplicated, not rejected\n return ok(resolveCapabilities(parsed, undefined));\n}\n\nfunction parseShareableCapability(\n entry: unknown,\n path: string,\n): DatafnEnvelope<ShareableCapability> {\n if (typeof entry !== \"object\" || entry === null || Array.isArray(entry)) {\n return err(\"INVALID_CAPABILITY_CONFIG\", \"Invalid capability configuration\", { path });\n }\n const obj = entry as Record<string, unknown>;\n if (!obj.shareable || typeof obj.shareable !== \"object\" || Array.isArray(obj.shareable)) {\n return err(\"INVALID_CAPABILITY_CONFIG\", \"Invalid capability configuration\", { path });\n }\n const shareable = obj.shareable as Record<string, unknown>;\n if (!Array.isArray(shareable.levels)) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.levels\" must be an array`,\n { path: `${path}.shareable.levels` },\n );\n }\n if (\n shareable.levels.length === 0 ||\n !shareable.levels.every((level) => typeof level === \"string\" && SHAREABLE_LEVELS.has(level))\n ) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.levels\" must include one or more of [viewer, editor, owner]`,\n { path: `${path}.shareable.levels` },\n );\n }\n if (\n shareable.default !== undefined &&\n (typeof shareable.default !== \"string\" || !SHAREABLE_DEFAULTS.has(shareable.default))\n ) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.default\" must be one of [private, shared]`,\n { path: `${path}.shareable.default` },\n );\n }\n\n if (\n shareable.visibilityDefault !== undefined &&\n (typeof shareable.visibilityDefault !== \"string\" ||\n !SHAREABLE_VISIBILITY_DEFAULTS.has(shareable.visibilityDefault))\n ) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.visibilityDefault\" must be one of [ns, private, shared]`,\n { path: `${path}.shareable.visibilityDefault` },\n );\n }\n if (shareable.default === undefined && shareable.visibilityDefault === undefined) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.default\" or \"shareable.visibilityDefault\" must be provided`,\n { path: `${path}.shareable` },\n );\n }\n\n if (\n shareable.supportsScopeGrants !== undefined &&\n typeof shareable.supportsScopeGrants !== \"boolean\"\n ) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.supportsScopeGrants\" must be boolean`,\n { path: `${path}.shareable.supportsScopeGrants` },\n );\n }\n\n if (\n shareable.crossNsShareable !== undefined &&\n typeof shareable.crossNsShareable !== \"boolean\"\n ) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.crossNsShareable\" must be boolean`,\n { path: `${path}.shareable.crossNsShareable` },\n );\n }\n\n if (\n shareable.principalMode !== undefined &&\n (typeof shareable.principalMode !== \"string\" ||\n !SHAREABLE_PRINCIPAL_MODES.has(shareable.principalMode))\n ) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.principalMode\" must be one of [opaque-id]`,\n { path: `${path}.shareable.principalMode` },\n );\n }\n\n let relationInheritance: ShareableCapability[\"shareable\"][\"relationInheritance\"] | undefined;\n if (shareable.relationInheritance !== undefined) {\n const rel = shareable.relationInheritance;\n if (typeof rel !== \"object\" || rel === null || Array.isArray(rel)) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.relationInheritance\" must be an object`,\n { path: `${path}.shareable.relationInheritance` },\n );\n }\n const relObj = rel as Record<string, unknown>;\n if (typeof relObj.enabled !== \"boolean\") {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.relationInheritance.enabled\" must be boolean`,\n { path: `${path}.shareable.relationInheritance.enabled` },\n );\n }\n if (\n relObj.relations !== undefined &&\n (!Array.isArray(relObj.relations) ||\n !relObj.relations.every((value) => typeof value === \"string\"))\n ) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.relationInheritance.relations\" must be string[]`,\n { path: `${path}.shareable.relationInheritance.relations` },\n );\n }\n if (\n relObj.requireRelateConsent !== undefined &&\n typeof relObj.requireRelateConsent !== \"boolean\"\n ) {\n return err(\n \"INVALID_CAPABILITY_CONFIG\",\n `\"shareable.relationInheritance.requireRelateConsent\" must be boolean`,\n { path: `${path}.shareable.relationInheritance.requireRelateConsent` },\n );\n }\n relationInheritance = {\n enabled: relObj.enabled,\n relations: relObj.relations as string[] | undefined,\n requireRelateConsent: (relObj.requireRelateConsent as boolean | undefined) ?? true,\n };\n }\n\n const normalized: ShareableCapability = {\n shareable: {\n levels: shareable.levels as ShareableCapability[\"shareable\"][\"levels\"],\n default:\n (shareable.default as ShareableCapability[\"shareable\"][\"default\"] | undefined) ??\n ((shareable.visibilityDefault as ShareableCapability[\"shareable\"][\"visibilityDefault\"]) === \"private\"\n ? \"private\"\n : \"shared\"),\n visibilityDefault: (\n (shareable.visibilityDefault as\n | ShareableCapability[\"shareable\"][\"visibilityDefault\"]\n | undefined) ??\n (shareable.default as ShareableCapability[\"shareable\"][\"default\"])\n ) as ShareableCapability[\"shareable\"][\"visibilityDefault\"],\n supportsScopeGrants: (shareable.supportsScopeGrants as boolean | undefined) ?? true,\n crossNsShareable: (shareable.crossNsShareable as boolean | undefined) ?? true,\n principalMode:\n (shareable.principalMode as ShareableCapability[\"shareable\"][\"principalMode\"] | undefined) ??\n \"opaque-id\",\n relationInheritance,\n },\n };\n\n return ok(normalized);\n}\n\nfunction hasCapability(caps: CapabilityEntry[], capability: SimpleCapability): boolean {\n return caps.some((cap) => cap === capability);\n}\n\nfunction hasShareable(caps: CapabilityEntry[]): boolean {\n return caps.some((cap) => typeof cap === \"object\" && cap !== null && \"shareable\" in cap);\n}\n\nfunction findCapabilityFieldCollision(\n userFieldNames: Set<string>,\n resolvedCapabilities: CapabilityEntry[],\n): { field: string; capability: string } | null {\n for (const cap of resolvedCapabilities) {\n const key = typeof cap === \"string\" ? cap : \"shareable\";\n const injectedDefs = CAPABILITY_FIELD_DEFS[key];\n for (const field of injectedDefs) {\n if (userFieldNames.has(field.name)) {\n return { field: field.name, capability: key };\n }\n }\n }\n return null;\n}\n","/**\n * Composable namespace helper.\n *\n * Joins non-empty string segments with `:` to form a namespace string.\n *\n * @example\n * ns(\"org-acme\", \"user-123\") // => \"org-acme:user-123\"\n * ns(\"user-1\") // => \"user-1\"\n * ns(\"org\", \"project\", \"user\") // => \"org:project:user\"\n * ns(\"org\", \"\", \"user\") // => \"org:user\" (empty filtered)\n * ns() // throws Error\n */\nexport function ns(...segments: string[]): string {\n const filtered = segments.filter((s) => s != null && s !== \"\");\n if (filtered.length === 0) {\n throw new Error(\"ns() requires at least one non-empty segment\");\n }\n return filtered.join(\":\");\n}\n","/**\n * DFQL Normalization\n *\n * Produces canonical JSON for DFQL objects to enable stable cache keys\n * and deterministic comparisons.\n */\n\n/**\n * Recursively normalizes a value:\n * - Sorts object keys alphabetically\n * - Removes undefined values\n * - Preserves arrays, primitives, and null as-is\n *\n * LOW-023: undefined vs null semantics:\n * - `null` is preserved as `null` (explicit absence of a value — serialisable to JSON)\n * - `undefined` is stripped from the output (non-serialisable; treated as \"not set\")\n * This mirrors JSON.stringify behavior and ensures stable cache keys across environments.\n */\nexport function normalizeDfql(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value === null ? null : undefined;\n }\n\n if (typeof value !== \"object\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => normalizeDfql(item));\n }\n\n // Object: sort keys, remove undefined values, recursively normalize\n const normalized: Record<string, unknown> = {};\n const keys = Object.keys(value as Record<string, unknown>).sort();\n\n for (const key of keys) {\n const val = (value as Record<string, unknown>)[key];\n if (val !== undefined) {\n normalized[key] = normalizeDfql(val);\n }\n }\n\n return normalized;\n}\n\n/**\n * Returns a stable string key for a DFQL value.\n * This is the canonical form used for caching and comparison.\n */\nexport function dfqlKey(value: unknown): string {\n return JSON.stringify(normalizeDfql(value));\n}\n","/**\n * DataFn Envelope Utilities\n */\n\nimport type { DatafnEnvelope, DatafnError } from \"./errors.js\";\n\n/**\n * Unwraps a DatafnEnvelope, returning the result for ok:true\n * or throwing the exact error object for ok:false.\n *\n * This provides deterministic error handling for envelope-returning functions.\n *\n * @param env - The envelope to unwrap\n * @returns The result value for success envelopes\n * @throws The exact DatafnError object for failure envelopes\n */\nexport function unwrapEnvelope<T>(env: DatafnEnvelope<T>): T {\n if (env.ok) {\n return env.result;\n }\n // Throw the exact error object (code/message/details.path match)\n throw env.error;\n}\n","/**\n * Built-in KV resource utilities\n */\n\nimport type { DatafnSchema, DatafnResourceSchema } from \"./types.js\";\n\n/**\n * Canonical KV resource name\n */\nexport const KV_RESOURCE_NAME = \"kv\";\n\n/**\n * Generate the canonical KV id from a key.\n * Mapping: kvId(key) = \"kv:\" + key\n */\nexport function kvId(key: string): string {\n if (typeof key !== \"string\") {\n throw new Error(\"Invalid KV key: must be string\");\n }\n return `${KV_RESOURCE_NAME}:${key}`;\n}\n\n/**\n * Ensure the schema includes the built-in KV resource.\n * If schema already has resource \"kv\", validates it is compatible.\n * Otherwise appends a resource definition for KV.\n */\nexport function ensureBuiltinKv(schema: DatafnSchema): DatafnSchema {\n const existingKv = schema.resources.find((r) => r.name === KV_RESOURCE_NAME);\n\n if (existingKv) {\n // Validate schema shape\n if (existingKv.version !== 1) {\n throw new Error(\n `KV resource version mismatch: expected 1, got ${existingKv.version}`,\n );\n }\n // KV resource already exists and matches the expected shape\n return schema;\n }\n\n // Append KV resource definition\n const kvResource: DatafnResourceSchema = {\n name: KV_RESOURCE_NAME,\n version: 1,\n idPrefix: KV_RESOURCE_NAME,\n fields: [\n {\n name: \"id\",\n type: \"string\",\n required: true,\n },\n {\n name: \"value\",\n type: \"json\",\n required: false,\n },\n ],\n indices: [\"id\"],\n permissions: {\n read: { fields: [\"id\", \"value\"] },\n write: { fields: [\"id\", \"value\"] },\n },\n };\n\n return {\n ...schema,\n resources: [...schema.resources, kvResource],\n };\n}\n","/**\n * Shared join store key utilities.\n *\n * These functions provide the single canonical derivation of join store names\n * used by both client and server across all sync operations.\n */\n\nimport type { DatafnRelationSchema } from \"./types.js\";\n\n/**\n * Derive the logical join store key used by clients and change tracking.\n * Format: join_{fromResource}_{relationName}_{toResource}\n */\nexport function getJoinStoreKey(\n from: string,\n relation: string,\n to: string,\n): string {\n return `join_${from}_${relation}_${to}`;\n}\n\n/**\n * Derive the actual DB table name for a join table.\n * Format: __datafn_join_{fromResource}_{relationName}\n * Can be overridden by relation.joinTable in schema.\n */\nexport function getJoinTableName(\n from: string,\n relation: string,\n joinTable?: string,\n): string {\n return joinTable || `__datafn_join_${from}_${relation}`;\n}\n\n/**\n * Enumerate all logical join store keys for a schema's many-many relations.\n * Handles multi-resource from/to arrays.\n * Useful for building cursor maps, reconcile payloads, and similar operations.\n *\n * @param relations - Array of relation schema definitions\n * @param resourceFilter - Optional set of resource names; if provided, only\n * joins whose `from` resource is in this set are included.\n */\nexport function enumerateJoinStoreKeys(\n relations: DatafnRelationSchema[],\n resourceFilter?: Set<string>,\n): string[] {\n const keys: string[] = [];\n for (const rel of relations) {\n if (rel.type !== \"many-many\") continue;\n const froms = Array.isArray(rel.from) ? rel.from : [rel.from];\n const tos = Array.isArray(rel.to) ? rel.to : [rel.to];\n const relName = rel.relation ?? \"rel\";\n for (const f of froms) {\n if (resourceFilter && !resourceFilter.has(f)) continue;\n for (const t of tos) {\n keys.push(getJoinStoreKey(f, relName, t));\n }\n }\n }\n return keys;\n}\n","import type {\n DatafnSchema,\n DatafnResourceSchema,\n DatafnFieldSchema,\n DatafnRelationSchema,\n} from \"./types.js\";\n\nexport interface SchemaIndex {\n resourcesByName: Map<string, DatafnResourceSchema>;\n fieldsByResource: Map<string, Map<string, DatafnFieldSchema>>;\n /** All relations involving the resource (as from OR inverse to). */\n relationsByResource: Map<string, DatafnRelationSchema[]>;\n /** Relations where the resource is the from side. */\n relationsFromResource: Map<string, DatafnRelationSchema[]>;\n}\n\nexport function buildSchemaIndex(schema: DatafnSchema): SchemaIndex {\n const resourcesByName = new Map<string, DatafnResourceSchema>();\n const fieldsByResource = new Map<string, Map<string, DatafnFieldSchema>>();\n const relationsByResource = new Map<string, DatafnRelationSchema[]>();\n const relationsFromResource = new Map<string, DatafnRelationSchema[]>();\n\n for (const resource of schema.resources) {\n resourcesByName.set(resource.name, resource);\n const fieldMap = new Map<string, DatafnFieldSchema>();\n for (const field of resource.fields) {\n fieldMap.set(field.name, field);\n }\n fieldsByResource.set(resource.name, fieldMap);\n relationsByResource.set(resource.name, []);\n relationsFromResource.set(resource.name, []);\n }\n\n if (schema.relations) {\n for (const rel of schema.relations) {\n const fromResources = Array.isArray(rel.from) ? rel.from : [rel.from];\n const toResources = Array.isArray(rel.to) ? rel.to : [rel.to];\n\n for (const fromRes of fromResources) {\n const fromRelations = relationsFromResource.get(fromRes) ?? [];\n fromRelations.push(rel);\n relationsFromResource.set(fromRes, fromRelations);\n\n const allRelations = relationsByResource.get(fromRes) ?? [];\n allRelations.push(rel);\n relationsByResource.set(fromRes, allRelations);\n }\n\n for (const toRes of toResources) {\n if (rel.inverse) {\n const allRelations = relationsByResource.get(toRes) ?? [];\n if (!allRelations.includes(rel)) {\n allRelations.push(rel);\n relationsByResource.set(toRes, allRelations);\n }\n }\n }\n }\n }\n\n return { resourcesByName, fieldsByResource, relationsByResource, relationsFromResource };\n}\n\nexport function getResource(\n index: SchemaIndex,\n name: string,\n): DatafnResourceSchema | undefined {\n return index.resourcesByName.get(name);\n}\n\nexport function getField(\n index: SchemaIndex,\n resource: string,\n field: string,\n): DatafnFieldSchema | undefined {\n return index.fieldsByResource.get(resource)?.get(field);\n}\n\nexport function getRelationsFrom(\n index: SchemaIndex,\n resource: string,\n): DatafnRelationSchema[] {\n return index.relationsFromResource.get(resource) ?? [];\n}\n\nexport function getRelation(\n index: SchemaIndex,\n fromResource: string,\n relationName: string,\n): DatafnRelationSchema | undefined {\n const relations = index.relationsFromResource.get(fromResource) ?? [];\n return relations.find((r) => r.relation === relationName);\n}\n\nexport function getRelationTarget(relation: DatafnRelationSchema): string {\n return Array.isArray(relation.to) ? relation.to[0] : relation.to;\n}\n\n/**\n * Find a relation by name in either direction (forward or inverse).\n * Checks both `relation === relationName` (from side) and `inverse === relationName` (to side).\n */\nexport function findRelationBidirectional(\n schema: DatafnSchema,\n resource: string,\n relationName: string,\n): DatafnRelationSchema | undefined {\n return schema.relations?.find(\n (r) =>\n (r.from === resource && r.relation === relationName) ||\n (r.to === resource && r.inverse === relationName),\n );\n}\n","import type { DatafnError } from \"./errors.js\";\n\n/** Map non-$-prefixed operator names to core's $-prefixed equivalents. */\nexport const OP_REMAP: Record<string, string> = {\n eq: \"$eq\", ne: \"$ne\", gt: \"$gt\", gte: \"$gte\", lt: \"$lt\", lte: \"$lte\",\n in: \"$in\", not_in: \"$nin\",\n like: \"$like\", ilike: \"$ilike\", not_like: \"$not_like\", not_ilike: \"$not_ilike\",\n is_null: \"$is_null\", is_not_null: \"$is_not_null\",\n is_empty: \"$is_empty\", is_not_empty: \"$is_not_empty\",\n before: \"$before\", after: \"$after\", between: \"$between\", not_between: \"$not_between\",\n};\n\n/** Recursively remap non-$-prefixed operator names to core's $-prefixed form. */\nexport function normalizeFilterOps(filters: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(filters)) {\n if ((key === \"$and\" || key === \"$or\") && Array.isArray(value)) {\n out[key] = (value as Record<string, unknown>[]).map(normalizeFilterOps);\n } else if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n const ops = value as Record<string, unknown>;\n const normalized: Record<string, unknown> = {};\n for (const [op, opVal] of Object.entries(ops)) {\n normalized[OP_REMAP[op] ?? op] = opVal;\n }\n out[key] = normalized;\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\nexport interface FilterEvalOptions {\n resolveRelation?: (resource: string, recordId: string, relationName: string) => Record<string, unknown>[];\n resource?: string;\n}\n\nfunction dfqlError(code: DatafnError[\"code\"], message: string): never {\n const err: DatafnError & { [k: string]: unknown } = { code, message };\n throw err;\n}\n\n/**\n * Convert a SQL-like LIKE pattern (% = any sequence, _ = single char) to a RegExp.\n */\nfunction likeToRegExp(pattern: string, caseInsensitive: boolean): RegExp {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/%/g, \".*\").replace(/_/g, \".\");\n return new RegExp(`^${escaped}$`, caseInsensitive ? \"i\" : \"\");\n}\n\n/**\n * Resolve a dot-path on a plain object. Returns `undefined` if path cannot be resolved.\n */\nfunction resolvePath(record: Record<string, unknown>, parts: string[]): unknown {\n let current: unknown = record;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Evaluate a single field value against an operator object.\n * All operators must be $-prefixed.\n */\nfunction evaluateOperators(fieldValue: unknown, ops: Record<string, unknown>): boolean {\n for (const [op, opVal] of Object.entries(ops)) {\n switch (op) {\n case \"$eq\":\n if (fieldValue !== opVal) return false;\n break;\n case \"$ne\":\n if (fieldValue === opVal) return false;\n break;\n case \"$gt\":\n if (!((fieldValue as number) > (opVal as number))) return false;\n break;\n case \"$gte\":\n if (!((fieldValue as number) >= (opVal as number))) return false;\n break;\n case \"$lt\":\n if (!((fieldValue as number) < (opVal as number))) return false;\n break;\n case \"$lte\":\n if (!((fieldValue as number) <= (opVal as number))) return false;\n break;\n case \"$in\":\n if (!Array.isArray(opVal)) dfqlError(\"DFQL_INVALID\", `$in requires array`);\n if (!(opVal as unknown[]).includes(fieldValue)) return false;\n break;\n case \"$nin\":\n if (!Array.isArray(opVal)) dfqlError(\"DFQL_INVALID\", `$nin requires array`);\n if ((opVal as unknown[]).includes(fieldValue)) return false;\n break;\n case \"$contains\":\n if (typeof fieldValue === \"string\") {\n if (!(fieldValue as string).includes(opVal as string)) return false;\n } else if (Array.isArray(fieldValue)) {\n if (!(fieldValue as unknown[]).includes(opVal)) return false;\n } else {\n return false;\n }\n break;\n case \"$startsWith\":\n if (typeof fieldValue !== \"string\") return false;\n if (!(fieldValue as string).startsWith(opVal as string)) return false;\n break;\n case \"$endsWith\":\n if (typeof fieldValue !== \"string\") return false;\n if (!(fieldValue as string).endsWith(opVal as string)) return false;\n break;\n case \"$like\":\n if (typeof fieldValue !== \"string\" || typeof opVal !== \"string\") return false;\n if (!likeToRegExp(opVal, false).test(fieldValue)) return false;\n break;\n case \"$ilike\":\n if (typeof fieldValue !== \"string\" || typeof opVal !== \"string\") return false;\n if (!likeToRegExp(opVal, true).test(fieldValue)) return false;\n break;\n case \"$not_like\":\n if (typeof fieldValue !== \"string\" || typeof opVal !== \"string\") return false;\n if (likeToRegExp(opVal, false).test(fieldValue)) return false;\n break;\n case \"$not_ilike\":\n if (typeof fieldValue !== \"string\" || typeof opVal !== \"string\") return false;\n if (likeToRegExp(opVal, true).test(fieldValue)) return false;\n break;\n case \"$is_null\":\n if (opVal === true && fieldValue !== null && fieldValue !== undefined) return false;\n if (opVal === false && (fieldValue === null || fieldValue === undefined)) return false;\n break;\n case \"$is_not_null\":\n if (opVal === true && (fieldValue === null || fieldValue === undefined)) return false;\n if (opVal === false && fieldValue !== null && fieldValue !== undefined) return false;\n break;\n case \"$is_empty\": {\n const isEmpty =\n fieldValue === null ||\n fieldValue === undefined ||\n fieldValue === \"\" ||\n (Array.isArray(fieldValue) && (fieldValue as unknown[]).length === 0);\n if (opVal === true && !isEmpty) return false;\n if (opVal === false && isEmpty) return false;\n break;\n }\n case \"$is_not_empty\": {\n const isEmpty =\n fieldValue === null ||\n fieldValue === undefined ||\n fieldValue === \"\" ||\n (Array.isArray(fieldValue) && (fieldValue as unknown[]).length === 0);\n if (opVal === true && isEmpty) return false;\n if (opVal === false && !isEmpty) return false;\n break;\n }\n case \"$before\":\n if (!((fieldValue as number | string) < (opVal as number | string))) return false;\n break;\n case \"$after\":\n if (!((fieldValue as number | string) > (opVal as number | string))) return false;\n break;\n case \"$between\": {\n if (!Array.isArray(opVal) || (opVal as unknown[]).length !== 2)\n dfqlError(\"DFQL_INVALID\", `$between requires [low, high] array`);\n const [low, high] = opVal as [unknown, unknown];\n const fv = fieldValue as number;\n if (!((fv as number) >= (low as number) && (fv as number) <= (high as number))) return false;\n break;\n }\n case \"$not_between\": {\n if (!Array.isArray(opVal) || (opVal as unknown[]).length !== 2)\n dfqlError(\"DFQL_INVALID\", `$not_between requires [low, high] array`);\n const [low, high] = opVal as [unknown, unknown];\n const fv = fieldValue as number;\n if (!((fv as number) < (low as number) || (fv as number) > (high as number))) return false;\n break;\n }\n default:\n dfqlError(\"DFQL_UNSUPPORTED\", `Unsupported DFQL operator: ${op}`);\n }\n }\n return true;\n}\n\n/** CLI-009: Maximum allowed nesting depth for evaluateFilter recursion. */\nconst MAX_FILTER_DEPTH = 10;\n\n/**\n * Evaluate a DFQL filter against a single record.\n * Supports: $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $contains, $startsWith, $endsWith,\n * $like, $ilike, $not_like, $not_ilike, $is_null, $is_not_null, $is_empty, $is_not_empty,\n * $before, $after, $between, $not_between, $and, $or.\n * Returns true if the record matches all filter conditions.\n */\nexport function evaluateFilter(\n record: Record<string, unknown>,\n filters: Record<string, unknown>,\n opts?: FilterEvalOptions,\n _depth = 0,\n): boolean {\n // CLI-009: Guard against malicious deeply-nested filters\n if (_depth > MAX_FILTER_DEPTH) {\n dfqlError(\"DFQL_INVALID\", `Filter nesting depth exceeds maximum of ${MAX_FILTER_DEPTH}`);\n }\n\n for (const [key, value] of Object.entries(filters)) {\n if (key === \"$and\") {\n if (!Array.isArray(value)) dfqlError(\"DFQL_INVALID\", \"$and must be array\");\n for (const sub of value as Record<string, unknown>[]) {\n if (!evaluateFilter(record, sub, opts, _depth + 1)) return false;\n }\n continue;\n }\n\n if (key === \"$or\") {\n if (!Array.isArray(value)) dfqlError(\"DFQL_INVALID\", \"$or must be array\");\n let matched = false;\n for (const sub of value as Record<string, unknown>[]) {\n if (evaluateFilter(record, sub, opts, _depth + 1)) { matched = true; break; }\n }\n if (!matched) return false;\n continue;\n }\n\n // Dot-path traversal\n if (key.includes(\".\")) {\n const parts = key.split(\".\");\n const firstSeg = parts[0];\n const firstVal = record[firstSeg];\n\n if (firstVal !== undefined && firstVal !== null) {\n // Nested object path: traverse normally\n const resolved = resolvePath(record, parts);\n if (!evaluateFieldValue(resolved, value)) return false;\n } else if (opts?.resolveRelation) {\n // Possibly a relation path: call resolver\n const resource = opts.resource ?? \"\";\n const recordId = record.id as string;\n const related = opts.resolveRelation(resource, recordId, firstSeg);\n if (related.length === 0) return false;\n const subFilter = { [parts.slice(1).join(\".\")]: value };\n const anyMatch = related.some((r) =>\n evaluateFilter(r, subFilter, opts),\n );\n if (!anyMatch) return false;\n } else {\n // No resolver: path not found on record → false\n return false;\n }\n continue;\n }\n\n // Direct field filter\n const fieldValue = record[key];\n if (!evaluateFieldValue(fieldValue, value)) return false;\n }\n return true;\n}\n\nfunction evaluateFieldValue(fieldValue: unknown, value: unknown): boolean {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return evaluateOperators(fieldValue, value as Record<string, unknown>);\n }\n // Direct equality\n return fieldValue === value;\n}\n","/**\n * Shared relation payload normalization utilities.\n * Used by both server mutation executor and offline client.\n */\n\n/**\n * Normalized relation payload item.\n */\nexport interface NormalizedRelation {\n toId: string;\n metadata: Record<string, unknown>;\n}\n\n/**\n * Normalize relation payload to consistent format.\n * - String -> [{ toId, metadata: {} }]\n * - String[] -> [{ toId, metadata: {} }, ...]\n * - Object with $ref -> [{ toId: $ref, metadata: {...rest} }]\n * - Array of above -> flatten\n */\nexport function normalizeRelationPayload(\n payload: unknown,\n): NormalizedRelation[] {\n if (typeof payload === \"string\") {\n return [{ toId: payload, metadata: {} }];\n }\n if (Array.isArray(payload)) {\n return payload.map((item) => {\n if (typeof item === \"string\") {\n return { toId: item, metadata: {} };\n }\n if (typeof item === \"object\" && item !== null) {\n const { $ref, ...meta } = item as Record<string, unknown>;\n if (!$ref || typeof $ref !== \"string\") {\n throw new Error(\"Invalid relation payload item: missing or invalid $ref\");\n }\n return { toId: $ref as string, metadata: meta };\n }\n throw new Error(\"Invalid relation payload item type\");\n });\n }\n if (typeof payload === \"object\" && payload !== null) {\n const { $ref, ...meta } = payload as Record<string, unknown>;\n if (!$ref || typeof $ref !== \"string\") {\n throw new Error(\"Invalid relation payload: missing or invalid $ref\");\n }\n return [{ toId: $ref as string, metadata: meta }];\n }\n throw new Error(\"Invalid relation payload: must be string, object with $ref, or array\");\n}\n","/**\n * Shared aggregation computation.\n * Used by both server and client offline aggregate query execution.\n */\n\n/**\n * Calculate an aggregation over a set of records for a given op and field.\n * Null-safe: null/undefined values are excluded from sum/min/max/avg.\n * Returns null for empty sets (SQL semantics).\n */\nexport function calculateAggregation(\n op: string,\n field: string,\n records: Record<string, unknown>[],\n): unknown {\n if (op === \"count\") {\n // LOW-007 (intentional): count() always returns the total number of records,\n // regardless of the `field` parameter. This matches the client's expectation\n // (\"count is not null-filtered — it counts records, not values\").\n // If SQL COUNT(field) semantics (null-excluded) are needed in future,\n // add a separate `countNonNull` operation rather than changing this behaviour.\n return records.length;\n }\n\n const values = records\n .map((r) => r[field])\n .filter((v) => v !== null && v !== undefined);\n\n if (values.length === 0) return null;\n\n if (op === \"sum\") {\n return values.reduce((a, b) => (Number(a) || 0) + (Number(b) || 0), 0);\n }\n if (op === \"min\") {\n let min = values[0];\n for (const v of values) {\n if (v < min) min = v;\n }\n return min;\n }\n if (op === \"max\") {\n let max = values[0];\n for (const v of values) {\n if (v > max) max = v;\n }\n return max;\n }\n if (op === \"avg\") {\n const sum = values.reduce((a, b) => (Number(a) || 0) + (Number(b) || 0), 0);\n return (sum as number) / values.length;\n }\n return null;\n}\n","export interface SortTerm {\n field: string;\n direction: \"asc\" | \"desc\";\n}\n\n/**\n * Parse DFQL sort strings into structured sort terms.\n * Handles \"field\", \"field:asc\", \"field:desc\", \"-field\".\n * Returns [] for undefined or empty input.\n */\nexport function parseSortTerms(sort: string[] | undefined): SortTerm[] {\n if (!sort || sort.length === 0) return [];\n\n return sort.map((term) => {\n if (term.startsWith(\"-\")) {\n return { field: term.slice(1), direction: \"desc\" };\n }\n const colonIdx = term.indexOf(\":\");\n if (colonIdx !== -1) {\n const field = term.slice(0, colonIdx);\n const direction = term.slice(colonIdx + 1) as \"asc\" | \"desc\";\n return { field, direction };\n }\n return { field: term, direction: \"asc\" };\n });\n}\n\n/**\n * Sort records by the given terms with a stable id tie-breaker.\n * Null values sort after non-null in ascending order (before in descending).\n */\nexport function sortRecords(\n records: Record<string, unknown>[],\n terms: SortTerm[],\n): Record<string, unknown>[] {\n return [...records].sort((a, b) => {\n for (const term of terms) {\n const aVal = a[term.field];\n const bVal = b[term.field];\n\n if (aVal === bVal) continue;\n\n let cmp: number;\n if (aVal === null || aVal === undefined) {\n cmp = 1; // nulls after non-null in ascending\n } else if (bVal === null || bVal === undefined) {\n cmp = -1;\n } else if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n cmp = aVal.localeCompare(bVal);\n } else if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n cmp = aVal - bVal;\n } else {\n cmp = String(aVal).localeCompare(String(bVal));\n }\n\n if (cmp !== 0) return term.direction === \"asc\" ? cmp : -cmp;\n }\n\n // Stable id tie-breaker\n return String(a.id ?? \"\").localeCompare(String(b.id ?? \"\"));\n });\n}\n","export interface SelectToken {\n path: string[];\n baseName: string;\n directive: string | undefined;\n}\n\n/**\n * Parse a DFQL select token string into its structured components.\n * Examples: \"id\" → {path:[\"id\"], baseName:\"id\", directive:undefined}\n * \"tags.*\" → {path:[\"tags\",\"*\"], baseName:\"tags\", directive:\"*\"}\n * \"tasks.tags.*\" → {path:[\"tasks\",\"tags\",\"*\"], baseName:\"tasks\", directive:\"tags.*\"}\n */\nexport function parseSelectToken(token: string): SelectToken {\n const parts = token.split(\".\");\n const baseName = parts[0];\n const directive = parts.length > 1 ? parts.slice(1).join(\".\") : undefined;\n\n return { path: parts, baseName, directive };\n}\n","/**\n * Shared date conversion utilities (DTE-001, DTE-002)\n */\n\nimport type { DatafnFieldSchema } from \"./types.js\";\n\nfunction dfqlInvalid(msg: string): never {\n throw { code: \"DFQL_INVALID\", message: msg };\n}\n\n/**\n * Convert a Date, ISO string, or epoch number to epoch milliseconds.\n * Idempotent: if already a number, returns it directly.\n */\nexport function toEpochMs(value: unknown): number {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) {\n const ms = value.getTime();\n if (isNaN(ms)) dfqlInvalid(`Invalid Date object`);\n return ms;\n }\n if (typeof value === \"string\") {\n const ms = new Date(value).getTime();\n if (isNaN(ms)) dfqlInvalid(`Invalid date string: ${value}`);\n return ms;\n }\n dfqlInvalid(`Cannot convert to epoch ms: ${String(value)}`);\n}\n\n/**\n * Convert an epoch number, ISO string, or Date to a Date object.\n * Idempotent: if already a Date, returns it directly.\n */\nexport function fromEpochMs(value: unknown): Date {\n if (value instanceof Date) {\n if (isNaN(value.getTime())) dfqlInvalid(`Invalid Date object`);\n return value;\n }\n if (typeof value === \"number\") return new Date(value);\n if (typeof value === \"string\") {\n const d = new Date(value);\n if (isNaN(d.getTime())) dfqlInvalid(`Invalid date string: ${value}`);\n return d;\n }\n dfqlInvalid(`Cannot convert to Date: ${String(value)}`);\n}\n\ntype FieldLike = Pick<DatafnFieldSchema, \"name\" | \"type\">;\n\n/**\n * Mutate record in place: convert date-typed fields to epoch milliseconds.\n *\n * LOW-024: This function intentionally mutates the record in-place and returns it\n * (callers rely on the mutation side-effect, as verified by existing tests).\n * If a non-mutating variant is needed, create a separate helper that copies first.\n */\nexport function coerceDateFieldsToEpoch(\n record: Record<string, unknown>,\n fields: FieldLike[],\n): Record<string, unknown> {\n for (const field of fields) {\n if (field.type !== \"date\") continue;\n const val = record[field.name];\n if (val === null || val === undefined) continue;\n record[field.name] = toEpochMs(val);\n }\n return record;\n}\n\n/**\n * Mutate record in place: convert date-typed fields to Date objects.\n *\n * LOW-024: This function intentionally mutates the record in-place and returns it\n * (callers rely on the mutation side-effect, as verified by existing tests).\n * If a non-mutating variant is needed, create a separate helper that copies first.\n */\nexport function parseDateFieldsToDate(\n record: Record<string, unknown>,\n fields: FieldLike[],\n): Record<string, unknown> {\n for (const field of fields) {\n if (field.type !== \"date\") continue;\n const val = record[field.name];\n if (val === null || val === undefined) continue;\n record[field.name] = fromEpochMs(val);\n }\n return record;\n}\n","/**\n * Shared validation primitives for DataFn.\n * - Prototype pollution key checking (recursive)\n * - Field value type validation against schema types\n */\n\nconst DISALLOWED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\n/**\n * ISO 8601 date-time regex (simplified — covers common formats).\n * Matches: YYYY-MM-DD, YYYY-MM-DDTHH:mm:ss, YYYY-MM-DDTHH:mm:ssZ, YYYY-MM-DDTHH:mm:ss±HH:MM\n */\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$/;\n\n/**\n * Recursively checks a value for prototype pollution keys.\n * Returns `{ ok: true }` if clean, or `{ ok: false, key }` with the first offending key found.\n */\nexport function checkPrototypePollution(obj: unknown): { ok: boolean; key?: string } {\n const visited = new WeakSet<object>();\n\n const check = (value: unknown): { ok: boolean; key?: string } => {\n if (typeof value !== \"object\" || value === null) {\n return { ok: true };\n }\n\n const objectValue = value as object;\n if (visited.has(objectValue)) {\n return { ok: true };\n }\n visited.add(objectValue);\n\n if (Array.isArray(value)) {\n for (const element of value) {\n const nestedResult = check(element);\n if (!nestedResult.ok) return nestedResult;\n }\n return { ok: true };\n }\n\n for (const key of Object.keys(value as Record<string, unknown>)) {\n if (DISALLOWED_KEYS.has(key)) {\n return { ok: false, key };\n }\n const nestedResult = check((value as Record<string, unknown>)[key]);\n if (!nestedResult.ok) {\n return nestedResult;\n }\n }\n\n return { ok: true };\n };\n\n return check(obj);\n}\n\n/**\n * Validates a field value against its declared schema type.\n * Returns `{ ok: true }` if valid, or `{ ok: false, error }` with a descriptive message.\n */\nexport function validateFieldValue(\n schemaType: string,\n value: unknown,\n nullable: boolean,\n): { ok: boolean; error?: string } {\n // Null handling\n if (value === null) {\n if (nullable) return { ok: true };\n return { ok: false, error: `expected ${schemaType}, got null` };\n }\n\n switch (schemaType) {\n case \"string\":\n if (typeof value !== \"string\") {\n return { ok: false, error: `expected string, got ${typeof value}` };\n }\n return { ok: true };\n\n case \"number\":\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n const actual = typeof value === \"number\" ? \"NaN\" : typeof value;\n return { ok: false, error: `expected number, got ${actual}` };\n }\n return { ok: true };\n\n case \"boolean\":\n if (typeof value !== \"boolean\") {\n return { ok: false, error: `expected boolean, got ${typeof value}` };\n }\n return { ok: true };\n\n case \"date\":\n // Accept ISO 8601 strings or epoch numbers\n if (typeof value === \"string\") {\n if (!ISO_DATE_RE.test(value) || Number.isNaN(Date.parse(value))) {\n return { ok: false, error: `expected date (ISO 8601 string or epoch number), got invalid date string` };\n }\n return { ok: true };\n }\n if (typeof value === \"number\") {\n return { ok: true };\n }\n return { ok: false, error: `expected date (ISO 8601 string or epoch number), got ${typeof value}` };\n\n case \"object\":\n // Plain object only — not null (already handled), not array\n if (typeof value !== \"object\" || Array.isArray(value)) {\n const actual = Array.isArray(value) ? \"array\" : typeof value;\n return { ok: false, error: `expected object, got ${actual}` };\n }\n return { ok: true };\n\n case \"array\":\n if (!Array.isArray(value)) {\n return { ok: false, error: `expected array, got ${typeof value}` };\n }\n return { ok: true };\n\n case \"file\":\n if (typeof value !== \"string\") {\n return { ok: false, error: `expected file (string), got ${typeof value}` };\n }\n return { ok: true };\n\n case \"json\":\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return { ok: true };\n }\n if (typeof value === \"object\") {\n return { ok: true }; // object or array — both valid JSON\n }\n return { ok: false, error: `expected json, got ${typeof value}` };\n\n default:\n return { ok: false, error: `unknown schema type: ${schemaType}` };\n }\n}\n","/**\n * Generic plugin hook runner (HKS-001)\n * Fail-closed for before hooks, fail-open for after hooks.\n */\n\nimport type { DatafnPlugin, DatafnHookContext } from \"./types.js\";\n\nexport interface HookError {\n code: string;\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport type BeforeHookResult<T> =\n | { ok: true; value: T }\n | { ok: false; error: HookError };\n\nfunction wrapError(err: unknown, pluginName: string, hookName: string): HookError {\n if (err && typeof err === \"object\") {\n const e = err as Record<string, unknown>;\n return {\n code: (e.code as string) || \"INTERNAL\",\n message: (e.message as string) || \"Plugin error\",\n details: { path: `plugins.${pluginName}.${hookName}`, ...((e.details as Record<string, unknown>) ?? {}) },\n };\n }\n return {\n code: \"INTERNAL\",\n message: String(err),\n details: { path: `plugins.${pluginName}.${hookName}` },\n };\n}\n\n/**\n * Run a before-style hook across plugins filtered by env.\n * Fail-closed: first error stops the chain and returns { ok: false, error }.\n * Each hook's return value (if defined) becomes the new payload.\n *\n * @param preArgs Optional args inserted before payload in hook call: hook(ctx, ...preArgs, payload)\n */\nexport async function runBeforeHook<T = unknown>(\n plugins: DatafnPlugin[],\n env: \"client\" | \"server\",\n hookName: keyof DatafnPlugin,\n ctx: DatafnHookContext,\n payload: T,\n preArgs: unknown[] = [],\n): Promise<BeforeHookResult<T>> {\n let current = payload;\n const filtered = plugins.filter((p) => p.runsOn.includes(env));\n\n for (const plugin of filtered) {\n const hook = plugin[hookName] as ((...args: unknown[]) => Promise<unknown> | unknown) | undefined;\n if (!hook) continue;\n\n try {\n const result = await hook(ctx, ...preArgs, current);\n if (result !== undefined) current = result as T;\n } catch (err) {\n return { ok: false, error: wrapError(err, plugin.name, String(hookName)) };\n }\n }\n\n return { ok: true, value: current };\n}\n\n/**\n * Run an after-style hook across plugins filtered by env.\n * Fail-open: errors are logged but do not stop the chain.\n *\n * @param preArgs Optional args inserted before payload in hook call: hook(ctx, ...preArgs, payload, result)\n */\nexport async function runAfterHook(\n plugins: DatafnPlugin[],\n env: \"client\" | \"server\",\n hookName: keyof DatafnPlugin,\n ctx: DatafnHookContext,\n payload: unknown,\n result: unknown,\n preArgs: unknown[] = [],\n): Promise<void> {\n const filtered = plugins.filter((p) => p.runsOn.includes(env));\n\n for (const plugin of filtered) {\n const hook = plugin[hookName] as ((...args: unknown[]) => Promise<unknown> | unknown) | undefined;\n if (!hook) continue;\n\n try {\n await hook(ctx, ...preArgs, payload, result);\n } catch (err) {\n console.error(`Plugin ${plugin.name}.${String(hookName)} error:`, err);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datafn/core",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Core types and utilities for datafn - schema validation, DFQL normalization, and shared types",
5
5
  "license": "MIT",
6
6
  "type": "module",