@kubb/plugin-oas 4.18.5 → 4.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{SchemaGenerator-DExEah4y.js → SchemaGenerator-D8GP-AGi.js} +45 -17
  2. package/dist/SchemaGenerator-D8GP-AGi.js.map +1 -0
  3. package/dist/{SchemaGenerator-B18-jWu7.cjs → SchemaGenerator-DO3rrt_U.cjs} +46 -18
  4. package/dist/SchemaGenerator-DO3rrt_U.cjs.map +1 -0
  5. package/dist/{SchemaMapper-oZdVAbXF.d.ts → SchemaMapper-DI2vHHE0.d.ts} +24 -7
  6. package/dist/{SchemaMapper-BWZ2ZjPQ.d.cts → SchemaMapper-DmB5NyNo.d.cts} +24 -7
  7. package/dist/{createGenerator-RL6jHKJ-.d.cts → createGenerator-BF26dp_h.d.cts} +26 -2
  8. package/dist/{createGenerator-Bq76G0TY.d.ts → createGenerator-DhGg_jH6.d.ts} +26 -2
  9. package/dist/generators.d.cts +2 -2
  10. package/dist/generators.d.ts +2 -2
  11. package/dist/getSchemaFactory-CBp1me72.cjs +29 -0
  12. package/dist/getSchemaFactory-CBp1me72.cjs.map +1 -0
  13. package/dist/getSchemaFactory-DsoVRgxV.js +24 -0
  14. package/dist/getSchemaFactory-DsoVRgxV.js.map +1 -0
  15. package/dist/hooks.cjs +1 -1
  16. package/dist/hooks.d.cts +2 -2
  17. package/dist/hooks.d.ts +2 -2
  18. package/dist/hooks.js +1 -1
  19. package/dist/index.cjs +4 -3
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +2 -2
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.js +4 -3
  24. package/dist/index.js.map +1 -1
  25. package/dist/mocks.d.cts +1 -1
  26. package/dist/mocks.d.ts +1 -1
  27. package/dist/utils.cjs +26 -3
  28. package/dist/utils.cjs.map +1 -1
  29. package/dist/utils.d.cts +25 -5
  30. package/dist/utils.d.ts +25 -5
  31. package/dist/utils.js +24 -1
  32. package/dist/utils.js.map +1 -1
  33. package/package.json +3 -3
  34. package/src/SchemaGenerator.ts +53 -14
  35. package/src/plugin.ts +2 -0
  36. package/src/types.ts +24 -0
  37. package/src/utils/getSchemas.ts +27 -105
  38. package/dist/SchemaGenerator-B18-jWu7.cjs.map +0 -1
  39. package/dist/SchemaGenerator-DExEah4y.js.map +0 -1
  40. package/dist/getSchemas-BUXPwm-5.js +0 -101
  41. package/dist/getSchemas-BUXPwm-5.js.map +0 -1
  42. package/dist/getSchemas-D3YweIFO.cjs +0 -112
  43. package/dist/getSchemas-D3YweIFO.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"getSchemas-BUXPwm-5.js","names":[],"sources":["../src/utils/getSchemaFactory.ts","../src/utils/getSchemas.ts"],"sourcesContent":["import type { Oas, OpenAPIV3, OpenAPIV3_1, SchemaObject } from '@kubb/oas'\nimport { isOpenApiV3_1Document } from '@kubb/oas'\n\n/**\n * Make it possible to narrow down the schema based on a specific version(3 or 3.1)\n */\ntype SchemaResult<TWithRef extends boolean = false> =\n | {\n schemaObject:\n | ((TWithRef extends true ? OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject : OpenAPIV3.SchemaObject) & {\n nullable?: boolean\n 'x-nullable'?: boolean\n })\n | null\n version: '3.0'\n }\n | {\n schemaObject:\n | ((TWithRef extends true ? OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject : OpenAPIV3_1.SchemaObject) & {\n nullable?: boolean\n 'x-nullable'?: boolean\n })\n | null\n version: '3.1'\n }\n\n/**\n * Creates a factory function that generates a versioned OpenAPI schema result.\n *\n * The returned function accepts an optional schema object and produces a {@link SchemaResult} containing the dereferenced schema and the OpenAPI version ('3.0' or '3.1').\n *\n * @returns A function that takes an optional schema and returns a versioned schema result.\n */\nexport function getSchemaFactory<TWithRef extends boolean = false>(oas: Oas): (schema: SchemaObject | null) => SchemaResult<TWithRef> {\n return (schema: SchemaObject | null) => {\n const version = isOpenApiV3_1Document(oas.api) ? '3.1' : '3.0'\n\n return {\n schemaObject: oas.dereferenceWithRef(schema),\n version,\n } as SchemaResult<TWithRef>\n }\n}\n","import type { contentType, Oas, OasTypes } from '@kubb/oas'\n\ntype Mode = 'schemas' | 'responses' | 'requestBodies'\n\ntype GetSchemasProps = {\n oas: Oas\n contentType?: contentType\n includes?: Mode[]\n}\n\n/**\n * Collect all schema $ref dependencies recursively.\n */\nfunction collectRefs(schema: unknown, refs = new Set<string>()): Set<string> {\n if (Array.isArray(schema)) {\n for (const item of schema) {\n collectRefs(item, refs)\n }\n return refs\n }\n\n if (schema && typeof schema === 'object') {\n for (const [key, value] of Object.entries(schema)) {\n if (key === '$ref' && typeof value === 'string') {\n const match = value.match(/^#\\/components\\/schemas\\/(.+)$/)\n if (match) {\n refs.add(match[1]!)\n }\n } else {\n collectRefs(value, refs)\n }\n }\n }\n\n return refs\n}\n\n/**\n * Sort schemas topologically so referenced schemas appear first.\n */\nfunction sortSchemas(schemas: Record<string, OasTypes.SchemaObject>): Record<string, OasTypes.SchemaObject> {\n const deps = new Map<string, string[]>()\n\n for (const [name, schema] of Object.entries(schemas)) {\n deps.set(name, Array.from(collectRefs(schema)))\n }\n\n const sorted: string[] = []\n const visited = new Set<string>()\n\n function visit(name: string, stack = new Set<string>()) {\n if (visited.has(name)) {\n return\n }\n if (stack.has(name)) {\n return\n } // circular refs, ignore\n stack.add(name)\n const children = deps.get(name) || []\n for (const child of children) {\n if (deps.has(child)) {\n visit(child, stack)\n }\n }\n stack.delete(name)\n visited.add(name)\n sorted.push(name)\n }\n\n for (const name of Object.keys(schemas)) {\n visit(name)\n }\n\n const sortedSchemas: Record<string, OasTypes.SchemaObject> = {}\n for (const name of sorted) {\n sortedSchemas[name] = schemas[name]!\n }\n return sortedSchemas\n}\n\n/**\n * Collect schemas from OpenAPI components (schemas, responses, requestBodies)\n * and return them in dependency order.\n */\nexport function getSchemas({ oas, contentType, includes = ['schemas', 'requestBodies', 'responses'] }: GetSchemasProps): Record<string, OasTypes.SchemaObject> {\n const components = oas.getDefinition().components\n let schemas: Record<string, OasTypes.SchemaObject> = {}\n\n if (includes.includes('schemas')) {\n schemas = {\n ...schemas,\n ...((components?.schemas as Record<string, OasTypes.SchemaObject>) || {}),\n }\n }\n\n if (includes.includes('responses')) {\n const responses = components?.responses || {}\n for (const [name, response] of Object.entries(responses)) {\n const responseObject = response as OasTypes.ResponseObject\n if (responseObject.content && !schemas[name]) {\n const firstContentType = Object.keys(responseObject.content)[0] || 'application/json'\n schemas[name] = responseObject.content?.[contentType || firstContentType]?.schema as OasTypes.SchemaObject\n }\n }\n }\n\n if (includes.includes('requestBodies')) {\n const requestBodies = components?.requestBodies || {}\n for (const [name, request] of Object.entries(requestBodies)) {\n const requestObject = request as OasTypes.RequestBodyObject\n if (requestObject.content && !schemas[name]) {\n const firstContentType = Object.keys(requestObject.content)[0] || 'application/json'\n schemas[name] = requestObject.content?.[contentType || firstContentType]?.schema as OasTypes.SchemaObject\n }\n }\n }\n\n return sortSchemas(schemas)\n}\n"],"mappings":";;;;;;;;;;;AAiCA,SAAgB,iBAAmD,KAAmE;AACpI,SAAQ,WAAgC;EACtC,MAAM,UAAU,sBAAsB,IAAI,IAAI,GAAG,QAAQ;AAEzD,SAAO;GACL,cAAc,IAAI,mBAAmB,OAAO;GAC5C;GACD;;;;;;;;;AC3BL,SAAS,YAAY,QAAiB,uBAAO,IAAI,KAAa,EAAe;AAC3E,KAAI,MAAM,QAAQ,OAAO,EAAE;AACzB,OAAK,MAAM,QAAQ,OACjB,aAAY,MAAM,KAAK;AAEzB,SAAO;;AAGT,KAAI,UAAU,OAAO,WAAW,SAC9B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC/C,KAAI,QAAQ,UAAU,OAAO,UAAU,UAAU;EAC/C,MAAM,QAAQ,MAAM,MAAM,iCAAiC;AAC3D,MAAI,MACF,MAAK,IAAI,MAAM,GAAI;OAGrB,aAAY,OAAO,KAAK;AAK9B,QAAO;;;;;AAMT,SAAS,YAAY,SAAuF;CAC1G,MAAM,uBAAO,IAAI,KAAuB;AAExC,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,CAClD,MAAK,IAAI,MAAM,MAAM,KAAK,YAAY,OAAO,CAAC,CAAC;CAGjD,MAAM,SAAmB,EAAE;CAC3B,MAAM,0BAAU,IAAI,KAAa;CAEjC,SAAS,MAAM,MAAc,wBAAQ,IAAI,KAAa,EAAE;AACtD,MAAI,QAAQ,IAAI,KAAK,CACnB;AAEF,MAAI,MAAM,IAAI,KAAK,CACjB;AAEF,QAAM,IAAI,KAAK;EACf,MAAM,WAAW,KAAK,IAAI,KAAK,IAAI,EAAE;AACrC,OAAK,MAAM,SAAS,SAClB,KAAI,KAAK,IAAI,MAAM,CACjB,OAAM,OAAO,MAAM;AAGvB,QAAM,OAAO,KAAK;AAClB,UAAQ,IAAI,KAAK;AACjB,SAAO,KAAK,KAAK;;AAGnB,MAAK,MAAM,QAAQ,OAAO,KAAK,QAAQ,CACrC,OAAM,KAAK;CAGb,MAAM,gBAAuD,EAAE;AAC/D,MAAK,MAAM,QAAQ,OACjB,eAAc,QAAQ,QAAQ;AAEhC,QAAO;;;;;;AAOT,SAAgB,WAAW,EAAE,KAAK,aAAa,WAAW;CAAC;CAAW;CAAiB;CAAY,IAA4D;CAC7J,MAAM,aAAa,IAAI,eAAe,CAAC;CACvC,IAAI,UAAiD,EAAE;AAEvD,KAAI,SAAS,SAAS,UAAU,CAC9B,WAAU;EACR,GAAG;EACH,GAAK,YAAY,WAAqD,EAAE;EACzE;AAGH,KAAI,SAAS,SAAS,YAAY,EAAE;EAClC,MAAM,YAAY,YAAY,aAAa,EAAE;AAC7C,OAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,UAAU,EAAE;GACxD,MAAM,iBAAiB;AACvB,OAAI,eAAe,WAAW,CAAC,QAAQ,OAAO;IAC5C,MAAM,mBAAmB,OAAO,KAAK,eAAe,QAAQ,CAAC,MAAM;AACnE,YAAQ,QAAQ,eAAe,UAAU,eAAe,mBAAmB;;;;AAKjF,KAAI,SAAS,SAAS,gBAAgB,EAAE;EACtC,MAAM,gBAAgB,YAAY,iBAAiB,EAAE;AACrD,OAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,cAAc,EAAE;GAC3D,MAAM,gBAAgB;AACtB,OAAI,cAAc,WAAW,CAAC,QAAQ,OAAO;IAC3C,MAAM,mBAAmB,OAAO,KAAK,cAAc,QAAQ,CAAC,MAAM;AAClE,YAAQ,QAAQ,cAAc,UAAU,eAAe,mBAAmB;;;;AAKhF,QAAO,YAAY,QAAQ"}
@@ -1,112 +0,0 @@
1
- const require_chunk = require('./chunk-C1_xRkKa.cjs');
2
- let _kubb_oas = require("@kubb/oas");
3
-
4
- //#region src/utils/getSchemaFactory.ts
5
- /**
6
- * Creates a factory function that generates a versioned OpenAPI schema result.
7
- *
8
- * The returned function accepts an optional schema object and produces a {@link SchemaResult} containing the dereferenced schema and the OpenAPI version ('3.0' or '3.1').
9
- *
10
- * @returns A function that takes an optional schema and returns a versioned schema result.
11
- */
12
- function getSchemaFactory(oas) {
13
- return (schema) => {
14
- const version = (0, _kubb_oas.isOpenApiV3_1Document)(oas.api) ? "3.1" : "3.0";
15
- return {
16
- schemaObject: oas.dereferenceWithRef(schema),
17
- version
18
- };
19
- };
20
- }
21
-
22
- //#endregion
23
- //#region src/utils/getSchemas.ts
24
- /**
25
- * Collect all schema $ref dependencies recursively.
26
- */
27
- function collectRefs(schema, refs = /* @__PURE__ */ new Set()) {
28
- if (Array.isArray(schema)) {
29
- for (const item of schema) collectRefs(item, refs);
30
- return refs;
31
- }
32
- if (schema && typeof schema === "object") for (const [key, value] of Object.entries(schema)) if (key === "$ref" && typeof value === "string") {
33
- const match = value.match(/^#\/components\/schemas\/(.+)$/);
34
- if (match) refs.add(match[1]);
35
- } else collectRefs(value, refs);
36
- return refs;
37
- }
38
- /**
39
- * Sort schemas topologically so referenced schemas appear first.
40
- */
41
- function sortSchemas(schemas) {
42
- const deps = /* @__PURE__ */ new Map();
43
- for (const [name, schema] of Object.entries(schemas)) deps.set(name, Array.from(collectRefs(schema)));
44
- const sorted = [];
45
- const visited = /* @__PURE__ */ new Set();
46
- function visit(name, stack = /* @__PURE__ */ new Set()) {
47
- if (visited.has(name)) return;
48
- if (stack.has(name)) return;
49
- stack.add(name);
50
- const children = deps.get(name) || [];
51
- for (const child of children) if (deps.has(child)) visit(child, stack);
52
- stack.delete(name);
53
- visited.add(name);
54
- sorted.push(name);
55
- }
56
- for (const name of Object.keys(schemas)) visit(name);
57
- const sortedSchemas = {};
58
- for (const name of sorted) sortedSchemas[name] = schemas[name];
59
- return sortedSchemas;
60
- }
61
- /**
62
- * Collect schemas from OpenAPI components (schemas, responses, requestBodies)
63
- * and return them in dependency order.
64
- */
65
- function getSchemas({ oas, contentType, includes = [
66
- "schemas",
67
- "requestBodies",
68
- "responses"
69
- ] }) {
70
- const components = oas.getDefinition().components;
71
- let schemas = {};
72
- if (includes.includes("schemas")) schemas = {
73
- ...schemas,
74
- ...components?.schemas || {}
75
- };
76
- if (includes.includes("responses")) {
77
- const responses = components?.responses || {};
78
- for (const [name, response] of Object.entries(responses)) {
79
- const responseObject = response;
80
- if (responseObject.content && !schemas[name]) {
81
- const firstContentType = Object.keys(responseObject.content)[0] || "application/json";
82
- schemas[name] = responseObject.content?.[contentType || firstContentType]?.schema;
83
- }
84
- }
85
- }
86
- if (includes.includes("requestBodies")) {
87
- const requestBodies = components?.requestBodies || {};
88
- for (const [name, request] of Object.entries(requestBodies)) {
89
- const requestObject = request;
90
- if (requestObject.content && !schemas[name]) {
91
- const firstContentType = Object.keys(requestObject.content)[0] || "application/json";
92
- schemas[name] = requestObject.content?.[contentType || firstContentType]?.schema;
93
- }
94
- }
95
- }
96
- return sortSchemas(schemas);
97
- }
98
-
99
- //#endregion
100
- Object.defineProperty(exports, 'getSchemaFactory', {
101
- enumerable: true,
102
- get: function () {
103
- return getSchemaFactory;
104
- }
105
- });
106
- Object.defineProperty(exports, 'getSchemas', {
107
- enumerable: true,
108
- get: function () {
109
- return getSchemas;
110
- }
111
- });
112
- //# sourceMappingURL=getSchemas-D3YweIFO.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getSchemas-D3YweIFO.cjs","names":[],"sources":["../src/utils/getSchemaFactory.ts","../src/utils/getSchemas.ts"],"sourcesContent":["import type { Oas, OpenAPIV3, OpenAPIV3_1, SchemaObject } from '@kubb/oas'\nimport { isOpenApiV3_1Document } from '@kubb/oas'\n\n/**\n * Make it possible to narrow down the schema based on a specific version(3 or 3.1)\n */\ntype SchemaResult<TWithRef extends boolean = false> =\n | {\n schemaObject:\n | ((TWithRef extends true ? OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject : OpenAPIV3.SchemaObject) & {\n nullable?: boolean\n 'x-nullable'?: boolean\n })\n | null\n version: '3.0'\n }\n | {\n schemaObject:\n | ((TWithRef extends true ? OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject : OpenAPIV3_1.SchemaObject) & {\n nullable?: boolean\n 'x-nullable'?: boolean\n })\n | null\n version: '3.1'\n }\n\n/**\n * Creates a factory function that generates a versioned OpenAPI schema result.\n *\n * The returned function accepts an optional schema object and produces a {@link SchemaResult} containing the dereferenced schema and the OpenAPI version ('3.0' or '3.1').\n *\n * @returns A function that takes an optional schema and returns a versioned schema result.\n */\nexport function getSchemaFactory<TWithRef extends boolean = false>(oas: Oas): (schema: SchemaObject | null) => SchemaResult<TWithRef> {\n return (schema: SchemaObject | null) => {\n const version = isOpenApiV3_1Document(oas.api) ? '3.1' : '3.0'\n\n return {\n schemaObject: oas.dereferenceWithRef(schema),\n version,\n } as SchemaResult<TWithRef>\n }\n}\n","import type { contentType, Oas, OasTypes } from '@kubb/oas'\n\ntype Mode = 'schemas' | 'responses' | 'requestBodies'\n\ntype GetSchemasProps = {\n oas: Oas\n contentType?: contentType\n includes?: Mode[]\n}\n\n/**\n * Collect all schema $ref dependencies recursively.\n */\nfunction collectRefs(schema: unknown, refs = new Set<string>()): Set<string> {\n if (Array.isArray(schema)) {\n for (const item of schema) {\n collectRefs(item, refs)\n }\n return refs\n }\n\n if (schema && typeof schema === 'object') {\n for (const [key, value] of Object.entries(schema)) {\n if (key === '$ref' && typeof value === 'string') {\n const match = value.match(/^#\\/components\\/schemas\\/(.+)$/)\n if (match) {\n refs.add(match[1]!)\n }\n } else {\n collectRefs(value, refs)\n }\n }\n }\n\n return refs\n}\n\n/**\n * Sort schemas topologically so referenced schemas appear first.\n */\nfunction sortSchemas(schemas: Record<string, OasTypes.SchemaObject>): Record<string, OasTypes.SchemaObject> {\n const deps = new Map<string, string[]>()\n\n for (const [name, schema] of Object.entries(schemas)) {\n deps.set(name, Array.from(collectRefs(schema)))\n }\n\n const sorted: string[] = []\n const visited = new Set<string>()\n\n function visit(name: string, stack = new Set<string>()) {\n if (visited.has(name)) {\n return\n }\n if (stack.has(name)) {\n return\n } // circular refs, ignore\n stack.add(name)\n const children = deps.get(name) || []\n for (const child of children) {\n if (deps.has(child)) {\n visit(child, stack)\n }\n }\n stack.delete(name)\n visited.add(name)\n sorted.push(name)\n }\n\n for (const name of Object.keys(schemas)) {\n visit(name)\n }\n\n const sortedSchemas: Record<string, OasTypes.SchemaObject> = {}\n for (const name of sorted) {\n sortedSchemas[name] = schemas[name]!\n }\n return sortedSchemas\n}\n\n/**\n * Collect schemas from OpenAPI components (schemas, responses, requestBodies)\n * and return them in dependency order.\n */\nexport function getSchemas({ oas, contentType, includes = ['schemas', 'requestBodies', 'responses'] }: GetSchemasProps): Record<string, OasTypes.SchemaObject> {\n const components = oas.getDefinition().components\n let schemas: Record<string, OasTypes.SchemaObject> = {}\n\n if (includes.includes('schemas')) {\n schemas = {\n ...schemas,\n ...((components?.schemas as Record<string, OasTypes.SchemaObject>) || {}),\n }\n }\n\n if (includes.includes('responses')) {\n const responses = components?.responses || {}\n for (const [name, response] of Object.entries(responses)) {\n const responseObject = response as OasTypes.ResponseObject\n if (responseObject.content && !schemas[name]) {\n const firstContentType = Object.keys(responseObject.content)[0] || 'application/json'\n schemas[name] = responseObject.content?.[contentType || firstContentType]?.schema as OasTypes.SchemaObject\n }\n }\n }\n\n if (includes.includes('requestBodies')) {\n const requestBodies = components?.requestBodies || {}\n for (const [name, request] of Object.entries(requestBodies)) {\n const requestObject = request as OasTypes.RequestBodyObject\n if (requestObject.content && !schemas[name]) {\n const firstContentType = Object.keys(requestObject.content)[0] || 'application/json'\n schemas[name] = requestObject.content?.[contentType || firstContentType]?.schema as OasTypes.SchemaObject\n }\n }\n }\n\n return sortSchemas(schemas)\n}\n"],"mappings":";;;;;;;;;;;AAiCA,SAAgB,iBAAmD,KAAmE;AACpI,SAAQ,WAAgC;EACtC,MAAM,+CAAgC,IAAI,IAAI,GAAG,QAAQ;AAEzD,SAAO;GACL,cAAc,IAAI,mBAAmB,OAAO;GAC5C;GACD;;;;;;;;;AC3BL,SAAS,YAAY,QAAiB,uBAAO,IAAI,KAAa,EAAe;AAC3E,KAAI,MAAM,QAAQ,OAAO,EAAE;AACzB,OAAK,MAAM,QAAQ,OACjB,aAAY,MAAM,KAAK;AAEzB,SAAO;;AAGT,KAAI,UAAU,OAAO,WAAW,SAC9B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC/C,KAAI,QAAQ,UAAU,OAAO,UAAU,UAAU;EAC/C,MAAM,QAAQ,MAAM,MAAM,iCAAiC;AAC3D,MAAI,MACF,MAAK,IAAI,MAAM,GAAI;OAGrB,aAAY,OAAO,KAAK;AAK9B,QAAO;;;;;AAMT,SAAS,YAAY,SAAuF;CAC1G,MAAM,uBAAO,IAAI,KAAuB;AAExC,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,CAClD,MAAK,IAAI,MAAM,MAAM,KAAK,YAAY,OAAO,CAAC,CAAC;CAGjD,MAAM,SAAmB,EAAE;CAC3B,MAAM,0BAAU,IAAI,KAAa;CAEjC,SAAS,MAAM,MAAc,wBAAQ,IAAI,KAAa,EAAE;AACtD,MAAI,QAAQ,IAAI,KAAK,CACnB;AAEF,MAAI,MAAM,IAAI,KAAK,CACjB;AAEF,QAAM,IAAI,KAAK;EACf,MAAM,WAAW,KAAK,IAAI,KAAK,IAAI,EAAE;AACrC,OAAK,MAAM,SAAS,SAClB,KAAI,KAAK,IAAI,MAAM,CACjB,OAAM,OAAO,MAAM;AAGvB,QAAM,OAAO,KAAK;AAClB,UAAQ,IAAI,KAAK;AACjB,SAAO,KAAK,KAAK;;AAGnB,MAAK,MAAM,QAAQ,OAAO,KAAK,QAAQ,CACrC,OAAM,KAAK;CAGb,MAAM,gBAAuD,EAAE;AAC/D,MAAK,MAAM,QAAQ,OACjB,eAAc,QAAQ,QAAQ;AAEhC,QAAO;;;;;;AAOT,SAAgB,WAAW,EAAE,KAAK,aAAa,WAAW;CAAC;CAAW;CAAiB;CAAY,IAA4D;CAC7J,MAAM,aAAa,IAAI,eAAe,CAAC;CACvC,IAAI,UAAiD,EAAE;AAEvD,KAAI,SAAS,SAAS,UAAU,CAC9B,WAAU;EACR,GAAG;EACH,GAAK,YAAY,WAAqD,EAAE;EACzE;AAGH,KAAI,SAAS,SAAS,YAAY,EAAE;EAClC,MAAM,YAAY,YAAY,aAAa,EAAE;AAC7C,OAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,UAAU,EAAE;GACxD,MAAM,iBAAiB;AACvB,OAAI,eAAe,WAAW,CAAC,QAAQ,OAAO;IAC5C,MAAM,mBAAmB,OAAO,KAAK,eAAe,QAAQ,CAAC,MAAM;AACnE,YAAQ,QAAQ,eAAe,UAAU,eAAe,mBAAmB;;;;AAKjF,KAAI,SAAS,SAAS,gBAAgB,EAAE;EACtC,MAAM,gBAAgB,YAAY,iBAAiB,EAAE;AACrD,OAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,cAAc,EAAE;GAC3D,MAAM,gBAAgB;AACtB,OAAI,cAAc,WAAW,CAAC,QAAQ,OAAO;IAC3C,MAAM,mBAAmB,OAAO,KAAK,cAAc,QAAQ,CAAC,MAAM;AAClE,YAAQ,QAAQ,cAAc,UAAU,eAAe,mBAAmB;;;;AAKhF,QAAO,YAAY,QAAQ"}