@hatiolab/figure-model 0.1.34 → 0.1.36

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.
package/dist/v3-gate.js CHANGED
@@ -21,8 +21,9 @@
21
21
  import { compileV3Asset } from "./v3-asset.js";
22
22
  import { compileV3Graph } from "./v3-graph.js";
23
23
  import { AXES, SKIN } from "./types.js";
24
+ import { transformPoints, v3ShapePoints } from "./v3-mesh-compare.js";
24
25
  /** Axis-aligned world boxes of evaluated geometry. `part` is the placing node: a `place@1` id or the repeated member. */
25
- export function v3WorldBoxesOf(geometry, writers) {
26
+ export function v3WorldBoxesOf(geometry, writers, options = {}) {
26
27
  const out = [];
27
28
  for (const g of geometry) {
28
29
  if (!('pose' in g))
@@ -35,16 +36,21 @@ export function v3WorldBoxesOf(geometry, writers) {
35
36
  ? [d.radiusX * 2, d.radiusY * 2, d.radiusZ * 2]
36
37
  : g.shape.provider === 'frustum'
37
38
  ? [Math.max(d.radiusTop, d.radiusBottom) * 2, d.height, Math.max(d.radiusTop, d.radiusBottom) * 2]
38
- : [d.width, d.height, d.depth];
39
+ : g.shape.provider === 'ellipticCylinder'
40
+ ? [d.radiusX * 2, d.length, d.radiusZ * 2]
41
+ : [d.width, d.height, d.depth];
39
42
  const r = g.pose.r;
40
43
  const extent = AXES.map((_, a) => local.reduce((s, v, i) => s + Math.abs(r[a][i]) * v, 0));
41
- out.push({
44
+ const box = {
42
45
  part,
43
46
  centre: { x: g.pose.t[0], y: g.pose.t[1], z: g.pose.t[2] },
44
47
  extent: { x: extent[0], y: extent[1], z: extent[2] },
45
48
  dims: local,
46
49
  rotation: r
47
- });
50
+ };
51
+ if (options.points)
52
+ box.points = transformPoints(v3ShapePoints(g.shape, g.segments), r, g.pose.t);
53
+ out.push(box);
48
54
  }
49
55
  return out;
50
56
  }
@@ -57,30 +63,198 @@ export function v3WritersOf(asset) {
57
63
  return writers;
58
64
  }
59
65
  /**
60
- * Inspect an asset against its declared occupancy at its stored design inputs and state defaults.
61
- * `stateOverrides` follows `compileV3Asset(...).evaluate` and lets a caller inspect another pose.
66
+ * Why the extremes of every state-dependent coordinate lie at the corners of the state box, or why that cannot be
67
+ * shown. The basis: a value that is multilinear in the state inputs (each input to degree one) or a monotone
68
+ * function of such values takes its extremes at the corners. That holds through `add`, through `mul` and `geomean`
69
+ * when the two arguments depend on disjoint state inputs (x·x does not qualify), through `div` by a state-free
70
+ * denominator, and through translations in `rigid`. It does not hold through `sin`, `axis-turn`, a
71
+ * state-dependent rotation angle in `rigid`, a state-dependent denominator, or a product of two values that share
72
+ * an input. Returns the reasons it fails, empty when it holds.
62
73
  */
63
- export function inspectV3Asset(asset, stateOverrides = {}) {
74
+ export function cornerExtremalBasis(asset, dependence) {
75
+ const reasons = [];
76
+ const dep = (ref) => dependence[ref] ?? [];
77
+ const shares = (a, b) => dep(a).some(x => dep(b).includes(x));
78
+ for (const n of asset.document.model.nodes) {
79
+ const stateful = n.args.filter(a => dep(a).length);
80
+ if (!stateful.length)
81
+ continue;
82
+ switch (n.op) {
83
+ case 'add@1':
84
+ case 'compose@1':
85
+ case 'attach@1':
86
+ case 'place@1':
87
+ case 'member@1':
88
+ case 'feature@1':
89
+ case 'assembly@1':
90
+ case 'repeat@1':
91
+ case 'select-item@1':
92
+ case 'map-point@1':
93
+ case 'point@1':
94
+ break;
95
+ case 'mul@1':
96
+ case 'geomean@1':
97
+ for (let i = 0; i < n.args.length; i++)
98
+ for (let j = i + 1; j < n.args.length; j++)
99
+ if (shares(n.args[i], n.args[j]))
100
+ reasons.push(`${n.id}: ${n.op} of two values that both depend on ${dep(n.args[i]).filter(x => dep(n.args[j]).includes(x)).join(', ')}`);
101
+ break;
102
+ case 'div@1':
103
+ if (dep(n.args[1]).length)
104
+ reasons.push(`${n.id}: division by a value that depends on ${dep(n.args[1]).join(', ')}`);
105
+ break;
106
+ case 'rigid@1':
107
+ for (const a of n.args.slice(3))
108
+ if (dep(a).length)
109
+ reasons.push(`${n.id}: a rotation angle depends on ${dep(a).join(', ')}`);
110
+ break;
111
+ case 'axis-slide@1':
112
+ if (n.args.slice(0, 3).some(a => dep(a).length))
113
+ reasons.push(`${n.id}: the slide axis depends on state`);
114
+ break;
115
+ case 'curve@1': {
116
+ // A piecewise-linear curve is monotone in x when its key values never change direction; then its extremes
117
+ // are at x's extremes. Keys that depend on state, or a curve that rises and falls, are not covered.
118
+ if (n.args.slice(1).some(a => dep(a).length)) {
119
+ reasons.push(`${n.id}: a curve key depends on ${[...new Set(n.args.slice(1).flatMap(dep))].join(', ')}`);
120
+ break;
121
+ }
122
+ const constant = new Map(asset.document.model.constants.map(c => [c.id, c.value]));
123
+ const values = [];
124
+ for (let i = 2; i < n.args.length; i += 2)
125
+ values.push(constant.get(n.args[i]) ?? NaN);
126
+ const up = values.every((v, i) => i === 0 || v >= values[i - 1]);
127
+ const down = values.every((v, i) => i === 0 || v <= values[i - 1]);
128
+ if (values.some(Number.isNaN))
129
+ reasons.push(`${n.id}: a curve key is not a constant`);
130
+ else if (!up && !down)
131
+ reasons.push(`${n.id}: the curve rises and falls (${values.join(', ')}), so its extreme may lie inside the range`);
132
+ break;
133
+ }
134
+ default:
135
+ // sin, axis-turn, layout operators, distance, providers with a state-dependent argument are not corner-extremal
136
+ // by this basis; providers are shapes whose extents are the arguments themselves, which is fine only when the
137
+ // arguments are (handled by their own nodes), so treat shape providers as pass-through.
138
+ if (n.op.endsWith('-shape@1') || n.op.endsWith('-shape@2') || n.op === 'rounded-box@1' || n.op === 'rounded-box@2' || n.op === 'hollow-box@1' || n.op === 'hollow-box@2' || n.op === 'portal-profile@1')
139
+ break;
140
+ reasons.push(`${n.id}: ${n.op} with a state-dependent argument (${[...new Set(stateful.flatMap(dep))].join(', ')})`);
141
+ }
142
+ }
143
+ return reasons;
144
+ }
145
+ /** The state inputs of an asset with their declared bounds. */
146
+ function stateInputs(asset) {
147
+ return asset.document.model.inputs.filter(i => i.role === 'state').map(i => ({ id: i.id, min: i.min, max: i.max }));
148
+ }
149
+ /**
150
+ * Inspect an asset against its declared occupancy. Without `at`, the whole valid state range is covered: every
151
+ * state input at its bounds (and, when a rotation depends on state, along its sweep), and a violation found at any
152
+ * evaluated state is a violation. The occupancy is never widened to make one go away.
153
+ */
154
+ export function inspectV3Asset(asset, options = {}) {
155
+ // Backwards compatible: a plain record is `at`.
156
+ const opts = 'at' in options || 'sweepSteps' in options || 'maxCornerInputs' in options || Object.keys(options).length === 0 ? options : { at: options };
64
157
  const compiled = compileV3Asset(asset);
65
- const evaluated = compiled.evaluate(stateOverrides);
158
+ const graph = compileV3Graph(asset.document.model);
159
+ const inputs = stateInputs(asset);
66
160
  const violations = [];
161
+ const seen = new Set();
162
+ const push = (v) => {
163
+ const key = JSON.stringify([v.code, v.part, v.axis]);
164
+ if (seen.has(key)) {
165
+ // Keep the worst distance for a part and axis across the states evaluated.
166
+ const prior = violations.find(x => x.code === v.code && x.part === v.part && x.axis === v.axis);
167
+ if ((v.mm ?? 0) > (prior.mm ?? 0))
168
+ Object.assign(prior, v);
169
+ return;
170
+ }
171
+ seen.add(key);
172
+ violations.push(v);
173
+ };
67
174
  if (!asset.occupancy) {
68
175
  violations.push({ code: 'OCCUPANCY_UNDECLARED', detail: 'the asset does not declare the volume it occupies or the face it stands on' });
69
- return { violations };
176
+ return { coverage: { method: 'defaults', inputs, states: 0, detail: 'nothing to inspect against' }, violations };
70
177
  }
71
- // The asset evaluation returns geometry only; the declared lengths are graph values, so read the graph itself.
72
- const values = compileV3Graph(asset.document.model).evaluate({
73
- ...asset.designInputs,
74
- ...asset.stateDefaults,
75
- ...stateOverrides
76
- }).values;
178
+ // Which states to evaluate.
179
+ let states;
180
+ let coverage;
181
+ if (opts.at) {
182
+ states = [opts.at];
183
+ coverage = { method: 'defaults', inputs, states: 1, detail: 'one state, as asked' };
184
+ }
185
+ else if (!inputs.length) {
186
+ states = [{}];
187
+ coverage = { method: 'proven', inputs, states: 1, detail: 'no state input; the rest pose is the only pose' };
188
+ }
189
+ else {
190
+ const unprovable = cornerExtremalBasis(asset, graph.dependence);
191
+ const maxCorners = opts.maxCornerInputs ?? 10;
192
+ const allCorners = inputs.length <= maxCorners;
193
+ const corners = [];
194
+ if (allCorners) {
195
+ for (let mask = 0; mask < 1 << inputs.length; mask++)
196
+ corners.push(Object.fromEntries(inputs.map((i, k) => [i.id, mask & (1 << k) ? i.max : i.min])));
197
+ }
198
+ else {
199
+ // Too many inputs to enumerate: the all-min and all-max corners and every single flip from each. Not all corners.
200
+ const lows = Object.fromEntries(inputs.map(i => [i.id, i.min]));
201
+ const highs = Object.fromEntries(inputs.map(i => [i.id, i.max]));
202
+ corners.push(lows, highs);
203
+ for (const i of inputs)
204
+ corners.push({ ...lows, [i.id]: i.max }, { ...highs, [i.id]: i.min });
205
+ unprovable.push(`${inputs.length} state inputs exceed the corner cap of ${maxCorners}; only ${corners.length} of ${2 ** inputs.length} corners were evaluated`);
206
+ }
207
+ if (!unprovable.length) {
208
+ states = corners;
209
+ coverage = {
210
+ method: 'proven',
211
+ inputs,
212
+ states: corners.length,
213
+ detail: `every state-dependent value reaches the geometry through corner-extremal operations (multilinear in the state inputs, or monotone functions of such values), so the extremes are at the ${corners.length} corners of the state box; all ${corners.length} evaluated`
214
+ };
215
+ }
216
+ else {
217
+ const steps = opts.sweepSteps ?? 9;
218
+ const sweeps = [];
219
+ for (const i of inputs)
220
+ for (let k = 0; k < steps; k++) {
221
+ const v = i.min + ((i.max - i.min) * k) / (steps - 1);
222
+ sweeps.push({ [i.id]: v });
223
+ }
224
+ states = [...corners, ...sweeps];
225
+ coverage = {
226
+ method: 'sampled',
227
+ inputs,
228
+ states: states.length,
229
+ sweepSteps: steps,
230
+ unprovable,
231
+ detail: `not proven (${unprovable.join('; ')}). Checked at ${states.length} states: ${corners.length} corners and each input in ${steps} steps with the others at their defaults. A violation may lie between these states; this is not a bound over the range`
232
+ };
233
+ }
234
+ }
235
+ for (const state of states) {
236
+ const evaluated = compiled.evaluate(state);
237
+ inspectOne(asset, graph, evaluated.geometry, state, push);
238
+ }
239
+ const values = graph.evaluate({ ...asset.designInputs, ...asset.stateDefaults }).values;
77
240
  const extent = {
78
241
  x: values[asset.occupancy.extent.x],
79
242
  y: values[asset.occupancy.extent.y],
80
243
  z: values[asset.occupancy.extent.z]
81
244
  };
82
- const placement = asset.occupancy.placement;
83
- const boxes = v3WorldBoxesOf(evaluated.geometry, v3WritersOf(asset));
245
+ return { extent, placement: asset.occupancy.placement, coverage, violations };
246
+ }
247
+ function inspectOne(asset, graph, geometry, state, push) {
248
+ const occupancy = asset.occupancy;
249
+ // The asset evaluation returns geometry only; the declared lengths are graph values, so read the graph itself.
250
+ const values = graph.evaluate({ ...asset.designInputs, ...asset.stateDefaults, ...state }).values;
251
+ const extent = {
252
+ x: values[occupancy.extent.x],
253
+ y: values[occupancy.extent.y],
254
+ z: values[occupancy.extent.z]
255
+ };
256
+ const placement = occupancy.placement;
257
+ const boxes = v3WorldBoxesOf(geometry, v3WritersOf(asset));
84
258
  const round = (v) => Math.round(v * 1e4) / 1e4;
85
259
  // The declared box: X and Z centred, Y from the floor (ADR-0065).
86
260
  const low = { x: -extent.x / 2, y: 0, z: -extent.z / 2 };
@@ -93,7 +267,7 @@ export function inspectV3Asset(asset, stateOverrides = {}) {
93
267
  const over = Math.max(box.centre[axis] + reach - high[axis], low[axis] - (box.centre[axis] - reach));
94
268
  if (over > SKIN) {
95
269
  const mm = round(over);
96
- violations.push({
270
+ push({
97
271
  code: 'PART_OUTSIDE_OCCUPANCY',
98
272
  part: box.part,
99
273
  axis,
@@ -110,7 +284,7 @@ export function inspectV3Asset(asset, stateOverrides = {}) {
110
284
  if (lowest && placement === 'floor') {
111
285
  const gap = lowest.centre.y - lowest.extent.y / 2 - low.y;
112
286
  if (gap > SKIN)
113
- violations.push({
287
+ push({
114
288
  code: 'PARTS_OFF_PLACEMENT_FACE',
115
289
  part: lowest.part,
116
290
  axis: 'y',
@@ -121,7 +295,7 @@ export function inspectV3Asset(asset, stateOverrides = {}) {
121
295
  if (highest && placement === 'ceiling') {
122
296
  const gap = high.y - (highest.centre.y + highest.extent.y / 2);
123
297
  if (gap > SKIN)
124
- violations.push({
298
+ push({
125
299
  code: 'PARTS_OFF_PLACEMENT_FACE',
126
300
  part: highest.part,
127
301
  axis: 'y',
@@ -129,6 +303,5 @@ export function inspectV3Asset(asset, stateOverrides = {}) {
129
303
  detail: `the highest part '${highest.part}' hangs ${round(gap)} mm below the ceiling the figure is declared to hang from`
130
304
  });
131
305
  }
132
- return { extent, placement, violations };
133
306
  }
134
307
  //# sourceMappingURL=v3-gate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"v3-gate.js","sourceRoot":"","sources":["../src/v3-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"v3-gate.js","sourceRoot":"","sources":["../src/v3-gate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAIvC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAc,MAAM,sBAAsB,CAAA;AAejF,yHAAyH;AACzH,MAAM,UAAU,cAAc,CAAC,QAA+B,EAAE,OAAoC,EAAE,UAAgC,EAAE;IACtI,MAAM,GAAG,GAAiB,EAAE,CAAA;IAC5B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YAAE,SAAQ;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAA;QAC5B,MAAM,KAAK,GACT,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU;YAC7B,CAAC,CAAC,CAAC,CAAC,CAAC,MAAO,GAAG,CAAC,EAAE,CAAC,CAAC,MAAO,EAAE,CAAC,CAAC,MAAO,GAAG,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAC7B,CAAC,CAAC,CAAC,CAAC,CAAC,OAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,OAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,OAAQ,GAAG,CAAC,CAAC;gBAClD,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS;oBAC9B,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAU,EAAE,CAAC,CAAC,YAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAU,EAAE,CAAC,CAAC,YAAa,CAAC,GAAG,CAAC,CAAC;oBACvG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,kBAAkB;wBACvC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,MAAO,EAAE,CAAC,CAAC,OAAQ,GAAG,CAAC,CAAC;wBAC7C,CAAC,CAAC,CAAC,CAAC,CAAC,KAAM,EAAE,CAAC,CAAC,MAAO,EAAE,CAAC,CAAC,KAAM,CAAC,CAAA;QAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5F,MAAM,GAAG,GAAe;YACtB,IAAI;YACJ,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE;YAC7D,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE;YACvD,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,CAAC;SACZ,CAAA;QACD,IAAI,OAAO,CAAC,MAAM;YAAE,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAG,CAA2B,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5H,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACf,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;IACzC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK;QAAE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAC9G,OAAO,OAAO,CAAA;AAChB,CAAC;AAiCD;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,UAAoC;IACtF,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAClD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7E,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,SAAQ;QAC9B,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;YACb,KAAK,OAAO,CAAC;YACb,KAAK,WAAW,CAAC;YACjB,KAAK,UAAU,CAAC;YAChB,KAAK,SAAS,CAAC;YACf,KAAK,UAAU,CAAC;YAChB,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY,CAAC;YAClB,KAAK,UAAU,CAAC;YAChB,KAAK,eAAe,CAAC;YACrB,KAAK,aAAa,CAAC;YACnB,KAAK,SAAS;gBACZ,MAAK;YACP,KAAK,OAAO,CAAC;YACb,KAAK,WAAW;gBACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;oBACpC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;wBACxC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;4BAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,sCAAsC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACjL,MAAK;YACP,KAAK,OAAO;gBACV,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,MAAM;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,yCAAyC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACtH,MAAK;YACP,KAAK,SAAS;gBACZ,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;wBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iCAAiC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAC7H,MAAK;YACP,KAAK,cAAc;gBACjB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mCAAmC,CAAC,CAAA;gBACzG,MAAK;YACP,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,0GAA0G;gBAC1G,oGAAoG;gBACpG,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;oBACxG,MAAK;gBACP,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBAClF,MAAM,MAAM,GAAa,EAAE,CAAA;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,GAAG,CAAC,CAAA;gBACvF,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAA;gBACjE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAA;gBACnE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAA;qBAChF,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,gCAAgC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;gBACzI,MAAK;YACP,CAAC;YACD;gBACE,gHAAgH;gBAChH,8GAA8G;gBAC9G,wFAAwF;gBACxF,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,eAAe,IAAI,CAAC,CAAC,EAAE,KAAK,eAAe,IAAI,CAAC,CAAC,EAAE,KAAK,cAAc,IAAI,CAAC,CAAC,EAAE,KAAK,cAAc,IAAI,CAAC,CAAC,EAAE,KAAK,kBAAkB;oBAAE,MAAK;gBAC9M,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,qCAAqC,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACxH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAmBD,+DAA+D;AAC/D,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;AACrH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,UAAqD,EAAE;IACpG,gDAAgD;IAChD,MAAM,IAAI,GAAqB,IAAI,IAAI,OAAO,IAAI,YAAY,IAAI,OAAO,IAAI,iBAAiB,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAE,OAA4B,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAiC,EAAE,CAAA;IAC1N,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACtC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAClD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,UAAU,GAAkB,EAAE,CAAA;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,IAAI,GAAG,CAAC,CAAc,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACpD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,2EAA2E;YAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAE,CAAA;YAChG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;gBAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC1D,OAAM;QACR,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC,CAAA;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,4EAA4E,EAAE,CAAC,CAAA;QACvI,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,EAAE,UAAU,EAAE,CAAA;IAClH,CAAC;IACD,4BAA4B;IAC5B,IAAI,MAAqC,CAAA;IACzC,IAAI,QAAoB,CAAA;IACxB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClB,QAAQ,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAA;IACrF,CAAC;SAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;QACb,QAAQ,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAA;IAC9G,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE,CAAA;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,CAAA;QAC9C,MAAM,OAAO,GAAkC,EAAE,CAAA;QACjD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE;gBAClD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACnG,CAAC;aAAM,CAAC;YACN,kHAAkH;YAClH,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAChE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACzB,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;YAC7F,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,0CAA0C,UAAU,UAAU,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,yBAAyB,CAAC,CAAA;QACjK,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,OAAO,CAAA;YAChB,QAAQ,GAAG;gBACT,MAAM,EAAE,QAAQ;gBAChB,MAAM;gBACN,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,2LAA2L,OAAO,CAAC,MAAM,kCAAkC,OAAO,CAAC,MAAM,YAAY;aAC9Q,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAA;YAClC,MAAM,MAAM,GAAkC,EAAE,CAAA;YAChD,KAAK,MAAM,CAAC,IAAI,MAAM;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;oBACrD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAC5B,CAAC;YACH,MAAM,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAA;YAChC,QAAQ,GAAG;gBACT,MAAM,EAAE,SAAS;gBACjB,MAAM;gBACN,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,UAAU,EAAE,KAAK;gBACjB,UAAU;gBACV,MAAM,EAAE,eAAe,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,YAAY,OAAO,CAAC,MAAM,8BAA8B,KAAK,wHAAwH;aAChQ,CAAA;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC1C,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,MAAM,CAAA;IACvF,MAAM,MAAM,GAAS;QACnB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAW;QAC7C,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAW;QAC7C,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAW;KAC9C,CAAA;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;AAC/E,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,KAAwC,EAAE,QAA+B,EAAE,KAA6B,EAAE,IAA8B;IAC1K,MAAM,SAAS,GAAG,KAAK,CAAC,SAAU,CAAA;IAClC,+GAA+G;IAC/G,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,MAAM,CAAA;IACjG,MAAM,MAAM,GAAS;QACnB,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAW;QACvC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAW;QACvC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAW;KACxC,CAAA;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAA;IACrC,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;IAEtD,kEAAkE;IAClE,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAA;IACxD,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAA;IAC9D,IAAI,MAA8B,CAAA;IAClC,IAAI,OAA+B,CAAA;IACnC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;YACpG,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;gBAChB,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;gBACtB,IAAI,CAAC;oBACH,IAAI,EAAE,wBAAwB;oBAC9B,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,IAAI;oBACJ,EAAE;oBACF,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,mCAAmC,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE,0FAA0F;iBAChL,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,GAAG,CAAA;QACpG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,GAAG,CAAA;IAC1G,CAAC;IACD,IAAI,MAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QACzD,IAAI,GAAG,GAAG,IAAI;YACZ,IAAI,CAAC;gBACH,IAAI,EAAE,0BAA0B;gBAChC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,GAAG;gBACT,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC;gBACd,MAAM,EAAE,oBAAoB,MAAM,CAAC,IAAI,YAAY,KAAK,CAAC,GAAG,CAAC,wDAAwD;aACtH,CAAC,CAAA;IACN,CAAC;IACD,IAAI,OAAO,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9D,IAAI,GAAG,GAAG,IAAI;YACZ,IAAI,CAAC;gBACH,IAAI,EAAE,0BAA0B;gBAChC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,GAAG;gBACT,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC;gBACd,MAAM,EAAE,qBAAqB,OAAO,CAAC,IAAI,WAAW,KAAK,CAAC,GAAG,CAAC,2DAA2D;aAC1H,CAAC,CAAA;IACN,CAAC;AACH,CAAC"}
@@ -45,7 +45,7 @@ export interface V3Pose {
45
45
  t: number[];
46
46
  }
47
47
  export interface V3Shape {
48
- provider: 'box' | 'cylinder' | 'roundedBox' | 'portal' | 'sphere' | 'polygon' | 'hollowBox' | 'frustum';
48
+ provider: 'box' | 'cylinder' | 'roundedBox' | 'portal' | 'sphere' | 'polygon' | 'hollowBox' | 'frustum' | 'ellipticCylinder' | 'roundedBoxXZ' | 'hollowBoxXZ';
49
49
  dimensions: Record<string, number>;
50
50
  profile?: Array<{
51
51
  id: string;
@@ -85,6 +85,11 @@ export interface V3GraphEvaluation {
85
85
  }
86
86
  export interface V3CompiledGraph {
87
87
  outputTypes: Record<string, V3ValueType>;
88
+ /**
89
+ * Which state inputs each value can change with (shape-dimension contract §2). A value absent here depends on
90
+ * design inputs and constants only. Part of the type, kept beside unit and frame rather than inside them.
91
+ */
92
+ dependence: Record<string, string[]>;
88
93
  order: string[];
89
94
  evaluate(input: Record<string, number>): V3GraphEvaluation;
90
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"v3-graph-types.d.ts","sourceRoot":"","sources":["../src/v3-graph-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"v3-graph-types.d.ts","sourceRoot":"","sources":["../src/v3-graph-types.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,24 @@
1
1
  import { V3ContractError as ContractError } from './v3-contract.ts';
2
2
  import type { V3CompiledGraph } from './v3-graph-types.ts';
3
+ /**
4
+ * What an operator does with an argument that depends on a state input (shape-dimension contract §2).
5
+ * follows the output depends on state too; shapes, poses and arithmetic
6
+ * refuses a state-dependent argument is a compile error; layout counts and pitches (structure and cost)
7
+ * An operator without a policy fails to compile the moment such an argument reaches it (STATE_POLICY). There is
8
+ * no list of banned operators to keep in sync: the policy is on the operator itself.
9
+ */
10
+ export type V3StatePolicy = 'follows' | 'refuses';
3
11
  export { ContractError };
12
+ /** Every operator's state policy, by name, for the guard test and for readers of the contract. */
13
+ export declare const V3_OPERATOR_STATE_POLICY: Readonly<Record<string, V3StatePolicy>>;
4
14
  /** Every operator the kernel knows, by name. `v3-graph.test.ts` holds the list still. */
5
15
  export declare const V3_OPERATORS: readonly string[];
6
16
  /**
7
- * The operators whose output is not affine in the **design** inputs. `geomean@1` is the only one
8
- * (ADR-0087 decision 2 addendum). Adding a second means another ADR conversation, and the test that
9
- * pins this list goes red until it has happened.
17
+ * The operators whose output is not affine in its scalar arguments. `geomean@1` (ADR-0087 decision 2 addendum) and
18
+ * `curve@1` (piecewise-linear, V3 designer's approval 2026-09-22). The converter feeds `curve@1` state inputs only, so
19
+ * every converted asset stays affine in the size; a curve of a design input is legal in the kernel but would take the
20
+ * 8-size regression check's ground away, and the gate's corner-extremal basis treats a non-monotone curve as unproven.
21
+ * Adding another means another ruling, and the test that pins this list goes red until it has happened.
10
22
  */
11
23
  export declare const V3_NON_AFFINE_OPERATORS: readonly string[];
12
24
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"v3-graph.d.ts","sourceRoot":"","sources":["../src/v3-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,qBAAqB,CAAA;AAWhF,OAAO,EAAE,aAAa,EAAE,CAAA;AA8nBxB,yFAAyF;AACzF,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAAoC,CAAA;AAE9E;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAAiC,CAAA;AAEtF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAAmC,CAAA;AAgB9F,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAE/D"}
1
+ {"version":3,"file":"v3-graph.d.ts","sourceRoot":"","sources":["../src/v3-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,qBAAqB,CAAA;AAIhF;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,CAAA;AASjD,OAAO,EAAE,aAAa,EAAE,CAAA;AA8sBxB,kGAAkG;AAClG,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAE5E,CAAA;AAED,yFAAyF;AACzF,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAAoC,CAAA;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAA4C,CAAA;AAEjG;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAAmC,CAAA;AAgB9F,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAE/D"}
package/dist/v3-graph.js CHANGED
@@ -106,6 +106,41 @@ const ops = {
106
106
  return [Math.pow(a.reduce((s, x) => s * x, 1), 1 / a.length)];
107
107
  }
108
108
  },
109
+ // A piecewise-linear curve through keys (V3 designer's approval, 2026-09-22): value(x) for x between two keys is the
110
+ // straight line between them; outside the keys the end value holds (as V2 `sampleChannel` and glTF do). Keys are
111
+ // constants or values: args are x, then at₀, v₀, at₁, v₁, … with the ats strictly increasing. Every `at` has x's
112
+ // dimension and every `v` one dimension, which is the output's. Linear only; a step curve is a different operator.
113
+ 'curve@1': {
114
+ ports: ['value'],
115
+ types(t, p) {
116
+ if (t.length < 5 || t.length % 2 === 0 || !t.every(Array.isArray))
117
+ fail('TYPE', p, 'x and at least two (at, value) key pairs, all scalars');
118
+ for (let i = 1; i < t.length; i += 2) {
119
+ if (!eq(t[i], t[0]))
120
+ fail('TYPE', p, `key ${(i - 1) / 2}: at must have the dimension of x`);
121
+ if (!eq(t[i + 1], t[2]))
122
+ fail('TYPE', p, `key ${(i - 1) / 2}: every value must have one dimension`);
123
+ }
124
+ return [t[2]];
125
+ },
126
+ run: (a, p) => {
127
+ const x = a[0];
128
+ const n = (a.length - 1) / 2;
129
+ const at = (k) => a[1 + 2 * k], val = (k) => a[2 + 2 * k];
130
+ for (let k = 1; k < n; k++)
131
+ if (!(at(k) > at(k - 1)))
132
+ fail('DOMAIN', p, `keys out of order: at[${k}] = ${at(k)} is not after at[${k - 1}] = ${at(k - 1)}`);
133
+ if (x <= at(0))
134
+ return [val(0)];
135
+ if (x >= at(n - 1))
136
+ return [val(n - 1)];
137
+ let k = 0;
138
+ while (k < n - 2 && at(k + 1) <= x)
139
+ k++;
140
+ const r = (x - at(k)) / (at(k + 1) - at(k));
141
+ return [val(k) + (val(k + 1) - val(k)) * r];
142
+ }
143
+ },
109
144
  'between@1': {
110
145
  ports: ['length', 'center'],
111
146
  types(t, p) {
@@ -394,9 +429,12 @@ Object.assign(ops, {
394
429
  requireTypes(t, [ratio, ratio, ratio, angle], p);
395
430
  return [transformType(n.params.from, n.params.to)];
396
431
  },
397
- run: ([ax, ay, az, q], p) => {
398
- if (Math.abs(Math.hypot(ax, ay, az) - 1) > 1e-9)
432
+ run: ([ax0, ay0, az0, q], p) => {
433
+ // A unit axis, written with six decimals by authors and converters: 1e-6 of slack, then normalised exactly.
434
+ const n = Math.hypot(ax0, ay0, az0);
435
+ if (Math.abs(n - 1) > 1e-6)
399
436
  fail('AXIS', p, 'unit axis required');
437
+ const ax = ax0 / n, ay = ay0 / n, az = az0 / n;
400
438
  const c = Math.cos(q), s = Math.sin(q), k = 1 - c;
401
439
  return [
402
440
  {
@@ -418,9 +456,10 @@ Object.assign(ops, {
418
456
  return [transformType(n.params.from, n.params.to)];
419
457
  },
420
458
  run: ([ax, ay, az, q], p) => {
421
- if (Math.abs(Math.hypot(ax, ay, az) - 1) > 1e-9)
459
+ const n = Math.hypot(ax, ay, az);
460
+ if (Math.abs(n - 1) > 1e-6)
422
461
  fail('AXIS', p, 'unit axis required');
423
- return [{ r: identity(), t: [ax * q, ay * q, az * q] }];
462
+ return [{ r: identity(), t: [(ax / n) * q, (ay / n) * q, (az / n) * q] }];
424
463
  }
425
464
  },
426
465
  'compose@1': {
@@ -526,6 +565,49 @@ Object.assign(ops, {
526
565
  return [{ provider: 'frustum', dimensions: { radiusTop, radiusBottom, height } }];
527
566
  }
528
567
  },
568
+ // Shape-dimension contract §1 (2026-09-22): every round thing has per-axis dimensions. The @1 forms stay valid and
569
+ // mean the equal case; @2 writes both axes. A renderer draws the ellipse or elliptic corner it is given.
570
+ 'cylinder-shape@2': {
571
+ ports: ['shape'],
572
+ params: ['frame'],
573
+ types(t, p, n) {
574
+ requireTypes(t, [length, length, length], p);
575
+ return [{ kind: 'shape', provider: 'ellipticCylinder', frame: n.params.frame }];
576
+ },
577
+ run: ([radiusX, radiusZ, length], p) => {
578
+ if (!(radiusX > 0 && radiusZ > 0 && length > 0))
579
+ fail('GEOMETRY_DOMAIN', p, 'positive radii and length required');
580
+ return [{ provider: 'ellipticCylinder', dimensions: { radiusX, radiusZ, length } }];
581
+ }
582
+ },
583
+ 'rounded-box@2': {
584
+ ports: ['shape'],
585
+ params: ['frame'],
586
+ types(t, p, n) {
587
+ requireTypes(t, Array(5).fill(length), p);
588
+ return [{ kind: 'shape', provider: 'roundedBoxXZ', frame: n.params.frame }];
589
+ },
590
+ run: ([width, height, depth, roundX, roundZ], p) => {
591
+ if (!(width > 0 && height > 0 && depth > 0 && roundX >= 0 && roundZ >= 0 && roundX <= width / 2 && roundZ <= depth / 2))
592
+ fail('GEOMETRY_DOMAIN', p, 'positive dimensions and corner semi-axes within half the section required');
593
+ return [{ provider: 'roundedBoxXZ', dimensions: { width, height, depth, roundX, roundZ } }];
594
+ }
595
+ },
596
+ 'hollow-box@2': {
597
+ ports: ['shape'],
598
+ params: ['frame'],
599
+ types(t, p, n) {
600
+ requireTypes(t, Array(8).fill(length), p);
601
+ return [{ kind: 'shape', provider: 'hollowBoxXZ', frame: n.params.frame }];
602
+ },
603
+ run: ([width, height, depth, roundX, roundZ, wallX, wallZ, floor], p) => {
604
+ if (!(width > 0 && height > 0 && depth > 0 && roundX >= 0 && roundZ >= 0 && roundX <= width / 2 && roundZ <= depth / 2))
605
+ fail('GEOMETRY_DOMAIN', p, 'positive dimensions and corner semi-axes within half the section required');
606
+ if (!(wallX > 0 && wallZ > 0 && wallX < width / 2 && wallZ < depth / 2 && floor >= 0 && floor < height))
607
+ fail('GEOMETRY_DOMAIN', p, 'walls thinner than half the section and a floor thinner than the height required');
608
+ return [{ provider: 'hollowBoxXZ', dimensions: { width, height, depth, roundX, roundZ, wallX, wallZ, floor } }];
609
+ }
610
+ },
529
611
  // A closed section in the local X–Z plane (profile x → X, profile y → Z, as V2 draws it), pushed along Y.
530
612
  'polygon-shape@1': {
531
613
  ports: ['shape'],
@@ -572,11 +654,11 @@ Object.assign(ops, {
572
654
  fail('TYPE', p, 'shape required');
573
655
  const names = t[0].provider === 'portal'
574
656
  ? ['top', 'bottomLeft', 'bottomRight', 'openingTop', 'frontTop']
575
- : ['box', 'roundedBox', 'sphere', 'hollowBox'].includes(t[0].provider)
657
+ : ['box', 'roundedBox', 'roundedBoxXZ', 'sphere', 'hollowBox', 'hollowBoxXZ'].includes(t[0].provider)
576
658
  ? ['left', 'right', 'bottom', 'top', 'back', 'front']
577
659
  : t[0].provider === 'polygon'
578
660
  ? ['bottom', 'top']
579
- : t[0].provider === 'frustum'
661
+ : t[0].provider === 'frustum' || t[0].provider === 'ellipticCylinder'
580
662
  ? ['start', 'end']
581
663
  : ['start', 'end', 'radialBottom'];
582
664
  if (!names.includes(n.params.name))
@@ -604,9 +686,9 @@ Object.assign(ops, {
604
686
  }
605
687
  : s.provider === 'polygon'
606
688
  ? { bottom: [0, -d.height / 2, 0], top: [0, d.height / 2, 0] }
607
- : s.provider === 'frustum'
608
- ? { start: [0, -d.height / 2, 0], end: [0, d.height / 2, 0] }
609
- : ['box', 'roundedBox', 'hollowBox'].includes(s.provider)
689
+ : s.provider === 'frustum' || s.provider === 'ellipticCylinder'
690
+ ? { start: [0, -(d.height ?? d.length) / 2, 0], end: [0, (d.height ?? d.length) / 2, 0] }
691
+ : ['box', 'roundedBox', 'roundedBoxXZ', 'hollowBox', 'hollowBoxXZ'].includes(s.provider)
610
692
  ? {
611
693
  left: [-d.width / 2, 0, 0],
612
694
  right: [d.width / 2, 0, 0],
@@ -632,14 +714,22 @@ Object.assign(ops, {
632
714
  });
633
715
  // Template members are values, not separately rendered placements.
634
716
  ops['member@1'] = { ...ops['place@1'], geometry: undefined };
717
+ // Shape-dimension contract §2: every operator declares what it does with a state-dependent argument. Layout
718
+ // counts and pitches are structure and cost, design-only; everything else may follow state.
719
+ for (const [name, op] of Object.entries(ops))
720
+ op.state = name === 'fit-pitch@1' || name === 'fixed-count@1' ? 'refuses' : 'follows';
721
+ /** Every operator's state policy, by name, for the guard test and for readers of the contract. */
722
+ export const V3_OPERATOR_STATE_POLICY = Object.freeze(Object.fromEntries(Object.entries(ops).map(([k, op]) => [k, op.state])));
635
723
  /** Every operator the kernel knows, by name. `v3-graph.test.ts` holds the list still. */
636
724
  export const V3_OPERATORS = Object.freeze(Object.keys(ops));
637
725
  /**
638
- * The operators whose output is not affine in the **design** inputs. `geomean@1` is the only one
639
- * (ADR-0087 decision 2 addendum). Adding a second means another ADR conversation, and the test that
640
- * pins this list goes red until it has happened.
726
+ * The operators whose output is not affine in its scalar arguments. `geomean@1` (ADR-0087 decision 2 addendum) and
727
+ * `curve@1` (piecewise-linear, V3 designer's approval 2026-09-22). The converter feeds `curve@1` state inputs only, so
728
+ * every converted asset stays affine in the size; a curve of a design input is legal in the kernel but would take the
729
+ * 8-size regression check's ground away, and the gate's corner-extremal basis treats a non-monotone curve as unproven.
730
+ * Adding another means another ruling, and the test that pins this list goes red until it has happened.
641
731
  */
642
- export const V3_NON_AFFINE_OPERATORS = Object.freeze(['geomean@1']);
732
+ export const V3_NON_AFFINE_OPERATORS = Object.freeze(['geomean@1', 'curve@1']);
643
733
  /**
644
734
  * The operators whose output is not affine in a **state** input: a rotation matrix is sin/cos in the joint
645
735
  * angle (motion contract, "two corrections"). Rigid in space, so placement stays rigid; the 8-size check is a
@@ -676,7 +766,7 @@ function compileInternal(source) {
676
766
  if (!Array.isArray(source[k]))
677
767
  fail('SCHEMA', k, 'array required');
678
768
  // Snapshot protects a compiled plan from later authoring mutations.
679
- const m = structuredClone(source), writers = new Map(), types = new Map(), stateful = new Set(), nodes = new Map(), order = [], active = [];
769
+ const m = structuredClone(source), writers = new Map(), types = new Map(), dependence = new Map(), nodes = new Map(), order = [], active = [];
680
770
  const assign = (name, owner) => {
681
771
  id(name, owner);
682
772
  if (writers.has(name))
@@ -690,7 +780,7 @@ function compileInternal(source) {
690
780
  if (p.role && !['design', 'state'].includes(p.role))
691
781
  fail('SCHEMA', p.id, 'unknown input role');
692
782
  if (p.role === 'state')
693
- stateful.add(p.id);
783
+ dependence.set(p.id, new Set([p.id]));
694
784
  if (num(p.min, p.id) > num(p.max, p.id))
695
785
  fail('RANGE', p.id, 'min > max');
696
786
  if (p.unit === 'count') {
@@ -739,12 +829,19 @@ function compileInternal(source) {
739
829
  return types.get(ref);
740
830
  });
741
831
  const resultTypes = op.types(inputTypes, n.id, n);
742
- const dependsOnState = n.args.some(ref => stateful.has(ref));
743
- if (dependsOnState && ['fit-pitch@1', 'fixed-count@1'].includes(n.op))
744
- fail('TOPOLOGY_STATE', n.id, 'layout must depend on design inputs only');
832
+ const depends = new Set();
833
+ for (const ref of n.args)
834
+ for (const s of dependence.get(ref) ?? [])
835
+ depends.add(s);
836
+ if (depends.size) {
837
+ if (op.state === undefined)
838
+ fail('STATE_POLICY', n.id, `${n.op} declares no policy for a state-dependent argument (${[...depends].join(', ')})`);
839
+ if (op.state === 'refuses')
840
+ fail('TOPOLOGY_STATE', n.id, `${n.op} must depend on design inputs only; it depends on ${[...depends].join(', ')}`);
841
+ }
745
842
  op.ports.forEach((p, i) => types.set(n.outputs[p], resultTypes[i]));
746
- if (dependsOnState)
747
- Object.values(n.outputs).forEach(ref => stateful.add(ref));
843
+ if (depends.size)
844
+ Object.values(n.outputs).forEach(ref => dependence.set(ref, new Set(depends)));
748
845
  active.pop();
749
846
  visited.add(name);
750
847
  order.push(n);
@@ -753,6 +850,7 @@ function compileInternal(source) {
753
850
  visit(name);
754
851
  return {
755
852
  outputTypes: Object.fromEntries([...types].map(([k, v]) => [k, structuredClone(v)])),
853
+ dependence: Object.fromEntries([...dependence].map(([k, v]) => [k, [...v].sort()])),
756
854
  order: order.map(n => n.id),
757
855
  evaluate(input) {
758
856
  fields(input, m.inputs.map(p => p.id), [], 'input values');