svg-path-commander 2.1.0 → 2.1.2

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 (63) hide show
  1. package/README.md +63 -7
  2. package/dist/svg-path-commander.cjs +1 -1
  3. package/dist/svg-path-commander.cjs.map +1 -1
  4. package/dist/svg-path-commander.d.ts +314 -40
  5. package/dist/svg-path-commander.js +1 -1
  6. package/dist/svg-path-commander.js.map +1 -1
  7. package/dist/svg-path-commander.mjs +1085 -1032
  8. package/dist/svg-path-commander.mjs.map +1 -1
  9. package/package.json +8 -8
  10. package/src/convert/pathToAbsolute.ts +5 -88
  11. package/src/convert/pathToCurve.ts +22 -28
  12. package/src/convert/pathToRelative.ts +4 -78
  13. package/src/convert/pathToString.ts +40 -7
  14. package/src/index.ts +145 -58
  15. package/src/interface.ts +3 -2
  16. package/src/math/arcTools.ts +259 -80
  17. package/src/math/bezier.ts +58 -58
  18. package/src/math/cubicTools.ts +68 -25
  19. package/src/math/distanceSquareRoot.ts +3 -1
  20. package/src/math/lineTools.ts +42 -25
  21. package/src/math/midPoint.ts +3 -1
  22. package/src/math/polygonTools.ts +48 -0
  23. package/src/math/quadTools.ts +46 -25
  24. package/src/math/rotateVector.ts +3 -2
  25. package/src/math/roundTo.ts +7 -0
  26. package/src/parser/finalizeSegment.ts +11 -7
  27. package/src/parser/parsePathString.ts +4 -5
  28. package/src/parser/pathParser.ts +1 -1
  29. package/src/process/absolutizeSegment.ts +63 -0
  30. package/src/process/arcToCubic.ts +2 -2
  31. package/src/process/iterate.ts +58 -0
  32. package/src/process/lineToCubic.ts +1 -1
  33. package/src/process/normalizePath.ts +17 -28
  34. package/src/process/normalizeSegment.ts +55 -18
  35. package/src/process/optimizePath.ts +40 -60
  36. package/src/process/projection2d.ts +4 -3
  37. package/src/process/relativizeSegment.ts +59 -0
  38. package/src/process/reverseCurve.ts +8 -5
  39. package/src/process/reversePath.ts +88 -75
  40. package/src/process/roundPath.ts +18 -14
  41. package/src/process/roundSegment.ts +9 -0
  42. package/src/process/segmentToCubic.ts +10 -8
  43. package/src/process/shortenSegment.ts +26 -34
  44. package/src/process/splitCubic.ts +10 -9
  45. package/src/process/splitPath.ts +38 -4
  46. package/src/process/transformPath.ts +75 -73
  47. package/src/types.ts +30 -0
  48. package/src/util/getPathArea.ts +3 -3
  49. package/src/util/getPathBBox.ts +69 -19
  50. package/src/util/getPointAtLength.ts +100 -4
  51. package/src/util/getPropertiesAtLength.ts +3 -4
  52. package/src/util/getPropertiesAtPoint.ts +5 -5
  53. package/src/util/getTotalLength.ts +56 -4
  54. package/test/class.test.ts +17 -14
  55. package/test/fixtures/shapes.js +26 -26
  56. package/test/fixtures/simpleShapes.js +18 -18
  57. package/test/static.test.ts +54 -28
  58. package/cypress.config.ts +0 -29
  59. package/src/math/polygonArea.ts +0 -27
  60. package/src/math/polygonLength.ts +0 -21
  61. package/src/process/fixArc.ts +0 -23
  62. package/src/process/replaceArc.ts +0 -52
  63. package/src/util/pathFactory.ts +0 -130
@@ -1,5 +1,11 @@
1
- import type { PathArray } from '../types';
2
- import pathFactory from './pathFactory';
1
+ import DISTANCE_EPSILON from './distanceEpsilon';
2
+ import type { MSegment, PathArray, PointTuple } from '../types';
3
+ import iterate from '../process/iterate';
4
+ import { getLineLength, getPointAtLineLength } from '../math/lineTools';
5
+ import { getArcLength, getPointAtArcLength } from '../math/arcTools';
6
+ import { getCubicLength, getPointAtCubicLength } from '../math/cubicTools';
7
+ import { getQuadLength, getPointAtQuadLength } from '../math/quadTools';
8
+ import normalizePath from '../process/normalizePath';
3
9
 
4
10
  /**
5
11
  * Returns [x,y] coordinates of a point at a given length of a shape.
@@ -8,7 +14,97 @@ import pathFactory from './pathFactory';
8
14
  * @param distance the length of the shape to look at
9
15
  * @returns the requested {x, y} point coordinates
10
16
  */
11
- const getPointAtLength = (pathInput: string | PathArray, distance: number) => {
12
- return pathFactory(pathInput, distance).point;
17
+ const getPointAtLength = (pathInput: string | PathArray, distance?: number) => {
18
+ const path = normalizePath(pathInput);
19
+ let isM = false;
20
+ let data = [] as number[];
21
+ let pathCommand = 'M';
22
+ let x = 0;
23
+ let y = 0;
24
+ let [mx, my] = path[0].slice(1) as PointTuple;
25
+ const distanceIsNumber = typeof distance === 'number';
26
+ let point = { x: mx, y: my };
27
+ let length = 0;
28
+ let POINT = point;
29
+ let totalLength = 0;
30
+
31
+ if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;
32
+
33
+ // for (let i = 0; i < pathLen; i += 1) {
34
+ iterate(path, (seg, _, lastX, lastY) => {
35
+ [pathCommand] = seg;
36
+ isM = pathCommand === 'M';
37
+ data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;
38
+
39
+ // this segment is always ZERO
40
+ /* istanbul ignore else @preserve */
41
+ if (isM) {
42
+ // remember mx, my for Z
43
+ [, mx, my] = seg as MSegment;
44
+ point = { x: mx, y: my };
45
+ length = 0;
46
+ } else if (pathCommand === 'L') {
47
+ point = getPointAtLineLength(data[0], data[1], data[2], data[3], distance - totalLength);
48
+ length = getLineLength(data[0], data[1], data[2], data[3]);
49
+ } else if (pathCommand === 'A') {
50
+ point = getPointAtArcLength(
51
+ data[0],
52
+ data[1],
53
+ data[2],
54
+ data[3],
55
+ data[4],
56
+ data[5],
57
+ data[6],
58
+ data[7],
59
+ data[8],
60
+ distance - totalLength,
61
+ );
62
+ length = getArcLength(data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]);
63
+ } else if (pathCommand === 'C') {
64
+ point = getPointAtCubicLength(
65
+ data[0],
66
+ data[1],
67
+ data[2],
68
+ data[3],
69
+ data[4],
70
+ data[5],
71
+ data[6],
72
+ data[7],
73
+ distance - totalLength,
74
+ );
75
+ length = getCubicLength(data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
76
+ } else if (pathCommand === 'Q') {
77
+ point = getPointAtQuadLength(data[0], data[1], data[2], data[3], data[4], data[5], distance - totalLength);
78
+ length = getQuadLength(data[0], data[1], data[2], data[3], data[4], data[5]);
79
+ } else if (pathCommand === 'Z') {
80
+ data = [lastX, lastY, mx, my];
81
+ point = { x: mx, y: my };
82
+
83
+ length = getLineLength(data[0], data[1], data[2], data[3]);
84
+ }
85
+
86
+ [x, y] = data.slice(-2);
87
+
88
+ if (totalLength < distance) {
89
+ POINT = point;
90
+ } else {
91
+ // totalLength >= distance
92
+ // stop right here
93
+ // stop iterator now!
94
+ return false;
95
+ }
96
+
97
+ totalLength += length;
98
+ return;
99
+ });
100
+
101
+ // native `getPointAtLength` behavior when the given distance
102
+ // is higher than total length
103
+ if (distance > totalLength - DISTANCE_EPSILON) {
104
+ return { x, y };
105
+ }
106
+
107
+ return POINT;
13
108
  };
109
+
14
110
  export default getPointAtLength;
@@ -20,8 +20,6 @@ const getPropertiesAtLength = (pathInput: string | PathArray, distance?: number)
20
20
  let lengthAtSegment = 0;
21
21
  let length = 0;
22
22
  let segment = pathArray[0] as PathSegment;
23
- const [x, y] = segment.slice(-2) as [number, number];
24
- const point = { x, y };
25
23
 
26
24
  // If the path is empty, return 0.
27
25
  if (index <= 0 || !distance || !Number.isFinite(distance)) {
@@ -29,7 +27,6 @@ const getPropertiesAtLength = (pathInput: string | PathArray, distance?: number)
29
27
  segment,
30
28
  index: 0,
31
29
  length,
32
- point,
33
30
  lengthAtSegment,
34
31
  };
35
32
  }
@@ -38,8 +35,9 @@ const getPropertiesAtLength = (pathInput: string | PathArray, distance?: number)
38
35
  pathTemp = pathArray.slice(0, -1) as PathArray;
39
36
  lengthAtSegment = getTotalLength(pathTemp);
40
37
  length = pathLength - lengthAtSegment;
38
+ segment = pathArray[index];
41
39
  return {
42
- segment: pathArray[index],
40
+ segment,
43
41
  index,
44
42
  length,
45
43
  lengthAtSegment,
@@ -53,6 +51,7 @@ const getPropertiesAtLength = (pathInput: string | PathArray, distance?: number)
53
51
  lengthAtSegment = getTotalLength(pathTemp);
54
52
  length = pathLength - lengthAtSegment;
55
53
  pathLength = lengthAtSegment;
54
+
56
55
  segments.push({
57
56
  segment,
58
57
  index,
@@ -1,4 +1,4 @@
1
- import type { PathArray } from '../types';
1
+ import type { PathArray, Point } from '../types';
2
2
  import type { PointProperties } from '../interface';
3
3
  import getPointAtLength from './getPointAtLength';
4
4
  import getPropertiesAtLength from './getPropertiesAtLength';
@@ -16,17 +16,17 @@ import normalizePath from '../process/normalizePath';
16
16
  * @param point the given point
17
17
  * @returns the requested properties
18
18
  */
19
- const getPropertiesAtPoint = (pathInput: string | PathArray, point: { x: number; y: number }): PointProperties => {
19
+ const getPropertiesAtPoint = (pathInput: string | PathArray, point: Point): PointProperties => {
20
20
  const path = parsePathString(pathInput);
21
21
  const normalPath = normalizePath(path);
22
- const pathLength = getTotalLength(path);
23
- const distanceTo = (p: { x: number; y: number }) => {
22
+ const pathLength = getTotalLength(normalPath);
23
+ const distanceTo = (p: Point) => {
24
24
  const dx = p.x - point.x;
25
25
  const dy = p.y - point.y;
26
26
  return dx * dx + dy * dy;
27
27
  };
28
28
  let precision = 8;
29
- let scan: { x: number; y: number };
29
+ let scan: Point;
30
30
  let closest = { x: 0, y: 0 }; // make TS happy
31
31
  let scanDistance = 0;
32
32
  let bestLength = 0;
@@ -1,5 +1,13 @@
1
- import type { PathArray } from '../types';
2
- import pathFactory from './pathFactory';
1
+ import type { MSegment, PathArray } from '../types';
2
+ import { getLineLength } from '../math/lineTools';
3
+ import { getArcLength } from '../math/arcTools';
4
+ import { getCubicLength } from '../math/cubicTools';
5
+ import { getQuadLength } from '../math/quadTools';
6
+ import iterate from '../process/iterate';
7
+ // import normalizePath from '../process/normalizePath';
8
+ import parsePathString from '../parser/parsePathString';
9
+ import paramsParser from '../parser/paramsParser';
10
+ import normalizeSegment from '../process/normalizeSegment';
3
11
 
4
12
  /**
5
13
  * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.
@@ -10,7 +18,51 @@ import pathFactory from './pathFactory';
10
18
  * @param pathInput the target `pathArray`
11
19
  * @returns the shape total length
12
20
  */
13
- const getTotalLength = (pathInput: string | PathArray): number => {
14
- return pathFactory(pathInput).length;
21
+ const getTotalLength = (pathInput: string | PathArray) => {
22
+ const path = parsePathString(pathInput);
23
+ const params = { ...paramsParser };
24
+
25
+ let isM = false;
26
+ let data = [] as number[];
27
+ let pathCommand = 'M';
28
+ let mx = 0;
29
+ let my = 0;
30
+ let totalLength = 0;
31
+
32
+ iterate(path, (seg, _, lastX, lastY) => {
33
+ params.x = lastX;
34
+ params.y = lastY;
35
+ const normalSegment = normalizeSegment(seg, params);
36
+ [pathCommand] = normalSegment;
37
+ isM = pathCommand === 'M';
38
+ data = !isM ? [lastX, lastY].concat(normalSegment.slice(1) as number[]) : data;
39
+
40
+ // this segment is always ZERO
41
+ /* istanbul ignore else @preserve */
42
+ if (isM) {
43
+ // remember mx, my for Z
44
+ [, mx, my] = normalSegment as MSegment;
45
+ } else if (pathCommand === 'L') {
46
+ totalLength += getLineLength(data[0], data[1], data[2], data[3]);
47
+ } else if (pathCommand === 'A') {
48
+ totalLength += getArcLength(data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]);
49
+ } else if (pathCommand === 'C') {
50
+ totalLength += getCubicLength(data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
51
+ } else if (pathCommand === 'Q') {
52
+ totalLength += getQuadLength(data[0], data[1], data[2], data[3], data[4], data[5]);
53
+ } else if (pathCommand === 'Z') {
54
+ data = [lastX, lastY, mx, my];
55
+ totalLength += getLineLength(data[0], data[1], data[2], data[3]);
56
+ }
57
+
58
+ const seglen = normalSegment.length;
59
+ params.x1 = +normalSegment[seglen - 2];
60
+ params.y1 = +normalSegment[seglen - 1];
61
+ params.x2 = +normalSegment[seglen - 4] || params.x1;
62
+ params.y2 = +normalSegment[seglen - 3] || params.y1;
63
+ });
64
+
65
+ return totalLength;
15
66
  };
67
+
16
68
  export default getTotalLength;
@@ -121,7 +121,8 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
121
121
  V2
122
122
  a2 2 0 0 0-2-2
123
123
  H2
124
- z`
124
+ z`,
125
+ { origin: [8,8,24] }
125
126
  );
126
127
  expect(rect.segments).to.have.length(10);
127
128
  expect(rect.origin).to.deep.equal([8,8,24]);
@@ -155,7 +156,7 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
155
156
  expect(path.getAttribute('d')).to.equal(star1.toString());
156
157
  });
157
158
 
158
- it('Test rounding `auto`, `off`, and [0-5]', async () => {
159
+ it('Test rounding `off`, and [0-5]', async () => {
159
160
  const container = getMarkup();
160
161
  wrapper.append(container);
161
162
  await vi.waitFor(() => container.querySelector('svg'), { timeout: 200 });
@@ -163,7 +164,7 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
163
164
 
164
165
  const rect = new SVGPathCommander(
165
166
  'M2 0C0.8954304997175604 -8.780183295920349e-10 -1.3527075029566811e-16 0.8954304997175604 0 2C0 2 0 9.875 0 14C1.3527075029566811e-16 15.10456950028244 0.8954304997175604 16.000000000878018 2 16C8 16 10.25 16 14 16C15.104569499040734 15.999999999121982 16 15.104569499040734 16 14C16 8 16 5.75 16 2C16 0.8954305009592662 15.104569499040734 8.780185991465076e-10 14 0C8 0 5.75 0 2 0',
166
- { round: 'auto' }
167
+ { round: 2 }
167
168
  );
168
169
  expect(rect.round).to.equal(2);
169
170
  path.setAttribute('d', rect.toString());
@@ -171,15 +172,15 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
171
172
 
172
173
  const rect1 = new SVGPathCommander(
173
174
  'M7.94 7.92C7.928954 7.92 7.92 7.928954 7.92 7.94C7.92 7.94 7.92 8.01875 7.92 8.06C7.92 8.071046 7.928954 8.08 7.94 8.08C8 8.08 8.0225 8.08 8.06 8.08C8.071046 8.08 8.08 8.071046 8.08 8.06C8.08 8 8.08 7.9775 8.08 7.94C8.08 7.928954 8.071046 7.92 8.06 7.92C8 7.92 7.9775 7.92 7.94 7.92',
174
- { round: 'auto' }
175
+ { round: 'off' }
175
176
  );
176
- expect(rect1.round).to.equal(3);
177
+ expect(rect1.round).to.equal('off');
177
178
  path.setAttribute('d', rect1.toString());
178
- expect(path.getAttribute('d')).to.equal('M7.94 7.92C7.929 7.92 7.92 7.929 7.92 7.94C7.92 7.94 7.92 8.019 7.92 8.06C7.92 8.071 7.929 8.08 7.94 8.08C8 8.08 8.023 8.08 8.06 8.08C8.071 8.08 8.08 8.071 8.08 8.06C8.08 8 8.08 7.978 8.08 7.94C8.08 7.929 8.071 7.92 8.06 7.92C8 7.92 7.978 7.92 7.94 7.92')
179
+ expect(path.getAttribute('d')).to.equal('M7.94 7.92C7.928954 7.92 7.92 7.928954 7.92 7.94C7.92 7.94 7.92 8.01875 7.92 8.06C7.92 8.071046 7.928954 8.08 7.94 8.08C8 8.08 8.0225 8.08 8.06 8.08C8.071046 8.08 8.08 8.071046 8.08 8.06C8.08 8 8.08 7.9775 8.08 7.94C8.08 7.928954 8.071046 7.92 8.06 7.92C8 7.92 7.9775 7.92 7.94 7.92')
179
180
 
180
181
  const rect2 = new SVGPathCommander(
181
182
  'M895.02 5.12C963.38 5.12 1018.88 60.62 1018.88 128.98V895.03C1018.88 963.39 963.38 1018.89 895.02 1018.89H128.98C60.62 1018.88 5.12 963.38 5.12 895.02V128.98C5.12 60.62 60.62 5.12 128.98 5.12H895.03Z',
182
- { round: 'auto' }
183
+ { round: 0 }
183
184
  );
184
185
  expect(rect2.round).to.equal(0);
185
186
  path.setAttribute('d', rect2.toString());
@@ -221,7 +222,7 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
221
222
  expect(pt1).to.deep.equal({ x: 2, y: 0 });
222
223
 
223
224
  const pt2 = new SVGPathCommander('M2 0A0 2 0 00 0 2').getPointAtLength(0.5);
224
- expect(pt2).to.deep.equal({x: 1.6464466094067263, y: 0.35355339059327373 });
225
+ expect(pt2).to.deep.equal({x: 0, y: 2 });
225
226
 
226
227
  const pt3 = new SVGPathCommander('M2 0A3 2 0 00 0 2').getPointAtLength(5);
227
228
  expect(pt3).to.deep.equal({x: 0, y: 2});
@@ -281,7 +282,9 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
281
282
  const rect = new SVGPathCommander('M2 0A2 2 0 0 0 0 2L0 14A2 2 0 0 0 2 16L14 16A2 2 0 0 0 16 14L16 2A2 2 0 0 0 14 0L2 0Z').optimize();
282
283
 
283
284
  path.setAttribute('d', rect.toString());
284
- expect(path.getAttribute('d')).to.equal('M2 0A2 2 0 0 0 0 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2V2A2 2 0 0 0 14 0H2z')
285
+ expect(path.getAttribute('d')).to.equal('M2 0A2 2 0 0 0 0 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2V2A2 2 0 0 0 14 0H2z');
286
+ // add at least one round: 'off' test
287
+ expect(new SVGPathCommander(simpleShapes.normalized[2], { round: 'off' }).optimize().toString()).to.equal(simpleShapes.initial[2]);
285
288
  });
286
289
 
287
290
  it('Test reverse single path', async () => {
@@ -357,7 +360,7 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
357
360
  }
358
361
  const rect = new SVGPathCommander('M2 0a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V2a2 2 0 00-2-2H2z').transform(transform);
359
362
  path.setAttribute('d', rect.toString());
360
- expect(path.getAttribute('d')).to.equal('M4.2822 -0.7292C3.2968 -1.0661 2.2579 -0.6161 1.968 0.3039L-1.818 12.3193C-2.2382 13.6528 -1.5362 14.9914 -0.2586 15.2621L12.2189 17.9057C13.2524 18.1247 14.1807 17.2742 14.3045 16.0438L15.4431 4.7255C15.5321 3.8414 14.9376 2.9137 14.1072 2.6298L4.2822 -0.7292Z')
363
+ expect(path.getAttribute('d')).to.equal('M1.829 0.5176C0.8189 0.2318 -0.1718 0.8649 -0.3837 1.9319L-2.6856 13.523C-2.8975 14.5899 -2.2504 15.6866 -1.2403 15.9725L9.734 19.0783C10.7442 19.3642 11.7349 18.731 11.9468 17.6641L14.2487 6.073C14.4606 5.006 13.8135 3.9094 12.8033 3.6235L1.829 0.5176Z')
361
364
  });
362
365
 
363
366
  it('Test transform with custom [x,y] origin', async () => {
@@ -373,7 +376,7 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
373
376
  }
374
377
  const rect = new SVGPathCommander('M2 0a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V2a2 2 0 00-2-2H2z').transform(transform);
375
378
  path.setAttribute('d', rect.toString());
376
- expect(path.getAttribute('d')).to.equal('M1.803 0.5103C0.8136 0.2303 -0.1738 0.8753 -0.3942 1.9847L-3.3005 16.6188C-3.6264 18.2599 -2.8358 19.7672 -1.5474 19.9273L10.9598 21.4806C11.9895 21.6085 12.8318 20.4819 12.8569 19.0097L13.0856 5.5772C13.1033 4.5361 12.4554 3.525 11.6282 3.2909L1.803 0.5103Z')
379
+ expect(path.getAttribute('d')).to.equal('M1.829 0.5176C0.8189 0.2318 -0.1718 0.8649 -0.3837 1.9319L-2.6856 13.523C-2.8975 14.5899 -2.2504 15.6866 -1.2403 15.9725L9.734 19.0783C10.7442 19.3642 11.7349 18.731 11.9468 17.6641L14.2487 6.073C14.4606 5.006 13.8135 3.9094 12.8033 3.6235L1.829 0.5176Z')
377
380
  });
378
381
 
379
382
  it('Test transform with custom [x,y,z] origin option', async () => {
@@ -391,7 +394,7 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
391
394
  expect(path.getAttribute('d')).to.equal('M2.2644 -1.6232C1.1515 -1.9382 -0.0487 -1.2959 -0.4093 -0.1515L-5.2306 15.1494C-5.7788 16.8892 -5.0014 18.5047 -3.5039 18.6907L10.9116 20.4811C12.0888 20.6273 13.1574 19.4458 13.3135 17.8935L14.7232 3.8815C14.8313 2.8068 14.1803 1.7491 13.2594 1.4884L2.2644 -1.6232Z');
392
395
  });
393
396
 
394
- it('Test transform with invalid origin value/option, should use [50%,50%,50%] shape', async () => {
397
+ it('Test transform with invalid origin value/option, should use [0,0,0]', async () => {
395
398
  const container = getMarkup();
396
399
  wrapper.append(container);
397
400
  await vi.waitFor(() => container.querySelector('svg'), { timeout: 200 });
@@ -405,7 +408,7 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
405
408
  // @ts-expect-error
406
409
  const rect = new SVGPathCommander('M2 0a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V2a2 2 0 00-2-2H2z', { origin: ['a','f','-8f'] }).transform(transform);
407
410
  path.setAttribute('d', rect.toString());
408
- expect(path.getAttribute('d')).to.equal('M3.5911 -2.3521C2.4146 -2.7667 1.158 -2.2665 0.7928 -1.1956L-4.1699 13.354C-4.7437 15.0361 -3.8887 16.7162 -2.2722 17.0327L13.1318 20.0493C14.3773 20.2932 15.4739 19.2147 15.5997 17.6963L16.7208 4.1634C16.8057 3.1381 16.1043 2.0583 15.1425 1.7193L3.5911 -2.3521Z');
411
+ expect(path.getAttribute('d')).to.equal('M2.1949 0.6212C0.9827 0.2781 -0.2061 1.0379 -0.4604 2.3182L-3.2228 16.2276C-3.477 17.5079 -2.7005 18.8239 -1.4883 19.1669L11.6808 22.8939C12.893 23.237 14.0818 22.4772 14.3361 21.1969L17.0985 7.2875C17.3527 6.0072 16.5762 4.6912 15.364 4.3482L2.1949 0.6212Z');
409
412
 
410
413
  const transform1 = {
411
414
  rotate: [15,15],
@@ -416,7 +419,7 @@ a1.63 1.63 0 0 0 -0.906 0.274a1.63 1.63 0 0 0 -0.601 0.73a1.63 1.63 0 0 0 -0.094
416
419
  // @ts-expect-error
417
420
  const rect1 = new SVGPathCommander('M2 0a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V2a2 2 0 00-2-2H2z').transform(transform1);
418
421
  path.setAttribute('d', rect1.toString());
419
- expect(path.getAttribute('d')).to.equal('M3.5911 -2.3521C2.4146 -2.7667 1.158 -2.2665 0.7928 -1.1956L-4.1699 13.354C-4.7437 15.0361 -3.8887 16.7162 -2.2722 17.0327L13.1318 20.0493C14.3773 20.2932 15.4739 19.2147 15.5997 17.6963L16.7208 4.1634C16.8057 3.1381 16.1043 2.0583 15.1425 1.7193L3.5911 -2.3521Z');
422
+ expect(path.getAttribute('d')).to.equal('M2.1949 0.6212C0.9827 0.2781 -0.2061 1.0379 -0.4604 2.3182L-3.2228 16.2276C-3.477 17.5079 -2.7005 18.8239 -1.4883 19.1669L11.6808 22.8939C12.893 23.237 14.0818 22.4772 14.3361 21.1969L17.0985 7.2875C17.3527 6.0072 16.5762 4.6912 15.364 4.3482L2.1949 0.6212Z');
420
423
  });
421
424
 
422
425
  simpleShapes.initial.forEach((shape, i) => {
@@ -21,23 +21,23 @@ const shapes = {
21
21
  ],
22
22
  optimized: [
23
23
  "M16 8C16 4.13 12.42 1 8 1S0 4.13 0 8c0 1.76 0.74 3.37 1.97 4.6c-0.1 1.02 -0.42 2.13 -0.77 2.97c-0.08 0.19 0.07 0.39 0.27 0.36c2.26 -0.37 3.6 -0.94 4.18 -1.23A9.06 9.06 0 0 0 8 15c4.42 0 8 -3.13 8 -7zM7.19 6.77c0.09 0.12 0.16 0.26 0.23 0.4c0.43 0.95 0.39 2.38 -0.94 3.71a0.45 0.45 0 0 1 -0.61 0.01A0.41 0.41 0 0 1 5.86 10.29C6.27 9.88 6.53 9.46 6.67 9.07C6.4 9.24 6.08 9.33 5.74 9.33C4.78 9.33 4 8.59 4 7.67S4.78 6 5.73 6c0.27 0 0.53 0.06 0.76 0.17l0.01 0c0.17 0.07 0.33 0.18 0.47 0.32c0.08 0.08 0.16 0.17 0.23 0.27zM11 9.07c-0.27 0.16 -0.59 0.26 -0.93 0.26C9.11 9.33 8.34 8.59 8.34 7.67S9.11 6 10.07 6c0.27 0 0.53 0.06 0.76 0.17l0.01 0C11 6.24 11.16 6.35 11.3 6.49c0.09 0.08 0.16 0.17 0.23 0.27c0.09 0.12 0.16 0.26 0.23 0.4c0.43 0.95 0.39 2.38 -0.94 3.71a0.45 0.45 0 0 1 -0.61 0.01a0.41 0.41 0 0 1 -0.01 -0.59C10.61 9.87 10.86 9.46 11 9.07z",
24
- "M16 14V5H0v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2zM2.56 12.33H1.85L3.75 7h0.7l1.9 5.33H5.62l-0.54 -1.6H3.1l-0.54 1.6zM4.1 7.81H4.08l-0.8 2.38H4.9L4.1 7.81zM9.85 8.23v4.11H9.18v-0.54H9.16C9.01 12.12 8.62 12.4 7.97 12.4c-0.85 0 -1.45 -0.48 -1.45 -1.43V8.23h0.68v2.55c0 0.77 0.44 1.01 0.98 1.01c0.59 0 1 -0.37 1 -1.02V8.23h0.68zM11.12 12.64c0.07 0.33 0.42 0.64 0.98 0.64c0.65 0 1.07 -0.38 1.07 -1.02v-0.61h-0.02C13 12 12.55 12.29 11.99 12.29c-0.96 0 -1.64 -0.67 -1.64 -1.9v-0.34c0 -1.21 0.68 -1.89 1.64 -1.89c0.56 0 1 0.29 1.2 0.64h0.02V8.23h0.65v4.03c0 1.05 -0.82 1.58 -1.75 1.58c-1.04 0 -1.57 -0.52 -1.67 -1.2h0.69zM13.18 10.1c0 -0.83 -0.41 -1.36 -1.06 -1.36c-0.69 0 -1.1 0.49 -1.1 1.36v0.25c0 0.85 0.41 1.36 1.1 1.36c0.67 0 1.06 -0.52 1.06 -1.36V10.1zM4 0.5a0.5 0.5 0 0 0 -1 0V1H2A2 2 0 0 0 0 3v1h16V3A2 2 0 0 0 14 1h-1V0.5a0.5 0.5 0 0 0 -1 0V1H4V0.5z",
25
- "M5.5 0.5A0.5 0.5 0 0 1 6 0h4a0.5 0.5 0 0 1 0 1H9v1.07a7 7 0 0 1 3.54 12.26l0.82 0.82a0.5 0.5 0 0 1 -0.71 0.71l-0.92 -0.93A6.97 6.97 0 0 1 8 16A6.97 6.97 0 0 1 4.28 14.93l-0.92 0.92A0.5 0.5 0 0 1 2.65 15.15l0.82 -0.82A7 7 0 0 1 7 2.07V1H6A0.5 0.5 0 0 1 5.5 0.5zM0.86 5.39A2.5 2.5 0 1 1 4.39 1.86A8.04 8.04 0 0 0 0.86 5.39zM13.5 1c-0.75 0 -1.43 0.33 -1.89 0.86a8.04 8.04 0 0 1 3.53 3.53A2.5 2.5 0 0 0 13.5 1zM8.5 5a0.5 0.5 0 0 0 -1 0v3.88l-1.45 2.89a0.5 0.5 0 1 0 0.89 0.45l1.5 -3A0.5 0.5 0 0 0 8.5 9V5z",
26
- "M2 0h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2H2A2 2 0 0 1 0 14V2A2 2 0 0 1 2 0zM5.35 4.65A0.5 0.5 0 1 0 4.65 5.35L7.29 8l-2.65 2.65a0.5 0.5 0 0 0 0.71 0.71L8 8.71l2.65 2.65a0.5 0.5 0 0 0 0.71 -0.71L8.71 8l2.65 -2.65A0.5 0.5 0 0 0 10.65 4.65L8 7.29L5.35 4.65z",
27
- "M2 4A2 2 0 0 0 0 6v6a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2V6A2 2 0 0 0 14 4h-1.17A2 2 0 0 1 11.41 3.41L10.59 2.59A2 2 0 0 0 9.17 2H6.83A2 2 0 0 0 5.41 2.59L4.59 3.41A2 2 0 0 1 3.17 4H2zM10.5 8.5a2.5 2.5 0 0 0 -5 0a2.5 2.5 0 1 0 5 0zM2.5 6a0.5 0.5 0 0 1 0 -1a0.5 0.5 0 1 1 0 1zM11.5 8.5a3.5 3.5 0 1 1 -7 0a3.5 3.5 0 0 1 7 0z",
28
- "M2 0A2 2 0 0 0 0 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2V2A2 2 0 0 0 14 0H2zM9.5 11h-4A0.5 0.5 0 0 1 5 10.5v-4a0.5 0.5 0 0 1 1 0v2.79l4.15 -4.15a0.5 0.5 0 0 1 0.71 0.71L6.71 10H9.5a0.5 0.5 0 0 1 0 1z",
24
+ "M16 14V5H0v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2zM2.56 12.33H1.85L3.75 7h0.7l1.9 5.33H5.62l-0.54 -1.6H3.1l-0.54 1.6zM4.1 7.81H4.08l-0.8 2.38H4.9L4.1 7.81zm5.75 0.42v4.11H9.18v-0.54H9.16C9.01 12.12 8.62 12.4 7.97 12.4c-0.85 0 -1.45 -0.48 -1.45 -1.43V8.23h0.68v2.55c0 0.77 0.44 1.01 0.98 1.01c0.59 0 1 -0.37 1 -1.02V8.23h0.68zm1.27 4.41c0.07 0.33 0.42 0.64 0.98 0.64c0.65 0 1.07 -0.38 1.07 -1.02v-0.61h-0.02C13 12 12.55 12.29 11.99 12.29c-0.96 0 -1.64 -0.67 -1.64 -1.9v-0.34c0 -1.21 0.68 -1.89 1.64 -1.89c0.56 0 1 0.29 1.2 0.64h0.02V8.23h0.65v4.03c0 1.05 -0.82 1.58 -1.75 1.58c-1.04 0 -1.57 -0.52 -1.67 -1.2h0.69zm2.06 -2.53c0 -0.83 -0.41 -1.36 -1.06 -1.36c-0.69 0 -1.1 0.49 -1.1 1.36v0.25c0 0.85 0.41 1.36 1.1 1.36c0.67 0 1.06 -0.52 1.06 -1.36V10.1zM4 0.5a0.5 0.5 0 0 0 -1 0V1H2A2 2 0 0 0 0 3v1h16V3A2 2 0 0 0 14 1h-1V0.5a0.5 0.5 0 0 0 -1 0V1H4V0.5z",
25
+ "M5.5 0.5A0.5 0.5 0 0 1 6 0h4a0.5 0.5 0 0 1 0 1H9v1.07a7 7 0 0 1 3.54 12.26l0.82 0.82a0.5 0.5 0 0 1 -0.71 0.71l-0.92 -0.93A6.97 6.97 0 0 1 8 16A6.97 6.97 0 0 1 4.28 14.93l-0.92 0.92A0.5 0.5 0 0 1 2.65 15.15l0.82 -0.82A7 7 0 0 1 7 2.07V1H6A0.5 0.5 0 0 1 5.5 0.5zM0.86 5.39A2.5 2.5 0 1 1 4.39 1.86A8.04 8.04 0 0 0 0.86 5.39zM13.5 1c-0.75 0 -1.43 0.33 -1.89 0.86a8.04 8.04 0 0 1 3.53 3.53A2.5 2.5 0 0 0 13.5 1zm-5 4a0.5 0.5 0 0 0 -1 0v3.88l-1.45 2.89a0.5 0.5 0 1 0 0.89 0.45l1.5 -3A0.5 0.5 0 0 0 8.5 9V5z",
26
+ "M2 0h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2H2A2 2 0 0 1 0 14V2A2 2 0 0 1 2 0zm3.35 4.65A0.5 0.5 0 1 0 4.65 5.35L7.29 8l-2.65 2.65a0.5 0.5 0 0 0 0.71 0.71L8 8.71l2.65 2.65a0.5 0.5 0 0 0 0.71 -0.71L8.71 8l2.65 -2.65A0.5 0.5 0 0 0 10.65 4.65L8 7.29L5.35 4.65z",
27
+ "M2 4A2 2 0 0 0 0 6v6a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2V6A2 2 0 0 0 14 4h-1.17A2 2 0 0 1 11.41 3.41L10.59 2.59A2 2 0 0 0 9.17 2H6.83A2 2 0 0 0 5.41 2.59L4.59 3.41A2 2 0 0 1 3.17 4H2zm8.5 4.5a2.5 2.5 0 0 0 -5 0a2.5 2.5 0 1 0 5 0zM2.5 6a0.5 0.5 0 0 1 0 -1a0.5 0.5 0 1 1 0 1zm9 2.5a3.5 3.5 0 1 1 -7 0a3.5 3.5 0 0 1 7 0z",
28
+ "M2 0A2 2 0 0 0 0 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2V2A2 2 0 0 0 14 0H2zm7.5 11h-4A0.5 0.5 0 0 1 5 10.5v-4a0.5 0.5 0 0 1 1 0v2.79l4.15 -4.15a0.5 0.5 0 0 1 0.71 0.71L6.71 10H9.5a0.5 0.5 0 0 1 0 1z",
29
29
  "M15.98 8.51c-0.38 6.15 -7.27 9.57 -12.4 6.17C3.27 14.47 2.98 14.25 2.71 14.01l5.5 -5.5h7.78zM2 13.3L7.5 7.8V0.03C1.35 0.41 -2.07 7.3 1.33 12.43c0.2 0.3 0.42 0.59 0.67 0.87zM8.5 0.03c4.02 0.25 7.23 3.46 7.49 7.49H8.5V0.03z",
30
- "M8.66 8.66v-4H7.34v4h1.31zM8.66 11.34V10H7.34v1.34h1.31zM8 1.34q2.75 0 4.7 1.95T14.66 8t-1.95 4.7T8 14.66T3.3 12.7T1.34 8T3.3 3.3T8 1.34z"
30
+ "M8.66 8.66v-4H7.34v4h1.31zm0 2.68V10H7.34v1.34h1.31zM8 1.34q2.75 0 4.7 1.95T14.66 8t-1.95 4.7T8 14.66T3.3 12.7T1.34 8T3.3 3.3T8 1.34z"
31
31
  ],
32
32
  relative: [
33
- "M16 8c0 -3.87 -3.58 -7 -8 -7s-8 3.13 -8 7c0 1.76 0.74 3.37 1.97 4.6c-0.1 1.02 -0.42 2.13 -0.77 2.97c-0.08 0.19 0.07 0.39 0.27 0.36c2.26 -0.37 3.6 -0.94 4.18 -1.23a9.06 9.06 0 0 0 2.35 0.31c4.42 0 8 -3.13 8 -7zM7.19 6.77c0.09 0.12 0.16 0.26 0.23 0.4c0.43 0.95 0.39 2.38 -0.94 3.71a0.45 0.45 0 0 1 -0.61 0.01a0.41 0.41 0 0 1 -0.01 -0.59c0.42 -0.42 0.67 -0.83 0.81 -1.22c-0.27 0.17 -0.59 0.26 -0.93 0.26c-0.96 0 -1.74 -0.75 -1.74 -1.67c0 -0.92 0.78 -1.67 1.73 -1.67c0.27 0 0.53 0.06 0.76 0.17l0.01 0c0.17 0.07 0.33 0.18 0.47 0.32c0.08 0.08 0.16 0.17 0.23 0.27zM11 9.07c-0.27 0.16 -0.59 0.26 -0.93 0.26c-0.96 0 -1.73 -0.75 -1.73 -1.67c0 -0.92 0.78 -1.67 1.73 -1.67c0.27 0 0.53 0.06 0.76 0.17l0.01 0c0.17 0.07 0.33 0.18 0.47 0.32c0.09 0.08 0.16 0.17 0.23 0.27c0.09 0.12 0.16 0.26 0.23 0.4c0.43 0.95 0.39 2.38 -0.94 3.71a0.45 0.45 0 0 1 -0.61 0.01a0.41 0.41 0 0 1 -0.01 -0.59c0.42 -0.42 0.67 -0.83 0.81 -1.22z",
34
- "M16 14v-9h-16v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2zM2.56 12.33h-0.71l1.9 -5.33h0.7l1.9 5.33h-0.72l-0.54 -1.6h-1.98l-0.54 1.6zM4.1 7.81h-0.02l-0.8 2.38h1.62l-0.8 -2.37zM9.85 8.23v4.11h-0.67v-0.54h-0.03c-0.14 0.33 -0.53 0.61 -1.19 0.61c-0.85 0 -1.45 -0.48 -1.45 -1.42v-2.75h0.68v2.55c0 0.77 0.44 1.01 0.98 1.01c0.59 0 1 -0.37 1 -1.02v-2.54h0.68zM11.12 12.64c0.08 0.33 0.42 0.64 0.99 0.64c0.65 0 1.07 -0.38 1.07 -1.02v-0.6h-0.02c-0.16 0.36 -0.61 0.65 -1.17 0.65c-0.96 0 -1.64 -0.67 -1.64 -1.9v-0.34c0 -1.21 0.68 -1.89 1.64 -1.89c0.56 0 1 0.29 1.2 0.64h0.02v-0.58h0.65v4.03c0 1.05 -0.82 1.58 -1.75 1.58c-1.04 0 -1.57 -0.52 -1.67 -1.2h0.69zM13.18 10.1c0 -0.83 -0.41 -1.36 -1.06 -1.36c-0.69 0 -1.1 0.49 -1.1 1.36v0.25c0 0.85 0.41 1.36 1.1 1.36c0.67 0 1.06 -0.52 1.06 -1.36v-0.25zM4 0.5a0.5 0.5 0 0 0 -1 0v0.5h-1a2 2 0 0 0 -2 2v1h16v-1a2 2 0 0 0 -2 -2h-1v-0.5a0.5 0.5 0 0 0 -1 0v0.5h-8v-0.5z",
35
- "M5.5 0.5a0.5 0.5 0 0 1 0.5 -0.5h4a0.5 0.5 0 0 1 0 1h-1v1.07a7 7 0 0 1 3.54 12.26l0.82 0.82a0.5 0.5 0 0 1 -0.71 0.71l-0.92 -0.92a6.97 6.97 0 0 1 -3.72 1.07a6.97 6.97 0 0 1 -3.72 -1.07l-0.92 0.92a0.5 0.5 0 0 1 -0.71 -0.71l0.82 -0.82a7 7 0 0 1 3.54 -12.26v-1.07h-1a0.5 0.5 0 0 1 -0.5 -0.5zM0.86 5.39a2.5 2.5 0 1 1 3.53 -3.53a8.04 8.04 0 0 0 -3.53 3.53zM13.5 1c-0.75 0 -1.43 0.33 -1.89 0.86a8.04 8.04 0 0 1 3.53 3.53a2.5 2.5 0 0 0 -1.64 -4.39zm-5 4a0.5 0.5 0 0 0 -1 0v3.88l-1.45 2.89a0.5 0.5 0 1 0 0.89 0.45l1.5 -3a0.5 0.5 0 0 0 0.05 -0.22v-4z",
33
+ "M16 8c0 -3.87 -3.58 -7 -8 -7s-8 3.13 -8 7c0 1.76 0.74 3.37 1.97 4.6c-0.1 1.02 -0.42 2.13 -0.77 2.97c-0.08 0.19 0.07 0.39 0.27 0.36c2.26 -0.37 3.6 -0.94 4.18 -1.23a9.06 9.06 0 0 0 2.35 0.31c4.42 0 8 -3.13 8 -7zm-8.81 -1.23c0.09 0.12 0.16 0.26 0.23 0.4c0.43 0.95 0.39 2.38 -0.94 3.71a0.45 0.45 0 0 1 -0.61 0.01a0.41 0.41 0 0 1 -0.01 -0.59c0.42 -0.42 0.67 -0.83 0.81 -1.22c-0.27 0.17 -0.59 0.26 -0.93 0.26c-0.96 0 -1.74 -0.75 -1.74 -1.67c0 -0.92 0.78 -1.67 1.73 -1.67c0.27 0 0.53 0.06 0.76 0.17l0.01 0c0.17 0.07 0.33 0.18 0.47 0.32c0.08 0.08 0.16 0.17 0.23 0.27zm3.81 2.31c-0.27 0.16 -0.59 0.26 -0.93 0.26c-0.96 0 -1.73 -0.75 -1.73 -1.67c0 -0.92 0.78 -1.67 1.73 -1.67c0.27 0 0.53 0.06 0.76 0.17l0.01 0c0.17 0.07 0.33 0.18 0.47 0.32c0.09 0.08 0.16 0.17 0.23 0.27c0.09 0.12 0.16 0.26 0.23 0.4c0.43 0.95 0.39 2.38 -0.94 3.71a0.45 0.45 0 0 1 -0.61 0.01a0.41 0.41 0 0 1 -0.01 -0.59c0.42 -0.42 0.67 -0.83 0.81 -1.22z",
34
+ "M16 14v-9h-16v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2zm-13.44 -1.67h-0.71l1.9 -5.33h0.7l1.9 5.33h-0.72l-0.54 -1.6h-1.98l-0.54 1.6zm1.54 -4.53h-0.02l-0.8 2.38h1.62l-0.8 -2.37zm5.75 0.42v4.11h-0.67v-0.54h-0.03c-0.14 0.33 -0.53 0.61 -1.19 0.61c-0.85 0 -1.45 -0.48 -1.45 -1.42v-2.75h0.68v2.55c0 0.77 0.44 1.01 0.98 1.01c0.59 0 1 -0.37 1 -1.02v-2.54h0.68zm1.27 4.41c0.08 0.33 0.42 0.64 0.99 0.64c0.65 0 1.07 -0.38 1.07 -1.02v-0.6h-0.02c-0.16 0.36 -0.61 0.65 -1.17 0.65c-0.96 0 -1.64 -0.67 -1.64 -1.9v-0.34c0 -1.21 0.68 -1.89 1.64 -1.89c0.56 0 1 0.29 1.2 0.64h0.02v-0.58h0.65v4.03c0 1.05 -0.82 1.58 -1.75 1.58c-1.04 0 -1.57 -0.52 -1.67 -1.2h0.69zm2.06 -2.53c0 -0.83 -0.41 -1.36 -1.06 -1.36c-0.69 0 -1.1 0.49 -1.1 1.36v0.25c0 0.85 0.41 1.36 1.1 1.36c0.67 0 1.06 -0.52 1.06 -1.36v-0.25zm-9.18 -9.6a0.5 0.5 0 0 0 -1 0v0.5h-1a2 2 0 0 0 -2 2v1h16v-1a2 2 0 0 0 -2 -2h-1v-0.5a0.5 0.5 0 0 0 -1 0v0.5h-8v-0.5z",
35
+ "M5.5 0.5a0.5 0.5 0 0 1 0.5 -0.5h4a0.5 0.5 0 0 1 0 1h-1v1.07a7 7 0 0 1 3.54 12.26l0.82 0.82a0.5 0.5 0 0 1 -0.71 0.71l-0.92 -0.92a6.97 6.97 0 0 1 -3.72 1.07a6.97 6.97 0 0 1 -3.72 -1.07l-0.92 0.92a0.5 0.5 0 0 1 -0.71 -0.71l0.82 -0.82a7 7 0 0 1 3.54 -12.26v-1.07h-1a0.5 0.5 0 0 1 -0.5 -0.5zm-4.64 4.89a2.5 2.5 0 1 1 3.53 -3.53a8.04 8.04 0 0 0 -3.53 3.53zm12.64 -4.39c-0.75 0 -1.43 0.33 -1.89 0.86a8.04 8.04 0 0 1 3.53 3.53a2.5 2.5 0 0 0 -1.64 -4.39zm-5 4a0.5 0.5 0 0 0 -1 0v3.88l-1.45 2.89a0.5 0.5 0 1 0 0.89 0.45l1.5 -3a0.5 0.5 0 0 0 0.05 -0.22v-4z",
36
36
  "M2 0h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2zm3.35 4.65a0.5 0.5 0 1 0 -0.71 0.71l2.65 2.65l-2.65 2.65a0.5 0.5 0 0 0 0.71 0.71l2.65 -2.65l2.65 2.65a0.5 0.5 0 0 0 0.71 -0.71l-2.65 -2.65l2.65 -2.65a0.5 0.5 0 0 0 -0.71 -0.71l-2.65 2.65l-2.65 -2.65z",
37
- "M2 4a2 2 0 0 0 -2 2v6a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-6a2 2 0 0 0 -2 -2h-1.17a2 2 0 0 1 -1.41 -0.59l-0.83 -0.83a2 2 0 0 0 -1.41 -0.59h-2.34a2 2 0 0 0 -1.41 0.59l-0.83 0.83a2 2 0 0 1 -1.41 0.59h-1.17zM10.5 8.5a2.5 2.5 0 0 0 -5 0a2.5 2.5 0 1 0 5 0zM2.5 6a0.5 0.5 0 0 1 0 -1a0.5 0.5 0 1 1 0 1zM11.5 8.5a3.5 3.5 0 1 1 -7 0a3.5 3.5 0 0 1 7 0z",
37
+ "M2 4a2 2 0 0 0 -2 2v6a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-6a2 2 0 0 0 -2 -2h-1.17a2 2 0 0 1 -1.41 -0.59l-0.83 -0.83a2 2 0 0 0 -1.41 -0.59h-2.34a2 2 0 0 0 -1.41 0.59l-0.83 0.83a2 2 0 0 1 -1.41 0.59h-1.17zm8.5 4.5a2.5 2.5 0 0 0 -5 0a2.5 2.5 0 1 0 5 0zm-8 -2.5a0.5 0.5 0 0 1 0 -1a0.5 0.5 0 1 1 0 1zm9 2.5a3.5 3.5 0 1 1 -7 0a3.5 3.5 0 0 1 7 0z",
38
38
  "M2 0a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-12zm7.5 11h-4a0.5 0.5 0 0 1 -0.5 -0.5v-4a0.5 0.5 0 0 1 1 0v2.79l4.15 -4.15a0.5 0.5 0 0 1 0.71 0.71l-4.15 4.15h2.79a0.5 0.5 0 0 1 0 1z",
39
- "M15.98 8.51c-0.38 6.15 -7.27 9.57 -12.4 6.17c-0.31 -0.21 -0.6 -0.43 -0.87 -0.67l5.5 -5.5h7.78zM2 13.3l5.5 -5.5v-7.77c-6.15 0.38 -9.57 7.27 -6.17 12.4c0.2 0.3 0.42 0.59 0.67 0.87zM8.5 0.03c4.02 0.25 7.23 3.46 7.49 7.49h-7.49v-7.49z",
40
- "M8.66 8.66v-4h-1.32v4h1.31zM8.66 11.34v-1.34h-1.32v1.34h1.31zM8 1.34q2.75 0 4.7 1.95t1.96 4.71t-1.95 4.7t-4.71 1.96t-4.7 -1.96t-1.96 -4.7t1.96 -4.7t4.7 -1.96z"
39
+ "M15.98 8.51c-0.38 6.15 -7.27 9.57 -12.4 6.17c-0.31 -0.21 -0.6 -0.43 -0.87 -0.67l5.5 -5.5h7.78zm-13.98 4.79l5.5 -5.5v-7.77c-6.15 0.38 -9.57 7.27 -6.17 12.4c0.2 0.3 0.42 0.59 0.67 0.87zm6.5 -13.27c4.02 0.25 7.23 3.46 7.49 7.49h-7.49v-7.49z",
40
+ "M8.66 8.66v-4h-1.32v4h1.31zm0 2.68v-1.34h-1.32v1.34h1.31zm-0.66 -10q2.75 0 4.7 1.95t1.96 4.71t-1.95 4.7t-4.71 1.96t-4.7 -1.96t-1.96 -4.7t1.96 -4.7t4.7 -1.96z"
41
41
  ],
42
42
  absolute: [
43
43
  "M16 8C16 4.13 12.42 1 8 1S0 4.13 0 8C0 9.76 0.74 11.37 1.97 12.6C1.87 13.62 1.55 14.73 1.2 15.57C1.12 15.75 1.27 15.96 1.47 15.93C3.73 15.56 5.07 14.99 5.65 14.69A9.06 9.06 0 0 0 8 15C12.42 15 16 11.87 16 8ZM7.19 6.77C7.28 6.89 7.36 7.03 7.42 7.17C7.85 8.11 7.81 9.54 6.48 10.87A0.45 0.45 0 0 1 5.87 10.88A0.41 0.41 0 0 1 5.86 10.29C6.27 9.88 6.53 9.46 6.67 9.07C6.4 9.24 6.08 9.33 5.74 9.33C4.78 9.33 4 8.59 4 7.67C4 6.75 4.78 6 5.73 6C6.01 6 6.26 6.06 6.49 6.17L6.5 6.17C6.67 6.24 6.82 6.35 6.97 6.49C7.05 6.58 7.13 6.67 7.19 6.77ZM11 9.07C10.73 9.24 10.41 9.33 10.07 9.33C9.11 9.33 8.34 8.59 8.34 7.67C8.34 6.75 9.11 6 10.07 6C10.34 6 10.6 6.06 10.82 6.17L10.83 6.17C11 6.24 11.16 6.35 11.3 6.49C11.39 6.58 11.46 6.67 11.53 6.76C11.61 6.89 11.69 7.02 11.75 7.16C12.18 8.11 12.15 9.54 10.81 10.87A0.45 0.45 0 0 1 10.2 10.88A0.41 0.41 0 0 1 10.19 10.29C10.61 9.87 10.86 9.46 11 9.07Z",
@@ -56,18 +56,18 @@ const shapes = {
56
56
  "M2 0C6 0 10 0 14 0C15.1 0 16 0.9 16 2C16 6 16 10 16 14C16 15.1 15.1 16 14 16C10 16 6 16 2 16C0.9 16 0 15.1 0 14C0 10 0 6 0 2C0 0.9 0.9 0 2 0C2 0 2 0 2 0M5.35 4.65C5.08 4.37 4.62 4.5 4.52 4.87C4.47 5.04 4.52 5.23 4.65 5.35C5.53 6.24 6.41 7.12 7.29 8C6.41 8.88 5.53 9.76 4.65 10.65C4.37 10.92 4.5 11.38 4.87 11.48C5.04 11.53 5.23 11.48 5.35 11.35C6.24 10.47 7.12 9.59 8 8.71C8.88 9.59 9.76 10.47 10.65 11.35C10.92 11.63 11.38 11.5 11.48 11.13C11.53 10.96 11.48 10.77 11.35 10.65C10.47 9.76 9.59 8.88 8.71 8C9.59 7.12 10.47 6.24 11.35 5.35C11.63 5.08 11.5 4.62 11.13 4.52C10.96 4.47 10.77 4.52 10.65 4.65C9.76 5.53 8.88 6.41 8 7.29C7.12 6.41 6.24 5.53 5.35 4.65C5.35 4.65 5.35 4.65 5.35 4.65",
57
57
  "M2 4C0.9 4 0 4.9 0 6C0 8 0 10 0 12C0 13.1 0.9 14 2 14C6 14 10 14 14 14C15.1 14 16 13.1 16 12C16 10 16 8 16 6C16 4.9 15.1 4 14 4C13.61 4 13.22 4 12.83 4C12.3 4 11.79 3.79 11.41 3.41C11.14 3.14 10.86 2.86 10.59 2.59C10.21 2.21 9.7 2 9.17 2C8.39 2 7.61 2 6.83 2C6.3 2 5.79 2.21 5.41 2.59C5.14 2.86 4.86 3.14 4.59 3.41C4.21 3.79 3.7 4 3.17 4C2.78 4 2.39 4 2 4C2 4 2 4 2 4M10.5 8.5C10.5 6.58 8.42 5.37 6.75 6.33C5.98 6.78 5.5 7.61 5.5 8.5C5.5 10.42 7.58 11.63 9.25 10.67C10.02 10.22 10.5 9.39 10.5 8.5C10.5 8.5 10.5 8.5 10.5 8.5M2.5 6C2.12 6 1.87 5.58 2.07 5.25C2.16 5.1 2.32 5 2.5 5C2.88 5 3.13 5.42 2.93 5.75C2.84 5.9 2.68 6 2.5 6C2.5 6 2.5 6 2.5 6M11.5 8.5C11.5 11.19 8.58 12.88 6.25 11.53C5.17 10.91 4.5 9.75 4.5 8.5C4.5 5.81 7.42 4.12 9.75 5.47C10.83 6.09 11.5 7.25 11.5 8.5C11.5 8.5 11.5 8.5 11.5 8.5",
58
58
  "M2 0C0.9 0 0 0.9 0 2C0 6 0 10 0 14C0 15.1 0.9 16 2 16C6 16 10 16 14 16C15.1 16 16 15.1 16 14C16 10 16 6 16 2C16 0.9 15.1 0 14 0C10 0 6 0 2 0C2 0 2 0 2 0M9.5 11C8.17 11 6.83 11 5.5 11C5.22 11 5 10.78 5 10.5C5 9.17 5 7.83 5 6.5C5 6.12 5.42 5.87 5.75 6.07C5.9 6.16 6 6.32 6 6.5C6 7.43 6 8.36 6 9.29C7.38 7.91 8.76 6.53 10.15 5.15C10.42 4.87 10.88 5 10.98 5.37C11.03 5.54 10.98 5.73 10.85 5.85C9.47 7.24 8.09 8.62 6.71 10C7.64 10 8.57 10 9.5 10C9.88 10 10.13 10.42 9.93 10.75C9.84 10.9 9.68 11 9.5 11C9.5 11 9.5 11 9.5 11",
59
- "M15.98 8.51C15.6 14.66 8.71 18.08 3.58 14.68C3.27 14.47 2.98 14.25 2.71 14.01C4.54 12.18 6.38 10.34 8.21 8.51C10.8 8.51 13.4 8.51 15.99 8.51C15.99 8.51 15.98 8.51 15.98 8.51M2 13.3C3.83 11.47 5.67 9.63 7.5 7.8C7.5 5.21 7.5 2.62 7.5 0.03C1.35 0.41 -2.07 7.3 1.33 12.43C1.53 12.73 1.75 13.02 2 13.3C2 13.3 2 13.3 2 13.3M8.5 0.03C12.52 0.28 15.73 3.49 15.99 7.52C13.49 7.52 11 7.52 8.5 7.52C8.5 5.02 8.5 2.53 8.5 0.03C8.5 0.03 8.5 0.03 8.5 0.03",
60
- "M8.66 8.66C8.66 7.33 8.66 5.99 8.66 4.66C8.22 4.66 7.78 4.66 7.34 4.66C7.34 5.99 7.34 7.33 7.34 8.66C7.78 8.66 8.21 8.66 8.65 8.66C8.65 8.66 8.66 8.66 8.66 8.66M8.66 11.34C8.66 10.89 8.66 10.45 8.66 10C8.22 10 7.78 10 7.34 10C7.34 10.45 7.34 10.89 7.34 11.34C7.78 11.34 8.21 11.34 8.65 11.34C8.65 11.34 8.66 11.34 8.66 11.34M8 1.34C9.83 1.34 11.4 1.99 12.7 3.29C14 4.59 14.65 6.16 14.66 8C14.67 9.84 14.02 11.41 12.71 12.7C11.4 13.99 9.83 14.65 8 14.66C6.17 14.67 4.6 14.02 3.3 12.7C2 11.38 1.35 9.81 1.34 8C1.33 6.19 1.99 4.62 3.3 3.3C4.61 1.98 6.18 1.33 8 1.34C8 1.34 8 1.34 8 1.34"
59
+ "M15.98 8.51C15.6 14.66 8.71 18.08 3.58 14.68C3.27 14.47 2.98 14.25 2.71 14.01C4.54 12.18 6.38 10.34 8.21 8.51C10.8 8.51 13.4 8.51 15.99 8.51C15.99 8.51 15.99 8.51 15.99 8.51M2 13.3C3.83 11.47 5.67 9.63 7.5 7.8C7.5 5.21 7.5 2.62 7.5 0.03C1.35 0.41 -2.07 7.3 1.33 12.43C1.53 12.73 1.75 13.02 2 13.3C2 13.3 2 13.3 2 13.3M8.5 0.03C12.52 0.28 15.73 3.49 15.99 7.52C13.49 7.52 11 7.52 8.5 7.52C8.5 5.02 8.5 2.53 8.5 0.03C8.5 0.03 8.5 0.03 8.5 0.03",
60
+ "M8.66 8.66C8.66 7.33 8.66 5.99 8.66 4.66C8.22 4.66 7.78 4.66 7.34 4.66C7.34 5.99 7.34 7.33 7.34 8.66C7.78 8.66 8.21 8.66 8.65 8.66C8.65 8.66 8.65 8.66 8.65 8.66M8.66 11.34C8.66 10.89 8.66 10.45 8.66 10C8.22 10 7.78 10 7.34 10C7.34 10.45 7.34 10.89 7.34 11.34C7.78 11.34 8.21 11.34 8.65 11.34C8.65 11.34 8.65 11.34 8.65 11.34M8 1.34C9.83 1.34 11.4 1.99 12.7 3.29C14 4.59 14.65 6.16 14.66 8C14.67 9.84 14.02 11.41 12.71 12.7C11.4 13.99 9.83 14.65 8 14.66C6.17 14.67 4.6 14.02 3.3 12.7C2 11.38 1.35 9.81 1.34 8C1.33 6.19 1.99 4.62 3.3 3.3C4.61 1.98 6.18 1.33 8 1.34C8 1.34 8 1.34 8 1.34"
61
61
  ],
62
62
  scaled: [
63
- "M15.2 8.05C15.2 4.57 11.98 1.75 8 1.75S0.8 4.57 0.8 8.05C0.8 9.63 1.47 11.08 2.57 12.19C2.49 13.1 2.2 14.1 1.88 14.86C1.81 15.02 1.94 15.21 2.12 15.18C4.15 14.85 5.36 14.34 5.89 14.07C6.58 14.26 7.29 14.35 8 14.35C11.98 14.35 15.2 11.53 15.2 8.05ZM7.27 6.94C7.35 7.05 7.42 7.17 7.48 7.3C7.86 8.15 7.83 9.44 6.63 10.63C6.48 10.78 6.24 10.78 6.08 10.64C5.93 10.5 5.92 10.26 6.07 10.11C6.45 9.73 6.68 9.36 6.8 9.01C6.56 9.16 6.27 9.25 5.96 9.25C5.1 9.25 4.4 8.57 4.4 7.75C4.4 6.92 5.1 6.25 5.96 6.25C6.2 6.25 6.44 6.3 6.64 6.4L6.65 6.4C6.8 6.46 6.94 6.56 7.07 6.69C7.15 6.76 7.21 6.85 7.27 6.94ZM10.7 9.01C10.46 9.16 10.17 9.25 9.86 9.25C9 9.25 8.3 8.57 8.3 7.75C8.3 6.92 9 6.25 9.86 6.25C10.11 6.25 10.34 6.3 10.54 6.4L10.55 6.4C10.7 6.46 10.84 6.56 10.97 6.69C11.05 6.76 11.11 6.85 11.17 6.93C11.25 7.04 11.32 7.17 11.38 7.29C11.76 8.15 11.73 9.43 10.53 10.63C10.38 10.78 10.14 10.78 9.98 10.64C9.83 10.5 9.82 10.25 9.97 10.11C10.35 9.73 10.57 9.36 10.7 9.01Z",
64
- "M15.2 13.43V5.33H0.8V13.43C0.8 14.42 1.61 15.23 2.6 15.23H13.4C14.39 15.23 15.2 14.42 15.2 13.43ZM3.1 11.92H2.47L4.17 7.13H4.8L6.51 11.92H5.86L5.38 10.48H3.59L3.1 11.92ZM4.49 7.85H4.48L3.76 9.99H5.21L4.49 7.85ZM9.66 8.23V11.92H9.06V11.44H9.04C8.91 11.73 8.56 11.98 7.97 11.98C7.21 11.98 6.66 11.55 6.66 10.7V8.23H7.27V10.53C7.27 11.22 7.67 11.44 8.15 11.44C8.68 11.44 9.06 11.1 9.06 10.52V8.23H9.67ZM10.81 12.2C10.88 12.5 11.19 12.77 11.7 12.77C12.28 12.77 12.66 12.43 12.66 11.85V11.31H12.64C12.5 11.63 12.09 11.89 11.59 11.89C10.73 11.89 10.11 11.28 10.11 10.18V9.87C10.11 8.78 10.72 8.17 11.59 8.17C12.09 8.17 12.49 8.44 12.66 8.75H12.68V8.23H13.27V11.86C13.27 12.8 12.53 13.28 11.69 13.28C10.75 13.28 10.28 12.81 10.19 12.2H10.81ZM12.66 9.92C12.66 9.17 12.29 8.69 11.7 8.69C11.08 8.69 10.72 9.14 10.72 9.92V10.14C10.72 10.91 11.08 11.37 11.7 11.37C12.31 11.37 12.66 10.91 12.66 10.14V9.92ZM4.4 1.28C4.4 0.93 4.03 0.71 3.72 0.89C3.59 0.97 3.5 1.11 3.5 1.28V1.72H2.6C1.61 1.73 0.8 2.53 0.8 3.53V4.43H15.2V3.53C15.2 2.53 14.39 1.72 13.4 1.72H12.5V1.28C12.5 0.93 12.13 0.71 11.83 0.89C11.69 0.97 11.6 1.11 11.6 1.28V1.72H4.4V1.28Z",
65
- "M5.75 1.25C5.75 1 5.95 0.8 6.2 0.8H9.8C10.15 0.8 10.36 1.17 10.19 1.47C10.11 1.61 9.96 1.7 9.8 1.7H8.9V2.66C13.7 3.36 15.95 8.99 12.95 12.8C12.69 13.13 12.4 13.43 12.08 13.7L12.82 14.43C13.06 14.68 12.95 15.1 12.62 15.19C12.46 15.23 12.3 15.18 12.18 15.07L11.35 14.24C10.35 14.87 9.19 15.2 8 15.2C6.81 15.2 5.65 14.87 4.65 14.24L3.82 15.07C3.57 15.31 3.15 15.2 3.06 14.87C3.02 14.71 3.07 14.55 3.18 14.43L3.92 13.7C0.22 10.55 1.32 4.59 5.89 2.96C6.28 2.82 6.69 2.72 7.1 2.66V1.7H6.2C5.95 1.7 5.75 1.5 5.75 1.25ZM1.57 5.65C0.27 4.51 0.68 2.39 2.32 1.82C3.19 1.52 4.15 1.78 4.75 2.47C3.38 3.17 2.27 4.28 1.57 5.65ZM12.95 1.7C12.27 1.7 11.66 2 11.25 2.47C12.62 3.17 13.73 4.28 14.43 5.65C15.73 4.51 15.32 2.39 13.68 1.82C13.45 1.74 13.2 1.7 12.95 1.7ZM8.45 5.3C8.45 4.95 8.07 4.74 7.78 4.91C7.64 4.99 7.55 5.14 7.55 5.3V8.79L6.25 11.4C6.09 11.71 6.33 12.07 6.67 12.05C6.83 12.04 6.98 11.95 7.05 11.8L8.4 9.1C8.43 9.04 8.45 8.97 8.45 8.9V5.3Z",
66
- "M2.6 0.8H13.4C14.39 0.8 15.2 1.61 15.2 2.6V13.4C15.2 14.39 14.39 15.2 13.4 15.2H2.6C1.61 15.2 0.8 14.39 0.8 13.4V2.6C0.8 1.61 1.61 0.8 2.6 0.8ZM5.62 4.98C5.37 4.74 4.95 4.85 4.86 5.18C4.82 5.34 4.87 5.5 4.98 5.62L7.36 8L4.98 10.38C4.74 10.63 4.85 11.05 5.18 11.14C5.34 11.18 5.5 11.13 5.62 11.02L8 8.64L10.38 11.02C10.63 11.26 11.05 11.15 11.14 10.82C11.18 10.66 11.13 10.5 11.02 10.38L8.64 8L11.02 5.62C11.26 5.37 11.15 4.95 10.82 4.86C10.66 4.82 10.5 4.87 10.38 4.98L8 7.36L5.62 4.98Z",
67
- "M2.6 4.4C1.61 4.4 0.8 5.21 0.8 6.2V11.6C0.8 12.59 1.61 13.4 2.6 13.4H13.4C14.39 13.4 15.2 12.59 15.2 11.6V6.2C15.2 5.21 14.39 4.4 13.4 4.4H12.35C11.87 4.4 11.41 4.21 11.07 3.87L10.33 3.13C9.99 2.79 9.53 2.6 9.05 2.6H6.95C6.47 2.6 6.01 2.79 5.67 3.13L4.93 3.87C4.59 4.21 4.13 4.4 3.65 4.4H2.6ZM10.25 8.45C10.25 6.72 8.38 5.64 6.88 6.5C6.18 6.9 5.75 7.65 5.75 8.45C5.75 10.18 7.63 11.26 9.13 10.4C9.82 10 10.25 9.25 10.25 8.45ZM3.05 6.2C2.7 6.2 2.49 5.82 2.66 5.53C2.74 5.39 2.89 5.3 3.05 5.3C3.4 5.3 3.61 5.68 3.44 5.98C3.36 6.11 3.21 6.2 3.05 6.2ZM11.15 8.45C11.15 10.87 8.53 12.39 6.43 11.18C5.45 10.62 4.85 9.58 4.85 8.45C4.85 6.03 7.48 4.51 9.57 5.72C10.55 6.28 11.15 7.32 11.15 8.45Z",
68
- "M2.6 0.8C1.61 0.8 0.8 1.61 0.8 2.6V13.4C0.8 14.39 1.61 15.2 2.6 15.2H13.4C14.39 15.2 15.2 14.39 15.2 13.4V2.6C15.2 1.61 14.39 0.8 13.4 0.8H2.6ZM9.35 10.7H5.75C5.5 10.7 5.3 10.5 5.3 10.25V6.65C5.3 6.3 5.68 6.09 5.98 6.26C6.11 6.34 6.2 6.49 6.2 6.65V9.16L9.93 5.43C10.18 5.19 10.6 5.3 10.69 5.63C10.73 5.79 10.68 5.95 10.57 6.07L6.84 9.8H9.35C9.7 9.8 9.91 10.18 9.74 10.48C9.66 10.61 9.51 10.7 9.35 10.7Z",
69
- "M15.18 8.46C14.84 14 8.64 17.07 4.02 14.01C3.74 13.83 3.48 13.63 3.24 13.41L8.19 8.46H15.19ZM2.6 12.77L7.55 7.82V0.83C2.01 1.17 -1.06 7.37 2 11.99C2.18 12.26 2.37 12.52 2.6 12.77ZM8.45 0.83C12.07 1.05 14.96 3.94 15.19 7.57H8.45V0.83Z",
70
- "M8.59 8.59V4.99H7.41V8.59H8.59ZM8.59 11.01V9.8H7.41V11.01H8.59ZM8 2.01Q10.48 2.01 12.23 3.76T13.99 8T12.24 12.23T8 13.99T3.77 12.23T2.01 8T3.77 3.77T8 2.01Z"
63
+ "M14.4 7.2C14.4 3.72 11.18 0.9 7.2 0.9S0 3.72 0 7.2C0 8.78 0.67 10.23 1.77 11.34C1.69 12.25 1.4 13.26 1.08 14.01C1.01 14.18 1.14 14.36 1.32 14.34C3.35 14 4.56 13.49 5.09 13.22C5.78 13.41 6.49 13.5 7.2 13.5C11.18 13.5 14.4 10.68 14.4 7.2ZM6.47 6.09C6.55 6.2 6.62 6.32 6.68 6.45C7.06 7.3 7.03 8.59 5.83 9.78C5.68 9.93 5.44 9.94 5.28 9.79C5.13 9.65 5.12 9.41 5.27 9.26C5.65 8.89 5.88 8.52 6 8.16C5.76 8.31 5.47 8.4 5.16 8.4C4.3 8.4 3.6 7.73 3.6 6.9C3.6 6.07 4.3 5.4 5.16 5.4C5.4 5.4 5.64 5.45 5.84 5.55L5.85 5.55C6 5.62 6.14 5.72 6.27 5.84C6.35 5.92 6.41 6 6.47 6.09ZM9.9 8.17C9.66 8.31 9.37 8.4 9.06 8.4C8.2 8.4 7.5 7.73 7.5 6.9C7.5 6.07 8.2 5.4 9.06 5.4C9.31 5.4 9.54 5.45 9.74 5.55L9.75 5.55C9.9 5.62 10.04 5.72 10.17 5.84C10.25 5.92 10.31 6 10.37 6.09C10.45 6.2 10.52 6.32 10.58 6.45C10.96 7.3 10.93 8.59 9.73 9.78C9.58 9.93 9.34 9.93 9.18 9.79C9.03 9.65 9.02 9.41 9.17 9.26C9.55 8.89 9.77 8.51 9.9 8.16Z",
64
+ "M14.4 12.6V4.5H0V12.6C0 13.59 0.81 14.4 1.8 14.4H12.6C13.59 14.4 14.4 13.59 14.4 12.6ZM2.3 11.1H1.67L3.37 6.3H4L5.71 11.1H5.06L4.58 9.66H2.79L2.3 11.1ZM3.69 7.02H3.68L2.96 9.16H4.41L3.69 7.02ZM8.87 7.4V11.1H8.26V10.61H8.24C8.11 10.91 7.76 11.16 7.17 11.16C6.41 11.16 5.86 10.72 5.86 9.88V7.4H6.47V9.7C6.47 10.39 6.87 10.61 7.35 10.61C7.88 10.61 8.26 10.28 8.26 9.69V7.4H8.87ZM10.01 11.37C10.08 11.67 10.39 11.95 10.9 11.95C11.48 11.95 11.86 11.61 11.86 11.03V10.48H11.84C11.7 10.8 11.29 11.06 10.79 11.06C9.93 11.06 9.31 10.46 9.31 9.35V9.05C9.31 7.96 9.92 7.35 10.79 7.35C11.29 7.35 11.69 7.61 11.86 7.92H11.88V7.4H12.47V11.03C12.47 11.98 11.73 12.45 10.89 12.45C9.95 12.45 9.48 11.99 9.39 11.37H10.01ZM11.86 9.09C11.86 8.34 11.49 7.87 10.9 7.87C10.28 7.87 9.92 8.31 9.92 9.09V9.32C9.92 10.09 10.28 10.55 10.9 10.55C11.51 10.55 11.86 10.08 11.86 9.32V9.09ZM3.6 0.45C3.6 0.1 3.23 -0.11 2.93 0.06C2.79 0.14 2.7 0.29 2.7 0.45V0.9H1.8C0.81 0.9 0 1.71 0 2.7V3.6H14.4V2.7C14.4 1.71 13.59 0.9 12.6 0.9H11.7V0.45C11.7 0.1 11.33 -0.11 11.03 0.06C10.89 0.14 10.8 0.29 10.8 0.45V0.9H3.6V0.45Z",
65
+ "M4.95 0.45C4.95 0.2 5.15 0 5.4 0H9C9.35 0 9.56 0.37 9.39 0.68C9.31 0.81 9.16 0.9 9 0.9H8.1V1.86C12.9 2.56 15.15 8.19 12.15 12C11.89 12.33 11.6 12.63 11.28 12.9L12.02 13.63C12.26 13.88 12.15 14.3 11.82 14.39C11.66 14.43 11.5 14.38 11.38 14.27L10.55 13.44C9.55 14.07 8.39 14.4 7.2 14.4C6.01 14.4 4.85 14.07 3.85 13.44L3.02 14.27C2.77 14.51 2.35 14.4 2.26 14.07C2.22 13.91 2.27 13.75 2.38 13.63L3.12 12.9C-0.58 9.75 0.52 3.79 5.09 2.16C5.48 2.02 5.89 1.92 6.3 1.86V0.9H5.4C5.15 0.9 4.95 0.7 4.95 0.45ZM0.77 4.85C-0.53 3.71 -0.12 1.59 1.52 1.02C2.39 0.72 3.35 0.98 3.95 1.67C2.58 2.37 1.47 3.48 0.77 4.85ZM12.15 0.9C11.47 0.9 10.86 1.2 10.45 1.67C11.82 2.37 12.93 3.48 13.63 4.85C14.93 3.71 14.52 1.59 12.88 1.02C12.65 0.94 12.4 0.9 12.15 0.9ZM7.65 4.5C7.65 4.15 7.28 3.94 6.98 4.11C6.84 4.19 6.75 4.34 6.75 4.5V7.99L5.45 10.6C5.29 10.91 5.53 11.27 5.87 11.25C6.03 11.24 6.18 11.15 6.25 11L7.6 8.3C7.63 8.24 7.65 8.17 7.65 8.1V4.5Z",
66
+ "M1.8 0H12.6C13.59 0 14.4 0.81 14.4 1.8V12.6C14.4 13.59 13.59 14.4 12.6 14.4H1.8C0.81 14.4 0 13.59 0 12.6V1.8C0 0.81 0.81 0 1.8 0ZM4.82 4.18C4.57 3.94 4.15 4.05 4.06 4.38C4.02 4.54 4.07 4.7 4.18 4.82L6.56 7.2L4.18 9.58C3.94 9.83 4.05 10.25 4.38 10.34C4.54 10.38 4.7 10.33 4.82 10.22L7.2 7.84L9.58 10.22C9.83 10.46 10.25 10.35 10.34 10.02C10.38 9.86 10.33 9.7 10.22 9.58L7.84 7.2L10.22 4.82C10.46 4.57 10.35 4.15 10.02 4.06C9.86 4.02 9.7 4.07 9.58 4.18L7.2 6.56L4.82 4.18Z",
67
+ "M1.8 3.6C0.81 3.6 0 4.41 0 5.4V10.8C0 11.79 0.81 12.6 1.8 12.6H12.6C13.59 12.6 14.4 11.79 14.4 10.8V5.4C14.4 4.41 13.59 3.6 12.6 3.6H11.55C11.07 3.6 10.61 3.41 10.27 3.07L9.53 2.33C9.19 1.99 8.73 1.8 8.25 1.8H6.15C5.67 1.8 5.21 1.99 4.87 2.33L4.13 3.07C3.79 3.41 3.33 3.6 2.85 3.6H1.8ZM9.45 7.65C9.45 5.92 7.57 4.84 6.08 5.7C5.38 6.1 4.95 6.85 4.95 7.65C4.95 9.38 6.83 10.46 8.33 9.6C9.02 9.2 9.45 8.45 9.45 7.65ZM2.25 5.4C1.9 5.4 1.69 5.02 1.86 4.73C1.94 4.59 2.09 4.5 2.25 4.5C2.6 4.5 2.81 4.88 2.64 5.18C2.56 5.31 2.41 5.4 2.25 5.4ZM10.35 7.65C10.35 10.07 7.73 11.59 5.63 10.38C4.65 9.82 4.05 8.78 4.05 7.65C4.05 5.23 6.68 3.71 8.78 4.92C9.75 5.48 10.35 6.52 10.35 7.65Z",
68
+ "M1.8 0C0.81 0 0 0.81 0 1.8V12.6C0 13.59 0.81 14.4 1.8 14.4H12.6C13.59 14.4 14.4 13.59 14.4 12.6V1.8C14.4 0.81 13.59 0 12.6 0H1.8ZM8.55 9.9H4.95C4.7 9.9 4.5 9.7 4.5 9.45V5.85C4.5 5.5 4.88 5.29 5.18 5.46C5.31 5.54 5.4 5.69 5.4 5.85V8.36L9.13 4.63C9.38 4.39 9.8 4.5 9.89 4.83C9.93 4.99 9.88 5.15 9.77 5.27L6.04 9H8.55C8.9 9 9.11 9.38 8.94 9.68C8.86 9.81 8.71 9.9 8.55 9.9Z",
69
+ "M14.38 7.66C14.04 13.19 7.84 16.27 3.22 13.21C2.94 13.02 2.68 12.83 2.44 12.61L7.39 7.66H14.39ZM1.8 11.97L6.75 7.02V0.03C1.22 0.37 -1.86 6.57 1.2 11.19C1.38 11.46 1.58 11.72 1.8 11.97ZM7.65 0.03C11.27 0.25 14.16 3.14 14.39 6.77H7.65V0.03Z",
70
+ "M7.79 7.79V4.19H6.61V7.79H7.79ZM7.79 10.21V9H6.61V10.21H7.79ZM7.2 1.21Q9.68 1.21 11.43 2.96T13.19 7.2T11.44 11.43T7.2 13.19T2.97 11.43T1.21 7.2T2.97 2.97T7.2 1.21Z"
71
71
  ],
72
72
  translated: [
73
73
  "M17 9C17 5.13 13.42 2 9 2S1 5.13 1 9C1 10.76 1.74 12.37 2.97 13.6C2.87 14.62 2.55 15.73 2.2 16.57C2.12 16.75 2.27 16.96 2.47 16.93C4.73 16.56 6.07 15.99 6.65 15.69C7.42 15.9 8.21 16 9 16C13.42 16 17 12.87 17 9ZM8.19 7.77C8.28 7.89 8.36 8.03 8.42 8.17C8.85 9.11 8.81 10.54 7.48 11.87C7.31 12.04 7.04 12.04 6.87 11.88C6.7 11.72 6.69 11.46 6.86 11.29C7.27 10.88 7.53 10.46 7.67 10.07C7.4 10.24 7.08 10.33 6.74 10.33C5.78 10.33 5 9.59 5 8.67C5 7.75 5.78 7 6.73 7C7.01 7 7.26 7.06 7.49 7.17L7.5 7.17C7.67 7.24 7.82 7.35 7.97 7.49C8.05 7.58 8.13 7.67 8.19 7.77ZM12 10.07C11.73 10.24 11.41 10.33 11.07 10.33C10.11 10.33 9.34 9.59 9.34 8.67C9.34 7.75 10.11 7 11.07 7C11.34 7 11.6 7.06 11.82 7.17L11.83 7.17C12 7.24 12.16 7.35 12.3 7.49C12.39 7.58 12.46 7.67 12.53 7.76C12.61 7.89 12.69 8.02 12.75 8.16C13.18 9.11 13.15 10.54 11.81 11.87C11.64 12.03 11.37 12.04 11.2 11.88C11.03 11.72 11.02 11.45 11.19 11.29C11.61 10.87 11.86 10.46 12 10.07Z",
@@ -82,7 +82,7 @@ const shapes = {
82
82
  length: [
83
83
  81.67071892681327,
84
84
  170.27898053351782,
85
- 103.70446684221285,
85
+ 103.70446684221288,
86
86
  96.79922293172581,
87
87
  90.7196977830866,
88
88
  91.38021514948004,
@@ -91,10 +91,10 @@ const shapes = {
91
91
  ],
92
92
  pointAt50: [
93
93
  { x: 15.938953304842967, y: 8.868891726272725 },
94
- { x: 15.95073594416726, y: 14.441168081499407 },
95
- { x: 12.6835733051761, y: 3.7915633900279815 },
94
+ { x: 14.832293673094282, y: 15.818594853651366 },
95
+ { x: 1.8808184432764348, y: 5.602539862243249 },
96
96
  { x: 0, y: 9.424777960769376 },
97
- { x: 10.32151894031744, y: 7.572341760265456 },
97
+ { x: 10.497072046759587, y: 8.379040530375336 },
98
98
  { x: 12.566370614359172, y: 0},
99
99
  { x: 6.406410409169571, y: 0.17024392855151 },
100
100
  { x: 1.8274263290642496, y: 5.4591901510102145 }