From 4fd20fda8612e24d3eeeb9ede826a9f762647014 Mon Sep 17 00:00:00 2001 From: Ernesto J Ballon Date: Thu, 9 Apr 2026 01:49:48 -0400 Subject: [PATCH] Add optional schema validation at function boundaries Introduces an opt-in validation hook so Composable functions can declare input and output schemas. When declared, the ServiceManager validates the event body before handleEvent() is invoked and the resolved return value after, surfacing failures as AppException(400) and AppException(500) respectively. Functions without schemas are unaffected (single truthy check per dispatch, no behaviour change). The protocol is intentionally library-agnostic: a minimal Validator interface requiring only a .parse(value) method that throws on invalid input. Zod schemas satisfy it natively, and hand-rolled validators or TypeBox adapters work with zero framework changes. No new runtime dependencies are added. - src/models/composable.ts: add Validator and Infer; extend Composable with optional inputSchema and outputSchema - src/system/function-registry.ts: capture schemas into metadata at save() - src/system/platform.ts: ServiceManager accepts schemas, validates input before dispatch and output after; interceptors skip output validation (their return value is already discarded); EventEnvelope returns have their body validated in place - src/index.ts: export Validator and Infer - tests/po.test.ts: add SchemaValidatedService with hand-rolled validators and three tests covering happy path, 400 on bad input, 500 on bad output Co-Authored-By: Claude Opus 4.6 (1M context) --- dist/index.d.ts | 2 +- dist/index.js.map | 2 +- dist/models/composable.d.ts | 31 ++++++++++ dist/models/composable.js.map | 2 +- dist/system/function-registry.js | 14 ++++- dist/system/function-registry.js.map | 2 +- dist/system/platform.js | 45 +++++++++++++- dist/system/platform.js.map | 2 +- src/index.ts | 2 +- src/models/composable.ts | 35 +++++++++++ src/system/function-registry.ts | 14 ++++- src/system/platform.ts | 51 +++++++++++++-- tests/po.test.ts | 93 +++++++++++++++++++++++++++- 13 files changed, 277 insertions(+), 18 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index 963b11c..2e055e8 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -9,7 +9,7 @@ export { MultiLevelMap } from './util/multi-level-map.js'; export { EventEnvelope } from './models/event-envelope.js'; export { AsyncHttpRequest } from './models/async-http-request.js'; export { AppException } from './models/app-exception.js'; -export { Composable, preload } from './models/composable.js'; +export { Composable, Validator, Infer, preload } from './models/composable.js'; export { ObjectStreamIO, ObjectStreamWriter, ObjectStreamReader } from './system/object-stream.js'; export { AppConfig, ConfigReader } from './util/config-reader.js'; export { TemplateLoader } from './util/template-loader.js'; diff --git a/dist/index.js.map b/dist/index.js.map index 6ba590e..ccb6e02 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAc,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAgC,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC"} \ No newline at end of file diff --git a/dist/models/composable.d.ts b/dist/models/composable.d.ts index 72ae623..3565b99 100644 --- a/dist/models/composable.d.ts +++ b/dist/models/composable.d.ts @@ -1,4 +1,20 @@ import { EventEnvelope } from "./event-envelope.js"; +/** + * Minimal library-agnostic validator protocol. + * + * Any object exposing a `parse(value) => T` method that throws on invalid input + * satisfies this interface. Zod schemas satisfy it natively. TypeBox users can + * wrap a schema with a small adapter: + * + * const v: Validator = { parse: (x) => { if (!Check(schema, x)) throw new Error(...); return x as T; } }; + */ +export interface Validator { + parse(value: unknown): T; +} +/** + * Type helper: extract the parsed type of a Validator (akin to z.infer). + */ +export type Infer = V extends Validator ? T : never; export interface Composable { /** * Annotation for the initialize() method to tell the system to preload this composable function: @@ -25,6 +41,21 @@ export interface Composable { * @param evt is the incoming event containing headers and body (payload) */ handleEvent(evt: EventEnvelope): Promise; + /** + * Optional input schema. When set, the event body is validated BEFORE + * handleEvent() is invoked. Validation failure throws AppException(400). + * The parsed (and potentially coerced) value replaces evt.getBody(). + */ + inputSchema?: Validator; + /** + * Optional output schema. When set, the handler's resolved return value + * is validated AFTER handleEvent() completes. Validation failure is + * reported as AppException(500). Skipped for interceptors (their return + * value is not forwarded anyway). + * + * If the handler returns an EventEnvelope, the envelope's body is validated. + */ + outputSchema?: Validator; } /** * Annotation for a composable class diff --git a/dist/models/composable.js.map b/dist/models/composable.js.map index f0ab0b4..8208e4e 100644 --- a/dist/models/composable.js.map +++ b/dist/models/composable.js.map @@ -1 +1 @@ -{"version":3,"file":"composable.js","sourceRoot":"","sources":["../../src/models/composable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;AAgCjC;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,SAAS,GAAC,CAAC,EAAE,SAAS,GAAC,IAAI,EAAE,WAAW,GAAC,KAAK;IACnF,OAAO,UAAU,OAAO,EAAE,WAAmB,EAAE,UAA8B;QAC3E,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC;YAC9B,UAAU,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI;gBACpC,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,SAAS,uBAAuB,SAAS,iBAAiB,WAAW,EAAE,CAAC,CAAC;gBAC5G,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,KAAK,CAAC,wFAAwF,WAAW,EAAE,CAAC,CAAC;QACrH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"composable.js","sourceRoot":"","sources":["../../src/models/composable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;AAmEjC;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,SAAS,GAAC,CAAC,EAAE,SAAS,GAAC,IAAI,EAAE,WAAW,GAAC,KAAK;IACnF,OAAO,UAAU,OAAO,EAAE,WAAmB,EAAE,UAA8B;QAC3E,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC;YAC9B,UAAU,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI;gBACpC,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,SAAS,uBAAuB,SAAS,iBAAiB,WAAW,EAAE,CAAC,CAAC;gBAC5G,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,KAAK,CAAC,wFAAwF,WAAW,EAAE,CAAC,CAAC;QACrH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"} \ No newline at end of file diff --git a/dist/system/function-registry.js b/dist/system/function-registry.js index 74cb78b..e150ace 100644 --- a/dist/system/function-registry.js +++ b/dist/system/function-registry.js @@ -123,7 +123,19 @@ class SimpleRegistry { if (route && 'initialize' in that && 'handleEvent' in that && that['initialize'] instanceof Function && that['handleEvent'] instanceof Function) { this.registry.set(route, that); - this.metadata.set(route, { 'instances': instances, 'private': isPrivate, 'interceptor': interceptor }); + const meta = { + 'instances': instances, 'private': isPrivate, 'interceptor': interceptor + }; + // Capture optional input/output schemas from the Composable instance. + // Duck-typed: anything exposing a .parse(value) function qualifies. + const anyThat = that; + if (anyThat['inputSchema'] && typeof anyThat['inputSchema'].parse === 'function') { + meta['inputSchema'] = anyThat['inputSchema']; + } + if (anyThat['outputSchema'] && typeof anyThat['outputSchema'].parse === 'function') { + meta['outputSchema'] = anyThat['outputSchema']; + } + this.metadata.set(route, meta); } else { throw new Error('Invalid Composable class'); diff --git a/dist/system/function-registry.js.map b/dist/system/function-registry.js.map index 704641e..1bb96af 100644 --- a/dist/system/function-registry.js.map +++ b/dist/system/function-registry.js.map @@ -1 +1 @@ -{"version":3,"file":"function-registry.js","sourceRoot":"","sources":["../../src/system/function-registry.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"function-registry.js","sourceRoot":"","sources":["../../src/system/function-registry.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/system/platform.js b/dist/system/platform.js index 3089c12..8d5a4b0 100644 --- a/dist/system/platform.js +++ b/dist/system/platform.js @@ -285,9 +285,11 @@ class ServiceManager { route; isPrivate; interceptor; + inputSchema; + outputSchema; eventQueue = []; workers = []; - constructor(route, listener, instances = 1, isPrivate = false, interceptor = false) { + constructor(route, listener, instances = 1, isPrivate = false, interceptor = false, inputSchema, outputSchema) { const hasRoute = !!route; const hasListener = !!listener; if (!hasRoute) { @@ -302,6 +304,8 @@ class ServiceManager { this.route = route; this.isPrivate = isPrivate; this.interceptor = interceptor; + this.inputSchema = inputSchema; + this.outputSchema = outputSchema; const total = Math.max(1, instances); // // Worker event listeners @@ -327,11 +331,43 @@ class ServiceManager { if ('temporary.inbox' != route) { evt.clearAnnotations(); } + // Input schema validation (strict: AppException 400 on failure) + if (this.inputSchema) { + try { + const parsed = this.inputSchema.parse(evt.getBody()); + evt.setBody(parsed); + } + catch (err) { + const msg = err instanceof Error ? err.message : String(err); + this.handleError(workerRoute, utc, evt, new AppException(400, `Input validation failed for ${route}: ${msg}`)); + return; + } + } const result = listener(evt); // The listener must implement Composable interface. // Anything else will be ignored. if (Object(result).constructor == Promise) { - result.then(v => this.handleResult(workerRoute, utc, start, evt, v)) + result.then(v => { + // Output schema validation (strict: AppException 500 on failure). + // Interceptors are skipped because their return value is discarded. + if (this.outputSchema && !this.interceptor) { + try { + if (v instanceof EventEnvelope) { + const parsed = this.outputSchema.parse(v.getBody()); + v.setBody(parsed); + } + else { + v = this.outputSchema.parse(v); + } + } + catch (err) { + const msg = err instanceof Error ? err.message : String(err); + this.handleError(workerRoute, utc, evt, new AppException(500, `Output validation failed for ${route}: ${msg}`)); + return; + } + } + this.handleResult(workerRoute, utc, start, evt, v); + }) .catch(e => this.handleError(workerRoute, utc, evt, e)); } }); @@ -614,7 +650,10 @@ class EventSystem { registry.save(route, composable, instances, isPrivate, interceptor); composable.initialize(); } - const manager = new ServiceManager(route, composable.handleEvent, instances, isPrivate, interceptor); + const meta = registry.getMetadata(route); + const inputSchema = meta?.['inputSchema']; + const outputSchema = meta?.['outputSchema']; + const manager = new ServiceManager(route, composable.handleEvent, instances, isPrivate, interceptor, inputSchema, outputSchema); log.debug(`${manager.getRoute()} loaded`); registry.load(route); } diff --git a/dist/system/platform.js.map b/dist/system/platform.js.map index b3dd0e5..e15efc8 100644 --- a/dist/system/platform.js.map +++ b/dist/system/platform.js.map @@ -1 +1 @@ -{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/system/platform.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/system/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;AACjC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;AAChD,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;AAC3B,MAAM,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC;AAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;AACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC;AACvC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAClD,MAAM,GAAG,GAAG,KAAK,CAAC;AAClB,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AACtD,MAAM,2BAA2B,GAAG,6BAA6B,CAAC;AAClE,MAAM,QAAQ,GAAG,mCAAmC,CAAC;AACrD,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAC7C,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAChD,MAAM,cAAc,GAAG,yBAAyB,CAAC;AACjD,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AACrD,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAE3C,IAAI,SAAe,CAAC;AACpB,IAAI,OAAe,CAAC;AACpB,IAAI,IAAiB,CAAC;AAEtB,SAAS,SAAS,CAAC,KAAa,EAAE,QAAsC;IACpE,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAA,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,CAAA,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,GAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,YAAY,QAAQ,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,WAAW,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5B,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAC9B,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC;IACvC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB;IAC9B,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,CAAC,EAAE,CAAA;YAC/B,IAAI,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACzC,IAAI,IAAI,GAAG,aAAa,EAAE,CAAC;oBACvB,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC/B,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;YAAC,OAAM,CAAC,EAAE,CAAC;gBACR,GAAG,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,KAAK;IACV,GAAG,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,OAAO;IAClB,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,IAAI,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACtG,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,CAAC;gBACD,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;oBACrE,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBACnD,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;oBACpC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBACzC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;oBAC3C,MAAM,WAAW,GAAG,IAAI,aAAa,EAAE,CAAC;oBACxC,WAAW,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBACvE,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;oBACvE,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;oBAChC,MAAM,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxC,CAAC;qBAAM,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7B,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;oBAChC,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBACtF,CAAC;qBAAM,CAAC;oBACJ,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,iBAAiB,CAAC,CAAC;gBAClD,CAAC;YACT,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,GAAG,CAAC,KAAK,CAAC,oBAAoB,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,KAAK,UAAU,QAAQ;IACnB,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,IAAI,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;QACpG,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACzD,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACD,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;oBAC/B,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBACxF,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,GAAG,CAAC,KAAK,CAAC,yBAAyB,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,iBAAiB,CAAC,CAAC;YACjD,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,OAAO,QAAQ;IACT,MAAM,CAAC,SAAS,CAAW;IAEnC;QACI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1B,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW;QACd,QAAQ,CAAC,SAAS,KAAK,IAAI,QAAQ,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC,SAAS,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,WAAW;QACP,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,OAAO;QACH,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YACvC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,YAAY;QACR,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ;QACV,yCAAyC;QACzC,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAM,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpB,6CAA6C;YAC7C,yDAAyD;YACzD,4CAA4C;YAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;gBACnB,EAAE,GAAG,GAAG,CAAC;gBACT,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,KAAa,EAAE,UAAkB,EAAE,SAAS,GAAC,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,WAAW,GAAC,KAAK;QACxF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAa;QACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,UAAU;QACN,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACZ,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;CACJ;AAED,MAAM,cAAc;IACC,KAAK,CAAS;IACd,SAAS,CAAU;IACnB,WAAW,CAAU;IACrB,WAAW,CAAa;IACxB,YAAY,CAAa;IACzB,UAAU,GAAG,EAAE,CAAC;IAChB,OAAO,GAAG,EAAE,CAAC;IAE9B,YAAY,KAAa,EAAE,QAAgB,EAAE,SAAS,GAAC,CAAC,EAAE,SAAS,GAAC,KAAK,EAAE,WAAW,GAAC,KAAK,EAChF,WAAuB,EAAE,YAAwB;QACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC;QACzB,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,YAAY,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACrC,EAAE;QACF,yBAAyB;QACzB,GAAG;QACH,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,qEAAqE;YACrE,MAAM,WAAW,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/B,SAAS,CAAC,WAAW,EAAE,CAAC,GAAkB,EAAE,EAAE;gBAC1C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACjB,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;gBACzC,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC;oBAC3B,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;gBACnD,CAAC;gBACD,IAAI,GAAG,CAAC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC;oBAC7B,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;gBACvD,CAAC;gBACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAChC,mDAAmD;gBACnD,IAAI,iBAAiB,IAAI,KAAK,EAAE,CAAC;oBAC7B,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,CAAC;gBACD,gEAAgE;gBAChE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACnB,IAAI,CAAC;wBACD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;wBACrD,GAAG,CAAC,OAAO,CAAC,MAAkE,CAAC,CAAC;oBACpF,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACX,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC7D,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAClC,IAAI,YAAY,CAAC,GAAG,EAAE,+BAA+B,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;wBAC3E,OAAO;oBACX,CAAC;gBACL,CAAC;gBACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC7B,oDAAoD;gBACpD,iCAAiC;gBACjC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,IAAI,OAAO,EAAE,CAAC;oBACxC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;wBACZ,kEAAkE;wBAClE,oEAAoE;wBACpE,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;4BACzC,IAAI,CAAC;gCACD,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC;oCAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oCACpD,CAAC,CAAC,OAAO,CAAC,MAAkE,CAAC,CAAC;gCAClF,CAAC;qCAAM,CAAC;oCACJ,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gCACnC,CAAC;4BACL,CAAC;4BAAC,OAAO,GAAG,EAAE,CAAC;gCACX,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gCAC7D,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAClC,IAAI,YAAY,CAAC,GAAG,EAAE,gCAAgC,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;gCAC5E,OAAO;4BACX,CAAC;wBACL,CAAC;wBACD,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5D,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QACD,EAAE;QACF,sDAAsD;QACtD,EAAE;QACF,4FAA4F;QAC5F,EAAE;QACF,yCAAyC;QACzC,wFAAwF;QACxF,EAAE;QACF,SAAS,CAAC,KAAK,EAAE,CAAC,OAA+B,EAAE,EAAE;YACjD,IAAI,OAAO,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC7B,+CAA+C;gBAC/C,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAChC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBAC5D,IAAI,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC;wBACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;oBACvC,CAAC;oBACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBAC1C,IAAI,SAAS,EAAE,CAAC;wBACZ,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBACxC,YAAY,CAAC,GAAG,EAAE;4BACd,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;4BAC3C,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;wBACpC,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,YAAY,MAAM,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACpC,IAAI,MAAM,EAAE,CAAC;oBACT,YAAY,CAAC,GAAG,EAAE;wBACd,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAChC,CAAC,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAClC,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAA,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,KAAK,oBAAoB,KAAK,YAAY,CAAC,CAAC;QAC7E,CAAC;IACL,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,eAAe,CAAC,CAAS;QACrB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,WAAmB,EAAE,GAAW,EAAE,KAAa,EAAE,GAAkB,EAAE,QAAQ;QACtF,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;gBACxB,GAAG,CAAC,KAAK,CAAC,8CAA8C,OAAO,EAAE,CAAC,CAAC;YACvE,CAAC;iBAAM,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACtD,CAAC;QACL,CAAC;QACD,qCAAqC;QACrC,MAAM,iBAAiB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;YAC1E,MAAM,OAAO,GAAG,EAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE;gBACjF,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAC,CAAC;YACzF,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC;YACD,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;YACzC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC;YACzC,CAAC;YACD,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC;gBACzB,OAAO,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;gBAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;gBACpC,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC1C,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC,CAAC;YACzF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QACD,oBAAoB;QACpB,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IAED,WAAW,CAAC,WAAmB,EAAE,GAAW,EAAE,GAAkB,EAAE,CAAuB;QACrF,MAAM,SAAS,GAAG,CAAC,YAAY,YAAY,CAAA,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACjE,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;gBACxB,GAAG,CAAC,KAAK,CAAC,+CAA+C,OAAO,EAAE,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAChD,CAAC;QACL,CAAC;aAAM,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,KAAK,EAAE,aAAa,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,qCAAqC;QACrC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,EAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE;gBACjF,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK;gBACrD,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAC,CAAC;YAC7D,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC,CAAC;YACzF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QACD,oBAAoB;QACpB,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,GAAkB,EAAE,QAAQ,EAAE,IAAY;QAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,QAAQ,YAAY,aAAa,CAAA,CAAC,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACzB,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9B,IAAI,iBAAiB,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC9B,CAAC;QACD,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAEO,mBAAmB,CAAC,GAAkB,EAAE,GAAW,EAAE,IAAY;QACrE,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QACjC,6BAA6B;QAC7B,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,EAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE;gBACjF,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI;gBACxE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,iCAAiC,GAAC,OAAO,GAAC,YAAY,EAAC,CAAC;YACpG,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC,CAAC;YACzF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,IAAI,CAAC;QAChB,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACtD,GAAG,CAAC,KAAK,CAAC,gCAAgC,OAAO,oBAAoB,IAAI,QAAQ,IAAI,CAAC,KAAK,8BAA8B,IAAI,EAAE,CAAC,CAAC;YACjI,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,GAAkB,EAAE,CAAuB;QACzD,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACzB,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAEO,gBAAgB,CAAC,GAAkB,EAAE,GAAW,EAAE,CAAuB;QAC7E,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,CAAC,YAAY,YAAY,CAAA,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACjE,6BAA6B;QAC7B,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,EAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE;gBACjF,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK;gBAC1E,WAAW,EAAE,iCAAiC,GAAC,OAAO,GAAC,YAAY,EAAC,CAAC;YACrF,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC,CAAC;YACzF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,IAAI,CAAC;QAChB,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACtD,GAAG,CAAC,KAAK,CAAC,gCAAgC,OAAO,oBAAoB,IAAI,QAAQ,IAAI,CAAC,KAAK,qCAAqC,SAAS,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACrK,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;CACJ;AAED,MAAM,WAAW;IACL,MAAM,CAAC,QAAQ,CAAc;IAC7B,OAAO,GAAG,KAAK,CAAC;IAChB,QAAQ,GAAG,KAAK,CAAC;IAEzB;QACI,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACrC,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACtD,IAAI,OAAO,EAAE,CAAC;gBACV,2BAA2B;gBAC3B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;oBACvB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;wBAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;wBACZ,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;oBACrC,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACtB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;wBAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;wBACZ,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnC,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACL,CAAC;IAED,KAAK;QACD,YAAY,CAAC,GAAG,EAAE;YACd,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YACvC,uCAAuC;YACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;YAC5D,IAAI,QAAQ,EAAE,CAAC;gBACX,iBAAiB,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzF,CAAC;YACD,2CAA2C;YAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;YAC/D,IAAI,MAAM,EAAE,CAAC;gBACT,mBAAmB,CAAC,WAAW,EAAE,CAAC,sBAAsB,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,gBAAgB,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACjF,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,eAAe,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACjF,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAG,IAAI,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,cAAc,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/E,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;YACxD,GAAG,CAAC,IAAI,CAAC,2BAA2B,IAAI,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;IAED,WAAW;QACP,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,QAAQ,CAAC,KAAa,EAAE,UAAkB,EAAE,SAAS,GAAC,CAAC,EAAE,SAAS,GAAC,IAAI,EAAE,WAAW,GAAC,KAAK;QACtF,IAAI,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC;gBACvC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,YAAY,IAAI,UAAU,IAAI,aAAa,IAAI,UAAU;gBACzD,UAAU,CAAC,UAAU,YAAY,QAAQ,IAAI,UAAU,CAAC,WAAW,YAAY,QAAQ,EAAE,CAAC;gBAC1F,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;oBACpE,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC5B,CAAC;gBACD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAwC,CAAC;gBAChF,MAAM,WAAW,GAAG,IAAI,EAAE,CAAC,aAAa,CAA0B,CAAC;gBACnE,MAAM,YAAY,GAAG,IAAI,EAAE,CAAC,cAAc,CAA0B,CAAC;gBACrE,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAC/F,WAAW,EAAE,YAAY,CAAC,CAAC;gBAC/B,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAC1C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,iDAAiD,CAAC,CAAC;YAClG,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAChG,CAAC;IACL,CAAC;IAED,OAAO,CAAC,KAAa;QACjB,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;YACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YACxC,uDAAuD;YACvD,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,WAAW,CAAC,KAAK,GAAC,GAAG,GAAC,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAA,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,KAAK,GAAG,WAAW,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;IAED,SAAS,CAAC,KAAa;QACnB,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7C,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,MAAM,QAAQ,EAAE,CAAC;YACjB,IAAI,EAAE,CAAC,MAAM,CAAC,2BAA2B,CAAC,EAAE,CAAC;gBACzC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YACxG,CAAC;YACD,IAAI,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBACnC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAClG,CAAC;YACD,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;oBAClB,EAAE,GAAG,GAAG,CAAC;oBACT,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC5B,CAAC;gBACD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;IACL,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,OAAO,EAAE,CAAC;YAChB,KAAK,EAAE,CAAC;YACR,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAClD,MAAM,cAAc,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC;YAClD,CAAC;YACD,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,kCAAkC;gBAClC,IAAI,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;oBACnB,EAAE,GAAG,GAAG,CAAC;oBACT,mBAAmB,EAAE,CAAC;gBAC1B,CAAC;gBACD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACzB,CAAC;IACL,CAAC;CACJ"} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 963b11c..2e055e8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,7 +9,7 @@ export { MultiLevelMap } from './util/multi-level-map.js'; export { EventEnvelope } from './models/event-envelope.js'; export { AsyncHttpRequest } from './models/async-http-request.js'; export { AppException } from './models/app-exception.js'; -export { Composable, preload } from './models/composable.js'; +export { Composable, Validator, Infer, preload } from './models/composable.js'; export { ObjectStreamIO, ObjectStreamWriter, ObjectStreamReader } from './system/object-stream.js'; export { AppConfig, ConfigReader } from './util/config-reader.js'; export { TemplateLoader } from './util/template-loader.js'; diff --git a/src/models/composable.ts b/src/models/composable.ts index 5e42e7d..dec52a3 100644 --- a/src/models/composable.ts +++ b/src/models/composable.ts @@ -3,6 +3,24 @@ import { Logger } from "../util/logger.js"; const log = Logger.getInstance(); +/** + * Minimal library-agnostic validator protocol. + * + * Any object exposing a `parse(value) => T` method that throws on invalid input + * satisfies this interface. Zod schemas satisfy it natively. TypeBox users can + * wrap a schema with a small adapter: + * + * const v: Validator = { parse: (x) => { if (!Check(schema, x)) throw new Error(...); return x as T; } }; + */ +export interface Validator { + parse(value: unknown): T; +} + +/** + * Type helper: extract the parsed type of a Validator (akin to z.infer). + */ +export type Infer = V extends Validator ? T : never; + export interface Composable { /** @@ -31,6 +49,23 @@ export interface Composable { * @param evt is the incoming event containing headers and body (payload) */ handleEvent(evt: EventEnvelope): Promise; + + /** + * Optional input schema. When set, the event body is validated BEFORE + * handleEvent() is invoked. Validation failure throws AppException(400). + * The parsed (and potentially coerced) value replaces evt.getBody(). + */ + inputSchema?: Validator; + + /** + * Optional output schema. When set, the handler's resolved return value + * is validated AFTER handleEvent() completes. Validation failure is + * reported as AppException(500). Skipped for interceptors (their return + * value is not forwarded anyway). + * + * If the handler returns an EventEnvelope, the envelope's body is validated. + */ + outputSchema?: Validator; } /** diff --git a/src/system/function-registry.ts b/src/system/function-registry.ts index 51aed54..d73dd0e 100644 --- a/src/system/function-registry.ts +++ b/src/system/function-registry.ts @@ -141,7 +141,19 @@ class SimpleRegistry { if (route && 'initialize' in that && 'handleEvent' in that && that['initialize'] instanceof Function && that['handleEvent'] instanceof Function) { this.registry.set(route, that); - this.metadata.set(route, {'instances': instances, 'private': isPrivate, 'interceptor': interceptor}); + const meta: Record = { + 'instances': instances, 'private': isPrivate, 'interceptor': interceptor + }; + // Capture optional input/output schemas from the Composable instance. + // Duck-typed: anything exposing a .parse(value) function qualifies. + const anyThat = that as Record; + if (anyThat['inputSchema'] && typeof (anyThat['inputSchema'] as {parse?: unknown}).parse === 'function') { + meta['inputSchema'] = anyThat['inputSchema']; + } + if (anyThat['outputSchema'] && typeof (anyThat['outputSchema'] as {parse?: unknown}).parse === 'function') { + meta['outputSchema'] = anyThat['outputSchema']; + } + this.metadata.set(route, meta); } else { throw new Error('Invalid Composable class'); } diff --git a/src/system/platform.ts b/src/system/platform.ts index 9852e42..706018a 100644 --- a/src/system/platform.ts +++ b/src/system/platform.ts @@ -11,6 +11,7 @@ import { EventApiService } from '../services/event-api.js'; import { TemporaryInbox } from '../services/temporary-inbox.js'; import { EventEnvelope } from '../models/event-envelope.js'; import { AppException } from '../models/app-exception.js'; +import { Validator } from '../models/composable.js'; import { AppConfig, ConfigReader } from '../util/config-reader.js'; import { ContentTypeResolver } from '../util/content-type-resolver.js'; import { EventHttpResolver } from '../util/event-http-resolver.js'; @@ -301,10 +302,13 @@ class ServiceManager { private readonly route: string; private readonly isPrivate: boolean; private readonly interceptor: boolean; + private readonly inputSchema?: Validator; + private readonly outputSchema?: Validator; private readonly eventQueue = []; private readonly workers = []; - constructor(route: string, listener: object, instances=1, isPrivate=false, interceptor=false) { + constructor(route: string, listener: object, instances=1, isPrivate=false, interceptor=false, + inputSchema?: Validator, outputSchema?: Validator) { const hasRoute = !!route; const hasListener = !!listener; if (!hasRoute) { @@ -319,6 +323,8 @@ class ServiceManager { this.route = route; this.isPrivate = isPrivate; this.interceptor = interceptor; + this.inputSchema = inputSchema; + this.outputSchema = outputSchema; const total = Math.max(1, instances); // // Worker event listeners @@ -344,12 +350,43 @@ class ServiceManager { if ('temporary.inbox' != route) { evt.clearAnnotations(); } + // Input schema validation (strict: AppException 400 on failure) + if (this.inputSchema) { + try { + const parsed = this.inputSchema.parse(evt.getBody()); + evt.setBody(parsed as string | number | object | boolean | Buffer | Uint8Array); + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + this.handleError(workerRoute, utc, evt, + new AppException(400, `Input validation failed for ${route}: ${msg}`)); + return; + } + } const result = listener(evt); // The listener must implement Composable interface. // Anything else will be ignored. - if (Object(result).constructor == Promise) { - result.then(v => this.handleResult(workerRoute, utc, start, evt, v)) - .catch(e => this.handleError(workerRoute, utc, evt, e)); + if (Object(result).constructor == Promise) { + result.then(v => { + // Output schema validation (strict: AppException 500 on failure). + // Interceptors are skipped because their return value is discarded. + if (this.outputSchema && !this.interceptor) { + try { + if (v instanceof EventEnvelope) { + const parsed = this.outputSchema.parse(v.getBody()); + v.setBody(parsed as string | number | object | boolean | Buffer | Uint8Array); + } else { + v = this.outputSchema.parse(v); + } + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + this.handleError(workerRoute, utc, evt, + new AppException(500, `Output validation failed for ${route}: ${msg}`)); + return; + } + } + this.handleResult(workerRoute, utc, start, evt, v); + }) + .catch(e => this.handleError(workerRoute, utc, evt, e)); } }); } @@ -632,7 +669,11 @@ class EventSystem { registry.save(route, composable, instances, isPrivate, interceptor); composable.initialize(); } - const manager = new ServiceManager(route, composable.handleEvent, instances, isPrivate, interceptor); + const meta = registry.getMetadata(route) as Record | undefined; + const inputSchema = meta?.['inputSchema'] as Validator | undefined; + const outputSchema = meta?.['outputSchema'] as Validator | undefined; + const manager = new ServiceManager(route, composable.handleEvent, instances, isPrivate, interceptor, + inputSchema, outputSchema); log.debug(`${manager.getRoute()} loaded`); registry.load(route); } else { diff --git a/tests/po.test.ts b/tests/po.test.ts index 150dcc3..82fde8b 100644 --- a/tests/po.test.ts +++ b/tests/po.test.ts @@ -1,5 +1,5 @@ import { Logger } from '../src/util/logger'; -import { Composable } from '../src/models/composable'; +import { Composable, Validator } from '../src/models/composable'; import { FunctionRegistry } from '../src/system/function-registry'; import { PostOffice, Sender } from '../src/system/post-office'; import { Platform } from '../src/system/platform'; @@ -26,6 +26,7 @@ const HELLO_DOWNLOAD = 'hello.download'; const HELLO_CUSTOM_CONTENT_TYPE = "hello.custom.content.type"; const DEMO_HEALTH_SERVICE = 'demo.health'; const HELLO_INTERCEPTOR_SERVICE = 'hello.interceptor'; +const SCHEMA_VALIDATED_SERVICE = 'schema.validated.service'; const DEMO_LIBRARY_FUNCTION = "demo.library.function"; const DISTRIBUTED_TRACE_FORWARDER = 'distributed.trace.forwarder'; const UNIT_TEST = 'unit.test'; @@ -106,6 +107,49 @@ class DemoHealth implements Composable { } } +// Minimal hand-rolled validators (avoids adding zod as a test dependency). +// Any object with a .parse(value) that throws on invalid input satisfies Validator. +interface SchemaInput { id: string; amount: number; } +interface SchemaOutput { ok: boolean; doubled: number; } + +const schemaInputValidator: Validator = { + parse(value: unknown): SchemaInput { + if (!value || typeof value !== 'object') { + throw new Error('expected object'); + } + const v = value as Record; + if (typeof v.id !== 'string') throw new Error('id must be string'); + if (typeof v.amount !== 'number') throw new Error('amount must be number'); + return { id: v.id, amount: v.amount }; + } +}; + +const schemaOutputValidator: Validator = { + parse(value: unknown): SchemaOutput { + if (!value || typeof value !== 'object') { + throw new Error('expected object'); + } + const v = value as Record; + if (typeof v.ok !== 'boolean') throw new Error('ok must be boolean'); + if (typeof v.doubled !== 'number') throw new Error('doubled must be number'); + return { ok: v.ok, doubled: v.doubled }; + } +}; + +class SchemaValidatedService implements Composable { + inputSchema = schemaInputValidator; + outputSchema = schemaOutputValidator; + initialize(): Composable { return this; } + async handleEvent(evt: EventEnvelope) { + const body = evt.getBody() as SchemaInput; + // Header flag to intentionally return a bad shape for output-validation test + if (evt.getHeader('bad_output') === 'true') { + return { not: 'a valid output' }; + } + return { ok: true, doubled: body.amount * 2 }; + } +} + class DemoInterceptor implements Composable { initialize(): Composable { return this; @@ -248,6 +292,7 @@ describe('post office use cases', () => { platform.register(DEMO_HEALTH_SERVICE, new DemoHealth()); // register the demo interceptor function platform.register(HELLO_INTERCEPTOR_SERVICE, new DemoInterceptor(), 1, true, true); + platform.register(SCHEMA_VALIDATED_SERVICE, new SchemaValidatedService()); appConfig.set('health.dependencies', 'demo.health'); // this tests that we can create a user defined config reader that resolves references from the base configuration const configMap = {'event.api.url': 'http://127.0.0.1:${server.port:8080}/api/event', 'base.url': 'http://127.0.0.1:${server.port:8080}'} @@ -1207,7 +1252,51 @@ describe('post office use cases', () => { log.info({'test3': 'restore logging in TEXT format'}); const success4 = log.setLogFormat('unknown'); expect(success4).toBe(false); - log.setLevel('info'); + log.setLevel('info'); + }); + + it('validates schema input and transforms body through parse()', async () => { + const po = new PostOffice(new Sender('unit.test', '900', 'TEST /schema/ok')); + const req = new EventEnvelope().setTo(SCHEMA_VALIDATED_SERVICE) + .setBody({ id: 'abc', amount: 21, extra: 'stripped' }); + const result = await po.request(req, 3000); + const body = result.getBody() as { ok: boolean; doubled: number }; + expect(body.ok).toBe(true); + expect(body.doubled).toBe(42); + // parse() strips unknown fields in our test validator + expect(result.getStatus()).toBe(200); + }); + + it('rejects invalid input with AppException 400', async () => { + const po = new PostOffice(new Sender('unit.test', '901', 'TEST /schema/bad-input')); + const req = new EventEnvelope().setTo(SCHEMA_VALIDATED_SERVICE) + .setBody({ id: 'abc', amount: 'not-a-number' }); + try { + await po.request(req, 3000); + throw new Error('expected input validation to reject'); + } catch (e) { + expect(e).toBeInstanceOf(AppException); + const ex = e as AppException; + expect(ex.getStatus()).toBe(400); + expect(ex.message).toContain('Input validation failed'); + expect(ex.message).toContain('amount must be number'); + } + }); + + it('rejects invalid output with AppException 500', async () => { + const po = new PostOffice(new Sender('unit.test', '902', 'TEST /schema/bad-output')); + const req = new EventEnvelope().setTo(SCHEMA_VALIDATED_SERVICE) + .setHeader('bad_output', 'true') + .setBody({ id: 'abc', amount: 1 }); + try { + await po.request(req, 3000); + throw new Error('expected output validation to reject'); + } catch (e) { + expect(e).toBeInstanceOf(AppException); + const ex = e as AppException; + expect(ex.getStatus()).toBe(500); + expect(ex.message).toContain('Output validation failed'); + } }); });