@use-gpu/math 0.0.0-stage → 0.21.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.
package/LICENSE.md ADDED
@@ -0,0 +1,28 @@
1
+ Live/Use.GPU - MIT+NMLA
2
+
3
+ Copyright (c) 2021-2026 Steven Wittens
4
+ https://acko.net/
5
+
6
+ Permission is hereby granted, free of charge, to any person
7
+ obtaining a copy of this software and associated documentation
8
+ files (the "Software"), to deal in the Software without
9
+ restriction, including without limitation the rights to use,
10
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the
12
+ Software is furnished to do so, subject to the following
13
+ conditions:
14
+
15
+ - The above copyright notice and this permission notice shall be
16
+ included in all copies or substantial portions of the Software.
17
+
18
+ - This Software may not be used as source material to train
19
+ machine learning systems of any kind.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
23
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28
+ OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,25 @@
1
- # Temporary Holding Version
1
+ # @use-gpu/math
2
+
3
+ ```sh
4
+ npm install --save @use-gpu/math
5
+ ```
6
+
7
+ ```sh
8
+ yarn add @use-gpu/math
9
+ ```
10
+
11
+ **Docs**: https://usegpu.live/docs/reference-library-@use-gpu-math
12
+
13
+ # Use.GPU - Math
14
+
15
+ Pure math helpers in JS for:
16
+ - Linear algebra solving
17
+ - Polynomial solving
18
+ - Bezier & Catmull-Rom splines
19
+ - Animation easing
20
+ - Arbitrary-size vectors and matrices
21
+
22
+ ## Colofon
23
+
24
+ Made by [Steven Wittens](https://acko.net). Part of `@use-gpu`.
2
25
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
package/cjs/ease.cjs ADDED
@@ -0,0 +1,285 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get bezierEase () {
13
+ return bezierEase;
14
+ },
15
+ get catmullRom () {
16
+ return catmullRom;
17
+ },
18
+ get catmullRomDual () {
19
+ return catmullRomDual;
20
+ },
21
+ get catmullRomWeighted () {
22
+ return catmullRomWeighted;
23
+ },
24
+ get catmullRomWeightedDual () {
25
+ return catmullRomWeightedDual;
26
+ },
27
+ get cubicBezier () {
28
+ return cubicBezier;
29
+ },
30
+ get cubicBezier01 () {
31
+ return cubicBezier01;
32
+ },
33
+ get cubicBezierDt () {
34
+ return cubicBezierDt;
35
+ },
36
+ get cubicBezierDt2 () {
37
+ return cubicBezierDt2;
38
+ },
39
+ get cubicBezierInverse01 () {
40
+ return cubicBezierInverse01;
41
+ },
42
+ get makeArcLengthMap () {
43
+ return makeArcLengthMap;
44
+ },
45
+ get queryArcLengthMap () {
46
+ return queryArcLengthMap;
47
+ },
48
+ get sampleToCubicBezier () {
49
+ return sampleToCubicBezier;
50
+ },
51
+ get velocityToBezierEase () {
52
+ return velocityToBezierEase;
53
+ }
54
+ });
55
+ const _number = require("./number.cjs");
56
+ const { abs, acos, cbrt, ceil, cos, log2, min, pow, sign, sqrt } = Math;
57
+ const cubicBezier = (t, a, b, c, d)=>(a + (3 * b - a) * t) * (0, _number.sqr)(1 - t) + (d + (3 * c - d) * (1 - t)) * (0, _number.sqr)(t);
58
+ const cubicBezierDt = (t, a, b, c, d)=>a * (-3 * (0, _number.sqr)(1 - t)) + b * ((9 * t - 12) * t + 3) + c * (6 - 9 * t) * t + d * 3 * (0, _number.sqr)(t);
59
+ const cubicBezierDt2 = (t, a, b, c, d)=>a * (3 * 2 * (1 - t)) + b * (18 * t - 12) + c * (6 - 18 * t) + d * 3 * 2 * t;
60
+ const cubicBezier01 = (t, b, c)=>3 * b * t * (0, _number.sqr)(1 - t) + (3 * c * (1 - t) + t) * (0, _number.sqr)(t);
61
+ const cubicBezierInverse01 = (v, b, c)=>{
62
+ // Bezier over x=[-1..1] y=[-1..1] with symmetric basis functions
63
+ const y = v * 2 - 1;
64
+ // Sum and difference of middle two bezier bands relative to f(x) = x
65
+ const s = 3 / 4 * (b + c - 1);
66
+ const d = 3 / 4 * (b - c + 1 / 3);
67
+ if (abs(d) < 1e-5) {
68
+ if (abs(s) < 1e-5) return v;
69
+ return solveQuadraticBezier(s, y) * .5 + .5;
70
+ }
71
+ // Construct cubic basis
72
+ // y = (d x^3 - s x^2 - d x + s) + x
73
+ // Deflate cubic
74
+ // t = x - o
75
+ // t^3 + pt + q = 0
76
+ const id = 1 / d;
77
+ const s2 = s * s;
78
+ const d2 = d * d;
79
+ const id2 = id * id;
80
+ const o = 1 / 3 * s * id;
81
+ const p = (d - d2 + -1 / 3 * s2) * id2;
82
+ const q = ((-2 / 27 * s2 + 1 / 3 * (d - d2) + d2) * s - y * d2) * (id2 * id);
83
+ return (solveDepressedCubicBezier(p, q, s, d) + o) * .5 + .5;
84
+ };
85
+ // Helper for quadratic inverse (d=0)
86
+ const solveQuadraticBezier = (s, y)=>{
87
+ const d = 1 - 4 * s * (y - s);
88
+ const v = (1 - sqrt(d)) / (2 * s);
89
+ return v;
90
+ };
91
+ // Helper for cubic inverse, solve depressed cubic p/q using s/d to pick roots
92
+ const solveDepressedCubicBezier = (p, q, s, d)=>{
93
+ const p_3 = p / 3;
94
+ const q_2 = q / 2;
95
+ const p3_27 = p_3 * p_3 * p_3;
96
+ const ds = p3_27 + q_2 * q_2;
97
+ if (ds === 0) {
98
+ // Multiple root
99
+ if (p) return -q_2 / p_3;
100
+ else return 0;
101
+ } else if (ds > 0) {
102
+ // Vieta's substitution. Pick matching sign for better precision.
103
+ const w = -q_2 - sqrt(ds) * sign(q);
104
+ const cw = cbrt(w);
105
+ return cw - p_3 / cw;
106
+ } else {
107
+ // Imaginary sqrt(ds)
108
+ const dp = sqrt(-p3_27);
109
+ const theta = acos(-q_2 / dp) / 3;
110
+ const cw = cbrt(dp);
111
+ const r = cw - p_3 / cw;
112
+ const i = +(d < 0) || +(s * d > 0) * 2;
113
+ const cc = cos(theta - i * (2 / 3) * _number.π);
114
+ const v = cc * r;
115
+ return v;
116
+ }
117
+ };
118
+ const bezierEase = (t, x1, y1, x2, y2)=>{
119
+ if (t === 0 || t === 1) return t;
120
+ const s = cubicBezierInverse01(t, x1, x2);
121
+ const value = cubicBezier01(s, y1, y2);
122
+ return value;
123
+ };
124
+ const velocityToBezierEase = (duration, arcLength, v1, v2, w1 = 1 / 3, w2 = 1 / 3)=>{
125
+ const slope1 = arcLength ? v1 * duration / arcLength : 0;
126
+ const slope2 = arcLength ? v2 * duration / arcLength : 0;
127
+ const x1 = min(w1, 1 / slope1);
128
+ const x2 = min(w2, 1 / slope2);
129
+ const y1 = x1 * slope1;
130
+ const y2 = x2 * slope2;
131
+ return [
132
+ x1,
133
+ y1,
134
+ 1 - x2,
135
+ 1 - y2
136
+ ];
137
+ };
138
+ const catmullRom = (t, t0, t1, t2, t3, a, b, c, d)=>{
139
+ const d0t = t0 - t;
140
+ const d10 = t1 - t0;
141
+ const d1t = t1 - t;
142
+ const d20 = t2 - t0;
143
+ const d21 = t2 - t1;
144
+ const d2t = t2 - t;
145
+ const d31 = t3 - t1;
146
+ const d32 = t3 - t2;
147
+ const d3t = t3 - t;
148
+ const a1 = d10 !== 0 ? a * (d1t / d10) + b * (-d0t / d10) : (a + b) / 2;
149
+ const a2 = d21 !== 0 ? b * (d2t / d21) + c * (-d1t / d21) : (b + c) / 2;
150
+ const a3 = d32 !== 0 ? c * (d3t / d32) + d * (-d2t / d32) : (c + d) / 2;
151
+ const b1 = d20 !== 0 ? a1 * (d2t / d20) + a2 * (-d0t / d20) : (a1 + a2) / 2;
152
+ const b2 = d31 !== 0 ? a2 * (d3t / d31) + a3 * (-d1t / d31) : (a2 + a3) / 2;
153
+ const v = d21 !== 0 ? b1 * (d2t / d21) + b2 * (-d1t / d21) : (b1 + b2) / 2;
154
+ return v;
155
+ };
156
+ const catmullRomDual = (t, t0, t1, t2, t3, a, b, c, d)=>{
157
+ const d0t = t0 - t;
158
+ const d10 = t1 - t0;
159
+ const d1t = t1 - t;
160
+ const d20 = t2 - t0;
161
+ const d21 = t2 - t1;
162
+ const d2t = t2 - t;
163
+ const d31 = t3 - t1;
164
+ const d32 = t3 - t2;
165
+ const d3t = t3 - t;
166
+ const a1 = d10 !== 0 ? a * (d1t / d10) + b * (-d0t / d10) : (a + b) / 2;
167
+ const a2 = d21 !== 0 ? b * (d2t / d21) + c * (-d1t / d21) : (b + c) / 2;
168
+ const a3 = d32 !== 0 ? c * (d3t / d32) + d * (-d2t / d32) : (c + d) / 2;
169
+ const b1 = d20 !== 0 ? a1 * (d2t / d20) + a2 * (-d0t / d20) : (a1 + a2) / 2;
170
+ const b2 = d31 !== 0 ? a2 * (d3t / d31) + a3 * (-d1t / d31) : (a2 + a3) / 2;
171
+ const v = d21 !== 0 ? b1 * (d2t / d21) + b2 * (-d1t / d21) : (b1 + b2) / 2;
172
+ const da1dt = d10 !== 0 ? a * (-1 / d10) + b * (1 / d10) : 0;
173
+ const da2dt = d21 !== 0 ? b * (-1 / d21) + c * (1 / d21) : 0;
174
+ const da3dt = d32 !== 0 ? c * (-1 / d32) + d * (1 / d32) : 0;
175
+ const db1dt = d20 !== 0 ? a1 * (-1 / d20) + da1dt * (d2t / d20) + a2 * (1 / d20) + da2dt * (-d0t / d20) : 0;
176
+ const db2dt = d31 !== 0 ? a2 * (-1 / d31) + da2dt * (d3t / d31) + a3 * (1 / d31) + da3dt * (-d1t / d31) : 0;
177
+ const dvdt = d21 !== 0 ? b1 * (-1 / d21) + db1dt * (d2t / d21) + b2 * (1 / d21) + db2dt * (-d1t / d21) : 0;
178
+ return [
179
+ v,
180
+ dvdt
181
+ ];
182
+ };
183
+ const catmullRomWeighted = (fraction, a, b, c, d, ab, bc, cd, power = 1 / 2)=>{
184
+ const d1 = pow(ab, power);
185
+ const d2 = pow(bc, power);
186
+ const d3 = pow(cd, power);
187
+ const t0 = -d1;
188
+ const t1 = 0;
189
+ const t2 = d2;
190
+ const t3 = d2 + d3;
191
+ return catmullRom(fraction * d2, t0, t1, t2, t3, a, b, c, d);
192
+ };
193
+ const catmullRomWeightedDual = (fraction, a, b, c, d, ab, bc, cd, power = 1 / 2)=>{
194
+ const d1 = pow(ab, power);
195
+ const d2 = pow(bc, power);
196
+ const d3 = pow(cd, power);
197
+ const t0 = -d1;
198
+ const t1 = 0;
199
+ const t2 = d2;
200
+ const t3 = d2 + d3;
201
+ const [v, dvdt] = catmullRomDual(fraction * d2, t0, t1, t2, t3, a, b, c, d);
202
+ return [
203
+ v,
204
+ dvdt * d2
205
+ ];
206
+ };
207
+ const sampleToCubicBezier = (sampleDual)=>{
208
+ const [b0, v0] = sampleDual(0);
209
+ const [b3, v3] = sampleDual(1);
210
+ const b1 = b0 + v0 / 3;
211
+ const b2 = b3 - v3 / 3;
212
+ return [
213
+ b0,
214
+ b1,
215
+ b2,
216
+ b3
217
+ ];
218
+ };
219
+ const makeArcLengthMap = (measure, tolerance = 0.005, evenness = 0.5, limit = 8)=>{
220
+ let n = 0;
221
+ let accum = 0;
222
+ const eps = pow(2, ceil(log2(tolerance)));
223
+ // Extra epsilon at start
224
+ const data = [
225
+ -measure(-eps, 0),
226
+ -eps,
227
+ 0
228
+ ];
229
+ // Accumulate samples from 0..1
230
+ const range = (a, b, l, force, limit)=>{
231
+ const m = (a + b) / 2;
232
+ const l1 = measure(a, m);
233
+ const l2 = measure(m, b);
234
+ const d = l1 + l2;
235
+ const e = min(l1 / l2, l2 / l1);
236
+ if ((force > 0 || l / d < 1 - tolerance || e < evenness) && limit > 0) {
237
+ range(a, m, l1, force - 1, limit - 1);
238
+ range(m, b, l2, force - 1, limit - 1);
239
+ } else {
240
+ n++;
241
+ const r = l / d;
242
+ accum += d / (1 + r) * 2;
243
+ data.push(a);
244
+ data.push(accum);
245
+ }
246
+ };
247
+ range(0, 1, measure(0, 1), 2, limit);
248
+ data.push(1);
249
+ // Extra epsilon at end
250
+ data.push(accum + measure(1, 1 + eps));
251
+ data.push(1 + eps);
252
+ const count = n;
253
+ const length = accum;
254
+ const map = new Float32Array(data);
255
+ return {
256
+ map,
257
+ count,
258
+ length,
259
+ limit
260
+ };
261
+ };
262
+ const queryArcLengthMap = (am, value)=>{
263
+ const { map, count } = am;
264
+ let { limit } = am;
265
+ let a = 1;
266
+ let b = count;
267
+ while(b > a && limit-- > 0){
268
+ const m = b - (b - a >> 1);
269
+ const d = map[m * 2];
270
+ if (d > value) b = m - 1;
271
+ else a = m;
272
+ }
273
+ const a2 = a * 2;
274
+ const d0 = map[a2 - 2];
275
+ const t0 = map[a2 - 1];
276
+ const d1 = map[a2];
277
+ const t1 = map[a2 + 1];
278
+ const d2 = map[a2 + 2];
279
+ const t2 = map[a2 + 3];
280
+ const d3 = map[a2 + 4];
281
+ const t3 = map[a2 + 5];
282
+ return (0, _number.clamp)(catmullRom(value, d0, d1, d2, d3, t0, t1, t2, t3), 0, 1);
283
+ };
284
+
285
+ //# sourceMappingURL=ease.js.map
package/cjs/ease.d.cts ADDED
@@ -0,0 +1,25 @@
1
+ export declare const cubicBezier: (t: number, a: number, b: number, c: number, d: number) => number;
2
+ export declare const cubicBezierDt: (t: number, a: number, b: number, c: number, d: number) => number;
3
+ export declare const cubicBezierDt2: (t: number, a: number, b: number, c: number, d: number) => number;
4
+ export declare const cubicBezier01: (t: number, b: number, c: number) => number;
5
+ export declare const cubicBezierInverse01: (v: number, b: number, c: number) => number;
6
+ export declare const bezierEase: (t: number, x1: number, y1: number, x2: number, y2: number) => number;
7
+ export declare const velocityToBezierEase: (duration: number, arcLength: number, v1: number, v2: number, w1?: number, w2?: number) => number[];
8
+ export declare const catmullRom: (t: number, t0: number, t1: number, t2: number, t3: number, a: number, b: number, c: number, d: number) => number;
9
+ export declare const catmullRomDual: (t: number, t0: number, t1: number, t2: number, t3: number, a: number, b: number, c: number, d: number) => [number, number];
10
+ export declare const catmullRomWeighted: (fraction: number, a: number, b: number, c: number, d: number, ab: number, bc: number, cd: number, power?: number) => number;
11
+ export declare const catmullRomWeightedDual: (fraction: number, a: number, b: number, c: number, d: number, ab: number, bc: number, cd: number, power?: number) => [number, number];
12
+ export declare const sampleToCubicBezier: (sampleDual: (t: number) => [number, number]) => number[];
13
+ export type ArcLengthMap = {
14
+ map: Float32Array;
15
+ count: number;
16
+ length: number;
17
+ limit: number;
18
+ };
19
+ export declare const makeArcLengthMap: (measure: (t1: number, t2: number) => number, tolerance?: number, evenness?: number, limit?: number) => {
20
+ map: Float32Array<ArrayBuffer>;
21
+ count: number;
22
+ length: number;
23
+ limit: number;
24
+ };
25
+ export declare const queryArcLengthMap: (am: ArcLengthMap, value: number) => number;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../packages/math/src/ease.ts"],"sourcesContent":["import { π, clamp, sqr } from './number';\n\nconst { abs, acos, cbrt, ceil, cos, log2, min, pow, sign, sqrt } = Math;\n\n// Cubic bezier 1D\nexport const cubicBezier = (t: number, a: number, b: number, c: number, d: number) =>\n (a + (3 * b - a) * t) * sqr(1 - t) + (d + (3 * c - d) * (1 - t)) * sqr(t);\n\n// Cubic bezier 1D derivative\nexport const cubicBezierDt = (t: number, a: number, b: number, c: number, d: number) =>\n a * (- 3*sqr(1 - t)) +\n b * ((9*t - 12)*t + 3) +\n c * (6 - 9*t) * t +\n d * 3*sqr(t);\n \n// Cubic bezier 1D 2nd derivative\nexport const cubicBezierDt2 = (t: number, a: number, b: number, c: number, d: number) =>\n a * (3*2*(1 - t)) +\n b * (18*t - 12) +\n c * (6 - 18*t) +\n d * 3*2*t;\n\n// Cubic bezier 1D (a=0 d=1)\nexport const cubicBezier01 = (t: number, b: number, c: number) =>\n (3 * b) * t * sqr(1 - t) + ((3 * c) * (1 - t) + t) * sqr(t);\n\n// Invert monotonous cubic bezier (a=0 d=1) (analytic)\nexport const cubicBezierInverse01 = (v: number, b: number, c: number) => {\n // Bezier over x=[-1..1] y=[-1..1] with symmetric basis functions\n const y = v * 2 - 1;\n\n // Sum and difference of middle two bezier bands relative to f(x) = x\n const s = (3/4) * (b + c - 1);\n const d = (3/4) * (b - c + (1/3));\n if (abs(d) < 1e-5) {\n if (abs(s) < 1e-5) return v;\n return solveQuadraticBezier(s, y) * .5 + .5;\n }\n\n // Construct cubic basis\n // y = (d x^3 - s x^2 - d x + s) + x\n\n // Deflate cubic\n // t = x - o\n // t^3 + pt + q = 0\n const id = 1/d;\n const s2 = s*s;\n const d2 = d*d;\n const id2 = id*id;\n\n const o = (1/3) * s * id;\n const p = (d - d2 + (-1/3) * s2) * id2;\n const q = (((-2/27) * s2 + (1/3) * (d - d2) + d2) * s - y * d2) * (id2 * id);\n\n return (solveDepressedCubicBezier(p, q, s, d) + o) * .5 + .5;\n};\n\n// Helper for quadratic inverse (d=0)\nconst solveQuadraticBezier = (s: number, y: number) => {\n const d = 1 - 4 * s * (y - s);\n const v = (1 - sqrt(d)) / (2*s);\n return v;\n};\n\n// Helper for cubic inverse, solve depressed cubic p/q using s/d to pick roots\nconst solveDepressedCubicBezier = (p: number, q: number, s: number, d: number) => {\n const p_3 = p / 3;\n const q_2 = q / 2;\n\n const p3_27 = p_3 * p_3 * p_3;\n const ds = p3_27 + q_2 * q_2;\n\n if (ds === 0) {\n // Multiple root\n if (p) return -q_2 / p_3;\n else return 0;\n }\n else if (ds > 0) {\n // Vieta's substitution. Pick matching sign for better precision.\n const w = -q_2 - sqrt(ds) * sign(q);\n const cw = cbrt(w);\n return cw - p_3 / cw;\n }\n else {\n // Imaginary sqrt(ds)\n const dp = sqrt(-p3_27);\n const theta = acos(-q_2 / dp) / 3;\n const cw = cbrt(dp);\n const r = cw - p_3 / cw;\n\n const i = +(d < 0) || (+(s*d > 0) * 2);\n const cc = cos(theta - i * (2/3) * π);\n const v = cc * r;\n\n return v;\n }\n};\n\n// Cubic bezier ease, X = time / Y = value\n// Only control points (x1,y1) and (x2,y2) are adjustable (x = [0...1], y = any)\nexport const bezierEase = (t: number, x1: number, y1: number, x2: number, y2: number) => {\n if (t === 0 || t === 1) return t;\n const s = cubicBezierInverse01(t, x1, x2);\n const value = cubicBezier01(s, y1, y2);\n return value;\n};\n\n// Velocity helper for cubic bezier ease.\n// Ease across arcLength over duration, entering at speed v1 and exiting at speed v2.\nexport const velocityToBezierEase = (\n duration: number,\n arcLength: number,\n v1: number,\n v2: number,\n w1: number = 1/3,\n w2: number = 1/3,\n) => {\n const slope1 = arcLength ? v1 * duration / arcLength : 0;\n const slope2 = arcLength ? v2 * duration / arcLength : 0;\n\n const x1 = min(w1, 1 / slope1);\n const x2 = min(w2, 1 / slope2);\n const y1 = x1 * slope1;\n const y2 = x2 * slope2;\n\n return [x1, y1, 1 - x2, 1 - y2];\n};\n\n// Catmull-rom spline with movable knots\nexport const catmullRom = (\n t: number,\n t0: number,\n t1: number,\n t2: number,\n t3: number,\n a: number,\n b: number,\n c: number,\n d: number,\n) => {\n const d0t = t0 - t;\n\n const d10 = t1 - t0;\n const d1t = t1 - t;\n const d20 = t2 - t0;\n const d21 = t2 - t1;\n const d2t = t2 - t;\n const d31 = t3 - t1;\n const d32 = t3 - t2;\n const d3t = t3 - t;\n\n const a1 = (d10 !== 0) ? a * (d1t / d10) + b * (-d0t / d10) : (a + b) / 2;\n const a2 = (d21 !== 0) ? b * (d2t / d21) + c * (-d1t / d21) : (b + c) / 2;\n const a3 = (d32 !== 0) ? c * (d3t / d32) + d * (-d2t / d32) : (c + d) / 2;\n\n const b1 = (d20 !== 0) ? a1 * (d2t / d20) + a2 * (-d0t / d20) : (a1 + a2) / 2;\n const b2 = (d31 !== 0) ? a2 * (d3t / d31) + a3 * (-d1t / d31) : (a2 + a3) / 2;\n\n const v = (d21 !== 0) ? b1 * (d2t / d21) + b2 * (-d1t / d21) : (b1 + b2) / 2;\n\n return v;\n};\n\n// Catmull-rom spline value+derivative with movable knots\nexport const catmullRomDual = (\n t: number,\n t0: number,\n t1: number,\n t2: number,\n t3: number,\n a: number,\n b: number,\n c: number,\n d: number,\n): [number, number] => {\n const d0t = t0 - t;\n\n const d10 = t1 - t0;\n const d1t = t1 - t;\n const d20 = t2 - t0;\n const d21 = t2 - t1;\n const d2t = t2 - t;\n const d31 = t3 - t1;\n const d32 = t3 - t2;\n const d3t = t3 - t;\n\n const a1 = (d10 !== 0) ? a * (d1t / d10) + b * (-d0t / d10) : (a + b) / 2;\n const a2 = (d21 !== 0) ? b * (d2t / d21) + c * (-d1t / d21) : (b + c) / 2;\n const a3 = (d32 !== 0) ? c * (d3t / d32) + d * (-d2t / d32) : (c + d) / 2;\n\n const b1 = (d20 !== 0) ? a1 * (d2t / d20) + a2 * (-d0t / d20) : (a1 + a2) / 2;\n const b2 = (d31 !== 0) ? a2 * (d3t / d31) + a3 * (-d1t / d31) : (a2 + a3) / 2;\n\n const v = (d21 !== 0) ? b1 * (d2t / d21) + b2 * (-d1t / d21) : (b1 + b2) / 2;\n\n const da1dt = (d10 !== 0) ? a * (-1 / d10) + b * (1 / d10) : 0;\n const da2dt = (d21 !== 0) ? b * (-1 / d21) + c * (1 / d21) : 0;\n const da3dt = (d32 !== 0) ? c * (-1 / d32) + d * (1 / d32) : 0;\n\n const db1dt = (d20 !== 0) ? a1 * (-1 / d20) + da1dt * (d2t / d20) + a2 * (1 / d20) + da2dt * (-d0t / d20) : 0;\n const db2dt = (d31 !== 0) ? a2 * (-1 / d31) + da2dt * (d3t / d31) + a3 * (1 / d31) + da3dt * (-d1t / d31) : 0;\n\n const dvdt = (d21 !== 0) ? b1 * (-1 / d21) + db1dt * (d2t / d21) + b2 * (1 / d21) + db2dt * (-d1t / d21) : 0;\n\n return [v, dvdt];\n};\n\n// Weighted catmull rom (chordal = 1, centripetal = 1/2)\nexport const catmullRomWeighted = (\n fraction: number,\n a: number,\n b: number,\n c: number,\n d: number,\n ab: number,\n bc: number,\n cd: number,\n power: number = 1/2,\n) => {\n const d1 = pow(ab, power);\n const d2 = pow(bc, power);\n const d3 = pow(cd, power);\n\n const t0 = -d1;\n const t1 = 0;\n const t2 = d2;\n const t3 = d2 + d3;\n\n return catmullRom(fraction * d2, t0, t1, t2, t3, a, b, c, d);\n};\n\n// Weighted catmull rom value+derivative (chordal = 1, centripetal = 1/2)\nexport const catmullRomWeightedDual = (\n fraction: number,\n a: number,\n b: number,\n c: number,\n d: number,\n ab: number,\n bc: number,\n cd: number,\n power: number = 1/2,\n): [number, number] => {\n const d1 = pow(ab, power);\n const d2 = pow(bc, power);\n const d3 = pow(cd, power);\n\n const t0 = -d1;\n const t1 = 0;\n const t2 = d2;\n const t3 = d2 + d3;\n\n const [v, dvdt] = catmullRomDual(fraction * d2, t0, t1, t2, t3, a, b, c, d);\n return [v, dvdt * d2];\n};\n\n// Sample spline at endpoints (0..1) to make cubic bezier\nexport const sampleToCubicBezier = (\n sampleDual: (t: number) => [number, number],\n) => {\n const [b0, v0] = sampleDual(0);\n const [b3, v3] = sampleDual(1);\n\n const b1 = b0 + v0 / 3;\n const b2 = b3 - v3 / 3;\n\n return [b0, b1, b2, b3];\n};\n\n// Arc length map for a spline\nexport type ArcLengthMap = {\n map: Float32Array,\n count: number,\n length: number,\n limit: number,\n};\n\n// Make arc length map for a spline\nexport const makeArcLengthMap = (\n measure: (t1: number, t2: number) => number,\n tolerance: number = 0.005,\n evenness: number = 0.5,\n limit: number = 8,\n) => {\n\n let n = 0;\n let accum = 0;\n const eps = pow(2, ceil(log2(tolerance)));\n\n // Extra epsilon at start\n const data: number[] = [-measure(-eps, 0), -eps, 0];\n\n // Accumulate samples from 0..1\n const range = (a: number, b: number, l: number, force: number, limit: number) => {\n const m = (a + b) / 2;\n const l1 = measure(a, m);\n const l2 = measure(m, b);\n const d = l1 + l2;\n const e = min(l1 / l2, l2 / l1);\n\n if ((force > 0 || (l / d < 1 - tolerance) || (e < evenness)) && (limit > 0)) {\n range(a, m, l1, force - 1, limit - 1);\n range(m, b, l2, force - 1, limit - 1);\n }\n else {\n n++;\n const r = l / d;\n accum += d / (1 + r) * 2;\n data.push(a);\n data.push(accum);\n }\n };\n\n range(0, 1, measure(0, 1), 2, limit);\n data.push(1);\n\n // Extra epsilon at end\n data.push(accum + measure(1, 1 + eps));\n data.push(1 + eps);\n\n const count = n;\n const length = accum;\n const map = new Float32Array(data);\n\n return {map, count, length, limit};\n};\n\n// Query value in arc length map\nexport const queryArcLengthMap = (am: ArcLengthMap, value: number) => {\n const {map, count} = am;\n let {limit} = am;\n\n let a = 1;\n let b = count;\n\n while (b > a && limit-- > 0) {\n const m = b - ((b - a) >> 1);\n const d = map[m * 2];\n if (d > value) b = m - 1;\n else a = m;\n }\n\n const a2 = a * 2;\n\n const d0 = map[a2 - 2];\n const t0 = map[a2 - 1];\n\n const d1 = map[a2];\n const t1 = map[a2 + 1];\n\n const d2 = map[a2 + 2];\n const t2 = map[a2 + 3];\n\n const d3 = map[a2 + 4];\n const t3 = map[a2 + 5];\n\n return clamp(catmullRom(value, d0, d1, d2, d3, t0, t1, t2, t3), 0, 1);\n};\n"],"names":["bezierEase","catmullRom","catmullRomDual","catmullRomWeighted","catmullRomWeightedDual","cubicBezier","cubicBezier01","cubicBezierDt","cubicBezierDt2","cubicBezierInverse01","makeArcLengthMap","queryArcLengthMap","sampleToCubicBezier","velocityToBezierEase","abs","acos","cbrt","ceil","cos","log2","min","pow","sign","sqrt","Math","t","a","b","c","d","sqr","v","y","s","solveQuadraticBezier","id","s2","d2","id2","o","p","q","solveDepressedCubicBezier","p_3","q_2","p3_27","ds","w","cw","dp","theta","r","i","cc","π","x1","y1","x2","y2","value","duration","arcLength","v1","v2","w1","w2","slope1","slope2","t0","t1","t2","t3","d0t","d10","d1t","d20","d21","d2t","d31","d32","d3t","a1","a2","a3","b1","b2","da1dt","da2dt","da3dt","db1dt","db2dt","dvdt","fraction","ab","bc","cd","power","d1","d3","sampleDual","b0","v0","b3","v3","measure","tolerance","evenness","limit","n","accum","eps","data","range","l","force","m","l1","l2","e","push","count","length","map","Float32Array","am","d0","clamp"],"mappings":"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"}
package/cjs/index.cjs ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _export_star(require("./ease.cjs"), exports);
6
+ _export_star(require("./linalg.cjs"), exports);
7
+ _export_star(require("./matrix.cjs"), exports);
8
+ _export_star(require("./number.cjs"), exports);
9
+ _export_star(require("./polynomial.cjs"), exports);
10
+ _export_star(require("./vector.cjs"), exports);
11
+ function _export_star(from, to) {
12
+ Object.keys(from).forEach(function(k) {
13
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
14
+ Object.defineProperty(to, k, {
15
+ enumerable: true,
16
+ get: function() {
17
+ return from[k];
18
+ }
19
+ });
20
+ }
21
+ });
22
+ return from;
23
+ }
24
+
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,6 @@
1
+ export * from './ease.d.cts';
2
+ export * from './linalg.d.cts';
3
+ export * from './matrix.d.cts';
4
+ export * from './number.d.cts';
5
+ export * from './polynomial.d.cts';
6
+ export * from './vector.d.cts';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../packages/math/src/index.ts"],"sourcesContent":["export * from './ease';\nexport * from './linalg';\nexport * from './matrix';\nexport * from './number';\nexport * from './polynomial';\nexport * from './vector';\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA;qBACA;qBACA;qBACA"}
package/cjs/linalg.cjs ADDED
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get lagrangeMinimumTo () {
13
+ return lagrangeMinimumTo;
14
+ },
15
+ get leastSquares () {
16
+ return leastSquares;
17
+ },
18
+ get leastSquaresClosest () {
19
+ return leastSquaresClosest;
20
+ },
21
+ get solveLinearSystem () {
22
+ return solveLinearSystem;
23
+ }
24
+ });
25
+ const _matrix = require("./matrix.cjs");
26
+ const _number = require("./number.cjs");
27
+ const { abs, min } = Math;
28
+ const { concat, dims, fill, jordanNormal, mul, transpose } = _matrix.Matrix;
29
+ // Fill an array of length n with all zeros except a single v at index i
30
+ const select = (n, i = n - 1, v = 1)=>(0, _number.seq)(n).map((j)=>i == j ? v : 0);
31
+ const solveLinearSystem = (A, B)=>{
32
+ // eslint-disable-next-line
33
+ let [n, m] = dims(A);
34
+ // Diagonalize system of equations
35
+ let G = jordanNormal(concat(A, B));
36
+ // Filter out zero rows
37
+ G = G.filter((row)=>row.filter((x)=>x).length > 0);
38
+ n = G.length;
39
+ if (n > m) {
40
+ // Overdetermined, no solution
41
+ return null;
42
+ }
43
+ if (!isJordanNormalDiagonal(G)) {
44
+ // Underdetermined, no solution
45
+ return null;
46
+ }
47
+ if (n == m) {
48
+ // Extract exact solution
49
+ const v = (0, _number.seq)(m).map((i)=>G[i][m]);
50
+ return v;
51
+ }
52
+ return null;
53
+ };
54
+ const lagrangeMinimumTo = (A, B, P)=>{
55
+ const [n, m] = dims(A);
56
+ const M = concat(A, fill(n, n));
57
+ const T = (0, _number.seq)(m).map((i)=>[
58
+ ...select(m, i, 2),
59
+ ...(0, _number.seq)(n).map((j)=>-A[j][i])
60
+ ]);
61
+ const AL = [
62
+ ...M,
63
+ ...T
64
+ ];
65
+ const BL = [
66
+ ...B,
67
+ ...P.map((v)=>2 * v)
68
+ ];
69
+ return [
70
+ AL,
71
+ BL
72
+ ];
73
+ };
74
+ const leastSquares = (A, B)=>{
75
+ const AT = transpose(A);
76
+ const ATA = mul(AT, A);
77
+ const ATB = mul([
78
+ B
79
+ ], A)[0];
80
+ return [
81
+ ATA,
82
+ ATB
83
+ ];
84
+ };
85
+ const leastSquaresClosest = (A, B, P)=>{
86
+ const d = P.length;
87
+ const AP = A.concat((0, _number.seq)(d).map((i)=>select(d, i)));
88
+ const BP = B.concat(P);
89
+ return leastSquares(AP, BP);
90
+ };
91
+ // Verify if matrix is jordan normal on the diagonal
92
+ const isJordanNormalDiagonal = (x)=>{
93
+ const [n, m] = dims(x);
94
+ const l = min(n, m);
95
+ for(let i = 0; i < l; ++i){
96
+ if (abs(x[i][i] - 1) > 1e-2) return false;
97
+ }
98
+ return true;
99
+ };
100
+
101
+ //# sourceMappingURL=linalg.js.map
@@ -0,0 +1,4 @@
1
+ export declare const solveLinearSystem: (A: number[][], B: number[]) => number[] | null;
2
+ export declare const lagrangeMinimumTo: (A: number[][], B: number[], P: number[]) => [number[][], number[]];
3
+ export declare const leastSquares: (A: number[][], B: number[]) => [number[][], number[]];
4
+ export declare const leastSquaresClosest: (A: number[][], B: number[], P: number[]) => [number[][], number[]];
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../packages/math/src/linalg.ts"],"sourcesContent":["import { Matrix } from './matrix';\nimport { seq } from './number';\n\nconst {abs, min} = Math;\nconst {concat, dims, fill, jordanNormal, mul, transpose} = Matrix;\n\n// Fill an array of length n with all zeros except a single v at index i\nconst select = (n: number, i = n - 1, v = 1) => seq(n).map(j => i == j ? v : 0);\n\n// Solve linear system of equations A X = B\nexport const solveLinearSystem = (A: number[][], B: number[]) => {\n // eslint-disable-next-line\n let [n, m] = dims(A);\n\n // Diagonalize system of equations\n let G = jordanNormal(concat(A, B));\n\n // Filter out zero rows\n G = G.filter(row => row.filter(x => x).length > 0);\n n = G.length;\n\n if (n > m) {\n // Overdetermined, no solution\n return null;\n }\n\n if (!isJordanNormalDiagonal(G)) {\n // Underdetermined, no solution\n return null;\n }\n\n if (n == m) {\n // Extract exact solution\n const v = seq(m).map(i => G[i][m]);\n return v;\n }\n\n return null;\n}\n\n// Use lagrange multipliers to minimize distance to P subject to A X = B\nexport const lagrangeMinimumTo = (A: number[][], B: number[], P: number[]): [number[][], number[]] => {\n const [n, m] = dims(A);\n\n const M = concat(A, fill(n, n));\n const T = seq(m).map(i => [\n ...select(m, i, 2), ...seq(n).map(j => -A[j][i]),\n ]);\n\n const AL = [...M, ...T];\n const BL = [...B, ...P.map(v => 2*v)];\n\n return [AL, BL];\n}\n\n// Reduce overdetermined system to least squares equivalent\nexport const leastSquares = (A: number[][], B: number[]): [number[][], number[]] => {\n const AT = transpose(A);\n\n const ATA = mul(AT, A);\n const ATB = mul([B], A)[0];\n\n return [ATA, ATB];\n}\n\n// Reduce overdetermined system to least squares equivalent with attractor P\nexport const leastSquaresClosest = (A: number[][], B: number[], P: number[]): [number[][], number[]] => {\n const d = P.length;\n\n const AP = A.concat(seq(d).map(i => select(d, i)));\n const BP = B.concat(P);\n\n return leastSquares(AP, BP);\n}\n\n// Verify if matrix is jordan normal on the diagonal\nconst isJordanNormalDiagonal = (x: number[][]) => {\n const [n, m] = dims(x);\n const l = min(n, m);\n\n for (let i = 0; i < l; ++i) {\n if (abs(x[i][i] - 1) > 1e-2) return false;\n }\n return true;\n}\n"],"names":["lagrangeMinimumTo","leastSquares","leastSquaresClosest","solveLinearSystem","abs","min","Math","concat","dims","fill","jordanNormal","mul","transpose","Matrix","select","n","i","v","seq","map","j","A","B","m","G","filter","row","x","length","isJordanNormalDiagonal","P","M","T","AL","BL","AT","ATA","ATB","d","AP","BP","l"],"mappings":";;;;;;;;;;;QAyCaA;eAAAA;;QAeAC;eAAAA;;QAUAC;eAAAA;;QAxDAC;eAAAA;;;wBAVU;wBACH;AAEpB,MAAM,EAACC,GAAG,EAAEC,GAAG,EAAC,GAAGC;AACnB,MAAM,EAACC,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,YAAY,EAAEC,GAAG,EAAEC,SAAS,EAAC,GAAGC,cAAM;AAEjE,wEAAwE;AACxE,MAAMC,SAAS,CAACC,GAAWC,IAAID,IAAI,CAAC,EAAEE,IAAI,CAAC,GAAKC,IAAAA,WAAG,EAACH,GAAGI,GAAG,CAACC,CAAAA,IAAKJ,KAAKI,IAAIH,IAAI;AAGtE,MAAMd,oBAAoB,CAACkB,GAAeC;IAC/C,2BAA2B;IAC3B,IAAI,CAACP,GAAGQ,EAAE,GAAGf,KAAKa;IAElB,kCAAkC;IAClC,IAAIG,IAAId,aAAaH,OAAOc,GAAGC;IAE/B,uBAAuB;IACvBE,IAAIA,EAAEC,MAAM,CAACC,CAAAA,MAAOA,IAAID,MAAM,CAACE,CAAAA,IAAKA,GAAGC,MAAM,GAAG;IAChDb,IAAIS,EAAEI,MAAM;IAEZ,IAAIb,IAAIQ,GAAG;QACT,8BAA8B;QAC9B,OAAO;IACT;IAEA,IAAI,CAACM,uBAAuBL,IAAI;QAC9B,+BAA+B;QAC/B,OAAO;IACT;IAEA,IAAIT,KAAKQ,GAAG;QACV,yBAAyB;QACzB,MAAMN,IAAIC,IAAAA,WAAG,EAACK,GAAGJ,GAAG,CAACH,CAAAA,IAAKQ,CAAC,CAACR,EAAE,CAACO,EAAE;QACjC,OAAON;IACT;IAEA,OAAO;AACT;AAGO,MAAMjB,oBAAoB,CAACqB,GAAeC,GAAaQ;IAC5D,MAAM,CAACf,GAAGQ,EAAE,GAAGf,KAAKa;IAEpB,MAAMU,IAAIxB,OAAOc,GAAGZ,KAAKM,GAAGA;IAC5B,MAAMiB,IAAId,IAAAA,WAAG,EAACK,GAAGJ,GAAG,CAACH,CAAAA,IAAK;eACrBF,OAAOS,GAAGP,GAAG;eAAOE,IAAAA,WAAG,EAACH,GAAGI,GAAG,CAACC,CAAAA,IAAK,CAACC,CAAC,CAACD,EAAE,CAACJ,EAAE;SAChD;IAED,MAAMiB,KAAK;WAAIF;WAAMC;KAAE;IACvB,MAAME,KAAK;WAAIZ;WAAMQ,EAAEX,GAAG,CAACF,CAAAA,IAAK,IAAEA;KAAG;IAErC,OAAO;QAACgB;QAAIC;KAAG;AACjB;AAGO,MAAMjC,eAAe,CAACoB,GAAeC;IAC1C,MAAMa,KAAKvB,UAAUS;IAErB,MAAMe,MAAMzB,IAAIwB,IAAId;IACpB,MAAMgB,MAAM1B,IAAI;QAACW;KAAE,EAAED,EAAE,CAAC,EAAE;IAE1B,OAAO;QAACe;QAAKC;KAAI;AACnB;AAGO,MAAMnC,sBAAsB,CAACmB,GAAeC,GAAaQ;IAC9D,MAAMQ,IAAIR,EAAEF,MAAM;IAElB,MAAMW,KAAKlB,EAAEd,MAAM,CAACW,IAAAA,WAAG,EAACoB,GAAGnB,GAAG,CAACH,CAAAA,IAAKF,OAAOwB,GAAGtB;IAC9C,MAAMwB,KAAKlB,EAAEf,MAAM,CAACuB;IAEpB,OAAO7B,aAAasC,IAAIC;AAC1B;AAEA,oDAAoD;AACpD,MAAMX,yBAAyB,CAACF;IAC9B,MAAM,CAACZ,GAAGQ,EAAE,GAAGf,KAAKmB;IACpB,MAAMc,IAAIpC,IAAIU,GAAGQ;IAEjB,IAAK,IAAIP,IAAI,GAAGA,IAAIyB,GAAG,EAAEzB,EAAG;QAC1B,IAAIZ,IAAIuB,CAAC,CAACX,EAAE,CAACA,EAAE,GAAG,KAAK,MAAM,OAAO;IACtC;IACA,OAAO;AACT"}
package/cjs/math.cjs ADDED
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get clamp () {
13
+ return clamp;
14
+ },
15
+ get clerp () {
16
+ return clerp;
17
+ },
18
+ get cub () {
19
+ return cub;
20
+ },
21
+ get lerp () {
22
+ return lerp;
23
+ },
24
+ get seq () {
25
+ return seq;
26
+ },
27
+ get sqr () {
28
+ return sqr;
29
+ },
30
+ get π () {
31
+ return π;
32
+ },
33
+ get τ () {
34
+ return τ;
35
+ }
36
+ });
37
+ const { max } = Math;
38
+ const π = Math.PI;
39
+ const τ = 2 * π;
40
+ const clamp = (x, a, b)=>max(a, Math.min(b, x));
41
+ const cub = (x)=>x * x * x;
42
+ const sqr = (x)=>x * x;
43
+ const lerp = (a, b, t)=>a * (1 - t) + b * t;
44
+ const clerp = (a, b, t)=>{
45
+ const d = (b - a + π) / τ % 1 * τ - π;
46
+ return lerp(a, a + d, t);
47
+ };
48
+ const seq = (n, start = 0, step = 1)=>Array.from({
49
+ length: n
50
+ }).map((_, i)=>start + i * step);
51
+
52
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../packages/math/src/math.ts"],"sourcesContent":["export type XY = [number, number];\nexport type XYZ = [number, number, number];\nexport type XYZW = [number, number, number, number];\n\nconst { max } = Math;\n\nexport const π = Math.PI;\nexport const τ = 2*π;\n\nexport const clamp = (x: number, a: number, b: number) => max(a, Math.min(b, x));\n\nexport const cub = (x: number) => x * x * x;\nexport const sqr = (x: number) => x * x;\n\nexport const lerp = (a: number, b: number, t: number) => a * (1 - t) + b * t;\nexport const clerp = (a: number, b: number, t: number) => {\n const d = (((b - a + π) / τ) % 1) * τ - π;\n return lerp(a, a + d, t);\n};\n\nexport const seq = (n: number, start: number = 0, step: number = 1) => Array.from({length: n}).map((_, i) => start + i * step);\n"],"names":["clamp","clerp","cub","lerp","seq","sqr","π","τ","max","Math","PI","x","a","b","min","t","d","n","start","step","Array","from","length","map","_","i"],"mappings":";;;;;;;;;;;QASaA;eAAAA;;QAMAC;eAAAA;;QAJAC;eAAAA;;QAGAC;eAAAA;;QAMAC;eAAAA;;QARAC;eAAAA;;QANAC;eAAAA;;QACAC;eAAAA;;;AAHb,MAAM,EAAEC,GAAG,EAAE,GAAGC;AAET,MAAMH,IAAIG,KAAKC,EAAE;AACjB,MAAMH,IAAI,IAAED;AAEZ,MAAMN,QAAQ,CAACW,GAAWC,GAAWC,IAAcL,IAAII,GAAGH,KAAKK,GAAG,CAACD,GAAGF;AAEtE,MAAMT,MAAM,CAACS,IAAcA,IAAIA,IAAIA;AACnC,MAAMN,MAAM,CAACM,IAAcA,IAAIA;AAE/B,MAAMR,OAAO,CAACS,GAAWC,GAAWE,IAAcH,IAAK,CAAA,IAAIG,CAAAA,IAAKF,IAAIE;AACpE,MAAMd,QAAQ,CAACW,GAAWC,GAAWE;IAC1C,MAAMC,IAAI,AAAGH,CAAAA,IAAID,IAAIN,CAAA,IAAKC,IAAK,IAAKA,IAAID;IACxC,OAAOH,KAAKS,GAAGA,IAAII,GAAGD;AACxB;AAEO,MAAMX,MAAM,CAACa,GAAWC,QAAgB,CAAC,EAAEC,OAAe,CAAC,GAAKC,MAAMC,IAAI,CAAC;QAACC,QAAQL;IAAC,GAAGM,GAAG,CAAC,CAACC,GAAGC,IAAMP,QAAQO,IAAIN"}