plotboilerplate 1.27.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1107) hide show
  1. package/dist/index.esm.js +11286 -166
  2. package/dist/index.esm.js.map +1 -1
  3. package/dist/index.esm.min.js +1 -1
  4. package/dist/index.esm.min.js.map +1 -1
  5. package/dist/plotboilerplate.browser.min.js +1 -1
  6. package/dist/plotboilerplate.browser.min.js.map +1 -1
  7. package/dist/plotboilerplate.js +96 -17
  8. package/dist/plotboilerplate.min.js +1 -1
  9. package/package.json +2 -1
  10. package/src/_cjs/BezierPath.d.ts +610 -0
  11. package/src/_cjs/BezierPath.js +1127 -0
  12. package/src/_cjs/BezierPath.js.map +1 -0
  13. package/src/_cjs/Bounds.d.ts +252 -0
  14. package/src/_cjs/Bounds.js +320 -0
  15. package/src/_cjs/Bounds.js.map +1 -0
  16. package/src/_cjs/Circle.d.ts +214 -0
  17. package/src/_cjs/Circle.js +339 -0
  18. package/src/_cjs/Circle.js.map +1 -0
  19. package/src/_cjs/CircleSector.d.ts +211 -0
  20. package/src/_cjs/CircleSector.js +364 -0
  21. package/src/_cjs/CircleSector.js.map +1 -0
  22. package/src/_cjs/CubicBezierCurve.d.ts +656 -0
  23. package/src/_cjs/CubicBezierCurve.js +1062 -0
  24. package/src/_cjs/CubicBezierCurve.js.map +1 -0
  25. package/src/_cjs/Grid.d.ts +83 -0
  26. package/src/_cjs/Grid.js +90 -0
  27. package/src/_cjs/Grid.js.map +1 -0
  28. package/src/_cjs/KeyHandler.d.ts +177 -0
  29. package/src/_cjs/KeyHandler.js +435 -0
  30. package/src/_cjs/KeyHandler.js.map +1 -0
  31. package/src/_cjs/Line.d.ts +134 -0
  32. package/src/_cjs/Line.js +220 -0
  33. package/src/_cjs/Line.js.map +1 -0
  34. package/src/_cjs/MouseHandler.d.ts +283 -0
  35. package/src/_cjs/MouseHandler.js +423 -0
  36. package/src/_cjs/MouseHandler.js.map +1 -0
  37. package/src/_cjs/PBImage.d.ts +81 -0
  38. package/src/_cjs/PBImage.js +61 -0
  39. package/src/_cjs/PBImage.js.map +1 -0
  40. package/src/_cjs/PBText.d.ts +118 -0
  41. package/src/_cjs/PBText.js +63 -0
  42. package/src/_cjs/PBText.js.map +1 -0
  43. package/src/_cjs/PlotBoilerplate.d.ts +899 -0
  44. package/src/_cjs/PlotBoilerplate.js +2348 -0
  45. package/src/_cjs/PlotBoilerplate.js.map +1 -0
  46. package/src/_cjs/Polygon.d.ts +520 -0
  47. package/src/_cjs/Polygon.js +933 -0
  48. package/src/_cjs/Polygon.js.map +1 -0
  49. package/src/_cjs/SVGBuilder.d.ts +47 -0
  50. package/src/_cjs/SVGBuilder.js +100 -0
  51. package/src/_cjs/SVGBuilder.js.map +1 -0
  52. package/src/_cjs/Triangle.d.ts +392 -0
  53. package/src/_cjs/Triangle.js +497 -0
  54. package/src/_cjs/Triangle.js.map +1 -0
  55. package/src/_cjs/UIDGenerator.d.ts +12 -0
  56. package/src/_cjs/UIDGenerator.js +21 -0
  57. package/src/_cjs/UIDGenerator.js.map +1 -0
  58. package/src/_cjs/VEllipse.d.ts +319 -0
  59. package/src/_cjs/VEllipse.js +578 -0
  60. package/src/_cjs/VEllipse.js.map +1 -0
  61. package/src/_cjs/VEllipseSector.d.ts +230 -0
  62. package/src/_cjs/VEllipseSector.js +428 -0
  63. package/src/_cjs/VEllipseSector.js.map +1 -0
  64. package/src/_cjs/Vector.d.ts +126 -0
  65. package/src/_cjs/Vector.js +199 -0
  66. package/src/_cjs/Vector.js.map +1 -0
  67. package/src/_cjs/VertTuple.d.ts +284 -0
  68. package/src/_cjs/VertTuple.js +348 -0
  69. package/src/_cjs/VertTuple.js.map +1 -0
  70. package/src/_cjs/Vertex.d.ts +498 -0
  71. package/src/_cjs/Vertex.js +703 -0
  72. package/src/_cjs/Vertex.js.map +1 -0
  73. package/src/_cjs/VertexAttr.d.ts +72 -0
  74. package/src/_cjs/VertexAttr.js +59 -0
  75. package/src/_cjs/VertexAttr.js.map +1 -0
  76. package/src/_cjs/VertexListeners.d.ts +208 -0
  77. package/src/_cjs/VertexListeners.js +267 -0
  78. package/src/_cjs/VertexListeners.js.map +1 -0
  79. package/src/_cjs/draw.d.ts +657 -0
  80. package/src/_cjs/draw.js +1164 -0
  81. package/src/_cjs/draw.js.map +1 -0
  82. package/src/_cjs/drawgl.d.ts +544 -0
  83. package/src/_cjs/drawgl.js +794 -0
  84. package/src/_cjs/drawgl.js.map +1 -0
  85. package/src/_cjs/drawutilssvg.d.ts +954 -0
  86. package/src/_cjs/drawutilssvg.js +1713 -0
  87. package/src/_cjs/drawutilssvg.js.map +1 -0
  88. package/src/_cjs/entry-glsupport.js +28 -0
  89. package/src/_cjs/entry.js +29 -0
  90. package/src/_cjs/geomutils.d.ts +77 -0
  91. package/src/_cjs/geomutils.js +126 -0
  92. package/src/_cjs/geomutils.js.map +1 -0
  93. package/src/_cjs/index.d.ts +102 -0
  94. package/src/_cjs/index.js +128 -0
  95. package/src/_cjs/index.js.map +1 -0
  96. package/src/_cjs/interfaces/DrawLib.d.ts +582 -0
  97. package/src/_cjs/interfaces/DrawLib.js +32 -0
  98. package/src/_cjs/interfaces/DrawLib.js.map +1 -0
  99. package/src/_cjs/interfaces/additionals.d.ts +95 -0
  100. package/src/_cjs/interfaces/additionals.js +3 -0
  101. package/src/_cjs/interfaces/additionals.js.map +1 -0
  102. package/src/_cjs/interfaces/core.d.ts +286 -0
  103. package/src/_cjs/interfaces/core.js +30 -0
  104. package/src/_cjs/interfaces/core.js.map +1 -0
  105. package/src/_cjs/interfaces/externals.d.ts +56 -0
  106. package/src/_cjs/interfaces/externals.js +8 -0
  107. package/src/_cjs/interfaces/externals.js.map +1 -0
  108. package/src/_cjs/interfaces/index.d.ts +4 -0
  109. package/src/_cjs/interfaces/index.js +21 -0
  110. package/src/_cjs/interfaces/index.js.map +1 -0
  111. package/src/_cjs/module.d.ts +26 -0
  112. package/src/_cjs/module.js +60 -0
  113. package/src/_cjs/module.js.map +1 -0
  114. package/src/_cjs/utils/InitializationObserver.d.ts +18 -0
  115. package/src/_cjs/utils/InitializationObserver.js +63 -0
  116. package/src/_cjs/utils/InitializationObserver.js.map +1 -0
  117. package/src/_cjs/utils/LissajousFigure.d.ts +34 -0
  118. package/src/_cjs/utils/LissajousFigure.js +100 -0
  119. package/src/_cjs/utils/LissajousFigure.js.map +1 -0
  120. package/src/_cjs/utils/NGons.d.ts +13 -0
  121. package/src/_cjs/utils/NGons.js +36 -0
  122. package/src/_cjs/utils/NGons.js.map +1 -0
  123. package/src/_cjs/utils/Params.d.ts +17 -0
  124. package/src/_cjs/utils/Params.js +53 -0
  125. package/src/_cjs/utils/Params.js.map +1 -0
  126. package/src/_cjs/utils/PerlinNoise.d.ts +19 -0
  127. package/src/_cjs/utils/PerlinNoise.js +352 -0
  128. package/src/_cjs/utils/PerlinNoise.js.map +1 -0
  129. package/src/_cjs/utils/SVGPathUtils.d.ts +22 -0
  130. package/src/_cjs/utils/SVGPathUtils.js +45 -0
  131. package/src/_cjs/utils/SVGPathUtils.js.map +1 -0
  132. package/src/_cjs/utils/WebColors.d.ts +35 -0
  133. package/src/_cjs/utils/WebColors.js +58 -0
  134. package/src/_cjs/utils/WebColors.js.map +1 -0
  135. package/src/_cjs/utils/WebColorsContrast.d.ts +6 -0
  136. package/src/_cjs/utils/WebColorsContrast.js +12 -0
  137. package/src/_cjs/utils/WebColorsContrast.js.map +1 -0
  138. package/src/_cjs/utils/WebColorsMalachite.d.ts +12 -0
  139. package/src/_cjs/utils/WebColorsMalachite.js +28 -0
  140. package/src/_cjs/utils/WebColorsMalachite.js.map +1 -0
  141. package/src/_cjs/utils/algorithms/CatmullRomPath.d.ts +60 -0
  142. package/src/_cjs/utils/algorithms/CatmullRomPath.js +108 -0
  143. package/src/_cjs/utils/algorithms/CatmullRomPath.js.map +1 -0
  144. package/src/_cjs/utils/algorithms/CircleIntersections.d.ts +170 -0
  145. package/src/_cjs/utils/algorithms/CircleIntersections.js +310 -0
  146. package/src/_cjs/utils/algorithms/CircleIntersections.js.map +1 -0
  147. package/src/_cjs/utils/algorithms/ContourLineDetection.d.ts +150 -0
  148. package/src/_cjs/utils/algorithms/ContourLineDetection.js +367 -0
  149. package/src/_cjs/utils/algorithms/ContourLineDetection.js.map +1 -0
  150. package/src/_cjs/utils/algorithms/CubicSplinePath.d.ts +63 -0
  151. package/src/_cjs/utils/algorithms/CubicSplinePath.js +175 -0
  152. package/src/_cjs/utils/algorithms/CubicSplinePath.js.map +1 -0
  153. package/src/_cjs/utils/algorithms/HobbyPath.d.ts +81 -0
  154. package/src/_cjs/utils/algorithms/HobbyPath.js +278 -0
  155. package/src/_cjs/utils/algorithms/HobbyPath.js.map +1 -0
  156. package/src/_cjs/utils/algorithms/Metaballs.d.ts +30 -0
  157. package/src/_cjs/utils/algorithms/Metaballs.js +114 -0
  158. package/src/_cjs/utils/algorithms/Metaballs.js.map +1 -0
  159. package/src/_cjs/utils/algorithms/PolygonInset.d.ts +184 -0
  160. package/src/_cjs/utils/algorithms/PolygonInset.js +431 -0
  161. package/src/_cjs/utils/algorithms/PolygonInset.js.map +1 -0
  162. package/src/_cjs/utils/algorithms/PolygonTesselationOutlines.d.ts +145 -0
  163. package/src/_cjs/utils/algorithms/PolygonTesselationOutlines.js +269 -0
  164. package/src/_cjs/utils/algorithms/PolygonTesselationOutlines.js.map +1 -0
  165. package/src/_cjs/utils/algorithms/arrayFill.d.ts +8 -0
  166. package/src/_cjs/utils/algorithms/arrayFill.js +18 -0
  167. package/src/_cjs/utils/algorithms/arrayFill.js.map +1 -0
  168. package/src/_cjs/utils/algorithms/arrayResize.d.ts +8 -0
  169. package/src/_cjs/utils/algorithms/arrayResize.js +24 -0
  170. package/src/_cjs/utils/algorithms/arrayResize.js.map +1 -0
  171. package/src/_cjs/utils/algorithms/arrayShuffle.d.ts +8 -0
  172. package/src/_cjs/utils/algorithms/arrayShuffle.js +15 -0
  173. package/src/_cjs/utils/algorithms/arrayShuffle.js.map +1 -0
  174. package/src/_cjs/utils/algorithms/clearDuplicateVertices.d.ts +22 -0
  175. package/src/_cjs/utils/algorithms/clearDuplicateVertices.js +51 -0
  176. package/src/_cjs/utils/algorithms/clearDuplicateVertices.js.map +1 -0
  177. package/src/_cjs/utils/algorithms/clearPolygonDuplicateVertices.d.ts +24 -0
  178. package/src/_cjs/utils/algorithms/clearPolygonDuplicateVertices.js +61 -0
  179. package/src/_cjs/utils/algorithms/clearPolygonDuplicateVertices.js.map +1 -0
  180. package/src/_cjs/utils/algorithms/convexHull.d.ts +23 -0
  181. package/src/_cjs/utils/algorithms/convexHull.js +71 -0
  182. package/src/_cjs/utils/algorithms/convexHull.js.map +1 -0
  183. package/src/_cjs/utils/algorithms/convexPolygonIncircle.d.ts +41 -0
  184. package/src/_cjs/utils/algorithms/convexPolygonIncircle.js +145 -0
  185. package/src/_cjs/utils/algorithms/convexPolygonIncircle.js.map +1 -0
  186. package/src/_cjs/utils/algorithms/delaunay.d.ts +30 -0
  187. package/src/_cjs/utils/algorithms/delaunay.js +158 -0
  188. package/src/_cjs/utils/algorithms/delaunay.js.map +1 -0
  189. package/src/_cjs/utils/algorithms/delaunay2voronoi.d.ts +25 -0
  190. package/src/_cjs/utils/algorithms/delaunay2voronoi.js +104 -0
  191. package/src/_cjs/utils/algorithms/delaunay2voronoi.js.map +1 -0
  192. package/src/_cjs/utils/algorithms/detectPaths.d.ts +21 -0
  193. package/src/_cjs/utils/algorithms/detectPaths.js +169 -0
  194. package/src/_cjs/utils/algorithms/detectPaths.js.map +1 -0
  195. package/src/_cjs/utils/algorithms/findPolygonSelfIntersections.d.ts +21 -0
  196. package/src/_cjs/utils/algorithms/findPolygonSelfIntersections.js +51 -0
  197. package/src/_cjs/utils/algorithms/findPolygonSelfIntersections.js.map +1 -0
  198. package/src/_cjs/utils/algorithms/getContrastColor.d.ts +13 -0
  199. package/src/_cjs/utils/algorithms/getContrastColor.js +26 -0
  200. package/src/_cjs/utils/algorithms/getContrastColor.js.map +1 -0
  201. package/src/_cjs/utils/algorithms/matrixFill.d.ts +10 -0
  202. package/src/_cjs/utils/algorithms/matrixFill.js +21 -0
  203. package/src/_cjs/utils/algorithms/matrixFill.js.map +1 -0
  204. package/src/_cjs/utils/algorithms/pixelCornersToRoundPaths.d.ts +23 -0
  205. package/src/_cjs/utils/algorithms/pixelCornersToRoundPaths.js +270 -0
  206. package/src/_cjs/utils/algorithms/pixelCornersToRoundPaths.js.map +1 -0
  207. package/src/_cjs/utils/algorithms/splitPolygonToNonIntersecting.d.ts +28 -0
  208. package/src/_cjs/utils/algorithms/splitPolygonToNonIntersecting.js +102 -0
  209. package/src/_cjs/utils/algorithms/splitPolygonToNonIntersecting.js.map +1 -0
  210. package/src/_cjs/utils/algorithms/sutherlandHodgman.d.ts +16 -0
  211. package/src/_cjs/utils/algorithms/sutherlandHodgman.js +76 -0
  212. package/src/_cjs/utils/algorithms/sutherlandHodgman.js.map +1 -0
  213. package/src/_cjs/utils/cloneVertexArray.d.ts +13 -0
  214. package/src/_cjs/utils/cloneVertexArray.js +23 -0
  215. package/src/_cjs/utils/cloneVertexArray.js.map +1 -0
  216. package/src/_cjs/utils/createRandomizedPolygon.d.ts +14 -0
  217. package/src/_cjs/utils/createRandomizedPolygon.js +32 -0
  218. package/src/_cjs/utils/createRandomizedPolygon.js.map +1 -0
  219. package/src/_cjs/utils/creategui.js +434 -0
  220. package/src/_cjs/utils/dat.gui.arrowbounce.polyfill.js +128 -0
  221. package/src/_cjs/utils/dat.gui.title.polyfill.js +35 -0
  222. package/src/_cjs/utils/datastructures/CircularIntervalSet.d.ts +83 -0
  223. package/src/_cjs/utils/datastructures/CircularIntervalSet.js +163 -0
  224. package/src/_cjs/utils/datastructures/CircularIntervalSet.js.map +1 -0
  225. package/src/_cjs/utils/datastructures/Color.d.ts +391 -0
  226. package/src/_cjs/utils/datastructures/Color.js +1084 -0
  227. package/src/_cjs/utils/datastructures/Color.js.map +1 -0
  228. package/src/_cjs/utils/datastructures/ColorGradient.d.ts +81 -0
  229. package/src/_cjs/utils/datastructures/ColorGradient.js +176 -0
  230. package/src/_cjs/utils/datastructures/ColorGradient.js.map +1 -0
  231. package/src/_cjs/utils/datastructures/DataGrid2d.d.ts +53 -0
  232. package/src/_cjs/utils/datastructures/DataGrid2d.js +20 -0
  233. package/src/_cjs/utils/datastructures/DataGrid2d.js.map +1 -0
  234. package/src/_cjs/utils/datastructures/DataGrid2dArrayMatrix.d.ts +88 -0
  235. package/src/_cjs/utils/datastructures/DataGrid2dArrayMatrix.js +155 -0
  236. package/src/_cjs/utils/datastructures/DataGrid2dArrayMatrix.js.map +1 -0
  237. package/src/_cjs/utils/datastructures/DataGrid2dListAdapter.d.ts +59 -0
  238. package/src/_cjs/utils/datastructures/DataGrid2dListAdapter.js +84 -0
  239. package/src/_cjs/utils/datastructures/DataGrid2dListAdapter.js.map +1 -0
  240. package/src/_cjs/utils/datastructures/GenericPath.d.ts +86 -0
  241. package/src/_cjs/utils/datastructures/GenericPath.js +122 -0
  242. package/src/_cjs/utils/datastructures/GenericPath.js.map +1 -0
  243. package/src/_cjs/utils/datastructures/GeometryMesh.d.ts +49 -0
  244. package/src/_cjs/utils/datastructures/GeometryMesh.js +58 -0
  245. package/src/_cjs/utils/datastructures/GeometryMesh.js.map +1 -0
  246. package/src/_cjs/utils/datastructures/Girih.d.ts +181 -0
  247. package/src/_cjs/utils/datastructures/Girih.js +266 -0
  248. package/src/_cjs/utils/datastructures/Girih.js.map +1 -0
  249. package/src/_cjs/utils/datastructures/GirihBowtie.d.ts +37 -0
  250. package/src/_cjs/utils/datastructures/GirihBowtie.js +152 -0
  251. package/src/_cjs/utils/datastructures/GirihBowtie.js.map +1 -0
  252. package/src/_cjs/utils/datastructures/GirihDecagon.d.ts +52 -0
  253. package/src/_cjs/utils/datastructures/GirihDecagon.js +132 -0
  254. package/src/_cjs/utils/datastructures/GirihDecagon.js.map +1 -0
  255. package/src/_cjs/utils/datastructures/GirihHexagon.d.ts +39 -0
  256. package/src/_cjs/utils/datastructures/GirihHexagon.js +200 -0
  257. package/src/_cjs/utils/datastructures/GirihHexagon.js.map +1 -0
  258. package/src/_cjs/utils/datastructures/GirihPenroseRhombus.d.ts +46 -0
  259. package/src/_cjs/utils/datastructures/GirihPenroseRhombus.js +189 -0
  260. package/src/_cjs/utils/datastructures/GirihPenroseRhombus.js.map +1 -0
  261. package/src/_cjs/utils/datastructures/GirihPentagon.d.ts +37 -0
  262. package/src/_cjs/utils/datastructures/GirihPentagon.js +109 -0
  263. package/src/_cjs/utils/datastructures/GirihPentagon.js.map +1 -0
  264. package/src/_cjs/utils/datastructures/GirihRhombus.d.ts +38 -0
  265. package/src/_cjs/utils/datastructures/GirihRhombus.js +155 -0
  266. package/src/_cjs/utils/datastructures/GirihRhombus.js.map +1 -0
  267. package/src/_cjs/utils/datastructures/GirihTile.d.ts +283 -0
  268. package/src/_cjs/utils/datastructures/GirihTile.js +308 -0
  269. package/src/_cjs/utils/datastructures/GirihTile.js.map +1 -0
  270. package/src/_cjs/utils/datastructures/Matrix4x4.d.ts +244 -0
  271. package/src/_cjs/utils/datastructures/Matrix4x4.js +262 -0
  272. package/src/_cjs/utils/datastructures/Matrix4x4.js.map +1 -0
  273. package/src/_cjs/utils/datastructures/VoronoiCell.d.ts +122 -0
  274. package/src/_cjs/utils/datastructures/VoronoiCell.js +183 -0
  275. package/src/_cjs/utils/datastructures/VoronoiCell.js.map +1 -0
  276. package/src/_cjs/utils/datastructures/interfaces.d.ts +13 -0
  277. package/src/_cjs/utils/datastructures/interfaces.js +10 -0
  278. package/src/_cjs/utils/datastructures/interfaces.js.map +1 -0
  279. package/src/_cjs/utils/detectDarkMode.d.ts +10 -0
  280. package/src/_cjs/utils/detectDarkMode.js +41 -0
  281. package/src/_cjs/utils/detectDarkMode.js.map +1 -0
  282. package/src/_cjs/utils/dom/components/ColorGradientPicker.d.ts +246 -0
  283. package/src/_cjs/utils/dom/components/ColorGradientPicker.js +667 -0
  284. package/src/_cjs/utils/dom/components/ColorGradientPicker.js.map +1 -0
  285. package/src/_cjs/utils/dom/components/ColorGradientPickerJSX.d.ts +129 -0
  286. package/src/_cjs/utils/dom/components/ColorGradientPickerJSX.js +520 -0
  287. package/src/_cjs/utils/dom/components/ColorGradientPickerJSX.js.map +1 -0
  288. package/src/_cjs/utils/dom/components/ColorGradientSelector.d.ts +118 -0
  289. package/src/_cjs/utils/dom/components/ColorGradientSelector.js +327 -0
  290. package/src/_cjs/utils/dom/components/ColorGradientSelector.js.map +1 -0
  291. package/src/_cjs/utils/dom/components/Test.d.ts +7 -0
  292. package/src/_cjs/utils/dom/components/Test.js +30 -0
  293. package/src/_cjs/utils/dom/components/Test.js.map +1 -0
  294. package/src/_cjs/utils/dom/getAvailableContainerSpace.d.ts +2 -0
  295. package/src/_cjs/utils/dom/getAvailableContainerSpace.js +29 -0
  296. package/src/_cjs/utils/dom/getAvailableContainerSpace.js.map +1 -0
  297. package/src/_cjs/utils/dom/getFProp.d.ts +5 -0
  298. package/src/_cjs/utils/dom/getFProp.js +12 -0
  299. package/src/_cjs/utils/dom/getFProp.js.map +1 -0
  300. package/src/_cjs/utils/dom/guiSizeToggler.d.ts +18 -0
  301. package/src/_cjs/utils/dom/guiSizeToggler.js +44 -0
  302. package/src/_cjs/utils/dom/guiSizeToggler.js.map +1 -0
  303. package/src/_cjs/utils/findInVertexArray.d.ts +19 -0
  304. package/src/_cjs/utils/findInVertexArray.js +29 -0
  305. package/src/_cjs/utils/findInVertexArray.js.map +1 -0
  306. package/src/_cjs/utils/getFProp.d.ts +5 -0
  307. package/src/_cjs/utils/getFProp.js +12 -0
  308. package/src/_cjs/utils/getFProp.js.map +1 -0
  309. package/src/_cjs/utils/gup.d.ts +14 -0
  310. package/src/_cjs/utils/gup.js +31 -0
  311. package/src/_cjs/utils/gup.js.map +1 -0
  312. package/src/_cjs/utils/helpers/BezierPathInteractionHelper.d.ts +272 -0
  313. package/src/_cjs/utils/helpers/BezierPathInteractionHelper.js +655 -0
  314. package/src/_cjs/utils/helpers/BezierPathInteractionHelper.js.map +1 -0
  315. package/src/_cjs/utils/helpers/CircleHelper.d.ts +73 -0
  316. package/src/_cjs/utils/helpers/CircleHelper.js +93 -0
  317. package/src/_cjs/utils/helpers/CircleHelper.js.map +1 -0
  318. package/src/_cjs/utils/helpers/CircleSectorHelper.d.ts +90 -0
  319. package/src/_cjs/utils/helpers/CircleSectorHelper.js +114 -0
  320. package/src/_cjs/utils/helpers/CircleSectorHelper.js.map +1 -0
  321. package/src/_cjs/utils/helpers/TriangleHelper.d.ts +57 -0
  322. package/src/_cjs/utils/helpers/TriangleHelper.js +83 -0
  323. package/src/_cjs/utils/helpers/TriangleHelper.js.map +1 -0
  324. package/src/_cjs/utils/helpers/VEllipseHelper.d.ts +32 -0
  325. package/src/_cjs/utils/helpers/VEllipseHelper.js +88 -0
  326. package/src/_cjs/utils/helpers/VEllipseHelper.js.map +1 -0
  327. package/src/_cjs/utils/helpers/VEllipseSectorHelper.d.ts +52 -0
  328. package/src/_cjs/utils/helpers/VEllipseSectorHelper.js +135 -0
  329. package/src/_cjs/utils/helpers/VEllipseSectorHelper.js.map +1 -0
  330. package/src/_cjs/utils/io/DndFileHandler.d.ts +63 -0
  331. package/src/_cjs/utils/io/DndFileHandler.js +112 -0
  332. package/src/_cjs/utils/io/DndFileHandler.js.map +1 -0
  333. package/src/_cjs/utils/io/FileDrop.d.ts +110 -0
  334. package/src/_cjs/utils/io/FileDrop.js +177 -0
  335. package/src/_cjs/utils/io/FileDrop.js.map +1 -0
  336. package/src/_cjs/utils/lil.gui.arrowbounce.polyfill.js +133 -0
  337. package/src/_cjs/utils/lil.gui.title.polyfill.js +32 -0
  338. package/src/_cjs/utils/module.js +18 -0
  339. package/src/_cjs/utils/parsers/LinearColorGradientParser.d.ts +78 -0
  340. package/src/_cjs/utils/parsers/LinearColorGradientParser.js +224 -0
  341. package/src/_cjs/utils/parsers/LinearColorGradientParser.js.map +1 -0
  342. package/src/_cjs/utils/parsers/OBJParser.d.ts +24 -0
  343. package/src/_cjs/utils/parsers/OBJParser.js +77 -0
  344. package/src/_cjs/utils/parsers/OBJParser.js.map +1 -0
  345. package/src/_cjs/utils/parsers/STLParser.d.ts +61 -0
  346. package/src/_cjs/utils/parsers/STLParser.js +182 -0
  347. package/src/_cjs/utils/parsers/STLParser.js.map +1 -0
  348. package/src/_cjs/utils/parsers/svg/parseSVGPathData.d.ts +27 -0
  349. package/src/_cjs/utils/parsers/svg/parseSVGPathData.js +486 -0
  350. package/src/_cjs/utils/parsers/svg/parseSVGPathData.js.map +1 -0
  351. package/src/_cjs/utils/parsers/svg/splitSVGPathData.d.ts +20 -0
  352. package/src/_cjs/utils/parsers/svg/splitSVGPathData.js +53 -0
  353. package/src/_cjs/utils/parsers/svg/splitSVGPathData.js.map +1 -0
  354. package/src/_cjs/utils/parsers/svg/types.d.ts +63 -0
  355. package/src/_cjs/utils/parsers/svg/types.js +17 -0
  356. package/src/_cjs/utils/parsers/svg/types.js.map +1 -0
  357. package/src/_cjs/utils/ts-runner.js +146 -0
  358. package/src/_cjs/utils/tsAsyncScriptLoader.js +74 -0
  359. package/src/_esm/BezierPath.d.ts +610 -0
  360. package/src/_esm/BezierPath.js +1124 -0
  361. package/src/_esm/BezierPath.js.map +1 -0
  362. package/src/_esm/Bounds.d.ts +252 -0
  363. package/src/_esm/Bounds.js +317 -0
  364. package/src/_esm/Bounds.js.map +1 -0
  365. package/src/_esm/Circle.d.ts +214 -0
  366. package/src/_esm/Circle.js +335 -0
  367. package/src/_esm/Circle.js.map +1 -0
  368. package/src/_esm/CircleSector.d.ts +211 -0
  369. package/src/_esm/CircleSector.js +359 -0
  370. package/src/_esm/CircleSector.js.map +1 -0
  371. package/src/_esm/CubicBezierCurve.d.ts +656 -0
  372. package/src/_esm/CubicBezierCurve.js +1057 -0
  373. package/src/_esm/CubicBezierCurve.js.map +1 -0
  374. package/src/_esm/Grid.d.ts +83 -0
  375. package/src/_esm/Grid.js +89 -0
  376. package/src/_esm/Grid.js.map +1 -0
  377. package/src/_esm/KeyHandler.d.ts +177 -0
  378. package/src/_esm/KeyHandler.js +434 -0
  379. package/src/_esm/KeyHandler.js.map +1 -0
  380. package/src/_esm/Line.d.ts +134 -0
  381. package/src/_esm/Line.js +200 -0
  382. package/src/_esm/Line.js.map +1 -0
  383. package/src/_esm/MouseHandler.d.ts +283 -0
  384. package/src/_esm/MouseHandler.js +397 -0
  385. package/src/_esm/MouseHandler.js.map +1 -0
  386. package/src/_esm/PBImage.d.ts +81 -0
  387. package/src/_esm/PBImage.js +60 -0
  388. package/src/_esm/PBImage.js.map +1 -0
  389. package/src/_esm/PBText.d.ts +118 -0
  390. package/src/_esm/PBText.js +62 -0
  391. package/src/_esm/PBText.js.map +1 -0
  392. package/src/_esm/PlotBoilerplate.d.ts +899 -0
  393. package/src/_esm/PlotBoilerplate.js +2347 -0
  394. package/src/_esm/PlotBoilerplate.js.map +1 -0
  395. package/src/_esm/Polygon.d.ts +520 -0
  396. package/src/_esm/Polygon.js +924 -0
  397. package/src/_esm/Polygon.js.map +1 -0
  398. package/src/_esm/SVGBuilder.d.ts +47 -0
  399. package/src/_esm/SVGBuilder.js +95 -0
  400. package/src/_esm/SVGBuilder.js.map +1 -0
  401. package/src/_esm/Triangle.d.ts +392 -0
  402. package/src/_esm/Triangle.js +493 -0
  403. package/src/_esm/Triangle.js.map +1 -0
  404. package/src/_esm/UIDGenerator.d.ts +12 -0
  405. package/src/_esm/UIDGenerator.js +18 -0
  406. package/src/_esm/UIDGenerator.js.map +1 -0
  407. package/src/_esm/VEllipse.d.ts +319 -0
  408. package/src/_esm/VEllipse.js +574 -0
  409. package/src/_esm/VEllipse.js.map +1 -0
  410. package/src/_esm/VEllipseSector.d.ts +230 -0
  411. package/src/_esm/VEllipseSector.js +422 -0
  412. package/src/_esm/VEllipseSector.js.map +1 -0
  413. package/src/_esm/Vector.d.ts +126 -0
  414. package/src/_esm/Vector.js +181 -0
  415. package/src/_esm/Vector.js.map +1 -0
  416. package/src/_esm/VertTuple.d.ts +284 -0
  417. package/src/_esm/VertTuple.js +347 -0
  418. package/src/_esm/VertTuple.js.map +1 -0
  419. package/src/_esm/Vertex.d.ts +498 -0
  420. package/src/_esm/Vertex.js +702 -0
  421. package/src/_esm/Vertex.js.map +1 -0
  422. package/src/_esm/VertexAttr.d.ts +72 -0
  423. package/src/_esm/VertexAttr.js +58 -0
  424. package/src/_esm/VertexAttr.js.map +1 -0
  425. package/src/_esm/VertexListeners.d.ts +209 -0
  426. package/src/_esm/VertexListeners.js +270 -0
  427. package/src/_esm/VertexListeners.js.map +1 -0
  428. package/src/_esm/draw.d.ts +657 -0
  429. package/src/_esm/draw.js +1159 -0
  430. package/src/_esm/draw.js.map +1 -0
  431. package/src/_esm/drawgl.d.ts +544 -0
  432. package/src/_esm/drawgl.js +812 -0
  433. package/src/_esm/drawgl.js.map +1 -0
  434. package/src/_esm/drawutilssvg.d.ts +954 -0
  435. package/src/_esm/drawutilssvg.js +1705 -0
  436. package/src/_esm/drawutilssvg.js.map +1 -0
  437. package/src/_esm/entry-glsupport.js +28 -0
  438. package/src/_esm/entry.js +29 -0
  439. package/src/_esm/geomutils.d.ts +77 -0
  440. package/src/_esm/geomutils.js +126 -0
  441. package/src/_esm/geomutils.js.map +1 -0
  442. package/src/_esm/index.d.ts +102 -0
  443. package/src/_esm/index.js +128 -0
  444. package/src/_esm/index.js.map +1 -0
  445. package/src/_esm/interfaces/DrawLib.d.ts +582 -0
  446. package/src/_esm/interfaces/DrawLib.js +32 -0
  447. package/src/_esm/interfaces/DrawLib.js.map +1 -0
  448. package/src/_esm/interfaces/additionals.d.ts +95 -0
  449. package/src/_esm/interfaces/additionals.js +3 -0
  450. package/src/_esm/interfaces/additionals.js.map +1 -0
  451. package/src/_esm/interfaces/core.d.ts +286 -0
  452. package/src/_esm/interfaces/core.js +30 -0
  453. package/src/_esm/interfaces/core.js.map +1 -0
  454. package/src/_esm/interfaces/externals.d.ts +56 -0
  455. package/src/_esm/interfaces/externals.js +8 -0
  456. package/src/_esm/interfaces/externals.js.map +1 -0
  457. package/src/_esm/interfaces/index.d.ts +4 -0
  458. package/src/_esm/interfaces/index.js +21 -0
  459. package/src/_esm/interfaces/index.js.map +1 -0
  460. package/src/_esm/module.d.ts +26 -0
  461. package/src/_esm/module.js +60 -0
  462. package/src/_esm/module.js.map +1 -0
  463. package/src/_esm/src/ts/BezierPath.d.ts +610 -0
  464. package/src/_esm/src/ts/BezierPath.js +1120 -0
  465. package/src/_esm/src/ts/BezierPath.js.map +1 -0
  466. package/src/_esm/src/ts/Bounds.d.ts +252 -0
  467. package/src/_esm/src/ts/Bounds.js +313 -0
  468. package/src/_esm/src/ts/Bounds.js.map +1 -0
  469. package/src/_esm/src/ts/Circle.d.ts +214 -0
  470. package/src/_esm/src/ts/Circle.js +331 -0
  471. package/src/_esm/src/ts/Circle.js.map +1 -0
  472. package/src/_esm/src/ts/CircleSector.d.ts +211 -0
  473. package/src/_esm/src/ts/CircleSector.js +355 -0
  474. package/src/_esm/src/ts/CircleSector.js.map +1 -0
  475. package/src/_esm/src/ts/CubicBezierCurve.d.ts +656 -0
  476. package/src/_esm/src/ts/CubicBezierCurve.js +1053 -0
  477. package/src/_esm/src/ts/CubicBezierCurve.js.map +1 -0
  478. package/src/_esm/src/ts/Grid.d.ts +83 -0
  479. package/src/_esm/src/ts/Grid.js +85 -0
  480. package/src/_esm/src/ts/Grid.js.map +1 -0
  481. package/src/_esm/src/ts/KeyHandler.d.ts +177 -0
  482. package/src/_esm/src/ts/KeyHandler.js +430 -0
  483. package/src/_esm/src/ts/KeyHandler.js.map +1 -0
  484. package/src/_esm/src/ts/Line.d.ts +134 -0
  485. package/src/_esm/src/ts/Line.js +196 -0
  486. package/src/_esm/src/ts/Line.js.map +1 -0
  487. package/src/_esm/src/ts/MouseHandler.d.ts +283 -0
  488. package/src/_esm/src/ts/MouseHandler.js +391 -0
  489. package/src/_esm/src/ts/MouseHandler.js.map +1 -0
  490. package/src/_esm/src/ts/PBImage.d.ts +81 -0
  491. package/src/_esm/src/ts/PBImage.js +56 -0
  492. package/src/_esm/src/ts/PBImage.js.map +1 -0
  493. package/src/_esm/src/ts/PBText.d.ts +118 -0
  494. package/src/_esm/src/ts/PBText.js +58 -0
  495. package/src/_esm/src/ts/PBText.js.map +1 -0
  496. package/src/_esm/src/ts/PlotBoilerplate.d.ts +899 -0
  497. package/src/_esm/src/ts/PlotBoilerplate.js +2340 -0
  498. package/src/_esm/src/ts/PlotBoilerplate.js.map +1 -0
  499. package/src/_esm/src/ts/Polygon.d.ts +520 -0
  500. package/src/_esm/src/ts/Polygon.js +920 -0
  501. package/src/_esm/src/ts/Polygon.js.map +1 -0
  502. package/src/_esm/src/ts/Triangle.d.ts +392 -0
  503. package/src/_esm/src/ts/Triangle.js +489 -0
  504. package/src/_esm/src/ts/Triangle.js.map +1 -0
  505. package/src/_esm/src/ts/UIDGenerator.d.ts +12 -0
  506. package/src/_esm/src/ts/UIDGenerator.js +14 -0
  507. package/src/_esm/src/ts/UIDGenerator.js.map +1 -0
  508. package/src/_esm/src/ts/VEllipse.d.ts +319 -0
  509. package/src/_esm/src/ts/VEllipse.js +570 -0
  510. package/src/_esm/src/ts/VEllipse.js.map +1 -0
  511. package/src/_esm/src/ts/VEllipseSector.d.ts +230 -0
  512. package/src/_esm/src/ts/VEllipseSector.js +418 -0
  513. package/src/_esm/src/ts/VEllipseSector.js.map +1 -0
  514. package/src/_esm/src/ts/Vector.d.ts +126 -0
  515. package/src/_esm/src/ts/Vector.js +177 -0
  516. package/src/_esm/src/ts/Vector.js.map +1 -0
  517. package/src/_esm/src/ts/VertTuple.d.ts +284 -0
  518. package/src/_esm/src/ts/VertTuple.js +343 -0
  519. package/src/_esm/src/ts/VertTuple.js.map +1 -0
  520. package/src/_esm/src/ts/Vertex.d.ts +498 -0
  521. package/src/_esm/src/ts/Vertex.js +698 -0
  522. package/src/_esm/src/ts/Vertex.js.map +1 -0
  523. package/src/_esm/src/ts/VertexAttr.d.ts +72 -0
  524. package/src/_esm/src/ts/VertexAttr.js +54 -0
  525. package/src/_esm/src/ts/VertexAttr.js.map +1 -0
  526. package/src/_esm/src/ts/VertexListeners.d.ts +209 -0
  527. package/src/_esm/src/ts/VertexListeners.js +266 -0
  528. package/src/_esm/src/ts/VertexListeners.js.map +1 -0
  529. package/src/_esm/src/ts/draw.d.ts +657 -0
  530. package/src/_esm/src/ts/draw.js +1155 -0
  531. package/src/_esm/src/ts/draw.js.map +1 -0
  532. package/src/_esm/src/ts/drawgl.d.ts +544 -0
  533. package/src/_esm/src/ts/drawgl.js +808 -0
  534. package/src/_esm/src/ts/drawgl.js.map +1 -0
  535. package/src/_esm/src/ts/drawutilssvg.d.ts +954 -0
  536. package/src/_esm/src/ts/drawutilssvg.js +1701 -0
  537. package/src/_esm/src/ts/drawutilssvg.js.map +1 -0
  538. package/src/_esm/src/ts/geomutils.d.ts +77 -0
  539. package/src/_esm/src/ts/geomutils.js +123 -0
  540. package/src/_esm/src/ts/geomutils.js.map +1 -0
  541. package/src/_esm/src/ts/index.d.ts +102 -0
  542. package/src/_esm/src/ts/index.js +112 -0
  543. package/src/_esm/src/ts/index.js.map +1 -0
  544. package/src/_esm/src/ts/interfaces/DrawLib.d.ts +582 -0
  545. package/src/_esm/src/ts/interfaces/DrawLib.js +31 -0
  546. package/src/_esm/src/ts/interfaces/DrawLib.js.map +1 -0
  547. package/src/_esm/src/ts/interfaces/additionals.d.ts +95 -0
  548. package/src/_esm/src/ts/interfaces/additionals.js +2 -0
  549. package/src/_esm/src/ts/interfaces/additionals.js.map +1 -0
  550. package/src/_esm/src/ts/interfaces/core.d.ts +286 -0
  551. package/src/_esm/src/ts/interfaces/core.js +29 -0
  552. package/src/_esm/src/ts/interfaces/core.js.map +1 -0
  553. package/src/_esm/src/ts/interfaces/externals.d.ts +56 -0
  554. package/src/_esm/src/ts/interfaces/externals.js +7 -0
  555. package/src/_esm/src/ts/interfaces/externals.js.map +1 -0
  556. package/src/_esm/src/ts/interfaces/index.d.ts +4 -0
  557. package/src/_esm/src/ts/interfaces/index.js +5 -0
  558. package/src/_esm/src/ts/interfaces/index.js.map +1 -0
  559. package/src/_esm/src/ts/module.d.ts +26 -0
  560. package/src/_esm/src/ts/module.js +38 -0
  561. package/src/_esm/src/ts/module.js.map +1 -0
  562. package/src/_esm/src/ts/utils/InitializationObserver.d.ts +18 -0
  563. package/src/_esm/src/ts/utils/InitializationObserver.js +57 -0
  564. package/src/_esm/src/ts/utils/InitializationObserver.js.map +1 -0
  565. package/src/_esm/src/ts/utils/LissajousFigure.d.ts +34 -0
  566. package/src/_esm/src/ts/utils/LissajousFigure.js +95 -0
  567. package/src/_esm/src/ts/utils/LissajousFigure.js.map +1 -0
  568. package/src/_esm/src/ts/utils/NGons.d.ts +13 -0
  569. package/src/_esm/src/ts/utils/NGons.js +33 -0
  570. package/src/_esm/src/ts/utils/NGons.js.map +1 -0
  571. package/src/_esm/src/ts/utils/Params.d.ts +17 -0
  572. package/src/_esm/src/ts/utils/Params.js +48 -0
  573. package/src/_esm/src/ts/utils/Params.js.map +1 -0
  574. package/src/_esm/src/ts/utils/PerlinNoise.d.ts +19 -0
  575. package/src/_esm/src/ts/utils/PerlinNoise.js +346 -0
  576. package/src/_esm/src/ts/utils/PerlinNoise.js.map +1 -0
  577. package/src/_esm/src/ts/utils/SVGPathUtils.d.ts +22 -0
  578. package/src/_esm/src/ts/utils/SVGPathUtils.js +42 -0
  579. package/src/_esm/src/ts/utils/SVGPathUtils.js.map +1 -0
  580. package/src/_esm/src/ts/utils/WebColors.d.ts +35 -0
  581. package/src/_esm/src/ts/utils/WebColors.js +54 -0
  582. package/src/_esm/src/ts/utils/WebColors.js.map +1 -0
  583. package/src/_esm/src/ts/utils/WebColorsContrast.d.ts +6 -0
  584. package/src/_esm/src/ts/utils/WebColorsContrast.js +9 -0
  585. package/src/_esm/src/ts/utils/WebColorsContrast.js.map +1 -0
  586. package/src/_esm/src/ts/utils/WebColorsMalachite.d.ts +12 -0
  587. package/src/_esm/src/ts/utils/WebColorsMalachite.js +25 -0
  588. package/src/_esm/src/ts/utils/WebColorsMalachite.js.map +1 -0
  589. package/src/_esm/src/ts/utils/algorithms/CatmullRomPath.d.ts +60 -0
  590. package/src/_esm/src/ts/utils/algorithms/CatmullRomPath.js +103 -0
  591. package/src/_esm/src/ts/utils/algorithms/CatmullRomPath.js.map +1 -0
  592. package/src/_esm/src/ts/utils/algorithms/CircleIntersections.d.ts +170 -0
  593. package/src/_esm/src/ts/utils/algorithms/CircleIntersections.js +303 -0
  594. package/src/_esm/src/ts/utils/algorithms/CircleIntersections.js.map +1 -0
  595. package/src/_esm/src/ts/utils/algorithms/ContourLineDetection.d.ts +150 -0
  596. package/src/_esm/src/ts/utils/algorithms/ContourLineDetection.js +362 -0
  597. package/src/_esm/src/ts/utils/algorithms/ContourLineDetection.js.map +1 -0
  598. package/src/_esm/src/ts/utils/algorithms/CubicSplinePath.d.ts +63 -0
  599. package/src/_esm/src/ts/utils/algorithms/CubicSplinePath.js +170 -0
  600. package/src/_esm/src/ts/utils/algorithms/CubicSplinePath.js.map +1 -0
  601. package/src/_esm/src/ts/utils/algorithms/HobbyPath.d.ts +81 -0
  602. package/src/_esm/src/ts/utils/algorithms/HobbyPath.js +273 -0
  603. package/src/_esm/src/ts/utils/algorithms/HobbyPath.js.map +1 -0
  604. package/src/_esm/src/ts/utils/algorithms/Metaballs.d.ts +30 -0
  605. package/src/_esm/src/ts/utils/algorithms/Metaballs.js +109 -0
  606. package/src/_esm/src/ts/utils/algorithms/Metaballs.js.map +1 -0
  607. package/src/_esm/src/ts/utils/algorithms/PolygonInset.d.ts +184 -0
  608. package/src/_esm/src/ts/utils/algorithms/PolygonInset.js +424 -0
  609. package/src/_esm/src/ts/utils/algorithms/PolygonInset.js.map +1 -0
  610. package/src/_esm/src/ts/utils/algorithms/PolygonTesselationOutlines.d.ts +145 -0
  611. package/src/_esm/src/ts/utils/algorithms/PolygonTesselationOutlines.js +262 -0
  612. package/src/_esm/src/ts/utils/algorithms/PolygonTesselationOutlines.js.map +1 -0
  613. package/src/_esm/src/ts/utils/algorithms/arrayFill.d.ts +8 -0
  614. package/src/_esm/src/ts/utils/algorithms/arrayFill.js +14 -0
  615. package/src/_esm/src/ts/utils/algorithms/arrayFill.js.map +1 -0
  616. package/src/_esm/src/ts/utils/algorithms/arrayResize.d.ts +8 -0
  617. package/src/_esm/src/ts/utils/algorithms/arrayResize.js +20 -0
  618. package/src/_esm/src/ts/utils/algorithms/arrayResize.js.map +1 -0
  619. package/src/_esm/src/ts/utils/algorithms/arrayShuffle.d.ts +8 -0
  620. package/src/_esm/src/ts/utils/algorithms/arrayShuffle.js +11 -0
  621. package/src/_esm/src/ts/utils/algorithms/arrayShuffle.js.map +1 -0
  622. package/src/_esm/src/ts/utils/algorithms/clearDuplicateVertices.d.ts +22 -0
  623. package/src/_esm/src/ts/utils/algorithms/clearDuplicateVertices.js +47 -0
  624. package/src/_esm/src/ts/utils/algorithms/clearDuplicateVertices.js.map +1 -0
  625. package/src/_esm/src/ts/utils/algorithms/clearPolygonDuplicateVertices.d.ts +24 -0
  626. package/src/_esm/src/ts/utils/algorithms/clearPolygonDuplicateVertices.js +57 -0
  627. package/src/_esm/src/ts/utils/algorithms/clearPolygonDuplicateVertices.js.map +1 -0
  628. package/src/_esm/src/ts/utils/algorithms/convexHull.d.ts +23 -0
  629. package/src/_esm/src/ts/utils/algorithms/convexHull.js +67 -0
  630. package/src/_esm/src/ts/utils/algorithms/convexHull.js.map +1 -0
  631. package/src/_esm/src/ts/utils/algorithms/convexPolygonIncircle.d.ts +41 -0
  632. package/src/_esm/src/ts/utils/algorithms/convexPolygonIncircle.js +141 -0
  633. package/src/_esm/src/ts/utils/algorithms/convexPolygonIncircle.js.map +1 -0
  634. package/src/_esm/src/ts/utils/algorithms/delaunay.d.ts +30 -0
  635. package/src/_esm/src/ts/utils/algorithms/delaunay.js +153 -0
  636. package/src/_esm/src/ts/utils/algorithms/delaunay.js.map +1 -0
  637. package/src/_esm/src/ts/utils/algorithms/delaunay2voronoi.d.ts +25 -0
  638. package/src/_esm/src/ts/utils/algorithms/delaunay2voronoi.js +99 -0
  639. package/src/_esm/src/ts/utils/algorithms/delaunay2voronoi.js.map +1 -0
  640. package/src/_esm/src/ts/utils/algorithms/detectPaths.d.ts +21 -0
  641. package/src/_esm/src/ts/utils/algorithms/detectPaths.js +165 -0
  642. package/src/_esm/src/ts/utils/algorithms/detectPaths.js.map +1 -0
  643. package/src/_esm/src/ts/utils/algorithms/findPolygonSelfIntersections.d.ts +21 -0
  644. package/src/_esm/src/ts/utils/algorithms/findPolygonSelfIntersections.js +47 -0
  645. package/src/_esm/src/ts/utils/algorithms/findPolygonSelfIntersections.js.map +1 -0
  646. package/src/_esm/src/ts/utils/algorithms/getContrastColor.d.ts +13 -0
  647. package/src/_esm/src/ts/utils/algorithms/getContrastColor.js +22 -0
  648. package/src/_esm/src/ts/utils/algorithms/getContrastColor.js.map +1 -0
  649. package/src/_esm/src/ts/utils/algorithms/matrixFill.d.ts +10 -0
  650. package/src/_esm/src/ts/utils/algorithms/matrixFill.js +17 -0
  651. package/src/_esm/src/ts/utils/algorithms/matrixFill.js.map +1 -0
  652. package/src/_esm/src/ts/utils/algorithms/pixelCornersToRoundPaths.d.ts +23 -0
  653. package/src/_esm/src/ts/utils/algorithms/pixelCornersToRoundPaths.js +266 -0
  654. package/src/_esm/src/ts/utils/algorithms/pixelCornersToRoundPaths.js.map +1 -0
  655. package/src/_esm/src/ts/utils/algorithms/splitPolygonToNonIntersecting.d.ts +28 -0
  656. package/src/_esm/src/ts/utils/algorithms/splitPolygonToNonIntersecting.js +99 -0
  657. package/src/_esm/src/ts/utils/algorithms/splitPolygonToNonIntersecting.js.map +1 -0
  658. package/src/_esm/src/ts/utils/algorithms/sutherlandHodgman.d.ts +16 -0
  659. package/src/_esm/src/ts/utils/algorithms/sutherlandHodgman.js +72 -0
  660. package/src/_esm/src/ts/utils/algorithms/sutherlandHodgman.js.map +1 -0
  661. package/src/_esm/src/ts/utils/cloneVertexArray.d.ts +13 -0
  662. package/src/_esm/src/ts/utils/cloneVertexArray.js +19 -0
  663. package/src/_esm/src/ts/utils/cloneVertexArray.js.map +1 -0
  664. package/src/_esm/src/ts/utils/createRandomizedPolygon.d.ts +14 -0
  665. package/src/_esm/src/ts/utils/createRandomizedPolygon.js +28 -0
  666. package/src/_esm/src/ts/utils/createRandomizedPolygon.js.map +1 -0
  667. package/src/_esm/src/ts/utils/datastructures/CircularIntervalSet.d.ts +83 -0
  668. package/src/_esm/src/ts/utils/datastructures/CircularIntervalSet.js +158 -0
  669. package/src/_esm/src/ts/utils/datastructures/CircularIntervalSet.js.map +1 -0
  670. package/src/_esm/src/ts/utils/datastructures/Color.d.ts +391 -0
  671. package/src/_esm/src/ts/utils/datastructures/Color.js +1063 -0
  672. package/src/_esm/src/ts/utils/datastructures/Color.js.map +1 -0
  673. package/src/_esm/src/ts/utils/datastructures/ColorGradient.d.ts +81 -0
  674. package/src/_esm/src/ts/utils/datastructures/ColorGradient.js +171 -0
  675. package/src/_esm/src/ts/utils/datastructures/ColorGradient.js.map +1 -0
  676. package/src/_esm/src/ts/utils/datastructures/DataGrid2d.d.ts +53 -0
  677. package/src/_esm/src/ts/utils/datastructures/DataGrid2d.js +19 -0
  678. package/src/_esm/src/ts/utils/datastructures/DataGrid2d.js.map +1 -0
  679. package/src/_esm/src/ts/utils/datastructures/DataGrid2dArrayMatrix.d.ts +88 -0
  680. package/src/_esm/src/ts/utils/datastructures/DataGrid2dArrayMatrix.js +150 -0
  681. package/src/_esm/src/ts/utils/datastructures/DataGrid2dArrayMatrix.js.map +1 -0
  682. package/src/_esm/src/ts/utils/datastructures/DataGrid2dListAdapter.d.ts +59 -0
  683. package/src/_esm/src/ts/utils/datastructures/DataGrid2dListAdapter.js +79 -0
  684. package/src/_esm/src/ts/utils/datastructures/DataGrid2dListAdapter.js.map +1 -0
  685. package/src/_esm/src/ts/utils/datastructures/GenericPath.d.ts +86 -0
  686. package/src/_esm/src/ts/utils/datastructures/GenericPath.js +117 -0
  687. package/src/_esm/src/ts/utils/datastructures/GenericPath.js.map +1 -0
  688. package/src/_esm/src/ts/utils/datastructures/GeometryMesh.d.ts +49 -0
  689. package/src/_esm/src/ts/utils/datastructures/GeometryMesh.js +53 -0
  690. package/src/_esm/src/ts/utils/datastructures/GeometryMesh.js.map +1 -0
  691. package/src/_esm/src/ts/utils/datastructures/Girih.d.ts +181 -0
  692. package/src/_esm/src/ts/utils/datastructures/Girih.js +261 -0
  693. package/src/_esm/src/ts/utils/datastructures/Girih.js.map +1 -0
  694. package/src/_esm/src/ts/utils/datastructures/GirihBowtie.d.ts +37 -0
  695. package/src/_esm/src/ts/utils/datastructures/GirihBowtie.js +130 -0
  696. package/src/_esm/src/ts/utils/datastructures/GirihBowtie.js.map +1 -0
  697. package/src/_esm/src/ts/utils/datastructures/GirihDecagon.d.ts +52 -0
  698. package/src/_esm/src/ts/utils/datastructures/GirihDecagon.js +110 -0
  699. package/src/_esm/src/ts/utils/datastructures/GirihDecagon.js.map +1 -0
  700. package/src/_esm/src/ts/utils/datastructures/GirihHexagon.d.ts +39 -0
  701. package/src/_esm/src/ts/utils/datastructures/GirihHexagon.js +178 -0
  702. package/src/_esm/src/ts/utils/datastructures/GirihHexagon.js.map +1 -0
  703. package/src/_esm/src/ts/utils/datastructures/GirihPenroseRhombus.d.ts +46 -0
  704. package/src/_esm/src/ts/utils/datastructures/GirihPenroseRhombus.js +167 -0
  705. package/src/_esm/src/ts/utils/datastructures/GirihPenroseRhombus.js.map +1 -0
  706. package/src/_esm/src/ts/utils/datastructures/GirihPentagon.d.ts +37 -0
  707. package/src/_esm/src/ts/utils/datastructures/GirihPentagon.js +87 -0
  708. package/src/_esm/src/ts/utils/datastructures/GirihPentagon.js.map +1 -0
  709. package/src/_esm/src/ts/utils/datastructures/GirihRhombus.d.ts +38 -0
  710. package/src/_esm/src/ts/utils/datastructures/GirihRhombus.js +133 -0
  711. package/src/_esm/src/ts/utils/datastructures/GirihRhombus.js.map +1 -0
  712. package/src/_esm/src/ts/utils/datastructures/GirihTile.d.ts +283 -0
  713. package/src/_esm/src/ts/utils/datastructures/GirihTile.js +286 -0
  714. package/src/_esm/src/ts/utils/datastructures/GirihTile.js.map +1 -0
  715. package/src/_esm/src/ts/utils/datastructures/Matrix4x4.d.ts +244 -0
  716. package/src/_esm/src/ts/utils/datastructures/Matrix4x4.js +246 -0
  717. package/src/_esm/src/ts/utils/datastructures/Matrix4x4.js.map +1 -0
  718. package/src/_esm/src/ts/utils/datastructures/VoronoiCell.d.ts +122 -0
  719. package/src/_esm/src/ts/utils/datastructures/VoronoiCell.js +178 -0
  720. package/src/_esm/src/ts/utils/datastructures/VoronoiCell.js.map +1 -0
  721. package/src/_esm/src/ts/utils/datastructures/interfaces.d.ts +13 -0
  722. package/src/_esm/src/ts/utils/datastructures/interfaces.js +9 -0
  723. package/src/_esm/src/ts/utils/datastructures/interfaces.js.map +1 -0
  724. package/src/_esm/src/ts/utils/detectDarkMode.d.ts +10 -0
  725. package/src/_esm/src/ts/utils/detectDarkMode.js +37 -0
  726. package/src/_esm/src/ts/utils/detectDarkMode.js.map +1 -0
  727. package/src/_esm/src/ts/utils/dom/components/ColorGradientPicker.d.ts +246 -0
  728. package/src/_esm/src/ts/utils/dom/components/ColorGradientPicker.js +743 -0
  729. package/src/_esm/src/ts/utils/dom/components/ColorGradientPicker.js.map +1 -0
  730. package/src/_esm/src/ts/utils/dom/components/ColorGradientSelector.d.ts +118 -0
  731. package/src/_esm/src/ts/utils/dom/components/ColorGradientSelector.js +339 -0
  732. package/src/_esm/src/ts/utils/dom/components/ColorGradientSelector.js.map +1 -0
  733. package/src/_esm/src/ts/utils/dom/components/Test.d.ts +7 -0
  734. package/src/_esm/src/ts/utils/dom/components/Test.js +26 -0
  735. package/src/_esm/src/ts/utils/dom/components/Test.js.map +1 -0
  736. package/src/_esm/src/ts/utils/dom/getAvailableContainerSpace.d.ts +2 -0
  737. package/src/_esm/src/ts/utils/dom/getAvailableContainerSpace.js +25 -0
  738. package/src/_esm/src/ts/utils/dom/getAvailableContainerSpace.js.map +1 -0
  739. package/src/_esm/src/ts/utils/dom/getFProp.d.ts +5 -0
  740. package/src/_esm/src/ts/utils/dom/getFProp.js +8 -0
  741. package/src/_esm/src/ts/utils/dom/getFProp.js.map +1 -0
  742. package/src/_esm/src/ts/utils/dom/guiSizeToggler.d.ts +18 -0
  743. package/src/_esm/src/ts/utils/dom/guiSizeToggler.js +40 -0
  744. package/src/_esm/src/ts/utils/dom/guiSizeToggler.js.map +1 -0
  745. package/src/_esm/src/ts/utils/findInVertexArray.d.ts +19 -0
  746. package/src/_esm/src/ts/utils/findInVertexArray.js +25 -0
  747. package/src/_esm/src/ts/utils/findInVertexArray.js.map +1 -0
  748. package/src/_esm/src/ts/utils/gup.d.ts +14 -0
  749. package/src/_esm/src/ts/utils/gup.js +27 -0
  750. package/src/_esm/src/ts/utils/gup.js.map +1 -0
  751. package/src/_esm/src/ts/utils/helpers/BezierPathInteractionHelper.d.ts +272 -0
  752. package/src/_esm/src/ts/utils/helpers/BezierPathInteractionHelper.js +648 -0
  753. package/src/_esm/src/ts/utils/helpers/BezierPathInteractionHelper.js.map +1 -0
  754. package/src/_esm/src/ts/utils/helpers/CircleHelper.d.ts +73 -0
  755. package/src/_esm/src/ts/utils/helpers/CircleHelper.js +88 -0
  756. package/src/_esm/src/ts/utils/helpers/CircleHelper.js.map +1 -0
  757. package/src/_esm/src/ts/utils/helpers/CircleSectorHelper.d.ts +90 -0
  758. package/src/_esm/src/ts/utils/helpers/CircleSectorHelper.js +109 -0
  759. package/src/_esm/src/ts/utils/helpers/CircleSectorHelper.js.map +1 -0
  760. package/src/_esm/src/ts/utils/helpers/TriangleHelper.d.ts +57 -0
  761. package/src/_esm/src/ts/utils/helpers/TriangleHelper.js +78 -0
  762. package/src/_esm/src/ts/utils/helpers/TriangleHelper.js.map +1 -0
  763. package/src/_esm/src/ts/utils/helpers/VEllipseHelper.d.ts +32 -0
  764. package/src/_esm/src/ts/utils/helpers/VEllipseHelper.js +83 -0
  765. package/src/_esm/src/ts/utils/helpers/VEllipseHelper.js.map +1 -0
  766. package/src/_esm/src/ts/utils/helpers/VEllipseSectorHelper.d.ts +52 -0
  767. package/src/_esm/src/ts/utils/helpers/VEllipseSectorHelper.js +130 -0
  768. package/src/_esm/src/ts/utils/helpers/VEllipseSectorHelper.js.map +1 -0
  769. package/src/_esm/src/ts/utils/io/FileDrop.d.ts +110 -0
  770. package/src/_esm/src/ts/utils/io/FileDrop.js +171 -0
  771. package/src/_esm/src/ts/utils/io/FileDrop.js.map +1 -0
  772. package/src/_esm/src/ts/utils/parsers/LinearColorGradientParser.d.ts +78 -0
  773. package/src/_esm/src/ts/utils/parsers/LinearColorGradientParser.js +217 -0
  774. package/src/_esm/src/ts/utils/parsers/LinearColorGradientParser.js.map +1 -0
  775. package/src/_esm/src/ts/utils/parsers/OBJParser.d.ts +24 -0
  776. package/src/_esm/src/ts/utils/parsers/OBJParser.js +72 -0
  777. package/src/_esm/src/ts/utils/parsers/OBJParser.js.map +1 -0
  778. package/src/_esm/src/ts/utils/parsers/STLParser.d.ts +61 -0
  779. package/src/_esm/src/ts/utils/parsers/STLParser.js +175 -0
  780. package/src/_esm/src/ts/utils/parsers/STLParser.js.map +1 -0
  781. package/src/_esm/src/ts/utils/parsers/svg/parseSVGPathData.d.ts +27 -0
  782. package/src/_esm/src/ts/utils/parsers/svg/parseSVGPathData.js +482 -0
  783. package/src/_esm/src/ts/utils/parsers/svg/parseSVGPathData.js.map +1 -0
  784. package/src/_esm/src/ts/utils/parsers/svg/splitSVGPathData.d.ts +20 -0
  785. package/src/_esm/src/ts/utils/parsers/svg/splitSVGPathData.js +49 -0
  786. package/src/_esm/src/ts/utils/parsers/svg/splitSVGPathData.js.map +1 -0
  787. package/src/_esm/src/ts/utils/parsers/svg/types.d.ts +63 -0
  788. package/src/_esm/src/ts/utils/parsers/svg/types.js +16 -0
  789. package/src/_esm/src/ts/utils/parsers/svg/types.js.map +1 -0
  790. package/src/_esm/utils/InitializationObserver.d.ts +18 -0
  791. package/src/_esm/utils/InitializationObserver.js +61 -0
  792. package/src/_esm/utils/InitializationObserver.js.map +1 -0
  793. package/src/_esm/utils/LissajousFigure.d.ts +34 -0
  794. package/src/_esm/utils/LissajousFigure.js +99 -0
  795. package/src/_esm/utils/LissajousFigure.js.map +1 -0
  796. package/src/_esm/utils/NGons.d.ts +13 -0
  797. package/src/_esm/utils/NGons.js +36 -0
  798. package/src/_esm/utils/NGons.js.map +1 -0
  799. package/src/_esm/utils/Params.d.ts +17 -0
  800. package/src/_esm/utils/Params.js +52 -0
  801. package/src/_esm/utils/Params.js.map +1 -0
  802. package/src/_esm/utils/PerlinNoise.d.ts +19 -0
  803. package/src/_esm/utils/PerlinNoise.js +350 -0
  804. package/src/_esm/utils/PerlinNoise.js.map +1 -0
  805. package/src/_esm/utils/SVGPathUtils.d.ts +22 -0
  806. package/src/_esm/utils/SVGPathUtils.js +45 -0
  807. package/src/_esm/utils/SVGPathUtils.js.map +1 -0
  808. package/src/_esm/utils/WebColors.d.ts +35 -0
  809. package/src/_esm/utils/WebColors.js +58 -0
  810. package/src/_esm/utils/WebColors.js.map +1 -0
  811. package/src/_esm/utils/WebColorsContrast.d.ts +6 -0
  812. package/src/_esm/utils/WebColorsContrast.js +12 -0
  813. package/src/_esm/utils/WebColorsContrast.js.map +1 -0
  814. package/src/_esm/utils/WebColorsMalachite.d.ts +12 -0
  815. package/src/_esm/utils/WebColorsMalachite.js +28 -0
  816. package/src/_esm/utils/WebColorsMalachite.js.map +1 -0
  817. package/src/_esm/utils/algorithms/CatmullRomPath.d.ts +60 -0
  818. package/src/_esm/utils/algorithms/CatmullRomPath.js +107 -0
  819. package/src/_esm/utils/algorithms/CatmullRomPath.js.map +1 -0
  820. package/src/_esm/utils/algorithms/CircleIntersections.d.ts +170 -0
  821. package/src/_esm/utils/algorithms/CircleIntersections.js +307 -0
  822. package/src/_esm/utils/algorithms/CircleIntersections.js.map +1 -0
  823. package/src/_esm/utils/algorithms/ContourLineDetection.d.ts +150 -0
  824. package/src/_esm/utils/algorithms/ContourLineDetection.js +366 -0
  825. package/src/_esm/utils/algorithms/ContourLineDetection.js.map +1 -0
  826. package/src/_esm/utils/algorithms/CubicSplinePath.d.ts +63 -0
  827. package/src/_esm/utils/algorithms/CubicSplinePath.js +174 -0
  828. package/src/_esm/utils/algorithms/CubicSplinePath.js.map +1 -0
  829. package/src/_esm/utils/algorithms/HobbyPath.d.ts +81 -0
  830. package/src/_esm/utils/algorithms/HobbyPath.js +277 -0
  831. package/src/_esm/utils/algorithms/HobbyPath.js.map +1 -0
  832. package/src/_esm/utils/algorithms/Metaballs.d.ts +30 -0
  833. package/src/_esm/utils/algorithms/Metaballs.js +113 -0
  834. package/src/_esm/utils/algorithms/Metaballs.js.map +1 -0
  835. package/src/_esm/utils/algorithms/PolygonInset.d.ts +184 -0
  836. package/src/_esm/utils/algorithms/PolygonInset.js +428 -0
  837. package/src/_esm/utils/algorithms/PolygonInset.js.map +1 -0
  838. package/src/_esm/utils/algorithms/PolygonTesselationOutlines.d.ts +145 -0
  839. package/src/_esm/utils/algorithms/PolygonTesselationOutlines.js +267 -0
  840. package/src/_esm/utils/algorithms/PolygonTesselationOutlines.js.map +1 -0
  841. package/src/_esm/utils/algorithms/arrayFill.d.ts +8 -0
  842. package/src/_esm/utils/algorithms/arrayFill.js +18 -0
  843. package/src/_esm/utils/algorithms/arrayFill.js.map +1 -0
  844. package/src/_esm/utils/algorithms/arrayResize.d.ts +8 -0
  845. package/src/_esm/utils/algorithms/arrayResize.js +24 -0
  846. package/src/_esm/utils/algorithms/arrayResize.js.map +1 -0
  847. package/src/_esm/utils/algorithms/arrayShuffle.d.ts +8 -0
  848. package/src/_esm/utils/algorithms/arrayShuffle.js +15 -0
  849. package/src/_esm/utils/algorithms/arrayShuffle.js.map +1 -0
  850. package/src/_esm/utils/algorithms/clearDuplicateVertices.d.ts +22 -0
  851. package/src/_esm/utils/algorithms/clearDuplicateVertices.js +51 -0
  852. package/src/_esm/utils/algorithms/clearDuplicateVertices.js.map +1 -0
  853. package/src/_esm/utils/algorithms/clearPolygonDuplicateVertices.d.ts +24 -0
  854. package/src/_esm/utils/algorithms/clearPolygonDuplicateVertices.js +61 -0
  855. package/src/_esm/utils/algorithms/clearPolygonDuplicateVertices.js.map +1 -0
  856. package/src/_esm/utils/algorithms/convexHull.d.ts +23 -0
  857. package/src/_esm/utils/algorithms/convexHull.js +71 -0
  858. package/src/_esm/utils/algorithms/convexHull.js.map +1 -0
  859. package/src/_esm/utils/algorithms/convexPolygonIncircle.d.ts +41 -0
  860. package/src/_esm/utils/algorithms/convexPolygonIncircle.js +145 -0
  861. package/src/_esm/utils/algorithms/convexPolygonIncircle.js.map +1 -0
  862. package/src/_esm/utils/algorithms/createRandomizedPolygon.d.ts +14 -0
  863. package/src/_esm/utils/algorithms/createRandomizedPolygon.js +28 -0
  864. package/src/_esm/utils/algorithms/createRandomizedPolygon.js.map +1 -0
  865. package/src/_esm/utils/algorithms/delaunay.d.ts +30 -0
  866. package/src/_esm/utils/algorithms/delaunay.js +157 -0
  867. package/src/_esm/utils/algorithms/delaunay.js.map +1 -0
  868. package/src/_esm/utils/algorithms/delaunay2voronoi.d.ts +25 -0
  869. package/src/_esm/utils/algorithms/delaunay2voronoi.js +103 -0
  870. package/src/_esm/utils/algorithms/delaunay2voronoi.js.map +1 -0
  871. package/src/_esm/utils/algorithms/detectPaths.d.ts +21 -0
  872. package/src/_esm/utils/algorithms/detectPaths.js +169 -0
  873. package/src/_esm/utils/algorithms/detectPaths.js.map +1 -0
  874. package/src/_esm/utils/algorithms/findPolygonSelfIntersections.d.ts +21 -0
  875. package/src/_esm/utils/algorithms/findPolygonSelfIntersections.js +51 -0
  876. package/src/_esm/utils/algorithms/findPolygonSelfIntersections.js.map +1 -0
  877. package/src/_esm/utils/algorithms/getContrastColor.d.ts +13 -0
  878. package/src/_esm/utils/algorithms/getContrastColor.js +26 -0
  879. package/src/_esm/utils/algorithms/getContrastColor.js.map +1 -0
  880. package/src/_esm/utils/algorithms/matrixFill.d.ts +10 -0
  881. package/src/_esm/utils/algorithms/matrixFill.js +21 -0
  882. package/src/_esm/utils/algorithms/matrixFill.js.map +1 -0
  883. package/src/_esm/utils/algorithms/pixelCornersToRoundPaths.d.ts +23 -0
  884. package/src/_esm/utils/algorithms/pixelCornersToRoundPaths.js +270 -0
  885. package/src/_esm/utils/algorithms/pixelCornersToRoundPaths.js.map +1 -0
  886. package/src/_esm/utils/algorithms/splitPolygonToNonIntersecting.d.ts +28 -0
  887. package/src/_esm/utils/algorithms/splitPolygonToNonIntersecting.js +102 -0
  888. package/src/_esm/utils/algorithms/splitPolygonToNonIntersecting.js.map +1 -0
  889. package/src/_esm/utils/algorithms/sutherlandHodgman.d.ts +16 -0
  890. package/src/_esm/utils/algorithms/sutherlandHodgman.js +76 -0
  891. package/src/_esm/utils/algorithms/sutherlandHodgman.js.map +1 -0
  892. package/src/_esm/utils/cloneVertexArray.d.ts +13 -0
  893. package/src/_esm/utils/cloneVertexArray.js +23 -0
  894. package/src/_esm/utils/cloneVertexArray.js.map +1 -0
  895. package/src/_esm/utils/createRandomizedPolygon.d.ts +14 -0
  896. package/src/_esm/utils/createRandomizedPolygon.js +32 -0
  897. package/src/_esm/utils/createRandomizedPolygon.js.map +1 -0
  898. package/src/_esm/utils/datastructures/CircularIntervalSet.d.ts +83 -0
  899. package/src/_esm/utils/datastructures/CircularIntervalSet.js +162 -0
  900. package/src/_esm/utils/datastructures/CircularIntervalSet.js.map +1 -0
  901. package/src/_esm/utils/datastructures/Color.d.ts +391 -0
  902. package/src/_esm/utils/datastructures/Color.js +1067 -0
  903. package/src/_esm/utils/datastructures/Color.js.map +1 -0
  904. package/src/_esm/utils/datastructures/ColorGradient.d.ts +81 -0
  905. package/src/_esm/utils/datastructures/ColorGradient.js +175 -0
  906. package/src/_esm/utils/datastructures/ColorGradient.js.map +1 -0
  907. package/src/_esm/utils/datastructures/DataGrid2d.d.ts +53 -0
  908. package/src/_esm/utils/datastructures/DataGrid2d.js +20 -0
  909. package/src/_esm/utils/datastructures/DataGrid2d.js.map +1 -0
  910. package/src/_esm/utils/datastructures/DataGrid2dArrayMatrix.d.ts +88 -0
  911. package/src/_esm/utils/datastructures/DataGrid2dArrayMatrix.js +154 -0
  912. package/src/_esm/utils/datastructures/DataGrid2dArrayMatrix.js.map +1 -0
  913. package/src/_esm/utils/datastructures/DataGrid2dListAdapter.d.ts +59 -0
  914. package/src/_esm/utils/datastructures/DataGrid2dListAdapter.js +83 -0
  915. package/src/_esm/utils/datastructures/DataGrid2dListAdapter.js.map +1 -0
  916. package/src/_esm/utils/datastructures/GenericPath.d.ts +86 -0
  917. package/src/_esm/utils/datastructures/GenericPath.js +121 -0
  918. package/src/_esm/utils/datastructures/GenericPath.js.map +1 -0
  919. package/src/_esm/utils/datastructures/GeometryMesh.d.ts +49 -0
  920. package/src/_esm/utils/datastructures/GeometryMesh.js +57 -0
  921. package/src/_esm/utils/datastructures/GeometryMesh.js.map +1 -0
  922. package/src/_esm/utils/datastructures/Girih.d.ts +181 -0
  923. package/src/_esm/utils/datastructures/Girih.js +265 -0
  924. package/src/_esm/utils/datastructures/Girih.js.map +1 -0
  925. package/src/_esm/utils/datastructures/GirihBowtie.d.ts +37 -0
  926. package/src/_esm/utils/datastructures/GirihBowtie.js +134 -0
  927. package/src/_esm/utils/datastructures/GirihBowtie.js.map +1 -0
  928. package/src/_esm/utils/datastructures/GirihDecagon.d.ts +52 -0
  929. package/src/_esm/utils/datastructures/GirihDecagon.js +114 -0
  930. package/src/_esm/utils/datastructures/GirihDecagon.js.map +1 -0
  931. package/src/_esm/utils/datastructures/GirihHexagon.d.ts +39 -0
  932. package/src/_esm/utils/datastructures/GirihHexagon.js +182 -0
  933. package/src/_esm/utils/datastructures/GirihHexagon.js.map +1 -0
  934. package/src/_esm/utils/datastructures/GirihPenroseRhombus.d.ts +46 -0
  935. package/src/_esm/utils/datastructures/GirihPenroseRhombus.js +171 -0
  936. package/src/_esm/utils/datastructures/GirihPenroseRhombus.js.map +1 -0
  937. package/src/_esm/utils/datastructures/GirihPentagon.d.ts +37 -0
  938. package/src/_esm/utils/datastructures/GirihPentagon.js +91 -0
  939. package/src/_esm/utils/datastructures/GirihPentagon.js.map +1 -0
  940. package/src/_esm/utils/datastructures/GirihRhombus.d.ts +38 -0
  941. package/src/_esm/utils/datastructures/GirihRhombus.js +137 -0
  942. package/src/_esm/utils/datastructures/GirihRhombus.js.map +1 -0
  943. package/src/_esm/utils/datastructures/GirihTile.d.ts +283 -0
  944. package/src/_esm/utils/datastructures/GirihTile.js +290 -0
  945. package/src/_esm/utils/datastructures/GirihTile.js.map +1 -0
  946. package/src/_esm/utils/datastructures/Matrix4x4.d.ts +244 -0
  947. package/src/_esm/utils/datastructures/Matrix4x4.js +250 -0
  948. package/src/_esm/utils/datastructures/Matrix4x4.js.map +1 -0
  949. package/src/_esm/utils/datastructures/VoronoiCell.d.ts +122 -0
  950. package/src/_esm/utils/datastructures/VoronoiCell.js +182 -0
  951. package/src/_esm/utils/datastructures/VoronoiCell.js.map +1 -0
  952. package/src/_esm/utils/datastructures/interfaces.d.ts +13 -0
  953. package/src/_esm/utils/datastructures/interfaces.js +10 -0
  954. package/src/_esm/utils/datastructures/interfaces.js.map +1 -0
  955. package/src/_esm/utils/detectDarkMode.d.ts +10 -0
  956. package/src/_esm/utils/detectDarkMode.js +41 -0
  957. package/src/_esm/utils/detectDarkMode.js.map +1 -0
  958. package/src/_esm/utils/dom/components/ColorGradientPicker.d.ts +246 -0
  959. package/src/_esm/utils/dom/components/ColorGradientPicker.js +780 -0
  960. package/src/_esm/utils/dom/components/ColorGradientPicker.js.map +1 -0
  961. package/src/_esm/utils/dom/components/ColorGradientPickerJSX.d.ts +129 -0
  962. package/src/_esm/utils/dom/components/ColorGradientPickerJSX.js +582 -0
  963. package/src/_esm/utils/dom/components/ColorGradientPickerJSX.js.map +1 -0
  964. package/src/_esm/utils/dom/components/ColorGradientSelector.d.ts +118 -0
  965. package/src/_esm/utils/dom/components/ColorGradientSelector.js +376 -0
  966. package/src/_esm/utils/dom/components/ColorGradientSelector.js.map +1 -0
  967. package/src/_esm/utils/dom/components/Test.d.ts +7 -0
  968. package/src/_esm/utils/dom/components/Test.js +63 -0
  969. package/src/_esm/utils/dom/components/Test.js.map +1 -0
  970. package/src/_esm/utils/dom/getAvailableContainerSpace.d.ts +2 -0
  971. package/src/_esm/utils/dom/getAvailableContainerSpace.js +29 -0
  972. package/src/_esm/utils/dom/getAvailableContainerSpace.js.map +1 -0
  973. package/src/_esm/utils/dom/getFProp.d.ts +5 -0
  974. package/src/_esm/utils/dom/getFProp.js +12 -0
  975. package/src/_esm/utils/dom/getFProp.js.map +1 -0
  976. package/src/_esm/utils/dom/guiSizeToggler.d.ts +18 -0
  977. package/src/_esm/utils/dom/guiSizeToggler.js +44 -0
  978. package/src/_esm/utils/dom/guiSizeToggler.js.map +1 -0
  979. package/src/_esm/utils/findInVertexArray.d.ts +19 -0
  980. package/src/_esm/utils/findInVertexArray.js +29 -0
  981. package/src/_esm/utils/findInVertexArray.js.map +1 -0
  982. package/src/_esm/utils/getFProp.d.ts +5 -0
  983. package/src/_esm/utils/getFProp.js +8 -0
  984. package/src/_esm/utils/getFProp.js.map +1 -0
  985. package/src/_esm/utils/gup.d.ts +14 -0
  986. package/src/_esm/utils/gup.js +31 -0
  987. package/src/_esm/utils/gup.js.map +1 -0
  988. package/src/_esm/utils/helpers/BezierPathInteractionHelper.d.ts +272 -0
  989. package/src/_esm/utils/helpers/BezierPathInteractionHelper.js +655 -0
  990. package/src/_esm/utils/helpers/BezierPathInteractionHelper.js.map +1 -0
  991. package/src/_esm/utils/helpers/CircleHelper.d.ts +73 -0
  992. package/src/_esm/utils/helpers/CircleHelper.js +92 -0
  993. package/src/_esm/utils/helpers/CircleHelper.js.map +1 -0
  994. package/src/_esm/utils/helpers/CircleSectorHelper.d.ts +90 -0
  995. package/src/_esm/utils/helpers/CircleSectorHelper.js +113 -0
  996. package/src/_esm/utils/helpers/CircleSectorHelper.js.map +1 -0
  997. package/src/_esm/utils/helpers/TriangleHelper.d.ts +57 -0
  998. package/src/_esm/utils/helpers/TriangleHelper.js +82 -0
  999. package/src/_esm/utils/helpers/TriangleHelper.js.map +1 -0
  1000. package/src/_esm/utils/helpers/VEllipseHelper.d.ts +32 -0
  1001. package/src/_esm/utils/helpers/VEllipseHelper.js +87 -0
  1002. package/src/_esm/utils/helpers/VEllipseHelper.js.map +1 -0
  1003. package/src/_esm/utils/helpers/VEllipseSectorHelper.d.ts +52 -0
  1004. package/src/_esm/utils/helpers/VEllipseSectorHelper.js +134 -0
  1005. package/src/_esm/utils/helpers/VEllipseSectorHelper.js.map +1 -0
  1006. package/src/_esm/utils/io/DndFileHandler.d.ts +63 -0
  1007. package/src/_esm/utils/io/DndFileHandler.js +106 -0
  1008. package/src/_esm/utils/io/DndFileHandler.js.map +1 -0
  1009. package/src/_esm/utils/io/FileDrop.d.ts +110 -0
  1010. package/src/_esm/utils/io/FileDrop.js +175 -0
  1011. package/src/_esm/utils/io/FileDrop.js.map +1 -0
  1012. package/src/_esm/utils/parsers/LinearColorGradientParser.d.ts +78 -0
  1013. package/src/_esm/utils/parsers/LinearColorGradientParser.js +223 -0
  1014. package/src/_esm/utils/parsers/LinearColorGradientParser.js.map +1 -0
  1015. package/src/_esm/utils/parsers/OBJParser.d.ts +25 -0
  1016. package/src/_esm/utils/parsers/OBJParser.js +78 -0
  1017. package/src/_esm/utils/parsers/OBJParser.js.map +1 -0
  1018. package/src/_esm/utils/parsers/STLParser.d.ts +61 -0
  1019. package/src/_esm/utils/parsers/STLParser.js +179 -0
  1020. package/src/_esm/utils/parsers/STLParser.js.map +1 -0
  1021. package/src/_esm/utils/parsers/svg/parseSVGPathData.d.ts +27 -0
  1022. package/src/_esm/utils/parsers/svg/parseSVGPathData.js +486 -0
  1023. package/src/_esm/utils/parsers/svg/parseSVGPathData.js.map +1 -0
  1024. package/src/_esm/utils/parsers/svg/splitSVGPathData.d.ts +20 -0
  1025. package/src/_esm/utils/parsers/svg/splitSVGPathData.js +53 -0
  1026. package/src/_esm/utils/parsers/svg/splitSVGPathData.js.map +1 -0
  1027. package/src/_esm/utils/parsers/svg/types.d.ts +63 -0
  1028. package/src/_esm/utils/parsers/svg/types.js +17 -0
  1029. package/src/_esm/utils/parsers/svg/types.js.map +1 -0
  1030. package/src/cjs/PlotBoilerplate.d.ts +11 -1
  1031. package/src/cjs/PlotBoilerplate.js +23 -7
  1032. package/src/cjs/PlotBoilerplate.js.map +1 -1
  1033. package/src/cjs/VertexListeners.d.ts +2 -1
  1034. package/src/cjs/VertexListeners.js +5 -1
  1035. package/src/cjs/VertexListeners.js.map +1 -1
  1036. package/src/cjs/draw.d.ts +18 -2
  1037. package/src/cjs/draw.js +21 -2
  1038. package/src/cjs/draw.js.map +1 -1
  1039. package/src/cjs/drawgl.d.ts +18 -3
  1040. package/src/cjs/drawgl.js +19 -2
  1041. package/src/cjs/drawgl.js.map +1 -1
  1042. package/src/cjs/drawutilssvg.d.ts +19 -1
  1043. package/src/cjs/drawutilssvg.js +28 -5
  1044. package/src/cjs/drawutilssvg.js.map +1 -1
  1045. package/src/cjs/index.d.ts +75 -0
  1046. package/src/cjs/index.js +84 -0
  1047. package/src/cjs/index.js.map +1 -1
  1048. package/src/cjs/interfaces/DrawLib.d.ts +18 -1
  1049. package/src/cjs/interfaces/DrawLib.js +2 -0
  1050. package/src/cjs/interfaces/DrawLib.js.map +1 -1
  1051. package/src/cjs/utils/Params.d.ts +3 -2
  1052. package/src/cjs/utils/Params.js +11 -3
  1053. package/src/cjs/utils/Params.js.map +1 -1
  1054. package/src/cjs/utils/WebColors.d.ts +2 -1
  1055. package/src/cjs/utils/WebColors.js +15 -2
  1056. package/src/cjs/utils/WebColors.js.map +1 -1
  1057. package/src/cjs/utils/WebColorsContrast.d.ts +1 -1
  1058. package/src/cjs/utils/algorithms/HobbyPath.js +13 -16
  1059. package/src/cjs/utils/algorithms/HobbyPath.js.map +1 -1
  1060. package/src/cjs/utils/helpers/BezierResizeHelper.d.ts +144 -0
  1061. package/src/cjs/utils/helpers/BezierResizeHelper.js +319 -0
  1062. package/src/cjs/utils/helpers/BezierResizeHelper.js.map +1 -0
  1063. package/src/esm/PlotBoilerplate.d.ts +11 -1
  1064. package/src/esm/PlotBoilerplate.js +23 -7
  1065. package/src/esm/PlotBoilerplate.js.map +1 -1
  1066. package/src/esm/VertexListeners.d.ts +2 -1
  1067. package/src/esm/VertexListeners.js +5 -1
  1068. package/src/esm/VertexListeners.js.map +1 -1
  1069. package/src/esm/draw.d.ts +18 -2
  1070. package/src/esm/draw.js +21 -2
  1071. package/src/esm/draw.js.map +1 -1
  1072. package/src/esm/drawgl.d.ts +18 -3
  1073. package/src/esm/drawgl.js +19 -2
  1074. package/src/esm/drawgl.js.map +1 -1
  1075. package/src/esm/drawutilssvg.d.ts +19 -1
  1076. package/src/esm/drawutilssvg.js +28 -5
  1077. package/src/esm/drawutilssvg.js.map +1 -1
  1078. package/src/esm/index.d.ts +75 -0
  1079. package/src/esm/index.js +84 -0
  1080. package/src/esm/index.js.map +1 -1
  1081. package/src/esm/interfaces/DrawLib.d.ts +18 -1
  1082. package/src/esm/interfaces/DrawLib.js +2 -0
  1083. package/src/esm/interfaces/DrawLib.js.map +1 -1
  1084. package/src/esm/utils/Params.d.ts +3 -2
  1085. package/src/esm/utils/Params.js +11 -3
  1086. package/src/esm/utils/Params.js.map +1 -1
  1087. package/src/esm/utils/WebColors.d.ts +2 -1
  1088. package/src/esm/utils/WebColors.js +15 -2
  1089. package/src/esm/utils/WebColors.js.map +1 -1
  1090. package/src/esm/utils/WebColorsContrast.d.ts +1 -1
  1091. package/src/esm/utils/algorithms/HobbyPath.js +13 -16
  1092. package/src/esm/utils/algorithms/HobbyPath.js.map +1 -1
  1093. package/src/esm/utils/helpers/BezierResizeHelper.d.ts +144 -0
  1094. package/src/esm/utils/helpers/BezierResizeHelper.js +314 -0
  1095. package/src/esm/utils/helpers/BezierResizeHelper.js.map +1 -0
  1096. package/src/ts/PlotBoilerplate.ts +37 -11
  1097. package/src/ts/VertexListeners.ts +5 -1
  1098. package/src/ts/draw.ts +32 -2
  1099. package/src/ts/drawgl.ts +38 -3
  1100. package/src/ts/drawutilssvg.ts +33 -6
  1101. package/src/ts/index.ts +94 -0
  1102. package/src/ts/interfaces/DrawLib.ts +19 -1
  1103. package/src/ts/utils/Params.ts +11 -3
  1104. package/src/ts/utils/WebColors.ts +15 -2
  1105. package/src/ts/utils/algorithms/HobbyPath.ts +248 -272
  1106. package/src/ts/utils/helpers/BezierResizeHelper.ts +390 -0
  1107. /package/src/{cjs → _cjs}/utils/_gup.js_ +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});class t{constructor(){for(var e in this.draggable=!0,this.selectable=!0,this.isSelected=!1,this.visible=!0,t.model)this[e]=t.model[e]}}t.model={draggable:!0,selectable:!0,isSelected:!1,visible:!0};class e{static next(){return""+e.current++}}e.current=0;class s{constructor(t){this.click=[],this.drag=[],this.dragStart=[],this.dragEnd=[],this.vertex=t}addClickListener(t){return s._addListener(this.click,t),this}removeClickListener(t){return this.click=s._removeListener(this.click,t),this}addDragListener(t){return s._addListener(this.drag,t),this}removeDragListener(t){return this.drag=s._removeListener(this.drag,t),this}addDragStartListener(t){return s._addListener(this.dragStart,t),this}removeDragStartListener(t){return this.dragStart=s._removeListener(this.dragStart,t),this}addDragEndListener(t){return s._addListener(this.dragEnd,t),this}removeDragEndListener(t){return this.dragEnd=s._removeListener(this.dragEnd,t),this}fireClickEvent(t){s._fireEvent(this,this.click,t)}fireDragEvent(t){s._fireEvent(this,this.drag,t)}fireDragStartEvent(t){s._fireEvent(this,this.dragStart,t)}fireDragEndEvent(t){s._fireEvent(this,this.dragEnd,t)}removeAllListeners(){this.click=[],this.drag=[],this.dragStart=[],this.dragEnd=[]}static _fireEvent(t,e,s){const i=s;for(var r in void 0===i.params?i.params={vertex:t.vertex}:i.params.vertex=t.vertex,e)e[r](i)}static _addListener(t,e){for(var s in t)if(t[s]==e)return!1;return t.push(e),!0}static _removeListener(t,e){for(var s=0;s<t.length;s++)if(t[s]==e)return t.splice(s,1);return t}}class i{constructor(t,s){this.className="Circle",this.uid=e.next(),this.center=t,this.radius=s}move(t){return this.center.add(t),this}containsPoint(t){return this.center.distance(t)<this.radius}containsCircle(t){return this.center.distance(t.center)+t.radius<this.radius}lineDistance(t){return t.getClosestPoint(this.center).distance(this.center)-this.radius}vertAt(t){return i.circleUtils.vertAt(t,this.radius).add(this.center)}tangentAt(t){const e=i.circleUtils.vertAt(t,this.radius);return new o(e,new a(0,0)).add(this.center).perp()}getBounds(){return new u(this.center.clone().subXY(Math.abs(this.radius),Math.abs(this.radius)),this.center.clone().addXY(Math.abs(this.radius),Math.abs(this.radius)))}circleIntersection(t){if(this.center.distance(t.center)>this.radius+t.radius)return null;if(this.center.distance(t.center)<Math.abs(this.radius-t.radius))return null;var e=this.center,s=t.center,i=e.distance(s),r=(this.radius*this.radius-t.radius*t.radius+i*i)/(2*i),n=Math.sqrt(this.radius*this.radius-r*r),h=s.clone().scale(r/i,e),o=h.x+n*(s.y-e.y)/i,c=h.y-n*(s.x-e.x)/i,u=h.x-n*(s.y-e.y)/i,d=h.y+n*(s.x-e.x)/i;return new l(new a(o,c),new a(u,d))}lineIntersection(t,e){const s=new a,i=new a,r=new a(t).sub(this.center),n=new a(e).sub(this.center),h=r.difference(n);0===Math.abs(h.y)&&(h.y=1e-6);const o=r.distance(n),c=r.x*n.y-r.y*n.x,u=o*o;if(this.radius*this.radius*u-c*c<0)return null;const d=this.radius*this.radius*o*o-c*c,g=Math.sqrt(d);return s.x=(c*h.y+Math.sign(h.y)*h.x*g)/u,i.x=(c*h.y-Math.sign(h.y)*h.x*g)/u,s.y=(-c*h.x+Math.abs(h.y)*g)/u,i.y=(-c*h.x-Math.abs(h.y)*g)/u,new l(s.add(this.center),i.add(this.center))}lineIntersections(t,e=!1){const s=this.lineIntersection(t.a,t.b);return s?e?[s.a,s.b].filter(e=>t.hasPoint(e,!0)):[s.a,s.b]:[]}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map(t=>{const e=new l(this.center,t).angle();return this.tangentAt(e)})}closestPoint(t){const e=this.lineIntersection(this.center,t);return e?e.a.distance(t)<e.b.distance(t)?e.a:e.b:new a}destroy(){this.center.destroy(),this.isDestroyed=!0}}i.circleUtils={vertAt:(t,e)=>new a(Math.cos(t)*e,Math.sin(t)*e)};class r{constructor(t,s,i){this.className="Triangle",this.uid=e.next(),this.a=t,this.b=s,this.c=i,this.calcCircumcircle()}static fromArray(t){if(t.length<3)throw`Cannot create triangle from array with less than three vertices (${t.length})`;return new r(t[0],t[1],t[2])}getArea(){return Math.abs(r.utils.signedArea(this.a.x,this.a.y,this.b.x,this.b.y,this.c.x,this.c.y))}getCentroid(){return new a((this.a.x+this.b.x+this.c.x)/3,(this.a.y+this.b.y+this.c.y)/3)}scaleToCentroid(t){let e=this.getCentroid();return this.a.scale(t,e),this.b.scale(t,e),this.c.scale(t,e),this}getBounds(){return this.bounds()}move(t){return this.a.add(t),this.b.add(t),this.c.add(t),this}getCircumcircle(){return this.calcCircumcircle(),new i(this.center.clone(),this.radius)}isAdjacent(t){var e=this.a.equals(t.a)||this.a.equals(t.b)||this.a.equals(t.c),s=this.b.equals(t.a)||this.b.equals(t.b)||this.b.equals(t.c),i=this.c.equals(t.a)||this.c.equals(t.b)||this.c.equals(t.c);return e&&s||e&&i||s&&i}getThirdVertex(t,e){return this.a.equals(t)&&this.b.equals(e)||this.a.equals(e)&&this.b.equals(t)?this.c:this.b.equals(t)&&this.c.equals(e)||this.b.equals(e)&&this.c.equals(t)?this.a:this.b}calcCircumcircle(){const t=this.b.x-this.a.x,e=this.b.y-this.a.y,s=this.c.x-this.a.x,i=this.c.y-this.a.y,n=t*(this.a.x+this.b.x)+e*(this.a.y+this.b.y),h=s*(this.a.x+this.c.x)+i*(this.a.y+this.c.y),o=2*(t*(this.c.y-this.b.y)-e*(this.c.x-this.b.x));let l,c;if(Math.abs(o)<r.EPSILON){const t=this.bounds();this.center=new a((t.min.x+t.max.x)/2,(t.min.y+t.max.y)/2),l=this.center.x-t.min.x,c=this.center.y-t.min.y}else{const r=(i*n-e*h)/o,u=(t*h-s*n)/o;this.center=new a(r,u),l=this.center.x-this.a.x,c=this.center.y-this.a.y}this.radius_squared=l*l+c*c,this.radius=Math.sqrt(this.radius_squared)}inCircumcircle(t){const e=this.center.x-t.x,s=this.center.y-t.y;return e*e+s*s<=this.radius_squared}bounds(){return new u(new a(r.utils.min3(this.a.x,this.b.x,this.c.x),r.utils.min3(this.a.y,this.b.y,this.c.y)),new a(r.utils.max3(this.a.x,this.b.x,this.c.x),r.utils.max3(this.a.y,this.b.y,this.c.y)))}lineIntersections(t,e=!1){return c.utils.locateLineIntersecion(t,[this.a,this.b,this.c],!1,e).map(t=>t.intersection)}lineIntersectionTangents(t,e=!1){return c.utils.locateLineIntersecion(t,[this.a,this.b,this.c],!1,e).map(t=>{const e=this.getEdgeAt(t.edgeIndex);return new o(e.a.clone(),e.b.clone()).moveTo(t.intersection)})}getEdgeAt(t){var e=t%3;return 0===e?new l(this.a,this.b):1===e?new l(this.b,this.c):new l(this.c,this.a)}toPolygon(){return new c([this.a,this.b,this.c])}determinant(){return r.utils.determinant(this.a,this.b,this.c)}containsPoint(t){return r.utils.pointIsInTriangle(t.x,t.y,this.a.x,this.a.y,this.b.x,this.b.y,this.c.x,this.c.y)}getIncircularTriangle(){const t=new l(this.a,this.b),e=new l(this.b,this.c),s=new l(this.c,this.a),i=n.nsectAngle(this.b,this.a,this.c,2)[0],a=n.nsectAngle(this.c,this.b,this.a,2)[0],h=i.intersection(a),o=t.getClosestPoint(h),c=e.getClosestPoint(h),u=s.getClosestPoint(h);return new r(o,c,u)}getIncircle(){return this.getIncircularTriangle().getCircumcircle()}getIncenter(){return this.center&&this.radius||this.calcCircumcircle(),this.center.clone()}toString(){return"{ a : "+this.a.toString()+", b : "+this.b.toString()+", c : "+this.c.toString()+"}"}destroy(){this.a.destroy(),this.b.destroy(),this.c.destroy(),this.isDestroyed=!0}}r.EPSILON=1e-6,r.utils={max3:(t,e,s)=>t>=e&&t>=s?t:e>=t&&e>=s?e:s,min3:(t,e,s)=>t<=e&&t<=s?t:e<=t&&e<=s?e:s,signedArea:(t,e,s,i,r,n)=>.5*(-i*r+e*(-s+r)+t*(i-n)+s*n),pointIsInTriangle(t,e,s,i,n,a,h,o){var l=r.utils.signedArea(s,i,n,a,h,o),c=1/(2*l)*(i*h-s*o+(o-i)*t+(s-h)*e),u=1/(2*l)*(s*a-i*n+(i-a)*t+(n-s)*e);return c>0&&u>0&&1-c-u>0},determinant:(t,e,s)=>(e.y-t.y)*(s.x-e.x)-(s.y-e.y)*(e.x-t.x)};const n={mapAngleTo2PI(t){const e=Math.asin(Math.sin(t));return Math.cos(t)<0?Math.PI-e:e<0?e+2*Math.PI:e},dist4:(t,e,s,i)=>Math.sqrt(Math.pow(s-t,2)+Math.pow(e-i,2)),dotProduct:(t,e)=>t.x*e.x+t.y*e.y,nsectAngle(t,e,s,i){const n=new r(t,e,s),a=new l(t,e),h=new l(t,s);var o=a.angle(h);const c=n.determinant()>0;o<0&&(o=2*Math.PI+o),c||(o=-1*(2*Math.PI-o));const u=Math.max(a.length(),h.length())/a.length();for(var d=[],g=1;g<i;g++)d.push(new l(t,e.clone().rotate(o/i*-g,t)).scale(u));return d},wrapMax:(t,e)=>(e+t%e)%e,wrapMinMax:(t,e,s)=>e+n.wrapMax(t-e,s-e)};class a{constructor(i,r){if(this.className="Vertex",this.uid=e.next(),void 0===i)this.x=0,this.y=0;else if("number"==typeof i&&"number"==typeof r)this.x=i,this.y=r;else{const t=i;"number"==typeof t.x&&"number"==typeof t.y?(this.x=t.x,this.y=t.y):(this.x="number"==typeof i?i:void 0===i?0:NaN,this.y="number"==typeof r?r:void 0===r?0:NaN)}this.attr=new t,this.listeners=new s(this)}set(t,e){if("number"==typeof t&&"number"==typeof e)this.x=t,this.y=e;else{const s=t;"number"==typeof s.x&&"number"==typeof s.y?(this.x=s.x,this.y=s.y):(this.x="number"==typeof t?t:void 0===t?0:NaN,this.y="number"==typeof e?e:void 0===e?0:NaN)}return this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}invX(){return this.x=-this.x,this}invY(){return this.y=-this.y,this}add(t,e){if("number"==typeof t&&"number"==typeof e)this.x+=t,this.y+=e;else{const s=t;if("number"==typeof s.x&&"number"==typeof s.y)this.x+=s.x,this.y+=s.y;else{if("number"!=typeof t)throw`Cannot add ${typeof t} to numeric x component!`;if(this.x+=t,"number"!=typeof e)throw`Cannot add ${typeof e} to numeric y component!`;this.y+=e}}return this}move(t){return this.add(t)}addXY(t,e){return this.x+=t,this.y+=e,this}addX(t){return this.x+=t,this}addY(t){return this.y+=t,this}sub(t,e){if("number"==typeof t&&"number"==typeof e)this.x-=t,this.y-=e;else{const s=t;if("number"==typeof s.x&&"number"==typeof s.y)this.x-=s.x,this.y-=s.y;else{if("number"!=typeof t)throw`Cannot add ${typeof t} to numeric x component!`;if(this.x-=t,"number"!=typeof e)throw`Cannot add ${typeof e} to numeric y component!`;this.y-=e}}return this}subXY(t,e){return this.x-=t,this.y-=e,this}subX(t){return this.x-=t,this}subY(t){return this.y-=t,this}equals(t){var e=Math.abs(this.x-t.x)<a.EPSILON,s=Math.abs(this.y-t.y)<a.EPSILON;return e&&s}clone(){return new a(this.x,this.y)}distance(t){return n.dist4(this.x,this.y,t.x,t.y)}angle(t){const e=void 0===t?Math.PI/2-Math.atan2(this.x,this.y):Math.PI/2-Math.atan2(t.x-this.x,t.y-this.y);return e<0?2*Math.PI+e:e}difference(t){return new a(t.x-this.x,t.y-this.y)}scale(t,e){return this.scaleXY({x:t,y:t},e)}lerp(t,e){var s=this.difference(t);return this.x+=s.x*e,this.y+=s.y*e,this}lerpAbs(t,e){var s=this.distance(t),i=this.difference(t),r=i.x/s,n=i.y/s;return this.x+=r*e,this.y+=n*e,this}scaleXY(t,e){return e&&void 0!==e||(e={x:0,y:0}),this.x=e.x+(this.x-e.x)*t.x,this.y=e.y+(this.y-e.y)*t.y,this}rotate(t,e){e&&void 0!==e||(e={x:0,y:0}),this.sub(e),t+=Math.atan2(this.y,this.x);let s=this.distance(a.ZERO);return this.x=s*Math.cos(t),this.y=s*Math.sin(t),this.add(e),this}multiplyScalar(t){return this.x*=t,this.y*=t,this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}inv(){return this.x=-this.x,this.y=-this.y,this}abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this}getBounds(){return u.computeFromVertices([this])}toString(t){return void 0===t?"("+this.x+","+this.y+")":"("+this.x.toFixed(t)+","+this.y.toFixed(t)+")"}destroy(){this.listeners.removeAllListeners(),this.isDestroyed=!0}static randomVertex(t){return new a(t.min.x+Math.random()*(t.max.x-t.min.x),t.min.y+Math.random()*(t.max.y-t.min.y))}}a.ZERO=new a(0,0),a.EPSILON=1e-6,a.utils={buildArrowHead:(t,e,s,i,r)=>{console.warn("[DEPRECATION] Vertex.utils.buildArrowHead is deprecated. Please use Vector.utils.buildArrowHead instead.");var n=Math.atan2((e.y-t.y)*r,(e.x-t.x)*i),h=[];return h.push(new a(e.x*i-s*Math.cos(n),e.y*r-s*Math.sin(n))),h.push(new a(e.x*i-1.35*s*Math.cos(n-Math.PI/8),e.y*r-1.35*s*Math.sin(n-Math.PI/8))),h.push(new a(e.x*i,e.y*r)),h.push(new a(e.x*i-1.35*s*Math.cos(n+Math.PI/8),e.y*r-1.35*s*Math.sin(n+Math.PI/8))),h},arrayToJSON:(t,e)=>JSON.stringify(t.map(function(t){return void 0===typeof e?{x:t.x,y:t.y}:{x:Number(t.x.toFixed(e)),y:Number(t.y.toFixed(e))}}))};class h{constructor(t,s,i){this.uid=e.next(),this.a=t,this.b=s,this.factory=i}length(){return Math.sqrt(Math.pow(this.b.x-this.a.x,2)+Math.pow(this.b.y-this.a.y,2))}setLength(t){return this.scale(t/this.length())}sub(t){return this.a.sub(t),this.b.sub(t),this}add(t){return this.a.add(t),this.b.add(t),this}revert(){const t=this.a;return this.a=this.b,this.b=t,this}normalize(){return this.b.set(this.a.x+(this.b.x-this.a.x)/this.length(),this.a.y+(this.b.y-this.a.y)/this.length()),this}scale(t){return this.b.set(this.a.x+(this.b.x-this.a.x)*t,this.a.y+(this.b.y-this.a.y)*t),this}moveTo(t){let e=this.a.difference(t);return this.a.add(e),this.b.add(e),this}move(t){return this.a.add(t),this.b.add(t),this}angle(t){null!=t&&void 0!==t||(t=this.factory(new a(0,0),new a(100,0)));const e=this.b.clone().sub(this.a),s=t.b.clone().sub(t.a);return Math.atan2(s.x,s.y)-Math.atan2(e.x,e.y)}vertAt(t){return new a(this.a.x+(this.b.x-this.a.x)*t,this.a.y+(this.b.y-this.a.y)*t)}denominator(t){return(t.b.y-t.a.y)*(this.b.x-this.a.x)-(t.b.x-t.a.x)*(this.b.y-this.a.y)}colinear(t,e){return Math.abs(this.denominator(t))<(void 0===e?a.EPSILON:e)}getClosestT(t){var e=h.vtutils.dist2(this.a,this.b);return 0===e?0:((t.x-this.a.x)*(this.b.x-this.a.x)+(t.y-this.a.y)*(this.b.y-this.a.y))/e}hasPoint(t,e,s){const i=this.getClosestT(t),r=Math.sqrt(h.vtutils.dist2(t,this.vertAt(i)));return void 0!==e&&e?r<(null!=s?s:a.EPSILON)&&i>=0&&i<=1:r<(null!=s?s:a.EPSILON)}getClosestPoint(t){var e=this.getClosestT(t);return this.vertAt(e)}pointDistance(t){return Math.sqrt(h.vtutils.dist2(t,this.vertAt(this.getClosestT(t))))}clone(){return this.factory(this.a.clone(),this.b.clone())}toString(){return"{ a : "+this.a.toString()+", b : "+this.b.toString()+" }"}destroy(){this.a.destroy(),this.b.destroy(),this.isDestroyed=!0}}h.vtutils={dist2:(t,e)=>(t.x-e.x)*(t.x-e.x)+(t.y-e.y)*(t.y-e.y)};class o extends h{constructor(t,e){super(t,e,(t,e)=>new o(t,e)),this.className="Vector"}perp(){var t=this.clone();return t.sub(this.a),(t=new o(new a,new a(-t.b.y,t.b.x))).a.add(this.a),t.b.add(this.a),t}inverse(){var t=this.a;return this.a=this.b,this.b=t,this}inv(){return this.b.x=this.a.x-(this.b.x-this.a.x),this.b.y=this.a.y-(this.b.y-this.a.y),this}intersection(t){var e=this.denominator(t);if(0==e)return null;var s=this.a.y-t.a.y,i=this.a.x-t.a.x,r=(t.b.x-t.a.x)*s-(t.b.y-t.a.y)*i,n=(this.b.x-this.a.x)*s-(this.b.y-this.a.y)*i;return s=r/e,i=n/e,new a(this.a.x+s*(this.b.x-this.a.x),this.a.y+s*(this.b.y-this.a.y))}getOrthogonal(){const t=this.a.clone(),e=this.b.clone().sub(this.a),s=e.x;return e.x=-e.y,e.y=s,new o(t,e.add(this.a))}rotate(t){return this.b.rotate(t,this.a),this}}o.utils={buildArrowHead:(t,e,s,i,r)=>{const n=Math.atan2((e.y-t.y)*r,(e.x-t.x)*i),h=[];return h.push(new a(e.x*i-s*Math.cos(n),e.y*r-s*Math.sin(n))),h.push(new a(e.x*i-1.35*s*Math.cos(n-Math.PI/8),e.y*r-1.35*s*Math.sin(n-Math.PI/8))),h.push(new a(e.x*i,e.y*r)),h.push(new a(e.x*i-1.35*s*Math.cos(n+Math.PI/8),e.y*r-1.35*s*Math.sin(n+Math.PI/8))),h}};class l extends h{constructor(t,e){super(t,e,(t,e)=>new l(t,e)),this.className="Line"}intersection(t){const e=this.denominator(t);if(0==e)return null;let s=this.a.y-t.a.y,i=this.a.x-t.a.x;const r=(t.b.x-t.a.x)*s-(t.b.y-t.a.y)*i,n=(this.b.x-this.a.x)*s-(this.b.y-this.a.y)*i;s=r/e,i=n/e;const h=this.a.x+s*(this.b.x-this.a.x),o=this.a.y+s*(this.b.y-this.a.y);return isNaN(s)||isNaN(h)||isNaN(o)?null:new a(h,o)}getBounds(){return u.computeFromVertices([this.a,this.b])}getStartPoint(){return this.a}getEndPoint(){return this.b}getStartTangent(){return this.b}getEndTangent(){return this.a}reverse(){var t=this.a;return this.a=this.b,this.b=t,this}lineIntersections(t,e=!1){const s=this.intersection(t);return s?!this.hasPoint(s,!0)||e&&!t.hasPoint(s,e)?[]:[s]:[]}lineIntersectionTangents(t,e=!1){const s=this.lineIntersections(t,e);if(0===s.length)return[];const i=s[0];return[new o(this.a.clone(),this.b.clone()).moveTo(i)]}}class c{constructor(t,s){this.className="Polygon",this.uid=e.next(),void 0===t&&(t=[]),this.vertices=t,this.isOpen=s||!1}addVertex(t){this.vertices.push(t)}addVertexAt(t,e){this.vertices.splice(e,0,t)}getEdgeAt(t){return new l(this.getVertexAt(t),this.getVertexAt(t+1))}getEdges(){const t=[];for(var e=0;e+1<this.vertices.length;e++)t.push(this.getEdgeAt(e));return!this.isOpen&&this.vertices.length>0&&t.push(this.getEdgeAt(this.vertices.length-1)),t}getInnerAngleAt(t){const e=this.vertices[t%this.vertices.length],s=this.vertices[(t+this.vertices.length-1)%this.vertices.length].clone(),i=this.vertices[(t+1)%this.vertices.length].clone(),r=this.isAngleAcute(t),h=new a(0,0),o=new a(e.x-s.x,e.y-s.y),l=new a(i.x-e.x,i.y-e.y),c=h.distance(o),u=h.distance(l),d=n.dotProduct(o,l),g=c*u;return r?Math.PI-Math.acos(d/g):Math.PI+Math.acos(d/g)}isAngleAcute(t){const e=this.vertices[(t+this.vertices.length-1)%this.vertices.length].clone(),s=this.vertices[t%this.vertices.length],i=this.vertices[(t+1)%this.vertices.length].clone();return r.utils.determinant(e,s,i)<0}getVertexAt(t){return t<0?this.vertices[this.vertices.length-Math.abs(t)%this.vertices.length]:this.vertices[t%this.vertices.length]}move(t){for(var e in this.vertices)this.vertices[e].add(t);return this}containsVert(t){for(var e=!1,s=0,i=this.vertices.length-1;s<this.vertices.length;i=s++){let r=this.vertices[s].x,n=this.vertices[s].y,a=this.vertices[i].x,h=this.vertices[i].y;n>t.y!=h>t.y&&t.x<(a-r)*(t.y-n)/(h-n)+r&&(e=!e)}return e}containsVerts(t){return t.every(t=>this.containsVert(t))}containsPolygon(t){for(var e=0;e<t.vertices.length;e++)if(!this.containsVert(t.vertices[e]))return!1;const s=new l(new a,new a);for(e=0;e<t.vertices.length;e++)if(s.a.set(t.vertices[e]),s.b.set(t.vertices[(e+1)%t.vertices.length]),this.lineIntersections(s,!0).length>0)return!1;return!0}area(){return c.utils.area(this.vertices)}signedArea(){return c.utils.signedArea(this.vertices)}isClockwise(){return c.utils.isClockwise(this.vertices)}perimeter(){let t=0;for(var e=1;e<this.vertices.length;e++)t+=this.vertices[e-1].distance(this.vertices[e]);return!this.isOpen&&this.vertices.length>1&&(t+=this.vertices[0].distance(this.vertices[this.vertices.length-1])),t}scale(t,e){for(var s in this.vertices)"function"==typeof this.vertices[s].scale?this.vertices[s].scale(t,e):console.log("There seems to be a null vertex!",this.vertices[s]);return this}rotate(t,e){for(var s in this.vertices)this.vertices[s].rotate(t,e);return this}getMeanCenter(){if(0===this.vertices.length)return null;const t=this.vertices[0].clone();for(var e=1;e<this.vertices.length;e++)t.add(this.vertices[e]);return t.x/=this.vertices.length,t.y/=this.vertices.length,t}getCentroid(){if(0===this.vertices.length)return null;const t=new a(0,0),e=this.vertices.length;for(var s=0;s<e;s++){const r=this.vertices[s],n=this.vertices[(s+1)%e];var i=r.x*n.y-n.x*r.y;t.x+=(r.x+n.x)*i,t.y+=(r.y+n.y)*i}const r=this.area();return t.x*=1/(6*r),t.y*=1/(6*r),t}lineIntersections(t,e=!1){return c.utils.locateLineIntersecion(t,this.vertices,this.isOpen,e).map(t=>t.intersection)}lineIntersectionTangents(t,e=!1){return c.utils.locateLineIntersecion(t,this.vertices,this.isOpen,e).map(t=>{const e=this.getEdgeAt(t.edgeIndex);return new o(e.a.clone(),e.b.clone()).moveTo(t.intersection)})}lineIntersectionTangentsIndices(t,e=!1){return c.utils.locateLineIntersecion(t,this.vertices,this.isOpen,e).map(t=>{const e=this.getEdgeAt(t.edgeIndex);return{intersection:new o(e.a.clone(),e.b.clone()).moveTo(t.intersection),edgeIndex:t.edgeIndex}})}closestLineIntersection(t,e=!1){var s=this.closestLineIntersectionIndex(t,e);return s?s.intersection:null}closestLineIntersectionIndex(t,e=!1){const s=this.lineIntersections(t,e);if(s.length<=0)return null;let i=new a(Number.MAX_VALUE,Number.MAX_VALUE),r=-1,n=Number.MAX_VALUE;for(var h=0;h<s.length;h++){const e=s[h],a=e.distance(t.a);a<n&&(n=a,i=e,r=h)}return{edgeIndex:r,intersection:i}}getInterpolationPolygon(t){const e=[];for(var s=0;s<this.vertices.length;s++){const r=this.vertices[s],n=this.vertices[(s+1)%this.vertices.length];if(e.push(r.clone()),!this.isOpen||s+1!==this.vertices.length){const s=1/(t+1);for(var i=1;i<=t;i++)e.push(r.clone().lerp(n,s*i))}}return new c(e,this.isOpen)}getEvenDistributionPolygon(t){if(t<=0)throw new Error("pointCount must be larger than zero; is "+t+".");const e=new c([],this.isOpen);if(0===this.vertices.length)return e;let s=new a(this.vertices[0]);if(e.vertices.push(s),1===this.vertices.length)return e;const i=this.perimeter()/t,r=this.vertices.length;let n=1,h=new a(this.vertices[1]),o=s.distance(h),l=this.isOpen?r:r+1,u=i;for(var d=1;d<t&&n<l;)if(u<o){let t=s.clone().lerpAbs(h,u);e.vertices.push(t),u+=i,d++}else n++,s=h,h=new a(this.vertices[n%r]),u-=o,o=s.distance(h);return e}getBounds(){return u.computeFromVertices(this.vertices)}clone(){return new c(this.vertices.map(t=>t.clone()),this.isOpen)}elimitateColinearEdges(t){const e=void 0===t?1:t,s=this.vertices.slice();let i=0;for(var r=new l(new a,new a),n=new l(new a,new a);i+1<s.length&&s.length>2;){const t=s[i],a=s[(i+1)%s.length];r.a=t,r.b=a,n.a=a;let h=!1,o=i+2;do{let t=s[o%s.length];n.b=t,h=r.colinear(n,e),h&&o++}while(h);o-i>2&&s.splice(i+1,o-i-2),i++}return new c(s,this.isOpen)}toQuadraticBezierData(){if(this.vertices.length<3)return[];var t=[],e=this.vertices[0],s=this.vertices[1],i=new a(e.x+(s.x-e.x)/2,e.y+(s.y-e.y)/2);t.push(i);for(var r=this.isOpen?this.vertices.length:this.vertices.length+1,n=1;n<r;n++){e=this.vertices[n%this.vertices.length],s=this.vertices[(n+1)%this.vertices.length];i=new a(e.x+(s.x-e.x)/2,e.y+(s.y-e.y)/2);t.push(e),t.push(i),e=s}return t}toQuadraticBezierSVGString(){var t=this.toQuadraticBezierData();if(0==t.length)return"";for(var e=["M "+t[0].x+" "+t[0].y],s=1;s<t.length;s+=2)e.push("Q "+t[s].x+" "+t[s].y+", "+t[s+1].x+" "+t[s+1].y);return e.join(" ")}toCubicBezierData(t){if(void 0===t&&(t=1),this.vertices.length<3)return[];var e=[],s=this.vertices[0],i=this.vertices[1],r=new a(s.x+(i.x-s.x)/2,s.y+(i.y-s.y)/2);e.push(r);for(var n=this.isOpen?this.vertices.length-1:this.vertices.length,h=0;h<n;h++){s=this.vertices[h%this.vertices.length],i=this.vertices[(h+1)%this.vertices.length];var o=this.vertices[(h+2)%this.vertices.length],l=new a(s.x+(i.x-s.x)/2,s.y+(i.y-s.y)/2),c=new a(i.x+(o.x-i.x)/2,i.y+(o.y-i.y)/2),u=new a(l.x+(i.x-l.x)*t,l.y+(i.y-l.y)*t),d=new a(c.x+(i.x-c.x)*t,c.y+(i.y-c.y)*t);e.push(u),e.push(d),e.push(c)}return e}toCubicBezierSVGString(t){var e=this.toCubicBezierData(t);if(0==e.length)return"";for(var s=["M "+e[0].x+" "+e[0].y],i=1;i<e.length;i+=3)s.push("C "+e[i].x+" "+e[i].y+", "+e[i+1].x+" "+e[i+1].y+", "+e[i+2].x+" "+e[i+2].y);return s.join(" ")}toCubicBezierPath(t){for(var e=this.toCubicBezierData(t),s=[],i=0;i+3<e.length;i+=3)s.push([e[i],e[i+3],e[i+1],e[i+2]]);return g.fromArray(s)}destroy(){for(var t=0;t<this.vertices.length;t++)this.vertices[t].destroy();this.isDestroyed=!0}}c.utils={area(t){let e=0;for(var s=0,i=t.length;s<i;s++){e+=t[s].x*t[(s+1)%i].y*.5,e-=t[(s+1)%i].x*t[s].y*.5}return Math.abs(e)},isClockwise:t=>c.utils.signedArea(t)<0,signedArea(t){let e=0;const s=t.length;for(var i=0;i<s;i++){const r=(i+1)%s;e+=(t[r].x-t[i].x)*(t[i].y+t[r].y)}return e},locateLineIntersecion(t,e,s,i){const r=[];for(var n=s?e.length-1:e.length,a=0;a<n;a++){const s=new l(e[a%n],e[(a+1)%n]),h=s.intersection(t);null===h||!s.hasPoint(h,!0)||i&&!t.hasPoint(h,i)||r.push({edgeIndex:a,intersection:h})}return r}};class u{constructor(t,e){this.min=t,this.max=e,this.width=e.x-t.x,this.height=e.y-t.y}containsVert(t){return this.min.x<=t.x&&t.x<this.max.x&&this.min.y<=t.y&&t.y<this.max.y}getWidth(){return this.max.x-this.min.x}getHeight(){return this.max.y-this.min.y}getScaled(t){const e=this.getCenter(),s=new a(this.min).scale(t,e),i=new a(this.max).scale(t,e);return new u(s,i)}getMoved(t){const e=new a(this.min).move(t),s=new a(this.max).move(t);return new u(e,s)}getNorthPoint(){return new a(this.min.x+this.width/2,this.min.y)}getSouthPoint(){return new a(this.min.x+this.width/2,this.max.y)}getWestPoint(){return new a(this.min.x,this.min.y+this.height/2)}getEastPoint(){return new a(this.max.x,this.min.y+this.height/2)}getNorthWestPoint(){return new a(this.min.x,this.min.y)}getNorthEastPoint(){return new a(this.max.x,this.min.y)}getSouthEastPoint(){return new a(this.max.x,this.max.y)}getSouthWestPoint(){return new a(this.min.x,this.max.y)}toPolygon(){return new c([new a(this.min),new a(this.max.x,this.min.y),new a(this.max),new a(this.min.x,this.max.y)],!1)}getCenter(){return new a(this.min.x+(this.max.x-this.min.x)/2,this.min.y+(this.max.y-this.min.y)/2)}getMinDimension(){return Math.min(this.width,this.height)}getMaxDimension(){return Math.max(this.width,this.height)}randomPoint(t=0,e=0){const s=t>0&&t<1?this.width*t:t,i=e>0&&e<1?this.height*e:e;return new a(this.min.x+s+Math.random()*(this.width-2*s),this.min.y+i+Math.random()*(this.height-2*i))}toString(){return`{ min: ${this.min.toString()}, max : ${this.max.toString()}, width: ${this.width}, height : ${this.height} }`}clone(){return new u({x:this.min.x,y:this.min.y},{x:this.max.x,y:this.max.y})}static computeFromVertices(t){if(0==t.length)return new u(new a(0,0),new a(0,0));let e,s=t[0].x,i=t[0].x,r=t[0].y,n=t[0].y;for(var h in t)e=t[h],s=Math.min(s,e.x),i=Math.max(i,e.x),r=Math.min(r,e.y),n=Math.max(n,e.y);return new u(new a(s,r),new a(i,n))}static computeFromBoundsSet(t){if(0==t.length)return new u(new a(0,0),new a(0,0));let e,s=t[0].min.x,i=t[0].max.x,r=t[0].min.y,n=t[0].min.y;for(var h in t)e=t[h],s=Math.min(s,e.min.x),i=Math.max(i,e.max.x),r=Math.min(r,e.min.y),n=Math.max(n,e.min.y);return new u(new a(s,r),new a(i,n))}static fromDimension(t,e,s){return new u(null!=s?s:{x:0,y:0},{x:(s?s.x:0)+t,y:(s?s.y:0)+e})}}class d{constructor(t,s,i,r){this.START_POINT=d.START_POINT,this.START_CONTROL_POINT=d.START_CONTROL_POINT,this.END_CONTROL_POINT=d.END_CONTROL_POINT,this.END_POINT=d.END_POINT,this.uid=e.next(),this.startPoint=t,this.startControlPoint=i,this.endPoint=s,this.endControlPoint=r,this.curveIntervals=30,this.segmentCache=[],this.segmentLengths=[],this.updateArcLengths()}moveCurvePoint(t,e,s,i){t==this.START_POINT?(this.getStartPoint().add(e),s&&this.getStartControlPoint().add(e)):t==this.START_CONTROL_POINT?this.getStartControlPoint().add(e):t==this.END_CONTROL_POINT?this.getEndControlPoint().add(e):t==this.END_POINT?(this.getEndPoint().add(e),s&&this.getEndControlPoint().add(e)):console.log(`[CubicBezierCurve.moveCurvePoint] pointID '${t}' invalid.`),i&&this.updateArcLengths()}translate(t){return this.startPoint.add(t),this.startControlPoint.add(t),this.endControlPoint.add(t),this.endPoint.add(t),this}move(t){return this.translate(t)}reverse(){let t=this.startPoint;return this.startPoint=this.endPoint,this.endPoint=t,t=this.startControlPoint,this.startControlPoint=this.endControlPoint,this.endControlPoint=t,this}getLength(){return this.arcLength}updateArcLengths(){let t=this.startPoint.clone(),e=new a(0,0),s=1/this.curveIntervals;this.segmentCache=[],this.segmentCache.push(this.startPoint),this.segmentLengths=[];let i=0;var r=0;let n;for(;r<=1;)e=this.getPointAt(r),this.segmentCache.push(e),n=t.distance(e),this.segmentLengths.push(n),i+=n,t=e,r+=s;this.arcLength=i}getClosestT(t){var e={t:0,tPrev:0,tNext:1},s=0;do{e=this.locateIntervalByDistance(t,e.tPrev,e.tNext,this.curveIntervals),s++}while(s<4&&this.getPointAt(e.tPrev).distance(this.getPointAt(e.tNext))>1);return e.t}locateIntervalByDistance(t,e,s,i){var r=-1,n=0,a=0;const h=s-e;for(var o=0;o<=i;o++){a=e+h*(o/i);var l=this.getPointAt(a).distance(t);(-1==r||l<n)&&(r=o,n=l)}return{t:e+h*(r/i),tPrev:e+h*(Math.max(0,r-1)/i),tNext:e+h*(Math.min(i,r+1)/i)}}getBounds(){const t=d.utils.cubicPolyMinMax(this.startPoint.x,this.startControlPoint.x,this.endControlPoint.x,this.endPoint.x),e=t.min,s=t.max,i=d.utils.cubicPolyMinMax(this.startPoint.y,this.startControlPoint.y,this.endControlPoint.y,this.endPoint.y),r=i.min,n=i.max;return u.computeFromVertices([{x:e,y:r},{x:e,y:n},{x:s,y:n},{x:s,y:r}])}getStartPoint(){return this.startPoint}getEndPoint(){return this.endPoint}getStartControlPoint(){return this.startControlPoint}getEndControlPoint(){return this.endControlPoint}getPointByID(t){if(t==this.START_POINT)return this.startPoint;if(t==this.END_POINT)return this.endPoint;if(t==this.START_CONTROL_POINT)return this.startControlPoint;if(t==this.END_CONTROL_POINT)return this.endControlPoint;throw new Error(`Invalid point ID '${t}'.`)}getPointAt(t){const e=d.utils.evaluateT(this.startPoint.x,this.startControlPoint.x,this.endControlPoint.x,this.endPoint.x,t),s=d.utils.evaluateT(this.startPoint.y,this.startControlPoint.y,this.endControlPoint.y,this.endPoint.y,t);return new a(e,s)}getPoint(t){return this.getPointAt(t/this.arcLength)}getTangentAt(t){const e=this.getStartPoint(),s=this.getStartControlPoint(),i=this.getEndControlPoint(),r=this.getEndPoint(),n=t*t,h=1-2*t+n,o=-3*e.x*h+s.x*(3*h-6*(t-n))+i.x*(6*(t-n)-3*n)+3*r.x*n,l=-3*e.y*h+s.y*(3*h-6*(t-n))+i.y*(6*(t-n)-3*n)+3*r.y*n;return new a(o,l)}trimStart(t){return this.trimStartAt(this.convertU2T(t))}trimStartAt(t){const e=d.utils.getSubCurvePointsAt(this,t,1);return this.startPoint.set(e[0]),this.startControlPoint.set(e[2]),this.endPoint.set(e[1]),this.endControlPoint.set(e[3]),this.updateArcLengths(),this}trimEnd(t){return this.trimEndAt(this.convertU2T(t))}trimEndAt(t){const e=d.utils.getSubCurvePointsAt(this,0,t);return this.startPoint.set(e[0]),this.startControlPoint.set(e[2]),this.endPoint.set(e[1]),this.endControlPoint.set(e[3]),this.updateArcLengths(),this}getSubCurve(t,e){return this.getSubCurveAt(this.convertU2T(t),this.convertU2T(e))}getSubCurveAt(t,e){const s=d.utils.getSubCurvePointsAt(this,t,e);return new d(s[0],s[1],s[2],s[3])}convertU2T(t){return Math.max(0,Math.min(1,t/this.arcLength))}getTangent(t){return this.getTangentAt(this.convertU2T(t))}getPerpendicular(t){return this.getPerpendicularAt(this.convertU2T(t))}getPerpendicularAt(t){const e=this.getTangentAt(t);return new a(e.y,-e.x)}clone(){return new d(this.getStartPoint().clone(),this.getEndPoint().clone(),this.getStartControlPoint().clone(),this.getEndControlPoint().clone())}getStartTangent(){return this.startControlPoint}getEndTangent(){return this.endControlPoint}lineIntersections(t,e=!1){const s=this.lineIntersectionTs(t).map(t=>this.getPointAt(t));return e?s.filter(e=>t.hasPoint(e,!0)):s}lineIntersectionTangents(t,e=!1){const s=this.lineIntersectionTs(t).map(t=>{const e=this.getPointAt(t),s=this.getTangentAt(t);return new o(e,s.add(e))});return e?s.filter(e=>t.hasPoint(e.a,!0)):s}lineIntersectionTs(t){var e=t.b.y-t.a.y,s=t.a.x-t.b.x,i=t.a.x*(t.a.y-t.b.y)+t.a.y*(t.b.x-t.a.x),r=d.utils.bezierCoeffs(this.startPoint.x,this.startControlPoint.x,this.endControlPoint.x,this.endPoint.x),n=d.utils.bezierCoeffs(this.startPoint.y,this.startControlPoint.y,this.endControlPoint.y,this.endPoint.y);const a=Array(4);return a[0]=e*r[0]+s*n[0],a[1]=e*r[1]+s*n[1],a[2]=e*r[2]+s*n[2],a[3]=e*r[3]+s*n[3]+i,d.utils.cubicRoots(a).filter(t=>-1!=t)}equals(t){return!!t&&(!!(t.startPoint&&t.endPoint&&t.startControlPoint&&t.endControlPoint)&&(this.startPoint.equals(t.startPoint)&&this.endPoint.equals(t.endPoint)&&this.startControlPoint.equals(t.startControlPoint)&&this.endControlPoint.equals(t.endControlPoint)))}destroy(){this.startPoint.destroy(),this.endPoint.destroy(),this.startControlPoint.destroy(),this.endControlPoint.destroy(),this.isDestroyed=!0}static isInstance(t){return t instanceof d}toJSON(t){return"{ "+(t?"\n\t":"")+'"startPoint" : ['+this.getStartPoint().x+","+this.getStartPoint().y+"], "+(t?"\n\t":"")+'"endPoint" : ['+this.getEndPoint().x+","+this.getEndPoint().y+"], "+(t?"\n\t":"")+'"startControlPoint": ['+this.getStartControlPoint().x+","+this.getStartControlPoint().y+"], "+(t?"\n\t":"")+'"endControlPoint" : ['+this.getEndControlPoint().x+","+this.getEndControlPoint().y+"]"+(t?"\n\t":"")+" }"}static fromJSON(t){var e=JSON.parse(t);return d.fromObject(e)}static fromObject(t){if("object"!=typeof t)throw"Can only build from object.";if(!t.startPoint)throw'Object member "startPoint" missing.';if(!t.endPoint)throw'Object member "endPoint" missing.';if(!t.startControlPoint)throw'Object member "startControlPoint" missing.';if(!t.endControlPoint)throw'Object member "endControlPoint" missing.';return new d(new a(t.startPoint[0],t.startPoint[1]),new a(t.endPoint[0],t.endPoint[1]),new a(t.startControlPoint[0],t.startControlPoint[1]),new a(t.endControlPoint[0],t.endControlPoint[1]))}static fromArray(t){if(!Array.isArray(t))throw"Can only build from object.";if(4!=t.length)throw"Can only build from array with four elements.";return new d(t[0],t[1],t[2],t[3])}}d.START_POINT=0,d.START_CONTROL_POINT=1,d.END_CONTROL_POINT=2,d.END_POINT=3,d.utils={evaluateT:(t,e,s,i,r)=>t*Math.pow(1-r,3)+3*e*r*Math.pow(1-r,2)+3*s*Math.pow(r,2)*(1-r)+i*Math.pow(r,3),cubicPolyMinMax:(t,e,s,i)=>{var r=d.utils.cubicPoly(t,e,s,i),n=r[0],a=r[1];r[2];var h=r[1]*r[1]-4*r[0]*r[2],o=Math.min(i,t),l=Math.max(i,t);if(h>=0){var c=(-a+Math.sqrt(h))/(2*n);if(c>0&&c<1){var u=d.utils.evaluateT(t,e,s,i,c);u<o&&(o=u),u>l&&(l=u)}var g=(-a-Math.sqrt(h))/(2*n);if(g>0&&g<1){var f=d.utils.evaluateT(t,e,s,i,g);f<o&&(o=f),f>l&&(l=f)}}return{min:o,max:l}},getSubCurvePointsAt:(t,e,s)=>{const i=new o(t.getPointAt(e),t.getTangentAt(e)),r=new o(t.getPointAt(s),t.getTangentAt(s).inv());return i.b.add(i.a),r.b.add(r.a),i.scale(.33333333*(s-e)),r.scale(.33333333*(s-e)),[i.a,r.a,i.b,r.b]},cubicRoots:t=>{const e=t[0],s=t[1]/e,i=t[2]/e,r=t[3]/e;var n,a;const h=(3*i-Math.pow(s,2))/9,o=(9*s*i-27*r-2*Math.pow(s,3))/54,l=Math.pow(h,3)+Math.pow(o,2),c=[];if(l>=0)n=d.utils.sgn(o+Math.sqrt(l))*Math.pow(Math.abs(o+Math.sqrt(l)),1/3),a=d.utils.sgn(o-Math.sqrt(l))*Math.pow(Math.abs(o-Math.sqrt(l)),1/3),c[0]=-s/3+(n+a),c[1]=-s/3-(n+a)/2,c[2]=-s/3-(n+a)/2,0!=Math.abs(Math.sqrt(3)*(n-a)/2)&&(c[1]=-1,c[2]=-1);else{const t=Math.acos(o/Math.sqrt(-Math.pow(h,3)));c[0]=2*Math.sqrt(-h)*Math.cos(t/3)-s/3,c[1]=2*Math.sqrt(-h)*Math.cos((t+2*Math.PI)/3)-s/3,c[2]=2*Math.sqrt(-h)*Math.cos((t+4*Math.PI)/3)-s/3}return c.filter(t=>t>=0&&t<=1).sort()},bezierCoeffs:(t,e,s,i)=>{const r=[NaN,NaN,NaN,NaN];return r[0]=3*e-t+-3*s+i,r[1]=3*t-6*e+3*s,r[2]=-3*t+3*e,r[3]=t,r},cubicPoly:(t,e,s,i)=>[3*i-9*s+9*e-3*t,6*t-12*e+6*s,3*e-3*t],sgn:t=>t<0?-1:1};class g{constructor(){this.className="BezierPath",this.START_POINT=0,this.START_CONTROL_POINT=1,this.END_CONTROL_POINT=2,this.END_POINT=3,this.uid=e.next(),this.totalArcLength=0,this.adjustCircular=!1,this.bezierCurves=[]}addCurve(t){if(null==t||void 0===t)throw"Cannot add null curve to bézier path.";this.bezierCurves.push(t),this.bezierCurves.length>1?(t.startPoint=this.bezierCurves[this.bezierCurves.length-2].endPoint,this.adjustSuccessorControlPoint(this.bezierCurves.length-2,!0,!0)):this.totalArcLength+=t.getLength()}locateCurveByStartPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].startPoint.equals(t))return e;return-1}locateCurveByEndPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].endPoint.equals(t))return e;return-1}locateCurveByStartControlPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].startControlPoint.equals(t))return e;return-1}locateCurveByEndControlPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].endControlPoint.equals(t))return e;return-1}getLength(){return this.totalArcLength}updateArcLengths(){this.totalArcLength=0;for(var t=0;t<this.bezierCurves.length;t++)this.bezierCurves[t].updateArcLengths(),this.totalArcLength+=this.bezierCurves[t].getLength()}getCurveCount(){return this.bezierCurves.length}getCurveAt(t){return this.bezierCurves[t]}translate(t){for(var e=0;e<this.bezierCurves.length;e++){(s=this.bezierCurves[e]).getStartPoint().add(t),s.getStartControlPoint().add(t),s.getEndControlPoint().add(t)}var s;return(s=this.bezierCurves[this.bezierCurves.length-1]).getEndPoint().add(t),this.updateArcLengths(),this}move(t){return this.translate(t)}scale(t,e){return this.scaleXY({x:e,y:e},t)}scaleXY(t,e){for(var s=0;s<this.bezierCurves.length;s++){var i=this.bezierCurves[s];i.getStartPoint().scaleXY(t,e),i.getStartControlPoint().scaleXY(t,e),i.getEndControlPoint().scaleXY(t,e)}return this.bezierCurves.length>0&&!this.adjustCircular&&this.bezierCurves[this.bezierCurves.length-1].getEndPoint().scaleXY(t,e),this.updateArcLengths(),this}rotate(t,e){for(var s=0;s<this.bezierCurves.length;s++){var i=this.bezierCurves[s];i.getStartPoint().rotate(t,e),i.getStartControlPoint().rotate(t,e),i.getEndControlPoint().rotate(t,e)}this.bezierCurves.length>0&&!this.adjustCircular&&this.bezierCurves[this.bezierCurves.length-1].getEndPoint().rotate(t,e)}getClosestT(t){for(var e=-1,s=0,i=0,r=0,n=0,a=0,h=0;h<this.bezierCurves.length;h++)r=this.bezierCurves[h].getClosestT(t),i=this.bezierCurves[h].getPointAt(r).distance(t),(-1==e||i<s)&&(e=h,s=i,n=a+r*this.bezierCurves[h].getLength()),a+=this.bezierCurves[h].getLength();return Math.max(0,Math.min(1,n/this.totalArcLength))}getPoint(t){(t<0||t>this.totalArcLength)&&(console.warn("[BezierPath.getPoint(u)] u is out of bounds: "+t+"."),t=Math.min(this.totalArcLength,Math.max(t,0)));for(var e=0,s=0;e<this.bezierCurves.length&&s+this.bezierCurves[e].getLength()<t;)s+=this.bezierCurves[e].getLength(),e++;if(e>=this.bezierCurves.length)return this.bezierCurves[this.bezierCurves.length-1].getEndPoint().clone();var i=t-s;return this.bezierCurves[e].getPoint(i)}getPointAt(t){return this.getPoint(t*this.totalArcLength)}getTangentAt(t){return this.getTangent(t*this.totalArcLength)}getTangent(t){(t<0||t>this.totalArcLength)&&(console.warn("[BezierPath.getTangent(u)] u is out of bounds: "+t+"."),t=Math.min(this.totalArcLength,Math.max(0,t)));for(var e=0,s=0;e<this.bezierCurves.length&&s+this.bezierCurves[e].getLength()<t;)s+=this.bezierCurves[e].getLength(),e++;var i=t-s;return this.bezierCurves[e].getTangent(i)}getPerpendicularAt(t){return this.getPerpendicular(t*this.totalArcLength)}getPerpendicular(t){(t<0||t>this.totalArcLength)&&(console.log("[BezierPath.getPerpendicular(u)] u is out of bounds: "+t+"."),t=Math.min(this.totalArcLength,Math.max(0,t)));var e=g._locateUIndex(this,t),s=this.bezierCurves[e.i],i=t-e.uPart;return s.getPerpendicular(i)}lineIntersections(t,e=!1){return this.bezierCurves.reduce((s,i)=>s.concat(i.lineIntersections(t,e)),[])}lineIntersectionTangents(t,e=!1){return this.bezierCurves.reduce((s,i)=>s.concat(i.lineIntersectionTangents(t,e)),[])}static _locateUIndex(t,e){for(var s=0,i=0,r=0;s<t.bezierCurves.length&&i+t.bezierCurves[s].getLength()<e;)i+=t.bezierCurves[s].getLength(),s+1<t.bezierCurves.length&&(r+=t.bezierCurves[s].getLength()),s++;return{i:s,uPart:i,uBefore:r}}getSubPathAt(t,e){t=Math.max(0,t),e=Math.min(1,e);let s=t*this.totalArcLength,i=e*this.totalArcLength;var r=g._locateUIndex(this,s),n=g._locateUIndex(this,i),a=(s-r.uBefore)/this.bezierCurves[r.i].getLength();if(r.i==n.i){var h=(i-n.uBefore)/this.bezierCurves[n.i].getLength(),o=this.bezierCurves[r.i].getSubCurveAt(a,h);return g.fromArray([o])}var l=[];if(r.i>n.i){o=this.bezierCurves[r.i].getSubCurveAt(a,0);l.push(o);for(var c=r.i-1;c>n.i;c--)l.push(this.bezierCurves[c].clone().reverse());h=(i-n.uBefore)/this.bezierCurves[n.i].getLength();l.push(this.bezierCurves[n.i].getSubCurveAt(1,h))}else{o=this.bezierCurves[r.i].getSubCurveAt(a,1);l.push(o);for(c=r.i+1;c<n.i&&c<this.bezierCurves.length;c++)l.push(this.bezierCurves[c].clone());h=(i-n.uBefore)/this.bezierCurves[n.i].getLength();l.push(this.bezierCurves[n.i].getSubCurveAt(0,h))}return g.fromArray(l)}moveCurvePoint(t,e,s){if(this.getCurveAt(t).moveCurvePoint(e,s,!0,!0),e==this.START_POINT&&(t>0||this.adjustCircular))this.getCurveAt(t-1<0?this.bezierCurves.length+(t-1):t-1).moveCurvePoint(this.END_CONTROL_POINT,s,!0,!1);else if(e==this.END_POINT&&(t+1<this.bezierCurves.length||this.adjustCircular)){this.getCurveAt((t+1)%this.bezierCurves.length).moveCurvePoint(this.START_CONTROL_POINT,s,!0,!1)}else e==this.START_CONTROL_POINT&&t>0?this.adjustPredecessorControlPoint(t,!0,!1):e==this.END_CONTROL_POINT&&t+1<this.getCurveCount()&&this.adjustSuccessorControlPoint(t,!0,!1);this.updateArcLengths()}adjustPredecessorControlPoint(t,e,s){if(this.adjustCircular||!(t<=0)){var i=this.getCurveAt(t),r=this.getCurveAt(t-1<0?this.getCurveCount()+(t-1):t-1);g.adjustNeighbourControlPoint(i,r,i.getStartPoint(),i.getStartControlPoint(),r.getEndPoint(),r.getEndControlPoint(),e,s)}}adjustSuccessorControlPoint(t,e,s){if(this.adjustCircular||!(t+1>this.getCurveCount())){var i=this.getCurveAt(t),r=this.getCurveAt((t+1)%this.getCurveCount());g.adjustNeighbourControlPoint(i,r,i.getEndPoint(),i.getEndControlPoint(),r.getStartPoint(),r.getStartControlPoint(),e,s)}}static adjustNeighbourControlPoint(t,e,s,i,r,n,h,o){var l=new a(i.x-s.x,i.y-s.y),c=new a(n.x-r.x,n.y-r.y),u=Math.sqrt(Math.pow(l.x,2)+Math.pow(l.y,2)),d=Math.sqrt(Math.pow(c.x,2)+Math.pow(c.y,2));u<=.1||(h?n.set(r.x-l.x*(d/u),r.y-l.y*(d/u)):n.set(r.x-l.x,r.y-l.y),e.updateArcLengths())}getBounds(){const t=new a(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY),e=new a(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY);for(var s,i=0;i<this.bezierCurves.length;i++)s=this.bezierCurves[i].getBounds(),t.x=Math.min(t.x,s.min.x),t.y=Math.min(t.y,s.min.y),e.x=Math.max(e.x,s.max.x),e.y=Math.max(e.y,s.max.y);return new u(t,e)}getEvenDistributionVertices(t){if(t<2)throw new Error("pointCount must be larger than one; is "+t+".");const e=[];if(0===this.bezierCurves.length)return e;var s=new a(this.bezierCurves[0].startPoint);e.push(s);const i=this.totalArcLength/(t-1),r=this.bezierCurves.length;let n=0,h=this.bezierCurves[0].arcLength,o=i,l=1;for(;l<t&&n<r;)if(o<h){var c=this.bezierCurves[n].getPoint(o);e.push(c),o+=i,l++}else n++,o-=h,h=n<r?this.bezierCurves[n].arcLength:0;return e.push(new a(this.bezierCurves[r-1].endPoint)),e}clone(){for(var t=new g,e=0;e<this.bezierCurves.length;e++)t.bezierCurves.push(this.bezierCurves[e].clone()),e>0&&(t.bezierCurves[e-1].endPoint=t.bezierCurves[e].startPoint);return t.updateArcLengths(),t.adjustCircular=this.adjustCircular,t}equals(t){if(!t)return!1;if(!t.bezierCurves)return!1;if(void 0===t.bezierCurves.length)return!1;if(t.bezierCurves.length!=this.bezierCurves.length)return!1;for(var e=0;e<this.bezierCurves.length;e++)if(!this.bezierCurves[e].equals(t.bezierCurves[e]))return!1;return!0}destroy(){for(var t=0;t<this.bezierCurves.length;t++)this.bezierCurves[t].destroy();this.isDestroyed=!0}toPathPoints(){if(0===this.bezierCurves.length)return[];if(1===this.bezierCurves.length)return[this.bezierCurves[0].startPoint,this.bezierCurves[0].startControlPoint,this.bezierCurves[0].endControlPoint,this.bezierCurves[0].endPoint];const t=[];t.push(this.bezierCurves[0].startPoint),t.push(this.bezierCurves[0].startControlPoint);for(var e=1;e<this.bezierCurves.length;e++)t.push(this.bezierCurves[e-1].endControlPoint),t.push(this.bezierCurves[e-1].endPoint),t.push(this.bezierCurves[e].startPoint),t.push(this.bezierCurves[e].startControlPoint);return t.push(this.bezierCurves[0].endControlPoint),t.push(this.bezierCurves[0].endPoint),t}toJSON(t){var e=[];e.push("[");for(var s=0;s<this.bezierCurves.length;s++)s>0&&e.push(","),t?e.push("\n\t"):e.push(" "),e.push(this.bezierCurves[s].toJSON(t));return 0!=this.bezierCurves.length&&e.push(" "),e.push("]"),e.join("")}static fromJSON(t){var e=JSON.parse(t);return g.fromArray(e)}static fromCurve(t){const e=new g;return e.addCurve(t),e}static fromArray(t){if(!Array.isArray(t))throw"[BezierPath.fromArray] Passed object must be an array.";const e=t;if(e.length<1)throw"[BezierPath.fromArray] Passed array must contain at least one bezier curve (has "+e.length+").";for(var s=new g,i=null,r=0;r<e.length;r++){var n;if(d.isInstance(e[r]))n=e[r].clone();else if(0 in e[r]&&1 in e[r]&&2 in e[r]&&3 in e[r]){if(!(e[r][0]&&e[r][1]&&e[r][2]&&e[r][3]))throw"Cannot convert path data to BezierPath instance. At least one element is undefined (index="+r+"): "+e[r];n=d.fromArray(e[r])}else n=d.fromObject(e[r]);i&&(n.startPoint=i.endPoint),s.bezierCurves.push(n),i=n}return s.updateArcLengths(),s}toReducedListRepresentation(t){void 0===t&&(t=1);var e=[];e.push("[");for(var s=0;s<this.bezierCurves.length;s++){var i=this.bezierCurves[s];e.push(i.getStartPoint().x.toFixed(t)),e.push(","),e.push(i.getStartPoint().y.toFixed(t)),e.push(","),e.push(i.getStartControlPoint().x.toFixed(t)),e.push(","),e.push(i.getStartControlPoint().y.toFixed(t)),e.push(","),e.push(i.getEndControlPoint().x.toFixed(t)),e.push(","),e.push(i.getEndControlPoint().y.toFixed(t)),e.push(",")}if(0!=this.bezierCurves.length){i=this.bezierCurves[this.bezierCurves.length-1];e.push(i.getEndPoint().x.toFixed(t)),e.push(","),e.push(i.getEndPoint().y.toFixed(t))}return e.push("]"),e.join("")}static fromReducedListRepresentation(t,e){var s=JSON.parse(t);if(!s.length)throw console.log("Cannot parse bezier path from non-array object nor from empty point list."),"Cannot parse bezier path from non-array object nor from empty point list.";if(s.length<8)throw console.log("Cannot build bezier path. The passed array must contain at least 8 elements (numbers)."),"Cannot build bezier path. The passed array must contain at least 8 elements (numbers).";return g.fromReducedList(s,e)}static fromReducedList(t,e){var s,i,r,n=new g,h=new a,o=0;do{0==o&&(h=new a(t[o],t[o+1])),s=new a(t[o+2],t[o+3]),i=new a(t[o+4],t[o+5]),r=new a(t[o+6],t[o+7]);var l=new d(h,r,s,i);n.bezierCurves.push(l),h=r,o+=6}while(o+2<t.length);return n.adjustCircular=null!=e&&e,e&&(n.bezierCurves[n.bezierCurves.length-1].endPoint=n.bezierCurves[0].startPoint),n.updateArcLengths(),n}}g.START_POINT=0,g.START_CONTROL_POINT=1,g.END_CONTROL_POINT=2,g.END_POINT=3;class f{constructor(t,s,i){this.className="CircleSector",this.uid=e.next(),this.circle=t,this.startAngle=s,this.endAngle=i}getBounds(){const t=this,e=this.circle.getBounds(),s=[e.getNorthPoint(),e.getSouthPoint(),e.getWestPoint(),e.getEastPoint()].filter(e=>{const s=new l(t.circle.center,e).angle();return t.containsAngle(s)});return u.computeFromVertices(s.concat([this.getStartPoint(),this.getEndPoint()]))}move(t){return this.circle.move(t),this}containsAngle(t){var e=n.mapAngleTo2PI(t),s=n.mapAngleTo2PI(this.startAngle),i=n.mapAngleTo2PI(this.endAngle);return s<=i?e>=s&&e<i:e>=s||e<i}angleAt(t){if(this.startAngle<=this.endAngle){return(this.startAngle+(this.endAngle-this.startAngle)*t)%(2*Math.PI)}return(this.startAngle+(2*Math.PI-this.startAngle+this.endAngle)*t)%(2*Math.PI)}getStartPoint(){return this.circle.vertAt(this.startAngle)}getEndPoint(){return this.circle.vertAt(this.endAngle)}circleSectorIntersection(t){const e=this.circle.circleIntersection(t.circle);if(!e)return null;const s=this.circle.center.angle(e.a),r=this.circle.center.angle(e.b);if(!this.containsAngle(s)||!this.containsAngle(r))return null;const n=t.circle.center.angle(e.a),a=t.circle.center.angle(e.b);if(!t.containsAngle(n)||!t.containsAngle(a))return null;var h=new f(this.circle,this.endAngle,this.startAngle).angleAt(.5);const o=new f(new i(this.circle.center.clone(),this.circle.radius),s,r);return o.containsAngle(h)&&(o.startAngle=r,o.endAngle=s),o}lineIntersections(t,e=!1){const s=this.circle.lineIntersections(t,e),i=new l(this.circle.center,new a);return s.filter(t=>{i.b.set(t);const e=i.angle();return this.containsAngle(n.wrapMinMax(e,0,2*Math.PI))})}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map(t=>{const e=new l(this.circle.center,t).angle();return this.circle.tangentAt(e)})}describeSVGPath(t){return f.circleSectorUtils.describeSVGArc(this.circle.center.x,this.circle.center.y,this.circle.radius,this.startAngle,this.endAngle,t)}destroy(){this.circle.destroy(),this.isDestroyed=!0}}f.circleSectorUtils={polarToCartesian:(t,e,s,i)=>({x:t+s*Math.cos(i),y:e+s*Math.sin(i)}),describeSVGArc:(t,e,s,i,r,n)=>{void 0===n&&(n={moveToStart:!0});const a=f.circleSectorUtils.polarToCartesian(t,e,s,r),h=f.circleSectorUtils.polarToCartesian(t,e,s,i);if(2*Math.PI-Math.abs(i-r)<.001){const a=f.circleSectorUtils.describeSVGArc(t,e,s,i,i+(r-i)/2,n),h=f.circleSectorUtils.describeSVGArc(t,e,s,i+(r-i)/2,r,n);return a.concat(h)}const o=r-i;var l,c;o<0?(l=Math.abs(o)<Math.PI?1:0,c=1):(l=Math.abs(o)>Math.PI?1:0,c=1);const u=[];return n.moveToStart&&u.push("M",h.x,h.y),u.push("A",s,s,0,l,c,a.x,a.y),u}};const x=180/Math.PI;class v{constructor(t,e,s,i,r,n,h,o,l,c,u,d){if(this.svgNode=t,this.offset=new a(0,0).set(e),this.scale=new a(1,1).set(s),this.fillShapes=r,this.isSecondary=Boolean(h),this.drawConfig=n,this.drawlibConfiguration={},this.cache=new Map,this.setSize(i),h){if(!(o&&l&&c&&u))throw"Cannot create secondary svg draw lib with undefinde gNode|bufferGNode|nodeDefs|bufferNodeDefs.";this.gNode=o,this.bufferGNode=l,this.nodeDefs=c,this.bufferedNodeDefs=u,d&&(this.nodeStyle=d)}else this.addStyleDefs(n),this.addDefsNode(),this.gNode=this.createSVGNode("g"),this.bufferGNode=this.createSVGNode("g"),this.svgNode.appendChild(this.gNode)}addStyleDefs(t){this.nodeStyle=this.createSVGNode("style"),this.svgNode.appendChild(this.nodeStyle),this.rebuildStyleDefs(t)}rebuildStyleDefs(t){const e={bezier:"CubicBezierCurve",polygon:"Polygon",triangle:"Triangle",ellipse:"Ellipse",ellipseSector:"EllipseSector",circle:"Circle",circleSector:"CircleSector",vertex:"Vertex",line:"Line",vector:"Vector",image:"Image",text:"Text"},s=[];for(var i in e){const r=e[i],n=t[i];n?s.push(`.${r} { fill : none; stroke: ${n.color}; stroke-width: ${n.lineWidth}px }`):console.warn(`Warning: your draw config is missing the key '${i}' which is required.`)}this.customStyleDefs&&(s.push("\n/* Custom styles */\n"),this.customStyleDefs.forEach((t,e)=>{s.push(e+" { "+t+" }")})),this.nodeStyle.innerHTML=s.join("\n")}addDefsNode(){this.nodeDefs=this.createSVGNode("defs"),this.bufferedNodeDefs=this.createSVGNode("defs"),this.svgNode.appendChild(this.nodeDefs)}addCustomStyleDefs(t){this.customStyleDefs=t}findElement(t,e){if(!t)return null;var s=this.cache.get(t);return s&&s.nodeName.toUpperCase()===e.toUpperCase()?(this.cache.delete(t),s):null}createSVGNode(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}makeNode(t){var e=this.findElement(this.curId,t);if(e||(e=this.createSVGNode(t)),this.drawlibConfiguration.blendMode){const t=e.style["mix-blend-mode"];"function"==typeof t?t(this.drawlibConfiguration.blendMode):e.style["mix-blend-mode"]=this.drawlibConfiguration.blendMode}return e}_bindFillDraw(t,e,s,i,r){return this._configureNode(t,e,this.fillShapes,s,i,r),this._bindNode(t,void 0)}_bindNode(t,e){return t.parentNode||(null!=e?e:this.bufferGNode).appendChild(t),t}_addCSSClasses(t,e){this.curClassName?t.setAttribute("class",`${e} ${this.curClassName}`):t.setAttribute("class",e)}_configureNode(t,e,s,i,r,n){return this._addCSSClasses(t,e),t.setAttribute("fill",s&&i?i:"none"),t.setAttribute("stroke",s?"none":i||"none"),t.setAttribute("stroke-width",`${r||1}`),this.curId&&t.setAttribute("id",`${this.curId}`),this.applyStrokeOpts(t,n),t}setSize(t){this.canvasSize=t,this.svgNode.setAttribute("viewBox",`0 0 ${this.canvasSize.width} ${this.canvasSize.height}`),this.svgNode.setAttribute("width",`${this.canvasSize.width}`),this.svgNode.setAttribute("height",`${this.canvasSize.height}`)}copyInstance(t){return new v(this.svgNode,this.offset,this.scale,this.canvasSize,t,this.drawConfig,!0,this.gNode,this.bufferGNode,this.nodeDefs,this.bufferedNodeDefs,this.nodeStyle)}setConfiguration(t){this.drawlibConfiguration=t}setCurrentId(t){this.curId=t}setCurrentClassName(t){this.curClassName=t}beginDrawCycle(t){this.cache.clear();for(var e=0;e<this.bufferGNode.childNodes.length;e++){var s=this.bufferGNode.childNodes[e];this.cache.set(s.getAttribute("id"),s)}this.removeAllChildNodes()}endDrawCycle(t){this.rebuildStyleDefs(this.drawConfig),this.isSecondary||(this.svgNode.replaceChild(this.bufferedNodeDefs,this.nodeDefs),this.svgNode.replaceChild(this.bufferGNode,this.gNode));const e=this.gNode;this.gNode=this.bufferGNode,this.bufferGNode=e;const s=this.nodeDefs;this.nodeDefs=this.bufferedNodeDefs,this.bufferedNodeDefs=s}applyStrokeOpts(t,e){e&&e.dashArray&&e.dashArray.length>0&&v.nodeSupportsLineDash(t.tagName)&&(t.setAttribute("stroke-dasharray",e.dashArray.map(t=>t*this.scale.x).join(" ")),e.dashOffset&&t.setAttribute("stroke-dashoffset",""+e.dashOffset*this.scale.x)),e&&e.lineJoin&&v.nodeSupportsLineJoin(t.tagName)&&t.setAttribute("stroke-linejoin",e.lineJoin)}_x(t){return this.offset.x+this.scale.x*t}_y(t){return this.offset.y+this.scale.y*t}line(t,e,s,i,r){const n=this.makeLineNode(t,e,s,i,r);return this._bindFillDraw(n,"line",s,i||1,r)}arrow(t,e,s,i,r=8,n){const a=this.makeNode("g"),h={x:0,y:0},o=this.makeArrowHeadNode(t,e,s,i,r,void 0,h),l=this.makeLineNode(t,h,s,i,n);return a.appendChild(l),a.appendChild(o),this._addCSSClasses(a,"linear-arrow"),this._bindNode(a,void 0),a}cubicBezierArrow(t,e,s,i,r,n,h=8,o){const l=this.makeNode("g"),c=new a(0,0),u=this.makeArrowHeadNode(i,e,r,n,h,void 0,c),d=c.difference(e),g=this.makeCubicBezierNode(t,{x:e.x-d.x,y:e.y-d.y},s,{x:i.x-d.x,y:i.y-d.y},r,n,o);return l.appendChild(g),l.appendChild(u),this._addCSSClasses(l,"cubicbezier-arrow"),this._bindNode(l,void 0),l}arrowHead(t,e,s,i,r=8,n){const a=this.makeArrowHeadNode(t,e,s,i,r,n);return this._bindFillDraw(a,"arrowhead",s,i||1,n)}image(t,e,s,i=1){const r=this.makeNode("image"),n=t=>{if(t.naturalWidth){const n=s.x/t.naturalWidth,a=s.y/t.naturalHeight;r.setAttribute("width",""+t.naturalWidth*this.scale.x),r.setAttribute("height",""+t.naturalHeight*this.scale.y),r.setAttribute("display",null),r.setAttribute("opacity",`${i}`),r.setAttribute("transform",`translate(${this._x(e.x)} ${this._y(e.y)}) scale(${n} ${a})`)}};return t.addEventListener("load",e=>{n(t)}),r.setAttribute("x","0"),r.setAttribute("y","0"),r.setAttribute("display","none"),n(t),r.setAttribute("href",t.src),this._bindFillDraw(r,"image",null,null)}texturedPoly(t,s,i,r,n){const h=new a(s.min).clone().rotate(n,r),o=this.makeNode("clipPath"),l=`clippath_${e.next()}`;o.setAttribute("id",l);const c=this.makeNode("g"),u=this.makeNode("image");u.setAttribute("x",`${this._x(h.x)}`),u.setAttribute("y",`${this._y(h.y)}`),u.setAttribute("width",`${s.width}`),u.setAttribute("height",`${s.height}`),u.setAttribute("href",t.src),u.setAttribute("transform",`rotate(${n*x}, ${this._x(h.x)}, ${this._y(h.y)})`);const d=this.makeNode("path"),g=[];if(i.vertices.length>0){g.push("M",`${this._x(i.vertices[0].x)}`,`${this._y(i.vertices[0].y)}`);for(var f=1;f<i.vertices.length;f++)g.push("L",`${this._x(i.vertices[f].x)}`,`${this._y(i.vertices[f].y)}`)}d.setAttribute("d",g.join(" ")),o.appendChild(d),this.bufferedNodeDefs.appendChild(o),c.appendChild(u),c.setAttribute("transform-origin",`${this._x(h.x)} ${this._y(h.y)}`),c.setAttribute("transform",`scale(${this.scale.x}, ${this.scale.y})`);const v=this.makeNode("g");return v.appendChild(c),v.setAttribute("clip-path",`url(#${l})`),this._bindFillDraw(v,"image",null,null),v}cubicBezier(t,e,s,i,r,n,a){const h=this.makeCubicBezierNode(t,e,s,i,r,n,a);return this._bindNode(h,void 0)}cubicBezierPath(t,e,s,i,r){const n=this.makeNode("path");if(this.applyStrokeOpts(n,i),!t||0==t.length)return n;const a=["M",this._x(t[0].x),this._y(t[0].y)];for(var h,o,l,c=1;c<t.length;c+=3)o=t[c],l=t[c+1],h=t[c+2],a.push("C",this._x(o.x),this._y(o.y),this._x(l.x),this._y(l.y),this._x(h.x),this._y(h.y));return r||a.push("Z"),n.setAttribute("d",a.join(" ")),this._bindFillDraw(n,"cubicBezierPath",e,s||1)}handle(t,e){this.point(t,"rgb(0,32,192)"),this.square(e,5,"rgba(0,128,192,0.5)")}handleLine(t,e){this.line(t,e,"rgb(128,128,128,0.5)")}dot(t,e){const s=this.makeNode("line");return s.setAttribute("x1",`${this._x(t.x)}`),s.setAttribute("y1",`${this._y(t.y)}`),s.setAttribute("x2",`${this._x(t.x)}`),s.setAttribute("y2",`${this._y(t.y)}`),this._bindFillDraw(s,"dot",e,1)}point(t,e){const s=this.makeNode("circle");return s.setAttribute("cx",`${this._x(t.x)}`),s.setAttribute("cy",`${this._y(t.y)}`),s.setAttribute("r","3"),this._bindFillDraw(s,"point",e,1)}circle(t,e,s,i,r){const n=this.makeNode("circle");return this.applyStrokeOpts(n,r),n.setAttribute("cx",`${this._x(t.x)}`),n.setAttribute("cy",`${this._y(t.y)}`),n.setAttribute("r",""+e*this.scale.x),this._bindFillDraw(n,"circle",s,i||1)}circleArc(t,e,s,i,r,n,a){const h=this.makeNode("path");this.applyStrokeOpts(h,a);const o=f.circleSectorUtils.describeSVGArc(this._x(t.x),this._y(t.y),e*this.scale.x,s,i);return h.setAttribute("d",o.join(" ")),this._bindFillDraw(h,"circleArc",r,n||1)}ellipse(t,e,s,i,r,n,a){void 0===n&&(n=0);const h=this.makeNode("ellipse");return this.applyStrokeOpts(h,a),h.setAttribute("cx",`${this._x(t.x)}`),h.setAttribute("cy",`${this._y(t.y)}`),h.setAttribute("rx",""+e*this.scale.x),h.setAttribute("ry",""+s*this.scale.y),h.setAttribute("transform",`rotate(${180*n/Math.PI} ${this._x(t.x)} ${this._y(t.y)})`),this._bindFillDraw(h,"ellipse",i,r||1)}square(t,e,s,i,r){const n=this.makeNode("rectangle");return this.applyStrokeOpts(n,r),n.setAttribute("x",`${this._x(t.x-e/2)}`),n.setAttribute("y",`${this._y(t.y-e/2)}`),n.setAttribute("width",""+e*this.scale.x),n.setAttribute("height",""+e*this.scale.y),this._bindFillDraw(n,"square",s,i||1)}rect(t,e,s,i,r,n){const a=this.makeNode("rect");return this.applyStrokeOpts(a,n),a.setAttribute("x",`${this._x(t.x)}`),a.setAttribute("y",`${this._y(t.y)}`),a.setAttribute("width",""+e*this.scale.x),a.setAttribute("height",""+s*this.scale.y),this._bindFillDraw(a,"rect",i,r||1)}grid(t,e,s,i,r,n){const a=this.makeNode("path"),h=[];for(var o=-Math.ceil(.5*s/r)*r,l=s/2,c=-Math.ceil(.5*e/i)*i;c<e/2;c+=i)h.push("M",this._x(t.x+c),this._y(t.y+o)),h.push("L",this._x(t.x+c),this._y(t.y+l));for(var u=-Math.ceil(.5*e/i)*i,d=e/2,g=-Math.ceil(.5*s/r)*r;g<s/2;g+=r)h.push("M",this._x(t.x+u),this._y(t.y+g)),h.push("L",this._x(t.x+d),this._y(t.y+g));return a.setAttribute("d",h.join(" ")),this._bindFillDraw(a,"grid",n,1)}raster(t,e,s,i,r,n){const a=this.makeNode("path"),h=[];for(var o=-Math.ceil(.5*e/i)*i;o<e/2;o+=i)for(var l=-Math.ceil(.5*s/r)*r;l<s/2;l+=r)h.push("M",this._x(t.x+o)-4,this._y(t.y+l)),h.push("L",this._x(t.x+o)+4,this._y(t.y+l)),h.push("M",this._x(t.x+o),this._y(t.y+l)-4),h.push("L",this._x(t.x+o),this._y(t.y+l)+4);return a.setAttribute("d",h.join(" ")),this._bindFillDraw(a,"raster",n,1)}diamondHandle(t,e,s){const i=this.makeNode("path"),r=["M",this._x(t.x)-e/2,this._y(t.y),"L",this._x(t.x),this._y(t.y)-e/2,"L",this._x(t.x)+e/2,this._y(t.y),"L",this._x(t.x),this._y(t.y)+e/2,"Z"];return i.setAttribute("d",r.join(" ")),this._bindFillDraw(i,"diamondHandle",s,1)}squareHandle(t,e,s){const i=this.makeNode("rect");return i.setAttribute("x",""+(this._x(t.x)-e/2)),i.setAttribute("y",""+(this._y(t.y)-e/2)),i.setAttribute("width",`${e}`),i.setAttribute("height",`${e}`),this._bindFillDraw(i,"squareHandle",s,1)}circleHandle(t,e,s){e=e||3;const i=this.makeNode("circle");return i.setAttribute("cx",`${this._x(t.x)}`),i.setAttribute("cy",`${this._y(t.y)}`),i.setAttribute("r",`${e}`),this._bindFillDraw(i,"circleHandle",s,1)}crosshair(t,e,s,i){const r=this.makeNode("path"),n=["M",this._x(t.x)-e,this._y(t.y),"L",this._x(t.x)+e,this._y(t.y),"M",this._x(t.x),this._y(t.y)-e,"L",this._x(t.x),this._y(t.y)+e];return r.setAttribute("d",n.join(" ")),this._bindFillDraw(r,"crosshair",s,i||.5)}cross(t,e,s,i){const r=this.makeNode("path"),n=["M",this._x(t.x)-e,this._y(t.y)-e,"L",this._x(t.x)+e,this._y(t.y)+e,"M",this._x(t.x)-e,this._y(t.y)+e,"L",this._x(t.x)+e,this._y(t.y)-e];return r.setAttribute("d",n.join(" ")),this._bindFillDraw(r,"cross",s,i||1)}polygon(t,e,s,i){return this.polyline(t.vertices,t.isOpen,e,s,i)}polyline(t,e,s,i,r){const n=this.makeNode("path");if(this.applyStrokeOpts(n,r),0==t.length)return n;const a=["M",this._x(t[0].x),this._y(t[0].y)];for(var h=t.length,o=1;o<h;o++)a.push("L",this._x(t[o].x),this._y(t[o].y));return e||a.push("Z"),n.setAttribute("d",a.join(" ")),this._bindFillDraw(n,"polygon",s,i||1)}text(t,e,s,i){var r,n,a;const h=(i=i||{}).color||"black",o=(null!==(n=null!==(r=i.lineHeight)&&void 0!==r?r:i.fontSize)&&void 0!==n?n:0)*this.scale.x,l="left"===i.textAlign||"start"===i.textAlign?"start":"center"===i.textAlign?"middle":"right"===i.textAlign||"end"===i.textAlign?"end":"start",c=`${this._x(e)}px ${this._y(s)}px`,u=`translate(${this._x(e)} ${this._y(s)+o/2})`,d=i.rotation?`rotate(${i.rotation*x} 0 0)`:"",g=this.makeNode("g"),f=this.curId;this.curId=f+"_text";const v=this.makeNode("text");return g.appendChild(v),v.setAttribute("font-family",null!==(a=i.fontFamily)&&void 0!==a?a:""),v.setAttribute("font-size",i.fontSize?""+i.fontSize*this.scale.x:""),v.setAttribute("font-style",i.fontStyle?`${i.fontStyle}`:""),v.setAttribute("font-weight",i.fontWeight?`${i.fontWeight}`:""),v.setAttribute("text-anchor",l),v.setAttribute("transform-origin","0 0"),v.setAttribute("transform",d),g.setAttribute("transform-origin",c),g.setAttribute("transform",u),v.innerHTML=t,this.curId=f,this._bindFillDraw(g,"text",h,1)}label(t,e,s,i,r){const n=this.makeNode("text");return n.setAttribute("transform",`translate(${e},${s}), rotate(${(i||0)/Math.PI*180})`),n.setAttribute("font-family","Arial"),n.setAttribute("font-size","9pt"),n.setAttribute("font-style","normal"),n.setAttribute("font-weight","lighter"),n.innerHTML=t,this._bindFillDraw(n,"label",r||"black",null)}path(t,e,s,i){const r=this.makeNode("path");this.applyStrokeOpts(r,i);const n=i&&i.inplace?t:v.copyPathData(t);return v.transformPathData(n,this.offset,this.scale),r.setAttribute("d",n.join(" ")),this._bindFillDraw(r,"path",e,s)}clear(t){if(this.isSecondary)return;this.curId="background",this.curClassName=null;const e=this.makeNode("rect");e.setAttribute("x","0"),e.setAttribute("y","0"),e.setAttribute("width",`${this.canvasSize.width}`),e.setAttribute("height",`${this.canvasSize.height}`),this._bindFillDraw(e,this.curId,null,null),e.setAttribute("fill",void 0===t?"none":t),this.curId=null}removeAllChildNodes(){for(;this.bufferGNode.lastChild;)this.bufferGNode.removeChild(this.bufferGNode.lastChild);for(;this.bufferedNodeDefs.lastChild;)this.bufferedNodeDefs.removeChild(this.bufferedNodeDefs.lastChild)}static createSvg(){return document.createElementNS("http://www.w3.org/2000/svg","svg")}static copyPathData(t){const e=new Array(t.length);for(var s=0,i=t.length;s<i;s++)e[s]=t[s];return e}static transformPathData(t,e,s){const i=i=>{t[i]=e.x+s.x*Number(t[i])},r=i=>{t[i]=e.y+s.y*Number(t[i])},n=e=>{t[e]=s.x*Number(t[e])},a=e=>{t[e]=s.y*Number(t[e])};for(var h=0,o=e=>{Number(t[e]),Number(t[e+1])};h<t.length;){switch(t[h]){case"M":case"L":case"T":i(h+1),r(h+2),o(h+1),h+=3;break;case"m":case"l":case"t":n(h+1),a(h+2),o(h+1),h+=3;break;case"H":i(h+1),Number(t[h+1]),h+=2;break;case"h":n(h+1),Number(t[h+1]),h+=2;break;case"V":r(h+1),Number(t[h+1]),h+=2;break;case"v":a(h+1),Number(t[h+1]),h+=2;break;case"C":i(h+1),r(h+2),i(h+3),r(h+4),i(h+5),r(h+6),o(h+5),h+=7;break;case"c":n(h+1),a(h+2),n(h+3),a(h+4),n(h+5),a(h+6),o(h+5),h+=7;break;case"S":case"Q":i(h+1),r(h+2),i(h+3),r(h+4),o(h+3),h+=5;break;case"s":case"q":n(h+1),a(h+2),n(h+3),a(h+4),o(h+3),h+=5;break;case"A":n(h+1),a(h+2),i(h+6),r(h+7),o(h+6),(s.x<0&&s.y>=0||s.x>=0&&s.y<0)&&(t[h+5]=t[h+5]?0:1),h+=8;break;case"a":n(h+1),a(h+2),n(h+6),a(h+7),o(h+6),h+=8;break;default:h++}}}static nodeSupportsLineDash(t){return["line","path","circle","ellipse","rectangle","rect"].includes(t)}static nodeSupportsLineJoin(t){return["line","path","circle","ellipse","rectangle","rect"].includes(t)}makeLineNode(t,e,s,i,r,n){const a=this.makeNode("line");return a.setAttribute("x1",`${this._x(t.x)}`),a.setAttribute("y1",`${this._y(t.y)}`),a.setAttribute("x2",`${this._x(e.x)}`),a.setAttribute("y2",`${this._y(e.y)}`),this._configureNode(a,null!=n?n:"line",this.fillShapes,s,i||1,r),a}makePathNode(t,e,s,i,r){const n=this.makeNode("path");return n.setAttribute("d",t),this._configureNode(n,null!=r?r:"path",this.fillShapes,e,s||1,i),n}makeArrowHeadNode(t,e,s,i,r=8,n,a){var h=o.utils.buildArrowHead(t,e,r,this.scale.x,this.scale.y);const l=["M",this.offset.x+h[0].x,this.offset.y+h[0].y];a&&(a.x=h[0].x/this.scale.x,a.y=h[0].y/this.scale.y);for(var c=1;c<=h.length;c++)l.push("L"),l.push(this.offset.x+h[c%h.length].x),l.push(this.offset.y+h[c%h.length].y);return this.makePathNode(l.join(" "),s,i,n,"arrowhead")}makeCubicBezierNode(t,e,s,i,r,n,a){if(t instanceof d)return this.cubicBezier(t.startPoint,t.endPoint,t.startControlPoint,t.endControlPoint,r,n);const h=["M",this._x(t.x),this._y(t.y),"C",this._x(s.x),this._y(s.y),this._x(i.x),this._y(i.y),this._x(e.x),this._y(e.y)];return this.makePathNode(h.join(" "),r,n,a,"cubicBezier")}}v.HEAD_XML=['<?xml version="1.0" encoding="UTF-8" standalone="no"?>','<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" ',' "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">',""].join("\n");class y{constructor(t,e){this.ctx=t,this.offset=new a(0,0),this.scale=new a(1,1),this.fillShapes=e}applyStrokeOpts(t){var e,s,i;this.ctx.setLineDash((null!==(e=null==t?void 0:t.dashArray)&&void 0!==e?e:[]).map(t=>t*this.scale.x)),this.ctx.lineDashOffset=(null!==(s=null==t?void 0:t.dashOffset)&&void 0!==s?s:0)*this.scale.x,this.ctx.lineJoin=null!==(i=null==t?void 0:t.lineJoin)&&void 0!==i?i:null}_fillOrDraw(t){this.fillShapes?(this.ctx.fillStyle=t,this.ctx.fill()):(this.ctx.strokeStyle=t,this.ctx.stroke())}beginDrawCycle(t){}endDrawCycle(t){}setConfiguration(t){this.ctx.globalCompositeOperation=t.blendMode||"source-over"}setCurrentId(t){}setCurrentClassName(t){}line(t,e,s,i,r){this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(r),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+e.x*this.scale.x,this.offset.y+e.y*this.scale.y),this.ctx.strokeStyle=s,this.ctx.lineWidth=i||1,this.ctx.stroke(),this.ctx.restore()}arrow(t,e,s,i,r=8,n){const h=new a(0,0);this.arrowHead(t,e,s,i,r,void 0,h),this.line(t,h,s,i,n)}cubicBezierArrow(t,e,s,i,r,n,h,o){const l=new a(0,0);this.arrowHead(i,e,r,n,h,void 0,l);const c=l.difference(e);this.cubicBezier(t,{x:e.x-c.x,y:e.y-c.y},s,{x:i.x-c.x,y:i.y-c.y},r,n,o)}arrowHead(t,e,s,i,r=8,n,a){this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(n);var h=o.utils.buildArrowHead(t,e,r,this.scale.x,this.scale.y);a&&(a.x=h[0].x/this.scale.x,a.y=h[0].y/this.scale.y),this.ctx.moveTo(this.offset.x+h[0].x,this.offset.y+h[0].y);for(var l=0;l<h.length;l++)this.ctx.lineTo(this.offset.x+h[l].x,this.offset.y+h[l].y);this.ctx.lineTo(this.offset.x+h[0].x,this.offset.y+h[0].y),this.ctx.lineWidth=i||1,this._fillOrDraw(s),this.ctx.restore()}image(t,e,s,i=1){t.complete&&t.naturalWidth&&(this.ctx.save(),this.ctx.globalAlpha=i,this.ctx.drawImage(t,0,0,t.naturalWidth-1,t.naturalHeight-1,this.offset.x+e.x*this.scale.x,this.offset.y+e.y*this.scale.y,s.x*this.scale.x,s.y*this.scale.y),this.ctx.restore())}texturedPoly(t,e,s,i,r){var n=s.getBounds();new a(i.x,i.y).difference(n.getCenter());var h=new a(e.width,e.height),o=new a(e.min.x,e.min.y).sub(i);this.ctx.save(),this.ctx.translate(this.offset.x+i.x*this.scale.x,this.offset.y+i.y*this.scale.y),y.helpers.clipPoly(this.ctx,{x:-i.x*this.scale.x,y:-i.y*this.scale.y},this.scale,s.vertices),this.ctx.scale(this.scale.x,this.scale.y),this.ctx.rotate(r),this.ctx.drawImage(t,0,0,t.naturalWidth-1,t.naturalHeight-1,o.x,o.y,h.x,h.y),this.ctx.restore()}rect(t,e,s,i,r,n){this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(n),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+e)*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+e)*this.scale.x,this.offset.y+(t.y+s)*this.scale.y),this.ctx.lineTo(this.offset.x+t.x*this.scale.x,this.offset.y+(t.y+s)*this.scale.y),this.ctx.closePath(),this.ctx.lineWidth=r||1,this._fillOrDraw(i),this.ctx.restore()}cubicBezier(t,e,s,i,r,n,a){t instanceof d?this.cubicBezier(t.startPoint,t.endPoint,t.startControlPoint,t.endControlPoint,r,n):(this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(a),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.bezierCurveTo(this.offset.x+s.x*this.scale.x,this.offset.y+s.y*this.scale.y,this.offset.x+i.x*this.scale.x,this.offset.y+i.y*this.scale.y,this.offset.x+e.x*this.scale.x,this.offset.y+e.y*this.scale.y),this.ctx.lineWidth=n||2,this._fillOrDraw(r),this.ctx.restore())}quadraticBezier(t,e,s,i,r,n){this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(n),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.quadraticCurveTo(this.offset.x+e.x*this.scale.x,this.offset.y+e.y*this.scale.y,this.offset.x+s.x*this.scale.x,this.offset.y+s.y*this.scale.y),this.ctx.lineWidth=r||2,this._fillOrDraw(i),this.ctx.restore()}cubicBezierPath(t,e,s,i,r){if(t&&0!=t.length){var n,a,h;this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(i),this.ctx.moveTo(this.offset.x+t[0].x*this.scale.x,this.offset.y+t[0].y*this.scale.y);for(var o=1;o<t.length;o+=3)a=t[o],h=t[o+1],n=t[o+2],this.ctx.bezierCurveTo(this.offset.x+a.x*this.scale.x,this.offset.y+a.y*this.scale.y,this.offset.x+h.x*this.scale.x,this.offset.y+h.y*this.scale.y,this.offset.x+n.x*this.scale.x,this.offset.y+n.y*this.scale.y);r||this.ctx.closePath(),this.ctx.lineWidth=s||1,this._fillOrDraw(e),this.ctx.restore()}}handle(t,e){this.point(t,"rgb(0,32,192)"),this.square(e,5,"rgba(0,128,192,0.5)")}handleLine(t,e){this.line(t,e,"rgba(128,128,128, 0.5)",void 0)}dot(t,e){this.ctx.save(),this.ctx.beginPath(),this.ctx.setLineDash([]),this.ctx.moveTo(Math.round(this.offset.x+this.scale.x*t.x),Math.round(this.offset.y+this.scale.y*t.y)),this.ctx.lineTo(Math.round(this.offset.x+this.scale.x*t.x+1),Math.round(this.offset.y+this.scale.y*t.y+1)),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(e),this.ctx.restore()}point(t,e){this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.arc(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,3,0,2*Math.PI,!1),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(e)}circle(t,e,s,i,r){this.applyStrokeOpts(r),this.ctx.beginPath(),this.ctx.ellipse(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,e*this.scale.x,e*this.scale.y,0,0,2*Math.PI),this.ctx.closePath(),this.ctx.lineWidth=i||1,this._fillOrDraw(s)}circleArc(t,e,s,i,r,n,a){a&&a.asSegment||this.ctx.beginPath(),this.applyStrokeOpts(a),this.ctx.ellipse(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,e*this.scale.x,e*this.scale.y,0,s,i,!1),a&&a.asSegment||(this.ctx.lineWidth=n||1,this._fillOrDraw(r||"#000000"))}ellipse(t,e,s,i,r,n,a){void 0===n&&(n=0),this.applyStrokeOpts(a),this.ctx.beginPath(),this.ctx.ellipse(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,e*this.scale.x,s*this.scale.y,n,0,2*Math.PI),this.ctx.closePath(),this.ctx.lineWidth=r||1,this._fillOrDraw(i)}square(t,e,s,i,r){this.applyStrokeOpts(r),this.ctx.beginPath(),this.ctx.rect(this.offset.x+(t.x-e/2)*this.scale.x,this.offset.y+(t.y-e/2)*this.scale.y,e*this.scale.x,e*this.scale.y),this.ctx.closePath(),this.ctx.lineWidth=i||1,this._fillOrDraw(s)}grid(t,e,s,i,r,n){this.ctx.setLineDash([]),this.ctx.beginPath();for(var a=-Math.ceil(.5*s/r)*r,h=s/2,o=-Math.ceil(.5*e/i)*i;o<e/2;o+=i)this.ctx.moveTo(this.offset.x+(t.x+o)*this.scale.x,this.offset.y+(t.y+a)*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+o)*this.scale.x,this.offset.y+(t.y+h)*this.scale.y);for(var l=-Math.ceil(.5*e/i)*i,c=e/2,u=-Math.ceil(.5*s/r)*r;u<s/2;u+=r)this.ctx.moveTo(this.offset.x+(t.x+l)*this.scale.x-4,this.offset.y+(t.y+u)*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+c)*this.scale.x+4,this.offset.y+(t.y+u)*this.scale.y);this.ctx.strokeStyle=n,this.ctx.lineWidth=1,this.ctx.stroke(),this.ctx.closePath()}raster(t,e,s,i,r,n){this.ctx.save(),this.ctx.setLineDash([]),this.ctx.beginPath();for(var a=-Math.ceil(.5*e/i)*i;a<e/2;a+=i)for(var h=-Math.ceil(.5*s/r)*r;h<s/2;h+=r)this.ctx.moveTo(this.offset.x+(t.x+a)*this.scale.x-4,this.offset.y+(t.y+h)*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+a)*this.scale.x+4,this.offset.y+(t.y+h)*this.scale.y),this.ctx.moveTo(this.offset.x+(t.x+a)*this.scale.x,this.offset.y+(t.y+h)*this.scale.y-4),this.ctx.lineTo(this.offset.x+(t.x+a)*this.scale.x,this.offset.y+(t.y+h)*this.scale.y+4);this.ctx.strokeStyle=n,this.ctx.lineWidth=1,this.ctx.stroke(),this.ctx.closePath(),this.ctx.restore()}diamondHandle(t,e,s){this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.moveTo(this.offset.x+t.x*this.scale.x-e/2,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y-e/2),this.ctx.lineTo(this.offset.x+t.x*this.scale.x+e/2,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y+e/2),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(s)}squareHandle(t,e,s){this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.rect(this.offset.x+t.x*this.scale.x-e/2,this.offset.y+t.y*this.scale.y-e/2,e,e),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(s)}circleHandle(t,e,s){e=e||3,this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.arc(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,e,0,2*Math.PI,!1),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(s)}crosshair(t,e,s,i){this.ctx.save(),this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.moveTo(this.offset.x+t.x*this.scale.x-e,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+t.x*this.scale.x+e,this.offset.y+t.y*this.scale.y),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y-e),this.ctx.lineTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y+e),this.ctx.strokeStyle=s,this.ctx.lineWidth=i||.5,this.ctx.stroke(),this.ctx.closePath(),this.ctx.restore()}cross(t,e,s,i){this.ctx.save(),this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.moveTo(this.offset.x+t.x*this.scale.x-e,this.offset.y+t.y*this.scale.y-e),this.ctx.lineTo(this.offset.x+t.x*this.scale.x+e,this.offset.y+t.y*this.scale.y+e),this.ctx.moveTo(this.offset.x+t.x*this.scale.x-e,this.offset.y+t.y*this.scale.y+e),this.ctx.lineTo(this.offset.x+t.x*this.scale.x+e,this.offset.y+t.y*this.scale.y-e),this.ctx.strokeStyle=s,this.ctx.lineWidth=i||1,this.ctx.stroke(),this.ctx.closePath(),this.ctx.restore()}polygon(t,e,s,i){this.polyline(t.vertices,t.isOpen,e,s,i)}polyline(t,e,s,i,r){if(!(t.length<=1)){this.ctx.save(),this.applyStrokeOpts(r),this.ctx.beginPath(),this.ctx.lineWidth=i||1,this.ctx.moveTo(this.offset.x+t[0].x*this.scale.x,this.offset.y+t[0].y*this.scale.y);for(var n=0;n<t.length;n++)this.ctx.lineTo(this.offset.x+t[n].x*this.scale.x,this.offset.y+t[n].y*this.scale.y);e||this.ctx.closePath(),this._fillOrDraw(s),this.ctx.closePath(),this.ctx.setLineDash([]),this.ctx.restore()}}text(t,e,s,i){var r,n,a;i=i||{},this.ctx.save();let h=this.offset.x+e*this.scale.x,o=this.offset.y+s*this.scale.y;const l=i.color||"black";(i.fontSize||i.fontFamily)&&(this.ctx.font=(i.fontWeight?i.fontWeight+" ":"")+(i.fontStyle?i.fontStyle+" ":"")+(i.fontSize?i.fontSize*this.scale.x+"px ":" ")+(i.fontFamily?-1===i.fontFamily.indexOf(" ")?i.fontFamily:`"${i.fontFamily}"`:"Arial")),i.textAlign&&(this.ctx.textAlign=i.textAlign);const c=null!==(r=i.rotation)&&void 0!==r?r:0,u=(null!==(a=null!==(n=i.lineHeight)&&void 0!==n?n:i.fontSize)&&void 0!==a?a:0)*this.scale.x;this.ctx.translate(h,o),this.ctx.rotate(c),this.fillShapes?(this.ctx.fillStyle=l,this.ctx.fillText(t,0,u/2)):(this.ctx.strokeStyle=l,this.ctx.strokeText(t,0,u/2)),this.ctx.restore()}label(t,e,s,i,r){this.ctx.save(),this.ctx.font="lighter 9pt Arial",this.ctx.translate(e,s),void 0!==i&&this.ctx.rotate(i),this.ctx.fillStyle=r||"black",this.fillShapes?this.ctx.fillText(t,0,0):this.ctx.strokeText(t,0,0),this.ctx.restore()}path(t,e,s,i){const r=i&&i.inplace?t:v.copyPathData(t);v.transformPathData(r,this.offset,this.scale),e&&(this.ctx.strokeStyle=e),this.ctx.lineWidth=s||1,this.applyStrokeOpts(i),this.fillShapes?(e&&(this.ctx.fillStyle=e),this.ctx.fill(new Path2D(r.join(" ")))):(e&&(this.ctx.strokeStyle=e),this.ctx.stroke(new Path2D(r.join(" "))))}clear(t){this.ctx.clearRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height),this.ctx.fillStyle=t,this.ctx.fillRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height)}}y.helpers={clipPoly:(t,e,s,i)=>{t.beginPath(),t.moveTo(e.x+i[0].x*s.x,e.y+i[0].y*s.y);for(var r=1;r<i.length;r++){const n=i[r];t.lineTo(e.x+n.x*s.x,e.y+n.y*s.y)}t.closePath(),t.clip()}};class p{constructor(t,e){this.gl=t,this.offset=new a(0,0),this.scale=new a(1,1),this.fillShapes=e,this._zindex=0,null!=t&&void 0!==t&&(this.glutils=new m(t),this._vertShader=this.glutils.compileShader(p.vertCode,this.gl.VERTEX_SHADER),this._fragShader=this.glutils.compileShader(p.fragCode,this.gl.FRAGMENT_SHADER),this._program=this.glutils.makeProgram(this._vertShader,this._fragShader),this.vertex_buffer=this.gl.createBuffer(),console.log("gl initialized"))}_x2rel(t){return(this.scale.x*t+this.offset.x)/this.gl.canvas.width*2-1}_y2rel(t){return(this.offset.y-this.scale.y*t)/this.gl.canvas.height*2-1}copyInstance(t){var e=new p(null,t);return e.gl=this.gl,e.glutils=this.glutils,e._vertShader=this._vertShader,e._fragShader=this._fragShader,e._program=this._program,e}beginDrawCycle(t){this._zindex=0,this.renderTime=t}endDrawCycle(t){}setConfiguration(t){}setCurrentId(t){this.curId=t}setCurrentClassName(t){}line(t,e,s){const i=new Float32Array(6);i[0]=this._x2rel(t.x),i[1]=this._y2rel(t.y),i[2]=this._zindex,i[3]=this._x2rel(e.x),i[4]=this._y2rel(e.y),i[5]=this._zindex,this._zindex+=.001,this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.vertex_buffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,i,this.gl.STATIC_DRAW);var r=this.gl.getAttribLocation(this._program,"position");this.gl.vertexAttribPointer(r,3,this.gl.FLOAT,!1,0,0),this.gl.enableVertexAttribArray(r),this.gl.viewport(0,0,this.gl.canvas.width,this.gl.canvas.height);let n=this.gl.getUniformLocation(this._program,"uRotationVector");this.gl.uniform2fv(n,[0,1]),this.gl.lineWidth(5),this.gl.drawArrays(this.gl.LINES,0,i.length/3)}arrow(t,e,s){}cubicBezierArrow(t,e,s,i,r,n,a){}arrowHead(t,e,s,i,r){}image(t,e,s,i=0){}texturedPoly(t,e,s,i,r){}_fillOrDraw(t){}cubicBezier(t,e,s,i,r,n){}cubicBezierPath(t,e,s,i,r){}handle(t,e){}handleLine(t,e){}dot(t,e){}point(t,e){}circle(t,e,s,i){}circleArc(t,e,s,i,r,n){}ellipse(t,e,s,i,r,n){}square(t,e,s,i){}rect(t,e,s,i,r){}grid(t,e,s,i,r,n){}raster(t,e,s,i,r,n){}diamondHandle(t,e,s){}squareHandle(t,e,s){}circleHandle(t,e,s){}crosshair(t,e,s,i){}cross(t,e,s,i){}polygon(t,e,s){const i=new Float32Array(3*t.vertices.length);for(var r=0;r<t.vertices.length;r++)i[3*r+0]=this._x2rel(t.vertices[r].x),i[3*r+1]=this._y2rel(t.vertices[r].y),i[3*r+2]=this._zindex;this._zindex+=.001,this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.vertex_buffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,i,this.gl.STATIC_DRAW);var n=this.gl.getAttribLocation(this._program,"position");this.gl.vertexAttribPointer(n,3,this.gl.FLOAT,!1,0,0),this.gl.enableVertexAttribArray(n),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,null),this.gl.viewport(0,0,this.gl.canvas.width,this.gl.canvas.height);let a=this.gl.getUniformLocation(this._program,"uRotationVector");this.gl.uniform2fv(a,[0,1]),this.gl.drawArrays(this.gl.TRIANGLE_FAN,0,i.length/3)}polyline(t,e,s,i){}text(t,e,s,i){}label(t,e,s,i,r){}path(t,e,s,i){}clear(t){this.gl.clearColor(1,1,1,1),this.gl.enable(this.gl.DEPTH_TEST),this.gl.clear(this.gl.COLOR_BUFFER_BIT|this.gl.DEPTH_BUFFER_BIT)}}p.vertCode="\n precision mediump float;\n\n attribute vec3 position;\n\n uniform vec2 uRotationVector;\n\n void main(void) {\n\tvec2 rotatedPosition = vec2(\n\t position.x * uRotationVector.y +\n\t\tposition.y * uRotationVector.x,\n\t position.y * uRotationVector.y -\n\t\tposition.x * uRotationVector.x\n\t);\n\n\tgl_Position = vec4(rotatedPosition, position.z, 1.0);\n }",p.fragCode="\n precision highp float;\n\n void main(void) {\n\tgl_FragColor = vec4(0.0,0.75,1.0,1.0);\n }";class m{constructor(t){this.gl=t}bufferData(t){var e=this.gl.createBuffer();return this.gl.bindBuffer(this.gl.ARRAY_BUFFER,e),this.gl.bufferData(this.gl.ARRAY_BUFFER,t,this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,null),e}compileShader(t,e){var s=this.gl.createShader(e);this.gl.shaderSource(s,t),this.gl.compileShader(s);return this.gl.getShaderParameter(s,this.gl.COMPILE_STATUS)?s:(console.warn("Error in shader:"+this.gl.getShaderInfoLog(s)),this.gl.deleteShader(s),null)}makeProgram(t,e){var s=this.gl.createProgram();return this.gl.attachShader(s,t),this.gl.attachShader(s,e),this.gl.linkProgram(s),this.gl.useProgram(s),this.gl.detachShader(s,t),this.gl.detachShader(s,e),this.gl.deleteShader(t),this.gl.deleteShader(e),s}}class b{constructor(t,e){this.center=t,this.size=e}}b.utils={baseLog:(t,e)=>Math.log(t)/Math.log(e),mapRasterScale:(t,e)=>{var s=1;return e>=1?(s=Math.abs(Math.floor(1/b.utils.baseLog(t,e))),s=1/Math.pow(t,s)):s=Math.abs(Math.floor(b.utils.baseLog(1/t,1/(e+1)))),s}};class w{constructor(t){this.downListeners=[],this.pressListeners=[],this.upListeners=[],this.keyStates={},t=t||{},this.element=t.element?t.element:globalThis,this.downListeners=[],this.pressListeners=[],this.upListeners=[],this.keyStates=[],this.trackAllKeys=t.trackAll||!1,this.installListeners()}fireEvent(t,e){let s=!1;for(var i in e){var r=e[i];r.keyCode==t.keyCode&&(r.listener(t),s=!0)}return s}fireDownEvent(t,e){(e.fireEvent(t,e.downListeners)||e.trackAllKeys)&&(e.keyStates[t.keyCode]="down")}firePressEvent(t,e){e.fireEvent(t,e.pressListeners)}fireUpEvent(t,e){(e.fireEvent(t,e.upListeners)||e.trackAllKeys)&&delete e.keyStates[t.keyCode]}static key2code(t){if("number"==typeof t)return t;if("string"!=typeof t)throw"Unknown key name or key type (should be a string or integer): "+t;if(w.KEY_CODES[t])return w.KEY_CODES[t];throw"Unknown key (cannot resolve key code): "+t}installListeners(){var t=this;this.element.addEventListener("keydown",this._keyDownListener=e=>{t.fireDownEvent(e,t)}),this.element.addEventListener("keypress",this._keyPressListener=e=>{t.firePressEvent(e,t)}),this.element.addEventListener("keyup",this._keyUpListener=e=>{t.fireUpEvent(e,t)})}releaseListeners(){this.element.removeEventListener("keydown",this._keyDownListener),this.element.removeEventListener("keypress",this._keyPressListener),this.element.removeEventListener("keyup",this._keyUpListener)}down(t,e){return this.downListeners.push({key:t,keyCode:w.key2code(t),listener:e}),this}press(t,e){return this.pressListeners.push({key:t,keyCode:w.key2code(t),listener:e}),this}up(t,e){return this.upListeners.push({key:t,keyCode:w.key2code(t),listener:e}),this}isDown(t){return"number"==typeof t?!!this.keyStates[t]:!!this.keyStates[w.key2code(t)]}destroy(){this.releaseListeners()}}w.KEY_CODES={break:3,backspace:8,tab:9,clear:12,enter:13,shift:16,ctrl:17,alt:18,pause:19,capslock:20,hangul:21,hanja:25,escape:27,conversion:28,"non-conversion":29,spacebar:32,pageup:33,pagedown:34,end:35,home:36,leftarrow:37,uparrow:38,rightarrow:39,downarrow:40,select:41,print:42,execute:43,printscreen:44,insert:45,delete:46,help:47,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,":":58,"semicolon (firefox)":59,equals:59,"<":60,"equals (firefox)":61,"ß":63,"@ (firefox)":64,a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,windows:91,leftcommand:91,chromebooksearch:91,rightwindowkey:92,windowsmenu:93,rightcommant:93,sleep:95,numpad0:96,numpad1:97,numpad2:98,numpad3:99,numpad4:100,numpad5:101,numpad6:102,numpad7:103,numpad8:104,numpad9:105,multiply:106,add:107,numpadperiod:108,subtract:109,decimalpoint:110,divide:111,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,f13:124,f14:125,f15:126,f16:127,f17:128,f18:129,f19:130,f20:131,f21:132,f22:133,f23:134,f24:135,numlock:144,scrolllock:145,"^":160,"!":161,"#":163,$:164,"ù":165,pagebackward:166,pageforward:167,refresh:168,closingparen:169,"*":170,"~+*":171,minus:173,decreasevolumelevel:174,increasevolumelevel:175,next:176,previous:177,stop:178,"play/pause":179,email:180,mute:181,unmute:181,semicolon:186,"ñ":186,equal:187,comma:188,dash:189,period:190,forwardslash:191,"ç":191,"grave accent":192,"æ":192,"ö":192,"?":193,"/":193,"°":193,openbracket:219,backslash:220,closebracket:221,"å":221,singlequote:222,"ø":222,"ä":222,"`":223,altgr:225,"GNOME Compose Key":230,XF86Forward:233,XF86Back:234,alphanumeric:240,hiragana:242,katakana:242,"half-width":243,"full-width":243,kanji:244,unlocktrackpad:251,toggletouchpad:255};class C extends MouseEvent{}class P extends WheelEvent{}class A{constructor(t,e){this.mouseDownPos=void 0,this.mouseDragPos=void 0,this.mouseButton=-1,this.listeners={},this.installed={},this.handlers={},this.name=e,this.element=t,this.mouseDownPos=void 0,this.mouseDragPos=void 0,this.mouseButton=-1,this.listeners={},this.installed={},this.handlers={};const s=this;this.handlers.mousemove=t=>{s.listeners.mousemove&&s.listeners.mousemove(s.mkParams(t,"mousemove")),s.mouseDragPos&&s.listeners.drag&&s.listeners.drag(s.mkParams(t,"drag")),s.mouseDownPos&&(s.mouseDragPos=s.relPos(t))},this.handlers.mouseup=t=>{s.listeners.mouseup&&s.listeners.mouseup(s.mkParams(t,"mouseup")),s.mouseDragPos=void 0,s.mouseDownPos=void 0,s.mouseButton=-1},this.handlers.mousedown=t=>{s.mouseDragPos=s.relPos(t),s.mouseDownPos=s.relPos(t),s.mouseButton=t.button,s.listeners.mousedown&&s.listeners.mousedown(s.mkParams(t,"mousedown"))},this.handlers.click=t=>{s.listeners.click&&s.listeners.click(s.mkParams(t,"click"))},this.handlers.wheel=t=>{s.listeners.wheel&&s.listeners.wheel(s.mkParams(t,"wheel"))},this.element.addEventListener("mousemove",this.handlers.mousemove),this.element.addEventListener("mouseup",this.handlers.mouseup),this.element.addEventListener("mousedown",this.handlers.mousedown),this.element.addEventListener("click",this.handlers.click),this.element.addEventListener("wheel",this.handlers.wheel)}relPos(t){return{x:t.offsetX,y:t.offsetY}}mkParams(t,e){var s,i;const r=this.relPos(t),n=t;return n.params={element:this.element,name:e,isTouchEvent:!1,pos:r,button:t.button,leftButton:0===t.button,middleButton:1===t.button,rightButton:2===t.button,mouseDownPos:null!==(s=this.mouseDownPos)&&void 0!==s?s:{x:NaN,y:NaN},draggedFrom:null!==(i=this.mouseDragPos)&&void 0!==i?i:{x:NaN,y:NaN},wasDragged:null!=this.mouseDownPos&&(this.mouseDownPos.x!=r.x||this.mouseDownPos.y!=r.y),dragAmount:null!=this.mouseDragPos?{x:r.x-this.mouseDragPos.x,y:r.y-this.mouseDragPos.y}:{x:0,y:0}},n}listenFor(t){this.installed[t]||(this.installed[t]=!0)}unlistenFor(t){this.installed[t]&&delete this.installed[t]}drag(t){return this.listeners.drag&&this.throwAlreadyInstalled("drag"),this.listeners.drag=t,this.listenFor("mousedown"),this.listenFor("mousemove"),this.listenFor("mouseup"),this}move(t){return this.listeners.mousemove&&this.throwAlreadyInstalled("mousemove"),this.listenFor("mousemove"),this.listeners.mousemove=t,this}up(t){return this.listeners.mouseup&&this.throwAlreadyInstalled("mouseup"),this.listenFor("mouseup"),this.listeners.mouseup=t,this}down(t){return this.listeners.mousedown&&this.throwAlreadyInstalled("mousedown"),this.listenFor("mousedown"),this.listeners.mousedown=t,this}click(t){return this.listeners.click&&this.throwAlreadyInstalled("click"),this.listenFor("click"),this.listeners.click=t,this}wheel(t){return this.listeners.wheel&&this.throwAlreadyInstalled("wheel"),this.listenFor("wheel"),this.listeners.wheel=t,this}throwAlreadyInstalled(t){throw`This MouseHandler already has a '${t}' callback. To keep the code simple there is only room for one.`}destroy(){this.unlistenFor("mousedown"),this.unlistenFor("mousemove"),this.unlistenFor("moseup"),this.unlistenFor("click"),this.unlistenFor("wheel"),this.element.removeEventListener("mousemove",this.handlers.mousemove),this.element.removeEventListener("mouseup",this.handlers.mousedown),this.element.removeEventListener("mousedown",this.handlers.mousedown),this.element.removeEventListener("click",this.handlers.click),this.element.removeEventListener("wheel",this.handlers.wheel)}}class S{constructor(t,s,i){this.className="PBImage",this.uid=e.next(),this.image=t,this.upperLeft=s,this.lowerRight=i}destroy(){this.upperLeft.destroy(),this.lowerRight.destroy(),this.isDestroyed=!0}}class T{constructor(t,s,i){this.className="PBText",this.uid=e.next(),this.text=t,this.anchor=null!=s?s:new a,this.color=null==i?void 0:i.color,this.fontFamily=null==i?void 0:i.fontFamily,this.fontSize=null==i?void 0:i.fontSize,this.fontStyle=null==i?void 0:i.fontStyle,this.fontWeight=null==i?void 0:i.fontWeight,this.lineHeight=null==i?void 0:i.lineHeight,this.textAlign=null==i?void 0:i.textAlign,this.rotation=null==i?void 0:i.rotation}destroy(){this.anchor.destroy(),this.isDestroyed=!0}}const M=t=>Math.sqrt(t.x*t.x+t.y*t.y),_=(t,e)=>{var s=((t,e)=>{const s=M(t)*M(e);if(0===s)return 0;var i=((t,e)=>t.x*e.x+t.y*e.y)(t,e)/s;return i>1&&(i=1),Math.acos(i)})(t,e);return((t,e)=>t.x*e.y-e.x*t.y)(t,e)>0&&(s*=-1),180*s/Math.PI};class N{constructor(t){this.handlers=[],this.el=t}add(t){this.handlers.push(t)}del(t){t||(this.handlers=[]);for(var e=this.handlers.length;e>=0;e--)this.handlers[e]===t&&this.handlers.splice(e,1)}dispatch(...t){for(var e=0,s=this.handlers.length;e<s;e++){const t=this.handlers[e];"function"==typeof t&&t.apply(this.el,arguments)}}}const z=(t,e)=>{const s=new N(t);return s.add(e),s};class L{constructor(t,e){this.element="string"==typeof t?document.querySelector(t):t,this.start=this.start.bind(this),this.move=this.move.bind(this),this.end=this.end.bind(this),this.cancel=this.cancel.bind(this),this.element.addEventListener("touchstart",this.start,!1),this.element.addEventListener("touchmove",this.move,!1),this.element.addEventListener("touchend",this.end,!1),this.element.addEventListener("touchcancel",this.cancel,!1),this.preV={x:null,y:null},this.pinchStartLen=null,this.zoom=1,this.isDoubleTap=!1;const s=()=>{};this.rotate=z(this.element,e.rotate||s),this.touchStart=z(this.element,e.touchStart||s),this.multipointStart=z(this.element,e.multipointStart||s),this.multipointEnd=z(this.element,e.multipointEnd||s),this.pinch=z(this.element,e.pinch||s),this.swipe=z(this.element,e.swipe||s),this.tap=z(this.element,e.tap||s),this.doubleTap=z(this.element,e.doubleTap||s),this.longTap=z(this.element,e.longTap||s),this.singleTap=z(this.element,e.singleTap||s),this.pressMove=z(this.element,e.pressMove||s),this.twoFingerPressMove=z(this.element,e.twoFingerPressMove||s),this.touchMove=z(this.element,e.touchMove||s),this.touchEnd=z(this.element,e.touchEnd||s),this.touchCancel=z(this.element,e.touchCancel||s),this._cancelAllHandler=this.cancelAll.bind(this),globalThis&&"function"==typeof globalThis.addEventListener&&globalThis.addEventListener("scroll",this._cancelAllHandler),this.delta=null,this.last=null,this.now=null,this.tapTimeout=null,this.singleTapTimeout=null,this.longTapTimeout=null,this.swipeTimeout=null,this.x1=this.x2=this.y1=this.y2=null,this.preTapPosition={x:null,y:null}}start(t){if(!t.touches)return;const e=this;this.now=Date.now(),this.x1=t.touches[0].pageX,this.y1=t.touches[0].pageY,this.delta=this.now-(this.last||this.now),this.touchStart.dispatch(t,this.element),null!==this.preTapPosition.x&&(this.isDoubleTap=this.delta>0&&this.delta<=250&&Math.abs(this.preTapPosition.x-this.x1)<30&&Math.abs(this.preTapPosition.y-this.y1)<30,this.isDoubleTap&&clearTimeout(this.singleTapTimeout)),this.preTapPosition.x=this.x1,this.preTapPosition.y=this.y1,this.last=this.now;const s=this.preV;if(t.touches.length>1){this._cancelLongTap(),this._cancelSingleTap();const e={x:t.touches[1].pageX-this.x1,y:t.touches[1].pageY-this.y1};s.x=e.x,s.y=e.y,this.pinchStartLen=M(s),this.multipointStart.dispatch(t,this.element)}this._preventTap=!1,this.longTapTimeout=setTimeout((()=>{e.longTap.dispatch(t,e.element),e._preventTap=!0}).bind(e),750)}move(t){if(!t.touches)return;const e=t,s=this.preV,i=t.touches.length,r=t.touches[0].pageX,n=t.touches[0].pageY;if(this.isDoubleTap=!1,i>1){const t=e.touches[1].pageX,i=e.touches[1].pageY,a={x:e.touches[1].pageX-r,y:e.touches[1].pageY-n};null!==s.x&&(this.pinchStartLen>0&&(e.zoom=M(a)/this.pinchStartLen,this.pinch.dispatch(e,this.element)),e.angle=_(a,s),this.rotate.dispatch(e,this.element)),s.x=a.x,s.y=a.y,null!==this.x2&&null!==this.sx2?(e.deltaX=(r-this.x2+t-this.sx2)/2,e.deltaY=(n-this.y2+i-this.sy2)/2):(e.deltaX=0,e.deltaY=0),this.twoFingerPressMove.dispatch(e,this.element),this.sx2=t,this.sy2=i}else{if(null!==this.x2){e.deltaX=r-this.x2,e.deltaY=n-this.y2;const t=Math.abs(this.x1-this.x2),s=Math.abs(this.y1-this.y2);(t>10||s>10)&&(this._preventTap=!0)}else e.deltaX=0,e.deltaY=0;this.pressMove.dispatch(e,this.element)}this.touchMove.dispatch(e,this.element),this._cancelLongTap(),this.x2=r,this.y2=n,i>1&&t.preventDefault()}end(t){if(!t.changedTouches)return;const e=t;this._cancelLongTap();const s=this;e.touches.length<2&&(this.multipointEnd.dispatch(e,this.element),this.sx2=this.sy2=null),this.x2&&Math.abs(this.x1-this.x2)>30||this.y2&&Math.abs(this.y1-this.y2)>30?(e.direction=this._swipeDirection(this.x1,this.x2,this.y1,this.y2),this.swipeTimeout=setTimeout(function(){s.swipe.dispatch(e,s.element)},0)):(this.tapTimeout=setTimeout(function(){s._preventTap||s.tap.dispatch(e,s.element),s.isDoubleTap&&(s.doubleTap.dispatch(e,s.element),s.isDoubleTap=!1)},0),s.isDoubleTap||(s.singleTapTimeout=setTimeout(function(){s.singleTap.dispatch(e,s.element)},250))),this.touchEnd.dispatch(e,this.element),this.preV.x=0,this.preV.y=0,this.zoom=1,this.pinchStartLen=null,this.x1=this.x2=this.y1=this.y2=null}cancelAll(){this._preventTap=!0,clearTimeout(this.singleTapTimeout),clearTimeout(this.tapTimeout),clearTimeout(this.longTapTimeout),clearTimeout(this.swipeTimeout)}cancel(t){this.cancelAll(),this.touchCancel.dispatch(t,this.element)}_cancelLongTap(){clearTimeout(this.longTapTimeout)}_cancelSingleTap(){clearTimeout(this.singleTapTimeout)}_swipeDirection(t,e,s,i){return Math.abs(t-e)>=Math.abs(s-i)?t-e>0?"Left":"Right":s-i>0?"Up":"Down"}on(t,e){if(this[t]){this[t].add(e)}}off(t,e){if(this[t]){this[t].del(e)}}destroy(){this.singleTapTimeout&&clearTimeout(this.singleTapTimeout),this.tapTimeout&&clearTimeout(this.tapTimeout),this.longTapTimeout&&clearTimeout(this.longTapTimeout),this.swipeTimeout&&clearTimeout(this.swipeTimeout),this.element.removeEventListener("touchstart",this.start),this.element.removeEventListener("touchmove",this.move),this.element.removeEventListener("touchend",this.end),this.element.removeEventListener("touchcancel",this.cancel),this.rotate.del(),this.touchStart.del(),this.multipointStart.del(),this.multipointEnd.del(),this.pinch.del(),this.swipe.del(),this.tap.del(),this.doubleTap.del(),this.longTap.del(),this.singleTap.del(),this.pressMove.del(),this.twoFingerPressMove.del(),this.touchMove.del(),this.touchEnd.del(),this.touchCancel.del(),this.preV=this.pinchStartLen=this.zoom=this.isDoubleTap=this.delta=this.last=this.now=this.tapTimeout=this.singleTapTimeout=this.longTapTimeout=this.swipeTimeout=this.x1=this.x2=this.y1=this.y2=this.preTapPosition=this.rotate=this.touchStart=this.multipointStart=this.multipointEnd=this.pinch=this.swipe=this.tap=this.doubleTap=this.longTap=this.singleTap=this.pressMove=this.touchMove=this.touchEnd=this.touchCancel=this.twoFingerPressMove=null,globalThis&&"function"==typeof globalThis.removeEventListener&&globalThis.removeEventListener("scroll",this._cancelAllHandler)}}class D{constructor(t,s,i){this.className="VEllipse",this.uid=e.next(),this.center=t,this.axis=s,this.rotation=i||0}clone(){return new D(this.center.clone(),this.axis.clone(),this.rotation)}radiusH(){return Math.abs(this.signedRadiusH())}signedRadiusH(){return new a(this.axis).rotate(-this.rotation,this.center).x-this.center.x}radiusV(){return Math.abs(this.signedRadiusV())}signedRadiusV(){return new a(this.axis).rotate(-this.rotation,this.center).y-this.center.y}getExtremePoints(){const t=this.radiusH(),e=this.radiusV(),s=Math.atan2(-e*Math.sin(this.rotation),t*Math.cos(this.rotation)),i=s+Math.PI,r=this.center.x+t*Math.cos(s)*Math.cos(this.rotation)-e*Math.sin(s)*Math.sin(this.rotation),n=this.center.y+t*Math.cos(s)*Math.sin(this.rotation)+e*Math.sin(s)*Math.cos(this.rotation),h=this.center.x+t*Math.cos(i)*Math.cos(this.rotation)-e*Math.sin(i)*Math.sin(this.rotation),o=this.center.y+t*Math.cos(i)*Math.sin(this.rotation)+e*Math.sin(i)*Math.cos(this.rotation);let l,c;r>h?(l=new a(r,n),c=new a(h,o)):(l=new a(h,o),c=new a(r,n));const u=Math.atan2(e*Math.cos(this.rotation),t*Math.sin(this.rotation)),d=u+Math.PI,g=this.center.x+t*Math.cos(u)*Math.cos(this.rotation)-e*Math.sin(u)*Math.sin(this.rotation),f=this.center.y+t*Math.cos(u)*Math.sin(this.rotation)+e*Math.sin(u)*Math.cos(this.rotation),x=this.center.x+t*Math.cos(d)*Math.cos(this.rotation)-e*Math.sin(d)*Math.sin(this.rotation),v=this.center.y+t*Math.cos(d)*Math.sin(this.rotation)+e*Math.sin(d)*Math.cos(this.rotation);let y,p;return f>v?(y=new a(g,f),p=new a(x,v)):(y=new a(x,v),p=new a(g,f)),[l,c,y,p]}getBounds(){const t=this.radiusH(),e=this.radiusV(),s=t*Math.cos(this.rotation),i=t*Math.sin(this.rotation),r=e*Math.cos(this.rotation+Math.PI/2),n=e*Math.sin(this.rotation+Math.PI/2),a=Math.sqrt(s*s+r*r),h=Math.sqrt(i*i+n*n);return new u({x:this.center.x-a,y:this.center.y-h},{x:this.center.x+a,y:this.center.y+h})}move(t){return this.center.add(t),this.axis.add(t),this}scale(t){return this.axis.scale(t,this.center),this}rotate(t){return this.axis.rotate(t,this.center),this.rotation+=t,this}vertAt(t){const e=this.radiusH(),s=this.radiusV();return new a(D.utils.polarToCartesian(this.center.x,this.center.y,e,s,t)).rotate(this.rotation,this.center)}normalAt(t,e){const s=this.vertAt(t-this.rotation),i=this.getFoci(),r=new l(s,i[0]).angle(),n=r+(new l(s,i[1]).angle()-r)/2,a=s.clone().addX(50).clone().rotate(n,s),h=s.clone().addX(50).clone().rotate(Math.PI+n,s),c=this.center.distance(a)<this.center.distance(h)?new o(s,h):new o(s,a);return"number"==typeof e&&c.setLength(e),c}tangentAt(t,e){return this.normalAt(t,e).inv().perp()}perimeter(){const t=this.radiusH(),e=this.radiusV();return Math.PI*(3*(t+e)-Math.sqrt((3*t+e)*(t+3*e)))}getFoci(){const t=this.radiusH(),e=this.radiusV(),s=t*t-e*e,i=Math.sqrt(Math.abs(s));return s<0?[this.center.clone().addY(i).rotate(this.rotation,this.center),this.center.clone().addY(-i).rotate(this.rotation,this.center)]:[this.center.clone().addX(i).rotate(this.rotation,this.center),this.center.clone().addX(-i).rotate(this.rotation,this.center)]}getEquidistantVertices(t){const e=D.utils.equidistantVertAngles(this.radiusH(),this.radiusV(),t),s=[];for(var i=0;i<e.length;i++)s.push(this.vertAt(e[i]));return s}lineIntersections(t,e=!1){const s=this.clone(),r=t.clone(),n=s.center.clone().inv();s.move(n),r.add(n);const h=-s.rotation;s.rotate(h),r.a.rotate(h,s.center),r.b.rotate(h,s.center);const o=s.radiusH(),l=s.radiusV(),c=o>l?{x:l/o,y:1}:{x:1,y:o/l};s.axis.scaleXY(c),r.a.scaleXY(c),r.b.scaleXY(c);const u=new i(new a,s.radiusH()).lineIntersections(r,e);return u.forEach(function(t){t.scaleXY({x:1/c.x,y:1/c.y},s.center),t.rotate(-h,s.center),t.sub(n)}),u}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map(t=>{const e=new l(this.center,t).angle();return this.tangentAt(e)})}toCubicBezier(t,e){const s=4*Math.max(1,t||3);e=void 0===e?.666666:e;const i=this.radiusH(),r=this.radiusV(),n=[],a=D.utils.equidistantVertAngles(i,r,s);let h=a[0]+this.rotation,o=this.vertAt(h);for(var l=0;l<a.length;l++){let t=a[(l+1)%a.length]+this.rotation,s=this.vertAt(t);if(Math.abs(r)<1e-4||Math.abs(i)<1e-4){let t=o.difference(s),e=new d(o.clone(),s.clone(),o.clone().addXY(.333*t.x,.333*t.y),s.clone().addXY(.333*-t.x,.333*-t.y));n.push(e)}else{let i=this.tangentAt(h+this.rotation),r=this.tangentAt(t+this.rotation),a=i.intersection(r),l=o.difference(a),c=s.difference(a),u=new d(o.clone(),s.clone(),o.clone().add(l.scale(e)),s.clone().add(c.scale(e)));n.push(u)}o=s,h=t}return n}destroy(){this.center.destroy(),this.axis.destroy(),this.isDestroyed=!0}}D.utils={polarToCartesian:(t,e,s,i,r)=>{var n=Math.sin(Math.PI/2-r),a=Math.cos(Math.PI/2-r);return{x:t+s*i*n/Math.sqrt(Math.pow(s*a,2)+Math.pow(i*n,2)),y:e+s*i*a/Math.sqrt(Math.pow(s*a,2)+Math.pow(i*n,2))}},phiToTheta:(t,e,s)=>{var i=Math.tan(s),r=i*i;return-Math.PI/2+s+Math.atan((t-e)*i/(e+t*r))},equidistantVertAngles:(t,e,s)=>{const i=[];for(var r=0;r<s;r++){var n=Math.PI/2+2*Math.PI/s*r;let a=D.utils.phiToTheta(t,e,n);i[r]=a}return i}};class E{constructor(t,s,i){this.className="VEllipseSector",this.uid=e.next(),this.ellipse=t,this.startAngle=n.wrapMinMax(s,0,2*Math.PI),this.endAngle=n.wrapMinMax(i,0,2*Math.PI)}move(t){return this.ellipse.move(t),this}containsAngle(t){t=n.mapAngleTo2PI(t);const e=n.mapAngleTo2PI(this.startAngle),s=n.mapAngleTo2PI(this.endAngle);return e<=s?t>=e&&t<s:t>=e||t<s}getStartPoint(){return this.ellipse.vertAt(this.startAngle)}getEndPoint(){return this.ellipse.vertAt(this.endAngle)}getBounds(){const t=this.ellipse.getExtremePoints().filter(t=>{const e=new l(this.ellipse.center,t).angle()-this.ellipse.rotation;return this.containsAngle(e)});return u.computeFromVertices([this.getStartPoint(),this.getEndPoint()].concat(t))}lineIntersections(t,e=!1){const s=this.ellipse.lineIntersections(t,e),i=new l(this.ellipse.center,new a);return s.filter(t=>{i.b.set(t);const e=i.angle();return this.containsAngle(e-this.ellipse.rotation)})}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map(t=>{const e=new l(this.ellipse.center,t).angle();return this.ellipse.tangentAt(e)})}toCubicBezier(t,e){const s=4*Math.max(1,t||3);e=void 0===e?.666666:e;const i=this.ellipse.radiusH(),r=this.ellipse.radiusV();var n=E.ellipseSectorUtils.normalizeAngle(this.startAngle),a=E.ellipseSectorUtils.normalizeAngle(this.endAngle),h=E.ellipseSectorUtils.equidistantVertAngles(i,r,n,a,s);const o=[];let l=(h=[n].concat(h).concat([a]))[0],c=this.ellipse.vertAt(l);for(var u=0;u+1<h.length;u++){let t=h[(u+1)%h.length],s=this.ellipse.vertAt(t),n=this.ellipse.tangentAt(l+this.ellipse.rotation),a=this.ellipse.tangentAt(t+this.ellipse.rotation);if(Math.abs(r)<1e-4||Math.abs(i)<1e-4){let t=c.difference(s),e=new d(c.clone(),s.clone(),c.clone().addXY(.333*t.x,.333*t.y),s.clone().addXY(.333*-t.x,.333*-t.y));o.push(e)}else{let t=n.intersection(a);if(t){let i=c.difference(t),r=s.difference(t),n=new d(c.clone(),s.clone(),c.clone().add(i.scale(e)),s.clone().add(r.scale(e)));o.push(n)}}c=s,l=t}return o}destroy(){this.ellipse.destroy(),this.isDestroyed=!0}}E.ellipseSectorUtils={describeSVGArc:(t,e,s,i,r,h,o,l)=>{void 0===l&&(l={moveToStart:!0}),void 0===o&&(o=0),r=n.wrapMax(r,2*Math.PI),h=n.wrapMax(h,2*Math.PI);var c=new a(D.utils.polarToCartesian(t,e,s,i,h)),u=new a(D.utils.polarToCartesian(t,e,s,i,r));c.rotate(o,{x:t,y:e}),u.rotate(o,{x:t,y:e});var d,g=h-r;d=g<0?Math.abs(g)<Math.PI?1:0:Math.abs(g)>Math.PI?1:0;const f=[];l.moveToStart&&f.push("M",u.x,u.y);const x=180/Math.PI;return f.push("A",s,i,o*x,d,1,c.x,c.y),f},equidistantVertAngles:(t,e,s,i,r)=>{var n=D.utils.equidistantVertAngles(t,e,r);n=(n=n.map(t=>E.ellipseSectorUtils.normalizeAngle(t))).filter(t=>s<i?t>=s&&t<=i:t>=s||t<=i&&t>=0);const a=E.ellipseSectorUtils.findClosestToStartAngle(s,i,n),h=[];for(var o=0;o<n.length;o++)h.push(n[(a+o)%n.length]);return h},findClosestToStartAngle:(t,e,s)=>{if(t>e){const r=s.length;for(var i=0;i<r;i++){const r=n.wrapMinMax(s[i],0,2*Math.PI);if(r>=t&&r>=e)return i}}return 0},normalizeAngle:t=>t<0?2*Math.PI+t:t,endpointToCenterParameters(t,e,s,i,r,n,h,o,c){const u=Math.abs,d=Math.sin,g=Math.cos,f=Math.sqrt,x=t=>t*t,v=d(r),y=g(r),p=y*(t-o)/2+v*(e-c)/2,m=-v*(t-o)/2+y*(e-c)/2,b=x(p),w=x(m),C=x(s),P=x(i),A=b/C+w/P;A>1?(s=f(A)*u(s),i=f(A)*u(i)):(s=u(s),i=u(i));const S=n===h?-1:1,T=f(Math.abs((C*P-C*w-P*b)/(C*w+P*b)))*S,M=T*(s*m)/i,_=T*(-i*p)/s,N=new a(y*M-v*_+(t+o)/2,v*M+y*_+(e+c)/2),z=N.clone().addXY(s,i),L=new D(N,z,0);L.rotate(r);const I=new l(L.center,new a(t,e)).angle(),k=new l(L.center,new a(o,c)).angle();return new E(L,I-r,k-r)}};var I,k=function(t,e,s){return"symbol"==typeof e&&(e=e.description?"[".concat(e.description,"]"):""),Object.defineProperty(t,"name",{configurable:!0,value:s?"".concat(s," ",e):e})};class O{constructor(e,s){var i,r;if(this.contentChangeListeners=[],this.renderTime=0,this._gui=null,t.model={bezierAutoAdjust:!1,renderTime:0,selectable:!0,isSelected:!1,draggable:!0,visible:!0},void 0===e.canvas)throw"No canvas specified.";const n=O.utils.fetch;this.config={canvas:e.canvas,fullSize:n.val(e,"fullSize",!0),fitToParent:n.bool(e,"fitToParent",!0),scaleX:n.num(e,"scaleX",1),scaleY:n.num(e,"scaleY",1),offsetX:n.num(e,"offsetX",0),offsetY:n.num(e,"offsetY",0),rasterGrid:n.bool(e,"rasterGrid",!0),drawRaster:n.bool(e,"drawRaster",!0),rasterScaleX:n.num(e,"rasterScaleX",1),rasterScaleY:n.num(e,"rasterScaleY",1),rasterAdjustFactor:n.num(e,"rasterAdjustdFactror",2),drawOrigin:n.bool(e,"drawOrigin",!1),autoAdjustOffset:n.val(e,"autoAdjustOffset",!0),offsetAdjustXPercent:n.num(e,"offsetAdjustXPercent",50),offsetAdjustYPercent:n.num(e,"offsetAdjustYPercent",50),backgroundColor:e.backgroundColor||"#ffffff",redrawOnResize:n.bool(e,"redrawOnResize",!0),defaultCanvasWidth:n.num(e,"defaultCanvasWidth",O.DEFAULT_CANVAS_WIDTH),defaultCanvasHeight:n.num(e,"defaultCanvasHeight",O.DEFAULT_CANVAS_HEIGHT),canvasWidthFactor:n.num(e,"canvasWidthFactor",1),canvasHeightFactor:n.num(e,"canvasHeightFactor",1),cssScaleX:n.num(e,"cssScaleX",1),cssScaleY:n.num(e,"cssScaleY",1),cssUniformScale:n.bool(e,"cssUniformScale",!0),saveFile:()=>{o.hooks.saveFile(o)},setToRetina:()=>{o._setToRetina()},autoDetectRetina:n.bool(e,"autoDetectRetina",!0),enableSVGExport:n.bool(e,"enableSVGExport",!0),preClear:n.func(e,"preClear",null),preDraw:n.func(e,"preDraw",null),postDraw:n.func(e,"postDraw",null),enableMouse:n.bool(e,"enableMouse",!0),enableTouch:n.bool(e,"enableTouch",!0),enableKeys:n.bool(e,"enableKeys",!0),enableMouseWheel:n.bool(e,"enableMouseWheel",!0),enableZoom:n.bool(e,"enableZoom",!0),enablePan:n.bool(e,"enablePan",!0),enableGL:n.bool(e,"enableGL",!1),isBackdropFiltersEnabled:n.bool(e,"isBackdropFiltersEnabled",!0)},this.drawConfig={drawVertices:!0,drawBezierHandleLines:n.bool(e,"drawBezierHandleLines",!0),drawBezierHandlePoints:n.bool(e,"drawBezierHandlePoints",!0),drawHandleLines:n.bool(e,"drawHandleLines",!0),drawHandlePoints:n.bool(e,"drawHandlePoints",!0),drawGrid:n.bool(e,"drawGrid",!0),drawRaster:n.bool(e,"drawRaster",!0),bezier:{color:"#00a822",lineWidth:2,handleLine:{color:"rgba(180,180,180,0.5)",lineWidth:1},pathVertex:{color:"#B400FF",lineWidth:1,fill:!0},controlVertex:{color:"#B8D438",lineWidth:1,fill:!0}},polygon:{color:"#0022a8",lineWidth:1},triangle:{color:"#6600ff",lineWidth:1},ellipse:{color:"#2222a8",lineWidth:1},ellipseSector:{color:"#a822a8",lineWidth:2},circle:{color:"#22a8a8",lineWidth:2},circleSector:{color:"#2280a8",lineWidth:1},vertex:{color:"#a8a8a8",lineWidth:1},selectedVertex:{color:"#c08000",lineWidth:2},line:{color:"#a844a8",lineWidth:1},vector:{color:"#ff44a8",lineWidth:1},image:{color:"#a8a8a8",lineWidth:1},text:{color:"rgba(192,0,128,0.5)",lineWidth:1,fill:!0,anchor:!0},origin:{color:"#000000"}},this.grid=new b(new a(0,0),new a(50,50)),this.canvasSize={width:O.DEFAULT_CANVAS_WIDTH,height:O.DEFAULT_CANVAS_HEIGHT};const h="string"==typeof e.canvas?document.querySelector(e.canvas):e.canvas;if(void 0===h)throw`Cannot initialize PlotBoilerplate with a null canvas (element "${e.canvas} not found).`;if("canvas"===h.tagName.toLowerCase())if(this.canvas=h,this.eventCatcher=this.canvas,this.config.enableGL&&void 0===p&&(console.warn("Cannot use webgl. Package was compiled without experimental gl support. Please use plotboilerplate-glsupport.min.js instead."),console.warn("Disabling GL and falling back to Canvas2D."),this.config.enableGL=!1),this.config.enableGL){const t=this.canvas.getContext("webgl");this.draw=new p(t,!1),this.fill=this.draw.copyInstance(!0),console.warn("Initialized with experimental mode enableGL=true. Note that this is not yet fully implemented.")}else{const t=this.canvas.getContext("2d");this.draw=new y(t,!1),this.fill=new y(t,!0)}else{if("svg"!==h.tagName.toLowerCase())throw"Element is neither a canvas nor an svg element.";if(void 0===v)throw"The svg draw library is not yet integrated part of PlotBoilerplate. Please include ./src/js/utils/helpers/drawutils.svg into your document.";this.canvas=h,this.draw=new v(this.canvas,new a,new a,this.canvasSize,!1,this.drawConfig,!1),this.fill=this.draw.copyInstance(!0),this.canvas.parentElement?(this.eventCatcher=document.createElement("div"),this.eventCatcher.style.position="absolute",this.eventCatcher.style.left="0",this.eventCatcher.style.top="0",this.eventCatcher.style.cursor="pointer",this.canvas.parentElement.style.position="relative",this.canvas.parentElement.appendChild(this.eventCatcher)):this.eventCatcher=document.body}e.title&&this.eventCatcher.setAttribute("title",e.title),this.draw.scale.set(null!==(i=this.config.scaleX)&&void 0!==i?i:1,this.config.scaleY),this.fill.scale.set(null!==(r=this.config.scaleX)&&void 0!==r?r:1,this.config.scaleY),this.vertices=[],this.selectPolygon=null,this.draggedElements=[],this.drawables=[],this.console=console,this.hooks={saveFile:O._saveFile};var o=this;globalThis.addEventListener("resize",()=>o.resizeCanvas()),this.resizeCanvas(),e.autoDetectRetina&&this._setToRetina(),this.installInputListeners(),this.updateCSSscale(),this.redraw(),this.canvas.focus()}static _saveFile(t){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");var s=new v(e,t.draw.offset,t.draw.scale,t.canvasSize,!1,t.drawConfig),i=s.copyInstance(!0);s.beginDrawCycle(0),i.beginDrawCycle(0),t.config.preClear&&t.config.preClear(),s.clear(t.config.backgroundColor||"white"),t.config.preDraw&&t.config.preDraw(s,i),t.drawAll(0,s,i),t.drawVertices(0,s),t.config.postDraw&&t.config.postDraw(s,i),s.endDrawCycle(0),i.endDrawCycle(0);var r=(new XMLSerializer).serializeToString(e),n=new Blob(['<?xml version="1.0" encoding="utf-8"?>\n'+r],{type:"image/svg;charset=utf-8"});if("function"!=typeof globalThis.saveAs)throw"Cannot save file; did you load the ./utils/savefile helper function and the eligrey/SaveFile library?";(0,globalThis.saveAs)(n,"plotboilerplate.svg")}_setToRetina(){this.config.autoDetectRetina=!0;const t=globalThis.devicePixelRatio||1;this.config.cssScaleX=this.config.cssScaleY=1/t,this.config.canvasWidthFactor=this.config.canvasHeightFactor=t,this.resizeCanvas(),this.updateCSSscale()}fitToView(t){const e=new a(this.canvasSize.width/2,this.canvasSize.height/2),s=this.canvasSize.width/this.canvasSize.height,i=t.width/t.height,r=new a(t.max.x-t.width/2,t.max.y-t.height/2).inv().addXY(this.canvasSize.width/2,this.canvasSize.height/2);if(this.setOffset(r),s<i){const s=this.canvasSize.width/t.width;this.setZoom(s,s,e)}else{const s=this.canvasSize.height/t.height;this.setZoom(s,s,e)}this.redraw()}setConsole(t){this.console=t}updateCSSscale(){var t,e,s,i;this.config.cssUniformScale?O.utils.setCSSscale(this.canvas,null!==(t=this.config.cssScaleX)&&void 0!==t?t:1,null!==(e=this.config.cssScaleX)&&void 0!==e?e:1):O.utils.setCSSscale(this.canvas,null!==(s=this.config.cssScaleX)&&void 0!==s?s:1,null!==(i=this.config.cssScaleY)&&void 0!==i?i:1)}addContentChangeListener(t){for(var e in this.contentChangeListeners)if(this.contentChangeListeners[e]===t)return;this.contentChangeListeners.push(t)}removeContentChangeListener(t){for(var e=0;e<this.contentChangeListeners.length;e++)if(this.contentChangeListeners[e]===t)return void this.contentChangeListeners.splice(e,1)}_fireContentChanged(t,e){for(var s in this.contentChangeListeners){const i=this.contentChangeListeners[s];i&&"function"==typeof i&&i({type:t.length>0?"DRAWABLES_ADDED":"DRAWABLES_REMOVED",addedDrawables:t,removedDrawables:e})}}add(t,e,s){if(Array.isArray(t)){const e=t;for(var n=0;n<e.length;n++)this.add(e[n],!1,s)}else{const e=[t];if(t instanceof a)this.drawables.push(t),this.vertices.push(t);else if(t instanceof l)this.drawables.push(t),this.vertices.push(t.a),this.vertices.push(t.b),e.push(t.a,t.b);else if(t instanceof o)this.drawables.push(t),this.vertices.push(t.a),this.vertices.push(t.b),e.push(t.a,t.b),t.a.listeners.addDragListener(e=>{t.b.add(e.params.dragAmount)});else if(t instanceof D)this.vertices.push(t.center),this.vertices.push(t.axis),e.push(t.center,t.axis),this.drawables.push(t),t.center.listeners.addDragListener(e=>{t.axis.add(e.params.dragAmount)});else if(t instanceof E)this.vertices.push(t.ellipse.center),this.vertices.push(t.ellipse.axis),e.push(t.ellipse.center,t.ellipse.axis),this.drawables.push(t),t.ellipse.center.listeners.addDragListener(e=>{t.ellipse.axis.add(e.params.dragAmount)});else if(t instanceof i)this.vertices.push(t.center),e.push(t.center),this.drawables.push(t);else if(t instanceof f)this.vertices.push(t.circle.center),e.push(t.circle.center),this.drawables.push(t);else if(t instanceof c){this.drawables.push(t);for(n=0;n<t.vertices.length;n++)this.vertices.push(t.vertices[n]),e.push(t.vertices[n])}else if(t instanceof r)this.drawables.push(t),this.vertices.push(t.a),this.vertices.push(t.b),this.vertices.push(t.c),e.push(t.a,t.b,t.c);else if(t instanceof g){this.drawables.push(t);const s=t;for(n=0;n<s.bezierCurves.length;n++)t.adjustCircular||0!=n||(this.vertices.push(s.bezierCurves[n].startPoint),e.push(s.bezierCurves[n].startPoint)),this.vertices.push(s.bezierCurves[n].endPoint),this.vertices.push(s.bezierCurves[n].startControlPoint),this.vertices.push(s.bezierCurves[n].endControlPoint),e.push(s.bezierCurves[n].endPoint,s.bezierCurves[n].startControlPoint,s.bezierCurves[n].endControlPoint),s.bezierCurves[n].startControlPoint.attr.selectable=!1,s.bezierCurves[n].endControlPoint.attr.selectable=!1;O.utils.enableBezierPathAutoAdjust(t)}else if(t instanceof S)this.vertices.push(t.upperLeft),this.vertices.push(t.lowerRight),e.push(t.upperLeft,t.lowerRight),this.drawables.push(t),t.upperLeft.listeners.addDragListener(e=>{t.lowerRight.add(e.params.dragAmount)}),t.lowerRight.attr.selectable=!1;else{if(!(t instanceof T))throw"Cannot add drawable of unrecognized type: "+typeof t+".";this.vertices.push(t.anchor),e.push(t.anchor),this.drawables.push(t),t.anchor.attr.selectable=!1}!s&&this._fireContentChanged(e,[])}(e||void 0===e)&&this.redraw()}remove(t,e,s,n){if(Array.isArray(t)){const i=[];for(var h=0;h<t.length;h++)this.remove(t[h],!1,s,!0)&&i.push(t[h]);return e&&this.redraw(),!n&&this._fireContentChanged([],i),i.length>0}if(t instanceof a){const s=this.removeVertex(t,!1,!1);return e&&this.redraw(),!n&&this._fireContentChanged([],[t]),s}let u=!1;const d=[];for(h=0;h<this.drawables.length;h++)if(this.drawables[h]===t||this.drawables[h].uid===t.uid){if(this.drawables.splice(h,1),d.push(t),s)if(t instanceof l)this.removeVertex(t.a,!1,!0),this.removeVertex(t.b,!1,!0),d.push(t.a,t.b);else if(t instanceof o)this.removeVertex(t.a,!1,!0),this.removeVertex(t.b,!1,!0),d.push(t.a,t.b);else if(t instanceof D)this.removeVertex(t.center,!1,!0),this.removeVertex(t.axis,!1,!0),d.push(t.center,t.axis);else if(t instanceof E)this.removeVertex(t.ellipse.center,!1,!0),this.removeVertex(t.ellipse.axis,!1,!0),d.push(t.ellipse.center,t.ellipse.axis);else if(t instanceof i)this.removeVertex(t.center,!1,!0);else if(t instanceof f)this.removeVertex(t.circle.center,!1,!0),d.push(t.circle.center);else if(t instanceof c)for(h=0;h<t.vertices.length;h++)this.removeVertex(t.vertices[h],!1,!0),d.push(t.vertices[h]);else if(t instanceof r)this.removeVertex(t.a,!1,!0),this.removeVertex(t.b,!1,!0),this.removeVertex(t.c,!1,!0),d.push(t.a,t.b,t.c);else if(t instanceof g)for(h=0;h<t.bezierCurves.length;h++)this.removeVertex(t.bezierCurves[h].startPoint,!1,!0),this.removeVertex(t.bezierCurves[h].startControlPoint,!1,!0),this.removeVertex(t.bezierCurves[h].endControlPoint,!1,!0),d.push(t.bezierCurves[h].startPoint,t.bezierCurves[h].startControlPoint,t.bezierCurves[h].endControlPoint),h+1==t.bezierCurves.length&&(this.removeVertex(t.bezierCurves[h].endPoint,!1,!0),d.push(t.bezierCurves[h].endPoint));else t instanceof S?(this.removeVertex(t.upperLeft,!1,!0),this.removeVertex(t.lowerRight,!1,!0),d.push(t.upperLeft,t.lowerRight)):t instanceof T&&(this.removeVertex(t.anchor,!1,!0),d.push(t.anchor));e&&this.redraw(),!n&&this._fireContentChanged([],d),u=!0}return u}removeVertex(t,e,s){for(var i=0;i<this.vertices.length;i++)if(this.vertices[i]===t)return this.vertices.splice(i,1),e&&this.redraw(),!s&&this._fireContentChanged([],[t]),!0;return!1}removeAll(t,e){let s=this.drawables;this.drawables=[],Boolean(t)||(s=s.concat(this.vertices),this.vertices=[]),(e||void 0===e)&&this.redraw(),s.length>0&&this._fireContentChanged([],s)}getVertexNear(t,e){var s,i;const r=this.locatePointNear(this.transformMousePosition(t.x,t.y),e/Math.min(null!==(s=this.config.cssScaleX)&&void 0!==s?s:1,null!==(i=this.config.cssScaleY)&&void 0!==i?i:1));if(r&&"vertex"==r.typeName)return this.vertices[r.vindex]}drawGrid(t){void 0===t&&(t=this.draw);const e=b.utils.mapRasterScale(this.config.rasterAdjustFactor,this.draw.scale.x)*this.config.rasterScaleX/this.config.cssScaleX,s=b.utils.mapRasterScale(this.config.rasterAdjustFactor,this.draw.scale.y)*this.config.rasterScaleY/this.config.cssScaleY;var i={width:this.grid.size.x*e,height:this.grid.size.y*s},r=this.canvasSize.width/2,n=this.canvasSize.height/2,a=this.draw.offset.clone().inv();a.x=Math.round(a.x+r)/Math.round(i.width)*i.width/this.draw.scale.x+(this.draw.offset.x-r)/this.draw.scale.x%i.width,a.y=Math.round(a.y+n)/Math.round(i.height)*i.height/this.draw.scale.y+(this.draw.offset.y-n)/this.draw.scale.x%i.height,this.drawConfig.drawGrid&&(t.setCurrentClassName(null),this.config.rasterGrid?(t.setCurrentId("raster"),t.raster(a,this.canvasSize.width/this.draw.scale.x,this.canvasSize.height/this.draw.scale.y,i.width,i.height,"rgba(0,128,255,0.125)")):(t.setCurrentId("grid"),t.grid(a,this.canvasSize.width/this.draw.scale.x,this.canvasSize.height/this.draw.scale.y,i.width,i.height,"rgba(0,128,255,0.095)")))}drawOrigin(t){t.setCurrentId("origin"),t.crosshair({x:0,y:0},10,this.drawConfig.origin.color)}_handleColor(t,e){return t.attr.isSelected?this.drawConfig.selectedVertex.color:t.attr.draggable?e:"rgba(128,128,128,0.5)"}drawDrawables(t,e,s){for(var i in this.drawables){var r=this.drawables[i];this.draw.setCurrentId(r.uid),this.fill.setCurrentId(r.uid),this.draw.setCurrentClassName(r.className),this.fill.setCurrentClassName(r.className),this.drawDrawable(r,t,e,s)}}drawDrawable(t,e,s,n){if(t instanceof g){var h=0;for(var u in t.bezierCurves){if(this.draw.setCurrentId(`${t.uid}-${h}`),this.fill.setCurrentId(`${t.uid}-${h}`),this.draw.setCurrentClassName(t.className),this.fill.setCurrentClassName(t.className),s.cubicBezier(t.bezierCurves[u].startPoint,t.bezierCurves[u].endPoint,t.bezierCurves[u].startControlPoint,t.bezierCurves[u].endControlPoint,this.drawConfig.bezier.color,this.drawConfig.bezier.lineWidth),this.drawConfig.drawBezierHandlePoints&&this.drawConfig.drawHandlePoints){if(t.bezierCurves[u].startPoint.attr.visible){const e=this.drawConfig.bezier.pathVertex.fill?n:s;e.setCurrentId(`${t.uid}_h0`),e.setCurrentClassName(`${t.className}-start-handle`),t.bezierCurves[u].startPoint.attr.bezierAutoAdjust?e.squareHandle(t.bezierCurves[u].startPoint,5,this._handleColor(t.bezierCurves[u].startPoint,this.drawConfig.bezier.pathVertex.color)):e.diamondHandle(t.bezierCurves[u].startPoint,7,this._handleColor(t.bezierCurves[u].startPoint,this.drawConfig.bezier.pathVertex.color))}if(t.bezierCurves[u].startPoint.attr.renderTime=e,t.bezierCurves[u].endPoint.attr.visible){const e=this.drawConfig.bezier.pathVertex.fill?n:s;e.setCurrentId(`${t.uid}_h0`),e.setCurrentClassName(`${t.className}-start-handle`),t.bezierCurves[u].endPoint.attr.bezierAutoAdjust?e.squareHandle(t.bezierCurves[u].endPoint,5,this._handleColor(t.bezierCurves[u].endPoint,this.drawConfig.bezier.pathVertex.color)):e.diamondHandle(t.bezierCurves[u].endPoint,7,this._handleColor(t.bezierCurves[u].endPoint,this.drawConfig.bezier.pathVertex.color))}if(t.bezierCurves[u].startControlPoint.attr.visible){const e=this.drawConfig.bezier.controlVertex.fill?n:s;e.setCurrentId(`${t.uid}_h2`),e.setCurrentClassName(`${t.className}-start-control-handle`),e.circleHandle(t.bezierCurves[u].startControlPoint,3,this._handleColor(t.bezierCurves[u].startControlPoint,this.drawConfig.bezier.controlVertex.color))}if(t.bezierCurves[u].endControlPoint.attr.visible){const e=this.drawConfig.bezier.controlVertex.fill?n:s;e.setCurrentId(`${t.uid}_h3`),e.setCurrentClassName(`${t.className}-end-control-handle`),e.circleHandle(t.bezierCurves[u].endControlPoint,3,this._handleColor(t.bezierCurves[u].endControlPoint,this.drawConfig.bezier.controlVertex.color))}t.bezierCurves[u].startPoint.attr.renderTime=e,t.bezierCurves[u].endPoint.attr.renderTime=e,t.bezierCurves[u].startControlPoint.attr.renderTime=e,t.bezierCurves[u].endControlPoint.attr.renderTime=e}else t.bezierCurves[u].startPoint.attr.renderTime=e,t.bezierCurves[u].endPoint.attr.renderTime=e,t.bezierCurves[u].startControlPoint.attr.renderTime=e,t.bezierCurves[u].endControlPoint.attr.renderTime=e;this.drawConfig.drawBezierHandleLines&&this.drawConfig.drawHandleLines&&(s.setCurrentId(`${t.uid}_l0`),s.setCurrentClassName(`${t.className}-start-line`),s.handleLine(t.bezierCurves[u].startPoint,t.bezierCurves[u].startControlPoint),s.setCurrentId(`${t.uid}_l1`),s.setCurrentClassName(`${t.className}-end-line`),s.handleLine(t.bezierCurves[u].endPoint,t.bezierCurves[u].endControlPoint)),h++}}else if(t instanceof c){if(s.polygon(t,this.drawConfig.polygon.color,this.drawConfig.polygon.lineWidth),!this.drawConfig.drawHandlePoints)for(var d in t.vertices)t.vertices[d].attr.renderTime=e}else if(t instanceof r)s.polyline([t.a,t.b,t.c],!1,this.drawConfig.triangle.color,this.drawConfig.triangle.lineWidth),this.drawConfig.drawHandlePoints||(t.a.attr.renderTime=t.b.attr.renderTime=t.c.attr.renderTime=e);else if(t instanceof D)this.drawConfig.drawHandleLines&&(s.setCurrentId(`${t.uid}_e0`),s.setCurrentClassName(`${t.className}-v-line`),s.handleLine(t.center.clone().add(0,t.signedRadiusV()).rotate(t.rotation,t.center),t.axis),s.setCurrentId(`${t.uid}_e1`),s.setCurrentClassName(`${t.className}-h-line`),s.handleLine(t.center.clone().add(t.signedRadiusH(),0).rotate(t.rotation,t.center),t.axis)),s.setCurrentId(t.uid),s.setCurrentClassName(`${t.className}`),s.ellipse(t.center,t.radiusH(),t.radiusV(),this.drawConfig.ellipse.color,this.drawConfig.ellipse.lineWidth,t.rotation),this.drawConfig.drawHandlePoints||(t.center.attr.renderTime=e,t.axis.attr.renderTime=e);else if(t instanceof E){s.setCurrentId(t.uid),s.setCurrentClassName(`${t.className}`);const e=E.ellipseSectorUtils.describeSVGArc(t.ellipse.center.x,t.ellipse.center.y,t.ellipse.radiusH(),t.ellipse.radiusV(),t.startAngle,t.endAngle,t.ellipse.rotation,{moveToStart:!0});s.path(e,this.drawConfig.ellipseSector.color,this.drawConfig.ellipseSector.lineWidth)}else t instanceof i?s.circle(t.center,t.radius,this.drawConfig.circle.color,this.drawConfig.circle.lineWidth):t instanceof f?s.circleArc(t.circle.center,t.circle.radius,t.startAngle,t.endAngle,this.drawConfig.circleSector.color,this.drawConfig.circleSector.lineWidth):t instanceof a?!this.drawConfig.drawVertices||t.attr.selectable&&t.attr.draggable||!t.attr.visible||(s.circleHandle(t,7,this.drawConfig.vertex.color),t.attr.renderTime=e):t instanceof l?(s.line(t.a,t.b,this.drawConfig.line.color,this.drawConfig.line.lineWidth),this.drawConfig.drawHandlePoints&&t.a.attr.selectable||(t.a.attr.renderTime=e),this.drawConfig.drawHandlePoints&&t.b.attr.selectable||(t.b.attr.renderTime=e)):t instanceof o?(s.arrow(t.a,t.b,this.drawConfig.vector.color,this.drawConfig.vector.lineWidth),this.drawConfig.drawHandlePoints&&t.b.attr.selectable&&t.b.attr.visible?(s.setCurrentId(`${t.uid}_h0`),s.setCurrentClassName(`${t.className}-handle`),s.circleHandle(t.b,3,"#a8a8a8")):t.b.attr.renderTime=e,this.drawConfig.drawHandlePoints&&t.a.attr.selectable||(t.a.attr.renderTime=e),this.drawConfig.drawHandlePoints&&t.b.attr.selectable||(t.b.attr.renderTime=e)):t instanceof S?(this.drawConfig.drawHandleLines&&(s.setCurrentId(`${t.uid}_l0`),s.setCurrentClassName(`${t.className}-line`),s.line(t.upperLeft,t.lowerRight,this.drawConfig.image.color,this.drawConfig.image.lineWidth)),n.setCurrentId(t.uid),n.image(t.image,t.upperLeft,t.lowerRight.clone().sub(t.upperLeft)),this.drawConfig.drawHandlePoints&&(s.setCurrentId(`${t.uid}_h0`),s.setCurrentClassName(`${t.className}-lower-right`),s.circleHandle(t.lowerRight,3,this.drawConfig.image.color),t.lowerRight.attr.renderTime=e)):t instanceof T?(n.setCurrentId(t.uid),n.text(t.text,t.anchor.x,t.anchor.y,t),this.drawConfig.text.anchor&&(s.setCurrentId(`${t.uid}_a0`),s.setCurrentClassName(`${t.className}-anchor`),(this.drawConfig.text.fill?n:s).point(t.anchor,this.drawConfig.text.color)),t.anchor.attr.renderTime=e):console.error("Cannot draw object. Unknown class.");s.setCurrentClassName(null),s.setCurrentId(null),n.setCurrentClassName(null),n.setCurrentId(null)}drawSelectPolygon(t){null!=this.selectPolygon&&this.selectPolygon.vertices.length>0&&(t.setCurrentId(this.selectPolygon.uid),t.polygon(this.selectPolygon,"#888888"),t.crosshair(this.selectPolygon.vertices[0],3,"#008888"))}drawVertices(t,e){for(var s in this.vertices)this.drawConfig.drawVertices&&this.vertices[s].attr.renderTime!=t&&this.vertices[s].attr.visible&&(e.setCurrentId(this.vertices[s].uid),e.squareHandle(this.vertices[s],5,this._handleColor(this.vertices[s],"rgb(0,128,192)")),this.vertices[s].attr.renderTime=t)}redraw(){const t=this.renderTime++;this.draw.beginDrawCycle(t),this.fill.beginDrawCycle(t),this.config.preClear&&this.config.preClear(),this.clear(),this.config.preDraw&&this.config.preDraw(this.draw,this.fill),this.drawAll(t,this.draw,this.fill),this.config.postDraw&&this.config.postDraw(this.draw,this.fill),this.draw.endDrawCycle(t),this.fill.endDrawCycle(t)}drawAll(t,e,s){this.config.drawRaster&&this.drawGrid(e),this.config.drawOrigin&&this.drawOrigin(e),this.drawDrawables(t,e,s),this.drawVertices(t,e),this.drawSelectPolygon(e),e.setCurrentId(null),e.setCurrentClassName(null)}clear(){this.draw.clear(this.config.backgroundColor||"white")}clearSelection(t){for(var e in this.vertices)this.vertices[e].attr.isSelected=!1;return t&&this.redraw(),this}viewport(){var t,e;return new u(this.transformMousePosition(0,0),this.transformMousePosition(this.canvasSize.width*(null!==(t=this.config.cssScaleX)&&void 0!==t?t:1),this.canvasSize.height*(null!==(e=this.config.cssScaleY)&&void 0!==e?e:1)))}saveFile(){this.hooks.saveFile(this)}getFProp(t,e){return parseFloat(globalThis.getComputedStyle(t,null).getPropertyValue(e))}getAvailableContainerSpace(){const t=this,e=t.canvas.parentNode;t.canvas.style.display="none";var s=this.getFProp(e,"padding")||0,i=this.getFProp(t.canvas,"border-width")||0,r=this.getFProp(e,"padding-left")||s,n=this.getFProp(e,"padding-right")||s,a=this.getFProp(e,"padding-top")||s,h=this.getFProp(e,"padding-bottom")||s,o=this.getFProp(t.canvas,"border-left-width")||i,l=this.getFProp(t.canvas,"border-right-width")||i,c=this.getFProp(t.canvas,"border-top-width")||i,u=this.getFProp(t.canvas,"border-bottom-width")||i,d=e.clientWidth,g=e.clientHeight;return t.canvas.style.display="block",{width:d-r-n-o-l,height:g-a-h-c-u}}resizeCanvas(){var t,e,s,i,r,n;const a=this,h=(t,e)=>{var s,i;t*=null!==(s=a.config.canvasWidthFactor)&&void 0!==s?s:1,e*=null!==(i=a.config.canvasHeightFactor)&&void 0!==i?i:1,a.canvasSize.width=t,a.canvasSize.height=e,a.canvas instanceof HTMLCanvasElement?(a.canvas.width=t,a.canvas.height=e):a.canvas instanceof SVGElement?(this.canvas.setAttribute("viewBox",`0 0 ${t} ${e}`),this.canvas.setAttribute("width",`${t}`),this.canvas.setAttribute("height",`${e}`),this.draw.setSize(a.canvasSize),this.eventCatcher.style.width=`${t}px`,this.eventCatcher.style.height=`${e}px`):console.error("Error: cannot resize canvas element because it seems neither be a HTMLCanvasElement nor an SVGElement."),a.config.autoAdjustOffset&&a.adjustOffset(!1)};if(a.config.fullSize&&!a.config.fitToParent){var o=globalThis.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,l=globalThis.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;a.canvas.style.position="absolute",a.canvas.style.width=(null!==(t=a.config.canvasWidthFactor)&&void 0!==t?t:1)*o+"px",a.canvas.style.height=(null!==(e=a.config.canvasWidthFactor)&&void 0!==e?e:1)*l+"px",a.canvas.style.top="0px",a.canvas.style.left="0px",h(o,l)}else if(a.config.fitToParent){a.canvas.style.position="static";const t=this.getAvailableContainerSpace();a.canvas.style.width=(null!==(s=a.config.canvasWidthFactor)&&void 0!==s?s:1)*t.width+"px",a.canvas.style.height=(null!==(i=a.config.canvasHeightFactor)&&void 0!==i?i:1)*t.height+"px",a.canvas.style.top="",a.canvas.style.left="",h(t.width,t.height)}else a.canvas.style.width="",a.canvas.style.height="",h(null!==(r=a.config.defaultCanvasWidth)&&void 0!==r?r:1024,null!==(n=a.config.defaultCanvasHeight)&&void 0!==n?n:768);a.config.redrawOnResize&&a.redraw()}selectVerticesInPolygon(t){for(var e in this.vertices)this.vertices[e].attr.selectable&&t.containsVert(this.vertices[e])&&(this.vertices[e].attr.isSelected=!0)}locatePointNear(t,e){const s=this;void 0===e&&(e=7),e/=s.draw.scale.x;for(var i=0;i<s.vertices.length;i++){var r=s.vertices[i];if((r.attr.draggable||r.attr.selectable)&&r.distance(t)<e)return new O.Draggable(r,O.Draggable.VERTEX).setVIndex(i)}return null}handleClick(t){const e=this;var s=this.locatePointNear(e.transformMousePosition(t.params.pos.x,t.params.pos.y),O.DEFAULT_CLICK_TOLERANCE/Math.min(e.config.cssScaleX||1,e.config.cssScaleY||1));if(s)if(e.vertices[s.vindex].listeners.fireClickEvent(t),this.keyHandler&&this.keyHandler.isDown("shift")){if("bpath"==s.typeName){let t=e.paths[s.pindex].bezierCurves[s.cindex].getPointByID(s.pid);t.attr.selectable&&(t.attr.isSelected=!t.attr.isSelected)}else if("vertex"==s.typeName){let t=e.vertices[s.vindex];t.attr.selectable&&(t.attr.isSelected=!t.attr.isSelected)}e.redraw()}else this.keyHandler&&this.keyHandler.isDown("y")&&(e.vertices[s.vindex].attr.bezierAutoAdjust=!e.vertices[s.vindex].attr.bezierAutoAdjust,e.redraw());else if(null!=e.selectPolygon){const s=e.transformMousePosition(t.params.pos.x,t.params.pos.y);e.selectPolygon.vertices.push(new a(s.x,s.y)),e.redraw()}}transformMousePosition(t,e){return{x:(t/this.config.cssScaleX-this.config.offsetX)/this.config.scaleX,y:(e/this.config.cssScaleY-this.config.offsetY)/this.config.scaleY}}revertMousePosition(t,e){return{x:t/this.config.cssScaleX+this.config.offsetX,y:e/this.config.cssScaleY+this.config.offsetY}}getDraggedElementCount(){return this.draggedElements.length}mouseDownHandler(t){const e=this;if(0==t.button){var s=e.locatePointNear(e.transformMousePosition(t.params.pos.x,t.params.pos.y),O.DEFAULT_CLICK_TOLERANCE/Math.min(e.config.cssScaleX,e.config.cssScaleY));if(s){if("vertex"==s.typeName&&e.vertices[s.vindex].attr.isSelected)for(var i=0;i<e.vertices.length;i++)e.vertices[i].attr.isSelected&&(e.draggedElements.push(new O.Draggable(e.vertices[i],O.Draggable.VERTEX).setVIndex(i)),e.vertices[i].listeners.fireDragStartEvent(t));else{if(!e.vertices[s.vindex].attr.draggable)return;e.draggedElements.push(s),"bpath"==s.typeName?e.paths[s.pindex].bezierCurves[s.cindex].getPointByID(s.pid).listeners.fireDragStartEvent(t):"vertex"==s.typeName&&e.vertices[s.vindex].listeners.fireDragStartEvent(t)}e.redraw()}}}mouseDragHandler(t){const e=this,s={x:t.params.dragAmount.x,y:t.params.dragAmount.y};if(t.params.dragAmount.x/=e.config.cssScaleX,t.params.dragAmount.y/=e.config.cssScaleY,this.keyHandler&&(this.keyHandler.isDown("alt")||this.keyHandler.isDown("spacebar"))){if(!this.config.enablePan)return;e.setOffset(e.draw.offset.clone().add(t.params.dragAmount)),e.redraw()}else for(var i in t.params.dragAmount.x/=e.draw.scale.x,t.params.dragAmount.y/=e.draw.scale.y,e.draggedElements){var r=e.draggedElements[i];if("bpath"==r.typeName)e.paths[r.pindex].moveCurvePoint(r.cindex,r.pid,new a(t.params.dragAmount.x,t.params.dragAmount.y)),e.paths[r.pindex].bezierCurves[r.cindex].getPointByID(r.pid).listeners.fireDragEvent(t);else if("vertex"==r.typeName){if(!e.vertices[r.vindex].attr.draggable)continue;e.vertices[r.vindex].add(t.params.dragAmount),e.vertices[r.vindex].listeners.fireDragEvent(t)}}t.params.dragAmount.x=s.x,t.params.dragAmount.y=s.y,e.redraw()}mouseUpHandler(t){const e=this;if(0==t.button){for(var s in t.params.wasDragged||e.handleClick(t),e.draggedElements){var i=e.draggedElements[s];"bpath"==i.typeName?e.paths[i.pindex].bezierCurves[i.cindex].getPointByID(i.pid).listeners.fireDragEndEvent(t):"vertex"==i.typeName&&e.vertices[i.vindex].listeners.fireDragEndEvent(t)}e.draggedElements=[],e.redraw()}}mouseWheelHandler(t){if(!this.config.enableZoom)return;var e=1.25;const s=this,i=t;i.deltaY<0?s.setZoom(s.config.scaleX*e,s.config.scaleY*e,new a(t.params.pos.x,t.params.pos.y)):i.deltaY>0&&s.setZoom(s.config.scaleX/e,s.config.scaleY/e,new a(t.params.pos.x,t.params.pos.y)),t.preventDefault(),s.redraw()}adjustOffset(t){this.draw.offset.x=this.fill.offset.x=this.config.offsetX=this.canvasSize.width*(this.config.offsetAdjustXPercent/100),this.draw.offset.y=this.fill.offset.y=this.config.offsetY=this.canvasSize.height*(this.config.offsetAdjustYPercent/100),t&&this.redraw()}setOffset(t){this.draw.offset.set(t),this.fill.offset.set(t),this.config.offsetX=t.x,this.config.offsetY=t.y}setZoom(t,e,s){let i=this.transformMousePosition(s.x,s.y);this.draw.scale.x=this.fill.scale.x=this.config.scaleX=Math.max(t,.01),this.draw.scale.y=this.fill.scale.y=this.config.scaleY=Math.max(e,.01);let r=this.transformMousePosition(s.x,s.y),n=this.draw.offset.x+(r.x-i.x)*this.draw.scale.x,a=this.draw.offset.y+(r.y-i.y)*this.draw.scale.y;this.setOffset({x:n,y:a})}installInputListeners(){var t=this;if(this.config.enableMouse?new A(this.eventCatcher?this.eventCatcher:this.canvas).down(e=>{t.mouseDownHandler(e)}).drag(e=>{t.mouseDragHandler(e)}).up(e=>{t.mouseUpHandler(e)}):t.console.log("Mouse interaction disabled."),this.config.enableMouseWheel?new A(this.eventCatcher?this.eventCatcher:this.canvas).wheel(e=>{t.mouseWheelHandler(e)}):t.console.log("Mouse wheel interaction disabled."),this.config.enableTouch){const n=e=>{const s=t.canvas.getBoundingClientRect();return{x:e.x-s.left,y:e.y-s.top}};if("function"==typeof globalThis.AlloyFinger||"function"==typeof globalThis.createAlloyFinger)try{var e=null,s=null,i=null,r=null;const h=()=>{e=null,s=null,i=null,r=null,t.draggedElements=[]},o={touchStart:r=>{if(1==r.touches.length&&(e=new a(n({x:r.touches[0].clientX,y:r.touches[0].clientY})),s=new a(n({x:r.touches[0].clientX,y:r.touches[0].clientY})),(i=t.locatePointNear(t.transformMousePosition(e.x,e.y),O.DEFAULT_TOUCH_TOLERANCE/Math.min(t.config.cssScaleX,t.config.cssScaleY)))&&"vertex"==i.typeName)){var h=t.vertices[i.vindex],o={params:{isTouchEvent:!0,dragAmount:{x:0,y:0},wasDragged:!1,mouseDownPos:s.clone(),mouseDragPos:s.clone(),vertex:h}};t.draggedElements=[i],h.listeners.fireDragStartEvent(o)}},touchMove:r=>{if(1==r.touches.length&&i){if(r.preventDefault(),r.stopPropagation(),!s||!e)return;var h=n({x:r.touches[0].clientX,y:r.touches[0].clientY}),o=t.transformMousePosition(h.x,h.y),l=new a(t.transformMousePosition(e.x,e.y)).difference(o);if("vertex"==i.typeName){if(!t.vertices[i.vindex].attr.draggable)return;t.vertices[i.vindex].add(l);var c=t.vertices[i.vindex],u={isTouchEvent:!0,params:{dragAmount:l.clone(),wasDragged:!0,mouseDownPos:s.clone(),mouseDragPos:s.clone().add(l),vertex:c}};c.listeners.fireDragEvent(u),t.redraw()}e=new a(h)}else if(2==r.touches.length){if(!this.config.enablePan)return;r.preventDefault(),r.stopPropagation(),t.setOffset(t.draw.offset.clone().addXY(r.deltaX,r.deltaY)),t.redraw()}},touchEnd:r=>{if(i&&"vertex"==i.typeName){if(!s)return;var n=t.vertices[i.vindex],a={isTouchEvent:!0,params:{dragAmount:{x:0,y:0},wasDragged:!1,mouseDownPos:s.clone(),mouseDragPos:s.clone(),vertex:n}};e&&s&&s.distance(e)<.001?n.listeners.fireClickEvent(a):n.listeners.fireDragEndEvent(a)}h()},touchCancel:t=>{h()},multipointStart:e=>{r=t.draw.scale.clone()},multipointEnd:t=>{r=null},pinch:e=>{if(!this.config.enableZoom)return;const s=e.touches.item(0),i=e.touches.item(1);if(!(e.touches&&r&&s&&i))return;const n=new a(s.clientX,s.clientY),h=new a(i.clientX,i.clientY),o=new l(n,h).vertAt(.5);t.setZoom(r.x*e.zoom,r.y*e.zoom,o),t.redraw()}};if(window.createAlloyFinger){(0,window.createAlloyFinger)(this.eventCatcher?this.eventCatcher:this.canvas,o)}else new L(this.eventCatcher?this.eventCatcher:this.canvas,o)}catch(t){console.error("Failed to initialize AlloyFinger!"),console.error(t)}else globalThis.Touchy&&"function"==typeof globalThis.Touchy?console.error("[Deprecation] Found Touchy which is not supported any more. Please use AlloyFinger instead."):console.warn("Cannot initialize the touch handler. AlloyFinger is missig. Did you include it?")}else t.console.log("Touch interaction disabled.");this.config.enableKeys?this.keyHandler=new w({trackAll:!0}).down("escape",function(){t.clearSelection(!0)}).down("shift",function(){t.selectPolygon=new c,t.redraw()}).up("shift",function(){null!=t.selectPolygon&&(t.selectVerticesInPolygon(t.selectPolygon),t.selectPolygon=null,t.redraw())}):t.console.log("Keyboard interaction disabled.")}createGUI(t){const e=globalThis.utils;if(e&&"function"==typeof e.createGUI)return this._gui=e.createGUI(this,t);throw"Cannot create dat.GUI or lil-gui instance; did you load the ./utils/creategui helper function an the dat.GUI/lil-gui library?"}getGUI(){return this._gui}}O.DEFAULT_CANVAS_WIDTH=1024,O.DEFAULT_CANVAS_HEIGHT=768,O.DEFAULT_CLICK_TOLERANCE=8,O.DEFAULT_TOUCH_TOLERANCE=32,O.Draggable=(k(I=class{constructor(t,e){this.item=t,this.typeName=e}isVertex(){return this.typeName==O.Draggable.VERTEX}setVIndex(t){return this.vindex=t,this}},"Draggable"),I.VERTEX="vertex",I),O.utils={safeMergeByKeys:(t,e)=>{for(var s in e)if(e.hasOwnProperty(s))if(t.hasOwnProperty(s)){const i=typeof t[s],r=e[s];try{t[s]="boolean"==i?"string"==typeof r?Boolean(!!JSON.parse(r)):r:"number"==i&&"string"==typeof r?Number(1*JSON.parse(r)):e[s]}catch(t){console.error("error in key ",s,r,t)}}else t[s]=e[s];return t},setCSSscale:(t,e,s)=>{t.style.transformOrigin="0 0",1==e&&1==s?t.style.removeProperty("transform"):t.style.transform="scale("+e+","+s+")"},fetch:{val:(t,e,s)=>t.hasOwnProperty(e)?void 0===t[e]?s:t[e]:s,num:(t,e,s)=>{if(!t.hasOwnProperty(e))return s;if("number"==typeof t[e])return t[e];try{return 1*JSON.parse(t[e])}catch(t){return s}},bool:(t,e,s)=>{if(!t.hasOwnProperty(e))return s;if("boolean"==typeof t[e])return t[e];try{return!!JSON.parse(t[e])}catch(t){return s}},func:(t,e,s)=>t.hasOwnProperty(e)?"function"!=typeof t[e]?s:t[e]:s},enableBezierPathAutoAdjust:t=>{for(var e=0;e<t.bezierCurves.length;e++)t.bezierCurves[e].startPoint.listeners.addDragListener(function(e){var s=t.locateCurveByStartPoint(e.params.vertex);t.bezierCurves[s].startPoint.addXY(-e.params.dragAmount.x,-e.params.dragAmount.y),t.moveCurvePoint(1*s,t.START_POINT,e.params.dragAmount),t.updateArcLengths()}),t.bezierCurves[e].startControlPoint.listeners.addDragListener(function(e){var s=t.locateCurveByStartControlPoint(e.params.vertex);t.bezierCurves[s].startPoint.attr.bezierAutoAdjust&&(t.adjustPredecessorControlPoint(1*s,!0,!1),t.updateArcLengths())}),t.bezierCurves[e].endControlPoint.listeners.addDragListener(function(e){var s=t.locateCurveByEndControlPoint(e.params.vertex);t.bezierCurves[s%t.bezierCurves.length].endPoint.attr.bezierAutoAdjust&&(t.adjustSuccessorControlPoint(1*s,!0,!1),t.updateArcLengths())}),e+1==t.bezierCurves.length&&t.bezierCurves[t.bezierCurves.length-1].endPoint.listeners.addDragListener(function(e){if(!t.adjustCircular){var s=t.locateCurveByEndPoint(e.params.vertex);t.moveCurvePoint(1*s,t.END_CONTROL_POINT,new a({x:e.params.dragAmount.x,y:e.params.dragAmount.y}))}t.updateArcLengths()})}},exports.BezierPath=g,exports.Bounds=u,exports.Circle=i,exports.CircleSector=f,exports.CubicBezierCurve=d,exports.Grid=b,exports.KeyHandler=w,exports.Line=l,exports.MouseHandler=A,exports.PBImage=S,exports.PBText=T,exports.PlotBoilerplate=O,exports.Polygon=c,exports.Triangle=r,exports.UIDGenerator=e,exports.VEllipse=D,exports.VEllipseSector=E,exports.Vector=o,exports.VertTuple=h,exports.Vertex=a,exports.VertexAttr=t,exports.VertexListeners=s,exports.XMouseEvent=C,exports.XWheelEvent=P,exports.drawutils=y,exports.drawutilsgl=p,exports.drawutilssvg=v,exports.geomutils=n;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});class t{constructor(){for(var e in this.draggable=!0,this.selectable=!0,this.isSelected=!1,this.visible=!0,t.model)this[e]=t.model[e]}}t.model={draggable:!0,selectable:!0,isSelected:!1,visible:!0};class e{static next(){return""+e.current++}}e.current=0;class s{constructor(t){this.click=[],this.drag=[],this.dragStart=[],this.dragEnd=[],this.vertex=t}addClickListener(t){return s._addListener(this.click,t),this}removeClickListener(t){return this.click=s._removeListener(this.click,t),this}addDragListener(t){return s._addListener(this.drag,t),this}removeDragListener(t){return this.drag=s._removeListener(this.drag,t),this}addDragStartListener(t){return s._addListener(this.dragStart,t),this}removeDragStartListener(t){return this.dragStart=s._removeListener(this.dragStart,t),this}addDragEndListener(t){return s._addListener(this.dragEnd,t),this}removeDragEndListener(t){return this.dragEnd=s._removeListener(this.dragEnd,t),this}fireClickEvent(t){s._fireEvent(this,this.click,t)}fireDragEvent(t){s._fireEvent(this,this.drag,t)}fireDragStartEvent(t){s._fireEvent(this,this.dragStart,t)}fireDragEndEvent(t){s._fireEvent(this,this.dragEnd,t)}removeAllListeners(){this.click=[],this.drag=[],this.dragStart=[],this.dragEnd=[]}static _fireEvent(t,e,s){const i=s;for(var r in void 0===i.params?i.params={vertex:t.vertex}:i.params.vertex=t.vertex,e)e[r](i)}static _addListener(t,e){if(!e)throw new Error("Cannot add null listener. This would lead to unpredictable errors during event handling.");for(var s in t)if(t[s]==e)return!1;return t.push(e),!0}static _removeListener(t,e){for(var s=0;s<t.length;s++)if(t[s]==e)return t.splice(s,1);return t}}class i{constructor(t,s){this.className="Circle",this.uid=e.next(),this.center=t,this.radius=s}move(t){return this.center.add(t),this}containsPoint(t){return this.center.distance(t)<this.radius}containsCircle(t){return this.center.distance(t.center)+t.radius<this.radius}lineDistance(t){return t.getClosestPoint(this.center).distance(this.center)-this.radius}vertAt(t){return i.circleUtils.vertAt(t,this.radius).add(this.center)}tangentAt(t){const e=i.circleUtils.vertAt(t,this.radius);return new h(e,new o(0,0)).add(this.center).perp()}getBounds(){return new d(this.center.clone().subXY(Math.abs(this.radius),Math.abs(this.radius)),this.center.clone().addXY(Math.abs(this.radius),Math.abs(this.radius)))}circleIntersection(t){if(this.center.distance(t.center)>this.radius+t.radius)return null;if(this.center.distance(t.center)<Math.abs(this.radius-t.radius))return null;var e=this.center,s=t.center,i=e.distance(s),r=(this.radius*this.radius-t.radius*t.radius+i*i)/(2*i),n=Math.sqrt(this.radius*this.radius-r*r),a=s.clone().scale(r/i,e),h=a.x+n*(s.y-e.y)/i,c=a.y-n*(s.x-e.x)/i,d=a.x-n*(s.y-e.y)/i,u=a.y+n*(s.x-e.x)/i;return new l(new o(h,c),new o(d,u))}lineIntersection(t,e){const s=new o,i=new o,r=new o(t).sub(this.center),n=new o(e).sub(this.center),a=r.difference(n);0===Math.abs(a.y)&&(a.y=1e-6);const h=r.distance(n),c=r.x*n.y-r.y*n.x,d=h*h;if(this.radius*this.radius*d-c*c<0)return null;const u=this.radius*this.radius*h*h-c*c,g=Math.sqrt(u);return s.x=(c*a.y+Math.sign(a.y)*a.x*g)/d,i.x=(c*a.y-Math.sign(a.y)*a.x*g)/d,s.y=(-c*a.x+Math.abs(a.y)*g)/d,i.y=(-c*a.x-Math.abs(a.y)*g)/d,new l(s.add(this.center),i.add(this.center))}lineIntersections(t,e=!1){const s=this.lineIntersection(t.a,t.b);return s?e?[s.a,s.b].filter(e=>t.hasPoint(e,!0)):[s.a,s.b]:[]}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map(t=>{const e=new l(this.center,t).angle();return this.tangentAt(e)})}closestPoint(t){const e=this.lineIntersection(this.center,t);return e?e.a.distance(t)<e.b.distance(t)?e.a:e.b:new o}destroy(){this.center.destroy(),this.isDestroyed=!0}}i.circleUtils={vertAt:(t,e)=>new o(Math.cos(t)*e,Math.sin(t)*e)};class r{constructor(t,s,i){this.className="Triangle",this.uid=e.next(),this.a=t,this.b=s,this.c=i,this.calcCircumcircle()}static fromArray(t){if(t.length<3)throw`Cannot create triangle from array with less than three vertices (${t.length})`;return new r(t[0],t[1],t[2])}getArea(){return Math.abs(r.utils.signedArea(this.a.x,this.a.y,this.b.x,this.b.y,this.c.x,this.c.y))}getCentroid(){return new o((this.a.x+this.b.x+this.c.x)/3,(this.a.y+this.b.y+this.c.y)/3)}scaleToCentroid(t){let e=this.getCentroid();return this.a.scale(t,e),this.b.scale(t,e),this.c.scale(t,e),this}getBounds(){return this.bounds()}move(t){return this.a.add(t),this.b.add(t),this.c.add(t),this}getCircumcircle(){return this.calcCircumcircle(),new i(this.center.clone(),this.radius)}isAdjacent(t){var e=this.a.equals(t.a)||this.a.equals(t.b)||this.a.equals(t.c),s=this.b.equals(t.a)||this.b.equals(t.b)||this.b.equals(t.c),i=this.c.equals(t.a)||this.c.equals(t.b)||this.c.equals(t.c);return e&&s||e&&i||s&&i}getThirdVertex(t,e){return this.a.equals(t)&&this.b.equals(e)||this.a.equals(e)&&this.b.equals(t)?this.c:this.b.equals(t)&&this.c.equals(e)||this.b.equals(e)&&this.c.equals(t)?this.a:this.b}calcCircumcircle(){const t=this.b.x-this.a.x,e=this.b.y-this.a.y,s=this.c.x-this.a.x,i=this.c.y-this.a.y,n=t*(this.a.x+this.b.x)+e*(this.a.y+this.b.y),a=s*(this.a.x+this.c.x)+i*(this.a.y+this.c.y),h=2*(t*(this.c.y-this.b.y)-e*(this.c.x-this.b.x));let l,c;if(Math.abs(h)<r.EPSILON){const t=this.bounds();this.center=new o((t.min.x+t.max.x)/2,(t.min.y+t.max.y)/2),l=this.center.x-t.min.x,c=this.center.y-t.min.y}else{const r=(i*n-e*a)/h,d=(t*a-s*n)/h;this.center=new o(r,d),l=this.center.x-this.a.x,c=this.center.y-this.a.y}this.radius_squared=l*l+c*c,this.radius=Math.sqrt(this.radius_squared)}inCircumcircle(t){const e=this.center.x-t.x,s=this.center.y-t.y;return e*e+s*s<=this.radius_squared}bounds(){return new d(new o(r.utils.min3(this.a.x,this.b.x,this.c.x),r.utils.min3(this.a.y,this.b.y,this.c.y)),new o(r.utils.max3(this.a.x,this.b.x,this.c.x),r.utils.max3(this.a.y,this.b.y,this.c.y)))}lineIntersections(t,e=!1){return c.utils.locateLineIntersecion(t,[this.a,this.b,this.c],!1,e).map(t=>t.intersection)}lineIntersectionTangents(t,e=!1){return c.utils.locateLineIntersecion(t,[this.a,this.b,this.c],!1,e).map(t=>{const e=this.getEdgeAt(t.edgeIndex);return new h(e.a.clone(),e.b.clone()).moveTo(t.intersection)})}getEdgeAt(t){var e=t%3;return 0===e?new l(this.a,this.b):1===e?new l(this.b,this.c):new l(this.c,this.a)}toPolygon(){return new c([this.a,this.b,this.c])}determinant(){return r.utils.determinant(this.a,this.b,this.c)}containsPoint(t){return r.utils.pointIsInTriangle(t.x,t.y,this.a.x,this.a.y,this.b.x,this.b.y,this.c.x,this.c.y)}getIncircularTriangle(){const t=new l(this.a,this.b),e=new l(this.b,this.c),s=new l(this.c,this.a),i=n.nsectAngle(this.b,this.a,this.c,2)[0],o=n.nsectAngle(this.c,this.b,this.a,2)[0],a=i.intersection(o),h=t.getClosestPoint(a),c=e.getClosestPoint(a),d=s.getClosestPoint(a);return new r(h,c,d)}getIncircle(){return this.getIncircularTriangle().getCircumcircle()}getIncenter(){return this.center&&this.radius||this.calcCircumcircle(),this.center.clone()}toString(){return"{ a : "+this.a.toString()+", b : "+this.b.toString()+", c : "+this.c.toString()+"}"}destroy(){this.a.destroy(),this.b.destroy(),this.c.destroy(),this.isDestroyed=!0}}r.EPSILON=1e-6,r.utils={max3:(t,e,s)=>t>=e&&t>=s?t:e>=t&&e>=s?e:s,min3:(t,e,s)=>t<=e&&t<=s?t:e<=t&&e<=s?e:s,signedArea:(t,e,s,i,r,n)=>.5*(-i*r+e*(-s+r)+t*(i-n)+s*n),pointIsInTriangle(t,e,s,i,n,o,a,h){var l=r.utils.signedArea(s,i,n,o,a,h),c=1/(2*l)*(i*a-s*h+(h-i)*t+(s-a)*e),d=1/(2*l)*(s*o-i*n+(i-o)*t+(n-s)*e);return c>0&&d>0&&1-c-d>0},determinant:(t,e,s)=>(e.y-t.y)*(s.x-e.x)-(s.y-e.y)*(e.x-t.x)};const n={mapAngleTo2PI(t){const e=Math.asin(Math.sin(t));return Math.cos(t)<0?Math.PI-e:e<0?e+2*Math.PI:e},dist4:(t,e,s,i)=>Math.sqrt(Math.pow(s-t,2)+Math.pow(e-i,2)),dotProduct:(t,e)=>t.x*e.x+t.y*e.y,nsectAngle(t,e,s,i){const n=new r(t,e,s),o=new l(t,e),a=new l(t,s);var h=o.angle(a);const c=n.determinant()>0;h<0&&(h=2*Math.PI+h),c||(h=-1*(2*Math.PI-h));const d=Math.max(o.length(),a.length())/o.length();for(var u=[],g=1;g<i;g++)u.push(new l(t,e.clone().rotate(h/i*-g,t)).scale(d));return u},wrapMax:(t,e)=>(e+t%e)%e,wrapMinMax:(t,e,s)=>e+n.wrapMax(t-e,s-e)};class o{constructor(i,r){if(this.className="Vertex",this.uid=e.next(),void 0===i)this.x=0,this.y=0;else if("number"==typeof i&&"number"==typeof r)this.x=i,this.y=r;else{const t=i;"number"==typeof t.x&&"number"==typeof t.y?(this.x=t.x,this.y=t.y):(this.x="number"==typeof i?i:void 0===i?0:NaN,this.y="number"==typeof r?r:void 0===r?0:NaN)}this.attr=new t,this.listeners=new s(this)}set(t,e){if("number"==typeof t&&"number"==typeof e)this.x=t,this.y=e;else{const s=t;"number"==typeof s.x&&"number"==typeof s.y?(this.x=s.x,this.y=s.y):(this.x="number"==typeof t?t:void 0===t?0:NaN,this.y="number"==typeof e?e:void 0===e?0:NaN)}return this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}invX(){return this.x=-this.x,this}invY(){return this.y=-this.y,this}add(t,e){if("number"==typeof t&&"number"==typeof e)this.x+=t,this.y+=e;else{const s=t;if("number"==typeof s.x&&"number"==typeof s.y)this.x+=s.x,this.y+=s.y;else{if("number"!=typeof t)throw`Cannot add ${typeof t} to numeric x component!`;if(this.x+=t,"number"!=typeof e)throw`Cannot add ${typeof e} to numeric y component!`;this.y+=e}}return this}move(t){return this.add(t)}addXY(t,e){return this.x+=t,this.y+=e,this}addX(t){return this.x+=t,this}addY(t){return this.y+=t,this}sub(t,e){if("number"==typeof t&&"number"==typeof e)this.x-=t,this.y-=e;else{const s=t;if("number"==typeof s.x&&"number"==typeof s.y)this.x-=s.x,this.y-=s.y;else{if("number"!=typeof t)throw`Cannot add ${typeof t} to numeric x component!`;if(this.x-=t,"number"!=typeof e)throw`Cannot add ${typeof e} to numeric y component!`;this.y-=e}}return this}subXY(t,e){return this.x-=t,this.y-=e,this}subX(t){return this.x-=t,this}subY(t){return this.y-=t,this}equals(t){var e=Math.abs(this.x-t.x)<o.EPSILON,s=Math.abs(this.y-t.y)<o.EPSILON;return e&&s}clone(){return new o(this.x,this.y)}distance(t){return n.dist4(this.x,this.y,t.x,t.y)}angle(t){const e=void 0===t?Math.PI/2-Math.atan2(this.x,this.y):Math.PI/2-Math.atan2(t.x-this.x,t.y-this.y);return e<0?2*Math.PI+e:e}difference(t){return new o(t.x-this.x,t.y-this.y)}scale(t,e){return this.scaleXY({x:t,y:t},e)}lerp(t,e){var s=this.difference(t);return this.x+=s.x*e,this.y+=s.y*e,this}lerpAbs(t,e){var s=this.distance(t),i=this.difference(t),r=i.x/s,n=i.y/s;return this.x+=r*e,this.y+=n*e,this}scaleXY(t,e){return e&&void 0!==e||(e={x:0,y:0}),this.x=e.x+(this.x-e.x)*t.x,this.y=e.y+(this.y-e.y)*t.y,this}rotate(t,e){e&&void 0!==e||(e={x:0,y:0}),this.sub(e),t+=Math.atan2(this.y,this.x);let s=this.distance(o.ZERO);return this.x=s*Math.cos(t),this.y=s*Math.sin(t),this.add(e),this}multiplyScalar(t){return this.x*=t,this.y*=t,this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}inv(){return this.x=-this.x,this.y=-this.y,this}abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this}getBounds(){return d.computeFromVertices([this])}toString(t){return void 0===t?"("+this.x+","+this.y+")":"("+this.x.toFixed(t)+","+this.y.toFixed(t)+")"}destroy(){this.listeners.removeAllListeners(),this.isDestroyed=!0}static randomVertex(t){return new o(t.min.x+Math.random()*(t.max.x-t.min.x),t.min.y+Math.random()*(t.max.y-t.min.y))}}o.ZERO=new o(0,0),o.EPSILON=1e-6,o.utils={buildArrowHead:(t,e,s,i,r)=>{console.warn("[DEPRECATION] Vertex.utils.buildArrowHead is deprecated. Please use Vector.utils.buildArrowHead instead.");var n=Math.atan2((e.y-t.y)*r,(e.x-t.x)*i),a=[];return a.push(new o(e.x*i-s*Math.cos(n),e.y*r-s*Math.sin(n))),a.push(new o(e.x*i-1.35*s*Math.cos(n-Math.PI/8),e.y*r-1.35*s*Math.sin(n-Math.PI/8))),a.push(new o(e.x*i,e.y*r)),a.push(new o(e.x*i-1.35*s*Math.cos(n+Math.PI/8),e.y*r-1.35*s*Math.sin(n+Math.PI/8))),a},arrayToJSON:(t,e)=>JSON.stringify(t.map(function(t){return void 0===typeof e?{x:t.x,y:t.y}:{x:Number(t.x.toFixed(e)),y:Number(t.y.toFixed(e))}}))};class a{constructor(t,s,i){this.uid=e.next(),this.a=t,this.b=s,this.factory=i}length(){return Math.sqrt(Math.pow(this.b.x-this.a.x,2)+Math.pow(this.b.y-this.a.y,2))}setLength(t){return this.scale(t/this.length())}sub(t){return this.a.sub(t),this.b.sub(t),this}add(t){return this.a.add(t),this.b.add(t),this}revert(){const t=this.a;return this.a=this.b,this.b=t,this}normalize(){return this.b.set(this.a.x+(this.b.x-this.a.x)/this.length(),this.a.y+(this.b.y-this.a.y)/this.length()),this}scale(t){return this.b.set(this.a.x+(this.b.x-this.a.x)*t,this.a.y+(this.b.y-this.a.y)*t),this}moveTo(t){let e=this.a.difference(t);return this.a.add(e),this.b.add(e),this}move(t){return this.a.add(t),this.b.add(t),this}angle(t){null!=t&&void 0!==t||(t=this.factory(new o(0,0),new o(100,0)));const e=this.b.clone().sub(this.a),s=t.b.clone().sub(t.a);return Math.atan2(s.x,s.y)-Math.atan2(e.x,e.y)}vertAt(t){return new o(this.a.x+(this.b.x-this.a.x)*t,this.a.y+(this.b.y-this.a.y)*t)}denominator(t){return(t.b.y-t.a.y)*(this.b.x-this.a.x)-(t.b.x-t.a.x)*(this.b.y-this.a.y)}colinear(t,e){return Math.abs(this.denominator(t))<(void 0===e?o.EPSILON:e)}getClosestT(t){var e=a.vtutils.dist2(this.a,this.b);return 0===e?0:((t.x-this.a.x)*(this.b.x-this.a.x)+(t.y-this.a.y)*(this.b.y-this.a.y))/e}hasPoint(t,e,s){const i=this.getClosestT(t),r=Math.sqrt(a.vtutils.dist2(t,this.vertAt(i)));return void 0!==e&&e?r<(null!=s?s:o.EPSILON)&&i>=0&&i<=1:r<(null!=s?s:o.EPSILON)}getClosestPoint(t){var e=this.getClosestT(t);return this.vertAt(e)}pointDistance(t){return Math.sqrt(a.vtutils.dist2(t,this.vertAt(this.getClosestT(t))))}clone(){return this.factory(this.a.clone(),this.b.clone())}toString(){return"{ a : "+this.a.toString()+", b : "+this.b.toString()+" }"}destroy(){this.a.destroy(),this.b.destroy(),this.isDestroyed=!0}}a.vtutils={dist2:(t,e)=>(t.x-e.x)*(t.x-e.x)+(t.y-e.y)*(t.y-e.y)};class h extends a{constructor(t,e){super(t,e,(t,e)=>new h(t,e)),this.className="Vector"}perp(){var t=this.clone();return t.sub(this.a),(t=new h(new o,new o(-t.b.y,t.b.x))).a.add(this.a),t.b.add(this.a),t}inverse(){var t=this.a;return this.a=this.b,this.b=t,this}inv(){return this.b.x=this.a.x-(this.b.x-this.a.x),this.b.y=this.a.y-(this.b.y-this.a.y),this}intersection(t){var e=this.denominator(t);if(0==e)return null;var s=this.a.y-t.a.y,i=this.a.x-t.a.x,r=(t.b.x-t.a.x)*s-(t.b.y-t.a.y)*i,n=(this.b.x-this.a.x)*s-(this.b.y-this.a.y)*i;return s=r/e,i=n/e,new o(this.a.x+s*(this.b.x-this.a.x),this.a.y+s*(this.b.y-this.a.y))}getOrthogonal(){const t=this.a.clone(),e=this.b.clone().sub(this.a),s=e.x;return e.x=-e.y,e.y=s,new h(t,e.add(this.a))}rotate(t){return this.b.rotate(t,this.a),this}}h.utils={buildArrowHead:(t,e,s,i,r)=>{const n=Math.atan2((e.y-t.y)*r,(e.x-t.x)*i),a=[];return a.push(new o(e.x*i-s*Math.cos(n),e.y*r-s*Math.sin(n))),a.push(new o(e.x*i-1.35*s*Math.cos(n-Math.PI/8),e.y*r-1.35*s*Math.sin(n-Math.PI/8))),a.push(new o(e.x*i,e.y*r)),a.push(new o(e.x*i-1.35*s*Math.cos(n+Math.PI/8),e.y*r-1.35*s*Math.sin(n+Math.PI/8))),a}};class l extends a{constructor(t,e){super(t,e,(t,e)=>new l(t,e)),this.className="Line"}intersection(t){const e=this.denominator(t);if(0==e)return null;let s=this.a.y-t.a.y,i=this.a.x-t.a.x;const r=(t.b.x-t.a.x)*s-(t.b.y-t.a.y)*i,n=(this.b.x-this.a.x)*s-(this.b.y-this.a.y)*i;s=r/e,i=n/e;const a=this.a.x+s*(this.b.x-this.a.x),h=this.a.y+s*(this.b.y-this.a.y);return isNaN(s)||isNaN(a)||isNaN(h)?null:new o(a,h)}getBounds(){return d.computeFromVertices([this.a,this.b])}getStartPoint(){return this.a}getEndPoint(){return this.b}getStartTangent(){return this.b}getEndTangent(){return this.a}reverse(){var t=this.a;return this.a=this.b,this.b=t,this}lineIntersections(t,e=!1){const s=this.intersection(t);return s?!this.hasPoint(s,!0)||e&&!t.hasPoint(s,e)?[]:[s]:[]}lineIntersectionTangents(t,e=!1){const s=this.lineIntersections(t,e);if(0===s.length)return[];const i=s[0];return[new h(this.a.clone(),this.b.clone()).moveTo(i)]}}class c{constructor(t,s){this.className="Polygon",this.uid=e.next(),void 0===t&&(t=[]),this.vertices=t,this.isOpen=s||!1}addVertex(t){this.vertices.push(t)}addVertexAt(t,e){this.vertices.splice(e,0,t)}getEdgeAt(t){return new l(this.getVertexAt(t),this.getVertexAt(t+1))}getEdges(){const t=[];for(var e=0;e+1<this.vertices.length;e++)t.push(this.getEdgeAt(e));return!this.isOpen&&this.vertices.length>0&&t.push(this.getEdgeAt(this.vertices.length-1)),t}getInnerAngleAt(t){const e=this.vertices[t%this.vertices.length],s=this.vertices[(t+this.vertices.length-1)%this.vertices.length].clone(),i=this.vertices[(t+1)%this.vertices.length].clone(),r=this.isAngleAcute(t),a=new o(0,0),h=new o(e.x-s.x,e.y-s.y),l=new o(i.x-e.x,i.y-e.y),c=a.distance(h),d=a.distance(l),u=n.dotProduct(h,l),g=c*d;return r?Math.PI-Math.acos(u/g):Math.PI+Math.acos(u/g)}isAngleAcute(t){const e=this.vertices[(t+this.vertices.length-1)%this.vertices.length].clone(),s=this.vertices[t%this.vertices.length],i=this.vertices[(t+1)%this.vertices.length].clone();return r.utils.determinant(e,s,i)<0}getVertexAt(t){return t<0?this.vertices[this.vertices.length-Math.abs(t)%this.vertices.length]:this.vertices[t%this.vertices.length]}move(t){for(var e in this.vertices)this.vertices[e].add(t);return this}containsVert(t){for(var e=!1,s=0,i=this.vertices.length-1;s<this.vertices.length;i=s++){let r=this.vertices[s].x,n=this.vertices[s].y,o=this.vertices[i].x,a=this.vertices[i].y;n>t.y!=a>t.y&&t.x<(o-r)*(t.y-n)/(a-n)+r&&(e=!e)}return e}containsVerts(t){return t.every(t=>this.containsVert(t))}containsPolygon(t){for(var e=0;e<t.vertices.length;e++)if(!this.containsVert(t.vertices[e]))return!1;const s=new l(new o,new o);for(e=0;e<t.vertices.length;e++)if(s.a.set(t.vertices[e]),s.b.set(t.vertices[(e+1)%t.vertices.length]),this.lineIntersections(s,!0).length>0)return!1;return!0}area(){return c.utils.area(this.vertices)}signedArea(){return c.utils.signedArea(this.vertices)}isClockwise(){return c.utils.isClockwise(this.vertices)}perimeter(){let t=0;for(var e=1;e<this.vertices.length;e++)t+=this.vertices[e-1].distance(this.vertices[e]);return!this.isOpen&&this.vertices.length>1&&(t+=this.vertices[0].distance(this.vertices[this.vertices.length-1])),t}scale(t,e){for(var s in this.vertices)"function"==typeof this.vertices[s].scale?this.vertices[s].scale(t,e):console.log("There seems to be a null vertex!",this.vertices[s]);return this}rotate(t,e){for(var s in this.vertices)this.vertices[s].rotate(t,e);return this}getMeanCenter(){if(0===this.vertices.length)return null;const t=this.vertices[0].clone();for(var e=1;e<this.vertices.length;e++)t.add(this.vertices[e]);return t.x/=this.vertices.length,t.y/=this.vertices.length,t}getCentroid(){if(0===this.vertices.length)return null;const t=new o(0,0),e=this.vertices.length;for(var s=0;s<e;s++){const r=this.vertices[s],n=this.vertices[(s+1)%e];var i=r.x*n.y-n.x*r.y;t.x+=(r.x+n.x)*i,t.y+=(r.y+n.y)*i}const r=this.area();return t.x*=1/(6*r),t.y*=1/(6*r),t}lineIntersections(t,e=!1){return c.utils.locateLineIntersecion(t,this.vertices,this.isOpen,e).map(t=>t.intersection)}lineIntersectionTangents(t,e=!1){return c.utils.locateLineIntersecion(t,this.vertices,this.isOpen,e).map(t=>{const e=this.getEdgeAt(t.edgeIndex);return new h(e.a.clone(),e.b.clone()).moveTo(t.intersection)})}lineIntersectionTangentsIndices(t,e=!1){return c.utils.locateLineIntersecion(t,this.vertices,this.isOpen,e).map(t=>{const e=this.getEdgeAt(t.edgeIndex);return{intersection:new h(e.a.clone(),e.b.clone()).moveTo(t.intersection),edgeIndex:t.edgeIndex}})}closestLineIntersection(t,e=!1){var s=this.closestLineIntersectionIndex(t,e);return s?s.intersection:null}closestLineIntersectionIndex(t,e=!1){const s=this.lineIntersections(t,e);if(s.length<=0)return null;let i=new o(Number.MAX_VALUE,Number.MAX_VALUE),r=-1,n=Number.MAX_VALUE;for(var a=0;a<s.length;a++){const e=s[a],o=e.distance(t.a);o<n&&(n=o,i=e,r=a)}return{edgeIndex:r,intersection:i}}getInterpolationPolygon(t){const e=[];for(var s=0;s<this.vertices.length;s++){const r=this.vertices[s],n=this.vertices[(s+1)%this.vertices.length];if(e.push(r.clone()),!this.isOpen||s+1!==this.vertices.length){const s=1/(t+1);for(var i=1;i<=t;i++)e.push(r.clone().lerp(n,s*i))}}return new c(e,this.isOpen)}getEvenDistributionPolygon(t){if(t<=0)throw new Error("pointCount must be larger than zero; is "+t+".");const e=new c([],this.isOpen);if(0===this.vertices.length)return e;let s=new o(this.vertices[0]);if(e.vertices.push(s),1===this.vertices.length)return e;const i=this.perimeter()/t,r=this.vertices.length;let n=1,a=new o(this.vertices[1]),h=s.distance(a),l=this.isOpen?r:r+1,d=i;for(var u=1;u<t&&n<l;)if(d<h){let t=s.clone().lerpAbs(a,d);e.vertices.push(t),d+=i,u++}else n++,s=a,a=new o(this.vertices[n%r]),d-=h,h=s.distance(a);return e}getBounds(){return d.computeFromVertices(this.vertices)}clone(){return new c(this.vertices.map(t=>t.clone()),this.isOpen)}elimitateColinearEdges(t){const e=void 0===t?1:t,s=this.vertices.slice();let i=0;for(var r=new l(new o,new o),n=new l(new o,new o);i+1<s.length&&s.length>2;){const t=s[i],o=s[(i+1)%s.length];r.a=t,r.b=o,n.a=o;let a=!1,h=i+2;do{let t=s[h%s.length];n.b=t,a=r.colinear(n,e),a&&h++}while(a);h-i>2&&s.splice(i+1,h-i-2),i++}return new c(s,this.isOpen)}toQuadraticBezierData(){if(this.vertices.length<3)return[];var t=[],e=this.vertices[0],s=this.vertices[1],i=new o(e.x+(s.x-e.x)/2,e.y+(s.y-e.y)/2);t.push(i);for(var r=this.isOpen?this.vertices.length:this.vertices.length+1,n=1;n<r;n++){e=this.vertices[n%this.vertices.length],s=this.vertices[(n+1)%this.vertices.length];i=new o(e.x+(s.x-e.x)/2,e.y+(s.y-e.y)/2);t.push(e),t.push(i),e=s}return t}toQuadraticBezierSVGString(){var t=this.toQuadraticBezierData();if(0==t.length)return"";for(var e=["M "+t[0].x+" "+t[0].y],s=1;s<t.length;s+=2)e.push("Q "+t[s].x+" "+t[s].y+", "+t[s+1].x+" "+t[s+1].y);return e.join(" ")}toCubicBezierData(t){if(void 0===t&&(t=1),this.vertices.length<3)return[];var e=[],s=this.vertices[0],i=this.vertices[1],r=new o(s.x+(i.x-s.x)/2,s.y+(i.y-s.y)/2);e.push(r);for(var n=this.isOpen?this.vertices.length-1:this.vertices.length,a=0;a<n;a++){s=this.vertices[a%this.vertices.length],i=this.vertices[(a+1)%this.vertices.length];var h=this.vertices[(a+2)%this.vertices.length],l=new o(s.x+(i.x-s.x)/2,s.y+(i.y-s.y)/2),c=new o(i.x+(h.x-i.x)/2,i.y+(h.y-i.y)/2),d=new o(l.x+(i.x-l.x)*t,l.y+(i.y-l.y)*t),u=new o(c.x+(i.x-c.x)*t,c.y+(i.y-c.y)*t);e.push(d),e.push(u),e.push(c)}return e}toCubicBezierSVGString(t){var e=this.toCubicBezierData(t);if(0==e.length)return"";for(var s=["M "+e[0].x+" "+e[0].y],i=1;i<e.length;i+=3)s.push("C "+e[i].x+" "+e[i].y+", "+e[i+1].x+" "+e[i+1].y+", "+e[i+2].x+" "+e[i+2].y);return s.join(" ")}toCubicBezierPath(t){for(var e=this.toCubicBezierData(t),s=[],i=0;i+3<e.length;i+=3)s.push([e[i],e[i+3],e[i+1],e[i+2]]);return g.fromArray(s)}destroy(){for(var t=0;t<this.vertices.length;t++)this.vertices[t].destroy();this.isDestroyed=!0}}c.utils={area(t){let e=0;for(var s=0,i=t.length;s<i;s++){e+=t[s].x*t[(s+1)%i].y*.5,e-=t[(s+1)%i].x*t[s].y*.5}return Math.abs(e)},isClockwise:t=>c.utils.signedArea(t)<0,signedArea(t){let e=0;const s=t.length;for(var i=0;i<s;i++){const r=(i+1)%s;e+=(t[r].x-t[i].x)*(t[i].y+t[r].y)}return e},locateLineIntersecion(t,e,s,i){const r=[];for(var n=s?e.length-1:e.length,o=0;o<n;o++){const s=new l(e[o%n],e[(o+1)%n]),a=s.intersection(t);null===a||!s.hasPoint(a,!0)||i&&!t.hasPoint(a,i)||r.push({edgeIndex:o,intersection:a})}return r}};class d{constructor(t,e){this.min=t,this.max=e,this.width=e.x-t.x,this.height=e.y-t.y}containsVert(t){return this.min.x<=t.x&&t.x<this.max.x&&this.min.y<=t.y&&t.y<this.max.y}getWidth(){return this.max.x-this.min.x}getHeight(){return this.max.y-this.min.y}getScaled(t){const e=this.getCenter(),s=new o(this.min).scale(t,e),i=new o(this.max).scale(t,e);return new d(s,i)}getMoved(t){const e=new o(this.min).move(t),s=new o(this.max).move(t);return new d(e,s)}getNorthPoint(){return new o(this.min.x+this.width/2,this.min.y)}getSouthPoint(){return new o(this.min.x+this.width/2,this.max.y)}getWestPoint(){return new o(this.min.x,this.min.y+this.height/2)}getEastPoint(){return new o(this.max.x,this.min.y+this.height/2)}getNorthWestPoint(){return new o(this.min.x,this.min.y)}getNorthEastPoint(){return new o(this.max.x,this.min.y)}getSouthEastPoint(){return new o(this.max.x,this.max.y)}getSouthWestPoint(){return new o(this.min.x,this.max.y)}toPolygon(){return new c([new o(this.min),new o(this.max.x,this.min.y),new o(this.max),new o(this.min.x,this.max.y)],!1)}getCenter(){return new o(this.min.x+(this.max.x-this.min.x)/2,this.min.y+(this.max.y-this.min.y)/2)}getMinDimension(){return Math.min(this.width,this.height)}getMaxDimension(){return Math.max(this.width,this.height)}randomPoint(t=0,e=0){const s=t>0&&t<1?this.width*t:t,i=e>0&&e<1?this.height*e:e;return new o(this.min.x+s+Math.random()*(this.width-2*s),this.min.y+i+Math.random()*(this.height-2*i))}toString(){return`{ min: ${this.min.toString()}, max : ${this.max.toString()}, width: ${this.width}, height : ${this.height} }`}clone(){return new d({x:this.min.x,y:this.min.y},{x:this.max.x,y:this.max.y})}static computeFromVertices(t){if(0==t.length)return new d(new o(0,0),new o(0,0));let e,s=t[0].x,i=t[0].x,r=t[0].y,n=t[0].y;for(var a in t)e=t[a],s=Math.min(s,e.x),i=Math.max(i,e.x),r=Math.min(r,e.y),n=Math.max(n,e.y);return new d(new o(s,r),new o(i,n))}static computeFromBoundsSet(t){if(0==t.length)return new d(new o(0,0),new o(0,0));let e,s=t[0].min.x,i=t[0].max.x,r=t[0].min.y,n=t[0].min.y;for(var a in t)e=t[a],s=Math.min(s,e.min.x),i=Math.max(i,e.max.x),r=Math.min(r,e.min.y),n=Math.max(n,e.min.y);return new d(new o(s,r),new o(i,n))}static fromDimension(t,e,s){return new d(null!=s?s:{x:0,y:0},{x:(s?s.x:0)+t,y:(s?s.y:0)+e})}}class u{constructor(t,s,i,r){this.START_POINT=u.START_POINT,this.START_CONTROL_POINT=u.START_CONTROL_POINT,this.END_CONTROL_POINT=u.END_CONTROL_POINT,this.END_POINT=u.END_POINT,this.uid=e.next(),this.startPoint=t,this.startControlPoint=i,this.endPoint=s,this.endControlPoint=r,this.curveIntervals=30,this.segmentCache=[],this.segmentLengths=[],this.updateArcLengths()}moveCurvePoint(t,e,s,i){t==this.START_POINT?(this.getStartPoint().add(e),s&&this.getStartControlPoint().add(e)):t==this.START_CONTROL_POINT?this.getStartControlPoint().add(e):t==this.END_CONTROL_POINT?this.getEndControlPoint().add(e):t==this.END_POINT?(this.getEndPoint().add(e),s&&this.getEndControlPoint().add(e)):console.log(`[CubicBezierCurve.moveCurvePoint] pointID '${t}' invalid.`),i&&this.updateArcLengths()}translate(t){return this.startPoint.add(t),this.startControlPoint.add(t),this.endControlPoint.add(t),this.endPoint.add(t),this}move(t){return this.translate(t)}reverse(){let t=this.startPoint;return this.startPoint=this.endPoint,this.endPoint=t,t=this.startControlPoint,this.startControlPoint=this.endControlPoint,this.endControlPoint=t,this}getLength(){return this.arcLength}updateArcLengths(){let t=this.startPoint.clone(),e=new o(0,0),s=1/this.curveIntervals;this.segmentCache=[],this.segmentCache.push(this.startPoint),this.segmentLengths=[];let i=0;var r=0;let n;for(;r<=1;)e=this.getPointAt(r),this.segmentCache.push(e),n=t.distance(e),this.segmentLengths.push(n),i+=n,t=e,r+=s;this.arcLength=i}getClosestT(t){var e={t:0,tPrev:0,tNext:1},s=0;do{e=this.locateIntervalByDistance(t,e.tPrev,e.tNext,this.curveIntervals),s++}while(s<4&&this.getPointAt(e.tPrev).distance(this.getPointAt(e.tNext))>1);return e.t}locateIntervalByDistance(t,e,s,i){var r=-1,n=0,o=0;const a=s-e;for(var h=0;h<=i;h++){o=e+a*(h/i);var l=this.getPointAt(o).distance(t);(-1==r||l<n)&&(r=h,n=l)}return{t:e+a*(r/i),tPrev:e+a*(Math.max(0,r-1)/i),tNext:e+a*(Math.min(i,r+1)/i)}}getBounds(){const t=u.utils.cubicPolyMinMax(this.startPoint.x,this.startControlPoint.x,this.endControlPoint.x,this.endPoint.x),e=t.min,s=t.max,i=u.utils.cubicPolyMinMax(this.startPoint.y,this.startControlPoint.y,this.endControlPoint.y,this.endPoint.y),r=i.min,n=i.max;return d.computeFromVertices([{x:e,y:r},{x:e,y:n},{x:s,y:n},{x:s,y:r}])}getStartPoint(){return this.startPoint}getEndPoint(){return this.endPoint}getStartControlPoint(){return this.startControlPoint}getEndControlPoint(){return this.endControlPoint}getPointByID(t){if(t==this.START_POINT)return this.startPoint;if(t==this.END_POINT)return this.endPoint;if(t==this.START_CONTROL_POINT)return this.startControlPoint;if(t==this.END_CONTROL_POINT)return this.endControlPoint;throw new Error(`Invalid point ID '${t}'.`)}getPointAt(t){const e=u.utils.evaluateT(this.startPoint.x,this.startControlPoint.x,this.endControlPoint.x,this.endPoint.x,t),s=u.utils.evaluateT(this.startPoint.y,this.startControlPoint.y,this.endControlPoint.y,this.endPoint.y,t);return new o(e,s)}getPoint(t){return this.getPointAt(t/this.arcLength)}getTangentAt(t){const e=this.getStartPoint(),s=this.getStartControlPoint(),i=this.getEndControlPoint(),r=this.getEndPoint(),n=t*t,a=1-2*t+n,h=-3*e.x*a+s.x*(3*a-6*(t-n))+i.x*(6*(t-n)-3*n)+3*r.x*n,l=-3*e.y*a+s.y*(3*a-6*(t-n))+i.y*(6*(t-n)-3*n)+3*r.y*n;return new o(h,l)}trimStart(t){return this.trimStartAt(this.convertU2T(t))}trimStartAt(t){const e=u.utils.getSubCurvePointsAt(this,t,1);return this.startPoint.set(e[0]),this.startControlPoint.set(e[2]),this.endPoint.set(e[1]),this.endControlPoint.set(e[3]),this.updateArcLengths(),this}trimEnd(t){return this.trimEndAt(this.convertU2T(t))}trimEndAt(t){const e=u.utils.getSubCurvePointsAt(this,0,t);return this.startPoint.set(e[0]),this.startControlPoint.set(e[2]),this.endPoint.set(e[1]),this.endControlPoint.set(e[3]),this.updateArcLengths(),this}getSubCurve(t,e){return this.getSubCurveAt(this.convertU2T(t),this.convertU2T(e))}getSubCurveAt(t,e){const s=u.utils.getSubCurvePointsAt(this,t,e);return new u(s[0],s[1],s[2],s[3])}convertU2T(t){return Math.max(0,Math.min(1,t/this.arcLength))}getTangent(t){return this.getTangentAt(this.convertU2T(t))}getPerpendicular(t){return this.getPerpendicularAt(this.convertU2T(t))}getPerpendicularAt(t){const e=this.getTangentAt(t);return new o(e.y,-e.x)}clone(){return new u(this.getStartPoint().clone(),this.getEndPoint().clone(),this.getStartControlPoint().clone(),this.getEndControlPoint().clone())}getStartTangent(){return this.startControlPoint}getEndTangent(){return this.endControlPoint}lineIntersections(t,e=!1){const s=this.lineIntersectionTs(t).map(t=>this.getPointAt(t));return e?s.filter(e=>t.hasPoint(e,!0)):s}lineIntersectionTangents(t,e=!1){const s=this.lineIntersectionTs(t).map(t=>{const e=this.getPointAt(t),s=this.getTangentAt(t);return new h(e,s.add(e))});return e?s.filter(e=>t.hasPoint(e.a,!0)):s}lineIntersectionTs(t){var e=t.b.y-t.a.y,s=t.a.x-t.b.x,i=t.a.x*(t.a.y-t.b.y)+t.a.y*(t.b.x-t.a.x),r=u.utils.bezierCoeffs(this.startPoint.x,this.startControlPoint.x,this.endControlPoint.x,this.endPoint.x),n=u.utils.bezierCoeffs(this.startPoint.y,this.startControlPoint.y,this.endControlPoint.y,this.endPoint.y);const o=Array(4);return o[0]=e*r[0]+s*n[0],o[1]=e*r[1]+s*n[1],o[2]=e*r[2]+s*n[2],o[3]=e*r[3]+s*n[3]+i,u.utils.cubicRoots(o).filter(t=>-1!=t)}equals(t){return!!t&&(!!(t.startPoint&&t.endPoint&&t.startControlPoint&&t.endControlPoint)&&(this.startPoint.equals(t.startPoint)&&this.endPoint.equals(t.endPoint)&&this.startControlPoint.equals(t.startControlPoint)&&this.endControlPoint.equals(t.endControlPoint)))}destroy(){this.startPoint.destroy(),this.endPoint.destroy(),this.startControlPoint.destroy(),this.endControlPoint.destroy(),this.isDestroyed=!0}static isInstance(t){return t instanceof u}toJSON(t){return"{ "+(t?"\n\t":"")+'"startPoint" : ['+this.getStartPoint().x+","+this.getStartPoint().y+"], "+(t?"\n\t":"")+'"endPoint" : ['+this.getEndPoint().x+","+this.getEndPoint().y+"], "+(t?"\n\t":"")+'"startControlPoint": ['+this.getStartControlPoint().x+","+this.getStartControlPoint().y+"], "+(t?"\n\t":"")+'"endControlPoint" : ['+this.getEndControlPoint().x+","+this.getEndControlPoint().y+"]"+(t?"\n\t":"")+" }"}static fromJSON(t){var e=JSON.parse(t);return u.fromObject(e)}static fromObject(t){if("object"!=typeof t)throw"Can only build from object.";if(!t.startPoint)throw'Object member "startPoint" missing.';if(!t.endPoint)throw'Object member "endPoint" missing.';if(!t.startControlPoint)throw'Object member "startControlPoint" missing.';if(!t.endControlPoint)throw'Object member "endControlPoint" missing.';return new u(new o(t.startPoint[0],t.startPoint[1]),new o(t.endPoint[0],t.endPoint[1]),new o(t.startControlPoint[0],t.startControlPoint[1]),new o(t.endControlPoint[0],t.endControlPoint[1]))}static fromArray(t){if(!Array.isArray(t))throw"Can only build from object.";if(4!=t.length)throw"Can only build from array with four elements.";return new u(t[0],t[1],t[2],t[3])}}u.START_POINT=0,u.START_CONTROL_POINT=1,u.END_CONTROL_POINT=2,u.END_POINT=3,u.utils={evaluateT:(t,e,s,i,r)=>t*Math.pow(1-r,3)+3*e*r*Math.pow(1-r,2)+3*s*Math.pow(r,2)*(1-r)+i*Math.pow(r,3),cubicPolyMinMax:(t,e,s,i)=>{var r=u.utils.cubicPoly(t,e,s,i),n=r[0],o=r[1];r[2];var a=r[1]*r[1]-4*r[0]*r[2],h=Math.min(i,t),l=Math.max(i,t);if(a>=0){var c=(-o+Math.sqrt(a))/(2*n);if(c>0&&c<1){var d=u.utils.evaluateT(t,e,s,i,c);d<h&&(h=d),d>l&&(l=d)}var g=(-o-Math.sqrt(a))/(2*n);if(g>0&&g<1){var f=u.utils.evaluateT(t,e,s,i,g);f<h&&(h=f),f>l&&(l=f)}}return{min:h,max:l}},getSubCurvePointsAt:(t,e,s)=>{const i=new h(t.getPointAt(e),t.getTangentAt(e)),r=new h(t.getPointAt(s),t.getTangentAt(s).inv());return i.b.add(i.a),r.b.add(r.a),i.scale(.33333333*(s-e)),r.scale(.33333333*(s-e)),[i.a,r.a,i.b,r.b]},cubicRoots:t=>{const e=t[0],s=t[1]/e,i=t[2]/e,r=t[3]/e;var n,o;const a=(3*i-Math.pow(s,2))/9,h=(9*s*i-27*r-2*Math.pow(s,3))/54,l=Math.pow(a,3)+Math.pow(h,2),c=[];if(l>=0)n=u.utils.sgn(h+Math.sqrt(l))*Math.pow(Math.abs(h+Math.sqrt(l)),1/3),o=u.utils.sgn(h-Math.sqrt(l))*Math.pow(Math.abs(h-Math.sqrt(l)),1/3),c[0]=-s/3+(n+o),c[1]=-s/3-(n+o)/2,c[2]=-s/3-(n+o)/2,0!=Math.abs(Math.sqrt(3)*(n-o)/2)&&(c[1]=-1,c[2]=-1);else{const t=Math.acos(h/Math.sqrt(-Math.pow(a,3)));c[0]=2*Math.sqrt(-a)*Math.cos(t/3)-s/3,c[1]=2*Math.sqrt(-a)*Math.cos((t+2*Math.PI)/3)-s/3,c[2]=2*Math.sqrt(-a)*Math.cos((t+4*Math.PI)/3)-s/3}return c.filter(t=>t>=0&&t<=1).sort()},bezierCoeffs:(t,e,s,i)=>{const r=[NaN,NaN,NaN,NaN];return r[0]=3*e-t+-3*s+i,r[1]=3*t-6*e+3*s,r[2]=-3*t+3*e,r[3]=t,r},cubicPoly:(t,e,s,i)=>[3*i-9*s+9*e-3*t,6*t-12*e+6*s,3*e-3*t],sgn:t=>t<0?-1:1};class g{constructor(){this.className="BezierPath",this.START_POINT=0,this.START_CONTROL_POINT=1,this.END_CONTROL_POINT=2,this.END_POINT=3,this.uid=e.next(),this.totalArcLength=0,this.adjustCircular=!1,this.bezierCurves=[]}addCurve(t){if(null==t||void 0===t)throw"Cannot add null curve to bézier path.";this.bezierCurves.push(t),this.bezierCurves.length>1?(t.startPoint=this.bezierCurves[this.bezierCurves.length-2].endPoint,this.adjustSuccessorControlPoint(this.bezierCurves.length-2,!0,!0)):this.totalArcLength+=t.getLength()}locateCurveByStartPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].startPoint.equals(t))return e;return-1}locateCurveByEndPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].endPoint.equals(t))return e;return-1}locateCurveByStartControlPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].startControlPoint.equals(t))return e;return-1}locateCurveByEndControlPoint(t){for(var e=0;e<this.bezierCurves.length;e++)if(this.bezierCurves[e].endControlPoint.equals(t))return e;return-1}getLength(){return this.totalArcLength}updateArcLengths(){this.totalArcLength=0;for(var t=0;t<this.bezierCurves.length;t++)this.bezierCurves[t].updateArcLengths(),this.totalArcLength+=this.bezierCurves[t].getLength()}getCurveCount(){return this.bezierCurves.length}getCurveAt(t){return this.bezierCurves[t]}translate(t){for(var e=0;e<this.bezierCurves.length;e++){(s=this.bezierCurves[e]).getStartPoint().add(t),s.getStartControlPoint().add(t),s.getEndControlPoint().add(t)}var s;return(s=this.bezierCurves[this.bezierCurves.length-1]).getEndPoint().add(t),this.updateArcLengths(),this}move(t){return this.translate(t)}scale(t,e){return this.scaleXY({x:e,y:e},t)}scaleXY(t,e){for(var s=0;s<this.bezierCurves.length;s++){var i=this.bezierCurves[s];i.getStartPoint().scaleXY(t,e),i.getStartControlPoint().scaleXY(t,e),i.getEndControlPoint().scaleXY(t,e)}return this.bezierCurves.length>0&&!this.adjustCircular&&this.bezierCurves[this.bezierCurves.length-1].getEndPoint().scaleXY(t,e),this.updateArcLengths(),this}rotate(t,e){for(var s=0;s<this.bezierCurves.length;s++){var i=this.bezierCurves[s];i.getStartPoint().rotate(t,e),i.getStartControlPoint().rotate(t,e),i.getEndControlPoint().rotate(t,e)}this.bezierCurves.length>0&&!this.adjustCircular&&this.bezierCurves[this.bezierCurves.length-1].getEndPoint().rotate(t,e)}getClosestT(t){for(var e=-1,s=0,i=0,r=0,n=0,o=0,a=0;a<this.bezierCurves.length;a++)r=this.bezierCurves[a].getClosestT(t),i=this.bezierCurves[a].getPointAt(r).distance(t),(-1==e||i<s)&&(e=a,s=i,n=o+r*this.bezierCurves[a].getLength()),o+=this.bezierCurves[a].getLength();return Math.max(0,Math.min(1,n/this.totalArcLength))}getPoint(t){(t<0||t>this.totalArcLength)&&(console.warn("[BezierPath.getPoint(u)] u is out of bounds: "+t+"."),t=Math.min(this.totalArcLength,Math.max(t,0)));for(var e=0,s=0;e<this.bezierCurves.length&&s+this.bezierCurves[e].getLength()<t;)s+=this.bezierCurves[e].getLength(),e++;if(e>=this.bezierCurves.length)return this.bezierCurves[this.bezierCurves.length-1].getEndPoint().clone();var i=t-s;return this.bezierCurves[e].getPoint(i)}getPointAt(t){return this.getPoint(t*this.totalArcLength)}getTangentAt(t){return this.getTangent(t*this.totalArcLength)}getTangent(t){(t<0||t>this.totalArcLength)&&(console.warn("[BezierPath.getTangent(u)] u is out of bounds: "+t+"."),t=Math.min(this.totalArcLength,Math.max(0,t)));for(var e=0,s=0;e<this.bezierCurves.length&&s+this.bezierCurves[e].getLength()<t;)s+=this.bezierCurves[e].getLength(),e++;var i=t-s;return this.bezierCurves[e].getTangent(i)}getPerpendicularAt(t){return this.getPerpendicular(t*this.totalArcLength)}getPerpendicular(t){(t<0||t>this.totalArcLength)&&(console.log("[BezierPath.getPerpendicular(u)] u is out of bounds: "+t+"."),t=Math.min(this.totalArcLength,Math.max(0,t)));var e=g._locateUIndex(this,t),s=this.bezierCurves[e.i],i=t-e.uPart;return s.getPerpendicular(i)}lineIntersections(t,e=!1){return this.bezierCurves.reduce((s,i)=>s.concat(i.lineIntersections(t,e)),[])}lineIntersectionTangents(t,e=!1){return this.bezierCurves.reduce((s,i)=>s.concat(i.lineIntersectionTangents(t,e)),[])}static _locateUIndex(t,e){for(var s=0,i=0,r=0;s<t.bezierCurves.length&&i+t.bezierCurves[s].getLength()<e;)i+=t.bezierCurves[s].getLength(),s+1<t.bezierCurves.length&&(r+=t.bezierCurves[s].getLength()),s++;return{i:s,uPart:i,uBefore:r}}getSubPathAt(t,e){t=Math.max(0,t),e=Math.min(1,e);let s=t*this.totalArcLength,i=e*this.totalArcLength;var r=g._locateUIndex(this,s),n=g._locateUIndex(this,i),o=(s-r.uBefore)/this.bezierCurves[r.i].getLength();if(r.i==n.i){var a=(i-n.uBefore)/this.bezierCurves[n.i].getLength(),h=this.bezierCurves[r.i].getSubCurveAt(o,a);return g.fromArray([h])}var l=[];if(r.i>n.i){h=this.bezierCurves[r.i].getSubCurveAt(o,0);l.push(h);for(var c=r.i-1;c>n.i;c--)l.push(this.bezierCurves[c].clone().reverse());a=(i-n.uBefore)/this.bezierCurves[n.i].getLength();l.push(this.bezierCurves[n.i].getSubCurveAt(1,a))}else{h=this.bezierCurves[r.i].getSubCurveAt(o,1);l.push(h);for(c=r.i+1;c<n.i&&c<this.bezierCurves.length;c++)l.push(this.bezierCurves[c].clone());a=(i-n.uBefore)/this.bezierCurves[n.i].getLength();l.push(this.bezierCurves[n.i].getSubCurveAt(0,a))}return g.fromArray(l)}moveCurvePoint(t,e,s){if(this.getCurveAt(t).moveCurvePoint(e,s,!0,!0),e==this.START_POINT&&(t>0||this.adjustCircular))this.getCurveAt(t-1<0?this.bezierCurves.length+(t-1):t-1).moveCurvePoint(this.END_CONTROL_POINT,s,!0,!1);else if(e==this.END_POINT&&(t+1<this.bezierCurves.length||this.adjustCircular)){this.getCurveAt((t+1)%this.bezierCurves.length).moveCurvePoint(this.START_CONTROL_POINT,s,!0,!1)}else e==this.START_CONTROL_POINT&&t>0?this.adjustPredecessorControlPoint(t,!0,!1):e==this.END_CONTROL_POINT&&t+1<this.getCurveCount()&&this.adjustSuccessorControlPoint(t,!0,!1);this.updateArcLengths()}adjustPredecessorControlPoint(t,e,s){if(this.adjustCircular||!(t<=0)){var i=this.getCurveAt(t),r=this.getCurveAt(t-1<0?this.getCurveCount()+(t-1):t-1);g.adjustNeighbourControlPoint(i,r,i.getStartPoint(),i.getStartControlPoint(),r.getEndPoint(),r.getEndControlPoint(),e,s)}}adjustSuccessorControlPoint(t,e,s){if(this.adjustCircular||!(t+1>this.getCurveCount())){var i=this.getCurveAt(t),r=this.getCurveAt((t+1)%this.getCurveCount());g.adjustNeighbourControlPoint(i,r,i.getEndPoint(),i.getEndControlPoint(),r.getStartPoint(),r.getStartControlPoint(),e,s)}}static adjustNeighbourControlPoint(t,e,s,i,r,n,a,h){var l=new o(i.x-s.x,i.y-s.y),c=new o(n.x-r.x,n.y-r.y),d=Math.sqrt(Math.pow(l.x,2)+Math.pow(l.y,2)),u=Math.sqrt(Math.pow(c.x,2)+Math.pow(c.y,2));d<=.1||(a?n.set(r.x-l.x*(u/d),r.y-l.y*(u/d)):n.set(r.x-l.x,r.y-l.y),e.updateArcLengths())}getBounds(){const t=new o(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY),e=new o(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY);for(var s,i=0;i<this.bezierCurves.length;i++)s=this.bezierCurves[i].getBounds(),t.x=Math.min(t.x,s.min.x),t.y=Math.min(t.y,s.min.y),e.x=Math.max(e.x,s.max.x),e.y=Math.max(e.y,s.max.y);return new d(t,e)}getEvenDistributionVertices(t){if(t<2)throw new Error("pointCount must be larger than one; is "+t+".");const e=[];if(0===this.bezierCurves.length)return e;var s=new o(this.bezierCurves[0].startPoint);e.push(s);const i=this.totalArcLength/(t-1),r=this.bezierCurves.length;let n=0,a=this.bezierCurves[0].arcLength,h=i,l=1;for(;l<t&&n<r;)if(h<a){var c=this.bezierCurves[n].getPoint(h);e.push(c),h+=i,l++}else n++,h-=a,a=n<r?this.bezierCurves[n].arcLength:0;return e.push(new o(this.bezierCurves[r-1].endPoint)),e}clone(){for(var t=new g,e=0;e<this.bezierCurves.length;e++)t.bezierCurves.push(this.bezierCurves[e].clone()),e>0&&(t.bezierCurves[e-1].endPoint=t.bezierCurves[e].startPoint);return t.updateArcLengths(),t.adjustCircular=this.adjustCircular,t}equals(t){if(!t)return!1;if(!t.bezierCurves)return!1;if(void 0===t.bezierCurves.length)return!1;if(t.bezierCurves.length!=this.bezierCurves.length)return!1;for(var e=0;e<this.bezierCurves.length;e++)if(!this.bezierCurves[e].equals(t.bezierCurves[e]))return!1;return!0}destroy(){for(var t=0;t<this.bezierCurves.length;t++)this.bezierCurves[t].destroy();this.isDestroyed=!0}toPathPoints(){if(0===this.bezierCurves.length)return[];if(1===this.bezierCurves.length)return[this.bezierCurves[0].startPoint,this.bezierCurves[0].startControlPoint,this.bezierCurves[0].endControlPoint,this.bezierCurves[0].endPoint];const t=[];t.push(this.bezierCurves[0].startPoint),t.push(this.bezierCurves[0].startControlPoint);for(var e=1;e<this.bezierCurves.length;e++)t.push(this.bezierCurves[e-1].endControlPoint),t.push(this.bezierCurves[e-1].endPoint),t.push(this.bezierCurves[e].startPoint),t.push(this.bezierCurves[e].startControlPoint);return t.push(this.bezierCurves[0].endControlPoint),t.push(this.bezierCurves[0].endPoint),t}toJSON(t){var e=[];e.push("[");for(var s=0;s<this.bezierCurves.length;s++)s>0&&e.push(","),t?e.push("\n\t"):e.push(" "),e.push(this.bezierCurves[s].toJSON(t));return 0!=this.bezierCurves.length&&e.push(" "),e.push("]"),e.join("")}static fromJSON(t){var e=JSON.parse(t);return g.fromArray(e)}static fromCurve(t){const e=new g;return e.addCurve(t),e}static fromArray(t){if(!Array.isArray(t))throw"[BezierPath.fromArray] Passed object must be an array.";const e=t;if(e.length<1)throw"[BezierPath.fromArray] Passed array must contain at least one bezier curve (has "+e.length+").";for(var s=new g,i=null,r=0;r<e.length;r++){var n;if(u.isInstance(e[r]))n=e[r].clone();else if(0 in e[r]&&1 in e[r]&&2 in e[r]&&3 in e[r]){if(!(e[r][0]&&e[r][1]&&e[r][2]&&e[r][3]))throw"Cannot convert path data to BezierPath instance. At least one element is undefined (index="+r+"): "+e[r];n=u.fromArray(e[r])}else n=u.fromObject(e[r]);i&&(n.startPoint=i.endPoint),s.bezierCurves.push(n),i=n}return s.updateArcLengths(),s}toReducedListRepresentation(t){void 0===t&&(t=1);var e=[];e.push("[");for(var s=0;s<this.bezierCurves.length;s++){var i=this.bezierCurves[s];e.push(i.getStartPoint().x.toFixed(t)),e.push(","),e.push(i.getStartPoint().y.toFixed(t)),e.push(","),e.push(i.getStartControlPoint().x.toFixed(t)),e.push(","),e.push(i.getStartControlPoint().y.toFixed(t)),e.push(","),e.push(i.getEndControlPoint().x.toFixed(t)),e.push(","),e.push(i.getEndControlPoint().y.toFixed(t)),e.push(",")}if(0!=this.bezierCurves.length){i=this.bezierCurves[this.bezierCurves.length-1];e.push(i.getEndPoint().x.toFixed(t)),e.push(","),e.push(i.getEndPoint().y.toFixed(t))}return e.push("]"),e.join("")}static fromReducedListRepresentation(t,e){var s=JSON.parse(t);if(!s.length)throw console.log("Cannot parse bezier path from non-array object nor from empty point list."),"Cannot parse bezier path from non-array object nor from empty point list.";if(s.length<8)throw console.log("Cannot build bezier path. The passed array must contain at least 8 elements (numbers)."),"Cannot build bezier path. The passed array must contain at least 8 elements (numbers).";return g.fromReducedList(s,e)}static fromReducedList(t,e){var s,i,r,n=new g,a=new o,h=0;do{0==h&&(a=new o(t[h],t[h+1])),s=new o(t[h+2],t[h+3]),i=new o(t[h+4],t[h+5]),r=new o(t[h+6],t[h+7]);var l=new u(a,r,s,i);n.bezierCurves.push(l),a=r,h+=6}while(h+2<t.length);return n.adjustCircular=null!=e&&e,e&&(n.bezierCurves[n.bezierCurves.length-1].endPoint=n.bezierCurves[0].startPoint),n.updateArcLengths(),n}}g.START_POINT=0,g.START_CONTROL_POINT=1,g.END_CONTROL_POINT=2,g.END_POINT=3;class f{constructor(t,s,i){this.className="CircleSector",this.uid=e.next(),this.circle=t,this.startAngle=s,this.endAngle=i}getBounds(){const t=this,e=this.circle.getBounds(),s=[e.getNorthPoint(),e.getSouthPoint(),e.getWestPoint(),e.getEastPoint()].filter(e=>{const s=new l(t.circle.center,e).angle();return t.containsAngle(s)});return d.computeFromVertices(s.concat([this.getStartPoint(),this.getEndPoint()]))}move(t){return this.circle.move(t),this}containsAngle(t){var e=n.mapAngleTo2PI(t),s=n.mapAngleTo2PI(this.startAngle),i=n.mapAngleTo2PI(this.endAngle);return s<=i?e>=s&&e<i:e>=s||e<i}angleAt(t){if(this.startAngle<=this.endAngle){return(this.startAngle+(this.endAngle-this.startAngle)*t)%(2*Math.PI)}return(this.startAngle+(2*Math.PI-this.startAngle+this.endAngle)*t)%(2*Math.PI)}getStartPoint(){return this.circle.vertAt(this.startAngle)}getEndPoint(){return this.circle.vertAt(this.endAngle)}circleSectorIntersection(t){const e=this.circle.circleIntersection(t.circle);if(!e)return null;const s=this.circle.center.angle(e.a),r=this.circle.center.angle(e.b);if(!this.containsAngle(s)||!this.containsAngle(r))return null;const n=t.circle.center.angle(e.a),o=t.circle.center.angle(e.b);if(!t.containsAngle(n)||!t.containsAngle(o))return null;var a=new f(this.circle,this.endAngle,this.startAngle).angleAt(.5);const h=new f(new i(this.circle.center.clone(),this.circle.radius),s,r);return h.containsAngle(a)&&(h.startAngle=r,h.endAngle=s),h}lineIntersections(t,e=!1){const s=this.circle.lineIntersections(t,e),i=new l(this.circle.center,new o);return s.filter(t=>{i.b.set(t);const e=i.angle();return this.containsAngle(n.wrapMinMax(e,0,2*Math.PI))})}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map(t=>{const e=new l(this.circle.center,t).angle();return this.circle.tangentAt(e)})}describeSVGPath(t){return f.circleSectorUtils.describeSVGArc(this.circle.center.x,this.circle.center.y,this.circle.radius,this.startAngle,this.endAngle,t)}destroy(){this.circle.destroy(),this.isDestroyed=!0}}f.circleSectorUtils={polarToCartesian:(t,e,s,i)=>({x:t+s*Math.cos(i),y:e+s*Math.sin(i)}),describeSVGArc:(t,e,s,i,r,n)=>{void 0===n&&(n={moveToStart:!0});const o=f.circleSectorUtils.polarToCartesian(t,e,s,r),a=f.circleSectorUtils.polarToCartesian(t,e,s,i);if(2*Math.PI-Math.abs(i-r)<.001){const o=f.circleSectorUtils.describeSVGArc(t,e,s,i,i+(r-i)/2,n),a=f.circleSectorUtils.describeSVGArc(t,e,s,i+(r-i)/2,r,n);return o.concat(a)}const h=r-i;var l,c;h<0?(l=Math.abs(h)<Math.PI?1:0,c=1):(l=Math.abs(h)>Math.PI?1:0,c=1);const d=[];return n.moveToStart&&d.push("M",a.x,a.y),d.push("A",s,s,0,l,c,o.x,o.y),d}};const x=180/Math.PI;class p{constructor(t,e,s,i,r,n,a,h,l,c,d,u){if(this.svgNode=t,this.offset=new o(0,0).set(e),this.scale=new o(1,1).set(s),this.fillShapes=r,this.isSecondary=Boolean(a),this.drawConfig=n,this.drawlibConfiguration={},this.cache=new Map,this.setSize(i),a){if(!(h&&l&&c&&d))throw"Cannot create secondary svg draw lib with undefinde gNode|bufferGNode|nodeDefs|bufferNodeDefs.";this.gNode=h,this.bufferGNode=l,this.nodeDefs=c,this.bufferedNodeDefs=d,u&&(this.nodeStyle=u)}else this.addStyleDefs(n),this.addDefsNode(),this.gNode=this.createSVGNode("g"),this.bufferGNode=this.createSVGNode("g"),this.svgNode.appendChild(this.gNode)}addStyleDefs(t){this.nodeStyle=this.createSVGNode("style"),this.svgNode.appendChild(this.nodeStyle),this.rebuildStyleDefs(t)}rebuildStyleDefs(t){const e={bezier:"CubicBezierCurve",polygon:"Polygon",triangle:"Triangle",ellipse:"Ellipse",ellipseSector:"EllipseSector",circle:"Circle",circleSector:"CircleSector",vertex:"Vertex",line:"Line",vector:"Vector",image:"Image",text:"Text"},s=[];for(var i in e){const r=e[i],n=t[i];n?s.push(`.${r} { fill : none; stroke: ${n.color}; stroke-width: ${n.lineWidth}px }`):console.warn(`Warning: your draw config is missing the key '${i}' which is required.`)}this.customStyleDefs&&(s.push("\n/* Custom styles */\n"),this.customStyleDefs.forEach((t,e)=>{s.push(e+" { "+t+" }")})),this.nodeStyle.innerHTML=s.join("\n")}addDefsNode(){this.nodeDefs=this.createSVGNode("defs"),this.bufferedNodeDefs=this.createSVGNode("defs"),this.svgNode.appendChild(this.nodeDefs)}addCustomStyleDefs(t){this.customStyleDefs=t}findElement(t,e){if(!t)return null;var s=this.cache.get(t);return s&&s.nodeName.toUpperCase()===e.toUpperCase()?(this.cache.delete(t),s):null}createSVGNode(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}makeNode(t){var e=this.findElement(this.curId,t);if(e||(e=this.createSVGNode(t)),this.drawlibConfiguration.blendMode){const t=e.style["mix-blend-mode"];"function"==typeof t?t(this.drawlibConfiguration.blendMode):e.style["mix-blend-mode"]=this.drawlibConfiguration.blendMode}return e}_bindFillDraw(t,e,s,i,r){return this._configureNode(t,e,this.fillShapes,s,i,r),this._bindNode(t,void 0)}_bindNode(t,e){return t.parentNode||(null!=e?e:this.bufferGNode).appendChild(t),t}_addCSSClasses(t,e){this.curClassName?t.setAttribute("class",`${e} ${this.curClassName}`):t.setAttribute("class",e)}_configureNode(t,e,s,i,r,n){return this._addCSSClasses(t,e),t.setAttribute("fill",s&&i?i:"none"),t.setAttribute("stroke",s?"none":i||"none"),t.setAttribute("stroke-width",`${r||1}`),this.curId&&t.setAttribute("id",`${this.curId}`),this.applyStrokeOpts(t,n),t}setSize(t){this.canvasSize=t,this.svgNode.setAttribute("viewBox",`0 0 ${this.canvasSize.width} ${this.canvasSize.height}`),this.svgNode.setAttribute("width",`${this.canvasSize.width}`),this.svgNode.setAttribute("height",`${this.canvasSize.height}`)}copyInstance(t){return new p(this.svgNode,this.offset,this.scale,this.canvasSize,t,this.drawConfig,!0,this.gNode,this.bufferGNode,this.nodeDefs,this.bufferedNodeDefs,this.nodeStyle)}setConfiguration(t){this.drawlibConfiguration=t}setCurrentId(t){this.curId=t}setCurrentClassName(t){this.curClassName=t}beginDrawCycle(t){this.cache.clear();for(var e=0;e<this.bufferGNode.childNodes.length;e++){var s=this.bufferGNode.childNodes[e];this.cache.set(s.getAttribute("id"),s)}this.removeAllChildNodes()}endDrawCycle(t){this.rebuildStyleDefs(this.drawConfig),this.isSecondary||(this.svgNode.replaceChild(this.bufferedNodeDefs,this.nodeDefs),this.svgNode.replaceChild(this.bufferGNode,this.gNode));const e=this.gNode;this.gNode=this.bufferGNode,this.bufferGNode=e;const s=this.nodeDefs;this.nodeDefs=this.bufferedNodeDefs,this.bufferedNodeDefs=s}applyStrokeOpts(t,e){e&&e.dashArray&&e.dashArray.length>0&&p.nodeSupportsLineDash(t.tagName)&&(t.setAttribute("stroke-dasharray",e.dashArray.map(t=>t*this.scale.x).join(" ")),e.dashOffset&&t.setAttribute("stroke-dashoffset",""+e.dashOffset*this.scale.x)),e&&e.lineJoin&&p.nodeSupportsLineJoin(t.tagName)&&t.setAttribute("stroke-linejoin",e.lineJoin),e&&e.lineCap&&p.nodeSupportsLineCap(t.tagName)&&t.setAttribute("stroke-linecap",e.lineCap)}_x(t){return this.offset.x+this.scale.x*t}_y(t){return this.offset.y+this.scale.y*t}line(t,e,s,i,r){const n=this.makeLineNode(t,e,s,i,r);return this._bindFillDraw(n,"line",s,i||1,r)}arrow(t,e,s,i,r=8,n){const o=this.makeNode("g"),a={x:0,y:0},h=this.makeArrowHeadNode(t,e,s,i,r,void 0,a),l=this.makeLineNode(t,a,s,i,n);return o.appendChild(l),o.appendChild(h),this._addCSSClasses(o,"linear-arrow"),this._bindNode(o,void 0),o}cubicBezierArrow(t,e,s,i,r,n,a=8,h){const l=this.makeNode("g"),c=new o(0,0),d=this.makeArrowHeadNode(i,e,r,n,a,void 0,c),u=c.difference(e),g=this.makeCubicBezierNode(t,{x:e.x-u.x,y:e.y-u.y},s,{x:i.x-u.x,y:i.y-u.y},r,n,h);return l.appendChild(g),l.appendChild(d),this._addCSSClasses(l,"cubicbezier-arrow"),this._bindNode(l,void 0),l}arrowHead(t,e,s,i,r=8,n){const o=this.makeArrowHeadNode(t,e,s,i,r,n);return this._bindFillDraw(o,"arrowhead",s,i||1,n)}image(t,e,s,i=1){const r=this.makeNode("image"),n=t=>{if(t.naturalWidth){const n=s.x/t.naturalWidth,o=s.y/t.naturalHeight;r.setAttribute("width",""+t.naturalWidth*this.scale.x),r.setAttribute("height",""+t.naturalHeight*this.scale.y),r.setAttribute("display",null),r.setAttribute("opacity",`${i}`),r.setAttribute("transform",`translate(${this._x(e.x)} ${this._y(e.y)}) scale(${n} ${o})`)}};return t.addEventListener("load",e=>{n(t)}),r.setAttribute("x","0"),r.setAttribute("y","0"),r.setAttribute("display","none"),n(t),r.setAttribute("href",t.src),this._bindFillDraw(r,"image",null,null)}texturedPoly(t,s,i,r,n){const a=new o(s.min).clone().rotate(n,r),h=this.makeNode("clipPath"),l=`clippath_${e.next()}`;h.setAttribute("id",l);const c=this.makeNode("g"),d=this.makeNode("image");d.setAttribute("x",`${this._x(a.x)}`),d.setAttribute("y",`${this._y(a.y)}`),d.setAttribute("width",`${s.width}`),d.setAttribute("height",`${s.height}`),d.setAttribute("href",t.src),d.setAttribute("transform",`rotate(${n*x}, ${this._x(a.x)}, ${this._y(a.y)})`);const u=this.makeNode("path"),g=[];if(i.vertices.length>0){g.push("M",`${this._x(i.vertices[0].x)}`,`${this._y(i.vertices[0].y)}`);for(var f=1;f<i.vertices.length;f++)g.push("L",`${this._x(i.vertices[f].x)}`,`${this._y(i.vertices[f].y)}`)}u.setAttribute("d",g.join(" ")),h.appendChild(u),this.bufferedNodeDefs.appendChild(h),c.appendChild(d),c.setAttribute("transform-origin",`${this._x(a.x)} ${this._y(a.y)}`),c.setAttribute("transform",`scale(${this.scale.x}, ${this.scale.y})`);const p=this.makeNode("g");return p.appendChild(c),p.setAttribute("clip-path",`url(#${l})`),this._bindFillDraw(p,"image",null,null),p}cubicBezier(t,e,s,i,r,n,o){const a=this.makeCubicBezierNode(t,e,s,i,r,n,o);return this._bindNode(a,void 0)}cubicBezierPath(t,e,s,i,r){const n=this.makeNode("path");if(this.applyStrokeOpts(n,i),!t||0==t.length)return n;const o=["M",this._x(t[0].x),this._y(t[0].y)];for(var a,h,l,c=1;c<t.length;c+=3)h=t[c],l=t[c+1],a=t[c+2],o.push("C",this._x(h.x),this._y(h.y),this._x(l.x),this._y(l.y),this._x(a.x),this._y(a.y));return r||o.push("Z"),n.setAttribute("d",o.join(" ")),this._bindFillDraw(n,"cubicBezierPath",e,s||1)}handle(t,e){this.point(t,"rgb(0,32,192)"),this.square(e,5,"rgba(0,128,192,0.5)")}handleLine(t,e){this.line(t,e,"rgb(128,128,128,0.5)")}dot(t,e){const s=this.makeNode("line");return s.setAttribute("x1",`${this._x(t.x)}`),s.setAttribute("y1",`${this._y(t.y)}`),s.setAttribute("x2",`${this._x(t.x)}`),s.setAttribute("y2",`${this._y(t.y)}`),this._bindFillDraw(s,"dot",e,1)}point(t,e){const s=this.makeNode("circle");return s.setAttribute("cx",`${this._x(t.x)}`),s.setAttribute("cy",`${this._y(t.y)}`),s.setAttribute("r","3"),this._bindFillDraw(s,"point",e,1)}circle(t,e,s,i,r){const n=this.makeNode("circle");return this.applyStrokeOpts(n,r),n.setAttribute("cx",`${this._x(t.x)}`),n.setAttribute("cy",`${this._y(t.y)}`),n.setAttribute("r",""+e*this.scale.x),this._bindFillDraw(n,"circle",s,i||1)}circleArc(t,e,s,i,r,n,o){const a=this.makeNode("path");this.applyStrokeOpts(a,o);const h=f.circleSectorUtils.describeSVGArc(this._x(t.x),this._y(t.y),e*this.scale.x,s,i);return a.setAttribute("d",h.join(" ")),this._bindFillDraw(a,"circleArc",r,n||1)}ellipse(t,e,s,i,r,n,o){void 0===n&&(n=0);const a=this.makeNode("ellipse");return this.applyStrokeOpts(a,o),a.setAttribute("cx",`${this._x(t.x)}`),a.setAttribute("cy",`${this._y(t.y)}`),a.setAttribute("rx",""+e*this.scale.x),a.setAttribute("ry",""+s*this.scale.y),a.setAttribute("transform",`rotate(${180*n/Math.PI} ${this._x(t.x)} ${this._y(t.y)})`),this._bindFillDraw(a,"ellipse",i,r||1)}square(t,e,s,i,r){const n=this.makeNode("rectangle");return this.applyStrokeOpts(n,r),n.setAttribute("x",`${this._x(t.x-e/2)}`),n.setAttribute("y",`${this._y(t.y-e/2)}`),n.setAttribute("width",""+e*this.scale.x),n.setAttribute("height",""+e*this.scale.y),this._bindFillDraw(n,"square",s,i||1)}rect(t,e,s,i,r,n){const o=this.makeNode("rect");return this.applyStrokeOpts(o,n),o.setAttribute("x",`${this._x(t.x)}`),o.setAttribute("y",`${this._y(t.y)}`),o.setAttribute("width",""+e*this.scale.x),o.setAttribute("height",""+s*this.scale.y),this._bindFillDraw(o,"rect",i,r||1)}bounds(t,e,s,i){this.rect(t.min,t.max.x-t.min.x,t.max.y-t.min.y,e,s,i)}grid(t,e,s,i,r,n){const o=this.makeNode("path"),a=[];for(var h=-Math.ceil(.5*s/r)*r,l=s/2,c=-Math.ceil(.5*e/i)*i;c<e/2;c+=i)a.push("M",this._x(t.x+c),this._y(t.y+h)),a.push("L",this._x(t.x+c),this._y(t.y+l));for(var d=-Math.ceil(.5*e/i)*i,u=e/2,g=-Math.ceil(.5*s/r)*r;g<s/2;g+=r)a.push("M",this._x(t.x+d),this._y(t.y+g)),a.push("L",this._x(t.x+u),this._y(t.y+g));return o.setAttribute("d",a.join(" ")),this._bindFillDraw(o,"grid",n,1)}raster(t,e,s,i,r,n){const o=this.makeNode("path"),a=[];for(var h=-Math.ceil(.5*e/i)*i;h<e/2;h+=i)for(var l=-Math.ceil(.5*s/r)*r;l<s/2;l+=r)a.push("M",this._x(t.x+h)-4,this._y(t.y+l)),a.push("L",this._x(t.x+h)+4,this._y(t.y+l)),a.push("M",this._x(t.x+h),this._y(t.y+l)-4),a.push("L",this._x(t.x+h),this._y(t.y+l)+4);return o.setAttribute("d",a.join(" ")),this._bindFillDraw(o,"raster",n,1)}diamondHandle(t,e,s){const i=this.makeNode("path"),r=["M",this._x(t.x)-e/2,this._y(t.y),"L",this._x(t.x),this._y(t.y)-e/2,"L",this._x(t.x)+e/2,this._y(t.y),"L",this._x(t.x),this._y(t.y)+e/2,"Z"];return i.setAttribute("d",r.join(" ")),this._bindFillDraw(i,"diamondHandle",s,1)}squareHandle(t,e,s){const i=this.makeNode("rect");return i.setAttribute("x",""+(this._x(t.x)-e/2)),i.setAttribute("y",""+(this._y(t.y)-e/2)),i.setAttribute("width",`${e}`),i.setAttribute("height",`${e}`),this._bindFillDraw(i,"squareHandle",s,1)}circleHandle(t,e,s){e=e||3;const i=this.makeNode("circle");return i.setAttribute("cx",`${this._x(t.x)}`),i.setAttribute("cy",`${this._y(t.y)}`),i.setAttribute("r",`${e}`),this._bindFillDraw(i,"circleHandle",s,1)}crosshair(t,e,s,i){const r=this.makeNode("path"),n=["M",this._x(t.x)-e,this._y(t.y),"L",this._x(t.x)+e,this._y(t.y),"M",this._x(t.x),this._y(t.y)-e,"L",this._x(t.x),this._y(t.y)+e];return r.setAttribute("d",n.join(" ")),this._bindFillDraw(r,"crosshair",s,i||.5)}cross(t,e,s,i){const r=this.makeNode("path"),n=["M",this._x(t.x)-e,this._y(t.y)-e,"L",this._x(t.x)+e,this._y(t.y)+e,"M",this._x(t.x)-e,this._y(t.y)+e,"L",this._x(t.x)+e,this._y(t.y)-e];return r.setAttribute("d",n.join(" ")),this._bindFillDraw(r,"cross",s,i||1)}polygon(t,e,s,i){return this.polyline(t.vertices,t.isOpen,e,s,i)}polyline(t,e,s,i,r){const n=this.makeNode("path");if(this.applyStrokeOpts(n,r),0==t.length)return n;const o=["M",this._x(t[0].x),this._y(t[0].y)];for(var a=t.length,h=1;h<a;h++)o.push("L",this._x(t[h].x),this._y(t[h].y));return e||o.push("Z"),n.setAttribute("d",o.join(" ")),this._bindFillDraw(n,"polygon",s,i||1)}text(t,e,s,i){var r,n,o;const a=(i=i||{}).color||"black",h=(null!==(n=null!==(r=i.lineHeight)&&void 0!==r?r:i.fontSize)&&void 0!==n?n:0)*this.scale.x,l="left"===i.textAlign||"start"===i.textAlign?"start":"center"===i.textAlign?"middle":"right"===i.textAlign||"end"===i.textAlign?"end":"start",c=`${this._x(e)}px ${this._y(s)}px`,d=`translate(${this._x(e)} ${this._y(s)+h/2})`,u=i.rotation?`rotate(${i.rotation*x} 0 0)`:"",g=this.makeNode("g"),f=this.curId;this.curId=f+"_text";const p=this.makeNode("text");return g.appendChild(p),p.setAttribute("font-family",null!==(o=i.fontFamily)&&void 0!==o?o:""),p.setAttribute("font-size",i.fontSize?""+i.fontSize*this.scale.x:""),p.setAttribute("font-style",i.fontStyle?`${i.fontStyle}`:""),p.setAttribute("font-weight",i.fontWeight?`${i.fontWeight}`:""),p.setAttribute("text-anchor",l),p.setAttribute("transform-origin","0 0"),p.setAttribute("transform",u),g.setAttribute("transform-origin",c),g.setAttribute("transform",d),p.innerHTML=t,this.curId=f,this._bindFillDraw(g,"text",a,1)}label(t,e,s,i,r){const n=this.makeNode("text");return n.setAttribute("transform",`translate(${e},${s}), rotate(${(i||0)/Math.PI*180})`),n.setAttribute("font-family","Arial"),n.setAttribute("font-size","9pt"),n.setAttribute("font-style","normal"),n.setAttribute("font-weight","lighter"),n.innerHTML=t,this._bindFillDraw(n,"label",r||"black",null)}path(t,e,s,i){const r=this.makeNode("path");this.applyStrokeOpts(r,i);const n=i&&i.inplace?t:p.copyPathData(t);return p.transformPathData(n,this.offset,this.scale),r.setAttribute("d",n.join(" ")),this._bindFillDraw(r,"path",e,s)}clear(t){if(this.isSecondary)return;this.curId="background",this.curClassName=null;const e=this.makeNode("rect");e.setAttribute("x","0"),e.setAttribute("y","0"),e.setAttribute("width",`${this.canvasSize.width}`),e.setAttribute("height",`${this.canvasSize.height}`),this._bindFillDraw(e,this.curId,null,null),e.setAttribute("fill",void 0===t?"none":t),this.curId=null}removeAllChildNodes(){for(;this.bufferGNode.lastChild;)this.bufferGNode.removeChild(this.bufferGNode.lastChild);for(;this.bufferedNodeDefs.lastChild;)this.bufferedNodeDefs.removeChild(this.bufferedNodeDefs.lastChild)}static createSvg(){return document.createElementNS("http://www.w3.org/2000/svg","svg")}static copyPathData(t){return t.slice()}static transformPathData(t,e,s){const i=i=>{t[i]=e.x+s.x*Number(t[i])},r=i=>{t[i]=e.y+s.y*Number(t[i])},n=e=>{t[e]=s.x*Number(t[e])},o=e=>{t[e]=s.y*Number(t[e])};for(var a=0,h=e=>{Number(t[e]),Number(t[e+1])};a<t.length;){switch(t[a]){case"M":case"L":case"T":i(a+1),r(a+2),h(a+1),a+=3;break;case"m":case"l":case"t":n(a+1),o(a+2),h(a+1),a+=3;break;case"H":i(a+1),Number(t[a+1]),a+=2;break;case"h":n(a+1),Number(t[a+1]),a+=2;break;case"V":r(a+1),Number(t[a+1]),a+=2;break;case"v":o(a+1),Number(t[a+1]),a+=2;break;case"C":i(a+1),r(a+2),i(a+3),r(a+4),i(a+5),r(a+6),h(a+5),a+=7;break;case"c":n(a+1),o(a+2),n(a+3),o(a+4),n(a+5),o(a+6),h(a+5),a+=7;break;case"S":case"Q":i(a+1),r(a+2),i(a+3),r(a+4),h(a+3),a+=5;break;case"s":case"q":n(a+1),o(a+2),n(a+3),o(a+4),h(a+3),a+=5;break;case"A":n(a+1),o(a+2),i(a+6),r(a+7),h(a+6),(s.x<0&&s.y>=0||s.x>=0&&s.y<0)&&(t[a+5]=t[a+5]?0:1),a+=8;break;case"a":n(a+1),o(a+2),n(a+6),o(a+7),h(a+6),a+=8;break;default:a++}}}static nodeSupportsLineDash(t){return["line","path","circle","ellipse","rectangle","rect"].includes(t)}static nodeSupportsLineJoin(t){return["line","path","circle","ellipse","rectangle","rect"].includes(t)}static nodeSupportsLineCap(t){return["line","path","circle","ellipse","rectangle","rect"].includes(t)}makeLineNode(t,e,s,i,r,n){const o=this.makeNode("line");return o.setAttribute("x1",`${this._x(t.x)}`),o.setAttribute("y1",`${this._y(t.y)}`),o.setAttribute("x2",`${this._x(e.x)}`),o.setAttribute("y2",`${this._y(e.y)}`),this._configureNode(o,null!=n?n:"line",this.fillShapes,s,i||1,r),o}makePathNode(t,e,s,i,r){const n=this.makeNode("path");return n.setAttribute("d",t),this._configureNode(n,null!=r?r:"path",this.fillShapes,e,s||1,i),n}makeArrowHeadNode(t,e,s,i,r=8,n,o){var a=h.utils.buildArrowHead(t,e,r,this.scale.x,this.scale.y);const l=["M",this.offset.x+a[0].x,this.offset.y+a[0].y];o&&(o.x=a[0].x/this.scale.x,o.y=a[0].y/this.scale.y);for(var c=1;c<=a.length;c++)l.push("L"),l.push(this.offset.x+a[c%a.length].x),l.push(this.offset.y+a[c%a.length].y);return this.makePathNode(l.join(" "),s,i,n,"arrowhead")}makeCubicBezierNode(t,e,s,i,r,n,o){if(t instanceof u)return this.cubicBezier(t.startPoint,t.endPoint,t.startControlPoint,t.endControlPoint,r,n);const a=["M",this._x(t.x),this._y(t.y),"C",this._x(s.x),this._y(s.y),this._x(i.x),this._y(i.y),this._x(e.x),this._y(e.y)];return this.makePathNode(a.join(" "),r,n,o,"cubicBezier")}}p.HEAD_XML=['<?xml version="1.0" encoding="UTF-8" standalone="no"?>','<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" ',' "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">',""].join("\n");class v{constructor(t,e){this.ctx=t,this.offset=new o(0,0),this.scale=new o(1,1),this.fillShapes=e}applyStrokeOpts(t){var e,s,i,r;this.ctx.setLineDash((null!==(e=null==t?void 0:t.dashArray)&&void 0!==e?e:[]).map(t=>t*this.scale.x)),this.ctx.lineDashOffset=(null!==(s=null==t?void 0:t.dashOffset)&&void 0!==s?s:0)*this.scale.x,this.ctx.lineJoin=null!==(i=null==t?void 0:t.lineJoin)&&void 0!==i?i:null,this.ctx.lineCap=null!==(r=null==t?void 0:t.lineCap)&&void 0!==r?r:null}_fillOrDraw(t){this.fillShapes?(this.ctx.fillStyle=t,this.ctx.fill()):(this.ctx.strokeStyle=t,this.ctx.stroke())}beginDrawCycle(t){}endDrawCycle(t){}setConfiguration(t){this.ctx.globalCompositeOperation=t.blendMode||"source-over"}setCurrentId(t){}setCurrentClassName(t){}line(t,e,s,i,r){this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(r),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+e.x*this.scale.x,this.offset.y+e.y*this.scale.y),this.ctx.strokeStyle=s,this.ctx.lineWidth=i||1,this.ctx.stroke(),this.ctx.restore()}arrow(t,e,s,i,r=8,n){const a=new o(0,0);this.arrowHead(t,e,s,i,r,void 0,a),this.line(t,a,s,i,n)}cubicBezierArrow(t,e,s,i,r,n,a,h){const l=new o(0,0);this.arrowHead(i,e,r,n,a,void 0,l);const c=l.difference(e);this.cubicBezier(t,{x:e.x-c.x,y:e.y-c.y},s,{x:i.x-c.x,y:i.y-c.y},r,n,h)}arrowHead(t,e,s,i,r=8,n,o){this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(n);var a=h.utils.buildArrowHead(t,e,r,this.scale.x,this.scale.y);o&&(o.x=a[0].x/this.scale.x,o.y=a[0].y/this.scale.y),this.ctx.moveTo(this.offset.x+a[0].x,this.offset.y+a[0].y);for(var l=0;l<a.length;l++)this.ctx.lineTo(this.offset.x+a[l].x,this.offset.y+a[l].y);this.ctx.lineTo(this.offset.x+a[0].x,this.offset.y+a[0].y),this.ctx.lineWidth=i||1,this._fillOrDraw(s),this.ctx.restore()}image(t,e,s,i=1){t.complete&&t.naturalWidth&&(this.ctx.save(),this.ctx.globalAlpha=i,this.ctx.drawImage(t,0,0,t.naturalWidth-1,t.naturalHeight-1,this.offset.x+e.x*this.scale.x,this.offset.y+e.y*this.scale.y,s.x*this.scale.x,s.y*this.scale.y),this.ctx.restore())}texturedPoly(t,e,s,i,r){var n=s.getBounds();new o(i.x,i.y).difference(n.getCenter());var a=new o(e.width,e.height),h=new o(e.min.x,e.min.y).sub(i);this.ctx.save(),this.ctx.translate(this.offset.x+i.x*this.scale.x,this.offset.y+i.y*this.scale.y),v.helpers.clipPoly(this.ctx,{x:-i.x*this.scale.x,y:-i.y*this.scale.y},this.scale,s.vertices),this.ctx.scale(this.scale.x,this.scale.y),this.ctx.rotate(r),this.ctx.drawImage(t,0,0,t.naturalWidth-1,t.naturalHeight-1,h.x,h.y,a.x,a.y),this.ctx.restore()}rect(t,e,s,i,r,n){this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(n),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+e)*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+e)*this.scale.x,this.offset.y+(t.y+s)*this.scale.y),this.ctx.lineTo(this.offset.x+t.x*this.scale.x,this.offset.y+(t.y+s)*this.scale.y),this.ctx.closePath(),this.ctx.lineWidth=r||1,this._fillOrDraw(i),this.ctx.restore()}bounds(t,e,s,i){this.rect(t.min,t.max.x-t.min.x,t.max.y-t.min.y,e,s,i)}cubicBezier(t,e,s,i,r,n,o){t instanceof u?this.cubicBezier(t.startPoint,t.endPoint,t.startControlPoint,t.endControlPoint,r,n):(this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(o),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.bezierCurveTo(this.offset.x+s.x*this.scale.x,this.offset.y+s.y*this.scale.y,this.offset.x+i.x*this.scale.x,this.offset.y+i.y*this.scale.y,this.offset.x+e.x*this.scale.x,this.offset.y+e.y*this.scale.y),this.ctx.lineWidth=n||2,this._fillOrDraw(r),this.ctx.restore())}quadraticBezier(t,e,s,i,r,n){this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(n),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y),this.ctx.quadraticCurveTo(this.offset.x+e.x*this.scale.x,this.offset.y+e.y*this.scale.y,this.offset.x+s.x*this.scale.x,this.offset.y+s.y*this.scale.y),this.ctx.lineWidth=r||2,this._fillOrDraw(i),this.ctx.restore()}cubicBezierPath(t,e,s,i,r){if(t&&0!=t.length){var n,o,a;this.ctx.save(),this.ctx.beginPath(),this.applyStrokeOpts(i),this.ctx.moveTo(this.offset.x+t[0].x*this.scale.x,this.offset.y+t[0].y*this.scale.y);for(var h=1;h<t.length;h+=3)o=t[h],a=t[h+1],n=t[h+2],this.ctx.bezierCurveTo(this.offset.x+o.x*this.scale.x,this.offset.y+o.y*this.scale.y,this.offset.x+a.x*this.scale.x,this.offset.y+a.y*this.scale.y,this.offset.x+n.x*this.scale.x,this.offset.y+n.y*this.scale.y);r||this.ctx.closePath(),this.ctx.lineWidth=s||1,this._fillOrDraw(e),this.ctx.restore()}}handle(t,e){this.point(t,"rgb(0,32,192)"),this.square(e,5,"rgba(0,128,192,0.5)")}handleLine(t,e){this.line(t,e,"rgba(128,128,128, 0.5)",void 0)}dot(t,e){this.ctx.save(),this.ctx.beginPath(),this.ctx.setLineDash([]),this.ctx.moveTo(Math.round(this.offset.x+this.scale.x*t.x),Math.round(this.offset.y+this.scale.y*t.y)),this.ctx.lineTo(Math.round(this.offset.x+this.scale.x*t.x+1),Math.round(this.offset.y+this.scale.y*t.y+1)),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(e),this.ctx.restore()}point(t,e){this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.arc(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,3,0,2*Math.PI,!1),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(e)}circle(t,e,s,i,r){this.applyStrokeOpts(r),this.ctx.beginPath(),this.ctx.ellipse(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,e*this.scale.x,e*this.scale.y,0,0,2*Math.PI),this.ctx.closePath(),this.ctx.lineWidth=i||1,this._fillOrDraw(s)}circleArc(t,e,s,i,r,n,o){o&&o.asSegment||this.ctx.beginPath(),this.applyStrokeOpts(o),this.ctx.ellipse(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,e*this.scale.x,e*this.scale.y,0,s,i,!1),o&&o.asSegment||(this.ctx.lineWidth=n||1,this._fillOrDraw(r||"#000000"))}ellipse(t,e,s,i,r,n,o){void 0===n&&(n=0),this.applyStrokeOpts(o),this.ctx.beginPath(),this.ctx.ellipse(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,e*this.scale.x,s*this.scale.y,n,0,2*Math.PI),this.ctx.closePath(),this.ctx.lineWidth=r||1,this._fillOrDraw(i)}square(t,e,s,i,r){this.applyStrokeOpts(r),this.ctx.beginPath(),this.ctx.rect(this.offset.x+(t.x-e/2)*this.scale.x,this.offset.y+(t.y-e/2)*this.scale.y,e*this.scale.x,e*this.scale.y),this.ctx.closePath(),this.ctx.lineWidth=i||1,this._fillOrDraw(s)}grid(t,e,s,i,r,n){this.ctx.setLineDash([]),this.ctx.beginPath();for(var o=-Math.ceil(.5*s/r)*r,a=s/2,h=-Math.ceil(.5*e/i)*i;h<e/2;h+=i)this.ctx.moveTo(this.offset.x+(t.x+h)*this.scale.x,this.offset.y+(t.y+o)*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+h)*this.scale.x,this.offset.y+(t.y+a)*this.scale.y);for(var l=-Math.ceil(.5*e/i)*i,c=e/2,d=-Math.ceil(.5*s/r)*r;d<s/2;d+=r)this.ctx.moveTo(this.offset.x+(t.x+l)*this.scale.x-4,this.offset.y+(t.y+d)*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+c)*this.scale.x+4,this.offset.y+(t.y+d)*this.scale.y);this.ctx.strokeStyle=n,this.ctx.lineWidth=1,this.ctx.stroke(),this.ctx.closePath()}raster(t,e,s,i,r,n){this.ctx.save(),this.ctx.setLineDash([]),this.ctx.beginPath();for(var o=-Math.ceil(.5*e/i)*i;o<e/2;o+=i)for(var a=-Math.ceil(.5*s/r)*r;a<s/2;a+=r)this.ctx.moveTo(this.offset.x+(t.x+o)*this.scale.x-4,this.offset.y+(t.y+a)*this.scale.y),this.ctx.lineTo(this.offset.x+(t.x+o)*this.scale.x+4,this.offset.y+(t.y+a)*this.scale.y),this.ctx.moveTo(this.offset.x+(t.x+o)*this.scale.x,this.offset.y+(t.y+a)*this.scale.y-4),this.ctx.lineTo(this.offset.x+(t.x+o)*this.scale.x,this.offset.y+(t.y+a)*this.scale.y+4);this.ctx.strokeStyle=n,this.ctx.lineWidth=1,this.ctx.stroke(),this.ctx.closePath(),this.ctx.restore()}diamondHandle(t,e,s){this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.moveTo(this.offset.x+t.x*this.scale.x-e/2,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y-e/2),this.ctx.lineTo(this.offset.x+t.x*this.scale.x+e/2,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y+e/2),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(s)}squareHandle(t,e,s){this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.rect(this.offset.x+t.x*this.scale.x-e/2,this.offset.y+t.y*this.scale.y-e/2,e,e),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(s)}circleHandle(t,e,s){e=e||3,this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.arc(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y,e,0,2*Math.PI,!1),this.ctx.closePath(),this.ctx.lineWidth=1,this._fillOrDraw(s)}crosshair(t,e,s,i){this.ctx.save(),this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.moveTo(this.offset.x+t.x*this.scale.x-e,this.offset.y+t.y*this.scale.y),this.ctx.lineTo(this.offset.x+t.x*this.scale.x+e,this.offset.y+t.y*this.scale.y),this.ctx.moveTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y-e),this.ctx.lineTo(this.offset.x+t.x*this.scale.x,this.offset.y+t.y*this.scale.y+e),this.ctx.strokeStyle=s,this.ctx.lineWidth=i||.5,this.ctx.stroke(),this.ctx.closePath(),this.ctx.restore()}cross(t,e,s,i){this.ctx.save(),this.ctx.setLineDash([]),this.ctx.beginPath(),this.ctx.moveTo(this.offset.x+t.x*this.scale.x-e,this.offset.y+t.y*this.scale.y-e),this.ctx.lineTo(this.offset.x+t.x*this.scale.x+e,this.offset.y+t.y*this.scale.y+e),this.ctx.moveTo(this.offset.x+t.x*this.scale.x-e,this.offset.y+t.y*this.scale.y+e),this.ctx.lineTo(this.offset.x+t.x*this.scale.x+e,this.offset.y+t.y*this.scale.y-e),this.ctx.strokeStyle=s,this.ctx.lineWidth=i||1,this.ctx.stroke(),this.ctx.closePath(),this.ctx.restore()}polygon(t,e,s,i){this.polyline(t.vertices,t.isOpen,e,s,i)}polyline(t,e,s,i,r){if(!(t.length<=1)){this.ctx.save(),this.applyStrokeOpts(r),this.ctx.beginPath(),this.ctx.lineWidth=i||1,this.ctx.moveTo(this.offset.x+t[0].x*this.scale.x,this.offset.y+t[0].y*this.scale.y);for(var n=0;n<t.length;n++)this.ctx.lineTo(this.offset.x+t[n].x*this.scale.x,this.offset.y+t[n].y*this.scale.y);e||this.ctx.closePath(),this._fillOrDraw(s),this.ctx.closePath(),this.ctx.setLineDash([]),this.ctx.restore()}}text(t,e,s,i){var r,n,o;i=i||{},this.ctx.save();let a=this.offset.x+e*this.scale.x,h=this.offset.y+s*this.scale.y;const l=i.color||"black";(i.fontSize||i.fontFamily)&&(this.ctx.font=(i.fontWeight?i.fontWeight+" ":"")+(i.fontStyle?i.fontStyle+" ":"")+(i.fontSize?i.fontSize*this.scale.x+"px ":" ")+(i.fontFamily?-1===i.fontFamily.indexOf(" ")?i.fontFamily:`"${i.fontFamily}"`:"Arial")),i.textAlign&&(this.ctx.textAlign=i.textAlign);const c=null!==(r=i.rotation)&&void 0!==r?r:0,d=(null!==(o=null!==(n=i.lineHeight)&&void 0!==n?n:i.fontSize)&&void 0!==o?o:0)*this.scale.x;this.ctx.translate(a,h),this.ctx.rotate(c),this.fillShapes?(this.ctx.fillStyle=l,this.ctx.fillText(t,0,d/2)):(this.ctx.strokeStyle=l,this.ctx.strokeText(t,0,d/2)),this.ctx.restore()}label(t,e,s,i,r){this.ctx.save(),this.ctx.font="lighter 9pt Arial",this.ctx.translate(e,s),void 0!==i&&this.ctx.rotate(i),this.ctx.fillStyle=r||"black",this.fillShapes?this.ctx.fillText(t,0,0):this.ctx.strokeText(t,0,0),this.ctx.restore()}path(t,e,s,i){const r=i&&i.inplace?t:p.copyPathData(t);p.transformPathData(r,this.offset,this.scale),e&&(this.ctx.strokeStyle=e),this.ctx.lineWidth=s||1,this.applyStrokeOpts(i),this.fillShapes?(e&&(this.ctx.fillStyle=e),this.ctx.fill(new Path2D(r.join(" ")))):(e&&(this.ctx.strokeStyle=e),this.ctx.stroke(new Path2D(r.join(" "))))}clear(t){this.ctx.clearRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height),this.ctx.fillStyle=t,this.ctx.fillRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height)}}v.helpers={clipPoly:(t,e,s,i)=>{t.beginPath(),t.moveTo(e.x+i[0].x*s.x,e.y+i[0].y*s.y);for(var r=1;r<i.length;r++){const n=i[r];t.lineTo(e.x+n.x*s.x,e.y+n.y*s.y)}t.closePath(),t.clip()}};class m{constructor(t,e){this.gl=t,this.offset=new o(0,0),this.scale=new o(1,1),this.fillShapes=e,this._zindex=0,null!=t&&void 0!==t&&(this.glutils=new y(t),this._vertShader=this.glutils.compileShader(m.vertCode,this.gl.VERTEX_SHADER),this._fragShader=this.glutils.compileShader(m.fragCode,this.gl.FRAGMENT_SHADER),this._program=this.glutils.makeProgram(this._vertShader,this._fragShader),this.vertex_buffer=this.gl.createBuffer(),console.log("gl initialized"))}_x2rel(t){return(this.scale.x*t+this.offset.x)/this.gl.canvas.width*2-1}_y2rel(t){return(this.offset.y-this.scale.y*t)/this.gl.canvas.height*2-1}copyInstance(t){var e=new m(null,t);return e.gl=this.gl,e.glutils=this.glutils,e._vertShader=this._vertShader,e._fragShader=this._fragShader,e._program=this._program,e}beginDrawCycle(t){this._zindex=0,this.renderTime=t}endDrawCycle(t){}setConfiguration(t){}setCurrentId(t){this.curId=t}setCurrentClassName(t){}line(t,e,s){const i=new Float32Array(6);i[0]=this._x2rel(t.x),i[1]=this._y2rel(t.y),i[2]=this._zindex,i[3]=this._x2rel(e.x),i[4]=this._y2rel(e.y),i[5]=this._zindex,this._zindex+=.001,this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.vertex_buffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,i,this.gl.STATIC_DRAW);var r=this.gl.getAttribLocation(this._program,"position");this.gl.vertexAttribPointer(r,3,this.gl.FLOAT,!1,0,0),this.gl.enableVertexAttribArray(r),this.gl.viewport(0,0,this.gl.canvas.width,this.gl.canvas.height);let n=this.gl.getUniformLocation(this._program,"uRotationVector");this.gl.uniform2fv(n,[0,1]),this.gl.lineWidth(5),this.gl.drawArrays(this.gl.LINES,0,i.length/3)}arrow(t,e,s){}cubicBezierArrow(t,e,s,i,r,n,o){}arrowHead(t,e,s,i,r){}image(t,e,s,i=0){}texturedPoly(t,e,s,i,r){}_fillOrDraw(t){}cubicBezier(t,e,s,i,r,n){}cubicBezierPath(t,e,s,i,r){}handle(t,e){}handleLine(t,e){}dot(t,e){}point(t,e){}circle(t,e,s,i){}circleArc(t,e,s,i,r,n){}ellipse(t,e,s,i,r,n){}square(t,e,s,i){}rect(t,e,s,i,r,n){}bounds(t,e,s,i){this.rect(t.min,t.max.x-t.min.x,t.max.y-t.min.y,e,s,i)}grid(t,e,s,i,r,n){}raster(t,e,s,i,r,n){}diamondHandle(t,e,s){}squareHandle(t,e,s){}circleHandle(t,e,s){}crosshair(t,e,s,i){}cross(t,e,s,i){}polygon(t,e,s){const i=new Float32Array(3*t.vertices.length);for(var r=0;r<t.vertices.length;r++)i[3*r+0]=this._x2rel(t.vertices[r].x),i[3*r+1]=this._y2rel(t.vertices[r].y),i[3*r+2]=this._zindex;this._zindex+=.001,this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.vertex_buffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,i,this.gl.STATIC_DRAW);var n=this.gl.getAttribLocation(this._program,"position");this.gl.vertexAttribPointer(n,3,this.gl.FLOAT,!1,0,0),this.gl.enableVertexAttribArray(n),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,null),this.gl.viewport(0,0,this.gl.canvas.width,this.gl.canvas.height);let o=this.gl.getUniformLocation(this._program,"uRotationVector");this.gl.uniform2fv(o,[0,1]),this.gl.drawArrays(this.gl.TRIANGLE_FAN,0,i.length/3)}polyline(t,e,s,i){}text(t,e,s,i){}label(t,e,s,i,r){}path(t,e,s,i){}clear(t){this.gl.clearColor(1,1,1,1),this.gl.enable(this.gl.DEPTH_TEST),this.gl.clear(this.gl.COLOR_BUFFER_BIT|this.gl.DEPTH_BUFFER_BIT)}}m.vertCode="\n precision mediump float;\n\n attribute vec3 position;\n\n uniform vec2 uRotationVector;\n\n void main(void) {\n\tvec2 rotatedPosition = vec2(\n\t position.x * uRotationVector.y +\n\t\tposition.y * uRotationVector.x,\n\t position.y * uRotationVector.y -\n\t\tposition.x * uRotationVector.x\n\t);\n\n\tgl_Position = vec4(rotatedPosition, position.z, 1.0);\n }",m.fragCode="\n precision highp float;\n\n void main(void) {\n\tgl_FragColor = vec4(0.0,0.75,1.0,1.0);\n }";class y{constructor(t){this.gl=t}bufferData(t){var e=this.gl.createBuffer();return this.gl.bindBuffer(this.gl.ARRAY_BUFFER,e),this.gl.bufferData(this.gl.ARRAY_BUFFER,t,this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,null),e}compileShader(t,e){var s=this.gl.createShader(e);this.gl.shaderSource(s,t),this.gl.compileShader(s);return this.gl.getShaderParameter(s,this.gl.COMPILE_STATUS)?s:(console.warn("Error in shader:"+this.gl.getShaderInfoLog(s)),this.gl.deleteShader(s),null)}makeProgram(t,e){var s=this.gl.createProgram();return this.gl.attachShader(s,t),this.gl.attachShader(s,e),this.gl.linkProgram(s),this.gl.useProgram(s),this.gl.detachShader(s,t),this.gl.detachShader(s,e),this.gl.deleteShader(t),this.gl.deleteShader(e),s}}class b{constructor(t,e){this.center=t,this.size=e}}b.utils={baseLog:(t,e)=>Math.log(t)/Math.log(e),mapRasterScale:(t,e)=>{var s=1;return e>=1?(s=Math.abs(Math.floor(1/b.utils.baseLog(t,e))),s=1/Math.pow(t,s)):s=Math.abs(Math.floor(b.utils.baseLog(1/t,1/(e+1)))),s}};class w{constructor(t){this.downListeners=[],this.pressListeners=[],this.upListeners=[],this.keyStates={},t=t||{},this.element=t.element?t.element:globalThis,this.downListeners=[],this.pressListeners=[],this.upListeners=[],this.keyStates=[],this.trackAllKeys=t.trackAll||!1,this.installListeners()}fireEvent(t,e){let s=!1;for(var i in e){var r=e[i];r.keyCode==t.keyCode&&(r.listener(t),s=!0)}return s}fireDownEvent(t,e){(e.fireEvent(t,e.downListeners)||e.trackAllKeys)&&(e.keyStates[t.keyCode]="down")}firePressEvent(t,e){e.fireEvent(t,e.pressListeners)}fireUpEvent(t,e){(e.fireEvent(t,e.upListeners)||e.trackAllKeys)&&delete e.keyStates[t.keyCode]}static key2code(t){if("number"==typeof t)return t;if("string"!=typeof t)throw"Unknown key name or key type (should be a string or integer): "+t;if(w.KEY_CODES[t])return w.KEY_CODES[t];throw"Unknown key (cannot resolve key code): "+t}installListeners(){var t=this;this.element.addEventListener("keydown",this._keyDownListener=e=>{t.fireDownEvent(e,t)}),this.element.addEventListener("keypress",this._keyPressListener=e=>{t.firePressEvent(e,t)}),this.element.addEventListener("keyup",this._keyUpListener=e=>{t.fireUpEvent(e,t)})}releaseListeners(){this.element.removeEventListener("keydown",this._keyDownListener),this.element.removeEventListener("keypress",this._keyPressListener),this.element.removeEventListener("keyup",this._keyUpListener)}down(t,e){return this.downListeners.push({key:t,keyCode:w.key2code(t),listener:e}),this}press(t,e){return this.pressListeners.push({key:t,keyCode:w.key2code(t),listener:e}),this}up(t,e){return this.upListeners.push({key:t,keyCode:w.key2code(t),listener:e}),this}isDown(t){return"number"==typeof t?!!this.keyStates[t]:!!this.keyStates[w.key2code(t)]}destroy(){this.releaseListeners()}}w.KEY_CODES={break:3,backspace:8,tab:9,clear:12,enter:13,shift:16,ctrl:17,alt:18,pause:19,capslock:20,hangul:21,hanja:25,escape:27,conversion:28,"non-conversion":29,spacebar:32,pageup:33,pagedown:34,end:35,home:36,leftarrow:37,uparrow:38,rightarrow:39,downarrow:40,select:41,print:42,execute:43,printscreen:44,insert:45,delete:46,help:47,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,":":58,"semicolon (firefox)":59,equals:59,"<":60,"equals (firefox)":61,"ß":63,"@ (firefox)":64,a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,windows:91,leftcommand:91,chromebooksearch:91,rightwindowkey:92,windowsmenu:93,rightcommant:93,sleep:95,numpad0:96,numpad1:97,numpad2:98,numpad3:99,numpad4:100,numpad5:101,numpad6:102,numpad7:103,numpad8:104,numpad9:105,multiply:106,add:107,numpadperiod:108,subtract:109,decimalpoint:110,divide:111,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,f13:124,f14:125,f15:126,f16:127,f17:128,f18:129,f19:130,f20:131,f21:132,f22:133,f23:134,f24:135,numlock:144,scrolllock:145,"^":160,"!":161,"#":163,$:164,"ù":165,pagebackward:166,pageforward:167,refresh:168,closingparen:169,"*":170,"~+*":171,minus:173,decreasevolumelevel:174,increasevolumelevel:175,next:176,previous:177,stop:178,"play/pause":179,email:180,mute:181,unmute:181,semicolon:186,"ñ":186,equal:187,comma:188,dash:189,period:190,forwardslash:191,"ç":191,"grave accent":192,"æ":192,"ö":192,"?":193,"/":193,"°":193,openbracket:219,backslash:220,closebracket:221,"å":221,singlequote:222,"ø":222,"ä":222,"`":223,altgr:225,"GNOME Compose Key":230,XF86Forward:233,XF86Back:234,alphanumeric:240,hiragana:242,katakana:242,"half-width":243,"full-width":243,kanji:244,unlocktrackpad:251,toggletouchpad:255};class C extends MouseEvent{}class P extends WheelEvent{}class A{constructor(t,e){this.mouseDownPos=void 0,this.mouseDragPos=void 0,this.mouseButton=-1,this.listeners={},this.installed={},this.handlers={},this.name=e,this.element=t,this.mouseDownPos=void 0,this.mouseDragPos=void 0,this.mouseButton=-1,this.listeners={},this.installed={},this.handlers={};const s=this;this.handlers.mousemove=t=>{s.listeners.mousemove&&s.listeners.mousemove(s.mkParams(t,"mousemove")),s.mouseDragPos&&s.listeners.drag&&s.listeners.drag(s.mkParams(t,"drag")),s.mouseDownPos&&(s.mouseDragPos=s.relPos(t))},this.handlers.mouseup=t=>{s.listeners.mouseup&&s.listeners.mouseup(s.mkParams(t,"mouseup")),s.mouseDragPos=void 0,s.mouseDownPos=void 0,s.mouseButton=-1},this.handlers.mousedown=t=>{s.mouseDragPos=s.relPos(t),s.mouseDownPos=s.relPos(t),s.mouseButton=t.button,s.listeners.mousedown&&s.listeners.mousedown(s.mkParams(t,"mousedown"))},this.handlers.click=t=>{s.listeners.click&&s.listeners.click(s.mkParams(t,"click"))},this.handlers.wheel=t=>{s.listeners.wheel&&s.listeners.wheel(s.mkParams(t,"wheel"))},this.element.addEventListener("mousemove",this.handlers.mousemove),this.element.addEventListener("mouseup",this.handlers.mouseup),this.element.addEventListener("mousedown",this.handlers.mousedown),this.element.addEventListener("click",this.handlers.click),this.element.addEventListener("wheel",this.handlers.wheel)}relPos(t){return{x:t.offsetX,y:t.offsetY}}mkParams(t,e){var s,i;const r=this.relPos(t),n=t;return n.params={element:this.element,name:e,isTouchEvent:!1,pos:r,button:t.button,leftButton:0===t.button,middleButton:1===t.button,rightButton:2===t.button,mouseDownPos:null!==(s=this.mouseDownPos)&&void 0!==s?s:{x:NaN,y:NaN},draggedFrom:null!==(i=this.mouseDragPos)&&void 0!==i?i:{x:NaN,y:NaN},wasDragged:null!=this.mouseDownPos&&(this.mouseDownPos.x!=r.x||this.mouseDownPos.y!=r.y),dragAmount:null!=this.mouseDragPos?{x:r.x-this.mouseDragPos.x,y:r.y-this.mouseDragPos.y}:{x:0,y:0}},n}listenFor(t){this.installed[t]||(this.installed[t]=!0)}unlistenFor(t){this.installed[t]&&delete this.installed[t]}drag(t){return this.listeners.drag&&this.throwAlreadyInstalled("drag"),this.listeners.drag=t,this.listenFor("mousedown"),this.listenFor("mousemove"),this.listenFor("mouseup"),this}move(t){return this.listeners.mousemove&&this.throwAlreadyInstalled("mousemove"),this.listenFor("mousemove"),this.listeners.mousemove=t,this}up(t){return this.listeners.mouseup&&this.throwAlreadyInstalled("mouseup"),this.listenFor("mouseup"),this.listeners.mouseup=t,this}down(t){return this.listeners.mousedown&&this.throwAlreadyInstalled("mousedown"),this.listenFor("mousedown"),this.listeners.mousedown=t,this}click(t){return this.listeners.click&&this.throwAlreadyInstalled("click"),this.listenFor("click"),this.listeners.click=t,this}wheel(t){return this.listeners.wheel&&this.throwAlreadyInstalled("wheel"),this.listenFor("wheel"),this.listeners.wheel=t,this}throwAlreadyInstalled(t){throw`This MouseHandler already has a '${t}' callback. To keep the code simple there is only room for one.`}destroy(){this.unlistenFor("mousedown"),this.unlistenFor("mousemove"),this.unlistenFor("moseup"),this.unlistenFor("click"),this.unlistenFor("wheel"),this.element.removeEventListener("mousemove",this.handlers.mousemove),this.element.removeEventListener("mouseup",this.handlers.mousedown),this.element.removeEventListener("mousedown",this.handlers.mousedown),this.element.removeEventListener("click",this.handlers.click),this.element.removeEventListener("wheel",this.handlers.wheel)}}class _{constructor(t,s,i){this.className="PBImage",this.uid=e.next(),this.image=t,this.upperLeft=s,this.lowerRight=i}destroy(){this.upperLeft.destroy(),this.lowerRight.destroy(),this.isDestroyed=!0}}class S{constructor(t,s,i){this.className="PBText",this.uid=e.next(),this.text=t,this.anchor=null!=s?s:new o,this.color=null==i?void 0:i.color,this.fontFamily=null==i?void 0:i.fontFamily,this.fontSize=null==i?void 0:i.fontSize,this.fontStyle=null==i?void 0:i.fontStyle,this.fontWeight=null==i?void 0:i.fontWeight,this.lineHeight=null==i?void 0:i.lineHeight,this.textAlign=null==i?void 0:i.textAlign,this.rotation=null==i?void 0:i.rotation}destroy(){this.anchor.destroy(),this.isDestroyed=!0}}const T=t=>Math.sqrt(t.x*t.x+t.y*t.y),L=(t,e)=>{var s=((t,e)=>{const s=T(t)*T(e);if(0===s)return 0;var i=((t,e)=>t.x*e.x+t.y*e.y)(t,e)/s;return i>1&&(i=1),Math.acos(i)})(t,e);return((t,e)=>t.x*e.y-e.x*t.y)(t,e)>0&&(s*=-1),180*s/Math.PI};class E{constructor(t){this.handlers=[],this.el=t}add(t){this.handlers.push(t)}del(t){t||(this.handlers=[]);for(var e=this.handlers.length;e>=0;e--)this.handlers[e]===t&&this.handlers.splice(e,1)}dispatch(...t){for(var e=0,s=this.handlers.length;e<s;e++){const t=this.handlers[e];"function"==typeof t&&t.apply(this.el,arguments)}}}const M=(t,e)=>{const s=new E(t);return s.add(e),s};class I{constructor(t,e){this.element="string"==typeof t?document.querySelector(t):t,this.start=this.start.bind(this),this.move=this.move.bind(this),this.end=this.end.bind(this),this.cancel=this.cancel.bind(this),this.element.addEventListener("touchstart",this.start,!1),this.element.addEventListener("touchmove",this.move,!1),this.element.addEventListener("touchend",this.end,!1),this.element.addEventListener("touchcancel",this.cancel,!1),this.preV={x:null,y:null},this.pinchStartLen=null,this.zoom=1,this.isDoubleTap=!1;const s=()=>{};this.rotate=M(this.element,e.rotate||s),this.touchStart=M(this.element,e.touchStart||s),this.multipointStart=M(this.element,e.multipointStart||s),this.multipointEnd=M(this.element,e.multipointEnd||s),this.pinch=M(this.element,e.pinch||s),this.swipe=M(this.element,e.swipe||s),this.tap=M(this.element,e.tap||s),this.doubleTap=M(this.element,e.doubleTap||s),this.longTap=M(this.element,e.longTap||s),this.singleTap=M(this.element,e.singleTap||s),this.pressMove=M(this.element,e.pressMove||s),this.twoFingerPressMove=M(this.element,e.twoFingerPressMove||s),this.touchMove=M(this.element,e.touchMove||s),this.touchEnd=M(this.element,e.touchEnd||s),this.touchCancel=M(this.element,e.touchCancel||s),this._cancelAllHandler=this.cancelAll.bind(this),globalThis&&"function"==typeof globalThis.addEventListener&&globalThis.addEventListener("scroll",this._cancelAllHandler),this.delta=null,this.last=null,this.now=null,this.tapTimeout=null,this.singleTapTimeout=null,this.longTapTimeout=null,this.swipeTimeout=null,this.x1=this.x2=this.y1=this.y2=null,this.preTapPosition={x:null,y:null}}start(t){if(!t.touches)return;const e=this;this.now=Date.now(),this.x1=t.touches[0].pageX,this.y1=t.touches[0].pageY,this.delta=this.now-(this.last||this.now),this.touchStart.dispatch(t,this.element),null!==this.preTapPosition.x&&(this.isDoubleTap=this.delta>0&&this.delta<=250&&Math.abs(this.preTapPosition.x-this.x1)<30&&Math.abs(this.preTapPosition.y-this.y1)<30,this.isDoubleTap&&clearTimeout(this.singleTapTimeout)),this.preTapPosition.x=this.x1,this.preTapPosition.y=this.y1,this.last=this.now;const s=this.preV;if(t.touches.length>1){this._cancelLongTap(),this._cancelSingleTap();const e={x:t.touches[1].pageX-this.x1,y:t.touches[1].pageY-this.y1};s.x=e.x,s.y=e.y,this.pinchStartLen=T(s),this.multipointStart.dispatch(t,this.element)}this._preventTap=!1,this.longTapTimeout=setTimeout((()=>{e.longTap.dispatch(t,e.element),e._preventTap=!0}).bind(e),750)}move(t){if(!t.touches)return;const e=t,s=this.preV,i=t.touches.length,r=t.touches[0].pageX,n=t.touches[0].pageY;if(this.isDoubleTap=!1,i>1){const t=e.touches[1].pageX,i=e.touches[1].pageY,o={x:e.touches[1].pageX-r,y:e.touches[1].pageY-n};null!==s.x&&(this.pinchStartLen>0&&(e.zoom=T(o)/this.pinchStartLen,this.pinch.dispatch(e,this.element)),e.angle=L(o,s),this.rotate.dispatch(e,this.element)),s.x=o.x,s.y=o.y,null!==this.x2&&null!==this.sx2?(e.deltaX=(r-this.x2+t-this.sx2)/2,e.deltaY=(n-this.y2+i-this.sy2)/2):(e.deltaX=0,e.deltaY=0),this.twoFingerPressMove.dispatch(e,this.element),this.sx2=t,this.sy2=i}else{if(null!==this.x2){e.deltaX=r-this.x2,e.deltaY=n-this.y2;const t=Math.abs(this.x1-this.x2),s=Math.abs(this.y1-this.y2);(t>10||s>10)&&(this._preventTap=!0)}else e.deltaX=0,e.deltaY=0;this.pressMove.dispatch(e,this.element)}this.touchMove.dispatch(e,this.element),this._cancelLongTap(),this.x2=r,this.y2=n,i>1&&t.preventDefault()}end(t){if(!t.changedTouches)return;const e=t;this._cancelLongTap();const s=this;e.touches.length<2&&(this.multipointEnd.dispatch(e,this.element),this.sx2=this.sy2=null),this.x2&&Math.abs(this.x1-this.x2)>30||this.y2&&Math.abs(this.y1-this.y2)>30?(e.direction=this._swipeDirection(this.x1,this.x2,this.y1,this.y2),this.swipeTimeout=setTimeout(function(){s.swipe.dispatch(e,s.element)},0)):(this.tapTimeout=setTimeout(function(){s._preventTap||s.tap.dispatch(e,s.element),s.isDoubleTap&&(s.doubleTap.dispatch(e,s.element),s.isDoubleTap=!1)},0),s.isDoubleTap||(s.singleTapTimeout=setTimeout(function(){s.singleTap.dispatch(e,s.element)},250))),this.touchEnd.dispatch(e,this.element),this.preV.x=0,this.preV.y=0,this.zoom=1,this.pinchStartLen=null,this.x1=this.x2=this.y1=this.y2=null}cancelAll(){this._preventTap=!0,clearTimeout(this.singleTapTimeout),clearTimeout(this.tapTimeout),clearTimeout(this.longTapTimeout),clearTimeout(this.swipeTimeout)}cancel(t){this.cancelAll(),this.touchCancel.dispatch(t,this.element)}_cancelLongTap(){clearTimeout(this.longTapTimeout)}_cancelSingleTap(){clearTimeout(this.singleTapTimeout)}_swipeDirection(t,e,s,i){return Math.abs(t-e)>=Math.abs(s-i)?t-e>0?"Left":"Right":s-i>0?"Up":"Down"}on(t,e){if(this[t]){this[t].add(e)}}off(t,e){if(this[t]){this[t].del(e)}}destroy(){this.singleTapTimeout&&clearTimeout(this.singleTapTimeout),this.tapTimeout&&clearTimeout(this.tapTimeout),this.longTapTimeout&&clearTimeout(this.longTapTimeout),this.swipeTimeout&&clearTimeout(this.swipeTimeout),this.element.removeEventListener("touchstart",this.start),this.element.removeEventListener("touchmove",this.move),this.element.removeEventListener("touchend",this.end),this.element.removeEventListener("touchcancel",this.cancel),this.rotate.del(),this.touchStart.del(),this.multipointStart.del(),this.multipointEnd.del(),this.pinch.del(),this.swipe.del(),this.tap.del(),this.doubleTap.del(),this.longTap.del(),this.singleTap.del(),this.pressMove.del(),this.twoFingerPressMove.del(),this.touchMove.del(),this.touchEnd.del(),this.touchCancel.del(),this.preV=this.pinchStartLen=this.zoom=this.isDoubleTap=this.delta=this.last=this.now=this.tapTimeout=this.singleTapTimeout=this.longTapTimeout=this.swipeTimeout=this.x1=this.x2=this.y1=this.y2=this.preTapPosition=this.rotate=this.touchStart=this.multipointStart=this.multipointEnd=this.pinch=this.swipe=this.tap=this.doubleTap=this.longTap=this.singleTap=this.pressMove=this.touchMove=this.touchEnd=this.touchCancel=this.twoFingerPressMove=null,globalThis&&"function"==typeof globalThis.removeEventListener&&globalThis.removeEventListener("scroll",this._cancelAllHandler)}}class D{constructor(t,s,i){this.className="VEllipse",this.uid=e.next(),this.center=t,this.axis=s,this.rotation=i||0}clone(){return new D(this.center.clone(),this.axis.clone(),this.rotation)}radiusH(){return Math.abs(this.signedRadiusH())}signedRadiusH(){return new o(this.axis).rotate(-this.rotation,this.center).x-this.center.x}radiusV(){return Math.abs(this.signedRadiusV())}signedRadiusV(){return new o(this.axis).rotate(-this.rotation,this.center).y-this.center.y}getExtremePoints(){const t=this.radiusH(),e=this.radiusV(),s=Math.atan2(-e*Math.sin(this.rotation),t*Math.cos(this.rotation)),i=s+Math.PI,r=this.center.x+t*Math.cos(s)*Math.cos(this.rotation)-e*Math.sin(s)*Math.sin(this.rotation),n=this.center.y+t*Math.cos(s)*Math.sin(this.rotation)+e*Math.sin(s)*Math.cos(this.rotation),a=this.center.x+t*Math.cos(i)*Math.cos(this.rotation)-e*Math.sin(i)*Math.sin(this.rotation),h=this.center.y+t*Math.cos(i)*Math.sin(this.rotation)+e*Math.sin(i)*Math.cos(this.rotation);let l,c;r>a?(l=new o(r,n),c=new o(a,h)):(l=new o(a,h),c=new o(r,n));const d=Math.atan2(e*Math.cos(this.rotation),t*Math.sin(this.rotation)),u=d+Math.PI,g=this.center.x+t*Math.cos(d)*Math.cos(this.rotation)-e*Math.sin(d)*Math.sin(this.rotation),f=this.center.y+t*Math.cos(d)*Math.sin(this.rotation)+e*Math.sin(d)*Math.cos(this.rotation),x=this.center.x+t*Math.cos(u)*Math.cos(this.rotation)-e*Math.sin(u)*Math.sin(this.rotation),p=this.center.y+t*Math.cos(u)*Math.sin(this.rotation)+e*Math.sin(u)*Math.cos(this.rotation);let v,m;return f>p?(v=new o(g,f),m=new o(x,p)):(v=new o(x,p),m=new o(g,f)),[l,c,v,m]}getBounds(){const t=this.radiusH(),e=this.radiusV(),s=t*Math.cos(this.rotation),i=t*Math.sin(this.rotation),r=e*Math.cos(this.rotation+Math.PI/2),n=e*Math.sin(this.rotation+Math.PI/2),o=Math.sqrt(s*s+r*r),a=Math.sqrt(i*i+n*n);return new d({x:this.center.x-o,y:this.center.y-a},{x:this.center.x+o,y:this.center.y+a})}move(t){return this.center.add(t),this.axis.add(t),this}scale(t){return this.axis.scale(t,this.center),this}rotate(t){return this.axis.rotate(t,this.center),this.rotation+=t,this}vertAt(t){const e=this.radiusH(),s=this.radiusV();return new o(D.utils.polarToCartesian(this.center.x,this.center.y,e,s,t)).rotate(this.rotation,this.center)}normalAt(t,e){const s=this.vertAt(t-this.rotation),i=this.getFoci(),r=new l(s,i[0]).angle(),n=r+(new l(s,i[1]).angle()-r)/2,o=s.clone().addX(50).clone().rotate(n,s),a=s.clone().addX(50).clone().rotate(Math.PI+n,s),c=this.center.distance(o)<this.center.distance(a)?new h(s,a):new h(s,o);return"number"==typeof e&&c.setLength(e),c}tangentAt(t,e){return this.normalAt(t,e).inv().perp()}perimeter(){const t=this.radiusH(),e=this.radiusV();return Math.PI*(3*(t+e)-Math.sqrt((3*t+e)*(t+3*e)))}getFoci(){const t=this.radiusH(),e=this.radiusV(),s=t*t-e*e,i=Math.sqrt(Math.abs(s));return s<0?[this.center.clone().addY(i).rotate(this.rotation,this.center),this.center.clone().addY(-i).rotate(this.rotation,this.center)]:[this.center.clone().addX(i).rotate(this.rotation,this.center),this.center.clone().addX(-i).rotate(this.rotation,this.center)]}getEquidistantVertices(t){const e=D.utils.equidistantVertAngles(this.radiusH(),this.radiusV(),t),s=[];for(var i=0;i<e.length;i++)s.push(this.vertAt(e[i]));return s}lineIntersections(t,e=!1){const s=this.clone(),r=t.clone(),n=s.center.clone().inv();s.move(n),r.add(n);const a=-s.rotation;s.rotate(a),r.a.rotate(a,s.center),r.b.rotate(a,s.center);const h=s.radiusH(),l=s.radiusV(),c=h>l?{x:l/h,y:1}:{x:1,y:h/l};s.axis.scaleXY(c),r.a.scaleXY(c),r.b.scaleXY(c);const d=new i(new o,s.radiusH()).lineIntersections(r,e);return d.forEach(function(t){t.scaleXY({x:1/c.x,y:1/c.y},s.center),t.rotate(-a,s.center),t.sub(n)}),d}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map(t=>{const e=new l(this.center,t).angle();return this.tangentAt(e)})}toCubicBezier(t,e){const s=4*Math.max(1,t||3);e=void 0===e?.666666:e;const i=this.radiusH(),r=this.radiusV(),n=[],o=D.utils.equidistantVertAngles(i,r,s);let a=o[0]+this.rotation,h=this.vertAt(a);for(var l=0;l<o.length;l++){let t=o[(l+1)%o.length]+this.rotation,s=this.vertAt(t);if(Math.abs(r)<1e-4||Math.abs(i)<1e-4){let t=h.difference(s),e=new u(h.clone(),s.clone(),h.clone().addXY(.333*t.x,.333*t.y),s.clone().addXY(.333*-t.x,.333*-t.y));n.push(e)}else{let i=this.tangentAt(a+this.rotation),r=this.tangentAt(t+this.rotation),o=i.intersection(r),l=h.difference(o),c=s.difference(o),d=new u(h.clone(),s.clone(),h.clone().add(l.scale(e)),s.clone().add(c.scale(e)));n.push(d)}h=s,a=t}return n}destroy(){this.center.destroy(),this.axis.destroy(),this.isDestroyed=!0}}D.utils={polarToCartesian:(t,e,s,i,r)=>{var n=Math.sin(Math.PI/2-r),o=Math.cos(Math.PI/2-r);return{x:t+s*i*n/Math.sqrt(Math.pow(s*o,2)+Math.pow(i*n,2)),y:e+s*i*o/Math.sqrt(Math.pow(s*o,2)+Math.pow(i*n,2))}},phiToTheta:(t,e,s)=>{var i=Math.tan(s),r=i*i;return-Math.PI/2+s+Math.atan((t-e)*i/(e+t*r))},equidistantVertAngles:(t,e,s)=>{const i=[];for(var r=0;r<s;r++){var n=Math.PI/2+2*Math.PI/s*r;let o=D.utils.phiToTheta(t,e,n);i[r]=o}return i}};class N{constructor(t,s,i){this.className="VEllipseSector",this.uid=e.next(),this.ellipse=t,this.startAngle=n.wrapMinMax(s,0,2*Math.PI),this.endAngle=n.wrapMinMax(i,0,2*Math.PI)}move(t){return this.ellipse.move(t),this}containsAngle(t){t=n.mapAngleTo2PI(t);const e=n.mapAngleTo2PI(this.startAngle),s=n.mapAngleTo2PI(this.endAngle);return e<=s?t>=e&&t<s:t>=e||t<s}getStartPoint(){return this.ellipse.vertAt(this.startAngle)}getEndPoint(){return this.ellipse.vertAt(this.endAngle)}getBounds(){const t=this.ellipse.getExtremePoints().filter(t=>{const e=new l(this.ellipse.center,t).angle()-this.ellipse.rotation;return this.containsAngle(e)});return d.computeFromVertices([this.getStartPoint(),this.getEndPoint()].concat(t))}lineIntersections(t,e=!1){const s=this.ellipse.lineIntersections(t,e),i=new l(this.ellipse.center,new o);return s.filter(t=>{i.b.set(t);const e=i.angle();return this.containsAngle(e-this.ellipse.rotation)})}lineIntersectionTangents(t,e=!1){return this.lineIntersections(t,e).map(t=>{const e=new l(this.ellipse.center,t).angle();return this.ellipse.tangentAt(e)})}toCubicBezier(t,e){const s=4*Math.max(1,t||3);e=void 0===e?.666666:e;const i=this.ellipse.radiusH(),r=this.ellipse.radiusV();var n=N.ellipseSectorUtils.normalizeAngle(this.startAngle),o=N.ellipseSectorUtils.normalizeAngle(this.endAngle),a=N.ellipseSectorUtils.equidistantVertAngles(i,r,n,o,s);const h=[];let l=(a=[n].concat(a).concat([o]))[0],c=this.ellipse.vertAt(l);for(var d=0;d+1<a.length;d++){let t=a[(d+1)%a.length],s=this.ellipse.vertAt(t),n=this.ellipse.tangentAt(l+this.ellipse.rotation),o=this.ellipse.tangentAt(t+this.ellipse.rotation);if(Math.abs(r)<1e-4||Math.abs(i)<1e-4){let t=c.difference(s),e=new u(c.clone(),s.clone(),c.clone().addXY(.333*t.x,.333*t.y),s.clone().addXY(.333*-t.x,.333*-t.y));h.push(e)}else{let t=n.intersection(o);if(t){let i=c.difference(t),r=s.difference(t),n=new u(c.clone(),s.clone(),c.clone().add(i.scale(e)),s.clone().add(r.scale(e)));h.push(n)}}c=s,l=t}return h}destroy(){this.ellipse.destroy(),this.isDestroyed=!0}}N.ellipseSectorUtils={describeSVGArc:(t,e,s,i,r,a,h,l)=>{void 0===l&&(l={moveToStart:!0}),void 0===h&&(h=0),r=n.wrapMax(r,2*Math.PI),a=n.wrapMax(a,2*Math.PI);var c=new o(D.utils.polarToCartesian(t,e,s,i,a)),d=new o(D.utils.polarToCartesian(t,e,s,i,r));c.rotate(h,{x:t,y:e}),d.rotate(h,{x:t,y:e});var u,g=a-r;u=g<0?Math.abs(g)<Math.PI?1:0:Math.abs(g)>Math.PI?1:0;const f=[];l.moveToStart&&f.push("M",d.x,d.y);const x=180/Math.PI;return f.push("A",s,i,h*x,u,1,c.x,c.y),f},equidistantVertAngles:(t,e,s,i,r)=>{var n=D.utils.equidistantVertAngles(t,e,r);n=(n=n.map(t=>N.ellipseSectorUtils.normalizeAngle(t))).filter(t=>s<i?t>=s&&t<=i:t>=s||t<=i&&t>=0);const o=N.ellipseSectorUtils.findClosestToStartAngle(s,i,n),a=[];for(var h=0;h<n.length;h++)a.push(n[(o+h)%n.length]);return a},findClosestToStartAngle:(t,e,s)=>{if(t>e){const r=s.length;for(var i=0;i<r;i++){const r=n.wrapMinMax(s[i],0,2*Math.PI);if(r>=t&&r>=e)return i}}return 0},normalizeAngle:t=>t<0?2*Math.PI+t:t,endpointToCenterParameters(t,e,s,i,r,n,a,h,c){const d=Math.abs,u=Math.sin,g=Math.cos,f=Math.sqrt,x=t=>t*t,p=u(r),v=g(r),m=v*(t-h)/2+p*(e-c)/2,y=-p*(t-h)/2+v*(e-c)/2,b=x(m),w=x(y),C=x(s),P=x(i),A=b/C+w/P;A>1?(s=f(A)*d(s),i=f(A)*d(i)):(s=d(s),i=d(i));const _=n===a?-1:1,S=f(Math.abs((C*P-C*w-P*b)/(C*w+P*b)))*_,T=S*(s*y)/i,L=S*(-i*m)/s,E=new o(v*T-p*L+(t+h)/2,p*T+v*L+(e+c)/2),M=E.clone().addXY(s,i),I=new D(E,M,0);I.rotate(r);const k=new l(I.center,new o(t,e)).angle(),z=new l(I.center,new o(h,c)).angle();return new N(I,k-r,z-r)}};var k,z=function(t,e,s){return"symbol"==typeof e&&(e=e.description?"[".concat(e.description,"]"):""),Object.defineProperty(t,"name",{configurable:!0,value:s?"".concat(s," ",e):e})};class B{constructor(e,s){var i,r;if(this.contentChangeListeners=[],this.renderTime=0,this._gui=null,t.model={bezierAutoAdjust:!1,renderTime:0,selectable:!0,isSelected:!1,draggable:!0,visible:!0},void 0===e.canvas)throw"No canvas specified.";const n=B.utils.fetch;this.config={canvas:e.canvas,fullSize:n.val(e,"fullSize",!0),fitToParent:n.bool(e,"fitToParent",!0),scaleX:n.num(e,"scaleX",1),scaleY:n.num(e,"scaleY",1),offsetX:n.num(e,"offsetX",0),offsetY:n.num(e,"offsetY",0),rasterGrid:n.bool(e,"rasterGrid",!0),drawRaster:n.bool(e,"drawRaster",!0),rasterScaleX:n.num(e,"rasterScaleX",1),rasterScaleY:n.num(e,"rasterScaleY",1),rasterAdjustFactor:n.num(e,"rasterAdjustdFactror",2),drawOrigin:n.bool(e,"drawOrigin",!1),autoAdjustOffset:n.val(e,"autoAdjustOffset",!0),offsetAdjustXPercent:n.num(e,"offsetAdjustXPercent",50),offsetAdjustYPercent:n.num(e,"offsetAdjustYPercent",50),backgroundColor:e.backgroundColor||"#ffffff",redrawOnResize:n.bool(e,"redrawOnResize",!0),defaultCanvasWidth:n.num(e,"defaultCanvasWidth",B.DEFAULT_CANVAS_WIDTH),defaultCanvasHeight:n.num(e,"defaultCanvasHeight",B.DEFAULT_CANVAS_HEIGHT),canvasWidthFactor:n.num(e,"canvasWidthFactor",1),canvasHeightFactor:n.num(e,"canvasHeightFactor",1),cssScaleX:n.num(e,"cssScaleX",1),cssScaleY:n.num(e,"cssScaleY",1),cssUniformScale:n.bool(e,"cssUniformScale",!0),saveFile:()=>{h.hooks.saveFile(h)},setToRetina:()=>{h._setToRetina()},autoDetectRetina:n.bool(e,"autoDetectRetina",!0),enableSVGExport:n.bool(e,"enableSVGExport",!0),preClear:n.func(e,"preClear",null),preDraw:n.func(e,"preDraw",null),postDraw:n.func(e,"postDraw",null),enableMouse:n.bool(e,"enableMouse",!0),enableTouch:n.bool(e,"enableTouch",!0),enableKeys:n.bool(e,"enableKeys",!0),enableMouseWheel:n.bool(e,"enableMouseWheel",!0),enableZoom:n.bool(e,"enableZoom",!0),enablePan:n.bool(e,"enablePan",!0),enableGL:n.bool(e,"enableGL",!1),isBackdropFiltersEnabled:n.bool(e,"isBackdropFiltersEnabled",!0)},this.drawConfig={drawVertices:!0,drawBezierHandleLines:n.bool(e,"drawBezierHandleLines",!0),drawBezierHandlePoints:n.bool(e,"drawBezierHandlePoints",!0),drawHandleLines:n.bool(e,"drawHandleLines",!0),drawHandlePoints:n.bool(e,"drawHandlePoints",!0),drawGrid:n.bool(e,"drawGrid",!0),drawRaster:n.bool(e,"drawRaster",!0),bezier:{color:"#00a822",lineWidth:2,handleLine:{color:"rgba(180,180,180,0.5)",lineWidth:1},pathVertex:{color:"#B400FF",lineWidth:1,fill:!0},controlVertex:{color:"#B8D438",lineWidth:1,fill:!0}},polygon:{color:"#0022a8",lineWidth:1},triangle:{color:"#6600ff",lineWidth:1},ellipse:{color:"#2222a8",lineWidth:1},ellipseSector:{color:"#a822a8",lineWidth:2},circle:{color:"#22a8a8",lineWidth:2},circleSector:{color:"#2280a8",lineWidth:1},vertex:{color:"#a8a8a8",lineWidth:1},selectedVertex:{color:"#c08000",lineWidth:2},line:{color:"#a844a8",lineWidth:1},vector:{color:"#ff44a8",lineWidth:1},image:{color:"#a8a8a8",lineWidth:1},text:{color:"rgba(192,0,128,0.5)",lineWidth:1,fill:!0,anchor:!0},origin:{color:"#000000"}},this.grid=new b(new o(0,0),new o(50,50)),this.canvasSize={width:B.DEFAULT_CANVAS_WIDTH,height:B.DEFAULT_CANVAS_HEIGHT};const a="string"==typeof e.canvas?document.querySelector(e.canvas):e.canvas;if(void 0===a)throw`Cannot initialize PlotBoilerplate with a null canvas (element "${e.canvas} not found).`;if("canvas"===a.tagName.toLowerCase())if(this.canvas=a,this.eventCatcher=this.canvas,this.config.enableGL&&void 0===m&&(console.warn("Cannot use webgl. Package was compiled without experimental gl support. Please use plotboilerplate-glsupport.min.js instead."),console.warn("Disabling GL and falling back to Canvas2D."),this.config.enableGL=!1),this.config.enableGL){const t=this.canvas.getContext("webgl");this.draw=new m(t,!1),this.fill=this.draw.copyInstance(!0),console.warn("Initialized with experimental mode enableGL=true. Note that this is not yet fully implemented.")}else{const t=this.canvas.getContext("2d");this.draw=new v(t,!1),this.fill=new v(t,!0)}else{if("svg"!==a.tagName.toLowerCase())throw"Element is neither a canvas nor an svg element.";if(void 0===p)throw"The svg draw library is not yet integrated part of PlotBoilerplate. Please include ./src/js/utils/helpers/drawutils.svg into your document.";this.canvas=a,this.draw=new p(this.canvas,new o,new o,this.canvasSize,!1,this.drawConfig,!1),this.fill=this.draw.copyInstance(!0),this.canvas.parentElement?(this.eventCatcher=document.createElement("div"),this.eventCatcher.style.position="absolute",this.eventCatcher.style.left="0",this.eventCatcher.style.top="0",this.eventCatcher.style.cursor="pointer",this.canvas.parentElement.style.position="relative",this.canvas.parentElement.appendChild(this.eventCatcher)):this.eventCatcher=document.body}e.title&&this.eventCatcher.setAttribute("title",e.title),this.draw.scale.set(null!==(i=this.config.scaleX)&&void 0!==i?i:1,this.config.scaleY),this.fill.scale.set(null!==(r=this.config.scaleX)&&void 0!==r?r:1,this.config.scaleY),this.vertices=[],this.selectPolygon=null,this.draggedElements=[],this.drawables=[],this.console=console,this.hooks={saveFile:B._saveFile};var h=this;globalThis.addEventListener("resize",()=>h.resizeCanvas()),this.resizeCanvas(),e.autoDetectRetina&&this._setToRetina(),this.installInputListeners(),this.updateCSSscale(),this.redraw(),this.canvas.focus()}static _saveFile(t){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");var s=new p(e,t.draw.offset,t.draw.scale,t.canvasSize,!1,t.drawConfig),i=s.copyInstance(!0);s.beginDrawCycle(0),i.beginDrawCycle(0),t.config.preClear&&t.config.preClear(),s.clear(t.config.backgroundColor||"white"),t.config.preDraw&&t.config.preDraw(s,i),t.drawAll(0,s,i),t.drawVertices(0,s),t.config.postDraw&&t.config.postDraw(s,i),s.endDrawCycle(0),i.endDrawCycle(0);var r=(new XMLSerializer).serializeToString(e),n=new Blob(['<?xml version="1.0" encoding="utf-8"?>\n'+r],{type:"image/svg;charset=utf-8"});if("function"!=typeof globalThis.saveAs)throw"Cannot save file; did you load the ./utils/savefile helper function and the eligrey/SaveFile library?";(0,globalThis.saveAs)(n,"plotboilerplate.svg")}_setToRetina(){this.config.autoDetectRetina=!0;const t=globalThis.devicePixelRatio||1;this.config.cssScaleX=this.config.cssScaleY=1/t,this.config.canvasWidthFactor=this.config.canvasHeightFactor=t,this.resizeCanvas(),this.updateCSSscale()}isPanning(){return this.isInPanningMode}fitToView(t){const e=new o(this.canvasSize.width/2,this.canvasSize.height/2),s=this.canvasSize.width/this.canvasSize.height,i=t.width/t.height,r=new o(t.max.x-t.width/2,t.max.y-t.height/2).inv().addXY(this.canvasSize.width/2,this.canvasSize.height/2);if(this.setOffset(r),s<i){const s=this.canvasSize.width/t.width;this.setZoom(s,s,e)}else{const s=this.canvasSize.height/t.height;this.setZoom(s,s,e)}this.redraw()}setConsole(t){this.console=t}updateCSSscale(){var t,e,s,i;this.config.cssUniformScale?B.utils.setCSSscale(this.canvas,null!==(t=this.config.cssScaleX)&&void 0!==t?t:1,null!==(e=this.config.cssScaleX)&&void 0!==e?e:1):B.utils.setCSSscale(this.canvas,null!==(s=this.config.cssScaleX)&&void 0!==s?s:1,null!==(i=this.config.cssScaleY)&&void 0!==i?i:1)}addContentChangeListener(t){for(var e in this.contentChangeListeners)if(this.contentChangeListeners[e]===t)return;this.contentChangeListeners.push(t)}removeContentChangeListener(t){for(var e=0;e<this.contentChangeListeners.length;e++)if(this.contentChangeListeners[e]===t)return void this.contentChangeListeners.splice(e,1)}_fireContentChanged(t,e){for(var s in this.contentChangeListeners){const i=this.contentChangeListeners[s];i&&"function"==typeof i&&i({type:t.length>0?"DRAWABLES_ADDED":"DRAWABLES_REMOVED",addedDrawables:t,removedDrawables:e})}}add(t,e,s){if(Array.isArray(t)){const e=t;for(var n=0;n<e.length;n++)this.add(e[n],!1,s)}else{const e=[t];if(t instanceof o)this.drawables.push(t),this.vertices.push(t);else if(t instanceof l)this.drawables.push(t),this.vertices.push(t.a),this.vertices.push(t.b),e.push(t.a,t.b);else if(t instanceof h)this.drawables.push(t),this.vertices.push(t.a),this.vertices.push(t.b),e.push(t.a,t.b),t.a.listeners.addDragListener(e=>{t.b.add(e.params.dragAmount)});else if(t instanceof D)this.vertices.push(t.center),this.vertices.push(t.axis),e.push(t.center,t.axis),this.drawables.push(t),t.center.listeners.addDragListener(e=>{t.axis.add(e.params.dragAmount)});else if(t instanceof N)this.vertices.push(t.ellipse.center),this.vertices.push(t.ellipse.axis),e.push(t.ellipse.center,t.ellipse.axis),this.drawables.push(t),t.ellipse.center.listeners.addDragListener(e=>{t.ellipse.axis.add(e.params.dragAmount)});else if(t instanceof i)this.vertices.push(t.center),e.push(t.center),this.drawables.push(t);else if(t instanceof f)this.vertices.push(t.circle.center),e.push(t.circle.center),this.drawables.push(t);else if(t instanceof c){this.drawables.push(t);for(n=0;n<t.vertices.length;n++)this.vertices.push(t.vertices[n]),e.push(t.vertices[n])}else if(t instanceof r)this.drawables.push(t),this.vertices.push(t.a),this.vertices.push(t.b),this.vertices.push(t.c),e.push(t.a,t.b,t.c);else if(t instanceof g){this.drawables.push(t);const s=t;for(n=0;n<s.bezierCurves.length;n++)t.adjustCircular||0!=n||(this.vertices.push(s.bezierCurves[n].startPoint),e.push(s.bezierCurves[n].startPoint)),this.vertices.push(s.bezierCurves[n].endPoint),this.vertices.push(s.bezierCurves[n].startControlPoint),this.vertices.push(s.bezierCurves[n].endControlPoint),e.push(s.bezierCurves[n].endPoint,s.bezierCurves[n].startControlPoint,s.bezierCurves[n].endControlPoint),s.bezierCurves[n].startControlPoint.attr.selectable=!1,s.bezierCurves[n].endControlPoint.attr.selectable=!1;B.utils.enableBezierPathAutoAdjust(t)}else if(t instanceof _)this.vertices.push(t.upperLeft),this.vertices.push(t.lowerRight),e.push(t.upperLeft,t.lowerRight),this.drawables.push(t),t.upperLeft.listeners.addDragListener(e=>{t.lowerRight.add(e.params.dragAmount)}),t.lowerRight.attr.selectable=!1;else{if(!(t instanceof S))throw"Cannot add drawable of unrecognized type: "+typeof t+".";this.vertices.push(t.anchor),e.push(t.anchor),this.drawables.push(t),t.anchor.attr.selectable=!1}!s&&this._fireContentChanged(e,[])}(e||void 0===e)&&this.redraw()}remove(t,e,s,n){if(Array.isArray(t)){const i=[];for(var a=0;a<t.length;a++)this.remove(t[a],!1,s,!0)&&i.push(t[a]);return e&&this.redraw(),!n&&this._fireContentChanged([],i),i.length>0}if(t instanceof o){const s=this.removeVertex(t,!1,!1);return e&&this.redraw(),!n&&this._fireContentChanged([],[t]),s}let d=!1;const u=[];for(a=0;a<this.drawables.length;a++)if(this.drawables[a]===t||this.drawables[a].uid===t.uid){if(this.drawables.splice(a,1),u.push(t),s)if(t instanceof l)this.removeVertex(t.a,!1,!0),this.removeVertex(t.b,!1,!0),u.push(t.a,t.b);else if(t instanceof h)this.removeVertex(t.a,!1,!0),this.removeVertex(t.b,!1,!0),u.push(t.a,t.b);else if(t instanceof D)this.removeVertex(t.center,!1,!0),this.removeVertex(t.axis,!1,!0),u.push(t.center,t.axis);else if(t instanceof N)this.removeVertex(t.ellipse.center,!1,!0),this.removeVertex(t.ellipse.axis,!1,!0),u.push(t.ellipse.center,t.ellipse.axis);else if(t instanceof i)this.removeVertex(t.center,!1,!0);else if(t instanceof f)this.removeVertex(t.circle.center,!1,!0),u.push(t.circle.center);else if(t instanceof c)for(a=0;a<t.vertices.length;a++)this.removeVertex(t.vertices[a],!1,!0),u.push(t.vertices[a]);else if(t instanceof r)this.removeVertex(t.a,!1,!0),this.removeVertex(t.b,!1,!0),this.removeVertex(t.c,!1,!0),u.push(t.a,t.b,t.c);else if(t instanceof g)for(a=0;a<t.bezierCurves.length;a++)this.removeVertex(t.bezierCurves[a].startPoint,!1,!0),this.removeVertex(t.bezierCurves[a].startControlPoint,!1,!0),this.removeVertex(t.bezierCurves[a].endControlPoint,!1,!0),u.push(t.bezierCurves[a].startPoint,t.bezierCurves[a].startControlPoint,t.bezierCurves[a].endControlPoint),a+1==t.bezierCurves.length&&(this.removeVertex(t.bezierCurves[a].endPoint,!1,!0),u.push(t.bezierCurves[a].endPoint));else t instanceof _?(this.removeVertex(t.upperLeft,!1,!0),this.removeVertex(t.lowerRight,!1,!0),u.push(t.upperLeft,t.lowerRight)):t instanceof S&&(this.removeVertex(t.anchor,!1,!0),u.push(t.anchor));e&&this.redraw(),!n&&this._fireContentChanged([],u),d=!0}return d}removeVertex(t,e,s){for(var i=0;i<this.vertices.length;i++)if(this.vertices[i]===t)return this.vertices.splice(i,1),e&&this.redraw(),!s&&this._fireContentChanged([],[t]),!0;return!1}removeAll(t,e){let s=this.drawables;this.drawables=[],Boolean(t)||(s=s.concat(this.vertices),this.vertices=[]),(e||void 0===e)&&this.redraw(),s.length>0&&this._fireContentChanged([],s)}getVertexNear(t,e){var s,i;const r=this.locatePointNear(this.transformMousePosition(t.x,t.y),e/Math.min(null!==(s=this.config.cssScaleX)&&void 0!==s?s:1,null!==(i=this.config.cssScaleY)&&void 0!==i?i:1));if(r&&"vertex"==r.typeName)return this.vertices[r.vindex]}drawGrid(t){void 0===t&&(t=this.draw);const e=b.utils.mapRasterScale(this.config.rasterAdjustFactor,this.draw.scale.x)*this.config.rasterScaleX/this.config.cssScaleX,s=b.utils.mapRasterScale(this.config.rasterAdjustFactor,this.draw.scale.y)*this.config.rasterScaleY/this.config.cssScaleY;var i={width:this.grid.size.x*e,height:this.grid.size.y*s},r=this.canvasSize.width/2,n=this.canvasSize.height/2,o=this.draw.offset.clone().inv();o.x=Math.round(o.x+r)/Math.round(i.width)*i.width/this.draw.scale.x+(this.draw.offset.x-r)/this.draw.scale.x%i.width,o.y=Math.round(o.y+n)/Math.round(i.height)*i.height/this.draw.scale.y+(this.draw.offset.y-n)/this.draw.scale.x%i.height,this.drawConfig.drawGrid&&(t.setCurrentClassName(null),this.config.rasterGrid?(t.setCurrentId("raster"),t.raster(o,this.canvasSize.width/this.draw.scale.x,this.canvasSize.height/this.draw.scale.y,i.width,i.height,"rgba(0,128,255,0.125)")):(t.setCurrentId("grid"),t.grid(o,this.canvasSize.width/this.draw.scale.x,this.canvasSize.height/this.draw.scale.y,i.width,i.height,"rgba(0,128,255,0.095)")))}drawOrigin(t){t.setCurrentId("origin"),t.crosshair({x:0,y:0},10,this.drawConfig.origin.color)}_handleColor(t,e){return t.attr.isSelected?this.drawConfig.selectedVertex.color:t.attr.draggable?e:"rgba(128,128,128,0.5)"}drawDrawables(t,e,s){for(var i in this.drawables){var r=this.drawables[i];this.draw.setCurrentId(r.uid),this.fill.setCurrentId(r.uid),this.draw.setCurrentClassName(r.className),this.fill.setCurrentClassName(r.className),this.drawDrawable(r,t,e,s)}}drawDrawable(t,e,s,n){if(t instanceof g){var a=0;for(var d in t.bezierCurves){if(this.draw.setCurrentId(`${t.uid}-${a}`),this.fill.setCurrentId(`${t.uid}-${a}`),this.draw.setCurrentClassName(t.className),this.fill.setCurrentClassName(t.className),s.cubicBezier(t.bezierCurves[d].startPoint,t.bezierCurves[d].endPoint,t.bezierCurves[d].startControlPoint,t.bezierCurves[d].endControlPoint,this.drawConfig.bezier.color,this.drawConfig.bezier.lineWidth),this.drawConfig.drawBezierHandlePoints&&this.drawConfig.drawHandlePoints){if(t.bezierCurves[d].startPoint.attr.visible){const e=this.drawConfig.bezier.pathVertex.fill?n:s;e.setCurrentId(`${t.uid}_h0`),e.setCurrentClassName(`${t.className}-start-handle`),t.bezierCurves[d].startPoint.attr.bezierAutoAdjust?e.squareHandle(t.bezierCurves[d].startPoint,5,this._handleColor(t.bezierCurves[d].startPoint,this.drawConfig.bezier.pathVertex.color)):e.diamondHandle(t.bezierCurves[d].startPoint,7,this._handleColor(t.bezierCurves[d].startPoint,this.drawConfig.bezier.pathVertex.color))}if(t.bezierCurves[d].startPoint.attr.renderTime=e,t.bezierCurves[d].endPoint.attr.visible){const e=this.drawConfig.bezier.pathVertex.fill?n:s;e.setCurrentId(`${t.uid}_h0`),e.setCurrentClassName(`${t.className}-start-handle`),t.bezierCurves[d].endPoint.attr.bezierAutoAdjust?e.squareHandle(t.bezierCurves[d].endPoint,5,this._handleColor(t.bezierCurves[d].endPoint,this.drawConfig.bezier.pathVertex.color)):e.diamondHandle(t.bezierCurves[d].endPoint,7,this._handleColor(t.bezierCurves[d].endPoint,this.drawConfig.bezier.pathVertex.color))}if(t.bezierCurves[d].startControlPoint.attr.visible){const e=this.drawConfig.bezier.controlVertex.fill?n:s;e.setCurrentId(`${t.uid}_h2`),e.setCurrentClassName(`${t.className}-start-control-handle`),e.circleHandle(t.bezierCurves[d].startControlPoint,3,this._handleColor(t.bezierCurves[d].startControlPoint,this.drawConfig.bezier.controlVertex.color))}if(t.bezierCurves[d].endControlPoint.attr.visible){const e=this.drawConfig.bezier.controlVertex.fill?n:s;e.setCurrentId(`${t.uid}_h3`),e.setCurrentClassName(`${t.className}-end-control-handle`),e.circleHandle(t.bezierCurves[d].endControlPoint,3,this._handleColor(t.bezierCurves[d].endControlPoint,this.drawConfig.bezier.controlVertex.color))}t.bezierCurves[d].startPoint.attr.renderTime=e,t.bezierCurves[d].endPoint.attr.renderTime=e,t.bezierCurves[d].startControlPoint.attr.renderTime=e,t.bezierCurves[d].endControlPoint.attr.renderTime=e}else t.bezierCurves[d].startPoint.attr.renderTime=e,t.bezierCurves[d].endPoint.attr.renderTime=e,t.bezierCurves[d].startControlPoint.attr.renderTime=e,t.bezierCurves[d].endControlPoint.attr.renderTime=e;this.drawConfig.drawBezierHandleLines&&this.drawConfig.drawHandleLines&&(s.setCurrentId(`${t.uid}_l0`),s.setCurrentClassName(`${t.className}-start-line`),s.handleLine(t.bezierCurves[d].startPoint,t.bezierCurves[d].startControlPoint),s.setCurrentId(`${t.uid}_l1`),s.setCurrentClassName(`${t.className}-end-line`),s.handleLine(t.bezierCurves[d].endPoint,t.bezierCurves[d].endControlPoint)),a++}}else if(t instanceof c){if(s.polygon(t,this.drawConfig.polygon.color,this.drawConfig.polygon.lineWidth),!this.drawConfig.drawHandlePoints)for(var u in t.vertices)t.vertices[u].attr.renderTime=e}else if(t instanceof r)s.polyline([t.a,t.b,t.c],!1,this.drawConfig.triangle.color,this.drawConfig.triangle.lineWidth),this.drawConfig.drawHandlePoints||(t.a.attr.renderTime=t.b.attr.renderTime=t.c.attr.renderTime=e);else if(t instanceof D)this.drawConfig.drawHandleLines&&(s.setCurrentId(`${t.uid}_e0`),s.setCurrentClassName(`${t.className}-v-line`),s.handleLine(t.center.clone().add(0,t.signedRadiusV()).rotate(t.rotation,t.center),t.axis),s.setCurrentId(`${t.uid}_e1`),s.setCurrentClassName(`${t.className}-h-line`),s.handleLine(t.center.clone().add(t.signedRadiusH(),0).rotate(t.rotation,t.center),t.axis)),s.setCurrentId(t.uid),s.setCurrentClassName(`${t.className}`),s.ellipse(t.center,t.radiusH(),t.radiusV(),this.drawConfig.ellipse.color,this.drawConfig.ellipse.lineWidth,t.rotation),this.drawConfig.drawHandlePoints||(t.center.attr.renderTime=e,t.axis.attr.renderTime=e);else if(t instanceof N){s.setCurrentId(t.uid),s.setCurrentClassName(`${t.className}`);const e=N.ellipseSectorUtils.describeSVGArc(t.ellipse.center.x,t.ellipse.center.y,t.ellipse.radiusH(),t.ellipse.radiusV(),t.startAngle,t.endAngle,t.ellipse.rotation,{moveToStart:!0});s.path(e,this.drawConfig.ellipseSector.color,this.drawConfig.ellipseSector.lineWidth)}else t instanceof i?s.circle(t.center,t.radius,this.drawConfig.circle.color,this.drawConfig.circle.lineWidth):t instanceof f?s.circleArc(t.circle.center,t.circle.radius,t.startAngle,t.endAngle,this.drawConfig.circleSector.color,this.drawConfig.circleSector.lineWidth):t instanceof o?!this.drawConfig.drawVertices||t.attr.selectable&&t.attr.draggable||!t.attr.visible||(s.circleHandle(t,7,this.drawConfig.vertex.color),t.attr.renderTime=e):t instanceof l?(s.line(t.a,t.b,this.drawConfig.line.color,this.drawConfig.line.lineWidth),this.drawConfig.drawHandlePoints&&t.a.attr.selectable||(t.a.attr.renderTime=e),this.drawConfig.drawHandlePoints&&t.b.attr.selectable||(t.b.attr.renderTime=e)):t instanceof h?(s.arrow(t.a,t.b,this.drawConfig.vector.color,this.drawConfig.vector.lineWidth),this.drawConfig.drawHandlePoints&&t.b.attr.selectable&&t.b.attr.visible?(s.setCurrentId(`${t.uid}_h0`),s.setCurrentClassName(`${t.className}-handle`),s.circleHandle(t.b,3,"#a8a8a8")):t.b.attr.renderTime=e,this.drawConfig.drawHandlePoints&&t.a.attr.selectable||(t.a.attr.renderTime=e),this.drawConfig.drawHandlePoints&&t.b.attr.selectable||(t.b.attr.renderTime=e)):t instanceof _?(this.drawConfig.drawHandleLines&&(s.setCurrentId(`${t.uid}_l0`),s.setCurrentClassName(`${t.className}-line`),s.line(t.upperLeft,t.lowerRight,this.drawConfig.image.color,this.drawConfig.image.lineWidth)),n.setCurrentId(t.uid),n.image(t.image,t.upperLeft,t.lowerRight.clone().sub(t.upperLeft)),this.drawConfig.drawHandlePoints&&(s.setCurrentId(`${t.uid}_h0`),s.setCurrentClassName(`${t.className}-lower-right`),s.circleHandle(t.lowerRight,3,this.drawConfig.image.color),t.lowerRight.attr.renderTime=e)):t instanceof S?(n.setCurrentId(t.uid),n.text(t.text,t.anchor.x,t.anchor.y,t),this.drawConfig.text.anchor&&(s.setCurrentId(`${t.uid}_a0`),s.setCurrentClassName(`${t.className}-anchor`),(this.drawConfig.text.fill?n:s).point(t.anchor,this.drawConfig.text.color)),t.anchor.attr.renderTime=e):console.error("Cannot draw object. Unknown class.");s.setCurrentClassName(null),s.setCurrentId(null),n.setCurrentClassName(null),n.setCurrentId(null)}drawSelectPolygon(t){null!=this.selectPolygon&&this.selectPolygon.vertices.length>0&&(t.setCurrentId(this.selectPolygon.uid),t.polygon(this.selectPolygon,"#888888"),t.crosshair(this.selectPolygon.vertices[0],3,"#008888"))}drawVertices(t,e){for(var s in this.vertices)this.drawConfig.drawVertices&&this.vertices[s].attr.renderTime!=t&&this.vertices[s].attr.visible&&(e.setCurrentId(this.vertices[s].uid),e.squareHandle(this.vertices[s],5,this._handleColor(this.vertices[s],"rgb(0,128,192)")),this.vertices[s].attr.renderTime=t)}redraw(){const t=this.renderTime++;this.draw.beginDrawCycle(t),this.fill.beginDrawCycle(t),this.config.preClear&&this.config.preClear(),this.clear(),this.config.preDraw&&this.config.preDraw(this.draw,this.fill),this.drawAll(t,this.draw,this.fill),this.config.postDraw&&this.config.postDraw(this.draw,this.fill),this.draw.endDrawCycle(t),this.fill.endDrawCycle(t)}drawAll(t,e,s){this.config.drawRaster&&this.drawGrid(e),this.config.drawOrigin&&this.drawOrigin(e),this.drawDrawables(t,e,s),this.drawVertices(t,e),this.drawSelectPolygon(e),e.setCurrentId(null),e.setCurrentClassName(null)}clear(){this.draw.clear(this.config.backgroundColor||"white")}clearSelection(t){for(var e in this.vertices)this.vertices[e].attr.isSelected=!1;return t&&this.redraw(),this}viewport(){var t,e;return new d(this.transformMousePosition(0,0),this.transformMousePosition(this.canvasSize.width*(null!==(t=this.config.cssScaleX)&&void 0!==t?t:1),this.canvasSize.height*(null!==(e=this.config.cssScaleY)&&void 0!==e?e:1)))}saveFile(){this.hooks.saveFile(this)}getFProp(t,e){return parseFloat(globalThis.getComputedStyle(t,null).getPropertyValue(e))}getAvailableContainerSpace(){const t=this.canvas.parentNode;this.canvas.style.display="none";var e=this.getFProp(t,"padding")||0,s=this.getFProp(this.canvas,"border-width")||0,i=this.getFProp(t,"padding-left")||e,r=this.getFProp(t,"padding-right")||e,n=this.getFProp(t,"padding-top")||e,o=this.getFProp(t,"padding-bottom")||e,a=this.getFProp(this.canvas,"border-left-width")||s,h=this.getFProp(this.canvas,"border-right-width")||s,l=this.getFProp(this.canvas,"border-top-width")||s,c=this.getFProp(this.canvas,"border-bottom-width")||s,d=t.clientWidth,u=t.clientHeight;return this.canvas.style.display="block",{width:d-i-r-a-h,height:u-n-o-l-c}}resizeCanvas(){var t,e,s,i,r,n;const o=this,a=(t,e)=>{var s,i;t*=null!==(s=o.config.canvasWidthFactor)&&void 0!==s?s:1,e*=null!==(i=o.config.canvasHeightFactor)&&void 0!==i?i:1,o.canvasSize.width=t,o.canvasSize.height=e,o.canvas instanceof HTMLCanvasElement?(o.canvas.width=t,o.canvas.height=e):o.canvas instanceof SVGElement?(this.canvas.setAttribute("viewBox",`0 0 ${t} ${e}`),this.canvas.setAttribute("width",`${t}`),this.canvas.setAttribute("height",`${e}`),this.draw.setSize(o.canvasSize),this.eventCatcher.style.width=`${t}px`,this.eventCatcher.style.height=`${e}px`):console.error("Error: cannot resize canvas element because it seems neither be a HTMLCanvasElement nor an SVGElement."),o.config.autoAdjustOffset&&o.adjustOffset(!1)};if(o.config.fullSize&&!o.config.fitToParent){var h=globalThis.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,l=globalThis.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;o.canvas.style.position="absolute",o.canvas.style.width=(null!==(t=o.config.canvasWidthFactor)&&void 0!==t?t:1)*h+"px",o.canvas.style.height=(null!==(e=o.config.canvasWidthFactor)&&void 0!==e?e:1)*l+"px",o.canvas.style.top="0px",o.canvas.style.left="0px",a(h,l)}else if(o.config.fitToParent){o.canvas.style.position="static";const t=this.getAvailableContainerSpace();o.canvas.style.width=(null!==(s=o.config.canvasWidthFactor)&&void 0!==s?s:1)*t.width+"px",o.canvas.style.height=(null!==(i=o.config.canvasHeightFactor)&&void 0!==i?i:1)*t.height+"px",o.canvas.style.top="",o.canvas.style.left="",a(t.width,t.height)}else o.canvas.style.width="",o.canvas.style.height="",a(null!==(r=o.config.defaultCanvasWidth)&&void 0!==r?r:1024,null!==(n=o.config.defaultCanvasHeight)&&void 0!==n?n:768);o.config.redrawOnResize&&o.redraw()}selectVerticesInPolygon(t){for(var e in this.vertices)this.vertices[e].attr.selectable&&t.containsVert(this.vertices[e])&&(this.vertices[e].attr.isSelected=!0)}locatePointNear(t,e){const s=this;void 0===e&&(e=7),e/=s.draw.scale.x;for(var i=0;i<s.vertices.length;i++){var r=s.vertices[i];if((r.attr.draggable||r.attr.selectable)&&r.distance(t)<e)return new B.Draggable(r,B.Draggable.VERTEX).setVIndex(i)}return null}handleClick(t){const e=this;var s=this.locatePointNear(e.transformMousePosition(t.params.pos.x,t.params.pos.y),B.DEFAULT_CLICK_TOLERANCE/Math.min(e.config.cssScaleX||1,e.config.cssScaleY||1));if(s)if(e.vertices[s.vindex].listeners.fireClickEvent(t),this.keyHandler&&this.keyHandler.isDown("shift")){if("bpath"==s.typeName){let t=e.paths[s.pindex].bezierCurves[s.cindex].getPointByID(s.pid);t.attr.selectable&&(t.attr.isSelected=!t.attr.isSelected)}else if("vertex"==s.typeName){let t=e.vertices[s.vindex];t.attr.selectable&&(t.attr.isSelected=!t.attr.isSelected)}e.redraw()}else this.keyHandler&&this.keyHandler.isDown("y")&&(e.vertices[s.vindex].attr.bezierAutoAdjust=!e.vertices[s.vindex].attr.bezierAutoAdjust,e.redraw());else if(null!=e.selectPolygon){const s=e.transformMousePosition(t.params.pos.x,t.params.pos.y);e.selectPolygon.vertices.push(new o(s.x,s.y)),e.redraw()}}transformMousePosition(t,e){return{x:(t/this.config.cssScaleX-this.config.offsetX)/this.config.scaleX,y:(e/this.config.cssScaleY-this.config.offsetY)/this.config.scaleY}}revertMousePosition(t,e){return{x:t/this.config.cssScaleX+this.config.offsetX,y:e/this.config.cssScaleY+this.config.offsetY}}getDraggedElementCount(){return this.draggedElements.length}mouseDownHandler(t){const e=this;if(0==t.button){var s=e.locatePointNear(e.transformMousePosition(t.params.pos.x,t.params.pos.y),B.DEFAULT_CLICK_TOLERANCE/Math.min(e.config.cssScaleX,e.config.cssScaleY));if(s){if("vertex"==s.typeName&&e.vertices[s.vindex].attr.isSelected)for(var i=0;i<e.vertices.length;i++)e.vertices[i].attr.isSelected&&(e.draggedElements.push(new B.Draggable(e.vertices[i],B.Draggable.VERTEX).setVIndex(i)),e.vertices[i].listeners.fireDragStartEvent(t));else{if(!e.vertices[s.vindex].attr.draggable)return;e.draggedElements.push(s),"bpath"==s.typeName?e.paths[s.pindex].bezierCurves[s.cindex].getPointByID(s.pid).listeners.fireDragStartEvent(t):"vertex"==s.typeName&&e.vertices[s.vindex].listeners.fireDragStartEvent(t)}e.redraw()}}}mouseDragHandler(t){const e=this,s={x:t.params.dragAmount.x,y:t.params.dragAmount.y};if(t.params.dragAmount.x/=e.config.cssScaleX,t.params.dragAmount.y/=e.config.cssScaleY,this.isInPanningMode){if(!this.config.enablePan)return;e.setOffset(e.draw.offset.clone().add(t.params.dragAmount)),e.redraw()}else for(var i in t.params.dragAmount.x/=e.draw.scale.x,t.params.dragAmount.y/=e.draw.scale.y,e.draggedElements){var r=e.draggedElements[i];if("bpath"==r.typeName)e.paths[r.pindex].moveCurvePoint(r.cindex,r.pid,new o(t.params.dragAmount.x,t.params.dragAmount.y)),e.paths[r.pindex].bezierCurves[r.cindex].getPointByID(r.pid).listeners.fireDragEvent(t);else if("vertex"==r.typeName){if(!e.vertices[r.vindex].attr.draggable)continue;e.vertices[r.vindex].add(t.params.dragAmount),e.vertices[r.vindex].listeners.fireDragEvent(t)}}t.params.dragAmount.x=s.x,t.params.dragAmount.y=s.y,e.redraw()}mouseUpHandler(t){const e=this;if(0==t.button){for(var s in t.params.wasDragged||e.handleClick(t),e.draggedElements){var i=e.draggedElements[s];"bpath"==i.typeName?e.paths[i.pindex].bezierCurves[i.cindex].getPointByID(i.pid).listeners.fireDragEndEvent(t):"vertex"==i.typeName&&e.vertices[i.vindex].listeners.fireDragEndEvent(t)}e.draggedElements=[],e.redraw()}}mouseWheelHandler(t){if(!this.config.enableZoom)return;var e=1.25;const s=this,i=t;i.deltaY<0?s.setZoom(s.config.scaleX*e,s.config.scaleY*e,new o(t.params.pos.x,t.params.pos.y)):i.deltaY>0&&s.setZoom(s.config.scaleX/e,s.config.scaleY/e,new o(t.params.pos.x,t.params.pos.y)),t.preventDefault(),s.redraw()}adjustOffset(t){this.draw.offset.x=this.fill.offset.x=this.config.offsetX=this.canvasSize.width*(this.config.offsetAdjustXPercent/100),this.draw.offset.y=this.fill.offset.y=this.config.offsetY=this.canvasSize.height*(this.config.offsetAdjustYPercent/100),t&&this.redraw()}setOffset(t){this.draw.offset.set(t),this.fill.offset.set(t),this.config.offsetX=t.x,this.config.offsetY=t.y}setZoom(t,e,s){let i=this.transformMousePosition(s.x,s.y);this.draw.scale.x=this.fill.scale.x=this.config.scaleX=Math.max(t,.01),this.draw.scale.y=this.fill.scale.y=this.config.scaleY=Math.max(e,.01);let r=this.transformMousePosition(s.x,s.y),n=this.draw.offset.x+(r.x-i.x)*this.draw.scale.x,o=this.draw.offset.y+(r.y-i.y)*this.draw.scale.y;this.setOffset({x:n,y:o})}installInputListeners(){var t=this;if(this.config.enableMouse?new A(this.eventCatcher?this.eventCatcher:this.canvas).down(e=>{t.mouseDownHandler(e)}).drag(e=>{t.mouseDragHandler(e)}).up(e=>{t.mouseUpHandler(e)}):t.console.log("Mouse interaction disabled."),this.config.enableMouseWheel?new A(this.eventCatcher?this.eventCatcher:this.canvas).wheel(e=>{t.mouseWheelHandler(e)}):t.console.log("Mouse wheel interaction disabled."),this.config.enableTouch){const n=e=>{const s=t.canvas.getBoundingClientRect();return{x:e.x-s.left,y:e.y-s.top}};if("function"==typeof globalThis.AlloyFinger||"function"==typeof globalThis.createAlloyFinger)try{var e=null,s=null,i=null,r=null;const a=()=>{e=null,s=null,i=null,r=null,t.draggedElements=[]},h={touchStart:r=>{if(1==r.touches.length&&(e=new o(n({x:r.touches[0].clientX,y:r.touches[0].clientY})),s=new o(n({x:r.touches[0].clientX,y:r.touches[0].clientY})),(i=t.locatePointNear(t.transformMousePosition(e.x,e.y),B.DEFAULT_TOUCH_TOLERANCE/Math.min(t.config.cssScaleX,t.config.cssScaleY)))&&"vertex"==i.typeName)){var a=t.vertices[i.vindex],h={params:{isTouchEvent:!0,dragAmount:{x:0,y:0},wasDragged:!1,mouseDownPos:s.clone(),mouseDragPos:s.clone(),vertex:a}};t.draggedElements=[i],a.listeners.fireDragStartEvent(h)}},touchMove:r=>{if(1==r.touches.length&&i){if(r.preventDefault(),r.stopPropagation(),!s||!e)return;var a=n({x:r.touches[0].clientX,y:r.touches[0].clientY}),h=t.transformMousePosition(a.x,a.y),l=new o(t.transformMousePosition(e.x,e.y)).difference(h);if("vertex"==i.typeName){if(!t.vertices[i.vindex].attr.draggable)return;t.vertices[i.vindex].add(l);var c=t.vertices[i.vindex],d={isTouchEvent:!0,params:{dragAmount:l.clone(),wasDragged:!0,mouseDownPos:s.clone(),mouseDragPos:s.clone().add(l),vertex:c}};c.listeners.fireDragEvent(d),t.redraw()}e=new o(a)}else if(2==r.touches.length){if(!this.config.enablePan)return;r.preventDefault(),r.stopPropagation(),t.setOffset(t.draw.offset.clone().addXY(r.deltaX,r.deltaY)),t.redraw()}},touchEnd:r=>{if(i&&"vertex"==i.typeName){if(!s)return;var n=t.vertices[i.vindex],o={isTouchEvent:!0,params:{dragAmount:{x:0,y:0},wasDragged:!1,mouseDownPos:s.clone(),mouseDragPos:s.clone(),vertex:n}};e&&s&&s.distance(e)<.001?n.listeners.fireClickEvent(o):n.listeners.fireDragEndEvent(o)}a()},touchCancel:t=>{a()},multipointStart:e=>{r=t.draw.scale.clone()},multipointEnd:t=>{r=null},pinch:e=>{if(!this.config.enableZoom)return;const s=e.touches.item(0),i=e.touches.item(1);if(!(e.touches&&r&&s&&i))return;const n=new o(s.clientX,s.clientY),a=new o(i.clientX,i.clientY),h=new l(n,a).vertAt(.5);t.setZoom(r.x*e.zoom,r.y*e.zoom,h),t.redraw()}};if(window.createAlloyFinger){(0,window.createAlloyFinger)(this.eventCatcher?this.eventCatcher:this.canvas,h)}else new I(this.eventCatcher?this.eventCatcher:this.canvas,h)}catch(t){console.error("Failed to initialize AlloyFinger!"),console.error(t)}else globalThis.Touchy&&"function"==typeof globalThis.Touchy?console.error("[Deprecation] Found Touchy which is not supported any more. Please use AlloyFinger instead."):console.warn("Cannot initialize the touch handler. AlloyFinger is missig. Did you include it?")}else t.console.log("Touch interaction disabled.");this.config.enableKeys?this.keyHandler=new w({trackAll:!0}).down("escape",function(){t.clearSelection(!0)}).down("shift",function(){t.selectPolygon=new c,t.redraw()}).up("shift",function(){null!=t.selectPolygon&&(t.selectVerticesInPolygon(t.selectPolygon),t.selectPolygon=null,t.redraw())}).down("alt",function(){t.isInPanningMode=!0}).up("alt",function(){t.isInPanningMode=!1}).down("spacebar",function(){t.isInPanningMode=!0}).up("spacebar",function(){t.isInPanningMode=!1}):t.console.log("Keyboard interaction disabled.")}createGUI(t){const e=globalThis.utils;if(e&&"function"==typeof e.createGUI)return this._gui=e.createGUI(this,t);throw"Cannot create dat.GUI or lil-gui instance; did you load the ./utils/creategui helper function an the dat.GUI/lil-gui library?"}getGUI(){return this._gui}}B.DEFAULT_CANVAS_WIDTH=1024,B.DEFAULT_CANVAS_HEIGHT=768,B.DEFAULT_CLICK_TOLERANCE=8,B.DEFAULT_TOUCH_TOLERANCE=32,B.Draggable=(z(k=class{constructor(t,e){this.item=t,this.typeName=e}isVertex(){return this.typeName==B.Draggable.VERTEX}setVIndex(t){return this.vindex=t,this}},"Draggable"),k.VERTEX="vertex",k),B.utils={safeMergeByKeys:(t,e)=>{for(var s in e)if(e.hasOwnProperty(s))if(t.hasOwnProperty(s)){const i=typeof t[s],r=e[s];try{t[s]="boolean"==i?"string"==typeof r?Boolean(!!JSON.parse(r)):r:"number"==i&&"string"==typeof r?Number(1*JSON.parse(r)):e[s]}catch(t){console.error("error in key ",s,r,t)}}else t[s]=e[s];return t},setCSSscale:(t,e,s)=>{t.style.transformOrigin="0 0",1==e&&1==s?t.style.removeProperty("transform"):t.style.transform="scale("+e+","+s+")"},fetch:{val:(t,e,s)=>t.hasOwnProperty(e)?void 0===t[e]?s:t[e]:s,num:(t,e,s)=>{if(!t.hasOwnProperty(e))return s;if("number"==typeof t[e])return t[e];try{return 1*JSON.parse(t[e])}catch(t){return s}},bool:(t,e,s)=>{if(!t.hasOwnProperty(e))return s;if("boolean"==typeof t[e])return t[e];try{return!!JSON.parse(t[e])}catch(t){return s}},func:(t,e,s)=>t.hasOwnProperty(e)?"function"!=typeof t[e]?s:t[e]:s},enableBezierPathAutoAdjust:t=>{for(var e=0;e<t.bezierCurves.length;e++)t.bezierCurves[e].startPoint.listeners.addDragListener(function(e){var s=t.locateCurveByStartPoint(e.params.vertex);t.bezierCurves[s].startPoint.addXY(-e.params.dragAmount.x,-e.params.dragAmount.y),t.moveCurvePoint(1*s,t.START_POINT,e.params.dragAmount),t.updateArcLengths()}),t.bezierCurves[e].startControlPoint.listeners.addDragListener(function(e){var s=t.locateCurveByStartControlPoint(e.params.vertex);t.bezierCurves[s].startPoint.attr.bezierAutoAdjust&&(t.adjustPredecessorControlPoint(1*s,!0,!1),t.updateArcLengths())}),t.bezierCurves[e].endControlPoint.listeners.addDragListener(function(e){var s=t.locateCurveByEndControlPoint(e.params.vertex);t.bezierCurves[s%t.bezierCurves.length].endPoint.attr.bezierAutoAdjust&&(t.adjustSuccessorControlPoint(1*s,!0,!1),t.updateArcLengths())}),e+1==t.bezierCurves.length&&t.bezierCurves[t.bezierCurves.length-1].endPoint.listeners.addDragListener(function(e){if(!t.adjustCircular){var s=t.locateCurveByEndPoint(e.params.vertex);t.moveCurvePoint(1*s,t.END_CONTROL_POINT,new o({x:e.params.dragAmount.x,y:e.params.dragAmount.y}))}t.updateArcLengths()})}};const R={ngon:(t,e)=>{const s=new o(0,0),i=[];for(var r=0;r<t;r++){var n=new o(e,0);n.rotate(2*Math.PI/t*r,s),i.push(n)}return new c(i)},nstar:(t,e,s)=>{const i=new o(0,0),r=[];for(var n=0;n<t;n++){var a=new o(n%2==0?e:s,0);a.rotate(2*Math.PI/t*n,i),r.push(a)}return new c(r)}};class G{constructor(t,e,s){this.x=t,this.y=e,this.z=s}dot2(t,e){return this.x*t+this.y*e}dot3(t,e,s){return this.x*t+this.y*e+this.z*s}}const V=[new G(1,1,0),new G(-1,1,0),new G(1,-1,0),new G(-1,-1,0),new G(1,0,1),new G(-1,0,1),new G(1,0,-1),new G(-1,0,-1),new G(0,1,1),new G(0,-1,1),new G(0,1,-1),new G(0,-1,-1)],O=[151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180],H=.5*(Math.sqrt(3)-1),F=(3-Math.sqrt(3))/6,$=1/3,W=1/6,q=t=>t*t*t*(t*(6*t-15)+10),j=(t,e,s)=>(1-s)*t+s*e;const U={mkCircularRingSector:(t,e,s,r,o)=>{const a=i.circleUtils.vertAt(r,e).add(t),h=i.circleUtils.vertAt(o,e).add(t),l=i.circleUtils.vertAt(r,s).add(t),c=i.circleUtils.vertAt(o,s).add(t),d=["M",a.x,a.y],u=n.mapAngleTo2PI(n.mapAngleTo2PI(r)-n.mapAngleTo2PI(o))>=Math.PI,g=u?0:1,f=u?0:1;return d.push("A",e,e,0,g,1,h.x,h.y),d.push("L",c.x,c.y),d.push("A",s,s,0,f,0,l.x,l.y),d.push("Z"),d}};class Y{constructor(){this.r=this.g=this.b=0,this.h=this.s=this.l=0,this.a=1}cssRGB(){return"rgb("+Math.round(255*this.r)+","+Math.round(255*this.g)+","+Math.round(255*this.b)+")"}cssRGBA(){return`rgba(${Math.round(255*this.r)},${Math.round(255*this.g)},${Math.round(255*this.b)},${this.a})`}red(){return this.r}green(){return this.g}blue(){return this.b}set(t){return this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a,this.h=t.h,this.s=t.s,this.l=t.l,this}setRed(t){return this.r=t,this}setBlue(t){return this.b=t,Y.Converter.RGBToHSL(this),this}setAlpha(t){return this.a=t,Y.Converter.RGBToHSL(this),this}setGreen(t){return this.g=t,Y.Converter.RGBToHSL(this),this}setHue(t){return this.h=t,Y.Converter.HSLToRGB(this),this}setSaturation(t){return this.s=t,Y.Converter.HSLToRGB(this),this}setLuminance(t){return this.l=t,Y.Converter.HSLToRGB(this),this}cssHSL(){return"hsl("+Math.round(360*this.h)+","+Math.round(100*this.s)+"%,"+Math.round(100*this.l)+"%)"}cssHSLA(){return"hsla("+Math.round(360*this.h)+","+Math.round(100*this.s)+"%,"+Math.round(100*this.l)+"%,"+Math.round(this.a)+")"}hue(){return this.h}saturation(){return this.s}lightness(){return this.l}cssHEX(){return"#"+(255*this.r<16?"0":"")+Math.round(255*this.r).toString(16)+(255*this.g<16?"0":"")+Math.round(255*this.g).toString(16)+(255*this.b<16?"0":"")+Math.round(255*this.b).toString(16)}alpha(){return this.a}saturate(t){if("string"==typeof t&&t.indexOf("%")>-1&&!Number.isNaN(t=parseInt(t)))this.s+=(1-this.s)*(t/100);else{if("number"!=typeof t)throw new Error("error: bad modifier format (percent or number)");this.s+=t>=-0&&t<=1?(1-this.s)*t:(1-this.s)*(t/255)}return this.s>1?this.s=1:this.s<0&&(this.s=0),Y.Converter.HSLToRGB(this),this}desaturate(t){if("string"==typeof t&&t.indexOf("%")>-1&&!Number.isNaN(t=parseInt(t)))this.s-=t/100;else{if("number"!=typeof t)throw new Error("error: bad modifier format (percent or number)");this.s-=t>=0&&t<=1?this.s*t:this.s*(t/255)}return this.s>1?this.s=1:this.s<0&&(this.s=0),Y.Converter.HSLToRGB(this),this}lighten(t){if("string"==typeof t&&t.indexOf("%")>-1&&!Number.isNaN(t=parseInt(t)))this.l+=(1-this.l)*(t/100);else{if("number"!=typeof t)throw new Error("error: bad modifier format (percent or number)");this.l+=t>=0&&t<=1?(1-this.l)*t:(1-this.l)*(t/255)}return this.l>1?this.l=1:this.l<0&&(this.l=0),Y.Converter.HSLToRGB(this),this}darken(t){if("string"==typeof t&&t.indexOf("%")>-1&&!Number.isNaN(t=parseInt(t)))this.l-=this.l*(t/100);else{if("number"!=typeof t)throw new Error("error: bad modifier format (percent or number)");this.l-=t>=0&&t<=1?this.l*t:this.l*(t/255)}return this.l>1?this.l=1:this.l<0&&(this.l=0),Y.Converter.HSLToRGB(this),this}fadein(t){if("string"==typeof t&&t.indexOf("%")>-1&&!Number.isNaN(t=parseInt(t)))this.a+=(1-this.a)*(t/100);else{if("number"!=typeof t)throw new Error("error: bad modifier format (percent or number)");this.a+=t>=0&&t<=1?(1-this.a)*t:(1-this.a)*(t/255)}return console.log("New alpha",this.a),this.a>1?this.a=1:this.a<0&&(this.a=0),Y.Converter.HSLToRGB(this),this}fadeout(t){if("string"==typeof t&&t.indexOf("%")>-1&&!Number.isNaN(t=parseInt(t)))this.a-=t/100;else{if("number"!=typeof t)throw new Error("error: bad modifier format (percent or number)");this.a-=t>=0&&t<=1?t:t/255}return this.a>1?this.a=1:this.a<0&&(this.a=0),Y.Converter.HSLToRGB(this),this}spin(t){if("string"==typeof t&&t.indexOf("%")>-1&&!Number.isNaN(t=parseInt(t)))this.h+=t/100;else{if("number"!=typeof t)throw new Error("error: bad modifier format (percent or number)");this.h+=t/360}return this.h>1?this.h=1:this.h<0&&(this.h=0),Y.Converter.HSLToRGB(this),this}static makeRGB(...t){const e=new Y;let s;if(t.length<3||t.length>4)throw new Error("error: 3 or 4 arguments");return s=Y.Sanitizer.RGB(t[0],t[1],t[2]),e.r=s[0],e.g=s[1],e.b=s[2],4==t.length?e.a=t[3]:e.a=1,Y.Converter.RGBToHSL(e),e}static makeHSL(...t){const e=new Y;let s;if(t.length<3||t.length>4)throw new Error("error: 3 or 4 arguments");return s=Y.Sanitizer.HSL(t[0],t[1],t[2]),e.h=s[0],e.s=s[1],e.l=s[2],4==t.length?e.a="string"==typeof t[3]?Number.parseFloat(t[3]):t[3]:e.a=1,Y.Converter.HSLToRGB(e),e}static makeHEX(t){var e,s=new Y;if(t&&t.startsWith("#")&&(t=t.substr(1)),Y.Validator.checkHEX(t),3==t.length)e=Y.Sanitizer.RGB(parseInt(t.substr(0,1)+t.substr(0,1),16),parseInt(t.substr(1,1)+t.substr(1,1),16),parseInt(t.substr(2,1)+t.substr(2,1),16));else{if(6!=t.length)throw new Error("error: 3 or 6 arguments");e=Y.Sanitizer.RGB(parseInt(t.substr(0,2),16),parseInt(t.substr(2,2),16),parseInt(t.substr(4,2),16))}return s.r=e[0],s.g=e[1],s.b=e[2],s.a=1,Y.Converter.RGBToHSL(s),s}static parse(t){if(void 0===t)return null;if(0==(t=t.trim().toLowerCase()).length)return null;if(t.startsWith("#"))return Y.makeHEX(t.substring(1,t.length));if(t.startsWith("rgb")){var e=t.match(/^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,?\s*(\d*(?:\.\d+\s*)?)\)$/);if(!e)throw"Unrecognized color format (2): "+t;return e.length<=4||void 0===e[4]||""==e[4]?Y.makeRGB(e[1],e[2],e[3]):Y.makeRGB(e[1],e[2],e[3],Number(e[4]))}const s=Object.keys(Y.CSS_COLORS).reduce((e,s)=>s&&s.toLowerCase()===t.toLowerCase()?s:e,null);if(s){const t=Y.CSS_COLORS[s];if(t)return t.clone()}throw"Unrecognized color format (1): "+t}clone(){const t=new Y;return t.r=this.r,t.g=this.g,t.b=this.b,t.a=this.a,t.h=this.h,t.s=this.s,t.l=this.l,t}interpolate(t,e){return this.r+=(t.r-this.r)*e,this.g+=(t.g-this.g)*e,this.b+=(t.b-this.b)*e,this.a+=(t.a-this.a)*e,this}}Y.Sanitizer={RGB:(...t)=>{var e=[];if(0==t.length)return[];for(var s=0;s<t.length;s++){var i=t[s];if("string"==typeof i&&i.indexOf("%")>-1){if(Number.isNaN(i=parseInt(i)))throw new Error("Bad format");if(i<0||i>100)throw new Error("Bad format");e[s]=i/100}else{if("string"==typeof i&&Number.isNaN(i=parseInt(i)))throw new Error("Bad format");if(i<0)throw new Error("Bad format");if(i>=0&&i<=1)e[s]=i;else{if(!(i>=0&&i<256))throw new Error("Bad format ("+i+")");e[s]=i/255}}}return e},HSL:function(...t){if(t.length<3||t.length>4)throw new Error("3 or 4 arguments required");var e=t[0],s=t[1],i=t[2];if("string"==typeof e&&Number.isNaN(e=parseFloat(e)))throw new Error("Bad format for hue");if(e<0||e>360)throw new Error("Hue out of range (0..360)");if(((""+e).indexOf(".")>-1&&e>1||-1==(""+e).indexOf("."))&&(e/=360),"string"==typeof s&&s.indexOf("%")>-1){if(Number.isNaN(s=parseInt(s)))throw new Error("Bad format for saturation");if(s<0||s>100)throw new Error("Bad format for saturation");s/=100}else if((s="string"==typeof s?Number.parseFloat(s):s)<0||s>1)throw new Error("Bad format for saturation");if("string"==typeof i&&i.indexOf("%")>-1){if(Number.isNaN(i=parseInt(i)))throw new Error("Bad format for lightness");if(i<0||i>100)throw new Error("Bad format for lightness");i/=100}else if((i="string"==typeof i?Number.parseFloat(i):i)<0||i>1)throw new Error("Bad format for lightness");return[e,s,i]}},Y.Validator={checkHEX:t=>{if(6!=t.length&&3!=t.length)throw new Error("Hexa color: bad length ("+t.length+"),"+t);t=t.toLowerCase();for(var e=0;e<t.length;e++){var s=t.charCodeAt(e);if(!(s>=48&&s<=57||s>=97&&s<=102))throw new Error(`Hexa color: out of range for "${t}" at position ${e}.`)}}},Y.Converter={RGBToHSL:t=>{var e=t.r,s=t.g,i=t.b,r=Math.max(e,s,i),n=Math.min(e,s,i);if(t.l=(r+n)/2,r==n)t.h=t.s=0;else{var o=r-n;switch(t.s=t.l>.5?o/(2-r-n):o/(r+n),r){case e:t.h=(s-i)/o+(s<i?6:0);break;case s:t.h=(i-e)/o+2;break;case i:t.h=(e-s)/o+4}t.h/=6}},HSLToRGB:t=>{var e=t.h,s=t.s,i=t.l;if(0==s)t.r=t.g=t.b=i;else{var r=i<.5?i*(1+s):i+s-i*s,n=2*i-r;t.r=Y.Converter.hue2rgb(n,r,e+1/3),t.g=Y.Converter.hue2rgb(n,r,e),t.b=Y.Converter.hue2rgb(n,r,e-1/3)}},hue2rgb:(t,e,s)=>(s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+(e-t)*(2/3-s)*6:t)},Y.MediumVioletRed=Y.makeRGB(199,21,133),Y.DeepPink=Y.makeRGB(255,20,147),Y.PaleVioletRed=Y.makeRGB(219,112,147),Y.HotPink=Y.makeRGB(255,105,180),Y.LightPink=Y.makeRGB(255,182,193),Y.Pink=Y.makeRGB(255,192,203),Y.DarkRed=Y.makeRGB(139,0,0),Y.Red=Y.makeRGB(255,0,0),Y.Firebrick=Y.makeRGB(178,34,34),Y.Crimson=Y.makeRGB(220,20,60),Y.IndianRed=Y.makeRGB(205,92,92),Y.LightCoral=Y.makeRGB(240,128,128),Y.Salmon=Y.makeRGB(250,128,114),Y.DarkSalmon=Y.makeRGB(233,150,122),Y.LightSalmon=Y.makeRGB(255,160,122),Y.OrangeRed=Y.makeRGB(255,69,0),Y.Tomato=Y.makeRGB(255,99,71),Y.DarkOrange=Y.makeRGB(255,140,0),Y.Coral=Y.makeRGB(255,127,80),Y.Orange=Y.makeRGB(255,165,0),Y.DarkKhaki=Y.makeRGB(189,183,107),Y.Gold=Y.makeRGB(255,215,0),Y.Khaki=Y.makeRGB(240,230,140),Y.PeachPuff=Y.makeRGB(255,218,185),Y.Yellow=Y.makeRGB(255,255,0),Y.PaleGoldenrod=Y.makeRGB(238,232,170),Y.Moccasin=Y.makeRGB(255,228,181),Y.PapayaWhip=Y.makeRGB(255,239,213),Y.LightGoldenrodYellow=Y.makeRGB(250,250,210),Y.LemonChiffon=Y.makeRGB(255,250,205),Y.LightYellow=Y.makeRGB(255,255,224),Y.Maroon=Y.makeRGB(128,0,0),Y.Brown=Y.makeRGB(165,42,42),Y.SaddleBrown=Y.makeRGB(139,69,19),Y.Sienna=Y.makeRGB(160,82,45),Y.Chocolate=Y.makeRGB(210,105,30),Y.DarkGoldenrod=Y.makeRGB(184,134,11),Y.Peru=Y.makeRGB(205,133,63),Y.RosyBrown=Y.makeRGB(188,143,143),Y.Goldenrod=Y.makeRGB(218,165,32),Y.SandyBrown=Y.makeRGB(244,164,96),Y.Tan=Y.makeRGB(210,180,140),Y.Burlywood=Y.makeRGB(222,184,135),Y.Wheat=Y.makeRGB(245,222,179),Y.NavajoWhite=Y.makeRGB(255,222,173),Y.Bisque=Y.makeRGB(255,228,196),Y.BlanchedAlmond=Y.makeRGB(255,235,205),Y.Cornsilk=Y.makeRGB(255,248,220),Y.Indigo=Y.makeRGB(75,0,130),Y.Purple=Y.makeRGB(128,0,128),Y.DarkMagenta=Y.makeRGB(139,0,139),Y.DarkViolet=Y.makeRGB(148,0,211),Y.DarkSlateBlue=Y.makeRGB(72,61,139),Y.BlueViolet=Y.makeRGB(138,43,226),Y.DarkOrchid=Y.makeRGB(153,50,204),Y.Fuchsia=Y.makeRGB(255,0,255),Y.Magenta=Y.makeRGB(255,0,255),Y.SlateBlue=Y.makeRGB(106,90,205),Y.MediumSlateBlue=Y.makeRGB(123,104,238),Y.MediumOrchid=Y.makeRGB(186,85,211),Y.MediumPurple=Y.makeRGB(147,112,219),Y.Orchid=Y.makeRGB(218,112,214),Y.Violet=Y.makeRGB(238,130,238),Y.Plum=Y.makeRGB(221,160,221),Y.Thistle=Y.makeRGB(216,191,216),Y.Lavender=Y.makeRGB(230,230,250),Y.MidnightBlue=Y.makeRGB(25,25,112),Y.Navy=Y.makeRGB(0,0,128),Y.DarkBlue=Y.makeRGB(0,0,139),Y.MediumBlue=Y.makeRGB(0,0,205),Y.Blue=Y.makeRGB(0,0,255),Y.RoyalBlue=Y.makeRGB(65,105,225),Y.SteelBlue=Y.makeRGB(70,130,180),Y.DodgerBlue=Y.makeRGB(30,144,255),Y.DeepSkyBlue=Y.makeRGB(0,191,255),Y.CornflowerBlue=Y.makeRGB(100,149,237),Y.SkyBlue=Y.makeRGB(135,206,235),Y.LightSkyBlue=Y.makeRGB(135,206,250),Y.LightSteelBlue=Y.makeRGB(176,196,222),Y.LightBlue=Y.makeRGB(173,216,230),Y.PowderBlue=Y.makeRGB(176,224,230),Y.Teal=Y.makeRGB(0,128,128),Y.DarkCyan=Y.makeRGB(0,139,139),Y.LightSeaGreen=Y.makeRGB(32,178,170),Y.CadetBlue=Y.makeRGB(95,158,160),Y.DarkTurquoise=Y.makeRGB(0,206,209),Y.MediumTurquoise=Y.makeRGB(72,209,204),Y.Turquoise=Y.makeRGB(64,224,208),Y.Aqua=Y.makeRGB(0,255,255),Y.Cyan=Y.makeRGB(0,255,255),Y.Aquamarine=Y.makeRGB(127,255,212),Y.PaleTurquoise=Y.makeRGB(175,238,238),Y.LightCyan=Y.makeRGB(224,255,255),Y.DarkGreen=Y.makeRGB(0,100,0),Y.Green=Y.makeRGB(0,128,0),Y.DarkOliveGreen=Y.makeRGB(85,107,47),Y.ForestGreen=Y.makeRGB(34,139,34),Y.SeaGreen=Y.makeRGB(46,139,87),Y.Olive=Y.makeRGB(128,128,0),Y.OliveDrab=Y.makeRGB(107,142,35),Y.MediumSeaGreen=Y.makeRGB(60,179,113),Y.LimeGreen=Y.makeRGB(50,205,50),Y.Lime=Y.makeRGB(0,255,0),Y.SpringGreen=Y.makeRGB(0,255,127),Y.MediumSpringGreen=Y.makeRGB(0,250,154),Y.DarkSeaGreen=Y.makeRGB(143,188,143),Y.MediumAquamarine=Y.makeRGB(102,205,170),Y.YellowGreen=Y.makeRGB(154,205,50),Y.LawnGreen=Y.makeRGB(124,252,0),Y.Chartreuse=Y.makeRGB(127,255,0),Y.LightGreen=Y.makeRGB(144,238,144),Y.GreenYellow=Y.makeRGB(173,255,47),Y.PaleGreen=Y.makeRGB(152,251,152),Y.MistyRose=Y.makeRGB(255,228,225),Y.AntiqueWhite=Y.makeRGB(250,235,215),Y.Linen=Y.makeRGB(250,240,230),Y.Beige=Y.makeRGB(245,245,220),Y.WhiteSmoke=Y.makeRGB(245,245,245),Y.LavenderBlush=Y.makeRGB(255,240,245),Y.OldLace=Y.makeRGB(253,245,230),Y.AliceBlue=Y.makeRGB(240,248,255),Y.Seashell=Y.makeRGB(255,245,238),Y.GhostWhite=Y.makeRGB(248,248,255),Y.Honeydew=Y.makeRGB(240,255,240),Y.FloralWhite=Y.makeRGB(255,250,240),Y.Azure=Y.makeRGB(240,255,255),Y.MintCream=Y.makeRGB(245,255,250),Y.Snow=Y.makeRGB(255,250,250),Y.Ivory=Y.makeRGB(255,255,240),Y.White=Y.makeRGB(255,255,255),Y.Black=Y.makeRGB(0,0,0),Y.DarkSlateGray=Y.makeRGB(47,79,79),Y.DimGray=Y.makeRGB(105,105,105),Y.SlateGray=Y.makeRGB(112,128,144),Y.Gray=Y.makeRGB(128,128,128),Y.LightSlateGray=Y.makeRGB(119,136,153),Y.DarkGray=Y.makeRGB(169,169,169),Y.Silver=Y.makeRGB(192,192,192),Y.LightGray=Y.makeRGB(211,211,211),Y.Gainsboro=Y.makeRGB(220,220,220),Y.CSS_COLORS={MediumVioletRed:Y.MediumVioletRed,DeepPink:Y.DeepPink,PaleVioletRed:Y.PaleVioletRed,HotPink:Y.HotPink,LightPink:Y.LightPink,Pink:Y.Pink,DarkRed:Y.DarkRed,Red:Y.Red,Firebrick:Y.Firebrick,Crimson:Y.Crimson,IndianRed:Y.IndianRed,LightCoral:Y.LightCoral,Salmon:Y.Salmon,DarkSalmon:Y.DarkSalmon,LightSalmon:Y.LightSalmon,OrangeRed:Y.OrangeRed,Tomato:Y.Tomato,DarkOrange:Y.DarkOrange,Coral:Y.Coral,Orange:Y.Orange,DarkKhaki:Y.DarkKhaki,Gold:Y.Gold,Khaki:Y.Khaki,PeachPuff:Y.PeachPuff,Yellow:Y.Yellow,PaleGoldenrod:Y.PaleGoldenrod,Moccasin:Y.Moccasin,PapayaWhip:Y.PapayaWhip,LightGoldenrodYellow:Y.LightGoldenrodYellow,LemonChiffon:Y.LemonChiffon,LightYellow:Y.LightYellow,Maroon:Y.Maroon,Brown:Y.Brown,SaddleBrown:Y.SaddleBrown,Sienna:Y.Sienna,Chocolate:Y.Chocolate,DarkGoldenrod:Y.DarkGoldenrod,Peru:Y.Peru,RosyBrown:Y.RosyBrown,Goldenrod:Y.Goldenrod,SandyBrown:Y.SandyBrown,Tan:Y.Tan,Burlywood:Y.Burlywood,Wheat:Y.Wheat,NavajoWhite:Y.NavajoWhite,Bisque:Y.Bisque,BlanchedAlmond:Y.BlanchedAlmond,Cornsilk:Y.Cornsilk,Indigo:Y.Indigo,Purple:Y.Purple,DarkMagenta:Y.DarkMagenta,DarkViolet:Y.DarkViolet,DarkSlateBlue:Y.DarkSlateBlue,BlueViolet:Y.BlueViolet,DarkOrchid:Y.DarkOrchid,Fuchsia:Y.Fuchsia,Magenta:Y.Magenta,SlateBlue:Y.SlateBlue,MediumSlateBlue:Y.MediumSlateBlue,MediumOrchid:Y.MediumOrchid,MediumPurple:Y.MediumPurple,Orchid:Y.Orchid,Violet:Y.Violet,Plum:Y.Plum,Thistle:Y.Thistle,Lavender:Y.Lavender,MidnightBlue:Y.MidnightBlue,Navy:Y.Navy,DarkBlue:Y.DarkBlue,MediumBlue:Y.MediumBlue,Blue:Y.Blue,RoyalBlue:Y.RoyalBlue,SteelBlue:Y.SteelBlue,DodgerBlue:Y.DodgerBlue,DeepSkyBlue:Y.DeepSkyBlue,CornflowerBlue:Y.CornflowerBlue,SkyBlue:Y.SkyBlue,LightSkyBlue:Y.LightSkyBlue,LightSteelBlue:Y.LightSteelBlue,LightBlue:Y.LightBlue,PowderBlue:Y.PowderBlue,Teal:Y.Teal,DarkCyan:Y.DarkCyan,LightSeaGreen:Y.LightSeaGreen,CadetBlue:Y.CadetBlue,DarkTurquoise:Y.DarkTurquoise,MediumTurquoise:Y.MediumTurquoise,Turquoise:Y.Turquoise,Aqua:Y.Aqua,Cyan:Y.Cyan,Aquamarine:Y.Aquamarine,PaleTurquoise:Y.PaleTurquoise,LightCyan:Y.LightCyan,DarkGreen:Y.DarkGreen,Green:Y.Green,DarkOliveGreen:Y.DarkOliveGreen,ForestGreen:Y.ForestGreen,SeaGreen:Y.SeaGreen,Olive:Y.Olive,OliveDrab:Y.OliveDrab,MediumSeaGreen:Y.MediumSeaGreen,LimeGreen:Y.LimeGreen,Lime:Y.Lime,SpringGreen:Y.SpringGreen,MediumSpringGreen:Y.MediumSpringGreen,DarkSeaGreen:Y.DarkSeaGreen,MediumAquamarine:Y.MediumAquamarine,YellowGreen:Y.YellowGreen,LawnGreen:Y.LawnGreen,Chartreuse:Y.Chartreuse,LightGreen:Y.LightGreen,GreenYellow:Y.GreenYellow,PaleGreen:Y.PaleGreen,MistyRose:Y.MistyRose,AntiqueWhite:Y.AntiqueWhite,Linen:Y.Linen,Beige:Y.Beige,WhiteSmoke:Y.WhiteSmoke,LavenderBlush:Y.LavenderBlush,OldLace:Y.OldLace,AliceBlue:Y.AliceBlue,Seashell:Y.Seashell,GhostWhite:Y.GhostWhite,Honeydew:Y.Honeydew,FloralWhite:Y.FloralWhite,Azure:Y.Azure,MintCream:Y.MintCream,Snow:Y.Snow,Ivory:Y.Ivory,White:Y.White,Black:Y.Black,DarkSlateGray:Y.DarkSlateGray,DimGray:Y.DimGray,SlateGray:Y.SlateGray,Gray:Y.Gray,LightSlateGray:Y.LightSlateGray,DarkGray:Y.DarkGray,Silver:Y.Silver,LightGray:Y.LightGray,Gainsboro:Y.Gainsboro};const X=Y.Red,J=Y.Pink,K=Y.Purple,Z=Y.DeepPink,Q=Y.Indigo,tt=Y.Blue,et=Y.LightBlue,st=Y.Cyan,it=Y.Teal,rt=Y.Green,nt=Y.LightGreen,ot=[Y.Red,Y.Pink,Y.Purple,Y.DeepPink,Y.Indigo,Y.Blue,Y.LightBlue,Y.Cyan,Y.Teal,Y.Green,Y.LightGreen],at=t=>{const e=Array(t.length);for(var s=0;s<t.length;s++)e[s]=ot[t[s]%ot.length];return e},ht=at([8,0,6,4,1,9,2,10,3,7,5]),lt=[Y.makeRGB(0,21,6),Y.makeRGB(0,30,12),Y.makeRGB(0,52,28),Y.makeRGB(0,81,47),Y.makeRGB(21,134,88),Y.makeRGB(0,46,19),Y.makeRGB(0,68,40),Y.makeRGB(11,81,55),Y.makeRGB(0,91,46),Y.makeRGB(0,111,46),Y.makeRGB(33,140,106)],ct=(t,e)=>{const s=Array(t);for(var i=0;i<t;i++)s[i]=e;return s};const dt=(t,e,s)=>{const i=Array(t);for(var r=0;r<t;r++)i[r]=ct(e,s);return i};class ut{constructor(t,e){this.start=t,this.end=e,this.intervals=[[t,e]]}clear(){this.intervals=[]}removeAt(t){t<0||t>=this.intervals.length||this.intervals.splice(t,1)}intersect(t,e){for(var s=0;s<this.intervals.length;)t<=e?this.intervals[s][0]>=e||this.intervals[s][1]<=t?this.intervals.splice(s,1):this.intervals[s][0]>=t&&this.intervals[s][1]<=e?s++:this.intervals[s][0]<=t&&this.intervals[s][1]>=e?(this.intervals.splice(s,1,[t,e]),s++):this.intervals[s][0]<=t&&this.intervals[s][1]<e?(this.intervals[s][0]=t,s++):this.intervals[s][0]>t&&this.intervals[s][1]>=e?(this.intervals[s][1]=e,s++):s++:this.intervals[s][0]>=e&&this.intervals[s][1]<=t?this.intervals.splice(s,1):this.intervals[s][0]>=t||this.intervals[s][1]<=e?s++:this.intervals[s][0]>=e&&this.intervals[s][1]>t?(this.intervals.splice(s,1,[t,this.intervals[s][1]]),s++):this.intervals[s][0]<=e&&this.intervals[s][1]<t?(this.intervals.splice(s,1,[this.intervals[s][0],e]),s++):this.intervals[s][0]<=e&&this.intervals[s][1]>=t?(this.intervals.splice(s,1,[this.intervals[s][0],e],[t,this.intervals[s][1]]),s+=2):s++}toString(){return JSON.stringify(this.intervals)}}class gt{static findOuterPartitions(t,e){let s=0;for(var i=0;i<e.length;i++)s=Math.max(s,e[i].intervals.length);const r=dt(e.length,s,!1);for(var n=null,o=[];null!=(n=gt.findOuterPartition(t,e,r));)o.push(n);return o}static findOuterPartitionsAsSectors(t,e){const s=gt.findOuterPartitions(t,e),i=[];for(var r=0;r<s.length;r++){const a=s[r],h=[];for(var n=0;n<a.length;n++){const s=t[a[n].i];var o=e[a[n].i].intervals[a[n].j];h.push(new f(s,o[0],o[1]))}i.push(h)}return i}static buildRadicalLineMatrix(t){for(var e=[],s=0;s<t.length;s++){e[s]||(e[s]=ct(t.length,null));for(var i=0;i<t.length;i++)if(s!=i&&!e[s][i]){e[s][i]=t[s].circleIntersection(t[i]);var r=e[s][i];r&&(e[i]||(e[i]=ct(t.length,null)),e[i][s]=new l(r.b,r.a))}}return e}static findInnerCircles(t){const e=[];for(var s=0;s<t.length;s++)for(var i=0;i<t.length;i++)s!=i&&t[i].containsCircle(t[s])&&e.push(s);return e}static findOuterCircleIntervals(t,e){const s=[];for(var i=0;i<t.length;i++){s[i]=new ut(0,2*Math.PI);for(var r=0;r<t.length;r++)i!=r&&(null!==e[i][r]?gt.handleCircleInterval(t[i],e[i][r],s[i]):t[r].containsCircle(t[i])&&s[i].clear())}return s}static findOuterPartition(t,e,s){let i=gt.randomUnusedInterval(e,s);const r=[];for(;null!=i;)r.push(i),s[i.i][i.j]=!0,i=gt.findAdjacentInterval(t,i,e,s,.001);return 0==r.length?null:r}static radicalLineToInterval(t,e){const s=new l(t.center,e.a),i=new l(t.center,e.b);let r=s.angle(),n=i.angle();return r<0&&(r=2*Math.PI+r),n<0&&(n=2*Math.PI+n),[r,n]}static handleCircleInterval(t,e,s){const i=gt.radicalLineToInterval(t,e);s.intersect(i[1],i[0])}static randomUnusedInterval(t,e){for(var s=0;s<t.length;s++)for(var i=0;i<t[s].intervals.length;i++)if(!e[s][i])return{i:s,j:i};return null}static findAdjacentInterval(t,e,s,i,r){for(var n=s[e.i].intervals[e.j],o=t[e.i].vertAt(n[1]),a=0;a<s.length;a++)for(var h=0;h<s[a].intervals.length;h++)if(!i[a][h]){var l=s[a].intervals[h],c=t[a].vertAt(l[0]);if(o.distance(c)<r)return{i:a,j:h}}return null}}const ft=(t,e)=>{void 0===e&&(e=1e-6);const s=[];for(var i=0;i<t.length;i++)pt(t,t[i],i+1,e)||s.push(t[i]);return s},xt=(t,e,s)=>n.dist4(t.x,t.y,e.x,e.y)<s,pt=(t,e,s,i)=>{for(var r=s;r<t.length;r++)if(xt(t[r],e,i))return!0;return!1};class vt{constructor(t){this.segments=[t]}getSegmentCount(){return this.segments.length}getSegmentAt(t){return this.segments[t]}clone(){const t=new vt(this.segments[this.segments.length-1].clone().reverse());for(var e=this.segments.length-2;e>=0;e--)t.segments.push(this.segments[e].clone().reverse());return t}reverse(){const t=[];for(var e=this.segments.length-1;e>=0;e--)t.push(this.segments[e].reverse());return this.segments=t,this}getStartPoint(){return this.segments[0].getStartPoint()}getEndPoint(){return this.segments[this.segments.length-1].getEndPoint()}getStartTangent(){return this.segments[0].getStartTangent()}getEndTangent(){return this.segments[this.segments.length-1].getEndTangent()}getAllStartEndPoints(){const t=[this.segments[0].getStartPoint()];return this.segments.forEach(e=>{t.push(e.getEndPoint())}),t}}const mt=(t,e)=>{for(var s=0;s<t.length;s++)if(!e[s].hasPredecessor&&!e[s].visited)return s;for(s=0;s<t.length;s++)if(!e[s].visited)return s;return-1},yt=(t,e,s,i)=>{for(var r=0;r<t.length;r++)if(!e[r].visited){var n=t[r];if(s.getEndPoint().distance(n.getStartPoint())<i)return e[r].visited=!0,n;if(s.getEndPoint().distance(n.getEndPoint())<i)return e[r].visited=!0,n.reverse()}return null},bt=(t,e,s,i)=>{var r=t[s];e[s].visited=!0;const n=new vt(r);for(var o=0;o<t.length&&r;)(r=yt(t,e,r,i))&&n.segments.push(r),o++;return n},wt=(t,e)=>{const s=void 0===e||e<0?1:e,i=((t,e)=>{const s=[];for(var i=0;i<t.length;i++){s.push({visited:!1,hasPredecessor:!1,hasSuccessor:!1});for(var r=0;r<t.length;r++)i!==r&&((t[i].getStartPoint().distance(t[r].getEndPoint())<e||t[i].getStartPoint().distance(t[r].getStartPoint())<e)&&(s[i].hasPredecessor=!0),(t[i].getEndPoint().distance(t[r].getEndPoint())<e||t[i].getEndPoint().distance(t[r].getStartPoint())<e)&&(s[i].hasSuccessor=!0))}for(i=0;i<t.length;i++)!s[i].hasSuccessor&&s[i].hasPredecessor&&(t[i]=t[i].reverse(),s[i].hasPredecessor=!1,s[i].hasSuccessor=!0);return s})(t,s),r=[];for(var n=-1,o=0;-1!==(n=mt(t,i))&&o<t.length;){i[n].visited=!0,o++;const e=bt(t,i,n,s);o+=e.getSegmentCount()-1,r.push(e)}return r};class Ct{constructor(t,e){this.rawLinearPathSegments=[],this.debugMode=!1,this.dataGrid=t,this.debugMode=Boolean(e)}detectContourPaths(t,e){var s,i;e=e||{closeGapType:Ct.CLOSE_GAP_TYPE_NONE},this.rawLinearPathSegments=[];const r=[[0,0],[0,0]];for(var n=0;n+1<this.dataGrid.ySegmentCount;n++)for(var o=0;o+1<this.dataGrid.xSegmentCount;o++)this.dataGrid.getDataFace4At(o,n,r),this.findHeightFaceIntersectionLines(o,n,r,t,null!==(s=e.pointEliminationEpsilon)&&void 0!==s?s:1e-7,e.useTriangles);if(e.closeGapType==Ct.CLOSE_GAP_TYPE_ABOVE||e.closeGapType==Ct.CLOSE_GAP_TYPE_BELOW){const s=[0,this.dataGrid.xSegmentCount-1];for(var a=0;a<s.length;a++){const i=s[a];for(n=0;n+1<this.dataGrid.ySegmentCount;n++){const s=i,r=n+1;this.detectAboveBelowLerpSegment(i,n,s,r,t,e.closeGapType)}}const i=[0,this.dataGrid.ySegmentCount-1];for(var h=0;h<i.length;h++)for(n=i[h],o=0;o+1<this.dataGrid.xSegmentCount;o++){const s=o+1,i=n;this.detectAboveBelowLerpSegment(o,n,s,i,t,e.closeGapType)}}e.onRawSegmentsDetected&&e.onRawSegmentsDetected(this.rawLinearPathSegments);let l=wt(this.rawLinearPathSegments,null!==(i=e.pathDetectEpsilon)&&void 0!==i?i:1e-7);return l=l.filter(function(t){return 1!=t.segments.length||1===t.segments.length&&t.segments[0].length()>.1}),l}findHeight4FaceIntersectionLine(t,e,s,i,r){const n=s[0][0],a=s[1][0],h=s[1][1],c=s[0][1];if(null===n||null===a||null===h||null===c)throw`[findHeightFace4IntersectionLine] Cannot extract data face at (${t},${e}). Some values are null.`;let d=[];if(this.isBetween(n,a,i)){const s=this.getLerpRatio(n,a,i);d.push(new o(this.lerp(t,t+1,s),e))}if(this.isBetween(a,h,i)){const s=this.getLerpRatio(a,h,i);d.push(new o(t+1,this.lerp(e,e+1,s)))}if(this.isBetween(h,c,i)){const s=this.getLerpRatio(h,c,i);d.push(new o(this.lerp(t+1,t,s),e+1))}if(this.isBetween(c,n,i)){const s=this.getLerpRatio(c,n,i);d.push(new o(t,this.lerp(e+1,e,s)))}if(d=ft(d,r),d.length>=2){const s=d[0],i=d[1];return this.debugMode&&d.length>2&&console.warn("[findHeightFace4IntersectionLine] Detected more than 2 points on one face whre only 0 or 2 should appear. At ",t,e,d),new l(s,i)}return this.debugMode&&1===d.length&&console.warn("[findHeightFace4IntersectionLine] Point list has only one point (should not happen)."),null}findHeightFaceIntersectionLines(t,e,s,i,r,n){if(n){const n=this.findHeighteFace3IntersectionLine(t,e,t,e+1,t+1,e,[s[0][0],s[0][1],s[1][0]],i,r);n&&this.rawLinearPathSegments.push(n);const o=this.findHeighteFace3IntersectionLine(t,e+1,t+1,e+1,t+1,e,[s[0][1],s[1][1],s[1][0]],i,r);o&&this.rawLinearPathSegments.push(o)}else{const n=this.findHeight4FaceIntersectionLine(t,e,s,i,r);n&&this.rawLinearPathSegments.push(n)}}findHeighteFace3IntersectionLine(t,e,s,i,r,n,a,h,c){const d=a[0],u=a[1],g=a[2];if(null===d||null===u||null===g)throw`[findHeightFace3IntersectionLine] Cannot extract data face at (${t},${e}). Some values are null.`;let f=[];if(this.isBetween(d,u,h)){const r=this.getLerpRatio(d,u,h);f.push(new o(this.lerp(t,s,r),this.lerp(e,i,r)))}if(this.isBetween(u,g,h)){const t=this.getLerpRatio(u,g,h);f.push(new o(this.lerp(s,r,t),this.lerp(i,n,t)))}if(this.isBetween(g,d,h)){const s=this.getLerpRatio(g,d,h);f.push(new o(this.lerp(r,t,s),this.lerp(n,e,s)))}if(f=ft(f,c),f.length>=2){const s=f[0],i=f[1];return this.debugMode&&f.length>2&&console.warn("[findHeightFace3IntersectionLine] Detected more than 2 points on one face whre only 0 or 2 should appear. At ",t,e,f),new l(s,i)}return this.debugMode&&1===f.length&&console.warn("[findHeightFace3IntersectionLine] Point list has only one point (should not happen)."),null}detectAboveBelowLerpSegment(t,e,s,i,r,n){const a=this.dataGrid.getDataValueAt(t,e),h=this.dataGrid.getDataValueAt(s,i);if(this.areBothValuesOnRequiredPlaneSide(a,h,r,n)){const r=new l(new o(t,e),new o(s,i));this.rawLinearPathSegments.push(r)}else if(n==Ct.CLOSE_GAP_TYPE_ABOVE&&a>=r&&h<=r||n==Ct.CLOSE_GAP_TYPE_BELOW&&a<=r&&h>=r){const n=this.getLerpRatio(a,h,r),c=new l(new o(t,e),new o(this.lerp(t,s,n),this.lerp(e,i,n)));this.rawLinearPathSegments.push(c)}else if(n==Ct.CLOSE_GAP_TYPE_ABOVE&&a<=r&&h>=r||n==Ct.CLOSE_GAP_TYPE_BELOW&&a>=r&&h<=r){const n=this.getLerpRatio(a,h,r),c=new l(new o(this.lerp(t,s,n),this.lerp(e,i,n)),new o(s,i));this.rawLinearPathSegments.push(c)}}areBothValuesOnRequiredPlaneSide(t,e,s,i){return i==Ct.CLOSE_GAP_TYPE_BELOW&&t<=s&&e<=s||i==Ct.CLOSE_GAP_TYPE_ABOVE&&t>=s&&e>=s}isBetween(t,e,s){return t<=s&&s<=e||e<=s&&s<=t}getLerpRatio(t,e,s){return(s-t)/(e-t)}lerp(t,e,s){return t+(e-t)*s}}Ct.CLOSE_GAP_TYPE_NONE=0,Ct.CLOSE_GAP_TYPE_ABOVE=1,Ct.CLOSE_GAP_TYPE_BELOW=2;const Pt=(t,e)=>t.x==e.x?t.y-e.y:t.x-e.x,At=(t,e,s)=>(t.x-s.x)*(e.y-s.y)-(t.y-s.y)*(e.x-s.x),_t=(t,e,s,i)=>{const o=new l(t,e),a=new l(e,s),h=new l(s,i),c=n.nsectAngle(e,t,s,2)[0],d=n.nsectAngle(s,e,i,2)[0],u=c.intersection(d);if(!u)return null;const g=o.getClosestPoint(u),f=a.getClosestPoint(u),x=h.getClosestPoint(u);return new r(g,f,x)},St=(t,e)=>{const s=[];for(var i=0;i<t.vertices.length;i++){var r=new l(t.vertices[i],t.vertices[(i+1)%t.vertices.length]);e.lineDistance(r)<1e-6&&s.push(i)}return s};class Tt{constructor(t){this.vertices=t||[]}addPoint(t){this.vertices.push(t)}generateCurve(t,e){let s=this.vertices.length;if(s>1){if(2==s)return[new u(this.vertices[0],this.vertices[1],this.vertices[0],this.vertices[1])];{const i=[];let r=this.hobbyControls(t,e);for(let e=0;e<s-(t?0:1);e++){let t=(e+1)%s;i.push(new u(this.vertices[e],this.vertices[t],r.startControlPoints[e],r.endControlPoints[e]))}return i}}return[]}hobbyControls(t,e){void 0===e&&(e=0);let s=this.vertices.length-(t?0:1),i=new Array(s),r=new Array(s);var n=e=>t?(e+1)%s:e+1,a=e=>t?(e+s-1)%s:e-1;for(let t=0;t<s;t++){let e=n(t);r[t]=this.vertices[t].difference(this.vertices[e]),i[t]=Math.sqrt(r[t].x*r[t].x+r[t].y*r[t].y)}let h=new Array(s+(t?0:1));for(let e=t?0:1;e<s;e++){let t=a(e),s=r[t].y/i[t],n=r[t].x/i[t],o=Tt.utils.rotate(r[e],-s,n);h[e]=Math.atan2(o.y,o.x)}t||(h[s]=0);let l=new Array(s+(t?0:1)),c=new Array(s+(t?0:1)),d=new Array(s+(t?0:1)),u=new Array(s+(t?0:1));for(let e=t?0:1;e<s;e++){let t=n(e),s=a(e);l[e]=1/i[s],c[e]=(2*i[s]+2*i[e])/(i[s]*i[e]),d[e]=1/i[e],u[e]=-(2*h[e]*i[e]+h[t]*i[s])/(i[s]*i[e])}var g,f;if(t){let i=l[0]*e;l[0]=0;let r=d[s-1]*e;d[s-1]=0,g=Tt.utils.sherman(l,c,d,u,i,r),f=new Array(s);for(let e=0;e<s-(t?0:1);e++){let t=n(e);f[e]=-h[t]-g[t]}}else{c[0]=2+e,d[0]=2*e+1,u[0]=-d[0]*h[1],l[s]=2*e+1,c[s]=2+e,u[s]=0,g=Tt.utils.thomas(l,c,d,u),f=new Array(s);for(let t=0;t<s-1;t++)f[t]=-h[t+1]-g[t+1];f[s-1]=-g[s]}let x=new Array(s),p=new Array(s);for(let t=0;t<s;t++){let e=n(t),s=Tt.utils.rho(g[t],f[t])*i[t]/3,a=Tt.utils.rho(f[t],g[t])*i[t]/3,h=Tt.utils.normalize(Tt.utils.rotateAngle(r[t],g[t]));x[t]=new o(this.vertices[t].x+s*h.x,this.vertices[t].y+s*h.y),h=Tt.utils.normalize(Tt.utils.rotateAngle(r[t],-f[t])),p[t]=new o(this.vertices[e].x-a*h.x,this.vertices[e].y-a*h.y)}return{startControlPoints:x,endControlPoints:p}}}Tt.utils={rotate:(t,e,s)=>new o(t.x*s-t.y*e,t.x*e+t.y*s),rotateAngle:(t,e)=>Tt.utils.rotate(t,Math.sin(e),Math.cos(e)),normalize:t=>{let e=Math.hypot(t.x,t.y);return 0==e?new o(0,0):new o(t.x/e,t.y/e)},rho:(t,e)=>{let s=Math.sin(t),i=Math.sin(e),r=Math.cos(t),n=Math.cos(e),o=Math.sqrt(5);return(4+Math.sqrt(8)*(s-i/16)*(i-s/16)*(r-n))/(2+(o-1)*r+(3-o)*n)},thomas:(t,e,s,i)=>{let r=t.length,n=new Array(r),o=new Array(r);n[0]=s[0]/e[0],o[0]=i[0]/e[0];for(let a=1;a<r;a++){let r=e[a]-n[a-1]*t[a];n[a]=s[a]/r,o[a]=(i[a]-o[a-1]*t[a])/r}let a=new Array(r);a[r-1]=o[r-1];for(let t=r-2;t>=0;t--)a[t]=o[t]-n[t]*a[t+1];return a},sherman:(t,e,s,i,r,n)=>{const o=t.length,a=new Array(o);a.fill(0,1,o-1),a[0]=1,a[o-1]=1;let h=new Array(o);h.fill(0,1,o-1),h[0]=n,h[o-1]=r,e[0]-=n,e[o-1]-=r;const l=Tt.utils.thomas(t,e,s,i),c=Tt.utils.thomas(t,e,s,a),d=(n*l[0]+r*l[o-1])/(1+n*c[0]+r*c[o-1]),u=new Array(o);for(let t=0;t<o;t++)u[t]=l[t]-d*c[t];return u}};class Lt{constructor(t){this.vertices=t||[]}addPoint(t){this.vertices.push(t)}generateCurve(t){const e=[],s=[];for(var i=0;i<this.vertices.length;i++)e.push(this.vertices[i].x),s.push(this.vertices[i].y);const r=[];let n=this.vertices.length;if(n>1)if(2==n)r.push(new u(this.vertices[0],this.vertices[1],this.vertices[0],this.vertices[1]));else if(t){let t=Lt.utils.naturalControlsClosed(e),i=Lt.utils.naturalControlsClosed(s);for(let e=0;e<n;e++){let s=(e+1)%n;r.push(new u(this.vertices[e],this.vertices[s],new o(t.start[e],i.start[e]),new o(t.end[e],i.end[e])))}}else{const t=Lt.utils.naturalControlsOpen(e),i=Lt.utils.naturalControlsOpen(s);for(let e=1;e<n;e++)r.push(new u(this.vertices[e-1],this.vertices[e],new o(t.start[e-1],i.start[e-1]),new o(t.end[e-1],i.end[e-1])))}return r}}Lt.utils={naturalControlsClosed:t=>{const e=t.length,s=new Array(e),i=new Array(e),r=new Array(e),n=new Array(e);i[0]=4,r[0]=1,n[0]=4*t[0]+2*t[1],s[e-1]=1,i[e-1]=4,n[e-1]=4*t[e-1]+2*t[0];for(let o=1;o<e-1;o++)s[o]=1,i[o]=4,r[o]=1,n[o]=4*t[o]+2*t[o+1];const o=Tt.utils.sherman(s,i,r,n,1,1),a=new Array(e);for(let s=0;s<e-1;s++)a[s]=2*t[s+1]-o[s+1];return a[e-1]=2*t[0]-o[0],{start:o,end:a}},naturalControlsOpen:t=>{const e=t.length-1,s=new Array(e),i=new Array(e),r=new Array(e),n=new Array(e);i[0]=2,r[0]=1,n[0]=t[0]+2*t[1],s[e-1]=2,i[e-1]=7,n[e-1]=8*t[e-1]+t[e];for(let o=1;o<e-1;o++)s[o]=1,i[o]=4,r[o]=1,n[o]=4*t[o]+2*t[o+1];const o=Tt.utils.thomas(s,i,r,n),a=new Array(e);for(let s=0;s<e-1;s++)a[s]=2*t[s+1]-o[s+1];return a[e-1]=(t[e]+o[e-1])/2,{start:o,end:a}}};class Et{constructor(t,e){void 0===t&&(t=[]),void 0===e&&(e=new o(0,0)),this.triangles=t,this.sharedVertex=e}isOpen(){return this.triangles.length<3||!this.triangles[0].isAdjacent(this.triangles[this.triangles.length-1])}toPolygon(){return new c(this.toPathArray(),this.isOpen())}toPathSVGString(){if(0==this.triangles.length)return"";return this.toPathArray().map(t=>t.x+","+t.y).join(" ")}toPathArray(){if(0==this.triangles.length)return[];if(1==this.triangles.length)return[this.triangles[0].getCircumcircle().center];const t=[];for(var e=0;e<this.triangles.length;e++){var s=this.triangles[e].getCircumcircle();t.push(s.center)}return t}static _calcOpenEdgePoint(t,e,s){const i=t.getCircumcircle().center,r=Et._findOuterEdgePoint(t,e,s),n=new l(s,r).getClosestPoint(i);return new o(n.x+1e3*(i.x-n.x),n.y+1e3*(i.y-n.y))}static _findOuterEdgePoint(t,e,s){return t.a.equals(s)?e.a.equals(t.b)||e.b.equals(t.b)||e.c.equals(t.b)?t.c:t.b:t.b.equals(s)?e.a.equals(t.a)||e.b.equals(t.a)||e.c.equals(t.a)?t.c:t.a:e.a.equals(t.a)||e.b.equals(t.a)||e.c.equals(t.a)?t.b:t.a}}const Mt=Y.makeRGB(0,0,0),It=Y.makeRGB(255,255,255);class Dt{constructor(t,e,s){if(t<=0)throw`Cannot create DataGrid2dArray, xSegmentCount (${t}) must be > 0.`;if(e<=0)throw`Cannot create DataGrid2dArray, ySegmentCount (${e}) must be > 0.`;this.xSegmentCount=t,this.ySegmentCount=e,this._matrix=[];for(var i=0;i<e;i++)this._matrix.push(ct(t,s))}set(t,e,s){this._matrix[e][t]=s}get(t,e){return this.getDataValueAt(t,e)}setAll(t){for(var e=0;e<this.xSegmentCount;e++)for(var s=0;s<this.ySegmentCount;s++)this.set(e,s,t(e,s));return this}find(t){for(var e=0;e<this.xSegmentCount;e++)for(var s=0;s<this.ySegmentCount;s++)if(t(this.get(e,s),e,s,this))return{xIndex:e,yIndex:s,xRel:e/this.xSegmentCount,yRel:s/this.ySegmentCount};return null}getMinDataValue(){return this.minDataValue}getMaxDataValue(){return this.maxDataValue}getDataValueAt(t,e,s){return this._matrix[e][t]}getDataFace4At(t,e,s){s[0][0]=this.getDataValueAt(t,e),s[1][0]=this.getDataValueAt(t+1,e),s[1][1]=this.getDataValueAt(t+1,e+1),s[0][1]=this.getDataValueAt(t,e+1)}static toString(t){const e=[];for(var s=0;s<t.ySegmentCount;s++){for(var i=0;i<t.xSegmentCount;i++)e.push(t.get(i,s)?"X":".");e.push("\n")}return e.join("")}static parseBooleanMatrix(t,e,s){const i=new Dt(e,s,!1),r=t.trim().split("\n");for(var n=0;n<r.length&&n<s;n++){r[n]=r[n].trim();for(var o=0;o<r[n].length&&o<e;o++)n<s&&o<e&&"X"===r[n].charAt(o)&&i.set(o,n,!0)}return i}}const Nt=(t,e,s,i,r)=>new d({x:t.x+i*(e+s),y:t.y+r*(e+s)},{x:t.x+i*(e+s)+e,y:t.y+r*(e+s)+e}),kt=(t,e,s)=>t+(e-t)*s,zt=(t,e,s,i,r,n)=>{t.push("C",kt(e.x,s.x,n),kt(e.y,s.y,n),kt(r.x,i.x,n),kt(r.y,i.y,n),r.x,r.y)},Bt=(t,e)=>{t.push("L",e.x,e.y)},Rt=(t,e,s,i,r,n,o,a,h)=>{var l=!1;const c=e.xSegmentCount*e.ySegmentCount*4+1;for(var d=0,u=i,g=r;!l&&d++<c;){var f=u.xIndex,x=u.yIndex;const c=Nt(n,o,a,f,x);if(0===g){s.set(f,x,!0);const i=c.getWestPoint();if(x-1<0||!1===e.get(f,x-1))zt(t,i,c.getNorthWestPoint(),c.getNorthWestPoint(),c.getNorthPoint(),h),g=1;else if(f-1>=0&&!0===e.get(f-1,x-1)){const e=Nt(n,o,a,f-1,x-1);zt(t,i,c.getNorthWestPoint(),e.getSouthEastPoint(),e.getSouthPoint(),h),g=3,u={xIndex:f-1,yIndex:x-1}}else{const e=Nt(n,o,a,f,x-1);Bt(t,e.getWestPoint()),u={xIndex:f,yIndex:x-1}}}else if(1===g){const s=c.getNorthPoint();if(f+1>=e.xSegmentCount||!1===e.get(f+1,x))zt(t,s,c.getNorthEastPoint(),c.getNorthEastPoint(),c.getEastPoint(),h),g=2;else if(x-1<0||!1===e.get(f+1,x-1)){const e=Nt(n,o,a,f+1,x);Bt(t,e.getNorthPoint()),u={xIndex:f+1,yIndex:x}}else{const e=Nt(n,o,a,f+1,x-1);zt(t,s,c.getNorthEastPoint(),e.getSouthWestPoint(),e.getWestPoint(),h),g=0,u={xIndex:f+1,yIndex:x-1}}}else if(2===g){var p=c.getEastPoint();if(x+1>=e.ySegmentCount||!1===e.get(f,x+1))zt(t,p,c.getSouthEastPoint(),c.getSouthEastPoint(),c.getSouthPoint(),h),g=3;else if(f+1<e.xSegmentCount&&x+1<e.ySegmentCount&&!0===e.get(f+1,x+1)){const e=Nt(n,o,a,f+1,x+1);zt(t,p,c.getSouthEastPoint(),e.getNorthWestPoint(),e.getNorthPoint(),h),g=1,u={xIndex:f+1,yIndex:x+1}}else{const e=Nt(n,o,a,f,x+1);Bt(t,e.getEastPoint()),u={xIndex:f,yIndex:x+1}}}else if(3===g){const s=c.getSouthPoint();if(f-1<0||!1===e.get(f-1,x))zt(t,s,c.getSouthWestPoint(),c.getSouthWestPoint(),c.getWestPoint(),h),g=0;else if(f-1>=0&&x+1<e.ySegmentCount&&!0===e.get(f-1,x+1)){const e=Nt(n,o,a,f-1,x+1);zt(t,s,c.getSouthWestPoint(),e.getNorthEastPoint(),e.getEastPoint(),h),g=2,u={xIndex:f-1,yIndex:x+1}}else{const e=Nt(n,o,a,f-1,x);Bt(t,e.getSouthPoint()),u={xIndex:f-1,yIndex:x}}}else console.warn(`[Error] Cannot construct full rounded path; 'borderDirection' has wrong value (${g}).`),l=!0;i.xIndex===u.xIndex&&i.yIndex===u.yIndex&&r===g&&(t.push("Z"),l=!0)}},Gt=(()=>{const t=(s,i,r)=>{if(i<=0)return[s];if(s.length<=3)return[s];const n=s.length,a=new l(new o,new o),h=new l(new o,new o);for(var c=0;c<s.length;c++){a.a.set(s[c]),a.b.set(s[(c+1)%n]);for(var d=0;d<s.length;d++){if(c==d||c+1==d||c==d+1||0==c&&d+1==s.length||0==d&&c+1==s.length)continue;h.a.set(s[d]),h.b.set(s[(d+1)%n]);const o=a.intersection(h);if(o&&a.hasPoint(o,r)&&h.hasPoint(o,r)){const n=e(s,c,d,o),a=t(n[0],i-1,r),h=t(n[1],i-1,r);return a.concat(h)}}}return[s]},e=(t,e,s,i)=>{const r=[];for(var n=[],o=0;o<t.length;o++)o<=e&&r.push(t[o]),o==e&&(r.push(i),n.push(i)),o>e&&o<=s&&n.push(t[o]),o>s&&r.push(t[o]);return[r,n]};return(e,s,i)=>(void 0===s&&(s=10),t(e,s,i))})(),Vt=(t,e,s)=>(e.x-t.x)*(s.y-t.y)>(e.y-t.y)*(s.x-t.x),Ot=(t,e,s,i)=>{const r=t.x-e.x,n=t.y-e.y,o=s.x-i.x,a=s.y-i.y,h=t.x*e.y-t.y*e.x,l=s.x*i.y-s.y*i.x,c=1/(r*a-n*o);return{x:(h*o-l*r)*c,y:(h*a-l*n)*c}},Ht=(t,e)=>{let s,i,r,n=e[e.length-1],o=t;for(var a in e){s=e[a];var h=o;for(var l in o=[],i=h[h.length-1],h)r=h[l],Vt(n,s,r)?(Vt(n,s,i)||o.push(Ot(n,s,i,r)),o.push(r)):Vt(n,s,i)&&o.push(Ot(n,s,i,r)),i=r;n=s}return o};class Ft{constructor(t){this.originalPolygonLines=[],this.insetLines=[],this.insetPolygonLines=[],this.splitPolygons=[],this.polygon=t}computeOutputPolygons(t){var e;if(0===t.innerPolygonOffset)return[this.polygon.vertices];Ft._assertPolygonIsClockwise(this.polygon.vertices);const s=t.intersectionEpsilon;this.optimizedPolygon=this.polygon.clone();const i=null!==(e=null==t?void 0:t.maxPolygonSplitDepth)&&void 0!==e?e:this.optimizedPolygon.vertices.length;return this.originalPolygonLines=this.optimizedPolygon.getEdges(),this._collectInsetLines(this.originalPolygonLines,t.innerPolygonOffset),this._collectInsetPolygonLines(this.insetLines),this.insetRectanglePolygons=this._collectRectangularPolygonInsets(this.originalPolygonLines,this.insetLines),t.removeEars&&Ft._optimizeInsetPolygon(this.optimizedPolygon,this.insetRectanglePolygons),this.insetPolygon=Ft.convertToBasicInsetPolygon(this.insetPolygonLines),this.splitPolygons=Gt(this.insetPolygon.vertices,i,!0),t.innerPolygonOffset,Ft._assertAllPolygonsAreClockwise(this.splitPolygons),this.filteredSplitPolygons=Ft._filterInnerSplitPolygonsByCoverage(this.splitPolygons,this.insetRectanglePolygons,s),this.filteredSplitPolygons=Ft._filterInnerSplitPolygonsByOriginalBounds(this.filteredSplitPolygons,this.polygon),this.filteredSplitPolygons}_collectInsetLines(t,e){const s=[];for(var i=0;i<t.length;i++){const r=t[i],n=new h(r.a,r.b).perp(),o=e/n.length(),a=n.vertAt(o),l=r.a.difference(a),c=r.clone();c.a.add(l),c.b.add(l),s.push(c)}return this.insetLines=s,s}_collectInsetPolygonLines(t){if(t.length<=1)return[];const e=[],s=t[t.length-1],i=t[0];let r=s.intersection(i);for(var n=0;n<t.length;n++){const s=t[n],i=t[(n+1)%t.length],o=s.intersection(i);if(null==o)console.warn("[collectInsetPolygon] WARN intersection line must not be null",n,i);else if(null!=r){const t=new l(r,o);e.push(t)}r=o}return this.insetPolygonLines=e,e}_collectRectangularPolygonInsets(t,e){return t.map((t,s)=>{const i=new c([],!1);i.vertices.push(t.a.clone()),i.vertices.push(t.b.clone());const r=e[s];return i.vertices.push(r.b.clone()),i.vertices.push(r.a.clone()),i})}static convertToBasicInsetPolygon(t){const e=new c([],!1);return t.forEach(t=>{e.vertices.push(t.a)}),e}static _filterInnerSplitPolygonsByOriginalBounds(t,e){return t.filter((t,s)=>t.every(t=>e.containsVert(t)))}static _filterInnerSplitPolygonsByCoverage(t,e,s){t.forEach((t,e)=>{const s=c.utils.isClockwise(t);s||console.warn("------ split is not isClockwise!",e,s)}),e.forEach((t,e)=>{const s=t.isClockwise();s||console.warn("------ rect is not isClockwise!",e,s)});const i=void 0===s||void 0===s?1:s;return t.filter((t,s)=>{const r=Ft._hasIntersectionCallback(t,i,s);return!e.some(r)})}static _assertAllPolygonsAreClockwise(t){t.forEach((t,e)=>{Ft._assertPolygonIsClockwise(t)})}static _assertPolygonIsClockwise(t){c.utils.isClockwise(t)||t.reverse()}}Ft._optimizeInsetPolygon=(t,e)=>{for(var s=-1,i=t.vertices.length,r=0;r++<i&&t.vertices.length>3&&-1!=(s=Ft._locateExcessiveEarEdge(t,e));){var n=t.getEdgeAt(s-2),o=t.getEdgeAt(s+1),a=n.intersection(o);a&&o.a.set(a),t.vertices.splice(s,1),e.splice(s,1)}},Ft._locateExcessiveEarEdge=(t,e)=>{for(var s=0;s<t.vertices.length;s++){const i=t.getEdgeAt(s),r=0==s?t.vertices.length-1:s-1,n=e[r];if(Ft._rectangleFullyContainsLine(n,i))return s;const o=t.getEdgeAt(r),a=e[s];if(Ft._rectangleFullyContainsLine(a,o))return s}return-1},Ft._rectangleFullyContainsLine=(t,e)=>{t.getEdgeAt(0).length(),t.getEdgeAt(1).length(),e.length();var s=e.vertAt(.01),i=e.vertAt(.99),r=e.vertAt(.5);return t.containsVerts([s,i,r])},Ft._hasIntersectionCallback=(t,e,s)=>(i,r)=>{const n=Ht(i.vertices,t),o=c.utils.area(n);return o<0&&console.warn("%cFound a polygon split with negative area. Counterclockwise against all odds?","color: red; background: black;","intersectionAreaSize",o,"_splitPolyIndex",s,"_rectanglePolyIndex",r,"intersectionVerts",n),o>=e};const $t=t=>{const e=[],s=[];for(var i=0;i<t.length;i++){const n=t[i],o=[];for(var r=0;r<n.vertices.length;r++){const t=e.length;e.push(n.vertices[r]),o.push(t)}for(r=0;r<n.vertices.length;r++){const t=r,e=(r+1)%n.vertices.length,i=o[t],a=o[e];s.push({i:i,j:a})}}return{vertices:e,edges:s}};class Wt{constructor(t,e){var s,i;this.polygons=t,this.tolerance=null!==(s=null==e?void 0:e.tolerance)&&void 0!==s?s:Wt.DEFAULT_TOLERANCE,this.removeUnusedVertices=null===(i=null==e?void 0:e.removeUnusedVertices)||void 0===i||i}__eliminateDuplicateEdges(t){for(var e=0;e<t.edges.length;e++){const i=t.edges[e];if(!i)continue;const r=t.vertices[i.i],n=t.vertices[i.j];for(var s=0;s<t.edges.length;s++){if(e===s)continue;const i=t.edges[s];if(!i)continue;const o=t.vertices[i.i],a=t.vertices[i.j];this.__isEqualEdge(r,n,o,a)&&(t.edges[e]=null,t.edges[s]=null)}}return{vertices:t.vertices,edges:t.edges.filter(t=>null!=t)}}__locateEdgeWithVertIndex(t,e){return e.edges.findIndex(e=>e.i==t||e.j==t)}__removeUnusedVertices(t){const e=[],s=ct(t.vertices.length,-1);for(var i=0;i<t.vertices.length;i++){if(-1===this.__locateEdgeWithVertIndex(i,t));else{const r=e.length;e.push(t.vertices[i]),s[i]=r}}const r=[];for(i=0;i<t.edges.length;i++){const e=t.edges[i];r.push({i:s[e.i],j:s[e.j]})}return{vertices:e,edges:r}}findAllOutlinesGraph(){const t=$t(this.polygons),e=this.__eliminateDuplicateEdges(t);if(this.removeUnusedVertices){return this.__removeUnusedVertices(e)}return e}__convertGenericPathToPolygon(t){const e=[],s=t.getSegmentCount();let i=!1;for(var r=0;r<s;r++){const n=t.getSegmentAt(r);e.push(n.getStartPoint()),r>0&&r+1>=s&&!this.__isEqualPoint(n.getEndPoint(),e[0])&&(i=!0)}return new c(e,i)}findAllOutlinesPolygons(t){const e=t.edges.map(e=>new l(t.vertices[e.i],t.vertices[e.j]));return wt(e,this.tolerance).map(t=>this.__convertGenericPathToPolygon(t))}__isEqualPoint(t,e){return t.distance(e)<this.tolerance}__isEqualEdge(t,e,s,i){return this.__isEqualPoint(t,s)&&this.__isEqualPoint(e,i)||this.__isEqualPoint(t,i)&&this.__isEqualPoint(e,s)}}Wt.DEFAULT_TOLERANCE=.01;const qt=180/Math.PI,jt=[{color:Y.Red,ratio:0},{color:Y.Gold,ratio:.2},{color:Y.Yellow,ratio:.4},{color:Y.LimeGreen,ratio:.6},{color:Y.MediumBlue,ratio:.8},{color:Y.Purple,ratio:1}];class Ut{constructor(t,e){this.values=t,this.angle=void 0===e?Math.PI/2:e}toColorGradientString(){const t=[`linear-gradient( ${"number"==typeof this.angle?this.angle*qt+"deg":this.angle}, `];for(var e=0;e<this.values.length;e++){e>0&&t.push(",");const s=this.values[e]?this.values[e].color.cssRGBA():null;t.push(s);const i=this.values[e].ratio;t.push(`${"number"==typeof i?100*i+"%":i}`)}return t.push(")"),t.join(" ")}getColorAt(t){const e=this.locateClosestRatio(t),s=this.values[e[0]],i=this.values[e[0]+1];if(!i)return s.color.clone();const r=(t-s.ratio)/(i.ratio-s.ratio);return s.color.clone().interpolate(i.color,r)}locateClosestRatio(t){if(0===this.values.length)return console.warn("[Warn] All slider values array is empty. This should not happen, cannot proceed."),[NaN,null];let e=0,s=this.values[e];for(var i=1;i<this.values.length;i++){const r=this.values[i];Math.abs(r.ratio-t)<Math.abs(s.ratio-t)&&(s=r,e=r.ratio>t?i-1:i)}return[e,s]}static fromObject(t){if("object"!=typeof t)throw new Error(`Cannot instantiate ColorGradient from item: must be an object. (${typeof t})`);if(!t.hasOwnProperty("values"))throw new Error("Cannot instantiate ColorGradient from object: missing property 'values'.");const e=t.values;if(!Array.isArray(e))throw new Error("Cannot instantiate ColorGradient from object: property 'values' is not an array.");const s=e.map((t,e)=>{if("object"!=typeof t)throw new Error(`Cannot instantiate ColorGradient from object: item at index ${e} is not an object.`);if(!t.hasOwnProperty("color")||!t.hasOwnProperty("ratio"))throw new Error(`Cannot instantiate ColorGradient from object: item at index ${e} is missing 'color' or 'ratio' property.`);const s=t;return{color:Y.makeRGB(s.color.r,s.color.g,s.color.b),ratio:s.ratio}});return new Ut(s,t.angle)}clone(){return new Ut(this.values.map(t=>({color:t.color,ratio:t.ratio})),this.angle)}static createDefault(){return new Ut(jt.map(t=>({color:t.color,ratio:t.ratio})))}static createFrom(t,e,s){return new Ut([{ratio:0,color:t},{ratio:1,color:e}],s)}}Ut.DEFAULT_COLORSET=jt;var Yt;exports.TileType=void 0,(Yt=exports.TileType||(exports.TileType={})).UNKNOWN="UNKNOWN",Yt.DECAGON="DECAGON",Yt.PENTAGON="PENTAGON",Yt.IRREGULAR_HEXAGON="IRREGULAR_HEXAGON",Yt.RHOMBUS="RHOMBUS",Yt.BOW_TIE="BOW_TIE",Yt.PENROSE_RHOMBUS="PENROSE_RHOMBUS";class Xt extends c{constructor(t,e,s){super([],!1),void 0===e&&(e=Xt.DEFAULT_EDGE_LENGTH),void 0===s&&(s=exports.TileType.UNKNOWN),this.edgeLength=e,this.position=t,this.rotation=0,this.symmetry=10,this.uniqueSymmetries=10,this.innerTilePolygons=[],this.outerTilePolygons=[],this.textureSource=new d(new o,new o),this.tileType=s}move(t){for(var e in super.move.call(this,t),this.innerTilePolygons)this.innerTilePolygons[e].move(t);for(var e in this.outerTilePolygons)this.outerTilePolygons[e].move(t);return this.position.add(t),this}findAdjacentTilePosition(t,e){const s=new l(this.vertices[t%this.vertices.length],this.vertices[(t+1)%this.vertices.length]);for(var i=0;i<e.vertices.length;i++){const t=new l(e.vertices[i%e.vertices.length].clone(),e.vertices[(i+1)%e.vertices.length].clone()),r=t.b.difference(s.a);if(t.add(r),t.a.distance(s.b)<Xt.epsilon)return{edgeIndex:i,offset:r}}return null}transformTileToAdjacencies(t,e){let s=0;const i=[];let r=null;for(;s<e.uniqueSymmetries;)r=this.transformTilePositionToAdjacency(t,e),null!=r&&(r=r.clone(),i.push(r)),e.rotate(2*Math.PI/e.symmetry),s++;return i}transformTilePositionToAdjacency(t,e){var s=this.findAdjacentTilePosition(t,e);return null!=s?(e.move(s.offset),e):null}getInnerTilePolygonAt(t){return t<0?this.innerTilePolygons[this.innerTilePolygons.length-Math.abs(t)%this.innerTilePolygons.length]:this.innerTilePolygons[t%this.innerTilePolygons.length]}getOuterTilePolygonAt(t){return t<0?this.outerTilePolygons[this.outerTilePolygons.length-Math.abs(t)%this.outerTilePolygons.length]:this.outerTilePolygons[t%this.outerTilePolygons.length]}rotate(t,e){for(var s in void 0===e&&(e=this.position),super.rotate(t,e),this.innerTilePolygons)this.innerTilePolygons[s].rotate(t,e);for(var s in this.outerTilePolygons)this.outerTilePolygons[s].rotate(t,e);return this.rotation+=t,this}locateEdgeAtPoint(t,e){if(0==this.vertices.length)return-1;const s=new o(0,0);let i=0,r=2*e,n=-1;for(var a=0;a<this.vertices.length;a++){const o=this.getVertexAt(a),h=this.getVertexAt(a+1);s.x=o.x+(h.x-o.x)/2,s.y=o.y+(h.y-o.y)/2,i=s.distance(t),i<=e&&(-1==n||i<r)&&(r=i,n=a)}return n}}Xt.epsilon=.001,Xt.DEFAULT_EDGE_LENGTH=58;class Jt extends Xt{constructor(t,e){super(t,e,exports.TileType.BOW_TIE),this.uniqueSymmetries=5;let s=new o(0,0),i=s;const r=s;let n=null;this.addVertex(i);for(var a=[0,72,72,216,72],h=0,l=0;l<a.length;l++)h+=180-a[l],s=i,i=i.clone(),i.x-=this.edgeLength,i.rotate(h*(Math.PI/180),s),this.addVertex(i),2==l&&(n=i);const c=new o((n.x-r.x)/2,(n.y-r.y)/2);for(l=0;l<this.vertices.length;l++)this.vertices[l].add(t).sub(c);this.textureSource.min.x=.576,this.textureSource.min.y=7/460,this.textureSource.max.x=this.textureSource.min.x+.412,this.textureSource.max.y=this.textureSource.min.y+150/460,this.baseBounds=this.getBounds(),this._buildInnerPolygons(this.edgeLength),this._buildOuterPolygons(this.edgeLength)}clone(){return new Jt(this.position.clone(),this.edgeLength).rotate(this.rotation)}_buildInnerPolygons(t){const e=[1,4];for(var s=0;s<e.length;s++){const t=e[s],i=this.getVertexAt(t).clone().scale(.5,this.getVertexAt(t+1)),r=this.getVertexAt(t-1).clone().scale(.5,this.getVertexAt(t)),n=this.getVertexAt(t+1).clone().scale(.5,this.getVertexAt(t+2)),o=i.clone().scale(.38,this.position),a=new c([]);a.addVertex(i),a.addVertex(n),a.addVertex(o),a.addVertex(r),this.innerTilePolygons.push(a)}}_buildOuterPolygons(t){const e=[0,3];for(var s=0;s<e.length;s++){const t=e[s],i=new c;i.addVertex(this.innerTilePolygons[s].getVertexAt(0).clone()),i.addVertex(this.getVertexAt(t+2).clone()),i.addVertex(this.innerTilePolygons[s].getVertexAt(1).clone()),this.outerTilePolygons.push(i);const r=new c;r.addVertex(this.innerTilePolygons[s].getVertexAt(0).clone()),r.addVertex(this.getVertexAt(t+1).clone()),r.addVertex(this.innerTilePolygons[s].getVertexAt(3).clone()),this.outerTilePolygons.push(r)}const i=new c;i.addVertex(this.getVertexAt(0).clone()),i.addVertex(this.innerTilePolygons[0].getVertexAt(3).clone()),i.addVertex(this.innerTilePolygons[0].getVertexAt(2).clone()),i.addVertex(this.innerTilePolygons[0].getVertexAt(1).clone()),i.addVertex(this.getVertexAt(3).clone()),i.addVertex(this.innerTilePolygons[1].getVertexAt(3).clone()),i.addVertex(this.innerTilePolygons[1].getVertexAt(2).clone()),i.addVertex(this.innerTilePolygons[1].getVertexAt(1).clone()),this.outerTilePolygons.push(i)}}class Kt extends Xt{constructor(t,e){super(t,e,exports.TileType.DECAGON),this.uniqueSymmetries=1;const s=2*Math.PI/10,i=Math.sqrt(Math.pow(this.edgeLength/2,2)+Math.pow(1/Math.tan(s/2)*this.edgeLength/2,2));for(var r=0;r<10;r++)this.addVertex(t.clone().addY(-i).rotate(s/2+r*s,t));this.textureSource.min.x=.338,this.textureSource.min.y=140/460,this.textureSource.max.x=this.textureSource.min.x+.626,this.textureSource.max.y=this.textureSource.min.y+297/460,this.baseBounds=this.getBounds(),this._buildInnerPolygons(this.edgeLength),this._buildOuterPolygons(this.edgeLength)}clone(){return new Kt(this.position.clone(),this.edgeLength).rotate(this.rotation)}_buildInnerPolygons(t){const e=new c;for(var s=0;s<10;s++){const t=new c,i=this.getVertexAt(s).clone().scale(.5,this.getVertexAt(s+1)),r=i.clone().scale(.615,this.position),n=this.getVertexAt(s).clone().scale(.69,this.position),o=this.getVertexAt(s+1).clone().scale(.69,this.position);t.addVertex(i),t.addVertex(o),t.addVertex(r),t.addVertex(n),this.innerTilePolygons.push(t),e.addVertex(n.clone()),e.addVertex(r.clone())}this.innerTilePolygons.push(e)}_buildOuterPolygons(t){for(var e=0;e<10;e++){const t=new c;t.addVertex(this.getVertexAt(e).clone()),t.addVertex(this.innerTilePolygons[e].vertices[0].clone()),t.addVertex(this.innerTilePolygons[e].vertices[3].clone()),t.addVertex(this.getInnerTilePolygonAt(0==e?9:e-1).vertices[0].clone()),this.outerTilePolygons.push(t)}}}class Zt extends Xt{constructor(t,e){super(t,e,exports.TileType.IRREGULAR_HEXAGON),this.uniqueSymmetries=5;let s=new o(0,0),i=s;const r=s;let n=null;this.addVertex(i);const a=[0,72,144,144,72];let h=0;for(var l=0;l<a.length;l++)h+=180-a[l],s=i,i=i.clone(),i.x-=this.edgeLength,i.rotate(h*(Math.PI/180),s),this.addVertex(i),2==l&&(n=i);const c=new o((n.x-r.x)/2,(n.y-r.y)/2);for(l=0;l<this.vertices.length;l++)this.vertices[l].add(t).sub(c);this.textureSource.min.x=.154,this.textureSource.min.y=11/460,this.textureSource.max.x=this.textureSource.min.x+.41,this.textureSource.max.y=this.textureSource.min.y+150/460,this.baseBounds=this.getBounds(),this._buildInnerPolygons(this.edgeLength),this._buildOuterPolygons(this.edgeLength)}clone(){return new Zt(this.position.clone(),this.edgeLength).rotate(this.rotation)}_buildInnerPolygons(t){const e=new c;e.addVertex(this.vertices[0].clone().scale(.5,this.vertices[1])),e.addVertex(this.vertices[1].clone().scale(.5,this.vertices[2]));const s=new i(e.vertices[1],e.vertices[0].distance(e.vertices[1])),r=new i(this.vertices[2].clone().scale(.5,this.vertices[3]),s.radius);let n=s.circleIntersection(r);this.position.distance(n.a)<this.position.distance(n.b)?e.addVertex(n.a):e.addVertex(n.b),e.addVertex(r.center.clone()),s.center=r.center,r.center=this.vertices[3].clone().scale(.5,this.vertices[4]),n=s.circleIntersection(r),this.position.distance(n.a)<this.position.distance(n.b)?e.addVertex(n.a):e.addVertex(n.b),e.addVertex(r.center.clone()),e.addVertex(this.vertices[4].clone().scale(.5,this.vertices[5])),s.center=e.vertices[e.vertices.length-1],r.center=this.vertices[5].clone().scale(.5,this.vertices[0]),n=s.circleIntersection(r),this.position.distance(n.a)<this.position.distance(n.b)?e.addVertex(n.a):e.addVertex(n.b),e.addVertex(r.center.clone()),s.center=e.vertices[e.vertices.length-1],r.center=e.vertices[0],n=s.circleIntersection(r),this.position.distance(n.a)<this.position.distance(n.b)?e.addVertex(n.a):e.addVertex(n.b),e.addVertex(r.center.clone()),this.innerTilePolygons.push(e)}_buildOuterPolygons(t){const e=[0,3],s=[0,5];for(var i=0;i<e.length;i++){const t=e[i],r=s[i],n=new c;n.addVertex(this.getVertexAt(t+1).clone()),n.addVertex(this.innerTilePolygons[0].getVertexAt(r).clone()),n.addVertex(this.innerTilePolygons[0].getVertexAt(r+1).clone()),this.outerTilePolygons.push(n);const o=new c;o.addVertex(this.getVertexAt(t+2).clone()),o.addVertex(this.innerTilePolygons[0].getVertexAt(r+1).clone()),o.addVertex(this.innerTilePolygons[0].getVertexAt(r+2).clone()),o.addVertex(this.innerTilePolygons[0].getVertexAt(r+3).clone()),this.outerTilePolygons.push(o);const a=new c;a.addVertex(this.getVertexAt(t+3).clone()),a.addVertex(this.innerTilePolygons[0].getVertexAt(r+3).clone()),a.addVertex(this.innerTilePolygons[0].getVertexAt(r+4).clone()),a.addVertex(this.innerTilePolygons[0].getVertexAt(r+5).clone()),this.outerTilePolygons.push(a)}}}class Qt extends Xt{constructor(t,e,s){super(t,e,exports.TileType.PENROSE_RHOMBUS),this.uniqueSymmetries=5,void 0===s&&(s=!0);let i=new o(0,0),r=i;this.addVertex(r);const n=[0,36,144];let a=0;for(var h=0;h<n.length;h++)a+=180-n[h],i=r,r=r.clone(),r.x+=this.edgeLength,r.rotate(a*(Math.PI/180),i),this.addVertex(r);const l=d.computeFromVertices(this.vertices),c=new o(l.width/2-(l.width-this.edgeLength),l.height/2);for(h=0;h<this.vertices.length;h++)this.vertices[h].add(c).add(t);this.textureSource.min.x=.004,this.textureSource.min.y=8/460,this.textureSource.max.x=this.textureSource.min.x+.346,this.textureSource.max.y=this.textureSource.min.y+56/460,this.baseBounds=this.getBounds(),this._buildInnerPolygons(this.edgeLength,s),this._buildOuterPolygons(this.edgeLength,s)}clone(){return new Qt(this.position.clone(),this.edgeLength,!0).rotate(this.rotation)}_buildInnerPolygons(t,e){const s=[0,2],i=new c;for(var r=0;r<s.length;r++){const t=new c,e=s[r],n=this.getVertexAt(e).clone().scale(.5,this.getVertexAt(e+1)),o=this.getVertexAt(e+1).clone().scale(.5,this.getVertexAt(e+2)),a=this.getVertexAt(e+1).clone().scale(.28,this.position),h=this.getVertexAt(e+1).clone().scale(.55,this.position);t.addVertex(n),t.addVertex(a),t.addVertex(o),t.addVertex(h),i.addVertex(this.getVertexAt(e).clone().scale(.1775,this.getVertexAt(e+2))),i.addVertex(a.clone()),this.innerTilePolygons.push(t)}e&&this.innerTilePolygons.push(i)}_buildOuterPolygons(t,e){const s=[0,2];for(var i=0;i<s.length;i++){const t=new c,e=s[i],r=this.getVertexAt(e).clone().scale(.5,this.getVertexAt(e+1)),n=this.getVertexAt(e+1).clone().scale(.5,this.getVertexAt(e+2)),o=this.getVertexAt(e+1).clone().scale(.55,this.position);t.addVertex(r.clone()),t.addVertex(this.getVertexAt(e+1).clone()),t.addVertex(n.clone()),t.addVertex(o.clone()),this.outerTilePolygons.push(t)}if(e){const t=[0,2];for(i=0;i<t.length;i++){const e=new c,s=t[i];e.addVertex(this.getVertexAt(s).clone()),e.addVertex(this.getVertexAt(s).clone().scale(.5,this.getVertexAt(s+1))),e.addVertex(this.innerTilePolygons[i].getVertexAt(1).clone()),e.addVertex(this.getVertexAt(s).clone().scale(.1775,this.getVertexAt(s+2))),e.addVertex(this.innerTilePolygons[(i+1)%2].getVertexAt(1).clone()),e.addVertex(this.getVertexAt(s-1).clone().scale(.5,this.getVertexAt(s))),this.outerTilePolygons.push(e)}}}getCenterPolygonIndex(){return 2}}class te extends Xt{constructor(t,e){super(t,e,exports.TileType.PENTAGON),this.uniqueSymmetries=2;const s=2*Math.PI/5,i=Math.sqrt(Math.pow(this.edgeLength/2,2)+Math.pow(1/Math.tan(s/2)*this.edgeLength/2,2));for(var r=0;r<5;r++)this.addVertex(t.clone().addY(-i).rotate(s/2+r*s,t));this.textureSource.min.x=.014,this.textureSource.min.y=303/460,this.textureSource.max.x=this.textureSource.min.x+.314,this.textureSource.max.y=this.textureSource.min.y+150/460,this.baseBounds=this.getBounds(),this._buildInnerPolygons(this.edgeLength),this._buildOuterPolygons(this.edgeLength)}clone(){return new te(this.position.clone(),this.edgeLength).rotate(this.rotation)}_buildInnerPolygons(t){const e=new c;for(var s=0;s<this.vertices.length;s++)e.addVertex(this.getVertexAt(s).clone().scale(.5,this.getVertexAt(s+1))),e.addVertex(this.getVertexAt(s+1).clone().scale(.5,this.position));this.innerTilePolygons.push(e)}_buildOuterPolygons(t){for(var e=0;e<this.vertices.length;e++){const t=e,s=2*e,i=new c;i.addVertex(this.getVertexAt(t+1).clone()),i.addVertex(this.innerTilePolygons[0].getVertexAt(s).clone()),i.addVertex(this.innerTilePolygons[0].getVertexAt(s+1).clone()),i.addVertex(this.innerTilePolygons[0].getVertexAt(s+2).clone()),this.outerTilePolygons.push(i)}}}class ee extends Xt{constructor(t,e){super(t,e,exports.TileType.RHOMBUS),this.uniqueSymmetries=5;let s=new o(0,0),i=s;this.addVertex(i);const r=[0,72,108];let n=0;for(var a=0;a<r.length;a++)n+=180-r[a],s=i,i=i.clone(),i.x+=this.edgeLength,i.rotate(n*(Math.PI/180),s),this.addVertex(i);const h=d.computeFromVertices(this.vertices),l=new o(h.width/2-(h.width-this.edgeLength),h.height/2);for(a=0;a<this.vertices.length;a++)this.vertices[a].add(l).add(this.position);this.textureSource.min.x=.064,this.textureSource.min.y=188/460,this.textureSource.max.x=this.textureSource.min.x+.254,this.textureSource.max.y=this.textureSource.min.y+.2,this.baseBounds=this.getBounds(),this._buildInnerPolygons(),this._buildOuterPolygons()}clone(){return new ee(this.position.clone(),this.edgeLength).rotate(this.rotation)}_buildInnerPolygons(){const t=new c;t.addVertex(this.vertices[0].clone().scale(.5,this.vertices[1])),t.addVertex(this.vertices[1].clone().scale(.5,this.vertices[2]));const e=new i(t.vertices[1],.73*t.vertices[0].distance(t.vertices[1])),s=new i(this.vertices[2].clone().scale(.5,this.vertices[3]),e.radius);let r=e.circleIntersection(s);this.containsVert(r.a)?t.addVertex(r.b):t.addVertex(r.a),t.addVertex(s.center),t.addVertex(this.vertices[3].clone().scale(.5,this.vertices[0])),e.center=t.vertices[4],s.center=t.vertices[0],r=e.circleIntersection(s),this.containsVert(r.a)?t.addVertex(r.b):t.addVertex(r.a),this.innerTilePolygons.push(t)}_buildOuterPolygons(){const t=[0,2],e=[0,3];for(var s=0;s<t.length;s++){const i=t[s],r=e[s],n=new c;n.addVertex(this.getVertexAt(i+1).clone()),n.addVertex(this.innerTilePolygons[0].getVertexAt(r).clone()),n.addVertex(this.innerTilePolygons[0].getVertexAt(r+1).clone()),this.outerTilePolygons.push(n);const o=new c;o.addVertex(this.getVertexAt(i+2).clone()),o.addVertex(this.innerTilePolygons[0].getVertexAt(r+1).clone()),o.addVertex(this.innerTilePolygons[0].getVertexAt(r+2).clone()),o.addVertex(this.innerTilePolygons[0].getVertexAt(r+3).clone()),this.outerTilePolygons.push(o)}}}class se{constructor(t){t?this.setFromObject(t):this.setIdentity()}setFromObject(t){this.xx=t.xx,this.xy=t.xy,this.xz=t.xz,this.xw=t.xw,this.yx=t.yx,this.yy=t.yy,this.yz=t.yz,this.yw=t.yw,this.zx=t.zx,this.zy=t.zy,this.zz=t.zz,this.zw=t.zw,this.wx=t.wx,this.wy=t.wy,this.wz=t.wz,this.ww=t.ww}apply4(t){return{x:t.x*this.xx+t.y*this.xy+t.z*this.xz+t.w*this.xw,y:t.x*this.yx+t.y*this.yy+t.z*this.yz+t.w*this.yw,z:t.x*this.zx+t.y*this.zy+t.z*this.zz+t.w*this.zw,w:t.x*this.wx+t.y*this.wy+t.z*this.wz+t.w*this.ww}}apply3(t){const e=Object.assign(Object.assign({},t),{w:1});var s=this.apply4(e);return{x:s.x/s.w,y:s.y/s.w,z:s.z/s.w}}clear(){this.xx=this.xy=this.xz=this.xw=this.yx=this.yy=this.yz=this.yw=this.zx=this.zy=this.zz=this.zw=this.wx=this.wy=this.wz=this.ww=0}setIdentity(){return this.clear(),this.xx=this.yy=this.zz=this.ww=1,this}setRotation(t,e){this.setIdentity();var s=Math.cos(e),i=Math.sin(e),r=1-s,n=t.x,o=t.y,a=t.z;return this.xx=r*n*n+s,this.xy=r*n*o+i*a,this.xz=r*n*a-i*o,this.yx=r*n*o-i*a,this.yy=r*o*o+s,this.yz=r*o*a+i*n,this.zx=r*n*a+i*o,this.zy=r*o*a-i*n,this.zz=r*a*a+s,this}setScaling(t,e,s){return this.setIdentity(),this.xx=t,this.yy=e,this.zz=s,this}setTranslation(t,e,s){return this.setIdentity(),this.xw=t,this.yw=e,this.zw=s,this}multiply(t){var e=new se(this);return this.xx=e.xx*t.xx+e.xy*t.yx+e.xz*t.zx+e.xw*t.wx,this.xy=e.xx*t.xy+e.xy*t.yy+e.xz*t.zy+e.xw*t.wy,this.xz=e.xx*t.xz+e.xy*t.yz+e.xz*t.zz+e.xw*t.wz,this.xw=e.xx*t.xw+e.xy*t.yw+e.xz*t.zw+e.xw*t.ww,this.yx=e.yx*t.xx+e.yy*t.yx+e.yz*t.zx+e.yw*t.wx,this.yy=e.yx*t.xy+e.yy*t.yy+e.yz*t.zy+e.yw*t.wy,this.yz=e.yx*t.xz+e.yy*t.yz+e.yz*t.zz+e.yw*t.wz,this.yw=e.yx*t.xw+e.yy*t.yw+e.yz*t.zw+e.yw*t.ww,this.zx=e.zx*t.xx+e.zy*t.yx+e.zz*t.zx+e.zw*t.wx,this.zy=e.zx*t.xy+e.zy*t.yy+e.zz*t.zy+e.zw*t.wy,this.zz=e.zx*t.xz+e.zy*t.yz+e.zz*t.zz+e.zw*t.wz,this.zw=e.zx*t.xw+e.zy*t.yw+e.zz*t.zw+e.zw*t.ww,this.wx=e.wx*t.xx+e.wy*t.yx+e.wz*t.zx+e.ww*t.wx,this.wy=e.wx*t.xy+e.wy*t.yy+e.wz*t.zy+e.ww*t.wy,this.wz=e.wx*t.xz+e.wy*t.yz+e.wz*t.zz+e.ww*t.wz,this.ww=e.wx*t.xw+e.wy*t.yw+e.wz*t.zw+e.ww*t.ww,this}static makeRotationMatrix(t,e){return(new se).setRotation(t,e)}static makeScalingMatrix(t,e,s){return(new se).setScaling(t,e,s)}static makeTranslationMatrix(t,e,s){return(new se).setTranslation(t,e,s)}static makeTransformationMatrix(t,e,s,i,r,n,o,a,h){var l=(new se).setRotation({x:1,y:0,z:0},t),c=(new se).setRotation({x:0,y:1,z:0},e),d=(new se).setRotation({x:0,y:0,z:1},s),u=(new se).setScaling(i,r,n),g=(new se).setTranslation(o,a,h);return(new se).multiply(l).multiply(c).multiply(d).multiply(u).multiply(g)}clone(){return new se(this)}toJSON(){return'{\n\t"xx": '+this.xx+', "xy": '+this.xy+', "xz": '+this.xz+', "xw": '+this.xw+',\n\t"yx": '+this.yx+', "yy": '+this.yy+', "yz": '+this.yz+', "yw": '+this.yw+',\n\t"zx": '+this.zx+', "zy": '+this.zy+', "zz": '+this.zz+', "zw": '+this.zw+',\n\t"wx": '+this.wx+', "wy": '+this.wy+', "wz": '+this.wz+', "ww": '+this.ww+"\n}"}}class ie{constructor(t){this.current=t}}const re=()=>new ie(void 0);class ne{constructor(t){if(this.isDropdownOpen=!1,this.css_buttonWidth="100px",this.css_buttonHeight="1.8em",this.css_buttonFontSize="0.725em",this.css_buttonFontSize_larger="1.0em",this.colorGradients=[],this.colorGradientOptionRefs=[],this.selectedGradientIndex=-1,this.installedChangeListeners=[],this.__createCustomStylesElement=()=>(void 0)("style",null,`\n\n #${this.elementID} button {\n border: 0px solid lightgray;\n padding: 0.25em;\n /* background-color: rgba(255,255,255,0.9); */\n }\n\n #${this.elementID} .positioning-container button {\n border-radius: 0;\n }\n\n #${this.elementID} .main-button:hover {\n background-color: rgba(216,216,216,0.9);\n }\n\n #${this.elementID} .option-gradient-button:hover, #${this.elementID} .option-delete-button:hover {\n background-color: rgba(216,216,216,0.9);\n }\n\n\n `),(t=t||{}).containerID){const e=document.getElementById(t.containerID);if(!e)throw"Cannot create ColorGradientPicker. Component ID does not exist.";this.container=e}else this.container=document.createElement("div");this.isMobileMode=Boolean(t.isMobileMode),this.isMobileMode&&(this.css_buttonWidth="200px",this.css_buttonHeight="2.5em",this.css_buttonFontSize="1.25em",this.css_buttonFontSize_larger="1.45em"),this.baseID=Math.floor(65535*Math.random()),this.elementID=`color-gradient-selector-${this.baseID}`,this.colorGradients=void 0===t.initialGradients?ne.DEFAULT_COLOR_GRADIENTS:t.initialGradients,this.selectedGradientIndex=void 0===t.selectedGradientIndex?0:t.selectedGradientIndex,document.head.appendChild(this.__createCustomStylesElement()),this.container.append(this._render())}setGradients(t,e){this.__removeAllChildNodes(this.positioningContainerRef.current),this.colorGradients=[],this.colorGradientOptionRefs=[],this.selectedGradientIndex=e,t.map(t=>{this.addGradient(t)})}addGradient(t){const e=this.colorGradients.length,s=re(),i=re(),r=re();this.__renderOptionButton(t,e,s,i,r),this.colorGradients.push(t),this.colorGradientOptionRefs.push({mainButton:i,deleteButton:r}),this.positioningContainerRef.current.appendChild(s.current)}__removeAllChildNodes(t){for(;t.lastChild;)t.removeChild(t.lastChild)}addChangeListener(t){for(var e=0;e<this.installedChangeListeners.length;e++)if(this.installedChangeListeners[e]===t)return!1;return this.installedChangeListeners.push(t),!0}removeChangeListener(t){for(var e=0;e<this.installedChangeListeners.length;e++)if(this.installedChangeListeners[e]===t)return this.installedChangeListeners.splice(e,1),!0;return!1}getSelectedColorGradient(){return this.colorGradients[this.selectedGradientIndex]}__fireChangeEvent(){const t=this.getSelectedColorGradient();for(var e=0;e<this.installedChangeListeners.length;e++)this.installedChangeListeners[e](t,this.selectedGradientIndex,this)}__mainButtonClickHandler(){const t=this;return e=>{t.positioningContainerRef.current.style.visibility=t.isDropdownOpen?"hidden":"visible",t.isDropdownOpen=!t.isDropdownOpen}}__optionButtonClickHandler(){const t=this;return e=>{t.positioningContainerRef.current.style.visibility="hidden",t.isDropdownOpen=!1;const s=e.currentTarget,i=s.dataset.gradientIndex,r=Number.parseInt(i);console.log("clickedIndex",r,i,s.dataset,s),Number.isNaN(r)||(t.__setSelectedIndex(r),t.__fireChangeEvent())}}__optionButtonDeleteHandler(){return t=>{if(1===this.colorGradientOptionRefs.length)return;const e=t.currentTarget,s=e.dataset.gradientIndex,i=Number.parseInt(s);if(console.log("clickedIndex",i,s,e.dataset,e),Number.isNaN(i))return;console.log("this.colorGradientOptionRefs",this.colorGradientOptionRefs,"clickedIndex",i);this.colorGradientOptionRefs[i].mainButton.current.parentElement.remove(),this.colorGradients.splice(i,1),this.colorGradientOptionRefs.splice(i,1),this.__updateOptionDataSetIndices(i),this.selectedGradientIndex>=i&&this.__setSelectedIndex(this.selectedGradientIndex),console.log("All refs",this.colorGradientOptionRefs)}}__updateOptionDataSetIndices(t){for(var e=t;e<this.colorGradientOptionRefs.length;e++)this.colorGradientOptionRefs[e].mainButton.current.dataset.gradientIndex=`${e}`,this.colorGradientOptionRefs[e].deleteButton.current.dataset.gradientIndex=`${e}`}__setSelectedIndex(t){for(var e=0;e<this.colorGradientOptionRefs.length;e++){this.colorGradientOptionRefs[e].mainButton.current.querySelectorAll(".option-gradient-radio-circle")[0].innerHTML=t===e?"🞊":"🞅"}this.selectedGradientIndex=t;const s=this.colorGradients[this.selectedGradientIndex];this.__setMainButtonGradient(s)}__setMainButtonGradient(t){this.mainButtonContainerRef.current.querySelectorAll(".main-button-gradient-display")[0].style.background=t.toColorGradientString()}__renderOptionButton(t,e,s,i,r){return(void 0)("div",{sx:{d:"flex",flexDirection:"row"},ref:s},(void 0)("button",{className:"option-gradient-button",onClick:this.__optionButtonClickHandler(),style:{d:"flex",w:"100%",fontSize:this.css_buttonFontSize,minHeight:this.css_buttonHeight,maxHeight:this.css_buttonHeight},ref:i,"data-gradientIndex":`${e}`},(void 0)("div",{className:"option-gradient-radio-circle",sx:{w:"2em",flexShrink:2,alignContent:"center"}},0===e?"🞊":"🞅"),(void 0)("div",{sx:{w:"calc( 100% - 2em )",mr:"1em",background:t.toColorGradientString()}}," ")),(void 0)("button",{classname:"option-delete-button",sx:{fontSize:this.css_buttonFontSize,minHeight:this.css_buttonHeight,maxHeight:this.css_buttonHeight},onClick:this.__optionButtonDeleteHandler(),"data-gradientIndex":`${e}`,ref:r},(void 0)("div",{sx:{w:"2em",flexShrink:2,alignContent:"center"}},"🗑")))}_renderAllOptionButtons(){const t=this;return t.colorGradientOptionRefs=[],this.colorGradients.map((e,s)=>{const i=re(),r=re(),n=re();return t.colorGradientOptionRefs.push({mainButton:r,deleteButton:n}),this.__renderOptionButton(e,s,i,r,n)})}_render(){this.containerRef=re(),this.mainButtonContainerRef=re(),this.positioningContainerRef=re();const t=this.colorGradients[this.selectedGradientIndex];return(void 0)("div",{id:this.elementID,className:"color-gradient-selector",style:{minWidth:this.css_buttonWidth,maxWidth:this.css_buttonWidth,pos:"relative"},ref:this.containerRef},(void 0)("button",{className:"main-button",ref:this.mainButtonContainerRef,style:{d:"flex",minWidth:this.css_buttonWidth,maxWidth:this.css_buttonWidth,minHeight:this.css_buttonHeight,maxHeight:this.css_buttonHeight},onClick:this.__mainButtonClickHandler()},(void 0)("div",{className:"main-button-gradient-display",sx:{w:`calc( 100% - ${this.css_buttonFontSize} )`,background:t.toColorGradientString()}}," "),(void 0)("div",{sx:{w:this.css_buttonHeight,flexShrink:2,fontSize:this.css_buttonFontSize_larger}},"▾")),(void 0)("div",{className:"positioning-container",ref:this.positioningContainerRef,style:{minWidth:this.css_buttonWidth,maxHeight:"25vh",overflowY:"auto",v:"hidden",d:"flex",fd:"column",pos:"absolute",l:0,zIndex:999}},this._renderAllOptionButtons()))}}ne.DEFAULT_COLOR_GRADIENTS=[Ut.createDefault(),Ut.createFrom(Y.Red,Y.Green),Ut.createFrom(Y.Blue,Y.Gold)];const oe=(t,e)=>parseFloat(globalThis.getComputedStyle(t,null).getPropertyValue(e));class ae{constructor(t,e,s){s=s||{},this.pb=t,this.paths=[],this.onPointerMoved="function"==typeof s.onPointerMoved?s.onPointerMoved:(t,e,s,i)=>{},this.onVertexInserted="function"==typeof s.onVertexInserted?s.onVertexInserted:(t,e,s,i)=>{},this.onVerticesDeleted="function"==typeof s.onVerticesDeleted?s.onVerticesDeleted:(t,e,s,i)=>{},this.onPathRemoved="function"==typeof s.onPathRemoved?s.onPathRemoved:(t,e)=>{},this.autoAdjustPaths="boolean"==typeof s.autoAdjustPaths&&s.autoAdjustPaths,this.allowPathRemoval="boolean"!=typeof s.allowPathRemoval||s.allowPathRemoval,this.maxDetectDistance="number"==typeof s.maxDetectDistance?s.maxDetectDistance:Number.MAX_VALUE,this.mouseIsOver=!1,this.currentPathIndex=-1,this.currentDistance=Number.MAX_VALUE,this.currentT=0,this.currentA=new o(0,0),this.currentB=new o(0,0);for(var i=0;i<e.length;i++)this.addPath(e[i]);this._mouseEnterListener=()=>{this.mouseIsOver=!0},this._mouseLeaveListener=()=>{this.mouseIsOver=!1,this._clearMoveEvent()},this._mouseHandler=this._installMouseListener(),this._touchHandler=this._installTouchListener(),this._keyHandler=this._installKeyListener(),this.autoAdjustPaths&&t.redraw()}addPath(t){return-1==this._locatePath(t)&&(this.paths.push(t),this.autoAdjustPaths&&ae.setPathAutoAdjust(t),!0)}removePath(t){const e=this._locatePath(t);return-1!=e&&(this.removePathAt(e),!0)}removePathAt(t){const e=this.paths[t];this.paths=this.paths.filter((e,s)=>s!=t),this._removeDefaultPathListeners(e),this.pb.remove(e,!1,!0),this.onPathRemoved(t,e)}update(){this._handleMoveEvent(this.currentB.x,this.currentB.y)}drawHandleLines(t,e){t=t||this.pb.draw,e=e||this.pb.fill,this.paths.forEach(t=>{t.bezierCurves.forEach(t=>{this.pb.draw.line(t.startPoint,t.startControlPoint,"rgba(64,192,128,0.333)",1,{dashOffset:0,dashArray:[4,2]}),this.pb.draw.line(t.endPoint,t.endControlPoint,"rgba(64,192,128,0.333)",1,{dashOffset:0,dashArray:[4,2]})})})}destroy(){for(var t=0;t<this.paths.length;t++)this._removeDefaultPathListeners(this.paths[t]);this.paths=[],this.pb.eventCatcher.removeEventListener("mouseenter",this._mouseEnterListener),this.pb.eventCatcher.removeEventListener("mouseleave",this._mouseLeaveListener),this._mouseHandler.destroy(),this._keyHandler.destroy()}_locatePath(t){for(var e=0;e<this.paths.length;e++)if(this.paths[e]==t)return e;return-1}_handleDelete(){const t=this._handleSingleVertexDelete();if(this.allowPathRemoval)for(var e=t.length-1;e>=0;e--)this.removePathAt(t[e]);this.pb.redraw()}_handleSingleVertexDelete(){const t=[];for(var e=0;e<this.paths.length;e++){this._handleDeleteOnPath(e)&&t.push(e)}return t}_handleDeleteOnPath(t){const e=this.paths[t],s=[],i=[];let r=0;for(;r<e.bezierCurves.length&&e.bezierCurves[r].startPoint.attr.isSelected;)i.push(r),r++;if(r==e.bezierCurves.length)return!0;let n=e.bezierCurves[r].startPoint,o=e.bezierCurves[r].startControlPoint;for(var a=r;a<e.bezierCurves.length;a++)e.bezierCurves[a].endPoint.attr.isSelected?i.push(a):(s.push([n.clone(),e.bezierCurves[a].endPoint.clone(),o.clone(),e.bezierCurves[a].endControlPoint.clone()]),a+1<e.bezierCurves.length&&(n=e.bezierCurves[a].endPoint,o=e.bezierCurves[a+1].startControlPoint));if(0!=s.length&&s.length!=e.bezierCurves.length){const e=g.fromArray(s),r=this.paths[t];return this._replacePathAt(t,e),this.onVerticesDeleted(t,i,e,r),!1}return 0==s.length}_replacePathAt(t,e){const s=this.paths[t];this.pb.remove(s,!1,!0),s.destroy(),this._removeDefaultPathListeners(s),ae.setPathAutoAdjust(e),this.paths[t]=e,this.pb.add(e)}_handleMoveEvent(t,e){const s=this.currentA.clone(),i=this.currentB.clone(),r=this.currentDistance,n=this.pb.transformMousePosition(t,e);this.currentB.set(n),this._updateMinDistance(),this.currentDistance<=this.maxDetectDistance&&this.mouseIsOver&&0==this.pb.getDraggedElementCount()?this.onPointerMoved(this.currentPathIndex,this.currentA,this.currentB,this.currentT):this.onPointerMoved(-1,null,null,0),!(this.currentDistance<=this.maxDetectDistance||this.currentDistance>this.maxDetectDistance&&r<=this.maxDetectDistance)||s.equals(this.currentA)&&i.equals(this.currentB)||this.pb.redraw()}_clearMoveEvent(){this.onPointerMoved(-1,null,null,0),this.pb.redraw()}_installTouchListener(){var t=this;const e={touchStart:function(e){t.mouseIsOver=!0},touchMove:function(e){0==t.pb.getDraggedElementCount()&&e.touches.length>0&&t._handleMoveEvent(e.touches[0].clientX,e.touches[0].clientY)},touchEnd:function(e){t.mouseIsOver=!1,t._clearMoveEvent()}};return window.createAlloyFinger?window.createAlloyFinger((this.pb.eventCatcher,this.pb.eventCatcher),e):new I((this.pb.eventCatcher,this.pb.eventCatcher),e)}_installMouseListener(){var t=this,e=new A(this.pb.eventCatcher).up(function(e){if(e.params.wasDragged)return;if(t._keyHandler.isDown("shift"))return;if(t.currentDistance>t.maxDetectDistance||!t.mouseIsOver)return;const s=t.paths[t.currentPathIndex];if(t.pb.getVertexNear(e.params.pos,B.DEFAULT_CLICK_TOLERANCE))return;const i=s.getPointAt(t.currentT),r=t.pb.getVertexNear(t.pb.revertMousePosition(i.x,i.y),6);if(r)for(var n=0;n<s.bezierCurves.length;n++)if(s.bezierCurves[n].startPoint.distance(r)<=6||s.bezierCurves[n].endPoint.distance(r)<=6)return;const o=s.getSubPathAt(0,t.currentT),a=s.getSubPathAt(t.currentT,1),h=[];for(n=0;n<o.bezierCurves.length;n++)h.push(o.bezierCurves[n]);for(n=0;n<a.bezierCurves.length;n++)h.push(a.bezierCurves[n]);const l=g.fromArray(h),c=t.paths[t.currentPathIndex];t._replacePathAt(t.currentPathIndex,l),t.onVertexInserted(t.currentPathIndex,o.bezierCurves.length,l,c)}).move(function(e){t.mouseIsOver=!0,t._handleMoveEvent(e.params.pos.x,e.params.pos.y)});return this.pb.eventCatcher.addEventListener("mouseenter",this._mouseEnterListener),this.pb.eventCatcher.addEventListener("mouseleave",this._mouseLeaveListener),e}_installKeyListener(){var t=this;return new w({trackAll:!0}).down("delete",function(){t._handleDelete()})}_removeDefaultPathListeners(t){ae.removePathVertexDragListeners(t,this._updateMinDistance)}_updateMinDistance(){if(0==this.paths.length)return;let t=-1,e=Number.MAX_VALUE,s=null,i=0;for(var r=0;r<this.paths.length;r++){let n=this.paths[r],o=n.getClosestT(this.currentB),a=n.getPointAt(o),h=a.distance(this.currentB);h<e&&(t=r,e=h,i=o,s=a)}this.currentT=i,this.currentPathIndex=t,this.currentDistance=e,s&&this.currentA.set(s)}static setPathAutoAdjust(t){for(var e=0;e<t.bezierCurves.length;e++){const s=t.bezierCurves[e];t.adjustPredecessorControlPoint(e,!0,!1),(e>0||t.adjustCircular)&&(s.startPoint.attr.bezierAutoAdjust=!0)}t.updateArcLengths()}static addPathVertexDragStartListeners(t,e){for(var s=0;s<t.bezierCurves.length;s++){const i=t.bezierCurves[s];i.startPoint.listeners.addDragStartListener(e),i.startControlPoint.listeners.addDragStartListener(e),i.endControlPoint.listeners.addDragStartListener(e),s+1!=t.bezierCurves.length||t.adjustCircular||i.endPoint.listeners.addDragStartListener(e)}}static removePathVertexDragStartListeners(t,e){for(var s=0;s<t.bezierCurves.length;s++){const i=t.bezierCurves[s];i.startPoint.listeners.removeDragStartListener(e),i.startControlPoint.listeners.removeDragStartListener(e),i.endControlPoint.listeners.removeDragStartListener(e),s+1!=t.bezierCurves.length||t.adjustCircular||i.endPoint.listeners.removeDragStartListener(e)}}static addPathVertexDragListeners(t,e){for(var s=0;s<t.bezierCurves.length;s++){const i=t.bezierCurves[s];i.startPoint.listeners.addDragListener(e),i.startControlPoint.listeners.addDragListener(e),i.endControlPoint.listeners.addDragListener(e),s+1!=t.bezierCurves.length||t.adjustCircular||i.endPoint.listeners.addDragListener(e)}}static removePathVertexDragListeners(t,e){for(var s=0;s<t.bezierCurves.length;s++){const i=t.bezierCurves[s];i.startPoint.listeners.removeDragListener(e),i.startControlPoint.listeners.removeDragListener(e),i.endControlPoint.listeners.removeDragListener(e),s+1!=t.bezierCurves.length||t.adjustCircular||i.endPoint.listeners.removeDragListener(e)}}static addPathVertexDragEndListeners(t,e){for(var s=0;s<t.bezierCurves.length;s++){const i=t.bezierCurves[s];i.startPoint.listeners.addDragEndListener(e),i.startControlPoint.listeners.addDragEndListener(e),i.endControlPoint.listeners.addDragEndListener(e),s+1!=t.bezierCurves.length||t.adjustCircular||i.endPoint.listeners.addDragEndListener(e)}}static removePathVertexDragEndListeners(t,e){for(var s=0;s<t.bezierCurves.length;s++){const i=t.bezierCurves[s];i.startPoint.listeners.removeDragEndListener(e),i.startControlPoint.listeners.removeDragEndListener(e),i.endControlPoint.listeners.removeDragEndListener(e),s+1!=t.bezierCurves.length||t.adjustCircular||i.endPoint.listeners.removeDragEndListener(e)}}}const he=t=>{const e=t.match(/([ml]((\s?-?((\d+(\.\d+)?)|(\.\d+)))[,\s]?(-?((\d+(\.\d+)?)|(\.\d+))))+)|([hv]((\s?-?((\d+(\.\d+)?)|(\.\d+))))+)|(c((\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){5})+)|(q((\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){3})+(\s?(t?(\s?-?((\d+(\.\d+)?)|(\.\d+)))[,\s]?(-?((\d+(\.\d+)?)|(\.\d+))))*)+)|(a((\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){2}[,\s]?[01][,\s]+[01][,\s]+([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){2})+)|(s(\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){3})|z/gi);if(!e)return null;const s=[];for(var i=0;i<e.length;){const t=e[i].match(/-?(?:\d*\.)?\d+|[a-z]/gi);t&&s.push(t),i++}return s},le=Math.PI/180,ce=(t,e,s,i,r,n)=>{if(t.length<3)throw"Unsufficient params for MOVE";!e||isNaN(i.x)||isNaN(i.y)?(i.x=Number(t[1]),i.y=Number(t[2]),r.x=i.x,r.y=i.y):(i.x+=Number(t[1]),i.y+=Number(t[2]),r.x=i.x,r.y=i.y),isNaN(s.y)&&(s.x=i.x,s.y=i.y)},de=(t,e,s,i,r,n)=>{if(t.length<3)throw"Unsufficient params for LINETO";for(var a=1;a+1<t.length;a+=2){const h=new l(new o(i),new o(i));e?(h.b.x+=Number(t[a]),h.b.y+=Number(t[a+1])):(h.b.x=Number(t[a]),h.b.y=Number(t[a+1])),n.push(h),i.x=h.b.x,i.y=h.b.y,r.x=h.b.x,r.y=h.b.y,isNaN(s.y)&&(s.x=h.a.x,s.y=h.a.y),console.log("LINETO LINE",a,h.toString())}},ue=(t,e,s,i,r,n)=>{if(t.length<2)throw"Unsufficient params for HORIZONTALLINETO";for(var a=1;a<t.length;a++){const h=new l(new o(i),new o(i));e?h.b.x+=Number(t[a]):h.b.x=Number(t[a]),n.push(h),i.x=h.b.x,r.x=h.b.x,isNaN(s.y)&&(s.x=h.a.x,s.y=h.a.y)}},ge=(t,e,s,i,r,n)=>{if(t.length<2)throw"Unsufficient params for VERTICALLINETO";for(var a=1;a<t.length;a++){const h=new l(new o(i),new o(i));e?h.b.y+=Number(t[a]):h.b.y=Number(t[a]),n.push(h),i.y=h.b.y,r.y=h.b.y,isNaN(s.y)&&(s.x=h.a.x,s.y=h.a.y)}},fe=(t,e,s,i,r,n)=>{if(t.length<7)throw"Unsufficient params for CUBICBEZIERTO";for(var a=1;a+5<t.length;a+=6){const h=new u(new o(i),new o(i),new o(i),new o(i));e?(h.startControlPoint.x+=Number(t[a]),h.startControlPoint.y+=Number(t[a+1]),h.endControlPoint.x+=Number(t[a+2]),h.endControlPoint.y+=Number(t[a+3]),h.endPoint.x+=Number(t[a+4]),h.endPoint.y+=Number(t[a+5])):(h.startControlPoint.x=Number(t[a]),h.startControlPoint.y=Number(t[a+1]),h.endControlPoint.x=Number(t[a+2]),h.endControlPoint.y=Number(t[a+3]),h.endPoint.x=Number(t[a+4]),h.endPoint.y=Number(t[a+5])),n.push(h),i.x=h.endPoint.x,i.y=h.endPoint.y,r.x=h.endControlPoint.x,r.y=h.endControlPoint.y,isNaN(s.x)&&(s.x=h.startPoint.x,s.y=h.startPoint.y)}},xe=(t,e,s,i,r,n)=>{if(t.length<5)throw"Unsufficient params for QUADRATICBEZIERTO";for(var a=1,h={x:0,y:0};a+3<t.length&&"t"!==t[a]&&"T"!==t[a];){const l=new u(new o(i),new o(i),new o(i),new o(i));e?(l.startControlPoint.x+=l.startPoint.x+(Number(t[a])-l.startControlPoint.x),l.startControlPoint.y+=l.startPoint.y+(Number(t[a+1])-l.startControlPoint.y),l.endPoint.x+=Number(t[a+2]),l.endPoint.y+=Number(t[a+3]),l.endControlPoint.x=l.startControlPoint.x,l.endControlPoint.y=l.startControlPoint.y):(l.startControlPoint.x=l.startPoint.x+(Number(t[a])-l.startControlPoint.x),l.startControlPoint.y=l.startPoint.y+(Number(t[a+1])-l.startControlPoint.y),l.endPoint.x=Number(t[a+2]),l.endPoint.y=Number(t[a+3]),l.endControlPoint.x=l.startControlPoint.x,l.endControlPoint.y=l.startControlPoint.y),h={x:l.endControlPoint.x,y:l.endControlPoint.y},l.startControlPoint.x=l.startPoint.x+.666*(l.startControlPoint.x-l.startPoint.x),l.startControlPoint.y=l.startPoint.y+.666*(l.startControlPoint.y-l.startPoint.y),l.endControlPoint.x=l.endPoint.x+.666*(l.endControlPoint.x-l.endPoint.x),l.endControlPoint.y=l.endPoint.y+.666*(l.endControlPoint.y-l.endPoint.y),n.push(l),i.x=l.endPoint.x,i.y=l.endPoint.y,r.x=l.endControlPoint.x,r.y=l.endControlPoint.y,isNaN(s.x)&&(s.x=l.startPoint.x,s.y=l.startPoint.y),a+=4}if(a<t.length&&("t"==t[a]||"T"===t[a])){const e=t.slice(5);"T"===e[0]?pe(e,!1,s,i,r,h,n):"t"===e[0]&&pe(e,!0,s,i,r,h,n)}},pe=(t,e,s,i,r,n,a)=>{if(t.length<3)throw"Unsufficient params for SHORTHANDQUADRATICCURVETO";for(var h=1;h+1<t.length;){if("T"===t[h]||"t"===t[h]){h++;continue}const c=new u(new o(i),new o(i),new o(i),new o(i));e?(c.endPoint.x+=Number(t[h]),c.endPoint.y+=Number(t[h+1]),c.startControlPoint.x+=c.startPoint.x-(n.x-i.x),c.startControlPoint.y+=c.startPoint.y-(n.y-i.y)):(c.endPoint.x=Number(t[h]),c.endPoint.y=Number(t[h+1]),c.startControlPoint.x=c.startPoint.x-(n.x-i.x),c.startControlPoint.y=c.startPoint.y-(n.y-i.y)),c.endControlPoint.x=c.startControlPoint.x,c.endControlPoint.y=c.startControlPoint.y,n.y=c.endControlPoint.y,n.x=c.endControlPoint.x;var l=.666;c.startControlPoint.x=c.startPoint.x+(c.startControlPoint.x-c.startPoint.x)*l,c.startControlPoint.y=c.startPoint.y+(c.startControlPoint.y-c.startPoint.y)*l,c.endControlPoint.x=c.endPoint.x+(c.endControlPoint.x-c.endPoint.x)*l,c.endControlPoint.y=c.endPoint.y+(c.endControlPoint.y-c.endPoint.y)*l,a.push(c),i.x=c.endPoint.x,i.y=c.endPoint.y,r.x=c.endControlPoint.x,r.y=c.endControlPoint.y,isNaN(s.x)&&(s.x=c.startPoint.x,s.y=c.startPoint.y),h+=2}},ve=(t,e,s,i,r,n)=>{if(t.length<5)throw"Unsufficient params for SHORTHANDCUBICBEZIERTO";const a=new u(new o(i),new o(i),new o(i),new o(i));e?(a.startControlPoint.x=i.x-(r.x-i.x),a.startControlPoint.y=i.y-(r.y-i.y),a.endControlPoint.x+=Number(t[1]),a.endControlPoint.y+=Number(t[2]),a.endPoint.x+=Number(t[3]),a.endPoint.y+=Number(t[4])):(a.startControlPoint.x=i.x-(r.x-i.x),a.startControlPoint.y=i.y-(r.y-i.y),a.endControlPoint.x=Number(t[1]),a.endControlPoint.y=Number(t[2]),a.endPoint.x=Number(t[3]),a.endPoint.y=Number(t[4])),n.push(a),i.x=a.endPoint.x,i.y=a.endPoint.y,r.x=a.endControlPoint.x,r.y=a.endControlPoint.y,isNaN(s.x)&&(s.x=a.startPoint.x,s.y=a.startPoint.y)},me=(t,e,s,i,r,n)=>{if(t.length<8)throw"Unsufficient params for ARCTO";for(var o=1;o+6<t.length;o+=7){const h={x:Number(t[o+5]),y:Number(t[o+6])};e&&(h.x+=i.x,h.y+=i.y);const l=N.ellipseSectorUtils.endpointToCenterParameters(i.x,i.y,Number(t[o]),Number(t[o+1]),Number(t[o+2])*le,Boolean(t[o+3]),Boolean(t[o+4]),h.x,h.y).toCubicBezier(4);for(var a=0;a<l.length;a++)n.push(l[a]);if(l.length>0){const t=l[l.length-1];r.x=t.endControlPoint.x,r.y=t.endControlPoint.y,isNaN(s.x)&&(s.x=l[0].startPoint.x,s.y=l[0].startPoint.y)}i.x=h.x,i.y=h.y}},ye=(t,e,s,i,r,n)=>{const a=new l(new o(i),new o(s));n.push(a),i.x=a.b.x,i.y=a.b.y,r.x=a.b.x,r.y=a.b.y},be=t=>{if(void 0===t)throw new Error("Cannot parse positioning string `null`.");const e=t.trim();if(0===e.length)throw new Error('Cannot parse empty positioning string "".');if(!e.endsWith("%"))throw new Error(`Cannot parse positioning string, must end with '%': '${e}'`);return Number.parseFloat(e)/100},we=(t,e)=>{for(var s="",i=0;i<t.length;i++){const e=t[i];s+="string"==typeof e?e:e.source}return new RegExp(s,e)};var Ce=(t,e)=>{var s,i,r,n;if(t.gradientSearch.lastIndex=0,null!==(i=t.gradientSearch.exec(e)))for(s={original:i[0],colorStopList:[],line:null,angle:null,sideCorner:null},i[1]&&(s.line=i[1]),i[2]&&(s.angle=i[2]),i[3]&&(s.sideCorner=i[3]),t.colorStopSearch.lastIndex=0,r=t.colorStopSearch.exec(i[4]);null!==r;)n={color:r[1],position:null},r[2]&&(n.position=r[2]),s.colorStopList.push(n),r=t.colorStopSearch.exec(i[4]);return s};class Pe{constructor(t){this.regExpLib=t||(()=>{const t=/\s*,\s*/,e=/(?:[+-]?\d*\.?\d+)(?:%|[a-z]+)?/,s=we(["(?:",/\#(?:[a-f0-9]{6}|[a-f0-9]{3})/,"|","(?:rgb|hsl)",/\(\s*(?:\d{1,3}\s*,\s*){2}\d{1,3}\s*\)/,"|","(?:rgba|hsla)",/\(\s*(?:\d{1,3}\s*,\s*){2}\d{1,3}\s*,\s*\d*\.?\d+\)/,"|",/[_a-z-][_a-z0-9-]*/,")"],""),i=we([s,"(?:\\s+",e,"(?:\\s+",e,")?)?"],""),r=we(["(?:",i,t,")*",i],""),n=we(["(?:(",/(?:[+-]?\d*\.?\d+)(?:deg|grad|rad|turn)/,")|",/to\s+((?:(?:left|right)(?:\s+(?:top|bottom))?))/,")"],"");return{gradientSearch:we(["(?:(",n,")",t,")?(",r,")"],"gi"),colorStopSearch:we(["\\s*(",s,")","(?:\\s+","(",e,"))?","(?:",t,"\\s*)?"],"gi")}})()}parse(t,e){const s=this.parseRaw(t);return Pe.parseResultToColorGradient(s,e)}parseRaw(t){var e;const s=/.*gradient\s*\(((?:\([^\)]*\)|[^\)\(]*)*)\)/.exec(t),i=t.indexOf("("),r=-1===i?null:t.substring(0,i).toLowerCase();if(null===s)throw new Error("Failed to find gradient");return(e=Ce(this.regExpLib,s[1])).gradientType=r,e.original.trim()!==s[1].trim()&&(e.parseWarning=!0),e}static parseResultToColorGradient(t,e){if(!t.gradientType||"linear-gradient"!=t.gradientType.toLowerCase())throw new Error(`Cannot create linear gradient from type '${t.gradientType}'.`);if(!t.colorStopList||t.colorStopList.length<=1)throw new Error(`Cannot create linear gradient from color stop list of length '${t.colorStopList.length}'. Too few elements.`);const s=[],i=null!=e?e:be;for(var r=0;r<t.colorStopList.length;r++){const e=t.colorStopList[r];console.log(e);const o=Y.parse(e.color);var n;n=void 0===e.position?r/(t.colorStopList.length-1):i(e.position),s.push({color:o,ratio:n})}return new Ut(s,t.line)}}class Ae{constructor(t,e,s){this.x=t,this.y=e,this.z=s}}class _e{constructor(t,e,s){this.vert1=t,this.vert2=e,this.vert3=s}}exports.BezierPath=g,exports.BezierPathInteractionHelper=ae,exports.Blue=tt,exports.Bounds=d,exports.CatmullRomPath=class{constructor(t){this.vertices=t||[]}addPoint(t){this.vertices.push(t)}generateCurve(t,e){return void 0===e&&(e=1),t?this.solveClosed(e):this.solveOpen(e)}solveOpen(t){var e=[];null!=t&&void 0!==t||(t=1);for(var s=this.vertices.length,i=s-2,r=0;r<s-1;r++){var n=r?this.vertices[r-1]:this.vertices[0],a=this.vertices[r+0],h=this.vertices[r+1],l=r!==i?this.vertices[r+2]:h,c=new o(a.x+(h.x-n.x)/6*t,a.y+(h.y-n.y)/6*t),d=new o(h.x-(l.x-a.x)/6*t,h.y-(l.y-a.y)/6*t);e.push(new u(a,h,c,d))}return e}solveClosed(t){var e=[];null!=t&&void 0!==t||(t=1);for(var s=this.vertices.length,i=s-1,r=0;r<s;r++){var n=r?this.vertices[r-1]:this.vertices[i],a=this.vertices[r+0],h=this.vertices[(r+1)%s],l=this.vertices[(r+2)%s],c=new o(a.x+(h.x-n.x)/6*t,a.y+(h.y-n.y)/6*t),d=new o(h.x-(l.x-a.x)/6*t,h.y-(l.y-a.y)/6*t);e.push(new u(a,h,c,d))}return e}},exports.Circle=i,exports.CircleHelper=class{constructor(t,e){this.circle=t,this.radiusPoint=e,t.center.listeners.addDragListener(this.centerHandler=this._handleDragCenter()),e.listeners.addDragListener(this.radiusHandler=this._handleDragRadiusPoint())}drawHandleLines(t,e){}destroy(){this.circle.center.listeners.removeDragListener(this.centerHandler),this.radiusPoint.listeners.removeDragListener(this.radiusHandler)}_handleDragCenter(){const t=this;return e=>{t.radiusPoint.add(e.params.dragAmount)}}_handleDragRadiusPoint(){const t=this;return e=>{t.circle.radius=t.circle.center.distance(t.radiusPoint)}}},exports.CircleIntersections=gt,exports.CircleSector=f,exports.CircleSectorHelper=class{constructor(t,e,s,i){this.circleSector=t,this.controlPointStart=e,this.controlPointEnd=s,this.circleSector.circle.center.listeners.addDragListener(this.centerListener=this._handleDragCenter()),this.controlPointStart.listeners.addDragListener(this.radiusStartListener=this._handleDragStartControlPoint()),this.controlPointEnd.listeners.addDragListener(this.radiusEndListener=this._handleDragEndControlPoint())}_handleDragCenter(){const t=this;return e=>{t.controlPointStart.add(e.params.dragAmount),t.controlPointEnd.add(e.params.dragAmount)}}_handleDragStartControlPoint(){const t=this;return e=>{t.circleSector.circle.radius=t.circleSector.circle.center.distance(t.controlPointStart),t.controlPointEnd.set(t.circleSector.circle.vertAt(t.circleSector.endAngle)),t.circleSector.startAngle=t.circleSector.circle.center.angle(t.controlPointStart)}}_handleDragEndControlPoint(){const t=this;return e=>{t.circleSector.circle.radius=t.circleSector.circle.center.distance(t.controlPointEnd),t.controlPointStart.set(t.circleSector.circle.vertAt(t.circleSector.startAngle)),t.circleSector.endAngle=t.circleSector.circle.center.angle(t.controlPointEnd)}}drawHandleLines(t,e){t.line(this.circleSector.circle.center,this.controlPointStart,"rgba(64,192,128,0.333)",1,{dashOffset:0,dashArray:[4,2]}),t.line(this.circleSector.circle.center,this.controlPointEnd,"rgba(64,192,128,0.333)",1,{dashOffset:0,dashArray:[4,2]})}destroy(){this.circleSector.circle.center.listeners.removeDragListener(this.centerListener),this.controlPointStart.listeners.removeDragListener(this.radiusStartListener),this.controlPointEnd.listeners.removeDragListener(this.radiusEndListener)}},exports.CircularIntervalSet=ut,exports.Color=Y,exports.ColorGradient=Ut,exports.ColorGradientPicker=class{constructor(t,e){if(this._sliderElementRefs=[],this.sliderMin=0,this.sliderMax=100,this.isMobileMode=!1,this.css_indicatorWidth_num=1,this.css_indicatorWidth="1em",this.css_indicatorHeight="1em",this.css_thumbWidth="0.5em",this.css_thumbHeight="1.333em",this.css_containerHeight="20px",this.installedChangeListeners=[],this.__mouseDownPosition=null,this.__createSliderChangeHandler=()=>{const t=this;return e=>{const s=e.target;if(!s)return!1;const i=Number.parseFloat(s.value),r=s.dataset.rangeSliderIndex;if(!r)return!1;const n=Number.parseInt(r);var o=this.__getSliderValue(n-1,t.sliderMin),a=this.__getSliderValue(n+1,t.sliderMax);return o>=i?(s.value=`${o}`,t.__updateBackgroundGradient(),t.__updateColorIndicator(n),!1):a<=i?(s.value=`${a}`,t.__updateBackgroundGradient(),t.__updateColorIndicator(n),!1):(t.__updateBackgroundGradient(),t.__updateColorIndicator(n),!0)}},this.__createCustomStylesElement=()=>(void 0)("style",null,`\n #${this.elementID} {\n margin-top: 1em;\n }\n\n #${this.elementID} input[type='range'] {\n\n -webkit-appearance: none;\n\n grid-column: 1;\n grid-row: 2;\n \n /* same as before */\n background: none; /* get rid of white Chrome background */\n color: #000;\n font: inherit; /* fix too small font-size in both Chrome & Firefox */\n margin: 0;\n pointer-events: none; /* let clicks pass through */\n }\n\n #${this.elementID} input[type='range']::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n\n background: none; /* get rid of Firefox track background */\n height: 100%;\n width: 100%;\n\n pointer-events: none;\n }\n\n #${this.elementID} input[type='range']::-webkit-slider-thumb {\n -webkit-appearance: none;\n background: currentcolor;\n border: none; /* get rid of Firefox thumb border */\n border-radius: 6px; /* get rid of Firefox corner rounding */\n pointer-events: auto; /* catch clicks */\n width: ${this.css_thumbWidth}; \n height: ${this.css_thumbHeight};\n }\n\n #${this.elementID} input[type='range']:focus::-webkit-slider-thumb {\n border: 2px solid white;\n }\n\n #${this.elementID} input[type='range']::-moz-range-track {\n -webkit-appearance: none;\n background: none; /* get rid of Firefox track background */\n height: 100%;\n width: 100%;\n pointer-events: none;\n }\n\n #${this.elementID} input[type='range']::-moz-range-thumb {\n /* -webkit-appearance: none; */\n background: currentcolor;\n border: none; /* get rid of Firefox thumb border */\n border-radius: 6px; /* get rid of Firefox corner rounding */\n pointer-events: auto; /* catch clicks */\n width: ${this.css_thumbWidth}; \n height: ${this.css_thumbHeight};\n }\n\n #${this.elementID} input[type='range']:focus::-moz-range-thumb {\n border: 2px solid white;\n }\n\n #${this.elementID} input[type='range'] {\n /* same as before */\n z-index: 1;\n }\n \n #${this.elementID} input[type='range']:focus {\n z-index: 2;\n /* outline: dotted 1px orange; */\n color: darkorange;\n }\n\n body.darkmode #${this.elementID} .color-remove-button { \n background-color: #1e2937;\n color: grey;\n }\n\n body.darkmode #${this.elementID} .color-remove-button:hover,\n body.darkmode #${this.elementID} .color-remove-button:active { \n background-color: rgba(216,216,216,0.9);\n }\n\n `),t){const e=document.getElementById(t);if(!e)throw"Cannot create ColorGradientPicker. Component ID does not exist.";this.container=e}else this.container=document.createElement("div");this.baseID=Math.floor(65535*Math.random()),this.elementID=`color-gradient-picker-${this.baseID}`,this.colorGradient=Ut.createDefault(),this.isMobileMode=Boolean(e),e&&(this.css_indicatorWidth_num=2,this.css_indicatorWidth="2em",this.css_indicatorHeight="2em",this.css_thumbWidth="1.0em",this.css_thumbHeight="2.666em",this.css_containerHeight="40px"),document.head.appendChild(this.__createCustomStylesElement()),this.container.append(this._render()),this.__initializeDataSets(),this.__updateColorIndicator(0),this.__updateBackgroundGradient()}setGradient(t,e){this.__removeAllChildNodes(this.container),this.colorGradient=t,this.container.append(this._render()),this.__initializeDataSets(),this.__updateColorIndicator(0),this.__updateBackgroundGradient(),e&&this.__fireChangeEvent()}__removeAllChildNodes(t){for(;t.lastChild;)t.removeChild(t.lastChild)}__initializeDataSets(){for(var t=0;t<this._sliderElementRefs.length;t++){const e=this.colorGradient.values[t].color;this._sliderElementRefs[t].current.dataset.colorValue=e.cssRGB(),this._sliderElementRefs[t].current.dataset.colorValueHEX=e.cssHEX()}}addChangeListener(t){for(var e=0;e<this.installedChangeListeners.length;e++)if(this.installedChangeListeners[e]===t)return!1;return this.installedChangeListeners.push(t),!0}removeChangeListener(t){for(var e=0;e<this.installedChangeListeners.length;e++)if(this.installedChangeListeners[e]===t)return this.installedChangeListeners.splice(e,1),!0;return!1}__fireChangeEvent(){const t=this.getColorGradient();for(var e=0;e<this.installedChangeListeners.length;e++)this.installedChangeListeners[e](t,this)}__createColorRangeInput(t,e,s,i,r){const n=this.__createSliderChangeHandler(),o=re();return this._sliderElementRefs.splice(t,0,o),this.__updateSliderDataSetIndices(t+1),(void 0)("input",{id:`rage-slider-${this.baseID}-${t}`,type:"range",min:e,max:s,value:i,style:{pos:"absolute",l:"0px",t:"0px",w:"100%",h:"60%"},"data-range-slider-index":`${t}`,"data-colorValue":r.cssRGB(),"data-colorValueHEX":r.cssHEX(),onChange:n,onClick:n,ref:o})}getRangeLength(){return this.sliderMax-this.sliderMin}__colorChangeHandler(){const t=this;return e=>{const s=this.colorInputRef.current.dataset.activeSliderIndex;if(!s)return console.warn("Cannot update color indicator; no active range slider set. This is likely a program error and should not happen."),!1;const i=Number.parseInt(s);if(Number.isNaN(i)||i<0||i>=t._sliderElementRefs.length)return console.warn("Cannot update color indicator; active index invalid or out of bounds. This is likely a program error and should not happen.",i),!1;const r=t.colorInputRef.current.value;return t._sliderElementRefs[i].current.dataset.colorValue=r,this.colorIndicatorColorButtonRef.current.style["background-color"]=r,t.__updateBackgroundGradient(),t.__fireChangeEvent(),!0}}__handleRemoveColor(){const t=this.colorInputRef.current.dataset.activeSliderIndex;if(!t)return console.warn("Cannot remove color indicator; no active range slider set."),!1;const e=Number.parseInt(t);if(Number.isNaN(e)||e<0||e>=this._sliderElementRefs.length)return console.warn("Cannot remove color indicator; active index invalid or out of bounds.",e),!1;if(0===e||e+1===this.getRangeLength())return console.warn("Cannot remove color indicator; leftmost and rightmost slider must not be removed.",e),!1;return this._sliderElementRefs[e].current.remove(),this._sliderElementRefs.splice(e,1),this.__updateSliderDataSetIndices(e),this.__updateColorIndicator(e-1),this.__updateBackgroundGradient(),this.__fireChangeEvent(),!0}__updateSliderDataSetIndices(t){for(var e=t;e<this._sliderElementRefs.length;e++)this._sliderElementRefs[e].current.setAttribute("data-range-slider-index",`${e}`),this._sliderElementRefs[e].current.setAttribute("id",`rage-slider-${this.baseID}-${e}`)}__containerMouseDownHandler(){const t=this;return e=>{t.__mouseDownPosition={x:e.clientX,y:e.clientY}}}__containerClickHandler(){const t=this,e=.03*t.getRangeLength();return s=>{const i=t.__clickEventToRelativeValue(s);if(i<0||i>1)return;if(t.__mouseDownPosition&&Math.abs(t.__mouseDownPosition.x-s.clientX)>=10)return void(t.__mouseDownPosition=null);const r=this.__relativeToAbsolute(i),[n,o]=t.__locateClosestSliderValue(r);Math.abs(o-r)>=e&&t.__addSliderAt(r,n),t.__mouseDownPosition=null}}__locateClosestSliderValue(t){const e=this.__absoluteToRelative(t),s=this.colorGradient.locateClosestRatio(e);return[s[0],this.__relativeToAbsolute(s[1].ratio)]}__clickEventToRelativeValue(t){const e=t.target.getBoundingClientRect();return(t.clientX-e.left)/e.width}__addSliderAt(t,e){const s=this._sliderElementRefs[e].current,i=this.__getSliderColorAt(t),r=e+1;this.__createColorRangeInput(r,this.sliderMin,this.sliderMax,t,i);const n=this._sliderElementRefs[r];s.after(n.current),n.current.dataset.colorValue=i.cssRGB(),n.current.dataset.colorValueHEX=i.cssHEX(),this.__updateBackgroundGradient(),this.__updateColorIndicator(r),this.__fireChangeEvent()}__getSliderColorAt(t){const e=this.__locateIntervalAt(t),s=this.__getSliderValue(e,NaN),i=this.__getSliderValue(e+1,NaN);if(Number.isNaN(s)||Number.isNaN(i))return console.warn(`[Warn] Failed to determine left/right slider values at indices ${e} or ${i}. Cannot proceed for absolute value ${t}.`),null;const r=this.__getSliderColorString(e,null),n=this.__getSliderColorString(e+1,null);if(!r||!n)return console.warn(`[Warn] Failed to determine left/right color string values at indices ${e} or ${i}. Cannot proceed for absolute value ${t}.`),null;const o=(t-s)/(i-s),a=Y.parse(r),h=Y.parse(n);return a.interpolate(h,o)}__locateIntervalAt(t){for(var e=0;e+1<this._sliderElementRefs.length;e++)if(this.__getSliderValue(e,this.sliderMin)<=t&&t<this.__getSliderValue(e+1,this.sliderMax))return e;return-1}__relativeToAbsolute(t){return this.sliderMin+(this.sliderMax-this.sliderMin)*t}__absoluteToRelative(t){return(t-this.sliderMin)/(this.sliderMax-this.sliderMin)}__getSliderValue(t,e){return t<0||t>=this._sliderElementRefs.length?e:Number.parseFloat(this._sliderElementRefs[t].current.value)}__getAllSliderValues(){return this._sliderElementRefs.map((t,e)=>this.__getSliderValue(e,NaN))}__updateBackgroundGradient(){this.colorGradient=new Ut(this.__getAllSliderValues().map((t,e)=>({color:this.__getSliderColor(e,null),ratio:this.__absoluteToRelative(t)})),this.colorGradient.angle),this.containerRef.current.style.background=this.colorGradient.toColorGradientString()}__updateColorIndicator(t){const e=this.__getSliderColorHEXString(t,"#808080"),s=this.__getSliderPercentage(t);this.colorInputContainerRef.current.style.left=`calc( ${100*s}% + ${(1-s)*this.css_indicatorWidth_num*.5}em - ${s*this.css_indicatorWidth_num*.5}em)`,this.colorInputRef.current.style.left=`calc( ${100*s}% + ${(1-s)*this.css_indicatorWidth_num*.5}em - ${s*this.css_indicatorWidth_num*.5}em)`,this.colorIndicatorColorButtonRef.current.style["background-color"]=e,this.colorInputRef.current.value=e,this.colorInputRef.current.dataset.activeSliderIndex=`${t}`,t<=0||t+1>=this._sliderElementRefs.length?this.colorIndicatorRemoveButtonRef.current.style.visibility="hidden":this.colorIndicatorRemoveButtonRef.current.style.visibility="visible"}getColorGradient(){return this.colorGradient}__getSliderColorString(t,e){if(t<0||t>=this._sliderElementRefs.length)return e;const s=this._sliderElementRefs[t].current.dataset.colorValue;return s||e}__getSliderColorHEXString(t,e){if(t<0||t>=this._sliderElementRefs.length)return e;const s=this._sliderElementRefs[t].current.dataset.colorValueHEX;return s||e}__getSliderColor(t,e){if(t<0||t>=this._sliderElementRefs.length)return e;const s=this._sliderElementRefs[t].current.dataset.colorValue,i=Y.parse(s);return i||e}__getSliderPercentage(t){const e=this.__getSliderValue(t,0);return(this.sliderMin+e)/(this.sliderMax-this.sliderMin)}_render(){const t=this;this._sliderElementRefs=[],this.colorIndicatorColorButtonRef=re(),this.colorIndicatorRemoveButtonRef=re(),this.colorInputRef=re(),this.colorInputContainerRef=re(),this.containerRef=re();return(void 0)("div",{id:this.elementID,style:{d:"flex",fd:"column",w:"100%",h:this.css_containerHeight,pos:"relative",mb:this.isMobileMode?"5em":"3em"},ref:this.containerRef,onMouseDown:this.__containerMouseDownHandler(),onClick:this.__containerClickHandler()},this.colorGradient.values.map((e,s)=>{const i=t.__relativeToAbsolute(e.ratio);return this.__createColorRangeInput(s,this.sliderMin,this.sliderMax,i,e.color)}),(void 0)("div",{style:{w:"100%"}},(void 0)("input",{id:`color-indicator-input-${this.baseID}`,type:"color",style:{v:"hidden",pos:"absolute",l:0},ref:this.colorInputRef,onInput:this.__colorChangeHandler()}),(void 0)("div",{ref:this.colorInputContainerRef,style:{pos:"absolute",b:"0px",l:"0%",d:"flex",fd:"column",transform:"translate(0%, 100%)"}},(void 0)("button",{id:`color-indicator-button-${this.baseID}`,className:"color-indicator-button",style:{backgroundColor:"grey",borderRadius:"50%",border:"1px solid grey",w:this.css_indicatorWidth,h:this.css_indicatorHeight,transform:"translate(-50%, 0%)"},onClick:e=>{e.preventDefault(),e.stopPropagation(),t.colorInputRef.current.click()},ref:this.colorIndicatorColorButtonRef}),(void 0)("button",{id:`color-remove-button-${this.baseID}`,className:"color-remove-button",style:{borderRadius:"10%",border:"1px solid grey",w:this.css_indicatorWidth,h:this.css_indicatorHeight,transform:"translate(-50%, 50%)",lineHeight:"0.5em",p:0},onClick:e=>{e.preventDefault(),e.stopPropagation(),t.__handleRemoveColor()},ref:this.colorIndicatorRemoveButtonRef},(void 0)("span",{style:{fontSize:this.isMobileMode?"1.0em":"0.5em"}},"🗑")))))}},exports.ColorGradientSelector=ne,exports.ContourLineDetection=Ct,exports.CubicBezierCurve=u,exports.CubicSplinePath=Lt,exports.Cyan=st,exports.DataGrid2dArrayMatrix=Dt,exports.DataGrid2dListAdapter=class{constructor(t,e,s){if(e*s>t.length)throw`Cannot create DataGrid2dListAdapter, the list (length ${t.length}) does not provide enough items for ${e}x${s} required entries.`;this.xSegmentCount=e,this.ySegmentCount=s,this._dataList=t}getIndicesFromBufferIndex(t){return{xIndex:Math.floor(t%this.xSegmentCount),yIndex:Math.floor(t/this.xSegmentCount)}}getCoordsFromBufferIndex(t){var e=this.getIndicesFromBufferIndex(t);return e.xRel=e.xIndex/(this.xSegmentCount-1),e.yRel=e.yIndex/(this.ySegmentCount-1),e}coordinateIndicesToBufferIndex(t,e){return e*this.xSegmentCount+t}getMinDataValue(){return this.minDataValue}getMaxDataValue(){return this.maxDataValue}getDataValueAt(t,e,s){var i=this.coordinateIndicesToBufferIndex(t,e);return i>this._dataList.length&&console.error("ERR buffer index is out of bounds! xIndex",t,"yIndex",e,"bufferIndex",i),this._dataList[i]||console.error("ERR buffer element is null! xIndex",t,"yIndex",e,"bufferIndex",i),this._dataList&&i<this._dataList.length?this._dataList[i].z:null}getDataFace4At(t,e,s){s[0][0]=this.getDataValueAt(t,e),s[1][0]=this.getDataValueAt(t+1,e),s[1][1]=this.getDataValueAt(t+1,e+1),s[0][1]=this.getDataValueAt(t,e+1)}},exports.DeepPurple=Z,exports.DefaultPositionConverter=be,exports.Delaunay=class{constructor(t){this.pointList=t}triangulate(){return this.Triangulate(this.pointList)}Triangulate(t){const e=[];var s=this.createBoundingTriangle(t);for(var i in e.push(s),t)this.AddVertex(t[i],e);for(var i in e){var r=e[i];r.a!=s.a&&r.a!=s.b&&r.a!=s.c&&r.b!=s.a&&r.b!=s.b&&r.b!=s.c&&r.c!=s.a&&r.c!=s.b&&r.c!=s.c||delete e[i]}return e}createBoundingTriangle(t){var e,s,i,n;for(var a in t){var h=t[a];(void 0===e||h.x<e)&&(e=h.x),(void 0===s||h.y<s)&&(s=h.y),(void 0===i||h.x>i)&&(i=h.x),(void 0===n||h.y>n)&&(n=h.y)}var l=10*(i-e),c=10*(n-s),d=new o(e-l,s-3*c),u=new o(e-l,n+c),g=new o(i+3*l,n+c);return new r(d,u,g)}AddVertex(t,e){var s=[];for(var i in e){var n=e[i];n.inCircumcircle(t)&&(s.push(new l(n.a,n.b)),s.push(new l(n.b,n.c)),s.push(new l(n.c,n.a)),delete e[i])}for(var i in s=this.mkUniqueEdges(s)){var o=s[i];e.push(new r(o.a,o.b,t))}}mkUniqueEdges(t){const e=[];for(var s in t){let r=t[s],n=!0;for(var i in t)if(s!=i){let e=t[i];if(r.a==e.a&&r.b==e.b||r.a==e.b&&r.b==e.a){n=!1;break}}n&&e.push(r)}return e}},exports.FileDrop=class{constructor(t){this.handleDropEvent=t=>{if(t.preventDefault(),t.stopPropagation(),this.element.style.opacity="1.0",t.dataTransfer&&t.dataTransfer.files&&0!==t.dataTransfer.files.length&&!(t.dataTransfer.files.length>1)&&t.dataTransfer.files[0]){const s=t.dataTransfer.files[0];if(s.type.match(/json.*/)&&null!==this.fileDroppedCallbackJSON)(e=new FileReader).onload=t=>{if(!t.target)return void console.warn("Cannot process JSON ProgressEvent data: target is null.");const e=JSON.parse(t.target.result);this.fileDroppedCallbackJSON&&this.fileDroppedCallbackJSON(e)},e.readAsText(s);else if(s.type.match(/text\/plain.*/)&&this.fileDroppedCallbackText){(e=new FileReader).onload=t=>{t.target?this.fileDroppedCallbackText&&this.fileDroppedCallbackText(t.target.result):console.warn("Cannot process Text ProgressEvent data: target is null.")},e.readAsText(s)}else if(this.fileDroppedCallbackBinary){(e=new FileReader).onload=t=>{t.target?this.fileDroppedCallbackBinary&&this.fileDroppedCallbackBinary(new Blob([t.target.result]),s):console.warn("Cannot process Binary ProgressEvent data: target is null.")},e.readAsBinaryString(s)}else if(this.fileDroppedCallbackSVG){var e;(e=new FileReader).onload=t=>{if(!t.target)return void console.warn("Cannot process SVG ProgressEvent data: target is null.");const e=(new DOMParser).parseFromString(t.target.result,"image/svg+xml");this.fileDroppedCallbackSVG&&this.fileDroppedCallbackSVG(e)},e.readAsText(s)}}},this.handleDragOverEvent=t=>{t.preventDefault(),t.stopPropagation(),this.element.style.opacity="0.5"},this.handleDragLeaveEvent=t=>{t.preventDefault(),t.stopPropagation(),this.element.style.opacity="1.0"},this.element=t,t.addEventListener("drop",this.handleDropEvent.bind(this)),t.addEventListener("dragover",this.handleDragOverEvent.bind(this)),t.addEventListener("dragleave",this.handleDragLeaveEvent.bind(this))}onFileJSONDropped(t){this.fileDroppedCallbackJSON=t}onFileTextDropped(t){this.fileDroppedCallbackText=t}onFileSVGDropped(t){this.fileDroppedCallbackSVG=t}onFileBinaryDropped(t){this.fileDroppedCallbackBinary=t}destroy(){this.element.removeEventListener("drop",this.handleDropEvent),this.element.removeEventListener("dragover",this.handleDragOverEvent),this.element.removeEventListener("dragleave",this.handleDragLeaveEvent)}},exports.GenericPath=vt,exports.GeometryMesh=class{constructor(t,e){this.vertices=t||[],this.edges=e||[]}normalize(){var t={x:-1,y:-1,z:-1},e={x:1,y:1,z:1},s=this.getGeometryBounds(),i=s.max.x-s.min.x,r=s.max.y-s.min.y,n=s.max.z-s.min.z,o=Math.max(i,r,n),a=(e.x-t.x)/o,h=(e.y-t.y)/o,l=(e.z-t.z)/o;for(var c in this.vertices){var d=this.vertices[c];d.x=t.x+(s.max.x-d.x)*a,d.y=t.y+(s.max.y-d.y)*h,d.z=t.z+(s.max.z-d.z)*l}}getGeometryBounds(){var t={x:Number.MAX_VALUE,y:Number.MAX_VALUE,z:Number.MAX_VALUE},e={x:Number.MIN_VALUE,y:Number.MIN_VALUE,z:Number.MIN_VALUE};for(var s in this.vertices){var i=this.vertices[s];t.x=Math.min(i.x,t.x),t.y=Math.min(i.y,t.y),t.z=Math.min(i.z,t.z),e.x=Math.max(i.x,e.x),e.y=Math.max(i.y,e.y),e.z=Math.max(i.z,e.z)}return{min:t,max:e,width:e.x-t.x,height:e.y-t.y,depth:e.z-t.z}}},exports.Girih=class{constructor(t){this.edgeLength=t,this.TILE_TEMPLATES=[],this.tiles=[],this.initTemplates(t)}initTemplates(t){var e=new Kt(new o(0,0),t),s=new te(new o(0,0),t),i=new Zt(new o(0,0),t),r=new Jt(new o(0,0),t),n=new ee(new o(0,0),t),a=new Qt(new o(0,0),t,!0);this.TILE_TEMPLATES.push(e),this.TILE_TEMPLATES.push(e.transformTilePositionToAdjacency(2,s)),this.TILE_TEMPLATES.push(s.transformTilePositionToAdjacency(1,a)),this.TILE_TEMPLATES.push(a.transformTilePositionToAdjacency(3,i)),this.TILE_TEMPLATES.push(e.transformTilePositionToAdjacency(5,r)),this.TILE_TEMPLATES.push(s.transformTilePositionToAdjacency(4,n))}addTile(t){this.tiles.push(t)}removeTileAt(t){this.tiles.splice(t,1)}removeAllTiles(){this.tiles.splice(0,this.tiles.length)}replaceTiles(t){for(var e in this.tiles.splice(0,this.tiles.length),t)this.addTile(t[e])}getTileByCenter(t){for(var e=0;e<this.tiles.length;e++){const s=this.tiles[e].position;if(s===t||s.x==t.x&&s.y==t.y)return this.tiles[e]}return null}locateConatiningTile(t){for(var e=0;e<this.tiles.length;e++)if(this.tiles[e].containsVert(t))return e;return-1}locateContainingTileAndEdge(t){var e=this.locateConatiningTile(t),s=-1,i=-1;if(-1==e)return null;var r=e;do{-1!=(i=this.tiles[r].locateEdgeAtPoint(t,this.edgeLength/2))&&(s=r),r++}while(r<this.tiles.length&&-1==e&&-1==i);return-1==s&&(s=e),-1==s||-1==i?null:{tileIndex:s,edgeIndex:i}}turnTile(t,e){if(-1==t)return;const s=this.tiles[t];s.rotate(e*Math.PI*2/s.symmetry)}moveTile(t,e,s){if(-1==t)return;this.tiles[t].move({x:10*e,y:10*s})}findPossibleAdjacentTiles(t,e){var s=[];if(-1==t||-1==e)return[];let i=null;for(var r in this.TILE_TEMPLATES){i=this.TILE_TEMPLATES[r].clone();const n=this.tiles[t].transformTileToAdjacencies(e,i);0!=n.length&&(s=s.concat(n))}return s}},exports.GirihBowtie=Jt,exports.GirihDecagon=Kt,exports.GirihHexagon=Zt,exports.GirihPenroseRhombus=Qt,exports.GirihPentagon=te,exports.GirihRhombus=ee,exports.GirihTile=Xt,exports.Green=rt,exports.Grid=b,exports.HobbyPath=Tt,exports.Indigo=Q,exports.InitializationObserver=class{constructor(t,e){this._acceptRejectPairs=[],this._timeoutMessage=null!=e?e:null,globalThis.setTimeout(()=>{var t;this._isInitialized||(this._timeoutMessage||console.warn("Failed to initialize object. Reason unknown."),this._fireReject(null!==(t=this._timeoutMessage)&&void 0!==t?t:null))},t)}accept(t){this._isInitialized||(this._isInitialized=!0,this._initializedValue=t,this._fireAccept(t))}_fireAccept(t){this._acceptRejectPairs.forEach(e=>{e.accept(t)})}_fireReject(t){this._acceptRejectPairs.forEach(e=>{e.reject(t)})}waitForInitialized(){const t=this;return t._isInitialized?new Promise((e,s)=>{e(t._initializedValue)}):new Promise((e,s)=>{t._acceptRejectPairs.push({accept:e,reject:s})})}},exports.KeyHandler=w,exports.LightBlue=et,exports.LightGreen=nt,exports.Line=l,exports.LinearColorGradientParser=Pe,exports.LissajousFigure=class{constructor(t,e,s,i){this.freqA=t,this.freqB=e,this.phaseA=s,this.phaseB=i}getPointAt(t){return new o(Math.sin(this.phaseA+this.freqA*t),Math.sin(this.phaseB+this.freqB*t))}toPolyLine(t){const e=[];let s=new o(0,0);t=Math.abs(t);for(var i=0;i<=2*Math.PI;i+=t)s=this.getPointAt(i),e.push(s.clone());return e}toQuadraticBezierApproximation(t){const e=[];let s=new o(0,0),i=new o(0,0);t=Math.abs(t);let r,n,a,h,l,c,d,u=new o(0,0),g=this.freqA,f=this.freqB;s=this.getPointAt(t);for(var x=0,p=t;p<=2*Math.PI+2*t;p+=t)r=Math.sin(this.phaseA+this.freqA*p),n=Math.sin(this.phaseB+this.freqB*p),a=this.freqA*Math.cos(this.phaseA+this.freqA*p),h=this.freqB*Math.cos(this.phaseB+this.freqB*p),l=g*h-f*a,Math.abs(l)>.1?(c=((r*h-n*a)*g-(u.x*f-u.y*g)*a)/l,d=((r*h-n*a)*f-(u.x*f-u.y*g)*h)/l,i.set(r,n),x>0&&e.push([s.clone(),new o(c,d),i.clone()])):(i.set(r,n),x>0&&e.push([s.clone(),i.clone()])),u.set(r,n),g=a,f=h,s.set(i),x++;return e}},exports.Matrix4x4=se,exports.Metaballs=class{constructor(t){this.circleIsFullyContained=[],this.inputCircles=[],this.circlesOfInterest=[],this.containingCircles=[],this.inverseCirclesPairs=[],this.inputCircles=t}rebuild(t){this.detectContainmentStatus(),this.rebuildContainingCircles(t),this.inverseCirclesPairs=[];const e=gt.buildRadicalLineMatrix(this.containingCircles);for(var s=0;s<this.containingCircles.length;s++)for(var r=this.containingCircles[s],n=this.circlesOfInterest[s],o=s+1;o<this.containingCircles.length;o++){var a=e[s][o];if(null!=a){var h=this.containingCircles[o],l=this.circlesOfInterest[o],c=new i(a.a,t.metaRadiusAddon),d=new i(a.b,t.metaRadiusAddon),u=null!=c.circleIntersection(d),g=[n.closestPoint(c.center),n.closestPoint(d.center)],f=[l.closestPoint(c.center),l.closestPoint(d.center)];this.inverseCirclesPairs.push({baseCircleIndexA:s,baseCircleIndexB:o,baseCircleA:this.circlesOfInterest[s],baseCircleB:this.circlesOfInterest[o],circleA:r,inverseCircleA:c,circleB:h,inverseCircleB:d,doIntersect:u,circlePointsA:g,circlePointsB:f})}}}checkCircleFullyContained(t){for(var e=0;e<this.inputCircles.length;e++)if(t!=e&&this.inputCircles[e].containsCircle(this.inputCircles[t]))return!0;return!1}detectContainmentStatus(){this.circleIsFullyContained=[],this.circlesOfInterest=[];for(var t=0;t<this.inputCircles.length;t++)this.circleIsFullyContained[t]=this.checkCircleFullyContained(t),this.circleIsFullyContained[t]||this.circlesOfInterest.push(this.inputCircles[t])}rebuildContainingCircles(t){this.containingCircles=[];for(var e=0;e<this.circlesOfInterest.length;e++){var s=new i(this.circlesOfInterest[e].center,this.circlesOfInterest[e].radius+t.metaRadiusAddon);this.containingCircles.push(s)}}},exports.MouseHandler=A,exports.NGons=R,exports.OBJParser=class{constructor(t,e){this.handleVert=t,this.handleFace=e}_seekEOL(t,e){for(;e<t.length&&13!==t[e]&&10!==t[e];)e++;return e}_handleLine(t,e){if(""!==t&&!t.startsWith("#")){var s=t.split(/\s+/g);if("v"===s[0]){if(s.length<4)return void console.warn("Parse error in line "+e+": too few arguments",t);this.handleVert(Number(s[1]),Number(s[2]),Number(s[3]))}else if("f"===s[0]){if(s.length<4)return void console.warn("Parse error in line "+e+": too few arguments",t);for(var i=[],r=1;r<4;r++){var n=s[r].split("/");i.push(Number(n[0]))}this.handleFace(i[0],i[1],i[2])}}}parse(t){const e=new Int8Array(t);var s=0,i=0,r=0;do{i=this._seekEOL(e,s);var n=e.slice(s,i),o=String.fromCharCode.apply(null,n);this._handleLine(o.trim(),r),s=i+1,r++}while(i<t.byteLength)}},exports.PBImage=_,exports.PBText=S,exports.Params=class{constructor(t){this.baseParams=t}hasParam(t){return this.baseParams.hasOwnProperty(t)}getString(t,e,s){let i=this.baseParams[t];return void 0!==i&&i&&0!==(i=i.trim()).length?s&&!s(i)?e:i:e}getNumber(t,e,s){let i=this.baseParams[t];if(void 0===i||!i||0===(i=i.trim()).length)return e;var r=Number(i);return s&&!s(r)?e:r}getBoolean(t,e){let s=this.baseParams[t];return void 0!==s&&s&&0!==(s=s.trim()).length?(s=s.toLocaleLowerCase(),"1"===s||"on"===s||"yes"===s||"y"===s||"hi"===s||"high"==s||"0"!==s&&"off"!==s&&"no"!==s&&"n"!==s&&"lo"!==s&&"low"!=s&&Boolean(s)):e}},exports.PerlinNoise=class{constructor(){this.perm=new Array(512),this.gradP=new Array(512),this.seed(0)}seed(t){t>0&&t<1&&(t*=65536),(t=Math.floor(t))<256&&(t|=t<<8);for(var e=0;e<256;e++){var s;s=1&e?O[e]^255&t:O[e]^t>>8&255,this.perm[e]=this.perm[e+256]=s,this.gradP[e]=this.gradP[e+256]=V[s%12]}return this}simplex2(t,e){const s=(t+e)*H;var i=Math.floor(t+s),r=Math.floor(e+s);const n=(i+r)*F,o=t-i+n,a=e-r+n;var h,l;o>a?(h=1,l=0):(h=0,l=1);const c=o-h+F,d=a-l+F,u=o-1+2*F,g=a-1+2*F;i&=255,r&=255;const f=this.gradP[i+this.perm[r]],x=this.gradP[i+h+this.perm[r+l]],p=this.gradP[i+1+this.perm[r+1]];var v=.5-o*o-a*a,m=.5-c*c-d*d,y=.5-u*u-g*g;return 70*((v<0?0:(v*=v)*v*f.dot2(o,a))+(m<0?0:(m*=m)*m*x.dot2(c,d))+(y<0?0:(y*=y)*y*p.dot2(u,g)))}simplex3(t,e,s){const i=(t+e+s)*$;var r=Math.floor(t+i),n=Math.floor(e+i),o=Math.floor(s+i);const a=(r+n+o)*W,h=t-r+a,l=e-n+a,c=s-o+a;var d,u,g,f,x,p;h>=l?l>=c?(d=1,u=0,g=0,f=1,x=1,p=0):h>=c?(d=1,u=0,g=0,f=1,x=0,p=1):(d=0,u=0,g=1,f=1,x=0,p=1):l<c?(d=0,u=0,g=1,f=0,x=1,p=1):h<c?(d=0,u=1,g=0,f=0,x=1,p=1):(d=0,u=1,g=0,f=1,x=1,p=0);const v=h-d+W,m=l-u+W,y=c-g+W,b=h-f+2*W,w=l-x+2*W,C=c-p+2*W,P=h-1+.5,A=l-1+.5,_=c-1+.5;r&=255,n&=255,o&=255;const S=this.gradP[r+this.perm[n+this.perm[o]]],T=this.gradP[r+d+this.perm[n+u+this.perm[o+g]]],L=this.gradP[r+f+this.perm[n+x+this.perm[o+p]]],E=this.gradP[r+1+this.perm[n+1+this.perm[o+1]]];var M=.5-h*h-l*l-c*c,I=.5-v*v-m*m-y*y,D=.5-b*b-w*w-C*C,N=.5-P*P-A*A-_*_;return 32*((M<0?0:(M*=M)*M*S.dot3(h,l,c))+(I<0?0:(I*=I)*I*T.dot3(v,m,y))+(D<0?0:(D*=D)*D*L.dot3(b,w,C))+(N<0?0:(N*=N)*N*E.dot3(P,A,_)))}perlin2(t,e){var s=Math.floor(t),i=Math.floor(e);const r=t-s,n=e-i;s&=255,i&=255;const o=this.gradP[s+this.perm[i]].dot2(r,n),a=this.gradP[s+this.perm[i+1]].dot2(r,n-1),h=this.gradP[s+1+this.perm[i]].dot2(r-1,n),l=this.gradP[s+1+this.perm[i+1]].dot2(r-1,n-1),c=q(r);return j(j(o,h,c),j(a,l,c),q(n))}perlin3(t,e,s){var i=Math.floor(t),r=Math.floor(e),n=Math.floor(s);const o=t-i,a=e-r,h=s-n;i&=255,r&=255,n&=255;const l=this.gradP[i+this.perm[r+this.perm[n]]].dot3(o,a,h),c=this.gradP[i+this.perm[r+this.perm[n+1]]].dot3(o,a,h-1),d=this.gradP[i+this.perm[r+1+this.perm[n]]].dot3(o,a-1,h),u=this.gradP[i+this.perm[r+1+this.perm[n+1]]].dot3(o,a-1,h-1),g=this.gradP[i+1+this.perm[r+this.perm[n]]].dot3(o-1,a,h),f=this.gradP[i+1+this.perm[r+this.perm[n+1]]].dot3(o-1,a,h-1),x=this.gradP[i+1+this.perm[r+1+this.perm[n]]].dot3(o-1,a-1,h),p=this.gradP[i+1+this.perm[r+1+this.perm[n+1]]].dot3(o-1,a-1,h-1),v=q(o),m=q(a),y=q(h);return j(j(j(l,g,v),j(c,f,v),y),j(j(d,x,v),j(u,p,v),y),m)}},exports.Pink=J,exports.PlotBoilerplate=B,exports.Polygon=c,exports.PolygonInset=Ft,exports.PolygonTesselationOutlines=Wt,exports.Purple=K,exports.Red=X,exports.STLParser=class{constructor(t){this.handleFacet=t}_parseSTLString(t){const e=t.match(/facet\s+normal\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+outer\s+loop\s+vertex\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+vertex\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+vertex\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+endloop\s+endfacet/g);if(!e)throw"[STLParser] Failed to parse STL input; regex could not match.";const s=this.handleFacet;e.forEach(t=>{const e=new _e,i=t.match(/vertex\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s+([-+]?\b(?:[0-9]*\.)?[0-9]+(?:[eE][-+]?[0-9]+)?\b)\s/g);i?i.forEach((t,s)=>{const i=t.replace("vertex","").match(/[-+]?[0-9]*\.?[0-9]+/g);if(i){const t=new Ae(Number(i[0]),Number(i[1]),Number(i[2]));switch(s){case 0:e.vert1=t;break;case 1:e.vert2=t;break;case 2:e.vert3=t;break;default:console.warn("[STLParse] Warning, vertex component index unexpeced.",s)}}else console.warn("[STLParser] Failed to parse vertex value.",i)}):console.warn("[STLParser] Could not parse vertex values.",i),e.vert1&&e.vert2&&e.vert3?s(e.vert1,e.vert2,e.vert3):console.warn("[STLParse] Warning, cannot add vertex to mesh. vertex not fully defined.")})}_parseSTLBinary(t){const e=!0,s=new DataView(t,80,4).getUint32(0,e);for(var i=0;i<s;i++){const s=new DataView(t,84+50*i,50),o=new Ae(s.getFloat32(0,e),s.getFloat32(4,e),s.getFloat32(8,e)),a=new _e;for(var r=3;r<12;r+=3){var n=new Ae(s.getFloat32(4*r,e),s.getFloat32(4*(r+1),e),s.getFloat32(4*(r+2),e));const t=r/3;switch(t){case 1:a.vert1=n;break;case 2:a.vert2=n;break;case 3:a.vert3=n;break;default:console.warn("[STLParser] Warning, binary vertex component index unexpeced.",t)}}a.vert1&&a.vert2&&a.vert3?this.handleFacet(a.vert1,a.vert2,a.vert3,o):console.warn("[STLParser] Warning, cannot add binary vertex to mesh. vertex not fully defined.")}}parse(t){for(var e=!0,s=0,i=t.length;s<i&&e;s++)if(t.charCodeAt(s)>127){e=!1;break}if(e)this._parseSTLString(t.toString());else{const e=(t=>{const e=new ArrayBuffer(t.length),s=new Uint8Array(e);for(var i=0;i<t.length;++i)s[i]=t.charCodeAt(i);return e})(t);this._parseSTLBinary(e)}}},exports.SVGPathUtils=U,exports.Teal=it,exports.Triangle=r,exports.TriangleHelper=class{constructor(t,e){this.triangle=t,t.a.listeners.addDragListener(this.handlerA=this._handleTrianglePoint(this.triangle.a,this.triangle.b,this.triangle.c)),t.b.listeners.addDragListener(this.handlerB=this._handleTrianglePoint(this.triangle.b,this.triangle.c,this.triangle.a)),t.c.listeners.addDragListener(this.handlerC=this._handleTrianglePoint(this.triangle.c,this.triangle.a,this.triangle.b)),e&&this.handlerC(null)}drawHandleLines(t,e){}destroy(){this.triangle.a.listeners.removeDragListener(this.handlerA),this.triangle.b.listeners.removeDragListener(this.handlerB),this.triangle.c.listeners.removeDragListener(this.handlerC)}_handleTrianglePoint(t,e,s){return i=>{const r=new h(t,e),n=r.vertAt(.5),o=r.perp().add(n).sub(r.a);o.setLength(r.length()*Math.sqrt(3)/2),s.set(o.b)}}},exports.UIDGenerator=e,exports.VEllipse=D,exports.VEllipseHelper=class{constructor(t,e){this.ellipse=t,this.rotationControlPoint=e,this._rotationControlLine=new l(t.center,e),t.center.listeners.addDragListener(this._centerPointHandler=this._handleDragCenterPoint()),e.listeners.addDragListener(this._rotationPointHandler=this._handleRotationCenterPoint())}_handleDragCenterPoint(){const t=this;return e=>{t.rotationControlPoint.add(e.params.dragAmount)}}_handleRotationCenterPoint(){const t=this;return e=>{var s=t._rotationControlLine.angle(),i=s-t.ellipse.rotation;t.ellipse.rotation=s,t.ellipse.axis.rotate(i,t.ellipse.center)}}drawHandleLines(t,e){t.line(this.ellipse.center,this.rotationControlPoint,"rgba(192,64,128,0.333)",1,{dashOffset:0,dashArray:[4,2]}),t.setCurrentId(`${this.ellipse.uid}_e0`),t.setCurrentClassName(`${this.ellipse.className}-v-line`),t.line(this.ellipse.center.clone().add(0,this.ellipse.signedRadiusV()).rotate(this.ellipse.rotation,this.ellipse.center),this.ellipse.axis,"rgba(64,128,192,0.333)",1,{dashOffset:0,dashArray:[4,2]}),t.setCurrentId(`${this.ellipse.uid}_e1`),t.setCurrentClassName(`${this.ellipse.className}-h-line`),t.line(this.ellipse.center.clone().add(this.ellipse.signedRadiusH(),0).rotate(this.ellipse.rotation,this.ellipse.center),this.ellipse.axis,"rgba(64,128,192,0.333)",1,{dashOffset:0,dashArray:[4,2]})}destroy(){this.ellipse.center.listeners.removeDragListener(this._centerPointHandler),this.rotationControlPoint.listeners.removeDragListener(this._rotationPointHandler)}},exports.VEllipseSector=N,exports.VEllipseSectorHelper=class{constructor(t,e,s,i){this.sector=t,this.startAngleControlPoint=e,this.endAngleControlPoint=s,this.rotationControlPoint=i,this._rotationControlLine=new l(t.ellipse.center,i),this._startAngleControlLine=new l(t.ellipse.center,e),this._endAngleControlLine=new l(t.ellipse.center,s),t.ellipse.center.listeners.addDragListener(this._centerHandler=this._handleDragCenterPoint()),i.listeners.addDragListener(this._rotationHandler=this._handleDragRotationControlPoint()),e.listeners.addDragListener(this._startAngleHandler=this._handleDragStartAngleControlPoint()),s.listeners.addDragListener(this._endAngleHandler=this._handleDragEndAngleControlPoint())}_handleDragCenterPoint(){const t=this;return e=>{t.startAngleControlPoint.add(e.params.dragAmount),t.endAngleControlPoint.add(e.params.dragAmount),t.rotationControlPoint.add(e.params.dragAmount)}}_handleDragRotationControlPoint(){const t=this;return e=>{const s=t._rotationControlLine.angle(),i=s-t.sector.ellipse.rotation;t.sector.ellipse.rotation=s,t.sector.ellipse.axis.rotate(i,t.sector.ellipse.center),t.startAngleControlPoint.rotate(i,t.sector.ellipse.center),t.endAngleControlPoint.rotate(i,t.sector.ellipse.center)}}_handleDragStartAngleControlPoint(){const t=this;return e=>{t.sector.startAngle=n.mapAngleTo2PI(t._startAngleControlLine.angle()-t.sector.ellipse.rotation)}}_handleDragEndAngleControlPoint(){const t=this;return e=>{t.sector.endAngle=n.mapAngleTo2PI(t._endAngleControlLine.angle()-t.sector.ellipse.rotation)}}drawHandleLines(t,e){t.line(this.sector.ellipse.center,this.startAngleControlPoint,"rgba(64,192,128,0.333)",1,{dashOffset:0,dashArray:[4,2]}),t.line(this.sector.ellipse.center,this.endAngleControlPoint,"rgba(64,192,128,0.333)",1,{dashOffset:0,dashArray:[4,2]}),t.line(this.sector.ellipse.center,this.rotationControlPoint,"rgba(192,64,128,0.333)",1,{dashOffset:0,dashArray:[4,2]}),t.line(this.sector.ellipse.center.clone().add(0,this.sector.ellipse.signedRadiusV()).rotate(this.sector.ellipse.rotation,this.sector.ellipse.center),this.sector.ellipse.axis,"rgba(64,128,192,0.333)",1,{dashOffset:0,dashArray:[4,2]}),t.line(this.sector.ellipse.center.clone().add(this.sector.ellipse.signedRadiusH(),0).rotate(this.sector.ellipse.rotation,this.sector.ellipse.center),this.sector.ellipse.axis,"rgba(64,128,192,0.333)",1,{dashOffset:0,dashArray:[4,2]})}destroy(){this.sector.ellipse.center.listeners.removeDragListener(this._centerHandler),this.rotationControlPoint.listeners.removeDragListener(this._rotationHandler),this.startAngleControlPoint.listeners.removeDragListener(this._startAngleHandler),this.endAngleControlPoint.listeners.removeDragListener(this._endAngleHandler)}},exports.Vector=h,exports.VertTuple=a,exports.Vertex=o,exports.VertexAttr=t,exports.VertexListeners=s,exports.VoronoiCell=Et,exports.WebColors=ot,exports.WebColorsContrast=ht,exports.WebColorsMalachite=lt,exports.XMouseEvent=C,exports.XWheelEvent=P,exports.__parseGradient=Ce,exports.arrayFill=ct,exports.arrayResize=(t,e,s)=>{if(t.length!==e){for(;t.length<e;)t.push(s());t.length>e&&t.splice(e)}},exports.arrayShuffle=t=>{t.sort(()=>Math.random()-.5)},exports.clearDuplicateVertices=ft,exports.clearPolygonDuplicateVertices=(t,e)=>{const s=t.length;if(0===s)return[];void 0===e&&(e=0);const i=(i,r)=>{const n=t[i%s],o=t[r%s];return 0===e&&n.x===o.x&&n.y===o.y||0!==e&&n.distance(o)<=e};var r=(t=>{for(var e=t;i(t,e+1)&&e<t+s;)e++;return e})(0),n=0;const o=[];for(var a=n+1;a<=s;a++)i(r+n,r+a)||(o.push(t[(r+a)%s]),n=a);return o},exports.cloneVertexArray=t=>{const e=[];for(var s=0;s<t.length;s++)e.push(new o(t[s].x,t[s].y));return e},exports.convexPolygonIncircle=t=>{for(var e=t.vertices.length,s=null,r=null,n=0;n<e;n++)for(var o=n+1;o<e;o++)for(var a=o+1;a<e;a++){let h=new l(t.vertices[n],t.vertices[(n+1)%e]),c=new l(t.vertices[o],t.vertices[(o+1)%e]),d=new l(t.vertices[a],t.vertices[(a+1)%e]),u=h.intersection(c),g=c.intersection(d);if(!u||!g)continue;let f=_t(h.a,u,g,d.b);if(!f)continue;let x=f.getCircumcircle(),p=new i(x.center,x.radius);if(t.containsVert(p.center))3==St(t,p).length&&(null==s||s.radius<p.radius)&&(s=p,r=f)}return{circle:s,triangle:r}},exports.createRandomizedPolygon=(t,e,s)=>{const i=new c;for(var r=0;r<t;r++){const s=new o(.33*e.getMinDimension(),0);s.rotate(2*Math.PI/t*r),s.addXY(.1*e.width*(1-2*Math.random()),.1*e.height*(1-2*Math.random())),i.addVertex(s)}return s&&!i.isClockwise()&&(i.vertices=i.vertices.reverse()),i},exports.delaunay2voronoi=class{constructor(t,e){this.failedTriangleSets=[],this.hasErrors=!1,this.pointList=t,this.triangles=e}build(){const t=[];for(var e in this.pointList){var s=this.pointList[e],i=[];for(var r in this.triangles)(this.triangles[r].a.equals(s)||this.triangles[r].b.equals(s)||this.triangles[r].c.equals(s))&&i.push(this.triangles[r]);var n=this.subsetToPath(i);n&&t.push(new Et(n,s))}return t}subsetToPath(t,e,s){if(0==t.length)return[];void 0===e&&(e=0);let i=e;const r=[t[i]],n=[i];let o=0;for(;r.length<t.length&&o<t.length;){let s=(e+o)%t.length;i!=s&&-1==n.indexOf(s)&&t[i].isAdjacent(t[s])?(r.push(t[s]),n.push(s),i=s,o=0):o++}return r.length<t.length?s?(this.failedTriangleSets=t,this.hasErrors=!0,null):this.subsetToPath(t,i,!0):r}},exports.detectDarkMode=t=>{var e=!1;if(void 0!==t&&t.hasOwnProperty("darkmode")&&t.darkmode){const s=!!JSON.parse(t.darkmode);null!==s&&(e=s)}else if(globalThis.matchMedia&&globalThis.matchMedia("(prefers-color-scheme: dark)").matches)e=!0;else{const t=(new Date).getHours();e=!(t>6&&t<18)}return e&&document.body&&document.body.classList.add("darkmode"),e},exports.detectPaths=wt,exports.drawutils=v,exports.drawutilsgl=m,exports.drawutilssvg=p,exports.findInVertexArray=(t,e,s)=>{for(var i=0;i<t.length;i++)if(t[i].distance(e)<s)return i;return-1},exports.findPolygonSelfIntersections=t=>{const e=[],s=new l(new o,new o),i=new l(new o,new o),r=t.length;for(var n=0;n<r;n++){s.a.set(t[n]),s.b.set(t[(n+1)%r]);for(var a=0;a<r;a++){if(n==a||n+1==a||n==a+1||0==n&&a+1==r||0==a&&n+1==r)continue;i.a.set(t[a]),i.b.set(t[(a+1)%r]);const o=s.intersection(i);o&&s.hasPoint(o)&&i.hasPoint(o)&&e.push(o)}}return e},exports.geomutils=n,exports.getAvailableContainerSpace=t=>{const e=t.parentNode;var s=oe(e,"padding")||0,i=oe(t,"border-width")||0,r=oe(e,"padding-left")||s,n=oe(e,"padding-right")||s,o=oe(e,"padding-top")||s,a=oe(e,"padding-bottom")||s,h=oe(t,"border-left-width")||i,l=oe(t,"border-right-width")||i,c=oe(t,"border-top-width")||i,d=oe(t,"border-bottom-width")||i;return{width:e.clientWidth-r-n-h-l,height:e.clientHeight-o-a-c-d}},exports.getContrastColor=t=>{const e=2.2;return.2126*Math.pow(t.r,e)+.7152*Math.pow(t.g,e)+.0722*Math.pow(t.b,e)>Math.pow(.5,e)?Mt:It},exports.getConvexHull=t=>{t.sort(Pt);const e=[];for(var s=0;s<t.length;s++){for(;e.length>=2&&At(e[e.length-2],e[e.length-1],t[s])<=0;)e.pop();e.push(t[s])}const i=[];for(s=t.length-1;s>=0;s--){for(;i.length>=2&&At(i[i.length-2],i[i.length-1],t[s])<=0;)i.pop();i.push(t[s])}return e.pop(),i.pop(),e.concat(i)},exports.getFProp=oe,exports.guiSizeToggler=(t,e,s)=>(t.domElement.style.transition="transform 0.5s",{update:function(){((t,e,s)=>{s&&s.hasOwnProperty("transformOrigin")?t.domElement.style["transform-origin"]=s.transformOrigin:t.domElement.style["transform-origin"]="100% 0%";const i=s&&s.hasOwnProperty("transform")?s.transform+" ":"";t.domElement.style.transform=e?i+"scale(2.0)":i+"scale(1.0)"})(t,Boolean(e.guiDoubleSize),s)}}),exports.gup=()=>{const t={};return globalThis.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,(e,s,i)=>t[decodeURIComponent(s)]=i),t},exports.matrixFill=dt,exports.parseSVGPathData=t=>{const e=he(t);if(!e)return null;const s=[];var i=0;const r={x:NaN,y:NaN},n={x:NaN,y:NaN},o={x:NaN,y:NaN};for(;i<e.length;){const t=e[i],a=t[0];switch(t[0]){case"M":ce(t,!1,r,n,o);break;case"m":ce(t,!0,r,n,o);break;case"L":de(t,!1,r,n,o,s);break;case"l":de(t,!0,r,n,o,s);break;case"H":ue(t,!1,r,n,o,s);break;case"h":ue(t,!0,r,n,o,s);break;case"V":ge(t,!1,r,n,o,s);break;case"v":ge(t,!0,r,n,o,s);break;case"C":fe(t,!1,r,n,o,s);break;case"c":fe(t,!0,r,n,o,s);break;case"S":ve(t,!1,r,n,o,s);break;case"s":ve(t,!0,r,n,o,s);break;case"Q":xe(t,!1,r,n,o,s);break;case"q":xe(t,!0,r,n,o,s);break;case"A":me(t,!1,r,n,o,s);break;case"a":me(t,!0,r,n,o,s);break;case"z":ye(t,!1,r,n,o,s);break;case"Z":ye(t,!0,r,n,o,s);break;default:if("T"===a)throw"T command only allowed after q command.";if("t"===a)throw"t command only allowed after q command.";throw"Unknown SVG path command found: "+a+"."}i++}return s},exports.pixelCornersToRoundPaths=(t,e)=>{const s=[],i=new Dt(t.xSegmentCount,t.ySegmentCount,!1),r=e&&e.origin?e.origin:{x:0,y:0},n=e&&"number"==typeof e.squareSize?e.squareSize:10,o=e&&"number"==typeof e.gapSize?e.gapSize:2,a=e&&"number"==typeof e.curveFactor?e.curveFactor:.666,h=(t,e,s,r)=>!0===t&&!1===i.get(e,s)&&(e-1<0||!1===r.get(e-1,s)),l=t.xSegmentCount*t.ySegmentCount+1;for(var c,d=0;(c=t.find(h))&&d++<l;){const e=Nt(r,n,o,c.xIndex,c.yIndex).getWestPoint();var u=["M",e.x,e.y];Rt(u,t,i,c,0,r,n,o,a),s.push(u)}return s},exports.polygonTesselationToGraph=$t,exports.shuffleWebColors=at,exports.splitPolygonToNonIntersecting=Gt,exports.splitSVGPathData=he,exports.sutherlandHodgman=Ht;
2
2
  //# sourceMappingURL=index.esm.min.js.map