@codespar/types 0.10.1 → 0.10.7

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.
@@ -0,0 +1,434 @@
1
+ /**
2
+ * Unit tests for the meta-tool conformance kit.
3
+ *
4
+ * The kit's value is its pass/fail logic: a conforming implementation
5
+ * passes, and an implementation that violates a wire shape, an action-state
6
+ * rule, or an error rule fails — with a violation naming the specific
7
+ * breach. We prove that two ways without a real backend:
8
+ *
9
+ * 1. The pure verification core (`checkWireShape`, `checkActionResult`,
10
+ * `checkUnregisteredError`, `checkMalformedError`) is exercised
11
+ * directly against hand-built conforming and violating envelopes.
12
+ * 2. The live suite (`runMetaToolConformanceSuite`) is run end-to-end
13
+ * against a FAKE backend (a stubbed `fetch`), asserting that a
14
+ * conforming fake registers passing cases and a fake that breaks each
15
+ * rule registers a failing case carrying the right violation.
16
+ */
17
+ import { describe, it, expect, vi, afterEach } from "vitest";
18
+ import { SHOP_CONTRACT, DISCOVER_CONTRACT } from "../meta-tool-contract.js";
19
+ import { fieldMatches, checkWireShape, checkActionResult, checkSingleShotResult, checkUnregisteredError, checkMalformedError, formatViolations, } from "./conformance-kit.js";
20
+ /* ── fieldMatches ────────────────────────────────────────────── */
21
+ describe("fieldMatches", () => {
22
+ it("matches each JSON-value kind", () => {
23
+ expect(fieldMatches({ name: "x", kind: "string" }, "a")).toBe(true);
24
+ expect(fieldMatches({ name: "x", kind: "number" }, 1)).toBe(true);
25
+ expect(fieldMatches({ name: "x", kind: "boolean" }, true)).toBe(true);
26
+ expect(fieldMatches({ name: "x", kind: "array" }, [])).toBe(true);
27
+ expect(fieldMatches({ name: "x", kind: "object" }, {})).toBe(true);
28
+ });
29
+ it("rejects mismatched kinds", () => {
30
+ expect(fieldMatches({ name: "x", kind: "string" }, 1)).toBe(false);
31
+ expect(fieldMatches({ name: "x", kind: "number" }, "1")).toBe(false);
32
+ expect(fieldMatches({ name: "x", kind: "array" }, {})).toBe(false);
33
+ expect(fieldMatches({ name: "x", kind: "object" }, [])).toBe(false);
34
+ expect(fieldMatches({ name: "x", kind: "object" }, null)).toBe(false);
35
+ });
36
+ it("constrains string-enum to the closed value set", () => {
37
+ const rule = {
38
+ name: "status",
39
+ kind: "string-enum",
40
+ values: ["in_progress", "ready_for_payment"],
41
+ };
42
+ expect(fieldMatches(rule, "ready_for_payment")).toBe(true);
43
+ expect(fieldMatches(rule, "canceled")).toBe(false);
44
+ expect(fieldMatches(rule, 1)).toBe(false);
45
+ });
46
+ });
47
+ /* ── checkWireShape ──────────────────────────────────────────── */
48
+ describe("checkWireShape", () => {
49
+ const shape = {
50
+ name: "ShopSearchResult",
51
+ fields: [
52
+ { name: "rail", kind: "string" },
53
+ { name: "products", kind: "array" },
54
+ ],
55
+ };
56
+ it("passes a conforming object", () => {
57
+ expect(checkWireShape(shape, { rail: "vtex", products: [] })).toEqual([]);
58
+ });
59
+ it("allows extra optional fields beyond the shape (subset-shape)", () => {
60
+ expect(checkWireShape(shape, { rail: "vtex", products: [], extra: 7 })).toEqual([]);
61
+ });
62
+ it("flags a missing required field with the field name", () => {
63
+ const violations = checkWireShape(shape, { rail: "vtex" });
64
+ expect(violations).toHaveLength(1);
65
+ expect(violations[0].code).toBe("wire-shape");
66
+ expect(violations[0].detail).toContain("ShopSearchResult.products");
67
+ expect(violations[0].detail).toContain("missing");
68
+ });
69
+ it("flags a wrong-typed field with expected vs got", () => {
70
+ const violations = checkWireShape(shape, { rail: 7, products: [] });
71
+ expect(violations).toHaveLength(1);
72
+ expect(violations[0].detail).toContain("ShopSearchResult.rail");
73
+ expect(violations[0].detail).toContain("expected string");
74
+ });
75
+ it("flags a non-object as a single violation", () => {
76
+ expect(checkWireShape(shape, "nope")[0].detail).toContain("expected an object");
77
+ expect(checkWireShape(shape, [])[0].detail).toContain("expected an object");
78
+ });
79
+ it("skips an absent optional field", () => {
80
+ const optShape = {
81
+ name: "S",
82
+ fields: [{ name: "maybe", kind: "string", required: false }],
83
+ };
84
+ expect(checkWireShape(optShape, {})).toEqual([]);
85
+ });
86
+ });
87
+ /* ── checkActionResult ───────────────────────────────────────── */
88
+ function okResult(data) {
89
+ return {
90
+ success: true,
91
+ data,
92
+ error: "",
93
+ duration: 1,
94
+ server: "fake",
95
+ tool: "codespar_shop",
96
+ };
97
+ }
98
+ function errResult(error) {
99
+ return {
100
+ success: false,
101
+ data: {},
102
+ error,
103
+ duration: 0,
104
+ server: "fake",
105
+ tool: "codespar_shop",
106
+ };
107
+ }
108
+ describe("checkActionResult", () => {
109
+ it("passes a conforming shop search result", () => {
110
+ const result = okResult({ rail: "vtex", products: [] });
111
+ expect(checkActionResult(SHOP_CONTRACT, "search", result)).toEqual([]);
112
+ });
113
+ it("flags a checkout result whose status is outside the enum", () => {
114
+ // checkout must return status "in_progress" only.
115
+ const result = okResult({
116
+ checkout_session_id: "cks_1",
117
+ status: "ready_for_payment",
118
+ });
119
+ const violations = checkActionResult(SHOP_CONTRACT, "checkout", result);
120
+ expect(violations).toHaveLength(1);
121
+ expect(violations[0].code).toBe("wire-shape");
122
+ expect(violations[0].detail).toContain("status");
123
+ expect(violations[0].detail).toContain("in_progress");
124
+ });
125
+ it("passes the terminal ready_for_payment checkout_status", () => {
126
+ const result = okResult({
127
+ checkout_session_id: "cks_1",
128
+ status: "ready_for_payment",
129
+ });
130
+ expect(checkActionResult(SHOP_CONTRACT, "checkout_status", result)).toEqual([]);
131
+ });
132
+ it("flags a checkout_status whose status is not a known state", () => {
133
+ const result = okResult({
134
+ checkout_session_id: "cks_1",
135
+ status: "exploded",
136
+ });
137
+ const violations = checkActionResult(SHOP_CONTRACT, "checkout_status", result);
138
+ expect(violations[0].detail).toContain("status");
139
+ });
140
+ it("flags a success-expected action that returned an error", () => {
141
+ const violations = checkActionResult(SHOP_CONTRACT, "search", errResult("boom"));
142
+ expect(violations).toHaveLength(1);
143
+ expect(violations[0].code).toBe("action-state");
144
+ expect(violations[0].detail).toContain("boom");
145
+ });
146
+ it("flags an action that is not in the state machine", () => {
147
+ const violations = checkActionResult(SHOP_CONTRACT, "teleport", okResult({}));
148
+ expect(violations[0].code).toBe("action-state");
149
+ expect(violations[0].detail).toContain("teleport");
150
+ });
151
+ });
152
+ /* ── checkSingleShotResult (the Fix #1 teeth) ────────────────── */
153
+ describe("checkSingleShotResult", () => {
154
+ const conformingDiscover = okResult({
155
+ use_case: "buy cat food",
156
+ search_strategy: "embedding",
157
+ recommended: null,
158
+ related: [],
159
+ next_steps: [],
160
+ });
161
+ it("passes a conforming DiscoverResult", () => {
162
+ expect(checkSingleShotResult(DISCOVER_CONTRACT, conformingDiscover)).toEqual([]);
163
+ });
164
+ it("flags a scalar result that succeeded but is not the wire shape", () => {
165
+ // The exact hole the validation spike found: a single-shot tool
166
+ // returning `output: 42` used to pass on success alone.
167
+ const violations = checkSingleShotResult(DISCOVER_CONTRACT, okResult(42));
168
+ expect(violations.length).toBeGreaterThan(0);
169
+ expect(violations[0].code).toBe("wire-shape");
170
+ expect(violations[0].detail).toContain("expected an object");
171
+ });
172
+ it("flags a missing required field", () => {
173
+ const violations = checkSingleShotResult(DISCOVER_CONTRACT, okResult({
174
+ use_case: "x",
175
+ search_strategy: "embedding",
176
+ related: [],
177
+ // next_steps missing
178
+ }));
179
+ expect(violations[0].code).toBe("wire-shape");
180
+ expect(violations[0].detail).toContain("DiscoverResult.next_steps");
181
+ });
182
+ it("flags a search_strategy outside the enum", () => {
183
+ const violations = checkSingleShotResult(DISCOVER_CONTRACT, okResult({
184
+ use_case: "x",
185
+ search_strategy: "vibes",
186
+ recommended: null,
187
+ related: [],
188
+ next_steps: [],
189
+ }));
190
+ expect(violations[0].detail).toContain("search_strategy");
191
+ });
192
+ it("flags a success-expected single-shot tool that returned an error", () => {
193
+ const violations = checkSingleShotResult(DISCOVER_CONTRACT, errResult("boom"));
194
+ expect(violations[0].code).toBe("wire-shape");
195
+ expect(violations[0].detail).toContain("boom");
196
+ });
197
+ });
198
+ /* ── error rules ─────────────────────────────────────────────── */
199
+ describe("checkUnregisteredError", () => {
200
+ it("passes the canonical 'Tool not registered' envelope", () => {
201
+ const result = errResult("Tool not registered: codespar_shop__probe");
202
+ expect(checkUnregisteredError(SHOP_CONTRACT, result)).toEqual([]);
203
+ });
204
+ it("flags a success result where an unregistered error was due", () => {
205
+ const violations = checkUnregisteredError(SHOP_CONTRACT, okResult({}));
206
+ expect(violations[0].code).toBe("error-unregistered");
207
+ expect(violations[0].detail).toContain("success result");
208
+ });
209
+ it("flags the wrong error message", () => {
210
+ const violations = checkUnregisteredError(SHOP_CONTRACT, errResult("404: not found"));
211
+ expect(violations[0].code).toBe("error-unregistered");
212
+ expect(violations[0].detail).toContain("Tool not registered");
213
+ });
214
+ });
215
+ describe("checkMalformedError", () => {
216
+ it("passes a typed error envelope", () => {
217
+ expect(checkMalformedError(SHOP_CONTRACT, errResult("query: required"))).toEqual([]);
218
+ });
219
+ it("flags a success result for malformed input", () => {
220
+ const violations = checkMalformedError(SHOP_CONTRACT, okResult({}));
221
+ expect(violations[0].code).toBe("error-malformed");
222
+ expect(violations[0].detail).toContain("success result");
223
+ });
224
+ it("flags an empty error string", () => {
225
+ const violations = checkMalformedError(SHOP_CONTRACT, errResult(""));
226
+ expect(violations[0].code).toBe("error-malformed");
227
+ });
228
+ });
229
+ describe("formatViolations", () => {
230
+ it("renders 'no violations' for an empty list", () => {
231
+ expect(formatViolations([])).toBe("no violations");
232
+ });
233
+ it("joins violations with their codes", () => {
234
+ const vs = [
235
+ { code: "wire-shape", detail: "a" },
236
+ { code: "action-state", detail: "b" },
237
+ ];
238
+ expect(formatViolations(vs)).toBe("[wire-shape] a; [action-state] b");
239
+ });
240
+ });
241
+ /** Install a `fetch` stub that routes session-create/execute/delete to a
242
+ * fake backend's `execute`. Returns a teardown. */
243
+ function installFakeBackend(execute) {
244
+ const stub = vi.fn(async (url, init) => {
245
+ const u = String(url);
246
+ if (u.endsWith("/v1/sessions") && init?.method === "POST") {
247
+ return jsonResponse({ id: "sess_fake", status: "active" });
248
+ }
249
+ if (u.includes("/execute")) {
250
+ const body = JSON.parse(String(init?.body ?? "{}"));
251
+ return jsonResponse(execute(body.tool, body.input ?? {}));
252
+ }
253
+ // DELETE close
254
+ return jsonResponse({});
255
+ });
256
+ const original = globalThis.fetch;
257
+ globalThis.fetch = stub;
258
+ return () => {
259
+ globalThis.fetch = original;
260
+ };
261
+ }
262
+ function jsonResponse(body) {
263
+ return new Response(JSON.stringify(body), {
264
+ status: 200,
265
+ headers: { "Content-Type": "application/json" },
266
+ });
267
+ }
268
+ /** Run the suite under a mocked Vitest that executes each registered `it`
269
+ * body and records pass/fail (a thrown/rejected assertion = fail). Returns
270
+ * one entry per registered case. */
271
+ async function runSuiteAndCollect(tool) {
272
+ vi.resetModules();
273
+ const cases = [];
274
+ const afterEachFns = [];
275
+ // Real expect so assertions actually fire inside the case bodies.
276
+ const realExpect = (await vi.importActual("vitest")).expect;
277
+ vi.doMock("vitest", () => ({
278
+ describe: (_name, fn) => fn(),
279
+ it: (name, fn) => {
280
+ cases.push(async () => {
281
+ try {
282
+ await fn();
283
+ return { name, passed: true };
284
+ }
285
+ catch (err) {
286
+ return {
287
+ name,
288
+ passed: false,
289
+ error: err instanceof Error ? err.message : String(err),
290
+ };
291
+ }
292
+ finally {
293
+ for (const a of afterEachFns)
294
+ await a();
295
+ }
296
+ });
297
+ },
298
+ afterEach: (fn) => {
299
+ afterEachFns.push(fn);
300
+ },
301
+ expect: realExpect,
302
+ }));
303
+ const mod = await import("./conformance-kit.js");
304
+ mod.runMetaToolConformanceSuite("http://localhost:9999", "csk_test", { tool });
305
+ const results = [];
306
+ for (const c of cases)
307
+ results.push(await c());
308
+ vi.doUnmock("vitest");
309
+ return results;
310
+ }
311
+ /** A fully conforming fake backend for codespar_shop. */
312
+ const conformingShop = (tool, input) => {
313
+ if (tool.endsWith("__unregistered_probe")) {
314
+ return errResult(`Tool not registered: ${tool}`);
315
+ }
316
+ const action = input.action;
317
+ // Malformed: search with no query.
318
+ if (action === "search" && !input.query) {
319
+ return errResult("query: required");
320
+ }
321
+ if (action === "search")
322
+ return okResult({ rail: "vtex", products: [] });
323
+ if (action === "checkout") {
324
+ return okResult({ checkout_session_id: "cks_1", status: "in_progress" });
325
+ }
326
+ if (action === "checkout_status") {
327
+ return okResult({
328
+ checkout_session_id: "cks_1",
329
+ status: "ready_for_payment",
330
+ });
331
+ }
332
+ return errResult("unknown action");
333
+ };
334
+ describe("runMetaToolConformanceSuite against a fake backend", () => {
335
+ let teardown = null;
336
+ afterEach(() => {
337
+ teardown?.();
338
+ teardown = null;
339
+ });
340
+ it("a conforming fake passes every registered case", async () => {
341
+ teardown = installFakeBackend(conformingShop);
342
+ const results = await runSuiteAndCollect("codespar_shop");
343
+ const failures = results.filter((r) => !r.passed);
344
+ expect(failures, JSON.stringify(failures, null, 2)).toEqual([]);
345
+ // Sanity: it actually registered cases (3 actions + 2 error legs).
346
+ expect(results.length).toBe(5);
347
+ });
348
+ it("fails the wire-shape case when an action returns the wrong shape", async () => {
349
+ // search returns a number for `rail` — a wire-shape violation.
350
+ teardown = installFakeBackend((tool, input) => input.action === "search" && input.query
351
+ ? okResult({ rail: 7, products: [] })
352
+ : conformingShop(tool, input));
353
+ const results = await runSuiteAndCollect("codespar_shop");
354
+ const searchCase = results.find((r) => r.name.includes('"search"'));
355
+ expect(searchCase?.passed).toBe(false);
356
+ expect(searchCase?.error).toContain("ShopSearchResult.rail");
357
+ });
358
+ it("fails the action-state case when checkout reports a terminal status early", async () => {
359
+ teardown = installFakeBackend((tool, input) => input.action === "checkout"
360
+ ? okResult({ checkout_session_id: "cks_1", status: "ready_for_payment" })
361
+ : conformingShop(tool, input));
362
+ const results = await runSuiteAndCollect("codespar_shop");
363
+ const checkoutCase = results.find((r) => r.name.includes('"checkout"'));
364
+ expect(checkoutCase?.passed).toBe(false);
365
+ expect(checkoutCase?.error).toContain("status");
366
+ });
367
+ it("fails the unregistered-error case when the runtime swallows it", async () => {
368
+ teardown = installFakeBackend((tool, input) => tool.endsWith("__unregistered_probe")
369
+ ? okResult({ rail: "vtex", products: [] }) // wrongly succeeds
370
+ : conformingShop(tool, input));
371
+ const results = await runSuiteAndCollect("codespar_shop");
372
+ const unregCase = results.find((r) => r.name.includes("unregistered"));
373
+ expect(unregCase?.passed).toBe(false);
374
+ expect(unregCase?.error).toContain("error-unregistered");
375
+ });
376
+ it("fails the malformed-error case when the runtime accepts bad input", async () => {
377
+ teardown = installFakeBackend((tool, input) => input.action === "search" && !input.query
378
+ ? okResult({ rail: "vtex", products: [] }) // wrongly succeeds on empty query
379
+ : conformingShop(tool, input));
380
+ const results = await runSuiteAndCollect("codespar_shop");
381
+ const malformedCase = results.find((r) => r.name.includes("malformed"));
382
+ expect(malformedCase?.passed).toBe(false);
383
+ expect(malformedCase?.error).toContain("malformed input");
384
+ });
385
+ it("drives a single-shot tool (discover) with no state machine", async () => {
386
+ teardown = installFakeBackend((tool, input) => {
387
+ if (tool.endsWith("__unregistered_probe")) {
388
+ return {
389
+ ...errResult(`Tool not registered: ${tool}`),
390
+ tool,
391
+ };
392
+ }
393
+ // Malformed discover: empty input.
394
+ if (!input.use_case)
395
+ return errResult("use_case: required");
396
+ return okResult({
397
+ use_case: input.use_case,
398
+ search_strategy: "embedding",
399
+ recommended: null,
400
+ related: [],
401
+ next_steps: [],
402
+ });
403
+ });
404
+ const results = await runSuiteAndCollect("codespar_discover");
405
+ const failures = results.filter((r) => !r.passed);
406
+ expect(failures, JSON.stringify(failures, null, 2)).toEqual([]);
407
+ // 1 single-shot case + 2 error legs.
408
+ expect(results.length).toBe(3);
409
+ expect(DISCOVER_CONTRACT.stateMachine).toBeUndefined();
410
+ });
411
+ it("fails the single-shot case when a no-state-machine tool returns the wrong shape", async () => {
412
+ // Regression guard for the hollow-green hole: discover used to pass on
413
+ // `success: true` alone, so a scalar `output: 42` slipped through. With
414
+ // the descriptor's single-shot wire shape the case must now FAIL.
415
+ teardown = installFakeBackend((tool, input) => {
416
+ if (tool.endsWith("__unregistered_probe")) {
417
+ return { ...errResult(`Tool not registered: ${tool}`), tool };
418
+ }
419
+ if (!input.use_case)
420
+ return errResult("use_case: required");
421
+ // Succeeds, but the payload is a scalar — not a DiscoverResult.
422
+ return okResult(42);
423
+ });
424
+ const results = await runSuiteAndCollect("codespar_discover");
425
+ const happyPath = results.find((r) => r.name.includes("DiscoverResult"));
426
+ expect(happyPath?.passed).toBe(false);
427
+ expect(happyPath?.error).toContain("wire-shape");
428
+ expect(happyPath?.error).toContain("expected an object");
429
+ // The two error legs still pass — only the wire-shape teeth bite.
430
+ const otherFailures = results.filter((r) => !r.passed && !r.name.includes("DiscoverResult"));
431
+ expect(otherFailures, JSON.stringify(otherFailures, null, 2)).toEqual([]);
432
+ });
433
+ });
434
+ //# sourceMappingURL=conformance-kit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance-kit.test.js","sourceRoot":"","sources":["../../src/testing/conformance-kit.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,40 @@
1
+ /** One leg of the session contract suite. */
2
+ export type ContractLeg = "execute" | "send" | "sendStream" | "connections" | "close";
3
+ /** Options for {@link runContractSuite}. */
4
+ export interface ContractSuiteOptions {
5
+ /**
6
+ * Server ids to post when opening the session. Defaults to `[]`, matching a
7
+ * consumer that brings no servers and relies on whatever the backend
8
+ * provisions by default.
9
+ */
10
+ servers?: string[];
11
+ /**
12
+ * Which legs to register. Defaults to all five legs in declaration order.
13
+ * Pass a subset to run only those legs (e.g. a consumer whose backend does
14
+ * not implement streaming can omit `"sendStream"`).
15
+ */
16
+ legs?: ContractLeg[];
17
+ }
18
+ /**
19
+ * Resolve which legs to run from the options. Returns all five legs (in
20
+ * declaration order) when `legs` is unset, otherwise the provided subset.
21
+ */
22
+ export declare function selectLegs(opts?: ContractSuiteOptions): ContractLeg[];
23
+ /** Build the session-create request body, defaulting `servers` to `[]`. */
24
+ export declare function buildSessionCreateBody(opts?: ContractSuiteOptions): {
25
+ servers: string[];
26
+ user_id: string;
27
+ };
1
28
  export declare class InvalidBaseUrlError extends Error {
2
29
  constructor(url: string);
3
30
  }
31
+ /**
32
+ * Validate a backend base URL before any request is issued: only https://
33
+ * URLs and localhost are accepted, so a misconfigured environment fails
34
+ * early rather than leaking the apiKey to an arbitrary host. Shared by the
35
+ * meta-tool conformance kit.
36
+ */
37
+ export declare function validateBaseUrl(rawUrl: string): void;
4
38
  /**
5
39
  * Register the full session contract test suite against a live backend.
6
40
  *
@@ -9,8 +43,14 @@ export declare class InvalidBaseUrlError extends Error {
9
43
  * invalid URLs so misconfigured CI environments fail early rather than
10
44
  * leaking the apiKey to an arbitrary host.
11
45
  *
46
+ * The optional `opts` argument lets a consumer choose which servers to post on
47
+ * session open and which subset of legs to run. With no `opts` (or with neither
48
+ * field set) the suite behaves exactly as before: it posts `servers: []` and
49
+ * registers all five legs in declaration order.
50
+ *
12
51
  * @param baseUrl - API base URL (e.g. "https://your-runtime.example" or "http://localhost:3000")
13
52
  * @param apiKey - Bearer token for session creation
53
+ * @param opts - Optional servers list and leg selection (see {@link ContractSuiteOptions})
14
54
  */
15
- export declare function runContractSuite(baseUrl: string, apiKey: string): void;
55
+ export declare function runContractSuite(baseUrl: string, apiKey: string, opts?: ContractSuiteOptions): void;
16
56
  //# sourceMappingURL=contract-suite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract-suite.d.ts","sourceRoot":"","sources":["../../src/testing/contract-suite.ts"],"names":[],"mappings":"AAGA,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,GAAG,EAAE,MAAM;CAMxB;AAmKD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8EtE"}
1
+ {"version":3,"file":"contract-suite.d.ts","sourceRoot":"","sources":["../../src/testing/contract-suite.ts"],"names":[],"mappings":"AAGA,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,aAAa,GAAG,OAAO,CAAC;AAEtF,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;CACtB;AAWD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,WAAW,EAAE,CAErE;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG;IACnE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAEA;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,GAAG,EAAE,MAAM;CAMxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAUpD;AA2JD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,oBAAoB,GAC1B,IAAI,CA0FN"}