@giro3d/piero 1.0.0-beta.4 → 1.0.0-beta.7

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 (499) hide show
  1. package/README.md +10 -10
  2. package/dist/assets/piero.css +2 -2
  3. package/dist/index.cjs.js +6 -9
  4. package/dist/index.cjs.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.es.js +3090 -6878
  7. package/dist/index.es.js.map +1 -1
  8. package/dist/modules.cjs.js +1 -1
  9. package/dist/modules.cjs.js.map +1 -1
  10. package/dist/modules.d.ts +1 -1
  11. package/dist/modules.es.js +1598 -893
  12. package/dist/modules.es.js.map +1 -1
  13. package/dist/{src → packages/piero/src}/App.vue.d.ts +1 -0
  14. package/dist/packages/piero/src/App.vue.d.ts.map +1 -0
  15. package/dist/packages/piero/src/PieroApplication.d.ts +5 -0
  16. package/dist/packages/piero/src/PieroApplication.d.ts.map +1 -0
  17. package/dist/{src/api/AnalysisApi.d.ts → packages/piero/src/api/analysis.d.ts} +5 -3
  18. package/dist/packages/piero/src/api/analysis.d.ts.map +1 -0
  19. package/dist/packages/piero/src/api/bookmarks.d.ts +16 -0
  20. package/dist/packages/piero/src/api/bookmarks.d.ts.map +1 -0
  21. package/dist/{src/api/DatasetApi.d.ts → packages/piero/src/api/dataset.d.ts} +55 -19
  22. package/dist/packages/piero/src/api/dataset.d.ts.map +1 -0
  23. package/dist/packages/piero/src/api/http.d.ts +32 -0
  24. package/dist/packages/piero/src/api/http.d.ts.map +1 -0
  25. package/dist/packages/piero/src/api/index.d.ts +9 -0
  26. package/dist/packages/piero/src/api/index.d.ts.map +1 -0
  27. package/dist/packages/piero/src/api/notifications.d.ts +52 -0
  28. package/dist/packages/piero/src/api/notifications.d.ts.map +1 -0
  29. package/dist/{src/api/SearchApi.d.ts → packages/piero/src/api/search.d.ts} +2 -0
  30. package/dist/packages/piero/src/api/search.d.ts.map +1 -0
  31. package/dist/packages/piero/src/api/view.d.ts +31 -0
  32. package/dist/packages/piero/src/api/view.d.ts.map +1 -0
  33. package/dist/{src/api/WidgetApi.d.ts → packages/piero/src/api/widgets.d.ts} +9 -6
  34. package/dist/packages/piero/src/api/widgets.d.ts.map +1 -0
  35. package/dist/{src → packages/piero/src}/components/AlertToast.vue.d.ts +1 -0
  36. package/dist/packages/piero/src/components/AlertToast.vue.d.ts.map +1 -0
  37. package/dist/{src → packages/piero/src}/components/AttributeGroup.vue.d.ts +1 -0
  38. package/dist/packages/piero/src/components/AttributeGroup.vue.d.ts.map +1 -0
  39. package/dist/{src → packages/piero/src}/components/AttributeItem.vue.d.ts +1 -0
  40. package/dist/packages/piero/src/components/AttributeItem.vue.d.ts.map +1 -0
  41. package/dist/{src → packages/piero/src}/components/AttributePanel.vue.d.ts +1 -0
  42. package/dist/packages/piero/src/components/AttributePanel.vue.d.ts.map +1 -0
  43. package/dist/packages/piero/src/components/CheckboxToggle.vue.d.ts +26 -0
  44. package/dist/packages/piero/src/components/CheckboxToggle.vue.d.ts.map +1 -0
  45. package/dist/{src → packages/piero/src}/components/ColorFragment.vue.d.ts +1 -0
  46. package/dist/packages/piero/src/components/ColorFragment.vue.d.ts.map +1 -0
  47. package/dist/{src → packages/piero/src}/components/Configuration.d.ts +2 -1
  48. package/dist/packages/piero/src/components/Configuration.d.ts.map +1 -0
  49. package/dist/{src → packages/piero/src}/components/CoordinateFragment.vue.d.ts +1 -0
  50. package/dist/packages/piero/src/components/CoordinateFragment.vue.d.ts.map +1 -0
  51. package/dist/{src → packages/piero/src}/components/CoordinateInput.vue.d.ts +1 -0
  52. package/dist/packages/piero/src/components/CoordinateInput.vue.d.ts.map +1 -0
  53. package/dist/{src → packages/piero/src}/components/DropdownView.vue.d.ts +1 -0
  54. package/dist/packages/piero/src/components/DropdownView.vue.d.ts.map +1 -0
  55. package/dist/{src → packages/piero/src}/components/LinkFragment.vue.d.ts +1 -0
  56. package/dist/packages/piero/src/components/LinkFragment.vue.d.ts.map +1 -0
  57. package/dist/{src → packages/piero/src}/components/LoadingScreen.vue.d.ts +1 -0
  58. package/dist/packages/piero/src/components/LoadingScreen.vue.d.ts.map +1 -0
  59. package/dist/{src → packages/piero/src}/components/MainView.vue.d.ts +1 -0
  60. package/dist/packages/piero/src/components/MainView.vue.d.ts.map +1 -0
  61. package/dist/{src → packages/piero/src}/components/ModalOverlay.vue.d.ts +1 -0
  62. package/dist/packages/piero/src/components/ModalOverlay.vue.d.ts.map +1 -0
  63. package/dist/{src → packages/piero/src}/components/NavigationButtons.vue.d.ts +1 -0
  64. package/dist/packages/piero/src/components/NavigationButtons.vue.d.ts.map +1 -0
  65. package/dist/{src → packages/piero/src}/components/PanelContainer.vue.d.ts +1 -0
  66. package/dist/packages/piero/src/components/PanelContainer.vue.d.ts.map +1 -0
  67. package/dist/{src → packages/piero/src}/components/ProgressBar.vue.d.ts +1 -0
  68. package/dist/packages/piero/src/components/ProgressBar.vue.d.ts.map +1 -0
  69. package/dist/{src → packages/piero/src}/components/SearchOverlay.vue.d.ts +2 -1
  70. package/dist/packages/piero/src/components/SearchOverlay.vue.d.ts.map +1 -0
  71. package/dist/{src → packages/piero/src}/components/SpinnerControl.vue.d.ts +1 -0
  72. package/dist/packages/piero/src/components/SpinnerControl.vue.d.ts.map +1 -0
  73. package/dist/{src/components/atoms/ListLabel.vue.d.ts → packages/piero/src/components/StatusBar.vue.d.ts} +5 -1
  74. package/dist/packages/piero/src/components/StatusBar.vue.d.ts.map +1 -0
  75. package/dist/{src → packages/piero/src}/components/SwitchToggle.vue.d.ts +1 -0
  76. package/dist/packages/piero/src/components/SwitchToggle.vue.d.ts.map +1 -0
  77. package/dist/{src → packages/piero/src}/components/VisibilityControl.vue.d.ts +1 -0
  78. package/dist/packages/piero/src/components/VisibilityControl.vue.d.ts.map +1 -0
  79. package/dist/{src → packages/piero/src}/components/atoms/ButtonArea.vue.d.ts +1 -0
  80. package/dist/packages/piero/src/components/atoms/ButtonArea.vue.d.ts.map +1 -0
  81. package/dist/{src → packages/piero/src}/components/atoms/ButtonWithIcon.vue.d.ts +1 -0
  82. package/dist/packages/piero/src/components/atoms/ButtonWithIcon.vue.d.ts.map +1 -0
  83. package/dist/{src/components/atoms/SectionCollapsible.vue.d.ts → packages/piero/src/components/atoms/CompactList.vue.d.ts} +5 -14
  84. package/dist/packages/piero/src/components/atoms/CompactList.vue.d.ts.map +1 -0
  85. package/dist/{src → packages/piero/src}/components/atoms/Icon.vue.d.ts +1 -0
  86. package/dist/packages/piero/src/components/atoms/Icon.vue.d.ts.map +1 -0
  87. package/dist/{src → packages/piero/src}/components/atoms/IconList.vue.d.ts +1 -0
  88. package/dist/packages/piero/src/components/atoms/IconList.vue.d.ts.map +1 -0
  89. package/dist/{src → packages/piero/src}/components/atoms/IconListButton.vue.d.ts +1 -0
  90. package/dist/packages/piero/src/components/atoms/IconListButton.vue.d.ts.map +1 -0
  91. package/dist/{src → packages/piero/src}/components/atoms/ImportButton.vue.d.ts +1 -0
  92. package/dist/packages/piero/src/components/atoms/ImportButton.vue.d.ts.map +1 -0
  93. package/dist/{src → packages/piero/src}/components/atoms/ListLabelButton.vue.d.ts +1 -0
  94. package/dist/packages/piero/src/components/atoms/ListLabelButton.vue.d.ts.map +1 -0
  95. package/dist/packages/piero/src/components/atoms/Slider.vue.d.ts +15 -0
  96. package/dist/packages/piero/src/components/atoms/Slider.vue.d.ts.map +1 -0
  97. package/dist/{src → packages/piero/src}/components/panels/AboutPanel.vue.d.ts +1 -0
  98. package/dist/packages/piero/src/components/panels/AboutPanel.vue.d.ts.map +1 -0
  99. package/dist/packages/piero/src/components/panels/AnalysisPanel.vue.d.ts +3 -0
  100. package/dist/packages/piero/src/components/panels/AnalysisPanel.vue.d.ts.map +1 -0
  101. package/dist/{src → packages/piero/src}/components/panels/AnnotationItem.vue.d.ts +1 -0
  102. package/dist/packages/piero/src/components/panels/AnnotationItem.vue.d.ts.map +1 -0
  103. package/dist/{src → packages/piero/src}/components/panels/AnnotationPanel.vue.d.ts +1 -0
  104. package/dist/packages/piero/src/components/panels/AnnotationPanel.vue.d.ts.map +1 -0
  105. package/dist/{src → packages/piero/src}/components/panels/BookmarkItem.vue.d.ts +3 -2
  106. package/dist/packages/piero/src/components/panels/BookmarkItem.vue.d.ts.map +1 -0
  107. package/dist/{src → packages/piero/src}/components/panels/BookmarkPanel.vue.d.ts +1 -0
  108. package/dist/packages/piero/src/components/panels/BookmarkPanel.vue.d.ts.map +1 -0
  109. package/dist/packages/piero/src/components/panels/DatagroupItem.vue.d.ts +15 -0
  110. package/dist/packages/piero/src/components/panels/DatagroupItem.vue.d.ts.map +1 -0
  111. package/dist/packages/piero/src/components/panels/DatasetItem.vue.d.ts +15 -0
  112. package/dist/packages/piero/src/components/panels/DatasetItem.vue.d.ts.map +1 -0
  113. package/dist/packages/piero/src/components/panels/DatasetOrGroupItem.vue.d.ts +15 -0
  114. package/dist/packages/piero/src/components/panels/DatasetOrGroupItem.vue.d.ts.map +1 -0
  115. package/dist/{src/components/panels/AnalysisPanel.vue.d.ts → packages/piero/src/components/panels/DatasetPanel.vue.d.ts} +1 -0
  116. package/dist/packages/piero/src/components/panels/DatasetPanel.vue.d.ts.map +1 -0
  117. package/dist/{src/components/OpacitySlider.vue.d.ts → packages/piero/src/components/panels/DatasetParameters.vue.d.ts} +6 -5
  118. package/dist/packages/piero/src/components/panels/DatasetParameters.vue.d.ts.map +1 -0
  119. package/dist/{src → packages/piero/src}/components/panels/EmptyIndicator.vue.d.ts +1 -0
  120. package/dist/packages/piero/src/components/panels/EmptyIndicator.vue.d.ts.map +1 -0
  121. package/dist/{src → packages/piero/src}/components/panels/MeasurementItem.vue.d.ts +1 -0
  122. package/dist/packages/piero/src/components/panels/MeasurementItem.vue.d.ts.map +1 -0
  123. package/dist/{src → packages/piero/src}/components/panels/MeasurementPanel.vue.d.ts +1 -0
  124. package/dist/packages/piero/src/components/panels/MeasurementPanel.vue.d.ts.map +1 -0
  125. package/dist/{src → packages/piero/src}/components/panels/ShareBookmarkModal.vue.d.ts +1 -0
  126. package/dist/packages/piero/src/components/panels/ShareBookmarkModal.vue.d.ts.map +1 -0
  127. package/dist/{src → packages/piero/src}/components/panels/analysis/ToolWrapper.vue.d.ts +1 -0
  128. package/dist/packages/piero/src/components/panels/analysis/ToolWrapper.vue.d.ts.map +1 -0
  129. package/dist/{src → packages/piero/src}/components/toolbar/ToolBar.vue.d.ts +1 -0
  130. package/dist/packages/piero/src/components/toolbar/ToolBar.vue.d.ts.map +1 -0
  131. package/dist/{src → packages/piero/src}/components/toolbar/ToolbarButton.vue.d.ts +1 -0
  132. package/dist/packages/piero/src/components/toolbar/ToolbarButton.vue.d.ts.map +1 -0
  133. package/dist/packages/piero/src/configuration/ImageFormat.d.ts +4 -0
  134. package/dist/packages/piero/src/configuration/ImageFormat.d.ts.map +1 -0
  135. package/dist/packages/piero/src/configuration/annotation.d.ts +25 -0
  136. package/dist/packages/piero/src/configuration/annotation.d.ts.map +1 -0
  137. package/dist/packages/piero/src/configuration/basemap.d.ts +7 -0
  138. package/dist/packages/piero/src/configuration/basemap.d.ts.map +1 -0
  139. package/dist/packages/piero/src/configuration/bookmark.d.ts +10 -0
  140. package/dist/packages/piero/src/configuration/bookmark.d.ts.map +1 -0
  141. package/dist/packages/piero/src/configuration/colormap.d.ts +10 -0
  142. package/dist/packages/piero/src/configuration/colormap.d.ts.map +1 -0
  143. package/dist/packages/piero/src/configuration/configuration.d.ts +32 -0
  144. package/dist/packages/piero/src/configuration/configuration.d.ts.map +1 -0
  145. package/dist/packages/piero/src/configuration/configuration.test.d.ts +2 -0
  146. package/dist/packages/piero/src/configuration/configuration.test.d.ts.map +1 -0
  147. package/dist/packages/piero/src/configuration/coordinate.d.ts +23 -0
  148. package/dist/packages/piero/src/configuration/coordinate.d.ts.map +1 -0
  149. package/dist/packages/piero/src/configuration/crs.d.ts +11 -0
  150. package/dist/packages/piero/src/configuration/crs.d.ts.map +1 -0
  151. package/dist/packages/piero/src/configuration/dataset.d.ts +56 -0
  152. package/dist/packages/piero/src/configuration/dataset.d.ts.map +1 -0
  153. package/dist/packages/piero/src/configuration/defaultConfig.d.ts +8 -0
  154. package/dist/packages/piero/src/configuration/defaultConfig.d.ts.map +1 -0
  155. package/dist/packages/piero/src/configuration/extent.d.ts +15 -0
  156. package/dist/packages/piero/src/configuration/extent.d.ts.map +1 -0
  157. package/dist/packages/piero/src/configuration/index.d.ts +18 -0
  158. package/dist/packages/piero/src/configuration/index.d.ts.map +1 -0
  159. package/dist/packages/piero/src/configuration/layer.d.ts +27 -0
  160. package/dist/packages/piero/src/configuration/layer.d.ts.map +1 -0
  161. package/dist/packages/piero/src/configuration/lookAt.d.ts +13 -0
  162. package/dist/packages/piero/src/configuration/lookAt.d.ts.map +1 -0
  163. package/dist/packages/piero/src/configuration/module.d.ts +6 -0
  164. package/dist/packages/piero/src/configuration/module.d.ts.map +1 -0
  165. package/dist/packages/piero/src/configuration/orientation.d.ts +4 -0
  166. package/dist/packages/piero/src/configuration/orientation.d.ts.map +1 -0
  167. package/dist/packages/piero/src/configuration/scene.d.ts +12 -0
  168. package/dist/packages/piero/src/configuration/scene.d.ts.map +1 -0
  169. package/dist/packages/piero/src/configuration/style.d.ts +7 -0
  170. package/dist/packages/piero/src/configuration/style.d.ts.map +1 -0
  171. package/dist/packages/piero/src/configuration/units.d.ts +6 -0
  172. package/dist/packages/piero/src/configuration/units.d.ts.map +1 -0
  173. package/dist/packages/piero/src/configuration/url.d.ts +4 -0
  174. package/dist/packages/piero/src/configuration/url.d.ts.map +1 -0
  175. package/dist/packages/piero/src/configurationLoader.d.ts +7 -0
  176. package/dist/packages/piero/src/configurationLoader.d.ts.map +1 -0
  177. package/dist/{src → packages/piero/src}/constants.d.ts +1 -0
  178. package/dist/packages/piero/src/constants.d.ts.map +1 -0
  179. package/dist/{src → packages/piero/src}/context.d.ts +27 -18
  180. package/dist/packages/piero/src/context.d.ts.map +1 -0
  181. package/dist/packages/piero/src/createPieroApp.d.ts +30 -0
  182. package/dist/packages/piero/src/createPieroApp.d.ts.map +1 -0
  183. package/dist/{src → packages/piero/src}/events.d.ts +3 -1
  184. package/dist/packages/piero/src/events.d.ts.map +1 -0
  185. package/dist/{src → packages/piero/src}/giro3d/CameraControlsInspector.d.ts +1 -0
  186. package/dist/packages/piero/src/giro3d/CameraControlsInspector.d.ts.map +1 -0
  187. package/dist/packages/piero/src/giro3d/DatasetBuilder.d.ts +17 -0
  188. package/dist/packages/piero/src/giro3d/DatasetBuilder.d.ts.map +1 -0
  189. package/dist/{src → packages/piero/src}/giro3d/Measure3D.d.ts +1 -0
  190. package/dist/packages/piero/src/giro3d/Measure3D.d.ts.map +1 -0
  191. package/dist/packages/piero/src/index.d.ts +15 -0
  192. package/dist/packages/piero/src/index.d.ts.map +1 -0
  193. package/dist/{src → packages/piero/src}/loaders/loader.d.ts +3 -9
  194. package/dist/packages/piero/src/loaders/loader.d.ts.map +1 -0
  195. package/dist/packages/piero/src/loaders/loader.test.d.ts +2 -0
  196. package/dist/packages/piero/src/loaders/loader.test.d.ts.map +1 -0
  197. package/dist/{src → packages/piero/src}/loaders/userData.d.ts +1 -0
  198. package/dist/packages/piero/src/loaders/userData.d.ts.map +1 -0
  199. package/dist/{src → packages/piero/src}/module.d.ts +6 -1
  200. package/dist/packages/piero/src/module.d.ts.map +1 -0
  201. package/dist/packages/piero/src/modules/analysis/ClippingBox.d.ts +19 -0
  202. package/dist/packages/piero/src/modules/analysis/ClippingBox.d.ts.map +1 -0
  203. package/dist/packages/piero/src/modules/analysis/CrossSection.d.ts +12 -0
  204. package/dist/packages/piero/src/modules/analysis/CrossSection.d.ts.map +1 -0
  205. package/dist/packages/piero/src/modules/analysis/FloodingPlane.d.ts +12 -0
  206. package/dist/packages/piero/src/modules/analysis/FloodingPlane.d.ts.map +1 -0
  207. package/dist/{src/modules/clippingBoxAnalysis → packages/piero/src/modules/analysis/clippingBox}/ClippingBox.vue.d.ts +1 -0
  208. package/dist/packages/piero/src/modules/analysis/clippingBox/ClippingBox.vue.d.ts.map +1 -0
  209. package/dist/{src/modules/clippingBoxAnalysis → packages/piero/src/modules/analysis/clippingBox}/ClippingBoxManager.d.ts +4 -3
  210. package/dist/packages/piero/src/modules/analysis/clippingBox/ClippingBoxManager.d.ts.map +1 -0
  211. package/dist/packages/piero/src/modules/analysis/clippingBox/store.d.ts +2269 -0
  212. package/dist/packages/piero/src/modules/analysis/clippingBox/store.d.ts.map +1 -0
  213. package/dist/{src/modules/crossSectionAnalysis → packages/piero/src/modules/analysis/crossSection}/CrossSection.vue.d.ts +1 -0
  214. package/dist/packages/piero/src/modules/analysis/crossSection/CrossSection.vue.d.ts.map +1 -0
  215. package/dist/packages/piero/src/modules/analysis/crossSection/CrossSectionHelper.d.ts +5 -0
  216. package/dist/packages/piero/src/modules/analysis/crossSection/CrossSectionHelper.d.ts.map +1 -0
  217. package/dist/{src/modules/crossSectionAnalysis → packages/piero/src/modules/analysis/crossSection}/CrossSectionManager.d.ts +2 -1
  218. package/dist/packages/piero/src/modules/analysis/crossSection/CrossSectionManager.d.ts.map +1 -0
  219. package/dist/packages/piero/src/modules/analysis/crossSection/store.d.ts +543 -0
  220. package/dist/packages/piero/src/modules/analysis/crossSection/store.d.ts.map +1 -0
  221. package/dist/{src/modules/floodingPlaneAnalysis → packages/piero/src/modules/analysis/floodingPlane}/FloodingPlane.vue.d.ts +1 -0
  222. package/dist/packages/piero/src/modules/analysis/floodingPlane/FloodingPlane.vue.d.ts.map +1 -0
  223. package/dist/{src/modules/floodingPlaneAnalysis → packages/piero/src/modules/analysis/floodingPlane}/FloodingPlaneManager.d.ts +2 -1
  224. package/dist/packages/piero/src/modules/analysis/floodingPlane/FloodingPlaneManager.d.ts.map +1 -0
  225. package/dist/{src/modules/floodingPlaneAnalysis → packages/piero/src/modules/analysis/floodingPlane}/FloodingPlaneObject.d.ts +2 -1
  226. package/dist/packages/piero/src/modules/analysis/floodingPlane/FloodingPlaneObject.d.ts.map +1 -0
  227. package/dist/{src/modules/floodingPlaneAnalysis → packages/piero/src/modules/analysis/floodingPlane}/store.d.ts +1 -0
  228. package/dist/packages/piero/src/modules/analysis/floodingPlane/store.d.ts.map +1 -0
  229. package/dist/packages/piero/src/modules/analysis/index.d.ts +9 -0
  230. package/dist/packages/piero/src/modules/analysis/index.d.ts.map +1 -0
  231. package/dist/packages/piero/src/modules/index.d.ts +17 -0
  232. package/dist/packages/piero/src/modules/index.d.ts.map +1 -0
  233. package/dist/packages/piero/src/modules/loaders/BDTopoLoader.d.ts +11 -0
  234. package/dist/packages/piero/src/modules/loaders/BDTopoLoader.d.ts.map +1 -0
  235. package/dist/packages/piero/src/modules/loaders/GPXLoader.d.ts +28 -0
  236. package/dist/packages/piero/src/modules/loaders/GPXLoader.d.ts.map +1 -0
  237. package/dist/packages/piero/src/modules/loaders/GeoJSONLoader.d.ts +28 -0
  238. package/dist/packages/piero/src/modules/loaders/GeoJSONLoader.d.ts.map +1 -0
  239. package/dist/packages/piero/src/modules/loaders/GeoTIFFLoader.d.ts +11 -0
  240. package/dist/packages/piero/src/modules/loaders/GeoTIFFLoader.d.ts.map +1 -0
  241. package/dist/packages/piero/src/modules/loaders/IFCLoader.d.ts +11 -0
  242. package/dist/packages/piero/src/modules/loaders/IFCLoader.d.ts.map +1 -0
  243. package/dist/packages/piero/src/modules/loaders/KMLLoader.d.ts +28 -0
  244. package/dist/packages/piero/src/modules/loaders/KMLLoader.d.ts.map +1 -0
  245. package/dist/packages/piero/src/modules/loaders/LASLoader.d.ts +29 -0
  246. package/dist/packages/piero/src/modules/loaders/LASLoader.d.ts.map +1 -0
  247. package/dist/packages/piero/src/modules/loaders/MapboxLoader.d.ts +11 -0
  248. package/dist/packages/piero/src/modules/loaders/MapboxLoader.d.ts.map +1 -0
  249. package/dist/packages/piero/src/modules/loaders/OSMLoader.d.ts +11 -0
  250. package/dist/packages/piero/src/modules/loaders/OSMLoader.d.ts.map +1 -0
  251. package/dist/packages/piero/src/modules/loaders/PotreeLoader.d.ts +11 -0
  252. package/dist/packages/piero/src/modules/loaders/PotreeLoader.d.ts.map +1 -0
  253. package/dist/packages/piero/src/modules/loaders/TMSLoader.d.ts +27 -0
  254. package/dist/packages/piero/src/modules/loaders/TMSLoader.d.ts.map +1 -0
  255. package/dist/packages/piero/src/modules/loaders/Tiles3DLoader.d.ts +11 -0
  256. package/dist/packages/piero/src/modules/loaders/Tiles3DLoader.d.ts.map +1 -0
  257. package/dist/packages/piero/src/modules/loaders/WMSLoader.d.ts +29 -0
  258. package/dist/packages/piero/src/modules/loaders/WMSLoader.d.ts.map +1 -0
  259. package/dist/packages/piero/src/modules/loaders/WMTSLoader.d.ts +29 -0
  260. package/dist/packages/piero/src/modules/loaders/WMTSLoader.d.ts.map +1 -0
  261. package/dist/{src/giro3d/entities/FeatureCollectionEntity.d.ts → packages/piero/src/modules/loaders/bdtopo/BDTopoEntity.d.ts} +7 -9
  262. package/dist/packages/piero/src/modules/loaders/bdtopo/BDTopoEntity.d.ts.map +1 -0
  263. package/dist/{src/modules → packages/piero/src/modules/loaders}/ifc/IfcEntity.d.ts +6 -3
  264. package/dist/packages/piero/src/modules/loaders/ifc/IfcEntity.d.ts.map +1 -0
  265. package/dist/{src/modules → packages/piero/src/modules/loaders}/ifc/IfcEntityInspector.d.ts +1 -0
  266. package/dist/packages/piero/src/modules/loaders/ifc/IfcEntityInspector.d.ts.map +1 -0
  267. package/dist/{src/modules → packages/piero/src/modules/loaders}/ifc/IfcPropertyView.vue.d.ts +2 -1
  268. package/dist/packages/piero/src/modules/loaders/ifc/IfcPropertyView.vue.d.ts.map +1 -0
  269. package/dist/{src/modules → packages/piero/src/modules/loaders}/ifc/IfcSubtree.vue.d.ts +1 -0
  270. package/dist/packages/piero/src/modules/loaders/ifc/IfcSubtree.vue.d.ts.map +1 -0
  271. package/dist/packages/piero/src/modules/loaders/index.d.ts +20 -0
  272. package/dist/packages/piero/src/modules/loaders/index.d.ts.map +1 -0
  273. package/dist/packages/piero/src/modules/misc/Attribution.d.ts +8 -0
  274. package/dist/packages/piero/src/modules/misc/Attribution.d.ts.map +1 -0
  275. package/dist/packages/piero/src/modules/misc/AttributionWidget.vue.d.ts +4 -0
  276. package/dist/packages/piero/src/modules/misc/AttributionWidget.vue.d.ts.map +1 -0
  277. package/dist/{src/modules → packages/piero/src/modules/misc}/DownloadDataset.d.ts +3 -2
  278. package/dist/packages/piero/src/modules/misc/DownloadDataset.d.ts.map +1 -0
  279. package/dist/packages/piero/src/modules/misc/Graticule.d.ts +8 -0
  280. package/dist/packages/piero/src/modules/misc/Graticule.d.ts.map +1 -0
  281. package/dist/{src/modules → packages/piero/src/modules/misc}/OpenLayersMinimap.d.ts +3 -2
  282. package/dist/packages/piero/src/modules/misc/OpenLayersMinimap.d.ts.map +1 -0
  283. package/dist/{src/modules/minimap → packages/piero/src/modules/misc}/OpenLayersMinimapComponent.vue.d.ts +1 -0
  284. package/dist/packages/piero/src/modules/misc/OpenLayersMinimapComponent.vue.d.ts.map +1 -0
  285. package/dist/{src/modules → packages/piero/src/modules/misc}/PostProcessEntities.d.ts +3 -2
  286. package/dist/packages/piero/src/modules/misc/PostProcessEntities.d.ts.map +1 -0
  287. package/dist/{src/modules → packages/piero/src/modules/misc}/Tour.d.ts +4 -3
  288. package/dist/packages/piero/src/modules/misc/Tour.d.ts.map +1 -0
  289. package/dist/packages/piero/src/modules/misc/index.d.ts +12 -0
  290. package/dist/packages/piero/src/modules/misc/index.d.ts.map +1 -0
  291. package/dist/{src/modules/geocoding → packages/piero/src/modules/search}/CoordinatesSearch.d.ts +2 -1
  292. package/dist/packages/piero/src/modules/search/CoordinatesSearch.d.ts.map +1 -0
  293. package/dist/{src/modules/geocoding → packages/piero/src/modules/search}/FrenchBanGeocoder.d.ts +2 -1
  294. package/dist/packages/piero/src/modules/search/FrenchBanGeocoder.d.ts.map +1 -0
  295. package/dist/packages/piero/src/modules/search/PhotonGeocoder.d.ts +11 -0
  296. package/dist/packages/piero/src/modules/search/PhotonGeocoder.d.ts.map +1 -0
  297. package/dist/packages/piero/src/modules/search/index.d.ts +9 -0
  298. package/dist/packages/piero/src/modules/search/index.d.ts.map +1 -0
  299. package/dist/{src → packages/piero/src}/providers/Alticoding.d.ts +1 -0
  300. package/dist/packages/piero/src/providers/Alticoding.d.ts.map +1 -0
  301. package/dist/{src → packages/piero/src}/providers/IgnProvider.d.ts +1 -0
  302. package/dist/packages/piero/src/providers/IgnProvider.d.ts.map +1 -0
  303. package/dist/{src → packages/piero/src}/services/AnnotationManager.d.ts +9 -2
  304. package/dist/packages/piero/src/services/AnnotationManager.d.ts.map +1 -0
  305. package/dist/{src → packages/piero/src}/services/CameraController.d.ts +2 -1
  306. package/dist/packages/piero/src/services/CameraController.d.ts.map +1 -0
  307. package/dist/{src → packages/piero/src}/services/DatasetManager.d.ts +4 -3
  308. package/dist/packages/piero/src/services/DatasetManager.d.ts.map +1 -0
  309. package/dist/{src → packages/piero/src}/services/Giro3DManager.d.ts +2 -1
  310. package/dist/packages/piero/src/services/Giro3DManager.d.ts.map +1 -0
  311. package/dist/{src → packages/piero/src}/services/Highlighter.d.ts +1 -0
  312. package/dist/packages/piero/src/services/Highlighter.d.ts.map +1 -0
  313. package/dist/packages/piero/src/services/LayerManager.d.ts +24 -0
  314. package/dist/packages/piero/src/services/LayerManager.d.ts.map +1 -0
  315. package/dist/{src → packages/piero/src}/services/MeasureTool.d.ts +2 -1
  316. package/dist/packages/piero/src/services/MeasureTool.d.ts.map +1 -0
  317. package/dist/{src → packages/piero/src}/services/MeasurementManager.d.ts +2 -1
  318. package/dist/packages/piero/src/services/MeasurementManager.d.ts.map +1 -0
  319. package/dist/{src → packages/piero/src}/services/SceneCursorManager.d.ts +1 -0
  320. package/dist/packages/piero/src/services/SceneCursorManager.d.ts.map +1 -0
  321. package/dist/{src/services/Picker.d.ts → packages/piero/src/services/picking.d.ts} +1 -0
  322. package/dist/packages/piero/src/services/picking.d.ts.map +1 -0
  323. package/dist/{src → packages/piero/src}/stores/analysis.d.ts +2 -1
  324. package/dist/packages/piero/src/stores/analysis.d.ts.map +1 -0
  325. package/dist/{src → packages/piero/src}/stores/annotations.d.ts +1 -0
  326. package/dist/packages/piero/src/stores/annotations.d.ts.map +1 -0
  327. package/dist/packages/piero/src/stores/basemap.d.ts +18 -0
  328. package/dist/packages/piero/src/stores/basemap.d.ts.map +1 -0
  329. package/dist/{src → packages/piero/src}/stores/bookmarks.d.ts +2 -1
  330. package/dist/packages/piero/src/stores/bookmarks.d.ts.map +1 -0
  331. package/dist/{src → packages/piero/src}/stores/camera.d.ts +1 -0
  332. package/dist/packages/piero/src/stores/camera.d.ts.map +1 -0
  333. package/dist/{src → packages/piero/src}/stores/datasets.d.ts +27 -16
  334. package/dist/packages/piero/src/stores/datasets.d.ts.map +1 -0
  335. package/dist/{src → packages/piero/src}/stores/giro3d.d.ts +7 -5
  336. package/dist/packages/piero/src/stores/giro3d.d.ts.map +1 -0
  337. package/dist/{src → packages/piero/src}/stores/measurement.d.ts +1 -0
  338. package/dist/packages/piero/src/stores/measurement.d.ts.map +1 -0
  339. package/dist/{src → packages/piero/src}/stores/modules.d.ts +1 -0
  340. package/dist/packages/piero/src/stores/modules.d.ts.map +1 -0
  341. package/dist/packages/piero/src/stores/modules.test.d.ts +2 -0
  342. package/dist/packages/piero/src/stores/modules.test.d.ts.map +1 -0
  343. package/dist/{src → packages/piero/src}/stores/notifications.d.ts +2 -1
  344. package/dist/packages/piero/src/stores/notifications.d.ts.map +1 -0
  345. package/dist/{src → packages/piero/src}/stores/search.d.ts +6 -2
  346. package/dist/packages/piero/src/stores/search.d.ts.map +1 -0
  347. package/dist/{src → packages/piero/src}/stores/widgets.d.ts +2 -1
  348. package/dist/packages/piero/src/stores/widgets.d.ts.map +1 -0
  349. package/dist/{src → packages/piero/src}/types/Annotation.d.ts +5 -2
  350. package/dist/packages/piero/src/types/Annotation.d.ts.map +1 -0
  351. package/dist/{src → packages/piero/src}/types/AnnotationMode.d.ts +1 -0
  352. package/dist/packages/piero/src/types/AnnotationMode.d.ts.map +1 -0
  353. package/dist/{src → packages/piero/src}/types/Bookmark.d.ts +1 -0
  354. package/dist/packages/piero/src/types/Bookmark.d.ts.map +1 -0
  355. package/dist/{src → packages/piero/src}/types/CameraPosition.d.ts +4 -0
  356. package/dist/packages/piero/src/types/CameraPosition.d.ts.map +1 -0
  357. package/dist/packages/piero/src/types/Dataset.d.ts +81 -0
  358. package/dist/packages/piero/src/types/Dataset.d.ts.map +1 -0
  359. package/dist/{src → packages/piero/src}/types/Feature.d.ts +1 -0
  360. package/dist/packages/piero/src/types/Feature.d.ts.map +1 -0
  361. package/dist/{src → packages/piero/src}/types/Measure.d.ts +1 -0
  362. package/dist/packages/piero/src/types/Measure.d.ts.map +1 -0
  363. package/dist/{src → packages/piero/src}/types/MeasurementMode.d.ts +1 -0
  364. package/dist/packages/piero/src/types/MeasurementMode.d.ts.map +1 -0
  365. package/dist/{src → packages/piero/src}/types/Named.d.ts +1 -0
  366. package/dist/packages/piero/src/types/Named.d.ts.map +1 -0
  367. package/dist/{src → packages/piero/src}/types/NavigationMode.d.ts +1 -0
  368. package/dist/packages/piero/src/types/NavigationMode.d.ts.map +1 -0
  369. package/dist/{src → packages/piero/src}/types/OLGeometry.d.ts +1 -0
  370. package/dist/packages/piero/src/types/OLGeometry.d.ts.map +1 -0
  371. package/dist/{src → packages/piero/src}/types/Viewbox.d.ts +1 -0
  372. package/dist/packages/piero/src/types/Viewbox.d.ts.map +1 -0
  373. package/dist/packages/piero/src/types/index.d.ts +1 -0
  374. package/dist/packages/piero/src/types/index.d.ts.map +1 -0
  375. package/dist/{src → packages/piero/src}/types/utilities.d.ts +1 -0
  376. package/dist/packages/piero/src/types/utilities.d.ts.map +1 -0
  377. package/dist/{src → packages/piero/src}/utils/Components.d.ts +1 -0
  378. package/dist/packages/piero/src/utils/Components.d.ts.map +1 -0
  379. package/dist/packages/piero/src/utils/Configuration.d.ts +12 -0
  380. package/dist/packages/piero/src/utils/Configuration.d.ts.map +1 -0
  381. package/dist/{src → packages/piero/src}/utils/Download.d.ts +2 -1
  382. package/dist/packages/piero/src/utils/Download.d.ts.map +1 -0
  383. package/dist/{src → packages/piero/src}/utils/Fetcher.d.ts +2 -20
  384. package/dist/packages/piero/src/utils/Fetcher.d.ts.map +1 -0
  385. package/dist/{src → packages/piero/src}/utils/Measure.d.ts +1 -0
  386. package/dist/packages/piero/src/utils/Measure.d.ts.map +1 -0
  387. package/dist/{src → packages/piero/src}/utils/Projections.d.ts +3 -2
  388. package/dist/packages/piero/src/utils/Projections.d.ts.map +1 -0
  389. package/dist/{src → packages/piero/src}/utils/Types.d.ts +1 -0
  390. package/dist/packages/piero/src/utils/Types.d.ts.map +1 -0
  391. package/dist/{src/utils/OLFeatures.d.ts → packages/piero/src/utils/features.d.ts} +1 -0
  392. package/dist/packages/piero/src/utils/features.d.ts.map +1 -0
  393. package/dist/packages/piero/src/utils/style.d.ts +4 -0
  394. package/dist/packages/piero/src/utils/style.d.ts.map +1 -0
  395. package/dist/userData.cjs.js +6 -0
  396. package/dist/userData.cjs.js.map +1 -0
  397. package/dist/{Components.es.js → userData.es.js} +2283 -3131
  398. package/dist/userData.es.js.map +1 -0
  399. package/package.json +9 -5
  400. package/dist/Components.cjs.js +0 -7
  401. package/dist/Components.cjs.js.map +0 -1
  402. package/dist/Components.es.js.map +0 -1
  403. package/dist/src/api/BookmarkApi.d.ts +0 -6
  404. package/dist/src/api/NotificationApi.d.ts +0 -10
  405. package/dist/src/api/ViewApi.d.ts +0 -10
  406. package/dist/src/api/index.d.ts +0 -5
  407. package/dist/src/components/StatusBar.vue.d.ts +0 -10
  408. package/dist/src/components/atoms/CompactList.vue.d.ts +0 -17
  409. package/dist/src/components/panels/BasemapItem.vue.d.ts +0 -17
  410. package/dist/src/components/panels/DatagroupItem.vue.d.ts +0 -18
  411. package/dist/src/components/panels/DatasetItem.vue.d.ts +0 -18
  412. package/dist/src/components/panels/DatasetOrGroupItem.vue.d.ts +0 -16
  413. package/dist/src/components/panels/DatasetPanel.vue.d.ts +0 -2
  414. package/dist/src/components/panels/OverlayItem.vue.d.ts +0 -19
  415. package/dist/src/config-loader.d.ts +0 -7
  416. package/dist/src/createPieroApp.d.ts +0 -31
  417. package/dist/src/giro3d/EntityBuilder.d.ts +0 -21
  418. package/dist/src/giro3d/Graticule.d.ts +0 -20
  419. package/dist/src/giro3d/Grid.d.ts +0 -11
  420. package/dist/src/giro3d/LayerBuilder.d.ts +0 -46
  421. package/dist/src/giro3d/Plane.d.ts +0 -11
  422. package/dist/src/giro3d/Skybox.d.ts +0 -6
  423. package/dist/src/giro3d/entities/PointCloudEntity.d.ts +0 -45
  424. package/dist/src/giro3d/entities/TiledPointCloudEntity.d.ts +0 -13
  425. package/dist/src/giro3d/entities/Tiles3dEntity.d.ts +0 -11
  426. package/dist/src/giro3d/entities/VectorLabelsEntity.d.ts +0 -48
  427. package/dist/src/giro3d/entities/VectorMeshEntity.d.ts +0 -97
  428. package/dist/src/giro3d/entities/VectorShapeEntity.d.ts +0 -8
  429. package/dist/src/giro3d/entities/flatPointCloud.d.ts +0 -2
  430. package/dist/src/giro3d/entities/tiledIfc.d.ts +0 -2
  431. package/dist/src/giro3d/entities/vector.d.ts +0 -2
  432. package/dist/src/giro3d/sources/GeopackageSource.d.ts +0 -20
  433. package/dist/src/giro3d/sources/ShapefileSource.d.ts +0 -20
  434. package/dist/src/giro3d/sources/mixins.d.ts +0 -60
  435. package/dist/src/index.d.ts +0 -18
  436. package/dist/src/loaders/csv.d.ts +0 -3
  437. package/dist/src/loaders/las.d.ts +0 -3
  438. package/dist/src/loaders/loader.test.d.ts +0 -1
  439. package/dist/src/loaders/vector.d.ts +0 -4
  440. package/dist/src/modules/ClippingBoxAnalysis.d.ts +0 -18
  441. package/dist/src/modules/CrossSectionAnalysis.d.ts +0 -11
  442. package/dist/src/modules/FloodingPlaneAnalysis.d.ts +0 -11
  443. package/dist/src/modules/IFCLoader.d.ts +0 -10
  444. package/dist/src/modules/PLYLoader.d.ts +0 -10
  445. package/dist/src/modules/PotreeLoader.d.ts +0 -10
  446. package/dist/src/modules/clippingBoxAnalysis/store.d.ts +0 -2268
  447. package/dist/src/modules/crossSectionAnalysis/CrossSectionHelper.d.ts +0 -4
  448. package/dist/src/modules/crossSectionAnalysis/store.d.ts +0 -542
  449. package/dist/src/modules/index.d.ts +0 -13
  450. package/dist/src/modules/ply/PlyEntity.d.ts +0 -33
  451. package/dist/src/services/LayerManager.d.ts +0 -37
  452. package/dist/src/stores/layers.d.ts +0 -40
  453. package/dist/src/stores/modules.test.d.ts +0 -1
  454. package/dist/src/types/BaseLayer.d.ts +0 -30
  455. package/dist/src/types/Configuration.d.ts +0 -106
  456. package/dist/src/types/Dataset.d.ts +0 -78
  457. package/dist/src/types/IFCTypes.d.ts +0 -5
  458. package/dist/src/types/LayerObject.d.ts +0 -20
  459. package/dist/src/types/Notification.d.ts +0 -8
  460. package/dist/src/types/Overlay.d.ts +0 -24
  461. package/dist/src/types/VectorStyle.d.ts +0 -31
  462. package/dist/src/types/configuration/analysis.d.ts +0 -26
  463. package/dist/src/types/configuration/bookmark.d.ts +0 -16
  464. package/dist/src/types/configuration/camera.d.ts +0 -19
  465. package/dist/src/types/configuration/color.d.ts +0 -18
  466. package/dist/src/types/configuration/datasets/cityjson.d.ts +0 -9
  467. package/dist/src/types/configuration/datasets/core.d.ts +0 -49
  468. package/dist/src/types/configuration/datasets/featureCollection.d.ts +0 -6
  469. package/dist/src/types/configuration/datasets/ifc.d.ts +0 -10
  470. package/dist/src/types/configuration/datasets/index.d.ts +0 -27
  471. package/dist/src/types/configuration/datasets/layer.d.ts +0 -43
  472. package/dist/src/types/configuration/datasets/ply.d.ts +0 -10
  473. package/dist/src/types/configuration/datasets/pointCloud.d.ts +0 -12
  474. package/dist/src/types/configuration/datasets/potreePointCloud.d.ts +0 -10
  475. package/dist/src/types/configuration/datasets/tiledIfc.d.ts +0 -9
  476. package/dist/src/types/configuration/datasets/tiledPointCloud.d.ts +0 -9
  477. package/dist/src/types/configuration/datasets/vector.d.ts +0 -34
  478. package/dist/src/types/configuration/features.d.ts +0 -2
  479. package/dist/src/types/configuration/geographic.d.ts +0 -51
  480. package/dist/src/types/configuration/layers/core.d.ts +0 -50
  481. package/dist/src/types/configuration/layers/index.d.ts +0 -51
  482. package/dist/src/types/configuration/sources/bingMaps.d.ts +0 -5
  483. package/dist/src/types/configuration/sources/core/baseConfig.d.ts +0 -70
  484. package/dist/src/types/configuration/sources/core/tiled.d.ts +0 -19
  485. package/dist/src/types/configuration/sources/core/vector.d.ts +0 -13
  486. package/dist/src/types/configuration/sources/core/vectorTile.d.ts +0 -8
  487. package/dist/src/types/configuration/sources/customVector.d.ts +0 -7
  488. package/dist/src/types/configuration/sources/customVectorTile.d.ts +0 -8
  489. package/dist/src/types/configuration/sources/geojson.d.ts +0 -5
  490. package/dist/src/types/configuration/sources/geotiff.d.ts +0 -8
  491. package/dist/src/types/configuration/sources/gpx.d.ts +0 -5
  492. package/dist/src/types/configuration/sources/kml.d.ts +0 -5
  493. package/dist/src/types/configuration/sources/mvt.d.ts +0 -10
  494. package/dist/src/types/configuration/sources/osm.d.ts +0 -5
  495. package/dist/src/types/configuration/sources/stadiaMaps.d.ts +0 -5
  496. package/dist/src/types/configuration/sources/wms.d.ts +0 -15
  497. package/dist/src/types/configuration/sources/wmts.d.ts +0 -15
  498. package/dist/src/types/configuration/sources/xyz.d.ts +0 -9
  499. package/dist/src/utils/Configuration.d.ts +0 -15
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/api/AnalysisApi.ts","../src/api/BookmarkApi.ts","../src/components/Configuration.ts","../src/giro3d/entities/FeatureCollectionEntity.ts","../src/giro3d/entities/PointCloudEntity.ts","../src/giro3d/entities/flatPointCloud.ts","../src/giro3d/entities/Tiles3dEntity.ts","../src/giro3d/entities/tiledIfc.ts","../src/giro3d/entities/TiledPointCloudEntity.ts","../src/providers/IgnProvider.ts","../src/providers/Alticoding.ts","../../../node_modules/proj4/lib/global.js","../../../node_modules/proj4/lib/constants/values.js","../../../node_modules/proj4/lib/constants/PrimeMeridian.js","../../../node_modules/proj4/lib/constants/units.js","../../../node_modules/proj4/lib/match.js","../../../node_modules/proj4/lib/projString.js","../../../node_modules/wkt-parser/PROJJSONBuilderBase.js","../../../node_modules/wkt-parser/PROJJSONBuilder2015.js","../../../node_modules/wkt-parser/PROJJSONBuilder2019.js","../../../node_modules/wkt-parser/buildPROJJSON.js","../../../node_modules/wkt-parser/detectWKTVersion.js","../../../node_modules/wkt-parser/parser.js","../../../node_modules/wkt-parser/process.js","../../../node_modules/wkt-parser/util.js","../../../node_modules/wkt-parser/transformPROJJSON.js","../../../node_modules/wkt-parser/index.js","../../../node_modules/proj4/lib/defs.js","../../../node_modules/proj4/lib/parseCode.js","../../../node_modules/proj4/lib/extend.js","../../../node_modules/proj4/lib/common/msfnz.js","../../../node_modules/proj4/lib/common/sign.js","../../../node_modules/proj4/lib/common/adjust_lon.js","../../../node_modules/proj4/lib/common/tsfnz.js","../../../node_modules/proj4/lib/common/phi2z.js","../../../node_modules/proj4/lib/projections/merc.js","../../../node_modules/proj4/lib/projections/longlat.js","../../../node_modules/proj4/lib/projections.js","../../../node_modules/proj4/lib/constants/Ellipsoid.js","../../../node_modules/proj4/lib/deriveConstants.js","../../../node_modules/proj4/lib/constants/Datum.js","../../../node_modules/proj4/lib/datum.js","../../../node_modules/proj4/lib/nadgrid.js","../../../node_modules/proj4/lib/Proj.js","../../../node_modules/proj4/lib/datumUtils.js","../../../node_modules/proj4/lib/datum_transform.js","../../../node_modules/proj4/lib/adjust_axis.js","../../../node_modules/proj4/lib/common/toPoint.js","../../../node_modules/proj4/lib/checkSanity.js","../../../node_modules/proj4/lib/transform.js","../../../node_modules/proj4/lib/core.js","../../../node_modules/mgrs/mgrs.js","../../../node_modules/proj4/lib/Point.js","../../../node_modules/proj4/lib/common/pj_enfn.js","../../../node_modules/proj4/lib/common/pj_mlfn.js","../../../node_modules/proj4/lib/common/pj_inv_mlfn.js","../../../node_modules/proj4/lib/projections/tmerc.js","../../../node_modules/proj4/lib/common/sinh.js","../../../node_modules/proj4/lib/common/hypot.js","../../../node_modules/proj4/lib/common/log1py.js","../../../node_modules/proj4/lib/common/asinhy.js","../../../node_modules/proj4/lib/common/gatg.js","../../../node_modules/proj4/lib/common/clens.js","../../../node_modules/proj4/lib/common/cosh.js","../../../node_modules/proj4/lib/common/clens_cmplx.js","../../../node_modules/proj4/lib/projections/etmerc.js","../../../node_modules/proj4/lib/common/adjust_zone.js","../../../node_modules/proj4/lib/projections/utm.js","../../../node_modules/proj4/lib/common/srat.js","../../../node_modules/proj4/lib/projections/gauss.js","../../../node_modules/proj4/lib/projections/sterea.js","../../../node_modules/proj4/lib/projections/stere.js","../../../node_modules/proj4/lib/projections/somerc.js","../../../node_modules/proj4/lib/projections/omerc.js","../../../node_modules/proj4/lib/projections/lcc.js","../../../node_modules/proj4/lib/projections/krovak.js","../../../node_modules/proj4/lib/common/mlfn.js","../../../node_modules/proj4/lib/common/e0fn.js","../../../node_modules/proj4/lib/common/e1fn.js","../../../node_modules/proj4/lib/common/e2fn.js","../../../node_modules/proj4/lib/common/e3fn.js","../../../node_modules/proj4/lib/common/gN.js","../../../node_modules/proj4/lib/common/adjust_lat.js","../../../node_modules/proj4/lib/common/imlfn.js","../../../node_modules/proj4/lib/projections/cass.js","../../../node_modules/proj4/lib/common/qsfnz.js","../../../node_modules/proj4/lib/projections/laea.js","../../../node_modules/proj4/lib/common/asinz.js","../../../node_modules/proj4/lib/projections/aea.js","../../../node_modules/proj4/lib/projections/gnom.js","../../../node_modules/proj4/lib/common/iqsfnz.js","../../../node_modules/proj4/lib/projections/cea.js","../../../node_modules/proj4/lib/projections/eqc.js","../../../node_modules/proj4/lib/projections/poly.js","../../../node_modules/proj4/lib/projections/nzmg.js","../../../node_modules/proj4/lib/projections/mill.js","../../../node_modules/proj4/lib/projections/sinu.js","../../../node_modules/proj4/lib/projections/moll.js","../../../node_modules/proj4/lib/projections/eqdc.js","../../../node_modules/proj4/lib/projections/vandg.js","../../../node_modules/proj4/lib/projections/aeqd.js","../../../node_modules/proj4/lib/projections/ortho.js","../../../node_modules/proj4/lib/projections/qsc.js","../../../node_modules/proj4/lib/projections/robin.js","../../../node_modules/proj4/lib/projections/geocent.js","../../../node_modules/proj4/lib/projections/tpers.js","../../../node_modules/proj4/lib/projections/geos.js","../../../node_modules/proj4/projs.js","../../../node_modules/proj4/lib/index.js","../src/utils/Projections.ts","../src/utils/OLFeatures.ts","../src/giro3d/entities/VectorMeshEntity.ts","../src/giro3d/sources/GeopackageSource.ts","../src/giro3d/sources/ShapefileSource.ts","../../../node_modules/three/examples/jsm/renderers/CSS2DRenderer.js","../src/giro3d/entities/VectorLabelsEntity.ts","../src/giro3d/entities/VectorShapeEntity.ts","../src/giro3d/entities/vector.ts","../src/giro3d/EntityBuilder.ts","../src/loaders/csv.ts","../src/loaders/las.ts","../src/loaders/vector.ts","../src/loaders/loader.ts","../src/services/Highlighter.ts","../src/api/DatasetApi.ts","../src/api/NotificationApi.ts","../src/api/SearchApi.ts","../src/api/WidgetApi.ts","../src/events.ts","../src/stores/annotations.ts","../src/stores/notifications.ts","../src/types/Annotation.ts","../src/types/Notification.ts","../src/utils/Measure.ts","../src/services/AnnotationManager.ts","../../../node_modules/camera-controls/dist/camera-controls.module.js","../src/types/CameraPosition.ts","../src/giro3d/CameraControlsInspector.ts","../src/services/CameraController.ts","../src/services/DatasetManager.ts","../src/services/MeasureTool.ts","../src/stores/measurement.ts","../src/types/Measure.ts","../src/services/MeasurementManager.ts","../src/services/SceneCursorManager.ts","../src/services/Giro3DManager.ts","../src/api/ViewApi.ts","../src/components/AlertToast.vue","../src/components/ColorFragment.vue","../src/components/CoordinateFragment.vue","../src/components/LinkFragment.vue","../src/components/AttributeItem.vue","../src/components/AttributeGroup.vue","../src/components/AttributePanel.vue","../src/assets/piero_logo.png","../src/components/LoadingScreen.vue","../src/components/MainView.vue","../src/components/NavigationButtons.vue","../src/assets/sponsors/bpi_france.png","../src/assets/sponsors/france_2030.png","../src/assets/sponsors/france_relance.png","../src/assets/sponsors/oslandia.png","../src/assets/sponsors/ue_next_generation.png","../src/components/panels/AboutPanel.vue","../../../node_modules/three/src/math/MathUtils.js","../src/stores/analysis.ts","../src/components/panels/analysis/ToolWrapper.vue","../src/components/panels/AnalysisPanel.vue","../src/components/atoms/ButtonArea.vue","../src/components/atoms/ImportButton.vue","../src/components/DropdownView.vue","../src/components/VisibilityControl.vue","../src/components/panels/EmptyIndicator.vue","../src/components/panels/AnnotationItem.vue","../src/types/AnnotationMode.ts","../src/components/panels/AnnotationPanel.vue","../src/components/ModalOverlay.vue","../src/components/panels/BookmarkItem.vue","../src/components/panels/ShareBookmarkModal.vue","../src/types/Bookmark.ts","../src/stores/bookmarks.ts","../src/components/panels/BookmarkPanel.vue","../src/components/atoms/CompactList.vue","../src/components/atoms/SectionCollapsible.vue","../src/components/atoms/ListLabel.vue","../src/components/OpacitySlider.vue","../src/components/panels/BasemapItem.vue","../src/components/SpinnerControl.vue","../src/components/panels/DatagroupItem.vue","../src/components/panels/DatasetItem.vue","../src/components/panels/DatasetOrGroupItem.vue","../src/components/panels/OverlayItem.vue","../src/components/panels/DatasetPanel.vue","../src/components/panels/MeasurementItem.vue","../src/types/MeasurementMode.ts","../src/components/panels/MeasurementPanel.vue","../src/components/PanelContainer.vue","../src/components/ProgressBar.vue","../src/stores/search.ts","../src/components/SearchOverlay.vue","../src/components/StatusBar.vue","../src/assets/piero_logo_compact.png","../src/components/toolbar/ToolbarButton.vue","../src/components/toolbar/ToolBar.vue","../src/stores/widgets.ts","../src/App.vue","../src/createPieroApp.ts"],"sourcesContent":["import type { Component } from 'vue';\n\nimport type { AnalysisStore } from '@/stores/analysis';\n\nexport type AnalysisToolRegistrationParams = {\n component: Component;\n icon: string;\n name: string;\n};\n\nexport class AnalysisApiImpl implements AnalysisApi {\n public constructor(private readonly store: AnalysisStore) {}\n\n public registerTool(params: AnalysisToolRegistrationParams): void {\n this.store.registerTool(params);\n }\n}\n\nexport default interface AnalysisApi {\n registerTool(params: AnalysisToolRegistrationParams): void;\n}\n","import type { BookmarkStore } from '@/stores/bookmarks';\nimport type Bookmark from '@/types/Bookmark';\n\n/** @internal */\nexport class BookmarkApiImpl implements BookmarkApi {\n private readonly _store: BookmarkStore;\n\n public constructor(store: BookmarkStore) {\n this._store = store;\n }\n\n public clearBookmarks(): void {\n this._store.clear();\n }\n\n public getBookmarks(): Bookmark[] {\n return this._store.getBookmarks();\n }\n\n public setBookmarks(bookmarks: Bookmark[]): void {\n this._store.clear();\n for (const bookmark of bookmarks) {\n this._store.add(bookmark);\n }\n }\n}\n\nexport default interface BookmarkApi {\n clearBookmarks(): void;\n getBookmarks(): Bookmark[];\n setBookmarks(bookmarks: Bookmark[]): void;\n}\n","import type { Component } from 'vue';\n\nimport { hasExperimentalFeature } from '@/utils/Configuration';\n\ntype PanelDef = {\n enabled: boolean;\n icon: string;\n key: PanelType;\n title: string;\n};\n\nexport type PanelType =\n | 'about'\n | 'analysis'\n | 'annotations'\n | 'bookmarks'\n | 'datasets'\n | 'measures';\n\nlet panels: PanelDef[] | null = null;\n\ntype DatasetType = string;\n\nexport default function getPanels(): ReadonlyArray<PanelDef> {\n if (!panels) {\n panels = [\n { enabled: true, icon: 'bi-database', key: 'datasets', title: 'Datasets' },\n { enabled: true, icon: 'bi-vector-pen', key: 'annotations', title: 'Annotations' },\n {\n enabled: hasExperimentalFeature('measurements'),\n icon: 'bi-rulers',\n key: 'measures',\n title: 'Measurements',\n },\n { enabled: true, icon: 'bi-graph-up', key: 'analysis', title: 'Analysis' },\n { enabled: true, icon: 'bi-bookmarks', key: 'bookmarks', title: 'Bookmarks' },\n { enabled: true, icon: 'bi-info-circle', key: 'about', title: 'About Piero' },\n ] as const;\n }\n return panels;\n}\n\nexport const propertyViews: Map<DatasetType, Component> = new Map();\n\nexport const datasetIcons: Record<DatasetType, string> = {\n colorLayer: 'fg-landcover-map',\n elevationLayer: 'fg-contour-map',\n featureCollection: 'bi-buildings',\n maskLayer: 'fg-hex-map',\n pointcloud: 'fg-multipoint',\n tiledIfc: 'bi-building',\n vector: 'fg-polygon-pt',\n};\n\nexport const datasetTitles: Record<DatasetType, string> = {\n colorLayer: 'Color Layer',\n elevationLayer: 'Elevation layer',\n featureCollection: 'Feature Collection',\n maskLayer: 'Mask Layer',\n pointcloud: 'Point Cloud',\n tiledIfc: 'IFC',\n vector: 'Vector',\n};\n","import type {\n FeatureElevationCallback,\n FeatureExtrusionOffsetCallback,\n FeatureStyle,\n FeatureStyleCallback,\n FillStyle,\n} from '@giro3d/giro3d/core/FeatureTypes';\nimport type Feature from 'ol/Feature';\n\nimport Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport FeatureCollection from '@giro3d/giro3d/entities/FeatureCollection';\nimport { GeoJSON } from 'ol/format';\nimport { tile } from 'ol/loadingstrategy.js';\nimport VectorSource from 'ol/source/Vector';\nimport { createXYZ } from 'ol/tilegrid.js';\nimport { Color } from 'three';\n\nimport type { FeatureCollectionDatasetConfig } from '@/types/configuration/datasets/featureCollection';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nimport type { EntityBuilder } from '../EntityBuilder';\nimport type { FeatureProjectionMixin } from '../sources/mixins';\n\n/** Options for the Giro3D FeatureCollection */\ntype FeatureCollectionConstructorOptions = ConstructorParameters<typeof FeatureCollection>[0];\n\n/** Options for {@link FeatureCollectionEntity} */\nexport interface FeatureCollectionEntityOptions\n extends Partial<\n Pick<\n FeatureCollectionConstructorOptions,\n 'extent' | 'ignoreZ' | 'maxLevel' | 'minLevel'\n >\n >,\n Required<FeatureProjectionMixin> {\n /**\n * Set the elevation of the features received from the source.\n * It can be a constant for every feature, or a callback.\n * The callback version is particularly useful to derive the elevation\n * from the properties of the feature.\n * Requires {@link _ignoreZ} to be `false`.\n */\n elevation?: FeatureElevationCallback | number;\n /**\n * If set, this will cause 2D features to be extruded of the corresponding amount.\n * If a single value is given, it will be used for all the vertices of every feature.\n * If an array is given, each extruded vertex will use the corresponding value.\n * If a callback is given, it allows to extrude each feature individually.\n */\n extrusionOffset?: FeatureExtrusionOffsetCallback | number;\n /** Source to use */\n source: 'bdtopo';\n /**\n * An style or a callback returning a style to style the individual features.\n * If an object is used, the informations it contains will be used to style every\n * feature the same way. If a function is provided, it will be called with the feature.\n * This allows to individually style each feature.\n */\n style?: FeatureStyle | FeatureStyleCallback;\n}\n\n/**\n * Entity for displaying 3D buildings\n */\nexport class FeatureCollectionEntity extends FeatureCollection {\n public constructor(options: FeatureCollectionEntityOptions) {\n const crs = options.featureProjection;\n\n let filename: string;\n switch (options.source) {\n case 'bdtopo':\n filename = 'BDTOPO_V3:batiment';\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = options.source;\n return _exhaustiveCheck;\n }\n }\n\n const vectorSource = new VectorSource({\n format: new GeoJSON(),\n strategy: tile(createXYZ({ tileSize: 512 })),\n url: function url(bbox): string {\n return `${\n 'https://data.geopf.fr/wfs/ows' +\n '?SERVICE=WFS' +\n '&VERSION=2.0.0' +\n '&request=GetFeature' +\n '&typename=BDTOPO_V3:batiment' +\n '&outputFormat=application/json' +\n `&SRSNAME=${crs}` +\n '&startIndex=0' +\n '&bbox='\n }${bbox.join(',')},${crs}`;\n },\n });\n const extent =\n options.extent ??\n new Extent('EPSG:2154', -111629.52, 1275028.84, 5976033.79, 7230161.64); // Cover France by default\n const extrusionOffset =\n options.extrusionOffset ??\n ((feature: Feature): number => {\n const properties = feature.getProperties();\n const buildingHeight = properties['hauteur'];\n const extrusionOffset = -buildingHeight;\n\n if (Number.isNaN(extrusionOffset)) {\n return 0;\n }\n return extrusionOffset;\n });\n const style =\n options.style ??\n ((feature: Feature): FeatureStyle => {\n const properties = feature.getProperties();\n let fillColor = '#FFFFFF';\n\n switch (properties.usage_1) {\n case 'Agricole':\n fillColor = '#96ff0d';\n break;\n case 'Commercial et services':\n fillColor = '#d8ffd4';\n break;\n case 'Industriel':\n fillColor = '#f0bb41';\n break;\n case 'Religieux':\n fillColor = '#41b5f0';\n break;\n case 'Résidentiel':\n fillColor = '#cec8be';\n break;\n case 'Sportif':\n fillColor = '#ff0d45';\n break;\n }\n\n const fill: FillStyle = {\n color: new Color(fillColor),\n shading: true,\n };\n\n return {\n fill: fill,\n stroke: {\n color: 'black',\n lineWidth: undefined,\n },\n };\n });\n\n const parentOptions: ConstructorParameters<typeof FeatureCollection>[0] = {\n extent,\n extrusionOffset,\n maxLevel: options.maxLevel ?? 11,\n minLevel: options.minLevel ?? 11,\n source: vectorSource,\n style,\n };\n\n super(parentOptions);\n this.name = options.source;\n fillObject3DUserData(this, { filename });\n }\n}\n\nexport const build: EntityBuilder = context => {\n const cfg = context.dataset.config as FeatureCollectionDatasetConfig;\n const entity = new FeatureCollectionEntity({\n ...cfg,\n featureProjection: context.instance.referenceCrs,\n });\n\n return Promise.resolve(entity);\n};\n","import type { GetMemoryUsageContext } from '@giro3d/giro3d/core/MemoryUsage';\nimport type { EntityPreprocessOptions } from '@giro3d/giro3d/entities/Entity';\nimport type { PointCloudOptions } from '@giro3d/giro3d/entities/PointCloud';\nimport type {\n GetNodeDataOptions,\n PointCloudMetadata,\n PointCloudNode,\n PointCloudNodeData,\n} from '@giro3d/giro3d/sources/PointCloudSource';\nimport type { BufferAttribute } from 'three';\n\nimport OperationCounter from '@giro3d/giro3d/core/OperationCounter';\nimport PointCloud from '@giro3d/giro3d/entities/PointCloud';\nimport { PointCloudSourceBase } from '@giro3d/giro3d/sources/PointCloudSource';\nimport { load } from '@loaders.gl/core';\nimport { CSVLoader } from '@loaders.gl/csv';\nimport { type ArrayRowTable } from '@loaders.gl/schema';\nimport { Box3, Float32BufferAttribute, Vector3 } from 'three';\n\nimport type { UrlOrData } from '@/utils/Fetcher';\n\nimport { getConfig } from '@/config-loader';\nimport { fillObject3DUserData } from '@/loaders/userData';\nimport { getColorMap } from '@/utils/Configuration';\nimport Fetcher from '@/utils/Fetcher';\n\nimport type { DataProjectionMixin, UrlOrDataMixin } from '../sources/mixins';\n\nexport type CSVPointCloudSourceOptions = DataProjectionMixin & UrlOrDataMixin;\n\n/** Parameters for {@link PointCloudSource} for creating {@link PointCloudEntity} */\nexport interface PointCloudSourceOptions extends DataProjectionMixin, UrlOrDataMixin {}\n\n/**\n * Source for loading CSV (as X, Y, Z) point clouds.\n *\n * @see https://loaders.gl/docs/modules/csv/api-reference/csv-loader\n */\nexport class CSVPointCloudSource extends PointCloudSourceBase {\n public readonly dataProjection?: string;\n public readonly isCSVPointCloudSource = true as const;\n public readonly type = 'CSVPointCloudSource';\n public readonly url: UrlOrData;\n\n public get loading(): boolean {\n return this._opCounter.loading;\n }\n public get progress(): number {\n return this._opCounter.progress;\n }\n private _localVolume: Box3 | null = null;\n private _metadata: PointCloudMetadata | null = null;\n private readonly _opCounter = new OperationCounter();\n private _origin: Vector3 | null = null;\n private _points: Float32Array | null = null;\n\n private _root: PointCloudNode | null = null;\n\n private _zArray: Float32Array | null = null;\n\n public constructor(options: CSVPointCloudSourceOptions) {\n super();\n this.url = options.url;\n this.dataProjection = options.dataProjection;\n }\n\n public dispose(): void {\n // Nothing to dispose\n }\n\n public getHierarchy(): Promise<PointCloudNode> {\n if (this._root == null) {\n throw new Error('not initialized');\n }\n\n return Promise.resolve(this._root);\n }\n\n public getMemoryUsage(context: GetMemoryUsageContext): void {\n if (this._points != null) {\n context.objects.set(this.id, {\n cpuMemory: this._points.byteLength,\n gpuMemory: this._points.byteLength,\n });\n }\n }\n\n public getMetadata(): Promise<PointCloudMetadata> {\n if (this._metadata == null) {\n throw new Error('not initialized');\n }\n\n return Promise.resolve(this._metadata);\n }\n\n public getNodeData(params: GetNodeDataOptions): Promise<PointCloudNodeData> {\n if (\n this._points == null ||\n this._origin == null ||\n this._zArray == null ||\n this._metadata == null ||\n this._localVolume == null\n ) {\n throw new Error('not initialized');\n }\n\n let attribute: BufferAttribute | undefined = undefined;\n if (params.attribute != null && params.attribute.name === 'Z') {\n const zAttribute = new Float32BufferAttribute(this._zArray, 1);\n\n attribute = zAttribute;\n }\n\n return Promise.resolve({\n attribute,\n localBoundingBox: this._localVolume,\n origin: this._origin,\n pointCount: this._points.length / 3,\n position: params.position\n ? new Float32BufferAttribute(this._points, 3, false)\n : undefined,\n });\n }\n\n protected async initializeOnce(): Promise<this> {\n this._opCounter.increment();\n\n const raw = (await load(this.url, CSVLoader, {\n csv: { shape: 'array-row-table' },\n fetch: Fetcher.fetch,\n })) as ArrayRowTable;\n\n const posArray = new Float32Array(raw.data.length * 3);\n const zArray = new Float32Array(raw.data.length);\n\n const volume = new Box3().makeEmpty();\n const localVolume = new Box3().makeEmpty();\n\n const point = new Vector3();\n\n const origin = new Vector3(raw.data[0][0], raw.data[0][1], raw.data[0][2]);\n\n for (let i = 0; i < raw.data.length; i += 1) {\n const x = raw.data[i][0];\n const y = raw.data[i][1];\n const z = raw.data[i][2];\n\n const localX = x - origin.x;\n const localY = y - origin.y;\n const localZ = z - origin.z;\n\n volume.expandByPoint(point.set(x, y, z));\n localVolume.expandByPoint(point.set(localX, localY, localZ));\n\n posArray[i * 3 + 0] = localX;\n posArray[i * 3 + 1] = localY;\n posArray[i * 3 + 2] = localZ;\n\n zArray[i] = z;\n }\n\n this._points = posArray;\n this._zArray = zArray;\n this._origin = origin;\n this._localVolume = localVolume;\n\n const pointCount = posArray.length / 3;\n\n const node: PointCloudNode = {\n center: volume.getCenter(new Vector3()),\n depth: 0,\n geometricError: 0,\n hasData: true,\n id: 'root',\n pointCount,\n sourceId: this.id,\n volume,\n };\n\n this._root = node;\n\n this._metadata = {\n attributes: [\n {\n dimension: 1,\n interpretation: 'unknown',\n max: volume.max.z,\n min: volume.min.z,\n name: 'Z',\n size: 4,\n type: 'float',\n },\n ],\n crs: this.dataProjection != null ? { name: this.dataProjection } : undefined,\n pointCount,\n volume,\n };\n\n this._opCounter.decrement();\n\n return this;\n }\n}\n\n/**\n * Point cloud entity\n */\nexport default class PointCloudEntity extends PointCloud {\n public readonly isPointCloudEntity = true;\n\n public constructor(options: PointCloudOptions) {\n super(options);\n\n const config = getConfig();\n\n this.colorMap = getColorMap(config.pointcloud);\n\n if ('url' in options.source) {\n const context = Fetcher.getContext(options.source.url as string);\n fillObject3DUserData(this, { filename: context.filename });\n }\n }\n\n public override async initialize(opts: EntityPreprocessOptions): Promise<void> {\n await super.initialize(opts);\n\n this.setActiveAttribute('Z');\n }\n}\n","import type { PointCloudSource } from '@giro3d/giro3d/sources/PointCloudSource';\n\nimport COPCSource from '@giro3d/giro3d/sources/COPCSource';\nimport LASSource from '@giro3d/giro3d/sources/LASSource';\n\nimport type { PointCloudDatasetConfig } from '@/types/configuration/datasets/pointCloud';\n\nimport { getPublicFolderUrl } from '@/utils/Configuration';\nimport Fetcher from '@/utils/Fetcher';\n\nimport type { EntityBuilder } from '../EntityBuilder';\n\nimport PointCloudEntity, { CSVPointCloudSource } from './PointCloudEntity';\n\nexport const build: EntityBuilder = context => {\n const { dataset } = context;\n const cfg = dataset.config as PointCloudDatasetConfig;\n let source: PointCloudSource;\n\n switch (cfg.source.type) {\n case 'copc':\n source = new COPCSource({\n url:\n typeof cfg.source.url === 'string'\n ? getPublicFolderUrl(cfg.source.url)\n : async (begin: number, end: number): Promise<Uint8Array> => {\n const blob = cfg.source.url as Blob;\n const slice = blob.slice(begin, end);\n const buf = await slice.arrayBuffer();\n return new Uint8Array(buf);\n },\n });\n break;\n case 'csv':\n source = new CSVPointCloudSource({\n ...cfg.source,\n });\n break;\n case 'las':\n source = new LASSource({\n url:\n typeof cfg.source.url === 'string'\n ? getPublicFolderUrl(cfg.source.url)\n : async (): Promise<Uint8Array> => {\n const d = await Fetcher.fetchArrayBuffer(cfg.source.url);\n return new Uint8Array(d.slice(0));\n },\n });\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = cfg.source;\n return _exhaustiveCheck;\n }\n }\n\n const entity = new PointCloudEntity({ source });\n\n return Promise.resolve(entity);\n};\n","import type { Tiles3DOptions } from '@giro3d/giro3d/entities/Tiles3D';\n\nimport Tiles3D from '@giro3d/giro3d/entities/Tiles3D';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nimport type { UrlMixin } from '../sources/mixins';\n\n/** Parameters for creating {@link Tiles3dEntity} */\nexport interface Tiles3dSource extends UrlMixin {}\n\n/**\n * Entity for displaying 3D-Tiles files\n */\nexport default class Tiles3dEntity extends Tiles3D {\n public constructor(parameters: Tiles3dSource, options?: Tiles3DOptions) {\n super({ ...parameters, ...options });\n fillObject3DUserData(this, { filename: parameters.url });\n }\n}\n","import type { TiledIfcDatasetConfig } from '@/types/configuration/datasets/tiledIfc';\n\nimport { getPublicFolderUrl } from '@/utils/Configuration';\n\nimport type { EntityBuilder } from '../EntityBuilder';\n\nimport Tiles3dEntity from './Tiles3dEntity';\n\nexport const build: EntityBuilder = context => {\n const cfg = context.dataset.config as TiledIfcDatasetConfig;\n const entity = new Tiles3dEntity({\n ...cfg.source,\n url: getPublicFolderUrl(cfg.source.url),\n });\n\n return Promise.resolve(entity);\n};\n","import { MODE } from '@giro3d/giro3d/renderer/PointCloudMaterial';\n\nimport type { TiledPointCloudDatasetConfig } from '@/types/configuration/datasets/tiledPointCloud';\n\nimport { getConfig } from '@/config-loader';\nimport { getColorMap, getPublicFolderUrl } from '@/utils/Configuration';\n\nimport type { EntityBuilder } from '../EntityBuilder';\nimport type { Tiles3dSource } from './Tiles3dEntity';\n\nimport Tiles3dEntity from './Tiles3dEntity';\n\n/** Parameters for creating {@link TiledPointCloudEntity} */\nexport interface TiledPointCloudSource extends Tiles3dSource {\n name: string;\n}\n\n/**\n * Entity for displaying 3D-Tiles point clouds\n */\nexport default class TiledPointCloudEntity extends Tiles3dEntity {\n public constructor(parameters: TiledPointCloudSource) {\n const config = getConfig();\n super(parameters, {\n colorMap: getColorMap(config.pointcloud),\n pointCloudMode: MODE.ELEVATION,\n });\n this.name = `pointcloud-${parameters.name}`;\n }\n}\n\nexport const build: EntityBuilder = context => {\n const { dataset } = context;\n\n const cfg = dataset.config as TiledPointCloudDatasetConfig;\n const entity = new TiledPointCloudEntity({\n ...cfg.source,\n name: cfg.name,\n url: getPublicFolderUrl(cfg.source.url),\n });\n\n return Promise.resolve(entity);\n};\n","import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n\nimport Fetcher from '@/utils/Fetcher';\n\nconst tmpCoords = new Coordinates('EPSG:4326', 0, 0, 0);\n\ntype AltitudeResponse = {\n elevations: number[];\n};\n\nasync function alticode(lngs: number[], lats: number[]): Promise<number[]> {\n const chunkSize = 200;\n const promises = [];\n for (let i = 0; i < lngs.length; i += chunkSize) {\n const chunkLng = lngs.slice(i, i + chunkSize);\n const chunkLat = lats.slice(i, i + chunkSize);\n promises.push(alticodeBatch(chunkLng, chunkLat));\n }\n\n const res = await Promise.all(promises);\n return res.flat();\n}\n\nasync function alticodeBatch(lngs: number[], lats: number[]): Promise<number[]> {\n const altitude = await Fetcher.fetchJson<AltitudeResponse>(\n `https://data.geopf.fr/altimetrie/1.0/calcul/alti/rest/elevation.json?lon=${lngs.join(\n '|',\n )}&lat=${lats.join('|')}&zonly=true&resource=ign_rge_alti_wld&delimiter=|&indent=false`,\n );\n return altitude.elevations;\n}\n\nexport default {\n /**\n * Fetches altitudes from IGN Alti service.\n * Will fill the `altitude` component of each coordinates.\n *\n * @param coordinates - Coordinates to fetch altitudes for\n */\n async alticode(coordinates: Coordinates[]): Promise<void> {\n const lng: number[] = [];\n const lat: number[] = [];\n\n coordinates.forEach(c => {\n c.as('EPSG:4326', tmpCoords);\n lng.push(tmpCoords.longitude);\n lat.push(tmpCoords.latitude);\n });\n\n const altitude = await alticode(lng, lat);\n altitude.forEach((value: number, i: number) => {\n // @ts-expect-error Bypass isGeographic test as we don't care\n coordinates[i]._values[2] = value;\n });\n },\n};\n","import type Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type Map from '@giro3d/giro3d/entities/Map';\n\nimport IgnProvider from './IgnProvider';\n\n/**\n * Alticoder method\n */\nexport type Alticoder = (coordinates: Coordinates[]) => Promise<void>;\n\n/**\n * Alticoder using {@link IgnProvider}.\n */\nexport const IgnAlticoder = (coordinates: Coordinates[]): Promise<void> =>\n IgnProvider.alticode(coordinates);\n\n/**\n * Alticoder generator using (only) the map\n *\n * @param instance - Giro3D instance\n * @returns Alticoder\n */\nexport const mapAlticoderGenerator = (instance: Instance): Alticoder => {\n const map = instance.getEntities(o => (o as Map).isMap).at(0) as Map | undefined;\n if (map == null) {\n throw new Error('No map attached to the instance');\n }\n\n const alticoder = async (coordinates: Coordinates[]): Promise<void> => {\n coordinates.forEach(coords => {\n const res = map\n .getElevation({ coordinates: coords })\n .samples.sort((a, b) => a.resolution - b.resolution)\n .at(0);\n if (res != null) {\n // @ts-expect-error Bypass isGeographic test as we don't care\n coords._values[2] = res.elevation;\n }\n });\n return Promise.resolve();\n };\n return alticoder;\n};\n\n/**\n * Alticoder generator using multiple ones\n * @param alticoders - List of alticoders to use\n * @param noDataValue - No data value\n * @returns\n */\nexport const alticoders = (alticoders: Alticoder[], noDataValue = 0): Alticoder => {\n const alticoder = async (coordinates: Coordinates[]): Promise<void> => {\n // @ts-expect-error Bypass isGeographic test as we don't care\n let missingCoordinates = coordinates.filter(c => c._values[2] === noDataValue);\n for (const coder of alticoders) {\n await coder(missingCoordinates);\n // @ts-expect-error Bypass isGeographic test as we don't care\n missingCoordinates = missingCoordinates.filter(c => c._values[2] === noDataValue);\n if (missingCoordinates.length === 0) {\n // All done, exit early\n break;\n }\n }\n };\n return alticoder;\n};\n\n/**\n * Alticoder generator using the map if fast\n *\n * @param instance - Giro3D instance\n * @param fast - Fast alticoding\n * @returns Alticoder\n */\nexport const alticoderGenerator = (\n instance: Instance,\n fast: boolean,\n noDataValue = 0,\n): Alticoder => {\n return fast\n ? alticoders([mapAlticoderGenerator(instance), IgnAlticoder], noDataValue)\n : IgnAlticoder;\n};\n","export default function(defs) {\n defs('EPSG:4326', \"+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees\");\n defs('EPSG:4269', \"+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees\");\n defs('EPSG:3857', \"+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs\");\n\n defs.WGS84 = defs['EPSG:4326'];\n defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857\n defs.GOOGLE = defs['EPSG:3857'];\n defs['EPSG:900913'] = defs['EPSG:3857'];\n defs['EPSG:102113'] = defs['EPSG:3857'];\n}\n","export var PJD_3PARAM = 1;\nexport var PJD_7PARAM = 2;\nexport var PJD_GRIDSHIFT = 3;\nexport var PJD_WGS84 = 4; // WGS84 or equivalent\nexport var PJD_NODATUM = 5; // WGS84 or equivalent\nexport var SRS_WGS84_SEMIMAJOR = 6378137.0; // only used in grid shift transforms\nexport var SRS_WGS84_SEMIMINOR = 6356752.314; // only used in grid shift transforms\nexport var SRS_WGS84_ESQUARED = 0.0066943799901413165; // only used in grid shift transforms\nexport var SEC_TO_RAD = 4.84813681109535993589914102357e-6;\nexport var HALF_PI = Math.PI/2;\n// ellipoid pj_set_ell.c\nexport var SIXTH = 0.1666666666666666667;\n/* 1/6 */\nexport var RA4 = 0.04722222222222222222;\n/* 17/360 */\nexport var RA6 = 0.02215608465608465608;\nexport var EPSLN = 1.0e-10;\n// you'd think you could use Number.EPSILON above but that makes\n// Mollweide get into an infinate loop.\n\nexport var D2R = 0.01745329251994329577;\nexport var R2D = 57.29577951308232088;\nexport var FORTPI = Math.PI/4;\nexport var TWO_PI = Math.PI * 2;\n// SPI is slightly greater than Math.PI, so values that exceed the -180..180\n// degree range by a tiny amount don't get wrapped. This prevents points that\n// have drifted from their original location along the 180th meridian (due to\n// floating point error) from changing their sign.\nexport var SPI = 3.14159265359;\n","var exports = {};\nexport {exports as default};\n\nexports.greenwich = 0.0; //\"0dE\",\nexports.lisbon = -9.131906111111; //\"9d07'54.862\\\"W\",\nexports.paris = 2.337229166667; //\"2d20'14.025\\\"E\",\nexports.bogota = -74.080916666667; //\"74d04'51.3\\\"W\",\nexports.madrid = -3.687938888889; //\"3d41'16.58\\\"W\",\nexports.rome = 12.452333333333; //\"12d27'8.4\\\"E\",\nexports.bern = 7.439583333333; //\"7d26'22.5\\\"E\",\nexports.jakarta = 106.807719444444; //\"106d48'27.79\\\"E\",\nexports.ferro = -17.666666666667; //\"17d40'W\",\nexports.brussels = 4.367975; //\"4d22'4.71\\\"E\",\nexports.stockholm = 18.058277777778; //\"18d3'29.8\\\"E\",\nexports.athens = 23.7163375; //\"23d42'58.815\\\"E\",\nexports.oslo = 10.722916666667; //\"10d43'22.5\\\"E\"\n","export default {\n ft: {to_meter: 0.3048},\n 'us-ft': {to_meter: 1200 / 3937}\n};\n","var ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\nexport default function match(obj, key) {\n if (obj[key]) {\n return obj[key];\n }\n var keys = Object.keys(obj);\n var lkey = key.toLowerCase().replace(ignoredChar, '');\n var i = -1;\n var testkey, processedKey;\n while (++i < keys.length) {\n testkey = keys[i];\n processedKey = testkey.toLowerCase().replace(ignoredChar, '');\n if (processedKey === lkey) {\n return obj[testkey];\n }\n }\n}\n","import {D2R} from './constants/values';\nimport PrimeMeridian from './constants/PrimeMeridian';\nimport units from './constants/units';\nimport match from './match';\n\nexport default function(defData) {\n var self = {};\n var paramObj = defData.split('+').map(function(v) {\n return v.trim();\n }).filter(function(a) {\n return a;\n }).reduce(function(p, a) {\n var split = a.split('=');\n split.push(true);\n p[split[0].toLowerCase()] = split[1];\n return p;\n }, {});\n var paramName, paramVal, paramOutname;\n var params = {\n proj: 'projName',\n datum: 'datumCode',\n rf: function(v) {\n self.rf = parseFloat(v);\n },\n lat_0: function(v) {\n self.lat0 = v * D2R;\n },\n lat_1: function(v) {\n self.lat1 = v * D2R;\n },\n lat_2: function(v) {\n self.lat2 = v * D2R;\n },\n lat_ts: function(v) {\n self.lat_ts = v * D2R;\n },\n lon_0: function(v) {\n self.long0 = v * D2R;\n },\n lon_1: function(v) {\n self.long1 = v * D2R;\n },\n lon_2: function(v) {\n self.long2 = v * D2R;\n },\n alpha: function(v) {\n self.alpha = parseFloat(v) * D2R;\n },\n gamma: function(v) {\n self.rectified_grid_angle = parseFloat(v);\n },\n lonc: function(v) {\n self.longc = v * D2R;\n },\n x_0: function(v) {\n self.x0 = parseFloat(v);\n },\n y_0: function(v) {\n self.y0 = parseFloat(v);\n },\n k_0: function(v) {\n self.k0 = parseFloat(v);\n },\n k: function(v) {\n self.k0 = parseFloat(v);\n },\n a: function(v) {\n self.a = parseFloat(v);\n },\n b: function(v) {\n self.b = parseFloat(v);\n },\n r_a: function() {\n self.R_A = true;\n },\n zone: function(v) {\n self.zone = parseInt(v, 10);\n },\n south: function() {\n self.utmSouth = true;\n },\n towgs84: function(v) {\n self.datum_params = v.split(\",\").map(function(a) {\n return parseFloat(a);\n });\n },\n to_meter: function(v) {\n self.to_meter = parseFloat(v);\n },\n units: function(v) {\n self.units = v;\n var unit = match(units, v);\n if (unit) {\n self.to_meter = unit.to_meter;\n }\n },\n from_greenwich: function(v) {\n self.from_greenwich = v * D2R;\n },\n pm: function(v) {\n var pm = match(PrimeMeridian, v);\n self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R;\n },\n nadgrids: function(v) {\n if (v === '@null') {\n self.datumCode = 'none';\n }\n else {\n self.nadgrids = v;\n }\n },\n axis: function(v) {\n var legalAxis = \"ewnsud\";\n if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) {\n self.axis = v;\n }\n },\n approx: function() {\n self.approx = true;\n }\n };\n for (paramName in paramObj) {\n paramVal = paramObj[paramName];\n if (paramName in params) {\n paramOutname = params[paramName];\n if (typeof paramOutname === 'function') {\n paramOutname(paramVal);\n }\n else {\n self[paramOutname] = paramVal;\n }\n }\n else {\n self[paramName] = paramVal;\n }\n }\n if(typeof self.datumCode === 'string' && self.datumCode !== \"WGS84\"){\n self.datumCode = self.datumCode.toLowerCase();\n }\n return self;\n}\n","class PROJJSONBuilderBase {\n static getId(node) {\n const idNode = node.find((child) => Array.isArray(child) && child[0] === 'ID');\n if (idNode && idNode.length >= 3) {\n return {\n authority: idNode[1],\n code: parseInt(idNode[2], 10),\n };\n }\n return null;\n }\n\n static convertUnit(node, type = 'unit') {\n if (!node || node.length < 3) {\n return { type, name: 'unknown', conversion_factor: null };\n }\n\n const name = node[1];\n const conversionFactor = parseFloat(node[2]) || null;\n\n const idNode = node.find((child) => Array.isArray(child) && child[0] === 'ID');\n const id = idNode\n ? {\n authority: idNode[1],\n code: parseInt(idNode[2], 10),\n }\n : null;\n\n return {\n type,\n name,\n conversion_factor: conversionFactor,\n id,\n };\n }\n\n static convertAxis(node) {\n const name = node[1] || 'Unknown';\n\n // Determine the direction\n let direction;\n const abbreviationMatch = name.match(/^\\((.)\\)$/); // Match abbreviations like \"(E)\" or \"(N)\"\n if (abbreviationMatch) {\n // Use the abbreviation to determine the direction\n const abbreviation = abbreviationMatch[1].toUpperCase();\n if (abbreviation === 'E') direction = 'east';\n else if (abbreviation === 'N') direction = 'north';\n else if (abbreviation === 'U') direction = 'up';\n else throw new Error(`Unknown axis abbreviation: ${abbreviation}`);\n } else {\n // Use the explicit direction provided in the AXIS node\n direction = node[2] ? node[2].toLowerCase() : 'unknown';\n }\n\n const orderNode = node.find((child) => Array.isArray(child) && child[0] === 'ORDER');\n const order = orderNode ? parseInt(orderNode[1], 10) : null;\n\n const unitNode = node.find(\n (child) =>\n Array.isArray(child) &&\n (child[0] === 'LENGTHUNIT' || child[0] === 'ANGLEUNIT' || child[0] === 'SCALEUNIT')\n );\n const unit = this.convertUnit(unitNode);\n\n return {\n name,\n direction, // Use the valid PROJJSON direction value\n unit,\n order,\n };\n }\n\n static extractAxes(node) {\n return node\n .filter((child) => Array.isArray(child) && child[0] === 'AXIS')\n .map((axis) => this.convertAxis(axis))\n .sort((a, b) => (a.order || 0) - (b.order || 0)); // Sort by the \"order\" property\n }\n\n static convert(node, result = {}) {\n\n switch (node[0]) {\n case 'PROJCRS':\n result.type = 'ProjectedCRS';\n result.name = node[1];\n result.base_crs = node.find((child) => Array.isArray(child) && child[0] === 'BASEGEOGCRS')\n ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'BASEGEOGCRS'))\n : null;\n result.conversion = node.find((child) => Array.isArray(child) && child[0] === 'CONVERSION')\n ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'CONVERSION'))\n : null;\n\n const csNode = node.find((child) => Array.isArray(child) && child[0] === 'CS');\n if (csNode) {\n result.coordinate_system = {\n type: csNode[1],\n axis: this.extractAxes(node),\n };\n }\n\n const lengthUnitNode = node.find((child) => Array.isArray(child) && child[0] === 'LENGTHUNIT');\n if (lengthUnitNode) {\n const unit = this.convertUnit(lengthUnitNode);\n result.coordinate_system.unit = unit; // Add unit to coordinate_system\n }\n\n result.id = this.getId(node);\n break;\n\n case 'BASEGEOGCRS':\n case 'GEOGCRS':\n result.type = 'GeographicCRS';\n result.name = node[1];\n \n // Handle DATUM or ENSEMBLE\n const datumOrEnsembleNode = node.find(\n (child) => Array.isArray(child) && (child[0] === 'DATUM' || child[0] === 'ENSEMBLE')\n );\n if (datumOrEnsembleNode) {\n const datumOrEnsemble = this.convert(datumOrEnsembleNode);\n if (datumOrEnsembleNode[0] === 'ENSEMBLE') {\n result.datum_ensemble = datumOrEnsemble;\n } else {\n result.datum = datumOrEnsemble;\n }\n const primem = node.find((child) => Array.isArray(child) && child[0] === 'PRIMEM');\n if (primem && primem[1] !== 'Greenwich') {\n datumOrEnsemble.prime_meridian = {\n name: primem[1],\n longitude: parseFloat(primem[2]),\n }\n }\n }\n \n result.coordinate_system = {\n type: 'ellipsoidal',\n axis: this.extractAxes(node),\n };\n \n result.id = this.getId(node);\n break;\n\n case 'DATUM':\n result.type = 'GeodeticReferenceFrame';\n result.name = node[1];\n result.ellipsoid = node.find((child) => Array.isArray(child) && child[0] === 'ELLIPSOID')\n ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'ELLIPSOID'))\n : null;\n break;\n \n case 'ENSEMBLE':\n result.type = 'DatumEnsemble';\n result.name = node[1];\n \n // Extract ensemble members\n result.members = node\n .filter((child) => Array.isArray(child) && child[0] === 'MEMBER')\n .map((member) => ({\n type: 'DatumEnsembleMember',\n name: member[1],\n id: this.getId(member), // Extract ID as { authority, code }\n }));\n \n // Extract accuracy\n const accuracyNode = node.find((child) => Array.isArray(child) && child[0] === 'ENSEMBLEACCURACY');\n if (accuracyNode) {\n result.accuracy = parseFloat(accuracyNode[1]);\n }\n \n // Extract ellipsoid\n const ellipsoidNode = node.find((child) => Array.isArray(child) && child[0] === 'ELLIPSOID');\n if (ellipsoidNode) {\n result.ellipsoid = this.convert(ellipsoidNode); // Convert the ellipsoid node\n }\n \n // Extract identifier for the ensemble\n result.id = this.getId(node);\n break;\n\n case 'ELLIPSOID':\n result.type = 'Ellipsoid';\n result.name = node[1];\n result.semi_major_axis = parseFloat(node[2]);\n result.inverse_flattening = parseFloat(node[3]);\n const units = node.find((child) => Array.isArray(child) && child[0] === 'LENGTHUNIT')\n ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'LENGTHUNIT'), result)\n : null;\n break;\n\n case 'CONVERSION':\n result.type = 'Conversion';\n result.name = node[1];\n result.method = node.find((child) => Array.isArray(child) && child[0] === 'METHOD')\n ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'METHOD'))\n : null;\n result.parameters = node\n .filter((child) => Array.isArray(child) && child[0] === 'PARAMETER')\n .map((param) => this.convert(param));\n break;\n\n case 'METHOD':\n result.type = 'Method';\n result.name = node[1];\n result.id = this.getId(node);\n break;\n\n case 'PARAMETER':\n result.type = 'Parameter';\n result.name = node[1];\n result.value = parseFloat(node[2]);\n result.unit = this.convertUnit(\n node.find(\n (child) =>\n Array.isArray(child) &&\n (child[0] === 'LENGTHUNIT' || child[0] === 'ANGLEUNIT' || child[0] === 'SCALEUNIT')\n )\n );\n result.id = this.getId(node);\n break;\n\n case 'BOUNDCRS':\n result.type = 'BoundCRS';\n\n // Process SOURCECRS\n const sourceCrsNode = node.find((child) => Array.isArray(child) && child[0] === 'SOURCECRS');\n if (sourceCrsNode) {\n const sourceCrsContent = sourceCrsNode.find((child) => Array.isArray(child));\n result.source_crs = sourceCrsContent ? this.convert(sourceCrsContent) : null;\n }\n\n // Process TARGETCRS\n const targetCrsNode = node.find((child) => Array.isArray(child) && child[0] === 'TARGETCRS');\n if (targetCrsNode) {\n const targetCrsContent = targetCrsNode.find((child) => Array.isArray(child));\n result.target_crs = targetCrsContent ? this.convert(targetCrsContent) : null;\n }\n\n // Process ABRIDGEDTRANSFORMATION\n const transformationNode = node.find((child) => Array.isArray(child) && child[0] === 'ABRIDGEDTRANSFORMATION');\n if (transformationNode) {\n result.transformation = this.convert(transformationNode);\n } else {\n result.transformation = null;\n }\n break;\n\n case 'ABRIDGEDTRANSFORMATION':\n result.type = 'Transformation';\n result.name = node[1];\n result.method = node.find((child) => Array.isArray(child) && child[0] === 'METHOD')\n ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'METHOD'))\n : null;\n\n result.parameters = node\n .filter((child) => Array.isArray(child) && (child[0] === 'PARAMETER' || child[0] === 'PARAMETERFILE'))\n .map((param) => {\n if (param[0] === 'PARAMETER') {\n return this.convert(param);\n } else if (param[0] === 'PARAMETERFILE') {\n return {\n name: param[1],\n value: param[2],\n id: {\n 'authority': 'EPSG',\n 'code': 8656\n }\n };\n }\n });\n\n // Adjust the Scale difference parameter if present\n if (result.parameters.length === 7) {\n const scaleDifference = result.parameters[6];\n if (scaleDifference.name === 'Scale difference') {\n scaleDifference.value = Math.round((scaleDifference.value - 1) * 1e12) / 1e6;\n }\n }\n\n result.id = this.getId(node);\n break;\n \n case 'AXIS':\n if (!result.coordinate_system) {\n result.coordinate_system = { type: 'unspecified', axis: [] };\n }\n result.coordinate_system.axis.push(this.convertAxis(node));\n break;\n \n case 'LENGTHUNIT':\n const unit = this.convertUnit(node, 'LinearUnit');\n if (result.coordinate_system && result.coordinate_system.axis) {\n result.coordinate_system.axis.forEach((axis) => {\n if (!axis.unit) {\n axis.unit = unit;\n }\n });\n }\n if (unit.conversion_factor && unit.conversion_factor !== 1) {\n if (result.semi_major_axis) {\n result.semi_major_axis = {\n value: result.semi_major_axis,\n unit,\n }\n }\n }\n break;\n\n default:\n result.keyword = node[0];\n break;\n }\n\n return result;\n }\n}\n\nexport default PROJJSONBuilderBase;","import PROJJSONBuilderBase from './PROJJSONBuilderBase.js';\n\nclass PROJJSONBuilder2015 extends PROJJSONBuilderBase {\n static convert(node, result = {}) {\n super.convert(node, result);\n\n // Skip `CS` and `USAGE` nodes for WKT2-2015\n if (result.coordinate_system && result.coordinate_system.subtype === 'Cartesian') {\n delete result.coordinate_system;\n }\n if (result.usage) {\n delete result.usage;\n }\n\n return result;\n }\n}\n\nexport default PROJJSONBuilder2015;","import PROJJSONBuilderBase from './PROJJSONBuilderBase.js';\n\nclass PROJJSONBuilder2019 extends PROJJSONBuilderBase {\n static convert(node, result = {}) {\n super.convert(node, result);\n\n // Handle `CS` node for WKT2-2019\n const csNode = node.find((child) => Array.isArray(child) && child[0] === 'CS');\n if (csNode) {\n result.coordinate_system = {\n subtype: csNode[1],\n axis: this.extractAxes(node),\n };\n }\n\n // Handle `USAGE` node for WKT2-2019\n const usageNode = node.find((child) => Array.isArray(child) && child[0] === 'USAGE');\n if (usageNode) {\n const scope = usageNode.find((child) => Array.isArray(child) && child[0] === 'SCOPE');\n const area = usageNode.find((child) => Array.isArray(child) && child[0] === 'AREA');\n const bbox = usageNode.find((child) => Array.isArray(child) && child[0] === 'BBOX');\n result.usage = {};\n if (scope) {\n result.usage.scope = scope[1];\n }\n if (area) {\n result.usage.area = area[1];\n }\n if (bbox) {\n result.usage.bbox = bbox.slice(1);\n }\n }\n\n return result;\n }\n}\n\nexport default PROJJSONBuilder2019;","import PROJJSONBuilder2015 from './PROJJSONBuilder2015.js';\nimport PROJJSONBuilder2019 from './PROJJSONBuilder2019.js';\n\n/**\n * Detects the WKT2 version based on the structure of the WKT.\n * @param {Array} root The root WKT array node.\n * @returns {string} The detected version (\"2015\" or \"2019\").\n */\nfunction detectWKT2Version(root) {\n // Check for WKT2-2019-specific nodes\n if (root.find((child) => Array.isArray(child) && child[0] === 'USAGE')) {\n return '2019'; // `USAGE` is specific to WKT2-2019\n }\n\n // Check for WKT2-2015-specific nodes\n if (root.find((child) => Array.isArray(child) && child[0] === 'CS')) {\n return '2015'; // `CS` is valid in both, but default to 2015 unless `USAGE` is present\n }\n\n if (root[0] === 'BOUNDCRS' || root[0] === 'PROJCRS' || root[0] === 'GEOGCRS') {\n return '2015'; // These are valid in both, but default to 2015\n }\n\n // Default to WKT2-2015 if no specific indicators are found\n return '2015';\n}\n\n/**\n * Builds a PROJJSON object from a WKT array structure.\n * @param {Array} root The root WKT array node.\n * @returns {Object} The PROJJSON object.\n */\nexport function buildPROJJSON(root) {\n const version = detectWKT2Version(root);\n const builder = version === '2019' ? PROJJSONBuilder2019 : PROJJSONBuilder2015;\n return builder.convert(root);\n}\n","/**\n * Detects whether the WKT string is WKT1 or WKT2.\n * @param {string} wkt The WKT string.\n * @returns {string} The detected version (\"WKT1\" or \"WKT2\").\n */\nexport function detectWKTVersion(wkt) {\n // Normalize the WKT string for easier keyword matching\n const normalizedWKT = wkt.toUpperCase();\n\n // Check for WKT2-specific keywords\n if (\n normalizedWKT.includes('PROJCRS') ||\n normalizedWKT.includes('GEOGCRS') ||\n normalizedWKT.includes('BOUNDCRS') ||\n normalizedWKT.includes('VERTCRS') ||\n normalizedWKT.includes('LENGTHUNIT') ||\n normalizedWKT.includes('ANGLEUNIT') ||\n normalizedWKT.includes('SCALEUNIT')\n ) {\n return 'WKT2';\n }\n\n // Check for WKT1-specific keywords\n if (\n normalizedWKT.includes('PROJCS') ||\n normalizedWKT.includes('GEOGCS') ||\n normalizedWKT.includes('LOCAL_CS') ||\n normalizedWKT.includes('VERT_CS') ||\n normalizedWKT.includes('UNIT')\n ) {\n return 'WKT1';\n }\n\n // Default to WKT1 if no specific indicators are found\n return 'WKT1';\n}","export default parseString;\n\nvar NEUTRAL = 1;\nvar KEYWORD = 2;\nvar NUMBER = 3;\nvar QUOTED = 4;\nvar AFTERQUOTE = 5;\nvar ENDED = -1;\nvar whitespace = /\\s/;\nvar latin = /[A-Za-z]/;\nvar keyword = /[A-Za-z84_]/;\nvar endThings = /[,\\]]/;\nvar digets = /[\\d\\.E\\-\\+]/;\n// const ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\nfunction Parser(text) {\n if (typeof text !== 'string') {\n throw new Error('not a string');\n }\n this.text = text.trim();\n this.level = 0;\n this.place = 0;\n this.root = null;\n this.stack = [];\n this.currentObject = null;\n this.state = NEUTRAL;\n}\nParser.prototype.readCharicter = function() {\n var char = this.text[this.place++];\n if (this.state !== QUOTED) {\n while (whitespace.test(char)) {\n if (this.place >= this.text.length) {\n return;\n }\n char = this.text[this.place++];\n }\n }\n switch (this.state) {\n case NEUTRAL:\n return this.neutral(char);\n case KEYWORD:\n return this.keyword(char)\n case QUOTED:\n return this.quoted(char);\n case AFTERQUOTE:\n return this.afterquote(char);\n case NUMBER:\n return this.number(char);\n case ENDED:\n return;\n }\n};\nParser.prototype.afterquote = function(char) {\n if (char === '\"') {\n this.word += '\"';\n this.state = QUOTED;\n return;\n }\n if (endThings.test(char)) {\n this.word = this.word.trim();\n this.afterItem(char);\n return;\n }\n throw new Error('havn\\'t handled \"' +char + '\" in afterquote yet, index ' + this.place);\n};\nParser.prototype.afterItem = function(char) {\n if (char === ',') {\n if (this.word !== null) {\n this.currentObject.push(this.word);\n }\n this.word = null;\n this.state = NEUTRAL;\n return;\n }\n if (char === ']') {\n this.level--;\n if (this.word !== null) {\n this.currentObject.push(this.word);\n this.word = null;\n }\n this.state = NEUTRAL;\n this.currentObject = this.stack.pop();\n if (!this.currentObject) {\n this.state = ENDED;\n }\n\n return;\n }\n};\nParser.prototype.number = function(char) {\n if (digets.test(char)) {\n this.word += char;\n return;\n }\n if (endThings.test(char)) {\n this.word = parseFloat(this.word);\n this.afterItem(char);\n return;\n }\n throw new Error('havn\\'t handled \"' +char + '\" in number yet, index ' + this.place);\n};\nParser.prototype.quoted = function(char) {\n if (char === '\"') {\n this.state = AFTERQUOTE;\n return;\n }\n this.word += char;\n return;\n};\nParser.prototype.keyword = function(char) {\n if (keyword.test(char)) {\n this.word += char;\n return;\n }\n if (char === '[') {\n var newObjects = [];\n newObjects.push(this.word);\n this.level++;\n if (this.root === null) {\n this.root = newObjects;\n } else {\n this.currentObject.push(newObjects);\n }\n this.stack.push(this.currentObject);\n this.currentObject = newObjects;\n this.state = NEUTRAL;\n return;\n }\n if (endThings.test(char)) {\n this.afterItem(char);\n return;\n }\n throw new Error('havn\\'t handled \"' +char + '\" in keyword yet, index ' + this.place);\n};\nParser.prototype.neutral = function(char) {\n if (latin.test(char)) {\n this.word = char;\n this.state = KEYWORD;\n return;\n }\n if (char === '\"') {\n this.word = '';\n this.state = QUOTED;\n return;\n }\n if (digets.test(char)) {\n this.word = char;\n this.state = NUMBER;\n return;\n }\n if (endThings.test(char)) {\n this.afterItem(char);\n return;\n }\n throw new Error('havn\\'t handled \"' +char + '\" in neutral yet, index ' + this.place);\n};\nParser.prototype.output = function() {\n while (this.place < this.text.length) {\n this.readCharicter();\n }\n if (this.state === ENDED) {\n return this.root;\n }\n throw new Error('unable to parse string \"' +this.text + '\". State is ' + this.state);\n};\n\nfunction parseString(txt) {\n var parser = new Parser(txt);\n return parser.output();\n}\n","\n\nfunction mapit(obj, key, value) {\n if (Array.isArray(key)) {\n value.unshift(key);\n key = null;\n }\n var thing = key ? {} : obj;\n\n var out = value.reduce(function(newObj, item) {\n sExpr(item, newObj);\n return newObj\n }, thing);\n if (key) {\n obj[key] = out;\n }\n}\n\nexport function sExpr(v, obj) {\n if (!Array.isArray(v)) {\n obj[v] = true;\n return;\n }\n var key = v.shift();\n if (key === 'PARAMETER') {\n key = v.shift();\n }\n if (v.length === 1) {\n if (Array.isArray(v[0])) {\n obj[key] = {};\n sExpr(v[0], obj[key]);\n return;\n }\n obj[key] = v[0];\n return;\n }\n if (!v.length) {\n obj[key] = true;\n return;\n }\n if (key === 'TOWGS84') {\n obj[key] = v;\n return;\n }\n if (key === 'AXIS') {\n if (!(key in obj)) {\n obj[key] = [];\n }\n obj[key].push(v);\n return;\n }\n if (!Array.isArray(key)) {\n obj[key] = {};\n }\n\n var i;\n switch (key) {\n case 'UNIT':\n case 'PRIMEM':\n case 'VERT_DATUM':\n obj[key] = {\n name: v[0].toLowerCase(),\n convert: v[1]\n };\n if (v.length === 3) {\n sExpr(v[2], obj[key]);\n }\n return;\n case 'SPHEROID':\n case 'ELLIPSOID':\n obj[key] = {\n name: v[0],\n a: v[1],\n rf: v[2]\n };\n if (v.length === 4) {\n sExpr(v[3], obj[key]);\n }\n return;\n case 'EDATUM':\n case 'ENGINEERINGDATUM':\n case 'LOCAL_DATUM':\n case 'DATUM':\n case 'VERT_CS':\n case 'VERTCRS':\n case 'VERTICALCRS':\n v[0] = ['name', v[0]];\n mapit(obj, key, v);\n return;\n case 'COMPD_CS':\n case 'COMPOUNDCRS':\n case 'FITTED_CS':\n // the followings are the crs defined in\n // https://github.com/proj4js/proj4js/blob/1da4ed0b865d0fcb51c136090569210cdcc9019e/lib/parseCode.js#L11\n case 'PROJECTEDCRS':\n case 'PROJCRS':\n case 'GEOGCS':\n case 'GEOCCS':\n case 'PROJCS':\n case 'LOCAL_CS':\n case 'GEODCRS':\n case 'GEODETICCRS':\n case 'GEODETICDATUM':\n case 'ENGCRS':\n case 'ENGINEERINGCRS':\n v[0] = ['name', v[0]];\n mapit(obj, key, v);\n obj[key].type = key;\n return;\n default:\n i = -1;\n while (++i < v.length) {\n if (!Array.isArray(v[i])) {\n return sExpr(v, obj[key]);\n }\n }\n return mapit(obj, key, v);\n }\n}\n","var D2R = 0.01745329251994329577;\n\nexport function d2r(input) {\n return input * D2R;\n}\n\nexport function applyProjectionDefaults(wkt) {\n // Normalize projName for WKT2 compatibility\n const normalizedProjName = (wkt.projName || '').toLowerCase().replace(/_/g, ' ');\n\n if (!wkt.long0 && wkt.longc && (normalizedProjName === 'albers conic equal area' || normalizedProjName === 'lambert azimuthal equal area')) {\n wkt.long0 = wkt.longc;\n }\n if (!wkt.lat_ts && wkt.lat1 && (normalizedProjName === 'stereographic south pole' || normalizedProjName === 'polar stereographic (variant b)')) {\n wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90);\n wkt.lat_ts = wkt.lat1;\n delete wkt.lat1;\n } else if (!wkt.lat_ts && wkt.lat0 && (normalizedProjName === 'polar stereographic' || normalizedProjName === 'polar stereographic (variant a)')) {\n wkt.lat_ts = wkt.lat0;\n wkt.lat0 = d2r(wkt.lat0 > 0 ? 90 : -90);\n delete wkt.lat1;\n }\n}","import { applyProjectionDefaults } from './util.js';\n\n// Helper function to process units and to_meter\nfunction processUnit(unit) {\n let result = { units: null, to_meter: undefined };\n\n if (typeof unit === 'string') {\n result.units = unit.toLowerCase();\n if (result.units === 'metre') {\n result.units = 'meter'; // Normalize 'metre' to 'meter'\n }\n if (result.units === 'meter') {\n result.to_meter = 1; // Only set to_meter if units are 'meter'\n }\n } else if (unit && unit.name) {\n result.units = unit.name.toLowerCase();\n if (result.units === 'metre') {\n result.units = 'meter'; // Normalize 'metre' to 'meter'\n }\n result.to_meter = unit.conversion_factor;\n }\n\n return result;\n}\n\nfunction toValue(valueOrObject) {\n if (typeof valueOrObject === 'object') {\n return valueOrObject.value * valueOrObject.unit.conversion_factor;\n }\n return valueOrObject;\n}\n\nfunction calculateEllipsoid(value, result) {\n if (value.ellipsoid.radius) {\n result.a = value.ellipsoid.radius;\n result.rf = 0;\n } else {\n result.a = toValue(value.ellipsoid.semi_major_axis);\n if (value.ellipsoid.inverse_flattening !== undefined) {\n result.rf = value.ellipsoid.inverse_flattening;\n } else if (value.ellipsoid.semi_major_axis !== undefined && value.ellipsoid.semi_minor_axis !== undefined) {\n result.rf = result.a / (result.a - toValue(value.ellipsoid.semi_minor_axis));\n }\n }\n}\n\nexport function transformPROJJSON(projjson, result = {}) {\n if (!projjson || typeof projjson !== 'object') {\n return projjson; // Return primitive values as-is\n }\n\n if (projjson.type === 'BoundCRS') {\n transformPROJJSON(projjson.source_crs, result);\n\n if (projjson.transformation) {\n if (projjson.transformation.method && projjson.transformation.method.name === 'NTv2') {\n // Set nadgrids to the filename from the parameterfile\n result.nadgrids = projjson.transformation.parameters[0].value;\n } else {\n // Populate datum_params if no parameterfile is found\n result.datum_params = projjson.transformation.parameters.map((param) => param.value);\n }\n }\n return result; // Return early for BoundCRS\n }\n\n // Handle specific keys in PROJJSON\n Object.keys(projjson).forEach((key) => {\n const value = projjson[key];\n if (value === null) {\n return;\n }\n\n switch (key) {\n case 'name':\n if (result.srsCode) {\n break;\n }\n result.name = value;\n result.srsCode = value; // Map `name` to `srsCode`\n break;\n\n case 'type':\n if (value === 'GeographicCRS') {\n result.projName = 'longlat';\n } else if (value === 'ProjectedCRS' && projjson.conversion && projjson.conversion.method) {\n result.projName = projjson.conversion.method.name; // Retain original capitalization\n }\n break;\n\n case 'datum':\n case 'datum_ensemble': // Handle both datum and ensemble\n if (value.ellipsoid) {\n // Extract ellipsoid properties\n result.ellps = value.ellipsoid.name;\n calculateEllipsoid(value, result);\n }\n if (value.prime_meridian) {\n result.from_greenwich = value.prime_meridian.longitude * Math.PI / 180; // Convert to radians\n }\n break;\n\n case 'ellipsoid':\n result.ellps = value.name;\n calculateEllipsoid(value, result);\n break;\n\n case 'prime_meridian':\n result.long0 = (value.longitude || 0) * Math.PI / 180; // Convert to radians\n break;\n\n case 'coordinate_system':\n if (value.axis) {\n result.axis = value.axis\n .map((axis) => {\n const direction = axis.direction;\n if (direction === 'east') return 'e';\n if (direction === 'north') return 'n';\n if (direction === 'west') return 'w';\n if (direction === 'south') return 's';\n throw new Error(`Unknown axis direction: ${direction}`);\n })\n .join('') + 'u'; // Combine into a single string (e.g., \"enu\")\n\n if (value.unit) {\n const { units, to_meter } = processUnit(value.unit);\n result.units = units;\n result.to_meter = to_meter;\n } else if (value.axis[0] && value.axis[0].unit) {\n const { units, to_meter } = processUnit(value.axis[0].unit);\n result.units = units;\n result.to_meter = to_meter;\n }\n }\n break;\n \n case 'id':\n if (value.authority && value.code) {\n result.title = value.authority + ':' + value.code;\n }\n break;\n\n case 'conversion':\n if (value.method && value.method.name) {\n result.projName = value.method.name; // Retain original capitalization\n }\n if (value.parameters) {\n value.parameters.forEach((param) => {\n const paramName = param.name.toLowerCase().replace(/\\s+/g, '_');\n const paramValue = param.value;\n if (param.unit && param.unit.conversion_factor) {\n result[paramName] = paramValue * param.unit.conversion_factor; // Convert to radians or meters\n } else if (param.unit === 'degree') {\n result[paramName] = paramValue * Math.PI / 180; // Convert to radians\n } else {\n result[paramName] = paramValue;\n }\n });\n }\n break;\n\n case 'unit':\n if (value.name) {\n result.units = value.name.toLowerCase();\n if (result.units === 'metre') {\n result.units = 'meter';\n }\n }\n if (value.conversion_factor) {\n result.to_meter = value.conversion_factor;\n }\n break;\n\n case 'base_crs':\n transformPROJJSON(value, result); // Pass `result` directly\n result.datumCode = value.id ? value.id.authority + '_' + value.id.code : value.name; // Set datumCode\n break;\n\n default:\n // Ignore irrelevant or unneeded properties\n break;\n }\n });\n\n // Additional calculated properties\n if (result.latitude_of_false_origin !== undefined) {\n result.lat0 = result.latitude_of_false_origin; // Already in radians\n }\n if (result.longitude_of_false_origin !== undefined) {\n result.long0 = result.longitude_of_false_origin;\n }\n if (result.latitude_of_standard_parallel !== undefined) {\n result.lat0 = result.latitude_of_standard_parallel;\n result.lat1 = result.latitude_of_standard_parallel;\n }\n if (result.latitude_of_1st_standard_parallel !== undefined) {\n result.lat1 = result.latitude_of_1st_standard_parallel;\n }\n if (result.latitude_of_2nd_standard_parallel !== undefined) {\n result.lat2 = result.latitude_of_2nd_standard_parallel; \n }\n if (result.latitude_of_projection_centre !== undefined) {\n result.lat0 = result.latitude_of_projection_centre;\n }\n if (result.longitude_of_projection_centre !== undefined) {\n result.longc = result.longitude_of_projection_centre;\n }\n if (result.easting_at_false_origin !== undefined) {\n result.x0 = result.easting_at_false_origin;\n }\n if (result.northing_at_false_origin !== undefined) {\n result.y0 = result.northing_at_false_origin;\n }\n if (result.latitude_of_natural_origin !== undefined) {\n result.lat0 = result.latitude_of_natural_origin;\n }\n if (result.longitude_of_natural_origin !== undefined) {\n result.long0 = result.longitude_of_natural_origin;\n }\n if (result.longitude_of_origin !== undefined) {\n result.long0 = result.longitude_of_origin;\n }\n if (result.false_easting !== undefined) {\n result.x0 = result.false_easting;\n }\n if (result.easting_at_projection_centre) {\n result.x0 = result.easting_at_projection_centre;\n }\n if (result.false_northing !== undefined) {\n result.y0 = result.false_northing;\n }\n if (result.northing_at_projection_centre) {\n result.y0 = result.northing_at_projection_centre;\n }\n if (result.standard_parallel_1 !== undefined) {\n result.lat1 = result.standard_parallel_1;\n }\n if (result.standard_parallel_2 !== undefined) {\n result.lat2 = result.standard_parallel_2;\n }\n if (result.scale_factor_at_natural_origin !== undefined) {\n result.k0 = result.scale_factor_at_natural_origin;\n }\n if (result.scale_factor_at_projection_centre !== undefined) {\n result.k0 = result.scale_factor_at_projection_centre;\n }\n if (result.scale_factor_on_pseudo_standard_parallel !== undefined) { \n result.k0 = result.scale_factor_on_pseudo_standard_parallel;\n }\n if (result.azimuth !== undefined) {\n result.alpha = result.azimuth;\n }\n if (result.azimuth_at_projection_centre !== undefined) {\n result.alpha = result.azimuth_at_projection_centre;\n }\n if (result.angle_from_rectified_to_skew_grid) {\n result.rectified_grid_angle = result.angle_from_rectified_to_skew_grid;\n }\n\n // Apply projection defaults\n applyProjectionDefaults(result);\n\n return result;\n}","import { buildPROJJSON } from './buildPROJJSON.js';\nimport { detectWKTVersion } from './detectWKTVersion.js';\nimport parser from './parser.js';\nimport {sExpr} from './process.js';\nimport { transformPROJJSON } from './transformPROJJSON.js';\nimport { applyProjectionDefaults, d2r } from './util.js';\n\nvar knownTypes = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS', 'GEOCCS', 'PROJCS', 'LOCAL_CS', 'GEODCRS',\n 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS'];\n\nfunction rename(obj, params) {\n var outName = params[0];\n var inName = params[1];\n if (!(outName in obj) && (inName in obj)) {\n obj[outName] = obj[inName];\n if (params.length === 3) {\n obj[outName] = params[2](obj[outName]);\n }\n }\n}\n\nfunction cleanWKT(wkt) {\n var keys = Object.keys(wkt);\n for (var i = 0, ii = keys.length; i <ii; ++i) {\n var key = keys[i];\n // the followings are the crs defined in\n // https://github.com/proj4js/proj4js/blob/1da4ed0b865d0fcb51c136090569210cdcc9019e/lib/parseCode.js#L11\n if (knownTypes.indexOf(key) !== -1) {\n setPropertiesFromWkt(wkt[key]);\n }\n if (typeof wkt[key] === 'object') {\n cleanWKT(wkt[key]);\n }\n }\n}\n\nfunction setPropertiesFromWkt(wkt) {\n if (wkt.AUTHORITY) {\n var authority = Object.keys(wkt.AUTHORITY)[0];\n if (authority && authority in wkt.AUTHORITY) {\n wkt.title = authority + ':' + wkt.AUTHORITY[authority];\n }\n }\n if (wkt.type === 'GEOGCS') {\n wkt.projName = 'longlat';\n } else if (wkt.type === 'LOCAL_CS') {\n wkt.projName = 'identity';\n wkt.local = true;\n } else {\n if (typeof wkt.PROJECTION === 'object') {\n wkt.projName = Object.keys(wkt.PROJECTION)[0];\n } else {\n wkt.projName = wkt.PROJECTION;\n }\n }\n if (wkt.AXIS) {\n var axisOrder = '';\n for (var i = 0, ii = wkt.AXIS.length; i < ii; ++i) {\n var axis = [wkt.AXIS[i][0].toLowerCase(), wkt.AXIS[i][1].toLowerCase()];\n if (axis[0].indexOf('north') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'north')) {\n axisOrder += 'n';\n } else if (axis[0].indexOf('south') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'south')) {\n axisOrder += 's';\n } else if (axis[0].indexOf('east') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'east')) {\n axisOrder += 'e';\n } else if (axis[0].indexOf('west') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'west')) {\n axisOrder += 'w';\n }\n }\n if (axisOrder.length === 2) {\n axisOrder += 'u';\n }\n if (axisOrder.length === 3) {\n wkt.axis = axisOrder;\n }\n }\n if (wkt.UNIT) {\n wkt.units = wkt.UNIT.name.toLowerCase();\n if (wkt.units === 'metre') {\n wkt.units = 'meter';\n }\n if (wkt.UNIT.convert) {\n if (wkt.type === 'GEOGCS') {\n if (wkt.DATUM && wkt.DATUM.SPHEROID) {\n wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a;\n }\n } else {\n wkt.to_meter = wkt.UNIT.convert;\n }\n }\n }\n var geogcs = wkt.GEOGCS;\n if (wkt.type === 'GEOGCS') {\n geogcs = wkt;\n }\n if (geogcs) {\n //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){\n // wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R;\n //}\n if (geogcs.DATUM) {\n wkt.datumCode = geogcs.DATUM.name.toLowerCase();\n } else {\n wkt.datumCode = geogcs.name.toLowerCase();\n }\n if (wkt.datumCode.slice(0, 2) === 'd_') {\n wkt.datumCode = wkt.datumCode.slice(2);\n }\n if (wkt.datumCode === 'new_zealand_1949') {\n wkt.datumCode = 'nzgd49';\n }\n if (wkt.datumCode === 'wgs_1984' || wkt.datumCode === 'world_geodetic_system_1984') {\n if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') {\n wkt.sphere = true;\n }\n wkt.datumCode = 'wgs84';\n }\n if (wkt.datumCode === 'belge_1972') {\n wkt.datumCode = 'rnb72';\n }\n if (geogcs.DATUM && geogcs.DATUM.SPHEROID) {\n wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\\_18/, 'clrk');\n if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') {\n wkt.ellps = 'intl';\n }\n\n wkt.a = geogcs.DATUM.SPHEROID.a;\n wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10);\n }\n\n if (geogcs.DATUM && geogcs.DATUM.TOWGS84) {\n wkt.datum_params = geogcs.DATUM.TOWGS84;\n }\n if (~wkt.datumCode.indexOf('osgb_1936')) {\n wkt.datumCode = 'osgb36';\n }\n if (~wkt.datumCode.indexOf('osni_1952')) {\n wkt.datumCode = 'osni52';\n }\n if (~wkt.datumCode.indexOf('tm65')\n || ~wkt.datumCode.indexOf('geodetic_datum_of_1965')) {\n wkt.datumCode = 'ire65';\n }\n if (wkt.datumCode === 'ch1903+') {\n wkt.datumCode = 'ch1903';\n }\n if (~wkt.datumCode.indexOf('israel')) {\n wkt.datumCode = 'isr93';\n }\n }\n if (wkt.b && !isFinite(wkt.b)) {\n wkt.b = wkt.a;\n }\n if (wkt.rectified_grid_angle) {\n wkt.rectified_grid_angle = d2r(wkt.rectified_grid_angle);\n }\n\n function toMeter(input) {\n var ratio = wkt.to_meter || 1;\n return input * ratio;\n }\n var renamer = function(a) {\n return rename(wkt, a);\n };\n var list = [\n ['standard_parallel_1', 'Standard_Parallel_1'],\n ['standard_parallel_1', 'Latitude of 1st standard parallel'],\n ['standard_parallel_2', 'Standard_Parallel_2'],\n ['standard_parallel_2', 'Latitude of 2nd standard parallel'],\n ['false_easting', 'False_Easting'],\n ['false_easting', 'False easting'],\n ['false-easting', 'Easting at false origin'],\n ['false_northing', 'False_Northing'],\n ['false_northing', 'False northing'],\n ['false_northing', 'Northing at false origin'],\n ['central_meridian', 'Central_Meridian'],\n ['central_meridian', 'Longitude of natural origin'],\n ['central_meridian', 'Longitude of false origin'],\n ['latitude_of_origin', 'Latitude_Of_Origin'],\n ['latitude_of_origin', 'Central_Parallel'],\n ['latitude_of_origin', 'Latitude of natural origin'],\n ['latitude_of_origin', 'Latitude of false origin'],\n ['scale_factor', 'Scale_Factor'],\n ['k0', 'scale_factor'],\n ['latitude_of_center', 'Latitude_Of_Center'],\n ['latitude_of_center', 'Latitude_of_center'],\n ['lat0', 'latitude_of_center', d2r],\n ['longitude_of_center', 'Longitude_Of_Center'],\n ['longitude_of_center', 'Longitude_of_center'],\n ['longc', 'longitude_of_center', d2r],\n ['x0', 'false_easting', toMeter],\n ['y0', 'false_northing', toMeter],\n ['long0', 'central_meridian', d2r],\n ['lat0', 'latitude_of_origin', d2r],\n ['lat0', 'standard_parallel_1', d2r],\n ['lat1', 'standard_parallel_1', d2r],\n ['lat2', 'standard_parallel_2', d2r],\n ['azimuth', 'Azimuth'],\n ['alpha', 'azimuth', d2r],\n ['srsCode', 'name']\n ];\n list.forEach(renamer);\n applyProjectionDefaults(wkt);\n}\nexport default function(wkt) {\n if (typeof wkt === 'object') {\n return transformPROJJSON(wkt);\n }\n const version = detectWKTVersion(wkt);\n var lisp = parser(wkt);\n if (version === 'WKT2') {\n const projjson = buildPROJJSON(lisp);\n return transformPROJJSON(projjson);\n }\n var type = lisp[0];\n var obj = {};\n sExpr(lisp, obj);\n cleanWKT(obj);\n return obj[type];\n}\n","import globals from './global';\nimport parseProj from './projString';\nimport wkt from 'wkt-parser';\n\nfunction defs(name) {\n /*global console*/\n var that = this;\n if (arguments.length === 2) {\n var def = arguments[1];\n if (typeof def === 'string') {\n if (def.charAt(0) === '+') {\n defs[name] = parseProj(arguments[1]);\n }\n else {\n defs[name] = wkt(arguments[1]);\n }\n } else {\n defs[name] = def;\n }\n }\n else if (arguments.length === 1) {\n if (Array.isArray(name)) {\n return name.map(function(v) {\n if (Array.isArray(v)) {\n defs.apply(that, v);\n }\n else {\n defs(v);\n }\n });\n }\n else if (typeof name === 'string') {\n if (name in defs) {\n return defs[name];\n }\n }\n else if ('EPSG' in name) {\n defs['EPSG:' + name.EPSG] = name;\n }\n else if ('ESRI' in name) {\n defs['ESRI:' + name.ESRI] = name;\n }\n else if ('IAU2000' in name) {\n defs['IAU2000:' + name.IAU2000] = name;\n }\n else {\n console.log(name);\n }\n return;\n }\n\n\n}\nglobals(defs);\nexport default defs;\n","import defs from './defs';\nimport wkt from 'wkt-parser';\nimport projStr from './projString';\nimport match from './match';\nfunction testObj(code){\n return typeof code === 'string';\n}\nfunction testDef(code){\n return code in defs;\n}\nvar codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS','GEOCCS','PROJCS','LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS'];\nfunction testWKT(code){\n return codeWords.some(function (word) {\n return code.indexOf(word) > -1;\n });\n}\nvar codes = ['3857', '900913', '3785', '102113'];\nfunction checkMercator(item) {\n var auth = match(item, 'authority');\n if (!auth) {\n return;\n }\n var code = match(auth, 'epsg');\n return code && codes.indexOf(code) > -1;\n}\nfunction checkProjStr(item) {\n var ext = match(item, 'extension');\n if (!ext) {\n return;\n }\n return match(ext, 'proj4');\n}\nfunction testProj(code){\n return code[0] === '+';\n}\nfunction parse(code){\n if (testObj(code)) {\n //check to see if this is a WKT string\n if (testDef(code)) {\n return defs[code];\n }\n if (testWKT(code)) {\n var out = wkt(code);\n // test of spetial case, due to this being a very common and often malformed\n if (checkMercator(out)) {\n return defs['EPSG:3857'];\n }\n var maybeProjStr = checkProjStr(out);\n if (maybeProjStr) {\n return projStr(maybeProjStr);\n }\n return out;\n }\n if (testProj(code)) {\n return projStr(code);\n }\n }else{\n return code;\n }\n}\n\nexport default parse;\n","export default function(destination, source) {\n destination = destination || {};\n var value, property;\n if (!source) {\n return destination;\n }\n for (property in source) {\n value = source[property];\n if (value !== undefined) {\n destination[property] = value;\n }\n }\n return destination;\n}\n","export default function(eccent, sinphi, cosphi) {\n var con = eccent * sinphi;\n return cosphi / (Math.sqrt(1 - con * con));\n}","export default function(x) {\n return x<0 ? -1 : 1;\n}","\nimport {TWO_PI, SPI} from '../constants/values';\nimport sign from './sign';\n\nexport default function(x) {\n return (Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI));\n}\n","import {HALF_PI} from '../constants/values';\n\nexport default function(eccent, phi, sinphi) {\n var con = eccent * sinphi;\n var com = 0.5 * eccent;\n con = Math.pow(((1 - con) / (1 + con)), com);\n return (Math.tan(0.5 * (HALF_PI - phi)) / con);\n}\n","import {HALF_PI} from '../constants/values';\n\nexport default function(eccent, ts) {\n var eccnth = 0.5 * eccent;\n var con, dphi;\n var phi = HALF_PI - 2 * Math.atan(ts);\n for (var i = 0; i <= 15; i++) {\n con = eccent * Math.sin(phi);\n dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi;\n phi += dphi;\n if (Math.abs(dphi) <= 0.0000000001) {\n return phi;\n }\n }\n //console.log(\"phi2z has NoConvergence\");\n return -9999;\n}\n","import msfnz from '../common/msfnz';\n\nimport adjust_lon from '../common/adjust_lon';\nimport tsfnz from '../common/tsfnz';\nimport phi2z from '../common/phi2z';\nimport {FORTPI, R2D, EPSLN, HALF_PI} from '../constants/values';\nexport function init() {\n var con = this.b / this.a;\n this.es = 1 - con * con;\n if(!('x0' in this)){\n this.x0 = 0;\n }\n if(!('y0' in this)){\n this.y0 = 0;\n }\n this.e = Math.sqrt(this.es);\n if (this.lat_ts) {\n if (this.sphere) {\n this.k0 = Math.cos(this.lat_ts);\n }\n else {\n this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n }\n }\n else {\n if (!this.k0) {\n if (this.k) {\n this.k0 = this.k;\n }\n else {\n this.k0 = 1;\n }\n }\n }\n}\n\n/* Mercator forward equations--mapping lat,long to x,y\n --------------------------------------------------*/\n\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n // convert to radians\n if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) {\n return null;\n }\n\n var x, y;\n if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {\n return null;\n }\n else {\n if (this.sphere) {\n x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);\n y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat));\n }\n else {\n var sinphi = Math.sin(lat);\n var ts = tsfnz(this.e, lat, sinphi);\n x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0);\n y = this.y0 - this.a * this.k0 * Math.log(ts);\n }\n p.x = x;\n p.y = y;\n return p;\n }\n}\n\n/* Mercator inverse equations--mapping x,y to lat/long\n --------------------------------------------------*/\nexport function inverse(p) {\n\n var x = p.x - this.x0;\n var y = p.y - this.y0;\n var lon, lat;\n\n if (this.sphere) {\n lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0)));\n }\n else {\n var ts = Math.exp(-y / (this.a * this.k0));\n lat = phi2z(this.e, ts);\n if (lat === -9999) {\n return null;\n }\n }\n lon = adjust_lon(this.long0 + x / (this.a * this.k0));\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Mercator\", \"Popular Visualisation Pseudo Mercator\", \"Mercator_1SP\", \"Mercator_Auxiliary_Sphere\", \"merc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","export function init() {\n //no-op for longlat\n}\n\nfunction identity(pt) {\n return pt;\n}\nexport {identity as forward};\nexport {identity as inverse};\nexport var names = [\"longlat\", \"identity\"];\nexport default {\n init: init,\n forward: identity,\n inverse: identity,\n names: names\n};\n","import merc from \"./projections/merc\";\nimport longlat from \"./projections/longlat\";\nvar projs = [merc, longlat];\nvar names = {};\nvar projStore = [];\n\nfunction add(proj, i) {\n var len = projStore.length;\n if (!proj.names) {\n console.log(i);\n return true;\n }\n projStore[len] = proj;\n proj.names.forEach(function(n) {\n names[n.toLowerCase()] = len;\n });\n return this;\n}\n\nexport {add};\n\nexport function get(name) {\n if (!name) {\n return false;\n }\n var n = name.toLowerCase();\n if (typeof names[n] !== 'undefined' && projStore[names[n]]) {\n return projStore[names[n]];\n }\n}\n\nexport function start() {\n projs.forEach(add);\n}\nexport default {\n start: start,\n add: add,\n get: get\n};\n","var exports = {};\nexport {exports as default};\nexports.MERIT = {\n a: 6378137.0,\n rf: 298.257,\n ellipseName: \"MERIT 1983\"\n};\n\nexports.SGS85 = {\n a: 6378136.0,\n rf: 298.257,\n ellipseName: \"Soviet Geodetic System 85\"\n};\n\nexports.GRS80 = {\n a: 6378137.0,\n rf: 298.257222101,\n ellipseName: \"GRS 1980(IUGG, 1980)\"\n};\n\nexports.IAU76 = {\n a: 6378140.0,\n rf: 298.257,\n ellipseName: \"IAU 1976\"\n};\n\nexports.airy = {\n a: 6377563.396,\n b: 6356256.910,\n ellipseName: \"Airy 1830\"\n};\n\nexports.APL4 = {\n a: 6378137,\n rf: 298.25,\n ellipseName: \"Appl. Physics. 1965\"\n};\n\nexports.NWL9D = {\n a: 6378145.0,\n rf: 298.25,\n ellipseName: \"Naval Weapons Lab., 1965\"\n};\n\nexports.mod_airy = {\n a: 6377340.189,\n b: 6356034.446,\n ellipseName: \"Modified Airy\"\n};\n\nexports.andrae = {\n a: 6377104.43,\n rf: 300.0,\n ellipseName: \"Andrae 1876 (Den., Iclnd.)\"\n};\n\nexports.aust_SA = {\n a: 6378160.0,\n rf: 298.25,\n ellipseName: \"Australian Natl & S. Amer. 1969\"\n};\n\nexports.GRS67 = {\n a: 6378160.0,\n rf: 298.2471674270,\n ellipseName: \"GRS 67(IUGG 1967)\"\n};\n\nexports.bessel = {\n a: 6377397.155,\n rf: 299.1528128,\n ellipseName: \"Bessel 1841\"\n};\n\nexports.bess_nam = {\n a: 6377483.865,\n rf: 299.1528128,\n ellipseName: \"Bessel 1841 (Namibia)\"\n};\n\nexports.clrk66 = {\n a: 6378206.4,\n b: 6356583.8,\n ellipseName: \"Clarke 1866\"\n};\n\nexports.clrk80 = {\n a: 6378249.145,\n rf: 293.4663,\n ellipseName: \"Clarke 1880 mod.\"\n};\n\nexports.clrk80ign = {\n a: 6378249.2,\n b: 6356515,\n rf: 293.4660213,\n ellipseName: \"Clarke 1880 (IGN)\"\n};\n\nexports.clrk58 = {\n a: 6378293.645208759,\n rf: 294.2606763692654,\n ellipseName: \"Clarke 1858\"\n};\n\nexports.CPM = {\n a: 6375738.7,\n rf: 334.29,\n ellipseName: \"Comm. des Poids et Mesures 1799\"\n};\n\nexports.delmbr = {\n a: 6376428.0,\n rf: 311.5,\n ellipseName: \"Delambre 1810 (Belgium)\"\n};\n\nexports.engelis = {\n a: 6378136.05,\n rf: 298.2566,\n ellipseName: \"Engelis 1985\"\n};\n\nexports.evrst30 = {\n a: 6377276.345,\n rf: 300.8017,\n ellipseName: \"Everest 1830\"\n};\n\nexports.evrst48 = {\n a: 6377304.063,\n rf: 300.8017,\n ellipseName: \"Everest 1948\"\n};\n\nexports.evrst56 = {\n a: 6377301.243,\n rf: 300.8017,\n ellipseName: \"Everest 1956\"\n};\n\nexports.evrst69 = {\n a: 6377295.664,\n rf: 300.8017,\n ellipseName: \"Everest 1969\"\n};\n\nexports.evrstSS = {\n a: 6377298.556,\n rf: 300.8017,\n ellipseName: \"Everest (Sabah & Sarawak)\"\n};\n\nexports.fschr60 = {\n a: 6378166.0,\n rf: 298.3,\n ellipseName: \"Fischer (Mercury Datum) 1960\"\n};\n\nexports.fschr60m = {\n a: 6378155.0,\n rf: 298.3,\n ellipseName: \"Fischer 1960\"\n};\n\nexports.fschr68 = {\n a: 6378150.0,\n rf: 298.3,\n ellipseName: \"Fischer 1968\"\n};\n\nexports.helmert = {\n a: 6378200.0,\n rf: 298.3,\n ellipseName: \"Helmert 1906\"\n};\n\nexports.hough = {\n a: 6378270.0,\n rf: 297.0,\n ellipseName: \"Hough\"\n};\n\nexports.intl = {\n a: 6378388.0,\n rf: 297.0,\n ellipseName: \"International 1909 (Hayford)\"\n};\n\nexports.kaula = {\n a: 6378163.0,\n rf: 298.24,\n ellipseName: \"Kaula 1961\"\n};\n\nexports.lerch = {\n a: 6378139.0,\n rf: 298.257,\n ellipseName: \"Lerch 1979\"\n};\n\nexports.mprts = {\n a: 6397300.0,\n rf: 191.0,\n ellipseName: \"Maupertius 1738\"\n};\n\nexports.new_intl = {\n a: 6378157.5,\n b: 6356772.2,\n ellipseName: \"New International 1967\"\n};\n\nexports.plessis = {\n a: 6376523.0,\n rf: 6355863.0,\n ellipseName: \"Plessis 1817 (France)\"\n};\n\nexports.krass = {\n a: 6378245.0,\n rf: 298.3,\n ellipseName: \"Krassovsky, 1942\"\n};\n\nexports.SEasia = {\n a: 6378155.0,\n b: 6356773.3205,\n ellipseName: \"Southeast Asia\"\n};\n\nexports.walbeck = {\n a: 6376896.0,\n b: 6355834.8467,\n ellipseName: \"Walbeck\"\n};\n\nexports.WGS60 = {\n a: 6378165.0,\n rf: 298.3,\n ellipseName: \"WGS 60\"\n};\n\nexports.WGS66 = {\n a: 6378145.0,\n rf: 298.25,\n ellipseName: \"WGS 66\"\n};\n\nexports.WGS7 = {\n a: 6378135.0,\n rf: 298.26,\n ellipseName: \"WGS 72\"\n};\n\nexport var WGS84 = exports.WGS84 = {\n a: 6378137.0,\n rf: 298.257223563,\n ellipseName: \"WGS 84\"\n};\n\nexports.sphere = {\n a: 6370997.0,\n b: 6370997.0,\n ellipseName: \"Normal Sphere (r=6370997)\"\n};\n","import {SIXTH, RA4, RA6, EPSLN} from './constants/values';\nimport {default as Ellipsoid, WGS84} from './constants/Ellipsoid';\nimport match from './match';\n\nexport function eccentricity(a, b, rf, R_A) {\n var a2 = a * a; // used in geocentric\n var b2 = b * b; // used in geocentric\n var es = (a2 - b2) / a2; // e ^ 2\n var e = 0;\n if (R_A) {\n a *= 1 - es * (SIXTH + es * (RA4 + es * RA6));\n a2 = a * a;\n es = 0;\n } else {\n e = Math.sqrt(es); // eccentricity\n }\n var ep2 = (a2 - b2) / b2; // used in geocentric\n return {\n es: es,\n e: e,\n ep2: ep2\n };\n}\nexport function sphere(a, b, rf, ellps, sphere) {\n if (!a) { // do we have an ellipsoid?\n var ellipse = match(Ellipsoid, ellps);\n if (!ellipse) {\n ellipse = WGS84;\n }\n a = ellipse.a;\n b = ellipse.b;\n rf = ellipse.rf;\n }\n\n if (rf && !b) {\n b = (1.0 - 1.0 / rf) * a;\n }\n if (rf === 0 || Math.abs(a - b) < EPSLN) {\n sphere = true;\n b = a;\n }\n return {\n a: a,\n b: b,\n rf: rf,\n sphere: sphere\n };\n}\n","var exports = {};\nexport {exports as default};\nexports.wgs84 = {\n towgs84: \"0,0,0\",\n ellipse: \"WGS84\",\n datumName: \"WGS84\"\n};\n\nexports.ch1903 = {\n towgs84: \"674.374,15.056,405.346\",\n ellipse: \"bessel\",\n datumName: \"swiss\"\n};\n\nexports.ggrs87 = {\n towgs84: \"-199.87,74.79,246.62\",\n ellipse: \"GRS80\",\n datumName: \"Greek_Geodetic_Reference_System_1987\"\n};\n\nexports.nad83 = {\n towgs84: \"0,0,0\",\n ellipse: \"GRS80\",\n datumName: \"North_American_Datum_1983\"\n};\n\nexports.nad27 = {\n nadgrids: \"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat\",\n ellipse: \"clrk66\",\n datumName: \"North_American_Datum_1927\"\n};\n\nexports.potsdam = {\n towgs84: \"598.1,73.7,418.2,0.202,0.045,-2.455,6.7\",\n ellipse: \"bessel\",\n datumName: \"Potsdam Rauenberg 1950 DHDN\"\n};\n\nexports.carthage = {\n towgs84: \"-263.0,6.0,431.0\",\n ellipse: \"clark80\",\n datumName: \"Carthage 1934 Tunisia\"\n};\n\nexports.hermannskogel = {\n towgs84: \"577.326,90.129,463.919,5.137,1.474,5.297,2.4232\",\n ellipse: \"bessel\",\n datumName: \"Hermannskogel\"\n};\n\nexports.osni52 = {\n towgs84: \"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15\",\n ellipse: \"airy\",\n datumName: \"Irish National\"\n};\n\nexports.ire65 = {\n towgs84: \"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15\",\n ellipse: \"mod_airy\",\n datumName: \"Ireland 1965\"\n};\n\nexports.rassadiran = {\n towgs84: \"-133.63,-157.5,-158.62\",\n ellipse: \"intl\",\n datumName: \"Rassadiran\"\n};\n\nexports.nzgd49 = {\n towgs84: \"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993\",\n ellipse: \"intl\",\n datumName: \"New Zealand Geodetic Datum 1949\"\n};\n\nexports.osgb36 = {\n towgs84: \"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894\",\n ellipse: \"airy\",\n datumName: \"Airy 1830\"\n};\n\nexports.s_jtsk = {\n towgs84: \"589,76,480\",\n ellipse: 'bessel',\n datumName: 'S-JTSK (Ferro)'\n};\n\nexports.beduaram = {\n towgs84: '-106,-87,188',\n ellipse: 'clrk80',\n datumName: 'Beduaram'\n};\n\nexports.gunung_segara = {\n towgs84: '-403,684,41',\n ellipse: 'bessel',\n datumName: 'Gunung Segara Jakarta'\n};\n\nexports.rnb72 = {\n towgs84: \"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1\",\n ellipse: \"intl\",\n datumName: \"Reseau National Belge 1972\"\n};\n","import {PJD_3PARAM, PJD_7PARAM, PJD_GRIDSHIFT, PJD_WGS84, PJD_NODATUM, SEC_TO_RAD} from './constants/values';\n\nfunction datum(datumCode, datum_params, a, b, es, ep2, nadgrids) {\n var out = {};\n\n if (datumCode === undefined || datumCode === 'none') {\n out.datum_type = PJD_NODATUM;\n } else {\n out.datum_type = PJD_WGS84;\n }\n\n if (datum_params) {\n out.datum_params = datum_params.map(parseFloat);\n if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) {\n out.datum_type = PJD_3PARAM;\n }\n if (out.datum_params.length > 3) {\n if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) {\n out.datum_type = PJD_7PARAM;\n out.datum_params[3] *= SEC_TO_RAD;\n out.datum_params[4] *= SEC_TO_RAD;\n out.datum_params[5] *= SEC_TO_RAD;\n out.datum_params[6] = (out.datum_params[6] / 1000000.0) + 1.0;\n }\n }\n }\n\n if (nadgrids) {\n out.datum_type = PJD_GRIDSHIFT;\n out.grids = nadgrids;\n }\n out.a = a; //datum object also uses these values\n out.b = b;\n out.es = es;\n out.ep2 = ep2;\n return out;\n}\n\nexport default datum;\n","/**\n * Resources for details of NTv2 file formats:\n * - https://web.archive.org/web/20140127204822if_/http://www.mgs.gov.on.ca:80/stdprodconsume/groups/content/@mgs/@iandit/documents/resourcelist/stel02_047447.pdf\n * - http://mimaka.com/help/gs/html/004_NTV2%20Data%20Format.htm\n */\n\nvar loadedNadgrids = {};\n\n/**\n * Load a binary NTv2 file (.gsb) to a key that can be used in a proj string like +nadgrids=<key>. Pass the NTv2 file\n * as an ArrayBuffer.\n */\nexport default function nadgrid(key, data) {\n var view = new DataView(data);\n var isLittleEndian = detectLittleEndian(view);\n var header = readHeader(view, isLittleEndian);\n if (header.nSubgrids > 1) {\n console.log('Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored');\n }\n var subgrids = readSubgrids(view, header, isLittleEndian);\n var nadgrid = {header: header, subgrids: subgrids};\n loadedNadgrids[key] = nadgrid;\n return nadgrid;\n}\n\n/**\n * Given a proj4 value for nadgrids, return an array of loaded grids\n */\nexport function getNadgrids(nadgrids) {\n // Format details: http://proj.maptools.org/gen_parms.html\n if (nadgrids === undefined) { return null; }\n var grids = nadgrids.split(',');\n return grids.map(parseNadgridString);\n}\n\nfunction parseNadgridString(value) {\n if (value.length === 0) {\n return null;\n }\n var optional = value[0] === '@';\n if (optional) {\n value = value.slice(1);\n }\n if (value === 'null') {\n return {name: 'null', mandatory: !optional, grid: null, isNull: true};\n }\n return {\n name: value,\n mandatory: !optional,\n grid: loadedNadgrids[value] || null,\n isNull: false\n };\n}\n\nfunction secondsToRadians(seconds) {\n return (seconds / 3600) * Math.PI / 180;\n}\n\nfunction detectLittleEndian(view) {\n var nFields = view.getInt32(8, false);\n if (nFields === 11) {\n return false;\n }\n nFields = view.getInt32(8, true);\n if (nFields !== 11) {\n console.warn('Failed to detect nadgrid endian-ness, defaulting to little-endian');\n }\n return true;\n}\n\nfunction readHeader(view, isLittleEndian) {\n return {\n nFields: view.getInt32(8, isLittleEndian),\n nSubgridFields: view.getInt32(24, isLittleEndian),\n nSubgrids: view.getInt32(40, isLittleEndian),\n shiftType: decodeString(view, 56, 56 + 8).trim(),\n fromSemiMajorAxis: view.getFloat64(120, isLittleEndian),\n fromSemiMinorAxis: view.getFloat64(136, isLittleEndian),\n toSemiMajorAxis: view.getFloat64(152, isLittleEndian),\n toSemiMinorAxis: view.getFloat64(168, isLittleEndian),\n };\n}\n\nfunction decodeString(view, start, end) {\n return String.fromCharCode.apply(null, new Uint8Array(view.buffer.slice(start, end)));\n}\n\nfunction readSubgrids(view, header, isLittleEndian) {\n var gridOffset = 176;\n var grids = [];\n for (var i = 0; i < header.nSubgrids; i++) {\n var subHeader = readGridHeader(view, gridOffset, isLittleEndian);\n var nodes = readGridNodes(view, gridOffset, subHeader, isLittleEndian);\n var lngColumnCount = Math.round(\n 1 + (subHeader.upperLongitude - subHeader.lowerLongitude) / subHeader.longitudeInterval);\n var latColumnCount = Math.round(\n 1 + (subHeader.upperLatitude - subHeader.lowerLatitude) / subHeader.latitudeInterval);\n // Proj4 operates on radians whereas the coordinates are in seconds in the grid\n grids.push({\n ll: [secondsToRadians(subHeader.lowerLongitude), secondsToRadians(subHeader.lowerLatitude)],\n del: [secondsToRadians(subHeader.longitudeInterval), secondsToRadians(subHeader.latitudeInterval)],\n lim: [lngColumnCount, latColumnCount],\n count: subHeader.gridNodeCount,\n cvs: mapNodes(nodes)\n });\n }\n return grids;\n}\n\nfunction mapNodes(nodes) {\n return nodes.map(function (r) {return [secondsToRadians(r.longitudeShift), secondsToRadians(r.latitudeShift)];});\n}\n\nfunction readGridHeader(view, offset, isLittleEndian) {\n return {\n name: decodeString(view, offset + 8, offset + 16).trim(),\n parent: decodeString(view, offset + 24, offset + 24 + 8).trim(),\n lowerLatitude: view.getFloat64(offset + 72, isLittleEndian),\n upperLatitude: view.getFloat64(offset + 88, isLittleEndian),\n lowerLongitude: view.getFloat64(offset + 104, isLittleEndian),\n upperLongitude: view.getFloat64(offset + 120, isLittleEndian),\n latitudeInterval: view.getFloat64(offset + 136, isLittleEndian),\n longitudeInterval: view.getFloat64(offset + 152, isLittleEndian),\n gridNodeCount: view.getInt32(offset + 168, isLittleEndian)\n };\n}\n\nfunction readGridNodes(view, offset, gridHeader, isLittleEndian) {\n var nodesOffset = offset + 176;\n var gridRecordLength = 16;\n var gridShiftRecords = [];\n for (var i = 0; i < gridHeader.gridNodeCount; i++) {\n var record = {\n latitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength, isLittleEndian),\n longitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength + 4, isLittleEndian),\n latitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 8, isLittleEndian),\n longitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 12, isLittleEndian),\n };\n gridShiftRecords.push(record);\n }\n return gridShiftRecords;\n}\n","import parseCode from './parseCode';\nimport extend from './extend';\nimport projections from './projections';\nimport {sphere as dc_sphere, eccentricity as dc_eccentricity} from './deriveConstants';\nimport Datum from './constants/Datum';\nimport datum from './datum';\nimport match from './match';\nimport {getNadgrids} from \"./nadgrid\";\n\nfunction Projection(srsCode,callback) {\n if (!(this instanceof Projection)) {\n return new Projection(srsCode);\n }\n callback = callback || function(error){\n if(error){\n throw error;\n }\n };\n var json = parseCode(srsCode);\n if(typeof json !== 'object'){\n callback(srsCode);\n return;\n }\n var ourProj = Projection.projections.get(json.projName);\n if(!ourProj){\n callback(srsCode);\n return;\n }\n if (json.datumCode && json.datumCode !== 'none') {\n var datumDef = match(Datum, json.datumCode);\n if (datumDef) {\n json.datum_params = json.datum_params || (datumDef.towgs84 ? datumDef.towgs84.split(',') : null);\n json.ellps = datumDef.ellipse;\n json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode;\n }\n }\n json.k0 = json.k0 || 1.0;\n json.axis = json.axis || 'enu';\n json.ellps = json.ellps || 'wgs84';\n json.lat1 = json.lat1 || json.lat0; // Lambert_Conformal_Conic_1SP, for example, needs this\n\n var sphere_ = dc_sphere(json.a, json.b, json.rf, json.ellps, json.sphere);\n var ecc = dc_eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A);\n var nadgrids = getNadgrids(json.nadgrids);\n var datumObj = json.datum || datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2,\n nadgrids);\n\n extend(this, json); // transfer everything over from the projection because we don't know what we'll need\n extend(this, ourProj); // transfer all the methods from the projection\n\n // copy the 4 things over we calculated in deriveConstants.sphere\n this.a = sphere_.a;\n this.b = sphere_.b;\n this.rf = sphere_.rf;\n this.sphere = sphere_.sphere;\n\n // copy the 3 things we calculated in deriveConstants.eccentricity\n this.es = ecc.es;\n this.e = ecc.e;\n this.ep2 = ecc.ep2;\n\n // add in the datum object\n this.datum = datumObj;\n\n // init the projection\n this.init();\n\n // legecy callback from back in the day when it went to spatialreference.org\n callback(null, this);\n\n}\nProjection.projections = projections;\nProjection.projections.start();\nexport default Projection;\n","'use strict';\nimport {PJD_3PARAM, PJD_7PARAM, HALF_PI} from './constants/values';\nexport function compareDatums(source, dest) {\n if (source.datum_type !== dest.datum_type) {\n return false; // false, datums are not equal\n } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) {\n // the tolerance for es is to ensure that GRS80 and WGS84\n // are considered identical\n return false;\n } else if (source.datum_type === PJD_3PARAM) {\n return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]);\n } else if (source.datum_type === PJD_7PARAM) {\n return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]);\n } else {\n return true; // datums are equal\n }\n} // cs_compare_datums()\n\n/*\n * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates\n * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),\n * according to the current ellipsoid parameters.\n *\n * Latitude : Geodetic latitude in radians (input)\n * Longitude : Geodetic longitude in radians (input)\n * Height : Geodetic height, in meters (input)\n * X : Calculated Geocentric X coordinate, in meters (output)\n * Y : Calculated Geocentric Y coordinate, in meters (output)\n * Z : Calculated Geocentric Z coordinate, in meters (output)\n *\n */\nexport function geodeticToGeocentric(p, es, a) {\n var Longitude = p.x;\n var Latitude = p.y;\n var Height = p.z ? p.z : 0; //Z value not always supplied\n\n var Rn; /* Earth radius at location */\n var Sin_Lat; /* Math.sin(Latitude) */\n var Sin2_Lat; /* Square of Math.sin(Latitude) */\n var Cos_Lat; /* Math.cos(Latitude) */\n\n /*\n ** Don't blow up if Latitude is just a little out of the value\n ** range as it may just be a rounding issue. Also removed longitude\n ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001.\n */\n if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) {\n Latitude = -HALF_PI;\n } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) {\n Latitude = HALF_PI;\n } else if (Latitude < -HALF_PI) {\n /* Latitude out of range */\n //..reportError('geocent:lat out of range:' + Latitude);\n return { x: -Infinity, y: -Infinity, z: p.z };\n } else if (Latitude > HALF_PI) {\n /* Latitude out of range */\n return { x: Infinity, y: Infinity, z: p.z };\n }\n\n if (Longitude > Math.PI) {\n Longitude -= (2 * Math.PI);\n }\n Sin_Lat = Math.sin(Latitude);\n Cos_Lat = Math.cos(Latitude);\n Sin2_Lat = Sin_Lat * Sin_Lat;\n Rn = a / (Math.sqrt(1.0e0 - es * Sin2_Lat));\n return {\n x: (Rn + Height) * Cos_Lat * Math.cos(Longitude),\n y: (Rn + Height) * Cos_Lat * Math.sin(Longitude),\n z: ((Rn * (1 - es)) + Height) * Sin_Lat\n };\n} // cs_geodetic_to_geocentric()\n\nexport function geocentricToGeodetic(p, es, a, b) {\n /* local defintions and variables */\n /* end-criterium of loop, accuracy of sin(Latitude) */\n var genau = 1e-12;\n var genau2 = (genau * genau);\n var maxiter = 30;\n\n var P; /* distance between semi-minor axis and location */\n var RR; /* distance between center and location */\n var CT; /* sin of geocentric latitude */\n var ST; /* cos of geocentric latitude */\n var RX;\n var RK;\n var RN; /* Earth radius at location */\n var CPHI0; /* cos of start or old geodetic latitude in iterations */\n var SPHI0; /* sin of start or old geodetic latitude in iterations */\n var CPHI; /* cos of searched geodetic latitude */\n var SPHI; /* sin of searched geodetic latitude */\n var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */\n var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */\n\n var X = p.x;\n var Y = p.y;\n var Z = p.z ? p.z : 0.0; //Z value not always supplied\n var Longitude;\n var Latitude;\n var Height;\n\n P = Math.sqrt(X * X + Y * Y);\n RR = Math.sqrt(X * X + Y * Y + Z * Z);\n\n /* special cases for latitude and longitude */\n if (P / a < genau) {\n\n /* special case, if P=0. (X=0., Y=0.) */\n Longitude = 0.0;\n\n /* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis\n * of ellipsoid (=center of mass), Latitude becomes PI/2 */\n if (RR / a < genau) {\n Latitude = HALF_PI;\n Height = -b;\n return {\n x: p.x,\n y: p.y,\n z: p.z\n };\n }\n } else {\n /* ellipsoidal (geodetic) longitude\n * interval: -PI < Longitude <= +PI */\n Longitude = Math.atan2(Y, X);\n }\n\n /* --------------------------------------------------------------\n * Following iterative algorithm was developped by\n * \"Institut for Erdmessung\", University of Hannover, July 1988.\n * Internet: www.ife.uni-hannover.de\n * Iterative computation of CPHI,SPHI and Height.\n * Iteration of CPHI and SPHI to 10**-12 radian resp.\n * 2*10**-7 arcsec.\n * --------------------------------------------------------------\n */\n CT = Z / RR;\n ST = P / RR;\n RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST);\n CPHI0 = ST * (1.0 - es) * RX;\n SPHI0 = CT * RX;\n iter = 0;\n\n /* loop to find sin(Latitude) resp. Latitude\n * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */\n do {\n iter++;\n RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0);\n\n /* ellipsoidal (geodetic) height */\n Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0);\n\n RK = es * RN / (RN + Height);\n RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST);\n CPHI = ST * (1.0 - RK) * RX;\n SPHI = CT * RX;\n SDPHI = SPHI * CPHI0 - CPHI * SPHI0;\n CPHI0 = CPHI;\n SPHI0 = SPHI;\n }\n while (SDPHI * SDPHI > genau2 && iter < maxiter);\n\n /* ellipsoidal (geodetic) latitude */\n Latitude = Math.atan(SPHI / Math.abs(CPHI));\n return {\n x: Longitude,\n y: Latitude,\n z: Height\n };\n} // cs_geocentric_to_geodetic()\n\n/****************************************************************/\n// pj_geocentic_to_wgs84( p )\n// p = point to transform in geocentric coordinates (x,y,z)\n\n\n/** point object, nothing fancy, just allows values to be\n passed back and forth by reference rather than by value.\n Other point classes may be used as long as they have\n x and y properties, which will get modified in the transform method.\n*/\nexport function geocentricToWgs84(p, datum_type, datum_params) {\n\n if (datum_type === PJD_3PARAM) {\n // if( x[io] === HUGE_VAL )\n // continue;\n return {\n x: p.x + datum_params[0],\n y: p.y + datum_params[1],\n z: p.z + datum_params[2],\n };\n } else if (datum_type === PJD_7PARAM) {\n var Dx_BF = datum_params[0];\n var Dy_BF = datum_params[1];\n var Dz_BF = datum_params[2];\n var Rx_BF = datum_params[3];\n var Ry_BF = datum_params[4];\n var Rz_BF = datum_params[5];\n var M_BF = datum_params[6];\n // if( x[io] === HUGE_VAL )\n // continue;\n return {\n x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF,\n y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF,\n z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF\n };\n }\n} // cs_geocentric_to_wgs84\n\n/****************************************************************/\n// pj_geocentic_from_wgs84()\n// coordinate system definition,\n// point to transform in geocentric coordinates (x,y,z)\nexport function geocentricFromWgs84(p, datum_type, datum_params) {\n\n if (datum_type === PJD_3PARAM) {\n //if( x[io] === HUGE_VAL )\n // continue;\n return {\n x: p.x - datum_params[0],\n y: p.y - datum_params[1],\n z: p.z - datum_params[2],\n };\n\n } else if (datum_type === PJD_7PARAM) {\n var Dx_BF = datum_params[0];\n var Dy_BF = datum_params[1];\n var Dz_BF = datum_params[2];\n var Rx_BF = datum_params[3];\n var Ry_BF = datum_params[4];\n var Rz_BF = datum_params[5];\n var M_BF = datum_params[6];\n var x_tmp = (p.x - Dx_BF) / M_BF;\n var y_tmp = (p.y - Dy_BF) / M_BF;\n var z_tmp = (p.z - Dz_BF) / M_BF;\n //if( x[io] === HUGE_VAL )\n // continue;\n\n return {\n x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp,\n y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp,\n z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp\n };\n } //cs_geocentric_from_wgs84()\n}\n","import {\n PJD_3PARAM,\n PJD_7PARAM,\n PJD_GRIDSHIFT,\n PJD_NODATUM,\n R2D,\n SRS_WGS84_ESQUARED,\n SRS_WGS84_SEMIMAJOR, SRS_WGS84_SEMIMINOR\n} from './constants/values';\n\nimport {geodeticToGeocentric, geocentricToGeodetic, geocentricToWgs84, geocentricFromWgs84, compareDatums} from './datumUtils';\nimport adjust_lon from \"./common/adjust_lon\";\nfunction checkParams(type) {\n return (type === PJD_3PARAM || type === PJD_7PARAM);\n}\n\nexport default function(source, dest, point) {\n // Short cut if the datums are identical.\n if (compareDatums(source, dest)) {\n return point; // in this case, zero is sucess,\n // whereas cs_compare_datums returns 1 to indicate TRUE\n // confusing, should fix this\n }\n\n // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest\n if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) {\n return point;\n }\n\n // If this datum requires grid shifts, then apply it to geodetic coordinates.\n var source_a = source.a;\n var source_es = source.es;\n if (source.datum_type === PJD_GRIDSHIFT) {\n var gridShiftCode = applyGridShift(source, false, point);\n if (gridShiftCode !== 0) {\n return undefined;\n }\n source_a = SRS_WGS84_SEMIMAJOR;\n source_es = SRS_WGS84_ESQUARED;\n }\n\n var dest_a = dest.a;\n var dest_b = dest.b;\n var dest_es = dest.es;\n if (dest.datum_type === PJD_GRIDSHIFT) {\n dest_a = SRS_WGS84_SEMIMAJOR;\n dest_b = SRS_WGS84_SEMIMINOR;\n dest_es = SRS_WGS84_ESQUARED;\n }\n\n // Do we need to go through geocentric coordinates?\n if (source_es === dest_es && source_a === dest_a && !checkParams(source.datum_type) && !checkParams(dest.datum_type)) {\n return point;\n }\n\n // Convert to geocentric coordinates.\n point = geodeticToGeocentric(point, source_es, source_a);\n // Convert between datums\n if (checkParams(source.datum_type)) {\n point = geocentricToWgs84(point, source.datum_type, source.datum_params);\n }\n if (checkParams(dest.datum_type)) {\n point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params);\n }\n point = geocentricToGeodetic(point, dest_es, dest_a, dest_b);\n\n if (dest.datum_type === PJD_GRIDSHIFT) {\n var destGridShiftResult = applyGridShift(dest, true, point);\n if (destGridShiftResult !== 0) {\n return undefined;\n }\n }\n\n return point;\n}\n\nexport function applyGridShift(source, inverse, point) {\n if (source.grids === null || source.grids.length === 0) {\n console.log('Grid shift grids not found');\n return -1;\n }\n var input = {x: -point.x, y: point.y};\n var output = {x: Number.NaN, y: Number.NaN};\n var onlyMandatoryGrids = false;\n var attemptedGrids = [];\n for (var i = 0; i < source.grids.length; i++) {\n var grid = source.grids[i];\n attemptedGrids.push(grid.name);\n if (grid.isNull) {\n output = input;\n break;\n }\n onlyMandatoryGrids = grid.mandatory;\n if (grid.grid === null) {\n if (grid.mandatory) {\n console.log(\"Unable to find mandatory grid '\" + grid.name + \"'\");\n return -1;\n }\n continue;\n }\n var subgrid = grid.grid.subgrids[0];\n // skip tables that don't match our point at all\n var epsilon = (Math.abs(subgrid.del[1]) + Math.abs(subgrid.del[0])) / 10000.0;\n var minX = subgrid.ll[0] - epsilon;\n var minY = subgrid.ll[1] - epsilon;\n var maxX = subgrid.ll[0] + (subgrid.lim[0] - 1) * subgrid.del[0] + epsilon;\n var maxY = subgrid.ll[1] + (subgrid.lim[1] - 1) * subgrid.del[1] + epsilon;\n if (minY > input.y || minX > input.x || maxY < input.y || maxX < input.x ) {\n continue;\n }\n output = applySubgridShift(input, inverse, subgrid);\n if (!isNaN(output.x)) {\n break;\n }\n }\n if (isNaN(output.x)) {\n console.log(\"Failed to find a grid shift table for location '\"+\n -input.x * R2D + \" \" + input.y * R2D + \" tried: '\" + attemptedGrids + \"'\");\n return -1;\n }\n point.x = -output.x;\n point.y = output.y;\n return 0;\n}\n\nfunction applySubgridShift(pin, inverse, ct) {\n var val = {x: Number.NaN, y: Number.NaN};\n if (isNaN(pin.x)) { return val; }\n var tb = {x: pin.x, y: pin.y};\n tb.x -= ct.ll[0];\n tb.y -= ct.ll[1];\n tb.x = adjust_lon(tb.x - Math.PI) + Math.PI;\n var t = nadInterpolate(tb, ct);\n if (inverse) {\n if (isNaN(t.x)) {\n return val;\n }\n t.x = tb.x - t.x;\n t.y = tb.y - t.y;\n var i = 9, tol = 1e-12;\n var dif, del;\n do {\n del = nadInterpolate(t, ct);\n if (isNaN(del.x)) {\n console.log(\"Inverse grid shift iteration failed, presumably at grid edge. Using first approximation.\");\n break;\n }\n dif = {x: tb.x - (del.x + t.x), y: tb.y - (del.y + t.y)};\n t.x += dif.x;\n t.y += dif.y;\n } while (i-- && Math.abs(dif.x) > tol && Math.abs(dif.y) > tol);\n if (i < 0) {\n console.log(\"Inverse grid shift iterator failed to converge.\");\n return val;\n }\n val.x = adjust_lon(t.x + ct.ll[0]);\n val.y = t.y + ct.ll[1];\n } else {\n if (!isNaN(t.x)) {\n val.x = pin.x + t.x;\n val.y = pin.y + t.y;\n }\n }\n return val;\n}\n\nfunction nadInterpolate(pin, ct) {\n var t = {x: pin.x / ct.del[0], y: pin.y / ct.del[1]};\n var indx = {x: Math.floor(t.x), y: Math.floor(t.y)};\n var frct = {x: t.x - 1.0 * indx.x, y: t.y - 1.0 * indx.y};\n var val= {x: Number.NaN, y: Number.NaN};\n var inx;\n if (indx.x < 0 || indx.x >= ct.lim[0]) {\n return val;\n }\n if (indx.y < 0 || indx.y >= ct.lim[1]) {\n return val;\n }\n inx = (indx.y * ct.lim[0]) + indx.x;\n var f00 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]};\n inx++;\n var f10= {x: ct.cvs[inx][0], y: ct.cvs[inx][1]};\n inx += ct.lim[0];\n var f11 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]};\n inx--;\n var f01 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]};\n var m11 = frct.x * frct.y, m10 = frct.x * (1.0 - frct.y),\n m00 = (1.0 - frct.x) * (1.0 - frct.y), m01 = (1.0 - frct.x) * frct.y;\n val.x = (m00 * f00.x + m10 * f10.x + m01 * f01.x + m11 * f11.x);\n val.y = (m00 * f00.y + m10 * f10.y + m01 * f01.y + m11 * f11.y);\n return val;\n}\n","export default function(crs, denorm, point) {\n var xin = point.x,\n yin = point.y,\n zin = point.z || 0.0;\n var v, t, i;\n var out = {};\n for (i = 0; i < 3; i++) {\n if (denorm && i === 2 && point.z === undefined) {\n continue;\n }\n if (i === 0) {\n v = xin;\n if (\"ew\".indexOf(crs.axis[i]) !== -1) {\n t = 'x';\n } else {\n t = 'y';\n }\n\n }\n else if (i === 1) {\n v = yin;\n if (\"ns\".indexOf(crs.axis[i]) !== -1) {\n t = 'y';\n } else {\n t = 'x';\n }\n }\n else {\n v = zin;\n t = 'z';\n }\n switch (crs.axis[i]) {\n case 'e':\n out[t] = v;\n break;\n case 'w':\n out[t] = -v;\n break;\n case 'n':\n out[t] = v;\n break;\n case 's':\n out[t] = -v;\n break;\n case 'u':\n if (point[t] !== undefined) {\n out.z = v;\n }\n break;\n case 'd':\n if (point[t] !== undefined) {\n out.z = -v;\n }\n break;\n default:\n //console.log(\"ERROR: unknow axis (\"+crs.axis[i]+\") - check definition of \"+crs.projName);\n return null;\n }\n }\n return out;\n}\n","export default function (array){\n var out = {\n x: array[0],\n y: array[1]\n };\n if (array.length>2) {\n out.z = array[2];\n }\n if (array.length>3) {\n out.m = array[3];\n }\n return out;\n}","export default function (point) {\n checkCoord(point.x);\n checkCoord(point.y);\n}\nfunction checkCoord(num) {\n if (typeof Number.isFinite === 'function') {\n if (Number.isFinite(num)) {\n return;\n }\n throw new TypeError('coordinates must be finite numbers');\n }\n if (typeof num !== 'number' || num !== num || !isFinite(num)) {\n throw new TypeError('coordinates must be finite numbers');\n }\n}\n","import {D2R, R2D, PJD_3PARAM, PJD_7PARAM, PJD_GRIDSHIFT} from './constants/values';\nimport datum_transform from './datum_transform';\nimport adjust_axis from './adjust_axis';\nimport proj from './Proj';\nimport toPoint from './common/toPoint';\nimport checkSanity from './checkSanity';\n\nfunction checkNotWGS(source, dest) {\n return (\n (source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM || source.datum.datum_type === PJD_GRIDSHIFT) && dest.datumCode !== 'WGS84') ||\n ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM || dest.datum.datum_type === PJD_GRIDSHIFT) && source.datumCode !== 'WGS84');\n}\n\nexport default function transform(source, dest, point, enforceAxis) {\n var wgs84;\n if (Array.isArray(point)) {\n point = toPoint(point);\n } else {\n // Clone the point object so inputs don't get modified\n point = {\n x: point.x,\n y: point.y,\n z: point.z,\n m: point.m\n };\n }\n var hasZ = point.z !== undefined;\n checkSanity(point);\n // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84\n if (source.datum && dest.datum && checkNotWGS(source, dest)) {\n wgs84 = new proj('WGS84');\n point = transform(source, wgs84, point, enforceAxis);\n source = wgs84;\n }\n // DGR, 2010/11/12\n if (enforceAxis && source.axis !== 'enu') {\n point = adjust_axis(source, false, point);\n }\n // Transform source points to long/lat, if they aren't already.\n if (source.projName === 'longlat') {\n point = {\n x: point.x * D2R,\n y: point.y * D2R,\n z: point.z || 0\n };\n } else {\n if (source.to_meter) {\n point = {\n x: point.x * source.to_meter,\n y: point.y * source.to_meter,\n z: point.z || 0\n };\n }\n point = source.inverse(point); // Convert Cartesian to longlat\n if (!point) {\n return;\n }\n }\n // Adjust for the prime meridian if necessary\n if (source.from_greenwich) {\n point.x += source.from_greenwich;\n }\n\n // Convert datums if needed, and if possible.\n point = datum_transform(source.datum, dest.datum, point);\n if (!point) {\n return;\n }\n\n // Adjust for the prime meridian if necessary\n if (dest.from_greenwich) {\n point = {\n x: point.x - dest.from_greenwich,\n y: point.y,\n z: point.z || 0\n };\n }\n\n if (dest.projName === 'longlat') {\n // convert radians to decimal degrees\n point = {\n x: point.x * R2D,\n y: point.y * R2D,\n z: point.z || 0\n };\n } else { // else project\n point = dest.forward(point);\n if (dest.to_meter) {\n point = {\n x: point.x / dest.to_meter,\n y: point.y / dest.to_meter,\n z: point.z || 0\n };\n }\n }\n\n // DGR, 2010/11/12\n if (enforceAxis && dest.axis !== 'enu') {\n return adjust_axis(dest, true, point);\n }\n\n if (!hasZ) {\n delete point.z;\n }\n return point;\n}\n","import proj from './Proj';\nimport transform from './transform';\nvar wgs84 = proj('WGS84');\n\nfunction transformer(from, to, coords, enforceAxis) {\n var transformedArray, out, keys;\n if (Array.isArray(coords)) {\n transformedArray = transform(from, to, coords, enforceAxis) || {x: NaN, y: NaN};\n if (coords.length > 2) {\n if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) {\n if (typeof transformedArray.z === 'number') {\n return [transformedArray.x, transformedArray.y, transformedArray.z].concat(coords.splice(3));\n } else {\n return [transformedArray.x, transformedArray.y, coords[2]].concat(coords.splice(3));\n }\n } else {\n return [transformedArray.x, transformedArray.y].concat(coords.splice(2));\n }\n } else {\n return [transformedArray.x, transformedArray.y];\n }\n } else {\n out = transform(from, to, coords, enforceAxis);\n keys = Object.keys(coords);\n if (keys.length === 2) {\n return out;\n }\n keys.forEach(function (key) {\n if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) {\n if (key === 'x' || key === 'y' || key === 'z') {\n return;\n }\n } else {\n if (key === 'x' || key === 'y') {\n return;\n }\n }\n out[key] = coords[key];\n });\n return out;\n }\n}\n\nfunction checkProj(item) {\n if (item instanceof proj) {\n return item;\n }\n if (item.oProj) {\n return item.oProj;\n }\n return proj(item);\n}\n\nfunction proj4(fromProj, toProj, coord) {\n fromProj = checkProj(fromProj);\n var single = false;\n var obj;\n if (typeof toProj === 'undefined') {\n toProj = fromProj;\n fromProj = wgs84;\n single = true;\n } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) {\n coord = toProj;\n toProj = fromProj;\n fromProj = wgs84;\n single = true;\n }\n toProj = checkProj(toProj);\n if (coord) {\n return transformer(fromProj, toProj, coord);\n } else {\n obj = {\n forward: function (coords, enforceAxis) {\n return transformer(fromProj, toProj, coords, enforceAxis);\n },\n inverse: function (coords, enforceAxis) {\n return transformer(toProj, fromProj, coords, enforceAxis);\n }\n };\n if (single) {\n obj.oProj = toProj;\n }\n return obj;\n }\n}\nexport default proj4;","\n\n\n/**\n * UTM zones are grouped, and assigned to one of a group of 6\n * sets.\n *\n * {int} @private\n */\nvar NUM_100K_SETS = 6;\n\n/**\n * The column letters (for easting) of the lower left value, per\n * set.\n *\n * {string} @private\n */\nvar SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS';\n\n/**\n * The row letters (for northing) of the lower left value, per\n * set.\n *\n * {string} @private\n */\nvar SET_ORIGIN_ROW_LETTERS = 'AFAFAF';\n\nvar A = 65; // A\nvar I = 73; // I\nvar O = 79; // O\nvar V = 86; // V\nvar Z = 90; // Z\nexport default {\n forward: forward,\n inverse: inverse,\n toPoint: toPoint\n};\n/**\n * Conversion of lat/lon to MGRS.\n *\n * @param {object} ll Object literal with lat and lon properties on a\n * WGS84 ellipsoid.\n * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for\n * 100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5.\n * @return {string} the MGRS string for the given location and accuracy.\n */\nexport function forward(ll, accuracy) {\n accuracy = accuracy || 5; // default accuracy 1m\n return encode(LLtoUTM({\n lat: ll[1],\n lon: ll[0]\n }), accuracy);\n};\n\n/**\n * Conversion of MGRS to lat/lon.\n *\n * @param {string} mgrs MGRS string.\n * @return {array} An array with left (longitude), bottom (latitude), right\n * (longitude) and top (latitude) values in WGS84, representing the\n * bounding box for the provided MGRS reference.\n */\nexport function inverse(mgrs) {\n var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n if (bbox.lat && bbox.lon) {\n return [bbox.lon, bbox.lat, bbox.lon, bbox.lat];\n }\n return [bbox.left, bbox.bottom, bbox.right, bbox.top];\n};\n\nexport function toPoint(mgrs) {\n var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n if (bbox.lat && bbox.lon) {\n return [bbox.lon, bbox.lat];\n }\n return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2];\n};\n/**\n * Conversion from degrees to radians.\n *\n * @private\n * @param {number} deg the angle in degrees.\n * @return {number} the angle in radians.\n */\nfunction degToRad(deg) {\n return (deg * (Math.PI / 180.0));\n}\n\n/**\n * Conversion from radians to degrees.\n *\n * @private\n * @param {number} rad the angle in radians.\n * @return {number} the angle in degrees.\n */\nfunction radToDeg(rad) {\n return (180.0 * (rad / Math.PI));\n}\n\n/**\n * Converts a set of Longitude and Latitude co-ordinates to UTM\n * using the WGS84 ellipsoid.\n *\n * @private\n * @param {object} ll Object literal with lat and lon properties\n * representing the WGS84 coordinate to be converted.\n * @return {object} Object literal containing the UTM value with easting,\n * northing, zoneNumber and zoneLetter properties, and an optional\n * accuracy property in digits. Returns null if the conversion failed.\n */\nfunction LLtoUTM(ll) {\n var Lat = ll.lat;\n var Long = ll.lon;\n var a = 6378137.0; //ellip.radius;\n var eccSquared = 0.00669438; //ellip.eccsq;\n var k0 = 0.9996;\n var LongOrigin;\n var eccPrimeSquared;\n var N, T, C, A, M;\n var LatRad = degToRad(Lat);\n var LongRad = degToRad(Long);\n var LongOriginRad;\n var ZoneNumber;\n // (int)\n ZoneNumber = Math.floor((Long + 180) / 6) + 1;\n\n //Make sure the longitude 180.00 is in Zone 60\n if (Long === 180) {\n ZoneNumber = 60;\n }\n\n // Special zone for Norway\n if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) {\n ZoneNumber = 32;\n }\n\n // Special zones for Svalbard\n if (Lat >= 72.0 && Lat < 84.0) {\n if (Long >= 0.0 && Long < 9.0) {\n ZoneNumber = 31;\n }\n else if (Long >= 9.0 && Long < 21.0) {\n ZoneNumber = 33;\n }\n else if (Long >= 21.0 && Long < 33.0) {\n ZoneNumber = 35;\n }\n else if (Long >= 33.0 && Long < 42.0) {\n ZoneNumber = 37;\n }\n }\n\n LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin\n // in middle of\n // zone\n LongOriginRad = degToRad(LongOrigin);\n\n eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad));\n T = Math.tan(LatRad) * Math.tan(LatRad);\n C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);\n A = Math.cos(LatRad) * (LongRad - LongOriginRad);\n\n M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad));\n\n var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0);\n\n var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0)));\n if (Lat < 0.0) {\n UTMNorthing += 10000000.0; //10000000 meter offset for\n // southern hemisphere\n }\n\n return {\n northing: Math.round(UTMNorthing),\n easting: Math.round(UTMEasting),\n zoneNumber: ZoneNumber,\n zoneLetter: getLetterDesignator(Lat)\n };\n}\n\n/**\n * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience\n * class where the Zone can be specified as a single string eg.\"60N\" which\n * is then broken down into the ZoneNumber and ZoneLetter.\n *\n * @private\n * @param {object} utm An object literal with northing, easting, zoneNumber\n * and zoneLetter properties. If an optional accuracy property is\n * provided (in meters), a bounding box will be returned instead of\n * latitude and longitude.\n * @return {object} An object literal containing either lat and lon values\n * (if no accuracy was provided), or top, right, bottom and left values\n * for the bounding box calculated according to the provided accuracy.\n * Returns null if the conversion failed.\n */\nfunction UTMtoLL(utm) {\n\n var UTMNorthing = utm.northing;\n var UTMEasting = utm.easting;\n var zoneLetter = utm.zoneLetter;\n var zoneNumber = utm.zoneNumber;\n // check the ZoneNummber is valid\n if (zoneNumber < 0 || zoneNumber > 60) {\n return null;\n }\n\n var k0 = 0.9996;\n var a = 6378137.0; //ellip.radius;\n var eccSquared = 0.00669438; //ellip.eccsq;\n var eccPrimeSquared;\n var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared));\n var N1, T1, C1, R1, D, M;\n var LongOrigin;\n var mu, phi1Rad;\n\n // remove 500,000 meter offset for longitude\n var x = UTMEasting - 500000.0;\n var y = UTMNorthing;\n\n // We must know somehow if we are in the Northern or Southern\n // hemisphere, this is the only time we use the letter So even\n // if the Zone letter isn't exactly correct it should indicate\n // the hemisphere correctly\n if (zoneLetter < 'N') {\n y -= 10000000.0; // remove 10,000,000 meter offset used\n // for southern hemisphere\n }\n\n // There are 60 zones with zone 1 being at West -180 to -174\n LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin\n // in middle of\n // zone\n\n eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n M = y / k0;\n mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));\n\n phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu);\n // double phi1 = ProjMath.radToDeg(phi1Rad);\n\n N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad));\n T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad);\n C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad);\n R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5);\n D = x / (N1 * k0);\n\n var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);\n lat = radToDeg(lat);\n\n var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad);\n lon = LongOrigin + radToDeg(lon);\n\n var result;\n if (utm.accuracy) {\n var topRight = UTMtoLL({\n northing: utm.northing + utm.accuracy,\n easting: utm.easting + utm.accuracy,\n zoneLetter: utm.zoneLetter,\n zoneNumber: utm.zoneNumber\n });\n result = {\n top: topRight.lat,\n right: topRight.lon,\n bottom: lat,\n left: lon\n };\n }\n else {\n result = {\n lat: lat,\n lon: lon\n };\n }\n return result;\n}\n\n/**\n * Calculates the MGRS letter designator for the given latitude.\n *\n * @private\n * @param {number} lat The latitude in WGS84 to get the letter designator\n * for.\n * @return {char} The letter designator.\n */\nfunction getLetterDesignator(lat) {\n //This is here as an error flag to show that the Latitude is\n //outside MGRS limits\n var LetterDesignator = 'Z';\n\n if ((84 >= lat) && (lat >= 72)) {\n LetterDesignator = 'X';\n }\n else if ((72 > lat) && (lat >= 64)) {\n LetterDesignator = 'W';\n }\n else if ((64 > lat) && (lat >= 56)) {\n LetterDesignator = 'V';\n }\n else if ((56 > lat) && (lat >= 48)) {\n LetterDesignator = 'U';\n }\n else if ((48 > lat) && (lat >= 40)) {\n LetterDesignator = 'T';\n }\n else if ((40 > lat) && (lat >= 32)) {\n LetterDesignator = 'S';\n }\n else if ((32 > lat) && (lat >= 24)) {\n LetterDesignator = 'R';\n }\n else if ((24 > lat) && (lat >= 16)) {\n LetterDesignator = 'Q';\n }\n else if ((16 > lat) && (lat >= 8)) {\n LetterDesignator = 'P';\n }\n else if ((8 > lat) && (lat >= 0)) {\n LetterDesignator = 'N';\n }\n else if ((0 > lat) && (lat >= -8)) {\n LetterDesignator = 'M';\n }\n else if ((-8 > lat) && (lat >= -16)) {\n LetterDesignator = 'L';\n }\n else if ((-16 > lat) && (lat >= -24)) {\n LetterDesignator = 'K';\n }\n else if ((-24 > lat) && (lat >= -32)) {\n LetterDesignator = 'J';\n }\n else if ((-32 > lat) && (lat >= -40)) {\n LetterDesignator = 'H';\n }\n else if ((-40 > lat) && (lat >= -48)) {\n LetterDesignator = 'G';\n }\n else if ((-48 > lat) && (lat >= -56)) {\n LetterDesignator = 'F';\n }\n else if ((-56 > lat) && (lat >= -64)) {\n LetterDesignator = 'E';\n }\n else if ((-64 > lat) && (lat >= -72)) {\n LetterDesignator = 'D';\n }\n else if ((-72 > lat) && (lat >= -80)) {\n LetterDesignator = 'C';\n }\n return LetterDesignator;\n}\n\n/**\n * Encodes a UTM location as MGRS string.\n *\n * @private\n * @param {object} utm An object literal with easting, northing,\n * zoneLetter, zoneNumber\n * @param {number} accuracy Accuracy in digits (1-5).\n * @return {string} MGRS string for the given UTM location.\n */\nfunction encode(utm, accuracy) {\n // prepend with leading zeroes\n var seasting = \"00000\" + utm.easting,\n snorthing = \"00000\" + utm.northing;\n\n return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy);\n}\n\n/**\n * Get the two letter 100k designator for a given UTM easting,\n * northing and zone number value.\n *\n * @private\n * @param {number} easting\n * @param {number} northing\n * @param {number} zoneNumber\n * @return the two letter 100k designator for the given UTM location.\n */\nfunction get100kID(easting, northing, zoneNumber) {\n var setParm = get100kSetForZone(zoneNumber);\n var setColumn = Math.floor(easting / 100000);\n var setRow = Math.floor(northing / 100000) % 20;\n return getLetter100kID(setColumn, setRow, setParm);\n}\n\n/**\n * Given a UTM zone number, figure out the MGRS 100K set it is in.\n *\n * @private\n * @param {number} i An UTM zone number.\n * @return {number} the 100k set the UTM zone is in.\n */\nfunction get100kSetForZone(i) {\n var setParm = i % NUM_100K_SETS;\n if (setParm === 0) {\n setParm = NUM_100K_SETS;\n }\n\n return setParm;\n}\n\n/**\n * Get the two-letter MGRS 100k designator given information\n * translated from the UTM northing, easting and zone number.\n *\n * @private\n * @param {number} column the column index as it relates to the MGRS\n * 100k set spreadsheet, created from the UTM easting.\n * Values are 1-8.\n * @param {number} row the row index as it relates to the MGRS 100k set\n * spreadsheet, created from the UTM northing value. Values\n * are from 0-19.\n * @param {number} parm the set block, as it relates to the MGRS 100k set\n * spreadsheet, created from the UTM zone. Values are from\n * 1-60.\n * @return two letter MGRS 100k code.\n */\nfunction getLetter100kID(column, row, parm) {\n // colOrigin and rowOrigin are the letters at the origin of the set\n var index = parm - 1;\n var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index);\n var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index);\n\n // colInt and rowInt are the letters to build to return\n var colInt = colOrigin + column - 1;\n var rowInt = rowOrigin + row;\n var rollover = false;\n\n if (colInt > Z) {\n colInt = colInt - Z + A - 1;\n rollover = true;\n }\n\n if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) {\n colInt++;\n }\n\n if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) {\n colInt++;\n\n if (colInt === I) {\n colInt++;\n }\n }\n\n if (colInt > Z) {\n colInt = colInt - Z + A - 1;\n }\n\n if (rowInt > V) {\n rowInt = rowInt - V + A - 1;\n rollover = true;\n }\n else {\n rollover = false;\n }\n\n if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) {\n rowInt++;\n }\n\n if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) {\n rowInt++;\n\n if (rowInt === I) {\n rowInt++;\n }\n }\n\n if (rowInt > V) {\n rowInt = rowInt - V + A - 1;\n }\n\n var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt);\n return twoLetter;\n}\n\n/**\n * Decode the UTM parameters from a MGRS string.\n *\n * @private\n * @param {string} mgrsString an UPPERCASE coordinate string is expected.\n * @return {object} An object literal with easting, northing, zoneLetter,\n * zoneNumber and accuracy (in meters) properties.\n */\nfunction decode(mgrsString) {\n\n if (mgrsString && mgrsString.length === 0) {\n throw (\"MGRSPoint coverting from nothing\");\n }\n\n var length = mgrsString.length;\n\n var hunK = null;\n var sb = \"\";\n var testChar;\n var i = 0;\n\n // get Zone number\n while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) {\n if (i >= 2) {\n throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n }\n sb += testChar;\n i++;\n }\n\n var zoneNumber = parseInt(sb, 10);\n\n if (i === 0 || i + 3 > length) {\n // A good MGRS string has to be 4-5 digits long,\n // ##AAA/#AAA at least.\n throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n }\n\n var zoneLetter = mgrsString.charAt(i++);\n\n // Should we check the zone letter here? Why not.\n if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {\n throw (\"MGRSPoint zone letter \" + zoneLetter + \" not handled: \" + mgrsString);\n }\n\n hunK = mgrsString.substring(i, i += 2);\n\n var set = get100kSetForZone(zoneNumber);\n\n var east100k = getEastingFromChar(hunK.charAt(0), set);\n var north100k = getNorthingFromChar(hunK.charAt(1), set);\n\n // We have a bug where the northing may be 2000000 too low.\n // How\n // do we know when to roll over?\n\n while (north100k < getMinNorthing(zoneLetter)) {\n north100k += 2000000;\n }\n\n // calculate the char index for easting/northing separator\n var remainder = length - i;\n\n if (remainder % 2 !== 0) {\n throw (\"MGRSPoint has to have an even number \\nof digits after the zone letter and two 100km letters - front \\nhalf for easting meters, second half for \\nnorthing meters\" + mgrsString);\n }\n\n var sep = remainder / 2;\n\n var sepEasting = 0.0;\n var sepNorthing = 0.0;\n var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;\n if (sep > 0) {\n accuracyBonus = 100000.0 / Math.pow(10, sep);\n sepEastingString = mgrsString.substring(i, i + sep);\n sepEasting = parseFloat(sepEastingString) * accuracyBonus;\n sepNorthingString = mgrsString.substring(i + sep);\n sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;\n }\n\n easting = sepEasting + east100k;\n northing = sepNorthing + north100k;\n\n return {\n easting: easting,\n northing: northing,\n zoneLetter: zoneLetter,\n zoneNumber: zoneNumber,\n accuracy: accuracyBonus\n };\n}\n\n/**\n * Given the first letter from a two-letter MGRS 100k zone, and given the\n * MGRS table set for the zone number, figure out the easting value that\n * should be added to the other, secondary easting value.\n *\n * @private\n * @param {char} e The first letter from a two-letter MGRS 100´k zone.\n * @param {number} set The MGRS table set for the zone number.\n * @return {number} The easting value for the given letter and set.\n */\nfunction getEastingFromChar(e, set) {\n // colOrigin is the letter at the origin of the set for the\n // column\n var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1);\n var eastingValue = 100000.0;\n var rewindMarker = false;\n\n while (curCol !== e.charCodeAt(0)) {\n curCol++;\n if (curCol === I) {\n curCol++;\n }\n if (curCol === O) {\n curCol++;\n }\n if (curCol > Z) {\n if (rewindMarker) {\n throw (\"Bad character: \" + e);\n }\n curCol = A;\n rewindMarker = true;\n }\n eastingValue += 100000.0;\n }\n\n return eastingValue;\n}\n\n/**\n * Given the second letter from a two-letter MGRS 100k zone, and given the\n * MGRS table set for the zone number, figure out the northing value that\n * should be added to the other, secondary northing value. You have to\n * remember that Northings are determined from the equator, and the vertical\n * cycle of letters mean a 2000000 additional northing meters. This happens\n * approx. every 18 degrees of latitude. This method does *NOT* count any\n * additional northings. You have to figure out how many 2000000 meters need\n * to be added for the zone letter of the MGRS coordinate.\n *\n * @private\n * @param {char} n Second letter of the MGRS 100k zone\n * @param {number} set The MGRS table set number, which is dependent on the\n * UTM zone number.\n * @return {number} The northing value for the given letter and set.\n */\nfunction getNorthingFromChar(n, set) {\n\n if (n > 'V') {\n throw (\"MGRSPoint given invalid Northing \" + n);\n }\n\n // rowOrigin is the letter at the origin of the set for the\n // column\n var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1);\n var northingValue = 0.0;\n var rewindMarker = false;\n\n while (curRow !== n.charCodeAt(0)) {\n curRow++;\n if (curRow === I) {\n curRow++;\n }\n if (curRow === O) {\n curRow++;\n }\n // fixing a bug making whole application hang in this loop\n // when 'n' is a wrong character\n if (curRow > V) {\n if (rewindMarker) { // making sure that this loop ends\n throw (\"Bad character: \" + n);\n }\n curRow = A;\n rewindMarker = true;\n }\n northingValue += 100000.0;\n }\n\n return northingValue;\n}\n\n/**\n * The function getMinNorthing returns the minimum northing value of a MGRS\n * zone.\n *\n * Ported from Geotrans' c Lattitude_Band_Value structure table.\n *\n * @private\n * @param {char} zoneLetter The MGRS zone to get the min northing for.\n * @return {number}\n */\nfunction getMinNorthing(zoneLetter) {\n var northing;\n switch (zoneLetter) {\n case 'C':\n northing = 1100000.0;\n break;\n case 'D':\n northing = 2000000.0;\n break;\n case 'E':\n northing = 2800000.0;\n break;\n case 'F':\n northing = 3700000.0;\n break;\n case 'G':\n northing = 4600000.0;\n break;\n case 'H':\n northing = 5500000.0;\n break;\n case 'J':\n northing = 6400000.0;\n break;\n case 'K':\n northing = 7300000.0;\n break;\n case 'L':\n northing = 8200000.0;\n break;\n case 'M':\n northing = 9100000.0;\n break;\n case 'N':\n northing = 0.0;\n break;\n case 'P':\n northing = 800000.0;\n break;\n case 'Q':\n northing = 1700000.0;\n break;\n case 'R':\n northing = 2600000.0;\n break;\n case 'S':\n northing = 3500000.0;\n break;\n case 'T':\n northing = 4400000.0;\n break;\n case 'U':\n northing = 5300000.0;\n break;\n case 'V':\n northing = 6200000.0;\n break;\n case 'W':\n northing = 7000000.0;\n break;\n case 'X':\n northing = 7900000.0;\n break;\n default:\n northing = -1.0;\n }\n if (northing >= 0.0) {\n return northing;\n }\n else {\n throw (\"Invalid zone letter: \" + zoneLetter);\n }\n\n}\n","import {toPoint, forward} from 'mgrs';\n\nfunction Point(x, y, z) {\n if (!(this instanceof Point)) {\n return new Point(x, y, z);\n }\n if (Array.isArray(x)) {\n this.x = x[0];\n this.y = x[1];\n this.z = x[2] || 0.0;\n } else if(typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z || 0.0;\n } else if (typeof x === 'string' && typeof y === 'undefined') {\n var coords = x.split(',');\n this.x = parseFloat(coords[0], 10);\n this.y = parseFloat(coords[1], 10);\n this.z = parseFloat(coords[2], 10) || 0.0;\n } else {\n this.x = x;\n this.y = y;\n this.z = z || 0.0;\n }\n console.warn('proj4.Point will be removed in version 3, use proj4.toPoint');\n}\n\nPoint.fromMGRS = function(mgrsStr) {\n return new Point(toPoint(mgrsStr));\n};\nPoint.prototype.toMGRS = function(accuracy) {\n return forward([this.x, this.y], accuracy);\n};\nexport default Point;\n","var C00 = 1;\nvar C02 = 0.25;\nvar C04 = 0.046875;\nvar C06 = 0.01953125;\nvar C08 = 0.01068115234375;\nvar C22 = 0.75;\nvar C44 = 0.46875;\nvar C46 = 0.01302083333333333333;\nvar C48 = 0.00712076822916666666;\nvar C66 = 0.36458333333333333333;\nvar C68 = 0.00569661458333333333;\nvar C88 = 0.3076171875;\n\nexport default function(es) {\n var en = [];\n en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08)));\n en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08)));\n var t = es * es;\n en[2] = t * (C44 - es * (C46 + es * C48));\n t *= es;\n en[3] = t * (C66 - es * C68);\n en[4] = t * es * C88;\n return en;\n}","export default function(phi, sphi, cphi, en) {\n cphi *= sphi;\n sphi *= sphi;\n return (en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))));\n}","import pj_mlfn from \"./pj_mlfn\";\nimport {EPSLN} from '../constants/values';\n\nvar MAX_ITER = 20;\n\nexport default function(arg, es, en) {\n var k = 1 / (1 - es);\n var phi = arg;\n for (var i = MAX_ITER; i; --i) { /* rarely goes over 2 iterations */\n var s = Math.sin(phi);\n var t = 1 - es * s * s;\n //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg;\n //phi -= t * (t * Math.sqrt(t)) * k;\n t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k;\n phi -= t;\n if (Math.abs(t) < EPSLN) {\n return phi;\n }\n }\n //..reportError(\"cass:pj_inv_mlfn: Convergence error\");\n return phi;\n}\n","// Heavily based on this tmerc projection implementation\n// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/tmerc.js\n\nimport pj_enfn from '../common/pj_enfn';\nimport pj_mlfn from '../common/pj_mlfn';\nimport pj_inv_mlfn from '../common/pj_inv_mlfn';\nimport adjust_lon from '../common/adjust_lon';\n\nimport {EPSLN, HALF_PI} from '../constants/values';\nimport sign from '../common/sign';\n\nexport function init() {\n this.x0 = this.x0 !== undefined ? this.x0 : 0;\n this.y0 = this.y0 !== undefined ? this.y0 : 0;\n this.long0 = this.long0 !== undefined ? this.long0 : 0;\n this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n\n if (this.es) {\n this.en = pj_enfn(this.es);\n this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en);\n }\n}\n\n/**\n Transverse Mercator Forward - long/lat to x/y\n long/lat in radians\n */\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n\n var delta_lon = adjust_lon(lon - this.long0);\n var con;\n var x, y;\n var sin_phi = Math.sin(lat);\n var cos_phi = Math.cos(lat);\n\n if (!this.es) {\n var b = cos_phi * Math.sin(delta_lon);\n\n if ((Math.abs(Math.abs(b) - 1)) < EPSLN) {\n return (93);\n }\n else {\n x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0;\n y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2));\n b = Math.abs(y);\n\n if (b >= 1) {\n if ((b - 1) > EPSLN) {\n return (93);\n }\n else {\n y = 0;\n }\n }\n else {\n y = Math.acos(y);\n }\n\n if (lat < 0) {\n y = -y;\n }\n\n y = this.a * this.k0 * (y - this.lat0) + this.y0;\n }\n }\n else {\n var al = cos_phi * delta_lon;\n var als = Math.pow(al, 2);\n var c = this.ep2 * Math.pow(cos_phi, 2);\n var cs = Math.pow(c, 2);\n var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0;\n var t = Math.pow(tq, 2);\n var ts = Math.pow(t, 2);\n con = 1 - this.es * Math.pow(sin_phi, 2);\n al = al / Math.sqrt(con);\n var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en);\n\n x = this.a * (this.k0 * al * (1 +\n als / 6 * (1 - t + c +\n als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c +\n als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) +\n this.x0;\n\n y = this.a * (this.k0 * (ml - this.ml0 +\n sin_phi * delta_lon * al / 2 * (1 +\n als / 12 * (5 - t + 9 * c + 4 * cs +\n als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c +\n als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) +\n this.y0;\n }\n\n p.x = x;\n p.y = y;\n\n return p;\n}\n\n/**\n Transverse Mercator Inverse - x/y to long/lat\n */\nexport function inverse(p) {\n var con, phi;\n var lat, lon;\n var x = (p.x - this.x0) * (1 / this.a);\n var y = (p.y - this.y0) * (1 / this.a);\n\n if (!this.es) {\n var f = Math.exp(x / this.k0);\n var g = 0.5 * (f - 1 / f);\n var temp = this.lat0 + y / this.k0;\n var h = Math.cos(temp);\n con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2)));\n lat = Math.asin(con);\n\n if (y < 0) {\n lat = -lat;\n }\n\n if ((g === 0) && (h === 0)) {\n lon = 0;\n }\n else {\n lon = adjust_lon(Math.atan2(g, h) + this.long0);\n }\n }\n else { // ellipsoidal form\n con = this.ml0 + y / this.k0;\n phi = pj_inv_mlfn(con, this.es, this.en);\n\n if (Math.abs(phi) < HALF_PI) {\n var sin_phi = Math.sin(phi);\n var cos_phi = Math.cos(phi);\n var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0;\n var c = this.ep2 * Math.pow(cos_phi, 2);\n var cs = Math.pow(c, 2);\n var t = Math.pow(tan_phi, 2);\n var ts = Math.pow(t, 2);\n con = 1 - this.es * Math.pow(sin_phi, 2);\n var d = x * Math.sqrt(con) / this.k0;\n var ds = Math.pow(d, 2);\n con = con * tan_phi;\n\n lat = phi - (con * ds / (1 - this.es)) * 0.5 * (1 -\n ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs -\n ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c -\n ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t))));\n\n lon = adjust_lon(this.long0 + (d * (1 -\n ds / 6 * (1 + 2 * t + c -\n ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c -\n ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi));\n }\n else {\n lat = HALF_PI * sign(y);\n lon = 0;\n }\n }\n\n p.x = lon;\n p.y = lat;\n\n return p;\n}\n\nexport var names = [\"Fast_Transverse_Mercator\", \"Fast Transverse Mercator\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","export default function(x) {\n var r = Math.exp(x);\n r = (r - 1 / r) / 2;\n return r;\n}","export default function(x, y) {\n x = Math.abs(x);\n y = Math.abs(y);\n var a = Math.max(x, y);\n var b = Math.min(x, y) / (a ? a : 1);\n\n return a * Math.sqrt(1 + Math.pow(b, 2));\n}\n","export default function(x) {\n var y = 1 + x;\n var z = y - 1;\n\n return z === 0 ? x : x * Math.log(y) / z;\n}\n","import hypot from './hypot';\nimport log1py from './log1py';\n\nexport default function(x) {\n var y = Math.abs(x);\n y = log1py(y * (1 + y / (hypot(1, y) + 1)));\n\n return x < 0 ? -y : y;\n}\n","export default function(pp, B) {\n var cos_2B = 2 * Math.cos(2 * B);\n var i = pp.length - 1;\n var h1 = pp[i];\n var h2 = 0;\n var h;\n\n while (--i >= 0) {\n h = -h2 + cos_2B * h1 + pp[i];\n h2 = h1;\n h1 = h;\n }\n\n return (B + h * Math.sin(2 * B));\n}\n","export default function(pp, arg_r) {\n var r = 2 * Math.cos(arg_r);\n var i = pp.length - 1;\n var hr1 = pp[i];\n var hr2 = 0;\n var hr;\n\n while (--i >= 0) {\n hr = -hr2 + r * hr1 + pp[i];\n hr2 = hr1;\n hr1 = hr;\n }\n\n return Math.sin(arg_r) * hr;\n}\n","export default function(x) {\n var r = Math.exp(x);\n r = (r + 1 / r) / 2;\n return r;\n}","import sinh from './sinh';\nimport cosh from './cosh';\n\nexport default function(pp, arg_r, arg_i) {\n var sin_arg_r = Math.sin(arg_r);\n var cos_arg_r = Math.cos(arg_r);\n var sinh_arg_i = sinh(arg_i);\n var cosh_arg_i = cosh(arg_i);\n var r = 2 * cos_arg_r * cosh_arg_i;\n var i = -2 * sin_arg_r * sinh_arg_i;\n var j = pp.length - 1;\n var hr = pp[j];\n var hi1 = 0;\n var hr1 = 0;\n var hi = 0;\n var hr2;\n var hi2;\n\n while (--j >= 0) {\n hr2 = hr1;\n hi2 = hi1;\n hr1 = hr;\n hi1 = hi;\n hr = -hr2 + r * hr1 - i * hi1 + pp[j];\n hi = -hi2 + i * hr1 + r * hi1;\n }\n\n r = sin_arg_r * cosh_arg_i;\n i = cos_arg_r * sinh_arg_i;\n\n return [r * hr - i * hi, r * hi + i * hr];\n}\n","// Heavily based on this etmerc projection implementation\n// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js\n\nimport tmerc from '../projections/tmerc';\nimport sinh from '../common/sinh';\nimport hypot from '../common/hypot';\nimport asinhy from '../common/asinhy';\nimport gatg from '../common/gatg';\nimport clens from '../common/clens';\nimport clens_cmplx from '../common/clens_cmplx';\nimport adjust_lon from '../common/adjust_lon';\n\nexport function init() {\n if (!this.approx && (isNaN(this.es) || this.es <= 0)) {\n throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION[\"Fast_Transverse_Mercator\"] in the WKT.');\n }\n if (this.approx) {\n // When '+approx' is set, use tmerc instead\n tmerc.init.apply(this);\n this.forward = tmerc.forward;\n this.inverse = tmerc.inverse;\n }\n\n this.x0 = this.x0 !== undefined ? this.x0 : 0;\n this.y0 = this.y0 !== undefined ? this.y0 : 0;\n this.long0 = this.long0 !== undefined ? this.long0 : 0;\n this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n\n this.cgb = [];\n this.cbg = [];\n this.utg = [];\n this.gtu = [];\n\n var f = this.es / (1 + Math.sqrt(1 - this.es));\n var n = f / (2 - f);\n var np = n;\n\n this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675 ))))));\n this.cbg[0] = n * (-2 + n * ( 2 / 3 + n * ( 4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725))))));\n\n np = np * n;\n this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945)))));\n this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * ( -13 / 9 + n * (904 / 315 + n * (-1522 / 945)))));\n\n np = np * n;\n this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835))));\n this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835))));\n\n np = np * n;\n this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175)));\n this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * ( -24832 / 14175)));\n\n np = np * n;\n this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237));\n this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185));\n\n np = np * n;\n this.cgb[5] = np * (601676 / 22275);\n this.cbg[5] = np * (444337 / 155925);\n\n np = Math.pow(n, 2);\n this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256)));\n\n this.utg[0] = n * (-0.5 + n * ( 2 / 3 + n * (-37 / 96 + n * ( 1 / 360 + n * (81 / 512 + n * (-96199 / 604800))))));\n this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800))))));\n\n this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720)))));\n this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360)))));\n\n np = np * n;\n this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720 ))));\n this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440))));\n\n np = np * n;\n this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600)));\n this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600)));\n\n np = np * n;\n this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680));\n this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840));\n\n np = np * n;\n this.utg[5] = np * (-20648693 / 638668800);\n this.gtu[5] = np * (212378941 / 319334400);\n\n var Z = gatg(this.cbg, this.lat0);\n this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z));\n}\n\nexport function forward(p) {\n var Ce = adjust_lon(p.x - this.long0);\n var Cn = p.y;\n\n Cn = gatg(this.cbg, Cn);\n var sin_Cn = Math.sin(Cn);\n var cos_Cn = Math.cos(Cn);\n var sin_Ce = Math.sin(Ce);\n var cos_Ce = Math.cos(Ce);\n\n Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn);\n Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce));\n Ce = asinhy(Math.tan(Ce));\n\n var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce);\n\n Cn = Cn + tmp[0];\n Ce = Ce + tmp[1];\n\n var x;\n var y;\n\n if (Math.abs(Ce) <= 2.623395162778) {\n x = this.a * (this.Qn * Ce) + this.x0;\n y = this.a * (this.Qn * Cn + this.Zb) + this.y0;\n }\n else {\n x = Infinity;\n y = Infinity;\n }\n\n p.x = x;\n p.y = y;\n\n return p;\n}\n\nexport function inverse(p) {\n var Ce = (p.x - this.x0) * (1 / this.a);\n var Cn = (p.y - this.y0) * (1 / this.a);\n\n Cn = (Cn - this.Zb) / this.Qn;\n Ce = Ce / this.Qn;\n\n var lon;\n var lat;\n\n if (Math.abs(Ce) <= 2.623395162778) {\n var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce);\n\n Cn = Cn + tmp[0];\n Ce = Ce + tmp[1];\n Ce = Math.atan(sinh(Ce));\n\n var sin_Cn = Math.sin(Cn);\n var cos_Cn = Math.cos(Cn);\n var sin_Ce = Math.sin(Ce);\n var cos_Ce = Math.cos(Ce);\n\n Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn));\n Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn);\n\n lon = adjust_lon(Ce + this.long0);\n lat = gatg(this.cgb, Cn);\n }\n else {\n lon = Infinity;\n lat = Infinity;\n }\n\n p.x = lon;\n p.y = lat;\n\n return p;\n}\n\nexport var names = [\"Extended_Transverse_Mercator\", \"Extended Transverse Mercator\", \"etmerc\", \"Transverse_Mercator\", \"Transverse Mercator\", \"tmerc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from './adjust_lon';\n\nexport default function(zone, lon) {\n if (zone === undefined) {\n zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1;\n\n if (zone < 0) {\n return 0;\n } else if (zone > 60) {\n return 60;\n }\n }\n return zone;\n}\n","import adjust_zone from '../common/adjust_zone';\nimport etmerc from './etmerc';\nexport var dependsOn = 'etmerc';\nimport {D2R} from '../constants/values';\n\n\nexport function init() {\n var zone = adjust_zone(this.zone, this.long0);\n if (zone === undefined) {\n throw new Error('unknown utm zone');\n }\n this.lat0 = 0;\n this.long0 = ((6 * Math.abs(zone)) - 183) * D2R;\n this.x0 = 500000;\n this.y0 = this.utmSouth ? 10000000 : 0;\n this.k0 = 0.9996;\n\n etmerc.init.apply(this);\n this.forward = etmerc.forward;\n this.inverse = etmerc.inverse;\n}\n\nexport var names = [\"Universal Transverse Mercator System\", \"utm\"];\nexport default {\n init: init,\n names: names,\n dependsOn: dependsOn\n};\n","export default function(esinp, exp) {\n return (Math.pow((1 - esinp) / (1 + esinp), exp));\n}","import srat from '../common/srat';\nvar MAX_ITER = 20;\nimport {HALF_PI, FORTPI} from '../constants/values';\n\nexport function init() {\n var sphi = Math.sin(this.lat0);\n var cphi = Math.cos(this.lat0);\n cphi *= cphi;\n this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi);\n this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es));\n this.phic0 = Math.asin(sphi / this.C);\n this.ratexp = 0.5 * this.C * this.e;\n this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp));\n}\n\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n\n p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI;\n p.x = this.C * lon;\n return p;\n}\n\nexport function inverse(p) {\n var DEL_TOL = 1e-14;\n var lon = p.x / this.C;\n var lat = p.y;\n var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C);\n for (var i = MAX_ITER; i > 0; --i) {\n lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI;\n if (Math.abs(lat - p.y) < DEL_TOL) {\n break;\n }\n p.y = lat;\n }\n /* convergence failed */\n if (!i) {\n return null;\n }\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"gauss\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import gauss from './gauss';\nimport adjust_lon from '../common/adjust_lon';\n\nexport function init() {\n gauss.init.apply(this);\n if (!this.rc) {\n return;\n }\n this.sinc0 = Math.sin(this.phic0);\n this.cosc0 = Math.cos(this.phic0);\n this.R2 = 2 * this.rc;\n if (!this.title) {\n this.title = \"Oblique Stereographic Alternative\";\n }\n}\n\nexport function forward(p) {\n var sinc, cosc, cosl, k;\n p.x = adjust_lon(p.x - this.long0);\n gauss.forward.apply(this, [p]);\n sinc = Math.sin(p.y);\n cosc = Math.cos(p.y);\n cosl = Math.cos(p.x);\n k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);\n p.x = k * cosc * Math.sin(p.x);\n p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);\n p.x = this.a * p.x + this.x0;\n p.y = this.a * p.y + this.y0;\n return p;\n}\n\nexport function inverse(p) {\n var sinc, cosc, lon, lat, rho;\n p.x = (p.x - this.x0) / this.a;\n p.y = (p.y - this.y0) / this.a;\n\n p.x /= this.k0;\n p.y /= this.k0;\n if ((rho = Math.sqrt(p.x * p.x + p.y * p.y))) {\n var c = 2 * Math.atan2(rho, this.R2);\n sinc = Math.sin(c);\n cosc = Math.cos(c);\n lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);\n lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);\n }\n else {\n lat = this.phic0;\n lon = 0;\n }\n\n p.x = lon;\n p.y = lat;\n gauss.inverse.apply(this, [p]);\n p.x = adjust_lon(p.x + this.long0);\n return p;\n}\n\nexport var names = [\"Stereographic_North_Pole\", \"Oblique_Stereographic\", \"Polar_Stereographic\", \"sterea\",\"Oblique Stereographic Alternative\",\"Double_Stereographic\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import {EPSLN, HALF_PI} from '../constants/values';\n\nimport sign from '../common/sign';\nimport msfnz from '../common/msfnz';\nimport tsfnz from '../common/tsfnz';\nimport phi2z from '../common/phi2z';\nimport adjust_lon from '../common/adjust_lon';\n\nexport function ssfn_(phit, sinphi, eccen) {\n sinphi *= eccen;\n return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen));\n}\n\nexport function init() {\n this.coslat0 = Math.cos(this.lat0);\n this.sinlat0 = Math.sin(this.lat0);\n if (this.sphere) {\n if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {\n this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts));\n }\n }\n else {\n if (Math.abs(this.coslat0) <= EPSLN) {\n if (this.lat0 > 0) {\n //North pole\n //trace('stere:north pole');\n this.con = 1;\n }\n else {\n //South pole\n //trace('stere:south pole');\n this.con = -1;\n }\n }\n this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e));\n if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {\n this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts));\n }\n this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0);\n this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI;\n this.cosX0 = Math.cos(this.X0);\n this.sinX0 = Math.sin(this.X0);\n }\n}\n\n// Stereographic forward equations--mapping lat,long to x,y\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var sinlat = Math.sin(lat);\n var coslat = Math.cos(lat);\n var A, X, sinX, cosX, ts, rh;\n var dlon = adjust_lon(lon - this.long0);\n\n if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) {\n //case of the origine point\n //trace('stere:this is the origin point');\n p.x = NaN;\n p.y = NaN;\n return p;\n }\n if (this.sphere) {\n //trace('stere:sphere case');\n A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon));\n p.x = this.a * A * coslat * Math.sin(dlon) + this.x0;\n p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0;\n return p;\n }\n else {\n X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI;\n cosX = Math.cos(X);\n sinX = Math.sin(X);\n if (Math.abs(this.coslat0) <= EPSLN) {\n ts = tsfnz(this.e, lat * this.con, this.con * sinlat);\n rh = 2 * this.a * this.k0 * ts / this.cons;\n p.x = this.x0 + rh * Math.sin(lon - this.long0);\n p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0);\n //trace(p.toString());\n return p;\n }\n else if (Math.abs(this.sinlat0) < EPSLN) {\n //Eq\n //trace('stere:equateur');\n A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon));\n p.y = A * sinX;\n }\n else {\n //other case\n //trace('stere:normal case');\n A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon)));\n p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0;\n }\n p.x = A * cosX * Math.sin(dlon) + this.x0;\n }\n //trace(p.toString());\n return p;\n}\n\n//* Stereographic inverse equations--mapping x,y to lat/long\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var lon, lat, ts, ce, Chi;\n var rh = Math.sqrt(p.x * p.x + p.y * p.y);\n if (this.sphere) {\n var c = 2 * Math.atan(rh / (2 * this.a * this.k0));\n lon = this.long0;\n lat = this.lat0;\n if (rh <= EPSLN) {\n p.x = lon;\n p.y = lat;\n return p;\n }\n lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh);\n if (Math.abs(this.coslat0) < EPSLN) {\n if (this.lat0 > 0) {\n lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));\n }\n else {\n lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));\n }\n }\n else {\n lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c)));\n }\n p.x = lon;\n p.y = lat;\n return p;\n }\n else {\n if (Math.abs(this.coslat0) <= EPSLN) {\n if (rh <= EPSLN) {\n lat = this.lat0;\n lon = this.long0;\n p.x = lon;\n p.y = lat;\n //trace(p.toString());\n return p;\n }\n p.x *= this.con;\n p.y *= this.con;\n ts = rh * this.cons / (2 * this.a * this.k0);\n lat = this.con * phi2z(this.e, ts);\n lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, - 1 * p.y));\n }\n else {\n ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1));\n lon = this.long0;\n if (rh <= EPSLN) {\n Chi = this.X0;\n }\n else {\n Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh);\n lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce)));\n }\n lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi)));\n }\n }\n p.x = lon;\n p.y = lat;\n\n //trace(p.toString());\n return p;\n\n}\n\nexport var names = [\"stere\", \"Stereographic_South_Pole\", \"Polar Stereographic (variant B)\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names,\n ssfn_: ssfn_\n};\n","/*\n references:\n Formules et constantes pour le Calcul pour la\n projection cylindrique conforme à axe oblique et pour la transformation entre\n des systèmes de référence.\n http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf\n */\n\nexport function init() {\n var phy0 = this.lat0;\n this.lambda0 = this.long0;\n var sinPhy0 = Math.sin(phy0);\n var semiMajorAxis = this.a;\n var invF = this.rf;\n var flattening = 1 / invF;\n var e2 = 2 * flattening - Math.pow(flattening, 2);\n var e = this.e = Math.sqrt(e2);\n this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2));\n this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4));\n this.b0 = Math.asin(sinPhy0 / this.alpha);\n var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2));\n var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2));\n var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0));\n this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3;\n}\n\nexport function forward(p) {\n var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2));\n var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y)));\n var S = -this.alpha * (Sa1 + Sa2) + this.K;\n\n // spheric latitude\n var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4);\n\n // spheric longitude\n var I = this.alpha * (p.x - this.lambda0);\n\n // psoeudo equatorial rotation\n var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I)));\n\n var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I));\n\n p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0;\n p.x = this.R * rotI + this.x0;\n return p;\n}\n\nexport function inverse(p) {\n var Y = p.x - this.x0;\n var X = p.y - this.y0;\n\n var rotI = Y / this.R;\n var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4);\n\n var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));\n var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB)));\n\n var lambda = this.lambda0 + I / this.alpha;\n\n var S = 0;\n var phy = b;\n var prevPhy = -1000;\n var iteration = 0;\n while (Math.abs(phy - prevPhy) > 0.0000001) {\n if (++iteration > 20) {\n //...reportError(\"omercFwdInfinity\");\n return;\n }\n //S = Math.log(Math.tan(Math.PI / 4 + phy / 2));\n S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2));\n prevPhy = phy;\n phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2;\n }\n\n p.x = lambda;\n p.y = phy;\n return p;\n}\n\nexport var names = [\"somerc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import tsfnz from '../common/tsfnz';\nimport adjust_lon from '../common/adjust_lon';\nimport phi2z from '../common/phi2z';\nimport { D2R, EPSLN, HALF_PI, TWO_PI, FORTPI } from '../constants/values';\n\nvar TOL = 1e-7;\n\nfunction isTypeA(P) {\n var typeAProjections = ['Hotine_Oblique_Mercator','Hotine_Oblique_Mercator_Azimuth_Natural_Origin'];\n var projectionName = typeof P.PROJECTION === \"object\" ? Object.keys(P.PROJECTION)[0] : P.PROJECTION;\n \n return 'no_uoff' in P || 'no_off' in P || typeAProjections.indexOf(projectionName) !== -1;\n}\n\n\n/* Initialize the Oblique Mercator projection\n ------------------------------------------*/\nexport function init() { \n var con, com, cosph0, D, F, H, L, sinph0, p, J, gamma = 0,\n gamma0, lamc = 0, lam1 = 0, lam2 = 0, phi1 = 0, phi2 = 0, alpha_c = 0, AB;\n \n // only Type A uses the no_off or no_uoff property\n // https://github.com/OSGeo/proj.4/issues/104\n this.no_off = isTypeA(this);\n this.no_rot = 'no_rot' in this;\n \n var alp = false;\n if (\"alpha\" in this) {\n alp = true;\n }\n\n var gam = false;\n if (\"rectified_grid_angle\" in this) {\n gam = true;\n }\n\n if (alp) {\n alpha_c = this.alpha;\n }\n \n if (gam) {\n gamma = (this.rectified_grid_angle * D2R);\n }\n \n if (alp || gam) {\n lamc = this.longc;\n } else {\n lam1 = this.long1;\n phi1 = this.lat1;\n lam2 = this.long2;\n phi2 = this.lat2;\n \n if (Math.abs(phi1 - phi2) <= TOL || (con = Math.abs(phi1)) <= TOL ||\n Math.abs(con - HALF_PI) <= TOL || Math.abs(Math.abs(this.lat0) - HALF_PI) <= TOL ||\n Math.abs(Math.abs(phi2) - HALF_PI) <= TOL) {\n throw new Error();\n }\n }\n \n var one_es = 1.0 - this.es;\n com = Math.sqrt(one_es);\n \n if (Math.abs(this.lat0) > EPSLN) {\n sinph0 = Math.sin(this.lat0);\n cosph0 = Math.cos(this.lat0);\n con = 1 - this.es * sinph0 * sinph0;\n this.B = cosph0 * cosph0;\n this.B = Math.sqrt(1 + this.es * this.B * this.B / one_es);\n this.A = this.B * this.k0 * com / con;\n D = this.B * com / (cosph0 * Math.sqrt(con));\n F = D * D -1;\n \n if (F <= 0) {\n F = 0;\n } else {\n F = Math.sqrt(F);\n if (this.lat0 < 0) {\n F = -F;\n }\n }\n \n this.E = F += D;\n this.E *= Math.pow(tsfnz(this.e, this.lat0, sinph0), this.B);\n } else {\n this.B = 1 / com;\n this.A = this.k0;\n this.E = D = F = 1;\n }\n \n if (alp || gam) {\n if (alp) {\n gamma0 = Math.asin(Math.sin(alpha_c) / D);\n if (!gam) {\n gamma = alpha_c;\n }\n } else {\n gamma0 = gamma;\n alpha_c = Math.asin(D * Math.sin(gamma0));\n }\n this.lam0 = lamc - Math.asin(0.5 * (F - 1 / F) * Math.tan(gamma0)) / this.B;\n } else {\n H = Math.pow(tsfnz(this.e, phi1, Math.sin(phi1)), this.B);\n L = Math.pow(tsfnz(this.e, phi2, Math.sin(phi2)), this.B);\n F = this.E / H;\n p = (L - H) / (L + H);\n J = this.E * this.E;\n J = (J - L * H) / (J + L * H);\n con = lam1 - lam2;\n \n if (con < -Math.pi) {\n lam2 -=TWO_PI;\n } else if (con > Math.pi) {\n lam2 += TWO_PI;\n }\n \n this.lam0 = adjust_lon(0.5 * (lam1 + lam2) - Math.atan(J * Math.tan(0.5 * this.B * (lam1 - lam2)) / p) / this.B);\n gamma0 = Math.atan(2 * Math.sin(this.B * adjust_lon(lam1 - this.lam0)) / (F - 1 / F));\n gamma = alpha_c = Math.asin(D * Math.sin(gamma0));\n }\n \n this.singam = Math.sin(gamma0);\n this.cosgam = Math.cos(gamma0);\n this.sinrot = Math.sin(gamma);\n this.cosrot = Math.cos(gamma);\n \n this.rB = 1 / this.B;\n this.ArB = this.A * this.rB;\n this.BrA = 1 / this.ArB;\n AB = this.A * this.B;\n \n if (this.no_off) {\n this.u_0 = 0;\n } else {\n this.u_0 = Math.abs(this.ArB * Math.atan(Math.sqrt(D * D - 1) / Math.cos(alpha_c)));\n \n if (this.lat0 < 0) {\n this.u_0 = - this.u_0;\n } \n }\n \n F = 0.5 * gamma0;\n this.v_pole_n = this.ArB * Math.log(Math.tan(FORTPI - F));\n this.v_pole_s = this.ArB * Math.log(Math.tan(FORTPI + F));\n}\n\n\n/* Oblique Mercator forward equations--mapping lat,long to x,y\n ----------------------------------------------------------*/\nexport function forward(p) {\n var coords = {};\n var S, T, U, V, W, temp, u, v;\n p.x = p.x - this.lam0;\n \n if (Math.abs(Math.abs(p.y) - HALF_PI) > EPSLN) {\n W = this.E / Math.pow(tsfnz(this.e, p.y, Math.sin(p.y)), this.B);\n \n temp = 1 / W;\n S = 0.5 * (W - temp);\n T = 0.5 * (W + temp);\n V = Math.sin(this.B * p.x);\n U = (S * this.singam - V * this.cosgam) / T;\n \n if (Math.abs(Math.abs(U) - 1.0) < EPSLN) {\n throw new Error();\n }\n \n v = 0.5 * this.ArB * Math.log((1 - U)/(1 + U));\n temp = Math.cos(this.B * p.x);\n \n if (Math.abs(temp) < TOL) {\n u = this.A * p.x;\n } else {\n u = this.ArB * Math.atan2((S * this.cosgam + V * this.singam), temp);\n } \n } else {\n v = p.y > 0 ? this.v_pole_n : this.v_pole_s;\n u = this.ArB * p.y;\n }\n \n if (this.no_rot) {\n coords.x = u;\n coords.y = v;\n } else {\n u -= this.u_0;\n coords.x = v * this.cosrot + u * this.sinrot;\n coords.y = u * this.cosrot - v * this.sinrot;\n }\n \n coords.x = (this.a * coords.x + this.x0);\n coords.y = (this.a * coords.y + this.y0);\n \n return coords;\n}\n\nexport function inverse(p) {\n var u, v, Qp, Sp, Tp, Vp, Up;\n var coords = {};\n \n p.x = (p.x - this.x0) * (1.0 / this.a);\n p.y = (p.y - this.y0) * (1.0 / this.a);\n\n if (this.no_rot) {\n v = p.y;\n u = p.x;\n } else {\n v = p.x * this.cosrot - p.y * this.sinrot;\n u = p.y * this.cosrot + p.x * this.sinrot + this.u_0;\n }\n \n Qp = Math.exp(-this.BrA * v);\n Sp = 0.5 * (Qp - 1 / Qp);\n Tp = 0.5 * (Qp + 1 / Qp);\n Vp = Math.sin(this.BrA * u);\n Up = (Vp * this.cosgam + Sp * this.singam) / Tp;\n \n if (Math.abs(Math.abs(Up) - 1) < EPSLN) {\n coords.x = 0;\n coords.y = Up < 0 ? -HALF_PI : HALF_PI;\n } else {\n coords.y = this.E / Math.sqrt((1 + Up) / (1 - Up));\n coords.y = phi2z(this.e, Math.pow(coords.y, 1 / this.B));\n \n if (coords.y === Infinity) {\n throw new Error();\n }\n \n coords.x = -this.rB * Math.atan2((Sp * this.cosgam - Vp * this.singam), Math.cos(this.BrA * u));\n }\n \n coords.x += this.lam0;\n \n return coords;\n}\n\nexport var names = [\"Hotine_Oblique_Mercator\", \"Hotine Oblique Mercator\", \"Hotine_Oblique_Mercator_Azimuth_Natural_Origin\", \"Hotine_Oblique_Mercator_Two_Point_Natural_Origin\", \"Hotine_Oblique_Mercator_Azimuth_Center\", \"Oblique_Mercator\", \"omerc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import msfnz from '../common/msfnz';\nimport tsfnz from '../common/tsfnz';\nimport sign from '../common/sign';\nimport adjust_lon from '../common/adjust_lon';\nimport phi2z from '../common/phi2z';\nimport {HALF_PI, EPSLN} from '../constants/values';\nexport function init() {\n \n //double lat0; /* the reference latitude */\n //double long0; /* the reference longitude */\n //double lat1; /* first standard parallel */\n //double lat2; /* second standard parallel */\n //double r_maj; /* major axis */\n //double r_min; /* minor axis */\n //double false_east; /* x offset in meters */\n //double false_north; /* y offset in meters */\n \n //the above value can be set with proj4.defs\n //example: proj4.defs(\"EPSG:2154\",\"+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs\");\n\n if (!this.lat2) {\n this.lat2 = this.lat1;\n } //if lat2 is not defined\n if (!this.k0) {\n this.k0 = 1;\n }\n this.x0 = this.x0 || 0;\n this.y0 = this.y0 || 0;\n // Standard Parallels cannot be equal and on opposite sides of the equator\n if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n return;\n }\n\n var temp = this.b / this.a;\n this.e = Math.sqrt(1 - temp * temp);\n\n var sin1 = Math.sin(this.lat1);\n var cos1 = Math.cos(this.lat1);\n var ms1 = msfnz(this.e, sin1, cos1);\n var ts1 = tsfnz(this.e, this.lat1, sin1);\n\n var sin2 = Math.sin(this.lat2);\n var cos2 = Math.cos(this.lat2);\n var ms2 = msfnz(this.e, sin2, cos2);\n var ts2 = tsfnz(this.e, this.lat2, sin2);\n\n var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0));\n\n if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2);\n }\n else {\n this.ns = sin1;\n }\n if (isNaN(this.ns)) {\n this.ns = sin1;\n }\n this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));\n this.rh = this.a * this.f0 * Math.pow(ts0, this.ns);\n if (!this.title) {\n this.title = \"Lambert Conformal Conic\";\n }\n}\n\n// Lambert Conformal conic forward equations--mapping lat,long to x,y\n// -----------------------------------------------------------------\nexport function forward(p) {\n\n var lon = p.x;\n var lat = p.y;\n\n // singular cases :\n if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) {\n lat = sign(lat) * (HALF_PI - 2 * EPSLN);\n }\n\n var con = Math.abs(Math.abs(lat) - HALF_PI);\n var ts, rh1;\n if (con > EPSLN) {\n ts = tsfnz(this.e, lat, Math.sin(lat));\n rh1 = this.a * this.f0 * Math.pow(ts, this.ns);\n }\n else {\n con = lat * this.ns;\n if (con <= 0) {\n return null;\n }\n rh1 = 0;\n }\n var theta = this.ns * adjust_lon(lon - this.long0);\n p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;\n p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;\n\n return p;\n}\n\n// Lambert Conformal Conic inverse equations--mapping x,y to lat/long\n// -----------------------------------------------------------------\nexport function inverse(p) {\n\n var rh1, con, ts;\n var lat, lon;\n var x = (p.x - this.x0) / this.k0;\n var y = (this.rh - (p.y - this.y0) / this.k0);\n if (this.ns > 0) {\n rh1 = Math.sqrt(x * x + y * y);\n con = 1;\n }\n else {\n rh1 = -Math.sqrt(x * x + y * y);\n con = -1;\n }\n var theta = 0;\n if (rh1 !== 0) {\n theta = Math.atan2((con * x), (con * y));\n }\n if ((rh1 !== 0) || (this.ns > 0)) {\n con = 1 / this.ns;\n ts = Math.pow((rh1 / (this.a * this.f0)), con);\n lat = phi2z(this.e, ts);\n if (lat === -9999) {\n return null;\n }\n }\n else {\n lat = -HALF_PI;\n }\n lon = adjust_lon(theta / this.ns + this.long0);\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\n \"Lambert Tangential Conformal Conic Projection\",\n \"Lambert_Conformal_Conic\",\n \"Lambert_Conformal_Conic_1SP\",\n \"Lambert_Conformal_Conic_2SP\",\n \"lcc\",\n \"Lambert Conic Conformal (1SP)\",\n \"Lambert Conic Conformal (2SP)\"\n];\n\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\n\nexport function init() {\n this.a = 6377397.155;\n this.es = 0.006674372230614;\n this.e = Math.sqrt(this.es);\n if (!this.lat0) {\n this.lat0 = 0.863937979737193;\n }\n if (!this.long0) {\n this.long0 = 0.7417649320975901 - 0.308341501185665;\n }\n /* if scale not set default to 0.9999 */\n if (!this.k0) {\n this.k0 = 0.9999;\n }\n this.s45 = 0.785398163397448; /* 45 */\n this.s90 = 2 * this.s45;\n this.fi0 = this.lat0;\n this.e2 = this.es;\n this.e = Math.sqrt(this.e2);\n this.alfa = Math.sqrt(1 + (this.e2 * Math.pow(Math.cos(this.fi0), 4)) / (1 - this.e2));\n this.uq = 1.04216856380474;\n this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa);\n this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2);\n this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g;\n this.k1 = this.k0;\n this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2));\n this.s0 = 1.37008346281555;\n this.n = Math.sin(this.s0);\n this.ro0 = this.k1 * this.n0 / Math.tan(this.s0);\n this.ad = this.s90 - this.uq;\n}\n\n/* ellipsoid */\n/* calculate xy from lat/lon */\n/* Constants, identical to inverse transform function */\nexport function forward(p) {\n var gfi, u, deltav, s, d, eps, ro;\n var lon = p.x;\n var lat = p.y;\n var delta_lon = adjust_lon(lon - this.long0);\n /* Transformation */\n gfi = Math.pow(((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat))), (this.alfa * this.e / 2));\n u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45);\n deltav = -delta_lon * this.alfa;\n s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav));\n d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s));\n eps = this.n * d;\n ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n);\n p.y = ro * Math.cos(eps) / 1;\n p.x = ro * Math.sin(eps) / 1;\n\n if (!this.czech) {\n p.y *= -1;\n p.x *= -1;\n }\n return (p);\n}\n\n/* calculate lat/lon from xy */\nexport function inverse(p) {\n var u, deltav, s, d, eps, ro, fi1;\n var ok;\n\n /* Transformation */\n /* revert y, x*/\n var tmp = p.x;\n p.x = p.y;\n p.y = tmp;\n if (!this.czech) {\n p.y *= -1;\n p.x *= -1;\n }\n ro = Math.sqrt(p.x * p.x + p.y * p.y);\n eps = Math.atan2(p.y, p.x);\n d = eps / Math.sin(this.s0);\n s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45);\n u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d));\n deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u));\n p.x = this.long0 - deltav / this.alfa;\n fi1 = u;\n ok = 0;\n var iter = 0;\n do {\n p.y = 2 * (Math.atan(Math.pow(this.k, - 1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45);\n if (Math.abs(fi1 - p.y) < 0.0000000001) {\n ok = 1;\n }\n fi1 = p.y;\n iter += 1;\n } while (ok === 0 && iter < 15);\n if (iter >= 15) {\n return null;\n }\n\n return (p);\n}\n\nexport var names = [\"Krovak\", \"krovak\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","export default function(e0, e1, e2, e3, phi) {\n return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi));\n}","export default function(x) {\n return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x)));\n}","export default function(x) {\n return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x)));\n}","export default function(x) {\n return (0.05859375 * x * x * (1 + 0.75 * x));\n}","export default function(x) {\n return (x * x * x * (35 / 3072));\n}","export default function(a, e, sinphi) {\n var temp = e * sinphi;\n return a / Math.sqrt(1 - temp * temp);\n}","import {HALF_PI} from '../constants/values';\nimport sign from './sign';\n\nexport default function(x) {\n return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI));\n}\n","export default function(ml, e0, e1, e2, e3) {\n var phi;\n var dphi;\n\n phi = ml / e0;\n for (var i = 0; i < 15; i++) {\n dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi));\n phi += dphi;\n if (Math.abs(dphi) <= 0.0000000001) {\n return phi;\n }\n }\n\n //..reportError(\"IMLFN-CONV:Latitude failed to converge after 15 iterations\");\n return NaN;\n}","import mlfn from '../common/mlfn';\nimport e0fn from '../common/e0fn';\nimport e1fn from '../common/e1fn';\nimport e2fn from '../common/e2fn';\nimport e3fn from '../common/e3fn';\nimport gN from '../common/gN';\nimport adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\nimport imlfn from '../common/imlfn';\nimport {HALF_PI, EPSLN} from '../constants/values';\n\nexport function init() {\n if (!this.sphere) {\n this.e0 = e0fn(this.es);\n this.e1 = e1fn(this.es);\n this.e2 = e2fn(this.es);\n this.e3 = e3fn(this.es);\n this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n }\n}\n\n/* Cassini forward equations--mapping lat,long to x,y\n -----------------------------------------------------------------------*/\nexport function forward(p) {\n\n /* Forward equations\n -----------------*/\n var x, y;\n var lam = p.x;\n var phi = p.y;\n lam = adjust_lon(lam - this.long0);\n\n if (this.sphere) {\n x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam));\n y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0);\n }\n else {\n //ellipsoid\n var sinphi = Math.sin(phi);\n var cosphi = Math.cos(phi);\n var nl = gN(this.a, this.e, sinphi);\n var tl = Math.tan(phi) * Math.tan(phi);\n var al = lam * Math.cos(phi);\n var asq = al * al;\n var cl = this.es * cosphi * cosphi / (1 - this.es);\n var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n\n x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120));\n y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24);\n\n\n }\n\n p.x = x + this.x0;\n p.y = y + this.y0;\n return p;\n}\n\n/* Inverse equations\n -----------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var x = p.x / this.a;\n var y = p.y / this.a;\n var phi, lam;\n\n if (this.sphere) {\n var dd = y + this.lat0;\n phi = Math.asin(Math.sin(dd) * Math.cos(x));\n lam = Math.atan2(Math.tan(x), Math.cos(dd));\n }\n else {\n /* ellipsoid */\n var ml1 = this.ml0 / this.a + y;\n var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3);\n if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) {\n p.x = this.long0;\n p.y = HALF_PI;\n if (y < 0) {\n p.y *= -1;\n }\n return p;\n }\n var nl1 = gN(this.a, this.e, Math.sin(phi1));\n\n var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es);\n var tl1 = Math.pow(Math.tan(phi1), 2);\n var dl = x * this.a / nl1;\n var dsq = dl * dl;\n phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24);\n lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1);\n\n }\n\n p.x = adjust_lon(lam + this.long0);\n p.y = adjust_lat(phi);\n return p;\n\n}\n\nexport var names = [\"Cassini\", \"Cassini_Soldner\", \"cass\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","export default function(eccent, sinphi) {\n var con;\n if (eccent > 1.0e-7) {\n con = eccent * sinphi;\n return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con))));\n }\n else {\n return (2 * sinphi);\n }\n}","\nimport {HALF_PI, EPSLN, FORTPI} from '../constants/values';\n\nimport qsfnz from '../common/qsfnz';\nimport adjust_lon from '../common/adjust_lon';\n\n/*\n reference\n \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n */\n\nexport var S_POLE = 1;\n\nexport var N_POLE = 2;\nexport var EQUIT = 3;\nexport var OBLIQ = 4;\n\n/* Initialize the Lambert Azimuthal Equal Area projection\n ------------------------------------------------------*/\nexport function init() {\n var t = Math.abs(this.lat0);\n if (Math.abs(t - HALF_PI) < EPSLN) {\n this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE;\n }\n else if (Math.abs(t) < EPSLN) {\n this.mode = this.EQUIT;\n }\n else {\n this.mode = this.OBLIQ;\n }\n if (this.es > 0) {\n var sinphi;\n\n this.qp = qsfnz(this.e, 1);\n this.mmf = 0.5 / (1 - this.es);\n this.apa = authset(this.es);\n switch (this.mode) {\n case this.N_POLE:\n this.dd = 1;\n break;\n case this.S_POLE:\n this.dd = 1;\n break;\n case this.EQUIT:\n this.rq = Math.sqrt(0.5 * this.qp);\n this.dd = 1 / this.rq;\n this.xmf = 1;\n this.ymf = 0.5 * this.qp;\n break;\n case this.OBLIQ:\n this.rq = Math.sqrt(0.5 * this.qp);\n sinphi = Math.sin(this.lat0);\n this.sinb1 = qsfnz(this.e, sinphi) / this.qp;\n this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1);\n this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1);\n this.ymf = (this.xmf = this.rq) / this.dd;\n this.xmf *= this.dd;\n break;\n }\n }\n else {\n if (this.mode === this.OBLIQ) {\n this.sinph0 = Math.sin(this.lat0);\n this.cosph0 = Math.cos(this.lat0);\n }\n }\n}\n\n/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y\n -----------------------------------------------------------------------*/\nexport function forward(p) {\n\n /* Forward equations\n -----------------*/\n var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi;\n var lam = p.x;\n var phi = p.y;\n\n lam = adjust_lon(lam - this.long0);\n if (this.sphere) {\n sinphi = Math.sin(phi);\n cosphi = Math.cos(phi);\n coslam = Math.cos(lam);\n if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;\n if (y <= EPSLN) {\n return null;\n }\n y = Math.sqrt(2 / y);\n x = y * cosphi * Math.sin(lam);\n y *= (this.mode === this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;\n }\n else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n if (this.mode === this.N_POLE) {\n coslam = -coslam;\n }\n if (Math.abs(phi + this.lat0) < EPSLN) {\n return null;\n }\n y = FORTPI - phi * 0.5;\n y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y));\n x = y * Math.sin(lam);\n y *= coslam;\n }\n }\n else {\n sinb = 0;\n cosb = 0;\n b = 0;\n coslam = Math.cos(lam);\n sinlam = Math.sin(lam);\n sinphi = Math.sin(phi);\n q = qsfnz(this.e, sinphi);\n if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n sinb = q / this.qp;\n cosb = Math.sqrt(1 - sinb * sinb);\n }\n switch (this.mode) {\n case this.OBLIQ:\n b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam;\n break;\n case this.EQUIT:\n b = 1 + cosb * coslam;\n break;\n case this.N_POLE:\n b = HALF_PI + phi;\n q = this.qp - q;\n break;\n case this.S_POLE:\n b = phi - HALF_PI;\n q = this.qp + q;\n break;\n }\n if (Math.abs(b) < EPSLN) {\n return null;\n }\n switch (this.mode) {\n case this.OBLIQ:\n case this.EQUIT:\n b = Math.sqrt(2 / b);\n if (this.mode === this.OBLIQ) {\n y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam);\n }\n else {\n y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf;\n }\n x = this.xmf * b * cosb * sinlam;\n break;\n case this.N_POLE:\n case this.S_POLE:\n if (q >= 0) {\n x = (b = Math.sqrt(q)) * sinlam;\n y = coslam * ((this.mode === this.S_POLE) ? b : -b);\n }\n else {\n x = y = 0;\n }\n break;\n }\n }\n\n p.x = this.a * x + this.x0;\n p.y = this.a * y + this.y0;\n return p;\n}\n\n/* Inverse equations\n -----------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var x = p.x / this.a;\n var y = p.y / this.a;\n var lam, phi, cCe, sCe, q, rho, ab;\n if (this.sphere) {\n var cosz = 0,\n rh, sinz = 0;\n\n rh = Math.sqrt(x * x + y * y);\n phi = rh * 0.5;\n if (phi > 1) {\n return null;\n }\n phi = 2 * Math.asin(phi);\n if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n sinz = Math.sin(phi);\n cosz = Math.cos(phi);\n }\n switch (this.mode) {\n case this.EQUIT:\n phi = (Math.abs(rh) <= EPSLN) ? 0 : Math.asin(y * sinz / rh);\n x *= sinz;\n y = cosz * rh;\n break;\n case this.OBLIQ:\n phi = (Math.abs(rh) <= EPSLN) ? this.lat0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh);\n x *= sinz * this.cosph0;\n y = (cosz - Math.sin(phi) * this.sinph0) * rh;\n break;\n case this.N_POLE:\n y = -y;\n phi = HALF_PI - phi;\n break;\n case this.S_POLE:\n phi -= HALF_PI;\n break;\n }\n lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y);\n }\n else {\n ab = 0;\n if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n x /= this.dd;\n y *= this.dd;\n rho = Math.sqrt(x * x + y * y);\n if (rho < EPSLN) {\n p.x = this.long0;\n p.y = this.lat0;\n return p;\n }\n sCe = 2 * Math.asin(0.5 * rho / this.rq);\n cCe = Math.cos(sCe);\n x *= (sCe = Math.sin(sCe));\n if (this.mode === this.OBLIQ) {\n ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho;\n q = this.qp * ab;\n y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe;\n }\n else {\n ab = y * sCe / rho;\n q = this.qp * ab;\n y = rho * cCe;\n }\n }\n else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n if (this.mode === this.N_POLE) {\n y = -y;\n }\n q = (x * x + y * y);\n if (!q) {\n p.x = this.long0;\n p.y = this.lat0;\n return p;\n }\n ab = 1 - q / this.qp;\n if (this.mode === this.S_POLE) {\n ab = -ab;\n }\n }\n lam = Math.atan2(x, y);\n phi = authlat(Math.asin(ab), this.apa);\n }\n\n p.x = adjust_lon(this.long0 + lam);\n p.y = phi;\n return p;\n}\n\n/* determine latitude from authalic latitude */\nvar P00 = 0.33333333333333333333;\n\nvar P01 = 0.17222222222222222222;\nvar P02 = 0.10257936507936507936;\nvar P10 = 0.06388888888888888888;\nvar P11 = 0.06640211640211640211;\nvar P20 = 0.01641501294219154443;\n\nfunction authset(es) {\n var t;\n var APA = [];\n APA[0] = es * P00;\n t = es * es;\n APA[0] += t * P01;\n APA[1] = t * P10;\n t *= es;\n APA[0] += t * P02;\n APA[1] += t * P11;\n APA[2] = t * P20;\n return APA;\n}\n\nfunction authlat(beta, APA) {\n var t = beta + beta;\n return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t));\n}\n\nexport var names = [\"Lambert Azimuthal Equal Area\", \"Lambert_Azimuthal_Equal_Area\", \"laea\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names,\n S_POLE: S_POLE,\n N_POLE: N_POLE,\n EQUIT: EQUIT,\n OBLIQ: OBLIQ\n};\n","export default function(x) {\n if (Math.abs(x) > 1) {\n x = (x > 1) ? 1 : -1;\n }\n return Math.asin(x);\n}","import msfnz from '../common/msfnz';\nimport qsfnz from '../common/qsfnz';\nimport adjust_lon from '../common/adjust_lon';\nimport asinz from '../common/asinz';\nimport {EPSLN} from '../constants/values';\n\nexport function init() {\n\n if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n return;\n }\n this.temp = this.b / this.a;\n this.es = 1 - Math.pow(this.temp, 2);\n this.e3 = Math.sqrt(this.es);\n\n this.sin_po = Math.sin(this.lat1);\n this.cos_po = Math.cos(this.lat1);\n this.t1 = this.sin_po;\n this.con = this.sin_po;\n this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po);\n this.qs1 = qsfnz(this.e3, this.sin_po);\n\n this.sin_po = Math.sin(this.lat2);\n this.cos_po = Math.cos(this.lat2);\n this.t2 = this.sin_po;\n this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po);\n this.qs2 = qsfnz(this.e3, this.sin_po);\n\n this.sin_po = Math.sin(this.lat0);\n this.cos_po = Math.cos(this.lat0);\n this.t3 = this.sin_po;\n this.qs0 = qsfnz(this.e3, this.sin_po);\n\n if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1);\n }\n else {\n this.ns0 = this.con;\n }\n this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;\n this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0;\n}\n\n/* Albers Conical Equal Area forward equations--mapping lat,long to x,y\n -------------------------------------------------------------------*/\nexport function forward(p) {\n\n var lon = p.x;\n var lat = p.y;\n\n this.sin_phi = Math.sin(lat);\n this.cos_phi = Math.cos(lat);\n\n var qs = qsfnz(this.e3, this.sin_phi);\n var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0;\n var theta = this.ns0 * adjust_lon(lon - this.long0);\n var x = rh1 * Math.sin(theta) + this.x0;\n var y = this.rh - rh1 * Math.cos(theta) + this.y0;\n\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var rh1, qs, con, theta, lon, lat;\n\n p.x -= this.x0;\n p.y = this.rh - p.y + this.y0;\n if (this.ns0 >= 0) {\n rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n con = 1;\n }\n else {\n rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n con = -1;\n }\n theta = 0;\n if (rh1 !== 0) {\n theta = Math.atan2(con * p.x, con * p.y);\n }\n con = rh1 * this.ns0 / this.a;\n if (this.sphere) {\n lat = Math.asin((this.c - con * con) / (2 * this.ns0));\n }\n else {\n qs = (this.c - con * con) / this.ns0;\n lat = this.phi1z(this.e3, qs);\n }\n\n lon = adjust_lon(theta / this.ns0 + this.long0);\n p.x = lon;\n p.y = lat;\n return p;\n}\n\n/* Function to compute phi1, the latitude for the inverse of the\n Albers Conical Equal-Area projection.\n-------------------------------------------*/\nexport function phi1z(eccent, qs) {\n var sinphi, cosphi, con, com, dphi;\n var phi = asinz(0.5 * qs);\n if (eccent < EPSLN) {\n return phi;\n }\n\n var eccnts = eccent * eccent;\n for (var i = 1; i <= 25; i++) {\n sinphi = Math.sin(phi);\n cosphi = Math.cos(phi);\n con = eccent * sinphi;\n com = 1 - con * con;\n dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con)));\n phi = phi + dphi;\n if (Math.abs(dphi) <= 1e-7) {\n return phi;\n }\n }\n return null;\n}\n\nexport var names = [\"Albers_Conic_Equal_Area\", \"Albers\", \"aea\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names,\n phi1z: phi1z\n};\n","import adjust_lon from '../common/adjust_lon';\nimport asinz from '../common/asinz';\nimport {EPSLN} from '../constants/values';\n\n/*\n reference:\n Wolfram Mathworld \"Gnomonic Projection\"\n http://mathworld.wolfram.com/GnomonicProjection.html\n Accessed: 12th November 2009\n */\nexport function init() {\n\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n this.sin_p14 = Math.sin(this.lat0);\n this.cos_p14 = Math.cos(this.lat0);\n // Approximation for projecting points to the horizon (infinity)\n this.infinity_dist = 1000 * this.a;\n this.rc = 1;\n}\n\n/* Gnomonic forward equations--mapping lat,long to x,y\n ---------------------------------------------------*/\nexport function forward(p) {\n var sinphi, cosphi; /* sin and cos value */\n var dlon; /* delta longitude value */\n var coslon; /* cos of longitude */\n var ksp; /* scale factor */\n var g;\n var x, y;\n var lon = p.x;\n var lat = p.y;\n /* Forward equations\n -----------------*/\n dlon = adjust_lon(lon - this.long0);\n\n sinphi = Math.sin(lat);\n cosphi = Math.cos(lat);\n\n coslon = Math.cos(dlon);\n g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n ksp = 1;\n if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g;\n y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g;\n }\n else {\n\n // Point is in the opposing hemisphere and is unprojectable\n // We still need to return a reasonable point, so we project\n // to infinity, on a bearing\n // equivalent to the northern hemisphere equivalent\n // This is a reasonable approximation for short shapes and lines that\n // straddle the horizon.\n\n x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon);\n y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n\n }\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var rh; /* Rho */\n var sinc, cosc;\n var c;\n var lon, lat;\n\n /* Inverse equations\n -----------------*/\n p.x = (p.x - this.x0) / this.a;\n p.y = (p.y - this.y0) / this.a;\n\n p.x /= this.k0;\n p.y /= this.k0;\n\n if ((rh = Math.sqrt(p.x * p.x + p.y * p.y))) {\n c = Math.atan2(rh, this.rc);\n sinc = Math.sin(c);\n cosc = Math.cos(c);\n\n lat = asinz(cosc * this.sin_p14 + (p.y * sinc * this.cos_p14) / rh);\n lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc);\n lon = adjust_lon(this.long0 + lon);\n }\n else {\n lat = this.phic0;\n lon = 0;\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"gnom\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import {HALF_PI} from '../constants/values';\n\nexport default function(eccent, q) {\n var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent));\n if (Math.abs(Math.abs(q) - temp) < 1.0E-6) {\n if (q < 0) {\n return (-1 * HALF_PI);\n }\n else {\n return HALF_PI;\n }\n }\n //var phi = 0.5* q/(1-eccent*eccent);\n var phi = Math.asin(0.5 * q);\n var dphi;\n var sin_phi;\n var cos_phi;\n var con;\n for (var i = 0; i < 30; i++) {\n sin_phi = Math.sin(phi);\n cos_phi = Math.cos(phi);\n con = eccent * sin_phi;\n dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con)));\n phi += dphi;\n if (Math.abs(dphi) <= 0.0000000001) {\n return phi;\n }\n }\n\n //console.log(\"IQSFN-CONV:Latitude failed to converge after 30 iterations\");\n return NaN;\n}\n","import adjust_lon from '../common/adjust_lon';\nimport qsfnz from '../common/qsfnz';\nimport msfnz from '../common/msfnz';\nimport iqsfnz from '../common/iqsfnz';\n\n/*\n reference:\n \"Cartographic Projection Procedures for the UNIX Environment-\n A User's Manual\" by Gerald I. Evenden,\n USGS Open File Report 90-284and Release 4 Interim Reports (2003)\n*/\nexport function init() {\n //no-op\n if (!this.sphere) {\n this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n }\n}\n\n/* Cylindrical Equal Area forward equations--mapping lat,long to x,y\n ------------------------------------------------------------*/\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var x, y;\n /* Forward equations\n -----------------*/\n var dlon = adjust_lon(lon - this.long0);\n if (this.sphere) {\n x = this.x0 + this.a * dlon * Math.cos(this.lat_ts);\n y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts);\n }\n else {\n var qs = qsfnz(this.e, Math.sin(lat));\n x = this.x0 + this.a * this.k0 * dlon;\n y = this.y0 + this.a * qs * 0.5 / this.k0;\n }\n\n p.x = x;\n p.y = y;\n return p;\n}\n\n/* Cylindrical Equal Area inverse equations--mapping x,y to lat/long\n ------------------------------------------------------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var lon, lat;\n\n if (this.sphere) {\n lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts));\n lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts));\n }\n else {\n lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a);\n lon = adjust_lon(this.long0 + p.x / (this.a * this.k0));\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"cea\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\n\nexport function init() {\n\n this.x0 = this.x0 || 0;\n this.y0 = this.y0 || 0;\n this.lat0 = this.lat0 || 0;\n this.long0 = this.long0 || 0;\n this.lat_ts = this.lat_ts || 0;\n this.title = this.title || \"Equidistant Cylindrical (Plate Carre)\";\n\n this.rc = Math.cos(this.lat_ts);\n}\n\n// forward equations--mapping lat,long to x,y\n// -----------------------------------------------------------------\nexport function forward(p) {\n\n var lon = p.x;\n var lat = p.y;\n\n var dlon = adjust_lon(lon - this.long0);\n var dlat = adjust_lat(lat - this.lat0);\n p.x = this.x0 + (this.a * dlon * this.rc);\n p.y = this.y0 + (this.a * dlat);\n return p;\n}\n\n// inverse equations--mapping x,y to lat/long\n// -----------------------------------------------------------------\nexport function inverse(p) {\n\n var x = p.x;\n var y = p.y;\n\n p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc)));\n p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a)));\n return p;\n}\n\nexport var names = [\"Equirectangular\", \"Equidistant_Cylindrical\", \"eqc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import e0fn from '../common/e0fn';\nimport e1fn from '../common/e1fn';\nimport e2fn from '../common/e2fn';\nimport e3fn from '../common/e3fn';\nimport adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\nimport mlfn from '../common/mlfn';\nimport {EPSLN} from '../constants/values';\n\nimport gN from '../common/gN';\nvar MAX_ITER = 20;\n\nexport function init() {\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n this.temp = this.b / this.a;\n this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles\n this.e = Math.sqrt(this.es);\n this.e0 = e0fn(this.es);\n this.e1 = e1fn(this.es);\n this.e2 = e2fn(this.es);\n this.e3 = e3fn(this.es);\n this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas\n}\n\n/* Polyconic forward equations--mapping lat,long to x,y\n ---------------------------------------------------*/\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var x, y, el;\n var dlon = adjust_lon(lon - this.long0);\n el = dlon * Math.sin(lat);\n if (this.sphere) {\n if (Math.abs(lat) <= EPSLN) {\n x = this.a * dlon;\n y = -1 * this.a * this.lat0;\n }\n else {\n x = this.a * Math.sin(el) / Math.tan(lat);\n y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat));\n }\n }\n else {\n if (Math.abs(lat) <= EPSLN) {\n x = this.a * dlon;\n y = -1 * this.ml0;\n }\n else {\n var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat);\n x = nl * Math.sin(el);\n y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el));\n }\n\n }\n p.x = x + this.x0;\n p.y = y + this.y0;\n return p;\n}\n\n/* Inverse equations\n -----------------*/\nexport function inverse(p) {\n var lon, lat, x, y, i;\n var al, bl;\n var phi, dphi;\n x = p.x - this.x0;\n y = p.y - this.y0;\n\n if (this.sphere) {\n if (Math.abs(y + this.a * this.lat0) <= EPSLN) {\n lon = adjust_lon(x / this.a + this.long0);\n lat = 0;\n }\n else {\n al = this.lat0 + y / this.a;\n bl = x * x / this.a / this.a + al * al;\n phi = al;\n var tanphi;\n for (i = MAX_ITER; i; --i) {\n tanphi = Math.tan(phi);\n dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1);\n phi += dphi;\n if (Math.abs(dphi) <= EPSLN) {\n lat = phi;\n break;\n }\n }\n lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat));\n }\n }\n else {\n if (Math.abs(y + this.ml0) <= EPSLN) {\n lat = 0;\n lon = adjust_lon(this.long0 + x / this.a);\n }\n else {\n\n al = (this.ml0 + y) / this.a;\n bl = x * x / this.a / this.a + al * al;\n phi = al;\n var cl, mln, mlnp, ma;\n var con;\n for (i = MAX_ITER; i; --i) {\n con = this.e * Math.sin(phi);\n cl = Math.sqrt(1 - con * con) * Math.tan(phi);\n mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi);\n ma = mln / this.a;\n dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp);\n phi -= dphi;\n if (Math.abs(dphi) <= EPSLN) {\n lat = phi;\n break;\n }\n }\n\n //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0);\n cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat);\n lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat));\n }\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Polyconic\", \"poly\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import {SEC_TO_RAD} from '../constants/values';\n\n/*\n reference\n Department of Land and Survey Technical Circular 1973/32\n http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf\n OSG Technical Report 4.1\n http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf\n */\n\n/**\n * iterations: Number of iterations to refine inverse transform.\n * 0 -> km accuracy\n * 1 -> m accuracy -- suitable for most mapping applications\n * 2 -> mm accuracy\n */\nexport var iterations = 1;\n\nexport function init() {\n this.A = [];\n this.A[1] = 0.6399175073;\n this.A[2] = -0.1358797613;\n this.A[3] = 0.063294409;\n this.A[4] = -0.02526853;\n this.A[5] = 0.0117879;\n this.A[6] = -0.0055161;\n this.A[7] = 0.0026906;\n this.A[8] = -0.001333;\n this.A[9] = 0.00067;\n this.A[10] = -0.00034;\n\n this.B_re = [];\n this.B_im = [];\n this.B_re[1] = 0.7557853228;\n this.B_im[1] = 0;\n this.B_re[2] = 0.249204646;\n this.B_im[2] = 0.003371507;\n this.B_re[3] = -0.001541739;\n this.B_im[3] = 0.041058560;\n this.B_re[4] = -0.10162907;\n this.B_im[4] = 0.01727609;\n this.B_re[5] = -0.26623489;\n this.B_im[5] = -0.36249218;\n this.B_re[6] = -0.6870983;\n this.B_im[6] = -1.1651967;\n\n this.C_re = [];\n this.C_im = [];\n this.C_re[1] = 1.3231270439;\n this.C_im[1] = 0;\n this.C_re[2] = -0.577245789;\n this.C_im[2] = -0.007809598;\n this.C_re[3] = 0.508307513;\n this.C_im[3] = -0.112208952;\n this.C_re[4] = -0.15094762;\n this.C_im[4] = 0.18200602;\n this.C_re[5] = 1.01418179;\n this.C_im[5] = 1.64497696;\n this.C_re[6] = 1.9660549;\n this.C_im[6] = 2.5127645;\n\n this.D = [];\n this.D[1] = 1.5627014243;\n this.D[2] = 0.5185406398;\n this.D[3] = -0.03333098;\n this.D[4] = -0.1052906;\n this.D[5] = -0.0368594;\n this.D[6] = 0.007317;\n this.D[7] = 0.01220;\n this.D[8] = 0.00394;\n this.D[9] = -0.0013;\n}\n\n/**\n New Zealand Map Grid Forward - long/lat to x/y\n long/lat in radians\n */\nexport function forward(p) {\n var n;\n var lon = p.x;\n var lat = p.y;\n\n var delta_lat = lat - this.lat0;\n var delta_lon = lon - this.long0;\n\n // 1. Calculate d_phi and d_psi ... // and d_lambda\n // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians.\n var d_phi = delta_lat / SEC_TO_RAD * 1E-5;\n var d_lambda = delta_lon;\n var d_phi_n = 1; // d_phi^0\n\n var d_psi = 0;\n for (n = 1; n <= 10; n++) {\n d_phi_n = d_phi_n * d_phi;\n d_psi = d_psi + this.A[n] * d_phi_n;\n }\n\n // 2. Calculate theta\n var th_re = d_psi;\n var th_im = d_lambda;\n\n // 3. Calculate z\n var th_n_re = 1;\n var th_n_im = 0; // theta^0\n var th_n_re1;\n var th_n_im1;\n\n var z_re = 0;\n var z_im = 0;\n for (n = 1; n <= 6; n++) {\n th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n th_n_re = th_n_re1;\n th_n_im = th_n_im1;\n z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im;\n z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im;\n }\n\n // 4. Calculate easting and northing\n p.x = (z_im * this.a) + this.x0;\n p.y = (z_re * this.a) + this.y0;\n\n return p;\n}\n\n/**\n New Zealand Map Grid Inverse - x/y to long/lat\n */\nexport function inverse(p) {\n var n;\n var x = p.x;\n var y = p.y;\n\n var delta_x = x - this.x0;\n var delta_y = y - this.y0;\n\n // 1. Calculate z\n var z_re = delta_y / this.a;\n var z_im = delta_x / this.a;\n\n // 2a. Calculate theta - first approximation gives km accuracy\n var z_n_re = 1;\n var z_n_im = 0; // z^0\n var z_n_re1;\n var z_n_im1;\n\n var th_re = 0;\n var th_im = 0;\n for (n = 1; n <= 6; n++) {\n z_n_re1 = z_n_re * z_re - z_n_im * z_im;\n z_n_im1 = z_n_im * z_re + z_n_re * z_im;\n z_n_re = z_n_re1;\n z_n_im = z_n_im1;\n th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im;\n th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im;\n }\n\n // 2b. Iterate to refine the accuracy of the calculation\n // 0 iterations gives km accuracy\n // 1 iteration gives m accuracy -- good enough for most mapping applications\n // 2 iterations bives mm accuracy\n for (var i = 0; i < this.iterations; i++) {\n var th_n_re = th_re;\n var th_n_im = th_im;\n var th_n_re1;\n var th_n_im1;\n\n var num_re = z_re;\n var num_im = z_im;\n for (n = 2; n <= 6; n++) {\n th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n th_n_re = th_n_re1;\n th_n_im = th_n_im1;\n num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n }\n\n th_n_re = 1;\n th_n_im = 0;\n var den_re = this.B_re[1];\n var den_im = this.B_im[1];\n for (n = 2; n <= 6; n++) {\n th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n th_n_re = th_n_re1;\n th_n_im = th_n_im1;\n den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n }\n\n // Complex division\n var den2 = den_re * den_re + den_im * den_im;\n th_re = (num_re * den_re + num_im * den_im) / den2;\n th_im = (num_im * den_re - num_re * den_im) / den2;\n }\n\n // 3. Calculate d_phi ... // and d_lambda\n var d_psi = th_re;\n var d_lambda = th_im;\n var d_psi_n = 1; // d_psi^0\n\n var d_phi = 0;\n for (n = 1; n <= 9; n++) {\n d_psi_n = d_psi_n * d_psi;\n d_phi = d_phi + this.D[n] * d_psi_n;\n }\n\n // 4. Calculate latitude and longitude\n // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians.\n var lat = this.lat0 + (d_phi * SEC_TO_RAD * 1E5);\n var lon = this.long0 + d_lambda;\n\n p.x = lon;\n p.y = lat;\n\n return p;\n}\n\nexport var names = [\"New_Zealand_Map_Grid\", \"nzmg\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\n\n/*\n reference\n \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n */\n\n\n/* Initialize the Miller Cylindrical projection\n -------------------------------------------*/\nexport function init() {\n //no-op\n}\n\n/* Miller Cylindrical forward equations--mapping lat,long to x,y\n ------------------------------------------------------------*/\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n /* Forward equations\n -----------------*/\n var dlon = adjust_lon(lon - this.long0);\n var x = this.x0 + this.a * dlon;\n var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25;\n\n p.x = x;\n p.y = y;\n return p;\n}\n\n/* Miller Cylindrical inverse equations--mapping x,y to lat/long\n ------------------------------------------------------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n\n var lon = adjust_lon(this.long0 + p.x / this.a);\n var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4);\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Miller_Cylindrical\", \"mill\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\nimport pj_enfn from '../common/pj_enfn';\nvar MAX_ITER = 20;\nimport pj_mlfn from '../common/pj_mlfn';\nimport pj_inv_mlfn from '../common/pj_inv_mlfn';\nimport {EPSLN, HALF_PI} from '../constants/values';\n\nimport asinz from '../common/asinz';\n\n\nexport function init() {\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n\n\n if (!this.sphere) {\n this.en = pj_enfn(this.es);\n }\n else {\n this.n = 1;\n this.m = 0;\n this.es = 0;\n this.C_y = Math.sqrt((this.m + 1) / this.n);\n this.C_x = this.C_y / (this.m + 1);\n }\n\n}\n\n/* Sinusoidal forward equations--mapping lat,long to x,y\n -----------------------------------------------------*/\nexport function forward(p) {\n var x, y;\n var lon = p.x;\n var lat = p.y;\n /* Forward equations\n -----------------*/\n lon = adjust_lon(lon - this.long0);\n\n if (this.sphere) {\n if (!this.m) {\n lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat;\n }\n else {\n var k = this.n * Math.sin(lat);\n for (var i = MAX_ITER; i; --i) {\n var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat));\n lat -= V;\n if (Math.abs(V) < EPSLN) {\n break;\n }\n }\n }\n x = this.a * this.C_x * lon * (this.m + Math.cos(lat));\n y = this.a * this.C_y * lat;\n\n }\n else {\n\n var s = Math.sin(lat);\n var c = Math.cos(lat);\n y = this.a * pj_mlfn(lat, s, c, this.en);\n x = this.a * lon * c / Math.sqrt(1 - this.es * s * s);\n }\n\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var lat, temp, lon, s;\n\n p.x -= this.x0;\n lon = p.x / this.a;\n p.y -= this.y0;\n lat = p.y / this.a;\n\n if (this.sphere) {\n lat /= this.C_y;\n lon = lon / (this.C_x * (this.m + Math.cos(lat)));\n if (this.m) {\n lat = asinz((this.m * lat + Math.sin(lat)) / this.n);\n }\n else if (this.n !== 1) {\n lat = asinz(Math.sin(lat) / this.n);\n }\n lon = adjust_lon(lon + this.long0);\n lat = adjust_lat(lat);\n }\n else {\n lat = pj_inv_mlfn(p.y / this.a, this.es, this.en);\n s = Math.abs(lat);\n if (s < HALF_PI) {\n s = Math.sin(lat);\n temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat));\n //temp = this.long0 + p.x / (this.a * Math.cos(lat));\n lon = adjust_lon(temp);\n }\n else if ((s - EPSLN) < HALF_PI) {\n lon = this.long0;\n }\n }\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Sinusoidal\", \"sinu\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nexport function init() {}\nimport {EPSLN} from '../constants/values';\n/* Mollweide forward equations--mapping lat,long to x,y\n ----------------------------------------------------*/\nexport function forward(p) {\n\n /* Forward equations\n -----------------*/\n var lon = p.x;\n var lat = p.y;\n\n var delta_lon = adjust_lon(lon - this.long0);\n var theta = lat;\n var con = Math.PI * Math.sin(lat);\n\n /* Iterate using the Newton-Raphson method to find theta\n -----------------------------------------------------*/\n while (true) {\n var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta));\n theta += delta_theta;\n if (Math.abs(delta_theta) < EPSLN) {\n break;\n }\n }\n theta /= 2;\n\n /* If the latitude is 90 deg, force the x coordinate to be \"0 + false easting\"\n this is done here because of precision problems with \"cos(theta)\"\n --------------------------------------------------------------------------*/\n if (Math.PI / 2 - Math.abs(lat) < EPSLN) {\n delta_lon = 0;\n }\n var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;\n var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;\n\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var theta;\n var arg;\n\n /* Inverse equations\n -----------------*/\n p.x -= this.x0;\n p.y -= this.y0;\n arg = p.y / (1.4142135623731 * this.a);\n\n /* Because of division by zero problems, 'arg' can not be 1. Therefore\n a number very close to one is used instead.\n -------------------------------------------------------------------*/\n if (Math.abs(arg) > 0.999999999999) {\n arg = 0.999999999999;\n }\n theta = Math.asin(arg);\n var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta))));\n if (lon < (-Math.PI)) {\n lon = -Math.PI;\n }\n if (lon > Math.PI) {\n lon = Math.PI;\n }\n arg = (2 * theta + Math.sin(2 * theta)) / Math.PI;\n if (Math.abs(arg) > 1) {\n arg = 1;\n }\n var lat = Math.asin(arg);\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Mollweide\", \"moll\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import e0fn from '../common/e0fn';\nimport e1fn from '../common/e1fn';\nimport e2fn from '../common/e2fn';\nimport e3fn from '../common/e3fn';\nimport msfnz from '../common/msfnz';\nimport mlfn from '../common/mlfn';\nimport adjust_lon from '../common/adjust_lon';\nimport adjust_lat from '../common/adjust_lat';\nimport imlfn from '../common/imlfn';\nimport {EPSLN} from '../constants/values';\n\nexport function init() {\n\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n // Standard Parallels cannot be equal and on opposite sides of the equator\n if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n return;\n }\n this.lat2 = this.lat2 || this.lat1;\n this.temp = this.b / this.a;\n this.es = 1 - Math.pow(this.temp, 2);\n this.e = Math.sqrt(this.es);\n this.e0 = e0fn(this.es);\n this.e1 = e1fn(this.es);\n this.e2 = e2fn(this.es);\n this.e3 = e3fn(this.es);\n\n this.sinphi = Math.sin(this.lat1);\n this.cosphi = Math.cos(this.lat1);\n\n this.ms1 = msfnz(this.e, this.sinphi, this.cosphi);\n this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1);\n\n if (Math.abs(this.lat1 - this.lat2) < EPSLN) {\n this.ns = this.sinphi;\n }\n else {\n this.sinphi = Math.sin(this.lat2);\n this.cosphi = Math.cos(this.lat2);\n this.ms2 = msfnz(this.e, this.sinphi, this.cosphi);\n this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);\n this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);\n }\n this.g = this.ml1 + this.ms1 / this.ns;\n this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n this.rh = this.a * (this.g - this.ml0);\n}\n\n/* Equidistant Conic forward equations--mapping lat,long to x,y\n -----------------------------------------------------------*/\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var rh1;\n\n /* Forward equations\n -----------------*/\n if (this.sphere) {\n rh1 = this.a * (this.g - lat);\n }\n else {\n var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat);\n rh1 = this.a * (this.g - ml);\n }\n var theta = this.ns * adjust_lon(lon - this.long0);\n var x = this.x0 + rh1 * Math.sin(theta);\n var y = this.y0 + this.rh - rh1 * Math.cos(theta);\n p.x = x;\n p.y = y;\n return p;\n}\n\n/* Inverse equations\n -----------------*/\nexport function inverse(p) {\n p.x -= this.x0;\n p.y = this.rh - p.y + this.y0;\n var con, rh1, lat, lon;\n if (this.ns >= 0) {\n rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n con = 1;\n }\n else {\n rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n con = -1;\n }\n var theta = 0;\n if (rh1 !== 0) {\n theta = Math.atan2(con * p.x, con * p.y);\n }\n\n if (this.sphere) {\n lon = adjust_lon(this.long0 + theta / this.ns);\n lat = adjust_lat(this.g - rh1 / this.a);\n p.x = lon;\n p.y = lat;\n return p;\n }\n else {\n var ml = this.g - rh1 / this.a;\n lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3);\n lon = adjust_lon(this.long0 + theta / this.ns);\n p.x = lon;\n p.y = lat;\n return p;\n }\n\n}\n\nexport var names = [\"Equidistant_Conic\", \"eqdc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\n\nimport {HALF_PI, EPSLN} from '../constants/values';\n\nimport asinz from '../common/asinz';\n\n/* Initialize the Van Der Grinten projection\n ----------------------------------------*/\nexport function init() {\n //this.R = 6370997; //Radius of earth\n this.R = this.a;\n}\n\nexport function forward(p) {\n\n var lon = p.x;\n var lat = p.y;\n\n /* Forward equations\n -----------------*/\n var dlon = adjust_lon(lon - this.long0);\n var x, y;\n\n if (Math.abs(lat) <= EPSLN) {\n x = this.x0 + this.R * dlon;\n y = this.y0;\n }\n var theta = asinz(2 * Math.abs(lat / Math.PI));\n if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) {\n x = this.x0;\n if (lat >= 0) {\n y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta);\n }\n else {\n y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta);\n }\n // return(OK);\n }\n var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI));\n var asq = al * al;\n var sinth = Math.sin(theta);\n var costh = Math.cos(theta);\n\n var g = costh / (sinth + costh - 1);\n var gsq = g * g;\n var m = g * (2 / sinth - 1);\n var msq = m * m;\n var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);\n if (dlon < 0) {\n con = -con;\n }\n x = this.x0 + con;\n //con = Math.abs(con / (Math.PI * this.R));\n var q = asq + g;\n con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq);\n if (lat >= 0) {\n //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n y = this.y0 + con;\n }\n else {\n //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n y = this.y0 - con;\n }\n p.x = x;\n p.y = y;\n return p;\n}\n\n/* Van Der Grinten inverse equations--mapping x,y to lat/long\n ---------------------------------------------------------*/\nexport function inverse(p) {\n var lon, lat;\n var xx, yy, xys, c1, c2, c3;\n var a1;\n var m1;\n var con;\n var th1;\n var d;\n\n /* inverse equations\n -----------------*/\n p.x -= this.x0;\n p.y -= this.y0;\n con = Math.PI * this.R;\n xx = p.x / con;\n yy = p.y / con;\n xys = xx * xx + yy * yy;\n c1 = -Math.abs(yy) * (1 + xys);\n c2 = c1 - 2 * yy * yy + xx * xx;\n c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys;\n d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27;\n a1 = (c1 - c2 * c2 / 3 / c3) / c3;\n m1 = 2 * Math.sqrt(-a1 / 3);\n con = ((3 * d) / a1) / m1;\n if (Math.abs(con) > 1) {\n if (con >= 0) {\n con = 1;\n }\n else {\n con = -1;\n }\n }\n th1 = Math.acos(con) / 3;\n if (p.y >= 0) {\n lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n }\n else {\n lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n }\n\n if (Math.abs(xx) < EPSLN) {\n lon = this.long0;\n }\n else {\n lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx);\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"Van_der_Grinten_I\", \"VanDerGrinten\", \"vandg\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nimport {HALF_PI, EPSLN} from '../constants/values';\n\nimport mlfn from '../common/mlfn';\nimport e0fn from '../common/e0fn';\nimport e1fn from '../common/e1fn';\nimport e2fn from '../common/e2fn';\nimport e3fn from '../common/e3fn';\nimport gN from '../common/gN';\nimport asinz from '../common/asinz';\nimport imlfn from '../common/imlfn';\n\n\n\nexport function init() {\n this.sin_p12 = Math.sin(this.lat0);\n this.cos_p12 = Math.cos(this.lat0);\n}\n\nexport function forward(p) {\n var lon = p.x;\n var lat = p.y;\n var sinphi = Math.sin(p.y);\n var cosphi = Math.cos(p.y);\n var dlon = adjust_lon(lon - this.long0);\n var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5;\n if (this.sphere) {\n if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n //North Pole case\n p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon);\n p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon);\n return p;\n }\n else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n //South Pole case\n p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon);\n p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon);\n return p;\n }\n else {\n //default case\n cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon);\n c = Math.acos(cos_c);\n kp = c ? c / Math.sin(c) : 1;\n p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon);\n p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon));\n return p;\n }\n }\n else {\n e0 = e0fn(this.es);\n e1 = e1fn(this.es);\n e2 = e2fn(this.es);\n e3 = e3fn(this.es);\n if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n //North Pole case\n Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon);\n p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon);\n return p;\n }\n else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n //South Pole case\n Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon);\n p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon);\n return p;\n }\n else {\n //Default case\n tanphi = sinphi / cosphi;\n Nl1 = gN(this.a, this.e, this.sin_p12);\n Nl = gN(this.a, this.e, sinphi);\n psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi));\n Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon));\n if (Az === 0) {\n s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));\n }\n else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) {\n s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi));\n }\n else {\n s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az));\n }\n G = this.e * this.sin_p12 / Math.sqrt(1 - this.es);\n H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es);\n GH = G * H;\n Hs = H * H;\n s2 = s * s;\n s3 = s2 * s;\n s4 = s3 * s;\n s5 = s4 * s;\n c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH);\n p.x = this.x0 + c * Math.sin(Az);\n p.y = this.y0 + c * Math.cos(Az);\n return p;\n }\n }\n\n\n}\n\nexport function inverse(p) {\n p.x -= this.x0;\n p.y -= this.y0;\n var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F, sinpsi;\n if (this.sphere) {\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n if (rh > (2 * HALF_PI * this.a)) {\n return;\n }\n z = rh / this.a;\n\n sinz = Math.sin(z);\n cosz = Math.cos(z);\n\n lon = this.long0;\n if (Math.abs(rh) <= EPSLN) {\n lat = this.lat0;\n }\n else {\n lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh);\n con = Math.abs(this.lat0) - HALF_PI;\n if (Math.abs(con) <= EPSLN) {\n if (this.lat0 >= 0) {\n lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));\n }\n else {\n lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));\n }\n }\n else {\n /*con = cosz - this.sin_p12 * Math.sin(lat);\n if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) {\n //no-op, just keep the lon value as is\n } else {\n var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh));\n lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh)));\n }*/\n lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz));\n }\n }\n\n p.x = lon;\n p.y = lat;\n return p;\n }\n else {\n e0 = e0fn(this.es);\n e1 = e1fn(this.es);\n e2 = e2fn(this.es);\n e3 = e3fn(this.es);\n if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n //North pole case\n Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n M = Mlp - rh;\n lat = imlfn(M / this.a, e0, e1, e2, e3);\n lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y));\n p.x = lon;\n p.y = lat;\n return p;\n }\n else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n //South pole case\n Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n M = rh - Mlp;\n\n lat = imlfn(M / this.a, e0, e1, e2, e3);\n lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y));\n p.x = lon;\n p.y = lat;\n return p;\n }\n else {\n //default case\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n Az = Math.atan2(p.x, p.y);\n N1 = gN(this.a, this.e, this.sin_p12);\n cosAz = Math.cos(Az);\n tmp = this.e * this.cos_p12 * cosAz;\n A = -tmp * tmp / (1 - this.es);\n B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es);\n D = rh / N1;\n Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24;\n F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6;\n psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz);\n lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi)));\n sinpsi = Math.sin(psi);\n lat = Math.atan2((sinpsi - this.es * F * this.sin_p12) * Math.tan(psi), sinpsi * (1 - this.es));\n p.x = lon;\n p.y = lat;\n return p;\n }\n }\n\n}\n\nexport var names = [\"Azimuthal_Equidistant\", \"aeqd\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import adjust_lon from '../common/adjust_lon';\nimport asinz from '../common/asinz';\nimport {EPSLN, HALF_PI} from '../constants/values';\n\nexport function init() {\n //double temp; /* temporary variable */\n\n /* Place parameters in static storage for common use\n -------------------------------------------------*/\n this.sin_p14 = Math.sin(this.lat0);\n this.cos_p14 = Math.cos(this.lat0);\n}\n\n/* Orthographic forward equations--mapping lat,long to x,y\n ---------------------------------------------------*/\nexport function forward(p) {\n var sinphi, cosphi; /* sin and cos value */\n var dlon; /* delta longitude value */\n var coslon; /* cos of longitude */\n var ksp; /* scale factor */\n var g, x, y;\n var lon = p.x;\n var lat = p.y;\n /* Forward equations\n -----------------*/\n dlon = adjust_lon(lon - this.long0);\n\n sinphi = Math.sin(lat);\n cosphi = Math.cos(lat);\n\n coslon = Math.cos(dlon);\n g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n ksp = 1;\n if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n x = this.a * ksp * cosphi * Math.sin(dlon);\n y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n }\n p.x = x;\n p.y = y;\n return p;\n}\n\nexport function inverse(p) {\n var rh; /* height above ellipsoid */\n var z; /* angle */\n var sinz, cosz; /* sin of z and cos of z */\n var con;\n var lon, lat;\n /* Inverse equations\n -----------------*/\n p.x -= this.x0;\n p.y -= this.y0;\n rh = Math.sqrt(p.x * p.x + p.y * p.y);\n z = asinz(rh / this.a);\n\n sinz = Math.sin(z);\n cosz = Math.cos(z);\n\n lon = this.long0;\n if (Math.abs(rh) <= EPSLN) {\n lat = this.lat0;\n p.x = lon;\n p.y = lat;\n return p;\n }\n lat = asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14) / rh);\n con = Math.abs(this.lat0) - HALF_PI;\n if (Math.abs(con) <= EPSLN) {\n if (this.lat0 >= 0) {\n lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y));\n }\n else {\n lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y));\n }\n p.x = lon;\n p.y = lat;\n return p;\n }\n lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz), rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz));\n p.x = lon;\n p.y = lat;\n return p;\n}\n\nexport var names = [\"ortho\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","// QSC projection rewritten from the original PROJ4\n// https://github.com/OSGeo/proj.4/blob/master/src/PJ_qsc.c\n\nimport {EPSLN, TWO_PI, SPI, HALF_PI, FORTPI} from '../constants/values';\n\n/* constants */\nvar FACE_ENUM = {\n FRONT: 1,\n RIGHT: 2,\n BACK: 3,\n LEFT: 4,\n TOP: 5,\n BOTTOM: 6\n};\n\nvar AREA_ENUM = {\n AREA_0: 1,\n AREA_1: 2,\n AREA_2: 3,\n AREA_3: 4\n};\n\nexport function init() {\n\n this.x0 = this.x0 || 0;\n this.y0 = this.y0 || 0;\n this.lat0 = this.lat0 || 0;\n this.long0 = this.long0 || 0;\n this.lat_ts = this.lat_ts || 0;\n this.title = this.title || \"Quadrilateralized Spherical Cube\";\n\n /* Determine the cube face from the center of projection. */\n if (this.lat0 >= HALF_PI - FORTPI / 2.0) {\n this.face = FACE_ENUM.TOP;\n } else if (this.lat0 <= -(HALF_PI - FORTPI / 2.0)) {\n this.face = FACE_ENUM.BOTTOM;\n } else if (Math.abs(this.long0) <= FORTPI) {\n this.face = FACE_ENUM.FRONT;\n } else if (Math.abs(this.long0) <= HALF_PI + FORTPI) {\n this.face = this.long0 > 0.0 ? FACE_ENUM.RIGHT : FACE_ENUM.LEFT;\n } else {\n this.face = FACE_ENUM.BACK;\n }\n\n /* Fill in useful values for the ellipsoid <-> sphere shift\n * described in [LK12]. */\n if (this.es !== 0) {\n this.one_minus_f = 1 - (this.a - this.b) / this.a;\n this.one_minus_f_squared = this.one_minus_f * this.one_minus_f;\n }\n}\n\n// QSC forward equations--mapping lat,long to x,y\n// -----------------------------------------------------------------\nexport function forward(p) {\n var xy = {x: 0, y: 0};\n var lat, lon;\n var theta, phi;\n var t, mu;\n /* nu; */\n var area = {value: 0};\n\n // move lon according to projection's lon\n p.x -= this.long0;\n\n /* Convert the geodetic latitude to a geocentric latitude.\n * This corresponds to the shift from the ellipsoid to the sphere\n * described in [LK12]. */\n if (this.es !== 0) {//if (P->es != 0) {\n lat = Math.atan(this.one_minus_f_squared * Math.tan(p.y));\n } else {\n lat = p.y;\n }\n\n /* Convert the input lat, lon into theta, phi as used by QSC.\n * This depends on the cube face and the area on it.\n * For the top and bottom face, we can compute theta and phi\n * directly from phi, lam. For the other faces, we must use\n * unit sphere cartesian coordinates as an intermediate step. */\n lon = p.x; //lon = lp.lam;\n if (this.face === FACE_ENUM.TOP) {\n phi = HALF_PI - lat;\n if (lon >= FORTPI && lon <= HALF_PI + FORTPI) {\n area.value = AREA_ENUM.AREA_0;\n theta = lon - HALF_PI;\n } else if (lon > HALF_PI + FORTPI || lon <= -(HALF_PI + FORTPI)) {\n area.value = AREA_ENUM.AREA_1;\n theta = (lon > 0.0 ? lon - SPI : lon + SPI);\n } else if (lon > -(HALF_PI + FORTPI) && lon <= -FORTPI) {\n area.value = AREA_ENUM.AREA_2;\n theta = lon + HALF_PI;\n } else {\n area.value = AREA_ENUM.AREA_3;\n theta = lon;\n }\n } else if (this.face === FACE_ENUM.BOTTOM) {\n phi = HALF_PI + lat;\n if (lon >= FORTPI && lon <= HALF_PI + FORTPI) {\n area.value = AREA_ENUM.AREA_0;\n theta = -lon + HALF_PI;\n } else if (lon < FORTPI && lon >= -FORTPI) {\n area.value = AREA_ENUM.AREA_1;\n theta = -lon;\n } else if (lon < -FORTPI && lon >= -(HALF_PI + FORTPI)) {\n area.value = AREA_ENUM.AREA_2;\n theta = -lon - HALF_PI;\n } else {\n area.value = AREA_ENUM.AREA_3;\n theta = (lon > 0.0 ? -lon + SPI : -lon - SPI);\n }\n } else {\n var q, r, s;\n var sinlat, coslat;\n var sinlon, coslon;\n\n if (this.face === FACE_ENUM.RIGHT) {\n lon = qsc_shift_lon_origin(lon, +HALF_PI);\n } else if (this.face === FACE_ENUM.BACK) {\n lon = qsc_shift_lon_origin(lon, +SPI);\n } else if (this.face === FACE_ENUM.LEFT) {\n lon = qsc_shift_lon_origin(lon, -HALF_PI);\n }\n sinlat = Math.sin(lat);\n coslat = Math.cos(lat);\n sinlon = Math.sin(lon);\n coslon = Math.cos(lon);\n q = coslat * coslon;\n r = coslat * sinlon;\n s = sinlat;\n\n if (this.face === FACE_ENUM.FRONT) {\n phi = Math.acos(q);\n theta = qsc_fwd_equat_face_theta(phi, s, r, area);\n } else if (this.face === FACE_ENUM.RIGHT) {\n phi = Math.acos(r);\n theta = qsc_fwd_equat_face_theta(phi, s, -q, area);\n } else if (this.face === FACE_ENUM.BACK) {\n phi = Math.acos(-q);\n theta = qsc_fwd_equat_face_theta(phi, s, -r, area);\n } else if (this.face === FACE_ENUM.LEFT) {\n phi = Math.acos(-r);\n theta = qsc_fwd_equat_face_theta(phi, s, q, area);\n } else {\n /* Impossible */\n phi = theta = 0;\n area.value = AREA_ENUM.AREA_0;\n }\n }\n\n /* Compute mu and nu for the area of definition.\n * For mu, see Eq. (3-21) in [OL76], but note the typos:\n * compare with Eq. (3-14). For nu, see Eq. (3-38). */\n mu = Math.atan((12 / SPI) * (theta + Math.acos(Math.sin(theta) * Math.cos(FORTPI)) - HALF_PI));\n t = Math.sqrt((1 - Math.cos(phi)) / (Math.cos(mu) * Math.cos(mu)) / (1 - Math.cos(Math.atan(1 / Math.cos(theta)))));\n\n /* Apply the result to the real area. */\n if (area.value === AREA_ENUM.AREA_1) {\n mu += HALF_PI;\n } else if (area.value === AREA_ENUM.AREA_2) {\n mu += SPI;\n } else if (area.value === AREA_ENUM.AREA_3) {\n mu += 1.5 * SPI;\n }\n\n /* Now compute x, y from mu and nu */\n xy.x = t * Math.cos(mu);\n xy.y = t * Math.sin(mu);\n xy.x = xy.x * this.a + this.x0;\n xy.y = xy.y * this.a + this.y0;\n\n p.x = xy.x;\n p.y = xy.y;\n return p;\n}\n\n// QSC inverse equations--mapping x,y to lat/long\n// -----------------------------------------------------------------\nexport function inverse(p) {\n var lp = {lam: 0, phi: 0};\n var mu, nu, cosmu, tannu;\n var tantheta, theta, cosphi, phi;\n var t;\n var area = {value: 0};\n\n /* de-offset */\n p.x = (p.x - this.x0) / this.a;\n p.y = (p.y - this.y0) / this.a;\n\n /* Convert the input x, y to the mu and nu angles as used by QSC.\n * This depends on the area of the cube face. */\n nu = Math.atan(Math.sqrt(p.x * p.x + p.y * p.y));\n mu = Math.atan2(p.y, p.x);\n if (p.x >= 0.0 && p.x >= Math.abs(p.y)) {\n area.value = AREA_ENUM.AREA_0;\n } else if (p.y >= 0.0 && p.y >= Math.abs(p.x)) {\n area.value = AREA_ENUM.AREA_1;\n mu -= HALF_PI;\n } else if (p.x < 0.0 && -p.x >= Math.abs(p.y)) {\n area.value = AREA_ENUM.AREA_2;\n mu = (mu < 0.0 ? mu + SPI : mu - SPI);\n } else {\n area.value = AREA_ENUM.AREA_3;\n mu += HALF_PI;\n }\n\n /* Compute phi and theta for the area of definition.\n * The inverse projection is not described in the original paper, but some\n * good hints can be found here (as of 2011-12-14):\n * http://fits.gsfc.nasa.gov/fitsbits/saf.93/saf.9302\n * (search for \"Message-Id: <9302181759.AA25477 at fits.cv.nrao.edu>\") */\n t = (SPI / 12) * Math.tan(mu);\n tantheta = Math.sin(t) / (Math.cos(t) - (1 / Math.sqrt(2)));\n theta = Math.atan(tantheta);\n cosmu = Math.cos(mu);\n tannu = Math.tan(nu);\n cosphi = 1 - cosmu * cosmu * tannu * tannu * (1 - Math.cos(Math.atan(1 / Math.cos(theta))));\n if (cosphi < -1) {\n cosphi = -1;\n } else if (cosphi > +1) {\n cosphi = +1;\n }\n\n /* Apply the result to the real area on the cube face.\n * For the top and bottom face, we can compute phi and lam directly.\n * For the other faces, we must use unit sphere cartesian coordinates\n * as an intermediate step. */\n if (this.face === FACE_ENUM.TOP) {\n phi = Math.acos(cosphi);\n lp.phi = HALF_PI - phi;\n if (area.value === AREA_ENUM.AREA_0) {\n lp.lam = theta + HALF_PI;\n } else if (area.value === AREA_ENUM.AREA_1) {\n lp.lam = (theta < 0.0 ? theta + SPI : theta - SPI);\n } else if (area.value === AREA_ENUM.AREA_2) {\n lp.lam = theta - HALF_PI;\n } else /* area.value == AREA_ENUM.AREA_3 */ {\n lp.lam = theta;\n }\n } else if (this.face === FACE_ENUM.BOTTOM) {\n phi = Math.acos(cosphi);\n lp.phi = phi - HALF_PI;\n if (area.value === AREA_ENUM.AREA_0) {\n lp.lam = -theta + HALF_PI;\n } else if (area.value === AREA_ENUM.AREA_1) {\n lp.lam = -theta;\n } else if (area.value === AREA_ENUM.AREA_2) {\n lp.lam = -theta - HALF_PI;\n } else /* area.value == AREA_ENUM.AREA_3 */ {\n lp.lam = (theta < 0.0 ? -theta - SPI : -theta + SPI);\n }\n } else {\n /* Compute phi and lam via cartesian unit sphere coordinates. */\n var q, r, s;\n q = cosphi;\n t = q * q;\n if (t >= 1) {\n s = 0;\n } else {\n s = Math.sqrt(1 - t) * Math.sin(theta);\n }\n t += s * s;\n if (t >= 1) {\n r = 0;\n } else {\n r = Math.sqrt(1 - t);\n }\n /* Rotate q,r,s into the correct area. */\n if (area.value === AREA_ENUM.AREA_1) {\n t = r;\n r = -s;\n s = t;\n } else if (area.value === AREA_ENUM.AREA_2) {\n r = -r;\n s = -s;\n } else if (area.value === AREA_ENUM.AREA_3) {\n t = r;\n r = s;\n s = -t;\n }\n /* Rotate q,r,s into the correct cube face. */\n if (this.face === FACE_ENUM.RIGHT) {\n t = q;\n q = -r;\n r = t;\n } else if (this.face === FACE_ENUM.BACK) {\n q = -q;\n r = -r;\n } else if (this.face === FACE_ENUM.LEFT) {\n t = q;\n q = r;\n r = -t;\n }\n /* Now compute phi and lam from the unit sphere coordinates. */\n lp.phi = Math.acos(-s) - HALF_PI;\n lp.lam = Math.atan2(r, q);\n if (this.face === FACE_ENUM.RIGHT) {\n lp.lam = qsc_shift_lon_origin(lp.lam, -HALF_PI);\n } else if (this.face === FACE_ENUM.BACK) {\n lp.lam = qsc_shift_lon_origin(lp.lam, -SPI);\n } else if (this.face === FACE_ENUM.LEFT) {\n lp.lam = qsc_shift_lon_origin(lp.lam, +HALF_PI);\n }\n }\n\n /* Apply the shift from the sphere to the ellipsoid as described\n * in [LK12]. */\n if (this.es !== 0) {\n var invert_sign;\n var tanphi, xa;\n invert_sign = (lp.phi < 0 ? 1 : 0);\n tanphi = Math.tan(lp.phi);\n xa = this.b / Math.sqrt(tanphi * tanphi + this.one_minus_f_squared);\n lp.phi = Math.atan(Math.sqrt(this.a * this.a - xa * xa) / (this.one_minus_f * xa));\n if (invert_sign) {\n lp.phi = -lp.phi;\n }\n }\n\n lp.lam += this.long0;\n p.x = lp.lam;\n p.y = lp.phi;\n return p;\n}\n\n/* Helper function for forward projection: compute the theta angle\n * and determine the area number. */\nfunction qsc_fwd_equat_face_theta(phi, y, x, area) {\n var theta;\n if (phi < EPSLN) {\n area.value = AREA_ENUM.AREA_0;\n theta = 0.0;\n } else {\n theta = Math.atan2(y, x);\n if (Math.abs(theta) <= FORTPI) {\n area.value = AREA_ENUM.AREA_0;\n } else if (theta > FORTPI && theta <= HALF_PI + FORTPI) {\n area.value = AREA_ENUM.AREA_1;\n theta -= HALF_PI;\n } else if (theta > HALF_PI + FORTPI || theta <= -(HALF_PI + FORTPI)) {\n area.value = AREA_ENUM.AREA_2;\n theta = (theta >= 0.0 ? theta - SPI : theta + SPI);\n } else {\n area.value = AREA_ENUM.AREA_3;\n theta += HALF_PI;\n }\n }\n return theta;\n}\n\n/* Helper function: shift the longitude. */\nfunction qsc_shift_lon_origin(lon, offset) {\n var slon = lon + offset;\n if (slon < -SPI) {\n slon += TWO_PI;\n } else if (slon > +SPI) {\n slon -= TWO_PI;\n }\n return slon;\n}\n\nexport var names = [\"Quadrilateralized Spherical Cube\", \"Quadrilateralized_Spherical_Cube\", \"qsc\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n\n","// Robinson projection\n// Based on https://github.com/OSGeo/proj.4/blob/master/src/PJ_robin.c\n// Polynomial coeficients from http://article.gmane.org/gmane.comp.gis.proj-4.devel/6039\n\nimport {HALF_PI, D2R, R2D, EPSLN} from '../constants/values';\nimport adjust_lon from '../common/adjust_lon';\n\nvar COEFS_X = [\n [1.0000, 2.2199e-17, -7.15515e-05, 3.1103e-06],\n [0.9986, -0.000482243, -2.4897e-05, -1.3309e-06],\n [0.9954, -0.00083103, -4.48605e-05, -9.86701e-07],\n [0.9900, -0.00135364, -5.9661e-05, 3.6777e-06],\n [0.9822, -0.00167442, -4.49547e-06, -5.72411e-06],\n [0.9730, -0.00214868, -9.03571e-05, 1.8736e-08],\n [0.9600, -0.00305085, -9.00761e-05, 1.64917e-06],\n [0.9427, -0.00382792, -6.53386e-05, -2.6154e-06],\n [0.9216, -0.00467746, -0.00010457, 4.81243e-06],\n [0.8962, -0.00536223, -3.23831e-05, -5.43432e-06],\n [0.8679, -0.00609363, -0.000113898, 3.32484e-06],\n [0.8350, -0.00698325, -6.40253e-05, 9.34959e-07],\n [0.7986, -0.00755338, -5.00009e-05, 9.35324e-07],\n [0.7597, -0.00798324, -3.5971e-05, -2.27626e-06],\n [0.7186, -0.00851367, -7.01149e-05, -8.6303e-06],\n [0.6732, -0.00986209, -0.000199569, 1.91974e-05],\n [0.6213, -0.010418, 8.83923e-05, 6.24051e-06],\n [0.5722, -0.00906601, 0.000182, 6.24051e-06],\n [0.5322, -0.00677797, 0.000275608, 6.24051e-06]\n];\n\nvar COEFS_Y = [\n [-5.20417e-18, 0.0124, 1.21431e-18, -8.45284e-11],\n [0.0620, 0.0124, -1.26793e-09, 4.22642e-10],\n [0.1240, 0.0124, 5.07171e-09, -1.60604e-09],\n [0.1860, 0.0123999, -1.90189e-08, 6.00152e-09],\n [0.2480, 0.0124002, 7.10039e-08, -2.24e-08],\n [0.3100, 0.0123992, -2.64997e-07, 8.35986e-08],\n [0.3720, 0.0124029, 9.88983e-07, -3.11994e-07],\n [0.4340, 0.0123893, -3.69093e-06, -4.35621e-07],\n [0.4958, 0.0123198, -1.02252e-05, -3.45523e-07],\n [0.5571, 0.0121916, -1.54081e-05, -5.82288e-07],\n [0.6176, 0.0119938, -2.41424e-05, -5.25327e-07],\n [0.6769, 0.011713, -3.20223e-05, -5.16405e-07],\n [0.7346, 0.0113541, -3.97684e-05, -6.09052e-07],\n [0.7903, 0.0109107, -4.89042e-05, -1.04739e-06],\n [0.8435, 0.0103431, -6.4615e-05, -1.40374e-09],\n [0.8936, 0.00969686, -6.4636e-05, -8.547e-06],\n [0.9394, 0.00840947, -0.000192841, -4.2106e-06],\n [0.9761, 0.00616527, -0.000256, -4.2106e-06],\n [1.0000, 0.00328947, -0.000319159, -4.2106e-06]\n];\n\nvar FXC = 0.8487;\nvar FYC = 1.3523;\nvar C1 = R2D/5; // rad to 5-degree interval\nvar RC1 = 1/C1;\nvar NODES = 18;\n\nvar poly3_val = function(coefs, x) {\n return coefs[0] + x * (coefs[1] + x * (coefs[2] + x * coefs[3]));\n};\n\nvar poly3_der = function(coefs, x) {\n return coefs[1] + x * (2 * coefs[2] + x * 3 * coefs[3]);\n};\n\nfunction newton_rapshon(f_df, start, max_err, iters) {\n var x = start;\n for (; iters; --iters) {\n var upd = f_df(x);\n x -= upd;\n if (Math.abs(upd) < max_err) {\n break;\n }\n }\n return x;\n}\n\nexport function init() {\n this.x0 = this.x0 || 0;\n this.y0 = this.y0 || 0;\n this.long0 = this.long0 || 0;\n this.es = 0;\n this.title = this.title || \"Robinson\";\n}\n\nexport function forward(ll) {\n var lon = adjust_lon(ll.x - this.long0);\n\n var dphi = Math.abs(ll.y);\n var i = Math.floor(dphi * C1);\n if (i < 0) {\n i = 0;\n } else if (i >= NODES) {\n i = NODES - 1;\n }\n dphi = R2D * (dphi - RC1 * i);\n var xy = {\n x: poly3_val(COEFS_X[i], dphi) * lon,\n y: poly3_val(COEFS_Y[i], dphi)\n };\n if (ll.y < 0) {\n xy.y = -xy.y;\n }\n\n xy.x = xy.x * this.a * FXC + this.x0;\n xy.y = xy.y * this.a * FYC + this.y0;\n return xy;\n}\n\nexport function inverse(xy) {\n var ll = {\n x: (xy.x - this.x0) / (this.a * FXC),\n y: Math.abs(xy.y - this.y0) / (this.a * FYC)\n };\n\n if (ll.y >= 1) { // pathologic case\n ll.x /= COEFS_X[NODES][0];\n ll.y = xy.y < 0 ? -HALF_PI : HALF_PI;\n } else {\n // find table interval\n var i = Math.floor(ll.y * NODES);\n if (i < 0) {\n i = 0;\n } else if (i >= NODES) {\n i = NODES - 1;\n }\n for (;;) {\n if (COEFS_Y[i][0] > ll.y) {\n --i;\n } else if (COEFS_Y[i+1][0] <= ll.y) {\n ++i;\n } else {\n break;\n }\n }\n // linear interpolation in 5 degree interval\n var coefs = COEFS_Y[i];\n var t = 5 * (ll.y - coefs[0]) / (COEFS_Y[i+1][0] - coefs[0]);\n // find t so that poly3_val(coefs, t) = ll.y\n t = newton_rapshon(function(x) {\n return (poly3_val(coefs, x) - ll.y) / poly3_der(coefs, x);\n }, t, EPSLN, 100);\n\n ll.x /= poly3_val(COEFS_X[i], t);\n ll.y = (5 * i + t) * D2R;\n if (xy.y < 0) {\n ll.y = -ll.y;\n }\n }\n\n ll.x = adjust_lon(ll.x + this.long0);\n return ll;\n}\n\nexport var names = [\"Robinson\", \"robin\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import {\n geodeticToGeocentric,\n geocentricToGeodetic\n} from '../datumUtils';\n\nexport function init() {\n this.name = 'geocent';\n\n}\n\nexport function forward(p) {\n var point = geodeticToGeocentric(p, this.es, this.a);\n return point;\n}\n\nexport function inverse(p) {\n var point = geocentricToGeodetic(p, this.es, this.a, this.b);\n return point;\n}\n\nexport var names = [\"Geocentric\", 'geocentric', \"geocent\", \"Geocent\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};","\nvar mode = {\n N_POLE: 0,\n S_POLE: 1,\n EQUIT: 2,\n OBLIQ: 3\n};\n\nimport { D2R, HALF_PI, EPSLN } from \"../constants/values\";\nimport hypot from \"../common/hypot\";\n\nvar params = {\n h: { def: 100000, num: true }, // default is Karman line, no default in PROJ.7\n azi: { def: 0, num: true, degrees: true }, // default is North\n tilt: { def: 0, num: true, degrees: true }, // default is Nadir\n long0: { def: 0, num: true }, // default is Greenwich, conversion to rad is automatic\n lat0: { def: 0, num: true } // default is Equator, conversion to rad is automatic\n};\n\nexport function init() {\n Object.keys(params).forEach(function (p) {\n if (typeof this[p] === \"undefined\") {\n this[p] = params[p].def;\n } else if (params[p].num && isNaN(this[p])) {\n throw new Error(\"Invalid parameter value, must be numeric \" + p + \" = \" + this[p]);\n } else if (params[p].num) {\n this[p] = parseFloat(this[p]);\n }\n if (params[p].degrees) {\n this[p] = this[p] * D2R;\n }\n }.bind(this));\n\n if (Math.abs((Math.abs(this.lat0) - HALF_PI)) < EPSLN) {\n this.mode = this.lat0 < 0 ? mode.S_POLE : mode.N_POLE;\n } else if (Math.abs(this.lat0) < EPSLN) {\n this.mode = mode.EQUIT;\n } else {\n this.mode = mode.OBLIQ;\n this.sinph0 = Math.sin(this.lat0);\n this.cosph0 = Math.cos(this.lat0);\n }\n\n this.pn1 = this.h / this.a; // Normalize relative to the Earth's radius\n\n if (this.pn1 <= 0 || this.pn1 > 1e10) {\n throw new Error(\"Invalid height\");\n }\n \n this.p = 1 + this.pn1;\n this.rp = 1 / this.p;\n this.h1 = 1 / this.pn1;\n this.pfact = (this.p + 1) * this.h1;\n this.es = 0;\n\n var omega = this.tilt;\n var gamma = this.azi;\n this.cg = Math.cos(gamma);\n this.sg = Math.sin(gamma);\n this.cw = Math.cos(omega);\n this.sw = Math.sin(omega);\n}\n\nexport function forward(p) {\n p.x -= this.long0;\n var sinphi = Math.sin(p.y);\n var cosphi = Math.cos(p.y);\n var coslam = Math.cos(p.x);\n var x, y;\n switch (this.mode) {\n case mode.OBLIQ:\n y = this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;\n break;\n case mode.EQUIT:\n y = cosphi * coslam;\n break;\n case mode.S_POLE:\n y = -sinphi;\n break;\n case mode.N_POLE:\n y = sinphi;\n break;\n }\n y = this.pn1 / (this.p - y);\n x = y * cosphi * Math.sin(p.x);\n\n switch (this.mode) {\n case mode.OBLIQ:\n y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;\n break;\n case mode.EQUIT:\n y *= sinphi;\n break;\n case mode.N_POLE:\n y *= -(cosphi * coslam);\n break;\n case mode.S_POLE:\n y *= cosphi * coslam;\n break;\n }\n\n // Tilt \n var yt, ba;\n yt = y * this.cg + x * this.sg;\n ba = 1 / (yt * this.sw * this.h1 + this.cw);\n x = (x * this.cg - y * this.sg) * this.cw * ba;\n y = yt * ba;\n\n p.x = x * this.a;\n p.y = y * this.a;\n return p;\n}\n\nexport function inverse(p) {\n p.x /= this.a;\n p.y /= this.a;\n var r = { x: p.x, y: p.y };\n\n // Un-Tilt\n var bm, bq, yt;\n yt = 1 / (this.pn1 - p.y * this.sw);\n bm = this.pn1 * p.x * yt;\n bq = this.pn1 * p.y * this.cw * yt;\n p.x = bm * this.cg + bq * this.sg;\n p.y = bq * this.cg - bm * this.sg;\n\n var rh = hypot(p.x, p.y);\n if (Math.abs(rh) < EPSLN) {\n r.x = 0;\n r.y = p.y;\n } else {\n var cosz, sinz;\n sinz = 1 - rh * rh * this.pfact;\n sinz = (this.p - Math.sqrt(sinz)) / (this.pn1 / rh + rh / this.pn1);\n cosz = Math.sqrt(1 - sinz * sinz);\n switch (this.mode) {\n case mode.OBLIQ:\n r.y = Math.asin(cosz * this.sinph0 + p.y * sinz * this.cosph0 / rh);\n p.y = (cosz - this.sinph0 * Math.sin(r.y)) * rh;\n p.x *= sinz * this.cosph0;\n break;\n case mode.EQUIT:\n r.y = Math.asin(p.y * sinz / rh);\n p.y = cosz * rh;\n p.x *= sinz;\n break;\n case mode.N_POLE:\n r.y = Math.asin(cosz);\n p.y = -p.y;\n break;\n case mode.S_POLE:\n r.y = -Math.asin(cosz);\n break;\n }\n r.x = Math.atan2(p.x, p.y);\n }\n\n p.x = r.x + this.long0;\n p.y = r.y;\n return p;\n}\n\nexport var names = [\"Tilted_Perspective\", \"tpers\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names\n};\n","import hypot from '../common/hypot';\n\nexport function init() {\n this.flip_axis = (this.sweep === 'x' ? 1 : 0);\n this.h = Number(this.h);\n this.radius_g_1 = this.h / this.a;\n\n if (this.radius_g_1 <= 0 || this.radius_g_1 > 1e10) {\n throw new Error();\n }\n\n this.radius_g = 1.0 + this.radius_g_1;\n this.C = this.radius_g * this.radius_g - 1.0;\n\n if (this.es !== 0.0) {\n var one_es = 1.0 - this.es;\n var rone_es = 1 / one_es;\n\n this.radius_p = Math.sqrt(one_es);\n this.radius_p2 = one_es;\n this.radius_p_inv2 = rone_es;\n\n this.shape = 'ellipse'; // Use as a condition in the forward and inverse functions.\n } else {\n this.radius_p = 1.0;\n this.radius_p2 = 1.0;\n this.radius_p_inv2 = 1.0;\n\n this.shape = 'sphere'; // Use as a condition in the forward and inverse functions.\n }\n\n if (!this.title) {\n this.title = \"Geostationary Satellite View\";\n }\n}\n\nfunction forward(p) {\n var lon = p.x;\n var lat = p.y;\n var tmp, v_x, v_y, v_z;\n lon = lon - this.long0;\n\n if (this.shape === 'ellipse') {\n lat = Math.atan(this.radius_p2 * Math.tan(lat));\n var r = this.radius_p / hypot(this.radius_p * Math.cos(lat), Math.sin(lat));\n\n v_x = r * Math.cos(lon) * Math.cos(lat);\n v_y = r * Math.sin(lon) * Math.cos(lat);\n v_z = r * Math.sin(lat);\n\n if (((this.radius_g - v_x) * v_x - v_y * v_y - v_z * v_z * this.radius_p_inv2) < 0.0) {\n p.x = Number.NaN;\n p.y = Number.NaN;\n return p;\n }\n\n tmp = this.radius_g - v_x;\n if (this.flip_axis) {\n p.x = this.radius_g_1 * Math.atan(v_y / hypot(v_z, tmp));\n p.y = this.radius_g_1 * Math.atan(v_z / tmp);\n } else {\n p.x = this.radius_g_1 * Math.atan(v_y / tmp);\n p.y = this.radius_g_1 * Math.atan(v_z / hypot(v_y, tmp));\n }\n } else if (this.shape === 'sphere') {\n tmp = Math.cos(lat);\n v_x = Math.cos(lon) * tmp;\n v_y = Math.sin(lon) * tmp;\n v_z = Math.sin(lat);\n tmp = this.radius_g - v_x;\n\n if (this.flip_axis) {\n p.x = this.radius_g_1 * Math.atan(v_y / hypot(v_z, tmp));\n p.y = this.radius_g_1 * Math.atan(v_z / tmp);\n } else {\n p.x = this.radius_g_1 * Math.atan(v_y / tmp);\n p.y = this.radius_g_1 * Math.atan(v_z / hypot(v_y, tmp));\n }\n }\n p.x = p.x * this.a;\n p.y = p.y * this.a;\n return p;\n}\n\nfunction inverse(p) {\n var v_x = -1.0;\n var v_y = 0.0;\n var v_z = 0.0;\n var a, b, det, k;\n\n p.x = p.x / this.a;\n p.y = p.y / this.a;\n\n if (this.shape === 'ellipse') {\n if (this.flip_axis) {\n v_z = Math.tan(p.y / this.radius_g_1);\n v_y = Math.tan(p.x / this.radius_g_1) * hypot(1.0, v_z);\n } else {\n v_y = Math.tan(p.x / this.radius_g_1);\n v_z = Math.tan(p.y / this.radius_g_1) * hypot(1.0, v_y);\n }\n\n var v_zp = v_z / this.radius_p;\n a = v_y * v_y + v_zp * v_zp + v_x * v_x;\n b = 2 * this.radius_g * v_x;\n det = (b * b) - 4 * a * this.C;\n\n if (det < 0.0) {\n p.x = Number.NaN;\n p.y = Number.NaN;\n return p;\n }\n\n k = (-b - Math.sqrt(det)) / (2.0 * a);\n v_x = this.radius_g + k * v_x;\n v_y *= k;\n v_z *= k;\n\n p.x = Math.atan2(v_y, v_x);\n p.y = Math.atan(v_z * Math.cos(p.x) / v_x);\n p.y = Math.atan(this.radius_p_inv2 * Math.tan(p.y));\n } else if (this.shape === 'sphere') {\n if (this.flip_axis) {\n v_z = Math.tan(p.y / this.radius_g_1);\n v_y = Math.tan(p.x / this.radius_g_1) * Math.sqrt(1.0 + v_z * v_z);\n } else {\n v_y = Math.tan(p.x / this.radius_g_1);\n v_z = Math.tan(p.y / this.radius_g_1) * Math.sqrt(1.0 + v_y * v_y);\n }\n\n a = v_y * v_y + v_z * v_z + v_x * v_x;\n b = 2 * this.radius_g * v_x;\n det = (b * b) - 4 * a * this.C;\n if (det < 0.0) {\n p.x = Number.NaN;\n p.y = Number.NaN;\n return p;\n }\n\n k = (-b - Math.sqrt(det)) / (2.0 * a);\n v_x = this.radius_g + k * v_x;\n v_y *= k;\n v_z *= k;\n\n p.x = Math.atan2(v_y, v_x);\n p.y = Math.atan(v_z * Math.cos(p.x) / v_x);\n }\n p.x = p.x + this.long0;\n return p;\n}\n\nexport var names = [\"Geostationary Satellite View\", \"Geostationary_Satellite\", \"geos\"];\nexport default {\n init: init,\n forward: forward,\n inverse: inverse,\n names: names,\n};\n\n","import tmerc from './lib/projections/tmerc';\nimport etmerc from './lib/projections/etmerc';\nimport utm from './lib/projections/utm';\nimport sterea from './lib/projections/sterea';\nimport stere from './lib/projections/stere';\nimport somerc from './lib/projections/somerc';\nimport omerc from './lib/projections/omerc';\nimport lcc from './lib/projections/lcc';\nimport krovak from './lib/projections/krovak';\nimport cass from './lib/projections/cass';\nimport laea from './lib/projections/laea';\nimport aea from './lib/projections/aea';\nimport gnom from './lib/projections/gnom';\nimport cea from './lib/projections/cea';\nimport eqc from './lib/projections/eqc';\nimport poly from './lib/projections/poly';\nimport nzmg from './lib/projections/nzmg';\nimport mill from './lib/projections/mill';\nimport sinu from './lib/projections/sinu';\nimport moll from './lib/projections/moll';\nimport eqdc from './lib/projections/eqdc';\nimport vandg from './lib/projections/vandg';\nimport aeqd from './lib/projections/aeqd';\nimport ortho from './lib/projections/ortho';\nimport qsc from './lib/projections/qsc';\nimport robin from './lib/projections/robin';\nimport geocent from './lib/projections/geocent';\nimport tpers from './lib/projections/tpers';\nimport geos from './lib/projections/geos';\nexport default function(proj4){\n proj4.Proj.projections.add(tmerc);\n proj4.Proj.projections.add(etmerc);\n proj4.Proj.projections.add(utm);\n proj4.Proj.projections.add(sterea);\n proj4.Proj.projections.add(stere);\n proj4.Proj.projections.add(somerc);\n proj4.Proj.projections.add(omerc);\n proj4.Proj.projections.add(lcc);\n proj4.Proj.projections.add(krovak);\n proj4.Proj.projections.add(cass);\n proj4.Proj.projections.add(laea);\n proj4.Proj.projections.add(aea);\n proj4.Proj.projections.add(gnom);\n proj4.Proj.projections.add(cea);\n proj4.Proj.projections.add(eqc);\n proj4.Proj.projections.add(poly);\n proj4.Proj.projections.add(nzmg);\n proj4.Proj.projections.add(mill);\n proj4.Proj.projections.add(sinu);\n proj4.Proj.projections.add(moll);\n proj4.Proj.projections.add(eqdc);\n proj4.Proj.projections.add(vandg);\n proj4.Proj.projections.add(aeqd);\n proj4.Proj.projections.add(ortho);\n proj4.Proj.projections.add(qsc);\n proj4.Proj.projections.add(robin);\n proj4.Proj.projections.add(geocent);\n proj4.Proj.projections.add(tpers);\n proj4.Proj.projections.add(geos);\n}","import proj4 from './core';\nimport Proj from \"./Proj\";\nimport Point from \"./Point\";\nimport common from \"./common/toPoint\";\nimport defs from \"./defs\";\nimport nadgrid from \"./nadgrid\";\nimport transform from \"./transform\";\nimport mgrs from \"mgrs\";\nimport includedProjections from \"../projs\";\n\nproj4.defaultDatum = 'WGS84'; //default datum\nproj4.Proj = Proj;\nproj4.WGS84 = new proj4.Proj('WGS84');\nproj4.Point = Point;\nproj4.toPoint = common;\nproj4.defs = defs;\nproj4.nadgrid = nadgrid;\nproj4.transform = transform;\nproj4.mgrs = mgrs;\nproj4.version = '__VERSION__';\nincludedProjections(proj4);\nexport default proj4;\n","import Instance from '@giro3d/giro3d/core/Instance';\nimport proj4 from 'proj4';\n\nimport Fetcher from '@/utils/Fetcher';\n\n/**\n * Loads a Projection info and registers it in Giro3D if needed\n * @param projection - Projection code\n * @returns EPSG string (e.g. `EPSG:2154`)\n */\nasync function loadProjCrsIfNeeded(projection: string): Promise<string> {\n let epsgCode: string | null = null;\n\n const regexes = [\n /EPSG:+(\\d+)/,\n /http:\\/\\/www.opengis.net\\/def\\/crs\\/EPSG\\/0\\/(\\d+)/,\n /https:\\/\\/www.opengis.net\\/def\\/crs\\/EPSG\\/0\\/(\\d+)/,\n ];\n for (const regex of regexes) {\n const search = projection.match(regex);\n if (search !== null) {\n epsgCode = search[1];\n break;\n }\n }\n\n if (epsgCode != null) {\n const epsgString = `EPSG:${epsgCode}`;\n if (proj4.defs(epsgString) === undefined) {\n const text = await Fetcher.fetchText(`https://epsg.io/${epsgCode}.proj4`);\n Instance.registerCRS(epsgString, text);\n }\n return epsgString;\n }\n throw new Error(`Could not find projection for ${projection}`);\n}\n\nexport default { loadProjCrsIfNeeded };\n","import type { PolygonOptions } from '@giro3d/giro3d/renderer/geometries/GeometryConverter';\nimport type Feature from 'ol/Feature';\nimport type FeatureFormat from 'ol/format/Feature';\nimport type { LineString } from 'ol/geom';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport GeometryConverter from '@giro3d/giro3d/renderer/geometries/GeometryConverter';\nimport { type FeatureLike } from 'ol/Feature';\nimport {\n type MultiLineString,\n type MultiPoint,\n type MultiPolygon,\n type Point,\n type Polygon,\n} from 'ol/geom';\nimport { Clock, Group } from 'three';\n\nimport type { Alticoder } from '@/providers/Alticoding';\n\nimport Projections from './Projections';\n\nasync function fetchZCoordinates(\n features: SimpleFeature[],\n featureProjection: string,\n alticoder: Alticoder,\n offset: number,\n noDataValue: number,\n): Promise<void> {\n const clock = new Clock();\n clock.start();\n\n const giroCoordinates: Coordinates[] = [];\n const giroCoordinatesByFeature = new Map<number, Coordinates[]>();\n\n for (const feature of features) {\n const geom = feature.getGeometry();\n const geomType = geom?.getType();\n if (geom == null || geomType == null) {\n continue;\n }\n\n const featureCoordinates: Coordinates[] = [];\n const coordinates = geom.getFlatCoordinates();\n const stride = geom.getStride();\n if (stride >= 3 && coordinates[2] != null && coordinates[2] !== noDataValue) {\n // Feature already has altitude, skip\n continue;\n }\n\n for (let i = 0; i < coordinates.length; i += stride) {\n const c = new Coordinates(\n featureProjection,\n coordinates[i + 0],\n coordinates[i + 1],\n stride >= 3 ? coordinates[i + 2] : noDataValue,\n );\n featureCoordinates.push(c);\n giroCoordinates.push(c);\n }\n // @ts-expect-error ol_uid is hidden\n giroCoordinatesByFeature.set(feature.ol_uid, featureCoordinates);\n }\n\n console.debug(\n `Fetching altitudes for ${giroCoordinates.length} coordinates from ${features.length} features...`,\n );\n\n await alticoder(giroCoordinates);\n\n for (const feature of features) {\n // @ts-expect-error ol_uid is hidden\n const featureCoordinates = giroCoordinatesByFeature.get(feature.ol_uid);\n const geom = feature.getGeometry();\n if (geom == null || featureCoordinates == null) {\n continue;\n }\n\n switch (geom.getType()) {\n case 'LineString':\n case 'MultiPoint': {\n const g = geom as LineString | MultiPoint;\n const c = g.getCoordinates();\n for (let i = 0; i < c.length; i += 1) {\n c[i][2] = featureCoordinates[i].values[2] + offset;\n }\n g.setCoordinates(c);\n break;\n }\n case 'MultiLineString':\n case 'Polygon': {\n const g = geom as MultiLineString | Polygon;\n const c = g.getCoordinates();\n let k = 0;\n for (let i = 0; i < c.length; i += 1) {\n for (let j = 0; j < c[i].length; j += 1) {\n c[i][j][2] = featureCoordinates[k].values[2] + offset;\n k += 1;\n }\n }\n g.setCoordinates(c);\n break;\n }\n case 'MultiPolygon': {\n const g = geom as MultiPolygon;\n const c = g.getCoordinates();\n let k = 0;\n for (let i = 0; i < c.length; i += 1) {\n for (let j = 0; j < c[i].length; j += 1) {\n for (let m = 0; m < c[i][j].length; m += 1) {\n c[i][j][m][2] = featureCoordinates[k].values[2] + offset;\n k += 1;\n }\n }\n }\n g.setCoordinates(c);\n break;\n }\n case 'Point': {\n const g = geom as Point;\n const c = g.getCoordinates();\n c[2] = featureCoordinates[0].values[2] + offset;\n g.setCoordinates(c);\n break;\n }\n default:\n // do nothing\n }\n }\n\n console.debug(`Fetched all missing altitudes in ${clock.getElapsedTime()}s`);\n clock.stop();\n}\n\nfunction fillZCoordinates(features: SimpleFeature[], altitude: number, noDataValue: number): void {\n for (const feature of features) {\n const geom = feature.getGeometry();\n if (geom == null) {\n continue;\n }\n\n const stride = geom.getStride();\n const coordinates = geom.getFlatCoordinates();\n if (stride >= 3 && coordinates[2] != null && coordinates[2] !== noDataValue) {\n // Feature already has altitude, skip\n continue;\n }\n\n switch (geom.getType()) {\n case 'LineString':\n case 'MultiPoint': {\n const g = geom as LineString | MultiPoint;\n const c = g.getCoordinates();\n for (let i = 0; i < c.length; i += 1) {\n c[i][2] = altitude;\n }\n g.setCoordinates(c);\n break;\n }\n case 'MultiLineString':\n case 'Polygon': {\n const g = geom as MultiLineString | Polygon;\n const c = g.getCoordinates();\n for (let i = 0; i < c.length; i += 1) {\n for (let j = 0; j < c[i].length; j += 1) {\n c[i][j][2] = altitude;\n }\n }\n g.setCoordinates(c);\n break;\n }\n case 'MultiPolygon': {\n const g = geom as MultiPolygon;\n const c = g.getCoordinates();\n for (let i = 0; i < c.length; i += 1) {\n for (let j = 0; j < c[i].length; j += 1) {\n for (let m = 0; m < c[i][j].length; m += 1) {\n c[i][j][m][2] = altitude;\n }\n }\n }\n g.setCoordinates(c);\n break;\n }\n case 'Point': {\n const g = geom as Point;\n const c = g.getCoordinates();\n c[2] = altitude;\n g.setCoordinates(c);\n break;\n }\n default:\n // do nothing\n }\n }\n}\n\n/**\n * Converts data into OpenLayers features\n *\n * @param data - Data\n * @param format - OpenLayers format\n * @param dataProjection - Projection used in the data (by default EPSG:4326)\n * @param featureProjection - Output projection (typically the one used by Giro3D instance)\n * @returns Features\n */\nasync function readFeatures(\n data: string,\n format: FeatureFormat,\n dataProjection: string | undefined,\n featureProjection: string,\n): Promise<FeatureLike[]> {\n const projIn = await Projections.loadProjCrsIfNeeded(dataProjection ?? 'EPSG:4326');\n\n return format.readFeatures(data, {\n dataProjection: projIn,\n featureProjection,\n });\n}\n\n/**\n * Converts data into OpenLayers features\n *\n * @param data - Data\n * @param format - OpenLayers format\n * @param dataProjection - Projection used in the data (by default EPSG:4326)\n * @param featureProjection - Output projection (typically the one used by Giro3D instance)\n * @returns Features\n */\nfunction readSimpleFeatures(\n data: string,\n format: FeatureFormat,\n dataProjection: string,\n featureProjection: string,\n): SimpleFeature[] {\n return toSimpleFeatures(\n format.readFeatures(data, {\n dataProjection,\n featureProjection,\n }),\n );\n}\n\n/**\n * Converts a list of features into Threejs meshes.\n * Meshes are automatically translated around their center to avoid weird side-effects.\n *\n * @param olFeatures - Features to convert\n * @param polygonOptions - Options to pass to the geometry converter.\n * @returns Group of meshes\n */\nfunction toMeshes(olFeatures: SimpleFeature[], polygonOptions?: PolygonOptions): Group {\n const root = new Group();\n\n const converter = new GeometryConverter();\n\n const meshes = olFeatures.map(f => {\n const geometry = f.getGeometry();\n\n if (geometry != null) {\n const type = geometry.getType() as SimpleGeometryType;\n let mesh;\n\n switch (type) {\n case 'LineString':\n mesh = converter.build(geometry as LineString);\n break;\n case 'MultiLineString':\n mesh = converter.build(geometry as MultiLineString);\n break;\n case 'MultiPoint':\n mesh = converter.build(geometry as MultiPoint);\n break;\n case 'MultiPolygon':\n mesh = converter.build(geometry as MultiPolygon, polygonOptions);\n break;\n case 'Point':\n mesh = converter.build(geometry as Point);\n break;\n case 'Polygon':\n mesh = converter.build(geometry as Polygon, polygonOptions);\n break;\n default:\n console.warn(`Unsupported type ${type}`);\n mesh = null;\n }\n\n if (mesh) {\n for (const [name, value] of Object.entries(f.getProperties())) {\n if (name !== 'geometry') {\n mesh.userData[name] = value;\n }\n }\n }\n return mesh;\n }\n });\n\n for (const mesh of meshes) {\n if (mesh != null) {\n root.add(mesh);\n }\n }\n\n return root;\n}\n\n/**\n * Filters features read by {@link readFeatures} into {@link SimpleFeature} usable by `OlFeature2Mesh`.\n * Unsupported features are simply ignored and filtered-out.\n *\n * @param features - Features\n * @returns Simple features\n */\nfunction toSimpleFeatures(features: FeatureLike[]): SimpleFeature[] {\n return features.filter(feature => {\n if ('getType' in feature) {\n // Render feature, ignore\n return false;\n }\n const geomType = feature.getGeometry()?.getType();\n if (\n geomType == null ||\n ![\n 'LineString',\n 'MultiLineString',\n 'MultiPoint',\n 'MultiPolygon',\n 'Point',\n 'Polygon',\n ].includes(geomType)\n ) {\n return false;\n }\n\n return true;\n }) as SimpleFeature[];\n}\n\nexport type SimpleFeature = Feature<SimpleGeometry>;\n\nexport type SimpleGeometry =\n | LineString\n | MultiLineString\n | MultiPoint\n | MultiPolygon\n | Point\n | Polygon;\n\nexport type SimpleGeometryType =\n | 'LineString'\n | 'MultiLineString'\n | 'MultiPoint'\n | 'MultiPolygon'\n | 'Point'\n | 'Polygon';\n\nexport default {\n fetchZCoordinates,\n fillZCoordinates,\n readFeatures,\n readSimpleFeatures,\n toMeshes,\n toSimpleFeatures,\n};\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type { PolygonOptions } from '@giro3d/giro3d/renderer/geometries/GeometryConverter';\nimport type FeatureFormat from 'ol/format/Feature';\n\nimport { DEFAULT_LINE_COLOR, DEFAULT_SURFACE_COLOR } from '@giro3d/giro3d/core/FeatureTypes';\nimport Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport GeoJSONFormat from 'ol/format/GeoJSON';\nimport GPXFormat from 'ol/format/GPX';\nimport KMLFormat from 'ol/format/KML';\nimport { Group } from 'three';\n\nimport type { ExtractOptional } from '@/types/utilities';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\nimport { alticoderGenerator } from '@/providers/Alticoding';\nimport Fetcher, { type FetchContext } from '@/utils/Fetcher';\nimport OLFeatures, { type SimpleFeature } from '@/utils/OLFeatures';\nimport Projections from '@/utils/Projections';\n\nimport type {\n DataProjectionMixin,\n ElevationMixin,\n FeatureProjectionMixin,\n UrlOrDataMixin,\n} from '../sources/mixins';\n\n/** Source for {@link VectorMeshEntity} */\nexport interface VectorMeshSourceOptions\n extends DataProjectionMixin,\n ElevationMixin,\n Required<FeatureProjectionMixin>,\n UrlOrDataMixin {}\n\nconst geojsonFormat = new GeoJSONFormat();\nconst gpxFormat = new GPXFormat();\nconst kmlFormat = new KMLFormat();\n\nexport const defaultParameters: Required<ExtractOptional<VectorMeshSourceOptions>> = {\n dataProjection: 'EPSG:4326',\n elevation: 0,\n fetchElevation: false,\n fetchElevationFast: false,\n fetchElevationOffset: 0.1,\n noDataValue: 0,\n};\n\n/** Interface to implement for a new source for {@link VectorMeshEntity} */\nexport interface VectorMeshSource {\n /** Elevation of the features */\n elevation?: number;\n /** No data value for elevation */\n noDataValue?: number;\n /** Context of the data */\n context(): FetchContext;\n /** Loads the features. Will be called only once */\n load(instance: Instance): Promise<SimpleFeature[]>;\n}\n\n/** GeoJSON source */\nexport class GeoJsonMeshSource implements VectorMeshSource {\n public elevation?: number;\n public readonly options: VectorMeshSourceOptions;\n\n public constructor(options: VectorMeshSourceOptions) {\n this.options = options;\n this.elevation = options.elevation;\n }\n\n public context(): FetchContext {\n return Fetcher.getContext(this.options.url);\n }\n\n public async load(instance: Instance): Promise<SimpleFeature[]> {\n // TODO: For some historical (?) reason we are not using bare OL\n // parsing, and we are using toGeoJSONFeatures instead. Not sure\n // why we were doing this in the first place, maybe we can remove\n // this now.\n\n // First, get the data as GeoJSON\n const json = await Fetcher.fetchJson<GeoJSON.GeoJSON>(this.options.url);\n\n // Convert them into a list of GeoJSON features\n const features = toGeoJSONFeatures(json);\n\n // Convert them into OpenLayers features\n const olFeatures = await geojsonToOlFeatures(instance, features, this.options);\n return olFeatures;\n }\n}\n\n/** OpenLayers-based source */\nexport class OlMeshSource implements VectorMeshSource {\n public elevation?: number;\n /** OL Feature format */\n public readonly format: FeatureFormat;\n public noDataValue?: number;\n public readonly options: VectorMeshSourceOptions;\n\n public constructor(format: FeatureFormat, options: VectorMeshSourceOptions) {\n this.format = format;\n this.options = options;\n this.elevation = options.elevation;\n this.noDataValue = options.noDataValue;\n }\n\n public context(): FetchContext {\n return Fetcher.getContext(this.options.url);\n }\n\n public async load(instance: Instance): Promise<SimpleFeature[]> {\n const text = await Fetcher.fetchText(this.options.url);\n const features = await toOlFeatures(instance, text, this.format, this.options);\n return features;\n }\n}\n\n/** GPX source */\nexport class GpxMeshSource extends OlMeshSource {\n public constructor(options: VectorMeshSourceOptions) {\n super(gpxFormat, options);\n }\n}\n\n/** KML source */\nexport class KmlMeshSource extends OlMeshSource {\n public constructor(options: VectorMeshSourceOptions) {\n super(kmlFormat, options);\n }\n}\n\n/**\n * Converts GeoJSON features into OpenLayers features.\n * Will handle reprojection if needed.\n * Will fetch elevation if `parameters.fetchElevation` is `true`.\n *\n * @param features - Array of GeoJSON features\n * @param parameters - Loader parameters\n * @returns Array of simple features, where unsupported features are discarded\n */\nexport async function geojsonToOlFeatures(\n instance: Instance,\n features: GeoJSON.Feature[],\n parameters: VectorMeshSourceOptions,\n): Promise<SimpleFeature[]> {\n const dataProjection = await Projections.loadProjCrsIfNeeded(\n parameters.dataProjection ?? defaultParameters.dataProjection,\n );\n\n const olFeatures = features.flatMap(f =>\n geojsonFormat.readFeatures(f, {\n dataProjection,\n featureProjection: parameters.featureProjection,\n }),\n );\n const simpleFeatures = OLFeatures.toSimpleFeatures(olFeatures);\n\n const fetchElevation = parameters.fetchElevation ?? defaultParameters.fetchElevation;\n if (fetchElevation) {\n const fetchElevationFast =\n parameters.fetchElevationFast ?? defaultParameters.fetchElevationFast;\n const fetchElevationOffset =\n parameters.fetchElevationOffset ?? defaultParameters.fetchElevationOffset;\n const noDataValue = parameters.noDataValue ?? defaultParameters.noDataValue;\n\n await OLFeatures.fetchZCoordinates(\n simpleFeatures,\n parameters.featureProjection,\n alticoderGenerator(instance, fetchElevationFast, noDataValue),\n fetchElevationOffset,\n noDataValue,\n );\n }\n return simpleFeatures;\n}\n\n/**\n * Converts {@link SimpleFeature}s into a Three.js `Group`.\n * Assumes features are already in the correct CRS.\n * If Z-coordinates are missing in the features (`null` or equal to `noDataValue`),\n * they are filled at `options?.elevation` or at `defaultElevation`.\n *\n * @param features - Features to convert\n * @param options - GeometryConverter options\n * @param defaultElevation - Default elevation if not provided via options\n * @param noDataValue - Value considered as no data for filling Z.\n * @returns Group containing all meshes for all features\n */\nexport function olFeaturestoGroup(\n features: SimpleFeature[],\n options?: PolygonOptions,\n defaultElevation = defaultParameters.elevation,\n noDataValue = defaultParameters.noDataValue,\n): Group {\n const elevation =\n (Array.isArray(options?.elevation) ? options.elevation[0] : options?.elevation) ??\n defaultElevation;\n OLFeatures.fillZCoordinates(features, elevation, noDataValue);\n return OLFeatures.toMeshes(features, options);\n}\n\n/**\n * Converts a GeoJSON object into a list of GeoJSON features\n * @param json - GeoJSON object\n * @returns Array of GeoJSON features\n */\nexport function toGeoJSONFeatures(json: GeoJSON.GeoJSON): GeoJSON.Feature[] {\n switch (json.type) {\n case 'Feature':\n return [json];\n case 'FeatureCollection':\n return json.features;\n case 'GeometryCollection': {\n const features: GeoJSON.Feature[] = json.geometries.map(geometry => ({\n geometry,\n properties: {},\n type: 'Feature',\n }));\n return features;\n }\n default: {\n const feature: GeoJSON.Feature = {\n geometry: json,\n properties: {},\n type: 'Feature',\n };\n return [feature];\n }\n }\n}\n\n/**\n * Converts loaded data into OpenLayers {@link SimpleFeature}s.\n * Will handle reprojection if needed.\n * Will fetch elevation if `parameters.fetchElevation` is `true`.\n *\n * @param data - Loaded data\n * @param format - OpenLayers format used for decoding `data`\n * @param parameters - Loader parameters\n * @returns Array of simple features, where unsupported features are discarded\n */\nexport async function toOlFeatures(\n instance: Instance,\n data: string,\n format: FeatureFormat,\n parameters: VectorMeshSourceOptions,\n): Promise<SimpleFeature[]> {\n const olFeatures = OLFeatures.readSimpleFeatures(\n data,\n format,\n parameters.dataProjection ?? defaultParameters.dataProjection,\n parameters.featureProjection,\n );\n\n const fetchElevation = parameters.fetchElevation ?? defaultParameters.fetchElevation;\n if (fetchElevation) {\n const fetchElevationFast =\n parameters.fetchElevationFast ?? defaultParameters.fetchElevationFast;\n const fetchElevationOffset =\n parameters.fetchElevationOffset ?? defaultParameters.fetchElevationOffset;\n const noDataValue = parameters.noDataValue ?? defaultParameters.noDataValue;\n\n await OLFeatures.fetchZCoordinates(\n olFeatures,\n parameters.featureProjection,\n alticoderGenerator(instance, fetchElevationFast, noDataValue),\n fetchElevationOffset,\n noDataValue,\n );\n }\n return olFeatures;\n}\n\n/** Entity for displaying vector data as meshes */\nexport default class VectorMeshEntity extends Entity3D {\n public readonly sources: VectorMeshSource[];\n\n public constructor(sources: VectorMeshSource | VectorMeshSource[]) {\n super(new Group());\n this.sources = Array.isArray(sources) ? sources : [sources];\n }\n\n protected override async preprocess(): Promise<void> {\n for (const source of this.sources) {\n // TODO: avoid await in the loop\n const olFeatures = await source.load(this.instance);\n const group = olFeaturestoGroup(\n olFeatures,\n {\n elevation: source.elevation,\n fill: { color: DEFAULT_SURFACE_COLOR },\n stroke: { color: DEFAULT_LINE_COLOR },\n },\n source.elevation,\n source.noDataValue,\n );\n\n this.object3d.add(group);\n this.onObjectCreated(group);\n\n const context = source.context();\n fillObject3DUserData(group, { filename: context.filename });\n }\n this.notifyChange(this.object3d);\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { load } from '@loaders.gl/core';\nimport { GeoPackageLoader as GeoPackageGLLoader } from '@loaders.gl/geopackage';\nimport { type GeoJSONTable, type Tables } from '@loaders.gl/schema';\n\nimport type { SimpleFeature } from '@/utils/OLFeatures';\n\nimport Fetcher, { type FetchContext, type UrlOrData } from '@/utils/Fetcher';\n\nimport type {\n DataProjectionMixin,\n ElevationMixin,\n FeatureProjectionMixin,\n UrlOrDataMixin,\n} from './mixins';\n\nimport { geojsonToOlFeatures, type VectorMeshSource } from '../entities/VectorMeshEntity';\n\n/**\n * Fetches data via loaders.gl loader.\n * @param url - URL to load or Blob\n * @param parameters - Parameters\n * @returns Array of GeoJSON features\n */\nasync function fetchGeopackage(\n url: UrlOrData,\n featureProjection: string,\n): Promise<GeoJSON.Feature[]> {\n const raw = (await load(url, GeoPackageGLLoader, {\n fetch: Fetcher.fetch,\n gis: {\n _targetCrs: featureProjection,\n format: 'geojson',\n reproject: true,\n },\n })) as Tables<GeoJSONTable>;\n\n const features: GeoJSON.Feature[] = [];\n for (const [table, array] of Object.entries(raw.tables)) {\n for (const feature of array.table.features) {\n if (!feature.properties) {\n feature.properties = {};\n }\n feature.properties['table'] = table;\n features.push(feature);\n }\n }\n return features;\n}\n\n/**\n * Options for loading Geopackage files into a {@link VectorMeshEntity}\n */\nexport interface GeopackageSourceParameters\n extends DataProjectionMixin,\n ElevationMixin,\n Required<FeatureProjectionMixin>,\n UrlOrDataMixin {}\n\n/**\n * Source for loading a Geopackage file into a {@link VectorMeshEntity}\n */\nexport default class GeopackageSource implements VectorMeshSource {\n public elevation?: number;\n public readonly options: GeopackageSourceParameters;\n\n public constructor(options: GeopackageSourceParameters) {\n this.options = options;\n this.elevation = options.elevation;\n }\n\n public context(): FetchContext {\n return Fetcher.getContext(this.options.url);\n }\n\n public async load(instance: Instance): Promise<SimpleFeature[]> {\n // First, get the data as a list of GeoJSON features\n const features = await fetchGeopackage(this.options.url, this.options.featureProjection);\n // Convert them into OpenLayers features\n const olFeatures = await geojsonToOlFeatures(instance, features, {\n ...this.options,\n dataProjection: this.options.featureProjection, // Already re-projected\n });\n return olFeatures;\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { load } from '@loaders.gl/core';\nimport { ShapefileLoader as ShapefileGLLoader } from '@loaders.gl/shapefile';\n\nimport type { FetchContext, UrlOrData } from '@/utils/Fetcher';\nimport type { SimpleFeature } from '@/utils/OLFeatures';\n\nimport Fetcher from '@/utils/Fetcher';\n\nimport type { VectorMeshSource } from '../entities/VectorMeshEntity';\nimport type {\n DataProjectionMixin,\n ElevationMixin,\n FeatureProjectionMixin,\n UrlOrDataMixin,\n} from './mixins';\n\nimport { geojsonToOlFeatures } from '../entities/VectorMeshEntity';\n\n/**\n * Fetches data via loaders.gl loader.\n * @param url - URL to load or Blob\n * @param parameters - Parameters\n * @returns Array of GeoJSON features\n */\nasync function fetchShapefile(\n url: UrlOrData,\n featureProjection: string,\n): Promise<GeoJSON.Feature[]> {\n const raw = await load(url, ShapefileGLLoader, {\n fetch: Fetcher.fetch,\n gis: {\n _targetCrs: featureProjection,\n format: 'geojson',\n reproject: true,\n },\n shapefile: {\n shape: 'geojson-table',\n },\n });\n\n // @ts-expect-error raw is unknown\n return raw.features;\n}\n\n/**\n * Options for loading Shapefile files into a {@link VectorMeshEntity}\n */\nexport interface ShapefileSourceParameters\n extends DataProjectionMixin,\n ElevationMixin,\n Required<FeatureProjectionMixin>,\n UrlOrDataMixin {}\n\n/**\n * Source for loading a Shapefile file into a {@link VectorMeshEntity}\n */\nexport default class ShapefileSource implements VectorMeshSource {\n public elevation?: number;\n public readonly options: ShapefileSourceParameters;\n\n public constructor(options: ShapefileSourceParameters) {\n this.options = options;\n this.elevation = options.elevation;\n }\n\n public context(): FetchContext {\n return Fetcher.getContext(this.options.url);\n }\n\n public async load(instance: Instance): Promise<SimpleFeature[]> {\n // First, get the data as a list of GeoJSON features\n const features = await fetchShapefile(this.options.url, this.options.featureProjection);\n // Convert them into OpenLayers features\n const olFeatures = await geojsonToOlFeatures(instance, features, {\n ...this.options,\n dataProjection: this.options.featureProjection, // Already re-projected\n });\n return olFeatures;\n }\n}\n","import {\n\tMatrix4,\n\tObject3D,\n\tVector2,\n\tVector3\n} from 'three';\n\nclass CSS2DObject extends Object3D {\n\n\tconstructor( element = document.createElement( 'div' ) ) {\n\n\t\tsuper();\n\n\t\tthis.isCSS2DObject = true;\n\n\t\tthis.element = element;\n\n\t\tthis.element.style.position = 'absolute';\n\t\tthis.element.style.userSelect = 'none';\n\n\t\tthis.element.setAttribute( 'draggable', false );\n\n\t\tthis.center = new Vector2( 0.5, 0.5 ); // ( 0, 0 ) is the lower left; ( 1, 1 ) is the top right\n\n\t\tthis.addEventListener( 'removed', function () {\n\n\t\t\tthis.traverse( function ( object ) {\n\n\t\t\t\tif (\n\t\t\t\t\tobject.element instanceof object.element.ownerDocument.defaultView.Element &&\n\t\t\t\t\tobject.element.parentNode !== null\n\t\t\t\t) {\n\n\t\t\t\t\tobject.element.remove();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.element = source.element.cloneNode( true );\n\n\t\tthis.center = source.center;\n\n\t\treturn this;\n\n\t}\n\n}\n\n//\n\nconst _vector = new Vector3();\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _a = new Vector3();\nconst _b = new Vector3();\n\nclass CSS2DRenderer {\n\n\tconstructor( parameters = {} ) {\n\n\t\tconst _this = this;\n\n\t\tlet _width, _height;\n\t\tlet _widthHalf, _heightHalf;\n\n\t\tconst cache = {\n\t\t\tobjects: new WeakMap()\n\t\t};\n\n\t\tconst domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' );\n\n\t\tdomElement.style.overflow = 'hidden';\n\n\t\tthis.domElement = domElement;\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_viewMatrix.copy( camera.matrixWorldInverse );\n\t\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix );\n\n\t\t\trenderObject( scene, scene, camera );\n\t\t\tzOrder( scene );\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\n\t\t};\n\n\t\tfunction hideObject( object ) {\n\n\t\t\tif ( object.isCSS2DObject ) object.element.style.display = 'none';\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\thideObject( object.children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera ) {\n\n\t\t\tif ( object.visible === false ) {\n\n\t\t\t\thideObject( object );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( object.isCSS2DObject ) {\n\n\t\t\t\t_vector.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t_vector.applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\tconst visible = ( _vector.z >= - 1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true );\n\n\t\t\t\tconst element = object.element;\n\t\t\t\telement.style.display = visible === true ? '' : 'none';\n\n\t\t\t\tif ( visible === true ) {\n\n\t\t\t\t\tobject.onBeforeRender( _this, scene, camera );\n\n\t\t\t\t\telement.style.transform = 'translate(' + ( - 100 * object.center.x ) + '%,' + ( - 100 * object.center.y ) + '%)' + 'translate(' + ( _vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - _vector.y * _heightHalf + _heightHalf ) + 'px)';\n\n\t\t\t\t\tif ( element.parentNode !== domElement ) {\n\n\t\t\t\t\t\tdomElement.appendChild( element );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.onAfterRender( _this, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t\tconst objectData = {\n\t\t\t\t\tdistanceToCameraSquared: getDistanceToSquared( camera, object )\n\t\t\t\t};\n\n\t\t\t\tcache.objects.set( object, objectData );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( object.children[ i ], scene, camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getDistanceToSquared( object1, object2 ) {\n\n\t\t\t_a.setFromMatrixPosition( object1.matrixWorld );\n\t\t\t_b.setFromMatrixPosition( object2.matrixWorld );\n\n\t\t\treturn _a.distanceToSquared( _b );\n\n\t\t}\n\n\t\tfunction filterAndFlatten( scene ) {\n\n\t\t\tconst result = [];\n\n\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isCSS2DObject ) result.push( object );\n\n\t\t\t} );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction zOrder( scene ) {\n\n\t\t\tconst sorted = filterAndFlatten( scene ).sort( function ( a, b ) {\n\n\t\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\t\treturn b.renderOrder - a.renderOrder;\n\n\t\t\t\t}\n\n\t\t\t\tconst distanceA = cache.objects.get( a ).distanceToCameraSquared;\n\t\t\t\tconst distanceB = cache.objects.get( b ).distanceToCameraSquared;\n\n\t\t\t\treturn distanceA - distanceB;\n\n\t\t\t} );\n\n\t\t\tconst zMax = sorted.length;\n\n\t\t\tfor ( let i = 0, l = sorted.length; i < l; i ++ ) {\n\n\t\t\t\tsorted[ i ].element.style.zIndex = zMax - i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { CSS2DObject, CSS2DRenderer };\n","import type PickOptions from '@giro3d/giro3d/core/picking/PickOptions';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type { Coordinate } from 'ol/coordinate';\nimport type { Intersection } from 'three';\n\nimport Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport { getContrastColor } from '@giro3d/giro3d/utils/ColorUtils';\nimport { Box3, Color, Group, MathUtils, Raycaster, Vector2, Vector3 } from 'three';\nimport { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\n\nimport type { SimpleFeature, SimpleGeometryType } from '@/utils/OLFeatures';\n\nimport { DEFAULT_SHAPE_COLOR } from '@/constants';\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nimport type { VectorMeshSource } from './VectorMeshEntity';\n\nconst tmpNDC = new Vector2();\nconst thisColor = new Color(DEFAULT_SHAPE_COLOR);\nconst sRGB = new Color();\nconst sRgb = sRGB.copyLinearToSRGB(thisColor);\nconst contrastColor = `#${new Color(getContrastColor(thisColor)).getHexString()}`;\nconst DEFAULT_FONT_SIZE = 12; // pixels\nconst DEFAULT_FONT_WEIGHT = 'bold';\nconst tmpIntersectList: Intersection[] = [];\n\n/**\n * Pick result on {@link VectorLabelsEntity}\n */\nexport type LabelPickResult = PickResult & {\n entity: VectorLabelsEntity;\n isLabelPickResult: true;\n};\n\nexport interface VectorLabelOptions {\n /**\n * Callback for styling the label\n * @param span - Label\n * @param feature - Feature corresponding to the label\n * @returns Nothing\n */\n style?: (span: HTMLSpanElement, feature: SimpleFeature) => void;\n /**\n * Callback for generating the text of labels\n * @param feature - Feature corresponding to the label\n * @param at - 3D position\n * @returns Content of the label to create\n */\n text?: (feature: SimpleFeature, at: Vector3) => string;\n}\n\n/**\n * Entity for displaying vector data as labels\n */\nexport default class VectorLabelsEntity extends Entity3D {\n public readonly sources: VectorMeshSource[];\n private _labels: CSS2DObject[];\n private _styleCallback?: (span: HTMLSpanElement, feature: SimpleFeature) => void;\n private _textCallback: (feature: SimpleFeature, at: Vector3) => string;\n\n public constructor(\n sources: VectorMeshSource | VectorMeshSource[],\n options?: VectorLabelOptions,\n ) {\n super(new Group());\n this.sources = Array.isArray(sources) ? sources : [sources];\n this._labels = [];\n this._textCallback = options?.text || ((): string => 'P');\n this._styleCallback = options?.style;\n }\n\n public override getBoundingBox(): Box3 | null {\n // For some reason (because of nested groups?), Three.js does not\n // compute correctly the bounding box of this.object3d\n const pts = this._labels.map(l => l.position);\n const box = new Box3().setFromPoints(pts);\n return box;\n }\n\n public override pick(coordinates: Vector2, _options?: PickOptions): LabelPickResult[] {\n const normalized = this.instance.canvasToNormalizedCoords(coordinates, tmpNDC);\n const raycaster = new Raycaster();\n raycaster.setFromCamera(normalized, this.instance.view.camera);\n\n // TODO: pickLabels should honor _options.filter\n const pickedLabel = this.pickLabels(raycaster);\n if (pickedLabel) {\n const pickResult: LabelPickResult = {\n distance: pickedLabel.position.distanceTo(raycaster.ray.origin),\n entity: this,\n isLabelPickResult: true,\n object: pickedLabel,\n point: pickedLabel.position,\n };\n\n return [pickResult];\n }\n\n return [];\n }\n\n public override updateOpacity(): void {\n // Opacity is driven by CSS, not by Threejs rendering\n const cssOpacity = `${this.opacity * 100}%`;\n this._labels.forEach(label => (label.element.style.opacity = cssOpacity));\n }\n\n public override updateVisibility(): void {\n // Setting the root object's visibility is not enough\n // to set the visibility of CSS2DObjects (labels).\n this.object3d.traverse(o => {\n o.visible = this.visible;\n });\n }\n\n protected override async preprocess(): Promise<void> {\n for (const source of this.sources) {\n // TODO: avoid await in the loop\n const olFeatures = await source.load(this.instance);\n const root = new Group();\n\n const defaultElevation = source.elevation ?? 0;\n const getPoint = (c: Coordinate): Vector3 => {\n return new Vector3(c[0], c[1], c[2] ?? defaultElevation);\n };\n\n for (const olFeature of olFeatures) {\n const geometry = olFeature.getGeometry();\n\n if (geometry != null) {\n const type = geometry.getType() as SimpleGeometryType;\n const coordinates: Coordinate[] = [];\n\n switch (type) {\n case 'LineString':\n case 'MultiPoint':\n coordinates.push(...(geometry.getCoordinates() as Coordinate[]));\n break;\n case 'MultiLineString':\n case 'Polygon':\n coordinates.push(...(geometry.getCoordinates() as Coordinate[][])[0]);\n break;\n case 'MultiPolygon':\n coordinates.push(\n ...(geometry.getCoordinates() as Coordinate[][][])[0][0],\n );\n break;\n case 'Point':\n coordinates.push(geometry.getCoordinates() as Coordinate);\n break;\n default:\n // do nothing\n }\n\n if (coordinates.length > 0) {\n const labels = coordinates.map(c =>\n this.createLabel(getPoint(c), olFeature),\n );\n const group = new Group();\n labels.forEach(l => {\n group.add(l);\n this._labels.push(l);\n });\n\n for (const [name, value] of Object.entries(olFeature.getProperties())) {\n if (name !== 'geometry') {\n group.userData[name] = value;\n }\n }\n root.add(group);\n }\n }\n }\n\n this.object3d.add(root);\n this.onObjectCreated(root);\n\n const context = source.context();\n fillObject3DUserData(root, { filename: context.filename });\n }\n this.notifyChange(this.object3d);\n }\n\n private createLabel(at: Vector3, feature: SimpleFeature): CSS2DObject {\n // Taken from Giro3D's Shape entity\n const container = document.createElement('div');\n const span = document.createElement('span');\n\n this.updateStyle(span, feature);\n\n span.innerText = this._textCallback(feature, at);\n\n const innerContainer = document.createElement('div');\n\n container.appendChild(innerContainer);\n innerContainer.appendChild(span);\n\n const object = new CSS2DObject(container);\n object.position.copy(at);\n object.updateMatrix();\n object.updateMatrixWorld(true);\n\n container.addEventListener('mouseover', () => (object.userData.hover = true));\n container.addEventListener('mouseleave', () => (object.userData.hover = false));\n\n return object;\n }\n\n private pickLabels(raycaster: Raycaster): CSS2DObject | null {\n let pickedLabel: CSS2DObject | null = null;\n\n this._labels.forEach(label => {\n if (pickedLabel == null) {\n tmpIntersectList.length = 0;\n this.raycastLabel(label, raycaster, tmpIntersectList);\n if (tmpIntersectList.length > 0) {\n pickedLabel = label;\n }\n }\n });\n\n return pickedLabel;\n }\n\n private raycastLabel(\n label: CSS2DObject,\n raycaster: Raycaster,\n intersects: Intersection[],\n ): void {\n if (label.userData.hover === true) {\n intersects.push({\n distance: label.position.distanceTo(raycaster.ray.origin),\n object: label,\n point: label.position,\n });\n }\n }\n\n private updateStyle(span: HTMLSpanElement, feature: SimpleFeature): void {\n // Taken from Giro3D's Shape entity\n span.style.backgroundColor = `rgb(${sRgb.r * 255} ${sRgb.g * 255} ${sRgb.b * 255})`;\n span.style.borderWidth = '1px';\n span.style.borderStyle = 'solid';\n span.style.borderColor = contrastColor;\n span.style.borderRadius = `${MathUtils.clamp(DEFAULT_FONT_SIZE - 4, 5, 10)}px`;\n span.style.color = contrastColor;\n const padding = MathUtils.clamp(Math.round(DEFAULT_FONT_SIZE / 4), 2, 10);\n span.style.padding = `${padding}px ${padding}px ${padding}px ${padding}px`;\n span.style.fontSize = `${DEFAULT_FONT_SIZE}px`;\n span.style.fontWeight = DEFAULT_FONT_WEIGHT;\n span.style.pointerEvents = 'auto';\n\n if (this._styleCallback) {\n this._styleCallback(span, feature);\n }\n }\n}\n","import type { Coordinate } from 'ol/coordinate';\n\nimport Shape from '@giro3d/giro3d/entities/Shape';\nimport { Vector3 } from 'three';\n\nimport type { SimpleGeometryType } from '@/utils/OLFeatures';\n\nimport { DEFAULT_SHAPE_COLOR, SHAPE_POINT_RADIUS } from '@/constants';\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nimport type { VectorMeshSource } from './VectorMeshEntity';\n\n/** Entity for displaying vector data as meshes */\nexport default class VectorShapeEntity extends Shape {\n public readonly source: VectorMeshSource;\n\n public constructor(source: VectorMeshSource) {\n super({\n color: DEFAULT_SHAPE_COLOR,\n showLine: true,\n showVertexLabels: true,\n showVertices: true,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n this.source = source;\n }\n\n protected override async preprocess(): Promise<void> {\n const olFeatures = await this.source.load(this.instance);\n const feature = olFeatures.at(0);\n const geometry = feature?.getGeometry();\n\n if (feature != null && geometry != null) {\n const defaultElevation = this.source.elevation ?? 0;\n const getPoint = (c: Coordinate): Vector3 => {\n return new Vector3(c[0], c[1], c[2] ?? defaultElevation);\n };\n const type = geometry.getType() as SimpleGeometryType;\n\n switch (type) {\n case 'LineString':\n this.showVertexLabels = false;\n this.showLine = true;\n this.showVertices = true;\n this.showSegmentLabels = true;\n this.showSurface = false;\n this.showSurfaceLabel = false;\n this.setPoints((geometry.getCoordinates() as Coordinate[]).map(getPoint));\n break;\n case 'MultiLineString':\n this.showVertexLabels = false;\n this.showLine = true;\n this.showVertices = true;\n this.showSegmentLabels = true;\n this.showSurface = false;\n this.showSurfaceLabel = false;\n this.setPoints((geometry.getCoordinates() as Coordinate[][])[0].map(getPoint));\n break;\n case 'MultiPoint':\n this.showVertexLabels = true;\n this.showLine = false;\n this.showVertices = true;\n this.showSegmentLabels = false;\n this.showSurface = false;\n this.showSurfaceLabel = false;\n this.setPoints((geometry.getCoordinates() as Coordinate[]).map(getPoint));\n break;\n case 'MultiPolygon':\n this.showVertexLabels = false;\n this.showLine = true;\n this.showVertices = true;\n this.showSegmentLabels = false;\n this.showSurface = true;\n this.showSurfaceLabel = true;\n this.setPoints(\n (geometry.getCoordinates() as Coordinate[][][])[0][0].map(getPoint),\n );\n break;\n case 'Point':\n this.showVertexLabels = true;\n this.showLine = false;\n this.showVertices = true;\n this.showSegmentLabels = false;\n this.showSurface = false;\n this.showSurfaceLabel = false;\n this.setPoints([getPoint(geometry.getCoordinates() as Coordinate)]);\n break;\n case 'Polygon':\n this.showVertexLabels = false;\n this.showLine = true;\n this.showVertices = true;\n this.showSegmentLabels = false;\n this.showSurface = true;\n this.showSurfaceLabel = true;\n this.setPoints((geometry.getCoordinates() as Coordinate[][])[0].map(getPoint));\n break;\n default:\n throw new Error(\n 'could not import shape from given geometry: ' + geometry.getType(),\n );\n }\n\n const context = this.source.context();\n fillObject3DUserData(this, { filename: context.filename });\n\n for (const [name, value] of Object.entries(feature.getProperties())) {\n if (name !== 'geometry') {\n this.userData[name] = value;\n }\n }\n }\n this.notifyChange(this.object3d);\n }\n}\n","import type Entity3D from '@giro3d/giro3d/entities/Entity3D';\n\nimport type {\n VectorDatasetConfig,\n VectorLabelsDatasetConfig,\n} from '@/types/configuration/datasets/vector';\n\nimport type { EntityBuilder } from '../EntityBuilder';\nimport type { VectorMeshSource, VectorMeshSourceOptions } from './VectorMeshEntity';\n\nimport GeopackageSource from '../sources/GeopackageSource';\nimport ShapefileSource from '../sources/ShapefileSource';\nimport VectorLabelsEntity from './VectorLabelsEntity';\nimport VectorMeshEntity, {\n GeoJsonMeshSource,\n GpxMeshSource,\n KmlMeshSource,\n OlMeshSource,\n} from './VectorMeshEntity';\nimport VectorShapeEntity from './VectorShapeEntity';\n\nexport const build: EntityBuilder = context => {\n const { dataset, instance } = context;\n\n const cfg = dataset.config as VectorDatasetConfig;\n const sourcesConfig = Array.isArray(cfg.source) ? cfg.source : [cfg.source];\n const sources: VectorMeshSource[] = [];\n const rendering = cfg.rendering ?? 'mesh';\n\n let entity: Entity3D;\n\n for (const sourceConfig of sourcesConfig) {\n const commonOptions: VectorMeshSourceOptions = {\n dataProjection: sourceConfig.dataProjection ?? dataset.get('dataProjection'),\n elevation: sourceConfig.elevation ?? dataset.get('elevation'),\n featureProjection: instance.referenceCrs,\n fetchElevation: sourceConfig.fetchElevation ?? dataset.get('fetchElevation'),\n fetchElevationFast:\n sourceConfig.fetchElevationFast ?? dataset.get('fetchElevationFast'),\n fetchElevationOffset:\n sourceConfig.fetchElevationOffset ?? dataset.get('fetchElevationOffset'),\n noDataValue: sourceConfig.noDataValue ?? dataset.get('noDataValue'),\n url: sourceConfig.url,\n };\n\n switch (sourceConfig.type) {\n case 'geojson':\n sources.push(\n new GeoJsonMeshSource({\n ...commonOptions,\n }),\n );\n break;\n case 'geopackage':\n sources.push(\n new GeopackageSource({\n ...commonOptions,\n }),\n );\n break;\n case 'gpx':\n sources.push(\n new GpxMeshSource({\n ...commonOptions,\n }),\n );\n break;\n case 'kml':\n sources.push(\n new KmlMeshSource({\n ...commonOptions,\n }),\n );\n break;\n case 'ol':\n sources.push(\n new OlMeshSource(sourceConfig.format, {\n ...commonOptions,\n }),\n );\n break;\n case 'shapefile':\n sources.push(\n new ShapefileSource({\n ...commonOptions,\n }),\n );\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = sourceConfig;\n return _exhaustiveCheck;\n }\n }\n }\n\n switch (rendering) {\n case 'label':\n entity = new VectorLabelsEntity(sources, cfg as VectorLabelsDatasetConfig);\n break;\n case 'mesh':\n entity = new VectorMeshEntity(sources);\n break;\n case 'shape':\n entity = new VectorShapeEntity(sources[0]);\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = rendering;\n return _exhaustiveCheck;\n }\n }\n\n return Promise.resolve(entity);\n};\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\n\nimport type { DatasetAsMeshConfig } from '@/types/configuration/datasets';\nimport type { Dataset, DatasetBase } from '@/types/Dataset';\n\n// Note that some builders have a one to one mapping to an entity, whereas other builders\n// have a N to one mapping (N dataset types map to a single entity type)\nimport * as featureCollection from './entities/FeatureCollectionEntity';\nimport * as flatPointCloud from './entities/flatPointCloud';\nimport * as tiledIfc from './entities/tiledIfc';\nimport * as tiledPointCloud from './entities/TiledPointCloudEntity';\nimport * as vector from './entities/vector';\n\nexport type BuilderContext = { dataset: Dataset; instance: Instance };\nexport type EntityBuilder = (context: BuilderContext) => Promise<Entity3D>;\n\nconst builders: Record<string, EntityBuilder> = {\n featureCollection: featureCollection.build,\n flatPointcloud: flatPointCloud.build,\n pointcloud: tiledPointCloud.build,\n tiledIfc: tiledIfc.build,\n vector: vector.build,\n};\n\n/**\n * Gets the Giro3D entity for a dataset\n * @param instance - Giro3D main instance\n * @param dataset - Dataset\n * @returns Entity\n */\nasync function getEntity(\n instance: Instance,\n dataset: Dataset & DatasetBase<DatasetAsMeshConfig>,\n): Promise<Entity3D> {\n const context: BuilderContext = {\n dataset,\n instance,\n };\n\n const builder = builders[dataset.type];\n\n if (builder == null) {\n throw new Error(`no entity builder found for dataset type '${dataset.type}'`);\n }\n\n const entity = await builder(context);\n\n if (!('dataset' in entity.object3d.userData)) {\n entity.object3d.userData.dataset = {};\n }\n\n entity.object3d.userData.dataset.name = dataset.name;\n\n return entity;\n}\n\nexport function registerEntityBuilder(datasetType: string, builder: EntityBuilder): void {\n if (builders[datasetType] != null) {\n console.warn(`replacing entity builder for dataset type '${datasetType}'`);\n }\n\n builders[datasetType] = builder;\n}\n\nexport default {\n getEntity,\n};\n","import type { PointCloudDatasetConfig } from '@/types/configuration/datasets/pointCloud';\n\nimport type { LoadDatasetFromFile } from './loader';\n\nexport const load: LoadDatasetFromFile<PointCloudDatasetConfig> = context => {\n return {\n name: context.filename,\n source: {\n type: 'csv',\n url: context.file,\n },\n type: 'flatPointcloud',\n visible: true,\n } as PointCloudDatasetConfig;\n};\n","import type { PointCloudDatasetConfig } from '@/types/configuration/datasets/pointCloud';\n\nimport type { LoadDatasetFromFile } from './loader';\n\nexport const load: LoadDatasetFromFile<PointCloudDatasetConfig> = context => {\n return {\n name: context.filename,\n source: {\n // Note that COPC files do not have a specified extension.\n // `.copc.laz` is just a convention.\n type: context.filename.endsWith('.copc.laz') ? 'copc' : 'las',\n url: context.file,\n },\n type: 'flatPointcloud',\n visible: true,\n } as PointCloudDatasetConfig;\n};\n","import type { ColorLayerDatasetConfig } from '@/types/configuration/datasets/layer';\nimport type {\n VectorDatasetRendering,\n VectorLabelsDatasetConfig,\n VectorMeshDatasetConfig,\n VectorMeshDatasetSourceConfig,\n VectorShapeDatasetConfig,\n} from '@/types/configuration/datasets/vector';\nimport type { LayerSourceConfig } from '@/types/configuration/layers';\n\nimport type { LoadDatasetFromFile } from './loader';\n\nconst loadOverlay: LoadDatasetFromFile<ColorLayerDatasetConfig> = context => {\n let fileType: LayerSourceConfig['type'];\n switch (context.extension) {\n case 'geojson':\n case 'json':\n fileType = 'geojson';\n break;\n case 'gpx':\n fileType = 'gpx';\n break;\n case 'kml':\n fileType = 'kml';\n break;\n default:\n throw new Error(`File extension '${context.extension}' not supported`);\n }\n\n return {\n name: context.filename,\n source: {\n style: 'default',\n type: fileType,\n url: context.file,\n },\n type: 'colorLayer',\n visible: true,\n } satisfies ColorLayerDatasetConfig;\n};\n\nconst loadMesh: LoadDatasetFromFile<\n VectorLabelsDatasetConfig | VectorMeshDatasetConfig | VectorShapeDatasetConfig\n> = context => {\n let fileType: VectorMeshDatasetSourceConfig['type'];\n switch (context.extension) {\n case 'geojson':\n case 'json':\n fileType = 'geojson';\n break;\n case 'gpkg':\n fileType = 'geopackage';\n break;\n case 'gpx':\n fileType = 'gpx';\n break;\n case 'kml':\n fileType = 'kml';\n break;\n default:\n throw new Error(`File extension '${context.extension}' not supported`);\n }\n\n return {\n name: context.filename,\n rendering: context.configuration.importedVectorDatasetRendering as VectorDatasetRendering,\n source: {\n fetchElevation: context.configuration.importedMeshDatasetFetchElevation ?? true,\n fetchElevationFast:\n context.configuration.importedMeshDatasetFetchElevationFast ?? false,\n type: fileType,\n url: context.file,\n },\n type: 'vector',\n visible: true,\n } satisfies VectorLabelsDatasetConfig | VectorMeshDatasetConfig | VectorShapeDatasetConfig;\n};\n\nexport const load: LoadDatasetFromFile<\n | ColorLayerDatasetConfig\n | VectorLabelsDatasetConfig\n | VectorMeshDatasetConfig\n | VectorShapeDatasetConfig\n> = context => {\n if (context.configuration.importedVectorDatasetRendering === 'overlay') {\n return loadOverlay(context);\n }\n\n return loadMesh(context);\n};\n","import type { Configuration } from '@/types/Configuration';\nimport type { DatasetConfigImportable } from '@/types/configuration/datasets';\n\nimport { Dataset } from '@/types/Dataset';\nimport { getPublicFolderUrl } from '@/utils/Configuration';\n\nimport * as csv from './csv';\nimport * as las from './las';\nimport * as vector from './vector';\n\nexport type LoadDatasetFromFile<O extends DatasetConfigImportable = DatasetConfigImportable> = (\n context: LoaderContext,\n) => O;\n\nexport type LoaderContext = {\n configuration: Configuration;\n extension: string;\n file: File | string;\n filename: string;\n};\n\nconst loaders: Record<string, LoadDatasetFromFile> = {\n csv: csv.load,\n dsv: csv.load,\n 'geo.json': vector.load,\n\n geojson: vector.load,\n gpkg: vector.load,\n gpx: vector.load,\n kml: vector.load,\n las: las.load,\n\n laz: las.load,\n tsv: csv.load,\n};\n\n/**\n * Gets the filename and extension from a File or URL\n *\n * @param fileOrUrl - File or URL\n * @returns File name and extension\n */\nfunction getLoaderContext(fileOrUrl: File | string, config: Configuration): LoaderContext {\n if (typeof fileOrUrl === 'string') {\n const absoluteUrl = getPublicFolderUrl(fileOrUrl);\n const url = new URL(absoluteUrl);\n const baseUrl = `${url.origin}${url.pathname}`;\n const parts = baseUrl.split('/');\n const filename = parts.pop();\n\n if (filename == null) {\n throw new Error('Could not determine filename');\n }\n\n const extension = filename.split('.').at(-1);\n\n if (extension == null) {\n throw new Error(`File has no extension: ${filename}`);\n }\n\n return {\n configuration: config,\n extension,\n file: fileOrUrl,\n filename,\n };\n }\n\n if (fileOrUrl.name == null) {\n throw new Error('Could not determine filename');\n }\n\n const extension = fileOrUrl.name.split('.').at(-1);\n\n if (extension == null) {\n throw new Error(`File has no extension: ${fileOrUrl.name}`);\n }\n\n return {\n configuration: config,\n extension,\n file: fileOrUrl,\n filename: fileOrUrl.name,\n };\n}\n\n/**\n * Loads a file and creates its Dataset.\n *\n * @param fileOrUrl - File to load\n * @returns Created objects\n * @throws `Error` if file cannot be imported (unsupported, etc.)\n */\nasync function importFile(\n fileOrUrl: File | string,\n config: Readonly<Configuration>,\n): Promise<Dataset> {\n const context = getLoaderContext(fileOrUrl, config);\n\n const loader = selectLoader(context.filename);\n\n if (loader == null) {\n throw new Error(`File format ${context.extension} not supported`);\n }\n\n const datasetConfig: DatasetConfigImportable = loader(context);\n\n // Reserve promise usage for future (e.g. autodetecting format based on content, etc.)\n return Promise.resolve(new Dataset(datasetConfig));\n}\n\nfunction selectLoader(filename: string): LoadDatasetFromFile | null {\n const keys = Object.keys(loaders);\n\n for (const key of keys) {\n // Note that we use suffix-based checking rather than pure file extensions because\n // some files have \"double\" extensions, such as \".geo.json\", or \".copc.laz\",\n // where technically the extension is just \".json\" or \".laz\".\n if (filename.endsWith(key)) {\n return loaders[key];\n }\n }\n\n return null;\n}\n\n/**\n * Registers a custom loader for a specific file extension.\n * If a loader for the same extension exists, it is replaced by the new one.\n * @param fileExtension - The file extension, without the dot.\n * @param loader - The loader to use.\n */\nexport function registerLoader(fileExtension: string, loader: LoadDatasetFromFile): void {\n if (loaders[fileExtension] != null) {\n console.warn(`replacing loader for file extension '.${fileExtension}'`);\n }\n\n loaders[fileExtension] = loader;\n}\n\nexport default {\n importFile,\n};\n","import type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type Shape from '@giro3d/giro3d/entities/Shape';\nimport type { ShapePickResult } from '@giro3d/giro3d/entities/Shape';\n\nimport { isShapePickResult } from '@giro3d/giro3d/entities/Shape';\nimport { Color } from 'three';\n\nimport type { MeasureUserData } from '@/giro3d/Measure3D';\nimport type { PieroShapeUserData } from '@/types/Annotation';\n\nexport type ClearHighlightFn = () => void;\nexport type HighlightFn = (obj: PickResult) => ClearHighlightFn | null;\n\nexport const customHighlighters: HighlightFn[] = [];\n\nexport default class Highlighter {\n private _clearHighlight: (() => void) | null = null;\n\n public clear(): void {\n if (this._clearHighlight) {\n this._clearHighlight();\n this._clearHighlight = null;\n }\n }\n\n public dispose(): void {\n this.clear();\n }\n\n public highlightFromPick(pick: PickResult): void {\n this.clear();\n\n if (!pick.entity) {\n return;\n }\n\n if (isShapePickResult(pick)) {\n this.highlightShape(pick);\n }\n\n for (const highlighter of customHighlighters) {\n const clearHighlight = highlighter(pick);\n if (clearHighlight) {\n this._clearHighlight = clearHighlight;\n }\n }\n }\n\n private highlightShape(pick: ShapePickResult): void {\n const shape = pick.entity as Shape<MeasureUserData | PieroShapeUserData>;\n\n if (shape.userData.highlightable) {\n const previousColor = new Color(shape.color);\n shape.color = shape.userData.highlightColor;\n shape.instance.notifyChange();\n\n this._clearHighlight = (): void => {\n shape.color = previousColor;\n shape.instance.notifyChange();\n };\n }\n }\n}\n","import { type Component } from 'vue';\n\nimport type { HighlightFn } from '@/services/Highlighter';\nimport type { AttributeExtractorFn } from '@/services/Picker';\nimport type { DatasetStore } from '@/stores/datasets';\nimport type { DatasetOrGroup } from '@/types/Dataset';\n\nimport { datasetIcons, datasetTitles, propertyViews } from '@/components/Configuration';\nimport { type EntityBuilder, registerEntityBuilder } from '@/giro3d/EntityBuilder';\nimport { type LoadDatasetFromFile, registerLoader } from '@/loaders/loader';\nimport { customHighlighters } from '@/services/Highlighter';\nimport { customAttributeExtractors } from '@/services/Picker';\n\nexport type DatasetActionRegistrationParams = {\n /**\n * The action to execute on the dataset.\n */\n action: (dataset: DatasetOrGroup) => void;\n /**\n * The icon to display for the action.\n */\n icon: string;\n /**\n * If true, the action becomes available only when the dataset is pre-loaded.\n */\n mustBePreloaded?: boolean;\n /**\n * If true, the action becomes available only when the dataset is visible.\n */\n mustBeVisible?: boolean;\n /**\n * A predicate to filter on which datasets this action applies. By default it applies to all datasets.\n */\n predicate?: (dataset: DatasetOrGroup) => boolean;\n /**\n * The title of the button.\n */\n title: string;\n};\n\n/**\n * Parameters to register a new Dataset type.\n */\nexport type DatasetRegistrationParams = {\n /**\n * Custom function to extract attribute from a picked object.\n */\n attributeExtractor?: AttributeExtractorFn;\n /**\n * The function to build an entity from a dataset.\n */\n entityBuilder: EntityBuilder;\n /**\n * The list of supported extensions (without the leading dot). When a file with a supported extension is imported,\n * the appropriate loader will be used. If undefined, this dataset cannot be imported\n * from a local file (for example by drag and drop).\n * @example ['csv', 'dsv', 'tsv']\n */\n fileExtensions?: string[];\n /**\n * Custom highlighter for this dataset.\n */\n highlight?: HighlightFn;\n /**\n * The optional icon to use\n * @example 'bi-building'\n */\n icon?: string;\n /**\n * The function to load a dataset from a file, if supported.\n */\n loader?: LoadDatasetFromFile;\n /**\n * The dataset display name.\n * @example 'IFC\n */\n name?: string;\n /**\n * An optional custom property view.\n */\n propertyView?: Component;\n};\n\n/** @internal */\nexport class DatasetApiImpl implements DatasetApi {\n public constructor(private readonly store: DatasetStore) {}\n\n public registerDatasetAction(params: DatasetActionRegistrationParams): void {\n this.store.registerCustomAction(params);\n }\n\n public registerDatasetType(datasetType: string, params: DatasetRegistrationParams): void {\n if (params.icon != null) {\n datasetIcons[datasetType] = params.icon;\n }\n if (params.name != null) {\n datasetTitles[datasetType] = params.name;\n }\n if (params.highlight) {\n customHighlighters.push(params.highlight);\n }\n\n registerEntityBuilder(datasetType, params.entityBuilder);\n\n if (params.fileExtensions) {\n if (params.loader == null) {\n console.warn(\n `File extensions have been specified for dataset ${datasetType}, but no loader function has been provided.`,\n );\n } else {\n for (const extension of params.fileExtensions) {\n registerLoader(extension, params.loader);\n }\n }\n }\n\n if (params.propertyView) {\n propertyViews.set(datasetType, params.propertyView);\n }\n\n if (params.attributeExtractor) {\n customAttributeExtractors.push(params.attributeExtractor);\n }\n }\n}\n\n/**\n * APIs to manipulate datasets.\n */\nexport default interface DatasetApi {\n registerDatasetAction(params: DatasetActionRegistrationParams): void;\n /**\n * Register a new dataset type.\n */\n registerDatasetType(\n /**\n * The unique key to identify this dataset type.\n * @example 'ifc'\n */\n key: string,\n params: DatasetRegistrationParams,\n ): void;\n}\n","import type { NotificationStore } from '@/stores/notifications';\nimport type Notification from '@/types/Notification';\n\nexport class NotificationApiImpl implements NotificationApi {\n public constructor(private readonly store: NotificationStore) {}\n\n public pushNotification(notification: Notification): void {\n this.store.push(notification);\n }\n}\n\nexport default interface NotificationApi {\n pushNotification(notification: Notification): void;\n}\n","import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n\nimport type { SearchStore } from '@/stores/search';\n\nexport interface LocationSearchResult extends SearchResult {\n coordinates: Coordinates;\n}\n\nexport interface SearchApi {\n registerProvider(provider: SearchProvider): void;\n}\n\nexport interface SearchProvider<T extends SearchResult = SearchResult> {\n /**\n * The name of the provider, as displayed in the search results.\n */\n name: string;\n /**\n * Executes a search for the specified query string.\n */\n search(query: string): Promise<T[]>;\n}\n\nexport interface SearchResult {\n /**\n * The label to display in the search results.\n */\n label: string;\n /**\n * The search provider used to perform the search.\n */\n provider: SearchProvider;\n}\n\nexport class SearchApiImpl implements SearchApi {\n public constructor(private readonly searchStore: SearchStore) {}\n\n public registerProvider(provider: SearchProvider): void {\n this.searchStore.registerProvider(provider);\n }\n}\n\nexport function isLocationSearchResult(result: SearchResult): result is LocationSearchResult {\n return (result as LocationSearchResult).coordinates instanceof Coordinates;\n}\n","import type { Component } from 'vue';\n\nimport type { PieroContext } from '@/context';\nimport type { WidgetStore } from '@/stores/widgets';\n\nexport interface Widget {\n component: Component<{ context: PieroContext }>;\n id: string;\n}\n\nexport class WidgetApiImpl implements WidgetApi {\n public constructor(private readonly store: WidgetStore) {}\n\n public addWidget(widget: Widget): void {\n this.store.addWidget(widget);\n }\n}\n\nexport default interface WidgetApi {\n addWidget(widget: Widget): void;\n}\n","import { EventDispatcher } from 'three';\n\nimport type Bookmark from './types/Bookmark';\nimport type { DatasetOrGroup } from './types/Dataset';\n\nexport interface BookmarkEvents {\n 'bookmark-added': PayloadEvent<Bookmark>;\n 'bookmark-removed': PayloadEvent<Bookmark>;\n}\n\nexport interface DatasetEvents {\n 'dataset-added': PayloadEvent<DatasetOrGroup>;\n 'dataset-removed': PayloadEvent<DatasetOrGroup>;\n 'dataset-visibility-changed': PayloadEvent<DatasetOrGroup>;\n}\n\n/**\n * An event with a payload.\n */\nexport type PayloadEvent<T> = { value: T };\n\n/**\n * An event with no argument.\n */\nexport type PieroEmptyEvent = unknown;\n\nexport type PieroEvents = BookmarkEvents & DatasetEvents & PieroGlobalEvents & ViewEvents;\n\nexport interface PieroGlobalEvents {\n /**\n * Raised when the application has finished loading.\n */\n ready: PieroEmptyEvent;\n}\n\nexport interface ViewEvents {\n /**\n * Raised when the main view has been updated.\n */\n updated: PieroEmptyEvent;\n}\n\nexport const GLOBAL_EVENT_DISPATCHER = new EventDispatcher<PieroEvents>();\n","import { defineStore } from 'pinia';\nimport { computed, reactive, ref } from 'vue';\n\nimport type Annotation from '@/types/Annotation';\nimport type AnnotationMode from '@/types/AnnotationMode';\n\nexport const useAnnotationStore = defineStore('annotations', () => {\n const annotations = reactive<Annotation[]>([]) as Annotation[];\n const annotationMode = ref<AnnotationMode>('normal');\n const count = computed(() => annotations.length);\n const _isUserDrawing = ref<boolean>(false);\n const _showLabels = ref<boolean>(true);\n\n function isUserDrawing(): boolean {\n return _isUserDrawing.value;\n }\n\n function showLabels(): boolean {\n return _showLabels.value;\n }\n\n function setShowLabels(v: boolean): void {\n _showLabels.value = v;\n }\n\n function setIsUserDrawing(value: boolean): void {\n _isUserDrawing.value = value;\n }\n\n function getAnnotationMode(): AnnotationMode {\n return annotationMode.value;\n }\n\n function setAnnotationMode(mode: AnnotationMode): void {\n annotationMode.value = mode;\n }\n\n function getAnnotations(): Annotation[] {\n return annotations;\n }\n\n function remove(annotation: Annotation): void {\n annotations.splice(annotations.indexOf(annotation), 1);\n }\n\n function createPoint(): void {\n // Nothing to do.\n }\n\n function createLine(): void {\n // Nothing to do.\n }\n\n function createPolygon(): void {\n // Nothing to do.\n }\n\n function add(annotation: Annotation): void {\n annotations.push(annotation);\n }\n\n function hasAnnotation(name: string): boolean {\n return annotations.some(m => m.title === name);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function edit(annotation: Annotation): void {\n // Nothing to do.\n }\n\n function stopEdition(): void {\n // Nothing to do.\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importAnnotationFile(file: Blob): void {\n // Nothing to do\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importAnnotationsFiles(files: File[]): void {\n // Nothing to do\n }\n\n return {\n add,\n count,\n createLine,\n createPoint,\n createPolygon,\n edit,\n getAnnotationMode,\n getAnnotations,\n hasAnnotation,\n importAnnotationFile,\n importAnnotationsFiles,\n isUserDrawing,\n remove,\n setAnnotationMode,\n setIsUserDrawing,\n setShowLabels,\n showLabels,\n stopEdition,\n };\n});\n","import { defineStore } from 'pinia';\n\nimport type Notification from '@/types/Notification';\n\nexport const useNotificationStore = defineStore('notifications', () => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function push(notification: Notification): void {\n // Nothing to store.\n // We rely on automatic event by Pinia to notify listener about the notification.\n }\n\n return { push };\n});\n\nexport type NotificationStore = ReturnType<typeof useNotificationStore>;\n","import type Shape from '@giro3d/giro3d/entities/Shape';\nimport type { ColorRepresentation } from 'three';\n\nimport { EventDispatcher, MathUtils } from 'three';\n\nimport Download from '@/utils/Download';\n\ntype AnnotationEventMap = {\n isEditing: EmptyEvent;\n visible: EmptyEvent;\n};\n\ntype EmptyEvent = {\n /** empty */\n};\n\nexport type PieroShapeUserData = {\n annotation?: Annotation;\n highlightable: boolean;\n highlightColor: ColorRepresentation;\n measurements: {\n area?: number | null;\n minmax: [number, number];\n perimeter?: number | null;\n };\n type: 'LineString' | 'MultiPoint' | 'Point' | 'Polygon';\n};\n\nexport default class Annotation extends EventDispatcher<AnnotationEventMap> {\n public properties: object;\n public readonly title: string;\n public readonly uuid: string;\n public get isEditing(): boolean {\n return this._isEditing;\n }\n public set isEditing(v: boolean) {\n this._isEditing = v;\n this.dispatchEvent({ type: 'isEditing' });\n }\n public get object(): Shape<PieroShapeUserData> {\n return this._object();\n }\n\n public get visible(): boolean {\n return this._visible;\n }\n\n public set visible(v: boolean) {\n this._visible = v;\n this.dispatchEvent({ type: 'visible' });\n }\n\n private _isEditing: boolean;\n\n private _object: () => Shape<PieroShapeUserData>;\n\n private _visible: boolean;\n\n public constructor(\n title: string,\n object: () => Shape<PieroShapeUserData>,\n properties: object = {},\n ) {\n super();\n\n this.title = title;\n this._visible = true;\n this._isEditing = false;\n this._object = object;\n this.properties = properties;\n this.uuid = MathUtils.generateUUID();\n }\n\n public static toCollection(annotations: Annotation[]): GeoJSON.FeatureCollection {\n const features = annotations.map(annotation => annotation.toGeoJSON());\n\n return {\n features,\n type: 'FeatureCollection',\n // @ts-expect-error GeoJSON spec does not allow properties on FeatureCollection\n // But OWC requires it Oo\n id: `${Download.getBaseUrl()}#${MathUtils.generateUUID()}`,\n properties: {\n creator: 'Giro3D',\n generator: {\n title: 'Giro3D',\n uri: Download.getBaseUrl(),\n },\n lang: 'en',\n links: [\n {\n href: 'http://www.opengis.net/spec/owc-atom/1.0/req/core',\n rel: 'profile',\n title: 'This file is compliant with version 1.0 of OGC Context',\n },\n ],\n title: 'Giro3D annotations',\n updated: new Date().toISOString(),\n },\n };\n }\n\n public toGeoJSON(): GeoJSON.Feature {\n const geojson = this.object.toGeoJSON({\n includeAltitudes: true,\n });\n\n geojson.id = `${Download.getBaseUrl()}#${this.uuid}`;\n geojson.properties = {\n ...geojson.properties,\n title: this.title,\n updated: new Date().toISOString(),\n };\n\n return geojson;\n }\n}\n","export type NotificationLevel = 'error' | 'info' | 'success' | 'warning';\n\nexport default class Notification {\n public readonly level: NotificationLevel;\n public readonly text: string;\n public readonly title: string;\n\n public constructor(title: string, text: string, level: NotificationLevel = 'info') {\n this.title = title;\n this.text = text;\n this.level = level;\n }\n\n public static empty(): Notification {\n return new Notification('', '', 'info');\n }\n}\n","import type Shape from '@giro3d/giro3d/entities/Shape';\nimport type { Vector3 } from 'three';\n\nfunction getMinMaxAltitudes(coordsOrDrawing: Shape | Vector3[]): [number, number] {\n let min = +Infinity;\n let max = -Infinity;\n\n let points: Readonly<Vector3[]>;\n\n if (Array.isArray(coordsOrDrawing)) {\n points = coordsOrDrawing;\n } else {\n points = coordsOrDrawing.points;\n }\n\n for (let i = 0; i < points.length; i += 1) {\n min = Math.min(min, points[i].z);\n max = Math.max(max, points[i].z);\n }\n\n return [min, max];\n}\n\nexport default {\n getMinMaxAltitudes,\n};\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type {\n SegmentLabelFormatter,\n SurfaceLabelFormatter,\n VertexLabelFormatter,\n} from '@giro3d/giro3d/entities/Shape';\nimport type { CreationOptions } from '@giro3d/giro3d/interactions/DrawTool';\nimport type View from '@giro3d/giro3d/renderer/View';\nimport type { Position } from 'geojson';\nimport type { Vector2 } from 'three';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport { isMapPickResult } from '@giro3d/giro3d/core/picking/PickTilesAt';\nimport Shape, { isShapePickResult } from '@giro3d/giro3d/entities/Shape';\nimport DrawTool, {\n afterRemovePointOfRing,\n afterUpdatePointOfRing,\n inhibitHook,\n limitRemovePointHook,\n} from '@giro3d/giro3d/interactions/DrawTool';\nimport { MathUtils, Vector3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\nimport type Picker from '@/services/Picker';\nimport type { PieroShapeUserData } from '@/types/Annotation';\n\nimport { DEFAULT_SHAPE_COLOR, EDIT_SHAPE_COLOR, SHAPE_POINT_RADIUS } from '@/constants';\nimport { useAnnotationStore } from '@/stores/annotations';\nimport { useNotificationStore } from '@/stores/notifications';\nimport Annotation from '@/types/Annotation';\nimport Notification from '@/types/Notification';\nimport Measure from '@/utils/Measure';\n\nfunction promptTitle(defaultValue: string): string | null {\n return window.prompt('Annotation name', defaultValue);\n}\n\nconst numberFormat = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 1,\n});\n\nconst areaFormatter: SurfaceLabelFormatter = values => {\n let area = values.area;\n\n let unit = 'm²';\n if (area > 1_000_000) {\n area = area / 1_000_000;\n unit = 'km²';\n }\n\n return `${numberFormat.format(area)} ${unit}`;\n};\n\nconst tmpStart = new Vector3();\nconst tmpEnd = new Vector3();\n\nconst lengthFormatter: (view: View) => SegmentLabelFormatter = (view: View) => values => {\n const { camera } = view;\n const { end, start } = values;\n\n const ndcStart = tmpStart.copy(start).project(camera);\n const ndcEnd = tmpEnd.copy(end).project(camera);\n\n const sqLimit = Math.pow(100 / view.width, 2); // pixels\n\n const distanceOnScreen = ndcStart.distanceToSquared(ndcEnd);\n\n // Don't display the label if the segment is too short on the screen\n if (distanceOnScreen < sqLimit) {\n return null;\n }\n\n let length = values.length;\n\n if (length == null || length <= 0) {\n return null;\n }\n\n let unit = 'm';\n if (length > 1_000) {\n length = length / 1_000;\n unit = 'km';\n }\n\n return `${numberFormat.format(length)} ${unit}`;\n};\n\nconst pointFormatter: VertexLabelFormatter = values => {\n const shape = values.shape as Shape<PieroShapeUserData>;\n if (shape.userData.annotation) {\n return shape.userData.annotation.title;\n }\n\n return null;\n};\n\nexport default class AnnotationManager {\n private readonly _boundExitEdition: (e: MouseEvent) => void;\n private readonly _boundOnEndDrag: () => void;\n private readonly _boundOnKeyDown: (e: KeyboardEvent) => void;\n private readonly _boundOnStartDrag: () => void;\n private readonly _boundUpdateLabels: () => void;\n private readonly _drawTool: DrawTool;\n private _editedShape: Shape<PieroShapeUserData> | null = null;\n private _editedShapePreviousPoints: Vector3[] | null = null;\n private readonly _instance: Instance;\n private _isEditing = false;\n private readonly _notificationStore = useNotificationStore();\n\n private readonly _picker: Picker;\n private readonly _shapes: Map<string, Shape<PieroShapeUserData>> = new Map();\n private readonly _store = useAnnotationStore();\n\n public constructor(instance: Instance, camera: CameraController, picker: Picker) {\n this._instance = instance;\n this._picker = picker;\n this._drawTool = new DrawTool({ instance });\n\n // FIXME this would override whatever setting is currently\n // present (depending on navigation modes)\n this._boundOnEndDrag = (): void => {\n camera.enabled = true;\n };\n this._boundOnStartDrag = (): void => {\n camera.enabled = false;\n };\n\n this._boundUpdateLabels = this.updateLabels.bind(this);\n this._boundExitEdition = (): void => {\n this._instance.domElement.removeEventListener('contextmenu', this._boundExitEdition);\n this.stopEdition(false);\n };\n\n // We want to prevent moving the camera while dragging a point\n this._drawTool.addEventListener('start-drag', this._boundOnStartDrag);\n this._drawTool.addEventListener('end-drag', this._boundOnEndDrag);\n\n this._boundOnKeyDown = this.onKeyDown.bind(this);\n document.addEventListener('keydown', this._boundOnKeyDown);\n\n this._instance.addEventListener('after-camera-update', this._boundUpdateLabels);\n\n this._store.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'createLine':\n this.drawLine();\n break;\n case 'createPoint':\n this.drawPoint();\n break;\n case 'createPolygon':\n this.drawPolygon();\n break;\n case 'edit':\n this.editAnnotation(args[0]);\n break;\n case 'importAnnotationFile':\n void this.importAnnotationFile(args[0]);\n break;\n case 'importAnnotationsFiles':\n void this.importAnnotationFiles(args[0]);\n break;\n case 'remove':\n this.deleteAnnotation(args[0]);\n break;\n case 'setShowLabels':\n this.udpateLabelVisibility(args[0]);\n break;\n case 'stopEdition':\n this.stopEdition(false);\n break;\n }\n });\n });\n }\n\n public dispose(): void {\n document.removeEventListener('keydown', this._boundOnKeyDown);\n\n this._drawTool.removeEventListener('start-drag', this._boundOnStartDrag);\n this._drawTool.removeEventListener('end-drag', this._boundOnEndDrag);\n\n this._instance.removeEventListener('after-camera-update', this._boundUpdateLabels);\n\n this._shapes.forEach(shape => this._instance.remove(shape));\n this._drawTool.dispose();\n }\n\n public pushNewAnnotation(\n title: string,\n shape: Shape<PieroShapeUserData>,\n properties: object = {},\n ): Annotation {\n const annotation = new Annotation(title, () => shape, properties);\n shape.userData.annotation = annotation;\n annotation.addEventListener('visible', () => this.updateDrawing(annotation));\n this._store.add(annotation);\n this._shapes.set(annotation.uuid, shape);\n return annotation;\n }\n\n private addShape(\n shape: Shape<PieroShapeUserData> | null,\n type: PieroShapeUserData['type'],\n defaultName: string,\n ): void {\n if (shape && !this._shapes.has(shape.id)) {\n const userData = shape.userData;\n userData.type = type;\n userData.highlightable = true;\n\n let title = defaultName;\n if (this._store.hasAnnotation(title)) {\n for (let i = 1; i < 1000; i += 1) {\n title = `${defaultName} (${i})`;\n if (!this._store.hasAnnotation(title)) {\n break;\n }\n }\n if (this._store.hasAnnotation(title)) {\n title = 'Achievement unlocked: 1000 annotations with default name';\n }\n }\n const name = promptTitle(title);\n if (name != null) {\n this.computeMeasurements(shape);\n const annotation = this.pushNewAnnotation(name, shape);\n\n this._shapes.set(annotation.uuid, shape);\n } else {\n this._instance.remove(shape);\n }\n }\n }\n\n private computeMeasurements(shape: Shape<PieroShapeUserData>): void {\n shape.userData.measurements = {\n minmax: Measure.getMinMaxAltitudes(shape),\n };\n\n if (shape.userData.type === 'Polygon' || shape.userData.type === 'LineString') {\n shape.userData.measurements.perimeter = shape.getLength();\n }\n if (shape.userData.type === 'Polygon') {\n shape.userData.measurements.area = shape.getArea();\n }\n }\n\n private deleteAnnotation(annotation: Annotation): void {\n if (this._shapes.has(annotation.uuid)) {\n const shape = annotation.object;\n this._instance.remove(shape);\n this._shapes.delete(annotation.uuid);\n }\n }\n\n private draw(\n drawFn: 'createLineString' | 'createPoint' | 'createPolygon',\n type: PieroShapeUserData['type'],\n defaultName: string,\n opts: Partial<CreationOptions>,\n ): void {\n this._store.setIsUserDrawing(true);\n\n void this._drawTool[drawFn]({\n ...this.getCreationOptions(),\n ...opts,\n })\n .then(shape => {\n this.addShape(shape as Shape<PieroShapeUserData>, type, defaultName);\n })\n .finally(() => this._store.setIsUserDrawing(false));\n }\n\n private drawLine(): void {\n this.draw('createLineString', 'LineString', 'New line annotation', {\n segmentLabelFormatter: lengthFormatter(this._instance.view),\n showSegmentLabels: this._store.showLabels(),\n });\n }\n\n private drawPoint(): void {\n this.draw('createPoint', 'Point', 'New point annotation', {\n borderWidth: 3,\n showVertexLabels: this._store.showLabels(),\n vertexLabelFormatter: pointFormatter,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n }\n\n private drawPolygon(): void {\n this.draw('createPolygon', 'Polygon', 'New polygon annotation', {\n showSurfaceLabel: this._store.showLabels(),\n surfaceLabelFormatter: areaFormatter,\n });\n }\n\n private editAnnotation(annotation: Annotation): void {\n const shape = this._shapes.get(annotation.uuid);\n\n if (!shape) {\n console.warn(`no shape found for annotation ${annotation.uuid}`);\n return;\n }\n\n this._editedShape = shape;\n this._editedShapePreviousPoints = [...shape.points];\n\n annotation.isEditing = true;\n\n shape.color = EDIT_SHAPE_COLOR;\n shape.userData.highlightable = false;\n\n this._instance.notifyChange(shape);\n\n this._store.setIsUserDrawing(true);\n\n this._instance.domElement.addEventListener('contextmenu', this._boundExitEdition);\n\n this._isEditing = true;\n this._drawTool.enterEditMode({\n pick: this.pick.bind(this),\n shapesToEdit: [shape],\n });\n }\n\n private filterPickResults(results: PickResult[], edition: boolean): PickResult[] {\n if (!edition) {\n // Avoid picking shapes in creation mode\n return results.filter(res => !isShapePickResult(res));\n }\n\n return results;\n }\n\n private getCreationOptions(): CreationOptions {\n return {\n color: DEFAULT_SHAPE_COLOR,\n pick: this.pick.bind(this),\n };\n }\n\n private async importAnnotation(\n feature: GeoJSON.Feature,\n skipNames: Set<string>,\n ): Promise<boolean> {\n if (feature.properties == null || typeof feature.properties !== 'object') {\n feature.properties = {};\n }\n if (feature.properties.title == null) {\n feature.properties.title = MathUtils.generateUUID();\n }\n\n if (skipNames.has(feature.properties.title)) {\n return false;\n }\n\n const shape = await this.importShapeFromGeoJSON(feature);\n this.pushNewAnnotation(feature.properties.title, shape, feature.properties);\n return true;\n }\n\n private async importAnnotationFile(file: Blob): Promise<void> {\n const existingAnnotations = new Set(this._store.getAnnotations().map(m => m.title));\n try {\n const { nbImported, nbSkipped } = await this.importBlob(file, existingAnnotations);\n this._notificationStore.push(\n new Notification(\n 'Annotations',\n `${nbImported} annotations imported (${nbSkipped} skipped)`,\n 'success',\n ),\n );\n } catch (e: unknown) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n new Notification('Annotations', `Could not import file: ${e}`, 'warning');\n }\n }\n\n private async importAnnotationFiles(files: File[]): Promise<void> {\n const promises = [];\n let nbTotalImported = 0;\n let nbTotalSkipped = 0;\n const errors: string[] = [];\n\n const existingAnnotations = new Set(this._store.getAnnotations().map(m => m.title));\n\n for (const file of files) {\n promises.push(\n this.importBlob(file, existingAnnotations)\n .then(({ nbImported, nbSkipped }) => {\n nbTotalImported += nbImported;\n nbTotalSkipped += nbSkipped;\n })\n .catch(reason => {\n errors.push((reason as Error).message);\n }),\n );\n }\n await Promise.allSettled(promises);\n\n if (errors.length > 0) {\n this._notificationStore.push(\n new Notification(\n 'Annotations',\n `${nbTotalImported} annotations imported (${nbTotalSkipped} skipped); ${errors.length} errors: ${errors}`,\n 'warning',\n ),\n );\n } else {\n this._notificationStore.push(\n new Notification(\n 'Annotations',\n `${nbTotalImported} annotations imported (${nbTotalSkipped} skipped)`,\n 'success',\n ),\n );\n }\n }\n\n private async importBlob(\n file: Blob,\n skipNames: Set<string>,\n ): Promise<{ nbImported: number; nbSkipped: number }> {\n const str = await file.text();\n const geojson = JSON.parse(str) as GeoJSON.Feature | GeoJSON.FeatureCollection;\n\n const features = geojson.type === 'FeatureCollection' ? geojson.features : [geojson];\n\n let nbImported = 0;\n let nbSkipped = 0;\n\n for (const feature of features) {\n const imported = await this.importAnnotation(feature, skipNames);\n if (imported) {\n nbImported++;\n } else {\n nbSkipped++;\n }\n }\n return { nbImported, nbSkipped };\n }\n\n // Note this was directly imported from the drawtool example\n // We might want to make it part of the Shape API, but we have to think\n // about potential pitfalls as there is not a single mapping between GeoJSON and Shapes.\n private async importShapeFromGeoJSON(\n feature: GeoJSON.Feature,\n ): Promise<Shape<PieroShapeUserData>> {\n if (feature.type !== 'Feature') {\n throw new Error('not a valid GeoJSON feature');\n }\n\n const crs = 'EPSG:4326';\n\n const getPoint = (c: Position): Vector3 => {\n const coord = new Coordinates(crs, c[0], c[1], c[2] ?? 0);\n return coord.as(this._instance.referenceCrs, coord).toVector3();\n };\n\n let result: Shape<PieroShapeUserData>;\n\n switch (feature.geometry.type) {\n case 'LineString':\n result = new Shape<PieroShapeUserData>({\n beforeRemovePoint: limitRemovePointHook(2),\n color: DEFAULT_SHAPE_COLOR,\n segmentLabelFormatter: lengthFormatter(this._instance.view),\n showLine: true,\n showSegmentLabels: true,\n showVertexLabels: false,\n showVertices: true,\n });\n result.setPoints(feature.geometry.coordinates.map(getPoint));\n break;\n case 'MultiPoint':\n result = new Shape<PieroShapeUserData>({\n beforeRemovePoint: limitRemovePointHook(1),\n color: DEFAULT_SHAPE_COLOR,\n showLine: false,\n showVertexLabels: true,\n showVertices: true,\n vertexLabelFormatter: pointFormatter,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n result.setPoints(feature.geometry.coordinates.map(getPoint));\n break;\n case 'Point':\n result = new Shape<PieroShapeUserData>({\n beforeRemovePoint: inhibitHook,\n color: DEFAULT_SHAPE_COLOR,\n showLine: false,\n showVertexLabels: true,\n showVertices: true,\n vertexLabelFormatter: pointFormatter,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n result.setPoints([getPoint(feature.geometry.coordinates)]);\n break;\n case 'Polygon':\n result = new Shape<PieroShapeUserData>({\n afterRemovePoint: afterRemovePointOfRing,\n afterUpdatePoint: afterUpdatePointOfRing,\n beforeRemovePoint: limitRemovePointHook(4), // We take into account the doubled first/last point\n color: DEFAULT_SHAPE_COLOR,\n showLine: true,\n showSurface: true,\n showSurfaceLabel: true,\n showVertexLabels: false,\n showVertices: true,\n surfaceLabelFormatter: areaFormatter,\n });\n result.setPoints(feature.geometry.coordinates[0].map(getPoint));\n break;\n default:\n throw new Error(\n 'could not import shape from given GeoJSON geometry: ' + feature.geometry.type,\n );\n }\n\n this.computeMeasurements(result);\n\n await this._instance.add(result);\n\n return result;\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n if (e.code === 'Escape') {\n this.stopEdition(true);\n }\n }\n\n private pick(event: MouseEvent | Vector2): PickResult[] {\n let results: PickResult[];\n\n switch (this._store.getAnnotationMode()) {\n case 'mapOnly':\n results = this.pickMap(event);\n break;\n case 'normal':\n results = this.pickDefault(event);\n break;\n case 'objectsOnly':\n results = this.pickFeatures(event);\n break;\n }\n\n return results;\n }\n\n private pickDefault(event: MouseEvent | Vector2): PickResult[] {\n const results = this._instance.pickObjectsAt(event, { sortByDistance: true });\n\n return this.filterPickResults(results, this._isEditing);\n }\n\n private pickFeatures(event: MouseEvent | Vector2): PickResult[] {\n const results = this._picker.getObjectsAt(this._instance, event, 0) ?? [];\n\n return this.filterPickResults(results, this._isEditing);\n }\n\n private pickMap(event: MouseEvent | Vector2): PickResult[] {\n const results = this._instance.pickObjectsAt(event, {\n filter: res => isShapePickResult(res) || isMapPickResult(res),\n sortByDistance: true,\n });\n\n return this.filterPickResults(results, this._isEditing);\n }\n\n private stopEdition(restoreShape: boolean): void {\n this._drawTool.exitEditMode();\n this._isEditing = false;\n this._store.setIsUserDrawing(false);\n\n if (this._editedShape) {\n if (restoreShape && this._editedShapePreviousPoints) {\n this._editedShape.setPoints(this._editedShapePreviousPoints);\n this._editedShapePreviousPoints = null;\n }\n if (this._editedShape.userData.annotation != null) {\n this._editedShape.userData.annotation.isEditing = false;\n }\n this._editedShape.color = DEFAULT_SHAPE_COLOR;\n this._editedShape.userData.highlightable = true;\n this._editedShape = null;\n }\n }\n\n private udpateLabelVisibility(show: boolean): void {\n this._shapes.forEach(shape => {\n switch (shape.userData.type) {\n case 'LineString':\n shape.showSegmentLabels = show;\n break;\n case 'MultiPoint':\n case 'Point':\n shape.showVertexLabels = show;\n break;\n case 'Polygon':\n shape.showSurfaceLabel = show;\n break;\n }\n });\n }\n\n private updateDrawing(annotation: Annotation): void {\n annotation.object.visible = annotation.visible;\n annotation.object.traverse(o => (o.visible = annotation.visible));\n this._instance.notifyChange();\n }\n\n private updateLabels(): void {\n this._shapes.forEach(shape => {\n if (shape.visible) {\n shape.rebuildLabels();\n }\n });\n }\n}\n","/*!\n * camera-controls\n * https://github.com/yomotsu/camera-controls\n * (c) 2017 @yomotsu\n * Released under the MIT License.\n */\n// see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#value\nconst MOUSE_BUTTON = {\n LEFT: 1,\n RIGHT: 2,\n MIDDLE: 4,\n};\nconst ACTION = Object.freeze({\n NONE: 0b0,\n ROTATE: 0b1,\n TRUCK: 0b10,\n SCREEN_PAN: 0b100,\n OFFSET: 0b1000,\n DOLLY: 0b10000,\n ZOOM: 0b100000,\n TOUCH_ROTATE: 0b1000000,\n TOUCH_TRUCK: 0b10000000,\n TOUCH_SCREEN_PAN: 0b100000000,\n TOUCH_OFFSET: 0b1000000000,\n TOUCH_DOLLY: 0b10000000000,\n TOUCH_ZOOM: 0b100000000000,\n TOUCH_DOLLY_TRUCK: 0b1000000000000,\n TOUCH_DOLLY_SCREEN_PAN: 0b10000000000000,\n TOUCH_DOLLY_OFFSET: 0b100000000000000,\n TOUCH_DOLLY_ROTATE: 0b1000000000000000,\n TOUCH_ZOOM_TRUCK: 0b10000000000000000,\n TOUCH_ZOOM_OFFSET: 0b100000000000000000,\n TOUCH_ZOOM_SCREEN_PAN: 0b1000000000000000000,\n TOUCH_ZOOM_ROTATE: 0b10000000000000000000,\n});\nconst DOLLY_DIRECTION = {\n NONE: 0,\n IN: 1,\n OUT: -1,\n};\nfunction isPerspectiveCamera(camera) {\n return camera.isPerspectiveCamera;\n}\nfunction isOrthographicCamera(camera) {\n return camera.isOrthographicCamera;\n}\n\nconst PI_2 = Math.PI * 2;\nconst PI_HALF = Math.PI / 2;\n\nconst EPSILON = 1e-5;\nconst DEG2RAD = Math.PI / 180;\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction approxZero(number, error = EPSILON) {\n return Math.abs(number) < error;\n}\nfunction approxEquals(a, b, error = EPSILON) {\n return approxZero(a - b, error);\n}\nfunction roundToStep(value, step) {\n return Math.round(value / step) * step;\n}\nfunction infinityToMaxNumber(value) {\n if (isFinite(value))\n return value;\n if (value < 0)\n return -Number.MAX_VALUE;\n return Number.MAX_VALUE;\n}\nfunction maxNumberToInfinity(value) {\n if (Math.abs(value) < Number.MAX_VALUE)\n return value;\n return value * Infinity;\n}\n// https://docs.unity3d.com/ScriptReference/Mathf.SmoothDamp.html\n// https://github.com/Unity-Technologies/UnityCsReference/blob/a2bdfe9b3c4cd4476f44bf52f848063bfaf7b6b9/Runtime/Export/Math/Mathf.cs#L308\nfunction smoothDamp(current, target, currentVelocityRef, smoothTime, maxSpeed = Infinity, deltaTime) {\n // Based on Game Programming Gems 4 Chapter 1.10\n smoothTime = Math.max(0.0001, smoothTime);\n const omega = 2 / smoothTime;\n const x = omega * deltaTime;\n const exp = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x);\n let change = current - target;\n const originalTo = target;\n // Clamp maximum speed\n const maxChange = maxSpeed * smoothTime;\n change = clamp(change, -maxChange, maxChange);\n target = current - change;\n const temp = (currentVelocityRef.value + omega * change) * deltaTime;\n currentVelocityRef.value = (currentVelocityRef.value - omega * temp) * exp;\n let output = target + (change + temp) * exp;\n // Prevent overshooting\n if (originalTo - current > 0.0 === output > originalTo) {\n output = originalTo;\n currentVelocityRef.value = (output - originalTo) / deltaTime;\n }\n return output;\n}\n// https://docs.unity3d.com/ScriptReference/Vector3.SmoothDamp.html\n// https://github.com/Unity-Technologies/UnityCsReference/blob/a2bdfe9b3c4cd4476f44bf52f848063bfaf7b6b9/Runtime/Export/Math/Vector3.cs#L97\nfunction smoothDampVec3(current, target, currentVelocityRef, smoothTime, maxSpeed = Infinity, deltaTime, out) {\n // Based on Game Programming Gems 4 Chapter 1.10\n smoothTime = Math.max(0.0001, smoothTime);\n const omega = 2 / smoothTime;\n const x = omega * deltaTime;\n const exp = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x);\n let targetX = target.x;\n let targetY = target.y;\n let targetZ = target.z;\n let changeX = current.x - targetX;\n let changeY = current.y - targetY;\n let changeZ = current.z - targetZ;\n const originalToX = targetX;\n const originalToY = targetY;\n const originalToZ = targetZ;\n // Clamp maximum speed\n const maxChange = maxSpeed * smoothTime;\n const maxChangeSq = maxChange * maxChange;\n const magnitudeSq = changeX * changeX + changeY * changeY + changeZ * changeZ;\n if (magnitudeSq > maxChangeSq) {\n const magnitude = Math.sqrt(magnitudeSq);\n changeX = changeX / magnitude * maxChange;\n changeY = changeY / magnitude * maxChange;\n changeZ = changeZ / magnitude * maxChange;\n }\n targetX = current.x - changeX;\n targetY = current.y - changeY;\n targetZ = current.z - changeZ;\n const tempX = (currentVelocityRef.x + omega * changeX) * deltaTime;\n const tempY = (currentVelocityRef.y + omega * changeY) * deltaTime;\n const tempZ = (currentVelocityRef.z + omega * changeZ) * deltaTime;\n currentVelocityRef.x = (currentVelocityRef.x - omega * tempX) * exp;\n currentVelocityRef.y = (currentVelocityRef.y - omega * tempY) * exp;\n currentVelocityRef.z = (currentVelocityRef.z - omega * tempZ) * exp;\n out.x = targetX + (changeX + tempX) * exp;\n out.y = targetY + (changeY + tempY) * exp;\n out.z = targetZ + (changeZ + tempZ) * exp;\n // Prevent overshooting\n const origMinusCurrentX = originalToX - current.x;\n const origMinusCurrentY = originalToY - current.y;\n const origMinusCurrentZ = originalToZ - current.z;\n const outMinusOrigX = out.x - originalToX;\n const outMinusOrigY = out.y - originalToY;\n const outMinusOrigZ = out.z - originalToZ;\n if (origMinusCurrentX * outMinusOrigX + origMinusCurrentY * outMinusOrigY + origMinusCurrentZ * outMinusOrigZ > 0) {\n out.x = originalToX;\n out.y = originalToY;\n out.z = originalToZ;\n currentVelocityRef.x = (out.x - originalToX) / deltaTime;\n currentVelocityRef.y = (out.y - originalToY) / deltaTime;\n currentVelocityRef.z = (out.z - originalToZ) / deltaTime;\n }\n return out;\n}\n\nfunction extractClientCoordFromEvent(pointers, out) {\n out.set(0, 0);\n pointers.forEach((pointer) => {\n out.x += pointer.clientX;\n out.y += pointer.clientY;\n });\n out.x /= pointers.length;\n out.y /= pointers.length;\n}\n\nfunction notSupportedInOrthographicCamera(camera, message) {\n if (isOrthographicCamera(camera)) {\n console.warn(`${message} is not supported in OrthographicCamera`);\n return true;\n }\n return false;\n}\n\nclass EventDispatcher {\n constructor() {\n this._listeners = {};\n }\n /**\n * Adds the specified event listener.\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n addEventListener(type, listener) {\n const listeners = this._listeners;\n if (listeners[type] === undefined)\n listeners[type] = [];\n if (listeners[type].indexOf(listener) === -1)\n listeners[type].push(listener);\n }\n /**\n * Presence of the specified event listener.\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n hasEventListener(type, listener) {\n const listeners = this._listeners;\n return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1;\n }\n /**\n * Removes the specified event listener\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n removeEventListener(type, listener) {\n const listeners = this._listeners;\n const listenerArray = listeners[type];\n if (listenerArray !== undefined) {\n const index = listenerArray.indexOf(listener);\n if (index !== -1)\n listenerArray.splice(index, 1);\n }\n }\n /**\n * Removes all event listeners\n * @param type event name\n * @category Methods\n */\n removeAllEventListeners(type) {\n if (!type) {\n this._listeners = {};\n return;\n }\n if (Array.isArray(this._listeners[type]))\n this._listeners[type].length = 0;\n }\n /**\n * Fire an event type.\n * @param event DispatcherEvent\n * @category Methods\n */\n dispatchEvent(event) {\n const listeners = this._listeners;\n const listenerArray = listeners[event.type];\n if (listenerArray !== undefined) {\n event.target = this;\n const array = listenerArray.slice(0);\n for (let i = 0, l = array.length; i < l; i++) {\n array[i].call(this, event);\n }\n }\n }\n}\n\nvar _a;\nconst VERSION = '2.10.1'; // will be replaced with `version` in package.json during the build process.\nconst TOUCH_DOLLY_FACTOR = 1 / 8;\nconst isMac = /Mac/.test((_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.navigator) === null || _a === void 0 ? void 0 : _a.platform);\nlet THREE;\nlet _ORIGIN;\nlet _AXIS_Y;\nlet _AXIS_Z;\nlet _v2;\nlet _v3A;\nlet _v3B;\nlet _v3C;\nlet _cameraDirection;\nlet _xColumn;\nlet _yColumn;\nlet _zColumn;\nlet _deltaTarget;\nlet _deltaOffset;\nlet _sphericalA;\nlet _sphericalB;\nlet _box3A;\nlet _box3B;\nlet _sphere;\nlet _quaternionA;\nlet _quaternionB;\nlet _rotationMatrix;\nlet _raycaster;\nclass CameraControls extends EventDispatcher {\n /**\n * Injects THREE as the dependency. You can then proceed to use CameraControls.\n *\n * e.g\n * ```javascript\n * CameraControls.install( { THREE: THREE } );\n * ```\n *\n * Note: If you do not wish to use enter three.js to reduce file size(tree-shaking for example), make a subset to install.\n *\n * ```js\n * import {\n * \tVector2,\n * \tVector3,\n * \tVector4,\n * \tQuaternion,\n * \tMatrix4,\n * \tSpherical,\n * \tBox3,\n * \tSphere,\n * \tRaycaster,\n * \tMathUtils,\n * } from 'three';\n *\n * const subsetOfTHREE = {\n * \tVector2 : Vector2,\n * \tVector3 : Vector3,\n * \tVector4 : Vector4,\n * \tQuaternion: Quaternion,\n * \tMatrix4 : Matrix4,\n * \tSpherical : Spherical,\n * \tBox3 : Box3,\n * \tSphere : Sphere,\n * \tRaycaster : Raycaster,\n * };\n\n * CameraControls.install( { THREE: subsetOfTHREE } );\n * ```\n * @category Statics\n */\n static install(libs) {\n THREE = libs.THREE;\n _ORIGIN = Object.freeze(new THREE.Vector3(0, 0, 0));\n _AXIS_Y = Object.freeze(new THREE.Vector3(0, 1, 0));\n _AXIS_Z = Object.freeze(new THREE.Vector3(0, 0, 1));\n _v2 = new THREE.Vector2();\n _v3A = new THREE.Vector3();\n _v3B = new THREE.Vector3();\n _v3C = new THREE.Vector3();\n _cameraDirection = new THREE.Vector3();\n _xColumn = new THREE.Vector3();\n _yColumn = new THREE.Vector3();\n _zColumn = new THREE.Vector3();\n _deltaTarget = new THREE.Vector3();\n _deltaOffset = new THREE.Vector3();\n _sphericalA = new THREE.Spherical();\n _sphericalB = new THREE.Spherical();\n _box3A = new THREE.Box3();\n _box3B = new THREE.Box3();\n _sphere = new THREE.Sphere();\n _quaternionA = new THREE.Quaternion();\n _quaternionB = new THREE.Quaternion();\n _rotationMatrix = new THREE.Matrix4();\n _raycaster = new THREE.Raycaster();\n }\n /**\n * list all ACTIONs\n * @category Statics\n */\n static get ACTION() {\n return ACTION;\n }\n /**\n * @deprecated Use `cameraControls.mouseButtons.left = CameraControls.ACTION.SCREEN_PAN` instead.\n */\n set verticalDragToForward(_) {\n console.warn('camera-controls: `verticalDragToForward` was removed. Use `mouseButtons.left = CameraControls.ACTION.SCREEN_PAN` instead.');\n }\n /**\n * Creates a `CameraControls` instance.\n *\n * Note:\n * You **must install** three.js before using camera-controls. see [#install](#install)\n * Not doing so will lead to runtime errors (`undefined` references to THREE).\n *\n * e.g.\n * ```\n * CameraControls.install( { THREE } );\n * const cameraControls = new CameraControls( camera, domElement );\n * ```\n *\n * @param camera A `THREE.PerspectiveCamera` or `THREE.OrthographicCamera` to be controlled.\n * @param domElement A `HTMLElement` for the draggable area, usually `renderer.domElement`.\n * @category Constructor\n */\n constructor(camera, domElement) {\n super();\n /**\n * Minimum vertical angle in radians.\n * The angle has to be between `0` and `.maxPolarAngle` inclusive.\n * The default value is `0`.\n *\n * e.g.\n * ```\n * cameraControls.maxPolarAngle = 0;\n * ```\n * @category Properties\n */\n this.minPolarAngle = 0; // radians\n /**\n * Maximum vertical angle in radians.\n * The angle has to be between `.maxPolarAngle` and `Math.PI` inclusive.\n * The default value is `Math.PI`.\n *\n * e.g.\n * ```\n * cameraControls.maxPolarAngle = Math.PI;\n * ```\n * @category Properties\n */\n this.maxPolarAngle = Math.PI; // radians\n /**\n * Minimum horizontal angle in radians.\n * The angle has to be less than `.maxAzimuthAngle`.\n * The default value is `- Infinity`.\n *\n * e.g.\n * ```\n * cameraControls.minAzimuthAngle = - Infinity;\n * ```\n * @category Properties\n */\n this.minAzimuthAngle = -Infinity; // radians\n /**\n * Maximum horizontal angle in radians.\n * The angle has to be greater than `.minAzimuthAngle`.\n * The default value is `Infinity`.\n *\n * e.g.\n * ```\n * cameraControls.maxAzimuthAngle = Infinity;\n * ```\n * @category Properties\n */\n this.maxAzimuthAngle = Infinity; // radians\n // How far you can dolly in and out ( PerspectiveCamera only )\n /**\n * Minimum distance for dolly. The value must be higher than `0`. Default is `Number.EPSILON`.\n * PerspectiveCamera only.\n * @category Properties\n */\n this.minDistance = Number.EPSILON;\n /**\n * Maximum distance for dolly. The value must be higher than `minDistance`. Default is `Infinity`.\n * PerspectiveCamera only.\n * @category Properties\n */\n this.maxDistance = Infinity;\n /**\n * `true` to enable Infinity Dolly for wheel and pinch. Use this with `minDistance` and `maxDistance`\n * If the Dolly distance is less (or over) than the `minDistance` (or `maxDistance`), `infinityDolly` will keep the distance and pushes the target position instead.\n * @category Properties\n */\n this.infinityDolly = false;\n /**\n * Minimum camera zoom.\n * @category Properties\n */\n this.minZoom = 0.01;\n /**\n * Maximum camera zoom.\n * @category Properties\n */\n this.maxZoom = Infinity;\n /**\n * Approximate time in seconds to reach the target. A smaller value will reach the target faster.\n * @category Properties\n */\n this.smoothTime = 0.25;\n /**\n * the smoothTime while dragging\n * @category Properties\n */\n this.draggingSmoothTime = 0.125;\n /**\n * Max transition speed in unit-per-seconds\n * @category Properties\n */\n this.maxSpeed = Infinity;\n /**\n * Speed of azimuth (horizontal) rotation.\n * @category Properties\n */\n this.azimuthRotateSpeed = 1.0;\n /**\n * Speed of polar (vertical) rotation.\n * @category Properties\n */\n this.polarRotateSpeed = 1.0;\n /**\n * Speed of mouse-wheel dollying.\n * @category Properties\n */\n this.dollySpeed = 1.0;\n /**\n * `true` to invert direction when dollying or zooming via drag\n * @category Properties\n */\n this.dollyDragInverted = false;\n /**\n * Speed of drag for truck and pedestal.\n * @category Properties\n */\n this.truckSpeed = 2.0;\n /**\n * `true` to enable Dolly-in to the mouse cursor coords.\n * @category Properties\n */\n this.dollyToCursor = false;\n /**\n * @category Properties\n */\n this.dragToOffset = false;\n /**\n * Friction ratio of the boundary.\n * @category Properties\n */\n this.boundaryFriction = 0.0;\n /**\n * Controls how soon the `rest` event fires as the camera slows.\n * @category Properties\n */\n this.restThreshold = 0.01;\n /**\n * An array of Meshes to collide with camera.\n * Be aware colliderMeshes may decrease performance. The collision test uses 4 raycasters from the camera since the near plane has 4 corners.\n * @category Properties\n */\n this.colliderMeshes = [];\n /**\n * Force cancel user dragging.\n * @category Methods\n */\n // cancel will be overwritten in the constructor.\n this.cancel = () => { };\n this._enabled = true;\n this._state = ACTION.NONE;\n this._viewport = null;\n this._changedDolly = 0;\n this._changedZoom = 0;\n this._hasRested = true;\n this._boundaryEnclosesCamera = false;\n this._needsUpdate = true;\n this._updatedLastTime = false;\n this._elementRect = new DOMRect();\n this._isDragging = false;\n this._dragNeedsUpdate = true;\n this._activePointers = [];\n this._lockedPointer = null;\n this._interactiveArea = new DOMRect(0, 0, 1, 1);\n // Use draggingSmoothTime over smoothTime while true.\n // set automatically true on user-dragging start.\n // set automatically false on programmable methods call.\n this._isUserControllingRotate = false;\n this._isUserControllingDolly = false;\n this._isUserControllingTruck = false;\n this._isUserControllingOffset = false;\n this._isUserControllingZoom = false;\n this._lastDollyDirection = DOLLY_DIRECTION.NONE;\n // velocities for smoothDamp\n this._thetaVelocity = { value: 0 };\n this._phiVelocity = { value: 0 };\n this._radiusVelocity = { value: 0 };\n this._targetVelocity = new THREE.Vector3();\n this._focalOffsetVelocity = new THREE.Vector3();\n this._zoomVelocity = { value: 0 };\n this._truckInternal = (deltaX, deltaY, dragToOffset, screenSpacePanning) => {\n let truckX;\n let pedestalY;\n if (isPerspectiveCamera(this._camera)) {\n const offset = _v3A.copy(this._camera.position).sub(this._target);\n // half of the fov is center to top of screen\n const fov = this._camera.getEffectiveFOV() * DEG2RAD;\n const targetDistance = offset.length() * Math.tan(fov * 0.5);\n truckX = (this.truckSpeed * deltaX * targetDistance / this._elementRect.height);\n pedestalY = (this.truckSpeed * deltaY * targetDistance / this._elementRect.height);\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n truckX = this.truckSpeed * deltaX * (camera.right - camera.left) / camera.zoom / this._elementRect.width;\n pedestalY = this.truckSpeed * deltaY * (camera.top - camera.bottom) / camera.zoom / this._elementRect.height;\n }\n else {\n return;\n }\n if (screenSpacePanning) {\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y, this._focalOffsetEnd.z, true) :\n this.truck(truckX, 0, true);\n this.forward(-pedestalY, true);\n }\n else {\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y + pedestalY, this._focalOffsetEnd.z, true) :\n this.truck(truckX, pedestalY, true);\n }\n };\n this._rotateInternal = (deltaX, deltaY) => {\n const theta = PI_2 * this.azimuthRotateSpeed * deltaX / this._elementRect.height; // divide by *height* to refer the resolution\n const phi = PI_2 * this.polarRotateSpeed * deltaY / this._elementRect.height;\n this.rotate(theta, phi, true);\n };\n this._dollyInternal = (delta, x, y) => {\n const dollyScale = Math.pow(0.95, -delta * this.dollySpeed);\n const lastDistance = this._sphericalEnd.radius;\n const distance = this._sphericalEnd.radius * dollyScale;\n const clampedDistance = clamp(distance, this.minDistance, this.maxDistance);\n const overflowedDistance = clampedDistance - distance;\n if (this.infinityDolly && this.dollyToCursor) {\n this._dollyToNoClamp(distance, true);\n }\n else if (this.infinityDolly && !this.dollyToCursor) {\n this.dollyInFixed(overflowedDistance, true);\n this._dollyToNoClamp(clampedDistance, true);\n }\n else {\n this._dollyToNoClamp(clampedDistance, true);\n }\n if (this.dollyToCursor) {\n this._changedDolly += (this.infinityDolly ? distance : clampedDistance) - lastDistance;\n this._dollyControlCoord.set(x, y);\n }\n this._lastDollyDirection = Math.sign(-delta);\n };\n this._zoomInternal = (delta, x, y) => {\n const zoomScale = Math.pow(0.95, delta * this.dollySpeed);\n const lastZoom = this._zoom;\n const zoom = this._zoom * zoomScale;\n // for both PerspectiveCamera and OrthographicCamera\n this.zoomTo(zoom, true);\n if (this.dollyToCursor) {\n this._changedZoom += zoom - lastZoom;\n this._dollyControlCoord.set(x, y);\n }\n };\n // Check if the user has installed THREE\n if (typeof THREE === 'undefined') {\n console.error('camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information.');\n }\n this._camera = camera;\n this._yAxisUpSpace = new THREE.Quaternion().setFromUnitVectors(this._camera.up, _AXIS_Y);\n this._yAxisUpSpaceInverse = this._yAxisUpSpace.clone().invert();\n this._state = ACTION.NONE;\n // the location\n this._target = new THREE.Vector3();\n this._targetEnd = this._target.clone();\n this._focalOffset = new THREE.Vector3();\n this._focalOffsetEnd = this._focalOffset.clone();\n // rotation\n this._spherical = new THREE.Spherical().setFromVector3(_v3A.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace));\n this._sphericalEnd = this._spherical.clone();\n this._lastDistance = this._spherical.radius;\n this._zoom = this._camera.zoom;\n this._zoomEnd = this._zoom;\n this._lastZoom = this._zoom;\n // collisionTest uses nearPlane.s\n this._nearPlaneCorners = [\n new THREE.Vector3(),\n new THREE.Vector3(),\n new THREE.Vector3(),\n new THREE.Vector3(),\n ];\n this._updateNearPlaneCorners();\n // Target cannot move outside of this box\n this._boundary = new THREE.Box3(new THREE.Vector3(-Infinity, -Infinity, -Infinity), new THREE.Vector3(Infinity, Infinity, Infinity));\n // reset\n this._cameraUp0 = this._camera.up.clone();\n this._target0 = this._target.clone();\n this._position0 = this._camera.position.clone();\n this._zoom0 = this._zoom;\n this._focalOffset0 = this._focalOffset.clone();\n this._dollyControlCoord = new THREE.Vector2();\n // configs\n this.mouseButtons = {\n left: ACTION.ROTATE,\n middle: ACTION.DOLLY,\n right: ACTION.TRUCK,\n wheel: isPerspectiveCamera(this._camera) ? ACTION.DOLLY :\n isOrthographicCamera(this._camera) ? ACTION.ZOOM :\n ACTION.NONE,\n };\n this.touches = {\n one: ACTION.TOUCH_ROTATE,\n two: isPerspectiveCamera(this._camera) ? ACTION.TOUCH_DOLLY_TRUCK :\n isOrthographicCamera(this._camera) ? ACTION.TOUCH_ZOOM_TRUCK :\n ACTION.NONE,\n three: ACTION.TOUCH_TRUCK,\n };\n const dragStartPosition = new THREE.Vector2();\n const lastDragPosition = new THREE.Vector2();\n const dollyStart = new THREE.Vector2();\n const onPointerDown = (event) => {\n if (!this._enabled || !this._domElement)\n return;\n if (this._interactiveArea.left !== 0 ||\n this._interactiveArea.top !== 0 ||\n this._interactiveArea.width !== 1 ||\n this._interactiveArea.height !== 1) {\n const elRect = this._domElement.getBoundingClientRect();\n const left = event.clientX / elRect.width;\n const top = event.clientY / elRect.height;\n // check if the interactiveArea contains the drag start position.\n if (left < this._interactiveArea.left ||\n left > this._interactiveArea.right ||\n top < this._interactiveArea.top ||\n top > this._interactiveArea.bottom)\n return;\n }\n // Don't call `event.preventDefault()` on the pointerdown event\n // to keep receiving pointermove evens outside dragging iframe\n // https://taye.me/blog/tips/2015/11/16/mouse-drag-outside-iframe/\n const mouseButton = event.pointerType !== 'mouse' ? null :\n (event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT ? MOUSE_BUTTON.LEFT :\n (event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE ? MOUSE_BUTTON.MIDDLE :\n (event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT ? MOUSE_BUTTON.RIGHT :\n null;\n if (mouseButton !== null) {\n const zombiePointer = this._findPointerByMouseButton(mouseButton);\n zombiePointer && this._disposePointer(zombiePointer);\n }\n if ((event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT && this._lockedPointer)\n return;\n const pointer = {\n pointerId: event.pointerId,\n clientX: event.clientX,\n clientY: event.clientY,\n deltaX: 0,\n deltaY: 0,\n mouseButton,\n };\n this._activePointers.push(pointer);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.ownerDocument.addEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.addEventListener('pointerup', onPointerUp);\n this._isDragging = true;\n startDragging(event);\n };\n const onPointerMove = (event) => {\n if (event.cancelable)\n event.preventDefault();\n const pointerId = event.pointerId;\n const pointer = this._lockedPointer || this._findPointerById(pointerId);\n if (!pointer)\n return;\n pointer.clientX = event.clientX;\n pointer.clientY = event.clientY;\n pointer.deltaX = event.movementX;\n pointer.deltaY = event.movementY;\n this._state = 0;\n if (event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n if ((!this._isDragging && this._lockedPointer) ||\n this._isDragging && (event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if (this._isDragging && (event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if (this._isDragging && (event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n }\n dragging();\n };\n const onPointerUp = (event) => {\n const pointer = this._findPointerById(event.pointerId);\n if (pointer && pointer === this._lockedPointer)\n return;\n pointer && this._disposePointer(pointer);\n if (event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 0:\n this._state = ACTION.NONE;\n break;\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n this._state = ACTION.NONE;\n }\n endDragging();\n };\n let lastScrollTimeStamp = -1;\n const onMouseWheel = (event) => {\n if (!this._domElement)\n return;\n if (!this._enabled || this.mouseButtons.wheel === ACTION.NONE)\n return;\n if (this._interactiveArea.left !== 0 ||\n this._interactiveArea.top !== 0 ||\n this._interactiveArea.width !== 1 ||\n this._interactiveArea.height !== 1) {\n const elRect = this._domElement.getBoundingClientRect();\n const left = event.clientX / elRect.width;\n const top = event.clientY / elRect.height;\n // check if the interactiveArea contains the drag start position.\n if (left < this._interactiveArea.left ||\n left > this._interactiveArea.right ||\n top < this._interactiveArea.top ||\n top > this._interactiveArea.bottom)\n return;\n }\n event.preventDefault();\n if (this.dollyToCursor ||\n this.mouseButtons.wheel === ACTION.ROTATE ||\n this.mouseButtons.wheel === ACTION.TRUCK) {\n const now = performance.now();\n // only need to fire this at scroll start.\n if (lastScrollTimeStamp - now < 1000)\n this._getClientRect(this._elementRect);\n lastScrollTimeStamp = now;\n }\n // Ref: https://github.com/cedricpinson/osgjs/blob/00e5a7e9d9206c06fdde0436e1d62ab7cb5ce853/sources/osgViewer/input/source/InputSourceMouse.js#L89-L103\n const deltaYFactor = isMac ? -1 : -3;\n // Checks event.ctrlKey to detect multi-touch gestures on a trackpad.\n const delta = (event.deltaMode === 1 || event.ctrlKey) ? event.deltaY / deltaYFactor : event.deltaY / (deltaYFactor * 10);\n const x = this.dollyToCursor ? (event.clientX - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const y = this.dollyToCursor ? (event.clientY - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n switch (this.mouseButtons.wheel) {\n case ACTION.ROTATE: {\n this._rotateInternal(event.deltaX, event.deltaY);\n this._isUserControllingRotate = true;\n break;\n }\n case ACTION.TRUCK: {\n this._truckInternal(event.deltaX, event.deltaY, false, false);\n this._isUserControllingTruck = true;\n break;\n }\n case ACTION.SCREEN_PAN: {\n this._truckInternal(event.deltaX, event.deltaY, false, true);\n this._isUserControllingTruck = true;\n break;\n }\n case ACTION.OFFSET: {\n this._truckInternal(event.deltaX, event.deltaY, true, false);\n this._isUserControllingOffset = true;\n break;\n }\n case ACTION.DOLLY: {\n this._dollyInternal(-delta, x, y);\n this._isUserControllingDolly = true;\n break;\n }\n case ACTION.ZOOM: {\n this._zoomInternal(-delta, x, y);\n this._isUserControllingZoom = true;\n break;\n }\n }\n this.dispatchEvent({ type: 'control' });\n };\n const onContextMenu = (event) => {\n if (!this._domElement || !this._enabled)\n return;\n // contextmenu event is fired right after pointerdown\n // remove attached handlers and active pointer, if interrupted by contextmenu.\n if (this.mouseButtons.right === CameraControls.ACTION.NONE) {\n const pointerId = event instanceof PointerEvent ? event.pointerId : 0;\n const pointer = this._findPointerById(pointerId);\n pointer && this._disposePointer(pointer);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n return;\n }\n event.preventDefault();\n };\n const startDragging = (event) => {\n if (!this._enabled)\n return;\n extractClientCoordFromEvent(this._activePointers, _v2);\n this._getClientRect(this._elementRect);\n dragStartPosition.copy(_v2);\n lastDragPosition.copy(_v2);\n const isMultiTouch = this._activePointers.length >= 2;\n if (isMultiTouch) {\n // 2 finger pinch\n const dx = _v2.x - this._activePointers[1].clientX;\n const dy = _v2.y - this._activePointers[1].clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n dollyStart.set(0, distance);\n // center coords of 2 finger truck\n const x = (this._activePointers[0].clientX + this._activePointers[1].clientX) * 0.5;\n const y = (this._activePointers[0].clientY + this._activePointers[1].clientY) * 0.5;\n lastDragPosition.set(x, y);\n }\n this._state = 0;\n if (!event) {\n if (this._lockedPointer)\n this._state = this._state | this.mouseButtons.left;\n }\n else if ('pointerType' in event && event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n if (!this._lockedPointer && (event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if ((event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if ((event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n }\n // stop current movement on drag start\n // - rotate\n if ((this._state & ACTION.ROTATE) === ACTION.ROTATE ||\n (this._state & ACTION.TOUCH_ROTATE) === ACTION.TOUCH_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n this._sphericalEnd.theta = this._spherical.theta;\n this._sphericalEnd.phi = this._spherical.phi;\n this._thetaVelocity.value = 0;\n this._phiVelocity.value = 0;\n }\n // - truck and screen-pan\n if ((this._state & ACTION.TRUCK) === ACTION.TRUCK ||\n (this._state & ACTION.SCREEN_PAN) === ACTION.SCREEN_PAN ||\n (this._state & ACTION.TOUCH_TRUCK) === ACTION.TOUCH_TRUCK ||\n (this._state & ACTION.TOUCH_SCREEN_PAN) === ACTION.TOUCH_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN) {\n this._targetEnd.copy(this._target);\n this._targetVelocity.set(0, 0, 0);\n }\n // - dolly\n if ((this._state & ACTION.DOLLY) === ACTION.DOLLY ||\n (this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE) {\n this._sphericalEnd.radius = this._spherical.radius;\n this._radiusVelocity.value = 0;\n }\n // - zoom\n if ((this._state & ACTION.ZOOM) === ACTION.ZOOM ||\n (this._state & ACTION.TOUCH_ZOOM) === ACTION.TOUCH_ZOOM ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_SCREEN_PAN) === ACTION.TOUCH_ZOOM_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n this._zoomEnd = this._zoom;\n this._zoomVelocity.value = 0;\n }\n // - offset\n if ((this._state & ACTION.OFFSET) === ACTION.OFFSET ||\n (this._state & ACTION.TOUCH_OFFSET) === ACTION.TOUCH_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET) {\n this._focalOffsetEnd.copy(this._focalOffset);\n this._focalOffsetVelocity.set(0, 0, 0);\n }\n this.dispatchEvent({ type: 'controlstart' });\n };\n const dragging = () => {\n if (!this._enabled || !this._dragNeedsUpdate)\n return;\n this._dragNeedsUpdate = false;\n extractClientCoordFromEvent(this._activePointers, _v2);\n // When pointer lock is enabled clientX, clientY, screenX, and screenY remain 0.\n // If pointer lock is enabled, use the Delta directory, and assume active-pointer is not multiple.\n const isPointerLockActive = this._domElement && this._domElement.ownerDocument.pointerLockElement === this._domElement;\n const lockedPointer = isPointerLockActive ? this._lockedPointer || this._activePointers[0] : null;\n const deltaX = lockedPointer ? -lockedPointer.deltaX : lastDragPosition.x - _v2.x;\n const deltaY = lockedPointer ? -lockedPointer.deltaY : lastDragPosition.y - _v2.y;\n lastDragPosition.copy(_v2);\n // rotate\n if ((this._state & ACTION.ROTATE) === ACTION.ROTATE ||\n (this._state & ACTION.TOUCH_ROTATE) === ACTION.TOUCH_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n this._rotateInternal(deltaX, deltaY);\n this._isUserControllingRotate = true;\n }\n // mouse dolly or zoom\n if ((this._state & ACTION.DOLLY) === ACTION.DOLLY ||\n (this._state & ACTION.ZOOM) === ACTION.ZOOM) {\n const dollyX = this.dollyToCursor ? (dragStartPosition.x - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const dollyY = this.dollyToCursor ? (dragStartPosition.y - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n const dollyDirection = this.dollyDragInverted ? -1 : 1;\n if ((this._state & ACTION.DOLLY) === ACTION.DOLLY) {\n this._dollyInternal(dollyDirection * deltaY * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n this._isUserControllingDolly = true;\n }\n else {\n this._zoomInternal(dollyDirection * deltaY * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n this._isUserControllingZoom = true;\n }\n }\n // touch dolly or zoom\n if ((this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_ZOOM) === ACTION.TOUCH_ZOOM ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_ZOOM_SCREEN_PAN) === ACTION.TOUCH_ZOOM_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n const dx = _v2.x - this._activePointers[1].clientX;\n const dy = _v2.y - this._activePointers[1].clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const dollyDelta = dollyStart.y - distance;\n dollyStart.set(0, distance);\n const dollyX = this.dollyToCursor ? (lastDragPosition.x - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const dollyY = this.dollyToCursor ? (lastDragPosition.y - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n if ((this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET) {\n this._dollyInternal(dollyDelta * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n this._isUserControllingDolly = true;\n }\n else {\n this._zoomInternal(dollyDelta * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n this._isUserControllingZoom = true;\n }\n }\n // truck\n if ((this._state & ACTION.TRUCK) === ACTION.TRUCK ||\n (this._state & ACTION.TOUCH_TRUCK) === ACTION.TOUCH_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK) {\n this._truckInternal(deltaX, deltaY, false, false);\n this._isUserControllingTruck = true;\n }\n // screen-pan\n if ((this._state & ACTION.SCREEN_PAN) === ACTION.SCREEN_PAN ||\n (this._state & ACTION.TOUCH_SCREEN_PAN) === ACTION.TOUCH_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_ZOOM_SCREEN_PAN) === ACTION.TOUCH_ZOOM_SCREEN_PAN) {\n this._truckInternal(deltaX, deltaY, false, true);\n this._isUserControllingTruck = true;\n }\n // offset\n if ((this._state & ACTION.OFFSET) === ACTION.OFFSET ||\n (this._state & ACTION.TOUCH_OFFSET) === ACTION.TOUCH_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET) {\n this._truckInternal(deltaX, deltaY, true, false);\n this._isUserControllingOffset = true;\n }\n this.dispatchEvent({ type: 'control' });\n };\n const endDragging = () => {\n extractClientCoordFromEvent(this._activePointers, _v2);\n lastDragPosition.copy(_v2);\n this._dragNeedsUpdate = false;\n if (this._activePointers.length === 0 ||\n (this._activePointers.length === 1 && this._activePointers[0] === this._lockedPointer)) {\n this._isDragging = false;\n }\n if (this._activePointers.length === 0 && this._domElement) {\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this.dispatchEvent({ type: 'controlend' });\n }\n };\n this.lockPointer = () => {\n if (!this._enabled || !this._domElement)\n return;\n this.cancel();\n // Element.requestPointerLock is allowed to happen without any pointer active - create a faux one for compatibility with controls\n this._lockedPointer = {\n pointerId: -1,\n clientX: 0,\n clientY: 0,\n deltaX: 0,\n deltaY: 0,\n mouseButton: null,\n };\n this._activePointers.push(this._lockedPointer);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.requestPointerLock();\n this._domElement.ownerDocument.addEventListener('pointerlockchange', onPointerLockChange);\n this._domElement.ownerDocument.addEventListener('pointerlockerror', onPointerLockError);\n this._domElement.ownerDocument.addEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.addEventListener('pointerup', onPointerUp);\n startDragging();\n };\n this.unlockPointer = () => {\n var _a, _b, _c;\n if (this._lockedPointer !== null) {\n this._disposePointer(this._lockedPointer);\n this._lockedPointer = null;\n }\n (_a = this._domElement) === null || _a === void 0 ? void 0 : _a.ownerDocument.exitPointerLock();\n (_b = this._domElement) === null || _b === void 0 ? void 0 : _b.ownerDocument.removeEventListener('pointerlockchange', onPointerLockChange);\n (_c = this._domElement) === null || _c === void 0 ? void 0 : _c.ownerDocument.removeEventListener('pointerlockerror', onPointerLockError);\n this.cancel();\n };\n const onPointerLockChange = () => {\n const isPointerLockActive = this._domElement && this._domElement.ownerDocument.pointerLockElement === this._domElement;\n if (!isPointerLockActive)\n this.unlockPointer();\n };\n const onPointerLockError = () => {\n this.unlockPointer();\n };\n this._addAllEventListeners = (domElement) => {\n this._domElement = domElement;\n this._domElement.style.touchAction = 'none';\n this._domElement.style.userSelect = 'none';\n this._domElement.style.webkitUserSelect = 'none';\n this._domElement.addEventListener('pointerdown', onPointerDown);\n this._domElement.addEventListener('pointercancel', onPointerUp);\n this._domElement.addEventListener('wheel', onMouseWheel, { passive: false });\n this._domElement.addEventListener('contextmenu', onContextMenu);\n };\n this._removeAllEventListeners = () => {\n if (!this._domElement)\n return;\n this._domElement.style.touchAction = '';\n this._domElement.style.userSelect = '';\n this._domElement.style.webkitUserSelect = '';\n this._domElement.removeEventListener('pointerdown', onPointerDown);\n this._domElement.removeEventListener('pointercancel', onPointerUp);\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener#matching_event_listeners_for_removal\n // > it's probably wise to use the same values used for the call to `addEventListener()` when calling `removeEventListener()`\n // see https://github.com/microsoft/TypeScript/issues/32912#issuecomment-522142969\n // eslint-disable-next-line no-undef\n this._domElement.removeEventListener('wheel', onMouseWheel, { passive: false });\n this._domElement.removeEventListener('contextmenu', onContextMenu);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.ownerDocument.removeEventListener('pointerlockchange', onPointerLockChange);\n this._domElement.ownerDocument.removeEventListener('pointerlockerror', onPointerLockError);\n };\n this.cancel = () => {\n if (this._state === ACTION.NONE)\n return;\n this._state = ACTION.NONE;\n this._activePointers.length = 0;\n endDragging();\n };\n if (domElement)\n this.connect(domElement);\n this.update(0);\n }\n /**\n * The camera to be controlled\n * @category Properties\n */\n get camera() {\n return this._camera;\n }\n set camera(camera) {\n this._camera = camera;\n this.updateCameraUp();\n this._camera.updateProjectionMatrix();\n this._updateNearPlaneCorners();\n this._needsUpdate = true;\n }\n /**\n * Whether or not the controls are enabled.\n * `false` to disable user dragging/touch-move, but all methods works.\n * @category Properties\n */\n get enabled() {\n return this._enabled;\n }\n set enabled(enabled) {\n this._enabled = enabled;\n if (!this._domElement)\n return;\n if (enabled) {\n this._domElement.style.touchAction = 'none';\n this._domElement.style.userSelect = 'none';\n this._domElement.style.webkitUserSelect = 'none';\n }\n else {\n this.cancel();\n this._domElement.style.touchAction = '';\n this._domElement.style.userSelect = '';\n this._domElement.style.webkitUserSelect = '';\n }\n }\n /**\n * Returns `true` if the controls are active updating.\n * readonly value.\n * @category Properties\n */\n get active() {\n return !this._hasRested;\n }\n /**\n * Getter for the current `ACTION`.\n * readonly value.\n * @category Properties\n */\n get currentAction() {\n return this._state;\n }\n /**\n * get/set Current distance.\n * @category Properties\n */\n get distance() {\n return this._spherical.radius;\n }\n set distance(distance) {\n if (this._spherical.radius === distance &&\n this._sphericalEnd.radius === distance)\n return;\n this._spherical.radius = distance;\n this._sphericalEnd.radius = distance;\n this._needsUpdate = true;\n }\n // horizontal angle\n /**\n * get/set the azimuth angle (horizontal) in radians.\n * Every 360 degrees turn is added to `.azimuthAngle` value, which is accumulative.\n * @category Properties\n */\n get azimuthAngle() {\n return this._spherical.theta;\n }\n set azimuthAngle(azimuthAngle) {\n if (this._spherical.theta === azimuthAngle &&\n this._sphericalEnd.theta === azimuthAngle)\n return;\n this._spherical.theta = azimuthAngle;\n this._sphericalEnd.theta = azimuthAngle;\n this._needsUpdate = true;\n }\n // vertical angle\n /**\n * get/set the polar angle (vertical) in radians.\n * @category Properties\n */\n get polarAngle() {\n return this._spherical.phi;\n }\n set polarAngle(polarAngle) {\n if (this._spherical.phi === polarAngle &&\n this._sphericalEnd.phi === polarAngle)\n return;\n this._spherical.phi = polarAngle;\n this._sphericalEnd.phi = polarAngle;\n this._needsUpdate = true;\n }\n /**\n * Whether camera position should be enclosed in the boundary or not.\n * @category Properties\n */\n get boundaryEnclosesCamera() {\n return this._boundaryEnclosesCamera;\n }\n set boundaryEnclosesCamera(boundaryEnclosesCamera) {\n this._boundaryEnclosesCamera = boundaryEnclosesCamera;\n this._needsUpdate = true;\n }\n /**\n * Set drag-start, touches and wheel enable area in the domElement.\n * each values are between `0` and `1` inclusive, where `0` is left/top and `1` is right/bottom of the screen.\n * e.g. `{ x: 0, y: 0, width: 1, height: 1 }` for entire area.\n * @category Properties\n */\n set interactiveArea(interactiveArea) {\n this._interactiveArea.width = clamp(interactiveArea.width, 0, 1);\n this._interactiveArea.height = clamp(interactiveArea.height, 0, 1);\n this._interactiveArea.x = clamp(interactiveArea.x, 0, 1 - this._interactiveArea.width);\n this._interactiveArea.y = clamp(interactiveArea.y, 0, 1 - this._interactiveArea.height);\n }\n /**\n * Adds the specified event listener.\n * Applicable event types (which is `K`) are:\n * | Event name | Timing |\n * | ------------------- | ------ |\n * | `'controlstart'` | When the user starts to control the camera via mouse / touches. ¹ |\n * | `'control'` | When the user controls the camera (dragging). |\n * | `'controlend'` | When the user ends to control the camera. ¹ |\n * | `'transitionstart'` | When any kind of transition starts, either user control or using a method with `enableTransition = true` |\n * | `'update'` | When the camera position is updated. |\n * | `'wake'` | When the camera starts moving. |\n * | `'rest'` | When the camera movement is below `.restThreshold` ². |\n * | `'sleep'` | When the camera end moving. |\n *\n * 1. `mouseButtons.wheel` (Mouse wheel control) does not emit `'controlstart'` and `'controlend'`. `mouseButtons.wheel` uses scroll-event internally, and scroll-event happens intermittently. That means \"start\" and \"end\" cannot be detected.\n * 2. Due to damping, `sleep` will usually fire a few seconds after the camera _appears_ to have stopped moving. If you want to do something (e.g. enable UI, perform another transition) at the point when the camera has stopped, you probably want the `rest` event. This can be fine tuned using the `.restThreshold` parameter. See the [Rest and Sleep Example](https://yomotsu.github.io/camera-controls/examples/rest-and-sleep.html).\n *\n * e.g.\n * ```\n * cameraControl.addEventListener( 'controlstart', myCallbackFunction );\n * ```\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n addEventListener(type, listener) {\n super.addEventListener(type, listener);\n }\n /**\n * Removes the specified event listener\n * e.g.\n * ```\n * cameraControl.addEventListener( 'controlstart', myCallbackFunction );\n * ```\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n removeEventListener(type, listener) {\n super.removeEventListener(type, listener);\n }\n /**\n * Rotate azimuthal angle(horizontal) and polar angle(vertical).\n * Every value is added to the current value.\n * @param azimuthAngle Azimuth rotate angle. In radian.\n * @param polarAngle Polar rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotate(azimuthAngle, polarAngle, enableTransition = false) {\n return this.rotateTo(this._sphericalEnd.theta + azimuthAngle, this._sphericalEnd.phi + polarAngle, enableTransition);\n }\n /**\n * Rotate azimuthal angle(horizontal) to the given angle and keep the same polar angle(vertical) target.\n *\n * e.g.\n * ```\n * cameraControls.rotateAzimuthTo( 30 * THREE.MathUtils.DEG2RAD, true );\n * ```\n * @param azimuthAngle Azimuth rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotateAzimuthTo(azimuthAngle, enableTransition = false) {\n return this.rotateTo(azimuthAngle, this._sphericalEnd.phi, enableTransition);\n }\n /**\n * Rotate polar angle(vertical) to the given angle and keep the same azimuthal angle(horizontal) target.\n *\n * e.g.\n * ```\n * cameraControls.rotatePolarTo( 30 * THREE.MathUtils.DEG2RAD, true );\n * ```\n * @param polarAngle Polar rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotatePolarTo(polarAngle, enableTransition = false) {\n return this.rotateTo(this._sphericalEnd.theta, polarAngle, enableTransition);\n }\n /**\n * Rotate azimuthal angle(horizontal) and polar angle(vertical) to the given angle.\n * Camera view will rotate over the orbit pivot absolutely:\n *\n * azimuthAngle\n * ```\n * 0º\n * \\\n * 90º -----+----- -90º\n * \\\n * 180º\n * ```\n * | direction | angle |\n * | --------- | ---------------------- |\n * | front | 0º |\n * | left | 90º (`Math.PI / 2`) |\n * | right | -90º (`- Math.PI / 2`) |\n * | back | 180º (`Math.PI`) |\n *\n * polarAngle\n * ```\n * 180º\n * |\n * 90º\n * |\n * 0º\n * ```\n * | direction | angle |\n * | -------------------- | ---------------------- |\n * | top/sky | 180º (`Math.PI`) |\n * | horizontal from view | 90º (`Math.PI / 2`) |\n * | bottom/floor | 0º |\n *\n * @param azimuthAngle Azimuth rotate angle to. In radian.\n * @param polarAngle Polar rotate angle to. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotateTo(azimuthAngle, polarAngle, enableTransition = false) {\n this._isUserControllingRotate = false;\n const theta = clamp(azimuthAngle, this.minAzimuthAngle, this.maxAzimuthAngle);\n const phi = clamp(polarAngle, this.minPolarAngle, this.maxPolarAngle);\n this._sphericalEnd.theta = theta;\n this._sphericalEnd.phi = phi;\n this._sphericalEnd.makeSafe();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._spherical.theta = this._sphericalEnd.theta;\n this._spherical.phi = this._sphericalEnd.phi;\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Dolly in/out camera position.\n * @param distance Distance of dollyIn. Negative number for dollyOut.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dolly(distance, enableTransition = false) {\n return this.dollyTo(this._sphericalEnd.radius - distance, enableTransition);\n }\n /**\n * Dolly in/out camera position to given distance.\n * @param distance Distance of dolly.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dollyTo(distance, enableTransition = false) {\n this._isUserControllingDolly = false;\n this._lastDollyDirection = DOLLY_DIRECTION.NONE;\n this._changedDolly = 0;\n return this._dollyToNoClamp(clamp(distance, this.minDistance, this.maxDistance), enableTransition);\n }\n _dollyToNoClamp(distance, enableTransition = false) {\n const lastRadius = this._sphericalEnd.radius;\n const hasCollider = this.colliderMeshes.length >= 1;\n if (hasCollider) {\n const maxDistanceByCollisionTest = this._collisionTest();\n const isCollided = approxEquals(maxDistanceByCollisionTest, this._spherical.radius);\n const isDollyIn = lastRadius > distance;\n if (!isDollyIn && isCollided)\n return Promise.resolve();\n this._sphericalEnd.radius = Math.min(distance, maxDistanceByCollisionTest);\n }\n else {\n this._sphericalEnd.radius = distance;\n }\n this._needsUpdate = true;\n if (!enableTransition) {\n this._spherical.radius = this._sphericalEnd.radius;\n }\n const resolveImmediately = !enableTransition || approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Dolly in, but does not change the distance between the target and the camera, and moves the target position instead.\n * Specify a negative value for dolly out.\n * @param distance Distance of dolly.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dollyInFixed(distance, enableTransition = false) {\n this._targetEnd.add(this._getCameraDirection(_cameraDirection).multiplyScalar(distance));\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Zoom in/out camera. The value is added to camera zoom.\n * Limits set with `.minZoom` and `.maxZoom`\n * @param zoomStep zoom scale\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n zoom(zoomStep, enableTransition = false) {\n return this.zoomTo(this._zoomEnd + zoomStep, enableTransition);\n }\n /**\n * Zoom in/out camera to given scale. The value overwrites camera zoom.\n * Limits set with .minZoom and .maxZoom\n * @param zoom\n * @param enableTransition\n * @category Methods\n */\n zoomTo(zoom, enableTransition = false) {\n this._isUserControllingZoom = false;\n this._zoomEnd = clamp(zoom, this.minZoom, this.maxZoom);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._zoom = this._zoomEnd;\n }\n const resolveImmediately = !enableTransition || approxEquals(this._zoom, this._zoomEnd, this.restThreshold);\n this._changedZoom = 0;\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * @deprecated `pan()` has been renamed to `truck()`\n * @category Methods\n */\n pan(x, y, enableTransition = false) {\n console.warn('`pan` has been renamed to `truck`');\n return this.truck(x, y, enableTransition);\n }\n /**\n * Truck and pedestal camera using current azimuthal angle\n * @param x Horizontal translate amount\n * @param y Vertical translate amount\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n truck(x, y, enableTransition = false) {\n this._camera.updateMatrix();\n _xColumn.setFromMatrixColumn(this._camera.matrix, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrix, 1);\n _xColumn.multiplyScalar(x);\n _yColumn.multiplyScalar(-y);\n const offset = _v3A.copy(_xColumn).add(_yColumn);\n const to = _v3B.copy(this._targetEnd).add(offset);\n return this.moveTo(to.x, to.y, to.z, enableTransition);\n }\n /**\n * Move forward / backward.\n * @param distance Amount to move forward / backward. Negative value to move backward\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n forward(distance, enableTransition = false) {\n _v3A.setFromMatrixColumn(this._camera.matrix, 0);\n _v3A.crossVectors(this._camera.up, _v3A);\n _v3A.multiplyScalar(distance);\n const to = _v3B.copy(this._targetEnd).add(_v3A);\n return this.moveTo(to.x, to.y, to.z, enableTransition);\n }\n /**\n * Move up / down.\n * @param height Amount to move up / down. Negative value to move down\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n elevate(height, enableTransition = false) {\n _v3A.copy(this._camera.up).multiplyScalar(height);\n return this.moveTo(this._targetEnd.x + _v3A.x, this._targetEnd.y + _v3A.y, this._targetEnd.z + _v3A.z, enableTransition);\n }\n /**\n * Move target position to given point.\n * @param x x coord to move center position\n * @param y y coord to move center position\n * @param z z coord to move center position\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n moveTo(x, y, z, enableTransition = false) {\n this._isUserControllingTruck = false;\n const offset = _v3A.set(x, y, z).sub(this._targetEnd);\n this._encloseToBoundary(this._targetEnd, offset, this.boundaryFriction);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Look in the given point direction.\n * @param x point x.\n * @param y point y.\n * @param z point z.\n * @param enableTransition Whether to move smoothly or immediately.\n * @returns Transition end promise\n * @category Methods\n */\n lookInDirectionOf(x, y, z, enableTransition = false) {\n const point = _v3A.set(x, y, z);\n const direction = point.sub(this._targetEnd).normalize();\n const position = direction.multiplyScalar(-this._sphericalEnd.radius).add(this._targetEnd);\n return this.setPosition(position.x, position.y, position.z, enableTransition);\n }\n /**\n * Fit the viewport to the box or the bounding box of the object, using the nearest axis. paddings are in unit.\n * set `cover: true` to fill enter screen.\n * e.g.\n * ```\n * cameraControls.fitToBox( myMesh );\n * ```\n * @param box3OrObject Axis aligned bounding box to fit the view.\n * @param enableTransition Whether to move smoothly or immediately.\n * @param options | `<object>` { cover: boolean, paddingTop: number, paddingLeft: number, paddingBottom: number, paddingRight: number }\n * @returns Transition end promise\n * @category Methods\n */\n fitToBox(box3OrObject, enableTransition, { cover = false, paddingLeft = 0, paddingRight = 0, paddingBottom = 0, paddingTop = 0 } = {}) {\n const promises = [];\n const aabb = box3OrObject.isBox3\n ? _box3A.copy(box3OrObject)\n : _box3A.setFromObject(box3OrObject);\n if (aabb.isEmpty()) {\n console.warn('camera-controls: fitTo() cannot be used with an empty box. Aborting');\n Promise.resolve();\n }\n // round to closest axis ( forward | backward | right | left | top | bottom )\n const theta = roundToStep(this._sphericalEnd.theta, PI_HALF);\n const phi = roundToStep(this._sphericalEnd.phi, PI_HALF);\n promises.push(this.rotateTo(theta, phi, enableTransition));\n const normal = _v3A.setFromSpherical(this._sphericalEnd).normalize();\n const rotation = _quaternionA.setFromUnitVectors(normal, _AXIS_Z);\n const viewFromPolar = approxEquals(Math.abs(normal.y), 1);\n if (viewFromPolar) {\n rotation.multiply(_quaternionB.setFromAxisAngle(_AXIS_Y, theta));\n }\n rotation.multiply(this._yAxisUpSpaceInverse);\n // make oriented bounding box\n const bb = _box3B.makeEmpty();\n // left bottom back corner\n _v3B.copy(aabb.min).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right bottom back corner\n _v3B.copy(aabb.min).setX(aabb.max.x).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left top back corner\n _v3B.copy(aabb.min).setY(aabb.max.y).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right top back corner\n _v3B.copy(aabb.max).setZ(aabb.min.z).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left bottom front corner\n _v3B.copy(aabb.min).setZ(aabb.max.z).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right bottom front corner\n _v3B.copy(aabb.max).setY(aabb.min.y).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left top front corner\n _v3B.copy(aabb.max).setX(aabb.min.x).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right top front corner\n _v3B.copy(aabb.max).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // add padding\n bb.min.x -= paddingLeft;\n bb.min.y -= paddingBottom;\n bb.max.x += paddingRight;\n bb.max.y += paddingTop;\n rotation.setFromUnitVectors(_AXIS_Z, normal);\n if (viewFromPolar) {\n rotation.premultiply(_quaternionB.invert());\n }\n rotation.premultiply(this._yAxisUpSpace);\n const bbSize = bb.getSize(_v3A);\n const center = bb.getCenter(_v3B).applyQuaternion(rotation);\n if (isPerspectiveCamera(this._camera)) {\n const distance = this.getDistanceToFitBox(bbSize.x, bbSize.y, bbSize.z, cover);\n promises.push(this.moveTo(center.x, center.y, center.z, enableTransition));\n promises.push(this.dollyTo(distance, enableTransition));\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const width = camera.right - camera.left;\n const height = camera.top - camera.bottom;\n const zoom = cover ? Math.max(width / bbSize.x, height / bbSize.y) : Math.min(width / bbSize.x, height / bbSize.y);\n promises.push(this.moveTo(center.x, center.y, center.z, enableTransition));\n promises.push(this.zoomTo(zoom, enableTransition));\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n }\n return Promise.all(promises);\n }\n /**\n * Fit the viewport to the sphere or the bounding sphere of the object.\n * @param sphereOrMesh\n * @param enableTransition\n * @category Methods\n */\n fitToSphere(sphereOrMesh, enableTransition) {\n const promises = [];\n const isObject3D = 'isObject3D' in sphereOrMesh;\n const boundingSphere = isObject3D ?\n CameraControls.createBoundingSphere(sphereOrMesh, _sphere) :\n _sphere.copy(sphereOrMesh);\n promises.push(this.moveTo(boundingSphere.center.x, boundingSphere.center.y, boundingSphere.center.z, enableTransition));\n if (isPerspectiveCamera(this._camera)) {\n const distanceToFit = this.getDistanceToFitSphere(boundingSphere.radius);\n promises.push(this.dollyTo(distanceToFit, enableTransition));\n }\n else if (isOrthographicCamera(this._camera)) {\n const width = this._camera.right - this._camera.left;\n const height = this._camera.top - this._camera.bottom;\n const diameter = 2 * boundingSphere.radius;\n const zoom = Math.min(width / diameter, height / diameter);\n promises.push(this.zoomTo(zoom, enableTransition));\n }\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n return Promise.all(promises);\n }\n /**\n * Look at the `target` from the `position`.\n * @param positionX\n * @param positionY\n * @param positionZ\n * @param targetX\n * @param targetY\n * @param targetZ\n * @param enableTransition\n * @category Methods\n */\n setLookAt(positionX, positionY, positionZ, targetX, targetY, targetZ, enableTransition = false) {\n this._isUserControllingRotate = false;\n this._isUserControllingDolly = false;\n this._isUserControllingTruck = false;\n this._lastDollyDirection = DOLLY_DIRECTION.NONE;\n this._changedDolly = 0;\n const target = _v3B.set(targetX, targetY, targetZ);\n const position = _v3A.set(positionX, positionY, positionZ);\n this._targetEnd.copy(target);\n this._sphericalEnd.setFromVector3(position.sub(target).applyQuaternion(this._yAxisUpSpace));\n this.normalizeRotations();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold) &&\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold) &&\n approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Similar to setLookAt, but it interpolates between two states.\n * @param positionAX\n * @param positionAY\n * @param positionAZ\n * @param targetAX\n * @param targetAY\n * @param targetAZ\n * @param positionBX\n * @param positionBY\n * @param positionBZ\n * @param targetBX\n * @param targetBY\n * @param targetBZ\n * @param t\n * @param enableTransition\n * @category Methods\n */\n lerpLookAt(positionAX, positionAY, positionAZ, targetAX, targetAY, targetAZ, positionBX, positionBY, positionBZ, targetBX, targetBY, targetBZ, t, enableTransition = false) {\n this._isUserControllingRotate = false;\n this._isUserControllingDolly = false;\n this._isUserControllingTruck = false;\n this._lastDollyDirection = DOLLY_DIRECTION.NONE;\n this._changedDolly = 0;\n const targetA = _v3A.set(targetAX, targetAY, targetAZ);\n const positionA = _v3B.set(positionAX, positionAY, positionAZ);\n _sphericalA.setFromVector3(positionA.sub(targetA).applyQuaternion(this._yAxisUpSpace));\n const targetB = _v3C.set(targetBX, targetBY, targetBZ);\n const positionB = _v3B.set(positionBX, positionBY, positionBZ);\n _sphericalB.setFromVector3(positionB.sub(targetB).applyQuaternion(this._yAxisUpSpace));\n this._targetEnd.copy(targetA.lerp(targetB, t)); // tricky\n const deltaTheta = _sphericalB.theta - _sphericalA.theta;\n const deltaPhi = _sphericalB.phi - _sphericalA.phi;\n const deltaRadius = _sphericalB.radius - _sphericalA.radius;\n this._sphericalEnd.set(_sphericalA.radius + deltaRadius * t, _sphericalA.phi + deltaPhi * t, _sphericalA.theta + deltaTheta * t);\n this.normalizeRotations();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold) &&\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold) &&\n approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Set angle and distance by given position.\n * An alias of `setLookAt()`, without target change. Thus keep gazing at the current target\n * @param positionX\n * @param positionY\n * @param positionZ\n * @param enableTransition\n * @category Methods\n */\n setPosition(positionX, positionY, positionZ, enableTransition = false) {\n return this.setLookAt(positionX, positionY, positionZ, this._targetEnd.x, this._targetEnd.y, this._targetEnd.z, enableTransition);\n }\n /**\n * Set the target position where gaze at.\n * An alias of `setLookAt()`, without position change. Thus keep the same position.\n * @param targetX\n * @param targetY\n * @param targetZ\n * @param enableTransition\n * @category Methods\n */\n setTarget(targetX, targetY, targetZ, enableTransition = false) {\n const pos = this.getPosition(_v3A);\n const promise = this.setLookAt(pos.x, pos.y, pos.z, targetX, targetY, targetZ, enableTransition);\n // see https://github.com/yomotsu/camera-controls/issues/335\n this._sphericalEnd.phi = clamp(this._sphericalEnd.phi, this.minPolarAngle, this.maxPolarAngle);\n return promise;\n }\n /**\n * Set focal offset using the screen parallel coordinates. z doesn't affect in Orthographic as with Dolly.\n * @param x\n * @param y\n * @param z\n * @param enableTransition\n * @category Methods\n */\n setFocalOffset(x, y, z, enableTransition = false) {\n this._isUserControllingOffset = false;\n this._focalOffsetEnd.set(x, y, z);\n this._needsUpdate = true;\n if (!enableTransition)\n this._focalOffset.copy(this._focalOffsetEnd);\n const resolveImmediately = !enableTransition ||\n approxEquals(this._focalOffset.x, this._focalOffsetEnd.x, this.restThreshold) &&\n approxEquals(this._focalOffset.y, this._focalOffsetEnd.y, this.restThreshold) &&\n approxEquals(this._focalOffset.z, this._focalOffsetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Set orbit point without moving the camera.\n * SHOULD NOT RUN DURING ANIMATIONS. `setOrbitPoint()` will immediately fix the positions.\n * @param targetX\n * @param targetY\n * @param targetZ\n * @category Methods\n */\n setOrbitPoint(targetX, targetY, targetZ) {\n this._camera.updateMatrixWorld();\n _xColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 1);\n _zColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 2);\n const position = _v3A.set(targetX, targetY, targetZ);\n const distance = position.distanceTo(this._camera.position);\n const cameraToPoint = position.sub(this._camera.position);\n _xColumn.multiplyScalar(cameraToPoint.x);\n _yColumn.multiplyScalar(cameraToPoint.y);\n _zColumn.multiplyScalar(cameraToPoint.z);\n _v3A.copy(_xColumn).add(_yColumn).add(_zColumn);\n _v3A.z = _v3A.z + distance;\n this.dollyTo(distance, false);\n this.setFocalOffset(-_v3A.x, _v3A.y, -_v3A.z, false);\n this.moveTo(targetX, targetY, targetZ, false);\n }\n /**\n * Set the boundary box that encloses the target of the camera. box3 is in THREE.Box3\n * @param box3\n * @category Methods\n */\n setBoundary(box3) {\n if (!box3) {\n this._boundary.min.set(-Infinity, -Infinity, -Infinity);\n this._boundary.max.set(Infinity, Infinity, Infinity);\n this._needsUpdate = true;\n return;\n }\n this._boundary.copy(box3);\n this._boundary.clampPoint(this._targetEnd, this._targetEnd);\n this._needsUpdate = true;\n }\n /**\n * Set (or unset) the current viewport.\n * Set this when you want to use renderer viewport and .dollyToCursor feature at the same time.\n * @param viewportOrX\n * @param y\n * @param width\n * @param height\n * @category Methods\n */\n setViewport(viewportOrX, y, width, height) {\n if (viewportOrX === null) { // null\n this._viewport = null;\n return;\n }\n this._viewport = this._viewport || new THREE.Vector4();\n if (typeof viewportOrX === 'number') { // number\n this._viewport.set(viewportOrX, y, width, height);\n }\n else { // Vector4\n this._viewport.copy(viewportOrX);\n }\n }\n /**\n * Calculate the distance to fit the box.\n * @param width box width\n * @param height box height\n * @param depth box depth\n * @returns distance\n * @category Methods\n */\n getDistanceToFitBox(width, height, depth, cover = false) {\n if (notSupportedInOrthographicCamera(this._camera, 'getDistanceToFitBox'))\n return this._spherical.radius;\n const boundingRectAspect = width / height;\n const fov = this._camera.getEffectiveFOV() * DEG2RAD;\n const aspect = this._camera.aspect;\n const heightToFit = (cover ? boundingRectAspect > aspect : boundingRectAspect < aspect) ? height : width / aspect;\n return heightToFit * 0.5 / Math.tan(fov * 0.5) + depth * 0.5;\n }\n /**\n * Calculate the distance to fit the sphere.\n * @param radius sphere radius\n * @returns distance\n * @category Methods\n */\n getDistanceToFitSphere(radius) {\n if (notSupportedInOrthographicCamera(this._camera, 'getDistanceToFitSphere'))\n return this._spherical.radius;\n // https://stackoverflow.com/a/44849975\n const vFOV = this._camera.getEffectiveFOV() * DEG2RAD;\n const hFOV = Math.atan(Math.tan(vFOV * 0.5) * this._camera.aspect) * 2;\n const fov = 1 < this._camera.aspect ? vFOV : hFOV;\n return radius / (Math.sin(fov * 0.5));\n }\n /**\n * Returns the orbit center position, where the camera looking at.\n * @param out The receiving Vector3 instance to copy the result\n * @param receiveEndValue Whether receive the transition end coords or current. default is `true`\n * @category Methods\n */\n getTarget(out, receiveEndValue = true) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.copy(receiveEndValue ? this._targetEnd : this._target);\n }\n /**\n * Returns the camera position.\n * @param out The receiving Vector3 instance to copy the result\n * @param receiveEndValue Whether receive the transition end coords or current. default is `true`\n * @category Methods\n */\n getPosition(out, receiveEndValue = true) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.setFromSpherical(receiveEndValue ? this._sphericalEnd : this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(receiveEndValue ? this._targetEnd : this._target);\n }\n /**\n * Returns the spherical coordinates of the orbit.\n * @param out The receiving Spherical instance to copy the result\n * @param receiveEndValue Whether receive the transition end coords or current. default is `true`\n * @category Methods\n */\n getSpherical(out, receiveEndValue = true) {\n const _out = out || new THREE.Spherical();\n return _out.copy(receiveEndValue ? this._sphericalEnd : this._spherical);\n }\n /**\n * Returns the focal offset, which is how much the camera appears to be translated in screen parallel coordinates.\n * @param out The receiving Vector3 instance to copy the result\n * @param receiveEndValue Whether receive the transition end coords or current. default is `true`\n * @category Methods\n */\n getFocalOffset(out, receiveEndValue = true) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.copy(receiveEndValue ? this._focalOffsetEnd : this._focalOffset);\n }\n /**\n * Normalize camera azimuth angle rotation between 0 and 360 degrees.\n * @category Methods\n */\n normalizeRotations() {\n this._sphericalEnd.theta = this._sphericalEnd.theta % PI_2;\n if (this._sphericalEnd.theta < 0)\n this._sphericalEnd.theta += PI_2;\n this._spherical.theta += PI_2 * Math.round((this._sphericalEnd.theta - this._spherical.theta) / PI_2);\n }\n /**\n * stop all transitions.\n */\n stop() {\n this._focalOffset.copy(this._focalOffsetEnd);\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n this._zoom = this._zoomEnd;\n }\n /**\n * Reset all rotation and position to defaults.\n * @param enableTransition\n * @category Methods\n */\n reset(enableTransition = false) {\n if (!approxEquals(this._camera.up.x, this._cameraUp0.x) ||\n !approxEquals(this._camera.up.y, this._cameraUp0.y) ||\n !approxEquals(this._camera.up.z, this._cameraUp0.z)) {\n this._camera.up.copy(this._cameraUp0);\n const position = this.getPosition(_v3A);\n this.updateCameraUp();\n this.setPosition(position.x, position.y, position.z);\n }\n const promises = [\n this.setLookAt(this._position0.x, this._position0.y, this._position0.z, this._target0.x, this._target0.y, this._target0.z, enableTransition),\n this.setFocalOffset(this._focalOffset0.x, this._focalOffset0.y, this._focalOffset0.z, enableTransition),\n this.zoomTo(this._zoom0, enableTransition),\n ];\n return Promise.all(promises);\n }\n /**\n * Set current camera position as the default position.\n * @category Methods\n */\n saveState() {\n this._cameraUp0.copy(this._camera.up);\n this.getTarget(this._target0);\n this.getPosition(this._position0);\n this._zoom0 = this._zoom;\n this._focalOffset0.copy(this._focalOffset);\n }\n /**\n * Sync camera-up direction.\n * When camera-up vector is changed, `.updateCameraUp()` must be called.\n * @category Methods\n */\n updateCameraUp() {\n this._yAxisUpSpace.setFromUnitVectors(this._camera.up, _AXIS_Y);\n this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert();\n }\n /**\n * Apply current camera-up direction to the camera.\n * The orbit system will be re-initialized with the current position.\n * @category Methods\n */\n applyCameraUp() {\n const cameraDirection = _v3A.subVectors(this._target, this._camera.position).normalize();\n // So first find the vector off to the side, orthogonal to both this.object.up and\n // the \"view\" vector.\n const side = _v3B.crossVectors(cameraDirection, this._camera.up);\n // Then find the vector orthogonal to both this \"side\" vector and the \"view\" vector.\n // This vector will be the new \"up\" vector.\n this._camera.up.crossVectors(side, cameraDirection).normalize();\n this._camera.updateMatrixWorld();\n const position = this.getPosition(_v3A);\n this.updateCameraUp();\n this.setPosition(position.x, position.y, position.z);\n }\n /**\n * Update camera position and directions.\n * This should be called in your tick loop every time, and returns true if re-rendering is needed.\n * @param delta\n * @returns updated\n * @category Methods\n */\n update(delta) {\n const deltaTheta = this._sphericalEnd.theta - this._spherical.theta;\n const deltaPhi = this._sphericalEnd.phi - this._spherical.phi;\n const deltaRadius = this._sphericalEnd.radius - this._spherical.radius;\n const deltaTarget = _deltaTarget.subVectors(this._targetEnd, this._target);\n const deltaOffset = _deltaOffset.subVectors(this._focalOffsetEnd, this._focalOffset);\n const deltaZoom = this._zoomEnd - this._zoom;\n // update theta\n if (approxZero(deltaTheta)) {\n this._thetaVelocity.value = 0;\n this._spherical.theta = this._sphericalEnd.theta;\n }\n else {\n const smoothTime = this._isUserControllingRotate ? this.draggingSmoothTime : this.smoothTime;\n this._spherical.theta = smoothDamp(this._spherical.theta, this._sphericalEnd.theta, this._thetaVelocity, smoothTime, Infinity, delta);\n this._needsUpdate = true;\n }\n // update phi\n if (approxZero(deltaPhi)) {\n this._phiVelocity.value = 0;\n this._spherical.phi = this._sphericalEnd.phi;\n }\n else {\n const smoothTime = this._isUserControllingRotate ? this.draggingSmoothTime : this.smoothTime;\n this._spherical.phi = smoothDamp(this._spherical.phi, this._sphericalEnd.phi, this._phiVelocity, smoothTime, Infinity, delta);\n this._needsUpdate = true;\n }\n // update distance\n if (approxZero(deltaRadius)) {\n this._radiusVelocity.value = 0;\n this._spherical.radius = this._sphericalEnd.radius;\n }\n else {\n const smoothTime = this._isUserControllingDolly ? this.draggingSmoothTime : this.smoothTime;\n this._spherical.radius = smoothDamp(this._spherical.radius, this._sphericalEnd.radius, this._radiusVelocity, smoothTime, this.maxSpeed, delta);\n this._needsUpdate = true;\n }\n // update target position\n if (approxZero(deltaTarget.x) && approxZero(deltaTarget.y) && approxZero(deltaTarget.z)) {\n this._targetVelocity.set(0, 0, 0);\n this._target.copy(this._targetEnd);\n }\n else {\n const smoothTime = this._isUserControllingTruck ? this.draggingSmoothTime : this.smoothTime;\n smoothDampVec3(this._target, this._targetEnd, this._targetVelocity, smoothTime, this.maxSpeed, delta, this._target);\n this._needsUpdate = true;\n }\n // update focalOffset\n if (approxZero(deltaOffset.x) && approxZero(deltaOffset.y) && approxZero(deltaOffset.z)) {\n this._focalOffsetVelocity.set(0, 0, 0);\n this._focalOffset.copy(this._focalOffsetEnd);\n }\n else {\n const smoothTime = this._isUserControllingOffset ? this.draggingSmoothTime : this.smoothTime;\n smoothDampVec3(this._focalOffset, this._focalOffsetEnd, this._focalOffsetVelocity, smoothTime, this.maxSpeed, delta, this._focalOffset);\n this._needsUpdate = true;\n }\n // update zoom\n if (approxZero(deltaZoom)) {\n this._zoomVelocity.value = 0;\n this._zoom = this._zoomEnd;\n }\n else {\n const smoothTime = this._isUserControllingZoom ? this.draggingSmoothTime : this.smoothTime;\n this._zoom = smoothDamp(this._zoom, this._zoomEnd, this._zoomVelocity, smoothTime, Infinity, delta);\n }\n if (this.dollyToCursor) {\n if (isPerspectiveCamera(this._camera) && this._changedDolly !== 0) {\n const dollyControlAmount = this._spherical.radius - this._lastDistance;\n const camera = this._camera;\n const cameraDirection = this._getCameraDirection(_cameraDirection);\n const planeX = _v3A.copy(cameraDirection).cross(camera.up).normalize();\n if (planeX.lengthSq() === 0)\n planeX.x = 1.0;\n const planeY = _v3B.crossVectors(planeX, cameraDirection);\n const worldToScreen = this._sphericalEnd.radius * Math.tan(camera.getEffectiveFOV() * DEG2RAD * 0.5);\n const prevRadius = this._sphericalEnd.radius - dollyControlAmount;\n const lerpRatio = (prevRadius - this._sphericalEnd.radius) / this._sphericalEnd.radius;\n const cursor = _v3C.copy(this._targetEnd)\n .add(planeX.multiplyScalar(this._dollyControlCoord.x * worldToScreen * camera.aspect))\n .add(planeY.multiplyScalar(this._dollyControlCoord.y * worldToScreen));\n const newTargetEnd = _v3A.copy(this._targetEnd).lerp(cursor, lerpRatio);\n const isMin = this._lastDollyDirection === DOLLY_DIRECTION.IN && this._spherical.radius <= this.minDistance;\n const isMax = this._lastDollyDirection === DOLLY_DIRECTION.OUT && this.maxDistance <= this._spherical.radius;\n if (this.infinityDolly && (isMin || isMax)) {\n this._sphericalEnd.radius -= dollyControlAmount;\n this._spherical.radius -= dollyControlAmount;\n const dollyAmount = _v3B.copy(cameraDirection).multiplyScalar(-dollyControlAmount);\n newTargetEnd.add(dollyAmount);\n }\n // target position may be moved beyond boundary.\n this._boundary.clampPoint(newTargetEnd, newTargetEnd);\n const targetEndDiff = _v3B.subVectors(newTargetEnd, this._targetEnd);\n this._targetEnd.copy(newTargetEnd);\n this._target.add(targetEndDiff);\n this._changedDolly -= dollyControlAmount;\n if (approxZero(this._changedDolly))\n this._changedDolly = 0;\n }\n else if (isOrthographicCamera(this._camera) && this._changedZoom !== 0) {\n const dollyControlAmount = this._zoom - this._lastZoom;\n const camera = this._camera;\n const worldCursorPosition = _v3A.set(this._dollyControlCoord.x, this._dollyControlCoord.y, (camera.near + camera.far) / (camera.near - camera.far)).unproject(camera);\n const quaternion = _v3B.set(0, 0, -1).applyQuaternion(camera.quaternion);\n const cursor = _v3C.copy(worldCursorPosition).add(quaternion.multiplyScalar(-worldCursorPosition.dot(camera.up)));\n const prevZoom = this._zoom - dollyControlAmount;\n const lerpRatio = -(prevZoom - this._zoom) / this._zoom;\n // find the \"distance\" (aka plane constant in three.js) of Plane\n // from a given position (this._targetEnd) and normal vector (cameraDirection)\n // https://www.maplesoft.com/support/help/maple/view.aspx?path=MathApps%2FEquationOfAPlaneNormal#bkmrk0\n const cameraDirection = this._getCameraDirection(_cameraDirection);\n const prevPlaneConstant = this._targetEnd.dot(cameraDirection);\n const newTargetEnd = _v3A.copy(this._targetEnd).lerp(cursor, lerpRatio);\n const newPlaneConstant = newTargetEnd.dot(cameraDirection);\n // Pull back the camera depth that has moved, to be the camera stationary as zoom\n const pullBack = cameraDirection.multiplyScalar(newPlaneConstant - prevPlaneConstant);\n newTargetEnd.sub(pullBack);\n // target position may be moved beyond boundary.\n this._boundary.clampPoint(newTargetEnd, newTargetEnd);\n const targetEndDiff = _v3B.subVectors(newTargetEnd, this._targetEnd);\n this._targetEnd.copy(newTargetEnd);\n this._target.add(targetEndDiff);\n // this._target.copy( this._targetEnd );\n this._changedZoom -= dollyControlAmount;\n if (approxZero(this._changedZoom))\n this._changedZoom = 0;\n }\n }\n if (this._camera.zoom !== this._zoom) {\n this._camera.zoom = this._zoom;\n this._camera.updateProjectionMatrix();\n this._updateNearPlaneCorners();\n this._needsUpdate = true;\n }\n this._dragNeedsUpdate = true;\n // collision detection\n const maxDistance = this._collisionTest();\n this._spherical.radius = Math.min(this._spherical.radius, maxDistance);\n // decompose spherical to the camera position\n this._spherical.makeSafe();\n this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target);\n this._camera.lookAt(this._target);\n // set offset after the orbit movement\n const affectOffset = !approxZero(this._focalOffset.x) ||\n !approxZero(this._focalOffset.y) ||\n !approxZero(this._focalOffset.z);\n if (affectOffset) {\n _xColumn.setFromMatrixColumn(this._camera.matrix, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrix, 1);\n _zColumn.setFromMatrixColumn(this._camera.matrix, 2);\n _xColumn.multiplyScalar(this._focalOffset.x);\n _yColumn.multiplyScalar(-this._focalOffset.y);\n _zColumn.multiplyScalar(this._focalOffset.z); // notice: z-offset will not affect in Orthographic.\n _v3A.copy(_xColumn).add(_yColumn).add(_zColumn);\n this._camera.position.add(_v3A);\n this._camera.updateMatrixWorld();\n }\n if (this._boundaryEnclosesCamera) {\n this._encloseToBoundary(this._camera.position.copy(this._target), _v3A.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse), 1.0);\n }\n const updated = this._needsUpdate;\n if (updated && !this._updatedLastTime) {\n this._hasRested = false;\n this.dispatchEvent({ type: 'wake' });\n this.dispatchEvent({ type: 'update' });\n }\n else if (updated) {\n this.dispatchEvent({ type: 'update' });\n if (approxZero(deltaTheta, this.restThreshold) &&\n approxZero(deltaPhi, this.restThreshold) &&\n approxZero(deltaRadius, this.restThreshold) &&\n approxZero(deltaTarget.x, this.restThreshold) &&\n approxZero(deltaTarget.y, this.restThreshold) &&\n approxZero(deltaTarget.z, this.restThreshold) &&\n approxZero(deltaOffset.x, this.restThreshold) &&\n approxZero(deltaOffset.y, this.restThreshold) &&\n approxZero(deltaOffset.z, this.restThreshold) &&\n approxZero(deltaZoom, this.restThreshold) &&\n !this._hasRested) {\n this._hasRested = true;\n this.dispatchEvent({ type: 'rest' });\n }\n }\n else if (!updated && this._updatedLastTime) {\n this.dispatchEvent({ type: 'sleep' });\n }\n this._lastDistance = this._spherical.radius;\n this._lastZoom = this._zoom;\n this._updatedLastTime = updated;\n this._needsUpdate = false;\n return updated;\n }\n /**\n * Get all state in JSON string\n * @category Methods\n */\n toJSON() {\n return JSON.stringify({\n enabled: this._enabled,\n minDistance: this.minDistance,\n maxDistance: infinityToMaxNumber(this.maxDistance),\n minZoom: this.minZoom,\n maxZoom: infinityToMaxNumber(this.maxZoom),\n minPolarAngle: this.minPolarAngle,\n maxPolarAngle: infinityToMaxNumber(this.maxPolarAngle),\n minAzimuthAngle: infinityToMaxNumber(this.minAzimuthAngle),\n maxAzimuthAngle: infinityToMaxNumber(this.maxAzimuthAngle),\n smoothTime: this.smoothTime,\n draggingSmoothTime: this.draggingSmoothTime,\n dollySpeed: this.dollySpeed,\n truckSpeed: this.truckSpeed,\n dollyToCursor: this.dollyToCursor,\n target: this._targetEnd.toArray(),\n position: _v3A.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),\n zoom: this._zoomEnd,\n focalOffset: this._focalOffsetEnd.toArray(),\n target0: this._target0.toArray(),\n position0: this._position0.toArray(),\n zoom0: this._zoom0,\n focalOffset0: this._focalOffset0.toArray(),\n });\n }\n /**\n * Reproduce the control state with JSON. enableTransition is where anim or not in a boolean.\n * @param json\n * @param enableTransition\n * @category Methods\n */\n fromJSON(json, enableTransition = false) {\n const obj = JSON.parse(json);\n this.enabled = obj.enabled;\n this.minDistance = obj.minDistance;\n this.maxDistance = maxNumberToInfinity(obj.maxDistance);\n this.minZoom = obj.minZoom;\n this.maxZoom = maxNumberToInfinity(obj.maxZoom);\n this.minPolarAngle = obj.minPolarAngle;\n this.maxPolarAngle = maxNumberToInfinity(obj.maxPolarAngle);\n this.minAzimuthAngle = maxNumberToInfinity(obj.minAzimuthAngle);\n this.maxAzimuthAngle = maxNumberToInfinity(obj.maxAzimuthAngle);\n this.smoothTime = obj.smoothTime;\n this.draggingSmoothTime = obj.draggingSmoothTime;\n this.dollySpeed = obj.dollySpeed;\n this.truckSpeed = obj.truckSpeed;\n this.dollyToCursor = obj.dollyToCursor;\n this._target0.fromArray(obj.target0);\n this._position0.fromArray(obj.position0);\n this._zoom0 = obj.zoom0;\n this._focalOffset0.fromArray(obj.focalOffset0);\n this.moveTo(obj.target[0], obj.target[1], obj.target[2], enableTransition);\n _sphericalA.setFromVector3(_v3A.fromArray(obj.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace));\n this.rotateTo(_sphericalA.theta, _sphericalA.phi, enableTransition);\n this.dollyTo(_sphericalA.radius, enableTransition);\n this.zoomTo(obj.zoom, enableTransition);\n this.setFocalOffset(obj.focalOffset[0], obj.focalOffset[1], obj.focalOffset[2], enableTransition);\n this._needsUpdate = true;\n }\n /**\n * Attach all internal event handlers to enable drag control.\n * @category Methods\n */\n connect(domElement) {\n if (this._domElement) {\n console.warn('camera-controls is already connected.');\n return;\n }\n domElement.setAttribute('data-camera-controls-version', VERSION);\n this._addAllEventListeners(domElement);\n this._getClientRect(this._elementRect);\n }\n /**\n * Detach all internal event handlers to disable drag control.\n */\n disconnect() {\n this.cancel();\n this._removeAllEventListeners();\n if (this._domElement) {\n this._domElement.removeAttribute('data-camera-controls-version');\n this._domElement = undefined;\n }\n }\n /**\n * Dispose the cameraControls instance itself, remove all eventListeners.\n * @category Methods\n */\n dispose() {\n // remove all user event listeners\n this.removeAllEventListeners();\n // remove all internal event listeners\n this.disconnect();\n }\n // it's okay to expose public though\n _getTargetDirection(out) {\n // divide by distance to normalize, lighter than `Vector3.prototype.normalize()`\n return out.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse);\n }\n // it's okay to expose public though\n _getCameraDirection(out) {\n return this._getTargetDirection(out).negate();\n }\n _findPointerById(pointerId) {\n return this._activePointers.find((activePointer) => activePointer.pointerId === pointerId);\n }\n _findPointerByMouseButton(mouseButton) {\n return this._activePointers.find((activePointer) => activePointer.mouseButton === mouseButton);\n }\n _disposePointer(pointer) {\n this._activePointers.splice(this._activePointers.indexOf(pointer), 1);\n }\n _encloseToBoundary(position, offset, friction) {\n const offsetLength2 = offset.lengthSq();\n if (offsetLength2 === 0.0) { // sanity check\n return position;\n }\n // See: https://twitter.com/FMS_Cat/status/1106508958640988161\n const newTarget = _v3B.copy(offset).add(position); // target\n const clampedTarget = this._boundary.clampPoint(newTarget, _v3C); // clamped target\n const deltaClampedTarget = clampedTarget.sub(newTarget); // newTarget -> clampedTarget\n const deltaClampedTargetLength2 = deltaClampedTarget.lengthSq(); // squared length of deltaClampedTarget\n if (deltaClampedTargetLength2 === 0.0) { // when the position doesn't have to be clamped\n return position.add(offset);\n }\n else if (deltaClampedTargetLength2 === offsetLength2) { // when the position is completely stuck\n return position;\n }\n else if (friction === 0.0) {\n return position.add(offset).add(deltaClampedTarget);\n }\n else {\n const offsetFactor = 1.0 + friction * deltaClampedTargetLength2 / offset.dot(deltaClampedTarget);\n return position\n .add(_v3B.copy(offset).multiplyScalar(offsetFactor))\n .add(deltaClampedTarget.multiplyScalar(1.0 - friction));\n }\n }\n _updateNearPlaneCorners() {\n if (isPerspectiveCamera(this._camera)) {\n const camera = this._camera;\n const near = camera.near;\n const fov = camera.getEffectiveFOV() * DEG2RAD;\n const heightHalf = Math.tan(fov * 0.5) * near; // near plain half height\n const widthHalf = heightHalf * camera.aspect; // near plain half width\n this._nearPlaneCorners[0].set(-widthHalf, -heightHalf, 0);\n this._nearPlaneCorners[1].set(widthHalf, -heightHalf, 0);\n this._nearPlaneCorners[2].set(widthHalf, heightHalf, 0);\n this._nearPlaneCorners[3].set(-widthHalf, heightHalf, 0);\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const zoomInv = 1 / camera.zoom;\n const left = camera.left * zoomInv;\n const right = camera.right * zoomInv;\n const top = camera.top * zoomInv;\n const bottom = camera.bottom * zoomInv;\n this._nearPlaneCorners[0].set(left, top, 0);\n this._nearPlaneCorners[1].set(right, top, 0);\n this._nearPlaneCorners[2].set(right, bottom, 0);\n this._nearPlaneCorners[3].set(left, bottom, 0);\n }\n }\n // lateUpdate\n _collisionTest() {\n let distance = Infinity;\n const hasCollider = this.colliderMeshes.length >= 1;\n if (!hasCollider)\n return distance;\n if (notSupportedInOrthographicCamera(this._camera, '_collisionTest'))\n return distance;\n const rayDirection = this._getTargetDirection(_cameraDirection);\n _rotationMatrix.lookAt(_ORIGIN, rayDirection, this._camera.up);\n for (let i = 0; i < 4; i++) {\n const nearPlaneCorner = _v3B.copy(this._nearPlaneCorners[i]);\n nearPlaneCorner.applyMatrix4(_rotationMatrix);\n const origin = _v3C.addVectors(this._target, nearPlaneCorner);\n _raycaster.set(origin, rayDirection);\n _raycaster.far = this._spherical.radius + 1;\n const intersects = _raycaster.intersectObjects(this.colliderMeshes);\n if (intersects.length !== 0 && intersects[0].distance < distance) {\n distance = intersects[0].distance;\n }\n }\n return distance;\n }\n /**\n * Get its client rect and package into given `DOMRect` .\n */\n _getClientRect(target) {\n if (!this._domElement)\n return;\n const rect = this._domElement.getBoundingClientRect();\n target.x = rect.left;\n target.y = rect.top;\n if (this._viewport) {\n target.x += this._viewport.x;\n target.y += rect.height - this._viewport.w - this._viewport.y;\n target.width = this._viewport.z;\n target.height = this._viewport.w;\n }\n else {\n target.width = rect.width;\n target.height = rect.height;\n }\n return target;\n }\n _createOnRestPromise(resolveImmediately) {\n if (resolveImmediately)\n return Promise.resolve();\n this._hasRested = false;\n this.dispatchEvent({ type: 'transitionstart' });\n return new Promise((resolve) => {\n const onResolve = () => {\n this.removeEventListener('rest', onResolve);\n resolve();\n };\n this.addEventListener('rest', onResolve);\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _addAllEventListeners(_domElement) { }\n _removeAllEventListeners() { }\n /**\n * backward compatible\n * @deprecated use smoothTime (in seconds) instead\n * @category Properties\n */\n get dampingFactor() {\n console.warn('.dampingFactor has been deprecated. use smoothTime (in seconds) instead.');\n return 0;\n }\n /**\n * backward compatible\n * @deprecated use smoothTime (in seconds) instead\n * @category Properties\n */\n set dampingFactor(_) {\n console.warn('.dampingFactor has been deprecated. use smoothTime (in seconds) instead.');\n }\n /**\n * backward compatible\n * @deprecated use draggingSmoothTime (in seconds) instead\n * @category Properties\n */\n get draggingDampingFactor() {\n console.warn('.draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.');\n return 0;\n }\n /**\n * backward compatible\n * @deprecated use draggingSmoothTime (in seconds) instead\n * @category Properties\n */\n set draggingDampingFactor(_) {\n console.warn('.draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.');\n }\n static createBoundingSphere(object3d, out = new THREE.Sphere()) {\n const boundingSphere = out;\n const center = boundingSphere.center;\n _box3A.makeEmpty();\n // find the center\n object3d.traverseVisible((object) => {\n if (!object.isMesh)\n return;\n _box3A.expandByObject(object);\n });\n _box3A.getCenter(center);\n // find the radius\n let maxRadiusSq = 0;\n object3d.traverseVisible((object) => {\n if (!object.isMesh)\n return;\n const mesh = object;\n if (!mesh.geometry)\n return;\n const geometry = mesh.geometry.clone();\n geometry.applyMatrix4(mesh.matrixWorld);\n const bufferGeometry = geometry;\n const position = bufferGeometry.attributes.position;\n for (let i = 0, l = position.count; i < l; i++) {\n _v3A.fromBufferAttribute(position, i);\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_v3A));\n }\n });\n boundingSphere.radius = Math.sqrt(maxRadiusSq);\n return boundingSphere;\n }\n}\n\nexport { EventDispatcher, CameraControls as default };\n","import type { Vector3 } from 'three';\n\nexport default class CameraPosition {\n public readonly camera: Vector3;\n public readonly focalOffset: Vector3;\n public readonly target: Vector3;\n\n public constructor(camera: Vector3, target: Vector3, focalOffset: Vector3) {\n this.camera = camera;\n this.target = target;\n this.focalOffset = focalOffset;\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type GUI from 'lil-gui';\n\nimport Panel from '@giro3d/giro3d/gui/Panel';\nimport { Vector3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\n\nimport CameraPosition from '@/types/CameraPosition';\n\nclass CameraControlsInspector extends Panel {\n public camera: CameraController;\n private _boundOnAfterCameraUpdate: () => void;\n private _cameraPosition: CameraPosition;\n\n /**\n * @param gui - The GUI.\n * @param instance - The Giro3D instance.\n */\n public constructor(gui: GUI, cameraController: CameraController, instance: Instance) {\n super(gui, instance, 'Camera Controls');\n\n this.camera = cameraController;\n this._cameraPosition = new CameraPosition(new Vector3(), new Vector3(), new Vector3());\n\n this._boundOnAfterCameraUpdate = this.onAfterCameraUpdate.bind(this);\n this.instance.addEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n const position = this.gui.addFolder('Position');\n position.close();\n this._controllers.push(position.add(this._cameraPosition.camera, 'x'));\n this._controllers.push(position.add(this._cameraPosition.camera, 'y'));\n this._controllers.push(position.add(this._cameraPosition.camera, 'z'));\n\n const target = this.gui.addFolder('Target');\n target.close();\n this._controllers.push(target.add(this._cameraPosition.target, 'x'));\n this._controllers.push(target.add(this._cameraPosition.target, 'y'));\n this._controllers.push(target.add(this._cameraPosition.target, 'z'));\n\n const focalOffset = this.gui.addFolder('Focal offset');\n focalOffset.close();\n this._controllers.push(focalOffset.add(this._cameraPosition.focalOffset, 'x'));\n this._controllers.push(focalOffset.add(this._cameraPosition.focalOffset, 'y'));\n this._controllers.push(focalOffset.add(this._cameraPosition.focalOffset, 'z'));\n }\n\n public override dispose(): void {\n this.instance.removeEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n super.dispose();\n }\n\n private onAfterCameraUpdate(): void {\n this.camera.getCameraPosition(this._cameraPosition);\n }\n}\n\nexport default CameraControlsInspector;\n","import type Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport type Inspector from '@giro3d/giro3d/gui/Inspector';\nimport type { Object3D } from 'three';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport CameraControls from 'camera-controls';\nimport {\n Box3,\n Clock,\n EventDispatcher,\n MathUtils,\n Matrix4,\n Quaternion,\n Raycaster,\n Sphere,\n Spherical,\n Vector2,\n Vector3,\n Vector4,\n} from 'three';\n\nimport type NavigationMode from '@/types/NavigationMode';\n\nimport CameraControlsInspector from '@/giro3d/CameraControlsInspector';\nimport { useCameraStore } from '@/stores/camera';\nimport { useGiro3dStore } from '@/stores/giro3d';\nimport CameraPosition from '@/types/CameraPosition';\n\nimport type Picker from './Picker';\nimport type SceneCursorManager from './SceneCursorManager';\n\nCameraControls.install({\n THREE: {\n Box3,\n MathUtils,\n Matrix4,\n Quaternion,\n Raycaster,\n Sphere,\n Spherical,\n Vector2,\n Vector3,\n Vector4,\n },\n});\n\ntype CameraControllerEventMap = {\n 'interaction-end': {\n /** empty */\n };\n 'interaction-start': {\n /** empty */\n };\n};\n\nconst tmpVec3 = new Vector3();\n\n/**\n * Wraps Camera-controls into Giro3D\n */\nclass CameraController extends EventDispatcher<CameraControllerEventMap> {\n public get enabled(): boolean {\n return this._orbitControls.enabled;\n }\n public set enabled(v: boolean) {\n this._orbitControls.enabled = v;\n }\n private readonly _boundOnAfterCameraUpdate: () => void;\n private readonly _boundOnBeforeCameraUpdate: () => void;\n private _boundOrbitControlsOnContextMenu!: (e: MouseEvent) => void;\n private _boundOrbitControlsOnKey!: (e: KeyboardEvent) => void;\n private _boundOrbitControlsOnMouseUp!: (e: MouseEvent) => void;\n private _boundOrbitControlsOnWheel!: (e: MouseEvent) => void;\n private _boundPositionOnMapOnClick: ((e: MouseEvent) => void) | null;\n private _boundPositionOnMapOnContextMenu: ((e: MouseEvent) => void) | null;\n private _boundPositionOnMapOnMouseMove: ((e: MouseEvent) => void) | null;\n private _cameraControlsInspector: CameraControlsInspector | null;\n private readonly _clock: Clock;\n private readonly _cursorManager: SceneCursorManager;\n private readonly _giro3dStore = useGiro3dStore();\n private readonly _instance: Instance;\n private readonly _orbitControls: CameraControls;\n private readonly _picker: Picker;\n private readonly _pickObjectsAt: (e: MouseEvent) => PickResult | null;\n\n private readonly _store = useCameraStore();\n\n /**\n * Creates new Camera-controls and bind them to Giro3D.\n *\n * @param instance - Giro3D instance\n * @param picker - Picker\n */\n public constructor(instance: Instance, picker: Picker, cursorManager: SceneCursorManager) {\n super();\n this._instance = instance;\n this._picker = picker;\n this._cursorManager = cursorManager;\n this._orbitControls = new CameraControls(\n this._instance.view.camera,\n this._instance.domElement,\n );\n\n this._cameraControlsInspector = null;\n\n this.initializeOrbitControls();\n\n this._pickObjectsAt = (event: MouseEvent): PickResult | null =>\n this._picker.getFirstFeatureAt(this._instance, event, 1)?.at(0) ?? null;\n\n this._clock = new Clock();\n\n // Update controls from event loop - this replaces the requestAnimationFrame logic from\n // camera-controls sample code\n this._boundOnBeforeCameraUpdate = this.onBeforeCameraUpdate.bind(this);\n this._boundOnAfterCameraUpdate = this.onAfterCameraUpdate.bind(this);\n this._instance.addEventListener('before-camera-update', this._boundOnBeforeCameraUpdate);\n this._instance.addEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n this._boundPositionOnMapOnClick = null;\n this._boundPositionOnMapOnMouseMove = null;\n this._boundPositionOnMapOnContextMenu = null;\n\n this._store.$onAction(({ args, name }) => {\n switch (name) {\n case 'lookTopDownAt':\n void this.lookTopDownAt(args[0]);\n break;\n case 'setCameraPosition':\n this.setCamera(args[0]);\n break;\n case 'setNavigationMode':\n this.setNavigationMode(args[0]);\n break;\n }\n });\n\n const inspector = this._giro3dStore.getInspector();\n if (inspector != null) {\n this.initializeInspector(inspector);\n }\n this._giro3dStore.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'setInspector':\n this.initializeInspector(args[0]);\n break;\n }\n });\n });\n }\n\n public dispose(): void {\n this._instance.removeEventListener('before-camera-update', this._boundOnBeforeCameraUpdate);\n this._instance.removeEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n this._disablePositionOnMap();\n this.disposeOrbitControls();\n }\n\n /**\n * Executes an interaction with animation.\n *\n * Required to call this instead of calling directly camera-controls because\n * of how Giro3D mainloop works.\n *\n * @param callback - Interaction to execute\n * @returns Resolves when interaction is done\n */\n public executeInteraction<T = void>(callback: () => Promise<T>): Promise<T> {\n this._orbitControls.update(this._clock.getDelta());\n\n // Execute the interaction\n const res = callback();\n\n // As mainloop can pause, before_camera_update can be triggered irregularly\n // Make sure to \"reset\" the clock to enable smooth transitions with camera-controls\n this._orbitControls.update(this._clock.getDelta());\n // Dispatch events so giro3d and giro3dservice gets notified\n this._orbitControls.dispatchEvent({ type: 'update' });\n return res;\n }\n\n public getCameraPosition(target?: CameraPosition): CameraPosition {\n const controls = this._orbitControls;\n const cameraPosition =\n target ?? new CameraPosition(new Vector3(), new Vector3(), new Vector3());\n\n controls.getPosition(cameraPosition.camera);\n controls.getTarget(cameraPosition.target);\n controls.getFocalOffset(cameraPosition.focalOffset);\n\n return cameraPosition;\n }\n /**\n * Looks to a bounding box or Object3D.\n *\n * @param obj - Bounding box or Object to look at\n * @param enableTransition - Enables transition\n * @param options - Camera-controls' fitToBox options\n * @returns Resolves when interaction is done\n */\n public goToBox(\n obj: Box3 | Entity3D | Object3D,\n enableTransition: boolean = true,\n options: object = {\n paddingBottom: 10,\n paddingLeft: 10,\n paddingRight: 10,\n paddingTop: 10,\n },\n ): Promise<void[]> {\n const bbox = this.getBox(obj);\n return this.executeInteraction(() => {\n void this._orbitControls.setFocalOffset(0, 0, 0);\n return this._orbitControls.fitToBox(bbox, enableTransition, options);\n });\n }\n /**\n * Sets the camera to look at a position.\n *\n * @param position - Position of the camera\n * @param lookAt - Posiiton to look at\n * @param enableTransition - Enables transition\n * @returns Resolves when interaction is done\n */\n public async lookAt(\n position: Vector3,\n lookAt: Vector3,\n enableTransition: boolean = false,\n ): Promise<void> {\n await this.executeInteraction(async () => {\n // Need to reset focal offset because of orbit point\n // https://github.com/yomotsu/camera-controls/issues/303\n void this._orbitControls.setFocalOffset(0, 0, 0, false);\n return this._orbitControls.setLookAt(\n position.x,\n position.y,\n position.z,\n lookAt.x,\n lookAt.y,\n lookAt.z,\n enableTransition,\n );\n });\n this._orbitControls.setOrbitPoint(lookAt.x, lookAt.y, lookAt.z);\n }\n public lookTopDownAt(obj: Box3 | Entity3D | Object3D, enableTransition = true): Promise<void> {\n const center = new Vector3();\n const size = new Vector3();\n const newCameraPosition = new Vector3(0, 0, 1);\n\n const bbox = this.getBox(obj);\n bbox.min.z = bbox.max.z;\n bbox.getCenter(center);\n bbox.getSize(size);\n\n const distance = this._orbitControls.getDistanceToFitBox(size.x, size.y, 0);\n const cameraPosition = newCameraPosition.multiplyScalar(distance).add(center);\n\n // Slightly offset camera to avoid gimbal lock\n cameraPosition.x += size.x / 10;\n cameraPosition.y -= size.y / 10;\n\n return this.lookAt(cameraPosition, center, enableTransition);\n }\n\n public setCamera(pos: CameraPosition): void {\n void this.executeInteraction(async () => {\n this._orbitControls.setOrbitPoint(0, 0, 0);\n void this._orbitControls.setLookAt(\n pos.camera.x,\n pos.camera.y,\n pos.camera.z,\n pos.target.x,\n pos.target.y,\n pos.target.z,\n false,\n );\n void this._orbitControls.setFocalOffset(\n pos.focalOffset.z,\n pos.focalOffset.y,\n pos.focalOffset.z,\n false,\n );\n this._orbitControls.update(0);\n return Promise.resolve();\n });\n }\n\n /**\n * Sets initial position of camera to view an extent.\n *\n * @param extent - Extent to look at\n * @param altitude - Altitude of camera\n */\n public setInitialPosition(extent: Extent, altitude = 4000): void {\n const cameraPosition = new Coordinates(\n extent.crs,\n extent.west,\n extent.south,\n altitude,\n ).toVector3();\n const center = extent.centerAsVector3();\n void this.lookAt(cameraPosition, center, false);\n }\n\n protected getBox(obj: Box3 | Entity3D | Object3D): Box3 {\n // We produce broken CityJSON (bbox.max.z being 10e38), workaround that!\n let bbox = new Box3();\n if ((obj as Box3).isBox3) {\n bbox = (obj as Box3).clone();\n } else if ((obj as Entity3D).isEntity3D) {\n const entity3d = obj as Entity3D;\n const entityBbox = entity3d.getBoundingBox();\n if (entityBbox && !entityBbox.isEmpty()) {\n bbox = entityBbox.clone();\n } else if ('extent' in entity3d) {\n // In case object is hidden\n bbox = (entity3d.extent as Extent).toBox3(0, 200);\n }\n } else if ((obj as Object3D).isObject3D) {\n bbox.setFromObject(obj as Object3D);\n } else {\n throw new Error('obj should be instanceof Box3, Object3D or Entity3D');\n }\n if (bbox.isEmpty()) {\n throw new Error('Could not find bounding box of object');\n }\n\n bbox.min.z = Math.max(bbox.min.z, 0);\n bbox.max.z = Math.min(bbox.max.z, 2000);\n\n return bbox;\n }\n\n private _disablePositionOnMap(): void {\n if (\n this._boundPositionOnMapOnClick ||\n this._boundPositionOnMapOnMouseMove ||\n this._boundPositionOnMapOnContextMenu\n ) {\n if (this._boundPositionOnMapOnClick) {\n this._instance.domElement.removeEventListener(\n 'click',\n this._boundPositionOnMapOnClick,\n );\n }\n this._boundPositionOnMapOnClick = null;\n\n if (this._boundPositionOnMapOnMouseMove) {\n this._instance.domElement.removeEventListener(\n 'mousemove',\n this._boundPositionOnMapOnMouseMove,\n );\n }\n this._boundPositionOnMapOnMouseMove = null;\n\n if (this._boundPositionOnMapOnContextMenu) {\n this._instance.domElement.removeEventListener(\n 'contextmenu',\n this._boundPositionOnMapOnContextMenu,\n );\n }\n this._boundPositionOnMapOnContextMenu = null;\n\n this._cursorManager.setCursor(null);\n this._instance.notifyChange();\n }\n }\n\n private _enablePositionOnMap(): void {\n this._cursorManager.setCursor('street');\n this._boundPositionOnMapOnClick = this.onPositionOnMapClick.bind(this);\n this._boundPositionOnMapOnMouseMove = this.onPositionOnMapMouseMove.bind(this);\n this._boundPositionOnMapOnContextMenu = this.onPositionOnMapContextMenu.bind(this);\n\n this._instance.domElement.addEventListener(\n 'mousemove',\n this._boundPositionOnMapOnMouseMove,\n );\n this._instance.domElement.addEventListener('click', this._boundPositionOnMapOnClick);\n this._instance.domElement.addEventListener(\n 'contextmenu',\n this._boundPositionOnMapOnContextMenu,\n );\n }\n\n private disposeOrbitControls(): void {\n this._instance.domElement.removeEventListener('keydown', this._boundOrbitControlsOnKey);\n\n this._instance.domElement.removeEventListener('wheel', this._boundOrbitControlsOnWheel);\n\n this._instance.domElement.removeEventListener(\n 'contextmenu',\n this._boundOrbitControlsOnContextMenu,\n );\n this._instance.domElement.removeEventListener('mouseup', this._boundOrbitControlsOnMouseUp);\n\n this._orbitControls.disconnect();\n }\n\n private initializeInspector(inspector: Inspector | null): void {\n if (this._cameraControlsInspector) {\n this._cameraControlsInspector.dispose();\n }\n\n if (inspector) {\n this._cameraControlsInspector = new CameraControlsInspector(\n inspector.gui,\n this,\n this._instance,\n );\n inspector.addPanel(this._cameraControlsInspector);\n }\n }\n\n private initializeOrbitControls(): void {\n this._orbitControls.infinityDolly = true; // Prevents being stuck when hitting the target\n\n this.setNavigationMode(this._store.getNavigationMode());\n\n // Make rotation around where the user clicked when Orbit\n this._boundOrbitControlsOnContextMenu = this.orbitControlsOnContextMenu.bind(this);\n this._boundOrbitControlsOnMouseUp = this.orbitControlsOnMouseUp.bind(this);\n this._instance.domElement.addEventListener(\n 'contextmenu',\n this._boundOrbitControlsOnContextMenu,\n );\n this._instance.domElement.addEventListener('mouseup', this._boundOrbitControlsOnMouseUp);\n\n // \"Patch\" camera-controls for nicer event handlers\n this._boundOrbitControlsOnWheel = this.orbitControlsOnWheel.bind(this);\n this._instance.domElement.addEventListener('wheel', this._boundOrbitControlsOnWheel);\n\n // As Giro3d runs the event loop only when needed, we need to notify Giro3d when\n // the controls update the view.\n // We need both events to make sure the view is updated from user interactions and from\n // animations\n this._orbitControls.addEventListener('update', () =>\n this._instance.notifyChange(this._instance.view.camera),\n );\n this._orbitControls.addEventListener('control', () =>\n this._instance.notifyChange(this._instance.view.camera),\n );\n\n // Dispatch our events\n this._orbitControls.addEventListener('control', () => {\n if (this._orbitControls.active || this._orbitControls.currentAction !== 0) {\n this.dispatchEvent({ type: 'interaction-start' });\n this._store.setIsUserInteracting(true);\n }\n });\n this._orbitControls.addEventListener('controlend', () =>\n setTimeout(() => {\n this._store.setIsUserInteracting(false);\n this.dispatchEvent({ type: 'interaction-end' });\n }),\n );\n\n this._boundOrbitControlsOnKey = this.orbitControlsOnKey.bind(this);\n this._instance.domElement.addEventListener('keydown', this._boundOrbitControlsOnKey);\n }\n\n private onAfterCameraUpdate(): void {\n // this.instance.view.camera.position is *not always* the same as orbitControls.getPosition()\n this._store.setCurrentPosition(\n this.getCameraPosition(),\n this._instance.view.camera.position,\n );\n }\n\n private onBeforeCameraUpdate(): void {\n // Called from giro3d\n const delta = this._clock.getDelta();\n const hasControlsUpdated = this._orbitControls.update(delta);\n if (hasControlsUpdated) {\n this._instance.notifyChange(this._instance.view.camera);\n }\n }\n\n private onPositionOnMapClick(e: MouseEvent): void {\n const picked = this._picker.getMapAt(this._instance, e);\n if (picked) {\n this._disablePositionOnMap();\n\n const direction = new Vector3();\n this._instance.view.camera.getWorldDirection(direction);\n direction.normalize().setLength(3);\n\n const newPosition = picked.point.clone();\n newPosition.z += 1.7;\n\n const newTarget = newPosition.clone();\n newTarget.add(direction);\n newTarget.z = newPosition.z;\n\n void this.lookAt(newPosition, newTarget, true).finally(() =>\n this._store.setNavigationMode('first-person'),\n );\n }\n }\n\n private onPositionOnMapContextMenu(e: MouseEvent): void {\n this._disablePositionOnMap();\n this._store.setNavigationMode('orbit');\n e.preventDefault();\n }\n\n private onPositionOnMapMouseMove(e: MouseEvent): void {\n const picked = this._picker.getMapAt(this._instance, e);\n this._instance.domElement.style.cursor = picked ? 'none' : 'auto';\n this._cursorManager.setCursor(picked != null ? 'street' : null);\n if (picked) {\n this._cursorManager.setCursorLocation(picked.point);\n }\n this._instance.notifyChange();\n }\n\n private orbitControlsOnContextMenu(e: MouseEvent): void {\n if (this._store.getNavigationMode() !== 'orbit') {\n return;\n }\n\n this._cursorManager.setCursor('orbit');\n const picked = this._pickObjectsAt(e);\n if (picked) {\n this._cursorManager.setCursorLocation(picked.point);\n this._orbitControls.setOrbitPoint(picked.point.x, picked.point.y, picked.point.z);\n } else {\n // We didn't pick anything, we'll orbit around the target\n const cursorLocation = this._orbitControls.getTarget(tmpVec3);\n this._cursorManager.setCursorLocation(cursorLocation);\n }\n }\n\n private orbitControlsOnKey(e: KeyboardEvent): void {\n const navigationMode = this._store.getNavigationMode();\n\n if (navigationMode === 'position-on-map') {\n if (e.code === 'Escape') {\n this._store.setNavigationMode('orbit');\n }\n return;\n }\n\n if (navigationMode !== 'orbit' && navigationMode !== 'first-person') {\n return;\n }\n\n const keys = {\n ARROW_BOTTOM: 'ArrowDown',\n ARROW_LEFT: 'ArrowLeft',\n ARROW_RIGHT: 'ArrowRight',\n ARROW_UP: 'ArrowUp',\n KEY_DOWN: 'KeyS',\n KEY_LEFT: 'KeyA',\n KEY_RIGHT: 'KeyD',\n KEY_UP: 'KeyW',\n };\n\n let forwardDirection = 0;\n let dollyDirection = 0;\n let truckDirectionX = 0;\n let truckDirectionY = 0;\n let factor = e.ctrlKey || e.metaKey || e.shiftKey ? 200 : 20;\n\n // Reduce the factor in FPV as we should be close to our data\n if (navigationMode === 'first-person') {\n factor /= 10;\n }\n\n switch (e.code) {\n case keys.ARROW_BOTTOM:\n if (navigationMode === 'first-person') {\n dollyDirection = -1;\n } else {\n forwardDirection = -1;\n }\n break;\n\n case keys.ARROW_LEFT:\n\n case keys.KEY_LEFT:\n truckDirectionX = -1;\n break;\n\n case keys.ARROW_RIGHT:\n\n case keys.KEY_RIGHT:\n truckDirectionX = 1;\n break;\n case keys.ARROW_UP:\n if (navigationMode === 'first-person') {\n dollyDirection = 1;\n } else {\n forwardDirection = 1;\n }\n break;\n\n case keys.KEY_DOWN:\n truckDirectionY = 1;\n break;\n case keys.KEY_UP:\n truckDirectionY = -1;\n break;\n\n default:\n // do nothing\n }\n if (forwardDirection) {\n void this.executeInteraction(() =>\n this._orbitControls.forward(\n forwardDirection * this._orbitControls.truckSpeed * factor,\n true,\n ),\n );\n }\n if (dollyDirection) {\n void this.executeInteraction(() =>\n this._orbitControls.dollyInFixed(\n dollyDirection * this._orbitControls.truckSpeed * factor,\n true,\n ),\n );\n }\n if (truckDirectionX) {\n void this.executeInteraction(() =>\n this._orbitControls.truck(\n truckDirectionX * this._orbitControls.truckSpeed * factor,\n 0,\n true,\n ),\n );\n }\n if (truckDirectionY) {\n void this.executeInteraction(() =>\n this._orbitControls.truck(\n 0,\n truckDirectionY * this._orbitControls.truckSpeed * factor,\n true,\n ),\n );\n }\n }\n\n private orbitControlsOnMouseUp(): void {\n if (this._store.getNavigationMode() !== 'orbit') {\n return;\n }\n\n this._cursorManager.setCursor(null);\n this._instance.notifyChange();\n }\n\n private orbitControlsOnWheel(): void {\n // As camera-controls doesn't dispatch controlstart/controlend events, we need\n // to take care of them for proper events\n this._orbitControls.dispatchEvent({ type: 'controlstart' });\n setTimeout(() => this._orbitControls.dispatchEvent({ type: 'controlend' }), 0);\n }\n\n private setNavigationMode(mode: NavigationMode): void {\n this._disablePositionOnMap();\n\n switch (mode) {\n case 'disabled':\n this._orbitControls.enabled = false;\n break;\n case 'first-person':\n {\n this._orbitControls.dollyToCursor = false;\n // Set small min/max distance so rotating is always close to the camera position\n this._orbitControls.minDistance = 2;\n this._orbitControls.maxDistance = 2;\n // That requires a large dolly speed for scrolling not to be \"stuck\"\n this._orbitControls.dollySpeed = 20;\n\n this._orbitControls.azimuthRotateSpeed = 0.3;\n this._orbitControls.polarRotateSpeed = 0.3;\n\n this._orbitControls.mouseButtons.left = CameraControls.ACTION.ROTATE;\n this._orbitControls.mouseButtons.right = CameraControls.ACTION.TRUCK;\n this._orbitControls.mouseButtons.wheel = CameraControls.ACTION.DOLLY;\n this._orbitControls.mouseButtons.middle = CameraControls.ACTION.DOLLY;\n\n this._orbitControls.enabled = true;\n\n // Set new target close to the camera position so it feels like we're rotating around the camera position\n const direction = new Vector3();\n const position = this._instance.view.camera.position.clone();\n const newTarget = new Vector3();\n this._instance.view.camera.getWorldDirection(direction);\n\n direction.normalize().setLength(3);\n newTarget.copy(position).add(direction);\n void this.lookAt(position, newTarget, false);\n }\n break;\n case 'orbit':\n {\n this._orbitControls.dollyToCursor = true;\n this._orbitControls.minDistance = 2;\n this._orbitControls.maxDistance = Infinity;\n this._orbitControls.dollySpeed = 1;\n\n this._orbitControls.azimuthRotateSpeed = 1.0;\n this._orbitControls.polarRotateSpeed = 1.0;\n\n this._orbitControls.mouseButtons.left = CameraControls.ACTION.TRUCK;\n this._orbitControls.mouseButtons.right = CameraControls.ACTION.ROTATE;\n this._orbitControls.mouseButtons.wheel = CameraControls.ACTION.DOLLY;\n this._orbitControls.mouseButtons.middle = CameraControls.ACTION.DOLLY;\n\n this._orbitControls.enabled = true;\n\n // Try to restore a proper target so it doesn't require a right-click to properly truck/dolly\n const direction = new Vector3();\n const position = this._instance.view.camera.position.clone();\n this._instance.view.camera.getWorldDirection(direction);\n\n const raycaster = new Raycaster();\n raycaster.camera = this._instance.view.camera;\n raycaster.set(position, direction);\n const intersects = raycaster.intersectObject(this._instance.scene).at(0);\n\n if (intersects) {\n void this.lookAt(position, intersects.point, false);\n }\n }\n break;\n case 'position-on-map':\n this._orbitControls.enabled = false;\n this._enablePositionOnMap();\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = mode;\n return _exhaustiveCheck;\n }\n }\n this._instance.domElement.focus();\n }\n}\n\nexport default CameraController;\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport type Giro3DMap from '@giro3d/giro3d/entities/Map';\n\nimport Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport MaskLayer, { MaskMode } from '@giro3d/giro3d/core/layer/MaskLayer';\nimport AxisGrid from '@giro3d/giro3d/entities/AxisGrid';\nimport { isMap } from '@giro3d/giro3d/entities/Map';\nimport Giro3dVectorSource from '@giro3d/giro3d/sources/VectorSource';\nimport Feature from 'ol/Feature';\nimport Polygon from 'ol/geom/Polygon';\nimport { Fill, Style } from 'ol/style';\nimport { Color, Vector3 } from 'three';\n\nimport type { DatasetAsLayerConfig, DatasetAsMeshConfig } from '@/types/configuration/datasets';\nimport type { Dataset, DatasetBase } from '@/types/Dataset';\n\nimport { getConfig } from '@/config-loader';\nimport { GLOBAL_EVENT_DISPATCHER } from '@/events';\nimport EntityBuilder from '@/giro3d/EntityBuilder';\nimport LayerBuilder from '@/giro3d/LayerBuilder';\nimport loader from '@/loaders/loader';\nimport { useDatasetStore } from '@/stores/datasets';\nimport { useNotificationStore } from '@/stores/notifications';\nimport { Datagroup, type DatasetLayer, type DatasetOrGroup } from '@/types/Dataset';\nimport Notification from '@/types/Notification';\nimport { isObject } from '@/utils/Types';\n\nimport type LayerManager from './LayerManager';\n\nconst datasetSupportsOverlay = (obj: Dataset): obj is Dataset & DatasetBase<DatasetAsLayerConfig> =>\n isObject(obj) &&\n (obj.type === 'colorLayer' || obj.type === 'maskLayer' || obj.type === 'elevationLayer');\n\nconst datasetSupportsMeshes = (obj: Dataset): obj is Dataset & DatasetBase<DatasetAsMeshConfig> =>\n isObject(obj) && !datasetSupportsOverlay(obj);\n\nexport default class DatasetManager {\n private readonly _axisGrids: Map<string, AxisGrid> = new Map();\n private readonly _entities: Map<string, Entity3D> = new Map();\n private readonly _instance: Instance;\n private readonly _layerManager: LayerManager;\n private readonly _masks: Map<string, MaskLayer> = new Map();\n private readonly _notifications = useNotificationStore();\n private readonly _overlays: Map<string, DatasetLayer> = new Map();\n private readonly _store = useDatasetStore();\n\n public constructor(instance: Instance, layerManager: LayerManager) {\n this._instance = instance;\n this._layerManager = layerManager;\n\n this._store.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'importFromFile':\n void this.importFromFile(args[0]);\n break;\n case 'remove':\n this.deleteDataset(args[0]);\n break;\n case 'setVisible':\n void this.onVisibilityChanged(args[0], args[1]);\n break;\n case 'toggleGrid':\n void this.onToggleGrid(args[0]);\n break;\n case 'toggleMask':\n void this.onToggleMask(args[0]);\n break;\n }\n });\n });\n\n for (const dataset of this._store.getDatasets()) {\n if (dataset.visible) {\n void this.preloadDataset(dataset);\n }\n }\n }\n\n public dispose(): void {\n // Nothing to do (?)\n }\n\n private async createGrid(dataset: DatasetOrGroup): Promise<void> {\n const box = this._store.getBoundingBox(dataset);\n if (box == null || box.isEmpty()) {\n return;\n }\n\n const grid = new AxisGrid({\n style: {\n color: new Color('orange'),\n fontSize: 12,\n numberFormat: Intl.NumberFormat('fr'),\n },\n ticks: {\n x: 50,\n y: 50,\n z: 50,\n },\n volume: {\n ceiling: box.max.z + 10,\n extent: Extent.fromBox3(this._instance.referenceCrs, box).withMargin(20, 20),\n floor: box.min.z - 10,\n },\n });\n grid.name = `AxisGrid-${dataset.uuid}`;\n await this._instance.add(grid);\n this._axisGrids.set(dataset.uuid, grid);\n }\n\n private async createMask(dataset: DatasetOrGroup): Promise<void> {\n // TODO: this assumes the dataset covers the whole bounding box\n // (in particular, that it is oriented the same way)\n // which will most likely not be the case...\n const box = this._store.getBoundingBox(dataset);\n if (box == null || box.isEmpty()) {\n return;\n }\n\n // Contract bounding box so it makes stitching a bit nicer\n box.expandByVector(new Vector3(-5, -5, 0));\n\n const feature = new Feature({\n geometry: new Polygon([\n [\n [box.min.x, box.min.y],\n [box.min.x, box.max.y],\n [box.max.x, box.max.y],\n [box.max.x, box.min.y],\n [box.min.x, box.min.y],\n ],\n ]),\n name: 'Mask polygon',\n });\n\n const mask = new MaskLayer({\n name: `mask-${dataset.uuid}`,\n source: new Giro3dVectorSource({\n data: [feature],\n style: new Style({\n fill: new Fill({ color: 'white' }),\n }),\n }),\n });\n mask.maskMode = MaskMode.Inverted;\n\n // Apply the mask to the map\n const maps = this._instance.getObjects(obj => isMap(obj)) as Giro3DMap[];\n for (const map of maps) {\n await map.addLayer(mask);\n this._instance.notifyChange(map);\n }\n this._masks.set(dataset.uuid, mask);\n }\n\n private deleteDataset(dataset: DatasetOrGroup): void {\n this.deleteGrid(dataset);\n this.deleteMask(dataset);\n\n const entity = this._entities.get(dataset.uuid);\n if (entity) {\n this._instance.remove(entity);\n this._instance.notifyChange();\n }\n\n const layer = this._overlays.get(dataset.uuid);\n if (layer) {\n this._layerManager.removeBasemapLayer(layer);\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'dataset-removed', value: dataset });\n }\n\n private deleteGrid(dataset: DatasetOrGroup): void {\n const grid = this._axisGrids.get(dataset.uuid);\n if (grid) {\n this._instance.remove(grid);\n }\n this._axisGrids.delete(dataset.uuid);\n }\n\n private deleteMask(dataset: DatasetOrGroup): void {\n const mask = this._masks.get(dataset.uuid);\n if (mask) {\n const maps = this._instance.getObjects(obj => isMap(obj)) as Giro3DMap[];\n maps.forEach(map => {\n map.removeLayer(mask);\n this._instance.notifyChange(map);\n });\n }\n this._masks.delete(dataset.uuid);\n }\n\n private async importFromFile(file: File | string): Promise<void> {\n let dataset: DatasetOrGroup;\n const name = file instanceof File ? file.name : file;\n try {\n this._notifications.push(new Notification(name, 'Importing file...'));\n const _dataset = await loader.importFile(file, getConfig());\n dataset = this._store.add(_dataset); // We need to keep track of the reactive dataset!\n this._notifications.push(\n new Notification(dataset.name, 'Import done, parsing data...', 'success'),\n );\n } catch (e) {\n console.error(e);\n this._notifications.push(new Notification(name, (e as Error).message, 'error'));\n return;\n }\n\n try {\n dataset.isPreloading = true;\n await this.preloadDataset(dataset);\n this._notifications.push(\n new Notification(dataset.name, 'Import successful.', 'success'),\n );\n } catch (_e) {\n // Already logged, ignore\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'dataset-added', value: dataset });\n }\n\n private onDatasetPreloaded(dataset: DatasetOrGroup, entity: Entity3D): void {\n dataset.isPreloaded = true;\n dataset.isPreloading = false;\n\n if (dataset.onObjectPreloaded) {\n dataset.onObjectPreloaded(dataset, entity);\n }\n\n this._store.attachEntity(dataset, entity);\n }\n\n private onDatasetPreloadedAsLayer(dataset: DatasetOrGroup, layer: DatasetLayer): void {\n dataset.isPreloaded = true;\n dataset.isPreloading = false;\n\n this._store.attachLayer(dataset, layer);\n }\n\n private async onToggleGrid(dataset: DatasetOrGroup): Promise<void> {\n if (this._axisGrids.has(dataset.uuid)) {\n this.deleteGrid(dataset);\n } else {\n await this.createGrid(dataset);\n }\n }\n\n private async onToggleMask(dataset: DatasetOrGroup): Promise<void> {\n if (this._masks.has(dataset.uuid)) {\n this.deleteMask(dataset);\n } else {\n await this.createMask(dataset);\n }\n }\n\n private async onVisibilityChanged(\n dataset: DatasetOrGroup,\n newVisibility: boolean,\n ): Promise<void> {\n try {\n dataset.visible = newVisibility;\n if (!dataset.isPreloaded && newVisibility) {\n await this.preloadDataset(dataset);\n }\n await this.updateDataset(dataset);\n if (Datagroup.isGroup(dataset)) {\n dataset.children.forEach(ds => void this.onVisibilityChanged(ds, newVisibility));\n }\n } catch (_e) {\n dataset.visible = false;\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({\n type: 'dataset-visibility-changed',\n value: dataset,\n });\n }\n\n private async preloadDataset(dataset: DatasetOrGroup): Promise<DatasetOrGroup> {\n if (dataset.isPreloaded) {\n return Promise.resolve(dataset);\n }\n\n if (Datagroup.isGroup(dataset)) {\n dataset.isPreloaded = true;\n return Promise.resolve(dataset);\n }\n\n dataset.isPreloading = true;\n\n try {\n if (datasetSupportsOverlay(dataset)) {\n const layer = await LayerBuilder.getDatasetLayer(this._instance, dataset);\n\n layer.visible = dataset.visible;\n this._overlays.set(dataset.uuid, layer);\n\n await this._layerManager.addDatasetLayer(layer);\n this.onDatasetPreloadedAsLayer(dataset, layer);\n } else if (datasetSupportsMeshes(dataset)) {\n const entity = await EntityBuilder.getEntity(this._instance, dataset);\n\n entity.visible = dataset.visible;\n this._entities.set(dataset.uuid, entity);\n\n await this._instance.add(entity);\n this.onDatasetPreloaded(dataset, entity);\n } else {\n throw new Error('Dataset is neither an overlay or 3d mesh');\n }\n } catch (e) {\n console.error('Could not load dataset', dataset, e);\n dataset.isPreloading = false;\n this._notifications.push(\n new Notification(\n dataset.name,\n `Could not load dataset : ${(e as Error).message}`,\n 'error',\n ),\n );\n throw e;\n }\n\n return dataset;\n }\n\n private async updateDataset(dataset: DatasetOrGroup): Promise<void> {\n const entity = this._entities.get(dataset.uuid);\n if (entity) {\n entity.visible = dataset.visible;\n if (\n dataset.visible &&\n 'isMaskingBasemap' in dataset.config &&\n dataset.config.isMaskingBasemap === true\n ) {\n await this.createMask(dataset);\n } else if (!dataset.visible && this._masks.has(dataset.uuid)) {\n this.deleteMask(dataset);\n }\n this._instance.notifyChange(entity);\n }\n\n const layer = this._overlays.get(dataset.uuid);\n if (layer) {\n layer.visible = dataset.visible;\n this._layerManager.notify(layer);\n }\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { isShape } from '@giro3d/giro3d/entities/Shape';\nimport { Raycaster } from 'three';\n\nimport type Picker from '@/services/Picker';\n\nimport Measure3D from '@/giro3d/Measure3D';\n\nexport default class MeasureTool {\n private _hoverMeasurement: Measure3D | null;\n private readonly _picker: Picker;\n private readonly _raycaster: Raycaster;\n\n public constructor(picker: Picker) {\n this._picker = picker;\n\n this._raycaster = new Raycaster();\n this._hoverMeasurement = null;\n }\n\n public clean(): void {\n if (this._hoverMeasurement) {\n this._hoverMeasurement.instance.remove(this._hoverMeasurement);\n this._hoverMeasurement = null;\n }\n }\n\n public dispose(): void {\n this.clean();\n }\n\n public getLastMeasurement(): Measure3D | undefined {\n return this._hoverMeasurement?.clone();\n }\n\n public measure(instance: Instance, event: MouseEvent): void {\n const picked = this._picker.getFirstFeatureAt(instance, event, 0, o => !isShape(o))?.at(0);\n\n if (picked && picked.normal) {\n const n = picked.normal.clone();\n n.transformDirection(picked.object.matrixWorld);\n n.normalize();\n\n this._raycaster.camera = instance.view.camera;\n this._raycaster.set(picked.point, n);\n\n const intersects = this._raycaster\n .intersectObject(instance.scene, true)\n .filter(\n i =>\n i.distance > 1e-5 &&\n i.object.userData.parentEntity !== this._hoverMeasurement,\n )\n .at(0);\n\n if (intersects) {\n if (!this._hoverMeasurement) {\n this._hoverMeasurement = new Measure3D();\n void instance.add(this._hoverMeasurement);\n }\n this._hoverMeasurement.visible = true;\n this._hoverMeasurement.setPoints([picked.point, intersects.point]);\n instance.notifyChange(this._hoverMeasurement);\n }\n }\n }\n}\n","import { defineStore } from 'pinia';\nimport { computed, reactive, ref } from 'vue';\n\nimport type Measure from '@/types/Measure';\nimport type MeasurementMode from '@/types/MeasurementMode';\n\nexport const useMeasurementStore = defineStore('measurement', () => {\n const measurements = reactive<Measure[]>([]) as Measure[];\n const measurementMode = ref<MeasurementMode>('laser');\n const count = computed(() => measurements.length);\n const _isUserMeasuring = ref<boolean>(false);\n\n function isUserMeasuring(): boolean {\n return _isUserMeasuring.value;\n }\n\n function setIsUserMeasuring(value: boolean): void {\n _isUserMeasuring.value = value;\n }\n\n function getMeasurementMode(): MeasurementMode {\n return measurementMode.value;\n }\n\n function setMeasurementMode(mode: MeasurementMode): void {\n measurementMode.value = mode;\n }\n\n function getMeasures(): Measure[] {\n return measurements;\n }\n\n function remove(measure: Measure): void {\n measurements.splice(measurements.indexOf(measure), 1);\n }\n\n function add(measure: Measure): void {\n measurements.push(measure);\n }\n\n function hasMeasure(name: string): boolean {\n return measurements.some(m => m.title === name);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importMeasureFile(file: Blob): void {\n // Nothing to do\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importMeasureFiles(files: File[]): void {\n // Nothing to do\n }\n\n function start(): void {}\n\n function end(): void {}\n\n return {\n add,\n count,\n end,\n getMeasurementMode,\n getMeasures,\n hasMeasure,\n importMeasureFile,\n importMeasureFiles,\n isUserMeasuring,\n remove,\n setIsUserMeasuring,\n setMeasurementMode,\n start,\n };\n});\n","import { EventDispatcher, MathUtils } from 'three';\n\nimport type Measure3D from '@/giro3d/Measure3D';\n\nimport Download from '@/utils/Download';\n\ntype MeasureEventMap = {\n visible: {\n /** empty */\n };\n};\n\nexport default class Measure extends EventDispatcher<MeasureEventMap> {\n public properties: object;\n public readonly title: string;\n public readonly uuid: string;\n public get object(): Measure3D {\n return this._object;\n }\n public set object(obj: Measure3D) {\n this._object = obj;\n }\n\n public get visible(): boolean {\n return this._visible;\n }\n\n public set visible(v: boolean) {\n this._visible = v;\n this.dispatchEvent({ type: 'visible' });\n }\n\n private _object: Measure3D;\n\n private _visible: boolean;\n\n public constructor(title: string, object: Measure3D, properties: object = {}) {\n super();\n\n this.title = title;\n this._visible = true;\n this._object = object;\n this.properties = properties;\n this.uuid = MathUtils.generateUUID();\n }\n\n public static toCollection(measures: Measure[]): GeoJSON.FeatureCollection {\n const features = measures.map(measure => measure.toGeoJSON());\n\n return {\n features,\n type: 'FeatureCollection',\n // @ts-expect-error GeoJSON spec does not allow properties on FeatureCollection\n // But OWC requires it Oo\n id: `${Download.getBaseUrl()}#${MathUtils.generateUUID()}`,\n properties: {\n creator: 'Giro3D',\n generator: {\n title: 'Giro3D',\n uri: Download.getBaseUrl(),\n },\n lang: 'en',\n links: [\n {\n href: 'http://www.opengis.net/spec/owc-atom/1.0/req/core',\n rel: 'profile',\n title: 'This file is compliant with version 1.0 of OGC Context',\n },\n ],\n title: 'Giro3D measures',\n updated: new Date().toISOString(),\n },\n };\n }\n\n public toGeoJSON(): GeoJSON.Feature {\n const geojson = {\n geometry: {\n coordinates: [this.object.from.toArray(), this.object.to.toArray()],\n type: 'LineString',\n },\n id: `${Download.getBaseUrl()}#${this.uuid}`,\n properties: {\n ...this.properties,\n title: this.title,\n updated: new Date().toISOString(),\n },\n type: 'Feature',\n } as GeoJSON.Feature;\n\n return geojson;\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { MathUtils, Vector3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\nimport type Picker from '@/services/Picker';\n\nimport Measure3D from '@/giro3d/Measure3D';\nimport MeasureTool from '@/services/MeasureTool';\nimport { useMeasurementStore } from '@/stores/measurement';\nimport { useNotificationStore } from '@/stores/notifications';\nimport Measure from '@/types/Measure';\nimport Notification from '@/types/Notification';\n\nfunction promptTitle(defaultValue: string): string | null {\n return window.prompt('Measure name', defaultValue);\n}\n\nexport default class MeasurementManager {\n private readonly _boundMeasure: (e: MouseEvent) => void;\n private readonly _boundOnEscape: (e: KeyboardEvent) => void;\n private readonly _boundPause: () => void;\n private readonly _boundRestart: () => void;\n private readonly _boundSaveMeasure: (e: MouseEvent) => void;\n private readonly _camera: CameraController;\n private readonly _instance: Instance;\n private readonly _measureTool: MeasureTool;\n private readonly _notificationStore = useNotificationStore();\n private _paused = false;\n private readonly _store = useMeasurementStore();\n\n public constructor(instance: Instance, camera: CameraController, picker: Picker) {\n this._instance = instance;\n this._measureTool = new MeasureTool(picker);\n this._camera = camera;\n\n this._boundPause = (): void => {\n this._paused = true;\n };\n this._boundRestart = (): void => {\n this._paused = false;\n };\n this._camera.addEventListener('interaction-start', this._boundPause);\n this._camera.addEventListener('interaction-end', this._boundRestart);\n\n this._boundOnEscape = this.onEscape.bind(this);\n document.addEventListener('keydown', this._boundOnEscape);\n\n this._store.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'end':\n this.stopMeasuring();\n break;\n case 'importMeasureFile':\n void this.importMeasureFile(args[0]);\n break;\n case 'importMeasureFiles':\n void this.importMeasureFiles(args[0]);\n break;\n case 'remove':\n this.deleteMeasure(args[0]);\n break;\n case 'start':\n this.startMeasuring();\n break;\n }\n });\n });\n\n this._boundMeasure = this.measure.bind(this);\n this._boundSaveMeasure = this.saveMeasure.bind(this);\n this._instance.domElement.addEventListener('mousemove', this._boundMeasure);\n this._instance.domElement.addEventListener('click', this._boundSaveMeasure);\n }\n\n public dispose(): void {\n this._instance.domElement.removeEventListener('mousemove', this._boundMeasure);\n this._instance.domElement.removeEventListener('click', this._boundSaveMeasure);\n\n this._camera.removeEventListener('interaction-start', this._boundPause);\n this._camera.removeEventListener('interaction-end', this._boundRestart);\n\n document.removeEventListener('keydown', this._boundOnEscape);\n\n this._measureTool.dispose();\n }\n\n public startMeasuring(): void {\n this._store.setIsUserMeasuring(true);\n }\n\n public stopMeasuring(): void {\n this._store.setIsUserMeasuring(false);\n this._measureTool.clean();\n this._instance.notifyChange();\n }\n\n public updateMeasure(measure: Measure): void {\n measure.object.visible = measure.visible;\n measure.object.traverse(o => (o.visible = measure.visible));\n this._instance.notifyChange();\n }\n\n private deleteMeasure(measure: Measure): void {\n this._instance.remove(measure.object);\n this._instance.notifyChange();\n }\n\n private async importBlob(\n file: Blob,\n skipNames: Set<string>,\n ): Promise<{ nbImported: number; nbSkipped: number }> {\n const str = await file.text();\n const geojson = JSON.parse(str) as GeoJSON.Feature | GeoJSON.FeatureCollection;\n\n const features = geojson.type === 'FeatureCollection' ? geojson.features : [geojson];\n\n let nbImported = 0;\n let nbSkipped = 0;\n\n for (const feature of features) {\n const imported = await this.importMeasure(feature, skipNames);\n if (imported) {\n nbImported++;\n } else {\n nbSkipped++;\n }\n }\n return { nbImported, nbSkipped };\n }\n\n private async importMeasure(\n feature: GeoJSON.Feature,\n skipNames: Set<string>,\n ): Promise<boolean> {\n if (feature.geometry.type !== 'LineString') {\n throw new Error(`Cannot import geometry type ${feature.geometry.type}`);\n }\n\n if (feature.properties == null || typeof feature.properties !== 'object') {\n feature.properties = {};\n }\n if (feature.properties.title == null) {\n feature.properties.title = MathUtils.generateUUID();\n }\n\n if (skipNames.has(feature.properties.title)) {\n return false;\n }\n\n const from = new Vector3(...feature.geometry.coordinates[0]);\n const to = new Vector3(...feature.geometry.coordinates[1]);\n\n const o = new Measure3D();\n o.setPoints([from, to]);\n await this.pushNewMeasure(feature.properties?.title, o, feature.properties);\n\n return true;\n }\n\n private async importMeasureFile(file: Blob): Promise<void> {\n const existingMeasures = new Set(this._store.getMeasures().map(m => m.title));\n try {\n const { nbImported, nbSkipped } = await this.importBlob(file, existingMeasures);\n this._notificationStore.push(\n new Notification(\n 'Measures',\n `${nbImported} measures imported (${nbSkipped} skipped)`,\n 'success',\n ),\n );\n } catch (e: unknown) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n new Notification('Measures', `Could not import file: ${e}`, 'warning');\n }\n }\n\n private async importMeasureFiles(files: File[]): Promise<void> {\n const promises = [];\n let nbTotalImported = 0;\n let nbTotalSkipped = 0;\n const errors: string[] = [];\n\n const existingMeasures = new Set(this._store.getMeasures().map(m => m.title));\n\n for (const file of files) {\n promises.push(\n this.importBlob(file, existingMeasures)\n .then(({ nbImported, nbSkipped }) => {\n nbTotalImported += nbImported;\n nbTotalSkipped += nbSkipped;\n })\n .catch(reason => {\n errors.push((reason as Error).message);\n }),\n );\n }\n await Promise.allSettled(promises);\n\n if (errors.length > 0) {\n this._notificationStore.push(\n new Notification(\n 'Measures',\n `${nbTotalImported} measures imported (${nbTotalSkipped} skipped); ${errors.length} errors: ${errors}`,\n 'warning',\n ),\n );\n } else {\n this._notificationStore.push(\n new Notification(\n 'Measures',\n `${nbTotalImported} measures imported (${nbTotalSkipped} skipped)`,\n 'success',\n ),\n );\n }\n }\n\n private measure(event: MouseEvent): void {\n if (!this._paused && this._store.isUserMeasuring()) {\n void this._measureTool.measure(this._instance, event);\n }\n }\n\n private onEscape(e: KeyboardEvent): void {\n if (e.code === 'Escape' && this._store.isUserMeasuring()) {\n this.stopMeasuring();\n }\n }\n\n private async pushNewMeasure(\n title: string,\n measurement: Measure3D,\n properties: object = {},\n ): Promise<void> {\n await this._instance.add(measurement);\n const measure = new Measure(title, measurement, properties);\n measurement.userData.measure = measure;\n measure.addEventListener('visible', () => this.updateMeasure(measure));\n this._store.add(measure);\n this._instance.notifyChange(measurement);\n }\n\n private saveMeasure(): void {\n if (!this._paused && this._store.isUserMeasuring()) {\n const measurement = this._measureTool.getLastMeasurement();\n if (measurement && !Number.isNaN(measurement.length)) {\n let title = 'New measurement';\n if (this._store.hasMeasure(title)) {\n for (let i = 1; i < 1000; i += 1) {\n title = `New measurement (${i})`;\n if (!this._store.hasMeasure(title)) {\n break;\n }\n }\n if (this._store.hasMeasure(title)) {\n title = 'Achieved unlocked: 1000 measurements with default name';\n }\n }\n const name = promptTitle(title);\n if (name != null) {\n void this.pushNewMeasure(name, measurement);\n }\n }\n }\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type { Vector3 } from 'three';\n\nimport { CSS2DObject } from 'three/examples/jsm/Addons.js';\n\nfunction createSceneCursor(className: string, id: string): CSS2DObject {\n const container = document.createElement('div');\n container.className = 'scene-cursor';\n container.id = id;\n const icon = document.createElement('i');\n icon.className = `${className} text-dark shadow`;\n container.append(icon);\n\n const css2DObject = new CSS2DObject(container);\n return css2DObject;\n}\n\nexport type SceneCursorType = 'location' | 'orbit' | 'street';\n\n/**\n * Handles the display of the cursor in 3D space.\n */\nexport default class SceneCursorManager {\n private _currentCursor: CSS2DObject | null = null;\n private readonly _instance: Instance;\n\n private readonly _pickingCursors: Record<SceneCursorType, CSS2DObject> = {\n location: createSceneCursor('fg-location', 'cursor-location'),\n orbit: createSceneCursor('bi bi-mouse2-fill', 'cursor-orbit'),\n street: createSceneCursor('fg-position-man', 'cursor-street'),\n };\n\n public constructor(instance: Instance) {\n this._instance = instance;\n }\n\n /**\n * Sets the cursor.\n * @param cursor - The cursor to use. If `null`, the scene cursor is removed and replaced by a regular cursor.\n */\n public setCursor(cursor: SceneCursorType | null): void {\n if (cursor == null) {\n this._instance.domElement.style.cursor = 'auto';\n this.detachCurrentCursor();\n this._currentCursor = null;\n } else {\n this._instance.domElement.style.cursor = 'none';\n const newCursor = this._pickingCursors[cursor];\n if (newCursor !== this._currentCursor) {\n this.detachCurrentCursor();\n this._currentCursor = newCursor;\n this._instance.add(this._currentCursor).catch(console.error);\n }\n }\n }\n\n public setCursorLocation(worldPosition: Vector3): void {\n if (this._currentCursor == null) {\n return;\n }\n\n this._currentCursor.position.copy(worldPosition);\n this._currentCursor.updateMatrixWorld(true);\n this._instance.notifyChange();\n }\n\n private detachCurrentCursor(): void {\n this._currentCursor?.parent?.remove(this._currentCursor);\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type { Object3D } from 'three';\n\nimport HttpConfiguration from '@giro3d/giro3d/utils/HttpConfiguration';\nimport { AmbientLight, Box3, DirectionalLight, EventDispatcher } from 'three';\n\nimport { GLOBAL_EVENT_DISPATCHER } from '@/events';\nimport AnnotationManager from '@/services/AnnotationManager';\nimport CameraController from '@/services/CameraController';\nimport DatasetManager from '@/services/DatasetManager';\nimport Highlighter from '@/services/Highlighter';\nimport LayerManager from '@/services/LayerManager';\nimport MeasurementManager from '@/services/MeasurementManager';\nimport Picker from '@/services/Picker';\nimport { useGiro3dStore } from '@/stores/giro3d';\nimport Fetcher from '@/utils/Fetcher';\n\nimport SceneCursorManager from './SceneCursorManager';\n\nif (import.meta.env.VITE_HEADERS) {\n for (const [host, header] of Object.entries(import.meta.env.VITE_HEADERS)) {\n if (!Fetcher.checkAbsoluteHost(host)) {\n console.warn(`Invalid host in VITE_HEADERS: ${host}`);\n continue;\n }\n\n for (const [name, value] of Object.entries(header)) {\n HttpConfiguration.setHeader(host, name, value);\n }\n }\n}\n\nif (\n import.meta.env.VITE_AUTHORIZATION_DOMAIN != null &&\n import.meta.env.VITE_AUTHORIZATION_VALUE != null\n) {\n if (!Fetcher.checkAbsoluteHost(import.meta.env.VITE_AUTHORIZATION_DOMAIN)) {\n console.warn(\n `Invalid host in VITE_AUTHORIZATION_DOMAIN: ${import.meta.env.VITE_AUTHORIZATION_DOMAIN}`,\n );\n } else {\n HttpConfiguration.setAuth(\n import.meta.env.VITE_AUTHORIZATION_DOMAIN,\n import.meta.env.VITE_AUTHORIZATION_VALUE,\n );\n }\n}\n\nif (import.meta.env.VITE_AUTHORIZATIONS) {\n for (const [host, value] of Object.entries(import.meta.env.VITE_AUTHORIZATIONS)) {\n if (!Fetcher.checkAbsoluteHost(host)) {\n console.warn(`Invalid host in VITE_AUTHORIZATIONS: ${host}`);\n continue;\n }\n HttpConfiguration.setAuth(host, value);\n }\n}\n\ntype Giro3DManagerEventMap = {\n update: {\n /** empty */\n };\n};\n\nexport default class Giro3DManager extends EventDispatcher<Giro3DManagerEventMap> {\n public readonly ambientLight: AmbientLight;\n\n public readonly annotationManager: AnnotationManager;\n public readonly camera: CameraController;\n public readonly datasetManager: DatasetManager;\n public readonly dirLight: DirectionalLight;\n public readonly highlighter: Highlighter;\n public readonly layerManager: LayerManager;\n public readonly mainInstance: Instance;\n public readonly measurementManager: MeasurementManager;\n public readonly picker: Picker;\n public readonly sceneCursorManager: SceneCursorManager;\n private readonly _boundOnFrameEnd: () => void;\n\n private readonly _store = useGiro3dStore();\n\n public constructor(instance: Instance) {\n super();\n\n this.mainInstance = instance;\n\n this.picker = new Picker();\n this.sceneCursorManager = new SceneCursorManager(instance);\n this.camera = new CameraController(this.mainInstance, this.picker, this.sceneCursorManager);\n\n const position = this._store.getDefaultCameraPosition();\n const lookAt = this._store.getDefaultCameraLookAt();\n void this.camera.lookAt(position.toVector3(), lookAt.toVector3());\n\n this.layerManager = new LayerManager(this.mainInstance);\n this.datasetManager = new DatasetManager(this.mainInstance, this.layerManager);\n this.annotationManager = new AnnotationManager(this.mainInstance, this.camera, this.picker);\n this.highlighter = new Highlighter();\n this.picker = new Picker();\n this.measurementManager = new MeasurementManager(\n this.mainInstance,\n this.camera,\n this.picker,\n );\n\n this._boundOnFrameEnd = this.onFrameEnd.bind(this);\n this.mainInstance.addEventListener('update-end', this._boundOnFrameEnd);\n\n this.mainInstance.renderingOptions.enableEDL = true;\n this.mainInstance.renderingOptions.enableInpainting = false;\n this.mainInstance.renderingOptions.enablePointCloudOcclusion = false;\n\n const lightColor = 0xffffff;\n\n this.ambientLight = new AmbientLight(lightColor, 0.6);\n this.mainInstance.scene.add(this.ambientLight);\n\n this.dirLight = new DirectionalLight(lightColor, 2);\n this.dirLight.position.set(lookAt.x - 10000, lookAt.y - 10000, 10000);\n this.dirLight.target.position.set(lookAt.x, lookAt.y, 0);\n this.mainInstance.scene.add(this.dirLight);\n this.mainInstance.scene.add(this.dirLight.target);\n this.dirLight.updateMatrixWorld();\n this.mainInstance.scene.updateMatrixWorld();\n\n // We disable the skybox for now as it breaks the rendering of point cloud with effects.\n // Skybox.addSkybox(this.mainInstance);\n\n this.mainInstance.notifyChange();\n }\n\n public dispose(): void {\n this.mainInstance.removeEventListener('update-end', this._boundOnFrameEnd);\n this.mainInstance.scene.remove(this.dirLight.target);\n this.mainInstance.scene.remove(this.dirLight);\n this.mainInstance.scene.remove(this.ambientLight);\n this.measurementManager.dispose();\n this.highlighter.dispose();\n this.annotationManager.dispose();\n this.layerManager.dispose();\n this.camera.dispose();\n }\n\n /**\n * Gets bounding box of all datasets & annotations.\n *\n * @returns Bounding box of all datasets.\n */\n public getBoundingBox(): Box3 {\n const bbox = new Box3();\n const bbox2 = new Box3();\n this.mainInstance.scene.traverse(obj => {\n bbox2.setFromObject(obj);\n bbox.union(bbox2);\n });\n return bbox;\n }\n\n /**\n * Gets the datasets & annotations as Object3D.\n */\n public getObjects3d(): Object3D[] {\n const result: Object3D[] = [];\n this.mainInstance.scene.traverse(o => {\n result.push(o);\n });\n return result;\n }\n\n private onFrameEnd(): void {\n // Temporary solution to avoid annoying horizontal line artifacts\n // on point cloud due to constantly shifting near clipping plane.\n const camera = this.mainInstance.view.camera;\n camera.near = 2;\n\n this.dispatchEvent({ type: 'update' });\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'updated' });\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { isEntity3D } from '@giro3d/giro3d/entities/Entity3D';\nimport { Box3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\nimport type SceneCursorManager from '@/services/SceneCursorManager';\n\n/** @internal */\nexport class ViewApiImpl implements ViewApi {\n private readonly _cameraController: CameraController;\n private readonly _instance: Instance;\n private readonly _sceneCursorManager: SceneCursorManager;\n\n public constructor(params: {\n camera: CameraController;\n instance: Instance;\n sceneCursorManager: SceneCursorManager;\n }) {\n this._cameraController = params.camera;\n this._instance = params.instance;\n this._sceneCursorManager = params.sceneCursorManager;\n }\n\n public getBoundingBox(): Box3 {\n const entities = this._instance.getEntities();\n const bbox = new Box3().makeEmpty();\n\n for (const entity of entities) {\n if (isEntity3D(entity)) {\n const entityBox = entity.getBoundingBox();\n if (entityBox != null) {\n bbox.union(entityBox);\n }\n }\n }\n\n return bbox;\n }\n\n public getCameraController(): CameraController {\n return this._cameraController;\n }\n\n public getInstance(): Instance {\n return this._instance;\n }\n\n public getSceneCursorManager(): SceneCursorManager {\n return this._sceneCursorManager;\n }\n}\n\nexport default interface ViewApi {\n getBoundingBox(): Box3;\n getCameraController(): CameraController;\n getInstance(): Instance;\n getSceneCursorManager(): SceneCursorManager;\n}\n","<script setup lang=\"ts\">\n import * as bootstrap from 'bootstrap';\n import { ref } from 'vue';\n\n import Notification from '@/types/Notification';\n\n import { useNotificationStore } from '../stores/notifications';\n\n const alertToast = ref<HTMLDivElement | null>(null);\n const notification = ref<Notification>(Notification.empty());\n\n function showNotification(notif: Notification): void {\n notification.value = notif;\n\n const toast = bootstrap.Toast.getOrCreateInstance(alertToast.value as HTMLDivElement);\n toast.show();\n }\n\n const notificationStore = useNotificationStore();\n\n notificationStore.$onAction(({ args, name }) => {\n switch (name) {\n case 'push':\n showNotification(args[0]);\n break;\n }\n });\n\n function getIcon(): string {\n if (notification.value == null) {\n return 'text-bg-success';\n }\n\n switch (notification.value.level) {\n case 'error':\n return 'bi-exclamation-circle-fill';\n case 'info':\n return 'bi-check-circle-fill';\n case 'success':\n return 'bi-check-lg';\n case 'warning':\n return 'bi-exclamation-triangle-fill';\n default:\n return 'text-bg-success';\n }\n }\n\n function getStyle(): string {\n if (notification.value == null) {\n return 'text-bg-success';\n }\n\n switch (notification.value.level) {\n case 'error':\n return 'text-bg-danger';\n case 'info':\n return 'text-bg-secondary';\n case 'success':\n return 'text-bg-success';\n case 'warning':\n return 'text-bg-warning';\n default:\n return 'text-bg-success';\n }\n }\n\n // For testing purposes\n // onMounted(() => {\n // showNotification(new Notification('Test', 'this is a test', 'info'));\n // })\n</script>\n\n<template>\n <div class=\"toast-container\">\n <div ref=\"alertToast\" class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n <div :class=\"['toast-header', getStyle()]\">\n <i :v-if=\"notification.level === 'info'\" :class=\"['bi', getIcon()]\"></i>\n <strong class=\"me-auto mx-2\">{{ notification.title }}</strong>\n <!-- <small>11 mins ago</small> -->\n <button\n type=\"button\"\n class=\"btn-close\"\n data-bs-dismiss=\"toast\"\n aria-label=\"Close\"\n ></button>\n </div>\n <div class=\"toast-body\" v-html=\"notification.text\"></div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .toast-container {\n bottom: 5rem;\n right: 1rem;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Color } from 'three';\n\n const props = defineProps<{\n color: Color;\n }>();\n\n const hexString = `#${props.color.getHexString()}`;\n</script>\n\n<template>\n <span class=\"color\">\n <span class=\"d-none\">{{ hexString }}</span>\n </span>\n {{ hexString }}\n</template>\n\n<style scoped>\n .color {\n height: 15px;\n width: 15px;\n\n padding: 0px 4px;\n display: inline-block;\n min-width: 13px;\n min-height: 13px;\n border-radius: 3px;\n box-sizing: border-box;\n position: relative;\n vertical-align: middle;\n margin-left: 2px;\n margin-bottom: 2px;\n position: relative;\n top: 1px;\n\n background-color: v-bind('hexString');\n border: 1px solid black;\n color: black;\n opacity: 1;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps({\n prefix: String,\n suffix: String,\n value: String,\n });\n</script>\n\n<template>\n <div class=\"text-secondary\">\n <span\n ><b>{{ prefix }}</b> {{ value }}{{ suffix }}</span\n >\n </div>\n</template>\n\n<style scoped>\n div {\n width: 5rem;\n text-align: start;\n font-size: small;\n }\n</style>\n","<script setup lang=\"ts\">\n const props = defineProps<{\n /** url */\n href: string;\n /** title */\n title: string;\n /** mime-type */\n type?: string;\n }>();\n</script>\n\n<template>\n <template v-if=\"props.type?.startsWith('image/')\">\n <a :href=\"props.href\" target=\"_blank\">\n <img :src=\"props.href\" :alt=\"props.title\" style=\"max-width: 200px\" />\n </a>\n </template>\n <template v-else-if=\"props.type?.startsWith('video/')\">\n <video controls style=\"max-width: 200px\">\n <source :src=\"props.href\" :type=\"props.type\" />\n Download the <a :href=\"props.href\">video</a>.</video\n ><br />\n Download the <a :href=\"props.href\" target=\"_blank\">video</a>.\n </template>\n <template v-else-if=\"props.type === 'application/pdf'\">\n <iframe\n :title=\"props.title\"\n width=\"200\"\n height=\"300\"\n :src=\"props.href\"\n frameborder=\"1\"\n sandbox=\"allow-same-origin allow-scripts\"\n ></iframe\n ><br />\n Download the <a :href=\"props.href\" target=\"_blank\">file</a>.\n </template>\n <template v-else\n ><a :href=\"props.href\" target=\"_blank\">{{ props.title }}</a></template\n >\n</template>\n","<script setup lang=\"ts\">\n import { isColor, isLink, isVector3 } from '@/utils/Types';\n\n import ColorFragment from './ColorFragment.vue';\n import CoordinateFragment from './CoordinateFragment.vue';\n import LinkFragment from './LinkFragment.vue';\n\n const props = defineProps<{\n attrName: string;\n attrValue: unknown;\n }>();\n\n let styles: string[];\n\n switch (props.attrName) {\n // TODO move into module\n case 'IFCType':\n styles = ['badge', 'bg-secondary', 'text-light', 'text-truncate'];\n break;\n default:\n styles = ['text-truncate'];\n }\n</script>\n\n<template>\n <tr>\n <th :title=\"attrName\" class=\"align-top text-truncate\">{{ attrName }}</th>\n <td :class=\"styles\">\n <template v-if=\"props.attrValue === undefined\"\n ><span class=\"text-secondary\">undefined</span></template\n >\n <template v-else-if=\"props.attrValue === null\"\n ><span class=\"text-secondary\">null</span></template\n >\n <template v-else-if=\"typeof props.attrValue === 'object'\">\n <template v-if=\"Array.isArray(props.attrValue)\">\n <table>\n <AttributeItem\n v-for=\"(subitem, index) in props.attrValue\"\n :key=\"index\"\n :attr-name=\"`[${index}]`\"\n :attr-value=\"subitem\"\n />\n </table>\n </template>\n <template v-else-if=\"isLink(props.attrValue)\">\n <LinkFragment\n :href=\"props.attrValue.href\"\n :title=\"props.attrValue.title\"\n :type=\"props.attrValue.type\"\n />\n </template>\n <template v-else-if=\"isColor(props.attrValue)\">\n <ColorFragment :key=\"props.attrValue.getHexString()\" :color=\"props.attrValue\" />\n </template>\n <template v-else-if=\"isVector3(props.attrValue)\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <CoordinateFragment :value=\"props.attrValue.x.toFixed(0)\" prefix=\"X:\" />\n <CoordinateFragment :value=\"props.attrValue.y.toFixed(0)\" prefix=\"Y:\" />\n <CoordinateFragment\n :value=\"props.attrValue.z.toFixed(0)\"\n prefix=\"Alt.:\"\n suffix=\"m\"\n />\n </div>\n </template>\n <template v-else><span class=\"text-secondary\">Object</span></template>\n </template>\n <template v-else\n ><span :title=\"props.attrValue as string\">{{ props.attrValue }}</span></template\n >\n </td>\n </tr>\n</template>\n\n<style scoped>\n th {\n max-width: 150px;\n }\n td {\n word-wrap: break-word;\n max-width: 200px;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Attribute } from '@/types/Feature';\n\n import AttributeItem from './AttributeItem.vue';\n\n defineProps<{\n children: Array<Attribute>;\n title: string;\n }>();\n</script>\n\n<template>\n <div v-if=\"children.length > 0\">\n <h6 class=\"badge bg-info-subtle text-dark mb-0\">{{ title }}</h6>\n <table class=\"table table-striped table-sm w-100\">\n <tbody>\n <AttributeItem\n v-for=\"(list, index) in children\"\n :key=\"index\"\n :attr-name=\"list.key\"\n :attr-value=\"list.value\"\n />\n </tbody>\n </table>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { Vector3 } from 'three';\n\n import { ref } from 'vue';\n\n import type { AttributesGroups } from '@/types/Feature';\n\n import AttributeGroup from './AttributeGroup.vue';\n import CoordinateFragment from './CoordinateFragment.vue';\n\n const props = defineProps<{\n attributes: AttributesGroups;\n name?: string;\n parent: string;\n point: Vector3;\n }>();\n\n const copied = ref(false);\n\n function copyText(): void {\n const value = `${props.point.x};${props.point.y};${props.point.z}`;\n navigator.clipboard\n .writeText(value)\n .then(() => {\n copied.value = true;\n setTimeout(() => (copied.value = false), 2000);\n })\n .catch(e => {\n console.log('failed', e);\n });\n }\n\n defineEmits(['close']);\n</script>\n\n<template>\n <div class=\"card\">\n <div class=\"card-header d-flex align-items-center justify-content-between\">\n <i class=\"bi bi-card-checklist\"></i>\n <span class=\"text-truncate mx-2\">{{ name ?? parent }}</span>\n <button\n @click=\"$emit('close')\"\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n ></button>\n </div>\n <div class=\"card-body content py-2 px-1\">\n <AttributeGroup\n v-for=\"(item, index) in attributes.entries()\"\n :key=\"index\"\n :title=\"item[0]\"\n :children=\"item[1]\"\n />\n </div>\n <div class=\"card-footer py-0\">\n <div class=\"d-flex align-items-center column-gap-3\">\n <CoordinateFragment :value=\"point.x.toFixed(0)\" prefix=\"X:\" />\n <CoordinateFragment :value=\"point.y.toFixed(0)\" prefix=\"Y:\" />\n <CoordinateFragment :value=\"point.z.toFixed(0)\" prefix=\"Alt.:\" suffix=\"m\" />\n <button @click=\"copyText\" type=\"button\" class=\"btn btn-link\">\n <i\n class=\"bi\"\n :class=\"copied ? ['bi-clipboard-check', 'test-success'] : ['bi-clipboard']\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .content {\n overflow-y: auto;\n }\n</style>\n","export default \"data:image/png;base64,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\"","<script setup lang=\"ts\">\n import logo from '@/assets/piero_logo.png';\n</script>\n\n<template>\n <div id=\"loading-screen\" class=\"container\">\n <h1>Loading...</h1>\n <h2>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"48\"\n height=\"48\"\n fill=\"currentColor\"\n class=\"bi bi-geo-alt-fill pulse\"\n viewBox=\"0 0 16 16\"\n style=\"vertical-align: middle\"\n >\n <path\n d=\"M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10m0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6\"\n />\n </svg>\n </h2>\n <div class=\"logo\">\n <img :src=\"logo\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n @keyframes col {\n 0% {\n transform: scale(0.8);\n }\n 50% {\n transform: scale(1.2);\n }\n 100% {\n transform: scale(0.8);\n }\n }\n\n .logo {\n margin-top: 10pt;\n }\n\n .pulse {\n animation: col 3s ease infinite;\n }\n\n h1 {\n color: #377c5f;\n font-size: 2.5rem;\n font-weight: 500;\n line-height: 1.2;\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-family:\n system-ui,\n -apple-system,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n 'Noto Sans',\n 'Liberation Sans',\n Arial,\n sans-serif;\n }\n\n h2 {\n color: #377c5f;\n font-size: 2rem;\n font-weight: 500;\n line-height: 1.2;\n margin-top: 0;\n margin-bottom: 0.5rem;\n }\n\n .container {\n max-width: 100% !important;\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n /* left: 0; */\n width: 100vw;\n height: 100vh;\n right: 0;\n display: flex;\n z-index: 999;\n flex-direction: column;\n justify-content: center;\n text-align: center;\n background-color: white;\n }\n</style>\n","<script setup lang=\"ts\">\n import Instance from '@giro3d/giro3d/core/Instance';\n import Inspector from '@giro3d/giro3d/gui/Inspector';\n import { onMounted, onUnmounted, ref, shallowRef } from 'vue';\n\n import { useGiro3dStore } from '@/stores/giro3d';\n\n const mainView = ref<HTMLDivElement | null>(null);\n const inspectorView = ref<HTMLDivElement | null>(null);\n const instance = shallowRef<Instance | null>(null);\n\n const store = useGiro3dStore();\n\n onMounted(() => {\n instance.value = new Instance({\n backgroundColor: null,\n crs: store.getCRS(),\n target: mainView.value as HTMLDivElement,\n });\n store.setMainView(instance.value);\n\n if (!import.meta.env.PROD) {\n const inspector = Inspector.attach(\n inspectorView.value as HTMLDivElement,\n instance.value,\n {\n title: 'Main view',\n width: 300,\n },\n );\n store.setInspector(inspector);\n }\n });\n\n onUnmounted(() => {\n if (!import.meta.env.PROD) {\n store.getInspector()?.detach();\n store.setInspector(null);\n }\n store.setMainView(null);\n if (instance.value) {\n instance.value.view.setControls(null);\n instance.value.dispose();\n }\n });\n</script>\n\n<template>\n <div class=\"main\">\n <div ref=\"mainView\" class=\"main\" id=\"main-view\"></div>\n <div\n ref=\"inspectorView\"\n id=\"inspector\"\n class=\"position-absolute top-0 start-0 mh-100 overflow-auto\"\n ></div>\n </div>\n</template>\n\n<style scoped>\n .main {\n width: 100%;\n height: 100%;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Ref } from 'vue';\n\n import { ref, watch } from 'vue';\n\n import type NavigationMode from '@/types/NavigationMode';\n\n import { useCameraStore } from '@/stores/camera';\n import { useNotificationStore } from '@/stores/notifications';\n import Notification from '@/types/Notification';\n\n import SwitchToggle from './SwitchToggle.vue';\n\n const camera = useCameraStore();\n const notificationStore = useNotificationStore();\n\n const navigationMode = ref<Ref<NavigationMode>>(camera.getNavigationModeRef());\n watch(navigationMode, newMode => {\n camera.setNavigationMode(newMode);\n\n let name: string;\n let description: string;\n\n switch (newMode) {\n case 'disabled': {\n name = 'Disabled';\n description = 'Camera is disabled';\n break;\n }\n case 'first-person': {\n name = 'First person';\n description = `<i class=\"bi bi-hand-index-thumb\"></i> Left-click to rotate; Right-click to pan<br>\n <i class=\"bi bi-mouse2\"></i> Scroll to zoom<br>\n <i class=\"bi bi-keyboard\"></i> Up/Down/Left/Right: move forward/backward/left/right<br>\n <i class=\"bi bi-keyboard\"></i> W/D/A/S: move up/down/left/right`;\n break;\n }\n case 'orbit': {\n name = 'Free navigation';\n description = `<i class=\"bi bi-hand-index-thumb\"></i> Left-click to pan; Right-click to orbit<br>\n <i class=\"bi bi-mouse2\"></i> Scroll to zoom to cursor<br>\n <i class=\"bi bi-keyboard\"></i> Up/Down/Left/Right: move forward/backward/left/right`;\n break;\n }\n case 'position-on-map': {\n name = 'Position on map';\n description = `<i class=\"bi bi-hand-index-thumb\"></i> Left-click on the map to move to First Person view on the ground.<br>\n Cancel with right-click or Escape`;\n break;\n }\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = newMode;\n return _exhaustiveCheck;\n }\n }\n\n notificationStore.push(\n new Notification(\n 'Navigation',\n `Navigation mode set to <strong>${name}</strong>.<br>${description}`,\n 'success',\n ),\n );\n });\n\n function onPositionOnMapToggle(): void {\n if (navigationMode.value !== 'position-on-map') {\n navigationMode.value = 'position-on-map';\n } else {\n navigationMode.value = 'orbit';\n }\n }\n</script>\n\n<template>\n <div class=\"card root\">\n <div class=\"d-flex align-items-center\">\n <i title=\"Free navigation\" class=\"mx-2 bi bi-camera-reels-fill\"></i>\n <SwitchToggle\n :model-value=\"navigationMode === 'first-person'\"\n @update:model-value=\"v => (navigationMode = v ? 'first-person' : 'orbit')\"\n />\n <i title=\"First person view\" class=\"bi bi-universal-access\"></i>\n <div class=\"vr mx-2\"></div>\n <button\n class=\"btn btn-sm btn-outline-secondary\"\n :class=\"navigationMode === 'position-on-map' ? 'active' : null\"\n :aria-pressed=\"navigationMode === 'position-on-map'\"\n data-bs-toggle=\"button\"\n title=\"Position on map\"\n @click=\"onPositionOnMapToggle\"\n >\n <i class=\"fg-position-man\"></i>\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n .root {\n padding: 0.3rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n margin: 1rem;\n }\n</style>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAABXCAYAAAC+73jDAAAAyHpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVDbDcMgDPxnio7gBw97HPKo1A06fo/gSEnUkzgftjkMaf9+3uk1IJxTLs2q10pA9uzSIYwm+sFM+eADsobiez6VFocEKUXUubU6I5/5OHBG7lDlYmRrFJZ7wXP428MoLtIxkUBsYeRhpDILHAZ9PouqW7s+YdnpDpsrDVqIDjv2aH7sc8PvbQX3qMiurARWtTmAjlWSdggHI4FGRsPQDczaYhJ8yL9/OpF+mhJaGNqk9l0AAAGDaUNDUElDQyBwcm9maWxlAAB4nH2RO0jDQBzGv6ZKfVQczCDFIUN1souKdKxVKEKFUCu06mAefUGThiTFxVFwLTj4WKw6uDjr6uAqCIIPEHfBSdFFSvxfUmgR48FxP7677+PuO4BrVhXN6kkAmm6bmVRSyOVXhdAr+sFjEBHEJcUy5kQxDd/xdY8AW+9iLMv/3J9jSC1YChAQiBOKYdrEG8Szm7bBeJ+YV8qSSnxOPGnSBYkfmS57/Ma45DLHMnkzm5kn5omFUhfLXayUTY14hjiqajrlczmPVcZbjLVqXWnfk70wXNBXlplOcwwpLGIJIgTIqKOCKmzEaNVJsZCh/aSPP+L6RXLJ5KpAIccCatAguX6wP/jdrVWcnvKSwkmg98VxPsaB0C7QajjO97HjtE6A4DNwpXf8tSYQ/yS90dGiR8DwNnBx3dHkPeByBxh9MiRTcqUgTa5YBN7P6JvywMgtMLDm9dbex+kDkKWu0jfAwSEwUaLsdZ9393X39u+Zdn8/0ORyzDea69EAAA5daVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjM5NTZmNTIxLWU2YjAtNGRiNi1hMTk2LWM3ZjkwZjE1YzYwZiIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMTVlNTExOS1lZDExLTRjY2YtOGEzYi1lN2QyZDJkZjBkNzUiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4NjYzMjQ3ZS1mMmVjLTQwZmQtYjE3OC03NzFhNjEwMTRmYWMiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJNYWMgT1MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MzY3NjM3MjAyNDAyIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjA5OjIwVDEzOjI3OjE3KzAyOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowOToyMFQxMzoyNzoxNyswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjFiYjlmOWJiLWYyYzAtNGM4Yi1iYjgxLTU1ODE4NjY0NmQ2YiIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChMaW51eCkiCiAgICAgIHN0RXZ0OndoZW49IjIwMjQtMDMtMTlUMTQ6NDc6MjYrMDE6MDAiLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTUwOTQ2YzYtODBkMy00MmI4LTgwOTUtZDcwYTE3MjNlNDM1IgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKE1hYyBPUykiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDktMjBUMTM6Mjc6MTcrMDI6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+wSyPngAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAywAAAMsABKGRa2wAAAAd0SU1FB+kJFAsbEeAnRtoAACAASURBVHja7Z15mBXVnfc/p6ru0vf2vi/0ytqsoiIgKiogxp1EMkFnjJqocTIzmSWTmUzezCRxljca500m+6hjYsYlibtRcV/iBiqICMjaNND0vnfftarO+0dVX7qhl6ru24hwf8/TDw/Q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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACTCAYAAABszOBRAAAAxXpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVBBEsMgCLz7ij5BBBWeYxo70x/0+QUhnSTTnXGzsmRF0/y8X+lhKECJaucmrWUFCUkZKjg7xmLItHhBWnhwrSfBMIqWTMee4wc46vAL8M9QVU9B/AxjuxpCkc+3oDgIbaKiYj8miiAsbkAEDL9WbsL9fIVt5ivYVzJiWbNYmHu3PXV9vb3qOVjKRMCsjMjeg7ZqwqFClLWgjaANpruyt4I/yL93OpC+DARZTFnCKNgAAAGDaUNDUElDQyBwcm9maWxlAAB4nH2RO0jDQBzGv6ZKfVQczCDFIUN1souKdKxVKEKFUCu06mAefUGThiTFxVFwLTj4WKw6uDjr6uAqCIIPEHfBSdFFSvxfUmgR48FxP7677+PuO4BrVhXN6kkAmm6bmVRSyOVXhdAr+sFjEBHEJcUy5kQxDd/xdY8AW+9iLMv/3J9jSC1YChAQiBOKYdrEG8Szm7bBeJ+YV8qSSnxOPGnSBYkfmS57/Ma45DLHMnkzm5kn5omFUhfLXayUTY14hjiqajrlczmPVcZbjLVqXWnfk70wXNBXlplOcwwpLGIJIgTIqKOCKmzEaNVJsZCh/aSPP+L6RXLJ5KpAIccCatAguX6wP/jdrVWcnvKSwkmg98VxPsaB0C7QajjO97HjtE6A4DNwpXf8tSYQ/yS90dGiR8DwNnBx3dHkPeByBxh9MiRTcqUgTa5YBN7P6JvywMgtMLDm9dbex+kDkKWu0jfAwSEwUaLsdZ9393X39u+Zdn8/0ORyzDea69EAAA16aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmM0N2M4ZTNiLTg2ZjUtNDM3NC04Mzg2LTBjMGQwNGE1YTQxNSIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyNDVjNDdmMC1mODVmLTQ3NzAtYjVlNy1hMmU0ZDFmNWUwNzkiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozMDVhMDI1NS05NzY5LTRhZGQtYjQ3Yy1iOGU4MjlkZDdlNDciCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJNYWMgT1MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MzY3NjU4NjgwODMzIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjA5OjIwVDEzOjI3OjM4KzAyOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowOToyMFQxMzoyNzozOCswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmYwMzU4MmQ4LWUxMTgtNGY1Yi1hNDdiLTlkYjM4ZjIxNTk2ZiIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChNYWMgT1MpIgogICAgICBzdEV2dDp3aGVuPSIyMDI1LTA5LTIwVDEzOjI3OjM4KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Ptv0Ik4AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfpCRQLGyZYmuPVAAAgAElEQVR42u2dd3gc5bX/P2dmd1Use9eybIMNXorp/VJCCZAAAUy4kOQmJEAS4ELosPSA6WB6y8iEml9CAjcJhB4IJgQIhBAw3XSDgTFuuMhaWX135vz+eF/Z69VIVrMsGZ3nmcfyzpaZd77v6UX4GpLrerEwpASIqzISWA9YFxgNjAFKgCqgvOijCiwGmoA6+/dXwDxgrgj1QGtpqbQ0NZ2ufI1J1vYbjMU8NwhIqjIW2BHYBtgE2BiYACR7uR5tAAotyHzgE+BD4G3gAxGWqmaWDQFrsN+UeFWqTAS+CewFbAlsCDir+GjOcqJllis1AYuARgugLwuAVAUMs3+vZ7lcOVABjCjgds3Ax8C7wD+B/4jwhWqmcQhYg4K89YA9gUOBnboApAXAXGAm8J59+F8CNUBWhHrVTFM3OWOFKikgBYwFJlpQbwuMAzayYP0E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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAx3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVDbDcQwCPvPFDdCAnnAOOlLug1u/HMKrdqqlmIIRg4hrL/vFj4DlHLIpUnVWiOQNSt1JBINfecU88475kNL93o4BUKJEdmuUr3/qKfTwEJHVi5GMrsw3QXN7i8PI3+Ix0SEZHEjdSMmE5IbdPtWrCrt+oVpjXeInTBom0lHrUymPe+5YXtLwTtMtHLiCGYWG4DHKYE7EgWjgMaEhpE3cGHySbCQtz0dCH8eW1rDzUi1YAAAAYNpQ0NQSUNDIHByb2ZpbGUAAHicfZE7SMNAHMa/pkp9VBzMIMUhQ3Wyi4p0rFUoQoVQK7TqYB59QZOGJMXFUXAtOPhYrDq4OOvq4CoIgg8Qd8FJ0UVK/F9SaBHjwXE/vrvv4+47gGtWFc3qSQCabpuZVFLI5VeF0Cv6wWMQEcQlxTLmRDEN3/F1jwBb72Isy//cn2NILVgKEBCIE4ph2sQbxLObtsF4n5hXypJKfE48adIFiR+ZLnv8xrjkMscyeTObmSfmiYVSF8tdrJRNjXiGOKpqOuVzOY9VxluMtWpdad+TvTBc0FeWmU5zDCksYgkiBMioo4IqbMRo1UmxkKH9pI8/4vpFcsnkqkAhxwJq0CC5frA/+N2tVZye8pLCSaD3xXE+xoHQLtBqOM73seO0ToDgM3Cld/y1JhD/JL3R0aJHwPA2cHHd0eQ94HIHGH0yJFNypSBNrlgE3s/om/LAyC0wsOb11t7H6QOQpa7SN8DBITBRoux1n3f3dff275l2fz/Q5HLMN5rr0QAADXppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4wLUV4aXYyIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOkdJTVA9Imh0dHA6Ly93d3cuZ2ltcC5vcmcveG1wLyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElEPSJnaW1wOmRvY2lkOmdpbXA6NGVjMGMxNzUtNmE3NS00OGJlLTllZGYtOGNlNDQyM2ZmMmU0IgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU1YmZlYWVjLWNhZDAtNGZlNi1iMGJkLTM2ODEyMWNmYWFmMSIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjliODczYjYyLTY4ZDUtNDU3ZS1iNzVkLWFmN2Y3MGU5YTkzMyIKICAgZGM6Rm9ybWF0PSJpbWFnZS9wbmciCiAgIEdJTVA6QVBJPSIyLjAiCiAgIEdJTVA6UGxhdGZvcm09Ik1hYyBPUyIKICAgR0lNUDpUaW1lU3RhbXA9IjE3NTgzNjc2NzMwNDY0MTMiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zOCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjU6MDk6MjBUMTM6Mjc6NTIrMDI6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDI1OjA5OjIwVDEzOjI3OjUyKzAyOjAwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OGJhNTc0MjgtZDMyOS00MzUzLWI2YjMtYzk1YjRmYzg1MzQ0IgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKE1hYyBPUykiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDktMjBUMTM6Mjc6NTMrMDI6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+fJLSCgAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kJFAsbNdwkogsAACAASURBVHja7J13eBRV98c/syVt03shvRA6KbQkdGkCERAQEMuLxgoWFAs2FLF3BQuCgoqIiPTeew+EXkIICek92ZRt8/sj+QHJbpJNsiHhfTnPw6PMDHfn3rnfe/o5Anep2ch1/hQrwA/wBtwAZ8AesK36r7TqDzX+Xwdoqv5fW/X3AqAYyKv6kwmkAElZcQuVd1e7eUi4uwQmAYIP0B4IAYKr/j8UcL9ljZtjrcWqP1nAeeAMkAhcBM5kxS28evfr3AXI7QaDAxAGhAM9gRjAqer0b03rqaniOnuBw8BR4FhW3MK8u1/xLkBMLSZFAP2BYUBXwPwOXDsRUAGngLXAHuBIVtzC4rtf+S5AGgoKD6AvcD8wELADJP9l0xSBImAX8DewMytuYerdr38XILWBwhUYCjwERAFWphpbi0iFKFIO+Mkt8JRb4SyzwlIi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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAtCAYAAADr0SSvAAAAyHpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVBRDsMgCP3nFDuCgFo4jm1tshvs+EOhS9vsJT6QR54I9M/7gNcAYYZcFqlaazJkzUrNEkmONhlTnjyxnRre60B7CGQltsh+lRr9Zx1/Bh6aZeViJFsI613QHP7yMIqHeExElsQgoGHE5AKGQfNvpaqyXL+w9nSH+IFBx0Y6amV17XnPi21vL/YOE3VGTsbM4gPwOAW4WaLGVrBGtIaRizHOVvSF/NvTCfgCF5hawfSmwyAAAAGDaUNDUElDQyBwcm9maWxlAAB4nH2RO0jDQBzGv6ZKfVQczCDFIUN1souKdKxVKEKFUCu06mAefUGThiTFxVFwLTj4WKw6uDjr6uAqCIIPEHfBSdFFSvxfUmgR48FxP7677+PuO4BrVhXN6kkAmm6bmVRSyOVXhdAr+sFjEBHEJcUy5kQxDd/xdY8AW+9iLMv/3J9jSC1YChAQiBOKYdrEG8Szm7bBeJ+YV8qSSnxOPGnSBYkfmS57/Ma45DLHMnkzm5kn5omFUhfLXayUTY14hjiqajrlczmPVcZbjLVqXWnfk70wXNBXlplOcwwpLGIJIgTIqKOCKmzEaNVJsZCh/aSPP+L6RXLJ5KpAIccCatAguX6wP/jdrVWcnvKSwkmg98VxPsaB0C7QajjO97HjtE6A4DNwpXf8tSYQ/yS90dGiR8DwNnBx3dHkPeByBxh9MiRTcqUgTa5YBN7P6JvywMgtMLDm9dbex+kDkKWu0jfAwSEwUaLsdZ9393X39u+Zdn8/0ORyzDea69EAAA16aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmM4NjdiYjcyLWU1NWEtNGZkZS1hYTlmLTdiYzZhNTJhNGIzZSIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0NWE1ZGEyYy01YjhmLTQ1ZTQtOGJkYy01N2Q0ZmJkZGQ1NWUiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplN2YyOWQyZS1kMDg1LTQ4ZWYtODYyZS0wZDM1NTRjOGVlYWQiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJNYWMgT1MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MzY3Njk4OTQxNjMxIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjA5OjIwVDEzOjI4OjE4KzAyOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowOToyMFQxMzoyODoxOCswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmZlNDAxNmZmLWZkZDItNDA4MS05YjU2LWY2ODYzYjk1Y2E1ZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChNYWMgT1MpIgogICAgICBzdEV2dDp3aGVuPSIyMDI1LTA5LTIwVDEzOjI4OjE4KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Pl6bkfoAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfpCRQLHBI2b4GnAAAU8UlEQVR42u2deXwV1dnHv/feDCQkyCpQFtkXZS0KAi8UpSqgqCMuMB3FQa0bBV+LS1GLSNVirdoWS221dWy9jlIsA1YQRBZFVFbZ14Y1IEsgELKQIbnvH+eZZnLfBIkmrPf5fPKZ3Jk55zxz5jznWc7vOROKxWJfTJ21uu1T0dUa5zHdfFmDwvGj+uUBLUKhUF78dU23uwPTyij+IvB7YANwHOjkuZZ3JjyXptvNgU+BecBdnmsdJ0EnTUlA3VgsVmtztnded0Th8UKAGkCorLEGNAAOyoALUoYc1wOFQOwMerQbgFXAiIRwfDcBSVD5aKPnWjeVMlOHgL+KcBRpul0DuBpIB/KB64Fc4F3PtfZLGQ0YBHQQzfM1MMtzrSJNtxsDPYCVwIXAlcAe4D3PtXICbfYA+gobn3qutSjAUwPAA74Aemm6/bHnWkWl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\"","<script setup lang=\"ts\">\n const dependencies = import.meta.env.VITE_DEPENDENCIES;\n import bpi from '@/assets/sponsors/bpi_france.png';\n import france2030 from '@/assets/sponsors/france_2030.png';\n import franceRelance from '@/assets/sponsors/france_relance.png';\n import oslandia from '@/assets/sponsors/oslandia.png';\n import ueNext from '@/assets/sponsors/ue_next_generation.png';\n import { useModuleStore } from '@/stores/modules';\n\n const modules = useModuleStore().getLoadedModules();\n</script>\n\n<template>\n <div>\n <p>\n <a href=\"https://gitlab.com/giro3d/piero\" target=\"_blank\">Piero</a>\n is a fully-configurable open-source web application for 3D visualization. It is powered\n by\n <a href=\"https://giro3d.org\" target=\"_blank\">Giro3D</a>, a versatile framework to\n visualize geospatial data in the browser.\n </p>\n <h5 class=\"mt-3\">Going further</h5>\n <p>\n If you wish to run your own instance of Piero, or if you wish to contribute to this\n application, head up to\n <a href=\"https://gitlab.com/giro3d/piero\" target=\"_blank\">our GitLab project</a>\n for more info.\n </p>\n <h5>Contributors</h5>\n <p>\n <a target=\"_blank\" href=\"https://gitlab.com/giro3d/piero/-/blob/main/CONTRIBUTORS.md\"\n >Brought to you by the Giro3D contributors.</a\n >\n </p>\n <h5>Sponsors</h5>\n <div class=\"list-group my-3\">\n <a href=\"https://oslandia.com\" target=\"_blank\" class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span>Oslandia</span>\n <img :src=\"oslandia\" class=\"logo\" alt=\"Oslandia\" />\n </div>\n </a>\n <a href=\"https://www.bpifrance.com/\" target=\"_blank\" class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span>BPI France</span>\n <img :src=\"bpi\" class=\"logo\" alt=\"BPI France\" />\n </div>\n </a>\n <span class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span>Funded by the French government as part of France 2030</span>\n <img :src=\"france2030\" class=\"logo\" alt=\"France 2030\" />\n </div>\n </span>\n <span class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span\n >Funded by the European Union - Next Generation EU as part of the France\n Relance plan</span\n >\n <div class=\"text-end\">\n <img :src=\"franceRelance\" class=\"logo\" alt=\"France Relance\" />\n <img :src=\"ueNext\" class=\"logo\" alt=\"European Union - Next Generation EU\" />\n </div>\n </div>\n </span>\n </div>\n <p>\n If you wish to sponsor Giro3D and Piero, you can contact us at\n <a href=\"mailto:infos+3d@oslandia.com\">infos+3d@oslandia.com</a>.\n </p>\n <h5>License</h5>\n <p>\n <a target=\"_blank\" href=\"https://gitlab.com/giro3d/piero/-/blob/main/LICENSE\"\n >MIT License</a\n >\n </p>\n <h5>Credits</h5>\n <p>Data and services used from:</p>\n <ul>\n <li>\n <a target=\"_blank\" href=\"https://ign.fr/\">IGN</a> (Imagery, Elevation model, LIDAR\n data, Elevation API)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://www.grandlyon.com/\">Métropole Grand Lyon</a>\n (Imagery, Elevation model, overlay layers)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://www.openstreetmap.org\">OpenStreetMap</a> (Imagery)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://adresse.data.gouv.fr/\">adresse.data.gouv.fr</a>\n (Geocoding API)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://cadastre.data.gouv.fr\"\n >Données cadastrales ouvertes</a\n >\n (Cadastre)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://oslandia.com\">Oslandia</a> (CityJSON\n reconstructions, overlay layers)\n </li>\n <li><a target=\"_blank\" href=\"https://bimdata.io/\">BIMData</a> (IFC model)</li>\n </ul>\n <p>Third-parties:</p>\n <ul>\n <li v-for=\"[name, info] of Object.entries(dependencies)\" :key=\"name\">\n <a target=\"_blank\" :href=\"info.homepage\">{{ name }} ({{ info.license }})</a>\n <blockquote v-if=\"info.description\" class=\"blockquote fw-light\">\n {{ info.description }}\n </blockquote>\n </li>\n </ul>\n <p>Loaded modules:</p>\n <ul>\n <li v-for=\"module in modules\" :key=\"module.name\">\n <code>{{ module.id }}</code>\n </li>\n </ul>\n <hr />\n </div>\n</template>\n\n<style scoped>\n blockquote {\n font-size: 0.7rem !important;\n margin-bottom: 0;\n }\n .logo {\n max-width: 200px;\n height: auto;\n max-height: 80px;\n }\n</style>\n","const _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, - 1.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n\tnormalize,\n\tdenormalize,\n\tMathUtils\n};\n","import type { Component, Ref, ShallowRef } from 'vue';\n\nimport { defineStore } from 'pinia';\nimport { generateUUID } from 'three/src/math/MathUtils.js';\nimport { ref, shallowRef } from 'vue';\n\nimport type { AnalysisToolRegistrationParams } from '@/api/AnalysisApi';\n\ntype AnalysisTool = {\n collapsible: boolean;\n component: ShallowRef<Component>;\n icon: string;\n id: string;\n name: string;\n};\n\nexport const useAnalysisStore = defineStore('analysis', () => {\n const _tools: Ref<AnalysisTool[]> = ref([]);\n\n function registerTool(tool: AnalysisToolRegistrationParams): void {\n const item: AnalysisTool = {\n collapsible: true,\n component: shallowRef(tool.component),\n icon: tool.icon,\n id: generateUUID(),\n name: tool.name,\n };\n\n _tools.value.push(item);\n }\n\n function getTools(): AnalysisTool[] {\n return _tools.value;\n }\n\n return {\n getTools,\n registerTool,\n };\n});\n\nexport type AnalysisStore = ReturnType<typeof useAnalysisStore>;\n","<script setup lang=\"ts\">\n defineProps<{\n collapsible: boolean;\n icon?: string;\n id: string;\n title: string;\n }>();\n</script>\n\n<template>\n <div class=\"accordion-item\" :id=\"id\">\n <h2 class=\"accordion-header\">\n <button\n class=\"accordion-button\"\n type=\"button\"\n data-bs-toggle=\"collapse\"\n :data-bs-target=\"`#${id}-collapse`\"\n aria-expanded=\"false\"\n :aria-controls=\"`${id}-collapse`\"\n >\n <i v-if=\"icon\" class=\"bi icon\" :class=\"icon\"></i>\n {{ title }}\n </button>\n </h2>\n <div\n :id=\"`${id}-collapse`\"\n class=\"accordion-collapse collapse\"\n data-bs-parent=\"#accordionExample\"\n >\n <div class=\"accordion-body\">\n <slot></slot>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .icon {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n color: rgb(180, 180, 180);\n }\n</style>\n","<script setup lang=\"ts\">\n import { useAnalysisStore } from '@/stores/analysis';\n\n import ToolWrapper from './analysis/ToolWrapper.vue';\n\n const analysis = useAnalysisStore();\n</script>\n\n<template>\n <div class=\"accordion\" id=\"analysis-accordion\">\n <ToolWrapper\n v-for=\"item in analysis.getTools()\"\n :id=\"item.id\"\n :key=\"item.id\"\n :title=\"item.name\"\n :icon=\"item.icon\"\n :collapsible=\"item.collapsible\"\n >\n <component :is=\"item.component\" />\n </ToolWrapper>\n </div>\n\n <div v-if=\"analysis.getTools().length === 0\" class=\"warning\">No analysis tool registered.</div>\n</template>\n\n<style scoped>\n .warning {\n justify-content: center;\n text-align: center;\n }\n</style>\n","<template>\n <fieldset class=\"vstack gap-1 flex-grow-0 flew-shrink-0\">\n <hr />\n <slot></slot>\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\n import { ref } from 'vue';\n\n import ButtonWithIcon from './ButtonWithIcon.vue';\n\n defineProps<{\n icon?: string;\n text?: string;\n title: string;\n }>();\n\n const emits = defineEmits<{\n (e: 'import', files: File[]): void;\n }>();\n\n const hover = ref(false);\n const hiddenInput = ref<HTMLInputElement | null>(null);\n\n function importFiles(files: FileList | null | undefined): void {\n if (files) {\n const a = [];\n for (const file of files) {\n a.push(file);\n }\n emits('import', a);\n }\n }\n\n function importFromFile(e: Event): void {\n const files = (e.target as HTMLInputElement).files;\n importFiles(files);\n }\n\n function onDragEnter(e: DragEvent): void {\n hover.value = true;\n e.preventDefault();\n }\n\n function onDragLeave(e: DragEvent): void {\n hover.value = false;\n e.preventDefault();\n }\n\n function onDragOver(e: DragEvent): void {\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'copy';\n }\n }\n\n function onDrop(e: DragEvent): void {\n hover.value = false;\n const files = e.dataTransfer?.files;\n importFiles(files);\n e.preventDefault();\n }\n</script>\n\n<template>\n <div\n draggable=\"true\"\n @dragover=\"onDragOver\"\n @dragenter=\"onDragEnter\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDrop\"\n >\n <ButtonWithIcon\n :title=\"title\"\n :text=\"text\"\n :icon=\"icon ?? `bi-box-arrow-left`\"\n @click=\"(hiddenInput as HTMLInputElement).click()\"\n class=\"w-100\"\n :class=\"hover ? 'btn-primary' : 'btn-outline-secondary'\"\n />\n <input\n ref=\"hiddenInput\"\n class=\"btn btn-outline-secondary d-none\"\n type=\"file\"\n @input=\"importFromFile\"\n multiple=\"true\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { ref } from 'vue';\n\n import type Named from '@/types/Named';\n\n const props = defineProps<{\n current: Named | null;\n descriptionPosition?: 'bottom' | 'top';\n items: Named[];\n label: string;\n }>();\n\n const emits = defineEmits<{\n (e: 'updated:current', current: Named | null): void;\n }>();\n\n const currentSelection = ref<Named | null>(props.current);\n\n function setCurrent(index: number): void {\n const item = props.items[index];\n currentSelection.value = item;\n emits('updated:current', item);\n }\n\n const id = MathUtils.generateUUID();\n</script>\n\n<template>\n <fieldset class=\"border p-2\">\n <legend class=\"float-none w-auto form-text mb-0 px-2\">{{ label }}</legend>\n <div\n v-if=\"\n descriptionPosition === 'top' &&\n currentSelection !== null &&\n currentSelection.description\n \"\n class=\"form-text mt-0 mx-2\"\n >\n {{ currentSelection.description }}\n </div>\n <select\n :id=\"id\"\n class=\"form-select\"\n :aria-label=\"label\"\n @input=\"e => setCurrent((e.target as HTMLSelectElement).selectedIndex)\"\n >\n <option v-for=\"(item, index) in items\" :key=\"index\" :value=\"index\">\n {{ item.name }}\n </option>\n </select>\n <div\n v-if=\"\n descriptionPosition !== 'top' &&\n currentSelection !== null &&\n currentSelection.description\n \"\n class=\"form-text mt-0 mx-2\"\n >\n {{ currentSelection.description }}\n </div>\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\n import SwitchToggle from './SwitchToggle.vue';\n\n defineProps<{\n visible: boolean;\n }>();\n defineEmits(['update:visible']);\n</script>\n\n<template>\n <SwitchToggle :model-value=\"visible\" @update:model-value=\"v => $emit('update:visible', v)\" />\n</template>\n\n<style scoped>\n .icon {\n width: 1rem !important;\n float: right;\n }\n\n .inactive {\n color: rgb(180, 180, 180);\n }\n\n .active {\n width: 1rem !important;\n float: right;\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps({\n text: String,\n });\n</script>\n\n<template>\n <div>\n {{ text }}\n </div>\n</template>\n\n<style scoped>\n div {\n opacity: 0.4;\n width: 100%;\n height: 100% !important;\n vertical-align: middle;\n font-size: large !important;\n text-align: center;\n }\n</style>\n","<script setup lang=\"ts\">\n import { onMounted, onUnmounted, ref } from 'vue';\n\n import type Annotation from '@/types/Annotation';\n\n import AttributeItem from '../AttributeItem.vue';\n import VisibilityControl from '../VisibilityControl.vue';\n import EmptyIndicator from './EmptyIndicator.vue';\n\n const props = defineProps<{\n annotation: Annotation;\n visible: boolean;\n }>();\n\n defineEmits(['edit', 'stop-edit', 'delete', 'download', 'update:visible', 'zoom']);\n\n const isEditing = ref(props.annotation.isEditing);\n\n const onIsEditingChanged = (): void => {\n isEditing.value = props.annotation.isEditing;\n };\n\n onMounted(() => {\n props.annotation.addEventListener('isEditing', onIsEditingChanged);\n });\n\n onUnmounted(() => {\n props.annotation.removeEventListener('isEditing', onIsEditingChanged);\n });\n</script>\n\n<template>\n <li class=\"list-group-item item\">\n <div class=\"d-flex\">\n <VisibilityControl\n :visible=\"visible\"\n v-on:update:visible=\"v => $emit('update:visible', v)\"\n />\n\n <a class=\"title\" :title=\"annotation.title\" href=\"#\" @click=\"$emit('zoom')\">{{\n annotation.title\n }}</a>\n\n <div class=\"icons\">\n <a\n href=\"#\"\n class=\"icon\"\n title=\"Attribute table\"\n data-bs-toggle=\"collapse\"\n :data-bs-target=\"`#collapse-${annotation.uuid}`\"\n aria-expanded=\"false\"\n aria-controls=\"`#collapse-${annotation.uuid}`\"\n >\n <i class=\"bi bi-card-list\"></i>\n </a>\n <a\n href=\"#\"\n class=\"icon\"\n title=\"Edit geometry (right-click to exit edition, or press Escape to cancel modifications)\"\n @click=\"isEditing ? $emit('stop-edit') : $emit('edit')\"\n >\n <i :class=\"`bi bi-pencil ${isEditing ? 'text-primary' : ''}`\"></i>\n </a>\n <a href=\"#\" class=\"icon\" title=\"Download...\" @click=\"$emit('download')\">\n <i class=\"bi bi-download\"></i>\n </a>\n <a href=\"#\" class=\"icon\" title=\"Delete\" @click=\"$emit('delete')\">\n <i class=\"bi bi-trash\"></i>\n </a>\n </div>\n </div>\n\n <div class=\"collapse m-2\" :id=\"`collapse-${annotation.uuid}`\">\n <EmptyIndicator\n text=\"No properties\"\n v-if=\"Object.entries(annotation.properties).length === 0\"\n />\n <table class=\"table table-striped table-sm table-responsive-sm\" v-else>\n <thead>\n <tr>\n <th>Key</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n <AttributeItem\n v-for=\"[key, value] of Object.entries(annotation.properties)\"\n :key=\"key\"\n :attr-name=\"key\"\n :attr-value=\"value\"\n />\n </tbody>\n </table>\n </div>\n </li>\n</template>\n\n<style scoped>\n .item {\n padding: 0.1rem;\n }\n\n a {\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n .icons {\n display: flex;\n }\n\n .title {\n white-space: nowrap;\n display: block;\n width: 100% !important;\n margin-left: 1rem;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .icon {\n padding-left: 0.4rem;\n color: rgb(180, 180, 180);\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n</style>\n","import type Named from './Named';\n\ntype AnnotationMode = 'mapOnly' | 'normal' | 'objectsOnly';\n\ntype AnnotationNamed = Named & {\n value: AnnotationMode;\n};\n\nexport const annotationModes: AnnotationNamed[] = [\n { name: 'Default', value: 'normal' },\n {\n description: 'Will only pick points from the map and not to any 3D object',\n name: 'Map only',\n value: 'mapOnly',\n },\n {\n description: 'Will only pick points from 3D objects, and not from the map',\n name: '3D objects only',\n value: 'objectsOnly',\n },\n] as const;\n\nexport default AnnotationMode;\n","<script setup lang=\"ts\">\n import { ref, watch } from 'vue';\n\n import type AnnotationMode from '@/types/AnnotationMode';\n import type Named from '@/types/Named';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import DropdownView from '@/components/DropdownView.vue';\n import AnnotationItem from '@/components/panels/AnnotationItem.vue';\n import EmptyIndicator from '@/components/panels/EmptyIndicator.vue';\n import SwitchToggle from '@/components/SwitchToggle.vue';\n import { useAnnotationStore } from '@/stores/annotations';\n import { useCameraStore } from '@/stores/camera';\n import Annotation from '@/types/Annotation';\n import { annotationModes } from '@/types/AnnotationMode';\n import Download from '@/utils/Download';\n\n const annotations = useAnnotationStore();\n const cameraStore = useCameraStore();\n\n const annotationMode = ref<AnnotationMode>(annotations.getAnnotationMode());\n watch(annotationMode, newMode => {\n annotations.setAnnotationMode(newMode);\n });\n\n function downloadAnnotation(annotation: Annotation): void {\n const geojson = annotation.toGeoJSON();\n Download.downloadAsJson(geojson, `annotation-${annotation.title}.json`);\n }\n\n function exportAnnotations(): void {\n const geojson = Annotation.toCollection(annotations.getAnnotations());\n Download.downloadAsJson(geojson, 'annotations.json');\n }\n\n function goTo(annotation: Annotation): void {\n cameraStore.lookTopDownAt(annotation.object);\n }\n\n function importAnnotationFile(files: File[]): void {\n annotations.importAnnotationsFiles(files);\n }\n\n function setCurrentMode(src: Named | null): void {\n annotationMode.value = src?.value as AnnotationMode;\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <EmptyIndicator text=\"No annotations\" v-if=\"annotations.count === 0\" />\n\n <ul class=\"list-group list-group-flush flex-fill overflow-auto\">\n <AnnotationItem\n v-for=\"item in annotations.getAnnotations()\"\n :key=\"item.title\"\n :annotation=\"item\"\n :visible=\"item.visible\"\n v-on:update:visible=\"\n () => {\n item.visible = !item.visible;\n $forceUpdate();\n }\n \"\n v-on:edit=\"annotations.edit(item)\"\n v-on:stop-edit=\"annotations.stopEdition()\"\n v-on:delete=\"annotations.remove(item)\"\n v-on:download=\"downloadAnnotation(item)\"\n v-on:zoom=\"goTo(item)\"\n />\n </ul>\n\n <ButtonArea :disabled=\"annotations.isUserDrawing()\" id=\"annotations-fieldset\">\n <SwitchToggle\n v-bind:model-value=\"annotations.showLabels()\"\n v-on:update:model-value=\"v => annotations.setShowLabels(v)\"\n title=\"show labels\"\n >Show annotation labels</SwitchToggle\n >\n <DropdownView\n label=\"Picking mode\"\n description-position=\"top\"\n :current=\"annotationModes[0]\"\n :items=\"annotationModes\"\n @updated:current=\"src => setCurrentMode(src)\"\n class=\"mb-2\"\n />\n <ButtonWithIcon\n title=\"Add point annotation\"\n text=\"New points\"\n icon=\"bi-pin\"\n class=\"btn-primary\"\n @click=\"annotations.createPoint()\"\n />\n <ButtonWithIcon\n title=\"Add line annotation\"\n text=\"New line\"\n icon=\"bi-bezier2\"\n class=\"btn-primary\"\n @click=\"annotations.createLine()\"\n />\n <ButtonWithIcon\n title=\"Add polygon annotation\"\n text=\"New polygon\"\n icon=\"bi-heptagon\"\n class=\"btn-primary\"\n @click=\"annotations.createPolygon()\"\n />\n <ButtonWithIcon\n title=\"Export annotations to GeoJSON\"\n text=\"Export annotations\"\n icon=\"bi-box-arrow-right\"\n class=\"btn-outline-secondary\"\n @click=\"exportAnnotations\"\n />\n <ImportButton\n title=\"Import annotation from GeoJSON\"\n text=\"Import annotations\"\n @import=\"importAnnotationFile\"\n />\n </ButtonArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n defineProps({\n show: Boolean,\n title: String,\n });\n</script>\n\n<template>\n <div v-if=\"show\">\n <div class=\"background\"></div>\n <div\n :class=\"['modal', 'fade', 'd-block', show ? 'show' : null]\"\n id=\"exampleModal\"\n tabindex=\"-1\"\n aria-labelledby=\"exampleModalLabel\"\n aria-hidden=\"true\"\n >\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h1 class=\"modal-title fs-5\" id=\"exampleModalLabel\">{{ title }}</h1>\n <button\n type=\"button\"\n class=\"btn-close\"\n @click=\"$emit('close')\"\n data-bs-dismiss=\"modal\"\n aria-label=\"Close\"\n ></button>\n </div>\n <div class=\"modal-body\"><slot></slot></div>\n <div class=\"modal-footer\">\n <button\n type=\"button\"\n @click=\"$emit('close')\"\n class=\"btn btn-secondary\"\n data-bs-dismiss=\"modal\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .background {\n opacity: 0.5;\n position: absolute;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background-color: black;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps(['url', 'name']);\n defineEmits(['delete', 'share', 'goto']);\n</script>\n\n<template>\n <li class=\"list-group-item item d-flex d-flex-end\">\n <a class=\"bookmark\" href=\"#\" @click=\"$emit('goto')\">{{ name }}</a>\n <a href=\"#\" class=\"icon\" title=\"Share this bookmark\" @click=\"$emit('share')\">\n <i class=\"bi bi-share\"></i>\n </a>\n <a href=\"#\" class=\"icon\" title=\"Delete this bookmark\" @click=\"$emit('delete')\">\n <i class=\"bi bi-trash\"></i>\n </a>\n </li>\n</template>\n\n<style scoped>\n .item {\n padding: 0.1rem;\n }\n\n a {\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n .bookmark {\n width: 100%;\n }\n\n .icon {\n margin-left: 0.2rem;\n width: 1rem !important;\n color: rgb(180, 180, 180);\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n\n .spinner-container {\n width: 1rem;\n }\n\n .layer-name {\n width: 40%;\n margin-left: 1rem;\n }\n\n .slider {\n display: flex;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps<{\n url: string;\n }>();\n\n function copyToClipboard(url: string): void {\n void navigator.clipboard.writeText(url);\n }\n</script>\n\n<template>\n <div>\n <p>Use this link to share your bookmark</p>\n\n <div class=\"input-group mb-3\">\n <span class=\"form-control text-truncate\">{{ url }}</span>\n <span class=\"input-group-text\" id=\"basic-addon2\">\n <a\n title=\"Copy to clipboard\"\n href=\"#\"\n class=\"text-secondary\"\n @click=\"() => copyToClipboard(url)\"\n >\n <i class=\"bi bi-clipboard\"></i>\n </a>\n </span>\n </div>\n </div>\n</template>\n","import { EventDispatcher, Vector3 } from 'three';\n\nimport Download from '@/utils/Download';\n\nimport CameraPosition from './CameraPosition';\n\ntype BookmarkJson = {\n camera: [number, number, number];\n focalOffset: [number, number, number];\n target: [number, number, number];\n};\n\nexport type BookmarkEventMap = {\n delete: {\n /** empty */\n };\n goto: {\n /** empty */\n };\n};\n\nexport type SerializedBookmark = {\n title: string;\n url: string;\n};\n\nexport default class Bookmark extends EventDispatcher<BookmarkEventMap> {\n public readonly camera: CameraPosition;\n public readonly name: string;\n\n public constructor(name: string, camera: CameraPosition) {\n super();\n this.name = name;\n this.camera = camera;\n }\n\n public static new(name: string, urlString: string): Bookmark {\n const url = new URL(urlString);\n const view = url.searchParams.get('view');\n if (view === null) {\n throw new Error('Could not deserialize bookmark');\n }\n const json: BookmarkJson = JSON.parse(view);\n\n const camera = new Vector3(json.camera[0], json.camera[1], json.camera[2]);\n const target = new Vector3(json.target[0], json.target[1], json.target[2]);\n const focalOffset = new Vector3(\n json.focalOffset[0],\n json.focalOffset[1],\n json.focalOffset[2],\n );\n\n const cameraPosition = new CameraPosition(camera, target, focalOffset);\n\n return new Bookmark(name, cameraPosition);\n }\n\n public delete(): void {\n this.dispatchEvent({ type: 'delete' });\n }\n\n public getUrl(): URL {\n const base = Download.getBaseUrl() + '?';\n const cam = this.camera;\n const json: BookmarkJson = {\n camera: [cam.camera.x, cam.camera.y, cam.camera.z],\n focalOffset: [cam.focalOffset.x, cam.focalOffset.y, cam.focalOffset.z],\n target: [cam.target.x, cam.target.y, cam.target.z],\n };\n\n const url = new URL(base);\n const params = url.searchParams;\n\n params.set('tour', 'none');\n params.set('view', JSON.stringify(json));\n\n return url;\n }\n\n public goTo(): void {\n this.dispatchEvent({ type: 'goto' });\n }\n}\n","import { defineStore } from 'pinia';\nimport { Vector3 } from 'three';\nimport { computed, ref } from 'vue';\n\nimport { getConfig } from '@/config-loader';\nimport { GLOBAL_EVENT_DISPATCHER } from '@/events';\nimport Bookmark from '@/types/Bookmark';\nimport CameraPosition from '@/types/CameraPosition';\n\nfunction buildInitialList(): Bookmark[] {\n const config = getConfig();\n const result: Bookmark[] = [];\n\n for (const conf of config.bookmarks) {\n const pos = conf.position;\n const target = conf.target;\n const fo = conf.focalOffset;\n const title = conf.title;\n\n const cameraPosition = new CameraPosition(\n new Vector3(pos.x, pos.y, pos.z),\n new Vector3(target.x, target.y, target.z),\n new Vector3(fo.x, fo.y, fo.z),\n );\n\n result.push(new Bookmark(title, cameraPosition));\n }\n\n return result;\n}\n\nexport const useBookmarkStore = defineStore('bookmarks', () => {\n const bookmarks = ref<Set<Bookmark>>(new Set(buildInitialList()));\n const count = computed(() => bookmarks.value.size);\n\n function add(bookmark: Bookmark): void {\n bookmarks.value.add(bookmark);\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'bookmark-added', value: bookmark });\n }\n\n function remove(bookmark: Bookmark): void {\n bookmarks.value.delete(bookmark);\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'bookmark-removed', value: bookmark });\n }\n\n function clear(): void {\n bookmarks.value.clear();\n }\n\n function getBookmarks(): Bookmark[] {\n return [...bookmarks.value];\n }\n\n return { add, clear, count, getBookmarks, remove };\n});\n\nexport type BookmarkStore = ReturnType<typeof useBookmarkStore>;\n","<script setup lang=\"ts\">\n import { ref } from 'vue';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import ModalOverlay from '@/components/ModalOverlay.vue';\n import BookmarkItem from '@/components/panels/BookmarkItem.vue';\n import EmptyIndicator from '@/components/panels/EmptyIndicator.vue';\n import ShareBookmarkModal from '@/components/panels/ShareBookmarkModal.vue';\n import { useBookmarkStore } from '@/stores/bookmarks';\n import { useCameraStore } from '@/stores/camera';\n import { useNotificationStore } from '@/stores/notifications';\n import Bookmark, { type SerializedBookmark } from '@/types/Bookmark';\n import Notification from '@/types/Notification';\n import Download from '@/utils/Download';\n\n const showShareModal = ref(false);\n const shareUrl = ref<string | null>(null);\n const modalTitle = ref<string | null>(null);\n\n const notificationStore = useNotificationStore();\n const bookmarkStore = useBookmarkStore();\n const cameraStore = useCameraStore();\n\n function addBookmark(): void {\n const name = window.prompt('Bookmark name', 'New bookmark');\n if (name != null) {\n const bookmark = new Bookmark(name, cameraStore.getCameraPosition());\n bookmarkStore.add(bookmark);\n }\n }\n\n function exportBookmarks(): void {\n const json = [];\n for (const bookmark of bookmarkStore.getBookmarks()) {\n json.push({\n title: bookmark.name,\n url: bookmark.getUrl().toString(),\n });\n }\n Download.downloadAsJson(json, 'bookmarks.json');\n }\n\n function goTo(bookmark: Bookmark): void {\n cameraStore.setCameraPosition(bookmark.camera);\n }\n\n function importBookmarkFile(files: File[]): void {\n for (const file of files) {\n void importBookmarks(file);\n }\n }\n\n async function importBookmarks(file: Blob): Promise<void> {\n const str = await file.text();\n const serializedBookmarks: SerializedBookmark[] = JSON.parse(str);\n\n const existingBookmarks = new Set(bookmarkStore.getBookmarks().map(b => b.name));\n\n let nbImported = 0;\n let nbSkipped = 0;\n\n serializedBookmarks.forEach((bookmark: SerializedBookmark) => {\n if (!existingBookmarks.has(bookmark.title)) {\n bookmarkStore.add(Bookmark.new(bookmark.title, bookmark.url));\n nbImported++;\n } else {\n nbSkipped++;\n }\n });\n\n notificationStore.push(\n new Notification(\n 'Bookmarks',\n `${nbImported} bookmarks imported (${nbSkipped} skipped)`,\n 'success',\n ),\n );\n }\n\n function shareBookmark(bookmark: Bookmark): void {\n shareUrl.value = bookmark.getUrl().toString();\n modalTitle.value = 'Share bookmark';\n showShareModal.value = true;\n }\n\n function shareCurrentView(): void {\n const temp = new Bookmark('temp', cameraStore.getCameraPosition());\n shareUrl.value = temp.getUrl().toString();\n modalTitle.value = 'Share current view';\n showShareModal.value = true;\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <EmptyIndicator text=\"No bookmarks\" v-if=\"bookmarkStore.count === 0\" />\n\n <ul class=\"list-group list-group-flush flex-fill overflow-auto\">\n <BookmarkItem\n v-for=\"bookmark in bookmarkStore.getBookmarks()\"\n :key=\"bookmark.name\"\n :name=\"bookmark.name\"\n v-on:share=\"shareBookmark(bookmark)\"\n v-on:delete=\"bookmarkStore.remove(bookmark)\"\n v-on:goto=\"goTo(bookmark)\"\n />\n </ul>\n\n <ButtonArea>\n <ButtonWithIcon\n text=\"New bookmark\"\n icon=\"bi-plus-lg\"\n title=\"Create a new bookmark from the current view\"\n class=\"btn-primary\"\n @click=\"\n () => {\n addBookmark();\n $forceUpdate();\n }\n \"\n />\n <ButtonWithIcon\n text=\"Share view\"\n icon=\"bi-share\"\n title=\"Share current view\"\n class=\"btn-outline-secondary\"\n @click=\"shareCurrentView\"\n />\n <ButtonWithIcon\n title=\"Export bookmarks to GeoJSON\"\n class=\"btn-outline-secondary\"\n @click=\"exportBookmarks\"\n icon=\"bi-box-arrow-right\"\n text=\"Export bookmarks\"\n />\n <ImportButton\n title=\"Import bookmarks from GeoJSON\"\n text=\"Import bookmarks\"\n @import=\"importBookmarkFile\"\n />\n </ButtonArea>\n </div>\n\n <!-- FIXME the modal popup background does not take the entire screen -->\n <!-- FIXME the modal popup slightly changes the layout of the page when it appears -->\n <ModalOverlay\n :show=\"showShareModal\"\n :title=\"modalTitle as string\"\n v-on:close=\"() => (showShareModal = false)\"\n >\n <ShareBookmarkModal :url=\"shareUrl as string\" />\n </ModalOverlay>\n</template>\n","<template>\n <ul class=\"list-group list-group-flush border-start\">\n <slot></slot>\n </ul>\n</template>\n\n<style scoped>\n :slotted(li.list-group-item) {\n padding-top: 0;\n padding-bottom: 0;\n margin-left: 0.25rem;\n padding-left: 0;\n padding-right: 0;\n }\n</style>\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { onMounted, ref } from 'vue';\n\n const props = defineProps<{\n expanded?: boolean;\n iconPosition?: 'left' | 'right';\n title: string;\n }>();\n const emit = defineEmits(['update:expanded']);\n\n const id = MathUtils.generateUUID();\n const target = `#${id}`;\n\n const collapsible = ref<HTMLDivElement | null>(null);\n\n onMounted(() => {\n if (props.expanded) {\n collapsible.value?.classList.add('show');\n }\n\n collapsible.value?.addEventListener('hidden.bs.collapse', () =>\n emit('update:expanded', false),\n );\n collapsible.value?.addEventListener('shown.bs.collapse', () =>\n emit('update:expanded', true),\n );\n });\n</script>\n\n<template>\n <div>\n <h6>\n <a\n class=\"d-flex text-nowrap text-truncate overflow-hidden link-underline link-underline-opacity-0 link-underline-opacity-75-hover link-body-emphasis\"\n :href=\"target\"\n data-bs-toggle=\"collapse\"\n role=\"button\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"id\"\n >\n <div v-if=\"iconPosition === 'left'\" class=\"icon me-2\">\n <i class=\"bi bi-chevron-down\"></i>\n </div>\n <span class=\"flex-fill\">{{ title }}</span>\n <div v-if=\"iconPosition !== 'left'\" class=\"icon ms-2\">\n <i class=\"bi bi-chevron-down\"></i>\n </div>\n </a>\n </h6>\n <div ref=\"collapsible\" :id=\"id\" class=\"collapse\">\n <slot></slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n defineProps<{\n title?: string;\n }>();\n</script>\n\n<template>\n <div\n class=\"d-inline-block flex-fill text-nowrap text-truncate overflow-hidden px-1\"\n :class=\"$attrs.class\"\n >\n {{ title }}\n </div>\n</template>\n","<script setup lang=\"ts\">\n defineProps<{\n opacity: number;\n size?: 'normal' | 'small';\n }>();\n defineEmits(['update:opacity']);\n</script>\n\n<template>\n <div class=\"slider d-flex\">\n <i v-if=\"size !== 'small'\" title=\"Transparent\" class=\"bi-x-diamond me-1\"></i>\n <i v-if=\"size === 'small'\" title=\"Opacity\" class=\"bi-x-diamond-fill opacity-75 me-1\"></i>\n <input\n title=\"Opacity\"\n type=\"range\"\n class=\"form-range\"\n min=\"0\"\n step=\"0.01\"\n max=\"1\"\n @input=\"\n $emit(\n 'update:opacity',\n Number.parseFloat(($event.target as HTMLInputElement).value),\n )\n \"\n :value=\"opacity\"\n />\n <i v-if=\"size !== 'small'\" title=\"Opaque\" class=\"bi-x-diamond-fill ms-1\"></i>\n </div>\n</template>\n\n<style scoped>\n input {\n display: flex;\n border-color: lightgray;\n border-style: solid;\n border-width: 1px;\n border-radius: 0.5rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { LayerType } from '@/types/configuration/layers';\n\n import Icon from '@/components/atoms/Icon.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import ListLabel from '@/components/atoms/ListLabel.vue';\n import OpacitySlider from '@/components/OpacitySlider.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n\n defineProps<{\n hasOpacitySlider: boolean;\n isLoading: boolean;\n name: string;\n opacity: number;\n type: 'graticule' | LayerType;\n visible: boolean;\n }>();\n\n defineEmits(['update:opacity', 'update:visible']);\n\n const icons: Record<'graticule' | LayerType, string> = {\n color: 'fg-landcover-map',\n elevation: 'fg-profile',\n graticule: 'fg-grid',\n mask: 'bi-mask',\n };\n const iconTitles: Record<'graticule' | LayerType, string> = {\n color: 'Color layer',\n elevation: 'Elevation layer',\n graticule: 'Graticule',\n mask: 'Mask layer',\n };\n</script>\n\n<template>\n <li class=\"list-group-item\">\n <div class=\"d-flex\">\n <IconList class=\"me-1 text-body-tertiary\">\n <Icon :icon=\"icons[type]\" :title=\"iconTitles[type]\" />\n </IconList>\n <VisibilityControl\n :visible=\"visible\"\n v-on:update:visible=\"v => $emit('update:visible', v)\"\n />\n <ListLabel :title=\"name\" class=\"label\" :class=\"!visible ? 'disabled' : null\" />\n <OpacitySlider\n v-if=\"hasOpacitySlider\"\n class=\"opacity-slider\"\n :class=\"!visible ? 'disabled' : null\"\n :opacity=\"opacity\"\n @update:opacity=\"v => $emit('update:opacity', v)\"\n />\n </div>\n </li>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n }\n\n .opacity-slider {\n min-width: 100px;\n }\n</style>\n","<template>\n <div class=\"spinner-border spinner-border-sm text-secondary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { reactive, ref, watch } from 'vue';\n\n import type { Datagroup } from '@/types/Dataset';\n\n import CompactList from '@/components/atoms/CompactList.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import IconListButton from '@/components/atoms/IconListButton.vue';\n import ListLabelButton from '@/components/atoms/ListLabelButton.vue';\n import DatasetOrGroupItem from '@/components/panels/DatasetOrGroupItem.vue';\n import SpinnerControl from '@/components/SpinnerControl.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n\n const props = defineProps<{\n group: Datagroup;\n }>();\n\n defineEmits(['zoom', 'clipTo', 'update:toggle-grid', 'update:toggle-mask', 'update:visible']);\n\n const leafs = reactive(props.group.leafs());\n const hasLeafPreloading = ref(false);\n const hasLeafPreloaded = ref(false);\n const isVisible = ref(props.group.visible);\n watch(leafs, newValues => {\n hasLeafPreloading.value = newValues.some(v => v.isPreloading);\n hasLeafPreloaded.value = newValues.some(v => v.isPreloaded);\n isVisible.value = newValues.some(v => v.visible);\n });\n\n const id = MathUtils.generateUUID();\n const target = `#${id}`;\n</script>\n\n<template>\n <div class=\"d-flex\">\n <IconList class=\"me-1 text-body-tertiary\">\n <i class=\"bi bi-folder2\" title=\"Group\" />\n </IconList>\n <VisibilityControl\n :visible=\"isVisible\"\n @update:visible=\"v => $emit('update:visible', group, v)\"\n />\n <IconList class=\"me-1\">\n <IconListButton\n title=\"Expand group\"\n icon=\"bi-chevron-down\"\n data-bs-toggle=\"collapse\"\n :data-bs-target=\"target\"\n :aria-controls=\"id\"\n aria-expanded=\"false\"\n />\n </IconList>\n <ListLabelButton\n class=\"label\"\n :disabled=\"!isVisible || !hasLeafPreloaded\"\n :text=\"group.name\"\n :title=\"`Zoom to ${group.name}`\"\n @click=\"$emit('zoom', group)\"\n />\n <IconList class=\"ms-1\">\n <div v-if=\"hasLeafPreloading\" class=\"icon spinner d-inline-block\">\n <SpinnerControl title=\"Loading...\" />\n </div>\n <IconListButton\n v-if=\"\n hasLeafPreloaded &&\n (group.config.canMaskBasemap || group.config.isMaskingBasemap)\n \"\n title=\"Toggle basemap masking\"\n icon=\"bi-mask\"\n @click=\"$emit('update:toggle-mask', group)\"\n />\n <IconListButton\n v-if=\"hasLeafPreloaded\"\n title=\"Clip to\"\n icon=\"bi-bounding-box\"\n @click=\"$emit('clipTo', group)\"\n />\n <IconListButton\n v-if=\"hasLeafPreloaded\"\n title=\"Toggle 3D grid\"\n icon=\"bi-box\"\n @click=\"$emit('update:toggle-grid', group)\"\n />\n </IconList>\n </div>\n\n <CompactList :id=\"id\" class=\"collapse pb-3\">\n <template v-if=\"group.children.length > 0\">\n <DatasetOrGroupItem\n v-for=\"dataset of group.children\"\n :key=\"dataset.name\"\n :dataset=\"dataset\"\n @zoom=\"ds => $emit('zoom', ds)\"\n @clip-to=\"ds => $emit('clipTo', ds)\"\n @update:toggle-grid=\"ds => $emit('update:toggle-grid', ds)\"\n @update:toggle-mask=\"ds => $emit('update:toggle-mask', ds)\"\n @update:visible=\"(ds, v) => $emit('update:visible', ds, v)\"\n />\n </template>\n <template v-else>\n <li class=\"list-group-item\">No dataset in this group</li>\n </template>\n </CompactList>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Dataset } from '@/types/Dataset';\n\n import Icon from '@/components/atoms/Icon.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import IconListButton from '@/components/atoms/IconListButton.vue';\n import ListLabelButton from '@/components/atoms/ListLabelButton.vue';\n import { datasetIcons, datasetTitles, propertyViews } from '@/components/Configuration';\n import SpinnerControl from '@/components/SpinnerControl.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n import { useDatasetStore } from '@/stores/datasets';\n import { refAndWatch } from '@/utils/Components';\n\n const store = useDatasetStore();\n\n const props = defineProps<{\n dataset: Dataset;\n }>();\n\n defineEmits(['zoom', 'clipTo', 'update:toggle-grid', 'update:toggle-mask', 'update:visible']);\n\n const isPreloading = refAndWatch(props.dataset, 'isPreloading');\n const isPreloaded = refAndWatch(props.dataset, 'isPreloaded');\n const isVisible = refAndWatch(props.dataset, 'visible');\n\n function deleteDataset(): void {\n store.remove(props.dataset);\n }\n</script>\n\n<template>\n <div class=\"d-flex\">\n <IconList class=\"me-1 text-body-tertiary\">\n <Icon\n :icon=\"datasetIcons[dataset.type] ?? 'bi-file-earmark-x'\"\n :title=\"datasetTitles[dataset.type] ?? 'Unknown'\"\n />\n </IconList>\n <VisibilityControl\n :visible=\"isVisible\"\n @update:visible=\"v => $emit('update:visible', dataset, v)\"\n />\n <ListLabelButton\n class=\"label\"\n :disabled=\"!isVisible || !isPreloaded\"\n :text=\"dataset.name\"\n :title=\"`Zoom to ${dataset.name}`\"\n @click=\"$emit('zoom', dataset)\"\n />\n <IconList class=\"ms-1\">\n <div v-if=\"isPreloading\" class=\"icon spinner d-inline-block\">\n <SpinnerControl title=\"Loading...\" />\n </div>\n <IconListButton\n v-if=\"propertyViews.has(dataset.type) && isPreloaded\"\n title=\"Show dataset properties\"\n icon=\"bi-card-list\"\n data-bs-toggle=\"collapse\"\n :data-bs-target=\"`#collapse-${dataset.uuid}`\"\n :aria-controls=\"`collapse-${dataset.uuid}`\"\n aria-expanded=\"false\"\n />\n <IconListButton\n v-if=\"\n isPreloaded &&\n (('canMaskBasemap' in dataset.config && dataset.config.canMaskBasemap) ||\n ('isMaskingBasemap' in dataset.config && dataset.config.isMaskingBasemap))\n \"\n title=\"Toggle basemap masking\"\n icon=\"bi-mask\"\n @click=\"$emit('update:toggle-mask', dataset)\"\n />\n\n <IconListButton\n v-for=\"action in store.getCustomActions(dataset, { isVisible, isPreloaded })\"\n :key=\"action.title\"\n :title=\"action.title\"\n :icon=\"action.icon\"\n @click=\"action.action(dataset)\"\n />\n\n <IconListButton\n v-if=\"isPreloaded\"\n title=\"Toggle 3D grid\"\n icon=\"bi-box\"\n @click=\"$emit('update:toggle-grid', dataset)\"\n />\n <IconListButton title=\"Delete this dataset\" icon=\"bi-trash\" @click=\"deleteDataset\" />\n </IconList>\n </div>\n <!-- Property view -->\n <div\n v-if=\"propertyViews.has(dataset.type)\"\n class=\"collapse m-2\"\n :id=\"`collapse-${dataset.uuid}`\"\n >\n <component :is=\"propertyViews.get(dataset.type)\" :dataset=\"dataset\"></component>\n </div>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { DatasetOrGroup } from '@/types/Dataset';\n\n import DatagroupItem from '@/components/panels/DatagroupItem.vue';\n import DatasetItem from '@/components/panels/DatasetItem.vue';\n import { Datagroup } from '@/types/Dataset';\n\n defineProps<{\n dataset: DatasetOrGroup;\n }>();\n\n defineEmits(['zoom', 'update:toggle-grid', 'update:toggle-mask', 'update:visible']);\n</script>\n\n<template>\n <li class=\"list-group-item\">\n <DatagroupItem\n v-if=\"Datagroup.isGroup(dataset)\"\n :group=\"dataset\"\n @zoom=\"ds => $emit('zoom', ds)\"\n @update:toggle-grid=\"ds => $emit('update:toggle-grid', ds)\"\n @update:toggle-mask=\"ds => $emit('update:toggle-mask', ds)\"\n @update:visible=\"(ds, v) => $emit('update:visible', ds, v)\"\n />\n <DatasetItem\n v-else\n :dataset=\"dataset\"\n @zoom=\"ds => $emit('zoom', ds)\"\n @update:toggle-grid=\"ds => $emit('update:toggle-grid', ds)\"\n @update:toggle-mask=\"ds => $emit('update:toggle-mask', ds)\"\n @update:visible=\"(ds, v) => $emit('update:visible', ds, v)\"\n />\n </li>\n</template>\n","<script setup lang=\"ts\">\n import Icon from '@/components/atoms/Icon.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import IconListButton from '@/components/atoms/IconListButton.vue';\n import ListLabelButton from '@/components/atoms/ListLabelButton.vue';\n import OpacitySlider from '@/components/OpacitySlider.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n\n defineProps<{\n name: string;\n opacity: number;\n visible: boolean;\n }>();\n defineEmits(['update:visible', 'update:opacity', 'update:move-up', 'update:move-down', 'zoom']);\n</script>\n\n<template>\n <li class=\"list-group-item d-flex\">\n <IconList class=\"me-1 text-body-tertiary\">\n <Icon icon=\"fg-contour-map\" title=\"Overlay\" />\n </IconList>\n <VisibilityControl :visible=\"visible\" @update:visible=\"v => $emit('update:visible', v)\" />\n <ListLabelButton\n class=\"label\"\n :disabled=\"!visible\"\n :title=\"`Zoom to ${name}`\"\n :text=\"name\"\n @click=\"$emit('zoom')\"\n />\n\n <OpacitySlider\n class=\"opacity-slider\"\n :class=\"!visible ? 'disabled' : null\"\n :opacity=\"opacity\"\n size=\"small\"\n @update:opacity=\"v => $emit('update:opacity', v)\"\n />\n <IconList class=\"ms-1\">\n <IconListButton title=\"Move up\" icon=\"bi-arrow-up\" @click=\"$emit('update:move-up')\" />\n <IconListButton\n title=\"Move down\"\n icon=\"bi-arrow-down\"\n @click=\"$emit('update:move-down')\"\n />\n </IconList>\n </li>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n }\n\n .opacity-slider {\n min-width: 100px;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { DatasetOrGroup } from '@/types/Dataset';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import CompactList from '@/components/atoms/CompactList.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import SectionCollapsible from '@/components/atoms/SectionCollapsible.vue';\n import BasemapItem from '@/components/panels/BasemapItem.vue';\n import DatasetOrGroupItem from '@/components/panels/DatasetOrGroupItem.vue';\n import OverlayItem from '@/components/panels/OverlayItem.vue';\n import { useCameraStore } from '@/stores/camera';\n import { useDatasetStore } from '@/stores/datasets';\n import { useLayerStore } from '@/stores/layers';\n\n const datasets = useDatasetStore();\n const camera = useCameraStore();\n const layers = useLayerStore();\n\n function importDataset(files: File[]): void {\n for (const file of files) {\n datasets.importFromFile(file);\n }\n }\n\n function importDatasetFromUrl(): void {\n const url = document.getElementById('dataset-import-url') as HTMLInputElement;\n datasets.importFromFile(url.value);\n }\n\n function zoomOnDataset(dataset: DatasetOrGroup): void {\n const box = datasets.getBoundingBox(dataset);\n if (!box?.isEmpty()) {\n camera.lookTopDownAt(box);\n }\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <div class=\"flex-fill overflow-auto\">\n <SectionCollapsible\n title=\"Basemaps\"\n icon-position=\"left\"\n id=\"basemap-list\"\n class=\"border-bottom mb-3\"\n >\n <CompactList id=\"layers-list-group\">\n <BasemapItem\n v-if=\"layers.getGraticuleLayer() !== undefined\"\n type=\"graticule\"\n :opacity=\"1\"\n :name=\"layers.getGraticuleLayer()!.name\"\n :isLoading=\"false\"\n :visible=\"layers.getGraticuleLayer()!.visible\"\n :hasOpacitySlider=\"false\"\n @update:visible=\"v => (layers.getGraticuleLayer()!.visible = v)\"\n />\n\n <BasemapItem\n v-for=\"layer in layers.getBasemaps()\"\n :key=\"layer.name\"\n :type=\"layer.type\"\n :opacity=\"layer.opacity\"\n :name=\"layer.name\"\n :isLoading=\"layer.isLoading\"\n :visible=\"layer.visible\"\n :hasOpacitySlider=\"layer.type === 'color' || layer.type === 'elevation'\"\n @update:visible=\"v => layers.setBasemapVisibility(layer, v)\"\n @update:opacity=\"v => layers.setBasemapOpacity(layer, v)\"\n /> </CompactList\n ></SectionCollapsible>\n <SectionCollapsible\n v-if=\"layers.overlayCount > 0\"\n title=\"Overlays\"\n icon-position=\"left\"\n id=\"overlay-list\"\n class=\"border-bottom mb-3\"\n >\n <CompactList>\n <OverlayItem\n v-for=\"layer in layers.getOverlays()\"\n :key=\"layer.name\"\n :opacity=\"layer.opacity\"\n :name=\"layer.name\"\n :visible=\"layer.visible\"\n @update:visible=\"v => layers.setOverlayVisibility(layer, v)\"\n @update:opacity=\"v => layers.setOverlayOpacity(layer, v)\"\n @update:move-up=\"layers.moveOverlayUp(layer)\"\n @update:move-down=\"layers.moveOverlayDown(layer)\" /></CompactList\n ></SectionCollapsible>\n <SectionCollapsible\n title=\"Datasets\"\n :expanded=\"true\"\n icon-position=\"left\"\n id=\"dataset-list\"\n >\n <CompactList>\n <DatasetOrGroupItem\n v-for=\"dataset of datasets.getTree()\"\n :key=\"dataset.name\"\n :dataset=\"dataset\"\n @updated=\"$forceUpdate()\"\n @zoom=\"ds => zoomOnDataset(ds)\"\n @update:toggle-grid=\"ds => datasets.toggleGrid(ds)\"\n @update:toggle-mask=\"ds => datasets.toggleMask(ds)\"\n @update:visible=\"(ds, v) => datasets.setVisible(ds, v)\"\n />\n </CompactList>\n </SectionCollapsible>\n </div>\n\n <ButtonArea>\n <div class=\"input-group mb-3\">\n <input\n type=\"text\"\n id=\"dataset-import-url\"\n class=\"form-control\"\n placeholder=\"https://\"\n aria-label=\"URL to import\"\n aria-describedby=\"button-dataset-import-url\"\n />\n <button\n @click=\"importDatasetFromUrl\"\n class=\"btn btn-outline-secondary\"\n type=\"button\"\n id=\"button-dataset-import-url\"\n >\n Import URL\n </button>\n </div>\n\n <ImportButton title=\"Import file\" text=\"Import file\" @import=\"importDataset\" />\n </ButtonArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type Measure from '@/types/Measure';\n\n import VisibilityControl from '../VisibilityControl.vue';\n\n defineProps<{\n measure: Measure;\n visible: boolean;\n }>();\n defineEmits(['delete', 'download', 'update:visible', 'zoom']);\n</script>\n\n<template>\n <li class=\"list-group-item item\">\n <div class=\"d-flex\">\n <VisibilityControl\n :visible=\"visible\"\n v-on:update:visible=\"v => $emit('update:visible', v)\"\n />\n\n <a class=\"title\" :title=\"measure.title\" href=\"#\" @click=\"$emit('zoom')\"\n >{{ measure.title }} ({{ measure.object.length.toFixed(2) }}m)</a\n >\n\n <div class=\"icons\">\n <a href=\"#\" class=\"icon\" title=\"Delete\" @click=\"$emit('delete')\">\n <i class=\"bi bi-trash\"></i>\n </a>\n </div>\n </div>\n </li>\n</template>\n\n<style scoped>\n .item {\n padding: 0.1rem;\n }\n\n a {\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n .icons {\n display: flex;\n }\n\n .title {\n white-space: nowrap;\n display: block;\n width: 100% !important;\n margin-left: 1rem;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .icon {\n padding-left: 0.4rem;\n color: rgb(180, 180, 180);\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n</style>\n","import type Named from './Named';\n\ntype MeasurementMode = 'laser';\n\ntype MeasurementNamed = Named & {\n value: MeasurementMode;\n};\n\nexport const measurementModes: MeasurementNamed[] = [\n {\n description:\n 'Will automatically beam perpendicularly to the selected point until a geometry is hit',\n name: 'Laser',\n value: 'laser',\n },\n] as const;\n\nexport default MeasurementMode;\n","<script setup lang=\"ts\">\n import { ref, watch } from 'vue';\n\n import type MeasurementMode from '@/types/MeasurementMode';\n import type Named from '@/types/Named';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import DropdownView from '@/components/DropdownView.vue';\n import EmptyIndicator from '@/components/panels/EmptyIndicator.vue';\n import MeasurementItem from '@/components/panels/MeasurementItem.vue';\n import { useCameraStore } from '@/stores/camera';\n import { useMeasurementStore } from '@/stores/measurement';\n import Measure from '@/types/Measure';\n import { measurementModes } from '@/types/MeasurementMode';\n import Download from '@/utils/Download';\n\n const measures = useMeasurementStore();\n const cameraStore = useCameraStore();\n\n const measurementMode = ref<MeasurementMode>(measures.getMeasurementMode());\n watch(measurementMode, newMode => {\n measures.setMeasurementMode(newMode);\n });\n\n function downloadMeasure(measure: Measure): void {\n const geojson = measure.toGeoJSON();\n Download.downloadAsJson(geojson, `measure-${measure.title}.json`);\n }\n\n function exportMeasures(): void {\n const geojson = Measure.toCollection(measures.getMeasures());\n Download.downloadAsJson(geojson, 'measures.json');\n }\n\n function goTo(measure: Measure): void {\n cameraStore.lookTopDownAt(measure.object);\n }\n\n function importMeasureFile(files: File[]): void {\n measures.importMeasureFiles(files);\n }\n\n function setCurrentMode(src: Named | null): void {\n measurementMode.value = src?.value as MeasurementMode;\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <div class=\"alert alert-warning py-2\" role=\"alert\">\n <i class=\"bi bi-cone-striped\"></i> This feature is experimental\n </div>\n\n <EmptyIndicator text=\"No measurements\" v-if=\"measures.count === 0\" />\n\n <ul class=\"list-group list-group-flush flex-fill overflow-auto\">\n <MeasurementItem\n v-for=\"item in measures.getMeasures()\"\n :key=\"item.title\"\n :measure=\"item\"\n :visible=\"item.visible\"\n v-on:update:visible=\"\n () => {\n item.visible = !item.visible;\n $forceUpdate();\n }\n \"\n v-on:delete=\"measures.remove(item)\"\n v-on:download=\"downloadMeasure(item)\"\n v-on:zoom=\"goTo(item)\"\n />\n </ul>\n\n <ButtonArea id=\"measures-fieldset\">\n <DropdownView\n label=\"Mode\"\n description-position=\"top\"\n :current=\"measurementModes[0]\"\n :items=\"measurementModes\"\n @updated:current=\"src => setCurrentMode(src)\"\n class=\"mb-2\"\n />\n <ButtonWithIcon\n v-if=\"measures.isUserMeasuring()\"\n title=\"Stop measuring\"\n text=\"Stop measuring\"\n icon=\"bi-stop-circle\"\n class=\"btn-primary\"\n @click=\"measures.end()\"\n />\n <ButtonWithIcon\n v-else\n title=\"Start measuring\"\n text=\"Start measuring\"\n icon=\"bi-rulers\"\n class=\"btn-primary\"\n @click=\"measures.start()\"\n />\n <ButtonWithIcon\n title=\"Export measures to GeoJSON\"\n class=\"btn-outline-secondary\"\n @click=\"exportMeasures\"\n icon=\"bi-box-arrow-right\"\n text=\"Export measures\"\n />\n <ImportButton\n title=\"Import measures from GeoJSON\"\n text=\"Import measures\"\n @import=\"importMeasureFile\"\n />\n </ButtonArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { PanelType } from './Configuration';\n\n import getConfigurationPanels from './Configuration';\n import AboutPanel from './panels/AboutPanel.vue';\n import AnalysisPanel from './panels/AnalysisPanel.vue';\n import AnnotationPanel from './panels/AnnotationPanel.vue';\n import BookmarkPanel from './panels/BookmarkPanel.vue';\n import DatasetPanel from './panels/DatasetPanel.vue';\n import MeasurementPanel from './panels/MeasurementPanel.vue';\n\n defineProps<{\n /**\n * The name of the panel (must match the tooltip\n * of the corresponding tool in the toolbar)\n */\n selected: PanelType | null;\n }>();\n\n const panels = getConfigurationPanels();\n const gitCommit = import.meta.env.VITE_GIT_COMMIT;\n</script>\n\n<template>\n <div class=\"panel\" id=\"panel-container\">\n <h5 class=\"title\">\n {{ panels.find(p => p.key === selected)?.title }}\n <span\n v-if=\"selected === 'about'\"\n class=\"badge text-bg-primary rounded-pill float-end\"\n title=\"Version\"\n >Version: {{ gitCommit }}</span\n >\n </h5>\n <div class=\"content\">\n <DatasetPanel v-if=\"selected === 'datasets'\" />\n <AboutPanel v-if=\"selected === 'about'\" />\n <BookmarkPanel v-if=\"selected === 'bookmarks'\" />\n <AnalysisPanel v-if=\"selected === 'analysis'\" />\n <AnnotationPanel v-if=\"selected === 'annotations'\" />\n <MeasurementPanel v-if=\"selected === 'measures'\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n .title {\n margin: 1rem;\n }\n\n .content {\n flex-grow: 1;\n overflow: auto;\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .panel {\n border-color: var(--bs-border-color);\n border-width: 0 2px 0 2px;\n border-style: solid;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps({\n progress: {\n required: true,\n type: Number,\n },\n });\n</script>\n\n<template>\n <div\n class=\"progress\"\n role=\"progressbar\"\n aria-label=\"Progress\"\n :aria-valuenow=\"progress * 100\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div\n v-if=\"progress != 1\"\n class=\"progress-bar progress-bar-striped progress-bar-animated\"\n :style=\"`width: ${progress * 100}%`\"\n ></div>\n </div>\n</template>\n\n<script lang=\"ts\">\n export default {\n methods: {\n tick(): void {\n this.$forceUpdate();\n },\n },\n };\n</script>\n","import { defineStore } from 'pinia';\nimport { shallowRef } from 'vue';\n\nimport type { SearchProvider } from '@/api/SearchApi';\n\nexport const useSearchStore = defineStore('search', () => {\n const providers = shallowRef<SearchProvider[]>([]);\n\n function registerProvider(provider: SearchProvider): void {\n if (!providers.value.includes(provider)) {\n providers.value.push(provider);\n }\n }\n\n function getProviders(): SearchProvider[] {\n return [...providers.value];\n }\n\n return {\n getProviders,\n registerProvider,\n };\n});\n\nexport type SearchStore = ReturnType<typeof useSearchStore>;\n","<script setup lang=\"ts\">\n // @ts-expect-error autocomplete-vue does not provide typing\n import Autocomplete from '@trevoreyre/autocomplete-vue';\n\n import type { SearchResult } from '@/api';\n\n import Icon from '@/components/atoms/Icon.vue';\n import { useSearchStore } from '@/stores/search';\n\n const emits = defineEmits<{\n resultSelected: [value: SearchResult];\n }>();\n\n const store = useSearchStore();\n\n function getResultValue(result: SearchResult): string {\n return result.label;\n }\n\n async function search(query: string): Promise<SearchResult[]> {\n if (query.length < 3) {\n return Promise.resolve([]);\n }\n\n const providers = store.getProviders();\n\n const promises = providers.map(p => p.search(query));\n\n const allResults = await Promise.all(promises);\n\n return allResults.flatMap(x => x);\n }\n\n function submitResult(result: SearchResult): void {\n emits('resultSelected', result);\n }\n</script>\n\n<template>\n <div class=\"main\">\n <autocomplete\n :debounceTime=\"500\"\n :search=\"search\"\n :getResultValue=\"getResultValue\"\n @submit=\"submitResult\"\n id=\"search-place-autocomplete\"\n placeholder=\"Search...\"\n >\n <template #result=\"{ result, props }\">\n <li v-bind=\"props\" class=\"autocomplete-result result\">\n <div class=\"result-label\">\n <span class=\"result-type\"><Icon icon=\"fg-poi\" title=\"Location\" /></span>\n <span>{{ result.label }}</span>\n <p class=\"provider\">{{ result.provider.name }}</p>\n </div>\n <div class=\"wiki-snippet\" :v-html=\"result.snippet\"></div>\n </li>\n </template>\n </autocomplete>\n </div>\n</template>\n\n<style scoped>\n .main {\n padding-top: 0.5rem;\n }\n\n input {\n height: 30pt;\n box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);\n }\n\n .autocomplete {\n width: 100%;\n }\n\n .result {\n border-top: 1px solid #eee;\n padding: 16px;\n background: transparent;\n }\n\n .provider {\n font-size: 12px;\n opacity: 60%;\n margin: 0;\n }\n\n .result:hover {\n background: lightgray;\n }\n\n .result-type {\n padding-left: 5pt;\n padding-right: 6pt;\n }\n\n .result-label {\n font-size: 14px;\n }\n</style>\n","<script setup lang=\"ts\">\n import CoordinateFragment from './CoordinateFragment.vue';\n\n defineProps({\n x: Number,\n y: Number,\n z: Number,\n });\n</script>\n\n<template>\n <div>\n <div class=\"d-flex column-gap-3\">\n <i class=\"bi text-secondary bi-cursor-fill\"></i>\n <CoordinateFragment :value=\"x?.toFixed(0)\" prefix=\"X:\" />\n <CoordinateFragment :value=\"y?.toFixed(0)\" prefix=\"Y:\" />\n <CoordinateFragment :value=\"z?.toFixed(0)\" prefix=\"Alt.:\" suffix=\"m\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n i {\n font-size: small;\n }\n div {\n margin-left: 1rem;\n }\n</style>\n","export default \"data:image/png;base64,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\"","<script setup lang=\"ts\">\n defineProps(['icon', 'tourkey', 'title', 'active']);\n</script>\n\n<template>\n <li class=\"nav-item\">\n <a\n :id=\"`toolbar-${tourkey}`\"\n :class=\"['nav-link', active ? 'active' : null]\"\n href=\"#\"\n :title=\"title\"\n ><i :class=\"['bi', icon]\"></i\n ></a>\n </li>\n</template>\n","<script setup lang=\"ts\">\n import logo from '@/assets/piero_logo_compact.png';\n\n import getConfigurationPanels from '../Configuration';\n import ToolbarButton from './ToolbarButton.vue';\n\n defineProps<{\n active: string | null;\n }>();\n defineEmits(['selected']);\n\n const panels = getConfigurationPanels();\n</script>\n\n<template>\n <div class=\"toolbar\">\n <ul id=\"menu\" class=\"nav nav-pills flex-column\">\n <li class=\"nav-item mt-2\">\n <a href=\"https://giro3d.org\" target=\"_blank\" title=\"Piero, powered by Giro3D\">\n <img :src=\"logo\" alt=\"Piero, powered by Giro3D\" class=\"mb-3 w-100 p-1\" />\n </a>\n </li>\n\n <template v-for=\"panel in panels\">\n <ToolbarButton\n v-if=\"panel.enabled\"\n :active=\"active === panel.key\"\n :key=\"panel.key\"\n :tourkey=\"panel.key\"\n :title=\"panel.title\"\n :icon=\"panel.icon\"\n @click=\"$emit('selected', panel.key)\"\n />\n </template>\n </ul>\n </div>\n</template>\n\n<style scoped>\n li {\n margin: 0.2rem;\n }\n</style>\n","import { defineStore } from 'pinia';\nimport { shallowRef } from 'vue';\n\nimport type { Widget } from '@/api/WidgetApi';\n\nexport const useWidgetStore = defineStore('widgets', () => {\n const widgets = shallowRef<Widget[]>([]);\n\n function addWidget(widget: Widget): void {\n widgets.value.push(widget);\n }\n\n function getWidgets(): Widget[] {\n return [...widgets.value];\n }\n\n return {\n addWidget,\n getWidgets,\n };\n});\n\nexport type WidgetStore = ReturnType<typeof useWidgetStore>;\n","<script setup lang=\"ts\">\n import Extent from '@giro3d/giro3d/core/geographic/Extent';\n import { Vector2, Vector3 } from 'three';\n import { onMounted, onUnmounted, ref, shallowRef } from 'vue';\n\n import type Feature from '@/types/Feature';\n\n import Giro3DManager from '@/services/Giro3DManager';\n import { useAnnotationStore } from '@/stores/annotations';\n import { useCameraStore } from '@/stores/camera';\n import { useGiro3dStore } from '@/stores/giro3d';\n import { useMeasurementStore } from '@/stores/measurement';\n\n import type { PanelType } from './components/Configuration';\n import type { PieroContext } from './context';\n\n import { isLocationSearchResult, type SearchResult } from './api/SearchApi';\n import { ViewApiImpl } from './api/ViewApi';\n import AlertToast from './components/AlertToast.vue';\n import AttributePanel from './components/AttributePanel.vue';\n import LoadingScreen from './components/LoadingScreen.vue';\n import MainView from './components/MainView.vue';\n import NavigationButtons from './components/NavigationButtons.vue';\n import PanelContainer from './components/PanelContainer.vue';\n import ProgressBar from './components/ProgressBar.vue';\n import SearchOverlay from './components/SearchOverlay.vue';\n import StatusBar from './components/StatusBar.vue';\n import ToolBar from './components/toolbar/ToolBar.vue';\n import { GLOBAL_EVENT_DISPATCHER } from './events';\n import { useWidgetStore } from './stores/widgets';\n\n const { getContext } = defineProps<{\n getContext: () => PieroContext;\n }>();\n\n const selectedTool = ref<PanelType | null>('datasets');\n const progress = ref(1);\n const coordinates = ref(new Vector3(0, 0, 0));\n const mouse = new Vector2();\n const pickedFeature = ref<Feature | null>(null);\n const tooltip = ref<string | null>(null);\n const isLoading = ref(false);\n const showLoadingScreen = ref(true);\n let hasMovedDuringFrame = false;\n\n const giro3dStore = useGiro3dStore();\n const cameraStore = useCameraStore();\n const annotationStore = useAnnotationStore();\n const measurementStore = useMeasurementStore();\n const widgetStore = useWidgetStore();\n\n const giro3d = shallowRef<Giro3DManager | null>(null);\n const debounce = ref<NodeJS.Timeout | number | string | undefined>();\n\n onMounted(() => {\n const mainview = giro3dStore.getMainView();\n if (mainview) {\n initializeGiro3DManager();\n }\n\n giro3dStore.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'setMainView':\n if (args[0] === null) {\n disposeGiro3DManager();\n } else {\n initializeGiro3DManager();\n }\n break;\n }\n });\n });\n\n // debouncing costly functions\n debounce.value = setInterval(() => {\n if (hasMovedDuringFrame) {\n updateCoordinates(mouse);\n updateCursor(mouse);\n hasMovedDuringFrame = false;\n }\n }, 50);\n\n if (import.meta.env.PROD) {\n setTimeout(() => {\n showLoadingScreen.value = false;\n }, 1000);\n } else {\n showLoadingScreen.value = false;\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'ready' });\n });\n\n onUnmounted(() => {\n if (debounce.value != null) {\n clearInterval(debounce.value);\n debounce.value = undefined;\n }\n disposeGiro3DManager();\n });\n\n function disposeGiro3DManager(): void {\n giro3d.value?.dispose();\n giro3d.value = null;\n }\n\n function initializeGiro3DManager(): void {\n const mainview = giro3dStore.getMainView();\n if (mainview === null) {\n throw new Error('mainview is null');\n }\n giro3d.value = new Giro3DManager(mainview);\n giro3d.value.addEventListener('update', () => {\n if (giro3d.value) {\n progress.value = giro3d.value.mainInstance.progress;\n isLoading.value = giro3d.value.mainInstance.loading;\n }\n });\n\n getContext().view = new ViewApiImpl({\n camera: giro3d.value.camera,\n instance: giro3d.value.mainInstance,\n sceneCursorManager: giro3d.value.sceneCursorManager,\n });\n }\n\n function onMouseMove(event: MouseEvent): void {\n if (giro3d.value) {\n giro3d.value.mainInstance.eventToCanvasCoords(event, mouse);\n hasMovedDuringFrame = true;\n }\n }\n\n function onSearchResultSelected(result: SearchResult): void {\n if (!giro3d.value) {\n return;\n }\n\n if (isLocationSearchResult(result)) {\n const instance = giro3d.value.mainInstance;\n const poiCoordinates = result.coordinates.as(instance.referenceCrs);\n const target = Extent.fromCenterAndSize(\n poiCoordinates.crs,\n poiCoordinates.toVector2(),\n 1000,\n 1000,\n );\n\n const bbox3 = target.toBox3(poiCoordinates.z, poiCoordinates.z + 200);\n void giro3d.value.camera.lookTopDownAt(bbox3, false);\n }\n }\n\n function pick(event: MouseEvent, clicked?: boolean): void {\n if (giro3d.value == null || giro3d.value.mainInstance == null) {\n return;\n }\n\n if (\n cameraStore.getNavigationMode() === 'position-on-map' ||\n cameraStore.isUserInteracting() ||\n annotationStore.isUserDrawing() ||\n measurementStore.isUserMeasuring()\n ) {\n return;\n }\n\n const picked = giro3d.value.picker.pick(giro3d.value.mainInstance, event);\n\n if (picked?.point != null) {\n const point = picked.point;\n coordinates.value.x = point.x;\n coordinates.value.y = point.y;\n coordinates.value.z = point.z;\n }\n\n if (picked?.feature != null) {\n tooltip.value = picked.feature.name;\n if (clicked != null) {\n pickedFeature.value = picked.feature;\n }\n } else {\n tooltip.value = null;\n if (clicked != null) {\n pickedFeature.value = null;\n }\n }\n\n if (picked?.pickResult != null) {\n giro3d.value.highlighter.highlightFromPick(picked.pickResult);\n } else {\n giro3d.value.highlighter.clear();\n }\n }\n\n function selectPanel(key: PanelType): void {\n if (key === selectedTool.value) {\n selectedTool.value = null;\n } else {\n selectedTool.value = key;\n }\n }\n\n function updateCoordinates(mouse: Vector2): void {\n if (giro3d.value != null) {\n const point = giro3d.value.picker.getMouseCoordinate(giro3d.value.mainInstance, mouse);\n\n if (point) {\n coordinates.value.x = point.x;\n coordinates.value.y = point.y;\n coordinates.value.z = point.z;\n }\n }\n }\n\n function updateCursor(mouse: Vector2): void {\n if (giro3d.value) {\n if (\n cameraStore.getNavigationMode() === 'position-on-map' ||\n cameraStore.getNavigationMode() === 'orbit' ||\n annotationStore.isUserDrawing() ||\n measurementStore.isUserMeasuring()\n ) {\n return;\n }\n const picked = giro3d.value.picker.hasFeature(giro3d.value.mainInstance, mouse);\n giro3d.value.mainInstance.domElement.style.cursor = picked ? 'pointer' : 'auto';\n }\n }\n</script>\n\n<template>\n <LoadingScreen v-if=\"showLoadingScreen\" />\n <MainView\n id=\"main-view\"\n @click=\"(evt: MouseEvent) => pick(evt, true)\"\n @mousemove=\"onMouseMove\"\n class=\"mainview\"\n />\n <AttributePanel\n v-if=\"pickedFeature != null\"\n @close=\"pickedFeature = null\"\n :attributes=\"pickedFeature.attributes\"\n :name=\"pickedFeature.name\"\n :parent=\"pickedFeature.parent\"\n :point=\"pickedFeature.point\"\n class=\"component attribute-panel\"\n />\n <StatusBar\n class=\"component statusbar\"\n :x=\"coordinates.x\"\n :y=\"coordinates.y\"\n :z=\"coordinates.z\"\n />\n <ToolBar\n id=\"toolbar\"\n :active=\"selectedTool\"\n class=\"component toolbar\"\n v-on:selected=\"v => selectPanel(v)\"\n />\n <PanelContainer v-if=\"selectedTool != null\" class=\"component panel\" :selected=\"selectedTool\" />\n <ProgressBar :progress=\"progress\" class=\"loading-indicator\" />\n <SearchOverlay id=\"address-search\" class=\"search\" @result-selected=\"onSearchResultSelected\" />\n <NavigationButtons class=\"navigation-buttons\" />\n <AlertToast />\n\n <div\n v-for=\"(widget, index) in widgetStore.getWidgets()\"\n :key=\"index\"\n :id=\"`widget-${widget.id}`\"\n >\n <component :context=\"getContext()\" :is=\"widget.component\"></component>\n </div>\n</template>\n\n<style scoped>\n .component {\n background-color: var(--bs-body-bg);\n }\n\n .navigation-buttons {\n position: absolute;\n right: 0;\n bottom: 0;\n margin-bottom: 2rem;\n }\n\n .attribute-panel {\n position: absolute;\n box-shadow: -1px -1px 5px rgba(0, 0, 0, 0.5);\n border-style: sol;\n right: 0;\n bottom: 0;\n width: 370px;\n max-height: 60%;\n margin-right: 1rem;\n margin-bottom: 5rem;\n }\n\n .statusbar {\n padding: 0.2rem;\n text-align: center;\n border-top-left-radius: 0.5rem;\n box-shadow: -1px -1px 5px rgba(0, 0, 0, 0.1);\n height: 1.5rem;\n position: absolute;\n bottom: 0;\n right: 0;\n }\n\n .search {\n position: absolute;\n top: 0;\n left: calc(50% - 20rem / 2);\n width: 25rem;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 3px;\n z-index: 1;\n background-color: transparent;\n }\n\n .panel {\n position: absolute;\n height: 100vh;\n left: 3.5rem;\n width: 27rem;\n z-index: 1;\n }\n\n .mainview {\n position: absolute;\n /* background-color: cadetblue; */\n height: 100vh;\n left: 3.5rem;\n width: calc(100% - 3.5rem);\n z-index: 0;\n }\n\n .toolbar {\n width: 3.5rem;\n height: 100vh;\n position: absolute;\n /* background-color: rgb(250, 250, 250); */\n top: 0;\n left: 0;\n }\n</style>\n","import { createPinia } from 'pinia';\nimport { createApp } from 'vue';\n\nimport type { PieroContext } from './context';\nimport type { Module } from './module';\nimport type { Configuration } from './types/Configuration';\n\nimport './assets/main.scss';\nimport type { DynamicStyleCollection } from './types/VectorStyle';\n\nimport { AnalysisApiImpl } from './api/AnalysisApi';\nimport { BookmarkApiImpl } from './api/BookmarkApi';\nimport { DatasetApiImpl } from './api/DatasetApi';\nimport { NotificationApiImpl } from './api/NotificationApi';\nimport { SearchApiImpl } from './api/SearchApi';\nimport { WidgetApiImpl } from './api/WidgetApi';\nimport App from './App.vue';\nimport { loadRemoteConfiguration, setConfiguration, setDynamicStyles } from './config-loader';\nimport { GLOBAL_EVENT_DISPATCHER } from './events';\nimport { useAnalysisStore } from './stores/analysis';\nimport { useBookmarkStore } from './stores/bookmarks';\nimport { useDatasetStore } from './stores/datasets';\nimport { useModuleStore } from './stores/modules';\nimport { useNotificationStore } from './stores/notifications';\nimport { useSearchStore } from './stores/search';\nimport { useWidgetStore } from './stores/widgets';\nimport Download from './utils/Download';\n\nasync function resolveConfiguration(params: AppParameters): Promise<Configuration> {\n let configuration: Configuration;\n\n if (typeof params.configuration === 'string') {\n console.info(`Loading remote configuration from: ${params.configuration}`);\n const remoteConfiguration = await loadRemoteConfiguration(params.configuration);\n console.info('Remote configuration successfuly loaded.');\n configuration = remoteConfiguration;\n } else {\n configuration = params.configuration;\n }\n\n return configuration;\n}\n\nexport type AppParameters = {\n /**\n * The base URL of the application. This is used to resolve relative URLs.\n * @example 'http://localhost:8080/' or 'https://mydomain.com/myapp/'\n */\n baseUrl: string;\n /**\n * The static configuration to use, or the URL to a remote configuration.\n */\n configuration: Configuration | string;\n /**\n * Where to attach the piero root element.\n */\n container: Element | string;\n\n /**\n * Optional style functions to use.\n */\n dynamicStyles?: DynamicStyleCollection;\n\n /**\n * The list of modules to load.\n * @defaultValue []\n */\n modules?: Module[];\n};\n\n/**\n * Entry point for a Piero application.\n */\nexport default async function createPieroApp(params: AppParameters): Promise<void> {\n const configuration = await resolveConfiguration(params);\n await setConfiguration(configuration);\n\n console.info('Configuration loaded.');\n\n if (params.dynamicStyles) {\n setDynamicStyles(params.dynamicStyles);\n }\n\n Download.setBaseUrl(params.baseUrl);\n\n // We define the Pinia store in advance because we will have\n // to inject it into APIs.\n const pinia = createPinia();\n\n const moduleStore = useModuleStore(pinia);\n moduleStore.setLoadedModules(params.modules ?? []);\n\n const analysisStore = useAnalysisStore(pinia);\n\n // Here we create a context that will be used by modules\n // to interact with the Piero application, without having\n // to import individual services.\n const context: Partial<PieroContext> = {\n analysis: new AnalysisApiImpl(analysisStore),\n baseURL: new URL(Download.getBaseUrl()),\n bookmarks: new BookmarkApiImpl(useBookmarkStore(pinia)),\n configuration,\n datasets: new DatasetApiImpl(useDatasetStore(pinia)),\n events: GLOBAL_EVENT_DISPATCHER,\n notifications: new NotificationApiImpl(useNotificationStore(pinia)),\n search: new SearchApiImpl(useSearchStore(pinia)),\n widgets: new WidgetApiImpl(useWidgetStore(pinia)),\n };\n\n const readyContext = context as PieroContext;\n\n const moduleInitializations: Promise<void>[] = [];\n\n // Now we can register the modules.\n if (params.modules) {\n for (const module of params.modules) {\n const init = Promise.resolve(module.initialize(readyContext));\n moduleInitializations.push(init);\n console.info(`Module ${module.name} initialized.`);\n }\n }\n\n await Promise.all(moduleInitializations);\n\n // Mount the Piero root component in the provided element.\n const app = createApp(App, { getContext: () => context });\n app.use(pinia);\n app.mount(params.container);\n}\n"],"names":["AnalysisApiImpl","store","params","BookmarkApiImpl","__publicField","bookmarks","bookmark","panels","getPanels","hasExperimentalFeature","propertyViews","datasetIcons","datasetTitles","FeatureCollectionEntity","FeatureCollection","options","crs","filename","vectorSource","VectorSource","GeoJSON","tile","createXYZ","bbox","extent","Extent","extrusionOffset","feature","style","properties","fillColor","Color","parentOptions","fillObject3DUserData","build","context","cfg","entity","CSVPointCloudSource","PointCloudSourceBase","OperationCounter","attribute","Float32BufferAttribute","raw","load","CSVLoader","Fetcher","posArray","zArray","volume","Box3","localVolume","point","Vector3","origin","i","x","y","z","localX","localY","localZ","pointCount","node","PointCloudEntity","PointCloud","config","getConfig","getColorMap","opts","dataset","source","COPCSource","getPublicFolderUrl","begin","end","buf","LASSource","d","Tiles3dEntity","Tiles3D","parameters","TiledPointCloudEntity","MODE","tmpCoords","Coordinates","alticode","lngs","lats","promises","chunkLng","chunkLat","alticodeBatch","IgnProvider","coordinates","lng","lat","c","value","IgnAlticoder","mapAlticoderGenerator","instance","map","o","coords","res","a","b","alticoders","noDataValue","missingCoordinates","coder","alticoderGenerator","fast","globals","defs","PJD_3PARAM","PJD_7PARAM","PJD_GRIDSHIFT","PJD_WGS84","PJD_NODATUM","SRS_WGS84_SEMIMAJOR","SRS_WGS84_SEMIMINOR","SRS_WGS84_ESQUARED","SEC_TO_RAD","HALF_PI","SIXTH","RA4","RA6","EPSLN","D2R","R2D","FORTPI","TWO_PI","SPI","exports","units","ignoredChar","match","obj","key","keys","lkey","testkey","processedKey","projStr","defData","self","paramObj","v","p","split","paramName","paramVal","paramOutname","unit","pm","PrimeMeridian","legalAxis","PROJJSONBuilderBase","idNode","child","type","name","conversionFactor","id","direction","abbreviationMatch","abbreviation","orderNode","order","unitNode","axis","result","csNode","lengthUnitNode","datumOrEnsembleNode","datumOrEnsemble","primem","member","accuracyNode","ellipsoidNode","param","sourceCrsNode","sourceCrsContent","targetCrsNode","targetCrsContent","transformationNode","scaleDifference","PROJJSONBuilder2015","PROJJSONBuilder2019","usageNode","scope","area","detectWKT2Version","root","buildPROJJSON","detectWKTVersion","wkt","normalizedWKT","NEUTRAL","KEYWORD","NUMBER","QUOTED","AFTERQUOTE","ENDED","whitespace","latin","keyword","endThings","digets","Parser","text","char","newObjects","parseString","txt","parser","mapit","thing","out","newObj","item","sExpr","d2r","input","applyProjectionDefaults","normalizedProjName","processUnit","toValue","valueOrObject","calculateEllipsoid","transformPROJJSON","projjson","to_meter","paramValue","knownTypes","rename","outName","inName","cleanWKT","ii","setPropertiesFromWkt","authority","axisOrder","geogcs","toMeter","ratio","renamer","list","version","lisp","that","def","parseProj","testObj","code","testDef","codeWords","testWKT","word","codes","checkMercator","auth","checkProjStr","ext","testProj","parse","maybeProjStr","extend","destination","property","msfnz","eccent","sinphi","cosphi","con","sign","adjust_lon","tsfnz","phi","com","phi2z","ts","eccnth","dphi","init","forward","lon","inverse","names","merc","identity","pt","longlat","projs","projStore","add","proj","len","n","get","start","projections","WGS84","eccentricity","rf","R_A","a2","b2","es","e","ep2","sphere","ellps","ellipse","Ellipsoid","datum","datumCode","datum_params","nadgrids","loadedNadgrids","nadgrid","data","view","isLittleEndian","detectLittleEndian","header","readHeader","subgrids","readSubgrids","getNadgrids","grids","parseNadgridString","optional","secondsToRadians","seconds","nFields","decodeString","gridOffset","subHeader","readGridHeader","nodes","readGridNodes","lngColumnCount","latColumnCount","mapNodes","r","offset","gridHeader","nodesOffset","gridRecordLength","gridShiftRecords","record","Projection","srsCode","callback","error","json","parseCode","ourProj","datumDef","Datum","sphere_","dc_sphere","ecc","dc_eccentricity","datumObj","compareDatums","dest","geodeticToGeocentric","Longitude","Latitude","Height","Rn","Sin_Lat","Sin2_Lat","Cos_Lat","geocentricToGeodetic","genau","genau2","maxiter","P","RR","CT","ST","RX","RK","RN","CPHI0","SPHI0","CPHI","SPHI","SDPHI","iter","X","Y","Z","geocentricToWgs84","datum_type","Dx_BF","Dy_BF","Dz_BF","Rx_BF","Ry_BF","Rz_BF","M_BF","geocentricFromWgs84","x_tmp","y_tmp","z_tmp","checkParams","datum_transform","source_a","source_es","gridShiftCode","applyGridShift","dest_a","dest_b","dest_es","destGridShiftResult","output","attemptedGrids","grid","subgrid","epsilon","minX","minY","maxX","maxY","applySubgridShift","pin","ct","val","tb","t","nadInterpolate","tol","dif","del","indx","frct","inx","f00","f10","f11","f01","m11","m10","m00","m01","adjust_axis","denorm","xin","yin","zin","common","array","checkSanity","checkCoord","num","checkNotWGS","transform","enforceAxis","wgs84","toPoint","hasZ","transformer","from","to","transformedArray","checkProj","proj4","fromProj","toProj","coord","single","NUM_100K_SETS","SET_ORIGIN_COLUMN_LETTERS","SET_ORIGIN_ROW_LETTERS","A","I","O","V","mgrs","ll","accuracy","encode","LLtoUTM","UTMtoLL","decode","degToRad","deg","radToDeg","rad","Lat","Long","eccSquared","k0","LongOrigin","eccPrimeSquared","N","T","C","M","LatRad","LongRad","LongOriginRad","ZoneNumber","UTMEasting","UTMNorthing","getLetterDesignator","utm","zoneLetter","zoneNumber","e1","N1","T1","C1","R1","D","mu","phi1Rad","topRight","LetterDesignator","seasting","snorthing","get100kID","easting","northing","setParm","get100kSetForZone","setColumn","setRow","getLetter100kID","column","row","parm","index","colOrigin","rowOrigin","colInt","rowInt","rollover","twoLetter","mgrsString","length","hunK","sb","testChar","set","east100k","getEastingFromChar","north100k","getNorthingFromChar","getMinNorthing","remainder","sep","sepEasting","sepNorthing","accuracyBonus","sepEastingString","sepNorthingString","curCol","eastingValue","rewindMarker","curRow","northingValue","Point","mgrsStr","C00","C02","C04","C06","C08","C22","C44","C46","C48","C66","C68","C88","pj_enfn","en","pj_mlfn","sphi","cphi","MAX_ITER","pj_inv_mlfn","arg","k","s","delta_lon","sin_phi","cos_phi","al","als","cs","tq","ml","tan_phi","ds","f","g","temp","h","tmerc","sinh","hypot","log1py","asinhy","gatg","pp","B","cos_2B","h1","h2","clens","arg_r","hr1","hr2","hr","cosh","clens_cmplx","arg_i","sin_arg_r","cos_arg_r","sinh_arg_i","cosh_arg_i","j","hi1","hi","hi2","np","Ce","Cn","sin_Cn","cos_Cn","sin_Ce","cos_Ce","tmp","etmerc","adjust_zone","zone","dependsOn","srat","esinp","exp","DEL_TOL","gauss","sinc","cosc","cosl","rho","sterea","ssfn_","phit","eccen","sinlat","coslat","sinX","cosX","rh","dlon","ce","Chi","stere","phy0","sinPhy0","semiMajorAxis","invF","flattening","e2","k1","k2","k3","Sa1","Sa2","S","rotI","rotB","lambda","phy","prevPhy","iteration","somerc","TOL","isTypeA","typeAProjections","projectionName","cosph0","F","H","L","sinph0","J","gamma","gamma0","lamc","lam1","lam2","phi1","phi2","alpha_c","alp","gam","one_es","U","W","u","Qp","Sp","Tp","Vp","Up","omerc","sin1","cos1","ms1","ts1","sin2","cos2","ms2","ts2","ts0","rh1","theta","lcc","gfi","deltav","eps","ro","fi1","ok","krovak","mlfn","e0","e3","e0fn","e1fn","e2fn","e3fn","gN","adjust_lat","imlfn","lam","nl","tl","asq","cl","dd","ml1","nl1","rl1","tl1","dl","dsq","cass","qsfnz","S_POLE","N_POLE","EQUIT","OBLIQ","authset","coslam","sinlam","q","sinb","cosb","cCe","sCe","ab","cosz","sinz","authlat","P00","P01","P02","P10","P11","P20","APA","beta","laea","asinz","qs","phi1z","eccnts","aea","coslon","ksp","gnom","iqsfnz","cea","dlat","eqc","el","bl","tanphi","mln","mlnp","ma","poly","delta_lat","d_phi","d_lambda","d_phi_n","d_psi","th_re","th_im","th_n_re","th_n_im","th_n_re1","th_n_im1","z_re","z_im","delta_x","delta_y","z_n_re","z_n_im","z_n_re1","z_n_im1","num_re","num_im","den_re","den_im","den2","d_psi_n","nzmg","mill","sinu","delta_theta","moll","eqdc","sinth","costh","gsq","m","msq","xx","yy","xys","c1","c2","c3","a1","m1","th1","vandg","Mlp","Ml","Nl1","Nl","psi","Az","G","GH","Hs","kp","cos_c","s2","s3","s4","s5","cosAz","Ee","sinpsi","aeqd","ortho","FACE_ENUM","AREA_ENUM","xy","sinlon","qsc_shift_lon_origin","qsc_fwd_equat_face_theta","lp","nu","cosmu","tannu","tantheta","invert_sign","xa","slon","qsc","COEFS_X","COEFS_Y","FXC","FYC","RC1","NODES","poly3_val","coefs","poly3_der","newton_rapshon","f_df","max_err","iters","upd","robin","geocent","mode","omega","yt","ba","bm","bq","tpers","rone_es","v_x","v_y","v_z","det","v_zp","geos","includedProjections","Proj","loadProjCrsIfNeeded","projection","epsgCode","regexes","regex","search","epsgString","Instance","Projections","fetchZCoordinates","features","featureProjection","alticoder","clock","Clock","giroCoordinates","giroCoordinatesByFeature","geom","geomType","featureCoordinates","stride","fillZCoordinates","altitude","readFeatures","format","dataProjection","projIn","readSimpleFeatures","toSimpleFeatures","toMeshes","olFeatures","polygonOptions","Group","converter","GeometryConverter","meshes","geometry","mesh","_a","OLFeatures","geojsonFormat","GeoJSONFormat","gpxFormat","GPXFormat","kmlFormat","KMLFormat","defaultParameters","GeoJsonMeshSource","toGeoJSONFeatures","geojsonToOlFeatures","OlMeshSource","toOlFeatures","GpxMeshSource","KmlMeshSource","simpleFeatures","fetchElevationFast","fetchElevationOffset","olFeaturestoGroup","defaultElevation","elevation","VectorMeshEntity","Entity3D","sources","group","DEFAULT_SURFACE_COLOR","DEFAULT_LINE_COLOR","fetchGeopackage","url","GeoPackageGLLoader","table","GeopackageSource","fetchShapefile","ShapefileGLLoader","ShapefileSource","CSS2DObject","Object3D","element","Vector2","object","recursive","Matrix4","tmpNDC","thisColor","DEFAULT_SHAPE_COLOR","sRGB","sRgb","contrastColor","getContrastColor","DEFAULT_FONT_SIZE","DEFAULT_FONT_WEIGHT","tmpIntersectList","VectorLabelsEntity","pts","l","_options","normalized","raycaster","Raycaster","pickedLabel","cssOpacity","label","getPoint","olFeature","labels","at","container","span","innerContainer","intersects","MathUtils","padding","VectorShapeEntity","Shape","SHAPE_POINT_RADIUS","sourcesConfig","rendering","sourceConfig","commonOptions","builders","featureCollection.build","flatPointCloud.build","tiledPointCloud.build","tiledIfc.build","vector.build","getEntity","builder","registerEntityBuilder","datasetType","EntityBuilder","loadOverlay","fileType","loadMesh","loaders","csv.load","vector.load","las.load","getLoaderContext","fileOrUrl","absoluteUrl","extension","importFile","loader","selectLoader","datasetConfig","Dataset","registerLoader","fileExtension","customHighlighters","Highlighter","pick","isShapePickResult","highlighter","clearHighlight","shape","previousColor","DatasetApiImpl","customAttributeExtractors","NotificationApiImpl","notification","SearchApiImpl","searchStore","provider","isLocationSearchResult","WidgetApiImpl","widget","GLOBAL_EVENT_DISPATCHER","EventDispatcher","useAnnotationStore","defineStore","annotations","reactive","annotationMode","ref","count","computed","_isUserDrawing","_showLabels","isUserDrawing","showLabels","setShowLabels","setIsUserDrawing","getAnnotationMode","setAnnotationMode","getAnnotations","remove","annotation","createPoint","createLine","createPolygon","hasAnnotation","edit","stopEdition","importAnnotationFile","file","importAnnotationsFiles","files","useNotificationStore","push","Annotation","title","Download","geojson","Notification","level","getMinMaxAltitudes","coordsOrDrawing","min","max","points","Measure$1","promptTitle","defaultValue","numberFormat","areaFormatter","values","tmpStart","tmpEnd","lengthFormatter","camera","ndcStart","ndcEnd","sqLimit","pointFormatter","AnnotationManager","picker","DrawTool","after","args","defaultName","userData","Measure","drawFn","EDIT_SHAPE_COLOR","results","edition","skipNames","existingAnnotations","nbImported","nbSkipped","nbTotalImported","nbTotalSkipped","errors","reason","str","limitRemovePointHook","inhibitHook","afterRemovePointOfRing","afterUpdatePointOfRing","event","isMapPickResult","restoreShape","show","MOUSE_BUTTON","ACTION","DOLLY_DIRECTION","isPerspectiveCamera","isOrthographicCamera","PI_2","PI_HALF","EPSILON","DEG2RAD","clamp","approxZero","number","approxEquals","roundToStep","step","infinityToMaxNumber","maxNumberToInfinity","smoothDamp","current","target","currentVelocityRef","smoothTime","maxSpeed","deltaTime","change","originalTo","maxChange","smoothDampVec3","targetX","targetY","targetZ","changeX","changeY","changeZ","originalToX","originalToY","originalToZ","maxChangeSq","magnitudeSq","magnitude","tempX","tempY","tempZ","origMinusCurrentX","origMinusCurrentY","origMinusCurrentZ","outMinusOrigX","outMinusOrigY","outMinusOrigZ","extractClientCoordFromEvent","pointers","pointer","notSupportedInOrthographicCamera","message","listener","listeners","listenerArray","VERSION","TOUCH_DOLLY_FACTOR","isMac","THREE","_ORIGIN","_AXIS_Y","_AXIS_Z","_v2","_v3A","_v3B","_v3C","_cameraDirection","_xColumn","_yColumn","_zColumn","_deltaTarget","_deltaOffset","_sphericalA","_sphericalB","_box3A","_box3B","_sphere","_quaternionA","_quaternionB","_rotationMatrix","_raycaster","CameraControls","libs","_","domElement","deltaX","deltaY","dragToOffset","screenSpacePanning","truckX","pedestalY","fov","targetDistance","delta","dollyScale","lastDistance","distance","clampedDistance","overflowedDistance","zoomScale","lastZoom","zoom","dragStartPosition","lastDragPosition","dollyStart","onPointerDown","elRect","left","top","mouseButton","zombiePointer","onPointerMove","onPointerUp","startDragging","pointerId","dragging","endDragging","lastScrollTimeStamp","onMouseWheel","now","deltaYFactor","onContextMenu","dx","dy","lockedPointer","dollyX","dollyY","dollyDirection","dollyDelta","onPointerLockChange","onPointerLockError","_b","_c","enabled","azimuthAngle","polarAngle","boundaryEnclosesCamera","interactiveArea","enableTransition","resolveImmediately","lastRadius","maxDistanceByCollisionTest","isCollided","zoomStep","height","position","box3OrObject","cover","paddingLeft","paddingRight","paddingBottom","paddingTop","aabb","normal","rotation","viewFromPolar","bb","bbSize","center","width","sphereOrMesh","boundingSphere","distanceToFit","diameter","positionX","positionY","positionZ","positionAX","positionAY","positionAZ","targetAX","targetAY","targetAZ","positionBX","positionBY","positionBZ","targetBX","targetBY","targetBZ","targetA","positionA","targetB","positionB","deltaTheta","deltaPhi","deltaRadius","pos","promise","cameraToPoint","box3","viewportOrX","depth","boundingRectAspect","aspect","radius","vFOV","hFOV","receiveEndValue","cameraDirection","side","deltaTarget","deltaOffset","deltaZoom","dollyControlAmount","planeX","planeY","worldToScreen","lerpRatio","cursor","newTargetEnd","isMin","isMax","dollyAmount","targetEndDiff","worldCursorPosition","quaternion","prevPlaneConstant","newPlaneConstant","pullBack","maxDistance","updated","activePointer","friction","offsetLength2","newTarget","deltaClampedTarget","deltaClampedTargetLength2","offsetFactor","near","heightHalf","widthHalf","zoomInv","right","bottom","rayDirection","nearPlaneCorner","rect","resolve","onResolve","_domElement","object3d","maxRadiusSq","CameraPosition","focalOffset","CameraControlsInspector","Panel","gui","cameraController","Quaternion","Sphere","Spherical","Vector4","tmpVec3","CameraController","cursorManager","useGiro3dStore","useCameraStore","inspector","controls","cameraPosition","lookAt","size","newCameraPosition","entity3d","entityBbox","picked","newPosition","cursorLocation","navigationMode","forwardDirection","truckDirectionX","truckDirectionY","factor","datasetSupportsOverlay","isObject","datasetSupportsMeshes","DatasetManager","layerManager","useDatasetStore","box","AxisGrid","Feature","Polygon","mask","MaskLayer","Giro3dVectorSource","Style","Fill","MaskMode","maps","isMap","layer","_dataset","newVisibility","Datagroup","LayerBuilder","MeasureTool","isShape","Measure3D","useMeasurementStore","measurements","measurementMode","_isUserMeasuring","isUserMeasuring","setIsUserMeasuring","getMeasurementMode","setMeasurementMode","getMeasures","measure","hasMeasure","importMeasureFile","importMeasureFiles","measures","MeasurementManager","existingMeasures","measurement","createSceneCursor","className","icon","SceneCursorManager","newCursor","worldPosition","Giro3DManager","Picker","LayerManager","lightColor","AmbientLight","DirectionalLight","bbox2","ViewApiImpl","entities","isEntity3D","entityBox","alertToast","showNotification","notif","bootstrap","getIcon","getStyle","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_3","_toDisplayString","hexString","__props","_createTextVNode","props","_Fragment","_hoisted_5","_hoisted_6","_hoisted_8","_hoisted_9","styles","attrName","_unref","_hoisted_2","_hoisted_4","subitem","_createBlock","_component_AttributeItem","isLink","LinkFragment","isColor","ColorFragment","isVector3","_createVNode","CoordinateFragment","_hoisted_7","children","_renderList","AttributeItem","copied","copyText","parent","$emit","attributes","AttributeGroup","_normalizeClass","logo$1","_cache","logo","mainView","inspectorView","shallowRef","onMounted","onUnmounted","notificationStore","watch","newMode","description","onPositionOnMapToggle","SwitchToggle","bpi","france2030","franceRelance","oslandia","ueNext","dependencies","define_import_meta_env_VITE_DEPENDENCIES_default","modules","useModuleStore","_hoisted_11","_hoisted_12","_hoisted_13","info","_hoisted_16","_hoisted_17","module","_lut","generateUUID","d0","d1","d2","d3","useAnalysisStore","_tools","registerTool","tool","getTools","_renderSlot","_ctx","analysis","ToolWrapper","_resolveDynamicComponent","emits","__emit","hover","hiddenInput","importFiles","importFromFile","onDragEnter","onDragLeave","onDragOver","onDrop","ButtonWithIcon","$event","currentSelection","setCurrent","descriptionPosition","items","visible","isEditing","onIsEditingChanged","VisibilityControl","EmptyIndicator","annotationModes","cameraStore","downloadAnnotation","exportAnnotations","goTo","setCurrentMode","src","AnnotationItem","$forceUpdate","ButtonArea","DropdownView","ImportButton","copyToClipboard","Bookmark","urlString","base","cam","buildInitialList","conf","fo","useBookmarkStore","clear","getBookmarks","showShareModal","shareUrl","modalTitle","bookmarkStore","addBookmark","exportBookmarks","importBookmarkFile","importBookmarks","serializedBookmarks","existingBookmarks","shareBookmark","shareCurrentView","BookmarkItem","ModalOverlay","ShareBookmarkModal","emit","collapsible","expanded","iconPosition","$attrs","opacity","icons","iconTitles","IconList","Icon","ListLabel","hasOpacitySlider","OpacitySlider","leafs","hasLeafPreloading","hasLeafPreloaded","isVisible","newValues","IconListButton","ListLabelButton","SpinnerControl","CompactList","DatasetOrGroupItem","isPreloading","refAndWatch","isPreloaded","deleteDataset","action","DatagroupItem","DatasetItem","datasets","layers","useLayerStore","importDataset","importDatasetFromUrl","zoomOnDataset","SectionCollapsible","BasemapItem","OverlayItem","measurementModes","downloadMeasure","exportMeasures","MeasurementItem","getConfigurationPanels","gitCommit","selected","DatasetPanel","AboutPanel","BookmarkPanel","AnalysisPanel","AnnotationPanel","MeasurementPanel","__default__","useSearchStore","providers","registerProvider","getProviders","getResultValue","query","submitResult","Autocomplete","_withCtx","_mergeProps","panel","ToolbarButton","active","useWidgetStore","widgets","addWidget","getWidgets","selectedTool","progress","mouse","pickedFeature","tooltip","isLoading","showLoadingScreen","hasMovedDuringFrame","giro3dStore","annotationStore","measurementStore","widgetStore","giro3d","debounce","initializeGiro3DManager","disposeGiro3DManager","updateCoordinates","updateCursor","mainview","onMouseMove","onSearchResultSelected","poiCoordinates","bbox3","clicked","selectPanel","LoadingScreen","MainView","evt","AttributePanel","StatusBar","ToolBar","PanelContainer","ProgressBar","SearchOverlay","NavigationButtons","AlertToast","getContext","resolveConfiguration","configuration","remoteConfiguration","loadRemoteConfiguration","createPieroApp","setConfiguration","setDynamicStyles","pinia","createPinia","analysisStore","readyContext","moduleInitializations","app","createApp","App"],"mappings":"q1EAUO,MAAMA,EAAuC,CACzC,YAA6BC,EAAsB,CAAtB,KAAA,MAAAA,CAAuB,CAEpD,aAAaC,EAA8C,CAC9D,KAAK,MAAM,aAAaA,CAAM,CAClC,CACJ,CCZO,MAAMC,EAAuC,CAGzC,YAAYF,EAAsB,CAFxBG,EAAA,eAGb,KAAK,OAASH,CAClB,CAEO,gBAAuB,CAC1B,KAAK,OAAO,MAAA,CAChB,CAEO,cAA2B,CAC9B,OAAO,KAAK,OAAO,aAAA,CACvB,CAEO,aAAaI,EAA6B,CAC7C,KAAK,OAAO,MAAA,EACZ,UAAWC,KAAYD,EACnB,KAAK,OAAO,IAAIC,CAAQ,CAEhC,CACJ,CCNA,IAAIC,GAA4B,KAIhC,SAAwBC,IAAqC,CACzD,OAAKD,KACDA,GAAS,CACL,CAAE,QAAS,GAAM,KAAM,cAAe,IAAK,WAAY,MAAO,UAAA,EAC9D,CAAE,QAAS,GAAM,KAAM,gBAAiB,IAAK,cAAe,MAAO,aAAA,EACnE,CACI,QAASE,EAAAA,uBAAuB,cAAc,EAC9C,KAAM,YACN,IAAK,WACL,MAAO,cAAA,EAEX,CAAE,QAAS,GAAM,KAAM,cAAe,IAAK,WAAY,MAAO,UAAA,EAC9D,CAAE,QAAS,GAAM,KAAM,eAAgB,IAAK,YAAa,MAAO,WAAA,EAChE,CAAE,QAAS,GAAM,KAAM,iBAAkB,IAAK,QAAS,MAAO,aAAA,CAAc,GAG7EF,EACX,CAEO,MAAMG,OAAiD,IAEjDC,GAA4C,CACrD,WAAY,mBACZ,eAAgB,iBAChB,kBAAmB,eACnB,UAAW,aACX,WAAY,gBACZ,SAAU,cACV,OAAQ,eACZ,EAEaC,GAA6C,CACtD,WAAY,cACZ,eAAgB,kBAChB,kBAAmB,qBACnB,UAAW,aACX,WAAY,cACZ,SAAU,MACV,OAAQ,QACZ,ECGO,MAAMC,WAAgCC,EAAkB,CACpD,YAAYC,EAAyC,CACxD,MAAMC,EAAMD,EAAQ,kBAEpB,IAAIE,EACJ,OAAQF,EAAQ,OAAA,CACZ,IAAK,SACDE,EAAW,qBACX,MACJ,QAGI,OADgCF,EAAQ,MAE5C,CAGJ,MAAMG,EAAe,IAAIC,GAAa,CAClC,OAAQ,IAAIC,GAAAA,QACZ,SAAUC,GAAAA,KAAKC,GAAAA,UAAU,CAAE,SAAU,GAAA,CAAK,CAAC,EAC3C,IAAK,SAAaC,EAAc,CAC5B,MAAO,GACH,gJAMYP,CAAG,qBAGnB,GAAGO,EAAK,KAAK,GAAG,CAAC,IAAIP,CAAG,EAC5B,CAAA,CACH,EACKQ,EACFT,EAAQ,QACR,IAAIU,GAAO,YAAa,WAAY,aAAY,aAAY,YAAU,EACpEC,EACFX,EAAQ,kBACNY,GAA6B,CAG3B,MAAMD,EAAkB,CAFLC,EAAQ,cAAA,EACO,QAGlC,OAAI,OAAO,MAAMD,CAAe,EACrB,EAEJA,CACX,GACEE,EACFb,EAAQ,QACNY,GAAmC,CACjC,MAAME,EAAaF,EAAQ,cAAA,EAC3B,IAAIG,EAAY,UAEhB,OAAQD,EAAW,QAAA,CACf,IAAK,WACDC,EAAY,UACZ,MACJ,IAAK,yBACDA,EAAY,UACZ,MACJ,IAAK,aACDA,EAAY,UACZ,MACJ,IAAK,YACDA,EAAY,UACZ,MACJ,IAAK,cACDA,EAAY,UACZ,MACJ,IAAK,UACDA,EAAY,UACZ,KAAA,CAQR,MAAO,CACH,KANoB,CACpB,MAAO,IAAIC,EAAAA,MAAMD,CAAS,EAC1B,QAAS,EAAA,EAKT,OAAQ,CACJ,MAAO,QACP,UAAW,MAAA,CACf,CAER,GAEEE,EAAoE,CACtE,OAAAR,EACA,gBAAAE,EACA,SAAUX,EAAQ,UAAY,GAC9B,SAAUA,EAAQ,UAAY,GAC9B,OAAQG,EACR,MAAAU,CAAA,EAGJ,MAAMI,CAAa,EACnB,KAAK,KAAOjB,EAAQ,OACpBkB,uBAAqB,KAAM,CAAE,SAAAhB,EAAU,CAC3C,CACJ,CAEO,MAAMiB,GAAuBC,GAAW,CAC3C,MAAMC,EAAMD,EAAQ,QAAQ,OACtBE,EAAS,IAAIxB,GAAwB,CACvC,GAAGuB,EACH,kBAAmBD,EAAQ,SAAS,YAAA,CACvC,EAED,OAAO,QAAQ,QAAQE,CAAM,CACjC,EC3IO,MAAMC,WAA4BC,GAAAA,oBAAqB,CAsBnD,YAAYxB,EAAqC,CACpD,MAAA,EAtBYX,EAAA,uBACAA,EAAA,6BAAwB,IACxBA,EAAA,YAAO,uBACPA,EAAA,YAQRA,EAAA,oBAA4B,MAC5BA,EAAA,iBAAuC,MAC9BA,EAAA,kBAAa,IAAIoC,IAC1BpC,EAAA,eAA0B,MAC1BA,EAAA,eAA+B,MAE/BA,EAAA,aAA+B,MAE/BA,EAAA,eAA+B,MAInC,KAAK,IAAMW,EAAQ,IACnB,KAAK,eAAiBA,EAAQ,cAClC,CApBA,IAAW,SAAmB,CAC1B,OAAO,KAAK,WAAW,OAC3B,CACA,IAAW,UAAmB,CAC1B,OAAO,KAAK,WAAW,QAC3B,CAiBO,SAAgB,CAEvB,CAEO,cAAwC,CAC3C,GAAI,KAAK,OAAS,KACd,MAAM,IAAI,MAAM,iBAAiB,EAGrC,OAAO,QAAQ,QAAQ,KAAK,KAAK,CACrC,CAEO,eAAeoB,EAAsC,CACpD,KAAK,SAAW,MAChBA,EAAQ,QAAQ,IAAI,KAAK,GAAI,CACzB,UAAW,KAAK,QAAQ,WACxB,UAAW,KAAK,QAAQ,UAAA,CAC3B,CAET,CAEO,aAA2C,CAC9C,GAAI,KAAK,WAAa,KAClB,MAAM,IAAI,MAAM,iBAAiB,EAGrC,OAAO,QAAQ,QAAQ,KAAK,SAAS,CACzC,CAEO,YAAYjC,EAAyD,CACxE,GACI,KAAK,SAAW,MAChB,KAAK,SAAW,MAChB,KAAK,SAAW,MAChB,KAAK,WAAa,MAClB,KAAK,cAAgB,KAErB,MAAM,IAAI,MAAM,iBAAiB,EAGrC,IAAIuC,EACJ,OAAIvC,EAAO,WAAa,MAAQA,EAAO,UAAU,OAAS,MAGtDuC,EAFmB,IAAIC,EAAAA,uBAAuB,KAAK,QAAS,CAAC,GAK1D,QAAQ,QAAQ,CACnB,UAAAD,EACA,iBAAkB,KAAK,aACvB,OAAQ,KAAK,QACb,WAAY,KAAK,QAAQ,OAAS,EAClC,SAAUvC,EAAO,SACX,IAAIwC,EAAAA,uBAAuB,KAAK,QAAS,EAAG,EAAK,EACjD,MAAA,CACT,CACL,CAEA,MAAgB,gBAAgC,CAC5C,KAAK,WAAW,UAAA,EAEhB,MAAMC,EAAO,MAAMC,GAAAA,KAAK,KAAK,IAAKC,GAAAA,UAAW,CACzC,IAAK,CAAE,MAAO,iBAAA,EACd,MAAOC,EAAAA,QAAQ,KAAA,CAClB,EAEKC,EAAW,IAAI,aAAaJ,EAAI,KAAK,OAAS,CAAC,EAC/CK,EAAS,IAAI,aAAaL,EAAI,KAAK,MAAM,EAEzCM,EAAS,IAAIC,OAAA,EAAO,UAAA,EACpBC,EAAc,IAAID,OAAA,EAAO,UAAA,EAEzBE,EAAQ,IAAIC,UAEZC,EAAS,IAAID,UAAQV,EAAI,KAAK,CAAC,EAAE,CAAC,EAAGA,EAAI,KAAK,CAAC,EAAE,CAAC,EAAGA,EAAI,KAAK,CAAC,EAAE,CAAC,CAAC,EAEzE,QAASY,EAAI,EAAGA,EAAIZ,EAAI,KAAK,OAAQY,GAAK,EAAG,CACzC,MAAMC,EAAIb,EAAI,KAAKY,CAAC,EAAE,CAAC,EACjBE,EAAId,EAAI,KAAKY,CAAC,EAAE,CAAC,EACjBG,EAAIf,EAAI,KAAKY,CAAC,EAAE,CAAC,EAEjBI,EAASH,EAAIF,EAAO,EACpBM,EAASH,EAAIH,EAAO,EACpBO,EAASH,EAAIJ,EAAO,EAE1BL,EAAO,cAAcG,EAAM,IAAII,EAAGC,EAAGC,CAAC,CAAC,EACvCP,EAAY,cAAcC,EAAM,IAAIO,EAAQC,EAAQC,CAAM,CAAC,EAE3Dd,EAASQ,EAAI,EAAI,CAAC,EAAII,EACtBZ,EAASQ,EAAI,EAAI,CAAC,EAAIK,EACtBb,EAASQ,EAAI,EAAI,CAAC,EAAIM,EAEtBb,EAAOO,CAAC,EAAIG,CAChB,CAEA,KAAK,QAAUX,EACf,KAAK,QAAUC,EACf,KAAK,QAAUM,EACf,KAAK,aAAeH,EAEpB,MAAMW,EAAaf,EAAS,OAAS,EAE/BgB,EAAuB,CACzB,OAAQd,EAAO,UAAU,IAAII,EAAAA,OAAS,EACtC,MAAO,EACP,eAAgB,EAChB,QAAS,GACT,GAAI,OACJ,WAAAS,EACA,SAAU,KAAK,GACf,OAAAb,CAAA,EAGJ,YAAK,MAAQc,EAEb,KAAK,UAAY,CACb,WAAY,CACR,CACI,UAAW,EACX,eAAgB,UAChB,IAAKd,EAAO,IAAI,EAChB,IAAKA,EAAO,IAAI,EAChB,KAAM,IACN,KAAM,EACN,KAAM,OAAA,CACV,EAEJ,IAAK,KAAK,gBAAkB,KAAO,CAAE,KAAM,KAAK,gBAAmB,OACnE,WAAAa,EACA,OAAAb,CAAA,EAGJ,KAAK,WAAW,UAAA,EAET,IACX,CACJ,CAKA,MAAqBe,WAAyBC,EAAW,CAG9C,YAAYlD,EAA4B,CAC3C,MAAMA,CAAO,EAHDX,EAAA,0BAAqB,IAKjC,MAAM8D,EAASC,EAAAA,UAAA,EAIf,GAFA,KAAK,SAAWC,cAAYF,EAAO,UAAU,EAEzC,QAASnD,EAAQ,OAAQ,CACzB,MAAMoB,EAAUW,EAAAA,QAAQ,WAAW/B,EAAQ,OAAO,GAAa,EAC/DkB,EAAAA,qBAAqB,KAAM,CAAE,SAAUE,EAAQ,SAAU,CAC7D,CACJ,CAEA,MAAsB,WAAWkC,EAA8C,CAC3E,MAAM,MAAM,WAAWA,CAAI,EAE3B,KAAK,mBAAmB,GAAG,CAC/B,CACJ,CCtNO,MAAMnC,GAAuBC,GAAW,CAC3C,KAAM,CAAE,QAAAmC,GAAYnC,EACdC,EAAMkC,EAAQ,OACpB,IAAIC,EAEJ,OAAQnC,EAAI,OAAO,KAAA,CACf,IAAK,OACDmC,EAAS,IAAIC,GAAW,CACpB,IACI,OAAOpC,EAAI,OAAO,KAAQ,SACpBqC,EAAAA,mBAAmBrC,EAAI,OAAO,GAAG,EACjC,MAAOsC,EAAeC,IAAqC,CAGvD,MAAMC,EAAM,MAFCxC,EAAI,OAAO,IACL,MAAMsC,EAAOC,CAAG,EACX,YAAA,EACxB,OAAO,IAAI,WAAWC,CAAG,CAC7B,CAAA,CACb,EACD,MACJ,IAAK,MACDL,EAAS,IAAIjC,GAAoB,CAC7B,GAAGF,EAAI,MAAA,CACV,EACD,MACJ,IAAK,MACDmC,EAAS,IAAIM,GAAU,CACnB,IACI,OAAOzC,EAAI,OAAO,KAAQ,SACpBqC,EAAAA,mBAAmBrC,EAAI,OAAO,GAAG,EACjC,SAAiC,CAC7B,MAAM0C,EAAI,MAAMhC,EAAAA,QAAQ,iBAAiBV,EAAI,OAAO,GAAG,EACvD,OAAO,IAAI,WAAW0C,EAAE,MAAM,CAAC,CAAC,CACpC,CAAA,CACb,EACD,MACJ,QAGI,OADgC1C,EAAI,MAExC,CAGJ,MAAMC,EAAS,IAAI2B,GAAiB,CAAE,OAAAO,EAAQ,EAE9C,OAAO,QAAQ,QAAQlC,CAAM,CACjC,EC7CA,MAAqB0C,WAAsBC,EAAQ,CACxC,YAAYC,EAA2BlE,EAA0B,CACpE,MAAM,CAAE,GAAGkE,EAAY,GAAGlE,EAAS,EACnCkB,EAAAA,qBAAqB,KAAM,CAAE,SAAUgD,EAAW,IAAK,CAC3D,CACJ,CCXO,MAAM/C,GAAuBC,GAAW,CAC3C,MAAMC,EAAMD,EAAQ,QAAQ,OACtBE,EAAS,IAAI0C,GAAc,CAC7B,GAAG3C,EAAI,OACP,IAAKqC,EAAAA,mBAAmBrC,EAAI,OAAO,GAAG,CAAA,CACzC,EAED,OAAO,QAAQ,QAAQC,CAAM,CACjC,ECIA,MAAqB6C,WAA8BH,EAAc,CACtD,YAAYE,EAAmC,CAClD,MAAMf,EAASC,EAAAA,UAAA,EACf,MAAMc,EAAY,CACd,SAAUb,EAAAA,YAAYF,EAAO,UAAU,EACvC,eAAgBiB,GAAAA,KAAK,SAAA,CACxB,EACD,KAAK,KAAO,cAAcF,EAAW,IAAI,EAC7C,CACJ,CAEO,MAAM/C,GAAuBC,GAAW,CAC3C,KAAM,CAAE,QAAAmC,GAAYnC,EAEdC,EAAMkC,EAAQ,OACdjC,EAAS,IAAI6C,GAAsB,CACrC,GAAG9C,EAAI,OACP,KAAMA,EAAI,KACV,IAAKqC,EAAAA,mBAAmBrC,EAAI,OAAO,GAAG,CAAA,CACzC,EAED,OAAO,QAAQ,QAAQC,CAAM,CACjC,ECtCM+C,GAAY,IAAIC,GAAY,YAAa,EAAG,EAAG,CAAC,EAMtD,eAAeC,GAASC,EAAgBC,EAAmC,CAEvE,MAAMC,EAAW,CAAA,EACjB,QAASlC,EAAI,EAAGA,EAAIgC,EAAK,OAAQhC,GAAK,IAAW,CAC7C,MAAMmC,EAAWH,EAAK,MAAMhC,EAAGA,EAAI,GAAS,EACtCoC,EAAWH,EAAK,MAAMjC,EAAGA,EAAI,GAAS,EAC5CkC,EAAS,KAAKG,GAAcF,EAAUC,CAAQ,CAAC,CACnD,CAGA,OADY,MAAM,QAAQ,IAAIF,CAAQ,GAC3B,KAAA,CACf,CAEA,eAAeG,GAAcL,EAAgBC,EAAmC,CAM5E,OALiB,MAAM1C,EAAAA,QAAQ,UAC3B,4EAA4EyC,EAAK,KAC7E,GAAA,CACH,QAAQC,EAAK,KAAK,GAAG,CAAC,gEAAA,GAEX,UACpB,CAEA,MAAAK,GAAe,CAOX,MAAM,SAASC,EAA2C,CACtD,MAAMC,EAAgB,CAAA,EAChBC,EAAgB,CAAA,EAEtBF,EAAY,QAAQG,GAAK,CACrBA,EAAE,GAAG,YAAab,EAAS,EAC3BW,EAAI,KAAKX,GAAU,SAAS,EAC5BY,EAAI,KAAKZ,GAAU,QAAQ,CAC/B,CAAC,GAEgB,MAAME,GAASS,EAAKC,CAAG,GAC/B,QAAQ,CAACE,EAAe3C,IAAc,CAE3CuC,EAAYvC,CAAC,EAAE,QAAQ,CAAC,EAAI2C,CAChC,CAAC,CACL,CACJ,ECzCaC,GAAgBL,GACzBD,GAAY,SAASC,CAAW,EAQvBM,GAAyBC,GAAkC,CACpE,MAAMC,EAAMD,EAAS,YAAYE,GAAMA,EAAU,KAAK,EAAE,GAAG,CAAC,EAC5D,GAAID,GAAO,KACP,MAAM,IAAI,MAAM,iCAAiC,EAgBrD,MAbkB,OAAOR,IACrBA,EAAY,QAAQU,GAAU,CAC1B,MAAMC,EAAMH,EACP,aAAa,CAAE,YAAaE,CAAA,CAAQ,EACpC,QAAQ,KAAK,CAACE,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,EAClD,GAAG,CAAC,EACLF,GAAO,OAEPD,EAAO,QAAQ,CAAC,EAAIC,EAAI,UAEhC,CAAC,EACM,QAAQ,QAAA,EAGvB,EAQaG,GAAa,CAACA,EAAyBC,EAAc,IAC5C,MAAOf,GAA8C,CAEnE,IAAIgB,EAAqBhB,EAAY,OAAOG,GAAKA,EAAE,QAAQ,CAAC,IAAMY,CAAW,EAC7E,UAAWE,KAASH,EAIhB,GAHA,MAAMG,EAAMD,CAAkB,EAE9BA,EAAqBA,EAAmB,OAAOb,GAAKA,EAAE,QAAQ,CAAC,IAAMY,CAAW,EAC5EC,EAAmB,SAAW,EAE9B,KAGZ,EAWSE,GAAqB,CAC9BX,EACAY,EACAJ,EAAc,IAEPI,EACDL,GAAW,CAACR,GAAsBC,CAAQ,EAAGF,EAAY,EAAGU,CAAW,EACvEV,GClFK,SAAAe,GAASC,EAAM,CAC5BA,EAAK,YAAa,iFAAiF,EACnGA,EAAK,YAAa,iHAAiH,EACnIA,EAAK,YAAa,kJAAkJ,EAEpKA,EAAK,MAAQA,EAAK,WAAW,EAC7BA,EAAK,WAAW,EAAIA,EAAK,WAAW,EACpCA,EAAK,OAASA,EAAK,WAAW,EAC9BA,EAAK,aAAa,EAAIA,EAAK,WAAW,EACtCA,EAAK,aAAa,EAAIA,EAAK,WAAW,CACxC,CCVO,IAAIC,GAAa,EACbC,GAAa,EACbC,GAAgB,EAChBC,GAAY,EACZC,GAAc,EACdC,GAAsB,QACtBC,GAAsB,cACtBC,GAAqB,qBACrBC,GAAa,oBACbC,EAAU,KAAK,GAAG,EAElBC,GAAQ,mBAERC,GAAM,mBAENC,GAAM,oBACNC,EAAQ,MAIRC,EAAM,oBACNC,GAAM,kBACNC,EAAS,KAAK,GAAG,EACjBC,GAAS,KAAK,GAAK,EAKnBC,EAAM,cC5BbC,GAAU,CAAA,EAGdA,GAAQ,UAAY,EACpBA,GAAQ,OAAS,gBACjBA,GAAQ,MAAQ,eAChBA,GAAQ,OAAS,iBACjBA,GAAQ,OAAS,gBACjBA,GAAQ,KAAO,gBACfA,GAAQ,KAAO,eACfA,GAAQ,QAAU,iBAClBA,GAAQ,MAAQ,iBAChBA,GAAQ,SAAW,SACnBA,GAAQ,UAAY,gBACpBA,GAAQ,OAAS,WACjBA,GAAQ,KAAO,gBCff,MAAAC,GAAe,CACb,GAAI,CAAC,SAAU,KAAM,EACrB,QAAS,CAAC,SAAU,KAAO,IAAI,CACjC,ECHA,IAAIC,GAAc,iBACH,SAASC,GAAMC,EAAKC,EAAK,CACtC,GAAID,EAAIC,CAAG,EACT,OAAOD,EAAIC,CAAG,EAMhB,QAJIC,EAAO,OAAO,KAAKF,CAAG,EACtBG,EAAOF,EAAI,YAAW,EAAG,QAAQH,GAAa,EAAE,EAChDlF,EAAI,GACJwF,EAASC,EACN,EAAEzF,EAAIsF,EAAK,QAGhB,GAFAE,EAAUF,EAAKtF,CAAC,EAChByF,EAAeD,EAAQ,YAAW,EAAG,QAAQN,GAAa,EAAE,EACxDO,IAAiBF,EACnB,OAAOH,EAAII,CAAO,CAGxB,CCXe,SAAAE,GAASC,EAAS,CAC/B,IAAIC,EAAO,CAAA,EACPC,EAAWF,EAAQ,MAAM,GAAG,EAAE,IAAI,SAASG,EAAG,CAChD,OAAOA,EAAE,KAAI,CACf,CAAC,EAAE,OAAO,SAAS3C,EAAG,CACpB,OAAOA,CACT,CAAC,EAAE,OAAO,SAAS4C,EAAG5C,EAAG,CACvB,IAAI6C,EAAQ7C,EAAE,MAAM,GAAG,EACvB,OAAA6C,EAAM,KAAK,EAAI,EACfD,EAAEC,EAAM,CAAC,EAAE,YAAW,CAAE,EAAIA,EAAM,CAAC,EAC5BD,CACT,EAAG,CAAA,CAAE,EACDE,EAAWC,EAAUC,EACrBxJ,EAAS,CACX,KAAM,WACN,MAAO,YACP,GAAI,SAASmJ,EAAG,CACdF,EAAK,GAAK,WAAWE,CAAC,CACxB,EACA,MAAO,SAASA,EAAG,CACjBF,EAAK,KAAOE,EAAInB,CAClB,EACA,MAAO,SAASmB,EAAG,CACjBF,EAAK,KAAOE,EAAInB,CAClB,EACA,MAAO,SAASmB,EAAG,CACjBF,EAAK,KAAOE,EAAInB,CAClB,EACA,OAAQ,SAASmB,EAAG,CAClBF,EAAK,OAASE,EAAInB,CACpB,EACA,MAAO,SAASmB,EAAG,CACjBF,EAAK,MAAQE,EAAInB,CACnB,EACA,MAAO,SAASmB,EAAG,CACjBF,EAAK,MAAQE,EAAInB,CACnB,EACA,MAAO,SAASmB,EAAG,CACjBF,EAAK,MAAQE,EAAInB,CACnB,EACA,MAAO,SAASmB,EAAG,CACjBF,EAAK,MAAQ,WAAWE,CAAC,EAAInB,CAC/B,EACA,MAAO,SAASmB,EAAG,CACjBF,EAAK,qBAAuB,WAAWE,CAAC,CAC1C,EACA,KAAM,SAASA,EAAG,CAChBF,EAAK,MAAQE,EAAInB,CACnB,EACA,IAAK,SAASmB,EAAG,CACfF,EAAK,GAAK,WAAWE,CAAC,CACxB,EACA,IAAK,SAASA,EAAG,CACfF,EAAK,GAAK,WAAWE,CAAC,CACxB,EACA,IAAK,SAASA,EAAG,CACfF,EAAK,GAAK,WAAWE,CAAC,CACxB,EACA,EAAG,SAASA,EAAG,CACbF,EAAK,GAAK,WAAWE,CAAC,CACxB,EACA,EAAG,SAASA,EAAG,CACbF,EAAK,EAAI,WAAWE,CAAC,CACvB,EACA,EAAG,SAASA,EAAG,CACbF,EAAK,EAAI,WAAWE,CAAC,CACvB,EACA,IAAK,UAAW,CACdF,EAAK,IAAM,EACb,EACA,KAAM,SAASE,EAAG,CAChBF,EAAK,KAAO,SAASE,EAAG,EAAE,CAC5B,EACA,MAAO,UAAW,CAChBF,EAAK,SAAW,EAClB,EACA,QAAS,SAASE,EAAG,CACnBF,EAAK,aAAeE,EAAE,MAAM,GAAG,EAAE,IAAI,SAAS3C,EAAG,CAC/C,OAAO,WAAWA,CAAC,CACrB,CAAC,CACH,EACA,SAAU,SAAS2C,EAAG,CACpBF,EAAK,SAAW,WAAWE,CAAC,CAC9B,EACA,MAAO,SAASA,EAAG,CACjBF,EAAK,MAAQE,EACb,IAAIM,EAAOjB,GAAMF,GAAOa,CAAC,EACrBM,IACFR,EAAK,SAAWQ,EAAK,SAEzB,EACA,eAAgB,SAASN,EAAG,CAC1BF,EAAK,eAAiBE,EAAInB,CAC5B,EACA,GAAI,SAASmB,EAAG,CACd,IAAIO,EAAKlB,GAAMmB,GAAeR,CAAC,EAC/BF,EAAK,gBAAkBS,GAAU,WAAWP,CAAC,GAAKnB,CACpD,EACA,SAAU,SAASmB,EAAG,CAChBA,IAAM,QACRF,EAAK,UAAY,OAGjBA,EAAK,SAAWE,CAEpB,EACA,KAAM,SAASA,EAAG,CAChB,IAAIS,EAAY,SACZT,EAAE,SAAW,GAAKS,EAAU,QAAQT,EAAE,OAAO,EAAG,CAAC,CAAC,IAAM,IAAMS,EAAU,QAAQT,EAAE,OAAO,EAAG,CAAC,CAAC,IAAM,IAAMS,EAAU,QAAQT,EAAE,OAAO,EAAG,CAAC,CAAC,IAAM,KAClJF,EAAK,KAAOE,EAEhB,EACA,OAAQ,UAAW,CACjBF,EAAK,OAAS,EAChB,CACJ,EACE,IAAKK,KAAaJ,EAChBK,EAAWL,EAASI,CAAS,EACzBA,KAAatJ,GACfwJ,EAAexJ,EAAOsJ,CAAS,EAC3B,OAAOE,GAAiB,WAC1BA,EAAaD,CAAQ,EAGrBN,EAAKO,CAAY,EAAID,GAIvBN,EAAKK,CAAS,EAAIC,EAGtB,OAAG,OAAON,EAAK,WAAc,UAAYA,EAAK,YAAc,UAC1DA,EAAK,UAAYA,EAAK,UAAU,YAAW,GAEtCA,CACT,CC5IA,MAAMY,EAAoB,CACxB,OAAO,MAAMhG,EAAM,CACjB,MAAMiG,EAASjG,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,IAAI,EAC7E,OAAID,GAAUA,EAAO,QAAU,EACtB,CACL,UAAWA,EAAO,CAAC,EACnB,KAAM,SAASA,EAAO,CAAC,EAAG,EAAE,CACpC,EAEW,IACT,CAEA,OAAO,YAAYjG,EAAMmG,EAAO,OAAQ,CACtC,GAAI,CAACnG,GAAQA,EAAK,OAAS,EACzB,MAAO,CAAE,KAAAmG,EAAM,KAAM,UAAW,kBAAmB,IAAI,EAGzD,MAAMC,EAAOpG,EAAK,CAAC,EACbqG,EAAmB,WAAWrG,EAAK,CAAC,CAAC,GAAK,KAE1CiG,EAASjG,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,IAAI,EACvEI,EAAKL,EACP,CACA,UAAWA,EAAO,CAAC,EACnB,KAAM,SAASA,EAAO,CAAC,EAAG,EAAE,CACpC,EACQ,KAEJ,MAAO,CACL,KAAAE,EACA,KAAAC,EACA,kBAAmBC,EACnB,GAAAC,CACN,CACE,CAEA,OAAO,YAAYtG,EAAM,CACvB,MAAMoG,EAAOpG,EAAK,CAAC,GAAK,UAGxB,IAAIuG,EACJ,MAAMC,EAAoBJ,EAAK,MAAM,WAAW,EAChD,GAAII,EAAmB,CAErB,MAAMC,EAAeD,EAAkB,CAAC,EAAE,YAAW,EACrD,GAAIC,IAAiB,IAAKF,EAAY,eAC7BE,IAAiB,IAAKF,EAAY,gBAClCE,IAAiB,IAAKF,EAAY,SACtC,OAAM,IAAI,MAAM,8BAA8BE,CAAY,EAAE,CACnE,MAEEF,EAAYvG,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAE,YAAW,EAAK,UAGhD,MAAM0G,EAAY1G,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,OAAO,EAC7ES,EAAQD,EAAY,SAASA,EAAU,CAAC,EAAG,EAAE,EAAI,KAEjDE,EAAW5G,EAAK,KACnBkG,GACC,MAAM,QAAQA,CAAK,IAClBA,EAAM,CAAC,IAAM,cAAgBA,EAAM,CAAC,IAAM,aAAeA,EAAM,CAAC,IAAM,YAC/E,EACUN,EAAO,KAAK,YAAYgB,CAAQ,EAEtC,MAAO,CACL,KAAAR,EACA,UAAAG,EACA,KAAAX,EACA,MAAAe,CACN,CACE,CAEA,OAAO,YAAY3G,EAAM,CACvB,OAAOA,EACJ,OAAQkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,MAAM,EAC7D,IAAKW,GAAS,KAAK,YAAYA,CAAI,CAAC,EACpC,KAAK,CAAClE,EAAGC,KAAOD,EAAE,OAAS,IAAMC,EAAE,OAAS,EAAE,CACnD,CAEA,OAAO,QAAQ5C,EAAM8G,EAAS,GAAI,CAEhC,OAAQ9G,EAAK,CAAC,EAAC,CACb,IAAK,UACH8G,EAAO,KAAO,eACdA,EAAO,KAAO9G,EAAK,CAAC,EACpB8G,EAAO,SAAW9G,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,aAAa,EACrF,KAAK,QAAQlG,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,aAAa,CAAC,EACrF,KACJY,EAAO,WAAa9G,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,YAAY,EACtF,KAAK,QAAQlG,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,YAAY,CAAC,EACpF,KAEJ,MAAMa,EAAS/G,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,IAAI,EACzEa,IACFD,EAAO,kBAAoB,CACzB,KAAMC,EAAO,CAAC,EACd,KAAM,KAAK,YAAY/G,CAAI,CACvC,GAGQ,MAAMgH,EAAiBhH,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,YAAY,EAC7F,GAAIc,EAAgB,CAClB,MAAMpB,EAAO,KAAK,YAAYoB,CAAc,EAC5CF,EAAO,kBAAkB,KAAOlB,CAClC,CAEAkB,EAAO,GAAK,KAAK,MAAM9G,CAAI,EAC3B,MAEF,IAAK,cACL,IAAK,UACH8G,EAAO,KAAO,gBACdA,EAAO,KAAO9G,EAAK,CAAC,EAGpB,MAAMiH,EAAsBjH,EAAK,KAC9BkG,GAAU,MAAM,QAAQA,CAAK,IAAMA,EAAM,CAAC,IAAM,SAAWA,EAAM,CAAC,IAAM,WACnF,EACQ,GAAIe,EAAqB,CACvB,MAAMC,EAAkB,KAAK,QAAQD,CAAmB,EACpDA,EAAoB,CAAC,IAAM,WAC7BH,EAAO,eAAiBI,EAExBJ,EAAO,MAAQI,EAEjB,MAAMC,EAASnH,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,QAAQ,EAC7EiB,GAAUA,EAAO,CAAC,IAAM,cAC1BD,EAAgB,eAAiB,CAC/B,KAAMC,EAAO,CAAC,EACd,UAAW,WAAWA,EAAO,CAAC,CAAC,CAC7C,EAEQ,CAEAL,EAAO,kBAAoB,CACzB,KAAM,cACN,KAAM,KAAK,YAAY9G,CAAI,CACrC,EAEQ8G,EAAO,GAAK,KAAK,MAAM9G,CAAI,EAC3B,MAEF,IAAK,QACH8G,EAAO,KAAO,yBACdA,EAAO,KAAO9G,EAAK,CAAC,EACpB8G,EAAO,UAAY9G,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,WAAW,EACpF,KAAK,QAAQlG,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,WAAW,CAAC,EACnF,KACJ,MAEF,IAAK,WACHY,EAAO,KAAO,gBACdA,EAAO,KAAO9G,EAAK,CAAC,EAGpB8G,EAAO,QAAU9G,EACd,OAAQkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,QAAQ,EAC/D,IAAKkB,IAAY,CAChB,KAAM,sBACN,KAAMA,EAAO,CAAC,EACd,GAAI,KAAK,MAAMA,CAAM,CACjC,EAAY,EAGJ,MAAMC,EAAerH,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,kBAAkB,EAC7FmB,IACFP,EAAO,SAAW,WAAWO,EAAa,CAAC,CAAC,GAI9C,MAAMC,EAAgBtH,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,WAAW,EACvFoB,IACFR,EAAO,UAAY,KAAK,QAAQQ,CAAa,GAI/CR,EAAO,GAAK,KAAK,MAAM9G,CAAI,EAC3B,MAEF,IAAK,YACH8G,EAAO,KAAO,YACdA,EAAO,KAAO9G,EAAK,CAAC,EACpB8G,EAAO,gBAAkB,WAAW9G,EAAK,CAAC,CAAC,EAC3C8G,EAAO,mBAAqB,WAAW9G,EAAK,CAAC,CAAC,EAChCA,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,YAAY,GAChF,KAAK,QAAQlG,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,YAAY,EAAGY,CAAM,EAEhG,MAEF,IAAK,aACHA,EAAO,KAAO,aACdA,EAAO,KAAO9G,EAAK,CAAC,EACpB8G,EAAO,OAAS9G,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,QAAQ,EAC9E,KAAK,QAAQlG,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,QAAQ,CAAC,EAChF,KACJY,EAAO,WAAa9G,EACjB,OAAQkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,WAAW,EAClE,IAAKqB,GAAU,KAAK,QAAQA,CAAK,CAAC,EACrC,MAEF,IAAK,SACHT,EAAO,KAAO,SACdA,EAAO,KAAO9G,EAAK,CAAC,EACpB8G,EAAO,GAAK,KAAK,MAAM9G,CAAI,EAC3B,MAEF,IAAK,YACH8G,EAAO,KAAO,YACdA,EAAO,KAAO9G,EAAK,CAAC,EACpB8G,EAAO,MAAQ,WAAW9G,EAAK,CAAC,CAAC,EACjC8G,EAAO,KAAO,KAAK,YACjB9G,EAAK,KACFkG,GACC,MAAM,QAAQA,CAAK,IAClBA,EAAM,CAAC,IAAM,cAAgBA,EAAM,CAAC,IAAM,aAAeA,EAAM,CAAC,IAAM,YACrF,CACA,EACQY,EAAO,GAAK,KAAK,MAAM9G,CAAI,EAC3B,MAEF,IAAK,WACH8G,EAAO,KAAO,WAGd,MAAMU,EAAgBxH,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,WAAW,EAC3F,GAAIsB,EAAe,CACjB,MAAMC,EAAmBD,EAAc,KAAMtB,GAAU,MAAM,QAAQA,CAAK,CAAC,EAC3EY,EAAO,WAAaW,EAAmB,KAAK,QAAQA,CAAgB,EAAI,IAC1E,CAGA,MAAMC,EAAgB1H,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,WAAW,EAC3F,GAAIwB,EAAe,CACjB,MAAMC,EAAmBD,EAAc,KAAMxB,GAAU,MAAM,QAAQA,CAAK,CAAC,EAC3EY,EAAO,WAAaa,EAAmB,KAAK,QAAQA,CAAgB,EAAI,IAC1E,CAGA,MAAMC,EAAqB5H,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,wBAAwB,EACzG0B,EACFd,EAAO,eAAiB,KAAK,QAAQc,CAAkB,EAEvDd,EAAO,eAAiB,KAE1B,MAEF,IAAK,yBAyBH,GAxBAA,EAAO,KAAO,iBACdA,EAAO,KAAO9G,EAAK,CAAC,EACpB8G,EAAO,OAAS9G,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,QAAQ,EAC9E,KAAK,QAAQlG,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,QAAQ,CAAC,EAChF,KAEJY,EAAO,WAAa9G,EACjB,OAAQkG,GAAU,MAAM,QAAQA,CAAK,IAAMA,EAAM,CAAC,IAAM,aAAeA,EAAM,CAAC,IAAM,gBAAgB,EACpG,IAAKqB,GAAU,CACd,GAAIA,EAAM,CAAC,IAAM,YACf,OAAO,KAAK,QAAQA,CAAK,EACpB,GAAIA,EAAM,CAAC,IAAM,gBACtB,MAAO,CACL,KAAMA,EAAM,CAAC,EACb,MAAOA,EAAM,CAAC,EACd,GAAI,CACF,UAAa,OACb,KAAQ,IAC1B,CACA,CAEU,CAAC,EAGCT,EAAO,WAAW,SAAW,EAAG,CAClC,MAAMe,EAAkBf,EAAO,WAAW,CAAC,EACvCe,EAAgB,OAAS,qBAC3BA,EAAgB,MAAQ,KAAK,OAAOA,EAAgB,MAAQ,GAAK,IAAI,EAAI,IAE7E,CAEAf,EAAO,GAAK,KAAK,MAAM9G,CAAI,EAC3B,MAEF,IAAK,OACE8G,EAAO,oBACVA,EAAO,kBAAoB,CAAE,KAAM,cAAe,KAAM,CAAA,CAAE,GAE5DA,EAAO,kBAAkB,KAAK,KAAK,KAAK,YAAY9G,CAAI,CAAC,EACzD,MAEF,IAAK,aACH,MAAM4F,EAAO,KAAK,YAAY5F,EAAM,YAAY,EAC5C8G,EAAO,mBAAqBA,EAAO,kBAAkB,MACvDA,EAAO,kBAAkB,KAAK,QAASD,GAAS,CACzCA,EAAK,OACRA,EAAK,KAAOjB,EAEhB,CAAC,EAECA,EAAK,mBAAqBA,EAAK,oBAAsB,GACnDkB,EAAO,kBACTA,EAAO,gBAAkB,CACvB,MAAOA,EAAO,gBACd,KAAAlB,CACd,GAGQ,MAEF,QACEkB,EAAO,QAAU9G,EAAK,CAAC,EACvB,KACR,CAEI,OAAO8G,CACT,CACF,CCxTA,MAAMgB,WAA4B9B,EAAoB,CACpD,OAAO,QAAQhG,EAAM8G,EAAS,GAAI,CAChC,aAAM,QAAQ9G,EAAM8G,CAAM,EAGtBA,EAAO,mBAAqBA,EAAO,kBAAkB,UAAY,aACnE,OAAOA,EAAO,kBAEZA,EAAO,OACT,OAAOA,EAAO,MAGTA,CACT,CACF,CCdA,MAAMiB,WAA4B/B,EAAoB,CACpD,OAAO,QAAQhG,EAAM8G,EAAS,GAAI,CAChC,MAAM,QAAQ9G,EAAM8G,CAAM,EAG1B,MAAMC,EAAS/G,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,IAAI,EACzEa,IACFD,EAAO,kBAAoB,CACzB,QAASC,EAAO,CAAC,EACjB,KAAM,KAAK,YAAY/G,CAAI,CACnC,GAII,MAAMgI,EAAYhI,EAAK,KAAMkG,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,OAAO,EACnF,GAAI8B,EAAW,CACb,MAAMC,EAAQD,EAAU,KAAM9B,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,OAAO,EAC9EgC,EAAOF,EAAU,KAAM9B,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,MAAM,EAC5E1I,EAAOwK,EAAU,KAAM9B,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,MAAM,EAClFY,EAAO,MAAQ,CAAA,EACXmB,IACFnB,EAAO,MAAM,MAAQmB,EAAM,CAAC,GAE1BC,IACFpB,EAAO,MAAM,KAAOoB,EAAK,CAAC,GAExB1K,IACFsJ,EAAO,MAAM,KAAOtJ,EAAK,MAAM,CAAC,EAEpC,CAEA,OAAOsJ,CACT,CACF,CC3BA,SAASqB,GAAkBC,EAAM,CAE/B,OAAIA,EAAK,KAAMlC,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,OAAO,EAC5D,QAILkC,EAAK,KAAMlC,GAAU,MAAM,QAAQA,CAAK,GAAKA,EAAM,CAAC,IAAM,IAAI,GAI9DkC,EAAK,CAAC,IAAM,YAAcA,EAAK,CAAC,IAAM,WAAaA,EAAK,CAAC,IAAM,UAC1D,OAKX,CAOO,SAASC,GAAcD,EAAM,CAGlC,OAFgBD,GAAkBC,CAAI,IACV,OAASL,GAAsBD,IAC5C,QAAQM,CAAI,CAC7B,CC/BO,SAASE,GAAiBC,EAAK,CAEpC,MAAMC,EAAgBD,EAAI,YAAW,EAGrC,OACEC,EAAc,SAAS,SAAS,GAChCA,EAAc,SAAS,SAAS,GAChCA,EAAc,SAAS,UAAU,GACjCA,EAAc,SAAS,SAAS,GAChCA,EAAc,SAAS,YAAY,GACnCA,EAAc,SAAS,WAAW,GAClCA,EAAc,SAAS,WAAW,EAE3B,QAKPA,EAAc,SAAS,QAAQ,GAC/BA,EAAc,SAAS,QAAQ,GAC/BA,EAAc,SAAS,UAAU,GACjCA,EAAc,SAAS,SAAS,GAChCA,EAAc,SAAS,MAAM,EAEtB,OAKX,CCjCA,IAAIC,GAAU,EACVC,GAAU,EACVC,GAAS,EACTC,GAAS,EACTC,GAAa,EACbC,GAAQ,GACRC,GAAa,KACbC,GAAQ,WACRC,GAAU,cACVC,GAAY,QACZC,GAAS,cAEb,SAASC,GAAOC,EAAM,CACpB,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,MAAM,cAAc,EAEhC,KAAK,KAAOA,EAAK,KAAI,EACrB,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,KAAO,KACZ,KAAK,MAAQ,CAAA,EACb,KAAK,cAAgB,KACrB,KAAK,MAAQZ,EACf,CACAW,GAAO,UAAU,cAAgB,UAAW,CAC1C,IAAIE,EAAO,KAAK,KAAK,KAAK,OAAO,EACjC,GAAI,KAAK,QAAUV,GACjB,KAAOG,GAAW,KAAKO,CAAI,GAAG,CAC5B,GAAI,KAAK,OAAS,KAAK,KAAK,OAC1B,OAEFA,EAAO,KAAK,KAAK,KAAK,OAAO,CAC/B,CAEF,OAAQ,KAAK,MAAK,CAChB,KAAKb,GACH,OAAO,KAAK,QAAQa,CAAI,EAC1B,KAAKZ,GACH,OAAO,KAAK,QAAQY,CAAI,EAC1B,KAAKV,GACH,OAAO,KAAK,OAAOU,CAAI,EACzB,KAAKT,GACH,OAAO,KAAK,WAAWS,CAAI,EAC7B,KAAKX,GACH,OAAO,KAAK,OAAOW,CAAI,EACzB,KAAKR,GACH,MACN,CACA,EACAM,GAAO,UAAU,WAAa,SAASE,EAAM,CAC3C,GAAIA,IAAS,IAAK,CAChB,KAAK,MAAQ,IACb,KAAK,MAAQV,GACb,MACF,CACA,GAAIM,GAAU,KAAKI,CAAI,EAAG,CACxB,KAAK,KAAO,KAAK,KAAK,KAAI,EAC1B,KAAK,UAAUA,CAAI,EACnB,MACF,CACA,MAAM,IAAI,MAAM,mBAAqBA,EAAO,8BAAgC,KAAK,KAAK,CACxF,EACAF,GAAO,UAAU,UAAY,SAASE,EAAM,CAC1C,GAAIA,IAAS,IAAK,CACZ,KAAK,OAAS,MAChB,KAAK,cAAc,KAAK,KAAK,IAAI,EAEnC,KAAK,KAAO,KACZ,KAAK,MAAQb,GACb,MACF,CACA,GAAIa,IAAS,IAAK,CAChB,KAAK,QACD,KAAK,OAAS,OAChB,KAAK,cAAc,KAAK,KAAK,IAAI,EACjC,KAAK,KAAO,MAEd,KAAK,MAAQb,GACb,KAAK,cAAgB,KAAK,MAAM,IAAG,EAC9B,KAAK,gBACR,KAAK,MAAQK,IAGf,MACF,CACF,EACAM,GAAO,UAAU,OAAS,SAASE,EAAM,CACvC,GAAIH,GAAO,KAAKG,CAAI,EAAG,CACrB,KAAK,MAAQA,EACb,MACF,CACA,GAAIJ,GAAU,KAAKI,CAAI,EAAG,CACxB,KAAK,KAAO,WAAW,KAAK,IAAI,EAChC,KAAK,UAAUA,CAAI,EACnB,MACF,CACA,MAAM,IAAI,MAAM,mBAAqBA,EAAO,0BAA4B,KAAK,KAAK,CACpF,EACAF,GAAO,UAAU,OAAS,SAASE,EAAM,CACvC,GAAIA,IAAS,IAAK,CAChB,KAAK,MAAQT,GACb,MACF,CACA,KAAK,MAAQS,CAEf,EACAF,GAAO,UAAU,QAAU,SAASE,EAAM,CACxC,GAAIL,GAAQ,KAAKK,CAAI,EAAG,CACtB,KAAK,MAAQA,EACb,MACF,CACA,GAAIA,IAAS,IAAK,CAChB,IAAIC,EAAa,CAAA,EACjBA,EAAW,KAAK,KAAK,IAAI,EACzB,KAAK,QACD,KAAK,OAAS,KAChB,KAAK,KAAOA,EAEZ,KAAK,cAAc,KAAKA,CAAU,EAEpC,KAAK,MAAM,KAAK,KAAK,aAAa,EAClC,KAAK,cAAgBA,EACrB,KAAK,MAAQd,GACb,MACF,CACA,GAAIS,GAAU,KAAKI,CAAI,EAAG,CACxB,KAAK,UAAUA,CAAI,EACnB,MACF,CACA,MAAM,IAAI,MAAM,mBAAqBA,EAAO,2BAA6B,KAAK,KAAK,CACrF,EACAF,GAAO,UAAU,QAAU,SAASE,EAAM,CACxC,GAAIN,GAAM,KAAKM,CAAI,EAAG,CACpB,KAAK,KAAOA,EACZ,KAAK,MAAQZ,GACb,MACF,CACA,GAAIY,IAAS,IAAK,CAChB,KAAK,KAAO,GACZ,KAAK,MAAQV,GACb,MACF,CACA,GAAIO,GAAO,KAAKG,CAAI,EAAG,CACrB,KAAK,KAAOA,EACZ,KAAK,MAAQX,GACb,MACF,CACA,GAAIO,GAAU,KAAKI,CAAI,EAAG,CACxB,KAAK,UAAUA,CAAI,EACnB,MACF,CACA,MAAM,IAAI,MAAM,mBAAqBA,EAAO,2BAA6B,KAAK,KAAK,CACrF,EACAF,GAAO,UAAU,OAAS,UAAW,CACnC,KAAO,KAAK,MAAQ,KAAK,KAAK,QAC5B,KAAK,cAAa,EAEpB,GAAI,KAAK,QAAUN,GACjB,OAAO,KAAK,KAEd,MAAM,IAAI,MAAM,2BAA4B,KAAK,KAAO,eAAiB,KAAK,KAAK,CACrF,EAEA,SAASU,GAAYC,EAAK,CACxB,IAAIC,EAAS,IAAIN,GAAOK,CAAG,EAC3B,OAAOC,EAAO,OAAM,CACtB,CCtKA,SAASC,GAAM/E,EAAKC,EAAK1C,EAAO,CAC1B,MAAM,QAAQ0C,CAAG,IACnB1C,EAAM,QAAQ0C,CAAG,EACjBA,EAAM,MAER,IAAI+E,EAAQ/E,EAAM,CAAA,EAAKD,EAEnBiF,EAAM1H,EAAM,OAAO,SAAS2H,EAAQC,EAAM,CAC5C,OAAAC,GAAMD,EAAMD,CAAM,EACXA,CACT,EAAGF,CAAK,EACJ/E,IACFD,EAAIC,CAAG,EAAIgF,EAEf,CAEO,SAASG,GAAM1E,EAAGV,EAAK,CAC5B,GAAI,CAAC,MAAM,QAAQU,CAAC,EAAG,CACrBV,EAAIU,CAAC,EAAI,GACT,MACF,CACA,IAAIT,EAAMS,EAAE,MAAK,EAIjB,GAHIT,IAAQ,cACVA,EAAMS,EAAE,MAAK,GAEXA,EAAE,SAAW,EAAG,CAClB,GAAI,MAAM,QAAQA,EAAE,CAAC,CAAC,EAAG,CACvBV,EAAIC,CAAG,EAAI,CAAA,EACXmF,GAAM1E,EAAE,CAAC,EAAGV,EAAIC,CAAG,CAAC,EACpB,MACF,CACAD,EAAIC,CAAG,EAAIS,EAAE,CAAC,EACd,MACF,CACA,GAAI,CAACA,EAAE,OAAQ,CACbV,EAAIC,CAAG,EAAI,GACX,MACF,CACA,GAAIA,IAAQ,UAAW,CACrBD,EAAIC,CAAG,EAAIS,EACX,MACF,CACA,GAAIT,IAAQ,OAAQ,CACZA,KAAOD,IACXA,EAAIC,CAAG,EAAI,CAAA,GAEbD,EAAIC,CAAG,EAAE,KAAKS,CAAC,EACf,MACF,CACK,MAAM,QAAQT,CAAG,IACpBD,EAAIC,CAAG,EAAI,CAAA,GAGb,IAAIrF,EACJ,OAAQqF,EAAG,CACT,IAAK,OACL,IAAK,SACL,IAAK,aACHD,EAAIC,CAAG,EAAI,CACT,KAAMS,EAAE,CAAC,EAAE,YAAW,EACtB,QAASA,EAAE,CAAC,CACpB,EACUA,EAAE,SAAW,GACf0E,GAAM1E,EAAE,CAAC,EAAGV,EAAIC,CAAG,CAAC,EAEtB,OACF,IAAK,WACL,IAAK,YACHD,EAAIC,CAAG,EAAI,CACT,KAAMS,EAAE,CAAC,EACT,EAAGA,EAAE,CAAC,EACN,GAAIA,EAAE,CAAC,CACf,EACUA,EAAE,SAAW,GACf0E,GAAM1E,EAAE,CAAC,EAAGV,EAAIC,CAAG,CAAC,EAEtB,OACF,IAAK,SACL,IAAK,mBACL,IAAK,cACL,IAAK,QACL,IAAK,UACL,IAAK,UACL,IAAK,cACHS,EAAE,CAAC,EAAI,CAAC,OAAQA,EAAE,CAAC,CAAC,EACpBqE,GAAM/E,EAAKC,EAAKS,CAAC,EACjB,OACF,IAAK,WACL,IAAK,cACL,IAAK,YAGL,IAAK,eACL,IAAK,UACL,IAAK,SACL,IAAK,SACL,IAAK,SACL,IAAK,WACL,IAAK,UACL,IAAK,cACL,IAAK,gBACL,IAAK,SACL,IAAK,iBACHA,EAAE,CAAC,EAAI,CAAC,OAAQA,EAAE,CAAC,CAAC,EACpBqE,GAAM/E,EAAKC,EAAKS,CAAC,EACjBV,EAAIC,CAAG,EAAE,KAAOA,EAChB,OACF,QAEE,IADArF,EAAI,GACG,EAAEA,EAAI8F,EAAE,QACb,GAAI,CAAC,MAAM,QAAQA,EAAE9F,CAAC,CAAC,EACrB,OAAOwK,GAAM1E,EAAGV,EAAIC,CAAG,CAAC,EAG5B,OAAO8E,GAAM/E,EAAKC,EAAKS,CAAC,CAC9B,CACA,CCtHA,IAAInB,GAAM,oBAEH,SAAS8F,GAAIC,EAAO,CACzB,OAAOA,EAAQ/F,EACjB,CAEO,SAASgG,GAAwB5B,EAAK,CAE3C,MAAM6B,GAAsB7B,EAAI,UAAY,IAAI,cAAc,QAAQ,KAAM,GAAG,EAE3E,CAACA,EAAI,OAASA,EAAI,QAAU6B,IAAuB,2BAA6BA,IAAuB,kCACzG7B,EAAI,MAAQA,EAAI,OAEd,CAACA,EAAI,QAAUA,EAAI,OAAS6B,IAAuB,4BAA8BA,IAAuB,oCAC1G7B,EAAI,KAAO0B,GAAI1B,EAAI,KAAO,EAAI,GAAK,GAAG,EACtCA,EAAI,OAASA,EAAI,KACjB,OAAOA,EAAI,MACF,CAACA,EAAI,QAAUA,EAAI,OAAS6B,IAAuB,uBAAyBA,IAAuB,qCAC5G7B,EAAI,OAASA,EAAI,KACjBA,EAAI,KAAO0B,GAAI1B,EAAI,KAAO,EAAI,GAAK,GAAG,EACtC,OAAOA,EAAI,KAEf,CCnBA,SAAS8B,GAAYzE,EAAM,CACzB,IAAIkB,EAAS,CAAE,MAAO,KAAM,SAAU,MAAS,EAE/C,OAAI,OAAOlB,GAAS,UAClBkB,EAAO,MAAQlB,EAAK,YAAW,EAC3BkB,EAAO,QAAU,UACnBA,EAAO,MAAQ,SAEbA,EAAO,QAAU,UACnBA,EAAO,SAAW,IAEXlB,GAAQA,EAAK,OACtBkB,EAAO,MAAQlB,EAAK,KAAK,YAAW,EAChCkB,EAAO,QAAU,UACnBA,EAAO,MAAQ,SAEjBA,EAAO,SAAWlB,EAAK,mBAGlBkB,CACT,CAEA,SAASwD,GAAQC,EAAe,CAC9B,OAAI,OAAOA,GAAkB,SACpBA,EAAc,MAAQA,EAAc,KAAK,kBAE3CA,CACT,CAEA,SAASC,GAAmBrI,EAAO2E,EAAQ,CACrC3E,EAAM,UAAU,QAClB2E,EAAO,EAAI3E,EAAM,UAAU,OAC3B2E,EAAO,GAAK,IAEZA,EAAO,EAAIwD,GAAQnI,EAAM,UAAU,eAAe,EAC9CA,EAAM,UAAU,qBAAuB,OACzC2E,EAAO,GAAK3E,EAAM,UAAU,mBACnBA,EAAM,UAAU,kBAAoB,QAAaA,EAAM,UAAU,kBAAoB,SAC9F2E,EAAO,GAAKA,EAAO,GAAKA,EAAO,EAAIwD,GAAQnI,EAAM,UAAU,eAAe,IAGhF,CAEO,SAASsI,GAAkBC,EAAU5D,EAAS,GAAI,CACvD,MAAI,CAAC4D,GAAY,OAAOA,GAAa,SAC5BA,EAGLA,EAAS,OAAS,YACpBD,GAAkBC,EAAS,WAAY5D,CAAM,EAEzC4D,EAAS,iBACPA,EAAS,eAAe,QAAUA,EAAS,eAAe,OAAO,OAAS,OAE5E5D,EAAO,SAAW4D,EAAS,eAAe,WAAW,CAAC,EAAE,MAGxD5D,EAAO,aAAe4D,EAAS,eAAe,WAAW,IAAKnD,GAAUA,EAAM,KAAK,GAGhFT,IAIT,OAAO,KAAK4D,CAAQ,EAAE,QAAS7F,GAAQ,CACrC,MAAM1C,EAAQuI,EAAS7F,CAAG,EAC1B,GAAI1C,IAAU,KAId,OAAQ0C,EAAG,CACT,IAAK,OACH,GAAIiC,EAAO,QACT,MAEFA,EAAO,KAAO3E,EACd2E,EAAO,QAAU3E,EACjB,MAEF,IAAK,OACCA,IAAU,gBACZ2E,EAAO,SAAW,UACT3E,IAAU,gBAAkBuI,EAAS,YAAcA,EAAS,WAAW,SAChF5D,EAAO,SAAW4D,EAAS,WAAW,OAAO,MAE/C,MAEF,IAAK,QACL,IAAK,iBACCvI,EAAM,YAER2E,EAAO,MAAQ3E,EAAM,UAAU,KAC/BqI,GAAmBrI,EAAO2E,CAAM,GAE9B3E,EAAM,iBACR2E,EAAO,eAAiB3E,EAAM,eAAe,UAAY,KAAK,GAAK,KAErE,MAEF,IAAK,YACH2E,EAAO,MAAQ3E,EAAM,KACrBqI,GAAmBrI,EAAO2E,CAAM,EAChC,MAEF,IAAK,iBACHA,EAAO,OAAS3E,EAAM,WAAa,GAAK,KAAK,GAAK,IAClD,MAEF,IAAK,oBACH,GAAIA,EAAM,MAYR,GAXA2E,EAAO,KAAO3E,EAAM,KACjB,IAAK0E,GAAS,CACb,MAAMN,EAAYM,EAAK,UACvB,GAAIN,IAAc,OAAQ,MAAO,IACjC,GAAIA,IAAc,QAAS,MAAO,IAClC,GAAIA,IAAc,OAAQ,MAAO,IACjC,GAAIA,IAAc,QAAS,MAAO,IAClC,MAAM,IAAI,MAAM,2BAA2BA,CAAS,EAAE,CACxD,CAAC,EACA,KAAK,EAAE,EAAI,IAEVpE,EAAM,KAAM,CACd,KAAM,CAAE,MAAAsC,EAAO,SAAAkG,CAAQ,EAAKN,GAAYlI,EAAM,IAAI,EAClD2E,EAAO,MAAQrC,EACfqC,EAAO,SAAW6D,CACpB,SAAWxI,EAAM,KAAK,CAAC,GAAKA,EAAM,KAAK,CAAC,EAAE,KAAM,CAC9C,KAAM,CAAE,MAAAsC,EAAO,SAAAkG,GAAaN,GAAYlI,EAAM,KAAK,CAAC,EAAE,IAAI,EAC1D2E,EAAO,MAAQrC,EACfqC,EAAO,SAAW6D,CACpB,EAEF,MAEF,IAAK,KACCxI,EAAM,WAAaA,EAAM,OAC3B2E,EAAO,MAAQ3E,EAAM,UAAY,IAAMA,EAAM,MAE/C,MAEF,IAAK,aACCA,EAAM,QAAUA,EAAM,OAAO,OAC/B2E,EAAO,SAAW3E,EAAM,OAAO,MAE7BA,EAAM,YACRA,EAAM,WAAW,QAASoF,GAAU,CAClC,MAAM9B,EAAY8B,EAAM,KAAK,YAAW,EAAG,QAAQ,OAAQ,GAAG,EACxDqD,EAAarD,EAAM,MACrBA,EAAM,MAAQA,EAAM,KAAK,kBAC3BT,EAAOrB,CAAS,EAAImF,EAAarD,EAAM,KAAK,kBACnCA,EAAM,OAAS,SACxBT,EAAOrB,CAAS,EAAImF,EAAa,KAAK,GAAK,IAE3C9D,EAAOrB,CAAS,EAAImF,CAExB,CAAC,EAEH,MAEF,IAAK,OACCzI,EAAM,OACR2E,EAAO,MAAQ3E,EAAM,KAAK,YAAW,EACjC2E,EAAO,QAAU,UACnBA,EAAO,MAAQ,UAGf3E,EAAM,oBACR2E,EAAO,SAAW3E,EAAM,mBAE1B,MAEF,IAAK,WACHsI,GAAkBtI,EAAO2E,CAAM,EAC/BA,EAAO,UAAY3E,EAAM,GAAKA,EAAM,GAAG,UAAY,IAAMA,EAAM,GAAG,KAAOA,EAAM,KAC/E,KAKR,CACE,CAAC,EAGG2E,EAAO,2BAA6B,SACtCA,EAAO,KAAOA,EAAO,0BAEnBA,EAAO,4BAA8B,SACvCA,EAAO,MAAQA,EAAO,2BAEpBA,EAAO,gCAAkC,SAC3CA,EAAO,KAAOA,EAAO,8BACrBA,EAAO,KAAOA,EAAO,+BAEnBA,EAAO,oCAAsC,SAC/CA,EAAO,KAAOA,EAAO,mCAEnBA,EAAO,oCAAsC,SAC/CA,EAAO,KAAOA,EAAO,mCAEnBA,EAAO,gCAAkC,SAC3CA,EAAO,KAAOA,EAAO,+BAEnBA,EAAO,iCAAmC,SAC5CA,EAAO,MAAQA,EAAO,gCAEpBA,EAAO,0BAA4B,SACrCA,EAAO,GAAKA,EAAO,yBAEjBA,EAAO,2BAA6B,SACtCA,EAAO,GAAKA,EAAO,0BAEjBA,EAAO,6BAA+B,SACxCA,EAAO,KAAOA,EAAO,4BAEnBA,EAAO,8BAAgC,SACzCA,EAAO,MAAQA,EAAO,6BAEpBA,EAAO,sBAAwB,SACjCA,EAAO,MAAQA,EAAO,qBAEpBA,EAAO,gBAAkB,SAC3BA,EAAO,GAAKA,EAAO,eAEjBA,EAAO,+BACTA,EAAO,GAAKA,EAAO,8BAEjBA,EAAO,iBAAmB,SAC5BA,EAAO,GAAKA,EAAO,gBAEjBA,EAAO,gCACTA,EAAO,GAAKA,EAAO,+BAEjBA,EAAO,sBAAwB,SACjCA,EAAO,KAAOA,EAAO,qBAEnBA,EAAO,sBAAwB,SACjCA,EAAO,KAAOA,EAAO,qBAEnBA,EAAO,iCAAmC,SAC5CA,EAAO,GAAKA,EAAO,gCAEjBA,EAAO,oCAAsC,SAC/CA,EAAO,GAAKA,EAAO,mCAEjBA,EAAO,2CAA6C,SACtDA,EAAO,GAAKA,EAAO,0CAEjBA,EAAO,UAAY,SACrBA,EAAO,MAAQA,EAAO,SAEpBA,EAAO,+BAAiC,SAC1CA,EAAO,MAAQA,EAAO,8BAEpBA,EAAO,oCACTA,EAAO,qBAAuBA,EAAO,mCAIvCqD,GAAwBrD,CAAM,EAEvBA,EACT,CChQA,IAAI+D,GAAa,CAAC,eAAgB,UAAW,SAAU,SAAU,SAAU,WAAY,UACrF,cAAe,gBAAiB,SAAU,gBAAgB,EAE5D,SAASC,GAAOlG,EAAKzI,EAAQ,CAC3B,IAAI4O,EAAU5O,EAAO,CAAC,EAClB6O,EAAS7O,EAAO,CAAC,EACjB,EAAE4O,KAAWnG,IAASoG,KAAUpG,IAClCA,EAAImG,CAAO,EAAInG,EAAIoG,CAAM,EACrB7O,EAAO,SAAW,IACpByI,EAAImG,CAAO,EAAI5O,EAAO,CAAC,EAAEyI,EAAImG,CAAO,CAAC,GAG3C,CAEA,SAASE,GAAS1C,EAAK,CAErB,QADIzD,EAAO,OAAO,KAAKyD,CAAG,EACjB,EAAI,EAAG2C,EAAKpG,EAAK,OAAQ,EAAGoG,EAAI,EAAE,EAAG,CAC5C,IAAIrG,EAAMC,EAAK,CAAC,EAGZ+F,GAAW,QAAQhG,CAAG,IAAM,IAC9BsG,GAAqB5C,EAAI1D,CAAG,CAAC,EAE3B,OAAO0D,EAAI1D,CAAG,GAAM,UACtBoG,GAAS1C,EAAI1D,CAAG,CAAC,CAErB,CACF,CAEA,SAASsG,GAAqB5C,EAAK,CACjC,GAAIA,EAAI,UAAW,CACjB,IAAI6C,EAAY,OAAO,KAAK7C,EAAI,SAAS,EAAE,CAAC,EACxC6C,GAAaA,KAAa7C,EAAI,YAChCA,EAAI,MAAQ6C,EAAY,IAAM7C,EAAI,UAAU6C,CAAS,EAEzD,CAaA,GAZI7C,EAAI,OAAS,SACfA,EAAI,SAAW,UACNA,EAAI,OAAS,YACtBA,EAAI,SAAW,WACfA,EAAI,MAAQ,IAER,OAAOA,EAAI,YAAe,SAC5BA,EAAI,SAAW,OAAO,KAAKA,EAAI,UAAU,EAAE,CAAC,EAE5CA,EAAI,SAAWA,EAAI,WAGnBA,EAAI,KAAM,CAEZ,QADI8C,EAAY,GACP7L,EAAI,EAAG0L,EAAK3C,EAAI,KAAK,OAAQ/I,EAAI0L,EAAI,EAAE1L,EAAG,CACjD,IAAIqH,EAAO,CAAC0B,EAAI,KAAK/I,CAAC,EAAE,CAAC,EAAE,YAAW,EAAI+I,EAAI,KAAK/I,CAAC,EAAE,CAAC,EAAE,aAAa,EAClEqH,EAAK,CAAC,EAAE,QAAQ,OAAO,IAAM,KAAQA,EAAK,CAAC,IAAM,KAAOA,EAAK,CAAC,IAAM,QAAUA,EAAK,CAAC,IAAM,QAC5FwE,GAAa,IACJxE,EAAK,CAAC,EAAE,QAAQ,OAAO,IAAM,KAAQA,EAAK,CAAC,IAAM,KAAOA,EAAK,CAAC,IAAM,QAAUA,EAAK,CAAC,IAAM,QACnGwE,GAAa,IACJxE,EAAK,CAAC,EAAE,QAAQ,MAAM,IAAM,KAAQA,EAAK,CAAC,IAAM,KAAOA,EAAK,CAAC,IAAM,QAAUA,EAAK,CAAC,IAAM,OAClGwE,GAAa,KACJxE,EAAK,CAAC,EAAE,QAAQ,MAAM,IAAM,KAAQA,EAAK,CAAC,IAAM,KAAOA,EAAK,CAAC,IAAM,QAAUA,EAAK,CAAC,IAAM,UAClGwE,GAAa,IAEjB,CACIA,EAAU,SAAW,IACvBA,GAAa,KAEXA,EAAU,SAAW,IACvB9C,EAAI,KAAO8C,EAEf,CACI9C,EAAI,OACNA,EAAI,MAAQA,EAAI,KAAK,KAAK,YAAW,EACjCA,EAAI,QAAU,UAChBA,EAAI,MAAQ,SAEVA,EAAI,KAAK,UACPA,EAAI,OAAS,SACXA,EAAI,OAASA,EAAI,MAAM,WACzBA,EAAI,SAAWA,EAAI,KAAK,QAAQA,EAAI,MAAM,SAAS,GAGrDA,EAAI,SAAWA,EAAI,KAAK,UAI9B,IAAI+C,EAAS/C,EAAI,OACbA,EAAI,OAAS,WACf+C,EAAS/C,GAEP+C,IAIEA,EAAO,MACT/C,EAAI,UAAY+C,EAAO,MAAM,KAAK,YAAW,EAE7C/C,EAAI,UAAY+C,EAAO,KAAK,YAAW,EAErC/C,EAAI,UAAU,MAAM,EAAG,CAAC,IAAM,OAChCA,EAAI,UAAYA,EAAI,UAAU,MAAM,CAAC,GAEnCA,EAAI,YAAc,qBACpBA,EAAI,UAAY,WAEdA,EAAI,YAAc,YAAcA,EAAI,YAAc,gCAChDA,EAAI,aAAe,8BACrBA,EAAI,OAAS,IAEfA,EAAI,UAAY,SAEdA,EAAI,YAAc,eACpBA,EAAI,UAAY,SAEd+C,EAAO,OAASA,EAAO,MAAM,WAC/B/C,EAAI,MAAQ+C,EAAO,MAAM,SAAS,KAAK,QAAQ,MAAO,EAAE,EAAE,QAAQ,gBAAiB,MAAM,EACrF/C,EAAI,MAAM,YAAW,EAAG,MAAM,EAAG,EAAE,IAAM,kBAC3CA,EAAI,MAAQ,QAGdA,EAAI,EAAI+C,EAAO,MAAM,SAAS,EAC9B/C,EAAI,GAAK,WAAW+C,EAAO,MAAM,SAAS,GAAI,EAAE,GAG9CA,EAAO,OAASA,EAAO,MAAM,UAC/B/C,EAAI,aAAe+C,EAAO,MAAM,SAE9B,CAAC/C,EAAI,UAAU,QAAQ,WAAW,IACpCA,EAAI,UAAY,UAEd,CAACA,EAAI,UAAU,QAAQ,WAAW,IACpCA,EAAI,UAAY,WAEd,CAACA,EAAI,UAAU,QAAQ,MAAM,GAC5B,CAACA,EAAI,UAAU,QAAQ,wBAAwB,KAClDA,EAAI,UAAY,SAEdA,EAAI,YAAc,YACpBA,EAAI,UAAY,UAEd,CAACA,EAAI,UAAU,QAAQ,QAAQ,IACjCA,EAAI,UAAY,UAGhBA,EAAI,GAAK,CAAC,SAASA,EAAI,CAAC,IAC1BA,EAAI,EAAIA,EAAI,GAEVA,EAAI,uBACNA,EAAI,qBAAuB0B,GAAI1B,EAAI,oBAAoB,GAGzD,SAASgD,EAAQrB,EAAO,CACtB,IAAIsB,EAAQjD,EAAI,UAAY,EAC5B,OAAO2B,EAAQsB,CACjB,CACA,IAAIC,EAAU,SAAS9I,EAAG,CACxB,OAAOmI,GAAOvC,EAAK5F,CAAC,CACtB,EACI+I,EAAO,CACT,CAAC,sBAAuB,qBAAqB,EAC7C,CAAC,sBAAuB,mCAAmC,EAC3D,CAAC,sBAAuB,qBAAqB,EAC7C,CAAC,sBAAuB,mCAAmC,EAC3D,CAAC,gBAAiB,eAAe,EACjC,CAAC,gBAAiB,eAAe,EACjC,CAAC,gBAAiB,yBAAyB,EAC3C,CAAC,iBAAkB,gBAAgB,EACnC,CAAC,iBAAkB,gBAAgB,EACnC,CAAC,iBAAkB,0BAA0B,EAC7C,CAAC,mBAAoB,kBAAkB,EACvC,CAAC,mBAAoB,6BAA6B,EAClD,CAAC,mBAAoB,2BAA2B,EAChD,CAAC,qBAAsB,oBAAoB,EAC3C,CAAC,qBAAsB,kBAAkB,EACzC,CAAC,qBAAsB,4BAA4B,EACnD,CAAC,qBAAsB,0BAA0B,EACjD,CAAC,eAAgB,cAAc,EAC/B,CAAC,KAAM,cAAc,EACrB,CAAC,qBAAsB,oBAAoB,EAC3C,CAAC,qBAAsB,oBAAoB,EAC3C,CAAC,OAAQ,qBAAsBzB,EAAG,EAClC,CAAC,sBAAuB,qBAAqB,EAC7C,CAAC,sBAAuB,qBAAqB,EAC7C,CAAC,QAAS,sBAAuBA,EAAG,EACpC,CAAC,KAAM,gBAAiBsB,CAAO,EAC/B,CAAC,KAAM,iBAAkBA,CAAO,EAChC,CAAC,QAAS,mBAAoBtB,EAAG,EACjC,CAAC,OAAQ,qBAAsBA,EAAG,EAClC,CAAC,OAAQ,sBAAuBA,EAAG,EACnC,CAAC,OAAQ,sBAAuBA,EAAG,EACnC,CAAC,OAAQ,sBAAuBA,EAAG,EACnC,CAAC,UAAW,SAAS,EACrB,CAAC,QAAS,UAAWA,EAAG,EACxB,CAAC,UAAW,MAAM,CACtB,EACEyB,EAAK,QAAQD,CAAO,EACpBtB,GAAwB5B,CAAG,CAC7B,CACe,SAAAA,GAASA,EAAK,CAC3B,GAAI,OAAOA,GAAQ,SACjB,OAAOkC,GAAkBlC,CAAG,EAE9B,MAAMoD,EAAUrD,GAAiBC,CAAG,EACpC,IAAIqD,EAAOlC,GAAOnB,CAAG,EACrB,GAAIoD,IAAY,OAAQ,CACtB,MAAMjB,EAAWrC,GAAcuD,CAAI,EACnC,OAAOnB,GAAkBC,CAAQ,CACnC,CACA,IAAIvE,EAAOyF,EAAK,CAAC,EACbhH,EAAM,CAAA,EACV,OAAAoF,GAAM4B,EAAMhH,CAAG,EACfqG,GAASrG,CAAG,EACLA,EAAIuB,CAAI,CACjB,CCtNA,SAAS/C,EAAKgD,EAAM,CAElB,IAAIyF,EAAO,KACX,GAAI,UAAU,SAAW,EAAG,CAC1B,IAAIC,EAAM,UAAU,CAAC,EACjB,OAAOA,GAAQ,SACbA,EAAI,OAAO,CAAC,IAAM,IACpB1I,EAAKgD,CAAI,EAAI2F,GAAU,UAAU,CAAC,CAAC,EAGnC3I,EAAKgD,CAAI,EAAImC,GAAI,UAAU,CAAC,CAAC,EAG/BnF,EAAKgD,CAAI,EAAI0F,CAEjB,SACS,UAAU,SAAW,EAAG,CAC/B,GAAI,MAAM,QAAQ1F,CAAI,EACpB,OAAOA,EAAK,IAAI,SAASd,EAAG,CACtB,MAAM,QAAQA,CAAC,EACjBlC,EAAK,MAAMyI,EAAMvG,CAAC,EAGlBlC,EAAKkC,CAAC,CAEV,CAAC,EAEE,GAAI,OAAOc,GAAS,UACvB,GAAIA,KAAQhD,EACV,OAAOA,EAAKgD,CAAI,MAGX,SAAUA,EACjBhD,EAAK,QAAUgD,EAAK,IAAI,EAAIA,EAErB,SAAUA,EACjBhD,EAAK,QAAUgD,EAAK,IAAI,EAAIA,EAErB,YAAaA,EACpBhD,EAAK,WAAagD,EAAK,OAAO,EAAIA,EAGlC,QAAQ,IAAIA,CAAI,EAElB,MACF,CAGF,CACAjD,GAAQC,CAAI,ECjDZ,SAAS4I,GAAQC,EAAK,CACpB,OAAO,OAAOA,GAAS,QACzB,CACA,SAASC,GAAQD,EAAK,CACpB,OAAOA,KAAQ7I,CACjB,CACA,IAAI+I,GAAY,CAAC,eAAgB,UAAW,SAAS,SAAS,SAAS,WAAY,UAAW,cAAe,gBAAiB,SAAU,gBAAgB,EACxJ,SAASC,GAAQH,EAAK,CACpB,OAAOE,GAAU,KAAK,SAAUE,EAAM,CACpC,OAAOJ,EAAK,QAAQI,CAAI,EAAI,EAC9B,CAAC,CACH,CACA,IAAIC,GAAQ,CAAC,OAAQ,SAAU,OAAQ,QAAQ,EAC/C,SAASC,GAAcxC,EAAM,CAC3B,IAAIyC,EAAO7H,GAAMoF,EAAM,WAAW,EAClC,GAAKyC,EAGL,KAAIP,EAAOtH,GAAM6H,EAAM,MAAM,EAC7B,OAAOP,GAAQK,GAAM,QAAQL,CAAI,EAAI,GACvC,CACA,SAASQ,GAAa1C,EAAM,CAC1B,IAAI2C,EAAM/H,GAAMoF,EAAM,WAAW,EACjC,GAAK2C,EAGL,OAAO/H,GAAM+H,EAAK,OAAO,CAC3B,CACA,SAASC,GAASV,EAAK,CACrB,OAAOA,EAAK,CAAC,IAAM,GACrB,CACA,SAASW,GAAMX,EAAK,CAClB,GAAID,GAAQC,CAAI,EAAG,CAEjB,GAAIC,GAAQD,CAAI,EACd,OAAO7I,EAAK6I,CAAI,EAElB,GAAIG,GAAQH,CAAI,EAAG,CACjB,IAAIpC,EAAMtB,GAAI0D,CAAI,EAElB,GAAIM,GAAc1C,CAAG,EACnB,OAAOzG,EAAK,WAAW,EAEzB,IAAIyJ,EAAeJ,GAAa5C,CAAG,EACnC,OAAIgD,EACK3H,GAAQ2H,CAAY,EAEtBhD,CACT,CACA,GAAI8C,GAASV,CAAI,EACf,OAAO/G,GAAQ+G,CAAI,CAEvB,KACE,QAAOA,CAEX,CC3De,SAAAa,GAASC,EAAavM,EAAQ,CAC3CuM,EAAcA,GAAe,CAAA,EAC7B,IAAI5K,EAAO6K,EACX,GAAI,CAACxM,EACH,OAAOuM,EAET,IAAKC,KAAYxM,EACf2B,EAAQ3B,EAAOwM,CAAQ,EACnB7K,IAAU,SACZ4K,EAAYC,CAAQ,EAAI7K,GAG5B,OAAO4K,CACT,CCbe,SAAAE,GAASC,EAAQC,EAAQC,EAAQ,CAC9C,IAAIC,EAAMH,EAASC,EACnB,OAAOC,EAAU,KAAK,KAAK,EAAIC,EAAMA,CAAG,CAC1C,CCHe,SAAAC,GAAS7N,EAAG,CACzB,OAAOA,EAAE,EAAI,GAAK,CACpB,CCEe,SAAA8N,EAAS9N,EAAG,CACzB,OAAQ,KAAK,IAAIA,CAAC,GAAK8E,EAAO9E,EAAKA,EAAK6N,GAAK7N,CAAC,EAAI6E,EACpD,CCJe,SAAAkJ,GAASN,EAAQO,EAAKN,EAAQ,CAC3C,IAAIE,EAAMH,EAASC,EACfO,EAAM,GAAMR,EAChB,OAAAG,EAAM,KAAK,KAAM,EAAIA,IAAQ,EAAIA,GAAOK,CAAG,EACnC,KAAK,IAAI,IAAO5J,EAAU2J,EAAI,EAAIJ,CAC5C,CCLe,SAAAM,GAAST,EAAQU,EAAI,CAIlC,QAHIC,EAAS,GAAMX,EACfG,EAAKS,EACLL,EAAM3J,EAAU,EAAI,KAAK,KAAK8J,CAAE,EAC3BpO,EAAI,EAAGA,GAAK,GAAIA,IAIvB,GAHA6N,EAAMH,EAAS,KAAK,IAAIO,CAAG,EAC3BK,EAAOhK,EAAU,EAAI,KAAK,KAAK8J,EAAM,KAAK,KAAM,EAAIP,IAAQ,EAAIA,GAAOQ,CAAM,CAAE,EAAIJ,EACnFA,GAAOK,EACH,KAAK,IAAIA,CAAI,GAAK,MACpB,OAAOL,EAIX,MAAO,KACT,CCVO,SAASM,IAAO,CACrB,IAAIV,EAAM,KAAK,EAAI,KAAK,EACxB,KAAK,GAAK,EAAIA,EAAMA,EACf,OAAQ,OACX,KAAK,GAAK,GAEP,OAAQ,OACX,KAAK,GAAK,GAEZ,KAAK,EAAI,KAAK,KAAK,KAAK,EAAE,EACtB,KAAK,OACH,KAAK,OACP,KAAK,GAAK,KAAK,IAAI,KAAK,MAAM,EAG9B,KAAK,GAAKJ,GAAM,KAAK,EAAG,KAAK,IAAI,KAAK,MAAM,EAAG,KAAK,IAAI,KAAK,MAAM,CAAC,EAIjE,KAAK,KACJ,KAAK,EACP,KAAK,GAAK,KAAK,EAGf,KAAK,GAAK,EAIlB,CAKO,SAASe,GAAQzI,EAAG,CACzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAEZ,GAAItD,EAAMmC,GAAM,IAAMnC,EAAMmC,GAAM,KAAO6J,EAAM7J,GAAM,KAAO6J,EAAM7J,GAAM,KACtE,OAAO,KAGT,IAAI3E,EAAGC,EACP,GAAI,KAAK,IAAI,KAAK,IAAIuC,CAAG,EAAI6B,CAAO,GAAKI,EACvC,OAAO,KAGP,GAAI,KAAK,OACPzE,EAAI,KAAK,GAAK,KAAK,EAAI,KAAK,GAAK8N,EAAWU,EAAM,KAAK,KAAK,EAC5DvO,EAAI,KAAK,GAAK,KAAK,EAAI,KAAK,GAAK,KAAK,IAAI,KAAK,IAAI2E,EAAS,GAAMpC,CAAG,CAAC,MAEnE,CACH,IAAIkL,EAAS,KAAK,IAAIlL,CAAG,EACrB2L,EAAKJ,GAAM,KAAK,EAAGvL,EAAKkL,CAAM,EAClC1N,EAAI,KAAK,GAAK,KAAK,EAAI,KAAK,GAAK8N,EAAWU,EAAM,KAAK,KAAK,EAC5DvO,EAAI,KAAK,GAAK,KAAK,EAAI,KAAK,GAAK,KAAK,IAAIkO,CAAE,CAC9C,CACA,OAAArI,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CAEX,CAIO,SAAS2I,GAAQ3I,EAAG,CAEzB,IAAI9F,EAAI8F,EAAE,EAAI,KAAK,GACf7F,EAAI6F,EAAE,EAAI,KAAK,GACf0I,EAAKhM,EAET,GAAI,KAAK,OACPA,EAAM6B,EAAU,EAAI,KAAK,KAAK,KAAK,IAAI,CAACpE,GAAK,KAAK,EAAI,KAAK,GAAG,CAAC,MAE5D,CACH,IAAIkO,EAAK,KAAK,IAAI,CAAClO,GAAK,KAAK,EAAI,KAAK,GAAG,EAEzC,GADAuC,EAAM0L,GAAM,KAAK,EAAGC,CAAE,EAClB3L,IAAQ,MACV,OAAO,IAEX,CACA,OAAAgM,EAAMV,EAAW,KAAK,MAAQ9N,GAAK,KAAK,EAAI,KAAK,GAAG,EAEpD8F,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,WAAY,wCAAyC,eAAgB,4BAA6B,MAAM,EAC5H,MAAAC,GAAe,CACb,KAAML,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECnGO,SAASJ,IAAO,CAEvB,CAEA,SAASM,GAASC,EAAI,CACpB,OAAOA,CACT,CAGO,IAAIH,GAAQ,CAAC,UAAW,UAAU,EACzC,MAAAI,GAAe,CACb,KAAMR,GACN,QAASM,GACT,QAASA,GACT,MAAOF,EACT,ECbA,IAAIK,GAAQ,CAACJ,GAAMG,EAAO,EACtBJ,GAAQ,CAAA,EACRM,GAAY,CAAA,EAEhB,SAASC,GAAIC,EAAMnP,EAAG,CACpB,IAAIoP,EAAMH,GAAU,OACpB,OAAKE,EAAK,OAIVF,GAAUG,CAAG,EAAID,EACjBA,EAAK,MAAM,QAAQ,SAASE,EAAG,CAC7BV,GAAMU,EAAE,YAAW,CAAE,EAAID,CAC3B,CAAC,EACM,OAPL,QAAQ,IAAIpP,CAAC,EACN,GAOX,CAIO,SAASsP,GAAI1I,EAAM,CACxB,GAAI,CAACA,EACH,MAAO,GAET,IAAIyI,EAAIzI,EAAK,YAAW,EACxB,GAAI,OAAO+H,GAAMU,CAAC,EAAM,KAAeJ,GAAUN,GAAMU,CAAC,CAAC,EACvD,OAAOJ,GAAUN,GAAMU,CAAC,CAAC,CAE7B,CAEO,SAASE,IAAQ,CACtBP,GAAM,QAAQE,EAAG,CACnB,CACA,MAAAM,GAAe,CACb,MAAOD,GACP,IAAKL,GACL,IAAKI,EACP,ECtCA,IAAItK,EAAU,CAAA,EAEdA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,QACJ,YAAa,YACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,QACJ,YAAa,2BACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,cACJ,YAAa,sBACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,QACJ,YAAa,UACf,EAEAA,EAAQ,KAAO,CACb,EAAG,cACH,EAAG,aACH,YAAa,WACf,EAEAA,EAAQ,KAAO,CACb,EAAG,QACH,GAAI,OACJ,YAAa,qBACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,OACJ,YAAa,0BACf,EAEAA,EAAQ,SAAW,CACjB,EAAG,cACH,EAAG,cACH,YAAa,eACf,EAEAA,EAAQ,OAAS,CACf,EAAG,aACH,GAAI,IACJ,YAAa,4BACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,QACH,GAAI,OACJ,YAAa,iCACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,cACJ,YAAa,mBACf,EAEAA,EAAQ,OAAS,CACf,EAAG,cACH,GAAI,YACJ,YAAa,aACf,EAEAA,EAAQ,SAAW,CACjB,EAAG,cACH,GAAI,YACJ,YAAa,uBACf,EAEAA,EAAQ,OAAS,CACf,EAAG,YACH,EAAG,YACH,YAAa,aACf,EAEAA,EAAQ,OAAS,CACf,EAAG,cACH,GAAI,SACJ,YAAa,kBACf,EAEAA,EAAQ,UAAY,CAClB,EAAG,YACH,EAAG,QACH,GAAI,YACJ,YAAa,mBACf,EAEAA,EAAQ,OAAS,CACf,EAAG,oBACH,GAAI,kBACJ,YAAa,aACf,EAEAA,EAAQ,IAAM,CACZ,EAAG,YACH,GAAI,OACJ,YAAa,iCACf,EAEAA,EAAQ,OAAS,CACf,EAAG,QACH,GAAI,MACJ,YAAa,yBACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,aACH,GAAI,SACJ,YAAa,cACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,cACH,GAAI,SACJ,YAAa,cACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,cACH,GAAI,SACJ,YAAa,cACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,cACH,GAAI,SACJ,YAAa,cACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,cACH,GAAI,SACJ,YAAa,cACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,cACH,GAAI,SACJ,YAAa,2BACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,QACH,GAAI,MACJ,YAAa,8BACf,EAEAA,EAAQ,SAAW,CACjB,EAAG,QACH,GAAI,MACJ,YAAa,cACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,QACH,GAAI,MACJ,YAAa,cACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,QACH,GAAI,MACJ,YAAa,cACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,IACJ,YAAa,OACf,EAEAA,EAAQ,KAAO,CACb,EAAG,QACH,GAAI,IACJ,YAAa,8BACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,OACJ,YAAa,YACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,QACJ,YAAa,YACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,IACJ,YAAa,iBACf,EAEAA,EAAQ,SAAW,CACjB,EAAG,YACH,EAAG,YACH,YAAa,wBACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,QACH,GAAI,QACJ,YAAa,uBACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,MACJ,YAAa,kBACf,EAEAA,EAAQ,OAAS,CACf,EAAG,QACH,EAAG,eACH,YAAa,gBACf,EAEAA,EAAQ,QAAU,CAChB,EAAG,QACH,EAAG,eACH,YAAa,SACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,MACJ,YAAa,QACf,EAEAA,EAAQ,MAAQ,CACd,EAAG,QACH,GAAI,OACJ,YAAa,QACf,EAEAA,EAAQ,KAAO,CACb,EAAG,QACH,GAAI,OACJ,YAAa,QACf,EAEO,IAAIyK,GAAQzK,EAAQ,MAAQ,CACjC,EAAG,QACH,GAAI,cACJ,YAAa,QACf,EAEAA,EAAQ,OAAS,CACf,EAAG,QACH,EAAG,QACH,YAAa,2BACf,ECrQO,SAAS0K,GAAavM,EAAGC,EAAGuM,EAAIC,EAAK,CAC1C,IAAIC,EAAK1M,EAAIA,EACT2M,EAAK1M,EAAIA,EACT2M,GAAMF,EAAKC,GAAMD,EACjBG,EAAI,EACJJ,GACFzM,GAAK,EAAI4M,GAAMxL,GAAQwL,GAAMvL,GAAMuL,EAAKtL,KACxCoL,EAAK1M,EAAIA,EACT4M,EAAK,GAELC,EAAI,KAAK,KAAKD,CAAE,EAElB,IAAIE,GAAOJ,EAAKC,GAAMA,EACtB,MAAO,CACL,GAAIC,EACJ,EAAGC,EACH,IAAKC,CACT,CACA,CACO,SAASC,GAAO/M,EAAGC,EAAGuM,EAAIQ,EAAOD,EAAQ,CAC9C,GAAI,CAAC/M,EAAG,CACN,IAAIiN,EAAUjL,GAAMkL,EAAWF,CAAK,EAC/BC,IACHA,EAAUX,IAEZtM,EAAIiN,EAAQ,EACZhN,EAAIgN,EAAQ,EACZT,EAAKS,EAAQ,EACf,CAEA,OAAIT,GAAM,CAACvM,IACTA,GAAK,EAAM,EAAMuM,GAAMxM,IAErBwM,IAAO,GAAK,KAAK,IAAIxM,EAAIC,CAAC,EAAIsB,KAChCwL,EAAS,GACT9M,EAAID,GAEC,CACL,EAAGA,EACH,EAAGC,EACH,GAAIuM,EACJ,OAAQO,CACZ,CACA,CC/CA,IAAIlL,EAAU,CAAA,EAEdA,EAAQ,MAAQ,CACd,QAAS,QACT,QAAS,QACT,UAAW,OACb,EAEAA,EAAQ,OAAS,CACf,QAAS,yBACT,QAAS,SACT,UAAW,OACb,EAEAA,EAAQ,OAAS,CACf,QAAS,uBACT,QAAS,QACT,UAAW,sCACb,EAEAA,EAAQ,MAAQ,CACd,QAAS,QACT,QAAS,QACT,UAAW,2BACb,EAEAA,EAAQ,MAAQ,CACd,SAAU,2CACV,QAAS,SACT,UAAW,2BACb,EAEAA,EAAQ,QAAU,CAChB,QAAS,0CACT,QAAS,SACT,UAAW,6BACb,EAEAA,EAAQ,SAAW,CACjB,QAAS,mBACT,QAAS,UACT,UAAW,uBACb,EAEAA,EAAQ,cAAgB,CACtB,QAAS,kDACT,QAAS,SACT,UAAW,eACb,EAEAA,EAAQ,OAAS,CACf,QAAS,qDACT,QAAS,OACT,UAAW,gBACb,EAEAA,EAAQ,MAAQ,CACd,QAAS,qDACT,QAAS,WACT,UAAW,cACb,EAEAA,EAAQ,WAAa,CACnB,QAAS,yBACT,QAAS,OACT,UAAW,YACb,EAEAA,EAAQ,OAAS,CACf,QAAS,6CACT,QAAS,OACT,UAAW,iCACb,EAEAA,EAAQ,OAAS,CACf,QAAS,yDACT,QAAS,OACT,UAAW,WACb,EAEAA,EAAQ,OAAS,CACf,QAAS,aACT,QAAS,SACT,UAAW,gBACb,EAEAA,EAAQ,SAAW,CACjB,QAAS,eACT,QAAS,SACT,UAAW,UACb,EAEAA,EAAQ,cAAgB,CACtB,QAAS,cACT,QAAS,SACT,UAAW,uBACb,EAEAA,EAAQ,MAAQ,CACd,QAAS,wDACT,QAAS,OACT,UAAW,4BACb,ECpGA,SAASsL,GAAMC,EAAWC,EAAcrN,EAAGC,EAAG2M,EAAIE,EAAKQ,EAAU,CAC/D,IAAIpG,EAAM,CAAA,EAEV,OAAIkG,IAAc,QAAaA,IAAc,OAC3ClG,EAAI,WAAapG,GAEjBoG,EAAI,WAAarG,GAGfwM,IACFnG,EAAI,aAAemG,EAAa,IAAI,UAAU,GAC1CnG,EAAI,aAAa,CAAC,IAAM,GAAKA,EAAI,aAAa,CAAC,IAAM,GAAKA,EAAI,aAAa,CAAC,IAAM,KACpFA,EAAI,WAAaxG,IAEfwG,EAAI,aAAa,OAAS,IACxBA,EAAI,aAAa,CAAC,IAAM,GAAKA,EAAI,aAAa,CAAC,IAAM,GAAKA,EAAI,aAAa,CAAC,IAAM,GAAKA,EAAI,aAAa,CAAC,IAAM,KACjHA,EAAI,WAAavG,GACjBuG,EAAI,aAAa,CAAC,GAAKhG,GACvBgG,EAAI,aAAa,CAAC,GAAKhG,GACvBgG,EAAI,aAAa,CAAC,GAAKhG,GACvBgG,EAAI,aAAa,CAAC,EAAKA,EAAI,aAAa,CAAC,EAAI,IAAa,IAK5DoG,IACFpG,EAAI,WAAatG,GACjBsG,EAAI,MAAQoG,GAEdpG,EAAI,EAAIlH,EACRkH,EAAI,EAAIjH,EACRiH,EAAI,GAAK0F,EACT1F,EAAI,IAAM4F,EACH5F,CACT,CC9BA,IAAIqG,GAAiB,CAAA,EAMN,SAASC,GAAQtL,EAAKuL,EAAM,CACzC,IAAIC,EAAO,IAAI,SAASD,CAAI,EACxBE,EAAiBC,GAAmBF,CAAI,EACxCG,EAASC,GAAWJ,EAAMC,CAAc,EACxCE,EAAO,UAAY,GACrB,QAAQ,IAAI,qFAAqF,EAEnG,IAAIE,EAAWC,GAAaN,EAAMG,EAAQF,CAAc,EACpDH,EAAU,CAAC,OAAQK,EAAQ,SAAUE,CAAQ,EACjD,OAAAR,GAAerL,CAAG,EAAIsL,EACfA,CACT,CAKO,SAASS,GAAYX,EAAU,CAEpC,GAAIA,IAAa,OAAa,OAAO,KACrC,IAAIY,EAAQZ,EAAS,MAAM,GAAG,EAC9B,OAAOY,EAAM,IAAIC,EAAkB,CACrC,CAEA,SAASA,GAAmB3O,EAAO,CACjC,GAAIA,EAAM,SAAW,EACnB,OAAO,KAET,IAAI4O,EAAW5O,EAAM,CAAC,IAAM,IAI5B,OAHI4O,IACF5O,EAAQA,EAAM,MAAM,CAAC,GAEnBA,IAAU,OACL,CAAC,KAAM,OAAQ,UAAW,CAAC4O,EAAU,KAAM,KAAM,OAAQ,EAAI,EAE/D,CACL,KAAM5O,EACN,UAAW,CAAC4O,EACZ,KAAMb,GAAe/N,CAAK,GAAK,KAC/B,OAAQ,EACZ,CACA,CAEA,SAAS6O,GAAiBC,EAAS,CACjC,OAAQA,EAAU,KAAQ,KAAK,GAAK,GACtC,CAEA,SAASV,GAAmBF,EAAM,CAChC,IAAIa,EAAUb,EAAK,SAAS,EAAG,EAAK,EACpC,OAAIa,IAAY,GACP,IAETA,EAAUb,EAAK,SAAS,EAAG,EAAI,EAC3Ba,IAAY,IACd,QAAQ,KAAK,mEAAmE,EAE3E,GACT,CAEA,SAAST,GAAWJ,EAAMC,EAAgB,CACxC,MAAO,CACL,QAASD,EAAK,SAAS,EAAGC,CAAc,EACxC,eAAgBD,EAAK,SAAS,GAAIC,CAAc,EAChD,UAAWD,EAAK,SAAS,GAAIC,CAAc,EAC3C,UAAWa,GAAad,EAAM,GAAI,EAAM,EAAE,KAAI,EAC9C,kBAAmBA,EAAK,WAAW,IAAKC,CAAc,EACtD,kBAAmBD,EAAK,WAAW,IAAKC,CAAc,EACtD,gBAAiBD,EAAK,WAAW,IAAKC,CAAc,EACpD,gBAAiBD,EAAK,WAAW,IAAKC,CAAc,CACxD,CACA,CAEA,SAASa,GAAad,EAAMtB,EAAOnO,EAAK,CACtC,OAAO,OAAO,aAAa,MAAM,KAAM,IAAI,WAAWyP,EAAK,OAAO,MAAMtB,EAAOnO,CAAG,CAAC,CAAC,CACtF,CAEA,SAAS+P,GAAaN,EAAMG,EAAQF,EAAgB,CAGlD,QAFIc,EAAa,IACbP,EAAQ,CAAA,EACHrR,EAAI,EAAGA,EAAIgR,EAAO,UAAWhR,IAAK,CACzC,IAAI6R,EAAYC,GAAejB,EAAMe,EAAYd,CAAc,EAC3DiB,EAAQC,GAAcnB,EAAMe,EAAYC,EAAWf,CAAc,EACjEmB,EAAiB,KAAK,MACxB,GAAKJ,EAAU,eAAiBA,EAAU,gBAAkBA,EAAU,iBAAiB,EACrFK,EAAiB,KAAK,MACxB,GAAKL,EAAU,cAAgBA,EAAU,eAAiBA,EAAU,gBAAgB,EAEtFR,EAAM,KAAK,CACT,GAAI,CAACG,GAAiBK,EAAU,cAAc,EAAGL,GAAiBK,EAAU,aAAa,CAAC,EAC1F,IAAK,CAACL,GAAiBK,EAAU,iBAAiB,EAAGL,GAAiBK,EAAU,gBAAgB,CAAC,EACjG,IAAK,CAACI,EAAgBC,CAAc,EACpC,MAAOL,EAAU,cACjB,IAAKM,GAASJ,CAAK,CACzB,CAAK,CACH,CACA,OAAOV,CACT,CAEA,SAASc,GAASJ,EAAO,CACvB,OAAOA,EAAM,IAAI,SAAUK,EAAG,CAAC,MAAO,CAACZ,GAAiBY,EAAE,cAAc,EAAGZ,GAAiBY,EAAE,aAAa,CAAC,CAAE,CAAC,CACjH,CAEA,SAASN,GAAejB,EAAMwB,EAAQvB,EAAgB,CACpD,MAAO,CACL,KAAMa,GAAad,EAAMwB,EAAS,EAAGA,EAAS,EAAE,EAAE,KAAI,EACtD,OAAQV,GAAad,EAAMwB,EAAS,GAAIA,EAAS,GAAK,CAAC,EAAE,KAAI,EAC7D,cAAexB,EAAK,WAAWwB,EAAS,GAAIvB,CAAc,EAC1D,cAAeD,EAAK,WAAWwB,EAAS,GAAIvB,CAAc,EAC1D,eAAgBD,EAAK,WAAWwB,EAAS,IAAKvB,CAAc,EAC5D,eAAgBD,EAAK,WAAWwB,EAAS,IAAKvB,CAAc,EAC5D,iBAAkBD,EAAK,WAAWwB,EAAS,IAAKvB,CAAc,EAC9D,kBAAmBD,EAAK,WAAWwB,EAAS,IAAKvB,CAAc,EAC/D,cAAeD,EAAK,SAASwB,EAAS,IAAKvB,CAAc,CAC7D,CACA,CAEA,SAASkB,GAAcnB,EAAMwB,EAAQC,EAAYxB,EAAgB,CAI/D,QAHIyB,EAAcF,EAAS,IACvBG,EAAmB,GACnBC,EAAmB,CAAA,EACdzS,EAAI,EAAGA,EAAIsS,EAAW,cAAetS,IAAK,CACjD,IAAI0S,EAAS,CACX,cAAe7B,EAAK,WAAW0B,EAAcvS,EAAIwS,EAAkB1B,CAAc,EACjF,eAAgBD,EAAK,WAAW0B,EAAcvS,EAAIwS,EAAmB,EAAG1B,CAAc,EACtF,iBAAkBD,EAAK,WAAW0B,EAAcvS,EAAIwS,EAAmB,EAAG1B,CAAc,EACxF,kBAAmBD,EAAK,WAAW0B,EAAcvS,EAAIwS,EAAmB,GAAI1B,CAAc,CAChG,EACI2B,EAAiB,KAAKC,CAAM,CAC9B,CACA,OAAOD,CACT,CCpIA,SAASE,GAAWC,EAAQC,EAAU,CACpC,GAAI,EAAE,gBAAgBF,IACpB,OAAO,IAAIA,GAAWC,CAAO,EAE/BC,EAAWA,GAAY,SAASC,EAAM,CACpC,GAAGA,EACD,MAAMA,CAEV,EACA,IAAIC,EAAOC,GAAUJ,CAAO,EAC5B,GAAG,OAAOG,GAAS,SAAS,CAC1BF,EAASD,CAAO,EAChB,MACF,CACA,IAAIK,EAAUN,GAAW,YAAY,IAAII,EAAK,QAAQ,EACtD,GAAG,CAACE,EAAQ,CACVJ,EAASD,CAAO,EAChB,MACF,CACA,GAAIG,EAAK,WAAaA,EAAK,YAAc,OAAQ,CAC/C,IAAIG,EAAW/N,GAAMgO,EAAOJ,EAAK,SAAS,EACtCG,IACFH,EAAK,aAAeA,EAAK,eAAiBG,EAAS,QAAUA,EAAS,QAAQ,MAAM,GAAG,EAAI,MAC3FH,EAAK,MAAQG,EAAS,QACtBH,EAAK,UAAYG,EAAS,UAAYA,EAAS,UAAYH,EAAK,UAEpE,CACAA,EAAK,GAAKA,EAAK,IAAM,EACrBA,EAAK,KAAOA,EAAK,MAAQ,MACzBA,EAAK,MAAQA,EAAK,OAAS,QAC3BA,EAAK,KAAOA,EAAK,MAAQA,EAAK,KAE9B,IAAIK,EAAUC,GAAUN,EAAK,EAAGA,EAAK,EAAGA,EAAK,GAAIA,EAAK,MAAOA,EAAK,MAAM,EACpEO,EAAMC,GAAgBH,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,GAAIL,EAAK,GAAG,EAChEtC,EAAWW,GAAY2B,EAAK,QAAQ,EACpCS,EAAWT,EAAK,OAASzC,GAAMyC,EAAK,UAAWA,EAAK,aAAcK,EAAQ,EAAGA,EAAQ,EAAGE,EAAI,GAAIA,EAAI,IACtG7C,CAAQ,EAEVnD,GAAO,KAAMyF,CAAI,EACjBzF,GAAO,KAAM2F,CAAO,EAGpB,KAAK,EAAIG,EAAQ,EACjB,KAAK,EAAIA,EAAQ,EACjB,KAAK,GAAKA,EAAQ,GAClB,KAAK,OAASA,EAAQ,OAGtB,KAAK,GAAKE,EAAI,GACd,KAAK,EAAIA,EAAI,EACb,KAAK,IAAMA,EAAI,IAGf,KAAK,MAAQE,EAGb,KAAK,KAAI,EAGTX,EAAS,KAAM,IAAI,CAErB,CACAF,GAAW,YAAcnD,GACzBmD,GAAW,YAAY,MAAK,ECtErB,SAASc,GAAczS,EAAQ0S,EAAM,CAC1C,OAAI1S,EAAO,aAAe0S,EAAK,YAEpB1S,EAAO,IAAM0S,EAAK,GAAK,KAAK,IAAI1S,EAAO,GAAK0S,EAAK,EAAE,EAAI,MADzD,GAKE1S,EAAO,aAAe6C,GACvB7C,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,GAAK1S,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,GAAK1S,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,EACnJ1S,EAAO,aAAe8C,GACvB9C,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,GAAK1S,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,GAAK1S,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,GAAK1S,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,GAAK1S,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,GAAK1S,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,GAAK1S,EAAO,aAAa,CAAC,IAAM0S,EAAK,aAAa,CAAC,EAEjW,EAEX,CAeO,SAASC,GAAqB5N,EAAGgK,EAAI5M,EAAG,CAC7C,IAAIyQ,EAAY7N,EAAE,EACd8N,EAAW9N,EAAE,EACb+N,EAAS/N,EAAE,EAAIA,EAAE,EAAI,EAErBgO,EACAC,EACAC,EACAC,EAOJ,GAAIL,EAAW,CAACvP,GAAWuP,EAAW,OAASvP,EAC7CuP,EAAW,CAACvP,UACHuP,EAAWvP,GAAWuP,EAAW,MAAQvP,EAClDuP,EAAWvP,MACN,IAAIuP,EAAW,CAACvP,EAGrB,MAAO,CAAE,EAAG,KAAW,EAAG,KAAW,EAAGyB,EAAE,CAAC,EACtC,GAAI8N,EAAWvP,EAEpB,MAAO,CAAE,EAAG,IAAU,EAAG,IAAU,EAAGyB,EAAE,CAAC,EAG3C,OAAI6N,EAAY,KAAK,KACnBA,GAAc,EAAI,KAAK,IAEzBI,EAAU,KAAK,IAAIH,CAAQ,EAC3BK,EAAU,KAAK,IAAIL,CAAQ,EAC3BI,EAAWD,EAAUA,EACrBD,EAAK5Q,EAAK,KAAK,KAAK,EAAQ4M,EAAKkE,CAAQ,EAClC,CACL,GAAIF,EAAKD,GAAUI,EAAU,KAAK,IAAIN,CAAS,EAC/C,GAAIG,EAAKD,GAAUI,EAAU,KAAK,IAAIN,CAAS,EAC/C,GAAKG,GAAM,EAAIhE,GAAO+D,GAAUE,CACpC,CACA,CAEO,SAASG,GAAqBpO,EAAGgK,EAAI5M,EAAGC,EAAG,CAGhD,IAAIgR,EAAQ,MACRC,EAAUD,EAAQA,EAClBE,EAAU,GAEVC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAEAC,EAAIrP,EAAE,EACNsP,EAAItP,EAAE,EACNuP,EAAIvP,EAAE,EAAIA,EAAE,EAAI,EAChB6N,EACAC,EACAC,EAMJ,GAJAS,EAAI,KAAK,KAAKa,EAAIA,EAAIC,EAAIA,CAAC,EAC3Bb,EAAK,KAAK,KAAKY,EAAIA,EAAIC,EAAIA,EAAIC,EAAIA,CAAC,EAGhCf,EAAIpR,EAAIiR,GAOV,GAJAR,EAAY,EAIRY,EAAKrR,EAAIiR,EACX,OAAAP,EAAWvP,EACXwP,EAAS,CAAC1Q,EACH,CACL,EAAG2C,EAAE,EACL,EAAGA,EAAE,EACL,EAAGA,EAAE,CACb,OAKI6N,EAAY,KAAK,MAAMyB,EAAGD,CAAC,EAY7BX,EAAKa,EAAId,EACTE,EAAKH,EAAIC,EACTG,EAAK,EAAM,KAAK,KAAK,EAAM5E,GAAM,EAAMA,GAAM2E,EAAKA,CAAE,EACpDI,EAAQJ,GAAM,EAAM3E,GAAM4E,EAC1BI,EAAQN,EAAKE,EACbQ,EAAO,EAIP,GACEA,IACAN,EAAK1R,EAAI,KAAK,KAAK,EAAM4M,EAAKgF,EAAQA,CAAK,EAG3CjB,EAASS,EAAIO,EAAQQ,EAAIP,EAAQF,GAAM,EAAM9E,EAAKgF,EAAQA,GAE1DH,EAAK7E,EAAK8E,GAAMA,EAAKf,GACrBa,EAAK,EAAM,KAAK,KAAK,EAAMC,GAAM,EAAMA,GAAMF,EAAKA,CAAE,EACpDM,EAAON,GAAM,EAAME,GAAMD,EACzBM,EAAOR,EAAKE,EACZO,EAAQD,EAAOH,EAAQE,EAAOD,EAC9BD,EAAQE,EACRD,EAAQE,QAEHC,EAAQA,EAAQb,GAAUc,EAAOb,GAGxC,OAAAT,EAAW,KAAK,KAAKoB,EAAO,KAAK,IAAID,CAAI,CAAC,EACnC,CACL,EAAGpB,EACH,EAAGC,EACH,EAAGC,CACP,CACA,CAYO,SAASyB,GAAkBxP,EAAGyP,EAAYhF,EAAc,CAE7D,GAAIgF,IAAe3R,GAGjB,MAAO,CACL,EAAGkC,EAAE,EAAIyK,EAAa,CAAC,EACvB,EAAGzK,EAAE,EAAIyK,EAAa,CAAC,EACvB,EAAGzK,EAAE,EAAIyK,EAAa,CAAC,CAC7B,EACS,GAAIgF,IAAe1R,GAAY,CACpC,IAAI2R,EAAQjF,EAAa,CAAC,EACtBkF,EAAQlF,EAAa,CAAC,EACtBmF,EAAQnF,EAAa,CAAC,EACtBoF,EAAQpF,EAAa,CAAC,EACtBqF,EAAQrF,EAAa,CAAC,EACtBsF,EAAQtF,EAAa,CAAC,EACtBuF,EAAOvF,EAAa,CAAC,EAGzB,MAAO,CACL,EAAGuF,GAAQhQ,EAAE,EAAI+P,EAAQ/P,EAAE,EAAI8P,EAAQ9P,EAAE,GAAK0P,EAC9C,EAAGM,GAAQD,EAAQ/P,EAAE,EAAIA,EAAE,EAAI6P,EAAQ7P,EAAE,GAAK2P,EAC9C,EAAGK,GAAQ,CAACF,EAAQ9P,EAAE,EAAI6P,EAAQ7P,EAAE,EAAIA,EAAE,GAAK4P,CACrD,CACE,CACF,CAMO,SAASK,GAAoBjQ,EAAGyP,EAAYhF,EAAc,CAE/D,GAAIgF,IAAe3R,GAGjB,MAAO,CACL,EAAGkC,EAAE,EAAIyK,EAAa,CAAC,EACvB,EAAGzK,EAAE,EAAIyK,EAAa,CAAC,EACvB,EAAGzK,EAAE,EAAIyK,EAAa,CAAC,CAC7B,EAES,GAAIgF,IAAe1R,GAAY,CACpC,IAAI2R,EAAQjF,EAAa,CAAC,EACtBkF,EAAQlF,EAAa,CAAC,EACtBmF,EAAQnF,EAAa,CAAC,EACtBoF,EAAQpF,EAAa,CAAC,EACtBqF,EAAQrF,EAAa,CAAC,EACtBsF,EAAQtF,EAAa,CAAC,EACtBuF,EAAOvF,EAAa,CAAC,EACrByF,GAASlQ,EAAE,EAAI0P,GAASM,EACxBG,GAASnQ,EAAE,EAAI2P,GAASK,EACxBI,GAASpQ,EAAE,EAAI4P,GAASI,EAI5B,MAAO,CACL,EAAGE,EAAQH,EAAQI,EAAQL,EAAQM,EACnC,EAAG,CAACL,EAAQG,EAAQC,EAAQN,EAAQO,EACpC,EAAGN,EAAQI,EAAQL,EAAQM,EAAQC,CACzC,CACE,CACF,CCxOA,SAASC,GAAYzP,EAAM,CACzB,OAAQA,IAAS9C,IAAc8C,IAAS7C,EAC1C,CAEe,SAAAuS,GAASrV,EAAQ0S,EAAM7T,EAAO,CAS3C,GAPI4T,GAAczS,EAAQ0S,CAAI,GAO1B1S,EAAO,aAAeiD,IAAeyP,EAAK,aAAezP,GAC3D,OAAOpE,EAIT,IAAIyW,EAAWtV,EAAO,EAClBuV,EAAYvV,EAAO,GACvB,GAAIA,EAAO,aAAe+C,GAAe,CACvC,IAAIyS,EAAgBC,GAAezV,EAAQ,GAAOnB,CAAK,EACvD,GAAI2W,IAAkB,EACpB,OAEFF,EAAWpS,GACXqS,EAAYnS,EACd,CAEA,IAAIsS,EAAShD,EAAK,EACdiD,EAASjD,EAAK,EACdkD,EAAUlD,EAAK,GAQnB,GAPIA,EAAK,aAAe3P,KACtB2S,EAASxS,GACTyS,EAASxS,GACTyS,EAAUxS,IAIRmS,IAAcK,GAAWN,IAAaI,GAAU,CAACN,GAAYpV,EAAO,UAAU,GAAM,CAACoV,GAAY1C,EAAK,UAAU,EAClH,OAAO7T,EAcT,GAVAA,EAAQ8T,GAAqB9T,EAAO0W,EAAWD,CAAQ,EAEnDF,GAAYpV,EAAO,UAAU,IAC/BnB,EAAQ0V,GAAkB1V,EAAOmB,EAAO,WAAYA,EAAO,YAAY,GAErEoV,GAAY1C,EAAK,UAAU,IAC7B7T,EAAQmW,GAAoBnW,EAAO6T,EAAK,WAAYA,EAAK,YAAY,GAEvE7T,EAAQsU,GAAqBtU,EAAO+W,EAASF,EAAQC,CAAM,EAEvDjD,EAAK,aAAe3P,GAAe,CACrC,IAAI8S,EAAsBJ,GAAe/C,EAAM,GAAM7T,CAAK,EAC1D,GAAIgX,IAAwB,EAC1B,MAEJ,CAEA,OAAOhX,CACT,CAEO,SAAS4W,GAAezV,EAAQ0N,EAAS7O,EAAO,CACrD,GAAImB,EAAO,QAAU,MAAQA,EAAO,MAAM,SAAW,EACnD,eAAQ,IAAI,4BAA4B,EACjC,GAMT,QAJI0J,EAAQ,CAAC,EAAG,CAAC7K,EAAM,EAAG,EAAGA,EAAM,CAAC,EAChCiX,EAAS,CAAC,EAAG,OAAO,IAAK,EAAG,OAAO,GAAG,EAEtCC,EAAiB,CAAA,EACZ/W,EAAI,EAAGA,EAAIgB,EAAO,MAAM,OAAQhB,IAAK,CAC5C,IAAIgX,EAAOhW,EAAO,MAAMhB,CAAC,EAEzB,GADA+W,EAAe,KAAKC,EAAK,IAAI,EACzBA,EAAK,OAAQ,CACfF,EAASpM,EACT,KACF,CAEA,GADqBsM,EAAK,UACtBA,EAAK,OAAS,KAAM,CACtB,GAAIA,EAAK,UACP,eAAQ,IAAI,kCAAoCA,EAAK,KAAO,GAAG,EACxD,GAET,QACF,CACA,IAAIC,EAAUD,EAAK,KAAK,SAAS,CAAC,EAE9BE,GAAW,KAAK,IAAID,EAAQ,IAAI,CAAC,CAAC,EAAI,KAAK,IAAIA,EAAQ,IAAI,CAAC,CAAC,GAAK,IAClEE,EAAOF,EAAQ,GAAG,CAAC,EAAIC,EACvBE,EAAOH,EAAQ,GAAG,CAAC,EAAIC,EACvBG,EAAOJ,EAAQ,GAAG,CAAC,GAAKA,EAAQ,IAAI,CAAC,EAAI,GAAKA,EAAQ,IAAI,CAAC,EAAIC,EAC/DI,EAAOL,EAAQ,GAAG,CAAC,GAAKA,EAAQ,IAAI,CAAC,EAAI,GAAKA,EAAQ,IAAI,CAAC,EAAIC,EACnE,GAAI,EAAAE,EAAO1M,EAAM,GAAKyM,EAAOzM,EAAM,GAAK4M,EAAO5M,EAAM,GAAK2M,EAAO3M,EAAM,KAGvEoM,EAASS,GAAkB7M,EAAOgE,EAASuI,CAAO,EAC9C,CAAC,MAAMH,EAAO,CAAC,GACjB,KAEJ,CACA,OAAI,MAAMA,EAAO,CAAC,GAChB,QAAQ,IAAI,mDACV,CAACpM,EAAM,EAAI9F,GAAM,IAAM8F,EAAM,EAAI9F,GAAM,YAAcmS,EAAiB,GAAG,EACpE,KAETlX,EAAM,EAAI,CAACiX,EAAO,EAClBjX,EAAM,EAAIiX,EAAO,EACV,EACT,CAEA,SAASS,GAAkBC,EAAK9I,EAAS+I,EAAI,CAC3C,IAAIC,EAAM,CAAC,EAAG,OAAO,IAAK,EAAG,OAAO,GAAG,EACvC,GAAI,MAAMF,EAAI,CAAC,EAAK,OAAOE,EAC3B,IAAIC,EAAK,CAAC,EAAGH,EAAI,EAAG,EAAGA,EAAI,CAAC,EAC5BG,EAAG,GAAKF,EAAG,GAAG,CAAC,EACfE,EAAG,GAAKF,EAAG,GAAG,CAAC,EACfE,EAAG,EAAI5J,EAAW4J,EAAG,EAAI,KAAK,EAAE,EAAI,KAAK,GACzC,IAAIC,EAAIC,GAAeF,EAAIF,CAAE,EAC7B,GAAI/I,EAAS,CACX,GAAI,MAAMkJ,EAAE,CAAC,EACX,OAAOF,EAETE,EAAE,EAAID,EAAG,EAAIC,EAAE,EACfA,EAAE,EAAID,EAAG,EAAIC,EAAE,EACf,IAAI5X,EAAI,EAAG8X,EAAM,MACbC,EAAKC,EACT,EAAG,CAED,GADAA,EAAMH,GAAeD,EAAGH,CAAE,EACtB,MAAMO,EAAI,CAAC,EAAG,CAChB,QAAQ,IAAI,2FAA2F,EACvG,KACF,CACAD,EAAM,CAAC,EAAGJ,EAAG,GAAKK,EAAI,EAAIJ,EAAE,GAAI,EAAGD,EAAG,GAAKK,EAAI,EAAIJ,EAAE,EAAE,EACvDA,EAAE,GAAKG,EAAI,EACXH,EAAE,GAAKG,EAAI,CACb,OAAS/X,KAAO,KAAK,IAAI+X,EAAI,CAAC,EAAID,GAAO,KAAK,IAAIC,EAAI,CAAC,EAAID,GAC3D,GAAI9X,EAAI,EACN,eAAQ,IAAI,iDAAiD,EACtD0X,EAETA,EAAI,EAAI3J,EAAW6J,EAAE,EAAIH,EAAG,GAAG,CAAC,CAAC,EACjCC,EAAI,EAAIE,EAAE,EAAIH,EAAG,GAAG,CAAC,CACvB,MACO,MAAMG,EAAE,CAAC,IACZF,EAAI,EAAIF,EAAI,EAAII,EAAE,EAClBF,EAAI,EAAIF,EAAI,EAAII,EAAE,GAGtB,OAAOF,CACT,CAEA,SAASG,GAAeL,EAAKC,EAAI,CAC/B,IAAIG,EAAI,CAAC,EAAGJ,EAAI,EAAIC,EAAG,IAAI,CAAC,EAAG,EAAGD,EAAI,EAAIC,EAAG,IAAI,CAAC,CAAC,EAC/CQ,EAAO,CAAC,EAAG,KAAK,MAAML,EAAE,CAAC,EAAG,EAAG,KAAK,MAAMA,EAAE,CAAC,CAAC,EAC9CM,EAAO,CAAC,EAAGN,EAAE,EAAI,EAAMK,EAAK,EAAG,EAAGL,EAAE,EAAI,EAAMK,EAAK,CAAC,EACpDP,EAAK,CAAC,EAAG,OAAO,IAAK,EAAG,OAAO,GAAG,EAClCS,EAIJ,GAHIF,EAAK,EAAI,GAAKA,EAAK,GAAKR,EAAG,IAAI,CAAC,GAGhCQ,EAAK,EAAI,GAAKA,EAAK,GAAKR,EAAG,IAAI,CAAC,EAClC,OAAOC,EAETS,EAAOF,EAAK,EAAIR,EAAG,IAAI,CAAC,EAAKQ,EAAK,EAClC,IAAIG,EAAM,CAAC,EAAGX,EAAG,IAAIU,CAAG,EAAE,CAAC,EAAG,EAAGV,EAAG,IAAIU,CAAG,EAAE,CAAC,CAAC,EAC/CA,IACA,IAAIE,EAAK,CAAC,EAAGZ,EAAG,IAAIU,CAAG,EAAE,CAAC,EAAG,EAAGV,EAAG,IAAIU,CAAG,EAAE,CAAC,CAAC,EAC9CA,GAAOV,EAAG,IAAI,CAAC,EACf,IAAIa,EAAM,CAAC,EAAGb,EAAG,IAAIU,CAAG,EAAE,CAAC,EAAG,EAAGV,EAAG,IAAIU,CAAG,EAAE,CAAC,CAAC,EAC/CA,IACA,IAAII,EAAM,CAAC,EAAGd,EAAG,IAAIU,CAAG,EAAE,CAAC,EAAG,EAAGV,EAAG,IAAIU,CAAG,EAAE,CAAC,CAAC,EAC3CK,EAAMN,EAAK,EAAIA,EAAK,EAAGO,EAAMP,EAAK,GAAK,EAAMA,EAAK,GACpDQ,GAAO,EAAMR,EAAK,IAAM,EAAMA,EAAK,GAAIS,GAAO,EAAMT,EAAK,GAAKA,EAAK,EACrE,OAAAR,EAAI,EAAKgB,EAAMN,EAAI,EAAIK,EAAMJ,EAAI,EAAIM,EAAMJ,EAAI,EAAIC,EAAMF,EAAI,EAC7DZ,EAAI,EAAKgB,EAAMN,EAAI,EAAIK,EAAMJ,EAAI,EAAIM,EAAMJ,EAAI,EAAIC,EAAMF,EAAI,EACtDZ,CACT,CC/Le,SAAAkB,GAASnb,EAAKob,EAAQhZ,EAAO,CAC1C,IAAIiZ,EAAMjZ,EAAM,EACdkZ,EAAMlZ,EAAM,EACZmZ,EAAMnZ,EAAM,GAAK,EACfiG,EAAG8R,EAAG5X,EACNqK,EAAM,CAAA,EACV,IAAKrK,EAAI,EAAGA,EAAI,EAAGA,IACjB,GAAI,EAAA6Y,GAAU7Y,IAAM,GAAKH,EAAM,IAAM,QAwBrC,OArBIG,IAAM,GACR8F,EAAIgT,EACA,KAAK,QAAQrb,EAAI,KAAKuC,CAAC,CAAC,IAAM,GAChC4X,EAAI,IAEJA,EAAI,KAIC5X,IAAM,GACb8F,EAAIiT,EACA,KAAK,QAAQtb,EAAI,KAAKuC,CAAC,CAAC,IAAM,GAChC4X,EAAI,IAEJA,EAAI,MAIN9R,EAAIkT,EACJpB,EAAI,KAEEna,EAAI,KAAKuC,CAAC,EAAC,CACnB,IAAK,IACHqK,EAAIuN,CAAC,EAAI9R,EACT,MACF,IAAK,IACHuE,EAAIuN,CAAC,EAAI,CAAC9R,EACV,MACF,IAAK,IACHuE,EAAIuN,CAAC,EAAI9R,EACT,MACF,IAAK,IACHuE,EAAIuN,CAAC,EAAI,CAAC9R,EACV,MACF,IAAK,IACCjG,EAAM+X,CAAC,IAAM,SACfvN,EAAI,EAAIvE,GAEV,MACF,IAAK,IACCjG,EAAM+X,CAAC,IAAM,SACfvN,EAAI,EAAI,CAACvE,GAEX,MACF,QAEE,OAAO,IACb,CAEE,OAAOuE,CACT,CC5De,SAAA4O,GAAUC,EAAM,CAC7B,IAAI7O,EAAM,CACR,EAAG6O,EAAM,CAAC,EACV,EAAGA,EAAM,CAAC,CACd,EACE,OAAIA,EAAM,OAAO,IACf7O,EAAI,EAAI6O,EAAM,CAAC,GAEbA,EAAM,OAAO,IACf7O,EAAI,EAAI6O,EAAM,CAAC,GAEV7O,CACT,CCZe,SAAA8O,GAAUtZ,EAAO,CAC9BuZ,GAAWvZ,EAAM,CAAC,EAClBuZ,GAAWvZ,EAAM,CAAC,CACpB,CACA,SAASuZ,GAAWC,EAAK,CACvB,GAAI,OAAO,OAAO,UAAa,WAAY,CACzC,GAAI,OAAO,SAASA,CAAG,EACrB,OAEF,MAAM,IAAI,UAAU,oCAAoC,CAC1D,CACA,GAAI,OAAOA,GAAQ,UAAYA,IAAQA,GAAO,CAAC,SAASA,CAAG,EACzD,MAAM,IAAI,UAAU,oCAAoC,CAE5D,CCPA,SAASC,GAAYtY,EAAQ0S,EAAM,CACjC,OACG1S,EAAO,MAAM,aAAe6C,IAAc7C,EAAO,MAAM,aAAe8C,IAAc9C,EAAO,MAAM,aAAe+C,KAAkB2P,EAAK,YAAc,UACpJA,EAAK,MAAM,aAAe7P,IAAc6P,EAAK,MAAM,aAAe5P,IAAc4P,EAAK,MAAM,aAAe3P,KAAkB/C,EAAO,YAAc,OACvJ,CAEe,SAASuY,GAAUvY,EAAQ0S,EAAM7T,EAAO2Z,EAAa,CAClE,IAAIC,EACA,MAAM,QAAQ5Z,CAAK,EACrBA,EAAQ6Z,GAAQ7Z,CAAK,EAGrBA,EAAQ,CACN,EAAGA,EAAM,EACT,EAAGA,EAAM,EACT,EAAGA,EAAM,EACT,EAAGA,EAAM,CACf,EAEE,IAAI8Z,EAAO9Z,EAAM,IAAM,OAavB,GAZAsZ,GAAYtZ,CAAK,EAEbmB,EAAO,OAAS0S,EAAK,OAAS4F,GAAYtY,EAAQ0S,CAAI,IACxD+F,EAAQ,IAAItK,GAAK,OAAO,EACxBtP,EAAQ0Z,GAAUvY,EAAQyY,EAAO5Z,EAAO2Z,CAAW,EACnDxY,EAASyY,GAGPD,GAAexY,EAAO,OAAS,QACjCnB,EAAQ+Y,GAAY5X,EAAQ,GAAOnB,CAAK,GAGtCmB,EAAO,WAAa,UACtBnB,EAAQ,CACN,EAAGA,EAAM,EAAI8E,EACb,EAAG9E,EAAM,EAAI8E,EACb,EAAG9E,EAAM,GAAK,CACpB,UAEQmB,EAAO,WACTnB,EAAQ,CACN,EAAGA,EAAM,EAAImB,EAAO,SACpB,EAAGnB,EAAM,EAAImB,EAAO,SACpB,EAAGnB,EAAM,GAAK,CACtB,GAEIA,EAAQmB,EAAO,QAAQnB,CAAK,EACxB,CAACA,EACH,OAUJ,GANImB,EAAO,iBACTnB,EAAM,GAAKmB,EAAO,gBAIpBnB,EAAQwW,GAAgBrV,EAAO,MAAO0S,EAAK,MAAO7T,CAAK,EACnD,EAACA,EAgCL,OA3BI6T,EAAK,iBACP7T,EAAQ,CACN,EAAGA,EAAM,EAAI6T,EAAK,eAClB,EAAG7T,EAAM,EACT,EAAGA,EAAM,GAAK,CACpB,GAGM6T,EAAK,WAAa,UAEpB7T,EAAQ,CACN,EAAGA,EAAM,EAAI+E,GACb,EAAG/E,EAAM,EAAI+E,GACb,EAAG/E,EAAM,GAAK,CACpB,GAEIA,EAAQ6T,EAAK,QAAQ7T,CAAK,EACtB6T,EAAK,WACP7T,EAAQ,CACN,EAAGA,EAAM,EAAI6T,EAAK,SAClB,EAAG7T,EAAM,EAAI6T,EAAK,SAClB,EAAG7T,EAAM,GAAK,CACtB,IAKM2Z,GAAe9F,EAAK,OAAS,MACxBkF,GAAYlF,EAAM,GAAM7T,CAAK,GAGjC8Z,GACH,OAAO9Z,EAAM,EAERA,EACT,CCvGA,IAAI4Z,GAAQtK,GAAK,OAAO,EAExB,SAASyK,GAAYC,EAAMC,EAAI7W,EAAQuW,EAAa,CAClD,IAAIO,EAAkB1P,EAAK/E,EAC3B,OAAI,MAAM,QAAQrC,CAAM,GACtB8W,EAAmBR,GAAUM,EAAMC,EAAI7W,EAAQuW,CAAW,GAAK,CAAC,EAAG,IAAK,EAAG,GAAG,EAC1EvW,EAAO,OAAS,EACb,OAAO4W,EAAK,KAAS,KAAeA,EAAK,OAAS,WAAe,OAAOC,EAAG,KAAS,KAAeA,EAAG,OAAS,UAC9G,OAAOC,EAAiB,GAAM,SACzB,CAACA,EAAiB,EAAGA,EAAiB,EAAGA,EAAiB,CAAC,EAAE,OAAO9W,EAAO,OAAO,CAAC,CAAC,EAEpF,CAAC8W,EAAiB,EAAGA,EAAiB,EAAG9W,EAAO,CAAC,CAAC,EAAE,OAAOA,EAAO,OAAO,CAAC,CAAC,EAG7E,CAAC8W,EAAiB,EAAGA,EAAiB,CAAC,EAAE,OAAO9W,EAAO,OAAO,CAAC,CAAC,EAGlE,CAAC8W,EAAiB,EAAGA,EAAiB,CAAC,IAGhD1P,EAAMkP,GAAUM,EAAMC,EAAI7W,EAAQuW,CAAW,EAC7ClU,EAAO,OAAO,KAAKrC,CAAM,EACrBqC,EAAK,SAAW,GAGpBA,EAAK,QAAQ,SAAUD,EAAK,CAC1B,GAAK,OAAOwU,EAAK,KAAS,KAAeA,EAAK,OAAS,WAAe,OAAOC,EAAG,KAAS,KAAeA,EAAG,OAAS,WAClH,GAAIzU,IAAQ,KAAOA,IAAQ,KAAOA,IAAQ,IACxC,eAGEA,IAAQ,KAAOA,IAAQ,IACzB,OAGJgF,EAAIhF,CAAG,EAAIpC,EAAOoC,CAAG,CACvB,CAAC,EACMgF,EAEX,CAEA,SAAS2P,GAAUzP,EAAM,CACvB,OAAIA,aAAgB4E,GACX5E,EAELA,EAAK,MACAA,EAAK,MAEP4E,GAAK5E,CAAI,CAClB,CAEA,SAAS0P,GAAMC,EAAUC,EAAQC,EAAO,CACtCF,EAAWF,GAAUE,CAAQ,EAC7B,IAAIG,EAAS,GACTjV,EAYJ,OAXI,OAAO+U,EAAW,KACpBA,EAASD,EACTA,EAAWT,GACXY,EAAS,KACA,OAAOF,EAAO,EAAM,KAAe,MAAM,QAAQA,CAAM,KAChEC,EAAQD,EACRA,EAASD,EACTA,EAAWT,GACXY,EAAS,IAEXF,EAASH,GAAUG,CAAM,EACrBC,EACKR,GAAYM,EAAUC,EAAQC,CAAK,GAE1ChV,EAAM,CACJ,QAAS,SAAUnC,EAAQuW,EAAa,CACtC,OAAOI,GAAYM,EAAUC,EAAQlX,EAAQuW,CAAW,CAC1D,EACA,QAAS,SAAUvW,EAAQuW,EAAa,CACtC,OAAOI,GAAYO,EAAQD,EAAUjX,EAAQuW,CAAW,CAC1D,CACN,EACQa,IACFjV,EAAI,MAAQ+U,GAEP/U,EAEX,CC3EA,IAAIkV,GAAgB,EAQhBC,GAA4B,SAQ5BC,GAAyB,SAEzBC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJtF,GAAI,GACR,MAAAuF,GAAe,CACb,QAASrM,GACT,QAASE,GACT,QAASgL,EACX,EAUO,SAASlL,GAAQsM,EAAIC,EAAU,CACpC,OAAAA,EAAWA,GAAY,EAChBC,GAAOC,GAAQ,CACpB,IAAKH,EAAG,CAAC,EACT,IAAKA,EAAG,CAAC,CACb,CAAG,EAAGC,CAAQ,CACd,CAUO,SAASrM,GAAQmM,EAAM,CAC5B,IAAI7c,EAAOkd,GAAQC,GAAON,EAAK,YAAW,CAAE,CAAC,EAC7C,OAAI7c,EAAK,KAAOA,EAAK,IACZ,CAACA,EAAK,IAAKA,EAAK,IAAKA,EAAK,IAAKA,EAAK,GAAG,EAEzC,CAACA,EAAK,KAAMA,EAAK,OAAQA,EAAK,MAAOA,EAAK,GAAG,CACtD,CAEO,SAAS0b,GAAQmB,EAAM,CAC5B,IAAI7c,EAAOkd,GAAQC,GAAON,EAAK,YAAW,CAAE,CAAC,EAC7C,OAAI7c,EAAK,KAAOA,EAAK,IACZ,CAACA,EAAK,IAAKA,EAAK,GAAG,EAErB,EAAEA,EAAK,KAAOA,EAAK,OAAS,GAAIA,EAAK,IAAMA,EAAK,QAAU,CAAC,CACpE,CAQA,SAASod,GAASC,EAAK,CACrB,OAAQA,GAAO,KAAK,GAAK,IAC3B,CASA,SAASC,GAASC,EAAK,CACrB,MAAQ,MAASA,EAAM,KAAK,GAC9B,CAaA,SAASN,GAAQH,EAAI,CACnB,IAAIU,EAAMV,EAAG,IACTW,EAAOX,EAAG,IACV3X,EAAI,QACJuY,EAAa,UACbC,EAAK,MACLC,EACAC,EACAC,EAAGC,EAAGC,EAAGvB,EAAGwB,EACZC,EAASd,GAASI,CAAG,EACrBW,EAAUf,GAASK,CAAI,EACvBW,EACAC,EAEJA,EAAa,KAAK,OAAOZ,EAAO,KAAO,CAAC,EAAI,EAGxCA,IAAS,MACXY,EAAa,IAIXb,GAAO,IAAQA,EAAM,IAAQC,GAAQ,GAAOA,EAAO,KACrDY,EAAa,IAIXb,GAAO,IAAQA,EAAM,KACnBC,GAAQ,GAAOA,EAAO,EACxBY,EAAa,GAENZ,GAAQ,GAAOA,EAAO,GAC7BY,EAAa,GAENZ,GAAQ,IAAQA,EAAO,GAC9BY,EAAa,GAENZ,GAAQ,IAAQA,EAAO,KAC9BY,EAAa,KAIjBT,GAAcS,EAAa,GAAK,EAAI,IAAM,EAG1CD,EAAgBhB,GAASQ,CAAU,EAEnCC,EAAmBH,GAAe,EAAIA,GAEtCI,EAAI3Y,EAAI,KAAK,KAAK,EAAIuY,EAAa,KAAK,IAAIQ,CAAM,EAAI,KAAK,IAAIA,CAAM,CAAC,EACtEH,EAAI,KAAK,IAAIG,CAAM,EAAI,KAAK,IAAIA,CAAM,EACtCF,EAAIH,EAAkB,KAAK,IAAIK,CAAM,EAAI,KAAK,IAAIA,CAAM,EACxDzB,EAAI,KAAK,IAAIyB,CAAM,GAAKC,EAAUC,GAElCH,EAAI9Y,IAAM,EAAIuY,EAAa,EAAI,EAAIA,EAAaA,EAAa,GAAK,EAAIA,EAAaA,EAAaA,EAAa,KAAOQ,GAAU,EAAIR,EAAa,EAAI,EAAIA,EAAaA,EAAa,GAAK,GAAKA,EAAaA,EAAaA,EAAa,MAAQ,KAAK,IAAI,EAAIQ,CAAM,GAAK,GAAKR,EAAaA,EAAa,IAAM,GAAKA,EAAaA,EAAaA,EAAa,MAAQ,KAAK,IAAI,EAAIQ,CAAM,EAAK,GAAKR,EAAaA,EAAaA,EAAa,KAAQ,KAAK,IAAI,EAAIQ,CAAM,GAE1b,IAAII,EAAcX,EAAKG,GAAKrB,GAAK,EAAIsB,EAAIC,GAAKvB,EAAIA,EAAIA,EAAI,GAAO,EAAI,GAAKsB,EAAIA,EAAIA,EAAI,GAAKC,EAAI,GAAKH,GAAmBpB,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,KAAS,IAEhJ8B,EAAeZ,GAAMM,EAAIH,EAAI,KAAK,IAAII,CAAM,GAAKzB,EAAIA,EAAI,GAAK,EAAIsB,EAAI,EAAIC,EAAI,EAAIA,EAAIA,GAAKvB,EAAIA,EAAIA,EAAIA,EAAI,IAAQ,GAAK,GAAKsB,EAAIA,EAAIA,EAAI,IAAMC,EAAI,IAAMH,GAAmBpB,EAAIA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,MACxM,OAAIe,EAAM,IACRe,GAAe,KAIV,CACL,SAAU,KAAK,MAAMA,CAAW,EAChC,QAAS,KAAK,MAAMD,CAAU,EAC9B,WAAYD,EACZ,WAAYG,GAAoBhB,CAAG,CACvC,CACA,CAiBA,SAASN,GAAQuB,EAAK,CAEpB,IAAIF,EAAcE,EAAI,SAClBH,EAAaG,EAAI,QACjBC,EAAaD,EAAI,WACjBE,EAAaF,EAAI,WAErB,GAAIE,EAAa,GAAKA,EAAa,GACjC,OAAO,KAGT,IAAIhB,EAAK,MACLxY,EAAI,QACJuY,EAAa,UACbG,EACAe,GAAM,EAAI,KAAK,KAAK,EAAIlB,CAAU,IAAM,EAAI,KAAK,KAAK,EAAIA,CAAU,GACpEmB,EAAIC,EAAIC,EAAIC,EAAIC,EAAGhB,EACnBL,EACAsB,EAAIC,EAGJld,EAAIqc,EAAa,IACjBpc,EAAIqc,EAMJG,EAAa,MACfxc,GAAK,KAKP0b,GAAce,EAAa,GAAK,EAAI,IAAM,EAI1Cd,EAAmBH,GAAe,EAAIA,GAEtCO,EAAI/b,EAAIyb,EACRuB,EAAKjB,GAAK9Y,GAAK,EAAIuY,EAAa,EAAI,EAAIA,EAAaA,EAAa,GAAK,EAAIA,EAAaA,EAAaA,EAAa,MAElHyB,EAAUD,GAAM,EAAIN,EAAK,EAAI,GAAKA,EAAKA,EAAKA,EAAK,IAAM,KAAK,IAAI,EAAIM,CAAE,GAAK,GAAKN,EAAKA,EAAK,GAAK,GAAKA,EAAKA,EAAKA,EAAKA,EAAK,IAAM,KAAK,IAAI,EAAIM,CAAE,EAAK,IAAMN,EAAKA,EAAKA,EAAK,GAAM,KAAK,IAAI,EAAIM,CAAE,EAG5LL,EAAK1Z,EAAI,KAAK,KAAK,EAAIuY,EAAa,KAAK,IAAIyB,CAAO,EAAI,KAAK,IAAIA,CAAO,CAAC,EACzEL,EAAK,KAAK,IAAIK,CAAO,EAAI,KAAK,IAAIA,CAAO,EACzCJ,EAAKlB,EAAkB,KAAK,IAAIsB,CAAO,EAAI,KAAK,IAAIA,CAAO,EAC3DH,EAAK7Z,GAAK,EAAIuY,GAAc,KAAK,IAAI,EAAIA,EAAa,KAAK,IAAIyB,CAAO,EAAI,KAAK,IAAIA,CAAO,EAAG,GAAG,EAChGF,EAAIhd,GAAK4c,EAAKlB,GAEd,IAAIlZ,EAAM0a,EAAWN,EAAK,KAAK,IAAIM,CAAO,EAAIH,GAAOC,EAAIA,EAAI,GAAK,EAAI,EAAIH,EAAK,GAAKC,EAAK,EAAIA,EAAKA,EAAK,EAAIlB,GAAmBoB,EAAIA,EAAIA,EAAIA,EAAI,IAAM,GAAK,GAAKH,EAAK,IAAMC,EAAK,GAAKD,EAAKA,EAAK,IAAMjB,EAAkB,EAAIkB,EAAKA,GAAME,EAAIA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,KAC5Pxa,EAAM6Y,GAAS7Y,CAAG,EAElB,IAAIgM,GAAOwO,GAAK,EAAI,EAAIH,EAAKC,GAAME,EAAIA,EAAIA,EAAI,GAAK,EAAI,EAAIF,EAAK,GAAKD,EAAK,EAAIC,EAAKA,EAAK,EAAIlB,EAAkB,GAAKiB,EAAKA,GAAMG,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,KAAO,KAAK,IAAIE,CAAO,EAC1K1O,EAAMmN,EAAaN,GAAS7M,CAAG,EAE/B,IAAInH,EACJ,GAAImV,EAAI,SAAU,CAChB,IAAIW,EAAWlC,GAAQ,CACrB,SAAUuB,EAAI,SAAWA,EAAI,SAC7B,QAASA,EAAI,QAAUA,EAAI,SAC3B,WAAYA,EAAI,WAChB,WAAYA,EAAI,UACtB,CAAK,EACDnV,EAAS,CACP,IAAK8V,EAAS,IACd,MAAOA,EAAS,IAChB,OAAQ3a,EACR,KAAMgM,CACZ,CACE,MAEEnH,EAAS,CACP,IAAK7E,EACL,IAAKgM,CACX,EAEE,OAAOnH,CACT,CAUA,SAASkV,GAAoB/Z,EAAK,CAGhC,IAAI4a,EAAmB,IAEvB,MAAK,KAAM5a,GAASA,GAAO,GACzB4a,EAAmB,IAEX,GAAK5a,GAASA,GAAO,GAC7B4a,EAAmB,IAEX,GAAK5a,GAASA,GAAO,GAC7B4a,EAAmB,IAEX,GAAK5a,GAASA,GAAO,GAC7B4a,EAAmB,IAEX,GAAK5a,GAASA,GAAO,GAC7B4a,EAAmB,IAEX,GAAK5a,GAASA,GAAO,GAC7B4a,EAAmB,IAEX,GAAK5a,GAASA,GAAO,GAC7B4a,EAAmB,IAEX,GAAK5a,GAASA,GAAO,GAC7B4a,EAAmB,IAEX,GAAK5a,GAASA,GAAO,EAC7B4a,EAAmB,IAEX,EAAI5a,GAASA,GAAO,EAC5B4a,EAAmB,IAEX,EAAI5a,GAASA,GAAO,GAC5B4a,EAAmB,IAEX,GAAK5a,GAASA,GAAO,IAC7B4a,EAAmB,IAEX,IAAM5a,GAASA,GAAO,IAC9B4a,EAAmB,IAEX,IAAM5a,GAASA,GAAO,IAC9B4a,EAAmB,IAEX,IAAM5a,GAASA,GAAO,IAC9B4a,EAAmB,IAEX,IAAM5a,GAASA,GAAO,IAC9B4a,EAAmB,IAEX,IAAM5a,GAASA,GAAO,IAC9B4a,EAAmB,IAEX,IAAM5a,GAASA,GAAO,IAC9B4a,EAAmB,IAEX,IAAM5a,GAASA,GAAO,IAC9B4a,EAAmB,IAEX,IAAM5a,GAASA,GAAO,MAC9B4a,EAAmB,KAEdA,CACT,CAWA,SAASrC,GAAOyB,EAAK1B,EAAU,CAE7B,IAAIuC,EAAW,QAAUb,EAAI,QAC3Bc,EAAY,QAAUd,EAAI,SAE5B,OAAOA,EAAI,WAAaA,EAAI,WAAae,GAAUf,EAAI,QAASA,EAAI,SAAUA,EAAI,UAAU,EAAIa,EAAS,OAAOA,EAAS,OAAS,EAAGvC,CAAQ,EAAIwC,EAAU,OAAOA,EAAU,OAAS,EAAGxC,CAAQ,CAClM,CAYA,SAASyC,GAAUC,EAASC,EAAUf,EAAY,CAChD,IAAIgB,EAAUC,GAAkBjB,CAAU,EACtCkB,EAAY,KAAK,MAAMJ,EAAU,GAAM,EACvCK,EAAS,KAAK,MAAMJ,EAAW,GAAM,EAAI,GAC7C,OAAOK,GAAgBF,EAAWC,EAAQH,CAAO,CACnD,CASA,SAASC,GAAkB5d,EAAG,CAC5B,IAAI2d,EAAU3d,EAAIsa,GAClB,OAAIqD,IAAY,IACdA,EAAUrD,IAGLqD,CACT,CAkBA,SAASI,GAAgBC,EAAQC,EAAKC,EAAM,CAE1C,IAAIC,EAAQD,EAAO,EACfE,EAAY7D,GAA0B,WAAW4D,CAAK,EACtDE,EAAY7D,GAAuB,WAAW2D,CAAK,EAGnDG,EAASF,EAAYJ,EAAS,EAC9BO,EAASF,EAAYJ,EACrBO,EAAW,GAEXF,EAAShJ,KACXgJ,EAASA,EAAShJ,GAAImF,GAAI,EAC1B+D,EAAW,KAGTF,IAAW5D,IAAM0D,EAAY1D,IAAK4D,EAAS5D,KAAQ4D,EAAS5D,IAAK0D,EAAY1D,KAAM8D,IACrFF,KAGEA,IAAW3D,IAAMyD,EAAYzD,IAAK2D,EAAS3D,KAAQ2D,EAAS3D,IAAKyD,EAAYzD,KAAM6D,KACrFF,IAEIA,IAAW5D,IACb4D,KAIAA,EAAShJ,KACXgJ,EAASA,EAAShJ,GAAImF,GAAI,GAGxB8D,EAAS3D,IACX2D,EAASA,EAAS3D,GAAIH,GAAI,EAC1B+D,EAAW,IAGXA,EAAW,IAGPD,IAAW7D,IAAQ2D,EAAY3D,IAAO6D,EAAS7D,KAAW6D,EAAS7D,IAAO2D,EAAY3D,KAAO8D,IACjGD,KAGIA,IAAW5D,IAAQ0D,EAAY1D,IAAO4D,EAAS5D,KAAW4D,EAAS5D,IAAO0D,EAAY1D,KAAO6D,KACjGD,IAEIA,IAAW7D,IACb6D,KAIAA,EAAS3D,KACX2D,EAASA,EAAS3D,GAAIH,GAAI,GAG5B,IAAIgE,EAAY,OAAO,aAAaH,CAAM,EAAI,OAAO,aAAaC,CAAM,EACxE,OAAOE,CACT,CAUA,SAAStD,GAAOuD,EAAY,CAE1B,GAAIA,GAAcA,EAAW,SAAW,EACtC,KAAO,mCAWT,QARIC,EAASD,EAAW,OAEpBE,EAAO,KACPC,EAAK,GACLC,EACA9e,EAAI,EAGD,CAAE,QAAS,KAAK8e,EAAWJ,EAAW,OAAO1e,CAAC,CAAC,GAAG,CACvD,GAAIA,GAAK,EACP,KAAO,kCAAoC0e,EAE7CG,GAAMC,EACN9e,GACF,CAEA,IAAI2c,EAAa,SAASkC,EAAI,EAAE,EAEhC,GAAI7e,IAAM,GAAKA,EAAI,EAAI2e,EAGrB,KAAO,kCAAoCD,EAG7C,IAAIhC,EAAagC,EAAW,OAAO1e,GAAG,EAGtC,GAAI0c,GAAc,KAAOA,IAAe,KAAOA,IAAe,KAAOA,GAAc,KAAOA,IAAe,KAAOA,IAAe,IAC7H,KAAO,yBAA2BA,EAAa,iBAAmBgC,EAGpEE,EAAOF,EAAW,UAAU1e,EAAGA,GAAK,CAAC,EAWrC,QATI+e,EAAMnB,GAAkBjB,CAAU,EAElCqC,EAAWC,GAAmBL,EAAK,OAAO,CAAC,EAAGG,CAAG,EACjDG,EAAYC,GAAoBP,EAAK,OAAO,CAAC,EAAGG,CAAG,EAMhDG,EAAYE,GAAe1C,CAAU,GAC1CwC,GAAa,IAIf,IAAIG,EAAYV,EAAS3e,EAEzB,GAAIqf,EAAY,IAAM,EACpB,KAAO;AAAA;AAAA;AAAA,iBAAsKX,EAG/K,IAAIY,EAAMD,EAAY,EAElBE,EAAa,EACbC,EAAc,EACdC,EAAeC,EAAkBC,EAAmBlC,EAASC,EACjE,OAAI4B,EAAM,IACRG,EAAgB,IAAW,KAAK,IAAI,GAAIH,CAAG,EAC3CI,EAAmBhB,EAAW,UAAU1e,EAAGA,EAAIsf,CAAG,EAClDC,EAAa,WAAWG,CAAgB,EAAID,EAC5CE,EAAoBjB,EAAW,UAAU1e,EAAIsf,CAAG,EAChDE,EAAc,WAAWG,CAAiB,EAAIF,GAGhDhC,EAAU8B,EAAaP,EACvBtB,EAAW8B,EAAcN,EAElB,CACL,QAASzB,EACT,SAAUC,EACV,WAAYhB,EACZ,WAAYC,EACZ,SAAU8C,CACd,CACA,CAYA,SAASR,GAAmB,EAAGF,EAAK,CAOlC,QAJIa,EAASrF,GAA0B,WAAWwE,EAAM,CAAC,EACrDc,EAAe,IACfC,EAAe,GAEZF,IAAW,EAAE,WAAW,CAAC,GAAG,CAQjC,GAPAA,IACIA,IAAWlF,IACbkF,IAEEA,IAAWjF,IACbiF,IAEEA,EAAStK,GAAG,CACd,GAAIwK,EACF,KAAO,kBAAoB,EAE7BF,EAASnF,GACTqF,EAAe,EACjB,CACAD,GAAgB,GAClB,CAEA,OAAOA,CACT,CAkBA,SAASV,GAAoB9P,EAAG0P,EAAK,CAEnC,GAAI1P,EAAI,IACN,KAAO,oCAAsCA,EAS/C,QAJI0Q,EAASvF,GAAuB,WAAWuE,EAAM,CAAC,EAClDiB,EAAgB,EAChBF,EAAe,GAEZC,IAAW1Q,EAAE,WAAW,CAAC,GAAG,CAUjC,GATA0Q,IACIA,IAAWrF,IACbqF,IAEEA,IAAWpF,IACboF,IAIEA,EAASnF,GAAG,CACd,GAAIkF,EACF,KAAO,kBAAoBzQ,EAE7B0Q,EAAStF,GACTqF,EAAe,EACjB,CACAE,GAAiB,GACnB,CAEA,OAAOA,CACT,CAYA,SAASZ,GAAe1C,EAAY,CAClC,IAAIgB,EACJ,OAAQhB,EAAU,CAClB,IAAK,IACHgB,EAAW,KACX,MACF,IAAK,IACHA,EAAW,IACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,EACX,MACF,IAAK,IACHA,EAAW,IACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,IAAK,IACHA,EAAW,IACX,MACF,IAAK,IACHA,EAAW,KACX,MACF,QACEA,EAAW,EACf,CACE,GAAIA,GAAY,EACd,OAAOA,EAGP,KAAO,wBAA0BhB,CAGrC,CCvuBA,SAASuD,GAAMhgB,EAAGC,EAAGC,EAAG,CACtB,GAAI,EAAE,gBAAgB8f,IACpB,OAAO,IAAIA,GAAMhgB,EAAGC,EAAGC,CAAC,EAE1B,GAAI,MAAM,QAAQF,CAAC,EACjB,KAAK,EAAIA,EAAE,CAAC,EACZ,KAAK,EAAIA,EAAE,CAAC,EACZ,KAAK,EAAIA,EAAE,CAAC,GAAK,UACT,OAAOA,GAAM,SACrB,KAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,GAAK,UACP,OAAOA,GAAM,UAAY,OAAOC,EAAM,IAAa,CAC5D,IAAI+C,EAAShD,EAAE,MAAM,GAAG,EACxB,KAAK,EAAI,WAAWgD,EAAO,CAAC,EAAG,EAAE,EACjC,KAAK,EAAI,WAAWA,EAAO,CAAC,EAAG,EAAE,EACjC,KAAK,EAAI,WAAWA,EAAO,CAAC,EAAG,EAAE,GAAK,CACxC,MACE,KAAK,EAAIhD,EACT,KAAK,EAAIC,EACT,KAAK,EAAIC,GAAK,EAEhB,QAAQ,KAAK,6DAA6D,CAC5E,CAEA8f,GAAM,SAAW,SAASC,EAAS,CACjC,OAAO,IAAID,GAAMvG,GAAQwG,CAAO,CAAC,CACnC,EACAD,GAAM,UAAU,OAAS,SAASlF,EAAU,CAC1C,OAAOvM,GAAQ,CAAC,KAAK,EAAG,KAAK,CAAC,EAAGuM,CAAQ,CAC3C,EChCA,IAAIoF,GAAM,EACNC,GAAM,IACNC,GAAM,QACNC,GAAM,UACNC,GAAM,gBACNC,GAAM,IACNC,GAAM,OACNC,GAAM,oBACNC,GAAM,oBACNC,GAAM,kBACNC,GAAM,oBACNC,GAAM,YAEK,SAAAC,GAAShR,EAAI,CAC1B,IAAIiR,EAAK,CAAA,EACTA,EAAG,CAAC,EAAIb,GAAMpQ,GAAMqQ,GAAMrQ,GAAMsQ,GAAMtQ,GAAMuQ,GAAMvQ,EAAKwQ,MACvDS,EAAG,CAAC,EAAIjR,GAAMyQ,GAAMzQ,GAAMsQ,GAAMtQ,GAAMuQ,GAAMvQ,EAAKwQ,MACjD,IAAI3I,EAAI7H,EAAKA,EACb,OAAAiR,EAAG,CAAC,EAAIpJ,GAAK6I,GAAM1Q,GAAM2Q,GAAM3Q,EAAK4Q,KACpC/I,GAAK7H,EACLiR,EAAG,CAAC,EAAIpJ,GAAKgJ,GAAM7Q,EAAK8Q,IACxBG,EAAG,CAAC,EAAIpJ,EAAI7H,EAAK+Q,GACVE,CACT,CCvBe,SAAAC,GAAShT,EAAKiT,EAAMC,EAAMH,EAAI,CAC3C,OAAAG,GAAQD,EACRA,GAAQA,EACAF,EAAG,CAAC,EAAI/S,EAAMkT,GAAQH,EAAG,CAAC,EAAIE,GAAQF,EAAG,CAAC,EAAIE,GAAQF,EAAG,CAAC,EAAIE,EAAOF,EAAG,CAAC,IACnF,CCDA,IAAII,GAAW,GAEA,SAAAC,GAASC,EAAKvR,EAAIiR,EAAI,CAGnC,QAFIO,EAAI,GAAK,EAAIxR,GACb9B,EAAMqT,EACDthB,EAAIohB,GAAUphB,EAAG,EAAEA,EAAG,CAC7B,IAAIwhB,EAAI,KAAK,IAAIvT,CAAG,EAChB2J,EAAI,EAAI7H,EAAKyR,EAAIA,EAKrB,GAFA5J,GAAKqJ,GAAQhT,EAAKuT,EAAG,KAAK,IAAIvT,CAAG,EAAG+S,CAAE,EAAIM,IAAQ1J,EAAI,KAAK,KAAKA,CAAC,GAAK2J,EACtEtT,GAAO2J,EACH,KAAK,IAAIA,CAAC,EAAIlT,EAChB,OAAOuJ,CAEX,CAEA,OAAOA,CACT,CCVO,SAASM,IAAO,CACrB,KAAK,GAAK,KAAK,KAAO,OAAY,KAAK,GAAK,EAC5C,KAAK,GAAK,KAAK,KAAO,OAAY,KAAK,GAAK,EAC5C,KAAK,MAAQ,KAAK,QAAU,OAAY,KAAK,MAAQ,EACrD,KAAK,KAAO,KAAK,OAAS,OAAY,KAAK,KAAO,EAE9C,KAAK,KACP,KAAK,GAAKwS,GAAQ,KAAK,EAAE,EACzB,KAAK,IAAME,GAAQ,KAAK,KAAM,KAAK,IAAI,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,IAAI,EAAG,KAAK,EAAE,EAEnF,CAMO,SAASzS,GAAQzI,EAAG,CACzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAER0b,EAAY1T,EAAWU,EAAM,KAAK,KAAK,EACvCZ,EACA5N,EAAGC,EACHwhB,EAAU,KAAK,IAAIjf,CAAG,EACtBkf,EAAU,KAAK,IAAIlf,CAAG,EAE1B,GAAK,KAAK,GA8BL,CACH,IAAImf,EAAKD,EAAUF,EACfI,EAAM,KAAK,IAAID,EAAI,CAAC,EACpBlf,EAAI,KAAK,IAAM,KAAK,IAAIif,EAAS,CAAC,EAClCG,EAAK,KAAK,IAAIpf,EAAG,CAAC,EAClBqf,EAAK,KAAK,IAAIJ,CAAO,EAAIjd,EAAQ,KAAK,IAAIjC,CAAG,EAAI,EACjDmV,EAAI,KAAK,IAAImK,EAAI,CAAC,EAClB3T,EAAK,KAAK,IAAIwJ,EAAG,CAAC,EACtB/J,EAAM,EAAI,KAAK,GAAK,KAAK,IAAI6T,EAAS,CAAC,EACvCE,EAAKA,EAAK,KAAK,KAAK/T,CAAG,EACvB,IAAImU,EAAKf,GAAQxe,EAAKif,EAASC,EAAS,KAAK,EAAE,EAE/C1hB,EAAI,KAAK,GAAK,KAAK,GAAK2hB,GAAM,EAC5BC,EAAM,GAAK,EAAIjK,EAAIlV,EACnBmf,EAAM,IAAM,EAAI,GAAKjK,EAAIxJ,EAAK,GAAK1L,EAAI,GAAKkV,EAAIlV,EAChDmf,EAAM,IAAM,GAAK,IAAMzT,EAAKA,EAAKwJ,EAAI,IAAMA,OAC3C,KAAK,GAEP1X,EAAI,KAAK,GAAK,KAAK,IAAM8hB,EAAK,KAAK,IACjCN,EAAUD,EAAYG,EAAK,GAAK,EAChCC,EAAM,IAAM,EAAIjK,EAAI,EAAIlV,EAAI,EAAIof,EAChCD,EAAM,IAAM,GAAKzT,EAAK,GAAKwJ,EAAI,IAAMlV,EAAI,IAAMkV,EAAIlV,EACnDmf,EAAM,IAAM,KAAO,IAAMzT,EAAKA,EAAKwJ,EAAI,KAAOA,QAC9C,KAAK,EACT,KAtDc,CACZ,IAAIxU,EAAIue,EAAU,KAAK,IAAIF,CAAS,EAEpC,GAAK,KAAK,IAAI,KAAK,IAAIre,CAAC,EAAI,CAAC,EAAKsB,EAChC,MAAQ,IAOR,GAJAzE,EAAI,GAAM,KAAK,EAAI,KAAK,GAAK,KAAK,KAAK,EAAImD,IAAM,EAAIA,EAAE,EAAI,KAAK,GAChElD,EAAIyhB,EAAU,KAAK,IAAIF,CAAS,EAAI,KAAK,KAAK,EAAI,KAAK,IAAIre,EAAG,CAAC,CAAC,EAChEA,EAAI,KAAK,IAAIlD,CAAC,EAEVkD,GAAK,EAAG,CACV,GAAKA,EAAI,EAAKsB,EACZ,MAAQ,IAGRxE,EAAI,CAER,MAEEA,EAAI,KAAK,KAAKA,CAAC,EAGbuC,EAAM,IACRvC,EAAI,CAACA,GAGPA,EAAI,KAAK,EAAI,KAAK,IAAMA,EAAI,KAAK,MAAQ,KAAK,EAElD,CA2BA,OAAA6F,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EAEC6F,CACT,CAKO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAI8H,EAAKI,EACLxL,EAAKgM,EACLxO,GAAK8F,EAAE,EAAI,KAAK,KAAO,EAAI,KAAK,GAChC7F,GAAK6F,EAAE,EAAI,KAAK,KAAO,EAAI,KAAK,GAEpC,GAAK,KAAK,GAuBR,GAHA8H,EAAM,KAAK,IAAM3N,EAAI,KAAK,GAC1B+N,EAAMoT,GAAYxT,EAAK,KAAK,GAAI,KAAK,EAAE,EAEnC,KAAK,IAAII,CAAG,EAAI3J,EAAS,CAC3B,IAAIod,EAAU,KAAK,IAAIzT,CAAG,EACtB0T,EAAU,KAAK,IAAI1T,CAAG,EACtBgU,EAAU,KAAK,IAAIN,CAAO,EAAIjd,EAAQ,KAAK,IAAIuJ,CAAG,EAAI,EACtDvL,EAAI,KAAK,IAAM,KAAK,IAAIif,EAAS,CAAC,EAClCG,EAAK,KAAK,IAAIpf,EAAG,CAAC,EAClBkV,EAAI,KAAK,IAAIqK,EAAS,CAAC,EACvB7T,EAAK,KAAK,IAAIwJ,EAAG,CAAC,EACtB/J,EAAM,EAAI,KAAK,GAAK,KAAK,IAAI6T,EAAS,CAAC,EACvC,IAAIngB,EAAItB,EAAI,KAAK,KAAK4N,CAAG,EAAI,KAAK,GAC9BqU,EAAK,KAAK,IAAI3gB,EAAG,CAAC,EACtBsM,EAAMA,EAAMoU,EAEZxf,EAAMwL,EAAOJ,EAAMqU,GAAM,EAAI,KAAK,IAAO,IAAO,EAC9CA,EAAK,IAAM,EAAI,EAAItK,EAAI,EAAIlV,EAAIkV,EAAIlV,EAAI,EAAIof,EAC3CI,EAAK,IAAM,GAAK,GAAKtK,EAAI,IAAMlV,EAAIkV,EAAI,GAAKxJ,EAAK,GAAK1L,EACtDwf,EAAK,IAAM,KAAO,KAAOtK,EAAI,KAAOxJ,EAAK,KAAOA,EAAKwJ,MAEvDnJ,EAAMV,EAAW,KAAK,MAASxM,GAAK,EAClC2gB,EAAK,GAAK,EAAI,EAAItK,EAAIlV,EACtBwf,EAAK,IAAM,EAAI,GAAKtK,EAAI,GAAKxJ,EAAK,EAAI1L,EAAIkV,EAAI,EAAIlV,EAClDwf,EAAK,IAAM,GAAK,IAAMtK,EAAI,KAAOxJ,EAAK,IAAMA,EAAKwJ,MAAQ+J,CAAQ,CACrE,MAEElf,EAAM6B,EAAUwJ,GAAK5N,CAAC,EACtBuO,EAAM,MAhDI,CACZ,IAAI0T,EAAI,KAAK,IAAIliB,EAAI,KAAK,EAAE,EACxBmiB,EAAI,IAAOD,EAAI,EAAIA,GACnBE,EAAO,KAAK,KAAOniB,EAAI,KAAK,GAC5BoiB,EAAI,KAAK,IAAID,CAAI,EACrBxU,EAAM,KAAK,MAAM,EAAI,KAAK,IAAIyU,EAAG,CAAC,IAAM,EAAI,KAAK,IAAIF,EAAG,CAAC,EAAE,EAC3D3f,EAAM,KAAK,KAAKoL,CAAG,EAEf3N,EAAI,IACNuC,EAAM,CAACA,GAGJ2f,IAAM,GAAOE,IAAM,EACtB7T,EAAM,EAGNA,EAAMV,EAAW,KAAK,MAAMqU,EAAGE,CAAC,EAAI,KAAK,KAAK,CAElD,CAkCA,OAAAvc,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EAECsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,2BAA4B,0BAA0B,EAC1E,MAAA4T,GAAe,CACb,KAAMhU,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EC5Ke,SAAA6T,GAASviB,EAAG,CACzB,IAAImS,EAAI,KAAK,IAAInS,CAAC,EAClB,OAAAmS,GAAKA,EAAI,EAAIA,GAAK,EACXA,CACT,CCJe,SAAAqQ,GAASxiB,EAAGC,EAAG,CAC5BD,EAAI,KAAK,IAAIA,CAAC,EACdC,EAAI,KAAK,IAAIA,CAAC,EACd,IAAIiD,EAAI,KAAK,IAAIlD,EAAGC,CAAC,EACjBkD,EAAI,KAAK,IAAInD,EAAGC,CAAC,GAAKiD,GAAQ,GAElC,OAAOA,EAAI,KAAK,KAAK,EAAI,KAAK,IAAIC,EAAG,CAAC,CAAC,CACzC,CCPe,SAAAsf,GAASziB,EAAG,CACzB,IAAIC,EAAI,EAAID,EACRE,EAAID,EAAI,EAEZ,OAAOC,IAAM,EAAIF,EAAIA,EAAI,KAAK,IAAIC,CAAC,EAAIC,CACzC,CCFe,SAAAwiB,GAAS1iB,EAAG,CACzB,IAAIC,EAAI,KAAK,IAAID,CAAC,EAClB,OAAAC,EAAIwiB,GAAOxiB,GAAK,EAAIA,GAAKuiB,GAAM,EAAGviB,CAAC,EAAI,GAAG,EAEnCD,EAAI,EAAI,CAACC,EAAIA,CACtB,CCRe,SAAA0iB,GAASC,EAAIC,EAAG,CAO7B,QANIC,EAAS,EAAI,KAAK,IAAI,EAAID,CAAC,EAC3B9iB,EAAI6iB,EAAG,OAAS,EAChBG,EAAKH,EAAG7iB,CAAC,EACTijB,EAAK,EACLX,EAEG,EAAEtiB,GAAK,GACZsiB,EAAI,CAACW,EAAKF,EAASC,EAAKH,EAAG7iB,CAAC,EAC5BijB,EAAKD,EACLA,EAAKV,EAGP,OAAQQ,EAAIR,EAAI,KAAK,IAAI,EAAIQ,CAAC,CAChC,CCde,SAAAI,GAASL,EAAIM,EAAO,CAOjC,QANI/Q,EAAI,EAAI,KAAK,IAAI+Q,CAAK,EACtBnjB,EAAI6iB,EAAG,OAAS,EAChBO,EAAMP,EAAG7iB,CAAC,EACVqjB,EAAM,EACNC,EAEG,EAAEtjB,GAAK,GACZsjB,EAAK,CAACD,EAAMjR,EAAIgR,EAAMP,EAAG7iB,CAAC,EAC1BqjB,EAAMD,EACNA,EAAME,EAGR,OAAO,KAAK,IAAIH,CAAK,EAAIG,CAC3B,CCde,SAAAC,GAAStjB,EAAG,CACzB,IAAImS,EAAI,KAAK,IAAInS,CAAC,EAClB,OAAAmS,GAAKA,EAAI,EAAIA,GAAK,EACXA,CACT,CCDe,SAAAoR,GAASX,EAAIM,EAAOM,EAAO,CAexC,QAdIC,EAAY,KAAK,IAAIP,CAAK,EAC1BQ,EAAY,KAAK,IAAIR,CAAK,EAC1BS,EAAapB,GAAKiB,CAAK,EACvBI,EAAaN,GAAKE,CAAK,EACvB,EAAI,EAAIE,EAAYE,EACpB7jB,EAAI,GAAK0jB,EAAYE,EACrBE,EAAIjB,EAAG,OAAS,EAChBS,EAAKT,EAAGiB,CAAC,EACTC,EAAM,EACNX,EAAM,EACNY,EAAK,EACLX,EACAY,EAEG,EAAEH,GAAK,GACZT,EAAMD,EACNa,EAAMF,EACNX,EAAME,EACNS,EAAMC,EACNV,EAAK,CAACD,EAAM,EAAID,EAAMpjB,EAAI+jB,EAAMlB,EAAGiB,CAAC,EACpCE,EAAK,CAACC,EAAMjkB,EAAIojB,EAAM,EAAIW,EAG5B,SAAIL,EAAYG,EAChB7jB,EAAI2jB,EAAYC,EAET,CAAC,EAAIN,EAAKtjB,EAAIgkB,EAAI,EAAIA,EAAKhkB,EAAIsjB,CAAE,CAC1C,CCnBO,SAAS/U,IAAO,CACrB,GAAI,CAAC,KAAK,SAAW,MAAM,KAAK,EAAE,GAAK,KAAK,IAAM,GAChD,MAAM,IAAI,MAAM,oIAAoI,EAElJ,KAAK,SAEPgU,GAAM,KAAK,MAAM,IAAI,EACrB,KAAK,QAAUA,GAAM,QACrB,KAAK,QAAUA,GAAM,SAGvB,KAAK,GAAK,KAAK,KAAO,OAAY,KAAK,GAAK,EAC5C,KAAK,GAAK,KAAK,KAAO,OAAY,KAAK,GAAK,EAC5C,KAAK,MAAQ,KAAK,QAAU,OAAY,KAAK,MAAQ,EACrD,KAAK,KAAO,KAAK,OAAS,OAAY,KAAK,KAAO,EAElD,KAAK,IAAM,CAAA,EACX,KAAK,IAAM,CAAA,EACX,KAAK,IAAM,CAAA,EACX,KAAK,IAAM,CAAA,EAEX,IAAIJ,EAAI,KAAK,IAAM,EAAI,KAAK,KAAK,EAAI,KAAK,EAAE,GACxC9S,EAAI8S,GAAK,EAAIA,GACb+B,EAAK7U,EAET,KAAK,IAAI,CAAC,EAAIA,GAAK,EAAIA,GAAK,GAAK,EAAIA,GAAK,GAAKA,GAAK,IAAM,GAAKA,GAAK,GAAK,GAAKA,GAAK,MAAQ,UAC3F,KAAK,IAAI,CAAC,EAAIA,GAAK,GAAKA,GAAM,EAAI,EAAIA,GAAM,EAAI,EAAIA,GAAK,IAAM,GAAKA,GAAK,GAAK,GAAKA,GAAK,KAAO,WAE/F6U,EAAKA,EAAK7U,EACV,KAAK,IAAI,CAAC,EAAI6U,GAAM,EAAI,EAAI7U,GAAK,GAAK,EAAIA,GAAK,KAAO,GAAKA,GAAK,KAAO,IAAMA,GAAK,KAAO,SACzF,KAAK,IAAI,CAAC,EAAI6U,GAAM,EAAI,EAAI7U,GAAK,IAAM,GAAKA,GAAM,IAAM,EAAIA,GAAK,IAAM,IAAMA,GAAK,MAAQ,SAE1F6U,EAAKA,EAAK7U,EACV,KAAK,IAAI,CAAC,EAAI6U,GAAM,GAAK,GAAK7U,GAAK,KAAO,GAAKA,GAAK,MAAQ,IAAMA,GAAK,MAAQ,SAC/E,KAAK,IAAI,CAAC,EAAI6U,GAAM,IAAM,GAAK7U,GAAK,GAAK,GAAKA,GAAK,EAAI,EAAIA,GAAK,OAAS,SAEzE6U,EAAKA,EAAK7U,EACV,KAAK,IAAI,CAAC,EAAI6U,GAAM,KAAO,IAAM7U,GAAK,KAAO,GAAKA,GAAK,QAAU,SACjE,KAAK,IAAI,CAAC,EAAI6U,GAAM,KAAO,IAAM7U,GAAK,IAAM,EAAIA,GAAM,OAAS,SAE/D6U,EAAKA,EAAK7U,EACV,KAAK,IAAI,CAAC,EAAI6U,GAAM,KAAO,IAAM7U,GAAK,QAAU,OAChD,KAAK,IAAI,CAAC,EAAI6U,GAAM,KAAO,IAAM7U,GAAK,OAAS,QAE/C6U,EAAKA,EAAK7U,EACV,KAAK,IAAI,CAAC,EAAI6U,GAAM,OAAS,OAC7B,KAAK,IAAI,CAAC,EAAIA,GAAM,OAAS,QAE7BA,EAAK,KAAK,IAAI7U,EAAG,CAAC,EAClB,KAAK,GAAK,KAAK,IAAM,EAAIA,IAAM,EAAI6U,GAAM,EAAI,EAAIA,GAAM,EAAI,GAAKA,EAAK,OAErE,KAAK,IAAI,CAAC,EAAI7U,GAAK,IAAOA,GAAM,EAAI,EAAIA,GAAK,IAAM,GAAKA,GAAM,EAAI,IAAMA,GAAK,GAAK,IAAMA,GAAK,OAAS,aACtG,KAAK,IAAI,CAAC,EAAIA,GAAK,GAAMA,GAAK,GAAK,EAAIA,GAAK,EAAI,GAAKA,GAAK,GAAK,IAAMA,GAAK,KAAO,IAAMA,GAAK,KAAO,YAEnG,KAAK,IAAI,CAAC,EAAI6U,GAAM,GAAK,GAAK7U,GAAK,GAAK,GAAKA,GAAK,IAAM,KAAOA,GAAK,IAAM,IAAMA,GAAK,QAAU,aAC/F,KAAK,IAAI,CAAC,EAAI6U,GAAM,GAAK,GAAK7U,GAAK,GAAK,EAAIA,GAAK,IAAM,KAAOA,GAAK,IAAM,IAAMA,GAAK,SAAW,aAE/F6U,EAAKA,EAAK7U,EACV,KAAK,IAAI,CAAC,EAAI6U,GAAM,IAAM,IAAM7U,GAAK,GAAK,IAAMA,GAAK,IAAM,KAAOA,GAAK,MAAQ,UAC/E,KAAK,IAAI,CAAC,EAAI6U,GAAM,GAAK,IAAM7U,GAAK,KAAO,IAAMA,GAAK,MAAQ,MAAQA,GAAK,OAAS,WAEpF6U,EAAKA,EAAK7U,EACV,KAAK,IAAI,CAAC,EAAI6U,GAAM,MAAQ,OAAS7U,GAAK,GAAK,IAAMA,GAAK,OAAS,WACnE,KAAK,IAAI,CAAC,EAAI6U,GAAM,MAAQ,OAAS7U,GAAK,KAAO,IAAMA,GAAK,QAAU,WAEtE6U,EAAKA,EAAK7U,EACV,KAAK,IAAI,CAAC,EAAI6U,GAAM,MAAQ,OAAS7U,GAAK,OAAS,UACnD,KAAK,IAAI,CAAC,EAAI6U,GAAM,MAAQ,MAAQ7U,GAAK,SAAW,UAEpD6U,EAAKA,EAAK7U,EACV,KAAK,IAAI,CAAC,EAAI6U,GAAM,UAAY,WAChC,KAAK,IAAI,CAAC,EAAIA,GAAM,UAAY,WAEhC,IAAI5O,EAAIsN,GAAK,KAAK,IAAK,KAAK,IAAI,EAChC,KAAK,GAAK,CAAC,KAAK,IAAMtN,EAAI4N,GAAM,KAAK,IAAK,EAAI5N,CAAC,EACjD,CAEO,SAAS9G,GAAQzI,EAAG,CACzB,IAAIoe,EAAKpW,EAAWhI,EAAE,EAAI,KAAK,KAAK,EAChCqe,EAAKre,EAAE,EAEXqe,EAAKxB,GAAK,KAAK,IAAKwB,CAAE,EACtB,IAAIC,EAAS,KAAK,IAAID,CAAE,EACpBE,EAAS,KAAK,IAAIF,CAAE,EACpBG,EAAS,KAAK,IAAIJ,CAAE,EACpBK,EAAS,KAAK,IAAIL,CAAE,EAExBC,EAAK,KAAK,MAAMC,EAAQG,EAASF,CAAM,EACvCH,EAAK,KAAK,MAAMI,EAASD,EAAQ7B,GAAM4B,EAAQC,EAASE,CAAM,CAAC,EAC/DL,EAAKxB,GAAO,KAAK,IAAIwB,CAAE,CAAC,EAExB,IAAIM,EAAMjB,GAAY,KAAK,IAAK,EAAIY,EAAI,EAAID,CAAE,EAE9CC,EAAKA,EAAKK,EAAI,CAAC,EACfN,EAAKA,EAAKM,EAAI,CAAC,EAEf,IAAIxkB,EACAC,EAEJ,OAAI,KAAK,IAAIikB,CAAE,GAAK,gBAClBlkB,EAAI,KAAK,GAAK,KAAK,GAAKkkB,GAAM,KAAK,GACnCjkB,EAAI,KAAK,GAAK,KAAK,GAAKkkB,EAAK,KAAK,IAAM,KAAK,KAG7CnkB,EAAI,IACJC,EAAI,KAGN6F,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EAEC6F,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAIoe,GAAMpe,EAAE,EAAI,KAAK,KAAO,EAAI,KAAK,GACjCqe,GAAMre,EAAE,EAAI,KAAK,KAAO,EAAI,KAAK,GAErCqe,GAAMA,EAAK,KAAK,IAAM,KAAK,GAC3BD,EAAKA,EAAK,KAAK,GAEf,IAAI1V,EACAhM,EAEJ,GAAI,KAAK,IAAI0hB,CAAE,GAAK,eAAgB,CAClC,IAAIM,EAAMjB,GAAY,KAAK,IAAK,EAAIY,EAAI,EAAID,CAAE,EAE9CC,EAAKA,EAAKK,EAAI,CAAC,EACfN,EAAKA,EAAKM,EAAI,CAAC,EACfN,EAAK,KAAK,KAAK3B,GAAK2B,CAAE,CAAC,EAEvB,IAAIE,EAAS,KAAK,IAAID,CAAE,EACpBE,EAAS,KAAK,IAAIF,CAAE,EACpBG,EAAS,KAAK,IAAIJ,CAAE,EACpBK,EAAS,KAAK,IAAIL,CAAE,EAExBC,EAAK,KAAK,MAAMC,EAASG,EAAQ/B,GAAM8B,EAAQC,EAASF,CAAM,CAAC,EAC/DH,EAAK,KAAK,MAAMI,EAAQC,EAASF,CAAM,EAEvC7V,EAAMV,EAAWoW,EAAK,KAAK,KAAK,EAChC1hB,EAAMmgB,GAAK,KAAK,IAAKwB,CAAE,CACzB,MAEE3V,EAAM,IACNhM,EAAM,IAGR,OAAAsD,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EAECsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,+BAAgC,+BAAgC,SAAU,sBAAuB,sBAAuB,OAAO,EACnJ,MAAA+V,GAAe,CACb,KAAMnW,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECzKe,SAAAgW,GAASC,EAAMnW,EAAK,CACjC,GAAImW,IAAS,OAAW,CAGtB,GAFAA,EAAO,KAAK,OAAO7W,EAAWU,CAAG,EAAI,KAAK,IAAM,GAAK,KAAK,EAAE,EAAI,EAE5DmW,EAAO,EACT,MAAO,GACF,GAAIA,EAAO,GAChB,MAAO,GAEX,CACA,OAAOA,CACT,CCXO,IAAIC,GAAY,SAIhB,SAAStW,IAAO,CACrB,IAAIqW,EAAOD,GAAY,KAAK,KAAM,KAAK,KAAK,EAC5C,GAAIC,IAAS,OACX,MAAM,IAAI,MAAM,kBAAkB,EAEpC,KAAK,KAAO,EACZ,KAAK,OAAW,EAAI,KAAK,IAAIA,CAAI,EAAK,KAAOjgB,EAC7C,KAAK,GAAK,IACV,KAAK,GAAK,KAAK,SAAW,IAAW,EACrC,KAAK,GAAK,MAEV+f,GAAO,KAAK,MAAM,IAAI,EACtB,KAAK,QAAUA,GAAO,QACtB,KAAK,QAAUA,GAAO,OACxB,CAEO,IAAI/V,GAAQ,CAAC,uCAAwC,KAAK,EACjE,MAAA8N,GAAe,CACb,KAAMlO,GACN,MAAOI,GACP,UAAWkW,EACb,EC3Be,SAAAC,GAASC,EAAOC,EAAK,CAClC,OAAQ,KAAK,KAAK,EAAID,IAAU,EAAIA,GAAQC,CAAG,CACjD,CCDA,IAAI5D,GAAW,GAGR,SAAS7S,IAAO,CACrB,IAAI2S,EAAO,KAAK,IAAI,KAAK,IAAI,EACzBC,EAAO,KAAK,IAAI,KAAK,IAAI,EAC7BA,GAAQA,EACR,KAAK,GAAK,KAAK,KAAK,EAAI,KAAK,EAAE,GAAK,EAAI,KAAK,GAAKD,EAAOA,GACzD,KAAK,EAAI,KAAK,KAAK,EAAI,KAAK,GAAKC,EAAOA,GAAQ,EAAI,KAAK,GAAG,EAC5D,KAAK,MAAQ,KAAK,KAAKD,EAAO,KAAK,CAAC,EACpC,KAAK,OAAS,GAAM,KAAK,EAAI,KAAK,EAClC,KAAK,EAAI,KAAK,IAAI,GAAM,KAAK,MAAQrc,CAAM,GAAK,KAAK,IAAI,KAAK,IAAI,GAAM,KAAK,KAAOA,CAAM,EAAG,KAAK,CAAC,EAAIigB,GAAK,KAAK,EAAI5D,EAAM,KAAK,MAAM,EACxI,CAEO,SAAS1S,GAAQzI,EAAG,CACzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAEZ,OAAAA,EAAE,EAAI,EAAI,KAAK,KAAK,KAAK,EAAI,KAAK,IAAI,KAAK,IAAI,GAAMtD,EAAMoC,CAAM,EAAG,KAAK,CAAC,EAAIigB,GAAK,KAAK,EAAI,KAAK,IAAIriB,CAAG,EAAG,KAAK,MAAM,CAAC,EAAI6B,EAC3HyB,EAAE,EAAI,KAAK,EAAI0I,EACR1I,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CAKzB,QAJIkf,EAAU,MACVxW,EAAM1I,EAAE,EAAI,KAAK,EACjBtD,EAAMsD,EAAE,EACRsT,EAAM,KAAK,IAAI,KAAK,IAAI,GAAM5W,EAAMoC,CAAM,EAAI,KAAK,EAAG,EAAI,KAAK,CAAC,EAC3D7E,EAAIohB,GAAUphB,EAAI,IACzByC,EAAM,EAAI,KAAK,KAAK4W,EAAMyL,GAAK,KAAK,EAAI,KAAK,IAAI/e,EAAE,CAAC,EAAG,IAAQ,KAAK,CAAC,CAAC,EAAIzB,EACtE,OAAK,IAAI7B,EAAMsD,EAAE,CAAC,EAAIkf,IAFE,EAAEjlB,EAK9B+F,EAAE,EAAItD,EAGR,OAAKzC,GAGL+F,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,GAJE,IAKX,CAGA,MAAAmf,GAAe,CACb,KAAM3W,GACN,QAASC,GACT,QAASE,EAEX,EChDO,SAASH,IAAO,CACrB2W,GAAM,KAAK,MAAM,IAAI,EAChB,KAAK,KAGV,KAAK,MAAQ,KAAK,IAAI,KAAK,KAAK,EAChC,KAAK,MAAQ,KAAK,IAAI,KAAK,KAAK,EAChC,KAAK,GAAK,EAAI,KAAK,GACd,KAAK,QACR,KAAK,MAAQ,qCAEjB,CAEO,SAAS1W,GAAQzI,EAAG,CACzB,IAAIof,EAAMC,EAAMC,EAAM9D,EACtB,OAAAxb,EAAE,EAAIgI,EAAWhI,EAAE,EAAI,KAAK,KAAK,EACjCmf,GAAM,QAAQ,MAAM,KAAM,CAACnf,CAAC,CAAC,EAC7Bof,EAAO,KAAK,IAAIpf,EAAE,CAAC,EACnBqf,EAAO,KAAK,IAAIrf,EAAE,CAAC,EACnBsf,EAAO,KAAK,IAAItf,EAAE,CAAC,EACnBwb,EAAI,KAAK,GAAK,KAAK,IAAM,EAAI,KAAK,MAAQ4D,EAAO,KAAK,MAAQC,EAAOC,GACrEtf,EAAE,EAAIwb,EAAI6D,EAAO,KAAK,IAAIrf,EAAE,CAAC,EAC7BA,EAAE,EAAIwb,GAAK,KAAK,MAAQ4D,EAAO,KAAK,MAAQC,EAAOC,GACnDtf,EAAE,EAAI,KAAK,EAAIA,EAAE,EAAI,KAAK,GAC1BA,EAAE,EAAI,KAAK,EAAIA,EAAE,EAAI,KAAK,GACnBA,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAIof,EAAMC,EAAM3W,EAAKhM,EAAK6iB,EAM1B,GALAvf,EAAE,GAAKA,EAAE,EAAI,KAAK,IAAM,KAAK,EAC7BA,EAAE,GAAKA,EAAE,EAAI,KAAK,IAAM,KAAK,EAE7BA,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GACPuf,EAAM,KAAK,KAAKvf,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EAAI,CAC5C,IAAIrD,EAAI,EAAI,KAAK,MAAM4iB,EAAK,KAAK,EAAE,EACnCH,EAAO,KAAK,IAAIziB,CAAC,EACjB0iB,EAAO,KAAK,IAAI1iB,CAAC,EACjBD,EAAM,KAAK,KAAK2iB,EAAO,KAAK,MAAQrf,EAAE,EAAIof,EAAO,KAAK,MAAQG,CAAG,EACjE7W,EAAM,KAAK,MAAM1I,EAAE,EAAIof,EAAMG,EAAM,KAAK,MAAQF,EAAOrf,EAAE,EAAI,KAAK,MAAQof,CAAI,CAChF,MAEE1iB,EAAM,KAAK,MACXgM,EAAM,EAGR,OAAA1I,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACNyiB,GAAM,QAAQ,MAAM,KAAM,CAACnf,CAAC,CAAC,EAC7BA,EAAE,EAAIgI,EAAWhI,EAAE,EAAI,KAAK,KAAK,EAC1BA,CACT,CAEO,IAAI4I,GAAQ,CAAC,2BAA4B,wBAAyB,sBAAuB,SAAS,oCAAoC,sBAAsB,EACnK,MAAA4W,GAAe,CACb,KAAMhX,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECvDO,SAAS6W,GAAMC,EAAM9X,EAAQ+X,EAAO,CACzC,OAAA/X,GAAU+X,EACF,KAAK,IAAI,IAAOphB,EAAUmhB,EAAK,EAAI,KAAK,KAAK,EAAI9X,IAAW,EAAIA,GAAS,GAAM+X,CAAK,CAC9F,CAEO,SAASnX,IAAO,CACrB,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,EACjC,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,EAC7B,KAAK,OACH,KAAK,KAAO,GAAK,CAAC,MAAM,KAAK,MAAM,GAAK,KAAK,IAAI,KAAK,OAAO,GAAK7J,IACpE,KAAK,GAAK,IAAO,EAAIoJ,GAAK,KAAK,IAAI,EAAI,KAAK,IAAI,KAAK,MAAM,KAIzD,KAAK,IAAI,KAAK,OAAO,GAAKpJ,IACxB,KAAK,KAAO,EAGd,KAAK,IAAM,EAKX,KAAK,IAAM,IAGf,KAAK,KAAO,KAAK,KAAK,KAAK,IAAI,EAAI,KAAK,EAAG,EAAI,KAAK,CAAC,EAAI,KAAK,IAAI,EAAI,KAAK,EAAG,EAAI,KAAK,CAAC,CAAC,EACrF,KAAK,KAAO,GAAK,CAAC,MAAM,KAAK,MAAM,GAAK,KAAK,IAAI,KAAK,OAAO,GAAKA,IACpE,KAAK,GAAK,GAAM,KAAK,KAAO+I,GAAM,KAAK,EAAG,KAAK,IAAI,KAAK,MAAM,EAAG,KAAK,IAAI,KAAK,MAAM,CAAC,EAAIO,GAAM,KAAK,EAAG,KAAK,IAAM,KAAK,OAAQ,KAAK,IAAM,KAAK,IAAI,KAAK,MAAM,CAAC,GAElK,KAAK,IAAMP,GAAM,KAAK,EAAG,KAAK,QAAS,KAAK,OAAO,EACnD,KAAK,GAAK,EAAI,KAAK,KAAK,KAAK,MAAM,KAAK,KAAM,KAAK,QAAS,KAAK,CAAC,CAAC,EAAInJ,EACvE,KAAK,MAAQ,KAAK,IAAI,KAAK,EAAE,EAC7B,KAAK,MAAQ,KAAK,IAAI,KAAK,EAAE,EAEjC,CAGO,SAASkK,GAAQzI,EAAG,CACzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EACR4f,EAAS,KAAK,IAAIljB,CAAG,EACrBmjB,EAAS,KAAK,IAAInjB,CAAG,EACrBgY,EAAGrF,EAAGyQ,EAAMC,EAAM1X,EAAI2X,EACtBC,EAAOjY,EAAWU,EAAM,KAAK,KAAK,EAEtC,OAAI,KAAK,IAAI,KAAK,IAAIA,EAAM,KAAK,KAAK,EAAI,KAAK,EAAE,GAAK/J,GAAS,KAAK,IAAIjC,EAAM,KAAK,IAAI,GAAKiC,GAG1FqB,EAAE,EAAI,IACNA,EAAE,EAAI,IACCA,GAEL,KAAK,QAEP0U,EAAI,EAAI,KAAK,IAAM,EAAI,KAAK,QAAUkL,EAAS,KAAK,QAAUC,EAAS,KAAK,IAAII,CAAI,GACpFjgB,EAAE,EAAI,KAAK,EAAI0U,EAAImL,EAAS,KAAK,IAAII,CAAI,EAAI,KAAK,GAClDjgB,EAAE,EAAI,KAAK,EAAI0U,GAAK,KAAK,QAAUkL,EAAS,KAAK,QAAUC,EAAS,KAAK,IAAII,CAAI,GAAK,KAAK,GACpFjgB,IAGPqP,EAAI,EAAI,KAAK,KAAK,KAAK,MAAM3S,EAAKkjB,EAAQ,KAAK,CAAC,CAAC,EAAIrhB,EACrDwhB,EAAO,KAAK,IAAI1Q,CAAC,EACjByQ,EAAO,KAAK,IAAIzQ,CAAC,EACb,KAAK,IAAI,KAAK,OAAO,GAAK1Q,GAC5B0J,EAAKJ,GAAM,KAAK,EAAGvL,EAAM,KAAK,IAAK,KAAK,IAAMkjB,CAAM,EACpDI,EAAK,EAAI,KAAK,EAAI,KAAK,GAAK3X,EAAK,KAAK,KACtCrI,EAAE,EAAI,KAAK,GAAKggB,EAAK,KAAK,IAAItX,EAAM,KAAK,KAAK,EAC9C1I,EAAE,EAAI,KAAK,GAAK,KAAK,IAAMggB,EAAK,KAAK,IAAItX,EAAM,KAAK,KAAK,EAElD1I,IAEA,KAAK,IAAI,KAAK,OAAO,EAAIrB,GAGhC+V,EAAI,EAAI,KAAK,EAAI,KAAK,IAAM,EAAIqL,EAAO,KAAK,IAAIE,CAAI,GACpDjgB,EAAE,EAAI0U,EAAIoL,IAKVpL,EAAI,EAAI,KAAK,EAAI,KAAK,GAAK,KAAK,KAAO,KAAK,OAAS,EAAI,KAAK,MAAQoL,EAAO,KAAK,MAAQC,EAAO,KAAK,IAAIE,CAAI,IAC9GjgB,EAAE,EAAI0U,GAAK,KAAK,MAAQoL,EAAO,KAAK,MAAQC,EAAO,KAAK,IAAIE,CAAI,GAAK,KAAK,IAE5EjgB,EAAE,EAAI0U,EAAIqL,EAAO,KAAK,IAAIE,CAAI,EAAI,KAAK,GAGlCjgB,GACT,CAGO,SAAS2I,GAAQ3I,EAAG,CACzBA,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GACZ,IAAI0I,EAAKhM,EAAK2L,EAAI6X,EAAIC,EAClBH,EAAK,KAAK,KAAKhgB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACxC,GAAI,KAAK,OAAQ,CACf,IAAIrD,EAAI,EAAI,KAAK,KAAKqjB,GAAM,EAAI,KAAK,EAAI,KAAK,GAAG,EAGjD,OAFAtX,EAAM,KAAK,MACXhM,EAAM,KAAK,KACPsjB,GAAMrhB,GACRqB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,IAETtD,EAAM,KAAK,KAAK,KAAK,IAAIC,CAAC,EAAI,KAAK,QAAUqD,EAAE,EAAI,KAAK,IAAIrD,CAAC,EAAI,KAAK,QAAUqjB,CAAE,EAC9E,KAAK,IAAI,KAAK,OAAO,EAAIrhB,EACvB,KAAK,KAAO,EACd+J,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAG,GAAMA,EAAE,CAAC,CAAC,EAGxD0I,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAGA,EAAE,CAAC,CAAC,EAIpD0I,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAI,KAAK,IAAIrD,CAAC,EAAGqjB,EAAK,KAAK,QAAU,KAAK,IAAIrjB,CAAC,EAAIqD,EAAE,EAAI,KAAK,QAAU,KAAK,IAAIrD,CAAC,CAAC,CAAC,EAEjIqD,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,EACT,SAEM,KAAK,IAAI,KAAK,OAAO,GAAKrB,EAAO,CACnC,GAAIqhB,GAAMrhB,EACR,OAAAjC,EAAM,KAAK,KACXgM,EAAM,KAAK,MACX1I,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EAECsD,EAETA,EAAE,GAAK,KAAK,IACZA,EAAE,GAAK,KAAK,IACZqI,EAAK2X,EAAK,KAAK,MAAQ,EAAI,KAAK,EAAI,KAAK,IACzCtjB,EAAM,KAAK,IAAM0L,GAAM,KAAK,EAAGC,CAAE,EACjCK,EAAM,KAAK,IAAMV,EAAW,KAAK,IAAM,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAG,GAAMA,EAAE,CAAC,CAAC,CAChF,MAEEkgB,EAAK,EAAI,KAAK,KAAKF,EAAK,KAAK,OAAS,EAAI,KAAK,EAAI,KAAK,GAAK,KAAK,IAAI,EACtEtX,EAAM,KAAK,MACPsX,GAAMrhB,EACRwhB,EAAM,KAAK,IAGXA,EAAM,KAAK,KAAK,KAAK,IAAID,CAAE,EAAI,KAAK,MAAQlgB,EAAE,EAAI,KAAK,IAAIkgB,CAAE,EAAI,KAAK,MAAQF,CAAE,EAChFtX,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAI,KAAK,IAAIkgB,CAAE,EAAGF,EAAK,KAAK,MAAQ,KAAK,IAAIE,CAAE,EAAIlgB,EAAE,EAAI,KAAK,MAAQ,KAAK,IAAIkgB,CAAE,CAAC,CAAC,GAEhIxjB,EAAM,GAAK0L,GAAM,KAAK,EAAG,KAAK,IAAI,IAAO7J,EAAU4hB,EAAI,CAAC,EAG5D,OAAAngB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EAGCsD,CAET,CAEO,IAAI4I,GAAQ,CAAC,QAAS,2BAA4B,iCAAiC,EAC1F,MAAAwX,GAAe,CACb,KAAM5X,GACN,QAASC,GACT,QAASE,GACT,MAAOC,GACP,MAAO6W,EACT,ECrKO,SAASjX,IAAO,CACrB,IAAI6X,EAAO,KAAK,KAChB,KAAK,QAAU,KAAK,MACpB,IAAIC,EAAU,KAAK,IAAID,CAAI,EACvBE,EAAgB,KAAK,EACrBC,EAAO,KAAK,GACZC,EAAa,EAAID,EACjBE,EAAK,EAAID,EAAa,KAAK,IAAIA,EAAY,CAAC,EAC5CxW,EAAI,KAAK,EAAI,KAAK,KAAKyW,CAAE,EAC7B,KAAK,EAAI,KAAK,GAAKH,EAAgB,KAAK,KAAK,EAAIG,CAAE,GAAK,EAAIA,EAAK,KAAK,IAAIJ,EAAS,CAAC,GACpF,KAAK,MAAQ,KAAK,KAAK,EAAII,GAAM,EAAIA,GAAM,KAAK,IAAI,KAAK,IAAIL,CAAI,EAAG,CAAC,CAAC,EACtE,KAAK,GAAK,KAAK,KAAKC,EAAU,KAAK,KAAK,EACxC,IAAIK,EAAK,KAAK,IAAI,KAAK,IAAI,KAAK,GAAK,EAAI,KAAK,GAAK,CAAC,CAAC,EACjDC,EAAK,KAAK,IAAI,KAAK,IAAI,KAAK,GAAK,EAAIP,EAAO,CAAC,CAAC,EAC9CQ,EAAK,KAAK,KAAK,EAAI5W,EAAIqW,IAAY,EAAIrW,EAAIqW,EAAQ,EACvD,KAAK,EAAIK,EAAK,KAAK,MAAQC,EAAK,KAAK,MAAQ3W,EAAI,EAAI4W,CACvD,CAEO,SAASpY,GAAQzI,EAAG,CACzB,IAAI8gB,EAAM,KAAK,IAAI,KAAK,IAAI,KAAK,GAAK,EAAI9gB,EAAE,EAAI,CAAC,CAAC,EAC9C+gB,EAAM,KAAK,EAAI,EAAI,KAAK,KAAK,EAAI,KAAK,EAAI,KAAK,IAAI/gB,EAAE,CAAC,IAAM,EAAI,KAAK,EAAI,KAAK,IAAIA,EAAE,CAAC,EAAE,EACvFghB,EAAI,CAAC,KAAK,OAASF,EAAMC,GAAO,KAAK,EAGrC1jB,EAAI,GAAK,KAAK,KAAK,KAAK,IAAI2jB,CAAC,CAAC,EAAI,KAAK,GAAK,GAG5CrM,EAAI,KAAK,OAAS3U,EAAE,EAAI,KAAK,SAG7BihB,EAAO,KAAK,KAAK,KAAK,IAAItM,CAAC,GAAK,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAItX,CAAC,EAAI,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAIsX,CAAC,EAAE,EAElGuM,EAAO,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAI7jB,CAAC,EAAI,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAIA,CAAC,EAAI,KAAK,IAAIsX,CAAC,CAAC,EAEpG,OAAA3U,EAAE,EAAI,KAAK,EAAI,EAAI,KAAK,KAAK,EAAI,KAAK,IAAIkhB,CAAI,IAAM,EAAI,KAAK,IAAIA,CAAI,EAAE,EAAI,KAAK,GAChFlhB,EAAE,EAAI,KAAK,EAAIihB,EAAO,KAAK,GACpBjhB,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CAgBzB,QAfIsP,EAAItP,EAAE,EAAI,KAAK,GACfqP,EAAIrP,EAAE,EAAI,KAAK,GAEfihB,EAAO3R,EAAI,KAAK,EAChB4R,EAAO,GAAK,KAAK,KAAK,KAAK,IAAI7R,EAAI,KAAK,CAAC,CAAC,EAAI,KAAK,GAAK,GAExDhS,EAAI,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAI6jB,CAAI,EAAI,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAIA,CAAI,EAAI,KAAK,IAAID,CAAI,CAAC,EACtGtM,EAAI,KAAK,KAAK,KAAK,IAAIsM,CAAI,GAAK,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAIA,CAAI,EAAI,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAIC,CAAI,EAAE,EAExGC,EAAS,KAAK,QAAUxM,EAAI,KAAK,MAEjCqM,EAAI,EACJI,EAAM/jB,EACNgkB,EAAU,KACVC,EAAY,EACT,KAAK,IAAIF,EAAMC,CAAO,EAAI,MAAW,CAC1C,GAAI,EAAEC,EAAY,GAEhB,OAGFN,EAAI,EAAI,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,KAAK,GAAK,EAAI3jB,EAAI,CAAC,CAAC,EAAI,KAAK,GAAK,KAAK,EAAI,KAAK,IAAI,KAAK,IAAI,KAAK,GAAK,EAAI,KAAK,KAAK,KAAK,EAAI,KAAK,IAAI+jB,CAAG,CAAC,EAAI,CAAC,CAAC,EACzJC,EAAUD,EACVA,EAAM,EAAI,KAAK,KAAK,KAAK,IAAIJ,CAAC,CAAC,EAAI,KAAK,GAAK,CAC/C,CAEA,OAAAhhB,EAAE,EAAImhB,EACNnhB,EAAE,EAAIohB,EACCphB,CACT,CAEO,IAAI4I,GAAQ,CAAC,QAAQ,EAC5B,MAAA2Y,GAAe,CACb,KAAM/Y,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EChFA,IAAI4Y,GAAM,KAEV,SAASC,GAAQjT,EAAG,CAClB,IAAIkT,EAAmB,CAAC,0BAA0B,gDAAgD,EAC9FC,EAAiB,OAAOnT,EAAE,YAAe,SAAW,OAAO,KAAKA,EAAE,UAAU,EAAE,CAAC,EAAIA,EAAE,WAEzF,MAAO,YAAaA,GAAK,WAAYA,GAAKkT,EAAiB,QAAQC,CAAc,IAAM,EACzF,CAKO,SAASnZ,IAAO,CAClB,IAACV,EAAKK,EAAKyZ,EAAQ1K,EAAG2K,EAAGC,EAAGC,EAAGC,EAAQhiB,EAAGiiB,EAAGC,EAAQ,EACtDC,EAAQC,EAAO,EAAGC,EAAO,EAAGC,EAAO,EAAGC,EAAO,EAAGC,EAAO,EAAGC,EAAU,EAItE,KAAK,OAAShB,GAAQ,IAAI,EAC1B,KAAK,OAAS,WAAY,KAE1B,IAAIiB,EAAM,GACN,UAAW,OACbA,EAAM,IAGR,IAAIC,EAAM,GAaV,GAZI,yBAA0B,OAC5BA,EAAM,IAGJD,IACFD,EAAU,KAAK,OAGbE,IACFT,EAAS,KAAK,qBAAuBtjB,GAGnC8jB,GAAOC,EACTP,EAAO,KAAK,cAEZC,EAAO,KAAK,MACZE,EAAO,KAAK,KACZD,EAAO,KAAK,MACZE,EAAO,KAAK,KAER,KAAK,IAAID,EAAOC,CAAI,GAAKhB,KAAQ1Z,EAAM,KAAK,IAAIya,CAAI,IAAMf,IAC1D,KAAK,IAAI1Z,EAAMvJ,CAAO,GAAKijB,IAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,EAAIjjB,CAAO,GAAKijB,IAC7E,KAAK,IAAI,KAAK,IAAIgB,CAAI,EAAIjkB,CAAO,GAAKijB,GACxC,MAAM,IAAI,MAId,IAAIoB,EAAS,EAAM,KAAK,GACxBza,EAAM,KAAK,KAAKya,CAAM,EAElB,KAAK,IAAI,KAAK,IAAI,EAAIjkB,GACxBqjB,EAAS,KAAK,IAAI,KAAK,IAAI,EAC3BJ,EAAS,KAAK,IAAI,KAAK,IAAI,EAC3B9Z,EAAM,EAAI,KAAK,GAAKka,EAASA,EAC7B,KAAK,EAAIJ,EAASA,EAClB,KAAK,EAAI,KAAK,KAAK,EAAI,KAAK,GAAK,KAAK,EAAI,KAAK,EAAIgB,CAAM,EACzD,KAAK,EAAI,KAAK,EAAI,KAAK,GAAKza,EAAML,EAClCoP,EAAI,KAAK,EAAI/O,GAAOyZ,EAAS,KAAK,KAAK9Z,CAAG,GAC1C+Z,EAAI3K,EAAIA,EAAG,EAEP2K,GAAK,EACPA,EAAI,GAEJA,EAAI,KAAK,KAAKA,CAAC,EACX,KAAK,KAAO,IACdA,EAAI,CAACA,IAIT,KAAK,EAAIA,GAAK3K,EACd,KAAK,GAAK,KAAK,IAAIjP,GAAM,KAAK,EAAG,KAAK,KAAM+Z,CAAM,EAAG,KAAK,CAAC,IAE3D,KAAK,EAAI,EAAI7Z,EACb,KAAK,EAAI,KAAK,GACd,KAAK,EAAI+O,EAAI2K,EAAI,GAGfa,GAAOC,GACLD,GACFP,EAAS,KAAK,KAAK,KAAK,IAAIM,CAAO,EAAIvL,CAAC,EACnCyL,IACHT,EAAQO,KAGVN,EAASD,EACTO,EAAU,KAAK,KAAKvL,EAAI,KAAK,IAAIiL,CAAM,CAAC,GAE1C,KAAK,KAAOC,EAAO,KAAK,KAAK,IAAOP,EAAI,EAAIA,GAAK,KAAK,IAAIM,CAAM,CAAC,EAAI,KAAK,IAE1EL,EAAI,KAAK,IAAI7Z,GAAM,KAAK,EAAGsa,EAAM,KAAK,IAAIA,CAAI,CAAC,EAAG,KAAK,CAAC,EACxDR,EAAI,KAAK,IAAI9Z,GAAM,KAAK,EAAGua,EAAM,KAAK,IAAIA,CAAI,CAAC,EAAG,KAAK,CAAC,EACxDX,EAAI,KAAK,EAAIC,EACb9hB,GAAK+hB,EAAID,IAAMC,EAAID,GACnBG,EAAI,KAAK,EAAI,KAAK,EAClBA,GAAKA,EAAIF,EAAID,IAAMG,EAAIF,EAAID,GAC3Bha,EAAMua,EAAOC,EAETxa,EAAM,CAAC,KAAK,GACdwa,GAAOvjB,GACE+I,EAAM,KAAK,KACpBwa,GAAQvjB,IAGV,KAAK,KAAOiJ,EAAW,IAAOqa,EAAOC,GAAQ,KAAK,KAAKL,EAAI,KAAK,IAAI,GAAM,KAAK,GAAKI,EAAOC,EAAK,EAAItiB,CAAC,EAAI,KAAK,CAAC,EAC/GmiB,EAAS,KAAK,KAAK,EAAI,KAAK,IAAI,KAAK,EAAIna,EAAWqa,EAAO,KAAK,IAAI,CAAC,GAAKR,EAAI,EAAIA,EAAE,EACpFK,EAAQO,EAAU,KAAK,KAAKvL,EAAI,KAAK,IAAIiL,CAAM,CAAC,GAGlD,KAAK,OAAS,KAAK,IAAIA,CAAM,EAC7B,KAAK,OAAS,KAAK,IAAIA,CAAM,EAC7B,KAAK,OAAS,KAAK,IAAID,CAAK,EAC5B,KAAK,OAAS,KAAK,IAAIA,CAAK,EAE5B,KAAK,GAAK,EAAI,KAAK,EACnB,KAAK,IAAM,KAAK,EAAI,KAAK,GACzB,KAAK,IAAM,EAAI,KAAK,IACf,KAAK,EAAI,KAAK,EAEf,KAAK,OACP,KAAK,IAAM,GAEX,KAAK,IAAM,KAAK,IAAI,KAAK,IAAM,KAAK,KAAK,KAAK,KAAKhL,EAAIA,EAAI,CAAC,EAAI,KAAK,IAAIuL,CAAO,CAAC,CAAC,EAE9E,KAAK,KAAO,IACd,KAAK,IAAM,CAAE,KAAK,MAItBZ,EAAI,GAAMM,EACV,KAAK,SAAW,KAAK,IAAM,KAAK,IAAI,KAAK,IAAIrjB,EAAS+iB,CAAC,CAAC,EACxD,KAAK,SAAW,KAAK,IAAM,KAAK,IAAI,KAAK,IAAI/iB,EAAS+iB,CAAC,CAAC,CAC1D,CAKO,SAASpZ,GAAQzI,EAAG,CACzB,IAAI9C,EAAS,CAAA,EACT8jB,EAAGhL,EAAG6M,EAAGhO,EAAGiO,EAAGxG,EAAMyG,EAAGhjB,EAG5B,GAFAC,EAAE,EAAIA,EAAE,EAAI,KAAK,KAEb,KAAK,IAAI,KAAK,IAAIA,EAAE,CAAC,EAAIzB,CAAO,EAAII,EAAO,CAS7C,GARAmkB,EAAI,KAAK,EAAI,KAAK,IAAI7a,GAAM,KAAK,EAAGjI,EAAE,EAAG,KAAK,IAAIA,EAAE,CAAC,CAAC,EAAG,KAAK,CAAC,EAE/Dsc,EAAO,EAAIwG,EACX9B,EAAI,IAAO8B,EAAIxG,GACftG,EAAI,IAAO8M,EAAIxG,GACfzH,EAAI,KAAK,IAAI,KAAK,EAAI7U,EAAE,CAAC,EACzB6iB,GAAK7B,EAAI,KAAK,OAASnM,EAAI,KAAK,QAAUmB,EAEtC,KAAK,IAAI,KAAK,IAAI6M,CAAC,EAAI,CAAG,EAAIlkB,EAChC,MAAM,IAAI,MAGZoB,EAAI,GAAM,KAAK,IAAM,KAAK,KAAK,EAAI8iB,IAAI,EAAIA,EAAE,EAC7CvG,EAAO,KAAK,IAAI,KAAK,EAAItc,EAAE,CAAC,EAExB,KAAK,IAAIsc,CAAI,EAAIkF,GACnBuB,EAAI,KAAK,EAAI/iB,EAAE,EAEf+iB,EAAI,KAAK,IAAM,KAAK,MAAO/B,EAAI,KAAK,OAASnM,EAAI,KAAK,OAASyH,CAAI,CAEvE,MACEvc,EAAIC,EAAE,EAAI,EAAI,KAAK,SAAW,KAAK,SACnC+iB,EAAI,KAAK,IAAM/iB,EAAE,EAGnB,OAAI,KAAK,QACP9C,EAAO,EAAI6lB,EACX7lB,EAAO,EAAI6C,IAEXgjB,GAAK,KAAK,IACV7lB,EAAO,EAAI6C,EAAI,KAAK,OAASgjB,EAAI,KAAK,OACtC7lB,EAAO,EAAI6lB,EAAI,KAAK,OAAShjB,EAAI,KAAK,QAGxC7C,EAAO,EAAK,KAAK,EAAIA,EAAO,EAAI,KAAK,GACrCA,EAAO,EAAK,KAAK,EAAIA,EAAO,EAAI,KAAK,GAE9BA,CACT,CAEO,SAASyL,GAAQ3I,EAAG,CACzB,IAAI+iB,EAAGhjB,EAAGijB,EAAIC,EAAIC,EAAIC,EAAIC,EACtBlmB,EAAS,CAAA,EAmBb,GAjBA8C,EAAE,GAAKA,EAAE,EAAI,KAAK,KAAO,EAAM,KAAK,GACpCA,EAAE,GAAKA,EAAE,EAAI,KAAK,KAAO,EAAM,KAAK,GAEhC,KAAK,QACPD,EAAIC,EAAE,EACN+iB,EAAI/iB,EAAE,IAEND,EAAIC,EAAE,EAAI,KAAK,OAASA,EAAE,EAAI,KAAK,OACnC+iB,EAAI/iB,EAAE,EAAI,KAAK,OAASA,EAAE,EAAI,KAAK,OAAS,KAAK,KAGnDgjB,EAAK,KAAK,IAAI,CAAC,KAAK,IAAMjjB,CAAC,EAC3BkjB,EAAK,IAAOD,EAAK,EAAIA,GACrBE,EAAK,IAAOF,EAAK,EAAIA,GACrBG,EAAK,KAAK,IAAI,KAAK,IAAMJ,CAAC,EAC1BK,GAAMD,EAAK,KAAK,OAASF,EAAK,KAAK,QAAUC,EAEzC,KAAK,IAAI,KAAK,IAAIE,CAAE,EAAI,CAAC,EAAIzkB,EAC/BzB,EAAO,EAAI,EACXA,EAAO,EAAIkmB,EAAK,EAAI,CAAC7kB,EAAUA,MAC1B,CAIL,GAHArB,EAAO,EAAI,KAAK,EAAI,KAAK,MAAM,EAAIkmB,IAAO,EAAIA,EAAG,EACjDlmB,EAAO,EAAIkL,GAAM,KAAK,EAAG,KAAK,IAAIlL,EAAO,EAAG,EAAI,KAAK,CAAC,CAAC,EAEnDA,EAAO,IAAM,IACf,MAAM,IAAI,MAGZA,EAAO,EAAI,CAAC,KAAK,GAAK,KAAK,MAAO+lB,EAAK,KAAK,OAASE,EAAK,KAAK,OAAS,KAAK,IAAI,KAAK,IAAMJ,CAAC,CAAC,CAChG,CAEA,OAAA7lB,EAAO,GAAK,KAAK,KAEVA,CACT,CAEO,IAAI0L,GAAQ,CAAC,0BAA2B,0BAA2B,iDAAkD,mDAAoD,yCAA0C,mBAAoB,OAAO,EACrP,MAAAya,GAAe,CACb,KAAM7a,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EC1OO,SAASJ,IAAO,CAuBrB,GATK,KAAK,OACR,KAAK,KAAO,KAAK,MAEd,KAAK,KACR,KAAK,GAAK,GAEZ,KAAK,GAAK,KAAK,IAAM,EACrB,KAAK,GAAK,KAAK,IAAM,EAEjB,OAAK,IAAI,KAAK,KAAO,KAAK,IAAI,EAAI7J,GAItC,KAAI2d,EAAO,KAAK,EAAI,KAAK,EACzB,KAAK,EAAI,KAAK,KAAK,EAAIA,EAAOA,CAAI,EAElC,IAAIgH,EAAO,KAAK,IAAI,KAAK,IAAI,EACzBC,EAAO,KAAK,IAAI,KAAK,IAAI,EACzBC,EAAM9b,GAAM,KAAK,EAAG4b,EAAMC,CAAI,EAC9BE,EAAMxb,GAAM,KAAK,EAAG,KAAK,KAAMqb,CAAI,EAEnCI,EAAO,KAAK,IAAI,KAAK,IAAI,EACzBC,EAAO,KAAK,IAAI,KAAK,IAAI,EACzBC,EAAMlc,GAAM,KAAK,EAAGgc,EAAMC,CAAI,EAC9BE,EAAM5b,GAAM,KAAK,EAAG,KAAK,KAAMyb,CAAI,EAEnCI,EAAM7b,GAAM,KAAK,EAAG,KAAK,KAAM,KAAK,IAAI,KAAK,IAAI,CAAC,EAElD,KAAK,IAAI,KAAK,KAAO,KAAK,IAAI,EAAItJ,EACpC,KAAK,GAAK,KAAK,IAAI6kB,EAAMI,CAAG,EAAI,KAAK,IAAIH,EAAMI,CAAG,EAGlD,KAAK,GAAKP,EAER,MAAM,KAAK,EAAE,IACf,KAAK,GAAKA,GAEZ,KAAK,GAAKE,GAAO,KAAK,GAAK,KAAK,IAAIC,EAAK,KAAK,EAAE,GAChD,KAAK,GAAK,KAAK,EAAI,KAAK,GAAK,KAAK,IAAIK,EAAK,KAAK,EAAE,EAC7C,KAAK,QACR,KAAK,MAAQ,2BAEjB,CAIO,SAASrb,GAAQzI,EAAG,CAEzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAGR,KAAK,IAAI,EAAI,KAAK,IAAItD,CAAG,EAAI,KAAK,EAAE,GAAKiC,IAC3CjC,EAAMqL,GAAKrL,CAAG,GAAK6B,EAAU,EAAII,IAGnC,IAAImJ,EAAM,KAAK,IAAI,KAAK,IAAIpL,CAAG,EAAI6B,CAAO,EACtC8J,EAAI0b,EACR,GAAIjc,EAAMnJ,EACR0J,EAAKJ,GAAM,KAAK,EAAGvL,EAAK,KAAK,IAAIA,CAAG,CAAC,EACrCqnB,EAAM,KAAK,EAAI,KAAK,GAAK,KAAK,IAAI1b,EAAI,KAAK,EAAE,MAE1C,CAEH,GADAP,EAAMpL,EAAM,KAAK,GACboL,GAAO,EACT,OAAO,KAETic,EAAM,CACR,CACA,IAAIC,EAAQ,KAAK,GAAKhc,EAAWU,EAAM,KAAK,KAAK,EACjD,OAAA1I,EAAE,EAAI,KAAK,IAAM+jB,EAAM,KAAK,IAAIC,CAAK,GAAK,KAAK,GAC/ChkB,EAAE,EAAI,KAAK,IAAM,KAAK,GAAK+jB,EAAM,KAAK,IAAIC,CAAK,GAAK,KAAK,GAElDhkB,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CAEzB,IAAI+jB,EAAKjc,EAAKO,EACV3L,EAAKgM,EACLxO,GAAK8F,EAAE,EAAI,KAAK,IAAM,KAAK,GAC3B7F,EAAK,KAAK,IAAM6F,EAAE,EAAI,KAAK,IAAM,KAAK,GACtC,KAAK,GAAK,GACZ+jB,EAAM,KAAK,KAAK7pB,EAAIA,EAAIC,EAAIA,CAAC,EAC7B2N,EAAM,IAGNic,EAAM,CAAC,KAAK,KAAK7pB,EAAIA,EAAIC,EAAIA,CAAC,EAC9B2N,EAAM,IAER,IAAIkc,EAAQ,EAIZ,GAHID,IAAQ,IACVC,EAAQ,KAAK,MAAOlc,EAAM5N,EAAK4N,EAAM3N,CAAC,GAEnC4pB,IAAQ,GAAO,KAAK,GAAK,GAI5B,GAHAjc,EAAM,EAAI,KAAK,GACfO,EAAK,KAAK,IAAK0b,GAAO,KAAK,EAAI,KAAK,IAAMjc,CAAG,EAC7CpL,EAAM0L,GAAM,KAAK,EAAGC,CAAE,EAClB3L,IAAQ,MACV,OAAO,UAITA,EAAM,CAAC6B,EAET,OAAAmK,EAAMV,EAAWgc,EAAQ,KAAK,GAAK,KAAK,KAAK,EAE7ChkB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAEO,IAAI4I,GAAQ,CACjB,gDACA,0BACA,8BACA,8BACA,MACA,gCACA,+BACF,EAEA,MAAAqb,GAAe,CACb,KAAMzb,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECnJO,SAASJ,IAAO,CACrB,KAAK,EAAI,cACT,KAAK,GAAK,iBACV,KAAK,EAAI,KAAK,KAAK,KAAK,EAAE,EACrB,KAAK,OACR,KAAK,KAAO,kBAET,KAAK,QACR,KAAK,MAAQ,kBAAqB,kBAG/B,KAAK,KACR,KAAK,GAAK,OAEZ,KAAK,IAAM,iBACX,KAAK,IAAM,EAAI,KAAK,IACpB,KAAK,IAAM,KAAK,KAChB,KAAK,GAAK,KAAK,GACf,KAAK,EAAI,KAAK,KAAK,KAAK,EAAE,EAC1B,KAAK,KAAO,KAAK,KAAK,EAAK,KAAK,GAAK,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,EAAG,CAAC,GAAM,EAAI,KAAK,GAAG,EACrF,KAAK,GAAK,iBACV,KAAK,GAAK,KAAK,KAAK,KAAK,IAAI,KAAK,GAAG,EAAI,KAAK,IAAI,EAClD,KAAK,EAAI,KAAK,KAAK,EAAI,KAAK,EAAI,KAAK,IAAI,KAAK,GAAG,IAAM,EAAI,KAAK,EAAI,KAAK,IAAI,KAAK,GAAG,GAAI,KAAK,KAAO,KAAK,EAAI,CAAC,EAC/G,KAAK,EAAI,KAAK,IAAI,KAAK,GAAK,EAAI,KAAK,GAAG,EAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAM,EAAI,KAAK,GAAG,EAAG,KAAK,IAAI,EAAI,KAAK,EAC1G,KAAK,GAAK,KAAK,GACf,KAAK,GAAK,KAAK,EAAI,KAAK,KAAK,EAAI,KAAK,EAAE,GAAK,EAAI,KAAK,GAAK,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,EAAG,CAAC,GACzF,KAAK,GAAK,iBACV,KAAK,EAAI,KAAK,IAAI,KAAK,EAAE,EACzB,KAAK,IAAM,KAAK,GAAK,KAAK,GAAK,KAAK,IAAI,KAAK,EAAE,EAC/C,KAAK,GAAK,KAAK,IAAM,KAAK,EAC5B,CAKO,SAASC,GAAQzI,EAAG,CACzB,IAAIkkB,EAAKnB,EAAGoB,EAAQ1I,EAAGjgB,EAAG4oB,EAAKC,EAC3B3b,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EACR0b,EAAY1T,EAAWU,EAAM,KAAK,KAAK,EAE3C,OAAAwb,EAAM,KAAK,KAAM,EAAI,KAAK,EAAI,KAAK,IAAIxnB,CAAG,IAAM,EAAI,KAAK,EAAI,KAAK,IAAIA,CAAG,GAAM,KAAK,KAAO,KAAK,EAAI,CAAC,EACrGqmB,EAAI,GAAK,KAAK,KAAK,KAAK,EAAI,KAAK,IAAI,KAAK,IAAIrmB,EAAM,EAAI,KAAK,GAAG,EAAG,KAAK,IAAI,EAAIwnB,CAAG,EAAI,KAAK,KAC5FC,EAAS,CAACzI,EAAY,KAAK,KAC3BD,EAAI,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAIsH,CAAC,EAAI,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAIA,CAAC,EAAI,KAAK,IAAIoB,CAAM,CAAC,EAClG3oB,EAAI,KAAK,KAAK,KAAK,IAAIunB,CAAC,EAAI,KAAK,IAAIoB,CAAM,EAAI,KAAK,IAAI1I,CAAC,CAAC,EAC1D2I,EAAM,KAAK,EAAI5oB,EACf6oB,EAAK,KAAK,IAAM,KAAK,IAAI,KAAK,IAAI,KAAK,GAAK,EAAI,KAAK,GAAG,EAAG,KAAK,CAAC,EAAI,KAAK,IAAI,KAAK,IAAI5I,EAAI,EAAI,KAAK,GAAG,EAAG,KAAK,CAAC,EAChHzb,EAAE,EAAIqkB,EAAK,KAAK,IAAID,CAAG,EAAI,EAC3BpkB,EAAE,EAAIqkB,EAAK,KAAK,IAAID,CAAG,EAAI,EAEtB,KAAK,QACRpkB,EAAE,GAAK,GACPA,EAAE,GAAK,IAEDA,CACV,CAGO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAI+iB,EAAGoB,EAAQ,EAAG3oB,EAAG4oB,EAAKC,EAAIC,EAC1BC,EAIA7F,EAAM1e,EAAE,EACZA,EAAE,EAAIA,EAAE,EACRA,EAAE,EAAI0e,EACD,KAAK,QACR1e,EAAE,GAAK,GACPA,EAAE,GAAK,IAETqkB,EAAK,KAAK,KAAKrkB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACpCokB,EAAM,KAAK,MAAMpkB,EAAE,EAAGA,EAAE,CAAC,EACzBxE,EAAI4oB,EAAM,KAAK,IAAI,KAAK,EAAE,EAC1B,EAAI,GAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAMC,EAAI,EAAI,KAAK,CAAC,EAAI,KAAK,IAAI,KAAK,GAAK,EAAI,KAAK,GAAG,CAAC,EAAI,KAAK,KAClGtB,EAAI,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAI,CAAC,EAAI,KAAK,IAAI,KAAK,EAAE,EAAI,KAAK,IAAI,CAAC,EAAI,KAAK,IAAIvnB,CAAC,CAAC,EAC7F2oB,EAAS,KAAK,KAAK,KAAK,IAAI,CAAC,EAAI,KAAK,IAAI3oB,CAAC,EAAI,KAAK,IAAIunB,CAAC,CAAC,EAC1D/iB,EAAE,EAAI,KAAK,MAAQmkB,EAAS,KAAK,KACjCG,EAAMvB,EACNwB,EAAK,EACL,IAAInV,EAAO,EACX,GACEpP,EAAE,EAAI,GAAK,KAAK,KAAK,KAAK,IAAI,KAAK,EAAG,GAAM,KAAK,IAAI,EAAI,KAAK,IAAI,KAAK,IAAI+iB,EAAI,EAAI,KAAK,GAAG,EAAG,EAAI,KAAK,IAAI,EAAI,KAAK,KAAK,EAAI,KAAK,EAAI,KAAK,IAAIuB,CAAG,IAAM,EAAI,KAAK,EAAI,KAAK,IAAIA,CAAG,GAAI,KAAK,EAAI,CAAC,CAAC,EAAI,KAAK,KACrM,KAAK,IAAIA,EAAMtkB,EAAE,CAAC,EAAI,QACxBukB,EAAK,GAEPD,EAAMtkB,EAAE,EACRoP,GAAQ,QACDmV,IAAO,GAAKnV,EAAO,IAC5B,OAAIA,GAAQ,GACH,KAGDpP,CACV,CAEO,IAAI4I,GAAQ,CAAC,SAAU,QAAQ,EACtC,MAAA4b,GAAe,CACb,KAAMhc,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECzGe,SAAA6b,EAASC,EAAI7N,EAAI6J,EAAIiE,EAAIzc,EAAK,CAC3C,OAAQwc,EAAKxc,EAAM2O,EAAK,KAAK,IAAI,EAAI3O,CAAG,EAAIwY,EAAK,KAAK,IAAI,EAAIxY,CAAG,EAAIyc,EAAK,KAAK,IAAI,EAAIzc,CAAG,CAC5F,CCFe,SAAA0c,GAAS1qB,EAAG,CACzB,MAAQ,GAAI,IAAOA,GAAK,EAAIA,EAAI,IAAM,EAAI,KAAOA,GACnD,CCFe,SAAA2qB,GAAS3qB,EAAG,CACzB,MAAQ,MAAQA,GAAK,EAAI,IAAOA,GAAK,EAAI,OAAUA,GACrD,CCFe,SAAA4qB,GAAS5qB,EAAG,CACzB,MAAQ,WAAaA,EAAIA,GAAK,EAAI,IAAOA,EAC3C,CCFe,SAAA6qB,GAAS7qB,EAAG,CACzB,OAAQA,EAAIA,EAAIA,GAAK,GAAK,KAC5B,CCFe,SAAA8qB,GAAS5nB,EAAG6M,EAAGrC,EAAQ,CACpC,IAAI0U,EAAOrS,EAAIrC,EACf,OAAOxK,EAAI,KAAK,KAAK,EAAIkf,EAAOA,CAAI,CACtC,CCAe,SAAA2I,GAAS/qB,EAAG,CACzB,OAAQ,KAAK,IAAIA,CAAC,EAAIqE,EAAWrE,EAAKA,EAAK6N,GAAK7N,CAAC,EAAI,KAAK,EAC5D,CCLe,SAAAgrB,GAASjJ,EAAIyI,EAAI7N,EAAI6J,EAAIiE,EAAI,CAC1C,IAAIzc,EACAK,EAEJL,EAAM+T,EAAKyI,EACX,QAASzqB,EAAI,EAAGA,EAAI,GAAIA,IAGtB,GAFAsO,GAAQ0T,GAAMyI,EAAKxc,EAAM2O,EAAK,KAAK,IAAI,EAAI3O,CAAG,EAAIwY,EAAK,KAAK,IAAI,EAAIxY,CAAG,EAAIyc,EAAK,KAAK,IAAI,EAAIzc,CAAG,KAAOwc,EAAK,EAAI7N,EAAK,KAAK,IAAI,EAAI3O,CAAG,EAAI,EAAIwY,EAAK,KAAK,IAAI,EAAIxY,CAAG,EAAI,EAAIyc,EAAK,KAAK,IAAI,EAAIzc,CAAG,GAC/LA,GAAOK,EACH,KAAK,IAAIA,CAAI,GAAK,MACpB,OAAOL,EAKX,MAAO,IACT,CCJO,SAASM,IAAO,CAChB,KAAK,SACR,KAAK,GAAKoc,GAAK,KAAK,EAAE,EACtB,KAAK,GAAKC,GAAK,KAAK,EAAE,EACtB,KAAK,GAAKC,GAAK,KAAK,EAAE,EACtB,KAAK,GAAKC,GAAK,KAAK,EAAE,EACtB,KAAK,IAAM,KAAK,EAAIN,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,IAAI,EAE1E,CAIO,SAAShc,GAAQzI,EAAG,CAIzB,IAAI9F,EAAGC,EACHgrB,EAAMnlB,EAAE,EACRkI,EAAMlI,EAAE,EAGZ,GAFAmlB,EAAMnd,EAAWmd,EAAM,KAAK,KAAK,EAE7B,KAAK,OACPjrB,EAAI,KAAK,EAAI,KAAK,KAAK,KAAK,IAAIgO,CAAG,EAAI,KAAK,IAAIid,CAAG,CAAC,EACpDhrB,EAAI,KAAK,GAAK,KAAK,MAAM,KAAK,IAAI+N,CAAG,EAAG,KAAK,IAAIid,CAAG,CAAC,EAAI,KAAK,UAE3D,CAEH,IAAIvd,EAAS,KAAK,IAAIM,CAAG,EACrBL,EAAS,KAAK,IAAIK,CAAG,EACrBkd,EAAKJ,GAAG,KAAK,EAAG,KAAK,EAAGpd,CAAM,EAC9Byd,EAAK,KAAK,IAAInd,CAAG,EAAI,KAAK,IAAIA,CAAG,EACjC2T,EAAKsJ,EAAM,KAAK,IAAIjd,CAAG,EACvBod,EAAMzJ,EAAKA,EACX0J,EAAK,KAAK,GAAK1d,EAASA,GAAU,EAAI,KAAK,IAC3CoU,EAAK,KAAK,EAAIwI,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAIvc,CAAG,EAE9DhO,EAAIkrB,EAAKvJ,GAAM,EAAIyJ,EAAMD,GAAM,EAAI,GAAK,EAAIA,EAAK,EAAIE,GAAMD,EAAM,MACjEnrB,EAAI8hB,EAAK,KAAK,IAAMmJ,EAAKxd,EAASC,EAASyd,GAAO,IAAO,EAAID,EAAK,EAAIE,GAAMD,EAAM,GAGpF,CAEA,OAAAtlB,EAAE,EAAI9F,EAAI,KAAK,GACf8F,EAAE,EAAI7F,EAAI,KAAK,GACR6F,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CACzBA,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GACZ,IAAI9F,EAAI8F,EAAE,EAAI,KAAK,EACf7F,EAAI6F,EAAE,EAAI,KAAK,EACfkI,EAAKid,EAET,GAAI,KAAK,OAAQ,CACf,IAAIK,EAAKrrB,EAAI,KAAK,KAClB+N,EAAM,KAAK,KAAK,KAAK,IAAIsd,CAAE,EAAI,KAAK,IAAItrB,CAAC,CAAC,EAC1CirB,EAAM,KAAK,MAAM,KAAK,IAAIjrB,CAAC,EAAG,KAAK,IAAIsrB,CAAE,CAAC,CAC5C,KACK,CAEH,IAAIC,EAAM,KAAK,IAAM,KAAK,EAAItrB,EAC1BooB,EAAO2C,GAAMO,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,EAAE,EACxD,GAAI,KAAK,IAAI,KAAK,IAAIlD,CAAI,EAAIhkB,CAAO,GAAKI,EACxC,OAAAqB,EAAE,EAAI,KAAK,MACXA,EAAE,EAAIzB,EACFpE,EAAI,IACN6F,EAAE,GAAK,IAEFA,EAET,IAAI0lB,EAAMV,GAAG,KAAK,EAAG,KAAK,EAAG,KAAK,IAAIzC,CAAI,CAAC,EAEvCoD,EAAMD,EAAMA,EAAMA,EAAM,KAAK,EAAI,KAAK,GAAK,EAAI,KAAK,IACpDE,EAAM,KAAK,IAAI,KAAK,IAAIrD,CAAI,EAAG,CAAC,EAChCsD,EAAK3rB,EAAI,KAAK,EAAIwrB,EAClBI,EAAMD,EAAKA,EACf3d,EAAMqa,EAAOmD,EAAM,KAAK,IAAInD,CAAI,EAAIoD,EAAME,EAAKA,GAAM,IAAO,EAAI,EAAID,GAAOC,EAAKA,EAAK,IACrFV,EAAMU,GAAM,EAAIC,GAAOF,EAAM,GAAK,EAAI,EAAIA,GAAOA,EAAME,EAAM,KAAO,KAAK,IAAIvD,CAAI,CAEnF,CAEA,OAAAviB,EAAE,EAAIgI,EAAWmd,EAAM,KAAK,KAAK,EACjCnlB,EAAE,EAAIilB,GAAW/c,CAAG,EACblI,CAET,CAEO,IAAI4I,GAAQ,CAAC,UAAW,kBAAmB,MAAM,EACxD,MAAAmd,GAAe,CACb,KAAMvd,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EC3Ge,SAAAod,GAASre,EAAQC,EAAQ,CACtC,IAAIE,EACJ,OAAIH,EAAS,MACXG,EAAMH,EAASC,GACN,EAAID,EAASA,IAAWC,GAAU,EAAIE,EAAMA,GAAQ,GAAMH,EAAU,KAAK,KAAK,EAAIG,IAAQ,EAAIA,EAAI,IAGnG,EAAIF,CAEhB,CCGO,IAAIqe,GAAS,EAETC,GAAS,EACTC,GAAQ,EACRC,GAAQ,EAIZ,SAAS5d,IAAO,CACrB,IAAIqJ,EAAI,KAAK,IAAI,KAAK,IAAI,EAU1B,GATI,KAAK,IAAIA,EAAItT,CAAO,EAAII,EAC1B,KAAK,KAAO,KAAK,KAAO,EAAI,KAAK,OAAS,KAAK,OAExC,KAAK,IAAIkT,CAAC,EAAIlT,EACrB,KAAK,KAAO,KAAK,MAGjB,KAAK,KAAO,KAAK,MAEf,KAAK,GAAK,EAAG,CACf,IAAIiJ,EAKJ,OAHA,KAAK,GAAKoe,GAAM,KAAK,EAAG,CAAC,EACzB,KAAK,IAAM,IAAO,EAAI,KAAK,IAC3B,KAAK,IAAMK,GAAQ,KAAK,EAAE,EAClB,KAAK,KAAI,CACjB,KAAK,KAAK,OACR,KAAK,GAAK,EACV,MACF,KAAK,KAAK,OACR,KAAK,GAAK,EACV,MACF,KAAK,KAAK,MACR,KAAK,GAAK,KAAK,KAAK,GAAM,KAAK,EAAE,EACjC,KAAK,GAAK,EAAI,KAAK,GACnB,KAAK,IAAM,EACX,KAAK,IAAM,GAAM,KAAK,GACtB,MACF,KAAK,KAAK,MACR,KAAK,GAAK,KAAK,KAAK,GAAM,KAAK,EAAE,EACjCze,EAAS,KAAK,IAAI,KAAK,IAAI,EAC3B,KAAK,MAAQoe,GAAM,KAAK,EAAGpe,CAAM,EAAI,KAAK,GAC1C,KAAK,MAAQ,KAAK,KAAK,EAAI,KAAK,MAAQ,KAAK,KAAK,EAClD,KAAK,GAAK,KAAK,IAAI,KAAK,IAAI,GAAK,KAAK,KAAK,EAAI,KAAK,GAAKA,EAASA,CAAM,EAAI,KAAK,GAAK,KAAK,OAC3F,KAAK,KAAO,KAAK,IAAM,KAAK,IAAM,KAAK,GACvC,KAAK,KAAO,KAAK,GACjB,KACN,CACE,MAEM,KAAK,OAAS,KAAK,QACrB,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAGtC,CAIO,SAASa,GAAQzI,EAAG,CAIzB,IAAI9F,EAAGC,EAAGmsB,EAAQC,EAAQ3e,EAAQ4e,EAAGC,EAAMC,EAAMrpB,EAAGwK,EAChDsd,EAAMnlB,EAAE,EACRkI,EAAMlI,EAAE,EAGZ,GADAmlB,EAAMnd,EAAWmd,EAAM,KAAK,KAAK,EAC7B,KAAK,QAIP,GAHAvd,EAAS,KAAK,IAAIM,CAAG,EACrBL,EAAS,KAAK,IAAIK,CAAG,EACrBoe,EAAS,KAAK,IAAInB,CAAG,EACjB,KAAK,OAAS,KAAK,OAAS,KAAK,OAAS,KAAK,MAAO,CAExD,GADAhrB,EAAK,KAAK,OAAS,KAAK,MAAS,EAAI0N,EAASye,EAAS,EAAI,KAAK,OAAS1e,EAAS,KAAK,OAASC,EAASye,EACrGnsB,GAAKwE,EACP,OAAO,KAETxE,EAAI,KAAK,KAAK,EAAIA,CAAC,EACnBD,EAAIC,EAAI0N,EAAS,KAAK,IAAIsd,CAAG,EAC7BhrB,GAAM,KAAK,OAAS,KAAK,MAASyN,EAAS,KAAK,OAASA,EAAS,KAAK,OAASC,EAASye,CAC3F,SACS,KAAK,OAAS,KAAK,QAAU,KAAK,OAAS,KAAK,OAAQ,CAI/D,GAHI,KAAK,OAAS,KAAK,SACrBA,EAAS,CAACA,GAER,KAAK,IAAIpe,EAAM,KAAK,IAAI,EAAIvJ,EAC9B,OAAO,KAETxE,EAAI2E,EAASoJ,EAAM,GACnB/N,EAAI,GAAM,KAAK,OAAS,KAAK,OAAU,KAAK,IAAIA,CAAC,EAAI,KAAK,IAAIA,CAAC,GAC/DD,EAAIC,EAAI,KAAK,IAAIgrB,CAAG,EACpBhrB,GAAKmsB,CACP,MAEG,CAYH,OAXAG,EAAO,EACPC,EAAO,EACPrpB,EAAI,EACJipB,EAAS,KAAK,IAAInB,CAAG,EACrBoB,EAAS,KAAK,IAAIpB,CAAG,EACrBvd,EAAS,KAAK,IAAIM,CAAG,EACrBse,EAAIR,GAAM,KAAK,EAAGpe,CAAM,GACpB,KAAK,OAAS,KAAK,OAAS,KAAK,OAAS,KAAK,SACjD6e,EAAOD,EAAI,KAAK,GAChBE,EAAO,KAAK,KAAK,EAAID,EAAOA,CAAI,GAE1B,KAAK,KAAI,CACjB,KAAK,KAAK,MACRppB,EAAI,EAAI,KAAK,MAAQopB,EAAO,KAAK,MAAQC,EAAOJ,EAChD,MACF,KAAK,KAAK,MACRjpB,EAAI,EAAIqpB,EAAOJ,EACf,MACF,KAAK,KAAK,OACRjpB,EAAIkB,EAAU2J,EACdse,EAAI,KAAK,GAAKA,EACd,MACF,KAAK,KAAK,OACRnpB,EAAI6K,EAAM3J,EACVioB,EAAI,KAAK,GAAKA,EACd,KACN,CACI,GAAI,KAAK,IAAInpB,CAAC,EAAIsB,EAChB,OAAO,KAET,OAAQ,KAAK,KAAI,CACjB,KAAK,KAAK,MACV,KAAK,KAAK,MACRtB,EAAI,KAAK,KAAK,EAAIA,CAAC,EACf,KAAK,OAAS,KAAK,MACrBlD,EAAI,KAAK,IAAMkD,GAAK,KAAK,MAAQopB,EAAO,KAAK,MAAQC,EAAOJ,GAG5DnsB,GAAKkD,EAAI,KAAK,KAAK,GAAK,EAAIqpB,EAAOJ,EAAO,GAAKG,EAAO,KAAK,IAE7DvsB,EAAI,KAAK,IAAMmD,EAAIqpB,EAAOH,EAC1B,MACF,KAAK,KAAK,OACV,KAAK,KAAK,OACJC,GAAK,GACPtsB,GAAKmD,EAAI,KAAK,KAAKmpB,CAAC,GAAKD,EACzBpsB,EAAImsB,GAAW,KAAK,OAAS,KAAK,OAAUjpB,EAAI,CAACA,IAGjDnD,EAAIC,EAAI,EAEV,KACN,CACE,CAEA,OAAA6F,EAAE,EAAI,KAAK,EAAI9F,EAAI,KAAK,GACxB8F,EAAE,EAAI,KAAK,EAAI7F,EAAI,KAAK,GACjB6F,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CACzBA,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GACZ,IAAI9F,EAAI8F,EAAE,EAAI,KAAK,EACf7F,EAAI6F,EAAE,EAAI,KAAK,EACfmlB,EAAKjd,EAAKye,EAAKC,EAAKJ,EAAGjH,EAAKsH,EAChC,GAAI,KAAK,OAAQ,CACf,IAAIC,EAAO,EACT9G,EAAI+G,EAAO,EAIb,GAFA/G,EAAK,KAAK,KAAK9lB,EAAIA,EAAIC,EAAIA,CAAC,EAC5B+N,EAAM8X,EAAK,GACP9X,EAAM,EACR,OAAO,KAOT,OALAA,EAAM,EAAI,KAAK,KAAKA,CAAG,GACnB,KAAK,OAAS,KAAK,OAAS,KAAK,OAAS,KAAK,SACjD6e,EAAO,KAAK,IAAI7e,CAAG,EACnB4e,EAAO,KAAK,IAAI5e,CAAG,GAEb,KAAK,KAAI,CACjB,KAAK,KAAK,MACRA,EAAO,KAAK,IAAI8X,CAAE,GAAKrhB,EAAS,EAAI,KAAK,KAAKxE,EAAI4sB,EAAO/G,CAAE,EAC3D9lB,GAAK6sB,EACL5sB,EAAI2sB,EAAO9G,EACX,MACF,KAAK,KAAK,MACR9X,EAAO,KAAK,IAAI8X,CAAE,GAAKrhB,EAAS,KAAK,KAAO,KAAK,KAAKmoB,EAAO,KAAK,OAAS3sB,EAAI4sB,EAAO,KAAK,OAAS/G,CAAE,EACtG9lB,GAAK6sB,EAAO,KAAK,OACjB5sB,GAAK2sB,EAAO,KAAK,IAAI5e,CAAG,EAAI,KAAK,QAAU8X,EAC3C,MACF,KAAK,KAAK,OACR7lB,EAAI,CAACA,EACL+N,EAAM3J,EAAU2J,EAChB,MACF,KAAK,KAAK,OACRA,GAAO3J,EACP,KACN,CACI4mB,EAAOhrB,IAAM,IAAM,KAAK,OAAS,KAAK,OAAS,KAAK,OAAS,KAAK,OAAU,EAAI,KAAK,MAAMD,EAAGC,CAAC,CACjG,KACK,CAEH,GADA0sB,EAAK,EACD,KAAK,OAAS,KAAK,OAAS,KAAK,OAAS,KAAK,MAAO,CAIxD,GAHA3sB,GAAK,KAAK,GACVC,GAAK,KAAK,GACVolB,EAAM,KAAK,KAAKrlB,EAAIA,EAAIC,EAAIA,CAAC,EACzBolB,EAAM5gB,EACR,OAAAqB,EAAE,EAAI,KAAK,MACXA,EAAE,EAAI,KAAK,KACJA,EAET4mB,EAAM,EAAI,KAAK,KAAK,GAAMrH,EAAM,KAAK,EAAE,EACvCoH,EAAM,KAAK,IAAIC,CAAG,EAClB1sB,GAAM0sB,EAAM,KAAK,IAAIA,CAAG,EACpB,KAAK,OAAS,KAAK,OACrBC,EAAKF,EAAM,KAAK,MAAQxsB,EAAIysB,EAAM,KAAK,MAAQrH,EAC/CiH,EAAI,KAAK,GAAKK,EACd1sB,EAAIolB,EAAM,KAAK,MAAQoH,EAAMxsB,EAAI,KAAK,MAAQysB,IAG9CC,EAAK1sB,EAAIysB,EAAMrH,EACfiH,EAAI,KAAK,GAAKK,EACd1sB,EAAIolB,EAAMoH,EAEd,SACS,KAAK,OAAS,KAAK,QAAU,KAAK,OAAS,KAAK,OAAQ,CAK/D,GAJI,KAAK,OAAS,KAAK,SACrBxsB,EAAI,CAACA,GAEPqsB,EAAKtsB,EAAIA,EAAIC,EAAIA,EACb,CAACqsB,EACH,OAAAxmB,EAAE,EAAI,KAAK,MACXA,EAAE,EAAI,KAAK,KACJA,EAET6mB,EAAK,EAAIL,EAAI,KAAK,GACd,KAAK,OAAS,KAAK,SACrBK,EAAK,CAACA,EAEV,CACA1B,EAAM,KAAK,MAAMjrB,EAAGC,CAAC,EACrB+N,EAAM8e,GAAQ,KAAK,KAAKH,CAAE,EAAG,KAAK,GAAG,CACvC,CAEA,OAAA7mB,EAAE,EAAIgI,EAAW,KAAK,MAAQmd,CAAG,EACjCnlB,EAAE,EAAIkI,EACClI,CACT,CAGA,IAAIinB,GAAM,kBAENC,GAAM,mBACNC,GAAM,mBACNC,GAAM,mBACNC,GAAM,kBACNC,GAAM,oBAEV,SAASjB,GAAQrc,EAAI,CACnB,IAAI,EACAud,EAAM,CAAA,EACV,OAAAA,EAAI,CAAC,EAAIvd,EAAKid,GACd,EAAIjd,EAAKA,EACTud,EAAI,CAAC,GAAK,EAAIL,GACdK,EAAI,CAAC,EAAI,EAAIH,GACb,GAAKpd,EACLud,EAAI,CAAC,GAAK,EAAIJ,GACdI,EAAI,CAAC,GAAK,EAAIF,GACdE,EAAI,CAAC,EAAI,EAAID,GACNC,CACT,CAEA,SAASP,GAAQQ,EAAMD,EAAK,CAC1B,IAAI1V,EAAI2V,EAAOA,EACf,OAAQA,EAAOD,EAAI,CAAC,EAAI,KAAK,IAAI1V,CAAC,EAAI0V,EAAI,CAAC,EAAI,KAAK,IAAI1V,EAAIA,CAAC,EAAI0V,EAAI,CAAC,EAAI,KAAK,IAAI1V,EAAIA,EAAIA,CAAC,CAC9F,CAEO,IAAIjJ,GAAQ,CAAC,+BAAgC,+BAAgC,MAAM,EAC1F,MAAA6e,GAAe,CACb,KAAMjf,GACN,QAASC,GACT,QAASE,GACT,MAAOC,GACP,OAAQqd,GACR,OAAQC,GACR,MAAOC,GACP,MAAOC,EACT,ECzSe,SAAAsB,GAASxtB,EAAG,CACzB,OAAI,KAAK,IAAIA,CAAC,EAAI,IAChBA,EAAKA,EAAI,EAAK,EAAI,IAEb,KAAK,KAAKA,CAAC,CACpB,CCCO,SAASsO,IAAO,CAEjB,KAAK,IAAI,KAAK,KAAO,KAAK,IAAI,EAAI7J,IAGtC,KAAK,KAAO,KAAK,EAAI,KAAK,EAC1B,KAAK,GAAK,EAAI,KAAK,IAAI,KAAK,KAAM,CAAC,EACnC,KAAK,GAAK,KAAK,KAAK,KAAK,EAAE,EAE3B,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,GAAK,KAAK,OACf,KAAK,IAAM,KAAK,OAChB,KAAK,IAAM+I,GAAM,KAAK,GAAI,KAAK,OAAQ,KAAK,MAAM,EAClD,KAAK,IAAMse,GAAM,KAAK,GAAI,KAAK,MAAM,EAErC,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,GAAK,KAAK,OACf,KAAK,IAAMte,GAAM,KAAK,GAAI,KAAK,OAAQ,KAAK,MAAM,EAClD,KAAK,IAAMse,GAAM,KAAK,GAAI,KAAK,MAAM,EAErC,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,GAAK,KAAK,OACf,KAAK,IAAMA,GAAM,KAAK,GAAI,KAAK,MAAM,EAEjC,KAAK,IAAI,KAAK,KAAO,KAAK,IAAI,EAAIrnB,EACpC,KAAK,KAAO,KAAK,IAAM,KAAK,IAAM,KAAK,IAAM,KAAK,MAAQ,KAAK,IAAM,KAAK,KAG1E,KAAK,IAAM,KAAK,IAElB,KAAK,EAAI,KAAK,IAAM,KAAK,IAAM,KAAK,IAAM,KAAK,IAC/C,KAAK,GAAK,KAAK,EAAI,KAAK,KAAK,KAAK,EAAI,KAAK,IAAM,KAAK,GAAG,EAAI,KAAK,IACpE,CAIO,SAAS8J,GAAQzI,EAAG,CAEzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAEZ,KAAK,QAAU,KAAK,IAAItD,CAAG,EAC3B,KAAK,QAAU,KAAK,IAAIA,CAAG,EAE3B,IAAIirB,EAAK3B,GAAM,KAAK,GAAI,KAAK,OAAO,EAChCjC,EAAM,KAAK,EAAI,KAAK,KAAK,KAAK,EAAI,KAAK,IAAM4D,CAAE,EAAI,KAAK,IACxD3D,EAAQ,KAAK,IAAMhc,EAAWU,EAAM,KAAK,KAAK,EAC9CxO,EAAI6pB,EAAM,KAAK,IAAIC,CAAK,EAAI,KAAK,GACjC7pB,EAAI,KAAK,GAAK4pB,EAAM,KAAK,IAAIC,CAAK,EAAI,KAAK,GAE/C,OAAAhkB,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAI+jB,EAAK4D,EAAI7f,EAAKkc,EAAOtb,EAAKhM,EAE9B,OAAAsD,EAAE,GAAK,KAAK,GACZA,EAAE,EAAI,KAAK,GAAKA,EAAE,EAAI,KAAK,GACvB,KAAK,KAAO,GACd+jB,EAAM,KAAK,KAAK/jB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACrC8H,EAAM,IAGNic,EAAM,CAAC,KAAK,KAAK/jB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACtC8H,EAAM,IAERkc,EAAQ,EACJD,IAAQ,IACVC,EAAQ,KAAK,MAAMlc,EAAM9H,EAAE,EAAG8H,EAAM9H,EAAE,CAAC,GAEzC8H,EAAMic,EAAM,KAAK,IAAM,KAAK,EACxB,KAAK,OACPrnB,EAAM,KAAK,MAAM,KAAK,EAAIoL,EAAMA,IAAQ,EAAI,KAAK,IAAI,GAGrD6f,GAAM,KAAK,EAAI7f,EAAMA,GAAO,KAAK,IACjCpL,EAAM,KAAK,MAAM,KAAK,GAAIirB,CAAE,GAG9Bjf,EAAMV,EAAWgc,EAAQ,KAAK,IAAM,KAAK,KAAK,EAC9ChkB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAKO,SAAS4nB,GAAMjgB,EAAQggB,EAAI,CAChC,IAAI/f,EAAQC,EAAQC,EAAKK,EAAKI,EAC1BL,EAAMwf,GAAM,GAAMC,CAAE,EACxB,GAAIhgB,EAAShJ,EACX,OAAOuJ,EAIT,QADI2f,EAASlgB,EAASA,EACb1N,EAAI,EAAGA,GAAK,GAAIA,IAOvB,GANA2N,EAAS,KAAK,IAAIM,CAAG,EACrBL,EAAS,KAAK,IAAIK,CAAG,EACrBJ,EAAMH,EAASC,EACfO,EAAM,EAAIL,EAAMA,EAChBS,EAAO,GAAMJ,EAAMA,EAAMN,GAAU8f,GAAM,EAAIE,GAAUjgB,EAASO,EAAM,GAAMR,EAAS,KAAK,KAAK,EAAIG,IAAQ,EAAIA,EAAI,GACnHI,EAAMA,EAAMK,EACR,KAAK,IAAIA,CAAI,GAAK,KACpB,OAAOL,EAGX,OAAO,IACT,CAEO,IAAIU,GAAQ,CAAC,0BAA2B,SAAU,KAAK,EAC9D,MAAAkf,GAAe,CACb,KAAMtf,GACN,QAASC,GACT,QAASE,GACT,MAAOC,GACP,MAAOgf,EACT,ECtHO,SAASpf,IAAO,CAIrB,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,EACjC,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,EAEjC,KAAK,cAAgB,IAAO,KAAK,EACjC,KAAK,GAAK,CACZ,CAIO,SAASC,GAAQzI,EAAG,CACzB,IAAI4H,EAAQC,EACRoY,EACA8H,EACAC,EACA3L,EACAniB,EAAGC,EACHuO,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAGZ,OAAAigB,EAAOjY,EAAWU,EAAM,KAAK,KAAK,EAElCd,EAAS,KAAK,IAAIlL,CAAG,EACrBmL,EAAS,KAAK,IAAInL,CAAG,EAErBqrB,EAAS,KAAK,IAAI9H,CAAI,EACtB5D,EAAI,KAAK,QAAUzU,EAAS,KAAK,QAAUC,EAASkgB,EACpDC,EAAM,EACD3L,EAAI,GAAO,KAAK,IAAIA,CAAC,GAAK1d,GAC7BzE,EAAI,KAAK,GAAK,KAAK,EAAI8tB,EAAMngB,EAAS,KAAK,IAAIoY,CAAI,EAAI5D,EACvDliB,EAAI,KAAK,GAAK,KAAK,EAAI6tB,GAAO,KAAK,QAAUpgB,EAAS,KAAK,QAAUC,EAASkgB,GAAU1L,IAWxFniB,EAAI,KAAK,GAAK,KAAK,cAAgB2N,EAAS,KAAK,IAAIoY,CAAI,EACzD9lB,EAAI,KAAK,GAAK,KAAK,eAAiB,KAAK,QAAUyN,EAAS,KAAK,QAAUC,EAASkgB,IAGtF/nB,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAIggB,EACAZ,EAAMC,EACN1iB,EACA+L,EAAKhM,EAIT,OAAAsD,EAAE,GAAKA,EAAE,EAAI,KAAK,IAAM,KAAK,EAC7BA,EAAE,GAAKA,EAAE,EAAI,KAAK,IAAM,KAAK,EAE7BA,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,IAEPggB,EAAK,KAAK,KAAKhgB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,IACvCrD,EAAI,KAAK,MAAMqjB,EAAI,KAAK,EAAE,EAC1BZ,EAAO,KAAK,IAAIziB,CAAC,EACjB0iB,EAAO,KAAK,IAAI1iB,CAAC,EAEjBD,EAAMgrB,GAAMrI,EAAO,KAAK,QAAWrf,EAAE,EAAIof,EAAO,KAAK,QAAWY,CAAE,EAClEtX,EAAM,KAAK,MAAM1I,EAAE,EAAIof,EAAMY,EAAK,KAAK,QAAUX,EAAOrf,EAAE,EAAI,KAAK,QAAUof,CAAI,EACjF1W,EAAMV,EAAW,KAAK,MAAQU,CAAG,IAGjChM,EAAM,KAAK,MACXgM,EAAM,GAGR1I,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,MAAM,EAC1B,MAAAqf,GAAe,CACb,KAAMzf,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECrGe,SAAAsf,GAASvgB,EAAQ6e,EAAG,CACjC,IAAIlK,EAAO,GAAK,EAAI3U,EAASA,IAAW,EAAIA,GAAU,KAAK,KAAK,EAAIA,IAAW,EAAIA,EAAO,EAC1F,GAAI,KAAK,IAAI,KAAK,IAAI6e,CAAC,EAAIlK,CAAI,EAAI,KACjC,OAAIkK,EAAI,EACE,GAAKjoB,EAGNA,EASX,QALI2J,EAAM,KAAK,KAAK,GAAMse,CAAC,EACvBje,EACAoT,EACAC,EACA9T,EACK7N,EAAI,EAAGA,EAAI,GAAIA,IAMtB,GALA0hB,EAAU,KAAK,IAAIzT,CAAG,EACtB0T,EAAU,KAAK,IAAI1T,CAAG,EACtBJ,EAAMH,EAASgU,EACfpT,EAAO,KAAK,IAAI,EAAIT,EAAMA,EAAK,CAAC,GAAK,EAAI8T,IAAY4K,GAAK,EAAI7e,EAASA,GAAUgU,GAAW,EAAI7T,EAAMA,GAAO,GAAMH,EAAS,KAAK,KAAK,EAAIG,IAAQ,EAAIA,EAAI,GAC1JI,GAAOK,EACH,KAAK,IAAIA,CAAI,GAAK,MACpB,OAAOL,EAKX,MAAO,IACT,CCpBO,SAASM,IAAO,CAEhB,KAAK,SACR,KAAK,GAAKd,GAAM,KAAK,EAAG,KAAK,IAAI,KAAK,MAAM,EAAG,KAAK,IAAI,KAAK,MAAM,CAAC,EAExE,CAIO,SAASe,GAAQzI,EAAG,CACzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EACR9F,EAAGC,EAGH8lB,EAAOjY,EAAWU,EAAM,KAAK,KAAK,EACtC,GAAI,KAAK,OACPxO,EAAI,KAAK,GAAK,KAAK,EAAI+lB,EAAO,KAAK,IAAI,KAAK,MAAM,EAClD9lB,EAAI,KAAK,GAAK,KAAK,EAAI,KAAK,IAAIuC,CAAG,EAAI,KAAK,IAAI,KAAK,MAAM,MAExD,CACH,IAAIirB,EAAK3B,GAAM,KAAK,EAAG,KAAK,IAAItpB,CAAG,CAAC,EACpCxC,EAAI,KAAK,GAAK,KAAK,EAAI,KAAK,GAAK+lB,EACjC9lB,EAAI,KAAK,GAAK,KAAK,EAAIwtB,EAAK,GAAM,KAAK,EACzC,CAEA,OAAA3nB,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CACzBA,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GACZ,IAAI0I,EAAKhM,EAET,OAAI,KAAK,QACPgM,EAAMV,EAAW,KAAK,MAAShI,EAAE,EAAI,KAAK,EAAK,KAAK,IAAI,KAAK,MAAM,CAAC,EACpEtD,EAAM,KAAK,KAAMsD,EAAE,EAAI,KAAK,EAAK,KAAK,IAAI,KAAK,MAAM,CAAC,IAGtDtD,EAAMwrB,GAAO,KAAK,EAAG,EAAIloB,EAAE,EAAI,KAAK,GAAK,KAAK,CAAC,EAC/C0I,EAAMV,EAAW,KAAK,MAAQhI,EAAE,GAAK,KAAK,EAAI,KAAK,GAAG,GAGxDA,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,KAAK,EACzB,MAAAuf,GAAe,CACb,KAAM3f,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EClEO,SAASJ,IAAO,CAErB,KAAK,GAAK,KAAK,IAAM,EACrB,KAAK,GAAK,KAAK,IAAM,EACrB,KAAK,KAAO,KAAK,MAAQ,EACzB,KAAK,MAAQ,KAAK,OAAS,EAC3B,KAAK,OAAS,KAAK,QAAU,EAC7B,KAAK,MAAQ,KAAK,OAAS,wCAE3B,KAAK,GAAK,KAAK,IAAI,KAAK,MAAM,CAChC,CAIO,SAASC,GAAQzI,EAAG,CAEzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAERigB,EAAOjY,EAAWU,EAAM,KAAK,KAAK,EAClC0f,EAAOnD,GAAWvoB,EAAM,KAAK,IAAI,EACrC,OAAAsD,EAAE,EAAI,KAAK,GAAM,KAAK,EAAIigB,EAAO,KAAK,GACtCjgB,EAAE,EAAI,KAAK,GAAM,KAAK,EAAIooB,EACnBpoB,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CAEzB,IAAI9F,EAAI8F,EAAE,EACN7F,EAAI6F,EAAE,EAEV,OAAAA,EAAE,EAAIgI,EAAW,KAAK,OAAU9N,EAAI,KAAK,KAAO,KAAK,EAAI,KAAK,GAAI,EAClE8F,EAAE,EAAIilB,GAAW,KAAK,MAAS9qB,EAAI,KAAK,IAAO,KAAK,CAAG,EAChD6F,CACT,CAEO,IAAI4I,GAAQ,CAAC,kBAAmB,0BAA2B,KAAK,EACvE,MAAAyf,GAAe,CACb,KAAM7f,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECrCA,IAAIyS,GAAW,GAER,SAAS7S,IAAO,CAGrB,KAAK,KAAO,KAAK,EAAI,KAAK,EAC1B,KAAK,GAAK,EAAI,KAAK,IAAI,KAAK,KAAM,CAAC,EACnC,KAAK,EAAI,KAAK,KAAK,KAAK,EAAE,EAC1B,KAAK,GAAKoc,GAAK,KAAK,EAAE,EACtB,KAAK,GAAKC,GAAK,KAAK,EAAE,EACtB,KAAK,GAAKC,GAAK,KAAK,EAAE,EACtB,KAAK,GAAKC,GAAK,KAAK,EAAE,EACtB,KAAK,IAAM,KAAK,EAAIN,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,IAAI,CACxE,CAIO,SAAShc,GAAQzI,EAAG,CACzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EACR9F,EAAGC,EAAGmuB,EACNrI,EAAOjY,EAAWU,EAAM,KAAK,KAAK,EAEtC,GADA4f,EAAKrI,EAAO,KAAK,IAAIvjB,CAAG,EACpB,KAAK,OACH,KAAK,IAAIA,CAAG,GAAKiC,GACnBzE,EAAI,KAAK,EAAI+lB,EACb9lB,EAAI,GAAK,KAAK,EAAI,KAAK,OAGvBD,EAAI,KAAK,EAAI,KAAK,IAAIouB,CAAE,EAAI,KAAK,IAAI5rB,CAAG,EACxCvC,EAAI,KAAK,GAAK8qB,GAAWvoB,EAAM,KAAK,IAAI,GAAK,EAAI,KAAK,IAAI4rB,CAAE,GAAK,KAAK,IAAI5rB,CAAG,YAI3E,KAAK,IAAIA,CAAG,GAAKiC,EACnBzE,EAAI,KAAK,EAAI+lB,EACb9lB,EAAI,GAAK,KAAK,QAEX,CACH,IAAIirB,EAAKJ,GAAG,KAAK,EAAG,KAAK,EAAG,KAAK,IAAItoB,CAAG,CAAC,EAAI,KAAK,IAAIA,CAAG,EACzDxC,EAAIkrB,EAAK,KAAK,IAAIkD,CAAE,EACpBnuB,EAAI,KAAK,EAAIsqB,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI/nB,CAAG,EAAI,KAAK,IAAM0oB,GAAM,EAAI,KAAK,IAAIkD,CAAE,EAC/F,CAGF,OAAAtoB,EAAE,EAAI9F,EAAI,KAAK,GACf8F,EAAE,EAAI7F,EAAI,KAAK,GACR6F,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAI0I,EAAKhM,EAAKxC,EAAGC,EAAGF,EAChB4hB,EAAI0M,EACJrgB,EAAKK,EAIT,GAHArO,EAAI8F,EAAE,EAAI,KAAK,GACf7F,EAAI6F,EAAE,EAAI,KAAK,GAEX,KAAK,OACP,GAAI,KAAK,IAAI7F,EAAI,KAAK,EAAI,KAAK,IAAI,GAAKwE,EACtC+J,EAAMV,EAAW9N,EAAI,KAAK,EAAI,KAAK,KAAK,EACxCwC,EAAM,MAEH,CACHmf,EAAK,KAAK,KAAO1hB,EAAI,KAAK,EAC1BouB,EAAKruB,EAAIA,EAAI,KAAK,EAAI,KAAK,EAAI2hB,EAAKA,EACpC3T,EAAM2T,EACN,IAAI2M,EACJ,IAAKvuB,EAAIohB,GAAUphB,EAAG,EAAEA,EAItB,GAHAuuB,EAAS,KAAK,IAAItgB,CAAG,EACrBK,EAAO,IAAMsT,GAAM3T,EAAMsgB,EAAS,GAAKtgB,EAAM,IAAOA,EAAMA,EAAMqgB,GAAMC,KAAYtgB,EAAM2T,GAAM2M,EAAS,GACvGtgB,GAAOK,EACH,KAAK,IAAIA,CAAI,GAAK5J,EAAO,CAC3BjC,EAAMwL,EACN,KACF,CAEFQ,EAAMV,EAAW,KAAK,MAAS,KAAK,KAAK9N,EAAI,KAAK,IAAIgO,CAAG,EAAI,KAAK,CAAC,EAAK,KAAK,IAAIxL,CAAG,CAAC,CACvF,SAGI,KAAK,IAAIvC,EAAI,KAAK,GAAG,GAAKwE,EAC5BjC,EAAM,EACNgM,EAAMV,EAAW,KAAK,MAAQ9N,EAAI,KAAK,CAAC,MAErC,CAEH2hB,GAAM,KAAK,IAAM1hB,GAAK,KAAK,EAC3BouB,EAAKruB,EAAIA,EAAI,KAAK,EAAI,KAAK,EAAI2hB,EAAKA,EACpC3T,EAAM2T,EACN,IAAI0J,EAAIkD,EAAKC,EAAMC,EACf7gB,EACJ,IAAK7N,EAAIohB,GAAUphB,EAAG,EAAEA,EAQtB,GAPA6N,EAAM,KAAK,EAAI,KAAK,IAAII,CAAG,EAC3Bqd,EAAK,KAAK,KAAK,EAAIzd,EAAMA,CAAG,EAAI,KAAK,IAAII,CAAG,EAC5CugB,EAAM,KAAK,EAAIhE,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAIvc,CAAG,EAC3DwgB,EAAO,KAAK,GAAK,EAAI,KAAK,GAAK,KAAK,IAAI,EAAIxgB,CAAG,EAAI,EAAI,KAAK,GAAK,KAAK,IAAI,EAAIA,CAAG,EAAI,EAAI,KAAK,GAAK,KAAK,IAAI,EAAIA,CAAG,EACnHygB,EAAKF,EAAM,KAAK,EAChBlgB,GAAQsT,GAAM0J,EAAKoD,EAAK,GAAKA,EAAK,GAAMpD,GAAMoD,EAAKA,EAAKJ,KAAQ,KAAK,GAAK,KAAK,IAAI,EAAIrgB,CAAG,GAAKygB,EAAKA,EAAKJ,EAAK,EAAI1M,EAAK8M,IAAO,EAAIpD,IAAO1J,EAAK8M,IAAOpD,EAAKmD,EAAO,EAAI,KAAK,IAAI,EAAIxgB,CAAG,GAAKwgB,GAC1LxgB,GAAOK,EACH,KAAK,IAAIA,CAAI,GAAK5J,EAAO,CAC3BjC,EAAMwL,EACN,KACF,CAIFqd,EAAK,KAAK,KAAK,EAAI,KAAK,GAAK,KAAK,IAAI,KAAK,IAAI7oB,CAAG,EAAG,CAAC,CAAC,EAAI,KAAK,IAAIA,CAAG,EACvEgM,EAAMV,EAAW,KAAK,MAAQ,KAAK,KAAK9N,EAAIqrB,EAAK,KAAK,CAAC,EAAI,KAAK,IAAI7oB,CAAG,CAAC,CAC1E,CAGF,OAAAsD,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,YAAa,MAAM,EACvC,MAAAggB,GAAe,CACb,KAAMpgB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECpHO,SAASJ,IAAO,CACrB,KAAK,EAAI,CAAA,EACT,KAAK,EAAE,CAAC,EAAI,YACZ,KAAK,EAAE,CAAC,EAAI,aACZ,KAAK,EAAE,CAAC,EAAI,WACZ,KAAK,EAAE,CAAC,EAAI,WACZ,KAAK,EAAE,CAAC,EAAI,SACZ,KAAK,EAAE,CAAC,EAAI,UACZ,KAAK,EAAE,CAAC,EAAI,SACZ,KAAK,EAAE,CAAC,EAAI,SACZ,KAAK,EAAE,CAAC,EAAI,MACZ,KAAK,EAAE,EAAE,EAAI,OAEb,KAAK,KAAO,CAAA,EACZ,KAAK,KAAO,CAAA,EACZ,KAAK,KAAK,CAAC,EAAI,YACf,KAAK,KAAK,CAAC,EAAI,EACf,KAAK,KAAK,CAAC,EAAI,WACf,KAAK,KAAK,CAAC,EAAI,WACf,KAAK,KAAK,CAAC,EAAI,YACf,KAAK,KAAK,CAAC,EAAI,UACf,KAAK,KAAK,CAAC,EAAI,WACf,KAAK,KAAK,CAAC,EAAI,UACf,KAAK,KAAK,CAAC,EAAI,WACf,KAAK,KAAK,CAAC,EAAI,WACf,KAAK,KAAK,CAAC,EAAI,UACf,KAAK,KAAK,CAAC,EAAI,WAEf,KAAK,KAAO,CAAA,EACZ,KAAK,KAAO,CAAA,EACZ,KAAK,KAAK,CAAC,EAAI,aACf,KAAK,KAAK,CAAC,EAAI,EACf,KAAK,KAAK,CAAC,EAAI,YACf,KAAK,KAAK,CAAC,EAAI,YACf,KAAK,KAAK,CAAC,EAAI,WACf,KAAK,KAAK,CAAC,EAAI,YACf,KAAK,KAAK,CAAC,EAAI,WACf,KAAK,KAAK,CAAC,EAAI,UACf,KAAK,KAAK,CAAC,EAAI,WACf,KAAK,KAAK,CAAC,EAAI,WACf,KAAK,KAAK,CAAC,EAAI,UACf,KAAK,KAAK,CAAC,EAAI,UAEf,KAAK,EAAI,CAAA,EACT,KAAK,EAAE,CAAC,EAAI,aACZ,KAAK,EAAE,CAAC,EAAI,YACZ,KAAK,EAAE,CAAC,EAAI,WACZ,KAAK,EAAE,CAAC,EAAI,UACZ,KAAK,EAAE,CAAC,EAAI,UACZ,KAAK,EAAE,CAAC,EAAI,QACZ,KAAK,EAAE,CAAC,EAAI,MACZ,KAAK,EAAE,CAAC,EAAI,OACZ,KAAK,EAAE,CAAC,EAAI,MACd,CAMO,SAASC,GAAQzI,EAAG,CACzB,IAAIsJ,EACAZ,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAER6oB,EAAYnsB,EAAM,KAAK,KACvBgf,EAAYhT,EAAM,KAAK,MAIvBogB,EAAQD,EAAYvqB,GAAa,KACjCyqB,EAAWrN,EACXsN,EAAU,EAEVC,EAAQ,EACZ,IAAK3f,EAAI,EAAGA,GAAK,GAAIA,IACnB0f,EAAUA,EAAUF,EACpBG,EAAQA,EAAQ,KAAK,EAAE3f,CAAC,EAAI0f,EAI9B,IAAIE,EAAQD,EACRE,EAAQJ,EAGRK,EAAU,EACVC,EAAU,EACVC,EACAC,EAEAC,EAAO,EACPC,EAAO,EACX,IAAKngB,EAAI,EAAGA,GAAK,EAAGA,IAClBggB,EAAWF,EAAUF,EAAQG,EAAUF,EACvCI,EAAWF,EAAUH,EAAQE,EAAUD,EACvCC,EAAUE,EACVD,EAAUE,EACVC,EAAOA,EAAO,KAAK,KAAKlgB,CAAC,EAAI8f,EAAU,KAAK,KAAK9f,CAAC,EAAI+f,EACtDI,EAAOA,EAAO,KAAK,KAAKngB,CAAC,EAAI8f,EAAU,KAAK,KAAK9f,CAAC,EAAI+f,EAIxD,OAAArpB,EAAE,EAAKypB,EAAO,KAAK,EAAK,KAAK,GAC7BzpB,EAAE,EAAKwpB,EAAO,KAAK,EAAK,KAAK,GAEtBxpB,CACT,CAKO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAIsJ,EACApP,EAAI8F,EAAE,EACN7F,EAAI6F,EAAE,EAEN0pB,EAAUxvB,EAAI,KAAK,GACnByvB,EAAUxvB,EAAI,KAAK,GAGnBqvB,EAAOG,EAAU,KAAK,EACtBF,EAAOC,EAAU,KAAK,EAGtBE,EAAS,EACTC,EAAS,EACTC,EACAC,EAEAb,EAAQ,EACRC,EAAQ,EACZ,IAAK7f,EAAI,EAAGA,GAAK,EAAGA,IAClBwgB,EAAUF,EAASJ,EAAOK,EAASJ,EACnCM,EAAUF,EAASL,EAAOI,EAASH,EACnCG,EAASE,EACTD,EAASE,EACTb,EAAQA,EAAQ,KAAK,KAAK5f,CAAC,EAAIsgB,EAAS,KAAK,KAAKtgB,CAAC,EAAIugB,EACvDV,EAAQA,EAAQ,KAAK,KAAK7f,CAAC,EAAIsgB,EAAS,KAAK,KAAKtgB,CAAC,EAAIugB,EAOzD,QAAS5vB,EAAI,EAAGA,EAAI,KAAK,WAAYA,IAAK,CACxC,IAAImvB,EAAUF,EACVG,EAAUF,EACVG,EACAC,EAEAS,EAASR,EACTS,EAASR,EACb,IAAKngB,EAAI,EAAGA,GAAK,EAAGA,IAClBggB,EAAWF,EAAUF,EAAQG,EAAUF,EACvCI,EAAWF,EAAUH,EAAQE,EAAUD,EACvCC,EAAUE,EACVD,EAAUE,EACVS,EAASA,GAAU1gB,EAAI,IAAM,KAAK,KAAKA,CAAC,EAAI8f,EAAU,KAAK,KAAK9f,CAAC,EAAI+f,GACrEY,EAASA,GAAU3gB,EAAI,IAAM,KAAK,KAAKA,CAAC,EAAI8f,EAAU,KAAK,KAAK9f,CAAC,EAAI+f,GAGvED,EAAU,EACVC,EAAU,EACV,IAAIa,EAAS,KAAK,KAAK,CAAC,EACpBC,EAAS,KAAK,KAAK,CAAC,EACxB,IAAK7gB,EAAI,EAAGA,GAAK,EAAGA,IAClBggB,EAAWF,EAAUF,EAAQG,EAAUF,EACvCI,EAAWF,EAAUH,EAAQE,EAAUD,EACvCC,EAAUE,EACVD,EAAUE,EACVW,EAASA,EAAS5gB,GAAK,KAAK,KAAKA,CAAC,EAAI8f,EAAU,KAAK,KAAK9f,CAAC,EAAI+f,GAC/Dc,EAASA,EAAS7gB,GAAK,KAAK,KAAKA,CAAC,EAAI8f,EAAU,KAAK,KAAK9f,CAAC,EAAI+f,GAIjE,IAAIe,EAAOF,EAASA,EAASC,EAASA,EACtCjB,GAASc,EAASE,EAASD,EAASE,GAAUC,EAC9CjB,GAASc,EAASC,EAASF,EAASG,GAAUC,CAChD,CAGA,IAAInB,EAAQC,EACRH,EAAWI,EACXkB,EAAU,EAEVvB,EAAQ,EACZ,IAAKxf,EAAI,EAAGA,GAAK,EAAGA,IAClB+gB,EAAUA,EAAUpB,EACpBH,EAAQA,EAAQ,KAAK,EAAExf,CAAC,EAAI+gB,EAK9B,IAAI3tB,EAAM,KAAK,KAAQosB,EAAQxqB,GAAa,IACxCoK,GAAM,KAAK,MAAQqgB,EAEvB,OAAA/oB,EAAE,EAAI0I,GACN1I,EAAE,EAAItD,EAECsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,uBAAwB,MAAM,EAClD,MAAA0hB,GAAe,CACb,KAAM9hB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECtNO,SAASJ,IAAO,CAEvB,CAIO,SAASC,GAAQzI,EAAG,CACzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAGRigB,EAAOjY,EAAWU,EAAM,KAAK,KAAK,EAClCxO,EAAI,KAAK,GAAK,KAAK,EAAI+lB,EACvB9lB,EAAI,KAAK,GAAK,KAAK,EAAI,KAAK,IAAI,KAAK,IAAK,KAAK,GAAK,EAAMuC,EAAM,GAAI,CAAC,EAAI,KAE7E,OAAAsD,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CACzBA,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GAEZ,IAAI0I,EAAMV,EAAW,KAAK,MAAQhI,EAAE,EAAI,KAAK,CAAC,EAC1CtD,EAAM,KAAO,KAAK,KAAK,KAAK,IAAI,GAAMsD,EAAE,EAAI,KAAK,CAAC,CAAC,EAAI,KAAK,GAAK,GAErE,OAAAA,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,qBAAsB,MAAM,EAChD,MAAA2hB,GAAe,CACb,KAAM/hB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EChDA,IAAIyS,GAAW,GAQR,SAAS7S,IAAO,CAKhB,KAAK,QAIR,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,GAAK,EACV,KAAK,IAAM,KAAK,MAAM,KAAK,EAAI,GAAK,KAAK,CAAC,EAC1C,KAAK,IAAM,KAAK,KAAO,KAAK,EAAI,IAPhC,KAAK,GAAKwS,GAAQ,KAAK,EAAE,CAU7B,CAIO,SAASvS,GAAQzI,EAAG,CACzB,IAAI9F,EAAGC,EACHuO,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAKZ,GAFA0I,EAAMV,EAAWU,EAAM,KAAK,KAAK,EAE7B,KAAK,OAAQ,CACf,GAAI,CAAC,KAAK,EACRhM,EAAM,KAAK,IAAM,EAAI,KAAK,KAAK,KAAK,EAAI,KAAK,IAAIA,CAAG,CAAC,EAAIA,MAIzD,SADI8e,EAAI,KAAK,EAAI,KAAK,IAAI9e,CAAG,EACpBzC,EAAIohB,GAAUphB,EAAG,EAAEA,EAAG,CAC7B,IAAI4a,GAAK,KAAK,EAAInY,EAAM,KAAK,IAAIA,CAAG,EAAI8e,IAAM,KAAK,EAAI,KAAK,IAAI9e,CAAG,GAEnE,GADAA,GAAOmY,EACH,KAAK,IAAIA,CAAC,EAAIlW,EAChB,KAEJ,CAEFzE,EAAI,KAAK,EAAI,KAAK,IAAMwO,GAAO,KAAK,EAAI,KAAK,IAAIhM,CAAG,GACpDvC,EAAI,KAAK,EAAI,KAAK,IAAMuC,CAE1B,KACK,CAEH,IAAI+e,EAAI,KAAK,IAAI/e,CAAG,EAChB,EAAI,KAAK,IAAIA,CAAG,EACpBvC,EAAI,KAAK,EAAI+gB,GAAQxe,EAAK+e,EAAG,EAAG,KAAK,EAAE,EACvCvhB,EAAI,KAAK,EAAIwO,EAAM,EAAI,KAAK,KAAK,EAAI,KAAK,GAAK+S,EAAIA,CAAC,CACtD,CAEA,OAAAzb,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAItD,EAAK4f,EAAM5T,EAAK+S,EAEpB,OAAAzb,EAAE,GAAK,KAAK,GACZ0I,EAAM1I,EAAE,EAAI,KAAK,EACjBA,EAAE,GAAK,KAAK,GACZtD,EAAMsD,EAAE,EAAI,KAAK,EAEb,KAAK,QACPtD,GAAO,KAAK,IACZgM,EAAMA,GAAO,KAAK,KAAO,KAAK,EAAI,KAAK,IAAIhM,CAAG,IAC1C,KAAK,EACPA,EAAMgrB,IAAO,KAAK,EAAIhrB,EAAM,KAAK,IAAIA,CAAG,GAAK,KAAK,CAAC,EAE5C,KAAK,IAAM,IAClBA,EAAMgrB,GAAM,KAAK,IAAIhrB,CAAG,EAAI,KAAK,CAAC,GAEpCgM,EAAMV,EAAWU,EAAM,KAAK,KAAK,EACjChM,EAAMuoB,GAAWvoB,CAAG,IAGpBA,EAAM4e,GAAYtb,EAAE,EAAI,KAAK,EAAG,KAAK,GAAI,KAAK,EAAE,EAChDyb,EAAI,KAAK,IAAI/e,CAAG,EACZ+e,EAAIld,GACNkd,EAAI,KAAK,IAAI/e,CAAG,EAChB4f,EAAO,KAAK,MAAQtc,EAAE,EAAI,KAAK,KAAK,EAAI,KAAK,GAAKyb,EAAIA,CAAC,GAAK,KAAK,EAAI,KAAK,IAAI/e,CAAG,GAEjFgM,EAAMV,EAAWsU,CAAI,GAEbb,EAAI9c,EAASJ,IACrBmK,EAAM,KAAK,QAGf1I,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,aAAc,MAAM,EACxC,MAAA4hB,GAAe,CACb,KAAMhiB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECjHO,SAASJ,IAAO,CAAC,CAIjB,SAASC,GAAQzI,EAAG,CAazB,QATI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAER0b,EAAY1T,EAAWU,EAAM,KAAK,KAAK,EACvCsb,EAAQtnB,EACRoL,EAAM,KAAK,GAAK,KAAK,IAAIpL,CAAG,IAInB,CACX,IAAI+tB,EAAc,EAAEzG,EAAQ,KAAK,IAAIA,CAAK,EAAIlc,IAAQ,EAAI,KAAK,IAAIkc,CAAK,GAExE,GADAA,GAASyG,EACL,KAAK,IAAIA,CAAW,EAAI9rB,EAC1B,KAEJ,CACAqlB,GAAS,EAKL,KAAK,GAAK,EAAI,KAAK,IAAItnB,CAAG,EAAIiC,IAChC+c,EAAY,GAEd,IAAIxhB,EAAI,cAAiB,KAAK,EAAIwhB,EAAY,KAAK,IAAIsI,CAAK,EAAI,KAAK,GACjE7pB,EAAI,gBAAkB,KAAK,EAAI,KAAK,IAAI6pB,CAAK,EAAI,KAAK,GAE1D,OAAAhkB,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAIgkB,EACAzI,EAIJvb,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GACZub,EAAMvb,EAAE,GAAK,gBAAkB,KAAK,GAKhC,KAAK,IAAIub,CAAG,EAAI,gBAClBA,EAAM,eAERyI,EAAQ,KAAK,KAAKzI,CAAG,EACrB,IAAI7S,EAAMV,EAAW,KAAK,MAAShI,EAAE,GAAK,cAAiB,KAAK,EAAI,KAAK,IAAIgkB,CAAK,EAAG,EACjFtb,EAAO,CAAC,KAAK,KACfA,EAAM,CAAC,KAAK,IAEVA,EAAM,KAAK,KACbA,EAAM,KAAK,IAEb6S,GAAO,EAAIyI,EAAQ,KAAK,IAAI,EAAIA,CAAK,GAAK,KAAK,GAC3C,KAAK,IAAIzI,CAAG,EAAI,IAClBA,EAAM,GAER,IAAI7e,EAAM,KAAK,KAAK6e,CAAG,EAEvB,OAAAvb,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,YAAa,MAAM,EACvC,MAAA8hB,GAAe,CACb,KAAMliB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECvEO,SAASJ,IAAO,CAKjB,KAAK,IAAI,KAAK,KAAO,KAAK,IAAI,EAAI7J,IAGtC,KAAK,KAAO,KAAK,MAAQ,KAAK,KAC9B,KAAK,KAAO,KAAK,EAAI,KAAK,EAC1B,KAAK,GAAK,EAAI,KAAK,IAAI,KAAK,KAAM,CAAC,EACnC,KAAK,EAAI,KAAK,KAAK,KAAK,EAAE,EAC1B,KAAK,GAAKimB,GAAK,KAAK,EAAE,EACtB,KAAK,GAAKC,GAAK,KAAK,EAAE,EACtB,KAAK,GAAKC,GAAK,KAAK,EAAE,EACtB,KAAK,GAAKC,GAAK,KAAK,EAAE,EAEtB,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAEhC,KAAK,IAAMrd,GAAM,KAAK,EAAG,KAAK,OAAQ,KAAK,MAAM,EACjD,KAAK,IAAM+c,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,IAAI,EAEzD,KAAK,IAAI,KAAK,KAAO,KAAK,IAAI,EAAI9lB,EACpC,KAAK,GAAK,KAAK,QAGf,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,IAAM+I,GAAM,KAAK,EAAG,KAAK,OAAQ,KAAK,MAAM,EACjD,KAAK,IAAM+c,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,IAAI,EAC7D,KAAK,IAAM,KAAK,IAAM,KAAK,MAAQ,KAAK,IAAM,KAAK,MAErD,KAAK,EAAI,KAAK,IAAM,KAAK,IAAM,KAAK,GACpC,KAAK,IAAMA,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,IAAI,EAC7D,KAAK,GAAK,KAAK,GAAK,KAAK,EAAI,KAAK,KACpC,CAIO,SAAShc,GAAQzI,EAAG,CACzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EACR+jB,EAIJ,GAAI,KAAK,OACPA,EAAM,KAAK,GAAK,KAAK,EAAIrnB,OAEtB,CACH,IAAIuf,EAAKwI,EAAK,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI/nB,CAAG,EACrDqnB,EAAM,KAAK,GAAK,KAAK,EAAI9H,EAC3B,CACA,IAAI+H,EAAQ,KAAK,GAAKhc,EAAWU,EAAM,KAAK,KAAK,EAC7CxO,EAAI,KAAK,GAAK6pB,EAAM,KAAK,IAAIC,CAAK,EAClC7pB,EAAI,KAAK,GAAK,KAAK,GAAK4pB,EAAM,KAAK,IAAIC,CAAK,EAChD,OAAAhkB,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CACzBA,EAAE,GAAK,KAAK,GACZA,EAAE,EAAI,KAAK,GAAKA,EAAE,EAAI,KAAK,GAC3B,IAAI8H,EAAKic,EAAKrnB,EAAKgM,EACf,KAAK,IAAM,GACbqb,EAAM,KAAK,KAAK/jB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACrC8H,EAAM,IAGNic,EAAM,CAAC,KAAK,KAAK/jB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACtC8H,EAAM,IAER,IAAIkc,EAAQ,EAKZ,GAJID,IAAQ,IACVC,EAAQ,KAAK,MAAMlc,EAAM9H,EAAE,EAAG8H,EAAM9H,EAAE,CAAC,GAGrC,KAAK,OACP,OAAA0I,EAAMV,EAAW,KAAK,MAAQgc,EAAQ,KAAK,EAAE,EAC7CtnB,EAAMuoB,GAAW,KAAK,EAAIlB,EAAM,KAAK,CAAC,EACtC/jB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,EAGP,IAAIic,EAAK,KAAK,EAAI8H,EAAM,KAAK,EAC7B,OAAArnB,EAAMwoB,GAAMjJ,EAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,EAAE,EAClDvT,EAAMV,EAAW,KAAK,MAAQgc,EAAQ,KAAK,EAAE,EAC7ChkB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CAGX,CAEO,IAAI4I,GAAQ,CAAC,oBAAqB,MAAM,EAC/C,MAAA+hB,GAAe,CACb,KAAMniB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EC5GO,SAASJ,IAAO,CAErB,KAAK,EAAI,KAAK,CAChB,CAEO,SAASC,GAAQzI,EAAG,CAEzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAIRigB,EAAOjY,EAAWU,EAAM,KAAK,KAAK,EAClCxO,EAAGC,EAEH,KAAK,IAAIuC,CAAG,GAAKiC,IACnBzE,EAAI,KAAK,GAAK,KAAK,EAAI+lB,EACvB9lB,EAAI,KAAK,IAEX,IAAI6pB,EAAQ0D,GAAM,EAAI,KAAK,IAAIhrB,EAAM,KAAK,EAAE,CAAC,GACxC,KAAK,IAAIujB,CAAI,GAAKthB,GAAW,KAAK,IAAI,KAAK,IAAIjC,CAAG,EAAI6B,CAAO,GAAKI,KACrEzE,EAAI,KAAK,GACLwC,GAAO,EACTvC,EAAI,KAAK,GAAK,KAAK,GAAK,KAAK,EAAI,KAAK,IAAI,GAAM6pB,CAAK,EAGrD7pB,EAAI,KAAK,GAAK,KAAK,GAAK,KAAK,EAAI,CAAC,KAAK,IAAI,GAAM6pB,CAAK,GAI1D,IAAInI,EAAK,GAAM,KAAK,IAAK,KAAK,GAAKoE,EAASA,EAAO,KAAK,EAAG,EACvDqF,EAAMzJ,EAAKA,EACX+O,EAAQ,KAAK,IAAI5G,CAAK,EACtB6G,EAAQ,KAAK,IAAI7G,CAAK,EAEtB,EAAI6G,GAASD,EAAQC,EAAQ,GAC7BC,EAAM,EAAI,EACVC,EAAI,GAAK,EAAIH,EAAQ,GACrBI,EAAMD,EAAIA,EACVjjB,EAAM,KAAK,GAAK,KAAK,GAAK+T,GAAM,EAAImP,GAAO,KAAK,KAAK1F,GAAO,EAAI0F,IAAQ,EAAIA,IAAQA,EAAM1F,IAAQwF,EAAME,EAAI,IAAMA,EAAM1F,GACxHrF,EAAO,IACTnY,EAAM,CAACA,GAET5N,EAAI,KAAK,GAAK4N,EAEd,IAAI0e,EAAIlB,EAAM,EACd,OAAAxd,EAAM,KAAK,GAAK,KAAK,GAAKijB,EAAIvE,EAAI3K,EAAK,KAAK,MAAMmP,EAAM1F,IAAQA,EAAM,GAAKkB,EAAIA,CAAC,IAAMwE,EAAM1F,GACxF5oB,GAAO,EAETvC,EAAI,KAAK,GAAK2N,EAId3N,EAAI,KAAK,GAAK2N,EAEhB9H,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAI0I,EAAKhM,EACLuuB,EAAIC,EAAIC,EAAKC,EAAIC,EAAIC,EACrBC,EACAC,EACA1jB,EACA2jB,EACAjwB,EAIJ,OAAAwE,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GACZ8H,EAAM,KAAK,GAAK,KAAK,EACrBmjB,EAAKjrB,EAAE,EAAI8H,EACXojB,EAAKlrB,EAAE,EAAI8H,EACXqjB,EAAMF,EAAKA,EAAKC,EAAKA,EACrBE,EAAK,CAAC,KAAK,IAAIF,CAAE,GAAK,EAAIC,GAC1BE,EAAKD,EAAK,EAAIF,EAAKA,EAAKD,EAAKA,EAC7BK,EAAK,GAAKF,EAAK,EAAI,EAAIF,EAAKA,EAAKC,EAAMA,EACvC3vB,EAAI0vB,EAAKA,EAAKI,GAAM,EAAID,EAAKA,EAAKA,EAAKC,EAAKA,EAAKA,EAAK,EAAIF,EAAKC,EAAKC,EAAKA,GAAM,GAC/EC,GAAMH,EAAKC,EAAKA,EAAK,EAAIC,GAAMA,EAC/BE,EAAK,EAAI,KAAK,KAAK,CAACD,EAAK,CAAC,EAC1BzjB,EAAQ,EAAItM,EAAK+vB,EAAMC,EACnB,KAAK,IAAI1jB,CAAG,EAAI,IACdA,GAAO,EACTA,EAAM,EAGNA,EAAM,IAGV2jB,EAAM,KAAK,KAAK3jB,CAAG,EAAI,EACnB9H,EAAE,GAAK,EACTtD,GAAO,CAAC8uB,EAAK,KAAK,IAAIC,EAAM,KAAK,GAAK,CAAC,EAAIJ,EAAK,EAAIC,GAAM,KAAK,GAG/D5uB,EAAM,EAAE,CAAC8uB,EAAK,KAAK,IAAIC,EAAM,KAAK,GAAK,CAAC,EAAIJ,EAAK,EAAIC,GAAM,KAAK,GAG9D,KAAK,IAAIL,CAAE,EAAItsB,EACjB+J,EAAM,KAAK,MAGXA,EAAMV,EAAW,KAAK,MAAQ,KAAK,IAAMmjB,EAAM,EAAI,KAAK,KAAK,EAAI,GAAKF,EAAKA,EAAKC,EAAKA,GAAMC,EAAMA,CAAG,GAAK,EAAIF,CAAE,EAGjHjrB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,CACT,CAEO,IAAI4I,GAAQ,CAAC,oBAAqB,gBAAiB,OAAO,EACjE,MAAA8iB,GAAe,CACb,KAAMljB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EClHO,SAASJ,IAAO,CACrB,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,EACjC,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,CACnC,CAEO,SAASC,GAAQzI,EAAG,CACzB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EACR4H,EAAS,KAAK,IAAI5H,EAAE,CAAC,EACrB6H,EAAS,KAAK,IAAI7H,EAAE,CAAC,EACrBigB,EAAOjY,EAAWU,EAAM,KAAK,KAAK,EAClCgc,EAAI7N,EAAI6J,EAAIiE,EAAIgH,EAAKC,EAAIpD,EAAQqD,EAAKC,EAAIC,EAAKC,EAAIC,EAAGnK,EAAGoK,EAAIC,EAAIxvB,EAAGyvB,EAAIC,EAAO5Q,EAAG6Q,EAAIC,EAAIC,EAAIC,EAClG,OAAI,KAAK,OACH,KAAK,IAAI,KAAK,QAAU,CAAC,GAAK9tB,GAEhCqB,EAAE,EAAI,KAAK,GAAK,KAAK,GAAKzB,EAAU7B,GAAO,KAAK,IAAIujB,CAAI,EACxDjgB,EAAE,EAAI,KAAK,GAAK,KAAK,GAAKzB,EAAU7B,GAAO,KAAK,IAAIujB,CAAI,EACjDjgB,GAEA,KAAK,IAAI,KAAK,QAAU,CAAC,GAAKrB,GAErCqB,EAAE,EAAI,KAAK,GAAK,KAAK,GAAKzB,EAAU7B,GAAO,KAAK,IAAIujB,CAAI,EACxDjgB,EAAE,EAAI,KAAK,GAAK,KAAK,GAAKzB,EAAU7B,GAAO,KAAK,IAAIujB,CAAI,EACjDjgB,IAIPqsB,EAAQ,KAAK,QAAUzkB,EAAS,KAAK,QAAUC,EAAS,KAAK,IAAIoY,CAAI,EACrEtjB,EAAI,KAAK,KAAK0vB,CAAK,EACnBD,EAAKzvB,EAAIA,EAAI,KAAK,IAAIA,CAAC,EAAI,EAC3BqD,EAAE,EAAI,KAAK,GAAK,KAAK,EAAIosB,EAAKvkB,EAAS,KAAK,IAAIoY,CAAI,EACpDjgB,EAAE,EAAI,KAAK,GAAK,KAAK,EAAIosB,GAAM,KAAK,QAAUxkB,EAAS,KAAK,QAAUC,EAAS,KAAK,IAAIoY,CAAI,GACrFjgB,IAIT0kB,EAAKE,GAAK,KAAK,EAAE,EACjB/N,EAAKgO,GAAK,KAAK,EAAE,EACjBnE,EAAKoE,GAAK,KAAK,EAAE,EACjBH,EAAKI,GAAK,KAAK,EAAE,EACb,KAAK,IAAI,KAAK,QAAU,CAAC,GAAKpmB,GAEhCgtB,EAAM,KAAK,EAAIlH,EAAKC,EAAI7N,EAAI6J,EAAIiE,EAAIpmB,CAAO,EAC3CqtB,EAAK,KAAK,EAAInH,EAAKC,EAAI7N,EAAI6J,EAAIiE,EAAIjoB,CAAG,EACtCsD,EAAE,EAAI,KAAK,IAAM2rB,EAAMC,GAAM,KAAK,IAAI3L,CAAI,EAC1CjgB,EAAE,EAAI,KAAK,IAAM2rB,EAAMC,GAAM,KAAK,IAAI3L,CAAI,EACnCjgB,GAEA,KAAK,IAAI,KAAK,QAAU,CAAC,GAAKrB,GAErCgtB,EAAM,KAAK,EAAIlH,EAAKC,EAAI7N,EAAI6J,EAAIiE,EAAIpmB,CAAO,EAC3CqtB,EAAK,KAAK,EAAInH,EAAKC,EAAI7N,EAAI6J,EAAIiE,EAAIjoB,CAAG,EACtCsD,EAAE,EAAI,KAAK,IAAM2rB,EAAMC,GAAM,KAAK,IAAI3L,CAAI,EAC1CjgB,EAAE,EAAI,KAAK,IAAM2rB,EAAMC,GAAM,KAAK,IAAI3L,CAAI,EACnCjgB,IAIPwoB,EAAS5gB,EAASC,EAClBgkB,EAAM7G,GAAG,KAAK,EAAG,KAAK,EAAG,KAAK,OAAO,EACrC8G,EAAK9G,GAAG,KAAK,EAAG,KAAK,EAAGpd,CAAM,EAC9BmkB,EAAM,KAAK,MAAM,EAAI,KAAK,IAAMvD,EAAS,KAAK,GAAKqD,EAAM,KAAK,SAAWC,EAAKjkB,EAAO,EACrFmkB,EAAK,KAAK,MAAM,KAAK,IAAI/L,CAAI,EAAG,KAAK,QAAU,KAAK,IAAI8L,CAAG,EAAI,KAAK,QAAU,KAAK,IAAI9L,CAAI,CAAC,EACxF+L,IAAO,EACTvQ,EAAI,KAAK,KAAK,KAAK,QAAU,KAAK,IAAIsQ,CAAG,EAAI,KAAK,QAAU,KAAK,IAAIA,CAAG,CAAC,EAElE,KAAK,IAAI,KAAK,IAAIC,CAAE,EAAI,KAAK,EAAE,GAAKrtB,EAC3C8c,EAAI,CAAC,KAAK,KAAK,KAAK,QAAU,KAAK,IAAIsQ,CAAG,EAAI,KAAK,QAAU,KAAK,IAAIA,CAAG,CAAC,EAG1EtQ,EAAI,KAAK,KAAK,KAAK,IAAIwE,CAAI,EAAI,KAAK,IAAI8L,CAAG,EAAI,KAAK,IAAIC,CAAE,CAAC,EAE7DC,EAAI,KAAK,EAAI,KAAK,QAAU,KAAK,KAAK,EAAI,KAAK,EAAE,EACjDnK,EAAI,KAAK,EAAI,KAAK,QAAU,KAAK,IAAIkK,CAAE,EAAI,KAAK,KAAK,EAAI,KAAK,EAAE,EAChEE,EAAKD,EAAInK,EACTqK,EAAKrK,EAAIA,EACTwK,EAAK7Q,EAAIA,EACT8Q,EAAKD,EAAK7Q,EACV+Q,EAAKD,EAAK9Q,EACVgR,EAAKD,EAAK/Q,EACV9e,EAAIkvB,EAAMpQ,GAAK,EAAI6Q,EAAKH,GAAM,EAAIA,GAAM,EAAII,EAAK,EAAIL,GAAM,EAAI,EAAIC,GAAMK,EAAK,KAAOL,GAAM,EAAI,EAAIA,GAAM,EAAIF,EAAIA,GAAK,EAAI,EAAIE,IAAOM,EAAK,GAAKP,GAC/IlsB,EAAE,EAAI,KAAK,GAAKrD,EAAI,KAAK,IAAIqvB,CAAE,EAC/BhsB,EAAE,EAAI,KAAK,GAAKrD,EAAI,KAAK,IAAIqvB,CAAE,EACxBhsB,GAKb,CAEO,SAAS2I,GAAQ3I,EAAG,CACzBA,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GACZ,IAAIggB,EAAI5lB,EAAG2sB,EAAMD,EAAMpe,EAAKhM,EAAKoL,EAAK4c,EAAI7N,EAAI6J,EAAIiE,EAAIgH,EAAKzV,EAAGY,EAAIiV,EAAKC,EAAIU,EAAOhO,EAAKhK,EAAGqI,EAAG7F,EAAGyV,EAAI9K,EAAG+K,EACvG,OAAI,KAAK,QACP5M,EAAK,KAAK,KAAKhgB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EAChCggB,EAAM,EAAIzhB,EAAU,KAAK,EAC3B,QAEFnE,EAAI4lB,EAAK,KAAK,EAEd+G,EAAO,KAAK,IAAI3sB,CAAC,EACjB0sB,EAAO,KAAK,IAAI1sB,CAAC,EAEjBsO,EAAM,KAAK,MACP,KAAK,IAAIsX,CAAE,GAAKrhB,EAClBjC,EAAM,KAAK,MAGXA,EAAMgrB,GAAMZ,EAAO,KAAK,QAAW9mB,EAAE,EAAI+mB,EAAO,KAAK,QAAW/G,CAAE,EAClElY,EAAM,KAAK,IAAI,KAAK,IAAI,EAAIvJ,EACxB,KAAK,IAAIuJ,CAAG,GAAKnJ,EACf,KAAK,MAAQ,EACf+J,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAG,CAAEA,EAAE,CAAC,CAAC,EAGpD0I,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAM,CAAChI,EAAE,EAAGA,EAAE,CAAC,CAAC,EAWrD0I,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAI+mB,EAAM/G,EAAK,KAAK,QAAU8G,EAAO9mB,EAAE,EAAI,KAAK,QAAU+mB,CAAI,CAAC,GAI9G/mB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,KAGP0kB,EAAKE,GAAK,KAAK,EAAE,EACjB/N,EAAKgO,GAAK,KAAK,EAAE,EACjBnE,EAAKoE,GAAK,KAAK,EAAE,EACjBH,EAAKI,GAAK,KAAK,EAAE,EACb,KAAK,IAAI,KAAK,QAAU,CAAC,GAAKpmB,GAEhCgtB,EAAM,KAAK,EAAIlH,EAAKC,EAAI7N,EAAI6J,EAAIiE,EAAIpmB,CAAO,EAC3CyhB,EAAK,KAAK,KAAKhgB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACpCkW,EAAIyV,EAAM3L,EACVtjB,EAAMwoB,GAAMhP,EAAI,KAAK,EAAGwO,EAAI7N,EAAI6J,EAAIiE,CAAE,EACtCjc,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAG,GAAMA,EAAE,CAAC,CAAC,EACxDA,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,GAEA,KAAK,IAAI,KAAK,QAAU,CAAC,GAAKrB,GAErCgtB,EAAM,KAAK,EAAIlH,EAAKC,EAAI7N,EAAI6J,EAAIiE,EAAIpmB,CAAO,EAC3CyhB,EAAK,KAAK,KAAKhgB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACpCkW,EAAI8J,EAAK2L,EAETjvB,EAAMwoB,GAAMhP,EAAI,KAAK,EAAGwO,EAAI7N,EAAI6J,EAAIiE,CAAE,EACtCjc,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAGA,EAAE,CAAC,CAAC,EAClDA,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,IAIPggB,EAAK,KAAK,KAAKhgB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACpCgsB,EAAK,KAAK,MAAMhsB,EAAE,EAAGA,EAAE,CAAC,EACxB8W,EAAKkO,GAAG,KAAK,EAAG,KAAK,EAAG,KAAK,OAAO,EACpC0H,EAAQ,KAAK,IAAIV,CAAE,EACnBtN,EAAM,KAAK,EAAI,KAAK,QAAUgO,EAC9BhY,EAAI,CAACgK,EAAMA,GAAO,EAAI,KAAK,IAC3B3B,EAAI,EAAI,KAAK,IAAM,EAAIrI,GAAK,KAAK,QAAU,KAAK,QAAUgY,GAAS,EAAI,KAAK,IAC5ExV,EAAI8I,EAAKlJ,EACT6V,EAAKzV,EAAIxC,GAAK,EAAIA,GAAK,KAAK,IAAIwC,EAAG,CAAC,EAAI,EAAI6F,GAAK,EAAI,EAAIrI,GAAK,KAAK,IAAIwC,EAAG,CAAC,EAAI,GAC/E2K,EAAI,EAAInN,EAAIiY,EAAKA,EAAK,EAAIzV,EAAIyV,EAAKA,EAAKA,EAAK,EAC7CZ,EAAM,KAAK,KAAK,KAAK,QAAU,KAAK,IAAIY,CAAE,EAAI,KAAK,QAAU,KAAK,IAAIA,CAAE,EAAID,CAAK,EACjFhkB,EAAMV,EAAW,KAAK,MAAQ,KAAK,KAAK,KAAK,IAAIgkB,CAAE,EAAI,KAAK,IAAIW,CAAE,EAAI,KAAK,IAAIZ,CAAG,CAAC,CAAC,EACpFa,EAAS,KAAK,IAAIb,CAAG,EACrBrvB,EAAM,KAAK,OAAOkwB,EAAS,KAAK,GAAK/K,EAAI,KAAK,SAAW,KAAK,IAAIkK,CAAG,EAAGa,GAAU,EAAI,KAAK,GAAG,EAC9F5sB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,GAIb,CAEO,IAAI4I,GAAQ,CAAC,wBAAyB,MAAM,EACnD,MAAAikB,GAAe,CACb,KAAMrkB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EC3MO,SAASJ,IAAO,CAKrB,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,EACjC,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,CACnC,CAIO,SAASC,GAAQzI,EAAG,CACzB,IAAI4H,EAAQC,EACRoY,EACA8H,EACAC,EACA3L,EAAGniB,EAAGC,EACNuO,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EAGZ,OAAAigB,EAAOjY,EAAWU,EAAM,KAAK,KAAK,EAElCd,EAAS,KAAK,IAAIlL,CAAG,EACrBmL,EAAS,KAAK,IAAInL,CAAG,EAErBqrB,EAAS,KAAK,IAAI9H,CAAI,EACtB5D,EAAI,KAAK,QAAUzU,EAAS,KAAK,QAAUC,EAASkgB,EACpDC,EAAM,GACD3L,EAAI,GAAO,KAAK,IAAIA,CAAC,GAAK1d,KAC7BzE,EAAI,KAAK,EAAI8tB,EAAMngB,EAAS,KAAK,IAAIoY,CAAI,EACzC9lB,EAAI,KAAK,GAAK,KAAK,EAAI6tB,GAAO,KAAK,QAAUpgB,EAAS,KAAK,QAAUC,EAASkgB,IAEhF/nB,EAAE,EAAI9F,EACN8F,EAAE,EAAI7F,EACC6F,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAIggB,EACA5lB,EACA2sB,EAAMD,EACNhf,EACAY,EAAKhM,EAYT,OATAsD,EAAE,GAAK,KAAK,GACZA,EAAE,GAAK,KAAK,GACZggB,EAAK,KAAK,KAAKhgB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EACpC5F,EAAIstB,GAAM1H,EAAK,KAAK,CAAC,EAErB+G,EAAO,KAAK,IAAI3sB,CAAC,EACjB0sB,EAAO,KAAK,IAAI1sB,CAAC,EAEjBsO,EAAM,KAAK,MACP,KAAK,IAAIsX,CAAE,GAAKrhB,GAClBjC,EAAM,KAAK,KACXsD,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,IAETtD,EAAMgrB,GAAMZ,EAAO,KAAK,QAAW9mB,EAAE,EAAI+mB,EAAO,KAAK,QAAW/G,CAAE,EAClElY,EAAM,KAAK,IAAI,KAAK,IAAI,EAAIvJ,EACxB,KAAK,IAAIuJ,CAAG,GAAKnJ,GACf,KAAK,MAAQ,EACf+J,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAMhI,EAAE,EAAG,CAAEA,EAAE,CAAC,CAAC,EAGpD0I,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAM,CAAChI,EAAE,EAAGA,EAAE,CAAC,CAAC,EAErDA,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,IAET0I,EAAMV,EAAW,KAAK,MAAQ,KAAK,MAAOhI,EAAE,EAAI+mB,EAAO/G,EAAK,KAAK,QAAU8G,EAAO9mB,EAAE,EAAI,KAAK,QAAU+mB,CAAI,CAAC,EAC5G/mB,EAAE,EAAI0I,EACN1I,EAAE,EAAItD,EACCsD,GACT,CAEO,IAAI4I,GAAQ,CAAC,OAAO,EAC3B,MAAAkkB,GAAe,CACb,KAAMtkB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECpFA,IAAImkB,EAAY,CACZ,MAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,IAAK,EACL,OAAQ,CACZ,EAEIC,EAAY,CACZ,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,OAAQ,CACZ,EAEO,SAASxkB,IAAO,CAErB,KAAK,GAAK,KAAK,IAAM,EACrB,KAAK,GAAK,KAAK,IAAM,EACrB,KAAK,KAAO,KAAK,MAAQ,EACzB,KAAK,MAAQ,KAAK,OAAS,EAC3B,KAAK,OAAS,KAAK,QAAU,EAC7B,KAAK,MAAQ,KAAK,OAAS,mCAGvB,KAAK,MAAQjK,EAAUO,EAAS,EAClC,KAAK,KAAOiuB,EAAU,IACb,KAAK,MAAQ,EAAExuB,EAAUO,EAAS,GAC3C,KAAK,KAAOiuB,EAAU,OACb,KAAK,IAAI,KAAK,KAAK,GAAKjuB,EACjC,KAAK,KAAOiuB,EAAU,MACb,KAAK,IAAI,KAAK,KAAK,GAAKxuB,EAAUO,EAC3C,KAAK,KAAO,KAAK,MAAQ,EAAMiuB,EAAU,MAAQA,EAAU,KAE3D,KAAK,KAAOA,EAAU,KAKpB,KAAK,KAAO,IACd,KAAK,YAAc,GAAK,KAAK,EAAI,KAAK,GAAK,KAAK,EAChD,KAAK,oBAAsB,KAAK,YAAc,KAAK,YAEvD,CAIO,SAAStkB,GAAQzI,EAAG,CACzB,IAAIitB,EAAK,CAAC,EAAG,EAAG,EAAG,CAAC,EAChBvwB,EAAKgM,EACLsb,EAAO9b,EACP2J,EAAGsF,EAEHxU,EAAO,CAAC,MAAO,CAAC,EAoBpB,GAjBA3C,EAAE,GAAK,KAAK,MAKR,KAAK,KAAO,EACdtD,EAAM,KAAK,KAAK,KAAK,oBAAsB,KAAK,IAAIsD,EAAE,CAAC,CAAC,EAExDtD,EAAMsD,EAAE,EAQV0I,EAAM1I,EAAE,EACJ,KAAK,OAAS+sB,EAAU,IAC1B7kB,EAAM3J,EAAU7B,EACZgM,GAAO5J,GAAU4J,GAAOnK,EAAUO,GACpC6D,EAAK,MAAQqqB,EAAU,OACvBhJ,EAAQtb,EAAMnK,GACLmK,EAAMnK,EAAUO,GAAU4J,GAAO,EAAEnK,EAAUO,IACtD6D,EAAK,MAAQqqB,EAAU,OACvBhJ,EAAStb,EAAM,EAAMA,EAAM1J,EAAM0J,EAAM1J,GAC9B0J,EAAM,EAAEnK,EAAUO,IAAW4J,GAAO,CAAC5J,GAC9C6D,EAAK,MAAQqqB,EAAU,OACvBhJ,EAAQtb,EAAMnK,IAEdoE,EAAK,MAAQqqB,EAAU,OACvBhJ,EAAQtb,WAED,KAAK,OAASqkB,EAAU,OACjC7kB,EAAM3J,EAAU7B,EACZgM,GAAO5J,GAAU4J,GAAOnK,EAAUO,GACpC6D,EAAK,MAAQqqB,EAAU,OACvBhJ,EAAQ,CAACtb,EAAMnK,GACNmK,EAAM5J,GAAU4J,GAAO,CAAC5J,GACjC6D,EAAK,MAAQqqB,EAAU,OACvBhJ,EAAQ,CAACtb,GACAA,EAAM,CAAC5J,GAAU4J,GAAO,EAAEnK,EAAUO,IAC7C6D,EAAK,MAAQqqB,EAAU,OACvBhJ,EAAQ,CAACtb,EAAMnK,IAEfoE,EAAK,MAAQqqB,EAAU,OACvBhJ,EAAStb,EAAM,EAAM,CAACA,EAAM1J,EAAM,CAAC0J,EAAM1J,OAEtC,CACL,IAAIwnB,EAAGna,EAAGoP,EACNmE,EAAQC,EACRqN,EAAQnF,EAER,KAAK,OAASgF,EAAU,MAC1BrkB,EAAMykB,GAAqBzkB,EAAK,CAACnK,CAAO,EAC/B,KAAK,OAASwuB,EAAU,KACjCrkB,EAAMykB,GAAqBzkB,EAAK,CAAC1J,CAAG,EAC3B,KAAK,OAAS+tB,EAAU,OACjCrkB,EAAMykB,GAAqBzkB,EAAK,CAACnK,CAAO,GAE1CqhB,EAAS,KAAK,IAAIljB,CAAG,EACrBmjB,EAAS,KAAK,IAAInjB,CAAG,EACrBwwB,EAAS,KAAK,IAAIxkB,CAAG,EACrBqf,EAAS,KAAK,IAAIrf,CAAG,EACrB8d,EAAI3G,EAASkI,EACb1b,EAAIwT,EAASqN,EACbzR,EAAImE,EAEA,KAAK,OAASmN,EAAU,OAC1B7kB,EAAM,KAAK,KAAKse,CAAC,EACjBxC,EAAQoJ,GAAyBllB,EAAKuT,EAAGpP,EAAG1J,CAAI,GACvC,KAAK,OAASoqB,EAAU,OACjC7kB,EAAM,KAAK,KAAKmE,CAAC,EACjB2X,EAAQoJ,GAAyBllB,EAAKuT,EAAG,CAAC+K,EAAG7jB,CAAI,GACxC,KAAK,OAASoqB,EAAU,MACjC7kB,EAAM,KAAK,KAAK,CAACse,CAAC,EAClBxC,EAAQoJ,GAAyBllB,EAAKuT,EAAG,CAACpP,EAAG1J,CAAI,GACxC,KAAK,OAASoqB,EAAU,MACjC7kB,EAAM,KAAK,KAAK,CAACmE,CAAC,EAClB2X,EAAQoJ,GAAyBllB,EAAKuT,EAAG+K,EAAG7jB,CAAI,IAGhDuF,EAAM8b,EAAQ,EACdrhB,EAAK,MAAQqqB,EAAU,OAE3B,CAKA,OAAA7V,EAAK,KAAK,KAAM,GAAKnY,GAAQglB,EAAQ,KAAK,KAAK,KAAK,IAAIA,CAAK,EAAI,KAAK,IAAIllB,CAAM,CAAC,EAAIP,EAAQ,EAC7FsT,EAAI,KAAK,MAAM,EAAI,KAAK,IAAI3J,CAAG,IAAM,KAAK,IAAIiP,CAAE,EAAI,KAAK,IAAIA,CAAE,IAAM,EAAI,KAAK,IAAI,KAAK,KAAK,EAAI,KAAK,IAAI6M,CAAK,CAAC,CAAC,EAAE,EAG9GrhB,EAAK,QAAUqqB,EAAU,OAC3B7V,GAAM5Y,EACGoE,EAAK,QAAUqqB,EAAU,OAClC7V,GAAMnY,EACG2D,EAAK,QAAUqqB,EAAU,SAClC7V,GAAM,IAAMnY,GAIdiuB,EAAG,EAAIpb,EAAI,KAAK,IAAIsF,CAAE,EACtB8V,EAAG,EAAIpb,EAAI,KAAK,IAAIsF,CAAE,EACtB8V,EAAG,EAAIA,EAAG,EAAI,KAAK,EAAI,KAAK,GAC5BA,EAAG,EAAIA,EAAG,EAAI,KAAK,EAAI,KAAK,GAE5BjtB,EAAE,EAAIitB,EAAG,EACTjtB,EAAE,EAAIitB,EAAG,EACFjtB,CACT,CAIO,SAAS2I,GAAQ3I,EAAG,CACzB,IAAIqtB,EAAK,CAAC,IAAK,EAAG,IAAK,CAAC,EACpBlW,EAAImW,EAAIC,EAAOC,EACfC,EAAUzJ,EAAOnc,EAAQK,EACzB2J,EACAlP,EAAO,CAAC,MAAO,CAAC,EA4CpB,GAzCA3C,EAAE,GAAKA,EAAE,EAAI,KAAK,IAAM,KAAK,EAC7BA,EAAE,GAAKA,EAAE,EAAI,KAAK,IAAM,KAAK,EAI7BstB,EAAK,KAAK,KAAK,KAAK,KAAKttB,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,CAAC,EAC/CmX,EAAK,KAAK,MAAMnX,EAAE,EAAGA,EAAE,CAAC,EACpBA,EAAE,GAAK,GAAOA,EAAE,GAAK,KAAK,IAAIA,EAAE,CAAC,EACnC2C,EAAK,MAAQqqB,EAAU,OACdhtB,EAAE,GAAK,GAAOA,EAAE,GAAK,KAAK,IAAIA,EAAE,CAAC,GAC1C2C,EAAK,MAAQqqB,EAAU,OACvB7V,GAAM5Y,GACGyB,EAAE,EAAI,GAAO,CAACA,EAAE,GAAK,KAAK,IAAIA,EAAE,CAAC,GAC1C2C,EAAK,MAAQqqB,EAAU,OACvB7V,EAAMA,EAAK,EAAMA,EAAKnY,EAAMmY,EAAKnY,IAEjC2D,EAAK,MAAQqqB,EAAU,OACvB7V,GAAM5Y,GAQRsT,EAAK7S,EAAM,GAAM,KAAK,IAAImY,CAAE,EAC5BsW,EAAW,KAAK,IAAI5b,CAAC,GAAK,KAAK,IAAIA,CAAC,EAAK,EAAI,KAAK,KAAK,CAAC,GACxDmS,EAAQ,KAAK,KAAKyJ,CAAQ,EAC1BF,EAAQ,KAAK,IAAIpW,CAAE,EACnBqW,EAAQ,KAAK,IAAIF,CAAE,EACnBzlB,EAAS,EAAI0lB,EAAQA,EAAQC,EAAQA,GAAS,EAAI,KAAK,IAAI,KAAK,KAAK,EAAI,KAAK,IAAIxJ,CAAK,CAAC,CAAC,GACrFnc,EAAS,GACXA,EAAS,GACAA,EAAS,IAClBA,EAAS,GAOP,KAAK,OAASklB,EAAU,IAC1B7kB,EAAM,KAAK,KAAKL,CAAM,EACtBwlB,EAAG,IAAM9uB,EAAU2J,EACfvF,EAAK,QAAUqqB,EAAU,OAC3BK,EAAG,IAAMrJ,EAAQzlB,EACRoE,EAAK,QAAUqqB,EAAU,OAClCK,EAAG,IAAOrJ,EAAQ,EAAMA,EAAQhlB,EAAMglB,EAAQhlB,EACrC2D,EAAK,QAAUqqB,EAAU,OAClCK,EAAG,IAAMrJ,EAAQzlB,EAEjB8uB,EAAG,IAAMrJ,UAEF,KAAK,OAAS+I,EAAU,OACjC7kB,EAAM,KAAK,KAAKL,CAAM,EACtBwlB,EAAG,IAAMnlB,EAAM3J,EACXoE,EAAK,QAAUqqB,EAAU,OAC3BK,EAAG,IAAM,CAACrJ,EAAQzlB,EACToE,EAAK,QAAUqqB,EAAU,OAClCK,EAAG,IAAM,CAACrJ,EACDrhB,EAAK,QAAUqqB,EAAU,OAClCK,EAAG,IAAM,CAACrJ,EAAQzlB,EAElB8uB,EAAG,IAAOrJ,EAAQ,EAAM,CAACA,EAAQhlB,EAAM,CAACglB,EAAQhlB,MAE7C,CAEL,IAAIwnB,EAAGna,EAAGoP,EACV+K,EAAI3e,EACJgK,EAAI2U,EAAIA,EACJ3U,GAAK,EACP4J,EAAI,EAEJA,EAAI,KAAK,KAAK,EAAI5J,CAAC,EAAI,KAAK,IAAImS,CAAK,EAEvCnS,GAAK4J,EAAIA,EACL5J,GAAK,EACPxF,EAAI,EAEJA,EAAI,KAAK,KAAK,EAAIwF,CAAC,EAGjBlP,EAAK,QAAUqqB,EAAU,QAC3Bnb,EAAIxF,EACJA,EAAI,CAACoP,EACLA,EAAI5J,GACKlP,EAAK,QAAUqqB,EAAU,QAClC3gB,EAAI,CAACA,EACLoP,EAAI,CAACA,GACI9Y,EAAK,QAAUqqB,EAAU,SAClCnb,EAAIxF,EACJA,EAAIoP,EACJA,EAAI,CAAC5J,GAGH,KAAK,OAASkb,EAAU,OAC1Blb,EAAI2U,EACJA,EAAI,CAACna,EACLA,EAAIwF,GACK,KAAK,OAASkb,EAAU,MACjCvG,EAAI,CAACA,EACLna,EAAI,CAACA,GACI,KAAK,OAAS0gB,EAAU,OACjClb,EAAI2U,EACJA,EAAIna,EACJA,EAAI,CAACwF,GAGPwb,EAAG,IAAM,KAAK,KAAK,CAAC5R,CAAC,EAAIld,EACzB8uB,EAAG,IAAM,KAAK,MAAMhhB,EAAGma,CAAC,EACpB,KAAK,OAASuG,EAAU,MAC1BM,EAAG,IAAMF,GAAqBE,EAAG,IAAK,CAAC9uB,CAAO,EACrC,KAAK,OAASwuB,EAAU,KACjCM,EAAG,IAAMF,GAAqBE,EAAG,IAAK,CAACruB,CAAG,EACjC,KAAK,OAAS+tB,EAAU,OACjCM,EAAG,IAAMF,GAAqBE,EAAG,IAAK,CAAC9uB,CAAO,EAElD,CAIA,GAAI,KAAK,KAAO,EAAG,CACjB,IAAImvB,EACAlF,EAAQmF,EACZD,EAAeL,EAAG,IAAM,EAAI,EAAI,EAChC7E,EAAS,KAAK,IAAI6E,EAAG,GAAG,EACxBM,EAAK,KAAK,EAAI,KAAK,KAAKnF,EAASA,EAAS,KAAK,mBAAmB,EAClE6E,EAAG,IAAM,KAAK,KAAK,KAAK,KAAK,KAAK,EAAI,KAAK,EAAIM,EAAKA,CAAE,GAAK,KAAK,YAAcA,EAAG,EAC7ED,IACFL,EAAG,IAAM,CAACA,EAAG,IAEjB,CAEA,OAAAA,EAAG,KAAO,KAAK,MACfrtB,EAAE,EAAIqtB,EAAG,IACTrtB,EAAE,EAAIqtB,EAAG,IACFrtB,CACT,CAIA,SAASotB,GAAyBllB,EAAK/N,EAAGD,EAAGyI,EAAM,CACjD,IAAIqhB,EACJ,OAAI9b,EAAMvJ,GACRgE,EAAK,MAAQqqB,EAAU,OACvBhJ,EAAQ,IAERA,EAAQ,KAAK,MAAM7pB,EAAGD,CAAC,EACnB,KAAK,IAAI8pB,CAAK,GAAKllB,EACrB6D,EAAK,MAAQqqB,EAAU,OACdhJ,EAAQllB,GAAUklB,GAASzlB,EAAUO,GAC9C6D,EAAK,MAAQqqB,EAAU,OACvBhJ,GAASzlB,GACAylB,EAAQzlB,EAAUO,GAAUklB,GAAS,EAAEzlB,EAAUO,IAC1D6D,EAAK,MAAQqqB,EAAU,OACvBhJ,EAASA,GAAS,EAAMA,EAAQhlB,EAAMglB,EAAQhlB,IAE9C2D,EAAK,MAAQqqB,EAAU,OACvBhJ,GAASzlB,IAGNylB,CACT,CAGA,SAASmJ,GAAqBzkB,EAAK4D,EAAQ,CACzC,IAAIshB,EAAOllB,EAAM4D,EACjB,OAAIshB,EAAO,CAAC5uB,EACV4uB,GAAQ7uB,GACC6uB,EAAO,CAAC5uB,IACjB4uB,GAAQ7uB,IAEH6uB,CACT,CAEO,IAAIhlB,GAAQ,CAAC,mCAAoC,mCAAoC,KAAK,EACjG,MAAAilB,GAAe,CACb,KAAMrlB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECvWA,IAAIklB,GAAU,CACV,CAAC,EAAQ,UAAY,YAAc,SAAU,EAC7C,CAAC,MAAQ,WAAc,UAAa,UAAW,EAC/C,CAAC,MAAQ,UAAa,YAAc,WAAY,EAChD,CAAC,IAAQ,WAAa,UAAa,SAAU,EAC7C,CAAC,MAAQ,WAAa,YAAc,WAAY,EAChD,CAAC,KAAQ,WAAa,YAAc,SAAU,EAC9C,CAAC,IAAQ,WAAa,YAAc,UAAW,EAC/C,CAAC,MAAQ,WAAa,YAAc,UAAW,EAC/C,CAAC,MAAQ,WAAa,UAAa,UAAW,EAC9C,CAAC,MAAQ,WAAa,YAAc,WAAY,EAChD,CAAC,MAAQ,WAAa,WAAc,UAAW,EAC/C,CAAC,KAAQ,WAAa,YAAc,UAAW,EAC/C,CAAC,MAAQ,WAAa,YAAc,UAAW,EAC/C,CAAC,MAAQ,WAAa,UAAa,WAAY,EAC/C,CAAC,MAAQ,WAAa,YAAc,UAAW,EAC/C,CAAC,MAAQ,WAAa,WAAc,UAAW,EAC/C,CAAC,MAAQ,SAAW,WAAa,UAAW,EAC5C,CAAC,MAAQ,WAAa,OAAU,UAAW,EAC3C,CAAC,MAAQ,WAAa,UAAa,UAAW,CAClD,EAEIC,GAAU,CACV,CAAC,YAAc,MAAQ,WAAa,WAAY,EAChD,CAAC,KAAQ,MAAQ,YAAc,UAAW,EAC1C,CAAC,KAAQ,MAAQ,WAAa,WAAY,EAC1C,CAAC,KAAQ,SAAW,YAAc,UAAW,EAC7C,CAAC,KAAQ,SAAW,WAAa,QAAS,EAC1C,CAAC,IAAQ,SAAW,YAAc,UAAW,EAC7C,CAAC,KAAQ,SAAW,WAAa,WAAY,EAC7C,CAAC,KAAQ,SAAW,YAAc,WAAY,EAC9C,CAAC,MAAQ,SAAW,YAAc,WAAY,EAC9C,CAAC,MAAQ,SAAW,YAAc,WAAY,EAC9C,CAAC,MAAQ,SAAW,YAAc,WAAY,EAC9C,CAAC,MAAQ,QAAU,YAAc,WAAY,EAC7C,CAAC,MAAQ,SAAW,YAAc,WAAY,EAC9C,CAAC,MAAQ,SAAW,YAAc,WAAY,EAC9C,CAAC,MAAQ,SAAW,UAAa,WAAY,EAC7C,CAAC,MAAQ,UAAY,UAAa,QAAU,EAC5C,CAAC,MAAQ,UAAY,WAAc,UAAW,EAC9C,CAAC,MAAQ,UAAY,QAAW,UAAW,EAC3C,CAAC,EAAQ,UAAY,WAAc,UAAW,CAClD,EAEIC,GAAM,MACNC,GAAM,OACNjX,GAAKnY,GAAI,EACTqvB,GAAM,EAAElX,GACRmX,GAAQ,GAERC,GAAY,SAASC,EAAOn0B,EAAG,CAC/B,OAAOm0B,EAAM,CAAC,EAAIn0B,GAAKm0B,EAAM,CAAC,EAAIn0B,GAAKm0B,EAAM,CAAC,EAAIn0B,EAAIm0B,EAAM,CAAC,GACjE,EAEIC,GAAY,SAASD,EAAOn0B,EAAG,CAC/B,OAAOm0B,EAAM,CAAC,EAAIn0B,GAAK,EAAIm0B,EAAM,CAAC,EAAIn0B,EAAI,EAAIm0B,EAAM,CAAC,EACzD,EAEA,SAASE,GAAeC,EAAMhlB,EAAOilB,EAASC,EAAO,CAEjD,QADIx0B,EAAIsP,EACDklB,EAAO,EAAEA,EAAO,CACnB,IAAIC,EAAMH,EAAKt0B,CAAC,EAEhB,GADAA,GAAKy0B,EACD,KAAK,IAAIA,CAAG,EAAIF,EAChB,KAER,CACA,OAAOv0B,CACX,CAEO,SAASsO,IAAO,CACnB,KAAK,GAAK,KAAK,IAAM,EACrB,KAAK,GAAK,KAAK,IAAM,EACrB,KAAK,MAAQ,KAAK,OAAS,EAC3B,KAAK,GAAK,EACV,KAAK,MAAQ,KAAK,OAAS,UAC/B,CAEO,SAASC,GAAQsM,EAAI,CACxB,IAAIrM,EAAMV,EAAW+M,EAAG,EAAI,KAAK,KAAK,EAElCxM,EAAO,KAAK,IAAIwM,EAAG,CAAC,EACpB9a,EAAI,KAAK,MAAMsO,EAAOyO,EAAE,EACxB/c,EAAI,EACJA,EAAI,EACGA,GAAKk0B,KACZl0B,EAAIk0B,GAAQ,GAEhB5lB,EAAO1J,IAAO0J,EAAO2lB,GAAMj0B,GAC3B,IAAIgzB,EAAK,CACL,EAAGmB,GAAUN,GAAQ7zB,CAAC,EAAGsO,CAAI,EAAIG,EACjC,EAAG0lB,GAAUL,GAAQ9zB,CAAC,EAAGsO,CAAI,CACrC,EACI,OAAIwM,EAAG,EAAI,IACPkY,EAAG,EAAI,CAACA,EAAG,GAGfA,EAAG,EAAIA,EAAG,EAAI,KAAK,EAAIe,GAAM,KAAK,GAClCf,EAAG,EAAIA,EAAG,EAAI,KAAK,EAAIgB,GAAM,KAAK,GAC3BhB,CACX,CAEO,SAAStkB,GAAQskB,EAAI,CACxB,IAAIlY,EAAK,CACL,GAAIkY,EAAG,EAAI,KAAK,KAAO,KAAK,EAAIe,IAChC,EAAG,KAAK,IAAIf,EAAG,EAAI,KAAK,EAAE,GAAK,KAAK,EAAIgB,GAChD,EAEI,GAAIlZ,EAAG,GAAK,EACRA,EAAG,GAAK+Y,GAAQK,EAAK,EAAE,CAAC,EACxBpZ,EAAG,EAAIkY,EAAG,EAAI,EAAI,CAAC1uB,EAAUA,MAC1B,CAEH,IAAI,EAAI,KAAK,MAAMwW,EAAG,EAAIoZ,EAAK,EAM/B,IALI,EAAI,EACJ,EAAI,EACG,GAAKA,KACZ,EAAIA,GAAQ,KAGZ,GAAIJ,GAAQ,CAAC,EAAE,CAAC,EAAIhZ,EAAG,EACnB,EAAE,UACKgZ,GAAQ,EAAE,CAAC,EAAE,CAAC,GAAKhZ,EAAG,EAC7B,EAAE,MAEF,OAIR,IAAIsZ,EAAQN,GAAQ,CAAC,EACjBlc,EAAI,GAAKkD,EAAG,EAAIsZ,EAAM,CAAC,IAAMN,GAAQ,EAAE,CAAC,EAAE,CAAC,EAAIM,EAAM,CAAC,GAE1Dxc,EAAI0c,GAAe,SAASr0B,EAAG,CAC3B,OAAQk0B,GAAUC,EAAOn0B,CAAC,EAAI6a,EAAG,GAAKuZ,GAAUD,EAAOn0B,CAAC,CAC5D,EAAG2X,EAAGlT,EAAO,GAAG,EAEhBoW,EAAG,GAAKqZ,GAAUN,GAAQ,CAAC,EAAGjc,CAAC,EAC/BkD,EAAG,GAAK,EAAI,EAAIlD,GAAKjT,EACjBquB,EAAG,EAAI,IACPlY,EAAG,EAAI,CAACA,EAAG,EAEnB,CAEA,OAAAA,EAAG,EAAI/M,EAAW+M,EAAG,EAAI,KAAK,KAAK,EAC5BA,CACX,CAEO,IAAInM,GAAQ,CAAC,WAAY,OAAO,EACvC,MAAAgmB,GAAe,CACb,KAAMpmB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,EC3JO,SAASJ,IAAO,CACnB,KAAK,KAAO,SAEhB,CAEO,SAASC,GAAQzI,EAAG,CACvB,IAAIlG,EAAQ8T,GAAqB5N,EAAG,KAAK,GAAI,KAAK,CAAC,EACnD,OAAOlG,CACX,CAEO,SAAS6O,GAAQ3I,EAAG,CACvB,IAAIlG,EAAQsU,GAAqBpO,EAAG,KAAK,GAAI,KAAK,EAAG,KAAK,CAAC,EAC3D,OAAOlG,CACX,CAEO,IAAI8O,GAAQ,CAAC,aAAc,aAAc,UAAW,SAAS,EACpE,MAAAimB,GAAe,CACX,KAAMrmB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACX,ECzBA,IAAIkmB,EAAO,CACT,OAAQ,EACR,OAAQ,EACR,MAAO,EACP,MAAO,CACT,EAKIl4B,GAAS,CACX,EAAO,CAAE,IAAK,IAAQ,IAAK,EAAI,EAC/B,IAAO,CAAE,IAAK,EAAG,IAAK,GAAM,QAAS,EAAI,EACzC,KAAO,CAAE,IAAK,EAAG,IAAK,GAAM,QAAS,EAAI,EACzC,MAAO,CAAE,IAAK,EAAG,IAAK,EAAI,EAC1B,KAAO,CAAE,IAAK,EAAG,IAAK,EAAI,CAC5B,EAEO,SAAS4R,IAAO,CA0BrB,GAzBA,OAAO,KAAK5R,EAAM,EAAE,SAAQ,SAAUoJ,EAAG,CACvC,GAAI,OAAO,KAAKA,CAAC,EAAM,IACrB,KAAKA,CAAC,EAAIpJ,GAAOoJ,CAAC,EAAE,QACf,IAAIpJ,GAAOoJ,CAAC,EAAE,KAAO,MAAM,KAAKA,CAAC,CAAC,EACvC,MAAM,IAAI,MAAM,4CAA8CA,EAAI,MAAQ,KAAKA,CAAC,CAAC,EACxEpJ,GAAOoJ,CAAC,EAAE,MACnB,KAAKA,CAAC,EAAI,WAAW,KAAKA,CAAC,CAAC,GAE1BpJ,GAAOoJ,CAAC,EAAE,UACZ,KAAKA,CAAC,EAAI,KAAKA,CAAC,EAAIpB,EAExB,GAAE,KAAK,IAAI,CAAC,EAER,KAAK,IAAK,KAAK,IAAI,KAAK,IAAI,EAAIL,CAAO,EAAKI,EAC9C,KAAK,KAAO,KAAK,KAAO,EAAImwB,EAAK,OAASA,EAAK,OACtC,KAAK,IAAI,KAAK,IAAI,EAAInwB,EAC/B,KAAK,KAAOmwB,EAAK,OAEjB,KAAK,KAAOA,EAAK,MACjB,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,EAChC,KAAK,OAAS,KAAK,IAAI,KAAK,IAAI,GAGlC,KAAK,IAAM,KAAK,EAAI,KAAK,EAErB,KAAK,KAAO,GAAK,KAAK,IAAM,KAC9B,MAAM,IAAI,MAAM,gBAAgB,EAGlC,KAAK,EAAI,EAAI,KAAK,IAClB,KAAK,GAAK,EAAI,KAAK,EACnB,KAAK,GAAK,EAAI,KAAK,IACnB,KAAK,OAAS,KAAK,EAAI,GAAK,KAAK,GACjC,KAAK,GAAK,EAEV,IAAIC,EAAQ,KAAK,KACb7M,EAAQ,KAAK,IACjB,KAAK,GAAK,KAAK,IAAIA,CAAK,EACxB,KAAK,GAAK,KAAK,IAAIA,CAAK,EACxB,KAAK,GAAK,KAAK,IAAI6M,CAAK,EACxB,KAAK,GAAK,KAAK,IAAIA,CAAK,CAC1B,CAEO,SAAStmB,GAAQzI,EAAG,CACzBA,EAAE,GAAK,KAAK,MACZ,IAAI4H,EAAS,KAAK,IAAI5H,EAAE,CAAC,EACrB6H,EAAS,KAAK,IAAI7H,EAAE,CAAC,EACrBsmB,EAAS,KAAK,IAAItmB,EAAE,CAAC,EACrB9F,EAAGC,EACP,OAAQ,KAAK,KAAI,CACf,KAAK20B,EAAK,MACR30B,EAAI,KAAK,OAASyN,EAAS,KAAK,OAASC,EAASye,EAClD,MACF,KAAKwI,EAAK,MACR30B,EAAI0N,EAASye,EACb,MACF,KAAKwI,EAAK,OACR30B,EAAI,CAACyN,EACL,MACF,KAAKknB,EAAK,OACR30B,EAAIyN,EACJ,KACN,CAIE,OAHAzN,EAAI,KAAK,KAAO,KAAK,EAAIA,GACzBD,EAAIC,EAAI0N,EAAS,KAAK,IAAI7H,EAAE,CAAC,EAErB,KAAK,KAAI,CACf,KAAK8uB,EAAK,MACR30B,GAAK,KAAK,OAASyN,EAAS,KAAK,OAASC,EAASye,EACnD,MACF,KAAKwI,EAAK,MACR30B,GAAKyN,EACL,MACF,KAAKknB,EAAK,OACR30B,GAAK,EAAE0N,EAASye,GAChB,MACF,KAAKwI,EAAK,OACR30B,GAAK0N,EAASye,EACd,KACN,CAGE,IAAI0I,EAAIC,EACR,OAAAD,EAAK70B,EAAI,KAAK,GAAKD,EAAI,KAAK,GAC5B+0B,EAAK,GAAKD,EAAK,KAAK,GAAK,KAAK,GAAK,KAAK,IACxC90B,GAAKA,EAAI,KAAK,GAAKC,EAAI,KAAK,IAAM,KAAK,GAAK80B,EAC5C90B,EAAI60B,EAAKC,EAETjvB,EAAE,EAAI9F,EAAI,KAAK,EACf8F,EAAE,EAAI7F,EAAI,KAAK,EACR6F,CACT,CAEO,SAAS2I,GAAQ3I,EAAG,CACzBA,EAAE,GAAK,KAAK,EACZA,EAAE,GAAK,KAAK,EACZ,IAAIqM,EAAI,CAAE,EAAGrM,EAAE,EAAG,EAAGA,EAAE,CAAC,EAGpBkvB,EAAIC,EAAIH,EACZA,EAAK,GAAK,KAAK,IAAMhvB,EAAE,EAAI,KAAK,IAChCkvB,EAAK,KAAK,IAAMlvB,EAAE,EAAIgvB,EACtBG,EAAK,KAAK,IAAMnvB,EAAE,EAAI,KAAK,GAAKgvB,EAChChvB,EAAE,EAAIkvB,EAAK,KAAK,GAAKC,EAAK,KAAK,GAC/BnvB,EAAE,EAAImvB,EAAK,KAAK,GAAKD,EAAK,KAAK,GAE/B,IAAIlP,EAAKtD,GAAM1c,EAAE,EAAGA,EAAE,CAAC,EACvB,GAAI,KAAK,IAAIggB,CAAE,EAAIrhB,EACjB0N,EAAE,EAAI,EACNA,EAAE,EAAIrM,EAAE,MACH,CACL,IAAI8mB,EAAMC,EAIV,OAHAA,EAAO,EAAI/G,EAAKA,EAAK,KAAK,MAC1B+G,GAAQ,KAAK,EAAI,KAAK,KAAKA,CAAI,IAAM,KAAK,IAAM/G,EAAKA,EAAK,KAAK,KAC/D8G,EAAO,KAAK,KAAK,EAAIC,EAAOA,CAAI,EACxB,KAAK,KAAI,CACf,KAAK+H,EAAK,MACRziB,EAAE,EAAI,KAAK,KAAKya,EAAO,KAAK,OAAS9mB,EAAE,EAAI+mB,EAAO,KAAK,OAAS/G,CAAE,EAClEhgB,EAAE,GAAK8mB,EAAO,KAAK,OAAS,KAAK,IAAIza,EAAE,CAAC,GAAK2T,EAC7ChgB,EAAE,GAAK+mB,EAAO,KAAK,OACnB,MACF,KAAK+H,EAAK,MACRziB,EAAE,EAAI,KAAK,KAAKrM,EAAE,EAAI+mB,EAAO/G,CAAE,EAC/BhgB,EAAE,EAAI8mB,EAAO9G,EACbhgB,EAAE,GAAK+mB,EACP,MACF,KAAK+H,EAAK,OACRziB,EAAE,EAAI,KAAK,KAAKya,CAAI,EACpB9mB,EAAE,EAAI,CAACA,EAAE,EACT,MACF,KAAK8uB,EAAK,OACRziB,EAAE,EAAI,CAAC,KAAK,KAAKya,CAAI,EACrB,KACR,CACIza,EAAE,EAAI,KAAK,MAAMrM,EAAE,EAAGA,EAAE,CAAC,CAC3B,CAEA,OAAAA,EAAE,EAAIqM,EAAE,EAAI,KAAK,MACjBrM,EAAE,EAAIqM,EAAE,EACDrM,CACT,CAEO,IAAI4I,GAAQ,CAAC,qBAAsB,OAAO,EACjD,MAAAwmB,GAAe,CACb,KAAM5mB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACT,ECtKO,SAASJ,IAAO,CAKnB,GAJA,KAAK,UAAa,KAAK,QAAU,IAAM,EAAI,EAC3C,KAAK,EAAI,OAAO,KAAK,CAAC,EACtB,KAAK,WAAa,KAAK,EAAI,KAAK,EAE5B,KAAK,YAAc,GAAK,KAAK,WAAa,KAC1C,MAAM,IAAI,MAMd,GAHA,KAAK,SAAW,EAAM,KAAK,WAC3B,KAAK,EAAI,KAAK,SAAW,KAAK,SAAW,EAErC,KAAK,KAAO,EAAK,CACjB,IAAIoa,EAAS,EAAM,KAAK,GACpByM,EAAU,EAAIzM,EAElB,KAAK,SAAW,KAAK,KAAKA,CAAM,EAChC,KAAK,UAAYA,EACjB,KAAK,cAAgByM,EAErB,KAAK,MAAQ,SACjB,MACI,KAAK,SAAW,EAChB,KAAK,UAAY,EACjB,KAAK,cAAgB,EAErB,KAAK,MAAQ,SAGZ,KAAK,QACN,KAAK,MAAQ,+BAErB,CAEA,SAAS5mB,GAAQzI,EAAG,CAChB,IAAI0I,EAAM1I,EAAE,EACRtD,EAAMsD,EAAE,EACR0e,EAAK4Q,EAAKC,EAAKC,EAGnB,GAFA9mB,EAAMA,EAAM,KAAK,MAEb,KAAK,QAAU,UAAW,CAC1BhM,EAAM,KAAK,KAAK,KAAK,UAAY,KAAK,IAAIA,CAAG,CAAC,EAC9C,IAAI,EAAI,KAAK,SAAWggB,GAAM,KAAK,SAAW,KAAK,IAAIhgB,CAAG,EAAG,KAAK,IAAIA,CAAG,CAAC,EAM1E,GAJA4yB,EAAM,EAAI,KAAK,IAAI5mB,CAAG,EAAI,KAAK,IAAIhM,CAAG,EACtC6yB,EAAM,EAAI,KAAK,IAAI7mB,CAAG,EAAI,KAAK,IAAIhM,CAAG,EACtC8yB,EAAM,EAAI,KAAK,IAAI9yB,CAAG,GAEhB,KAAK,SAAW4yB,GAAOA,EAAMC,EAAMA,EAAMC,EAAMA,EAAM,KAAK,cAAiB,EAC7E,OAAAxvB,EAAE,EAAI,OAAO,IACbA,EAAE,EAAI,OAAO,IACNA,EAGX0e,EAAM,KAAK,SAAW4Q,EAClB,KAAK,WACLtvB,EAAE,EAAI,KAAK,WAAa,KAAK,KAAKuvB,EAAM7S,GAAM8S,EAAK9Q,CAAG,CAAC,EACvD1e,EAAE,EAAI,KAAK,WAAa,KAAK,KAAKwvB,EAAM9Q,CAAG,IAE3C1e,EAAE,EAAI,KAAK,WAAa,KAAK,KAAKuvB,EAAM7Q,CAAG,EAC3C1e,EAAE,EAAI,KAAK,WAAa,KAAK,KAAKwvB,EAAM9S,GAAM6S,EAAK7Q,CAAG,CAAC,EAE/D,MAAW,KAAK,QAAU,WACtBA,EAAM,KAAK,IAAIhiB,CAAG,EAClB4yB,EAAM,KAAK,IAAI5mB,CAAG,EAAIgW,EACtB6Q,EAAM,KAAK,IAAI7mB,CAAG,EAAIgW,EACtB8Q,EAAM,KAAK,IAAI9yB,CAAG,EAClBgiB,EAAM,KAAK,SAAW4Q,EAElB,KAAK,WACLtvB,EAAE,EAAI,KAAK,WAAa,KAAK,KAAKuvB,EAAM7S,GAAM8S,EAAK9Q,CAAG,CAAC,EACvD1e,EAAE,EAAI,KAAK,WAAa,KAAK,KAAKwvB,EAAM9Q,CAAG,IAE3C1e,EAAE,EAAI,KAAK,WAAa,KAAK,KAAKuvB,EAAM7Q,CAAG,EAC3C1e,EAAE,EAAI,KAAK,WAAa,KAAK,KAAKwvB,EAAM9S,GAAM6S,EAAK7Q,CAAG,CAAC,IAG/D,OAAA1e,EAAE,EAAIA,EAAE,EAAI,KAAK,EACjBA,EAAE,EAAIA,EAAE,EAAI,KAAK,EACVA,CACX,CAEA,SAAS2I,GAAQ3I,EAAG,CAChB,IAAIsvB,EAAM,GACNC,EAAM,EACNC,EAAM,EACN,EAAGnyB,EAAGoyB,EAAKjU,EAKf,GAHAxb,EAAE,EAAIA,EAAE,EAAI,KAAK,EACjBA,EAAE,EAAIA,EAAE,EAAI,KAAK,EAEb,KAAK,QAAU,UAAW,CACtB,KAAK,WACLwvB,EAAM,KAAK,IAAIxvB,EAAE,EAAI,KAAK,UAAU,EACpCuvB,EAAM,KAAK,IAAIvvB,EAAE,EAAI,KAAK,UAAU,EAAI0c,GAAM,EAAK8S,CAAG,IAEtDD,EAAM,KAAK,IAAIvvB,EAAE,EAAI,KAAK,UAAU,EACpCwvB,EAAM,KAAK,IAAIxvB,EAAE,EAAI,KAAK,UAAU,EAAI0c,GAAM,EAAK6S,CAAG,GAG1D,IAAIG,EAAOF,EAAM,KAAK,SAKtB,GAJA,EAAID,EAAMA,EAAMG,EAAOA,EAAOJ,EAAMA,EACpCjyB,EAAI,EAAI,KAAK,SAAWiyB,EACxBG,EAAOpyB,EAAIA,EAAK,EAAI,EAAI,KAAK,EAEzBoyB,EAAM,EACN,OAAAzvB,EAAE,EAAI,OAAO,IACbA,EAAE,EAAI,OAAO,IACNA,EAGXwb,GAAK,CAACne,EAAI,KAAK,KAAKoyB,CAAG,IAAM,EAAM,GACnCH,EAAM,KAAK,SAAW9T,EAAI8T,EAC1BC,GAAO/T,EACPgU,GAAOhU,EAEPxb,EAAE,EAAI,KAAK,MAAMuvB,EAAKD,CAAG,EACzBtvB,EAAE,EAAI,KAAK,KAAKwvB,EAAM,KAAK,IAAIxvB,EAAE,CAAC,EAAIsvB,CAAG,EACzCtvB,EAAE,EAAI,KAAK,KAAK,KAAK,cAAgB,KAAK,IAAIA,EAAE,CAAC,CAAC,CACtD,SAAW,KAAK,QAAU,SAAU,CAYhC,GAXI,KAAK,WACLwvB,EAAM,KAAK,IAAIxvB,EAAE,EAAI,KAAK,UAAU,EACpCuvB,EAAM,KAAK,IAAIvvB,EAAE,EAAI,KAAK,UAAU,EAAI,KAAK,KAAK,EAAMwvB,EAAMA,CAAG,IAEjED,EAAM,KAAK,IAAIvvB,EAAE,EAAI,KAAK,UAAU,EACpCwvB,EAAM,KAAK,IAAIxvB,EAAE,EAAI,KAAK,UAAU,EAAI,KAAK,KAAK,EAAMuvB,EAAMA,CAAG,GAGrE,EAAIA,EAAMA,EAAMC,EAAMA,EAAMF,EAAMA,EAClCjyB,EAAI,EAAI,KAAK,SAAWiyB,EACxBG,EAAOpyB,EAAIA,EAAK,EAAI,EAAI,KAAK,EACzBoyB,EAAM,EACN,OAAAzvB,EAAE,EAAI,OAAO,IACbA,EAAE,EAAI,OAAO,IACNA,EAGXwb,GAAK,CAACne,EAAI,KAAK,KAAKoyB,CAAG,IAAM,EAAM,GACnCH,EAAM,KAAK,SAAW9T,EAAI8T,EAC1BC,GAAO/T,EACPgU,GAAOhU,EAEPxb,EAAE,EAAI,KAAK,MAAMuvB,EAAKD,CAAG,EACzBtvB,EAAE,EAAI,KAAK,KAAKwvB,EAAM,KAAK,IAAIxvB,EAAE,CAAC,EAAIsvB,CAAG,CAC7C,CACA,OAAAtvB,EAAE,EAAIA,EAAE,EAAI,KAAK,MACVA,CACX,CAEO,IAAI4I,GAAQ,CAAC,+BAAgC,0BAA2B,MAAM,EACrF,MAAA+mB,GAAe,CACX,KAAMnnB,GACN,QAASC,GACT,QAASE,GACT,MAAOC,EACX,EChIe,SAAAgnB,GAAS1b,EAAM,CAC5BA,EAAM,KAAK,YAAY,IAAIsI,EAAK,EAChCtI,EAAM,KAAK,YAAY,IAAIyK,EAAM,EACjCzK,EAAM,KAAK,YAAY,IAAIwC,EAAG,EAC9BxC,EAAM,KAAK,YAAY,IAAIsL,EAAM,EACjCtL,EAAM,KAAK,YAAY,IAAIkM,EAAK,EAChClM,EAAM,KAAK,YAAY,IAAIqN,EAAM,EACjCrN,EAAM,KAAK,YAAY,IAAImP,EAAK,EAChCnP,EAAM,KAAK,YAAY,IAAI+P,EAAG,EAC9B/P,EAAM,KAAK,YAAY,IAAIsQ,EAAM,EACjCtQ,EAAM,KAAK,YAAY,IAAI6R,EAAI,EAC/B7R,EAAM,KAAK,YAAY,IAAIuT,EAAI,EAC/BvT,EAAM,KAAK,YAAY,IAAI4T,EAAG,EAC9B5T,EAAM,KAAK,YAAY,IAAI+T,EAAI,EAC/B/T,EAAM,KAAK,YAAY,IAAIiU,EAAG,EAC9BjU,EAAM,KAAK,YAAY,IAAImU,EAAG,EAC9BnU,EAAM,KAAK,YAAY,IAAI0U,EAAI,EAC/B1U,EAAM,KAAK,YAAY,IAAIoW,EAAI,EAC/BpW,EAAM,KAAK,YAAY,IAAIqW,EAAI,EAC/BrW,EAAM,KAAK,YAAY,IAAIsW,EAAI,EAC/BtW,EAAM,KAAK,YAAY,IAAIwW,EAAI,EAC/BxW,EAAM,KAAK,YAAY,IAAIyW,EAAI,EAC/BzW,EAAM,KAAK,YAAY,IAAIwX,EAAK,EAChCxX,EAAM,KAAK,YAAY,IAAI2Y,EAAI,EAC/B3Y,EAAM,KAAK,YAAY,IAAI4Y,EAAK,EAChC5Y,EAAM,KAAK,YAAY,IAAI2Z,EAAG,EAC9B3Z,EAAM,KAAK,YAAY,IAAI0a,EAAK,EAChC1a,EAAM,KAAK,YAAY,IAAI2a,EAAO,EAClC3a,EAAM,KAAK,YAAY,IAAIkb,EAAK,EAChClb,EAAM,KAAK,YAAY,IAAIyb,EAAI,CACjC,CCjDAzb,GAAM,aAAe,QACrBA,GAAM,KAAO2b,GACb3b,GAAM,MAAQ,IAAIA,GAAM,KAAK,OAAO,EACpCA,GAAM,MAAQgG,GACdhG,GAAM,QAAUhB,GAChBgB,GAAM,KAAOrW,EACbqW,GAAM,QAAUtJ,GAChBsJ,GAAM,UAAYV,GAClBU,GAAM,KAAOY,GACbZ,GAAM,QAAU,cAChB0b,GAAoB1b,EAAK,ECVzB,eAAe4b,GAAoBC,EAAqC,CACpE,IAAIC,EAA0B,KAE9B,MAAMC,EAAU,CACZ,cACA,qDACA,qDAAA,EAEJ,UAAWC,KAASD,EAAS,CACzB,MAAME,EAASJ,EAAW,MAAMG,CAAK,EACrC,GAAIC,IAAW,KAAM,CACjBH,EAAWG,EAAO,CAAC,EACnB,KACJ,CACJ,CAEA,GAAIH,GAAY,KAAM,CAClB,MAAMI,EAAa,QAAQJ,CAAQ,GACnC,GAAI9b,GAAM,KAAKkc,CAAU,IAAM,OAAW,CACtC,MAAMtsB,EAAO,MAAMtK,UAAQ,UAAU,mBAAmBw2B,CAAQ,QAAQ,EACxEK,GAAS,YAAYD,EAAYtsB,CAAI,CACzC,CACA,OAAOssB,CACX,CACA,MAAM,IAAI,MAAM,iCAAiCL,CAAU,EAAE,CACjE,CAEA,MAAAO,GAAe,CAAE,oBAAAR,EAAA,EChBjB,eAAeS,GACXC,EACAC,EACAC,EACApkB,EACA/O,EACa,CACb,MAAMozB,EAAQ,IAAIC,QAClBD,EAAM,MAAA,EAEN,MAAME,EAAiC,CAAA,EACjCC,MAA+B,IAErC,UAAWz4B,KAAWm4B,EAAU,CAC5B,MAAMO,EAAO14B,EAAQ,YAAA,EACf24B,EAAWD,GAAA,YAAAA,EAAM,UACvB,GAAIA,GAAQ,MAAQC,GAAY,KAC5B,SAGJ,MAAMC,EAAoC,CAAA,EACpCz0B,EAAcu0B,EAAK,mBAAA,EACnBG,EAASH,EAAK,UAAA,EACpB,GAAI,EAAAG,GAAU,GAAK10B,EAAY,CAAC,GAAK,MAAQA,EAAY,CAAC,IAAMe,GAKhE,SAAStD,EAAI,EAAGA,EAAIuC,EAAY,OAAQvC,GAAKi3B,EAAQ,CACjD,MAAMv0B,EAAI,IAAIZ,GACV00B,EACAj0B,EAAYvC,EAAI,CAAC,EACjBuC,EAAYvC,EAAI,CAAC,EACjBi3B,GAAU,EAAI10B,EAAYvC,EAAI,CAAC,EAAIsD,CAAA,EAEvC0zB,EAAmB,KAAKt0B,CAAC,EACzBk0B,EAAgB,KAAKl0B,CAAC,CAC1B,CAEAm0B,EAAyB,IAAIz4B,EAAQ,OAAQ44B,CAAkB,EACnE,CAEA,QAAQ,MACJ,0BAA0BJ,EAAgB,MAAM,qBAAqBL,EAAS,MAAM,cAAA,EAGxF,MAAME,EAAUG,CAAe,EAE/B,UAAWx4B,KAAWm4B,EAAU,CAE5B,MAAMS,EAAqBH,EAAyB,IAAIz4B,EAAQ,MAAM,EAChE04B,EAAO14B,EAAQ,YAAA,EACrB,GAAI,EAAA04B,GAAQ,MAAQE,GAAsB,MAI1C,OAAQF,EAAK,UAAQ,CACjB,IAAK,aACL,IAAK,aAAc,CACf,MAAM,EAAIA,EACJp0B,EAAI,EAAE,eAAA,EACZ,QAAS1C,EAAI,EAAGA,EAAI0C,EAAE,OAAQ1C,GAAK,EAC/B0C,EAAE1C,CAAC,EAAE,CAAC,EAAIg3B,EAAmBh3B,CAAC,EAAE,OAAO,CAAC,EAAIqS,EAEhD,EAAE,eAAe3P,CAAC,EAClB,KACJ,CACA,IAAK,kBACL,IAAK,UAAW,CACZ,MAAM,EAAIo0B,EACJp0B,EAAI,EAAE,eAAA,EACZ,IAAI6e,EAAI,EACR,QAASvhB,EAAI,EAAGA,EAAI0C,EAAE,OAAQ1C,GAAK,EAC/B,QAAS8jB,EAAI,EAAGA,EAAIphB,EAAE1C,CAAC,EAAE,OAAQ8jB,GAAK,EAClCphB,EAAE1C,CAAC,EAAE8jB,CAAC,EAAE,CAAC,EAAIkT,EAAmBzV,CAAC,EAAE,OAAO,CAAC,EAAIlP,EAC/CkP,GAAK,EAGb,EAAE,eAAe7e,CAAC,EAClB,KACJ,CACA,IAAK,eAAgB,CACjB,MAAM,EAAIo0B,EACJp0B,EAAI,EAAE,eAAA,EACZ,IAAI6e,EAAI,EACR,QAASvhB,EAAI,EAAGA,EAAI0C,EAAE,OAAQ1C,GAAK,EAC/B,QAAS8jB,EAAI,EAAGA,EAAIphB,EAAE1C,CAAC,EAAE,OAAQ8jB,GAAK,EAClC,QAASgN,EAAI,EAAGA,EAAIpuB,EAAE1C,CAAC,EAAE8jB,CAAC,EAAE,OAAQgN,GAAK,EACrCpuB,EAAE1C,CAAC,EAAE8jB,CAAC,EAAEgN,CAAC,EAAE,CAAC,EAAIkG,EAAmBzV,CAAC,EAAE,OAAO,CAAC,EAAIlP,EAClDkP,GAAK,EAIjB,EAAE,eAAe7e,CAAC,EAClB,KACJ,CACA,IAAK,QAAS,CACV,MAAM,EAAIo0B,EACJp0B,EAAI,EAAE,eAAA,EACZA,EAAE,CAAC,EAAIs0B,EAAmB,CAAC,EAAE,OAAO,CAAC,EAAI3kB,EACzC,EAAE,eAAe3P,CAAC,EAClB,KACJ,CACA,CAGR,CAEA,QAAQ,MAAM,oCAAoCg0B,EAAM,eAAA,CAAgB,GAAG,EAC3EA,EAAM,KAAA,CACV,CAEA,SAASQ,GAAiBX,EAA2BY,EAAkB7zB,EAA2B,CAC9F,UAAWlF,KAAWm4B,EAAU,CAC5B,MAAMO,EAAO14B,EAAQ,YAAA,EACrB,GAAI04B,GAAQ,KACR,SAGJ,MAAMG,EAASH,EAAK,UAAA,EACdv0B,EAAcu0B,EAAK,mBAAA,EACzB,GAAI,EAAAG,GAAU,GAAK10B,EAAY,CAAC,GAAK,MAAQA,EAAY,CAAC,IAAMe,GAKhE,OAAQwzB,EAAK,UAAQ,CACjB,IAAK,aACL,IAAK,aAAc,CACf,MAAM1U,EAAI0U,EACJp0B,EAAI0f,EAAE,eAAA,EACZ,QAASpiB,EAAI,EAAGA,EAAI0C,EAAE,OAAQ1C,GAAK,EAC/B0C,EAAE1C,CAAC,EAAE,CAAC,EAAIm3B,EAEd/U,EAAE,eAAe1f,CAAC,EAClB,KACJ,CACA,IAAK,kBACL,IAAK,UAAW,CACZ,MAAM0f,EAAI0U,EACJp0B,EAAI0f,EAAE,eAAA,EACZ,QAASpiB,EAAI,EAAGA,EAAI0C,EAAE,OAAQ1C,GAAK,EAC/B,QAAS8jB,EAAI,EAAGA,EAAIphB,EAAE1C,CAAC,EAAE,OAAQ8jB,GAAK,EAClCphB,EAAE1C,CAAC,EAAE8jB,CAAC,EAAE,CAAC,EAAIqT,EAGrB/U,EAAE,eAAe1f,CAAC,EAClB,KACJ,CACA,IAAK,eAAgB,CACjB,MAAM0f,EAAI0U,EACJp0B,EAAI0f,EAAE,eAAA,EACZ,QAASpiB,EAAI,EAAGA,EAAI0C,EAAE,OAAQ1C,GAAK,EAC/B,QAAS8jB,EAAI,EAAGA,EAAIphB,EAAE1C,CAAC,EAAE,OAAQ8jB,GAAK,EAClC,QAASgN,EAAI,EAAGA,EAAIpuB,EAAE1C,CAAC,EAAE8jB,CAAC,EAAE,OAAQgN,GAAK,EACrCpuB,EAAE1C,CAAC,EAAE8jB,CAAC,EAAEgN,CAAC,EAAE,CAAC,EAAIqG,EAI5B/U,EAAE,eAAe1f,CAAC,EAClB,KACJ,CACA,IAAK,QAAS,CACV,MAAM0f,EAAI0U,EACJp0B,EAAI0f,EAAE,eAAA,EACZ1f,EAAE,CAAC,EAAIy0B,EACP/U,EAAE,eAAe1f,CAAC,EAClB,KACJ,CACA,CAGR,CACJ,CAWA,eAAe00B,GACXxmB,EACAymB,EACAC,EACAd,EACsB,CACtB,MAAMe,EAAS,MAAMlB,GAAY,oBAAoBiB,GAAkB,WAAW,EAElF,OAAOD,EAAO,aAAazmB,EAAM,CAC7B,eAAgB2mB,EAChB,kBAAAf,CAAA,CACH,CACL,CAWA,SAASgB,GACL5mB,EACAymB,EACAC,EACAd,EACe,CACf,OAAOiB,GACHJ,EAAO,aAAazmB,EAAM,CACtB,eAAA0mB,EACA,kBAAAd,CAAA,CACH,CAAA,CAET,CAUA,SAASkB,GAASC,EAA6BC,EAAwC,CACnF,MAAMhvB,EAAO,IAAIivB,QAEXC,EAAY,IAAIC,GAEhBC,EAASL,EAAW,IAAIxV,GAAK,CAC/B,MAAM8V,EAAW9V,EAAE,YAAA,EAEnB,GAAI8V,GAAY,KAAM,CAClB,MAAMtxB,EAAOsxB,EAAS,QAAA,EACtB,IAAIC,EAEJ,OAAQvxB,EAAA,CACJ,IAAK,aACDuxB,EAAOJ,EAAU,MAAMG,CAAsB,EAC7C,MACJ,IAAK,kBACDC,EAAOJ,EAAU,MAAMG,CAA2B,EAClD,MACJ,IAAK,aACDC,EAAOJ,EAAU,MAAMG,CAAsB,EAC7C,MACJ,IAAK,eACDC,EAAOJ,EAAU,MAAMG,EAA0BL,CAAc,EAC/D,MACJ,IAAK,QACDM,EAAOJ,EAAU,MAAMG,CAAiB,EACxC,MACJ,IAAK,UACDC,EAAOJ,EAAU,MAAMG,EAAqBL,CAAc,EAC1D,MACJ,QACI,QAAQ,KAAK,oBAAoBjxB,CAAI,EAAE,EACvCuxB,EAAO,IAAA,CAGf,GAAIA,EACA,SAAW,CAACtxB,EAAMjE,CAAK,IAAK,OAAO,QAAQwf,EAAE,cAAA,CAAe,EACpDvb,IAAS,aACTsxB,EAAK,SAAStxB,CAAI,EAAIjE,GAIlC,OAAOu1B,CACX,CACJ,CAAC,EAED,UAAWA,KAAQF,EACXE,GAAQ,MACRtvB,EAAK,IAAIsvB,CAAI,EAIrB,OAAOtvB,CACX,CASA,SAAS6uB,GAAiBlB,EAA0C,CAChE,OAAOA,EAAS,OAAOn4B,GAAW,OAC9B,GAAI,YAAaA,EAEb,MAAO,GAEX,MAAM24B,GAAWoB,EAAA/5B,EAAQ,YAAA,IAAR,YAAA+5B,EAAuB,UACxC,MACI,EAAApB,GAAY,MACZ,CAAC,CACG,aACA,kBACA,aACA,eACA,QACA,SAAA,EACF,SAASA,CAAQ,EAM3B,CAAC,CACL,CAoBA,MAAAqB,GAAe,CACX,kBAAA9B,GACA,iBAAAY,GACA,aAAAE,GACA,mBAAAI,GACA,SAAAE,GACA,iBAAAD,EACJ,EC1UMY,GAAgB,IAAIC,GACpBC,GAAY,IAAIC,GAChBC,GAAY,IAAIC,GAETC,GAAwE,CACjF,eAAgB,YAChB,UAAW,EACX,eAAgB,GAChB,mBAAoB,GACpB,qBAAsB,GACtB,YAAa,CACjB,EAeO,MAAMC,EAA8C,CAIhD,YAAYp7B,EAAkC,CAH9CX,EAAA,kBACSA,EAAA,gBAGZ,KAAK,QAAUW,EACf,KAAK,UAAYA,EAAQ,SAC7B,CAEO,SAAwB,CAC3B,OAAO+B,EAAAA,QAAQ,WAAW,KAAK,QAAQ,GAAG,CAC9C,CAEA,MAAa,KAAKuD,EAA8C,CAO5D,MAAMiQ,EAAO,MAAMxT,EAAAA,QAAQ,UAA2B,KAAK,QAAQ,GAAG,EAGhEg3B,EAAWsC,GAAkB9lB,CAAI,EAIvC,OADmB,MAAM+lB,GAAoBh2B,EAAUyzB,EAAU,KAAK,OAAO,CAEjF,CACJ,CAGO,MAAMwC,EAAyC,CAO3C,YAAY1B,EAAuB75B,EAAkC,CANrEX,EAAA,kBAESA,EAAA,eACTA,EAAA,oBACSA,EAAA,gBAGZ,KAAK,OAASw6B,EACd,KAAK,QAAU75B,EACf,KAAK,UAAYA,EAAQ,UACzB,KAAK,YAAcA,EAAQ,WAC/B,CAEO,SAAwB,CAC3B,OAAO+B,EAAAA,QAAQ,WAAW,KAAK,QAAQ,GAAG,CAC9C,CAEA,MAAa,KAAKuD,EAA8C,CAC5D,MAAM+G,EAAO,MAAMtK,EAAAA,QAAQ,UAAU,KAAK,QAAQ,GAAG,EAErD,OADiB,MAAMy5B,GAAal2B,EAAU+G,EAAM,KAAK,OAAQ,KAAK,OAAO,CAEjF,CACJ,CAGO,MAAMovB,WAAsBF,EAAa,CACrC,YAAYv7B,EAAkC,CACjD,MAAM+6B,GAAW/6B,CAAO,CAC5B,CACJ,CAGO,MAAM07B,WAAsBH,EAAa,CACrC,YAAYv7B,EAAkC,CACjD,MAAMi7B,GAAWj7B,CAAO,CAC5B,CACJ,CAWA,eAAsBs7B,GAClBh2B,EACAyzB,EACA70B,EACwB,CACxB,MAAM41B,EAAiB,MAAMjB,GAAY,oBACrC30B,EAAW,gBAAkBi3B,GAAkB,cAAA,EAG7ChB,EAAapB,EAAS,QAAQpU,GAChCkW,GAAc,aAAalW,EAAG,CAC1B,eAAAmV,EACA,kBAAmB51B,EAAW,iBAAA,CACjC,CAAA,EAECy3B,EAAiBf,GAAW,iBAAiBT,CAAU,EAG7D,GADuBj2B,EAAW,gBAAkBi3B,GAAkB,eAClD,CAChB,MAAMS,EACF13B,EAAW,oBAAsBi3B,GAAkB,mBACjDU,EACF33B,EAAW,sBAAwBi3B,GAAkB,qBACnDr1B,EAAc5B,EAAW,aAAei3B,GAAkB,YAEhE,MAAMP,GAAW,kBACbe,EACAz3B,EAAW,kBACX+B,GAAmBX,EAAUs2B,EAAoB91B,CAAW,EAC5D+1B,EACA/1B,CAAA,CAER,CACA,OAAO61B,CACX,CAcO,SAASG,GACZ/C,EACA/4B,EACA+7B,EAAmBZ,GAAkB,UACrCr1B,EAAcq1B,GAAkB,YAC3B,CACL,MAAMa,GACD,MAAM,QAAQh8B,GAAA,YAAAA,EAAS,SAAS,EAAIA,EAAQ,UAAU,CAAC,EAAIA,GAAA,YAAAA,EAAS,YACrE+7B,EACJ,OAAAnB,GAAW,iBAAiB7B,EAAUiD,EAAWl2B,CAAW,EACrD80B,GAAW,SAAS7B,EAAU/4B,CAAO,CAChD,CAOO,SAASq7B,GAAkB9lB,EAA0C,CACxE,OAAQA,EAAK,KAAA,CACT,IAAK,UACD,MAAO,CAACA,CAAI,EAChB,IAAK,oBACD,OAAOA,EAAK,SAChB,IAAK,qBAMD,OALoCA,EAAK,WAAW,IAAIklB,IAAa,CACjE,SAAAA,EACA,WAAY,CAAA,EACZ,KAAM,SAAA,EACR,EAGN,QAMI,MAAO,CAL0B,CAC7B,SAAUllB,EACV,WAAY,CAAA,EACZ,KAAM,SAAA,CAEK,CACnB,CAER,CAYA,eAAsBimB,GAClBl2B,EACA8N,EACAymB,EACA31B,EACwB,CACxB,MAAMi2B,EAAaS,GAAW,mBAC1BxnB,EACAymB,EACA31B,EAAW,gBAAkBi3B,GAAkB,eAC/Cj3B,EAAW,iBAAA,EAIf,GADuBA,EAAW,gBAAkBi3B,GAAkB,eAClD,CAChB,MAAMS,EACF13B,EAAW,oBAAsBi3B,GAAkB,mBACjDU,EACF33B,EAAW,sBAAwBi3B,GAAkB,qBACnDr1B,EAAc5B,EAAW,aAAei3B,GAAkB,YAEhE,MAAMP,GAAW,kBACbT,EACAj2B,EAAW,kBACX+B,GAAmBX,EAAUs2B,EAAoB91B,CAAW,EAC5D+1B,EACA/1B,CAAA,CAER,CACA,OAAOq0B,CACX,CAGA,MAAqB8B,WAAyBC,EAAS,CAG5C,YAAYC,EAAgD,CAC/D,MAAM,IAAI9B,EAAAA,KAAO,EAHLh7B,EAAA,gBAIZ,KAAK,QAAU,MAAM,QAAQ88B,CAAO,EAAIA,EAAU,CAACA,CAAO,CAC9D,CAEA,MAAyB,YAA4B,CACjD,UAAW34B,KAAU,KAAK,QAAS,CAE/B,MAAM22B,EAAa,MAAM32B,EAAO,KAAK,KAAK,QAAQ,EAC5C44B,EAAQN,GACV3B,EACA,CACI,UAAW32B,EAAO,UAClB,KAAM,CAAE,MAAO64B,wBAAA,EACf,OAAQ,CAAE,MAAOC,GAAAA,kBAAA,CAAmB,EAExC94B,EAAO,UACPA,EAAO,WAAA,EAGX,KAAK,SAAS,IAAI44B,CAAK,EACvB,KAAK,gBAAgBA,CAAK,EAE1B,MAAMh7B,EAAUoC,EAAO,QAAA,EACvBtC,EAAAA,qBAAqBk7B,EAAO,CAAE,SAAUh7B,EAAQ,SAAU,CAC9D,CACA,KAAK,aAAa,KAAK,QAAQ,CACnC,CACJ,CCvRA,eAAem7B,GACXC,EACAxD,EAC0B,CAC1B,MAAMp3B,EAAO,MAAMC,QAAK26B,EAAKC,GAAAA,iBAAoB,CAC7C,MAAO16B,EAAAA,QAAQ,MACf,IAAK,CACD,WAAYi3B,EACZ,OAAQ,UACR,UAAW,EAAA,CACf,CACH,EAEKD,EAA8B,CAAA,EACpC,SAAW,CAAC2D,EAAOhhB,CAAK,IAAK,OAAO,QAAQ9Z,EAAI,MAAM,EAClD,UAAWhB,KAAW8a,EAAM,MAAM,SACzB9a,EAAQ,aACTA,EAAQ,WAAa,CAAA,GAEzBA,EAAQ,WAAW,MAAW87B,EAC9B3D,EAAS,KAAKn4B,CAAO,EAG7B,OAAOm4B,CACX,CAcA,MAAqB4D,EAA6C,CAIvD,YAAY38B,EAAqC,CAHjDX,EAAA,kBACSA,EAAA,gBAGZ,KAAK,QAAUW,EACf,KAAK,UAAYA,EAAQ,SAC7B,CAEO,SAAwB,CAC3B,OAAO+B,EAAAA,QAAQ,WAAW,KAAK,QAAQ,GAAG,CAC9C,CAEA,MAAa,KAAKuD,EAA8C,CAE5D,MAAMyzB,EAAW,MAAMwD,GAAgB,KAAK,QAAQ,IAAK,KAAK,QAAQ,iBAAiB,EAMvF,OAJmB,MAAMjB,GAAoBh2B,EAAUyzB,EAAU,CAC7D,GAAG,KAAK,QACR,eAAgB,KAAK,QAAQ,iBAAA,CAChC,CAEL,CACJ,CC5DA,eAAe6D,GACXJ,EACAxD,EAC0B,CAc1B,OAbY,MAAMn3B,QAAK26B,EAAKK,GAAAA,gBAAmB,CAC3C,MAAO96B,EAAAA,QAAQ,MACf,IAAK,CACD,WAAYi3B,EACZ,OAAQ,UACR,UAAW,EAAA,EAEf,UAAW,CACP,MAAO,eAAA,CACX,CACH,GAGU,QACf,CAcA,MAAqB8D,EAA4C,CAItD,YAAY98B,EAAoC,CAHhDX,EAAA,kBACSA,EAAA,gBAGZ,KAAK,QAAUW,EACf,KAAK,UAAYA,EAAQ,SAC7B,CAEO,SAAwB,CAC3B,OAAO+B,EAAAA,QAAQ,WAAW,KAAK,QAAQ,GAAG,CAC9C,CAEA,MAAa,KAAKuD,EAA8C,CAE5D,MAAMyzB,EAAW,MAAM6D,GAAe,KAAK,QAAQ,IAAK,KAAK,QAAQ,iBAAiB,EAMtF,OAJmB,MAAMtB,GAAoBh2B,EAAUyzB,EAAU,CAC7D,GAAG,KAAK,QACR,eAAgB,KAAK,QAAQ,iBAAA,CAChC,CAEL,CACJ,CC1EA,MAAMgE,WAAoBC,EAAAA,QAAS,CAElC,YAAaC,EAAU,SAAS,cAAe,KAAK,EAAK,CAExD,MAAK,EAEL,KAAK,cAAgB,GAErB,KAAK,QAAUA,EAEf,KAAK,QAAQ,MAAM,SAAW,WAC9B,KAAK,QAAQ,MAAM,WAAa,OAEhC,KAAK,QAAQ,aAAc,YAAa,EAAK,EAE7C,KAAK,OAAS,IAAIC,EAAAA,QAAS,GAAK,EAAG,EAEnC,KAAK,iBAAkB,UAAW,UAAY,CAE7C,KAAK,SAAU,SAAWC,EAAS,CAGjCA,EAAO,mBAAmBA,EAAO,QAAQ,cAAc,YAAY,SACnEA,EAAO,QAAQ,aAAe,MAG9BA,EAAO,QAAQ,OAAM,CAIvB,CAAC,CAEF,CAAC,CAEF,CAEA,KAAM35B,EAAQ45B,EAAY,CAEzB,aAAM,KAAM55B,EAAQ45B,CAAS,EAE7B,KAAK,QAAU55B,EAAO,QAAQ,UAAW,EAAI,EAE7C,KAAK,OAASA,EAAO,OAEd,IAER,CAED,CAIgB,IAAIlB,EAAAA,QACA,IAAI+6B,EAAAA,QACM,IAAIA,EAAAA,QACvB,IAAI/6B,EAAAA,QACJ,IAAIA,EAAAA,QC9Cf,MAAMg7B,GAAS,IAAIJ,EAAAA,QACbK,GAAY,IAAIv8B,EAAAA,MAAMw8B,qBAAmB,EACzCC,GAAO,IAAIz8B,EAAAA,MACX08B,GAAOD,GAAK,iBAAiBF,EAAS,EACtCI,GAAgB,IAAI,IAAI38B,EAAAA,MAAM48B,GAAAA,iBAAiBL,EAAS,CAAC,EAAE,aAAA,CAAc,GACzEM,GAAoB,GACpBC,GAAsB,OACtBC,GAAmC,CAAA,EA8BzC,MAAqBC,WAA2B9B,EAAS,CAM9C,YACHC,EACAn8B,EACF,CACE,MAAM,IAAIq6B,EAAAA,KAAO,EATLh7B,EAAA,gBACRA,EAAA,gBACAA,EAAA,uBACAA,EAAA,sBAOJ,KAAK,QAAU,MAAM,QAAQ88B,CAAO,EAAIA,EAAU,CAACA,CAAO,EAC1D,KAAK,QAAU,CAAA,EACf,KAAK,eAAgBn8B,GAAA,YAAAA,EAAS,QAAS,IAAc,KACrD,KAAK,eAAiBA,GAAA,YAAAA,EAAS,KACnC,CAEgB,gBAA8B,CAG1C,MAAMi+B,EAAM,KAAK,QAAQ,IAAIC,GAAKA,EAAE,QAAQ,EAE5C,OADY,IAAI/7B,EAAAA,OAAO,cAAc87B,CAAG,CAE5C,CAEgB,KAAKl5B,EAAsBo5B,EAA2C,CAClF,MAAMC,EAAa,KAAK,SAAS,yBAAyBr5B,EAAau4B,EAAM,EACvEe,EAAY,IAAIC,YACtBD,EAAU,cAAcD,EAAY,KAAK,SAAS,KAAK,MAAM,EAG7D,MAAMG,EAAc,KAAK,WAAWF,CAAS,EAC7C,OAAIE,EASO,CAR6B,CAChC,SAAUA,EAAY,SAAS,WAAWF,EAAU,IAAI,MAAM,EAC9D,OAAQ,KACR,kBAAmB,GACnB,OAAQE,EACR,MAAOA,EAAY,QAAA,CAGL,EAGf,CAAA,CACX,CAEgB,eAAsB,CAElC,MAAMC,EAAa,GAAG,KAAK,QAAU,GAAG,IACxC,KAAK,QAAQ,QAAQC,GAAUA,EAAM,QAAQ,MAAM,QAAUD,CAAW,CAC5E,CAEgB,kBAAyB,CAGrC,KAAK,SAAS,SAASh5B,GAAK,CACxBA,EAAE,QAAU,KAAK,OACrB,CAAC,CACL,CAEA,MAAyB,YAA4B,CACjD,UAAWhC,KAAU,KAAK,QAAS,CAE/B,MAAM22B,EAAa,MAAM32B,EAAO,KAAK,KAAK,QAAQ,EAC5C4H,EAAO,IAAIivB,QAEX0B,EAAmBv4B,EAAO,WAAa,EACvCk7B,EAAYx5B,GACP,IAAI5C,EAAAA,QAAQ4C,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,GAAK62B,CAAgB,EAG3D,UAAW4C,KAAaxE,EAAY,CAChC,MAAMM,EAAWkE,EAAU,YAAA,EAE3B,GAAIlE,GAAY,KAAM,CAClB,MAAMtxB,EAAOsxB,EAAS,QAAA,EAChB11B,EAA4B,CAAA,EAElC,OAAQoE,EAAA,CACJ,IAAK,aACL,IAAK,aACDpE,EAAY,KAAK,GAAI01B,EAAS,eAAA,CAAiC,EAC/D,MACJ,IAAK,kBACL,IAAK,UACD11B,EAAY,KAAK,GAAI01B,EAAS,eAAA,EAAoC,CAAC,CAAC,EACpE,MACJ,IAAK,eACD11B,EAAY,KACR,GAAI01B,EAAS,iBAAsC,CAAC,EAAE,CAAC,CAAA,EAE3D,MACJ,IAAK,QACD11B,EAAY,KAAK01B,EAAS,gBAA8B,EACxD,KACJ,CAIJ,GAAI11B,EAAY,OAAS,EAAG,CACxB,MAAM65B,EAAS75B,EAAY,OACvB,KAAK,YAAY25B,EAASx5B,CAAC,EAAGy5B,CAAS,CAAA,EAErCvC,EAAQ,IAAI/B,QAClBuE,EAAO,QAAQV,GAAK,CAChB9B,EAAM,IAAI8B,CAAC,EACX,KAAK,QAAQ,KAAKA,CAAC,CACvB,CAAC,EAED,SAAW,CAAC90B,EAAMjE,CAAK,IAAK,OAAO,QAAQw5B,EAAU,cAAA,CAAe,EAC5Dv1B,IAAS,aACTgzB,EAAM,SAAShzB,CAAI,EAAIjE,GAG/BiG,EAAK,IAAIgxB,CAAK,CAClB,CACJ,CACJ,CAEA,KAAK,SAAS,IAAIhxB,CAAI,EACtB,KAAK,gBAAgBA,CAAI,EAEzB,MAAMhK,EAAUoC,EAAO,QAAA,EACvBtC,EAAAA,qBAAqBkK,EAAM,CAAE,SAAUhK,EAAQ,SAAU,CAC7D,CACA,KAAK,aAAa,KAAK,QAAQ,CACnC,CAEQ,YAAYy9B,EAAaj+B,EAAqC,CAElE,MAAMk+B,EAAY,SAAS,cAAc,KAAK,EACxCC,EAAO,SAAS,cAAc,MAAM,EAE1C,KAAK,YAAYA,EAAMn+B,CAAO,EAE9Bm+B,EAAK,UAAY,KAAK,cAAcn+B,EAASi+B,CAAE,EAE/C,MAAMG,EAAiB,SAAS,cAAc,KAAK,EAEnDF,EAAU,YAAYE,CAAc,EACpCA,EAAe,YAAYD,CAAI,EAE/B,MAAM5B,EAAS,IAAIJ,GAAY+B,CAAS,EACxC,OAAA3B,EAAO,SAAS,KAAK0B,CAAE,EACvB1B,EAAO,aAAA,EACPA,EAAO,kBAAkB,EAAI,EAE7B2B,EAAU,iBAAiB,YAAa,IAAO3B,EAAO,SAAS,MAAQ,EAAK,EAC5E2B,EAAU,iBAAiB,aAAc,IAAO3B,EAAO,SAAS,MAAQ,EAAM,EAEvEA,CACX,CAEQ,WAAWkB,EAA0C,CACzD,IAAIE,EAAkC,KAEtC,YAAK,QAAQ,QAAQE,GAAS,CACtBF,GAAe,OACfR,GAAiB,OAAS,EAC1B,KAAK,aAAaU,EAAOJ,EAAWN,EAAgB,EAChDA,GAAiB,OAAS,IAC1BQ,EAAcE,GAG1B,CAAC,EAEMF,CACX,CAEQ,aACJE,EACAJ,EACAY,EACI,CACAR,EAAM,SAAS,QAAU,IACzBQ,EAAW,KAAK,CACZ,SAAUR,EAAM,SAAS,WAAWJ,EAAU,IAAI,MAAM,EACxD,OAAQI,EACR,MAAOA,EAAM,QAAA,CAChB,CAET,CAEQ,YAAYM,EAAuBn+B,EAA8B,CAErEm+B,EAAK,MAAM,gBAAkB,OAAOrB,GAAK,EAAI,GAAG,IAAIA,GAAK,EAAI,GAAG,IAAIA,GAAK,EAAI,GAAG,IAChFqB,EAAK,MAAM,YAAc,MACzBA,EAAK,MAAM,YAAc,QACzBA,EAAK,MAAM,YAAcpB,GACzBoB,EAAK,MAAM,aAAe,GAAGG,EAAAA,UAAU,MAAMrB,GAAoB,EAAG,EAAG,EAAE,CAAC,KAC1EkB,EAAK,MAAM,MAAQpB,GACnB,MAAMwB,EAAUD,YAAU,MAAM,KAAK,MAAMrB,GAAoB,CAAC,EAAG,EAAG,EAAE,EACxEkB,EAAK,MAAM,QAAU,GAAGI,CAAO,MAAMA,CAAO,MAAMA,CAAO,MAAMA,CAAO,KACtEJ,EAAK,MAAM,SAAW,GAAGlB,EAAiB,KAC1CkB,EAAK,MAAM,WAAajB,GACxBiB,EAAK,MAAM,cAAgB,OAEvB,KAAK,gBACL,KAAK,eAAeA,EAAMn+B,CAAO,CAEzC,CACJ,CCnPA,MAAqBw+B,WAA0BC,EAAM,CAG1C,YAAY77B,EAA0B,CACzC,MAAM,CACF,MAAOg6B,EAAAA,oBACP,SAAU,GACV,iBAAkB,GAClB,aAAc,GACd,aAAc8B,EAAAA,kBAAA,CACjB,EATWjgC,EAAA,eAUZ,KAAK,OAASmE,CAClB,CAEA,MAAyB,YAA4B,CAEjD,MAAM5C,GADa,MAAM,KAAK,OAAO,KAAK,KAAK,QAAQ,GAC5B,GAAG,CAAC,EACzB65B,EAAW75B,GAAA,YAAAA,EAAS,cAE1B,GAAIA,GAAW,MAAQ65B,GAAY,KAAM,CACrC,MAAMsB,EAAmB,KAAK,OAAO,WAAa,EAC5C2C,EAAY,GACP,IAAIp8B,EAAAA,QAAQ,EAAE,CAAC,EAAG,EAAE,CAAC,EAAG,EAAE,CAAC,GAAKy5B,CAAgB,EAI3D,OAFatB,EAAS,QAAA,EAEd,CACJ,IAAK,aACD,KAAK,iBAAmB,GACxB,KAAK,SAAW,GAChB,KAAK,aAAe,GACpB,KAAK,kBAAoB,GACzB,KAAK,YAAc,GACnB,KAAK,iBAAmB,GACxB,KAAK,UAAWA,EAAS,eAAA,EAAkC,IAAIiE,CAAQ,CAAC,EACxE,MACJ,IAAK,kBACD,KAAK,iBAAmB,GACxB,KAAK,SAAW,GAChB,KAAK,aAAe,GACpB,KAAK,kBAAoB,GACzB,KAAK,YAAc,GACnB,KAAK,iBAAmB,GACxB,KAAK,UAAWjE,EAAS,eAAA,EAAoC,CAAC,EAAE,IAAIiE,CAAQ,CAAC,EAC7E,MACJ,IAAK,aACD,KAAK,iBAAmB,GACxB,KAAK,SAAW,GAChB,KAAK,aAAe,GACpB,KAAK,kBAAoB,GACzB,KAAK,YAAc,GACnB,KAAK,iBAAmB,GACxB,KAAK,UAAWjE,EAAS,eAAA,EAAkC,IAAIiE,CAAQ,CAAC,EACxE,MACJ,IAAK,eACD,KAAK,iBAAmB,GACxB,KAAK,SAAW,GAChB,KAAK,aAAe,GACpB,KAAK,kBAAoB,GACzB,KAAK,YAAc,GACnB,KAAK,iBAAmB,GACxB,KAAK,UACAjE,EAAS,iBAAsC,CAAC,EAAE,CAAC,EAAE,IAAIiE,CAAQ,CAAA,EAEtE,MACJ,IAAK,QACD,KAAK,iBAAmB,GACxB,KAAK,SAAW,GAChB,KAAK,aAAe,GACpB,KAAK,kBAAoB,GACzB,KAAK,YAAc,GACnB,KAAK,iBAAmB,GACxB,KAAK,UAAU,CAACA,EAASjE,EAAS,eAAA,CAA8B,CAAC,CAAC,EAClE,MACJ,IAAK,UACD,KAAK,iBAAmB,GACxB,KAAK,SAAW,GAChB,KAAK,aAAe,GACpB,KAAK,kBAAoB,GACzB,KAAK,YAAc,GACnB,KAAK,iBAAmB,GACxB,KAAK,UAAWA,EAAS,eAAA,EAAoC,CAAC,EAAE,IAAIiE,CAAQ,CAAC,EAC7E,MACJ,QACI,MAAM,IAAI,MACN,+CAAiDjE,EAAS,QAAA,CAAQ,CACtE,CAGR,MAAMr5B,EAAU,KAAK,OAAO,QAAA,EAC5BF,EAAAA,qBAAqB,KAAM,CAAE,SAAUE,EAAQ,SAAU,EAEzD,SAAW,CAACgI,EAAMjE,CAAK,IAAK,OAAO,QAAQvE,EAAQ,cAAA,CAAe,EAC1DwI,IAAS,aACT,KAAK,SAASA,CAAI,EAAIjE,EAGlC,CACA,KAAK,aAAa,KAAK,QAAQ,CACnC,CACJ,CC5FO,MAAMhE,GAAuBC,GAAW,CAC3C,KAAM,CAAE,QAAAmC,EAAS,SAAA+B,CAAA,EAAalE,EAExBC,EAAMkC,EAAQ,OACdg8B,EAAgB,MAAM,QAAQl+B,EAAI,MAAM,EAAIA,EAAI,OAAS,CAACA,EAAI,MAAM,EACpE86B,EAA8B,CAAA,EAC9BqD,EAAYn+B,EAAI,WAAa,OAEnC,IAAIC,EAEJ,UAAWm+B,KAAgBF,EAAe,CACtC,MAAMG,EAAyC,CAC3C,eAAgBD,EAAa,gBAAkBl8B,EAAQ,IAAI,gBAAgB,EAC3E,UAAWk8B,EAAa,WAAal8B,EAAQ,IAAI,WAAW,EAC5D,kBAAmB+B,EAAS,aAC5B,eAAgBm6B,EAAa,gBAAkBl8B,EAAQ,IAAI,gBAAgB,EAC3E,mBACIk8B,EAAa,oBAAsBl8B,EAAQ,IAAI,oBAAoB,EACvE,qBACIk8B,EAAa,sBAAwBl8B,EAAQ,IAAI,sBAAsB,EAC3E,YAAak8B,EAAa,aAAel8B,EAAQ,IAAI,aAAa,EAClE,IAAKk8B,EAAa,GAAA,EAGtB,OAAQA,EAAa,KAAA,CACjB,IAAK,UACDtD,EAAQ,KACJ,IAAIf,GAAkB,CAClB,GAAGsE,CAAA,CACN,CAAA,EAEL,MACJ,IAAK,aACDvD,EAAQ,KACJ,IAAIQ,GAAiB,CACjB,GAAG+C,CAAA,CACN,CAAA,EAEL,MACJ,IAAK,MACDvD,EAAQ,KACJ,IAAIV,GAAc,CACd,GAAGiE,CAAA,CACN,CAAA,EAEL,MACJ,IAAK,MACDvD,EAAQ,KACJ,IAAIT,GAAc,CACd,GAAGgE,CAAA,CACN,CAAA,EAEL,MACJ,IAAK,KACDvD,EAAQ,KACJ,IAAIZ,GAAakE,EAAa,OAAQ,CAClC,GAAGC,CAAA,CACN,CAAA,EAEL,MACJ,IAAK,YACDvD,EAAQ,KACJ,IAAIW,GAAgB,CAChB,GAAG4C,CAAA,CACN,CAAA,EAEL,MACJ,QAGI,OADgCD,CAEpC,CAER,CAEA,OAAQD,EAAA,CACJ,IAAK,QACDl+B,EAAS,IAAI08B,GAAmB7B,EAAS96B,CAAgC,EACzE,MACJ,IAAK,OACDC,EAAS,IAAI26B,GAAiBE,CAAO,EACrC,MACJ,IAAK,QACD76B,EAAS,IAAI89B,GAAkBjD,EAAQ,CAAC,CAAC,EACzC,MACJ,QAGI,OADgCqD,CAEpC,CAGJ,OAAO,QAAQ,QAAQl+B,CAAM,CACjC,ECjGMq+B,GAA0C,CAC5C,kBAAmBC,GACnB,eAAgBC,GAChB,WAAYC,GACZ,SAAUC,GACV,OAAQC,EACZ,EAQA,eAAeC,GACX36B,EACA/B,EACiB,CACjB,MAAMnC,EAA0B,CAC5B,QAAAmC,EACA,SAAA+B,CAAA,EAGE46B,EAAUP,GAASp8B,EAAQ,IAAI,EAErC,GAAI28B,GAAW,KACX,MAAM,IAAI,MAAM,6CAA6C38B,EAAQ,IAAI,GAAG,EAGhF,MAAMjC,EAAS,MAAM4+B,EAAQ9+B,CAAO,EAEpC,MAAM,YAAaE,EAAO,SAAS,WAC/BA,EAAO,SAAS,SAAS,QAAU,CAAA,GAGvCA,EAAO,SAAS,SAAS,QAAQ,KAAOiC,EAAQ,KAEzCjC,CACX,CAEO,SAAS6+B,GAAsBC,EAAqBF,EAA8B,CACjFP,GAASS,CAAW,GAAK,MACzB,QAAQ,KAAK,8CAA8CA,CAAW,GAAG,EAG7ET,GAASS,CAAW,EAAIF,CAC5B,CAEA,MAAAG,GAAe,CACX,UAAAJ,EACJ,EC/Dap+B,GAAqDT,IACvD,CACH,KAAMA,EAAQ,SACd,OAAQ,CACJ,KAAM,MACN,IAAKA,EAAQ,IAAA,EAEjB,KAAM,iBACN,QAAS,EAAA,GCRJS,GAAqDT,IACvD,CACH,KAAMA,EAAQ,SACd,OAAQ,CAGJ,KAAMA,EAAQ,SAAS,SAAS,WAAW,EAAI,OAAS,MACxD,IAAKA,EAAQ,IAAA,EAEjB,KAAM,iBACN,QAAS,EAAA,GCFXk/B,GAA4Dl/B,GAAW,CACzE,IAAIm/B,EACJ,OAAQn/B,EAAQ,UAAA,CACZ,IAAK,UACL,IAAK,OACDm/B,EAAW,UACX,MACJ,IAAK,MACDA,EAAW,MACX,MACJ,IAAK,MACDA,EAAW,MACX,MACJ,QACI,MAAM,IAAI,MAAM,mBAAmBn/B,EAAQ,SAAS,iBAAiB,CAAA,CAG7E,MAAO,CACH,KAAMA,EAAQ,SACd,OAAQ,CACJ,MAAO,UACP,KAAMm/B,EACN,IAAKn/B,EAAQ,IAAA,EAEjB,KAAM,aACN,QAAS,EAAA,CAEjB,EAEMo/B,GAEFp/B,GAAW,CACX,IAAIm/B,EACJ,OAAQn/B,EAAQ,UAAA,CACZ,IAAK,UACL,IAAK,OACDm/B,EAAW,UACX,MACJ,IAAK,OACDA,EAAW,aACX,MACJ,IAAK,MACDA,EAAW,MACX,MACJ,IAAK,MACDA,EAAW,MACX,MACJ,QACI,MAAM,IAAI,MAAM,mBAAmBn/B,EAAQ,SAAS,iBAAiB,CAAA,CAG7E,MAAO,CACH,KAAMA,EAAQ,SACd,UAAWA,EAAQ,cAAc,+BACjC,OAAQ,CACJ,eAAgBA,EAAQ,cAAc,mCAAqC,GAC3E,mBACIA,EAAQ,cAAc,uCAAyC,GACnE,KAAMm/B,EACN,IAAKn/B,EAAQ,IAAA,EAEjB,KAAM,SACN,QAAS,EAAA,CAEjB,EAEaS,GAKTT,GACIA,EAAQ,cAAc,iCAAmC,UAClDk/B,GAAYl/B,CAAO,EAGvBo/B,GAASp/B,CAAO,ECnErBq/B,GAA+C,CACjD,IAAKC,GACL,IAAKA,GACL,WAAYC,GAEZ,QAASA,GACT,KAAMA,GACN,IAAKA,GACL,IAAKA,GACL,IAAKC,GAEL,IAAKA,GACL,IAAKF,EACT,EAQA,SAASG,GAAiBC,EAA0B39B,EAAsC,CACtF,GAAI,OAAO29B,GAAc,SAAU,CAC/B,MAAMC,EAAcr9B,EAAAA,mBAAmBo9B,CAAS,EAC1CtE,EAAM,IAAI,IAAIuE,CAAW,EAGzB7gC,EAFU,GAAGs8B,EAAI,MAAM,GAAGA,EAAI,QAAQ,GACtB,MAAM,GAAG,EACR,IAAA,EAEvB,GAAIt8B,GAAY,KACZ,MAAM,IAAI,MAAM,8BAA8B,EAGlD,MAAM8gC,EAAY9gC,EAAS,MAAM,GAAG,EAAE,GAAG,EAAE,EAE3C,GAAI8gC,GAAa,KACb,MAAM,IAAI,MAAM,0BAA0B9gC,CAAQ,EAAE,EAGxD,MAAO,CACH,cAAeiD,EACf,UAAA69B,EACA,KAAMF,EACN,SAAA5gC,CAAA,CAER,CAEA,GAAI4gC,EAAU,MAAQ,KAClB,MAAM,IAAI,MAAM,8BAA8B,EAGlD,MAAME,EAAYF,EAAU,KAAK,MAAM,GAAG,EAAE,GAAG,EAAE,EAEjD,GAAIE,GAAa,KACb,MAAM,IAAI,MAAM,0BAA0BF,EAAU,IAAI,EAAE,EAG9D,MAAO,CACH,cAAe39B,EACf,UAAA69B,EACA,KAAMF,EACN,SAAUA,EAAU,IAAA,CAE5B,CASA,eAAeG,GACXH,EACA39B,EACgB,CAChB,MAAM/B,EAAUy/B,GAAiBC,EAAW39B,CAAM,EAE5C+9B,EAASC,GAAa//B,EAAQ,QAAQ,EAE5C,GAAI8/B,GAAU,KACV,MAAM,IAAI,MAAM,eAAe9/B,EAAQ,SAAS,gBAAgB,EAGpE,MAAMggC,EAAyCF,EAAO9/B,CAAO,EAG7D,OAAO,QAAQ,QAAQ,IAAIigC,EAAAA,QAAQD,CAAa,CAAC,CACrD,CAEA,SAASD,GAAajhC,EAA8C,CAChE,MAAM4H,EAAO,OAAO,KAAK24B,EAAO,EAEhC,UAAW54B,KAAOC,EAId,GAAI5H,EAAS,SAAS2H,CAAG,EACrB,OAAO44B,GAAQ54B,CAAG,EAI1B,OAAO,IACX,CAQO,SAASy5B,GAAeC,EAAuBL,EAAmC,CACjFT,GAAQc,CAAa,GAAK,MAC1B,QAAQ,KAAK,yCAAyCA,CAAa,GAAG,EAG1Ed,GAAQc,CAAa,EAAIL,CAC7B,CAEA,MAAAA,GAAe,CACX,WAAAD,EACJ,ECjIaO,GAAoC,CAAA,EAEjD,MAAqBC,EAAY,CAAjC,cACYpiC,EAAA,uBAAuC,MAExC,OAAc,CACb,KAAK,kBACL,KAAK,gBAAA,EACL,KAAK,gBAAkB,KAE/B,CAEO,SAAgB,CACnB,KAAK,MAAA,CACT,CAEO,kBAAkBqiC,EAAwB,CAG7C,GAFA,KAAK,MAAA,EAED,EAACA,EAAK,OAIV,CAAIC,GAAAA,kBAAkBD,CAAI,GACtB,KAAK,eAAeA,CAAI,EAG5B,UAAWE,KAAeJ,GAAoB,CAC1C,MAAMK,EAAiBD,EAAYF,CAAI,EACnCG,IACA,KAAK,gBAAkBA,EAE/B,EACJ,CAEQ,eAAeH,EAA6B,CAChD,MAAMI,EAAQJ,EAAK,OAEnB,GAAII,EAAM,SAAS,cAAe,CAC9B,MAAMC,EAAgB,IAAI/gC,QAAM8gC,EAAM,KAAK,EAC3CA,EAAM,MAAQA,EAAM,SAAS,eAC7BA,EAAM,SAAS,aAAA,EAEf,KAAK,gBAAkB,IAAY,CAC/BA,EAAM,MAAQC,EACdD,EAAM,SAAS,aAAA,CACnB,CACJ,CACJ,CACJ,CCsBO,MAAME,EAAqC,CACvC,YAA6B9iC,EAAqB,CAArB,KAAA,MAAAA,CAAsB,CAEnD,sBAAsBC,EAA+C,CACxE,KAAK,MAAM,qBAAqBA,CAAM,CAC1C,CAEO,oBAAoBihC,EAAqBjhC,EAAyC,CAarF,GAZIA,EAAO,MAAQ,OACfS,GAAawgC,CAAW,EAAIjhC,EAAO,MAEnCA,EAAO,MAAQ,OACfU,GAAcugC,CAAW,EAAIjhC,EAAO,MAEpCA,EAAO,WACPqiC,GAAmB,KAAKriC,EAAO,SAAS,EAG5CghC,GAAsBC,EAAajhC,EAAO,aAAa,EAEnDA,EAAO,eACP,GAAIA,EAAO,QAAU,KACjB,QAAQ,KACJ,mDAAmDihC,CAAW,6CAAA,MAGlE,WAAWY,KAAa7hC,EAAO,eAC3BmiC,GAAeN,EAAW7hC,EAAO,MAAM,EAK/CA,EAAO,cACPQ,GAAc,IAAIygC,EAAajhC,EAAO,YAAY,EAGlDA,EAAO,oBACP8iC,4BAA0B,KAAK9iC,EAAO,kBAAkB,CAEhE,CACJ,CCzHO,MAAM+iC,EAA+C,CACjD,YAA6BhjC,EAA0B,CAA1B,KAAA,MAAAA,CAA2B,CAExD,iBAAiBijC,EAAkC,CACtD,KAAK,MAAM,KAAKA,CAAY,CAChC,CACJ,CCyBO,MAAMC,EAAmC,CACrC,YAA6BC,EAA0B,CAA1B,KAAA,YAAAA,CAA2B,CAExD,iBAAiBC,EAAgC,CACpD,KAAK,YAAY,iBAAiBA,CAAQ,CAC9C,CACJ,CAEO,SAASC,GAAuBz4B,EAAsD,CACzF,OAAQA,EAAgC,uBAAuBxF,EACnE,CClCO,MAAMk+B,EAAmC,CACrC,YAA6BtjC,EAAoB,CAApB,KAAA,MAAAA,CAAqB,CAElD,UAAUujC,EAAsB,CACnC,KAAK,MAAM,UAAUA,CAAM,CAC/B,CACJ,CC0BO,MAAMC,GAA0B,IAAIC,EAAAA,gBCpC9BC,GAAqBC,GAAAA,YAAY,cAAe,IAAM,CAC/D,MAAMC,EAAcC,EAAAA,SAAuB,EAAE,EACvCC,EAAiBC,EAAAA,IAAoB,QAAQ,EAC7CC,EAAQC,EAAAA,SAAS,IAAML,EAAY,MAAM,EACzCM,EAAiBH,EAAAA,IAAa,EAAK,EACnCI,EAAcJ,EAAAA,IAAa,EAAI,EAErC,SAASK,GAAyB,CAC9B,OAAOF,EAAe,KAC1B,CAEA,SAASG,GAAsB,CAC3B,OAAOF,EAAY,KACvB,CAEA,SAASG,EAAcl7B,EAAkB,CACrC+6B,EAAY,MAAQ/6B,CACxB,CAEA,SAASm7B,EAAiBt+B,EAAsB,CAC5Ci+B,EAAe,MAAQj+B,CAC3B,CAEA,SAASu+B,GAAoC,CACzC,OAAOV,EAAe,KAC1B,CAEA,SAASW,EAAkBtM,EAA4B,CACnD2L,EAAe,MAAQ3L,CAC3B,CAEA,SAASuM,GAA+B,CACpC,OAAOd,CACX,CAEA,SAASe,EAAOC,EAA8B,CAC1ChB,EAAY,OAAOA,EAAY,QAAQgB,CAAU,EAAG,CAAC,CACzD,CAEA,SAASC,GAAoB,CAE7B,CAEA,SAASC,GAAmB,CAE5B,CAEA,SAASC,GAAsB,CAE/B,CAEA,SAASvyB,EAAIoyB,EAA8B,CACvChB,EAAY,KAAKgB,CAAU,CAC/B,CAEA,SAASI,EAAc96B,EAAuB,CAC1C,OAAO05B,EAAY,KAAKxP,GAAKA,EAAE,QAAUlqB,CAAI,CACjD,CAGA,SAAS+6B,EAAKL,EAA8B,CAE5C,CAEA,SAASM,GAAoB,CAE7B,CAGA,SAASC,EAAqBC,EAAkB,CAEhD,CAGA,SAASC,EAAuBC,EAAqB,CAErD,CAEA,MAAO,CACH,IAAA9yB,EACA,MAAAwxB,EACA,WAAAc,EACA,YAAAD,EACA,cAAAE,EACA,KAAAE,EACA,kBAAAT,EACA,eAAAE,EACA,cAAAM,EACA,qBAAAG,EACA,uBAAAE,EACA,cAAAjB,EACA,OAAAO,EACA,kBAAAF,EACA,iBAAAF,EACA,cAAAD,EACA,WAAAD,EACA,YAAAa,CAAA,CAER,CAAC,ECpGYK,GAAuB5B,GAAAA,YAAY,gBAAiB,IAAM,CAEnE,SAAS6B,EAAKvC,EAAkC,CAGhD,CAEA,MAAO,CAAE,KAAAuC,CAAA,CACb,CAAC,ECgBD,MAAqBC,WAAmBhC,EAAAA,eAAoC,CA8BjE,YACHiC,EACAzH,EACAr8B,EAAqB,CAAA,EACvB,CACE,MAAA,EAlCGzB,EAAA,mBACSA,EAAA,cACAA,EAAA,aAqBRA,EAAA,mBAEAA,EAAA,gBAEAA,EAAA,iBASJ,KAAK,MAAQulC,EACb,KAAK,SAAW,GAChB,KAAK,WAAa,GAClB,KAAK,QAAUzH,EACf,KAAK,WAAar8B,EAClB,KAAK,KAAOo+B,EAAAA,UAAU,aAAA,CAC1B,CAvCA,IAAW,WAAqB,CAC5B,OAAO,KAAK,UAChB,CACA,IAAW,UAAU52B,EAAY,CAC7B,KAAK,WAAaA,EAClB,KAAK,cAAc,CAAE,KAAM,WAAA,CAAa,CAC5C,CACA,IAAW,QAAoC,CAC3C,OAAO,KAAK,QAAA,CAChB,CAEA,IAAW,SAAmB,CAC1B,OAAO,KAAK,QAChB,CAEA,IAAW,QAAQA,EAAY,CAC3B,KAAK,SAAWA,EAChB,KAAK,cAAc,CAAE,KAAM,SAAA,CAAW,CAC1C,CAuBA,OAAc,aAAaw6B,EAAsD,CAG7E,MAAO,CACH,SAHaA,EAAY,IAAIgB,GAAcA,EAAW,WAAW,EAIjE,KAAM,oBAGN,GAAI,GAAGe,EAAAA,SAAS,WAAA,CAAY,IAAI3F,EAAAA,UAAU,cAAc,GACxD,WAAY,CACR,QAAS,SACT,UAAW,CACP,MAAO,SACP,IAAK2F,EAAAA,SAAS,WAAA,CAAW,EAE7B,KAAM,KACN,MAAO,CACH,CACI,KAAM,oDACN,IAAK,UACL,MAAO,wDAAA,CACX,EAEJ,MAAO,qBACP,QAAS,IAAI,KAAA,EAAO,YAAA,CAAY,CACpC,CAER,CAEO,WAA6B,CAChC,MAAMC,EAAU,KAAK,OAAO,UAAU,CAClC,iBAAkB,EAAA,CACrB,EAED,OAAAA,EAAQ,GAAK,GAAGD,EAAAA,SAAS,YAAY,IAAI,KAAK,IAAI,GAClDC,EAAQ,WAAa,CACjB,GAAGA,EAAQ,WACX,MAAO,KAAK,MACZ,QAAS,IAAI,KAAA,EAAO,YAAA,CAAY,EAG7BA,CACX,CACJ,CClHA,MAAqBC,CAAa,CAKvB,YAAYH,EAAev4B,EAAc24B,EAA2B,OAAQ,CAJnE3lC,EAAA,cACAA,EAAA,aACAA,EAAA,cAGZ,KAAK,MAAQulC,EACb,KAAK,KAAOv4B,EACZ,KAAK,MAAQ24B,CACjB,CAEA,OAAc,OAAsB,CAChC,OAAO,IAAID,EAAa,GAAI,GAAI,MAAM,CAC1C,CACJ,CCbA,SAASE,GAAmBC,EAAsD,CAC9E,IAAIC,EAAM,IACNC,EAAM,KAENC,EAEA,MAAM,QAAQH,CAAe,EAC7BG,EAASH,EAETG,EAASH,EAAgB,OAG7B,QAAS1iC,EAAI,EAAGA,EAAI6iC,EAAO,OAAQ7iC,GAAK,EACpC2iC,EAAM,KAAK,IAAIA,EAAKE,EAAO7iC,CAAC,EAAE,CAAC,EAC/B4iC,EAAM,KAAK,IAAIA,EAAKC,EAAO7iC,CAAC,EAAE,CAAC,EAGnC,MAAO,CAAC2iC,EAAKC,CAAG,CACpB,CAEA,MAAAE,GAAe,CACX,mBAAAL,EACJ,ECSA,SAASM,GAAYC,EAAqC,CACtD,OAAO,OAAO,OAAO,kBAAmBA,CAAY,CACxD,CAEA,MAAMC,GAAe,IAAI,KAAK,aAAa,OAAW,CAClD,sBAAuB,CAC3B,CAAC,EAEKC,GAAuCC,GAAU,CACnD,IAAIz6B,EAAOy6B,EAAO,KAEd/8B,EAAO,KACX,OAAIsC,EAAO,MACPA,EAAOA,EAAO,IACdtC,EAAO,OAGJ,GAAG68B,GAAa,OAAOv6B,CAAI,CAAC,IAAItC,CAAI,EAC/C,EAEMg9B,GAAW,IAAItjC,EAAAA,QACfujC,GAAS,IAAIvjC,EAAAA,QAEbwjC,GAA0DzyB,GAAesyB,GAAU,CACrF,KAAM,CAAE,OAAAI,GAAW1yB,EACb,CAAE,IAAAzP,EAAK,MAAAmO,CAAA,EAAU4zB,EAEjBK,EAAWJ,GAAS,KAAK7zB,CAAK,EAAE,QAAQg0B,CAAM,EAC9CE,EAASJ,GAAO,KAAKjiC,CAAG,EAAE,QAAQmiC,CAAM,EAExCG,EAAU,KAAK,IAAI,IAAM7yB,EAAK,MAAO,CAAC,EAK5C,GAHyB2yB,EAAS,kBAAkBC,CAAM,EAGnCC,EACnB,OAAO,KAGX,IAAI/kB,EAASwkB,EAAO,OAEpB,GAAIxkB,GAAU,MAAQA,GAAU,EAC5B,OAAO,KAGX,IAAIvY,EAAO,IACX,OAAIuY,EAAS,MACTA,EAASA,EAAS,IAClBvY,EAAO,MAGJ,GAAG68B,GAAa,OAAOtkB,CAAM,CAAC,IAAIvY,CAAI,EACjD,EAEMu9B,GAAuCR,GAAU,CACnD,MAAM7D,EAAQ6D,EAAO,MACrB,OAAI7D,EAAM,SAAS,WACRA,EAAM,SAAS,WAAW,MAG9B,IACX,EAEA,MAAqBsE,EAAkB,CAiB5B,YAAY9gC,EAAoBygC,EAA0BM,EAAgB,CAhBhEhnC,EAAA,0BACAA,EAAA,wBACAA,EAAA,wBACAA,EAAA,0BACAA,EAAA,2BACAA,EAAA,kBACTA,EAAA,oBAAiD,MACjDA,EAAA,kCAA+C,MACtCA,EAAA,kBACTA,EAAA,kBAAa,IACJA,EAAA,0BAAqBolC,GAAA,GAErBplC,EAAA,gBACAA,EAAA,mBAAsD,KACtDA,EAAA,cAASujC,GAAA,GAGtB,KAAK,UAAYt9B,EACjB,KAAK,QAAU+gC,EACf,KAAK,UAAY,IAAIC,GAAS,CAAE,SAAAhhC,EAAU,EAI1C,KAAK,gBAAkB,IAAY,CAC/BygC,EAAO,QAAU,EACrB,EACA,KAAK,kBAAoB,IAAY,CACjCA,EAAO,QAAU,EACrB,EAEA,KAAK,mBAAqB,KAAK,aAAa,KAAK,IAAI,EACrD,KAAK,kBAAoB,IAAY,CACjC,KAAK,UAAU,WAAW,oBAAoB,cAAe,KAAK,iBAAiB,EACnF,KAAK,YAAY,EAAK,CAC1B,EAGA,KAAK,UAAU,iBAAiB,aAAc,KAAK,iBAAiB,EACpE,KAAK,UAAU,iBAAiB,WAAY,KAAK,eAAe,EAEhE,KAAK,gBAAkB,KAAK,UAAU,KAAK,IAAI,EAC/C,SAAS,iBAAiB,UAAW,KAAK,eAAe,EAEzD,KAAK,UAAU,iBAAiB,sBAAuB,KAAK,kBAAkB,EAE9E,KAAK,OAAO,UAAU,CAAC,CAAE,MAAAQ,EAAO,KAAAC,EAAM,KAAAp9B,KAAW,CAC7Cm9B,EAAM,IAAM,CACR,OAAQn9B,EAAA,CACJ,IAAK,aACD,KAAK,SAAA,EACL,MACJ,IAAK,cACD,KAAK,UAAA,EACL,MACJ,IAAK,gBACD,KAAK,YAAA,EACL,MACJ,IAAK,OACD,KAAK,eAAeo9B,EAAK,CAAC,CAAC,EAC3B,MACJ,IAAK,uBACI,KAAK,qBAAqBA,EAAK,CAAC,CAAC,EACtC,MACJ,IAAK,yBACI,KAAK,sBAAsBA,EAAK,CAAC,CAAC,EACvC,MACJ,IAAK,SACD,KAAK,iBAAiBA,EAAK,CAAC,CAAC,EAC7B,MACJ,IAAK,gBACD,KAAK,sBAAsBA,EAAK,CAAC,CAAC,EAClC,MACJ,IAAK,cACD,KAAK,YAAY,EAAK,EACtB,KAAA,CAEZ,CAAC,CACL,CAAC,CACL,CAEO,SAAgB,CACnB,SAAS,oBAAoB,UAAW,KAAK,eAAe,EAE5D,KAAK,UAAU,oBAAoB,aAAc,KAAK,iBAAiB,EACvE,KAAK,UAAU,oBAAoB,WAAY,KAAK,eAAe,EAEnE,KAAK,UAAU,oBAAoB,sBAAuB,KAAK,kBAAkB,EAEjF,KAAK,QAAQ,QAAQ1E,GAAS,KAAK,UAAU,OAAOA,CAAK,CAAC,EAC1D,KAAK,UAAU,QAAA,CACnB,CAEO,kBACH8C,EACA9C,EACAhhC,EAAqB,CAAA,EACX,CACV,MAAMgjC,EAAa,IAAIa,GAAWC,EAAO,IAAM9C,EAAOhhC,CAAU,EAChE,OAAAghC,EAAM,SAAS,WAAagC,EAC5BA,EAAW,iBAAiB,UAAW,IAAM,KAAK,cAAcA,CAAU,CAAC,EAC3E,KAAK,OAAO,IAAIA,CAAU,EAC1B,KAAK,QAAQ,IAAIA,EAAW,KAAMhC,CAAK,EAChCgC,CACX,CAEQ,SACJhC,EACA34B,EACAs9B,EACI,CACJ,GAAI3E,GAAS,CAAC,KAAK,QAAQ,IAAIA,EAAM,EAAE,EAAG,CACtC,MAAM4E,EAAW5E,EAAM,SACvB4E,EAAS,KAAOv9B,EAChBu9B,EAAS,cAAgB,GAEzB,IAAI9B,EAAQ6B,EACZ,GAAI,KAAK,OAAO,cAAc7B,CAAK,EAAG,CAClC,QAASpiC,EAAI,EAAGA,EAAI,MAChBoiC,EAAQ,GAAG6B,CAAW,KAAKjkC,CAAC,IACxB,EAAC,KAAK,OAAO,cAAcoiC,CAAK,GAFdpiC,GAAK,EAE3B,CAIA,KAAK,OAAO,cAAcoiC,CAAK,IAC/BA,EAAQ,2DAEhB,CACA,MAAMx7B,EAAOm8B,GAAYX,CAAK,EAC9B,GAAIx7B,GAAQ,KAAM,CACd,KAAK,oBAAoB04B,CAAK,EAC9B,MAAMgC,EAAa,KAAK,kBAAkB16B,EAAM04B,CAAK,EAErD,KAAK,QAAQ,IAAIgC,EAAW,KAAMhC,CAAK,CAC3C,MACI,KAAK,UAAU,OAAOA,CAAK,CAEnC,CACJ,CAEQ,oBAAoBA,EAAwC,CAChEA,EAAM,SAAS,aAAe,CAC1B,OAAQ6E,GAAQ,mBAAmB7E,CAAK,CAAA,GAGxCA,EAAM,SAAS,OAAS,WAAaA,EAAM,SAAS,OAAS,gBAC7DA,EAAM,SAAS,aAAa,UAAYA,EAAM,UAAA,GAE9CA,EAAM,SAAS,OAAS,YACxBA,EAAM,SAAS,aAAa,KAAOA,EAAM,QAAA,EAEjD,CAEQ,iBAAiBgC,EAA8B,CACnD,GAAI,KAAK,QAAQ,IAAIA,EAAW,IAAI,EAAG,CACnC,MAAMhC,EAAQgC,EAAW,OACzB,KAAK,UAAU,OAAOhC,CAAK,EAC3B,KAAK,QAAQ,OAAOgC,EAAW,IAAI,CACvC,CACJ,CAEQ,KACJ8C,EACAz9B,EACAs9B,EACAnjC,EACI,CACJ,KAAK,OAAO,iBAAiB,EAAI,EAE5B,KAAK,UAAUsjC,CAAM,EAAE,CACxB,GAAG,KAAK,mBAAA,EACR,GAAGtjC,CAAA,CACN,EACI,KAAKw+B,GAAS,CACX,KAAK,SAASA,EAAoC34B,EAAMs9B,CAAW,CACvE,CAAC,EACA,QAAQ,IAAM,KAAK,OAAO,iBAAiB,EAAK,CAAC,CAC1D,CAEQ,UAAiB,CACrB,KAAK,KAAK,mBAAoB,aAAc,sBAAuB,CAC/D,sBAAuBX,GAAgB,KAAK,UAAU,IAAI,EAC1D,kBAAmB,KAAK,OAAO,WAAA,CAAW,CAC7C,CACL,CAEQ,WAAkB,CACtB,KAAK,KAAK,cAAe,QAAS,uBAAwB,CACtD,YAAa,EACb,iBAAkB,KAAK,OAAO,WAAA,EAC9B,qBAAsBK,GACtB,aAAc7G,EAAAA,kBAAA,CACjB,CACL,CAEQ,aAAoB,CACxB,KAAK,KAAK,gBAAiB,UAAW,yBAA0B,CAC5D,iBAAkB,KAAK,OAAO,WAAA,EAC9B,sBAAuBoG,EAAA,CAC1B,CACL,CAEQ,eAAe5B,EAA8B,CACjD,MAAMhC,EAAQ,KAAK,QAAQ,IAAIgC,EAAW,IAAI,EAE9C,GAAI,CAAChC,EAAO,CACR,QAAQ,KAAK,iCAAiCgC,EAAW,IAAI,EAAE,EAC/D,MACJ,CAEA,KAAK,aAAehC,EACpB,KAAK,2BAA6B,CAAC,GAAGA,EAAM,MAAM,EAElDgC,EAAW,UAAY,GAEvBhC,EAAM,MAAQ+E,EAAAA,iBACd/E,EAAM,SAAS,cAAgB,GAE/B,KAAK,UAAU,aAAaA,CAAK,EAEjC,KAAK,OAAO,iBAAiB,EAAI,EAEjC,KAAK,UAAU,WAAW,iBAAiB,cAAe,KAAK,iBAAiB,EAEhF,KAAK,WAAa,GAClB,KAAK,UAAU,cAAc,CACzB,KAAM,KAAK,KAAK,KAAK,IAAI,EACzB,aAAc,CAACA,CAAK,CAAA,CACvB,CACL,CAEQ,kBAAkBgF,EAAuBC,EAAgC,CAC7E,OAAKA,EAKED,EAHIA,EAAQ,OAAOphC,GAAO,CAACi8B,GAAAA,kBAAkBj8B,CAAG,CAAC,CAI5D,CAEQ,oBAAsC,CAC1C,MAAO,CACH,MAAO83B,EAAAA,oBACP,KAAM,KAAK,KAAK,KAAK,IAAI,CAAA,CAEjC,CAEA,MAAc,iBACV58B,EACAomC,EACgB,CAQhB,IAPIpmC,EAAQ,YAAc,MAAQ,OAAOA,EAAQ,YAAe,YAC5DA,EAAQ,WAAa,CAAA,GAErBA,EAAQ,WAAW,OAAS,OAC5BA,EAAQ,WAAW,MAAQs+B,EAAAA,UAAU,aAAA,GAGrC8H,EAAU,IAAIpmC,EAAQ,WAAW,KAAK,EACtC,MAAO,GAGX,MAAMkhC,EAAQ,MAAM,KAAK,uBAAuBlhC,CAAO,EACvD,YAAK,kBAAkBA,EAAQ,WAAW,MAAOkhC,EAAOlhC,EAAQ,UAAU,EACnE,EACX,CAEA,MAAc,qBAAqB0jC,EAA2B,CAC1D,MAAM2C,EAAsB,IAAI,IAAI,KAAK,OAAO,iBAAiB,IAAI3T,GAAKA,EAAE,KAAK,CAAC,EAClF,GAAI,CACA,KAAM,CAAE,WAAA4T,EAAY,UAAAC,CAAA,EAAc,MAAM,KAAK,WAAW7C,EAAM2C,CAAmB,EACjF,KAAK,mBAAmB,KACpB,IAAIlC,EACA,cACA,GAAGmC,CAAU,0BAA0BC,CAAS,YAChD,SAAA,CACJ,CAER,MAAqB,CAGrB,CACJ,CAEA,MAAc,sBAAsB3C,EAA8B,CAC9D,MAAM9/B,EAAW,CAAA,EACjB,IAAI0iC,EAAkB,EAClBC,EAAiB,EACrB,MAAMC,EAAmB,CAAA,EAEnBL,EAAsB,IAAI,IAAI,KAAK,OAAO,iBAAiB,IAAI3T,GAAKA,EAAE,KAAK,CAAC,EAElF,UAAWgR,KAAQE,EACf9/B,EAAS,KACL,KAAK,WAAW4/B,EAAM2C,CAAmB,EACpC,KAAK,CAAC,CAAE,WAAAC,EAAY,UAAAC,KAAgB,CACjCC,GAAmBF,EACnBG,GAAkBF,CACtB,CAAC,EACA,MAAMI,GAAU,CACbD,EAAO,KAAMC,EAAiB,OAAO,CACzC,CAAC,CAAA,EAGb,MAAM,QAAQ,WAAW7iC,CAAQ,EAE7B4iC,EAAO,OAAS,EAChB,KAAK,mBAAmB,KACpB,IAAIvC,EACA,cACA,GAAGqC,CAAe,0BAA0BC,CAAc,cAAcC,EAAO,MAAM,YAAYA,CAAM,GACvG,SAAA,CACJ,EAGJ,KAAK,mBAAmB,KACpB,IAAIvC,EACA,cACA,GAAGqC,CAAe,0BAA0BC,CAAc,YAC1D,SAAA,CACJ,CAGZ,CAEA,MAAc,WACV/C,EACA0C,EACkD,CAClD,MAAMQ,EAAM,MAAMlD,EAAK,KAAA,EACjBQ,EAAU,KAAK,MAAM0C,CAAG,EAExBzO,EAAW+L,EAAQ,OAAS,oBAAsBA,EAAQ,SAAW,CAACA,CAAO,EAEnF,IAAIoC,EAAa,EACbC,EAAY,EAEhB,UAAWvmC,KAAWm4B,EACD,MAAM,KAAK,iBAAiBn4B,EAASomC,CAAS,EAE3DE,IAEAC,IAGR,MAAO,CAAE,WAAAD,EAAY,UAAAC,CAAA,CACzB,CAKA,MAAc,uBACVvmC,EACkC,CAClC,GAAIA,EAAQ,OAAS,UACjB,MAAM,IAAI,MAAM,6BAA6B,EAGjD,MAAMX,EAAM,YAENy+B,EAAYx5B,GAAyB,CACvC,MAAM0X,EAAQ,IAAItY,GAAYrE,EAAKiF,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,GAAK,CAAC,EACxD,OAAO0X,EAAM,GAAG,KAAK,UAAU,aAAcA,CAAK,EAAE,UAAA,CACxD,EAEA,IAAI9S,EAEJ,OAAQlJ,EAAQ,SAAS,KAAA,CACrB,IAAK,aACDkJ,EAAS,IAAIu1B,GAA0B,CACnC,kBAAmBoI,GAAAA,qBAAqB,CAAC,EACzC,MAAOjK,EAAAA,oBACP,sBAAuBsI,GAAgB,KAAK,UAAU,IAAI,EAC1D,SAAU,GACV,kBAAmB,GACnB,iBAAkB,GAClB,aAAc,EAAA,CACjB,EACDh8B,EAAO,UAAUlJ,EAAQ,SAAS,YAAY,IAAI89B,CAAQ,CAAC,EAC3D,MACJ,IAAK,aACD50B,EAAS,IAAIu1B,GAA0B,CACnC,kBAAmBoI,GAAAA,qBAAqB,CAAC,EACzC,MAAOjK,EAAAA,oBACP,SAAU,GACV,iBAAkB,GAClB,aAAc,GACd,qBAAsB2I,GACtB,aAAc7G,EAAAA,kBAAA,CACjB,EACDx1B,EAAO,UAAUlJ,EAAQ,SAAS,YAAY,IAAI89B,CAAQ,CAAC,EAC3D,MACJ,IAAK,QACD50B,EAAS,IAAIu1B,GAA0B,CACnC,kBAAmBqI,GAAAA,YACnB,MAAOlK,EAAAA,oBACP,SAAU,GACV,iBAAkB,GAClB,aAAc,GACd,qBAAsB2I,GACtB,aAAc7G,EAAAA,kBAAA,CACjB,EACDx1B,EAAO,UAAU,CAAC40B,EAAS99B,EAAQ,SAAS,WAAW,CAAC,CAAC,EACzD,MACJ,IAAK,UACDkJ,EAAS,IAAIu1B,GAA0B,CACnC,iBAAkBsI,GAAAA,uBAClB,iBAAkBC,GAAAA,uBAClB,kBAAmBH,GAAAA,qBAAqB,CAAC,EACzC,MAAOjK,EAAAA,oBACP,SAAU,GACV,YAAa,GACb,iBAAkB,GAClB,iBAAkB,GAClB,aAAc,GACd,sBAAuBkI,EAAA,CAC1B,EACD57B,EAAO,UAAUlJ,EAAQ,SAAS,YAAY,CAAC,EAAE,IAAI89B,CAAQ,CAAC,EAC9D,MACJ,QACI,MAAM,IAAI,MACN,uDAAyD99B,EAAQ,SAAS,IAAA,CAC9E,CAGR,YAAK,oBAAoBkJ,CAAM,EAE/B,MAAM,KAAK,UAAU,IAAIA,CAAM,EAExBA,CACX,CAEQ,UAAU0I,EAAwB,CAClCA,EAAE,OAAS,UACX,KAAK,YAAY,EAAI,CAE7B,CAEQ,KAAKq1B,EAA2C,CACpD,IAAIf,EAEJ,OAAQ,KAAK,OAAO,kBAAA,EAAkB,CAClC,IAAK,UACDA,EAAU,KAAK,QAAQe,CAAK,EAC5B,MACJ,IAAK,SACDf,EAAU,KAAK,YAAYe,CAAK,EAChC,MACJ,IAAK,cACDf,EAAU,KAAK,aAAae,CAAK,EACjC,KAAA,CAGR,OAAOf,CACX,CAEQ,YAAYe,EAA2C,CAC3D,MAAMf,EAAU,KAAK,UAAU,cAAce,EAAO,CAAE,eAAgB,GAAM,EAE5E,OAAO,KAAK,kBAAkBf,EAAS,KAAK,UAAU,CAC1D,CAEQ,aAAae,EAA2C,CAC5D,MAAMf,EAAU,KAAK,QAAQ,aAAa,KAAK,UAAWe,EAAO,CAAC,GAAK,CAAA,EAEvE,OAAO,KAAK,kBAAkBf,EAAS,KAAK,UAAU,CAC1D,CAEQ,QAAQe,EAA2C,CACvD,MAAMf,EAAU,KAAK,UAAU,cAAce,EAAO,CAChD,OAAQniC,GAAOi8B,GAAAA,kBAAkBj8B,CAAG,GAAKoiC,GAAAA,gBAAgBpiC,CAAG,EAC5D,eAAgB,EAAA,CACnB,EAED,OAAO,KAAK,kBAAkBohC,EAAS,KAAK,UAAU,CAC1D,CAEQ,YAAYiB,EAA6B,CAC7C,KAAK,UAAU,aAAA,EACf,KAAK,WAAa,GAClB,KAAK,OAAO,iBAAiB,EAAK,EAE9B,KAAK,eACDA,GAAgB,KAAK,6BACrB,KAAK,aAAa,UAAU,KAAK,0BAA0B,EAC3D,KAAK,2BAA6B,MAElC,KAAK,aAAa,SAAS,YAAc,OACzC,KAAK,aAAa,SAAS,WAAW,UAAY,IAEtD,KAAK,aAAa,MAAQvK,EAAAA,oBAC1B,KAAK,aAAa,SAAS,cAAgB,GAC3C,KAAK,aAAe,KAE5B,CAEQ,sBAAsBwK,EAAqB,CAC/C,KAAK,QAAQ,QAAQlG,GAAS,CAC1B,OAAQA,EAAM,SAAS,KAAA,CACnB,IAAK,aACDA,EAAM,kBAAoBkG,EAC1B,MACJ,IAAK,aACL,IAAK,QACDlG,EAAM,iBAAmBkG,EACzB,MACJ,IAAK,UACDlG,EAAM,iBAAmBkG,EACzB,KAAA,CAEZ,CAAC,CACL,CAEQ,cAAclE,EAA8B,CAChDA,EAAW,OAAO,QAAUA,EAAW,QACvCA,EAAW,OAAO,SAASt+B,GAAMA,EAAE,QAAUs+B,EAAW,OAAQ,EAChE,KAAK,UAAU,aAAA,CACnB,CAEQ,cAAqB,CACzB,KAAK,QAAQ,QAAQhC,GAAS,CACtBA,EAAM,SACNA,EAAM,cAAA,CAEd,CAAC,CACL,CACJ,CC/mBA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOA,MAAMmG,EAAe,CACjB,KAAM,EACN,MAAO,EACP,OAAQ,CACZ,EACMC,EAAS,OAAO,OAAO,CACzB,KAAM,EACN,OAAQ,EACR,MAAO,EACP,WAAY,EACZ,OAAQ,EACR,MAAO,GACP,KAAM,GACN,aAAc,GACd,YAAa,IACb,iBAAkB,IAClB,aAAc,IACd,YAAa,KACb,WAAY,KACZ,kBAAmB,KACnB,uBAAwB,KACxB,mBAAoB,MACpB,mBAAoB,MACpB,iBAAkB,MAClB,kBAAmB,OACnB,sBAAuB,OACvB,kBAAmB,MACvB,CAAC,EACKC,GAAkB,CACpB,KAAM,EACN,GAAI,EACJ,IAAK,EACT,EACA,SAASC,GAAoBrC,EAAQ,CACjC,OAAOA,EAAO,mBAClB,CACA,SAASsC,GAAqBtC,EAAQ,CAClC,OAAOA,EAAO,oBAClB,CAEA,MAAMuC,GAAO,KAAK,GAAK,EACjBC,GAAU,KAAK,GAAK,EAEpBC,GAAU,KACVC,GAAU,KAAK,GAAK,IAC1B,SAASC,GAAMvjC,EAAOggC,EAAKC,EAAK,CAC5B,OAAO,KAAK,IAAID,EAAK,KAAK,IAAIC,EAAKjgC,CAAK,CAAC,CAC7C,CACA,SAASwjC,EAAWC,EAAQtzB,EAAQkzB,GAAS,CACzC,OAAO,KAAK,IAAII,CAAM,EAAItzB,CAC9B,CACA,SAASuzB,EAAaljC,EAAGC,EAAG0P,EAAQkzB,GAAS,CACzC,OAAOG,EAAWhjC,EAAIC,EAAG0P,CAAK,CAClC,CACA,SAASwzB,GAAY3jC,EAAO4jC,EAAM,CAC9B,OAAO,KAAK,MAAM5jC,EAAQ4jC,CAAI,EAAIA,CACtC,CACA,SAASC,GAAoB7jC,EAAO,CAChC,OAAI,SAASA,CAAK,EACPA,EACPA,EAAQ,EACD,CAAC,OAAO,UACZ,OAAO,SAClB,CACA,SAAS8jC,GAAoB9jC,EAAO,CAChC,OAAI,KAAK,IAAIA,CAAK,EAAI,OAAO,UAClBA,EACJA,EAAQ,KACnB,CAGA,SAAS+jC,GAAWC,EAASC,EAAQC,EAAoBC,EAAYC,EAAW,IAAUC,EAAW,CAEjGF,EAAa,KAAK,IAAI,KAAQA,CAAU,EACxC,MAAMhS,EAAQ,EAAIgS,EACZ7mC,EAAI60B,EAAQkS,EACZhiB,EAAM,GAAK,EAAI/kB,EAAI,IAAOA,EAAIA,EAAI,KAAQA,EAAIA,EAAIA,GACxD,IAAIgnC,EAASN,EAAUC,EACvB,MAAMM,EAAaN,EAEbO,EAAYJ,EAAWD,EAC7BG,EAASf,GAAMe,EAAQ,CAACE,EAAWA,CAAS,EAC5CP,EAASD,EAAUM,EACnB,MAAM5kB,GAAQwkB,EAAmB,MAAQ/R,EAAQmS,GAAUD,EAC3DH,EAAmB,OAASA,EAAmB,MAAQ/R,EAAQzS,GAAQ2C,EACvE,IAAIlO,EAAS8vB,GAAUK,EAAS5kB,GAAQ2C,EAExC,OAAIkiB,EAAaP,EAAU,GAAQ7vB,EAASowB,IACxCpwB,EAASowB,EACTL,EAAmB,OAAS/vB,EAASowB,GAAcF,GAEhDlwB,CACX,CAGA,SAASswB,GAAeT,EAASC,EAAQC,EAAoBC,EAAYC,EAAW,IAAUC,EAAW38B,EAAK,CAE1Gy8B,EAAa,KAAK,IAAI,KAAQA,CAAU,EACxC,MAAMhS,EAAQ,EAAIgS,EACZ7mC,EAAI60B,EAAQkS,EACZhiB,EAAM,GAAK,EAAI/kB,EAAI,IAAOA,EAAIA,EAAI,KAAQA,EAAIA,EAAIA,GACxD,IAAIonC,EAAUT,EAAO,EACjBU,EAAUV,EAAO,EACjBW,EAAUX,EAAO,EACjBY,EAAUb,EAAQ,EAAIU,EACtBI,EAAUd,EAAQ,EAAIW,EACtBI,EAAUf,EAAQ,EAAIY,EAC1B,MAAMI,EAAcN,EACdO,EAAcN,EACdO,EAAcN,EAEdJ,EAAYJ,EAAWD,EACvBgB,EAAcX,EAAYA,EAC1BY,EAAcP,EAAUA,EAAUC,EAAUA,EAAUC,EAAUA,EACtE,GAAIK,EAAcD,EAAa,CAC3B,MAAME,GAAY,KAAK,KAAKD,CAAW,EACvCP,EAAUA,EAAUQ,GAAYb,EAChCM,EAAUA,EAAUO,GAAYb,EAChCO,EAAUA,EAAUM,GAAYb,CACpC,CACAE,EAAUV,EAAQ,EAAIa,EACtBF,EAAUX,EAAQ,EAAIc,EACtBF,EAAUZ,EAAQ,EAAIe,EACtB,MAAMO,GAASpB,EAAmB,EAAI/R,EAAQ0S,GAAWR,EACnDkB,GAASrB,EAAmB,EAAI/R,EAAQ2S,GAAWT,EACnDmB,GAAStB,EAAmB,EAAI/R,EAAQ4S,GAAWV,EACzDH,EAAmB,GAAKA,EAAmB,EAAI/R,EAAQmT,GAASjjB,EAChE6hB,EAAmB,GAAKA,EAAmB,EAAI/R,EAAQoT,GAASljB,EAChE6hB,EAAmB,GAAKA,EAAmB,EAAI/R,EAAQqT,GAASnjB,EAChE3a,EAAI,EAAIg9B,GAAWG,EAAUS,GAASjjB,EACtC3a,EAAI,EAAIi9B,GAAWG,EAAUS,GAASljB,EACtC3a,EAAI,EAAIk9B,GAAWG,EAAUS,GAASnjB,EAEtC,MAAMojB,EAAoBT,EAAchB,EAAQ,EAC1C0B,EAAoBT,EAAcjB,EAAQ,EAC1C2B,EAAoBT,EAAclB,EAAQ,EAC1C4B,EAAgBl+B,EAAI,EAAIs9B,EACxBa,GAAgBn+B,EAAI,EAAIu9B,EACxBa,GAAgBp+B,EAAI,EAAIw9B,EAC9B,OAAIO,EAAoBG,EAAgBF,EAAoBG,GAAgBF,EAAoBG,GAAgB,IAC5Gp+B,EAAI,EAAIs9B,EACRt9B,EAAI,EAAIu9B,EACRv9B,EAAI,EAAIw9B,EACRhB,EAAmB,GAAKx8B,EAAI,EAAIs9B,GAAeX,EAC/CH,EAAmB,GAAKx8B,EAAI,EAAIu9B,GAAeZ,EAC/CH,EAAmB,GAAKx8B,EAAI,EAAIw9B,GAAeb,GAE5C38B,CACX,CAEA,SAASq+B,GAA4BC,EAAUt+B,EAAK,CAChDA,EAAI,IAAI,EAAG,CAAC,EACZs+B,EAAS,QAASC,GAAY,CAC1Bv+B,EAAI,GAAKu+B,EAAQ,QACjBv+B,EAAI,GAAKu+B,EAAQ,OACrB,CAAC,EACDv+B,EAAI,GAAKs+B,EAAS,OAClBt+B,EAAI,GAAKs+B,EAAS,MACtB,CAEA,SAASE,GAAiCtF,EAAQuF,EAAS,CACvD,OAAIjD,GAAqBtC,CAAM,GAC3B,QAAQ,KAAK,GAAGuF,CAAO,yCAAyC,EACzD,IAEJ,EACX,CAEA,MAAM3I,EAAgB,CAClB,aAAc,CACV,KAAK,WAAa,CAAA,CACtB,CAOA,iBAAiBx5B,EAAMoiC,EAAU,CAC7B,MAAMC,EAAY,KAAK,WACnBA,EAAUriC,CAAI,IAAM,SACpBqiC,EAAUriC,CAAI,EAAI,CAAA,GAClBqiC,EAAUriC,CAAI,EAAE,QAAQoiC,CAAQ,IAAM,IACtCC,EAAUriC,CAAI,EAAE,KAAKoiC,CAAQ,CACrC,CAOA,iBAAiBpiC,EAAMoiC,EAAU,CAC7B,MAAMC,EAAY,KAAK,WACvB,OAAOA,EAAUriC,CAAI,IAAM,QAAaqiC,EAAUriC,CAAI,EAAE,QAAQoiC,CAAQ,IAAM,EAClF,CAOA,oBAAoBpiC,EAAMoiC,EAAU,CAEhC,MAAME,EADY,KAAK,WACStiC,CAAI,EACpC,GAAIsiC,IAAkB,OAAW,CAC7B,MAAM9qB,EAAQ8qB,EAAc,QAAQF,CAAQ,EACxC5qB,IAAU,IACV8qB,EAAc,OAAO9qB,EAAO,CAAC,CACrC,CACJ,CAMA,wBAAwBxX,EAAM,CAC1B,GAAI,CAACA,EAAM,CACP,KAAK,WAAa,CAAA,EAClB,MACJ,CACI,MAAM,QAAQ,KAAK,WAAWA,CAAI,CAAC,IACnC,KAAK,WAAWA,CAAI,EAAE,OAAS,EACvC,CAMA,cAAc0+B,EAAO,CAEjB,MAAM4D,EADY,KAAK,WACS5D,EAAM,IAAI,EAC1C,GAAI4D,IAAkB,OAAW,CAC7B5D,EAAM,OAAS,KACf,MAAMnsB,EAAQ+vB,EAAc,MAAM,CAAC,EACnC,QAASjpC,EAAI,EAAG,EAAIkZ,EAAM,OAAQlZ,EAAI,EAAGA,IACrCkZ,EAAMlZ,CAAC,EAAE,KAAK,KAAMqlC,CAAK,CAEjC,CACJ,CACJ,CAEA,IAAIlN,GACJ,MAAM+Q,GAAU,SACVC,GAAqB,EAAI,EACzBC,GAAQ,MAAM,MAAMjR,GAAK,YAAe,KAAgC,OAAS,WAAW,aAAe,MAAQA,KAAO,OAAS,OAASA,GAAG,QAAQ,EAC7J,IAAIkR,EACAC,GACAC,GACAC,GACAC,GACAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACJ,MAAMC,WAAuBzK,EAAgB,CAyCzC,OAAO,QAAQ0K,EAAM,CACjBxB,EAAQwB,EAAK,MACbvB,GAAU,OAAO,OAAO,IAAID,EAAM,QAAQ,EAAG,EAAG,CAAC,CAAC,EAClDE,GAAU,OAAO,OAAO,IAAIF,EAAM,QAAQ,EAAG,EAAG,CAAC,CAAC,EAClDG,GAAU,OAAO,OAAO,IAAIH,EAAM,QAAQ,EAAG,EAAG,CAAC,CAAC,EAClDI,GAAM,IAAIJ,EAAM,QAChBK,EAAO,IAAIL,EAAM,QACjBM,EAAO,IAAIN,EAAM,QACjBO,GAAO,IAAIP,EAAM,QACjBQ,GAAmB,IAAIR,EAAM,QAC7BS,GAAW,IAAIT,EAAM,QACrBU,GAAW,IAAIV,EAAM,QACrBW,GAAW,IAAIX,EAAM,QACrBY,GAAe,IAAIZ,EAAM,QACzBa,GAAe,IAAIb,EAAM,QACzBc,GAAc,IAAId,EAAM,UACxBe,GAAc,IAAIf,EAAM,UACxBgB,GAAS,IAAIhB,EAAM,KACnBiB,GAAS,IAAIjB,EAAM,KACnBkB,GAAU,IAAIlB,EAAM,OACpBmB,GAAe,IAAInB,EAAM,WACzBoB,GAAe,IAAIpB,EAAM,WACzBqB,GAAkB,IAAIrB,EAAM,QAC5BsB,GAAa,IAAItB,EAAM,SAC3B,CAKA,WAAW,QAAS,CAChB,OAAO3D,CACX,CAIA,IAAI,sBAAsBoF,EAAG,CACzB,QAAQ,KAAK,2HAA2H,CAC5I,CAkBA,YAAYvH,EAAQwH,EAAY,CAC5B,MAAK,EAYL,KAAK,cAAgB,EAYrB,KAAK,cAAgB,KAAK,GAY1B,KAAK,gBAAkB,KAYvB,KAAK,gBAAkB,IAOvB,KAAK,YAAc,OAAO,QAM1B,KAAK,YAAc,IAMnB,KAAK,cAAgB,GAKrB,KAAK,QAAU,IAKf,KAAK,QAAU,IAKf,KAAK,WAAa,IAKlB,KAAK,mBAAqB,KAK1B,KAAK,SAAW,IAKhB,KAAK,mBAAqB,EAK1B,KAAK,iBAAmB,EAKxB,KAAK,WAAa,EAKlB,KAAK,kBAAoB,GAKzB,KAAK,WAAa,EAKlB,KAAK,cAAgB,GAIrB,KAAK,aAAe,GAKpB,KAAK,iBAAmB,EAKxB,KAAK,cAAgB,IAMrB,KAAK,eAAiB,CAAA,EAMtB,KAAK,OAAS,IAAM,CAAE,EACtB,KAAK,SAAW,GAChB,KAAK,OAASrF,EAAO,KACrB,KAAK,UAAY,KACjB,KAAK,cAAgB,EACrB,KAAK,aAAe,EACpB,KAAK,WAAa,GAClB,KAAK,wBAA0B,GAC/B,KAAK,aAAe,GACpB,KAAK,iBAAmB,GACxB,KAAK,aAAe,IAAI,QACxB,KAAK,YAAc,GACnB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,CAAA,EACvB,KAAK,eAAiB,KACtB,KAAK,iBAAmB,IAAI,QAAQ,EAAG,EAAG,EAAG,CAAC,EAI9C,KAAK,yBAA2B,GAChC,KAAK,wBAA0B,GAC/B,KAAK,wBAA0B,GAC/B,KAAK,yBAA2B,GAChC,KAAK,uBAAyB,GAC9B,KAAK,oBAAsBC,GAAgB,KAE3C,KAAK,eAAiB,CAAE,MAAO,CAAC,EAChC,KAAK,aAAe,CAAE,MAAO,CAAC,EAC9B,KAAK,gBAAkB,CAAE,MAAO,CAAC,EACjC,KAAK,gBAAkB,IAAI0D,EAAM,QACjC,KAAK,qBAAuB,IAAIA,EAAM,QACtC,KAAK,cAAgB,CAAE,MAAO,CAAC,EAC/B,KAAK,eAAiB,CAAC2B,EAAQC,EAAQC,EAAcC,IAAuB,CACxE,IAAIC,EACAC,EACJ,GAAIzF,GAAoB,KAAK,OAAO,EAAG,CACnC,MAAMvzB,EAASq3B,EAAK,KAAK,KAAK,QAAQ,QAAQ,EAAE,IAAI,KAAK,OAAO,EAE1D4B,EAAM,KAAK,QAAQ,gBAAe,EAAKrF,GACvCsF,EAAiBl5B,EAAO,OAAM,EAAK,KAAK,IAAIi5B,EAAM,EAAG,EAC3DF,EAAU,KAAK,WAAaJ,EAASO,EAAiB,KAAK,aAAa,OACxEF,EAAa,KAAK,WAAaJ,EAASM,EAAiB,KAAK,aAAa,MAC/E,SACS1F,GAAqB,KAAK,OAAO,EAAG,CACzC,MAAMtC,EAAS,KAAK,QACpB6H,EAAS,KAAK,WAAaJ,GAAUzH,EAAO,MAAQA,EAAO,MAAQA,EAAO,KAAO,KAAK,aAAa,MACnG8H,EAAY,KAAK,WAAaJ,GAAU1H,EAAO,IAAMA,EAAO,QAAUA,EAAO,KAAO,KAAK,aAAa,MAC1G,KAEI,QAEA4H,GACAD,EACI,KAAK,eAAe,KAAK,gBAAgB,EAAIE,EAAQ,KAAK,gBAAgB,EAAG,KAAK,gBAAgB,EAAG,EAAI,EACzG,KAAK,MAAMA,EAAQ,EAAG,EAAI,EAC9B,KAAK,QAAQ,CAACC,EAAW,EAAI,GAG7BH,EACI,KAAK,eAAe,KAAK,gBAAgB,EAAIE,EAAQ,KAAK,gBAAgB,EAAIC,EAAW,KAAK,gBAAgB,EAAG,EAAI,EACrH,KAAK,MAAMD,EAAQC,EAAW,EAAI,CAE9C,EACA,KAAK,gBAAkB,CAACL,EAAQC,IAAW,CACvC,MAAMlhB,EAAQ+b,GAAO,KAAK,mBAAqBkF,EAAS,KAAK,aAAa,OACpE/8B,EAAM63B,GAAO,KAAK,iBAAmBmF,EAAS,KAAK,aAAa,OACtE,KAAK,OAAOlhB,EAAO9b,EAAK,EAAI,CAChC,EACA,KAAK,eAAiB,CAACu9B,EAAOvrC,EAAGC,IAAM,CACnC,MAAMurC,EAAa,KAAK,IAAI,IAAM,CAACD,EAAQ,KAAK,UAAU,EACpDE,EAAe,KAAK,cAAc,OAClCC,EAAW,KAAK,cAAc,OAASF,EACvCG,EAAkB1F,GAAMyF,EAAU,KAAK,YAAa,KAAK,WAAW,EACpEE,EAAqBD,EAAkBD,EACzC,KAAK,eAAiB,KAAK,cAC3B,KAAK,gBAAgBA,EAAU,EAAI,EAE9B,KAAK,eAAiB,CAAC,KAAK,eACjC,KAAK,aAAaE,EAAoB,EAAI,EAC1C,KAAK,gBAAgBD,EAAiB,EAAI,GAG1C,KAAK,gBAAgBA,EAAiB,EAAI,EAE1C,KAAK,gBACL,KAAK,gBAAkB,KAAK,cAAgBD,EAAWC,GAAmBF,EAC1E,KAAK,mBAAmB,IAAIzrC,EAAGC,CAAC,GAEpC,KAAK,oBAAsB,KAAK,KAAK,CAACsrC,CAAK,CAC/C,EACA,KAAK,cAAgB,CAACA,EAAOvrC,EAAGC,IAAM,CAClC,MAAM4rC,EAAY,KAAK,IAAI,IAAMN,EAAQ,KAAK,UAAU,EAClDO,EAAW,KAAK,MAChBC,EAAO,KAAK,MAAQF,EAE1B,KAAK,OAAOE,EAAM,EAAI,EAClB,KAAK,gBACL,KAAK,cAAgBA,EAAOD,EAC5B,KAAK,mBAAmB,IAAI9rC,EAAGC,CAAC,EAExC,EAEI,OAAOmpC,EAAU,KACjB,QAAQ,MAAM,iJAAiJ,EAEnK,KAAK,QAAU9F,EACf,KAAK,cAAgB,IAAI8F,EAAM,WAAU,EAAG,mBAAmB,KAAK,QAAQ,GAAIE,EAAO,EACvF,KAAK,qBAAuB,KAAK,cAAc,MAAK,EAAG,OAAM,EAC7D,KAAK,OAAS7D,EAAO,KAErB,KAAK,QAAU,IAAI2D,EAAM,QACzB,KAAK,WAAa,KAAK,QAAQ,MAAK,EACpC,KAAK,aAAe,IAAIA,EAAM,QAC9B,KAAK,gBAAkB,KAAK,aAAa,MAAK,EAE9C,KAAK,WAAa,IAAIA,EAAM,UAAS,EAAG,eAAeK,EAAK,KAAK,KAAK,QAAQ,QAAQ,EAAE,gBAAgB,KAAK,aAAa,CAAC,EAC3H,KAAK,cAAgB,KAAK,WAAW,MAAK,EAC1C,KAAK,cAAgB,KAAK,WAAW,OACrC,KAAK,MAAQ,KAAK,QAAQ,KAC1B,KAAK,SAAW,KAAK,MACrB,KAAK,UAAY,KAAK,MAEtB,KAAK,kBAAoB,CACrB,IAAIL,EAAM,QACV,IAAIA,EAAM,QACV,IAAIA,EAAM,QACV,IAAIA,EAAM,OACtB,EACQ,KAAK,wBAAuB,EAE5B,KAAK,UAAY,IAAIA,EAAM,KAAK,IAAIA,EAAM,QAAQ,KAAW,KAAW,IAAS,EAAG,IAAIA,EAAM,QAAQ,IAAU,IAAU,GAAQ,CAAC,EAEnI,KAAK,WAAa,KAAK,QAAQ,GAAG,MAAK,EACvC,KAAK,SAAW,KAAK,QAAQ,MAAK,EAClC,KAAK,WAAa,KAAK,QAAQ,SAAS,MAAK,EAC7C,KAAK,OAAS,KAAK,MACnB,KAAK,cAAgB,KAAK,aAAa,MAAK,EAC5C,KAAK,mBAAqB,IAAIA,EAAM,QAEpC,KAAK,aAAe,CAChB,KAAM3D,EAAO,OACb,OAAQA,EAAO,MACf,MAAOA,EAAO,MACd,MAAOE,GAAoB,KAAK,OAAO,EAAIF,EAAO,MAC9CG,GAAqB,KAAK,OAAO,EAAIH,EAAO,KACxCA,EAAO,IAC3B,EACQ,KAAK,QAAU,CACX,IAAKA,EAAO,aACZ,IAAKE,GAAoB,KAAK,OAAO,EAAIF,EAAO,kBAC5CG,GAAqB,KAAK,OAAO,EAAIH,EAAO,iBACxCA,EAAO,KACf,MAAOA,EAAO,WAC1B,EACQ,MAAMuG,EAAoB,IAAI5C,EAAM,QAC9B6C,EAAmB,IAAI7C,EAAM,QAC7B8C,EAAa,IAAI9C,EAAM,QACvB+C,EAAiB/G,GAAU,CAC7B,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,YACxB,OACJ,GAAI,KAAK,iBAAiB,OAAS,GAC/B,KAAK,iBAAiB,MAAQ,GAC9B,KAAK,iBAAiB,QAAU,GAChC,KAAK,iBAAiB,SAAW,EAAG,CACpC,MAAMgH,EAAS,KAAK,YAAY,sBAAqB,EAC/CC,EAAOjH,EAAM,QAAUgH,EAAO,MAC9BE,EAAMlH,EAAM,QAAUgH,EAAO,OAEnC,GAAIC,EAAO,KAAK,iBAAiB,MAC7BA,EAAO,KAAK,iBAAiB,OAC7BC,EAAM,KAAK,iBAAiB,KAC5BA,EAAM,KAAK,iBAAiB,OAC5B,MACR,CAIA,MAAMC,EAAcnH,EAAM,cAAgB,QAAU,MAC/CA,EAAM,QAAUI,EAAa,QAAUA,EAAa,KAAOA,EAAa,MACpEJ,EAAM,QAAUI,EAAa,UAAYA,EAAa,OAASA,EAAa,QACxEJ,EAAM,QAAUI,EAAa,SAAWA,EAAa,MAAQA,EAAa,MACvE,KAChB,GAAI+G,IAAgB,KAAM,CACtB,MAAMC,EAAgB,KAAK,0BAA0BD,CAAW,EAChEC,GAAiB,KAAK,gBAAgBA,CAAa,CACvD,CACA,IAAKpH,EAAM,QAAUI,EAAa,QAAUA,EAAa,MAAQ,KAAK,eAClE,OACJ,MAAMmD,EAAU,CACZ,UAAWvD,EAAM,UACjB,QAASA,EAAM,QACf,QAASA,EAAM,QACf,OAAQ,EACR,OAAQ,EACR,YAAAmH,CAChB,EACY,KAAK,gBAAgB,KAAK5D,CAAO,EAEjC,KAAK,YAAY,cAAc,oBAAoB,cAAe8D,EAAe,CAAE,QAAS,GAAO,EACnG,KAAK,YAAY,cAAc,oBAAoB,YAAaC,CAAW,EAC3E,KAAK,YAAY,cAAc,iBAAiB,cAAeD,EAAe,CAAE,QAAS,GAAO,EAChG,KAAK,YAAY,cAAc,iBAAiB,YAAaC,CAAW,EACxE,KAAK,YAAc,GACnBC,EAAcvH,CAAK,CACvB,EACMqH,EAAiBrH,GAAU,CACzBA,EAAM,YACNA,EAAM,eAAc,EACxB,MAAMwH,EAAYxH,EAAM,UAClBuD,EAAU,KAAK,gBAAkB,KAAK,iBAAiBiE,CAAS,EACtE,GAAKjE,EAOL,IALAA,EAAQ,QAAUvD,EAAM,QACxBuD,EAAQ,QAAUvD,EAAM,QACxBuD,EAAQ,OAASvD,EAAM,UACvBuD,EAAQ,OAASvD,EAAM,UACvB,KAAK,OAAS,EACVA,EAAM,cAAgB,QACtB,OAAQ,KAAK,gBAAgB,OAAM,CAC/B,IAAK,GACD,KAAK,OAAS,KAAK,QAAQ,IAC3B,MACJ,IAAK,GACD,KAAK,OAAS,KAAK,QAAQ,IAC3B,MACJ,IAAK,GACD,KAAK,OAAS,KAAK,QAAQ,MAC3B,KACxB,MAGqB,CAAC,KAAK,aAAe,KAAK,gBAC3B,KAAK,cAAgBA,EAAM,QAAUI,EAAa,QAAUA,EAAa,QACzE,KAAK,OAAS,KAAK,OAAS,KAAK,aAAa,MAE9C,KAAK,cAAgBJ,EAAM,QAAUI,EAAa,UAAYA,EAAa,SAC3E,KAAK,OAAS,KAAK,OAAS,KAAK,aAAa,QAE9C,KAAK,cAAgBJ,EAAM,QAAUI,EAAa,SAAWA,EAAa,QAC1E,KAAK,OAAS,KAAK,OAAS,KAAK,aAAa,OAGtDqH,EAAQ,EACZ,EACMH,EAAetH,GAAU,CAC3B,MAAMuD,EAAU,KAAK,iBAAiBvD,EAAM,SAAS,EACrD,GAAI,EAAAuD,GAAWA,IAAY,KAAK,gBAGhC,IADAA,GAAW,KAAK,gBAAgBA,CAAO,EACnCvD,EAAM,cAAgB,QACtB,OAAQ,KAAK,gBAAgB,OAAM,CAC/B,IAAK,GACD,KAAK,OAASK,EAAO,KACrB,MACJ,IAAK,GACD,KAAK,OAAS,KAAK,QAAQ,IAC3B,MACJ,IAAK,GACD,KAAK,OAAS,KAAK,QAAQ,IAC3B,MACJ,IAAK,GACD,KAAK,OAAS,KAAK,QAAQ,MAC3B,KACxB,MAGgB,KAAK,OAASA,EAAO,KAEzBqH,EAAW,EACf,EACA,IAAIC,EAAsB,GAC1B,MAAMC,EAAgB5H,GAAU,CAG5B,GAFI,CAAC,KAAK,aAEN,CAAC,KAAK,UAAY,KAAK,aAAa,QAAUK,EAAO,KACrD,OACJ,GAAI,KAAK,iBAAiB,OAAS,GAC/B,KAAK,iBAAiB,MAAQ,GAC9B,KAAK,iBAAiB,QAAU,GAChC,KAAK,iBAAiB,SAAW,EAAG,CACpC,MAAM2G,EAAS,KAAK,YAAY,sBAAqB,EAC/CC,EAAOjH,EAAM,QAAUgH,EAAO,MAC9BE,EAAMlH,EAAM,QAAUgH,EAAO,OAEnC,GAAIC,EAAO,KAAK,iBAAiB,MAC7BA,EAAO,KAAK,iBAAiB,OAC7BC,EAAM,KAAK,iBAAiB,KAC5BA,EAAM,KAAK,iBAAiB,OAC5B,MACR,CAEA,GADAlH,EAAM,eAAc,EAChB,KAAK,eACL,KAAK,aAAa,QAAUK,EAAO,QACnC,KAAK,aAAa,QAAUA,EAAO,MAAO,CAC1C,MAAMwH,EAAM,YAAY,IAAG,EAEvBF,EAAsBE,EAAM,KAC5B,KAAK,eAAe,KAAK,YAAY,EACzCF,EAAsBE,CAC1B,CAEA,MAAMC,EAAe/D,GAAQ,GAAK,GAE5BoC,EAASnG,EAAM,YAAc,GAAKA,EAAM,QAAWA,EAAM,OAAS8H,EAAe9H,EAAM,QAAU8H,EAAe,IAChHltC,EAAI,KAAK,eAAiBolC,EAAM,QAAU,KAAK,aAAa,GAAK,KAAK,aAAa,MAAQ,EAAI,EAAI,EACnGnlC,EAAI,KAAK,eAAiBmlC,EAAM,QAAU,KAAK,aAAa,GAAK,KAAK,aAAa,OAAS,GAAK,EAAI,EAC3G,OAAQ,KAAK,aAAa,MAAK,CAC3B,KAAKK,EAAO,OAAQ,CAChB,KAAK,gBAAgBL,EAAM,OAAQA,EAAM,MAAM,EAC/C,KAAK,yBAA2B,GAChC,KACJ,CACA,KAAKK,EAAO,MAAO,CACf,KAAK,eAAeL,EAAM,OAAQA,EAAM,OAAQ,GAAO,EAAK,EAC5D,KAAK,wBAA0B,GAC/B,KACJ,CACA,KAAKK,EAAO,WAAY,CACpB,KAAK,eAAeL,EAAM,OAAQA,EAAM,OAAQ,GAAO,EAAI,EAC3D,KAAK,wBAA0B,GAC/B,KACJ,CACA,KAAKK,EAAO,OAAQ,CAChB,KAAK,eAAeL,EAAM,OAAQA,EAAM,OAAQ,GAAM,EAAK,EAC3D,KAAK,yBAA2B,GAChC,KACJ,CACA,KAAKK,EAAO,MAAO,CACf,KAAK,eAAe,CAAC8F,EAAOvrC,EAAGC,CAAC,EAChC,KAAK,wBAA0B,GAC/B,KACJ,CACA,KAAKwlC,EAAO,KAAM,CACd,KAAK,cAAc,CAAC8F,EAAOvrC,EAAGC,CAAC,EAC/B,KAAK,uBAAyB,GAC9B,KACJ,CAChB,CACY,KAAK,cAAc,CAAE,KAAM,SAAS,CAAE,CAC1C,EACMktC,EAAiB/H,GAAU,CAC7B,GAAI,GAAC,KAAK,aAAe,CAAC,KAAK,UAI/B,IAAI,KAAK,aAAa,QAAUuF,GAAe,OAAO,KAAM,CACxD,MAAMiC,EAAYxH,aAAiB,aAAeA,EAAM,UAAY,EAC9DuD,EAAU,KAAK,iBAAiBiE,CAAS,EAC/CjE,GAAW,KAAK,gBAAgBA,CAAO,EAEvC,KAAK,YAAY,cAAc,oBAAoB,cAAe8D,EAAe,CAAE,QAAS,GAAO,EACnG,KAAK,YAAY,cAAc,oBAAoB,YAAaC,CAAW,EAC3E,MACJ,CACAtH,EAAM,eAAc,EACxB,EACMuH,EAAiBvH,GAAU,CAC7B,GAAI,CAAC,KAAK,SACN,OAMJ,GALAqD,GAA4B,KAAK,gBAAiBe,EAAG,EACrD,KAAK,eAAe,KAAK,YAAY,EACrCwC,EAAkB,KAAKxC,EAAG,EAC1ByC,EAAiB,KAAKzC,EAAG,EACJ,KAAK,gBAAgB,QAAU,EAClC,CAEd,MAAM4D,EAAK5D,GAAI,EAAI,KAAK,gBAAgB,CAAC,EAAE,QACrC6D,EAAK7D,GAAI,EAAI,KAAK,gBAAgB,CAAC,EAAE,QACrCkC,EAAW,KAAK,KAAK0B,EAAKA,EAAKC,EAAKA,CAAE,EAC5CnB,EAAW,IAAI,EAAGR,CAAQ,EAE1B,MAAM1rC,GAAK,KAAK,gBAAgB,CAAC,EAAE,QAAU,KAAK,gBAAgB,CAAC,EAAE,SAAW,GAC1EC,GAAK,KAAK,gBAAgB,CAAC,EAAE,QAAU,KAAK,gBAAgB,CAAC,EAAE,SAAW,GAChFgsC,EAAiB,IAAIjsC,EAAGC,CAAC,CAC7B,CAEA,GADA,KAAK,OAAS,EACV,CAACmlC,EACG,KAAK,iBACL,KAAK,OAAS,KAAK,OAAS,KAAK,aAAa,cAE7C,gBAAiBA,GAASA,EAAM,cAAgB,QACrD,OAAQ,KAAK,gBAAgB,OAAM,CAC/B,IAAK,GACD,KAAK,OAAS,KAAK,QAAQ,IAC3B,MACJ,IAAK,GACD,KAAK,OAAS,KAAK,QAAQ,IAC3B,MACJ,IAAK,GACD,KAAK,OAAS,KAAK,QAAQ,MAC3B,KACxB,KAGoB,CAAC,KAAK,iBAAmBA,EAAM,QAAUI,EAAa,QAAUA,EAAa,OAC7E,KAAK,OAAS,KAAK,OAAS,KAAK,aAAa,OAE7CJ,EAAM,QAAUI,EAAa,UAAYA,EAAa,SACvD,KAAK,OAAS,KAAK,OAAS,KAAK,aAAa,SAE7CJ,EAAM,QAAUI,EAAa,SAAWA,EAAa,QACtD,KAAK,OAAS,KAAK,OAAS,KAAK,aAAa,SAKjD,KAAK,OAASC,EAAO,UAAYA,EAAO,SACxC,KAAK,OAASA,EAAO,gBAAkBA,EAAO,eAC9C,KAAK,OAASA,EAAO,sBAAwBA,EAAO,qBACpD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,qBACpD,KAAK,cAAc,MAAQ,KAAK,WAAW,MAC3C,KAAK,cAAc,IAAM,KAAK,WAAW,IACzC,KAAK,eAAe,MAAQ,EAC5B,KAAK,aAAa,MAAQ,KAGzB,KAAK,OAASA,EAAO,SAAWA,EAAO,QACvC,KAAK,OAASA,EAAO,cAAgBA,EAAO,aAC5C,KAAK,OAASA,EAAO,eAAiBA,EAAO,cAC7C,KAAK,OAASA,EAAO,oBAAsBA,EAAO,mBAClD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,oBACnD,KAAK,OAASA,EAAO,0BAA4BA,EAAO,yBACxD,KAAK,OAASA,EAAO,oBAAsBA,EAAO,mBAClD,KAAK,OAASA,EAAO,yBAA2BA,EAAO,0BACxD,KAAK,WAAW,KAAK,KAAK,OAAO,EACjC,KAAK,gBAAgB,IAAI,EAAG,EAAG,CAAC,KAG/B,KAAK,OAASA,EAAO,SAAWA,EAAO,QACvC,KAAK,OAASA,EAAO,eAAiBA,EAAO,cAC7C,KAAK,OAASA,EAAO,qBAAuBA,EAAO,oBACnD,KAAK,OAASA,EAAO,0BAA4BA,EAAO,yBACxD,KAAK,OAASA,EAAO,sBAAwBA,EAAO,qBACpD,KAAK,OAASA,EAAO,sBAAwBA,EAAO,sBACrD,KAAK,cAAc,OAAS,KAAK,WAAW,OAC5C,KAAK,gBAAgB,MAAQ,KAG5B,KAAK,OAASA,EAAO,QAAUA,EAAO,OACtC,KAAK,OAASA,EAAO,cAAgBA,EAAO,aAC5C,KAAK,OAASA,EAAO,oBAAsBA,EAAO,mBAClD,KAAK,OAASA,EAAO,yBAA2BA,EAAO,wBACvD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,oBACnD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,qBACpD,KAAK,SAAW,KAAK,MACrB,KAAK,cAAc,MAAQ,KAG1B,KAAK,OAASA,EAAO,UAAYA,EAAO,SACxC,KAAK,OAASA,EAAO,gBAAkBA,EAAO,eAC9C,KAAK,OAASA,EAAO,sBAAwBA,EAAO,qBACpD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,qBACpD,KAAK,gBAAgB,KAAK,KAAK,YAAY,EAC3C,KAAK,qBAAqB,IAAI,EAAG,EAAG,CAAC,GAEzC,KAAK,cAAc,CAAE,KAAM,cAAc,CAAE,CAC/C,EACMoH,EAAW,IAAM,CACnB,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,iBACxB,OACJ,KAAK,iBAAmB,GACxBpE,GAA4B,KAAK,gBAAiBe,EAAG,EAIrD,MAAM8D,EADsB,KAAK,aAAe,KAAK,YAAY,cAAc,qBAAuB,KAAK,YAC/D,KAAK,gBAAkB,KAAK,gBAAgB,CAAC,EAAI,KACvFvC,EAASuC,EAAgB,CAACA,EAAc,OAASrB,EAAiB,EAAIzC,GAAI,EAC1EwB,EAASsC,EAAgB,CAACA,EAAc,OAASrB,EAAiB,EAAIzC,GAAI,EAWhF,GAVAyC,EAAiB,KAAKzC,EAAG,IAEpB,KAAK,OAAS/D,EAAO,UAAYA,EAAO,SACxC,KAAK,OAASA,EAAO,gBAAkBA,EAAO,eAC9C,KAAK,OAASA,EAAO,sBAAwBA,EAAO,qBACpD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,qBACpD,KAAK,gBAAgBsF,EAAQC,CAAM,EACnC,KAAK,yBAA2B,KAG/B,KAAK,OAASvF,EAAO,SAAWA,EAAO,QACvC,KAAK,OAASA,EAAO,QAAUA,EAAO,KAAM,CAC7C,MAAM8H,EAAS,KAAK,eAAiBvB,EAAkB,EAAI,KAAK,aAAa,GAAK,KAAK,aAAa,MAAQ,EAAI,EAAI,EAC9GwB,EAAS,KAAK,eAAiBxB,EAAkB,EAAI,KAAK,aAAa,GAAK,KAAK,aAAa,OAAS,GAAK,EAAI,EAChHyB,EAAiB,KAAK,kBAAoB,GAAK,GAChD,KAAK,OAAShI,EAAO,SAAWA,EAAO,OACxC,KAAK,eAAegI,EAAiBzC,EAAS9B,GAAoBqE,EAAQC,CAAM,EAChF,KAAK,wBAA0B,KAG/B,KAAK,cAAcC,EAAiBzC,EAAS9B,GAAoBqE,EAAQC,CAAM,EAC/E,KAAK,uBAAyB,GAEtC,CAEA,IAAK,KAAK,OAAS/H,EAAO,eAAiBA,EAAO,cAC7C,KAAK,OAASA,EAAO,cAAgBA,EAAO,aAC5C,KAAK,OAASA,EAAO,qBAAuBA,EAAO,oBACnD,KAAK,OAASA,EAAO,oBAAsBA,EAAO,mBAClD,KAAK,OAASA,EAAO,0BAA4BA,EAAO,yBACxD,KAAK,OAASA,EAAO,yBAA2BA,EAAO,wBACvD,KAAK,OAASA,EAAO,sBAAwBA,EAAO,qBACpD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,oBACnD,KAAK,OAASA,EAAO,sBAAwBA,EAAO,qBACpD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,kBAAmB,CACvE,MAAM2H,EAAK5D,GAAI,EAAI,KAAK,gBAAgB,CAAC,EAAE,QACrC6D,EAAK7D,GAAI,EAAI,KAAK,gBAAgB,CAAC,EAAE,QACrCkC,EAAW,KAAK,KAAK0B,EAAKA,EAAKC,EAAKA,CAAE,EACtCK,EAAaxB,EAAW,EAAIR,EAClCQ,EAAW,IAAI,EAAGR,CAAQ,EAC1B,MAAM6B,EAAS,KAAK,eAAiBtB,EAAiB,EAAI,KAAK,aAAa,GAAK,KAAK,aAAa,MAAQ,EAAI,EAAI,EAC7GuB,EAAS,KAAK,eAAiBvB,EAAiB,EAAI,KAAK,aAAa,GAAK,KAAK,aAAa,OAAS,GAAK,EAAI,GAChH,KAAK,OAASxG,EAAO,eAAiBA,EAAO,cAC7C,KAAK,OAASA,EAAO,sBAAwBA,EAAO,qBACpD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,oBACnD,KAAK,OAASA,EAAO,0BAA4BA,EAAO,yBACxD,KAAK,OAASA,EAAO,sBAAwBA,EAAO,oBACrD,KAAK,eAAeiI,EAAaxE,GAAoBqE,EAAQC,CAAM,EACnE,KAAK,wBAA0B,KAG/B,KAAK,cAAcE,EAAaxE,GAAoBqE,EAAQC,CAAM,EAClE,KAAK,uBAAyB,GAEtC,GAEK,KAAK,OAAS/H,EAAO,SAAWA,EAAO,QACvC,KAAK,OAASA,EAAO,eAAiBA,EAAO,cAC7C,KAAK,OAASA,EAAO,qBAAuBA,EAAO,oBACnD,KAAK,OAASA,EAAO,oBAAsBA,EAAO,oBACnD,KAAK,eAAesF,EAAQC,EAAQ,GAAO,EAAK,EAChD,KAAK,wBAA0B,MAG9B,KAAK,OAASvF,EAAO,cAAgBA,EAAO,aAC5C,KAAK,OAASA,EAAO,oBAAsBA,EAAO,mBAClD,KAAK,OAASA,EAAO,0BAA4BA,EAAO,yBACxD,KAAK,OAASA,EAAO,yBAA2BA,EAAO,yBACxD,KAAK,eAAesF,EAAQC,EAAQ,GAAO,EAAI,EAC/C,KAAK,wBAA0B,MAG9B,KAAK,OAASvF,EAAO,UAAYA,EAAO,SACxC,KAAK,OAASA,EAAO,gBAAkBA,EAAO,eAC9C,KAAK,OAASA,EAAO,sBAAwBA,EAAO,qBACpD,KAAK,OAASA,EAAO,qBAAuBA,EAAO,qBACpD,KAAK,eAAesF,EAAQC,EAAQ,GAAM,EAAK,EAC/C,KAAK,yBAA2B,IAEpC,KAAK,cAAc,CAAE,KAAM,SAAS,CAAE,CAC1C,EACM8B,EAAc,IAAM,CACtBrE,GAA4B,KAAK,gBAAiBe,EAAG,EACrDyC,EAAiB,KAAKzC,EAAG,EACzB,KAAK,iBAAmB,IACpB,KAAK,gBAAgB,SAAW,GAC/B,KAAK,gBAAgB,SAAW,GAAK,KAAK,gBAAgB,CAAC,IAAM,KAAK,kBACvE,KAAK,YAAc,IAEnB,KAAK,gBAAgB,SAAW,GAAK,KAAK,cAE1C,KAAK,YAAY,cAAc,oBAAoB,cAAeiD,EAAe,CAAE,QAAS,GAAO,EACnG,KAAK,YAAY,cAAc,oBAAoB,YAAaC,CAAW,EAC3E,KAAK,cAAc,CAAE,KAAM,YAAY,CAAE,EAEjD,EACA,KAAK,YAAc,IAAM,CACjB,CAAC,KAAK,UAAY,CAAC,KAAK,cAE5B,KAAK,OAAM,EAEX,KAAK,eAAiB,CAClB,UAAW,GACX,QAAS,EACT,QAAS,EACT,OAAQ,EACR,OAAQ,EACR,YAAa,IAC7B,EACY,KAAK,gBAAgB,KAAK,KAAK,cAAc,EAE7C,KAAK,YAAY,cAAc,oBAAoB,cAAeD,EAAe,CAAE,QAAS,GAAO,EACnG,KAAK,YAAY,cAAc,oBAAoB,YAAaC,CAAW,EAC3E,KAAK,YAAY,mBAAkB,EACnC,KAAK,YAAY,cAAc,iBAAiB,oBAAqBiB,CAAmB,EACxF,KAAK,YAAY,cAAc,iBAAiB,mBAAoBC,CAAkB,EACtF,KAAK,YAAY,cAAc,iBAAiB,cAAenB,EAAe,CAAE,QAAS,GAAO,EAChG,KAAK,YAAY,cAAc,iBAAiB,YAAaC,CAAW,EACxEC,EAAa,EACjB,EACA,KAAK,cAAgB,IAAM,CACvB,IAAIzU,EAAI2V,EAAIC,EACR,KAAK,iBAAmB,OACxB,KAAK,gBAAgB,KAAK,cAAc,EACxC,KAAK,eAAiB,OAEzB5V,EAAK,KAAK,eAAiB,MAAQA,IAAO,QAAkBA,EAAG,cAAc,gBAAe,GAC5F2V,EAAK,KAAK,eAAiB,MAAQA,IAAO,QAAkBA,EAAG,cAAc,oBAAoB,oBAAqBF,CAAmB,GACzIG,EAAK,KAAK,eAAiB,MAAQA,IAAO,QAAkBA,EAAG,cAAc,oBAAoB,mBAAoBF,CAAkB,EACxI,KAAK,OAAM,CACf,EACA,MAAMD,EAAsB,IAAM,CACF,KAAK,aAAe,KAAK,YAAY,cAAc,qBAAuB,KAAK,aAEvG,KAAK,cAAa,CAC1B,EACMC,EAAqB,IAAM,CAC7B,KAAK,cAAa,CACtB,EACA,KAAK,sBAAyB9C,GAAe,CACzC,KAAK,YAAcA,EACnB,KAAK,YAAY,MAAM,YAAc,OACrC,KAAK,YAAY,MAAM,WAAa,OACpC,KAAK,YAAY,MAAM,iBAAmB,OAC1C,KAAK,YAAY,iBAAiB,cAAeqB,CAAa,EAC9D,KAAK,YAAY,iBAAiB,gBAAiBO,CAAW,EAC9D,KAAK,YAAY,iBAAiB,QAASM,EAAc,CAAE,QAAS,GAAO,EAC3E,KAAK,YAAY,iBAAiB,cAAeG,CAAa,CAClE,EACA,KAAK,yBAA2B,IAAM,CAC7B,KAAK,cAEV,KAAK,YAAY,MAAM,YAAc,GACrC,KAAK,YAAY,MAAM,WAAa,GACpC,KAAK,YAAY,MAAM,iBAAmB,GAC1C,KAAK,YAAY,oBAAoB,cAAehB,CAAa,EACjE,KAAK,YAAY,oBAAoB,gBAAiBO,CAAW,EAKjE,KAAK,YAAY,oBAAoB,QAASM,EAAc,CAAE,QAAS,GAAO,EAC9E,KAAK,YAAY,oBAAoB,cAAeG,CAAa,EAEjE,KAAK,YAAY,cAAc,oBAAoB,cAAeV,EAAe,CAAE,QAAS,GAAO,EACnG,KAAK,YAAY,cAAc,oBAAoB,YAAaC,CAAW,EAC3E,KAAK,YAAY,cAAc,oBAAoB,oBAAqBiB,CAAmB,EAC3F,KAAK,YAAY,cAAc,oBAAoB,mBAAoBC,CAAkB,EAC7F,EACA,KAAK,OAAS,IAAM,CACZ,KAAK,SAAWnI,EAAO,OAE3B,KAAK,OAASA,EAAO,KACrB,KAAK,gBAAgB,OAAS,EAC9BqH,EAAW,EACf,EACIhC,GACA,KAAK,QAAQA,CAAU,EAC3B,KAAK,OAAO,CAAC,CACjB,CAKA,IAAI,QAAS,CACT,OAAO,KAAK,OAChB,CACA,IAAI,OAAOxH,EAAQ,CACf,KAAK,QAAUA,EACf,KAAK,eAAc,EACnB,KAAK,QAAQ,uBAAsB,EACnC,KAAK,wBAAuB,EAC5B,KAAK,aAAe,EACxB,CAMA,IAAI,SAAU,CACV,OAAO,KAAK,QAChB,CACA,IAAI,QAAQyK,EAAS,CACjB,KAAK,SAAWA,EACX,KAAK,cAENA,GACA,KAAK,YAAY,MAAM,YAAc,OACrC,KAAK,YAAY,MAAM,WAAa,OACpC,KAAK,YAAY,MAAM,iBAAmB,SAG1C,KAAK,OAAM,EACX,KAAK,YAAY,MAAM,YAAc,GACrC,KAAK,YAAY,MAAM,WAAa,GACpC,KAAK,YAAY,MAAM,iBAAmB,IAElD,CAMA,IAAI,QAAS,CACT,MAAO,CAAC,KAAK,UACjB,CAMA,IAAI,eAAgB,CAChB,OAAO,KAAK,MAChB,CAKA,IAAI,UAAW,CACX,OAAO,KAAK,WAAW,MAC3B,CACA,IAAI,SAASrC,EAAU,CACf,KAAK,WAAW,SAAWA,GAC3B,KAAK,cAAc,SAAWA,IAElC,KAAK,WAAW,OAASA,EACzB,KAAK,cAAc,OAASA,EAC5B,KAAK,aAAe,GACxB,CAOA,IAAI,cAAe,CACf,OAAO,KAAK,WAAW,KAC3B,CACA,IAAI,aAAasC,EAAc,CACvB,KAAK,WAAW,QAAUA,GAC1B,KAAK,cAAc,QAAUA,IAEjC,KAAK,WAAW,MAAQA,EACxB,KAAK,cAAc,MAAQA,EAC3B,KAAK,aAAe,GACxB,CAMA,IAAI,YAAa,CACb,OAAO,KAAK,WAAW,GAC3B,CACA,IAAI,WAAWC,EAAY,CACnB,KAAK,WAAW,MAAQA,GACxB,KAAK,cAAc,MAAQA,IAE/B,KAAK,WAAW,IAAMA,EACtB,KAAK,cAAc,IAAMA,EACzB,KAAK,aAAe,GACxB,CAKA,IAAI,wBAAyB,CACzB,OAAO,KAAK,uBAChB,CACA,IAAI,uBAAuBC,EAAwB,CAC/C,KAAK,wBAA0BA,EAC/B,KAAK,aAAe,EACxB,CAOA,IAAI,gBAAgBC,EAAiB,CACjC,KAAK,iBAAiB,MAAQlI,GAAMkI,EAAgB,MAAO,EAAG,CAAC,EAC/D,KAAK,iBAAiB,OAASlI,GAAMkI,EAAgB,OAAQ,EAAG,CAAC,EACjE,KAAK,iBAAiB,EAAIlI,GAAMkI,EAAgB,EAAG,EAAG,EAAI,KAAK,iBAAiB,KAAK,EACrF,KAAK,iBAAiB,EAAIlI,GAAMkI,EAAgB,EAAG,EAAG,EAAI,KAAK,iBAAiB,MAAM,CAC1F,CA0BA,iBAAiBznC,EAAMoiC,EAAU,CAC7B,MAAM,iBAAiBpiC,EAAMoiC,CAAQ,CACzC,CAWA,oBAAoBpiC,EAAMoiC,EAAU,CAChC,MAAM,oBAAoBpiC,EAAMoiC,CAAQ,CAC5C,CASA,OAAOkF,EAAcC,EAAYG,EAAmB,GAAO,CACvD,OAAO,KAAK,SAAS,KAAK,cAAc,MAAQJ,EAAc,KAAK,cAAc,IAAMC,EAAYG,CAAgB,CACvH,CAYA,gBAAgBJ,EAAcI,EAAmB,GAAO,CACpD,OAAO,KAAK,SAASJ,EAAc,KAAK,cAAc,IAAKI,CAAgB,CAC/E,CAYA,cAAcH,EAAYG,EAAmB,GAAO,CAChD,OAAO,KAAK,SAAS,KAAK,cAAc,MAAOH,EAAYG,CAAgB,CAC/E,CAuCA,SAASJ,EAAcC,EAAYG,EAAmB,GAAO,CACzD,KAAK,yBAA2B,GAChC,MAAMtkB,EAAQmc,GAAM+H,EAAc,KAAK,gBAAiB,KAAK,eAAe,EACtEhgC,EAAMi4B,GAAMgI,EAAY,KAAK,cAAe,KAAK,aAAa,EACpE,KAAK,cAAc,MAAQnkB,EAC3B,KAAK,cAAc,IAAM9b,EACzB,KAAK,cAAc,SAAQ,EAC3B,KAAK,aAAe,GACfogC,IACD,KAAK,WAAW,MAAQ,KAAK,cAAc,MAC3C,KAAK,WAAW,IAAM,KAAK,cAAc,KAE7C,MAAMC,EAAqB,CAACD,GACxBhI,EAAa,KAAK,WAAW,MAAO,KAAK,cAAc,MAAO,KAAK,aAAa,GAC5EA,EAAa,KAAK,WAAW,IAAK,KAAK,cAAc,IAAK,KAAK,aAAa,EACpF,OAAO,KAAK,qBAAqBiI,CAAkB,CACvD,CAOA,MAAM3C,EAAU0C,EAAmB,GAAO,CACtC,OAAO,KAAK,QAAQ,KAAK,cAAc,OAAS1C,EAAU0C,CAAgB,CAC9E,CAOA,QAAQ1C,EAAU0C,EAAmB,GAAO,CACxC,YAAK,wBAA0B,GAC/B,KAAK,oBAAsB1I,GAAgB,KAC3C,KAAK,cAAgB,EACd,KAAK,gBAAgBO,GAAMyF,EAAU,KAAK,YAAa,KAAK,WAAW,EAAG0C,CAAgB,CACrG,CACA,gBAAgB1C,EAAU0C,EAAmB,GAAO,CAChD,MAAME,EAAa,KAAK,cAAc,OAEtC,GADoB,KAAK,eAAe,QAAU,EACjC,CACb,MAAMC,EAA6B,KAAK,eAAc,EAChDC,EAAapI,EAAamI,EAA4B,KAAK,WAAW,MAAM,EAElF,GAAI,EADcD,EAAa5C,IACb8C,EACd,OAAO,QAAQ,QAAO,EAC1B,KAAK,cAAc,OAAS,KAAK,IAAI9C,EAAU6C,CAA0B,CAC7E,MAEI,KAAK,cAAc,OAAS7C,EAEhC,KAAK,aAAe,GACf0C,IACD,KAAK,WAAW,OAAS,KAAK,cAAc,QAEhD,MAAMC,EAAqB,CAACD,GAAoBhI,EAAa,KAAK,WAAW,OAAQ,KAAK,cAAc,OAAQ,KAAK,aAAa,EAClI,OAAO,KAAK,qBAAqBiI,CAAkB,CACvD,CAQA,aAAa3C,EAAU0C,EAAmB,GAAO,CAC7C,KAAK,WAAW,IAAI,KAAK,oBAAoBxE,EAAgB,EAAE,eAAe8B,CAAQ,CAAC,EAClF0C,GACD,KAAK,QAAQ,KAAK,KAAK,UAAU,EAErC,MAAMC,EAAqB,CAACD,GACxBhI,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAC9DA,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAClEA,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,EAC1E,OAAO,KAAK,qBAAqBiI,CAAkB,CACvD,CAQA,KAAKI,EAAUL,EAAmB,GAAO,CACrC,OAAO,KAAK,OAAO,KAAK,SAAWK,EAAUL,CAAgB,CACjE,CAQA,OAAOrC,EAAMqC,EAAmB,GAAO,CACnC,KAAK,uBAAyB,GAC9B,KAAK,SAAWnI,GAAM8F,EAAM,KAAK,QAAS,KAAK,OAAO,EACtD,KAAK,aAAe,GACfqC,IACD,KAAK,MAAQ,KAAK,UAEtB,MAAMC,EAAqB,CAACD,GAAoBhI,EAAa,KAAK,MAAO,KAAK,SAAU,KAAK,aAAa,EAC1G,YAAK,aAAe,EACb,KAAK,qBAAqBiI,CAAkB,CACvD,CAKA,IAAIruC,EAAGC,EAAGmuC,EAAmB,GAAO,CAChC,eAAQ,KAAK,mCAAmC,EACzC,KAAK,MAAMpuC,EAAGC,EAAGmuC,CAAgB,CAC5C,CAQA,MAAMpuC,EAAGC,EAAGmuC,EAAmB,GAAO,CAClC,KAAK,QAAQ,aAAY,EACzBvE,GAAS,oBAAoB,KAAK,QAAQ,OAAQ,CAAC,EACnDC,GAAS,oBAAoB,KAAK,QAAQ,OAAQ,CAAC,EACnDD,GAAS,eAAe7pC,CAAC,EACzB8pC,GAAS,eAAe,CAAC7pC,CAAC,EAC1B,MAAMmS,EAASq3B,EAAK,KAAKI,EAAQ,EAAE,IAAIC,EAAQ,EACzCjwB,EAAK6vB,EAAK,KAAK,KAAK,UAAU,EAAE,IAAIt3B,CAAM,EAChD,OAAO,KAAK,OAAOyH,EAAG,EAAGA,EAAG,EAAGA,EAAG,EAAGu0B,CAAgB,CACzD,CAOA,QAAQ1C,EAAU0C,EAAmB,GAAO,CACxC3E,EAAK,oBAAoB,KAAK,QAAQ,OAAQ,CAAC,EAC/CA,EAAK,aAAa,KAAK,QAAQ,GAAIA,CAAI,EACvCA,EAAK,eAAeiC,CAAQ,EAC5B,MAAM7xB,EAAK6vB,EAAK,KAAK,KAAK,UAAU,EAAE,IAAID,CAAI,EAC9C,OAAO,KAAK,OAAO5vB,EAAG,EAAGA,EAAG,EAAGA,EAAG,EAAGu0B,CAAgB,CACzD,CAOA,QAAQM,EAAQN,EAAmB,GAAO,CACtC,OAAA3E,EAAK,KAAK,KAAK,QAAQ,EAAE,EAAE,eAAeiF,CAAM,EACzC,KAAK,OAAO,KAAK,WAAW,EAAIjF,EAAK,EAAG,KAAK,WAAW,EAAIA,EAAK,EAAG,KAAK,WAAW,EAAIA,EAAK,EAAG2E,CAAgB,CAC3H,CASA,OAAOpuC,EAAGC,EAAGC,EAAGkuC,EAAmB,GAAO,CACtC,KAAK,wBAA0B,GAC/B,MAAMh8B,EAASq3B,EAAK,IAAIzpC,EAAGC,EAAGC,CAAC,EAAE,IAAI,KAAK,UAAU,EACpD,KAAK,mBAAmB,KAAK,WAAYkS,EAAQ,KAAK,gBAAgB,EACtE,KAAK,aAAe,GACfg8B,GACD,KAAK,QAAQ,KAAK,KAAK,UAAU,EAErC,MAAMC,EAAqB,CAACD,GACxBhI,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAC9DA,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAClEA,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,EAC1E,OAAO,KAAK,qBAAqBiI,CAAkB,CACvD,CAUA,kBAAkBruC,EAAGC,EAAGC,EAAGkuC,EAAmB,GAAO,CAGjD,MAAMO,EAFQlF,EAAK,IAAIzpC,EAAGC,EAAGC,CAAC,EACN,IAAI,KAAK,UAAU,EAAE,UAAS,EAC3B,eAAe,CAAC,KAAK,cAAc,MAAM,EAAE,IAAI,KAAK,UAAU,EACzF,OAAO,KAAK,YAAYyuC,EAAS,EAAGA,EAAS,EAAGA,EAAS,EAAGP,CAAgB,CAChF,CAcA,SAASQ,EAAcR,EAAkB,CAAE,MAAAS,EAAQ,GAAO,YAAAC,EAAc,EAAG,aAAAC,EAAe,EAAG,cAAAC,EAAgB,EAAG,WAAAC,EAAa,CAAC,EAAK,GAAI,CACnI,MAAMhtC,EAAW,CAAA,EACXitC,EAAON,EAAa,OACpBxE,GAAO,KAAKwE,CAAY,EACxBxE,GAAO,cAAcwE,CAAY,EACnCM,EAAK,YACL,QAAQ,KAAK,qEAAqE,EAClF,QAAQ,QAAO,GAGnB,MAAMplB,EAAQuc,GAAY,KAAK,cAAc,MAAOP,EAAO,EACrD93B,EAAMq4B,GAAY,KAAK,cAAc,IAAKP,EAAO,EACvD7jC,EAAS,KAAK,KAAK,SAAS6nB,EAAO9b,EAAKogC,CAAgB,CAAC,EACzD,MAAMe,EAAS1F,EAAK,iBAAiB,KAAK,aAAa,EAAE,UAAS,EAC5D2F,EAAW7E,GAAa,mBAAmB4E,EAAQ5F,EAAO,EAC1D8F,EAAgBjJ,EAAa,KAAK,IAAI+I,EAAO,CAAC,EAAG,CAAC,EACpDE,GACAD,EAAS,SAAS5E,GAAa,iBAAiBlB,GAASxf,CAAK,CAAC,EAEnEslB,EAAS,SAAS,KAAK,oBAAoB,EAE3C,MAAME,EAAKjF,GAAO,UAAS,EAE3BX,EAAK,KAAKwF,EAAK,GAAG,EAAE,gBAAgBE,CAAQ,EAC5CE,EAAG,cAAc5F,CAAI,EAErBA,EAAK,KAAKwF,EAAK,GAAG,EAAE,KAAKA,EAAK,IAAI,CAAC,EAAE,gBAAgBE,CAAQ,EAC7DE,EAAG,cAAc5F,CAAI,EAErBA,EAAK,KAAKwF,EAAK,GAAG,EAAE,KAAKA,EAAK,IAAI,CAAC,EAAE,gBAAgBE,CAAQ,EAC7DE,EAAG,cAAc5F,CAAI,EAErBA,EAAK,KAAKwF,EAAK,GAAG,EAAE,KAAKA,EAAK,IAAI,CAAC,EAAE,gBAAgBE,CAAQ,EAC7DE,EAAG,cAAc5F,CAAI,EAErBA,EAAK,KAAKwF,EAAK,GAAG,EAAE,KAAKA,EAAK,IAAI,CAAC,EAAE,gBAAgBE,CAAQ,EAC7DE,EAAG,cAAc5F,CAAI,EAErBA,EAAK,KAAKwF,EAAK,GAAG,EAAE,KAAKA,EAAK,IAAI,CAAC,EAAE,gBAAgBE,CAAQ,EAC7DE,EAAG,cAAc5F,CAAI,EAErBA,EAAK,KAAKwF,EAAK,GAAG,EAAE,KAAKA,EAAK,IAAI,CAAC,EAAE,gBAAgBE,CAAQ,EAC7DE,EAAG,cAAc5F,CAAI,EAErBA,EAAK,KAAKwF,EAAK,GAAG,EAAE,gBAAgBE,CAAQ,EAC5CE,EAAG,cAAc5F,CAAI,EAErB4F,EAAG,IAAI,GAAKR,EACZQ,EAAG,IAAI,GAAKN,EACZM,EAAG,IAAI,GAAKP,EACZO,EAAG,IAAI,GAAKL,EACZG,EAAS,mBAAmB7F,GAAS4F,CAAM,EACvCE,GACAD,EAAS,YAAY5E,GAAa,QAAQ,EAE9C4E,EAAS,YAAY,KAAK,aAAa,EACvC,MAAMG,EAASD,EAAG,QAAQ7F,CAAI,EACxB+F,EAASF,EAAG,UAAU5F,CAAI,EAAE,gBAAgB0F,CAAQ,EAC1D,GAAIzJ,GAAoB,KAAK,OAAO,EAAG,CACnC,MAAM+F,EAAW,KAAK,oBAAoB6D,EAAO,EAAGA,EAAO,EAAGA,EAAO,EAAGV,CAAK,EAC7E5sC,EAAS,KAAK,KAAK,OAAOutC,EAAO,EAAGA,EAAO,EAAGA,EAAO,EAAGpB,CAAgB,CAAC,EACzEnsC,EAAS,KAAK,KAAK,QAAQypC,EAAU0C,CAAgB,CAAC,EACtDnsC,EAAS,KAAK,KAAK,eAAe,EAAG,EAAG,EAAGmsC,CAAgB,CAAC,CAChE,SACSxI,GAAqB,KAAK,OAAO,EAAG,CACzC,MAAMtC,EAAS,KAAK,QACdmM,EAAQnM,EAAO,MAAQA,EAAO,KAC9BoL,EAASpL,EAAO,IAAMA,EAAO,OAC7ByI,EAAO8C,EAAQ,KAAK,IAAIY,EAAQF,EAAO,EAAGb,EAASa,EAAO,CAAC,EAAI,KAAK,IAAIE,EAAQF,EAAO,EAAGb,EAASa,EAAO,CAAC,EACjHttC,EAAS,KAAK,KAAK,OAAOutC,EAAO,EAAGA,EAAO,EAAGA,EAAO,EAAGpB,CAAgB,CAAC,EACzEnsC,EAAS,KAAK,KAAK,OAAO8pC,EAAMqC,CAAgB,CAAC,EACjDnsC,EAAS,KAAK,KAAK,eAAe,EAAG,EAAG,EAAGmsC,CAAgB,CAAC,CAChE,CACA,OAAO,QAAQ,IAAInsC,CAAQ,CAC/B,CAOA,YAAYytC,EAActB,EAAkB,CACxC,MAAMnsC,EAAW,CAAA,EAEX0tC,EADa,eAAgBD,EAE/B/E,GAAe,qBAAqB+E,EAAcpF,EAAO,EACzDA,GAAQ,KAAKoF,CAAY,EAE7B,GADAztC,EAAS,KAAK,KAAK,OAAO0tC,EAAe,OAAO,EAAGA,EAAe,OAAO,EAAGA,EAAe,OAAO,EAAGvB,CAAgB,CAAC,EAClHzI,GAAoB,KAAK,OAAO,EAAG,CACnC,MAAMiK,EAAgB,KAAK,uBAAuBD,EAAe,MAAM,EACvE1tC,EAAS,KAAK,KAAK,QAAQ2tC,EAAexB,CAAgB,CAAC,CAC/D,SACSxI,GAAqB,KAAK,OAAO,EAAG,CACzC,MAAM6J,EAAQ,KAAK,QAAQ,MAAQ,KAAK,QAAQ,KAC1Cf,EAAS,KAAK,QAAQ,IAAM,KAAK,QAAQ,OACzCmB,EAAW,EAAIF,EAAe,OAC9B5D,EAAO,KAAK,IAAI0D,EAAQI,EAAUnB,EAASmB,CAAQ,EACzD5tC,EAAS,KAAK,KAAK,OAAO8pC,EAAMqC,CAAgB,CAAC,CACrD,CACA,OAAAnsC,EAAS,KAAK,KAAK,eAAe,EAAG,EAAG,EAAGmsC,CAAgB,CAAC,EACrD,QAAQ,IAAInsC,CAAQ,CAC/B,CAYA,UAAU6tC,EAAWC,EAAWC,EAAW5I,EAASC,EAASC,EAAS8G,EAAmB,GAAO,CAC5F,KAAK,yBAA2B,GAChC,KAAK,wBAA0B,GAC/B,KAAK,wBAA0B,GAC/B,KAAK,oBAAsB1I,GAAgB,KAC3C,KAAK,cAAgB,EACrB,MAAMiB,EAAS+C,EAAK,IAAItC,EAASC,EAASC,CAAO,EAC3CqH,EAAWlF,EAAK,IAAIqG,EAAWC,EAAWC,CAAS,EACzD,KAAK,WAAW,KAAKrJ,CAAM,EAC3B,KAAK,cAAc,eAAegI,EAAS,IAAIhI,CAAM,EAAE,gBAAgB,KAAK,aAAa,CAAC,EAC1F,KAAK,mBAAkB,EACvB,KAAK,aAAe,GACfyH,IACD,KAAK,QAAQ,KAAK,KAAK,UAAU,EACjC,KAAK,WAAW,KAAK,KAAK,aAAa,GAE3C,MAAMC,EAAqB,CAACD,GACxBhI,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAC9DA,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAClEA,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAClEA,EAAa,KAAK,WAAW,MAAO,KAAK,cAAc,MAAO,KAAK,aAAa,GAChFA,EAAa,KAAK,WAAW,IAAK,KAAK,cAAc,IAAK,KAAK,aAAa,GAC5EA,EAAa,KAAK,WAAW,OAAQ,KAAK,cAAc,OAAQ,KAAK,aAAa,EAC1F,OAAO,KAAK,qBAAqBiI,CAAkB,CACvD,CAmBA,WAAW4B,EAAYC,EAAYC,EAAYC,EAAUC,EAAUC,EAAUC,EAAYC,EAAYC,EAAYC,EAAUC,EAAUC,EAAUj5B,EAAGy2B,EAAmB,GAAO,CACxK,KAAK,yBAA2B,GAChC,KAAK,wBAA0B,GAC/B,KAAK,wBAA0B,GAC/B,KAAK,oBAAsB1I,GAAgB,KAC3C,KAAK,cAAgB,EACrB,MAAMmL,EAAUpH,EAAK,IAAI2G,EAAUC,EAAUC,CAAQ,EAC/CQ,EAAYpH,EAAK,IAAIuG,EAAYC,EAAYC,CAAU,EAC7DjG,GAAY,eAAe4G,EAAU,IAAID,CAAO,EAAE,gBAAgB,KAAK,aAAa,CAAC,EACrF,MAAME,EAAUpH,GAAK,IAAI+G,EAAUC,EAAUC,CAAQ,EAC/CI,EAAYtH,EAAK,IAAI6G,EAAYC,EAAYC,CAAU,EAC7DtG,GAAY,eAAe6G,EAAU,IAAID,CAAO,EAAE,gBAAgB,KAAK,aAAa,CAAC,EACrF,KAAK,WAAW,KAAKF,EAAQ,KAAKE,EAASp5B,CAAC,CAAC,EAC7C,MAAMs5B,EAAa9G,GAAY,MAAQD,GAAY,MAC7CgH,EAAW/G,GAAY,IAAMD,GAAY,IACzCiH,EAAchH,GAAY,OAASD,GAAY,OACrD,KAAK,cAAc,IAAIA,GAAY,OAASiH,EAAcx5B,EAAGuyB,GAAY,IAAMgH,EAAWv5B,EAAGuyB,GAAY,MAAQ+G,EAAat5B,CAAC,EAC/H,KAAK,mBAAkB,EACvB,KAAK,aAAe,GACfy2B,IACD,KAAK,QAAQ,KAAK,KAAK,UAAU,EACjC,KAAK,WAAW,KAAK,KAAK,aAAa,GAE3C,MAAMC,EAAqB,CAACD,GACxBhI,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAC9DA,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAClEA,EAAa,KAAK,QAAQ,EAAG,KAAK,WAAW,EAAG,KAAK,aAAa,GAClEA,EAAa,KAAK,WAAW,MAAO,KAAK,cAAc,MAAO,KAAK,aAAa,GAChFA,EAAa,KAAK,WAAW,IAAK,KAAK,cAAc,IAAK,KAAK,aAAa,GAC5EA,EAAa,KAAK,WAAW,OAAQ,KAAK,cAAc,OAAQ,KAAK,aAAa,EAC1F,OAAO,KAAK,qBAAqBiI,CAAkB,CACvD,CAUA,YAAYyB,EAAWC,EAAWC,EAAW5B,EAAmB,GAAO,CACnE,OAAO,KAAK,UAAU0B,EAAWC,EAAWC,EAAW,KAAK,WAAW,EAAG,KAAK,WAAW,EAAG,KAAK,WAAW,EAAG5B,CAAgB,CACpI,CAUA,UAAUhH,EAASC,EAASC,EAAS8G,EAAmB,GAAO,CAC3D,MAAMgD,EAAM,KAAK,YAAY3H,CAAI,EAC3B4H,EAAU,KAAK,UAAUD,EAAI,EAAGA,EAAI,EAAGA,EAAI,EAAGhK,EAASC,EAASC,EAAS8G,CAAgB,EAE/F,YAAK,cAAc,IAAMnI,GAAM,KAAK,cAAc,IAAK,KAAK,cAAe,KAAK,aAAa,EACtFoL,CACX,CASA,eAAerxC,EAAGC,EAAGC,EAAGkuC,EAAmB,GAAO,CAC9C,KAAK,yBAA2B,GAChC,KAAK,gBAAgB,IAAIpuC,EAAGC,EAAGC,CAAC,EAChC,KAAK,aAAe,GACfkuC,GACD,KAAK,aAAa,KAAK,KAAK,eAAe,EAC/C,MAAMC,EAAqB,CAACD,GACxBhI,EAAa,KAAK,aAAa,EAAG,KAAK,gBAAgB,EAAG,KAAK,aAAa,GACxEA,EAAa,KAAK,aAAa,EAAG,KAAK,gBAAgB,EAAG,KAAK,aAAa,GAC5EA,EAAa,KAAK,aAAa,EAAG,KAAK,gBAAgB,EAAG,KAAK,aAAa,EACpF,OAAO,KAAK,qBAAqBiI,CAAkB,CACvD,CASA,cAAcjH,EAASC,EAASC,EAAS,CACrC,KAAK,QAAQ,kBAAiB,EAC9BuC,GAAS,oBAAoB,KAAK,QAAQ,mBAAoB,CAAC,EAC/DC,GAAS,oBAAoB,KAAK,QAAQ,mBAAoB,CAAC,EAC/DC,GAAS,oBAAoB,KAAK,QAAQ,mBAAoB,CAAC,EAC/D,MAAM4E,EAAWlF,EAAK,IAAIrC,EAASC,EAASC,CAAO,EAC7CoE,EAAWiD,EAAS,WAAW,KAAK,QAAQ,QAAQ,EACpD2C,EAAgB3C,EAAS,IAAI,KAAK,QAAQ,QAAQ,EACxD9E,GAAS,eAAeyH,EAAc,CAAC,EACvCxH,GAAS,eAAewH,EAAc,CAAC,EACvCvH,GAAS,eAAeuH,EAAc,CAAC,EACvC7H,EAAK,KAAKI,EAAQ,EAAE,IAAIC,EAAQ,EAAE,IAAIC,EAAQ,EAC9CN,EAAK,EAAIA,EAAK,EAAIiC,EAClB,KAAK,QAAQA,EAAU,EAAK,EAC5B,KAAK,eAAe,CAACjC,EAAK,EAAGA,EAAK,EAAG,CAACA,EAAK,EAAG,EAAK,EACnD,KAAK,OAAOrC,EAASC,EAASC,EAAS,EAAK,CAChD,CAMA,YAAYiK,EAAM,CACd,GAAI,CAACA,EAAM,CACP,KAAK,UAAU,IAAI,IAAI,KAAW,KAAW,IAAS,EACtD,KAAK,UAAU,IAAI,IAAI,IAAU,IAAU,GAAQ,EACnD,KAAK,aAAe,GACpB,MACJ,CACA,KAAK,UAAU,KAAKA,CAAI,EACxB,KAAK,UAAU,WAAW,KAAK,WAAY,KAAK,UAAU,EAC1D,KAAK,aAAe,EACxB,CAUA,YAAYC,EAAavxC,EAAGwvC,EAAOf,EAAQ,CACvC,GAAI8C,IAAgB,KAAM,CACtB,KAAK,UAAY,KACjB,MACJ,CACA,KAAK,UAAY,KAAK,WAAa,IAAIpI,EAAM,QACzC,OAAOoI,GAAgB,SACvB,KAAK,UAAU,IAAIA,EAAavxC,EAAGwvC,EAAOf,CAAM,EAGhD,KAAK,UAAU,KAAK8C,CAAW,CAEvC,CASA,oBAAoB/B,EAAOf,EAAQ+C,EAAO5C,EAAQ,GAAO,CACrD,GAAIjG,GAAiC,KAAK,QAAS,qBAAqB,EACpE,OAAO,KAAK,WAAW,OAC3B,MAAM8I,EAAqBjC,EAAQf,EAC7BrD,EAAM,KAAK,QAAQ,gBAAe,EAAKrF,GACvC2L,EAAS,KAAK,QAAQ,OAE5B,QADqB9C,EAAQ6C,EAAqBC,EAASD,EAAqBC,GAAUjD,EAASe,EAAQkC,GACtF,GAAM,KAAK,IAAItG,EAAM,EAAG,EAAIoG,EAAQ,EAC7D,CAOA,uBAAuBG,EAAQ,CAC3B,GAAIhJ,GAAiC,KAAK,QAAS,wBAAwB,EACvE,OAAO,KAAK,WAAW,OAE3B,MAAMiJ,EAAO,KAAK,QAAQ,gBAAe,EAAK7L,GACxC8L,EAAO,KAAK,KAAK,KAAK,IAAID,EAAO,EAAG,EAAI,KAAK,QAAQ,MAAM,EAAI,EAC/DxG,EAAM,EAAI,KAAK,QAAQ,OAASwG,EAAOC,EAC7C,OAAOF,EAAU,KAAK,IAAIvG,EAAM,EAAG,CACvC,CAOA,UAAUjhC,EAAK2nC,EAAkB,GAAM,CAEnC,OADe3nC,GAAOA,EAAI,UAAYA,EAAM,IAAIg/B,EAAM,SAC1C,KAAK2I,EAAkB,KAAK,WAAa,KAAK,OAAO,CACrE,CAOA,YAAY3nC,EAAK2nC,EAAkB,GAAM,CAErC,OADe3nC,GAAOA,EAAI,UAAYA,EAAM,IAAIg/B,EAAM,SAC1C,iBAAiB2I,EAAkB,KAAK,cAAgB,KAAK,UAAU,EAAE,gBAAgB,KAAK,oBAAoB,EAAE,IAAIA,EAAkB,KAAK,WAAa,KAAK,OAAO,CACxL,CAOA,aAAa3nC,EAAK2nC,EAAkB,GAAM,CAEtC,OADa3nC,GAAO,IAAIg/B,EAAM,WAClB,KAAK2I,EAAkB,KAAK,cAAgB,KAAK,UAAU,CAC3E,CAOA,eAAe3nC,EAAK2nC,EAAkB,GAAM,CAExC,OADe3nC,GAAOA,EAAI,UAAYA,EAAM,IAAIg/B,EAAM,SAC1C,KAAK2I,EAAkB,KAAK,gBAAkB,KAAK,YAAY,CAC/E,CAKA,oBAAqB,CACjB,KAAK,cAAc,MAAQ,KAAK,cAAc,MAAQlM,GAClD,KAAK,cAAc,MAAQ,IAC3B,KAAK,cAAc,OAASA,IAChC,KAAK,WAAW,OAASA,GAAO,KAAK,OAAO,KAAK,cAAc,MAAQ,KAAK,WAAW,OAASA,EAAI,CACxG,CAIA,MAAO,CACH,KAAK,aAAa,KAAK,KAAK,eAAe,EAC3C,KAAK,QAAQ,KAAK,KAAK,UAAU,EACjC,KAAK,WAAW,KAAK,KAAK,aAAa,EACvC,KAAK,MAAQ,KAAK,QACtB,CAMA,MAAMuI,EAAmB,GAAO,CAC5B,GAAI,CAAChI,EAAa,KAAK,QAAQ,GAAG,EAAG,KAAK,WAAW,CAAC,GAClD,CAACA,EAAa,KAAK,QAAQ,GAAG,EAAG,KAAK,WAAW,CAAC,GAClD,CAACA,EAAa,KAAK,QAAQ,GAAG,EAAG,KAAK,WAAW,CAAC,EAAG,CACrD,KAAK,QAAQ,GAAG,KAAK,KAAK,UAAU,EACpC,MAAMuI,EAAW,KAAK,YAAYlF,CAAI,EACtC,KAAK,eAAc,EACnB,KAAK,YAAYkF,EAAS,EAAGA,EAAS,EAAGA,EAAS,CAAC,CACvD,CACA,MAAM1sC,EAAW,CACb,KAAK,UAAU,KAAK,WAAW,EAAG,KAAK,WAAW,EAAG,KAAK,WAAW,EAAG,KAAK,SAAS,EAAG,KAAK,SAAS,EAAG,KAAK,SAAS,EAAGmsC,CAAgB,EAC3I,KAAK,eAAe,KAAK,cAAc,EAAG,KAAK,cAAc,EAAG,KAAK,cAAc,EAAGA,CAAgB,EACtG,KAAK,OAAO,KAAK,OAAQA,CAAgB,CACrD,EACQ,OAAO,QAAQ,IAAInsC,CAAQ,CAC/B,CAKA,WAAY,CACR,KAAK,WAAW,KAAK,KAAK,QAAQ,EAAE,EACpC,KAAK,UAAU,KAAK,QAAQ,EAC5B,KAAK,YAAY,KAAK,UAAU,EAChC,KAAK,OAAS,KAAK,MACnB,KAAK,cAAc,KAAK,KAAK,YAAY,CAC7C,CAMA,gBAAiB,CACb,KAAK,cAAc,mBAAmB,KAAK,QAAQ,GAAIqnC,EAAO,EAC9D,KAAK,qBAAqB,KAAK,KAAK,aAAa,EAAE,OAAM,CAC7D,CAMA,eAAgB,CACZ,MAAM0I,EAAkBvI,EAAK,WAAW,KAAK,QAAS,KAAK,QAAQ,QAAQ,EAAE,UAAS,EAGhFwI,EAAOvI,EAAK,aAAasI,EAAiB,KAAK,QAAQ,EAAE,EAG/D,KAAK,QAAQ,GAAG,aAAaC,EAAMD,CAAe,EAAE,UAAS,EAC7D,KAAK,QAAQ,kBAAiB,EAC9B,MAAMrD,EAAW,KAAK,YAAYlF,CAAI,EACtC,KAAK,eAAc,EACnB,KAAK,YAAYkF,EAAS,EAAGA,EAAS,EAAGA,EAAS,CAAC,CACvD,CAQA,OAAOpD,EAAO,CACV,MAAM0F,EAAa,KAAK,cAAc,MAAQ,KAAK,WAAW,MACxDC,EAAW,KAAK,cAAc,IAAM,KAAK,WAAW,IACpDC,EAAc,KAAK,cAAc,OAAS,KAAK,WAAW,OAC1De,EAAclI,GAAa,WAAW,KAAK,WAAY,KAAK,OAAO,EACnEmI,EAAclI,GAAa,WAAW,KAAK,gBAAiB,KAAK,YAAY,EAC7EmI,EAAY,KAAK,SAAW,KAAK,MAEvC,GAAIlM,EAAW+K,CAAU,EACrB,KAAK,eAAe,MAAQ,EAC5B,KAAK,WAAW,MAAQ,KAAK,cAAc,UAE1C,CACD,MAAMpK,EAAa,KAAK,yBAA2B,KAAK,mBAAqB,KAAK,WAClF,KAAK,WAAW,MAAQJ,GAAW,KAAK,WAAW,MAAO,KAAK,cAAc,MAAO,KAAK,eAAgBI,EAAY,IAAU0E,CAAK,EACpI,KAAK,aAAe,EACxB,CAEA,GAAIrF,EAAWgL,CAAQ,EACnB,KAAK,aAAa,MAAQ,EAC1B,KAAK,WAAW,IAAM,KAAK,cAAc,QAExC,CACD,MAAMrK,EAAa,KAAK,yBAA2B,KAAK,mBAAqB,KAAK,WAClF,KAAK,WAAW,IAAMJ,GAAW,KAAK,WAAW,IAAK,KAAK,cAAc,IAAK,KAAK,aAAcI,EAAY,IAAU0E,CAAK,EAC5H,KAAK,aAAe,EACxB,CAEA,GAAIrF,EAAWiL,CAAW,EACtB,KAAK,gBAAgB,MAAQ,EAC7B,KAAK,WAAW,OAAS,KAAK,cAAc,WAE3C,CACD,MAAMtK,EAAa,KAAK,wBAA0B,KAAK,mBAAqB,KAAK,WACjF,KAAK,WAAW,OAASJ,GAAW,KAAK,WAAW,OAAQ,KAAK,cAAc,OAAQ,KAAK,gBAAiBI,EAAY,KAAK,SAAU0E,CAAK,EAC7I,KAAK,aAAe,EACxB,CAEA,GAAIrF,EAAWgM,EAAY,CAAC,GAAKhM,EAAWgM,EAAY,CAAC,GAAKhM,EAAWgM,EAAY,CAAC,EAClF,KAAK,gBAAgB,IAAI,EAAG,EAAG,CAAC,EAChC,KAAK,QAAQ,KAAK,KAAK,UAAU,MAEhC,CACD,MAAMrL,EAAa,KAAK,wBAA0B,KAAK,mBAAqB,KAAK,WACjFM,GAAe,KAAK,QAAS,KAAK,WAAY,KAAK,gBAAiBN,EAAY,KAAK,SAAU0E,EAAO,KAAK,OAAO,EAClH,KAAK,aAAe,EACxB,CAEA,GAAIrF,EAAWiM,EAAY,CAAC,GAAKjM,EAAWiM,EAAY,CAAC,GAAKjM,EAAWiM,EAAY,CAAC,EAClF,KAAK,qBAAqB,IAAI,EAAG,EAAG,CAAC,EACrC,KAAK,aAAa,KAAK,KAAK,eAAe,MAE1C,CACD,MAAMtL,EAAa,KAAK,yBAA2B,KAAK,mBAAqB,KAAK,WAClFM,GAAe,KAAK,aAAc,KAAK,gBAAiB,KAAK,qBAAsBN,EAAY,KAAK,SAAU0E,EAAO,KAAK,YAAY,EACtI,KAAK,aAAe,EACxB,CAEA,GAAIrF,EAAWkM,CAAS,EACpB,KAAK,cAAc,MAAQ,EAC3B,KAAK,MAAQ,KAAK,aAEjB,CACD,MAAMvL,EAAa,KAAK,uBAAyB,KAAK,mBAAqB,KAAK,WAChF,KAAK,MAAQJ,GAAW,KAAK,MAAO,KAAK,SAAU,KAAK,cAAeI,EAAY,IAAU0E,CAAK,CACtG,CACA,GAAI,KAAK,eACL,GAAI5F,GAAoB,KAAK,OAAO,GAAK,KAAK,gBAAkB,EAAG,CAC/D,MAAM0M,EAAqB,KAAK,WAAW,OAAS,KAAK,cACnD/O,EAAS,KAAK,QACd0O,EAAkB,KAAK,oBAAoBpI,EAAgB,EAC3D0I,EAAS7I,EAAK,KAAKuI,CAAe,EAAE,MAAM1O,EAAO,EAAE,EAAE,UAAS,EAChEgP,EAAO,SAAQ,IAAO,IACtBA,EAAO,EAAI,GACf,MAAMC,EAAS7I,EAAK,aAAa4I,EAAQN,CAAe,EAClDQ,EAAgB,KAAK,cAAc,OAAS,KAAK,IAAIlP,EAAO,kBAAoB0C,GAAU,EAAG,EAE7FyM,GADa,KAAK,cAAc,OAASJ,EACf,KAAK,cAAc,QAAU,KAAK,cAAc,OAC1EK,EAAS/I,GAAK,KAAK,KAAK,UAAU,EACnC,IAAI2I,EAAO,eAAe,KAAK,mBAAmB,EAAIE,EAAgBlP,EAAO,MAAM,CAAC,EACpF,IAAIiP,EAAO,eAAe,KAAK,mBAAmB,EAAIC,CAAa,CAAC,EACnEG,EAAelJ,EAAK,KAAK,KAAK,UAAU,EAAE,KAAKiJ,EAAQD,CAAS,EAChEG,EAAQ,KAAK,sBAAwBlN,GAAgB,IAAM,KAAK,WAAW,QAAU,KAAK,YAC1FmN,EAAQ,KAAK,sBAAwBnN,GAAgB,KAAO,KAAK,aAAe,KAAK,WAAW,OACtG,GAAI,KAAK,gBAAkBkN,GAASC,GAAQ,CACxC,KAAK,cAAc,QAAUR,EAC7B,KAAK,WAAW,QAAUA,EAC1B,MAAMS,EAAcpJ,EAAK,KAAKsI,CAAe,EAAE,eAAe,CAACK,CAAkB,EACjFM,EAAa,IAAIG,CAAW,CAChC,CAEA,KAAK,UAAU,WAAWH,EAAcA,CAAY,EACpD,MAAMI,EAAgBrJ,EAAK,WAAWiJ,EAAc,KAAK,UAAU,EACnE,KAAK,WAAW,KAAKA,CAAY,EACjC,KAAK,QAAQ,IAAII,CAAa,EAC9B,KAAK,eAAiBV,EAClBnM,EAAW,KAAK,aAAa,IAC7B,KAAK,cAAgB,EAC7B,SACSN,GAAqB,KAAK,OAAO,GAAK,KAAK,eAAiB,EAAG,CACpE,MAAMyM,EAAqB,KAAK,MAAQ,KAAK,UACvC/O,EAAS,KAAK,QACd0P,EAAsBvJ,EAAK,IAAI,KAAK,mBAAmB,EAAG,KAAK,mBAAmB,GAAInG,EAAO,KAAOA,EAAO,MAAQA,EAAO,KAAOA,EAAO,IAAI,EAAE,UAAUA,CAAM,EAC9J2P,EAAavJ,EAAK,IAAI,EAAG,EAAG,EAAE,EAAE,gBAAgBpG,EAAO,UAAU,EACjEoP,EAAS/I,GAAK,KAAKqJ,CAAmB,EAAE,IAAIC,EAAW,eAAe,CAACD,EAAoB,IAAI1P,EAAO,EAAE,CAAC,CAAC,EAE1GmP,EAAY,EADD,KAAK,MAAQJ,EACC,KAAK,OAAS,KAAK,MAI5CL,EAAkB,KAAK,oBAAoBpI,EAAgB,EAC3DsJ,EAAoB,KAAK,WAAW,IAAIlB,CAAe,EACvDW,EAAelJ,EAAK,KAAK,KAAK,UAAU,EAAE,KAAKiJ,EAAQD,CAAS,EAChEU,EAAmBR,EAAa,IAAIX,CAAe,EAEnDoB,EAAWpB,EAAgB,eAAemB,EAAmBD,CAAiB,EACpFP,EAAa,IAAIS,CAAQ,EAEzB,KAAK,UAAU,WAAWT,EAAcA,CAAY,EACpD,MAAMI,EAAgBrJ,EAAK,WAAWiJ,EAAc,KAAK,UAAU,EACnE,KAAK,WAAW,KAAKA,CAAY,EACjC,KAAK,QAAQ,IAAII,CAAa,EAE9B,KAAK,cAAgBV,EACjBnM,EAAW,KAAK,YAAY,IAC5B,KAAK,aAAe,EAC5B,EAEA,KAAK,QAAQ,OAAS,KAAK,QAC3B,KAAK,QAAQ,KAAO,KAAK,MACzB,KAAK,QAAQ,uBAAsB,EACnC,KAAK,wBAAuB,EAC5B,KAAK,aAAe,IAExB,KAAK,iBAAmB,GAExB,MAAMmN,EAAc,KAAK,eAAc,EACvC,KAAK,WAAW,OAAS,KAAK,IAAI,KAAK,WAAW,OAAQA,CAAW,EAErE,KAAK,WAAW,SAAQ,EACxB,KAAK,QAAQ,SAAS,iBAAiB,KAAK,UAAU,EAAE,gBAAgB,KAAK,oBAAoB,EAAE,IAAI,KAAK,OAAO,EACnH,KAAK,QAAQ,OAAO,KAAK,OAAO,GAEX,CAACnN,EAAW,KAAK,aAAa,CAAC,GAChD,CAACA,EAAW,KAAK,aAAa,CAAC,GAC/B,CAACA,EAAW,KAAK,aAAa,CAAC,KAE/B2D,GAAS,oBAAoB,KAAK,QAAQ,OAAQ,CAAC,EACnDC,GAAS,oBAAoB,KAAK,QAAQ,OAAQ,CAAC,EACnDC,GAAS,oBAAoB,KAAK,QAAQ,OAAQ,CAAC,EACnDF,GAAS,eAAe,KAAK,aAAa,CAAC,EAC3CC,GAAS,eAAe,CAAC,KAAK,aAAa,CAAC,EAC5CC,GAAS,eAAe,KAAK,aAAa,CAAC,EAC3CN,EAAK,KAAKI,EAAQ,EAAE,IAAIC,EAAQ,EAAE,IAAIC,EAAQ,EAC9C,KAAK,QAAQ,SAAS,IAAIN,CAAI,EAC9B,KAAK,QAAQ,kBAAiB,GAE9B,KAAK,yBACL,KAAK,mBAAmB,KAAK,QAAQ,SAAS,KAAK,KAAK,OAAO,EAAGA,EAAK,iBAAiB,KAAK,UAAU,EAAE,gBAAgB,KAAK,oBAAoB,EAAG,CAAG,EAE5J,MAAM6J,EAAU,KAAK,aACrB,OAAIA,GAAW,CAAC,KAAK,kBACjB,KAAK,WAAa,GAClB,KAAK,cAAc,CAAE,KAAM,MAAM,CAAE,EACnC,KAAK,cAAc,CAAE,KAAM,QAAQ,CAAE,GAEhCA,GACL,KAAK,cAAc,CAAE,KAAM,QAAQ,CAAE,EACjCpN,EAAW+K,EAAY,KAAK,aAAa,GACzC/K,EAAWgL,EAAU,KAAK,aAAa,GACvChL,EAAWiL,EAAa,KAAK,aAAa,GAC1CjL,EAAWgM,EAAY,EAAG,KAAK,aAAa,GAC5ChM,EAAWgM,EAAY,EAAG,KAAK,aAAa,GAC5ChM,EAAWgM,EAAY,EAAG,KAAK,aAAa,GAC5ChM,EAAWiM,EAAY,EAAG,KAAK,aAAa,GAC5CjM,EAAWiM,EAAY,EAAG,KAAK,aAAa,GAC5CjM,EAAWiM,EAAY,EAAG,KAAK,aAAa,GAC5CjM,EAAWkM,EAAW,KAAK,aAAa,GACxC,CAAC,KAAK,aACN,KAAK,WAAa,GAClB,KAAK,cAAc,CAAE,KAAM,MAAM,CAAE,IAGlC,CAACkB,GAAW,KAAK,kBACtB,KAAK,cAAc,CAAE,KAAM,OAAO,CAAE,EAExC,KAAK,cAAgB,KAAK,WAAW,OACrC,KAAK,UAAY,KAAK,MACtB,KAAK,iBAAmBA,EACxB,KAAK,aAAe,GACbA,CACX,CAKA,QAAS,CACL,OAAO,KAAK,UAAU,CAClB,QAAS,KAAK,SACd,YAAa,KAAK,YAClB,YAAa/M,GAAoB,KAAK,WAAW,EACjD,QAAS,KAAK,QACd,QAASA,GAAoB,KAAK,OAAO,EACzC,cAAe,KAAK,cACpB,cAAeA,GAAoB,KAAK,aAAa,EACrD,gBAAiBA,GAAoB,KAAK,eAAe,EACzD,gBAAiBA,GAAoB,KAAK,eAAe,EACzD,WAAY,KAAK,WACjB,mBAAoB,KAAK,mBACzB,WAAY,KAAK,WACjB,WAAY,KAAK,WACjB,cAAe,KAAK,cACpB,OAAQ,KAAK,WAAW,QAAO,EAC/B,SAAUkD,EAAK,iBAAiB,KAAK,aAAa,EAAE,IAAI,KAAK,UAAU,EAAE,QAAO,EAChF,KAAM,KAAK,SACX,YAAa,KAAK,gBAAgB,QAAO,EACzC,QAAS,KAAK,SAAS,QAAO,EAC9B,UAAW,KAAK,WAAW,QAAO,EAClC,MAAO,KAAK,OACZ,aAAc,KAAK,cAAc,QAAO,CACpD,CAAS,CACL,CAOA,SAAS32B,EAAMs7B,EAAmB,GAAO,CACrC,MAAMjpC,EAAM,KAAK,MAAM2N,CAAI,EAC3B,KAAK,QAAU3N,EAAI,QACnB,KAAK,YAAcA,EAAI,YACvB,KAAK,YAAcqhC,GAAoBrhC,EAAI,WAAW,EACtD,KAAK,QAAUA,EAAI,QACnB,KAAK,QAAUqhC,GAAoBrhC,EAAI,OAAO,EAC9C,KAAK,cAAgBA,EAAI,cACzB,KAAK,cAAgBqhC,GAAoBrhC,EAAI,aAAa,EAC1D,KAAK,gBAAkBqhC,GAAoBrhC,EAAI,eAAe,EAC9D,KAAK,gBAAkBqhC,GAAoBrhC,EAAI,eAAe,EAC9D,KAAK,WAAaA,EAAI,WACtB,KAAK,mBAAqBA,EAAI,mBAC9B,KAAK,WAAaA,EAAI,WACtB,KAAK,WAAaA,EAAI,WACtB,KAAK,cAAgBA,EAAI,cACzB,KAAK,SAAS,UAAUA,EAAI,OAAO,EACnC,KAAK,WAAW,UAAUA,EAAI,SAAS,EACvC,KAAK,OAASA,EAAI,MAClB,KAAK,cAAc,UAAUA,EAAI,YAAY,EAC7C,KAAK,OAAOA,EAAI,OAAO,CAAC,EAAGA,EAAI,OAAO,CAAC,EAAGA,EAAI,OAAO,CAAC,EAAGipC,CAAgB,EACzElE,GAAY,eAAeT,EAAK,UAAUtkC,EAAI,QAAQ,EAAE,IAAI,KAAK,UAAU,EAAE,gBAAgB,KAAK,aAAa,CAAC,EAChH,KAAK,SAAS+kC,GAAY,MAAOA,GAAY,IAAKkE,CAAgB,EAClE,KAAK,QAAQlE,GAAY,OAAQkE,CAAgB,EACjD,KAAK,OAAOjpC,EAAI,KAAMipC,CAAgB,EACtC,KAAK,eAAejpC,EAAI,YAAY,CAAC,EAAGA,EAAI,YAAY,CAAC,EAAGA,EAAI,YAAY,CAAC,EAAGipC,CAAgB,EAChG,KAAK,aAAe,EACxB,CAKA,QAAQtD,EAAY,CAChB,GAAI,KAAK,YAAa,CAClB,QAAQ,KAAK,uCAAuC,EACpD,MACJ,CACAA,EAAW,aAAa,+BAAgC7B,EAAO,EAC/D,KAAK,sBAAsB6B,CAAU,EACrC,KAAK,eAAe,KAAK,YAAY,CACzC,CAIA,YAAa,CACT,KAAK,OAAM,EACX,KAAK,yBAAwB,EACzB,KAAK,cACL,KAAK,YAAY,gBAAgB,8BAA8B,EAC/D,KAAK,YAAc,OAE3B,CAKA,SAAU,CAEN,KAAK,wBAAuB,EAE5B,KAAK,WAAU,CACnB,CAEA,oBAAoB1gC,EAAK,CAErB,OAAOA,EAAI,iBAAiB,KAAK,UAAU,EAAE,aAAa,KAAK,WAAW,MAAM,EAAE,gBAAgB,KAAK,oBAAoB,CAC/H,CAEA,oBAAoBA,EAAK,CACrB,OAAO,KAAK,oBAAoBA,CAAG,EAAE,OAAM,CAC/C,CACA,iBAAiBwiC,EAAW,CACxB,OAAO,KAAK,gBAAgB,KAAM2G,GAAkBA,EAAc,YAAc3G,CAAS,CAC7F,CACA,0BAA0BL,EAAa,CACnC,OAAO,KAAK,gBAAgB,KAAMgH,GAAkBA,EAAc,cAAgBhH,CAAW,CACjG,CACA,gBAAgB5D,EAAS,CACrB,KAAK,gBAAgB,OAAO,KAAK,gBAAgB,QAAQA,CAAO,EAAG,CAAC,CACxE,CACA,mBAAmBgG,EAAUv8B,EAAQohC,EAAU,CAC3C,MAAMC,EAAgBrhC,EAAO,SAAQ,EACrC,GAAIqhC,IAAkB,EAClB,OAAO9E,EAGX,MAAM+E,EAAYhK,EAAK,KAAKt3B,CAAM,EAAE,IAAIu8B,CAAQ,EAE1CgF,EADgB,KAAK,UAAU,WAAWD,EAAW/J,EAAI,EACtB,IAAI+J,CAAS,EAChDE,EAA4BD,EAAmB,WACrD,GAAIC,IAA8B,EAC9B,OAAOjF,EAAS,IAAIv8B,CAAM,EAEzB,GAAIwhC,IAA8BH,EACnC,OAAO9E,EAEN,GAAI6E,IAAa,EAClB,OAAO7E,EAAS,IAAIv8B,CAAM,EAAE,IAAIuhC,CAAkB,EAEjD,CACD,MAAME,EAAe,EAAML,EAAWI,EAA4BxhC,EAAO,IAAIuhC,CAAkB,EAC/F,OAAOhF,EACF,IAAIjF,EAAK,KAAKt3B,CAAM,EAAE,eAAeyhC,CAAY,CAAC,EAClD,IAAIF,EAAmB,eAAe,EAAMH,CAAQ,CAAC,CAC9D,CACJ,CACA,yBAA0B,CACtB,GAAI7N,GAAoB,KAAK,OAAO,EAAG,CACnC,MAAMrC,EAAS,KAAK,QACdwQ,EAAOxQ,EAAO,KACd+H,EAAM/H,EAAO,gBAAe,EAAK0C,GACjC+N,EAAa,KAAK,IAAI1I,EAAM,EAAG,EAAIyI,EACnCE,EAAYD,EAAazQ,EAAO,OACtC,KAAK,kBAAkB,CAAC,EAAE,IAAI,CAAC0Q,EAAW,CAACD,EAAY,CAAC,EACxD,KAAK,kBAAkB,CAAC,EAAE,IAAIC,EAAW,CAACD,EAAY,CAAC,EACvD,KAAK,kBAAkB,CAAC,EAAE,IAAIC,EAAWD,EAAY,CAAC,EACtD,KAAK,kBAAkB,CAAC,EAAE,IAAI,CAACC,EAAWD,EAAY,CAAC,CAC3D,SACSnO,GAAqB,KAAK,OAAO,EAAG,CACzC,MAAMtC,EAAS,KAAK,QACd2Q,EAAU,EAAI3Q,EAAO,KACrB+I,EAAO/I,EAAO,KAAO2Q,EACrBC,EAAQ5Q,EAAO,MAAQ2Q,EACvB3H,EAAMhJ,EAAO,IAAM2Q,EACnBE,EAAS7Q,EAAO,OAAS2Q,EAC/B,KAAK,kBAAkB,CAAC,EAAE,IAAI5H,EAAMC,EAAK,CAAC,EAC1C,KAAK,kBAAkB,CAAC,EAAE,IAAI4H,EAAO5H,EAAK,CAAC,EAC3C,KAAK,kBAAkB,CAAC,EAAE,IAAI4H,EAAOC,EAAQ,CAAC,EAC9C,KAAK,kBAAkB,CAAC,EAAE,IAAI9H,EAAM8H,EAAQ,CAAC,CACjD,CACJ,CAEA,gBAAiB,CACb,IAAIzI,EAAW,IAIf,GAFI,EADgB,KAAK,eAAe,QAAU,IAG9C9C,GAAiC,KAAK,QAAS,gBAAgB,EAC/D,OAAO8C,EACX,MAAM0I,EAAe,KAAK,oBAAoBxK,EAAgB,EAC9Da,GAAgB,OAAOpB,GAAS+K,EAAc,KAAK,QAAQ,EAAE,EAC7D,QAASr0C,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACxB,MAAMs0C,EAAkB3K,EAAK,KAAK,KAAK,kBAAkB3pC,CAAC,CAAC,EAC3Ds0C,EAAgB,aAAa5J,EAAe,EAC5C,MAAM3qC,EAAS6pC,GAAK,WAAW,KAAK,QAAS0K,CAAe,EAC5D3J,GAAW,IAAI5qC,EAAQs0C,CAAY,EACnC1J,GAAW,IAAM,KAAK,WAAW,OAAS,EAC1C,MAAMlO,EAAakO,GAAW,iBAAiB,KAAK,cAAc,EAC9DlO,EAAW,SAAW,GAAKA,EAAW,CAAC,EAAE,SAAWkP,IACpDA,EAAWlP,EAAW,CAAC,EAAE,SAEjC,CACA,OAAOkP,CACX,CAIA,eAAe/E,EAAQ,CACnB,GAAI,CAAC,KAAK,YACN,OACJ,MAAM2N,EAAO,KAAK,YAAY,sBAAqB,EACnD,OAAA3N,EAAO,EAAI2N,EAAK,KAChB3N,EAAO,EAAI2N,EAAK,IACZ,KAAK,WACL3N,EAAO,GAAK,KAAK,UAAU,EAC3BA,EAAO,GAAK2N,EAAK,OAAS,KAAK,UAAU,EAAI,KAAK,UAAU,EAC5D3N,EAAO,MAAQ,KAAK,UAAU,EAC9BA,EAAO,OAAS,KAAK,UAAU,IAG/BA,EAAO,MAAQ2N,EAAK,MACpB3N,EAAO,OAAS2N,EAAK,QAElB3N,CACX,CACA,qBAAqB0H,EAAoB,CACrC,OAAIA,EACO,QAAQ,QAAO,GAC1B,KAAK,WAAa,GAClB,KAAK,cAAc,CAAE,KAAM,iBAAiB,CAAE,EACvC,IAAI,QAASkG,GAAY,CAC5B,MAAMC,EAAY,IAAM,CACpB,KAAK,oBAAoB,OAAQA,CAAS,EAC1CD,EAAO,CACX,EACA,KAAK,iBAAiB,OAAQC,CAAS,CAC3C,CAAC,EACL,CAEA,sBAAsBC,EAAa,CAAE,CACrC,0BAA2B,CAAE,CAM7B,IAAI,eAAgB,CAChB,eAAQ,KAAK,0EAA0E,EAChF,CACX,CAMA,IAAI,cAAc5J,EAAG,CACjB,QAAQ,KAAK,0EAA0E,CAC3F,CAMA,IAAI,uBAAwB,CACxB,eAAQ,KAAK,0FAA0F,EAChG,CACX,CAMA,IAAI,sBAAsBA,EAAG,CACzB,QAAQ,KAAK,0FAA0F,CAC3G,CACA,OAAO,qBAAqB6J,EAAUtqC,EAAM,IAAIg/B,EAAM,OAAU,CAC5D,MAAMuG,EAAiBvlC,EACjBolC,EAASG,EAAe,OAC9BvF,GAAO,UAAS,EAEhBsK,EAAS,gBAAiBha,GAAW,CAC5BA,EAAO,QAEZ0P,GAAO,eAAe1P,CAAM,CAChC,CAAC,EACD0P,GAAO,UAAUoF,CAAM,EAEvB,IAAImF,EAAc,EAClB,OAAAD,EAAS,gBAAiBha,GAAW,CACjC,GAAI,CAACA,EAAO,OACR,OACJ,MAAMzC,EAAOyC,EACb,GAAI,CAACzC,EAAK,SACN,OACJ,MAAMD,EAAWC,EAAK,SAAS,MAAK,EACpCD,EAAS,aAAaC,EAAK,WAAW,EAEtC,MAAM0W,EADiB3W,EACS,WAAW,SAC3C,QAASj4B,EAAI,EAAG07B,EAAIkT,EAAS,MAAO5uC,EAAI07B,EAAG17B,IACvC0pC,EAAK,oBAAoBkF,EAAU5uC,CAAC,EACpC40C,EAAc,KAAK,IAAIA,EAAanF,EAAO,kBAAkB/F,CAAI,CAAC,CAE1E,CAAC,EACDkG,EAAe,OAAS,KAAK,KAAKgF,CAAW,EACtChF,CACX,CACJ,CCx/EA,MAAqBiF,EAAe,CAKzB,YAAYtR,EAAiBqD,EAAiBkO,EAAsB,CAJ3Dj4C,EAAA,eACAA,EAAA,oBACAA,EAAA,eAGZ,KAAK,OAAS0mC,EACd,KAAK,OAASqD,EACd,KAAK,YAAckO,CACvB,CACJ,CCFA,MAAMC,WAAgCC,EAAM,CASjC,YAAYC,EAAUC,EAAoCpyC,EAAoB,CACjF,MAAMmyC,EAAKnyC,EAAU,iBAAiB,EATnCjG,EAAA,eACCA,EAAA,kCACAA,EAAA,wBASJ,KAAK,OAASq4C,EACd,KAAK,gBAAkB,IAAIL,GAAe,IAAI/0C,EAAAA,QAAW,IAAIA,EAAAA,QAAW,IAAIA,EAAAA,OAAS,EAErF,KAAK,0BAA4B,KAAK,oBAAoB,KAAK,IAAI,EACnE,KAAK,SAAS,iBAAiB,sBAAuB,KAAK,yBAAyB,EAEpF,MAAM8uC,EAAW,KAAK,IAAI,UAAU,UAAU,EAC9CA,EAAS,MAAA,EACT,KAAK,aAAa,KAAKA,EAAS,IAAI,KAAK,gBAAgB,OAAQ,GAAG,CAAC,EACrE,KAAK,aAAa,KAAKA,EAAS,IAAI,KAAK,gBAAgB,OAAQ,GAAG,CAAC,EACrE,KAAK,aAAa,KAAKA,EAAS,IAAI,KAAK,gBAAgB,OAAQ,GAAG,CAAC,EAErE,MAAMhI,EAAS,KAAK,IAAI,UAAU,QAAQ,EAC1CA,EAAO,MAAA,EACP,KAAK,aAAa,KAAKA,EAAO,IAAI,KAAK,gBAAgB,OAAQ,GAAG,CAAC,EACnE,KAAK,aAAa,KAAKA,EAAO,IAAI,KAAK,gBAAgB,OAAQ,GAAG,CAAC,EACnE,KAAK,aAAa,KAAKA,EAAO,IAAI,KAAK,gBAAgB,OAAQ,GAAG,CAAC,EAEnE,MAAMkO,EAAc,KAAK,IAAI,UAAU,cAAc,EACrDA,EAAY,MAAA,EACZ,KAAK,aAAa,KAAKA,EAAY,IAAI,KAAK,gBAAgB,YAAa,GAAG,CAAC,EAC7E,KAAK,aAAa,KAAKA,EAAY,IAAI,KAAK,gBAAgB,YAAa,GAAG,CAAC,EAC7E,KAAK,aAAa,KAAKA,EAAY,IAAI,KAAK,gBAAgB,YAAa,GAAG,CAAC,CACjF,CAEgB,SAAgB,CAC5B,KAAK,SAAS,oBAAoB,sBAAuB,KAAK,yBAAyB,EACvF,MAAM,QAAA,CACV,CAEQ,qBAA4B,CAChC,KAAK,OAAO,kBAAkB,KAAK,eAAe,CACtD,CACJ,CCrBAlK,GAAe,QAAQ,CACnB,MAAO,CAAA,KACHjrC,EAAAA,KAAA,UACA+8B,EAAAA,UAAA,QACA7B,EAAAA,QAAA,WACAsa,EAAAA,WAAA,UACArZ,EAAAA,UAAA,OACAsZ,EAAAA,OAAA,UACAC,EAAAA,UAAA,QACA3a,EAAAA,QAAA,QACA56B,EAAAA,QAAA,QACAw1C,EAAAA,OAAA,CAER,CAAC,EAWD,MAAMC,GAAU,IAAIz1C,EAAAA,QAKpB,MAAM01C,WAAyBrV,EAAAA,eAA0C,CAiC9D,YAAYr9B,EAAoB+gC,EAAgB4R,EAAmC,CACtF,MAAA,EA3Ba54C,EAAA,kCACAA,EAAA,mCACTA,EAAA,yCACAA,EAAA,iCACAA,EAAA,qCACAA,EAAA,mCACAA,EAAA,mCACAA,EAAA,yCACAA,EAAA,uCACAA,EAAA,iCACSA,EAAA,eACAA,EAAA,uBACAA,EAAA,oBAAe64C,EAAAA,eAAA,GACf74C,EAAA,kBACAA,EAAA,uBACAA,EAAA,gBACAA,EAAA,uBAEAA,EAAA,cAAS84C,EAAAA,eAAA,GAUtB,KAAK,UAAY7yC,EACjB,KAAK,QAAU+gC,EACf,KAAK,eAAiB4R,EACtB,KAAK,eAAiB,IAAI7K,GACtB,KAAK,UAAU,KAAK,OACpB,KAAK,UAAU,UAAA,EAGnB,KAAK,yBAA2B,KAEhC,KAAK,wBAAA,EAEL,KAAK,eAAkBvF,GAAA,OACnB,QAAAlN,EAAA,KAAK,QAAQ,kBAAkB,KAAK,UAAWkN,EAAO,CAAC,IAAvD,YAAAlN,EAA0D,GAAG,KAAM,MAEvE,KAAK,OAAS,IAAIxB,QAIlB,KAAK,2BAA6B,KAAK,qBAAqB,KAAK,IAAI,EACrE,KAAK,0BAA4B,KAAK,oBAAoB,KAAK,IAAI,EACnE,KAAK,UAAU,iBAAiB,uBAAwB,KAAK,0BAA0B,EACvF,KAAK,UAAU,iBAAiB,sBAAuB,KAAK,yBAAyB,EAErF,KAAK,2BAA6B,KAClC,KAAK,+BAAiC,KACtC,KAAK,iCAAmC,KAExC,KAAK,OAAO,UAAU,CAAC,CAAE,KAAAqN,EAAM,KAAAp9B,KAAW,CACtC,OAAQA,EAAA,CACJ,IAAK,gBACI,KAAK,cAAco9B,EAAK,CAAC,CAAC,EAC/B,MACJ,IAAK,oBACD,KAAK,UAAUA,EAAK,CAAC,CAAC,EACtB,MACJ,IAAK,oBACD,KAAK,kBAAkBA,EAAK,CAAC,CAAC,EAC9B,KAAA,CAEZ,CAAC,EAED,MAAM4R,EAAY,KAAK,aAAa,aAAA,EAChCA,GAAa,MACb,KAAK,oBAAoBA,CAAS,EAEtC,KAAK,aAAa,UAAU,CAAC,CAAE,MAAA7R,EAAO,KAAAC,EAAM,KAAAp9B,KAAW,CACnDm9B,EAAM,IAAM,CACR,OAAQn9B,EAAA,CACJ,IAAK,eACD,KAAK,oBAAoBo9B,EAAK,CAAC,CAAC,EAChC,KAAA,CAEZ,CAAC,CACL,CAAC,CACL,CAzFA,IAAW,SAAmB,CAC1B,OAAO,KAAK,eAAe,OAC/B,CACA,IAAW,QAAQl+B,EAAY,CAC3B,KAAK,eAAe,QAAUA,CAClC,CAsFO,SAAgB,CACnB,KAAK,UAAU,oBAAoB,uBAAwB,KAAK,0BAA0B,EAC1F,KAAK,UAAU,oBAAoB,sBAAuB,KAAK,yBAAyB,EAExF,KAAK,sBAAA,EACL,KAAK,qBAAA,CACT,CAWO,mBAA6B+M,EAAwC,CACxE,KAAK,eAAe,OAAO,KAAK,OAAO,UAAU,EAGjD,MAAM3P,EAAM2P,EAAA,EAIZ,YAAK,eAAe,OAAO,KAAK,OAAO,UAAU,EAEjD,KAAK,eAAe,cAAc,CAAE,KAAM,SAAU,EAC7C3P,CACX,CAEO,kBAAkB0jC,EAAyC,CAC9D,MAAMiP,EAAW,KAAK,eAChBC,EACFlP,GAAU,IAAIiO,GAAe,IAAI/0C,UAAW,IAAIA,EAAAA,QAAW,IAAIA,EAAAA,OAAS,EAE5E,OAAA+1C,EAAS,YAAYC,EAAe,MAAM,EAC1CD,EAAS,UAAUC,EAAe,MAAM,EACxCD,EAAS,eAAeC,EAAe,WAAW,EAE3CA,CACX,CASO,QACH1wC,EACAipC,EAA4B,GAC5B7wC,EAAkB,CACd,cAAe,GACf,YAAa,GACb,aAAc,GACd,WAAY,EAAA,EAED,CACf,MAAMQ,EAAO,KAAK,OAAOoH,CAAG,EAC5B,OAAO,KAAK,mBAAmB,KACtB,KAAK,eAAe,eAAe,EAAG,EAAG,CAAC,EACxC,KAAK,eAAe,SAASpH,EAAMqwC,EAAkB7wC,CAAO,EACtE,CACL,CASA,MAAa,OACToxC,EACAmH,EACA1H,EAA4B,GACf,CACb,MAAM,KAAK,mBAAmB,UAGrB,KAAK,eAAe,eAAe,EAAG,EAAG,EAAG,EAAK,EAC/C,KAAK,eAAe,UACvBO,EAAS,EACTA,EAAS,EACTA,EAAS,EACTmH,EAAO,EACPA,EAAO,EACPA,EAAO,EACP1H,CAAA,EAEP,EACD,KAAK,eAAe,cAAc0H,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAC,CAClE,CACO,cAAc3wC,EAAiCipC,EAAmB,GAAqB,CAC1F,MAAMoB,EAAS,IAAI3vC,UACbk2C,EAAO,IAAIl2C,UACXm2C,EAAoB,IAAIn2C,EAAAA,QAAQ,EAAG,EAAG,CAAC,EAEvC9B,EAAO,KAAK,OAAOoH,CAAG,EAC5BpH,EAAK,IAAI,EAAIA,EAAK,IAAI,EACtBA,EAAK,UAAUyxC,CAAM,EACrBzxC,EAAK,QAAQg4C,CAAI,EAEjB,MAAMrK,EAAW,KAAK,eAAe,oBAAoBqK,EAAK,EAAGA,EAAK,EAAG,CAAC,EACpEF,EAAiBG,EAAkB,eAAetK,CAAQ,EAAE,IAAI8D,CAAM,EAG5E,OAAAqG,EAAe,GAAKE,EAAK,EAAI,GAC7BF,EAAe,GAAKE,EAAK,EAAI,GAEtB,KAAK,OAAOF,EAAgBrG,EAAQpB,CAAgB,CAC/D,CAEO,UAAUgD,EAA2B,CACnC,KAAK,mBAAmB,UACzB,KAAK,eAAe,cAAc,EAAG,EAAG,CAAC,EACpC,KAAK,eAAe,UACrBA,EAAI,OAAO,EACXA,EAAI,OAAO,EACXA,EAAI,OAAO,EACXA,EAAI,OAAO,EACXA,EAAI,OAAO,EACXA,EAAI,OAAO,EACX,EAAA,EAEC,KAAK,eAAe,eACrBA,EAAI,YAAY,EAChBA,EAAI,YAAY,EAChBA,EAAI,YAAY,EAChB,EAAA,EAEJ,KAAK,eAAe,OAAO,CAAC,EACrB,QAAQ,QAAA,EAClB,CACL,CAQO,mBAAmBpzC,EAAgBk5B,EAAW,IAAY,CAC7D,MAAM2e,EAAiB,IAAIh0C,GACvB7D,EAAO,IACPA,EAAO,KACPA,EAAO,MACPk5B,CAAA,EACF,UAAA,EACIsY,EAASxxC,EAAO,gBAAA,EACjB,KAAK,OAAO63C,EAAgBrG,EAAQ,EAAK,CAClD,CAEU,OAAOrqC,EAAuC,CAEpD,IAAIpH,EAAO,IAAI2B,OACf,GAAKyF,EAAa,OACdpH,EAAQoH,EAAa,MAAA,UACbA,EAAiB,WAAY,CACrC,MAAM8wC,EAAW9wC,EACX+wC,EAAaD,EAAS,eAAA,EACxBC,GAAc,CAACA,EAAW,UAC1Bn4C,EAAOm4C,EAAW,MAAA,EACX,WAAYD,IAEnBl4C,EAAQk4C,EAAS,OAAkB,OAAO,EAAG,GAAG,EAExD,SAAY9wC,EAAiB,WACzBpH,EAAK,cAAcoH,CAAe,MAElC,OAAM,IAAI,MAAM,qDAAqD,EAEzE,GAAIpH,EAAK,UACL,MAAM,IAAI,MAAM,uCAAuC,EAG3D,OAAAA,EAAK,IAAI,EAAI,KAAK,IAAIA,EAAK,IAAI,EAAG,CAAC,EACnCA,EAAK,IAAI,EAAI,KAAK,IAAIA,EAAK,IAAI,EAAG,GAAI,EAE/BA,CACX,CAEQ,uBAA8B,EAE9B,KAAK,4BACL,KAAK,gCACL,KAAK,oCAED,KAAK,4BACL,KAAK,UAAU,WAAW,oBACtB,QACA,KAAK,0BAAA,EAGb,KAAK,2BAA6B,KAE9B,KAAK,gCACL,KAAK,UAAU,WAAW,oBACtB,YACA,KAAK,8BAAA,EAGb,KAAK,+BAAiC,KAElC,KAAK,kCACL,KAAK,UAAU,WAAW,oBACtB,cACA,KAAK,gCAAA,EAGb,KAAK,iCAAmC,KAExC,KAAK,eAAe,UAAU,IAAI,EAClC,KAAK,UAAU,aAAA,EAEvB,CAEQ,sBAA6B,CACjC,KAAK,eAAe,UAAU,QAAQ,EACtC,KAAK,2BAA6B,KAAK,qBAAqB,KAAK,IAAI,EACrE,KAAK,+BAAiC,KAAK,yBAAyB,KAAK,IAAI,EAC7E,KAAK,iCAAmC,KAAK,2BAA2B,KAAK,IAAI,EAEjF,KAAK,UAAU,WAAW,iBACtB,YACA,KAAK,8BAAA,EAET,KAAK,UAAU,WAAW,iBAAiB,QAAS,KAAK,0BAA0B,EACnF,KAAK,UAAU,WAAW,iBACtB,cACA,KAAK,gCAAA,CAEb,CAEQ,sBAA6B,CACjC,KAAK,UAAU,WAAW,oBAAoB,UAAW,KAAK,wBAAwB,EAEtF,KAAK,UAAU,WAAW,oBAAoB,QAAS,KAAK,0BAA0B,EAEtF,KAAK,UAAU,WAAW,oBACtB,cACA,KAAK,gCAAA,EAET,KAAK,UAAU,WAAW,oBAAoB,UAAW,KAAK,4BAA4B,EAE1F,KAAK,eAAe,WAAA,CACxB,CAEQ,oBAAoB43C,EAAmC,CACvD,KAAK,0BACL,KAAK,yBAAyB,QAAA,EAG9BA,IACA,KAAK,yBAA2B,IAAIb,GAChCa,EAAU,IACV,KACA,KAAK,SAAA,EAETA,EAAU,SAAS,KAAK,wBAAwB,EAExD,CAEQ,yBAAgC,CACpC,KAAK,eAAe,cAAgB,GAEpC,KAAK,kBAAkB,KAAK,OAAO,kBAAA,CAAmB,EAGtD,KAAK,iCAAmC,KAAK,2BAA2B,KAAK,IAAI,EACjF,KAAK,6BAA+B,KAAK,uBAAuB,KAAK,IAAI,EACzE,KAAK,UAAU,WAAW,iBACtB,cACA,KAAK,gCAAA,EAET,KAAK,UAAU,WAAW,iBAAiB,UAAW,KAAK,4BAA4B,EAGvF,KAAK,2BAA6B,KAAK,qBAAqB,KAAK,IAAI,EACrE,KAAK,UAAU,WAAW,iBAAiB,QAAS,KAAK,0BAA0B,EAMnF,KAAK,eAAe,iBAAiB,SAAU,IAC3C,KAAK,UAAU,aAAa,KAAK,UAAU,KAAK,MAAM,CAAA,EAE1D,KAAK,eAAe,iBAAiB,UAAW,IAC5C,KAAK,UAAU,aAAa,KAAK,UAAU,KAAK,MAAM,CAAA,EAI1D,KAAK,eAAe,iBAAiB,UAAW,IAAM,EAC9C,KAAK,eAAe,QAAU,KAAK,eAAe,gBAAkB,KACpE,KAAK,cAAc,CAAE,KAAM,mBAAA,CAAqB,EAChD,KAAK,OAAO,qBAAqB,EAAI,EAE7C,CAAC,EACD,KAAK,eAAe,iBAAiB,aAAc,IAC/C,WAAW,IAAM,CACb,KAAK,OAAO,qBAAqB,EAAK,EACtC,KAAK,cAAc,CAAE,KAAM,iBAAA,CAAmB,CAClD,CAAC,CAAA,EAGL,KAAK,yBAA2B,KAAK,mBAAmB,KAAK,IAAI,EACjE,KAAK,UAAU,WAAW,iBAAiB,UAAW,KAAK,wBAAwB,CACvF,CAEQ,qBAA4B,CAEhC,KAAK,OAAO,mBACR,KAAK,kBAAA,EACL,KAAK,UAAU,KAAK,OAAO,QAAA,CAEnC,CAEQ,sBAA6B,CAEjC,MAAMpK,EAAQ,KAAK,OAAO,SAAA,EACC,KAAK,eAAe,OAAOA,CAAK,GAEvD,KAAK,UAAU,aAAa,KAAK,UAAU,KAAK,MAAM,CAE9D,CAEQ,qBAAqBx7B,EAAqB,CAC9C,MAAMomC,EAAS,KAAK,QAAQ,SAAS,KAAK,UAAWpmC,CAAC,EACtD,GAAIomC,EAAQ,CACR,KAAK,sBAAA,EAEL,MAAMrvC,EAAY,IAAIjH,UACtB,KAAK,UAAU,KAAK,OAAO,kBAAkBiH,CAAS,EACtDA,EAAU,UAAA,EAAY,UAAU,CAAC,EAEjC,MAAMsvC,EAAcD,EAAO,MAAM,MAAA,EACjCC,EAAY,GAAK,IAEjB,MAAM1C,EAAY0C,EAAY,MAAA,EAC9B1C,EAAU,IAAI5sC,CAAS,EACvB4sC,EAAU,EAAI0C,EAAY,EAErB,KAAK,OAAOA,EAAa1C,EAAW,EAAI,EAAE,QAAQ,IACnD,KAAK,OAAO,kBAAkB,cAAc,CAAA,CAEpD,CACJ,CAEQ,2BAA2B3jC,EAAqB,CACpD,KAAK,sBAAA,EACL,KAAK,OAAO,kBAAkB,OAAO,EACrCA,EAAE,eAAA,CACN,CAEQ,yBAAyBA,EAAqB,CAClD,MAAMomC,EAAS,KAAK,QAAQ,SAAS,KAAK,UAAWpmC,CAAC,EACtD,KAAK,UAAU,WAAW,MAAM,OAASomC,EAAS,OAAS,OAC3D,KAAK,eAAe,UAAUA,GAAU,KAAO,SAAW,IAAI,EAC1DA,GACA,KAAK,eAAe,kBAAkBA,EAAO,KAAK,EAEtD,KAAK,UAAU,aAAA,CACnB,CAEQ,2BAA2BpmC,EAAqB,CACpD,GAAI,KAAK,OAAO,kBAAA,IAAwB,QACpC,OAGJ,KAAK,eAAe,UAAU,OAAO,EACrC,MAAMomC,EAAS,KAAK,eAAepmC,CAAC,EACpC,GAAIomC,EACA,KAAK,eAAe,kBAAkBA,EAAO,KAAK,EAClD,KAAK,eAAe,cAAcA,EAAO,MAAM,EAAGA,EAAO,MAAM,EAAGA,EAAO,MAAM,CAAC,MAC7E,CAEH,MAAME,EAAiB,KAAK,eAAe,UAAUf,EAAO,EAC5D,KAAK,eAAe,kBAAkBe,CAAc,CACxD,CACJ,CAEQ,mBAAmBtmC,EAAwB,CAC/C,MAAMumC,EAAiB,KAAK,OAAO,kBAAA,EAEnC,GAAIA,IAAmB,kBAAmB,CAClCvmC,EAAE,OAAS,UACX,KAAK,OAAO,kBAAkB,OAAO,EAEzC,MACJ,CAEA,GAAIumC,IAAmB,SAAWA,IAAmB,eACjD,OAGJ,MAAMjxC,EAAO,CACT,aAAc,YACd,WAAY,YACZ,YAAa,aACb,SAAU,UACV,SAAU,OACV,SAAU,OACV,UAAW,OACX,OAAQ,MAAA,EAGZ,IAAIkxC,EAAmB,EACnB9I,EAAiB,EACjB+I,EAAkB,EAClBC,EAAkB,EAClBC,EAAS3mC,EAAE,SAAWA,EAAE,SAAWA,EAAE,SAAW,IAAM,GAO1D,OAJIumC,IAAmB,iBACnBI,GAAU,IAGN3mC,EAAE,KAAA,CACN,KAAK1K,EAAK,aACFixC,IAAmB,eACnB7I,EAAiB,GAEjB8I,EAAmB,GAEvB,MAEJ,KAAKlxC,EAAK,WAEV,KAAKA,EAAK,SACNmxC,EAAkB,GAClB,MAEJ,KAAKnxC,EAAK,YAEV,KAAKA,EAAK,UACNmxC,EAAkB,EAClB,MACJ,KAAKnxC,EAAK,SACFixC,IAAmB,eACnB7I,EAAiB,EAEjB8I,EAAmB,EAEvB,MAEJ,KAAKlxC,EAAK,SACNoxC,EAAkB,EAClB,MACJ,KAAKpxC,EAAK,OACNoxC,EAAkB,GAClB,KAEJ,CAGAF,GACK,KAAK,mBAAmB,IACzB,KAAK,eAAe,QAChBA,EAAmB,KAAK,eAAe,WAAaG,EACpD,EAAA,CACJ,EAGJjJ,GACK,KAAK,mBAAmB,IACzB,KAAK,eAAe,aAChBA,EAAiB,KAAK,eAAe,WAAaiJ,EAClD,EAAA,CACJ,EAGJF,GACK,KAAK,mBAAmB,IACzB,KAAK,eAAe,MAChBA,EAAkB,KAAK,eAAe,WAAaE,EACnD,EACA,EAAA,CACJ,EAGJD,GACK,KAAK,mBAAmB,IACzB,KAAK,eAAe,MAChB,EACAA,EAAkB,KAAK,eAAe,WAAaC,EACnD,EAAA,CACJ,CAGZ,CAEQ,wBAA+B,CAC/B,KAAK,OAAO,kBAAA,IAAwB,UAIxC,KAAK,eAAe,UAAU,IAAI,EAClC,KAAK,UAAU,aAAA,EACnB,CAEQ,sBAA6B,CAGjC,KAAK,eAAe,cAAc,CAAE,KAAM,eAAgB,EAC1D,WAAW,IAAM,KAAK,eAAe,cAAc,CAAE,KAAM,aAAc,EAAG,CAAC,CACjF,CAEQ,kBAAkB9hB,EAA4B,CAGlD,OAFA,KAAK,sBAAA,EAEGA,EAAA,CACJ,IAAK,WACD,KAAK,eAAe,QAAU,GAC9B,MACJ,IAAK,eACD,CACI,KAAK,eAAe,cAAgB,GAEpC,KAAK,eAAe,YAAc,EAClC,KAAK,eAAe,YAAc,EAElC,KAAK,eAAe,WAAa,GAEjC,KAAK,eAAe,mBAAqB,GACzC,KAAK,eAAe,iBAAmB,GAEvC,KAAK,eAAe,aAAa,KAAO+V,GAAe,OAAO,OAC9D,KAAK,eAAe,aAAa,MAAQA,GAAe,OAAO,MAC/D,KAAK,eAAe,aAAa,MAAQA,GAAe,OAAO,MAC/D,KAAK,eAAe,aAAa,OAASA,GAAe,OAAO,MAEhE,KAAK,eAAe,QAAU,GAG9B,MAAM7jC,EAAY,IAAIjH,UAChB8uC,EAAW,KAAK,UAAU,KAAK,OAAO,SAAS,MAAA,EAC/C+E,EAAY,IAAI7zC,UACtB,KAAK,UAAU,KAAK,OAAO,kBAAkBiH,CAAS,EAEtDA,EAAU,UAAA,EAAY,UAAU,CAAC,EACjC4sC,EAAU,KAAK/E,CAAQ,EAAE,IAAI7nC,CAAS,EACjC,KAAK,OAAO6nC,EAAU+E,EAAW,EAAK,CAC/C,CACA,MACJ,IAAK,QACD,CACI,KAAK,eAAe,cAAgB,GACpC,KAAK,eAAe,YAAc,EAClC,KAAK,eAAe,YAAc,IAClC,KAAK,eAAe,WAAa,EAEjC,KAAK,eAAe,mBAAqB,EACzC,KAAK,eAAe,iBAAmB,EAEvC,KAAK,eAAe,aAAa,KAAO/I,GAAe,OAAO,MAC9D,KAAK,eAAe,aAAa,MAAQA,GAAe,OAAO,OAC/D,KAAK,eAAe,aAAa,MAAQA,GAAe,OAAO,MAC/D,KAAK,eAAe,aAAa,OAASA,GAAe,OAAO,MAEhE,KAAK,eAAe,QAAU,GAG9B,MAAM7jC,EAAY,IAAIjH,UAChB8uC,EAAW,KAAK,UAAU,KAAK,OAAO,SAAS,MAAA,EACrD,KAAK,UAAU,KAAK,OAAO,kBAAkB7nC,CAAS,EAEtD,MAAM80B,EAAY,IAAIC,YACtBD,EAAU,OAAS,KAAK,UAAU,KAAK,OACvCA,EAAU,IAAI+S,EAAU7nC,CAAS,EACjC,MAAM01B,EAAaZ,EAAU,gBAAgB,KAAK,UAAU,KAAK,EAAE,GAAG,CAAC,EAEnEY,GACK,KAAK,OAAOmS,EAAUnS,EAAW,MAAO,EAAK,CAE1D,CACA,MACJ,IAAK,kBACD,KAAK,eAAe,QAAU,GAC9B,KAAK,qBAAA,EACL,MACJ,QAGI,OADgC5H,CAEpC,CAEJ,KAAK,UAAU,WAAW,MAAA,CAC9B,CACJ,CC5sBA,MAAM+hB,GAA0BxxC,GAC5ByxC,EAAAA,SAASzxC,CAAG,IACXA,EAAI,OAAS,cAAgBA,EAAI,OAAS,aAAeA,EAAI,OAAS,kBAErE0xC,GAAyB1xC,GAC3ByxC,EAAAA,SAASzxC,CAAG,GAAK,CAACwxC,GAAuBxxC,CAAG,EAEhD,MAAqB2xC,EAAe,CAUzB,YAAYj0C,EAAoBk0C,EAA4B,CATlDn6C,EAAA,sBAAwC,KACxCA,EAAA,qBAAuC,KACvCA,EAAA,kBACAA,EAAA,sBACAA,EAAA,kBAAqC,KACrCA,EAAA,sBAAiBolC,GAAA,GACjBplC,EAAA,qBAA2C,KAC3CA,EAAA,cAASo6C,EAAAA,gBAAA,GAGtB,KAAK,UAAYn0C,EACjB,KAAK,cAAgBk0C,EAErB,KAAK,OAAO,UAAU,CAAC,CAAE,MAAAjT,EAAO,KAAAC,EAAM,KAAAp9B,KAAW,CAC7Cm9B,EAAM,IAAM,CACR,OAAQn9B,EAAA,CACJ,IAAK,iBACI,KAAK,eAAeo9B,EAAK,CAAC,CAAC,EAChC,MACJ,IAAK,SACD,KAAK,cAAcA,EAAK,CAAC,CAAC,EAC1B,MACJ,IAAK,aACI,KAAK,oBAAoBA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC9C,MACJ,IAAK,aACI,KAAK,aAAaA,EAAK,CAAC,CAAC,EAC9B,MACJ,IAAK,aACI,KAAK,aAAaA,EAAK,CAAC,CAAC,EAC9B,KAAA,CAEZ,CAAC,CACL,CAAC,EAED,UAAWjjC,KAAW,KAAK,OAAO,YAAA,EAC1BA,EAAQ,SACH,KAAK,eAAeA,CAAO,CAG5C,CAEO,SAAgB,CAEvB,CAEA,MAAc,WAAWA,EAAwC,CAC7D,MAAMm2C,EAAM,KAAK,OAAO,eAAen2C,CAAO,EAC9C,GAAIm2C,GAAO,MAAQA,EAAI,QAAA,EACnB,OAGJ,MAAMlgC,EAAO,IAAImgC,GAAS,CACtB,MAAO,CACH,MAAO,IAAI34C,EAAAA,MAAM,QAAQ,EACzB,SAAU,GACV,aAAc,KAAK,aAAa,IAAI,CAAA,EAExC,MAAO,CACH,EAAG,GACH,EAAG,GACH,EAAG,EAAA,EAEP,OAAQ,CACJ,QAAS04C,EAAI,IAAI,EAAI,GACrB,OAAQh5C,GAAO,SAAS,KAAK,UAAU,aAAcg5C,CAAG,EAAE,WAAW,GAAI,EAAE,EAC3E,MAAOA,EAAI,IAAI,EAAI,EAAA,CACvB,CACH,EACDlgC,EAAK,KAAO,YAAYjW,EAAQ,IAAI,GACpC,MAAM,KAAK,UAAU,IAAIiW,CAAI,EAC7B,KAAK,WAAW,IAAIjW,EAAQ,KAAMiW,CAAI,CAC1C,CAEA,MAAc,WAAWjW,EAAwC,CAI7D,MAAMm2C,EAAM,KAAK,OAAO,eAAen2C,CAAO,EAC9C,GAAIm2C,GAAO,MAAQA,EAAI,QAAA,EACnB,OAIJA,EAAI,eAAe,IAAIp3C,EAAAA,QAAQ,GAAI,GAAI,CAAC,CAAC,EAEzC,MAAM1B,EAAU,IAAIg5C,GAAQ,CACxB,SAAU,IAAIC,GAAQ,CAClB,CACI,CAACH,EAAI,IAAI,EAAGA,EAAI,IAAI,CAAC,EACrB,CAACA,EAAI,IAAI,EAAGA,EAAI,IAAI,CAAC,EACrB,CAACA,EAAI,IAAI,EAAGA,EAAI,IAAI,CAAC,EACrB,CAACA,EAAI,IAAI,EAAGA,EAAI,IAAI,CAAC,EACrB,CAACA,EAAI,IAAI,EAAGA,EAAI,IAAI,CAAC,CAAA,CACzB,CACH,EACD,KAAM,cAAA,CACT,EAEKI,EAAO,IAAIC,GAAU,CACvB,KAAM,QAAQx2C,EAAQ,IAAI,GAC1B,OAAQ,IAAIy2C,GAAmB,CAC3B,KAAM,CAACp5C,CAAO,EACd,MAAO,IAAIq5C,GAAAA,MAAM,CACb,KAAM,IAAIC,GAAAA,KAAK,CAAE,MAAO,QAAS,CAAA,CACpC,CAAA,CACJ,CAAA,CACJ,EACDJ,EAAK,SAAWK,GAAAA,SAAS,SAGzB,MAAMC,EAAO,KAAK,UAAU,WAAWxyC,GAAOyyC,GAAAA,MAAMzyC,CAAG,CAAC,EACxD,UAAWrC,KAAO60C,EACd,MAAM70C,EAAI,SAASu0C,CAAI,EACvB,KAAK,UAAU,aAAav0C,CAAG,EAEnC,KAAK,OAAO,IAAIhC,EAAQ,KAAMu2C,CAAI,CACtC,CAEQ,cAAcv2C,EAA+B,CACjD,KAAK,WAAWA,CAAO,EACvB,KAAK,WAAWA,CAAO,EAEvB,MAAMjC,EAAS,KAAK,UAAU,IAAIiC,EAAQ,IAAI,EAC1CjC,IACA,KAAK,UAAU,OAAOA,CAAM,EAC5B,KAAK,UAAU,aAAA,GAGnB,MAAMg5C,EAAQ,KAAK,UAAU,IAAI/2C,EAAQ,IAAI,EACzC+2C,GACA,KAAK,cAAc,mBAAmBA,CAAK,EAG/C5X,GAAwB,cAAc,CAAE,KAAM,kBAAmB,MAAOn/B,EAAS,CACrF,CAEQ,WAAWA,EAA+B,CAC9C,MAAMiW,EAAO,KAAK,WAAW,IAAIjW,EAAQ,IAAI,EACzCiW,GACA,KAAK,UAAU,OAAOA,CAAI,EAE9B,KAAK,WAAW,OAAOjW,EAAQ,IAAI,CACvC,CAEQ,WAAWA,EAA+B,CAC9C,MAAMu2C,EAAO,KAAK,OAAO,IAAIv2C,EAAQ,IAAI,EACrCu2C,GACa,KAAK,UAAU,WAAWlyC,GAAOyyC,GAAAA,MAAMzyC,CAAG,CAAC,EACnD,QAAQrC,GAAO,CAChBA,EAAI,YAAYu0C,CAAI,EACpB,KAAK,UAAU,aAAav0C,CAAG,CACnC,CAAC,EAEL,KAAK,OAAO,OAAOhC,EAAQ,IAAI,CACnC,CAEA,MAAc,eAAe+gC,EAAoC,CAC7D,IAAI/gC,EACJ,MAAM6F,EAAOk7B,aAAgB,KAAOA,EAAK,KAAOA,EAChD,GAAI,CACA,KAAK,eAAe,KAAK,IAAIS,EAAa37B,EAAM,mBAAmB,CAAC,EACpE,MAAMmxC,EAAW,MAAMrZ,GAAO,WAAWoD,EAAMlhC,EAAAA,WAAW,EAC1DG,EAAU,KAAK,OAAO,IAAIg3C,CAAQ,EAClC,KAAK,eAAe,KAChB,IAAIxV,EAAaxhC,EAAQ,KAAM,+BAAgC,SAAS,CAAA,CAEhF,OAASiP,EAAG,CACR,QAAQ,MAAMA,CAAC,EACf,KAAK,eAAe,KAAK,IAAIuyB,EAAa37B,EAAOoJ,EAAY,QAAS,OAAO,CAAC,EAC9E,MACJ,CAEA,GAAI,CACAjP,EAAQ,aAAe,GACvB,MAAM,KAAK,eAAeA,CAAO,EACjC,KAAK,eAAe,KAChB,IAAIwhC,EAAaxhC,EAAQ,KAAM,qBAAsB,SAAS,CAAA,CAEtE,MAAa,CAEb,CAEAm/B,GAAwB,cAAc,CAAE,KAAM,gBAAiB,MAAOn/B,EAAS,CACnF,CAEQ,mBAAmBA,EAAyBjC,EAAwB,CACxEiC,EAAQ,YAAc,GACtBA,EAAQ,aAAe,GAEnBA,EAAQ,mBACRA,EAAQ,kBAAkBA,EAASjC,CAAM,EAG7C,KAAK,OAAO,aAAaiC,EAASjC,CAAM,CAC5C,CAEQ,0BAA0BiC,EAAyB+2C,EAA2B,CAClF/2C,EAAQ,YAAc,GACtBA,EAAQ,aAAe,GAEvB,KAAK,OAAO,YAAYA,EAAS+2C,CAAK,CAC1C,CAEA,MAAc,aAAa/2C,EAAwC,CAC3D,KAAK,WAAW,IAAIA,EAAQ,IAAI,EAChC,KAAK,WAAWA,CAAO,EAEvB,MAAM,KAAK,WAAWA,CAAO,CAErC,CAEA,MAAc,aAAaA,EAAwC,CAC3D,KAAK,OAAO,IAAIA,EAAQ,IAAI,EAC5B,KAAK,WAAWA,CAAO,EAEvB,MAAM,KAAK,WAAWA,CAAO,CAErC,CAEA,MAAc,oBACVA,EACAi3C,EACa,CACb,GAAI,CACAj3C,EAAQ,QAAUi3C,EACd,CAACj3C,EAAQ,aAAei3C,GACxB,MAAM,KAAK,eAAej3C,CAAO,EAErC,MAAM,KAAK,cAAcA,CAAO,EAC5Bk3C,EAAAA,UAAU,QAAQl3C,CAAO,GACzBA,EAAQ,SAAS,QAAQmhB,GAAM,KAAK,KAAK,oBAAoBA,EAAI81B,CAAa,CAAC,CAEvF,MAAa,CACTj3C,EAAQ,QAAU,EACtB,CAEAm/B,GAAwB,cAAc,CAClC,KAAM,6BACN,MAAOn/B,CAAA,CACV,CACL,CAEA,MAAc,eAAeA,EAAkD,CAC3E,GAAIA,EAAQ,YACR,OAAO,QAAQ,QAAQA,CAAO,EAGlC,GAAIk3C,EAAAA,UAAU,QAAQl3C,CAAO,EACzB,OAAAA,EAAQ,YAAc,GACf,QAAQ,QAAQA,CAAO,EAGlCA,EAAQ,aAAe,GAEvB,GAAI,CACA,GAAI61C,GAAuB71C,CAAO,EAAG,CACjC,MAAM+2C,EAAQ,MAAMI,EAAAA,aAAa,gBAAgB,KAAK,UAAWn3C,CAAO,EAExE+2C,EAAM,QAAU/2C,EAAQ,QACxB,KAAK,UAAU,IAAIA,EAAQ,KAAM+2C,CAAK,EAEtC,MAAM,KAAK,cAAc,gBAAgBA,CAAK,EAC9C,KAAK,0BAA0B/2C,EAAS+2C,CAAK,CACjD,SAAWhB,GAAsB/1C,CAAO,EAAG,CACvC,MAAMjC,EAAS,MAAM++B,GAAc,UAAU,KAAK,UAAW98B,CAAO,EAEpEjC,EAAO,QAAUiC,EAAQ,QACzB,KAAK,UAAU,IAAIA,EAAQ,KAAMjC,CAAM,EAEvC,MAAM,KAAK,UAAU,IAAIA,CAAM,EAC/B,KAAK,mBAAmBiC,EAASjC,CAAM,CAC3C,KACI,OAAM,IAAI,MAAM,0CAA0C,CAElE,OAASkR,EAAG,CACR,cAAQ,MAAM,yBAA0BjP,EAASiP,CAAC,EAClDjP,EAAQ,aAAe,GACvB,KAAK,eAAe,KAChB,IAAIwhC,EACAxhC,EAAQ,KACR,4BAA6BiP,EAAY,OAAO,GAChD,OAAA,CACJ,EAEEA,CACV,CAEA,OAAOjP,CACX,CAEA,MAAc,cAAcA,EAAwC,CAChE,MAAMjC,EAAS,KAAK,UAAU,IAAIiC,EAAQ,IAAI,EAC1CjC,IACAA,EAAO,QAAUiC,EAAQ,QAErBA,EAAQ,SACR,qBAAsBA,EAAQ,QAC9BA,EAAQ,OAAO,mBAAqB,GAEpC,MAAM,KAAK,WAAWA,CAAO,EACtB,CAACA,EAAQ,SAAW,KAAK,OAAO,IAAIA,EAAQ,IAAI,GACvD,KAAK,WAAWA,CAAO,EAE3B,KAAK,UAAU,aAAajC,CAAM,GAGtC,MAAMg5C,EAAQ,KAAK,UAAU,IAAI/2C,EAAQ,IAAI,EACzC+2C,IACAA,EAAM,QAAU/2C,EAAQ,QACxB,KAAK,cAAc,OAAO+2C,CAAK,EAEvC,CACJ,CCtVA,MAAqBK,EAAY,CAKtB,YAAYtU,EAAgB,CAJ3BhnC,EAAA,0BACSA,EAAA,gBACAA,EAAA,mBAGb,KAAK,QAAUgnC,EAEf,KAAK,WAAa,IAAI/H,YACtB,KAAK,kBAAoB,IAC7B,CAEO,OAAc,CACb,KAAK,oBACL,KAAK,kBAAkB,SAAS,OAAO,KAAK,iBAAiB,EAC7D,KAAK,kBAAoB,KAEjC,CAEO,SAAgB,CACnB,KAAK,MAAA,CACT,CAEO,oBAA4C,OAC/C,OAAO3D,EAAA,KAAK,oBAAL,YAAAA,EAAwB,OACnC,CAEO,QAAQr1B,EAAoBuiC,EAAyB,OACxD,MAAM+Q,GAASje,EAAA,KAAK,QAAQ,kBAAkBr1B,EAAUuiC,EAAO,EAAG,GAAK,CAAC+S,GAAAA,QAAQ,CAAC,CAAC,IAAnE,YAAAjgB,EAAsE,GAAG,GAExF,GAAIie,GAAUA,EAAO,OAAQ,CACzB,MAAM/mC,EAAI+mC,EAAO,OAAO,MAAA,EACxB/mC,EAAE,mBAAmB+mC,EAAO,OAAO,WAAW,EAC9C/mC,EAAE,UAAA,EAEF,KAAK,WAAW,OAASvM,EAAS,KAAK,OACvC,KAAK,WAAW,IAAIszC,EAAO,MAAO/mC,CAAC,EAEnC,MAAMotB,EAAa,KAAK,WACnB,gBAAgB35B,EAAS,MAAO,EAAI,EACpC,OACG9C,GACIA,EAAE,SAAW,MACbA,EAAE,OAAO,SAAS,eAAiB,KAAK,iBAAA,EAE/C,GAAG,CAAC,EAELy8B,IACK,KAAK,oBACN,KAAK,kBAAoB,IAAI4b,YACxBv1C,EAAS,IAAI,KAAK,iBAAiB,GAE5C,KAAK,kBAAkB,QAAU,GACjC,KAAK,kBAAkB,UAAU,CAACszC,EAAO,MAAO3Z,EAAW,KAAK,CAAC,EACjE35B,EAAS,aAAa,KAAK,iBAAiB,EAEpD,CACJ,CACJ,CC7DO,MAAMw1C,GAAsBjY,GAAAA,YAAY,cAAe,IAAM,CAChE,MAAMkY,EAAehY,EAAAA,SAAoB,EAAE,EACrCiY,EAAkB/X,EAAAA,IAAqB,OAAO,EAC9CC,EAAQC,EAAAA,SAAS,IAAM4X,EAAa,MAAM,EAC1CE,EAAmBhY,EAAAA,IAAa,EAAK,EAE3C,SAASiY,GAA2B,CAChC,OAAOD,EAAiB,KAC5B,CAEA,SAASE,EAAmBh2C,EAAsB,CAC9C81C,EAAiB,MAAQ91C,CAC7B,CAEA,SAASi2C,GAAsC,CAC3C,OAAOJ,EAAgB,KAC3B,CAEA,SAASK,EAAmBhkB,EAA6B,CACrD2jB,EAAgB,MAAQ3jB,CAC5B,CAEA,SAASikB,GAAyB,CAC9B,OAAOP,CACX,CAEA,SAASlX,EAAO0X,EAAwB,CACpCR,EAAa,OAAOA,EAAa,QAAQQ,CAAO,EAAG,CAAC,CACxD,CAEA,SAAS7pC,EAAI6pC,EAAwB,CACjCR,EAAa,KAAKQ,CAAO,CAC7B,CAEA,SAASC,EAAWpyC,EAAuB,CACvC,OAAO2xC,EAAa,KAAKznB,GAAKA,EAAE,QAAUlqB,CAAI,CAClD,CAGA,SAASqyC,EAAkBnX,EAAkB,CAE7C,CAGA,SAASoX,EAAmBlX,EAAqB,CAEjD,CAEA,SAASzyB,GAAc,CAAC,CAExB,SAASnO,GAAY,CAAC,CAEtB,MAAO,CACH,IAAA8N,EACA,MAAAwxB,EACA,IAAAt/B,EACA,mBAAAw3C,EACA,YAAAE,EACA,WAAAE,EACA,kBAAAC,EACA,mBAAAC,EACA,gBAAAR,EACA,OAAArX,EACA,mBAAAsX,EACA,mBAAAE,EACA,MAAAtpC,CAAA,CAER,CAAC,EC7DD,MAAqB40B,WAAgBhE,EAAAA,eAAiC,CAwB3D,YAAYiC,EAAezH,EAAmBr8B,EAAqB,CAAA,EAAI,CAC1E,MAAA,EAxBGzB,EAAA,mBACSA,EAAA,cACAA,EAAA,aAiBRA,EAAA,gBAEAA,EAAA,iBAKJ,KAAK,MAAQulC,EACb,KAAK,SAAW,GAChB,KAAK,QAAUzH,EACf,KAAK,WAAar8B,EAClB,KAAK,KAAOo+B,EAAAA,UAAU,aAAA,CAC1B,CA5BA,IAAW,QAAoB,CAC3B,OAAO,KAAK,OAChB,CACA,IAAW,OAAOt3B,EAAgB,CAC9B,KAAK,QAAUA,CACnB,CAEA,IAAW,SAAmB,CAC1B,OAAO,KAAK,QAChB,CAEA,IAAW,QAAQU,EAAY,CAC3B,KAAK,SAAWA,EAChB,KAAK,cAAc,CAAE,KAAM,SAAA,CAAW,CAC1C,CAgBA,OAAc,aAAaqzC,EAAgD,CAGvE,MAAO,CACH,SAHaA,EAAS,IAAIJ,GAAWA,EAAQ,WAAW,EAIxD,KAAM,oBAGN,GAAI,GAAG1W,EAAAA,SAAS,WAAA,CAAY,IAAI3F,EAAAA,UAAU,cAAc,GACxD,WAAY,CACR,QAAS,SACT,UAAW,CACP,MAAO,SACP,IAAK2F,EAAAA,SAAS,WAAA,CAAW,EAE7B,KAAM,KACN,MAAO,CACH,CACI,KAAM,oDACN,IAAK,UACL,MAAO,wDAAA,CACX,EAEJ,MAAO,kBACP,QAAS,IAAI,KAAA,EAAO,YAAA,CAAY,CACpC,CAER,CAEO,WAA6B,CAehC,MAdgB,CACZ,SAAU,CACN,YAAa,CAAC,KAAK,OAAO,KAAK,UAAW,KAAK,OAAO,GAAG,SAAS,EAClE,KAAM,YAAA,EAEV,GAAI,GAAGA,WAAS,YAAY,IAAI,KAAK,IAAI,GACzC,WAAY,CACR,GAAG,KAAK,WACR,MAAO,KAAK,MACZ,QAAS,IAAI,KAAA,EAAO,YAAA,CAAY,EAEpC,KAAM,SAAA,CAId,CACJ,CC9EA,SAASU,GAAYC,EAAqC,CACtD,OAAO,OAAO,OAAO,eAAgBA,CAAY,CACrD,CAEA,MAAqBoW,EAAmB,CAa7B,YAAYt2C,EAAoBygC,EAA0BM,EAAgB,CAZhEhnC,EAAA,sBACAA,EAAA,uBACAA,EAAA,oBACAA,EAAA,sBACAA,EAAA,0BACAA,EAAA,gBACAA,EAAA,kBACAA,EAAA,qBACAA,EAAA,0BAAqBolC,GAAA,GAC9BplC,EAAA,eAAU,IACDA,EAAA,cAASy7C,GAAA,GAGtB,KAAK,UAAYx1C,EACjB,KAAK,aAAe,IAAIq1C,GAAYtU,CAAM,EAC1C,KAAK,QAAUN,EAEf,KAAK,YAAc,IAAY,CAC3B,KAAK,QAAU,EACnB,EACA,KAAK,cAAgB,IAAY,CAC7B,KAAK,QAAU,EACnB,EACA,KAAK,QAAQ,iBAAiB,oBAAqB,KAAK,WAAW,EACnE,KAAK,QAAQ,iBAAiB,kBAAmB,KAAK,aAAa,EAEnE,KAAK,eAAiB,KAAK,SAAS,KAAK,IAAI,EAC7C,SAAS,iBAAiB,UAAW,KAAK,cAAc,EAExD,KAAK,OAAO,UAAU,CAAC,CAAE,MAAAQ,EAAO,KAAAC,EAAM,KAAAp9B,KAAW,CAC7Cm9B,EAAM,IAAM,CACR,OAAQn9B,EAAA,CACJ,IAAK,MACD,KAAK,cAAA,EACL,MACJ,IAAK,oBACI,KAAK,kBAAkBo9B,EAAK,CAAC,CAAC,EACnC,MACJ,IAAK,qBACI,KAAK,mBAAmBA,EAAK,CAAC,CAAC,EACpC,MACJ,IAAK,SACD,KAAK,cAAcA,EAAK,CAAC,CAAC,EAC1B,MACJ,IAAK,QACD,KAAK,eAAA,EACL,KAAA,CAEZ,CAAC,CACL,CAAC,EAED,KAAK,cAAgB,KAAK,QAAQ,KAAK,IAAI,EAC3C,KAAK,kBAAoB,KAAK,YAAY,KAAK,IAAI,EACnD,KAAK,UAAU,WAAW,iBAAiB,YAAa,KAAK,aAAa,EAC1E,KAAK,UAAU,WAAW,iBAAiB,QAAS,KAAK,iBAAiB,CAC9E,CAEO,SAAgB,CACnB,KAAK,UAAU,WAAW,oBAAoB,YAAa,KAAK,aAAa,EAC7E,KAAK,UAAU,WAAW,oBAAoB,QAAS,KAAK,iBAAiB,EAE7E,KAAK,QAAQ,oBAAoB,oBAAqB,KAAK,WAAW,EACtE,KAAK,QAAQ,oBAAoB,kBAAmB,KAAK,aAAa,EAEtE,SAAS,oBAAoB,UAAW,KAAK,cAAc,EAE3D,KAAK,aAAa,QAAA,CACtB,CAEO,gBAAuB,CAC1B,KAAK,OAAO,mBAAmB,EAAI,CACvC,CAEO,eAAsB,CACzB,KAAK,OAAO,mBAAmB,EAAK,EACpC,KAAK,aAAa,MAAA,EAClB,KAAK,UAAU,aAAA,CACnB,CAEO,cAAc+U,EAAwB,CACzCA,EAAQ,OAAO,QAAUA,EAAQ,QACjCA,EAAQ,OAAO,SAAS/1C,GAAMA,EAAE,QAAU+1C,EAAQ,OAAQ,EAC1D,KAAK,UAAU,aAAA,CACnB,CAEQ,cAAcA,EAAwB,CAC1C,KAAK,UAAU,OAAOA,EAAQ,MAAM,EACpC,KAAK,UAAU,aAAA,CACnB,CAEA,MAAc,WACVjX,EACA0C,EACkD,CAClD,MAAMQ,EAAM,MAAMlD,EAAK,KAAA,EACjBQ,EAAU,KAAK,MAAM0C,CAAG,EAExBzO,EAAW+L,EAAQ,OAAS,oBAAsBA,EAAQ,SAAW,CAACA,CAAO,EAEnF,IAAIoC,EAAa,EACbC,EAAY,EAEhB,UAAWvmC,KAAWm4B,EACD,MAAM,KAAK,cAAcn4B,EAASomC,CAAS,EAExDE,IAEAC,IAGR,MAAO,CAAE,WAAAD,EAAY,UAAAC,CAAA,CACzB,CAEA,MAAc,cACVvmC,EACAomC,EACgB,OAChB,GAAIpmC,EAAQ,SAAS,OAAS,aAC1B,MAAM,IAAI,MAAM,+BAA+BA,EAAQ,SAAS,IAAI,EAAE,EAU1E,IAPIA,EAAQ,YAAc,MAAQ,OAAOA,EAAQ,YAAe,YAC5DA,EAAQ,WAAa,CAAA,GAErBA,EAAQ,WAAW,OAAS,OAC5BA,EAAQ,WAAW,MAAQs+B,EAAAA,UAAU,aAAA,GAGrC8H,EAAU,IAAIpmC,EAAQ,WAAW,KAAK,EACtC,MAAO,GAGX,MAAMyb,EAAO,IAAI/Z,UAAQ,GAAG1B,EAAQ,SAAS,YAAY,CAAC,CAAC,EACrD0b,EAAK,IAAIha,UAAQ,GAAG1B,EAAQ,SAAS,YAAY,CAAC,CAAC,EAEnD,EAAI,IAAIi6C,YACd,SAAE,UAAU,CAACx+B,EAAMC,CAAE,CAAC,EACtB,MAAM,KAAK,gBAAeqe,EAAA/5B,EAAQ,aAAR,YAAA+5B,EAAoB,MAAO,EAAG/5B,EAAQ,UAAU,EAEnE,EACX,CAEA,MAAc,kBAAkB0jC,EAA2B,CACvD,MAAMuX,EAAmB,IAAI,IAAI,KAAK,OAAO,cAAc,IAAIvoB,GAAKA,EAAE,KAAK,CAAC,EAC5E,GAAI,CACA,KAAM,CAAE,WAAA4T,EAAY,UAAAC,CAAA,EAAc,MAAM,KAAK,WAAW7C,EAAMuX,CAAgB,EAC9E,KAAK,mBAAmB,KACpB,IAAI9W,EACA,WACA,GAAGmC,CAAU,uBAAuBC,CAAS,YAC7C,SAAA,CACJ,CAER,MAAqB,CAGrB,CACJ,CAEA,MAAc,mBAAmB3C,EAA8B,CAC3D,MAAM9/B,EAAW,CAAA,EACjB,IAAI0iC,EAAkB,EAClBC,EAAiB,EACrB,MAAMC,EAAmB,CAAA,EAEnBuU,EAAmB,IAAI,IAAI,KAAK,OAAO,cAAc,IAAIvoB,GAAKA,EAAE,KAAK,CAAC,EAE5E,UAAWgR,KAAQE,EACf9/B,EAAS,KACL,KAAK,WAAW4/B,EAAMuX,CAAgB,EACjC,KAAK,CAAC,CAAE,WAAA3U,EAAY,UAAAC,KAAgB,CACjCC,GAAmBF,EACnBG,GAAkBF,CACtB,CAAC,EACA,MAAMI,GAAU,CACbD,EAAO,KAAMC,EAAiB,OAAO,CACzC,CAAC,CAAA,EAGb,MAAM,QAAQ,WAAW7iC,CAAQ,EAE7B4iC,EAAO,OAAS,EAChB,KAAK,mBAAmB,KACpB,IAAIvC,EACA,WACA,GAAGqC,CAAe,uBAAuBC,CAAc,cAAcC,EAAO,MAAM,YAAYA,CAAM,GACpG,SAAA,CACJ,EAGJ,KAAK,mBAAmB,KACpB,IAAIvC,EACA,WACA,GAAGqC,CAAe,uBAAuBC,CAAc,YACvD,SAAA,CACJ,CAGZ,CAEQ,QAAQQ,EAAyB,CACjC,CAAC,KAAK,SAAW,KAAK,OAAO,mBACxB,KAAK,aAAa,QAAQ,KAAK,UAAWA,CAAK,CAE5D,CAEQ,SAASr1B,EAAwB,CACjCA,EAAE,OAAS,UAAY,KAAK,OAAO,mBACnC,KAAK,cAAA,CAEb,CAEA,MAAc,eACVoyB,EACAkX,EACAh7C,EAAqB,CAAA,EACR,CACb,MAAM,KAAK,UAAU,IAAIg7C,CAAW,EACpC,MAAMP,EAAU,IAAI5U,GAAQ/B,EAAOkX,EAAah7C,CAAU,EAC1Dg7C,EAAY,SAAS,QAAUP,EAC/BA,EAAQ,iBAAiB,UAAW,IAAM,KAAK,cAAcA,CAAO,CAAC,EACrE,KAAK,OAAO,IAAIA,CAAO,EACvB,KAAK,UAAU,aAAaO,CAAW,CAC3C,CAEQ,aAAoB,CACxB,GAAI,CAAC,KAAK,SAAW,KAAK,OAAO,kBAAmB,CAChD,MAAMA,EAAc,KAAK,aAAa,mBAAA,EACtC,GAAIA,GAAe,CAAC,OAAO,MAAMA,EAAY,MAAM,EAAG,CAClD,IAAIlX,EAAQ,kBACZ,GAAI,KAAK,OAAO,WAAWA,CAAK,EAAG,CAC/B,QAASpiC,EAAI,EAAGA,EAAI,MAChBoiC,EAAQ,oBAAoBpiC,CAAC,IACzB,EAAC,KAAK,OAAO,WAAWoiC,CAAK,GAFXpiC,GAAK,EAE3B,CAIA,KAAK,OAAO,WAAWoiC,CAAK,IAC5BA,EAAQ,yDAEhB,CACA,MAAMx7B,EAAOm8B,GAAYX,CAAK,EAC1Bx7B,GAAQ,MACH,KAAK,eAAeA,EAAM0yC,CAAW,CAElD,CACJ,CACJ,CACJ,CCtQA,SAASC,GAAkBC,EAAmB1yC,EAAyB,CACnE,MAAMw1B,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,eACtBA,EAAU,GAAKx1B,EACf,MAAM2yC,EAAO,SAAS,cAAc,GAAG,EACvC,OAAAA,EAAK,UAAY,GAAGD,CAAS,oBAC7Bld,EAAU,OAAOmd,CAAI,EAED,IAAIlf,GAAY+B,CAAS,CAEjD,CAOA,MAAqBod,EAAmB,CAU7B,YAAY52C,EAAoB,CAT/BjG,EAAA,sBAAqC,MAC5BA,EAAA,kBAEAA,EAAA,uBAAwD,CACrE,SAAU08C,GAAkB,cAAe,iBAAiB,EAC5D,MAAOA,GAAkB,oBAAqB,cAAc,EAC5D,OAAQA,GAAkB,kBAAmB,eAAe,CAAA,GAI5D,KAAK,UAAYz2C,CACrB,CAMO,UAAU6vC,EAAsC,CACnD,GAAIA,GAAU,KACV,KAAK,UAAU,WAAW,MAAM,OAAS,OACzC,KAAK,oBAAA,EACL,KAAK,eAAiB,SACnB,CACH,KAAK,UAAU,WAAW,MAAM,OAAS,OACzC,MAAMgH,EAAY,KAAK,gBAAgBhH,CAAM,EACzCgH,IAAc,KAAK,iBACnB,KAAK,oBAAA,EACL,KAAK,eAAiBA,EACtB,KAAK,UAAU,IAAI,KAAK,cAAc,EAAE,MAAM,QAAQ,KAAK,EAEnE,CACJ,CAEO,kBAAkBC,EAA8B,CAC/C,KAAK,gBAAkB,OAI3B,KAAK,eAAe,SAAS,KAAKA,CAAa,EAC/C,KAAK,eAAe,kBAAkB,EAAI,EAC1C,KAAK,UAAU,aAAA,EACnB,CAEQ,qBAA4B,UAChC9L,GAAA3V,EAAA,KAAK,iBAAL,YAAAA,EAAqB,SAArB,MAAA2V,EAA6B,OAAO,KAAK,eAC7C,CACJ,CCLA,MAAqB+L,WAAsB1Z,EAAAA,eAAuC,CAiBvE,YAAYr9B,EAAoB,CACnC,MAAA,EAjBYjG,EAAA,qBAEAA,EAAA,0BACAA,EAAA,eACAA,EAAA,uBACAA,EAAA,iBACAA,EAAA,oBACAA,EAAA,qBACAA,EAAA,qBACAA,EAAA,2BACAA,EAAA,eACAA,EAAA,2BACCA,EAAA,yBAEAA,EAAA,cAAS64C,EAAAA,eAAA,GAKtB,KAAK,aAAe5yC,EAEpB,KAAK,OAAS,IAAIg3C,SAClB,KAAK,mBAAqB,IAAIJ,GAAmB52C,CAAQ,EACzD,KAAK,OAAS,IAAI0yC,GAAiB,KAAK,aAAc,KAAK,OAAQ,KAAK,kBAAkB,EAE1F,MAAM5G,EAAW,KAAK,OAAO,yBAAA,EACvBmH,EAAS,KAAK,OAAO,uBAAA,EACtB,KAAK,OAAO,OAAOnH,EAAS,YAAamH,EAAO,WAAW,EAEhE,KAAK,aAAe,IAAIgE,eAAa,KAAK,YAAY,EACtD,KAAK,eAAiB,IAAIhD,GAAe,KAAK,aAAc,KAAK,YAAY,EAC7E,KAAK,kBAAoB,IAAInT,GAAkB,KAAK,aAAc,KAAK,OAAQ,KAAK,MAAM,EAC1F,KAAK,YAAc,IAAI3E,GACvB,KAAK,OAAS,IAAI6a,SAClB,KAAK,mBAAqB,IAAIV,GAC1B,KAAK,aACL,KAAK,OACL,KAAK,MAAA,EAGT,KAAK,iBAAmB,KAAK,WAAW,KAAK,IAAI,EACjD,KAAK,aAAa,iBAAiB,aAAc,KAAK,gBAAgB,EAEtE,KAAK,aAAa,iBAAiB,UAAY,GAC/C,KAAK,aAAa,iBAAiB,iBAAmB,GACtD,KAAK,aAAa,iBAAiB,0BAA4B,GAE/D,MAAMY,EAAa,SAEnB,KAAK,aAAe,IAAIC,eAAaD,EAAY,EAAG,EACpD,KAAK,aAAa,MAAM,IAAI,KAAK,YAAY,EAE7C,KAAK,SAAW,IAAIE,mBAAiBF,EAAY,CAAC,EAClD,KAAK,SAAS,SAAS,IAAIjE,EAAO,EAAI,IAAOA,EAAO,EAAI,IAAO,GAAK,EACpE,KAAK,SAAS,OAAO,SAAS,IAAIA,EAAO,EAAGA,EAAO,EAAG,CAAC,EACvD,KAAK,aAAa,MAAM,IAAI,KAAK,QAAQ,EACzC,KAAK,aAAa,MAAM,IAAI,KAAK,SAAS,MAAM,EAChD,KAAK,SAAS,kBAAA,EACd,KAAK,aAAa,MAAM,kBAAA,EAKxB,KAAK,aAAa,aAAA,CACtB,CAEO,SAAgB,CACnB,KAAK,aAAa,oBAAoB,aAAc,KAAK,gBAAgB,EACzE,KAAK,aAAa,MAAM,OAAO,KAAK,SAAS,MAAM,EACnD,KAAK,aAAa,MAAM,OAAO,KAAK,QAAQ,EAC5C,KAAK,aAAa,MAAM,OAAO,KAAK,YAAY,EAChD,KAAK,mBAAmB,QAAA,EACxB,KAAK,YAAY,QAAA,EACjB,KAAK,kBAAkB,QAAA,EACvB,KAAK,aAAa,QAAA,EAClB,KAAK,OAAO,QAAA,CAChB,CAOO,gBAAuB,CAC1B,MAAM/3C,EAAO,IAAI2B,OACXw6C,EAAQ,IAAIx6C,OAClB,YAAK,aAAa,MAAM,SAASyF,GAAO,CACpC+0C,EAAM,cAAc/0C,CAAG,EACvBpH,EAAK,MAAMm8C,CAAK,CACpB,CAAC,EACMn8C,CACX,CAKO,cAA2B,CAC9B,MAAMsJ,EAAqB,CAAA,EAC3B,YAAK,aAAa,MAAM,SAAStE,GAAK,CAClCsE,EAAO,KAAKtE,CAAC,CACjB,CAAC,EACMsE,CACX,CAEQ,YAAmB,CAGvB,MAAMi8B,EAAS,KAAK,aAAa,KAAK,OACtCA,EAAO,KAAO,EAEd,KAAK,cAAc,CAAE,KAAM,QAAA,CAAU,EACrCrD,GAAwB,cAAc,CAAE,KAAM,SAAA,CAAW,CAC7D,CACJ,CCzKO,MAAMka,EAA+B,CAKjC,YAAYz9C,EAIhB,CARcE,EAAA,0BACAA,EAAA,kBACAA,EAAA,4BAOb,KAAK,kBAAoBF,EAAO,OAChC,KAAK,UAAYA,EAAO,SACxB,KAAK,oBAAsBA,EAAO,kBACtC,CAEO,gBAAuB,CAC1B,MAAM09C,EAAW,KAAK,UAAU,YAAA,EAC1Br8C,EAAO,IAAI2B,OAAA,EAAO,UAAA,EAExB,UAAWb,KAAUu7C,EACjB,GAAIC,GAAAA,WAAWx7C,CAAM,EAAG,CACpB,MAAMy7C,EAAYz7C,EAAO,eAAA,EACrBy7C,GAAa,MACbv8C,EAAK,MAAMu8C,CAAS,CAE5B,CAGJ,OAAOv8C,CACX,CAEO,qBAAwC,CAC3C,OAAO,KAAK,iBAChB,CAEO,aAAwB,CAC3B,OAAO,KAAK,SAChB,CAEO,uBAA4C,CAC/C,OAAO,KAAK,mBAChB,CACJ,8IC3CI,MAAMw8C,EAAa/Z,EAAAA,IAA2B,IAAI,EAC5Cd,EAAec,EAAAA,IAAkB8B,EAAa,MAAA,CAAO,EAE3D,SAASkY,EAAiBC,EAA2B,CACjD/a,EAAa,MAAQ+a,EAEPC,GAAU,MAAM,oBAAoBH,EAAW,KAAuB,EAC9E,KAAA,CACV,CAE0BvY,GAAA,EAER,UAAU,CAAC,CAAE,KAAA+B,EAAM,KAAAp9B,KAAW,CAC5C,OAAQA,EAAA,CACJ,IAAK,OACD6zC,EAAiBzW,EAAK,CAAC,CAAC,EACxB,KAAA,CAEZ,CAAC,EAED,SAAS4W,GAAkB,CACvB,GAAIjb,EAAa,OAAS,KACtB,MAAO,kBAGX,OAAQA,EAAa,MAAM,MAAA,CACvB,IAAK,QACD,MAAO,6BACX,IAAK,OACD,MAAO,uBACX,IAAK,UACD,MAAO,cACX,IAAK,UACD,MAAO,+BACX,QACI,MAAO,iBAAA,CAEnB,CAEA,SAASkb,GAAmB,CACxB,GAAIlb,EAAa,OAAS,KACtB,MAAO,kBAGX,OAAQA,EAAa,MAAM,MAAA,CACvB,IAAK,QACD,MAAO,iBACX,IAAK,OACD,MAAO,oBACX,IAAK,UACD,MAAO,kBACX,IAAK,UACD,MAAO,kBACX,QACI,MAAO,iBAAA,CAEnB,eASAmb,YAAA,EAAAC,qBAeM,MAfNC,GAeM,CAdFC,EAAAA,mBAaM,MAAA,SAbG,aAAJ,IAAIT,EAAa,MAAM,QAAQ,KAAK,QAAQ,YAAU,YAAY,cAAY,MAAA,GAC/ES,EAAAA,mBAUM,MAAA,CAVA,uCAAwBJ,EAAA,CAAQ,CAAA,CAAA,GAClCI,EAAAA,mBAAwE,IAAA,CAApE,OAAMtb,EAAA,MAAa,QAAK,OAAc,6BAAcib,EAAA,CAAO,CAAA,CAAA,cAC/DK,qBAA8D,SAA9DC,GAA8DC,EAAAA,gBAA9Bxb,EAAA,MAAa,KAAK,EAAA,CAAA,cAElDsb,EAAAA,mBAKU,SAAA,CAJN,KAAK,SACL,MAAM,YACN,kBAAgB,QAChB,aAAW,OAAA,gBAGnBA,EAAAA,mBAAyD,MAAA,CAApD,MAAM,aAAa,UAAQtb,EAAA,MAAa,IAAA,yLC/ErD,MAAMyb,EAAY,IAJJC,EAIc,MAAM,cAAc,qEAIhDJ,EAAAA,mBAEO,OAAA,CAFD,MAAM,SAAO,CACfA,EAAAA,mBAA2C,OAAA,CAArC,MAAM,4BAAYG,CAAS,CAAA,CAAA,GAC9BE,kBAAA,sBACJF,CAAS,CAAA,CAAA,uNCLZN,YAAA,EAAAC,qBAIM,MAJNC,GAIM,CAHFC,EAAAA,mBAEC,OAAA,KAAA,CADIA,EAAAA,mBAAmB,2BAAbI,EAAA,MAAM,EAAA,CAAA,oBAAO,IAACF,EAAAA,gBAAGE,EAAA,KAAK,EAAAF,kBAAME,EAAA,MAAM,EAAA,CAAA,CAAA,qTCVjD,MAAME,EAAQF,+BAWEljB,EAAAojB,EAAM,OAAN,MAAApjB,EAAY,WAAU,yBAClC4iB,EAAAA,mBAEI,IAAA,OAFA,KAAMQ,EAAM,KAAM,OAAO,QAAA,GACzBN,EAAAA,mBAAqE,MAAA,CAA/D,IAAKM,EAAM,KAAO,IAAKA,EAAM,MAAO,MAAA,CAAA,YAAA,OAAA,CAAA,sBAG7BzN,EAAAyN,EAAM,OAAN,MAAAzN,EAAY,WAAU,yBAA3CiN,EAAAA,mBAMWS,EAAAA,SAAA,CAAA,IAAA,GAAA,CALPP,EAAAA,mBAGC,QAHDC,GAGC,CAFGD,EAAAA,mBAA+C,SAAA,CAAtC,IAAKM,EAAM,KAAO,KAAMA,EAAM,IAAA,2CAAQ,iBAClC,EAAA,GAAAN,EAAAA,mBAA+B,IAAA,CAA3B,KAAMM,EAAM,IAAA,EAAM,QAAK,EAAAE,EAAA,gCAAI,IAAC,EAAA,EAAA,eAChDR,qBAAM,KAAA,KAAA,KAAA,EAAA,iCAAA,iBACM,EAAA,GAAAA,EAAAA,mBAA+C,IAAA,CAA3C,KAAMM,EAAM,KAAM,OAAO,QAAA,EAAS,QAAK,EAAAG,EAAA,gCAAI,KAChE,EAAA,EAAA,OACqBH,EAAM,OAAI,iCAA/BR,EAAAA,mBAWWS,EAAAA,SAAA,CAAA,IAAA,GAAA,CAVPP,EAAAA,mBAQC,SAAA,CAPI,MAAOM,EAAM,MACd,MAAM,MACN,OAAO,MACN,IAAKA,EAAM,KACZ,YAAY,IACZ,QAAQ,iCAAA,yBAEXN,qBAAM,KAAA,KAAA,KAAA,EAAA,iCAAA,iBACM,EAAA,GAAAA,EAAAA,mBAA8C,IAAA,CAA1C,KAAMM,EAAM,KAAM,OAAO,QAAA,EAAS,OAAI,EAAAI,EAAA,gCAAI,KAC/D,EAAA,EAAA,sBAEKZ,EAAAA,mBAA2D,IAAA,OAAvD,KAAMQ,EAAM,KAAM,OAAO,QAAA,EAAYJ,EAAAA,gBAAAI,EAAM,KAAK,EAAA,EAAAK,EAAA,8SC9BzD,MAAML,EAAQF,EAKd,IAAIQ,EAEJ,OAAQN,EAAM,SAAA,CAEV,IAAK,UACDM,EAAS,CAAC,QAAS,eAAgB,aAAc,eAAe,EAChE,MACJ,QACIA,EAAS,CAAC,eAAe,CAAA,mFAKjCd,qBA+CK,KAAA,KAAA,CA9CDE,EAAAA,mBAAyE,KAAA,CAApE,MAAOa,EAAAA,SAAU,MAAM,yBAAA,oBAA6BA,EAAAA,QAAQ,EAAA,EAAAd,EAAA,EACjEC,EAAAA,mBA4CK,KAAA,CA5CA,uBAAOc,EAAAA,MAAAF,CAAA,CAAM,CAAA,GACEN,EAAM,YAAc,sBAC/BR,EAAAA,mBAA6C,OAA7CiB,GAA6B,WAAS,GAEtBT,EAAM,YAAS,oBAC/BR,qBAAwC,OAAxCG,GAA6B,MAAI,GAEV,OAAAK,EAAM,WAAS,wBAA3CR,EAAAA,mBAiCWS,EAAAA,SAAA,CAAA,IAAA,GAAA,CAhCS,MAAM,QAAQD,EAAM,SAAS,iBACzCR,EAAAA,mBAOQ,QAAAkB,GAAA,EANJnB,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAKES,6BAJ6BD,EAAM,UAAS,CAAlCW,EAAS/9B,mBADrBg+B,EAAAA,YAKEC,EAAA,CAHG,IAAKj+B,EACL,gBAAeA,CAAK,IACpB,aAAY+9B,CAAA,gDAIJH,EAAAA,MAAAM,EAAAA,MAAA,EAAOd,EAAM,SAAS,iBACvCY,EAAAA,YAIEG,GAAA,OAHG,KAAMf,EAAM,UAAU,KACtB,MAAOA,EAAM,UAAU,MACvB,KAAMA,EAAM,UAAU,IAAA,mCAGVQ,EAAAA,MAAAQ,EAAAA,OAAA,EAAQhB,EAAM,SAAS,iBACxCY,EAAAA,YAAgFK,GAAA,CAAhE,IAAKjB,EAAM,UAAU,aAAA,EAAiB,MAAOA,EAAM,SAAA,qBAElDQ,EAAAA,MAAAU,EAAAA,SAAA,EAAUlB,EAAM,SAAS,GAC1CT,EAAAA,YAAAC,EAAAA,mBAQM,MARNU,GAQM,CAPFiB,EAAAA,YAAwEC,GAAA,CAAnD,MAAOpB,EAAM,UAAU,EAAE,QAAO,CAAA,EAAK,OAAO,IAAA,oBACjEmB,EAAAA,YAAwEC,GAAA,CAAnD,MAAOpB,EAAM,UAAU,EAAE,QAAO,CAAA,EAAK,OAAO,IAAA,oBACjEmB,EAAAA,YAIEC,GAAA,CAHG,MAAOpB,EAAM,UAAU,EAAE,QAAO,CAAA,EACjC,OAAO,QACP,OAAO,GAAA,sCAIFR,EAAAA,mBAA0C,OAA1CW,GAA6B,QAAM,EAAA,sBAGnDX,EAAAA,mBAAqE,OAAA,OAA9D,MAAOQ,EAAM,SAAA,EAAwBJ,EAAAA,gBAAAI,EAAM,SAAS,EAAA,EAAAqB,EAAA,EAAA,+QCzD7DC,EAAAA,SAAS,OAAM,iBAA1B9B,EAAAA,mBAYM,MAAAC,GAAA,CAXFC,EAAAA,mBAAgE,KAAhEe,GAAgEb,EAAAA,gBAAb/Y,EAAAA,KAAK,EAAA,CAAA,EACxD6Y,EAAAA,mBASQ,QATRC,GASQ,CARJD,EAAAA,mBAOQ,QAAA,KAAA,EANJH,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAKES,WAAA,KAAAsB,EAAAA,WAJ0BD,EAAAA,SAAQ,CAAxB3wC,EAAMiS,mBADlBg+B,EAAAA,YAKEY,GAAA,CAHG,IAAK5+B,EACL,YAAWjS,EAAK,IAChB,aAAYA,EAAK,KAAA,mcCVlC,MAAMqvC,EAAQF,EAOR2B,EAASvc,EAAAA,IAAI,EAAK,EAExB,SAASwc,GAAiB,CACtB,MAAMt6C,EAAQ,GAAG44C,EAAM,MAAM,CAAC,IAAIA,EAAM,MAAM,CAAC,IAAIA,EAAM,MAAM,CAAC,GAChE,UAAU,UACL,UAAU54C,CAAK,EACf,KAAK,IAAM,CACRq6C,EAAO,MAAQ,GACf,WAAW,IAAOA,EAAO,MAAQ,GAAQ,GAAI,CACjD,CAAC,EACA,MAAMhtC,GAAK,CACR,QAAQ,IAAI,SAAUA,CAAC,CAC3B,CAAC,CACT,eAMA8qC,YAAA,EAAAC,qBAgCM,MAhCNC,GAgCM,CA/BFC,EAAAA,mBASM,MATNe,GASM,aARFf,EAAAA,mBAAoC,IAAA,CAAjC,MAAM,sBAAA,EAAsB,KAAA,EAAA,GAC/BA,qBAA4D,OAA5DC,GAA4DC,kBAAxBv0C,EAAAA,MAAQs2C,EAAAA,MAAM,EAAA,CAAA,EAClDjC,EAAAA,mBAKU,SAAA,CAJL,uBAAOkC,EAAAA,MAAK,OAAA,GACb,KAAK,SACL,MAAM,YACN,aAAW,OAAA,KAGnBlC,EAAAA,mBAOM,MAPNgB,GAOM,EANFnB,EAAAA,UAAA,EAAA,EAAAC,qBAKES,EAAAA,2BAJ0B4B,EAAAA,WAAW,QAAA,EAAO,CAAlC7yC,EAAM4T,mBADlBg+B,EAAAA,YAKEkB,GAAA,CAHG,IAAKl/B,EACL,MAAO5T,EAAI,CAAA,EACX,SAAUA,EAAI,CAAA,CAAA,yCAGvB0wC,EAAAA,mBAYM,MAZNQ,GAYM,CAXFR,EAAAA,mBAUM,MAVNS,GAUM,CATFgB,EAAAA,YAA8DC,GAAA,CAAzC,MAAO98C,EAAAA,MAAM,EAAE,QAAO,CAAA,EAAK,OAAO,IAAA,oBACvD68C,EAAAA,YAA8DC,GAAA,CAAzC,MAAO98C,EAAAA,MAAM,EAAE,QAAO,CAAA,EAAK,OAAO,IAAA,oBACvD68C,EAAAA,YAA4EC,GAAA,CAAvD,MAAO98C,EAAAA,MAAM,EAAE,QAAO,CAAA,EAAK,OAAO,QAAQ,OAAO,GAAA,oBACtEo7C,EAAAA,mBAKS,SAAA,CALA,QAAOgC,EAAU,KAAK,SAAS,MAAM,cAAA,GAC1ChC,EAAAA,mBAGK,IAAA,CAFD,MAAKqC,EAAAA,eAAA,CAAC,KACEN,EAAA,MAAM,CAAA,qBAAA,cAAA,EAAA,CAAA,cAAA,CAAA,CAAA,CAAA,6EC/DtCO,GAAe,ukMCKXzC,YAAA,EAAAC,qBAoBM,MApBNC,GAoBM,CAnBFwC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAvC,qBAAmB,UAAf,aAAU,EAAA,GACdA,EAAAA,mBAcK,KAAA,KAAA,EAbDH,EAAAA,YAAAC,EAAAA,mBAYM,MAZNiB,GAYM,CAAA,GAAAwB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAHFvC,EAAAA,mBAEE,OAAA,CADE,EAAE,oFAAA,EAAoF,KAAA,EAAA,CAAA,QAIlGA,EAAAA,mBAEM,MAFNC,GAEM,CADFD,qBAAmB,MAAA,CAAb,IAAKc,EAAAA,MAAA0B,EAAA,CAAA,EAAI,KAAA,EAAAxB,EAAA,CAAA,mIChBvB,MAAMyB,EAAWjd,EAAAA,IAA2B,IAAI,EAC1Ckd,EAAgBld,EAAAA,IAA2B,IAAI,EAC/C39B,EAAW86C,EAAAA,WAA4B,IAAI,EAE3ClhD,EAAQg5C,EAAAA,eAAA,EAEdmI,OAAAA,EAAAA,UAAU,IAAM,CACZ/6C,EAAS,MAAQ,IAAIszB,GAAS,CAC1B,gBAAiB,KACjB,IAAK15B,EAAM,OAAA,EACX,OAAQghD,EAAS,KAAA,CACpB,EACDhhD,EAAM,YAAYoG,EAAS,KAAK,CAapC,CAAC,EAEDg7C,EAAAA,YAAY,IAAM,CAKdphD,EAAM,YAAY,IAAI,EAClBoG,EAAS,QACTA,EAAS,MAAM,KAAK,YAAY,IAAI,EACpCA,EAAS,MAAM,QAAA,EAEvB,CAAC,UAIDg4C,YAAA,EAAAC,qBAOM,MAPNC,GAOM,CANFC,EAAAA,mBAAsD,MAAA,SAA7C,WAAJ,IAAIyC,EAAW,MAAM,OAAO,GAAG,WAAA,YACpCzC,EAAAA,mBAIO,MAAA,SAHC,gBAAJ,IAAI0C,EACJ,GAAG,YACH,MAAM,sDAAA,qNCxCd,MAAMpa,EAASoS,EAAAA,eAAA,EACToI,EAAoB9b,GAAA,EAEpBsU,EAAiB9V,EAAAA,IAAyB8C,EAAO,qBAAA,CAAsB,EAC7Eya,QAAMzH,EAAgB0H,GAAW,CAC7B1a,EAAO,kBAAkB0a,CAAO,EAEhC,IAAIr3C,EACAs3C,EAEJ,OAAQD,EAAA,CACJ,IAAK,WAAY,CACbr3C,EAAO,WACPs3C,EAAc,qBACd,KACJ,CACA,IAAK,eAAgB,CACjBt3C,EAAO,eACPs3C,EAAc;AAAA;AAAA;AAAA,qFAId,KACJ,CACA,IAAK,QAAS,CACVt3C,EAAO,kBACPs3C,EAAc;AAAA;AAAA,yGAGd,KACJ,CACA,IAAK,kBAAmB,CACpBt3C,EAAO,kBACPs3C,EAAc;AAAA,uDAEd,KACJ,CACA,QAGI,OADgCD,CAEpC,CAGJF,EAAkB,KACd,IAAIxb,EACA,aACA,kCAAkC37B,CAAI,iBAAiBs3C,CAAW,GAClE,SAAA,CACJ,CAER,CAAC,EAED,SAASC,GAA8B,CAC/B5H,EAAe,QAAU,kBACzBA,EAAe,MAAQ,kBAEvBA,EAAe,MAAQ,OAE/B,eAIAuE,YAAA,EAAAC,qBAoBM,MApBNC,GAoBM,CAnBFC,EAAAA,mBAkBM,MAlBNe,GAkBM,aAjBFf,EAAAA,mBAAoE,IAAA,CAAjE,MAAM,kBAAkB,MAAM,8BAAA,YACjCyB,EAAAA,YAGE0B,EAAAA,UAAA,CAFG,cAAa7H,EAAA,QAAc,eAC3B,sBAAkBiH,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAE13C,GAAMywC,EAAA,MAAiBzwC,EAAC,eAAA,QAAA,sCAEjDm1C,EAAAA,mBAAgE,IAAA,CAA7D,MAAM,oBAAoB,MAAM,wBAAA,wBACnCA,EAAAA,mBAA2B,MAAA,CAAtB,MAAM,SAAA,EAAS,KAAA,EAAA,GACpBA,EAAAA,mBASS,SAAA,CARL,MAAKqC,EAAAA,eAAA,CAAC,mCACE/G,EAAA,QAAc,kBAAA,SAAA,IAAA,CAAA,EACrB,eAAcA,EAAA,QAAc,kBAC7B,iBAAe,SACf,MAAM,kBACL,QAAO4H,CAAA,mBAERlD,EAAAA,mBAA+B,IAAA,CAA5B,MAAM,iBAAA,EAAiB,KAAA,EAAA,CAAA,0EC7F1CoD,GAAe,y/tBCAfC,GAAe,6otBCAfC,GAAe,6h4CCAfC,GAAe,q8eCAfC,GAAe,40fCCX,MAAMC,EAAeC,GAQfC,EAAUC,iBAAA,EAAiB,iBAAA,8BAIjC9D,qBA8GM,MAAA,KAAA,k5BAxFFE,EAAAA,mBA+BM,MA/BND,GA+BM,CA9BFC,EAAAA,mBAKI,IALJe,GAKI,CAJAf,EAAAA,mBAGM,MAHNC,GAGM,CAFFsC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAvC,qBAAqB,YAAf,WAAQ,EAAA,GACdA,EAAAA,mBAAmD,MAAA,CAA7C,IAAKc,EAAAA,MAAAyC,EAAA,EAAU,MAAM,OAAO,IAAI,UAAA,iBAG9CvD,EAAAA,mBAKI,IALJQ,GAKI,CAJAR,EAAAA,mBAGM,MAHNS,GAGM,CAFF8B,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAvC,qBAAuB,YAAjB,aAAU,EAAA,GAChBA,EAAAA,mBAAgD,MAAA,CAA1C,IAAKc,EAAAA,MAAAsC,EAAA,EAAK,MAAM,OAAO,IAAI,YAAA,iBAGzCpD,EAAAA,mBAKO,OALPU,GAKO,CAJHV,EAAAA,mBAGM,MAHNW,GAGM,CAFF4B,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAvC,qBAAmE,YAA7D,yDAAsD,EAAA,GAC5DA,EAAAA,mBAAwD,MAAA,CAAlD,IAAKc,EAAAA,MAAAuC,EAAA,EAAY,MAAM,OAAO,IAAI,aAAA,iBAGhDrD,EAAAA,mBAWO,OAXP6D,GAWO,CAVH7D,EAAAA,mBASM,MATN8D,GASM,CARFvB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAvC,qBAGC,YAFI,uFACW,EAAA,GAEhBA,EAAAA,mBAGM,MAHN+D,GAGM,CAFF/D,EAAAA,mBAA8D,MAAA,CAAxD,IAAKc,EAAAA,MAAAwC,EAAA,EAAe,MAAM,OAAO,IAAI,gBAAA,aAC3CtD,EAAAA,mBAA4E,MAAA,CAAtE,IAAKc,EAAAA,MAAA0C,EAAA,EAAQ,MAAM,OAAO,IAAI,qCAAA,+9CA8CpDxD,EAAAA,mBAOK,KAAA,KAAA,kBANDF,EAAAA,mBAKKS,EAAAA,SAAA,KAAAsB,EAAAA,WALsB,OAAO,QAAQf,EAAAA,MAAA2C,CAAA,CAAY,EAAA,CAAA,CAA1C93C,EAAMq4C,CAAI,mBAAtBlE,EAAAA,mBAKK,KAAA,CALqD,IAAKn0C,GAAI,CAC/Dq0C,EAAAA,mBAA4E,IAAA,CAAzE,OAAO,SAAU,KAAMgE,EAAK,QAAA,EAAa9D,kBAAAv0C,CAAI,EAAG,KAAEu0C,EAAAA,gBAAG8D,EAAK,OAAO,EAAG,IAAC,EAAAC,EAAA,EACtDD,EAAK,aAAvBnE,EAAAA,UAAA,EAAAC,EAAAA,mBAEa,aAFboE,GAEahE,EAAAA,gBADN8D,EAAK,WAAW,EAAA,CAAA,2CAI/BzB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAvC,qBAAsB,SAAnB,kBAAe,EAAA,GAClBA,EAAAA,mBAIK,KAAA,KAAA,kBAHDF,EAAAA,mBAEKS,WAAA,KAAAsB,EAAAA,WAFgBf,QAAA6C,CAAA,EAAVQ,kBAAXrE,EAAAA,mBAEK,KAAA,CAF0B,IAAKqE,EAAO,IAAA,GACvCnE,EAAAA,mBAA4B,OAAA,KAAAE,EAAAA,gBAAnBiE,EAAO,EAAE,EAAA,CAAA,CAAA,yBAG1BnE,EAAAA,mBAAM,KAAA,KAAA,KAAA,EAAA,EAAA,8DC1HRoE,EAAO,CAAE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,K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","x_google_ignoreList":[11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,114,135,164]}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/api/analysis.ts","../src/api/bookmarks.ts","../src/components/Configuration.ts","../src/giro3d/DatasetBuilder.ts","../src/loaders/loader.ts","../src/services/Highlighter.ts","../src/api/dataset.ts","../src/api/http.ts","../src/api/notifications.ts","../src/api/search.ts","../src/api/view.ts","../src/api/widgets.ts","../src/configuration/orientation.ts","../src/events.ts","../src/stores/annotations.ts","../src/stores/notifications.ts","../src/types/Annotation.ts","../src/utils/Measure.ts","../src/services/AnnotationManager.ts","../../../node_modules/camera-controls/dist/camera-controls.module.js","../src/types/CameraPosition.ts","../src/giro3d/CameraControlsInspector.ts","../src/stores/giro3d.ts","../src/services/CameraController.ts","../src/services/DatasetManager.ts","../src/stores/basemap.ts","../src/services/LayerManager.ts","../src/services/MeasureTool.ts","../src/stores/measurement.ts","../src/types/Measure.ts","../src/services/MeasurementManager.ts","../../../node_modules/three/examples/jsm/renderers/CSS2DRenderer.js","../src/services/SceneCursorManager.ts","../src/services/Giro3DManager.ts","../src/components/AlertToast.vue","../src/components/ColorFragment.vue","../src/components/CoordinateFragment.vue","../src/components/LinkFragment.vue","../src/components/AttributeItem.vue","../src/components/AttributeGroup.vue","../src/components/AttributePanel.vue","../src/assets/piero_logo.png","../src/components/LoadingScreen.vue","../src/components/MainView.vue","../src/components/NavigationButtons.vue","../src/assets/sponsors/bpi_france.png","../src/assets/sponsors/france_2030.png","../src/assets/sponsors/france_relance.png","../src/assets/sponsors/oslandia.png","../src/assets/sponsors/ue_next_generation.png","../src/components/panels/AboutPanel.vue","../../../node_modules/three/src/math/MathUtils.js","../src/stores/analysis.ts","../src/components/panels/analysis/ToolWrapper.vue","../src/components/panels/EmptyIndicator.vue","../src/components/panels/AnalysisPanel.vue","../src/components/atoms/ButtonArea.vue","../src/components/atoms/ImportButton.vue","../src/components/DropdownView.vue","../src/components/CheckboxToggle.vue","../src/components/VisibilityControl.vue","../src/components/panels/AnnotationItem.vue","../src/types/AnnotationMode.ts","../src/components/panels/AnnotationPanel.vue","../src/components/ModalOverlay.vue","../src/components/panels/BookmarkItem.vue","../src/components/panels/ShareBookmarkModal.vue","../src/types/Bookmark.ts","../src/stores/bookmarks.ts","../src/components/panels/BookmarkPanel.vue","../src/components/atoms/CompactList.vue","../src/components/SpinnerControl.vue","../src/components/panels/DatagroupItem.vue","../src/components/panels/DatasetItem.vue","../src/components/panels/DatasetOrGroupItem.vue","../src/components/atoms/Slider.vue","../src/components/panels/DatasetParameters.vue","../src/components/panels/DatasetPanel.vue","../src/components/panels/MeasurementItem.vue","../src/types/MeasurementMode.ts","../src/components/panels/MeasurementPanel.vue","../src/components/PanelContainer.vue","../src/components/ProgressBar.vue","../src/stores/search.ts","../src/components/SearchOverlay.vue","../src/components/StatusBar.vue","../src/assets/piero_logo_compact.png","../src/components/toolbar/ToolbarButton.vue","../src/components/toolbar/ToolBar.vue","../src/stores/widgets.ts","../src/App.vue","../src/configuration/defaultConfig.ts","../src/createPieroApp.ts"],"sourcesContent":["import type { Component } from 'vue';\n\nimport type { AnalysisStore } from '@/stores/analysis';\n\nexport interface AnalysisApi {\n registerTool(params: AnalysisToolRegistrationParams): void;\n}\n\nexport type AnalysisToolRegistrationParams = {\n component: Component;\n icon: string;\n name: string;\n};\n\n/** @internal */\nexport class AnalysisApiImpl implements AnalysisApi {\n public constructor(private readonly store: AnalysisStore) {}\n\n public registerTool(params: AnalysisToolRegistrationParams): void {\n this.store.registerTool(params);\n }\n}\n","import type { BookmarkStore } from '@/stores/bookmarks';\nimport type Bookmark from '@/types/Bookmark';\n\nexport interface BookmarkApi {\n clearBookmarks(): void;\n getBookmarks(): Bookmark[];\n setBookmarks(bookmarks: Bookmark[]): void;\n}\n\n/** @internal */\nexport class BookmarkApiImpl implements BookmarkApi {\n private readonly _store: BookmarkStore;\n\n public constructor(store: BookmarkStore) {\n this._store = store;\n }\n\n public clearBookmarks(): void {\n this._store.clear();\n }\n\n public getBookmarks(): Bookmark[] {\n return this._store.getBookmarks();\n }\n\n public setBookmarks(bookmarks: Bookmark[]): void {\n this._store.clear();\n for (const bookmark of bookmarks) {\n this._store.add(bookmark);\n }\n }\n}\n","import type { Component } from 'vue';\n\ntype PanelDef = {\n enabled: boolean;\n icon: string;\n key: PanelType;\n title: string;\n};\n\nexport type PanelType = 'about' | 'analysis' | 'annotations' | 'bookmarks' | 'data' | 'measures';\n\nlet panels: PanelDef[] | null = null;\n\ntype DatasetType = string;\n\nexport default function getPanels(): ReadonlyArray<PanelDef> {\n if (!panels) {\n panels = [\n { enabled: true, icon: 'bi-stack', key: 'data', title: 'Data' },\n { enabled: true, icon: 'bi-vector-pen', key: 'annotations', title: 'Annotations' },\n {\n enabled: true,\n icon: 'bi-rulers',\n key: 'measures',\n title: 'Measurements',\n },\n { enabled: true, icon: 'bi-graph-up', key: 'analysis', title: 'Analysis' },\n { enabled: true, icon: 'bi-bookmarks', key: 'bookmarks', title: 'Bookmarks' },\n { enabled: true, icon: 'bi-info-circle', key: 'about', title: 'About Piero' },\n ] as const;\n }\n return panels;\n}\n\nexport const propertyViews: Map<DatasetType, Component> = new Map();\n\nexport const datasetIcons: Record<DatasetType, string> = {\n colorLayer: 'fg-landcover-map',\n elevationLayer: 'fg-contour-map',\n featureCollection: 'bi-buildings',\n maskLayer: 'fg-hex-map',\n pointcloud: 'fg-multipoint',\n tiledIfc: 'bi-building',\n vector: 'fg-polygon-pt',\n};\n\nexport const datasetTitles: Record<DatasetType, string> = {\n colorLayer: 'Color Layer',\n elevationLayer: 'Elevation layer',\n featureCollection: 'Feature Collection',\n maskLayer: 'Mask Layer',\n pointcloud: 'Point Cloud',\n tiledIfc: 'IFC',\n vector: 'Vector',\n};\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport type { DatasetBuildContext, DatasetBuilder, DatasetBuildResult } from '@/api/dataset';\nimport type * as config from '@/configuration';\nimport type { Dataset, DatasetBase } from '@/types/Dataset';\n\nconst builders: Record<Dataset['type'], DatasetBuilder> = {};\n\n/**\n * Gets the Giro3D entity for a dataset\n * @param instance - Giro3D main instance\n * @param dataset - Dataset\n * @returns Entity\n */\nasync function build(\n instance: Instance,\n dataset: Dataset & DatasetBase<config.dataset.DatasetOrGroup>,\n): Promise<DatasetBuildResult> {\n const context: DatasetBuildContext = {\n dataset: dataset.config,\n instance,\n };\n\n const builder = builders[dataset.type];\n\n if (builder == null) {\n throw new Error(\n `no builder found for dataset type <span class=\"badge text-bg-secondary\">${dataset.type}</span>`,\n );\n }\n\n const result = await builder(context);\n\n if (result.entities) {\n for (const entity of result.entities) {\n if (!('dataset' in entity.object3d.userData)) {\n entity.object3d.userData.dataset = {};\n }\n entity.object3d.userData.dataset.name = dataset.name;\n }\n }\n\n return result;\n}\n\nexport function registerBuilder(datasetType: string, builder: DatasetBuilder): void {\n if (builders[datasetType] != null) {\n console.warn(`replacing builder for dataset type '${datasetType}'`);\n }\n\n builders[datasetType] = builder;\n}\n\nexport default {\n build,\n};\n","import type { LoadDatasetFromFile, LoaderContext } from '@/api/dataset';\nimport type { Configuration } from '@/configuration/configuration';\nimport type { Dataset as DatasetConfig } from '@/configuration/dataset';\n\nimport { Dataset } from '@/types/Dataset';\nimport { getPublicFolderUrl } from '@/utils/Configuration';\n\nconst loaders: Record<string, LoadDatasetFromFile> = {};\n\n/**\n * Gets the filename and extension from a File or URL\n *\n * @param fileOrUrl - File or URL\n * @returns File name and extension\n */\nfunction getLoaderContext(fileOrUrl: File | string, config: Configuration): LoaderContext {\n if (typeof fileOrUrl === 'string') {\n const absoluteUrl = getPublicFolderUrl(fileOrUrl);\n const url = new URL(absoluteUrl);\n const baseUrl = `${url.origin}${url.pathname}`;\n const parts = baseUrl.split('/');\n const filename = parts.pop();\n\n if (filename == null) {\n throw new Error('Could not determine filename');\n }\n\n const extension = filename.split('.').at(-1);\n\n if (extension == null) {\n throw new Error(`File has no extension: ${filename}`);\n }\n\n return {\n configuration: config,\n extension,\n file: fileOrUrl,\n filename,\n };\n }\n\n if (fileOrUrl.name == null) {\n throw new Error('Could not determine filename');\n }\n\n const extension = fileOrUrl.name.split('.').at(-1);\n\n if (extension == null) {\n throw new Error(`File has no extension: ${fileOrUrl.name}`);\n }\n\n return {\n configuration: config,\n extension,\n file: fileOrUrl,\n filename: fileOrUrl.name,\n };\n}\n\n/**\n * Loads a file and creates its Dataset.\n *\n * @param fileOrUrl - File to load\n * @returns Created objects\n * @throws `Error` if file cannot be imported (unsupported, etc.)\n */\nasync function importFile(\n fileOrUrl: File | string,\n config: Readonly<Configuration>,\n): Promise<Dataset> {\n const context = getLoaderContext(fileOrUrl, config);\n\n const loader = selectLoader(context.filename);\n\n if (loader == null) {\n throw new Error(`File format ${context.extension} not supported`);\n }\n\n const datasetConfig: DatasetConfig = await loader(context);\n\n // Reserve promise usage for future (e.g. autodetecting format based on content, etc.)\n return Promise.resolve(new Dataset(datasetConfig));\n}\n\nfunction selectLoader(filename: string): LoadDatasetFromFile | null {\n const keys = Object.keys(loaders);\n\n for (const key of keys) {\n // Note that we use suffix-based checking rather than pure file extensions because\n // some files have \"double\" extensions, such as \".geo.json\", or \".copc.laz\",\n // where technically the extension is just \".json\" or \".laz\".\n if (filename.endsWith(key)) {\n return loaders[key];\n }\n }\n\n return null;\n}\n\n/**\n * Registers a custom loader for a specific file extension.\n * If a loader for the same extension exists, it is replaced by the new one.\n * @param fileExtension - The file extension, without the dot.\n * @param loader - The loader to use.\n */\nexport function registerLoader(fileExtension: string, loader: LoadDatasetFromFile): void {\n if (loaders[fileExtension] != null) {\n console.warn(`replacing loader for file extension '.${fileExtension}'`);\n }\n\n loaders[fileExtension] = loader;\n}\n\nexport default {\n importFile,\n};\n","import type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type Shape from '@giro3d/giro3d/entities/Shape';\nimport type { ShapePickResult } from '@giro3d/giro3d/entities/Shape';\n\nimport { isShapePickResult } from '@giro3d/giro3d/entities/Shape';\nimport { Color } from 'three';\n\nimport type { MeasureUserData } from '@/giro3d/Measure3D';\nimport type { PieroShapeUserData } from '@/types/Annotation';\n\nexport type ClearHighlightFn = () => void;\nexport type HighlightFn = (obj: PickResult) => ClearHighlightFn | null;\n\nexport const customHighlighters: HighlightFn[] = [];\n\nexport default class Highlighter {\n private _clearHighlight: (() => void) | null = null;\n\n public clear(): void {\n if (this._clearHighlight) {\n this._clearHighlight();\n this._clearHighlight = null;\n }\n }\n\n public dispose(): void {\n this.clear();\n }\n\n public highlightFromPick(pick: PickResult): void {\n this.clear();\n\n if (!pick.entity) {\n return;\n }\n\n if (isShapePickResult(pick)) {\n this.highlightShape(pick);\n }\n\n for (const highlighter of customHighlighters) {\n const clearHighlight = highlighter(pick);\n if (clearHighlight) {\n this._clearHighlight = clearHighlight;\n }\n }\n }\n\n private highlightShape(pick: ShapePickResult): void {\n const shape = pick.entity as Shape<MeasureUserData | PieroShapeUserData>;\n\n if (shape.userData.highlightable) {\n const previousColor = new Color(shape.color);\n shape.color = shape.userData.highlightColor;\n shape.instance.notifyChange();\n\n this._clearHighlight = (): void => {\n shape.color = previousColor;\n shape.instance.notifyChange();\n };\n }\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport type ElevationLayer from '@giro3d/giro3d/core/layer/ElevationLayer';\nimport type MaskLayer from '@giro3d/giro3d/core/layer/MaskLayer';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\n\nimport { type Component } from 'vue';\n\nimport type { Configuration } from '@/configuration/configuration';\nimport type { Dataset } from '@/configuration/dataset';\nimport type { HighlightFn } from '@/services/Highlighter';\nimport type { AttributeExtractorFn } from '@/services/picking';\nimport type { DatasetStore } from '@/stores/datasets';\nimport type { DatasetOrGroup } from '@/types/Dataset';\n\nimport { datasetIcons, datasetTitles, propertyViews } from '@/components/Configuration';\nimport { registerBuilder } from '@/giro3d/DatasetBuilder';\nimport { registerLoader } from '@/loaders/loader';\nimport { customHighlighters } from '@/services/Highlighter';\nimport { customAttributeExtractors } from '@/services/picking';\n\nexport type DatasetActionRegistrationParams = {\n /**\n * The action to execute on the dataset.\n */\n action: (dataset: DatasetOrGroup) => void;\n /**\n * The icon to display for the action.\n */\n icon: string;\n /**\n * If true, the action becomes available only when the dataset is pre-loaded.\n */\n mustBePreloaded?: boolean;\n /**\n * If true, the action becomes available only when the dataset is visible.\n */\n mustBeVisible?: boolean;\n /**\n * A predicate to filter on which datasets this action applies. By default it applies to all datasets.\n */\n predicate?: (dataset: DatasetOrGroup) => boolean;\n /**\n * The title of the button.\n */\n title: string;\n};\n\n/**\n * APIs to manipulate datasets.\n */\nexport interface DatasetApi {\n registerDatasetAction(params: DatasetActionRegistrationParams): void;\n /**\n * Register a new dataset type.\n */\n registerDatasetType(\n /**\n * The unique key to identify this dataset type.\n * @example 'ifc'\n */\n key: string,\n params: DatasetRegistrationParams,\n ): void;\n}\n\nexport interface DatasetBuildContext {\n dataset: Dataset;\n instance: Instance;\n}\n\nexport type DatasetBuilder = (context: DatasetBuildContext) => Promise<DatasetBuildResult>;\n\nexport interface DatasetBuildResult {\n /**\n * The entities created from the dataset.\n */\n entities?: Entity3D[];\n /**\n * The map layers created from the dataset, to be added to the basemap.\n */\n layers?: (ColorLayer | ElevationLayer | MaskLayer)[];\n}\n\n/**\n * Parameters to register a new Dataset type.\n */\nexport type DatasetRegistrationParams = {\n /**\n * Custom function to extract attribute from a picked object.\n */\n attributeExtractor?: AttributeExtractorFn;\n /**\n * The function to build graphical objects (entities and layers) from a dataset.\n */\n builder: DatasetBuilder;\n /**\n * The list of supported extensions (without the leading dot). When a file with a supported extension is imported,\n * the appropriate loader will be used. If undefined, this dataset cannot be imported\n * from a local file (for example by drag and drop).\n * @example ['csv', 'dsv', 'tsv']\n */\n fileExtensions?: string[];\n /**\n * Custom highlighter for this dataset.\n */\n highlight?: HighlightFn;\n /**\n * The optional icon to use\n * @example 'bi-building'\n */\n icon?: string;\n /**\n * The function to load a dataset from a file, if supported.\n */\n loader?: LoadDatasetFromFile;\n /**\n * The dataset display name.\n * @example 'IFC'\n */\n name?: string;\n /**\n * An optional custom property view.\n */\n propertyView?: Component;\n};\n\nexport type LoadDatasetFromFile = (context: LoaderContext) => Promise<Dataset>;\n\nexport type LoaderContext = {\n configuration: Configuration;\n extension: string;\n file: File | string;\n filename: string;\n};\n\n/** @internal */\nexport class DatasetApiImpl implements DatasetApi {\n public constructor(private readonly store: DatasetStore) {}\n\n public registerDatasetAction(params: DatasetActionRegistrationParams): void {\n this.store.registerCustomAction(params);\n }\n\n public registerDatasetType(datasetType: string, params: DatasetRegistrationParams): void {\n if (params.icon != null) {\n datasetIcons[datasetType] = params.icon;\n }\n if (params.name != null) {\n datasetTitles[datasetType] = params.name;\n }\n if (params.highlight) {\n customHighlighters.push(params.highlight);\n }\n\n registerBuilder(datasetType, params.builder);\n\n if (params.fileExtensions) {\n if (params.loader == null) {\n console.warn(\n `File extensions have been specified for dataset ${datasetType}, but no loader function has been provided.`,\n );\n } else {\n for (const extension of params.fileExtensions) {\n registerLoader(extension, params.loader);\n }\n }\n }\n\n if (params.propertyView) {\n propertyViews.set(datasetType, params.propertyView);\n }\n\n if (params.attributeExtractor) {\n customAttributeExtractors.push(params.attributeExtractor);\n }\n }\n}\n","import Fetcher from '@/utils/Fetcher';\n\n/**\n * Info on a file.\n * Inspired by loaders.gl LoaderContext\n */\nexport interface FetchContext {\n /** Full URL of the resource (without query string) */\n baseUrl: string;\n /** Directory name (`baseUrl` up to the filename) */\n dirname: string;\n /** File extension */\n fileext?: string;\n /** Filename */\n filename: string;\n /** Query string (beginning with the leading `?` character) */\n queryString?: string;\n}\n\nexport interface HttpApi {\n getContext(url: string, options?: RequestInit): FetchContext;\n getJson<T extends object>(url: UrlOrData, options?: RequestInit): Promise<T>;\n getText(url: UrlOrData, options?: RequestInit): Promise<string>;\n}\n\n/** URL to load or Blob (drag-and-drop) */\nexport type UrlOrData = Blob | string;\n\n/** URL to load, or Response (already loaded), or Blob (drag-and-drop) */\nexport type UrlOrFetchedData = Blob | Response | string;\n\n/** @internal */\nexport class HttpApiImpl implements HttpApi {\n public getContext(url: UrlOrFetchedData): FetchContext {\n return Fetcher.getContext(url);\n }\n\n public getJson<T extends object>(url: Blob | string, options?: RequestInit): Promise<T> {\n return Fetcher.fetchJson<T>(url, options);\n }\n\n public getText(url: Blob | string, options?: RequestInit): Promise<string> {\n return Fetcher.fetchText(url, options);\n }\n}\n","import type { NotificationStore } from '@/stores/notifications';\n\nexport interface Notification {\n level: NotificationLevel;\n text: string;\n title: string;\n}\n\n/**\n * Provides access to the notification system.\n */\nexport interface NotificationApi {\n /**\n * Pushes an error notification to the user.\n * @param title - The notification title.\n * @param message - The optional notification message.\n */\n error(title: string, message?: string): void;\n\n /**\n * Pushes a info notification to the user.\n * @param title - The notification title.\n * @param message - The optional notification message.\n */\n info(title: string, message?: string): void;\n\n /**\n * Pushes a notification to the user.\n * @param notification - The notification.\n */\n push(notification: Notification): void;\n\n /**\n * Pushes a success notification to the user.\n * @param title - The notification title.\n * @param message - The optional notification message.\n */\n success(title: string, message?: string): void;\n\n /**\n * Pushes a warning notification to the user.\n * @param title - The notification title.\n * @param message - The optional notification message.\n */\n warning(title: string, message?: string): void;\n}\n\nexport type NotificationLevel = 'error' | 'info' | 'success' | 'warning';\n\n/** @internal */\nexport class NotificationApiImpl implements NotificationApi {\n public constructor(private readonly store: NotificationStore) {}\n\n public error(title: string, message?: string): void {\n this.push({\n level: 'error',\n text: message ?? '',\n title,\n });\n }\n\n public info(title: string, message?: string): void {\n this.push({\n level: 'info',\n text: message ?? '',\n title,\n });\n }\n\n public push(notification: Notification): void {\n this.store.push(notification);\n }\n\n public success(title: string, message?: string): void {\n this.push({\n level: 'success',\n text: message ?? '',\n title,\n });\n }\n\n public warning(title: string, message?: string): void {\n this.push({\n level: 'warning',\n text: message ?? '',\n title,\n });\n }\n}\n","import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n\nimport type { SearchStore } from '@/stores/search';\n\nexport interface LocationSearchResult extends SearchResult {\n coordinates: Coordinates;\n}\n\nexport interface SearchApi {\n registerProvider(provider: SearchProvider): void;\n}\n\nexport interface SearchProvider<T extends SearchResult = SearchResult> {\n /**\n * The name of the provider, as displayed in the search results.\n */\n name: string;\n /**\n * Executes a search for the specified query string.\n */\n search(query: string): Promise<T[]>;\n}\n\nexport interface SearchResult {\n /**\n * The label to display in the search results.\n */\n label: string;\n /**\n * The search provider used to perform the search.\n */\n provider: SearchProvider;\n}\n\n/** @internal */\nexport class SearchApiImpl implements SearchApi {\n public constructor(private readonly searchStore: SearchStore) {}\n\n public registerProvider(provider: SearchProvider): void {\n this.searchStore.registerProvider(provider);\n }\n}\n\nexport function isLocationSearchResult(result: SearchResult): result is LocationSearchResult {\n return (result as LocationSearchResult).coordinates instanceof Coordinates;\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Map from '@giro3d/giro3d/entities/Map';\n\nimport { isEntity3D } from '@giro3d/giro3d/entities/Entity3D';\nimport { Box3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\nimport type SceneCursorManager from '@/services/SceneCursorManager';\n\nexport interface ViewApi {\n getBasemap(): Map;\n getBoundingBox(): Box3;\n getCameraController(): CameraController;\n getInstance(): Instance;\n getSceneCursorManager(): SceneCursorManager;\n}\n\n/** @internal */\nexport class ViewApiImpl implements ViewApi {\n private readonly _basemap: Map;\n private readonly _cameraController: CameraController;\n private readonly _instance: Instance;\n private readonly _sceneCursorManager: SceneCursorManager;\n\n public constructor(params: {\n basemap: Map;\n camera: CameraController;\n instance: Instance;\n sceneCursorManager: SceneCursorManager;\n }) {\n this._basemap = params.basemap;\n this._cameraController = params.camera;\n this._instance = params.instance;\n this._sceneCursorManager = params.sceneCursorManager;\n }\n\n public getBasemap(): Map {\n return this._basemap;\n }\n\n public getBoundingBox(): Box3 {\n const entities = this._instance.getEntities();\n const bbox = new Box3().makeEmpty();\n\n for (const entity of entities) {\n if (isEntity3D(entity)) {\n const entityBox = entity.getBoundingBox();\n if (entityBox != null) {\n bbox.union(entityBox);\n }\n }\n }\n\n return bbox;\n }\n\n public getCameraController(): CameraController {\n return this._cameraController;\n }\n\n public getInstance(): Instance {\n return this._instance;\n }\n\n public getSceneCursorManager(): SceneCursorManager {\n return this._sceneCursorManager;\n }\n}\n","import type { Component } from 'vue';\n\nimport type { PieroContext } from '@/context';\nimport type { WidgetStore } from '@/stores/widgets';\n\nexport interface Widget {\n component: Component<WidgetProps>;\n id: string;\n}\n\nexport interface WidgetApi {\n addWidget(widget: Widget): void;\n}\n\nexport interface WidgetProps {\n context: PieroContext;\n}\n\n/** @internal */\nexport class WidgetApiImpl implements WidgetApi {\n public constructor(private readonly store: WidgetStore) {}\n\n public addWidget(widget: Widget): void {\n this.store.addWidget(widget);\n }\n}\n","import z from 'zod';\n\nexport const EulerOrientation = z.tuple([z.number(), z.number(), z.number()]);\nexport type EulerOrientation = z.infer<typeof EulerOrientation>;\nz.globalRegistry.add(EulerOrientation, { id: 'EulerOrientation' });\n","import { EventDispatcher } from 'three';\n\nimport type Bookmark from './types/Bookmark';\nimport type { Dataset, DatasetOrGroup } from './types/Dataset';\n\nexport interface BookmarkEvents {\n 'bookmark-added': PayloadEvent<Bookmark>;\n 'bookmark-removed': PayloadEvent<Bookmark>;\n}\n\nexport interface DatasetEvents {\n 'dataset-added': PayloadEvent<DatasetOrGroup>;\n 'dataset-opacity-changed': PayloadEvent<Dataset>;\n 'dataset-removed': PayloadEvent<DatasetOrGroup>;\n 'dataset-visibility-changed': PayloadEvent<DatasetOrGroup>;\n}\n\n/**\n * An event with a payload.\n */\nexport type PayloadEvent<T> = { value: T };\n\n/**\n * An event with no argument.\n */\nexport type PieroEmptyEvent = unknown;\n\nexport type PieroEvents = BookmarkEvents & DatasetEvents & PieroGlobalEvents & ViewEvents;\n\nexport interface PieroGlobalEvents {\n /**\n * Raised when the application has finished loading.\n */\n ready: PieroEmptyEvent;\n}\n\nexport interface ViewEvents {\n /**\n * Raised when the main view has been updated.\n */\n updated: PieroEmptyEvent;\n}\n\nexport const GLOBAL_EVENT_DISPATCHER = new EventDispatcher<PieroEvents>();\n","import { defineStore } from 'pinia';\nimport { computed, reactive, ref } from 'vue';\n\nimport type Annotation from '@/types/Annotation';\nimport type AnnotationMode from '@/types/AnnotationMode';\n\nexport const useAnnotationStore = defineStore('annotations', () => {\n const annotations = reactive<Annotation[]>([]) as Annotation[];\n const annotationMode = ref<AnnotationMode>('normal');\n const count = computed(() => annotations.length);\n const _isUserDrawing = ref<boolean>(false);\n const _showLabels = ref<boolean>(true);\n\n function isUserDrawing(): boolean {\n return _isUserDrawing.value;\n }\n\n function showLabels(): boolean {\n return _showLabels.value;\n }\n\n function setShowLabels(v: boolean): void {\n _showLabels.value = v;\n }\n\n function setIsUserDrawing(value: boolean): void {\n _isUserDrawing.value = value;\n }\n\n function getAnnotationMode(): AnnotationMode {\n return annotationMode.value;\n }\n\n function setAnnotationMode(mode: AnnotationMode): void {\n annotationMode.value = mode;\n }\n\n function getAnnotations(): Annotation[] {\n return annotations;\n }\n\n function remove(annotation: Annotation): void {\n annotations.splice(annotations.indexOf(annotation), 1);\n }\n\n function createPoint(): void {\n // Nothing to do.\n }\n\n function createLine(): void {\n // Nothing to do.\n }\n\n function createPolygon(): void {\n // Nothing to do.\n }\n\n function add(annotation: Annotation): void {\n annotations.push(annotation);\n }\n\n function hasAnnotation(name: string): boolean {\n return annotations.some(m => m.title === name);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function edit(annotation: Annotation): void {\n // Nothing to do.\n }\n\n function stopEdition(): void {\n // Nothing to do.\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importAnnotationFile(file: Blob): void {\n // Nothing to do\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importAnnotationsFiles(files: File[]): void {\n // Nothing to do\n }\n\n return {\n add,\n count,\n createLine,\n createPoint,\n createPolygon,\n edit,\n getAnnotationMode,\n getAnnotations,\n hasAnnotation,\n importAnnotationFile,\n importAnnotationsFiles,\n isUserDrawing,\n remove,\n setAnnotationMode,\n setIsUserDrawing,\n setShowLabels,\n showLabels,\n stopEdition,\n };\n});\n","import { defineStore } from 'pinia';\n\nimport type { Notification } from '@/api/notifications';\n\nexport const useNotificationStore = defineStore('notifications', () => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function push(notification: Notification): void {\n // Nothing to store.\n // We rely on automatic event by Pinia to notify listener about the notification.\n }\n\n return { push };\n});\n\nexport type NotificationStore = ReturnType<typeof useNotificationStore>;\n","import type Shape from '@giro3d/giro3d/entities/Shape';\nimport type { ColorRepresentation } from 'three';\n\nimport { EventDispatcher, MathUtils } from 'three';\n\nimport Download from '@/utils/Download';\n\nimport type { AnnotationType } from '../configuration/annotation';\n\ntype AnnotationEventMap = {\n isEditing: EmptyEvent;\n visible: EmptyEvent;\n};\n\ntype EmptyEvent = {\n /** empty */\n};\n\nexport type PieroShapeUserData = {\n annotation?: Annotation;\n highlightable: boolean;\n highlightColor: ColorRepresentation;\n measurements: {\n area?: number | null;\n minmax: [number, number];\n perimeter?: number | null;\n };\n type: AnnotationType;\n};\n\nexport default class Annotation extends EventDispatcher<AnnotationEventMap> {\n public properties: object;\n public readonly title: string;\n public readonly type: AnnotationType;\n public readonly uuid: string;\n\n public get isEditing(): boolean {\n return this._isEditing;\n }\n\n public set isEditing(v: boolean) {\n this._isEditing = v;\n this.dispatchEvent({ type: 'isEditing' });\n }\n\n public get object(): Shape<PieroShapeUserData> {\n return this._object();\n }\n\n public get visible(): boolean {\n return this._visible;\n }\n\n public set visible(v: boolean) {\n this._visible = v;\n this.dispatchEvent({ type: 'visible' });\n }\n\n private _isEditing: boolean;\n\n private _object: () => Shape<PieroShapeUserData>;\n\n private _visible: boolean;\n\n public constructor(\n title: string,\n object: () => Shape<PieroShapeUserData>,\n type: AnnotationType,\n properties: object = {},\n ) {\n super();\n\n this.type = type;\n this.title = title;\n this._visible = true;\n this._isEditing = false;\n this._object = object;\n this.properties = properties;\n this.uuid = MathUtils.generateUUID();\n }\n\n public static toCollection(annotations: Annotation[]): GeoJSON.FeatureCollection {\n const features = annotations.map(annotation => annotation.toGeoJSON());\n\n return {\n features,\n type: 'FeatureCollection',\n // @ts-expect-error GeoJSON spec does not allow properties on FeatureCollection\n // But OWC requires it Oo\n id: `${Download.getBaseUrl()}#${MathUtils.generateUUID()}`,\n properties: {\n creator: 'Giro3D',\n generator: {\n title: 'Giro3D',\n uri: Download.getBaseUrl(),\n },\n lang: 'en',\n links: [\n {\n href: 'http://www.opengis.net/spec/owc-atom/1.0/req/core',\n rel: 'profile',\n title: 'This file is compliant with version 1.0 of OGC Context',\n },\n ],\n title: 'Giro3D annotations',\n updated: new Date().toISOString(),\n },\n };\n }\n\n public toGeoJSON(): GeoJSON.Feature {\n const geojson = this.object.toGeoJSON({\n includeAltitudes: true,\n });\n\n geojson.id = `${Download.getBaseUrl()}#${this.uuid}`;\n geojson.properties = {\n ...geojson.properties,\n title: this.title,\n updated: new Date().toISOString(),\n };\n\n return geojson;\n }\n}\n","import type Shape from '@giro3d/giro3d/entities/Shape';\nimport type { Vector3 } from 'three';\n\nfunction getMinMaxAltitudes(coordsOrDrawing: Shape | Vector3[]): [number, number] {\n let min = +Infinity;\n let max = -Infinity;\n\n let points: Readonly<Vector3[]>;\n\n if (Array.isArray(coordsOrDrawing)) {\n points = coordsOrDrawing;\n } else {\n points = coordsOrDrawing.points;\n }\n\n for (let i = 0; i < points.length; i += 1) {\n min = Math.min(min, points[i].z);\n max = Math.max(max, points[i].z);\n }\n\n return [min, max];\n}\n\nexport default { getMinMaxAltitudes };\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type {\n SegmentLabelFormatter,\n SurfaceLabelFormatter,\n VertexLabelFormatter,\n} from '@giro3d/giro3d/entities/Shape';\nimport type { CreationOptions } from '@giro3d/giro3d/interactions/DrawTool';\nimport type View from '@giro3d/giro3d/renderer/View';\nimport type { Geometry, Position } from 'geojson';\nimport type { Vector2 } from 'three';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport { isMapPickResult } from '@giro3d/giro3d/core/picking/PickTilesAt';\nimport Shape, { isShapePickResult } from '@giro3d/giro3d/entities/Shape';\nimport DrawTool, {\n afterRemovePointOfRing,\n afterUpdatePointOfRing,\n inhibitHook,\n limitRemovePointHook,\n} from '@giro3d/giro3d/interactions/DrawTool';\nimport { MathUtils, Vector3 } from 'three';\n\nimport type { AnnotationType } from '@/configuration/annotation';\nimport type CameraController from '@/services/CameraController';\nimport type Picker from '@/services/picking';\nimport type { PieroShapeUserData } from '@/types/Annotation';\n\nimport { getConfig } from '@/configurationLoader';\nimport { DEFAULT_SHAPE_COLOR, EDIT_SHAPE_COLOR, SHAPE_POINT_RADIUS } from '@/constants';\nimport { useAnnotationStore } from '@/stores/annotations';\nimport { useNotificationStore } from '@/stores/notifications';\nimport Annotation from '@/types/Annotation';\nimport { toGiro3DCoordinates } from '@/utils/Configuration';\nimport Measure from '@/utils/Measure';\n\nfunction promptTitle(defaultValue: string): string | null {\n return window.prompt('Annotation name', defaultValue);\n}\n\nconst numberFormat = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 1,\n});\n\nconst areaFormatter: SurfaceLabelFormatter = values => {\n let area = values.area;\n\n let unit = 'm²';\n if (area > 1_000_000) {\n area = area / 1_000_000;\n unit = 'km²';\n }\n\n return `${numberFormat.format(area)} ${unit}`;\n};\n\nconst tmpStart = new Vector3();\nconst tmpEnd = new Vector3();\n\nfunction getAnnoationTypeFromGeoJSONGeometry(geom: Geometry): AnnotationType {\n switch (geom.type) {\n case 'LineString':\n return 'linestring';\n case 'MultiPoint':\n return 'multipoint';\n case 'Point':\n return 'point';\n case 'Polygon':\n return 'polygon';\n default:\n throw new Error('invalid annotation geometry');\n }\n}\n\nconst lengthFormatter: (view: View) => SegmentLabelFormatter = (view: View) => values => {\n const { camera } = view;\n const { end, start } = values;\n\n const ndcStart = tmpStart.copy(start).project(camera);\n const ndcEnd = tmpEnd.copy(end).project(camera);\n\n const sqLimit = Math.pow(100 / view.width, 2); // pixels\n\n const distanceOnScreen = ndcStart.distanceToSquared(ndcEnd);\n\n // Don't display the label if the segment is too short on the screen\n if (distanceOnScreen < sqLimit) {\n return null;\n }\n\n let length = values.length;\n\n if (length == null || length <= 0) {\n return null;\n }\n\n let unit = 'm';\n if (length > 1_000) {\n length = length / 1_000;\n unit = 'km';\n }\n\n return `${numberFormat.format(length)} ${unit}`;\n};\n\nconst pointFormatter: VertexLabelFormatter = values => {\n const shape = values.shape as Shape<PieroShapeUserData>;\n if (shape.userData.annotation) {\n return shape.userData.annotation.title;\n }\n\n return null;\n};\n\nexport default class AnnotationManager {\n private readonly _boundExitEdition: (e: MouseEvent) => void;\n private readonly _boundOnEndDrag: () => void;\n private readonly _boundOnKeyDown: (e: KeyboardEvent) => void;\n private readonly _boundOnStartDrag: () => void;\n private readonly _boundUpdateLabels: () => void;\n private readonly _drawTool: DrawTool;\n private _editedShape: Shape<PieroShapeUserData> | null = null;\n private _editedShapePreviousPoints: Vector3[] | null = null;\n private readonly _instance: Instance;\n private _isEditing = false;\n private readonly _notificationStore = useNotificationStore();\n\n private readonly _picker: Picker;\n private readonly _shapes: Map<string, Shape<PieroShapeUserData>> = new Map();\n private readonly _store = useAnnotationStore();\n\n public constructor(instance: Instance, camera: CameraController, picker: Picker) {\n this._instance = instance;\n this._picker = picker;\n this._drawTool = new DrawTool({ instance });\n\n // FIXME this would override whatever setting is currently\n // present (depending on navigation modes)\n this._boundOnEndDrag = (): void => {\n camera.enabled = true;\n };\n this._boundOnStartDrag = (): void => {\n camera.enabled = false;\n };\n\n this._boundUpdateLabels = this.updateLabels.bind(this);\n this._boundExitEdition = (): void => {\n this._instance.domElement.removeEventListener('contextmenu', this._boundExitEdition);\n this.stopEdition(false);\n };\n\n // We want to prevent moving the camera while dragging a point\n this._drawTool.addEventListener('start-drag', this._boundOnStartDrag);\n this._drawTool.addEventListener('end-drag', this._boundOnEndDrag);\n\n this._boundOnKeyDown = this.onKeyDown.bind(this);\n document.addEventListener('keydown', this._boundOnKeyDown);\n\n this._instance.addEventListener('after-camera-update', this._boundUpdateLabels);\n\n this._store.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'createLine':\n this.drawLine();\n break;\n case 'createPoint':\n this.drawPoint();\n break;\n case 'createPolygon':\n this.drawPolygon();\n break;\n case 'edit':\n this.editAnnotation(args[0]);\n break;\n case 'importAnnotationFile':\n void this.importAnnotationFile(args[0]);\n break;\n case 'importAnnotationsFiles':\n void this.importAnnotationFiles(args[0]);\n break;\n case 'remove':\n this.deleteAnnotation(args[0]);\n break;\n case 'setShowLabels':\n this.udpateLabelVisibility(args[0]);\n break;\n case 'stopEdition':\n this.stopEdition(false);\n break;\n }\n });\n });\n\n this.loadAnnotationsFromConfiguration();\n }\n\n public dispose(): void {\n document.removeEventListener('keydown', this._boundOnKeyDown);\n\n this._drawTool.removeEventListener('start-drag', this._boundOnStartDrag);\n this._drawTool.removeEventListener('end-drag', this._boundOnEndDrag);\n\n this._instance.removeEventListener('after-camera-update', this._boundUpdateLabels);\n\n this._shapes.forEach(shape => this._instance.remove(shape));\n this._drawTool.dispose();\n }\n\n public pushNewAnnotation(\n title: string,\n type: AnnotationType,\n shape: Shape<PieroShapeUserData>,\n properties: object = {},\n ): Annotation {\n const annotation = new Annotation(title, () => shape, type, properties);\n shape.userData.annotation = annotation;\n annotation.addEventListener('visible', () => this.updateDrawing(annotation));\n this._store.add(annotation);\n this._shapes.set(annotation.uuid, shape);\n return annotation;\n }\n\n private addShape(\n shape: Shape<PieroShapeUserData> | null,\n type: PieroShapeUserData['type'],\n defaultName: string,\n ): void {\n if (shape && !this._shapes.has(shape.id)) {\n const userData = shape.userData;\n userData.type = type;\n userData.highlightable = true;\n\n let title = defaultName;\n if (this._store.hasAnnotation(title)) {\n for (let i = 1; i < 1000; i += 1) {\n title = `${defaultName} (${i})`;\n if (!this._store.hasAnnotation(title)) {\n break;\n }\n }\n if (this._store.hasAnnotation(title)) {\n title = 'Achievement unlocked: 1000 annotations with default name';\n }\n }\n const name = promptTitle(title);\n if (name != null) {\n this.computeMeasurements(shape);\n const annotation = this.pushNewAnnotation(name, type, shape);\n this._shapes.set(annotation.uuid, shape);\n } else {\n this._instance.remove(shape);\n }\n }\n }\n\n private computeMeasurements(shape: Shape<PieroShapeUserData>): void {\n shape.userData.measurements = {\n minmax: Measure.getMinMaxAltitudes(shape),\n };\n\n if (shape.userData.type === 'polygon' || shape.userData.type === 'linestring') {\n shape.userData.measurements.perimeter = shape.getLength();\n }\n if (shape.userData.type === 'polygon') {\n shape.userData.measurements.area = shape.getArea();\n }\n }\n\n private createLineStringShape(points: Vector3[]): Shape<PieroShapeUserData> {\n const result = new Shape<PieroShapeUserData>({\n beforeRemovePoint: limitRemovePointHook(2),\n color: DEFAULT_SHAPE_COLOR,\n segmentLabelFormatter: lengthFormatter(this._instance.view),\n showLine: true,\n showSegmentLabels: true,\n showVertexLabels: false,\n showVertices: true,\n });\n result.setPoints(points);\n return result;\n }\n\n private createMultiPointShape(points: Vector3[]): Shape<PieroShapeUserData> {\n const result = new Shape<PieroShapeUserData>({\n beforeRemovePoint: limitRemovePointHook(1),\n color: DEFAULT_SHAPE_COLOR,\n showLine: false,\n showVertexLabels: true,\n showVertices: true,\n vertexLabelFormatter: pointFormatter,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n result.setPoints(points);\n return result;\n }\n\n private createPointShape(point: Vector3): Shape<PieroShapeUserData> {\n const result = new Shape<PieroShapeUserData>({\n beforeRemovePoint: inhibitHook,\n color: DEFAULT_SHAPE_COLOR,\n showLine: false,\n showVertexLabels: true,\n showVertices: true,\n vertexLabelFormatter: pointFormatter,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n result.setPoints([point]);\n\n return result;\n }\n\n private createPolygonShape(points: Vector3[]): Shape<PieroShapeUserData> {\n const result = new Shape<PieroShapeUserData>({\n afterRemovePoint: afterRemovePointOfRing,\n afterUpdatePoint: afterUpdatePointOfRing,\n beforeRemovePoint: limitRemovePointHook(4), // We take into account the doubled first/last point\n color: DEFAULT_SHAPE_COLOR,\n showLine: true,\n showSurface: true,\n showSurfaceLabel: true,\n showVertexLabels: false,\n showVertices: true,\n surfaceLabelFormatter: areaFormatter,\n });\n result.setPoints(points);\n return result;\n }\n\n private deleteAnnotation(annotation: Annotation): void {\n if (this._shapes.has(annotation.uuid)) {\n const shape = annotation.object;\n this._instance.remove(shape);\n this._shapes.delete(annotation.uuid);\n }\n }\n\n private draw(\n drawFn: 'createLineString' | 'createPoint' | 'createPolygon',\n type: PieroShapeUserData['type'],\n defaultName: string,\n opts: Partial<CreationOptions>,\n ): void {\n this._store.setIsUserDrawing(true);\n\n void this._drawTool[drawFn]({\n ...this.getCreationOptions(),\n ...opts,\n })\n .then(shape => {\n this.addShape(shape as Shape<PieroShapeUserData>, type, defaultName);\n })\n .finally(() => this._store.setIsUserDrawing(false));\n }\n\n private drawLine(): void {\n this.draw('createLineString', 'linestring', 'New line annotation', {\n segmentLabelFormatter: lengthFormatter(this._instance.view),\n showSegmentLabels: this._store.showLabels(),\n });\n }\n\n private drawPoint(): void {\n this.draw('createPoint', 'point', 'New point annotation', {\n borderWidth: 3,\n showVertexLabels: this._store.showLabels(),\n vertexLabelFormatter: pointFormatter,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n }\n\n private drawPolygon(): void {\n this.draw('createPolygon', 'polygon', 'New polygon annotation', {\n showSurfaceLabel: this._store.showLabels(),\n surfaceLabelFormatter: areaFormatter,\n });\n }\n\n private editAnnotation(annotation: Annotation): void {\n const shape = this._shapes.get(annotation.uuid);\n\n if (!shape) {\n console.warn(`no shape found for annotation ${annotation.uuid}`);\n return;\n }\n\n this._editedShape = shape;\n this._editedShapePreviousPoints = [...shape.points];\n\n annotation.isEditing = true;\n\n shape.color = EDIT_SHAPE_COLOR;\n shape.userData.highlightable = false;\n\n this._instance.notifyChange(shape);\n\n this._store.setIsUserDrawing(true);\n\n this._instance.domElement.addEventListener('contextmenu', this._boundExitEdition);\n\n this._isEditing = true;\n this._drawTool.enterEditMode({\n pick: this.pick.bind(this),\n shapesToEdit: [shape],\n });\n }\n\n private filterPickResults(results: PickResult[], edition: boolean): PickResult[] {\n if (!edition) {\n // Avoid picking shapes in creation mode\n return results.filter(res => !isShapePickResult(res));\n }\n\n return results;\n }\n\n private getCreationOptions(): CreationOptions {\n return {\n color: DEFAULT_SHAPE_COLOR,\n pick: this.pick.bind(this),\n };\n }\n\n private async importAnnotation(\n feature: GeoJSON.Feature,\n skipNames: Set<string>,\n ): Promise<boolean> {\n if (feature.properties == null || typeof feature.properties !== 'object') {\n feature.properties = {};\n }\n if (feature.properties.title == null) {\n feature.properties.title = MathUtils.generateUUID();\n }\n\n if (skipNames.has(feature.properties.title)) {\n return false;\n }\n\n const shape = await this.importShapeFromGeoJSON(feature);\n const type = getAnnoationTypeFromGeoJSONGeometry(feature.geometry);\n this.pushNewAnnotation(feature.properties.title, type, shape, feature.properties);\n return true;\n }\n\n private async importAnnotationFile(file: Blob): Promise<void> {\n const existingAnnotations = new Set(this._store.getAnnotations().map(m => m.title));\n try {\n const { nbImported, nbSkipped } = await this.importBlob(file, existingAnnotations);\n this._notificationStore.push({\n level: 'success',\n text: `${nbImported} annotations imported (${nbSkipped} skipped)`,\n title: 'Annotations',\n });\n } catch (e: unknown) {\n console.error(e);\n this._notificationStore.push({\n level: 'warning',\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n text: `Could not import file: ${e}`,\n title: 'Annotations',\n });\n }\n }\n\n private async importAnnotationFiles(files: File[]): Promise<void> {\n const promises = [];\n let nbTotalImported = 0;\n let nbTotalSkipped = 0;\n const errors: string[] = [];\n\n const existingAnnotations = new Set(this._store.getAnnotations().map(m => m.title));\n\n for (const file of files) {\n promises.push(\n this.importBlob(file, existingAnnotations)\n .then(({ nbImported, nbSkipped }) => {\n nbTotalImported += nbImported;\n nbTotalSkipped += nbSkipped;\n })\n .catch(reason => {\n errors.push((reason as Error).message);\n }),\n );\n }\n await Promise.allSettled(promises);\n\n if (errors.length > 0) {\n this._notificationStore.push({\n level: 'warning',\n text: `${nbTotalImported} annotations imported (${nbTotalSkipped} skipped); ${errors.length} errors: ${errors}`,\n title: 'Annotations',\n });\n } else {\n this._notificationStore.push({\n level: 'success',\n text: `${nbTotalImported} annotations imported (${nbTotalSkipped} skipped)`,\n title: 'Annotations',\n });\n }\n }\n\n private async importBlob(\n file: Blob,\n skipNames: Set<string>,\n ): Promise<{ nbImported: number; nbSkipped: number }> {\n const str = await file.text();\n const geojson = JSON.parse(str) as GeoJSON.Feature | GeoJSON.FeatureCollection;\n\n const features = geojson.type === 'FeatureCollection' ? geojson.features : [geojson];\n\n let nbImported = 0;\n let nbSkipped = 0;\n\n for (const feature of features) {\n const imported = await this.importAnnotation(feature, skipNames);\n if (imported) {\n nbImported++;\n } else {\n nbSkipped++;\n }\n }\n return { nbImported, nbSkipped };\n }\n\n // Note this was directly imported from the drawtool example\n // We might want to make it part of the Shape API, but we have to think\n // about potential pitfalls as there is not a single mapping between GeoJSON and Shapes.\n private async importShapeFromGeoJSON(\n feature: GeoJSON.Feature,\n ): Promise<Shape<PieroShapeUserData>> {\n if (feature.type !== 'Feature') {\n throw new Error('not a valid GeoJSON feature');\n }\n\n const crs = 'EPSG:4326';\n\n const getPoint = (c: Position): Vector3 => {\n const coord = new Coordinates(crs, c[0], c[1], c[2] ?? 0);\n return coord.as(this._instance.referenceCrs, coord).toVector3();\n };\n\n let result: Shape<PieroShapeUserData>;\n\n switch (feature.geometry.type) {\n case 'LineString':\n result = this.createLineStringShape(feature.geometry.coordinates.map(getPoint));\n break;\n case 'MultiPoint':\n result = this.createMultiPointShape(feature.geometry.coordinates.map(getPoint));\n break;\n case 'Point':\n result = this.createPointShape(getPoint(feature.geometry.coordinates));\n break;\n case 'Polygon':\n result = this.createPolygonShape(feature.geometry.coordinates[0].map(getPoint));\n break;\n default:\n throw new Error(\n 'could not import shape from given GeoJSON geometry: ' + feature.geometry.type,\n );\n }\n\n this.computeMeasurements(result);\n\n await this._instance.add(result);\n\n return result;\n }\n\n // private async importAnnotation(\n // feature: GeoJSON.Feature,\n // skipNames: Set<string>,\n // ): Promise<boolean> {\n // if (feature.properties == null || typeof feature.properties !== 'object') {\n // feature.properties = {};\n // }\n // if (feature.properties.title == null) {\n // feature.properties.title = MathUtils.generateUUID();\n // }\n\n // if (skipNames.has(feature.properties.title)) {\n // return false;\n // }\n\n // const shape = await this.importShapeFromGeoJSON(feature);\n // this.pushNewAnnotation(feature.properties.title, shape, feature.properties);\n // return true;\n // }\n\n private loadAnnotationsFromConfiguration(): void {\n const config = getConfig();\n\n if (config.annotations == null) {\n return;\n }\n\n for (const conf of config.annotations) {\n const name = conf.title;\n\n switch (conf.type) {\n case 'point':\n const coord = toGiro3DCoordinates(conf.coordinate, config.scene.crs)\n .as(config.scene.crs)\n .toVector3();\n const shape = this.createPointShape(coord);\n shape.userData.type = 'point';\n\n this.computeMeasurements(shape);\n this.pushNewAnnotation(name, 'point', shape);\n this._instance.add(shape).catch(console.error);\n break;\n default:\n // TODO\n console.warn('not implemented');\n break;\n }\n }\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n if (e.code === 'Escape') {\n this.stopEdition(true);\n }\n }\n\n private pick(event: MouseEvent | Vector2): PickResult[] {\n let results: PickResult[];\n\n switch (this._store.getAnnotationMode()) {\n case 'mapOnly':\n results = this.pickMap(event);\n break;\n case 'normal':\n results = this.pickDefault(event);\n break;\n case 'objectsOnly':\n results = this.pickFeatures(event);\n break;\n }\n\n return results;\n }\n\n private pickDefault(event: MouseEvent | Vector2): PickResult[] {\n const results = this._instance.pickObjectsAt(event, { sortByDistance: true });\n\n return this.filterPickResults(results, this._isEditing);\n }\n\n private pickFeatures(event: MouseEvent | Vector2): PickResult[] {\n const results = this._picker.getObjectsAt(this._instance, event, 0) ?? [];\n\n return this.filterPickResults(results, this._isEditing);\n }\n\n private pickMap(event: MouseEvent | Vector2): PickResult[] {\n const results = this._instance.pickObjectsAt(event, {\n filter: res => isShapePickResult(res) || isMapPickResult(res),\n sortByDistance: true,\n });\n\n return this.filterPickResults(results, this._isEditing);\n }\n\n private stopEdition(restoreShape: boolean): void {\n this._drawTool.exitEditMode();\n this._isEditing = false;\n this._store.setIsUserDrawing(false);\n\n if (this._editedShape) {\n if (restoreShape && this._editedShapePreviousPoints) {\n this._editedShape.setPoints(this._editedShapePreviousPoints);\n this._editedShapePreviousPoints = null;\n }\n if (this._editedShape.userData.annotation != null) {\n this._editedShape.userData.annotation.isEditing = false;\n }\n this._editedShape.color = DEFAULT_SHAPE_COLOR;\n this._editedShape.userData.highlightable = true;\n this._editedShape = null;\n }\n }\n\n private udpateLabelVisibility(show: boolean): void {\n this._shapes.forEach(shape => {\n switch (shape.userData.type) {\n case 'linestring':\n shape.showSegmentLabels = show;\n break;\n case 'multipoint':\n case 'point':\n shape.showVertexLabels = show;\n break;\n case 'polygon':\n shape.showSurfaceLabel = show;\n break;\n }\n });\n }\n\n private updateDrawing(annotation: Annotation): void {\n annotation.object.visible = annotation.visible;\n annotation.object.traverse(o => (o.visible = annotation.visible));\n this._instance.notifyChange();\n }\n\n private updateLabels(): void {\n this._shapes.forEach(shape => {\n if (shape.visible) {\n shape.rebuildLabels();\n }\n });\n }\n}\n","/*!\n * camera-controls\n * https://github.com/yomotsu/camera-controls\n * (c) 2017 @yomotsu\n * Released under the MIT License.\n */\n// see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#value\nconst MOUSE_BUTTON = {\n LEFT: 1,\n RIGHT: 2,\n MIDDLE: 4,\n};\nconst ACTION = Object.freeze({\n NONE: 0b0,\n ROTATE: 0b1,\n TRUCK: 0b10,\n SCREEN_PAN: 0b100,\n OFFSET: 0b1000,\n DOLLY: 0b10000,\n ZOOM: 0b100000,\n TOUCH_ROTATE: 0b1000000,\n TOUCH_TRUCK: 0b10000000,\n TOUCH_SCREEN_PAN: 0b100000000,\n TOUCH_OFFSET: 0b1000000000,\n TOUCH_DOLLY: 0b10000000000,\n TOUCH_ZOOM: 0b100000000000,\n TOUCH_DOLLY_TRUCK: 0b1000000000000,\n TOUCH_DOLLY_SCREEN_PAN: 0b10000000000000,\n TOUCH_DOLLY_OFFSET: 0b100000000000000,\n TOUCH_DOLLY_ROTATE: 0b1000000000000000,\n TOUCH_ZOOM_TRUCK: 0b10000000000000000,\n TOUCH_ZOOM_OFFSET: 0b100000000000000000,\n TOUCH_ZOOM_SCREEN_PAN: 0b1000000000000000000,\n TOUCH_ZOOM_ROTATE: 0b10000000000000000000,\n});\nconst DOLLY_DIRECTION = {\n NONE: 0,\n IN: 1,\n OUT: -1,\n};\nfunction isPerspectiveCamera(camera) {\n return camera.isPerspectiveCamera;\n}\nfunction isOrthographicCamera(camera) {\n return camera.isOrthographicCamera;\n}\n\nconst PI_2 = Math.PI * 2;\nconst PI_HALF = Math.PI / 2;\n\nconst EPSILON = 1e-5;\nconst DEG2RAD = Math.PI / 180;\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction approxZero(number, error = EPSILON) {\n return Math.abs(number) < error;\n}\nfunction approxEquals(a, b, error = EPSILON) {\n return approxZero(a - b, error);\n}\nfunction roundToStep(value, step) {\n return Math.round(value / step) * step;\n}\nfunction infinityToMaxNumber(value) {\n if (isFinite(value))\n return value;\n if (value < 0)\n return -Number.MAX_VALUE;\n return Number.MAX_VALUE;\n}\nfunction maxNumberToInfinity(value) {\n if (Math.abs(value) < Number.MAX_VALUE)\n return value;\n return value * Infinity;\n}\n// https://docs.unity3d.com/ScriptReference/Mathf.SmoothDamp.html\n// https://github.com/Unity-Technologies/UnityCsReference/blob/a2bdfe9b3c4cd4476f44bf52f848063bfaf7b6b9/Runtime/Export/Math/Mathf.cs#L308\nfunction smoothDamp(current, target, currentVelocityRef, smoothTime, maxSpeed = Infinity, deltaTime) {\n // Based on Game Programming Gems 4 Chapter 1.10\n smoothTime = Math.max(0.0001, smoothTime);\n const omega = 2 / smoothTime;\n const x = omega * deltaTime;\n const exp = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x);\n let change = current - target;\n const originalTo = target;\n // Clamp maximum speed\n const maxChange = maxSpeed * smoothTime;\n change = clamp(change, -maxChange, maxChange);\n target = current - change;\n const temp = (currentVelocityRef.value + omega * change) * deltaTime;\n currentVelocityRef.value = (currentVelocityRef.value - omega * temp) * exp;\n let output = target + (change + temp) * exp;\n // Prevent overshooting\n if (originalTo - current > 0.0 === output > originalTo) {\n output = originalTo;\n currentVelocityRef.value = (output - originalTo) / deltaTime;\n }\n return output;\n}\n// https://docs.unity3d.com/ScriptReference/Vector3.SmoothDamp.html\n// https://github.com/Unity-Technologies/UnityCsReference/blob/a2bdfe9b3c4cd4476f44bf52f848063bfaf7b6b9/Runtime/Export/Math/Vector3.cs#L97\nfunction smoothDampVec3(current, target, currentVelocityRef, smoothTime, maxSpeed = Infinity, deltaTime, out) {\n // Based on Game Programming Gems 4 Chapter 1.10\n smoothTime = Math.max(0.0001, smoothTime);\n const omega = 2 / smoothTime;\n const x = omega * deltaTime;\n const exp = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x);\n let targetX = target.x;\n let targetY = target.y;\n let targetZ = target.z;\n let changeX = current.x - targetX;\n let changeY = current.y - targetY;\n let changeZ = current.z - targetZ;\n const originalToX = targetX;\n const originalToY = targetY;\n const originalToZ = targetZ;\n // Clamp maximum speed\n const maxChange = maxSpeed * smoothTime;\n const maxChangeSq = maxChange * maxChange;\n const magnitudeSq = changeX * changeX + changeY * changeY + changeZ * changeZ;\n if (magnitudeSq > maxChangeSq) {\n const magnitude = Math.sqrt(magnitudeSq);\n changeX = changeX / magnitude * maxChange;\n changeY = changeY / magnitude * maxChange;\n changeZ = changeZ / magnitude * maxChange;\n }\n targetX = current.x - changeX;\n targetY = current.y - changeY;\n targetZ = current.z - changeZ;\n const tempX = (currentVelocityRef.x + omega * changeX) * deltaTime;\n const tempY = (currentVelocityRef.y + omega * changeY) * deltaTime;\n const tempZ = (currentVelocityRef.z + omega * changeZ) * deltaTime;\n currentVelocityRef.x = (currentVelocityRef.x - omega * tempX) * exp;\n currentVelocityRef.y = (currentVelocityRef.y - omega * tempY) * exp;\n currentVelocityRef.z = (currentVelocityRef.z - omega * tempZ) * exp;\n out.x = targetX + (changeX + tempX) * exp;\n out.y = targetY + (changeY + tempY) * exp;\n out.z = targetZ + (changeZ + tempZ) * exp;\n // Prevent overshooting\n const origMinusCurrentX = originalToX - current.x;\n const origMinusCurrentY = originalToY - current.y;\n const origMinusCurrentZ = originalToZ - current.z;\n const outMinusOrigX = out.x - originalToX;\n const outMinusOrigY = out.y - originalToY;\n const outMinusOrigZ = out.z - originalToZ;\n if (origMinusCurrentX * outMinusOrigX + origMinusCurrentY * outMinusOrigY + origMinusCurrentZ * outMinusOrigZ > 0) {\n out.x = originalToX;\n out.y = originalToY;\n out.z = originalToZ;\n currentVelocityRef.x = (out.x - originalToX) / deltaTime;\n currentVelocityRef.y = (out.y - originalToY) / deltaTime;\n currentVelocityRef.z = (out.z - originalToZ) / deltaTime;\n }\n return out;\n}\n\nfunction extractClientCoordFromEvent(pointers, out) {\n out.set(0, 0);\n pointers.forEach((pointer) => {\n out.x += pointer.clientX;\n out.y += pointer.clientY;\n });\n out.x /= pointers.length;\n out.y /= pointers.length;\n}\n\nfunction notSupportedInOrthographicCamera(camera, message) {\n if (isOrthographicCamera(camera)) {\n console.warn(`${message} is not supported in OrthographicCamera`);\n return true;\n }\n return false;\n}\n\nclass EventDispatcher {\n constructor() {\n this._listeners = {};\n }\n /**\n * Adds the specified event listener.\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n addEventListener(type, listener) {\n const listeners = this._listeners;\n if (listeners[type] === undefined)\n listeners[type] = [];\n if (listeners[type].indexOf(listener) === -1)\n listeners[type].push(listener);\n }\n /**\n * Presence of the specified event listener.\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n hasEventListener(type, listener) {\n const listeners = this._listeners;\n return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1;\n }\n /**\n * Removes the specified event listener\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n removeEventListener(type, listener) {\n const listeners = this._listeners;\n const listenerArray = listeners[type];\n if (listenerArray !== undefined) {\n const index = listenerArray.indexOf(listener);\n if (index !== -1)\n listenerArray.splice(index, 1);\n }\n }\n /**\n * Removes all event listeners\n * @param type event name\n * @category Methods\n */\n removeAllEventListeners(type) {\n if (!type) {\n this._listeners = {};\n return;\n }\n if (Array.isArray(this._listeners[type]))\n this._listeners[type].length = 0;\n }\n /**\n * Fire an event type.\n * @param event DispatcherEvent\n * @category Methods\n */\n dispatchEvent(event) {\n const listeners = this._listeners;\n const listenerArray = listeners[event.type];\n if (listenerArray !== undefined) {\n event.target = this;\n const array = listenerArray.slice(0);\n for (let i = 0, l = array.length; i < l; i++) {\n array[i].call(this, event);\n }\n }\n }\n}\n\nvar _a;\nconst VERSION = '2.10.1'; // will be replaced with `version` in package.json during the build process.\nconst TOUCH_DOLLY_FACTOR = 1 / 8;\nconst isMac = /Mac/.test((_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.navigator) === null || _a === void 0 ? void 0 : _a.platform);\nlet THREE;\nlet _ORIGIN;\nlet _AXIS_Y;\nlet _AXIS_Z;\nlet _v2;\nlet _v3A;\nlet _v3B;\nlet _v3C;\nlet _cameraDirection;\nlet _xColumn;\nlet _yColumn;\nlet _zColumn;\nlet _deltaTarget;\nlet _deltaOffset;\nlet _sphericalA;\nlet _sphericalB;\nlet _box3A;\nlet _box3B;\nlet _sphere;\nlet _quaternionA;\nlet _quaternionB;\nlet _rotationMatrix;\nlet _raycaster;\nclass CameraControls extends EventDispatcher {\n /**\n * Injects THREE as the dependency. You can then proceed to use CameraControls.\n *\n * e.g\n * ```javascript\n * CameraControls.install( { THREE: THREE } );\n * ```\n *\n * Note: If you do not wish to use enter three.js to reduce file size(tree-shaking for example), make a subset to install.\n *\n * ```js\n * import {\n * \tVector2,\n * \tVector3,\n * \tVector4,\n * \tQuaternion,\n * \tMatrix4,\n * \tSpherical,\n * \tBox3,\n * \tSphere,\n * \tRaycaster,\n * \tMathUtils,\n * } from 'three';\n *\n * const subsetOfTHREE = {\n * \tVector2 : Vector2,\n * \tVector3 : Vector3,\n * \tVector4 : Vector4,\n * \tQuaternion: Quaternion,\n * \tMatrix4 : Matrix4,\n * \tSpherical : Spherical,\n * \tBox3 : Box3,\n * \tSphere : Sphere,\n * \tRaycaster : Raycaster,\n * };\n\n * CameraControls.install( { THREE: subsetOfTHREE } );\n * ```\n * @category Statics\n */\n static install(libs) {\n THREE = libs.THREE;\n _ORIGIN = Object.freeze(new THREE.Vector3(0, 0, 0));\n _AXIS_Y = Object.freeze(new THREE.Vector3(0, 1, 0));\n _AXIS_Z = Object.freeze(new THREE.Vector3(0, 0, 1));\n _v2 = new THREE.Vector2();\n _v3A = new THREE.Vector3();\n _v3B = new THREE.Vector3();\n _v3C = new THREE.Vector3();\n _cameraDirection = new THREE.Vector3();\n _xColumn = new THREE.Vector3();\n _yColumn = new THREE.Vector3();\n _zColumn = new THREE.Vector3();\n _deltaTarget = new THREE.Vector3();\n _deltaOffset = new THREE.Vector3();\n _sphericalA = new THREE.Spherical();\n _sphericalB = new THREE.Spherical();\n _box3A = new THREE.Box3();\n _box3B = new THREE.Box3();\n _sphere = new THREE.Sphere();\n _quaternionA = new THREE.Quaternion();\n _quaternionB = new THREE.Quaternion();\n _rotationMatrix = new THREE.Matrix4();\n _raycaster = new THREE.Raycaster();\n }\n /**\n * list all ACTIONs\n * @category Statics\n */\n static get ACTION() {\n return ACTION;\n }\n /**\n * @deprecated Use `cameraControls.mouseButtons.left = CameraControls.ACTION.SCREEN_PAN` instead.\n */\n set verticalDragToForward(_) {\n console.warn('camera-controls: `verticalDragToForward` was removed. Use `mouseButtons.left = CameraControls.ACTION.SCREEN_PAN` instead.');\n }\n /**\n * Creates a `CameraControls` instance.\n *\n * Note:\n * You **must install** three.js before using camera-controls. see [#install](#install)\n * Not doing so will lead to runtime errors (`undefined` references to THREE).\n *\n * e.g.\n * ```\n * CameraControls.install( { THREE } );\n * const cameraControls = new CameraControls( camera, domElement );\n * ```\n *\n * @param camera A `THREE.PerspectiveCamera` or `THREE.OrthographicCamera` to be controlled.\n * @param domElement A `HTMLElement` for the draggable area, usually `renderer.domElement`.\n * @category Constructor\n */\n constructor(camera, domElement) {\n super();\n /**\n * Minimum vertical angle in radians.\n * The angle has to be between `0` and `.maxPolarAngle` inclusive.\n * The default value is `0`.\n *\n * e.g.\n * ```\n * cameraControls.maxPolarAngle = 0;\n * ```\n * @category Properties\n */\n this.minPolarAngle = 0; // radians\n /**\n * Maximum vertical angle in radians.\n * The angle has to be between `.maxPolarAngle` and `Math.PI` inclusive.\n * The default value is `Math.PI`.\n *\n * e.g.\n * ```\n * cameraControls.maxPolarAngle = Math.PI;\n * ```\n * @category Properties\n */\n this.maxPolarAngle = Math.PI; // radians\n /**\n * Minimum horizontal angle in radians.\n * The angle has to be less than `.maxAzimuthAngle`.\n * The default value is `- Infinity`.\n *\n * e.g.\n * ```\n * cameraControls.minAzimuthAngle = - Infinity;\n * ```\n * @category Properties\n */\n this.minAzimuthAngle = -Infinity; // radians\n /**\n * Maximum horizontal angle in radians.\n * The angle has to be greater than `.minAzimuthAngle`.\n * The default value is `Infinity`.\n *\n * e.g.\n * ```\n * cameraControls.maxAzimuthAngle = Infinity;\n * ```\n * @category Properties\n */\n this.maxAzimuthAngle = Infinity; // radians\n // How far you can dolly in and out ( PerspectiveCamera only )\n /**\n * Minimum distance for dolly. The value must be higher than `0`. Default is `Number.EPSILON`.\n * PerspectiveCamera only.\n * @category Properties\n */\n this.minDistance = Number.EPSILON;\n /**\n * Maximum distance for dolly. The value must be higher than `minDistance`. Default is `Infinity`.\n * PerspectiveCamera only.\n * @category Properties\n */\n this.maxDistance = Infinity;\n /**\n * `true` to enable Infinity Dolly for wheel and pinch. Use this with `minDistance` and `maxDistance`\n * If the Dolly distance is less (or over) than the `minDistance` (or `maxDistance`), `infinityDolly` will keep the distance and pushes the target position instead.\n * @category Properties\n */\n this.infinityDolly = false;\n /**\n * Minimum camera zoom.\n * @category Properties\n */\n this.minZoom = 0.01;\n /**\n * Maximum camera zoom.\n * @category Properties\n */\n this.maxZoom = Infinity;\n /**\n * Approximate time in seconds to reach the target. A smaller value will reach the target faster.\n * @category Properties\n */\n this.smoothTime = 0.25;\n /**\n * the smoothTime while dragging\n * @category Properties\n */\n this.draggingSmoothTime = 0.125;\n /**\n * Max transition speed in unit-per-seconds\n * @category Properties\n */\n this.maxSpeed = Infinity;\n /**\n * Speed of azimuth (horizontal) rotation.\n * @category Properties\n */\n this.azimuthRotateSpeed = 1.0;\n /**\n * Speed of polar (vertical) rotation.\n * @category Properties\n */\n this.polarRotateSpeed = 1.0;\n /**\n * Speed of mouse-wheel dollying.\n * @category Properties\n */\n this.dollySpeed = 1.0;\n /**\n * `true` to invert direction when dollying or zooming via drag\n * @category Properties\n */\n this.dollyDragInverted = false;\n /**\n * Speed of drag for truck and pedestal.\n * @category Properties\n */\n this.truckSpeed = 2.0;\n /**\n * `true` to enable Dolly-in to the mouse cursor coords.\n * @category Properties\n */\n this.dollyToCursor = false;\n /**\n * @category Properties\n */\n this.dragToOffset = false;\n /**\n * Friction ratio of the boundary.\n * @category Properties\n */\n this.boundaryFriction = 0.0;\n /**\n * Controls how soon the `rest` event fires as the camera slows.\n * @category Properties\n */\n this.restThreshold = 0.01;\n /**\n * An array of Meshes to collide with camera.\n * Be aware colliderMeshes may decrease performance. The collision test uses 4 raycasters from the camera since the near plane has 4 corners.\n * @category Properties\n */\n this.colliderMeshes = [];\n /**\n * Force cancel user dragging.\n * @category Methods\n */\n // cancel will be overwritten in the constructor.\n this.cancel = () => { };\n this._enabled = true;\n this._state = ACTION.NONE;\n this._viewport = null;\n this._changedDolly = 0;\n this._changedZoom = 0;\n this._hasRested = true;\n this._boundaryEnclosesCamera = false;\n this._needsUpdate = true;\n this._updatedLastTime = false;\n this._elementRect = new DOMRect();\n this._isDragging = false;\n this._dragNeedsUpdate = true;\n this._activePointers = [];\n this._lockedPointer = null;\n this._interactiveArea = new DOMRect(0, 0, 1, 1);\n // Use draggingSmoothTime over smoothTime while true.\n // set automatically true on user-dragging start.\n // set automatically false on programmable methods call.\n this._isUserControllingRotate = false;\n this._isUserControllingDolly = false;\n this._isUserControllingTruck = false;\n this._isUserControllingOffset = false;\n this._isUserControllingZoom = false;\n this._lastDollyDirection = DOLLY_DIRECTION.NONE;\n // velocities for smoothDamp\n this._thetaVelocity = { value: 0 };\n this._phiVelocity = { value: 0 };\n this._radiusVelocity = { value: 0 };\n this._targetVelocity = new THREE.Vector3();\n this._focalOffsetVelocity = new THREE.Vector3();\n this._zoomVelocity = { value: 0 };\n this._truckInternal = (deltaX, deltaY, dragToOffset, screenSpacePanning) => {\n let truckX;\n let pedestalY;\n if (isPerspectiveCamera(this._camera)) {\n const offset = _v3A.copy(this._camera.position).sub(this._target);\n // half of the fov is center to top of screen\n const fov = this._camera.getEffectiveFOV() * DEG2RAD;\n const targetDistance = offset.length() * Math.tan(fov * 0.5);\n truckX = (this.truckSpeed * deltaX * targetDistance / this._elementRect.height);\n pedestalY = (this.truckSpeed * deltaY * targetDistance / this._elementRect.height);\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n truckX = this.truckSpeed * deltaX * (camera.right - camera.left) / camera.zoom / this._elementRect.width;\n pedestalY = this.truckSpeed * deltaY * (camera.top - camera.bottom) / camera.zoom / this._elementRect.height;\n }\n else {\n return;\n }\n if (screenSpacePanning) {\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y, this._focalOffsetEnd.z, true) :\n this.truck(truckX, 0, true);\n this.forward(-pedestalY, true);\n }\n else {\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y + pedestalY, this._focalOffsetEnd.z, true) :\n this.truck(truckX, pedestalY, true);\n }\n };\n this._rotateInternal = (deltaX, deltaY) => {\n const theta = PI_2 * this.azimuthRotateSpeed * deltaX / this._elementRect.height; // divide by *height* to refer the resolution\n const phi = PI_2 * this.polarRotateSpeed * deltaY / this._elementRect.height;\n this.rotate(theta, phi, true);\n };\n this._dollyInternal = (delta, x, y) => {\n const dollyScale = Math.pow(0.95, -delta * this.dollySpeed);\n const lastDistance = this._sphericalEnd.radius;\n const distance = this._sphericalEnd.radius * dollyScale;\n const clampedDistance = clamp(distance, this.minDistance, this.maxDistance);\n const overflowedDistance = clampedDistance - distance;\n if (this.infinityDolly && this.dollyToCursor) {\n this._dollyToNoClamp(distance, true);\n }\n else if (this.infinityDolly && !this.dollyToCursor) {\n this.dollyInFixed(overflowedDistance, true);\n this._dollyToNoClamp(clampedDistance, true);\n }\n else {\n this._dollyToNoClamp(clampedDistance, true);\n }\n if (this.dollyToCursor) {\n this._changedDolly += (this.infinityDolly ? distance : clampedDistance) - lastDistance;\n this._dollyControlCoord.set(x, y);\n }\n this._lastDollyDirection = Math.sign(-delta);\n };\n this._zoomInternal = (delta, x, y) => {\n const zoomScale = Math.pow(0.95, delta * this.dollySpeed);\n const lastZoom = this._zoom;\n const zoom = this._zoom * zoomScale;\n // for both PerspectiveCamera and OrthographicCamera\n this.zoomTo(zoom, true);\n if (this.dollyToCursor) {\n this._changedZoom += zoom - lastZoom;\n this._dollyControlCoord.set(x, y);\n }\n };\n // Check if the user has installed THREE\n if (typeof THREE === 'undefined') {\n console.error('camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information.');\n }\n this._camera = camera;\n this._yAxisUpSpace = new THREE.Quaternion().setFromUnitVectors(this._camera.up, _AXIS_Y);\n this._yAxisUpSpaceInverse = this._yAxisUpSpace.clone().invert();\n this._state = ACTION.NONE;\n // the location\n this._target = new THREE.Vector3();\n this._targetEnd = this._target.clone();\n this._focalOffset = new THREE.Vector3();\n this._focalOffsetEnd = this._focalOffset.clone();\n // rotation\n this._spherical = new THREE.Spherical().setFromVector3(_v3A.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace));\n this._sphericalEnd = this._spherical.clone();\n this._lastDistance = this._spherical.radius;\n this._zoom = this._camera.zoom;\n this._zoomEnd = this._zoom;\n this._lastZoom = this._zoom;\n // collisionTest uses nearPlane.s\n this._nearPlaneCorners = [\n new THREE.Vector3(),\n new THREE.Vector3(),\n new THREE.Vector3(),\n new THREE.Vector3(),\n ];\n this._updateNearPlaneCorners();\n // Target cannot move outside of this box\n this._boundary = new THREE.Box3(new THREE.Vector3(-Infinity, -Infinity, -Infinity), new THREE.Vector3(Infinity, Infinity, Infinity));\n // reset\n this._cameraUp0 = this._camera.up.clone();\n this._target0 = this._target.clone();\n this._position0 = this._camera.position.clone();\n this._zoom0 = this._zoom;\n this._focalOffset0 = this._focalOffset.clone();\n this._dollyControlCoord = new THREE.Vector2();\n // configs\n this.mouseButtons = {\n left: ACTION.ROTATE,\n middle: ACTION.DOLLY,\n right: ACTION.TRUCK,\n wheel: isPerspectiveCamera(this._camera) ? ACTION.DOLLY :\n isOrthographicCamera(this._camera) ? ACTION.ZOOM :\n ACTION.NONE,\n };\n this.touches = {\n one: ACTION.TOUCH_ROTATE,\n two: isPerspectiveCamera(this._camera) ? ACTION.TOUCH_DOLLY_TRUCK :\n isOrthographicCamera(this._camera) ? ACTION.TOUCH_ZOOM_TRUCK :\n ACTION.NONE,\n three: ACTION.TOUCH_TRUCK,\n };\n const dragStartPosition = new THREE.Vector2();\n const lastDragPosition = new THREE.Vector2();\n const dollyStart = new THREE.Vector2();\n const onPointerDown = (event) => {\n if (!this._enabled || !this._domElement)\n return;\n if (this._interactiveArea.left !== 0 ||\n this._interactiveArea.top !== 0 ||\n this._interactiveArea.width !== 1 ||\n this._interactiveArea.height !== 1) {\n const elRect = this._domElement.getBoundingClientRect();\n const left = event.clientX / elRect.width;\n const top = event.clientY / elRect.height;\n // check if the interactiveArea contains the drag start position.\n if (left < this._interactiveArea.left ||\n left > this._interactiveArea.right ||\n top < this._interactiveArea.top ||\n top > this._interactiveArea.bottom)\n return;\n }\n // Don't call `event.preventDefault()` on the pointerdown event\n // to keep receiving pointermove evens outside dragging iframe\n // https://taye.me/blog/tips/2015/11/16/mouse-drag-outside-iframe/\n const mouseButton = event.pointerType !== 'mouse' ? null :\n (event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT ? MOUSE_BUTTON.LEFT :\n (event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE ? MOUSE_BUTTON.MIDDLE :\n (event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT ? MOUSE_BUTTON.RIGHT :\n null;\n if (mouseButton !== null) {\n const zombiePointer = this._findPointerByMouseButton(mouseButton);\n zombiePointer && this._disposePointer(zombiePointer);\n }\n if ((event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT && this._lockedPointer)\n return;\n const pointer = {\n pointerId: event.pointerId,\n clientX: event.clientX,\n clientY: event.clientY,\n deltaX: 0,\n deltaY: 0,\n mouseButton,\n };\n this._activePointers.push(pointer);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.ownerDocument.addEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.addEventListener('pointerup', onPointerUp);\n this._isDragging = true;\n startDragging(event);\n };\n const onPointerMove = (event) => {\n if (event.cancelable)\n event.preventDefault();\n const pointerId = event.pointerId;\n const pointer = this._lockedPointer || this._findPointerById(pointerId);\n if (!pointer)\n return;\n pointer.clientX = event.clientX;\n pointer.clientY = event.clientY;\n pointer.deltaX = event.movementX;\n pointer.deltaY = event.movementY;\n this._state = 0;\n if (event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n if ((!this._isDragging && this._lockedPointer) ||\n this._isDragging && (event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if (this._isDragging && (event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if (this._isDragging && (event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n }\n dragging();\n };\n const onPointerUp = (event) => {\n const pointer = this._findPointerById(event.pointerId);\n if (pointer && pointer === this._lockedPointer)\n return;\n pointer && this._disposePointer(pointer);\n if (event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 0:\n this._state = ACTION.NONE;\n break;\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n this._state = ACTION.NONE;\n }\n endDragging();\n };\n let lastScrollTimeStamp = -1;\n const onMouseWheel = (event) => {\n if (!this._domElement)\n return;\n if (!this._enabled || this.mouseButtons.wheel === ACTION.NONE)\n return;\n if (this._interactiveArea.left !== 0 ||\n this._interactiveArea.top !== 0 ||\n this._interactiveArea.width !== 1 ||\n this._interactiveArea.height !== 1) {\n const elRect = this._domElement.getBoundingClientRect();\n const left = event.clientX / elRect.width;\n const top = event.clientY / elRect.height;\n // check if the interactiveArea contains the drag start position.\n if (left < this._interactiveArea.left ||\n left > this._interactiveArea.right ||\n top < this._interactiveArea.top ||\n top > this._interactiveArea.bottom)\n return;\n }\n event.preventDefault();\n if (this.dollyToCursor ||\n this.mouseButtons.wheel === ACTION.ROTATE ||\n this.mouseButtons.wheel === ACTION.TRUCK) {\n const now = performance.now();\n // only need to fire this at scroll start.\n if (lastScrollTimeStamp - now < 1000)\n this._getClientRect(this._elementRect);\n lastScrollTimeStamp = now;\n }\n // Ref: https://github.com/cedricpinson/osgjs/blob/00e5a7e9d9206c06fdde0436e1d62ab7cb5ce853/sources/osgViewer/input/source/InputSourceMouse.js#L89-L103\n const deltaYFactor = isMac ? -1 : -3;\n // Checks event.ctrlKey to detect multi-touch gestures on a trackpad.\n const delta = (event.deltaMode === 1 || event.ctrlKey) ? event.deltaY / deltaYFactor : event.deltaY / (deltaYFactor * 10);\n const x = this.dollyToCursor ? (event.clientX - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const y = this.dollyToCursor ? (event.clientY - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n switch (this.mouseButtons.wheel) {\n case ACTION.ROTATE: {\n this._rotateInternal(event.deltaX, event.deltaY);\n this._isUserControllingRotate = true;\n break;\n }\n case ACTION.TRUCK: {\n this._truckInternal(event.deltaX, event.deltaY, false, false);\n this._isUserControllingTruck = true;\n break;\n }\n case ACTION.SCREEN_PAN: {\n this._truckInternal(event.deltaX, event.deltaY, false, true);\n this._isUserControllingTruck = true;\n break;\n }\n case ACTION.OFFSET: {\n this._truckInternal(event.deltaX, event.deltaY, true, false);\n this._isUserControllingOffset = true;\n break;\n }\n case ACTION.DOLLY: {\n this._dollyInternal(-delta, x, y);\n this._isUserControllingDolly = true;\n break;\n }\n case ACTION.ZOOM: {\n this._zoomInternal(-delta, x, y);\n this._isUserControllingZoom = true;\n break;\n }\n }\n this.dispatchEvent({ type: 'control' });\n };\n const onContextMenu = (event) => {\n if (!this._domElement || !this._enabled)\n return;\n // contextmenu event is fired right after pointerdown\n // remove attached handlers and active pointer, if interrupted by contextmenu.\n if (this.mouseButtons.right === CameraControls.ACTION.NONE) {\n const pointerId = event instanceof PointerEvent ? event.pointerId : 0;\n const pointer = this._findPointerById(pointerId);\n pointer && this._disposePointer(pointer);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n return;\n }\n event.preventDefault();\n };\n const startDragging = (event) => {\n if (!this._enabled)\n return;\n extractClientCoordFromEvent(this._activePointers, _v2);\n this._getClientRect(this._elementRect);\n dragStartPosition.copy(_v2);\n lastDragPosition.copy(_v2);\n const isMultiTouch = this._activePointers.length >= 2;\n if (isMultiTouch) {\n // 2 finger pinch\n const dx = _v2.x - this._activePointers[1].clientX;\n const dy = _v2.y - this._activePointers[1].clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n dollyStart.set(0, distance);\n // center coords of 2 finger truck\n const x = (this._activePointers[0].clientX + this._activePointers[1].clientX) * 0.5;\n const y = (this._activePointers[0].clientY + this._activePointers[1].clientY) * 0.5;\n lastDragPosition.set(x, y);\n }\n this._state = 0;\n if (!event) {\n if (this._lockedPointer)\n this._state = this._state | this.mouseButtons.left;\n }\n else if ('pointerType' in event && event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n if (!this._lockedPointer && (event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if ((event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if ((event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n }\n // stop current movement on drag start\n // - rotate\n if ((this._state & ACTION.ROTATE) === ACTION.ROTATE ||\n (this._state & ACTION.TOUCH_ROTATE) === ACTION.TOUCH_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n this._sphericalEnd.theta = this._spherical.theta;\n this._sphericalEnd.phi = this._spherical.phi;\n this._thetaVelocity.value = 0;\n this._phiVelocity.value = 0;\n }\n // - truck and screen-pan\n if ((this._state & ACTION.TRUCK) === ACTION.TRUCK ||\n (this._state & ACTION.SCREEN_PAN) === ACTION.SCREEN_PAN ||\n (this._state & ACTION.TOUCH_TRUCK) === ACTION.TOUCH_TRUCK ||\n (this._state & ACTION.TOUCH_SCREEN_PAN) === ACTION.TOUCH_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN) {\n this._targetEnd.copy(this._target);\n this._targetVelocity.set(0, 0, 0);\n }\n // - dolly\n if ((this._state & ACTION.DOLLY) === ACTION.DOLLY ||\n (this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE) {\n this._sphericalEnd.radius = this._spherical.radius;\n this._radiusVelocity.value = 0;\n }\n // - zoom\n if ((this._state & ACTION.ZOOM) === ACTION.ZOOM ||\n (this._state & ACTION.TOUCH_ZOOM) === ACTION.TOUCH_ZOOM ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_SCREEN_PAN) === ACTION.TOUCH_ZOOM_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n this._zoomEnd = this._zoom;\n this._zoomVelocity.value = 0;\n }\n // - offset\n if ((this._state & ACTION.OFFSET) === ACTION.OFFSET ||\n (this._state & ACTION.TOUCH_OFFSET) === ACTION.TOUCH_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET) {\n this._focalOffsetEnd.copy(this._focalOffset);\n this._focalOffsetVelocity.set(0, 0, 0);\n }\n this.dispatchEvent({ type: 'controlstart' });\n };\n const dragging = () => {\n if (!this._enabled || !this._dragNeedsUpdate)\n return;\n this._dragNeedsUpdate = false;\n extractClientCoordFromEvent(this._activePointers, _v2);\n // When pointer lock is enabled clientX, clientY, screenX, and screenY remain 0.\n // If pointer lock is enabled, use the Delta directory, and assume active-pointer is not multiple.\n const isPointerLockActive = this._domElement && this._domElement.ownerDocument.pointerLockElement === this._domElement;\n const lockedPointer = isPointerLockActive ? this._lockedPointer || this._activePointers[0] : null;\n const deltaX = lockedPointer ? -lockedPointer.deltaX : lastDragPosition.x - _v2.x;\n const deltaY = lockedPointer ? -lockedPointer.deltaY : lastDragPosition.y - _v2.y;\n lastDragPosition.copy(_v2);\n // rotate\n if ((this._state & ACTION.ROTATE) === ACTION.ROTATE ||\n (this._state & ACTION.TOUCH_ROTATE) === ACTION.TOUCH_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n this._rotateInternal(deltaX, deltaY);\n this._isUserControllingRotate = true;\n }\n // mouse dolly or zoom\n if ((this._state & ACTION.DOLLY) === ACTION.DOLLY ||\n (this._state & ACTION.ZOOM) === ACTION.ZOOM) {\n const dollyX = this.dollyToCursor ? (dragStartPosition.x - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const dollyY = this.dollyToCursor ? (dragStartPosition.y - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n const dollyDirection = this.dollyDragInverted ? -1 : 1;\n if ((this._state & ACTION.DOLLY) === ACTION.DOLLY) {\n this._dollyInternal(dollyDirection * deltaY * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n this._isUserControllingDolly = true;\n }\n else {\n this._zoomInternal(dollyDirection * deltaY * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n this._isUserControllingZoom = true;\n }\n }\n // touch dolly or zoom\n if ((this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_ZOOM) === ACTION.TOUCH_ZOOM ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_ZOOM_SCREEN_PAN) === ACTION.TOUCH_ZOOM_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n const dx = _v2.x - this._activePointers[1].clientX;\n const dy = _v2.y - this._activePointers[1].clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const dollyDelta = dollyStart.y - distance;\n dollyStart.set(0, distance);\n const dollyX = this.dollyToCursor ? (lastDragPosition.x - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const dollyY = this.dollyToCursor ? (lastDragPosition.y - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n if ((this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET) {\n this._dollyInternal(dollyDelta * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n this._isUserControllingDolly = true;\n }\n else {\n this._zoomInternal(dollyDelta * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n this._isUserControllingZoom = true;\n }\n }\n // truck\n if ((this._state & ACTION.TRUCK) === ACTION.TRUCK ||\n (this._state & ACTION.TOUCH_TRUCK) === ACTION.TOUCH_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK) {\n this._truckInternal(deltaX, deltaY, false, false);\n this._isUserControllingTruck = true;\n }\n // screen-pan\n if ((this._state & ACTION.SCREEN_PAN) === ACTION.SCREEN_PAN ||\n (this._state & ACTION.TOUCH_SCREEN_PAN) === ACTION.TOUCH_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_DOLLY_SCREEN_PAN) === ACTION.TOUCH_DOLLY_SCREEN_PAN ||\n (this._state & ACTION.TOUCH_ZOOM_SCREEN_PAN) === ACTION.TOUCH_ZOOM_SCREEN_PAN) {\n this._truckInternal(deltaX, deltaY, false, true);\n this._isUserControllingTruck = true;\n }\n // offset\n if ((this._state & ACTION.OFFSET) === ACTION.OFFSET ||\n (this._state & ACTION.TOUCH_OFFSET) === ACTION.TOUCH_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET) {\n this._truckInternal(deltaX, deltaY, true, false);\n this._isUserControllingOffset = true;\n }\n this.dispatchEvent({ type: 'control' });\n };\n const endDragging = () => {\n extractClientCoordFromEvent(this._activePointers, _v2);\n lastDragPosition.copy(_v2);\n this._dragNeedsUpdate = false;\n if (this._activePointers.length === 0 ||\n (this._activePointers.length === 1 && this._activePointers[0] === this._lockedPointer)) {\n this._isDragging = false;\n }\n if (this._activePointers.length === 0 && this._domElement) {\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this.dispatchEvent({ type: 'controlend' });\n }\n };\n this.lockPointer = () => {\n if (!this._enabled || !this._domElement)\n return;\n this.cancel();\n // Element.requestPointerLock is allowed to happen without any pointer active - create a faux one for compatibility with controls\n this._lockedPointer = {\n pointerId: -1,\n clientX: 0,\n clientY: 0,\n deltaX: 0,\n deltaY: 0,\n mouseButton: null,\n };\n this._activePointers.push(this._lockedPointer);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.requestPointerLock();\n this._domElement.ownerDocument.addEventListener('pointerlockchange', onPointerLockChange);\n this._domElement.ownerDocument.addEventListener('pointerlockerror', onPointerLockError);\n this._domElement.ownerDocument.addEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.addEventListener('pointerup', onPointerUp);\n startDragging();\n };\n this.unlockPointer = () => {\n var _a, _b, _c;\n if (this._lockedPointer !== null) {\n this._disposePointer(this._lockedPointer);\n this._lockedPointer = null;\n }\n (_a = this._domElement) === null || _a === void 0 ? void 0 : _a.ownerDocument.exitPointerLock();\n (_b = this._domElement) === null || _b === void 0 ? void 0 : _b.ownerDocument.removeEventListener('pointerlockchange', onPointerLockChange);\n (_c = this._domElement) === null || _c === void 0 ? void 0 : _c.ownerDocument.removeEventListener('pointerlockerror', onPointerLockError);\n this.cancel();\n };\n const onPointerLockChange = () => {\n const isPointerLockActive = this._domElement && this._domElement.ownerDocument.pointerLockElement === this._domElement;\n if (!isPointerLockActive)\n this.unlockPointer();\n };\n const onPointerLockError = () => {\n this.unlockPointer();\n };\n this._addAllEventListeners = (domElement) => {\n this._domElement = domElement;\n this._domElement.style.touchAction = 'none';\n this._domElement.style.userSelect = 'none';\n this._domElement.style.webkitUserSelect = 'none';\n this._domElement.addEventListener('pointerdown', onPointerDown);\n this._domElement.addEventListener('pointercancel', onPointerUp);\n this._domElement.addEventListener('wheel', onMouseWheel, { passive: false });\n this._domElement.addEventListener('contextmenu', onContextMenu);\n };\n this._removeAllEventListeners = () => {\n if (!this._domElement)\n return;\n this._domElement.style.touchAction = '';\n this._domElement.style.userSelect = '';\n this._domElement.style.webkitUserSelect = '';\n this._domElement.removeEventListener('pointerdown', onPointerDown);\n this._domElement.removeEventListener('pointercancel', onPointerUp);\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener#matching_event_listeners_for_removal\n // > it's probably wise to use the same values used for the call to `addEventListener()` when calling `removeEventListener()`\n // see https://github.com/microsoft/TypeScript/issues/32912#issuecomment-522142969\n // eslint-disable-next-line no-undef\n this._domElement.removeEventListener('wheel', onMouseWheel, { passive: false });\n this._domElement.removeEventListener('contextmenu', onContextMenu);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.ownerDocument.removeEventListener('pointerlockchange', onPointerLockChange);\n this._domElement.ownerDocument.removeEventListener('pointerlockerror', onPointerLockError);\n };\n this.cancel = () => {\n if (this._state === ACTION.NONE)\n return;\n this._state = ACTION.NONE;\n this._activePointers.length = 0;\n endDragging();\n };\n if (domElement)\n this.connect(domElement);\n this.update(0);\n }\n /**\n * The camera to be controlled\n * @category Properties\n */\n get camera() {\n return this._camera;\n }\n set camera(camera) {\n this._camera = camera;\n this.updateCameraUp();\n this._camera.updateProjectionMatrix();\n this._updateNearPlaneCorners();\n this._needsUpdate = true;\n }\n /**\n * Whether or not the controls are enabled.\n * `false` to disable user dragging/touch-move, but all methods works.\n * @category Properties\n */\n get enabled() {\n return this._enabled;\n }\n set enabled(enabled) {\n this._enabled = enabled;\n if (!this._domElement)\n return;\n if (enabled) {\n this._domElement.style.touchAction = 'none';\n this._domElement.style.userSelect = 'none';\n this._domElement.style.webkitUserSelect = 'none';\n }\n else {\n this.cancel();\n this._domElement.style.touchAction = '';\n this._domElement.style.userSelect = '';\n this._domElement.style.webkitUserSelect = '';\n }\n }\n /**\n * Returns `true` if the controls are active updating.\n * readonly value.\n * @category Properties\n */\n get active() {\n return !this._hasRested;\n }\n /**\n * Getter for the current `ACTION`.\n * readonly value.\n * @category Properties\n */\n get currentAction() {\n return this._state;\n }\n /**\n * get/set Current distance.\n * @category Properties\n */\n get distance() {\n return this._spherical.radius;\n }\n set distance(distance) {\n if (this._spherical.radius === distance &&\n this._sphericalEnd.radius === distance)\n return;\n this._spherical.radius = distance;\n this._sphericalEnd.radius = distance;\n this._needsUpdate = true;\n }\n // horizontal angle\n /**\n * get/set the azimuth angle (horizontal) in radians.\n * Every 360 degrees turn is added to `.azimuthAngle` value, which is accumulative.\n * @category Properties\n */\n get azimuthAngle() {\n return this._spherical.theta;\n }\n set azimuthAngle(azimuthAngle) {\n if (this._spherical.theta === azimuthAngle &&\n this._sphericalEnd.theta === azimuthAngle)\n return;\n this._spherical.theta = azimuthAngle;\n this._sphericalEnd.theta = azimuthAngle;\n this._needsUpdate = true;\n }\n // vertical angle\n /**\n * get/set the polar angle (vertical) in radians.\n * @category Properties\n */\n get polarAngle() {\n return this._spherical.phi;\n }\n set polarAngle(polarAngle) {\n if (this._spherical.phi === polarAngle &&\n this._sphericalEnd.phi === polarAngle)\n return;\n this._spherical.phi = polarAngle;\n this._sphericalEnd.phi = polarAngle;\n this._needsUpdate = true;\n }\n /**\n * Whether camera position should be enclosed in the boundary or not.\n * @category Properties\n */\n get boundaryEnclosesCamera() {\n return this._boundaryEnclosesCamera;\n }\n set boundaryEnclosesCamera(boundaryEnclosesCamera) {\n this._boundaryEnclosesCamera = boundaryEnclosesCamera;\n this._needsUpdate = true;\n }\n /**\n * Set drag-start, touches and wheel enable area in the domElement.\n * each values are between `0` and `1` inclusive, where `0` is left/top and `1` is right/bottom of the screen.\n * e.g. `{ x: 0, y: 0, width: 1, height: 1 }` for entire area.\n * @category Properties\n */\n set interactiveArea(interactiveArea) {\n this._interactiveArea.width = clamp(interactiveArea.width, 0, 1);\n this._interactiveArea.height = clamp(interactiveArea.height, 0, 1);\n this._interactiveArea.x = clamp(interactiveArea.x, 0, 1 - this._interactiveArea.width);\n this._interactiveArea.y = clamp(interactiveArea.y, 0, 1 - this._interactiveArea.height);\n }\n /**\n * Adds the specified event listener.\n * Applicable event types (which is `K`) are:\n * | Event name | Timing |\n * | ------------------- | ------ |\n * | `'controlstart'` | When the user starts to control the camera via mouse / touches. ¹ |\n * | `'control'` | When the user controls the camera (dragging). |\n * | `'controlend'` | When the user ends to control the camera. ¹ |\n * | `'transitionstart'` | When any kind of transition starts, either user control or using a method with `enableTransition = true` |\n * | `'update'` | When the camera position is updated. |\n * | `'wake'` | When the camera starts moving. |\n * | `'rest'` | When the camera movement is below `.restThreshold` ². |\n * | `'sleep'` | When the camera end moving. |\n *\n * 1. `mouseButtons.wheel` (Mouse wheel control) does not emit `'controlstart'` and `'controlend'`. `mouseButtons.wheel` uses scroll-event internally, and scroll-event happens intermittently. That means \"start\" and \"end\" cannot be detected.\n * 2. Due to damping, `sleep` will usually fire a few seconds after the camera _appears_ to have stopped moving. If you want to do something (e.g. enable UI, perform another transition) at the point when the camera has stopped, you probably want the `rest` event. This can be fine tuned using the `.restThreshold` parameter. See the [Rest and Sleep Example](https://yomotsu.github.io/camera-controls/examples/rest-and-sleep.html).\n *\n * e.g.\n * ```\n * cameraControl.addEventListener( 'controlstart', myCallbackFunction );\n * ```\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n addEventListener(type, listener) {\n super.addEventListener(type, listener);\n }\n /**\n * Removes the specified event listener\n * e.g.\n * ```\n * cameraControl.addEventListener( 'controlstart', myCallbackFunction );\n * ```\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n removeEventListener(type, listener) {\n super.removeEventListener(type, listener);\n }\n /**\n * Rotate azimuthal angle(horizontal) and polar angle(vertical).\n * Every value is added to the current value.\n * @param azimuthAngle Azimuth rotate angle. In radian.\n * @param polarAngle Polar rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotate(azimuthAngle, polarAngle, enableTransition = false) {\n return this.rotateTo(this._sphericalEnd.theta + azimuthAngle, this._sphericalEnd.phi + polarAngle, enableTransition);\n }\n /**\n * Rotate azimuthal angle(horizontal) to the given angle and keep the same polar angle(vertical) target.\n *\n * e.g.\n * ```\n * cameraControls.rotateAzimuthTo( 30 * THREE.MathUtils.DEG2RAD, true );\n * ```\n * @param azimuthAngle Azimuth rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotateAzimuthTo(azimuthAngle, enableTransition = false) {\n return this.rotateTo(azimuthAngle, this._sphericalEnd.phi, enableTransition);\n }\n /**\n * Rotate polar angle(vertical) to the given angle and keep the same azimuthal angle(horizontal) target.\n *\n * e.g.\n * ```\n * cameraControls.rotatePolarTo( 30 * THREE.MathUtils.DEG2RAD, true );\n * ```\n * @param polarAngle Polar rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotatePolarTo(polarAngle, enableTransition = false) {\n return this.rotateTo(this._sphericalEnd.theta, polarAngle, enableTransition);\n }\n /**\n * Rotate azimuthal angle(horizontal) and polar angle(vertical) to the given angle.\n * Camera view will rotate over the orbit pivot absolutely:\n *\n * azimuthAngle\n * ```\n * 0º\n * \\\n * 90º -----+----- -90º\n * \\\n * 180º\n * ```\n * | direction | angle |\n * | --------- | ---------------------- |\n * | front | 0º |\n * | left | 90º (`Math.PI / 2`) |\n * | right | -90º (`- Math.PI / 2`) |\n * | back | 180º (`Math.PI`) |\n *\n * polarAngle\n * ```\n * 180º\n * |\n * 90º\n * |\n * 0º\n * ```\n * | direction | angle |\n * | -------------------- | ---------------------- |\n * | top/sky | 180º (`Math.PI`) |\n * | horizontal from view | 90º (`Math.PI / 2`) |\n * | bottom/floor | 0º |\n *\n * @param azimuthAngle Azimuth rotate angle to. In radian.\n * @param polarAngle Polar rotate angle to. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotateTo(azimuthAngle, polarAngle, enableTransition = false) {\n this._isUserControllingRotate = false;\n const theta = clamp(azimuthAngle, this.minAzimuthAngle, this.maxAzimuthAngle);\n const phi = clamp(polarAngle, this.minPolarAngle, this.maxPolarAngle);\n this._sphericalEnd.theta = theta;\n this._sphericalEnd.phi = phi;\n this._sphericalEnd.makeSafe();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._spherical.theta = this._sphericalEnd.theta;\n this._spherical.phi = this._sphericalEnd.phi;\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Dolly in/out camera position.\n * @param distance Distance of dollyIn. Negative number for dollyOut.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dolly(distance, enableTransition = false) {\n return this.dollyTo(this._sphericalEnd.radius - distance, enableTransition);\n }\n /**\n * Dolly in/out camera position to given distance.\n * @param distance Distance of dolly.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dollyTo(distance, enableTransition = false) {\n this._isUserControllingDolly = false;\n this._lastDollyDirection = DOLLY_DIRECTION.NONE;\n this._changedDolly = 0;\n return this._dollyToNoClamp(clamp(distance, this.minDistance, this.maxDistance), enableTransition);\n }\n _dollyToNoClamp(distance, enableTransition = false) {\n const lastRadius = this._sphericalEnd.radius;\n const hasCollider = this.colliderMeshes.length >= 1;\n if (hasCollider) {\n const maxDistanceByCollisionTest = this._collisionTest();\n const isCollided = approxEquals(maxDistanceByCollisionTest, this._spherical.radius);\n const isDollyIn = lastRadius > distance;\n if (!isDollyIn && isCollided)\n return Promise.resolve();\n this._sphericalEnd.radius = Math.min(distance, maxDistanceByCollisionTest);\n }\n else {\n this._sphericalEnd.radius = distance;\n }\n this._needsUpdate = true;\n if (!enableTransition) {\n this._spherical.radius = this._sphericalEnd.radius;\n }\n const resolveImmediately = !enableTransition || approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Dolly in, but does not change the distance between the target and the camera, and moves the target position instead.\n * Specify a negative value for dolly out.\n * @param distance Distance of dolly.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dollyInFixed(distance, enableTransition = false) {\n this._targetEnd.add(this._getCameraDirection(_cameraDirection).multiplyScalar(distance));\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Zoom in/out camera. The value is added to camera zoom.\n * Limits set with `.minZoom` and `.maxZoom`\n * @param zoomStep zoom scale\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n zoom(zoomStep, enableTransition = false) {\n return this.zoomTo(this._zoomEnd + zoomStep, enableTransition);\n }\n /**\n * Zoom in/out camera to given scale. The value overwrites camera zoom.\n * Limits set with .minZoom and .maxZoom\n * @param zoom\n * @param enableTransition\n * @category Methods\n */\n zoomTo(zoom, enableTransition = false) {\n this._isUserControllingZoom = false;\n this._zoomEnd = clamp(zoom, this.minZoom, this.maxZoom);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._zoom = this._zoomEnd;\n }\n const resolveImmediately = !enableTransition || approxEquals(this._zoom, this._zoomEnd, this.restThreshold);\n this._changedZoom = 0;\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * @deprecated `pan()` has been renamed to `truck()`\n * @category Methods\n */\n pan(x, y, enableTransition = false) {\n console.warn('`pan` has been renamed to `truck`');\n return this.truck(x, y, enableTransition);\n }\n /**\n * Truck and pedestal camera using current azimuthal angle\n * @param x Horizontal translate amount\n * @param y Vertical translate amount\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n truck(x, y, enableTransition = false) {\n this._camera.updateMatrix();\n _xColumn.setFromMatrixColumn(this._camera.matrix, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrix, 1);\n _xColumn.multiplyScalar(x);\n _yColumn.multiplyScalar(-y);\n const offset = _v3A.copy(_xColumn).add(_yColumn);\n const to = _v3B.copy(this._targetEnd).add(offset);\n return this.moveTo(to.x, to.y, to.z, enableTransition);\n }\n /**\n * Move forward / backward.\n * @param distance Amount to move forward / backward. Negative value to move backward\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n forward(distance, enableTransition = false) {\n _v3A.setFromMatrixColumn(this._camera.matrix, 0);\n _v3A.crossVectors(this._camera.up, _v3A);\n _v3A.multiplyScalar(distance);\n const to = _v3B.copy(this._targetEnd).add(_v3A);\n return this.moveTo(to.x, to.y, to.z, enableTransition);\n }\n /**\n * Move up / down.\n * @param height Amount to move up / down. Negative value to move down\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n elevate(height, enableTransition = false) {\n _v3A.copy(this._camera.up).multiplyScalar(height);\n return this.moveTo(this._targetEnd.x + _v3A.x, this._targetEnd.y + _v3A.y, this._targetEnd.z + _v3A.z, enableTransition);\n }\n /**\n * Move target position to given point.\n * @param x x coord to move center position\n * @param y y coord to move center position\n * @param z z coord to move center position\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n moveTo(x, y, z, enableTransition = false) {\n this._isUserControllingTruck = false;\n const offset = _v3A.set(x, y, z).sub(this._targetEnd);\n this._encloseToBoundary(this._targetEnd, offset, this.boundaryFriction);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Look in the given point direction.\n * @param x point x.\n * @param y point y.\n * @param z point z.\n * @param enableTransition Whether to move smoothly or immediately.\n * @returns Transition end promise\n * @category Methods\n */\n lookInDirectionOf(x, y, z, enableTransition = false) {\n const point = _v3A.set(x, y, z);\n const direction = point.sub(this._targetEnd).normalize();\n const position = direction.multiplyScalar(-this._sphericalEnd.radius).add(this._targetEnd);\n return this.setPosition(position.x, position.y, position.z, enableTransition);\n }\n /**\n * Fit the viewport to the box or the bounding box of the object, using the nearest axis. paddings are in unit.\n * set `cover: true` to fill enter screen.\n * e.g.\n * ```\n * cameraControls.fitToBox( myMesh );\n * ```\n * @param box3OrObject Axis aligned bounding box to fit the view.\n * @param enableTransition Whether to move smoothly or immediately.\n * @param options | `<object>` { cover: boolean, paddingTop: number, paddingLeft: number, paddingBottom: number, paddingRight: number }\n * @returns Transition end promise\n * @category Methods\n */\n fitToBox(box3OrObject, enableTransition, { cover = false, paddingLeft = 0, paddingRight = 0, paddingBottom = 0, paddingTop = 0 } = {}) {\n const promises = [];\n const aabb = box3OrObject.isBox3\n ? _box3A.copy(box3OrObject)\n : _box3A.setFromObject(box3OrObject);\n if (aabb.isEmpty()) {\n console.warn('camera-controls: fitTo() cannot be used with an empty box. Aborting');\n Promise.resolve();\n }\n // round to closest axis ( forward | backward | right | left | top | bottom )\n const theta = roundToStep(this._sphericalEnd.theta, PI_HALF);\n const phi = roundToStep(this._sphericalEnd.phi, PI_HALF);\n promises.push(this.rotateTo(theta, phi, enableTransition));\n const normal = _v3A.setFromSpherical(this._sphericalEnd).normalize();\n const rotation = _quaternionA.setFromUnitVectors(normal, _AXIS_Z);\n const viewFromPolar = approxEquals(Math.abs(normal.y), 1);\n if (viewFromPolar) {\n rotation.multiply(_quaternionB.setFromAxisAngle(_AXIS_Y, theta));\n }\n rotation.multiply(this._yAxisUpSpaceInverse);\n // make oriented bounding box\n const bb = _box3B.makeEmpty();\n // left bottom back corner\n _v3B.copy(aabb.min).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right bottom back corner\n _v3B.copy(aabb.min).setX(aabb.max.x).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left top back corner\n _v3B.copy(aabb.min).setY(aabb.max.y).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right top back corner\n _v3B.copy(aabb.max).setZ(aabb.min.z).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left bottom front corner\n _v3B.copy(aabb.min).setZ(aabb.max.z).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right bottom front corner\n _v3B.copy(aabb.max).setY(aabb.min.y).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left top front corner\n _v3B.copy(aabb.max).setX(aabb.min.x).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right top front corner\n _v3B.copy(aabb.max).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // add padding\n bb.min.x -= paddingLeft;\n bb.min.y -= paddingBottom;\n bb.max.x += paddingRight;\n bb.max.y += paddingTop;\n rotation.setFromUnitVectors(_AXIS_Z, normal);\n if (viewFromPolar) {\n rotation.premultiply(_quaternionB.invert());\n }\n rotation.premultiply(this._yAxisUpSpace);\n const bbSize = bb.getSize(_v3A);\n const center = bb.getCenter(_v3B).applyQuaternion(rotation);\n if (isPerspectiveCamera(this._camera)) {\n const distance = this.getDistanceToFitBox(bbSize.x, bbSize.y, bbSize.z, cover);\n promises.push(this.moveTo(center.x, center.y, center.z, enableTransition));\n promises.push(this.dollyTo(distance, enableTransition));\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const width = camera.right - camera.left;\n const height = camera.top - camera.bottom;\n const zoom = cover ? Math.max(width / bbSize.x, height / bbSize.y) : Math.min(width / bbSize.x, height / bbSize.y);\n promises.push(this.moveTo(center.x, center.y, center.z, enableTransition));\n promises.push(this.zoomTo(zoom, enableTransition));\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n }\n return Promise.all(promises);\n }\n /**\n * Fit the viewport to the sphere or the bounding sphere of the object.\n * @param sphereOrMesh\n * @param enableTransition\n * @category Methods\n */\n fitToSphere(sphereOrMesh, enableTransition) {\n const promises = [];\n const isObject3D = 'isObject3D' in sphereOrMesh;\n const boundingSphere = isObject3D ?\n CameraControls.createBoundingSphere(sphereOrMesh, _sphere) :\n _sphere.copy(sphereOrMesh);\n promises.push(this.moveTo(boundingSphere.center.x, boundingSphere.center.y, boundingSphere.center.z, enableTransition));\n if (isPerspectiveCamera(this._camera)) {\n const distanceToFit = this.getDistanceToFitSphere(boundingSphere.radius);\n promises.push(this.dollyTo(distanceToFit, enableTransition));\n }\n else if (isOrthographicCamera(this._camera)) {\n const width = this._camera.right - this._camera.left;\n const height = this._camera.top - this._camera.bottom;\n const diameter = 2 * boundingSphere.radius;\n const zoom = Math.min(width / diameter, height / diameter);\n promises.push(this.zoomTo(zoom, enableTransition));\n }\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n return Promise.all(promises);\n }\n /**\n * Look at the `target` from the `position`.\n * @param positionX\n * @param positionY\n * @param positionZ\n * @param targetX\n * @param targetY\n * @param targetZ\n * @param enableTransition\n * @category Methods\n */\n setLookAt(positionX, positionY, positionZ, targetX, targetY, targetZ, enableTransition = false) {\n this._isUserControllingRotate = false;\n this._isUserControllingDolly = false;\n this._isUserControllingTruck = false;\n this._lastDollyDirection = DOLLY_DIRECTION.NONE;\n this._changedDolly = 0;\n const target = _v3B.set(targetX, targetY, targetZ);\n const position = _v3A.set(positionX, positionY, positionZ);\n this._targetEnd.copy(target);\n this._sphericalEnd.setFromVector3(position.sub(target).applyQuaternion(this._yAxisUpSpace));\n this.normalizeRotations();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold) &&\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold) &&\n approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Similar to setLookAt, but it interpolates between two states.\n * @param positionAX\n * @param positionAY\n * @param positionAZ\n * @param targetAX\n * @param targetAY\n * @param targetAZ\n * @param positionBX\n * @param positionBY\n * @param positionBZ\n * @param targetBX\n * @param targetBY\n * @param targetBZ\n * @param t\n * @param enableTransition\n * @category Methods\n */\n lerpLookAt(positionAX, positionAY, positionAZ, targetAX, targetAY, targetAZ, positionBX, positionBY, positionBZ, targetBX, targetBY, targetBZ, t, enableTransition = false) {\n this._isUserControllingRotate = false;\n this._isUserControllingDolly = false;\n this._isUserControllingTruck = false;\n this._lastDollyDirection = DOLLY_DIRECTION.NONE;\n this._changedDolly = 0;\n const targetA = _v3A.set(targetAX, targetAY, targetAZ);\n const positionA = _v3B.set(positionAX, positionAY, positionAZ);\n _sphericalA.setFromVector3(positionA.sub(targetA).applyQuaternion(this._yAxisUpSpace));\n const targetB = _v3C.set(targetBX, targetBY, targetBZ);\n const positionB = _v3B.set(positionBX, positionBY, positionBZ);\n _sphericalB.setFromVector3(positionB.sub(targetB).applyQuaternion(this._yAxisUpSpace));\n this._targetEnd.copy(targetA.lerp(targetB, t)); // tricky\n const deltaTheta = _sphericalB.theta - _sphericalA.theta;\n const deltaPhi = _sphericalB.phi - _sphericalA.phi;\n const deltaRadius = _sphericalB.radius - _sphericalA.radius;\n this._sphericalEnd.set(_sphericalA.radius + deltaRadius * t, _sphericalA.phi + deltaPhi * t, _sphericalA.theta + deltaTheta * t);\n this.normalizeRotations();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold) &&\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold) &&\n approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Set angle and distance by given position.\n * An alias of `setLookAt()`, without target change. Thus keep gazing at the current target\n * @param positionX\n * @param positionY\n * @param positionZ\n * @param enableTransition\n * @category Methods\n */\n setPosition(positionX, positionY, positionZ, enableTransition = false) {\n return this.setLookAt(positionX, positionY, positionZ, this._targetEnd.x, this._targetEnd.y, this._targetEnd.z, enableTransition);\n }\n /**\n * Set the target position where gaze at.\n * An alias of `setLookAt()`, without position change. Thus keep the same position.\n * @param targetX\n * @param targetY\n * @param targetZ\n * @param enableTransition\n * @category Methods\n */\n setTarget(targetX, targetY, targetZ, enableTransition = false) {\n const pos = this.getPosition(_v3A);\n const promise = this.setLookAt(pos.x, pos.y, pos.z, targetX, targetY, targetZ, enableTransition);\n // see https://github.com/yomotsu/camera-controls/issues/335\n this._sphericalEnd.phi = clamp(this._sphericalEnd.phi, this.minPolarAngle, this.maxPolarAngle);\n return promise;\n }\n /**\n * Set focal offset using the screen parallel coordinates. z doesn't affect in Orthographic as with Dolly.\n * @param x\n * @param y\n * @param z\n * @param enableTransition\n * @category Methods\n */\n setFocalOffset(x, y, z, enableTransition = false) {\n this._isUserControllingOffset = false;\n this._focalOffsetEnd.set(x, y, z);\n this._needsUpdate = true;\n if (!enableTransition)\n this._focalOffset.copy(this._focalOffsetEnd);\n const resolveImmediately = !enableTransition ||\n approxEquals(this._focalOffset.x, this._focalOffsetEnd.x, this.restThreshold) &&\n approxEquals(this._focalOffset.y, this._focalOffsetEnd.y, this.restThreshold) &&\n approxEquals(this._focalOffset.z, this._focalOffsetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Set orbit point without moving the camera.\n * SHOULD NOT RUN DURING ANIMATIONS. `setOrbitPoint()` will immediately fix the positions.\n * @param targetX\n * @param targetY\n * @param targetZ\n * @category Methods\n */\n setOrbitPoint(targetX, targetY, targetZ) {\n this._camera.updateMatrixWorld();\n _xColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 1);\n _zColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 2);\n const position = _v3A.set(targetX, targetY, targetZ);\n const distance = position.distanceTo(this._camera.position);\n const cameraToPoint = position.sub(this._camera.position);\n _xColumn.multiplyScalar(cameraToPoint.x);\n _yColumn.multiplyScalar(cameraToPoint.y);\n _zColumn.multiplyScalar(cameraToPoint.z);\n _v3A.copy(_xColumn).add(_yColumn).add(_zColumn);\n _v3A.z = _v3A.z + distance;\n this.dollyTo(distance, false);\n this.setFocalOffset(-_v3A.x, _v3A.y, -_v3A.z, false);\n this.moveTo(targetX, targetY, targetZ, false);\n }\n /**\n * Set the boundary box that encloses the target of the camera. box3 is in THREE.Box3\n * @param box3\n * @category Methods\n */\n setBoundary(box3) {\n if (!box3) {\n this._boundary.min.set(-Infinity, -Infinity, -Infinity);\n this._boundary.max.set(Infinity, Infinity, Infinity);\n this._needsUpdate = true;\n return;\n }\n this._boundary.copy(box3);\n this._boundary.clampPoint(this._targetEnd, this._targetEnd);\n this._needsUpdate = true;\n }\n /**\n * Set (or unset) the current viewport.\n * Set this when you want to use renderer viewport and .dollyToCursor feature at the same time.\n * @param viewportOrX\n * @param y\n * @param width\n * @param height\n * @category Methods\n */\n setViewport(viewportOrX, y, width, height) {\n if (viewportOrX === null) { // null\n this._viewport = null;\n return;\n }\n this._viewport = this._viewport || new THREE.Vector4();\n if (typeof viewportOrX === 'number') { // number\n this._viewport.set(viewportOrX, y, width, height);\n }\n else { // Vector4\n this._viewport.copy(viewportOrX);\n }\n }\n /**\n * Calculate the distance to fit the box.\n * @param width box width\n * @param height box height\n * @param depth box depth\n * @returns distance\n * @category Methods\n */\n getDistanceToFitBox(width, height, depth, cover = false) {\n if (notSupportedInOrthographicCamera(this._camera, 'getDistanceToFitBox'))\n return this._spherical.radius;\n const boundingRectAspect = width / height;\n const fov = this._camera.getEffectiveFOV() * DEG2RAD;\n const aspect = this._camera.aspect;\n const heightToFit = (cover ? boundingRectAspect > aspect : boundingRectAspect < aspect) ? height : width / aspect;\n return heightToFit * 0.5 / Math.tan(fov * 0.5) + depth * 0.5;\n }\n /**\n * Calculate the distance to fit the sphere.\n * @param radius sphere radius\n * @returns distance\n * @category Methods\n */\n getDistanceToFitSphere(radius) {\n if (notSupportedInOrthographicCamera(this._camera, 'getDistanceToFitSphere'))\n return this._spherical.radius;\n // https://stackoverflow.com/a/44849975\n const vFOV = this._camera.getEffectiveFOV() * DEG2RAD;\n const hFOV = Math.atan(Math.tan(vFOV * 0.5) * this._camera.aspect) * 2;\n const fov = 1 < this._camera.aspect ? vFOV : hFOV;\n return radius / (Math.sin(fov * 0.5));\n }\n /**\n * Returns the orbit center position, where the camera looking at.\n * @param out The receiving Vector3 instance to copy the result\n * @param receiveEndValue Whether receive the transition end coords or current. default is `true`\n * @category Methods\n */\n getTarget(out, receiveEndValue = true) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.copy(receiveEndValue ? this._targetEnd : this._target);\n }\n /**\n * Returns the camera position.\n * @param out The receiving Vector3 instance to copy the result\n * @param receiveEndValue Whether receive the transition end coords or current. default is `true`\n * @category Methods\n */\n getPosition(out, receiveEndValue = true) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.setFromSpherical(receiveEndValue ? this._sphericalEnd : this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(receiveEndValue ? this._targetEnd : this._target);\n }\n /**\n * Returns the spherical coordinates of the orbit.\n * @param out The receiving Spherical instance to copy the result\n * @param receiveEndValue Whether receive the transition end coords or current. default is `true`\n * @category Methods\n */\n getSpherical(out, receiveEndValue = true) {\n const _out = out || new THREE.Spherical();\n return _out.copy(receiveEndValue ? this._sphericalEnd : this._spherical);\n }\n /**\n * Returns the focal offset, which is how much the camera appears to be translated in screen parallel coordinates.\n * @param out The receiving Vector3 instance to copy the result\n * @param receiveEndValue Whether receive the transition end coords or current. default is `true`\n * @category Methods\n */\n getFocalOffset(out, receiveEndValue = true) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.copy(receiveEndValue ? this._focalOffsetEnd : this._focalOffset);\n }\n /**\n * Normalize camera azimuth angle rotation between 0 and 360 degrees.\n * @category Methods\n */\n normalizeRotations() {\n this._sphericalEnd.theta = this._sphericalEnd.theta % PI_2;\n if (this._sphericalEnd.theta < 0)\n this._sphericalEnd.theta += PI_2;\n this._spherical.theta += PI_2 * Math.round((this._sphericalEnd.theta - this._spherical.theta) / PI_2);\n }\n /**\n * stop all transitions.\n */\n stop() {\n this._focalOffset.copy(this._focalOffsetEnd);\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n this._zoom = this._zoomEnd;\n }\n /**\n * Reset all rotation and position to defaults.\n * @param enableTransition\n * @category Methods\n */\n reset(enableTransition = false) {\n if (!approxEquals(this._camera.up.x, this._cameraUp0.x) ||\n !approxEquals(this._camera.up.y, this._cameraUp0.y) ||\n !approxEquals(this._camera.up.z, this._cameraUp0.z)) {\n this._camera.up.copy(this._cameraUp0);\n const position = this.getPosition(_v3A);\n this.updateCameraUp();\n this.setPosition(position.x, position.y, position.z);\n }\n const promises = [\n this.setLookAt(this._position0.x, this._position0.y, this._position0.z, this._target0.x, this._target0.y, this._target0.z, enableTransition),\n this.setFocalOffset(this._focalOffset0.x, this._focalOffset0.y, this._focalOffset0.z, enableTransition),\n this.zoomTo(this._zoom0, enableTransition),\n ];\n return Promise.all(promises);\n }\n /**\n * Set current camera position as the default position.\n * @category Methods\n */\n saveState() {\n this._cameraUp0.copy(this._camera.up);\n this.getTarget(this._target0);\n this.getPosition(this._position0);\n this._zoom0 = this._zoom;\n this._focalOffset0.copy(this._focalOffset);\n }\n /**\n * Sync camera-up direction.\n * When camera-up vector is changed, `.updateCameraUp()` must be called.\n * @category Methods\n */\n updateCameraUp() {\n this._yAxisUpSpace.setFromUnitVectors(this._camera.up, _AXIS_Y);\n this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert();\n }\n /**\n * Apply current camera-up direction to the camera.\n * The orbit system will be re-initialized with the current position.\n * @category Methods\n */\n applyCameraUp() {\n const cameraDirection = _v3A.subVectors(this._target, this._camera.position).normalize();\n // So first find the vector off to the side, orthogonal to both this.object.up and\n // the \"view\" vector.\n const side = _v3B.crossVectors(cameraDirection, this._camera.up);\n // Then find the vector orthogonal to both this \"side\" vector and the \"view\" vector.\n // This vector will be the new \"up\" vector.\n this._camera.up.crossVectors(side, cameraDirection).normalize();\n this._camera.updateMatrixWorld();\n const position = this.getPosition(_v3A);\n this.updateCameraUp();\n this.setPosition(position.x, position.y, position.z);\n }\n /**\n * Update camera position and directions.\n * This should be called in your tick loop every time, and returns true if re-rendering is needed.\n * @param delta\n * @returns updated\n * @category Methods\n */\n update(delta) {\n const deltaTheta = this._sphericalEnd.theta - this._spherical.theta;\n const deltaPhi = this._sphericalEnd.phi - this._spherical.phi;\n const deltaRadius = this._sphericalEnd.radius - this._spherical.radius;\n const deltaTarget = _deltaTarget.subVectors(this._targetEnd, this._target);\n const deltaOffset = _deltaOffset.subVectors(this._focalOffsetEnd, this._focalOffset);\n const deltaZoom = this._zoomEnd - this._zoom;\n // update theta\n if (approxZero(deltaTheta)) {\n this._thetaVelocity.value = 0;\n this._spherical.theta = this._sphericalEnd.theta;\n }\n else {\n const smoothTime = this._isUserControllingRotate ? this.draggingSmoothTime : this.smoothTime;\n this._spherical.theta = smoothDamp(this._spherical.theta, this._sphericalEnd.theta, this._thetaVelocity, smoothTime, Infinity, delta);\n this._needsUpdate = true;\n }\n // update phi\n if (approxZero(deltaPhi)) {\n this._phiVelocity.value = 0;\n this._spherical.phi = this._sphericalEnd.phi;\n }\n else {\n const smoothTime = this._isUserControllingRotate ? this.draggingSmoothTime : this.smoothTime;\n this._spherical.phi = smoothDamp(this._spherical.phi, this._sphericalEnd.phi, this._phiVelocity, smoothTime, Infinity, delta);\n this._needsUpdate = true;\n }\n // update distance\n if (approxZero(deltaRadius)) {\n this._radiusVelocity.value = 0;\n this._spherical.radius = this._sphericalEnd.radius;\n }\n else {\n const smoothTime = this._isUserControllingDolly ? this.draggingSmoothTime : this.smoothTime;\n this._spherical.radius = smoothDamp(this._spherical.radius, this._sphericalEnd.radius, this._radiusVelocity, smoothTime, this.maxSpeed, delta);\n this._needsUpdate = true;\n }\n // update target position\n if (approxZero(deltaTarget.x) && approxZero(deltaTarget.y) && approxZero(deltaTarget.z)) {\n this._targetVelocity.set(0, 0, 0);\n this._target.copy(this._targetEnd);\n }\n else {\n const smoothTime = this._isUserControllingTruck ? this.draggingSmoothTime : this.smoothTime;\n smoothDampVec3(this._target, this._targetEnd, this._targetVelocity, smoothTime, this.maxSpeed, delta, this._target);\n this._needsUpdate = true;\n }\n // update focalOffset\n if (approxZero(deltaOffset.x) && approxZero(deltaOffset.y) && approxZero(deltaOffset.z)) {\n this._focalOffsetVelocity.set(0, 0, 0);\n this._focalOffset.copy(this._focalOffsetEnd);\n }\n else {\n const smoothTime = this._isUserControllingOffset ? this.draggingSmoothTime : this.smoothTime;\n smoothDampVec3(this._focalOffset, this._focalOffsetEnd, this._focalOffsetVelocity, smoothTime, this.maxSpeed, delta, this._focalOffset);\n this._needsUpdate = true;\n }\n // update zoom\n if (approxZero(deltaZoom)) {\n this._zoomVelocity.value = 0;\n this._zoom = this._zoomEnd;\n }\n else {\n const smoothTime = this._isUserControllingZoom ? this.draggingSmoothTime : this.smoothTime;\n this._zoom = smoothDamp(this._zoom, this._zoomEnd, this._zoomVelocity, smoothTime, Infinity, delta);\n }\n if (this.dollyToCursor) {\n if (isPerspectiveCamera(this._camera) && this._changedDolly !== 0) {\n const dollyControlAmount = this._spherical.radius - this._lastDistance;\n const camera = this._camera;\n const cameraDirection = this._getCameraDirection(_cameraDirection);\n const planeX = _v3A.copy(cameraDirection).cross(camera.up).normalize();\n if (planeX.lengthSq() === 0)\n planeX.x = 1.0;\n const planeY = _v3B.crossVectors(planeX, cameraDirection);\n const worldToScreen = this._sphericalEnd.radius * Math.tan(camera.getEffectiveFOV() * DEG2RAD * 0.5);\n const prevRadius = this._sphericalEnd.radius - dollyControlAmount;\n const lerpRatio = (prevRadius - this._sphericalEnd.radius) / this._sphericalEnd.radius;\n const cursor = _v3C.copy(this._targetEnd)\n .add(planeX.multiplyScalar(this._dollyControlCoord.x * worldToScreen * camera.aspect))\n .add(planeY.multiplyScalar(this._dollyControlCoord.y * worldToScreen));\n const newTargetEnd = _v3A.copy(this._targetEnd).lerp(cursor, lerpRatio);\n const isMin = this._lastDollyDirection === DOLLY_DIRECTION.IN && this._spherical.radius <= this.minDistance;\n const isMax = this._lastDollyDirection === DOLLY_DIRECTION.OUT && this.maxDistance <= this._spherical.radius;\n if (this.infinityDolly && (isMin || isMax)) {\n this._sphericalEnd.radius -= dollyControlAmount;\n this._spherical.radius -= dollyControlAmount;\n const dollyAmount = _v3B.copy(cameraDirection).multiplyScalar(-dollyControlAmount);\n newTargetEnd.add(dollyAmount);\n }\n // target position may be moved beyond boundary.\n this._boundary.clampPoint(newTargetEnd, newTargetEnd);\n const targetEndDiff = _v3B.subVectors(newTargetEnd, this._targetEnd);\n this._targetEnd.copy(newTargetEnd);\n this._target.add(targetEndDiff);\n this._changedDolly -= dollyControlAmount;\n if (approxZero(this._changedDolly))\n this._changedDolly = 0;\n }\n else if (isOrthographicCamera(this._camera) && this._changedZoom !== 0) {\n const dollyControlAmount = this._zoom - this._lastZoom;\n const camera = this._camera;\n const worldCursorPosition = _v3A.set(this._dollyControlCoord.x, this._dollyControlCoord.y, (camera.near + camera.far) / (camera.near - camera.far)).unproject(camera);\n const quaternion = _v3B.set(0, 0, -1).applyQuaternion(camera.quaternion);\n const cursor = _v3C.copy(worldCursorPosition).add(quaternion.multiplyScalar(-worldCursorPosition.dot(camera.up)));\n const prevZoom = this._zoom - dollyControlAmount;\n const lerpRatio = -(prevZoom - this._zoom) / this._zoom;\n // find the \"distance\" (aka plane constant in three.js) of Plane\n // from a given position (this._targetEnd) and normal vector (cameraDirection)\n // https://www.maplesoft.com/support/help/maple/view.aspx?path=MathApps%2FEquationOfAPlaneNormal#bkmrk0\n const cameraDirection = this._getCameraDirection(_cameraDirection);\n const prevPlaneConstant = this._targetEnd.dot(cameraDirection);\n const newTargetEnd = _v3A.copy(this._targetEnd).lerp(cursor, lerpRatio);\n const newPlaneConstant = newTargetEnd.dot(cameraDirection);\n // Pull back the camera depth that has moved, to be the camera stationary as zoom\n const pullBack = cameraDirection.multiplyScalar(newPlaneConstant - prevPlaneConstant);\n newTargetEnd.sub(pullBack);\n // target position may be moved beyond boundary.\n this._boundary.clampPoint(newTargetEnd, newTargetEnd);\n const targetEndDiff = _v3B.subVectors(newTargetEnd, this._targetEnd);\n this._targetEnd.copy(newTargetEnd);\n this._target.add(targetEndDiff);\n // this._target.copy( this._targetEnd );\n this._changedZoom -= dollyControlAmount;\n if (approxZero(this._changedZoom))\n this._changedZoom = 0;\n }\n }\n if (this._camera.zoom !== this._zoom) {\n this._camera.zoom = this._zoom;\n this._camera.updateProjectionMatrix();\n this._updateNearPlaneCorners();\n this._needsUpdate = true;\n }\n this._dragNeedsUpdate = true;\n // collision detection\n const maxDistance = this._collisionTest();\n this._spherical.radius = Math.min(this._spherical.radius, maxDistance);\n // decompose spherical to the camera position\n this._spherical.makeSafe();\n this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target);\n this._camera.lookAt(this._target);\n // set offset after the orbit movement\n const affectOffset = !approxZero(this._focalOffset.x) ||\n !approxZero(this._focalOffset.y) ||\n !approxZero(this._focalOffset.z);\n if (affectOffset) {\n _xColumn.setFromMatrixColumn(this._camera.matrix, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrix, 1);\n _zColumn.setFromMatrixColumn(this._camera.matrix, 2);\n _xColumn.multiplyScalar(this._focalOffset.x);\n _yColumn.multiplyScalar(-this._focalOffset.y);\n _zColumn.multiplyScalar(this._focalOffset.z); // notice: z-offset will not affect in Orthographic.\n _v3A.copy(_xColumn).add(_yColumn).add(_zColumn);\n this._camera.position.add(_v3A);\n this._camera.updateMatrixWorld();\n }\n if (this._boundaryEnclosesCamera) {\n this._encloseToBoundary(this._camera.position.copy(this._target), _v3A.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse), 1.0);\n }\n const updated = this._needsUpdate;\n if (updated && !this._updatedLastTime) {\n this._hasRested = false;\n this.dispatchEvent({ type: 'wake' });\n this.dispatchEvent({ type: 'update' });\n }\n else if (updated) {\n this.dispatchEvent({ type: 'update' });\n if (approxZero(deltaTheta, this.restThreshold) &&\n approxZero(deltaPhi, this.restThreshold) &&\n approxZero(deltaRadius, this.restThreshold) &&\n approxZero(deltaTarget.x, this.restThreshold) &&\n approxZero(deltaTarget.y, this.restThreshold) &&\n approxZero(deltaTarget.z, this.restThreshold) &&\n approxZero(deltaOffset.x, this.restThreshold) &&\n approxZero(deltaOffset.y, this.restThreshold) &&\n approxZero(deltaOffset.z, this.restThreshold) &&\n approxZero(deltaZoom, this.restThreshold) &&\n !this._hasRested) {\n this._hasRested = true;\n this.dispatchEvent({ type: 'rest' });\n }\n }\n else if (!updated && this._updatedLastTime) {\n this.dispatchEvent({ type: 'sleep' });\n }\n this._lastDistance = this._spherical.radius;\n this._lastZoom = this._zoom;\n this._updatedLastTime = updated;\n this._needsUpdate = false;\n return updated;\n }\n /**\n * Get all state in JSON string\n * @category Methods\n */\n toJSON() {\n return JSON.stringify({\n enabled: this._enabled,\n minDistance: this.minDistance,\n maxDistance: infinityToMaxNumber(this.maxDistance),\n minZoom: this.minZoom,\n maxZoom: infinityToMaxNumber(this.maxZoom),\n minPolarAngle: this.minPolarAngle,\n maxPolarAngle: infinityToMaxNumber(this.maxPolarAngle),\n minAzimuthAngle: infinityToMaxNumber(this.minAzimuthAngle),\n maxAzimuthAngle: infinityToMaxNumber(this.maxAzimuthAngle),\n smoothTime: this.smoothTime,\n draggingSmoothTime: this.draggingSmoothTime,\n dollySpeed: this.dollySpeed,\n truckSpeed: this.truckSpeed,\n dollyToCursor: this.dollyToCursor,\n target: this._targetEnd.toArray(),\n position: _v3A.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),\n zoom: this._zoomEnd,\n focalOffset: this._focalOffsetEnd.toArray(),\n target0: this._target0.toArray(),\n position0: this._position0.toArray(),\n zoom0: this._zoom0,\n focalOffset0: this._focalOffset0.toArray(),\n });\n }\n /**\n * Reproduce the control state with JSON. enableTransition is where anim or not in a boolean.\n * @param json\n * @param enableTransition\n * @category Methods\n */\n fromJSON(json, enableTransition = false) {\n const obj = JSON.parse(json);\n this.enabled = obj.enabled;\n this.minDistance = obj.minDistance;\n this.maxDistance = maxNumberToInfinity(obj.maxDistance);\n this.minZoom = obj.minZoom;\n this.maxZoom = maxNumberToInfinity(obj.maxZoom);\n this.minPolarAngle = obj.minPolarAngle;\n this.maxPolarAngle = maxNumberToInfinity(obj.maxPolarAngle);\n this.minAzimuthAngle = maxNumberToInfinity(obj.minAzimuthAngle);\n this.maxAzimuthAngle = maxNumberToInfinity(obj.maxAzimuthAngle);\n this.smoothTime = obj.smoothTime;\n this.draggingSmoothTime = obj.draggingSmoothTime;\n this.dollySpeed = obj.dollySpeed;\n this.truckSpeed = obj.truckSpeed;\n this.dollyToCursor = obj.dollyToCursor;\n this._target0.fromArray(obj.target0);\n this._position0.fromArray(obj.position0);\n this._zoom0 = obj.zoom0;\n this._focalOffset0.fromArray(obj.focalOffset0);\n this.moveTo(obj.target[0], obj.target[1], obj.target[2], enableTransition);\n _sphericalA.setFromVector3(_v3A.fromArray(obj.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace));\n this.rotateTo(_sphericalA.theta, _sphericalA.phi, enableTransition);\n this.dollyTo(_sphericalA.radius, enableTransition);\n this.zoomTo(obj.zoom, enableTransition);\n this.setFocalOffset(obj.focalOffset[0], obj.focalOffset[1], obj.focalOffset[2], enableTransition);\n this._needsUpdate = true;\n }\n /**\n * Attach all internal event handlers to enable drag control.\n * @category Methods\n */\n connect(domElement) {\n if (this._domElement) {\n console.warn('camera-controls is already connected.');\n return;\n }\n domElement.setAttribute('data-camera-controls-version', VERSION);\n this._addAllEventListeners(domElement);\n this._getClientRect(this._elementRect);\n }\n /**\n * Detach all internal event handlers to disable drag control.\n */\n disconnect() {\n this.cancel();\n this._removeAllEventListeners();\n if (this._domElement) {\n this._domElement.removeAttribute('data-camera-controls-version');\n this._domElement = undefined;\n }\n }\n /**\n * Dispose the cameraControls instance itself, remove all eventListeners.\n * @category Methods\n */\n dispose() {\n // remove all user event listeners\n this.removeAllEventListeners();\n // remove all internal event listeners\n this.disconnect();\n }\n // it's okay to expose public though\n _getTargetDirection(out) {\n // divide by distance to normalize, lighter than `Vector3.prototype.normalize()`\n return out.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse);\n }\n // it's okay to expose public though\n _getCameraDirection(out) {\n return this._getTargetDirection(out).negate();\n }\n _findPointerById(pointerId) {\n return this._activePointers.find((activePointer) => activePointer.pointerId === pointerId);\n }\n _findPointerByMouseButton(mouseButton) {\n return this._activePointers.find((activePointer) => activePointer.mouseButton === mouseButton);\n }\n _disposePointer(pointer) {\n this._activePointers.splice(this._activePointers.indexOf(pointer), 1);\n }\n _encloseToBoundary(position, offset, friction) {\n const offsetLength2 = offset.lengthSq();\n if (offsetLength2 === 0.0) { // sanity check\n return position;\n }\n // See: https://twitter.com/FMS_Cat/status/1106508958640988161\n const newTarget = _v3B.copy(offset).add(position); // target\n const clampedTarget = this._boundary.clampPoint(newTarget, _v3C); // clamped target\n const deltaClampedTarget = clampedTarget.sub(newTarget); // newTarget -> clampedTarget\n const deltaClampedTargetLength2 = deltaClampedTarget.lengthSq(); // squared length of deltaClampedTarget\n if (deltaClampedTargetLength2 === 0.0) { // when the position doesn't have to be clamped\n return position.add(offset);\n }\n else if (deltaClampedTargetLength2 === offsetLength2) { // when the position is completely stuck\n return position;\n }\n else if (friction === 0.0) {\n return position.add(offset).add(deltaClampedTarget);\n }\n else {\n const offsetFactor = 1.0 + friction * deltaClampedTargetLength2 / offset.dot(deltaClampedTarget);\n return position\n .add(_v3B.copy(offset).multiplyScalar(offsetFactor))\n .add(deltaClampedTarget.multiplyScalar(1.0 - friction));\n }\n }\n _updateNearPlaneCorners() {\n if (isPerspectiveCamera(this._camera)) {\n const camera = this._camera;\n const near = camera.near;\n const fov = camera.getEffectiveFOV() * DEG2RAD;\n const heightHalf = Math.tan(fov * 0.5) * near; // near plain half height\n const widthHalf = heightHalf * camera.aspect; // near plain half width\n this._nearPlaneCorners[0].set(-widthHalf, -heightHalf, 0);\n this._nearPlaneCorners[1].set(widthHalf, -heightHalf, 0);\n this._nearPlaneCorners[2].set(widthHalf, heightHalf, 0);\n this._nearPlaneCorners[3].set(-widthHalf, heightHalf, 0);\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const zoomInv = 1 / camera.zoom;\n const left = camera.left * zoomInv;\n const right = camera.right * zoomInv;\n const top = camera.top * zoomInv;\n const bottom = camera.bottom * zoomInv;\n this._nearPlaneCorners[0].set(left, top, 0);\n this._nearPlaneCorners[1].set(right, top, 0);\n this._nearPlaneCorners[2].set(right, bottom, 0);\n this._nearPlaneCorners[3].set(left, bottom, 0);\n }\n }\n // lateUpdate\n _collisionTest() {\n let distance = Infinity;\n const hasCollider = this.colliderMeshes.length >= 1;\n if (!hasCollider)\n return distance;\n if (notSupportedInOrthographicCamera(this._camera, '_collisionTest'))\n return distance;\n const rayDirection = this._getTargetDirection(_cameraDirection);\n _rotationMatrix.lookAt(_ORIGIN, rayDirection, this._camera.up);\n for (let i = 0; i < 4; i++) {\n const nearPlaneCorner = _v3B.copy(this._nearPlaneCorners[i]);\n nearPlaneCorner.applyMatrix4(_rotationMatrix);\n const origin = _v3C.addVectors(this._target, nearPlaneCorner);\n _raycaster.set(origin, rayDirection);\n _raycaster.far = this._spherical.radius + 1;\n const intersects = _raycaster.intersectObjects(this.colliderMeshes);\n if (intersects.length !== 0 && intersects[0].distance < distance) {\n distance = intersects[0].distance;\n }\n }\n return distance;\n }\n /**\n * Get its client rect and package into given `DOMRect` .\n */\n _getClientRect(target) {\n if (!this._domElement)\n return;\n const rect = this._domElement.getBoundingClientRect();\n target.x = rect.left;\n target.y = rect.top;\n if (this._viewport) {\n target.x += this._viewport.x;\n target.y += rect.height - this._viewport.w - this._viewport.y;\n target.width = this._viewport.z;\n target.height = this._viewport.w;\n }\n else {\n target.width = rect.width;\n target.height = rect.height;\n }\n return target;\n }\n _createOnRestPromise(resolveImmediately) {\n if (resolveImmediately)\n return Promise.resolve();\n this._hasRested = false;\n this.dispatchEvent({ type: 'transitionstart' });\n return new Promise((resolve) => {\n const onResolve = () => {\n this.removeEventListener('rest', onResolve);\n resolve();\n };\n this.addEventListener('rest', onResolve);\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _addAllEventListeners(_domElement) { }\n _removeAllEventListeners() { }\n /**\n * backward compatible\n * @deprecated use smoothTime (in seconds) instead\n * @category Properties\n */\n get dampingFactor() {\n console.warn('.dampingFactor has been deprecated. use smoothTime (in seconds) instead.');\n return 0;\n }\n /**\n * backward compatible\n * @deprecated use smoothTime (in seconds) instead\n * @category Properties\n */\n set dampingFactor(_) {\n console.warn('.dampingFactor has been deprecated. use smoothTime (in seconds) instead.');\n }\n /**\n * backward compatible\n * @deprecated use draggingSmoothTime (in seconds) instead\n * @category Properties\n */\n get draggingDampingFactor() {\n console.warn('.draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.');\n return 0;\n }\n /**\n * backward compatible\n * @deprecated use draggingSmoothTime (in seconds) instead\n * @category Properties\n */\n set draggingDampingFactor(_) {\n console.warn('.draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.');\n }\n static createBoundingSphere(object3d, out = new THREE.Sphere()) {\n const boundingSphere = out;\n const center = boundingSphere.center;\n _box3A.makeEmpty();\n // find the center\n object3d.traverseVisible((object) => {\n if (!object.isMesh)\n return;\n _box3A.expandByObject(object);\n });\n _box3A.getCenter(center);\n // find the radius\n let maxRadiusSq = 0;\n object3d.traverseVisible((object) => {\n if (!object.isMesh)\n return;\n const mesh = object;\n if (!mesh.geometry)\n return;\n const geometry = mesh.geometry.clone();\n geometry.applyMatrix4(mesh.matrixWorld);\n const bufferGeometry = geometry;\n const position = bufferGeometry.attributes.position;\n for (let i = 0, l = position.count; i < l; i++) {\n _v3A.fromBufferAttribute(position, i);\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_v3A));\n }\n });\n boundingSphere.radius = Math.sqrt(maxRadiusSq);\n return boundingSphere;\n }\n}\n\nexport { EventDispatcher, CameraControls as default };\n","import type { Vector3 } from 'three';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n\nimport type { CrsName } from '@/configuration/crs';\nimport type { LookAt } from '@/configuration/lookAt';\n\nexport default class CameraPosition {\n public readonly camera: Vector3;\n public readonly focalOffset: Vector3;\n public readonly target: Vector3;\n\n public constructor(camera: Vector3, target: Vector3, focalOffset: Vector3) {\n this.camera = camera;\n this.target = target;\n this.focalOffset = focalOffset;\n }\n\n public toLookAt(crs: CrsName): LookAt {\n const altitude = this.camera.z;\n const { latitude, longitude } = new Coordinates(\n crs,\n this.camera.x,\n this.camera.y,\n altitude,\n ).as('EPSG:4326');\n\n // TODO check formulas\n const heading = Math.atan2(this.target.x - this.camera.x, this.target.y - this.camera.y);\n const tilt = Math.atan2(\n Math.sqrt((this.target.x - this.camera.x) ** 2 + (this.target.y - this.camera.y) ** 2),\n this.target.z - this.camera.z,\n );\n\n return { altitude, heading, latitude, longitude, tilt };\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type GUI from 'lil-gui';\n\nimport Panel from '@giro3d/giro3d/gui/Panel';\nimport { Vector3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\n\nimport CameraPosition from '@/types/CameraPosition';\n\nclass CameraControlsInspector extends Panel {\n public camera: CameraController;\n private _boundOnAfterCameraUpdate: () => void;\n private _cameraPosition: CameraPosition;\n\n /**\n * @param gui - The GUI.\n * @param instance - The Giro3D instance.\n */\n public constructor(gui: GUI, cameraController: CameraController, instance: Instance) {\n super(gui, instance, 'Camera Controls');\n\n this.camera = cameraController;\n this._cameraPosition = new CameraPosition(new Vector3(), new Vector3(), new Vector3());\n\n this._boundOnAfterCameraUpdate = this.onAfterCameraUpdate.bind(this);\n this.instance.addEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n const position = this.gui.addFolder('Position');\n position.close();\n this._controllers.push(position.add(this._cameraPosition.camera, 'x'));\n this._controllers.push(position.add(this._cameraPosition.camera, 'y'));\n this._controllers.push(position.add(this._cameraPosition.camera, 'z'));\n\n const target = this.gui.addFolder('Target');\n target.close();\n this._controllers.push(target.add(this._cameraPosition.target, 'x'));\n this._controllers.push(target.add(this._cameraPosition.target, 'y'));\n this._controllers.push(target.add(this._cameraPosition.target, 'z'));\n\n const focalOffset = this.gui.addFolder('Focal offset');\n focalOffset.close();\n this._controllers.push(focalOffset.add(this._cameraPosition.focalOffset, 'x'));\n this._controllers.push(focalOffset.add(this._cameraPosition.focalOffset, 'y'));\n this._controllers.push(focalOffset.add(this._cameraPosition.focalOffset, 'z'));\n }\n\n public override dispose(): void {\n this.instance.removeEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n super.dispose();\n }\n\n private onAfterCameraUpdate(): void {\n this.camera.getCameraPosition(this._cameraPosition);\n }\n}\n\nexport default CameraControlsInspector;\n","import type Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type { MapConstructorOptions } from '@giro3d/giro3d/entities/Map';\nimport type Inspector from '@giro3d/giro3d/gui/Inspector';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport { defineStore } from 'pinia';\nimport { DoubleSide } from 'three';\nimport { shallowRef } from 'vue';\n\nimport type { LookAt } from '@/configuration/lookAt';\n\nimport { getConfig } from '@/configurationLoader';\nimport { toGiro3DExtent } from '@/utils/Configuration';\n\nexport const useGiro3dStore = defineStore('giro3d', () => {\n const mainView = shallowRef<Instance | null>(null);\n const inspector = shallowRef<Inspector | null>(null);\n\n function getMainView(): Instance | null {\n return mainView.value;\n }\n\n function setMainView(instance: Instance | null): void {\n mainView.value = instance;\n }\n\n function getInspector(): Inspector | null {\n return inspector.value;\n }\n\n function setInspector(i: Inspector | null): void {\n inspector.value = i;\n }\n\n function getDefaultCameraPosition(): Coordinates {\n const config = getConfig();\n const conf = config.scene.camera;\n\n return new Coordinates('EPSG:4326', conf.longitude, conf.latitude, conf.altitude).as(\n config.scene.crs,\n );\n }\n\n function getDefaultLookAt(): LookAt {\n const config = getConfig();\n\n return config.scene.camera;\n }\n\n function getDefaultBasemapOptions(): Omit<MapConstructorOptions, 'extent'> {\n const opts: Omit<MapConstructorOptions, 'extent'> = {\n backgroundColor: 'white',\n lighting: {\n elevationLayersOnly: true,\n enabled: true,\n },\n side: DoubleSide,\n terrain: {\n enabled: true,\n },\n };\n return opts;\n }\n\n function getDefaultBasemapExtent(): Extent {\n const config = getConfig();\n\n const input = config.scene.basemap.extent;\n\n return toGiro3DExtent(input, config.scene.crs);\n }\n\n function getCRS(): string {\n const config = getConfig();\n return config.scene.crs;\n }\n\n function notifyChange(): void {\n mainView.value?.notifyChange();\n }\n\n return {\n getCRS,\n getDefaultBasemapExtent,\n getDefaultBasemapOptions,\n getDefaultCameraPosition,\n getDefaultLookAt,\n getInspector,\n getMainView,\n notifyChange,\n setInspector,\n setMainView,\n };\n});\n","import type Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport type Inspector from '@giro3d/giro3d/gui/Inspector';\nimport type { Object3D } from 'three';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport CameraControls from 'camera-controls';\nimport {\n Box3,\n Clock,\n EventDispatcher,\n MathUtils,\n Matrix4,\n Quaternion,\n Raycaster,\n Sphere,\n Spherical,\n Vector2,\n Vector3,\n Vector4,\n} from 'three';\n\nimport type NavigationMode from '@/types/NavigationMode';\n\nimport CameraControlsInspector from '@/giro3d/CameraControlsInspector';\nimport { useCameraStore } from '@/stores/camera';\nimport { useGiro3dStore } from '@/stores/giro3d';\nimport CameraPosition from '@/types/CameraPosition';\n\nimport type Picker from './picking';\nimport type SceneCursorManager from './SceneCursorManager';\n\nCameraControls.install({\n THREE: {\n Box3,\n MathUtils,\n Matrix4,\n Quaternion,\n Raycaster,\n Sphere,\n Spherical,\n Vector2,\n Vector3,\n Vector4,\n },\n});\n\ntype CameraControllerEventMap = {\n 'interaction-end': {\n /** empty */\n };\n 'interaction-start': {\n /** empty */\n };\n};\n\nconst tmpVec3 = new Vector3();\n\n/**\n * Wraps Camera-controls into Giro3D\n */\nclass CameraController extends EventDispatcher<CameraControllerEventMap> {\n public get enabled(): boolean {\n return this._orbitControls.enabled;\n }\n public set enabled(v: boolean) {\n this._orbitControls.enabled = v;\n }\n private readonly _boundOnAfterCameraUpdate: () => void;\n private readonly _boundOnBeforeCameraUpdate: () => void;\n private _boundOrbitControlsOnContextMenu!: (e: MouseEvent) => void;\n private _boundOrbitControlsOnKey!: (e: KeyboardEvent) => void;\n private _boundOrbitControlsOnMouseUp!: (e: MouseEvent) => void;\n private _boundOrbitControlsOnWheel!: (e: MouseEvent) => void;\n private _boundPositionOnMapOnClick: ((e: MouseEvent) => void) | null;\n private _boundPositionOnMapOnContextMenu: ((e: MouseEvent) => void) | null;\n private _boundPositionOnMapOnMouseMove: ((e: MouseEvent) => void) | null;\n private _cameraControlsInspector: CameraControlsInspector | null;\n private readonly _clock: Clock;\n private readonly _cursorManager: SceneCursorManager;\n private readonly _giro3dStore = useGiro3dStore();\n private readonly _instance: Instance;\n private readonly _orbitControls: CameraControls;\n private readonly _picker: Picker;\n private readonly _pickObjectsAt: (e: MouseEvent) => PickResult | null;\n\n private readonly _store = useCameraStore();\n\n /**\n * Creates new Camera-controls and bind them to Giro3D.\n *\n * @param instance - Giro3D instance\n * @param picker - Picker\n */\n public constructor(instance: Instance, picker: Picker, cursorManager: SceneCursorManager) {\n super();\n this._instance = instance;\n this._picker = picker;\n this._cursorManager = cursorManager;\n this._orbitControls = new CameraControls(\n this._instance.view.camera,\n this._instance.domElement,\n );\n\n this._cameraControlsInspector = null;\n\n this.initializeOrbitControls();\n\n this._pickObjectsAt = (event: MouseEvent): PickResult | null =>\n this._picker.getFirstFeatureAt(this._instance, event, 1)?.at(0) ?? null;\n\n this._clock = new Clock();\n\n // Update controls from event loop - this replaces the requestAnimationFrame logic from\n // camera-controls sample code\n this._boundOnBeforeCameraUpdate = this.onBeforeCameraUpdate.bind(this);\n this._boundOnAfterCameraUpdate = this.onAfterCameraUpdate.bind(this);\n this._instance.addEventListener('before-camera-update', this._boundOnBeforeCameraUpdate);\n this._instance.addEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n this._boundPositionOnMapOnClick = null;\n this._boundPositionOnMapOnMouseMove = null;\n this._boundPositionOnMapOnContextMenu = null;\n\n this._store.$onAction(({ args, name }) => {\n switch (name) {\n case 'lookTopDownAt':\n void this.lookTopDownAt(args[0]);\n break;\n case 'setCameraPosition':\n this.setCamera(args[0]);\n break;\n case 'setNavigationMode':\n this.setNavigationMode(args[0]);\n break;\n }\n });\n\n const inspector = this._giro3dStore.getInspector();\n if (inspector != null) {\n this.initializeInspector(inspector);\n }\n this._giro3dStore.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'setInspector':\n this.initializeInspector(args[0]);\n break;\n }\n });\n });\n }\n\n public dispose(): void {\n this._instance.removeEventListener('before-camera-update', this._boundOnBeforeCameraUpdate);\n this._instance.removeEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n this._disablePositionOnMap();\n this.disposeOrbitControls();\n }\n\n /**\n * Executes an interaction with animation.\n *\n * Required to call this instead of calling directly camera-controls because\n * of how Giro3D mainloop works.\n *\n * @param callback - Interaction to execute\n * @returns Resolves when interaction is done\n */\n public executeInteraction<T = void>(callback: () => Promise<T>): Promise<T> {\n this._orbitControls.update(this._clock.getDelta());\n\n // Execute the interaction\n const res = callback();\n\n // As mainloop can pause, before_camera_update can be triggered irregularly\n // Make sure to \"reset\" the clock to enable smooth transitions with camera-controls\n this._orbitControls.update(this._clock.getDelta());\n // Dispatch events so giro3d and giro3dservice gets notified\n this._orbitControls.dispatchEvent({ type: 'update' });\n return res;\n }\n\n public getCameraPosition(target?: CameraPosition): CameraPosition {\n const controls = this._orbitControls;\n const cameraPosition =\n target ?? new CameraPosition(new Vector3(), new Vector3(), new Vector3());\n\n controls.getPosition(cameraPosition.camera);\n controls.getTarget(cameraPosition.target);\n controls.getFocalOffset(cameraPosition.focalOffset);\n\n return cameraPosition;\n }\n /**\n * Looks to a bounding box or Object3D.\n *\n * @param obj - Bounding box or Object to look at\n * @param enableTransition - Enables transition\n * @param options - Camera-controls' fitToBox options\n * @returns Resolves when interaction is done\n */\n public goToBox(\n obj: Box3 | Entity3D | Object3D,\n enableTransition: boolean = true,\n options: object = {\n paddingBottom: 10,\n paddingLeft: 10,\n paddingRight: 10,\n paddingTop: 10,\n },\n ): Promise<void[]> {\n const bbox = this.getBox(obj);\n return this.executeInteraction(() => {\n void this._orbitControls.setFocalOffset(0, 0, 0);\n return this._orbitControls.fitToBox(bbox, enableTransition, options);\n });\n }\n\n /**\n * Sets the camera to look at a position.\n *\n * @param position - Position of the camera\n * @param lookAt - Posiiton to look at\n * @param enableTransition - Enables transition\n * @returns Resolves when interaction is done\n */\n public async lookAt(\n position: Vector3,\n lookAt: Vector3,\n enableTransition: boolean = false,\n ): Promise<void> {\n await this.executeInteraction(async () => {\n // Need to reset focal offset because of orbit point\n // https://github.com/yomotsu/camera-controls/issues/303\n void this._orbitControls.setFocalOffset(0, 0, 0, false);\n return this._orbitControls.setLookAt(\n position.x,\n position.y,\n position.z,\n lookAt.x,\n lookAt.y,\n lookAt.z,\n enableTransition,\n );\n });\n this._orbitControls.setOrbitPoint(lookAt.x, lookAt.y, lookAt.z);\n }\n\n public lookTopDownAt(obj: Box3 | Entity3D | Object3D, enableTransition = true): Promise<void> {\n const center = new Vector3();\n const size = new Vector3();\n const newCameraPosition = new Vector3(0, 0, 1);\n\n const bbox = this.getBox(obj);\n bbox.min.z = bbox.max.z;\n bbox.getCenter(center);\n bbox.getSize(size);\n\n const distance = this._orbitControls.getDistanceToFitBox(size.x, size.y, 0);\n const cameraPosition = newCameraPosition.multiplyScalar(distance).add(center);\n\n // Slightly offset camera to avoid gimbal lock\n // cameraPosition.x += size.x / 10;\n cameraPosition.y -= 0.01;\n\n return this.lookAt(cameraPosition, center, enableTransition);\n }\n public setCamera(pos: CameraPosition): void {\n void this.executeInteraction(async () => {\n this._orbitControls.setOrbitPoint(0, 0, 0);\n void this._orbitControls.setLookAt(\n pos.camera.x,\n pos.camera.y,\n pos.camera.z,\n pos.target.x,\n pos.target.y,\n pos.target.z,\n false,\n );\n void this._orbitControls.setFocalOffset(\n pos.focalOffset.z,\n pos.focalOffset.y,\n pos.focalOffset.z,\n false,\n );\n this._orbitControls.update(0);\n return Promise.resolve();\n });\n }\n\n /**\n * Sets initial position of camera to view an extent.\n *\n * @param extent - Extent to look at\n * @param altitude - Altitude of camera\n */\n public setInitialPosition(extent: Extent, altitude = 4000): void {\n const cameraPosition = new Coordinates(\n extent.crs,\n extent.west,\n extent.south,\n altitude,\n ).toVector3();\n const center = extent.centerAsVector3();\n void this.lookAt(cameraPosition, center, false);\n }\n\n protected getBox(obj: Box3 | Entity3D | Object3D): Box3 {\n // We produce broken CityJSON (bbox.max.z being 10e38), workaround that!\n let bbox = new Box3();\n if ((obj as Box3).isBox3) {\n bbox = (obj as Box3).clone();\n } else if ((obj as Entity3D).isEntity3D) {\n const entity3d = obj as Entity3D;\n const entityBbox = entity3d.getBoundingBox();\n if (entityBbox && !entityBbox.isEmpty()) {\n bbox = entityBbox.clone();\n } else if ('extent' in entity3d) {\n // In case object is hidden\n bbox = (entity3d.extent as Extent).toBox3(0, 200);\n }\n } else if ((obj as Object3D).isObject3D) {\n bbox.setFromObject(obj as Object3D);\n } else {\n throw new Error('obj should be instanceof Box3, Object3D or Entity3D');\n }\n if (bbox.isEmpty()) {\n throw new Error('Could not find bounding box of object');\n }\n\n bbox.min.z = Math.max(bbox.min.z, 0);\n bbox.max.z = Math.min(bbox.max.z, 2000);\n\n return bbox;\n }\n\n private _disablePositionOnMap(): void {\n if (\n this._boundPositionOnMapOnClick ||\n this._boundPositionOnMapOnMouseMove ||\n this._boundPositionOnMapOnContextMenu\n ) {\n if (this._boundPositionOnMapOnClick) {\n this._instance.domElement.removeEventListener(\n 'click',\n this._boundPositionOnMapOnClick,\n );\n }\n this._boundPositionOnMapOnClick = null;\n\n if (this._boundPositionOnMapOnMouseMove) {\n this._instance.domElement.removeEventListener(\n 'mousemove',\n this._boundPositionOnMapOnMouseMove,\n );\n }\n this._boundPositionOnMapOnMouseMove = null;\n\n if (this._boundPositionOnMapOnContextMenu) {\n this._instance.domElement.removeEventListener(\n 'contextmenu',\n this._boundPositionOnMapOnContextMenu,\n );\n }\n this._boundPositionOnMapOnContextMenu = null;\n\n this._cursorManager.setCursor(null);\n this._instance.notifyChange();\n }\n }\n\n private _enablePositionOnMap(): void {\n this._cursorManager.setCursor('street');\n this._boundPositionOnMapOnClick = this.onPositionOnMapClick.bind(this);\n this._boundPositionOnMapOnMouseMove = this.onPositionOnMapMouseMove.bind(this);\n this._boundPositionOnMapOnContextMenu = this.onPositionOnMapContextMenu.bind(this);\n\n this._instance.domElement.addEventListener(\n 'mousemove',\n this._boundPositionOnMapOnMouseMove,\n );\n this._instance.domElement.addEventListener('click', this._boundPositionOnMapOnClick);\n this._instance.domElement.addEventListener(\n 'contextmenu',\n this._boundPositionOnMapOnContextMenu,\n );\n }\n\n private disposeOrbitControls(): void {\n this._instance.domElement.removeEventListener('keydown', this._boundOrbitControlsOnKey);\n\n this._instance.domElement.removeEventListener('wheel', this._boundOrbitControlsOnWheel);\n\n this._instance.domElement.removeEventListener(\n 'contextmenu',\n this._boundOrbitControlsOnContextMenu,\n );\n document.removeEventListener('mouseup', this._boundOrbitControlsOnMouseUp);\n\n this._orbitControls.disconnect();\n }\n\n private initializeInspector(inspector: Inspector | null): void {\n if (this._cameraControlsInspector) {\n this._cameraControlsInspector.dispose();\n }\n\n if (inspector) {\n this._cameraControlsInspector = new CameraControlsInspector(\n inspector.gui,\n this,\n this._instance,\n );\n inspector.addPanel(this._cameraControlsInspector);\n }\n }\n\n private initializeOrbitControls(): void {\n this._orbitControls.infinityDolly = true; // Prevents being stuck when hitting the target\n\n this.setNavigationMode(this._store.getNavigationMode());\n\n // Make rotation around where the user clicked when Orbit\n this._boundOrbitControlsOnContextMenu = this.orbitControlsOnContextMenu.bind(this);\n this._boundOrbitControlsOnMouseUp = this.orbitControlsOnMouseUp.bind(this);\n this._instance.domElement.addEventListener(\n 'contextmenu',\n this._boundOrbitControlsOnContextMenu,\n );\n document.addEventListener('mouseup', this._boundOrbitControlsOnMouseUp);\n\n // \"Patch\" camera-controls for nicer event handlers\n this._boundOrbitControlsOnWheel = this.orbitControlsOnWheel.bind(this);\n this._instance.domElement.addEventListener('wheel', this._boundOrbitControlsOnWheel);\n\n // As Giro3d runs the event loop only when needed, we need to notify Giro3d when\n // the controls update the view.\n // We need both events to make sure the view is updated from user interactions and from\n // animations\n this._orbitControls.addEventListener('update', () =>\n this._instance.notifyChange(this._instance.view.camera),\n );\n this._orbitControls.addEventListener('control', () =>\n this._instance.notifyChange(this._instance.view.camera),\n );\n\n // Dispatch our events\n this._orbitControls.addEventListener('control', () => {\n if (this._orbitControls.active || this._orbitControls.currentAction !== 0) {\n this.dispatchEvent({ type: 'interaction-start' });\n this._store.setIsUserInteracting(true);\n }\n });\n this._orbitControls.addEventListener('controlend', () =>\n setTimeout(() => {\n this._store.setIsUserInteracting(false);\n this.dispatchEvent({ type: 'interaction-end' });\n }),\n );\n\n this._boundOrbitControlsOnKey = this.orbitControlsOnKey.bind(this);\n this._instance.domElement.addEventListener('keydown', this._boundOrbitControlsOnKey);\n }\n\n private onAfterCameraUpdate(): void {\n // this.instance.view.camera.position is *not always* the same as orbitControls.getPosition()\n this._store.setCurrentPosition(\n this.getCameraPosition(),\n this._instance.view.camera.position,\n );\n }\n\n private onBeforeCameraUpdate(): void {\n // Called from giro3d\n const delta = this._clock.getDelta();\n const hasControlsUpdated = this._orbitControls.update(delta);\n if (hasControlsUpdated) {\n this._instance.notifyChange(this._instance.view.camera);\n }\n }\n\n private onPositionOnMapClick(e: MouseEvent): void {\n const picked = this._picker.getMapAt(this._instance, e);\n if (picked) {\n this._disablePositionOnMap();\n\n const direction = new Vector3();\n this._instance.view.camera.getWorldDirection(direction);\n direction.normalize().setLength(3);\n\n const newPosition = picked.point.clone();\n newPosition.z += 1.7;\n\n const newTarget = newPosition.clone();\n newTarget.add(direction);\n newTarget.z = newPosition.z;\n\n void this.lookAt(newPosition, newTarget, true).finally(() =>\n this._store.setNavigationMode('first-person'),\n );\n }\n }\n\n private onPositionOnMapContextMenu(e: MouseEvent): void {\n this._disablePositionOnMap();\n this._store.setNavigationMode('orbit');\n e.preventDefault();\n }\n\n private onPositionOnMapMouseMove(e: MouseEvent): void {\n const picked = this._picker.getMapAt(this._instance, e);\n this._instance.domElement.style.cursor = picked ? 'none' : 'auto';\n this._cursorManager.setCursor(picked != null ? 'street' : null);\n if (picked) {\n this._cursorManager.setCursorLocation(picked.point);\n }\n this._instance.notifyChange();\n }\n\n private orbitControlsOnContextMenu(e: MouseEvent): void {\n if (this._store.getNavigationMode() !== 'orbit') {\n return;\n }\n\n this._cursorManager.setCursor('orbit');\n const picked = this._pickObjectsAt(e);\n if (picked) {\n this._cursorManager.setCursorLocation(picked.point);\n this._orbitControls.setOrbitPoint(picked.point.x, picked.point.y, picked.point.z);\n } else {\n // We didn't pick anything, we'll orbit around the target\n const cursorLocation = this._orbitControls.getTarget(tmpVec3);\n this._cursorManager.setCursorLocation(cursorLocation);\n }\n }\n\n private orbitControlsOnKey(e: KeyboardEvent): void {\n const navigationMode = this._store.getNavigationMode();\n\n if (navigationMode === 'position-on-map') {\n if (e.code === 'Escape') {\n this._store.setNavigationMode('orbit');\n }\n return;\n }\n\n if (navigationMode !== 'orbit' && navigationMode !== 'first-person') {\n return;\n }\n\n const keys = {\n ARROW_BOTTOM: 'ArrowDown',\n ARROW_LEFT: 'ArrowLeft',\n ARROW_RIGHT: 'ArrowRight',\n ARROW_UP: 'ArrowUp',\n KEY_DOWN: 'KeyS',\n KEY_LEFT: 'KeyA',\n KEY_RIGHT: 'KeyD',\n KEY_UP: 'KeyW',\n };\n\n let forwardDirection = 0;\n let dollyDirection = 0;\n let truckDirectionX = 0;\n let truckDirectionY = 0;\n let factor = e.ctrlKey || e.metaKey || e.shiftKey ? 200 : 20;\n\n // Reduce the factor in FPV as we should be close to our data\n if (navigationMode === 'first-person') {\n factor /= 10;\n }\n\n switch (e.code) {\n case keys.ARROW_BOTTOM:\n if (navigationMode === 'first-person') {\n dollyDirection = -1;\n } else {\n forwardDirection = -1;\n }\n break;\n\n case keys.ARROW_LEFT:\n\n case keys.KEY_LEFT:\n truckDirectionX = -1;\n break;\n\n case keys.ARROW_RIGHT:\n\n case keys.KEY_RIGHT:\n truckDirectionX = 1;\n break;\n case keys.ARROW_UP:\n if (navigationMode === 'first-person') {\n dollyDirection = 1;\n } else {\n forwardDirection = 1;\n }\n break;\n\n case keys.KEY_DOWN:\n truckDirectionY = 1;\n break;\n case keys.KEY_UP:\n truckDirectionY = -1;\n break;\n\n default:\n // do nothing\n }\n if (forwardDirection) {\n void this.executeInteraction(() =>\n this._orbitControls.forward(\n forwardDirection * this._orbitControls.truckSpeed * factor,\n true,\n ),\n );\n }\n if (dollyDirection) {\n void this.executeInteraction(() =>\n this._orbitControls.dollyInFixed(\n dollyDirection * this._orbitControls.truckSpeed * factor,\n true,\n ),\n );\n }\n if (truckDirectionX) {\n void this.executeInteraction(() =>\n this._orbitControls.truck(\n truckDirectionX * this._orbitControls.truckSpeed * factor,\n 0,\n true,\n ),\n );\n }\n if (truckDirectionY) {\n void this.executeInteraction(() =>\n this._orbitControls.truck(\n 0,\n truckDirectionY * this._orbitControls.truckSpeed * factor,\n true,\n ),\n );\n }\n }\n\n private orbitControlsOnMouseUp(): void {\n if (this._store.getNavigationMode() !== 'orbit') {\n return;\n }\n\n this._cursorManager.setCursor(null);\n this._instance.notifyChange();\n }\n\n private orbitControlsOnWheel(): void {\n // As camera-controls doesn't dispatch controlstart/controlend events, we need\n // to take care of them for proper events\n this._orbitControls.dispatchEvent({ type: 'controlstart' });\n setTimeout(() => this._orbitControls.dispatchEvent({ type: 'controlend' }), 0);\n }\n\n private setNavigationMode(mode: NavigationMode): void {\n this._disablePositionOnMap();\n\n switch (mode) {\n case 'disabled':\n this._orbitControls.enabled = false;\n break;\n case 'first-person':\n {\n this._orbitControls.dollyToCursor = false;\n // Set small min/max distance so rotating is always close to the camera position\n this._orbitControls.minDistance = 2;\n this._orbitControls.maxDistance = 2;\n // That requires a large dolly speed for scrolling not to be \"stuck\"\n this._orbitControls.dollySpeed = 20;\n\n this._orbitControls.azimuthRotateSpeed = 0.3;\n this._orbitControls.polarRotateSpeed = 0.3;\n\n this._orbitControls.mouseButtons.left = CameraControls.ACTION.ROTATE;\n this._orbitControls.mouseButtons.right = CameraControls.ACTION.TRUCK;\n this._orbitControls.mouseButtons.wheel = CameraControls.ACTION.DOLLY;\n this._orbitControls.mouseButtons.middle = CameraControls.ACTION.DOLLY;\n\n this._orbitControls.enabled = true;\n\n // Set new target close to the camera position so it feels like we're rotating around the camera position\n const direction = new Vector3();\n const position = this._instance.view.camera.position.clone();\n const newTarget = new Vector3();\n this._instance.view.camera.getWorldDirection(direction);\n\n direction.normalize().setLength(3);\n newTarget.copy(position).add(direction);\n void this.lookAt(position, newTarget, false);\n }\n break;\n case 'orbit':\n {\n this._orbitControls.dollyToCursor = true;\n this._orbitControls.minDistance = 2;\n this._orbitControls.maxDistance = Infinity;\n this._orbitControls.dollySpeed = 1;\n\n this._orbitControls.azimuthRotateSpeed = 1.0;\n this._orbitControls.polarRotateSpeed = 1.0;\n\n this._orbitControls.mouseButtons.left = CameraControls.ACTION.TRUCK;\n this._orbitControls.mouseButtons.right = CameraControls.ACTION.ROTATE;\n this._orbitControls.mouseButtons.wheel = CameraControls.ACTION.DOLLY;\n this._orbitControls.mouseButtons.middle = CameraControls.ACTION.DOLLY;\n\n this._orbitControls.enabled = true;\n\n // Try to restore a proper target so it doesn't require a right-click to properly truck/dolly\n const direction = new Vector3();\n const position = this._instance.view.camera.position.clone();\n this._instance.view.camera.getWorldDirection(direction);\n\n const raycaster = new Raycaster();\n raycaster.camera = this._instance.view.camera;\n raycaster.set(position, direction);\n const intersects = raycaster.intersectObject(this._instance.scene).at(0);\n\n if (intersects) {\n void this.lookAt(position, intersects.point, false);\n }\n }\n break;\n case 'position-on-map':\n this._orbitControls.enabled = false;\n this._enablePositionOnMap();\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = mode;\n return _exhaustiveCheck;\n }\n }\n this._instance.domElement.focus();\n }\n}\n\nexport default CameraController;\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Layer from '@giro3d/giro3d/core/layer/Layer';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport type Giro3DMap from '@giro3d/giro3d/entities/Map';\n\nimport Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport MaskLayer, { MaskMode } from '@giro3d/giro3d/core/layer/MaskLayer';\nimport AxisGrid from '@giro3d/giro3d/entities/AxisGrid';\nimport { isMap } from '@giro3d/giro3d/entities/Map';\nimport Giro3dVectorSource from '@giro3d/giro3d/sources/VectorSource';\nimport Feature from 'ol/Feature';\nimport Polygon from 'ol/geom/Polygon';\nimport { Fill, Style } from 'ol/style';\nimport { Color, Vector3 } from 'three';\n\nimport type { Dataset } from '@/types/Dataset';\n\nimport { getConfig } from '@/configurationLoader';\nimport { GLOBAL_EVENT_DISPATCHER } from '@/events';\nimport DatasetBuilder from '@/giro3d/DatasetBuilder';\nimport loader from '@/loaders/loader';\nimport { useDatasetStore } from '@/stores/datasets';\nimport { useNotificationStore } from '@/stores/notifications';\nimport { Datagroup, type DatasetOrGroup, DatasetState } from '@/types/Dataset';\n\nimport type LayerManager from './LayerManager';\n\nexport default class DatasetManager {\n private readonly _axisGrids: Map<string, AxisGrid> = new Map();\n private readonly _entities: Map<string, Entity3D[]> = new Map();\n private readonly _instance: Instance;\n private readonly _layerManager: LayerManager;\n private readonly _layers: Map<string, Layer[]> = new Map();\n private readonly _masks: Map<string, MaskLayer> = new Map();\n private readonly _notifications = useNotificationStore();\n private readonly _store = useDatasetStore();\n\n public constructor(instance: Instance, layerManager: LayerManager) {\n this._instance = instance;\n this._layerManager = layerManager;\n\n this._store.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'importFromFile':\n void this.importFromFile(args[0]);\n break;\n case 'remove':\n this.deleteDataset(args[0]);\n break;\n case 'setOpacity':\n void this.onOpacityChanged(args[0], args[1]);\n break;\n case 'setVisible':\n void this.onVisibilityChanged(args[0], args[1]);\n break;\n case 'toggleGrid':\n void this.onToggleGrid(args[0]);\n break;\n case 'toggleMask':\n void this.onToggleMask(args[0]);\n break;\n }\n });\n });\n\n for (const dataset of this._store.getDatasets()) {\n if (dataset.visibleSelf) {\n void this.preloadDataset(dataset);\n }\n }\n }\n\n public dispose(): void {\n // Nothing to do (?)\n }\n\n private async buildDatasetObjects(dataset: Dataset): Promise<void> {\n const buildResult = await DatasetBuilder.build(this._instance, dataset);\n\n const zOrder = dataset.zOrder;\n\n if (buildResult.entities && buildResult.entities.length > 0) {\n for (const entity of buildResult.entities) {\n await this._instance.add(entity);\n entity.visible = dataset.visibleSelf;\n }\n this._entities.set(dataset.uuid, buildResult.entities);\n this._store.attachEntities(dataset, buildResult.entities);\n }\n\n if (buildResult.layers && buildResult.layers.length > 0) {\n for (const layer of buildResult.layers) {\n await this._layerManager.addLayer(layer, zOrder);\n layer.visible = dataset.visibleSelf;\n }\n this._layers.set(dataset.uuid, buildResult.layers);\n this._store.attachLayers(dataset, buildResult.layers);\n }\n }\n\n private async createGrid(dataset: DatasetOrGroup): Promise<void> {\n const box = this._store.getBoundingBox(dataset);\n if (box == null || box.isEmpty()) {\n return;\n }\n\n const grid = new AxisGrid({\n style: {\n color: new Color('orange'),\n fontSize: 12,\n numberFormat: Intl.NumberFormat('fr'),\n },\n ticks: {\n x: 50,\n y: 50,\n z: 50,\n },\n volume: {\n ceiling: box.max.z + 10,\n extent: Extent.fromBox3(this._instance.referenceCrs, box).withMargin(20, 20),\n floor: box.min.z - 10,\n },\n });\n grid.name = `AxisGrid-${dataset.uuid}`;\n await this._instance.add(grid);\n this._axisGrids.set(dataset.uuid, grid);\n }\n\n private async createMask(dataset: DatasetOrGroup): Promise<void> {\n // TODO: this assumes the dataset covers the whole bounding box\n // (in particular, that it is oriented the same way)\n // which will most likely not be the case...\n const box = this._store.getBoundingBox(dataset);\n if (box == null || box.isEmpty()) {\n return;\n }\n\n // Contract bounding box so it makes stitching a bit nicer\n box.expandByVector(new Vector3(-5, -5, 0));\n\n const feature = new Feature({\n geometry: new Polygon([\n [\n [box.min.x, box.min.y],\n [box.min.x, box.max.y],\n [box.max.x, box.max.y],\n [box.max.x, box.min.y],\n [box.min.x, box.min.y],\n ],\n ]),\n name: 'Mask polygon',\n });\n\n const mask = new MaskLayer({\n name: `mask-${dataset.uuid}`,\n source: new Giro3dVectorSource({\n data: [feature],\n style: new Style({\n fill: new Fill({ color: 'white' }),\n }),\n }),\n });\n mask.maskMode = MaskMode.Inverted;\n\n // Apply the mask to the map\n const maps = this._instance.getObjects(obj => isMap(obj)) as Giro3DMap[];\n for (const map of maps) {\n await map.addLayer(mask);\n this._instance.notifyChange(map);\n }\n this._masks.set(dataset.uuid, mask);\n }\n\n private deleteDataset(dataset: DatasetOrGroup): void {\n this.deleteGrid(dataset);\n this.deleteMask(dataset);\n\n const entities = this._entities.get(dataset.uuid);\n if (entities) {\n for (const entity of entities) {\n this._instance.remove(entity);\n }\n this._instance.notifyChange();\n this._entities.delete(dataset.uuid);\n }\n\n const layers = this._layers.get(dataset.uuid);\n if (layers) {\n for (const layer of layers) {\n this._layerManager.removeLayer(layer);\n }\n this._layers.delete(dataset.uuid);\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'dataset-removed', value: dataset });\n }\n\n private deleteGrid(dataset: DatasetOrGroup): void {\n const grid = this._axisGrids.get(dataset.uuid);\n if (grid) {\n this._instance.remove(grid);\n }\n this._axisGrids.delete(dataset.uuid);\n }\n\n private deleteMask(dataset: DatasetOrGroup): void {\n const mask = this._masks.get(dataset.uuid);\n if (mask) {\n const maps = this._instance.getObjects(obj => isMap(obj)) as Giro3DMap[];\n maps.forEach(map => {\n map.removeLayer(mask);\n this._instance.notifyChange(map);\n });\n }\n this._masks.delete(dataset.uuid);\n }\n\n private async importFromFile(file: File | string): Promise<void> {\n let dataset: DatasetOrGroup;\n const name = file instanceof File ? file.name : file;\n try {\n this._notifications.push({\n level: 'info',\n text: 'Importing file...',\n title: name,\n });\n\n const _dataset = await loader.importFile(file, getConfig());\n dataset = this._store.add(_dataset); // We need to keep track of the reactive dataset!\n this._notifications.push({\n level: 'success',\n text: 'Import done, parsing data...',\n title: dataset.name,\n });\n } catch (e) {\n console.error(e);\n this._notifications.push({ level: 'error', text: (e as Error).message, title: name });\n return;\n }\n\n try {\n dataset.state = DatasetState.Loading;\n await this.preloadDataset(dataset);\n this._notifications.push({\n level: 'success',\n text: 'Import successful.',\n title: dataset.name,\n });\n } catch (_e) {\n // Already logged, ignore\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'dataset-added', value: dataset });\n }\n\n private async onOpacityChanged(dataset: Dataset, opacity: number): Promise<void> {\n try {\n dataset.opacity = opacity;\n await this.updateDataset(dataset);\n } catch (e) {\n console.warn(e);\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({\n type: 'dataset-opacity-changed',\n value: dataset,\n });\n }\n\n private async onToggleGrid(dataset: DatasetOrGroup): Promise<void> {\n if (this._axisGrids.has(dataset.uuid)) {\n this.deleteGrid(dataset);\n } else {\n await this.createGrid(dataset);\n }\n }\n\n private async onToggleMask(dataset: DatasetOrGroup): Promise<void> {\n if (this._masks.has(dataset.uuid)) {\n this.deleteMask(dataset);\n } else {\n await this.createMask(dataset);\n }\n }\n private async onVisibilityChanged(\n dataset: DatasetOrGroup,\n newVisibility: boolean,\n ): Promise<void> {\n try {\n dataset.visibleSelf = newVisibility;\n if (dataset.state !== DatasetState.Loaded && newVisibility) {\n await this.preloadDataset(dataset);\n }\n await this.updateDataset(dataset);\n if (Datagroup.isGroup(dataset)) {\n dataset.children.forEach(ds => void this.onVisibilityChanged(ds, ds.visibleSelf));\n }\n } catch (_e) {\n dataset.visibleSelf = false;\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({\n type: 'dataset-visibility-changed',\n value: dataset,\n });\n }\n\n private async preloadDataset(dataset: DatasetOrGroup): Promise<DatasetOrGroup> {\n if (dataset.state === DatasetState.Loaded) {\n return Promise.resolve(dataset);\n }\n\n if (Datagroup.isGroup(dataset)) {\n dataset.state = DatasetState.Loaded;\n return Promise.resolve(dataset);\n }\n\n dataset.state = DatasetState.Loading;\n\n try {\n await this.buildDatasetObjects(dataset);\n dataset.state = DatasetState.Loaded;\n } catch (e) {\n console.error('Could not load dataset', dataset, e);\n this._notifications.push({\n level: 'error',\n text: `Could not load dataset : ${(e as Error).message}`,\n title: dataset.name,\n });\n dataset.state = DatasetState.Failed;\n throw e;\n }\n\n return dataset;\n }\n\n private async updateDataset(dataset: DatasetOrGroup): Promise<void> {\n const entities = this._entities.get(dataset.uuid);\n if (entities) {\n for (const entity of entities) {\n entity.visible = dataset.visible;\n entity.opacity = dataset.opacity;\n if (\n dataset.visibleSelf &&\n 'isMaskingBasemap' in dataset.config &&\n dataset.config.isMaskingBasemap === true\n ) {\n await this.createMask(dataset);\n } else if (!dataset.visibleSelf && this._masks.has(dataset.uuid)) {\n this.deleteMask(dataset);\n }\n this._instance.notifyChange(entity);\n }\n }\n\n const layers = this._layers.get(dataset.uuid);\n if (layers) {\n for (const layer of layers) {\n this._layerManager.setLayerVisibility(layer, dataset.visible);\n this._layerManager.setLayerOpacity(layer, dataset.opacity);\n this._layerManager.notify(layer);\n }\n }\n }\n}\n","import { defineStore } from 'pinia';\nimport { ref } from 'vue';\n\nexport const useBasemapStore = defineStore('basemap', () => {\n const visible = ref(true);\n const opacity = ref(1);\n\n const setVisible = (v: boolean): void => {\n visible.value = v;\n };\n\n const setOpacity = (v: number): void => {\n opacity.value = v;\n };\n\n return {\n opacity,\n setOpacity,\n setVisible,\n visible,\n };\n});\n\nexport type useBasemapStore = ReturnType<typeof useBasemapStore>;\n","import type Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type Layer from '@giro3d/giro3d/core/layer/Layer';\n\nimport { isColorLayer } from '@giro3d/giro3d/core/layer/ColorLayer';\nimport Giro3dMap from '@giro3d/giro3d/entities/Map';\nimport { EventDispatcher } from 'three';\n\nimport { useBasemapStore } from '@/stores/basemap';\nimport { useGiro3dStore } from '@/stores/giro3d';\n\ninterface LayerConfig {\n zOrder: number;\n}\n\nexport default class LayerManager extends EventDispatcher {\n public get extent(): Extent {\n return this._map.extent;\n }\n\n private readonly _basemapStore = useBasemapStore();\n private readonly _giro3dStore = useGiro3dStore();\n private readonly _instance: Instance;\n private readonly _layers: Map<Layer['id'], LayerConfig>;\n private readonly _map: Giro3dMap;\n\n public constructor(instance: Instance) {\n super();\n\n this._instance = instance;\n this._layers = new Map();\n\n const extent = this._giro3dStore.getDefaultBasemapExtent();\n const mapOptions = this._giro3dStore.getDefaultBasemapOptions();\n\n this._map = new Giro3dMap({\n extent: extent.as(instance.referenceCrs),\n ...mapOptions,\n });\n this._map.terrain.segments = 32;\n this._map.name = 'basemaps';\n this._instance.add(this._map).catch(console.error);\n\n this._basemapStore.$onAction(({ args, name }) => {\n switch (name) {\n case 'setOpacity':\n this._map.opacity = args[0];\n this._instance.notifyChange(this._map);\n break;\n case 'setVisible':\n this._map.visible = args[0];\n this._instance.notifyChange(this._map);\n break;\n }\n });\n }\n\n public async addLayer(layer: Layer, zOrder: number): Promise<void> {\n this._layers.set(layer.id, { zOrder });\n await this._map.addLayer(layer);\n this.updateLayerOrdering();\n }\n\n public dispose(): void {\n this._instance.remove(this._map);\n this._map.dispose({ disposeLayers: true });\n }\n\n public getBasemap(): Giro3dMap {\n return this._map;\n }\n\n public notify(layer: Layer): void {\n this._instance.notifyChange(layer);\n }\n\n public removeLayer(layer: Layer): void {\n this._layers.delete(layer.id);\n this._map.removeLayer(layer, { disposeLayer: true });\n this._instance.notifyChange(this._map);\n }\n\n public setLayerOpacity(layer: Layer, opacity: number): void {\n if (isColorLayer(layer)) {\n if (layer.opacity !== opacity) {\n layer.opacity = opacity;\n this._instance.notifyChange(layer);\n }\n }\n }\n public setLayerVisibility(layer: Layer, visible: boolean): void {\n layer.visible = visible;\n this.updateLayerOrdering();\n }\n\n public setMapOpacity(opacity: number): void {\n this._map.opacity = opacity;\n this._instance.notifyChange(this._map);\n }\n\n private updateLayerOrdering(): void {\n const order = [...this._layers.entries()]\n .sort((a, b) => b[1].zOrder - a[1].zOrder)\n .map(ent => ent[0]);\n\n this._map.sortColorLayers((a: Layer, b: Layer) => {\n const orderA = order.indexOf(a.id);\n const orderB = order.indexOf(b.id);\n if (orderA >= 0 && orderB >= 0) {\n return orderA - orderB;\n }\n return 0;\n });\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { isShape } from '@giro3d/giro3d/entities/Shape';\nimport { Raycaster } from 'three';\n\nimport type Picker from '@/services/picking';\n\nimport Measure3D from '@/giro3d/Measure3D';\n\nexport default class MeasureTool {\n private _hoverMeasurement: Measure3D | null;\n private readonly _picker: Picker;\n private readonly _raycaster: Raycaster;\n\n public constructor(picker: Picker) {\n this._picker = picker;\n\n this._raycaster = new Raycaster();\n this._hoverMeasurement = null;\n }\n\n public clean(): void {\n if (this._hoverMeasurement) {\n this._hoverMeasurement.instance.remove(this._hoverMeasurement);\n this._hoverMeasurement = null;\n }\n }\n\n public dispose(): void {\n this.clean();\n }\n\n public getLastMeasurement(): Measure3D | undefined {\n return this._hoverMeasurement?.clone();\n }\n\n public measure(instance: Instance, event: MouseEvent): void {\n const picked = this._picker.getFirstFeatureAt(instance, event, 0, o => !isShape(o))?.at(0);\n\n if (picked && picked.normal) {\n const n = picked.normal.clone();\n n.transformDirection(picked.object.matrixWorld);\n n.normalize();\n\n this._raycaster.camera = instance.view.camera;\n this._raycaster.set(picked.point, n);\n\n const intersects = this._raycaster\n .intersectObject(instance.scene, true)\n .filter(\n i =>\n i.distance > 1e-5 &&\n i.object.userData.parentEntity !== this._hoverMeasurement,\n )\n .at(0);\n\n if (intersects) {\n if (!this._hoverMeasurement) {\n this._hoverMeasurement = new Measure3D();\n void instance.add(this._hoverMeasurement);\n }\n this._hoverMeasurement.visible = true;\n this._hoverMeasurement.setPoints([picked.point, intersects.point]);\n instance.notifyChange(this._hoverMeasurement);\n }\n }\n }\n}\n","import { defineStore } from 'pinia';\nimport { computed, reactive, ref } from 'vue';\n\nimport type Measure from '@/types/Measure';\nimport type MeasurementMode from '@/types/MeasurementMode';\n\nexport const useMeasurementStore = defineStore('measurement', () => {\n const measurements = reactive<Measure[]>([]) as Measure[];\n const measurementMode = ref<MeasurementMode>('laser');\n const count = computed(() => measurements.length);\n const _isUserMeasuring = ref<boolean>(false);\n\n function isUserMeasuring(): boolean {\n return _isUserMeasuring.value;\n }\n\n function setIsUserMeasuring(value: boolean): void {\n _isUserMeasuring.value = value;\n }\n\n function getMeasurementMode(): MeasurementMode {\n return measurementMode.value;\n }\n\n function setMeasurementMode(mode: MeasurementMode): void {\n measurementMode.value = mode;\n }\n\n function getMeasures(): Measure[] {\n return measurements;\n }\n\n function remove(measure: Measure): void {\n measurements.splice(measurements.indexOf(measure), 1);\n }\n\n function add(measure: Measure): void {\n measurements.push(measure);\n }\n\n function hasMeasure(name: string): boolean {\n return measurements.some(m => m.title === name);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importMeasureFile(file: Blob): void {\n // Nothing to do\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importMeasureFiles(files: File[]): void {\n // Nothing to do\n }\n\n function start(): void {}\n\n function end(): void {}\n\n return {\n add,\n count,\n end,\n getMeasurementMode,\n getMeasures,\n hasMeasure,\n importMeasureFile,\n importMeasureFiles,\n isUserMeasuring,\n remove,\n setIsUserMeasuring,\n setMeasurementMode,\n start,\n };\n});\n","import { EventDispatcher, MathUtils } from 'three';\n\nimport type Measure3D from '@/giro3d/Measure3D';\n\nimport Download from '@/utils/Download';\n\ntype MeasureEventMap = {\n visible: {\n /** empty */\n };\n};\n\nexport default class Measure extends EventDispatcher<MeasureEventMap> {\n public properties: object;\n public readonly title: string;\n public readonly uuid: string;\n public get object(): Measure3D {\n return this._object;\n }\n public set object(obj: Measure3D) {\n this._object = obj;\n }\n\n public get visible(): boolean {\n return this._visible;\n }\n\n public set visible(v: boolean) {\n this._visible = v;\n this.dispatchEvent({ type: 'visible' });\n }\n\n private _object: Measure3D;\n\n private _visible: boolean;\n\n public constructor(title: string, object: Measure3D, properties: object = {}) {\n super();\n\n this.title = title;\n this._visible = true;\n this._object = object;\n this.properties = properties;\n this.uuid = MathUtils.generateUUID();\n }\n\n public static toCollection(measures: Measure[]): GeoJSON.FeatureCollection {\n const features = measures.map(measure => measure.toGeoJSON());\n\n return {\n features,\n type: 'FeatureCollection',\n // @ts-expect-error GeoJSON spec does not allow properties on FeatureCollection\n // But OWC requires it Oo\n id: `${Download.getBaseUrl()}#${MathUtils.generateUUID()}`,\n properties: {\n creator: 'Giro3D',\n generator: {\n title: 'Giro3D',\n uri: Download.getBaseUrl(),\n },\n lang: 'en',\n links: [\n {\n href: 'http://www.opengis.net/spec/owc-atom/1.0/req/core',\n rel: 'profile',\n title: 'This file is compliant with version 1.0 of OGC Context',\n },\n ],\n title: 'Giro3D measures',\n updated: new Date().toISOString(),\n },\n };\n }\n\n public toGeoJSON(): GeoJSON.Feature {\n const geojson = {\n geometry: {\n coordinates: [this.object.from.toArray(), this.object.to.toArray()],\n type: 'LineString',\n },\n id: `${Download.getBaseUrl()}#${this.uuid}`,\n properties: {\n ...this.properties,\n title: this.title,\n updated: new Date().toISOString(),\n },\n type: 'Feature',\n } as GeoJSON.Feature;\n\n return geojson;\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { MathUtils, Vector3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\nimport type Picker from '@/services/picking';\n\nimport Measure3D from '@/giro3d/Measure3D';\nimport MeasureTool from '@/services/MeasureTool';\nimport { useMeasurementStore } from '@/stores/measurement';\nimport { useNotificationStore } from '@/stores/notifications';\nimport Measure from '@/types/Measure';\n\nfunction promptTitle(defaultValue: string): string | null {\n return window.prompt('Measure name', defaultValue);\n}\n\nexport default class MeasurementManager {\n private readonly _boundMeasure: (e: MouseEvent) => void;\n private readonly _boundOnEscape: (e: KeyboardEvent) => void;\n private readonly _boundPause: () => void;\n private readonly _boundRestart: () => void;\n private readonly _boundSaveMeasure: (e: MouseEvent) => void;\n private readonly _camera: CameraController;\n private readonly _instance: Instance;\n private readonly _measureTool: MeasureTool;\n private readonly _notificationStore = useNotificationStore();\n private _paused = false;\n private readonly _store = useMeasurementStore();\n\n public constructor(instance: Instance, camera: CameraController, picker: Picker) {\n this._instance = instance;\n this._measureTool = new MeasureTool(picker);\n this._camera = camera;\n\n this._boundPause = (): void => {\n this._paused = true;\n };\n this._boundRestart = (): void => {\n this._paused = false;\n };\n this._camera.addEventListener('interaction-start', this._boundPause);\n this._camera.addEventListener('interaction-end', this._boundRestart);\n\n this._boundOnEscape = this.onEscape.bind(this);\n document.addEventListener('keydown', this._boundOnEscape);\n\n this._store.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'end':\n this.stopMeasuring();\n break;\n case 'importMeasureFile':\n void this.importMeasureFile(args[0]);\n break;\n case 'importMeasureFiles':\n void this.importMeasureFiles(args[0]);\n break;\n case 'remove':\n this.deleteMeasure(args[0]);\n break;\n case 'start':\n this.startMeasuring();\n break;\n }\n });\n });\n\n this._boundMeasure = this.measure.bind(this);\n this._boundSaveMeasure = this.saveMeasure.bind(this);\n this._instance.domElement.addEventListener('mousemove', this._boundMeasure);\n this._instance.domElement.addEventListener('click', this._boundSaveMeasure);\n }\n\n public dispose(): void {\n this._instance.domElement.removeEventListener('mousemove', this._boundMeasure);\n this._instance.domElement.removeEventListener('click', this._boundSaveMeasure);\n\n this._camera.removeEventListener('interaction-start', this._boundPause);\n this._camera.removeEventListener('interaction-end', this._boundRestart);\n\n document.removeEventListener('keydown', this._boundOnEscape);\n\n this._measureTool.dispose();\n }\n\n public startMeasuring(): void {\n this._store.setIsUserMeasuring(true);\n }\n\n public stopMeasuring(): void {\n this._store.setIsUserMeasuring(false);\n this._measureTool.clean();\n this._instance.notifyChange();\n }\n\n public updateMeasure(measure: Measure): void {\n measure.object.visible = measure.visible;\n measure.object.traverse(o => (o.visible = measure.visible));\n this._instance.notifyChange();\n }\n\n private deleteMeasure(measure: Measure): void {\n this._instance.remove(measure.object);\n this._instance.notifyChange();\n }\n\n private async importBlob(\n file: Blob,\n skipNames: Set<string>,\n ): Promise<{ nbImported: number; nbSkipped: number }> {\n const str = await file.text();\n const geojson = JSON.parse(str) as GeoJSON.Feature | GeoJSON.FeatureCollection;\n\n const features = geojson.type === 'FeatureCollection' ? geojson.features : [geojson];\n\n let nbImported = 0;\n let nbSkipped = 0;\n\n for (const feature of features) {\n const imported = await this.importMeasure(feature, skipNames);\n if (imported) {\n nbImported++;\n } else {\n nbSkipped++;\n }\n }\n return { nbImported, nbSkipped };\n }\n\n private async importMeasure(\n feature: GeoJSON.Feature,\n skipNames: Set<string>,\n ): Promise<boolean> {\n if (feature.geometry.type !== 'LineString') {\n throw new Error(`Cannot import geometry type ${feature.geometry.type}`);\n }\n\n if (feature.properties == null || typeof feature.properties !== 'object') {\n feature.properties = {};\n }\n if (feature.properties.title == null) {\n feature.properties.title = MathUtils.generateUUID();\n }\n\n if (skipNames.has(feature.properties.title)) {\n return false;\n }\n\n const from = new Vector3(...feature.geometry.coordinates[0]);\n const to = new Vector3(...feature.geometry.coordinates[1]);\n\n const o = new Measure3D();\n o.setPoints([from, to]);\n await this.pushNewMeasure(feature.properties?.title, o, feature.properties);\n\n return true;\n }\n\n private async importMeasureFile(file: Blob): Promise<void> {\n const existingMeasures = new Set(this._store.getMeasures().map(m => m.title));\n try {\n const { nbImported, nbSkipped } = await this.importBlob(file, existingMeasures);\n this._notificationStore.push({\n level: 'success',\n text: `${nbImported} measures imported (${nbSkipped} skipped)`,\n title: 'Measures',\n });\n } catch (e) {\n console.error(e);\n this._notificationStore.push({\n level: 'warning',\n text: `Could not import file`,\n title: 'Measures',\n });\n }\n }\n\n private async importMeasureFiles(files: File[]): Promise<void> {\n const promises = [];\n let nbTotalImported = 0;\n let nbTotalSkipped = 0;\n const errors: string[] = [];\n\n const existingMeasures = new Set(this._store.getMeasures().map(m => m.title));\n\n for (const file of files) {\n promises.push(\n this.importBlob(file, existingMeasures)\n .then(({ nbImported, nbSkipped }) => {\n nbTotalImported += nbImported;\n nbTotalSkipped += nbSkipped;\n })\n .catch(reason => {\n errors.push((reason as Error).message);\n }),\n );\n }\n await Promise.allSettled(promises);\n\n if (errors.length > 0) {\n this._notificationStore.push({\n level: 'warning',\n text: `${nbTotalImported} measures imported (${nbTotalSkipped} skipped); ${errors.length} errors: ${errors}`,\n title: 'Measures',\n });\n } else {\n this._notificationStore.push({\n level: 'success',\n text: `${nbTotalImported} measures imported (${nbTotalSkipped} skipped)`,\n title: 'Measures',\n });\n }\n }\n\n private measure(event: MouseEvent): void {\n if (!this._paused && this._store.isUserMeasuring()) {\n void this._measureTool.measure(this._instance, event);\n }\n }\n\n private onEscape(e: KeyboardEvent): void {\n if (e.code === 'Escape' && this._store.isUserMeasuring()) {\n this.stopMeasuring();\n }\n }\n\n private async pushNewMeasure(\n title: string,\n measurement: Measure3D,\n properties: object = {},\n ): Promise<void> {\n await this._instance.add(measurement);\n const measure = new Measure(title, measurement, properties);\n measurement.userData.measure = measure;\n measure.addEventListener('visible', () => this.updateMeasure(measure));\n this._store.add(measure);\n this._instance.notifyChange(measurement);\n }\n\n private saveMeasure(): void {\n if (!this._paused && this._store.isUserMeasuring()) {\n const measurement = this._measureTool.getLastMeasurement();\n if (measurement && !Number.isNaN(measurement.length)) {\n let title = 'New measurement';\n if (this._store.hasMeasure(title)) {\n for (let i = 1; i < 1000; i += 1) {\n title = `New measurement (${i})`;\n if (!this._store.hasMeasure(title)) {\n break;\n }\n }\n if (this._store.hasMeasure(title)) {\n title = 'Achieved unlocked: 1000 measurements with default name';\n }\n }\n const name = promptTitle(title);\n if (name != null) {\n void this.pushNewMeasure(name, measurement);\n }\n }\n }\n }\n}\n","import {\n\tMatrix4,\n\tObject3D,\n\tVector2,\n\tVector3\n} from 'three';\n\nclass CSS2DObject extends Object3D {\n\n\tconstructor( element = document.createElement( 'div' ) ) {\n\n\t\tsuper();\n\n\t\tthis.isCSS2DObject = true;\n\n\t\tthis.element = element;\n\n\t\tthis.element.style.position = 'absolute';\n\t\tthis.element.style.userSelect = 'none';\n\n\t\tthis.element.setAttribute( 'draggable', false );\n\n\t\tthis.center = new Vector2( 0.5, 0.5 ); // ( 0, 0 ) is the lower left; ( 1, 1 ) is the top right\n\n\t\tthis.addEventListener( 'removed', function () {\n\n\t\t\tthis.traverse( function ( object ) {\n\n\t\t\t\tif (\n\t\t\t\t\tobject.element instanceof object.element.ownerDocument.defaultView.Element &&\n\t\t\t\t\tobject.element.parentNode !== null\n\t\t\t\t) {\n\n\t\t\t\t\tobject.element.remove();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.element = source.element.cloneNode( true );\n\n\t\tthis.center = source.center;\n\n\t\treturn this;\n\n\t}\n\n}\n\n//\n\nconst _vector = new Vector3();\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _a = new Vector3();\nconst _b = new Vector3();\n\nclass CSS2DRenderer {\n\n\tconstructor( parameters = {} ) {\n\n\t\tconst _this = this;\n\n\t\tlet _width, _height;\n\t\tlet _widthHalf, _heightHalf;\n\n\t\tconst cache = {\n\t\t\tobjects: new WeakMap()\n\t\t};\n\n\t\tconst domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' );\n\n\t\tdomElement.style.overflow = 'hidden';\n\n\t\tthis.domElement = domElement;\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_viewMatrix.copy( camera.matrixWorldInverse );\n\t\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix );\n\n\t\t\trenderObject( scene, scene, camera );\n\t\t\tzOrder( scene );\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\n\t\t};\n\n\t\tfunction hideObject( object ) {\n\n\t\t\tif ( object.isCSS2DObject ) object.element.style.display = 'none';\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\thideObject( object.children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera ) {\n\n\t\t\tif ( object.visible === false ) {\n\n\t\t\t\thideObject( object );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( object.isCSS2DObject ) {\n\n\t\t\t\t_vector.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t_vector.applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\tconst visible = ( _vector.z >= - 1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true );\n\n\t\t\t\tconst element = object.element;\n\t\t\t\telement.style.display = visible === true ? '' : 'none';\n\n\t\t\t\tif ( visible === true ) {\n\n\t\t\t\t\tobject.onBeforeRender( _this, scene, camera );\n\n\t\t\t\t\telement.style.transform = 'translate(' + ( - 100 * object.center.x ) + '%,' + ( - 100 * object.center.y ) + '%)' + 'translate(' + ( _vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - _vector.y * _heightHalf + _heightHalf ) + 'px)';\n\n\t\t\t\t\tif ( element.parentNode !== domElement ) {\n\n\t\t\t\t\t\tdomElement.appendChild( element );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.onAfterRender( _this, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t\tconst objectData = {\n\t\t\t\t\tdistanceToCameraSquared: getDistanceToSquared( camera, object )\n\t\t\t\t};\n\n\t\t\t\tcache.objects.set( object, objectData );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( object.children[ i ], scene, camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getDistanceToSquared( object1, object2 ) {\n\n\t\t\t_a.setFromMatrixPosition( object1.matrixWorld );\n\t\t\t_b.setFromMatrixPosition( object2.matrixWorld );\n\n\t\t\treturn _a.distanceToSquared( _b );\n\n\t\t}\n\n\t\tfunction filterAndFlatten( scene ) {\n\n\t\t\tconst result = [];\n\n\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isCSS2DObject ) result.push( object );\n\n\t\t\t} );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction zOrder( scene ) {\n\n\t\t\tconst sorted = filterAndFlatten( scene ).sort( function ( a, b ) {\n\n\t\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\t\treturn b.renderOrder - a.renderOrder;\n\n\t\t\t\t}\n\n\t\t\t\tconst distanceA = cache.objects.get( a ).distanceToCameraSquared;\n\t\t\t\tconst distanceB = cache.objects.get( b ).distanceToCameraSquared;\n\n\t\t\t\treturn distanceA - distanceB;\n\n\t\t\t} );\n\n\t\t\tconst zMax = sorted.length;\n\n\t\t\tfor ( let i = 0, l = sorted.length; i < l; i ++ ) {\n\n\t\t\t\tsorted[ i ].element.style.zIndex = zMax - i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { CSS2DObject, CSS2DRenderer };\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type { Vector3 } from 'three';\n\nimport { CSS2DObject } from 'three/examples/jsm/Addons.js';\n\nfunction createSceneCursor(className: string, id: string): CSS2DObject {\n const container = document.createElement('div');\n container.className = 'scene-cursor';\n container.id = id;\n const icon = document.createElement('i');\n icon.className = `${className} text-dark shadow`;\n container.append(icon);\n\n const css2DObject = new CSS2DObject(container);\n return css2DObject;\n}\n\nexport type SceneCursorType = 'location' | 'orbit' | 'street';\n\n/**\n * Handles the display of the cursor in 3D space.\n */\nexport default class SceneCursorManager {\n private _currentCursor: CSS2DObject | null = null;\n private readonly _instance: Instance;\n\n private readonly _pickingCursors: Record<SceneCursorType, CSS2DObject> = {\n location: createSceneCursor('fg-location', 'cursor-location'),\n orbit: createSceneCursor('bi bi-mouse2-fill', 'cursor-orbit'),\n street: createSceneCursor('fg-position-man', 'cursor-street'),\n };\n\n public constructor(instance: Instance) {\n this._instance = instance;\n }\n\n /**\n * Sets the cursor.\n * @param cursor - The cursor to use. If `null`, the scene cursor is removed and replaced by a regular cursor.\n */\n public setCursor(cursor: SceneCursorType | null): void {\n if (cursor == null) {\n this._instance.domElement.style.cursor = 'auto';\n this.detachCurrentCursor();\n this._currentCursor = null;\n } else {\n this._instance.domElement.style.cursor = 'none';\n const newCursor = this._pickingCursors[cursor];\n if (newCursor !== this._currentCursor) {\n this.detachCurrentCursor();\n this._currentCursor = newCursor;\n this._instance.add(this._currentCursor).catch(console.error);\n }\n }\n }\n\n public setCursorLocation(worldPosition: Vector3): void {\n if (this._currentCursor == null) {\n return;\n }\n\n this._currentCursor.position.copy(worldPosition);\n this._currentCursor.updateMatrixWorld(true);\n this._instance.notifyChange();\n }\n\n private detachCurrentCursor(): void {\n this._currentCursor?.parent?.remove(this._currentCursor);\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type { Object3D } from 'three';\n\nimport HttpConfiguration from '@giro3d/giro3d/utils/HttpConfiguration';\nimport { AmbientLight, Box3, DirectionalLight, EventDispatcher } from 'three';\n\nimport { getLookAtTarget } from '@/configuration/lookAt';\nimport { GLOBAL_EVENT_DISPATCHER } from '@/events';\nimport AnnotationManager from '@/services/AnnotationManager';\nimport CameraController from '@/services/CameraController';\nimport DatasetManager from '@/services/DatasetManager';\nimport Highlighter from '@/services/Highlighter';\nimport LayerManager from '@/services/LayerManager';\nimport MeasurementManager from '@/services/MeasurementManager';\nimport Picker from '@/services/picking';\nimport { useGiro3dStore } from '@/stores/giro3d';\nimport Fetcher from '@/utils/Fetcher';\n\nimport SceneCursorManager from './SceneCursorManager';\n\nif (import.meta.env.VITE_HEADERS) {\n for (const [host, header] of Object.entries(import.meta.env.VITE_HEADERS)) {\n if (!Fetcher.checkAbsoluteHost(host)) {\n console.warn(`Invalid host in VITE_HEADERS: ${host}`);\n continue;\n }\n\n for (const [name, value] of Object.entries(header)) {\n HttpConfiguration.setHeader(host, name, value);\n }\n }\n}\n\nif (\n import.meta.env.VITE_AUTHORIZATION_DOMAIN != null &&\n import.meta.env.VITE_AUTHORIZATION_VALUE != null\n) {\n if (!Fetcher.checkAbsoluteHost(import.meta.env.VITE_AUTHORIZATION_DOMAIN)) {\n console.warn(\n `Invalid host in VITE_AUTHORIZATION_DOMAIN: ${import.meta.env.VITE_AUTHORIZATION_DOMAIN}`,\n );\n } else {\n HttpConfiguration.setAuth(\n import.meta.env.VITE_AUTHORIZATION_DOMAIN,\n import.meta.env.VITE_AUTHORIZATION_VALUE,\n );\n }\n}\n\nif (import.meta.env.VITE_AUTHORIZATIONS) {\n for (const [host, value] of Object.entries(import.meta.env.VITE_AUTHORIZATIONS)) {\n if (!Fetcher.checkAbsoluteHost(host)) {\n console.warn(`Invalid host in VITE_AUTHORIZATIONS: ${host}`);\n continue;\n }\n HttpConfiguration.setAuth(host, value);\n }\n}\n\ntype Giro3DManagerEventMap = {\n update: {\n /** empty */\n };\n};\n\nexport default class Giro3DManager extends EventDispatcher<Giro3DManagerEventMap> {\n public readonly ambientLight: AmbientLight;\n\n public readonly annotationManager: AnnotationManager;\n public readonly camera: CameraController;\n public readonly datasetManager: DatasetManager;\n public readonly dirLight: DirectionalLight;\n public readonly highlighter: Highlighter;\n public readonly layerManager: LayerManager;\n public readonly mainInstance: Instance;\n public readonly measurementManager: MeasurementManager;\n public readonly picker: Picker;\n public readonly sceneCursorManager: SceneCursorManager;\n private readonly _boundOnFrameEnd: () => void;\n\n private readonly _store = useGiro3dStore();\n\n public constructor(instance: Instance) {\n super();\n\n this.mainInstance = instance;\n\n this.picker = new Picker();\n this.sceneCursorManager = new SceneCursorManager(instance);\n this.camera = new CameraController(this.mainInstance, this.picker, this.sceneCursorManager);\n\n const position = this._store.getDefaultCameraPosition();\n const lookAt = this._store.getDefaultLookAt();\n const target = getLookAtTarget(position.toVector3(), lookAt);\n void this.camera.lookAt(position.toVector3(), target);\n\n this.layerManager = new LayerManager(this.mainInstance);\n this.datasetManager = new DatasetManager(this.mainInstance, this.layerManager);\n this.annotationManager = new AnnotationManager(this.mainInstance, this.camera, this.picker);\n this.highlighter = new Highlighter();\n this.picker = new Picker();\n this.measurementManager = new MeasurementManager(\n this.mainInstance,\n this.camera,\n this.picker,\n );\n\n this._boundOnFrameEnd = this.onFrameEnd.bind(this);\n this.mainInstance.addEventListener('update-end', this._boundOnFrameEnd);\n\n this.mainInstance.renderingOptions.enableEDL = true;\n this.mainInstance.renderingOptions.enableInpainting = false;\n this.mainInstance.renderingOptions.enablePointCloudOcclusion = false;\n\n const lightColor = 0xffffff;\n\n this.ambientLight = new AmbientLight(lightColor, 0.6);\n this.mainInstance.scene.add(this.ambientLight);\n\n this.dirLight = new DirectionalLight(lightColor, 2);\n this.dirLight.position.set(1, -1, 1);\n this.dirLight.target.position.set(0, 0, 0);\n this.mainInstance.scene.add(this.dirLight);\n this.mainInstance.scene.add(this.dirLight.target);\n this.dirLight.updateMatrixWorld();\n this.mainInstance.scene.updateMatrixWorld();\n\n this.mainInstance.notifyChange();\n }\n\n public dispose(): void {\n this.mainInstance.removeEventListener('update-end', this._boundOnFrameEnd);\n this.mainInstance.scene.remove(this.dirLight.target);\n this.mainInstance.scene.remove(this.dirLight);\n this.mainInstance.scene.remove(this.ambientLight);\n this.measurementManager.dispose();\n this.highlighter.dispose();\n this.annotationManager.dispose();\n this.layerManager.dispose();\n this.camera.dispose();\n }\n\n /**\n * Gets bounding box of all datasets & annotations.\n *\n * @returns Bounding box of all datasets.\n */\n public getBoundingBox(): Box3 {\n const bbox = new Box3();\n const bbox2 = new Box3();\n this.mainInstance.scene.traverse(obj => {\n bbox2.setFromObject(obj);\n bbox.union(bbox2);\n });\n return bbox;\n }\n\n /**\n * Gets the datasets & annotations as Object3D.\n */\n public getObjects3d(): Object3D[] {\n const result: Object3D[] = [];\n this.mainInstance.scene.traverse(o => {\n result.push(o);\n });\n return result;\n }\n\n private onFrameEnd(): void {\n // Temporary solution to avoid annoying horizontal line artifacts\n // on point cloud due to constantly shifting near clipping plane.\n const camera = this.mainInstance.view.camera;\n camera.near = 2;\n\n this.dispatchEvent({ type: 'update' });\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'updated' });\n }\n}\n","<script setup lang=\"ts\">\n import * as bootstrap from 'bootstrap';\n import { ref } from 'vue';\n\n import type { Notification } from '@/api/notifications';\n\n import { useNotificationStore } from '../stores/notifications';\n\n const alertToast = ref<HTMLDivElement | null>(null);\n const notification = ref<Notification>({ level: 'info', text: '', title: '' });\n\n function showNotification(notif: Notification): void {\n notification.value = notif;\n\n const toast = bootstrap.Toast.getOrCreateInstance(alertToast.value as HTMLDivElement);\n toast.show();\n }\n\n const notificationStore = useNotificationStore();\n\n notificationStore.$onAction(({ args, name }) => {\n switch (name) {\n case 'push':\n showNotification(args[0]);\n break;\n }\n });\n\n function getIcon(): string {\n if (notification.value == null) {\n return 'text-bg-success';\n }\n\n switch (notification.value.level) {\n case 'error':\n return 'bi-exclamation-circle-fill';\n case 'info':\n return 'bi-check-circle-fill';\n case 'success':\n return 'bi-check-lg';\n case 'warning':\n return 'bi-exclamation-triangle-fill';\n default:\n return 'text-bg-success';\n }\n }\n\n function getStyle(): string {\n if (notification.value == null) {\n return 'text-bg-success';\n }\n\n switch (notification.value.level) {\n case 'error':\n return 'text-bg-danger';\n case 'info':\n return 'text-bg-secondary';\n case 'success':\n return 'text-bg-success';\n case 'warning':\n return 'text-bg-warning';\n default:\n return 'text-bg-success';\n }\n }\n\n // For testing purposes\n // onMounted(() => {\n // showNotification(new Notification('Test', 'this is a test', 'info'));\n // })\n</script>\n\n<template>\n <div class=\"toast-container\">\n <div ref=\"alertToast\" class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n <div :class=\"['toast-header', getStyle()]\">\n <i :v-if=\"notification.level === 'info'\" :class=\"['bi', getIcon()]\"></i>\n <strong class=\"me-auto mx-2\">{{ notification.title }}</strong>\n <!-- <small>11 mins ago</small> -->\n <button\n type=\"button\"\n class=\"btn-close\"\n data-bs-dismiss=\"toast\"\n aria-label=\"Close\"\n ></button>\n </div>\n <div class=\"toast-body\" v-html=\"notification.text\"></div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .toast-container {\n bottom: 5rem;\n right: 1rem;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Color } from 'three';\n\n const props = defineProps<{\n color: Color;\n }>();\n\n const hexString = `#${props.color.getHexString()}`;\n</script>\n\n<template>\n <span class=\"color\">\n <span class=\"d-none\">{{ hexString }}</span>\n </span>\n {{ hexString }}\n</template>\n\n<style scoped>\n .color {\n height: 15px;\n width: 15px;\n\n padding: 0px 4px;\n display: inline-block;\n min-width: 13px;\n min-height: 13px;\n border-radius: 3px;\n box-sizing: border-box;\n position: relative;\n vertical-align: middle;\n margin-left: 2px;\n margin-bottom: 2px;\n position: relative;\n top: 1px;\n\n background-color: v-bind('hexString');\n border: 1px solid black;\n color: black;\n opacity: 1;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps({\n prefix: String,\n suffix: String,\n value: String,\n });\n</script>\n\n<template>\n <div class=\"text-secondary\">\n <span\n ><b>{{ prefix }}</b> {{ value }}{{ suffix }}</span\n >\n </div>\n</template>\n\n<style scoped>\n div {\n width: 6rem;\n font-size: small;\n }\n</style>\n","<script setup lang=\"ts\">\n const props = defineProps<{\n /** url */\n href: string;\n /** title */\n title: string;\n /** mime-type */\n type?: string;\n }>();\n</script>\n\n<template>\n <template v-if=\"props.type?.startsWith('image/')\">\n <a :href=\"props.href\" target=\"_blank\">\n <img :src=\"props.href\" :alt=\"props.title\" style=\"max-width: 200px\" />\n </a>\n </template>\n <template v-else-if=\"props.type?.startsWith('video/')\">\n <video controls style=\"max-width: 200px\">\n <source :src=\"props.href\" :type=\"props.type\" />\n Download the <a :href=\"props.href\">video</a>.</video\n ><br />\n Download the <a :href=\"props.href\" target=\"_blank\">video</a>.\n </template>\n <template v-else-if=\"props.type === 'application/pdf'\">\n <iframe\n :title=\"props.title\"\n width=\"200\"\n height=\"300\"\n :src=\"props.href\"\n frameborder=\"1\"\n sandbox=\"allow-same-origin allow-scripts\"\n ></iframe\n ><br />\n Download the <a :href=\"props.href\" target=\"_blank\">file</a>.\n </template>\n <template v-else\n ><a :href=\"props.href\" target=\"_blank\">{{ props.title }}</a></template\n >\n</template>\n","<script setup lang=\"ts\">\n import { isColor, isLink, isVector3 } from '@/utils/Types';\n\n import ColorFragment from './ColorFragment.vue';\n import CoordinateFragment from './CoordinateFragment.vue';\n import LinkFragment from './LinkFragment.vue';\n\n const props = defineProps<{\n attrName: string;\n attrValue: unknown;\n }>();\n\n let styles: string[];\n\n switch (props.attrName) {\n // TODO move into module\n case 'IFCType':\n styles = ['badge', 'bg-secondary', 'text-light', 'text-truncate'];\n break;\n default:\n styles = ['text-truncate'];\n }\n</script>\n\n<template>\n <tr>\n <th :title=\"attrName\" class=\"align-top text-truncate\">{{ attrName }}</th>\n <td :class=\"styles\">\n <template v-if=\"props.attrValue === undefined\"\n ><span class=\"text-secondary\">undefined</span></template\n >\n <template v-else-if=\"props.attrValue === null\"\n ><span class=\"text-secondary\">null</span></template\n >\n <template v-else-if=\"typeof props.attrValue === 'object'\">\n <template v-if=\"Array.isArray(props.attrValue)\">\n <table>\n <AttributeItem\n v-for=\"(subitem, index) in props.attrValue\"\n :key=\"index\"\n :attr-name=\"`[${index}]`\"\n :attr-value=\"subitem\"\n />\n </table>\n </template>\n <template v-else-if=\"isLink(props.attrValue)\">\n <LinkFragment\n :href=\"props.attrValue.href\"\n :title=\"props.attrValue.title\"\n :type=\"props.attrValue.type\"\n />\n </template>\n <template v-else-if=\"isColor(props.attrValue)\">\n <ColorFragment :key=\"props.attrValue.getHexString()\" :color=\"props.attrValue\" />\n </template>\n <template v-else-if=\"isVector3(props.attrValue)\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <CoordinateFragment :value=\"props.attrValue.x.toFixed(0)\" prefix=\"X:\" />\n <CoordinateFragment :value=\"props.attrValue.y.toFixed(0)\" prefix=\"Y:\" />\n <CoordinateFragment\n :value=\"props.attrValue.z.toFixed(0)\"\n prefix=\"Alt.:\"\n suffix=\"m\"\n />\n </div>\n </template>\n <template v-else><span class=\"text-secondary\">Object</span></template>\n </template>\n <template v-else\n ><span :title=\"props.attrValue as string\">{{ props.attrValue }}</span></template\n >\n </td>\n </tr>\n</template>\n\n<style scoped>\n th {\n max-width: 150px;\n }\n td {\n word-wrap: break-word;\n max-width: 200px;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Attribute } from '@/types/Feature';\n\n import AttributeItem from './AttributeItem.vue';\n\n defineProps<{\n children: Array<Attribute>;\n title: string;\n }>();\n</script>\n\n<template>\n <div v-if=\"children.length > 0\">\n <h6 class=\"badge bg-info-subtle text-dark mb-0\">{{ title }}</h6>\n <table class=\"table table-striped table-sm w-100\">\n <tbody>\n <AttributeItem\n v-for=\"(list, index) in children\"\n :key=\"index\"\n :attr-name=\"list.key\"\n :attr-value=\"list.value\"\n />\n </tbody>\n </table>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { Vector3 } from 'three';\n\n import { ref } from 'vue';\n\n import type { AttributesGroups } from '@/types/Feature';\n\n import AttributeGroup from './AttributeGroup.vue';\n import CoordinateFragment from './CoordinateFragment.vue';\n\n const props = defineProps<{\n attributes: AttributesGroups;\n name?: string;\n parent: string;\n point: Vector3;\n }>();\n\n const copied = ref(false);\n\n function copyText(): void {\n const value = `${props.point.x};${props.point.y};${props.point.z}`;\n navigator.clipboard\n .writeText(value)\n .then(() => {\n copied.value = true;\n setTimeout(() => (copied.value = false), 2000);\n })\n .catch(e => {\n console.log('failed', e);\n });\n }\n\n defineEmits(['close']);\n</script>\n\n<template>\n <div class=\"card\">\n <div class=\"card-header d-flex align-items-center justify-content-between\">\n <i class=\"bi bi-card-checklist\"></i>\n <span class=\"text-truncate mx-2\">{{ name ?? parent }}</span>\n <button\n @click=\"$emit('close')\"\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n ></button>\n </div>\n <div class=\"card-body content py-2 px-1\">\n <AttributeGroup\n v-for=\"(item, index) in attributes.entries()\"\n :key=\"index\"\n :title=\"item[0]\"\n :children=\"item[1]\"\n />\n </div>\n <div class=\"card-footer py-0\">\n <div class=\"d-flex align-items-center column-gap-3\">\n <CoordinateFragment :value=\"point.x.toFixed(0)\" prefix=\"X:\" />\n <CoordinateFragment :value=\"point.y.toFixed(0)\" prefix=\"Y:\" />\n <CoordinateFragment :value=\"point.z.toFixed(0)\" prefix=\"Alt.:\" suffix=\"m\" />\n <button @click=\"copyText\" type=\"button\" class=\"btn btn-link\">\n <i\n class=\"bi\"\n :class=\"copied ? ['bi-clipboard-check', 'test-success'] : ['bi-clipboard']\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .content {\n overflow-y: auto;\n }\n</style>\n","export default \"data:image/png;base64,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\"","<script setup lang=\"ts\">\n import logo from '@/assets/piero_logo.png';\n</script>\n\n<template>\n <div id=\"loading-screen\" class=\"container\">\n <h1>Loading...</h1>\n <h2>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"48\"\n height=\"48\"\n fill=\"currentColor\"\n class=\"bi bi-geo-alt-fill pulse\"\n viewBox=\"0 0 16 16\"\n style=\"vertical-align: middle\"\n >\n <path\n d=\"M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10m0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6\"\n />\n </svg>\n </h2>\n <div class=\"logo\">\n <img :src=\"logo\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n @keyframes col {\n 0% {\n transform: scale(0.8);\n }\n 50% {\n transform: scale(1.2);\n }\n 100% {\n transform: scale(0.8);\n }\n }\n\n .logo {\n margin-top: 10pt;\n }\n\n .pulse {\n animation: col 3s ease infinite;\n }\n\n h1 {\n color: #377c5f;\n font-size: 2.5rem;\n font-weight: 500;\n line-height: 1.2;\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-family:\n system-ui,\n -apple-system,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n 'Noto Sans',\n 'Liberation Sans',\n Arial,\n sans-serif;\n }\n\n h2 {\n color: #377c5f;\n font-size: 2rem;\n font-weight: 500;\n line-height: 1.2;\n margin-top: 0;\n margin-bottom: 0.5rem;\n }\n\n .container {\n max-width: 100% !important;\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n /* left: 0; */\n width: 100vw;\n height: 100vh;\n right: 0;\n display: flex;\n z-index: 999;\n flex-direction: column;\n justify-content: center;\n text-align: center;\n background-color: white;\n }\n</style>\n","<script setup lang=\"ts\">\n import Instance from '@giro3d/giro3d/core/Instance';\n import Inspector from '@giro3d/giro3d/gui/Inspector';\n import { onMounted, onUnmounted, ref, shallowRef } from 'vue';\n\n import { useGiro3dStore } from '@/stores/giro3d';\n\n const mainView = ref<HTMLDivElement | null>(null);\n const inspectorView = ref<HTMLDivElement | null>(null);\n const instance = shallowRef<Instance | null>(null);\n\n const store = useGiro3dStore();\n\n onMounted(() => {\n instance.value = new Instance({\n backgroundColor: null,\n crs: store.getCRS(),\n target: mainView.value as HTMLDivElement,\n });\n store.setMainView(instance.value);\n\n if (!import.meta.env.PROD) {\n const inspector = Inspector.attach(\n inspectorView.value as HTMLDivElement,\n instance.value,\n {\n title: 'Main view',\n width: 300,\n },\n );\n store.setInspector(inspector);\n }\n });\n\n onUnmounted(() => {\n if (!import.meta.env.PROD) {\n store.getInspector()?.detach();\n store.setInspector(null);\n }\n store.setMainView(null);\n if (instance.value) {\n instance.value.view.setControls(null);\n instance.value.dispose();\n }\n });\n</script>\n\n<template>\n <div class=\"main\">\n <div ref=\"mainView\" class=\"main\" id=\"main-view\"></div>\n <div\n ref=\"inspectorView\"\n id=\"inspector\"\n class=\"position-absolute top-0 start-0 mh-100 overflow-auto\"\n ></div>\n </div>\n</template>\n\n<style scoped>\n .main {\n width: 100%;\n height: 100%;\n\n background: radial-gradient(circle, rgba(86, 120, 105, 1) 0%, rgba(39, 56, 53, 1) 100%);\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Ref } from 'vue';\n\n import { ref, watch } from 'vue';\n\n import type NavigationMode from '@/types/NavigationMode';\n\n import { useCameraStore } from '@/stores/camera';\n import { useNotificationStore } from '@/stores/notifications';\n\n import SwitchToggle from './SwitchToggle.vue';\n\n const camera = useCameraStore();\n const notificationStore = useNotificationStore();\n\n const navigationMode = ref<Ref<NavigationMode>>(camera.getNavigationModeRef());\n watch(navigationMode, newMode => {\n camera.setNavigationMode(newMode);\n\n let name: string;\n let description: string;\n\n switch (newMode) {\n case 'disabled': {\n name = 'Disabled';\n description = 'Camera is disabled';\n break;\n }\n case 'first-person': {\n name = 'First person';\n description = `<i class=\"bi bi-hand-index-thumb\"></i> Left-click to rotate; Right-click to pan<br>\n <i class=\"bi bi-mouse2\"></i> Scroll to zoom<br>\n <i class=\"bi bi-keyboard\"></i> Up/Down/Left/Right: move forward/backward/left/right<br>\n <i class=\"bi bi-keyboard\"></i> W/D/A/S: move up/down/left/right`;\n break;\n }\n case 'orbit': {\n name = 'Free navigation';\n description = `<i class=\"bi bi-hand-index-thumb\"></i> Left-click to pan; Right-click to orbit<br>\n <i class=\"bi bi-mouse2\"></i> Scroll to zoom to cursor<br>\n <i class=\"bi bi-keyboard\"></i> Up/Down/Left/Right: move forward/backward/left/right`;\n break;\n }\n case 'position-on-map': {\n name = 'Position on map';\n description = `<i class=\"bi bi-hand-index-thumb\"></i> Left-click on the map to move to First Person view on the ground.<br>\n Cancel with right-click or Escape`;\n break;\n }\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = newMode;\n return _exhaustiveCheck;\n }\n }\n\n notificationStore.push({\n level: 'success',\n text: `Navigation mode set to <strong>${name}</strong>.<br>${description}`,\n title: 'Navigation',\n });\n });\n\n function onPositionOnMapToggle(): void {\n if (navigationMode.value !== 'position-on-map') {\n navigationMode.value = 'position-on-map';\n } else {\n navigationMode.value = 'orbit';\n }\n }\n</script>\n\n<template>\n <div class=\"card root\">\n <div class=\"d-flex align-items-center\">\n <i title=\"Free navigation\" class=\"mx-2 bi bi-camera-reels-fill\"></i>\n <SwitchToggle\n :model-value=\"navigationMode === 'first-person'\"\n @update:model-value=\"v => (navigationMode = v ? 'first-person' : 'orbit')\"\n />\n <i title=\"First person view\" class=\"bi bi-universal-access\"></i>\n <div class=\"vr mx-2\"></div>\n <button\n class=\"btn btn-sm btn-outline-secondary\"\n :class=\"navigationMode === 'position-on-map' ? 'active' : null\"\n :aria-pressed=\"navigationMode === 'position-on-map'\"\n data-bs-toggle=\"button\"\n title=\"Position on map\"\n @click=\"onPositionOnMapToggle\"\n >\n <i class=\"fg-position-man\"></i>\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n .root {\n padding: 0.3rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n margin: 1rem;\n }\n</style>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAABXCAYAAAC+73jDAAAAyHpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVDbDcMgDPxnio7gBw97HPKo1A06fo/gSEnUkzgftjkMaf9+3uk1IJxTLs2q10pA9uzSIYwm+sFM+eADsobiez6VFocEKUXUubU6I5/5OHBG7lDlYmRrFJZ7wXP428MoLtIxkUBsYeRhpDILHAZ9PouqW7s+YdnpDpsrDVqIDjv2aH7sc8PvbQX3qMiurARWtTmAjlWSdggHI4FGRsPQDczaYhJ8yL9/OpF+mhJaGNqk9l0AAAGDaUNDUElDQyBwcm9maWxlAAB4nH2RO0jDQBzGv6ZKfVQczCDFIUN1souKdKxVKEKFUCu06mAefUGThiTFxVFwLTj4WKw6uDjr6uAqCIIPEHfBSdFFSvxfUmgR48FxP7677+PuO4BrVhXN6kkAmm6bmVRSyOVXhdAr+sFjEBHEJcUy5kQxDd/xdY8AW+9iLMv/3J9jSC1YChAQiBOKYdrEG8Szm7bBeJ+YV8qSSnxOPGnSBYkfmS57/Ma45DLHMnkzm5kn5omFUhfLXayUTY14hjiqajrlczmPVcZbjLVqXWnfk70wXNBXlplOcwwpLGIJIgTIqKOCKmzEaNVJsZCh/aSPP+L6RXLJ5KpAIccCatAguX6wP/jdrVWcnvKSwkmg98VxPsaB0C7QajjO97HjtE6A4DNwpXf8tSYQ/yS90dGiR8DwNnBx3dHkPeByBxh9MiRTcqUgTa5YBN7P6JvywMgtMLDm9dbex+kDkKWu0jfAwSEwUaLsdZ9393X39u+Zdn8/0ORyzDea69EAAA5daVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjM5NTZmNTIxLWU2YjAtNGRiNi1hMTk2LWM3ZjkwZjE1YzYwZiIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMTVlNTExOS1lZDExLTRjY2YtOGEzYi1lN2QyZDJkZjBkNzUiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4NjYzMjQ3ZS1mMmVjLTQwZmQtYjE3OC03NzFhNjEwMTRmYWMiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJNYWMgT1MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MzY3NjM3MjAyNDAyIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjA5OjIwVDEzOjI3OjE3KzAyOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowOToyMFQxMzoyNzoxNyswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjFiYjlmOWJiLWYyYzAtNGM4Yi1iYjgxLTU1ODE4NjY0NmQ2YiIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChMaW51eCkiCiAgICAgIHN0RXZ0OndoZW49IjIwMjQtMDMtMTlUMTQ6NDc6MjYrMDE6MDAiLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTUwOTQ2YzYtODBkMy00MmI4LTgwOTUtZDcwYTE3MjNlNDM1IgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKE1hYyBPUykiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDktMjBUMTM6Mjc6MTcrMDI6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+wSyPngAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAywAAAMsABKGRa2wAAAAd0SU1FB+kJFAsbEeAnRtoAACAASURBVHja7Z15mBXVnfc/p6ru0vf2vi/0ytqsoiIgKiogxp1EMkFnjJqocTIzmSWTmUzezCRxljca500m+6hjYsYlibtRcV/iBiqICMjaNND0vnfftarO+0dVX7qhl6ru24hwf8/TDw/Q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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACTCAYAAABszOBRAAAAxXpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVBBEsMgCLz7ij5BBBWeYxo70x/0+QUhnSTTnXGzsmRF0/y8X+lhKECJaucmrWUFCUkZKjg7xmLItHhBWnhwrSfBMIqWTMee4wc46vAL8M9QVU9B/AxjuxpCkc+3oDgIbaKiYj8miiAsbkAEDL9WbsL9fIVt5ivYVzJiWbNYmHu3PXV9vb3qOVjKRMCsjMjeg7ZqwqFClLWgjaANpruyt4I/yL93OpC+DARZTFnCKNgAAAGDaUNDUElDQyBwcm9maWxlAAB4nH2RO0jDQBzGv6ZKfVQczCDFIUN1souKdKxVKEKFUCu06mAefUGThiTFxVFwLTj4WKw6uDjr6uAqCIIPEHfBSdFFSvxfUmgR48FxP7677+PuO4BrVhXN6kkAmm6bmVRSyOVXhdAr+sFjEBHEJcUy5kQxDd/xdY8AW+9iLMv/3J9jSC1YChAQiBOKYdrEG8Szm7bBeJ+YV8qSSnxOPGnSBYkfmS57/Ma45DLHMnkzm5kn5omFUhfLXayUTY14hjiqajrlczmPVcZbjLVqXWnfk70wXNBXlplOcwwpLGIJIgTIqKOCKmzEaNVJsZCh/aSPP+L6RXLJ5KpAIccCatAguX6wP/jdrVWcnvKSwkmg98VxPsaB0C7QajjO97HjtE6A4DNwpXf8tSYQ/yS90dGiR8DwNnBx3dHkPeByBxh9MiRTcqUgTa5YBN7P6JvywMgtMLDm9dbex+kDkKWu0jfAwSEwUaLsdZ9393X39u+Zdn8/0ORyzDea69EAAA16aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmM0N2M4ZTNiLTg2ZjUtNDM3NC04Mzg2LTBjMGQwNGE1YTQxNSIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyNDVjNDdmMC1mODVmLTQ3NzAtYjVlNy1hMmU0ZDFmNWUwNzkiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozMDVhMDI1NS05NzY5LTRhZGQtYjQ3Yy1iOGU4MjlkZDdlNDciCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJNYWMgT1MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MzY3NjU4NjgwODMzIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjA5OjIwVDEzOjI3OjM4KzAyOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowOToyMFQxMzoyNzozOCswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmYwMzU4MmQ4LWUxMTgtNGY1Yi1hNDdiLTlkYjM4ZjIxNTk2ZiIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChNYWMgT1MpIgogICAgICBzdEV2dDp3aGVuPSIyMDI1LTA5LTIwVDEzOjI3OjM4KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Ptv0Ik4AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfpCRQLGyZYmuPVAAAgAElEQVR42u2dd3gc5bX/P2dmd1Use9eybIMNXorp/VJCCZAAAUy4kOQmJEAS4ELosPSA6WB6y8iEml9CAjcJhB4IJgQIhBAw3XSDgTFuuMhaWX135vz+eF/Z69VIVrMsGZ3nmcfyzpaZd77v6UX4GpLrerEwpASIqzISWA9YFxgNjAFKgCqgvOijCiwGmoA6+/dXwDxgrgj1QGtpqbQ0NZ2ufI1J1vYbjMU8NwhIqjIW2BHYBtgE2BiYACR7uR5tAAotyHzgE+BD4G3gAxGWqmaWDQFrsN+UeFWqTAS+CewFbAlsCDir+GjOcqJllis1AYuARgugLwuAVAUMs3+vZ7lcOVABjCjgds3Ax8C7wD+B/4jwhWqmcQhYg4K89YA9gUOBnboApAXAXGAm8J59+F8CNUBWhHrVTFM3OWOFKikgBYwFJlpQbwuMAzayYP0E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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAx3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVDbDcQwCPvPFDdCAnnAOOlLug1u/HMKrdqqlmIIRg4hrL/vFj4DlHLIpUnVWiOQNSt1JBINfecU88475kNL93o4BUKJEdmuUr3/qKfTwEJHVi5GMrsw3QXN7i8PI3+Ix0SEZHEjdSMmE5IbdPtWrCrt+oVpjXeInTBom0lHrUymPe+5YXtLwTtMtHLiCGYWG4DHKYE7EgWjgMaEhpE3cGHySbCQtz0dCH8eW1rDzUi1YAAAAYNpQ0NQSUNDIHByb2ZpbGUAAHicfZE7SMNAHMa/pkp9VBzMIMUhQ3Wyi4p0rFUoQoVQK7TqYB59QZOGJMXFUXAtOPhYrDq4OOvq4CoIgg8Qd8FJ0UVK/F9SaBHjwXE/vrvv4+47gGtWFc3qSQCabpuZVFLI5VeF0Cv6wWMQEcQlxTLmRDEN3/F1jwBb72Isy//cn2NILVgKEBCIE4ph2sQbxLObtsF4n5hXypJKfE48adIFiR+ZLnv8xrjkMscyeTObmSfmiYVSF8tdrJRNjXiGOKpqOuVzOY9VxluMtWpdad+TvTBc0FeWmU5zDCksYgkiBMioo4IqbMRo1UmxkKH9pI8/4vpFcsnkqkAhxwJq0CC5frA/+N2tVZye8pLCSaD3xXE+xoHQLtBqOM73seO0ToDgM3Cld/y1JhD/JL3R0aJHwPA2cHHd0eQ94HIHGH0yJFNypSBNrlgE3s/om/LAyC0wsOb11t7H6QOQpa7SN8DBITBRoux1n3f3dff275l2fz/Q5HLMN5rr0QAADXppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4wLUV4aXYyIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOkdJTVA9Imh0dHA6Ly93d3cuZ2ltcC5vcmcveG1wLyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElEPSJnaW1wOmRvY2lkOmdpbXA6NGVjMGMxNzUtNmE3NS00OGJlLTllZGYtOGNlNDQyM2ZmMmU0IgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU1YmZlYWVjLWNhZDAtNGZlNi1iMGJkLTM2ODEyMWNmYWFmMSIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjliODczYjYyLTY4ZDUtNDU3ZS1iNzVkLWFmN2Y3MGU5YTkzMyIKICAgZGM6Rm9ybWF0PSJpbWFnZS9wbmciCiAgIEdJTVA6QVBJPSIyLjAiCiAgIEdJTVA6UGxhdGZvcm09Ik1hYyBPUyIKICAgR0lNUDpUaW1lU3RhbXA9IjE3NTgzNjc2NzMwNDY0MTMiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zOCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjU6MDk6MjBUMTM6Mjc6NTIrMDI6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDI1OjA5OjIwVDEzOjI3OjUyKzAyOjAwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OGJhNTc0MjgtZDMyOS00MzUzLWI2YjMtYzk1YjRmYzg1MzQ0IgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKE1hYyBPUykiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDktMjBUMTM6Mjc6NTMrMDI6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+fJLSCgAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kJFAsbNdwkogsAACAASURBVHja7J13eBRV98c/syVt03shvRA6KbQkdGkCERAQEMuLxgoWFAs2FLF3BQuCgoqIiPTeew+EXkIICek92ZRt8/sj+QHJbpJNsiHhfTnPw6PMDHfn3rnfe/o5Anep2ch1/hQrwA/wBtwAZ8AesK36r7TqDzX+Xwdoqv5fW/X3AqAYyKv6kwmkAElZcQuVd1e7eUi4uwQmAYIP0B4IAYKr/j8UcL9ljZtjrcWqP1nAeeAMkAhcBM5kxS28evfr3AXI7QaDAxAGhAM9gRjAqer0b03rqaniOnuBw8BR4FhW3MK8u1/xLkBMLSZFAP2BYUBXwPwOXDsRUAGngLXAHuBIVtzC4rtf+S5AGgoKD6AvcD8wELADJP9l0xSBImAX8DewMytuYerdr38XILWBwhUYCjwERAFWphpbi0iFKFIO+Mkt8JRb4SyzwlIiw9lMgbSWzyACWaoSVKKWLHUpaepSrqnLkAPmglDrv2sklQHHgMXAmqy4hRl3d8X/OEBc50+xBPoAT1VxCpvGjqUD1Ij4yxV0sHSija0rAXbuBDt4YW1ljZPCHmcrOyQSCVKJFKlEgiBIkEukdY6r1mkRRRGtTotWp0Wn05FTWkiusgBlmZKkggwSC9K4VpTJ2bJcLqtKkCM0ld2VVIlg3wPbsuIWlt4FyP8WMLyrQDEZ8GmsfBJkZk0nW0+iPdsT7OKDj4MHNhYKFGaWSCW3VyLTijpKVeUUl5WQnJ9Ocm4aO6+f4kxRGucrihEa/7GvA38AP1JpUhbvAuS/ExRSoAfwCjAEsGjoQgWZWRPlEsJA366EuPrhbOOAjblVq553SUUpecpCLmddY/u1E+zOOMclVQk6GrzPy4GdwCfAnqy4hZq7APnvAIYMGAVMp9Isa/ScrQQpkbYejA+KprNnCF4OblibWd7R61GqLictP4tT6Zf4+/I+DhWmUqLTNnSYo8CXwPKsuIWquwC5M4EhrxKhplHptzCKLAUJMQ6+TGrbl06ewbRxcEP4L10mURRJK8zmbHoiyy/uYXPOZUrFBoHlLPAZ8HtW3EL1XYDcOaLU2CpRKtyYfyMBwqxdiWs3iAjvdng7evxPKmepBZmcSDnPgrNbOFScgdZ4Mews8CnwW1bcQu1dgLRecPQD3geijXneTJDwXEAfBgd3p4NnELJ6LEr/K6TRaTmfkcSOxKN8fmk7ZcaLYMeBN7PiFm64C5DWBYxg4IMqzlEvtbO0Z2r7ofQJisDVxvEuIuqg7JJ8Dlw5wVen1nOmzOgolTXAzKy4hafvAqRlgaEAXgJeA+rUnkVgkL0v/+kwiF6BYSjMLO7u/gZQuUbFwSsnWXBqIxvzrxrjZ6kAvgI+zIpbWHgXILcfHEOBr6mMoK2VdIgMsffj8S73EhXQFTOp7O5ubwJpdVoOJ59m8clNLMs5j6z+LZQEvJAVt3D1XYDcHmA4Ah8Bj1FHfJQO6G3jwXPho4gO6Ir8DgZGUVkJvxxdSwcXP/wcPXG0tsfByrZFP55Wp+VAUgI/xq9lY0ESkrrfRgT+AqZnxS1MvwuQ5gGGQGWs1I9UJiDVSu0t7Jje5T4Gt+uFuczsjj+1T6Vdot/6D5FVGZzdZOYEK1wY5NmJ4e1708bBrcXeTaVVs/3CYb6IX8nJ+nWUbOBpYMWd4pGX3iHgsK6SZz+nMhPPIFlLZLwZOoTZAx+ni1fIbbFKlakryCzKpUKrRtFMTsSDVxJYl3bqxt9LdFquVRSxI+cy3oI5Ed7tW24DSaQEufgwum0MXqIZR3OvUC7qantcUWVI8VPEhu1Wrokvv8tBmg6OTsCfQIda2T0wya0DL/R6AH9nr2adlEqrJr+0iHPpV9iXepo96ec4XpbLMAc/vo+dgZXc9Mr/axvn8UvqMcPrI7Pg0IOf1/u7IpCvLMTK3BKLZuSqyXnpzDv4DwvSjtcXbXwZmJgVt/DoXYA0DhgS4NEqRdy6tucC5Are6zGJfsGRza5npBVm8/zGb9hdko4oitUWTwTmdBzB4z1HmdTzXq5RMeqvN4ivQ3xZ0X8q0YF1Bwvklhbiu2Q6fRUudHXwJcI9mGBXPzp6BCIIpt0GGp2WvYnxvH3wDy5UFNX1aCnwKvB9a3UwSlspOCyBH4B3qMzeM4jsJ7y78eXgZ+nsFXxbomdT8zJ478x6gyeLAOzLvkx/lxA87JxN9pv5ykI+SFiHRqxdZHdFRu+AsDqBeS4tkWVXDpCuLuV4URrr0k6Tk5vOyNAYJCYGiESQ4OfkSWxQLyxKyzicf602n7wcuBcIUcSGbVKuiW91cV2SVggObyqz3KbUxuG8ZJb83vsJ3hkUd1sdfQXlJXUGX1SIOl7e/TO5StOZ/ZPy0imtx5M9L/kgOSV1/+bl3FS9xYx0CWzWg8VJYcdL/R9iWf9n8ZMr6np0ArDXdf6UoLsAqRsc0cB+oFttz4x2DmHNqLe5p22P2x4aklta/8Y/XZbP3P3L0NWuqDaIruWl1fuRtKKOQ1cT6tA/RC7lpuhdD3H2bn4RRZAQExjG6jHv8KB7p7qEzy7APtf5UwbeBYhhcIwHNgJtDN2XCQKfdB7FVyNexMvetUXeUVmurMExRF4M6ovOwIm+9fwhk/zmtpST+oeEewe9fI4NiYdqBaVWp2NL9oXqegIibRw9btvaudk48fGwqXwdPh557SKdK7Dadf6UKVVm/bsAcZ0/ReI6f8qLwO+1KeN+ZgpWDHyeh7uPaFYLTH2UVVpQ7e/F6JgSMYI4r3A9i9HTBxdxLa9pad2l6nLOFKTqHRTPR44m1KK6tXtR1lmu5Rv+vRxlAQeUOdWuKSRyApy8buv6yaUyHggfwprBL9PeolZrvRUwH3izylDzvwuQqmSm2cAXVQqbHg1x8OPvETPp4depxfMyThVer/Z3H5kF1uZWPB8zkXbmttXulWjVfLRnMeWaxuudeSUFXFFX51reMkvaOLrzcEBM9Q0vSNiXGG9Yj8lOxV6o/qlHOAcjl8pbZB3DvENZMvJ1xji3rWtfvgd8U7VH/vcAUjXxr4GZtT3ztE8P5o6Yjo+je6sQA0/WAEiQuS0SiQQ3G0fe7TWZmjmo/2Rf4K/jmxqvf+RnoqohNnWw88LGzJJo/y56+RrLrxxAY0Chv5hzTe9o6e4abHLrVUPIw86ZT++dxksBfeoyfDwLLHadP8X8fwogVRP+BXjGoMyMyOwOw3nrnsewMVe0CnCUa1SklFevseZrYX/DUBATGMaMgN56/25GwkoSrl9s1G9eNrCxB3t3BSDUPYABdtWV7J3FaZxNv1Jd3BNFzudc1Rvb39GzxdfU2sySl/o9xJdhY9HUDpOJwKKWAomkBcBhASyiMh3WAAn80vNR4nqORtqKEphyS4v0FGMPC7sbAJEKEp7uNZZIK+cas4E3d/9CYVlJg39za2qCnm7jU7WxJYLAhODqgDRDYPvlI9WuqbUaduQm6h1A3k6erWJdpRIJkyKG8md0HOa1f+8HqkBi8V8NkCqxamHVhPW1M4mMf/o/y4iOfUzu3W0qFZYW6Z1x1pbVbQp2ltbM7v0oNZOzDymzmLf/b3Si8fF5heVKThWlVbtmLkgIuOXk7+bbSU/MWpJ8CKXqZohTenEup8qrm6cdpOb4OLi3mrUVEBjUrhcrBj6Pq8yiLpD8ertBIrnN4PimimXqkbvMguX3PE9MYFirjH8pK9evneZq5WBQAf2kwwi9618m7WXHxcPGc6zifDI1FdWuBZvZYGN1s7ZdGwdXHvLoXF0hVxUTn3Luph6Tcx1FDQV9nEcnk3FnragzqPc0HCQQ6duBPwe/iFvdIFlUVZDjtpDsNoFDQmWu+NMGFTaZJb8PfoGOnkG0Vso24CR0V9wESHFFKSn5GZxOu8y21ASDG+CVg7+z2s3fKD9Ocn66Hnfo6uSHldy82sk7IrAXS9JP3XLiCay/uJ/ogK4IgsDJzES9A6ezS0CjD6HCshLOZ1zhYOpZTmVfIb+iBC0iDmYKQhy96eHVjs5eITgp7BpldezoGcSK4a/y+MavOFdh0DE7HshznT/l2ay4hbr/CoBQmRb7iqEbnjJLfjMBONQ6DeWqChBFJFIplnILk1ppCsqK9fSBzLICVifsYOe1k+zNu3Kj7GdtlKou5aPdv/HZvc9hLqv7EEzM0fd8R3u00+dYPu1QSKQobznFl6Yn8FJpIQ5WtlzMvab3b/wcGu4gzFUWsvzEFhYk7iZJpdQXPZSwPj8JMXE3jlIzHvXpzsSwofg2whkZ5OLDgmHTeWzDF7WB5Ckqc0vebnYd6TZwjweB7wyJc57ypoMjqziPfxO28/mBv5hx7G/ePLmGted2k3j9Es6WdrjZOptEnzmUdJJtOZeqcYRNmedYe/0Up0qyKNSqjSomfUqZjQ/mdPYMrvO59w4sIbWiuJpi/UKX4bjbVjcCWMrNqSjI40B+8o1rKlFHpI0n3vbuvH7kL0p1mmrvPT3iPuwsrI2at04U2XX5GE9s/oZ/Ms9QqFXXOUsBKBe1HCy4xrKLe3DWSQl1829wzJejlS0xnu3ZeuUwhTqDJbd6K2LDspVr4ps1XF7SzODoC/xkCIh2EjkLB0xtNDg0Wg3L4jcz+J+3eOnkCrYUXkOt0+IsSElXl/JbegJDNn3GD/v+RqVpWk0zEbhQlGHgdKkbENYSKW5Sc70FfzdhFecykuq0mJ0ryaoOBEFGm1pEswEBkdXeRACWX9hNSkEm19TVdScvMwVedi7G6Rc6HYuPrGHsru+5pGp4G5FCrZrn4v/mzU0/UFze8C5xQS7e/Dr4BTxklrXt3a9c508ZfkcCxHX+FH8qE530iteaCRJ+6fcUYd6hjRo7r7SINzZ9z7PH/iJdU17n5N45v4kf9i9vWvCgKHKmuP5UanNBQqiFHW+0HcQ//aey9/45rBj5Og6S6uJUoU7DazvnU1TLpskuzKFQV93t2E3hgq2l4eLzHTyDaCOvvswb8pNYe24vljUU9DFeXZEK9X92nSiy+OhaZiSsrFXMEAA7iQwvmQW2EsPlGyQI/JoWz2ub5lFSUdbgpe/gEciCAc9gIzGoDZhVKe0d7ygRq6or02Yq+/XpncY/93qEAW17NEpRTM5N4/lN37Aq55JR/14A9uReobeDP96NNG2KwMzDf6GtYaaVCQJt5FY85t+L5zoO5aWIUTwbOYoov874OFZWene0siPQ3IFVKdXDQFJVSqxKy+lpIITmaMpZ/q3x/GC3UAYH9zD4fnKpDHmFhq1Z1QMS9+Ql6Z2AU4L7EOruX++cd10+xuOHfzfIJW0lMl4PHcxb3cYyNXwkT4Tdy+S2fRnjE46P1IpjeVdR1zAwnC3NQVuYT7R/FyRCw85lTzsXulh7sCz5qKFvbgUMUMSG/dEcKbzSZgCHFPgVGGTo/sedYhnXdVCj9ILDyaeZsvlrTpblVt8ggsAjbcJ5yLcHhWUFXFfpO+USs68ytl2fRpk3c8uK+CxhQ7XN0snSkb+Hvsz0nuPoGxCOv7MX9pY2BmVtPydPSrIzOFbDr3EgL5kett56iuz6c/vYk1vdI/58+8EEu/rW+o6WcnP+uLSnWmSxoRWe1mko7vUkdOUoC4jb8g0FWv04skluHflhyDQGhvTA1dYJa3NLzKVyrM2tcLN1oodvR+7ziSAv5zrnSqt/pwOFKXS39iTAuU2Dv4Gvowe+EkvWp58xNC9noIMiNuxv5Zp4k1q2mkPEepZafB3P+UXxcLcRDQaHTtSxOmEn47Z+w9UawXs9rd3ZMnwmHw19lsk9RrJszDu82VYfm8dLskhtZHRtrrJQr/5TmJ0XQa6+mBsR8CeXyJga/QC+ZtXDZnSIvLDvF9KLqkfa/pt6vLqFDpE2Th71yuvh1m71ioBu9YBDBJYd38TlCn2dY7p/bz4Y+ky9nNjf2YuPhzzLRLcONUymAu8f+Yvi8ob34xEEgfFdB/FaUP/aHhlJZQHB1quDuM6f0pPKmlV6FOsUxAt9JjX4BC9XVzB37zLiDv9GeY3K4xPdOvLziJdp5x5w45qF3IzHe46mp031j6hFJKO4cQ1eS8v0zZrOFnYNMiO72TjydcxjCAhoEfE3t+WttoP4pMdkzG4BWYVWzfMdhvGSf2+CLO3RIOIsNa/XNCuTSHm8/aA6nwm0tMfDtm6AFJQW8c3lnXrX73duy9TeE7CUGxcSZWtpzdsDHiPEwq7a9TPlhXUmd9UHkmdixjPJvVaV403X+VP6m3JPy0wIDnsq+9vpmRzaWdjx7oDHG1UW50jyGeZc2GrwNHy6xxhcrB0MihsPBffl4PG/apyOjSvFVFimf5raWFo3eJzu/p34u98zeNq74ufoaVAcM5fKGdVlAAAvizrSi3LJLsrF0ohSqeHe7bA5IqNYZ7i3zQjPLvWOcezaWfK0qhr8UuCl6IkNLtfqqLDj7chxTN77czWx76/zOxnYtkejxGwLmRlv9PsPV9Z8zEFllt7yAb+5zp8SnhW3MKvVcJAqT/m3hpRyEPi8z+N4GmlarElRgV15s+09elu7QtQxe/ciPQfejZOwQqlnkvWwaVwxhQxlvt41Fyv7hit8goTeQeEEOrcxyi8gESR42bnQ1TvUqPRiL3s3BjnVbjbv4Fq/cn4g5bSejP9yYB8CXRqXnhvh0wHXGqbuAwXXyC8tavR+c7a2Z07fx7AwvCZewPwqXbjViFhjgEmGbnwVNpYIn8YXNpMKEh7rOZoH3Tvp3dtSkMznu/+gooafI6s4j/kXt1e71tbCDg+HxqXqlhgwx7o1AiDNTQLwZPhIRjmHYCmVUXGL1U0AfOzr1h3UWg3nC67rXe/nH97od3K0sqWTbfXfzdBUNCq6+Vbq6BnEt90erEsfeaRVWLFc50/xAtZjwN/xsEcXpsU80OTKGXKpjB5t2nPyagLXaliojhWl4ayGrm3aIggC1wuyeG7TN3plMAu1Ko4nnURdVoaAgJlMjoUR8rQIbLlwkIMFN0M21KLIlHb9Gs0Vm5Pc7Zy5NySKZzoNYYxPOAOcAgk0t8VRkDGqY786C8yptGrmnlxP7i2+JbkgMKPbGKzNG1818uC108QXpSNWracA3O8T3uT1C3LxoSwvmyOFqYbOigFVVq28ph46TQGHACzDQF8OX7mC1aPf1guNaApdzU1j/NqPSFbrn+i/Rv0HD1sXnt3+PZfr8frqAG+5JT0dfBnm3532HoG42zoblLF1oo6H/v2ArflXGWTrTU+PdnTzakfnNiFGK6ytgTQ6LVJJ3b5/ZUUZkUtfJk99EyAWgoTzj8zFsgm1AE6lX67mSdeo1QS7+eJhggMmT1nIuH9nc7o839DtrcDQphSlaypA7q8CiKSmvP/3gKlEB3Q1+Yc+du0sY7d8pddLz0oiRUBAqWt481UN0MXCniiXYAb6hdPOIxBHhS1mUjmiKHIw+RTBzt7YWdkgl/z3tk8oU1cw8u+3OHWL/8JMEEiY9CUOljat9r2PXTvLqC1foNLPtxGBx7LiFv5y20WsqjYEawDbmvee949hQviQZkl68rBzxk9mw5rrCdXQrRZF1LeEk4hAF0sHzAUJ+bq6A+wkQLamnONFafx97RjfntnCySsnaOfojZuNE972bliZWRoVonEnk1Qi4WDicc7dIp7qgPF+3XC2tm+17+1h64xZaTm7cxINMYDeitiw35Rr4hul9DTli78B6OVthprb8UTPMQ0OJzCe5QnEdurLrLZD6jTaPucXxb9j32Pr+A/ZPGQGb4UOpqOFfX19LBAAL5k50yJG0cEj8LZ9ZK2oQ6ur+iPqWmSjSQQJnV0D9Y7gU2mXWjWwBUHgocjhhFsZFOcdgTm3VcRynT8lHDhAZbBYtcGW959KTGBYsy9KuUbFW5t+ZHH6Cb173RSuLBv7jp5CWq5RkZKXzqm0S/x5aQ/Hi9P1eoRHWDnx1T3PElJHWEdDSUREq9NRXFFKakEmBcUFpBRnk1NaSGlFKRqNmkxVMRpdJTBkEgluZjZIpTIUFgqcrezwsnbC3toeL3tX7C0qQ1qag0OfSL3AgI0fV8trCTS3Yc397+JkZdeqgRKfco7hmz431J1XBwzIilu4q9kBUqWYbwH0SkTGtYnk3cFP3pZC0gD5pUVMXfcFWwtT9E69d9sN48mo2jmZiEh6YTYXMpPZdOUIa9JP0dvBn9n3xBl0PjYUEOVqFZezr3E+M4lLOSlsyT7PHmUOtgh1VRasR1cSKRZFelo5MdA5mLbOvoS6+dPWzQ8LuZlJ6oaptRoe+mc2O4qqW4am+fbitYH/adWdgHWiyKc7FvHFlT2Gbh8GohqqsDcGIPcDy2ted5NZsGHUOw0qC5qUm0ZKfjrRAV0bnSOdnJvGqLUfklYj70GDyOJe/2F4h95GjVNQVoK5TN5oy5QI5JUWEn/tHEevn+PXlCPkaMpvBDhKEbASJIRYO9PTOZD29m2wslBgZWaBwswShcz8Rv9EtU5LibqMMnUFpapySsqVXCi4zsGcRM6XZKHU6W6ckjpErKVmTGkTSS/vjnT1Dm10uuv/045LRxi/64dq8rcIzAjsy7TeE1q0umV9lF2ST+yKWVxRGVQ5pjRUYRcaCA4z4BjQsebm+LLr/TwYea/xJ5VOw0vrvmFp5hkecu/E45Gx1WKqGkLHU84xfNNnejVyLSVS/h00vdF5J8aQSqvm+LVzbEs8ytzkAzf0BwkQauXIA77dCXb2wdfRA1dbZ2zNrZr0eyWqMjIKs0nNzyIxN4Xfk/ZzvjTv5twFgae8uzEooBuRvh2xkJs14iTW8cbG71l4/bjevVinYJ6OvI+ubdo2m57ZVFqZsIO4w78bUrCvAh2z4hYqmwsgTwPzal7vbuXC0rHvNCjW6kDSSWK3fXNjEhIEVg96kW6+HRq1KKtP7+KJg4v1pE9/M2v+Hvl6o3NBaqNcZSG7Lh1l7pmNnK6y+ojAeLf2DPGLpINHIL5Ons1u+RJFkeT8dM6mJbI+6TDLMs/e+KgB5ja81HE4fYMjGyw25ioLeWrtZ+wuTjN4v4eNB6N9IrC1tEGr05JUkMGIdjEmNWyIiCRcv0RhWTF9giKM10/VKv6z8gO2F6YYuv16VtzCj0wOkKqe5GcA35qizIq+z9A3ONLoCShVZUxcMZtDJZk3rkUqXFl2/zuN7l+uE0V+3LecWec36t2LsvHgl9jXsG9EgKEhFr7h3D7mnF5LgbYyLSjMypnHQgfQw78Lvi1cb+p6YRYHryTw64XtHCzJREJlgtOM0CHc17EvbrZORo+Vkp/B1I3fcFCZadTz8yImcn/YPSaZx5Wc6/wRv4F5yQfwkytYO3Y2TgrjjQSHr55myJYvMNPX97KAEGN7txst+Ctiw54HxtW8PsIxiGd63d8gxXz1qV38ePXgDXRKEPihbxz+Tag2LggCnTyDKci6zoni6nkfKaoSinMz6ePftdFKZnG5kjWnd/Pwtm9ZnX6GIp2Wye6deK/7eGbETKSzV4hJANhUsrVQ0N4jgPHt+9HPMQBZeRn7itPYnX2Jped3Yq+V4OvgYZToZWdpzUC/MApy0zlVklXvaSqqyxkV2rtJ759TUsDio+t4Yu8C9hVUdqbK16lx1UqIbEBMn5utE1kZVzldohfUqwDKlWvid5kMIFXV7H4HqkG4QhSZ22dKg9oQZxbn8dSO76uFZE9y78TDkSOaLNPKJFIivdpxNvkMSTV6450szsCuQku4d7sG5XHoRB0HkxJ4esu3LEw+TKFOy2SPTnwV8ygPRw7Ht5aw9ZYmiSChjYMbg4K7c59nJ2RlpWwvSGF75jk2XtxPkJULXg5u9a65wtySgYHdaCu341ROEoXa2qvVZ5UXMSGkd6OkgJKKUlad3snj2+exNvOcXspufN5VRvpEYG9lY/z8rV1YeGmvIV2kvSI2bL5yTXyFSQCiiA2Lw0C07kS39vynARtbBOYf/JcNOTeLOVtLpHwz4EmcDcjI2cX5ZJXk4WBla/RCW8rN6eYRyubEQxRq1bdMVGC0bwQd3I1vWplZlMsnO3/j1ZMrSVeXco+dN3P7PMajkSPxtHdpdeVRa+OsLjaO9A+MYJhrKPn5GewvyWB58hFyM1Po4BqAjUXdBcKlEgnt3P0ZFxJDOzN7xHIlp8rzEah03ApV1rR8nZZxXl3rTemtdshqVBy4cpInNn/NomtHKaklVKhC1GFRVl7Zi9HIdXe2tqc8N4ujhdcNcZES5Zr4PU3WQaosVyeAalXL1IhsHvxyg9jehcyrDF37QbU4qtdDBvJCn0kGFbRPty/m56v7eSFkIBPChuDYABk0PuU847d8SZFOg4fMkh/6PkEPf+N6jOhEkf1XTjB97y8kq5W4ySx4q8soYjv1q7fgW2snlVbNpnP7mXVsOanqUjxllnzSczIDQrobzQk1Oi1F5SVczUtHWVqCTqfD3MISN9vKsBxjxFitqOP09Ut8cehvNuQnGaUMmwkSNgx7tUGloi5kXqXXmtmGms9cA0Kz4haWNYmDKGLDYoGpNa9PcuvAo5EjjRZXNDots3f+wolbZEJfuRWf3PMkVgZY8pm0RKYeXkKZqGNXTiLrL+6lu3Og0Uqmh50zAXI7svIzWDD0BTp7hRgFjlJVOT/sX85zx/4iX6diglt75g2eRi//zq3aSWYsSSVS2rr6cV9AD9QFeewqvMaKa8fRFeQT5tUWMyMOAIkgwVJugYetM75Onvg5e9HG3g0HS5t6pQkRSMpJ5ZNdi3k5fgWXqziRIQoys0YuCDeqRmoRycvLYHjbKKOlFieFHUVZ14nXL9tkByQp18THNxogVZmCP9S0XInA+z0mNqis5IErCcw6ve6GZKkDPokYT7h3O4Ngenv7gmpVMTzlCp6KiG2QXT/IxZuRwb2MbsucWZzLSxu/4+fUY9hKZHwRPp7nYh5okIh3p5C1uRV9A8PpYO7IvvRzbM9L4lzyGbp5hmLXTMaGaVKvUgAAIABJREFUzOJcfj64kmcPLuJIUe11xpykcl4NHcKcAY/T0caTf1KO3wDRpbI8oux98TFy7wmCgKOlDYsu7zMUh+etiA1bUFcllPpg2BGIrnmxr60X3f2Mr9WlVJXxweG/qjnybCQy2rkHGAw43HPpGKtu0VN0iLwSPrrBH04iSOqVr29lxZNWfci6vES6WjqyctgrjAsbVK2gwn8bySRSRnTsw6rhr9PL2o0thdcYv+ZDEq5fbGT2fi0WwIpS/jiyjiH/vMOHl7ZVqyNcU4R6xqcHm0a9y9PRY3FU2NE3OILB9j7VDucPDy+jVG18CazOXiGMc2ln6FZXoGejOYgiNuxDQC/f8v2IcXXWaKpJa07tYn5y9a6valHH8sv7sSxTE+jc5kZ2X3FFKVO3ziVTc1M0HOEQyHMxDzRbQ50jyacZv/lLrqmVxDoHM+/eF/FrJQ1mbgc5KewYGtCNwpx0dhWmsCrpMOG2Xng7ujcpZOX/9Z3p239kUerxWhXw/6cl/Z7i4cgR1czlMokUP2tXFiXuv8EB0tRKOlk40dbNz8iDUsBGas7fyUcN6eCOyjXxfzUYIK7zpzgA31OjSomb3JK3+zyEuZHxODnKQh7fMc/g4qhEHTuyL7Hl0gFcpVb4OHqwOmE7i26pC6VBZG6/J2qtS9tU2psYzwPbv6NEp+E5vyjevecJ7FtxclBzkaXcnN7+YZgpS9mem8iK5CO0s3Ai2MWnwWPpRJGDVxN4Z/sCPr28kyxNmVEwC1O4EeGtb/Rxs3EiKyOZU7c4lk9kJXJ/cJRB/dUQudk6se7CXvI0FYbErIW15YtI6+AekzDQCerN9vfS06+T0YtlZWZBP/d2qArzOK00XIklV1PBytQTnEs+w28pR6m4JR9iqm8vxjeyEqNR4Ng5D7Wo4+22g5nWZ4JReer/rSSXyuju0wEXtcCWrAusTjlB+waARETkYmYyH+/6jVcTVnGlvLBWYPiYKYix9+FS2c1U2X25V7jft5ueKC0RBAIcPJl/YdcNnaBQp8Ybc8LahBo9N2uNwIb0M3qSHZCuXBN/wGiAVIW0fw+0qa6wCMzqNaFBLv9Ke7QD9wR3J9rel8vZSaSrSw3amxPLC6qBw0wiZe7Ap5tFaTyafIbR279BK4q8HTqEp6LHIpfK+F8niSChq1db3HQyNmWeY1XKCYPlUQ1RfmkxfVa+w7GitFoT06wlMj7ofB/v959CP79wlp7fdaMgoFYUMS8ro4+/vq/D0coWs5IS9ubdrIq/PfsSkwJ7Ga1n2lvasODsdgxo5G0UsWE/GVLWpbVwjyAq+5dXux/rHMKjEcMbvfA+jh6MbhtDqNyeg5kXKBPrDs0fYu/H8LbRRrNRY+ls+hVGbf4ClairBEfU2FbVMLSlSRAEOnsG46DSsT37IsuTjzLYNbReE7ul3BxXrYRNGecMmndfD+7Pp/3j6B0YhoXcHGtzS5y0UjZmnL1poMlPYYRHR9xsHPXeyd/Rk7/O76Zc1DLEwY8vox8lxM3PaOnC1kJBXlYqx/UtaE7Av8o18ZnGAuQJYEjN6++E39+owsM1WV079wDGBUXhpIYduVdqNaVdKi9g/cV9eMls8HZ0N4kfIq0wm6c2fUOqWsnzflFM6z3hLueoBSRdvdoiL1ayNy+JbcnxDPPpWq9+5uPoyY5LB8m6pXSQuUTGlntfY2THftjVOO19HDzYfvkQ2VXPywQBZUEOQ0N66fnYrM2t8JRYMcG/O89FT8DH0b3BorelIOevq4cNWXMLlWvit9YLkCrfx09UVsy+CRpBylvRE012mivMLSsrgXt1QVWUz4mSTINsuUCrYmXqCU4mJeBn7YK7XeM7RpWoynh98/fsKkplglsH3hj4WJNK92g0Og4dSsTS0gwrq9aVRFRUVM6hQ4l4eDgglTYuVkwiCER4tyM/K5U9hSlcTb/CwICIOhOmLGRmeMisq7VvqBC1xHp1xs9Ab3YLuRnuMkW150+XZhNl542vgefbufsT6OLd6Pg3OysblpzZZkh68VXEhs1VronX1gkQRWxYWyoLMlS796RfL4aFRpn8Qzpb23NPcHdi7H25nnONa6oSg9Lr1Yoi/rpykNzs6wQ6eDbYeSeKIt/vW8bPqcfoZuXC50OexcGqadaqb7/dxYQJe3F0LCMqKqBVxWYtXryfsWP3odHkMXBgSKPHkVYFgJ5JPsO2whTEwkJi/LvWGUHh5eDGmaunuVLVflqCQFpuKiPbRhnk1r6OnpxMSiCpqh+hBoFwhRthbUJNvqbmMjN0JSXsrtFeArAB1ijXxKfVB5BHgGE1r78ePsrkSUe3nlQ+jh6MDIkmSGrN8exEg/WtRCC+KJ1lF/dgUa7Gz9HTaI62/eJhXohfjqVEyqJBz5vEz+HsbMXy5edYvz6HsWN9cHZuHebh5ORcHnpoO6IIX33VDze3pkUCWMrN6eoayIrLB9iZn0xHC6c6i1rIJFLaWDmx9MrBG9euqUpoZ+ZAOwPNe6QSCV5WjvyWdJCH3Dvzfb8nGBza06RNWKuJ+YKUJYn7DdmJMpVr4nfUlL1qkl7Oh4NEToiRTpmmkJWZBePDh7D1/tm8GtQfalmgIp2Gt86sY+Q/b3Mgqf5S+plFubx+6A8kwDeRk2jvEdDkdy0tVXH0aDJlZSLl5SKffrobtVrb4uDQanXMm7ePtLTKd7l4MZPycnWTxw1y8eHbng8jQ2DG4T9Jya+710o33w5MvqWHuwB8nrCGvFLDeUo9/DqxfeirfHbvNELd/ZuVGwe7+eJhuBf7+Dp1kKo6u3OgevDj/R6dGN2h7237yApzS3r6dmJ0mzCK87M4rcwxKHYpdWri2t9TZzqpVqflgx2/srPgGhPcO/Js1Lgm5W9oNDoOHkzk2WfX8vHHiZSVVQZlxMcrGTDAAT8/5xYFyPHjycTFHUanA5UKli1L4eTJi3Ts6Iizsw0SSeM3np+TF8U5GewpuEZBbgaDgmqPABYEAR87d5Zc2sP/Hxt52go8dDIiDMTfCYKAu63zbclzN5fJyc3N4lCBXotsW0Vs2DLlmvjc2jhITwz09xgW0L1FrChBrj58NeJFVg6YRk+Fm1580IuB/Qyy7Ftp35UTzL9+HDeZOTOiJzXaYiWKkJiYxYsv/kt09Ho2btSv//vmm3spKiprMXCUlamZM2c3anX1lVq7toguXVby2murSU7OaYI+ImFa9Hj8zRQszTrLtguH6nw+1M2PFwL7Vbv2+fnNpBZk0tLUz89g7TYzIKYuEUuvRZGFICH0NohXdcmz0QFdWXL/W8yLnIhXVUtgN6k5k8KH1W21qijl/UNLkQJzIh5oUObjrZSbq+Tbb7fTrt1ffPfd9drBuK+UlStPtNhabdt2lpUrC2q9/9ln1+jYcSk//bSLwsLGAdnF2oE5PR5EArx3dFm9fT4mhA3GWXrT6pWvVbPwyJpGNzMyFQW5eGMnMRiIOrRWEUsRGzaXGmm1na2ceCIytsVLvJhJ5bR3D2BMYE+sVRpG+XWju2/dEcV/n9jCotTjDLBrw0sxE5E1kHuUl6tZteokTzyxkV9+SUdnREXQw4czGTcuCDs7y9u6Pjk5JUyatJ6cnLr1IJVKZO3aTPbtO4eLiwx/f5cGm4G9HdxJTL3AgeIMHNXQ3af2SjS2FgrstAKbb3Eeni1O5z6fiBZNI1CYW7Hv8lGuVugB3EMRG/bl/3vVJbfoH8GAXjzBaL/urSpRyMXGkZf6TmZU57pb0WWX5PPp6XUIwOu9JjUoxkqnEzl8+AqTJy9l7Ni9HD9eYfS/TUvTMn/+/tu+LkuWHOHcOZXRz+/ZU8bIkbt49NGlHD9+FVE0/kSXS2VM7/kAUkFg7qUdpBVm1/n8yA59aWtuiwQY5RzC2mGvGvRx3FYRHhgdYDDS3Q7opMdBFLFhQ2pq8SLwQud7Gy2aNCfVx9GWHN/I6oyzjHdrz8MR9xrNAa9ezeHTT7fxyCOHOXeucW23Dx7MZ/hwdzw8bk9F9IsXMxg/fifqRhirTp0q46efLiCT5REU5IyNjXGcz1FhhzI3i935ySgqVMT4197qwkJuRoDClUkBvYjrMQo3W6dW4TPSiSKLLu+taQCSAMeVa+KP1dRB9DRxhUTapFI8LUU5Jfl8e24LWuCpiPuMirMqKCjlp59207Hjn3z44dUm/b5KBV98sZeKCk3zf2SdyNy5+1AqmybTv/XWZUJD/+D33w9QXFxu1AH1cPi9yAUJvyYd4HpB3T0z+waF0yugS6uSRrzsXXGVGowK6GlISdfLHGxv4YCDwu6OA8jOy0fJ1FbwoFtHQuuxclVUaNi4MYH+/X/nySdPNHmj/T/98UcuO3acbfa57tt3iW+/vW6SsYqLdTz00BH691/Mvn2X0OnqXgtfR08e8QojT6dm4/n9d9w+cbSypZPCYJ5Rv2oAcZ0/xZrK9MNq1MM15EZB5TuFlKpyvkhYixqRyZ0H1co9RFHk2LFkpkxZxrBhOzlxotzk7/LaawfJzVU221yLiyt47719iCY2CB07Vk5MzAZefXUlFy9m1sFFBCZ3HUq5KDL3/NZaOw63VhIEgRhPg1V52rjOn+J6Kwdpj4Gwk56e7e64U+H09YskqkoYaONFlzZtDT6TkpLH7Nkb6NVrFUuW5DTbu5w8Wc7y5ceabfz16xPYutW0m7JzZzO2bh3Eo4+68tlnKYSHL+O773aSk2O4QVOwqy9jnAK5rikjPuXcHbdfOrkFGjI4y4AutwKkQw1xCw0iXq1QOa+P/jm/G4BxIb31Ci4UFpaxePEBunVbwjvvXG6UUttQeuaZk1y5km3ycTMyCpk27bDJx3333R4MHNiOn34ax4YNA4iIsGTatAR69/6d9esTKC2tvmgyiZSxbfsgAn+c3d7i/o2Gkq+jp14VxyojV+itAAnWs3VJ5HjYOt9Rk80oyuWf9AQEQaDvLdXAVSotO3acY9iw33nkkSNkZt6+Fmc6nciPP+5HqzXdxhFFkcWLD5GdbdrYr9Gj7RkypNK3JJdLGTq0I6tWPciCBeGkpmoYPnwnDz9caRa+VT+JDuiKtVTGltxEUvIy7qg942Bli4/cYEuKkFsBoidLhVrYY2VueUdN9mz6ZUp0Wia5dcTF2gFRFDlz5jpPPLGMgQO3cOBAy4SBfPJJMgcPJppOjDx9nVdfPW/y93z99d5YWlbnuvb2lkyZEsPZs5N47TU//vknn6ioNbz66iqSkytDluwsrHnIM5xyUdfq+xnWJIW5JaEWBmP5Ot4KED2XdIC1S6vuJGSINidVyvsD/cLJzChmzpxN9Oy5gkWLsutUZNsGavHx1GJtJWKjaB4R4bPP9pskqlat1vLdd6a3GM2Y4Ut4eO0h7N7ejsyZM5KjR+8jNtaBzz67RnT0Un76aQ8FBWX08w9HBFZcvrOsWTKJlAB7g/n2nQAkVbV3/WreDXK4s/wfheVK/kk7ibpCysFt+fTrt4S33rpISUn9G95aoWHjsq1sWLofT/fmEb9WrixgzZqTTR5n+/bz/PSTacUYNzcpU6fG1BtyIpEIRET4snjxA6xa1RcPDxlPPhnP8OF/cPFoKYJWxtbcRDKL8+6ovdPB0eDB4OA6f4qLBPDHQF5Ie0efO2qSSZkp5Jx3oHBuKO+/kMzFi/qntYWZyMvPZNI/uoJJoyutMgorHbNmXCbY/wR+3in4+dwM1/hqdhJjRyp56hHTfPB33z1aqzXIGCouLmfOnAPNoJh3wtvb+MY6FhZyYmO7sGnTZL77rjNJSRU89eBJLP/oiCLDg+SctDtq73jbuRkyLQiAn4TKurvVvO1aROys7wwHoSiKXLqUyZfvH6fgU09052r323h7icRNPsGyn3/jUlKl+KgslTDyoQ5s3jmQ598cQUVFpbU72F9Hr8g0lnz/FbbWpuEqZ86o+PXXAw2Ke7qV/vzzCHv2lJp0/aKiLJkwoRuNifxwdFTw7LP92LfvAV580ZuUfSIX3nRh6Y/nSb2agckdNM1E9tZ2aAxbsnwkgGdNgKhFWn1PbICsrGK++mobISHLWPxz/f6MIQPy0OpkFBa5M3Jw9dIvsz7tyop11uzcXwmc0KBSklNtuXY9gvZtSxAE03zsN944z4ULDc+HuHYtj9mzE0y+hm++2bPJkccBAS588sl9HDw4gkFDbPjy4zS6+f/Frz9toyivqNXvIw9rJ8oNg9lTqogNG0SNPJByAd6KGNVqqwxWVGj49994pkzZyO+/Gy+PH463wkZhw4I/2vHzH9VN2GkZ1aXMi1fMuJjoREaWGzM/cAcELMxENFqBpsTZabWg0eQxZEio0WHmWq3IZ59tY90608r2//mPK88/36/RVU9q6ideXg4MDVcQOG81+3Fi8dpcDu08jbuLFr9AdyTS1tkVVytqWXxmGxpRT1I4LlXEht1HjTgsb7kVcZ2HGNUr4naSTidy4EAi06evZ/bsS/X6AWJ6VJCSJsPaSkSlrtzVew8rSLxqXPhMZraEw/EWN/jtb/POEt2tgkBfDUdONL6d87FjJQwY4Gh0em5CwjUmTz5o8vX85ZfBeHmZMOJYFCma+y0Bu+YTSyauOPL3dQW//pVG6tmzBAbZ4urh2OoAotHpWH1+j6G6vaclgN4KucosW12lwcuXs5g5cw3R0evrzJq7lYbfk83eNQf59sOm+wymTCompsdFpj3+Kxpt0w+O997ba1TUbHm5mvfe223y9Zw9O5guXdqYdMzSkydRvfcRIODMeeL4njVs4VEK+fUfJZ0i1vHxOytIv5bVqvaWXCrDU26wvK2jhMp6QNXIWW7VasKS8/KU/Pjjbjp0+IuPP75q9L+L7l5Gn14XiOq2npCAIjxcm6ZoX0mWcjQ+hN0HRuLbRkVT0xl27FDy77/1p+du23aOf//NN+maurhI+c9/epo0J0NUayj4/Evg1mohEoLZy9t8zV8coycqXnsvlYh2f7Js8S5KipStBiAuZgYlAgepIjbsQWp40nvaeDC8fe8WfemyMjWbN5/hgQfWsWjRdbQNjKq4ni7n5Ok2+HnbM21mF4qKpZSWNX5DXE2Ro9FY8+VPXqzepDDJHE+dymTMmCBsbQ0rybm5JTz66DoyMkwbUjJ/fneio4NMOmbRunWUzfwAQ20vJehowwWGc4F2OLBLbc+vK7M4vCGBgBALPDwdkcpa7kAWgJ2JxzhZomc8UUoAPd4ia0EPuihWlq6ZPHkpI0fu5MIFVaPG0eng6Ekzpr3WldPnzcnJa7qC+M86KzKzTadoJiZq+OWXA7VaQ5cuPcqJEyqTru+AAdaMHNnFtEpufj7FH35CfT1hrchiJL+xmr95lQy2ndTQ956dTH/yT86eSKQlSW54z5tLDM3KXNYy1qvk5FzeemsNUVGrWbEi3yRm9ItJps1neenpPLzctUy+v8Qk4334YSKnT6fov/fFTGbNOm3Sd5dI4O23o7GxsTDpiVawdBm6g6eM/ifunOVpfmQzOxgrFvHdogKieq7j89n/kp3RMl54O8MtFBwkgAE03H4Hz6FDScTE/MmcOUlUVDT19wWW/niKt6ZnM2lMoUnf8957kjiz90esFaaJlS8rE5k9ezcq1c30XK1Wx9y5+8jJMW3YyxNPeBATE2zSMVXJyShfmdWIL6SlLTv5iO9ZRDwdK1S8/HYKvaP/4NDOU7d9/8klhg9SgwCxt7j9NWY7dfKiUyfTNMq5f7iSqG4XeG3aH5SVmc5U/XxcDs6OhWg1Vgzqdx0bK9McJMuX57Jjx/lbDosrzJuXatL1VSgEnn8+xiQ+jxvHqFZL/jffQUnjo6SlKOnHv7zDDqSAtAL8QzxoLWQQNi1hwbKyMmPmzGg2bNjQ5LHUai0JZwOwsfamT68C/t1gZZJ3/Hq+M4VFkdjZduHr+U6m22givPLKPrp188fcXM6sWXvQmLjew/vvdyA01LQbr/TYMSq+/In6myXXM38krCcMLfDeJ11x9Ww1eUiWrSrhvFevQF56yYfPP7/WpHFWb7ZBJJT0TDOOnjTtFH/9y3TFzsaPd2LGjGh++OEQCxZk8s8/8Tg4WLBlSzEjRtgRF9eF998/xJEjFU36nbZt5UycGGnSddCVllHw/odNBgfAaQbwFa4Mj5Fz732RrWlLGp6dSqtukZeRSiU8+WQv5PKm2+fXbLYyKThcnSvFKVO4DiIizFm3rj+LFo0nMtKPqVN7ATB1ajzTp1em0b76ahSxsV3ZuHEy33/fBXf3xm/EDz7o2eQWCDWpeNMmtGu2NZ3bY838qk7jM2dHY6loVUl6ZRJAT4AsqihtsTcKDnbjq686mWSsRx/IZ+TgMqZOyW3yWFHdiljzWwK/zT2Dg23jdA93dwnz5nVl8+bJ3HtvJywsKvWjLl18mDOnLSqVSEqKhpdf9iEqqtJP4eio4Kmn+nLgwASmT/dG2kDpd/hwO4YO7WDSb6TJzqFo5tsm4R67uZdVWPPKM870jOlAayMJoG5tLzVhQjdCQprmi5FIIMBXxdKffqJfdNMSjMzkMGZ4OiMG/0OX9ulYNNBKKpfD9One7N8/gaef7oOjY3WToiBAnz4363cNHBio16bAz8+Zzz4bxYEDIxgzxvj4qVmz+pi8PVz+r78inr/W5HEK8OUr2mIth8efjkLSgs7CCsNSkygB9Ny05eryFgWIo6OCL77o1aQxOrZV4e+bh0plg7VCQ0TnxjvczM10LFvlxZH4KHbu70J4Z+M57H332bN37wg+/XQU/v6GlU+NRsfvv9/MNly48ITBqoyCINCtWwC//z6R9ev74uVV94Z68UVvunb1Nem3KT97jrIPvmy6YQKB9QwmATkfzwkguKNfi+65YsNSU54M0Luj0qhoaRowoD1jxiSwYkXj4pASzpnx0LOhfDbLhpdntblxUltaiJSVCwhAXYUDBW56g4qVEtZusUEm7cvKjcaxj6AgMz77rAf33NMBhaLuE3z79vP8+GM6bdua4elpxt9/5zNhwknGjIkwbFqxlDNsWBdOnAjgt98OM3PmGcrLa4pzUp57rjcymQnNuhoNBXPnQUHTY6hS6cYbeNGuDUz8T+8W328qjUFDSLlBHSRHXYpaq2nRF7a0lDNzZm/MzZuiFQs3wAHQNkDH+j8PsGJhAu1C6j4E7htWxJsv5vDOyzfLehoDDrkcvv66E/v3P8h994XVC46ionI++qgyjfaLL3rx7rsxCALMnHmE7Oy6vfXOzja8+OJA4uPH8dJL1SNzp00LMnm3K+X+A6i+/73J42ix4Fei0CHhi+964ODcssl5IiJKlUFfTrYE0PsKWWolap2mxVEdFubLjBn+JhnLRiEy88Ukeobvo0fkeZxuqfTy1MM5eLhqmTD65lL0jFAy+7WviOlhfGj2iy+24dSp8Tz3XH9cXIxztq5YcYwdO5SMH+/EgAHtiYoK4tlnPblwQcXixQeNSs8NDfXgk09Gs3v3UAYPrvzdjz++xIIFeykoMI3BRVtcTMHMt0ySRhtPP37GkYn3WtJvUJcW32dqrYZstcF1ypUAesEvmZoytDpdi7+4RCLw+OO9aNOm6WJCSanAGx8EcOh4DF//2Bsvj5ss9eEHEjm29VcszCrn3CFEg5ODmszs9ihLZfTuUbenePBgG3btGsKnn46mbVvjOwFfv57Pa6+dwNxc4JVXorGwkCOVSpg6NQZbW4GXXz7HpUtZRq9V794hrFz5IP/+G0NgoJzHHz9Ov36/sWXLmSZXmi9auw7dvqZ3zyrHmR8Iw1KAV2b1xcLKolUAJE1lkFvnSxWxYWHA4FuvZmhVvNhhMJZmLf/y9vZW2NurWb06vcljFRULXLnqxJIVjpw+Xxlh83xcNr0ir+LkqEajtmXlBkeycqWs2WyHVOLBtJn+XLtuOFwlIEDGvHndmTVrMEFBbg1qkKnTVabRbtiQx+uvBzBxYrcb+RnOztaYm5eweXMWGk0eQ4e2M3psuVxKaKgH48a1w89Pyx9/pLNo0RWuXEkiKMgeNzfbBueBqNPSyI0dD2VN1U1FNjCa7/Bg5gx3Jjwc0yr6hJSrKvjw5Fq0+txxk1QRGxYMjKp558GAXji1ktYHgYEu7NhxjuvXmy72JadW3+yHjiuwtHBm4/Yg3v3MC6325gfbd7j2EJWPPgrl66+H0atXIHJ5w82TCQmpTJp0AC8vKfPmDcPe3qrGnJ1Zt+4sGzcWMnCgI35+DQttsbQ0IzLSjwcfDEAqLeKnn9JZtOgCWm0OgYHODSrUkPfNt2jW7Wjy2ufSllfog42nlG/nDcPO0bZV7K/8smI+OrURc32wLpMAKdQI35UL1NrPuiXI1taSDz6Iabbxv/3Zjh8XO9zIW6+L4uLcOXNmLDNmDMLDo3EHSEWFho8+2gXA7Nlh+Pjob35XV1vmzOlRBca9lJQ0PNxEEP6/4kgs+/cPZ8gQW2bNSqRPnz9ZuHC/USm/pfEnKHvzExMowrCcgVxAxluvBuEd0HoCEtOLc7A0zMnSDQJEgkB+cT6tiWJiQnjkEZfmkUE19eue99yjYOvWQcydez/t23s2qd/41q1nWbo0j+hoS8aMCav1uSFDOjBypB0bN5awalV8o39PKpXQq1cgf/45iWXLonFwkPLYY0cZPvx3du48j1ptOGNRVKko/PIrk6xxEjF8gzu9u0oZ+1BMq9pbhcoipPppUSKQLAGSMeAsPJuf0qomYWYm5eWX+2BhcXtlVj8/Gb/8EsmKFQ8ycGC7RolT1cSMXCWzZlVWKHnvvZg6RR0rKzPeeqsPMhm891486ekFTfptCws548ZFsGnTg3zxRXtOnCinf//NPPPMcs6dS9OzmBVv2476t3+bvIYarPiJnpQg8O6HvbB1sGlVe+tqfrqhXEgRuCrJiluoAq7UvJuYd53WRu3bezJzZtBt+S0LC4E33wxg796JPPpolMmy8JYsOcLRo+U8/LALMTEMS4WxAAAgAElEQVQh9T4fHu7H88/7cPGimvnzD5gky9LFxYYXXhjIsWPjeOIJDxYsyCQy8h8++mgzmZmVhd60BYUUvTeH+tJojaHj3MNSbHlsgg0xAzq3un11Ns8gM8jNilt4I1FbL7czUZlNmbqiVU2k0uwbRXBw89brGj/eiUOHRvHuu8Px8nIw2bhXrmTzwQensbAQePXVvpiZ1c+NpFKBadN64+Ii4ZNPLnPqlGkSqQRBIDjYjblz72fXrqH06GHFzJkXiI7+gyVLDnH9lyUNSqOtjYrx4mM6ASIvv9YXuVnraumn0WlJKjRoIT1ZqW5Ugajm3fMVhZSpylsd2j087Hj33fBmGTs83JxNmwayePEDdO7s3SQ9oyZptSJz5+4lI0PHm28GNyh5ydfXidmzO6NUinzyyW6Tds+VyST07h3CqlUP8uefPdFqRR588BAPTy/iICPQ0ZT6BCJbGcBRzPnobR/advJvdfuppKKUM+UG8+DP3AoQva4nSp2G1MIsWiPFxoZx332mM0E7OkpYsCCCrVsfYvDgDpibm/6UO3Ysia+/TiEkRM6UKb0aDL4HHogkKsqSP/7IYe/eiyZ/PxsbCyZM6M6+fZN4/402HDGz5AG68y7PcpVeiI0IbU8nnDkE0s4JHnmyD4JEQERk49l9JOelt4p2bbklhaRrDDKCi7cC5BxQzXUuRSA1L73VgOJS9rUbiVwKhRkvvNCzyWNKpfD66/4cPfoAU6ZE4+Bg1SzvrlSqeOed3Wi1MGtWRKPMw/b2Vrz+euWcZ8wwXQhJTfL0tOeN2aM5uH8YUybYsAh7+jKMX3icXBpS8EHkL6LIRsI7X3bBzbPSlJ1RlMtzh34jcsWbzN6ygBOpF9C1YBX4a3lpyA1bsM7eCpAzgJ6b9ED6+RYHxvnMJGZv+Zkeq2Zx6OpNValPnxCee67xpTPHjnVk374RfPDBSPz9XZp1Dps2nWbjxiJGjrQlNrZro8cZPLgdDz3kQnx8Of/8E998LywIdIoI5vuFD7J1U28i28C7tGE8E9nEJMqpPx/lDAP5Fjfuu8ecEbek0a47u4dCrRoJMDf5AA9u/ZrC8pIW21/xmZcNmSE0wKkbAMmKW1gG6K340axLLZZ+ey4jife2zKf/mvf5LvkAcgTmHl9FhUZ9Q2GfOjW6weOGhJixenUfFi9+gB49App9HpmZRbz4YqVZ95VXov+vvfMOi+ra2vjvDDP03jtSlCYq9oYtGhNNTDFG0xMNadf0Xm+6Keamm0QT0mOKMVHsXbErooIiAtKkDXWAgRmmnO8PiDLMgDO0mHyu5/G5uWeGM+fsvd+91nr3KheM7u1MrK2lPP74+NZ7HTnXI7C3xNrOmimXx7M57Q6SPo6kACvuIYoHuY8jXIG+A7NLgy1JDEcLPPr4cBycWxLEFE0NfHV6h8F3n4y5Aje7v4f21Ysi+0pNtq7OkycmVbXVIAApRruAqpaqhto+fehT5Xm8vGkpU9e8wacF+w3svi2KIg4VnNciERE+fPTRQDMZMPj44zj27r2Nq68eYtSssrfk++8PUlio5ZFHAhkzJrzb94uLC+SVVyKorhZZtmxvl5vxWGTeebpw18Lp5GTP4aUnfNiEPbMZy1s8SAGj2lvn7OVqVuDIo/e4kXD5+YPQ7dmHyG0TFOgksWLqgFF/m/aoVio43miyRfe5uJq2ADHqeK8S9Zyp6pvzkKzyfF7a+AXT1rzBZ4UHTHX8wQr4KPXPc1pEEGDevJFER3e+Kz/xeBCnT89j4cLJeHg49NkEZGQU88ILmYDAAw+M67E+HAsWjMXfX8qiRXkcPJjXZ+8THOHPy+/cyMFdU7hltiNf4MFMZvATiSho0cYKQniTKEDkP49OQiJpeWeVRs3SjA0G5szd/cYS6Opj9DtqrYaapvpef5+imjJqTFtIh0wB5DDt8tMFILW49/wQEZHT5QU8v+Ezpq15gy+KDtJ8gR1xR91ZMorPk25eXo4sWtTBLjRQg+OTJVx/fzjh4d59ujtptXo++2wvarXIxx8PJCLCp8fuHRDgyttvx6PXw3vv7aWpqe/MYEEQGJEwkMcXjyX83hJk3jqeJYQ53Mp2bmAV0zmFjCWL+xMeFXTu744UZXK48XwXMGtBwvWxk03+xoG840z55Vm+PZhMcW3vMakny3I78j+MASJPTDoDGJ1CJRcc7vHsQr0oki0v5LkNnzF1zet8efYwatF0/om+nQIXgA8PrzR4punT45g9+/yBXkyMjJ9/HssPSwdiN6CCtw79TFMf59mnpGSxZEkpsbHWzJ07gp6O6r722qFMnerIb79Vs3FjRp++m1qr4d3Dv1I3vII3vgvk43fCqMCKOxnESwQS4wU33nKeZdTotXyWlmywGK/xiiLC27hRrEav5eOjqynRNvHU8T+ZsvJFvktd1yv+x+9nTDZErW4lrYw0CMAaI59AraBUUdEjD6XT68iWF/L8hiVMSX6NpLOpnQJjlKMP349bwKopDxoM7qaaPI6dzTr3/21tpTz11Djs7ATefTeK7dtvZe7c4Vw7bAJjHH3Y31DO6vSdfbaAVCotr7zSMvhvvDEKLy/HHv8NR0cbnnuupbDFs88eRKFo6rP323RqH5trCxhk58ZNE2bwnydmcijzeh6/xx0RkXeXjsLD93wnqayyPLbUFBhscvPjZyAxsWucKM5ht+K8WV+p1zLYJ6KDRa6nWtm1qPOyukqOKU2u603yxKRzsYntT8S2AA+2vdAs6jlZdoZgd79uASOrPJ8vDq/i5/ITnSMbGO3gzcIhs5gYMQxbmTUanZbpbqFsqMlrNc3g8yPJLAuJQWiFzvDhoaSnzyMszPNcEo6DtR3Pj76ZmVve57/H/mBUSBz9PPx7fQFZW1vx6afT+emno1xxRVyv/c6ECZG89lohM2ZE4ejYNxX5SxQVvHD4F3TAiyPn4WLXAv6wqCDe/mQet92TT1R0UBszGr49ugF9G58ywTmAWL8Ikyb3d8c3Gnx3pmsIMX6m2cZTZXncuvF97gofz6zYiQS5+ZoEnSnJqSikwXRa+SYDn6/dhwcxUeVkTe6BLgPjREkOj6/7iAlr37wgODykNvw0PpHfbniZ6dFjsJW1ON8yKykPDLvGwNTaVnOG4toKA+c1PNzLKENteEgMD/cbS41Owzu7f0DVBxVbJBKB2NgAXn99Zq+cyp8jLawkPP/8dIYODenRotQdiUan5cM9P1OmVZEYMJRx4Yah+lYyKYOHRWBjfx6s+ZXF/FZq2J03wS/G5P2z5YX8WpbeZrMUuWvQlcisTI/hqswUirVNvJ61mYQ//ssHu35CJ5qXKr41L9Wk9diezTUYVXliUlmrs24gmyuykDdUWwAMPenF2Tyx7mPGr3uT5WUZmBMkLogwODDSZHfdGL9wIqzP8+VKvY6Cqgs3rJcIEh4YcwPRtq78XpHF70e39FmAQ19kk/Zlxuq6E7v5tuQoIdYOPDJunllFztdkptDUbtG+mrWJW39/leSMXdSpzpcQWpu5G00bkmakgzejQ01H/xZWl/FJ3p42jKuOCPcArIQLbxS1TQ2sPHvUNEYTk/I70yAAvxrdUK8lq9Q8OlHZrOLJdR+RsH4RP5WlY91BuLQADHHwxM3qPEVbqVOzMXOvye9LJVY4WxmeXVQ3mJfU5e7gwlvj7gDg6WN/kFaUySWxTE6U5vLQ4Z/QA4tG3YKP84VTgMvrq/ko2zhV1wqBXfUlLNj/LVeteJFvD6wmrTiL93N2GJhmd0Vdhl0Hrci3ZR80aNscbu3IpP4jzHqX0+X5yHUmI9V/NtpgO7DBjOyQtbnmtSG2k1kjlVhh0wkwJjgH8Pvkhaye8xqPDJhi8PlrGcmUKiqN/i6/sph0lSEg9Hrze/eN6hfH67Ez0Yh6HtqxtFfpw3+byOureXr7MlR6Hc/1n8KUASPN+rsapYJ+th3HnQlAlkrBU+mrmLzubQPCJkhmz9Qo0/F21Y11LDpp2Cbj/sipONuad8a1M++IScPHFEllCiA5QFb7i78UH6Ws/sKhDRJBwi2Dp6NpZ8gIwCSXQFZMXsgPs19kXHg8NlJrrht0mYFmUOg0vL7zGyoaahAR0Yt6jhWfZuG2z4yqTtjamF94QBAEbhtxFbf4xpGtruPFbcuobWq4tPrNsAhe3Z7EocYKrvHoz91jrje7EkmUbyir57zGH5MXMtMjAkknyVftCyZc7hONk43p4NGdpw9Rq2s2sC6mx5gXdlTTVMeyNqZZ2z24Lb17Xtu1H5DkNBxmxdsAVxg4aIiMdw0m3Cvogg/h7eRGZVkhx1u7hk5xCebdMbfy4Ng5hHoEGNiuxTVlfJK1wwCpJ5WV/JS5g4LSPD4/to7XM9ZToTWkMaWCwCPxV+PhYH4hZ6nEiqH+kRzLP85WRRFN1XLGhQ65aFpeX2zSrNOweMf3fFOSxmA7Dz6YvtDiSjcyKylB7n5cFTWOy32icNToSFMUX9APTK0r5UR+Oi4SW3xdvM456k0aNQ/vWGqwHp6MmMzUASPPMZqdycG8dH7IP2jqo0/liUlbLwgQAIdZ8aXAfe1p4IaGGq6LnnDBHUQQBHzs3SitLOKd0bewcOwcwjwDsGq3EDU6LS9t+4rTjcaaSSXqOF5fRpG63uRrX+cVxS3x05EIlrE3DtZ2jPCNZH3uQXbVFiIoFIwIGXgJJCaIls/3rGDxmZ3YS6T8OP1RQj0Dus7sCQK+zp5MCh/GdcHDCBFs2Vedh7aDyAkByFXV8nthKmtOpeAmyvB28uBgQQaf5e4+tybUosjihDvM3ig/2PcLGQ1G5rUWWKhMTqsw9RymtcCy+buAhPb22Larnifa17woWI1e22FzRIBtpw9y467PTVWU6FSCZA6svPrZbp3NZJTkMGvDuyj1Wh4NHc+jE2/FRiq7hAxa6PnP9/7Oq6c2IhEE1kx7jGHBMT3+O5XKWnZkHeSTzI1kNl04KNbFSoa71JY89fk4rQWBw3hj+v1mmX0F1aWMXfmiqTi/VGCkPDFJb5YGadUiTcANba+JQJiVI8PNHKzOKDeFqoGHtyxB3iabSwAcrWQ0d8JlD7X3JGn6I4R6BnZrcryd3Jno2Z9V+YfYWZ0PilqGBkZ3yLn/fxG1VsOSPb/yetZmpIKEXyf9p0Oqtbtib21LjF84N0RNYLijHw311WSrajv0VdSi3sD3EIHXRt1EgKt5cXZrMnayodwkg/mGPDHJpN3VGUAKgbsBA2rgcE0Bt0VO6JB+M1d+ObKR74vTDIbigZDRfDr1ARzVGo4qimkSW1iqRlFkmIMHz8bO4IVJd+Ln0jNVy31dPJng2Z/k/IPsqM6nRl7M6OCB2Eit/1+Co0HdyDs7vuP9MynYSaxYPukBxofHW3SP6sY68iuLySjLIas8n9zKlvA+9058F2srGRFeQcyKGs9kjwhkTU0cbChDegHL4kq3ftw/erZZ2qOhuYn7dnxBnXH0rgK4R5mc1tSRqUcnZtZnrb6IgXw16nauipvY5Ykoqinjij9fobLNbuAgWLHlmpcI8wxEFEXq1Y2cqSpGo9Xg4ehKkKuP2bu7iGiWw/aXnCjN5c7NH1LYrGSycyDvTnuAIDef/1fgKK+r4pktX7CuOhdfqR3fXraQIUFRZprSOk4UZ/NLxlbWlp2gvN0Zw3dj5jM91vzkNr2o50xlMSvTt/F5/l6UHXQaWJ5wL1MizaOct57az827l5n66Cd5YtItHVpBnTq0s+JzWwFiYCuVKEqZEz3RyOk27+VF3tv1Iym1hrWInoqcyhXRY885+TZSa3ydPQhw9cbN3hkricRscPyWtpnSukpCPQPMAoq3kzuXBw3mZFEmKfUlbMrZT7xbMH4uXhdFceXeFBGRY2dPc8+G99nbUMpQe0++nv4osf7mJXflV5Xw2rYknjm2irT6UpSi4dmUHpHE6Cn4u5qfbiAIAu4OLowNHcy88LEECTbk15ZQrWs+N5tRdq48M/4WszZNrV7HK7u+JVdVa/z6sECZnFbSVYBUtzrqBl55cbOS0c6B9POwnNU4ejaLJ9NWGMRVeVnZ8NakBTjZ2nd7sjec2MPCQz+ypjCNgfbehJkJElc7J64IG0lNZQk7FWf5Pe8Ars16onxC/7V+SbNWwy9HNnLv3q8p1jYx2yuSj658mCC3C7dwEEWRHTmHuWPLR+yv77i4R5Mo8tiQGbjZWV6oWkDA0caeoYHRzI2cwCA7T+S1ZRRqGnhr6Bzi/M0rIni48CSvnthgahUcAN5UJqeJXQKIMjlNdJgVXwXc0t4ua6qvYWbkWItoVpW2mcc3LyFPXWdw/ZVBsxgfNqRHwLFg/zdoRREtIuuKjhJs5UC0T6hZmsBWZsOksGH466XskGexUZ5FZuFJBnmF4ubgwr9Jl+RXlfD8lqV8cCYFAfhv9JU8Pen2c9G5FxzrzL0s2PMVigs0WlIgsmjknG5vMjZSayJ9+nFd1AQme4QzLDjGLD9YL+r53+7lpqhdgKfkiUnHO/t7c556Ey1V5gxaAa2uzmF+3nGLnLitpw6ws84wJyvc2pGrYid0e8J3Zady175vDGotqUQ9Dx5ejiiKzB58mVkgsZHKuH3kVcT5RfDMrq/ZWJPHjuTXeDlmBnPiL+/wdPefIspmFX8c28qrGckodBoibZx5L2EBI0JizTYn9505xj37vjHJNvpKbZjsNYAEvxgcre1Qapux7kHSw1ZmzZgw87tSZZTk8k3ZcVOlfbKBlRdkYi84oMlpeodZ8Y3AdW2vSxBoqKvkqshxZmuRr46s4WhdqYEB+M7weQwJjOzWoKXkHOGmXZ8b5BG0/Y2NJSfwE2UM9As3axEICPi5eHF1/9HYN6k5UJ3PRnkWe3MO4yNzJNjdz+IDyr9btHodKTlHeHrbFywrOoQOkYdCx/PO1Pvo7x1sNjhKauXctPF/KPSGbJC9xIpXY6/mzUkLuH7gpJboa+8Qon3DzM7R6GnRiXre372c9Pryjqjd3d0GSKsvcgqYB7i3vZ7ZVM0Et1CC3cxrO+Zn787ynD3n/I+R9l48PeHWbqnfvWeOMmfHkk7zAERgY1kmnhqBwQEDzF4MtjIbxoTEMc0nmqKKAvY2lPJbYSoZeem4yxwIdPO56IGi0+s4mJ/B67u+5eXMDRQ3Kxnl6MPSSfcyZ8g0HCyIZ9OLIu/u/J6dtYY90v2ktvw49WFmxo7H/iLoSvaXHC8+zUNpK0wdRBcB85XJaZoeAYgyOU3nMCteC8xsr0UqqkuZFTXOLEbL09GV4tJ80hvK0QPvj72DASbyks2V1MKT3LZ9CSoTdvBElyDKmhvQtdEqW+VZeGogzr+/2QtbEAR8nD2YOWAMwxz9OCbPIVUp59eCQxzPO44DMnydvbC+yE7hGzUqdmYf5o2U7/nvyfVkN1YTJHPgw5E38+T4mwl297OYoTtVns9jqb8YECwyQcIPUxYyIiT2otOYr2xPIrvRZB7T6/LEJLNysM3maR1mxR8H5gIGiQC5agWD7b3p7xVs1mILdPLix5zdXO7WjwfHzDGbvjUFjpu2foxCZ5wheF/QCN6f8RBDHf1ZVZRmYHptlZ/GpqGRYUHRFv22zEpKuFcQN0YmMNjOixOVeRxRVvBnURq/ZG5H2qjCXmaLu4PL32ZSiKLIaXkBa07s4sGdy/gybx85TTX4Se14O/4GXp14B4MCBnRZY684toVtFTkG156PnMq1gydbdO7UF7I79ygvnVzfkfa40xzt8RchZbZ4L5t/O/Bt++txtq78PvsVsxgQnajnibUfcdvg6QwNiu7Sy58ozWXOxveoMtH8/U7/Ibw49W4crVtMh61ZB7h19zKj+q/P9p/Cf8bP7fJiaWhu4sCZY3x9YjOba/LPmXKjnXy5KXw8A/0j6O8dgm0vn8qrtRpyKgo5WZrL72f2sa228NykJjgHkDhwOmPD47tNLqh1Gsb88BjFbdol20ms2Dv7DfxdvC4qcCibm7h55WvsbzDpezwkT0z62Nx7WQoQq1bueFj7z94ceDULRl9r1n2Ka+X4Ont06aDxZNkZ7tr4AfkapdFnd/nH88LUBefAcd5POcZtO5YYJek/1G8sj028tVthMzpRz8nSXPbkHeWj7B1UalUIrQPramXNvIB4hvlFEuLmh5eLBz6O7l3WMCItWXqVdVUU1pZxvCyXH4sOUaFVIbZ+7mQl45HwSSSEDSHOv3+XxtiU5FWVkPDnSwYpsVe7h7P0umd61A/T6nXdjqxenrqBh9N+M7W4s4BBrU2jeh4grSC5Aljf/rqrlYxN1/yXEPfea854Wl7AresXU2Ci6ftwRx+WX/t8h1ll+/PSuWX7JwYgucazP+9OX2iW5jNHmjRqjp89TWpxJr8XHuawshLbVjAIgI0gwV1qw1C3YOLdQgh08sTG2gZrKxkO1nbnTD69KNKgbqRZp0HdrKZcWUNadT6Hawqp1DShEs8bjWpRZJC9G3ODRxAfEMWggAE49gIVfbwoi2kbDZt5PhSWwPNT7uzyPZt1GrZmHaChScmxqnyO1BTSrNexce4bXQZ2iaKCK/94mTLTLQ1ukicm/WzJ/Sy2L+SJSRu8l83/k3ato2t1Ghbv+Yn/zXi4V06e86tKuHfThybBAXBcKedw4UmmDDCdlzw6NI5frB7m/u2fUahp5BrP/rx9+QM9Bg4AO5kNo0LjGBUax736GyisLSO7LJ+sygIOVeayvbaI7GYlZ+VZrJFnWaw9VKIeW4mU6W6hDPcMI9IzmAifEELdA7rsy1ni9Bv5Zd3c6SWChHsOfE9zmyKAvjZdnw+dXs9n+3/vCBzbgF8svWdXV/JzwJVg2H7o1/KTXJuTymWRo3ocHHeuW0ymuuMiYc2iyF0pS1miUTEjNsGkahweHEPStIf44MAK3px6H272xuEP1co6HG3tsLbqHitlJZEQ6u5PqLs/lzMWnV6PVq+lpK6KivoqahpqkTcqqFHV06zToFIbBpPaWNtibSXD1c4RX3s3XB1c8HRyI8DZG5mVtNcBYYqkaC8KdfdTlmWCpF0BhK7XnDmQn86XRYdNWm7As/LEJLFPACJPTMr0Xjb/XeAFI+Ts/5Fk//54O7n3yMSU1VVy38YPTYIj2NqBvOaGc0yFStSTuP9blui0XDNokklmJc6/P19c85RJO1er1/Hi1qVUqRt4ePj1DAuO7jZQ2gLGSmJNqLsfoe4XT4/wthrCVmrToX/kbOuIBMGAETxalY9K29xlIqJOpaRIo8K9jQ8TZuvaFcuf2qZ6Xtj7ncnDYlrSaQ92Sct1Y0zfxkR33HyNkiX7VqC1oOJIh+BQVHL32vdIazSucjLJOZDka//Le4OuM+hhrRNFHjj0I38c246+g8PDjpzAzNIzrJBnsl1RxDVbP+SmFa+w/fQhdHo9/0Zp1mnJqSjk8z0ruOqX5ynppNKLp7M7ju201oHGCk6Vdb26fHrxadzaOfjjPftbrB31op6kA6s4oTKZlVgCvNrlja3LVFpyWrPDrPhsWk7YDd7oiKKYoQ6+hHUj66+ioYa71y7mkNJ40obZe7Lkykfwc/FkkP8AwiT2rC3NOLfviMCaknT89FLi/CPMOhDTi3re2fUD6a1BbQJQ2NxAVW05s2Mm/ONCSy4kW08f5MUdX/L8sWR2VuZQoVURZe3CoIABHfpXOcU5nGgT9CdBoK6mnCsGjLbYqdbp9Xy47xcy2tXHvT9mqlmFQQxYyrxjPJr6qyndoQfulicmpXbZT+rOIMsTk9YDP5h6qkf2f0dRTVmX7lulVPDoho852AE4ls14/Bz3LhEEZg+ZypJh85C2AYIAfJm1jZpG8/pMZJXn82u70qgC8PCw63qMKr2YRKPVsF1x1mAB/Jyzu9PSrDdEGgeVrqrK4be0zRY35NyRfYjvyw2r0jtbyRjRb6BF9ymrq+KxlCSDiIk2kgys6BaR0ANj/WSrGjPUAFo1b+78DpXGslq4ClUDj2z4iM21BUafRdo488WVjxnlIEsEgeuHTCVpzF1Yt+70QTIHvpj6oFllavSiyFepa9C0M8kmuAQyLCSGf6MMCYzCqV1BjX1KOTnywg7/ZlhIDNG2rkabyDPHVvLHsW1md7s6Xnyax/d9Z5RS+2z0Fbha0I5No9PyXsqPJs/EaGlj8J+uOOY9YmK1MbUaHWbFZ9IShmIAuMzGKry0AvFBUWaHIsgkUjRqNZtKTxrtCXeFjuHyqNEmHUlBEIjwCibW1pO08my+v+IxonzN68udLS/kqSMrjHah98feTqhHwL8SII429pTLz3KkrsRgt/QRZYztZ7pIg7WVjAh7L1bkHzYYKR2wtiQdSV0dkd4hHQYsanRa1p7Yxb0pX1LRLi13oJ07L0++y2Rd5o7k17RNvJ29zeSeB9wlT0za391x6hHboTU11wswShDeUnGaBNcQs7LU/tIGsX4RhEkc2FCSYTARKdX5+GolrcGGpgEX4RXENWGjLDqw/HjvrxxQGOapjHT04eExc5D+A7IJRVGkQlnLtqwDWEtlJulrkyCxsmF5nmHl/pJ6OTdGTeiQmQpw9UZbW8v+WmNNs6cmn19P7cKqUYWo16MXQK1tpqCmjH1njvLmnh/5X+4uVO3ScmWCwNeT/2NR3a3UwpPctuerjj7+kQtkCporPRZh5r1svgOwHzAyIv1ldvxx1XMW9eYQgVXHt7Pw0I8G4Q0i8HbcLG4bcVWPFHs7LS9gWvLrqNqYVyLw68T7mdR/eM/a/XotdapGXG0dzwNc6HqYX4O6icMFGWzPO8InRQeRAoEyez4cdxfjIoZe8L516kYu+/lpCtscvorAn1MeZGwnGZ4N6kae3vApKypOdTp/6tbMTltB6LBCiVQQWDr6TmbGjjf7vUsUFdycvIhMlclzsWxaalz1SPfZHvM+lclpGodZ8SnAbbQ7QKzXaykozWVK2DCzVagARPmEMtDei3VFRwdsqF8AABOCSURBVM+ZPwKwWZ6FrbKRoYHR3T4w+2z/SvbWGO6GI+y9eHzc3B7XHgfzjjNy1Su8dXQ1f2TuZEfuYdIKT5Bbmt+SpOVqXtCfWtvM53t+475dX/Jt3n4O1xWfs23r9BqW5x/CVysh2ies003ERiqjuaGBXZW5BuMuNDVy5YAxHf6dtVTGuJDBNFSVc7S+rMP5kwoC1oLQYZ0rW0HCl2MXcGWM+RVPlM1NPLNpCXtM58E3AdfKE5NyemrOepSeUSanyVvLll7TXjudUStQVpeTEBpv0c4f7hlErL03a9uBJKUqD7vGJoYGRnWZZcqrKuah/T8YVNrTA4tGzCPaTP/FXFFrNTyzbRlF6jpkCCi0avKaajlSV8L2qhwUdZVcE2XeLioRBL46spYjSnmHzMvm8lPUyIsZ6j+g0yQmJ2s7vju928CULWqsZnbYaJw6qZZuK7NmYmg8wdiytfxURwd0HcoYJ1++nvogYywoSqfV61i8/Xu+Lz3W0VcekycmrezJeetx/tJhVvwxwBcwsk+O1pfh2NTM8OAYi5J1wj0DGekazOaCNANTKKUqD1FRy/CgmC7Ff311cBW7qg0Puobbe/J0ws09Hk+WfvY0b5zc0OHnhU213DxgvFEkssndWRBAo2V1caf1BjhaX8bO3EOM8I7Ay9HN5Hdc7BzZnX2Q4jZMkFrUM8o5kAHeIZ0vHokVcf79mR0yHDetyIGawk7pXj0ig+09eSP+Bp6ccAv+LuaXAtKLIt8eTObN7C0dfWU58FxP+B29CpDW6vCbgSmAURbVrqpcggU7Yn3DLQJJsJsvw92C2VRwxKBj0f7aQpprq0gIi7cojDy/qoR79n1jkB3Xoj3mEmNm7WFLdr6Xtn/F6aaOu3RpEZnqOcDsesNuDi58nLHpgjy9XKtiZc4+Bti4E+oZaDRGVhIrrDR61pcangFV11UwO3qiWWPqau/EmH6DuCtqIgmu/Rjk4E2krRtR9p4McvRhimc4N4QM54n4WTw6eg7RfmEWbUAisO5ECg8e+bUjvyqt1bTq8f56vXIC1pqiux64HjDaujaVnmSwgzdhnkEWOaiBrj6Mcu/H7qLj54oGCAg8OmgG4Z6Wnb7+dGQD2yoNTdU4WzeeGX9Lj6fPZpTk8HL6GoO9VW+i+mOkjRsjQ8w7KLO3tkVVJeeQ4uwFv9ss6lldlIZM2chA3wij93Ozc+K7zB0GpmZpcwOzAofg4Whe1XQBAXuZLaGeAQwPjmFS+DCmDRjF5QNGkRA+lMEBA/B19uySz7g75wjz93zVkRlXAlwhT0yq6I213GvxE/LEpFJgDi21T41U7d17ktibe9Ti+44IGcjX0x4mWGaPFQI/JtzDFAujh4tr5byZtclol3og7kocLShiYN7uJ/J12jqj5j8vRF6Ov8wwb2PZmRSadRqzF+SU0GEmd9vL3ELQG405LDq9lUfWfUBJu7befi5eTPcwrKSoEUX2FxzvOj0qCEha/3WHKj1UcIIFu5Z2VNC8CZgnT0zK66113KsBRq0xMLcBRrOuEvXM3/U5h/IzLL7vQP8Ivp72MF+Mvp0pkSMtnoBVGTuMTs3j7NyYHjW2x8fgVFkev7YLqfCX2nJz/HSmexnGPZVpmsju5CS7vcQHR+MltTUC5B2x03h74NUmzaPkqhxmr3qdw4UnDZz+udGTjUD16aktNGnU/F2SUZLDgu2fGpUYOmeVwgJ5YlJKbz5Dr0fgyROTkmnpvW60BdTqNNy6/ZMug+TqgRMsBoe8vpq3Ths7endHTe1x7QHwS/pWoyYxd4Un4OXoxphAY3PqZGmu2fd2tLZjYf9J7SZUYNuZVO4YNYvfJi0kUGb8TmeaG7h+8/ssT92ApjVZaWhQNP7twFbQ3MCJkpy/DRy3bfqAcq26I7fkaXli0vLefo4+CVGVJyZ9QUvuiGgKJLds6xpIuiLJGTtRtwvF72ftyAwLDqrMlZyKQpYWGp5U2whWXB83GYBBAZEo22myTUVpFgX+jes3xGiT+K0snWqlgvHhQ1h59fNMcTH2z9SingfTfuXVLV9S29SAq70TswOGGK3CHWdS+xwc6SU53LrpA0q0TR195S3g/b54lr6M4X4bWGQKJAq9hnnbPiYl50iv9jCX11fz9qmNRtcfjb0SF1vHHv+9NSdTjHyPxOCR54ItA129SXA0bLPwe0UWFQ3mHwJH+4UxyMGwX0qDXsveMy3+XYi7H19c/SQP9RtrNLZWCCwtOsSC1W9zpvIsMyPHG3VfWpK3h0qlos8WyaH8DGZvXExpx+D4DHixu0GIFx1AWttbvQR8burzBr2WG3cuYcPJPWZHhVoqG07uQdHOCXaX2pjdIdUSKawu5a0cwx7hGkTmDp52jr2SWUmZ5mdoZskQOGmBWSOVWHFv1LR2DjyszN6NplVTOts68PSUO/l8+M3YC8bE5e76Eq5fs4hCRTmD7QwzQZV6LUf7oK+8iMjO7MPM2fax0Ry1A8dD8sQkXV+t2z7NAmp9sYdaX9RI9KLI7XuT+DF1vVEdq+5KdWMdH5zaZHT9qajpuFkQYm2urM3cbQT0+X5DiGiXDDQsIMpoZz9Wmm3Rbw0LicGmXULXhpoCiqpLDYB0/ZDL+HP64/S3MQ5mLNWquP/AD2SbiG9alb3X4nwPi8Ahiqw8upU5Oz+jqeNq8T8Bj8gTk7R9uWb7PBOotRj2RloqNI6gXUiKQEsdXau6OoYFRfdY99nf0jbxe2m60fWqhipcsCbQzRfrHjo9L62r5I6UZQbmlRaRt8beSmC7XBZnO0feTt+AdZthyGuQM3/gNLPPDFztnMgszCSrXbfgMKkTQwMNu0T5OnsyI3Q4tRUlRtl8gMnEo3RlBXP7jbQoV8Nc0ei0LN23kseP/9nZbr0EuFeemKTp6/X6t6TKtYJkfevvTzAFkj01+ZSV5jM8MLrbBZGV6iYe2PmFSdVdpmlkdfExtp7eh7MoJcDVu9s9Cv84upX17ZpFxtq5MzdmIggCNlLZuSgCa6mMoqIsTrVZ3DW6ZmYFDLKo8IWTxIYVBYYVParqK7kheqLRqbWjjT0Tw4biptazs/LC5pwAxNt7E+MX3qProLapnre2fcN7Z3Z1xEaKreDoc83xtwKkFSQ4zIrfCdQDUzERep+hrCA1/xjDvCLMPtE1JTKpjIm+0dipm9mvKDIZXSrXqlhTks4fmTvxwgY/Fy+LknfOLUqlgvk7P6epHVNWqVWRdGoHn6RvYHFaMr+f3Mn23MMcKzpFdl2ZQSyUBIF4Bx/i/Pub/buOtg78fHK7QRhOqbaJmX6x+DobNz2VWUkZHhzDEHtvthWnG8S4mXyvhkpujJnUY7n5ZyqLeWzTJ52FzIvAa8AzfelzXDQAaQWJ6DArfj9QAEwHjGI8ipuVrMzdS4y9F/08ArrUM1CgpbL8xPChXBcwBHcd7K4pMKnS6/Qa1paks/zkNlx1EvydvSzSYKuPb+ePkvROn0UAarVqzjTVkKooNgDHX2Kj1TIjcqzZ8WX21rbUVJVzsE3vRwFw08GEsPgOnkUg3DOI6QFxZBaf4myzssP7FzTXM9NvID5OHt32N/adOcatWz4ko+PYtGbgYWBxX7FVFyVA/tIkyuS0ow6z4lNpKUZnVDdTLer5ozAVqVJJnG94l2OlBAQ8HF0ZGzqYuSEjcNXo2dUBUJpEHRvLMom0dmGgn3m98OrVjdy/4/POWBiz5UhjJfdGTsTB2vzDS0epLT/l7jO4VtRQwY39x2PXCcg9HFy5ImwETTWVpNaVGuhXnSBwX+Bwno2/joH+Ed2Kcm7SqEk6sIoHDv1oVCe5jSiAW+WJSd8rk9P+7uXJRVOuQ5mcltPql0wBPE3p291VeRzNP85Q74hO+26bAxRXeyfG9hvE7RFj8dQJ7K8pMDqz8JXa8uqEO83WIGszdvFD0RGDBWYrscJBakORTo2mdVeXCFwwR1+GQIJrP4tKJznbObLu1G6q2+R71+u1JLiHXjC33k5mw4SweEJEW1aXneRajwiejJvJooTbuCp6PP08/LsFjoLqUp7atISlhQc748MKgZnyxKTtF8u6vOj6Unovm+9JS07x5R2yNhIZi4bN4arYCT0SeSsiUl5Xxcrj21iSs4OK1vCGtwddy50jrzbrHo3NKmb99iLp7cyGD4bcwOz4qej1eqqb6lGoGmhQKVGrVFQ2KahqqqNW1UBOzVlWVhnSu4+Gjufpy+6yaJKS9q/i2YzVBteu847is1lPmFU4Q6SlJpmHvUuPlDfV6LRsPrWPpw8uR67rNK5rDzBbnphUfjGtx4uycav3svky4A3gsc603LVeA3gu4TZC3P177LcrG2pZeXwb3+emsOLaF8y2udeeSOHOfd8YmGtOEhn7blzUYbJSW8mtPMuoP18yaPjSz8aJnfPewVZmPquWU1HIhNWvGmhDe8GKnde9SrC7b5/OY4migg/3/MK3JWmdaQ19K1P1pDwxSXWxrcWLsiJaKw28BUhvZbhM1vM/1VjFn6f34Ik1EV5BPXJmYm9ty7CgaOZGTTS7OohK28xLO7+mqNmwSN2rsVcxzsz21i52jmzM2kuF5nyIRblWzXWBgy2je+0cOJx7hAL1+WfRIDLM0a/H04g79LB1GtacSOGB7Z+zU1HU2VfrgLuBd/4uGvcfCZA2zvsph1nxK2hJ3zXZ461R1LGu9AQZ+RlEuwXi4ejWJaarvVhiuqXkHOHd7G0G9LFMkPBGwm1mt1eQCALNdXVsrzxvZkkFgVg7D4YEmN8F2EqQYKMXWF183MA8KKsrZ17MlF5tDyeKIjkVRTy35Qvezd5Bnb5TsiINmCFPTNp2MTjjHc4LF7nIE5POAJfRUoC4uSM7cUttAZetW8Ti7d9RVlfVZ8/XrNWw7Ng6o154j0VMNLv7718SZ+IgLqU4w+JC4KNC4nCSSBGBaBsXXo2ZwYeXPUBvtk6sVNby0a7lTE5+jeSqnM4WlgZ4FxgvT0zKvNjXn8A/SLyXzR9NS4/EAZ19z09qyxOxM7h20ORe6bZkYPNXFvG//b9RpqymRq2kXq+hUdTx58xnLlj0oL1UKGsZvPwJg3APURA4OXcxnhYclIqiyE+p64n2DiXSNxSHXmzN3NisYk3GLt7LWEN+J+corZJHSzHpbf+UNfePAkgrSByB54HHMXGw2JaNibV15bHBV3NZ5Og+6d+t1eto1KhQaZrxcnTr0uDes+odVlVkGbzHzwn3MiVy5EU1D2qthh3Zh/hf2p+kNVZd6F21wBfACz1V0O0SQC4MlFHAx7QEPNIZUAbbu/Nw3FVMjhxp0cHb3yEFVaXkVRejVDeh0agpbazByd6JW+OvuCieT6VtJiU7lU+Pr2FvfZk5CygdWChPTNr1T1xn/1iAtIJEBiS2+icX5GNj7dx4KHYGEwcMN5uhuiQtolA1sDs7lU8y1pOqrDBn4ShoiaX6RJ6YpP6nvrfwb5g872Xz/WlJ6b0HM5g5N6kNT0RO47IBI/+11dt7Ss7WlLMt+xCLMzdQrmky5090tPSMeUmemFT4T39/4d80md7L5g9u3bXMOv6WAHcExHNNZAKDAgdc9OZXX0mTVs2xoizWnt7Ll0WHsKAB3eZWYOz/t4yF8G+bXO9l8wVgEvAyLbkmZg1CoLUD/4m8jDEhgwj3DkImkf6/AoVO1JNbUcTBggw+zdxMXnO9JTmEe2gppLD2746+vQQQ84EioSU6+Ckgwdx3lSIwyMGTBVGXMci/P/08A3ss0/Bik2adlqLqUtLOnuLbrO2kKeUGrSbMBMYiYH1rzYF/nfxrAdIOKOOBp2kJgDR7tVsJApE2LtwcNo5hgdGEePrjYe/yjx6PmsY6CqpLOXI2k+W5ezilqu2oamFnPsZ24D1g89+ZzHQJID1vekUDjwI3ABalKIqAr9SG4S5BzOw3gv7ewQS6+eBi54TVRdoBVy+KKJrqKVVUkFmWx/r8Q6QqzlKsVXVl4uuA1cBiIP3fqjH+3wKkHVjcgVtoCZSL68o46BDxtrIlzt6DId4RDPcdgL+bD/5OHtha22LXhXTd7jnWzaibVZTWV1FSU84xeS6Hyk6T3lhBmVZlFApjwb5wGvgK+Ka3CkRfAsjFCxQpEA8soKUSvVdX7yXSUrnETrBioK0bEQ6e+Dt7Ee0WhIeDK872TrjbO+Nm54REIkEikSAgILU6z0r/RQxo9bpzZXZ0eh16EfR6HXq9nlpVAzVN9dQqFdQoFWTVFlNYW0ZeYxXHVTU06rVIEbo7sdW0tFD+HDjSG20FLgHknwcWJ2Bsq2aZCbj31L3FVo2jFkU0QKDUFl+ZHbYSK3xl56N9fa1b/rtCozyXz1GhUaLS6yjRNlKiVSMRRaxbe/718OQpaKFpfwB2yBOTFJdWxSWAdAaW0cAs4FpaOmb926gsHVAOrAX+APbLE5NqLs3+JYBYChYrIIaWM5UpwGTAmYs4l6YTQCiBXa2aIgU4/m9noS4BpO8BY01Lq+uhwBBaKOQoWiKLLxY6S09LBG02LWcVqa3/Mv7JcVGXAPLPBY0jLRRyDBBKS75KFBABOHC+HFZPitj6rxHIB060AiKHFubphDwxqe7S7FwCyMUOHm8gqNWP8abl/MWp9X8dgb8qMkhMaAFoyaJsoOUcop4WhqkSKAVK5IlJJZdGuffk/wBF3Vjak3DLJgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAtCAYAAADr0SSvAAAAyHpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVBRDsMgCP3nFDuCgFo4jm1tshvs+EOhS9vsJT6QR54I9M/7gNcAYYZcFqlaazJkzUrNEkmONhlTnjyxnRre60B7CGQltsh+lRr9Zx1/Bh6aZeViJFsI613QHP7yMIqHeExElsQgoGHE5AKGQfNvpaqyXL+w9nSH+IFBx0Y6amV17XnPi21vL/YOE3VGTsbM4gPwOAW4WaLGVrBGtIaRizHOVvSF/NvTCfgCF5hawfSmwyAAAAGDaUNDUElDQyBwcm9maWxlAAB4nH2RO0jDQBzGv6ZKfVQczCDFIUN1souKdKxVKEKFUCu06mAefUGThiTFxVFwLTj4WKw6uDjr6uAqCIIPEHfBSdFFSvxfUmgR48FxP7677+PuO4BrVhXN6kkAmm6bmVRSyOVXhdAr+sFjEBHEJcUy5kQxDd/xdY8AW+9iLMv/3J9jSC1YChAQiBOKYdrEG8Szm7bBeJ+YV8qSSnxOPGnSBYkfmS57/Ma45DLHMnkzm5kn5omFUhfLXayUTY14hjiqajrlczmPVcZbjLVqXWnfk70wXNBXlplOcwwpLGIJIgTIqKOCKmzEaNVJsZCh/aSPP+L6RXLJ5KpAIccCatAguX6wP/jdrVWcnvKSwkmg98VxPsaB0C7QajjO97HjtE6A4DNwpXf8tSYQ/yS90dGiR8DwNnBx3dHkPeByBxh9MiRTcqUgTa5YBN7P6JvywMgtMLDm9dbex+kDkKWu0jfAwSEwUaLsdZ9393X39u+Zdn8/0ORyzDea69EAAA16aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmM4NjdiYjcyLWU1NWEtNGZkZS1hYTlmLTdiYzZhNTJhNGIzZSIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0NWE1ZGEyYy01YjhmLTQ1ZTQtOGJkYy01N2Q0ZmJkZGQ1NWUiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplN2YyOWQyZS1kMDg1LTQ4ZWYtODYyZS0wZDM1NTRjOGVlYWQiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJNYWMgT1MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MzY3Njk4OTQxNjMxIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjA5OjIwVDEzOjI4OjE4KzAyOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowOToyMFQxMzoyODoxOCswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmZlNDAxNmZmLWZkZDItNDA4MS05YjU2LWY2ODYzYjk1Y2E1ZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChNYWMgT1MpIgogICAgICBzdEV2dDp3aGVuPSIyMDI1LTA5LTIwVDEzOjI4OjE4KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Pl6bkfoAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfpCRQLHBI2b4GnAAAU8UlEQVR42u2deXwV1dnHv/feDCQkyCpQFtkXZS0KAi8UpSqgqCMuMB3FQa0bBV+LS1GLSNVirdoWS221dWy9jlIsA1YQRBZFVFbZ14Y1IEsgELKQIbnvH+eZZnLfBIkmrPf5fPKZ3Jk55zxz5jznWc7vOROKxWJfTJ21uu1T0dUa5zHdfFmDwvGj+uUBLUKhUF78dU23uwPTyij+IvB7YANwHOjkuZZ3JjyXptvNgU+BecBdnmsdJ0EnTUlA3VgsVmtztnded0Th8UKAGkCorLEGNAAOyoALUoYc1wOFQOwMerQbgFXAiIRwfDcBSVD5aKPnWjeVMlOHgL+KcBRpul0DuBpIB/KB64Fc4F3PtfZLGQ0YBHQQzfM1MMtzrSJNtxsDPYCVwIXAlcAe4D3PtXICbfYA+gobn3qutSjAUwPAA74Aemm6/bHnWkWl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\"","<script setup lang=\"ts\">\n const dependencies = import.meta.env.VITE_DEPENDENCIES;\n import bpi from '@/assets/sponsors/bpi_france.png';\n import france2030 from '@/assets/sponsors/france_2030.png';\n import franceRelance from '@/assets/sponsors/france_relance.png';\n import oslandia from '@/assets/sponsors/oslandia.png';\n import ueNext from '@/assets/sponsors/ue_next_generation.png';\n import { useModuleStore } from '@/stores/modules';\n\n const modules = useModuleStore().getLoadedModules();\n</script>\n\n<template>\n <div>\n <p>\n <a href=\"https://gitlab.com/giro3d/piero\" target=\"_blank\">Piero</a>\n is a fully-configurable open-source web application for 3D visualization. It is powered\n by\n <a href=\"https://giro3d.org\" target=\"_blank\">Giro3D</a>, a versatile framework to\n visualize geospatial data in the browser.\n </p>\n <h5 class=\"mt-3\">Going further</h5>\n <p>\n If you wish to run your own instance of Piero, or if you wish to contribute to this\n application, head up to\n <a href=\"https://gitlab.com/giro3d/piero\" target=\"_blank\">our GitLab project</a>\n for more info.\n </p>\n <h5>Contributors</h5>\n <p>\n <a target=\"_blank\" href=\"https://gitlab.com/giro3d/piero/-/blob/main/CONTRIBUTORS.md\"\n >Brought to you by the Giro3D contributors.</a\n >\n </p>\n <h5>Sponsors</h5>\n <div class=\"list-group my-3\">\n <a href=\"https://oslandia.com\" target=\"_blank\" class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span>Oslandia</span>\n <img :src=\"oslandia\" class=\"logo\" alt=\"Oslandia\" />\n </div>\n </a>\n <a href=\"https://www.bpifrance.com/\" target=\"_blank\" class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span>BPI France</span>\n <img :src=\"bpi\" class=\"logo\" alt=\"BPI France\" />\n </div>\n </a>\n <span class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span>Funded by the French government as part of France 2030</span>\n <img :src=\"france2030\" class=\"logo\" alt=\"France 2030\" />\n </div>\n </span>\n <span class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span\n >Funded by the European Union - Next Generation EU as part of the France\n Relance plan</span\n >\n <div class=\"text-end\">\n <img :src=\"franceRelance\" class=\"logo\" alt=\"France Relance\" />\n <img :src=\"ueNext\" class=\"logo\" alt=\"European Union - Next Generation EU\" />\n </div>\n </div>\n </span>\n </div>\n <p>\n If you wish to sponsor Giro3D and Piero, you can contact us at\n <a href=\"mailto:infos+3d@oslandia.com\">infos+3d@oslandia.com</a>.\n </p>\n <h5>License</h5>\n <p>\n <a target=\"_blank\" href=\"https://gitlab.com/giro3d/piero/-/blob/main/LICENSE\"\n >MIT License</a\n >\n </p>\n <h5>Credits</h5>\n <p>Data and services used from:</p>\n <ul>\n <li>\n <a target=\"_blank\" href=\"https://ign.fr/\">IGN</a> (Imagery, Elevation model, LIDAR\n data, Elevation API)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://www.grandlyon.com/\">Métropole Grand Lyon</a>\n (Imagery, Elevation model, overlay layers)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://www.openstreetmap.org\">OpenStreetMap</a> (Imagery)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://adresse.data.gouv.fr/\">adresse.data.gouv.fr</a>\n (Geocoding API)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://cadastre.data.gouv.fr\"\n >Données cadastrales ouvertes</a\n >\n (Cadastre)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://oslandia.com\">Oslandia</a> (CityJSON\n reconstructions, overlay layers)\n </li>\n <li><a target=\"_blank\" href=\"https://bimdata.io/\">BIMData</a> (IFC model)</li>\n </ul>\n <p>Third-parties:</p>\n <ul>\n <li v-for=\"[name, info] of Object.entries(dependencies)\" :key=\"name\">\n <a target=\"_blank\" :href=\"info.homepage\">{{ name }} ({{ info.license }})</a>\n <blockquote v-if=\"info.description\" class=\"blockquote fw-light\">\n {{ info.description }}\n </blockquote>\n </li>\n </ul>\n <h5>Loaded modules</h5>\n <ul v-if=\"modules.length > 0\">\n <li v-for=\"module in modules\" :key=\"module.name\">\n {{ module.name }}\n <h6 class=\"badge text-bg-light\">{{ module.id }}</h6>\n </li>\n </ul>\n <div v-if=\"modules.length === 0\">\n <span>No module loaded.</span>\n </div>\n <hr />\n </div>\n</template>\n\n<style scoped>\n blockquote {\n font-size: 0.7rem !important;\n margin-bottom: 0;\n }\n .logo {\n max-width: 200px;\n height: auto;\n max-height: 80px;\n }\n</style>\n","const _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, - 1.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n\tnormalize,\n\tdenormalize,\n\tMathUtils\n};\n","import type { Component, Ref, ShallowRef } from 'vue';\n\nimport { defineStore } from 'pinia';\nimport { generateUUID } from 'three/src/math/MathUtils.js';\nimport { ref, shallowRef } from 'vue';\n\nimport type { AnalysisToolRegistrationParams } from '@/api/analysis';\n\ntype AnalysisTool = {\n collapsible: boolean;\n component: ShallowRef<Component>;\n icon: string;\n id: string;\n name: string;\n};\n\nexport const useAnalysisStore = defineStore('analysis', () => {\n const _tools: Ref<AnalysisTool[]> = ref([]);\n\n function registerTool(tool: AnalysisToolRegistrationParams): void {\n const item: AnalysisTool = {\n collapsible: true,\n component: shallowRef(tool.component),\n icon: tool.icon,\n id: generateUUID(),\n name: tool.name,\n };\n\n _tools.value.push(item);\n }\n\n function getTools(): AnalysisTool[] {\n return _tools.value;\n }\n\n return {\n getTools,\n registerTool,\n };\n});\n\nexport type AnalysisStore = ReturnType<typeof useAnalysisStore>;\n","<script setup lang=\"ts\">\n defineProps<{\n collapsible: boolean;\n icon?: string;\n id: string;\n title: string;\n }>();\n</script>\n\n<template>\n <div class=\"accordion-item\" :id=\"id\">\n <h2 class=\"accordion-header\">\n <button\n class=\"accordion-button\"\n type=\"button\"\n data-bs-toggle=\"collapse\"\n :data-bs-target=\"`#${id}-collapse`\"\n aria-expanded=\"false\"\n :aria-controls=\"`${id}-collapse`\"\n >\n <i v-if=\"icon\" class=\"bi icon\" :class=\"icon\"></i>\n {{ title }}\n </button>\n </h2>\n <div\n :id=\"`${id}-collapse`\"\n class=\"accordion-collapse collapse\"\n data-bs-parent=\"#accordionExample\"\n >\n <div class=\"accordion-body\">\n <slot></slot>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .icon {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n color: rgb(180, 180, 180);\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps({\n text: String,\n });\n</script>\n\n<template>\n <div>\n {{ text }}\n </div>\n</template>\n\n<style scoped>\n div {\n opacity: 0.4;\n width: 100%;\n height: 100% !important;\n vertical-align: middle;\n font-size: large !important;\n text-align: center;\n }\n</style>\n","<script setup lang=\"ts\">\n import { useAnalysisStore } from '@/stores/analysis';\n\n import ToolWrapper from './analysis/ToolWrapper.vue';\n import EmptyIndicator from './EmptyIndicator.vue';\n\n const analysis = useAnalysisStore();\n</script>\n\n<template>\n <div class=\"accordion\" id=\"analysis-accordion\">\n <ToolWrapper\n v-for=\"item in analysis.getTools()\"\n :id=\"item.id\"\n :key=\"item.id\"\n :title=\"item.name\"\n :icon=\"item.icon\"\n :collapsible=\"item.collapsible\"\n >\n <component :is=\"item.component\" />\n </ToolWrapper>\n </div>\n\n <EmptyIndicator text=\"No analysis tool\" v-if=\"analysis.getTools().length === 0\" />\n</template>\n\n<style scoped>\n .warning {\n justify-content: center;\n text-align: center;\n }\n</style>\n","<template>\n <fieldset class=\"vstack flex-grow-0 flew-shrink-0\">\n <hr />\n <slot></slot>\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\n import { ref } from 'vue';\n\n import ButtonWithIcon from './ButtonWithIcon.vue';\n\n defineProps<{\n icon?: string;\n text?: string;\n title: string;\n }>();\n\n const emits = defineEmits<{\n (e: 'import', files: File[]): void;\n }>();\n\n const hover = ref(false);\n const hiddenInput = ref<HTMLInputElement | null>(null);\n\n function importFiles(files: FileList | null | undefined): void {\n if (files) {\n const a = [];\n for (const file of files) {\n a.push(file);\n }\n emits('import', a);\n }\n }\n\n function importFromFile(e: Event): void {\n const files = (e.target as HTMLInputElement).files;\n importFiles(files);\n }\n\n function onDragEnter(e: DragEvent): void {\n hover.value = true;\n e.preventDefault();\n }\n\n function onDragLeave(e: DragEvent): void {\n hover.value = false;\n e.preventDefault();\n }\n\n function onDragOver(e: DragEvent): void {\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'copy';\n }\n }\n\n function onDrop(e: DragEvent): void {\n hover.value = false;\n const files = e.dataTransfer?.files;\n importFiles(files);\n e.preventDefault();\n }\n</script>\n\n<template>\n <div\n draggable=\"true\"\n @dragover=\"onDragOver\"\n @dragenter=\"onDragEnter\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDrop\"\n >\n <ButtonWithIcon\n :title=\"title\"\n :text=\"text\"\n :icon=\"icon ?? `bi-file-earmark-plus`\"\n @click=\"(hiddenInput as HTMLInputElement).click()\"\n class=\"w-100 btn-sm\"\n :class=\"hover ? 'btn-outline-primary' : 'btn-primary'\"\n />\n <input\n ref=\"hiddenInput\"\n class=\"btn btn-primary d-none\"\n type=\"file\"\n @input=\"importFromFile\"\n multiple=\"true\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { ref } from 'vue';\n\n import type Named from '@/types/Named';\n\n const props = defineProps<{\n current: Named | null;\n descriptionPosition?: 'bottom' | 'top';\n items: Named[];\n label: string;\n }>();\n\n const emits = defineEmits<{\n (e: 'updated:current', current: Named | null): void;\n }>();\n\n const currentSelection = ref<Named | null>(props.current);\n\n function setCurrent(index: number): void {\n const item = props.items[index];\n currentSelection.value = item;\n emits('updated:current', item);\n }\n\n const id = MathUtils.generateUUID();\n</script>\n\n<template>\n <fieldset class=\"border p-2\">\n <legend class=\"float-none w-auto form-text mb-0 px-2\">{{ label }}</legend>\n <div\n v-if=\"\n descriptionPosition === 'top' &&\n currentSelection !== null &&\n currentSelection.description\n \"\n class=\"form-text mt-0 mx-2\"\n >\n {{ currentSelection.description }}\n </div>\n <select\n :id=\"id\"\n class=\"form-select\"\n :aria-label=\"label\"\n @input=\"e => setCurrent((e.target as HTMLSelectElement).selectedIndex)\"\n >\n <option v-for=\"(item, index) in items\" :key=\"index\" :value=\"index\">\n {{ item.name }}\n </option>\n </select>\n <div\n v-if=\"\n descriptionPosition !== 'top' &&\n currentSelection !== null &&\n currentSelection.description\n \"\n class=\"form-text mt-0 mx-2\"\n >\n {{ currentSelection.description }}\n </div>\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\n defineProps(['modelValue']);\n defineEmits(['update:modelValue']);\n</script>\n\n<template>\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n role=\"checkbox\"\n :checked=\"modelValue\"\n @input=\"$emit('update:modelValue', ($event.target as HTMLInputElement).checked)\"\n />\n <slot></slot>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import CheckboxToggle from './CheckboxToggle.vue';\n\n defineProps<{\n visible: boolean;\n }>();\n defineEmits(['update:visible']);\n</script>\n\n<template>\n <CheckboxToggle :model-value=\"visible\" @update:model-value=\"v => $emit('update:visible', v)\" />\n</template>\n\n<style scoped>\n .icon {\n width: 1rem !important;\n float: right;\n }\n\n .inactive {\n color: rgb(180, 180, 180);\n }\n\n .active {\n width: 1rem !important;\n float: right;\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n</style>\n","<script setup lang=\"ts\">\n import { onMounted, onUnmounted, ref } from 'vue';\n\n import type { AnnotationType } from '@/configuration/annotation';\n import type Annotation from '@/types/Annotation';\n\n import Icon from '../atoms/Icon.vue';\n import IconList from '../atoms/IconList.vue';\n import AttributeItem from '../AttributeItem.vue';\n import VisibilityControl from '../VisibilityControl.vue';\n import EmptyIndicator from './EmptyIndicator.vue';\n\n const props = defineProps<{\n annotation: Annotation;\n visible: boolean;\n }>();\n\n const icons: Record<AnnotationType, string> = {\n linestring: 'fg-polyline-pt',\n multipoint: 'fg-multipoint',\n point: 'fg-point',\n polygon: 'fg-polygon-pt',\n };\n\n const titles: Record<AnnotationType, string> = {\n linestring: 'Line',\n multipoint: 'Points',\n point: 'Point',\n polygon: 'Polygon',\n };\n\n defineEmits(['edit', 'stop-edit', 'delete', 'download', 'update:visible', 'zoom']);\n\n const isEditing = ref(props.annotation.isEditing);\n\n const onIsEditingChanged = (): void => {\n isEditing.value = props.annotation.isEditing;\n };\n\n onMounted(() => {\n props.annotation.addEventListener('isEditing', onIsEditingChanged);\n });\n\n onUnmounted(() => {\n props.annotation.removeEventListener('isEditing', onIsEditingChanged);\n });\n</script>\n\n<template>\n <li class=\"list-group-item item\">\n <div class=\"d-flex\">\n <VisibilityControl\n :visible=\"visible\"\n v-on:update:visible=\"v => $emit('update:visible', v)\"\n />\n\n <IconList class=\"text-body-tertiary me-1\">\n <Icon :icon=\"icons[annotation.type]\" :title=\"titles[annotation.type]\" />\n </IconList>\n\n <a class=\"title\" :title=\"annotation.title\" href=\"#\" @click=\"$emit('zoom')\">{{\n annotation.title\n }}</a>\n\n <div class=\"icons\">\n <a\n href=\"#\"\n class=\"icon\"\n title=\"Attribute table\"\n data-bs-toggle=\"collapse\"\n :data-bs-target=\"`#collapse-${annotation.uuid}`\"\n aria-expanded=\"false\"\n aria-controls=\"`#collapse-${annotation.uuid}`\"\n >\n <i class=\"bi bi-card-list\"></i>\n </a>\n <a\n href=\"#\"\n class=\"icon\"\n title=\"Edit geometry (right-click to exit edition, or press Escape to cancel modifications)\"\n @click=\"isEditing ? $emit('stop-edit') : $emit('edit')\"\n >\n <i :class=\"`bi bi-pencil ${isEditing ? 'text-primary' : ''}`\"></i>\n </a>\n <a href=\"#\" class=\"icon\" title=\"Download...\" @click=\"$emit('download')\">\n <i class=\"bi bi-download\"></i>\n </a>\n <a href=\"#\" class=\"icon\" title=\"Delete\" @click=\"$emit('delete')\">\n <i class=\"bi bi-trash\"></i>\n </a>\n </div>\n </div>\n\n <div class=\"collapse m-2\" :id=\"`collapse-${annotation.uuid}`\">\n <EmptyIndicator\n text=\"No properties\"\n v-if=\"Object.entries(annotation.properties).length === 0\"\n />\n <table class=\"table table-striped table-sm table-responsive-sm\" v-else>\n <thead>\n <tr>\n <th>Key</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n <AttributeItem\n v-for=\"[key, value] of Object.entries(annotation.properties)\"\n :key=\"key\"\n :attr-name=\"key\"\n :attr-value=\"value\"\n />\n </tbody>\n </table>\n </div>\n </li>\n</template>\n\n<style scoped>\n .item {\n padding: 0.1rem;\n }\n\n a {\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n .icons {\n display: flex;\n }\n\n .title {\n white-space: nowrap;\n display: block;\n width: 100% !important;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .icon {\n padding-left: 0.4rem;\n color: rgb(180, 180, 180);\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n</style>\n","import type Named from './Named';\n\ntype AnnotationMode = 'mapOnly' | 'normal' | 'objectsOnly';\n\ntype AnnotationNamed = Named & {\n value: AnnotationMode;\n};\n\nexport const annotationModes: AnnotationNamed[] = [\n { name: 'Default', value: 'normal' },\n {\n description: 'Will only pick points from the map and not to any 3D object',\n name: 'Map only',\n value: 'mapOnly',\n },\n {\n description: 'Will only pick points from 3D objects, and not from the map',\n name: '3D objects only',\n value: 'objectsOnly',\n },\n] as const;\n\nexport default AnnotationMode;\n","<script setup lang=\"ts\">\n import { ref, watch } from 'vue';\n\n import type AnnotationMode from '@/types/AnnotationMode';\n import type Named from '@/types/Named';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import DropdownView from '@/components/DropdownView.vue';\n import AnnotationItem from '@/components/panels/AnnotationItem.vue';\n import EmptyIndicator from '@/components/panels/EmptyIndicator.vue';\n import SwitchToggle from '@/components/SwitchToggle.vue';\n import { useAnnotationStore } from '@/stores/annotations';\n import { useCameraStore } from '@/stores/camera';\n import Annotation from '@/types/Annotation';\n import { annotationModes } from '@/types/AnnotationMode';\n import Download from '@/utils/Download';\n\n const annotations = useAnnotationStore();\n const cameraStore = useCameraStore();\n\n const annotationMode = ref<AnnotationMode>(annotations.getAnnotationMode());\n watch(annotationMode, newMode => {\n annotations.setAnnotationMode(newMode);\n });\n\n function downloadAnnotation(annotation: Annotation): void {\n const geojson = annotation.toGeoJSON();\n Download.downloadAsJson(geojson, `annotation-${annotation.title}.json`);\n }\n\n function exportAnnotations(): void {\n const geojson = Annotation.toCollection(annotations.getAnnotations());\n Download.downloadAsJson(geojson, 'annotations.json');\n }\n\n function goTo(annotation: Annotation): void {\n cameraStore.lookTopDownAt(annotation.object);\n }\n\n function importAnnotationFile(files: File[]): void {\n annotations.importAnnotationsFiles(files);\n }\n\n function setCurrentMode(src: Named | null): void {\n annotationMode.value = src?.value as AnnotationMode;\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <EmptyIndicator text=\"No annotations\" v-if=\"annotations.count === 0\" />\n\n <ul class=\"list-group list-group-flush flex-fill overflow-auto\">\n <AnnotationItem\n v-for=\"item in annotations.getAnnotations()\"\n :key=\"item.title\"\n :annotation=\"item\"\n :visible=\"item.visible\"\n v-on:update:visible=\"\n () => {\n item.visible = !item.visible;\n $forceUpdate();\n }\n \"\n v-on:edit=\"annotations.edit(item)\"\n v-on:stop-edit=\"annotations.stopEdition()\"\n v-on:delete=\"annotations.remove(item)\"\n v-on:download=\"downloadAnnotation(item)\"\n v-on:zoom=\"goTo(item)\"\n />\n </ul>\n\n <ButtonArea :disabled=\"annotations.isUserDrawing()\" id=\"annotations-fieldset\">\n <SwitchToggle\n v-bind:model-value=\"annotations.showLabels()\"\n v-on:update:model-value=\"v => annotations.setShowLabels(v)\"\n title=\"show labels\"\n >Show annotation labels</SwitchToggle\n >\n <DropdownView\n label=\"Picking mode\"\n description-position=\"top\"\n :current=\"annotationModes[0]\"\n :items=\"annotationModes\"\n @updated:current=\"src => setCurrentMode(src)\"\n class=\"mb-2\"\n />\n <ButtonWithIcon\n title=\"Add point annotation\"\n text=\"New points\"\n icon=\"bi-pin\"\n class=\"btn-primary\"\n @click=\"annotations.createPoint()\"\n />\n <ButtonWithIcon\n title=\"Add line annotation\"\n text=\"New line\"\n icon=\"bi-bezier2\"\n class=\"btn-primary\"\n @click=\"annotations.createLine()\"\n />\n <ButtonWithIcon\n title=\"Add polygon annotation\"\n text=\"New polygon\"\n icon=\"bi-heptagon\"\n class=\"btn-primary\"\n @click=\"annotations.createPolygon()\"\n />\n <ButtonWithIcon\n title=\"Export annotations to GeoJSON\"\n text=\"Export annotations\"\n icon=\"bi-box-arrow-right\"\n class=\"btn-outline-secondary\"\n @click=\"exportAnnotations\"\n />\n <ImportButton\n title=\"Import annotation from GeoJSON\"\n text=\"Import annotations\"\n @import=\"importAnnotationFile\"\n />\n </ButtonArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n defineProps({\n show: Boolean,\n title: String,\n });\n</script>\n\n<template>\n <div v-if=\"show\">\n <div class=\"background\"></div>\n <div\n :class=\"['modal', 'fade', 'd-block', show ? 'show' : null]\"\n id=\"exampleModal\"\n tabindex=\"-1\"\n aria-labelledby=\"exampleModalLabel\"\n aria-hidden=\"true\"\n >\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h1 class=\"modal-title fs-5\" id=\"exampleModalLabel\">{{ title }}</h1>\n <button\n type=\"button\"\n class=\"btn-close\"\n @click=\"$emit('close')\"\n data-bs-dismiss=\"modal\"\n aria-label=\"Close\"\n ></button>\n </div>\n <div class=\"modal-body\"><slot></slot></div>\n <div class=\"modal-footer\">\n <button\n type=\"button\"\n @click=\"$emit('close')\"\n class=\"btn btn-secondary\"\n data-bs-dismiss=\"modal\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .background {\n opacity: 0.5;\n position: absolute;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background-color: black;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps(['url', 'name']);\n defineEmits(['delete', 'share', 'goto']);\n</script>\n\n<template>\n <li class=\"list-group-item item d-flex d-flex-end\">\n <a class=\"bookmark\" href=\"#\" @click=\"$emit('goto')\">{{ name }}</a>\n <a href=\"#\" class=\"icon\" title=\"Share this bookmark\" @click=\"$emit('share')\">\n <i class=\"bi bi-share\"></i>\n </a>\n <a href=\"#\" class=\"icon\" title=\"Delete this bookmark\" @click=\"$emit('delete')\">\n <i class=\"bi bi-trash\"></i>\n </a>\n </li>\n</template>\n\n<style scoped>\n .item {\n padding: 0.1rem;\n }\n\n a {\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n .bookmark {\n width: 100%;\n }\n\n .icon {\n margin-left: 0.2rem;\n width: 1rem !important;\n color: rgb(180, 180, 180);\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n\n .spinner-container {\n width: 1rem;\n }\n\n .layer-name {\n width: 40%;\n margin-left: 1rem;\n }\n\n .slider {\n display: flex;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps<{\n url: string;\n }>();\n\n function copyToClipboard(url: string): void {\n void navigator.clipboard.writeText(url);\n }\n</script>\n\n<template>\n <div>\n <p>Use this link to share your bookmark</p>\n\n <div class=\"input-group mb-3\">\n <span class=\"form-control text-truncate\">{{ url }}</span>\n <span class=\"input-group-text\" id=\"basic-addon2\">\n <a\n title=\"Copy to clipboard\"\n href=\"#\"\n class=\"text-secondary\"\n @click=\"() => copyToClipboard(url)\"\n >\n <i class=\"bi bi-clipboard\"></i>\n </a>\n </span>\n </div>\n </div>\n</template>\n","import { EventDispatcher, Vector3 } from 'three';\n\nimport Download from '@/utils/Download';\n\nimport CameraPosition from './CameraPosition';\n\ntype BookmarkJson = {\n camera: [number, number, number];\n focalOffset: [number, number, number];\n target: [number, number, number];\n};\n\nexport type BookmarkEventMap = {\n delete: {\n /** empty */\n };\n goto: {\n /** empty */\n };\n};\n\nexport type SerializedBookmark = {\n title: string;\n url: string;\n};\n\nexport default class Bookmark extends EventDispatcher<BookmarkEventMap> {\n public readonly camera: CameraPosition;\n public readonly name: string;\n\n public constructor(name: string, camera: CameraPosition) {\n super();\n this.name = name;\n this.camera = camera;\n }\n\n public static new(name: string, urlString: string): Bookmark {\n const url = new URL(urlString);\n const view = url.searchParams.get('view');\n if (view === null) {\n throw new Error('Could not deserialize bookmark');\n }\n const json: BookmarkJson = JSON.parse(view);\n\n const camera = new Vector3(json.camera[0], json.camera[1], json.camera[2]);\n const target = new Vector3(json.target[0], json.target[1], json.target[2]);\n const focalOffset = new Vector3(\n json.focalOffset[0],\n json.focalOffset[1],\n json.focalOffset[2],\n );\n\n const cameraPosition = new CameraPosition(camera, target, focalOffset);\n\n return new Bookmark(name, cameraPosition);\n }\n\n public delete(): void {\n this.dispatchEvent({ type: 'delete' });\n }\n\n public getUrl(): URL {\n const base = Download.getBaseUrl() + '?';\n const cam = this.camera;\n const json: BookmarkJson = {\n camera: [cam.camera.x, cam.camera.y, cam.camera.z],\n focalOffset: [cam.focalOffset.x, cam.focalOffset.y, cam.focalOffset.z],\n target: [cam.target.x, cam.target.y, cam.target.z],\n };\n\n const url = new URL(base);\n const params = url.searchParams;\n\n params.set('tour', 'none');\n params.set('view', JSON.stringify(json));\n\n return url;\n }\n\n public goTo(): void {\n this.dispatchEvent({ type: 'goto' });\n }\n}\n","import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport { defineStore } from 'pinia';\nimport { Vector3 } from 'three';\nimport { computed, ref } from 'vue';\n\nimport { getLookAtTarget } from '@/configuration/lookAt';\nimport { getConfig } from '@/configurationLoader';\nimport { GLOBAL_EVENT_DISPATCHER } from '@/events';\nimport Bookmark from '@/types/Bookmark';\nimport CameraPosition from '@/types/CameraPosition';\n\nfunction buildInitialList(): Bookmark[] {\n const config = getConfig();\n\n if (config.bookmarks == null) {\n return [];\n }\n\n const result: Bookmark[] = [];\n\n for (const conf of config.bookmarks) {\n const lookAt = conf.lookAt;\n const pos = new Coordinates('EPSG:4326', lookAt.longitude, lookAt.latitude, lookAt.altitude)\n .as(config.scene.crs)\n .toVector3();\n\n const target = getLookAtTarget(pos, lookAt);\n\n const title = conf.title;\n\n const cameraPosition = new CameraPosition(\n new Vector3(pos.x, pos.y, pos.z),\n new Vector3(target.x, target.y, target.z),\n new Vector3(0, 0, 0),\n );\n\n result.push(new Bookmark(title, cameraPosition));\n }\n\n return result;\n}\n\nexport const useBookmarkStore = defineStore('bookmarks', () => {\n const bookmarks = ref<Set<Bookmark>>(new Set(buildInitialList()));\n const count = computed(() => bookmarks.value.size);\n\n function add(bookmark: Bookmark): void {\n bookmarks.value.add(bookmark);\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'bookmark-added', value: bookmark });\n }\n\n function remove(bookmark: Bookmark): void {\n bookmarks.value.delete(bookmark);\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'bookmark-removed', value: bookmark });\n }\n\n function clear(): void {\n bookmarks.value.clear();\n }\n\n function getBookmarks(): Bookmark[] {\n return [...bookmarks.value];\n }\n\n return { add, clear, count, getBookmarks, remove };\n});\n\nexport type BookmarkStore = ReturnType<typeof useBookmarkStore>;\n","<script setup lang=\"ts\">\n import { ref } from 'vue';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import ModalOverlay from '@/components/ModalOverlay.vue';\n import BookmarkItem from '@/components/panels/BookmarkItem.vue';\n import EmptyIndicator from '@/components/panels/EmptyIndicator.vue';\n import ShareBookmarkModal from '@/components/panels/ShareBookmarkModal.vue';\n import { useBookmarkStore } from '@/stores/bookmarks';\n import { useCameraStore } from '@/stores/camera';\n import { useNotificationStore } from '@/stores/notifications';\n import Bookmark, { type SerializedBookmark } from '@/types/Bookmark';\n import Download from '@/utils/Download';\n\n const showShareModal = ref(false);\n const shareUrl = ref<string | null>(null);\n const modalTitle = ref<string | null>(null);\n\n const notificationStore = useNotificationStore();\n const bookmarkStore = useBookmarkStore();\n const cameraStore = useCameraStore();\n\n function addBookmark(): void {\n const name = window.prompt('Bookmark name', 'New bookmark');\n if (name != null) {\n const bookmark = new Bookmark(name, cameraStore.getCameraPosition());\n bookmarkStore.add(bookmark);\n }\n }\n\n function exportBookmarks(): void {\n const json = [];\n for (const bookmark of bookmarkStore.getBookmarks()) {\n json.push({\n title: bookmark.name,\n url: bookmark.getUrl().toString(),\n });\n }\n Download.downloadAsJson(json, 'bookmarks.json');\n }\n\n function goTo(bookmark: Bookmark): void {\n cameraStore.setCameraPosition(bookmark.camera);\n }\n\n function importBookmarkFile(files: File[]): void {\n for (const file of files) {\n void importBookmarks(file);\n }\n }\n\n async function importBookmarks(file: Blob): Promise<void> {\n const str = await file.text();\n const serializedBookmarks: SerializedBookmark[] = JSON.parse(str);\n\n const existingBookmarks = new Set(bookmarkStore.getBookmarks().map(b => b.name));\n\n let nbImported = 0;\n let nbSkipped = 0;\n\n serializedBookmarks.forEach((bookmark: SerializedBookmark) => {\n if (!existingBookmarks.has(bookmark.title)) {\n bookmarkStore.add(Bookmark.new(bookmark.title, bookmark.url));\n nbImported++;\n } else {\n nbSkipped++;\n }\n });\n\n notificationStore.push({\n level: 'success',\n text: `${nbImported} bookmarks imported (${nbSkipped} skipped)`,\n title: 'Bookmarks',\n });\n }\n\n function shareBookmark(bookmark: Bookmark): void {\n shareUrl.value = bookmark.getUrl().toString();\n modalTitle.value = 'Share bookmark';\n showShareModal.value = true;\n }\n\n function shareCurrentView(): void {\n const temp = new Bookmark('temp', cameraStore.getCameraPosition());\n shareUrl.value = temp.getUrl().toString();\n modalTitle.value = 'Share current view';\n showShareModal.value = true;\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <EmptyIndicator text=\"No bookmarks\" v-if=\"bookmarkStore.count === 0\" />\n\n <ul class=\"list-group list-group-flush flex-fill overflow-auto\">\n <BookmarkItem\n v-for=\"bookmark in bookmarkStore.getBookmarks()\"\n :key=\"bookmark.name\"\n :name=\"bookmark.name\"\n v-on:share=\"shareBookmark(bookmark)\"\n v-on:delete=\"bookmarkStore.remove(bookmark)\"\n v-on:goto=\"goTo(bookmark)\"\n />\n </ul>\n\n <ButtonArea>\n <ButtonWithIcon\n text=\"New bookmark\"\n icon=\"bi-plus-lg\"\n title=\"Create a new bookmark from the current view\"\n class=\"btn-primary\"\n @click=\"\n () => {\n addBookmark();\n $forceUpdate();\n }\n \"\n />\n <ButtonWithIcon\n text=\"Share view\"\n icon=\"bi-share\"\n title=\"Share current view\"\n class=\"btn-outline-secondary\"\n @click=\"shareCurrentView\"\n />\n <ButtonWithIcon\n title=\"Export bookmarks to GeoJSON\"\n class=\"btn-outline-secondary\"\n @click=\"exportBookmarks\"\n icon=\"bi-box-arrow-right\"\n text=\"Export bookmarks\"\n />\n <ImportButton\n title=\"Import bookmarks from GeoJSON\"\n text=\"Import bookmarks\"\n @import=\"importBookmarkFile\"\n />\n </ButtonArea>\n </div>\n\n <!-- FIXME the modal popup background does not take the entire screen -->\n <!-- FIXME the modal popup slightly changes the layout of the page when it appears -->\n <ModalOverlay\n :show=\"showShareModal\"\n :title=\"modalTitle as string\"\n v-on:close=\"() => (showShareModal = false)\"\n >\n <ShareBookmarkModal :url=\"shareUrl as string\" />\n </ModalOverlay>\n</template>\n","<script setup lang=\"ts\">\n defineProps<{\n indentation?: string;\n }>();\n</script>\n\n<template>\n <ul class=\"list-group list-group-flush\">\n <slot></slot>\n </ul>\n</template>\n\n<style scoped>\n :slotted(li.list-group-item) {\n padding-top: 0;\n padding-bottom: 0;\n margin-left: 1rem;\n padding-left: 0;\n padding-right: 0;\n }\n</style>\n","<template>\n <div class=\"spinner-border spinner-border-sm text-secondary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { reactive, ref, watch } from 'vue';\n\n import type { Datagroup, Dataset } from '@/types/Dataset';\n\n import CompactList from '@/components/atoms/CompactList.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import IconListButton from '@/components/atoms/IconListButton.vue';\n import ListLabelButton from '@/components/atoms/ListLabelButton.vue';\n import DatasetOrGroupItem from '@/components/panels/DatasetOrGroupItem.vue';\n import SpinnerControl from '@/components/SpinnerControl.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n import { DatasetState } from '@/types/Dataset';\n\n const props = defineProps<{\n group: Datagroup;\n }>();\n\n defineEmits<{\n showParameters: [value: Dataset];\n 'update:visible': [ds: Dataset, visible: boolean];\n zoom: [value: Dataset];\n }>();\n\n const leafs = reactive(props.group.leafs());\n const hasLeafPreloading = ref(false);\n const hasLeafPreloaded = ref(false);\n const isVisible = ref(props.group.visibleSelf);\n watch(leafs, newValues => {\n hasLeafPreloading.value = newValues.some(v => v.state === DatasetState.Loading);\n hasLeafPreloaded.value = newValues.some(v => v.state === DatasetState.Loaded);\n isVisible.value = newValues.some(v => v.visibleSelf);\n });\n\n const id = MathUtils.generateUUID();\n const target = `#${id}`;\n const isEmpty = props.group.children.length === 0;\n</script>\n\n<template>\n <div class=\"d-flex\">\n <IconList class=\"me-1\">\n <IconListButton\n v-if=\"!isEmpty\"\n title=\"Expand group\"\n icon=\"bi-chevron-down\"\n data-bs-toggle=\"collapse\"\n class=\"me-1\"\n :data-bs-target=\"target\"\n :aria-controls=\"id\"\n aria-expanded=\"false\"\n />\n <IconListButton\n v-if=\"isEmpty\"\n style=\"opacity: 0%\"\n title=\"Expand group\"\n icon=\"bi-chevron-down\"\n data-bs-toggle=\"collapse\"\n class=\"me-1\"\n :data-bs-target=\"target\"\n :aria-controls=\"id\"\n aria-expanded=\"false\"\n />\n <VisibilityControl\n :visible=\"isVisible\"\n @update:visible=\"v => $emit('update:visible', group, v)\"\n />\n <IconList class=\"text-body-tertiary\">\n <i class=\"bi bi-folder2\" title=\"Group\" />\n </IconList>\n </IconList>\n <ListLabelButton\n class=\"label\"\n :disabled=\"!isVisible || !hasLeafPreloaded\"\n :text=\"group.name\"\n :title=\"`Zoom to ${group.name}`\"\n @click=\"$emit('zoom', group)\"\n />\n <IconList class=\"ms-1\">\n <div v-if=\"hasLeafPreloading\" class=\"icon spinner d-inline-block\">\n <SpinnerControl title=\"Loading...\" />\n </div>\n <!-- TODO -->\n <!-- <IconListButton\n v-if=\"\n hasLeafPreloaded &&\n (group.config.canMaskBasemap || group.config.isMaskingBasemap)\n \"\n title=\"Toggle basemap masking\"\n icon=\"bi-mask\"\n @click=\"$emit('update:toggle-mask', group)\"\n />\n <IconListButton\n v-if=\"hasLeafPreloaded\"\n title=\"Clip to\"\n icon=\"bi-bounding-box\"\n @click=\"$emit('clipTo', group)\"\n />\n <IconListButton\n v-if=\"hasLeafPreloaded\"\n title=\"Toggle 3D grid\"\n icon=\"bi-box\"\n @click=\"$emit('update:toggle-grid', group)\"\n /> -->\n </IconList>\n </div>\n\n <CompactList :id=\"id\" class=\"collapse\">\n <template v-if=\"!isEmpty\">\n <DatasetOrGroupItem\n v-for=\"dataset of group.children\"\n :key=\"dataset.name\"\n :dataset=\"dataset\"\n @zoom=\"ds => $emit('zoom', ds)\"\n @show-parameters=\"ds => $emit('showParameters', ds)\"\n @update:visible=\"(ds, v) => $emit('update:visible', ds, v)\"\n />\n </template>\n </CompactList>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n }\n</style>\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { ref } from 'vue';\n\n import Icon from '@/components/atoms/Icon.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import IconListButton from '@/components/atoms/IconListButton.vue';\n import ListLabelButton from '@/components/atoms/ListLabelButton.vue';\n import { datasetIcons, datasetTitles, propertyViews } from '@/components/Configuration';\n import SpinnerControl from '@/components/SpinnerControl.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n import { useDatasetStore } from '@/stores/datasets';\n import { type Dataset, DatasetState } from '@/types/Dataset';\n import { refAndWatch } from '@/utils/Components';\n\n const store = useDatasetStore();\n\n const props = defineProps<{\n dataset: Dataset;\n }>();\n\n defineEmits<{\n showParameters: [value: Dataset];\n 'update:visible': [ds: Dataset, visible: boolean];\n zoom: [value: Dataset];\n }>();\n\n const state = refAndWatch(props.dataset, 'state');\n const isVisible = refAndWatch(props.dataset, 'visibleSelf');\n\n function deleteDataset(): void {\n store.remove(props.dataset);\n }\n\n const id = MathUtils.generateUUID();\n const target = `#${id}`;\n\n const hovered = ref(false);\n</script>\n\n<template>\n <div\n class=\"d-flex entry-row\"\n v-on:mouseenter=\"() => (hovered = true)\"\n v-on:mouseleave=\"() => (hovered = false)\"\n >\n <IconListButton\n v-if=\"!propertyViews.has(dataset.type) || state !== DatasetState.Loaded\"\n style=\"opacity: 0%\"\n title=\"Expand group\"\n icon=\"bi-chevron-down\"\n data-bs-toggle=\"collapse\"\n class=\"me-1\"\n :data-bs-target=\"target\"\n :aria-controls=\"id\"\n aria-expanded=\"false\"\n />\n <IconListButton\n v-if=\"propertyViews.has(dataset.type) && state === DatasetState.Loaded\"\n title=\"Show dataset properties\"\n icon=\"bi-chevron-down\"\n data-bs-toggle=\"collapse\"\n class=\"me-1\"\n :data-bs-target=\"`#properties-${dataset.uuid}`\"\n :aria-controls=\"`properties-${dataset.uuid}`\"\n aria-expanded=\"false\"\n />\n <VisibilityControl\n :visible=\"isVisible\"\n @update:visible=\"v => $emit('update:visible', dataset, v)\"\n />\n <IconList class=\"text-body-tertiary\">\n <Icon\n :icon=\"datasetIcons[dataset.type] ?? 'bi-file-earmark-x'\"\n :title=\"datasetTitles[dataset.type] ?? 'Unknown'\"\n />\n </IconList>\n <div class=\"variable-width\">\n <ListLabelButton\n class=\"label\"\n :disabled=\"!isVisible || state !== DatasetState.Loaded\"\n :text=\"dataset.name\"\n :title=\"`Zoom to ${dataset.name}`\"\n @click=\"$emit('zoom', dataset)\"\n />\n <IconList class=\"ms-1\">\n <div v-if=\"state === DatasetState.Loading\" class=\"icon spinner d-inline-block me-1\">\n <SpinnerControl title=\"Loading...\" />\n </div>\n <div v-if=\"state === DatasetState.Failed\" class=\"d-inline-block\">\n <Icon\n class=\"text-secondary me-1\"\n icon=\"bi-exclamation-triangle-fill\"\n title=\"Failed to load\"\n />\n </div>\n\n <!-- Action buttons -->\n <div v-if=\"hovered\" class=\"float-end\">\n <!-- <IconListButton\n v-if=\"\n state === DatasetState.Loaded &&\n (('canMaskBasemap' in dataset.config &&\n dataset.config.canMaskBasemap) ||\n ('isMaskingBasemap' in dataset.config &&\n dataset.config.isMaskingBasemap))\n \"\n title=\"Toggle basemap masking\"\n icon=\"bi-mask\"\n @click=\"$emit('update:toggle-mask', dataset)\"\n /> -->\n\n <IconListButton\n v-for=\"action in store.getCustomActions(dataset, {\n isVisible,\n isPreloaded: state === DatasetState.Loaded,\n })\"\n :key=\"action.title\"\n :title=\"action.title\"\n :icon=\"action.icon\"\n @click=\"action.action(dataset)\"\n />\n\n <!-- <IconListButton\n v-if=\"state === DatasetState.Loaded\"\n title=\"Toggle 3D grid\"\n icon=\"bi-box\"\n @click=\"$emit('update:toggle-grid', dataset)\"\n /> -->\n <IconListButton\n title=\"Delete this dataset\"\n icon=\"bi-trash\"\n @click=\"deleteDataset\"\n />\n <IconListButton\n v-if=\"state === DatasetState.Loaded\"\n title=\"Parameters\"\n icon=\"bi-gear\"\n @click=\"$emit('showParameters', dataset)\"\n />\n </div>\n </IconList>\n </div>\n </div>\n <!-- Property view -->\n <div\n v-if=\"propertyViews.has(dataset.type)\"\n class=\"collapse m-2 ms-4 p-2 border rounded\"\n :id=\"`properties-${dataset.uuid}`\"\n >\n <component :is=\"propertyViews.get(dataset.type)\" :dataset=\"dataset\"></component>\n </div>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n float: start;\n overflow: hidden;\n /* max-width: 14rem; */\n }\n\n .variable-width {\n display: flex;\n width: 100%;\n }\n\n .entry-row:hover {\n background-color: rgba(0, 136, 82, 0.05);\n }\n\n .parameters {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: red;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Dataset, DatasetOrGroup } from '@/types/Dataset';\n\n import DatagroupItem from '@/components/panels/DatagroupItem.vue';\n import DatasetItem from '@/components/panels/DatasetItem.vue';\n import { Datagroup } from '@/types/Dataset';\n\n defineProps<{\n dataset: DatasetOrGroup;\n }>();\n\n defineEmits<{\n showParameters: [value: Dataset];\n 'update:visible': [ds: Dataset, visible: boolean];\n zoom: [value: Dataset];\n }>();\n</script>\n\n<template>\n <li class=\"list-group-item\">\n <DatagroupItem\n v-if=\"Datagroup.isGroup(dataset)\"\n :group=\"dataset\"\n @zoom=\"ds => $emit('zoom', ds)\"\n @show-parameters=\"ds => $emit('showParameters', ds)\"\n @update:visible=\"(ds, v) => $emit('update:visible', ds, v)\"\n />\n <DatasetItem\n v-else\n :dataset=\"dataset\"\n @show-parameters=\"ds => $emit('showParameters', ds)\"\n @zoom=\"ds => $emit('zoom', ds)\"\n @update:visible=\"(ds, v) => $emit('update:visible', ds, v)\"\n />\n </li>\n</template>\n","<script setup lang=\"ts\">\n const props = defineProps<{\n label: string;\n max?: number;\n min?: number;\n modelValue: number;\n showNumericInput?: boolean;\n step?: number;\n }>();\n defineEmits(['update:modelValue']);\n</script>\n\n<template>\n <div class=\"d-flex py-1\">\n <div class=\"row w-100\">\n <div class=\"col-auto my-auto text-start\">{{ props.label }}</div>\n <div class=\"col\">\n <input\n type=\"range\"\n :min=\"props.min ?? 0\"\n :max=\"props.max ?? 1\"\n :step=\"props.step ?? 0.01\"\n :value=\"props.modelValue\"\n @input=\"\n e =>\n $emit('update:modelValue', (e.target as HTMLInputElement).valueAsNumber)\n \"\n class=\"form-range ms-2 h-100\"\n id=\"range1\"\n />\n </div>\n <div class=\"col-4\" v-if=\"showNumericInput === true\">\n <input\n type=\"number\"\n :min=\"props.min ?? 0\"\n :max=\"props.max ?? 1\"\n :step=\"props.step ?? 0.01\"\n :value=\"props.modelValue\"\n @input=\"\n e =>\n $emit('update:modelValue', (e.target as HTMLInputElement).valueAsNumber)\n \"\n class=\"form-control ms-2\"\n id=\"range1\"\n />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { Dataset } from '@/types/Dataset';\n\n import { useDatasetStore } from '@/stores/datasets';\n import { refAndWatch } from '@/utils/Components';\n\n import ButtonWithIcon from '../atoms/ButtonWithIcon.vue';\n import Slider from '../atoms/Slider.vue';\n import CheckboxToggle from '../CheckboxToggle.vue';\n import { datasetTitles } from '../Configuration';\n\n const props = defineProps<{\n dataset: Dataset;\n }>();\n\n defineEmits<{\n backToDatasets: [];\n }>();\n\n const ds = props.dataset;\n const store = useDatasetStore();\n const opacity = refAndWatch(props.dataset, 'opacity');\n const visible = refAndWatch(props.dataset, 'visibleSelf');\n</script>\n\n<template>\n <ButtonWithIcon\n title=\"Back to datasets\"\n text=\"Back to datasets\"\n icon=\"bi-arrow-left\"\n class=\"btn-outline-secondary\"\n @click=\"$emit('backToDatasets')\"\n />\n <div class=\"card mt-3\">\n <div class=\"card-header\">\n {{ dataset.name }}\n </div>\n <form class=\"card-body\">\n <fieldset>\n <div class=\"mb-2 row\">\n <span class=\"float-start col\">Type</span>\n <span class=\"badge text-bg-secondary col-auto\">{{\n datasetTitles[dataset.config.type]\n }}</span>\n </div>\n\n <hr />\n\n <div class=\"container\">\n <div class=\"row\">\n <CheckboxToggle\n :model-value=\"visible\"\n @update:model-value=\"v => store.setVisible(ds, v)\"\n title=\"Visible\"\n >Visible</CheckboxToggle\n >\n </div>\n\n <Slider\n class=\"row\"\n :model-value=\"opacity\"\n label=\"Opacity\"\n :min=\"0\"\n :step=\"0.01\"\n :max=\"1\"\n @update:model-value=\"v => store.setOpacity(ds, v)\"\n />\n </div>\n </fieldset>\n </form>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { Vector3 } from 'three';\n import { ref } from 'vue';\n\n import type { Dataset, DatasetOrGroup } from '@/types/Dataset';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import CompactList from '@/components/atoms/CompactList.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import DatasetOrGroupItem from '@/components/panels/DatasetOrGroupItem.vue';\n import { useBasemapStore } from '@/stores/basemap';\n import { useCameraStore } from '@/stores/camera';\n import { useDatasetStore } from '@/stores/datasets';\n\n import Slider from '../atoms/Slider.vue';\n import CheckboxToggle from '../CheckboxToggle.vue';\n import DatasetParameters from './DatasetParameters.vue';\n import EmptyIndicator from './EmptyIndicator.vue';\n\n const datasets = useDatasetStore();\n const camera = useCameraStore();\n const basemap = useBasemapStore();\n const showParameters = ref<Dataset>();\n\n function importDataset(files: File[]): void {\n for (const file of files) {\n datasets.importFromFile(file);\n }\n }\n\n function importDatasetFromUrl(): void {\n const url = document.getElementById('dataset-import-url') as HTMLInputElement;\n datasets.importFromFile(url.value);\n }\n\n function showParams(ds: Dataset): void {\n showParameters.value = ds;\n }\n\n function zoomOnDataset(dataset: DatasetOrGroup): void {\n const box = datasets.getBoundingBox(dataset);\n if (!box?.isEmpty()) {\n const [width, height] = box.getSize(new Vector3()).toArray();\n const margin = Math.max(width, height) * 0.1;\n const scaledBox = box.clone().expandByScalar(margin);\n camera.lookTopDownAt(scaledBox);\n }\n }\n</script>\n\n<template>\n <div v-if=\"showParameters != null\" class=\"d-flex flex-column h-100\">\n <DatasetParameters\n @back-to-datasets=\"showParameters = undefined\"\n :dataset=\"showParameters\"\n />\n </div>\n\n <div v-if=\"showParameters == null\" class=\"d-flex flex-column h-100 px-2\">\n <div v-if=\"datasets.count > 0\" class=\"flex-fill overflow-auto\">\n <!-- The margin counteracts the indentation for the root element -->\n <CompactList style=\"margin-left: -1rem\">\n <DatasetOrGroupItem\n v-for=\"dataset of datasets.getTree()\"\n :key=\"dataset.name\"\n :dataset=\"dataset\"\n @updated=\"$forceUpdate()\"\n @zoom=\"ds => zoomOnDataset(ds)\"\n @show-parameters=\"ds => showParams(ds)\"\n @update:visible=\"(ds, v) => datasets.setVisible(ds, v)\"\n />\n </CompactList>\n </div>\n <div v-else class=\"flex-fill\"><EmptyIndicator text=\"No datasets\" /></div>\n\n <hr />\n\n <div class=\"my-1\">\n <CheckboxToggle\n :model-value=\"basemap.visible\"\n @update:model-value=\"v => basemap.setVisible(v)\"\n title=\"Show basemap\"\n >Show basemap</CheckboxToggle\n >\n\n <Slider\n :model-value=\"basemap.opacity\"\n label=\"Basemap opacity\"\n :show-numeric-input=\"false\"\n :min=\"0\"\n :step=\"0.01\"\n :max=\"1\"\n @update:model-value=\"v => basemap.setOpacity(v)\"\n />\n </div>\n\n <ButtonArea>\n <div class=\"input-group mb-3\">\n <input\n type=\"text\"\n id=\"dataset-import-url\"\n class=\"form-control\"\n placeholder=\"https://\"\n aria-label=\"URL to import\"\n aria-describedby=\"button-dataset-import-url\"\n />\n <button\n @click=\"importDatasetFromUrl\"\n class=\"btn btn-sm btn-outline-secondary\"\n type=\"button\"\n id=\"button-dataset-import-url\"\n >\n Import URL\n </button>\n </div>\n\n <ImportButton title=\"Import file\" text=\"Import file\" @import=\"importDataset\" />\n </ButtonArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type Measure from '@/types/Measure';\n\n import VisibilityControl from '../VisibilityControl.vue';\n\n defineProps<{\n measure: Measure;\n visible: boolean;\n }>();\n defineEmits(['delete', 'download', 'update:visible', 'zoom']);\n</script>\n\n<template>\n <li class=\"list-group-item item\">\n <div class=\"d-flex\">\n <VisibilityControl\n :visible=\"visible\"\n v-on:update:visible=\"v => $emit('update:visible', v)\"\n />\n\n <a class=\"title\" :title=\"measure.title\" href=\"#\" @click=\"$emit('zoom')\"\n >{{ measure.title }} ({{ measure.object.length.toFixed(2) }}m)</a\n >\n\n <div class=\"icons\">\n <a href=\"#\" class=\"icon\" title=\"Delete\" @click=\"$emit('delete')\">\n <i class=\"bi bi-trash\"></i>\n </a>\n </div>\n </div>\n </li>\n</template>\n\n<style scoped>\n .item {\n padding: 0.1rem;\n }\n\n a {\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n .icons {\n display: flex;\n }\n\n .title {\n white-space: nowrap;\n display: block;\n width: 100% !important;\n margin-left: 1rem;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .icon {\n padding-left: 0.4rem;\n color: rgb(180, 180, 180);\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n</style>\n","import type Named from './Named';\n\ntype MeasurementMode = 'laser';\n\ntype MeasurementNamed = Named & {\n value: MeasurementMode;\n};\n\nexport const measurementModes: MeasurementNamed[] = [\n {\n description:\n 'Will automatically beam perpendicularly to the selected point until a geometry is hit',\n name: 'Laser',\n value: 'laser',\n },\n] as const;\n\nexport default MeasurementMode;\n","<script setup lang=\"ts\">\n import { ref, watch } from 'vue';\n\n import type MeasurementMode from '@/types/MeasurementMode';\n import type Named from '@/types/Named';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import DropdownView from '@/components/DropdownView.vue';\n import EmptyIndicator from '@/components/panels/EmptyIndicator.vue';\n import MeasurementItem from '@/components/panels/MeasurementItem.vue';\n import { useCameraStore } from '@/stores/camera';\n import { useMeasurementStore } from '@/stores/measurement';\n import Measure from '@/types/Measure';\n import { measurementModes } from '@/types/MeasurementMode';\n import Download from '@/utils/Download';\n\n const measures = useMeasurementStore();\n const cameraStore = useCameraStore();\n\n const measurementMode = ref<MeasurementMode>(measures.getMeasurementMode());\n watch(measurementMode, newMode => {\n measures.setMeasurementMode(newMode);\n });\n\n function downloadMeasure(measure: Measure): void {\n const geojson = measure.toGeoJSON();\n Download.downloadAsJson(geojson, `measure-${measure.title}.json`);\n }\n\n function exportMeasures(): void {\n const geojson = Measure.toCollection(measures.getMeasures());\n Download.downloadAsJson(geojson, 'measures.json');\n }\n\n function goTo(measure: Measure): void {\n cameraStore.lookTopDownAt(measure.object);\n }\n\n function importMeasureFile(files: File[]): void {\n measures.importMeasureFiles(files);\n }\n\n function setCurrentMode(src: Named | null): void {\n measurementMode.value = src?.value as MeasurementMode;\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <div class=\"alert alert-warning py-2\" role=\"alert\">\n <i class=\"bi bi-cone-striped\"></i> This feature is experimental\n </div>\n\n <EmptyIndicator text=\"No measurements\" v-if=\"measures.count === 0\" />\n\n <ul class=\"list-group list-group-flush flex-fill overflow-auto\">\n <MeasurementItem\n v-for=\"item in measures.getMeasures()\"\n :key=\"item.title\"\n :measure=\"item\"\n :visible=\"item.visible\"\n v-on:update:visible=\"\n () => {\n item.visible = !item.visible;\n $forceUpdate();\n }\n \"\n v-on:delete=\"measures.remove(item)\"\n v-on:download=\"downloadMeasure(item)\"\n v-on:zoom=\"goTo(item)\"\n />\n </ul>\n\n <ButtonArea id=\"measures-fieldset\">\n <DropdownView\n label=\"Mode\"\n description-position=\"top\"\n :current=\"measurementModes[0]\"\n :items=\"measurementModes\"\n @updated:current=\"src => setCurrentMode(src)\"\n class=\"mb-2\"\n />\n <ButtonWithIcon\n v-if=\"measures.isUserMeasuring()\"\n title=\"Stop measuring\"\n text=\"Stop measuring\"\n icon=\"bi-stop-circle\"\n class=\"btn-primary\"\n @click=\"measures.end()\"\n />\n <ButtonWithIcon\n v-else\n title=\"Start measuring\"\n text=\"Start measuring\"\n icon=\"bi-rulers\"\n class=\"btn-primary\"\n @click=\"measures.start()\"\n />\n <ButtonWithIcon\n title=\"Export measures to GeoJSON\"\n class=\"btn-outline-secondary\"\n @click=\"exportMeasures\"\n icon=\"bi-box-arrow-right\"\n text=\"Export measures\"\n />\n <ImportButton\n title=\"Import measures from GeoJSON\"\n text=\"Import measures\"\n @import=\"importMeasureFile\"\n />\n </ButtonArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { PanelType } from './Configuration';\n\n import getConfigurationPanels from './Configuration';\n import AboutPanel from './panels/AboutPanel.vue';\n import AnalysisPanel from './panels/AnalysisPanel.vue';\n import AnnotationPanel from './panels/AnnotationPanel.vue';\n import BookmarkPanel from './panels/BookmarkPanel.vue';\n import DatasetPanel from './panels/DatasetPanel.vue';\n import MeasurementPanel from './panels/MeasurementPanel.vue';\n\n defineProps<{\n /**\n * The name of the panel (must match the tooltip\n * of the corresponding tool in the toolbar)\n */\n selected: PanelType | null;\n }>();\n\n const panels = getConfigurationPanels();\n const gitCommit = import.meta.env.VITE_GIT_COMMIT;\n</script>\n\n<template>\n <div class=\"panel\" id=\"panel-container\">\n <h5 class=\"title\">\n {{ panels.find(p => p.key === selected)?.title }}\n <span\n v-if=\"selected === 'about'\"\n class=\"badge text-bg-primary rounded-pill float-end\"\n title=\"Version\"\n >Version: {{ gitCommit }}</span\n >\n </h5>\n <div class=\"content\">\n <DatasetPanel v-if=\"selected === 'data'\" />\n <AboutPanel v-if=\"selected === 'about'\" />\n <BookmarkPanel v-if=\"selected === 'bookmarks'\" />\n <AnalysisPanel v-if=\"selected === 'analysis'\" />\n <AnnotationPanel v-if=\"selected === 'annotations'\" />\n <MeasurementPanel v-if=\"selected === 'measures'\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n .title {\n margin: 1rem;\n }\n\n .content {\n flex-grow: 1;\n overflow: auto;\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .panel {\n border-color: var(--bs-border-color);\n border-width: 0 2px 0 2px;\n border-style: solid;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps({\n progress: {\n required: true,\n type: Number,\n },\n });\n</script>\n\n<template>\n <div\n class=\"progress\"\n role=\"progressbar\"\n aria-label=\"Progress\"\n :aria-valuenow=\"progress * 100\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div\n v-if=\"progress != 1\"\n class=\"progress-bar progress-bar-striped progress-bar-animated\"\n :style=\"`width: ${progress * 100}%`\"\n ></div>\n </div>\n</template>\n\n<script lang=\"ts\">\n export default {\n methods: {\n tick(): void {\n this.$forceUpdate();\n },\n },\n };\n</script>\n","import { defineStore } from 'pinia';\nimport { computed, shallowRef } from 'vue';\n\nimport type { SearchProvider } from '@/api/search';\n\nexport const useSearchStore = defineStore('search', () => {\n const providers = shallowRef<SearchProvider[]>([]);\n const searchProviderCount = computed(() => providers.value.length);\n\n function registerProvider(provider: SearchProvider): void {\n if (!providers.value.includes(provider)) {\n providers.value.push(provider);\n }\n }\n\n function getProviders(): SearchProvider[] {\n return [...providers.value];\n }\n\n return {\n getProviders,\n registerProvider,\n searchProviderCount,\n };\n});\n\nexport type SearchStore = ReturnType<typeof useSearchStore>;\n","<script setup lang=\"ts\">\n // @ts-expect-error autocomplete-vue does not provide typing\n import Autocomplete from '@trevoreyre/autocomplete-vue';\n\n import type { SearchResult } from '@/api/search';\n\n import Icon from '@/components/atoms/Icon.vue';\n import { useSearchStore } from '@/stores/search';\n\n const emits = defineEmits<{\n resultSelected: [value: SearchResult];\n }>();\n\n const store = useSearchStore();\n\n function getResultValue(result: SearchResult): string {\n return result.label;\n }\n\n async function search(query: string): Promise<SearchResult[]> {\n if (query.length < 3) {\n return Promise.resolve([]);\n }\n\n const providers = store.getProviders();\n\n const promises = providers.map(p => p.search(query));\n\n const allResults = await Promise.all(promises);\n\n return allResults.flatMap(x => x);\n }\n\n function submitResult(result: SearchResult): void {\n emits('resultSelected', result);\n }\n</script>\n\n<template>\n <div class=\"main\">\n <autocomplete\n :debounceTime=\"500\"\n :search=\"search\"\n :getResultValue=\"getResultValue\"\n @submit=\"submitResult\"\n id=\"search-place-autocomplete\"\n placeholder=\"Search...\"\n >\n <template #result=\"{ result, props }\">\n <li v-bind=\"props\" class=\"autocomplete-result result overflow-hidden\">\n <div class=\"row\">\n <span class=\"col-auto ms-3 my-auto\"\n ><Icon icon=\"fg-poi\" title=\"Location\"\n /></span>\n <div class=\"col-auto\">\n <span>{{ result.label }}</span>\n <p class=\"provider\">{{ result.provider.name }}</p>\n </div>\n </div>\n <div class=\"wiki-snippet\" :v-html=\"result.snippet\"></div>\n </li>\n </template>\n </autocomplete>\n </div>\n</template>\n\n<style scoped>\n .main {\n padding-top: 0.5rem;\n }\n\n .result {\n border-top: 1px solid #eee;\n padding: 2pt;\n background: transparent;\n }\n\n .provider {\n font-size: 12px;\n opacity: 60%;\n margin: 0;\n }\n\n .result:hover {\n background: lightgray;\n }\n\n .result-type {\n padding-left: 5pt;\n padding-right: 6pt;\n }\n\n .result-label {\n font-size: 14px;\n }\n</style>\n","<script setup lang=\"ts\">\n import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n import { computed, ref } from 'vue';\n\n import CoordinateFragment from './CoordinateFragment.vue';\n\n const props = defineProps<{\n crs?: string;\n x: number;\n y: number;\n z: number;\n }>();\n\n const latlon = computed(() =>\n new Coordinates(props.crs ?? 'EPSG:3857', props.x ?? 0, props.y ?? 0, props.z ?? 0).as(\n 'EPSG:4326',\n ),\n );\n\n const isGeographic = ref(true);\n\n const formatAltitude = (z: number): string => {\n const decimals = Math.round((z + 0) * 10);\n return (decimals / 10).toFixed(1);\n };\n</script>\n\n<template>\n <div class=\"d-flex\">\n <a\n class=\"coordinates\"\n href=\"#\"\n @click=\"() => (isGeographic = !isGeographic)\"\n title=\"Toggle coordinate systems\"\n >\n <i :class=\"isGeographic ? 'fg-globe' : 'fg-grid'\" class=\"text-secondary me-2\"></i>\n <span class=\"text-muted crs\">{{ isGeographic ? 'lat/lon' : crs }}</span>\n </a>\n\n <CoordinateFragment v-if=\"!isGeographic\" :value=\"x.toFixed(0)\" prefix=\"X\" />\n <CoordinateFragment v-if=\"!isGeographic\" :value=\"y.toFixed(0)\" prefix=\"Y\" />\n\n <CoordinateFragment\n v-if=\"isGeographic\"\n :value=\"latlon.latitude.toFixed(4)\"\n prefix=\"Lat\"\n suffix=\"°\"\n />\n <CoordinateFragment\n v-if=\"isGeographic\"\n :value=\"latlon.longitude.toFixed(4)\"\n prefix=\"Lon\"\n suffix=\"°\"\n />\n\n <CoordinateFragment v-if=\"z != null\" :value=\"formatAltitude(z)\" prefix=\"Alt\" suffix=\"m\" />\n </div>\n</template>\n\n<style scoped>\n i {\n font-size: small;\n }\n\n span {\n font-size: x-small;\n }\n\n .crs {\n width: 4rem;\n height: 100%;\n }\n\n .coordinates {\n height: 100%;\n margin: 0;\n margin-left: 0.5em;\n padding: 0;\n font-size: small;\n vertical-align: middle;\n align-self: center;\n align-content: center;\n }\n div {\n margin-left: 1rem;\n }\n</style>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGkAAACQCAYAAAALH0XrAAAACXBIWXMAABQLAAAUCwHr6IzdAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAIABJREFUeJztXXl8VNXZft5z72SZCGGTxYUoqLjQKhozk+AWl7aubbXGisJkWMS2n9S6VIRMxsmCO23p11qqkExAq2hVsGr9qqKiWSBSFZAd2URZw5Z17j3v98dkwqx3lkwSEJ/fj9+POfece87kmXvPOe953+clZsaxgOumTEnd0+vQOaTgXGIeSeAsZtGfiQcSMABAfwBpAA74NfMQsIuBHQC+JaLtkPylzrRqwKFeq9+aNau1R75MnKCjlSTLNFt/UpAPiKtBfDkYZwJQktiFDuBLBr1VV1ox9bopU1KPVtLUnh6AP6wO+5kE3MHgG0ihUQAEwEDX/I4UAD8g4v8FgH2Zh9xWh+1EgF5VVeW1j51zdnRJrwmgx5+kbNeYAYpu+iUx3QHA2q2dM/5TV+7+MTOz1WH7O0CT2q9IADVMNL+lWZ/3+ZNVjd06riD02JNkcYw7nUjcq3LKJADpPTCEg5qJJ3L7r5SIGvx+rwLAaGIenZ4mHrcWF1YqUp35SdlzW3pgnN1PUl6xbZTONJUgbgEndY6JCwR6oN5ZudX3mRn7I1TtDcYUnbRfWxyFrwrIR2pKq1Z30zABdOPr7hLXhJM0j+4EYSK8v9QeAzHeqy13X8N+X95SbL+bmJ+JobkGxlxpIudSZ8W3XTjMDnT5k5R3X0E6m833M2EqCBld1M1BMHYx4RAxMjtKvf0NCq7rMfF4Dvp1CikbmCiWvlQQ7hIa/9LqKHxMNDb9sXrmguZOfwMDdOmTZCm2X0rMbgCnJ+F2+8C0DMQrGVitMK/QTGKr3JGyt372bE+kRiNdBSlpSB8sJJ2pSDpXSt5UV175ZshYneN+TFL8O4FxrWaW4+rKquoTaBsTuoSkka6ClBP0dBeYHkTiexsPgA8J/K5kfm+pafhydjplEocZgLwiW44kqkuwucbgMrO6tXyxc7GW1IGhC0jKdYw7hyHmA7gwwSHVMcn5qZry0kcz5u5O6uAMkHdfQbo0Z0wG8UQA5yVyDwKWMeiO2tKK9ckcW1JJskwvvJ4EXgDQO552DLSCMU+R9HT1jIo1SRtQgrAU23KJaRKAOwCkxNm8QQrcutRV+V6yxpM0knKLbPcx0ROI7/V2mAh/9ej6H+vL530Tb5+jXPY+aW00DELvJxm9BMjMAhkMOiyYD0uIwyT1PaqmfvXx43MOxXv/bJdtqKqJaQDbER9ZGhPdU1dS8bd4+wyHTpOU78pXmzxZz5B3aR0rJBhVGuvTYiUnx2UfLHRcwcyXETASwAgAA+Poczsx1kriL4npQ83U9mG984U9sTQcXTQxS4f2CAg2ADEtAQGAwX/OWtv8uwULFuhxjDMEnSIp35WvNmtZ/wDwizia1UqiKUtLKpZFq5gz3X6BEHwnCNeDcXbCAw0PCeALgP8Difm15e4vojWwFNsvJfDfwDg39m543tC1zfbOEJUwSQkQ5GHmR7LWNT9uNOA818R+rHkmMWgsEpzAEwED/yWwm3XMr5vh3hup3khXQUovzfwgA8WI8RVIIHetetr4RFenCZFUUFCgbB1hngfg9th6wRoAd9aWVH4aqYp1+qRBJLRfMfhewG9D2v1oBGGOqiiPG1nCrcWFF4HxMmLdAzIq60ynT0iEqIRIynUUPsfAhJg6ILzW1CzHRrIkX/rwHX01xVTChLsQ/0qqK9EMwrNCUV3Vzuf2hauQ55rYT+paFRjXx3JDBv+5rtQ9Jd6BxE2S1VF4P4CnYhoT8FidenpRuF8PEVGOwzaWGE8ivgVAd2MfCA/XlbqfDTYlAd7vYXXYHmPG72O5GYPvrit1z45nAHGRZHHYbiDQ64i+zNaYMKGupLIq3MVcl/001ng+gNGxD7WHwVgsTcrEpc45m8Jdbt+CPIXoqz+PIHlNdUnVh7F2HTNJ1mnjz4UiawH0ilJVI8IdNSWVC8JdzHXYb2bwswD6xTrIowgHAZ5QW+p+JdxFS3HhOGLMQXTD9R5S6eIaZ8XmWDqNiaSRroKUEzRzHYALolSNSFC+K19t0rJmEfCrWAZ2FINBeDpd2fJwODudpchmI6IKRH+ilqarW0bHYuuL6VwnQ8soQXSCGEzjwxF0/oPjMpr1rNe/AwQBAIHxQLM2dGG2a7I5+GJdmduN2OannBYt66GYOoz2JLUfNyxGtHmIUFZbUukIaT/N1p8UegNAbiwDOsawRPOk3lj/2OwDwResDtsTAD0YpX0bk5JTVzLnc6NKhk9S3n0F6e3nQdEWCq/UlbqLgwst02z9SaWP8N0kCAAuVUytiy3TbP2DL9Spw6aC6Z0o7VOINfdIV4Hh1sOQJJmR8QCib9ZWaWqqLXh5mu2abIaCRfGZUI49EDCKFHor+NXHTqfUTK13AtgW5Q7nZ3jM9xrViEhSXpHtZICjvTPbpKQ7652zm/wLr5syJVXVWt4gUF6U9t8V5Khay7yCgoKAN06984U9THwbvAeYEUGEh7NdYwZEuh6RJEn0GGDsk8AMx9Lyis+Cy/f1PjQToCuN2n73QDdvG2F+Mri0rsRdA/BjURr3UfWUkPnch7AkWYsLL4L3wCsiGFydta7p6eDy3OLCAhD/OsqgvpNg4F5rke2nweX9DmSWA7w2SuO781xjzwh3KSxJ7SYOo3W+FFK5J9iafbFjwghmPGc4mO82CERzvFPFEbw1a1arIJ4MY4fpFF1THgl3IYSk0Y7C4QTcYjwSVNSUz10eUOZyCQFtLqJbJL7r6C9B84gC/cO8ZiCeb9SQgIJggoEwJGnA/TBech/ySD3k/ZmjbZp0HC0UjEHItzjGhUwXpIpiAG0GLU0sRMhUEUBStmvMAAJsRv0zMCv4yNs6fdIgAj1qPPLjDExPZU+dHHAuVuOs2AxGpWEz5snBy/kAkhTd9EsAIaYOP7SQNP05pJQ8JQD6Rhn28YZBakprUXChhChjwCgOqr9Jawt4CgNIIqYxht0yqmrLn93pX5RTNP5UEAqjDvk4BDPuyZ4+doh/2dKyudsAhLWid7QDj/X/3EFSjmvCMBjHB7FOyszgQkHyIRxdJ6pHDQhIVYVyT0g5czRXr9H+5HaQpHj0MTBedlcvK50TsNbPcdkHI8Zj9GTi3BHX4L6bH8SNuWNw7mkWmNOO6gXlr4Pnptoy98cAVhi0EapQbvZ96DickoSbDQ9AiF8ILlI0aWNQWuzjTQ62Nm3E8EGjYT1jFIBRkAzsaGjGhp37sH7Hdqzfvhpbd62G5C5zHY8HmSa1ZQKAgLcQgZ5l8KxIjRh0K4C/AO0k5bkm9iPgfIOOPCma8nJoMd2ZwKA7BRLpEEoTqpYux/1XXQoAEASc0i8dp/Q7GVecczIACw626FixdTdWbNmIFV99it37o9g5uxCS6E4EkcSq5zVo6p8Q4e1F4Ess02z962a49woA0D2ey2FkEWd6P9h5PqfYfjF7PUm7FZTmPXVfvWclPHpkf8PeaQpGnzUYd18zGn+5awr+NLkM43/8G1x01hVQ1dTuGi4Ar6X84unjAv5Wtc752wEsj9AEABQhRB7ge90R8o174f8EFwk2tu11FURqOoDDADXh5eWrMObiH8bUbkhmKoacfxp+cv5paPZci2WbvkXN6v/is02fQNcMjdRJgaootwOYHlDIWATCRZHaSMJoAG8IACDQFYY9ED4ILeQfxTvQZECkHHngP9ocYoCPCekmgctGnISHfnY9nrm7BHdcOQlD+g9L1hDDgplvDCmDfMuoDYFHAwD98IGxGelp4iAiv+4ODF3b1N/fmJo9fewQVShfIw7n9WTBfPIwqKYjx1djR92Ky88c2un7MoAvtjTgreWf4LONS8Ay6YsOVlQ5+BNn1S5fQfbkySZ1YOsBRIi+Z6DVrFIfkZFK58HwhJY/CbZ2m0i5Ej1AEISAorYEFL2xMjlRkATg/Ky+ePjnN6DkziKck2VJyn39u9A94lL/gvrZsz0M/q/BmFJb2uhcoRP9wPjW9GVwEQOXJTzUToDUTBAF/sL3e7Zg874QP5BOYcTgXnDd9gs8fNvDOGnAmUm7LwFXhJQRLTVqw0IfJggYbnhjpnVheuu2aAd/iJRwfvwS85dFjaJJCKOy+uHpwkmwXXM30lKMTJqxgSl0NcySDSdWZhomGDB8oRPpoSQh6bFCMUGkhLc+fdWwGo1tSY8nBgAognD9qOGYMW4qTh3U6a99VnCBIGGoskJEwwRFIUkopoAg3cumjT8RXtmybocwhS8n0Ybnl0Z8tScFp/RLx6N3jMcVF9zUmducdMlDEwJsWBK6sRQO8zABMv6D78ehgJDFVlUPew7fHRBK5BXXsq8/g+wiOS8fUlTCr390KWzX3A1BiYm6tKkyYHrRd6Vvh1fWLTwIgwTY8ByoZaVzQcBJIrHosXMjVY18DMN0EP9etaFbxnH9qOH4n5vuhaJGeLQNIFQZ8PdrFwqJGFkIhlnAIKqOgZCIbWLZMyZnkQYSxpaBf6+JGEiYdFwyYgim3PhbKCI+5R+SFPL3I6AlXN32i2YB4zCNgyElomccTSglereN+g6s+iamgPKkIPfMQZj4k/hiECTRCcFlUU5qzQLxKmZJ6vxaNAGQKbokHoHxj/pElWcSw1Ujh+I6yy9jri841OGUDEhiIF3AwBeMwvg7SOIe0SkVamyHv980bcDexi4VzQrBuMsuxMjTYotJYJIhg2NwxIUDASwANEWqgHBuxiTiVhZJBoQS2wNPpKFqaffNTQAgiPDbG29Cr4wYdiYydJ4H0MegxQEB4LBBhZAnSTAb1e8yUBxiOC1Sw6J1q/Hqyg14Z+3X+PzrBrRoXXtKm5muwn61oTccAIBJCUMSRSaJvCSFLg6OQA0+n9cjy2B2KYz2SMEY0Ks3Ms2M/n3akJZxAPv5G9R8swb/Wrcai1ZvxPvrd2DtrgPQZXL3VZeMGIILz7zCsA6RDDA0ksslYOT1yzioAvwNQOdEqmNSPMPhd4KogjfKHjCAk4idpEGZoSevgoBeZoZ3jm7Ft237sW3b1zjcqABsQmaqGadmZmD4ib069e1sV16NLzbVQNPDT90mjycgev0irO0HpER8lxN7n6SvjTqVxAE75Jryqh0wfkV2CUSUPZIPqshA74zY/swmBejbW0ffzBaItH34unUb3v3qS7z+5Vq8vmoTFm/4Fht2xzcFD8lMxdUXRjQd7Vzy6PMN/gWKbjI0szPhG8GgrUaVgq3k7A3pS6roXnQIkIjNgNonfUinnoQUUyhxb29cjddWrccbX25BzZbd2HvYyJ0buMVyIVJSwm4ZQsJfiMnQakuMtSoxrQWFfzd7N1kcYgAkYBWAUYYjTSbUdFCMdrn+5uTLQ5hTGeZUDwAP2tCIlft3o2knoaVFhUopGJBhxtkn9kFfs9dMlGlWcfkPrsV/Pn018EaMEMFFIpxtFFsuQWtVhr6awuxnCVgmCfalpZWrwlxcAka3uXMJEbtr34BeIRv6LkEwcZ/v3Y2D2wl6mwkZpnScNfR0vPeZAunv0SR4SciNosQUKwJrREsrVgPoeJcw0MrM09PULXlLS8IQBIA1/iCxr5YYONIZRRicGGbR0B0gAjLNjH592pCacQA7m3cFEgRASCwObEPExpH5MlXBevH5k1WNfMTl9VMpZXZdmXuGkVJH3Qz3OkRZcCQVIraNbKrSC716IqFCGCxfE2KRX11d5g74m+U6CkfC+Gxu7WJnRYvPpesjYjjS1S3WZeVVK2MZBDPejmfQnQHFeHbTJ31I9ErdgIONjM1bglwXCCG+i5JllOBv+ghot4APXdt4f7zyk6TwC5AUj+5q4ojxSeqXcXRoStWv3gwZbI6T9I+Qikw/NVqKMvOHQDtJL593HlsdticYaBRMDQxqIGA/QzZIQQ0pitLQskPd7a9kXyeGfWiRX20DcGoyvpgRiGMj6cTe3bNoMELDIYm1Gz8OLl5fV15Zh7KKjoJ2OZ9Lgyv6QwF/BLQfU7DTKcHihwR6hAl/AnEVEy8C0RLBWKlp+tfqwNYH/G/ATqdkUEikRU/ixN49n7Or5vPVkHrgdE6AO1gxhlS6BcZneZ/55rCOnygRLzTsnVAYHFGtq/KviKL2kQwwRTcJpat9YE7tfnOVP3bs0bB5e4izZhurmjukMhvHdRHjn77/d5DEqvYGjHQGGGflTrcHLBfrne6tAELftclGDPvYvumDu3wYRtAl8MHSD8O4J7O7PYKiA+0RFjmG9xN4zff/DpLab2QoOSmJQ0ReCfIxeDW2uw4y+pqm3wk9u2ioX70TDftDLGw6IEKkbASJ3xrejPCl/x41cEZmmms8FP5Fe2xtB7xZuShMgFnywBzdbjegV1elZoqO3ft1LF/1f+EuPR+cXMQ6fdIgoijWGknP+n8MIEk0Nb4CGJ4XKYpH/11Iqep5AECXJSck3ZgkgsDAzJ5ZNHh04J1PFkNqIWNsIpWcIQ1E2/3w5sONhGZhUgIEhgNIqp65oBmEsArEPjDhLotjXIAGXq1z/nYCukxsgyOczfiQkdIPqfG7wCUFH3y6AQcOhIZ6ErMjWAjX6rrzFID+J8otXw7WIQ/ZgChSnQnjFVsKgVzBhX0P9H4qqhJVgmBuhFGkTWZ6cEa47sGKTQexbkOozRTgz9NMW0ODlj2KC8aZQJnDyTAEF3jTdPKLxsOjO/KKxgfoCL01a1YrSWVMFB+yxCAZuh7ZcNo/o/udajd/24qP614PKWegFUQTgm2fOcX2i0EUzQnijXB6rGG38pLocRiv2IQk+Uy+Kz9gIqgpn7tcME+LMpCEILXIc87AXt3rCrh7v47/W7Iw1PQDAET3BufkyHflq4Lls4iiZSuYy8OWhytcWlK5CsyVUcb6w2YtK0Stt7a86g8E/CtK27gh9fDfj0hgQJ/uS1e7e7+ON95bCI8ndJ3EwPPhElt5paXJSIIBBPyruswdNqAsolFMNakORF+xufKKbAGbMmZmpU0ZA+Pw97ihtYafJjNSBsHUTRztOSCxaPEiNLeGjSysb2mRk4MLLUXjstvT+BihTep8f6SLEUn62DlnB4NDNmJBMElCVb6rIMCy+fHjcw6l6OInYCQtzIFbw/tw9kvvnlwkO/Z4sOjd19HSHHaHsh7SdENwZpvsqZMzQeJFRNVe4j+1n9GFhaF52ayKx9tzHxmARjTr5spgu95HM+buFpJuBJCUrMayrQHhVngDesWV4zEhrNveiIXvvxT2CSJgq2RxVbB6GblcQk1pfT5auCuAHVD1MqMKhiQtdla0QPIkRDP7MG6xFBWGaLtVz6hYI1T9UgBfRRlodMhWeNpCrQoDunDRoEvgo8+24d2PX4EMJ8jB2CCAK9vl0QJg0b4qiyGvEgM0qdY538hBNXpERW2Z+2Ni/DVaPYBd1iL72ODSaue8DVKlPABRc+ZFg9Yc+CSRUDGgd9ekUT/YxHj1vRqs+PLdsJoOBCxTTHL0J6WVG8O1Z6KozhbMmFNbWmEouAHEGPZCTU2/R/Q/MoF4bq6jMMQzcKmz4luhqvkARx2QEfSmAL9C9E4ZjBj9+GOGZOC/6/fhH28uwK7dEd70RAubWmS+v3BGSBVdfQLGwRBfkUmLuFgIuFes+ZMs02xnkUL1iK5W3MLgW+tK3SHLcCIiS9G4KQA9heg5hsLCfPJwqCbv/Hx6v1G45OzkHVF8vceDj5ZVY19D2DxWAKARqLxWPa0kltx8lmL708R8X5hLzYJ4dHWJO6Zo7LgykeUW2W5jon8ghmxbxDy2psz9UriLVqctHzrNBeG0mDtvh5I5DBl9vT/Q7KFX4JxTOu8etPuAjvqVa7Ap2HnEH4wNDHl7PInoc1z2wULjjQiKTmGCLVKWtnCIO6efxWFzEuiRGKrqxPz7mjJ3iC0K8GaU4YyMhxj8MOKRB1VS0OuUgSDScO3IHyc8JzEDG3c0Y+X61djx7QojLaE2EP6WrjRNX+xcENYHPtdhvwfM+05d1/RisENPrqNwJgMdJweJJF+MmyTvK8tWCWBcTA2Y5x42Nf8qOIrdh4unjxupCPE0gJhVv5Q+Z6B33zbcbr0KFMeJOQP4dp+GTdt3Yf1Xy9HYuDtak0VSVX4XKY9fvsue1qzxbHT8LXgtMZX6kxXwNBH+OXRN021xe2YlksJ0pKsgJUMzLyTgJzE2qReqfnu1c17EzW3OdPsFisLTmPELRHudksCpZ+ThpouNdX90Cew9qOObPYfw7Z6d2LFzHZoaowY+SwLeYqby2rKK2kiVLnZMGKFAfxFhM7QFkpXrKJzJjAv6Hex97VuzZsVtgO5ExmZ7WrPGCxH7E3CIme+pK3OHOmX4IXf6+AtZ8F0AF8BAazz9hEEY0j8LqikVJtUEXUqwlPB4WtDUchiHDu9GU9NecOw6rA0ALRA6/lg9oyLiBp6IyOKwTQJjJqJkxQFhDUmU6SZ6T8DTFG0/FPE2ncl9nndfQbo0mxeCcE0czf5PqsqvIr1CfMh32dNadL6JQWPAfCW6JgdGIwj/Zqb5/Q/0ejvar9zqsJ8J8N8RRm0rIghvisNNt1bPXJBwtHWnSAK8Ca32ZR5yA3xbHM2aQHgqXWl6MtJk7I98V77apA+9WDBd2S7jdg4Sc8r8BsAKZv5QgfJB227TMn+Hz0jInjo5UzW1TGfQFALiiQiYr+1KHR9LH0boNElAxyvgCTAeiF47ADuZuEw53Dwn3l9avqvghJa2E85ikqdDoD8kehPRCRJIA2QzMTVC4CBLahBMGxWN1n/8+Jy4wvYs02z9SdBvQLgHQMRMYWHAIH68rrRqWrgsz/EiKST5kOuwT2rXuo5XK3wXAbOkzn+rm+GOrLPTTchxTRimePTfMWE8jHN3hEMzMybUlVUmzR8xqSQB7RM/yZdBiFt5loFWAr0OgTlDVze+H+9StTOwuu7szbrpBgIKwHwDomcEDQVhHeni9uDcUp1F0kkCgFEue59UDX+Lc54KAAO7BbAIwCJWtQ8SXRkZYbRr3EDNQ9dC0C1g/CjO+SYQzHPTTc2/jWWOjRddQpIP1qLCW0D4K4DOnszpAD4H4WMCryCJL2AybQh2fYqE7MmTTWknaSdqUp4HydkAZxMoO5pqZoz4Gsy/qS1zG/vSdwJdShLgTZylekyPg6gQ8YpNRUcjCFvAaIaXSN/T1gSvFMyJ8P5AukLpUgJ4Bqo2rSuecn90OUk+5BXbRuks/kDgy7ulw67Fu1LSg+HSt3YFuo0kHywO2w0Emg7jXE1HKz5iCFdd6dz3u7PTbifJB4tj/JXEcioIV6MnhOBjh2TCm4oUj1WXza3uiQH0GEk+5LnGnqFr6kQC29H5BUYy8Q2DqgB9dl1pVed9NDqBHifJh5GugpRebelXSaKbQfgpeSf97sa3YHqVCC+furZxSXfu04xw1JDkj4KCAmXb2WYrGFcw43IQ8hDN4pwY9gFcC9D7UtJ7y1JO+yKWY/HuxlFJUjCyJ082qQNazmGi84jwAyKcIZlPJtBQAINh7C9xCIy9IGwj0CYGNgJyNYM/7enXWKw4JkiKhuumTEk9lLHX3JqW1n7+JJtSW9paezX2b0rkkO1ow3eCpO86usaz8HskFd+TdAzge5KOAXxP0jGA70k6BvA9SccAvifpGABZHLaIGYMBQCj6AXhEs/CoB+PxtikoKFC2nm2+AACIZZNX3iYQo1z2Pqk6R4uEMxib+lXw6Wxeke1kKShsqAVD0VjBIWrVDigtzU2d8YUzQvbkySYxuPUyIZEDUBYR92OGDmAvAxvBcsnS8nmfxupJpIJhGCUgNQUgQKbosDoKdwK8ihnvqUQvRQqgAoD152X0StW4HgAYYjkQmj46TePLGEj42Fn3aGMQpBLGgqaA8ftw9Qk6SAOgEGSGGVaHbQuIVpJELRO9FKwDFC+sRXYriKeoA3EtpC9JCMOfCgIAErAU2bZbHYULGfLpaOapeF93gwC6kojKdWC9tcg2J9s1Jh5/tKMMlAXG9UwoBXidtajw/eBE8rEg1zHuHGux/XUQ1wC4HaFZXMIZbU8B8BuCWGNx2Ga1J7QMC3/D5B5QUAJ1id5ErDChD0OkEPMZACwABgEgEI1X9ZS80a5xlxtFvcUCYrzHAgviaaMChol0AZoN4g73KmJKBaSZmVKJMFSCziBwDnxSMoR8hcRyS5FtUjSfdR9yiwrvYBLPgrkjUIqAlQx+TbDyb2GizSetOrTz8ODBakP/Q0Ok1EeQFDcC+BmAk+GVAbqnTZE/zym237y0pCIkae4RkhgHa0sr/x5tUAUFBcrWs9JvANH/AjgFjLN1j1KF2CMswoIFVtSWRO8/Psh3a0vcrxjVaI+TupbBDngjJExENMcyvXBPXXnlm0ZtrQ7bEyDyFxxZxRIP1YZvpwPY3P7vnezJk3+nDmy9C16Nh4EAThHMH+UW2QqDg+/iXt0tWLBAry1zL1RYvQQ+2TXiH1uK7Yair0crqmcuaK4prXhV25WaA3QolClE+ONIV0HE4LZcR+F04AhBTDRz6Nqm86MR60P97Nme2tLKvwhVPQfAu+3FaUw0z+IYHyBFnfAS3CsURf5RfD9L9F5HA+pnz/YcVpsmgeDN9U44I8OTHjbEP7fIdhsDpe0fmYGJdSUVcct2A0C187l96eqWa8HsE4Q0EeQrlmm2juzOndsnSdmxMiPmPKOqxwJWOhe0wV8OgSgkpMcyzdafiZ6Bb6EGOOpKK+d0pt/FzsVaumnrZHCHwHtfEtShUdQpklRN9V869ozoXLKhi458EuQNsQmAEPQIjgS3Laotc89IRreLnYs1k+65DT4FGUJ+bpH9RqCTJLVvbn2xN12vH9MNEKmiQ2aHgsJdrK47T2HC3e0fPQA9kIzQFh+WPPp8A9MRwUcmLgE6SVLefQXpALzCmhw26+MxB73V0+EDyME5izSlQ3CdGe7Obn7Dwaxsfs4vZ9UFlmm2szpFEp+Q9sOOD9SNWWC6EELhI75/jKAoaPoD9DURAAAFBElEQVRFRz3isBoVncVi52KNQB3ZsUiImztHklQ6ZAKI8Eln7nW0gEkc2UoQOny9298aPvH6A2nq1g+6agxERxZkIL4qYZ1mS5Ht50R0V/tH1vUwWU3iAfPQXIft6lirE7GnuqTKUGw+XuS78lVwVoewoGDqSD/kSU8brrQHljGwySi/VGehauqXbUdSto6Ii6SCggJl81nm0YJ4IhHdgfY5jUBVnY8woJsZuDnW2sy0B0n0cs135avNnqy/gHBhe9GKmrLKd1DqzdQiFKWvz1IqujjB15JHK/ZYimxt8CrFDDhCEmGI1VEYkogJABhkIvBAHmEeJoDUIP/6d9PUjhXPMYds15gBJj31Buah94JwPtAeFkqw+6/cSEr2ya8wUZe6HzMzWx2FzfCSpPo/SekAwr5ufJkpg0IfthPoiVr1tL8kxzWX32IWlbHWFsRxOT1aimw/BwkLCCbB6M+MwQAPVynlDAbD79sdFJJ/WVPuDlAkFkIckD7OmLs05Vm2a7JZBXyZsg/4k+QBI1QqHgAEWsA4DGArQF9IwdXLxOmLk+o3TbSurrSiy3JeKMBSHTybGCcyEC7YRgewgCGn15aHnu80Nuub0tOEj82srhonAJi05iw+svrf5G8F31ZbVpnwKenRjuoy99e50202FvQmfBQxNgF4l4jqhaovNDpu+fzJqkaro3ANvFaIQXnFtlGx6tXFDRbX+H5EDK47rnwcasrdbxPhiEIzwcSSp9WUVjwb03mYX/JECeoygzITfu77v4B49bgiCQA8O1OLANS0fzxVKBSixBwJEjS/4wPj7ksempB0vaOcYvvFAC73doHdp65tXHLckVQ/e7ZHYfV2AA0AwMANlum2mLRQ209NfYmSBmqperwyPVEhmJ/CEQv7HxYsWKAfdyQB3rMwBo8DOpatj+YWF46OqbHkB+HzWWA8nFc8LmnR9BaH/UF4Ba4AYLumpv4JOI797upK3f8C4c/tH1UwXshzTYyac6623P0FuOOsxyRZvBScTyoR5BbZbySwLwcVM+ieeufsJuA4JgkAtJ2pDwBUBwAMDJWaZ14s85O2O+VecEce80EEsbQzT5S1uPAuJv4nOsxO7KorrejI+3Nck1Q/e7ZHqNqd6FBSoessRbZwEtEh7TRTWwEAn8PnAJ3FOxaHzRmct8MIuS77aVaH/UUwZqP9yIdA7qVlVSX+9Xo+e64PjMzgpI7RkIFDuzoruFTtnLcht8h2FxP5Ens9ai2yf2KkvwoA9c4X9mRPnZyrprQ+D8b1XvEoeqRZM99tLSp8Bsyv15a7QwTv8135apN2+mWC5a2SYPcTnZLM7Kgrdz8afJB49JAE2IWm2+Np0MTmEA/WRFBT5n7JWlR4JQh3ATCB5It5rokXRhOYqn9s9gFyuW7K8WyaSkQPAzgBwGAQXCByWR2F38DrwrWTAFUCJxOyTifIPkx+Rg/GBmKeUlvufhtloe5+x/Xrzh+iqeleACu8nyhL17WY9k/sdMq6MvcMRZXDGfxnBOacGgLvGdTPGLiBgFEI9G7dBuLfaLtTz60pd7+NCFAJPBUAJBmmLo0bQ/b2am7IPDAVAEBiZ7g6pOpfQhNTE+2DiEOPR5jeJsh9AKBBXRHrvapnLmi2Ouy3EOTNAEAMXPTIuFMBhGT4DYd2i8WUfJf9980argRwE8AXMZBFXscVDUADg9YR8RKWcmGsTvv/D2UGv9Hi6yYwAAAAAElFTkSuQmCC\"","<script setup lang=\"ts\">\n defineProps(['icon', 'tourkey', 'title', 'active']);\n</script>\n\n<template>\n <li class=\"nav-item\">\n <a\n :id=\"`toolbar-${tourkey}`\"\n :class=\"['nav-link', active ? 'active' : null]\"\n href=\"#\"\n :title=\"title\"\n ><i :class=\"['bi', icon]\"></i\n ></a>\n </li>\n</template>\n","<script setup lang=\"ts\">\n import logo from '@/assets/piero_logo_compact.png';\n\n import getConfigurationPanels from '../Configuration';\n import ToolbarButton from './ToolbarButton.vue';\n\n defineProps<{\n active: string | null;\n }>();\n defineEmits(['selected']);\n\n const panels = getConfigurationPanels();\n</script>\n\n<template>\n <div class=\"toolbar\">\n <ul id=\"menu\" class=\"nav nav-pills flex-column\">\n <li class=\"nav-item mt-2\">\n <a href=\"https://giro3d.org\" target=\"_blank\" title=\"Piero, powered by Giro3D\">\n <img :src=\"logo\" alt=\"Piero, powered by Giro3D\" class=\"mb-3 w-100 p-1\" />\n </a>\n </li>\n\n <template v-for=\"panel in panels\">\n <ToolbarButton\n v-if=\"panel.enabled\"\n :active=\"active === panel.key\"\n :key=\"panel.key\"\n :tourkey=\"panel.key\"\n :title=\"panel.title\"\n :icon=\"panel.icon\"\n @click=\"$emit('selected', panel.key)\"\n />\n </template>\n </ul>\n </div>\n</template>\n\n<style scoped>\n li {\n margin: 0.2rem;\n }\n</style>\n","import { defineStore } from 'pinia';\nimport { shallowRef } from 'vue';\n\nimport type { Widget } from '@/api/widgets';\n\nexport const useWidgetStore = defineStore('widgets', () => {\n const widgets = shallowRef<Widget[]>([]);\n\n function addWidget(widget: Widget): void {\n widgets.value.push(widget);\n }\n\n function getWidgets(): Widget[] {\n return [...widgets.value];\n }\n\n return {\n addWidget,\n getWidgets,\n };\n});\n\nexport type WidgetStore = ReturnType<typeof useWidgetStore>;\n","<script setup lang=\"ts\">\n import Extent from '@giro3d/giro3d/core/geographic/Extent';\n import { Vector2, Vector3 } from 'three';\n import { onMounted, onUnmounted, ref, shallowRef } from 'vue';\n\n import type Feature from '@/types/Feature';\n\n import Giro3DManager from '@/services/Giro3DManager';\n import { useAnnotationStore } from '@/stores/annotations';\n import { useCameraStore } from '@/stores/camera';\n import { useGiro3dStore } from '@/stores/giro3d';\n import { useMeasurementStore } from '@/stores/measurement';\n\n import type { PanelType } from './components/Configuration';\n import type { PieroContext } from './context';\n\n import { isLocationSearchResult, type SearchResult } from './api/search';\n import { ViewApiImpl } from './api/view';\n import AlertToast from './components/AlertToast.vue';\n import AttributePanel from './components/AttributePanel.vue';\n import LoadingScreen from './components/LoadingScreen.vue';\n import MainView from './components/MainView.vue';\n import NavigationButtons from './components/NavigationButtons.vue';\n import PanelContainer from './components/PanelContainer.vue';\n import ProgressBar from './components/ProgressBar.vue';\n import SearchOverlay from './components/SearchOverlay.vue';\n import StatusBar from './components/StatusBar.vue';\n import ToolBar from './components/toolbar/ToolBar.vue';\n import { GLOBAL_EVENT_DISPATCHER } from './events';\n import { useSearchStore } from './stores/search';\n import { useWidgetStore } from './stores/widgets';\n\n const { getContext } = defineProps<{\n getContext: () => PieroContext;\n }>();\n\n const selectedTool = ref<PanelType | null>(null);\n const progress = ref(1);\n const coordinates = ref(new Vector3(0, 0, 0));\n const mouse = new Vector2();\n const pickedFeature = ref<Feature | null>(null);\n const tooltip = ref<string | null>(null);\n const isLoading = ref(false);\n const showLoadingScreen = ref(true);\n let hasMovedDuringFrame = false;\n\n const giro3dStore = useGiro3dStore();\n const cameraStore = useCameraStore();\n const annotationStore = useAnnotationStore();\n const measurementStore = useMeasurementStore();\n const widgetStore = useWidgetStore();\n const searchStore = useSearchStore();\n\n const giro3d = shallowRef<Giro3DManager | null>(null);\n const debounce = ref<NodeJS.Timeout | number | string | undefined>();\n\n onMounted(() => {\n const mainview = giro3dStore.getMainView();\n if (mainview) {\n initializeGiro3DManager();\n }\n\n giro3dStore.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'setMainView':\n if (args[0] === null) {\n disposeGiro3DManager();\n } else {\n initializeGiro3DManager();\n }\n break;\n }\n });\n });\n\n // debouncing costly functions\n debounce.value = setInterval(() => {\n if (hasMovedDuringFrame) {\n updateCoordinates(mouse);\n updateCursor(mouse);\n hasMovedDuringFrame = false;\n }\n }, 50);\n\n if (import.meta.env.PROD) {\n setTimeout(() => {\n showLoadingScreen.value = false;\n }, 1000);\n } else {\n showLoadingScreen.value = false;\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'ready' });\n });\n\n onUnmounted(() => {\n if (debounce.value != null) {\n clearInterval(debounce.value);\n debounce.value = undefined;\n }\n disposeGiro3DManager();\n });\n\n function disposeGiro3DManager(): void {\n giro3d.value?.dispose();\n giro3d.value = null;\n }\n\n function initializeGiro3DManager(): void {\n const mainview = giro3dStore.getMainView();\n if (mainview === null) {\n throw new Error('mainview is null');\n }\n giro3d.value = new Giro3DManager(mainview);\n giro3d.value.addEventListener('update', () => {\n if (giro3d.value) {\n progress.value = giro3d.value.mainInstance.progress;\n isLoading.value = giro3d.value.mainInstance.loading;\n }\n });\n\n getContext().view = new ViewApiImpl({\n basemap: giro3d.value.layerManager.getBasemap(),\n camera: giro3d.value.camera,\n instance: giro3d.value.mainInstance,\n sceneCursorManager: giro3d.value.sceneCursorManager,\n });\n }\n\n function onMouseMove(event: MouseEvent): void {\n if (giro3d.value) {\n giro3d.value.mainInstance.eventToCanvasCoords(event, mouse);\n hasMovedDuringFrame = true;\n }\n }\n\n function onSearchResultSelected(result: SearchResult): void {\n if (!giro3d.value) {\n return;\n }\n\n if (isLocationSearchResult(result)) {\n const instance = giro3d.value.mainInstance;\n const poiCoordinates = result.coordinates.as(instance.referenceCrs);\n const target = Extent.fromCenterAndSize(\n poiCoordinates.crs,\n poiCoordinates.toVector2(),\n 1000,\n 1000,\n );\n\n const bbox3 = target.toBox3(poiCoordinates.z, poiCoordinates.z + 200);\n void giro3d.value.camera.lookTopDownAt(bbox3, false);\n }\n }\n\n function pick(event: MouseEvent, clicked?: boolean): void {\n if (giro3d.value == null || giro3d.value.mainInstance == null) {\n return;\n }\n\n if (\n cameraStore.getNavigationMode() === 'position-on-map' ||\n cameraStore.isUserInteracting() ||\n annotationStore.isUserDrawing() ||\n measurementStore.isUserMeasuring()\n ) {\n return;\n }\n\n const picked = giro3d.value.picker.pick(giro3d.value.mainInstance, event);\n\n if (picked?.point != null) {\n const point = picked.point;\n coordinates.value.x = point.x;\n coordinates.value.y = point.y;\n coordinates.value.z = point.z;\n }\n\n if (picked?.feature != null) {\n tooltip.value = picked.feature.name;\n if (clicked != null) {\n pickedFeature.value = picked.feature;\n }\n } else {\n tooltip.value = null;\n if (clicked != null) {\n pickedFeature.value = null;\n }\n }\n\n if (picked?.pickResult != null) {\n giro3d.value.highlighter.highlightFromPick(picked.pickResult);\n } else {\n giro3d.value.highlighter.clear();\n }\n }\n\n function selectPanel(key: PanelType): void {\n if (key === selectedTool.value) {\n selectedTool.value = null;\n } else {\n selectedTool.value = key;\n }\n }\n\n function updateCoordinates(mouse: Vector2): void {\n if (giro3d.value != null) {\n const point = giro3d.value.picker.getMouseCoordinate(giro3d.value.mainInstance, mouse);\n\n if (point) {\n coordinates.value.x = point.x;\n coordinates.value.y = point.y;\n coordinates.value.z = point.z;\n }\n }\n }\n\n function updateCursor(mouse: Vector2): void {\n if (giro3d.value) {\n if (\n cameraStore.getNavigationMode() === 'position-on-map' ||\n cameraStore.getNavigationMode() === 'orbit' ||\n annotationStore.isUserDrawing() ||\n measurementStore.isUserMeasuring()\n ) {\n return;\n }\n const picked = giro3d.value.picker.hasFeature(giro3d.value.mainInstance, mouse);\n giro3d.value.mainInstance.domElement.style.cursor = picked ? 'pointer' : 'auto';\n }\n }\n</script>\n\n<template>\n <LoadingScreen v-if=\"showLoadingScreen\" />\n <MainView\n id=\"main-view\"\n @click=\"(evt: MouseEvent) => pick(evt, true)\"\n @mousemove=\"onMouseMove\"\n class=\"mainview\"\n />\n <AttributePanel\n v-if=\"pickedFeature != null\"\n @close=\"pickedFeature = null\"\n :attributes=\"pickedFeature.attributes\"\n :name=\"pickedFeature.name\"\n :parent=\"pickedFeature.parent\"\n :point=\"pickedFeature.point\"\n class=\"component attribute-panel\"\n />\n <StatusBar\n class=\"component statusbar\"\n :crs=\"giro3dStore.getMainView()?.referenceCrs\"\n :x=\"coordinates.x\"\n :y=\"coordinates.y\"\n :z=\"coordinates.z\"\n />\n <ToolBar\n id=\"toolbar\"\n :active=\"selectedTool\"\n class=\"component toolbar\"\n v-on:selected=\"v => selectPanel(v)\"\n />\n <PanelContainer v-if=\"selectedTool != null\" class=\"component panel\" :selected=\"selectedTool\" />\n <ProgressBar :progress=\"progress\" class=\"loading-indicator\" />\n <SearchOverlay\n v-if=\"searchStore.searchProviderCount > 0\"\n id=\"address-search\"\n class=\"search\"\n @result-selected=\"onSearchResultSelected\"\n />\n <NavigationButtons class=\"navigation-buttons\" />\n <AlertToast />\n\n <div class=\"widgets\">\n <div\n v-for=\"(widget, index) in widgetStore.getWidgets()\"\n :key=\"index\"\n :id=\"`widget-${widget.id}`\"\n >\n <component :context=\"getContext()\" :is=\"widget.component\"></component>\n </div>\n </div>\n</template>\n\n<style scoped>\n .component {\n background-color: var(--bs-body-bg);\n }\n\n .navigation-buttons {\n position: absolute;\n right: 0;\n bottom: 0;\n margin-bottom: 2rem;\n }\n\n .attribute-panel {\n position: absolute;\n box-shadow: -1px -1px 5px rgba(0, 0, 0, 0.5);\n border-style: sol;\n right: 0;\n bottom: 0;\n width: 370px;\n max-height: 60%;\n margin-right: 1rem;\n margin-bottom: 5rem;\n }\n\n .statusbar {\n padding: 0.2rem;\n text-align: center;\n border-top-left-radius: 0.5rem;\n box-shadow: -1px -1px 5px rgba(0, 0, 0, 0.1);\n height: 1.5rem;\n position: absolute;\n bottom: 0;\n right: 0;\n }\n\n .search {\n position: absolute;\n top: 0;\n left: calc(50% - 20rem / 2);\n width: 25rem;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 3px;\n z-index: 1;\n background-color: transparent;\n }\n\n .panel {\n position: absolute;\n height: 100vh;\n left: 3.5rem;\n max-width: 30rem;\n min-width: 20rem;\n z-index: 1;\n }\n\n .widgets {\n pointer-events: none;\n position: absolute;\n left: 3.5rem;\n top: 0;\n height: 100vh;\n width: calc(100% - 3.5rem);\n }\n\n .widgets > div {\n pointer-events: all;\n }\n\n .mainview {\n position: absolute;\n /* background-color: cadetblue; */\n height: 100vh;\n left: 3.5rem;\n width: calc(100% - 3.5rem);\n z-index: 0;\n }\n\n .toolbar {\n width: 3.5rem;\n height: 100vh;\n position: absolute;\n top: 0;\n left: 0;\n }\n</style>\n","import type { Configuration } from '@giro3d/piero';\n\n/**\n * A default, ultra-minimal configuration that displays the world in the Web Mercator\n * projection using an OpenStreetMap basemap (requires the OSMLoader built-in module).\n */\nconst config: Configuration = {\n data: [\n {\n attribution: '© OpenStreetMap contributors',\n name: 'OSM',\n type: 'osm',\n visible: true,\n },\n ],\n scene: {\n basemap: {\n extent: {\n crs: 'EPSG:3857',\n maxx: 20037508.342789244,\n maxy: 20037508.342789244,\n minx: -20037508.342789244,\n miny: -20037508.342789244,\n },\n },\n camera: {\n altitude: 80000000,\n heading: 0,\n latitude: 0,\n longitude: 0,\n tilt: -90,\n },\n crs: 'EPSG:3857',\n },\n title: 'Default configuration',\n version: 2,\n};\n\nexport default config;\n","import { createPinia } from 'pinia';\nimport { createApp } from 'vue';\n\nimport type { Configuration } from '@/configuration/configuration';\nimport type { PieroContext } from '@/context';\nimport type { ModuleConstructor } from '@/module';\nimport type { PieroApplication } from '@/PieroApplication';\n\nimport { AnalysisApiImpl } from '@/api/analysis';\nimport { BookmarkApiImpl } from '@/api/bookmarks';\nimport { DatasetApiImpl } from '@/api/dataset';\nimport { HttpApiImpl } from '@/api/http';\nimport { NotificationApiImpl } from '@/api/notifications';\nimport { SearchApiImpl } from '@/api/search';\nimport { WidgetApiImpl } from '@/api/widgets';\nimport App from '@/App.vue';\nimport defaultConfig from '@/configuration/defaultConfig';\nimport { loadRemoteConfiguration, setConfiguration } from '@/configurationLoader';\nimport { GLOBAL_EVENT_DISPATCHER } from '@/events';\nimport { useAnalysisStore } from '@/stores/analysis';\nimport { useBookmarkStore } from '@/stores/bookmarks';\nimport { useDatasetStore } from '@/stores/datasets';\nimport { useModuleStore } from '@/stores/modules';\nimport { useNotificationStore } from '@/stores/notifications';\nimport { useSearchStore } from '@/stores/search';\nimport { useWidgetStore } from '@/stores/widgets';\nimport Download from '@/utils/Download';\nimport '@/assets/main.scss';\n\nasync function resolveConfiguration(params: {\n configuration?: Configuration | string;\n}): Promise<Configuration> {\n let configuration: Configuration;\n\n if (params.configuration == null) {\n // Return the minimal default config\n return defaultConfig;\n }\n\n if (typeof params.configuration === 'string') {\n console.info(`Loading remote configuration from: ${params.configuration}`);\n const remoteConfiguration = await loadRemoteConfiguration(params.configuration);\n console.info('Remote configuration successfuly loaded.');\n configuration = remoteConfiguration;\n } else {\n configuration = params.configuration;\n }\n\n return configuration;\n}\n\n/**\n * Entry point for a Piero application.\n * @returns A promise that resolves when the application has been initialized and is ready to use.\n */\nexport default async function createPieroApp(params: {\n /**\n * The base URL of the application. This is used to resolve relative URLs.\n * @example 'http://localhost:8080/' or 'https://mydomain.com/myapp/'\n * @defaultValue './'\n */\n baseUrl?: string;\n\n /**\n * The static configuration to use, or the URL to a remote configuration.\n * If no configuration is specified, the default configuration will be used.\n */\n configuration?: Configuration | string;\n /**\n * Where to attach the piero root DOM element. Can be either the `id` of an existing element, or a reference to a DOM element.\n */\n container: Element | string;\n\n /**\n * The list of modules to load.\n * @defaultValue []\n */\n modules?: ModuleConstructor[];\n}): Promise<PieroApplication> {\n // We need to set baseUrl first, before potentially resolving remote relative configurations\n Download.setBaseUrl(params.baseUrl ?? './');\n\n const configuration = await resolveConfiguration(params);\n await setConfiguration(configuration);\n\n console.info('Configuration loaded.');\n\n // We define the Pinia store in advance because we will have\n // to inject it into APIs.\n const pinia = createPinia();\n\n const moduleStore = useModuleStore(pinia);\n const modules = params.modules?.map(ctor => new ctor()) ?? [];\n moduleStore.setLoadedModules(modules);\n\n const analysisStore = useAnalysisStore(pinia);\n\n // Here we create a context that will be used by modules\n // to interact with the Piero application, without having\n // to import individual services.\n const context: Omit<PieroContext, 'view'> = {\n analysis: new AnalysisApiImpl(analysisStore),\n baseURL: Download.getBaseUrl(),\n bookmarks: new BookmarkApiImpl(useBookmarkStore(pinia)),\n configuration,\n datasets: new DatasetApiImpl(useDatasetStore(pinia)),\n events: GLOBAL_EVENT_DISPATCHER,\n http: new HttpApiImpl(),\n notifications: new NotificationApiImpl(useNotificationStore(pinia)),\n search: new SearchApiImpl(useSearchStore(pinia)),\n widgets: new WidgetApiImpl(useWidgetStore(pinia)),\n };\n\n // @ts-expect-error TODO we have to initialize a\n // partial context because we can't yet create\n // the view entry since it requires a Giro3D instance;\n const readyContext: PieroContext = context;\n\n const moduleInitializations: Promise<void>[] = [];\n\n // Now we can register the modules.\n if (params.modules != null) {\n for (const module of modules) {\n const init = Promise.resolve(module.initialize(readyContext));\n moduleInitializations.push(init);\n console.info(`Module ${module.name} initialized.`);\n }\n }\n\n await Promise.all(moduleInitializations);\n\n // Mount the Piero root component in the provided element.\n const app = createApp(App, { getContext: () => context });\n app.use(pinia);\n app.mount(params.container);\n\n return {\n context: readyContext,\n };\n}\n"],"names":["AnalysisApiImpl","store","params","BookmarkApiImpl","__publicField","bookmarks","bookmark","panels","getPanels","propertyViews","datasetIcons","datasetTitles","builders","build","instance","dataset","context","builder","result","entity","registerBuilder","datasetType","DatasetBuilder","loaders","getLoaderContext","fileOrUrl","config","absoluteUrl","getPublicFolderUrl","url","filename","extension","importFile","loader","selectLoader","datasetConfig","Dataset","keys","key","registerLoader","fileExtension","customHighlighters","Highlighter","pick","isShapePickResult","highlighter","clearHighlight","shape","previousColor","Color","DatasetApiImpl","customAttributeExtractors","HttpApiImpl","Fetcher","options","NotificationApiImpl","title","message","notification","SearchApiImpl","searchStore","provider","isLocationSearchResult","Coordinates","ViewApiImpl","entities","bbox","Box3","isEntity3D","entityBox","WidgetApiImpl","widget","EulerOrientation","z","GLOBAL_EVENT_DISPATCHER","EventDispatcher","useAnnotationStore","defineStore","annotations","reactive","annotationMode","ref","count","computed","_isUserDrawing","_showLabels","isUserDrawing","showLabels","setShowLabels","v","setIsUserDrawing","value","getAnnotationMode","setAnnotationMode","mode","getAnnotations","remove","annotation","createPoint","createLine","createPolygon","add","hasAnnotation","name","m","edit","stopEdition","importAnnotationFile","file","importAnnotationsFiles","files","useNotificationStore","push","Annotation","object","type","properties","MathUtils","Download","geojson","getMinMaxAltitudes","coordsOrDrawing","min","max","points","i","Measure$1","promptTitle","defaultValue","numberFormat","areaFormatter","values","area","unit","tmpStart","Vector3","tmpEnd","getAnnoationTypeFromGeoJSONGeometry","geom","lengthFormatter","view","camera","end","start","ndcStart","ndcEnd","sqLimit","length","pointFormatter","AnnotationManager","picker","DrawTool","after","args","defaultName","userData","Measure","Shape","limitRemovePointHook","DEFAULT_SHAPE_COLOR","SHAPE_POINT_RADIUS","point","inhibitHook","afterRemovePointOfRing","afterUpdatePointOfRing","drawFn","opts","EDIT_SHAPE_COLOR","results","edition","res","feature","skipNames","existingAnnotations","nbImported","nbSkipped","e","promises","nbTotalImported","nbTotalSkipped","errors","reason","str","features","crs","getPoint","c","coord","getConfig","conf","toGiro3DCoordinates","event","isMapPickResult","restoreShape","show","MOUSE_BUTTON","ACTION","DOLLY_DIRECTION","isPerspectiveCamera","isOrthographicCamera","PI_2","PI_HALF","EPSILON","DEG2RAD","clamp","approxZero","number","error","approxEquals","a","b","roundToStep","step","infinityToMaxNumber","maxNumberToInfinity","smoothDamp","current","target","currentVelocityRef","smoothTime","maxSpeed","deltaTime","omega","x","exp","change","originalTo","maxChange","temp","output","smoothDampVec3","out","targetX","targetY","targetZ","changeX","changeY","changeZ","originalToX","originalToY","originalToZ","maxChangeSq","magnitudeSq","magnitude","tempX","tempY","tempZ","origMinusCurrentX","origMinusCurrentY","origMinusCurrentZ","outMinusOrigX","outMinusOrigY","outMinusOrigZ","extractClientCoordFromEvent","pointers","pointer","notSupportedInOrthographicCamera","listener","listeners","listenerArray","index","array","_a","VERSION","TOUCH_DOLLY_FACTOR","isMac","THREE","_ORIGIN","_AXIS_Y","_AXIS_Z","_v2","_v3A","_v3B","_v3C","_cameraDirection","_xColumn","_yColumn","_zColumn","_deltaTarget","_deltaOffset","_sphericalA","_sphericalB","_box3A","_box3B","_sphere","_quaternionA","_quaternionB","_rotationMatrix","_raycaster","CameraControls","libs","_","domElement","deltaX","deltaY","dragToOffset","screenSpacePanning","truckX","pedestalY","offset","fov","targetDistance","theta","phi","delta","y","dollyScale","lastDistance","distance","clampedDistance","overflowedDistance","zoomScale","lastZoom","zoom","dragStartPosition","lastDragPosition","dollyStart","onPointerDown","elRect","left","top","mouseButton","zombiePointer","onPointerMove","onPointerUp","startDragging","pointerId","dragging","endDragging","lastScrollTimeStamp","onMouseWheel","now","deltaYFactor","onContextMenu","dx","dy","lockedPointer","dollyX","dollyY","dollyDirection","dollyDelta","onPointerLockChange","onPointerLockError","_b","_c","enabled","azimuthAngle","polarAngle","boundaryEnclosesCamera","interactiveArea","enableTransition","resolveImmediately","lastRadius","maxDistanceByCollisionTest","isCollided","zoomStep","to","height","position","box3OrObject","cover","paddingLeft","paddingRight","paddingBottom","paddingTop","aabb","normal","rotation","viewFromPolar","bb","bbSize","center","width","sphereOrMesh","boundingSphere","distanceToFit","diameter","positionX","positionY","positionZ","positionAX","positionAY","positionAZ","targetAX","targetAY","targetAZ","positionBX","positionBY","positionBZ","targetBX","targetBY","targetBZ","t","targetA","positionA","targetB","positionB","deltaTheta","deltaPhi","deltaRadius","pos","promise","cameraToPoint","box3","viewportOrX","depth","boundingRectAspect","aspect","radius","vFOV","hFOV","receiveEndValue","cameraDirection","side","deltaTarget","deltaOffset","deltaZoom","dollyControlAmount","planeX","planeY","worldToScreen","lerpRatio","cursor","newTargetEnd","isMin","isMax","dollyAmount","targetEndDiff","worldCursorPosition","quaternion","prevPlaneConstant","newPlaneConstant","pullBack","maxDistance","updated","json","obj","activePointer","friction","offsetLength2","newTarget","deltaClampedTarget","deltaClampedTargetLength2","offsetFactor","near","heightHalf","widthHalf","zoomInv","right","bottom","rayDirection","nearPlaneCorner","origin","intersects","rect","resolve","onResolve","_domElement","object3d","maxRadiusSq","mesh","geometry","l","CameraPosition","focalOffset","altitude","latitude","longitude","heading","tilt","CameraControlsInspector","Panel","gui","cameraController","useGiro3dStore","mainView","shallowRef","inspector","getMainView","setMainView","getInspector","setInspector","getDefaultCameraPosition","getDefaultLookAt","getDefaultBasemapOptions","DoubleSide","getDefaultBasemapExtent","input","toGiro3DExtent","getCRS","notifyChange","Matrix4","Quaternion","Raycaster","Sphere","Spherical","Vector2","Vector4","tmpVec3","CameraController","cursorManager","useCameraStore","Clock","callback","controls","cameraPosition","lookAt","size","newCameraPosition","extent","entity3d","entityBbox","picked","direction","newPosition","cursorLocation","navigationMode","forwardDirection","truckDirectionX","truckDirectionY","factor","raycaster","DatasetManager","layerManager","useDatasetStore","buildResult","zOrder","layer","box","grid","AxisGrid","Extent","Feature","Polygon","mask","MaskLayer","Giro3dVectorSource","Style","Fill","MaskMode","maps","isMap","map","layers","_dataset","DatasetState","opacity","newVisibility","Datagroup","ds","useBasemapStore","visible","LayerManager","mapOptions","Giro3dMap","isColorLayer","order","ent","orderA","orderB","MeasureTool","o","isShape","n","Measure3D","useMeasurementStore","measurements","measurementMode","_isUserMeasuring","isUserMeasuring","setIsUserMeasuring","getMeasurementMode","setMeasurementMode","getMeasures","measure","hasMeasure","importMeasureFile","importMeasureFiles","measures","MeasurementManager","from","existingMeasures","measurement","CSS2DObject","Object3D","element","source","recursive","createSceneCursor","className","id","container","icon","SceneCursorManager","newCursor","worldPosition","Giro3DManager","Picker","getLookAtTarget","lightColor","AmbientLight","DirectionalLight","bbox2","alertToast","showNotification","notif","bootstrap","getIcon","getStyle","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_3","_toDisplayString","hexString","__props","_createTextVNode","props","_Fragment","_hoisted_5","_hoisted_6","_hoisted_8","_hoisted_9","styles","_unref","_hoisted_2","_hoisted_4","subitem","_createBlock","_component_AttributeItem","isLink","LinkFragment","isColor","ColorFragment","isVector3","_createVNode","CoordinateFragment","_hoisted_7","_renderList","list","AttributeItem","copied","copyText","$emit","item","AttributeGroup","_normalizeClass","logo$1","_cache","logo","inspectorView","onMounted","Instance","onUnmounted","notificationStore","watch","newMode","description","onPositionOnMapToggle","SwitchToggle","bpi","france2030","franceRelance","oslandia","ueNext","dependencies","define_import_meta_env_VITE_DEPENDENCIES_default","modules","useModuleStore","_hoisted_11","_hoisted_12","_hoisted_13","info","_hoisted_16","_hoisted_17","_hoisted_18","module","_hoisted_19","_hoisted_20","_lut","generateUUID","d0","d1","d2","d3","useAnalysisStore","_tools","registerTool","tool","getTools","_renderSlot","_ctx","analysis","ToolWrapper","_resolveDynamicComponent","EmptyIndicator","emits","__emit","hover","hiddenInput","importFiles","importFromFile","onDragEnter","onDragLeave","onDragOver","onDrop","ButtonWithIcon","$event","currentSelection","setCurrent","CheckboxToggle","icons","titles","isEditing","onIsEditingChanged","VisibilityControl","IconList","Icon","annotationModes","cameraStore","downloadAnnotation","exportAnnotations","goTo","setCurrentMode","src","AnnotationItem","$forceUpdate","ButtonArea","DropdownView","ImportButton","copyToClipboard","Bookmark","urlString","base","cam","buildInitialList","useBookmarkStore","clear","getBookmarks","showShareModal","shareUrl","modalTitle","bookmarkStore","addBookmark","exportBookmarks","importBookmarkFile","importBookmarks","serializedBookmarks","existingBookmarks","shareBookmark","shareCurrentView","BookmarkItem","ModalOverlay","ShareBookmarkModal","leafs","hasLeafPreloading","hasLeafPreloaded","isVisible","newValues","isEmpty","IconListButton","ListLabelButton","SpinnerControl","CompactList","DatasetOrGroupItem","state","refAndWatch","deleteDataset","hovered","action","DatagroupItem","DatasetItem","Slider","datasets","basemap","showParameters","importDataset","importDatasetFromUrl","showParams","zoomOnDataset","margin","scaledBox","DatasetParameters","measurementModes","downloadMeasure","exportMeasures","MeasurementItem","getConfigurationPanels","gitCommit","p","DatasetPanel","AboutPanel","BookmarkPanel","AnalysisPanel","AnnotationPanel","MeasurementPanel","__default__","useSearchStore","providers","searchProviderCount","registerProvider","getProviders","getResultValue","search","query","submitResult","Autocomplete","_withCtx","_mergeProps","latlon","isGeographic","formatAltitude","panel","ToolbarButton","useWidgetStore","widgets","addWidget","getWidgets","selectedTool","progress","coordinates","mouse","pickedFeature","tooltip","isLoading","showLoadingScreen","hasMovedDuringFrame","giro3dStore","annotationStore","measurementStore","widgetStore","giro3d","debounce","initializeGiro3DManager","disposeGiro3DManager","updateCoordinates","updateCursor","mainview","onMouseMove","onSearchResultSelected","poiCoordinates","bbox3","clicked","selectPanel","LoadingScreen","MainView","evt","AttributePanel","StatusBar","ToolBar","PanelContainer","ProgressBar","SearchOverlay","NavigationButtons","AlertToast","resolveConfiguration","configuration","defaultConfig","remoteConfiguration","loadRemoteConfiguration","createPieroApp","setConfiguration","pinia","createPinia","moduleStore","ctor","analysisStore","readyContext","moduleInitializations","init","app","createApp","App"],"mappings":"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","x_google_ignoreList":[19,31,51]}