linearly 0.36.1 → 0.37.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/lib/cjs/mat2d.js DELETED
@@ -1,640 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.mat2d = void 0;
37
- const Common = __importStar(require("./common"));
38
- const mat2_1 = require("./mat2");
39
- const vec2_1 = require("./vec2");
40
- /**
41
- * Functions for {@link mat2d}, 2D affine transformation (translation, rotation, scaling, skewing).
42
- * @see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix
43
- * @category Modules
44
- */
45
- var mat2d;
46
- (function (mat2d) {
47
- /**
48
- * Creates a new matrix from given elements
49
- * @category Generators
50
- */
51
- // prettier-ignore
52
- function of(a, b, c, d, tx, ty) {
53
- return [a, b, c, d, tx, ty];
54
- }
55
- mat2d.of = of;
56
- /**
57
- * Creates a mutable clone of given mat2d
58
- * @category Generators
59
- */
60
- function clone(a) {
61
- return [...a];
62
- }
63
- mat2d.clone = clone;
64
- /**
65
- * The identity matrix of mat2d
66
- * ```ts
67
- * [1, 0,
68
- * 0, 1,
69
- * 0, 0]
70
- * ```
71
- * @category Constants
72
- *
73
- * @shorthands
74
- * - {@link id}
75
- * - {@link ident}
76
- */
77
- // prettier-ignore
78
- mat2d.identity = Object.freeze([
79
- 1, 0,
80
- 0, 1,
81
- 0, 0
82
- ]);
83
- /**
84
- * Alias for {@link identity}
85
- * @category Shorthands
86
- */
87
- mat2d.I = mat2d.identity;
88
- /**
89
- * Alias for {@link identity}
90
- * @category Shorthands
91
- */
92
- mat2d.id = mat2d.identity;
93
- /**
94
- * Alias for {@link identity}
95
- * @category Shorthands
96
- */
97
- mat2d.ident = mat2d.identity;
98
- /**
99
- * The mat2d matrix filled with zeros.
100
- * @category Constants
101
- */
102
- mat2d.zero = Object.freeze([0, 0, 0, 0, 0, 0]);
103
- /**
104
- * Inverts a mat2d
105
- *
106
- * @shorthands
107
- * - {@link inv}
108
- */
109
- function invert(a) {
110
- const [aa, ab, ac, ad, atx, aty] = a;
111
- const det = aa * ad - ab * ac;
112
- if (!det) {
113
- return null;
114
- }
115
- const detinv = 1 / det;
116
- // prettier-ignore
117
- return [
118
- ad * detinv, -ab * detinv,
119
- -ac * detinv, aa * detinv,
120
- (ac * aty - ad * atx) * detinv,
121
- (ab * atx - aa * aty) * detinv,
122
- ];
123
- }
124
- mat2d.invert = invert;
125
- /**
126
- * Alias for {@link invert}
127
- * @category Shorthands
128
- */
129
- mat2d.inv = invert;
130
- /**
131
- * Calculates the determinant of a mat2d
132
- *
133
- * @shorthands
134
- * - {@link det}
135
- */
136
- function determinant(a) {
137
- return a[0] * a[3] - a[1] * a[2];
138
- }
139
- mat2d.determinant = determinant;
140
- /**
141
- * Alias for {@link determinant}
142
- * @category Shorthands
143
- */
144
- mat2d.det = determinant;
145
- /**
146
- * Multiplies given mat2d's
147
- *
148
- * @shorthands
149
- * - {@link mul}
150
- */
151
- function multiply(...ms) {
152
- if (ms.length === 0) {
153
- return mat2d.identity;
154
- }
155
- else if (ms.length === 1) {
156
- return ms[0];
157
- }
158
- else if (ms.length > 2) {
159
- const [a, b, ...rest] = ms;
160
- return multiply(multiply(a, b), ...rest);
161
- }
162
- const [a, b] = ms;
163
- const [a0, a1, a2, a3, a4, a5] = a;
164
- const [b0, b1, b2, b3, b4, b5] = b;
165
- // prettier-ignore
166
- return [
167
- a0 * b0 + a2 * b1, a1 * b0 + a3 * b1,
168
- a0 * b2 + a2 * b3, a1 * b2 + a3 * b3,
169
- a0 * b4 + a2 * b5 + a4,
170
- a1 * b4 + a3 * b5 + a5,
171
- ];
172
- }
173
- mat2d.multiply = multiply;
174
- /**
175
- * Alias for {@link multiply}
176
- * @category Shorthands
177
- */
178
- mat2d.mul = multiply;
179
- /**
180
- * Rotates a mat2d by the given angle
181
- */
182
- function rotate(m, deg, origin) {
183
- if (origin) {
184
- return pivot(rotate(m, deg), origin);
185
- }
186
- const [a0, a1, a2, a3, tx, ty] = m;
187
- const s = Math.sin(deg * Common.DEG2RAD);
188
- const c = Math.cos(deg * Common.DEG2RAD);
189
- // prettier-ignore
190
- return [
191
- a0 * c + a2 * s, a1 * c + a3 * s,
192
- a0 * -s + a2 * c, a1 * -s + a3 * c,
193
- tx, ty
194
- ];
195
- }
196
- mat2d.rotate = rotate;
197
- /**
198
- * Scales the mat2d by the dimensions in the given vec2
199
- **/
200
- function scale(m, s, origin) {
201
- if (origin) {
202
- return pivot(scale(m, s), origin);
203
- }
204
- const [a0, a1, a2, a3, tx, ty] = m;
205
- const [sx, sy] = s;
206
- // prettier-ignore
207
- return [
208
- a0 * sx, a1 * sx,
209
- a2 * sy, a3 * sy,
210
- tx, ty
211
- ];
212
- }
213
- mat2d.scale = scale;
214
- /**
215
- * Translates the mat2d by the dimensions in the given vec2
216
- **/
217
- function translate(m, v) {
218
- const [a, b, c, d, tx, ty] = m;
219
- const [x, y] = v;
220
- // prettier-ignore
221
- return [
222
- a, b,
223
- c, d,
224
- a * x + c * y + tx,
225
- b * x + d * y + ty
226
- ];
227
- }
228
- mat2d.translate = translate;
229
- /**
230
- * Applies a transformation around a given origin point
231
- */
232
- function pivot(m, origin) {
233
- return multiply(fromTranslation(origin), m, fromTranslation(vec2_1.vec2.negate(origin)));
234
- }
235
- mat2d.pivot = pivot;
236
- /**
237
- * Applies skew to the mat2d by the given angles in degrees
238
- * @see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/skew
239
- */
240
- function skew(m, deg, origin) {
241
- return multiply(m, fromSkew(deg, origin));
242
- }
243
- mat2d.skew = skew;
244
- /**
245
- * Creates a matrix from a given angle.
246
- * @param deg The angle to rotate the matrix by, in degrees
247
- * @category Generators
248
- *
249
- * @shorthands
250
- * - {@link rotation}
251
- */
252
- function fromRotation(deg, origin) {
253
- if (origin) {
254
- return pivot(fromRotation(deg), origin);
255
- }
256
- const s = Math.sin(deg * Common.DEG2RAD);
257
- const c = Math.cos(deg * Common.DEG2RAD);
258
- // prettier-ignore
259
- return [
260
- c, s,
261
- -s, c,
262
- 0, 0,
263
- ];
264
- }
265
- mat2d.fromRotation = fromRotation;
266
- /**
267
- * Alias for {@link fromRotation}
268
- * @category Shorthands
269
- */
270
- mat2d.rotation = fromRotation;
271
- /**
272
- * Creates a matrix from a vector scaling
273
- * @category Generators
274
- *
275
- * @shorthands
276
- * - {@link scaling}
277
- */
278
- function fromScaling(v, origin) {
279
- if (origin) {
280
- return pivot(fromScaling(v), origin);
281
- }
282
- const [x, y] = typeof v === 'number' ? [v, v] : v;
283
- // prettier-ignore
284
- return [
285
- x, 0,
286
- 0, y,
287
- 0, 0,
288
- ];
289
- }
290
- mat2d.fromScaling = fromScaling;
291
- /**
292
- * Alias for {@link fromScaling}
293
- * @category Shorthands
294
- */
295
- mat2d.scaling = fromScaling;
296
- /**
297
- * Creates a matrix from a vector translation
298
- * @category Generators
299
- *
300
- * @shorthands
301
- * - {@link translation}
302
- */
303
- function fromTranslation(v) {
304
- const [x, y] = typeof v === 'number' ? [v, v] : v;
305
- // prettier-ignore
306
- return [
307
- 1, 0,
308
- 0, 1,
309
- x, y,
310
- ];
311
- }
312
- mat2d.fromTranslation = fromTranslation;
313
- /**
314
- * Alias for {@link fromTranslation}
315
- * @category Shorthands
316
- */
317
- mat2d.translation = fromTranslation;
318
- /**
319
- * Creates a matrix from a vector skew
320
- * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/skew
321
- * @category Generators
322
- *
323
- * @shorthands
324
- * - {@link skewing}
325
- */
326
- function fromSkew(deg, origin) {
327
- if (origin) {
328
- return pivot(fromSkew(deg), origin);
329
- }
330
- const [ax, ay] = deg;
331
- const x = Math.tan(ax * Common.DEG2RAD);
332
- const y = Math.tan(ay * Common.DEG2RAD);
333
- // prettier-ignore
334
- return [
335
- 1, y,
336
- x, 1,
337
- 0, 0,
338
- ];
339
- }
340
- mat2d.fromSkew = fromSkew;
341
- /**
342
- * Alias for {@link fromSkew}
343
- * @category Shorthands
344
- */
345
- mat2d.skewing = fromSkew;
346
- /**
347
- * Computes a fixed point of the given matrix.
348
- * @param m The matrix to compute a fixed point of
349
- * @returns The fixed point of the given matrix, or null if the matrix is not invertible
350
- */
351
- function fixedPoint(m) {
352
- const [a, b, c, d, tx, ty] = m;
353
- // Computes (I - A)
354
- const iMinusA = [1 - a, -c, -b, 1 - d];
355
- // Computes an inverse matrix
356
- const iMinusAInv = mat2_1.mat2.invert(iMinusA);
357
- if (!iMinusAInv) {
358
- return null;
359
- }
360
- // Computes a fixed point
361
- const x = iMinusAInv[0] * tx + iMinusAInv[1] * ty;
362
- const y = iMinusAInv[2] * tx + iMinusAInv[3] * ty;
363
- return [x, y];
364
- }
365
- mat2d.fixedPoint = fixedPoint;
366
- /**
367
- * Returns Frobenius norm of a mat2d
368
- */
369
- function frob(a) {
370
- return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1);
371
- }
372
- mat2d.frob = frob;
373
- /**
374
- * Adds given mat2d's
375
- */
376
- function add(...ms) {
377
- const ret = [0, 0, 0, 0, 0, 0];
378
- for (const m of ms) {
379
- ret[0] += m[0];
380
- ret[1] += m[1];
381
- ret[2] += m[2];
382
- ret[3] += m[3];
383
- ret[4] += m[4];
384
- ret[5] += m[5];
385
- }
386
- return ret;
387
- }
388
- mat2d.add = add;
389
- /**
390
- * Subtracts matrix b from matrix a
391
- *
392
- * @shorthands
393
- * - {@link sub}
394
- */
395
- function subtract(...ms) {
396
- if (ms.length === 0) {
397
- return mat2d.zero;
398
- }
399
- else if (ms.length === 1) {
400
- const m = ms[0];
401
- return [-m[0], -m[1], -m[2], -m[3], -m[4], -m[5]];
402
- }
403
- else if (ms.length > 2) {
404
- const [a, b, ...rest] = ms;
405
- return subtract(subtract(a, b), ...rest);
406
- }
407
- const [a, b] = ms;
408
- return [
409
- a[0] - b[0],
410
- a[1] - b[1],
411
- a[2] - b[2],
412
- a[3] - b[3],
413
- a[4] - b[4],
414
- a[5] - b[5],
415
- ];
416
- }
417
- mat2d.subtract = subtract;
418
- /**
419
- * Alias for {@link subtract}
420
- * @category Shorthands
421
- */
422
- mat2d.sub = subtract;
423
- /**
424
- * Subtracts b from a
425
- */
426
- function delta(a, b) {
427
- return [
428
- b[0] - a[0],
429
- b[1] - a[1],
430
- b[2] - a[2],
431
- b[3] - a[3],
432
- b[4] - a[4],
433
- b[5] - a[5],
434
- ];
435
- }
436
- mat2d.delta = delta;
437
- /**
438
- * Multiply each element of the matrix by a scalar.
439
- */
440
- function multiplyScalar(a, s) {
441
- // prettier-ignore
442
- return [
443
- a[0] * s, a[1] * s,
444
- a[2] * s, a[3] * s,
445
- a[4] * s, a[5] * s,
446
- ];
447
- }
448
- mat2d.multiplyScalar = multiplyScalar;
449
- /**
450
- Adds given mat2d's after multiplying each element of the second operand by a scalar value.
451
- */
452
- function multiplyScalarAndAdd(a, b, scale) {
453
- return [
454
- a[0] + b[0] * scale,
455
- a[1] + b[1] * scale,
456
- a[2] + b[2] * scale,
457
- a[3] + b[3] * scale,
458
- a[4] + b[4] * scale,
459
- a[5] + b[5] * scale,
460
- ];
461
- }
462
- mat2d.multiplyScalarAndAdd = multiplyScalarAndAdd;
463
- /**
464
- * Constrain each element to lie between min and max
465
- * @see https://thebookofshaders.com/glossary/?search=clamp
466
- */
467
- function clamp(a, min, max) {
468
- return [
469
- Math.max(min, Math.min(max, a[0])),
470
- Math.max(min, Math.min(max, a[1])),
471
- Math.max(min, Math.min(max, a[2])),
472
- Math.max(min, Math.min(max, a[3])),
473
- Math.max(min, Math.min(max, a[4])),
474
- Math.max(min, Math.min(max, a[5])),
475
- ];
476
- }
477
- mat2d.clamp = clamp;
478
- /**
479
- * Clamps each element to [0, 1]
480
- */
481
- function clamp01(a) {
482
- return clamp(a, 0, 1);
483
- }
484
- mat2d.clamp01 = clamp01;
485
- /**
486
- * Clamps each element to [-1, 1]
487
- */
488
- function clamp11(a) {
489
- return clamp(a, -1, 1);
490
- }
491
- mat2d.clamp11 = clamp11;
492
- /**
493
- * Creates a matrix that maps from the given points to another. If the third point is not given, the orthogonal matrix is returned.
494
- * ```text
495
- * f-s f'-s'
496
- * |/ ---M--> |/
497
- * t t'
498
- * ```
499
- * @category Generators
500
- * @param first a pair of first point
501
- * @param second a pair of second point
502
- * @param third a pair of third point
503
- */
504
- function fromPoints(first, second, third) {
505
- if (!third) {
506
- // Computes third points by rotating second points 90 degrees
507
- const PI_HALF = Math.PI / 2;
508
- third = [
509
- vec2_1.vec2.add(first[0], vec2_1.vec2.rotate(vec2_1.vec2.sub(second[0], first[0]), PI_HALF)),
510
- vec2_1.vec2.add(first[1], vec2_1.vec2.rotate(vec2_1.vec2.sub(second[1], first[1]), PI_HALF)),
511
- ];
512
- }
513
- // Creates an affine matrix whose origin is first,
514
- // [1, 0] is second, and [1, 0] is third.
515
- // Then computes M = M_dst * M_src^-1
516
- const src = [
517
- second[0][0] - first[0][0],
518
- second[0][1] - first[0][1],
519
- third[0][0] - first[0][0],
520
- third[0][1] - first[0][1],
521
- first[0][0],
522
- first[0][1],
523
- ];
524
- const srcInv = invert(src);
525
- if (!srcInv) {
526
- return null;
527
- }
528
- const dst = [
529
- second[1][0] - first[1][0],
530
- second[1][1] - first[1][1],
531
- third[1][0] - first[1][0],
532
- third[1][1] - first[1][1],
533
- first[1][0],
534
- first[1][1],
535
- ];
536
- return multiply(dst, srcInv);
537
- }
538
- mat2d.fromPoints = fromPoints;
539
- /**
540
- * Creates a matrix from given translation, rotation, and scaling. The order of the transformations is translation, rotation, and scaling, like most of the graphics software.
541
- * @param t Translation vector
542
- * @param r Rotation angle in degrees
543
- * @param s Scaling vector or a number
544
- * @returns The matrix that represents the transformation
545
- *
546
- * @shorthands
547
- * - {@link trs}
548
- */
549
- function fromTRS(t = null, r = null, s = null) {
550
- t ??= vec2_1.vec2.zero;
551
- r ??= 0;
552
- if (s === null) {
553
- s = vec2_1.vec2.one;
554
- }
555
- else if (typeof s === 'number') {
556
- s = [s, s];
557
- }
558
- const C = Math.cos(r * Common.DEG2RAD);
559
- const S = Math.sin(r * Common.DEG2RAD);
560
- return [s[0] * C, s[0] * S, s[1] * -S, s[1] * C, ...t];
561
- }
562
- mat2d.fromTRS = fromTRS;
563
- /**
564
- * Alias for {@link fromTRS}
565
- * @category Shorthands
566
- */
567
- mat2d.trs = fromTRS;
568
- /**
569
- * Copies a the values from {@link mat2}, assuming the translation component is `[0, 0]`
570
- * @param m The matrix to convert
571
- * @returns The newly created matrix
572
- * @category Generators
573
- */
574
- function fromMat2(m) {
575
- return [...m, 0, 0];
576
- }
577
- mat2d.fromMat2 = fromMat2;
578
- /**
579
- * Returns whether or not the matrices have exactly the same elements in the same position (when compared with `===`)
580
- *
581
- * @shorthands
582
- * - {@link eq}
583
- */
584
- function exactEquals(a, b) {
585
- return (a[0] === b[0] &&
586
- a[1] === b[1] &&
587
- a[2] === b[2] &&
588
- a[3] === b[3] &&
589
- a[4] === b[4] &&
590
- a[5] === b[5]);
591
- }
592
- mat2d.exactEquals = exactEquals;
593
- /**
594
- * Alias for {@link exactEquals}
595
- * @category Shorthands
596
- */
597
- mat2d.eq = exactEquals;
598
- /**
599
- * Returns whether or not the matrices have approximately the same elements in the same position.
600
- *
601
- * @shorthands
602
- * - {@link approx}
603
- * - {@link equals}
604
- */
605
- function approxEquals(a, b) {
606
- const [a0, a1, a2, a3, a4, a5] = a;
607
- const [b0, b1, b2, b3, b4, b5] = b;
608
- return (Math.abs(a0 - b0) <=
609
- Common.EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) &&
610
- Math.abs(a1 - b1) <=
611
- Common.EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) &&
612
- Math.abs(a2 - b2) <=
613
- Common.EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) &&
614
- Math.abs(a3 - b3) <=
615
- Common.EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) &&
616
- Math.abs(a4 - b4) <=
617
- Common.EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) &&
618
- Math.abs(a5 - b5) <=
619
- Common.EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)));
620
- }
621
- mat2d.approxEquals = approxEquals;
622
- /**
623
- * Alias for {@link approxEquals}
624
- * @category Shorthands
625
- */
626
- mat2d.approx = approxEquals;
627
- /**
628
- * Alias for {@link approxEquals}. This is provided for compatibility with gl-matrix.
629
- * @category Shorthands
630
- * @deprecated Use {@link approxEquals} instead
631
- */
632
- mat2d.equals = approxEquals;
633
- /**
634
- * Returns a string representation of a mat2d
635
- * @param m matrix to represent as a string
636
- * @param fractionDigits number of digits to appear after the decimal point
637
- */
638
- mat2d.toString = Common.createMatToStringFunction(2, 3);
639
- })(mat2d || (exports.mat2d = mat2d = {}));
640
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0MmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWF0MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQWtDO0FBQ2xDLGlDQUEyQjtBQUMzQixpQ0FBMkI7QUE2QjNCOzs7O0dBSUc7QUFDSCxJQUFpQixLQUFLLENBeXFCckI7QUF6cUJELFdBQWlCLEtBQUs7SUFZckI7OztPQUdHO0lBQ0gsa0JBQWtCO0lBQ2xCLFNBQWdCLEVBQUUsQ0FDakIsQ0FBUyxFQUFHLENBQVMsRUFDckIsQ0FBUyxFQUFHLENBQVMsRUFDckIsRUFBVSxFQUFFLEVBQVU7UUFFdEIsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDNUIsQ0FBQztJQU5lLFFBQUUsS0FNakIsQ0FBQTtJQUVEOzs7T0FHRztJQUNILFNBQWdCLEtBQUssQ0FBQyxDQUFRO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ2QsQ0FBQztJQUZlLFdBQUssUUFFcEIsQ0FBQTtJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILGtCQUFrQjtJQUNMLGNBQVEsR0FBVSxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzVDLENBQUMsRUFBRSxDQUFDO1FBQ0osQ0FBQyxFQUFFLENBQUM7UUFDSixDQUFDLEVBQUUsQ0FBQztLQUNKLENBQUMsQ0FBQTtJQUVGOzs7T0FHRztJQUNVLE9BQUMsR0FBRyxNQUFBLFFBQVEsQ0FBQTtJQUV6Qjs7O09BR0c7SUFDVSxRQUFFLEdBQUcsTUFBQSxRQUFRLENBQUE7SUFFMUI7OztPQUdHO0lBQ1UsV0FBSyxHQUFHLE1BQUEsUUFBUSxDQUFBO0lBRTdCOzs7T0FHRztJQUNVLFVBQUksR0FBVSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFB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LENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3pELENBQUE7SUFDRixDQUFDO0lBakJlLGtCQUFZLGVBaUIzQixDQUFBO0lBRUQ7OztPQUdHO0lBQ1UsWUFBTSxHQUFHLFlBQVksQ0FBQTtJQUVsQzs7OztPQUlHO0lBQ1UsWUFBTSxHQUFHLFlBQVksQ0FBQTtJQUVsQzs7OztPQUlHO0lBQ1UsY0FBUSxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUdsRCxDQUFBO0FBQ1osQ0FBQyxFQXpxQmdCLEtBQUsscUJBQUwsS0FBSyxRQXlxQnJCIn0=