@triforge/physics-core 0.1.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 (45) hide show
  1. package/dist/cloth/ClothSimulator.d.ts +127 -0
  2. package/dist/cloth/ClothSimulator.d.ts.map +1 -0
  3. package/dist/cloth/ClothSimulator.js +355 -0
  4. package/dist/cloth/ClothSimulator.js.map +1 -0
  5. package/dist/collision/BaseCollider.d.ts +19 -0
  6. package/dist/collision/BaseCollider.d.ts.map +1 -0
  7. package/dist/collision/BaseCollider.js +14 -0
  8. package/dist/collision/BaseCollider.js.map +1 -0
  9. package/dist/collision/CapsuleCollider.d.ts +29 -0
  10. package/dist/collision/CapsuleCollider.d.ts.map +1 -0
  11. package/dist/collision/CapsuleCollider.js +41 -0
  12. package/dist/collision/CapsuleCollider.js.map +1 -0
  13. package/dist/collision/PlaneCollider.d.ts +30 -0
  14. package/dist/collision/PlaneCollider.d.ts.map +1 -0
  15. package/dist/collision/PlaneCollider.js +38 -0
  16. package/dist/collision/PlaneCollider.js.map +1 -0
  17. package/dist/collision/SphereCollider.d.ts +25 -0
  18. package/dist/collision/SphereCollider.d.ts.map +1 -0
  19. package/dist/collision/SphereCollider.js +36 -0
  20. package/dist/collision/SphereCollider.js.map +1 -0
  21. package/dist/forces/WindForce.d.ts +39 -0
  22. package/dist/forces/WindForce.d.ts.map +1 -0
  23. package/dist/forces/WindForce.js +40 -0
  24. package/dist/forces/WindForce.js.map +1 -0
  25. package/dist/index.d.ts +14 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +10 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/rigidbody/RigidBodyConstraints.d.ts +179 -0
  30. package/dist/rigidbody/RigidBodyConstraints.d.ts.map +1 -0
  31. package/dist/rigidbody/RigidBodyConstraints.js +480 -0
  32. package/dist/rigidbody/RigidBodyConstraints.js.map +1 -0
  33. package/dist/rigidbody/RigidBodyWorld.d.ts +136 -0
  34. package/dist/rigidbody/RigidBodyWorld.d.ts.map +1 -0
  35. package/dist/rigidbody/RigidBodyWorld.js +319 -0
  36. package/dist/rigidbody/RigidBodyWorld.js.map +1 -0
  37. package/dist/softbody/SoftBodySimulator.d.ts +103 -0
  38. package/dist/softbody/SoftBodySimulator.d.ts.map +1 -0
  39. package/dist/softbody/SoftBodySimulator.js +311 -0
  40. package/dist/softbody/SoftBodySimulator.js.map +1 -0
  41. package/dist/utils/noise.d.ts +3 -0
  42. package/dist/utils/noise.d.ts.map +1 -0
  43. package/dist/utils/noise.js +20 -0
  44. package/dist/utils/noise.js.map +1 -0
  45. package/package.json +45 -0
@@ -0,0 +1,319 @@
1
+ import { Vector3, Quaternion } from 'three';
2
+ /**
3
+ * RigidBody — a single rigid-body object managed by RigidBodyWorld.
4
+ *
5
+ * All scalar physics parameters live in `parameters` for GSAP/st-keyframe:
6
+ * gsap.to(body.parameters, { restitution: 1, duration: 0.5 })
7
+ */
8
+ export class RigidBody {
9
+ constructor(opts = {}) {
10
+ /** Accumulated force for this step. */
11
+ this._force = new Vector3();
12
+ /** Accumulated torque for this step. */
13
+ this._torque = new Vector3();
14
+ this.shape = opts.shape ?? 'sphere';
15
+ const mass = opts.mass ?? 1;
16
+ let sx, sy, sz;
17
+ if (Array.isArray(opts.size)) {
18
+ ;
19
+ [sx, sy, sz] = opts.size;
20
+ }
21
+ else {
22
+ sx = sy = sz = opts.size ?? 0.5;
23
+ }
24
+ this.parameters = {
25
+ mass: mass,
26
+ linearDamping: opts.linearDamping ?? 0.01,
27
+ angularDamping: opts.angularDamping ?? 0.05,
28
+ restitution: opts.restitution ?? 0.3,
29
+ sizeX: sx,
30
+ sizeY: sy,
31
+ sizeZ: sz,
32
+ halfHeight: opts.halfHeight ?? 1.0,
33
+ };
34
+ const p = opts.position ?? [0, 0, 0];
35
+ const v = opts.velocity ?? [0, 0, 0];
36
+ this.position = new Vector3(p[0], p[1], p[2]);
37
+ this.velocity = new Vector3(v[0], v[1], v[2]);
38
+ this.orientation = new Quaternion();
39
+ this.angularVel = new Vector3();
40
+ this.isStatic = mass === 0;
41
+ }
42
+ /** Apply a force (N) at the body's centre of mass. */
43
+ applyForce(fx, fy, fz) {
44
+ if (this.isStatic)
45
+ return;
46
+ this._force.x += fx;
47
+ this._force.y += fy;
48
+ this._force.z += fz;
49
+ }
50
+ /** Apply an instantaneous impulse (kg·m/s). */
51
+ applyImpulse(ix, iy, iz) {
52
+ if (this.isStatic)
53
+ return;
54
+ const invMass = 1 / Math.max(0.0001, this.parameters.mass);
55
+ this.velocity.x += ix * invMass;
56
+ this.velocity.y += iy * invMass;
57
+ this.velocity.z += iz * invMass;
58
+ }
59
+ /** Apply a torque impulse (kg·m²/s). */
60
+ applyTorqueImpulse(tx, ty, tz) {
61
+ if (this.isStatic)
62
+ return;
63
+ this.angularVel.x += tx;
64
+ this.angularVel.y += ty;
65
+ this.angularVel.z += tz;
66
+ }
67
+ /** Consume and reset accumulated forces. Returns force vector. */
68
+ _consumeForce() {
69
+ const f = this._force.clone();
70
+ this._force.set(0, 0, 0);
71
+ return f;
72
+ }
73
+ _consumeTorque() {
74
+ const t = this._torque.clone();
75
+ this._torque.set(0, 0, 0);
76
+ return t;
77
+ }
78
+ /**
79
+ * Approximate bounding radius (for broad-phase).
80
+ */
81
+ get boundingRadius() {
82
+ const { sizeX, sizeY, sizeZ, halfHeight } = this.parameters;
83
+ if (this.shape === 'sphere')
84
+ return sizeX;
85
+ if (this.shape === 'capsule')
86
+ return sizeX + halfHeight;
87
+ return Math.sqrt(sizeX * sizeX + sizeY * sizeY + sizeZ * sizeZ);
88
+ }
89
+ }
90
+ /**
91
+ * RigidBodyWorld — Blender-matched rigid body simulation.
92
+ * Blender: Rigid Body World (Scene Properties).
93
+ *
94
+ * Impulse-based solver with sphere/box/capsule collision shapes.
95
+ * Supports plane floor, body–body overlap resolution, gravity.
96
+ *
97
+ * Usage:
98
+ * ```typescript
99
+ * const world = new RigidBodyWorld({ gravity: [0,-9.8,0] })
100
+ * const ball = world.createBody({ shape: 'sphere', mass: 1, position: [0,5,0] })
101
+ * const floor = world.createBody({ shape: 'box', mass: 0, size: [10,0.1,10] })
102
+ *
103
+ * // In animation loop:
104
+ * world.step(dt)
105
+ * mesh.position.copy(ball.position)
106
+ * mesh.quaternion.copy(ball.orientation)
107
+ * ```
108
+ */
109
+ export class RigidBodyWorld {
110
+ constructor(opts = {}) {
111
+ this._bodies = [];
112
+ this._constraints = [];
113
+ /** Simulation clock. */
114
+ this.time = 0;
115
+ const g = opts.gravity ?? [0, -9.8, 0];
116
+ this.parameters = {
117
+ gravityX: g[0],
118
+ gravityY: g[1],
119
+ gravityZ: g[2],
120
+ substeps: opts.substeps ?? 4,
121
+ };
122
+ }
123
+ /**
124
+ * Create a new rigid body and add it to the world.
125
+ */
126
+ createBody(opts = {}) {
127
+ const body = new RigidBody(opts);
128
+ this._bodies.push(body);
129
+ return body;
130
+ }
131
+ /**
132
+ * Remove a body from the world.
133
+ */
134
+ removeBody(body) {
135
+ const i = this._bodies.indexOf(body);
136
+ if (i !== -1)
137
+ this._bodies.splice(i, 1);
138
+ }
139
+ /** All active bodies. */
140
+ get bodies() { return this._bodies; }
141
+ /** Add a constraint to the world. */
142
+ addConstraint(c) { this._constraints.push(c); }
143
+ /** Remove a constraint. */
144
+ removeConstraint(c) {
145
+ const i = this._constraints.indexOf(c);
146
+ if (i !== -1)
147
+ this._constraints.splice(i, 1);
148
+ }
149
+ /** All active constraints. */
150
+ get constraints() { return this._constraints; }
151
+ /**
152
+ * Advance the simulation by dt seconds.
153
+ * Call once per animation frame (dt ≈ 1/60).
154
+ */
155
+ step(dt) {
156
+ this.time += dt;
157
+ const sub = Math.max(1, Math.round(this.parameters.substeps));
158
+ const subDt = dt / sub;
159
+ for (let s = 0; s < sub; s++)
160
+ this._substep(subDt);
161
+ }
162
+ // ── Internal ──────────────────────────────────────────────────────────────
163
+ _substep(dt) {
164
+ const gx = this.parameters.gravityX;
165
+ const gy = this.parameters.gravityY;
166
+ const gz = this.parameters.gravityZ;
167
+ // Integrate velocities + positions
168
+ for (const b of this._bodies) {
169
+ if (b.isStatic)
170
+ continue;
171
+ const invMass = 1 / Math.max(0.0001, b.parameters.mass);
172
+ const ld = 1 - b.parameters.linearDamping;
173
+ const ad = 1 - b.parameters.angularDamping;
174
+ // Gravity + user forces
175
+ const f = b._consumeForce();
176
+ b.velocity.x = (b.velocity.x + (gx + f.x * invMass) * dt) * ld;
177
+ b.velocity.y = (b.velocity.y + (gy + f.y * invMass) * dt) * ld;
178
+ b.velocity.z = (b.velocity.z + (gz + f.z * invMass) * dt) * ld;
179
+ // Angular velocity
180
+ const tq = b._consumeTorque();
181
+ b.angularVel.x = (b.angularVel.x + tq.x * invMass * dt) * ad;
182
+ b.angularVel.y = (b.angularVel.y + tq.y * invMass * dt) * ad;
183
+ b.angularVel.z = (b.angularVel.z + tq.z * invMass * dt) * ad;
184
+ // Integrate position
185
+ b.position.x += b.velocity.x * dt;
186
+ b.position.y += b.velocity.y * dt;
187
+ b.position.z += b.velocity.z * dt;
188
+ // Integrate orientation using angular velocity
189
+ if (b.angularVel.lengthSq() > 1e-10) {
190
+ const angle = b.angularVel.length() * dt;
191
+ const axis = b.angularVel.clone().normalize();
192
+ const dq = new Quaternion().setFromAxisAngle(axis, angle);
193
+ b.orientation.premultiply(dq).normalize();
194
+ }
195
+ }
196
+ // Collision resolution (narrow phase)
197
+ this._resolveCollisions();
198
+ // Constraint solving
199
+ for (const c of this._constraints)
200
+ c.solve();
201
+ }
202
+ _resolveCollisions() {
203
+ // Body–body collisions (O(n²) broad+narrow phase)
204
+ for (let i = 0; i < this._bodies.length; i++) {
205
+ for (let j = i + 1; j < this._bodies.length; j++) {
206
+ this._resolveBodyPair(this._bodies[i], this._bodies[j]);
207
+ }
208
+ }
209
+ }
210
+ _resolveBodyPair(a, b) {
211
+ if (a.isStatic && b.isStatic)
212
+ return;
213
+ const dx = b.position.x - a.position.x;
214
+ const dy = b.position.y - a.position.y;
215
+ const dz = b.position.z - a.position.z;
216
+ const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
217
+ // Approximate collision using bounding spheres first
218
+ const sumR = a.boundingRadius + b.boundingRadius;
219
+ if (dist >= sumR)
220
+ return;
221
+ // Narrow phase by shape pair
222
+ const pen = this._penetrationDepth(a, b, dist);
223
+ if (pen <= 0)
224
+ return;
225
+ const nx = dist > 1e-8 ? dx / dist : 0;
226
+ const ny = dist > 1e-8 ? dy / dist : 1;
227
+ const nz = dist > 1e-8 ? dz / dist : 0;
228
+ // Positional correction
229
+ const totalMass = (a.isStatic ? 0 : a.parameters.mass) + (b.isStatic ? 0 : b.parameters.mass);
230
+ if (totalMass <= 0)
231
+ return;
232
+ const wa = a.isStatic ? 0 : b.parameters.mass / totalMass;
233
+ const wb = b.isStatic ? 0 : a.parameters.mass / totalMass;
234
+ const slop = 0.001; // penetration allowance
235
+ const corr = Math.max(pen - slop, 0) * 0.8;
236
+ if (!a.isStatic) {
237
+ a.position.x -= nx * corr * wa;
238
+ a.position.y -= ny * corr * wa;
239
+ a.position.z -= nz * corr * wa;
240
+ }
241
+ if (!b.isStatic) {
242
+ b.position.x += nx * corr * wb;
243
+ b.position.y += ny * corr * wb;
244
+ b.position.z += nz * corr * wb;
245
+ }
246
+ // Velocity resolution (impulse)
247
+ const relVx = b.velocity.x - a.velocity.x;
248
+ const relVy = b.velocity.y - a.velocity.y;
249
+ const relVz = b.velocity.z - a.velocity.z;
250
+ const relVn = relVx * nx + relVy * ny + relVz * nz;
251
+ if (relVn >= 0)
252
+ return; // already separating
253
+ const e = Math.min(a.parameters.restitution, b.parameters.restitution);
254
+ const mA = a.isStatic ? 0 : 1 / a.parameters.mass;
255
+ const mB = b.isStatic ? 0 : 1 / b.parameters.mass;
256
+ const j = -(1 + e) * relVn / (mA + mB);
257
+ if (!a.isStatic) {
258
+ a.velocity.x -= j * nx * mA;
259
+ a.velocity.y -= j * ny * mA;
260
+ a.velocity.z -= j * nz * mA;
261
+ }
262
+ if (!b.isStatic) {
263
+ b.velocity.x += j * nx * mB;
264
+ b.velocity.y += j * ny * mB;
265
+ b.velocity.z += j * nz * mB;
266
+ }
267
+ }
268
+ /** Returns penetration depth (> 0 means penetrating) for shape pair. */
269
+ _penetrationDepth(a, b, dist) {
270
+ // Sphere–sphere
271
+ if (a.shape === 'sphere' && b.shape === 'sphere') {
272
+ return a.parameters.sizeX + b.parameters.sizeX - dist;
273
+ }
274
+ // Sphere–box (AABB in world-space, unrotated approximation)
275
+ if (a.shape === 'sphere' && b.shape === 'box')
276
+ return this._sphereBoxPen(a, b);
277
+ if (a.shape === 'box' && b.shape === 'sphere')
278
+ return this._sphereBoxPen(b, a);
279
+ // Box–box (AABB)
280
+ if (a.shape === 'box' && b.shape === 'box')
281
+ return this._boxBoxPen(a, b);
282
+ // Capsule–sphere
283
+ if (a.shape === 'capsule' && b.shape === 'sphere')
284
+ return this._capsuleSpherePen(a, b);
285
+ if (a.shape === 'sphere' && b.shape === 'capsule')
286
+ return this._capsuleSpherePen(b, a);
287
+ // Fallback: bounding sphere
288
+ return a.boundingRadius + b.boundingRadius - dist;
289
+ }
290
+ _sphereBoxPen(sphere, box) {
291
+ const r = sphere.parameters.sizeX;
292
+ const hx = box.parameters.sizeX;
293
+ const hy = box.parameters.sizeY;
294
+ const hz = box.parameters.sizeZ;
295
+ const dx = Math.max(0, Math.abs(sphere.position.x - box.position.x) - hx);
296
+ const dy = Math.max(0, Math.abs(sphere.position.y - box.position.y) - hy);
297
+ const dz = Math.max(0, Math.abs(sphere.position.z - box.position.z) - hz);
298
+ const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
299
+ return r - dist;
300
+ }
301
+ _boxBoxPen(a, b) {
302
+ const ox = Math.abs(a.position.x - b.position.x) - (a.parameters.sizeX + b.parameters.sizeX);
303
+ const oy = Math.abs(a.position.y - b.position.y) - (a.parameters.sizeY + b.parameters.sizeY);
304
+ const oz = Math.abs(a.position.z - b.position.z) - (a.parameters.sizeZ + b.parameters.sizeZ);
305
+ return -Math.max(ox, oy, oz);
306
+ }
307
+ _capsuleSpherePen(capsule, sphere) {
308
+ const r = capsule.parameters.sizeX + sphere.parameters.sizeX;
309
+ const hh = capsule.parameters.halfHeight;
310
+ // Closest point on capsule segment (vertical, unrotated) to sphere centre
311
+ const localY = Math.max(-hh, Math.min(hh, sphere.position.y - capsule.position.y));
312
+ const dx = sphere.position.x - capsule.position.x;
313
+ const dy = sphere.position.y - (capsule.position.y + localY);
314
+ const dz = sphere.position.z - capsule.position.z;
315
+ const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
316
+ return r - dist;
317
+ }
318
+ }
319
+ //# sourceMappingURL=RigidBodyWorld.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RigidBodyWorld.js","sourceRoot":"","sources":["../../src/rigidbody/RigidBodyWorld.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import { BufferGeometry } from 'three';
2
+ import type { BaseCollider } from '../collision/BaseCollider.js';
3
+ import type { WindForce } from '../forces/WindForce.js';
4
+ export interface SoftBodySimulatorOptions {
5
+ /** Spring stiffness [0–1]. Blender: Soft Body > Edges > Pull / Push. Default 0.9. */
6
+ stiffness?: number;
7
+ /** Pressure stiffness for closed-volume bodies [0–∞]. Blender: Soft Body > Self Collision. Default 0. */
8
+ pressure?: number;
9
+ /** Velocity damping [0–1]. Blender: Soft Body > Edges > Damp. Default 0.05. */
10
+ damping?: number;
11
+ /** Gravity acceleration (m/s²). Blender: Field Weights > Gravity. Default 9.8. */
12
+ gravity?: number;
13
+ /** Constraint solver iterations per step. Default 10. */
14
+ iterations?: number;
15
+ /** Simulation substeps per frame. Default 4. */
16
+ substeps?: number;
17
+ /** Particle mass. Blender: Soft Body > Object > Mass. Default 1.0. */
18
+ mass?: number;
19
+ /** Shape matching stiffness [0–1]. Blender: Soft Body > Self Collision > Ball Stiff. Default 0. */
20
+ shapeMatchStiffness?: number;
21
+ }
22
+ /**
23
+ * SoftBodySimulator — Blender-matched soft body physics.
24
+ * Blender: Soft Body modifier.
25
+ *
26
+ * A tetrahedral-spring soft body solver using Verlet integration.
27
+ * Suitable for jelly-like objects, blobs, squash-and-stretch deformation.
28
+ *
29
+ * Workflow:
30
+ * 1. Create SoftBodySimulator
31
+ * 2. Call setFromGeometry(geometry) — reads mesh vertices
32
+ * 3. Add colliders: addCollider(c)
33
+ * 4. Call step(dt) every frame
34
+ * 5. Call apply(geometry) to write positions back
35
+ *
36
+ * All parameters live on `parameters` for GSAP / st-keyframe:
37
+ * gsap.to(softBody.parameters, { stiffness: 0.2, duration: 1 })
38
+ */
39
+ export declare class SoftBodySimulator {
40
+ /** All scalar simulation parameters — GSAP/st-keyframe compatible. */
41
+ parameters: {
42
+ stiffness: number;
43
+ pressure: number;
44
+ damping: number;
45
+ gravity: number;
46
+ iterations: number;
47
+ substeps: number;
48
+ mass: number;
49
+ shapeMatchStiffness: number;
50
+ };
51
+ /** Number of vertices in the simulated mesh. */
52
+ vertexCount: number;
53
+ /** Current positions [x0,y0,z0, x1,y1,z1, ...] */
54
+ private _pos;
55
+ /** Previous positions (Verlet). */
56
+ private _prev;
57
+ /** Pinned vertex mask — pinned vertices never move. */
58
+ private _pinned;
59
+ /** Springs: packed triples [iBase, jBase, restLen, ...] */
60
+ private _springs;
61
+ /** Rest-pose positions for shape matching. */
62
+ private _rest;
63
+ /** Rest volume for pressure springs. */
64
+ private _restVolume;
65
+ private _wind;
66
+ private _colliders;
67
+ /** Simulation clock. */
68
+ time: number;
69
+ constructor(opts?: SoftBodySimulatorOptions);
70
+ /**
71
+ * Load mesh vertices from a BufferGeometry.
72
+ * Builds edge springs from the geometry's index buffer.
73
+ */
74
+ setFromGeometry(geometry: BufferGeometry): void;
75
+ /**
76
+ * Load from a flat [x,y,z,...] array with an index array.
77
+ */
78
+ setFromArray(positions: ArrayLike<number>, indices: ArrayLike<number>): void;
79
+ pin(index: number): void;
80
+ unpin(index: number): void;
81
+ addCollider(c: BaseCollider): void;
82
+ removeCollider(c: BaseCollider): void;
83
+ setWind(w: WindForce | null): void;
84
+ /**
85
+ * Advance the simulation by dt seconds.
86
+ * Call once per animation frame; dt ≈ 1/60.
87
+ */
88
+ step(dt: number): void;
89
+ /**
90
+ * Write simulated positions back to a BufferGeometry's 'position' attribute.
91
+ */
92
+ apply(geometry: BufferGeometry): void;
93
+ private _substep;
94
+ private _solveEdgeSprings;
95
+ private _solvePressure;
96
+ private _solveShapeMatch;
97
+ private _centroid;
98
+ private _restCentroid;
99
+ private _computeVolume;
100
+ private _buildEdgeSprings;
101
+ private _buildEdgeSpringsFromIndex;
102
+ }
103
+ //# sourceMappingURL=SoftBodySimulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SoftBodySimulator.d.ts","sourceRoot":"","sources":["../../src/softbody/SoftBodySimulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAmB,MAAM,OAAO,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEvD,MAAM,WAAW,wBAAwB;IACvC,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yGAAyG;IACzG,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mGAAmG;IACnG,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,iBAAiB;IAC5B,sEAAsE;IACtE,UAAU,EAAE;QACV,SAAS,EAAW,MAAM,CAAA;QAC1B,QAAQ,EAAY,MAAM,CAAA;QAC1B,OAAO,EAAa,MAAM,CAAA;QAC1B,OAAO,EAAa,MAAM,CAAA;QAC1B,UAAU,EAAU,MAAM,CAAA;QAC1B,QAAQ,EAAY,MAAM,CAAA;QAC1B,IAAI,EAAgB,MAAM,CAAA;QAC1B,mBAAmB,EAAE,MAAM,CAAA;KAC5B,CAAA;IAED,gDAAgD;IAChD,WAAW,SAAI;IAEf,kDAAkD;IAClD,OAAO,CAAC,IAAI,CAAgB;IAC5B,mCAAmC;IACnC,OAAO,CAAC,KAAK,CAAe;IAC5B,uDAAuD;IACvD,OAAO,CAAC,OAAO,CAAa;IAE5B,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAoC;IACpD,8CAA8C;IAC9C,OAAO,CAAC,KAAK,CAAe;IAC5B,wCAAwC;IACxC,OAAO,CAAC,WAAW,CAAI;IAEvB,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,UAAU,CAAuB;IAEzC,wBAAwB;IACxB,IAAI,SAAI;gBAEI,IAAI,GAAE,wBAA6B;IAe/C;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAqB/C;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;IAgB5E,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAGxB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM1B,WAAW,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI;IAClC,cAAc,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI;IAIrC,OAAO,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAIlC;;;OAGG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAOtB;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAarC,OAAO,CAAC,QAAQ;IAqDhB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,0BAA0B;CAuBnC"}