@react-google-maps/marker-clusterer 2.8.0 → 2.10.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"umd.min.js","sources":["../src/ClusterIcon.tsx","../src/Cluster.tsx","../src/Clusterer.tsx"],"sourcesContent":["/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport { ClusterIconStyle, ClusterIconInfo } from './types'\n\nexport class ClusterIcon {\n cluster: Cluster\n className: string\n clusterClassName: string\n styles: ClusterIconStyle[]\n center: google.maps.LatLng | undefined\n div: HTMLDivElement | null\n sums: ClusterIconInfo | null\n visible: boolean\n url: string\n height: number\n width: number\n anchorText: number[]\n anchorIcon: number[]\n textColor: string\n textSize: number\n textDecoration: string\n fontWeight: string\n fontStyle: string\n fontFamily: string\n backgroundPosition: string\n\n boundsChangedListener: google.maps.MapsEventListener | null\n\n constructor(cluster: Cluster, styles: ClusterIconStyle[]) {\n cluster.getClusterer().extend(ClusterIcon, google.maps.OverlayView)\n this.cluster = cluster\n this.clusterClassName = this.cluster.getClusterer().getClusterClass()\n this.className = this.clusterClassName\n this.styles = styles\n this.center = undefined\n this.div = null\n this.sums = null\n this.visible = false\n this.boundsChangedListener = null\n this.url = ''\n this.height = 0\n this.width = 0\n this.anchorText = [0, 0]\n this.anchorIcon = [0, 0]\n this.textColor = 'black'\n this.textSize = 11\n this.textDecoration = 'none'\n this.fontWeight = 'bold'\n this.fontStyle = 'normal'\n this.fontFamily = 'Arial,sans-serif'\n this.backgroundPosition = '0 0'\n // @ts-ignore\n this.setMap(cluster.getMap()) // Note: this causes onAdd to be called\n }\n\n onAdd() {\n let cMouseDownInCluster: boolean\n let cDraggingMapByCluster: boolean\n\n this.div = document.createElement('div')\n this.div.className = this.className\n if (this.visible) {\n this.show()\n }\n\n // @ts-ignore\n this.getPanes().overlayMouseTarget.appendChild(this.div)\n\n // Fix for Issue 157\n this.boundsChangedListener = google.maps.event.addListener(\n // @ts-ignore\n this.getMap(),\n 'boundschanged',\n function boundsChanged() {\n cDraggingMapByCluster = cMouseDownInCluster\n }\n )\n\n google.maps.event.addDomListener(this.div, 'mousedown', function onMouseDown() {\n cMouseDownInCluster = true\n cDraggingMapByCluster = false\n })\n\n google.maps.event.addDomListener(\n this.div,\n 'click',\n (event: Event) => {\n cMouseDownInCluster = false\n\n if (!cDraggingMapByCluster) {\n const markerClusterer = this.cluster.getClusterer()\n\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(markerClusterer, 'click', this.cluster)\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster) // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (markerClusterer.getZoomOnClick()) {\n // Zoom into the cluster.\n const maxZoom = markerClusterer.getMaxZoom()\n\n const bounds = this.cluster.getBounds()\n\n // @ts-ignore\n markerClusterer.getMap().fitBounds(bounds)\n\n // There is a fix for Issue 170 here:\n setTimeout(function timeout() {\n // @ts-ignore\n markerClusterer.getMap().fitBounds(bounds)\n\n // Don't zoom beyond the max zoom level\n // @ts-ignore\n if (maxZoom !== null && markerClusterer.getMap().getZoom() > maxZoom) {\n // @ts-ignore\n markerClusterer.getMap().setZoom(maxZoom + 1)\n }\n }, 100)\n }\n\n // Prevent event propagation to the map:\n event.cancelBubble = true\n\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n }\n }\n )\n\n google.maps.event.addDomListener(\n this.div,\n 'mouseover',\n () => {\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(this.cluster.getClusterer(), 'mouseover', this.cluster)\n }\n )\n\n google.maps.event.addDomListener(\n this.div,\n 'mouseout',\n () => {\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(this.cluster.getClusterer(), 'mouseout', this.cluster)\n }\n )\n }\n\n onRemove() {\n if (this.div && this.div.parentNode) {\n this.hide()\n\n if (this.boundsChangedListener !== null) {\n google.maps.event.removeListener(this.boundsChangedListener)\n }\n\n google.maps.event.clearInstanceListeners(this.div)\n\n this.div.parentNode.removeChild(this.div)\n\n this.div = null\n }\n }\n\n draw() {\n if (this.visible && this.div !== null && this.center) {\n const { x, y } = this.getPosFromLatLng(this.center)\n\n this.div.style.top = y + 'px'\n this.div.style.left = x + 'px'\n }\n }\n\n hide() {\n if (this.div) {\n this.div.style.display = 'none'\n }\n\n this.visible = false\n }\n\n show() {\n if (this.div && this.center) {\n let divTitle = ''\n\n // NOTE: values must be specified in px units\n const bp = this.backgroundPosition.split(' ')\n\n const spriteH = parseInt(bp[0].replace(/^\\s+|\\s+$/g, ''), 10)\n const spriteV = parseInt(bp[1].replace(/^\\s+|\\s+$/g, ''), 10)\n\n const pos = this.getPosFromLatLng(this.center)\n\n if (this.sums === null || typeof this.sums.title === 'undefined' || this.sums.title === '') {\n divTitle = this.cluster.getClusterer().getTitle()\n } else {\n divTitle = this.sums.title\n }\n\n this.div.style.cursor = 'pointer'\n this.div.style.position = 'absolute'\n this.div.style.top = `${pos.y}px`\n this.div.style.left = `${pos.x}px`\n this.div.style.width = `${this.width}px`\n this.div.style.height = `${this.height}px`\n\n const img = document.createElement('img')\n img.alt = divTitle\n img.src = this.url\n img.style.position = 'absolute'\n img.style.top = `${spriteV}px`\n img.style.left = `${spriteH}px`\n\n if (!this.cluster.getClusterer().enableRetinaIcons) {\n img.style.clip = `rect(-${spriteV}px, -${spriteH + this.width}px, -${spriteV + this.height}, -${spriteH})`\n }\n\n const textElm = document.createElement('div')\n textElm.style.position = 'absolute'\n textElm.style.top = `${this.anchorText[0]}px`\n textElm.style.left = `${this.anchorText[1]}px`\n textElm.style.color = this.textColor\n textElm.style.fontSize = `${this.textSize}px`\n textElm.style.fontFamily = this.fontFamily\n textElm.style.fontWeight = this.fontWeight\n textElm.style.fontStyle = this.fontStyle\n textElm.style.textDecoration = this.textDecoration\n textElm.style.textAlign = 'center'\n textElm.style.width = `${this.width}px`\n textElm.style.lineHeight = `${this.height}px`\n textElm.innerText = `${this.sums?.text}`\n\n this.div.innerHTML = ''\n this.div.appendChild(img)\n this.div.appendChild(textElm)\n this.div.title = divTitle\n this.div.style.display = ''\n }\n\n this.visible = true\n }\n\n useStyle(sums: ClusterIconInfo) {\n this.sums = sums\n const styles = this.cluster.getClusterer().getStyles()\n const style = styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))]\n\n this.url = style.url\n this.height = style.height\n this.width = style.width\n\n if (style.className) this.className = `${this.clusterClassName} ${style.className}`\n\n this.anchorText = style.anchorText || [0, 0]\n this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]\n\n this.textColor = style.textColor || 'black'\n\n this.textSize = style.textSize || 11\n\n this.textDecoration = style.textDecoration || 'none'\n\n this.fontWeight = style.fontWeight || 'bold'\n\n this.fontStyle = style.fontStyle || 'normal'\n\n this.fontFamily = style.fontFamily || 'Arial,sans-serif'\n\n this.backgroundPosition = style.backgroundPosition || '0 0'\n }\n\n setCenter(center: google.maps.LatLng) {\n this.center = center\n }\n\n getPosFromLatLng(latlng: google.maps.LatLng): google.maps.Point {\n // @ts-ignore\n const pos = this.getProjection().fromLatLngToDivPixel(latlng)\n\n pos.x -= this.anchorIcon[1]\n\n pos.y -= this.anchorIcon[0]\n\n // pos.x = pos.x\n\n // pos.y = pos.y\n\n return pos\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Clusterer } from './Clusterer'\n\nimport { ClusterIcon } from './ClusterIcon'\n\nimport { MarkerExtended } from './types'\n\nexport class Cluster {\n markerClusterer: Clusterer\n map: google.maps.Map | google.maps.StreetViewPanorama\n gridSize: number\n minClusterSize: number\n averageCenter: boolean\n markers: MarkerExtended[]\n center: google.maps.LatLng | undefined\n bounds: google.maps.LatLngBounds | null\n clusterIcon: ClusterIcon\n\n constructor(markerClusterer: Clusterer) {\n this.markerClusterer = markerClusterer\n // @ts-ignore\n this.map = this.markerClusterer.getMap()\n\n this.gridSize = this.markerClusterer.getGridSize()\n\n this.minClusterSize = this.markerClusterer.getMinimumClusterSize()\n\n this.averageCenter = this.markerClusterer.getAverageCenter()\n\n this.markers = []\n\n this.center = undefined\n\n this.bounds = null\n\n this.clusterIcon = new ClusterIcon(this, this.markerClusterer.getStyles())\n }\n\n getSize(): number {\n return this.markers.length\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getCenter(): google.maps.LatLng | undefined {\n return this.center\n }\n\n getMap(): google.maps.Map | google.maps.StreetViewPanorama {\n return this.map\n }\n\n getClusterer(): Clusterer {\n return this.markerClusterer\n }\n\n getBounds(): google.maps.LatLngBounds {\n const bounds = new google.maps.LatLngBounds(this.center, this.center)\n\n const markers = this.getMarkers()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n return bounds\n }\n\n remove() {\n // @ts-ignore\n this.clusterIcon.setMap(null)\n\n this.markers = []\n\n // @ts-ignore\n delete this.markers\n }\n\n addMarker(marker: MarkerExtended): boolean {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false\n }\n\n if (!this.center) {\n const position = marker.getPosition()\n\n if (position) {\n this.center = position\n\n this.calculateBounds()\n }\n } else {\n if (this.averageCenter) {\n const position = marker.getPosition()\n\n if (position) {\n const length = this.markers.length + 1\n\n this.center = new google.maps.LatLng(\n (this.center.lat() * (length - 1) + position.lat()) / length,\n (this.center.lng() * (length - 1) + position.lng()) / length\n )\n\n this.calculateBounds()\n }\n }\n }\n\n marker.isAdded = true\n\n this.markers.push(marker)\n\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount < this.minClusterSize) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount === this.minClusterSize) {\n // Hide the markers that were showing.\n for (let i = 0; i < mCount; i++) {\n this.markers[i].setMap(null)\n }\n } else {\n marker.setMap(null)\n }\n\n return true\n }\n\n isMarkerInClusterBounds(marker: MarkerExtended): boolean {\n if (this.bounds !== null) {\n const position = marker.getPosition()\n\n if (position) {\n return this.bounds.contains(position)\n }\n }\n\n return false\n }\n\n calculateBounds() {\n this.bounds = this.markerClusterer.getExtendedBounds(\n new google.maps.LatLngBounds(this.center, this.center)\n )\n }\n\n updateIcon() {\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n this.clusterIcon.hide()\n\n return\n }\n\n if (mCount < this.minClusterSize) {\n // Min cluster size not yet reached.\n this.clusterIcon.hide()\n\n return\n }\n\n if (this.center) {\n this.clusterIcon.setCenter(this.center)\n }\n\n this.clusterIcon.useStyle(\n this.markerClusterer.getCalculator()(this.markers, this.markerClusterer.getStyles().length)\n )\n\n this.clusterIcon.show()\n }\n\n isMarkerAlreadyAdded(marker: MarkerExtended): boolean {\n if (this.markers.includes) {\n return this.markers.includes(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n return true\n }\n }\n }\n\n return false\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport {\n MarkerExtended,\n ClustererOptions,\n ClusterIconStyle,\n TCalculator,\n ClusterIconInfo,\n} from './types'\n\n/**\n * Supports up to 9007199254740991 (Number.MAX_SAFE_INTEGER) markers\n * which is not a problem as max array length is 4294967296 (2**32)\n */\nconst CALCULATOR = function CALCULATOR(\n markers: MarkerExtended[],\n numStyles: number\n): ClusterIconInfo {\n const count = markers.length\n\n const numberOfDigits = count.toString().length\n\n const index = Math.min(numberOfDigits, numStyles)\n\n return {\n text: count.toString(),\n index,\n title: '',\n }\n}\n\nconst BATCH_SIZE = 2000\n\nconst BATCH_SIZE_IE = 500\n\nconst IMAGE_PATH =\n 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'\n\nconst IMAGE_EXTENSION = 'png'\n\nconst IMAGE_SIZES = [53, 56, 66, 78, 90]\n\nconst CLUSTERER_CLASS = 'cluster'\n\nexport class Clusterer {\n markers: MarkerExtended[]\n clusters: Cluster[]\n listeners: google.maps.MapsEventListener[]\n activeMap: google.maps.Map | google.maps.StreetViewPanorama | null\n ready: boolean\n gridSize: number\n minClusterSize: number\n maxZoom: number | null\n styles: ClusterIconStyle[]\n title: string\n zoomOnClick: boolean\n averageCenter: boolean\n ignoreHidden: boolean\n enableRetinaIcons: boolean\n imagePath: string\n imageExtension: string\n imageSizes: number[]\n calculator: TCalculator\n batchSize: number\n batchSizeIE: number\n clusterClass: string\n timerRefStatic: number | null\n\n constructor(\n map: google.maps.Map,\n optMarkers: MarkerExtended[] = [],\n optOptions: ClustererOptions = {}\n ) {\n this.extend(Clusterer, google.maps.OverlayView)\n\n this.markers = []\n this.clusters = []\n this.listeners = []\n this.activeMap = null\n this.ready = false\n this.gridSize = optOptions.gridSize || 60\n this.minClusterSize = optOptions.minimumClusterSize || 2\n this.maxZoom = optOptions.maxZoom || null\n this.styles = optOptions.styles || []\n\n this.title = optOptions.title || ''\n\n this.zoomOnClick = true\n\n if (optOptions.zoomOnClick !== undefined) {\n this.zoomOnClick = optOptions.zoomOnClick\n }\n\n this.averageCenter = false\n\n if (optOptions.averageCenter !== undefined) {\n this.averageCenter = optOptions.averageCenter\n }\n\n this.ignoreHidden = false\n\n if (optOptions.ignoreHidden !== undefined) {\n this.ignoreHidden = optOptions.ignoreHidden\n }\n\n this.enableRetinaIcons = false\n\n if (optOptions.enableRetinaIcons !== undefined) {\n this.enableRetinaIcons = optOptions.enableRetinaIcons\n }\n this.imagePath = optOptions.imagePath || IMAGE_PATH\n\n this.imageExtension = optOptions.imageExtension || IMAGE_EXTENSION\n\n this.imageSizes = optOptions.imageSizes || IMAGE_SIZES\n\n this.calculator = optOptions.calculator || CALCULATOR\n\n this.batchSize = optOptions.batchSize || BATCH_SIZE\n\n this.batchSizeIE = optOptions.batchSizeIE || BATCH_SIZE_IE\n\n this.clusterClass = optOptions.clusterClass || CLUSTERER_CLASS\n\n if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) {\n // Try to avoid IE timeout when processing a huge number of markers:\n this.batchSize = this.batchSizeIE\n }\n\n this.timerRefStatic = null\n\n this.setupStyles()\n\n this.addMarkers(optMarkers, true)\n // @ts-ignore\n this.setMap(map) // Note: this causes onAdd to be called\n }\n\n onAdd() {\n // @ts-ignore\n this.activeMap = this.getMap()\n\n this.ready = true\n\n this.repaint()\n\n // Add the map event listeners\n this.listeners = [\n google.maps.event.addListener(\n // @ts-ignore\n this.getMap(),\n 'zoom_changed',\n () => {\n this.resetViewport(false)\n // Workaround for this Google bug: when map is at level 0 and \"-\" of\n // zoom slider is clicked, a \"zoom_changed\" event is fired even though\n // the map doesn't zoom out any further. In this situation, no \"idle\"\n // event is triggered so the cluster markers that have been removed\n // do not get redrawn. Same goes for a zoom in at maxZoom.\n if (\n // @ts-ignore\n this.getMap().getZoom() === (this.get('minZoom') || 0) ||\n // @ts-ignore\n this.getMap().getZoom() === this.get('maxZoom')\n ) {\n google.maps.event.trigger(this, 'idle')\n }\n }\n ),\n google.maps.event.addListener(\n // @ts-ignore\n this.getMap(),\n 'idle',\n () => {\n this.redraw()\n }\n ),\n ]\n }\n\n onRemove() {\n // Put all the managed markers back on the map:\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].getMap() !== this.activeMap) {\n this.markers[i].setMap(this.activeMap)\n }\n }\n\n // Remove all clusters:\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Remove map event listeners:\n for (let i = 0; i < this.listeners.length; i++) {\n google.maps.event.removeListener(this.listeners[i])\n }\n\n this.listeners = []\n\n this.activeMap = null\n\n this.ready = false\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n draw() {}\n\n setupStyles() {\n if (this.styles.length > 0) {\n return\n }\n\n for (let i = 0; i < this.imageSizes.length; i++) {\n this.styles.push({\n url: this.imagePath + (i + 1) + '.' + this.imageExtension,\n height: this.imageSizes[i],\n width: this.imageSizes[i],\n })\n }\n }\n\n fitMapToMarkers() {\n const markers = this.getMarkers()\n\n const bounds = new google.maps.LatLngBounds()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n if (position) {\n bounds.extend(position)\n }\n }\n\n // @ts-ignore\n this.getMap().fitBounds(bounds)\n }\n\n getGridSize(): number {\n return this.gridSize\n }\n\n setGridSize(gridSize: number) {\n this.gridSize = gridSize\n }\n\n getMinimumClusterSize(): number {\n return this.minClusterSize\n }\n\n setMinimumClusterSize(minimumClusterSize: number) {\n this.minClusterSize = minimumClusterSize\n }\n\n getMaxZoom(): number | null {\n return this.maxZoom\n }\n\n setMaxZoom(maxZoom: number) {\n this.maxZoom = maxZoom\n }\n\n getStyles(): ClusterIconStyle[] {\n return this.styles\n }\n\n setStyles(styles: ClusterIconStyle[]) {\n this.styles = styles\n }\n\n getTitle(): string {\n return this.title\n }\n\n setTitle(title: string) {\n this.title = title\n }\n\n getZoomOnClick(): boolean {\n return this.zoomOnClick\n }\n\n setZoomOnClick(zoomOnClick: boolean) {\n this.zoomOnClick = zoomOnClick\n }\n\n getAverageCenter(): boolean {\n return this.averageCenter\n }\n\n setAverageCenter(averageCenter: boolean) {\n this.averageCenter = averageCenter\n }\n\n getIgnoreHidden(): boolean {\n return this.ignoreHidden\n }\n\n setIgnoreHidden(ignoreHidden: boolean) {\n this.ignoreHidden = ignoreHidden\n }\n\n getEnableRetinaIcons(): boolean {\n return this.enableRetinaIcons\n }\n\n setEnableRetinaIcons(enableRetinaIcons: boolean) {\n this.enableRetinaIcons = enableRetinaIcons\n }\n\n getImageExtension(): string {\n return this.imageExtension\n }\n\n setImageExtension(imageExtension: string) {\n this.imageExtension = imageExtension\n }\n\n getImagePath(): string {\n return this.imagePath\n }\n\n setImagePath(imagePath: string) {\n this.imagePath = imagePath\n }\n\n getImageSizes(): number[] {\n return this.imageSizes\n }\n\n setImageSizes(imageSizes: number[]) {\n this.imageSizes = imageSizes\n }\n\n getCalculator(): TCalculator {\n return this.calculator\n }\n\n setCalculator(calculator: TCalculator) {\n this.calculator = calculator\n }\n\n getBatchSizeIE(): number {\n return this.batchSizeIE\n }\n\n setBatchSizeIE(batchSizeIE: number) {\n this.batchSizeIE = batchSizeIE\n }\n\n getClusterClass(): string {\n return this.clusterClass\n }\n\n setClusterClass(clusterClass: string) {\n this.clusterClass = clusterClass\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getTotalMarkers(): number {\n return this.markers.length\n }\n\n getClusters(): Cluster[] {\n return this.clusters\n }\n\n getTotalClusters(): number {\n return this.clusters.length\n }\n\n addMarker(marker: MarkerExtended, optNoDraw: boolean) {\n this.pushMarkerTo(marker)\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n addMarkers(markers: MarkerExtended[], optNoDraw: boolean) {\n for (const key in markers) {\n if (Object.prototype.hasOwnProperty.call(markers, key)) {\n this.pushMarkerTo(markers[key])\n }\n }\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n pushMarkerTo(marker: MarkerExtended) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n google.maps.event.addListener(marker, 'dragend', () => {\n if (this.ready) {\n marker.isAdded = false\n\n this.repaint()\n }\n })\n }\n\n marker.isAdded = false\n\n this.markers.push(marker)\n }\n\n removeMarker_(marker: MarkerExtended): boolean {\n let index = -1\n\n if (this.markers.indexOf) {\n index = this.markers.indexOf(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n index = i\n\n break\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false\n }\n\n marker.setMap(null)\n\n this.markers.splice(index, 1) // Remove the marker from the list of managed markers\n\n return true\n }\n\n removeMarker(marker: MarkerExtended, optNoDraw: boolean): boolean {\n const removed = this.removeMarker_(marker)\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n removeMarkers(markers: MarkerExtended[], optNoDraw: boolean): boolean {\n let removed = false\n\n for (let i = 0; i < markers.length; i++) {\n removed = removed || this.removeMarker_(markers[i])\n }\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n clearMarkers() {\n this.resetViewport(true)\n\n this.markers = []\n }\n\n repaint() {\n const oldClusters = this.clusters.slice()\n\n this.clusters = []\n\n this.resetViewport(false)\n\n this.redraw()\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function timeout() {\n for (let i = 0; i < oldClusters.length; i++) {\n oldClusters[i].remove()\n }\n }, 0)\n }\n\n getExtendedBounds(bounds: google.maps.LatLngBounds): google.maps.LatLngBounds {\n // @ts-ignore\n const projection = this.getProjection()\n // Convert the points to pixels and the extend out by the grid size.\n const trPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng())\n )\n\n trPix.x += this.gridSize\n trPix.y -= this.gridSize\n\n const blPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())\n )\n\n blPix.x -= this.gridSize\n blPix.y += this.gridSize\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(\n // Convert the pixel points back to LatLng nw\n projection.fromDivPixelToLatLng(trPix)\n )\n\n bounds.extend(\n // Convert the pixel points back to LatLng sw\n projection.fromDivPixelToLatLng(blPix)\n )\n\n return bounds\n }\n\n redraw() {\n // Redraws all the clusters.\n this.createClusters(0)\n }\n\n resetViewport(optHide: boolean) {\n // Remove all the clusters\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Reset the markers to not be added and to be removed from the map.\n for (let i = 0; i < this.markers.length; i++) {\n const marker = this.markers[i]\n\n marker.isAdded = false\n\n if (optHide) {\n marker.setMap(null)\n }\n }\n }\n\n distanceBetweenPoints(p1: google.maps.LatLng, p2: google.maps.LatLng): number {\n const R = 6371 // Radius of the Earth in km\n\n const dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180\n const dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180\n\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n\n return R * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)))\n }\n\n isMarkerInBounds(marker: MarkerExtended, bounds: google.maps.LatLngBounds): boolean {\n const position = marker.getPosition()\n\n if (position) {\n return bounds.contains(position)\n }\n\n return false\n }\n\n addToClosestCluster(marker: MarkerExtended) {\n let cluster\n\n let distance = 40000 // Some large number\n\n let clusterToAddTo = null\n\n for (let i = 0; i < this.clusters.length; i++) {\n cluster = this.clusters[i]\n\n const center = cluster.getCenter()\n\n const position = marker.getPosition()\n\n if (center && position) {\n const d = this.distanceBetweenPoints(center, position)\n\n if (d < distance) {\n distance = d\n\n clusterToAddTo = cluster\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker)\n } else {\n cluster = new Cluster(this)\n\n cluster.addMarker(marker)\n\n this.clusters.push(cluster)\n }\n }\n\n createClusters(iFirst: number) {\n if (!this.ready) {\n return\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the <code>Clusterer</code> begins\n * clustering markers.\n * @name Clusterer#clusteringbegin\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringbegin', this)\n\n if (this.timerRefStatic !== null) {\n window.clearTimeout(this.timerRefStatic)\n\n // @ts-ignore\n delete this.timerRefStatic\n }\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n const mapBounds =\n // @ts-ignore\n this.getMap().getZoom() > 3\n ? new google.maps.LatLngBounds(\n // @ts-ignore\n this.getMap()\n .getBounds()\n .getSouthWest(),\n // @ts-ignore\n this.getMap()\n .getBounds()\n .getNorthEast()\n )\n : new google.maps.LatLngBounds(\n new google.maps.LatLng(85.02070771743472, -178.48388434375),\n new google.maps.LatLng(-85.08136444384544, 178.00048865625)\n )\n\n const bounds = this.getExtendedBounds(mapBounds)\n\n const iLast = Math.min(iFirst + this.batchSize, this.markers.length)\n\n for (let i = iFirst; i < iLast; i++) {\n const marker = this.markers[i]\n\n if (!marker.isAdded && this.isMarkerInBounds(marker, bounds)) {\n if (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible())) {\n this.addToClosestCluster(marker)\n }\n }\n }\n\n if (iLast < this.markers.length) {\n this.timerRefStatic = window.setTimeout(\n () => {\n this.createClusters(iLast)\n },\n 0\n )\n } else {\n this.timerRefStatic = null\n\n /**\n * This event is fired when the <code>Clusterer</code> stops\n * clustering markers.\n * @name Clusterer#clusteringend\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringend', this)\n\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].updateIcon()\n }\n }\n }\n\n extend(obj1: any, obj2: any): any {\n return function applyExtend(object: any) {\n // eslint-disable-next-line guard-for-in\n for (const property in object.prototype) {\n // @ts-ignore\n this.prototype[property] = object.prototype[property]\n }\n\n // @ts-ignore\n return this\n }.apply(obj1, [obj2])\n }\n}\n"],"names":["ClusterIcon","cluster","styles","getClusterer","extend","google","maps","OverlayView","this","clusterClassName","getClusterClass","className","center","undefined","div","sums","visible","boundsChangedListener","url","height","width","anchorText","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","setMap","getMap","prototype","onAdd","cMouseDownInCluster","cDraggingMapByCluster","_this","document","createElement","show","getPanes","overlayMouseTarget","appendChild","event","addListener","addDomListener","markerClusterer_1","trigger","getZoomOnClick","maxZoom_1","getMaxZoom","bounds_1","getBounds","fitBounds","setTimeout","getZoom","setZoom","cancelBubble","stopPropagation","onRemove","parentNode","hide","removeListener","clearInstanceListeners","removeChild","draw","_a","getPosFromLatLng","x","y","style","top","left","display","divTitle","bp","split","spriteH","parseInt","replace","spriteV","pos","title","getTitle","cursor","position","concat","img","alt","src","enableRetinaIcons","clip","textElm","color","fontSize","textAlign","lineHeight","innerText","text","innerHTML","useStyle","getStyles","Math","min","length","max","index","setCenter","latlng","getProjection","fromLatLngToDivPixel","Cluster","markerClusterer","map","gridSize","getGridSize","minClusterSize","getMinimumClusterSize","averageCenter","getAverageCenter","markers","bounds","clusterIcon","getSize","getMarkers","getCenter","LatLngBounds","i","getPosition","remove","addMarker","marker","isMarkerAlreadyAdded","length_1","LatLng","lat","lng","calculateBounds","isAdded","push","mCount","maxZoom","zoom","isMarkerInClusterBounds","contains","getExtendedBounds","updateIcon","getCalculator","includes","CALCULATOR","numStyles","count","numberOfDigits","toString","IMAGE_SIZES","Clusterer","optMarkers","optOptions","clusters","listeners","activeMap","ready","minimumClusterSize","zoomOnClick","ignoreHidden","imagePath","imageExtension","imageSizes","calculator","batchSize","batchSizeIE","clusterClass","navigator","userAgent","toLowerCase","indexOf","timerRefStatic","setupStyles","addMarkers","repaint","resetViewport","get","redraw","fitMapToMarkers","setGridSize","setMinimumClusterSize","setMaxZoom","setStyles","setTitle","setZoomOnClick","setAverageCenter","getIgnoreHidden","setIgnoreHidden","getEnableRetinaIcons","setEnableRetinaIcons","getImageExtension","setImageExtension","getImagePath","setImagePath","getImageSizes","setImageSizes","setCalculator","getBatchSizeIE","setBatchSizeIE","setClusterClass","getTotalMarkers","getClusters","getTotalClusters","optNoDraw","pushMarkerTo","key","Object","hasOwnProperty","call","getDraggable","removeMarker_","splice","removeMarker","removed","removeMarkers","clearMarkers","oldClusters","slice","projection","trPix","getNorthEast","blPix","getSouthWest","fromDivPixelToLatLng","createClusters","optHide","distanceBetweenPoints","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","isMarkerInBounds","addToClosestCluster","distance","clusterToAddTo","d","iFirst","window","clearTimeout","mapBounds","iLast","getVisible","obj1","obj2","object","property","apply"],"mappings":"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"}
1
+ {"version":3,"file":"umd.min.js","sources":["../src/ClusterIcon.tsx","../src/Cluster.tsx","../src/Clusterer.tsx"],"sourcesContent":["/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport { ClusterIconStyle, ClusterIconInfo } from './types'\n\nexport class ClusterIcon {\n cluster: Cluster\n className: string\n clusterClassName: string\n styles: ClusterIconStyle[]\n center: google.maps.LatLng | undefined\n div: HTMLDivElement | null\n sums: ClusterIconInfo | null\n visible: boolean\n url: string\n height: number\n width: number\n anchorText: number[]\n anchorIcon: number[]\n textColor: string\n textSize: number\n textDecoration: string\n fontWeight: string\n fontStyle: string\n fontFamily: string\n backgroundPosition: string\n cMouseDownInCluster: boolean | null\n cDraggingMapByCluster: boolean | null\n timeOut: number | null\n\n boundsChangedListener: google.maps.MapsEventListener | null\n\n constructor(cluster: Cluster, styles: ClusterIconStyle[]) {\n cluster.getClusterer().extend(ClusterIcon, google.maps.OverlayView)\n this.cluster = cluster\n this.clusterClassName = this.cluster.getClusterer().getClusterClass()\n this.className = this.clusterClassName\n this.styles = styles\n this.center = undefined\n this.div = null\n this.sums = null\n this.visible = false\n this.boundsChangedListener = null\n this.url = ''\n this.height = 0\n this.width = 0\n this.anchorText = [0, 0]\n this.anchorIcon = [0, 0]\n this.textColor = 'black'\n this.textSize = 11\n this.textDecoration = 'none'\n this.fontWeight = 'bold'\n this.fontStyle = 'normal'\n this.fontFamily = 'Arial,sans-serif'\n this.backgroundPosition = '0 0'\n\n this.cMouseDownInCluster = null\n this.cDraggingMapByCluster = null\n this.timeOut = null\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.setMap(cluster.getMap()) // Note: this causes onAdd to be called\n }\n\n onBoundsChanged() {\n this.cDraggingMapByCluster = this.cMouseDownInCluster\n }\n\n onMouseDown() {\n this.cMouseDownInCluster = true\n\n this.cDraggingMapByCluster = false\n }\n\n onClick(event: Event) {\n this.cMouseDownInCluster = false\n\n if (!this.cDraggingMapByCluster) {\n const markerClusterer = this.cluster.getClusterer()\n\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(markerClusterer, 'click', this.cluster)\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster) // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (markerClusterer.getZoomOnClick()) {\n // Zoom into the cluster.\n const maxZoom = markerClusterer.getMaxZoom()\n\n const bounds = this.cluster.getBounds()\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n markerClusterer.getMap().fitBounds(bounds)\n\n // There is a fix for Issue 170 here:\n this.timeOut = window.setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n markerClusterer.getMap().fitBounds(bounds)\n\n // Don't zoom beyond the max zoom level\n if (\n maxZoom !== null &&\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n markerClusterer.getMap().getZoom() > maxZoom\n ) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n markerClusterer.getMap().setZoom(maxZoom + 1)\n }\n }, 100)\n }\n\n // Prevent event propagation to the map:\n event.cancelBubble = true\n\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n }\n }\n\n onMouseOver() {\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseover',\n this.cluster\n )\n }\n\n onMouseOut() {\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseout',\n this.cluster\n )\n }\n\n onAdd() {\n this.div = document.createElement('div')\n this.div.className = this.className\n if (this.visible) {\n this.show()\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getPanes().overlayMouseTarget.appendChild(this.div)\n // Fix for Issue 157\n this.boundsChangedListener = google.maps.event.addListener(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getMap(),\n 'bounds_changed',\n this.onBoundsChanged\n )\n\n this.div.addEventListener('mousedown', this.onMouseDown)\n\n this.div.addEventListener('click', this.onClick)\n\n this.div.addEventListener('mouseover', this.onMouseOver)\n\n this.div.addEventListener('mouseout', this.onMouseOut)\n }\n\n onRemove() {\n if (this.div && this.div.parentNode) {\n this.hide()\n\n if (this.boundsChangedListener !== null) {\n google.maps.event.removeListener(this.boundsChangedListener)\n }\n\n this.div.removeEventListener('mousedown', this.onMouseDown)\n\n this.div.removeEventListener('click', this.onClick)\n\n this.div.removeEventListener('mouseover', this.onMouseOver)\n\n this.div.removeEventListener('mouseout', this.onMouseOut)\n\n this.div.parentNode.removeChild(this.div)\n\n if (this.timeOut !== null) {\n window.clearTimeout(this.timeOut)\n\n this.timeOut = null\n }\n\n this.div = null\n }\n }\n\n draw() {\n if (this.visible && this.div !== null && this.center) {\n const { x, y } = this.getPosFromLatLng(this.center)\n\n this.div.style.top = `${y}px`\n this.div.style.left = `${x}px`\n }\n }\n\n hide() {\n if (this.div) {\n this.div.style.display = 'none'\n }\n\n this.visible = false\n }\n\n show() {\n if (this.div && this.center) {\n let divTitle = ''\n\n // NOTE: values must be specified in px units\n const bp = this.backgroundPosition.split(' ')\n\n const spriteH = parseInt(bp[0].replace(/^\\s+|\\s+$/g, ''), 10)\n const spriteV = parseInt(bp[1].replace(/^\\s+|\\s+$/g, ''), 10)\n\n const pos = this.getPosFromLatLng(this.center)\n\n if (\n this.sums === null ||\n typeof this.sums.title === 'undefined' ||\n this.sums.title === ''\n ) {\n divTitle = this.cluster.getClusterer().getTitle()\n } else {\n divTitle = this.sums.title\n }\n\n this.div.style.cursor = 'pointer'\n this.div.style.position = 'absolute'\n this.div.style.top = `${pos.y}px`\n this.div.style.left = `${pos.x}px`\n this.div.style.width = `${this.width}px`\n this.div.style.height = `${this.height}px`\n\n const img = document.createElement('img')\n img.alt = divTitle\n img.src = this.url\n img.style.position = 'absolute'\n img.style.top = `${spriteV}px`\n img.style.left = `${spriteH}px`\n\n if (!this.cluster.getClusterer().enableRetinaIcons) {\n img.style.clip = `rect(-${spriteV}px, -${spriteH + this.width}px, -${\n spriteV + this.height\n }, -${spriteH})`\n }\n\n const textElm = document.createElement('div')\n\n textElm.style.position = 'absolute'\n textElm.style.top = `${this.anchorText[0]}px`\n textElm.style.left = `${this.anchorText[1]}px`\n textElm.style.color = this.textColor\n textElm.style.fontSize = `${this.textSize}px`\n textElm.style.fontFamily = this.fontFamily\n textElm.style.fontWeight = this.fontWeight\n textElm.style.fontStyle = this.fontStyle\n textElm.style.textDecoration = this.textDecoration\n textElm.style.textAlign = 'center'\n textElm.style.width = `${this.width}px`\n textElm.style.lineHeight = `${this.height}px`\n textElm.innerText = `${this.sums?.text}`\n\n this.div.innerHTML = ''\n\n this.div.appendChild(img)\n this.div.appendChild(textElm)\n\n this.div.title = divTitle\n\n this.div.style.display = ''\n }\n\n this.visible = true\n }\n\n useStyle(sums: ClusterIconInfo) {\n this.sums = sums\n\n const styles = this.cluster.getClusterer().getStyles()\n\n const style =\n styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))]\n\n this.url = style.url\n this.height = style.height\n this.width = style.width\n\n if (style.className)\n this.className = `${this.clusterClassName} ${style.className}`\n\n this.anchorText = style.anchorText || [0, 0]\n this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]\n\n this.textColor = style.textColor || 'black'\n\n this.textSize = style.textSize || 11\n\n this.textDecoration = style.textDecoration || 'none'\n\n this.fontWeight = style.fontWeight || 'bold'\n\n this.fontStyle = style.fontStyle || 'normal'\n\n this.fontFamily = style.fontFamily || 'Arial,sans-serif'\n\n this.backgroundPosition = style.backgroundPosition || '0 0'\n }\n\n setCenter(center: google.maps.LatLng) {\n this.center = center\n }\n\n getPosFromLatLng(latlng: google.maps.LatLng): google.maps.Point {\n // @ts-ignore\n const pos = this.getProjection().fromLatLngToDivPixel(latlng)\n\n pos.x -= this.anchorIcon[1]\n\n pos.y -= this.anchorIcon[0]\n\n return pos\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Clusterer } from './Clusterer'\n\nimport { ClusterIcon } from './ClusterIcon'\n\nimport { MarkerExtended } from './types'\n\nexport class Cluster {\n markerClusterer: Clusterer\n map: google.maps.Map | google.maps.StreetViewPanorama\n gridSize: number\n minClusterSize: number\n averageCenter: boolean\n markers: MarkerExtended[]\n center: google.maps.LatLng | undefined\n bounds: google.maps.LatLngBounds | null\n clusterIcon: ClusterIcon\n\n constructor(markerClusterer: Clusterer) {\n this.markerClusterer = markerClusterer\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.map = this.markerClusterer.getMap()\n\n this.gridSize = this.markerClusterer.getGridSize()\n\n this.minClusterSize = this.markerClusterer.getMinimumClusterSize()\n\n this.averageCenter = this.markerClusterer.getAverageCenter()\n\n this.markers = []\n\n this.center = undefined\n\n this.bounds = null\n\n this.clusterIcon = new ClusterIcon(this, this.markerClusterer.getStyles())\n }\n\n getSize(): number {\n return this.markers.length\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getCenter(): google.maps.LatLng | undefined {\n return this.center\n }\n\n getMap(): google.maps.Map | google.maps.StreetViewPanorama {\n return this.map\n }\n\n getClusterer(): Clusterer {\n return this.markerClusterer\n }\n\n getBounds(): google.maps.LatLngBounds {\n const bounds = new google.maps.LatLngBounds(this.center, this.center)\n\n const markers = this.getMarkers()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n return bounds\n }\n\n remove() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.clusterIcon.setMap(null)\n\n this.markers = []\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.markers\n }\n\n addMarker(marker: MarkerExtended): boolean {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false\n }\n\n if (!this.center) {\n const position = marker.getPosition()\n\n if (position) {\n this.center = position\n\n this.calculateBounds()\n }\n } else {\n if (this.averageCenter) {\n const position = marker.getPosition()\n\n if (position) {\n const length = this.markers.length + 1\n\n this.center = new google.maps.LatLng(\n (this.center.lat() * (length - 1) + position.lat()) / length,\n (this.center.lng() * (length - 1) + position.lng()) / length\n )\n\n this.calculateBounds()\n }\n }\n }\n\n marker.isAdded = true\n\n this.markers.push(marker)\n\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount < this.minClusterSize) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount === this.minClusterSize) {\n // Hide the markers that were showing.\n for (let i = 0; i < mCount; i++) {\n this.markers[i].setMap(null)\n }\n } else {\n marker.setMap(null)\n }\n\n return true\n }\n\n isMarkerInClusterBounds(marker: MarkerExtended): boolean {\n if (this.bounds !== null) {\n const position = marker.getPosition()\n\n if (position) {\n return this.bounds.contains(position)\n }\n }\n\n return false\n }\n\n calculateBounds() {\n this.bounds = this.markerClusterer.getExtendedBounds(\n new google.maps.LatLngBounds(this.center, this.center)\n )\n }\n\n updateIcon() {\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n this.clusterIcon.hide()\n\n return\n }\n\n if (mCount < this.minClusterSize) {\n // Min cluster size not yet reached.\n this.clusterIcon.hide()\n\n return\n }\n\n if (this.center) {\n this.clusterIcon.setCenter(this.center)\n }\n\n this.clusterIcon.useStyle(\n this.markerClusterer.getCalculator()(this.markers, this.markerClusterer.getStyles().length)\n )\n\n this.clusterIcon.show()\n }\n\n isMarkerAlreadyAdded(marker: MarkerExtended): boolean {\n if (this.markers.includes) {\n return this.markers.includes(marker)\n }\n\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n return true\n }\n }\n\n return false\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport {\n MarkerExtended,\n ClustererOptions,\n ClusterIconStyle,\n TCalculator,\n ClusterIconInfo,\n} from './types'\n\n/**\n * Supports up to 9007199254740991 (Number.MAX_SAFE_INTEGER) markers\n * which is not a problem as max array length is 4294967296 (2**32)\n */\nconst CALCULATOR = function CALCULATOR(\n markers: MarkerExtended[],\n numStyles: number\n): ClusterIconInfo {\n const count = markers.length\n\n const numberOfDigits = count.toString().length\n\n const index = Math.min(numberOfDigits, numStyles)\n\n return {\n text: count.toString(),\n index,\n title: '',\n }\n}\n\nconst BATCH_SIZE = 2000\n\nconst BATCH_SIZE_IE = 500\n\nconst IMAGE_PATH =\n 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'\n\nconst IMAGE_EXTENSION = 'png'\n\nconst IMAGE_SIZES = [53, 56, 66, 78, 90]\n\nconst CLUSTERER_CLASS = 'cluster'\n\nexport class Clusterer {\n markers: MarkerExtended[]\n clusters: Cluster[]\n listeners: google.maps.MapsEventListener[]\n activeMap: google.maps.Map | google.maps.StreetViewPanorama | null\n ready: boolean\n gridSize: number\n minClusterSize: number\n maxZoom: number | null\n styles: ClusterIconStyle[]\n title: string\n zoomOnClick: boolean\n averageCenter: boolean\n ignoreHidden: boolean\n enableRetinaIcons: boolean\n imagePath: string\n imageExtension: string\n imageSizes: number[]\n calculator: TCalculator\n batchSize: number\n batchSizeIE: number\n clusterClass: string\n timerRefStatic: number | null\n\n constructor(\n map: google.maps.Map,\n optMarkers: MarkerExtended[] = [],\n optOptions: ClustererOptions = {}\n ) {\n this.extend(Clusterer, google.maps.OverlayView)\n\n this.markers = []\n this.clusters = []\n this.listeners = []\n this.activeMap = null\n this.ready = false\n this.gridSize = optOptions.gridSize || 60\n this.minClusterSize = optOptions.minimumClusterSize || 2\n this.maxZoom = optOptions.maxZoom || null\n this.styles = optOptions.styles || []\n\n this.title = optOptions.title || ''\n\n this.zoomOnClick = true\n\n if (optOptions.zoomOnClick !== undefined) {\n this.zoomOnClick = optOptions.zoomOnClick\n }\n\n this.averageCenter = false\n\n if (optOptions.averageCenter !== undefined) {\n this.averageCenter = optOptions.averageCenter\n }\n\n this.ignoreHidden = false\n\n if (optOptions.ignoreHidden !== undefined) {\n this.ignoreHidden = optOptions.ignoreHidden\n }\n\n this.enableRetinaIcons = false\n\n if (optOptions.enableRetinaIcons !== undefined) {\n this.enableRetinaIcons = optOptions.enableRetinaIcons\n }\n this.imagePath = optOptions.imagePath || IMAGE_PATH\n\n this.imageExtension = optOptions.imageExtension || IMAGE_EXTENSION\n\n this.imageSizes = optOptions.imageSizes || IMAGE_SIZES\n\n this.calculator = optOptions.calculator || CALCULATOR\n\n this.batchSize = optOptions.batchSize || BATCH_SIZE\n\n this.batchSizeIE = optOptions.batchSizeIE || BATCH_SIZE_IE\n\n this.clusterClass = optOptions.clusterClass || CLUSTERER_CLASS\n\n if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) {\n // Try to avoid IE timeout when processing a huge number of markers:\n this.batchSize = this.batchSizeIE\n }\n\n this.timerRefStatic = null\n\n this.setupStyles()\n\n this.addMarkers(optMarkers, true)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.setMap(map) // Note: this causes onAdd to be called\n }\n\n onAdd() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.activeMap = this.getMap()\n\n this.ready = true\n\n this.repaint()\n\n // Add the map event listeners\n this.listeners = [\n google.maps.event.addListener(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getMap(),\n 'zoom_changed',\n () => {\n this.resetViewport(false)\n // Workaround for this Google bug: when map is at level 0 and \"-\" of\n // zoom slider is clicked, a \"zoom_changed\" event is fired even though\n // the map doesn't zoom out any further. In this situation, no \"idle\"\n // event is triggered so the cluster markers that have been removed\n // do not get redrawn. Same goes for a zoom in at maxZoom.\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getMap().getZoom() === (this.get('minZoom') || 0) ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getMap().getZoom() === this.get('maxZoom')\n ) {\n google.maps.event.trigger(this, 'idle')\n }\n }\n ),\n google.maps.event.addListener(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getMap(),\n 'idle',\n () => {\n this.redraw()\n }\n ),\n ]\n }\n\n onRemove() {\n // Put all the managed markers back on the map:\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].getMap() !== this.activeMap) {\n this.markers[i].setMap(this.activeMap)\n }\n }\n\n // Remove all clusters:\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Remove map event listeners:\n for (let i = 0; i < this.listeners.length; i++) {\n google.maps.event.removeListener(this.listeners[i])\n }\n\n this.listeners = []\n\n this.activeMap = null\n\n this.ready = false\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n draw() {}\n\n setupStyles() {\n if (this.styles.length > 0) {\n return\n }\n\n for (let i = 0; i < this.imageSizes.length; i++) {\n this.styles.push({\n url: this.imagePath + (i + 1) + '.' + this.imageExtension,\n height: this.imageSizes[i],\n width: this.imageSizes[i],\n })\n }\n }\n\n fitMapToMarkers() {\n const markers = this.getMarkers()\n\n const bounds = new google.maps.LatLngBounds()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n if (position) {\n bounds.extend(position)\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getMap().fitBounds(bounds)\n }\n\n getGridSize(): number {\n return this.gridSize\n }\n\n setGridSize(gridSize: number) {\n this.gridSize = gridSize\n }\n\n getMinimumClusterSize(): number {\n return this.minClusterSize\n }\n\n setMinimumClusterSize(minimumClusterSize: number) {\n this.minClusterSize = minimumClusterSize\n }\n\n getMaxZoom(): number | null {\n return this.maxZoom\n }\n\n setMaxZoom(maxZoom: number) {\n this.maxZoom = maxZoom\n }\n\n getStyles(): ClusterIconStyle[] {\n return this.styles\n }\n\n setStyles(styles: ClusterIconStyle[]) {\n this.styles = styles\n }\n\n getTitle(): string {\n return this.title\n }\n\n setTitle(title: string) {\n this.title = title\n }\n\n getZoomOnClick(): boolean {\n return this.zoomOnClick\n }\n\n setZoomOnClick(zoomOnClick: boolean) {\n this.zoomOnClick = zoomOnClick\n }\n\n getAverageCenter(): boolean {\n return this.averageCenter\n }\n\n setAverageCenter(averageCenter: boolean) {\n this.averageCenter = averageCenter\n }\n\n getIgnoreHidden(): boolean {\n return this.ignoreHidden\n }\n\n setIgnoreHidden(ignoreHidden: boolean) {\n this.ignoreHidden = ignoreHidden\n }\n\n getEnableRetinaIcons(): boolean {\n return this.enableRetinaIcons\n }\n\n setEnableRetinaIcons(enableRetinaIcons: boolean) {\n this.enableRetinaIcons = enableRetinaIcons\n }\n\n getImageExtension(): string {\n return this.imageExtension\n }\n\n setImageExtension(imageExtension: string) {\n this.imageExtension = imageExtension\n }\n\n getImagePath(): string {\n return this.imagePath\n }\n\n setImagePath(imagePath: string) {\n this.imagePath = imagePath\n }\n\n getImageSizes(): number[] {\n return this.imageSizes\n }\n\n setImageSizes(imageSizes: number[]) {\n this.imageSizes = imageSizes\n }\n\n getCalculator(): TCalculator {\n return this.calculator\n }\n\n setCalculator(calculator: TCalculator) {\n this.calculator = calculator\n }\n\n getBatchSizeIE(): number {\n return this.batchSizeIE\n }\n\n setBatchSizeIE(batchSizeIE: number) {\n this.batchSizeIE = batchSizeIE\n }\n\n getClusterClass(): string {\n return this.clusterClass\n }\n\n setClusterClass(clusterClass: string) {\n this.clusterClass = clusterClass\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getTotalMarkers(): number {\n return this.markers.length\n }\n\n getClusters(): Cluster[] {\n return this.clusters\n }\n\n getTotalClusters(): number {\n return this.clusters.length\n }\n\n addMarker(marker: MarkerExtended, optNoDraw: boolean) {\n this.pushMarkerTo(marker)\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n addMarkers(markers: MarkerExtended[], optNoDraw: boolean) {\n for (const key in markers) {\n if (Object.prototype.hasOwnProperty.call(markers, key)) {\n this.pushMarkerTo(markers[key])\n }\n }\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n pushMarkerTo(marker: MarkerExtended) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n google.maps.event.addListener(marker, 'dragend', () => {\n if (this.ready) {\n marker.isAdded = false\n\n this.repaint()\n }\n })\n }\n\n marker.isAdded = false\n\n this.markers.push(marker)\n }\n\n removeMarker_(marker: MarkerExtended): boolean {\n let index = -1\n\n if (this.markers.indexOf) {\n index = this.markers.indexOf(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n index = i\n\n break\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false\n }\n\n marker.setMap(null)\n\n this.markers.splice(index, 1) // Remove the marker from the list of managed markers\n\n return true\n }\n\n removeMarker(marker: MarkerExtended, optNoDraw: boolean): boolean {\n const removed = this.removeMarker_(marker)\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n removeMarkers(markers: MarkerExtended[], optNoDraw: boolean): boolean {\n let removed = false\n\n for (let i = 0; i < markers.length; i++) {\n removed = removed || this.removeMarker_(markers[i])\n }\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n clearMarkers() {\n this.resetViewport(true)\n\n this.markers = []\n }\n\n repaint() {\n const oldClusters = this.clusters.slice()\n\n this.clusters = []\n\n this.resetViewport(false)\n\n this.redraw()\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function timeout() {\n for (let i = 0; i < oldClusters.length; i++) {\n oldClusters[i].remove()\n }\n }, 0)\n }\n\n getExtendedBounds(bounds: google.maps.LatLngBounds): google.maps.LatLngBounds {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const projection = this.getProjection()\n // Convert the points to pixels and the extend out by the grid size.\n const trPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng())\n )\n\n trPix.x += this.gridSize\n trPix.y -= this.gridSize\n\n const blPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())\n )\n\n blPix.x -= this.gridSize\n blPix.y += this.gridSize\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(\n // Convert the pixel points back to LatLng nw\n projection.fromDivPixelToLatLng(trPix)\n )\n\n bounds.extend(\n // Convert the pixel points back to LatLng sw\n projection.fromDivPixelToLatLng(blPix)\n )\n\n return bounds\n }\n\n redraw() {\n // Redraws all the clusters.\n this.createClusters(0)\n }\n\n resetViewport(optHide: boolean) {\n // Remove all the clusters\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Reset the markers to not be added and to be removed from the map.\n for (let i = 0; i < this.markers.length; i++) {\n const marker = this.markers[i]\n\n marker.isAdded = false\n\n if (optHide) {\n marker.setMap(null)\n }\n }\n }\n\n distanceBetweenPoints(p1: google.maps.LatLng, p2: google.maps.LatLng): number {\n const R = 6371 // Radius of the Earth in km\n\n const dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180\n const dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180\n\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n\n return R * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)))\n }\n\n isMarkerInBounds(marker: MarkerExtended, bounds: google.maps.LatLngBounds): boolean {\n const position = marker.getPosition()\n\n if (position) {\n return bounds.contains(position)\n }\n\n return false\n }\n\n addToClosestCluster(marker: MarkerExtended) {\n let cluster\n\n let distance = 40000 // Some large number\n\n let clusterToAddTo = null\n\n for (let i = 0; i < this.clusters.length; i++) {\n cluster = this.clusters[i]\n\n const center = cluster.getCenter()\n\n const position = marker.getPosition()\n\n if (center && position) {\n const d = this.distanceBetweenPoints(center, position)\n\n if (d < distance) {\n distance = d\n\n clusterToAddTo = cluster\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker)\n } else {\n cluster = new Cluster(this)\n\n cluster.addMarker(marker)\n\n this.clusters.push(cluster)\n }\n }\n\n createClusters(iFirst: number) {\n if (!this.ready) {\n return\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the <code>Clusterer</code> begins\n * clustering markers.\n * @name Clusterer#clusteringbegin\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringbegin', this)\n\n if (this.timerRefStatic !== null) {\n window.clearTimeout(this.timerRefStatic)\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.timerRefStatic\n }\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n const mapBounds =\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getMap().getZoom() > 3\n ? new google.maps.LatLngBounds(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getMap()\n .getBounds()\n .getSouthWest(),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.getMap()\n .getBounds()\n .getNorthEast()\n )\n : new google.maps.LatLngBounds(\n new google.maps.LatLng(85.02070771743472, -178.48388434375),\n new google.maps.LatLng(-85.08136444384544, 178.00048865625)\n )\n\n const bounds = this.getExtendedBounds(mapBounds)\n\n const iLast = Math.min(iFirst + this.batchSize, this.markers.length)\n\n for (let i = iFirst; i < iLast; i++) {\n const marker = this.markers[i]\n\n if (!marker.isAdded && this.isMarkerInBounds(marker, bounds) && (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible()))) {\n this.addToClosestCluster(marker)\n }\n }\n\n if (iLast < this.markers.length) {\n this.timerRefStatic = window.setTimeout(\n () => {\n this.createClusters(iLast)\n },\n 0\n )\n } else {\n this.timerRefStatic = null\n\n /**\n * This event is fired when the <code>Clusterer</code> stops\n * clustering markers.\n * @name Clusterer#clusteringend\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringend', this)\n\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].updateIcon()\n }\n }\n }\n\n extend(obj1: any, obj2: any): any {\n return function applyExtend(object: any) {\n // eslint-disable-next-line guard-for-in\n for (const property in object.prototype) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.prototype[property] = object.prototype[property]\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return this\n }.apply(obj1, [obj2])\n }\n}\n"],"names":["ClusterIcon","cluster","styles","getClusterer","extend","google","maps","OverlayView","this","clusterClassName","getClusterClass","className","center","undefined","div","sums","visible","boundsChangedListener","url","height","width","anchorText","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","cMouseDownInCluster","cDraggingMapByCluster","timeOut","setMap","getMap","prototype","onBoundsChanged","onMouseDown","onClick","event","markerClusterer_1","trigger","getZoomOnClick","maxZoom_1","getMaxZoom","bounds_1","getBounds","fitBounds","window","setTimeout","getZoom","setZoom","cancelBubble","stopPropagation","onMouseOver","onMouseOut","onAdd","document","createElement","show","getPanes","overlayMouseTarget","appendChild","addListener","addEventListener","onRemove","parentNode","hide","removeListener","removeEventListener","removeChild","clearTimeout","draw","_a","getPosFromLatLng","x","y","style","top","concat","left","display","divTitle","bp","split","spriteH","parseInt","replace","spriteV","pos","title","getTitle","cursor","position","img","alt","src","enableRetinaIcons","clip","textElm","color","fontSize","textAlign","lineHeight","innerText","text","innerHTML","useStyle","getStyles","Math","min","length","max","index","setCenter","latlng","getProjection","fromLatLngToDivPixel","Cluster","markerClusterer","map","gridSize","getGridSize","minClusterSize","getMinimumClusterSize","averageCenter","getAverageCenter","markers","bounds","clusterIcon","getSize","getMarkers","getCenter","LatLngBounds","i","getPosition","remove","addMarker","marker","isMarkerAlreadyAdded","length_1","LatLng","lat","lng","calculateBounds","isAdded","push","mCount","maxZoom","zoom","isMarkerInClusterBounds","contains","getExtendedBounds","updateIcon","getCalculator","includes","CALCULATOR","numStyles","count","numberOfDigits","toString","IMAGE_SIZES","Clusterer","optMarkers","optOptions","clusters","listeners","activeMap","ready","minimumClusterSize","zoomOnClick","ignoreHidden","imagePath","imageExtension","imageSizes","calculator","batchSize","batchSizeIE","clusterClass","navigator","userAgent","toLowerCase","indexOf","timerRefStatic","setupStyles","addMarkers","_this","repaint","resetViewport","get","redraw","fitMapToMarkers","setGridSize","setMinimumClusterSize","setMaxZoom","setStyles","setTitle","setZoomOnClick","setAverageCenter","getIgnoreHidden","setIgnoreHidden","getEnableRetinaIcons","setEnableRetinaIcons","getImageExtension","setImageExtension","getImagePath","setImagePath","getImageSizes","setImageSizes","setCalculator","getBatchSizeIE","setBatchSizeIE","setClusterClass","getTotalMarkers","getClusters","getTotalClusters","optNoDraw","pushMarkerTo","key","Object","hasOwnProperty","call","getDraggable","removeMarker_","splice","removeMarker","removed","removeMarkers","clearMarkers","oldClusters","slice","projection","trPix","getNorthEast","blPix","getSouthWest","fromDivPixelToLatLng","createClusters","optHide","distanceBetweenPoints","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","isMarkerInBounds","addToClosestCluster","distance","clusterToAddTo","d","iFirst","mapBounds","iLast","getVisible","obj1","obj2","object","property","apply"],"mappings":"uPAMA,IAAAA,EAAA,WA2BE,SAAYA,EAAAC,EAAkBC,GAC5BD,EAAQE,eAAeC,OAAOJ,EAAaK,OAAOC,KAAKC,aACvDC,KAAKP,QAAUA,EACfO,KAAKC,iBAAmBD,KAAKP,QAAQE,eAAeO,kBACpDF,KAAKG,UAAYH,KAAKC,iBACtBD,KAAKN,OAASA,EACdM,KAAKI,YAASC,EACdL,KAAKM,IAAM,KACXN,KAAKO,KAAO,KACZP,KAAKQ,SAAU,EACfR,KAAKS,sBAAwB,KAC7BT,KAAKU,IAAM,GACXV,KAAKW,OAAS,EACdX,KAAKY,MAAQ,EACbZ,KAAKa,WAAa,CAAC,EAAG,GACtBb,KAAKc,WAAa,CAAC,EAAG,GACtBd,KAAKe,UAAY,QACjBf,KAAKgB,SAAW,GAChBhB,KAAKiB,eAAiB,OACtBjB,KAAKkB,WAAa,OAClBlB,KAAKmB,UAAY,SACjBnB,KAAKoB,WAAa,mBAClBpB,KAAKqB,mBAAqB,MAE1BrB,KAAKsB,oBAAsB,KAC3BtB,KAAKuB,sBAAwB,KAC7BvB,KAAKwB,QAAU,KAGfxB,KAAKyB,OAAOhC,EAAQiC,UAgSxB,OA7RElC,EAAAmC,UAAAC,gBAAA,WACE5B,KAAKuB,sBAAwBvB,KAAKsB,qBAGpC9B,EAAAmC,UAAAE,YAAA,WACE7B,KAAKsB,qBAAsB,EAE3BtB,KAAKuB,uBAAwB,GAG/B/B,EAAOmC,UAAAG,QAAP,SAAQC,GAGN,GAFA/B,KAAKsB,qBAAsB,GAEtBtB,KAAKuB,sBAAuB,CAC/B,IAAMS,EAAkBhC,KAAKP,QAAQE,eAarC,GALAE,OAAOC,KAAKiC,MAAME,QAAQD,EAAiB,QAAShC,KAAKP,SACzDI,OAAOC,KAAKiC,MAAME,QAAQD,EAAiB,eAAgBhC,KAAKP,SAI5DuC,EAAgBE,iBAAkB,CAEpC,IAAMC,EAAUH,EAAgBI,aAE1BC,EAASrC,KAAKP,QAAQ6C,YAI5BN,EAAgBN,SAASa,UAAUF,GAGnCrC,KAAKwB,QAAUgB,OAAOC,YAAW,WAG/BT,EAAgBN,SAASa,UAAUF,GAIrB,OAAZF,GAGAH,EAAgBN,SAASgB,UAAYP,GAIrCH,EAAgBN,SAASiB,QAAQR,EAAU,KAE5C,KAILJ,EAAMa,cAAe,EAEjBb,EAAMc,iBACRd,EAAMc,oBAKZrD,EAAAmC,UAAAmB,YAAA,WAOEjD,OAAOC,KAAKiC,MAAME,QAChBjC,KAAKP,QAAQE,eACb,YACAK,KAAKP,UAITD,EAAAmC,UAAAoB,WAAA,WAOElD,OAAOC,KAAKiC,MAAME,QAChBjC,KAAKP,QAAQE,eACb,WACAK,KAAKP,UAITD,EAAAmC,UAAAqB,MAAA,WACEhD,KAAKM,IAAM2C,SAASC,cAAc,OAClClD,KAAKM,IAAIH,UAAYH,KAAKG,UACtBH,KAAKQ,SACPR,KAAKmD,OAKPnD,KAAKoD,WAAWC,mBAAmBC,YAAYtD,KAAKM,KAEpDN,KAAKS,sBAAwBZ,OAAOC,KAAKiC,MAAMwB,YAG7CvD,KAAK0B,SACL,iBACA1B,KAAK4B,iBAGP5B,KAAKM,IAAIkD,iBAAiB,YAAaxD,KAAK6B,aAE5C7B,KAAKM,IAAIkD,iBAAiB,QAASxD,KAAK8B,SAExC9B,KAAKM,IAAIkD,iBAAiB,YAAaxD,KAAK8C,aAE5C9C,KAAKM,IAAIkD,iBAAiB,WAAYxD,KAAK+C,aAG7CvD,EAAAmC,UAAA8B,SAAA,WACMzD,KAAKM,KAAON,KAAKM,IAAIoD,aACvB1D,KAAK2D,OAE8B,OAA/B3D,KAAKS,uBACPZ,OAAOC,KAAKiC,MAAM6B,eAAe5D,KAAKS,uBAGxCT,KAAKM,IAAIuD,oBAAoB,YAAa7D,KAAK6B,aAE/C7B,KAAKM,IAAIuD,oBAAoB,QAAS7D,KAAK8B,SAE3C9B,KAAKM,IAAIuD,oBAAoB,YAAa7D,KAAK8C,aAE/C9C,KAAKM,IAAIuD,oBAAoB,WAAY7D,KAAK+C,YAE9C/C,KAAKM,IAAIoD,WAAWI,YAAY9D,KAAKM,KAEhB,OAAjBN,KAAKwB,UACPgB,OAAOuB,aAAa/D,KAAKwB,SAEzBxB,KAAKwB,QAAU,MAGjBxB,KAAKM,IAAM,OAIfd,EAAAmC,UAAAqC,KAAA,WACE,GAAIhE,KAAKQ,SAAwB,OAAbR,KAAKM,KAAgBN,KAAKI,OAAQ,CAC9C,IAAA6D,EAAWjE,KAAKkE,iBAAiBlE,KAAKI,QAApC+D,EAACF,EAAAE,EAAEC,MAEXpE,KAAKM,IAAI+D,MAAMC,IAAM,GAAAC,OAAGH,EAAC,MACzBpE,KAAKM,IAAI+D,MAAMG,KAAO,GAAAD,OAAGJ,EAAC,QAI9B3E,EAAAmC,UAAAgC,KAAA,WACM3D,KAAKM,MACPN,KAAKM,IAAI+D,MAAMI,QAAU,QAG3BzE,KAAKQ,SAAU,GAGjBhB,EAAAmC,UAAAwB,KAAA,iBACE,GAAInD,KAAKM,KAAON,KAAKI,OAAQ,CAC3B,IAAIsE,EAAW,GAGTC,EAAK3E,KAAKqB,mBAAmBuD,MAAM,KAEnCC,EAAUC,SAASH,EAAG,GAAGI,QAAQ,aAAc,IAAK,IACpDC,EAAUF,SAASH,EAAG,GAAGI,QAAQ,aAAc,IAAK,IAEpDE,EAAMjF,KAAKkE,iBAAiBlE,KAAKI,QAOrCsE,EAJc,OAAd1E,KAAKO,WACsB,IAApBP,KAAKO,KAAK2E,OACG,KAApBlF,KAAKO,KAAK2E,MAEClF,KAAKP,QAAQE,eAAewF,WAE5BnF,KAAKO,KAAK2E,MAGvBlF,KAAKM,IAAI+D,MAAMe,OAAS,UACxBpF,KAAKM,IAAI+D,MAAMgB,SAAW,WAC1BrF,KAAKM,IAAI+D,MAAMC,IAAM,GAAAC,OAAGU,EAAIb,EAAC,MAC7BpE,KAAKM,IAAI+D,MAAMG,KAAO,GAAAD,OAAGU,EAAId,EAAC,MAC9BnE,KAAKM,IAAI+D,MAAMzD,MAAQ,GAAA2D,OAAGvE,KAAKY,MAAK,MACpCZ,KAAKM,IAAI+D,MAAM1D,OAAS,GAAA4D,OAAGvE,KAAKW,OAAM,MAEtC,IAAM2E,EAAMrC,SAASC,cAAc,OACnCoC,EAAIC,IAAMb,EACVY,EAAIE,IAAMxF,KAAKU,IACf4E,EAAIjB,MAAMgB,SAAW,WACrBC,EAAIjB,MAAMC,IAAM,GAAGC,OAAAS,QACnBM,EAAIjB,MAAMG,KAAO,GAAGD,OAAAM,QAEf7E,KAAKP,QAAQE,eAAe8F,oBAC/BH,EAAIjB,MAAMqB,KAAO,SAASnB,OAAAS,EAAe,SAAAT,OAAAM,EAAU7E,KAAKY,MAAK,SAAA2D,OAC3DS,EAAUhF,KAAKW,OAAM,OAAA4D,OACjBM,EAAO,MAGf,IAAMc,EAAU1C,SAASC,cAAc,OAEvCyC,EAAQtB,MAAMgB,SAAW,WACzBM,EAAQtB,MAAMC,IAAM,GAAAC,OAAGvE,KAAKa,WAAW,SACvC8E,EAAQtB,MAAMG,KAAO,GAAAD,OAAGvE,KAAKa,WAAW,SACxC8E,EAAQtB,MAAMuB,MAAQ5F,KAAKe,UAC3B4E,EAAQtB,MAAMwB,SAAW,UAAG7F,KAAKgB,SAAQ,MACzC2E,EAAQtB,MAAMjD,WAAapB,KAAKoB,WAChCuE,EAAQtB,MAAMnD,WAAalB,KAAKkB,WAChCyE,EAAQtB,MAAMlD,UAAYnB,KAAKmB,UAC/BwE,EAAQtB,MAAMpD,eAAiBjB,KAAKiB,eACpC0E,EAAQtB,MAAMyB,UAAY,SAC1BH,EAAQtB,MAAMzD,MAAQ,UAAGZ,KAAKY,MAAK,MACnC+E,EAAQtB,MAAM0B,WAAa,UAAG/F,KAAKW,OAAM,MACzCgF,EAAQK,UAAY,GAAGzB,OAAS,QAATN,EAAAjE,KAAKO,YAAI,IAAA0D,OAAA,EAAAA,EAAEgC,MAElCjG,KAAKM,IAAI4F,UAAY,GAErBlG,KAAKM,IAAIgD,YAAYgC,GACrBtF,KAAKM,IAAIgD,YAAYqC,GAErB3F,KAAKM,IAAI4E,MAAQR,EAEjB1E,KAAKM,IAAI+D,MAAMI,QAAU,GAG3BzE,KAAKQ,SAAU,GAGjBhB,EAAQmC,UAAAwE,SAAR,SAAS5F,GACPP,KAAKO,KAAOA,EAEZ,IAAMb,EAASM,KAAKP,QAAQE,eAAeyG,YAErC/B,EACJ3E,EAAO2G,KAAKC,IAAI5G,EAAO6G,OAAS,EAAGF,KAAKG,IAAI,EAAGjG,EAAKkG,MAAQ,KAE9DzG,KAAKU,IAAM2D,EAAM3D,IACjBV,KAAKW,OAAS0D,EAAM1D,OACpBX,KAAKY,MAAQyD,EAAMzD,MAEfyD,EAAMlE,YACRH,KAAKG,UAAY,GAAAoE,OAAGvE,KAAKC,iBAAgB,KAAAsE,OAAIF,EAAMlE,YAErDH,KAAKa,WAAawD,EAAMxD,YAAc,CAAC,EAAG,GAC1Cb,KAAKc,WAAauD,EAAMvD,YAAc,CAACd,KAAKW,OAAS,EAAGX,KAAKY,MAAQ,GAErEZ,KAAKe,UAAYsD,EAAMtD,WAAa,QAEpCf,KAAKgB,SAAWqD,EAAMrD,UAAY,GAElChB,KAAKiB,eAAiBoD,EAAMpD,gBAAkB,OAE9CjB,KAAKkB,WAAamD,EAAMnD,YAAc,OAEtClB,KAAKmB,UAAYkD,EAAMlD,WAAa,SAEpCnB,KAAKoB,WAAaiD,EAAMjD,YAAc,mBAEtCpB,KAAKqB,mBAAqBgD,EAAMhD,oBAAsB,OAGxD7B,EAASmC,UAAA+E,UAAT,SAAUtG,GACRJ,KAAKI,OAASA,GAGhBZ,EAAgBmC,UAAAuC,iBAAhB,SAAiByC,GAEf,IAAM1B,EAAMjF,KAAK4G,gBAAgBC,qBAAqBF,GAMtD,OAJA1B,EAAId,GAAKnE,KAAKc,WAAW,GAEzBmE,EAAIb,GAAKpE,KAAKc,WAAW,GAElBmE,GAEVzF,KCtVDsH,EAAA,WAWE,SAAAA,EAAYC,GACV/G,KAAK+G,gBAAkBA,EAIvB/G,KAAKgH,IAAMhH,KAAK+G,gBAAgBrF,SAEhC1B,KAAKiH,SAAWjH,KAAK+G,gBAAgBG,cAErClH,KAAKmH,eAAiBnH,KAAK+G,gBAAgBK,wBAE3CpH,KAAKqH,cAAgBrH,KAAK+G,gBAAgBO,mBAE1CtH,KAAKuH,QAAU,GAEfvH,KAAKI,YAASC,EAEdL,KAAKwH,OAAS,KAEdxH,KAAKyH,YAAc,IAAIjI,EAAYQ,KAAMA,KAAK+G,gBAAgBX,aA+KlE,OA5KEU,EAAAnF,UAAA+F,QAAA,WACE,OAAO1H,KAAKuH,QAAQhB,QAGtBO,EAAAnF,UAAAgG,WAAA,WACE,OAAO3H,KAAKuH,SAGdT,EAAAnF,UAAAiG,UAAA,WACE,OAAO5H,KAAKI,QAGd0G,EAAAnF,UAAAD,OAAA,WACE,OAAO1B,KAAKgH,KAGdF,EAAAnF,UAAAhC,aAAA,WACE,OAAOK,KAAK+G,iBAGdD,EAAAnF,UAAAW,UAAA,WAKE,IAJA,IAAMkF,EAAS,IAAI3H,OAAOC,KAAK+H,aAAa7H,KAAKI,OAAQJ,KAAKI,QAExDmH,EAAUvH,KAAK2H,aAEZG,EAAI,EAAGA,EAAIP,EAAQhB,OAAQuB,IAAK,CACvC,IAAMzC,EAAWkC,EAAQO,GAAGC,cAExB1C,GACFmC,EAAO5H,OAAOyF,GAIlB,OAAOmC,GAGTV,EAAAnF,UAAAqG,OAAA,WAGEhI,KAAKyH,YAAYhG,OAAO,MAExBzB,KAAKuH,QAAU,UAIRvH,KAAKuH,SAGdT,EAASnF,UAAAsG,UAAT,SAAUC,GACR,GAAIlI,KAAKmI,qBAAqBD,GAC5B,OAAO,EAaL,IATI7C,EADR,GAAKrF,KAAKI,QASR,GAAIJ,KAAKqH,gBACDhC,EAAW6C,EAAOH,eAEV,CACZ,IAAMK,EAASpI,KAAKuH,QAAQhB,OAAS,EAErCvG,KAAKI,OAAS,IAAIP,OAAOC,KAAKuI,QAC3BrI,KAAKI,OAAOkI,OAASF,EAAS,GAAK/C,EAASiD,OAASF,GACrDpI,KAAKI,OAAOmI,OAASH,EAAS,GAAK/C,EAASkD,OAASH,GAGxDpI,KAAKwI,wBAnBHnD,EAAW6C,EAAOH,iBAGtB/H,KAAKI,OAASiF,EAEdrF,KAAKwI,mBAmBTN,EAAOO,SAAU,EAEjBzI,KAAKuH,QAAQmB,KAAKR,GAElB,IAAMS,EAAS3I,KAAKuH,QAAQhB,OAEtBqC,EAAU5I,KAAK+G,gBAAgB3E,aAE/ByG,EAAO7I,KAAKgH,IAAItE,UAEtB,GAAgB,OAAZkG,QAAoC,IAATC,GAAwBA,EAAOD,EAExDV,EAAOxG,WAAa1B,KAAKgH,KAC3BkB,EAAOzG,OAAOzB,KAAKgH,UAEhB,GAAI2B,EAAS3I,KAAKmH,eAEnBe,EAAOxG,WAAa1B,KAAKgH,KAC3BkB,EAAOzG,OAAOzB,KAAKgH,UAEhB,GAAI2B,IAAW3I,KAAKmH,eAEzB,IAAK,IAAIW,EAAI,EAAGA,EAAIa,EAAQb,IAC1B9H,KAAKuH,QAAQO,GAAGrG,OAAO,WAGzByG,EAAOzG,OAAO,MAGhB,OAAO,GAGTqF,EAAuBnF,UAAAmH,wBAAvB,SAAwBZ,GACtB,GAAoB,OAAhBlI,KAAKwH,OAAiB,CACxB,IAAMnC,EAAW6C,EAAOH,cAExB,GAAI1C,EACF,OAAOrF,KAAKwH,OAAOuB,SAAS1D,GAIhC,OAAO,GAGTyB,EAAAnF,UAAA6G,gBAAA,WACExI,KAAKwH,OAASxH,KAAK+G,gBAAgBiC,kBACjC,IAAInJ,OAAOC,KAAK+H,aAAa7H,KAAKI,OAAQJ,KAAKI,UAInD0G,EAAAnF,UAAAsH,WAAA,WACE,IAAMN,EAAS3I,KAAKuH,QAAQhB,OAEtBqC,EAAU5I,KAAK+G,gBAAgB3E,aAE/ByG,EAAO7I,KAAKgH,IAAItE,UAEN,OAAZkG,QAAoC,IAATC,GAAwBA,EAAOD,GAM1DD,EAAS3I,KAAKmH,eALhBnH,KAAKyH,YAAY9D,QAYf3D,KAAKI,QACPJ,KAAKyH,YAAYf,UAAU1G,KAAKI,QAGlCJ,KAAKyH,YAAYtB,SACfnG,KAAK+G,gBAAgBmC,eAArBlJ,CAAqCA,KAAKuH,QAASvH,KAAK+G,gBAAgBX,YAAYG,SAGtFvG,KAAKyH,YAAYtE,SAGnB2D,EAAoBnF,UAAAwG,qBAApB,SAAqBD,GACnB,GAAIlI,KAAKuH,QAAQ4B,SACf,OAAOnJ,KAAKuH,QAAQ4B,SAASjB,GAG/B,IAAK,IAAIJ,EAAI,EAAGA,EAAI9H,KAAKuH,QAAQhB,OAAQuB,IACvC,GAAII,IAAWlI,KAAKuH,QAAQO,GAC1B,OAAO,EAIX,OAAO,GAEVhB,KCrMKsC,EAAa,SACjB7B,EACA8B,GAEA,IAAMC,EAAQ/B,EAAQhB,OAEhBgD,EAAiBD,EAAME,WAAWjD,OAElCE,EAAQJ,KAAKC,IAAIiD,EAAgBF,GAEvC,MAAO,CACLpD,KAAMqD,EAAME,WACZ/C,MAAKA,EACLvB,MAAO,KAaLuE,EAAc,CAAC,GAAI,GAAI,GAAI,GAAI,IAIrCC,EAAA,WAwBE,SAAAA,EACE1C,EACA2C,EACAC,QADA,IAAAD,IAAAA,EAAiC,SACjC,IAAAC,IAAAA,EAAiC,IAEjC5J,KAAKJ,OAAO8J,EAAW7J,OAAOC,KAAKC,aAEnCC,KAAKuH,QAAU,GACfvH,KAAK6J,SAAW,GAChB7J,KAAK8J,UAAY,GACjB9J,KAAK+J,UAAY,KACjB/J,KAAKgK,OAAQ,EACbhK,KAAKiH,SAAW2C,EAAW3C,UAAY,GACvCjH,KAAKmH,eAAiByC,EAAWK,oBAAsB,EACvDjK,KAAK4I,QAAUgB,EAAWhB,SAAW,KACrC5I,KAAKN,OAASkK,EAAWlK,QAAU,GAEnCM,KAAKkF,MAAQ0E,EAAW1E,OAAS,GAEjClF,KAAKkK,aAAc,OAEY7J,IAA3BuJ,EAAWM,cACblK,KAAKkK,YAAcN,EAAWM,aAGhClK,KAAKqH,eAAgB,OAEYhH,IAA7BuJ,EAAWvC,gBACbrH,KAAKqH,cAAgBuC,EAAWvC,eAGlCrH,KAAKmK,cAAe,OAEY9J,IAA5BuJ,EAAWO,eACbnK,KAAKmK,aAAeP,EAAWO,cAGjCnK,KAAKyF,mBAAoB,OAEYpF,IAAjCuJ,EAAWnE,oBACbzF,KAAKyF,kBAAoBmE,EAAWnE,mBAEtCzF,KAAKoK,UAAYR,EAAWQ,WA1E9B,yFA4EEpK,KAAKqK,eAAiBT,EAAWS,gBA1Eb,MA4EpBrK,KAAKsK,WAAaV,EAAWU,YAAcb,EAE3CzJ,KAAKuK,WAAaX,EAAWW,YAAcnB,EAE3CpJ,KAAKwK,UAAYZ,EAAWY,WAvFb,IAyFfxK,KAAKyK,YAAcb,EAAWa,aAvFZ,IAyFlBzK,KAAK0K,aAAed,EAAWc,cAhFX,WAkFuC,IAAvDC,UAAUC,UAAUC,cAAcC,QAAQ,UAE5C9K,KAAKwK,UAAYxK,KAAKyK,aAGxBzK,KAAK+K,eAAiB,KAEtB/K,KAAKgL,cAELhL,KAAKiL,WAAWtB,GAAY,GAG5B3J,KAAKyB,OAAOuF,GAskBhB,OAnkBE0C,EAAA/H,UAAAqB,MAAA,WAAA,IA6CCkI,EAAAlL,KA1CCA,KAAK+J,UAAY/J,KAAK0B,SAEtB1B,KAAKgK,OAAQ,EAEbhK,KAAKmL,UAGLnL,KAAK8J,UAAY,CACfjK,OAAOC,KAAKiC,MAAMwB,YAGhBvD,KAAK0B,SACL,gBACA,WACEwJ,EAAKE,eAAc,GASjBF,EAAKxJ,SAASgB,aAAewI,EAAKG,IAAI,YAAc,IAGpDH,EAAKxJ,SAASgB,YAAcwI,EAAKG,IAAI,YAErCxL,OAAOC,KAAKiC,MAAME,QAAQiJ,EAAM,WAItCrL,OAAOC,KAAKiC,MAAMwB,YAGhBvD,KAAK0B,SACL,QACA,WACEwJ,EAAKI,cAMb5B,EAAA/H,UAAA8B,SAAA,WAEE,IAAK,IAAIqE,EAAI,EAAGA,EAAI9H,KAAKuH,QAAQhB,OAAQuB,IACnC9H,KAAKuH,QAAQO,GAAGpG,WAAa1B,KAAK+J,WACpC/J,KAAKuH,QAAQO,GAAGrG,OAAOzB,KAAK+J,WAKhC,IAASjC,EAAI,EAAGA,EAAI9H,KAAK6J,SAAStD,OAAQuB,IACxC9H,KAAK6J,SAAS/B,GAAGE,SAGnBhI,KAAK6J,SAAW,GAGhB,IAAS/B,EAAI,EAAGA,EAAI9H,KAAK8J,UAAUvD,OAAQuB,IACzCjI,OAAOC,KAAKiC,MAAM6B,eAAe5D,KAAK8J,UAAUhC,IAGlD9H,KAAK8J,UAAY,GAEjB9J,KAAK+J,UAAY,KAEjB/J,KAAKgK,OAAQ,GAIfN,EAAI/H,UAAAqC,KAAJ,aAEA0F,EAAA/H,UAAAqJ,YAAA,WACE,KAAIhL,KAAKN,OAAO6G,OAAS,GAIzB,IAAK,IAAIuB,EAAI,EAAGA,EAAI9H,KAAKsK,WAAW/D,OAAQuB,IAC1C9H,KAAKN,OAAOgJ,KAAK,CACfhI,IAAKV,KAAKoK,WAAatC,EAAI,GAAK,IAAM9H,KAAKqK,eAC3C1J,OAAQX,KAAKsK,WAAWxC,GACxBlH,MAAOZ,KAAKsK,WAAWxC,MAK7B4B,EAAA/H,UAAA4J,gBAAA,WAKE,IAJA,IAAMhE,EAAUvH,KAAK2H,aAEfH,EAAS,IAAI3H,OAAOC,KAAK+H,aAEtBC,EAAI,EAAGA,EAAIP,EAAQhB,OAAQuB,IAAK,CACvC,IAAMzC,EAAWkC,EAAQO,GAAGC,cACxB1C,GACFmC,EAAO5H,OAAOyF,GAMlBrF,KAAK0B,SAASa,UAAUiF,IAG1BkC,EAAA/H,UAAAuF,YAAA,WACE,OAAOlH,KAAKiH,UAGdyC,EAAW/H,UAAA6J,YAAX,SAAYvE,GACVjH,KAAKiH,SAAWA,GAGlByC,EAAA/H,UAAAyF,sBAAA,WACE,OAAOpH,KAAKmH,gBAGduC,EAAqB/H,UAAA8J,sBAArB,SAAsBxB,GACpBjK,KAAKmH,eAAiB8C,GAGxBP,EAAA/H,UAAAS,WAAA,WACE,OAAOpC,KAAK4I,SAGdc,EAAU/H,UAAA+J,WAAV,SAAW9C,GACT5I,KAAK4I,QAAUA,GAGjBc,EAAA/H,UAAAyE,UAAA,WACE,OAAOpG,KAAKN,QAGdgK,EAAS/H,UAAAgK,UAAT,SAAUjM,GACRM,KAAKN,OAASA,GAGhBgK,EAAA/H,UAAAwD,SAAA,WACE,OAAOnF,KAAKkF,OAGdwE,EAAQ/H,UAAAiK,SAAR,SAAS1G,GACPlF,KAAKkF,MAAQA,GAGfwE,EAAA/H,UAAAO,eAAA,WACE,OAAOlC,KAAKkK,aAGdR,EAAc/H,UAAAkK,eAAd,SAAe3B,GACblK,KAAKkK,YAAcA,GAGrBR,EAAA/H,UAAA2F,iBAAA,WACE,OAAOtH,KAAKqH,eAGdqC,EAAgB/H,UAAAmK,iBAAhB,SAAiBzE,GACfrH,KAAKqH,cAAgBA,GAGvBqC,EAAA/H,UAAAoK,gBAAA,WACE,OAAO/L,KAAKmK,cAGdT,EAAe/H,UAAAqK,gBAAf,SAAgB7B,GACdnK,KAAKmK,aAAeA,GAGtBT,EAAA/H,UAAAsK,qBAAA,WACE,OAAOjM,KAAKyF,mBAGdiE,EAAoB/H,UAAAuK,qBAApB,SAAqBzG,GACnBzF,KAAKyF,kBAAoBA,GAG3BiE,EAAA/H,UAAAwK,kBAAA,WACE,OAAOnM,KAAKqK,gBAGdX,EAAiB/H,UAAAyK,kBAAjB,SAAkB/B,GAChBrK,KAAKqK,eAAiBA,GAGxBX,EAAA/H,UAAA0K,aAAA,WACE,OAAOrM,KAAKoK,WAGdV,EAAY/H,UAAA2K,aAAZ,SAAalC,GACXpK,KAAKoK,UAAYA,GAGnBV,EAAA/H,UAAA4K,cAAA,WACE,OAAOvM,KAAKsK,YAGdZ,EAAa/H,UAAA6K,cAAb,SAAclC,GACZtK,KAAKsK,WAAaA,GAGpBZ,EAAA/H,UAAAuH,cAAA,WACE,OAAOlJ,KAAKuK,YAGdb,EAAa/H,UAAA8K,cAAb,SAAclC,GACZvK,KAAKuK,WAAaA,GAGpBb,EAAA/H,UAAA+K,eAAA,WACE,OAAO1M,KAAKyK,aAGdf,EAAc/H,UAAAgL,eAAd,SAAelC,GACbzK,KAAKyK,YAAcA,GAGrBf,EAAA/H,UAAAzB,gBAAA,WACE,OAAOF,KAAK0K,cAGdhB,EAAe/H,UAAAiL,gBAAf,SAAgBlC,GACd1K,KAAK0K,aAAeA,GAGtBhB,EAAA/H,UAAAgG,WAAA,WACE,OAAO3H,KAAKuH,SAGdmC,EAAA/H,UAAAkL,gBAAA,WACE,OAAO7M,KAAKuH,QAAQhB,QAGtBmD,EAAA/H,UAAAmL,YAAA,WACE,OAAO9M,KAAK6J,UAGdH,EAAA/H,UAAAoL,iBAAA,WACE,OAAO/M,KAAK6J,SAAStD,QAGvBmD,EAAA/H,UAAAsG,UAAA,SAAUC,EAAwB8E,GAChChN,KAAKiN,aAAa/E,GAEb8E,GACHhN,KAAKsL,UAIT5B,EAAA/H,UAAAsJ,WAAA,SAAW1D,EAA2ByF,GACpC,IAAK,IAAME,KAAO3F,EACZ4F,OAAOxL,UAAUyL,eAAeC,KAAK9F,EAAS2F,IAChDlN,KAAKiN,aAAa1F,EAAQ2F,IAIzBF,GACHhN,KAAKsL,UAIT5B,EAAY/H,UAAAsL,aAAZ,SAAa/E,GAAb,IAeCgD,EAAAlL,KAbKkI,EAAOoF,gBACTzN,OAAOC,KAAKiC,MAAMwB,YAAY2E,EAAQ,WAAW,WAC3CgD,EAAKlB,QACP9B,EAAOO,SAAU,EAEjByC,EAAKC,cAKXjD,EAAOO,SAAU,EAEjBzI,KAAKuH,QAAQmB,KAAKR,IAGpBwB,EAAa/H,UAAA4L,cAAb,SAAcrF,GACZ,IAAIzB,GAAS,EAEb,GAAIzG,KAAKuH,QAAQuD,QACfrE,EAAQzG,KAAKuH,QAAQuD,QAAQ5C,QAE7B,IAAK,IAAIJ,EAAI,EAAGA,EAAI9H,KAAKuH,QAAQhB,OAAQuB,IACvC,GAAII,IAAWlI,KAAKuH,QAAQO,GAAI,CAC9BrB,EAAQqB,EAER,MAKN,OAAe,IAAXrB,IAKJyB,EAAOzG,OAAO,MAEdzB,KAAKuH,QAAQiG,OAAO/G,EAAO,IAEpB,IAGTiD,EAAA/H,UAAA8L,aAAA,SAAavF,EAAwB8E,GACnC,IAAMU,EAAU1N,KAAKuN,cAAcrF,GAMnC,OAJK8E,GAAaU,GAChB1N,KAAKmL,UAGAuC,GAGThE,EAAA/H,UAAAgM,cAAA,SAAcpG,EAA2ByF,GAGvC,IAFA,IAAIU,GAAU,EAEL5F,EAAI,EAAGA,EAAIP,EAAQhB,OAAQuB,IAClC4F,EAAUA,GAAW1N,KAAKuN,cAAchG,EAAQO,IAOlD,OAJKkF,GAAaU,GAChB1N,KAAKmL,UAGAuC,GAGThE,EAAA/H,UAAAiM,aAAA,WACE5N,KAAKoL,eAAc,GAEnBpL,KAAKuH,QAAU,IAGjBmC,EAAA/H,UAAAwJ,QAAA,WACE,IAAM0C,EAAc7N,KAAK6J,SAASiE,QAElC9N,KAAK6J,SAAW,GAEhB7J,KAAKoL,eAAc,GAEnBpL,KAAKsL,SAIL7I,YAAW,WACT,IAAK,IAAIqF,EAAI,EAAGA,EAAI+F,EAAYtH,OAAQuB,IACtC+F,EAAY/F,GAAGE,WAEhB,IAGL0B,EAAiB/H,UAAAqH,kBAAjB,SAAkBxB,GAGhB,IAAMuG,EAAa/N,KAAK4G,gBAElBoH,EAAQD,EAAWlH,qBAEvB,IAAIhH,OAAOC,KAAKuI,OAAOb,EAAOyG,eAAe3F,MAAOd,EAAOyG,eAAe1F,QAG5EyF,EAAM7J,GAAKnE,KAAKiH,SAChB+G,EAAM5J,GAAKpE,KAAKiH,SAEhB,IAAMiH,EAAQH,EAAWlH,qBAEvB,IAAIhH,OAAOC,KAAKuI,OAAOb,EAAO2G,eAAe7F,MAAOd,EAAO2G,eAAe5F,QAiB5E,OAdA2F,EAAM/J,GAAKnE,KAAKiH,SAChBiH,EAAM9J,GAAKpE,KAAKiH,SAGhBO,EAAO5H,OAELmO,EAAWK,qBAAqBJ,IAGlCxG,EAAO5H,OAELmO,EAAWK,qBAAqBF,IAG3B1G,GAGTkC,EAAA/H,UAAA2J,OAAA,WAEEtL,KAAKqO,eAAe,IAGtB3E,EAAa/H,UAAAyJ,cAAb,SAAckD,GAEZ,IAAK,IAAIxG,EAAI,EAAGA,EAAI9H,KAAK6J,SAAStD,OAAQuB,IACxC9H,KAAK6J,SAAS/B,GAAGE,SAGnBhI,KAAK6J,SAAW,GAGhB,IAAS/B,EAAI,EAAGA,EAAI9H,KAAKuH,QAAQhB,OAAQuB,IAAK,CAC5C,IAAMI,EAASlI,KAAKuH,QAAQO,GAE5BI,EAAOO,SAAU,EAEb6F,GACFpG,EAAOzG,OAAO,QAKpBiI,EAAA/H,UAAA4M,sBAAA,SAAsBC,EAAwBC,GAC5C,IAEMC,GAASD,EAAGnG,MAAQkG,EAAGlG,OAASjC,KAAKsI,GAAM,IAC3CC,GAASH,EAAGlG,MAAQiG,EAAGjG,OAASlC,KAAKsI,GAAM,IAE3CE,EACJxI,KAAKyI,IAAIJ,EAAO,GAAKrI,KAAKyI,IAAIJ,EAAO,GACrCrI,KAAK0I,IAAKP,EAAGlG,MAAQjC,KAAKsI,GAAM,KAC9BtI,KAAK0I,IAAKN,EAAGnG,MAAQjC,KAAKsI,GAAM,KAChCtI,KAAKyI,IAAIF,EAAO,GAChBvI,KAAKyI,IAAIF,EAAO,GAEpB,OAAY,EAAIvI,KAAK2I,MAAM3I,KAAK4I,KAAKJ,GAAIxI,KAAK4I,KAAK,EAAIJ,IAZ7C,MAeZnF,EAAA/H,UAAAuN,iBAAA,SAAiBhH,EAAwBV,GACvC,IAAMnC,EAAW6C,EAAOH,cAExB,QAAI1C,GACKmC,EAAOuB,SAAS1D,IAM3BqE,EAAmB/H,UAAAwN,oBAAnB,SAAoBjH,GAOlB,IANA,IAAIzI,EAEA2P,EAAW,IAEXC,EAAiB,KAEZvH,EAAI,EAAGA,EAAI9H,KAAK6J,SAAStD,OAAQuB,IAAK,CAG7C,IAAM1H,GAFNX,EAAUO,KAAK6J,SAAS/B,IAEDF,YAEjBvC,EAAW6C,EAAOH,cAExB,GAAI3H,GAAUiF,EAAU,CACtB,IAAMiK,EAAItP,KAAKuO,sBAAsBnO,EAAQiF,GAEzCiK,EAAIF,IACNA,EAAWE,EAEXD,EAAiB5P,IAKnB4P,GAAkBA,EAAevG,wBAAwBZ,GAC3DmH,EAAepH,UAAUC,KAEzBzI,EAAU,IAAIqH,EAAQ9G,OAEdiI,UAAUC,GAElBlI,KAAK6J,SAASnB,KAAKjJ,KAIvBiK,EAAc/H,UAAA0M,eAAd,SAAekB,GAAf,IAqFCrE,EAAAlL,KApFC,GAAKA,KAAKgK,MAAV,CAKe,IAAXuF,IAQF1P,OAAOC,KAAKiC,MAAME,QAAQjC,KAAM,kBAAmBA,MAEvB,OAAxBA,KAAK+K,iBACPvI,OAAOuB,aAAa/D,KAAK+K,uBAIlB/K,KAAK+K,iBAiChB,IAzBA,IAAMyE,EAGJxP,KAAK0B,SAASgB,UAAY,EACtB,IAAI7C,OAAOC,KAAK+H,aAGd7H,KAAK0B,SACFY,YACA6L,eAGHnO,KAAK0B,SACFY,YACA2L,gBAEL,IAAIpO,OAAOC,KAAK+H,aACd,IAAIhI,OAAOC,KAAKuI,OAAO,mBAAoB,iBAC3C,IAAIxI,OAAOC,KAAKuI,QAAQ,kBAAmB,kBAG7Cb,EAASxH,KAAKgJ,kBAAkBwG,GAEhCC,EAAQpJ,KAAKC,IAAIiJ,EAASvP,KAAKwK,UAAWxK,KAAKuH,QAAQhB,QAEpDuB,EAAIyH,EAAQzH,EAAI2H,EAAO3H,IAAK,CACnC,IAAMI,EAASlI,KAAKuH,QAAQO,IAEvBI,EAAOO,SAAWzI,KAAKkP,iBAAiBhH,EAAQV,MAAaxH,KAAKmK,cAAiBnK,KAAKmK,cAAgBjC,EAAOwH,eAClH1P,KAAKmP,oBAAoBjH,GAI7B,GAAIuH,EAAQzP,KAAKuH,QAAQhB,OACvBvG,KAAK+K,eAAiBvI,OAAOC,YAC3B,WACEyI,EAAKmD,eAAeoB,KAEtB,OAEG,CACLzP,KAAK+K,eAAiB,KAStBlL,OAAOC,KAAKiC,MAAME,QAAQjC,KAAM,gBAAiBA,MAEjD,IAAS8H,EAAI,EAAGA,EAAI9H,KAAK6J,SAAStD,OAAQuB,IACxC9H,KAAK6J,SAAS/B,GAAGmB,gBAKvBS,EAAA/H,UAAA/B,OAAA,SAAO+P,EAAWC,GAChB,OAAO,SAAqBC,GAE1B,IAAK,IAAMC,KAAYD,EAAOlO,UAG5B3B,KAAK2B,UAAUmO,GAAYD,EAAOlO,UAAUmO,GAK9C,OAAO9P,MACP+P,MAAMJ,EAAM,CAACC,KAElBlG"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@react-google-maps/marker-clusterer",
3
3
  "sideEffects": false,
4
- "version": "2.8.0",
4
+ "version": "2.10.1",
5
5
  "description": "Marker Clusterer for React.js Google Maps API",
6
6
  "license": "MIT",
7
7
  "author": {
@@ -51,56 +51,19 @@
51
51
  "test": "jest",
52
52
  "prepublishOnly": "yarn build"
53
53
  },
54
- "dependencies": {
55
- "@typescript/lib-dom": "npm:@types/web"
56
- },
57
54
  "devDependencies": {
58
55
  "@getify/eslint-plugin-proper-arrows": "11.0.3",
59
- "@rollup/plugin-commonjs": "21.0.3",
60
- "@rollup/plugin-node-resolve": "13.1.3",
61
- "@rollup/plugin-typescript": "8.3.1",
56
+ "@rollup/plugin-commonjs": "22.0.0",
57
+ "@rollup/plugin-node-resolve": "13.3.0",
58
+ "@rollup/plugin-typescript": "8.3.2",
62
59
  "@types/babel-types": "7.0.11",
63
- "@types/google.maps": "3.48.3",
64
- "@types/jest": "27.4.1",
65
- "@typescript-eslint/eslint-plugin": "5.17.0",
66
- "@typescript-eslint/parser": "5.17.0",
67
- "eslint": "8.12.0",
68
- "eslint-config-prettier": "^8.5.0",
69
- "eslint-config-standard": "17.0.0-0",
70
- "eslint-import-resolver-typescript": "2.7.1",
71
- "eslint-plugin-ascii": "1.0.0",
72
- "eslint-plugin-babel": "5.3.1",
73
- "eslint-plugin-filenames": "1.3.2",
74
- "eslint-plugin-html": "6.2.0",
75
- "eslint-plugin-import": "2.25.4",
76
- "eslint-plugin-jest": "^26.1.3",
77
- "eslint-plugin-jest-dom": "^4.0.1",
78
- "eslint-plugin-json": "3.1.0",
79
- "eslint-plugin-jsx-a11y": "6.5.1",
80
- "eslint-plugin-n": "^15.1.0",
81
- "eslint-plugin-no-inferred-method-name": "2.0.0",
82
- "eslint-plugin-node": "11.1.0",
83
- "eslint-plugin-optimize-regex": "1.2.1",
84
- "eslint-plugin-prettier": "^4.0.0",
85
- "eslint-plugin-promise": "6.0.0",
86
- "eslint-plugin-react": "7.29.4",
87
- "eslint-plugin-react-functional-set-state": "1.2.1",
88
- "eslint-plugin-react-hooks": "4.4.0",
89
- "eslint-plugin-react-perf": "3.3.1",
90
- "eslint-plugin-security-node": "^1.1.1",
91
- "eslint-plugin-standard": "5.0.0",
92
- "eslint-plugin-you-dont-need-lodash-underscore": "6.12.0",
93
- "jest": "27.5.1",
94
- "jest-cli": "27.5.1",
95
- "prettier": "^2.6.2",
96
- "react": "17.0.2",
97
- "react-dom": "17.0.2",
60
+ "@types/google.maps": "3.48.8",
61
+ "jest": "28.1.0",
62
+ "jest-cli": "28.1.0",
98
63
  "rimraf": "3.0.2",
99
- "rollup": "2.70.1",
100
- "rollup-plugin-dts": "4.2.0",
101
- "rollup-plugin-terser": "7.0.2",
102
- "ts-jest": "27.1.4",
103
- "typescript": "4.6.3"
64
+ "rollup": "2.73.0",
65
+ "rollup-plugin-dts": "4.2.1",
66
+ "rollup-plugin-terser": "7.0.2"
104
67
  },
105
68
  "gitHead": "80167ddcc3d8e356dbf0b0c3a6292c6a3a989f83"
106
69
  }
package/src/Cluster.tsx CHANGED
@@ -19,6 +19,8 @@ export class Cluster {
19
19
 
20
20
  constructor(markerClusterer: Clusterer) {
21
21
  this.markerClusterer = markerClusterer
22
+
23
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
22
24
  // @ts-ignore
23
25
  this.map = this.markerClusterer.getMap()
24
26
 
@@ -74,11 +76,13 @@ export class Cluster {
74
76
  }
75
77
 
76
78
  remove() {
79
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
77
80
  // @ts-ignore
78
81
  this.clusterIcon.setMap(null)
79
82
 
80
83
  this.markers = []
81
84
 
85
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
82
86
  // @ts-ignore
83
87
  delete this.markers
84
88
  }
@@ -197,11 +201,11 @@ export class Cluster {
197
201
  isMarkerAlreadyAdded(marker: MarkerExtended): boolean {
198
202
  if (this.markers.includes) {
199
203
  return this.markers.includes(marker)
200
- } else {
201
- for (let i = 0; i < this.markers.length; i++) {
202
- if (marker === this.markers[i]) {
203
- return true
204
- }
204
+ }
205
+
206
+ for (let i = 0; i < this.markers.length; i++) {
207
+ if (marker === this.markers[i]) {
208
+ return true
205
209
  }
206
210
  }
207
211