leaflet-city-mapper 0.0.2 → 0.0.3

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 (919) hide show
  1. package/README.md +49 -3
  2. package/cucumber.mjs +1 -1
  3. package/dist/leaflet-city-mapper.js +3 -1
  4. package/dist/leaflet-city-mapper.js.map +4 -4
  5. package/package.json +2 -1
  6. package/src/archives/decodeDirectory.js +32 -0
  7. package/src/archives/decodeHeader.js +19 -0
  8. package/src/archives/getZxy.js +75 -0
  9. package/src/archives/loadDirectory.js +7 -0
  10. package/src/archives/tileId.js +19 -0
  11. package/src/archives/varint.js +15 -0
  12. package/src/camera/angles.js +6 -0
  13. package/src/camera/animationPoint.js +8 -0
  14. package/src/camera/cameraMapReady.js +8 -0
  15. package/src/camera/cancelCameraAnimation.js +11 -0
  16. package/src/camera/cleanupCameraMap.js +11 -0
  17. package/src/camera/constrainCameraToBounds.js +3 -0
  18. package/src/camera/displayPoint.js +3 -0
  19. package/src/camera/fitCameraBounds.js +48 -0
  20. package/src/camera/groundBounds.js +11 -0
  21. package/src/camera/initializeCameraMap.js +25 -0
  22. package/src/camera/mapAnimateCamera.js +17 -0
  23. package/src/camera/mapCamera.js +123 -0
  24. package/src/camera/mapContainerPointToLayerPoint.js +7 -0
  25. package/src/camera/mapGetBearing.js +1 -0
  26. package/src/camera/mapGetBounds.js +14 -0
  27. package/src/camera/mapGetBoundsCenterZoom.js +7 -0
  28. package/src/camera/mapGetBoundsZoom.js +14 -0
  29. package/src/camera/mapGetCenterLayerPoint.js +5 -0
  30. package/src/camera/mapGetPitch.js +1 -0
  31. package/src/camera/mapLayerPointToContainerPoint.js +7 -0
  32. package/src/camera/mapLimitCenter.js +12 -0
  33. package/src/camera/mapLimitOffset.js +10 -0
  34. package/src/camera/mapPanBy.js +9 -0
  35. package/src/camera/mapPanInside.js +14 -0
  36. package/src/camera/mapResetNorth.js +1 -0
  37. package/src/camera/mapResetNorthPitch.js +1 -0
  38. package/src/camera/mapSetBearing.js +1 -0
  39. package/src/camera/mapSetPitch.js +1 -0
  40. package/src/camera/mapSetPitchAndBearing.js +14 -0
  41. package/src/camera/mapSetZoomAround.js +11 -0
  42. package/src/camera/mapStopPitchBearingAnimation.js +6 -0
  43. package/src/camera/mapTryAnimatedPan.js +9 -0
  44. package/src/camera/mapUpdateCameraOverlays.js +7 -0
  45. package/src/camera/pointOf.js +3 -0
  46. package/src/camera/project.js +20 -0
  47. package/src/camera/runCameraAnimations.js +28 -0
  48. package/src/camera/scheduleCameraAnimation.js +8 -0
  49. package/src/camera/updateSky.js +16 -0
  50. package/src/camera/verticalGroundY.js +4 -0
  51. package/src/collision/collectMeshes.js +5 -0
  52. package/src/collision/collider.js +63 -0
  53. package/src/collision/intersectMeshes.js +133 -0
  54. package/src/collision/sortHits.js +23 -0
  55. package/src/constants/Compass.js +7 -0
  56. package/src/constants/ContainerResize.js +7 -0
  57. package/src/constants/HEIGHT.js +1 -0
  58. package/src/constants/PitchDrag.js +7 -0
  59. package/src/constants/ShiftRotate.js +7 -0
  60. package/src/constants/TILE_RADIUS.js +1 -0
  61. package/src/constants/TILE_SIZE.js +1 -0
  62. package/src/constants/TouchMode.js +6 -0
  63. package/src/constants/attachState.js +1 -0
  64. package/src/constants/cameraControlsState.js +1 -0
  65. package/src/constants/cityMapper.js +6 -0
  66. package/src/constants/dark.js +1 -0
  67. package/src/constants/elevationWGSL.js +27 -0
  68. package/src/constants/glass.js +1 -0
  69. package/src/constants/indexState.js +1 -0
  70. package/src/constants/mapCameraState.js +1 -0
  71. package/src/constants/nativeEventMaps.js +1 -0
  72. package/src/constants/nativeLayerState.js +1 -0
  73. package/src/constants/nativeMethodHandlers.js +31 -0
  74. package/src/constants/onMapChangeState.js +1 -0
  75. package/src/constants/onZoomAnimState.js +1 -0
  76. package/src/constants/parts.js +19 -0
  77. package/src/constants/pendingUpdates.js +1 -0
  78. package/src/constants/pumpState.js +1 -0
  79. package/src/constants/ringDirections.js +10 -0
  80. package/src/constants/roundProfile.js +1 -0
  81. package/src/constants/shirt.js +1 -0
  82. package/src/constants/skin.js +2 -0
  83. package/src/constants/trafficShader.js +49 -0
  84. package/src/constants/trousers.js +1 -0
  85. package/src/constants/tyre.js +1 -0
  86. package/src/constants/underEntryState.js +1 -0
  87. package/src/constants/vehicles.js +40 -0
  88. package/src/controls/acceptPitchDrag.js +4 -0
  89. package/src/controls/acceptRotateDrag.js +3 -0
  90. package/src/controls/adjustCameraDrag.js +10 -0
  91. package/src/controls/cameraControls.js +60 -0
  92. package/src/controls/cameraDragClick.js +9 -0
  93. package/src/controls/cameraDragContextMenu.js +8 -0
  94. package/src/controls/cameraDragDown.js +20 -0
  95. package/src/controls/cameraDragEnd.js +6 -0
  96. package/src/controls/cameraDragMove.js +23 -0
  97. package/src/controls/changeCameraTouch.js +14 -0
  98. package/src/controls/cleanupCameraTouch.js +24 -0
  99. package/src/controls/compassAddHooks.js +15 -0
  100. package/src/controls/compassOrientation.js +6 -0
  101. package/src/controls/compassRemoveHooks.js +5 -0
  102. package/src/controls/containerResizeAddHooks.js +8 -0
  103. package/src/controls/containerResizeRemoveHooks.js +5 -0
  104. package/src/controls/dragCamera.js +22 -0
  105. package/src/controls/editable.js +3 -0
  106. package/src/controls/endAllCameraDrags.js +7 -0
  107. package/src/controls/endAllCameraTouches.js +7 -0
  108. package/src/controls/endCameraTouch.js +11 -0
  109. package/src/controls/endCameraTouchEvent.js +5 -0
  110. package/src/controls/finishCameraDrag.js +9 -0
  111. package/src/controls/finishCompassPermission.js +16 -0
  112. package/src/controls/loadCameraControls.js +9 -0
  113. package/src/controls/moveCameraTouch.js +22 -0
  114. package/src/controls/notifyCameraTouchChange.js +1 -0
  115. package/src/controls/pitchDragAddHooks.js +6 -0
  116. package/src/controls/pitchDragRemoveHooks.js +5 -0
  117. package/src/controls/refreshRotateControl.js +7 -0
  118. package/src/controls/refreshRotateFocus.js +5 -0
  119. package/src/controls/removeCameraDrag.js +23 -0
  120. package/src/controls/resizeMap.js +3 -0
  121. package/src/controls/rotateButtonClick.js +7 -0
  122. package/src/controls/rotateButtonKeydown.js +11 -0
  123. package/src/controls/rotateControl.js +3 -0
  124. package/src/controls/rotateOnAdd.js +38 -0
  125. package/src/controls/rotateOnRemove.js +6 -0
  126. package/src/controls/shiftRotateAddHooks.js +8 -0
  127. package/src/controls/shiftRotateRemoveHooks.js +5 -0
  128. package/src/controls/shiftRotateWheel.js +9 -0
  129. package/src/controls/startCameraTouch.js +23 -0
  130. package/src/core/addImageState.js +7 -0
  131. package/src/core/addRasterImage.js +10 -0
  132. package/src/core/adjustCameraMarkerPan.js +22 -0
  133. package/src/core/beforeNativeRender.js +10 -0
  134. package/src/core/boundsQuad.js +11 -0
  135. package/src/core/bringNativeLayerToBack.js +3 -0
  136. package/src/core/bringNativeLayerToFront.js +3 -0
  137. package/src/core/cameraCircleBounds.js +6 -0
  138. package/src/core/cameraMarkerDrag.js +18 -0
  139. package/src/core/cameraMarkerOnDrag.js +8 -0
  140. package/src/core/cancelGridFade.js +10 -0
  141. package/src/core/closestCameraLayerPoint.js +7 -0
  142. package/src/core/compareNativeHits.js +3 -0
  143. package/src/core/current.js +3 -0
  144. package/src/core/disposeNativeLayer.js +35 -0
  145. package/src/core/fireRasterLoad.js +5 -0
  146. package/src/core/forwardNativeError.js +3 -0
  147. package/src/core/gridlayerGetEvents.js +7 -0
  148. package/src/core/gridlayerGetTiledPixelBounds.js +8 -0
  149. package/src/core/handleNativeMapEvent.js +47 -0
  150. package/src/core/hideTargets.js +16 -0
  151. package/src/core/initNativeGPU.js +21 -0
  152. package/src/core/initializeGridContainer.js +6 -0
  153. package/src/core/initializeNativeLayer.js +42 -0
  154. package/src/core/localPixel.js +5 -0
  155. package/src/core/localPixelForGeometry.js +6 -0
  156. package/src/core/localPosition.js +6 -0
  157. package/src/core/markerCameraIconPoint.js +9 -0
  158. package/src/core/markerGetEvents.js +5 -0
  159. package/src/core/markerInitInteraction.js +8 -0
  160. package/src/core/markerQuadCorners.js +31 -0
  161. package/src/core/markerSetIcon.js +9 -0
  162. package/src/core/markerSetPos.js +14 -0
  163. package/src/core/markerSetRotation.js +7 -0
  164. package/src/core/markerUpdateZIndex.js +8 -0
  165. package/src/core/nativeAddLatLng.js +3 -0
  166. package/src/core/nativeBringToBack.js +3 -0
  167. package/src/core/nativeBringToFront.js +3 -0
  168. package/src/core/nativeEvents.js +26 -0
  169. package/src/core/nativeImageError.js +8 -0
  170. package/src/core/nativeImageRefresh.js +7 -0
  171. package/src/core/nativeLayer.js +97 -0
  172. package/src/core/nativeLayerMethod.js +21 -0
  173. package/src/core/nativeRedraw.js +3 -0
  174. package/src/core/nativeSetBounds.js +3 -0
  175. package/src/core/nativeSetIcon.js +3 -0
  176. package/src/core/nativeSetLatLng.js +3 -0
  177. package/src/core/nativeSetLatLngs.js +3 -0
  178. package/src/core/nativeSetOpacity.js +3 -0
  179. package/src/core/nativeSetRadius.js +3 -0
  180. package/src/core/nativeSetStyle.js +3 -0
  181. package/src/core/nativeSetUrl.js +3 -0
  182. package/src/core/nativeSetZIndex.js +3 -0
  183. package/src/core/nativeSetZIndexOffset.js +3 -0
  184. package/src/core/popupAdjustPan.js +23 -0
  185. package/src/core/popupGetEvents.js +5 -0
  186. package/src/core/popupUpdatePosition.js +14 -0
  187. package/src/core/putNativeMesh.js +33 -0
  188. package/src/core/quadNativeMesh.js +15 -0
  189. package/src/core/readyNativeGPU.js +6 -0
  190. package/src/core/refreshNativeEvent.js +5 -0
  191. package/src/core/refreshNativeLayer.js +29 -0
  192. package/src/core/refreshNativeLayerContract.js +3 -0
  193. package/src/core/rejectNativeReady.js +3 -0
  194. package/src/core/removeImageState.js +8 -0
  195. package/src/core/removeNativeEvents.js +16 -0
  196. package/src/core/removeTargets.js +8 -0
  197. package/src/core/reorderNativeLayer.js +6 -0
  198. package/src/core/resolveNativeReady.js +3 -0
  199. package/src/core/restoreNativeEvents.js +6 -0
  200. package/src/core/runGridFades.js +14 -0
  201. package/src/core/runMarkerPanFrame.js +12 -0
  202. package/src/core/scheduleGridFade.js +9 -0
  203. package/src/core/scheduleMarkerPan.js +8 -0
  204. package/src/core/styleNativeMesh.js +10 -0
  205. package/src/core/syncGridLayer.js +22 -0
  206. package/src/core/syncImageOverlay.js +9 -0
  207. package/src/core/syncMarker.js +12 -0
  208. package/src/core/syncVectorLayer.js +26 -0
  209. package/src/core/synchronizeNativeLayer.js +35 -0
  210. package/src/core/textureFor.js +48 -0
  211. package/src/core/tooltipGetEvents.js +5 -0
  212. package/src/core/tooltipSetPosition.js +8 -0
  213. package/src/core/updateGridOpacity.js +23 -0
  214. package/src/core/updateNativeLayerView.js +6 -0
  215. package/src/core/uploadCanvasTexture.js +19 -0
  216. package/src/geometry/addBridges.js +88 -0
  217. package/src/geometry/below.js +3 -0
  218. package/src/geometry/box.js +3 -0
  219. package/src/geometry/bridgeElevation.js +19 -0
  220. package/src/geometry/bridgeLocal.js +4 -0
  221. package/src/geometry/build.js +19 -0
  222. package/src/geometry/circleAt.js +5 -0
  223. package/src/geometry/clipLine.js +23 -0
  224. package/src/geometry/clipSegment.js +19 -0
  225. package/src/geometry/computeBounds.js +33 -0
  226. package/src/geometry/conformModelToTerrain.js +67 -0
  227. package/src/geometry/cross.js +3 -0
  228. package/src/geometry/disk.js +11 -0
  229. package/src/geometry/diskAt.js +4 -0
  230. package/src/geometry/dot.js +6 -0
  231. package/src/geometry/emitter.js +8 -0
  232. package/src/geometry/lampPostGeometry.js +24 -0
  233. package/src/geometry/lampRing.js +11 -0
  234. package/src/geometry/lightGeometry.js +15 -0
  235. package/src/geometry/line.js +54 -0
  236. package/src/geometry/nativeGeometry.js +55 -0
  237. package/src/geometry/nativeTriangle.js +3 -0
  238. package/src/geometry/polygon.js +22 -0
  239. package/src/geometry/push.js +3 -0
  240. package/src/geometry/quad.js +4 -0
  241. package/src/geometry/roofCoverage.js +52 -0
  242. package/src/geometry/samePoint.js +3 -0
  243. package/src/geometry/segment.js +21 -0
  244. package/src/geometry/setVertexColor.js +15 -0
  245. package/src/geometry/sub.js +6 -0
  246. package/src/geometry/surface.js +17 -0
  247. package/src/geometry/treeGeometry.js +31 -0
  248. package/src/geometry/treeRing.js +14 -0
  249. package/src/geometry/triangle.js +12 -0
  250. package/src/geometry/vertexNormals.js +32 -0
  251. package/src/geometry/visit.js +9 -0
  252. package/src/index.js +41 -323
  253. package/src/lighting/cacheLightGrid.js +23 -0
  254. package/src/lighting/collectLightMeshes.js +6 -0
  255. package/src/lighting/lightGrid.js +42 -0
  256. package/src/lighting/updatePointLights.js +34 -0
  257. package/src/lighting/visitCells.js +15 -0
  258. package/src/lighting/worldLights.js +27 -0
  259. package/src/models/decodeModel.js +45 -0
  260. package/src/models/hasUnsupportedPrimitives.js +10 -0
  261. package/src/models/loadBuffer.js +6 -0
  262. package/src/models/loadImage.js +15 -0
  263. package/src/models/loadModel.js +69 -0
  264. package/src/models/materialFor.js +21 -0
  265. package/src/models/modelNode.js +93 -0
  266. package/src/models/readAccessor.js +53 -0
  267. package/src/models/readAccessorValues.js +16 -0
  268. package/src/models/textureFor.js +35 -0
  269. package/src/picking/collectVisibleMesh.js +4 -0
  270. package/src/picking/findFeature.js +49 -0
  271. package/src/picking/hit.js +23 -0
  272. package/src/picking/hitMesh.js +30 -0
  273. package/src/picking/pointerClick.js +5 -0
  274. package/src/picking/pointerLeave.js +5 -0
  275. package/src/picking/pointerMove.js +5 -0
  276. package/src/picking/raycast.js +59 -0
  277. package/src/picking/setHighlight.js +13 -0
  278. package/src/picking/shouldSkipOther.js +3 -0
  279. package/src/picking/showFeature.js +34 -0
  280. package/src/raster/addRasterTile.js +114 -0
  281. package/src/raster/comparePendingTiles.js +5 -0
  282. package/src/raster/createGeometry.js +22 -0
  283. package/src/raster/createRasterMesh.js +47 -0
  284. package/src/raster/finishAttachment.js +11 -0
  285. package/src/raster/finishRasterTile.js +47 -0
  286. package/src/raster/getRasterEvents.js +6 -0
  287. package/src/raster/getRasterTileSize.js +5 -0
  288. package/src/raster/initRaster.js +38 -0
  289. package/src/raster/isLoading.js +5 -0
  290. package/src/raster/loadRasterTile.js +10 -0
  291. package/src/raster/onPMTileAdd.js +10 -0
  292. package/src/raster/onPMTileRemove.js +8 -0
  293. package/src/raster/pruneRasterTiles.js +37 -0
  294. package/src/raster/pumpRasterTiles.js +22 -0
  295. package/src/raster/readyRaster.js +13 -0
  296. package/src/raster/registerTerrainTile.js +12 -0
  297. package/src/raster/releaseRasterTile.js +18 -0
  298. package/src/raster/releaseRasterTiles.js +15 -0
  299. package/src/raster/removeRasterTile.js +13 -0
  300. package/src/raster/reportError.js +6 -0
  301. package/src/raster/setPMTileOpacity.js +7 -0
  302. package/src/raster/setPMTileZIndex.js +7 -0
  303. package/src/raster/setRasterOpacity.js +11 -0
  304. package/src/raster/setRasterTerrain.js +21 -0
  305. package/src/raster/setRasterZIndex.js +11 -0
  306. package/src/raster/updateAttachedTiles.js +10 -0
  307. package/src/raster/updateRasterTiles.js +59 -0
  308. package/src/rendering/collectFrameMeshes.js +31 -0
  309. package/src/rendering/collectMeshes.js +36 -0
  310. package/src/rendering/compareMeshes.js +10 -0
  311. package/src/rendering/compareRoofTiles.js +4 -0
  312. package/src/rendering/composeRoofAtlas.js +52 -0
  313. package/src/rendering/createMesh.js +33 -0
  314. package/src/rendering/createProgram.js +92 -0
  315. package/src/rendering/destroyAfterSubmission.js +8 -0
  316. package/src/rendering/destroyTexture.js +6 -0
  317. package/src/rendering/disposeMesh.js +14 -0
  318. package/src/rendering/drawGeometry.js +129 -0
  319. package/src/rendering/drawSceneMeshes.js +51 -0
  320. package/src/rendering/ensureRoofBlit.js +40 -0
  321. package/src/rendering/prepareFrameMeshes.js +42 -0
  322. package/src/rendering/prepareFrameUniforms.js +49 -0
  323. package/src/rendering/rebuildRoofAtlas.js +67 -0
  324. package/src/rendering/render.js +57 -0
  325. package/src/rendering/reportCompilation.js +17 -0
  326. package/src/rendering/resizeRenderer.js +19 -0
  327. package/src/rendering/sortMeshes.js +6 -0
  328. package/src/rendering/synchronizeZoomView.js +34 -0
  329. package/src/rendering/textureBinding.js +7 -0
  330. package/src/rendering/updateMapCamera.js +32 -0
  331. package/src/rendering/updateRoofRaster.js +32 -0
  332. package/src/scene/attach.js +161 -0
  333. package/src/scene/attachLayer.js +10 -0
  334. package/src/scene/cancelUpdate.js +10 -0
  335. package/src/scene/emptyEvents.js +3 -0
  336. package/src/scene/emptyNode.js +11 -0
  337. package/src/scene/endZoom.js +16 -0
  338. package/src/scene/failAttachment.js +9 -0
  339. package/src/scene/get3DEvents.js +13 -0
  340. package/src/scene/init3D.js +30 -0
  341. package/src/scene/initializeLayer.js +16 -0
  342. package/src/scene/initializerFor.js +14 -0
  343. package/src/scene/layerInitialize.js +38 -0
  344. package/src/scene/layerLayerAdd.js +21 -0
  345. package/src/scene/onAdd3DLayer.js +35 -0
  346. package/src/scene/onMapChange.js +16 -0
  347. package/src/scene/onRemove3DLayer.js +69 -0
  348. package/src/scene/onZoomAnim.js +16 -0
  349. package/src/scene/placeEntry.js +11 -0
  350. package/src/scene/placeUnderEntry.js +8 -0
  351. package/src/scene/ready3D.js +25 -0
  352. package/src/scene/releaseRenderer.js +14 -0
  353. package/src/scene/removeEntry.js +6 -0
  354. package/src/scene/renderPendingMapChange.js +11 -0
  355. package/src/scene/renderPendingUpdates.js +19 -0
  356. package/src/scene/renderPendingZoomAnimation.js +7 -0
  357. package/src/scene/rendererDeviceError.js +10 -0
  358. package/src/scene/rendererDeviceLost.js +11 -0
  359. package/src/scene/replaceEntry.js +7 -0
  360. package/src/scene/reportError.js +3 -0
  361. package/src/scene/requestAdapter.js +12 -0
  362. package/src/scene/requestDevice.js +9 -0
  363. package/src/scene/resolveNextInitialization.js +12 -0
  364. package/src/scene/restoreObject.js +71 -0
  365. package/src/scene/runPlacements.js +7 -0
  366. package/src/scene/showWebGPUWarning.js +16 -0
  367. package/src/scene/traverse.js +7 -0
  368. package/src/scene/underEntry.js +17 -0
  369. package/src/scene/update.js +19 -0
  370. package/src/scene/updateCamera.js +34 -0
  371. package/src/scene/updateWorldMatrix.js +48 -0
  372. package/src/shaders/materialShaders.js +246 -0
  373. package/src/shadows/bindSunlight.js +12 -0
  374. package/src/shadows/drawShadowMeshes.js +48 -0
  375. package/src/shadows/ensureShadowPipeline.js +53 -0
  376. package/src/shadows/renderSunlight.js +46 -0
  377. package/src/shadows/resizeSunlight.js +15 -0
  378. package/src/shadows/shadowBounds.js +32 -0
  379. package/src/shadows/shadowCacheMatches.js +23 -0
  380. package/src/shadows/shadowMatrix.js +39 -0
  381. package/src/sources/addGeneratedTriangle.js +6 -0
  382. package/src/sources/addTriangle.js +17 -0
  383. package/src/sources/attachAreaMesh.js +58 -0
  384. package/src/sources/buildArea.js +42 -0
  385. package/src/sources/buildAreaFeature.js +41 -0
  386. package/src/sources/buildAreaPoint.js +25 -0
  387. package/src/sources/buildAreaPolygon.js +29 -0
  388. package/src/sources/compareAreaDistance.js +4 -0
  389. package/src/sources/generateTreeGeometry.js +11 -0
  390. package/src/sources/groundOffset.js +3 -0
  391. package/src/sources/initializeGeoJSON.js +8 -0
  392. package/src/sources/instanceAreaGeometry.js +29 -0
  393. package/src/sources/projectRing.js +20 -0
  394. package/src/sources/projectedTree.js +13 -0
  395. package/src/sources/pump.js +54 -0
  396. package/src/sources/releaseArea.js +22 -0
  397. package/src/sources/setGeoJSONData.js +12 -0
  398. package/src/sources/setGeoJSONLayerData.js +5 -0
  399. package/src/sources/sourceAreaContext.js +9 -0
  400. package/src/sources/updateArea.js +45 -0
  401. package/src/sources/updateStatus.js +12 -0
  402. package/src/sunlight/addTimeLayer.js +3 -0
  403. package/src/sunlight/addTo.js +10 -0
  404. package/src/sunlight/atmosphere.js +28 -0
  405. package/src/sunlight/initSunlight.js +14 -0
  406. package/src/sunlight/initialize.js +11 -0
  407. package/src/sunlight/mix.js +6 -0
  408. package/src/sunlight/onAdd.js +5 -0
  409. package/src/sunlight/onAddSun.js +66 -0
  410. package/src/sunlight/remove.js +7 -0
  411. package/src/sunlight/removeSun.js +15 -0
  412. package/src/sunlight/removeTimeLayer.js +3 -0
  413. package/src/sunlight/render.js +7 -0
  414. package/src/sunlight/rgb.js +6 -0
  415. package/src/sunlight/styleTimeControl.js +7 -0
  416. package/src/sunlight/tickSun.js +5 -0
  417. package/src/sunlight/updateSky.js +20 -0
  418. package/src/sunlight/updateSun.js +34 -0
  419. package/src/sunlight/useLiveTime.js +6 -0
  420. package/src/sunlight/useSelectedTime.js +20 -0
  421. package/src/terrain/clearLayerTerrain.js +5 -0
  422. package/src/terrain/getElevation.js +10 -0
  423. package/src/terrain/initTerrain.js +20 -0
  424. package/src/terrain/loadReadyTerrain.js +5 -0
  425. package/src/terrain/loadTerrain.js +63 -0
  426. package/src/terrain/loadTerrainTiles.js +13 -0
  427. package/src/terrain/onTerrainAdd.js +21 -0
  428. package/src/terrain/onTerrainChange.js +14 -0
  429. package/src/terrain/onTerrainRemove.js +41 -0
  430. package/src/terrain/readBridges.js +4 -0
  431. package/src/terrain/sample.js +7 -0
  432. package/src/terrain/setLayerTerrain.js +5 -0
  433. package/src/terrain/terrainAtlas.js +23 -0
  434. package/src/terrain/terrainElevation.js +20 -0
  435. package/src/terrain/terrainGrid.js +24 -0
  436. package/src/traffic/addTraffic.js +7 -0
  437. package/src/traffic/along.js +14 -0
  438. package/src/traffic/clockMinutes.js +6 -0
  439. package/src/traffic/compareDepartures.js +5 -0
  440. package/src/traffic/createTrafficMesh.js +7 -0
  441. package/src/traffic/destroyTrafficGpu.js +5 -0
  442. package/src/traffic/disposeTrafficObject.js +13 -0
  443. package/src/traffic/drawTrafficRoute.js +6 -0
  444. package/src/traffic/failTraffic.js +6 -0
  445. package/src/traffic/failedTrafficLoad.js +5 -0
  446. package/src/traffic/fetchTrafficLanes.js +10 -0
  447. package/src/traffic/groundTraffic.js +15 -0
  448. package/src/traffic/initTraffic.js +54 -0
  449. package/src/traffic/loadTraffic.js +15 -0
  450. package/src/traffic/loadedTrafficLanes.js +16 -0
  451. package/src/traffic/locateTraffic.js +9 -0
  452. package/src/traffic/moveTraffic.js +15 -0
  453. package/src/traffic/placeTraffic.js +21 -0
  454. package/src/traffic/prepareTraffic.js +25 -0
  455. package/src/traffic/readyTraffic.js +6 -0
  456. package/src/traffic/rebaseTraffic.js +58 -0
  457. package/src/traffic/rebuildTrafficMesh.js +28 -0
  458. package/src/traffic/removeTraffic.js +17 -0
  459. package/src/traffic/routeColor.js +6 -0
  460. package/src/traffic/routeGeometry.js +31 -0
  461. package/src/traffic/scheduledTrips.js +40 -0
  462. package/src/traffic/startTraffic.js +8 -0
  463. package/src/traffic/tickTraffic.js +57 -0
  464. package/src/traffic/toLanes.js +16 -0
  465. package/src/traffic/tooltip.js +11 -0
  466. package/src/traffic/trafficBounds.js +17 -0
  467. package/src/traffic/trafficNow.js +4 -0
  468. package/src/traffic/trafficStorage.js +5 -0
  469. package/src/traffic/tripsAt.js +27 -0
  470. package/src/traffic/updateTraffic.js +8 -0
  471. package/src/traffic/updateTrafficTerrain.js +12 -0
  472. package/src/traffic/vehicleOffsets.js +11 -0
  473. package/src/triangulation/area.js +9 -0
  474. package/src/triangulation/clean.js +18 -0
  475. package/src/triangulation/containsVertex.js +11 -0
  476. package/src/triangulation/cross.js +3 -0
  477. package/src/triangulation/crossesBoundary.js +8 -0
  478. package/src/triangulation/crossesRing.js +9 -0
  479. package/src/triangulation/equal.js +3 -0
  480. package/src/triangulation/inside.js +10 -0
  481. package/src/triangulation/insideHole.js +7 -0
  482. package/src/triangulation/intersects.js +11 -0
  483. package/src/triangulation/isClockWise.js +13 -0
  484. package/src/triangulation/minimumX.js +6 -0
  485. package/src/triangulation/on.js +4 -0
  486. package/src/triangulation/sortHoles.js +26 -0
  487. package/src/triangulation/triangulate.js +86 -0
  488. package/src/utils/channel.js +2 -2
  489. package/src/utils/compareDistance.js +3 -0
  490. package/src/utils/noOperation.js +1 -0
  491. package/src/utils/toSRGB.js +3 -1
  492. package/src/utils/wrap.js +3 -1
  493. package/src/vehicles/bicycleModel.js +23 -0
  494. package/src/vehicles/boatBenches.js +8 -0
  495. package/src/vehicles/boatModel.js +27 -0
  496. package/src/vehicles/busModel.js +6 -0
  497. package/src/vehicles/carModel.js +22 -0
  498. package/src/vehicles/carriage.js +19 -0
  499. package/src/vehicles/metroModel.js +9 -0
  500. package/src/vehicles/mirror.js +8 -0
  501. package/src/vehicles/pedestrianModel.js +17 -0
  502. package/src/vehicles/tramModel.js +9 -0
  503. package/src/walk/blocked.js +6 -0
  504. package/src/walk/createWalk.js +60 -0
  505. package/src/walk/initWalk.js +18 -0
  506. package/src/walk/initialize.js +6 -0
  507. package/src/walk/local.js +10 -0
  508. package/src/walk/onAdd.js +4 -0
  509. package/src/walk/onBlur.js +3 -0
  510. package/src/walk/onKey.js +12 -0
  511. package/src/walk/onPointer.js +13 -0
  512. package/src/walk/onRemove.js +4 -0
  513. package/src/walk/onTerrain.js +5 -0
  514. package/src/walk/place.js +18 -0
  515. package/src/walk/start.js +37 -0
  516. package/src/walk/step.js +53 -0
  517. package/src/walk/stop.js +27 -0
  518. package/src/walk/toggle.js +6 -0
  519. package/dist/utils/CELL.js +0 -2
  520. package/dist/utils/CELL.js.map +0 -7
  521. package/dist/utils/addBridges.js +0 -2
  522. package/dist/utils/addBridges.js.map +0 -7
  523. package/dist/utils/addRasterTile.js +0 -2
  524. package/dist/utils/addRasterTile.js.map +0 -7
  525. package/dist/utils/along.js +0 -2
  526. package/dist/utils/along.js.map +0 -7
  527. package/dist/utils/atmosphere.js +0 -2
  528. package/dist/utils/atmosphere.js.map +0 -7
  529. package/dist/utils/attach.js +0 -2
  530. package/dist/utils/attach.js.map +0 -7
  531. package/dist/utils/bindSunlight.js +0 -2
  532. package/dist/utils/bindSunlight.js.map +0 -7
  533. package/dist/utils/box.js +0 -2
  534. package/dist/utils/box.js.map +0 -7
  535. package/dist/utils/bridgeElevation.js +0 -2
  536. package/dist/utils/bridgeElevation.js.map +0 -7
  537. package/dist/utils/build.js +0 -2
  538. package/dist/utils/build.js.map +0 -7
  539. package/dist/utils/cameraControls.js +0 -2
  540. package/dist/utils/cameraControls.js.map +0 -7
  541. package/dist/utils/channel.js +0 -2
  542. package/dist/utils/channel.js.map +0 -7
  543. package/dist/utils/collider.js +0 -2
  544. package/dist/utils/collider.js.map +0 -7
  545. package/dist/utils/colliders.js +0 -2
  546. package/dist/utils/colliders.js.map +0 -7
  547. package/dist/utils/computeBounds.js +0 -2
  548. package/dist/utils/computeBounds.js.map +0 -7
  549. package/dist/utils/conformModelToTerrain.js +0 -2
  550. package/dist/utils/conformModelToTerrain.js.map +0 -7
  551. package/dist/utils/createMesh.js +0 -2
  552. package/dist/utils/createMesh.js.map +0 -7
  553. package/dist/utils/createProgram.js +0 -3
  554. package/dist/utils/createProgram.js.map +0 -7
  555. package/dist/utils/decodeDirectory.js +0 -2
  556. package/dist/utils/decodeDirectory.js.map +0 -7
  557. package/dist/utils/decodeHeader.js +0 -2
  558. package/dist/utils/decodeHeader.js.map +0 -7
  559. package/dist/utils/decodeModel.js +0 -2
  560. package/dist/utils/decodeModel.js.map +0 -7
  561. package/dist/utils/decompress.js +0 -2
  562. package/dist/utils/decompress.js.map +0 -7
  563. package/dist/utils/destroyTexture.js +0 -2
  564. package/dist/utils/destroyTexture.js.map +0 -7
  565. package/dist/utils/disposeMesh.js +0 -2
  566. package/dist/utils/disposeMesh.js.map +0 -7
  567. package/dist/utils/drawGeometry.js +0 -2
  568. package/dist/utils/drawGeometry.js.map +0 -7
  569. package/dist/utils/elevationWGSL.js +0 -24
  570. package/dist/utils/elevationWGSL.js.map +0 -7
  571. package/dist/utils/emptyNode.js +0 -2
  572. package/dist/utils/emptyNode.js.map +0 -7
  573. package/dist/utils/endZoom.js +0 -2
  574. package/dist/utils/endZoom.js.map +0 -7
  575. package/dist/utils/findFeature.js +0 -2
  576. package/dist/utils/findFeature.js.map +0 -7
  577. package/dist/utils/geometry.js +0 -1
  578. package/dist/utils/geometry.js.map +0 -7
  579. package/dist/utils/getElevation.js +0 -2
  580. package/dist/utils/getElevation.js.map +0 -7
  581. package/dist/utils/getHeader.js +0 -2
  582. package/dist/utils/getHeader.js.map +0 -7
  583. package/dist/utils/getZxy.js +0 -2
  584. package/dist/utils/getZxy.js.map +0 -7
  585. package/dist/utils/glass.js +0 -2
  586. package/dist/utils/glass.js.map +0 -7
  587. package/dist/utils/headlight.js +0 -2
  588. package/dist/utils/headlight.js.map +0 -7
  589. package/dist/utils/hit.js +0 -2
  590. package/dist/utils/hit.js.map +0 -7
  591. package/dist/utils/horizontalPosition.js +0 -2
  592. package/dist/utils/horizontalPosition.js.map +0 -7
  593. package/dist/utils/horizontalRay.js +0 -2
  594. package/dist/utils/horizontalRay.js.map +0 -7
  595. package/dist/utils/hull.js +0 -2
  596. package/dist/utils/hull.js.map +0 -7
  597. package/dist/utils/initSunlight.js +0 -2
  598. package/dist/utils/initSunlight.js.map +0 -7
  599. package/dist/utils/initTerrain.js +0 -2
  600. package/dist/utils/initTerrain.js.map +0 -7
  601. package/dist/utils/initTraffic.js +0 -40
  602. package/dist/utils/initTraffic.js.map +0 -7
  603. package/dist/utils/initWalk.js +0 -2
  604. package/dist/utils/initWalk.js.map +0 -7
  605. package/dist/utils/intersectMeshes.js +0 -2
  606. package/dist/utils/intersectMeshes.js.map +0 -7
  607. package/dist/utils/isClockWise.js +0 -2
  608. package/dist/utils/isClockWise.js.map +0 -7
  609. package/dist/utils/lampPostGeometry.js +0 -2
  610. package/dist/utils/lampPostGeometry.js.map +0 -7
  611. package/dist/utils/lightGeometry.js +0 -2
  612. package/dist/utils/lightGeometry.js.map +0 -7
  613. package/dist/utils/lightGrid.js +0 -2
  614. package/dist/utils/lightGrid.js.map +0 -7
  615. package/dist/utils/limbs.js +0 -2
  616. package/dist/utils/limbs.js.map +0 -7
  617. package/dist/utils/loadModel.js +0 -2
  618. package/dist/utils/loadModel.js.map +0 -7
  619. package/dist/utils/loadSource.js +0 -2
  620. package/dist/utils/loadSource.js.map +0 -7
  621. package/dist/utils/loadTerrain.js +0 -2
  622. package/dist/utils/loadTerrain.js.map +0 -7
  623. package/dist/utils/mapCamera.js +0 -2
  624. package/dist/utils/mapCamera.js.map +0 -7
  625. package/dist/utils/materialShaders.js +0 -211
  626. package/dist/utils/materialShaders.js.map +0 -7
  627. package/dist/utils/mirror.js +0 -2
  628. package/dist/utils/mirror.js.map +0 -7
  629. package/dist/utils/moonPosition.js +0 -2
  630. package/dist/utils/moonPosition.js.map +0 -7
  631. package/dist/utils/moves.js +0 -2
  632. package/dist/utils/moves.js.map +0 -7
  633. package/dist/utils/nativeEvents.js +0 -2
  634. package/dist/utils/nativeEvents.js.map +0 -7
  635. package/dist/utils/nativeGeometry.js +0 -2
  636. package/dist/utils/nativeGeometry.js.map +0 -7
  637. package/dist/utils/nativeLayer.js +0 -2
  638. package/dist/utils/nativeLayer.js.map +0 -7
  639. package/dist/utils/nodeMatrix.js +0 -2
  640. package/dist/utils/nodeMatrix.js.map +0 -7
  641. package/dist/utils/onAdd3DLayer.js +0 -2
  642. package/dist/utils/onAdd3DLayer.js.map +0 -7
  643. package/dist/utils/onAddSun.js +0 -2
  644. package/dist/utils/onAddSun.js.map +0 -7
  645. package/dist/utils/onClick.js +0 -2
  646. package/dist/utils/onClick.js.map +0 -7
  647. package/dist/utils/onMapChange.js +0 -2
  648. package/dist/utils/onMapChange.js.map +0 -7
  649. package/dist/utils/onPMTileAdd.js +0 -2
  650. package/dist/utils/onPMTileAdd.js.map +0 -7
  651. package/dist/utils/onPMTileRemove.js +0 -2
  652. package/dist/utils/onPMTileRemove.js.map +0 -7
  653. package/dist/utils/onPointerLeave.js +0 -2
  654. package/dist/utils/onPointerLeave.js.map +0 -7
  655. package/dist/utils/onPointerMove.js +0 -2
  656. package/dist/utils/onPointerMove.js.map +0 -7
  657. package/dist/utils/onRemove3DLayer.js +0 -2
  658. package/dist/utils/onRemove3DLayer.js.map +0 -7
  659. package/dist/utils/onRemoveSun.js +0 -2
  660. package/dist/utils/onRemoveSun.js.map +0 -7
  661. package/dist/utils/onTerrainAdd.js +0 -2
  662. package/dist/utils/onTerrainAdd.js.map +0 -7
  663. package/dist/utils/onTerrainChange.js +0 -2
  664. package/dist/utils/onTerrainChange.js.map +0 -7
  665. package/dist/utils/onTerrainRemove.js +0 -2
  666. package/dist/utils/onTerrainRemove.js.map +0 -7
  667. package/dist/utils/onZoomAnim.js +0 -2
  668. package/dist/utils/onZoomAnim.js.map +0 -7
  669. package/dist/utils/paints.js +0 -2
  670. package/dist/utils/paints.js.map +0 -7
  671. package/dist/utils/parseColor.js +0 -2
  672. package/dist/utils/parseColor.js.map +0 -7
  673. package/dist/utils/parts.js +0 -2
  674. package/dist/utils/parts.js.map +0 -7
  675. package/dist/utils/projectCelestialBody.js +0 -2
  676. package/dist/utils/projectCelestialBody.js.map +0 -7
  677. package/dist/utils/pump.js +0 -2
  678. package/dist/utils/pump.js.map +0 -7
  679. package/dist/utils/rasterTiles.js +0 -2
  680. package/dist/utils/rasterTiles.js.map +0 -7
  681. package/dist/utils/raycast.js +0 -2
  682. package/dist/utils/raycast.js.map +0 -7
  683. package/dist/utils/read.js +0 -2
  684. package/dist/utils/read.js.map +0 -7
  685. package/dist/utils/readAccessor.js +0 -2
  686. package/dist/utils/readAccessor.js.map +0 -7
  687. package/dist/utils/releaseArea.js +0 -2
  688. package/dist/utils/releaseArea.js.map +0 -7
  689. package/dist/utils/removeRasterTile.js +0 -2
  690. package/dist/utils/removeRasterTile.js.map +0 -7
  691. package/dist/utils/render.js +0 -15
  692. package/dist/utils/render.js.map +0 -7
  693. package/dist/utils/renderSunlight.js +0 -13
  694. package/dist/utils/renderSunlight.js.map +0 -7
  695. package/dist/utils/renderers.js +0 -2
  696. package/dist/utils/renderers.js.map +0 -7
  697. package/dist/utils/resizeSunlight.js +0 -2
  698. package/dist/utils/resizeSunlight.js.map +0 -7
  699. package/dist/utils/roofCoverage.js +0 -2
  700. package/dist/utils/roofCoverage.js.map +0 -7
  701. package/dist/utils/routeGeometry.js +0 -2
  702. package/dist/utils/routeGeometry.js.map +0 -7
  703. package/dist/utils/scheduledTrips.js +0 -2
  704. package/dist/utils/scheduledTrips.js.map +0 -7
  705. package/dist/utils/setGeoJSONData.js +0 -2
  706. package/dist/utils/setGeoJSONData.js.map +0 -7
  707. package/dist/utils/setHighlight.js +0 -2
  708. package/dist/utils/setHighlight.js.map +0 -7
  709. package/dist/utils/setPMTileOpacity.js +0 -2
  710. package/dist/utils/setPMTileOpacity.js.map +0 -7
  711. package/dist/utils/setPMTileZIndex.js +0 -2
  712. package/dist/utils/setPMTileZIndex.js.map +0 -7
  713. package/dist/utils/setParent.js +0 -2
  714. package/dist/utils/setParent.js.map +0 -7
  715. package/dist/utils/setTerrainHeight.js +0 -2
  716. package/dist/utils/setTerrainHeight.js.map +0 -7
  717. package/dist/utils/setVertexColor.js +0 -2
  718. package/dist/utils/setVertexColor.js.map +0 -7
  719. package/dist/utils/showFeature.js +0 -2
  720. package/dist/utils/showFeature.js.map +0 -7
  721. package/dist/utils/sizes.js +0 -2
  722. package/dist/utils/sizes.js.map +0 -7
  723. package/dist/utils/skin.js +0 -2
  724. package/dist/utils/skin.js.map +0 -7
  725. package/dist/utils/solarPosition.js +0 -2
  726. package/dist/utils/solarPosition.js.map +0 -7
  727. package/dist/utils/sortMeshes.js +0 -2
  728. package/dist/utils/sortMeshes.js.map +0 -7
  729. package/dist/utils/speed.js +0 -2
  730. package/dist/utils/speed.js.map +0 -7
  731. package/dist/utils/startZoom.js +0 -2
  732. package/dist/utils/startZoom.js.map +0 -7
  733. package/dist/utils/taillight.js +0 -2
  734. package/dist/utils/taillight.js.map +0 -7
  735. package/dist/utils/terrainAtlas.js +0 -2
  736. package/dist/utils/terrainAtlas.js.map +0 -7
  737. package/dist/utils/terrainElevation.js +0 -2
  738. package/dist/utils/terrainElevation.js.map +0 -7
  739. package/dist/utils/terrainGrid.js +0 -2
  740. package/dist/utils/terrainGrid.js.map +0 -7
  741. package/dist/utils/textureSampler.js +0 -2
  742. package/dist/utils/textureSampler.js.map +0 -7
  743. package/dist/utils/tileId.js +0 -2
  744. package/dist/utils/tileId.js.map +0 -7
  745. package/dist/utils/toLanes.js +0 -2
  746. package/dist/utils/toLanes.js.map +0 -7
  747. package/dist/utils/toSRGB.js +0 -2
  748. package/dist/utils/toSRGB.js.map +0 -7
  749. package/dist/utils/tooltip.js +0 -3
  750. package/dist/utils/tooltip.js.map +0 -7
  751. package/dist/utils/traffic.js +0 -2
  752. package/dist/utils/traffic.js.map +0 -7
  753. package/dist/utils/traverse.js +0 -2
  754. package/dist/utils/traverse.js.map +0 -7
  755. package/dist/utils/treeGeometry.js +0 -2
  756. package/dist/utils/treeGeometry.js.map +0 -7
  757. package/dist/utils/triangulate.js +0 -2
  758. package/dist/utils/triangulate.js.map +0 -7
  759. package/dist/utils/tripsAt.js +0 -2
  760. package/dist/utils/tripsAt.js.map +0 -7
  761. package/dist/utils/types.js +0 -2
  762. package/dist/utils/types.js.map +0 -7
  763. package/dist/utils/underEntry.js +0 -2
  764. package/dist/utils/underEntry.js.map +0 -7
  765. package/dist/utils/update.js +0 -2
  766. package/dist/utils/update.js.map +0 -7
  767. package/dist/utils/updateArea.js +0 -2
  768. package/dist/utils/updateArea.js.map +0 -7
  769. package/dist/utils/updateCamera.js +0 -2
  770. package/dist/utils/updateCamera.js.map +0 -7
  771. package/dist/utils/updatePointLights.js +0 -2
  772. package/dist/utils/updatePointLights.js.map +0 -7
  773. package/dist/utils/updateWorldMatrix.js +0 -2
  774. package/dist/utils/updateWorldMatrix.js.map +0 -7
  775. package/dist/utils/vehicleOffsets.js +0 -2
  776. package/dist/utils/vehicleOffsets.js.map +0 -7
  777. package/dist/utils/vehicles.js +0 -2
  778. package/dist/utils/vehicles.js.map +0 -7
  779. package/dist/utils/vertexNormals.js +0 -2
  780. package/dist/utils/vertexNormals.js.map +0 -7
  781. package/dist/utils/walk.js +0 -2
  782. package/dist/utils/walk.js.map +0 -7
  783. package/dist/utils/white.js +0 -2
  784. package/dist/utils/white.js.map +0 -7
  785. package/dist/utils/worldLights.js +0 -2
  786. package/dist/utils/worldLights.js.map +0 -7
  787. package/dist/utils/wrap.js +0 -2
  788. package/dist/utils/wrap.js.map +0 -7
  789. package/src/utils/addBridges.js +0 -66
  790. package/src/utils/addRasterTile.js +0 -112
  791. package/src/utils/along.js +0 -9
  792. package/src/utils/atmosphere.js +0 -20
  793. package/src/utils/attach.js +0 -255
  794. package/src/utils/bindSunlight.js +0 -12
  795. package/src/utils/box.js +0 -1
  796. package/src/utils/bridgeElevation.js +0 -18
  797. package/src/utils/build.js +0 -20
  798. package/src/utils/cameraControls.js +0 -287
  799. package/src/utils/collider.js +0 -62
  800. package/src/utils/computeBounds.js +0 -17
  801. package/src/utils/conformModelToTerrain.js +0 -69
  802. package/src/utils/createMesh.js +0 -31
  803. package/src/utils/createProgram.js +0 -92
  804. package/src/utils/decodeDirectory.js +0 -40
  805. package/src/utils/decodeHeader.js +0 -15
  806. package/src/utils/decodeModel.js +0 -43
  807. package/src/utils/destroyTexture.js +0 -7
  808. package/src/utils/disposeMesh.js +0 -13
  809. package/src/utils/drawGeometry.js +0 -122
  810. package/src/utils/elevationWGSL.js +0 -27
  811. package/src/utils/emptyNode.js +0 -9
  812. package/src/utils/endZoom.js +0 -15
  813. package/src/utils/findFeature.js +0 -49
  814. package/src/utils/geometry.js +0 -2
  815. package/src/utils/getElevation.js +0 -10
  816. package/src/utils/getZxy.js +0 -76
  817. package/src/utils/glass.js +0 -1
  818. package/src/utils/hit.js +0 -41
  819. package/src/utils/initSunlight.js +0 -9
  820. package/src/utils/initTerrain.js +0 -19
  821. package/src/utils/initTraffic.js +0 -93
  822. package/src/utils/initWalk.js +0 -72
  823. package/src/utils/intersectMeshes.js +0 -121
  824. package/src/utils/isClockWise.js +0 -12
  825. package/src/utils/lampPostGeometry.js +0 -26
  826. package/src/utils/lightGeometry.js +0 -22
  827. package/src/utils/lightGrid.js +0 -50
  828. package/src/utils/loadModel.js +0 -217
  829. package/src/utils/loadTerrain.js +0 -65
  830. package/src/utils/mapCamera.js +0 -432
  831. package/src/utils/materialShaders.js +0 -243
  832. package/src/utils/mirror.js +0 -6
  833. package/src/utils/nativeEvents.js +0 -77
  834. package/src/utils/nativeGeometry.js +0 -131
  835. package/src/utils/nativeLayer.js +0 -317
  836. package/src/utils/onAdd3DLayer.js +0 -31
  837. package/src/utils/onAddSun.js +0 -147
  838. package/src/utils/onMapChange.js +0 -16
  839. package/src/utils/onPMTileAdd.js +0 -15
  840. package/src/utils/onPMTileRemove.js +0 -8
  841. package/src/utils/onRemove3DLayer.js +0 -78
  842. package/src/utils/onRemoveSun.js +0 -3
  843. package/src/utils/onTerrainAdd.js +0 -18
  844. package/src/utils/onTerrainChange.js +0 -13
  845. package/src/utils/onTerrainRemove.js +0 -40
  846. package/src/utils/onZoomAnim.js +0 -14
  847. package/src/utils/parts.js +0 -16
  848. package/src/utils/pump.js +0 -226
  849. package/src/utils/rasterTiles.js +0 -285
  850. package/src/utils/raycast.js +0 -60
  851. package/src/utils/readAccessor.js +0 -68
  852. package/src/utils/releaseArea.js +0 -34
  853. package/src/utils/removeRasterTile.js +0 -13
  854. package/src/utils/render.js +0 -406
  855. package/src/utils/renderSunlight.js +0 -170
  856. package/src/utils/resizeSunlight.js +0 -15
  857. package/src/utils/roofCoverage.js +0 -47
  858. package/src/utils/routeGeometry.js +0 -22
  859. package/src/utils/scheduledTrips.js +0 -29
  860. package/src/utils/setGeoJSONData.js +0 -11
  861. package/src/utils/setHighlight.js +0 -13
  862. package/src/utils/setPMTileOpacity.js +0 -7
  863. package/src/utils/setPMTileZIndex.js +0 -7
  864. package/src/utils/setVertexColor.js +0 -14
  865. package/src/utils/showFeature.js +0 -27
  866. package/src/utils/skin.js +0 -2
  867. package/src/utils/sortMeshes.js +0 -12
  868. package/src/utils/terrainAtlas.js +0 -21
  869. package/src/utils/terrainElevation.js +0 -20
  870. package/src/utils/terrainGrid.js +0 -23
  871. package/src/utils/tileId.js +0 -18
  872. package/src/utils/toLanes.js +0 -7
  873. package/src/utils/tooltip.js +0 -6
  874. package/src/utils/traffic.js +0 -315
  875. package/src/utils/traverse.js +0 -6
  876. package/src/utils/treeGeometry.js +0 -45
  877. package/src/utils/triangulate.js +0 -100
  878. package/src/utils/tripsAt.js +0 -16
  879. package/src/utils/underEntry.js +0 -17
  880. package/src/utils/update.js +0 -18
  881. package/src/utils/updateArea.js +0 -40
  882. package/src/utils/updateCamera.js +0 -32
  883. package/src/utils/updatePointLights.js +0 -38
  884. package/src/utils/updateWorldMatrix.js +0 -47
  885. package/src/utils/vehicleOffsets.js +0 -8
  886. package/src/utils/vehicles.js +0 -65
  887. package/src/utils/vertexNormals.js +0 -30
  888. package/src/utils/walk.js +0 -187
  889. package/src/utils/worldLights.js +0 -25
  890. /package/src/{utils → archives}/decompress.js +0 -0
  891. /package/src/{utils → archives}/getHeader.js +0 -0
  892. /package/src/{utils → archives}/loadSource.js +0 -0
  893. /package/src/{utils → archives}/read.js +0 -0
  894. /package/src/{utils → collision}/horizontalRay.js +0 -0
  895. /package/src/{utils → constants}/CELL.js +0 -0
  896. /package/src/{utils/sizes.js → constants/accessorSizes.js} +0 -0
  897. /package/src/{utils/types.js → constants/accessorTypes.js} +0 -0
  898. /package/src/{utils → constants}/colliders.js +0 -0
  899. /package/src/{utils → constants}/headlight.js +0 -0
  900. /package/src/{utils → constants}/hull.js +0 -0
  901. /package/src/{utils → constants}/limbs.js +0 -0
  902. /package/src/{utils → constants}/moves.js +0 -0
  903. /package/src/{utils → constants}/paints.js +0 -0
  904. /package/src/{utils → constants}/renderers.js +0 -0
  905. /package/src/{utils → constants}/speed.js +0 -0
  906. /package/src/{utils → constants}/taillight.js +0 -0
  907. /package/src/{utils → constants}/white.js +0 -0
  908. /package/src/{utils → models}/nodeMatrix.js +0 -0
  909. /package/src/{utils → models}/textureSampler.js +0 -0
  910. /package/src/{utils → picking}/onClick.js +0 -0
  911. /package/src/{utils → picking}/onPointerLeave.js +0 -0
  912. /package/src/{utils → picking}/onPointerMove.js +0 -0
  913. /package/src/{utils → scene}/setParent.js +0 -0
  914. /package/src/{utils → scene}/startZoom.js +0 -0
  915. /package/src/{utils → sunlight}/horizontalPosition.js +0 -0
  916. /package/src/{utils → sunlight}/moonPosition.js +0 -0
  917. /package/src/{utils → sunlight}/projectCelestialBody.js +0 -0
  918. /package/src/{utils → sunlight}/solarPosition.js +0 -0
  919. /package/src/{utils → terrain}/setTerrainHeight.js +0 -0
@@ -1,2 +1,4 @@
1
- var f=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Map.prototype)),k=Math.PI/180,_=e=>Array.isArray(e)?new L.Point(e[0],e[1]):new L.Point(e.x,e.y);L.Map.mergeOptions({rotate:!0,bearing:0,pitch:0,pitchMaxDistance:3,rotateControl:!0,shiftKeyRotate:!0,pitchDrag:!0,touchRotate:!1,touchPitch:!1,compassBearing:!1});function H(e){let t=e.getBearing()*k,i=e.getPitch()*k;return[Math.cos(t),Math.sin(t),Math.cos(i),Math.sin(i)]}function B(e,t,i=!1,a=!1){let n=e.getSize().divideBy(2),o=e.getSize().y*1.5;if(!o)return _(t);let[s,r,d,h]=H(e),l=_(t).subtract(n);if(i){let p=e.getSize().y*e.options.pitchMaxDistance,P=d*o+h*l.y,y=P>0?l.y*o/P:-p;a&&(y=Math.max(-p,Math.min(p,y)));let v=l.x*(o-h*y)/o;return new L.Point(s*v+r*y,-r*v+s*y).add(n)}let u=s*l.x-r*l.y,g=r*l.x+s*l.y,c=o/(o-h*g);return new L.Point(u*c,d*g*c).add(n)}function R(e,t){return e.layerPointToContainerPoint(t).subtract(e._getMapPanePos())}function I(e,t,i=!1){let a=e._cameraView;if(!a)return t;let n=e.getSize().divideBy(2),o=e.getZoomScale(a.zoom),s=e.project(e.getCenter(),a.zoom).subtract(e.project(a.center,a.zoom));return i?t.subtract(n).subtract(s).divideBy(o).add(n):t.subtract(n).multiplyBy(o).add(s).add(n)}function Z(e,t=[0,0]){let i=_(t).divideBy(2),a=e.getSize().subtract(i);return new L.Bounds([[i.x,i.y],[a.x,i.y],[i.x,a.y],[a.x,a.y]].map(n=>B(e,n,!0,!0)))}function V(e,t,i={}){t=t.getBounds?t.getBounds():t instanceof L.LatLngBounds?t:new L.LatLngBounds(t);let a=e.getZoom()??0,n=e.getSize().divideBy(2),o=e.getSize().y*1.5,s=_(i.paddingTopLeft||i.padding||[0,0]).subtract(n),r=n.subtract(_(i.paddingBottomRight||i.padding||[0,0])),[d,h,l,u]=H(e),g=e.getSize().y*e.options.pitchMaxDistance,c=m=>l*o+u*m>0?Math.max(-g,Math.min(g,m*o/(l*o+u*m))):-g,p=c(s.y),P=c(r.y),y=e.project(t.getNorthWest(),a).add(e.project(t.getSouthEast(),a)).divideBy(2),v=[t.getNorthWest(),t.getNorthEast(),t.getSouthWest(),t.getSouthEast()].map(m=>{let S=e.project(m,a).subtract(y);return new L.Point(d*S.x-h*S.y,h*S.x+d*S.y)}),O=Math.min(...v.map(m=>m.y)),N=Math.max(...v.map(m=>m.y)),j=s.x*u/o,z=r.x*u/o,T=z-j,C=Math.min(...v.map(m=>m.x+j*m.y)),U=Math.max(...v.map(m=>m.x+z*m.y)),X=Math.min((P-p)/(N-O),(r.x-s.x-T*p)/(U-C-T*O)),x=e.getScaleZoom(X,a),A=e.options.zoomSnap;if(A&&(x=Math.floor(Math.round(x/(A/100))/100)*A),x=Math.max(e.getMinZoom(),Math.min(e.getMaxZoom(),i.maxZoom??1/0,x)),!Number.isFinite(x))return{center:t.getCenter(),zoom:x};let w=e.getZoomScale(x,a),$=N*w-P,W=O*w-p,Y=Math.max($,T?(w*(U-C)-r.x+s.x)/T:$),D=(Math.min(W,Y)+W)/2,q=(w*(C+U)-s.x-r.x-(j+z)*D)/2,Q=y.add(new L.Point(d*q+h*D,-h*q+d*D).divideBy(w));return{center:e.unproject(Q,a),zoom:x}}function J(){let e=this.getSize().y,t=this.getPitch()*k,i=e*this.options.pitchMaxDistance,a=e*1.5,n=e/2-i*Math.cos(t)*a/(a+Math.sin(t)*i);n>0&&!this._pitchSky&&(this._pitchSky=L.DomUtil.create("div","leaflet-pitch-sky",this.getContainer()),this._pitchSky.setAttribute("aria-hidden","true"),this._pitchSky.style.cssText="position:absolute;inset:0 0 auto;height:0;z-index:0;pointer-events:none;background:var(--leaflet-sky-background,linear-gradient(#9ec5e8,#dfe9f0))"),this._pitchSky&&(this._pitchSky.style.height=`${Math.max(0,Math.ceil(n))}px`,this._pitchSky.style.display=n>0?"":"none")}L.Map.include({getBearing(){return this._cameraBearing??0},getPitch(){return this._cameraPitch??0},_stopPitchBearingAnimation(){return cancelAnimationFrame(this._cameraFrame),this._cameraFrame=null,this},_setPitchAndBearing(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))throw new TypeError("Camera angles must be finite numbers");let i=this.getPitch(),a=this.getBearing();return this._cameraPitch=Math.max(0,Math.min(85,e)),this._cameraBearing=(t%360+360)%360,this._loaded&&(J.call(this),a!==this.getBearing()&&this.fire("rotate",{bearing:this.getBearing()}),i!==this.getPitch()&&this.fire("pitch",{pitch:this.getPitch()})),this},_animateCamera(e,t,i={}){if(cancelAnimationFrame(this._cameraFrame),!Number.isFinite(e)||!Number.isFinite(t))throw new TypeError("Camera angles must be finite numbers");if(!i.animate||matchMedia("(prefers-reduced-motion: reduce)").matches)return this._setPitchAndBearing(e,t);let a=i.duration??.3;if(!Number.isFinite(a)||a<0)throw new TypeError("Camera duration must be nonnegative");let n=performance.now(),o=this.getPitch(),s=this.getBearing(),r=((t-s)%360+540)%360-180,d=h=>{let l=a?Math.min(1,(h-n)/(a*1e3)):1,u=1-(1-l)**3;this._setPitchAndBearing(o+(Math.max(0,Math.min(85,e))-o)*u,s+r*u),l<1&&(this._cameraFrame=requestAnimationFrame(d))};return this._cameraFrame=requestAnimationFrame(d),this},setBearing(e,t){return this._animateCamera(this.getPitch(),e,t)},setPitch(e,t){return this._animateCamera(e,this.getBearing(),t)},resetNorth(e={animate:!0}){return this.setBearing(0,e)},resetNorthPitch(e={animate:!0}){return this._animateCamera(0,0,e)},layerPointToContainerPoint(e){return B(this,I(this,f.layerPointToContainerPoint.call(this,e)))},containerPointToLayerPoint(e){return f.containerPointToLayerPoint.call(this,I(this,B(this,e,!0),!0))},_getCenterLayerPoint(){return f.containerPointToLayerPoint.call(this,this.getSize().divideBy(2))},_updateCameraOverlays(){for(let e of Object.values(this._layers))e instanceof L.Marker?e.update():(e instanceof L.Popup||e instanceof L.Tooltip)&&e._updatePosition()},panBy(e,t){let i=this.getSize().divideBy(2),a=i.subtract(B(this,i.subtract(_(e)),!0));return f.panBy.call(this,a,t)},setZoomAround(e,t,i){if(!this.getPitch()&&!this.getBearing())return f.setZoomAround.call(this,e,t,i);t=this._limitZoom(t);let a=this.getZoomScale(t),n=this.getSize().divideBy(2),o=e instanceof L.Point?e:this.latLngToContainerPoint(e),s=this.containerPointToLayerPoint(n),r=this.containerPointToLayerPoint(o),d=s.add(r.subtract(s).multiplyBy(1-1/a));return this.setView(this.layerPointToLatLng(d),t,{zoom:i})},panInside(e,t={}){if(!this.getPitch()&&!this.getBearing())return f.panInside.call(this,e,t);let i=_(t.paddingTopLeft||t.padding||[0,0]),a=this.getSize().subtract(_(t.paddingBottomRight||t.padding||[0,0])),n=this.latLngToContainerPoint(e),o=new L.Point(Math.max(i.x,Math.min(a.x,n.x)),Math.max(i.y,Math.min(a.y,n.y)));if(o.equals(n))return this;let s=this.latLngToLayerPoint(e).subtract(this.containerPointToLayerPoint(o));return this.panTo(this.unproject(this.project(this.getCenter()).add(s)),t)},_limitCenter(e,t,i){if(!i||!this._loaded||!this.getPitch()&&!this.getBearing())return f._limitCenter.call(this,e,t,i);let a=this.getSize().divideBy(2),n=Z(this),o=this.project(e,t),s=new L.Bounds(o.add(n.min.subtract(a)),o.add(n.max.subtract(a))),r=this._getBoundsOffset(s,i,t);return Math.abs(r.x)<=1&&Math.abs(r.y)<=1?e:this.unproject(o.add(r),t)},_limitOffset(e,t){if(!t||!this.getPitch()&&!this.getBearing())return f._limitOffset.call(this,e,t);let i=this.getSize().divideBy(2),a=i.subtract(B(this,i.subtract(e),!0)),n=this.project(this.getCenter()),o=this.project(this._limitCenter(this.unproject(n.add(a)),this.getZoom(),t));return i.subtract(B(this,i.subtract(o.subtract(n))))},_getBoundsCenterZoom(e,t){return this.getPitch()||this.getBearing()?V(this,e,t):f._getBoundsCenterZoom.call(this,e,t)},getBoundsZoom(e,t,i){if(!this.getPitch()&&!this.getBearing())return f.getBoundsZoom.call(this,e,t,i);if(!t)return V(this,e,{padding:_(i||[0,0]).divideBy(2)}).zoom;e=e instanceof L.LatLngBounds?e:new L.LatLngBounds(e);let a=Z(this,i).getSize(),n=this.project(e.getSouthEast()).subtract(this.project(e.getNorthWest())),o=this.getScaleZoom(Math.max(a.x/n.x,a.y/n.y)),s=this.options.zoomSnap;return Math.max(this.getMinZoom(),Math.min(this.getMaxZoom(),s?Math.ceil(o/s)*s:o))},_tryAnimatedPan(e,t){let i=this._getCenterOffset(e)._trunc();return t?.animate!==!0&&!this.getSize().contains(i)?!1:(f.panBy.call(this,i,t),!0)},getBounds(){if(!this.getPitch()&&!this.getBearing())return f.getBounds.call(this);let e=Z(this),t=new L.LatLngBounds;for(let i of[e.min,e.max]){let a=f.containerPointToLayerPoint.call(this,I(this,i,!0));t.extend(this.layerPointToLatLng(a))}return t}});L.Map.addInitHook(function(){if(!document.getElementById("leaflet-camera-zoom-style")){let e=document.createElement("style");e.id="leaflet-camera-zoom-style",e.textContent=[".leaflet-marker-icon",".leaflet-marker-shadow",".leaflet-popup",".leaflet-tooltip"].map(t=>`.leaflet-camera-zoom ${t}`).join(",")+"{transition:none!important}",document.head.append(e)}this._setPitchAndBearing(this.options.pitch,this.options.bearing),this.on("load resize pitch",J),this.on("rotate pitch",()=>{this.options.maxBounds&&this._panInsideMaxBounds()}),this.once("unload",()=>{cancelAnimationFrame(this._cameraFrame),this._pitchSky?.remove()}),this.whenReady(()=>{let e=this.dragging?._draggable;if(!e)return;let t=()=>{if(!this.getPitch()&&!this.getBearing())return;let i=this.getSize().divideBy(2),a=e._newPos.subtract(e._startPos),n=i.subtract(B(this,i.subtract(a),!0));e._newPos=e._startPos.add(n)};e.on("predrag",t),this.once("unload",()=>e.off("predrag",t))}),(this.options.rotate||this.options.trackContainerMutation)&&(this.cameraReady=import("./utils/cameraControls.js").then(({cameraControls:e})=>{this._container?._leaflet_id&&e(this)}),this.cameraReady.catch(e=>this.fire("error",{error:e})))});var b=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Marker.prototype));L.Marker.mergeOptions({rotation:0,rotateWithView:!1,keepUpright:!1,scale:1});L.Marker.include({setIcon(e){e instanceof L.DivIcon||(e.options.crossOrigin||=!0);let t=b.setIcon.call(this,e);return this._map&&!(e instanceof L.DivIcon)&&this._initNativeGPU(this._map),t},setRotation(e){if(!Number.isFinite(e))throw new TypeError("Marker rotation must be finite");return this.options.rotation=e,this.update(),this._nativeGPU?.refresh?.(),this},_cameraIconPoint(e,t){let i=this.options.rotation+(this.options.rotateWithView?this._map.getBearing()*k:0);this.options.keepUpright&&Math.cos(i)<0&&(i+=Math.PI);let a=this.options.scale;return new L.Point((e*Math.cos(i)-t*Math.sin(i))*a,(e*Math.sin(i)+t*Math.cos(i))*a)},getEvents(){return{...b.getEvents.call(this),rotate:this.update,pitch:this.update,move:this.update}},_setPos(e){b._setPos.call(this,R(this._map,e));for(let[t,i]of[[this._icon,"iconAnchor"],[this._shadow,"shadowAnchor"]]){if(!t)continue;let a=this._cameraIconPoint(1,0),n=this.options.icon.options,o=n[i]||n.iconAnchor;t.style.transformOrigin=o?`${o.x??o[0]}px ${o.y??o[1]}px`:"center",t.style.transform+=` rotate(${Math.atan2(a.y,a.x)}rad) scale(${this.options.scale})`}},_updateZIndex(e){b._updateZIndex.call(this,e);let t=this._cameraZIndexOffset!==e;this._cameraZIndexOffset=e,t&&this._nativeGPU?.refresh?.()},_initInteraction(){let e=b._initInteraction.call(this);return tt.call(this),e}});function tt(){if(!this.dragging||this.dragging._cameraDrag)return;let e=this.dragging,t=e._onDrag,i=e._adjustPan;e._onDrag=function(n){let o=this._marker._map,s=L.DomUtil.getPosition(this._marker._icon).add(o._getMapPanePos()),r=o.containerPointToLayerPoint(s),d=this._marker._icon;L.DomUtil.setPosition(d,r),t.call(this,n),this._marker._setPos(r)},e._adjustPan=function(n){let o=this._marker,s=o._map;if(!s.getPitch()&&!s.getBearing())return i.call(this,n);let r=L.DomUtil.getPosition(o._icon).add(s._getMapPanePos()),d=s.getSize(),h=_(o.options.autoPanPadding),l=o.options.autoPanSpeed,u=new L.Point((Math.max(0,r.x-d.x+h.x)-Math.max(0,h.x-r.x))/Math.max(1,h.x)*l,(Math.max(0,r.y-d.y+h.y)-Math.max(0,h.y-r.y))/Math.max(1,h.y)*l);if(!u.x&&!u.y)return;let g=s._getMapPanePos();s.panBy(u,{animate:!1});let c=g.subtract(s._getMapPanePos());this._draggable._newPos._add(c),this._draggable._startPos._add(c),L.DomUtil.setPosition(o._icon,this._draggable._newPos),this._onDrag(n),this._panRequest=requestAnimationFrame(()=>this._adjustPan(n))},e.enabled()&&(e._draggable.off("drag",t,e),e._draggable.on("drag",e._onDrag,e)),e._cameraDrag=!0}for(let e of[L.Popup,L.Tooltip]){let t=e.prototype.getEvents;e.include({getEvents(){return{...t.call(this),rotate:this._updatePosition,pitch:this._updatePosition,move:this._updatePosition}}})}var et=L.Popup.prototype._updatePosition,it=L.Popup.prototype._adjustPan;L.Popup.include({_adjustPan(){let e=this._map;if(!e.getPitch()&&!e.getBearing())return it.call(this);if(!this.options.autoPan)return;if(e._panAnim&&e._panAnim.stop(),this._autopanning){this._autopanning=!1;return}let t=this._container.getBoundingClientRect(),i=e.getContainer().getBoundingClientRect(),a=_(this.options.autoPanPaddingTopLeft||this.options.autoPanPadding),n=e.getSize().subtract(_(this.options.autoPanPaddingBottomRight||this.options.autoPanPadding)),o=t.left-i.left,s=t.top-i.top,r=t.right-i.left,d=t.bottom-i.top,h=Math.min(0,o-a.x)||Math.max(0,r-n.x),l=Math.min(0,s-a.y)||Math.max(0,d-n.y);if(!h&&!l)return;this.options.keepInView&&(this._autopanning=!0);let u=e.latLngToContainerPoint(this._latlng).subtract(new L.Point(h,l)),g=e.latLngToLayerPoint(this._latlng).subtract(e.containerPointToLayerPoint(u));e.fire("autopanstart"),e.panTo(e.unproject(e.project(e.getCenter()).add(g)))},_updatePosition(){if(et.call(this),!this._map)return;let e=this._map.latLngToLayerPoint(this._latlng),t=R(this._map,e).subtract(e);this._zoomAnimated?L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(t)):(this._container.style.left=`${this._containerLeft+t.x}px`,this._container.style.bottom=`${this._containerBottom-t.y}px`)}});var nt=L.Tooltip.prototype._setPosition;L.Tooltip.include({_setPosition(e){nt.call(this,e);let t=R(this._map,e).subtract(e);L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(t))}});var at=L.GridLayer.prototype._getTiledPixelBounds,ot=L.GridLayer.prototype.getEvents;L.GridLayer.include({getEvents(){let e=ot.call(this);return this._cameraGridUpdate||=L.Util.throttle(this._onMoveEnd,this.options.updateInterval,this),{...e,rotate:this._cameraGridUpdate,pitch:this._cameraGridUpdate}},_getTiledPixelBounds(e){if(!this._map.getBearing()&&!this._map.getPitch())return at.call(this,e);let t=this._map.getBounds();return new L.Bounds(this._map.project(t.getNorthWest(),this._tileZoom),this._map.project(t.getSouthEast(),this._tileZoom))}});var G=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Layer.prototype)),E=Promise.resolve(),M,st,F,K;L.Layer._renderers=new WeakMap;L.Layer._nextId=0;L.Layer.include({_layerAdd(e){let t=!this._3d&&(this instanceof L.GridLayer||this instanceof L.Polyline||this instanceof L.CircleMarker||this instanceof L.Marker&&!(this.options.icon instanceof L.DivIcon)||this instanceof L.ImageOverlay&&!(this instanceof L.VideoOverlay)&&!(this instanceof L.SVGOverlay));t&&((this instanceof L.GridLayer||this instanceof L.ImageOverlay)&&(this.options.crossOrigin||=!0),this instanceof L.Marker&&(this.options.icon.options.crossOrigin||=!0)),G._layerAdd.call(this,e),!(!t||!e.target.hasLayer(this))&&this._initNativeGPU(e.target)},_initNativeGPU(e){if(this._nativeGPU)return;if(!document.getElementById("leaflet-webgpu-targets")){let i=document.createElement("style");i.id="leaflet-webgpu-targets",i.textContent=".leaflet-webgpu-target{opacity:0!important}",document.head.append(i)}let t=this._nativeGPU={source:this,map:e,hidden:new Set};t.hide=()=>{let i=this instanceof L.Marker&&this.options.icon instanceof L.DivIcon,a=[i?null:this._icon,i?null:this._shadow];for(let n of t.hidden)a.includes(n)||(n.classList.remove("leaflet-webgpu-target"),t.hidden.delete(n));for(let n of a)!n||t.hidden.has(n)||(n.classList.add("leaflet-webgpu-target"),t.hidden.add(n))},t.hide(),this.once("remove",()=>{this._nativeGPU===t&&(this._nativeGPU=null),t.dispose?.();for(let i of t.hidden)i.classList.remove("leaflet-webgpu-target")}),K||=import("./utils/nativeLayer.js"),this.ready=K.then(({nativeLayer:i})=>this._nativeGPU!==t?this:i(t)),this.ready.catch(i=>this.fire("error",{error:i}))},_init3D(e={}){let t=this,i=st||=Promise.all([import("./utils/onAdd3DLayer.js"),import("./utils/onRemove3DLayer.js"),import("./utils/updateArea.js"),import("./utils/onTerrainChange.js")]).then(([n,o,s,r])=>M={...n,...o,...s,...r});t._3d=!0,L.Util.setOptions(t,{ariaLabel:"3D scene",...e}),t.onAdd=n=>{if(M)return M.onAdd3DLayer(t,n);i.then(({onAdd3DLayer:o})=>{t._map===n&&o(t,n)}).catch(o=>t.fire("error",{error:o}))},t.onRemove=n=>{if(M)return M.onRemove3DLayer(t,n);i.then(({onRemove3DLayer:o})=>o(t,n)).catch(o=>t.fire("error",{error:o}))},t.getEvents=()=>{let n={};return t.url&&(n.moveend=n.zoomend=n.rotate=n.pitch=n.resize=()=>M?M.updateArea(t):i.then(({updateArea:o})=>o(t))),(t._geojson||t.url)&&(n.terrainchange=()=>M?M.onTerrainChange(t):i.then(({onTerrainChange:o})=>o(t))),n};let a=!t._geojson&&/\.(glb|gltf)(?:[?#]|$)/i.test(t.options.url);t.modelUrl=a?t.options.url:null,t.url=t.options.url&&!a&&!t._geojson?new URL(t.options.url,document.baseURI).href:null,t._directories=new Map,t.options.center&&(t.location=new L.LatLng(t.options.center[0],t.options.center[1])),t._areas=new Map,t._inflight=0,t._added=Promise.withResolvers(),queueMicrotask(async()=>{try{await i,t.root=(await import("./utils/emptyNode.js")).emptyNode(),t.raycaster={origin:[0,0,0],direction:[0,0,0]},(t.url||t._geojson)&&(t.group=t.root,t.url&&(t.header=await(await import("./utils/getHeader.js")).getHeader(t))),t._map&&(await(await import("./utils/attach.js")).attach(t,t._map),t._added.resolve()),t.modelUrl&&await(await import("./utils/loadModel.js")).loadModel(t),t._shared&&(await import("./utils/update.js")).update(t),t.fire("ready")}catch(n){t.fire("error",{error:n})}})},_initRaster(e){let t=this,[{read:i},{getHeader:a},{getZxy:n},{onPMTileAdd:o},{onPMTileRemove:s},{getRasterTileSize:r,updateRasterTiles:d},{setPMTileOpacity:h},{setPMTileZIndex:l},{emptyNode:u}]=F;t._read=(c,p,P)=>i(t,c,p,P),t.getHeader=()=>a(t),t.getZxy=(c,p,P,y)=>n(t,c,p,P,y),t.getTileSize=()=>r(),t.isLoading=()=>t._loadingTiles>0,t.setOpacity=c=>h(t,c),t.setZIndex=c=>l(t,c),t.onAdd=c=>o(t,c),t.onRemove=c=>s(t,c);let g=()=>d(t);t.getEvents=()=>({moveend:g,zoomend:g,rotate:g,pitch:g,resize:g}),e={ariaLabel:"PMTiles raster",maxZoom:18,opacity:1,zIndex:0,...e},L.Util.setOptions(t,e),t.root=u(),t._areas=new Map,t._rasterTiles=new Map,t._loadingTiles=0,t._added=Promise.withResolvers(),t.url=new URL(e.url,document.baseURI).href,t._directories=new Map,t.ready=Promise.resolve(t.options.archive||t).then(async c=>{let p=await c.getHeader();return t.options.archive=c,t.header=p,t.options.maxNativeZoom===void 0&&(t.options.maxNativeZoom=p.maxZoom),t.options.maxZoom=Math.max(t.options.minZoom||0,t.options.maxZoom),t.fire("ready"),t}).catch(c=>{throw t.fire("error",{error:c}),c})},initialize(e={}){if(Object.getPrototypeOf(this)!==L.Layer.prototype||!e.source){if(G.initialize)return G.initialize.apply(this,arguments);L.Util.setOptions(this,e);return}let{source:{type:t=e.source.data?.type==="FeatureCollection"?"geojson":/\.pmtiles(?:[?#]|$)/i.test(e.source.url)?"pmtiles":"3d",...i},...a}=e,n={...i,...a};if(L.Util.setOptions(this,a),this._type=t,t==="3d"){this._init3D(n);return}if(t==="pmtiles"&&F){this._initRaster(n);return}this.onAdd=()=>{},this.onRemove=()=>{},E=E.catch(()=>{}).then(async()=>{switch(t){case"geojson":{let{setGeoJSONData:s}=await import("./utils/setGeoJSONData.js");return(r,d)=>{r._geojson=!0,r.setData=h=>s(r,h),r._init3D(d)}}case"pmtiles":return F=await Promise.all([import("./utils/read.js"),import("./utils/getHeader.js"),import("./utils/getZxy.js"),import("./utils/onPMTileAdd.js"),import("./utils/onPMTileRemove.js"),import("./utils/rasterTiles.js"),import("./utils/setPMTileOpacity.js"),import("./utils/setPMTileZIndex.js"),import("./utils/emptyNode.js")]),(s,r)=>s._initRaster(r);case"terrain":return(await import("./utils/initTerrain.js")).initTerrain;case"sunlight":return(await import("./utils/initSunlight.js")).initSunlight;case"traffic":return(await import("./utils/initTraffic.js")).initTraffic;case"walk":return(await import("./utils/initWalk.js")).initWalk;default:throw new Error(`Unknown layer type: ${t}`)}});let o=this.ready=E.then(s=>{let r=this._map;return r?.removeLayer(this),delete this.onAdd,delete this.onRemove,s(this,n),r?.addLayer(this),this.ready===o?this:this.ready});o.catch(s=>this.fire("error",{error:s}))}});L.Layer.addInitHook(function(){if(this instanceof L.Polyline||this instanceof L.CircleMarker){let e=()=>this._nativeGPU?.refresh?.();if(this.beforeAdd=this.onAdd=this.onRemove=this._updateBounds=()=>{},this.getEvents=()=>({}),this._renderer={options:{tolerance:0},_updatePath:e,_updateStyle:e,_bringToFront:()=>this._nativeGPU?.reorder?.(!0),_bringToBack:()=>this._nativeGPU?.reorder?.(!1)},this instanceof L.Polyline){let t=this.closestLayerPoint;this.closestLayerPoint=function(i){return this._project(),this._parts=this._rings,t.call(this,i)}}if(this instanceof L.Circle){let t=this.getBounds;this.getBounds=function(){return this._project(),t.call(this)}}}else if(this instanceof L.GridLayer){let e=this._initContainer;this._initContainer=function(){e.call(this),this._container.remove()},this._updateOpacity=function(){if(!this._map)return;let t=Date.now(),i=!1,a=!1;for(let n of Object.values(this._tiles||{}))!n.current||!n.loaded||(n._gpuOpacity=this._map._fadeAnimated?Math.min(1,(t-n.loaded)/200):1,n._gpuOpacity<1?i=!0:n.active||(this._onOpaqueTile(n),n.active=!0,a=!0));a&&!this._noPrune&&this._pruneTiles(),this._nativeGPU?.refresh?.(),cancelAnimationFrame(this._fadeFrame),i&&(this._fadeFrame=requestAnimationFrame(()=>this._updateOpacity()))}}else this instanceof L.ImageOverlay&&!(this instanceof L.VideoOverlay)&&!(this instanceof L.SVGOverlay)&&(this.onAdd=function(){this._image||this._initImage(),this._image.complete&&this._image.naturalWidth&&queueMicrotask(()=>this.fire("load"))},this.onRemove=()=>{},this.getEvents=()=>({}),this._reset=()=>this._nativeGPU?.refresh?.())});
1
+ (()=>{var ql=Object.defineProperty;var I=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var Hl=(e,t)=>{for(var r in t)ql(e,r,{get:t[r],enumerable:!0})};function wr(e){return e.closest?.('input,textarea,select,[contenteditable="true"]')}var No=I(()=>{});function Sa(e){let t=this._cameraShiftRotate;!e.shiftKey||wr(e.target)||e.target.closest(".leaflet-control")||(e.preventDefault(),e.stopImmediatePropagation(),t._map.setBearing(t._map.getBearing()+Math.sign(e.deltaY)*5))}var ba=I(()=>{No()});function Ca(){let e=this._map.getContainer();e._cameraShiftRotate=this,this._wheel=Sa,e.addEventListener("wheel",this._wheel,{passive:!1,capture:!0})}var jo=I(()=>{ba()});function Ea(){let e=this._map.getContainer();e.removeEventListener("wheel",this._wheel,!0),delete e._cameraShiftRotate}var Zo=I(()=>{});var Ba,Aa=I(()=>{jo();Zo();Ba=L.Handler.extend({addHooks:Ca,removeHooks:Ea})});var N,fe=I(()=>{N={}});function _r(e){let t=N.dragStates.get(this);if(t.drag||!t.accept(e)||wr(e.target))return;e.preventDefault(),e.stopPropagation(),t.moved=!1;let r=t.map.getContainer().getBoundingClientRect();t.drag={id:e.pointerId,x:e.clientX,y:e.clientY,cursor:t.element.style.cursor,cx:r.left+r.width/2,cy:r.top+r.height/2,dragging:t.map.dragging?.enabled()},t.map.dragging?.disable(),t.element.focus?.({preventScroll:!0}),t.element.setPointerCapture(e.pointerId),t.element.style.cursor="grabbing"}var $o=I(()=>{fe();No()});function Pr(e){let t=N.dragStates.get(this);if(!t.drag||t.drag.id!==e.pointerId)return;let r=e.clientX-t.drag.x,o=e.clientY-t.drag.y;if(Math.hypot(r,o)<3&&!t.moved)return;t.map._stopPitchBearingAnimation(),t.moved=!0,e.preventDefault();let i=r*t.sensitivity[0];if(t.orbit)if(Math.abs(t.drag.cy-t.drag.y)>100){let n=Math.atan2(e.clientY-t.drag.cy,e.clientX-t.drag.cx)-Math.atan2(e.clientY-t.drag.cy,t.drag.x-t.drag.cx);i=Math.atan2(Math.sin(n),Math.cos(n))*180/Math.PI}else i*=e.clientY<t.drag.cy?1:-1;t.map._setPitchAndBearing(t.map.getPitch()-o*t.sensitivity[1],t.map.getBearing()+i),t.drag.x=e.clientX,t.drag.y=e.clientY}var Vo=I(()=>{fe()});function ht(e,t){if(!e?.drag||t?.pointerId!==void 0&&t.pointerId!==e.drag.id)return;let r=e.drag;e.drag=null,e.element.hasPointerCapture?.(r.id)&&e.element.releasePointerCapture(r.id),r.dragging&&e.map.getContainer()._leaflet_id&&e.map.dragging.enable(),e.element.style.cursor=r.cursor}var Tr=I(()=>{});function Ne(e){ht(N.dragStates.get(this),e)}var qo=I(()=>{Tr();fe()});function Lr(e){let t=N.dragStates.get(this);t.moved&&(e.preventDefault(),e.stopPropagation(),t.moved=!1)}var Ho=I(()=>{fe()});function Sr(e){let t=N.dragStates.get(this);!t.drag&&!t.moved||(e.preventDefault(),e.stopPropagation())}var Wo=I(()=>{fe()});function br(){let e;for(e of N.cameraDrags)ht(e)}var Yo=I(()=>{fe();Tr()});function Cr(e,t,r,o=[.8,.5],i=!1){let n={map:e,element:t,accept:r,sensitivity:o,orbit:i,drag:null,moved:!1};return N.dragStates.set(t,n),N.cameraDrags.add(n),t.addEventListener("pointerdown",_r,!0),t.addEventListener("pointermove",Pr),t.addEventListener("pointerup",Ne),t.addEventListener("pointercancel",Ne),t.addEventListener("lostpointercapture",Ne),t.addEventListener("click",Lr,!0),t.addEventListener("contextmenu",Sr),window.addEventListener("blur",br),n}var Xo=I(()=>{fe();$o();Vo();qo();Ho();Wo();Yo()});function za(e){return!e.target.closest(".leaflet-control,.leaflet-marker-icon,.leaflet-popup")&&(e.button===2||e.button===0&&e.ctrlKey)}var Ia=I(()=>{});function Da(){this._dragState=Cr(this._map,this._map.getContainer(),za,[.8,.5],!0)}var Ko=I(()=>{Xo();Ia()});function Ra(e){ht(e);let{element:t}=e;t.removeEventListener("pointerdown",_r,!0),t.removeEventListener("pointermove",Pr),t.removeEventListener("pointerup",Ne),t.removeEventListener("pointercancel",Ne),t.removeEventListener("lostpointercapture",Ne),t.removeEventListener("click",Lr,!0),t.removeEventListener("contextmenu",Sr),N.dragStates.delete(t),N.cameraDrags.delete(e),N.cameraDrags.size||window.removeEventListener("blur",br)}var Ua=I(()=>{Tr();$o();Vo();qo();Ho();Wo();fe();Yo()});function Er(){Ra(this._dragState)}var Br=I(()=>{Ua()});var Oa,Ga=I(()=>{Ko();Br();Oa=L.Handler.extend({addHooks:Da,removeHooks:Er})});function Fa(e){let t=this.handler,r=Number.isFinite(e.webkitCompassHeading)?-e.webkitCompassHeading:e.alpha,o=e.absolute?0:screen.orientation?.angle??window.orientation??0;Number.isFinite(r)&&t._map.setBearing(r-o)}var Na=I(()=>{});function ja([e,t]){let{handler:r,generation:o}=e.value;try{if(!r.enabled()||r._generation!==o)return;if(!window.DeviceOrientationEvent||t.status!=="fulfilled"||t.value!=="granted")throw t.status==="rejected"?t.reason:new Error("Device compass permission unavailable or denied");window.addEventListener("deviceorientation",r._orientation),window.addEventListener("deviceorientationabsolute",r._orientation)}catch(i){r.disable(),r._map.fire("error",{error:i})}}var Za=I(()=>{});function $a(){this._compassGeneration=this._generation=(this._generation||0)+1,this._orientation={handler:this,handleEvent:Fa};let e=window.DeviceOrientationEvent?.requestPermission,t;try{t=e?e.call(window.DeviceOrientationEvent):"granted"}catch(r){t=Promise.reject(r)}Promise.allSettled([Promise.resolve({handler:this,generation:this._generation}),t]).then(ja)}var Jo=I(()=>{Na();Za()});function Va(){this._generation++,window.removeEventListener("deviceorientation",this._orientation),window.removeEventListener("deviceorientationabsolute",this._orientation)}var Qo=I(()=>{});var qa,Ha=I(()=>{Jo();Qo();qa=L.Handler.extend({addHooks:$a,removeHooks:Va})});function Wa(e){e[0]?.target._containerResizeMap.invalidateSize()}var Ya=I(()=>{});function Xa(){let e=this._map.getContainer();e._containerResizeMap=this._map,this._observer=new ResizeObserver(Wa),this._observer.observe(e)}var ko=I(()=>{Ya()});function Ka(){let e=this._map.getContainer();this._observer.disconnect(),delete e._containerResizeMap}var ei=I(()=>{});var Ja,Qa=I(()=>{ko();ei();Ja=L.Handler.extend({addHooks:Xa,removeHooks:Ka})});function ti(){this._map.fire("cameratouchchange")}var ka=I(()=>{});var ri,es=I(()=>{ka();ri=L.Handler.extend({addHooks:ti,removeHooks:ti})});function ts(e){let t=this._rotateControl,r=t._map;e.preventDefault(),t.options.visualizePitch?r.resetNorthPitch():r.resetNorth(),e.detail&&r.getContainer().focus({preventScroll:!0})}var rs=I(()=>{});function os(e){let t=this._rotateControl,r=t._map,o=e.shiftKey?15:5;if(e.key==="ArrowLeft")r.setBearing(r.getBearing()-o);else if(e.key==="ArrowRight")r.setBearing(r.getBearing()+o);else if(e.key==="ArrowUp"&&t.options.visualizePitch)r.setPitch(r.getPitch()+o);else if(e.key==="ArrowDown"&&t.options.visualizePitch)r.setPitch(r.getPitch()-o);else if(e.key==="Home"||e.key===" ")this.click();else return;e.preventDefault(),e.stopPropagation()}var is=I(()=>{});function Ar(){let e=this._map,t=this.options.visualizePitch?e.getPitch():0;this._arrow.style.transform=`scale(${1/Math.sqrt(Math.cos(t*Math.PI/180))}) rotateX(${t}deg) rotate(${e.getBearing()}deg)`,this._button.setAttribute("aria-description",`Bearing ${Math.round(e.getBearing())} degrees, pitch ${Math.round(e.getPitch())} degrees. Arrow keys adjust the camera; Home resets it.`),this._container.style.display=this.options.closeOnZeroBearing&&!e.getBearing()&&!t&&!this._container.contains(document.activeElement)?"none":""}var oi=I(()=>{});function ns(e){return e.button===0}var as=I(()=>{});function ss(){Ar.call(this._rotateControl)}var fs=I(()=>{oi()});function ms(e){let t=L.DomUtil.create("div","leaflet-control-rotate leaflet-bar"),r=L.DomUtil.create("a","leaflet-control-rotate-toggle",t);this._map=e,this._container=t,this._button=r,r._rotateControl=this,r.href="#",r.draggable=!1,r.setAttribute("role","button"),r.title=this.options.visualizePitch?"Reset bearing and pitch":"Reset bearing to north",r.setAttribute("aria-label",r.title),r.style.cssText="cursor:grab;touch-action:none";let o=L.DomUtil.create("span","leaflet-control-rotate-arrow",r);return this._arrow=o,o.setAttribute("aria-hidden","true"),o.style.cssText="display:block;width:100%;height:100%;pointer-events:none;background: no-repeat center / 29px 29px",o.style.backgroundImage='url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 29 29%27%3E%3Cpath fill=%27%23333%27 d=%27M10.5 14 14.5 6 18.5 14Z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27M10.5 16 14.5 24 18.5 16Z%27/%3E%3C/svg%3E")',r.onclick=ts,r.onkeydown=os,this._refresh=Ar,e.on("rotate pitch",this._refresh,this),this._refresh(),this._dragState=Cr(e,r,ns,[.8,this.options.visualizePitch?.5:0]),r.addEventListener("focusout",ss),L.DomEvent.on(r,"dblclick contextmenu",L.DomEvent.stop),L.DomEvent.disableClickPropagation(t),L.DomEvent.disableScrollPropagation(t),t}var ls=I(()=>{rs();is();oi();Xo();as();fs()});function ps(e){e.off("rotate pitch",this._refresh,this),Er.call(this)}var us=I(()=>{Br()});function cs(e){return new L.Control.Rotate(e)}var ds=I(()=>{});function zr(e){let t=this._cameraTouchState,{map:r,container:o}=t;if(t.touch||e.touches.length!==2||e.target.closest(".leaflet-control")||!r.touchRotate.enabled()&&!r.touchPitch.enabled())return;let[i,n]=e.touches;if(Math.hypot(n.clientX-i.clientX,n.clientY-i.clientY)<1)return;r._stopPitchBearingAnimation();let a=new L.Point((i.clientX+n.clientX)/2,(i.clientY+n.clientY)/2).subtract(new L.Point(o.getBoundingClientRect().left,o.getBoundingClientRect().top));t.touch={angle:Math.atan2(n.clientY-i.clientY,n.clientX-i.clientX),distance:Math.hypot(n.clientX-i.clientX,n.clientY-i.clientY),middle:a,anchor:r.containerPointToLatLng(a),zoom:r.getZoom(),bearing:r.getBearing(),pitch:r.getPitch(),zooming:r.touchZoom?.enabled(),dragging:r.dragging?.enabled()},r.dragging?.disable(),e.preventDefault(),e.stopImmediatePropagation(),t.nativeZoom!==void 0&&(t.touch.zooming=t.nativeZoom),t.touch.snap=r.options.zoomSnap,r.options.zoomSnap=0}var ii=I(()=>{});function Ir(e){let t=this._cameraTouchState,{map:r,container:o,touch:i}=t;if(!i||e.touches.length!==2)return;let[n,a]=e.touches,s=Math.atan2(a.clientY-n.clientY,a.clientX-n.clientX),f=new L.Point((n.clientX+a.clientX)/2,(n.clientY+a.clientY)/2).subtract(new L.Point(o.getBoundingClientRect().left,o.getBoundingClientRect().top)),m=Math.atan2(Math.sin(s-i.angle),Math.cos(s-i.angle))*180/Math.PI;r._setPitchAndBearing(r.touchPitch.enabled()?i.pitch-(f.y-i.middle.y)*.25:i.pitch,r.touchRotate.enabled()?i.bearing+m:i.bearing);let l=Math.hypot(a.clientX-n.clientX,a.clientY-n.clientY);if(l<1)return;let p=i.zooming?Math.max(r.getMinZoom(),Math.min(r.getMaxZoom(),i.zoom+Math.log2(l/i.distance))):i.zoom;if(r.setView(r.getCenter(),p,{animate:!1}),r.options.touchZoom!=="center"){let u=r.project(i.anchor).subtract(r.project(r.containerPointToLatLng(f)));r.setView(r.unproject(r.project(r.getCenter()).add(u)),r.getZoom(),{animate:!1})}e.preventDefault(),e.stopImmediatePropagation()}var ni=I(()=>{});function je(e,t){if(!e.touch||t?.touches?.length>=2)return;let{map:r,container:o,touch:i}=e;i.dragging&&o._leaflet_id&&r.dragging.enable(),r.options.zoomSnap=i.snap,i.zooming&&i.snap&&o._leaflet_id&&r.setZoom(Math.round(r.getZoom()/i.snap)*i.snap,{animate:!1}),e.touch=null}var Ut=I(()=>{});function gt(e){je(this._cameraTouchState,e)}var ai=I(()=>{Ut()});function Dr(){let e=this._cameraTouchState,{map:t,container:r}=e,o=t.touchRotate.enabled()||t.touchPitch.enabled();o&&e.nativeZoom===void 0?(e.nativeZoom=t.touchZoom?.enabled(),t.touchZoom?.disable()):!o&&e.nativeZoom!==void 0&&(je(e),e.nativeZoom&&r._leaflet_id&&t.touchZoom.enable(),e.nativeZoom=void 0)}var si=I(()=>{Ut()});function Rr(){let e;for(e of N.cameraTouchStates)je(e)}var fi=I(()=>{fe();Ut()});function hs(){let e=this._cameraTouchState;if(!e)return;let{container:t,map:r}=e;je(e),t.removeEventListener("touchstart",zr,!0),t.removeEventListener("touchmove",Ir,!0),t.removeEventListener("touchend",gt,!0),t.removeEventListener("touchcancel",gt,!0),N.cameraTouchStates.delete(e),N.cameraTouchStates.size||window.removeEventListener("blur",Rr),r.off("cameratouchchange",Dr,r),r.rotateControl?.remove(),delete t._cameraTouchState,delete r._cameraTouchState}var gs=I(()=>{Ut();ii();ni();ai();fe();fi();si()});var xs={};Hl(xs,{cameraControls:()=>Yl});function Yl(e){if(e.addHandler("trackContainerMutation",Ja),!e.options.rotate)return;e.addHandler("shiftKeyRotate",Ba),e.addHandler("pitchDrag",Oa),e.addHandler("compassBearing",qa),e.addHandler("touchRotate",ri),e.addHandler("touchPitch",ri);let t=e.getContainer(),r=e._cameraTouchState={map:e,container:t,touch:null,nativeZoom:void 0};t._cameraTouchState=r,N.cameraTouchStates.add(r),t.addEventListener("touchstart",zr,{capture:!0,passive:!1}),t.addEventListener("touchmove",Ir,{capture:!0,passive:!1}),t.addEventListener("touchend",gt,!0),t.addEventListener("touchcancel",gt,!0),window.addEventListener("blur",Rr),e.on("cameratouchchange",Dr,e),e.options.rotateControl&&(e.rotateControl=new L.Control.Rotate(typeof e.options.rotateControl=="object"?e.options.rotateControl:{}),e.rotateControl.addTo(e)),e.once("unload",hs,e)}var ys=I(()=>{Aa();Ga();Ha();Qa();es();fe();ls();us();ds();jo();Zo();Ko();Br();Jo();Qo();ko();ei();ii();ni();ai();si();gs();fi();N.cameraDrags=new Set;N.dragStates=new WeakMap;N.cameraTouchStates=new Set;L.Control.Rotate=L.Control.extend({options:{position:"topleft",closeOnZeroBearing:!0,visualizePitch:!0},onAdd:ms,onRemove:ps});L.control&&(L.control.rotate=cs)});var W={};function Bt(e){let t;for(t of W.imageStates.get(e.currentTarget)||[])re(t)}function At(e){let t;for(t of W.imageStates.get(e.currentTarget)||[])t.source.fire("error",{error:new Error("Unable to load native layer image")})}function Jt(e,t){let r=W.imageStates.get(e);r&&(r.delete(t),r.size||W.imageStates.delete(e))}function Ti(e,t){let r=W.imageStates.get(e);r||W.imageStates.set(e,r=new Set),r.add(t)}function Li(e,t){let r=e._map,o,i,n;if(r._animatingZoom){e._zoomTransitions||=new Map;for(o of r.getContainer().getAnimations({subtree:!0}))!(o instanceof CSSTransition)||o.transitionProperty!=="transform"||!o.effect.target.classList.contains("leaflet-zoom-animated")||e._zoomTransitions.has(o)||(i=o.currentTime||0,o.pause(),e._zoomTransitions.set(o,{start:t,time:i}));for([o,{start:n,time:i}]of e._zoomTransitions)o.currentTime=Math.min(o.effect.getComputedTiming().endTime,i+t-n);if(e._zoomView){let a=e._zoomView,s;for(o of e._zoomTransitions.keys())if(o.effect.target===r._proxy){s=o;break}let f=s?.effect.getComputedTiming().progress??Math.min(1,(t-a.start)/250),m=r.getZoomScale(a.targetZoom,a.zoom),l=1+(m-1)*f,p=r.project(a.from,a.zoom),u=r.project(a.to,a.zoom);r._cameraView={zoom:r.getScaleZoom(l,a.zoom),center:r.unproject(p.add(u.subtract(p).multiplyBy(m*f/l)),a.zoom)},r._updateCameraOverlays()}}}async function Si(e,t,r){try{await r}catch(o){e.fire("error",{error:o})}t.destroy()}function O(e,t){Si(e,t,e.renderer.device.queue.onSubmittedWorkDone())}function bi(e,t){(!e._size||!e._size.equals(t))&&(e.renderer.width=t.x,e.renderer.height=t.y,e.renderer.canvas.width=Math.round(t.x*e.renderer.dpr),e.renderer.canvas.height=Math.round(t.y*e.renderer.dpr),e.renderer.canvas.style.width=`${t.x}px`,e.renderer.canvas.style.height=`${t.y}px`,e.renderer.depthTexture&&O(e,e.renderer.depthTexture),e.renderer.depthTexture=e.renderer.device.createTexture({size:[e.renderer.canvas.width,e.renderer.canvas.height],format:"depth24plus",usage:GPUTextureUsage.RENDER_ATTACHMENT}),e._size=t)}function et(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function tt(e){let t=[],r,o;for(r=0;r<e.position.length;r++)t.push(e.position[r]-e.target[r]);let i=Math.hypot(...t)||1;for(r=0;r<3;r++)t[r]/=i;let n=et(e.up,t),a=Math.hypot(...n)||1;for(r=0;r<3;r++)n[r]/=a;let s=et(t,n),f=new DOMMatrix([n[0],n[1],n[2],0,s[0],s[1],s[2],0,t[0],t[1],t[2],0,...e.position,1]).inverse().toFloat64Array();for(o of f)if(!Number.isFinite(o))throw new Error("Singular 3D transform");for(r=0;r<16;r++)e.viewMatrix[r]=f[r];let m=1/Math.tan(e.fov*Math.PI/360),l=e.near,p=e.far,u=[m/e.aspect,0,0,0,0,m,0,0,0,0,p/(l-p),-1,0,0,p*l/(l-p),0];for(r=0;r<16;r++)e.projectionMatrix[r]=u[r];let d=new DOMMatrix(e.projectionMatrix).multiply(new DOMMatrix(e.viewMatrix)).toFloat64Array();for(r=0;r<16;r++)e.projectionViewMatrix[r]=d[r]}function Ci(e,t){let r,o,i,n,a,s,f;for(r of t?.get(`${Math.floor(e.x/64)}/${Math.floor(e.y/64)}`)||[])if(!(e.x<r.min[0]||e.x>r.max[0]||e.y<r.min[1]||e.y>r.max[1])){for([o,i,n]of r.triangles)if(a=(i[1]-n[1])*(o[0]-n[0])+(n[0]-i[0])*(o[1]-n[1]),s=((i[1]-n[1])*(e.x-n[0])+(n[0]-i[0])*(e.y-n[1]))/a,f=((n[1]-o[1])*(e.x-n[0])+(o[0]-n[0])*(e.y-n[1]))/a,s>=0&&f>=0&&s+f<=1)return s*o[2]+f*i[2]+(1-s-f)*n[2]}return null}function zt(e,t,r){let o=Math.floor(t/256),i=Math.floor(r/256),n=e.get(`${o}/${i}`);if(!n)return null;let a=n[(r-i*256)*256+t-o*256];return Number.isFinite(a)&&a>-1e3?a:null}function Ei(e,t){let r=e.x-.5,o=e.y-.5,i=Math.floor(r),n=Math.floor(o),a=r-i,s=o-n,f=[zt(t,i,n),zt(t,i+1,n),zt(t,i,n+1),zt(t,i+1,n+1)],m=0,l=null,p;for(p of f)Number.isFinite(p)&&(m||(l=p),m++);return m<4?l:(f[0]*(1-a)+f[1]*a)*(1-s)+(f[2]*(1-a)+f[3]*a)*s}function Y(e,t){if(!e._map||!e._terrainReady)return null;let r=t instanceof L.Point?t:e._map.project(t,e._terrainZoom);return Ci(r,e._bridges)??Ei(r,e._terrainTiles)}function Bi(e,t){let r=e._map,o=r._cameraView?.zoom??r.getZoom(),i=r._cameraView?.center??r.getCenter(),n=r.options.crs.scale(o)/(4007501668557849e-8*Math.cos(e._sceneOrigin.lat*Math.PI/180)),a=r.project(i,o).subtract(r.project(e._sceneOrigin,o)),s=t.y*1.5/n,f=[a.x/n,(r._terrain3D?Y(r._terrain3D,i):void 0)??0,a.y/n],m=r.getPitch()*Math.PI/180,l=r.getBearing()*Math.PI/180,p=e.camera;p.fov=2*Math.atan(1/3)*180/Math.PI,p.aspect=t.x/t.y,p.near=Math.max(.1,s/1e4),p.far=Math.max(1e4,s*10),p.position[0]=f[0]+Math.sin(l)*Math.sin(m)*s,p.position[1]=f[1]+Math.cos(m)*s,p.position[2]=f[2]+Math.cos(l)*Math.sin(m)*s,p.up[0]=-Math.sin(l)*Math.cos(m),p.up[1]=Math.sin(m),p.up[2]=-Math.cos(l)*Math.cos(m),p.target[0]=f[0],p.target[1]=f[1],p.target[2]=f[2],tt(p)}function ae(e){let t=e.parent,r=t?._worldMatrixVersion||0,o=!!e.matrix,i=e._worldParent!==t||e._parentWorldVersion!==r||e._worldMatrixMode!==o,n,a,s;if(e.matrix){let l=e._matrixState||=new Float64Array(16);for(n=0;n<16;n++)l[n]!==e.matrix[n]&&(i=!0),l[n]=e.matrix[n]}else{let l=e._transformState||=new Float64Array(9);for(n=0;n<9;n++)a=n<3?e.position[n]:n<6?e.rotation[n-3]:e.scale[n-6],l[n]!==a&&(i=!0),l[n]=a}if(!i){for(s of e.children)ae(s);return}let f;if(e.matrix)f=e.matrix;else{let l=180/Math.PI,p=new DOMMatrix().translate(...e.position);p.rotateAxisAngleSelf(0,1,0,e.rotation[1]*l),p.rotateAxisAngleSelf(1,0,0,e.rotation[0]*l),p.rotateAxisAngleSelf(0,0,1,e.rotation[2]*l),f=p.scale(...e.scale).toFloat64Array()}let m=t?new DOMMatrix(t.worldMatrix).multiply(new DOMMatrix(f)).toFloat64Array():f;for(n=0;n<16;n++)e.worldMatrix[n]=m[n];e._worldParent=t,e._parentWorldVersion=r,e._worldMatrixMode=o,e._worldMatrixVersion=(e._worldMatrixVersion||0)+1;for(s of e.children)ae(s)}function oe(e){let t=[1/0,1/0,1/0],r=[-1/0,-1/0,-1/0],o=e.attributes.position.data,i;for(i=0;i<o.length;i++)t[i%3]=Math.min(t[i%3],o[i]),r[i%3]=Math.max(r[i%3],o[i]);let n=e.attributes.instanceOffset;if(n){let f,m,l,p;for(f=0;f<3;f++){for(l=1/0,p=-1/0,m=f;m<n.data.length;m+=n.size)l=Math.min(l,n.data[m]),p=Math.max(p,n.data[m]);t[f]=Math.fround(t[f]+l),r[f]=Math.fround(r[f]+p)}}let a=[];for(i=0;i<t.length;i++)a.push((t[i]+r[i])/2);let s=n?Math.hypot(r[0]-t[0],r[1]-t[1],r[2]-t[2])/2:0;for(i=0;!n&&i<o.length;i+=3)s=Math.max(s,Math.hypot(o[i]-a[0],o[i+1]-a[1],o[i+2]-a[2]));e.bounds={min:t,max:r,center:a,radius:s}}function bo(e,t,r,o,i,n,a){if(!e.visible)return;if(e.geometry){t?.altitude>=3&&!e.tile&&e._appearance!==0&&!e.program.nightLight&&e.program.depthTest!==!1&&a.push(e),e.geometry.bounds||oe(e.geometry);let f=e.geometry.bounds,m=e.worldMatrix,l=f.center,p=m[0]*l[0]+m[4]*l[1]+m[8]*l[2]+m[12],u=m[1]*l[0]+m[5]*l[1]+m[9]*l[2]+m[13],d=m[2]*l[0]+m[6]*l[1]+m[10]*l[2]+m[14],c=r[2]*p+r[6]*u+r[10]*d+r[14],h=r[3]*p+r[7]*u+r[11]*d+r[15];e._sortDepth=c/h;let g=f.radius*Math.max(Math.hypot(m[0],m[1],m[2]),Math.hypot(m[4],m[5],m[6]),Math.hypot(m[8],m[9],m[10]));e._visibleInFrame=o[0][0]*p+o[0][1]*u+o[0][2]*d+o[0][3]>=-g*i[0]&&o[1][0]*p+o[1][1]*u+o[1][2]*d+o[1][3]>=-g*i[1]&&o[2][0]*p+o[2][1]*u+o[2][2]*d+o[2][3]>=-g*i[2]&&o[3][0]*p+o[3][1]*u+o[3][2]*d+o[3][3]>=-g*i[3]&&o[4][0]*p+o[4][1]*u+o[4][2]*d+o[4][3]>=-g*i[4]&&o[5][0]*p+o[5][1]*u+o[5][2]*d+o[5][3]>=-g*i[5],e._visibleInFrame&&n.push(e)}let s;for(s of e.children)bo(s,t,r,o,i,n,a)}function Ai(e,t,r){let i=e.camera.projectionViewMatrix,n=e.renderer,a=n.frustum||=[new Float64Array(4),new Float64Array(4),new Float64Array(4),new Float64Array(4),new Float64Array(4),new Float64Array(4)],s=n.frustumLengths||=new Float64Array(6),f,m,l,p,u;for(f=0;f<6;f++){for(m=Math.floor(f/2),l=a[f],p=0;p<4;p++)u=p*4,l[p]=f===4?i[u+2]:f%2?i[u+3]-i[u+m]:i[u+3]+i[u+m];s[f]=Math.hypot(l[0],l[1],l[2])}let d=e._visibleMeshes||=[];d.length=0;let c=e._shadowMeshes||=[];c.length=0,r&&ae(e.scene),bo(e.scene,t,i,a,s,d,c)}function zi(e){let t=e.device;if(!e.roofBlit){let r=t.createShaderModule({code:"@group(0)@binding(0)var source:texture_2d<f32>;@group(0)@binding(1)var sourceSampler:sampler;@group(0)@binding(2)var<uniform> opacity:f32;struct Varyings{@builtin(position)position:vec4f,@location(0)uv:vec2f};@vertex fn vertexMain(@builtin(vertex_index)index:u32)-> Varyings{let uv = vec2f(f32(index & 1u),f32(index >> 1u));return Varyings(vec4f(uv.x * 2.0 - 1.0,1.0 - uv.y * 2.0,0.0,1.0),uv);}@fragment fn fragmentMain(input:Varyings)->@location(0)vec4f{let color = textureSample(source,sourceSampler,input.uv);return vec4f(color.rgb,color.a * opacity);}"});e.roofBlit={pipeline:t.createRenderPipeline({layout:"auto",vertex:{module:r,entryPoint:"vertexMain"},fragment:{module:r,entryPoint:"fragmentMain",targets:[{format:"rgba8unorm",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-strip"}}),sampler:t.createSampler({magFilter:"linear",minFilter:"linear"})}}}function rt(){return new L.Point(256,256)}function Ii(e,t){return(e.layer.options.zIndex||0)-(t.layer.options.zIndex||0)||e.tile.coords.z-t.tile.coords.z}function Di(e,t,r,o,i,n,a){let s=e.renderer,f=s.device,m=e._map,l=new Float32Array(Math.max(1,t.length)*64),p=f.createBuffer({size:l.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),u=f.createCommandEncoder(),d=u.beginRenderPass({colorAttachments:[{view:e._roofRaster.texture.texture.createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]});d.setPipeline(s.roofBlit.pipeline),t.sort(Ii);let c,h,g,y,x,v,w,P,M,S;for([c,{tile:h,layer:g}]of t.entries())({coords:y,image:x}=h),v=h.texture,v.uploaded!==v.image&&(f.queue.copyExternalImageToTexture({source:x},{texture:v.texture},[v.texture.width,v.texture.height]),v.uploaded=v.image),l[c*64]=g.options.opacity,w=rt().multiplyBy(m.getZoomScale(r,y.z)),P=new L.Point(y.x,y.y).scaleBy(w).subtract(o),M=P.x*n/i.x,S=P.y*a/i.y,d.setViewport(M,S,Math.min(w.x*n/i.x,n-M),Math.min(w.y*a/i.y,a-S),0,1),d.setBindGroup(0,f.createBindGroup({layout:s.roofBlit.pipeline.getBindGroupLayout(0),entries:[{binding:0,resource:v.texture.createView()},{binding:1,resource:s.roofBlit.sampler},{binding:2,resource:{buffer:p,offset:c*256,size:4}}]})),d.draw(4);d.end(),f.queue.writeBuffer(p,0,l),f.queue.submit([u.finish()]),p.destroy()}function Ri(e,t,r,o){let i=e._map,n=e.renderer,a=[],s=-1/0,f,m,l,p;for(f of t)for(m of f._rasterTiles.values())m.done&&!m.request.signal.aborted&&m.image&&(a.push({tile:m,layer:f}),s=Math.max(s,m.coords.z));a.length||(s=i.getZoom());let u=new L.Bounds;for({tile:{coords:l},layer:f}of a)p=rt().multiplyBy(i.getZoomScale(s,l.z)),u.extend(new L.Point(l.x,l.y).scaleBy(p)),u.extend(new L.Point(l.x+1,l.y+1).scaleBy(p));let d=u.min||i.project(e._sceneOrigin,s),c=u.isValid()?u.getSize():new L.Point(1,1),g=Math.min(1,4096/Math.max(c.x,c.y)),y=Math.max(1,Math.ceil(c.x*g)),x=Math.max(1,Math.ceil(c.y*g)),v=i.project(e._sceneOrigin,s),w=i.options.crs.scale(s)/(4007501668557849e-8*Math.cos(e._sceneOrigin.lat*Math.PI/180)),P=new DOMMatrix;P.m11=w/c.x,P.m33=w/c.y,P.m41=(v.x-d.x)/c.x,P.m43=(v.y-d.y)/c.y;let M=e._roofRaster?.texture;M&&(M.width!==y||M.height!==x)&&(O(e,M.texture),M.texture=n.device.createTexture({size:[y,x],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),M.width=y,M.height=x),e._roofRaster={signature:r,updatedAt:o,matrix:Array.from(P.toFloat64Array()),texture:M||{device:n.device,texture:n.device.createTexture({size:[y,x],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:n.device.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),samplerOptions:{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"},image:null,width:y,height:x,format:"rgba8unorm",srgb:!1,flipY:!1,uploaded:null}},zi(n),Di(e,a,s,d,c,y,x)}function Ui(e,t){let r=e._map,o=[],i=!1,n;for(n of e._layers)if(n.options.roofTexture){i=!0;break}if(i){for(n of Object.values(r._layers))n._type==="pmtiles"&&n._rasterTiles&&n.options.opacity>0&&o.push(n);let a=[],s=!1;for(n of o)a.push(`${L.Util.stamp(n)}:${n._rasterVersion||0}:${n.options.opacity}:${n.options.zIndex}`),s||=!!n._loadingTiles;let f=a.join("|");(!e._roofRaster||e._roofRaster.signature!==f&&(!s||t-e._roofRaster.updatedAt>=50))&&Ri(e,o,f,t)}else e._roofRaster&&(O(e,e._roofRaster.texture.texture),e._roofRaster=null);return o}function Oi(e,t){return+!!t.ground-+!!e.ground||(e.ground&&t.ground?(e.renderOrder||0)-(t.renderOrder||0)||e.tile.coords.z-t.tile.coords.z:0)||Number(e.program.transparent)-Number(t.program.transparent)||(e.program.transparent?(e.renderOrder||0)-(t.renderOrder||0)||t._sortDepth-e._sortDepth||e.id-t.id:(e._sortDepth??0)-(t._sortDepth??0)||e.id-t.id)}function Gi(e){return e.sort(Oi)}function Fi(e,t,r){let o=t._map,i=e.geometry.bounds,n=e.worldMatrix,a=!1,s,f,m,l,p,u,d,c,h,g,y,x,v,w,P,M,S,z,T,E,b,R,D,U,G,$,H,V;for(s of r){for(f=s._tileZoom,m=o.project(t._sceneOrigin,f),l=o.options.crs.scale(f)/(4007501668557849e-8*Math.cos(t._sceneOrigin.lat*Math.PI/180)),p=[1/0,1/0],u=[-1/0,-1/0],d=0;d<8;d++)c=d&1?i.max[0]:i.min[0],h=d&2?i.max[1]:i.min[1],g=d&4?i.max[2]:i.min[2],y=m.x+(n[0]*c+n[4]*h+n[8]*g+n[12])*l,x=m.y+(n[2]*c+n[6]*h+n[10]*g+n[14])*l,p[0]=Math.min(p[0],y),p[1]=Math.min(p[1],x),u[0]=Math.max(u[0],y),u[1]=Math.max(u[1],x);if(!(s.header.maxLat!==void 0&&s.header.minLon!==void 0&&s.header.minLat!==void 0&&s.header.maxLon!==void 0&&(v=o.project([s.header.maxLat,s.header.minLon],f),w=o.project([s.header.minLat,s.header.maxLon],f),p[0]=Math.max(p[0],v.x),p[1]=Math.max(p[1],v.y),u[0]=Math.min(u[0],w.x),u[1]=Math.min(u[1],w.y),p[0]>=u[0]||p[1]>=u[1]))){a=!0,P=[[p[0],p[1],u[0],u[1]]];for(M of s._rasterTiles.values())if(!(!M.done&&!M.error)){S=256*2**(f-M.coords.z),z=M.coords.x*S,T=M.coords.y*S,E=[];for([b,R,D,U]of P){if(G=Math.max(b,z),$=Math.max(R,T),H=Math.min(D,z+S),V=Math.min(U,T+S),G>=H||$>=V){E.push([b,R,D,U]);continue}R<$&&E.push([b,R,D,$]),V<U&&E.push([b,V,D,U]),b<G&&E.push([b,$,G,V]),H<D&&E.push([H,$,D,V])}if(P=E,!P.length)return!0}}}return!a}function Ni(e,t,r,o){let i=e._visibleMeshes,n=e._shadowMeshes,a=e.renderer,s=!1,f,m;for(f of i){if(f.program.uniforms.roofTexture&&!t.length&&(f._roofRevealed=!0),f.program.uniforms.roofTexture&&!f._roofRevealed&&t.length){if(f._roofCoverageSignature!==e._roofRaster?.signature&&(f._roofCoverageSignature=e._roofRaster?.signature,f._roofCovered=Fi(f,e,t)),!f._roofCovered){f._appearance=0;continue}f._roofRevealed=!0}f.fadeDuration&&(f.fadeStart??=f.tile?.loadedAt??r,m=Math.min(1,(r-f.fadeStart)/f.fadeDuration),f._appearance=m*m*(3-2*m),s||=m<1),o.push(f)}i.length=0,Gi(o);let l=1/0,p=-1/0;for(f of o)f.ground&&(l=Math.min(l,f.tile.coords.z),p=Math.max(p,f.tile.coords.z));a.groundOverlap=l!==p;let u=0;for(f of n)f.visible&&f._appearance!==0&&(n[u++]=f);return n.length=u,s}function Qt(e){let t=e.renderer.sunlight;t.bindGroup=e.renderer.device.createBindGroup({layout:t.layout,entries:[{binding:0,resource:{buffer:t.buffer}},{binding:1,resource:t.texture.createView()},{binding:2,resource:t.sampler},{binding:3,resource:{buffer:t.lights}}]})}function Co(e,t,r,o,i,n,a){let s,f,m,l,p,u,d,c,h,g;for(s of e)for(f=0;f<s.length;f+=8)for(m=s[f+3],l=s[f]-t,p=s[f+2]-r,u=Math.floor((p-m)/o);u<=Math.floor((p+m)/o);u++)for(d=Math.floor((l-m)/o);d<=Math.floor((l+m)/o);d++)if(c=u*i+d,a){for(h=0,g=n[c]*4;h<8;h++)a[g+h]=s[f+h];n[c]+=2}else n[c]++}function ji(e,t){let r=0,o,i,n,a;for(o of e)r+=o.length/8;let s=32,f=new Float32Array(8);if(r){let m=1/0,l=1/0,p=-1/0,u=-1/0;for(o of e)for(i=0;i<o.length;i+=8)m=Math.min(m,o[i]-o[i+3]),p=Math.max(p,o[i]+o[i+3]),l=Math.min(l,o[i+2]-o[i+3]),u=Math.max(u,o[i+2]+o[i+3]);let d=Math.ceil((p-m)/s)+1,c=Math.ceil((u-l)/s)+1,h=new Uint32Array(d*c),g=new Uint32Array(d*c);Co(e,m,l,s,d,h);let y=0;for(n of h)y+=n;let x=(2+d*c+y*2)*4;if(x*4>t)throw new Error("Streetlight grid exceeds GPU storage limit");f=new Float32Array(x),f.set([m,l,s,d,c,r,0,0]);let v=2+d*c;for(a=0;a<h.length;a++)h[a]&&(f[(2+a)*4]=g[a]=v,f[(2+a)*4+1]=h[a],v+=h[a]*2);Co(e,m,l,s,d,g,f)}return{data:f,count:r}}function Zi(e,t){let r=new Float32Array(e.length*8),o,i,n,a,s,f,m,l;for(o=0;o<e.length;o++)({position:[i,n,a],radius:s,color:f,flux:m}=e[o]),l=t[3]*i+t[7]*n+t[11]*a+t[15],r.set([(t[0]*i+t[4]*n+t[8]*a+t[12])/l,(t[1]*i+t[5]*n+t[9]*a+t[13])/l,(t[2]*i+t[6]*n+t[10]*a+t[14])/l,s,...f,m/(4*Math.PI)*.03],o*8);return r}function Eo(e,t,r){let o=t?.meshes.length===e.length,i=[],n=[],a,s,f,m,l,p,u;for(a=0;a<e.length;a++){for(s=e[a],f=s.worldMatrix,m=s.extras.lights,l=s._worldLights,p=!!l,u=0;u<f.length&&p;u++)p=f[u]===l.matrix[u];(!p||l.lights!==m)&&(l=s._worldLights={lights:m,matrix:[...f],data:Zi(m,f)}),o&&=t.meshes[a].mesh===s&&t.meshes[a].cache===l,i.push(l.data),n.push({mesh:s,cache:l})}return o?t:{...ji(i,r),meshes:n}}function Bo(e,t,r){if(!e.visible)return;e.extras?.lights&&(e.extras.dynamicLights?r:t).push(e);let o;for(o of e.children||[])Bo(o,t,r)}function $i(e){let{device:t,sunlight:r}=e.renderer,o=[],i=[],n;for(n of e._layers)!n.options.nightLight||!n.root.visible||Bo(n.root,o,i);let a=t.limits.maxStorageBufferBindingSize,s=Eo(o,r.staticLightGrid,a),f=Eo(i,r.dynamicLightGrid,a);if(s===r.staticLightGrid&&f===r.dynamicLightGrid)return;let m=s.data.byteLength+f.data.byteLength;if(m>a)throw new Error("Streetlight grid exceeds GPU storage limit");let l=s!==r.staticLightGrid;r.lights.size<m&&(O(e,r.lights),r.lights=t.createBuffer({size:m,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),Qt(e),l=!0),s.data[6]=s.data.length/4,l&&t.queue.writeBuffer(r.lights,0,s.data),t.queue.writeBuffer(r.lights,s.data.byteLength,f.data),r.lightCount=s.count+f.count,r.staticLightGrid=s,r.dynamicLightGrid=f}function Vi(e,t,r,o){let i=e.renderer,n=e.camera,a=n.viewMatrix,s=o?.direction,f=s?s[0]:-300,m=s?s[1]:500,l=s?s[2]:300,p=a[0]*f+a[4]*m+a[8]*l,u=a[1]*f+a[5]*m+a[9]*l,d=a[2]*f+a[6]*m+a[10]*l,c=Math.hypot(p,u,d)||1,h=Math.hypot(a[4],a[5],a[6])||1;(!i.uniformBuffer||i.uniformBuffer.size<(t.length*2+r.length+1)*256)&&(i.uniformBuffer&&O(e,i.uniformBuffer),i.uniformBuffer=i.device.createBuffer({size:Math.max(64,t.length*4+r.length*2)*256,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),i.uniformData=new Float32Array(i.uniformBuffer.size/4));let g=i.uniformData;g.set(n.viewMatrix,0),g.set(n.projectionMatrix,16),e._roofRaster?.matrix?g.set(e._roofRaster.matrix,32):(g.fill(0,32,48),g[32]=g[37]=g[42]=g[47]=1),g[48]=p/c,g[49]=u/c,g[50]=d/c,g[51]=o&&o.altitude<=0?0:1,g[52]=a[4]/h,g[53]=a[5]/h,g[54]=a[6]/h;let y=o?Math.max(0,Math.min(1,(3-o.altitude)/9)):0;g[55]=y*y*(3-2*y);let x=o?.tint;g[56]=x?x[0]:1,g[57]=x?x[1]:1,g[58]=x?x[2]:1,g[59]=0,y>0&&$i(e),i.uniformSlot=1}function kt(e,t,r,o,i){let{geometry:n,program:a}=t,s=e.renderer.device,f=a.depthTest===!1||t.ground&&e.renderer.groundOverlap?"always":"less-equal",m=`${o}:${i}:${f}`,l=a.pipelineCache.get(m);l||(l=s.createRenderPipeline({layout:a.pipelineLayout,vertex:{module:a.vertex,entryPoint:"vertexMain",buffers:a.vertexBuffers},fragment:{module:a.fragment,entryPoint:"fragmentMain",targets:[{format:e.renderer.format,blend:a.transparent?{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}:void 0,writeMask:GPUColorWrite.ALL}]},primitive:{topology:"triangle-list",cullMode:o,frontFace:i},depthStencil:{format:"depth24plus",depthWriteEnabled:a.depthWrite,depthCompare:f}}),a.pipelineCache.set(m,l));let p=a.uniforms,u=e.renderer,d=u.uniformSlot++*256,c=u.uniformData,h=d/4;c.set(t.worldMatrix,h),c.set(p.baseColor.value,h+16),c[h+19]=1,c[h+20]=p.metallic.value,c[h+21]=p.roughness.value,c[h+22]=p.opacity.value*(t.ground?t._appearance??1:1),c[h+23]=p.alphaCutoff.value,c.set(p.emissive.value,h+24),c[h+27]=p.occlusionStrength.value,c[h+28]=t.terrain?.[0]??0,c[h+29]=t.terrain?.[1]??0,c[h+30]=t.terrain?.[2]??0,c[h+31]=t.terrain?.[3]??0,c[h+32]=t.highlight?.[0]??0,c[h+33]=t.highlight?.[1]??0,c[h+34]=a.nightSparkle?c[55]:0,c[h+35]=t.ground?1:t._appearance??1;let g=t._textures||=[];g.length=0;let y,x,v,w;for(y of a.bindings){if(x=p[y.name]?.value,!x)throw new Error(`Missing Layer3D texture: ${y.name}`);x.uploaded!==x.image&&(s.queue.copyExternalImageToTexture({source:x.image,flipY:!!x.flipY},{texture:x.texture},[x.image.width,x.image.height]),x.uploaded=x.image),g.push(x)}let P=!t.bindGroup||t.boundBuffer!==u.uniformBuffer||g.length!==t.boundTextures.length;for(v=0;!P&&v<g.length;v++)(g[v].texture!==t.boundTextures[v][0]||g[v].sampler!==t.boundTextures[v][1])&&(P=!0);if(P){let z=[{binding:0,resource:{buffer:u.uniformBuffer,size:144}},{binding:1,resource:{buffer:u.uniformBuffer,size:240}}];a.terrain&&z.push({binding:2,resource:a.terrain.texture.createView()}),t.boundBuffer=u.uniformBuffer;let T=t.boundTextures||=[];for(T.length=g.length,v=0;v<g.length;v++)y=a.bindings[v],x=g[v],z.push({binding:y.texture,resource:x.texture.createView()}),z.push({binding:y.sampler,resource:x.sampler}),T[v]||=[],T[v][0]=x.texture,T[v][1]=x.sampler;t.bindGroup=s.createBindGroup({layout:a.bindGroupLayout,entries:z})}r.setPipeline(l),r.setBindGroup(0,t.bindGroup,[d]),r.setVertexBuffer(0,n.attributes.position.buffer),r.setVertexBuffer(1,n.attributes.normal.buffer),n.attributes.color&&r.setVertexBuffer(2,n.attributes.color.buffer),n.attributes.uv&&r.setVertexBuffer(3,n.attributes.uv.buffer);let M=n.attributes.instanceOffset;M&&r.setVertexBuffer(4,M.buffer);for(w of Object.values(n.attributes))w.needsUpdate&&(s.queue.writeBuffer(w.buffer,0,w.data),w.needsUpdate=!1,n.bounds=null);let S=n.attributes.index;S?(r.setIndexBuffer(S.buffer,S.indexFormat),r.drawIndexed(n.drawRange.count,M?.count??1,n.drawRange.start,0,0)):r.draw(n.drawRange.count,M?.count??1,n.drawRange.start,0)}function qi(e,t,r){let o=e.renderer,i=t.beginRenderPass({colorAttachments:[{view:o.context.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:o.depthTexture.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}});i.setViewport(0,0,o.canvas.width,o.canvas.height,0,1),i.setBindGroup(1,o.sunlight.bindGroup);let n,a,s,f,m,l;for(n of r){if(a=n.worldMatrix,n.texture&&(n.program.uniforms.baseTexture.value=n.texture,n.program.uniforms.opacity.value=n.opacity),s=n.program.uniforms,s.roofTexture&&(s.roofTexture.value=e._roofRaster?.texture||o.roofFallbackTexture),!n._frontFace||n._frontFaceWorldVersion!==n._worldMatrixVersion||n._worldMatrixVersion===void 0){if(f=a[0]*(a[5]*a[10]-a[6]*a[9])-a[4]*(a[1]*a[10]-a[2]*a[9])+a[8]*(a[1]*a[6]-a[2]*a[5]),!Number.isFinite(f)||f===0)throw new Error("Singular 3D transform");n._frontFace=f<0?"cw":"ccw",n._frontFaceWorldVersion=n._worldMatrixVersion}m=n._frontFace,l=n.program,l.transparent&&l._layerMaterial.doubleSided&&!n._nativeSource?(kt(e,n,i,"front",m),kt(e,n,i,"back",m)):kt(e,n,i,l.cullMode,m)}i.end()}function Hi(e,t,r){let o=e.cache,i=e.enabled&&o?.meshes.size===t.length,n,a,s,f,m;if(i){for(n=0;n<r.direction.length;n++)if(r.direction[n]!==o.direction[n]){i=!1;break}}if(i)for(a of t){if(s=o.meshes.get(a),f=a.geometry.drawRange,!(s&&s.world===a._worldMatrixVersion&&s.geometry===a.geometry&&s.start===f.start&&s.count===f.count&&s.appearance===(a._appearance??1))){i=!1;break}for(m of Object.values(a.geometry.attributes))if(m.needsUpdate){i=!1;break}if(!i)break}return i}function Wi(e){let t=[1/0,1/0,1/0],r=[-1/0,-1/0,-1/0],o,i,n,a,s,f,m,l,p,u,d;for(o of e){if((!o.geometry.bounds||o.geometry.attributes.position.needsUpdate)&&oe(o.geometry),i=o.geometry.bounds,n=o.worldMatrix,a=o._shadowBounds,!a||a.version!==o._worldMatrixVersion||a.bounds!==i)for(a=o._shadowBounds={version:o._worldMatrixVersion,bounds:i,min:[1/0,1/0,1/0],max:[-1/0,-1/0,-1/0]},s=0;s<8;s++)for(f=s&1?i.max[0]:i.min[0],m=s&2?i.max[1]:i.min[1],l=s&4?i.max[2]:i.min[2],p=n[3]*f+n[7]*m+n[11]*l+n[15],u=0;u<3;u++)d=(n[u]*f+n[u+4]*m+n[u+8]*l+n[u+12])/p,a.min[u]=Math.min(a.min[u],d),a.max[u]=Math.max(a.max[u],d);for(u=0;u<3;u++)t[u]=Math.min(t[u],a.min[u]),r[u]=Math.max(r[u],a.max[u])}return t[1]=Math.min(0,t[1]),{min:t,max:r}}function Yi(e,t){let{min:r,max:o}=Wi(e),i=[],n=[],a=[],s,f,m,l,p,u;for(s=0;s<3;s++)i[s]=o[s]-r[s],n[s]=(r[s]+o[s])/2;let d=Math.max(100,Math.hypot(...i));for(s=0;s<3;s++)a[s]=n[s]+t.direction[s]*d*2;let c={position:a,target:n,up:[0,0,-1],fov:45,aspect:1,near:1,far:d*5,viewMatrix:[],projectionMatrix:[],projectionViewMatrix:[]};tt(c);let h=new DOMMatrix(c.viewMatrix),g=[1/0,1/0,1/0],y=[-1/0,-1/0,-1/0];for(s=0;s<8;s++){for(f=[],m=0;m<3;m++)f[m]=s&1<<m?o[m]:r[m];for(l=new DOMPoint(...f,1).matrixTransform(h),p=[l.x,l.y,l.z],m=0;m<3;m++)u=p[m],g[m]=Math.min(g[m],u-20),y[m]=Math.max(y[m],u+20)}for(s=0;s<3;s++)i[s]=y[s]-g[s];return new DOMMatrix([2/i[0],0,0,0,0,2/i[1],0,0,0,0,-1/i[2],0,-(y[0]+g[0])/i[0],-(y[1]+g[1])/i[1],y[2]/i[2],1]).multiply(h).toFloat32Array()}function Ao(e,t,r=!1){let o=r?"instancePipeline":"pipeline";if(!t[o]){t.meshLayout||(t.meshLayout=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform",hasDynamicOffset:!0}}]}),t.depthLayout=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}}]}),t.depthBindGroup=e.createBindGroup({layout:t.depthLayout,entries:[{binding:0,resource:{buffer:t.buffer}}]}));let i=e.createShaderModule({code:` struct Mesh{world:mat4x4<f32>,padding:array<vec4<f32>,4>,highlight:vec4<f32>};@group(0)@binding(0)var<uniform> mesh:Mesh;@group(1)@binding(0)var<uniform> matrix:mat4x4<f32>;@vertex fn main(@location(0)position:vec3<f32>${r?", @location(4) offset: vec4<f32>":""})->@builtin(position)vec4<f32>{return matrix * mesh.world * vec4<f32>(position${r?" + offset.xyz":""},1.0);}@fragment fn fragmentMain(@builtin(position)position:vec4<f32>){let noise = fract(52.9829189 * fract(dot(floor(position.xy),vec2<f32>(0.06711056,0.00583715))));if(mesh.highlight.w < 1.0 && noise >= mesh.highlight.w){discard;}}`}),n=[{arrayStride:12,attributes:[{shaderLocation:0,offset:0,format:"float32x3"}]}];r&&n.push({arrayStride:16,stepMode:"instance",attributes:[{shaderLocation:4,offset:0,format:"float32x4"}]}),t[o]=e.createRenderPipeline({layout:e.createPipelineLayout({bindGroupLayouts:[t.meshLayout,t.depthLayout]}),vertex:{module:i,entryPoint:"main",buffers:n},fragment:{module:i,entryPoint:"fragmentMain",targets:[]},primitive:{topology:"triangle-list",cullMode:"none"},depthStencil:{format:"depth32float",depthWriteEnabled:!0,depthCompare:"less",depthBias:2,depthBiasSlopeScale:2}})}}function Xi(e,t,r){let o=e.renderer,i=o.device,n=o.sunlight,a=t.beginRenderPass({colorAttachments:[],depthStencilAttachment:{view:n.texture.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),s=n.pipeline;a.setPipeline(s),a.setBindGroup(1,n.depthBindGroup);let f,m,l,p,u,d,c;for(f of r){m=f.geometry.attributes.instanceOffset,l=m?n.instancePipeline:n.pipeline,l!==s&&(s=l,a.setPipeline(s)),p=o.uniformSlot++*256,o.uniformData.set(f.worldMatrix,p/4),o.uniformData[p/4+35]=f._appearance??1,f._shadowBuffer!==o.uniformBuffer&&(f._shadowBuffer=o.uniformBuffer,f._shadowBindGroup=i.createBindGroup({layout:n.meshLayout,entries:[{binding:0,resource:{buffer:o.uniformBuffer,size:144}}]}));for(u of Object.values(f.geometry.attributes))u.needsUpdate&&(i.queue.writeBuffer(u.buffer,0,u.data),u.needsUpdate=!1);a.setBindGroup(0,f._shadowBindGroup,[p]),a.setVertexBuffer(0,f.geometry.attributes.position.buffer),m&&a.setVertexBuffer(1,m.buffer),d=f.geometry.attributes.index,c=f.geometry.drawRange,d?(a.setIndexBuffer(d.buffer,d.indexFormat),a.drawIndexed(c.count,m?.count??1,c.start,0,0)):a.draw(c.count,m?.count??1,c.start,0)}a.end()}function er(e,t){let r=e.renderer.device,o=e.renderer.sunlight;o.size!==t&&(o.texture&&O(e,o.texture),o.size=t,o.texture=r.createTexture({size:[t,t],format:"depth32float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC}),Qt(e))}function Ki(e,t,r,o){let i=e.renderer,n=i.device,a=i.sunlight;if(!r.length||!o||o.altitude<3){if(!a.enabled)return;let p=new Float32Array(20);p.set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),n.queue.writeBuffer(a.buffer,0,p),a.enabled=!1,a.cache=null;return}if(Hi(a,r,o))return;let s=new Float32Array(20);a.enabled=!0,er(e,Math.min(2048,n.limits.maxTextureDimension2D)),s.set(Yi(r,o)),s[16]=1,n.queue.writeBuffer(a.buffer,0,s),Ao(n,a);let f;for(f of r)if(f.geometry.attributes.instanceOffset){Ao(n,a,!0);break}Xi(e,t,r);let m=new Map,l;for(l of r)m.set(l,{world:l._worldMatrixVersion,geometry:l.geometry,start:l.geometry.drawRange.start,count:l.geometry.drawRange.count,appearance:l._appearance??1});a.cache={direction:[...o.direction],meshes:m}}var Le=new Set;function tr(e){let t=e._frame;Le.delete(e),e._frame=null,!Le.size&&t!=null&&cancelAnimationFrame(t)}function j(e,t){e.parent&&e.parent.children.splice(e.parent.children.indexOf(e),1),e.parent=t,t&&t.children.push(e)}function ot(e,t){e._terrainRequest?.abort();let r=e._rasterTiles.get(t);r&&(j(r,null),B(e),r.texture!==t.texture&&O(e,r.texture.texture),e._rasterTiles.delete(t))}function it(e,t){let r=`${t.coords.z}/${t.coords.x}/${t.coords.y}`;e._rasterTiles.get(r)===t&&(e._rasterTiles.delete(r),e._rasterVersion=(e._rasterVersion||0)+1,t.request.abort(),e._terrain3D&&ot(e._terrain3D,t),t.mesh&&j(t.mesh,null),t.texture&&O(e,t.texture.texture),t.image?.close(),e.fire("tileunload",{tile:t,coords:t.coords}),B(e))}function nt(e){let t=e._wantedRasterTiles,r=performance.now();if(e._pruneVersion===e._rasterVersion&&e._pruneWanted===t&&r<e._pruneAfter)return Number.isFinite(e._pruneAfter);e._pruneVersion=e._rasterVersion,e._pruneWanted=t,e._pruneAfter=1/0;let o=[],i,n,a,s,f,m;for(i of t)n=e._rasterTiles.get(i),n?.done&&r-n.loadedAt<250&&(e._pruneAfter=Math.min(e._pruneAfter,n.loadedAt+250)),(!n?.done||r-n.loadedAt<250)&&(a=i.split("/"),o.push({z:Number(a[0]),x:Number(a[1]),y:Number(a[2])}));for([i,n]of e._rasterTiles)if(!t.has(i)){s=!1;for(f of o)if(m=Math.min(f.z,n.coords.z),Math.floor(f.x/2**(f.z-m))===Math.floor(n.coords.x/2**(n.coords.z-m))&&Math.floor(f.y/2**(f.z-m))===Math.floor(n.coords.y/2**(n.coords.z-m))){s=!0;break}s||it(e,n)}return Number.isFinite(e._pruneAfter)}function Oe(e){if(tr(e),e._shared!==e||!e.renderer)return;let t=e._map,r=performance.now(),o=t.getSize();if(!o.x||!o.y)return;Li(e,r),bi(e,o),Bi(e,o),ae(e.scene);let i=!1,n;for(n of e._layers)n._beforeRender&&(n._beforeRender(),i=!0);let a=t._sunlight;Ai(e,a,i);let s=e._shadowMeshes,f=e.renderer,m=Ui(e,r),l=f.frameMeshes||=[];l.length=0;let p=Ni(e,m,r,l),u=f.device.createCommandEncoder();Vi(e,l,s,a),Ki(e,u,s,a),qi(e,u,l),f.device.queue.writeBuffer(f.uniformBuffer,0,f.uniformData,0,f.uniformSlot*64),f.device.queue.submit([u.finish()]);for(n of e._layers)n._wantedRasterTiles&&(p=nt(n)||p);(t._animatingZoom||p)&&B(e)}function Ji(){let e=[...Le];Le.clear();let t,r;for(r of e)if(r._frame=null,!(r._shared!==r||!r.renderer))try{Oe(r)}catch(o){t||=o}if(t)throw t}function B(e){let t=e._shared;if(!t)return e;if(t!==e)return B(t),e;if(e._frame!=null)return e;let r=Le.values().next().value;return Le.add(e),e._frame=r?r._frame:requestAnimationFrame(Ji),e}function re(e=this){e.dirty=!0,e.viewDirty=!0,e.failed=!1,e.hide();let t=[e.source._icon,e.source._shadow,e.source._image],r;for(r of e.images)t.includes(r)||(r.removeEventListener("load",Bt),r.removeEventListener("error",At),Jt(r,e),e.images.delete(r));for(r of t)!(r instanceof HTMLImageElement)||e.images.has(r)||(e.images.add(r),Ti(r,e),r.addEventListener("load",Bt),r.addEventListener("error",At));e.backend._shared&&B(e.backend)}function Z(e,t,r){let o=t._nativeGPU,n=o.originalMethods.get(e).apply(t,r),a,s;if((e==="bringToFront"||e==="bringToBack")&&t instanceof L.GridLayer){let f=e==="bringToFront"?-1/0:1/0;for(a of Object.values(o.map._layers))a===t||!(a instanceof L.GridLayer)||a.getPane()!==t.getPane()||(s=a.options.zIndex||0,f=e==="bringToFront"?Math.max(f,s):Math.min(f,s));let m=e==="bringToFront"?f+1:f-1;Number.isFinite(m)&&t.setZIndex(m)}return e==="bringToFront"&&(o.order=++o.map._nativeGPUOrder),e==="bringToBack"&&(o.order=--o.map._nativeGPUBack),re(o),n}function Qi(...e){return Z("setLatLng",this,e)}function ki(...e){return Z("setLatLngs",this,e)}function en(...e){return Z("addLatLng",this,e)}function tn(...e){return Z("setRadius",this,e)}function rn(...e){return Z("setStyle",this,e)}function on(...e){return Z("redraw",this,e)}function nn(...e){return Z("setIcon",this,e)}function an(...e){return Z("setUrl",this,e)}function sn(...e){return Z("setBounds",this,e)}function fn(...e){return Z("setOpacity",this,e)}function mn(...e){return Z("setZIndex",this,e)}function ln(...e){return Z("setZIndexOffset",this,e)}function pn(...e){return Z("bringToFront",this,e)}function un(...e){return Z("bringToBack",this,e)}var cn={setLatLng:Qi,setLatLngs:ki,addLatLng:en,setRadius:tn,setStyle:rn,redraw:on,setIcon:nn,setUrl:an,setBounds:sn,setOpacity:fn,setZIndex:mn,setZIndexOffset:ln,bringToFront:pn,bringToBack:un};var dn=new WeakMap;var F={renderers:dn,nextId:0};function J(){return{position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],worldMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],children:[],visible:!0}}function at(e,t,r){if(!r)return"";let o=3+e.length*2;return e.push({name:t,texture:o,sampler:o+1}),`@group(0)@binding(${o})var ${t}:texture_2d<f32>;@group(0)@binding(${o+1})var ${t}Sampler:sampler;`}function hn(e={},t=!1,r=""){let o=!!e.baseTexture,i=!!e.metalTexture,n=!!e.emissiveTexture,a=!!e.occlusionTexture,s=!!e.roofTexture,f=!!e.terrain,m=o||i||n||a||e.nightLight,l=` struct Mesh{worldMatrix:mat4x4<f32>,baseColor:vec4<f32>,material:vec4<f32>,emissive:vec4<f32>,terrain:vec4<f32>,highlight:vec4<f32>,};struct Frame{viewMatrix:mat4x4<f32>,projectionMatrix:mat4x4<f32>,roofMatrix:mat4x4<f32>,lightDirection:vec4<f32>,skyDirection:vec4<f32>,atmosphereTint:vec4<f32>,};@group(0)@binding(0)var<uniform> u:Mesh;@group(0)@binding(1)var<uniform> frame:Frame;struct Solar{matrix:mat4x4<f32>,params:vec4<f32>};@group(1)@binding(0)var<uniform> solar:Solar;${f?`@group(0)@binding(2)var dem:texture_2d<f32>;${r}`:""} struct VertexInput{@location(0)position:vec3<f32>,@location(1)normal:vec3<f32>,${e.instanced?"@location(4) instanceOffset: vec4<f32>,":""} ${e.vertexColors?"@location(2) color: vec3<f32>,":""} ${m?"@location(3) uv: vec2<f32>,":""}};struct VertexOutput{@builtin(position)position:vec4<f32>,@location(0)color:vec3<f32>,@location(1)normal:vec3<f32>,@location(2)viewPosition:vec3<f32>,@location(6)shadowPosition:vec4<f32>,@location(7)worldPosition:vec3<f32>,${t?"@location(8) localPosition: vec3<f32>,":""} ${m?"@location(3) uv: vec2<f32>,":""} ${s?"@location(4) roofUv: vec2<f32>, @location(5) roof: f32,":""}};@vertex fn vertexMain(input:VertexInput,@builtin(vertex_index)vertexIndex:u32)-> VertexOutput{var output:VertexOutput;var position = input.position${e.instanced?" + input.instanceOffset.xyz":""};${f?"position.y = elevation(u.terrain.xy + input.uv * u.terrain.z, u.terrain.w) - u.terrain.w;":""} let featureVertex = f32(vertexIndex)${e.instanced?" + input.instanceOffset.w":""};let highlighted = featureVertex >= u.highlight.x && featureVertex < u.highlight.y;output.color = ${e.vertexColors?"select(input.color, vec3<f32>(72.0 / 255.0, 217.0 / 255.0, 1.0), highlighted)":"u.baseColor.rgb"};let m = mat3x3<f32>(u.worldMatrix[0].xyz,u.worldMatrix[1].xyz,u.worldMatrix[2].xyz);let normal =(cross(m[1],m[2])* input.normal.x + cross(m[2],m[0])* input.normal.y + cross(m[0],m[1])* input.normal.z)/ determinant(m);output.normal =(frame.viewMatrix * vec4<f32>(normal,0.0)).xyz;let world = u.worldMatrix * vec4<f32>(position,1.0);output.shadowPosition = solar.matrix * world;output.worldPosition = world.xyz / world.w;${t?`output.localPosition = input.position${e.instanced?" + input.instanceOffset.xyz":""};`:""} let viewPosition = frame.viewMatrix * world;output.viewPosition = viewPosition.xyz;${m?"output.uv = input.uv;":""} ${s?" output.roofUv =(frame.roofMatrix * world).xz;output.roof = select(0.0,1.0,input.normal.y >= 0.5 && !highlighted);":""} output.position = frame.projectionMatrix * viewPosition;return output;}`,p=[],u=at(p,"baseTexture",o),d=at(p,"metalTexture",i),c=at(p,"emissiveTexture",n),h=at(p,"occlusionTexture",a),g=at(p,"roofTexture",s),y=` struct Mesh{worldMatrix:mat4x4<f32>,baseColor:vec4<f32>,material:vec4<f32>,emissive:vec4<f32>,terrain:vec4<f32>,highlight:vec4<f32>,};struct Frame{viewMatrix:mat4x4<f32>,projectionMatrix:mat4x4<f32>,roofMatrix:mat4x4<f32>,lightDirection:vec4<f32>,skyDirection:vec4<f32>,atmosphereTint:vec4<f32>,};struct Solar{matrix:mat4x4<f32>,params:vec4<f32>,};@group(0)@binding(0)var<uniform> u:Mesh;@group(0)@binding(1)var<uniform> frame:Frame;@group(1)@binding(0)var<uniform> solar:Solar;@group(1)@binding(1)var shadowTexture:texture_depth_2d;@group(1)@binding(2)var shadowSampler:sampler_comparison;@group(1)@binding(3)var<storage,read> lightGrid:array<vec4<f32>>;${u}${d}${c}${h}${g} struct FragmentInput{@builtin(position)position:vec4<f32>,@location(0)color:vec3<f32>,@location(1)normal:vec3<f32>,@location(2)viewPosition:vec3<f32>,@location(6)shadowPosition:vec4<f32>,@location(7)worldPosition:vec3<f32>,${t?"@location(8) localPosition: vec3<f32>,":""} ${m?"@location(3) uv: vec2<f32>,":""} ${s?"@location(4) roofUv: vec2<f32>, @location(5) roof: f32,":""}};const PI:f32 = 3.14159265;fn toLinear(c:vec3<f32>)-> vec3<f32>{return select(c / 12.92,pow((c + vec3<f32>(0.055))/ 1.055,vec3<f32>(2.4)),c >= vec3<f32>(0.04045));}fn toSRGB(c:vec3<f32>)-> vec3<f32>{return select(c * 12.92,1.055 * pow(max(c,vec3<f32>(0.0)),vec3<f32>(1.0 / 2.4))- vec3<f32>(0.055),c >= vec3<f32>(0.0031308));}fn sunVisibility(position:vec4<f32>)-> f32{let p = position.xyz / position.w;let uv = vec2<f32>(p.x * 0.5 + 0.5,0.5 - p.y * 0.5);if(solar.params.x < 0.5 || any(uv < vec2<f32>(0.0))|| any(uv > vec2<f32>(1.0))|| p.z < 0.0 || p.z > 1.0){return 1.0;}return textureSampleCompareLevel(shadowTexture,shadowSampler,uv,p.z - 0.0003);}fn gridLighting(position:vec3<f32>,normal:vec3<f32>,offset:u32)-> vec3<f32>{let grid = lightGrid[offset];if(grid.w < 1.0){return vec3<f32>(0.0);}let cell = vec2<i32>(floor((position.xz - grid.xy)/ grid.z));if(any(cell < vec2<i32>(0))|| cell.x >= i32(grid.w)|| cell.y >= i32(lightGrid[offset + 1u].x)){return vec3<f32>(0.0);}let header = lightGrid[offset + 2u + u32(cell.y)* u32(grid.w)+ u32(cell.x)];var light = vec3<f32>(0.0);for(var i = 0u;i < u32(header.y);i++){let source = lightGrid[offset + u32(header.x)+ i * 2u];let colour = lightGrid[offset + u32(header.x)+ i * 2u + 1u];let delta = source.xyz - position;let distance2 = max(dot(delta,delta),1.0);let falloff = max(0.0,1.0 - distance2 /(source.w * source.w));let lambert = max(0.0,dot(normal,delta / sqrt(distance2)));light += toLinear(colour.rgb)* colour.w * lambert * falloff * falloff / distance2;}return light;}fn localLighting(position:vec3<f32>,normal:vec3<f32>)-> vec3<f32>{if(frame.skyDirection.w <= 0.0){return vec3<f32>(0.0);}var light = gridLighting(position,normal,0u);let moving = u32(lightGrid[1].z);if(moving > 0u){light += gridLighting(position,normal,moving);}return light * frame.skyDirection.w;}fn appearance(position:vec2<f32>){let noise = fract(52.9829189 * fract(dot(floor(position),vec2<f32>(0.06711056,0.00583715))));if(u.highlight.w < 1.0 && noise >= u.highlight.w){discard;}}@fragment fn fragmentMain(input:FragmentInput,@builtin(front_facing)frontFacing:bool)->@location(0)vec4<f32>{${e.nightLight?" if(input.uv.x <= 2.0){let radial = max(0.0,1.0 - dot(input.uv,input.uv));let alpha = radial * radial * frame.skyDirection.w * 0.65;if(alpha < 0.005){discard;}appearance(input.position.xy);return vec4<f32>(input.color,alpha);}":""} let sunlight = sunVisibility(input.shadowPosition);let worldNormal = normalize(transpose(mat3x3<f32>(frame.viewMatrix[0].xyz,frame.viewMatrix[1].xyz,frame.viewMatrix[2].xyz))* normalize(input.normal))* select(-1.0,1.0,frontFacing);let artificial = localLighting(input.worldPosition,worldNormal);${e.unlit?` let rasterTexel = ${o?"textureSample(baseTexture, baseTextureSampler, input.uv)":"vec4<f32>(input.color, 1.0)"};return vec4<f32>(toSRGB(toLinear(rasterTexel.rgb)*(frame.atmosphereTint.rgb *(0.55 + 0.45 * sunlight)+ artificial)),${e.alphaMode==="BLEND"?"u.material.z * rasterTexel.a":"1.0"});`:` var normal = normalize(input.normal)* select(-1.0,1.0,frontFacing);let texel = ${o?"textureSample(baseTexture, baseTextureSampler, input.uv)":"vec4<f32>(1.0)"};let alpha = u.material.z * texel.a;${e.alphaMode==="MASK"?"if (alpha < u.material.w) { discard; }":""} ${e.alphaMode==="BLEND"?"if (alpha < 0.01) { discard; }":""} var base = ${e.vertexColors?"toLinear(min(input.color, vec3<f32>(1.0)))":"input.color"} * ${e.baseTexture?.srgb?"texel.rgb":"toLinear(texel.rgb)"};${s?" if(input.roof > 0.5 && all(input.roofUv >= vec2<f32>(0.0))&& all(input.roofUv <= vec2<f32>(1.0))){let roof = textureSampleLevel(roofTexture,roofTextureSampler,input.roofUv,0.0);base = mix(base,toLinear(roof.rgb),roof.a);}":""} let mr = ${i?"textureSample(metalTexture, metalTextureSampler, input.uv)":"vec4<f32>(1.0)"};let metal = clamp(u.material.x * mr.b,0.0,1.0);let rough = clamp(u.material.y * mr.g,0.08,1.0);let view = normalize(-input.viewPosition);let halfVector = normalize(view + frame.lightDirection.xyz);let nl = max(dot(normal,frame.lightDirection.xyz),0.0)* frame.lightDirection.w * sunlight;let nv = max(dot(normal,view),0.001);let nh = max(dot(normal,halfVector),0.0);let vh = max(dot(view,halfVector),0.0);let a2 = pow(rough,4.0);let d = a2 / max(PI * pow(nh * nh *(a2 - 1.0)+ 1.0,2.0),0.0001);let gv = nl * sqrt(nv * nv *(1.0 - a2)+ a2);let gl = nv * sqrt(nl * nl *(1.0 - a2)+ a2);let visibility = 0.5 / max(gv + gl,0.0001);let f0 = mix(vec3<f32>(0.04),base,metal);let fresnel = f0 +(1.0 - f0)* pow(1.0 - vh,5.0);let specular = d * visibility * fresnel;let diffuse =(1.0 - metal)* base / PI;let sky = dot(normal,frame.skyDirection.xyz)* 0.5 + 0.5;let ambient = mix(toLinear(vec3<f32>(0.455,0.412,0.322)),vec3<f32>(1.0),sky)*(2.0 / PI);let ao = ${a?"mix(1.0, textureSample(occlusionTexture, occlusionTextureSampler, input.uv).r, u.emissive.w)":"1.0"};${t?" let lattice =(fract(input.localPosition / 2.5)- 0.5)* 2.5;let pointGlow =(1.0 - smoothstep(0.16,0.42,length(lattice)))* u.highlight.z;":""} let glow = ${t?"vec3<f32>(3.0, 2.6, 1.8) * pointGlow +":""}${e.vertexColors?" max(input.color - vec3<f32>(1.0), vec3<f32>(0.0)) * (0.3 + 5.0 * frame.skyDirection.w) +":""} u.emissive.rgb * ${n?e.emissiveTexture.srgb?"textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb":"toLinear(textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb)":"vec3<f32>(1.0)"};var color = ambient * base *(1.0 - metal)* ao +(diffuse + specular)* nl * toLinear(vec3<f32>(1.0,0.937,0.835))* 3.0 + glow;${e.vertexColors?"color = base * (ambient + toLinear(vec3<f32>(1.0, 0.937, 0.835)) * (3.0 / PI) * nl) + glow;":""} color =(color - glow)* frame.atmosphereTint.rgb + base * artificial *(1.0 - metal * 0.5)+ glow;appearance(input.position.xy);return vec4<f32>(toSRGB(color),${e.alphaMode==="BLEND"?"alpha":"1.0"});`}}`;return{vertex:l,fragment:y,bindings:p,textured:m,hasTerrain:f}}var gn=" fn demSample(pixel:vec2<i32>)-> f32{if(any(pixel < vec2<i32>(0))|| any(pixel >= vec2<i32>(textureDimensions(dem)))){return -1e9;}return textureLoad(dem,pixel,0).r;}fn elevation(pixel:vec2<f32>,base:f32)-> f32{let p = pixel - vec2<f32>(0.5);let f = fract(p);let i = vec2<i32>(floor(p));let v00 = demSample(i);let v10 = demSample(i + vec2<i32>(1,0));let v01 = demSample(i + vec2<i32>(0,1));let v11 = demSample(i + vec2<i32>(1,1));if(v00 > -1000.0 && v10 > -1000.0 && v01 > -1000.0 && v11 > -1000.0){return mix(mix(v00,v10,f.x),mix(v01,v11,f.x),f.y);}if(v00 > -1000.0){return v00;}if(v10 > -1000.0){return v10;}if(v01 > -1000.0){return v01;}if(v11 > -1000.0){return v11;}return base;}";async function xn(e,t){let r,o;try{let i=await Promise.all(t),n=[];for(r of i)for(o of r.messages)o.type==="error"&&n.push(o.message);n.length&&e.fire("error",{error:new Error(`Unable to compile Layer3D WGSL: ${n.join(`
2
+ `)}`)})}catch(i){e.fire("error",{error:i})}}function se(e,t={}){let r=hn(t,!!e.options.nightSparkle,t.terrain?gn:""),o=e.renderer.device.createShaderModule({code:r.vertex}),i=e.renderer.device.createShaderModule({code:r.fragment});xn(e,[o.getCompilationInfo(),i.getCompilationInfo()]);let n=[{arrayStride:12,attributes:[{shaderLocation:0,offset:0,format:"float32x3"}]},{arrayStride:12,attributes:[{shaderLocation:1,offset:0,format:"float32x3"}]},t.vertexColors?{arrayStride:12,attributes:[{shaderLocation:2,offset:0,format:"float32x3"}]}:null,r.textured?{arrayStride:8,attributes:[{shaderLocation:3,offset:0,format:"float32x2"}]}:null];t.instanced&&n.push({arrayStride:16,stepMode:"instance",attributes:[{shaderLocation:4,offset:0,format:"float32x4"}]});let a=[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform",hasDynamicOffset:!0}},{binding:1,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}];r.hasTerrain&&a.push({binding:2,visibility:GPUShaderStage.VERTEX,texture:{sampleType:"unfilterable-float",viewDimension:"2d"}});let s;for(s of r.bindings)a.push({binding:s.texture,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float",viewDimension:"2d"}}),a.push({binding:s.sampler,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}});let f=e.renderer.device.createBindGroupLayout({entries:a}),m=e.renderer.device.createPipelineLayout({bindGroupLayouts:[f,e.renderer.sunlight.layout]});return{device:e.renderer.device,vertex:o,fragment:i,bindings:r.bindings,vertexBuffers:n,bindGroupLayout:f,pipelineLayout:m,pipelineCache:new Map,cullMode:t.doubleSided?"none":"back",transparent:t.alphaMode==="BLEND",depthWrite:t.depthWrite??t.alphaMode!=="BLEND",depthTest:t.depthTest!==!1,terrain:t.terrain,nightLight:!!t.nightLight,nightSparkle:!!e.options.nightSparkle,uniforms:{baseColor:{value:t.color||[1,1,1]},metallic:{value:t.metallic??0},roughness:{value:t.roughness??.85},opacity:{value:t.opacity??1},alphaCutoff:{value:t.alphaCutoff??.5},occlusionStrength:{value:t.occlusionStrength??1},emissive:{value:t.emissive||[0,0,0]},...t.baseTexture?{baseTexture:{value:t.baseTexture}}:{},...t.metalTexture?{metalTexture:{value:t.metalTexture}}:{},...t.emissiveTexture?{emissiveTexture:{value:t.emissiveTexture}}:{},...t.occlusionTexture?{occlusionTexture:{value:t.occlusionTexture}}:{},...t.roofTexture?{roofTexture:{value:null}}:{}},_layerMaterial:t}}function Ge(e,t,r={},o=0,i){let{device:n}=e.renderer,a={},s,f,m,l,p;for([s,f]of Object.entries(t))m=new Float32Array(f),l=s==="uv"?2:3,p=n.createBuffer({size:Math.max(4,m.byteLength),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST|o}),n.queue.writeBuffer(p,0,m),a[s]={size:l,data:m,count:m.length/l,buffer:p};let u={...J(),device:n,geometry:{device:n,attributes:a,drawRange:{start:0,count:a.position.count}},program:i||se(e,{vertexColors:!0,doubleSided:!0,...r}),id:F.nextId++,renderOrder:0,extras:{}};return j(u,e.root),B(e),u}function k(e,t){if(!t)return;j(t,null),B(e);let r;for(r of Object.values(t.geometry.attributes))r.buffer.destroy()}function rr(e){let t=0,r,o,i;for(r=0;r<e.length;r++)o=e[r],i=e[(r+1)%e.length],t+=o.x*i.y-i.x*o.y;return t<0}function Q(e,t,r){return(t.x-e.x)*(r.y-e.y)-(t.y-e.y)*(r.x-e.x)}function ue(e,t){return e.x===t.x&&e.y===t.y}function Mn(e){let t=!0,r,o,i,n;for(;t&&e.length>3;)for(t=!1,r=0;r<e.length;r++)if(o=e[(r+e.length-1)%e.length],i=e[r],n=e[(r+1)%e.length],ue(o,i)||Math.abs(Q(o,i,n))<1e-10){e.splice(r,1),t=!0;break}if(e.length<3)throw new Error("Degenerate polygon ring");return e}function or(e,t){let r=!1,o,i,n,a;for(o=0,i=t.length-1;o<t.length;i=o++)n=t[o],a=t[i],n.y>e.y!=a.y>e.y&&e.x<(a.x-n.x)*(e.y-n.y)/(a.y-n.y)+n.x&&(r=!r);return r}function wn(e,t){let r;for(r=1;r<t.length;r++)if(or(e,t[r]))return!0;return!1}function It(e,t,r){return Math.min(e.x,t.x)<=r.x&&r.x<=Math.max(e.x,t.x)&&Math.min(e.y,t.y)<=r.y&&r.y<=Math.max(e.y,t.y)}function _n(e,t,r,o){if(ue(e,r)||ue(e,o)||ue(t,r)||ue(t,o))return!1;let i=Q(e,t,r),n=Q(e,t,o),a=Q(r,o,e),s=Q(r,o,t);return i*n<0&&a*s<0||i===0&&It(e,t,r)||n===0&&It(e,t,o)||a===0&&It(r,o,e)||s===0&&It(r,o,t)}function zo(e,t,r){let o;for(o=0;o<r.length;o++)if(_n(e,t,r[o],r[(o+1)%r.length]))return!0;return!1}function Pn(e,t,r,o){if(zo(e,t,r))return!0;let i;for(i=1;i<o.length;i++)if(zo(e,t,o[i]))return!0;return!1}function Tn(e,t,r,o){let i;for(i of e)if(!ue(i,t)&&!ue(i,r)&&!ue(i,o)&&Q(t,r,i)>=0&&Q(r,o,i)>=0&&Q(o,t,i)>=0)return!0;return!1}function Io(e){let t=0,r,o,i;for(r=0;r<e.length;r++)o=e[r],i=e[(r+1)%e.length],t+=o.x*i.y-i.x*o.y;return Math.abs(t)/2}function Ln(e){let t=[],r;for(r of e)t.push(r.x);return Math.min(...t)}function Sn(e){let t=new Array(e.length),r=[],o,i,n,a,s,f,m,l,p,u;for(o of e)r.push({ring:o,x:Ln(o)});let d=r,c=t;for(i=1;i<r.length;i*=2){for(n=0;n<r.length;n+=i*2)for(a=Math.min(n+i,r.length),s=Math.min(n+i*2,r.length),f=n,m=a,l=n;l<s;l++)f<a&&(m>=s||d[f].x<=d[m].x)?c[l]=d[f++]:c[l]=d[m++];p=d,d=c,c=p}for(u=0;u<e.length;u++)e[u]=d[u].ring;return e}function st(e,t=[]){let r=[e,...t].flat(),o,i,n,a,s,f,m,l,p,u,d,c,h,g,y,x,v,w;for(o of r)if(!Number.isFinite(o.x)||!Number.isFinite(o.y))throw new Error("Invalid polygon coordinates");let P=[];for(i=0;i<r.length;i++)o=r[i],P.push({x:o.x-e[0].x,y:o.y-e[0].y,index:i});let M=0,S=[],z=[e,...t];for(i=0;i<z.length;i++)n=z[i],a=Mn(P.slice(M,M+=n.length)),rr(a)!==!!i&&a.reverse(),S.push(a);let T=S[0].slice(),E=Sn(S.slice(1));for(s of E){for(f=void 0,m=1/0,l=0;l<s.length;l++)for(o=0;o<T.length;o++)p=s[l],u=T[o],d=(p.x-u.x)**2+(p.y-u.y)**2,!(d>=m)&&(c={x:(p.x+u.x)/2,y:(p.y+u.y)/2},!(!or(c,S[0])||wn(c,S))&&(Pn(p,u,T,S)||(f=[l,o],m=d)));if(!f)throw new Error("Unable to connect polygon hole");[h,g]=f,T=[...T.slice(0,g+1),...s.slice(h),...s.slice(0,h+1),T[g],...T.slice(g+1)]}let b=[];for(;T.length>3;){for(y=!1,x=0;x<T.length;x++)if(p=T[(x+T.length-1)%T.length],u=T[x],v=T[(x+1)%T.length],!(Q(p,u,v)<=1e-10)&&!Tn(T,p,u,v)){b.push([p.index,u.index,v.index]),T.splice(x,1),y=!0;break}if(!y)throw new Error("Unable to triangulate polygon: invalid or self-intersecting rings")}if(Q(...T)>1e-10){let G=[];for(o of T)G.push(o.index);b.push(G)}let R=0,D=0;for(x=1;x<S.length;x++)R+=Io(S[x]);let U=Io(S[0])-R;for(w of b)D+=Q(P[w[0]],P[w[1]],P[w[2]])/2;if(U<=0||Math.abs(D-U)>Math.max(1e-7,U*1e-8))throw new Error("Polygon triangulation area mismatch");return b}function ve(e,t,r,o,i){return t.push(...e(r),...e(o),...e(i))}function Do(e,t,r,o,i){return new L.Point(e.x+t*Math.cos(i*2*Math.PI/o),e.y+r*Math.sin(i*2*Math.PI/o))}function Ye(e,t,r,o,i=r){if(!(r>0)||!(i>0))return;let n=Math.max(12,Math.min(128,Math.ceil(Math.PI*Math.sqrt(r)))),a;for(a=0;a<n;a++)ve(e,o,t,Do(t,r,i,n,a),Do(t,r,i,n,a+1))}function Fe(e,t,r,o,i,n=0){let a=i*Math.PI*2/o;return new L.Point(e.x+Math.max(0,t+n)*Math.cos(a),e.y+Math.max(0,r+n)*Math.sin(a))}function Ro(e,t,r,o,i){let{options:n,width:a,stroke:s,point:f}=e,m=a/2,l=t.distanceTo(r);if(!l)return;let p=r.subtract(t).divideBy(l),u=new L.Point(-p.y*m,p.x*m);n.lineCap==="square"&&(o&&(t=t.subtract(p.multiplyBy(m))),i&&(r=r.add(p.multiplyBy(m)))),ve(f,s,t.add(u),t.subtract(u),r.add(u)),ve(f,s,r.add(u),t.subtract(u),r.subtract(u)),n.lineCap==="round"&&(o&&Ye(f,t,m,s),i&&Ye(f,r,m,s))}function ir(e,t,r){let{options:o,width:i,dash:n,stroke:a,point:s}=e;if(!o.stroke||i<=0||t.length<2)return;let f=i/2,m=Number(o.dashOffset)||0,l=0,p,u,d,c,h,g,y,x,v,w,P,M,S,z,T,E,b,R,D,U,G;for(p of n)l+=p;for(u=0;u<t.length-(r?0:1);u++){if(d=t[u],c=t[(u+1)%t.length],h=d.distanceTo(c),!n.length)Ro(e,d,c,!r&&u===0,!r&&u===t.length-2),(r||u>0)&&(o.lineJoin==="round"?Ye(s,d,f,a):(g=d.subtract(t[(u+t.length-1)%t.length]),y=Math.hypot(g.x,g.y),y&&h&&(x=g.divideBy(y),v=c.subtract(d).divideBy(h),w=x.x*v.y-x.y*v.x>0?-1:1,P=new L.Point(-x.y*w,x.x*w),M=new L.Point(-v.y*w,v.x*w),S=d.add(P.multiplyBy(f)),z=d.add(M.multiplyBy(f)),T=1+P.x*M.x+P.y*M.y,E=T>0?P.add(M).multiplyBy(f/T):null,ve(s,a,S,d,z),o.lineJoin==="miter"&&E&&Math.hypot(E.x,E.y)<=f*4&&ve(s,a,S,d.add(E),z))));else for(b=0;b<h;){for(R=((m+b)%l+l)%l,D=0;R>=n[D];)R-=n[D++];U=Math.min(h,b+n[D]-R),D%2===0&&(G=c.subtract(d).divideBy(h),Ro(e,d.add(G.multiplyBy(b)),d.add(G.multiplyBy(U)),!0,!0)),b=U}m+=h}}function Uo(e,t,r){let{options:o,fill:i,point:n,map:a}=e,s=[],f,m,l,p;for(f of t){m=[];for(l of f)m.push(a.project(l));s.push(m)}if(r&&o.fill&&s[0]?.length>=3){let u=[];for(f of s)f.length>=3&&u.push(f);let d=u.flat();for(p of st(u[0],u.slice(1)))ve(n,i,d[p[0]],d[p[1]],d[p[2]])}for(f of s)ir(e,f,r)}function Oo(e,t,r){if(!t.length)return;let o;if(t[0]instanceof L.LatLng)Uo(e,[t],r);else if(r&&t[0][0]instanceof L.LatLng)Uo(e,t,r);else for(o of t)Oo(e,o,r)}function bn(e,t,r){let o=[],i=[],n=e.options,a=Number(n.weight)||0,s=Array.isArray(n.dashArray)?n.dashArray:String(n.dashArray||"").trim().split(/[ ,]+/),f=[],m,l,p;for(m of s)f.push(Number(m));let u=!0;for(m of f){if(!Number.isFinite(m)||m<0)throw new Error("Invalid Leaflet dashArray");m!==0&&(u=!1)}u&&(f.length=0),f.length%2&&f.push(...f);let d={fill:o,stroke:i,options:n,width:a,dash:f,point:r,map:t};if(e instanceof L.CircleMarker){let c=t.project(e.getLatLng()),h=e.getRadius(),g=h;if(e instanceof L.Circle){e._project();let x=e._point.add(t.getPixelOrigin());c.x=x.x,c.y=x.y,h=e._radius,g=e._radiusY||h}n.fill&&Ye(r,c,h,o,g);let y=Math.max(12,Math.min(128,Math.ceil(Math.PI*Math.sqrt(Math.max(h,g)))));if(f.length){let x=[];for(l=0;l<y;l++)x.push(Fe(c,h,g,y,l));ir(d,x,!0)}else if(n.stroke&&a>0)for(p=0;p<y;p++)triangle(r,i,Fe(c,h,g,y,p,a/2),Fe(c,h,g,y,p,-a/2),Fe(c,h,g,y,p+1,a/2)),triangle(r,i,Fe(c,h,g,y,p+1,a/2),Fe(c,h,g,y,p,-a/2),Fe(c,h,g,y,p+1,-a/2))}else{let c=e instanceof L.Polygon;Oo(d,e.getLatLngs(),c)}return{fill:o,stroke:i}}function nr(e,t){let r=[],o;for(o=0;o<e.length;o++)r.push(e[o]-t[o]);return r}function Dt(e,t){let r=0,o;for(o=0;o<e.length;o++)r+=e[o]*t[o];return r}function Cn(e){let t=new Array(e.length),r=e,o=t,i,n,a,s,f,m,l,p,u;for(i=1;i<e.length;i*=2){for(n=0;n<e.length;n+=i*2)for(a=Math.min(n+i,e.length),s=Math.min(n+i*2,e.length),f=n,m=a,l=n;l<s;l++)f<a&&(m>=s||!(r[m].distance<r[f].distance))?o[l]=r[f++]:o[l]=r[m++];p=r,r=o,o=p}if(r!==e)for(u=0;u<e.length;u++)e[u]=r[u];return e}function En(e,t,r=0){let o=[],i=[0,0,0],n=[0,0,0],a=[0,0,0],s,f,m,l,p,u,d,c,h,g,y,x,v,w,P,M,S,z,T,E,b,R,D,U,G,$,H,V,ee,he,Ie,ge,De,X,xe,te,le,pe,Te,ne,Re,ye,Ue;for(s of t){f=new DOMMatrix(s.worldMatrix).inverse(),m=f.toFloat64Array();for(l of m)if(!Number.isFinite(l))throw new Error("Singular 3D transform");for(p=new DOMPoint(...e.origin,1).matrixTransform(f),u=[p.x/p.w,p.y/p.w,p.z/p.w],d=new DOMPoint(...e.direction,0).matrixTransform(f),c=[d.x,d.y,d.z],h=Math.hypot(...c)||1,c[0]/=h,c[1]/=h,c[2]/=h,s.geometry.bounds||oe(s.geometry),g=0,y=1/0,x=0;x<3;x++)if(Math.abs(c[x])<1e-12){if(u[x]<s.geometry.bounds.min[x]||u[x]>s.geometry.bounds.max[x]){y=-1/0;break}}else v=(s.geometry.bounds.min[x]-u[x])/c[x],w=(s.geometry.bounds.max[x]-u[x])/c[x],g=Math.max(g,Math.min(v,w)),y=Math.min(y,Math.max(v,w));if(!(y<g)){for({position:P,index:M,instanceOffset:S}=s.geometry.attributes,z=M?.count||P.count,T=1/0,E=void 0,x=0;x<z*(S?.count??1);x+=3)b=S?x%z:x,R=S?Math.floor(x/z)*S.size:0,D=S?.data[R]??0,U=S?.data[R+1]??0,G=S?.data[R+2]??0,$=(M?M.data[b]:b)*P.size,H=(M?M.data[b+1]:b+1)*P.size,V=(M?M.data[b+2]:b+2)*P.size,i[0]=P.data[$],i[1]=P.data[$+1],i[2]=P.data[$+2],n[0]=P.data[H],n[1]=P.data[H+1],n[2]=P.data[H+2],a[0]=P.data[V],a[1]=P.data[V+1],a[2]=P.data[V+2],S&&(i[0]=Math.fround(i[0]+D),i[1]=Math.fround(i[1]+U),i[2]=Math.fround(i[2]+G),n[0]=Math.fround(n[0]+D),n[1]=Math.fround(n[1]+U),n[2]=Math.fround(n[2]+G),a[0]=Math.fround(a[0]+D),a[1]=Math.fround(a[1]+U),a[2]=Math.fround(a[2]+G)),ee=nr(n,i),he=nr(a,i),Ie=et(c,he),ge=Dt(ee,Ie),!(s.program.cullMode==="none"||s.program.cullFace===null?Math.abs(ge)<1e-9:ge<1e-9)&&(De=nr(u,i),X=Dt(De,Ie)/ge,!(X<0||X>1)&&(xe=et(De,ee),te=Dt(c,xe)/ge,!(te<0||X+te>1)&&(s.program.nightLight&&(le=s.geometry.attributes.uv.data,pe=M?[M.data[x],M.data[x+1],M.data[x+2]]:[x,x+1,x+2],Te=le[pe[0]*2]*(1-X-te)+le[pe[1]*2]*X+le[pe[2]*2]*te,ne=le[pe[0]*2+1]*(1-X-te)+le[pe[1]*2+1]*X+le[pe[2]*2+1]*te,Te<=2&&(!r||Te*Te+ne*ne>.9))||(Re=Dt(he,xe)/ge,Re>0&&Re<T&&(T=Re,E=x/3)))));E!==void 0&&(ye=new DOMPoint(c[0]*T+u[0],c[1]*T+u[1],c[2]*T+u[2],1).matrixTransform(new DOMMatrix(s.worldMatrix)),Ue=[ye.x/ye.w,ye.y/ye.w,ye.z/ye.w],o.push({faceIndex:E,object:s,point:Ue,distance:Math.hypot(Ue[0]-e.origin[0],Ue[1]-e.origin[1],Ue[2]-e.origin[2])}))}}return Cn(o)}function Rt(e,t,r){if(t(e,r))return;let o;for(o of e.children)Rt(o,t,r)}function Bn(e,t){if(!e.visible)return!0;e.geometry&&e._appearance!==0&&t.push(e)}function ar(e,t,r=e.root.children,o=!0){if(!e.renderer)return[];e._beforeRaycast?.();let i=e._map.getContainer().getBoundingClientRect();ae(e.scene),tt(e.camera);let n=new DOMMatrix(e.camera.projectionViewMatrix).inverse(),a=n.toFloat64Array(),s,f;for(s of a)if(!Number.isFinite(s))throw new Error("Singular 3D transform");e.raycaster.origin[0]=e.camera.position[0],e.raycaster.origin[1]=e.camera.position[1],e.raycaster.origin[2]=e.camera.position[2];let m=new DOMPoint((t.clientX-i.left)/i.width*2-1,-((t.clientY-i.top)/i.height)*2+1,0,1).matrixTransform(n),l=[m.x/m.w,m.y/m.w,m.z/m.w];e.raycaster.direction[0]=l[0]-e.raycaster.origin[0],e.raycaster.direction[1]=l[1]-e.raycaster.origin[1],e.raycaster.direction[2]=l[2]-e.raycaster.origin[2];let p=Math.hypot(...e.raycaster.direction)||1;e.raycaster.direction[0]/=p,e.raycaster.direction[1]/=p,e.raycaster.direction[2]/=p;let u=[];for(f of r)o?Rt(f,Bn,u):f.geometry&&f.visible&&f._appearance!==0&&u.push(f);return En(e.raycaster,u,e.renderer.uniformData?.[55])}var Xe=new WeakMap;function An(){let{map:e,descriptor:t,handle:r}=this;e._fireDOMEvent===r&&(t?Object.defineProperty(e,"_fireDOMEvent",t):delete e._fireDOMEvent)}function zn(e,t){return t.object.renderOrder-e.object.renderOrder||e.distance-t.distance}function Go(e,t=e.type,r){let o=this,i=Xe.get(o),n=i.fireDOMEvent;if(!F.renderers.get(o)?.renderer||r||!["click","preclick","dblclick","contextmenu","mousedown","mouseup","mousemove","mouseover","mouseout","pointerdown","pointerup","pointermove","pointerover","pointerout"].includes(t))return n.call(this,e,t,r);let s=e.target,f=s instanceof Element&&s.closest(".leaflet-marker-icon,.leaflet-popup,.leaflet-tooltip,.leaflet-control");if(f&&i.hovered&&(t===i.move||t===i.out)&&(n.call(o,e,i.out,[i.hovered]),i.hovered=null,o.getContainer().style.cursor=""),f||t===i.move&&(o.dragging?.moving()||o._animatingZoom))return n.call(this,e,t,r);let m=[],l,p,u;if(t!==i.out)for(l of i.states)({source:p,backend:u}=l),!(p instanceof L.Marker||p.options.interactive===!1||!(p instanceof L.Path)&&!p.options.interactive)&&m.push(...ar(u,e,l.meshes.values(),!1));m.sort(zn);let d=m[0]?.object._nativeSource||null;return(t==="click"||t==="preclick")&&d&&o._draggableMoved(d)&&(d=null),(t===i.move||t===i.out)&&i.hovered!==d&&(i.hovered&&n.call(o,e,i.out,[i.hovered]),i.hovered=d,d&&n.call(o,e,i.over,[d]),o.getContainer().style.cursor=d?"pointer":""),n.call(this,e,t,d?[d]:void 0)}function In(e){let{map:t}=e,r=Xe.get(t);if(!r){r={map:t,states:new Set,hovered:null};let o=L.version.startsWith("2");r.move=o?"pointermove":"mousemove",r.out=o?"pointerout":"mouseout",r.over=o?"pointerover":"mouseover",r.descriptor=Object.getOwnPropertyDescriptor(t,"_fireDOMEvent"),r.fireDOMEvent=t._fireDOMEvent,r.handle=Go,r.restore=An,Xe.set(t,r),t._fireDOMEvent=Go}r.states.add(e),e._nativeEventContext=r}function Dn(e){let t=e._nativeEventContext;if(!t)return;let{map:r}=t;t.states.delete(e),t.hovered===e.source&&(t.hovered=null,r.getContainer().style.cursor=""),e._nativeEventContext=null,!t.states.size&&(t.restore(),Xe.delete(r))}function sr(e){return e<=.0031308?e*12.92:1.055*e**(1/2.4)-.055}function fr(e,t,r,o){let i=(e+t*12)%12;return r-o*Math.max(-1,Math.min(i-3,9-i,1))}function ce(e){if(e&&typeof e=="object"&&"h"in e){let n=e.s*Math.min(e.l,1-e.l);return{r:sr(fr(0,e.h,e.l,n)),g:sr(fr(8,e.h,e.l,n)),b:sr(fr(4,e.h,e.l,n))}}if(e&&typeof e=="object"&&"r"in e)return e;if(typeof e=="number")return{r:(e>>16&255)/255,g:(e>>8&255)/255,b:(e&255)/255};if(typeof e!="string"||!CSS.supports("color",e))throw new Error("Invalid 3D color");let t=document.createElement("canvas").getContext("2d");t.fillStyle=e,t.fillRect(0,0,1,1);let[r,o,i]=t.getImageData(0,0,1,1).data;return{r:r/255,g:o/255,b:i/255}}function ft(e){return e.source._nativeGPU===e&&e.map.hasLayer(e.source)}function mt(){re(this)}function Rn(e){this.order=e?++this.map._nativeGPUOrder:--this.map._nativeGPUBack,re(this)}function mr(){this.viewDirty=!0,this.backend._shared&&B(this.backend)}function lr(){let e=this,{source:t,map:r,backend:o,meshes:i,textures:n,images:a}=e;t.off("load tileload tileunload move drag",mt,e),r.off("zoomend",mt,e),e.marker&&r.off("move zoom rotate pitch resize viewreset",mr,e),Dn(e),e.refresh=e.reorder=null;let f,m,l,p,u;for([f,m]of e.methods)m.own?Object.defineProperty(t,f,m.own):delete t[f];for(l of i.values())k(o,l);i.clear();for(p of n.values())O(o,p.texture);n.clear();for(u of a)u.removeEventListener("load",Bt),u.removeEventListener("error",At),Jt(u,e);o._beforeRender=null,o.remove()}function Un(){this.ready.resolve()}function On({error:e}){this.ready.reject(e)}function Gn({error:e}){this.source.fire("error",{error:e})}function pr(e,t,r,o){let{source:i,marker:n,paneOrder:a,order:s}=e;t.program.uniforms.baseColor.value=r,t.program.uniforms.opacity.value=o,i instanceof L.GridLayer&&(t.opacity=o);let f=n?i._zIndex+(i._cameraZIndexOffset||0):i.options.zIndex;t.renderOrder=a*1e6+(f||0)*1e3+s,t._nativeSource=i,t._nativeUsed=!0}async function Fn(e,t,r,o,i,n,a){let s;try{if(s=await createImageBitmap(o),!ft(e)||e.textures.get(t)!==r)return;i.queue.copyExternalImageToTexture({source:s},{texture:r.texture},[n,a]),r.uploaded=o,r.pending=!1,re(e)}catch(f){e.failed=!0,e.source.fire("error",{error:f})}finally{s?.close()}}function Nn(e,t,r){if(!(r instanceof HTMLImageElement)&&!(r instanceof HTMLCanvasElement))throw new Error("WebGPU native raster layers require image or canvas tiles");let{backend:o,textures:i,meshes:n}=e,a=i.get(t),s=r.currentSrc||r.src;if(!a||a.image!==r||a.url!==s){if(a){let p=n.get(t);p&&k(o,p),n.delete(t),O(o,a.texture),i.delete(t)}let f=r.naturalWidth||r.width,m=r.naturalHeight||r.height;if(!f||!m)return;let{device:l}=o.renderer;if(a={device:l,image:r,url:s,format:"rgba8unorm",uploaded:null,texture:l.createTexture({size:[f,m],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:l.createSampler({minFilter:"linear",magFilter:"linear"})},i.set(t,a),r instanceof HTMLCanvasElement)a.pending=!0,Fn(e,t,a,r,l,f,m);else{try{l.queue.copyExternalImageToTexture({source:r},{texture:a.texture},[f,m])}catch(p){throw a.texture.destroy(),i.delete(t),p}a.uploaded=r}}return a.used=!0,a.uploaded===r?a:void 0}function ur(e,t,r,o,i,n,a){let{backend:s,source:f,meshes:m}=e;if(!r.length)return;let l=m.get(t),p=[],u;for(u=0;u<r.length;u++)p.push(u%3===1?1:0);let d={position:r,normal:p,...a?{uv:a}:{}};if(!l||l.geometry.attributes.position.data.length!==r.length||l.program.uniforms.baseTexture?.value!==n)l&&k(s,l),l=Ge(s,d,{vertexColors:!1,color:o,opacity:i,unlit:!0,alphaMode:"BLEND",...n?{baseTexture:n}:{}},0,f instanceof L.GridLayer?e.rasterProgram:void 0),f instanceof L.GridLayer&&(e.rasterProgram||=l.program,l.texture=n),m.set(t,l);else{let c=l.geometry.attributes.position;c.data.set(r),c.needsUpdate=!0,l.geometry.bounds=null}return pr(e,l,o,i),l}function lt(e,t,r,o,i){let n=Nn(e,t,r);if(!n)return;let a=[0,2,1,1,2,3],s=[],f=[],m=[[0,0],[1,0],[0,1],[1,1]],l;for(l of a)s.push(...o[l]),f.push(...m[l]);return ur(e,t,s,[1,1,1],i,n,f)}function pt(e,t){let{map:r,backend:o}=e,i=r.options.crs,n=i.project(o.location),a=i.project(t),s=Math.cos(o.location.lat*Math.PI/180);return[(a.x-n.x)*s,0,-(a.y-n.y)*s]}function cr(e,t){let r=[t.getNorthWest(),t.getNorthEast(),t.getSouthWest(),t.getSouthEast()],o=[],i;for(i of r)o.push(pt(e,i));return o}function jn(e){let{source:t,textures:r,meshes:o}=e,i,n,a,s,f,m,l;for([i,n]of Object.entries(t._tiles||{}))!n.loaded||n.el instanceof HTMLImageElement&&!n.el.naturalWidth||(a=(t.options.opacity??1)*(n._gpuOpacity??1),s=r.get(i),f=o.get(i),f&&s?.image===n.el&&s.url===(n.el.currentSrc||n.el.src)?(s.used=!0,pr(e,f,[1,1,1],a)):([m,l]=t._tileCoordsToNwSe(n.coords),f=lt(e,i,n.el,cr(e,new L.LatLngBounds(m,l)),a)),f&&(f.renderOrder+=n.coords.z/100))}function Zn(e){let{source:t}=e;t._image?.complete&&t._image.naturalWidth&&lt(e,"image",t._image,cr(e,t.getBounds()),t.options.opacity??1)}function $n(e,t,r){let{source:o,map:i,backend:n}=e,s=new DOMPoint(...pt(e,o.getLatLng()),1).matrixTransform(new DOMMatrix(n.root.worldMatrix)).matrixTransform(new DOMMatrix(n.camera.projectionViewMatrix)),f=new DOMMatrix(n.camera.projectionViewMatrix).inverse(),m=new DOMMatrix(n.root.worldMatrix).inverse(),l=o.options.icon.options,p=i.getSize(),u=l[t==="shadow"?"shadowSize":"iconSize"]||[r.naturalWidth,r.naturalHeight],d=u.x??u[0],c=u.y??u[1],h=t==="shadow"&&l.shadowAnchor||l.iconAnchor||[Math.floor(d/2),Math.floor(c/2)],g=new L.Point((s.x/s.w+1)*p.x/2,(1-s.y/s.w)*p.y/2),y=g.x-(h.x??h[0]),x=g.y-(h.y??h[1]),v=[[y,x],[y+d,x],[y,x+c],[y+d,x+c]],w=[],P,M,S,z,T,E,b;for([P,M]of v)S=o._cameraIconPoint(P-g.x,M-g.y),z=g.x+S.x,T=g.y+S.y,E=new DOMPoint(z/p.x*2-1,1-T/p.y*2,s.z/s.w,1).matrixTransform(f),b=new DOMPoint(E.x/E.w,E.y/E.w,E.z/E.w,1).matrixTransform(m),w.push([b.x,b.y,b.z]);return w}function Vn(e){let{source:t}=e,r,o,i;for([r,o]of[["shadow",t._shadow],["icon",t._icon]])!(o instanceof HTMLImageElement)||!o.complete||!o.naturalWidth||(i=lt(e,r,o,$n(e,r,o),t.options.opacity??1),r==="shadow"&&i&&(i.renderOrder-=100*1e6))}function qn(e,t){return pt(e,e.map.unproject(t))}function Hn(e){return qn(W.geometryPixelStates[W.geometryPixelStates.length-1],e)}function Wn(e){let{source:t}=e;W.geometryPixelStates.push(e);let r;try{r=bn(t,e.map,Hn)}finally{W.geometryPixelStates.pop()}let{fill:o,stroke:i}=r,n,a,s,f,m,l,p;for([n,a,s,f]of[["fill",o,t.options.fillColor||t.options.color,t.options.fillOpacity],["stroke",i,t.options.color,t.options.opacity]])a.length&&({r:m,g:l,b:p}=ce(s),ur(e,n,a,[m,l,p],f??1))}function dr(e){let{source:t,meshes:r,textures:o}=e;if(!ft(e)||!e.backend.renderer||e.failed||!e.dirty&&(!e.marker||!e.viewDirty))return;e.dirty=!1,e.viewDirty=!1;let i,n,a;for(i of r.values())i._nativeUsed=!1;for(n of o.values())n.used=!1;t instanceof L.GridLayer?jn(e):t instanceof L.ImageOverlay?Zn(e):e.marker?Vn(e):Wn(e);for([a,i]of r)i._nativeUsed||(k(e.backend,i),r.delete(a),n=o.get(a),n&&O(e.backend,n.texture),o.delete(a));for([a,n]of o)n.used||(O(e.backend,n.texture),o.delete(a))}function Yn(e){try{dr(e)}catch(t){e.failed=!0,e.source.fire("error",{error:t})}}W.imageStates=new WeakMap;W.geometryPixelStates=[];async function Xn(e){let{source:t,map:r}=e,o=e.backend=new L.Layer({source:{type:"3d"}});e.meshes=new Map,e.textures=new Map,e.methods=new Map,e.originalMethods=new Map,e.images=new Set,r._nativeGPUOrder||=0,r._nativeGPUBack||=0,e.dirty=!0,e.viewDirty=!0,e.failed=!1,e.order=++r._nativeGPUOrder,e.marker=t instanceof L.Marker,e.paneOrder=Number(getComputedStyle(t.getPane()).zIndex)||0,e.refresh=re,e.reorder=Rn,e.dispose=lr,t.on("load tileload tileunload move drag",mt,e),r.on("zoomend",mt,e),e.marker&&r.on("move zoom rotate pitch resize viewreset",mr,e),In(e);let n,a,s;for(n of["setLatLng","setLatLngs","addLatLng","setRadius","setStyle","redraw","setIcon","setUrl","setBounds","setOpacity","setZIndex","setZIndexOffset","bringToFront","bringToBack"])typeof t[n]=="function"&&(a=Object.getOwnPropertyDescriptor(t,n),s=t[n],e.methods.set(n,{own:a,original:s}),e.originalMethods.set(n,s),t[n]=cn[n]);let f=e.ready=Promise.withResolvers();o.once("ready",Un,e),o.once("error",On,e),o.on("error",Gn,e),re(e),o.addTo(r);try{await f.promise}catch(m){throw lr.call(e),m}if(!ft(e))return t;o._beforeRender=Yn.bind(null,e);try{dr(e)}catch(m){throw lr.call(e),m}return B(e.backend),t}function Kn(e){let{source:t}=e,r=t instanceof L.Marker&&t.options.icon instanceof L.DivIcon,o=[r?null:t._icon,r?null:t._shadow],i;for(i of e.hidden)o.includes(i)||(i.classList.remove("leaflet-webgpu-target"),e.hidden.delete(i));for(i of o)!i||e.hidden.has(i)||(i.classList.add("leaflet-webgpu-target"),e.hidden.add(i))}function Jn(e){e.source._nativeGPU===e&&(e.source._nativeGPU=null),e.dispose?.();let t;for(t of e.hidden)t.classList.remove("leaflet-webgpu-target")}function Qn(e){return e.source._nativeGPU!==e?e.source:Xn(e)}function kn(e,t){e.fire("error",{error:t})}function hr(e,t){if(e._nativeGPU)return;if(!document.getElementById("leaflet-webgpu-targets")){let o=document.createElement("style");o.id="leaflet-webgpu-targets",o.textContent=".leaflet-webgpu-target{opacity:0!important}",document.head.append(o)}let r=e._nativeGPU={source:e,map:t,hidden:new Set};r.hide=Kn.bind(null,r),r.hide(),e.once("remove",Jn.bind(null,r)),e.ready=Promise.resolve().then(Qn.bind(null,r)),e.ready.catch(kn.bind(null,e))}var _={};function ea(){return this._cameraBearing??0}function ta(){return this._cameraPitch??0}function ut(e){_.cameraAnimations.delete(e),e._cameraAnimation=null,e._cameraFrame=null,!_.cameraAnimations.size&&_.cameraAnimationFrame!==null&&(cancelAnimationFrame(_.cameraAnimationFrame),_.cameraAnimationFrame=null)}function ra(){return ut(this),this}function gr(){let e=this.getSize().y,t=this.getPitch()*_.radians,r=e*this.options.pitchMaxDistance,o=e*1.5,i=e/2-r*Math.cos(t)*o/(o+Math.sin(t)*r);i>0&&!this._pitchSky&&(this._pitchSky=L.DomUtil.create("div","leaflet-pitch-sky",this.getContainer()),this._pitchSky.setAttribute("aria-hidden","true"),this._pitchSky.style.cssText="position:absolute;inset:0 0 auto;height:0;z-index:0;pointer-events:none;background:var(--leaflet-sky-background,linear-gradient(#9ec5e8,#dfe9f0))"),this._pitchSky&&(this._pitchSky.style.height=`${Math.max(0,Math.ceil(i))}px`,this._pitchSky.style.display=i>0?"":"none")}function oa(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))throw new TypeError("Camera angles must be finite numbers");let r=this.getPitch(),o=this.getBearing();return this._cameraPitch=Math.max(0,Math.min(85,e)),this._cameraBearing=(t%360+360)%360,this._loaded&&(gr.call(this),o!==this.getBearing()&&this.fire("rotate",{bearing:this.getBearing()}),r!==this.getPitch()&&this.fire("pitch",{pitch:this.getPitch()})),this}function ia(e){_.cameraAnimationFrame=null;let t=[..._.cameraAnimations];_.cameraAnimations.clear();let r,o,i,n,a;for([o,i]of t)if(o._cameraFrame=null,o._cameraAnimation===i){n=i.duration?Math.min(1,(e-i.start)/(i.duration*1e3)):1,a=1-(1-n)**3;try{o._setPitchAndBearing(i.fromPitch+(Math.max(0,Math.min(85,i.pitch))-i.fromPitch)*a,i.fromBearing+i.delta*a),n<1&&o._cameraAnimation===i?xr(o,i):o._cameraAnimation===i&&(o._cameraAnimation=null)}catch(s){r||=s}}if(r)throw r}function xr(e,t){_.cameraAnimations.set(e,t),_.cameraAnimationFrame===null&&(_.cameraAnimationFrame=requestAnimationFrame(ia)),e._cameraFrame=_.cameraAnimationFrame}function na(e,t,r={}){if(ut(this),!Number.isFinite(e)||!Number.isFinite(t))throw new TypeError("Camera angles must be finite numbers");if(!r.animate||matchMedia("(prefers-reduced-motion: reduce)").matches)return this._setPitchAndBearing(e,t);let o=r.duration??.3;if(!Number.isFinite(o)||o<0)throw new TypeError("Camera duration must be nonnegative");let i=performance.now(),n=this.getPitch(),a=this.getBearing(),s=((t-a)%360+540)%360-180,f=this._cameraAnimation={duration:o,start:i,fromPitch:n,fromBearing:a,pitch:e,delta:s};return xr(this,f),this}function aa(e,t){return this._animateCamera(this.getPitch(),e,t)}function sa(e,t){return this._animateCamera(e,this.getBearing(),t)}function fa(e={animate:!0}){return this.setBearing(0,e)}function ma(e={animate:!0}){return this._animateCamera(0,0,e)}function q(e){return Array.isArray(e)?new L.Point(e[0],e[1]):new L.Point(e.x,e.y)}function yr(e){let t=e.getBearing()*_.radians,r=e.getPitch()*_.radians;return[Math.cos(t),Math.sin(t),Math.cos(r),Math.sin(r)]}function ie(e,t,r=!1,o=!1){let i=e.getSize().divideBy(2),n=e.getSize().y*1.5;if(!n)return q(t);let[a,s,f,m]=yr(e),l=q(t).subtract(i);if(r){let c=e.getSize().y*e.options.pitchMaxDistance,h=f*n+m*l.y,g=h>0?l.y*n/h:-c;o&&(g=Math.max(-c,Math.min(c,g)));let y=l.x*(n-m*g)/n;return new L.Point(a*y+s*g,-s*y+a*g).add(i)}let p=a*l.x-s*l.y,u=s*l.x+a*l.y,d=n/(n-m*u);return new L.Point(p*d,f*u*d).add(i)}function ct(e,t,r=!1){let o=e._cameraView;if(!o)return t;let i=e.getSize().divideBy(2),n=e.getZoomScale(o.zoom),a=e.project(e.getCenter(),o.zoom).subtract(e.project(o.center,o.zoom));return r?t.subtract(i).subtract(a).divideBy(n).add(i):t.subtract(i).multiplyBy(n).add(a).add(i)}function la(e){return ie(this,ct(this,_.mapMethods.layerPointToContainerPoint.call(this,e)))}function pa(e){return _.mapMethods.containerPointToLayerPoint.call(this,ct(this,ie(this,e,!0),!0))}function ua(){return _.mapMethods.containerPointToLayerPoint.call(this,this.getSize().divideBy(2))}function ca(){let e;for(e of Object.values(this._layers))e instanceof L.Marker?e.update():(e instanceof L.Popup||e instanceof L.Tooltip)&&e._updatePosition()}function da(e,t){let r=this.getSize().divideBy(2),o=r.subtract(ie(this,r.subtract(q(e)),!0));return _.mapMethods.panBy.call(this,o,t)}function ha(e,t,r){if(!this.getPitch()&&!this.getBearing())return _.mapMethods.setZoomAround.call(this,e,t,r);t=this._limitZoom(t);let o=this.getZoomScale(t),i=this.getSize().divideBy(2),n=e instanceof L.Point?e:this.latLngToContainerPoint(e),a=this.containerPointToLayerPoint(i),s=this.containerPointToLayerPoint(n),f=a.add(s.subtract(a).multiplyBy(1-1/o));return this.setView(this.layerPointToLatLng(f),t,{zoom:r})}function ga(e,t={}){if(!this.getPitch()&&!this.getBearing())return _.mapMethods.panInside.call(this,e,t);let r=q(t.paddingTopLeft||t.padding||[0,0]),o=this.getSize().subtract(q(t.paddingBottomRight||t.padding||[0,0])),i=this.latLngToContainerPoint(e),n=new L.Point(Math.max(r.x,Math.min(o.x,i.x)),Math.max(r.y,Math.min(o.y,i.y)));if(n.equals(i))return this;let a=this.latLngToLayerPoint(e).subtract(this.containerPointToLayerPoint(n));return this.panTo(this.unproject(this.project(this.getCenter()).add(a)),t)}function dt(e,t=[0,0]){let r=q(t).divideBy(2),o=e.getSize().subtract(r),i=[[r.x,r.y],[o.x,r.y],[r.x,o.y],[o.x,o.y]],n=[],a;for(a of i)n.push(ie(e,a,!0,!0));return new L.Bounds(n)}function xa(e,t,r){if(!r||!this._loaded||!this.getPitch()&&!this.getBearing())return _.mapMethods._limitCenter.call(this,e,t,r);let o=this.getSize().divideBy(2),i=dt(this),n=this.project(e,t),a=new L.Bounds(n.add(i.min.subtract(o)),n.add(i.max.subtract(o))),s=this._getBoundsOffset(a,r,t);return Math.abs(s.x)<=1&&Math.abs(s.y)<=1?e:this.unproject(n.add(s),t)}function ya(e,t){if(!t||!this.getPitch()&&!this.getBearing())return _.mapMethods._limitOffset.call(this,e,t);let r=this.getSize().divideBy(2),o=r.subtract(ie(this,r.subtract(e),!0)),i=this.project(this.getCenter()),n=this.project(this._limitCenter(this.unproject(i.add(o)),this.getZoom(),t));return r.subtract(ie(this,r.subtract(n.subtract(i))))}function Fo(e,t,r,o,i){return t*r+o*e>0?Math.max(-i,Math.min(i,e*r/(t*r+o*e))):-i}function vr(e,t,r={}){t=t.getBounds?t.getBounds():t instanceof L.LatLngBounds?t:new L.LatLngBounds(t);let o=e.getZoom()??0,i=e.getSize().divideBy(2),n=e.getSize().y*1.5,a=q(r.paddingTopLeft||r.padding||[0,0]).subtract(i),s=i.subtract(q(r.paddingBottomRight||r.padding||[0,0])),[f,m,l,p]=yr(e),u=e.getSize().y*e.options.pitchMaxDistance,d=Fo(a.y,l,n,p,u),c=Fo(s.y,l,n,p,u),h=e.project(t.getNorthWest(),o).add(e.project(t.getSouthEast(),o)).divideBy(2),g=[],y,x,v;for(y of[t.getNorthWest(),t.getNorthEast(),t.getSouthWest(),t.getSouthEast()])x=e.project(y,o).subtract(h),g.push(new L.Point(f*x.x-m*x.y,m*x.x+f*x.y));let w=1/0,P=-1/0;for(v of g)w=Math.min(w,v.y),P=Math.max(P,v.y);let M=a.x*p/n,S=s.x*p/n,z=S-M,T=1/0,E=-1/0;for(v of g)T=Math.min(T,v.x+M*v.y),E=Math.max(E,v.x+S*v.y);let b=Math.min((c-d)/(P-w),(s.x-a.x-z*d)/(E-T-z*w)),R=e.getScaleZoom(b,o),D=e.options.zoomSnap;if(D&&(R=Math.floor(Math.round(R/(D/100))/100)*D),R=Math.max(e.getMinZoom(),Math.min(e.getMaxZoom(),r.maxZoom??1/0,R)),!Number.isFinite(R))return{center:t.getCenter(),zoom:R};let U=e.getZoomScale(R,o),G=P*U-c,$=w*U-d,H=Math.max(G,z?(U*(E-T)-s.x+a.x)/z:G),V=(Math.min($,H)+$)/2,ee=(U*(T+E)-a.x-s.x-(M+S)*V)/2,he=h.add(new L.Point(f*ee+m*V,-m*ee+f*V).divideBy(U));return{center:e.unproject(he,o),zoom:R}}function va(e,t){return this.getPitch()||this.getBearing()?vr(this,e,t):_.mapMethods._getBoundsCenterZoom.call(this,e,t)}function Ma(e,t,r){if(!this.getPitch()&&!this.getBearing())return _.mapMethods.getBoundsZoom.call(this,e,t,r);if(!t)return vr(this,e,{padding:q(r||[0,0]).divideBy(2)}).zoom;e=e instanceof L.LatLngBounds?e:new L.LatLngBounds(e);let o=dt(this,r).getSize(),i=this.project(e.getSouthEast()).subtract(this.project(e.getNorthWest())),n=this.getScaleZoom(Math.max(o.x/i.x,o.y/i.y)),a=this.options.zoomSnap;return Math.max(this.getMinZoom(),Math.min(this.getMaxZoom(),a?Math.ceil(n/a)*a:n))}function wa(e,t){let r=this._getCenterOffset(e)._trunc();return t?.animate!==!0&&!this.getSize().contains(r)?!1:(_.mapMethods.panBy.call(this,r,t),!0)}function _a(){if(!this.getPitch()&&!this.getBearing())return _.mapMethods.getBounds.call(this);let e=dt(this),t=new L.LatLngBounds,r,o;for(r of[e.min,e.max])o=_.mapMethods.containerPointToLayerPoint.call(this,ct(this,r,!0)),t.extend(this.layerPointToLatLng(o));return t}function Pa(){this.options.maxBounds&&this._panInsideMaxBounds()}function Mr(){let e=this,t=e._cameraDraggable;if(!e.getPitch()&&!e.getBearing())return;let r=e.getSize().divideBy(2),o=t._newPos.subtract(t._startPos),i=r.subtract(ie(e,r.subtract(o),!0));t._newPos=t._startPos.add(i)}function Ta(){ut(this),this._pitchSky?.remove(),this._cameraDraggable&&(this._cameraDraggable.off("predrag",Mr,this),delete this._cameraDraggable)}function La(){let e=this.dragging?._draggable;e&&(this._cameraDraggable=e,e.on("predrag",Mr,this))}async function vs(e){try{let{cameraControls:t}=await Promise.resolve().then(()=>(ys(),xs));e._container?._leaflet_id&&t(e)}catch(t){throw e.fire("error",{error:t}),t}}function me(){}function Ms(){if(!document.getElementById("leaflet-camera-zoom-style")){let e=document.createElement("style");e.id="leaflet-camera-zoom-style",e.textContent=".leaflet-camera-zoom .leaflet-marker-icon,.leaflet-camera-zoom .leaflet-marker-shadow,.leaflet-camera-zoom .leaflet-popup,.leaflet-camera-zoom .leaflet-tooltip{transition:none!important}",document.head.append(e)}this._setPitchAndBearing(this.options.pitch,this.options.bearing),this.on("load resize pitch",gr),this.on("rotate pitch",Pa,this),this.once("unload",Ta,this),this.whenReady(La,this),(this.options.rotate||this.options.trackContainerMutation)&&(this.cameraReady=vs(this),this.cameraReady.catch(me))}function ws(e){e instanceof L.DivIcon||(e.options.crossOrigin||=!0);let t=_.markerMethods.setIcon.call(this,e);return this._map&&!(e instanceof L.DivIcon)&&hr(this,this._map),t}function _s(e){if(!Number.isFinite(e))throw new TypeError("Marker rotation must be finite");return this.options.rotation=e,this.update(),this._nativeGPU?.refresh?.(),this}function Ps(e,t){let r=this.options.rotation+(this.options.rotateWithView?this._map.getBearing()*_.radians:0);this.options.keepUpright&&Math.cos(r)<0&&(r+=Math.PI);let o=this.options.scale;return new L.Point((e*Math.cos(r)-t*Math.sin(r))*o,(e*Math.sin(r)+t*Math.cos(r))*o)}function Ts(){return{..._.markerMethods.getEvents.call(this),rotate:this.update,pitch:this.update,move:this.update}}function xt(e,t){return e.layerPointToContainerPoint(t).subtract(e._getMapPanePos())}function Ls(e){_.markerMethods._setPos.call(this,xt(this._map,e));let t,r,o,i,n;for([t,r]of[[this._icon,"iconAnchor"],[this._shadow,"shadowAnchor"]])t&&(o=this._cameraIconPoint(1,0),i=this.options.icon.options,n=i[r]||i.iconAnchor,t.style.transformOrigin=n?`${n.x??n[0]}px ${n.y??n[1]}px`:"center",t.style.transform+=` rotate(${Math.atan2(o.y,o.x)}rad) scale(${this.options.scale})`)}function Ss(e){_.markerMethods._updateZIndex.call(this,e);let t=this._cameraZIndexOffset!==e;this._cameraZIndexOffset=e,t&&this._nativeGPU?.refresh?.()}function bs(e){let t=this._marker._map,r=L.DomUtil.getPosition(this._marker._icon).add(t._getMapPanePos()),o=t.containerPointToLayerPoint(r);L.DomUtil.setPosition(this._marker._icon,o),this._cameraOriginalOnDrag.call(this,e),this._marker._setPos(o)}function Cs(){_.markerPanFrame=null;let e=[..._.pendingMarkerPan];_.pendingMarkerPan.clear();let t,r;for([t,r]of e)t._panRequest=null,t._adjustPan(r)}function Es(e,t){_.pendingMarkerPan.set(e,t),_.markerPanFrame===null&&(_.markerPanFrame=requestAnimationFrame(Cs)),e._panRequest=_.markerPanFrame}function Bs(e){let t=this._marker,r=t._map;if(!r.getPitch()&&!r.getBearing())return this._cameraOriginalAdjustPan.call(this,e);let o=L.DomUtil.getPosition(t._icon).add(r._getMapPanePos()),i=r.getSize(),n=q(t.options.autoPanPadding),a=t.options.autoPanSpeed,s=new L.Point((Math.max(0,o.x-i.x+n.x)-Math.max(0,n.x-o.x))/Math.max(1,n.x)*a,(Math.max(0,o.y-i.y+n.y)-Math.max(0,n.y-o.y))/Math.max(1,n.y)*a);if(!s.x&&!s.y)return;let f=r._getMapPanePos();r.panBy(s,{animate:!1});let m=f.subtract(r._getMapPanePos());this._draggable._newPos._add(m),this._draggable._startPos._add(m),L.DomUtil.setPosition(t._icon,this._draggable._newPos),this._onDrag(e),Es(this,e)}function As(){if(!this.dragging||this.dragging._cameraDrag)return;let e=this.dragging,t=e._onDrag,r=e._adjustPan;e._cameraOriginalOnDrag=t,e._cameraOriginalAdjustPan=r,e._onDrag=bs,e._adjustPan=Bs,e.enabled()&&(e._draggable.off("drag",t,e),e._draggable.on("drag",e._onDrag,e)),e._cameraDrag=!0}function zs(){let e=_.markerMethods._initInteraction.call(this);return As.call(this),e}function Is(){return{..._.popupEvents.call(this),rotate:this._updatePosition,pitch:this._updatePosition,move:this._updatePosition}}function Ds(){return{..._.tooltipEvents.call(this),rotate:this._updatePosition,pitch:this._updatePosition,move:this._updatePosition}}function Rs(){let e=this._map;if(!e.getPitch()&&!e.getBearing())return _.popupPan.call(this);if(!this.options.autoPan)return;if(e._panAnim&&e._panAnim.stop(),this._autopanning){this._autopanning=!1;return}let t=this._container.getBoundingClientRect(),r=e.getContainer().getBoundingClientRect(),o=q(this.options.autoPanPaddingTopLeft||this.options.autoPanPadding),i=e.getSize().subtract(q(this.options.autoPanPaddingBottomRight||this.options.autoPanPadding)),n=t.left-r.left,a=t.top-r.top,s=t.right-r.left,f=t.bottom-r.top,m=Math.min(0,n-o.x)||Math.max(0,s-i.x),l=Math.min(0,a-o.y)||Math.max(0,f-i.y);if(!m&&!l)return;this.options.keepInView&&(this._autopanning=!0);let p=e.latLngToContainerPoint(this._latlng).subtract(new L.Point(m,l)),u=e.latLngToLayerPoint(this._latlng).subtract(e.containerPointToLayerPoint(p));e.fire("autopanstart"),e.panTo(e.unproject(e.project(e.getCenter()).add(u)))}function Us(){if(_.popupPosition.call(this),!this._map)return;let e=this._map.latLngToLayerPoint(this._latlng),t=xt(this._map,e).subtract(e);this._zoomAnimated?L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(t)):(this._container.style.left=`${this._containerLeft+t.x}px`,this._container.style.bottom=`${this._containerBottom-t.y}px`)}function Os(e){_.tooltipPosition.call(this,e);let t=xt(this._map,e).subtract(e);L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(t))}function Gs(){let e=_.gridEvents.call(this);return this._cameraGridUpdate||=L.Util.throttle(this._onMoveEnd,this.options.updateInterval,this),{...e,rotate:this._cameraGridUpdate,pitch:this._cameraGridUpdate}}function Fs(e){if(!this._map.getBearing()&&!this._map.getPitch())return _.tiledBounds.call(this,e);let t=this._map.getBounds();return new L.Bounds(this._map.project(t.getNorthWest(),this._tileZoom),this._map.project(t.getSouthEast(),this._tileZoom))}_.mapMethods=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Map.prototype));_.radians=Math.PI/180;_.cameraAnimations=new Map;_.cameraAnimationFrame=null;L.Map.mergeOptions({rotate:!0,bearing:0,pitch:0,pitchMaxDistance:3,rotateControl:!0,shiftKeyRotate:!0,pitchDrag:!0,touchRotate:!1,touchPitch:!1,compassBearing:!1});L.Map.include({getBearing:ea,getPitch:ta,_stopPitchBearingAnimation:ra,_setPitchAndBearing:oa,_animateCamera:na,setBearing:aa,setPitch:sa,resetNorth:fa,resetNorthPitch:ma,layerPointToContainerPoint:la,containerPointToLayerPoint:pa,_getCenterLayerPoint:ua,_updateCameraOverlays:ca,panBy:da,setZoomAround:ha,panInside:ga,_limitCenter:xa,_limitOffset:ya,_getBoundsCenterZoom:va,getBoundsZoom:Ma,_tryAnimatedPan:wa,getBounds:_a});L.Map.addInitHook(Ms);_.markerMethods=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Marker.prototype));L.Marker.mergeOptions({rotation:0,rotateWithView:!1,keepUpright:!1,scale:1});L.Marker.include({setIcon:ws,setRotation:_s,_cameraIconPoint:Ps,getEvents:Ts,_setPos:Ls,_updateZIndex:Ss,_initInteraction:zs});_.pendingMarkerPan=new Map;_.markerPanFrame=null;_.popupEvents=L.Popup.prototype.getEvents;L.Popup.include({getEvents:Is});_.tooltipEvents=L.Tooltip.prototype.getEvents;L.Tooltip.include({getEvents:Ds});_.popupPosition=L.Popup.prototype._updatePosition;_.popupPan=L.Popup.prototype._adjustPan;L.Popup.include({_adjustPan:Rs,_updatePosition:Us});_.tooltipPosition=L.Tooltip.prototype._setPosition;L.Tooltip.include({_setPosition:Os});_.tiledBounds=L.GridLayer.prototype._getTiledPixelBounds;_.gridEvents=L.GridLayer.prototype.getEvents;L.GridLayer.include({getEvents:Gs,_getTiledPixelBounds:Fs});function Ot(){let e=this,t;for(t of e._zoomTransitions?.keys()||[])t.finish();e._zoomTransitions=null,e._zoomView=null,delete e._map._cameraView,e._map.getContainer().classList.remove("leaflet-camera-zoom"),e._map._updateCameraOverlays(),e._zoomLevel=null,B(e)}var Gt={};function Ns(){let e=Gt.pendingMapChanges.shift();e._queued=!1,!(e._shared!==e||!e.renderer)&&(e._map._animatingZoom?B(e):Oe(e))}Gt.pendingMapChanges=[];function Ft(){let e=this;e._queued||(e._queued=!0,Gt.pendingMapChanges.push(e),queueMicrotask(Ns))}var Nt={};function js(){let e=Nt.pendingZoomAnimations.shift();e._shared===e&&e.renderer&&Oe(e)}Nt.pendingZoomAnimations=[];function jt(e){let t=this._map;e&&!this._zoomView&&(this._zoomView={from:t.getCenter(),zoom:t.getZoom(),to:e.center,targetZoom:e.zoom,start:performance.now()},t.getContainer().classList.add("leaflet-camera-zoom")),Nt.pendingZoomAnimations.push(this),queueMicrotask(js)}function Zt(){this._zoomLevel=null}function Zs(e,t){let r=[],o;for(o=0;o<6;o++)r.push({x:e.x+Math.cos(o*Math.PI/3)*t,y:e.y+Math.sin(o*Math.PI/3)*t,ground:e.ground,uv:[3,3]});return r}function $s(e,t,r){let o=ce(5264986),i=t.poleRadius;if(!Number.isFinite(i)||i<=0)throw new Error("Invalid lamp pole radius");let n={...e,uv:[3,3]},a,s,f,m,l,p,u,d,c,h;for([a,s,f]of[[i,0,t.top],[i*2.5,t.top-.25,t.top+.15]])for(m=Zs(e,a),l=0;l<6;l++)p=m[l],u=m[(l+1)%6],d=(l+.5)*Math.PI/3,c=Math.cos(d),h=-Math.sin(d),r(p,s,u,s,u,f,c,0,h,o),r(p,s,u,f,p,f,c,0,h,o),r(n,f,p,f,u,f,0,1,0,o),r(n,s,u,s,p,s,0,-1,0,o)}function Vs(e,t,r,o,i,n,a,s){e(r,a,o,a,i,a,...s,t),e(r,a,i,a,n,a,...s,t)}function $t(e,t,r,o){return{x:e.x+(o===2?0:t*.65),y:e.y+(o===1?0:o===2?t*.65:r*.65),ground:e.ground+(o===0?0:r*.65),uv:[t,r]}}function qs(e,t,r){if(!Number.isFinite(t.lightRadius)||t.lightRadius<=0)throw new Error("Invalid light radius");let o=ce(t.color),i;for(i=0;i<3;i++)Vs(r,o,$t(e,-1,-1,i),$t(e,1,-1,i),$t(e,1,1,i),$t(e,-1,1,i),t.top,i===0?[0,1,0]:i===1?[0,0,1]:[1,0,0])}var Ur=[[0,0],[.35,.8],[.6,1],[.85,.7],[1,0]];var Or=[{x:Math.cos(0*Math.PI/4),y:Math.sin(0*Math.PI/4),nx:Math.cos(.5*Math.PI/4),nz:-Math.sin(.5*Math.PI/4)},{x:Math.cos(1*Math.PI/4),y:Math.sin(1*Math.PI/4),nx:Math.cos(1.5*Math.PI/4),nz:-Math.sin(1.5*Math.PI/4)},{x:Math.cos(2*Math.PI/4),y:Math.sin(2*Math.PI/4),nx:Math.cos(2.5*Math.PI/4),nz:-Math.sin(2.5*Math.PI/4)},{x:Math.cos(3*Math.PI/4),y:Math.sin(3*Math.PI/4),nx:Math.cos(3.5*Math.PI/4),nz:-Math.sin(3.5*Math.PI/4)},{x:Math.cos(4*Math.PI/4),y:Math.sin(4*Math.PI/4),nx:Math.cos(4.5*Math.PI/4),nz:-Math.sin(4.5*Math.PI/4)},{x:Math.cos(5*Math.PI/4),y:Math.sin(5*Math.PI/4),nx:Math.cos(5.5*Math.PI/4),nz:-Math.sin(5.5*Math.PI/4)},{x:Math.cos(6*Math.PI/4),y:Math.sin(6*Math.PI/4),nx:Math.cos(6.5*Math.PI/4),nz:-Math.sin(6.5*Math.PI/4)},{x:Math.cos(7*Math.PI/4),y:Math.sin(7*Math.PI/4),nx:Math.cos(7.5*Math.PI/4),nz:-Math.sin(7.5*Math.PI/4)}];function Vt(e,t){let r=[],o;for(o of Or)r.push({x:e.x+o.x*t,y:e.y+o.y*t,ground:e.ground});return r}function Gr(e,t,r,o,i,n,a){let s=Vt(e,r),f=Vt(e,i),m,l,p,u,d,c,h,g,y;for(m=0;m<8;m++)l=(m+1)%8,p=(r-i)/(n-o),u=Math.hypot(1,p),{nx:d,nz:c}=Or[m],h=p/u,g=d/u,y=c/u,r&&t(s[m],o,s[l],o,f[l],n,g,h,y,a),i&&t(s[m],o,f[l],n,f[m],n,g,h,y,a)}function Hs(e,t,r){let{top:o,bottom:i=0,trunkRadius:n,crownRadius:a,crownBottom:s,crownShape:f="round"}=t;if(!Number.isFinite(n)||!Number.isFinite(a)||!Number.isFinite(s)||n<=0||a<n||s<=i||s>=o||!["round","cone"].includes(f))throw new Error("Invalid tree dimensions or crown shape");let m=ce(t.trunkColor??7491898),l=ce(t.color??5210683);Gr(e,r,n,i,n,s+(o-s)*.25,m);let p,u,d,c,h;if(f==="cone"){let g=Vt(e,a);for(p=0;p<8;p++)r(e,s,g[p],s,g[(p+1)%8],s,0,-1,0,l);Gr(e,r,a,s,0,o,l)}else for(p=1;p<Ur.length;p++)[u,d]=Ur[p-1],[c,h]=Ur[p],Gr(e,r,d*a,s+u*(o-s),h*a,s+c*(o-s),l)}function Fr(e,t=!0){let r={enabled:t,loaded:0,skipped:0,pending:0,errors:[]},o;for(o of e._areas.values())o.error?r.errors.push(o.error):o.done||r.pending++,r.loaded+=o.buildings??0,r.skipped+=o.skipped??0;e.fire("progress",r)}function yt(e){let{bytes:t}=e,r=0,o,i;for(o=1;o<=2**49;o*=128){if(e.cursor>=t.length)throw new Error("Truncated PMTiles directory");if(i=t[e.cursor++],r+=(i&127)*o,!Number.isSafeInteger(r))throw new Error("Invalid PMTiles directory integer");if(i<128)return r}throw new Error("Invalid PMTiles directory integer")}function Ws(e){let t=new Uint8Array(e),r={bytes:t,cursor:0},o=yt(r);if(o>(t.length-r.cursor)/4)throw new Error("Invalid PMTiles directory count");let i=[],n=0,a,s,f;for(a=0;a<o;a++){if(n+=yt(r),!Number.isSafeInteger(n)||a&&n<=i[a-1].tileId)throw new Error("Invalid PMTiles directory tile IDs");i.push({tileId:n})}for(s of i)s.runLength=yt(r);for(s of i)if(s.length=yt(r),!s.length)throw new Error("Invalid PMTiles directory length");for(a=0;a<i.length;a++){if(s=i[a],f=yt(r),!f&&!a)throw new Error("Invalid PMTiles directory offset");s.offset=f?f-1:i[a-1].offset+i[a-1].length}if(r.cursor!==t.length)throw new Error("Trailing PMTiles directory data");return i}async function Nr(e,t){if(t===1)return e;if(t!==2)throw new Error(`Unsupported PMTiles compression: ${t}`);return new Response(new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer()}async function Ze(e,t,r,o){if(o?.throwIfAborted(),!Number.isSafeInteger(t)||!Number.isSafeInteger(r)||t<0||r<=0||!Number.isSafeInteger(t+r))throw new Error("Invalid PMTiles byte range");let i=await fetch(e.url,{headers:{Range:`bytes=${t}-${t+r-1}`},signal:o});if(!i.ok)throw new Error(`Unable to read PMTiles: HTTP ${i.status}`);let n=i.headers.get("ETag");if(e._etag&&n!==e._etag)throw new Error("PMTiles archive changed; recreate the layer");n&&(e._etag=n);let a=await i.arrayBuffer();if(i.status===200)a=a.slice(t,t+r);else if(i.status!==206||!i.headers.get("Content-Range")?.startsWith(`bytes ${t}-${t+r-1}/`))throw new Error("Invalid PMTiles range response");if(a.byteLength!==r)throw new Error("Truncated PMTiles range");return a}async function Ys(e,t,r,o){return Ws(await Nr(await Ze(e,t,r),o))}function Xs(e,t,r){if(!Number.isInteger(e)||!Number.isInteger(t)||!Number.isInteger(r)||e<0||e>26||t<0||r<0||t>=2**e||r>=2**e)throw new Error("Invalid PMTiles tile coordinates");let o=(4**e-1)/3,i=2**e,n,a,s;for(n=i/2;n>=1;n/=2)a=t&n?1:0,s=r&n?1:0,o+=n*n*(3*a^s),s||(a&&(t=i-1-t,r=i-1-r),[t,r]=[r,t]);return o}function Ks(e){if(e.byteLength<127||new TextDecoder().decode(new Uint8Array(e,0,7))!=="PMTiles"||new Uint8Array(e)[7]!==3)throw new Error("Expected a PMTiles v3 archive");let t=new DataView(e),r={},o=["rootDirectoryOffset","rootDirectoryLength","jsonMetadataOffset","jsonMetadataLength","leafDirectoryOffset","leafDirectoryLength","tileDataOffset","tileDataLength","numAddressedTiles","numTileEntries","numTileContents"],i=["clustered","internalCompression","tileCompression","tileType","minZoom","maxZoom"],n=["minLon","minLat","maxLon","maxLat"],a;for(a=0;a<o.length;a++)r[o[a]]=Number(t.getBigUint64(8+a*8,!0));for(a=0;a<i.length;a++)r[i[a]]=t.getUint8(96+a);for(a=0;a<n.length;a++)r[n[a]]=t.getInt32(102+a*4,!0)/1e7;return r.centerZoom=t.getUint8(118),r.centerLon=t.getInt32(119,!0)/1e7,r.centerLat=t.getInt32(123,!0)/1e7,r}function vt(e){return e.options.archive&&e.options.archive!==e?e.options.archive.getHeader():e._header||=Ze(e,0,127).then(Ks)}async function jr(e,t,r,o,i){if(e.options.archive&&e.options.archive!==e&&e.options.archive.getZxy)return e.options.archive.getZxy(t,r,o,i);let n=Xs(t,r,o);i?.throwIfAborted();let a=await vt(e);if(i?.throwIfAborted(),t<a.minZoom||t>a.maxZoom)return;let s=a.rootDirectoryOffset,f=a.rootDirectoryLength,m=new Set,l,p,u,d,c,h,g,y,x;for(l=0;l<4;l++){if(m.has(s))throw new Error("Cyclic PMTiles directory");m.add(s),p=`${s}:${f}`,e._directories.has(p)||(e._directories.size>=32&&e._directories.delete(e._directories.keys().next().value),e._directories.set(p,Ys(e,s,f,a.internalCompression))),u=e._directories.get(p),d=void 0;try{d=await u}catch(v){throw e._directories.get(p)===u&&e._directories.delete(p),v}for(i?.throwIfAborted(),c=0,h=d.length-1;c<=h;)g=c+h>>1,d[g].tileId<=n?c=g+1:h=g-1;if(y=d[h],!y)return;if(y.runLength){if(n-y.tileId>=y.runLength)return;if(y.offset+y.length>a.tileDataLength)throw new Error("PMTiles tile outside data section");return x=await Nr(await Ze(e,a.tileDataOffset+y.offset,y.length,i),a.tileCompression),i?.throwIfAborted(),{data:x}}if(y.offset+y.length>a.leafDirectoryLength)throw new Error("PMTiles directory outside leaf section");s=a.leafDirectoryOffset+y.offset,f=y.length}throw new Error("PMTiles directory depth exceeds four levels")}async function Js(e,t){if(e._geojson){let{data:o,url:i}=e.options;if(o!==void 0&&i)throw new Error("GeoJSON source requires either data or url");if(o!==void 0)return o;if(!i)throw new Error("GeoJSON source requires either data or url");let n=await fetch(new URL(i,document.baseURI),{signal:t.request.signal});if(!n.ok)throw new Error(`Unable to load GeoJSON: HTTP ${n.status}`);return n.json()}let r=await jr(e,t.coords.z,t.coords.x,t.coords.y,t.request.signal);return r?JSON.parse(new TextDecoder().decode(r.data)):{type:"FeatureCollection",features:[]}}var $e={};function Zr(e,t){return e.distance-t.distance}function Qs(e,t,r){let{backend:o,crs:i,origin:n,metres:a,map:s}=e,f=i.project(new L.LatLng(r,t)),m=s._terrain3D?Y(s._terrain3D,[r,t]):void 0;return{x:(f.x-n.x)*a,y:(f.y-n.y)*a,ground:Number.isFinite(m)&&Number.isFinite(o.root.position[1])?m-o.root.position[1]:0}}function $r(e){return e.ground||0}function Ke(e,t,r,o,i,n,a,s,f,m,l){let{backend:p,positions:u,normals:d,colors:c,uvs:h}=e,g=o.x-t.x,y=i-r,x=t.y-o.y,v=n.x-t.x,w=a-r,P=t.y-n.y;if((y*P-x*w)*s+(x*v-g*P)*f+(g*w-y*v)*m<0){let M=o,S=i;o=n,i=a,n=M,a=S}u.push(t.x,r+$r(t),-t.y,o.x,i+$r(o),-o.y,n.x,a+$r(n),-n.y),d.push(s,f,m,s,f,m,s,f,m),c.push(l.r,l.g,l.b,l.r,l.g,l.b,l.r,l.g,l.b),p.options.nightLight&&h.push(...t.uv,...o.uv,...n.uv)}function ks(...e){Ke($e.triangleContexts[$e.triangleContexts.length-1],...e)}function Vr(e,t,r,o){$e.triangleContexts.push(e);try{t(r,o,ks)}finally{$e.triangleContexts.pop()}}function ef(e,t,r,o,i,n){let{backend:a}=e,{top:s}=i,f=Qs(e,r,o);if(a.options.nightLight){if(!Number.isFinite(i.lightFlux)||i.lightFlux<=0)throw new Error("Invalid light flux");let m=t.properties?.cod_ouvrag||`${r},${o}`;i.poleRadius>0&&!e.supports.has(m)&&(Vr(e,$s,f,i),e.supports.add(m)),Vr(e,qs,f,i),e.lights.push({position:[f.x,f.ground+s,-f.y],radius:Math.hypot(s,i.lightRadius),color:[n.r,n.g,n.b],flux:i.lightFlux})}else Vr(e,Hs,f,i)}function tf(e,t){let{backend:r,crs:o,origin:i,metres:n,map:a}=e;if(t.length<4)throw new Error("Invalid GeoJSON polygon ring");let s=[],f,m,l,p;for([f,m]of t.slice(0,-1)){if(!Number.isFinite(f)||!Number.isFinite(m))throw new Error("Invalid GeoJSON coordinates");l=o.project(new L.LatLng(m,f)),p=a._terrain3D?Y(a._terrain3D,[m,f]):void 0,s.push({x:(l.x-i.x)*n,y:(l.y-i.y)*n,ground:Number.isFinite(p)&&Number.isFinite(r.root.position[1])?p-r.root.position[1]:0})}return s}function rf(e,t,r,o,i){if(!t.length)throw new Error("Empty GeoJSON polygon");let n=[],a,s,f,m,l,p,u,d,c,h,g,y;for(a of t)n.push(tf(e,a));let x=[];for(s of n)for(f of s)x.push(f);for([m,l,p]of st(n[0],n.slice(1)))Ke(e,x[m],r,x[l],r,x[p],r,0,1,0,i),o>0&&Ke(e,x[m],o,x[l],o,x[p],o,0,-1,0,i);for(u=0;u<n.length;u++)for(s=n[u],d=rr(s)===(u===0)?-1:1,c=0;c<s.length;c++)m=s[c],l=s[(c+1)%s.length],h=Math.hypot(l.x-m.x,l.y-m.y),h&&(g=d*(l.y-m.y)/h,y=d*(l.x-m.x)/h,Ke(e,m,o,l,o,l,r,g,0,y,i),Ke(e,m,o,l,r,m,r,g,0,y,i))}function of(e,t){let{backend:r,area:o,map:i}=e,n=o.coords,a=t?.geometry,s=a?.type==="Point";if(r.options.nightLight&&!s)throw new Error("Night lights require Point geometry");let f=a?.type==="Polygon"?[a.coordinates]:a?.type==="MultiPolygon"?a.coordinates:null;if(!f&&!s)throw new Error("Unsupported GeoJSON geometry");let[m,l]=(s?a.coordinates:f[0]?.[0]?.[0])??[];if(!Number.isFinite(m)||!Number.isFinite(l))throw new Error("Invalid GeoJSON coordinates");if(n){let v=i.project(new L.LatLng(l,m),n.z);if(Math.floor(v.x/256)!==n.x||Math.floor(v.y/256)!==n.y)return}let p=r.options.style(t);if(p===null){e.skipped++;return}if(!p||typeof p!="object")throw new Error("style must return an extrusion style or null");let{top:u,bottom:d=0,color:c=14267276}=p;if(!Number.isFinite(u)||!Number.isFinite(d)||d<0||u<=d)throw new Error("Invalid extrusion heights: expected top > bottom >= 0");let h=ce(c),g=e.positions.length/3;s&&ef(e,t,m,l,p,h);let y;for(y of f||[])rf(e,y,u,d,h);let x=e.positions.length/3;e.featureFaces.push({id:t.id??t.properties?.objectid??JSON.stringify(a),properties:t.properties,baseColor:h,faceStart:g/3,faceEnd:x/3,vertexStart:g,vertexEnd:x})}function nf(e){let{positions:t,normals:r,colors:o,featureFaces:i}=e;if(e.backend.options.nightLight||i.length<2)return e;let n=i[0].vertexEnd,a=n*3;if(!n||t.length!==a*i.length)return e;let s=[Math.trunc(t[0]),Math.trunc(t[1]),Math.trunc(t[2])],f=new Float32Array(a),m,l,p,u,d;for(m=0;m<a;m++)f[m]=t[m]-s[m%3];let c=new Float32Array(i.length*4);for(l=0;l<i.length;l++){if(u=i[l],d=l*a,u.vertexStart!==l*n||u.vertexEnd!==(l+1)*n)return e;for(p=0;p<3;p++)c[l*4+p]=s[p]+t[d+p]-t[p];for(c[l*4+3]=l*n,m=0;m<a;m++)if(Math.fround(f[m]+c[l*4+m%3])!==Math.fround(t[d+m])||Math.fround(r[m])!==Math.fround(r[d+m])||Math.fround(o[m])!==Math.fround(o[d+m]))return e}return{positions:f,normals:r.slice(0,a),colors:o.slice(0,a),instanceOffsets:c}}function af(e){let{backend:t,area:r}=e;if(!e.positions.length){Object.assign(r,{mesh:null,buildings:0,skipped:e.skipped,done:!0});return}let o=t.renderer.device,i=nf(e),n={position:{size:3,data:new Float32Array(i.positions)},normal:{size:3,data:new Float32Array(i.normals)},color:{size:3,data:new Float32Array(i.colors)}};i.instanceOffsets&&(n.instanceOffset={size:4,data:i.instanceOffsets}),t.options.nightLight&&(n.uv={size:2,data:new Float32Array(e.uvs)});let a,s;for([a,s]of Object.entries(n))s.count=s.data.length/s.size,s.buffer=o.createBuffer({size:Math.max(4,s.data.byteLength),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),o.queue.writeBuffer(s.buffer,0,s.data);let f={device:o,attributes:n,drawRange:{start:0,count:n.position.count}};Object.assign(r,{mesh:{...J(),device:o,geometry:f,program:se(t,{instanced:!!i.instanceOffsets,vertexColors:!0,roofTexture:!!t.options.roofTexture,...t.options.nightLight?{nightLight:!0,alphaMode:"BLEND",doubleSided:!0}:{}}),id:F.nextId++,renderOrder:0,fadeDuration:250,extras:{featureFaces:e.featureFaces,lights:e.lights}},buildings:e.featureFaces.length,skipped:e.skipped,done:!0}),j(r.mesh,t.root),B(t)}function sf(e,t,r){let o=r.options.crs,i=o.project(e.location);return{backend:e,area:t,map:r,crs:o,origin:i,metres:Math.cos(e.location.lat*Math.PI/180),positions:[],normals:[],colors:[],uvs:[],featureFaces:[],lights:[],supports:new Set,skipped:0}}async function ff(e,t,r){let o;try{if(await new Promise(requestAnimationFrame),await r._terrain3D?._terrainPromise,t.request.signal.aborted)return;let i=await Js(e,t);if(t.request.signal.aborted)return;if(i?.type!=="FeatureCollection"||!Array.isArray(i.features))throw new Error("Invalid GeoJSON response");if(e._geojson&&typeof e.options.style!="function")throw new Error("style must be a function");let n=sf(e,t,r),a=performance.now()+4;for(o of i.features){if(t.request.signal.aborted)return;if(performance.now()>=a){if(await new Promise(requestAnimationFrame),t.request.signal.aborted)return;a=performance.now()+4}of(n,o)}af(n)}catch(i){t.request.signal.aborted||(t.error=i.message,e.fire("error",{error:i}))}finally{e._inflight--,qt(e,r)}}$e.triangleContexts=[];function qt(e,t=e._map){let r=t&&F.renderers.get(t);if(!r)return;let o=[],i,n,a,s;for(i of r._layers)Number.isFinite(i._inflight)&&i._areas&&(i.url||i._geojson)&&o.push(i);let f=[];for(i of o)for(n of i._areas.values())n.started||n.request.signal.aborted||(a=n.coords&&t.project(t.getCenter(),n.coords.z).divideBy(256),f.push({layer:i,area:n,distance:a?Math.hypot(n.coords.x+.5-a.x,n.coords.y+.5-a.y)/2**n.coords.z:0}));f.sort(Zr);let m=0;for(i of o)m+=i._inflight;for({layer:s,area:n}of f){if(m>=4)break;s._inflight>=2||(n.started=!0,s._inflight++,m++,ff(s,n,t))}for(i of o)Fr(i)}function Me(e,t){t?.model&&(t=null),!(e.highlightedFeature?.mesh===t?.mesh&&e.highlightedFeature?.vertexStart===t?.vertexStart)&&(e.highlightedFeature&&(e.highlightedFeature.mesh.highlight=null),e.highlightedFeature=t,t&&(t.mesh.highlight=[t.vertexStart,t.vertexEnd]),B(e))}function we(e,t,r){let o=e._tooltip;if(!o)return;if(t){o.replaceChildren(e.options.tooltip(t)),o.hidden=!1;let a=e.container.getBoundingClientRect(),s=r.clientX-a.left,f=r.clientY-a.top;o.style.left=`${s+o.offsetWidth+16>a.width?s-o.offsetWidth-12:s+12}px`,o.style.top=`${f+o.offsetHeight+16>a.height?f-o.offsetHeight-12:f+12}px`}else o.hidden=!0;let i=e._shared,n;if(i){let a=!1;for(n of i._layers)if(n._tooltip&&!n._tooltip.hidden){a=!0;break}a?(i._cursor===void 0&&(i._cursor=e.container.style.cursor),e.container.style.cursor="pointer"):i._cursor!==void 0&&(e.container.style.cursor=i._cursor,delete i._cursor)}}function Ve(e,t){t.request.abort();let r;if(t.mesh){e.highlightedFeature?.mesh===t.mesh&&(Me(e,null),e.hoveredFeature=null,we(e,null)),j(t.mesh,null),B(e);let o=t.mesh.geometry;for(r of Object.values(o.attributes))r.buffer.destroy();t.mesh.program.pipelineCache.clear()}}function mf(e,t){return Math.hypot(e[1].x-e[2].x,e[1].y-e[2].y)-Math.hypot(t[1].x-t[2].x,t[1].y-t[2].y)}function qe(e){if(!e._map||!e._shared)return;if(e._geojson){e._areas.has("geojson")||e._areas.set("geojson",{request:new AbortController}),qt(e);return}if(!e.header)return;let t=e.header.minZoom,r=e._map.project(e._map.getCenter(),t).divideBy(256).floor(),o=e._map.getBounds(),i=e._map.project(o.getNorthWest(),t).divideBy(256).floor(),n=e._map.project(o.getSouthEast(),t).divideBy(256).floor(),a=e._map.project([e.header.maxLat,e.header.minLon],t).divideBy(256).floor(),s=e._map.project([e.header.minLat,e.header.maxLon],t).divideBy(256).floor(),f=new Map,m,l,p,u,d;for(m=Math.max(0,i.x-1,a.x);m<=Math.min(2**t-1,n.x+1,s.x);m++)for(l=Math.max(0,i.y-1,a.y);l<=Math.min(2**t-1,n.y+1,s.y);l++)f.set(`${m}/${l}`,{z:t,x:m,y:l});for([p,u]of e._areas)f.has(p)||(Ve(e,u),e._areas.delete(p));let c=[];for([p,d]of f)c.push([p,d,r]);c.sort(mf);for([p,d]of c)e._areas.has(p)||e._areas.set(p,{coords:d,request:new AbortController});qt(e)}function Mt(e){if(!e.root||!e.location)return;e._terrainBaseY??=e.root.position[1];let t=e._map?._terrain3D,r=t&&Y(t,e.location),o=Number.isFinite(r)?e.options.terrainOffset??0:0;e.root.position[1]=e._terrainBaseY+(r??0)+o}var Je={};function lf(e){let t=e.getContainer();if(t.querySelector(".leaflet-webgpu-warning"))return;let r=document.createElement("div");r.className="leaflet-webgpu-warning",r.setAttribute("role","alert"),r.style.cssText="position:absolute;z-index:1000;top:50%;left:50%;transform:translate(-50%,-50%);max-width:calc(100% - 32px);box-sizing:border-box;padding:12px 16px;border:1px solid #c98b24;border-radius:6px;background:#fff8e6;box-shadow:0 3px 12px #0005;color:#30251d;font:14px/1.5 sans-serif;text-align:center;pointer-events:auto",r.append("WebGPU is not available in this browser or device. ");let o=document.createElement("a");o.href="https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API#browser_compatibility",o.target="_blank",o.rel="noopener noreferrer",o.textContent="Learn more",r.append(o),t.append(r)}function He(e,t,r){throw lf(r),t._rendererReady.reject(e),F.renderers.delete(r),e}async function pf(e,t){let r;try{r=await navigator.gpu.requestAdapter()}catch(o){He(o,e,t)}return r||He(new Error("Unable to acquire a WebGPU adapter"),e,t),r}async function uf(e,t,r){try{return await e.requestDevice()}catch(o){He(o,t,r)}}function cf(e){let t=Je.rendererDevices.get(e.currentTarget),r=F.renderers.get(t);if(r?.renderer?.device!==e.currentTarget)return;let o;for(o of r._layers||[])o.fire("error",{error:e.error})}function df([e,t]){let r=Je.rendererDevices.get(t),o=F.renderers.get(r);if(!o||o.renderer?.device!==t)return;let i=new Error(`WebGPU device lost: ${e.message||e.reason}`),n;for(n of o._layers)n.fire("error",{error:i})}function hf(e,t,r){let o,i,n,a,s,f,m,l;if(r.geometry&&r.geometry.device!==t.renderer.device){let p=r.geometry,u=r.program._layerMaterial,d={};for(o of["position","normal","color","uv","index","instanceOffset"])i=p.attributes[o],i&&({data:n,size:a,count:s,normalized:f}=i,d[o]={data:n.slice(0,s*a),size:a,normalized:f});let c=t.renderer.device;d.index?.data instanceof Uint8Array&&(d.index.data=Uint16Array.from(d.index.data));for([o,i]of Object.entries(d))i.size||=1,i.count=i.data.length/i.size,i.indexFormat=i.data instanceof Uint32Array?"uint32":"uint16",i.buffer=c.createBuffer({size:Math.max(4,i.data.byteLength),usage:o==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),c.queue.writeBuffer(i.buffer,0,i.data);r.geometry={device:c,attributes:d,drawRange:{start:0,count:d.index?.count||d.position.count}};for(i of Object.values(p.attributes))i.buffer.destroy();r.bindGroup=null,r.boundTextures=[];for(m of["baseTexture","metalTexture","emissiveTexture","occlusionTexture"])l=u[m],!(!l||l.device===c)&&(u[m]={...l,device:c,texture:c.createTexture({size:[l.image.width,l.image.height],format:l.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:c.createSampler(l.samplerOptions),uploaded:null});r.program.pipelineCache.clear(),r.program=se(e,u),r.device=c}r.texture&&r.texture.device!==t.renderer.device&&(r.texture={...r.texture,device:t.renderer.device,texture:t.renderer.device.createTexture({size:[r.texture.image.width,r.texture.image.height],format:r.texture.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:t.renderer.device.createSampler(r.texture.samplerOptions),uploaded:null})}Je.rendererDevices=new WeakMap;async function wt(e,t){let r=F.renderers.get(t);if(r?._rendererReady&&await r._rendererReady.promise,!r){r=e,e._rendererReady=Promise.withResolvers(),e._rendererReady.promise.catch(me),F.renderers.set(t,r);let m=document.createElement("canvas");navigator.gpu||He(new Error("Layer3D requires WebGPU"),e,t);let l=await pf(e,t),p=await uf(l,e,t);Je.rendererDevices.set(p,t),p.addEventListener("uncapturederror",cf),Promise.all([p.lost,Promise.resolve(p)]).then(df);let u=m.getContext("webgpu");u||(p.destroy(),He(new Error("Unable to create a WebGPU canvas context"),e,t));let d=navigator.gpu.getPreferredCanvasFormat();u.configure({device:p,format:d,alphaMode:"premultiplied"}),t.getContainer().querySelector(".leaflet-webgpu-warning")?.remove(),e._shared=e,e._layers=new Set,e._sceneOrigin=e.location,e.scene=J(),e.camera={position:[0,0,0],up:[0,1,0],target:[0,0,0],viewMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],projectionMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],projectionViewMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],fov:45,aspect:1,near:.1,far:1e4},e.renderer={device:p,context:u,format:d,canvas:m,dpr:Math.min(window.devicePixelRatio,2)};let c=p.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"comparison"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}}]}),h=e.renderer.device.createBuffer({size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),g=e.renderer.device.createSampler({compare:"less-equal",minFilter:"linear",magFilter:"linear"}),y=e.renderer.device.createBuffer({size:32,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});e.renderer.sunlight={layout:c,buffer:h,sampler:g,lights:y,size:0};let x=new Float32Array(20);x.set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e.renderer.device.queue.writeBuffer(h,0,x),er(e,1);let v=document.createElement("canvas");v.width=1,v.height=1,e.renderer.roofFallbackTexture={device:p,texture:p.createTexture({size:[1,1],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:p.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),image:v,format:"rgba8unorm",srgb:!1,uploaded:null},r._size=null,m.className="leaflet-3d",m.style.cssText="position:absolute;top:0;left:0;pointer-events:none",m.setAttribute("role","img"),m.setAttribute("aria-label",e.options.ariaLabel??"3D scene");let w=t.getPane("webgpuPane");w||(w=t.createPane("webgpuPane",t.getContainer()),w.style.zIndex=1,w.style.pointerEvents="none"),w.append(m),t.on("move zoom rotate pitch resize viewreset layeradd layerremove",Ft,r),t.on("zoomstart",Zt,r),t.on("zoomanim",jt,r),t.on("zoomend",Ot,r),e._rendererReady.resolve(),delete r._rendererReady,Oe(r),F.renderers.set(t,r)}let o=t.options.crs.project(r._sceneOrigin),i=t.options.crs.project(e.location),n=Math.cos(r._sceneOrigin.lat*Math.PI/180);e._terrainBaseY??=e.root.position[1],e.root.position[0]=(i.x-o.x)*n,e.root.position[1]=e._terrainBaseY,e.root.position[2]=-(i.y-o.y)*n,Mt(e),e.root.scale.fill(n/Math.cos(e.location.lat*Math.PI/180)),e._shared=r,e.renderer=r.renderer,e.scene=r.scene,e.camera=r.camera,r._layers.add(e),j(e.root,r.scene);let a=[e.root],s,f;for(;a.length;)for(s=a.pop(),hf(e,r,s),f=s.children.length-1;f>=0;f--)a.push(s.children[f]);B(r),(e.header&&e._type!=="pmtiles"||e._geojson)&&qe(e)}function qr(e,t){if(!e.root||!e.camera)return null;let r,o,i,n,a,s,f;for(r of ar(e,t,e.root.children,!!e.model)){if(e.model){for(o=r.object;o&&o!==e.model;)o=o.parent;if(o===e.model)return{id:e.model.id,properties:e.model.extras,model:e.model,mesh:r.object,point:r.point}}if(i=r.object.extras?.featureFaces,!!i)for(n=0,a=i.length-1;n<=a;)if(s=n+a>>1,f=i[s],r.faceIndex<f.faceStart)a=s-1;else if(r.faceIndex>=f.faceEnd)n=s+1;else return{...f,mesh:r.object,point:r.point}}return null}function gf(e,t){let r=qr(e,t);e.hoveredFeature=r,Me(e,r),we(e,r,t),e.fire("featureclick",{feature:r,originalEvent:t})}function Hr(e){e.hoveredFeature=null,Me(e,null),we(e,null),e.fire("featurehover",{feature:null})}function yf(e,t){e.hoveredFeature=qr(e,t),Me(e,e.hoveredFeature),we(e,e.hoveredFeature,t),e.fire("featurehover",{feature:e.hoveredFeature,originalEvent:t})}function vf(e){yf(this,e)}function Mf(e){gf(this,e)}function wf(){Hr(this)}async function _f(e,t){try{await wt(e,t),e._added.resolve()}catch(r){e.fire("error",{error:r})}}function Wr(e,t){if(!e.location){let r=t.getCenter();e.location=new L.LatLng(r.lat,r.lng)}(e.url||e._geojson||e.options.tooltip||e.modelUrl)&&(e.container=t.getContainer(),e._pointerEvents||={mousemove:vf,click:Mf,mouseleave:wf},e.options.tooltip&&(e._tooltip=L.DomUtil.create("div","leaflet-3d-tooltip",e.container),e._tooltip.hidden=!0,e._tooltip.setAttribute("role","tooltip"),e._tooltip.setAttribute("aria-live","polite"),e._tooltip.style.cssText="position:absolute;z-index:600;max-width:220px;padding:10px 12px;border:1px solid #6b5140;border-radius:6px;background:#fffaf0;box-shadow:0 3px 12px #0005;color:#30251d;font:13px/1.45 sans-serif;pointer-events:none"),L.DomEvent.on(e.container,e._pointerEvents,e)),e.root&&_f(e,t)}async function Pf(e,t){try{await e.device.queue.onSubmittedWorkDone(),e.depthTexture?.destroy(),e.roofFallbackTexture?.texture?.destroy(),e.uniformBuffer?.destroy(),e.sunlight?.texture?.destroy(),e.sunlight?.buffer?.destroy(),e.sunlight?.lights?.destroy()}catch(r){t.fire("error",{error:r})}e.device.destroy()}function _t(e,t){e._added=Promise.withResolvers(),e.container&&(Hr(e),L.DomEvent.off(e.container,e._pointerEvents,e),e.container=null);let r,o,i,n;for(r of e._areas.values())Ve(e,r);e._areas.clear(),e._tooltip?.remove(),e._tooltip=null,(e.url||e._geojson)&&Fr(e,!1);let a=e._shared;if(a){if(j(e.root,null),a._layers.delete(e),a===e)if(t.off("move zoom rotate pitch resize viewreset layeradd layerremove",Ft,e),t.off("zoomstart",Zt,e),t.off("zoomanim",jt,e),t.off("zoomend",Ot,e),tr(e),e._layers.size){let s=e._layers.values().next().value;for(o of["_layers","_sceneOrigin","_size","_zoomLevel","_zoomTransitions","_zoomView","_cursor","_roofRaster"])s[o]=e[o],delete e[o];for(i of s._layers)i._shared=s;F.renderers.set(t,s),t.on("move zoom rotate pitch resize viewreset layeradd layerremove",Ft,s),t.on("zoomstart",Zt,s),t.on("zoomanim",jt,s),t.on("zoomend",Ot,s),B(s)}else{e._roofRaster&&O(e,e._roofRaster.texture.texture),e._roofRaster=null;for(n of e._zoomTransitions?.keys()||[])n.play();e._zoomTransitions=null,e._zoomView=null,delete t._cameraView,t.getContainer().classList.remove("leaflet-camera-zoom");let s=e.renderer;s.canvas.remove(),Pf(s,e),F.renderers.delete(t);for(o of["_layers","_sceneOrigin","_size","_zoomLevel","_cursor"])delete e[o]}else B(a);e._shared=e.renderer=e.scene=e.camera=null}}function Tf(e){if(!e._map)return;let t;for(t of e._areas.values())Ve(e,t);e._areas.clear(),qe(e)}function Lf(e){if(!e)return!1;let t,r;for(t of e)for(r of t.primitives)if(r.targets||r.mode!==void 0&&r.mode!==4)return!0;return!1}function Sf(e){let t=new DataView(e),r=new TextDecoder,o,i,n,a,s;if(t.getUint32(0,!0)===1179937895){if(t.getUint32(4,!0)!==2||t.getUint32(8,!0)!==e.byteLength)throw new Error("Invalid GLB header");let f;for(i=12;i<e.byteLength;){if(i+8>e.byteLength)throw new Error("Truncated GLB chunk");if(n=t.getUint32(i,!0),a=t.getUint32(i+4,!0),i+=8,i+n>e.byteLength)throw new Error("Truncated GLB data");s=e.slice(i,i+n),a===1313821514&&(o=JSON.parse(r.decode(s))),a===5130562&&(f=s),i+=n}if(!o)throw new Error("Missing GLB JSON");f&&(o.buffers[0].binary=f)}else o=JSON.parse(r.decode(e));if(o.skins?.length||o.animations?.length||o.extensionsRequired?.length||Lf(o.meshes))throw new Error("Layer3D supports static triangle glTF models without required extensions");return o}function Yr(e,t){let r=new Float32Array(e.length),o,i,n,a,s,f,m,l,p,u;for(o=0;o<(t?.length||e.length/3);o+=3){for(i=t?t[o]:o,n=t?t[o+1]:o+1,a=t?t[o+2]:o+2,s=[],f=[],m=0;m<3;m++)s.push(e[n*3+m]-e[i*3+m]),f.push(e[a*3+m]-e[i*3+m]);l=[s[1]*f[2]-s[2]*f[1],s[2]*f[0]-s[0]*f[2],s[0]*f[1]-s[1]*f[0]];for(p of[i,n,a])for(m=0;m<3;m++)r[p*3+m]+=l[m]}for(o=0;o<r.length;o+=3)for(u=Math.hypot(...r.subarray(o,o+3))||1,m=0;m<3;m++)r[o+m]/=u;return r}function mi(e,t){e.geometry?.attributes.position&&t.push(e);let r;for(r of e.children)mi(r,t)}function Pt(e,t){if(!e.model)return;let r=[];mi(e.model,r);let o,i,n,a,s,f,m,l,p,u,d,c,h,g,y,x,v,w,P,M;if(!t?._terrainReady||!e.options.terrainConform){for(o of r)i=o.geometry._terrainBasePositions,i&&(n=o.geometry,a=n.attributes.position,a.data.set(i),o.device.queue.writeBuffer(a.buffer,0,i),s=n._terrainBaseNormals,s&&(n.attributes.normal.data.set(s),o.device.queue.writeBuffer(n.attributes.normal.buffer,0,s)),oe(n));return}ae(e.root);let S=e._map,z=S.options.crs,T=z.project(e._shared._sceneOrigin),E=Math.cos(e._shared._sceneOrigin.lat*Math.PI/180),b=z.scale(t._terrainZoom);for(o of r){for(n=o.geometry,f=n.attributes.position,n._terrainBasePositions||=f.data.slice(),m=n.attributes.normal,n._terrainBaseNormals||=m.data.slice(),f.data.set(n._terrainBasePositions),l=o.worldMatrix,p=new DOMMatrix(l).inverse().toFloat64Array(),u=0;u<f.data.length;u+=3)d=f.data[u],c=f.data[u+1],h=f.data[u+2],g=l[1]*d+l[5]*c+l[9]*h+l[13],y=Math.max(0,Math.min(1,1-(g-e.root.position[1])/8)),y&&(x=l[0]*d+l[4]*c+l[8]*h+l[12],v=l[2]*d+l[6]*c+l[10]*h+l[14],w=z.transformation.transform(new L.Point(T.x+x/E,T.y-v/E),b),P=Y(t,w),Number.isFinite(P)&&(M=(P-g)*y,f.data[u]+=p[4]*M,f.data[u+1]+=p[5]*M,f.data[u+2]+=p[6]*M));o.device.queue.writeBuffer(f.buffer,0,f.data),m.data.set(Yr(f.data,n.attributes.index?.data)),o.device.queue.writeBuffer(m.buffer,0,m.data),oe(n)}B(e)}async function bf(e,t){if(e.binary)return;let r=await fetch(new URL(e.uri,t).href);if(!r.ok)throw new Error(`Unable to load model buffer: HTTP ${r.status}`);e.binary=await r.arrayBuffer()}async function Cf(e,t,r){let o;if(r.bufferView!==void 0){let i=e.bufferViews[r.bufferView],n=e.buffers[i.buffer].binary;o=new Blob([n.slice(i.byteOffset||0,(i.byteOffset||0)+i.byteLength)],{type:r.mimeType})}else{let i=await fetch(new URL(r.uri,t).href);if(!i.ok)throw new Error(`Unable to load model texture: HTTP ${i.status}`);o=await i.blob()}return createImageBitmap(o,{premultiplyAlpha:"none",colorSpaceConversion:"none"})}function Ef(e){return{addressModeU:e.wrapS===33071?"clamp-to-edge":e.wrapS===33648?"mirror-repeat":"repeat",addressModeV:e.wrapT===33071?"clamp-to-edge":e.wrapT===33648?"mirror-repeat":"repeat",magFilter:e.magFilter===9728?"nearest":"linear",minFilter:e.minFilter===9728||e.minFilter===9984||e.minFilter===9986?"nearest":"linear"}}function Ht(e,t,r=!1){let{backend:o,description:i,images:n,textures:a}=e;if(!t)return null;if((t.texCoord||0)!==0||t.extensions)throw new Error("Model textures currently require untransformed TEXCOORD_0 UVs");let s=o.renderer.device,f=`${t.index}:${r}`;if(!a.has(f)){let m=i.textures[t.index],l=i.samplers?.[m.sampler]||{},p=n[m.source],u=r?"rgba8unorm-srgb":"rgba8unorm",d=Ef(l);a.set(f,{device:s,texture:s.createTexture({size:[p.width,p.height],format:u,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:s.createSampler(d),samplerOptions:d,format:u,srgb:r,image:p,flipY:!1,uploaded:null})}return a.get(f)}function Bf(e,t){let{backend:r}=e,o=t.pbrMetallicRoughness||{};return{color:(o.baseColorFactor||[1,1,1,1]).slice(0,3),opacity:o.baseColorFactor?.[3]??1,metallic:o.metallicFactor??1,roughness:o.roughnessFactor??1,baseTexture:Ht(e,o.baseColorTexture,!0),metalTexture:Ht(e,o.metallicRoughnessTexture),emissiveTexture:Ht(e,t.emissiveTexture,!0),occlusionTexture:Ht(e,t.occlusionTexture),emissive:t.emissiveFactor||[0,0,0],occlusionStrength:t.occlusionTexture?.strength??1,alphaMode:r.options.alphaMode||t.alphaMode||"OPAQUE",alphaCutoff:t.alphaCutoff??.5,doubleSided:t.doubleSided}}function Af(e){if(e.matrix)return Array.from(e.matrix);let[t,r,o,i]=e.rotation||[0,0,0,1],[n,a,s]=e.scale||[1,1,1];return[(1-2*(r*r+o*o))*n,2*(t*r+o*i)*n,2*(t*o-r*i)*n,0,2*(t*r-o*i)*a,(1-2*(t*t+o*o))*a,2*(r*o+t*i)*a,0,2*(t*o+r*i)*s,2*(r*o-t*i)*s,(1-2*(t*t+r*r))*s,0,...e.translation||[0,0,0],1]}var li={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array};var zf={SCALAR:1,VEC2:2,VEC3:3,VEC4:4};function pi(e,t,r,o,i,n,a,s,f,m){let l=e.bufferViews[a],p=t.BYTES_PER_ELEMENT,u=e.buffers[l.buffer].binary;if(m||=r*p,!u||m<r*p||s<0||(l.byteOffset||0)+l.byteLength>u.byteLength||(f-1)*m+r*p+s>l.byteLength)throw new Error("glTF accessor outside buffer view");let d,c,h;for(d=0;d<f;d++){if(c=new t(u.slice((l.byteOffset||0)+s+d*m,(l.byteOffset||0)+s+d*m+r*p)),h=n?n[d]:d,n&&h>=i)throw new Error("Invalid sparse glTF index");o.set(c,h*r)}}function ui(e,t){let r=e.accessors[t],o=li[r.componentType],i=zf[r.type];if(!o||!i||!Number.isInteger(r.count)||r.count<0)throw new Error("Invalid glTF accessor");let n=new o(r.count*i);if(r.bufferView!==void 0&&pi(e,o,i,n,r.count,null,r.bufferView,r.byteOffset||0,r.count,e.bufferViews[r.bufferView].byteStride),r.sparse){let f=r.sparse,m=li[f.indices.componentType];if(![Uint8Array,Uint16Array,Uint32Array].includes(m))throw new Error("Invalid sparse glTF indices");let l=e.bufferViews[f.indices.bufferView],p=(l.byteOffset||0)+(f.indices.byteOffset||0);if(f.count>r.count||(f.indices.byteOffset||0)+f.count*m.BYTES_PER_ELEMENT>l.byteLength)throw new Error("Invalid sparse glTF indices");let u=new m(e.buffers[l.buffer].binary.slice(p,p+f.count*m.BYTES_PER_ELEMENT));pi(e,o,i,n,r.count,u,f.values.bufferView,f.values.byteOffset||0,f.count,0)}if(r.componentType===5126)return{data:n,size:i};let a=new Float32Array(n.length),s;for(s=0;s<n.length;s++)a[s]=r.normalized?Math.max(-1,n[s]/(o===Int8Array?127:o===Int16Array?32767:o===Uint8Array?255:o===Uint32Array?4294967295:65535)):n[s];return{data:a,size:i,indices:n}}function ci(e,t){let{backend:r,description:o,materials:i,active:n,resources:a}=e;if(n.has(t))throw new Error("Cyclic glTF nodes");let s=o.nodes[t];if(!s)throw new Error("Invalid glTF node");n.add(t);let f={...J(),name:s.name};f.matrix=Af(s);let m,l,p,u,d,c,h,g,y,x,v,w,P,M,S;if(s.mesh!==void 0)for(m of o.meshes[s.mesh].primitives){l={};for([p,u]of[["POSITION","position"],["NORMAL","normal"],["TEXCOORD_0","uv"]])m.attributes[p]!==void 0&&(l[u]=ui(o,m.attributes[p]));if(!l.position)throw new Error("glTF mesh has no positions");if(d=l.position.data.length/3,l.position.size!==3||d<3)throw new Error("Invalid glTF vertex attributes");for(c of Object.values(l))if(c.data.length/c.size!==d)throw new Error("Invalid glTF vertex attributes");if(m.indices!==void 0){if(h=ui(o,m.indices),l.index={size:1,data:h.indices},!(h.indices instanceof Uint8Array||h.indices instanceof Uint16Array||h.indices instanceof Uint32Array)||h.size!==1||h.indices.length%3)throw new Error("Invalid glTF triangle indices");for(g of h.indices)if(g>=d)throw new Error("Invalid glTF triangle indices")}if(!l.index&&d%3)throw new Error("Incomplete glTF triangle");if(l.normal||(y=Yr(l.position.data,l.index?.data),l.normal={size:3,data:y}),x=i[m.material]||{color:[1,1,1],metallic:1},(x.baseTexture||x.metalTexture||x.emissiveTexture||x.occlusionTexture)&&!l.uv)throw new Error("Textured model mesh requires UV coordinates");v=se(r,x),a.push(v),w=r.renderer.device,l.index?.data instanceof Uint8Array&&(l.index.data=Uint16Array.from(l.index.data));for([u,c]of Object.entries(l))c.size||=1,c.count=c.data.length/c.size,c.indexFormat=c.data instanceof Uint32Array?"uint32":"uint16",c.buffer=w.createBuffer({size:Math.max(4,c.data.byteLength),usage:u==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),w.queue.writeBuffer(c.buffer,0,c.data);P={device:w,attributes:l,drawRange:{start:0,count:l.index?.count||l.position.count}},a.push(P),M={...J(),device:w,geometry:P,program:v,fadeDuration:250,id:F.nextId++,renderOrder:0},M.name=o.meshes[s.mesh].name,M.extras=s.extras||{},j(M,f)}for(S of s.children||[])j(ci(e,S),f);return n.delete(t),f}async function If(e){await e._added.promise;let t=new URL(e.modelUrl,document.baseURI).href,r=await fetch(t);if(!r.ok)throw new Error(`Unable to load model: HTTP ${r.status}`);let o=await r.arrayBuffer(),i=Sf(o),n=new URL(".",t).href,a=[],s,f,m,l,p,u,d;for(s of i.buffers||[])a.push(bf(s,n));await Promise.all(a),await e._added.promise;let c=[];for(f of i.images||[])c.push(Cf(i,n,f));let h=await Promise.all(c);await e._map?._terrain3D?._terrainPromise;let g={backend:e,description:i,images:h,textures:new Map,materials:[],active:new Set,resources:[]};for(m of i.materials||[])g.materials.push(Bf(g,m));let y=i.scenes?.[i.scene||0];if(!y)throw new Error("Missing glTF scene");let x=[];try{for(l of y.nodes)x.push(ci(g,l))}catch(w){for(p of g.resources)if(p.attributes)for(u of Object.values(p.attributes))u.buffer.destroy();else p.pipelineCache.clear();throw w}let v={...J(),id:t,extras:i.extras||{}};if(!x.length)throw new Error("Expected a glTF model with a non-empty scene");for(d of x)j(d,v);if(e.model=v,e.options.rotation){let[w,P=w,M=w]=e.options.rotation;e.model.rotation[0]=w,e.model.rotation[1]=P,e.model.rotation[2]=M}if(e.options.scale){let[w,P=w,M=w]=e.options.scale;e.model.scale[0]=w,e.model.scale[1]=P,e.model.scale[2]=M}j(e.model,e.root),Pt(e,e._map?._terrain3D)}function Df(e){let t={};return e.url&&(t.moveend=t.zoomend=t.rotate=t.pitch=t.resize=qe.bind(null,e)),(e._geojson||e.url)&&(t.terrainchange=Tf.bind(null,e)),t}async function Rf(e){try{e.root=J(),e.raycaster={origin:[0,0,0],direction:[0,0,0]},(e.url||e._geojson)&&(e.group=e.root,e.url&&(e.header=await vt(e))),e._map&&(await wt(e,e._map),e._added.resolve()),e.modelUrl&&await If(e),e._shared&&B(e),e.fire("ready")}catch(t){e.fire("error",{error:t})}}function _e(e,t={}){e._3d=!0,L.Util.setOptions(e,{ariaLabel:"3D scene",...t}),e.onAdd=Wr.bind(null,e),e.onRemove=_t.bind(null,e),e.getEvents=Df.bind(null,e);let r=!e._geojson&&/\.(glb|gltf)(?:[?#]|$)/i.test(e.options.url);e.modelUrl=r?e.options.url:null,e.url=e.options.url&&!r&&!e._geojson?new URL(e.options.url,document.baseURI).href:null,e._directories=new Map,e.options.center&&(e.location=new L.LatLng(e.options.center[0],e.options.center[1])),e._areas=new Map,e._inflight=0,e._added=Promise.withResolvers(),queueMicrotask(Rf.bind(null,e))}function Uf(e){return e._loadingTiles>0}function Of(e,t){return e.tile.coords.z-t.tile.coords.z||e.distance-t.distance}function Gf(e,t){let r=t.max.x-t.min.x+1,o=t.max.y-t.min.y+1,i=new Float32Array(r*o*65536).fill(-1e9),n=1/0,a=-1/0,s,f,m,l,p,u,d,c,h;for([s,f]of e)for(m=s.split("/"),l=Number(m[0]),p=Number(m[1]),u=(p-t.min.y)*256*r*256+(l-t.min.x)*256,d=0;d<256;d++)for(c=0;c<256;c++)h=f[d*256+c],!(!Number.isFinite(h)||h<=-1e3)&&(i[u+d*r*256+c]=h,n=Math.min(n,h),a=Math.max(a,h));return{elevations:i,low:n,high:a}}function Ff(e){let t=[],r=[],o=[],i=[],n,a,s,f,m,l;for(n=0;n<=e;n++)for(a=0;a<=e;a++)t.push(a/e,0,n/e),r.push(0,1,0),o.push(a/e,n/e),n<e&&a<e&&(s=n*(e+1)+a,f=s+1,m=s+e+1,l=m+1,i.push(s,m,f,f,m,l));return{position:{size:3,data:new Float32Array(t)},normal:{size:3,data:new Float32Array(r)},uv:{size:2,data:new Float32Array(o)},index:{data:new Uint16Array(i)}}}async function Nf(e,t,r,o){if(!await e._terrainPromise||!e._map||e._map._terrain3D!==e||t._terrain3D!==e||o.request.signal.aborted||!t._rasterTiles.has(`${r.z}/${r.x}/${r.y}`)||e._rasterTiles.has(o))return;let n=Math.max(1,Math.min(64,256/2**(r.z-e._terrainZoom))),a=e._map,s=a.options.crs,f=s.project(e.location),m=Math.cos(e.location.lat*Math.PI/180),l=s.scale(r.z),p=2**(e._terrainZoom-r.z),u=s.transformation.untransform(new L.Point(r.x*256,r.y*256),l),d=s.transformation.untransform(new L.Point((r.x+1)*256,(r.y+1)*256),l),c=e.renderer.device,h=o.texture;if(!e._rasterProgram||e._rasterProgram.device!==c){let E=e._terrainBounds,b=E.max.x-E.min.x+1,R=E.max.y-E.min.y+1,{elevations:D,low:U,high:G}=Gf(e._terrainTiles,E);e._dem&&O(e,e._dem.texture),e._dem={texture:c.createTexture({size:[b*256,R*256],format:"r32float",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),low:Number.isFinite(U)?U:e._terrainOriginElevation,high:Number.isFinite(G)?G:e._terrainOriginElevation},c.queue.writeTexture({texture:e._dem.texture},D,{bytesPerRow:b*1024},[b*256,R*256]),e._terrainGrids=new Map,e._rasterProgram=se(e,{baseTexture:h,unlit:!0,terrain:e._dem,alphaMode:"BLEND",depthWrite:!0})}let g=e._terrainGrids.get(n),y,x;if(!g){g=Ff(n);for([y,x]of Object.entries(g))x.size||=1,x.count=x.data.length/x.size,x.indexFormat="uint16",x.buffer=c.createBuffer({size:Math.max(4,x.data.byteLength),usage:y==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),c.queue.writeBuffer(x.buffer,0,x.data);e._terrainGrids.set(n,g)}let v=e._terrainOriginElevation,w=Math.min(e._dem.low,v)-v,P=Math.max(e._dem.high,v)-v,M=(d.x-u.x)*m,S=-(d.y-u.y)*m,z={device:c,attributes:g,drawRange:{start:0,count:g.index.count},bounds:{min:[0,w,0],max:[1,P,1],center:[.5,(w+P)/2,.5],radius:Math.hypot(M,P-w,S)/2/Math.max(M,1,S)}},T={position:[(u.x-f.x)*m,0,-(u.y-f.y)*m],rotation:[0,0,0],scale:[M,1,S],worldMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],children:[],visible:!0,device:c,geometry:z,program:e._rasterProgram,texture:h,terrain:[r.x*256*p-e._terrainBounds.min.x*256,r.y*256*p-e._terrainBounds.min.y*256,256*p,v],tile:o,opacity:t.options.opacity??1,id:F.nextId++,renderOrder:t.options.zIndex||0,fadeDuration:250,fadeStart:o.loadedAt,ground:!0};o.mesh.visible=!1,j(T,e.root),B(e),e._rasterTiles.set(o,T)}async function Xr(e,t,r){if(e._terrain3D&&r.done&&!r.request.signal.aborted&&e._rasterTiles.get(`${t.z}/${t.x}/${t.y}`)===r)try{await Nf(e._terrain3D,e,t,r)}catch(o){e.fire("tileerror",{tile:r,coords:t,error:o})}}function jf(e){let t={position:{size:3,data:new Float32Array([0,0,0,1,0,0,0,0,1,1,0,1])},normal:{size:3,data:new Float32Array([0,1,0,0,1,0,0,1,0,0,1,0])},uv:{size:2,data:new Float32Array([0,0,1,0,0,1,1,1])},index:{data:new Uint16Array([0,2,1,1,2,3])}},r,o;for([r,o]of Object.entries(t))o.count=o.data.length/(o.size||1),o.indexFormat="uint16",o.buffer=e.createBuffer({size:o.data.byteLength,usage:r==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),e.queue.writeBuffer(o.buffer,0,o.data);return{device:e,attributes:t,drawRange:{start:0,count:t.index.count}}}function Zf(e,t){let r=e.renderer.device,o={device:r,texture:r.createTexture({size:[t.image.width,t.image.height],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:r.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",magFilter:"linear",minFilter:"linear"}),image:t.image,format:"rgba8unorm",srgb:!1,uploaded:null};e._rasterProgram||(e._rasterProgram=se(e,{baseTexture:o,unlit:!0,alphaMode:"BLEND"})),e._rasterGeometry||(e._rasterGeometry=jf(r));let{coords:i}=t,n=e._map.options.crs,a=n.project(e.location),s=Math.cos(e.location.lat*Math.PI/180),f=n.scale(i.z),m=n.transformation.untransform(new L.Point(i.x*256,i.y*256),f),l=n.transformation.untransform(new L.Point((i.x+1)*256,(i.y+1)*256),f),p=(l.x-m.x)*s,u=-(l.y-m.y)*s;t.texture=o,t.mesh={position:[(m.x-a.x)*s,0,-(m.y-a.y)*s],rotation:[0,0,0],scale:[p,1,u],worldMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],children:[],visible:!0,device:r,geometry:e._rasterGeometry,program:e._rasterProgram,texture:o,opacity:e.options.opacity,id:F.nextId++,renderOrder:e.options.zIndex||0,tile:t,fadeDuration:250,ground:!0},j(t.mesh,e.root)}async function $f(e,t){try{await e.ready;let r=await e.options.archive.getZxy(t.coords.z,t.coords.x,t.coords.y,t.request.signal);if(t.request.signal.aborted)return;if(!r)throw new Error(`Tile ${t.coords.z}/${t.coords.x}/${t.coords.y} is not in the offline archive`);try{t.image=await createImageBitmap(new Blob([r.data]))}catch{throw new Error(`Unable to decode tile ${t.coords.z}/${t.coords.x}/${t.coords.y}`)}if(t.request.signal.aborted){t.image.close(),t.image=null;return}Zf(e,t),t.loadedAt=performance.now(),t.done=!0,e._rasterVersion=(e._rasterVersion||0)+1,Xr(e,t.coords,t),e.fire("tileload",{tile:t,coords:t.coords}),B(e)}catch(r){if(t.request.signal.aborted)return;t.error=r.message,e._rasterVersion=(e._rasterVersion||0)+1,e.fire("tileerror",{tile:t,coords:t.coords,error:r}),e.fire("error",{error:r,coords:t.coords})}finally{e._loadingTiles--,e._map&&(Kr(e),nt(e),e._loadingTiles||e.fire("load"),B(e))}}function Vf(e,t){t.started=!0;let r=e._loadingTiles===0;return e._loadingTiles++,e.fire("tileloadstart",{tile:t,coords:t.coords}),r&&e.fire("loading"),$f(e,t)}function Kr(e){let t=e._map;if(!t)return;let r=t.project(t.getCenter(),0).divideBy(256),o=[],i,n;for(i of e._rasterTiles.values())i.started||i.request.signal.aborted||({coords:n}=i,o.push({tile:i,distance:Math.hypot((n.x+.5)/2**n.z-r.x,(n.y+.5)/2**n.z-r.y)}));o.sort(Of);for({tile:i}of o){if(e._loadingTiles>=4)break;Vf(e,i)}}function Qr(e){let t=e._map;if(!t||!e._shared||!e.header)return;let r=Math.max(e.header.minZoom??0,Math.min(Math.round(t.getZoom()),e.options.maxZoom,e.options.maxNativeZoom));e._tileZoom=r;let o=t.getBounds(),i=t.project(o.getNorthWest(),r).divideBy(256).floor(),n=t.project(o.getSouthEast(),r).divideBy(256).floor(),a=e.header.maxLat===void 0||e.header.minLon===void 0?new L.Point(0,0):t.project([e.header.maxLat,e.header.minLon],r).divideBy(256).floor(),s=e.header.minLat===void 0||e.header.maxLon===void 0?new L.Point(2**r-1,2**r-1):t.project([e.header.minLat,e.header.maxLon],r).divideBy(256).floor(),f=t.project(t.getCenter(),r).divideBy(256).floor(),m=new Map,l,p,u,d,c,h;for(l=Math.max(0,i.x,a.x,f.x-6);l<=Math.min(2**r-1,n.x,s.x,f.x+6);l++)for(p=Math.max(0,i.y,a.y,f.y-6);p<=Math.min(2**r-1,n.y,s.y,f.y+6);p++)m.set(`${r}/${l}/${p}`,{z:r,x:l,y:p});e._wantedRasterTiles=new Set(m.keys());let g=new Map,y=Math.max(e.header.minZoom??0,r-2),x=2**(r-y);if(y<r)for([u,d]of m)e._rasterTiles.get(u)?.done||(c={z:y,x:Math.floor(d.x/x),y:Math.floor(d.y/x)},g.set(`${c.z}/${c.x}/${c.y}`,c));let v=new Map([...g,...m]);for([u,h]of e._rasterTiles)!v.has(u)&&!h.done&&it(e,h);for([u,d]of v)e._rasterTiles.has(u)||(h={coords:d,request:new AbortController,done:!1},e._rasterTiles.set(u,h));Kr(e),nt(e)}function qf(e){let t=Qr.bind(null,e);return{moveend:t,zoomend:t,rotate:t,pitch:t,resize:t}}async function Hf(e,t){let r=await t.getHeader();return e.options.archive=t,e.header=r,e.options.maxNativeZoom===void 0&&(e.options.maxNativeZoom=r.maxZoom),e.options.maxZoom=Math.max(e.options.minZoom||0,e.options.maxZoom),e.fire("ready"),e}function Wf(e,t){throw e.fire("error",{error:t}),t}function Tt(e,t){if(e._terrain3D===t)return;let r;for(r of e._rasterTiles.values())e._terrain3D&&ot(e._terrain3D,r),r.mesh&&(r.mesh.visible=!0,j(r.mesh,e.root));if(e._terrain3D=t||null,t)for(r of e._rasterTiles.values())r.done&&Xr(e,r.coords,r)}async function Yf(e,t,r){try{await r,e._added.resolve(),Tt(e,t._terrain3D)}catch(o){e.fire("error",{error:o})}}async function Xf(e,t,r){try{await Promise.all([r,e.ready]),e._map===t&&t.hasLayer(e)&&Qr(e)}catch(o){e.fire("error",{error:o})}}function Kf(e,t){e.location||(e.location=t.getCenter());let r=wt(e,t);Yf(e,t,r),Xf(e,t,r)}function Jf(e){let t,r;for(t of e._rasterTiles.values())it(e,t);if(e._rasterProgram?.pipelineCache.clear(),e._rasterProgram=null,e._rasterGeometry){for(r of Object.values(e._rasterGeometry.attributes))O(e,r.buffer);e._rasterGeometry=null}}function Qf(e,t){Jf(e),e._terrain3D=null,_t(e,t)}function kf(e,t){let r,o;for(r of e._rasterTiles.values())r.mesh&&(r.mesh.opacity=t),o=e._terrain3D?._rasterTiles.get(r),o&&(o.opacity=t);B(e)}function em(e,t){return e.options.opacity=t,kf(e,t),e}function tm(e,t){let r,o;for(r of e._rasterTiles.values())r.mesh&&(r.mesh.renderOrder=t),o=e._terrain3D?._rasterTiles.get(r),o&&(o.renderOrder=t);B(e)}function rm(e,t){return e.options.zIndex=t,tm(e,t),e}function om(e,t){e._read=Ze.bind(null,e),e.getHeader=vt.bind(null,e),e.getZxy=jr.bind(null,e),e.getTileSize=rt,e.isLoading=Uf.bind(null,e),e.setOpacity=em.bind(null,e),e.setZIndex=rm.bind(null,e),e.onAdd=Kf.bind(null,e),e.onRemove=Qf.bind(null,e),e.getEvents=qf.bind(null,e),t={ariaLabel:"PMTiles raster",maxZoom:18,opacity:1,zIndex:0,...t},L.Util.setOptions(e,t),e.root=J(),e._areas=new Map,e._rasterTiles=new Map,e._loadingTiles=0,e._added=Promise.withResolvers(),e.url=new URL(t.url,document.baseURI).href,e._directories=new Map,e.ready=Promise.resolve(e.options.archive||e).then(Hf.bind(null,e)).catch(Wf.bind(null,e))}function im(e,t){e.options.data=t,delete e.options.url;let r;for(r of e._areas.values())Ve(e,r);return e._areas.clear(),qe(e),e}function nm(e){e._type==="pmtiles"&&Tt(e,null)}function am(e,t){e._terrainController?.abort(),e._terrainLoading=!1,e._terrainReady=!1,t.eachLayer(nm);let r,o,i,n;for(r of e._rasterTiles.keys())ot(e,r);t._terrain3D===e&&delete t._terrain3D;for(o of Object.values(t._layers))Pt(o,null),Mt(o);t.fire("terrainchange"),e._terrainTiles.clear(),e._terrainOriginElevation=0,e._terrainPromise=null,e._rasterProgram&&e._rasterProgram.pipelineCache.clear(),e._rasterProgram=null,e._dem&&O(e,e._dem.texture),e._dem=null;for(i of e._terrainGrids?.values()||[])for(n of Object.values(i))O(e,n.buffer);e._terrainGrids=null,e._bridges=null,k(e,e._bridgeMesh),e._bridgeMesh=null,_t(e,t)}function sm([e,t,r],o,i,n,a){let s=o.project(new L.LatLng(t,e));return[(s.x-i.x)*n,r-a,-(s.y-i.y)*n]}function kr(e,t,r,o,i){e.push(...o),t.push(...i),r.push(.6,.58,.54)}function Wt(e){return[e[0],e[1]-1.2,e[2]]}function fm(e,t){let r=e._map,o=r.options.crs,i=e._terrainZoom,n=o.project(e.location),a=Math.cos(e.location.lat*Math.PI/180),s=e.root.position[1],f=[],m=[],l=[];e._bridges=new Map;let p,u,d,c,h,g,y,x,v,w,P,M,S,z,T,E,b,R,D,U,G,$,H,V,ee,he,Ie,ge,De,X,xe,te,le,pe,Te,ne,Re,ye,Ue;for({geometry:p}of t.features){u=p.type==="Polygon"?[p.coordinates]:p.type==="MultiPolygon"?p.coordinates:[];for(d of u){c=[];for(h of d)g=h.slice(0,-1),g.length>=3&&c.push(g);if(c.length){y=[],x=[];for(h of c)for([v,w,P]of h)M=r.project([w,v],i),y.push([M.x,M.y,P]);for(h of c)for(S of h)x.push(sm(S,o,n,a,s));z=void 0;try{T=[],E=0;for(h of c){for(g=[],b=0;b<h.length;b++)g.push({x:y[E+b][0],y:y[E+b][1]});T.push(g),E+=h.length}[R,...D]=T,z=st(R,D)}catch{continue}U=[],G=[],$=[];for(H of z){V=[];for(b of H)V.push(y[b]);U.push(V)}for(M of y)G.push(M[0]),$.push(M[1]);for(ee={triangles:U,min:[Math.min(...G),Math.min(...$)],max:[Math.max(...G),Math.max(...$)]},he=Math.floor(ee.min[0]/64);he<=Math.floor(ee.max[0]/64);he++)for(Ie=Math.floor(ee.min[1]/64);Ie<=Math.floor(ee.max[1]/64);Ie++)ge=`${he}/${Ie}`,e._bridges.set(ge,[...e._bridges.get(ge)||[],ee]);for([De,X,xe]of z){[te,le,pe]=[x[De],x[X],x[xe]],(le[2]-te[2])*(pe[0]-te[0])-(le[0]-te[0])*(pe[2]-te[2])<0&&([X,xe]=[xe,X]);for(b of[De,X,xe])kr(f,m,l,x[b],[0,1,0]);for(b of[De,xe,X])kr(f,m,l,Wt(x[b]),[0,-1,0])}Te=0;for(h of c){for(b=0;b<h.length;b++){M=x[Te+b],ne=x[Te+(b+1)%h.length],Re=Math.hypot(ne[0]-M[0],ne[2]-M[2])||1,ye=[(ne[2]-M[2])/Re,0,-(ne[0]-M[0])/Re];for(Ue of[M,ne,Wt(ne),M,Wt(ne),Wt(M)])kr(f,m,l,Ue,ye)}Te+=h.length}}}}f.length&&(e._bridgeMesh=Ge(e,{position:f,normal:m,color:l}))}async function mm(e){let{backend:t,archive:r,controller:o,tiles:i}=e,n,a;for(;e.next<i.length;){if(o.signal.throwIfAborted(),n=i[e.next++],a=await r.getZxy(n.z,n.x,n.y,o.signal),!a||a.data.byteLength!==256*256*4)throw new Error(`Missing or invalid Float32 terrain tile ${n.z}/${n.x}/${n.y}`);t._terrainTiles.set(`${n.x}/${n.y}`,new Float32Array(a.data))}}function lm(e){if(!e.ok)throw new Error(`Bridges: HTTP ${e.status}`);return e.json()}async function eo(e){if(e._terrainLoading||!e._map)return;e._terrainLoading=!0,e._terrainReady=!1;let t=e._terrainController=new AbortController,r,o,i,n;try{if(!e.terrainSource)throw new Error("Terrain layer requires a PMTiles elevation archive");let a=e._terrainArchive=new L.Layer({source:{type:"pmtiles",url:e.terrainSource}});await a.ready;let s=a.header;if(s.tileType!==0||s.minZoom!==s.maxZoom)throw new Error("Expected a single-zoom Float32 PMTiles terrain archive");e._terrainZoom=s.maxZoom;let f=e._map,m=f.project([s.maxLat,s.minLon],e._terrainZoom).divideBy(256).floor(),l=f.project([s.minLat,s.maxLon],e._terrainZoom).divideBy(256).floor();e._terrainBounds=new L.Bounds(m,l);let p=[],u=f.project(f.getCenter(),e._terrainZoom).divideBy(256);for(r=m.x;r<=l.x;r++)for(o=m.y;o<=l.y;o++)p.push({z:e._terrainZoom,x:r,y:o,distance:Math.hypot(r+.5-u.x,o+.5-u.y)});p.sort(Zr);let d={backend:e,archive:a,controller:t,tiles:p,next:0},c=[];for(i=0;i<Math.min(4,p.length);i++)c.push(mm(d));await Promise.all(c);let h=e.options.bridges&&await fetch(e.options.bridges,{signal:t.signal}).then(lm);if(t.signal.aborted||e._map!==f)return;e._terrainReady=!0,e._terrainOriginElevation=Y(e,e.location)??0;for(n of Object.values(f._layers))Mt(n),Pt(n,e);return h&&fm(e,h),f.fire("terrainchange"),B(e),e.fire("terrainready"),!0}catch(a){return t.signal.aborted||e.fire("error",{error:a}),!1}finally{e._terrainLoading=!1}}function pm(){eo(this.backend).then(this.resolve,this.reject)}function um(e){e._type==="pmtiles"&&Tt(e,this)}function cm(e,t){if(t._terrain3D&&t._terrain3D!==e)throw new Error("Only one terrain layer can be active per map");if(t._terrain3D=e,Wr(e,t),e.root)e._terrainPromise=eo(e);else{let r=Promise.withResolvers();e._terrainPromise=r.promise,e.once("ready",pm,{backend:e,...r})}t.eachLayer(um,e),t.fire("terrainchange")}function dm(e,t){let r=t.url,o={...t};delete o.url,_e(e,o),e.terrainSource=r,e._terrainTiles=new Map,e._rasterTiles=new Map,e._terrainReady=!1,e.onAdd=cm.bind(null,e),e.onRemove=am.bind(null,e)}function to(e,t,r){let o=[],i;for(i=0;i<e.length;i++)o.push(e[i]+(t[i]-e[i])*r);return o}function di(e){let t=[],r;for(r of e)t.push(Math.round(r));return`rgb(${t.join(", ")})`}function hm(e){if(!Number.isFinite(e))throw new Error("Invalid solar altitude");let t=[[-18,[3,7,20],[17,28,54],[.025,.04,.09]],[-6,[37,53,84],[182,106,86],[.12,.1,.14]],[0,[101,131,171],[246,170,115],[.38,.24,.18]],[10,[74,147,208],[197,221,237],[.8,.75,.68]],[25,[53,144,213],[223,238,250],[1,1,1]]],r=-1,o;for(o=0;o<t.length;o++)if(t[o][0]>=e){r=o;break}let i=t[r<0?t.length-1:r],n=t[Math.max(0,r-1)],a=n===i||r<0?1:(e-n[0])/(i[0]-n[0]);return{background:`linear-gradient(${di(to(n[1],i[1],a))}, ${di(to(n[2],i[2],a))})`,tint:to(n[3],i[3],a)}}function ro(e,t,r,o,i){let n=Math.PI/180,a=(280.16+360.9856235*e+r)*n-o,s=t*n,f=Math.asin(Math.sin(s)*Math.sin(i)+Math.cos(s)*Math.cos(i)*Math.cos(a)),l=(Math.atan2(Math.sin(a),Math.cos(a)*Math.sin(s)-Math.tan(i)*Math.cos(s))/n+180+360)%360;return{altitude:f/n,azimuth:l,direction:[Math.sin(l*n)*Math.cos(f),Math.sin(f),-Math.cos(l*n)*Math.cos(f)]}}function oo(e,t,r){let o=new Date(e).getTime();if(!Number.isFinite(o)||!Number.isFinite(t)||Math.abs(t)>90||!Number.isFinite(r)||Math.abs(r)>180)throw new Error("Invalid solar date or location");let i=Math.PI/180,n=o/864e5-10957.5,a=(357.5291+.98560028*n)*i,s=a+(1.9148*Math.sin(a)+.02*Math.sin(2*a)+3e-4*Math.sin(3*a)+102.9372+180)*i,f=23.4397*i,m=Math.asin(Math.sin(s)*Math.sin(f)),l=Math.atan2(Math.sin(s)*Math.cos(f),Math.cos(s));return ro(n,t,r,l,m)}function gm(e,t,r){oo(e,t,r);let o=Math.PI/180,i=new Date(e).getTime()/864e5-10957.5,n=(134.963+13.064993*i)*o,a=(218.316+13.176396*i+6.289*Math.sin(n))*o,s=5.128*Math.sin((93.272+13.22935*i)*o)*o,f=23.4397*o,m=Math.cos(s)*Math.cos(a),l=Math.cos(s)*Math.sin(a)*Math.cos(f)-Math.sin(s)*Math.sin(f),p=Math.cos(s)*Math.sin(a)*Math.sin(f)+Math.sin(s)*Math.cos(f);return ro(i,t,r,Math.atan2(l,m),Math.asin(p))}function xm(e,t,r,o){let[i,n,a]=e,s=-i*Math.sin(o)*Math.sin(r)-n*Math.cos(r)-a*Math.cos(o)*Math.sin(r);return s>0?{left:t.x/2+t.y*1.5*(i*Math.cos(o)-a*Math.sin(o))/s,top:t.y/2-t.y*1.5*(-i*Math.sin(o)*Math.cos(r)+n*Math.sin(r)-a*Math.cos(o)*Math.cos(r))/s}:null}function Se({map:e,originalSky:t,sunDisc:r,moonDisc:o}){let i=e._sunlight,n=e._pitchSky;i?e.getContainer().style.setProperty("--leaflet-sky-background",i.background):t?e.getContainer().style.setProperty("--leaflet-sky-background",t):e.getContainer().style.removeProperty("--leaflet-sky-background");let a=e.getSize(),s=e.getPitch()*Math.PI/180,f=e.getBearing()*Math.PI/180,m,l,p,u,d;for([m,l]of[[r,i],[o,i?.moon]])m.hidden=!0,!(!n||!l||l.altitude<=0||!i)&&(m.parentNode!==n&&n.append(m),p=xm(l.direction,a,s,f),p&&({left:u,top:d}=p,m.hidden=u<0||u>a.x||d<0||d>n.clientHeight||n.style.display==="none",m.style.left=`${u}px`,m.style.top=`${d}px`))}function Qe(e){let t=F.renderers.get(e);t&&B(t)}function We(e){let{control:t,map:r,date:o,slider:i,output:n,status:a}=e;try{t.live&&(t.time=new Date);let s=t.time.toISOString();o.value=s.slice(0,10),i.value=String(t.time.getUTCHours()*60+t.time.getUTCMinutes()),n.textContent=`${s.slice(11,16)} UTC${t.live?" \xB7 now":""}`;let f=r.getCenter(),m=r._sunlight=oo(t.time,f.lat,f.lng);Object.assign(m,hm(m.altitude)),m.moon=gm(t.time,f.lat,f.lng),a.textContent=m.altitude<=0?"Night \xB7 no direct sunlight":m.altitude<3?"Low sun \xB7 shadows paused":`Sun altitude ${m.altitude.toFixed(1)}\xB0`,r.fire("simulationtimechange",{time:new Date(t.time),live:t.live}),Se(e),Qe(r)}catch(s){delete r._sunlight,Se(e),Qe(r),a.textContent=`Error: ${s.message}`,console.error("Solar simulation",s)}}function ym(e){e.control.live=!0,We(e)}function vm(e){let{control:t,map:r,date:o,slider:i,status:n}=e;if(t.live=!1,!o.value||!o.validity.valid){t.time=new Date(NaN),r.fire("simulationtimechange",{time:null,live:!1}),delete r._sunlight,Se(e),Qe(r),n.textContent="Error: choose a valid solar date";return}t.time=new Date(`${o.value}T00:00:00Z`),t.time.setUTCMinutes(Number(i.value)),We(e)}function Mm(e){e.control.live&&We(e)}function wm(e){let{map:t,timer:r,sunDisc:o,moonDisc:i}=e;clearInterval(r),delete t._timeControl,t.fire("simulationtimechange",{time:null,live:!1}),t.off("moveend",e.update),t.off("move rotate pitch resize",e.updateSky),delete t._sunlight,Se(e),o.remove(),i.remove(),Qe(t)}function _m(e,t){t._timeControl=e;let r=t.getContainer().style.getPropertyValue("--leaflet-sky-background"),o="position:absolute;width:18px;height:18px;border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;",i=L.DomUtil.create("div","sunlight-sun"),n=L.DomUtil.create("div","sunlight-moon");i.style.cssText=o+"background:#fff3bd;box-shadow:0 0 18px 7px #ffd27699;",n.style.cssText=o+"background:#dce5f2;box-shadow:0 0 10px 2px #cbdcff55;",i.setAttribute("role","img"),i.setAttribute("aria-label","Sun"),n.setAttribute("role","img"),n.setAttribute("aria-label","Moon");let a=L.DomUtil.create("div","sunlight-control");a.style.cssText="color:#222;width:min(200px,calc(100vw - 60px));font:12px/1.4 sans-serif;";let s=document.createElement("input");s.type="date",s.style.cssText="width:100%;box-sizing:border-box;",s.setAttribute("aria-label","Solar date (UTC)");let f=document.createElement("input");f.type="range",f.style.cssText="width:100%;box-sizing:border-box;margin:10px 0 4px;cursor:pointer;",f.min="0",f.max="1439",f.step="1",f.setAttribute("aria-label","Time of day (UTC)");let m=document.createElement("output");m.style.cssText="font-weight:bold;font-variant-numeric:tabular-nums;",m.setAttribute("aria-live","off");let l=document.createElement("button");l.type="button",l.textContent="Now";let p=document.createElement("div");p.className="sunlight-time",p.style.cssText="display:flex;justify-content:space-between;align-items:center;",p.append(m,l);let u=document.createElement("div");u.className="sunlight-status",u.style.marginTop="5px",u.setAttribute("role","status");let d=document.createElement("small");d.style.color="#555",d.textContent="Indicative \xB7 loaded geometry only. Streetlight illumination is estimated, not measured lux.",a.append(s,f,p,u,d);let c={control:e,map:t,originalSky:r,sunDisc:i,moonDisc:n,date:s,slider:f,output:m,status:u};return c.update=We.bind(null,c),c.updateSky=Se.bind(null,c),l.onclick=ym.bind(null,c),s.onchange=f.oninput=vm.bind(null,c),L.DomEvent.disableClickPropagation(a),L.DomEvent.disableScrollPropagation(a),c.update(),c.timer=setInterval(Mm,6e4,c),t.on("moveend",c.update),t.on("move rotate pitch resize",c.updateSky),e.onRemove=wm.bind(null,c),a}var Lt={};function Pm(e,t,r){let o,i;for(o of e.getContainer().querySelectorAll(".leaflet-control-layers-selector"))if(i=e._layers[o.layerId],o.layerId===L.Util.stamp(t)||i instanceof L.LayerGroup&&i.hasLayer(t))return o.closest("label").after(r),!0;return!1}function io(e){let t=Pm(e.map,e.layer,e.element),r=e.onPlace;return r?.(t),t}function Tm(){let e=Lt.pendingPlacements.shift();e?.map.hasLayer(e.layer)&&io(e)}function no(){Lt.pendingPlacements.push(this),queueMicrotask(Tm)}function Lm(){this.map.off("layeradd layerremove",no,this),this.element.remove()}Lt.pendingPlacements=[];function ao(e,t,r){let o={map:e._map,layer:e,element:t,onPlace:r};return o.map.on("layeradd layerremove",no,o),e.once("remove",Lm,o),io(o)}function Sm(e){return this.control.addTo(e)}function bm(){return L.Control.prototype.remove.call(this.control)}function Cm(e){L.Util.setOptions(this,e),this.live=!0,this.layer=new L.Layer,this.layer.control=this,this.layer.onAdd=Sm,this.layer.onRemove=bm}function Em(e){return _m(this,e)}function hi(e,t){e.classList.toggle("leaflet-control",!t),e.classList.toggle("leaflet-bar",!t),Object.assign(e.style,t?{background:"",padding:"2px 0 6px 20px",margin:"0"}:{background:"#fff",padding:"8px",margin:""})}function Bm(e){L.Control.prototype.addTo.call(this,e);let t=this.getContainer();return this.layer._map===e?ao(this.layer,t,hi.bind(null,t)):hi(t,!1),this}function Am(){return this._map?.hasLayer(this.layer)?(this._map.removeLayer(this.layer),this):L.Control.prototype.remove.call(this)}L.Control.Time=L.Control.extend({options:{position:"bottomright"},initialize:Cm,onAdd:Em,addTo:Bm,remove:Am});function Yt(e,t,r,o,i,n,a){let s=[],f=[],m,l,p;for(m=0;m<i.length;m++)s.push(i[m]-o[m]);for(m=0;m<n.length;m++)f.push(n[m]-o[m]);let u=[s[1]*f[2]-s[2]*f[1],s[2]*f[0]-s[0]*f[2],s[0]*f[1]-s[1]*f[0]],d=Math.hypot(...u);for(l of[o,i,n]){e.push(...l);for(p of u)t.push(p/d);r.push(...a)}}function St(e){let t=[],r=[],o=[],i,n,a,s,f,m,l,p,u,d,c;for([i,n,a,s,f=i]of e){m=[],l=[];for([p,u]of i)m.push([p,n,u]);for([p,u]of f)l.push([p,a,u]);for(d=0;d<i.length;d++)c=(d+1)%i.length,Yt(t,r,o,m[d],m[c],l[c],s),Yt(t,r,o,m[d],l[c],l[d],s);for(d=1;d<i.length-1;d++)Yt(t,r,o,l[0],l[d],l[d+1],s),Yt(t,r,o,m[0],m[d+1],m[d],s)}return{position:t,normal:r,color:o}}function zm({properties:e}){let t=document.createElement("div");t.style.whiteSpace="pre-line";let r=[],o;for(o of[e.name,e.departure&&`Departure ${e.departure} ${e.timetable.timeZone}`,e.description])o&&r.push(o);return t.textContent=r.join(`
3
+ `),t}function C(e,t,r,o){return[[e,r],[t,r],[t,o],[e,o]]}var ke=[.12,.15,.18];var bt=[.05,.05,.05];function be(e,t,r,o,...i){return[[C(e,t,r,o),...i],[C(-t,-e,r,o),...i]]}var Ce=[[.86,.86,.88],[.1,.1,.12],[.5,.53,.57],[.65,.1,.08],[.12,.25,.55],[.85,.7,.15]];var so=[1.9,1.85,1.7];var fo=[1.7,.06,.05];function Im(e){let t=Ce[e%Ce.length];return[...be(.7,.92,-1.68,-1.02,0,.64,bt),...be(.7,.92,1.02,1.68,0,.64,bt),[[[-.9,-1.95],[-.72,-2.25],[.72,-2.25],[.9,-1.95],[.9,2.05],[.76,2.25],[-.76,2.25],[-.9,2.05]],.28,.82,t],[C(-.84,.84,-.75,1.6),.82,1.38,ke,C(-.7,.7,-.05,1.3)],[C(-.71,.71,-.06,1.31),1.38,1.46,t],...be(.38,.8,-2.3,-2.16,.56,.76,so),[C(-.78,.78,2.16,2.3),.6,.76,fo]]}var gi=[[-5.5,30],[5.5,30],[5.5,-20],[4,-26],[1.5,-30],[-1.5,-30],[-4,-26],[-5.5,-20]];var Pe=[.92,.93,.92];function Dm(){let e=[],t;for(t=0;t<12;t++)e.push(...be(.5,3.8,-12+t*3,-11.3+t*3,3.9,4.4,[.62,.1,.1]));return e}function Rm(){return[[gi,0,.8,[.1,.16,.26]],[gi,.8,1.4,Pe],[C(-5,5,-18,26),1.4,3.7,ke,C(-4.6,4.6,-17.4,25.6)],...be(4.64,4.74,-17,25,3.25,3.45,[1.6,1.25,.8]),[C(-4.8,4.8,-17.8,25.8),3.7,3.9,Pe],...Dm(),...be(4.65,4.8,-13.6,25.8,3.9,4.8,Pe),[C(-4.8,4.8,25.65,25.8),3.9,4.8,Pe],[C(-2.2,2.2,-17.6,-14),3.9,4.7,Pe],[C(-2.2,2.2,-17.6,-14),4.7,5.5,ke],[C(-2.5,2.5,-18,-13.6),5.5,5.7,Pe],[C(-2.45,-2.2,-16.2,-15.8),5,5.3,[2,.15,.1]],[C(2.2,2.45,-16.2,-15.8),5,5.3,[.1,2,.4]],[C(-.1,.1,-15.9,-15.7),5.7,6.6,Pe],[C(-.15,.15,-15.95,-15.65),6.6,6.8,[2,2,1.9]]]}function Ct(e){let t=e?.route_color;if(!/^[\da-f]{6}$/i.test(t))return[.1,.55,.65];let r=Number.parseInt(t,16);return[(r>>16&255)/255,(r>>8&255)/255,(r&255)/255]}function Et(e,t,r){let o=e-t/2,i=e+t/2;return[[C(-1.25,1.25,o,i),.45,1.25,r],[C(-1.2,1.2,o+.15,i-.15),1.25,2.65,ke],[C(-1.25,1.25,o,i),2.65,3.1,Pe],[C(-1.15,-.85,o+1,o+2),0,.7,bt],[C(.85,1.15,i-2,i-1),0,.7,bt],[C(-.9,.9,o-.03,o),.8,1.05,so],[C(-.9,.9,i,i+.03),.8,1.05,fo]]}function Um(e,t){return Et(0,12,Ct(t))}function Om(e,t){let r=Ct(t),o=[],i;for(i=0;i<5;i++)o.push(...Et((i-2)*6.5,6,r));return o}function Gm(e,t){let r=Ct(t),o=[],i;for(i=0;i<5;i++)o.push(...Et((i-2)*15,14,r));return o}var de=[.85,.64,.5];var Ee=[.16,.2,.32];var Be=[.08,.07,.06];function Fm(e){let t=Ce[e%Ce.length];return[[C(-.045,.045,-.85,-.25),.02,.62,Be],[C(-.045,.045,.25,.85),.02,.62,Be],[C(-.06,.06,-.5,.5),.4,.65,t],[C(-.32,.32,-.58,-.5),.95,1.02,Be],[C(-.1,.1,.15,.4),.85,.92,Be],[C(-.18,.18,-.12,.28),1,1.5,t],[C(-.11,.11,-.22,0),1.5,1.72,de],[C(-.13,.13,-.23,.01),1.72,1.8,t],[C(-.25,-.15,-.5,-.05),1,1.25,de],[C(.15,.25,-.5,-.05),1,1.25,de],[C(-.2,-.08,0,.32),.3,1,Ee],[C(.08,.2,-.25,.07),.3,1,Ee]]}var xi=[.75,.2,.15];var mo={body:[[C(-.17,.17,-.1,.1),.82,.95,Ee],[C(-.19,.19,-.11,.11),.95,1.44,xi],[C(-.05,.05,-.05,.05),1.44,1.5,de],[C(-.1,.1,-.11,.1),1.5,1.72,de],[C(-.105,.105,-.06,.115),1.58,1.77,Be],[C(-.105,.105,-.115,-.06),1.7,1.77,Be]],leg:[[C(-.07,.07,-.07,.07),-.82,0,Ee],[C(-.07,.07,-.17,.07),-.9,-.82,Be]],arm:[[C(-.05,.05,-.05,.05),-.55,0,xi],[C(-.045,.045,-.045,.045),-.66,-.55,de]]};function Nm(e){let t=mo.body.slice();return t[1]=[t[1][0],t[1][1],t[1][2],Ce[e%Ce.length]],t.push([C(-.16,-.02,-.07,.07),.08,.9,Ee],[C(.02,.16,-.07,.07),.08,.9,Ee],[C(-.3,-.2,-.05,.05),.76,1.42,de],[C(.2,.3,-.05,.05),.76,1.42,de]),t}var jm={bicycle:{side:.4,model:Fm},pedestrian:{side:.3,model:Nm},bus:{side:1.5,model:Um},tram:{side:0,model:Om},metro:{side:0,model:Gm},car:{side:1.8,model:Im,lights:[{position:[0,1.2,-6],radius:10,color:[1,.94,.82],flux:800}]},boat:{side:0,model:Rm,lights:[{position:[0,8,4],radius:30,color:[1,.8,.55],flux:2e4}]}};var Zm=" struct Params{seconds:f32,side:f32,vertices:u32,total:u32}struct Vehicle{start:u32,count:u32,base:f32,speed:f32}@group(0)@binding(0)var<uniform> params:Params;@group(0)@binding(1)var<storage,read> model:array<f32>;@group(0)@binding(2)var<storage,read> points:array<vec4f>;@group(0)@binding(3)var<storage,read> vehicles:array<Vehicle>;@group(0)@binding(4)var<storage,read_write> position:array<f32>;@group(0)@binding(5)var<storage,read_write> normal:array<f32>;var<workgroup> center:vec3f;var<workgroup> heading:vec2f;@compute@workgroup_size(64)fn main(@builtin(workgroup_id)group:vec3u,@builtin(local_invocation_index)thread:u32){let vehicleIndex = group.x;if(thread == 0u){let vehicle = vehicles[vehicleIndex];let last = vehicle.start + vehicle.count - 1u;let length = points[last].w;var s = vehicle.base + params.seconds * vehicle.speed;s -= length * floor(s / length);var i = vehicle.start + 1u;var end = last;while(i < end){let middle = i +(end - i)/ 2u;if(points[middle].w < s){i = middle + 1u;}else{end = middle;}}let a = points[i - 1u];let b = points[i];let d = select(b.w - a.w,1.0,b.w == a.w);let t =(s - a.w)/ d;heading =(b.xy - a.xy)/ d;center = vec3f(a.x +(b.x - a.x)* t - heading.y * params.side,a.z +(b.z - a.z)* t,a.y +(b.y - a.y)* t + heading.x * params.side);}workgroupBarrier();for(var vertex = thread;vertex < params.vertices;vertex += 64u){let k = vertex * 3u;let n = params.vertices * 3u + k;let o =(vehicleIndex * params.vertices + vertex)* 3u;position[o]= center.x - model[k]* heading.y - model[k + 2u]* heading.x;position[o + 1u]= center.y + model[k + 1u];position[o + 2u]= center.z + model[k]* heading.x - model[k + 2u]* heading.y;normal[o]= -model[n]* heading.y - model[n + 2u]* heading.x;normal[o + 1u]= model[n + 1u];normal[o + 2u]= model[n]* heading.x - model[n + 2u]* heading.y;}}";function $m(e,t,r){let o=1,i=t.length-1,n;for(;o<i;)n=o+Math.floor((i-o)/2),t[n]<r?o=n+1:i=n;let a=e[o-1],s=e[o],f=t[o]-t[o-1]||1,m=(r-t[o-1])/f;return{x:a[0]+(s[0]-a[0])*m,y:(a[2]??0)+((s[2]??0)-(a[2]??0))*m,z:a[1]+(s[1]-a[1])*m,dx:(s[0]-a[0])/f,dz:(s[1]-a[1])/f}}function lo(e,t){let{points:r,lengths:o,length:i}=t.lane,n=t.distance+e.elapsed*t.speed;n-=i*Math.floor(n/i);let{x:a,y:s,z:f,dx:m,dz:l}=$m(r,o,n);return{x:a-l*e.side,y:s,z:f+m*e.side,dx:m,dz:l}}function po(e){if(!e.mesh||!e.stale)return;e.stale=!1;let{position:t,normal:r}=e.mesh.geometry.attributes,o,i,n,a,s,f,m,l,p,u,d,c,h;for(o=0;o<e.trips.length;o++)for(i=e.trips[o],{x:n,y:a,z:s,dx:f,dz:m}=lo(e,i),l=0,p=o*e.stride;l<e.stride;l+=3,p+=3)u=e.template.position[l],d=e.template.position[l+2],c=e.template.normal[l],h=e.template.normal[l+2],t.data[p]=n-u*m-d*f,t.data[p+1]=a+e.template.position[l+1],t.data[p+2]=s+u*f-d*m,r.data[p]=-c*m-h*f,r.data[p+1]=e.template.normal[l+1],r.data[p+2]=c*f-h*m}function uo(e){e.layer._map.off("simulationtimechange layerremove",e.update).on("simulationtimechange layerremove",e.update),e.layer._map.off("terrainchange",e.terrain).on("terrainchange",e.terrain),ao(e.layer,e.status),e.update()}function Vm(e){e.layer._beforeRaycast=po.bind(null,e),e.ready&&uo(e)}function Ae(e,t){t&&(e.layer.highlightedFeature?.mesh===t&&(Me(e.layer,null),e.layer.hoveredFeature=null,we(e.layer,null)),k(e.layer,t))}function co(e){let t;for(t of[e.gpu?.params,e.gpu?.template,e.gpu?.points,e.gpu?.vehicles])t?.destroy();e.gpu=null}function qm(e){e.request?.abort(),cancelAnimationFrame(e.frame),e.frame=void 0,e.layer._map.off("simulationtimechange layerremove",e.update).off("terrainchange",e.terrain),Ae(e,e.mesh),Ae(e,e.route),e.mesh=e.route=null,delete e.layer._beforeRaycast,co(e),e.lanes=[],e.trips=[],e.tripsKey=e.loaded=null}function Hm(e){e.ready=!0,e.layer._map&&uo(e)}function Wm(e,t,r=8){let o=Math.round(e*t/3600/r),i=Array.from({length:o}),n;for(n=0;n<i.length;n++)i[n]=(n+.5)*e/o;return i}function vi(e){let t=e.split(":");return Number(t[0])*60+Number(t[1])}function Ym(e,t){return e-t}function Xm(e,{timeZone:t,duration:r,services:o}){let i=new Date(e);if(!Number.isFinite(i.getTime()))throw new Error("Invalid date");let n=new Intl.DateTimeFormat("en-GB",{timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}),a={},s,f,m,l,p,u,d;for(s of n.formatToParts(i))s.type!=="literal"&&(a[s.type]=Number(s.value));let c=a.hour*60+a.minute+(a.second+i.getUTCMilliseconds()/1e3)/60,h=new Date(Date.UTC(a.year,a.month-1,a.day)).getUTCDay(),g=[];for({from:f,to:m,every:l=1/0,months:p,weekdays:u}of o)if(!(p?.includes(a.month)===!1||u?.includes(h)===!1))for(d=vi(f);d<=vi(m);d+=l)g.push(d);g.sort(Ym);let y=[];for(d of g)c>=d&&c<d+r&&y.push({id:`${a.year}-${a.month}-${a.day}-${d}`,departure:`${String(Math.floor(d/60)).padStart(2,"0")}:${String(d%60).padStart(2,"0")}`,progress:(c-d)/r});return y}function Km(e,t,r){let o=[],i,n,a,s,f,m,l,p;for(i=0;i<t.length;i++)if(n=t[i],{timetable:a,flow:s=0}=n.properties,!!n.length)if(a)for(f of Xm(e,a))o.push({id:`${i}-${f.id}`,lane:n,distance:f.progress*n.length,speed:n.length/(a.duration*60),properties:{...n.properties,departure:f.departure}});else for(m=e/1e3*r,l=n.offsets||=Wm(n.length,s,r),p=0;p<l.length;p++)o.push({id:`${i}-${p}`,lane:n,distance:(l[p]+m)%n.length,speed:r,properties:n.properties});return o}function ho(e){let t=e.layer._map?._timeControl||{live:!0};return{live:t.live,time:t.live?new Date:t.time}}function go(e,t){e.error=t,e.status.textContent=`Error: ${t.message}`,e.status.setAttribute("role","alert"),console.error("Traffic layer",t)}function Jm(e){let t=[],r=[],o=[],i,n,a,s,f,m,l,p,u,d,c,h,g,y,x,v,w,P,M,S;for({points:i,lengths:n,properties:a}of e)for(s=a?.route_color,f=/^[\da-f]{6}$/i.test(s)?Number.parseInt(s,16):null,m=f===null?[.08,.7,.85]:[(f>>16&255)/255,(f>>8&255)/255,(f&255)/255],l=1;l<i.length;l++)if(p=i[l-1],u=i[l],d=u[0]-p[0],c=u[1]-p[1],h=n[l]-n[l-1],!!h){for(g=-c/h*2.5,y=d/h*2.5,x=Math.floor(n[l-1]/30)*30;x<n[l];x+=30)if(v=Math.max(0,(x-n[l-1])/h),w=Math.min(1,(x+18-n[l-1])/h),!(w<=v)){P=[p[0]+d*v,p[1]+c*v,p[2]+(u[2]-p[2])*v+.4],M=[p[0]+d*w,p[1]+c*w,p[2]+(u[2]-p[2])*w+.4];for(S of[[P[0]-g,P[2],P[1]-y],[P[0]+g,P[2],P[1]+y],[M[0]+g,M[2],M[1]+y],[P[0]-g,P[2],P[1]-y],[M[0]+g,M[2],M[1]+y],[M[0]-g,M[2],M[1]-y]])t.push(...S),r.push(0,1,0),o.push(...m)}}return{position:t,normal:r,color:o}}function xo(e,t,r,o,i=0){let n=Ge(e.layer,t,o,i);return n.extras.featureFaces=r,n}function Qm(e){e.route=xo(e,Jm(e.lanes),[],{unlit:!0})}function yo(e){let t=20,r=5,o,i,n,a,s;for(o=0;o<e.template.position.length;o+=3)t=Math.max(t,Math.hypot(e.template.position[o],e.template.position[o+2])+Math.abs(e.side)),r=Math.max(r,e.template.position[o+1]);let f=[];for(i of e.lanes)for([n,a,s]of i.points)f.push(n-t,s,a-t,n+t,s+r,a+t);let m={attributes:{position:{data:f}}};oe(m),e.mesh.geometry.bounds=m.bounds}function km(e){let{trips:t,model:r,vertices:o}=e;if(Ae(e,e.mesh),e.mesh=null,!t.length)return;let i=[],n=[],a,s,f;for(a=0;a<t.length;a++){s=t[a];for(f of St(r(a,s.properties)).color)i.push(f);n.push({id:s.id,properties:s.properties,faceStart:a*o/3,faceEnd:(a+1)*o/3,vertexStart:a*o,vertexEnd:(a+1)*o})}let m=i.length/3;e.mesh=xo(e,{position:new Array(i.length).fill(0),normal:new Array(i.length).fill(0),color:i},n,{},GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC),e.mesh.geometry.drawRange.count=m,e.mesh.extras.dynamicLights=!0,yo(e)}function vo(e,t){let r=e.createBuffer({size:Math.max(16,t.byteLength),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return e.queue.writeBuffer(r,0,t),r}function el(e){let{device:t}=e.layer.renderer;e.gpu?.device!==t&&(co(e),e.gpu={device:t,pipeline:t.createComputePipeline({layout:"auto",compute:{module:t.createShaderModule({code:e.shader}),entryPoint:"main"}}),params:t.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),template:vo(t,new Float32Array([...e.template.position,...e.template.normal]))},e.lanesDirty=!0);let r,o,i,n,a;if(e.lanesDirty){let d=0;for(r of e.lanes)d+=r.points.length;let c=new Float32Array(d*4),h=0;for(r of e.lanes)for(r.start=h/4,o=0;o<r.points.length;o++)i=r.points[o],c[h++]=i[0],c[h++]=i[1],c[h++]=i[2],c[h++]=r.lengths[o];e.gpu.points?.destroy(),e.gpu.points=vo(t,c),e.lanesDirty=!1}let s=new Float32Array(e.trips.length*4),f=new Uint32Array(s.buffer);for(o=0;o<e.trips.length;o++)n=e.trips[o],f[o*4]=n.lane.start,f[o*4+1]=n.lane.points.length,s[o*4+2]=n.distance,s[o*4+3]=n.speed,e.mesh.extras.featureFaces[o].properties=n.properties;e.gpu.vehicles?.size>=s.byteLength?t.queue.writeBuffer(e.gpu.vehicles,0,s):(e.gpu.vehicles?.destroy(),e.gpu.vehicles=vo(t,s));let{position:m,normal:l}=e.mesh.geometry.attributes,p=[e.gpu.params,e.gpu.template,e.gpu.points,e.gpu.vehicles,m.buffer,l.buffer],u=[];for(a=0;a<p.length;a++)u.push({binding:a,resource:{buffer:p[a]}});e.gpu.bindGroup=t.createBindGroup({layout:e.gpu.pipeline.getBindGroupLayout(0),entries:u})}function tl(e,t){let{device:r}=e.gpu;e.paramFloats[0]=e.elapsed=t,e.paramFloats[1]=e.side,e.paramInts[2]=e.vertices,e.paramInts[3]=e.trips.length*e.vertices,r.queue.writeBuffer(e.gpu.params,0,e.params);let o=r.createCommandEncoder(),i=o.beginComputePass();i.setPipeline(e.gpu.pipeline),i.setBindGroup(0,e.gpu.bindGroup),i.dispatchWorkgroups(e.trips.length),i.end(),r.queue.submit([o.finish()]),e.stale=!0}function rl(e){if(e.frame=void 0,!e.ready||!e.layer._map)return;if(!e.layer.renderer){e.frame=requestAnimationFrame(e.tick);return}e.mesh&&!(e.mesh.geometry.attributes.position.buffer.usage&GPUBufferUsage.STORAGE)&&(e.tripsKey=null,e.nextCheck=-1/0);let{live:t,time:r}=ho(e),o=r?.getTime(),i=Number.isFinite(o),n=!1,a,s,f,m,l,p,u,d,c,h;if(!t||!i||!(o>=e.rebasedAt&&o<e.nextCheck)){let g;try{e.trips=i?Km(r,e.lanes,e.velocity):[],g=i?e.loaded?`${e.trips.length} ${e.vehicle==="boat"?"boats":e.vehicle}`:"Loading\u2026":"Select a valid simulation date"}catch(v){return go(e,v)}e.rebasedAt=o,e.nextCheck=o+1e3;let y=[];for(a of e.trips)y.push(a.id);let x=y.join();n=x!==e.tripsKey||e.outline&&!e.route&&e.lanes.length,e.outline&&!e.route&&e.lanes.length&&Qm(e),x!==e.tripsKey&&(km(e),e.tripsKey=x),e.mesh&&el(e),e.error||(e.status.textContent!==g&&(e.status.textContent=g),e.status.removeAttribute("role"))}if(e.mesh&&tl(e,(o-e.rebasedAt)/1e3),e.mesh&&e.lights&&(!t||!(performance.now()-e.litAt<100))){e.litAt=performance.now();let g=[];for(a of e.trips){({x:s,y:f,z:m,dx:l,dz:p}=lo(e,a));for({position:[u,d,c],...h}of e.lights)g.push({...h,position:[s-u*p-c*l,f+d,m+u*l-c*p]})}e.mesh.extras.lights=g}(e.mesh||n)&&B(e.layer),t&&i&&(e.frame=requestAnimationFrame(e.tick))}async function ol(e,t,r){let o=new URL(e.url,document.baseURI).href;if(/\.m?js(?:[?#]|$)/i.test(e.url))return(await import(o)).default(t,e.layer,r);if(!e.file){let i=await fetch(o,{signal:r});if(!i.ok)throw new Error(`HTTP ${i.status}`);e.file=await i.json()}return e.file}function il({features:e=[]}){let t=[],r,o,i,n,a,s,f;for({geometry:r,properties:o}of e){i=r?.type==="LineString"?[r.coordinates]:r?.type==="MultiLineString"?r.coordinates:[];for(n of i){a=[];for([s,f]of n)a.push([f,s]);t.push({latlngs:a,properties:o??{},elevation:o?.elevation})}}return t}function Mo(e){let{layer:t,lanes:r}=e,o=t._map._terrain3D?._terrainReady&&t._map._terrain3D,i=t.root.position[1],n,a,s;for(n of r)for(a=0;a<n.points.length;a++)s=o&&(n.elevation??Y(o,n.latlngs[a])),n.points[a][2]=Number.isFinite(s)&&Number.isFinite(i)?s-i:0;e.lanesDirty=!0,e.nextCheck=-1/0}function nl(e){let{layer:t,lanes:r}=e,o=t._map.options.crs,i=o.project(t.location),n=Math.cos(t.location.lat*Math.PI/180),a,s,f,m,l;for(a of r){a.points=[];for([s,f]of a.latlngs)m=o.project(new L.LatLng(s,f)),a.points.push([(m.x-i.x)*n,-(m.y-i.y)*n,0]);for(a.lengths=[0],l=1;l<a.points.length;l++)a.lengths.push(a.lengths[l-1]+Math.hypot(a.points[l][0]-a.points[l-1][0],a.points[l][1]-a.points[l-1][1]));a.length=a.lengths.at(-1)}Mo(e),Ae(e,e.route),e.route=null,e.tripsKey=null}function al(e,t,r){if(!(t.aborted||!e.layer._map)){if(e.error=null,r===e.loaded){e.nextCheck=-1/0,e.frame||e.tick();return}e.loaded=r,e.lanes=il(r),nl(e),e.frame||e.tick()}}function sl(e,t,r){!t.aborted&&r.name!=="AbortError"&&go(e,r)}function fl(e){let{time:t}=ho(e);if(!Number.isFinite(t?.getTime()))return;e.request?.abort();let{signal:r}=e.request=new AbortController;ol(e,t,r).then(al.bind(null,e,r),sl.bind(null,e,r))}function ml(e,t){t?.layer&&!t.layer.control?.time||(cancelAnimationFrame(e.frame),fl(e),e.tick())}function ll(e){e.lanes.length&&(Mo(e),Ae(e,e.route),e.route=null,e.mesh&&yo(e),e.frame||e.tick())}function pl(e,{url:t,vehicle:r="car",side:o,outline:i,speed:n=8,...a}={}){let{model:s,lights:f,side:m}=jm[r];o??=m,_e(e,{tooltip:zm,nightLight:!!f,...a});let l=L.DomUtil.create("small","traffic-status");l.style.cssText="display:block;max-width:200px;margin:0 0 4px 20px;color:#555;";let p=St(s(0)),u=p.position.length,d=u/3,c=new ArrayBuffer(16),h=new Float32Array(c),g=new Uint32Array(c),y={layer:e,url:t,model:s,lights:f,side:o,outline:i,velocity:n,vehicle:r,status:l,template:p,stride:u,vertices:d,params:c,paramFloats:h,paramInts:g,ready:!1,frame:void 0,request:void 0,lanes:[],tripsKey:void 0,mesh:void 0,route:void 0,litAt:-1/0,trips:[],rebasedAt:0,nextCheck:-1/0,elapsed:0,gpu:null,lanesDirty:!0,stale:!1,loaded:void 0,file:void 0};y.shader=Zm,y.tick=rl.bind(null,y),y.update=ml.bind(null,y),y.terrain=ll.bind(null,y),e._beforeRaycast=po.bind(null,y),e.on("ready",Hm.bind(null,y)),e.on("add",Vm.bind(null,y)),e.on("remove",qm.bind(null,y))}function ul(){this.keys.clear()}var Xt={KeyW:[1,0],ArrowUp:[1,0],KeyS:[-1,0],ArrowDown:[-1,0],KeyD:[0,1],ArrowRight:[0,1],KeyA:[0,-1],ArrowLeft:[0,-1]};function cl(e){let t=this.layer._map;if(e.type==="pointerdown"){if(e.button!==0||e.target.closest(".leaflet-control"))return;this.drag={x:e.clientX,y:e.clientY},t.getContainer().setPointerCapture(e.pointerId)}else this.drag&&e.type==="pointermove"?(t._setPitchAndBearing(Math.max(20,Math.min(85,t.getPitch()-(e.clientY-this.drag.y)*.2)),t.getBearing()-(e.clientX-this.drag.x)*.25),this.drag={x:e.clientX,y:e.clientY}):this.drag=null}var Kt=[["body",0,0,0],["leg",-.09,.9,1],["leg",.09,.9,-1],["arm",-.25,1.42,-1],["arm",.25,1.42,1]];function wo(){let{layer:e,state:t}=this,r=e._map,o=r.options.crs,i=o.project(e.location),n=Math.cos(e.location.lat*Math.PI/180),a=o.project(t.latlng),s=r._terrain3D?._terrainReady&&r._terrain3D,f=s&&Y(s,t.latlng)||0;return[(a.x-i.x)*n,f-e.root.position[1],-(a.y-i.y)*n]}function _o(){let[e,t,r]=wo.call(this),o=-this.state.heading,i=Math.cos(o),n=Math.sin(o),a,s,f,m,l;for(a=0;a<Kt.length;a++)[,s,f,m]=Kt[a],l=this.meshes[a],l.position[0]=e+s*i,l.position[1]=t+f,l.position[2]=r-s*n,l.rotation[0]=m*this.swing*Math.sin(this.state.phase),l.rotation[1]=o;B(this.layer)}function dl(){this.meshes&&_o.call(this)}function Po(){let e=this.layer._map;cancelAnimationFrame(this.frame),this.keys.clear(),this.drag=null,L.DomEvent.off(document,"keydown keyup",this.onKey),L.DomEvent.off(window,"blur",this.onBlur);let t,r;for(t of this.meshes||[])k(this.layer,t);if(this.meshes=null,this.button.setAttribute("aria-pressed","false"),this.button.style.background="#fff",this.hint.style.display="none",!(!e||!this.saved)){L.DomEvent.off(e.getContainer(),"pointerdown pointermove pointerup pointercancel",this.onPointer),e.off("terrainchange",this.onTerrain),e.options.scrollWheelZoom=this.saved.scrollWheelZoom;for(r of this.saved.handlers)e[r].enable();e.setView(this.state.latlng,this.saved.zoom,{animate:!1}),e.setPitch(this.saved.pitch),this.saved=null}}function hl(e){if(!(e.target.closest?.("input:not([type=checkbox], [type=radio]), select, textarea, [contenteditable]")||e.ctrlKey||e.altKey||e.metaKey)){if(e.type==="keydown"&&e.code==="Escape"){this.stop();return}Xt[e.code]&&(e.preventDefault(),e.type==="keydown"?this.keys.add(e.code):this.keys.delete(e.code))}}function Mi(e){return Math.atan2(Math.sin(e),Math.cos(e))}var wi=new WeakMap;function gl(e){let t=wi.get(e.geometry);if(t)return t;let r=e.worldMatrix,{position:{data:o},index:i,normal:n,uv:a}=e.geometry.attributes,s=i?i.count:o.length/3,f=[],m=[],l=new Map,p=[],u,d,c,h,g,y,x,v,w,P,M,S,z,T,E,b,R,D,U,G,$,H,V;for(u=0;u<s;u+=3)if(d=i?i.data[u]:u,!(e.program.nightLight&&a&&a.data[d*2]<=2)){for(c=0;c<3;c++)h=(i?i.data[u+c]:u+c)*3,g=o[h],y=o[h+1],x=o[h+2],p[c*3]=r[0]*g+r[4]*y+r[8]*x+r[12],p[c*3+1]=r[1]*g+r[5]*y+r[9]*x+r[13],p[c*3+2]=r[2]*g+r[6]*y+r[10]*x+r[14];if(v=p[3]-p[0],w=p[4]-p[1],P=p[5]-p[2],M=p[6]-p[0],S=p[7]-p[1],z=p[8]-p[2],T=w*z-P*S,E=v*S-w*M,b=P*M-v*z,R=Math.hypot(T,b,E),!(!R||Math.abs(b)>.9*R))for(n&&(h=d*3,D=n.data,(r[0]*D[h]+r[4]*D[h+1]+r[8]*D[h+2])*T+(r[2]*D[h]+r[6]*D[h+1]+r[10]*D[h+2])*E<0&&(T=-T,E=-E)),U=Math.hypot(T,E),G=m.length/2,f.push(...p),m.push(T/U,E/U),$=Math.floor(Math.min(p[0],p[3],p[6])/8);$<=Math.floor(Math.max(p[0],p[3],p[6])/8);$++)for(H=Math.floor(Math.min(p[2],p[5],p[8])/8);H<=Math.floor(Math.max(p[2],p[5],p[8])/8);H++)V=$+","+H,l.has(V)||l.set(V,[]),l.get(V).push(G)}return t={tri:Float32Array.from(f),nrm:Float32Array.from(m),cells:l,origin:[r[12],r[13],r[14]]},wi.set(e.geometry,t),t}function xl(e,t,r,o,i,n,a){let s=t*9,f=e[s+3]-e[s],m=e[s+4]-e[s+1],l=e[s+5]-e[s+2],p=e[s+6]-e[s],u=e[s+7]-e[s+1],d=e[s+8]-e[s+2],c=-a*u,h=a*p-n*d,g=n*u,y=f*c+m*h+l*g;if(Math.abs(y)<1e-9)return-1;let x=r-e[s],v=o-e[s+1],w=i-e[s+2],P=(x*c+v*h+w*g)/y;if(P<0||P>1)return-1;let M=v*l-w*m,S=w*f-x*l,z=x*m-v*f,T=(n*M+a*z)/y;return T<0||P+T>1?-1:(p*M+u*S+d*z)/y}function yl(e,t){return e===t||e._type==="terrain"||e._type==="traffic"}function vl(e,t){if(!e.visible)return!0;if(!e.geometry?.attributes?.position?.data||e.program?.depthTest===!1)return;e.geometry.bounds||oe(e.geometry);let r=e.worldMatrix,{center:o,radius:i}=e.geometry.bounds,{x:n,y:a,z:s,dx:f,dz:m,reach:l}=t;if(Math.hypot(r[0]*o[0]+r[4]*o[1]+r[8]*o[2]+r[12]-n,r[2]*o[0]+r[6]*o[1]+r[10]*o[2]+r[14]-s)>i*Math.hypot(r[0],r[1],r[2])+l)return;let p=gl(e),u=n-r[12]+p.origin[0],d=a-r[13]+p.origin[1],c=s-r[14]+p.origin[2],h=new Set,g,y,x,v,w;for(g=Math.floor(Math.min(u,u+f*l)/8);g<=Math.floor(Math.max(u,u+f*l)/8);g++)for(y=Math.floor(Math.min(c,c+m*l)/8);y<=Math.floor(Math.max(c,c+m*l)/8);y++)for(x of p.cells.get(g+","+y)||[])if(!(h.has(x)||f*p.nrm[x*2]+m*p.nrm[x*2+1]>=0)){h.add(x);for(v of[.4,1.5])w=xl(p.tri,x,u,d+v,c,f,m),w>=0&&w<t.best&&(t.best=w,t.found=[p.nrm[x*2],p.nrm[x*2+1]])}}function Ml(e,t,r,o,i,n,a){ae(e.scene);let s={x:t,y:r,z:o,dx:i,dz:n,reach:a,best:a,found:null},f;for(f of e._shared._layers)yl(f,e)||Rt(f.root,vl,s);return s.found}function _i(e,t,r){let o=Math.hypot(e,t);return o>1e-6&&Ml(this.layer,r[0],r[1],r[2],e/o,-t/o,o+.3)}function wl(e){let t=this.layer,r=t._map;this.frame=requestAnimationFrame(this.step);let o=Math.min(.1,(e-(this.last??e))/1e3);if(this.last=e,!t.renderer)return;let i=!1,n,a,s;if(!this.meshes){this.meshes=[];for([n]of Kt)this.meshes.push(Ge(t,St(mo[n])));i=!0}let f=0,m=0;for(a of this.keys)f+=Xt[a]?.[0]||0,m+=Xt[a]?.[1]||0;if(f=Math.sign(f),m=Math.sign(m),m&&(this.state.heading=Mi(this.state.heading+m*2.5*o),i=!0),f){let p=f*this.speed*o,{lat:u,lng:d}=this.state.latlng,{position:c,scale:h}=t.root,g=Math.sin(this.state.heading)*p,y=Math.cos(this.state.heading)*p,x=wo.call(this);for(s=0;s<x.length;s++)x[s]=c[s]+h[s]*x[s];let v=_i.call(this,g,y,x);if(v){let w=g*v[0]-y*v[1];g-=w*v[0],y+=w*v[1],_i.call(this,g,y,x)&&(g=y=0)}this.state.latlng=new L.LatLng(u+y/111320,d+g/(111320*Math.cos(u*Math.PI/180))),this.state.phase+=Math.hypot(g,y)/1.6*Math.PI,i=!0}if(f||m){let p=r.getBearing()*Math.PI/180,u=Mi(-this.state.heading-p);Math.abs(u)>.001&&r._setPitchAndBearing(r.getPitch(),(p+u*Math.min(1,o*4))*180/Math.PI),r.setView(this.state.latlng,r.getZoom(),{animate:!1})}let l=f?.9:0;Math.abs(this.swing-l)>.001&&(this.swing+=(l-this.swing)*Math.min(1,o*10),i=!0),i&&_o.call(this)}function To(){let e=this.layer._map;if(this.saved||!e)return;this.state.latlng=e.getCenter();let t=e.getSize().y*1.5/this.distance,r=Math.min(e.getMaxZoom(),Math.log2(t*4007501668557849e-8*Math.cos(this.state.latlng.lat*Math.PI/180)/256)),o=[],i;for(i of["dragging","keyboard","doubleClickZoom","boxZoom"])e[i]?.enabled()&&o.push(i);this.saved={zoom:e.getZoom(),pitch:e.getPitch(),scrollWheelZoom:e.options.scrollWheelZoom,handlers:o};for(i of this.saved.handlers)e[i].disable();e.options.scrollWheelZoom=this.saved.scrollWheelZoom&&"center",this.state.heading=-e.getBearing()*Math.PI/180,e.setView(this.state.latlng,r,{animate:!1}),e.setPitch(75),L.DomEvent.on(document,"keydown keyup",this.onKey),L.DomEvent.on(window,"blur",this.onBlur),L.DomEvent.on(e.getContainer(),"pointerdown pointermove pointerup pointercancel",this.onPointer),e.on("terrainchange",this.onTerrain),this.button.setAttribute("aria-pressed","true"),this.button.style.background="#e4e4e4",this.hint.style.display="",this.last=void 0,this.frame=requestAnimationFrame(this.step)}function _l(){this.saved?Po.call(this):To.call(this)}function Pl(e,{speed:t,distance:r,...o}={}){let i=new L.Layer;i._type="walk",_e(i,o);let n=new Set,a=L.DomUtil.create("div","leaflet-bar leaflet-control");a.style.cssText="display:flex;align-items:center;background:#fff;";let s=L.DomUtil.create("button","",a);s.type="button",s.title="Walk",s.setAttribute("aria-label","Walk"),s.setAttribute("aria-pressed","false"),s.textContent="\u{1F6B6}",s.style.cssText="width:30px;height:30px;padding:0;border:0;border-radius:4px;background:#fff;font-size:18px;line-height:30px;cursor:pointer;";let f=L.DomUtil.create("small","",a);f.style.cssText="display:none;padding:0 8px;color:#333;white-space:nowrap;",f.textContent="W/S: run \xB7 A/D: turn \xB7 drag: look around \xB7 Esc: exit",L.DomEvent.disableClickPropagation(a);let m={layer:i,speed:t,distance:r,keys:n,container:a,button:s,hint:f,meshes:null,frame:null,last:void 0,swing:0,saved:null,drag:null,state:e.walker=i.walker={latlng:null,heading:0,phase:0}};m.step=wl.bind(m),m.onKey=hl.bind(m),m.onBlur=ul.bind(m),m.onPointer=cl.bind(m),m.onTerrain=dl.bind(m),m.start=To.bind(m),m.stop=Po.bind(m),m.toggle=_l.bind(m),e._walk=m,L.DomEvent.on(s,"click",m.toggle)}function Tl(e){L.Util.setOptions(this,e),Pl(this,this.options)}function Ll(e){return this._walk.layer.addTo(e),this._walk.container}function Sl(){this._walk.stop(),this._walk.layer.remove()}L.Control.Walk=L.Control.extend({options:{position:"bottomright",speed:70,distance:20},initialize:Tl,onAdd:Ll,onRemove:Sl});var A={};function Pi(){return{}}function Lo(e=this){e?._nativeGPU?.refresh?.()}function bl(e=this){e?._nativeGPU?.reorder?.(!0)}function Cl(e=this){e?._nativeGPU?.reorder?.(!1)}function El(e){return this._project(),this._parts=this._rings,A.closestMethods.get(this).call(this,e)}function Bl(){return this._project(),A.boundsMethods.get(this).call(this)}function Al(){A.gridInitializers.get(this).call(this),this._container.remove()}function zl(e){A.pendingGridFades.delete(e),e._fadeFrame=null,!A.pendingGridFades.size&&A.gridFadeFrame!==null&&(cancelAnimationFrame(A.gridFadeFrame),A.gridFadeFrame=null)}function Il(){A.gridFadeFrame=null;let e=[...A.pendingGridFades],t,r;for([t,r]of e)A.pendingGridFades.get(t)===r&&(A.pendingGridFades.delete(t),t._fadeFrame=null,So.call(t))}function Dl(e){e._fadeVersion=(e._fadeVersion||0)+1,A.pendingGridFades.set(e,e._fadeVersion),A.gridFadeFrame===null&&(A.gridFadeFrame=requestAnimationFrame(Il)),e._fadeFrame=A.gridFadeFrame}function So(){if(!this._map)return;let e=this,t=Date.now(),r=!1,o=!1,i;for(i of Object.values(this._tiles||{}))!i.current||!i.loaded||(i._gpuOpacity=this._map._fadeAnimated?Math.min(1,(t-i.loaded)/200):1,i._gpuOpacity<1?r=!0:i.active||(this._onOpaqueTile(i),i.active=!0,o=!0));o&&!this._noPrune&&this._pruneTiles(),this._nativeGPU?.refresh?.(),zl(e),r&&Dl(e)}function Rl(){A.pendingRasterLoads.shift()?.fire("load")}function Ul(){this._image||this._initImage(),this._image.complete&&this._image.naturalWidth&&(A.pendingRasterLoads.push(this),queueMicrotask(Rl))}function Ol(){this instanceof L.Polyline||this instanceof L.CircleMarker?(this.beforeAdd=this.onAdd=this.onRemove=this._updateBounds=me,this.getEvents=Pi,this._renderer={options:{tolerance:0},_updatePath:Lo,_updateStyle:Lo,_bringToFront:bl,_bringToBack:Cl},this instanceof L.Polyline&&(A.closestMethods.set(this,this.closestLayerPoint),this.closestLayerPoint=El),this instanceof L.Circle&&(A.boundsMethods.set(this,this.getBounds),this.getBounds=Bl)):this instanceof L.GridLayer?(A.gridInitializers.set(this,this._initContainer),this._initContainer=Al,this._updateOpacity=So):this instanceof L.ImageOverlay&&!(this instanceof L.VideoOverlay)&&!(this instanceof L.SVGOverlay)&&(this.onAdd=Ul,this.onRemove=me,this.getEvents=Pi,this._reset=Lo)}function Gl(e){let t=!this._3d&&(this instanceof L.GridLayer||this instanceof L.Polyline||this instanceof L.CircleMarker||this instanceof L.Marker&&!(this.options.icon instanceof L.DivIcon)||this instanceof L.ImageOverlay&&!(this instanceof L.VideoOverlay)&&!(this instanceof L.SVGOverlay));t&&((this instanceof L.GridLayer||this instanceof L.ImageOverlay)&&(this.options.crossOrigin||=!0),this instanceof L.Marker&&(this.options.icon.options.crossOrigin||=!0)),A.layerProto._layerAdd.call(this,e),!(!t||!e.target.hasLayer(this))&&hr(this,e.target)}function Fl(e){return im(this,e)}function Nl(e,t){e._geojson=!0,e.setData=Fl,_e(e,t)}function jl(e){switch(e){case"geojson":return Nl;case"pmtiles":return om;case"terrain":return dm;case"traffic":return pl;default:throw new Error(`Unknown layer type: ${e}`)}}function Zl(){let e=A.pendingInitializations.shift();try{e.initialize=jl(e.type)}catch(t){e.error=t}return e}function $l(e){let{layer:t,ready:r}=e;try{if(e.error)throw e.error;let o=t._map;return o?.removeLayer(t),delete t.onAdd,delete t.onRemove,e.initialize(t,e.settings),o?.addLayer(t),t.ready===r?t:t.ready}catch(o){throw t.fire("error",{error:o}),o}}function Vl(e={}){if(Object.getPrototypeOf(this)!==L.Layer.prototype||!e.source){if(A.layerProto.initialize)return A.layerProto.initialize.apply(this,arguments);L.Util.setOptions(this,e);return}let{source:{type:t=e.source.data?.type==="FeatureCollection"?"geojson":/\.pmtiles(?:[?#]|$)/i.test(e.source.url)?"pmtiles":"3d",...r},...o}=e,i={...r,...o};if(L.Util.setOptions(this,o),this._type=t,t==="3d"){_e(this,i);return}this.onAdd=me,this.onRemove=me;let n={layer:this,type:t,settings:i,ready:null};A.pendingInitializations.push(n),A.loading=A.loading.catch(me).then(Zl);let a=this.ready=A.loading.then($l);n.ready=a,a.catch(me)}A.layerProto=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Layer.prototype));A.loading=Promise.resolve();A.pendingInitializations=[];A.closestMethods=new WeakMap;A.boundsMethods=new WeakMap;A.gridInitializers=new WeakMap;A.pendingGridFades=new Map;A.gridFadeFrame=null;A.pendingRasterLoads=[];L.Layer.include({_layerAdd:Gl,initialize:Vl});L.Layer.addInitHook(Ol);})();
2
4
  //# sourceMappingURL=leaflet-city-mapper.js.map