@pascal-app/core 1.0.0-beta.5 → 1.0.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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/dist/capture/index.d.ts +3 -0
  4. package/dist/capture/index.d.ts.map +1 -0
  5. package/dist/capture/index.js +2 -0
  6. package/dist/capture/schema.d.ts +417 -0
  7. package/dist/capture/schema.d.ts.map +1 -0
  8. package/dist/capture/schema.js +348 -0
  9. package/dist/capture/source.d.ts +60 -0
  10. package/dist/capture/source.d.ts.map +1 -0
  11. package/dist/capture/source.js +254 -0
  12. package/dist/events/bus.d.ts +55 -7
  13. package/dist/events/bus.d.ts.map +1 -1
  14. package/dist/events/hidden-wall-pointer-hold.d.ts +28 -0
  15. package/dist/events/hidden-wall-pointer-hold.d.ts.map +1 -0
  16. package/dist/events/hidden-wall-pointer-hold.js +37 -0
  17. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2785 -1
  18. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  19. package/dist/hooks/spatial-grid/spatial-grid-sync.js +132 -19
  20. package/dist/hooks/spatial-grid/support-host-patch.d.ts +45 -1
  21. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  22. package/dist/hooks/spatial-grid/support-host-patch.js +171 -6
  23. package/dist/index.d.ts +14 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -5
  26. package/dist/lib/asset-storage.d.ts.map +1 -1
  27. package/dist/lib/asset-storage.js +4 -1
  28. package/dist/lib/polygon-union.d.ts +4 -0
  29. package/dist/lib/polygon-union.d.ts.map +1 -0
  30. package/dist/lib/polygon-union.js +306 -0
  31. package/dist/lib/roof-overlap.d.ts +32 -0
  32. package/dist/lib/roof-overlap.d.ts.map +1 -0
  33. package/dist/lib/roof-overlap.js +72 -0
  34. package/dist/lib/slab-polygon.d.ts +35 -2
  35. package/dist/lib/slab-polygon.d.ts.map +1 -1
  36. package/dist/lib/slab-polygon.js +133 -27
  37. package/dist/lib/space-detection.d.ts +11 -0
  38. package/dist/lib/space-detection.d.ts.map +1 -1
  39. package/dist/lib/space-detection.js +42 -14
  40. package/dist/registry/handles.d.ts +24 -3
  41. package/dist/registry/handles.d.ts.map +1 -1
  42. package/dist/registry/index.d.ts +3 -4
  43. package/dist/registry/index.d.ts.map +1 -1
  44. package/dist/registry/index.js +1 -2
  45. package/dist/registry/registry.d.ts +13 -6
  46. package/dist/registry/registry.d.ts.map +1 -1
  47. package/dist/registry/registry.js +37 -4
  48. package/dist/registry/scene-api.d.ts +16 -0
  49. package/dist/registry/scene-api.d.ts.map +1 -1
  50. package/dist/registry/scene-api.js +49 -1
  51. package/dist/registry/types.d.ts +226 -13
  52. package/dist/registry/types.d.ts.map +1 -1
  53. package/dist/schema/__bench__/node-parsers.bench.d.ts +24 -0
  54. package/dist/schema/__bench__/node-parsers.bench.d.ts.map +1 -0
  55. package/dist/schema/__bench__/node-parsers.bench.js +314 -0
  56. package/dist/schema/__fixtures__/node-fixtures.d.ts +28 -0
  57. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -0
  58. package/dist/schema/__fixtures__/node-fixtures.js +125 -0
  59. package/dist/schema/base.d.ts +1 -1
  60. package/dist/schema/base.d.ts.map +1 -1
  61. package/dist/schema/base.js +8 -1
  62. package/dist/schema/compiled-node-parsers.d.ts +40 -0
  63. package/dist/schema/compiled-node-parsers.d.ts.map +1 -0
  64. package/dist/schema/compiled-node-parsers.js +95 -0
  65. package/dist/schema/index.d.ts +19 -15
  66. package/dist/schema/index.d.ts.map +1 -1
  67. package/dist/schema/index.js +17 -12
  68. package/dist/schema/material.d.ts +2 -1
  69. package/dist/schema/material.d.ts.map +1 -1
  70. package/dist/schema/material.js +1 -0
  71. package/dist/schema/nodes/automatic-downspout.d.ts +17 -0
  72. package/dist/schema/nodes/automatic-downspout.d.ts.map +1 -0
  73. package/dist/schema/nodes/automatic-downspout.js +237 -0
  74. package/dist/schema/nodes/block.d.ts +107 -0
  75. package/dist/schema/nodes/block.d.ts.map +1 -0
  76. package/dist/schema/nodes/block.js +207 -0
  77. package/dist/schema/nodes/box-vent.d.ts +8 -2
  78. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  79. package/dist/schema/nodes/box-vent.js +2 -0
  80. package/dist/schema/nodes/building.d.ts +1 -1
  81. package/dist/schema/nodes/cabinet.d.ts +25 -3
  82. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  83. package/dist/schema/nodes/cabinet.js +26 -5
  84. package/dist/schema/nodes/ceiling.d.ts +1 -1
  85. package/dist/schema/nodes/chimney.d.ts +2 -2
  86. package/dist/schema/nodes/column.d.ts +6 -6
  87. package/dist/schema/nodes/construction-dimension.d.ts +4 -4
  88. package/dist/schema/nodes/cupola.d.ts +9 -1
  89. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  90. package/dist/schema/nodes/cupola.js +2 -0
  91. package/dist/schema/nodes/door.d.ts +1 -1
  92. package/dist/schema/nodes/dormer.d.ts +44 -1
  93. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  94. package/dist/schema/nodes/dormer.js +131 -7
  95. package/dist/schema/nodes/downspout.d.ts +11 -1
  96. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  97. package/dist/schema/nodes/downspout.js +24 -0
  98. package/dist/schema/nodes/duct-fitting.d.ts +18 -1
  99. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
  100. package/dist/schema/nodes/duct-fitting.js +25 -4
  101. package/dist/schema/nodes/duct-segment.d.ts +23 -1
  102. package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
  103. package/dist/schema/nodes/duct-segment.js +20 -0
  104. package/dist/schema/nodes/duct-terminal.d.ts +1 -1
  105. package/dist/schema/nodes/elevator.d.ts +1 -1
  106. package/dist/schema/nodes/eyebrow-vent.d.ts +8 -2
  107. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  108. package/dist/schema/nodes/eyebrow-vent.js +2 -0
  109. package/dist/schema/nodes/fence.d.ts +1 -1
  110. package/dist/schema/nodes/guide.d.ts +1 -1
  111. package/dist/schema/nodes/gutter.d.ts +36 -2
  112. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  113. package/dist/schema/nodes/gutter.js +308 -1
  114. package/dist/schema/nodes/hanger-overrides.d.ts +7 -0
  115. package/dist/schema/nodes/hanger-overrides.d.ts.map +1 -0
  116. package/dist/schema/nodes/hanger-overrides.js +6 -0
  117. package/dist/schema/nodes/hvac-equipment.d.ts +1 -1
  118. package/dist/schema/nodes/item.d.ts +4 -3
  119. package/dist/schema/nodes/item.d.ts.map +1 -1
  120. package/dist/schema/nodes/item.js +5 -0
  121. package/dist/schema/nodes/lean-to-extension.d.ts +212 -0
  122. package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -0
  123. package/dist/schema/nodes/lean-to-extension.js +114 -0
  124. package/dist/schema/nodes/level.d.ts +2 -2
  125. package/dist/schema/nodes/level.d.ts.map +1 -1
  126. package/dist/schema/nodes/lineset.d.ts +1 -1
  127. package/dist/schema/nodes/liquid-line.d.ts +1 -1
  128. package/dist/schema/nodes/measurement.d.ts +1 -1
  129. package/dist/schema/nodes/pipe-fitting.d.ts +9 -1
  130. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
  131. package/dist/schema/nodes/pipe-fitting.js +6 -2
  132. package/dist/schema/nodes/pipe-segment.d.ts +23 -1
  133. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
  134. package/dist/schema/nodes/pipe-segment.js +20 -0
  135. package/dist/schema/nodes/pipe-trap.d.ts +1 -1
  136. package/dist/schema/nodes/ridge-vent.d.ts +1 -1
  137. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  138. package/dist/schema/nodes/ridge-vent.js +4 -1
  139. package/dist/schema/nodes/roof-segment-shape.d.ts +4 -0
  140. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
  141. package/dist/schema/nodes/roof-segment-shape.js +64 -1
  142. package/dist/schema/nodes/roof-segment-walls.d.ts +3 -1
  143. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  144. package/dist/schema/nodes/roof-segment-walls.js +1 -1
  145. package/dist/schema/nodes/roof-segment.d.ts +41 -1
  146. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  147. package/dist/schema/nodes/roof-segment.js +79 -2
  148. package/dist/schema/nodes/roof.d.ts +22 -1
  149. package/dist/schema/nodes/roof.d.ts.map +1 -1
  150. package/dist/schema/nodes/roof.js +14 -0
  151. package/dist/schema/nodes/scan.d.ts +19 -2
  152. package/dist/schema/nodes/scan.d.ts.map +1 -1
  153. package/dist/schema/nodes/scan.js +11 -1
  154. package/dist/schema/nodes/shelf.d.ts +2 -2
  155. package/dist/schema/nodes/site.d.ts +1 -1
  156. package/dist/schema/nodes/skylight.d.ts +1 -1
  157. package/dist/schema/nodes/slab.d.ts +1 -1
  158. package/dist/schema/nodes/solar-panel.d.ts +1 -1
  159. package/dist/schema/nodes/spawn.d.ts +1 -1
  160. package/dist/schema/nodes/stair-segment.d.ts +1 -1
  161. package/dist/schema/nodes/stair.d.ts +1 -1
  162. package/dist/schema/nodes/structural-grid.d.ts +1 -1
  163. package/dist/schema/nodes/turbine-vent.d.ts +7 -1
  164. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  165. package/dist/schema/nodes/turbine-vent.js +2 -0
  166. package/dist/schema/nodes/wall.d.ts +4 -4
  167. package/dist/schema/nodes/wall.d.ts.map +1 -1
  168. package/dist/schema/nodes/wall.js +7 -1
  169. package/dist/schema/nodes/window.d.ts +10 -3
  170. package/dist/schema/nodes/window.d.ts.map +1 -1
  171. package/dist/schema/nodes/window.js +4 -0
  172. package/dist/schema/nodes/zone.d.ts +2 -2
  173. package/dist/schema/nodes/zone.js +1 -1
  174. package/dist/schema/types.d.ts +484 -109
  175. package/dist/schema/types.d.ts.map +1 -1
  176. package/dist/schema/types.js +27 -1
  177. package/dist/services/hosting.d.ts +2 -2
  178. package/dist/services/hosting.d.ts.map +1 -1
  179. package/dist/services/hosting.js +4 -4
  180. package/dist/services/index.d.ts +1 -1
  181. package/dist/services/index.d.ts.map +1 -1
  182. package/dist/services/index.js +1 -1
  183. package/dist/services/system-graph.d.ts +11 -0
  184. package/dist/services/system-graph.d.ts.map +1 -1
  185. package/dist/services/system-graph.js +35 -5
  186. package/dist/store/actions/node-actions.d.ts +7 -0
  187. package/dist/store/actions/node-actions.d.ts.map +1 -1
  188. package/dist/store/actions/node-actions.js +429 -17
  189. package/dist/store/history-invalidation.d.ts +3 -0
  190. package/dist/store/history-invalidation.d.ts.map +1 -0
  191. package/dist/store/history-invalidation.js +72 -0
  192. package/dist/store/scene-hydration.d.ts +5 -0
  193. package/dist/store/scene-hydration.d.ts.map +1 -0
  194. package/dist/store/scene-hydration.js +57 -0
  195. package/dist/store/use-scene.d.ts +3 -0
  196. package/dist/store/use-scene.d.ts.map +1 -1
  197. package/dist/store/use-scene.js +332 -64
  198. package/dist/systems/roof/roof-elevation-system.d.ts +3 -0
  199. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -0
  200. package/dist/systems/roof/roof-elevation-system.js +94 -0
  201. package/dist/systems/roof/roof-elevation.d.ts +4 -0
  202. package/dist/systems/roof/roof-elevation.d.ts.map +1 -0
  203. package/dist/systems/roof/roof-elevation.js +95 -0
  204. package/dist/systems/roof/roof-footprint.d.ts +17 -0
  205. package/dist/systems/roof/roof-footprint.d.ts.map +1 -0
  206. package/dist/systems/roof/roof-footprint.js +83 -0
  207. package/dist/systems/stair/stair-flight.d.ts +17 -0
  208. package/dist/systems/stair/stair-flight.d.ts.map +1 -0
  209. package/dist/systems/stair/stair-flight.js +27 -0
  210. package/dist/systems/stair/stair-opening-preview.d.ts +1555 -1328
  211. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  212. package/dist/systems/stair/stair-opening-system.d.ts +1 -0
  213. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  214. package/dist/systems/stair/stair-opening-system.js +93 -96
  215. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  216. package/dist/systems/stair/stair-rise.js +20 -21
  217. package/dist/systems/wall/wall-curve.d.ts +1 -0
  218. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  219. package/dist/systems/wall/wall-curve.js +73 -0
  220. package/dist/systems/wall/wall-footprint.d.ts +1 -0
  221. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  222. package/dist/systems/wall/wall-footprint.js +1 -0
  223. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  224. package/dist/utils/clone-scene-graph.js +26 -0
  225. package/dist/validation/validate-build-json.d.ts +3 -0
  226. package/dist/validation/validate-build-json.d.ts.map +1 -1
  227. package/dist/validation/validate-build-json.js +49 -2
  228. package/package.json +10 -3
  229. package/dist/systems/elevator/elevator-runtime-system.d.ts +0 -2
  230. package/dist/systems/elevator/elevator-runtime-system.d.ts.map +0 -1
  231. package/dist/systems/elevator/elevator-runtime-system.js +0 -8
@@ -2,10 +2,12 @@ import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { MaterialSchema } from '../material';
5
+ const DEFAULT_DOWNSPOUT_GENERATOR = 'default-downspout';
5
6
  export const DownspoutNode = BaseNode.extend({
6
7
  id: objectId('downspout'),
7
8
  type: nodeType('downspout'),
8
9
  material: MaterialSchema.optional(),
10
+ slots: z.record(z.string(), z.string()).optional(),
9
11
  // Match the gutter family default — paint inspector reads "White"
10
12
  // instead of "no material" on a freshly placed downspout.
11
13
  materialPreset: z.string().default('preset-white'),
@@ -26,6 +28,7 @@ export const DownspoutNode = BaseNode.extend({
26
28
  // tool can default to the gutter's eave-Y minus building floor on
27
29
  // commit so the user doesn't have to set it on every drop.
28
30
  length: z.number().default(2.5),
31
+ lengthMode: z.enum(['to-ground', 'manual']).optional(),
29
32
  // Bore diameter, default 0.07 m ≈ 3″ to match the gutter outlet
30
33
  // default. Larger downspouts are common on commercial gutters.
31
34
  diameter: z.number().default(0.07),
@@ -61,3 +64,24 @@ export const DownspoutNode = BaseNode.extend({
61
64
  - strapStyle / strapSpacing: wall straps clamping the run
62
65
  - terminal: bottom treatment (splash block, kickout only, or straight down)
63
66
  `);
67
+ function metadataRecord(metadata) {
68
+ if (typeof metadata === 'object' && metadata !== null && !Array.isArray(metadata)) {
69
+ return metadata;
70
+ }
71
+ return {};
72
+ }
73
+ export function defaultDownspoutMetadata() {
74
+ return { generatedBy: DEFAULT_DOWNSPOUT_GENERATOR };
75
+ }
76
+ export function isDefaultDownspoutNode(node, gutterId) {
77
+ const parsed = DownspoutNode.safeParse(node);
78
+ if (!parsed.success)
79
+ return false;
80
+ if (gutterId && parsed.data.gutterId !== gutterId)
81
+ return false;
82
+ return metadataRecord(parsed.data.metadata).generatedBy === DEFAULT_DOWNSPOUT_GENERATOR;
83
+ }
84
+ export function usesAutomaticDownspoutLength(node) {
85
+ return (node.lengthMode === 'to-ground' ||
86
+ (node.lengthMode === undefined && isDefaultDownspoutNode(node)));
87
+ }
@@ -45,7 +45,7 @@ export declare const DuctFittingNode: z.ZodObject<{
45
45
  fov: z.ZodOptional<z.ZodNumber>;
46
46
  zoom: z.ZodOptional<z.ZodNumber>;
47
47
  }, z.core.$strip>>;
48
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
48
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
49
49
  id: z.ZodDefault<z.ZodTemplateLiteral<`duct-fitting_${string}`>>;
50
50
  type: z.ZodDefault<z.ZodLiteral<"duct-fitting">>;
51
51
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
@@ -56,12 +56,26 @@ export declare const DuctFittingNode: z.ZodObject<{
56
56
  cross: "cross";
57
57
  reducer: "reducer";
58
58
  transition: "transition";
59
+ "end-cap": "end-cap";
60
+ damper: "damper";
61
+ "access-panel": "access-panel";
62
+ coupling: "coupling";
59
63
  }>>;
60
64
  shape: z.ZodDefault<z.ZodEnum<{
61
65
  round: "round";
62
66
  rect: "rect";
63
67
  oval: "oval";
64
68
  }>>;
69
+ inletShape: z.ZodOptional<z.ZodEnum<{
70
+ round: "round";
71
+ rect: "rect";
72
+ oval: "oval";
73
+ }>>;
74
+ outletShape: z.ZodOptional<z.ZodEnum<{
75
+ round: "round";
76
+ rect: "rect";
77
+ oval: "oval";
78
+ }>>;
65
79
  width: z.ZodDefault<z.ZodNumber>;
66
80
  height: z.ZodDefault<z.ZodNumber>;
67
81
  shape2: z.ZodDefault<z.ZodEnum<{
@@ -84,6 +98,9 @@ export declare const DuctFittingNode: z.ZodObject<{
84
98
  supply: "supply";
85
99
  return: "return";
86
100
  }>>;
101
+ damperAngle: z.ZodDefault<z.ZodNumber>;
102
+ panelWidth: z.ZodDefault<z.ZodNumber>;
103
+ panelHeight: z.ZodDefault<z.ZodNumber>;
87
104
  slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
88
105
  }, z.core.$strip>;
89
106
  export type DuctFittingNode = z.infer<typeof DuctFittingNode>;
@@ -1 +1 @@
1
- {"version":3,"file":"duct-fitting.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/duct-fitting.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2D3B,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA"}
1
+ {"version":3,"file":"duct-fitting.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/duct-fitting.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgF3B,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA"}
@@ -39,12 +39,27 @@ export const DuctFittingNode = BaseNode.extend({
39
39
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
40
40
  // XYZ euler radians.
41
41
  rotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
42
- fittingType: z.enum(['elbow', 'tee', 'cross', 'reducer', 'transition']).default('elbow'),
42
+ fittingType: z
43
+ .enum([
44
+ 'elbow',
45
+ 'tee',
46
+ 'cross',
47
+ 'reducer',
48
+ 'transition',
49
+ 'end-cap',
50
+ 'damper',
51
+ 'access-panel',
52
+ 'coupling',
53
+ ])
54
+ .default('elbow'),
43
55
  // Run-leg cross-section: round collars, or a rect / flat-oval profile
44
56
  // matching the trunk the fitting sits in. Reducers ignore the shape.
45
57
  // When non-round, `diameter` carries the area-equivalent round size
46
58
  // (drives leg lengths + advertised ports).
47
59
  shape: z.enum(['round', 'rect', 'oval']).default('rect'),
60
+ // Adapter end profiles; omitted values use the fitting type's standard profiles.
61
+ inletShape: z.enum(['round', 'rect', 'oval']).optional(),
62
+ outletShape: z.enum(['round', 'rect', 'oval']).optional(),
48
63
  // Rect / oval run-leg profile in inches (used when shape ≠ 'round').
49
64
  width: z.number().min(4).max(60).default(14),
50
65
  height: z.number().min(3).max(40).default(8),
@@ -73,16 +88,22 @@ export const DuctFittingNode = BaseNode.extend({
73
88
  diameter2: z.number().min(2).max(48).default(6),
74
89
  ductMaterial: z.enum(['sheet-metal', 'flex', 'duct-board']).default('sheet-metal'),
75
90
  system: z.enum(['supply', 'return']).default('supply'),
91
+ damperAngle: z.number().finite().min(0).max(90).default(0),
92
+ panelWidth: z.number().finite().min(0.1).max(1.2).default(0.25),
93
+ panelHeight: z.number().finite().min(0.1).max(1.2).default(0.15),
76
94
  slots: z.record(z.string(), z.string()).optional(),
77
95
  }).describe(dedent `
78
96
  Duct fitting - elbow, tee, cross, reducer, or square-to-round transition between duct runs.
79
97
  - position: [x, y, z] level-local meters
80
98
  - rotation: [x, y, z] euler radians
81
- - fittingType: elbow | tee | cross | reducer | transition (rect end -X, round end +X)
82
- - shape: round | rect | oval run legs (matches the trunk; ignored by reducer / transition)
99
+ - fittingType: elbow | tee | cross | reducer | transition | end-cap | damper | access-panel | coupling
100
+ - damperAngle: blade opening in degrees, 0 closed, 90 open
101
+ - panelWidth / panelHeight: access door dimensions in meters; door lies in local XY with outward normal +Z; no flow ports
102
+ - inletShape / outletShape: round | rect | oval adapter end profiles; defaults are round-to-round for reducer and rect-to-round for transition
103
+ - shape: round | rect | oval run legs (matches the trunk)
83
104
  - width / height: rect / oval run-leg profile in inches (transition: the rect end)
84
105
  - shape2: round | rect | oval tee / cross branch (matches the duct drawn off the tap)
85
- - width2 / height2: rect / oval branch profile in inches
106
+ - width2 / height2: rect / oval branch or adapter outlet profile in inches
86
107
  - angle: elbow turn in degrees (45 or 90 typical)
87
108
  - branchAngle: tee branch angle off the outlet axis (90 straight tee, 45 downstream lateral, 135 upstream); cross branches are always square
88
109
  - diameter: main nominal diameter in inches
@@ -28,10 +28,32 @@ export declare const DuctSegmentNode: z.ZodObject<{
28
28
  fov: z.ZodOptional<z.ZodNumber>;
29
29
  zoom: z.ZodOptional<z.ZodNumber>;
30
30
  }, z.core.$strip>>;
31
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
31
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
32
32
  id: z.ZodDefault<z.ZodTemplateLiteral<`duct-segment_${string}`>>;
33
33
  type: z.ZodDefault<z.ZodLiteral<"duct-segment">>;
34
34
  path: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
35
+ autoHangers: z.ZodOptional<z.ZodBoolean>;
36
+ hangerOverrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
37
+ fraction: z.ZodOptional<z.ZodNumber>;
38
+ skipped: z.ZodOptional<z.ZodBoolean>;
39
+ hostId: z.ZodOptional<z.ZodString>;
40
+ }, z.core.$strip>>>;
41
+ hangerStyle: z.ZodOptional<z.ZodEnum<{
42
+ double: "double";
43
+ single: "single";
44
+ }>>;
45
+ hangerSpacing: z.ZodOptional<z.ZodNumber>;
46
+ hangerMaxReach: z.ZodOptional<z.ZodNumber>;
47
+ wallAttachment: z.ZodOptional<z.ZodObject<{
48
+ wallId: z.ZodDefault<z.ZodTemplateLiteral<`wall_${string}`>>;
49
+ side: z.ZodEnum<{
50
+ front: "front";
51
+ back: "back";
52
+ }>;
53
+ startUV: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
54
+ endUV: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
55
+ offset: z.ZodNumber;
56
+ }, z.core.$strip>>;
35
57
  shape: z.ZodDefault<z.ZodEnum<{
36
58
  round: "round";
37
59
  rect: "rect";
@@ -1 +1 @@
1
- {"version":3,"file":"duct-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/duct-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyD3B,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA"}
1
+ {"version":3,"file":"duct-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/duct-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4E3B,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
+ import { HangerOverrides } from './hanger-overrides';
4
5
  /**
5
6
  * Round duct segment — a polyline of 3D points connected by cylindrical
6
7
  * duct sections. Forced-air HVAC supply/return runs in US residential.
@@ -20,6 +21,22 @@ export const DuctSegmentNode = BaseNode.extend({
20
21
  type: nodeType('duct-segment'),
21
22
  // Polyline path in level-local meters. Minimum two points (start, end).
22
23
  path: z.array(z.tuple([z.number(), z.number(), z.number()])).min(2),
24
+ autoHangers: z.boolean().optional(),
25
+ hangerOverrides: HangerOverrides.optional(),
26
+ hangerStyle: z.enum(['single', 'double']).optional(),
27
+ hangerSpacing: z.number().finite().positive().optional(),
28
+ hangerMaxReach: z.number().finite().positive().optional(),
29
+ // Logical wall host for runs drafted on a wall. The path remains
30
+ // level-local; UV coordinates let wall edits reproject the run later.
31
+ wallAttachment: z
32
+ .object({
33
+ wallId: objectId('wall'),
34
+ side: z.enum(['front', 'back']),
35
+ startUV: z.tuple([z.number(), z.number()]),
36
+ endUV: z.tuple([z.number(), z.number()]),
37
+ offset: z.number().finite().nonnegative(),
38
+ })
39
+ .optional(),
23
40
  // Cross-section. Round is the branch default; rect is the trunk /
24
41
  // plenum profile (real US systems: rect trunk, round branches); oval
25
42
  // is the flat-oval profile (two semicircles of the duct height joined
@@ -60,6 +77,9 @@ export const DuctSegmentNode = BaseNode.extend({
60
77
  slots: z.record(z.string(), z.string()).optional(),
61
78
  }).describe(dedent `
62
79
  Duct segment - polyline of 3D points connected by duct sections.
80
+ - autoHangers: automatically attach supports to nearby walls or ceilings (off when absent)
81
+ - hangerSpacing: distance between supports in meters (default 1.5)
82
+ - hangerMaxReach: maximum centerline-to-host distance in meters (default 2)
63
83
  - path: list of [x, y, z] points in level-local meters (min 2)
64
84
  - shape: round (branches) | rect (trunks / plenums) | oval (flat-oval, tight joist bays)
65
85
  - diameter: nominal inner diameter in inches for round (typ. 4-14 residential)
@@ -26,7 +26,7 @@ export declare const DuctTerminalNode: z.ZodObject<{
26
26
  fov: z.ZodOptional<z.ZodNumber>;
27
27
  zoom: z.ZodOptional<z.ZodNumber>;
28
28
  }, z.core.$strip>>;
29
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
29
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
30
30
  id: z.ZodDefault<z.ZodTemplateLiteral<`duct-terminal_${string}`>>;
31
31
  type: z.ZodDefault<z.ZodLiteral<"duct-terminal">>;
32
32
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
@@ -31,7 +31,7 @@ export declare const ElevatorNode: z.ZodObject<{
31
31
  fov: z.ZodOptional<z.ZodNumber>;
32
32
  zoom: z.ZodOptional<z.ZodNumber>;
33
33
  }, z.core.$strip>>;
34
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
34
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
35
35
  id: z.ZodDefault<z.ZodTemplateLiteral<`elevator_${string}`>>;
36
36
  type: z.ZodDefault<z.ZodLiteral<"elevator">>;
37
37
  material: z.ZodOptional<z.ZodObject<{
@@ -1,4 +1,9 @@
1
1
  import { z } from 'zod';
2
+ export declare const EyebrowVentMaterialRole: z.ZodEnum<{
3
+ front: "front";
4
+ hood: "hood";
5
+ }>;
6
+ export type EyebrowVentMaterialRole = z.infer<typeof EyebrowVentMaterialRole>;
2
7
  export declare const EyebrowVentNode: z.ZodObject<{
3
8
  object: z.ZodDefault<z.ZodLiteral<"node">>;
4
9
  name: z.ZodOptional<z.ZodString>;
@@ -14,7 +19,7 @@ export declare const EyebrowVentNode: z.ZodObject<{
14
19
  fov: z.ZodOptional<z.ZodNumber>;
15
20
  zoom: z.ZodOptional<z.ZodNumber>;
16
21
  }, z.core.$strip>>;
17
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
22
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
18
23
  id: z.ZodDefault<z.ZodTemplateLiteral<`eyebrow-vent_${string}`>>;
19
24
  type: z.ZodDefault<z.ZodLiteral<"eyebrow-vent">>;
20
25
  material: z.ZodOptional<z.ZodObject<{
@@ -49,6 +54,7 @@ export declare const EyebrowVentNode: z.ZodObject<{
49
54
  scale: z.ZodOptional<z.ZodNumber>;
50
55
  }, z.core.$strip>>;
51
56
  }, z.core.$strip>>;
57
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
52
58
  materialPreset: z.ZodDefault<z.ZodString>;
53
59
  roofSegmentId: z.ZodOptional<z.ZodString>;
54
60
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
@@ -57,8 +63,8 @@ export declare const EyebrowVentNode: z.ZodObject<{
57
63
  depth: z.ZodDefault<z.ZodNumber>;
58
64
  height: z.ZodDefault<z.ZodNumber>;
59
65
  style: z.ZodDefault<z.ZodEnum<{
60
- scoop: "scoop";
61
66
  "half-round": "half-round";
67
+ scoop: "scoop";
62
68
  "slant-box": "slant-box";
63
69
  }>>;
64
70
  louverCount: z.ZodDefault<z.ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"eyebrow-vent.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/eyebrow-vent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2C3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA"}
1
+ {"version":3,"file":"eyebrow-vent.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/eyebrow-vent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,uBAAuB;;;EAA4B,CAAA;AAChE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE7E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4C3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA"}
@@ -2,10 +2,12 @@ import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { MaterialSchema } from '../material';
5
+ export const EyebrowVentMaterialRole = z.enum(['hood', 'front']);
5
6
  export const EyebrowVentNode = BaseNode.extend({
6
7
  id: objectId('eyebrow-vent'),
7
8
  type: nodeType('eyebrow-vent'),
8
9
  material: MaterialSchema.optional(),
10
+ slots: z.record(z.string(), z.string()).optional(),
9
11
  // Default to the white preset so a freshly-placed vent reads as clean
10
12
  // painted metal and the paint inspector shows "White" (matches box-vent).
11
13
  materialPreset: z.string().default('preset-white'),
@@ -29,7 +29,7 @@ export declare const FenceNode: z.ZodObject<{
29
29
  fov: z.ZodOptional<z.ZodNumber>;
30
30
  zoom: z.ZodOptional<z.ZodNumber>;
31
31
  }, z.core.$strip>>;
32
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
32
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
33
33
  id: z.ZodDefault<z.ZodTemplateLiteral<`fence_${string}`>>;
34
34
  type: z.ZodDefault<z.ZodLiteral<"fence">>;
35
35
  material: z.ZodOptional<z.ZodObject<{
@@ -22,7 +22,7 @@ export declare const GuideNode: z.ZodObject<{
22
22
  fov: z.ZodOptional<z.ZodNumber>;
23
23
  zoom: z.ZodOptional<z.ZodNumber>;
24
24
  }, z.core.$strip>>;
25
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
25
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
26
26
  id: z.ZodDefault<z.ZodTemplateLiteral<`guide_${string}`>>;
27
27
  type: z.ZodDefault<z.ZodLiteral<"guide">>;
28
28
  url: z.ZodString;
@@ -1,8 +1,24 @@
1
1
  import { z } from 'zod';
2
+ import { type RoofSegmentNode } from './roof-segment';
3
+ export declare const GUTTER_EAVE_TUCK_INWARD = 0.04;
4
+ export declare const GUTTER_EAVE_TUCK_UP = 0.04;
5
+ export type GutterEaveSide = '+X' | '-X' | '+Z' | '-Z';
6
+ export type GutterRun = {
7
+ side: GutterEaveSide;
8
+ position: [number, number, number];
9
+ rotation: number;
10
+ length: number;
11
+ };
12
+ export type GutterEdgeExclusion = {
13
+ side: GutterEaveSide;
14
+ from: number;
15
+ to: number;
16
+ };
2
17
  export declare const GutterOutlet: z.ZodObject<{
3
18
  id: z.ZodString;
4
19
  offset: z.ZodDefault<z.ZodNumber>;
5
20
  diameter: z.ZodDefault<z.ZodNumber>;
21
+ generatedBy: z.ZodOptional<z.ZodLiteral<"default-downspout">>;
6
22
  }, z.core.$strip>;
7
23
  export type GutterOutlet = z.infer<typeof GutterOutlet>;
8
24
  export declare const GutterNode: z.ZodObject<{
@@ -20,7 +36,7 @@ export declare const GutterNode: z.ZodObject<{
20
36
  fov: z.ZodOptional<z.ZodNumber>;
21
37
  zoom: z.ZodOptional<z.ZodNumber>;
22
38
  }, z.core.$strip>>;
23
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
39
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
24
40
  id: z.ZodDefault<z.ZodTemplateLiteral<`gutter_${string}`>>;
25
41
  type: z.ZodDefault<z.ZodLiteral<"gutter">>;
26
42
  material: z.ZodOptional<z.ZodObject<{
@@ -55,17 +71,23 @@ export declare const GutterNode: z.ZodObject<{
55
71
  scale: z.ZodOptional<z.ZodNumber>;
56
72
  }, z.core.$strip>>;
57
73
  }, z.core.$strip>>;
74
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
58
75
  materialPreset: z.ZodDefault<z.ZodString>;
59
76
  roofSegmentId: z.ZodOptional<z.ZodString>;
60
77
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
61
78
  rotation: z.ZodDefault<z.ZodNumber>;
62
79
  length: z.ZodDefault<z.ZodNumber>;
80
+ arc: z.ZodOptional<z.ZodObject<{
81
+ centerX: z.ZodNumber;
82
+ centerZ: z.ZodNumber;
83
+ radius: z.ZodNumber;
84
+ }, z.core.$strip>>;
63
85
  size: z.ZodDefault<z.ZodNumber>;
64
86
  thickness: z.ZodDefault<z.ZodNumber>;
65
87
  profile: z.ZodDefault<z.ZodEnum<{
66
88
  box: "box";
67
- "half-round": "half-round";
68
89
  "k-style": "k-style";
90
+ "half-round": "half-round";
69
91
  }>>;
70
92
  endCapLeft: z.ZodDefault<z.ZodBoolean>;
71
93
  endCapRight: z.ZodDefault<z.ZodBoolean>;
@@ -78,7 +100,19 @@ export declare const GutterNode: z.ZodObject<{
78
100
  id: z.ZodString;
79
101
  offset: z.ZodDefault<z.ZodNumber>;
80
102
  diameter: z.ZodDefault<z.ZodNumber>;
103
+ generatedBy: z.ZodOptional<z.ZodLiteral<"default-downspout">>;
81
104
  }, z.core.$strip>>>;
82
105
  }, z.core.$strip>;
83
106
  export type GutterNode = z.infer<typeof GutterNode>;
107
+ export declare function computeGutterEaveY(segment: Pick<RoofSegmentNode, 'wallHeight' | 'overhang' | 'pitch' | 'roofType'>): number;
108
+ export declare function getGutterRunsForSegment(segment: RoofSegmentNode, roofSegments?: readonly RoofSegmentNode[], exclusions?: readonly GutterEdgeExclusion[]): GutterRun[];
109
+ export declare function createDefaultGuttersForSegment(segment: RoofSegmentNode, roofSegments?: readonly RoofSegmentNode[], exclusions?: readonly GutterEdgeExclusion[]): GutterNode[];
110
+ export declare function getDefaultGutterSide(node: unknown, roofSegmentId?: RoofSegmentNode['id']): GutterEaveSide | null;
111
+ export declare function isDefaultGutterNode(node: unknown, roofSegmentId?: RoofSegmentNode['id']): node is GutterNode;
112
+ export declare function hasAutoGutterMetadata(segment: Pick<RoofSegmentNode, 'metadata'>): segment is Pick<RoofSegmentNode, 'metadata'> & {
113
+ metadata: Record<string, unknown> & {
114
+ autoGutter: boolean;
115
+ };
116
+ };
117
+ export declare function isAutoGutterEnabled(segment: Pick<RoofSegmentNode, 'id' | 'children' | 'metadata'>, nodes?: Record<string, unknown>): boolean;
84
118
  //# sourceMappingURL=gutter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gutter.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/gutter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAOvB,eAAO,MAAM,YAAY;;;;iBAUvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkEtB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
1
+ {"version":3,"file":"gutter.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/gutter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAO/E,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAC3C,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAEtD,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,cAAc,CAAA;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAQD,eAAO,MAAM,YAAY;;;;;iBAWvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEvD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8EtB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AASnD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC,GAC/E,MAAM,CAKR;AAmND,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,eAAe,EACxB,YAAY,GAAE,SAAS,eAAe,EAAO,EAC7C,UAAU,GAAE,SAAS,mBAAmB,EAAO,GAC9C,SAAS,EAAE,CAkDb;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,eAAe,EACxB,YAAY,GAAE,SAAS,eAAe,EAAO,EAC7C,UAAU,GAAE,SAAS,mBAAmB,EAAO,GAC9C,UAAU,EAAE,CAcd;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,aAAa,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,GACpC,cAAc,GAAG,IAAI,CAQvB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,aAAa,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,GACpC,IAAI,IAAI,UAAU,CAEpB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG,OAAO,IAAI,IAAI,CAChG,eAAe,EACf,UAAU,CACX,GAAG;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,CAAA;CAC5D,CAEA;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,EAC9D,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAKT"}