@contractkit/plugin-typescript 0.28.1 → 0.28.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.
@@ -5,9 +5,9 @@ $ tsup src/index.ts --format esm --sourcemap --dts && tsc --emitDeclarationOnly
5
5
  CLI tsup v8.5.1
6
6
  CLI Target: esnext
7
7
  ESM Build start
8
- ESM dist/index.js 154.70 KB
9
- ESM dist/index.js.map 339.99 KB
10
- ESM ⚡️ Build success in 416ms
8
+ ESM dist/index.js 176.01 KB
9
+ ESM dist/index.js.map 388.17 KB
10
+ ESM ⚡️ Build success in 473ms
11
11
  DTS Build start
12
- DTS ⚡️ Build success in 6768ms
13
- DTS dist/index.d.ts 2.35 KB
12
+ DTS ⚡️ Build success in 5954ms
13
+ DTS dist/index.d.ts 3.71 KB
@@ -3,30 +3,32 @@ $ vitest run --coverage
3
3
   RUN  v4.1.5 /home/runner/work/ContractKit/ContractKit/packages/plugin-typescript
4
4
  Coverage enabled with v8
5
5
 
6
- ✓ tests/codegen-contract.test.ts (128 tests) 235ms
7
- ✓ tests/codegen-operation.test.ts (89 tests) 196ms
8
- ✓ tests/codegen-sdk.test.ts (140 tests) 329ms
9
- ✓ tests/codegen-plain-types.test.ts (61 tests) 40ms
10
- ✓ tests/pipeline.test.ts (25 tests) 222ms
11
- ✓ tests/codegen-server.test.ts (22 tests) 62ms
12
- ✓ tests/escaping-security.test.ts (18 tests) 28ms
6
+ ✓ tests/codegen-contract.test.ts (128 tests) 233ms
7
+ ✓ tests/codegen-operation.test.ts (91 tests) 103ms
8
+ ✓ tests/codegen-sdk.test.ts (140 tests) 276ms
9
+ ✓ tests/codegen-plain-types.test.ts (61 tests) 42ms
10
+ ✓ tests/codegen-server.test.ts (22 tests) 91ms
11
+ ✓ tests/pipeline.test.ts (28 tests) 224ms
12
+ ✓ tests/codegen-mcp.test.ts (24 tests) 98ms
13
+ ✓ tests/escaping-security.test.ts (18 tests) 51ms
13
14
 
14
-  Test Files  7 passed (7)
15
-  Tests  483 passed (483)
16
-  Start at  17:06:40
17
-  Duration  9.04s (transform 4.19s, setup 0ms, import 16.95s, tests 1.11s, environment 1ms)
15
+  Test Files  8 passed (8)
16
+  Tests  512 passed (512)
17
+  Start at  16:29:52
18
+  Duration  9.09s (transform 4.13s, setup 0ms, import 16.79s, tests 1.12s, environment 1ms)
18
19
 
19
20
   % Coverage report from v8
20
21
  -------------------|---------|----------|---------|---------|-------------------
21
22
  File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
22
23
  -------------------|---------|----------|---------|---------|-------------------
23
- All files | 83.19 | 77.74 | 85.99 | 85.77 |
24
- src | 83.04 | 77.47 | 85.75 | 85.6 |
24
+ All files | 81.49 | 76.01 | 84.56 | 84.05 |
25
+ src | 81.33 | 75.75 | 84.25 | 83.87 |
25
26
  ...n-contract.ts | 88.1 | 82.91 | 90.08 | 89.26 | ...1088,1093-1094
26
- ...-operation.ts | 78.46 | 74.7 | 78.94 | 79.9 | ...80-691,696-697
27
+ codegen-mcp.ts | 82.67 | 75.47 | 84.61 | 85.9 | ...85,290-291,374
28
+ ...-operation.ts | 78.46 | 74.7 | 78.94 | 79.9 | ...99-710,715-716
27
29
  ...lain-types.ts | 91.52 | 81.65 | 96.87 | 94.4 | ...23,143,249,255
28
30
  codegen-sdk.ts | 88.37 | 83.2 | 87.83 | 91.48 | ...1187-1188,1191
29
- index.ts | 70.05 | 60.38 | 75 | 74.74 | ...45-848,864-883
31
+ index.ts | 60.04 | 48.95 | 65.45 | 63.82 | ...1002,1018-1037
30
32
  path-utils.ts | 69.56 | 50 | 100 | 73.5 | ...65-168,216-231
31
33
  ts-render.ts | 84.21 | 86.66 | 75 | 89.23 | 68,141,172-180
32
34
  tests | 90.38 | 90.9 | 89.28 | 93.47 |
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @contractkit/contractkit-plugin-typescript
2
2
 
3
+ ## 0.28.2
4
+
5
+ ### Patch Changes
6
+
7
+ - ca9309a: Generated Koa route handlers now use `async ctx => {` instead of `async (ctx, next) => {`. The `next` argument was never referenced in the emitted body and tripped no-unused-vars lint rules in consuming projects.
8
+
3
9
  ## 0.28.1
4
10
 
5
11
  ### Patch Changes
@@ -0,0 +1,38 @@
1
+ import type { OpRootNode } from '@contractkit/core';
2
+ export interface McpCodegenOptions {
3
+ /** Absolute path of the file being generated. Used to compute relative imports. */
4
+ outPath?: string;
5
+ /** Map from schema identifier (model name / `${name}Input`) → absolute output file. */
6
+ modelOutPaths?: Map<string, string>;
7
+ /** Model names that have an Input variant schema. */
8
+ modelsWithInput?: Set<string>;
9
+ /** Model names that have an Output variant schema. */
10
+ modelsWithOutput?: Set<string>;
11
+ /** Import-path template for service implementations (same semantics as ServerConfig). */
12
+ servicePathTemplate?: string;
13
+ /** Emit tools for `internal` operations. Default false. */
14
+ includeInternal?: boolean;
15
+ }
16
+ /**
17
+ * True if the root has at least one MCP-exposed operation. With `includeInternal: false`
18
+ * (default) `internal` operations don't count. Mirrors `hasPublicOperations`.
19
+ */
20
+ export declare function hasMcpOperations(root: OpRootNode, includeInternal?: boolean): boolean;
21
+ /** The exported register-fn name for an op-root file, e.g. `payments.op` → `registerPaymentsMcpTools`. */
22
+ export declare function deriveMcpRegisterFnName(file: string): string;
23
+ /** Generate one `<filename>.mcp.ts` for an op-root: tool handler classes + a per-file register fn. */
24
+ export declare function generateMcpFile(root: OpRootNode, options?: McpCodegenOptions): string;
25
+ /** One entry per emitted `<filename>.mcp.ts` for the aggregator to import. */
26
+ export interface McpAggregatorEntry {
27
+ /** The file's exported register fn name, e.g. `registerPaymentsMcpTools`. */
28
+ registerFn: string;
29
+ /** Module specifier for the file, relative to the aggregator and `.js`-suffixed. */
30
+ importPath: string;
31
+ }
32
+ /** Generate the aggregator `mcp.tools.ts` that assembles the single McpToolHandlerMap. */
33
+ export declare function generateMcpAggregator(entries: McpAggregatorEntry[]): string;
34
+ /** Generate the optional `mcp.router.ts` — the standard ServerKit route wiring for the dispatcher. */
35
+ export declare function generateMcpRouter(options?: {
36
+ path?: string;
37
+ }): string;
38
+ //# sourceMappingURL=codegen-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen-mcp.d.ts","sourceRoot":"","sources":["../src/codegen-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA8E,MAAM,mBAAmB,CAAC;AAShI,MAAM,WAAW,iBAAiB;IAC9B,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qDAAqD;IACrD,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,UAAQ,GAAG,OAAO,CASnF;AAoVD,0GAA0G;AAC1G,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA0DzF;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IAC/B,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,0FAA0F;AAC1F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAe3E;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAuBzE"}
@@ -1,9 +1,10 @@
1
- import type { OpRootNode, ContractTypeNode } from '@contractkit/core';
1
+ import type { OpRootNode, OpRouteNode, OpOperationNode, ContractTypeNode } from '@contractkit/core';
2
2
  /**
3
3
  * Deep structural equality on ContractTypeNode, ignoring source locations on inline fields.
4
4
  * Used to decide whether multiple declared request MIMEs can share a single validate path.
5
5
  */
6
6
  export declare function bodyTypesStructurallyEqual(a: ContractTypeNode, b: ContractTypeNode): boolean;
7
+ /** Options controlling how {@link generateOp} renders a Koa router module. */
7
8
  export interface OpCodegenOptions {
8
9
  servicePathTemplate?: string;
9
10
  typeImportPathTemplate?: string;
@@ -23,4 +24,44 @@ export interface OpCodegenOptions {
23
24
  }
24
25
  /** Generate a Koa router module for every operation in `root`, including the imports, type aliases, and handler list. */
25
26
  export declare function generateOp(root: OpRootNode, options?: OpCodegenOptions): string;
27
+ /**
28
+ * Resolve the service class and method a handler should delegate to.
29
+ *
30
+ * Uses the operation's explicit `service: Class.method` declaration when present; otherwise derives
31
+ * the class from the contract file name (`ledger.categories.ck` → `LedgerCategoriesService`) and the
32
+ * method from the HTTP verb and whether the path carries a parameter (`get` → `list` / `getById`).
33
+ *
34
+ * @param file Path of the `.ck` file the operation came from.
35
+ */
36
+ export declare function inferService(op: OpOperationNode, route: OpRouteNode, file: string): {
37
+ className: string;
38
+ methodName: string;
39
+ };
40
+ /**
41
+ * Build the comma-separated argument list passed to the service method in a generated handler.
42
+ *
43
+ * Order is params, body, query, headers. Inline path params are spread as individual identifiers;
44
+ * a referenced/compound params type is passed as a single `params` object. A lone
45
+ * `multipart/form-data` request body is passed as `multipartBody` rather than `body`.
46
+ *
47
+ * @returns The rendered argument list, or an empty string when the method takes no arguments.
48
+ */
49
+ export declare function buildArgs(route: OpRouteNode, op: OpOperationNode): string;
50
+ /**
51
+ * Derive the PascalCase base name used for router, service, and type names from a contract file path.
52
+ *
53
+ * Strips directories and the `.op`/`.ck` extension, then PascalCases each dot-separated segment
54
+ * (`contracts/ledger.categories.ck` → `LedgerCategories`). Falls back to `Resource` for an empty path.
55
+ */
56
+ export declare function deriveBaseName(file: string): string;
57
+ /**
58
+ * Resolve the import specifier for a service class.
59
+ *
60
+ * Drops the trailing `Service` suffix and kebab-cases the remainder, then applies `template` if given
61
+ * (`{name}` → `Ledger`, `{kebab}` → `ledger`). Without a template, defaults to
62
+ * `#modules/<kebab>/<kebab>.service.js`.
63
+ *
64
+ * @param template Optional `servicePathTemplate` from the plugin config.
65
+ */
66
+ export declare function deriveModulePath(serviceName: string, template?: string): string;
26
67
  //# sourceMappingURL=codegen-operation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codegen-operation.d.ts","sourceRoot":"","sources":["../src/codegen-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAgC,gBAAgB,EAA2B,MAAM,mBAAmB,CAAC;AAmC7H;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAkE5F;AAID,MAAM,WAAW,gBAAgB;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,yHAAyH;AACzH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CA4EnF"}
1
+ {"version":3,"file":"codegen-operation.d.ts","sourceRoot":"","sources":["../src/codegen-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAA2B,MAAM,mBAAmB,CAAC;AAmC7H;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAkE5F;AAID,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,yHAAyH;AACzH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CA4EnF;AAsKD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAY7H;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,GAAG,MAAM,CAqBzE;AAmXD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWnD;AAMD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/E"}
package/dist/index.d.ts CHANGED
@@ -43,11 +43,38 @@ export interface TypesConfig {
43
43
  baseDir?: string;
44
44
  output?: string;
45
45
  }
46
+ export interface McpConfig {
47
+ /** Directory (relative to rootDir) where MCP files are written. Default: rootDir. */
48
+ baseDir?: string;
49
+ output?: {
50
+ /** Path template for per-op-file tool handlers. Supports {filename}, {dir}, {area}. Default `{filename}.mcp.ts`. */
51
+ tools?: string;
52
+ /** Path (or template) for the aggregator that assembles the McpToolHandlerMap. Default `mcp.tools.ts`. */
53
+ index?: string;
54
+ /** Path (or template) for the optional POST /mcp route file. Default `mcp.router.ts`. */
55
+ router?: string;
56
+ /**
57
+ * Path template for the model **Zod schema** files the tools import (for arg validation and
58
+ * `z.toJSONSchema`). When omitted, falls back to the `server` sub-config's `output.types`
59
+ * (if `server.zod`) or the `zod` sub-config's output. Tools require Zod schemas, not plain types.
60
+ */
61
+ types?: string;
62
+ };
63
+ /** Emit the `mcp.router.ts` route boilerplate. Default true. */
64
+ emitRouter?: boolean;
65
+ /** Mount path used in the emitted router. Default `/mcp`. */
66
+ path?: string;
67
+ /** Import path template for service implementations (same semantics as ServerConfig). */
68
+ servicePathTemplate?: string;
69
+ /** Whether to expose operations marked `internal` as MCP tools. Default false. */
70
+ includeInternal?: boolean;
71
+ }
46
72
  export interface TypescriptPluginConfig {
47
73
  server?: ServerConfig;
48
74
  sdk?: SdkConfig;
49
75
  zod?: ZodConfig;
50
76
  types?: TypesConfig;
77
+ mcp?: McpConfig;
51
78
  }
52
79
  /** Bumped when the codegen output shape changes in a way that should bust every per-file fingerprint. */
53
80
  export declare const TYPESCRIPT_CODEGEN_VERSION = "1";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACR,iBAAiB,EAQpB,MAAM,mBAAmB,CAAC;AA6C3B,MAAM,WAAW,YAAY;IACzB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6HAA6H;IAC7H,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE;QACL,8EAA8E;QAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,+EAA+E;QAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACnC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;CACvB;AAID,yGAAyG;AACzG,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAO9C,QAAA,MAAM,MAAM,EAAE,iBAMb,CAAC;AAEF,eAAe,MAAM,CAAC;AAEtB,2GAA2G;AAC3G,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAOzG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACR,iBAAiB,EAQpB,MAAM,mBAAmB,CAAC;AA8C3B,MAAM,WAAW,YAAY;IACzB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6HAA6H;IAC7H,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE;QACL,8EAA8E;QAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,+EAA+E;QAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACtB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACL,oHAAoH;QACpH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,0GAA0G;QAC1G,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,yFAAyF;QACzF,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACnC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,SAAS,CAAC;CACnB;AAID,yGAAyG;AACzG,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAO9C,QAAA,MAAM,MAAM,EAAE,iBAMb,CAAC;AAEF,eAAe,MAAM,CAAC;AAEtB,2GAA2G;AAC3G,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAOzG"}