@nextgis/leaflet-map-adapter 1.19.1 → 1.19.4
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.
- package/lib/leaflet-map-adapter.esm-browser.js +18 -7
- package/lib/leaflet-map-adapter.esm-browser.js.map +1 -1
- package/lib/leaflet-map-adapter.esm-browser.prod.js +1 -1
- package/lib/leaflet-map-adapter.esm-browser.prod.js.map +1 -1
- package/lib/leaflet-map-adapter.esm-bundler.js +18 -7
- package/lib/leaflet-map-adapter.esm-bundler.js.map +1 -1
- package/lib/leaflet-map-adapter.esm-bundler.prod.js +1 -1
- package/lib/leaflet-map-adapter.esm-bundler.prod.js.map +1 -1
- package/lib/leaflet-map-adapter.global.js +14 -7
- package/lib/leaflet-map-adapter.global.js.map +1 -1
- package/lib/leaflet-map-adapter.global.prod.js +1 -1
- package/lib/leaflet-map-adapter.global.prod.js.map +1 -1
- package/package.json +3 -3
|
@@ -4,5 +4,5 @@ import{EventEmitter as t}from"events";import{Control as e,DomEvent as s,GeoJSON
|
|
|
4
4
|
* A collection of Leaflet utilities for working with Web Mapping services.
|
|
5
5
|
* (c) 2014-2016, Houston Engineering, Inc.
|
|
6
6
|
* MIT License
|
|
7
|
-
*/class A extends p{constructor(t,e){super(e),this.defaultWmsParams={service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},this.options={crs:null,uppercase:!1,attribution:"",opacity:1,isBack:!1,minZoom:0,pane:"tilePane",headers:null,viewPortBuffer:0,setViewDelay:100},this._url=t;const s={},i={};let o;for(o in e)o in this.options?i[o]=e[o]:s[o]=e[o];c.setOptions(this,i),this.wmsParams=c.extend({},this.defaultWmsParams,s)}setParams(t){c.extend(this.wmsParams,t),this.update()}getAttribution(){return this.options.attribution||""}onAdd(){return this.update(),this}onRemove(t){return this._currentOverlay&&(this._currentOverlay.cancelLoad(),t.removeLayer(this._currentOverlay),delete this._currentOverlay),this._currentUrl&&delete this._currentUrl,this}getEvents(){return{moveend:_(this.update,this.options.setViewDelay)}}update(){if(!this._map)return;this.updateWmsParams();const t=this.getImageUrl();if(this._currentUrl===t)return;this._currentUrl=t;const e=this.options.viewPortBuffer||0,s=this._map.getBounds().pad(e),i=new z(t,s,{opacity:0,pane:this.options.pane,headers:this.options.headers});i.addTo(this._map),this._currentOverlay&&this._currentOverlay.cancelLoad(),i.once("load",(()=>{this._map&&(i._url===this._currentUrl?(this._currentOverlay&&this._map.removeLayer(this._currentOverlay),this._currentOverlay=i,i.setOpacity(void 0!==this.options.opacity?this.options.opacity:1),!0===this.options.isBack&&i.bringToBack(),!1===this.options.isBack&&i.bringToFront(),void 0!==this.options.zIndex&&i.setZIndex(this.options.zIndex)):this._map.removeLayer(i))}),this);const{minZoom:o,maxZoom:n}=this.options;(o&&this._map.getZoom()<o||n&&this._map.getZoom()>n)&&this._map.removeLayer(i)}setOpacity(t){this.options.opacity=t,this._currentOverlay&&this._currentOverlay.setOpacity(t)}bringToBack(){this.options.isBack=!0,this._currentOverlay&&this._currentOverlay.bringToBack()}bringToFront(){this.options.isBack=!1,this._currentOverlay&&this._currentOverlay.bringToFront()}setZIndex(t){this.options.zIndex=t,this._currentOverlay&&this._currentOverlay.setZIndex(t)}updateWmsParams(t){t||(t=this._map);const e=this.options.viewPortBuffer||0,s=t.getBounds().pad(e),i=t.getSize();if(0!==this.options.viewPortBuffer){const t=e+1;i.x=Math.ceil(i.x*t),i.y=Math.ceil(i.y*t)}const o=parseFloat(this.wmsParams.version),n=this.options.crs||t.options.crs,r=o>=1.3?"crs":"srs";if(n){const t=n.project(s.getNorthWest()),e=n.project(s.getSouthEast()),a={width:i.x,height:i.y};a[r]=n.code,a.bbox=(o>=1.3&&n===h.EPSG4326?[e.y,t.x,t.y,e.x]:[t.x,e.y,e.x,t.y]).join(","),c.extend(this.wmsParams,a)}}getImageUrl(){const t=c.getParamString(this.wmsParams,this._url,this.options.uppercase||!1);return this._url+t}}function U(t){return class extends t{constructor(...t){super(...t),this.options.setViewDelay&&(this._update=function(t,e=10){let s;function i(...o){i.clear(),s=setTimeout((()=>{s=null,t.apply(this,o)}),e)}return i.clear=function(){s&&(clearTimeout(s),s=null)},i}(((...t)=>{u.prototype._update.call(this,...t)}),this.options.setViewDelay))}createTile(t,e){const s=this.getTileUrl(t),i=document.createElement("img");return i.abort=B(s,(t=>{i.src=t,e(null,i)}),this.options.headers),(this.options.crossOrigin||""===this.options.crossOrigin)&&(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),i.alt="",i.setAttribute("role","presentation"),i}_abortLoading(){const t=this._tiles,e=this._tileZoom;for(const s in t)if(t[s].coords.z!==e){const e=t[s].el;e.onload=c.falseFn,e.onerror=c.falseFn,e.complete||(e.abort&&e.abort(),e.src=c.emptyImageUrl,d.remove(e),delete t[s])}}}}const W=U(class extends m{constructor(t,e){super(t,e),Object.assign(this.options,e)}});class I extends k{addLayer(t){if(this.options=Object.assign(this.options,t),t){const{url:e,...s}=t;if(e){const t={pane:this.pane,attribution:s.attribution,minZoom:s.minZoom,maxZoom:s.maxZoom,...s.nativeOptions};let i;return s.subdomains&&(t.subdomains=s.subdomains),i=s.headers?new W(e,{...t,headers:s.headers,setViewDelay:s.setViewDelay}):new m(e,t),i}}}}const F=U(class extends m.WMS{constructor(t,e){super(t,e)}});function D(t){return[[t[3],t[0]],[t[1],t[2]]]}class R{constructor(){this.options={target:"map"},this.layerAdapters=R.layerAdapters,this.controlAdapters=R.controlAdapters,this.emitter=new t,this._unselectCb=[],this._universalEvents=["move","zoom","zoomend","zoomstart","moveend","movestart"],this._positionEvents=["mousemove","mouseout","mouseover"]}create(t){if(this.options={...t},this.options.target){const{zoom:t,center:e,maxZoom:s,minZoom:i,maxBounds:o,mapAdapterOptions:n}=this.options;this.map=this.options.map||new y(this.options.target,{attributionControl:!1,zoomControl:!1,maxBounds:o?D(o):void 0,maxZoom:s,minZoom:i,center:e&&[e[1],e[0]],zoom:t,...n});const r=this.map.createPane("order-0");this.map._addUnselectCb=t=>{this._addUnselectCb(t)},r.style.zIndex=String(0),this.emitter.emit("create",this),this._addMapListeners()}}destroy(){this.map&&this.map.remove(),this._stopWatchSizeChangeToUpdateMinZoom()}getContainer(){return this.map&&this.map.getContainer()}getControlContainer(){const t=this.map&&this.map._controlContainer;if(t)return t;throw new Error("Leaflet Map is not initialized yet")}setCursor(t){this.map&&(this.map.getContainer().style.cursor=t)}setView(t,e){const s=this.map;if(s)if(Array.isArray(t)){const s=t,[i,o]=s;this.map&&("number"==typeof e?this.map.setView([o,i],e,{animate:!1}):this.setCenter([i,o]))}else{const{zoom:e,center:i,maxBounds:o,bounds:n,minZoom:r,maxZoom:a}=t;if(i&&void 0!==e?this.setView(i,e):(void 0!==e&&this.setZoom(e),i&&this.setCenter(i)),n&&this.fitBounds(n),void 0!==o)if(o){const t=D(o);s.setMaxBounds(t),s.setMinZoom(s.getBoundsZoom(t)),this._watchSizeChangeToUpdateMinZoom(t)}else s.setMaxBounds(null),this._stopWatchSizeChangeToUpdateMinZoom();void 0!==a&&s.setMaxZoom(a),void 0!==r&&(this._stopWatchSizeChangeToUpdateMinZoom(),s.setMinZoom(r))}}setCenter(t){const[e,s]=t;this.map&&this.map.panTo([s,e])}getCenter(){const t=this.map;if(t){const e=t.getBounds().getCenter();return[e.lng,e.lat]}}setZoom(t){this.map&&this.map.setZoom(t)}getZoom(){var t;return null!==(t=this.map&&this.map.getZoom())&&void 0!==t?t:void 0}getBounds(){if(!this.map)return;const t=this.map.getBounds(),e=t.getSouthWest(),s=t.getNorthEast();return[e.lng,e.lat,s.lng,s.lat]}fitBounds(t,e={}){if(this.map){const{maxZoom:s,offset:i,padding:o}=e,n={};s&&(n.maxZoom=s),o&&(n.padding=[o,o]),i&&(n.padding=i),this.map.fitBounds(D(t),n)}}getLayerAdapter(t){return R.layerAdapters[t]}createControl(t,e){return L(t,e,this)}createButtonControl(t){return function(t,e){const i=document.createElement("a"),o=t.title||"";i.href="#",i.title=o,i.setAttribute("role","button"),i.setAttribute("aria-label",o),t.addClass&&i.classList.add(t.addClass),s.disableClickPropagation(i),s.on(i,"click",s.stop),t.html instanceof HTMLElement?i.appendChild(t.html):"string"==typeof t.html&&(i.innerHTML=t.html);const n=e=>{e.stopPropagation(),t.onClick()};return L({onAdd:()=>(void 0!==t.onClick&&i.addEventListener("click",n),i),onRemove(){const e=i.parentNode;e&&e.removeChild(i),void 0!==t.onClick&&i.removeEventListener("click",n)}},{bar:!0},e)}(t,this)}addControl(t,e){if(t.options.position=e.replace("-",""),this.map)return this.map.addControl(t),t}removeControl(t){this.map&&this.map.removeControl(t)}removeLayer(t){t&&t.remove&&t.remove()}showLayer(t){this.map&&t.addTo(this.map)}hideLayer(t){t.remove()}setLayerOpacity(t,e){"setOpacity"in t&&t.setOpacity(e)}setLayerOrder(t,e,s){}onMapClick(t){const e=S(t);this.emitter.emit("preclick",e),this.emitter.emit("click",e)}locate(t,e){const s=this.map;if(s&&(s.locate(t),e)){const{locationfound:t,locationerror:i}=e,o=e=>{t({lngLat:[e.latlng.lng,e.latlng.lat]})};void 0!==t&&s.on("locationfound",o,this),i&&s.on("locationerror",i,this);return{stop:()=>{void 0!==t&&s.off("locationfound",o),i&&s.off("locationerror",i)}}}return{stop:()=>{}}}_addUnselectCb(t){for(const e of this._unselectCb)e();this._unselectCb.length=0,this._unselectCb.push(t)}_watchSizeChangeToUpdateMinZoom(t){this._stopWatchSizeChangeToUpdateMinZoom();const e=this.getContainer(),s=this.map;e&&s&&window.ResizeObserver&&(this._resizeObserver=new ResizeObserver((()=>{s.setMinZoom(s.getBoundsZoom(t))})),this._resizeObserver.observe(e))}_stopWatchSizeChangeToUpdateMinZoom(){const t=this.map;t&&t.setMinZoom(0),this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=void 0)}_addMapListeners(){const t=this.map;if(t){t.on("click",(t=>{this.onMapClick(t)}));for(const e of this._universalEvents)t.on(e,(()=>this.emitter.emit(e,this)),t);for(const e of this._positionEvents)t.on(e,(t=>this.emitter.emit(e,S(t))),t)}}}R.layerAdapters={GEOJSON:class extends k{constructor(t,e){super(t,e),this.selected=!1,this._layers=[],this._selectedLayers=[],this._filteredLayers=[],this._openedPopup=[],this.$updateTooltip=_((()=>{this.updateTooltip()}),300),this.$unselect=()=>{this.unselect()},this._events=new Z(this),this._paint=new E(this)}addLayer(t){return Object.assign(this.options,t),this.paint=t.paint,this.layer=new a([],{...t.nativeOptions,pane:this.pane}),this.selectedPaint=t.selectedPaint,t.paint=this.paint,t.data&&this.addData(t.data),this._addMapListener(),this.layer}beforeRemove(){this._removeMapListener()}select(t){if(this.unselect(),t){const e=this._layers.filter(t);for(const t of e)this._selectLayer(t,"api")}else this.selected||(this.selected=!0,this.selectedPaint&&this._paint.setPaintEachLayer(this.selectedPaint))}unselect(t){if(t){this._layers.filter(t).forEach((t=>{this._unSelectLayer(t)}))}else if(this.selected){for(const t of this._openedPopup)this._removePopup(t[0]);this.paint&&this._paint.setPaintEachLayer(this.paint),this._selectedLayers.length=0,this.selected=!1}}getSelected(){return this._selectedLayers.map((t=>({target:this,feature:t.feature,layer:t,...T(t.feature)})))}getFiltered(){return this._filteredLayers}filter(t){this._filterFun=t;const e=this.layer,s=e&&e._map;if(e&&s){e.remove();const i=[];this._layers.forEach((({feature:s,layer:o})=>{if(o){!t||t({target:this,feature:s,layer:o,...T(s)})?(e.addLayer(o),i.push({target:this,feature:s,layer:o,...T(s)})):e.removeLayer(o)}})),this._filteredLayers=i,e.addTo(s)}return this._filteredLayers}cleanFilter(){this.filter()}getLayers(){return this._layers.map((({layer:t,feature:e})=>({feature:e,layer:t,visible:t&&!!t._map,target:this,...T(e)})))}clearLayer(t){this.unselect();const e=this.layer;if(e)if(t)for(let s=this._layers.length;s--;){const i=this._layers[s];if(i){const{feature:o,layer:n}=i;if(o&&n){t(o)&&(e.removeLayer(n),this._layers.splice(s,1))}}}else e.clearLayers(),this._layers=[]}setData(t){this.clearLayer(),this.addData(t)}addData(t){const e=this.options;let s;if(e){if(t){let i;if(e.type)i=e.type;else{const e=function(t){let e;e="FeatureCollection"===t.type?b(t.features.map((t=>t.geometry.type))):"GeometryCollection"===t.type?b(t.geometries.map((t=>t.type))):"Feature"===t.type?t.geometry.type:t.type;return e}(t);i=O[e]}if(this.type&&this.type!==i)return void console.warn("no other data type than layer can be added");this.type=i,t=function(t,e){if("FeatureCollection"===t.type)t.features=t.features.filter((t=>x(t.geometry.type,e)));else if("Feature"===t.type){if(!x(t.geometry.type,e))return!1}else"GeometryCollection"===t.type&&(t.geometries=t.geometries.filter((t=>x(t.type,e))));return t}(t,i),t&&(s=this._getGeoJsonOptions(e,i))}new i(t||void 0,s)}}openPopup(t,e){if(t){this._layers.filter(t).forEach((t=>{this._openPopup(t,e,"api")}))}}closePopup(t){(t?this._openedPopup.filter((e=>t(e[2]))):this._openedPopup).forEach((t=>{this._removePopup(t[0])}))}updateTooltip(t){t?this._updateTooltip(t):this.getLayers().forEach((t=>this._updateTooltip({feature:t.feature,layer:t.layer})))}getExtent(){return this.getBounds()}getBounds(){if(this.layer){const t=this.layer.getBounds();if(t.isValid())return P(t)}}setOpacity(t){this.options.opacity=t,this.setPaint(this.paint),this.setSelectedPaint(this.selectedPaint)}setPaint(t){if(t){this.paint=t;for(const e of this._layers)this._paint.setPaint(e,t)}}setSelectedPaint(t){if(t){this.selectedPaint=t;for(const e of this._selectedLayers)this._paint.setPaint(e,t)}}updatePaint(t){this.paint={...this.paint,...t};for(const e of this._layers)this._paint.setPaint(e,this.paint)}updateSelectedPaint(t){this.selectedPaint={...this.selectedPaint,...t};for(const e of this._selectedLayers)this._paint.setPaint(e,this.selectedPaint)}_getSelected(t){return this._selectedLayers.find((e=>e.layer===t))}_updateTooltip(t){const{feature:e,layer:s}=t;if(e&&s&&e.properties&&this.options.labelField){s.unbindTooltip();const t=e.properties[this.options.labelField];if(void 0!==t){const e=!this.options.labelOnHover;s.bindTooltip(String(t),{permanent:e,sticky:!1})}}}async _openPopup(t,e={},s,i){var o,n;const{feature:r,layer:a}=t,{minWidth:l,autoPan:p,maxWidth:c,closeButton:h}={minWidth:300,...e},u=null!=h?h:!this.options.selectOnHover;let d;const m=[],y=t=>{m.push(t)},_=()=>{d&&this._removePopup(d)};let g;if(g=e.createPopupContent?await e.createPopupContent({layer:a,feature:r,target:this,type:s,close:_,onClose:y,...T(r)}):e.popupContent,g&&a){const e={minWidth:l,autoPan:p,closeButton:u,closeOnClick:!1,autoClose:!1};f(c)&&(e.maxWidth=c),d=a.bindPopup(g,e);if(null===(n=null===(o=this.options.popupOptions)||void 0===o?void 0:o.unselectOnClose)||void 0===n||n){const t=a.getPopup();t&&t.once("remove",(()=>{_()}),this)}this._openedPopup.push([d,m,t]),d.openPopup(i)}}_removePopup(t){var e,s;if(this.map){t.closePopup().unbindPopup();const i=this._openedPopup.findIndex((e=>e[0]===t));if(-1!==i){const t=null===(s=null===(e=this.options.popupOptions)||void 0===e?void 0:e.unselectOnClose)||void 0===s||s,[,o,n]=this._openedPopup[i];for(const e of o)e(n);o.length=0,t&&this._unSelectLayer(n),this._openedPopup.splice(i,1)}}}_getGeoJsonOptions(t,e){const s=t.paint;let i={};return"function"==typeof s?"point"===e?i.pointToLayer=(t,e)=>{const i=s(t);return this._paint.createPaintToLayer(i)(t,e)}:i={style:t=>this._paint.preparePaint(t?{...C,...s(t)}:{...C,type:"path"})}:i=this._paint.createPaintOptions(s),i.onEachFeature=(t,e)=>{this._onEachFeature(t,e)},i}_onEachFeature(t,e){const s=this.layer;if(s){const i={target:this,feature:t,layer:e,...T(t)};e.options.pane=this.pane,this._layers.push(i);let o=!0;if(this._filterFun&&(o=this._filterFun(i)),o){const{popup:o,popupOptions:n,selectable:r,interactive:a,selectOnHover:l}=this.options;e.options.interactive=!f(a)||a,s.addLayer(e),r&&(l?(e.on("mouseover",(()=>{this._selectLayer(i,"hover")})),e.on("mouseout",(()=>{this._unSelectLayer(i)}))):e.on("click",(t=>this._selectOnLayerClick(t)),this)),this._events.handleMouseEvents(e),setTimeout((()=>{o&&this._openPopup({target:this,layer:e,feature:t,...T(t)},n,"api"),this._updateTooltip({layer:e,feature:t})}))}}}_selectOnLayerClick(t){s.stopPropagation(t);const e=t.target,i=e.feature,o={target:this,layer:e,feature:i,...T(i)},n=this._getSelected(e);n?this.options&&this.options.unselectOnSecondClick&&this._unSelectLayer(n):this._selectLayer(o,"click",t.latlng)}_selectLayer(t,e,s){const{multiselect:i}=this.options;i||(this.map._addUnselectCb((()=>{this._unSelectLayer(t)})),this._selectedLayers.forEach((t=>this._unSelectLayer(t)))),this._selectedLayers.push(t),this.selected=!0;const{selectedPaint:o,popupOnSelect:n,popupOptions:r}=this.options;if(o&&t.layer&&this._paint.setPaint(t,o),n&&this._openPopup(t,r,e,s),this.options.onSelect){const s=t.feature?[t.feature]:[];this.options.onSelect({type:e,layer:this,features:s,...T(s)})}}_unSelectLayer(t){const e=this._selectedLayers.indexOf(t);-1!==e&&(this._selectedLayers.splice(e,1),this.options&&(this.options.paint&&this._paint.setPaint(t,this.options.paint),this.options.popupOnSelect&&t.layer&&this._removePopup(t.layer))),this.selected=this._selectedLayers.length>0}_addMapClickListener(){const t=this.map;if(t){const{unselectOnClick:e}=this.options;(null==e||e)&&t.on("click",this.$unselect)}}_removeMapClickListener(){this.map.off("zoomend",this.$updateTooltip),this.map.off("moveend",this.$updateTooltip),this.map.off("click",this.$unselect)}_addMapListener(){const t=this.map;if(t){const{labelField:e,labelOnHover:s}=this.options;this._addMapClickListener(),e&&!s&&(t.on("zoomend",this.$updateTooltip),t.on("moveend",this.$updateTooltip))}}_removeMapListener(){this._removeMapClickListener(),this.map.off("zoomend",this.$updateTooltip),this.map.off("moveend",this.$updateTooltip)}},IMAGE:class extends k{addLayer(t){const e=t&&t.url;if(e){const s=(t={transparent:!0,...t}).updateWmsParams;if(this.layer=new A(e,{pane:this.pane,headers:t.headers,setViewDelay:t.setViewDelay,...t,...t.params,...t.nativeOptions}),s){const t=this.layer.updateWmsParams;this.layer.updateWmsParams=function(e){t.call(this,e),this.wmsParams=s(this.wmsParams)}}return this.layer}}},TILE:I,WMS:class extends k{addLayer(t){Object.assign(this.options,t);const{url:e,...s}=t;if(e){const i={pane:this.pane,attribution:s.attribution,minZoom:s.minZoom,maxZoom:s.maxZoom,layers:t.layers,format:t.format,...t.nativeOptions};let o;return o=s.headers?new F(e,{...i,headers:s.headers}):new m.WMS(e,i),o}}},OSM:class extends I{addLayer(t){return super.addLayer({name:"OpenStreetMap",attribution:'© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',...t,url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"})}}},R.controlAdapters={ZOOM:e.Zoom,ATTRIBUTION:class extends e.Attribution{constructor(t){super(t);const e=t&&t.customAttribution;if(e){let t=[];Array.isArray(e)?t=e:e&&(t=[e]),t.forEach((t=>this.addAttribution(t)))}}}},R.Map=y;var V=R;export{V as default};
|
|
7
|
+
*/class A extends p{constructor(t,e){super(e),this.defaultWmsParams={service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},this.options={crs:null,uppercase:!1,attribution:"",opacity:1,isBack:!1,minZoom:0,pane:"tilePane",headers:null,viewPortBuffer:0,setViewDelay:100},this._url=t;const s={},i={};let o;for(o in e)o in this.options?i[o]=e[o]:s[o]=e[o];c.setOptions(this,i),this.wmsParams=c.extend({},this.defaultWmsParams,s)}setParams(t){c.extend(this.wmsParams,t),this.update()}getAttribution(){return this.options.attribution||""}onAdd(){return this.update(),this}onRemove(t){return this._currentOverlay&&(this._currentOverlay.cancelLoad(),t.removeLayer(this._currentOverlay),delete this._currentOverlay),this._currentUrl&&delete this._currentUrl,this}getEvents(){return{moveend:_(this.update,this.options.setViewDelay)}}update(){if(!this._map)return;this.updateWmsParams();const t=this.getImageUrl();if(this._currentUrl===t)return;this._currentUrl=t;const e=this.options.viewPortBuffer||0,s=this._map.getBounds().pad(e),i=new z(t,s,{opacity:0,pane:this.options.pane,headers:this.options.headers});i.addTo(this._map),this._currentOverlay&&this._currentOverlay.cancelLoad(),i.once("load",(()=>{this._map&&(i._url===this._currentUrl?(this._currentOverlay&&this._map.removeLayer(this._currentOverlay),this._currentOverlay=i,i.setOpacity(void 0!==this.options.opacity?this.options.opacity:1),!0===this.options.isBack&&i.bringToBack(),!1===this.options.isBack&&i.bringToFront(),void 0!==this.options.zIndex&&i.setZIndex(this.options.zIndex)):this._map.removeLayer(i))}),this);const{minZoom:o,maxZoom:n}=this.options;(o&&this._map.getZoom()<o||n&&this._map.getZoom()>n)&&this._map.removeLayer(i)}setOpacity(t){this.options.opacity=t,this._currentOverlay&&this._currentOverlay.setOpacity(t)}bringToBack(){this.options.isBack=!0,this._currentOverlay&&this._currentOverlay.bringToBack()}bringToFront(){this.options.isBack=!1,this._currentOverlay&&this._currentOverlay.bringToFront()}setZIndex(t){this.options.zIndex=t,this._currentOverlay&&this._currentOverlay.setZIndex(t)}updateWmsParams(t){t||(t=this._map);const e=this.options.viewPortBuffer||0,s=t.getBounds().pad(e),i=t.getSize();if(0!==this.options.viewPortBuffer){const t=e+1;i.x=Math.ceil(i.x*t),i.y=Math.ceil(i.y*t)}const o=parseFloat(this.wmsParams.version),n=this.options.crs||t.options.crs,r=o>=1.3?"crs":"srs";if(n){const t=n.project(s.getNorthWest()),e=n.project(s.getSouthEast()),a={width:i.x,height:i.y};a[r]=n.code,a.bbox=(o>=1.3&&n===h.EPSG4326?[e.y,t.x,t.y,e.x]:[t.x,e.y,e.x,t.y]).join(","),c.extend(this.wmsParams,a)}}getImageUrl(){const t=c.getParamString(this.wmsParams,this._url,this.options.uppercase||!1);return this._url+t}}function U(t){return class extends t{constructor(...t){super(...t),this.options.setViewDelay&&(this._update=function(t,e=10){let s;function i(...o){i.clear(),s=setTimeout((()=>{s=null,t.apply(this,o)}),e)}return i.clear=function(){s&&(clearTimeout(s),s=null)},i}(((...t)=>{u.prototype._update.call(this,...t)}),this.options.setViewDelay))}createTile(t,e){const s=this.getTileUrl(t),i=document.createElement("img");return i.abort=B(s,(t=>{i.src=t,e(null,i)}),this.options.headers),(this.options.crossOrigin||""===this.options.crossOrigin)&&(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),i.alt="",i.setAttribute("role","presentation"),i}_abortLoading(){const t=this._tiles,e=this._tileZoom;for(const s in t)if(t[s].coords.z!==e){const e=t[s].el;e.onload=c.falseFn,e.onerror=c.falseFn,e.complete||(e.abort&&e.abort(),e.src=c.emptyImageUrl,d.remove(e),delete t[s])}}}}const W=U(class extends m{constructor(t,e){super(t,e),Object.assign(this.options,e)}});class I extends k{addLayer(t){if(this.options=Object.assign(this.options,t),t){const{url:e,...s}=t;if(e){const t={pane:this.pane,attribution:s.attribution,minZoom:s.minZoom,maxZoom:s.maxZoom,...s.nativeOptions};let i;return s.subdomains&&(t.subdomains=s.subdomains),i=s.headers?new W(e,{...t,headers:s.headers,setViewDelay:s.setViewDelay}):new m(e,t),i}}}}const F=U(class extends m.WMS{constructor(t,e){super(t,e)}});function D(t){return[[t[3],t[0]],[t[1],t[2]]]}class R{constructor(){this.options={target:"map"},this.layerAdapters=R.layerAdapters,this.controlAdapters=R.controlAdapters,this.emitter=new t,this._unselectCb=[],this._universalEvents=["move","zoom","zoomend","zoomstart","moveend","movestart"],this._positionEvents=["mousemove","mouseout","mouseover"]}create(t){if(this.options={...t},this.options.target){const{zoom:t,center:e,maxZoom:s,minZoom:i,maxBounds:o,mapAdapterOptions:n}=this.options;this.map=this.options.map||new y(this.options.target,{attributionControl:!1,zoomControl:!1,maxBounds:o?D(o):void 0,maxZoom:s,minZoom:i,center:e&&[e[1],e[0]],zoom:t,...n});const r=this.map.createPane("order-0");this.map._addUnselectCb=t=>{this._addUnselectCb(t)},r.style.zIndex=String(0),this.emitter.emit("create",this),this._addMapListeners()}}destroy(){this.map&&this.map.remove(),this._stopWatchSizeChangeToUpdateMinZoom()}getContainer(){return this.map&&this.map.getContainer()}getControlContainer(){const t=this.map&&this.map._controlContainer;if(t)return t;throw new Error("Leaflet Map is not initialized yet")}setCursor(t){this.map&&(this.map.getContainer().style.cursor=t)}setView(t,e){const s=this.map;if(s)if(Array.isArray(t)){const s=t,[i,o]=s;this.map&&("number"==typeof e?this.map.setView([o,i],e,{animate:!1}):this.setCenter([i,o]))}else{const{zoom:e,center:i,maxBounds:o,bounds:n,minZoom:r,maxZoom:a}=t;if(i&&void 0!==e?this.setView(i,e):(void 0!==e&&this.setZoom(e),i&&this.setCenter(i)),n&&this.fitBounds(n),void 0!==o)if(o){const t=D(o);s.setMaxBounds(t),s.setMinZoom(s.getBoundsZoom(t)),this._watchSizeChangeToUpdateMinZoom(t)}else s.setMaxBounds(null),this._stopWatchSizeChangeToUpdateMinZoom();void 0!==a&&s.setMaxZoom(a),void 0!==r&&(this._stopWatchSizeChangeToUpdateMinZoom(),s.setMinZoom(r))}}setCenter(t){const[e,s]=t;this.map&&this.map.panTo([s,e])}getCenter(){const t=this.map;if(t){const e=t.getBounds().getCenter();return[e.lng,e.lat]}}setZoom(t){this.map&&this.map.setZoom(t)}getZoom(){var t;return null!==(t=this.map&&this.map.getZoom())&&void 0!==t?t:void 0}getBounds(){if(!this.map)return;const t=this.map.getBounds(),e=t.getSouthWest(),s=t.getNorthEast();return[e.lng,e.lat,s.lng,s.lat]}fitBounds(t,e={}){if(this.map){const{maxZoom:s,offset:i,padding:o}=e,n={};s&&(n.maxZoom=s),o&&(n.padding=[o,o]),i&&(n.padding=i),this.map.fitBounds(D(t),n)}}getLayerAdapter(t){return R.layerAdapters[t]}createControl(t,e){return L(t,e,this)}createButtonControl(t){return function(t,e){const i=document.createElement("a"),o=t.title||"";i.href="#",i.title=o,i.setAttribute("role","button"),i.setAttribute("aria-label",o),t.addClass&&i.classList.add(t.addClass),s.disableClickPropagation(i),s.on(i,"click",s.stop),t.html instanceof HTMLElement?i.appendChild(t.html):"string"==typeof t.html&&(i.innerHTML=t.html);const n=e=>{e.stopPropagation(),t.onClick()};return L({onAdd:()=>(void 0!==t.onClick&&i.addEventListener("click",n),i),onRemove(){const e=i.parentNode;e&&e.removeChild(i),void 0!==t.onClick&&i.removeEventListener("click",n)}},{bar:!0},e)}(t,this)}addControl(t,e){if(t.options.position=e.replace("-",""),this.map)return this.map.addControl(t),t}removeControl(t){this.map&&this.map.removeControl(t)}removeLayer(t){t&&t.remove&&t.remove()}showLayer(t){this.map&&t.addTo(this.map)}hideLayer(t){t.remove()}setLayerOpacity(t,e){"setOpacity"in t&&t.setOpacity(e)}setLayerOrder(t,e,s){}onMapClick(t){const e=S(t);this.emitter.emit("preclick",e),this.emitter.emit("click",e)}locate(t,e){const s=this.map;if(s&&(s.locate(t),e)){const{locationfound:t,locationerror:i}=e,o=e=>{t({lngLat:[e.latlng.lng,e.latlng.lat]})};void 0!==t&&s.on("locationfound",o,this),i&&s.on("locationerror",i,this);return{stop:()=>{void 0!==t&&s.off("locationfound",o),i&&s.off("locationerror",i)}}}return{stop:()=>{}}}_addUnselectCb(t){for(const e of this._unselectCb)e();this._unselectCb.length=0,this._unselectCb.push(t)}_watchSizeChangeToUpdateMinZoom(t){this._stopWatchSizeChangeToUpdateMinZoom();const e=this.getContainer(),s=this.map;e&&s&&window.ResizeObserver&&(this._resizeObserver=new ResizeObserver((()=>{s.setMinZoom(s.getBoundsZoom(t))})),this._resizeObserver.observe(e))}_stopWatchSizeChangeToUpdateMinZoom(){const t=this.map;t&&t.setMinZoom(0),this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=void 0)}_addMapListeners(){const t=this.map;if(t){t.on("click",(t=>{this.onMapClick(t)}));for(const e of this._universalEvents)t.on(e,(()=>this.emitter.emit(e,this)),t);for(const e of this._positionEvents)t.on(e,(t=>this.emitter.emit(e,S(t))),t)}}}R.layerAdapters={GEOJSON:class extends k{constructor(t,e){super(t,e),this.selected=!1,this._layers=[],this._selectedLayers=[],this._filteredLayers=[],this._openedPopup=[],this.$updateTooltip=_((()=>{this.updateTooltip()}),300),this.$unselect=()=>{this.unselect()},this._events=new Z(this),this._paint=new E(this)}addLayer(t){return Object.assign(this.options,t),this.paint=t.paint,this.layer=new a([],{...t.nativeOptions,pane:this.pane}),this.selectedPaint=t.selectedPaint,t.paint=this.paint,t.data&&this.addData(t.data),this._addMapListener(),this.layer}beforeRemove(){this._removeMapListener()}select(t){if(this.unselect(),t){const e=this._layers.filter(t);for(const t of e)this._selectLayer(t,"api")}else this.selected||(this.selected=!0,this.selectedPaint&&this._paint.setPaintEachLayer(this.selectedPaint))}unselect(t){if(t){this._layers.filter(t).forEach((t=>{this._unSelectLayer(t)}))}else if(this.selected){for(const t of this._openedPopup)this._removePopup(t[0]);this.paint&&this._paint.setPaintEachLayer(this.paint),this._selectedLayers.length=0,this.selected=!1}}getSelected(){return this._selectedLayers.map((t=>({target:this,feature:t.feature,layer:t,...T(t.feature)})))}getFiltered(){return this._filteredLayers}filter(t){this._filterFun=t;const e=this.layer,s=e&&e._map;if(e&&s){e.remove();const i=[];this._layers.forEach((({feature:s,layer:o})=>{if(o){!t||t({target:this,feature:s,layer:o,...T(s)})?(e.addLayer(o),i.push({target:this,feature:s,layer:o,...T(s)})):e.removeLayer(o)}})),this._filteredLayers=i,e.addTo(s)}return this._filteredLayers}cleanFilter(){this.filter()}getLayers(){return this._layers.map((({layer:t,feature:e})=>({feature:e,layer:t,visible:t&&!!t._map,target:this,...T(e)})))}clearLayer(t){this.unselect();const e=this.layer;if(e)if(t)for(let s=this._layers.length;s--;){const i=this._layers[s];if(i){const{feature:o,layer:n}=i;if(o&&n){t(o)&&(e.removeLayer(n),this._layers.splice(s,1))}}}else e.clearLayers(),this._layers=[]}setData(t){this.clearLayer(),this.addData(t)}addData(t){const e=this.options;let s;if(e){if(t){let i;if(e.type)i=e.type;else{const e=function(t){let e;e="FeatureCollection"===t.type?b(t.features.map((t=>t.geometry.type))):"GeometryCollection"===t.type?b(t.geometries.map((t=>t.type))):"Feature"===t.type?t.geometry.type:t.type;return e}(t);i=O[e]}if(this.type&&this.type!==i)return void console.warn("no other data type than layer can be added");this.type=i,t=function(t,e){if("FeatureCollection"===t.type)t.features=t.features.filter((t=>x(t.geometry.type,e)));else if("Feature"===t.type){if(!x(t.geometry.type,e))return!1}else"GeometryCollection"===t.type&&(t.geometries=t.geometries.filter((t=>x(t.type,e))));return t}(t,i),t&&(s=this._getGeoJsonOptions(e,i))}new i(t||void 0,s)}}openPopup(t,e){if(t){this._layers.filter(t).forEach((t=>{this._openPopup(t,e,"api")}))}}closePopup(t){(t?this._openedPopup.filter((e=>t(e[2]))):this._openedPopup).forEach((t=>{this._removePopup(t[0])}))}updateTooltip(t){t?this._updateTooltip(t):this.getLayers().forEach((t=>this._updateTooltip({feature:t.feature,layer:t.layer})))}getExtent(){return this.getBounds()}getBounds(){if(this.layer){const t=this.layer.getBounds();if(t.isValid())return P(t)}}setOpacity(t){this.options.opacity=t,this.setPaint(this.paint),this.setSelectedPaint(this.selectedPaint)}setPaint(t){if(t){this.paint=t;for(const e of this._layers)this._paint.setPaint(e,t)}}setSelectedPaint(t){if(t){this.selectedPaint=t;for(const e of this._selectedLayers)this._paint.setPaint(e,t)}}updatePaint(t){this.paint={...this.paint,...t};for(const e of this._layers)this._paint.setPaint(e,this.paint)}updateSelectedPaint(t){this.selectedPaint={...this.selectedPaint,...t};for(const e of this._selectedLayers)this._paint.setPaint(e,this.selectedPaint)}_getSelected(t){return this._selectedLayers.find((e=>e.layer===t))}_updateTooltip(t){const{feature:e,layer:s}=t,{label:i,labelField:o,labelOnHover:n}=this.options;if(s){let r;if(s.unbindTooltip(),e.properties&&o?r=e.properties[o]:i&&(r=i({target:this,...t,...T(e)})),r){const t=!n;s.bindTooltip(String(r),{permanent:t,sticky:!1})}}}async _openPopup(t,e={},s,i){var o,n;const{feature:r,layer:a}=t,{minWidth:l,autoPan:p,maxWidth:c,closeButton:h}={minWidth:300,...e},u=null!=h?h:!this.options.selectOnHover;let d;const m=[],y=t=>{m.push(t)},_=()=>{d&&this._removePopup(d)};let g;if(g=e.createPopupContent?await e.createPopupContent({layer:a,feature:r,target:this,type:s,close:_,onClose:y,...T(r)}):e.popupContent,g&&a){const e={minWidth:l,autoPan:p,closeButton:u,closeOnClick:!1,autoClose:!1};f(c)&&(e.maxWidth=c),d=a.bindPopup(g,e);if(null===(n=null===(o=this.options.popupOptions)||void 0===o?void 0:o.unselectOnClose)||void 0===n||n){const t=a.getPopup();t&&t.once("remove",(()=>{_()}),this)}this._openedPopup.push([d,m,t]),d.openPopup(i)}}_removePopup(t){var e,s;if(this.map){t.closePopup().unbindPopup();const i=this._openedPopup.findIndex((e=>e[0]===t));if(-1!==i){const t=null===(s=null===(e=this.options.popupOptions)||void 0===e?void 0:e.unselectOnClose)||void 0===s||s,[,o,n]=this._openedPopup[i];for(const e of o)e(n);o.length=0,t&&this._unSelectLayer(n),this._openedPopup.splice(i,1)}}}_getGeoJsonOptions(t,e){const s=t.paint;let i={};return"function"==typeof s?"point"===e?i.pointToLayer=(t,e)=>{const i=s(t);return this._paint.createPaintToLayer(i)(t,e)}:i={style:t=>this._paint.preparePaint(t?{...C,...s(t)}:{...C,type:"path"})}:i=this._paint.createPaintOptions(s),i.onEachFeature=(t,e)=>{this._onEachFeature(t,e)},i}_onEachFeature(t,e){const s=this.layer;if(s){const i={target:this,feature:t,layer:e,...T(t)};e.options.pane=this.pane,this._layers.push(i);let o=!0;if(this._filterFun&&(o=this._filterFun(i)),o){const{popup:o,popupOptions:n,selectable:r,interactive:a,selectOnHover:l}=this.options;e.options.interactive=!f(a)||a,s.addLayer(e),r&&(l?(e.on("mouseover",(()=>{this._selectLayer(i,"hover")})),e.on("mouseout",(()=>{this._unSelectLayer(i)}))):e.on("click",(t=>this._selectOnLayerClick(t)),this)),this._events.handleMouseEvents(e),setTimeout((()=>{o&&this._openPopup({target:this,layer:e,feature:t,...T(t)},n,"api"),this._updateTooltip({layer:e,feature:t})}))}}}_selectOnLayerClick(t){s.stopPropagation(t);const e=t.target,i=e.feature,o={target:this,layer:e,feature:i,...T(i)},n=this._getSelected(e);n?this.options&&this.options.unselectOnSecondClick&&this._unSelectLayer(n):this._selectLayer(o,"click",t.latlng)}_selectLayer(t,e,s){const{multiselect:i}=this.options;i||(this.map._addUnselectCb((()=>{this._unSelectLayer(t)})),this._selectedLayers.forEach((t=>this._unSelectLayer(t)))),this._selectedLayers.push(t),this.selected=!0;const{selectedPaint:o,popupOnSelect:n,popupOptions:r}=this.options;if(o&&t.layer&&this._paint.setPaint(t,o),n&&this._openPopup(t,r,e,s),this.options.onSelect){const s=t.feature?[t.feature]:[];this.options.onSelect({type:e,layer:this,features:s,...T(s)})}}_unSelectLayer(t){const e=this._selectedLayers.indexOf(t);-1!==e&&(this._selectedLayers.splice(e,1),this.options&&(this.options.paint&&this._paint.setPaint(t,this.options.paint),this.options.popupOnSelect&&t.layer&&this._removePopup(t.layer))),this.selected=this._selectedLayers.length>0}_addMapClickListener(){const t=this.map;if(t){const{unselectOnClick:e}=this.options;(null==e||e)&&t.on("click",this.$unselect)}}_removeMapClickListener(){this.map.off("zoomend",this.$updateTooltip),this.map.off("moveend",this.$updateTooltip),this.map.off("click",this.$unselect)}_addMapListener(){const t=this.map;if(t){const{label:e,labelField:s,labelOnHover:i}=this.options;this._addMapClickListener(),!s&&!e||i||(t.on("zoomend",this.$updateTooltip),t.on("moveend",this.$updateTooltip))}}_removeMapListener(){this._removeMapClickListener(),this.map.off("zoomend",this.$updateTooltip),this.map.off("moveend",this.$updateTooltip)}},IMAGE:class extends k{addLayer(t){const e=t&&t.url;if(e){const s=(t={transparent:!0,...t}).updateWmsParams;if(this.layer=new A(e,{pane:this.pane,headers:t.headers,setViewDelay:t.setViewDelay,...t,...t.params,...t.nativeOptions}),s){const t=this.layer.updateWmsParams;this.layer.updateWmsParams=function(e){t.call(this,e),this.wmsParams=s(this.wmsParams)}}return this.layer}}},TILE:I,WMS:class extends k{addLayer(t){Object.assign(this.options,t);const{url:e,...s}=t;if(e){const i={pane:this.pane,attribution:s.attribution,minZoom:s.minZoom,maxZoom:s.maxZoom,layers:t.layers,format:t.format,...t.nativeOptions};let o;return o=s.headers?new F(e,{...i,headers:s.headers}):new m.WMS(e,i),o}}},OSM:class extends I{addLayer(t){return super.addLayer({name:"OpenStreetMap",attribution:'© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',...t,url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"})}}},R.controlAdapters={ZOOM:e.Zoom,ATTRIBUTION:class extends e.Attribution{constructor(t){super(t);const e=t&&t.customAttribution;if(e){let t=[];Array.isArray(e)?t=e:e&&(t=[e]),t.forEach((t=>this.addAttribution(t)))}}}},R.Map=y;var V=R;export{V as default};
|
|
8
8
|
//# sourceMappingURL=leaflet-map-adapter.esm-bundler.prod.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leaflet-map-adapter.esm-bundler.prod.js","sources":["../src/controls/createControl.ts","../src/utils/boundsToArray.ts","../src/utils/detectType.ts","../src/utils/geometries.ts","../src/layer-adapters/BaseAdapter.ts","../src/utils/convertMapClickEvent.ts","../src/layer-adapters/GeoJsonAdapter/utils/GeoJsonEvents.ts","../src/utils/createMouseEvent.ts","../src/layer-adapters/GeoJsonAdapter/utils/GeojsonPaint.ts","../src/utils/callAjax.ts","../src/layer-adapters/ImageAdapter/ImageOverlay.ts","../src/layer-adapters/ImageAdapter/ImageLayer.ts","../src/utils/makeRemoteTileLayer.ts","../../utils/src/debounce.ts","../src/layer-adapters/TileAdapter/TileLayer.ts","../src/layer-adapters/TileAdapter/TileAdapter.ts","../src/layer-adapters/WmsAdapter/WmsLayer.ts","../src/utils/arrayToBoundsExpression.ts","../src/LeafletMapAdapter.ts","../src/controls/createButtonControl.ts","../src/layer-adapters/GeoJsonAdapter/GeoJsonAdapter.ts","../src/layer-adapters/ImageAdapter/ImageAdapter.ts","../src/layer-adapters/WmsAdapter/WmsAdapter.ts","../src/layer-adapters/OsmAdapter.ts","../src/controls/Attribution.ts","../src/index.ts"],"sourcesContent":["import { Control, DomEvent } from 'leaflet';\n\nimport type {\n CreateControlOptions,\n MapAdapter,\n MapControl,\n} from '@nextgis/webmap';\n\nexport function createControl(\n control: MapControl,\n options: CreateControlOptions = {},\n map: MapAdapter,\n): Control {\n const C = Control.extend({\n onAdd() {\n const element = document.createElement('div');\n const content = control.onAdd(map);\n element.classList.add('leaflet-control');\n if (options.bar) {\n element.classList.add('leaflet-bar');\n }\n if (options.addClass) {\n element.classList.add(options.addClass);\n }\n if (!options.margin && !options.bar) {\n element.style.marginBottom = '0px';\n element.style.marginTop = '0px';\n element.style.marginLeft = '0px';\n element.style.marginRight = '0px';\n }\n if (content) {\n element.appendChild(content);\n }\n\n DomEvent.disableClickPropagation(element);\n\n return element;\n },\n onRemove() {\n control.onRemove();\n },\n });\n return new C();\n}\n","import type { LngLatBoundsArray } from '@nextgis/utils';\nimport type { LatLngBounds } from 'leaflet';\n\nexport function boundsToArray(bounds: LatLngBounds): LngLatBoundsArray {\n const ne = bounds.getNorthEast();\n const sw = bounds.getSouthWest();\n return [sw.lng, sw.lat, ne.lng, ne.lat];\n}\n","import type {\n Feature,\n FeatureCollection,\n GeoJsonGeometryTypes,\n GeoJsonObject,\n GeometryCollection,\n} from 'geojson';\n\nfunction findMostFrequentGeomType(\n arr: GeoJsonGeometryTypes[],\n): GeoJsonGeometryTypes {\n const counts: { [x: string]: number } = {};\n for (let fry = 0; fry < arr.length; fry++) {\n counts[arr[fry]] = 1 + (counts[arr[fry]] || 0);\n }\n let maxName = '';\n for (const c in counts) {\n const maxCount = maxName ? counts[maxName] : 0;\n if (counts[c] > maxCount) {\n maxName = c;\n }\n }\n return maxName as GeoJsonGeometryTypes;\n}\n\nexport function detectType(geojson: GeoJsonObject): GeoJsonGeometryTypes {\n let geometry: GeoJsonGeometryTypes;\n if (geojson.type === 'FeatureCollection') {\n const featuresTypes = (geojson as FeatureCollection).features.map(\n (f) => f.geometry.type,\n );\n geometry = findMostFrequentGeomType(featuresTypes);\n } else if (geojson.type === 'GeometryCollection') {\n const geometryTypes = (geojson as GeometryCollection).geometries.map(\n (g) => g.type,\n );\n geometry = findMostFrequentGeomType(geometryTypes);\n } else if (geojson.type === 'Feature') {\n geometry = (geojson as Feature).geometry.type;\n } else {\n geometry = geojson.type;\n }\n return geometry;\n}\n","import { GeoJSON } from 'leaflet';\n\nimport { boundsToArray } from './boundsToArray';\n\nimport type { LngLatArray, LngLatBoundsArray } from '@nextgis/utils';\nimport type { FeaturePosition, VectorAdapterLayerType } from '@nextgis/webmap';\nimport type {\n Feature,\n FeatureCollection,\n GeoJsonGeometryTypes,\n GeoJsonObject,\n GeometryCollection,\n} from 'geojson';\nimport type { LatLngBounds } from 'leaflet';\n\nexport const typeAlias: {\n [key in GeoJsonGeometryTypes]: VectorAdapterLayerType;\n} = {\n Point: 'point',\n LineString: 'line',\n MultiPoint: 'point',\n Polygon: 'polygon',\n MultiLineString: 'line',\n MultiPolygon: 'polygon',\n GeometryCollection: 'polygon',\n};\n\nexport const PAINT = {\n stroke: false,\n opacity: 1,\n};\n\nexport const backAliases: {\n [key in VectorAdapterLayerType]?: GeoJsonGeometryTypes[];\n} = {};\n\nfor (const a in typeAlias) {\n const layerType = typeAlias[a as GeoJsonGeometryTypes];\n const backAlias = backAliases[layerType] || [];\n backAlias.push(a as GeoJsonGeometryTypes);\n backAliases[layerType] = backAlias;\n}\n\nexport function geometryFilter(\n geometry: GeoJsonGeometryTypes,\n type: VectorAdapterLayerType,\n): boolean {\n const geoJsonGeometry = backAliases[type] || [];\n return geoJsonGeometry.indexOf(geometry) !== -1;\n}\n\nexport function filterGeometries(\n data: GeoJsonObject,\n type: VectorAdapterLayerType,\n): GeoJsonObject | false {\n if (data.type === 'FeatureCollection') {\n const _data = data as FeatureCollection;\n _data.features = _data.features.filter((f) =>\n geometryFilter(f.geometry.type, type),\n );\n } else if (data.type === 'Feature') {\n const allow = geometryFilter((data as Feature).geometry.type, type);\n if (!allow) {\n return false;\n }\n } else if (data.type === 'GeometryCollection') {\n const _data = data as GeometryCollection;\n _data.geometries = _data.geometries.filter((g) =>\n geometryFilter(g.type, type),\n );\n }\n return data;\n}\n\nfunction featuresBounds(features: Feature | Feature[]): LatLngBounds {\n const geoJsonLayer = new GeoJSON();\n const features_ = Array.isArray(features) ? features : [features];\n features_.forEach((f) => geoJsonLayer.addData(f));\n return geoJsonLayer.getBounds();\n}\n\nexport function getFeaturesBounds(\n features: Feature | Feature[],\n): LngLatBoundsArray {\n return boundsToArray(featuresBounds(features));\n}\n\nexport function getFeaturesCenter(features: Feature | Feature[]): LngLatArray {\n const { lat, lng } = featuresBounds(features).getCenter();\n return [lng, lat];\n}\n\nexport function createFeaturePositionOptions(\n features: Feature | Feature[],\n): FeaturePosition {\n return {\n getBounds: () => getFeaturesBounds(features),\n getCenter: () => getFeaturesCenter(features),\n };\n}\n","import type { AdapterOptions, MainLayerAdapter } from '@nextgis/webmap';\nimport type { Map } from 'leaflet';\n\nexport class BaseAdapter<O extends AdapterOptions = AdapterOptions, L = any>\n implements MainLayerAdapter<Map, L, O>\n{\n layer?: L;\n protected pane = 'order-0';\n\n constructor(\n public map: Map,\n public options: O,\n ) {\n if (options.order !== undefined) {\n const pane = 'order-' + options.order;\n let exist = map.getPane(pane);\n if (!exist) {\n exist = map.createPane(pane);\n }\n exist.style.zIndex = String(Math.round(options.order * 100));\n this.pane = pane;\n }\n }\n\n addLayer(options: O): L | Promise<L> | undefined {\n Object.assign(this.options, options);\n return undefined;\n }\n}\n","import type { MapClickEvent } from '@nextgis/webmap';\nimport type { LeafletMouseEvent } from 'leaflet';\n\nexport function convertMapClickEvent(evt: LeafletMouseEvent): MapClickEvent {\n const coord = evt.containerPoint;\n const latLng = evt.latlng;\n const { lat, lng } = latLng;\n return {\n latLng,\n lngLat: [lng, lat],\n pixel: { left: coord.x, top: coord.y },\n source: evt,\n };\n}\n","import { createMouseEvent } from '../../../utils/createMouseEvent';\n\nimport type { GeoJsonAdapter } from '../GeoJsonAdapter';\nimport type { OnLayerMouseOptions } from '@nextgis/webmap';\nimport type { Layer } from 'leaflet';\nimport type { LeafletEvent, LeafletMouseEvent } from 'leaflet';\n\nexport class GeoJsonEvents {\n private layer: GeoJsonAdapter;\n\n private _onclick?: (e: LeafletMouseEvent) => void;\n private _mouseout?: (e: LeafletMouseEvent) => void;\n private _mouseover?: (e: LeafletMouseEvent) => void;\n\n constructor(layer: GeoJsonAdapter) {\n this.layer = layer;\n }\n\n handleMouseEvents(layer: Layer) {\n const { onClick, onLayerClick, onMouseOut, onMouseOver } =\n this.layer.options;\n // TODO: remove backward compatibility for onLayerClick\n const onClick_ = onClick || onLayerClick;\n\n if (onClick_) {\n this._onclick = (e: LeafletMouseEvent) => {\n const selected = !!this.layer._getSelected(layer);\n onClick_({\n selected,\n ...this._createMouseEvent(e),\n });\n };\n layer.on('click', this._onclick, this);\n }\n if (onMouseOut) {\n this._mouseout = (e: LeafletMouseEvent) => {\n onMouseOut(this._createMouseEvent(e));\n };\n layer.on('mouseout', this._mouseout, this);\n }\n if (onMouseOver) {\n this._mouseover = (e: LeafletMouseEvent) => {\n onMouseOver(this._createMouseEvent(e));\n };\n layer.on('mouseover', this._mouseover, this);\n }\n }\n\n stopMouseEvents(layer: Layer) {\n if (this._mouseover) {\n layer.off('mouseover', this._mouseover, this);\n }\n if (this._mouseout) {\n layer.off('mouseout', this._mouseout, this);\n }\n if (this._onclick) {\n layer.off('click', this._onclick, this);\n }\n }\n\n private _createMouseEvent(source: LeafletEvent): OnLayerMouseOptions {\n return createMouseEvent({\n layer: this.layer,\n source: source as LeafletMouseEvent,\n });\n }\n}\n","import { convertMapClickEvent } from './convertMapClickEvent';\nimport { createFeaturePositionOptions } from './geometries';\n\nimport type { LayerDef } from '../layer-adapters/GeoJsonAdapter/GeoJsonAdapter';\nimport type { LayerAdapter, OnLayerMouseOptions } from '@nextgis/webmap';\nimport type { LeafletMouseEvent } from 'leaflet';\n\nexport interface CreateMouseEventOptions {\n layer: LayerAdapter;\n source: LeafletMouseEvent;\n}\n\nexport function createMouseEvent({\n layer,\n source,\n}: CreateMouseEventOptions): OnLayerMouseOptions {\n const layer_ = source.target as LayerDef;\n const feature = layer_.feature;\n const opt: OnLayerMouseOptions = {\n layer,\n feature,\n event: convertMapClickEvent(source),\n source,\n ...createFeaturePositionOptions(feature),\n };\n return opt;\n}\n","import { isPaint, isPaintCallback } from '@nextgis/paint';\nimport { defined } from '@nextgis/utils';\nimport { CircleMarker, DivIcon, Marker } from 'leaflet';\n\nimport { PAINT } from '../../../utils/geometries';\n\nimport type { GeoJsonAdapter, LayerDef } from '../GeoJsonAdapter';\nimport type {\n IconPaint,\n PathPaint,\n VectorAdapterLayerPaint,\n} from '@nextgis/paint';\nimport type {\n CircleMarkerOptions,\n GeoJSONOptions,\n LatLngExpression,\n Path,\n PathOptions,\n} from 'leaflet';\n\nexport class GeoJsonPaint {\n private layer: GeoJsonAdapter;\n\n constructor(layer: GeoJsonAdapter) {\n this.layer = layer;\n }\n\n setPaintEachLayer(paint: VectorAdapterLayerPaint) {\n this.layer._layers.forEach((layerDef) => {\n this.setPaint(layerDef, paint);\n });\n }\n\n setPaint(layerDef: LayerDef, paint: VectorAdapterLayerPaint) {\n let style: VectorAdapterLayerPaint | undefined = undefined;\n const { layer, feature } = layerDef;\n if (layer && feature) {\n if (isPaintCallback(paint)) {\n style = paint(feature);\n } else if (isPaint(paint)) {\n style = paint;\n }\n if (style) {\n if (this.layer.type === 'point' && style.type === 'icon') {\n const marker = layer as Marker;\n const divIcon = this._createDivIcon(style);\n setTimeout(() => {\n marker.setIcon(divIcon);\n }, 10);\n } else if ('setStyle' in layer) {\n (layer as Path).setStyle(this.preparePaint(style));\n }\n }\n }\n }\n\n preparePaint(paint: VectorAdapterLayerPaint): PathOptions {\n if (paint.type !== 'get-paint') {\n const paintAliases: [keyof PathOptions, keyof PathPaint][] = [\n ['color', 'strokeColor'],\n ['opacity', 'strokeOpacity'],\n ['stroke', 'stroke'],\n ['fillColor', 'fillColor'],\n ['fillOpacity', 'fillOpacity'],\n ['fill', 'fill'],\n ['weight', 'weight'],\n ];\n const aliases: [keyof PathOptions, keyof PathPaint][] =\n this.layer.type === 'line'\n ? [\n ['color', 'strokeColor'],\n ['opacity', 'strokeOpacity'],\n ['weight', 'weight'],\n ]\n : paintAliases;\n\n const readyPaint: PathOptions & CircleMarkerOptions = {};\n\n if ('radius' in paint && typeof paint.radius === 'number') {\n readyPaint.radius = paint.radius;\n }\n for (const [to, from] of aliases) {\n const opacity = this.layer.options.opacity;\n let paintProp = (paint as PathPaint)[from];\n if (defined(opacity) && from.toLowerCase().indexOf('opacity') !== -1) {\n paintProp = Number(paintProp) * opacity;\n }\n\n if (paintProp !== undefined) {\n Object.defineProperty(readyPaint, to, {\n enumerable: true,\n value: paintProp,\n });\n }\n }\n\n return readyPaint;\n }\n return PAINT;\n }\n\n _createDivIcon(icon: IconPaint) {\n const { html, rotate, className, ...toLIconOpt } = icon;\n\n const element = document.createElement('div');\n if (className) {\n element.className = className;\n }\n if (rotate) {\n element.style.transform = `rotateZ(${rotate}deg)`;\n }\n if (html) {\n element.innerHTML = html;\n }\n\n const divIcon = new DivIcon({\n className: '',\n ...toLIconOpt,\n html: element,\n });\n return divIcon;\n }\n\n createPaintToLayer(icon: IconPaint) {\n if (icon && icon.type) {\n if (icon.type === 'icon') {\n const iconClassName = icon.className;\n const html = icon.html;\n if (iconClassName || html) {\n return (_: any, latlng: LatLngExpression) => {\n const divIcon = this._createDivIcon(icon);\n return new Marker(latlng, { icon: divIcon });\n };\n }\n } else if (icon.type === 'pin') {\n return (_: any, latlng: LatLngExpression) => {\n return new Marker(latlng);\n };\n }\n }\n return (_: any, latlng: LatLngExpression) => {\n const p: any = PAINT;\n return new CircleMarker(latlng, this.preparePaint({ ...p, ...icon }));\n };\n }\n\n createPaintOptions(paint: VectorAdapterLayerPaint): GeoJSONOptions {\n const geoJsonOptions: GeoJSONOptions = {};\n const newPaint = this.preparePaint(paint);\n if (paint) {\n geoJsonOptions.style = () => {\n return newPaint;\n };\n }\n if (this.layer.type === 'point') {\n (geoJsonOptions as any).pointToLayer = this.createPaintToLayer(\n paint as IconPaint,\n );\n } else if (this.layer.type === 'line') {\n newPaint.stroke = true;\n }\n return geoJsonOptions;\n }\n}\n","export function callAjax(\n src: string,\n callback: (resp: any) => any,\n headers: Record<string, any>,\n): () => void {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', src);\n xhr.responseType = 'arraybuffer';\n for (const h in headers) {\n xhr.setRequestHeader(h, headers[h]);\n }\n xhr.onload = function () {\n const arrayBufferView = new Uint8Array(this.response);\n const blob = new Blob([arrayBufferView], { type: 'image/png' });\n // @ts-ignore for typedoc\n const urlCreator = window.URL || window.webkitURL;\n const imageUrl = urlCreator.createObjectURL(blob);\n callback(imageUrl);\n };\n xhr.send();\n return () => {\n xhr.abort();\n };\n}\n","import { ImageOverlay as LImageOverlay } from 'leaflet';\n\nimport { callAjax } from '../../utils/callAjax';\n\nimport type { ImageOverlayOptions, LatLngBoundsExpression } from 'leaflet';\n\ntype IOptions = ImageOverlayOptions & { headers?: any };\n\nexport class ImageOverlay extends LImageOverlay {\n private _abort: (() => void)[] = [];\n\n constructor(\n imageUrl: string,\n bounds: LatLngBoundsExpression,\n options?: IOptions,\n ) {\n super(imageUrl, bounds, options);\n }\n\n cancelLoad(): void {\n if (this._abort) {\n this._abort.forEach((x) => x());\n this._abort = [];\n }\n }\n\n _initImage(): void {\n // @ts-ignore\n super._initImage();\n // @ts-ignore\n const headers = this.options.headers;\n if (headers) {\n // @ts-ignore\n const img: HTMLImageElement = this._image;\n const src = img.src;\n img.src = '';\n this._abort.push(\n callAjax(\n src,\n (response) => {\n img.src = response;\n },\n headers,\n ),\n );\n }\n }\n}\n","/*!\n * leaflet.wms.js\n * A collection of Leaflet utilities for working with Web Mapping services.\n * (c) 2014-2016, Houston Engineering, Inc.\n * MIT License\n */\n\nimport { debounce } from '@nextgis/utils';\nimport { CRS, Layer, Util } from 'leaflet';\n\nimport { ImageOverlay } from './ImageOverlay';\n\nimport type { Map } from 'leaflet';\n\ninterface OverlayOptions {\n crs?: null;\n uppercase?: boolean;\n attribution?: string;\n opacity?: number;\n isBack?: boolean;\n minZoom?: number;\n maxZoom?: number;\n zIndex?: number;\n pane?: string;\n headers?: any;\n viewPortBuffer?: number;\n setViewDelay?: number;\n}\n\n/*\n * Overlay:\n * \"Single Tile\" WMS image overlay that updates with map changes.\n * Portions of wms.Overlay are directly extracted from L.TileLayer.WMS.\n * See Leaflet license.\n */\nexport class ImageLayer extends Layer {\n defaultWmsParams = {\n service: 'WMS',\n request: 'GetMap',\n version: '1.1.1',\n layers: '',\n styles: '',\n format: 'image/jpeg',\n transparent: false,\n };\n\n options: OverlayOptions = {\n crs: null,\n uppercase: false,\n attribution: '',\n opacity: 1,\n isBack: false,\n minZoom: 0,\n pane: 'tilePane',\n headers: null,\n viewPortBuffer: 0,\n setViewDelay: 100,\n };\n\n private wmsParams: any;\n private _url?: string;\n private _currentUrl?: string;\n private _currentOverlay?: ImageOverlay;\n\n constructor(url: string, options: OverlayOptions) {\n super(options);\n this._url = url;\n\n // Move WMS parameters to params object\n const params: any = {};\n const opts: any = {};\n let opt: keyof OverlayOptions;\n for (opt in options) {\n if (opt in this.options) {\n opts[opt] = options[opt];\n } else {\n params[opt] = options[opt];\n }\n }\n Util.setOptions(this, opts);\n this.wmsParams = Util.extend({}, this.defaultWmsParams, params);\n }\n\n setParams(params: Record<string, any>): void {\n Util.extend(this.wmsParams, params);\n this.update();\n }\n\n getAttribution(): string {\n return this.options.attribution || '';\n }\n\n onAdd(): this {\n this.update();\n return this;\n }\n\n onRemove(map: Map): this {\n if (this._currentOverlay) {\n this._currentOverlay.cancelLoad();\n map.removeLayer(this._currentOverlay);\n delete this._currentOverlay;\n }\n if (this._currentUrl) {\n delete this._currentUrl;\n }\n return this;\n }\n\n getEvents(): {\n moveend: () => void;\n } {\n return {\n moveend: debounce(this.update, this.options.setViewDelay),\n };\n }\n\n update(): void {\n if (!this._map) {\n return;\n }\n // Determine image URL and whether it has changed since last update\n this.updateWmsParams();\n const url = this.getImageUrl();\n if (this._currentUrl === url) {\n return;\n }\n this._currentUrl = url;\n\n // Keep current image overlay in place until new one loads\n // (inspired by esri.leaflet)\n const viewPortBuffer = this.options.viewPortBuffer || 0;\n const bounds = this._map.getBounds().pad(viewPortBuffer);\n\n const overlay = new ImageOverlay(url, bounds, {\n opacity: 0,\n pane: this.options.pane,\n headers: this.options.headers,\n });\n overlay.addTo(this._map);\n if (this._currentOverlay) {\n this._currentOverlay.cancelLoad();\n }\n overlay.once(\n 'load',\n () => {\n if (!this._map) {\n return;\n }\n // @ts-ignore\n if (overlay._url !== this._currentUrl) {\n this._map.removeLayer(overlay);\n return;\n } else if (this._currentOverlay) {\n this._map.removeLayer(this._currentOverlay);\n }\n this._currentOverlay = overlay;\n overlay.setOpacity(\n this.options.opacity !== undefined ? this.options.opacity : 1,\n );\n if (this.options.isBack === true) {\n overlay.bringToBack();\n }\n if (this.options.isBack === false) {\n overlay.bringToFront();\n }\n if (this.options.zIndex !== undefined) {\n overlay.setZIndex(this.options.zIndex);\n }\n },\n this,\n );\n const { minZoom, maxZoom } = this.options;\n if (\n (minZoom && this._map.getZoom() < minZoom) ||\n (maxZoom && this._map.getZoom() > maxZoom)\n ) {\n this._map.removeLayer(overlay);\n }\n }\n\n setOpacity(opacity: number): void {\n this.options.opacity = opacity;\n if (this._currentOverlay) {\n this._currentOverlay.setOpacity(opacity);\n }\n }\n\n bringToBack(): void {\n this.options.isBack = true;\n if (this._currentOverlay) {\n this._currentOverlay.bringToBack();\n }\n }\n\n bringToFront(): void {\n this.options.isBack = false;\n if (this._currentOverlay) {\n this._currentOverlay.bringToFront();\n }\n }\n\n setZIndex(zIndex: number): void {\n this.options.zIndex = zIndex;\n if (this._currentOverlay) {\n this._currentOverlay.setZIndex(zIndex);\n }\n }\n\n // See L.TileLayer.WMS: onAdd() & getTileUrl()\n updateWmsParams(map?: Map): void {\n if (!map) {\n map = this._map;\n }\n // Compute WMS options\n const viewPortBuffer = this.options.viewPortBuffer || 0;\n const bounds = map.getBounds().pad(viewPortBuffer);\n const size = map.getSize();\n if (this.options.viewPortBuffer !== 0) {\n const factor = viewPortBuffer + 1;\n size.x = Math.ceil(size.x * factor);\n size.y = Math.ceil(size.y * factor);\n }\n const wmsVersion = parseFloat(this.wmsParams.version);\n const crs = this.options.crs || map.options.crs;\n const projectionKey = wmsVersion >= 1.3 ? 'crs' : 'srs';\n if (crs) {\n const nw = crs.project(bounds.getNorthWest());\n const se = crs.project(bounds.getSouthEast());\n\n // Assemble WMS parameter string\n const params: any = {\n width: size.x,\n height: size.y,\n };\n params[projectionKey] = crs.code;\n params.bbox = (\n wmsVersion >= 1.3 && crs === CRS.EPSG4326\n ? [se.y, nw.x, nw.y, se.x]\n : [nw.x, se.y, se.x, nw.y]\n ).join(',');\n\n Util.extend(this.wmsParams, params);\n }\n }\n\n getImageUrl(): string {\n const uppercase = this.options.uppercase || false;\n const pstr = Util.getParamString(this.wmsParams, this._url, uppercase);\n return this._url + pstr;\n }\n}\n","import { DomUtil, GridLayer, Util } from 'leaflet';\n\nimport { debounce } from '../../../utils/src';\n\nimport { callAjax } from './callAjax';\n\n// import type { TileLayerOptionsExtended } from './TileAdapter/TileLayer';\n\ntype Constructor = new (...args: any[]) => any;\n\nexport function makeRemote<\n TBase extends Constructor,\n // O extends TileLayerOptionsExtended = TileLayerOptionsExtended\n>(Base: TBase): TBase {\n return class RemoteTileLayer extends Base {\n constructor(...args: any[]) {\n super(...args);\n if (this.options.setViewDelay) {\n // @ts-ignore\n this._update = debounce((...a: any[]) => {\n // @ts-ignore\n GridLayer.prototype._update.call(this, ...a);\n }, this.options.setViewDelay);\n }\n }\n\n createTile(\n coords: Record<string, unknown>,\n done: (error: any, tile: HTMLImageElement) => void,\n ): HTMLImageElement {\n // @ts-ignore\n const url = this.getTileUrl(coords);\n\n const tile = document.createElement('img');\n (tile as any).abort = callAjax(\n url,\n (response) => {\n tile.src = response;\n done(null, tile);\n },\n // @ts-ignore\n this.options.headers,\n );\n\n if (this.options.crossOrigin || this.options.crossOrigin === '') {\n tile.crossOrigin =\n this.options.crossOrigin === true ? '' : this.options.crossOrigin;\n }\n\n tile.alt = '';\n tile.setAttribute('role', 'presentation');\n\n return tile;\n }\n\n _abortLoading() {\n // @ts-ignore\n const tiles = this._tiles;\n // @ts-ignore\n const tileZoom = this._tileZoom;\n for (const i in tiles) {\n if (tiles[i].coords.z !== tileZoom) {\n const tile = tiles[i].el;\n\n tile.onload = Util.falseFn;\n tile.onerror = Util.falseFn;\n if (!tile.complete) {\n if (tile.abort) {\n tile.abort();\n }\n tile.src = Util.emptyImageUrl;\n DomUtil.remove(tile);\n delete tiles[i];\n }\n }\n }\n }\n };\n}\n","// based on https://github.com/bvaughn/debounce-decorator\n\nexport function debounce<T extends (...args: any[]) => void>(\n cb: T,\n wait = 10,\n): T & { clear: () => void } {\n let timeoutId: any;\n\n function wrapper(this: any, ...args: any[]) {\n wrapper.clear();\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n cb.apply(this, args);\n }, wait);\n }\n\n wrapper.clear = function () {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return wrapper as T & { clear: () => void };\n}\n\nexport function DebounceDecorator(wait = 10) {\n return function (\n target: unknown,\n key: string,\n descriptor: PropertyDescriptor,\n ): PropertyDescriptor {\n return {\n configurable: true,\n enumerable: descriptor.enumerable,\n get: function getter() {\n // Attach this function to the instance (not the class)\n Object.defineProperty(this, key, {\n configurable: true,\n enumerable: descriptor.enumerable,\n value: debounce(descriptor.value, wait),\n });\n // @ts-ignore\n return this[key];\n },\n };\n };\n}\n","import { TileLayer as TL } from 'leaflet';\n\nimport { makeRemote } from '../../utils/makeRemoteTileLayer';\n\nimport type { TileLayerOptions } from 'leaflet';\n\nexport type TileLayerOptionsExtended = TileLayerOptions & {\n headers: Record<string, any>;\n setViewDelay?: number;\n};\n\nclass TileLayerBase extends TL {\n constructor(urlTemplate: string, options?: TileLayerOptionsExtended) {\n super(urlTemplate, options);\n Object.assign(this.options, options);\n }\n}\n\nexport const TileLayer = makeRemote(TileLayerBase);\n","import { TileLayer } from 'leaflet';\n\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport { TileLayer as TL } from './TileLayer';\n\nimport type { MainLayerAdapter, TileAdapterOptions } from '@nextgis/webmap';\nimport type { TileLayerOptions } from 'leaflet';\n\nexport class TileAdapter\n extends BaseAdapter<TileAdapterOptions, TileLayer>\n implements MainLayerAdapter\n{\n addLayer(options: TileAdapterOptions): TileLayer | undefined {\n this.options = Object.assign(this.options, options);\n if (options) {\n const { url, ...opt } = options;\n if (url) {\n const tileLayerOptions: TileLayerOptions = {\n pane: this.pane,\n attribution: opt.attribution,\n minZoom: opt.minZoom,\n maxZoom: opt.maxZoom,\n\n ...opt.nativeOptions,\n };\n if (opt.subdomains) {\n tileLayerOptions.subdomains = opt.subdomains;\n }\n let layer;\n if (opt.headers) {\n layer = new TL(url, {\n ...tileLayerOptions,\n headers: opt.headers,\n setViewDelay: opt.setViewDelay,\n });\n } else {\n layer = new TileLayer(url, tileLayerOptions);\n }\n return layer;\n }\n }\n }\n}\n","import { TileLayer } from 'leaflet';\n\nimport { makeRemote } from '../../utils/makeRemoteTileLayer';\n\nimport type { WMSOptions } from 'leaflet';\n\ntype LayerOptions = WMSOptions & { headers: any };\n\nclass WmsLayerBase extends TileLayer.WMS {\n constructor(urlTemplate: string, options: LayerOptions) {\n super(urlTemplate, options);\n }\n}\n\nexport const WmsLayer = makeRemote(WmsLayerBase);\n","import type { LngLatBoundsArray } from '@nextgis/utils';\nimport type { LatLngBoundsExpression } from 'leaflet';\n\nexport function arrayToBoundsExpression(\n bounds: LngLatBoundsArray,\n): LatLngBoundsExpression {\n const e = bounds;\n // top, left, bottom, right\n return [\n [e[3], e[0]],\n [e[1], e[2]],\n ];\n}\n","import { EventEmitter } from 'events';\n\nimport { Control, Map } from 'leaflet';\n\nimport { AttributionControl } from './controls/Attribution';\nimport { createButtonControl } from './controls/createButtonControl';\nimport { createControl } from './controls/createControl';\nimport { GeoJsonAdapter } from './layer-adapters/GeoJsonAdapter/GeoJsonAdapter';\nimport { ImageAdapter } from './layer-adapters/ImageAdapter/ImageAdapter';\nimport { OsmAdapter } from './layer-adapters/OsmAdapter';\nimport { TileAdapter } from './layer-adapters/TileAdapter/TileAdapter';\nimport { WmsAdapter } from './layer-adapters/WmsAdapter/WmsAdapter';\nimport { arrayToBoundsExpression } from './utils/arrayToBoundsExpression';\nimport { convertMapClickEvent } from './utils/convertMapClickEvent';\n\nimport type { LngLatArray, LngLatBoundsArray } from '@nextgis/utils';\nimport type {\n ButtonControlOptions,\n CreateControlOptions,\n FitOptions,\n LayerAdapter,\n Locate,\n LocateOptions,\n LocationEvents,\n MainMapEvents,\n MapAdapter,\n MapControl,\n MapOptions,\n ViewOptions,\n} from '@nextgis/webmap';\nimport type {\n ControlPosition,\n FitBoundsOptions,\n GridLayer,\n LatLngBoundsExpression,\n Layer,\n LeafletEvent,\n LeafletMouseEvent,\n LocationEvent,\n} from 'leaflet';\n\nexport type Type<T> = new (...args: any[]) => T;\nexport type UnselectCb = () => void;\nexport type UnselectDef = UnselectCb;\nexport class LeafletMapAdapter implements MapAdapter<Map, any, Control> {\n static layerAdapters: {\n [name: string]: Type<LayerAdapter<Map, any, any>>;\n } = {\n GEOJSON: GeoJsonAdapter,\n IMAGE: ImageAdapter,\n TILE: TileAdapter,\n WMS: WmsAdapter,\n // // MVT: MvtAdapter,\n OSM: OsmAdapter,\n };\n\n static controlAdapters = {\n ZOOM: Control.Zoom,\n ATTRIBUTION: AttributionControl,\n };\n\n static Map = Map;\n\n options: MapOptions<Map> = { target: 'map' };\n\n layerAdapters = LeafletMapAdapter.layerAdapters;\n controlAdapters = LeafletMapAdapter.controlAdapters;\n emitter = new EventEmitter();\n map?: Map;\n\n private _resizeObserver?: ResizeObserver;\n private _unselectCb: UnselectDef[] = [];\n private _universalEvents: (keyof MainMapEvents)[] = [\n 'move',\n 'zoom',\n 'zoomend',\n 'zoomstart',\n 'moveend',\n 'movestart',\n ];\n private _positionEvents: (keyof MainMapEvents)[] = [\n 'mousemove',\n 'mouseout',\n 'mouseover',\n ];\n\n create(options: MapOptions<Map>): void {\n this.options = { ...options };\n if (this.options.target) {\n const {\n zoom,\n center,\n maxZoom,\n minZoom,\n maxBounds: mb,\n mapAdapterOptions,\n } = this.options;\n\n this.map =\n this.options.map ||\n new Map(this.options.target, {\n attributionControl: false,\n zoomControl: false,\n maxBounds: mb ? arrayToBoundsExpression(mb) : undefined,\n maxZoom,\n minZoom,\n center: center && [center[1], center[0]],\n zoom,\n ...mapAdapterOptions,\n });\n // create default pane\n const defPane = this.map.createPane('order-0');\n (this.map as any)._addUnselectCb = (def: UnselectDef) => {\n this._addUnselectCb(def);\n };\n defPane.style.zIndex = String(0);\n this.emitter.emit('create', this);\n this._addMapListeners();\n }\n }\n\n destroy(): void {\n if (this.map) {\n this.map.remove();\n }\n this._stopWatchSizeChangeToUpdateMinZoom();\n }\n\n getContainer(): HTMLElement | undefined {\n return this.map && this.map.getContainer();\n }\n\n getControlContainer(): HTMLElement {\n const controlContainer = this.map && (this.map as any)._controlContainer;\n if (controlContainer) {\n return controlContainer;\n }\n throw new Error('Leaflet Map is not initialized yet');\n }\n\n setCursor(cursor: string): void {\n if (this.map) {\n this.map.getContainer().style.cursor = cursor;\n }\n }\n\n setView(lngLat: LngLatArray, zoom?: number): void;\n setView(options: ViewOptions): void;\n setView(lngLatOrOpt: LngLatArray | ViewOptions, zoom?: number): void {\n const map = this.map;\n if (!map) return;\n if (Array.isArray(lngLatOrOpt)) {\n const lngLat = lngLatOrOpt;\n const [lng, lat] = lngLat;\n if (this.map) {\n if (typeof zoom === 'number') {\n this.map.setView([lat, lng], zoom, { animate: false });\n } else {\n this.setCenter([lng, lat]);\n }\n }\n } else {\n const { zoom, center, maxBounds, bounds, minZoom, maxZoom } = lngLatOrOpt;\n if (center && zoom !== undefined) {\n this.setView(center, zoom);\n } else {\n if (zoom !== undefined) {\n this.setZoom(zoom);\n }\n if (center) {\n this.setCenter(center);\n }\n }\n if (bounds) {\n this.fitBounds(bounds);\n }\n if (maxBounds !== undefined) {\n if (maxBounds) {\n const b = arrayToBoundsExpression(maxBounds);\n map.setMaxBounds(b);\n map.setMinZoom(map.getBoundsZoom(b));\n this._watchSizeChangeToUpdateMinZoom(b);\n } else {\n // @ts-ignore `null` works for unset maxBounds, but not in typing\n map.setMaxBounds(null);\n this._stopWatchSizeChangeToUpdateMinZoom();\n }\n }\n if (maxZoom !== undefined) {\n map.setMaxZoom(maxZoom);\n }\n if (minZoom !== undefined) {\n this._stopWatchSizeChangeToUpdateMinZoom();\n map.setMinZoom(minZoom);\n }\n }\n }\n\n setCenter(lngLat: LngLatArray): void {\n const [lng, lat] = lngLat;\n if (this.map) {\n this.map.panTo([lat, lng]);\n }\n }\n\n getCenter(): LngLatArray | undefined {\n const map = this.map;\n if (map) {\n const bounds = map.getBounds();\n const center = bounds.getCenter();\n return [center.lng, center.lat];\n }\n }\n\n setZoom(zoom: number): void {\n if (this.map) {\n this.map.setZoom(zoom);\n }\n }\n\n getZoom(): number | undefined {\n return (this.map && this.map.getZoom()) ?? undefined;\n }\n\n getBounds(): LngLatBoundsArray | undefined {\n if (!this.map) return undefined;\n const b = this.map.getBounds();\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [sw.lng, sw.lat, ne.lng, ne.lat];\n }\n\n // [west, south, east, north]\n fitBounds(bounds: LngLatBoundsArray, options: FitOptions = {}): void {\n if (this.map) {\n const { maxZoom, offset, padding } = options;\n const opt: FitBoundsOptions = {};\n if (maxZoom) {\n opt.maxZoom = maxZoom;\n }\n if (padding) {\n opt.padding = [padding, padding];\n }\n if (offset) {\n opt.padding = offset;\n }\n\n this.map.fitBounds(arrayToBoundsExpression(bounds), opt);\n }\n }\n\n getLayerAdapter(name: string): Type<LayerAdapter<Map, any, any>> {\n return LeafletMapAdapter.layerAdapters[name];\n }\n\n createControl(control: MapControl, options: CreateControlOptions): Control {\n return createControl(control, options, this);\n }\n\n createButtonControl(options: ButtonControlOptions): Control {\n return createButtonControl(options, this);\n }\n\n addControl(control: Control, position: string): Control | undefined {\n control.options.position = position.replace('-', '') as ControlPosition;\n if (this.map) {\n this.map.addControl(control);\n return control;\n }\n }\n\n removeControl(control: Control): void {\n if (this.map) {\n this.map.removeControl(control);\n }\n }\n\n removeLayer(layer: Layer): void {\n layer && layer.remove && layer.remove();\n }\n\n showLayer(layer: Layer): void {\n if (this.map) {\n layer.addTo(this.map);\n }\n }\n\n hideLayer(layer: Layer): void {\n layer.remove();\n }\n\n setLayerOpacity(layer: GridLayer | Layer, value: number): void {\n if ('setOpacity' in layer) {\n layer.setOpacity(value);\n }\n }\n\n setLayerOrder(\n layer: Layer,\n order: number,\n layers: { [x: string]: LayerAdapter },\n ): void {\n //\n }\n\n onMapClick(evt: LeafletMouseEvent): void {\n const converted = convertMapClickEvent(evt);\n this.emitter.emit('preclick', converted);\n this.emitter.emit('click', converted);\n }\n\n locate(opt: LocateOptions, events?: LocationEvents): Locate {\n const map = this.map;\n if (map) {\n map.locate(opt);\n if (events) {\n const { locationfound, locationerror } = events;\n const locationFound = (e: LeafletEvent) => {\n const event = e as LocationEvent;\n const lngLat: [number, number] = [event.latlng.lng, event.latlng.lat];\n locationfound({ lngLat });\n };\n if (locationfound !== undefined) {\n map.on('locationfound', locationFound, this);\n }\n if (locationerror) {\n map.on('locationerror', locationerror, this);\n }\n const stop = () => {\n if (locationfound !== undefined) {\n map.off('locationfound', locationFound);\n }\n if (locationerror) {\n map.off('locationerror', locationerror);\n }\n };\n return { stop };\n }\n }\n const stop = () => void 'fake function';\n return { stop };\n }\n\n private _addUnselectCb(cb: UnselectDef) {\n for (const p of this._unselectCb) {\n p();\n }\n this._unselectCb.length = 0;\n this._unselectCb.push(cb);\n }\n\n private _watchSizeChangeToUpdateMinZoom(bounds: LatLngBoundsExpression) {\n this._stopWatchSizeChangeToUpdateMinZoom();\n const container = this.getContainer();\n const map = this.map;\n if (container && map && window.ResizeObserver) {\n this._resizeObserver = new ResizeObserver(() => {\n map.setMinZoom(map.getBoundsZoom(bounds));\n });\n this._resizeObserver.observe(container);\n }\n }\n\n private _stopWatchSizeChangeToUpdateMinZoom() {\n const map = this.map;\n if (map) {\n map.setMinZoom(0);\n }\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n this._resizeObserver = undefined;\n }\n }\n\n private _addMapListeners() {\n const map = this.map;\n if (map) {\n map.on('click', (evt) => {\n this.onMapClick(evt as LeafletMouseEvent);\n });\n for (const e of this._universalEvents) {\n map.on(e, () => this.emitter.emit(e, this), map);\n }\n\n for (const e of this._positionEvents) {\n map.on(\n e,\n (evt) =>\n this.emitter.emit(\n e,\n convertMapClickEvent(evt as LeafletMouseEvent),\n ),\n map,\n );\n }\n }\n }\n}\n","import { DomEvent } from 'leaflet';\n\nimport { createControl } from './createControl';\n\nimport type { ButtonControlOptions, MapAdapter } from '@nextgis/webmap';\nimport type { Control } from 'leaflet';\n\nexport function createButtonControl(\n options: ButtonControlOptions,\n map: MapAdapter,\n): Control {\n const link = document.createElement('a');\n\n const title = options.title || '';\n link.href = '#';\n link.title = title;\n\n link.setAttribute('role', 'button');\n link.setAttribute('aria-label', title);\n\n if (options.addClass) {\n link.classList.add(options.addClass);\n }\n\n DomEvent.disableClickPropagation(link);\n DomEvent.on(link, 'click', DomEvent.stop);\n\n if (options.html instanceof HTMLElement) {\n link.appendChild(options.html);\n } else if (typeof options.html === 'string') {\n link.innerHTML = options.html;\n }\n\n const onClick = (e: Event) => {\n e.stopPropagation();\n options.onClick();\n };\n\n return createControl(\n {\n onAdd() {\n if (options.onClick !== undefined) {\n link.addEventListener('click', onClick);\n }\n return link;\n },\n onRemove() {\n const parent = link.parentNode;\n if (parent) {\n parent.removeChild(link);\n }\n if (options.onClick !== undefined) {\n link.removeEventListener('click', onClick);\n }\n },\n },\n { bar: true },\n map,\n );\n}\n","import { debounce, defined } from '@nextgis/utils';\nimport { DomEvent, FeatureGroup, GeoJSON } from 'leaflet';\n\nimport { boundsToArray } from '../../utils/boundsToArray';\nimport { detectType } from '../../utils/detectType';\nimport {\n PAINT,\n createFeaturePositionOptions,\n filterGeometries,\n typeAlias,\n} from '../../utils/geometries';\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport { GeoJsonEvents } from './utils/GeoJsonEvents';\nimport { GeoJsonPaint } from './utils/GeojsonPaint';\n\nimport type { IconPaint, Paint, VectorAdapterLayerPaint } from '@nextgis/paint';\nimport type { LngLatBoundsArray } from '@nextgis/utils';\nimport type {\n DataLayerFilter,\n GeoJsonAdapterOptions,\n LayerDefinition,\n OnLayerSelectType,\n PopupOnCloseFunction,\n PopupOptions,\n VectorAdapterLayerType,\n VectorLayerAdapter,\n} from '@nextgis/webmap';\nimport type { Feature, GeoJsonObject, Point } from 'geojson';\nimport type {\n GeoJSONOptions,\n PopupOptions as LPopupOptions,\n LatLng,\n LatLngExpression,\n Layer,\n LeafletMouseEvent,\n Map,\n} from 'leaflet';\n\nexport type LayerDef = LayerDefinition<Feature, Layer>;\n\nexport class GeoJsonAdapter\n extends BaseAdapter<GeoJsonAdapterOptions>\n implements VectorLayerAdapter<Map>\n{\n layer?: FeatureGroup;\n selected = false;\n\n type?: VectorAdapterLayerType;\n _layers: LayerDef[] = [];\n _events: GeoJsonEvents;\n private paint?: Paint;\n private selectedPaint?: Paint;\n\n private _selectedLayers: LayerDef[] = [];\n private _filteredLayers: LayerDef[] = [];\n private _filterFun?: DataLayerFilter<Feature>;\n private _openedPopup: [Layer, PopupOnCloseFunction[], LayerDef][] = [];\n private _paint: GeoJsonPaint;\n\n private $updateTooltip = debounce(() => {\n this.updateTooltip();\n }, 300);\n\n constructor(map: Map, options: GeoJsonAdapterOptions) {\n super(map, options);\n this._events = new GeoJsonEvents(this);\n this._paint = new GeoJsonPaint(this);\n }\n\n addLayer(options: GeoJsonAdapterOptions): FeatureGroup<any> | undefined {\n Object.assign(this.options, options);\n this.paint = options.paint;\n this.layer = new FeatureGroup([], {\n ...options.nativeOptions,\n pane: this.pane,\n });\n this.selectedPaint = options.selectedPaint;\n options.paint = this.paint;\n\n if (options.data) {\n this.addData(options.data);\n }\n\n this._addMapListener();\n\n return this.layer;\n }\n\n beforeRemove(): void {\n this._removeMapListener();\n }\n\n select(findFeatureFun?: DataLayerFilter): void {\n this.unselect();\n if (findFeatureFun) {\n const def = this._layers.filter(findFeatureFun);\n for (const x of def) {\n this._selectLayer(x, 'api');\n }\n } else if (!this.selected) {\n this.selected = true;\n if (this.selectedPaint) {\n this._paint.setPaintEachLayer(\n this.selectedPaint as VectorAdapterLayerPaint,\n );\n }\n }\n }\n\n unselect(findFeatureFun?: DataLayerFilter): void {\n if (findFeatureFun) {\n const feature = this._layers.filter(findFeatureFun);\n feature.forEach((x) => {\n this._unSelectLayer(x);\n });\n } else if (this.selected) {\n for (const p of this._openedPopup) {\n this._removePopup(p[0]);\n }\n if (this.paint) {\n this._paint.setPaintEachLayer(this.paint as VectorAdapterLayerPaint);\n }\n this._selectedLayers.length = 0;\n this.selected = false;\n }\n }\n\n getSelected(): LayerDefinition<Feature, LayerDef>[] {\n return this._selectedLayers.map((x) => {\n return {\n target: this,\n feature: x.feature,\n layer: x,\n ...createFeaturePositionOptions(x.feature),\n };\n });\n }\n\n getFiltered(): LayerDef[] {\n return this._filteredLayers;\n }\n\n filter(fun?: DataLayerFilter): LayerDef[] {\n // Some optimization\n this._filterFun = fun;\n const layer_ = this.layer;\n const map = layer_ && (layer_ as any)._map;\n if (layer_ && map) {\n layer_.remove();\n\n const filteredLayers: LayerDef[] = [];\n this._layers.forEach(({ feature, layer }) => {\n if (layer) {\n const ok = fun\n ? fun({\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n })\n : true;\n if (ok) {\n layer_.addLayer(layer);\n filteredLayers.push({\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n });\n } else {\n layer_.removeLayer(layer);\n }\n }\n });\n this._filteredLayers = filteredLayers;\n\n layer_.addTo(map);\n }\n return this._filteredLayers;\n }\n\n cleanFilter(): void {\n this.filter();\n }\n\n getLayers(): LayerDef[] {\n return this._layers.map(({ layer, feature }) => {\n const visible = layer && !!(layer as any)._map;\n return {\n feature,\n layer,\n visible,\n target: this,\n ...createFeaturePositionOptions(feature),\n };\n });\n }\n\n clearLayer(cb?: (feature: Feature) => boolean): void {\n this.unselect();\n const layer_ = this.layer;\n if (layer_) {\n if (cb) {\n for (let fry = this._layers.length; fry--; ) {\n const def = this._layers[fry];\n if (def) {\n const { feature, layer } = def;\n if (feature && layer) {\n const exist = cb(feature);\n if (exist) {\n layer_.removeLayer(layer);\n this._layers.splice(fry, 1);\n }\n }\n }\n }\n } else {\n layer_.clearLayers();\n this._layers = [];\n }\n }\n }\n\n setData(data: GeoJsonObject): void {\n this.clearLayer();\n this.addData(data);\n }\n\n addData(data: GeoJsonObject | false): void {\n const options = this.options;\n let geoJsonOptions: GeoJSONOptions | undefined;\n if (options) {\n if (data) {\n let type: VectorAdapterLayerType;\n\n if (!options.type) {\n const detectedType = detectType(data);\n type = typeAlias[detectedType];\n } else {\n type = options.type;\n }\n if (this.type && this.type !== type) {\n console.warn('no other data type than layer can be added');\n return;\n }\n this.type = type;\n\n data = filterGeometries(data, type);\n if (data) {\n geoJsonOptions = this._getGeoJsonOptions(options, type);\n }\n }\n new GeoJSON(data || undefined, geoJsonOptions);\n }\n }\n\n openPopup(findFeatureFun: DataLayerFilter, options?: PopupOptions): void {\n if (findFeatureFun) {\n const def = this._layers.filter(findFeatureFun);\n def.forEach((x) => {\n this._openPopup(x, options, 'api');\n });\n }\n }\n\n closePopup(findFeatureFun?: DataLayerFilter): void {\n const popupToClose = findFeatureFun\n ? this._openedPopup.filter((x) => findFeatureFun(x[2]))\n : this._openedPopup;\n\n popupToClose.forEach((x) => {\n this._removePopup(x[0]);\n });\n }\n\n updateTooltip(layerDef?: LayerDefinition): void {\n if (layerDef) {\n this._updateTooltip(layerDef);\n } else {\n this.getLayers().forEach((x) =>\n this._updateTooltip({ feature: x.feature, layer: x.layer }),\n );\n }\n }\n\n /** @deprecated use {@link GeoJsonAdapter.getBounds} instead */\n getExtent(): LngLatBoundsArray | undefined {\n return this.getBounds();\n }\n\n getBounds(): LngLatBoundsArray | undefined {\n if (this.layer) {\n const bounds = this.layer.getBounds();\n if (bounds.isValid()) {\n return boundsToArray(bounds);\n }\n }\n }\n\n setOpacity(value: number): void {\n this.options.opacity = value;\n this.setPaint(this.paint);\n this.setSelectedPaint(this.selectedPaint);\n }\n\n setPaint(paint?: Paint | null): void {\n if (paint) {\n this.paint = paint;\n for (const l of this._layers) {\n this._paint.setPaint(l, paint as VectorAdapterLayerPaint);\n }\n }\n }\n setSelectedPaint(paint?: Paint | null): void {\n if (paint) {\n this.selectedPaint = paint;\n for (const l of this._selectedLayers) {\n this._paint.setPaint(l, paint as VectorAdapterLayerPaint);\n }\n }\n }\n updatePaint(paint: Partial<Paint>): void {\n this.paint = { ...this.paint, ...paint } as Paint;\n for (const l of this._layers) {\n this._paint.setPaint(l, this.paint as VectorAdapterLayerPaint);\n }\n }\n updateSelectedPaint(paint: Partial<Paint>): void {\n this.selectedPaint = { ...this.selectedPaint, ...paint } as Paint;\n for (const l of this._selectedLayers) {\n this._paint.setPaint(l, this.selectedPaint as VectorAdapterLayerPaint);\n }\n }\n\n _getSelected(layer: LayerDef['layer']) {\n return this._selectedLayers.find((x) => x.layer === layer);\n }\n\n private $unselect = () => {\n this.unselect();\n };\n\n private _updateTooltip(layerDef: Pick<LayerDef, 'feature' | 'layer'>) {\n const { feature, layer } = layerDef;\n if (feature && layer && feature.properties && this.options.labelField) {\n layer.unbindTooltip();\n const message = feature.properties[this.options.labelField];\n if (message !== undefined) {\n const permanent = !this.options.labelOnHover;\n\n layer.bindTooltip(String(message), { permanent, sticky: false });\n }\n }\n }\n\n private async _openPopup(\n def: LayerDef,\n options: PopupOptions = {},\n type: OnLayerSelectType,\n latLng?: LatLngExpression,\n ) {\n const { feature, layer } = def;\n const {\n minWidth,\n autoPan,\n maxWidth,\n closeButton: closeButton_,\n } = {\n minWidth: 300,\n ...options,\n };\n const closeButton = closeButton_ ?? !this.options.selectOnHover;\n let popup: Layer;\n const _closeHandlers: PopupOnCloseFunction[] = [];\n const onClose = (handler: PopupOnCloseFunction) => {\n _closeHandlers.push(handler);\n };\n const close = () => {\n if (popup) {\n this._removePopup(popup);\n }\n };\n let content;\n if (options.createPopupContent) {\n content = await options.createPopupContent({\n layer,\n feature,\n target: this,\n type,\n close,\n onClose,\n ...createFeaturePositionOptions(feature),\n });\n } else {\n content = options.popupContent;\n }\n\n if (content && layer) {\n const popupOptions: LPopupOptions = {\n minWidth,\n autoPan,\n // maxWidth,\n closeButton,\n closeOnClick: false,\n autoClose: false,\n };\n if (defined(maxWidth)) {\n popupOptions.maxWidth = maxWidth;\n }\n popup = layer.bindPopup(content, popupOptions);\n\n const unselectOnClose =\n this.options.popupOptions?.unselectOnClose ?? true;\n if (unselectOnClose) {\n const p = layer.getPopup();\n p &&\n p.once(\n 'remove',\n () => {\n close();\n },\n this,\n );\n }\n this._openedPopup.push([popup, _closeHandlers, def]);\n popup.openPopup(latLng);\n }\n }\n\n private _removePopup(popup: Layer) {\n const map = this.map;\n if (map) {\n popup.closePopup().unbindPopup();\n const index = this._openedPopup.findIndex((x) => x[0] === popup);\n if (index !== -1) {\n const unselectOnClose =\n this.options.popupOptions?.unselectOnClose ?? true;\n const [, closeHandlers, def] = this._openedPopup[index];\n for (const h of closeHandlers) {\n h(def);\n }\n closeHandlers.length = 0;\n if (unselectOnClose) {\n this._unSelectLayer(def);\n }\n this._openedPopup.splice(index, 1);\n }\n }\n }\n\n private _getGeoJsonOptions(\n options: GeoJsonAdapterOptions,\n type: VectorAdapterLayerType,\n ): GeoJSONOptions {\n const paint = options.paint;\n let lopt: GeoJSONOptions = {};\n\n if (typeof paint === 'function') {\n if (type === 'point') {\n // TODO: fix types (@geoman-io/leaflet-geoman-free)\n (lopt as any).pointToLayer = (\n feature: Feature<Point, any>,\n latLng: LatLng,\n ) => {\n const iconOpt = paint(feature);\n const pointToLayer = this._paint.createPaintToLayer(\n iconOpt as IconPaint,\n );\n return pointToLayer(feature, latLng);\n };\n } else {\n lopt = {\n style: (feature) => {\n if (feature) {\n return this._paint.preparePaint({ ...PAINT, ...paint(feature) });\n } else {\n return this._paint.preparePaint({ ...PAINT, type: 'path' });\n }\n },\n };\n }\n } else {\n lopt = this._paint.createPaintOptions(paint as VectorAdapterLayerPaint);\n }\n\n lopt.onEachFeature = (feature: Feature, layer) => {\n this._onEachFeature(feature, layer);\n };\n\n return lopt;\n }\n\n private _onEachFeature(feature: Feature, layer: Layer) {\n const layer_ = this.layer;\n if (layer_) {\n const def = {\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n };\n\n layer.options.pane = this.pane;\n this._layers.push(def);\n let ok = true;\n if (this._filterFun) {\n ok = this._filterFun(def);\n }\n if (ok) {\n const { popup, popupOptions, selectable, interactive, selectOnHover } =\n this.options;\n // @ts-ignore\n layer.options.interactive = defined(interactive) ? interactive : true;\n layer_.addLayer(layer);\n if (selectable) {\n if (selectOnHover) {\n layer.on('mouseover', () => {\n this._selectLayer(def, 'hover');\n });\n layer.on('mouseout', () => {\n this._unSelectLayer(def);\n });\n } else {\n layer.on(\n 'click',\n (e) => this._selectOnLayerClick(e as LeafletMouseEvent),\n this,\n );\n }\n }\n this._events.handleMouseEvents(layer);\n // The timeout is needed to display the popup immediately when adding a layer to the map.\n // Without a timeout, the layer may not yet have a _map object\n setTimeout(() => {\n if (popup) {\n this._openPopup(\n {\n target: this,\n layer,\n feature,\n ...createFeaturePositionOptions(feature),\n },\n popupOptions,\n 'api',\n );\n }\n this._updateTooltip({ layer, feature });\n });\n }\n }\n }\n\n private _selectOnLayerClick(e: LeafletMouseEvent) {\n DomEvent.stopPropagation(e);\n const layer = e.target as Layer;\n const feature = (layer as any).feature;\n const def: LayerDef = {\n target: this,\n layer,\n feature,\n ...createFeaturePositionOptions(feature),\n };\n const isSelected = this._getSelected(layer);\n if (isSelected) {\n if (this.options && this.options.unselectOnSecondClick) {\n this._unSelectLayer(isSelected);\n }\n } else {\n this._selectLayer(def, 'click', e.latlng);\n }\n }\n\n private _selectLayer(\n def: LayerDef,\n type: OnLayerSelectType,\n latlng?: LatLngExpression,\n ) {\n const { multiselect } = this.options;\n if (!multiselect) {\n // To unselect layer on another layer click\n (this.map as any)._addUnselectCb(() => {\n this._unSelectLayer(def);\n });\n this._selectedLayers.forEach((x) => this._unSelectLayer(x));\n }\n this._selectedLayers.push(def);\n this.selected = true;\n const { selectedPaint, popupOnSelect, popupOptions } = this.options;\n\n if (selectedPaint && def.layer) {\n this._paint.setPaint(def, selectedPaint as VectorAdapterLayerPaint);\n }\n if (popupOnSelect) {\n this._openPopup(def, popupOptions, type, latlng);\n }\n if (this.options.onSelect) {\n const features = def.feature ? [def.feature] : [];\n this.options.onSelect({\n type,\n layer: this,\n features,\n ...createFeaturePositionOptions(features),\n });\n }\n }\n\n private _unSelectLayer(def: LayerDef) {\n const index = this._selectedLayers.indexOf(def);\n if (index !== -1) {\n this._selectedLayers.splice(index, 1);\n if (this.options) {\n if (this.options.paint) {\n this._paint.setPaint(\n def,\n this.options.paint as VectorAdapterLayerPaint,\n );\n }\n\n if (this.options.popupOnSelect && def.layer) {\n this._removePopup(def.layer);\n }\n }\n }\n this.selected = this._selectedLayers.length > 0;\n }\n\n private _addMapClickListener() {\n const map = this.map;\n if (map) {\n const { unselectOnClick } = this.options;\n const uoc = unselectOnClick ?? true;\n if (uoc) {\n map.on('click', this.$unselect);\n }\n }\n }\n\n private _removeMapClickListener() {\n this.map.off('zoomend', this.$updateTooltip);\n this.map.off('moveend', this.$updateTooltip);\n this.map.off('click', this.$unselect);\n }\n\n private _addMapListener() {\n const map = this.map;\n if (map) {\n const { labelField, labelOnHover } = this.options;\n this._addMapClickListener();\n if (labelField && !labelOnHover) {\n map.on('zoomend', this.$updateTooltip);\n map.on('moveend', this.$updateTooltip);\n }\n }\n }\n\n private _removeMapListener() {\n this._removeMapClickListener();\n this.map.off('zoomend', this.$updateTooltip);\n this.map.off('moveend', this.$updateTooltip);\n }\n}\n","import { BaseAdapter } from '../BaseAdapter';\n\nimport { ImageLayer } from './ImageLayer';\n\nimport type { MainLayerAdapter } from '@nextgis/webmap';\nimport type { ImageAdapterOptions } from '@nextgis/webmap';\nimport type { Map } from 'leaflet';\n\nexport class ImageAdapter\n extends BaseAdapter<ImageAdapterOptions>\n implements MainLayerAdapter<Map>\n{\n layer: any;\n\n addLayer(options: ImageAdapterOptions): any {\n const url = options && options.url;\n if (url) {\n options = { transparent: true, ...options };\n const updateWmsParamsFromOpt = options.updateWmsParams;\n this.layer = new ImageLayer(url, {\n pane: this.pane,\n headers: options.headers,\n setViewDelay: options.setViewDelay,\n /**\n * TODO: safe remove, use only options.nativeOptions\n */\n ...options,\n ...options.params,\n ...options.nativeOptions,\n });\n if (updateWmsParamsFromOpt) {\n const updateWmsParams = this.layer.updateWmsParams;\n this.layer.updateWmsParams = function (map: Map) {\n updateWmsParams.call(this, map);\n this.wmsParams = updateWmsParamsFromOpt(this.wmsParams);\n };\n }\n return this.layer;\n }\n }\n}\n","import { TileLayer } from 'leaflet';\n\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport { WmsLayer as WMS } from './WmsLayer';\n\nimport type { MainLayerAdapter, WmsAdapterOptions } from '@nextgis/webmap';\nimport type { WMSOptions } from 'leaflet';\n\nexport class WmsAdapter\n extends BaseAdapter<WmsAdapterOptions, TileLayer.WMS>\n implements MainLayerAdapter\n{\n addLayer(options: WmsAdapterOptions): TileLayer.WMS | undefined {\n Object.assign(this.options, options);\n const { url, ...opt } = options;\n if (url) {\n const layerOptions: WMSOptions = {\n pane: this.pane,\n attribution: opt.attribution,\n minZoom: opt.minZoom,\n maxZoom: opt.maxZoom,\n layers: options.layers,\n format: options.format,\n ...options.nativeOptions,\n };\n let layer;\n if (opt.headers) {\n layer = new WMS(url, { ...layerOptions, headers: opt.headers });\n } else {\n layer = new TileLayer.WMS(url, layerOptions);\n }\n return layer;\n }\n }\n}\n","import { TileAdapter } from './TileAdapter/TileAdapter';\n\nimport type { MainLayerAdapter, TileAdapterOptions } from '@nextgis/webmap';\nimport type { TileLayer } from 'leaflet';\n\nexport class OsmAdapter extends TileAdapter implements MainLayerAdapter {\n addLayer(options: Omit<TileAdapterOptions, 'url'>): TileLayer | undefined {\n const url = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n return super.addLayer({\n name: 'OpenStreetMap',\n attribution:\n '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors',\n ...options,\n url,\n });\n }\n}\n","import { Control } from 'leaflet';\n\nimport type { AttributionControlOptions } from '@nextgis/webmap';\nimport type { ControlOptions } from 'leaflet';\n\nexport class AttributionControl extends Control.Attribution {\n // options: AttributionControlOptions\n constructor(options: AttributionControlOptions & ControlOptions) {\n super(options);\n const customAttribution = options && options.customAttribution;\n if (customAttribution) {\n let attributions: string[] = [];\n if (Array.isArray(customAttribution)) {\n attributions = customAttribution;\n } else if (customAttribution) {\n attributions = [customAttribution];\n }\n attributions.forEach((x) => this.addAttribution(x));\n }\n }\n}\n","/**\n * @module leaflet-map-adapter\n */\n\nimport { LeafletMapAdapter } from './LeafletMapAdapter';\n\nexport default LeafletMapAdapter;\n"],"names":["createControl","control","options","map","Control","extend","onAdd","element","document","createElement","content","classList","add","bar","addClass","margin","style","marginBottom","marginTop","marginLeft","marginRight","appendChild","DomEvent","disableClickPropagation","onRemove","boundsToArray","bounds","ne","getNorthEast","sw","getSouthWest","lng","lat","findMostFrequentGeomType","arr","counts","fry","length","maxName","c","typeAlias","Point","LineString","MultiPoint","Polygon","MultiLineString","MultiPolygon","GeometryCollection","PAINT","stroke","opacity","backAliases","a","layerType","backAlias","push","geometryFilter","geometry","type","indexOf","featuresBounds","features","geoJsonLayer","GeoJSON","Array","isArray","forEach","f","addData","getBounds","createFeaturePositionOptions","getFeaturesBounds","getCenter","getFeaturesCenter","BaseAdapter","constructor","this","pane","undefined","order","exist","getPane","createPane","zIndex","String","Math","round","addLayer","Object","assign","convertMapClickEvent","evt","coord","containerPoint","latLng","latlng","lngLat","pixel","left","x","top","y","source","GeoJsonEvents","layer","handleMouseEvents","onClick","onLayerClick","onMouseOut","onMouseOver","onClick_","_onclick","e","selected","_getSelected","_createMouseEvent","on","_mouseout","_mouseover","stopMouseEvents","off","feature","target","event","createMouseEvent","GeoJsonPaint","setPaintEachLayer","paint","_layers","layerDef","setPaint","isPaintCallback","isPaint","marker","divIcon","_createDivIcon","setTimeout","setIcon","setStyle","preparePaint","aliases","readyPaint","radius","to","from","paintProp","defined","toLowerCase","Number","defineProperty","enumerable","value","icon","html","rotate","className","toLIconOpt","transform","innerHTML","DivIcon","createPaintToLayer","_","Marker","CircleMarker","createPaintOptions","geoJsonOptions","newPaint","pointToLayer","callAjax","src","callback","headers","xhr","XMLHttpRequest","open","responseType","h","setRequestHeader","onload","arrayBufferView","Uint8Array","response","blob","Blob","imageUrl","window","URL","webkitURL","createObjectURL","send","abort","ImageOverlay","LImageOverlay","super","_abort","cancelLoad","_initImage","img","_image","ImageLayer","Layer","url","defaultWmsParams","service","request","version","layers","styles","format","transparent","crs","uppercase","attribution","isBack","minZoom","viewPortBuffer","setViewDelay","_url","params","opts","opt","Util","setOptions","wmsParams","setParams","update","getAttribution","_currentOverlay","removeLayer","_currentUrl","getEvents","moveend","debounce","_map","updateWmsParams","getImageUrl","pad","overlay","addTo","once","setOpacity","bringToBack","bringToFront","setZIndex","maxZoom","getZoom","size","getSize","factor","ceil","wmsVersion","parseFloat","projectionKey","nw","project","getNorthWest","se","getSouthEast","width","height","code","bbox","CRS","EPSG4326","join","pstr","getParamString","makeRemote","Base","args","_update","cb","wait","timeoutId","wrapper","clear","apply","clearTimeout","GridLayer","prototype","call","createTile","coords","done","getTileUrl","tile","crossOrigin","alt","setAttribute","_abortLoading","tiles","_tiles","tileZoom","_tileZoom","i","z","el","falseFn","onerror","complete","emptyImageUrl","DomUtil","remove","TileLayer","TL","urlTemplate","TileAdapter","tileLayerOptions","nativeOptions","subdomains","WmsLayer","WMS","arrayToBoundsExpression","LeafletMapAdapter","layerAdapters","controlAdapters","emitter","EventEmitter","_unselectCb","_universalEvents","_positionEvents","create","zoom","center","maxBounds","mb","mapAdapterOptions","Map","attributionControl","zoomControl","defPane","_addUnselectCb","def","emit","_addMapListeners","destroy","_stopWatchSizeChangeToUpdateMinZoom","getContainer","getControlContainer","controlContainer","_controlContainer","Error","setCursor","cursor","setView","lngLatOrOpt","animate","setCenter","setZoom","fitBounds","b","setMaxBounds","setMinZoom","getBoundsZoom","_watchSizeChangeToUpdateMinZoom","setMaxZoom","panTo","_a","offset","padding","getLayerAdapter","name","createButtonControl","link","title","href","stop","HTMLElement","stopPropagation","addEventListener","parent","parentNode","removeChild","removeEventListener","addControl","position","replace","removeControl","showLayer","hideLayer","setLayerOpacity","setLayerOrder","onMapClick","converted","locate","events","locationfound","locationerror","locationFound","p","container","ResizeObserver","_resizeObserver","observe","disconnect","GEOJSON","_selectedLayers","_filteredLayers","_openedPopup","$updateTooltip","updateTooltip","$unselect","unselect","_events","_paint","FeatureGroup","selectedPaint","data","_addMapListener","beforeRemove","_removeMapListener","select","findFeatureFun","filter","_selectLayer","_unSelectLayer","_removePopup","getSelected","getFiltered","fun","_filterFun","layer_","filteredLayers","cleanFilter","getLayers","visible","clearLayer","splice","clearLayers","setData","detectedType","geojson","geometries","g","detectType","console","warn","filterGeometries","_getGeoJsonOptions","openPopup","_openPopup","closePopup","_updateTooltip","getExtent","isValid","setSelectedPaint","l","updatePaint","updateSelectedPaint","find","properties","labelField","unbindTooltip","message","permanent","labelOnHover","bindTooltip","sticky","minWidth","autoPan","maxWidth","closeButton","closeButton_","selectOnHover","popup","_closeHandlers","onClose","handler","close","createPopupContent","popupContent","popupOptions","closeOnClick","autoClose","bindPopup","_b","unselectOnClose","getPopup","unbindPopup","index","findIndex","closeHandlers","lopt","iconOpt","onEachFeature","_onEachFeature","ok","selectable","interactive","_selectOnLayerClick","isSelected","unselectOnSecondClick","multiselect","popupOnSelect","onSelect","_addMapClickListener","unselectOnClick","_removeMapClickListener","IMAGE","updateWmsParamsFromOpt","TILE","layerOptions","OSM","ZOOM","Zoom","ATTRIBUTION","Attribution","customAttribution","attributions","addAttribution"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"leaflet-map-adapter.esm-bundler.prod.js","sources":["../src/controls/createControl.ts","../src/utils/boundsToArray.ts","../src/utils/detectType.ts","../src/utils/geometries.ts","../src/layer-adapters/BaseAdapter.ts","../src/utils/convertMapClickEvent.ts","../src/layer-adapters/GeoJsonAdapter/utils/GeoJsonEvents.ts","../src/utils/createMouseEvent.ts","../src/layer-adapters/GeoJsonAdapter/utils/GeojsonPaint.ts","../src/utils/callAjax.ts","../src/layer-adapters/ImageAdapter/ImageOverlay.ts","../src/layer-adapters/ImageAdapter/ImageLayer.ts","../src/utils/makeRemoteTileLayer.ts","../../utils/src/debounce.ts","../src/layer-adapters/TileAdapter/TileLayer.ts","../src/layer-adapters/TileAdapter/TileAdapter.ts","../src/layer-adapters/WmsAdapter/WmsLayer.ts","../src/utils/arrayToBoundsExpression.ts","../src/LeafletMapAdapter.ts","../src/controls/createButtonControl.ts","../src/layer-adapters/GeoJsonAdapter/GeoJsonAdapter.ts","../src/layer-adapters/ImageAdapter/ImageAdapter.ts","../src/layer-adapters/WmsAdapter/WmsAdapter.ts","../src/layer-adapters/OsmAdapter.ts","../src/controls/Attribution.ts","../src/index.ts"],"sourcesContent":["import { Control, DomEvent } from 'leaflet';\n\nimport type {\n CreateControlOptions,\n MapAdapter,\n MapControl,\n} from '@nextgis/webmap';\n\nexport function createControl(\n control: MapControl,\n options: CreateControlOptions = {},\n map: MapAdapter,\n): Control {\n const C = Control.extend({\n onAdd() {\n const element = document.createElement('div');\n const content = control.onAdd(map);\n element.classList.add('leaflet-control');\n if (options.bar) {\n element.classList.add('leaflet-bar');\n }\n if (options.addClass) {\n element.classList.add(options.addClass);\n }\n if (!options.margin && !options.bar) {\n element.style.marginBottom = '0px';\n element.style.marginTop = '0px';\n element.style.marginLeft = '0px';\n element.style.marginRight = '0px';\n }\n if (content) {\n element.appendChild(content);\n }\n\n DomEvent.disableClickPropagation(element);\n\n return element;\n },\n onRemove() {\n control.onRemove();\n },\n });\n return new C();\n}\n","import type { LngLatBoundsArray } from '@nextgis/utils';\nimport type { LatLngBounds } from 'leaflet';\n\nexport function boundsToArray(bounds: LatLngBounds): LngLatBoundsArray {\n const ne = bounds.getNorthEast();\n const sw = bounds.getSouthWest();\n return [sw.lng, sw.lat, ne.lng, ne.lat];\n}\n","import type {\n Feature,\n FeatureCollection,\n GeoJsonGeometryTypes,\n GeoJsonObject,\n GeometryCollection,\n} from 'geojson';\n\nfunction findMostFrequentGeomType(\n arr: GeoJsonGeometryTypes[],\n): GeoJsonGeometryTypes {\n const counts: { [x: string]: number } = {};\n for (let fry = 0; fry < arr.length; fry++) {\n counts[arr[fry]] = 1 + (counts[arr[fry]] || 0);\n }\n let maxName = '';\n for (const c in counts) {\n const maxCount = maxName ? counts[maxName] : 0;\n if (counts[c] > maxCount) {\n maxName = c;\n }\n }\n return maxName as GeoJsonGeometryTypes;\n}\n\nexport function detectType(geojson: GeoJsonObject): GeoJsonGeometryTypes {\n let geometry: GeoJsonGeometryTypes;\n if (geojson.type === 'FeatureCollection') {\n const featuresTypes = (geojson as FeatureCollection).features.map(\n (f) => f.geometry.type,\n );\n geometry = findMostFrequentGeomType(featuresTypes);\n } else if (geojson.type === 'GeometryCollection') {\n const geometryTypes = (geojson as GeometryCollection).geometries.map(\n (g) => g.type,\n );\n geometry = findMostFrequentGeomType(geometryTypes);\n } else if (geojson.type === 'Feature') {\n geometry = (geojson as Feature).geometry.type;\n } else {\n geometry = geojson.type;\n }\n return geometry;\n}\n","import { GeoJSON } from 'leaflet';\n\nimport { boundsToArray } from './boundsToArray';\n\nimport type { LngLatArray, LngLatBoundsArray } from '@nextgis/utils';\nimport type { FeaturePosition, VectorAdapterLayerType } from '@nextgis/webmap';\nimport type {\n Feature,\n FeatureCollection,\n GeoJsonGeometryTypes,\n GeoJsonObject,\n GeometryCollection,\n} from 'geojson';\nimport type { LatLngBounds } from 'leaflet';\n\nexport const typeAlias: {\n [key in GeoJsonGeometryTypes]: VectorAdapterLayerType;\n} = {\n Point: 'point',\n LineString: 'line',\n MultiPoint: 'point',\n Polygon: 'polygon',\n MultiLineString: 'line',\n MultiPolygon: 'polygon',\n GeometryCollection: 'polygon',\n};\n\nexport const PAINT = {\n stroke: false,\n opacity: 1,\n};\n\nexport const backAliases: {\n [key in VectorAdapterLayerType]?: GeoJsonGeometryTypes[];\n} = {};\n\nfor (const a in typeAlias) {\n const layerType = typeAlias[a as GeoJsonGeometryTypes];\n const backAlias = backAliases[layerType] || [];\n backAlias.push(a as GeoJsonGeometryTypes);\n backAliases[layerType] = backAlias;\n}\n\nexport function geometryFilter(\n geometry: GeoJsonGeometryTypes,\n type: VectorAdapterLayerType,\n): boolean {\n const geoJsonGeometry = backAliases[type] || [];\n return geoJsonGeometry.indexOf(geometry) !== -1;\n}\n\nexport function filterGeometries(\n data: GeoJsonObject,\n type: VectorAdapterLayerType,\n): GeoJsonObject | false {\n if (data.type === 'FeatureCollection') {\n const _data = data as FeatureCollection;\n _data.features = _data.features.filter((f) =>\n geometryFilter(f.geometry.type, type),\n );\n } else if (data.type === 'Feature') {\n const allow = geometryFilter((data as Feature).geometry.type, type);\n if (!allow) {\n return false;\n }\n } else if (data.type === 'GeometryCollection') {\n const _data = data as GeometryCollection;\n _data.geometries = _data.geometries.filter((g) =>\n geometryFilter(g.type, type),\n );\n }\n return data;\n}\n\nfunction featuresBounds(features: Feature | Feature[]): LatLngBounds {\n const geoJsonLayer = new GeoJSON();\n const features_ = Array.isArray(features) ? features : [features];\n features_.forEach((f) => geoJsonLayer.addData(f));\n return geoJsonLayer.getBounds();\n}\n\nexport function getFeaturesBounds(\n features: Feature | Feature[],\n): LngLatBoundsArray {\n return boundsToArray(featuresBounds(features));\n}\n\nexport function getFeaturesCenter(features: Feature | Feature[]): LngLatArray {\n const { lat, lng } = featuresBounds(features).getCenter();\n return [lng, lat];\n}\n\nexport function createFeaturePositionOptions(\n features: Feature | Feature[],\n): FeaturePosition {\n return {\n getBounds: () => getFeaturesBounds(features),\n getCenter: () => getFeaturesCenter(features),\n };\n}\n","import type { AdapterOptions, MainLayerAdapter } from '@nextgis/webmap';\nimport type { Map } from 'leaflet';\n\nexport class BaseAdapter<O extends AdapterOptions = AdapterOptions, L = any>\n implements MainLayerAdapter<Map, L, O>\n{\n layer?: L;\n protected pane = 'order-0';\n\n constructor(\n public map: Map,\n public options: O,\n ) {\n if (options.order !== undefined) {\n const pane = 'order-' + options.order;\n let exist = map.getPane(pane);\n if (!exist) {\n exist = map.createPane(pane);\n }\n exist.style.zIndex = String(Math.round(options.order * 100));\n this.pane = pane;\n }\n }\n\n addLayer(options: O): L | Promise<L> | undefined {\n Object.assign(this.options, options);\n return undefined;\n }\n}\n","import type { MapClickEvent } from '@nextgis/webmap';\nimport type { LeafletMouseEvent } from 'leaflet';\n\nexport function convertMapClickEvent(evt: LeafletMouseEvent): MapClickEvent {\n const coord = evt.containerPoint;\n const latLng = evt.latlng;\n const { lat, lng } = latLng;\n return {\n latLng,\n lngLat: [lng, lat],\n pixel: { left: coord.x, top: coord.y },\n source: evt,\n };\n}\n","import { createMouseEvent } from '../../../utils/createMouseEvent';\n\nimport type { GeoJsonAdapter } from '../GeoJsonAdapter';\nimport type { OnLayerMouseOptions } from '@nextgis/webmap';\nimport type { Layer } from 'leaflet';\nimport type { LeafletEvent, LeafletMouseEvent } from 'leaflet';\n\nexport class GeoJsonEvents {\n private layer: GeoJsonAdapter;\n\n private _onclick?: (e: LeafletMouseEvent) => void;\n private _mouseout?: (e: LeafletMouseEvent) => void;\n private _mouseover?: (e: LeafletMouseEvent) => void;\n\n constructor(layer: GeoJsonAdapter) {\n this.layer = layer;\n }\n\n handleMouseEvents(layer: Layer) {\n const { onClick, onLayerClick, onMouseOut, onMouseOver } =\n this.layer.options;\n // TODO: remove backward compatibility for onLayerClick\n const onClick_ = onClick || onLayerClick;\n\n if (onClick_) {\n this._onclick = (e: LeafletMouseEvent) => {\n const selected = !!this.layer._getSelected(layer);\n onClick_({\n selected,\n ...this._createMouseEvent(e),\n });\n };\n layer.on('click', this._onclick, this);\n }\n if (onMouseOut) {\n this._mouseout = (e: LeafletMouseEvent) => {\n onMouseOut(this._createMouseEvent(e));\n };\n layer.on('mouseout', this._mouseout, this);\n }\n if (onMouseOver) {\n this._mouseover = (e: LeafletMouseEvent) => {\n onMouseOver(this._createMouseEvent(e));\n };\n layer.on('mouseover', this._mouseover, this);\n }\n }\n\n stopMouseEvents(layer: Layer) {\n if (this._mouseover) {\n layer.off('mouseover', this._mouseover, this);\n }\n if (this._mouseout) {\n layer.off('mouseout', this._mouseout, this);\n }\n if (this._onclick) {\n layer.off('click', this._onclick, this);\n }\n }\n\n private _createMouseEvent(source: LeafletEvent): OnLayerMouseOptions {\n return createMouseEvent({\n layer: this.layer,\n source: source as LeafletMouseEvent,\n });\n }\n}\n","import { convertMapClickEvent } from './convertMapClickEvent';\nimport { createFeaturePositionOptions } from './geometries';\n\nimport type { LayerDef } from '../layer-adapters/GeoJsonAdapter/GeoJsonAdapter';\nimport type { LayerAdapter, OnLayerMouseOptions } from '@nextgis/webmap';\nimport type { LeafletMouseEvent } from 'leaflet';\n\nexport interface CreateMouseEventOptions {\n layer: LayerAdapter;\n source: LeafletMouseEvent;\n}\n\nexport function createMouseEvent({\n layer,\n source,\n}: CreateMouseEventOptions): OnLayerMouseOptions {\n const layer_ = source.target as LayerDef;\n const feature = layer_.feature;\n const opt: OnLayerMouseOptions = {\n layer,\n feature,\n event: convertMapClickEvent(source),\n source,\n ...createFeaturePositionOptions(feature),\n };\n return opt;\n}\n","import { isPaint, isPaintCallback } from '@nextgis/paint';\nimport { defined } from '@nextgis/utils';\nimport { CircleMarker, DivIcon, Marker } from 'leaflet';\n\nimport { PAINT } from '../../../utils/geometries';\n\nimport type { GeoJsonAdapter, LayerDef } from '../GeoJsonAdapter';\nimport type {\n IconPaint,\n PathPaint,\n VectorAdapterLayerPaint,\n} from '@nextgis/paint';\nimport type {\n CircleMarkerOptions,\n GeoJSONOptions,\n LatLngExpression,\n Path,\n PathOptions,\n} from 'leaflet';\n\nexport class GeoJsonPaint {\n private layer: GeoJsonAdapter;\n\n constructor(layer: GeoJsonAdapter) {\n this.layer = layer;\n }\n\n setPaintEachLayer(paint: VectorAdapterLayerPaint) {\n this.layer._layers.forEach((layerDef) => {\n this.setPaint(layerDef, paint);\n });\n }\n\n setPaint(layerDef: LayerDef, paint: VectorAdapterLayerPaint) {\n let style: VectorAdapterLayerPaint | undefined = undefined;\n const { layer, feature } = layerDef;\n if (layer && feature) {\n if (isPaintCallback(paint)) {\n style = paint(feature);\n } else if (isPaint(paint)) {\n style = paint;\n }\n if (style) {\n if (this.layer.type === 'point' && style.type === 'icon') {\n const marker = layer as Marker;\n const divIcon = this._createDivIcon(style);\n setTimeout(() => {\n marker.setIcon(divIcon);\n }, 10);\n } else if ('setStyle' in layer) {\n (layer as Path).setStyle(this.preparePaint(style));\n }\n }\n }\n }\n\n preparePaint(paint: VectorAdapterLayerPaint): PathOptions {\n if (paint.type !== 'get-paint') {\n const paintAliases: [keyof PathOptions, keyof PathPaint][] = [\n ['color', 'strokeColor'],\n ['opacity', 'strokeOpacity'],\n ['stroke', 'stroke'],\n ['fillColor', 'fillColor'],\n ['fillOpacity', 'fillOpacity'],\n ['fill', 'fill'],\n ['weight', 'weight'],\n ];\n const aliases: [keyof PathOptions, keyof PathPaint][] =\n this.layer.type === 'line'\n ? [\n ['color', 'strokeColor'],\n ['opacity', 'strokeOpacity'],\n ['weight', 'weight'],\n ]\n : paintAliases;\n\n const readyPaint: PathOptions & CircleMarkerOptions = {};\n\n if ('radius' in paint && typeof paint.radius === 'number') {\n readyPaint.radius = paint.radius;\n }\n for (const [to, from] of aliases) {\n const opacity = this.layer.options.opacity;\n let paintProp = (paint as PathPaint)[from];\n if (defined(opacity) && from.toLowerCase().indexOf('opacity') !== -1) {\n paintProp = Number(paintProp) * opacity;\n }\n\n if (paintProp !== undefined) {\n Object.defineProperty(readyPaint, to, {\n enumerable: true,\n value: paintProp,\n });\n }\n }\n\n return readyPaint;\n }\n return PAINT;\n }\n\n _createDivIcon(icon: IconPaint) {\n const { html, rotate, className, ...toLIconOpt } = icon;\n\n const element = document.createElement('div');\n if (className) {\n element.className = className;\n }\n if (rotate) {\n element.style.transform = `rotateZ(${rotate}deg)`;\n }\n if (html) {\n element.innerHTML = html;\n }\n\n const divIcon = new DivIcon({\n className: '',\n ...toLIconOpt,\n html: element,\n });\n return divIcon;\n }\n\n createPaintToLayer(icon: IconPaint) {\n if (icon && icon.type) {\n if (icon.type === 'icon') {\n const iconClassName = icon.className;\n const html = icon.html;\n if (iconClassName || html) {\n return (_: any, latlng: LatLngExpression) => {\n const divIcon = this._createDivIcon(icon);\n return new Marker(latlng, { icon: divIcon });\n };\n }\n } else if (icon.type === 'pin') {\n return (_: any, latlng: LatLngExpression) => {\n return new Marker(latlng);\n };\n }\n }\n return (_: any, latlng: LatLngExpression) => {\n const p: any = PAINT;\n return new CircleMarker(latlng, this.preparePaint({ ...p, ...icon }));\n };\n }\n\n createPaintOptions(paint: VectorAdapterLayerPaint): GeoJSONOptions {\n const geoJsonOptions: GeoJSONOptions = {};\n const newPaint = this.preparePaint(paint);\n if (paint) {\n geoJsonOptions.style = () => {\n return newPaint;\n };\n }\n if (this.layer.type === 'point') {\n (geoJsonOptions as any).pointToLayer = this.createPaintToLayer(\n paint as IconPaint,\n );\n } else if (this.layer.type === 'line') {\n newPaint.stroke = true;\n }\n return geoJsonOptions;\n }\n}\n","export function callAjax(\n src: string,\n callback: (resp: any) => any,\n headers: Record<string, any>,\n): () => void {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', src);\n xhr.responseType = 'arraybuffer';\n for (const h in headers) {\n xhr.setRequestHeader(h, headers[h]);\n }\n xhr.onload = function () {\n const arrayBufferView = new Uint8Array(this.response);\n const blob = new Blob([arrayBufferView], { type: 'image/png' });\n // @ts-ignore for typedoc\n const urlCreator = window.URL || window.webkitURL;\n const imageUrl = urlCreator.createObjectURL(blob);\n callback(imageUrl);\n };\n xhr.send();\n return () => {\n xhr.abort();\n };\n}\n","import { ImageOverlay as LImageOverlay } from 'leaflet';\n\nimport { callAjax } from '../../utils/callAjax';\n\nimport type { ImageOverlayOptions, LatLngBoundsExpression } from 'leaflet';\n\ntype IOptions = ImageOverlayOptions & { headers?: any };\n\nexport class ImageOverlay extends LImageOverlay {\n private _abort: (() => void)[] = [];\n\n constructor(\n imageUrl: string,\n bounds: LatLngBoundsExpression,\n options?: IOptions,\n ) {\n super(imageUrl, bounds, options);\n }\n\n cancelLoad(): void {\n if (this._abort) {\n this._abort.forEach((x) => x());\n this._abort = [];\n }\n }\n\n _initImage(): void {\n // @ts-ignore\n super._initImage();\n // @ts-ignore\n const headers = this.options.headers;\n if (headers) {\n // @ts-ignore\n const img: HTMLImageElement = this._image;\n const src = img.src;\n img.src = '';\n this._abort.push(\n callAjax(\n src,\n (response) => {\n img.src = response;\n },\n headers,\n ),\n );\n }\n }\n}\n","/*!\n * leaflet.wms.js\n * A collection of Leaflet utilities for working with Web Mapping services.\n * (c) 2014-2016, Houston Engineering, Inc.\n * MIT License\n */\n\nimport { debounce } from '@nextgis/utils';\nimport { CRS, Layer, Util } from 'leaflet';\n\nimport { ImageOverlay } from './ImageOverlay';\n\nimport type { Map } from 'leaflet';\n\ninterface OverlayOptions {\n crs?: null;\n uppercase?: boolean;\n attribution?: string;\n opacity?: number;\n isBack?: boolean;\n minZoom?: number;\n maxZoom?: number;\n zIndex?: number;\n pane?: string;\n headers?: any;\n viewPortBuffer?: number;\n setViewDelay?: number;\n}\n\n/*\n * Overlay:\n * \"Single Tile\" WMS image overlay that updates with map changes.\n * Portions of wms.Overlay are directly extracted from L.TileLayer.WMS.\n * See Leaflet license.\n */\nexport class ImageLayer extends Layer {\n defaultWmsParams = {\n service: 'WMS',\n request: 'GetMap',\n version: '1.1.1',\n layers: '',\n styles: '',\n format: 'image/jpeg',\n transparent: false,\n };\n\n options: OverlayOptions = {\n crs: null,\n uppercase: false,\n attribution: '',\n opacity: 1,\n isBack: false,\n minZoom: 0,\n pane: 'tilePane',\n headers: null,\n viewPortBuffer: 0,\n setViewDelay: 100,\n };\n\n private wmsParams: any;\n private _url?: string;\n private _currentUrl?: string;\n private _currentOverlay?: ImageOverlay;\n\n constructor(url: string, options: OverlayOptions) {\n super(options);\n this._url = url;\n\n // Move WMS parameters to params object\n const params: any = {};\n const opts: any = {};\n let opt: keyof OverlayOptions;\n for (opt in options) {\n if (opt in this.options) {\n opts[opt] = options[opt];\n } else {\n params[opt] = options[opt];\n }\n }\n Util.setOptions(this, opts);\n this.wmsParams = Util.extend({}, this.defaultWmsParams, params);\n }\n\n setParams(params: Record<string, any>): void {\n Util.extend(this.wmsParams, params);\n this.update();\n }\n\n getAttribution(): string {\n return this.options.attribution || '';\n }\n\n onAdd(): this {\n this.update();\n return this;\n }\n\n onRemove(map: Map): this {\n if (this._currentOverlay) {\n this._currentOverlay.cancelLoad();\n map.removeLayer(this._currentOverlay);\n delete this._currentOverlay;\n }\n if (this._currentUrl) {\n delete this._currentUrl;\n }\n return this;\n }\n\n getEvents(): {\n moveend: () => void;\n } {\n return {\n moveend: debounce(this.update, this.options.setViewDelay),\n };\n }\n\n update(): void {\n if (!this._map) {\n return;\n }\n // Determine image URL and whether it has changed since last update\n this.updateWmsParams();\n const url = this.getImageUrl();\n if (this._currentUrl === url) {\n return;\n }\n this._currentUrl = url;\n\n // Keep current image overlay in place until new one loads\n // (inspired by esri.leaflet)\n const viewPortBuffer = this.options.viewPortBuffer || 0;\n const bounds = this._map.getBounds().pad(viewPortBuffer);\n\n const overlay = new ImageOverlay(url, bounds, {\n opacity: 0,\n pane: this.options.pane,\n headers: this.options.headers,\n });\n overlay.addTo(this._map);\n if (this._currentOverlay) {\n this._currentOverlay.cancelLoad();\n }\n overlay.once(\n 'load',\n () => {\n if (!this._map) {\n return;\n }\n // @ts-ignore\n if (overlay._url !== this._currentUrl) {\n this._map.removeLayer(overlay);\n return;\n } else if (this._currentOverlay) {\n this._map.removeLayer(this._currentOverlay);\n }\n this._currentOverlay = overlay;\n overlay.setOpacity(\n this.options.opacity !== undefined ? this.options.opacity : 1,\n );\n if (this.options.isBack === true) {\n overlay.bringToBack();\n }\n if (this.options.isBack === false) {\n overlay.bringToFront();\n }\n if (this.options.zIndex !== undefined) {\n overlay.setZIndex(this.options.zIndex);\n }\n },\n this,\n );\n const { minZoom, maxZoom } = this.options;\n if (\n (minZoom && this._map.getZoom() < minZoom) ||\n (maxZoom && this._map.getZoom() > maxZoom)\n ) {\n this._map.removeLayer(overlay);\n }\n }\n\n setOpacity(opacity: number): void {\n this.options.opacity = opacity;\n if (this._currentOverlay) {\n this._currentOverlay.setOpacity(opacity);\n }\n }\n\n bringToBack(): void {\n this.options.isBack = true;\n if (this._currentOverlay) {\n this._currentOverlay.bringToBack();\n }\n }\n\n bringToFront(): void {\n this.options.isBack = false;\n if (this._currentOverlay) {\n this._currentOverlay.bringToFront();\n }\n }\n\n setZIndex(zIndex: number): void {\n this.options.zIndex = zIndex;\n if (this._currentOverlay) {\n this._currentOverlay.setZIndex(zIndex);\n }\n }\n\n // See L.TileLayer.WMS: onAdd() & getTileUrl()\n updateWmsParams(map?: Map): void {\n if (!map) {\n map = this._map;\n }\n // Compute WMS options\n const viewPortBuffer = this.options.viewPortBuffer || 0;\n const bounds = map.getBounds().pad(viewPortBuffer);\n const size = map.getSize();\n if (this.options.viewPortBuffer !== 0) {\n const factor = viewPortBuffer + 1;\n size.x = Math.ceil(size.x * factor);\n size.y = Math.ceil(size.y * factor);\n }\n const wmsVersion = parseFloat(this.wmsParams.version);\n const crs = this.options.crs || map.options.crs;\n const projectionKey = wmsVersion >= 1.3 ? 'crs' : 'srs';\n if (crs) {\n const nw = crs.project(bounds.getNorthWest());\n const se = crs.project(bounds.getSouthEast());\n\n // Assemble WMS parameter string\n const params: any = {\n width: size.x,\n height: size.y,\n };\n params[projectionKey] = crs.code;\n params.bbox = (\n wmsVersion >= 1.3 && crs === CRS.EPSG4326\n ? [se.y, nw.x, nw.y, se.x]\n : [nw.x, se.y, se.x, nw.y]\n ).join(',');\n\n Util.extend(this.wmsParams, params);\n }\n }\n\n getImageUrl(): string {\n const uppercase = this.options.uppercase || false;\n const pstr = Util.getParamString(this.wmsParams, this._url, uppercase);\n return this._url + pstr;\n }\n}\n","import { DomUtil, GridLayer, Util } from 'leaflet';\n\nimport { debounce } from '../../../utils/src';\n\nimport { callAjax } from './callAjax';\n\n// import type { TileLayerOptionsExtended } from './TileAdapter/TileLayer';\n\ntype Constructor = new (...args: any[]) => any;\n\nexport function makeRemote<\n TBase extends Constructor,\n // O extends TileLayerOptionsExtended = TileLayerOptionsExtended\n>(Base: TBase): TBase {\n return class RemoteTileLayer extends Base {\n constructor(...args: any[]) {\n super(...args);\n if (this.options.setViewDelay) {\n // @ts-ignore\n this._update = debounce((...a: any[]) => {\n // @ts-ignore\n GridLayer.prototype._update.call(this, ...a);\n }, this.options.setViewDelay);\n }\n }\n\n createTile(\n coords: Record<string, unknown>,\n done: (error: any, tile: HTMLImageElement) => void,\n ): HTMLImageElement {\n // @ts-ignore\n const url = this.getTileUrl(coords);\n\n const tile = document.createElement('img');\n (tile as any).abort = callAjax(\n url,\n (response) => {\n tile.src = response;\n done(null, tile);\n },\n // @ts-ignore\n this.options.headers,\n );\n\n if (this.options.crossOrigin || this.options.crossOrigin === '') {\n tile.crossOrigin =\n this.options.crossOrigin === true ? '' : this.options.crossOrigin;\n }\n\n tile.alt = '';\n tile.setAttribute('role', 'presentation');\n\n return tile;\n }\n\n _abortLoading() {\n // @ts-ignore\n const tiles = this._tiles;\n // @ts-ignore\n const tileZoom = this._tileZoom;\n for (const i in tiles) {\n if (tiles[i].coords.z !== tileZoom) {\n const tile = tiles[i].el;\n\n tile.onload = Util.falseFn;\n tile.onerror = Util.falseFn;\n if (!tile.complete) {\n if (tile.abort) {\n tile.abort();\n }\n tile.src = Util.emptyImageUrl;\n DomUtil.remove(tile);\n delete tiles[i];\n }\n }\n }\n }\n };\n}\n","// based on https://github.com/bvaughn/debounce-decorator\n\nexport function debounce<T extends (...args: any[]) => void>(\n cb: T,\n wait = 10,\n): T & { clear: () => void } {\n let timeoutId: any;\n\n function wrapper(this: any, ...args: any[]) {\n wrapper.clear();\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n cb.apply(this, args);\n }, wait);\n }\n\n wrapper.clear = function () {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return wrapper as T & { clear: () => void };\n}\n\nexport function DebounceDecorator(wait = 10) {\n return function (\n target: unknown,\n key: string,\n descriptor: PropertyDescriptor,\n ): PropertyDescriptor {\n return {\n configurable: true,\n enumerable: descriptor.enumerable,\n get: function getter() {\n // Attach this function to the instance (not the class)\n Object.defineProperty(this, key, {\n configurable: true,\n enumerable: descriptor.enumerable,\n value: debounce(descriptor.value, wait),\n });\n // @ts-ignore\n return this[key];\n },\n };\n };\n}\n","import { TileLayer as TL } from 'leaflet';\n\nimport { makeRemote } from '../../utils/makeRemoteTileLayer';\n\nimport type { TileLayerOptions } from 'leaflet';\n\nexport type TileLayerOptionsExtended = TileLayerOptions & {\n headers: Record<string, any>;\n setViewDelay?: number;\n};\n\nclass TileLayerBase extends TL {\n constructor(urlTemplate: string, options?: TileLayerOptionsExtended) {\n super(urlTemplate, options);\n Object.assign(this.options, options);\n }\n}\n\nexport const TileLayer = makeRemote(TileLayerBase);\n","import { TileLayer } from 'leaflet';\n\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport { TileLayer as TL } from './TileLayer';\n\nimport type { MainLayerAdapter, TileAdapterOptions } from '@nextgis/webmap';\nimport type { TileLayerOptions } from 'leaflet';\n\nexport class TileAdapter\n extends BaseAdapter<TileAdapterOptions, TileLayer>\n implements MainLayerAdapter\n{\n addLayer(options: TileAdapterOptions): TileLayer | undefined {\n this.options = Object.assign(this.options, options);\n if (options) {\n const { url, ...opt } = options;\n if (url) {\n const tileLayerOptions: TileLayerOptions = {\n pane: this.pane,\n attribution: opt.attribution,\n minZoom: opt.minZoom,\n maxZoom: opt.maxZoom,\n\n ...opt.nativeOptions,\n };\n if (opt.subdomains) {\n tileLayerOptions.subdomains = opt.subdomains;\n }\n let layer;\n if (opt.headers) {\n layer = new TL(url, {\n ...tileLayerOptions,\n headers: opt.headers,\n setViewDelay: opt.setViewDelay,\n });\n } else {\n layer = new TileLayer(url, tileLayerOptions);\n }\n return layer;\n }\n }\n }\n}\n","import { TileLayer } from 'leaflet';\n\nimport { makeRemote } from '../../utils/makeRemoteTileLayer';\n\nimport type { WMSOptions } from 'leaflet';\n\ntype LayerOptions = WMSOptions & { headers: any };\n\nclass WmsLayerBase extends TileLayer.WMS {\n constructor(urlTemplate: string, options: LayerOptions) {\n super(urlTemplate, options);\n }\n}\n\nexport const WmsLayer = makeRemote(WmsLayerBase);\n","import type { LngLatBoundsArray } from '@nextgis/utils';\nimport type { LatLngBoundsExpression } from 'leaflet';\n\nexport function arrayToBoundsExpression(\n bounds: LngLatBoundsArray,\n): LatLngBoundsExpression {\n const e = bounds;\n // top, left, bottom, right\n return [\n [e[3], e[0]],\n [e[1], e[2]],\n ];\n}\n","import { EventEmitter } from 'events';\n\nimport { Control, Map } from 'leaflet';\n\nimport { AttributionControl } from './controls/Attribution';\nimport { createButtonControl } from './controls/createButtonControl';\nimport { createControl } from './controls/createControl';\nimport { GeoJsonAdapter } from './layer-adapters/GeoJsonAdapter/GeoJsonAdapter';\nimport { ImageAdapter } from './layer-adapters/ImageAdapter/ImageAdapter';\nimport { OsmAdapter } from './layer-adapters/OsmAdapter';\nimport { TileAdapter } from './layer-adapters/TileAdapter/TileAdapter';\nimport { WmsAdapter } from './layer-adapters/WmsAdapter/WmsAdapter';\nimport { arrayToBoundsExpression } from './utils/arrayToBoundsExpression';\nimport { convertMapClickEvent } from './utils/convertMapClickEvent';\n\nimport type { LngLatArray, LngLatBoundsArray } from '@nextgis/utils';\nimport type {\n ButtonControlOptions,\n CreateControlOptions,\n FitOptions,\n LayerAdapter,\n Locate,\n LocateOptions,\n LocationEvents,\n MainMapEvents,\n MapAdapter,\n MapControl,\n MapOptions,\n ViewOptions,\n} from '@nextgis/webmap';\nimport type {\n ControlPosition,\n FitBoundsOptions,\n GridLayer,\n LatLngBoundsExpression,\n Layer,\n LeafletEvent,\n LeafletMouseEvent,\n LocationEvent,\n} from 'leaflet';\n\nexport type Type<T> = new (...args: any[]) => T;\nexport type UnselectCb = () => void;\nexport type UnselectDef = UnselectCb;\nexport class LeafletMapAdapter implements MapAdapter<Map, any, Control> {\n static layerAdapters: {\n [name: string]: Type<LayerAdapter<Map, any, any>>;\n } = {\n GEOJSON: GeoJsonAdapter,\n IMAGE: ImageAdapter,\n TILE: TileAdapter,\n WMS: WmsAdapter,\n // // MVT: MvtAdapter,\n OSM: OsmAdapter,\n };\n\n static controlAdapters = {\n ZOOM: Control.Zoom,\n ATTRIBUTION: AttributionControl,\n };\n\n static Map = Map;\n\n options: MapOptions<Map> = { target: 'map' };\n\n layerAdapters = LeafletMapAdapter.layerAdapters;\n controlAdapters = LeafletMapAdapter.controlAdapters;\n emitter = new EventEmitter();\n map?: Map;\n\n private _resizeObserver?: ResizeObserver;\n private _unselectCb: UnselectDef[] = [];\n private _universalEvents: (keyof MainMapEvents)[] = [\n 'move',\n 'zoom',\n 'zoomend',\n 'zoomstart',\n 'moveend',\n 'movestart',\n ];\n private _positionEvents: (keyof MainMapEvents)[] = [\n 'mousemove',\n 'mouseout',\n 'mouseover',\n ];\n\n create(options: MapOptions<Map>): void {\n this.options = { ...options };\n if (this.options.target) {\n const {\n zoom,\n center,\n maxZoom,\n minZoom,\n maxBounds: mb,\n mapAdapterOptions,\n } = this.options;\n\n this.map =\n this.options.map ||\n new Map(this.options.target, {\n attributionControl: false,\n zoomControl: false,\n maxBounds: mb ? arrayToBoundsExpression(mb) : undefined,\n maxZoom,\n minZoom,\n center: center && [center[1], center[0]],\n zoom,\n ...mapAdapterOptions,\n });\n // create default pane\n const defPane = this.map.createPane('order-0');\n (this.map as any)._addUnselectCb = (def: UnselectDef) => {\n this._addUnselectCb(def);\n };\n defPane.style.zIndex = String(0);\n this.emitter.emit('create', this);\n this._addMapListeners();\n }\n }\n\n destroy(): void {\n if (this.map) {\n this.map.remove();\n }\n this._stopWatchSizeChangeToUpdateMinZoom();\n }\n\n getContainer(): HTMLElement | undefined {\n return this.map && this.map.getContainer();\n }\n\n getControlContainer(): HTMLElement {\n const controlContainer = this.map && (this.map as any)._controlContainer;\n if (controlContainer) {\n return controlContainer;\n }\n throw new Error('Leaflet Map is not initialized yet');\n }\n\n setCursor(cursor: string): void {\n if (this.map) {\n this.map.getContainer().style.cursor = cursor;\n }\n }\n\n setView(lngLat: LngLatArray, zoom?: number): void;\n setView(options: ViewOptions): void;\n setView(lngLatOrOpt: LngLatArray | ViewOptions, zoom?: number): void {\n const map = this.map;\n if (!map) return;\n if (Array.isArray(lngLatOrOpt)) {\n const lngLat = lngLatOrOpt;\n const [lng, lat] = lngLat;\n if (this.map) {\n if (typeof zoom === 'number') {\n this.map.setView([lat, lng], zoom, { animate: false });\n } else {\n this.setCenter([lng, lat]);\n }\n }\n } else {\n const { zoom, center, maxBounds, bounds, minZoom, maxZoom } = lngLatOrOpt;\n if (center && zoom !== undefined) {\n this.setView(center, zoom);\n } else {\n if (zoom !== undefined) {\n this.setZoom(zoom);\n }\n if (center) {\n this.setCenter(center);\n }\n }\n if (bounds) {\n this.fitBounds(bounds);\n }\n if (maxBounds !== undefined) {\n if (maxBounds) {\n const b = arrayToBoundsExpression(maxBounds);\n map.setMaxBounds(b);\n map.setMinZoom(map.getBoundsZoom(b));\n this._watchSizeChangeToUpdateMinZoom(b);\n } else {\n // @ts-ignore `null` works for unset maxBounds, but not in typing\n map.setMaxBounds(null);\n this._stopWatchSizeChangeToUpdateMinZoom();\n }\n }\n if (maxZoom !== undefined) {\n map.setMaxZoom(maxZoom);\n }\n if (minZoom !== undefined) {\n this._stopWatchSizeChangeToUpdateMinZoom();\n map.setMinZoom(minZoom);\n }\n }\n }\n\n setCenter(lngLat: LngLatArray): void {\n const [lng, lat] = lngLat;\n if (this.map) {\n this.map.panTo([lat, lng]);\n }\n }\n\n getCenter(): LngLatArray | undefined {\n const map = this.map;\n if (map) {\n const bounds = map.getBounds();\n const center = bounds.getCenter();\n return [center.lng, center.lat];\n }\n }\n\n setZoom(zoom: number): void {\n if (this.map) {\n this.map.setZoom(zoom);\n }\n }\n\n getZoom(): number | undefined {\n return (this.map && this.map.getZoom()) ?? undefined;\n }\n\n getBounds(): LngLatBoundsArray | undefined {\n if (!this.map) return undefined;\n const b = this.map.getBounds();\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [sw.lng, sw.lat, ne.lng, ne.lat];\n }\n\n // [west, south, east, north]\n fitBounds(bounds: LngLatBoundsArray, options: FitOptions = {}): void {\n if (this.map) {\n const { maxZoom, offset, padding } = options;\n const opt: FitBoundsOptions = {};\n if (maxZoom) {\n opt.maxZoom = maxZoom;\n }\n if (padding) {\n opt.padding = [padding, padding];\n }\n if (offset) {\n opt.padding = offset;\n }\n\n this.map.fitBounds(arrayToBoundsExpression(bounds), opt);\n }\n }\n\n getLayerAdapter(name: string): Type<LayerAdapter<Map, any, any>> {\n return LeafletMapAdapter.layerAdapters[name];\n }\n\n createControl(control: MapControl, options: CreateControlOptions): Control {\n return createControl(control, options, this);\n }\n\n createButtonControl(options: ButtonControlOptions): Control {\n return createButtonControl(options, this);\n }\n\n addControl(control: Control, position: string): Control | undefined {\n control.options.position = position.replace('-', '') as ControlPosition;\n if (this.map) {\n this.map.addControl(control);\n return control;\n }\n }\n\n removeControl(control: Control): void {\n if (this.map) {\n this.map.removeControl(control);\n }\n }\n\n removeLayer(layer: Layer): void {\n layer && layer.remove && layer.remove();\n }\n\n showLayer(layer: Layer): void {\n if (this.map) {\n layer.addTo(this.map);\n }\n }\n\n hideLayer(layer: Layer): void {\n layer.remove();\n }\n\n setLayerOpacity(layer: GridLayer | Layer, value: number): void {\n if ('setOpacity' in layer) {\n layer.setOpacity(value);\n }\n }\n\n setLayerOrder(\n layer: Layer,\n order: number,\n layers: { [x: string]: LayerAdapter },\n ): void {\n //\n }\n\n onMapClick(evt: LeafletMouseEvent): void {\n const converted = convertMapClickEvent(evt);\n this.emitter.emit('preclick', converted);\n this.emitter.emit('click', converted);\n }\n\n locate(opt: LocateOptions, events?: LocationEvents): Locate {\n const map = this.map;\n if (map) {\n map.locate(opt);\n if (events) {\n const { locationfound, locationerror } = events;\n const locationFound = (e: LeafletEvent) => {\n const event = e as LocationEvent;\n const lngLat: [number, number] = [event.latlng.lng, event.latlng.lat];\n locationfound({ lngLat });\n };\n if (locationfound !== undefined) {\n map.on('locationfound', locationFound, this);\n }\n if (locationerror) {\n map.on('locationerror', locationerror, this);\n }\n const stop = () => {\n if (locationfound !== undefined) {\n map.off('locationfound', locationFound);\n }\n if (locationerror) {\n map.off('locationerror', locationerror);\n }\n };\n return { stop };\n }\n }\n const stop = () => void 'fake function';\n return { stop };\n }\n\n private _addUnselectCb(cb: UnselectDef) {\n for (const p of this._unselectCb) {\n p();\n }\n this._unselectCb.length = 0;\n this._unselectCb.push(cb);\n }\n\n private _watchSizeChangeToUpdateMinZoom(bounds: LatLngBoundsExpression) {\n this._stopWatchSizeChangeToUpdateMinZoom();\n const container = this.getContainer();\n const map = this.map;\n if (container && map && window.ResizeObserver) {\n this._resizeObserver = new ResizeObserver(() => {\n map.setMinZoom(map.getBoundsZoom(bounds));\n });\n this._resizeObserver.observe(container);\n }\n }\n\n private _stopWatchSizeChangeToUpdateMinZoom() {\n const map = this.map;\n if (map) {\n map.setMinZoom(0);\n }\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n this._resizeObserver = undefined;\n }\n }\n\n private _addMapListeners() {\n const map = this.map;\n if (map) {\n map.on('click', (evt) => {\n this.onMapClick(evt as LeafletMouseEvent);\n });\n for (const e of this._universalEvents) {\n map.on(e, () => this.emitter.emit(e, this), map);\n }\n\n for (const e of this._positionEvents) {\n map.on(\n e,\n (evt) =>\n this.emitter.emit(\n e,\n convertMapClickEvent(evt as LeafletMouseEvent),\n ),\n map,\n );\n }\n }\n }\n}\n","import { DomEvent } from 'leaflet';\n\nimport { createControl } from './createControl';\n\nimport type { ButtonControlOptions, MapAdapter } from '@nextgis/webmap';\nimport type { Control } from 'leaflet';\n\nexport function createButtonControl(\n options: ButtonControlOptions,\n map: MapAdapter,\n): Control {\n const link = document.createElement('a');\n\n const title = options.title || '';\n link.href = '#';\n link.title = title;\n\n link.setAttribute('role', 'button');\n link.setAttribute('aria-label', title);\n\n if (options.addClass) {\n link.classList.add(options.addClass);\n }\n\n DomEvent.disableClickPropagation(link);\n DomEvent.on(link, 'click', DomEvent.stop);\n\n if (options.html instanceof HTMLElement) {\n link.appendChild(options.html);\n } else if (typeof options.html === 'string') {\n link.innerHTML = options.html;\n }\n\n const onClick = (e: Event) => {\n e.stopPropagation();\n options.onClick();\n };\n\n return createControl(\n {\n onAdd() {\n if (options.onClick !== undefined) {\n link.addEventListener('click', onClick);\n }\n return link;\n },\n onRemove() {\n const parent = link.parentNode;\n if (parent) {\n parent.removeChild(link);\n }\n if (options.onClick !== undefined) {\n link.removeEventListener('click', onClick);\n }\n },\n },\n { bar: true },\n map,\n );\n}\n","import { debounce, defined } from '@nextgis/utils';\nimport { DomEvent, FeatureGroup, GeoJSON } from 'leaflet';\n\nimport { boundsToArray } from '../../utils/boundsToArray';\nimport { detectType } from '../../utils/detectType';\nimport {\n PAINT,\n createFeaturePositionOptions,\n filterGeometries,\n typeAlias,\n} from '../../utils/geometries';\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport { GeoJsonEvents } from './utils/GeoJsonEvents';\nimport { GeoJsonPaint } from './utils/GeojsonPaint';\n\nimport type { IconPaint, Paint, VectorAdapterLayerPaint } from '@nextgis/paint';\nimport type { LngLatBoundsArray } from '@nextgis/utils';\nimport type {\n DataLayerFilter,\n GeoJsonAdapterOptions,\n LayerDefinition,\n OnLayerSelectType,\n PopupOnCloseFunction,\n PopupOptions,\n VectorAdapterLayerType,\n VectorLayerAdapter,\n} from '@nextgis/webmap';\nimport type { Feature, GeoJsonObject, Point } from 'geojson';\nimport type {\n GeoJSONOptions,\n PopupOptions as LPopupOptions,\n LatLng,\n LatLngExpression,\n Layer,\n LeafletMouseEvent,\n Map,\n} from 'leaflet';\n\nexport type LayerDef = LayerDefinition<Feature, Layer>;\n\nexport class GeoJsonAdapter\n extends BaseAdapter<GeoJsonAdapterOptions>\n implements VectorLayerAdapter<Map>\n{\n layer?: FeatureGroup;\n selected = false;\n\n type?: VectorAdapterLayerType;\n _layers: LayerDef[] = [];\n _events: GeoJsonEvents;\n private paint?: Paint;\n private selectedPaint?: Paint;\n\n private _selectedLayers: LayerDef[] = [];\n private _filteredLayers: LayerDef[] = [];\n private _filterFun?: DataLayerFilter<Feature>;\n private _openedPopup: [Layer, PopupOnCloseFunction[], LayerDef][] = [];\n private _paint: GeoJsonPaint;\n\n private $updateTooltip = debounce(() => {\n this.updateTooltip();\n }, 300);\n\n constructor(map: Map, options: GeoJsonAdapterOptions) {\n super(map, options);\n this._events = new GeoJsonEvents(this);\n this._paint = new GeoJsonPaint(this);\n }\n\n addLayer(options: GeoJsonAdapterOptions): FeatureGroup<any> | undefined {\n Object.assign(this.options, options);\n this.paint = options.paint;\n this.layer = new FeatureGroup([], {\n ...options.nativeOptions,\n pane: this.pane,\n });\n this.selectedPaint = options.selectedPaint;\n options.paint = this.paint;\n\n if (options.data) {\n this.addData(options.data);\n }\n\n this._addMapListener();\n\n return this.layer;\n }\n\n beforeRemove(): void {\n this._removeMapListener();\n }\n\n select(findFeatureFun?: DataLayerFilter): void {\n this.unselect();\n if (findFeatureFun) {\n const def = this._layers.filter(findFeatureFun);\n for (const x of def) {\n this._selectLayer(x, 'api');\n }\n } else if (!this.selected) {\n this.selected = true;\n if (this.selectedPaint) {\n this._paint.setPaintEachLayer(\n this.selectedPaint as VectorAdapterLayerPaint,\n );\n }\n }\n }\n\n unselect(findFeatureFun?: DataLayerFilter): void {\n if (findFeatureFun) {\n const feature = this._layers.filter(findFeatureFun);\n feature.forEach((x) => {\n this._unSelectLayer(x);\n });\n } else if (this.selected) {\n for (const p of this._openedPopup) {\n this._removePopup(p[0]);\n }\n if (this.paint) {\n this._paint.setPaintEachLayer(this.paint as VectorAdapterLayerPaint);\n }\n this._selectedLayers.length = 0;\n this.selected = false;\n }\n }\n\n getSelected(): LayerDefinition<Feature, LayerDef>[] {\n return this._selectedLayers.map((x) => {\n return {\n target: this,\n feature: x.feature,\n layer: x,\n ...createFeaturePositionOptions(x.feature),\n };\n });\n }\n\n getFiltered(): LayerDef[] {\n return this._filteredLayers;\n }\n\n filter(fun?: DataLayerFilter): LayerDef[] {\n // Some optimization\n this._filterFun = fun;\n const layer_ = this.layer;\n const map = layer_ && (layer_ as any)._map;\n if (layer_ && map) {\n layer_.remove();\n\n const filteredLayers: LayerDef[] = [];\n this._layers.forEach(({ feature, layer }) => {\n if (layer) {\n const ok = fun\n ? fun({\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n })\n : true;\n if (ok) {\n layer_.addLayer(layer);\n filteredLayers.push({\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n });\n } else {\n layer_.removeLayer(layer);\n }\n }\n });\n this._filteredLayers = filteredLayers;\n\n layer_.addTo(map);\n }\n return this._filteredLayers;\n }\n\n cleanFilter(): void {\n this.filter();\n }\n\n getLayers(): LayerDef[] {\n return this._layers.map(({ layer, feature }) => {\n const visible = layer && !!(layer as any)._map;\n return {\n feature,\n layer,\n visible,\n target: this,\n ...createFeaturePositionOptions(feature),\n };\n });\n }\n\n clearLayer(cb?: (feature: Feature) => boolean): void {\n this.unselect();\n const layer_ = this.layer;\n if (layer_) {\n if (cb) {\n for (let fry = this._layers.length; fry--; ) {\n const def = this._layers[fry];\n if (def) {\n const { feature, layer } = def;\n if (feature && layer) {\n const exist = cb(feature);\n if (exist) {\n layer_.removeLayer(layer);\n this._layers.splice(fry, 1);\n }\n }\n }\n }\n } else {\n layer_.clearLayers();\n this._layers = [];\n }\n }\n }\n\n setData(data: GeoJsonObject): void {\n this.clearLayer();\n this.addData(data);\n }\n\n addData(data: GeoJsonObject | false): void {\n const options = this.options;\n let geoJsonOptions: GeoJSONOptions | undefined;\n if (options) {\n if (data) {\n let type: VectorAdapterLayerType;\n\n if (!options.type) {\n const detectedType = detectType(data);\n type = typeAlias[detectedType];\n } else {\n type = options.type;\n }\n if (this.type && this.type !== type) {\n console.warn('no other data type than layer can be added');\n return;\n }\n this.type = type;\n\n data = filterGeometries(data, type);\n if (data) {\n geoJsonOptions = this._getGeoJsonOptions(options, type);\n }\n }\n new GeoJSON(data || undefined, geoJsonOptions);\n }\n }\n\n openPopup(findFeatureFun: DataLayerFilter, options?: PopupOptions): void {\n if (findFeatureFun) {\n const def = this._layers.filter(findFeatureFun);\n def.forEach((x) => {\n this._openPopup(x, options, 'api');\n });\n }\n }\n\n closePopup(findFeatureFun?: DataLayerFilter): void {\n const popupToClose = findFeatureFun\n ? this._openedPopup.filter((x) => findFeatureFun(x[2]))\n : this._openedPopup;\n\n popupToClose.forEach((x) => {\n this._removePopup(x[0]);\n });\n }\n\n updateTooltip(layerDef?: LayerDefinition): void {\n if (layerDef) {\n this._updateTooltip(layerDef);\n } else {\n this.getLayers().forEach((x) =>\n this._updateTooltip({ feature: x.feature, layer: x.layer }),\n );\n }\n }\n\n /** @deprecated use {@link GeoJsonAdapter.getBounds} instead */\n getExtent(): LngLatBoundsArray | undefined {\n return this.getBounds();\n }\n\n getBounds(): LngLatBoundsArray | undefined {\n if (this.layer) {\n const bounds = this.layer.getBounds();\n if (bounds.isValid()) {\n return boundsToArray(bounds);\n }\n }\n }\n\n setOpacity(value: number): void {\n this.options.opacity = value;\n this.setPaint(this.paint);\n this.setSelectedPaint(this.selectedPaint);\n }\n\n setPaint(paint?: Paint | null): void {\n if (paint) {\n this.paint = paint;\n for (const l of this._layers) {\n this._paint.setPaint(l, paint as VectorAdapterLayerPaint);\n }\n }\n }\n setSelectedPaint(paint?: Paint | null): void {\n if (paint) {\n this.selectedPaint = paint;\n for (const l of this._selectedLayers) {\n this._paint.setPaint(l, paint as VectorAdapterLayerPaint);\n }\n }\n }\n updatePaint(paint: Partial<Paint>): void {\n this.paint = { ...this.paint, ...paint } as Paint;\n for (const l of this._layers) {\n this._paint.setPaint(l, this.paint as VectorAdapterLayerPaint);\n }\n }\n updateSelectedPaint(paint: Partial<Paint>): void {\n this.selectedPaint = { ...this.selectedPaint, ...paint } as Paint;\n for (const l of this._selectedLayers) {\n this._paint.setPaint(l, this.selectedPaint as VectorAdapterLayerPaint);\n }\n }\n\n _getSelected(layer: LayerDef['layer']) {\n return this._selectedLayers.find((x) => x.layer === layer);\n }\n\n private $unselect = () => {\n this.unselect();\n };\n\n private _updateTooltip(layerDef: Pick<LayerDef, 'feature' | 'layer'>) {\n const { feature, layer } = layerDef;\n const { label, labelField, labelOnHover } = this.options;\n if (layer) {\n layer.unbindTooltip();\n let message: string | undefined;\n if (feature.properties && labelField) {\n message = feature.properties[labelField];\n } else if (label) {\n message = label({\n target: this,\n ...layerDef,\n ...createFeaturePositionOptions(feature),\n });\n }\n if (message) {\n const permanent = !labelOnHover;\n layer.bindTooltip(String(message), { permanent, sticky: false });\n }\n }\n }\n\n private async _openPopup(\n def: LayerDef,\n options: PopupOptions = {},\n type: OnLayerSelectType,\n latLng?: LatLngExpression,\n ) {\n const { feature, layer } = def;\n const {\n minWidth,\n autoPan,\n maxWidth,\n closeButton: closeButton_,\n } = {\n minWidth: 300,\n ...options,\n };\n const closeButton = closeButton_ ?? !this.options.selectOnHover;\n let popup: Layer;\n const _closeHandlers: PopupOnCloseFunction[] = [];\n const onClose = (handler: PopupOnCloseFunction) => {\n _closeHandlers.push(handler);\n };\n const close = () => {\n if (popup) {\n this._removePopup(popup);\n }\n };\n let content;\n if (options.createPopupContent) {\n content = await options.createPopupContent({\n layer,\n feature,\n target: this,\n type,\n close,\n onClose,\n ...createFeaturePositionOptions(feature),\n });\n } else {\n content = options.popupContent;\n }\n\n if (content && layer) {\n const popupOptions: LPopupOptions = {\n minWidth,\n autoPan,\n // maxWidth,\n closeButton,\n closeOnClick: false,\n autoClose: false,\n };\n if (defined(maxWidth)) {\n popupOptions.maxWidth = maxWidth;\n }\n popup = layer.bindPopup(content, popupOptions);\n\n const unselectOnClose =\n this.options.popupOptions?.unselectOnClose ?? true;\n if (unselectOnClose) {\n const p = layer.getPopup();\n p &&\n p.once(\n 'remove',\n () => {\n close();\n },\n this,\n );\n }\n this._openedPopup.push([popup, _closeHandlers, def]);\n popup.openPopup(latLng);\n }\n }\n\n private _removePopup(popup: Layer) {\n const map = this.map;\n if (map) {\n popup.closePopup().unbindPopup();\n const index = this._openedPopup.findIndex((x) => x[0] === popup);\n if (index !== -1) {\n const unselectOnClose =\n this.options.popupOptions?.unselectOnClose ?? true;\n const [, closeHandlers, def] = this._openedPopup[index];\n for (const h of closeHandlers) {\n h(def);\n }\n closeHandlers.length = 0;\n if (unselectOnClose) {\n this._unSelectLayer(def);\n }\n this._openedPopup.splice(index, 1);\n }\n }\n }\n\n private _getGeoJsonOptions(\n options: GeoJsonAdapterOptions,\n type: VectorAdapterLayerType,\n ): GeoJSONOptions {\n const paint = options.paint;\n let lopt: GeoJSONOptions = {};\n\n if (typeof paint === 'function') {\n if (type === 'point') {\n // TODO: fix types (@geoman-io/leaflet-geoman-free)\n (lopt as any).pointToLayer = (\n feature: Feature<Point, any>,\n latLng: LatLng,\n ) => {\n const iconOpt = paint(feature);\n const pointToLayer = this._paint.createPaintToLayer(\n iconOpt as IconPaint,\n );\n return pointToLayer(feature, latLng);\n };\n } else {\n lopt = {\n style: (feature) => {\n if (feature) {\n return this._paint.preparePaint({ ...PAINT, ...paint(feature) });\n } else {\n return this._paint.preparePaint({ ...PAINT, type: 'path' });\n }\n },\n };\n }\n } else {\n lopt = this._paint.createPaintOptions(paint as VectorAdapterLayerPaint);\n }\n\n lopt.onEachFeature = (feature: Feature, layer) => {\n this._onEachFeature(feature, layer);\n };\n\n return lopt;\n }\n\n private _onEachFeature(feature: Feature, layer: Layer) {\n const layer_ = this.layer;\n if (layer_) {\n const def = {\n target: this,\n feature,\n layer,\n ...createFeaturePositionOptions(feature),\n };\n\n layer.options.pane = this.pane;\n this._layers.push(def);\n let ok = true;\n if (this._filterFun) {\n ok = this._filterFun(def);\n }\n if (ok) {\n const { popup, popupOptions, selectable, interactive, selectOnHover } =\n this.options;\n // @ts-ignore\n layer.options.interactive = defined(interactive) ? interactive : true;\n layer_.addLayer(layer);\n if (selectable) {\n if (selectOnHover) {\n layer.on('mouseover', () => {\n this._selectLayer(def, 'hover');\n });\n layer.on('mouseout', () => {\n this._unSelectLayer(def);\n });\n } else {\n layer.on(\n 'click',\n (e) => this._selectOnLayerClick(e as LeafletMouseEvent),\n this,\n );\n }\n }\n this._events.handleMouseEvents(layer);\n // The timeout is needed to display the popup immediately when adding a layer to the map.\n // Without a timeout, the layer may not yet have a _map object\n setTimeout(() => {\n if (popup) {\n this._openPopup(\n {\n target: this,\n layer,\n feature,\n ...createFeaturePositionOptions(feature),\n },\n popupOptions,\n 'api',\n );\n }\n this._updateTooltip({ layer, feature });\n });\n }\n }\n }\n\n private _selectOnLayerClick(e: LeafletMouseEvent) {\n DomEvent.stopPropagation(e);\n const layer = e.target as Layer;\n const feature = (layer as any).feature;\n const def: LayerDef = {\n target: this,\n layer,\n feature,\n ...createFeaturePositionOptions(feature),\n };\n const isSelected = this._getSelected(layer);\n if (isSelected) {\n if (this.options && this.options.unselectOnSecondClick) {\n this._unSelectLayer(isSelected);\n }\n } else {\n this._selectLayer(def, 'click', e.latlng);\n }\n }\n\n private _selectLayer(\n def: LayerDef,\n type: OnLayerSelectType,\n latlng?: LatLngExpression,\n ) {\n const { multiselect } = this.options;\n if (!multiselect) {\n // To unselect layer on another layer click\n (this.map as any)._addUnselectCb(() => {\n this._unSelectLayer(def);\n });\n this._selectedLayers.forEach((x) => this._unSelectLayer(x));\n }\n this._selectedLayers.push(def);\n this.selected = true;\n const { selectedPaint, popupOnSelect, popupOptions } = this.options;\n\n if (selectedPaint && def.layer) {\n this._paint.setPaint(def, selectedPaint as VectorAdapterLayerPaint);\n }\n if (popupOnSelect) {\n this._openPopup(def, popupOptions, type, latlng);\n }\n if (this.options.onSelect) {\n const features = def.feature ? [def.feature] : [];\n this.options.onSelect({\n type,\n layer: this,\n features,\n ...createFeaturePositionOptions(features),\n });\n }\n }\n\n private _unSelectLayer(def: LayerDef) {\n const index = this._selectedLayers.indexOf(def);\n if (index !== -1) {\n this._selectedLayers.splice(index, 1);\n if (this.options) {\n if (this.options.paint) {\n this._paint.setPaint(\n def,\n this.options.paint as VectorAdapterLayerPaint,\n );\n }\n\n if (this.options.popupOnSelect && def.layer) {\n this._removePopup(def.layer);\n }\n }\n }\n this.selected = this._selectedLayers.length > 0;\n }\n\n private _addMapClickListener() {\n const map = this.map;\n if (map) {\n const { unselectOnClick } = this.options;\n const uoc = unselectOnClick ?? true;\n if (uoc) {\n map.on('click', this.$unselect);\n }\n }\n }\n\n private _removeMapClickListener() {\n this.map.off('zoomend', this.$updateTooltip);\n this.map.off('moveend', this.$updateTooltip);\n this.map.off('click', this.$unselect);\n }\n\n private _addMapListener() {\n const map = this.map;\n if (map) {\n const { label, labelField, labelOnHover } = this.options;\n this._addMapClickListener();\n if ((labelField || label) && !labelOnHover) {\n map.on('zoomend', this.$updateTooltip);\n map.on('moveend', this.$updateTooltip);\n }\n }\n }\n\n private _removeMapListener() {\n this._removeMapClickListener();\n this.map.off('zoomend', this.$updateTooltip);\n this.map.off('moveend', this.$updateTooltip);\n }\n}\n","import { BaseAdapter } from '../BaseAdapter';\n\nimport { ImageLayer } from './ImageLayer';\n\nimport type { MainLayerAdapter } from '@nextgis/webmap';\nimport type { ImageAdapterOptions } from '@nextgis/webmap';\nimport type { Map } from 'leaflet';\n\nexport class ImageAdapter\n extends BaseAdapter<ImageAdapterOptions>\n implements MainLayerAdapter<Map>\n{\n layer: any;\n\n addLayer(options: ImageAdapterOptions): any {\n const url = options && options.url;\n if (url) {\n options = { transparent: true, ...options };\n const updateWmsParamsFromOpt = options.updateWmsParams;\n this.layer = new ImageLayer(url, {\n pane: this.pane,\n headers: options.headers,\n setViewDelay: options.setViewDelay,\n /**\n * TODO: safe remove, use only options.nativeOptions\n */\n ...options,\n ...options.params,\n ...options.nativeOptions,\n });\n if (updateWmsParamsFromOpt) {\n const updateWmsParams = this.layer.updateWmsParams;\n this.layer.updateWmsParams = function (map: Map) {\n updateWmsParams.call(this, map);\n this.wmsParams = updateWmsParamsFromOpt(this.wmsParams);\n };\n }\n return this.layer;\n }\n }\n}\n","import { TileLayer } from 'leaflet';\n\nimport { BaseAdapter } from '../BaseAdapter';\n\nimport { WmsLayer as WMS } from './WmsLayer';\n\nimport type { MainLayerAdapter, WmsAdapterOptions } from '@nextgis/webmap';\nimport type { WMSOptions } from 'leaflet';\n\nexport class WmsAdapter\n extends BaseAdapter<WmsAdapterOptions, TileLayer.WMS>\n implements MainLayerAdapter\n{\n addLayer(options: WmsAdapterOptions): TileLayer.WMS | undefined {\n Object.assign(this.options, options);\n const { url, ...opt } = options;\n if (url) {\n const layerOptions: WMSOptions = {\n pane: this.pane,\n attribution: opt.attribution,\n minZoom: opt.minZoom,\n maxZoom: opt.maxZoom,\n layers: options.layers,\n format: options.format,\n ...options.nativeOptions,\n };\n let layer;\n if (opt.headers) {\n layer = new WMS(url, { ...layerOptions, headers: opt.headers });\n } else {\n layer = new TileLayer.WMS(url, layerOptions);\n }\n return layer;\n }\n }\n}\n","import { TileAdapter } from './TileAdapter/TileAdapter';\n\nimport type { MainLayerAdapter, TileAdapterOptions } from '@nextgis/webmap';\nimport type { TileLayer } from 'leaflet';\n\nexport class OsmAdapter extends TileAdapter implements MainLayerAdapter {\n addLayer(options: Omit<TileAdapterOptions, 'url'>): TileLayer | undefined {\n const url = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n return super.addLayer({\n name: 'OpenStreetMap',\n attribution:\n '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors',\n ...options,\n url,\n });\n }\n}\n","import { Control } from 'leaflet';\n\nimport type { AttributionControlOptions } from '@nextgis/webmap';\nimport type { ControlOptions } from 'leaflet';\n\nexport class AttributionControl extends Control.Attribution {\n // options: AttributionControlOptions\n constructor(options: AttributionControlOptions & ControlOptions) {\n super(options);\n const customAttribution = options && options.customAttribution;\n if (customAttribution) {\n let attributions: string[] = [];\n if (Array.isArray(customAttribution)) {\n attributions = customAttribution;\n } else if (customAttribution) {\n attributions = [customAttribution];\n }\n attributions.forEach((x) => this.addAttribution(x));\n }\n }\n}\n","/**\n * @module leaflet-map-adapter\n */\n\nimport { LeafletMapAdapter } from './LeafletMapAdapter';\n\nexport default LeafletMapAdapter;\n"],"names":["createControl","control","options","map","Control","extend","onAdd","element","document","createElement","content","classList","add","bar","addClass","margin","style","marginBottom","marginTop","marginLeft","marginRight","appendChild","DomEvent","disableClickPropagation","onRemove","boundsToArray","bounds","ne","getNorthEast","sw","getSouthWest","lng","lat","findMostFrequentGeomType","arr","counts","fry","length","maxName","c","typeAlias","Point","LineString","MultiPoint","Polygon","MultiLineString","MultiPolygon","GeometryCollection","PAINT","stroke","opacity","backAliases","a","layerType","backAlias","push","geometryFilter","geometry","type","indexOf","featuresBounds","features","geoJsonLayer","GeoJSON","Array","isArray","forEach","f","addData","getBounds","createFeaturePositionOptions","getFeaturesBounds","getCenter","getFeaturesCenter","BaseAdapter","constructor","this","pane","undefined","order","exist","getPane","createPane","zIndex","String","Math","round","addLayer","Object","assign","convertMapClickEvent","evt","coord","containerPoint","latLng","latlng","lngLat","pixel","left","x","top","y","source","GeoJsonEvents","layer","handleMouseEvents","onClick","onLayerClick","onMouseOut","onMouseOver","onClick_","_onclick","e","selected","_getSelected","_createMouseEvent","on","_mouseout","_mouseover","stopMouseEvents","off","feature","target","event","createMouseEvent","GeoJsonPaint","setPaintEachLayer","paint","_layers","layerDef","setPaint","isPaintCallback","isPaint","marker","divIcon","_createDivIcon","setTimeout","setIcon","setStyle","preparePaint","aliases","readyPaint","radius","to","from","paintProp","defined","toLowerCase","Number","defineProperty","enumerable","value","icon","html","rotate","className","toLIconOpt","transform","innerHTML","DivIcon","createPaintToLayer","_","Marker","CircleMarker","createPaintOptions","geoJsonOptions","newPaint","pointToLayer","callAjax","src","callback","headers","xhr","XMLHttpRequest","open","responseType","h","setRequestHeader","onload","arrayBufferView","Uint8Array","response","blob","Blob","imageUrl","window","URL","webkitURL","createObjectURL","send","abort","ImageOverlay","LImageOverlay","super","_abort","cancelLoad","_initImage","img","_image","ImageLayer","Layer","url","defaultWmsParams","service","request","version","layers","styles","format","transparent","crs","uppercase","attribution","isBack","minZoom","viewPortBuffer","setViewDelay","_url","params","opts","opt","Util","setOptions","wmsParams","setParams","update","getAttribution","_currentOverlay","removeLayer","_currentUrl","getEvents","moveend","debounce","_map","updateWmsParams","getImageUrl","pad","overlay","addTo","once","setOpacity","bringToBack","bringToFront","setZIndex","maxZoom","getZoom","size","getSize","factor","ceil","wmsVersion","parseFloat","projectionKey","nw","project","getNorthWest","se","getSouthEast","width","height","code","bbox","CRS","EPSG4326","join","pstr","getParamString","makeRemote","Base","args","_update","cb","wait","timeoutId","wrapper","clear","apply","clearTimeout","GridLayer","prototype","call","createTile","coords","done","getTileUrl","tile","crossOrigin","alt","setAttribute","_abortLoading","tiles","_tiles","tileZoom","_tileZoom","i","z","el","falseFn","onerror","complete","emptyImageUrl","DomUtil","remove","TileLayer","TL","urlTemplate","TileAdapter","tileLayerOptions","nativeOptions","subdomains","WmsLayer","WMS","arrayToBoundsExpression","LeafletMapAdapter","layerAdapters","controlAdapters","emitter","EventEmitter","_unselectCb","_universalEvents","_positionEvents","create","zoom","center","maxBounds","mb","mapAdapterOptions","Map","attributionControl","zoomControl","defPane","_addUnselectCb","def","emit","_addMapListeners","destroy","_stopWatchSizeChangeToUpdateMinZoom","getContainer","getControlContainer","controlContainer","_controlContainer","Error","setCursor","cursor","setView","lngLatOrOpt","animate","setCenter","setZoom","fitBounds","b","setMaxBounds","setMinZoom","getBoundsZoom","_watchSizeChangeToUpdateMinZoom","setMaxZoom","panTo","_a","offset","padding","getLayerAdapter","name","createButtonControl","link","title","href","stop","HTMLElement","stopPropagation","addEventListener","parent","parentNode","removeChild","removeEventListener","addControl","position","replace","removeControl","showLayer","hideLayer","setLayerOpacity","setLayerOrder","onMapClick","converted","locate","events","locationfound","locationerror","locationFound","p","container","ResizeObserver","_resizeObserver","observe","disconnect","GEOJSON","_selectedLayers","_filteredLayers","_openedPopup","$updateTooltip","updateTooltip","$unselect","unselect","_events","_paint","FeatureGroup","selectedPaint","data","_addMapListener","beforeRemove","_removeMapListener","select","findFeatureFun","filter","_selectLayer","_unSelectLayer","_removePopup","getSelected","getFiltered","fun","_filterFun","layer_","filteredLayers","cleanFilter","getLayers","visible","clearLayer","splice","clearLayers","setData","detectedType","geojson","geometries","g","detectType","console","warn","filterGeometries","_getGeoJsonOptions","openPopup","_openPopup","closePopup","_updateTooltip","getExtent","isValid","setSelectedPaint","l","updatePaint","updateSelectedPaint","find","label","labelField","labelOnHover","message","unbindTooltip","properties","permanent","bindTooltip","sticky","minWidth","autoPan","maxWidth","closeButton","closeButton_","selectOnHover","popup","_closeHandlers","onClose","handler","close","createPopupContent","popupContent","popupOptions","closeOnClick","autoClose","bindPopup","_b","unselectOnClose","getPopup","unbindPopup","index","findIndex","closeHandlers","lopt","iconOpt","onEachFeature","_onEachFeature","ok","selectable","interactive","_selectOnLayerClick","isSelected","unselectOnSecondClick","multiselect","popupOnSelect","onSelect","_addMapClickListener","unselectOnClick","_removeMapClickListener","IMAGE","updateWmsParamsFromOpt","TILE","layerOptions","OSM","ZOOM","Zoom","ATTRIBUTION","Attribution","customAttribution","attributions","addAttribution"],"mappings":"yXAQM,SAAUA,EACdC,EACAC,EAAgC,CAAA,EAChCC,GA+BA,OAAO,IA7BGC,EAAQC,OAAO,CACvB,KAAAC,GACE,MAAMC,EAAUC,SAASC,cAAc,OACjCC,EAAUT,EAAQK,MAAMH,GAoB9B,OAnBAI,EAAQI,UAAUC,IAAI,mBAClBV,EAAQW,KACVN,EAAQI,UAAUC,IAAI,eAEpBV,EAAQY,UACVP,EAAQI,UAAUC,IAAIV,EAAQY,UAE3BZ,EAAQa,QAAWb,EAAQW,MAC9BN,EAAQS,MAAMC,aAAe,MAC7BV,EAAQS,MAAME,UAAY,MAC1BX,EAAQS,MAAMG,WAAa,MAC3BZ,EAAQS,MAAMI,YAAc,OAE1BV,GACFH,EAAQc,YAAYX,GAGtBY,EAASC,wBAAwBhB,GAE1BA,CACR,EACD,QAAAiB,GACEvB,EAAQuB,UACT,IAGL,CCxCM,SAAUC,EAAcC,GAC5B,MAAMC,EAAKD,EAAOE,eACZC,EAAKH,EAAOI,eAClB,MAAO,CAACD,EAAGE,IAAKF,EAAGG,IAAKL,EAAGI,IAAKJ,EAAGK,IACrC,CCCA,SAASC,EACPC,GAEA,MAAMC,EAAkC,CAAA,EACxC,IAAK,IAAIC,EAAM,EAAGA,EAAMF,EAAIG,OAAQD,IAClCD,EAAOD,EAAIE,IAAQ,GAAKD,EAAOD,EAAIE,KAAS,GAE9C,IAAIE,EAAU,GACd,IAAK,MAAMC,KAAKJ,EAAQ,CAElBA,EAAOI,IADMD,EAAUH,EAAOG,GAAW,KAE3CA,EAAUC,EAEb,CACD,OAAOD,CACT,CCRO,MAAME,EAET,CACFC,MAAO,QACPC,WAAY,OACZC,WAAY,QACZC,QAAS,UACTC,gBAAiB,OACjBC,aAAc,UACdC,mBAAoB,WAGTC,EAAQ,CACnBC,QAAQ,EACRC,QAAS,GAGEC,EAET,CAAA,EAEJ,IAAK,MAAMC,KAAKZ,EAAW,CACzB,MAAMa,EAAYb,EAAUY,GACtBE,EAAYH,EAAYE,IAAc,GAC5CC,EAAUC,KAAKH,GACfD,EAAYE,GAAaC,CAC1B,CAEe,SAAAE,EACdC,EACAC,GAGA,OAA8C,KADtBP,EAAYO,IAAS,IACtBC,QAAQF,EACjC,CAyBA,SAASG,EAAeC,GACtB,MAAMC,EAAe,IAAIC,EAGzB,OAFkBC,MAAMC,QAAQJ,GAAYA,EAAW,CAACA,IAC9CK,SAASC,GAAML,EAAaM,QAAQD,KACvCL,EAAaO,WACtB,CAaM,SAAUC,EACdT,GAEA,MAAO,CACLQ,UAAW,IAfT,SACJR,GAEA,OAAOpC,EAAcmC,EAAeC,GACtC,CAWqBU,CAAkBV,GACnCW,UAAW,IAVT,SAA4BX,GAChC,MAAM7B,IAAEA,EAAGD,IAAEA,GAAQ6B,EAAeC,GAAUW,YAC9C,MAAO,CAACzC,EAAKC,EACf,CAOqByC,CAAkBZ,GAEvC,OChGaa,EAMX,WAAAC,CACSxE,EACAD,GAEP,GAHO0E,KAAGzE,IAAHA,EACAyE,KAAO1E,QAAPA,EAJC0E,KAAIC,KAAG,eAMOC,IAAlB5E,EAAQ6E,MAAqB,CAC/B,MAAMF,EAAO,SAAW3E,EAAQ6E,MAChC,IAAIC,EAAQ7E,EAAI8E,QAAQJ,GACnBG,IACHA,EAAQ7E,EAAI+E,WAAWL,IAEzBG,EAAMhE,MAAMmE,OAASC,OAAOC,KAAKC,MAAsB,IAAhBpF,EAAQ6E,QAC/CH,KAAKC,KAAOA,CACb,CACF,CAED,QAAAU,CAASrF,GACPsF,OAAOC,OAAOb,KAAK1E,QAASA,EAE7B,ECxBG,SAAUwF,EAAqBC,GACnC,MAAMC,EAAQD,EAAIE,eACZC,EAASH,EAAII,QACb/D,IAAEA,EAAGD,IAAEA,GAAQ+D,EACrB,MAAO,CACLA,SACAE,OAAQ,CAACjE,EAAKC,GACdiE,MAAO,CAAEC,KAAMN,EAAMO,EAAGC,IAAKR,EAAMS,GACnCC,OAAQX,EAEZ,OCNaY,EAOX,WAAA5B,CAAY6B,GACV5B,KAAK4B,MAAQA,CACd,CAED,iBAAAC,CAAkBD,GAChB,MAAME,QAAEA,EAAOC,aAAEA,EAAYC,WAAEA,EAAUC,YAAEA,GACzCjC,KAAK4B,MAAMtG,QAEP4G,EAAWJ,GAAWC,EAExBG,IACFlC,KAAKmC,SAAYC,IACf,MAAMC,IAAarC,KAAK4B,MAAMU,aAAaV,GAC3CM,EAAS,CACPG,cACGrC,KAAKuC,kBAAkBH,IAC1B,EAEJR,EAAMY,GAAG,QAASxC,KAAKmC,SAAUnC,OAE/BgC,IACFhC,KAAKyC,UAAaL,IAChBJ,EAAWhC,KAAKuC,kBAAkBH,GAAG,EAEvCR,EAAMY,GAAG,WAAYxC,KAAKyC,UAAWzC,OAEnCiC,IACFjC,KAAK0C,WAAcN,IACjBH,EAAYjC,KAAKuC,kBAAkBH,GAAG,EAExCR,EAAMY,GAAG,YAAaxC,KAAK0C,WAAY1C,MAE1C,CAED,eAAA2C,CAAgBf,GACV5B,KAAK0C,YACPd,EAAMgB,IAAI,YAAa5C,KAAK0C,WAAY1C,MAEtCA,KAAKyC,WACPb,EAAMgB,IAAI,WAAY5C,KAAKyC,UAAWzC,MAEpCA,KAAKmC,UACPP,EAAMgB,IAAI,QAAS5C,KAAKmC,SAAUnC,KAErC,CAEO,iBAAAuC,CAAkBb,GACxB,iBCjD6BE,MAC/BA,EAAKF,OACLA,IAEA,MACMmB,EADSnB,EAAOoB,OACCD,QAQvB,MAPiC,CAC/BjB,QACAiB,UACAE,MAAOjC,EAAqBY,GAC5BA,YACGhC,EAA6BmD,GAGpC,CDmCWG,CAAiB,CACtBpB,MAAO5B,KAAK4B,MACZF,OAAQA,GAEX,QE7CUuB,EAGX,WAAAlD,CAAY6B,GACV5B,KAAK4B,MAAQA,CACd,CAED,iBAAAsB,CAAkBC,GAChBnD,KAAK4B,MAAMwB,QAAQ9D,SAAS+D,IAC1BrD,KAAKsD,SAASD,EAAUF,EAAM,GAEjC,CAED,QAAAG,CAASD,EAAoBF,GAC3B,IAAI/G,EACJ,MAAMwF,MAAEA,EAAKiB,QAAEA,GAAYQ,EAC3B,GAAIzB,GAASiB,IACPU,EAAgBJ,GAClB/G,EAAQ+G,EAAMN,GACLW,EAAQL,KACjB/G,EAAQ+G,GAEN/G,GACF,GAAwB,UAApB4D,KAAK4B,MAAM9C,MAAmC,SAAf1C,EAAM0C,KAAiB,CACxD,MAAM2E,EAAS7B,EACT8B,EAAU1D,KAAK2D,eAAevH,GACpCwH,YAAW,KACTH,EAAOI,QAAQH,EAAQ,GACtB,GACJ,KAAU,aAAc9B,GACtBA,EAAekC,SAAS9D,KAAK+D,aAAa3H,GAIlD,CAED,YAAA2H,CAAaZ,GACX,GAAmB,cAAfA,EAAMrE,KAAsB,CAC9B,MASMkF,EACgB,SAApBhE,KAAK4B,MAAM9C,KACP,CACE,CAAC,QAAS,eACV,CAAC,UAAW,iBACZ,CAAC,SAAU,WAd0C,CAC3D,CAAC,QAAS,eACV,CAAC,UAAW,iBACZ,CAAC,SAAU,UACX,CAAC,YAAa,aACd,CAAC,cAAe,eAChB,CAAC,OAAQ,QACT,CAAC,SAAU,WAWPmF,EAAgD,CAAA,EAElD,WAAYd,GAAiC,iBAAjBA,EAAMe,SACpCD,EAAWC,OAASf,EAAMe,QAE5B,IAAK,MAAOC,EAAIC,KAASJ,EAAS,CAChC,MAAM1F,EAAU0B,KAAK4B,MAAMtG,QAAQgD,QACnC,IAAI+F,EAAalB,EAAoBiB,GACjCE,EAAQhG,KAAuD,IAA3C8F,EAAKG,cAAcxF,QAAQ,aACjDsF,EAAYG,OAAOH,GAAa/F,QAGhB4B,IAAdmE,GACFzD,OAAO6D,eAAeR,EAAYE,EAAI,CACpCO,YAAY,EACZC,MAAON,GAGZ,CAED,OAAOJ,CACR,CACD,OAAO7F,CACR,CAED,cAAAuF,CAAeiB,GACb,MAAMC,KAAEA,EAAIC,OAAEA,EAAMC,UAAEA,KAAcC,GAAeJ,EAE7CjJ,EAAUC,SAASC,cAAc,OACnCkJ,IACFpJ,EAAQoJ,UAAYA,GAElBD,IACFnJ,EAAQS,MAAM6I,UAAY,WAAWH,SAEnCD,IACFlJ,EAAQuJ,UAAYL,GAQtB,OALgB,IAAIM,EAAQ,CAC1BJ,UAAW,MACRC,EACHH,KAAMlJ,GAGT,CAED,kBAAAyJ,CAAmBR,GACjB,GAAIA,GAAQA,EAAK9F,KACf,GAAkB,SAAd8F,EAAK9F,KAAiB,CAGxB,GAFsB8F,EAAKG,WACdH,EAAKC,KAEhB,MAAO,CAACQ,EAAQlE,KACd,MAAMuC,EAAU1D,KAAK2D,eAAeiB,GACpC,OAAO,IAAIU,EAAOnE,EAAQ,CAAEyD,KAAMlB,GAAU,CAGjD,MAAM,GAAkB,QAAdkB,EAAK9F,KACd,MAAO,CAACuG,EAAQlE,IACP,IAAImE,EAAOnE,GAIxB,MAAO,CAACkE,EAAQlE,IAEP,IAAIoE,EAAapE,EAAQnB,KAAK+D,aAAa,IADnC3F,KAC8CwG,IAEhE,CAED,kBAAAY,CAAmBrC,GACjB,MAAMsC,EAAiC,CAAA,EACjCC,EAAW1F,KAAK+D,aAAaZ,GAanC,OAZIA,IACFsC,EAAerJ,MAAQ,IACdsJ,GAGa,UAApB1F,KAAK4B,MAAM9C,KACZ2G,EAAuBE,aAAe3F,KAAKoF,mBAC1CjC,GAE2B,SAApBnD,KAAK4B,MAAM9C,OACpB4G,EAASrH,QAAS,GAEboH,CACR,WClKaG,EACdC,EACAC,EACAC,GAEA,MAAMC,EAAM,IAAIC,eAChBD,EAAIE,KAAK,MAAOL,GAChBG,EAAIG,aAAe,cACnB,IAAK,MAAMC,KAAKL,EACdC,EAAIK,iBAAiBD,EAAGL,EAAQK,IAWlC,OATAJ,EAAIM,OAAS,WACX,MAAMC,EAAkB,IAAIC,WAAWxG,KAAKyG,UACtCC,EAAO,IAAIC,KAAK,CAACJ,GAAkB,CAAEzH,KAAM,cAG3C8H,GADaC,OAAOC,KAAOD,OAAOE,WACZC,gBAAgBN,GAC5CZ,EAASc,EACX,EACAZ,EAAIiB,OACG,KACLjB,EAAIkB,OAAO,CAEf,CCfM,MAAOC,UAAqBC,EAGhC,WAAArH,CACE6G,EACA9J,EACAxB,GAEA+L,MAAMT,EAAU9J,EAAQxB,GAPlB0E,KAAMsH,OAAmB,EAQhC,CAED,UAAAC,GACMvH,KAAKsH,SACPtH,KAAKsH,OAAOhI,SAASiC,GAAMA,MAC3BvB,KAAKsH,OAAS,GAEjB,CAED,UAAAE,GAEEH,MAAMG,aAEN,MAAMzB,EAAU/F,KAAK1E,QAAQyK,QAC7B,GAAIA,EAAS,CAEX,MAAM0B,EAAwBzH,KAAK0H,OAC7B7B,EAAM4B,EAAI5B,IAChB4B,EAAI5B,IAAM,GACV7F,KAAKsH,OAAO3I,KACViH,EACEC,GACCY,IACCgB,EAAI5B,IAAMY,CAAQ,GAEpBV,GAGL,CACF;;;;;;GCXG,MAAO4B,UAAmBC,EA6B9B,WAAA7H,CAAY8H,EAAavM,GACvB+L,MAAM/L,GA7BR0E,KAAA8H,iBAAmB,CACjBC,QAAS,MACTC,QAAS,SACTC,QAAS,QACTC,OAAQ,GACRC,OAAQ,GACRC,OAAQ,aACRC,aAAa,GAGfrI,KAAA1E,QAA0B,CACxBgN,IAAK,KACLC,WAAW,EACXC,YAAa,GACblK,QAAS,EACTmK,QAAQ,EACRC,QAAS,EACTzI,KAAM,WACN8F,QAAS,KACT4C,eAAgB,EAChBC,aAAc,KAUd5I,KAAK6I,KAAOhB,EAGZ,MAAMiB,EAAc,CAAA,EACdC,EAAY,CAAA,EAClB,IAAIC,EACJ,IAAKA,KAAO1N,EACN0N,KAAOhJ,KAAK1E,QACdyN,EAAKC,GAAO1N,EAAQ0N,GAEpBF,EAAOE,GAAO1N,EAAQ0N,GAG1BC,EAAKC,WAAWlJ,KAAM+I,GACtB/I,KAAKmJ,UAAYF,EAAKxN,OAAO,CAAE,EAAEuE,KAAK8H,iBAAkBgB,EACzD,CAED,SAAAM,CAAUN,GACRG,EAAKxN,OAAOuE,KAAKmJ,UAAWL,GAC5B9I,KAAKqJ,QACN,CAED,cAAAC,GACE,OAAOtJ,KAAK1E,QAAQkN,aAAe,EACpC,CAED,KAAA9M,GAEE,OADAsE,KAAKqJ,SACErJ,IACR,CAED,QAAApD,CAASrB,GASP,OARIyE,KAAKuJ,kBACPvJ,KAAKuJ,gBAAgBhC,aACrBhM,EAAIiO,YAAYxJ,KAAKuJ,wBACdvJ,KAAKuJ,iBAEVvJ,KAAKyJ,oBACAzJ,KAAKyJ,YAEPzJ,IACR,CAED,SAAA0J,GAGE,MAAO,CACLC,QAASC,EAAS5J,KAAKqJ,OAAQrJ,KAAK1E,QAAQsN,cAE/C,CAED,MAAAS,GACE,IAAKrJ,KAAK6J,KACR,OAGF7J,KAAK8J,kBACL,MAAMjC,EAAM7H,KAAK+J,cACjB,GAAI/J,KAAKyJ,cAAgB5B,EACvB,OAEF7H,KAAKyJ,YAAc5B,EAInB,MAAMc,EAAiB3I,KAAK1E,QAAQqN,gBAAkB,EAChD7L,EAASkD,KAAK6J,KAAKpK,YAAYuK,IAAIrB,GAEnCsB,EAAU,IAAI9C,EAAaU,EAAK/K,EAAQ,CAC5CwB,QAAS,EACT2B,KAAMD,KAAK1E,QAAQ2E,KACnB8F,QAAS/F,KAAK1E,QAAQyK,UAExBkE,EAAQC,MAAMlK,KAAK6J,MACf7J,KAAKuJ,iBACPvJ,KAAKuJ,gBAAgBhC,aAEvB0C,EAAQE,KACN,QACA,KACOnK,KAAK6J,OAINI,EAAQpB,OAAS7I,KAAKyJ,aAGfzJ,KAAKuJ,iBACdvJ,KAAK6J,KAAKL,YAAYxJ,KAAKuJ,iBAE7BvJ,KAAKuJ,gBAAkBU,EACvBA,EAAQG,gBACmBlK,IAAzBF,KAAK1E,QAAQgD,QAAwB0B,KAAK1E,QAAQgD,QAAU,IAElC,IAAxB0B,KAAK1E,QAAQmN,QACfwB,EAAQI,eAEkB,IAAxBrK,KAAK1E,QAAQmN,QACfwB,EAAQK,oBAEkBpK,IAAxBF,KAAK1E,QAAQiF,QACf0J,EAAQM,UAAUvK,KAAK1E,QAAQiF,SAhB/BP,KAAK6J,KAAKL,YAAYS,GAiBvB,GAEHjK,MAEF,MAAM0I,QAAEA,EAAO8B,QAAEA,GAAYxK,KAAK1E,SAE/BoN,GAAW1I,KAAK6J,KAAKY,UAAY/B,GACjC8B,GAAWxK,KAAK6J,KAAKY,UAAYD,IAElCxK,KAAK6J,KAAKL,YAAYS,EAEzB,CAED,UAAAG,CAAW9L,GACT0B,KAAK1E,QAAQgD,QAAUA,EACnB0B,KAAKuJ,iBACPvJ,KAAKuJ,gBAAgBa,WAAW9L,EAEnC,CAED,WAAA+L,GACErK,KAAK1E,QAAQmN,QAAS,EAClBzI,KAAKuJ,iBACPvJ,KAAKuJ,gBAAgBc,aAExB,CAED,YAAAC,GACEtK,KAAK1E,QAAQmN,QAAS,EAClBzI,KAAKuJ,iBACPvJ,KAAKuJ,gBAAgBe,cAExB,CAED,SAAAC,CAAUhK,GACRP,KAAK1E,QAAQiF,OAASA,EAClBP,KAAKuJ,iBACPvJ,KAAKuJ,gBAAgBgB,UAAUhK,EAElC,CAGD,eAAAuJ,CAAgBvO,GACTA,IACHA,EAAMyE,KAAK6J,MAGb,MAAMlB,EAAiB3I,KAAK1E,QAAQqN,gBAAkB,EAChD7L,EAASvB,EAAIkE,YAAYuK,IAAIrB,GAC7B+B,EAAOnP,EAAIoP,UACjB,GAAoC,IAAhC3K,KAAK1E,QAAQqN,eAAsB,CACrC,MAAMiC,EAASjC,EAAiB,EAChC+B,EAAKnJ,EAAId,KAAKoK,KAAKH,EAAKnJ,EAAIqJ,GAC5BF,EAAKjJ,EAAIhB,KAAKoK,KAAKH,EAAKjJ,EAAImJ,EAC7B,CACD,MAAME,EAAaC,WAAW/K,KAAKmJ,UAAUlB,SACvCK,EAAMtI,KAAK1E,QAAQgN,KAAO/M,EAAID,QAAQgN,IACtC0C,EAAgBF,GAAc,IAAM,MAAQ,MAClD,GAAIxC,EAAK,CACP,MAAM2C,EAAK3C,EAAI4C,QAAQpO,EAAOqO,gBACxBC,EAAK9C,EAAI4C,QAAQpO,EAAOuO,gBAGxBvC,EAAc,CAClBwC,MAAOZ,EAAKnJ,EACZgK,OAAQb,EAAKjJ,GAEfqH,EAAOkC,GAAiB1C,EAAIkD,KAC5B1C,EAAO2C,MACLX,GAAc,KAAOxC,IAAQoD,EAAIC,SAC7B,CAACP,EAAG3J,EAAGwJ,EAAG1J,EAAG0J,EAAGxJ,EAAG2J,EAAG7J,GACtB,CAAC0J,EAAG1J,EAAG6J,EAAG3J,EAAG2J,EAAG7J,EAAG0J,EAAGxJ,IAC1BmK,KAAK,KAEP3C,EAAKxN,OAAOuE,KAAKmJ,UAAWL,EAC7B,CACF,CAED,WAAAiB,GACE,MACM8B,EAAO5C,EAAK6C,eAAe9L,KAAKmJ,UAAWnJ,KAAK6I,KADpC7I,KAAK1E,QAAQiN,YAAa,GAE5C,OAAOvI,KAAK6I,KAAOgD,CACpB,EChPG,SAAUE,EAGdC,GACA,OAAO,cAA8BA,EACnC,WAAAjM,IAAekM,GACb5E,SAAS4E,GACLjM,KAAK1E,QAAQsN,eAEf5I,KAAKkM,iBChBXC,EACAC,EAAO,IAEP,IAAIC,EAEJ,SAASC,KAAsBL,GAC7BK,EAAQC,QAERF,EAAYzI,YAAW,KACrByI,EAAY,KACZF,EAAGK,MAAMxM,KAAMiM,EAAK,GACnBG,EACJ,CASD,OAPAE,EAAQC,MAAQ,WACVF,IACFI,aAAaJ,GACbA,EAAY,KAEhB,EAEOC,CACT,CDNuB1C,EAAS,IAAIpL,KAE1BkO,EAAUC,UAAUT,QAAQU,KAAK5M,QAASxB,EAAE,GAC3CwB,KAAK1E,QAAQsN,cAEnB,CAED,UAAAiE,CACEC,EACAC,GAGA,MAAMlF,EAAM7H,KAAKgN,WAAWF,GAEtBG,EAAOrR,SAASC,cAAc,OAmBpC,OAlBCoR,EAAa/F,MAAQtB,EACpBiC,GACCpB,IACCwG,EAAKpH,IAAMY,EACXsG,EAAK,KAAME,EAAK,GAGlBjN,KAAK1E,QAAQyK,UAGX/F,KAAK1E,QAAQ4R,aAA4C,KAA7BlN,KAAK1E,QAAQ4R,eAC3CD,EAAKC,aAC0B,IAA7BlN,KAAK1E,QAAQ4R,YAAuB,GAAKlN,KAAK1E,QAAQ4R,aAG1DD,EAAKE,IAAM,GACXF,EAAKG,aAAa,OAAQ,gBAEnBH,CACR,CAED,aAAAI,GAEE,MAAMC,EAAQtN,KAAKuN,OAEbC,EAAWxN,KAAKyN,UACtB,IAAK,MAAMC,KAAKJ,EACd,GAAIA,EAAMI,GAAGZ,OAAOa,IAAMH,EAAU,CAClC,MAAMP,EAAOK,EAAMI,GAAGE,GAEtBX,EAAK3G,OAAS2C,EAAK4E,QACnBZ,EAAKa,QAAU7E,EAAK4E,QACfZ,EAAKc,WACJd,EAAK/F,OACP+F,EAAK/F,QAEP+F,EAAKpH,IAAMoD,EAAK+E,cAChBC,EAAQC,OAAOjB,UACRK,EAAMI,GAEhB,CAEJ,EAEL,CE5DO,MAAMS,EAAYpC,EAPzB,cAA4BqC,EAC1B,WAAArO,CAAYsO,EAAqB/S,GAC/B+L,MAAMgH,EAAa/S,GACnBsF,OAAOC,OAAOb,KAAK1E,QAASA,EAC7B,ICNG,MAAOgT,UACHxO,EAGR,QAAAa,CAASrF,GAEP,GADA0E,KAAK1E,QAAUsF,OAAOC,OAAOb,KAAK1E,QAASA,GACvCA,EAAS,CACX,MAAMuM,IAAEA,KAAQmB,GAAQ1N,EACxB,GAAIuM,EAAK,CACP,MAAM0G,EAAqC,CACzCtO,KAAMD,KAAKC,KACXuI,YAAaQ,EAAIR,YACjBE,QAASM,EAAIN,QACb8B,QAASxB,EAAIwB,WAEVxB,EAAIwF,eAKT,IAAI5M,EAUJ,OAbIoH,EAAIyF,aACNF,EAAiBE,WAAazF,EAAIyF,YAIlC7M,EADEoH,EAAIjD,QACE,IAAIqI,EAAGvG,EAAK,IACf0G,EACHxI,QAASiD,EAAIjD,QACb6C,aAAcI,EAAIJ,eAGZ,IAAIuF,EAAUtG,EAAK0G,GAEtB3M,CACR,CACF,CACF,EC5BI,MAAM8M,EAAW3C,EANxB,cAA2BoC,EAAUQ,IACnC,WAAA5O,CAAYsO,EAAqB/S,GAC/B+L,MAAMgH,EAAa/S,EACpB,ICRG,SAAUsT,EACd9R,GAIA,MAAO,CACL,CAHQA,EAGL,GAHKA,EAGC,IACT,CAJQA,EAIL,GAJKA,EAIC,IAEb,OCgCa+R,EAAb,WAAA9O,GAmBEC,KAAA1E,QAA2B,CAAEwH,OAAQ,OAErC9C,KAAA8O,cAAgBD,EAAkBC,cAClC9O,KAAA+O,gBAAkBF,EAAkBE,gBACpC/O,KAAAgP,QAAU,IAAIC,EAINjP,KAAWkP,YAAkB,GAC7BlP,KAAAmP,iBAA4C,CAClD,OACA,OACA,UACA,YACA,UACA,aAEMnP,KAAAoP,gBAA2C,CACjD,YACA,WACA,YA0TH,CAvTC,MAAAC,CAAO/T,GAEL,GADA0E,KAAK1E,QAAU,IAAKA,GAChB0E,KAAK1E,QAAQwH,OAAQ,CACvB,MAAMwM,KACJA,EAAIC,OACJA,EAAM/E,QACNA,EAAO9B,QACPA,EACA8G,UAAWC,EAAEC,kBACbA,GACE1P,KAAK1E,QAET0E,KAAKzE,IACHyE,KAAK1E,QAAQC,KACb,IAAIoU,EAAI3P,KAAK1E,QAAQwH,OAAQ,CAC3B8M,oBAAoB,EACpBC,aAAa,EACbL,UAAWC,EAAKb,EAAwBa,QAAMvP,EAC9CsK,UACA9B,UACA6G,OAAQA,GAAU,CAACA,EAAO,GAAIA,EAAO,IACrCD,UACGI,IAGP,MAAMI,EAAU9P,KAAKzE,IAAI+E,WAAW,WACnCN,KAAKzE,IAAYwU,eAAkBC,IAClChQ,KAAK+P,eAAeC,EAAI,EAE1BF,EAAQ1T,MAAMmE,OAASC,OAAO,GAC9BR,KAAKgP,QAAQiB,KAAK,SAAUjQ,MAC5BA,KAAKkQ,kBACN,CACF,CAED,OAAAC,GACMnQ,KAAKzE,KACPyE,KAAKzE,IAAI2S,SAEXlO,KAAKoQ,qCACN,CAED,YAAAC,GACE,OAAOrQ,KAAKzE,KAAOyE,KAAKzE,IAAI8U,cAC7B,CAED,mBAAAC,GACE,MAAMC,EAAmBvQ,KAAKzE,KAAQyE,KAAKzE,IAAYiV,kBACvD,GAAID,EACF,OAAOA,EAET,MAAM,IAAIE,MAAM,qCACjB,CAED,SAAAC,CAAUC,GACJ3Q,KAAKzE,MACPyE,KAAKzE,IAAI8U,eAAejU,MAAMuU,OAASA,EAE1C,CAID,OAAAC,CAAQC,EAAwCvB,GAC9C,MAAM/T,EAAMyE,KAAKzE,IACjB,GAAKA,EACL,GAAI6D,MAAMC,QAAQwR,GAAc,CAC9B,MAAMzP,EAASyP,GACR1T,EAAKC,GAAOgE,EACfpB,KAAKzE,MACa,iBAAT+T,EACTtP,KAAKzE,IAAIqV,QAAQ,CAACxT,EAAKD,GAAMmS,EAAM,CAAEwB,SAAS,IAE9C9Q,KAAK+Q,UAAU,CAAC5T,EAAKC,IAG1B,KAAM,CACL,MAAMkS,KAAEA,EAAIC,OAAEA,EAAMC,UAAEA,EAAS1S,OAAEA,EAAM4L,QAAEA,EAAO8B,QAAEA,GAAYqG,EAc9D,GAbItB,QAAmBrP,IAAToP,EACZtP,KAAK4Q,QAAQrB,EAAQD,SAERpP,IAAToP,GACFtP,KAAKgR,QAAQ1B,GAEXC,GACFvP,KAAK+Q,UAAUxB,IAGfzS,GACFkD,KAAKiR,UAAUnU,QAECoD,IAAdsP,EACF,GAAIA,EAAW,CACb,MAAM0B,EAAItC,EAAwBY,GAClCjU,EAAI4V,aAAaD,GACjB3V,EAAI6V,WAAW7V,EAAI8V,cAAcH,IACjClR,KAAKsR,gCAAgCJ,EACtC,MAEC3V,EAAI4V,aAAa,MACjBnR,KAAKoQ,2CAGOlQ,IAAZsK,GACFjP,EAAIgW,WAAW/G,QAEDtK,IAAZwI,IACF1I,KAAKoQ,sCACL7U,EAAI6V,WAAW1I,GAElB,CACF,CAED,SAAAqI,CAAU3P,GACR,MAAOjE,EAAKC,GAAOgE,EACfpB,KAAKzE,KACPyE,KAAKzE,IAAIiW,MAAM,CAACpU,EAAKD,GAExB,CAED,SAAAyC,GACE,MAAMrE,EAAMyE,KAAKzE,IACjB,GAAIA,EAAK,CACP,MACMgU,EADShU,EAAIkE,YACGG,YACtB,MAAO,CAAC2P,EAAOpS,IAAKoS,EAAOnS,IAC5B,CACF,CAED,OAAA4T,CAAQ1B,GACFtP,KAAKzE,KACPyE,KAAKzE,IAAIyV,QAAQ1B,EAEpB,CAED,OAAA7E,SACE,OAAuC,QAAhCgH,EAACzR,KAAKzE,KAAOyE,KAAKzE,IAAIkP,iBAAU,IAAAgH,EAAAA,OAAIvR,CAC5C,CAED,SAAAT,GACE,IAAKO,KAAKzE,IAAK,OACf,MAAM2V,EAAIlR,KAAKzE,IAAIkE,YACbxC,EAAKiU,EAAEhU,eACPH,EAAKmU,EAAElU,eACb,MAAO,CAACC,EAAGE,IAAKF,EAAGG,IAAKL,EAAGI,IAAKJ,EAAGK,IACpC,CAGD,SAAA6T,CAAUnU,EAA2BxB,EAAsB,IACzD,GAAI0E,KAAKzE,IAAK,CACZ,MAAMiP,QAAEA,EAAOkH,OAAEA,EAAMC,QAAEA,GAAYrW,EAC/B0N,EAAwB,CAAA,EAC1BwB,IACFxB,EAAIwB,QAAUA,GAEZmH,IACF3I,EAAI2I,QAAU,CAACA,EAASA,IAEtBD,IACF1I,EAAI2I,QAAUD,GAGhB1R,KAAKzE,IAAI0V,UAAUrC,EAAwB9R,GAASkM,EACrD,CACF,CAED,eAAA4I,CAAgBC,GACd,OAAOhD,EAAkBC,cAAc+C,EACxC,CAED,aAAAzW,CAAcC,EAAqBC,GACjC,OAAOF,EAAcC,EAASC,EAAS0E,KACxC,CAED,mBAAA8R,CAAoBxW,GAClB,OC7PY,SACdA,EACAC,GAEA,MAAMwW,EAAOnW,SAASC,cAAc,KAE9BmW,EAAQ1W,EAAQ0W,OAAS,GAC/BD,EAAKE,KAAO,IACZF,EAAKC,MAAQA,EAEbD,EAAK3E,aAAa,OAAQ,UAC1B2E,EAAK3E,aAAa,aAAc4E,GAE5B1W,EAAQY,UACV6V,EAAKhW,UAAUC,IAAIV,EAAQY,UAG7BQ,EAASC,wBAAwBoV,GACjCrV,EAAS8F,GAAGuP,EAAM,QAASrV,EAASwV,MAEhC5W,EAAQuJ,gBAAgBsN,YAC1BJ,EAAKtV,YAAYnB,EAAQuJ,MACQ,iBAAjBvJ,EAAQuJ,OACxBkN,EAAK7M,UAAY5J,EAAQuJ,MAG3B,MAAM/C,EAAWM,IACfA,EAAEgQ,kBACF9W,EAAQwG,SAAS,EAGnB,OAAO1G,EACL,CACEM,MAAK,UACqBwE,IAApB5E,EAAQwG,SACViQ,EAAKM,iBAAiB,QAASvQ,GAE1BiQ,GAET,QAAAnV,GACE,MAAM0V,EAASP,EAAKQ,WAChBD,GACFA,EAAOE,YAAYT,QAEG7R,IAApB5E,EAAQwG,SACViQ,EAAKU,oBAAoB,QAAS3Q,EAErC,GAEH,CAAE7F,KAAK,GACPV,EAEJ,CDyMWuW,CAAoBxW,EAAS0E,KACrC,CAED,UAAA0S,CAAWrX,EAAkBsX,GAE3B,GADAtX,EAAQC,QAAQqX,SAAWA,EAASC,QAAQ,IAAK,IAC7C5S,KAAKzE,IAEP,OADAyE,KAAKzE,IAAImX,WAAWrX,GACbA,CAEV,CAED,aAAAwX,CAAcxX,GACR2E,KAAKzE,KACPyE,KAAKzE,IAAIsX,cAAcxX,EAE1B,CAED,WAAAmO,CAAY5H,GACVA,GAASA,EAAMsM,QAAUtM,EAAMsM,QAChC,CAED,SAAA4E,CAAUlR,GACJ5B,KAAKzE,KACPqG,EAAMsI,MAAMlK,KAAKzE,IAEpB,CAED,SAAAwX,CAAUnR,GACRA,EAAMsM,QACP,CAED,eAAA8E,CAAgBpR,EAA0B+C,GACpC,eAAgB/C,GAClBA,EAAMwI,WAAWzF,EAEpB,CAED,aAAAsO,CACErR,EACAzB,EACA+H,GAGD,CAED,UAAAgL,CAAWnS,GACT,MAAMoS,EAAYrS,EAAqBC,GACvCf,KAAKgP,QAAQiB,KAAK,WAAYkD,GAC9BnT,KAAKgP,QAAQiB,KAAK,QAASkD,EAC5B,CAED,MAAAC,CAAOpK,EAAoBqK,GACzB,MAAM9X,EAAMyE,KAAKzE,IACjB,GAAIA,IACFA,EAAI6X,OAAOpK,GACPqK,GAAQ,CACV,MAAMC,cAAEA,EAAaC,cAAEA,GAAkBF,EACnCG,EAAiBpR,IAGrBkR,EAAc,CAAElS,OADiB,CADnBgB,EAC0BjB,OAAOhE,IADjCiF,EAC4CjB,OAAO/D,MACxC,OAEL8C,IAAlBoT,GACF/X,EAAIiH,GAAG,gBAAiBgR,EAAexT,MAErCuT,GACFhY,EAAIiH,GAAG,gBAAiB+Q,EAAevT,MAUzC,MAAO,CAAEkS,KARI,UACWhS,IAAlBoT,GACF/X,EAAIqH,IAAI,gBAAiB4Q,GAEvBD,GACFhY,EAAIqH,IAAI,gBAAiB2Q,EAC1B,EAGJ,CAGH,MAAO,CAAErB,KADI,KAA0B,EAExC,CAEO,cAAAnC,CAAe5D,GACrB,IAAK,MAAMsH,KAAKzT,KAAKkP,YACnBuE,IAEFzT,KAAKkP,YAAYzR,OAAS,EAC1BuC,KAAKkP,YAAYvQ,KAAKwN,EACvB,CAEO,+BAAAmF,CAAgCxU,GACtCkD,KAAKoQ,sCACL,MAAMsD,EAAY1T,KAAKqQ,eACjB9U,EAAMyE,KAAKzE,IACbmY,GAAanY,GAAOsL,OAAO8M,iBAC7B3T,KAAK4T,gBAAkB,IAAID,gBAAe,KACxCpY,EAAI6V,WAAW7V,EAAI8V,cAAcvU,GAAQ,IAE3CkD,KAAK4T,gBAAgBC,QAAQH,GAEhC,CAEO,mCAAAtD,GACN,MAAM7U,EAAMyE,KAAKzE,IACbA,GACFA,EAAI6V,WAAW,GAEbpR,KAAK4T,kBACP5T,KAAK4T,gBAAgBE,aACrB9T,KAAK4T,qBAAkB1T,EAE1B,CAEO,gBAAAgQ,GACN,MAAM3U,EAAMyE,KAAKzE,IACjB,GAAIA,EAAK,CACPA,EAAIiH,GAAG,SAAUzB,IACff,KAAKkT,WAAWnS,EAAyB,IAE3C,IAAK,MAAMqB,KAAKpC,KAAKmP,iBACnB5T,EAAIiH,GAAGJ,GAAG,IAAMpC,KAAKgP,QAAQiB,KAAK7N,EAAGpC,OAAOzE,GAG9C,IAAK,MAAM6G,KAAKpC,KAAKoP,gBACnB7T,EAAIiH,GACFJ,GACCrB,GACCf,KAAKgP,QAAQiB,KACX7N,EACAtB,EAAqBC,KAEzBxF,EAGL,CACF,EA/VMsT,EAAAC,cAEH,CACFiF,QEPE,cACIjU,EAsBR,WAAAC,CAAYxE,EAAUD,GACpB+L,MAAM9L,EAAKD,GAnBb0E,KAAQqC,UAAG,EAGXrC,KAAOoD,QAAe,GAKdpD,KAAegU,gBAAe,GAC9BhU,KAAeiU,gBAAe,GAE9BjU,KAAYkU,aAAgD,GAG5DlU,KAAAmU,eAAiBvK,GAAS,KAChC5J,KAAKoU,eAAe,GACnB,KAqRKpU,KAASqU,UAAG,KAClBrU,KAAKsU,UAAU,EAlRftU,KAAKuU,QAAU,IAAI5S,EAAc3B,MACjCA,KAAKwU,OAAS,IAAIvR,EAAajD,KAChC,CAED,QAAAW,CAASrF,GAgBP,OAfAsF,OAAOC,OAAOb,KAAK1E,QAASA,GAC5B0E,KAAKmD,MAAQ7H,EAAQ6H,MACrBnD,KAAK4B,MAAQ,IAAI6S,EAAa,GAAI,IAC7BnZ,EAAQkT,cACXvO,KAAMD,KAAKC,OAEbD,KAAK0U,cAAgBpZ,EAAQoZ,cAC7BpZ,EAAQ6H,MAAQnD,KAAKmD,MAEjB7H,EAAQqZ,MACV3U,KAAKR,QAAQlE,EAAQqZ,MAGvB3U,KAAK4U,kBAEE5U,KAAK4B,KACb,CAED,YAAAiT,GACE7U,KAAK8U,oBACN,CAED,MAAAC,CAAOC,GAEL,GADAhV,KAAKsU,WACDU,EAAgB,CAClB,MAAMhF,EAAMhQ,KAAKoD,QAAQ6R,OAAOD,GAChC,IAAK,MAAMzT,KAAKyO,EACdhQ,KAAKkV,aAAa3T,EAAG,MAExB,MAAWvB,KAAKqC,WACfrC,KAAKqC,UAAW,EACZrC,KAAK0U,eACP1U,KAAKwU,OAAOtR,kBACVlD,KAAK0U,eAIZ,CAED,QAAAJ,CAASU,GACP,GAAIA,EAAgB,CACFhV,KAAKoD,QAAQ6R,OAAOD,GAC5B1V,SAASiC,IACfvB,KAAKmV,eAAe5T,EAAE,GAEzB,MAAM,GAAIvB,KAAKqC,SAAU,CACxB,IAAK,MAAMoR,KAAKzT,KAAKkU,aACnBlU,KAAKoV,aAAa3B,EAAE,IAElBzT,KAAKmD,OACPnD,KAAKwU,OAAOtR,kBAAkBlD,KAAKmD,OAErCnD,KAAKgU,gBAAgBvW,OAAS,EAC9BuC,KAAKqC,UAAW,CACjB,CACF,CAED,WAAAgT,GACE,OAAOrV,KAAKgU,gBAAgBzY,KAAKgG,IACxB,CACLuB,OAAQ9C,KACR6C,QAAStB,EAAEsB,QACXjB,MAAOL,KACJ7B,EAA6B6B,EAAEsB,YAGvC,CAED,WAAAyS,GACE,OAAOtV,KAAKiU,eACb,CAED,MAAAgB,CAAOM,GAELvV,KAAKwV,WAAaD,EAClB,MAAME,EAASzV,KAAK4B,MACdrG,EAAMka,GAAWA,EAAe5L,KACtC,GAAI4L,GAAUla,EAAK,CACjBka,EAAOvH,SAEP,MAAMwH,EAA6B,GACnC1V,KAAKoD,QAAQ9D,SAAQ,EAAGuD,UAASjB,YAC/B,GAAIA,EAAO,EACE2T,GACPA,EAAI,CACFzS,OAAQ9C,KACR6C,UACAjB,WACGlC,EAA6BmD,MAIpC4S,EAAO9U,SAASiB,GAChB8T,EAAe/W,KAAK,CAClBmE,OAAQ9C,KACR6C,UACAjB,WACGlC,EAA6BmD,MAGlC4S,EAAOjM,YAAY5H,EAEtB,KAEH5B,KAAKiU,gBAAkByB,EAEvBD,EAAOvL,MAAM3O,EACd,CACD,OAAOyE,KAAKiU,eACb,CAED,WAAA0B,GACE3V,KAAKiV,QACN,CAED,SAAAW,GACE,OAAO5V,KAAKoD,QAAQ7H,KAAI,EAAGqG,QAAOiB,cAEzB,CACLA,UACAjB,QACAiU,QAJcjU,KAAYA,EAAciI,KAKxC/G,OAAQ9C,QACLN,EAA6BmD,MAGrC,CAED,UAAAiT,CAAW3J,GACTnM,KAAKsU,WACL,MAAMmB,EAASzV,KAAK4B,MACpB,GAAI6T,EACF,GAAItJ,EACF,IAAK,IAAI3O,EAAMwC,KAAKoD,QAAQ3F,OAAQD,KAAS,CAC3C,MAAMwS,EAAMhQ,KAAKoD,QAAQ5F,GACzB,GAAIwS,EAAK,CACP,MAAMnN,QAAEA,EAAOjB,MAAEA,GAAUoO,EAC3B,GAAInN,GAAWjB,EAAO,CACNuK,EAAGtJ,KAEf4S,EAAOjM,YAAY5H,GACnB5B,KAAKoD,QAAQ2S,OAAOvY,EAAK,GAE5B,CACF,CACF,MAEDiY,EAAOO,cACPhW,KAAKoD,QAAU,EAGpB,CAED,OAAA6S,CAAQtB,GACN3U,KAAK8V,aACL9V,KAAKR,QAAQmV,EACd,CAED,OAAAnV,CAAQmV,GACN,MAAMrZ,EAAU0E,KAAK1E,QACrB,IAAImK,EACJ,GAAInK,EAAS,CACX,GAAIqZ,EAAM,CACR,IAAI7V,EAEJ,GAAKxD,EAAQwD,KAIXA,EAAOxD,EAAQwD,SAJE,CACjB,MAAMoX,ElBpNV,SAAqBC,GACzB,IAAItX,EAKFA,EAJmB,sBAAjBsX,EAAQrX,KAICzB,EAHY8Y,EAA8BlX,SAAS1D,KAC3DgE,GAAMA,EAAEV,SAASC,QAGM,uBAAjBqX,EAAQrX,KAINzB,EAHY8Y,EAA+BC,WAAW7a,KAC9D8a,GAAMA,EAAEvX,QAGe,YAAjBqX,EAAQrX,KACLqX,EAAoBtX,SAASC,KAE9BqX,EAAQrX,KAErB,OAAOD,CACT,CkBkM+ByX,CAAW3B,GAChC7V,EAAOlB,EAAUsY,EAClB,CAGD,GAAIlW,KAAKlB,MAAQkB,KAAKlB,OAASA,EAE7B,YADAyX,QAAQC,KAAK,8CAGfxW,KAAKlB,KAAOA,EAEZ6V,EjBrMQ,SACdA,EACA7V,GAEA,GAAkB,sBAAd6V,EAAK7V,KACO6V,EACR1V,SADQ0V,EACS1V,SAASgW,QAAQ1V,GACtCX,EAAeW,EAAEV,SAASC,KAAMA,UAE7B,GAAkB,YAAd6V,EAAK7V,MAEd,IADcF,EAAgB+V,EAAiB9V,SAASC,KAAMA,GAE5D,OAAO,MAEc,uBAAd6V,EAAK7V,OACA6V,EACRyB,WADQzB,EACWyB,WAAWnB,QAAQoB,GAC1CzX,EAAeyX,EAAEvX,KAAMA,MAG3B,OAAO6V,CACT,CiBgLe8B,CAAiB9B,EAAM7V,GAC1B6V,IACFlP,EAAiBzF,KAAK0W,mBAAmBpb,EAASwD,GAErD,CACD,IAAIK,EAAQwV,QAAQzU,EAAWuF,EAChC,CACF,CAED,SAAAkR,CAAU3B,EAAiC1Z,GACzC,GAAI0Z,EAAgB,CACNhV,KAAKoD,QAAQ6R,OAAOD,GAC5B1V,SAASiC,IACXvB,KAAK4W,WAAWrV,EAAGjG,EAAS,MAAM,GAErC,CACF,CAED,UAAAub,CAAW7B,IACYA,EACjBhV,KAAKkU,aAAae,QAAQ1T,GAAMyT,EAAezT,EAAE,MACjDvB,KAAKkU,cAEI5U,SAASiC,IACpBvB,KAAKoV,aAAa7T,EAAE,GAAG,GAE1B,CAED,aAAA6S,CAAc/Q,GACRA,EACFrD,KAAK8W,eAAezT,GAEpBrD,KAAK4V,YAAYtW,SAASiC,GACxBvB,KAAK8W,eAAe,CAAEjU,QAAStB,EAAEsB,QAASjB,MAAOL,EAAEK,SAGxD,CAGD,SAAAmV,GACE,OAAO/W,KAAKP,WACb,CAED,SAAAA,GACE,GAAIO,KAAK4B,MAAO,CACd,MAAM9E,EAASkD,KAAK4B,MAAMnC,YAC1B,GAAI3C,EAAOka,UACT,OAAOna,EAAcC,EAExB,CACF,CAED,UAAAsN,CAAWzF,GACT3E,KAAK1E,QAAQgD,QAAUqG,EACvB3E,KAAKsD,SAAStD,KAAKmD,OACnBnD,KAAKiX,iBAAiBjX,KAAK0U,cAC5B,CAED,QAAApR,CAASH,GACP,GAAIA,EAAO,CACTnD,KAAKmD,MAAQA,EACb,IAAK,MAAM+T,KAAKlX,KAAKoD,QACnBpD,KAAKwU,OAAOlR,SAAS4T,EAAG/T,EAE3B,CACF,CACD,gBAAA8T,CAAiB9T,GACf,GAAIA,EAAO,CACTnD,KAAK0U,cAAgBvR,EACrB,IAAK,MAAM+T,KAAKlX,KAAKgU,gBACnBhU,KAAKwU,OAAOlR,SAAS4T,EAAG/T,EAE3B,CACF,CACD,WAAAgU,CAAYhU,GACVnD,KAAKmD,MAAQ,IAAKnD,KAAKmD,SAAUA,GACjC,IAAK,MAAM+T,KAAKlX,KAAKoD,QACnBpD,KAAKwU,OAAOlR,SAAS4T,EAAGlX,KAAKmD,MAEhC,CACD,mBAAAiU,CAAoBjU,GAClBnD,KAAK0U,cAAgB,IAAK1U,KAAK0U,iBAAkBvR,GACjD,IAAK,MAAM+T,KAAKlX,KAAKgU,gBACnBhU,KAAKwU,OAAOlR,SAAS4T,EAAGlX,KAAK0U,cAEhC,CAED,YAAApS,CAAaV,GACX,OAAO5B,KAAKgU,gBAAgBqD,MAAM9V,GAAMA,EAAEK,QAAUA,GACrD,CAMO,cAAAkV,CAAezT,GACrB,MAAMR,QAAEA,EAAOjB,MAAEA,GAAUyB,GACrBiU,MAAEA,EAAKC,WAAEA,EAAUC,aAAEA,GAAiBxX,KAAK1E,QACjD,GAAIsG,EAAO,CAET,IAAI6V,EAUJ,GAXA7V,EAAM8V,gBAEF7U,EAAQ8U,YAAcJ,EACxBE,EAAU5U,EAAQ8U,WAAWJ,GACpBD,IACTG,EAAUH,EAAM,CACdxU,OAAQ9C,QACLqD,KACA3D,EAA6BmD,MAGhC4U,EAAS,CACX,MAAMG,GAAaJ,EACnB5V,EAAMiW,YAAYrX,OAAOiX,GAAU,CAAEG,YAAWE,QAAQ,GACzD,CACF,CACF,CAEO,gBAAMlB,CACZ5G,EACA1U,EAAwB,CAAA,EACxBwD,EACAoC,WAEA,MAAM2B,QAAEA,EAAOjB,MAAEA,GAAUoO,GACrB+H,SACJA,EAAQC,QACRA,EAAOC,SACPA,EACAC,YAAaC,GACX,CACFJ,SAAU,OACPzc,GAEC4c,EAAcC,QAAAA,GAAiBnY,KAAK1E,QAAQ8c,cAClD,IAAIC,EACJ,MAAMC,EAAyC,GACzCC,EAAWC,IACfF,EAAe3Z,KAAK6Z,EAAQ,EAExBC,EAAQ,KACRJ,GACFrY,KAAKoV,aAAaiD,EACnB,EAEH,IAAIvc,EAeJ,GAbEA,EADER,EAAQod,yBACMpd,EAAQod,mBAAmB,CACzC9W,QACAiB,UACAC,OAAQ9C,KACRlB,OACA2Z,QACAF,aACG7Y,EAA6BmD,KAGxBvH,EAAQqd,aAGhB7c,GAAW8F,EAAO,CACpB,MAAMgX,EAA8B,CAClCb,WACAC,UAEAE,cACAW,cAAc,EACdC,WAAW,GAETxU,EAAQ2T,KACVW,EAAaX,SAAWA,GAE1BI,EAAQzW,EAAMmX,UAAUjd,EAAS8c,GAIjC,GAD4C,QAA1CI,EAAyB,QAAzBvH,EAAAzR,KAAK1E,QAAQsd,oBAAY,IAAAnH,OAAA,EAAAA,EAAEwH,uBAAe,IAAAD,GAAAA,EACvB,CACnB,MAAMvF,EAAI7R,EAAMsX,WAChBzF,GACEA,EAAEtJ,KACA,UACA,KACEsO,GAAO,GAETzY,KAEL,CACDA,KAAKkU,aAAavV,KAAK,CAAC0Z,EAAOC,EAAgBtI,IAC/CqI,EAAM1B,UAAUzV,EACjB,CACF,CAEO,YAAAkU,CAAaiD,WAEnB,GADYrY,KAAKzE,IACR,CACP8c,EAAMxB,aAAasC,cACnB,MAAMC,EAAQpZ,KAAKkU,aAAamF,WAAW9X,GAAMA,EAAE,KAAO8W,IAC1D,IAAe,IAAXe,EAAc,CAChB,MAAMH,EACsC,QAA1CD,EAAyB,QAAzBvH,EAAAzR,KAAK1E,QAAQsd,oBAAY,IAAAnH,OAAA,EAAAA,EAAEwH,uBAAe,IAAAD,GAAAA,GACtC,CAAGM,EAAetJ,GAAOhQ,KAAKkU,aAAakF,GACjD,IAAK,MAAMhT,KAAKkT,EACdlT,EAAE4J,GAEJsJ,EAAc7b,OAAS,EACnBwb,GACFjZ,KAAKmV,eAAenF,GAEtBhQ,KAAKkU,aAAa6B,OAAOqD,EAAO,EACjC,CACF,CACF,CAEO,kBAAA1C,CACNpb,EACAwD,GAEA,MAAMqE,EAAQ7H,EAAQ6H,MACtB,IAAIoW,EAAuB,CAAA,EAkC3B,MAhCqB,mBAAVpW,EACI,UAATrE,EAEDya,EAAa5T,aAAe,CAC3B9C,EACA3B,KAEA,MAAMsY,EAAUrW,EAAMN,GAItB,OAHqB7C,KAAKwU,OAAOpP,mBAC/BoU,EAEK7T,CAAa9C,EAAS3B,EAAO,EAGtCqY,EAAO,CACLnd,MAAQyG,GAEG7C,KAAKwU,OAAOzQ,aADjBlB,EAC8B,IAAKzE,KAAU+E,EAAMN,IAErB,IAAKzE,EAAOU,KAAM,UAM1Dya,EAAOvZ,KAAKwU,OAAOhP,mBAAmBrC,GAGxCoW,EAAKE,cAAgB,CAAC5W,EAAkBjB,KACtC5B,KAAK0Z,eAAe7W,EAASjB,EAAM,EAG9B2X,CACR,CAEO,cAAAG,CAAe7W,EAAkBjB,GACvC,MAAM6T,EAASzV,KAAK4B,MACpB,GAAI6T,EAAQ,CACV,MAAMzF,EAAM,CACVlN,OAAQ9C,KACR6C,UACAjB,WACGlC,EAA6BmD,IAGlCjB,EAAMtG,QAAQ2E,KAAOD,KAAKC,KAC1BD,KAAKoD,QAAQzE,KAAKqR,GAClB,IAAI2J,GAAK,EAIT,GAHI3Z,KAAKwV,aACPmE,EAAK3Z,KAAKwV,WAAWxF,IAEnB2J,EAAI,CACN,MAAMtB,MAAEA,EAAKO,aAAEA,EAAYgB,WAAEA,EAAUC,YAAEA,EAAWzB,cAAEA,GACpDpY,KAAK1E,QAEPsG,EAAMtG,QAAQue,aAAcvV,EAAQuV,IAAeA,EACnDpE,EAAO9U,SAASiB,GACZgY,IACExB,GACFxW,EAAMY,GAAG,aAAa,KACpBxC,KAAKkV,aAAalF,EAAK,QAAQ,IAEjCpO,EAAMY,GAAG,YAAY,KACnBxC,KAAKmV,eAAenF,EAAI,KAG1BpO,EAAMY,GACJ,SACCJ,GAAMpC,KAAK8Z,oBAAoB1X,IAChCpC,OAINA,KAAKuU,QAAQ1S,kBAAkBD,GAG/BgC,YAAW,KACLyU,GACFrY,KAAK4W,WACH,CACE9T,OAAQ9C,KACR4B,QACAiB,aACGnD,EAA6BmD,IAElC+V,EACA,OAGJ5Y,KAAK8W,eAAe,CAAElV,QAAOiB,WAAU,GAE1C,CACF,CACF,CAEO,mBAAAiX,CAAoB1X,GAC1B1F,EAAS0V,gBAAgBhQ,GACzB,MAAMR,EAAQQ,EAAEU,OACVD,EAAWjB,EAAciB,QACzBmN,EAAgB,CACpBlN,OAAQ9C,KACR4B,QACAiB,aACGnD,EAA6BmD,IAE5BkX,EAAa/Z,KAAKsC,aAAaV,GACjCmY,EACE/Z,KAAK1E,SAAW0E,KAAK1E,QAAQ0e,uBAC/Bha,KAAKmV,eAAe4E,GAGtB/Z,KAAKkV,aAAalF,EAAK,QAAS5N,EAAEjB,OAErC,CAEO,YAAA+T,CACNlF,EACAlR,EACAqC,GAEA,MAAM8Y,YAAEA,GAAgBja,KAAK1E,QACxB2e,IAEFja,KAAKzE,IAAYwU,gBAAe,KAC/B/P,KAAKmV,eAAenF,EAAI,IAE1BhQ,KAAKgU,gBAAgB1U,SAASiC,GAAMvB,KAAKmV,eAAe5T,MAE1DvB,KAAKgU,gBAAgBrV,KAAKqR,GAC1BhQ,KAAKqC,UAAW,EAChB,MAAMqS,cAAEA,EAAawF,cAAEA,EAAatB,aAAEA,GAAiB5Y,KAAK1E,QAQ5D,GANIoZ,GAAiB1E,EAAIpO,OACvB5B,KAAKwU,OAAOlR,SAAS0M,EAAK0E,GAExBwF,GACFla,KAAK4W,WAAW5G,EAAK4I,EAAc9Z,EAAMqC,GAEvCnB,KAAK1E,QAAQ6e,SAAU,CACzB,MAAMlb,EAAW+Q,EAAInN,QAAU,CAACmN,EAAInN,SAAW,GAC/C7C,KAAK1E,QAAQ6e,SAAS,CACpBrb,OACA8C,MAAO5B,KACPf,cACGS,EAA6BT,IAEnC,CACF,CAEO,cAAAkW,CAAenF,GACrB,MAAMoJ,EAAQpZ,KAAKgU,gBAAgBjV,QAAQiR,IAC5B,IAAXoJ,IACFpZ,KAAKgU,gBAAgB+B,OAAOqD,EAAO,GAC/BpZ,KAAK1E,UACH0E,KAAK1E,QAAQ6H,OACfnD,KAAKwU,OAAOlR,SACV0M,EACAhQ,KAAK1E,QAAQ6H,OAIbnD,KAAK1E,QAAQ4e,eAAiBlK,EAAIpO,OACpC5B,KAAKoV,aAAapF,EAAIpO,SAI5B5B,KAAKqC,SAAWrC,KAAKgU,gBAAgBvW,OAAS,CAC/C,CAEO,oBAAA2c,GACN,MAAM7e,EAAMyE,KAAKzE,IACjB,GAAIA,EAAK,CACP,MAAM8e,gBAAEA,GAAoBra,KAAK1E,SACrB+e,SAAAA,IAEV9e,EAAIiH,GAAG,QAASxC,KAAKqU,UAExB,CACF,CAEO,uBAAAiG,GACNta,KAAKzE,IAAIqH,IAAI,UAAW5C,KAAKmU,gBAC7BnU,KAAKzE,IAAIqH,IAAI,UAAW5C,KAAKmU,gBAC7BnU,KAAKzE,IAAIqH,IAAI,QAAS5C,KAAKqU,UAC5B,CAEO,eAAAO,GACN,MAAMrZ,EAAMyE,KAAKzE,IACjB,GAAIA,EAAK,CACP,MAAM+b,MAAEA,EAAKC,WAAEA,EAAUC,aAAEA,GAAiBxX,KAAK1E,QACjD0E,KAAKoa,wBACA7C,IAAcD,GAAWE,IAC5Bjc,EAAIiH,GAAG,UAAWxC,KAAKmU,gBACvB5Y,EAAIiH,GAAG,UAAWxC,KAAKmU,gBAE1B,CACF,CAEO,kBAAAW,GACN9U,KAAKsa,0BACLta,KAAKzE,IAAIqH,IAAI,UAAW5C,KAAKmU,gBAC7BnU,KAAKzE,IAAIqH,IAAI,UAAW5C,KAAKmU,eAC9B,GF5mBCoG,MGzCE,cACIza,EAKR,QAAAa,CAASrF,GACP,MAAMuM,EAAMvM,GAAWA,EAAQuM,IAC/B,GAAIA,EAAK,CAEP,MAAM2S,GADNlf,EAAU,CAAE+M,aAAa,KAAS/M,IACKwO,gBAYvC,GAXA9J,KAAK4B,MAAQ,IAAI+F,EAAWE,EAAK,CAC/B5H,KAAMD,KAAKC,KACX8F,QAASzK,EAAQyK,QACjB6C,aAActN,EAAQsN,gBAInBtN,KACAA,EAAQwN,UACRxN,EAAQkT,gBAETgM,EAAwB,CAC1B,MAAM1Q,EAAkB9J,KAAK4B,MAAMkI,gBACnC9J,KAAK4B,MAAMkI,gBAAkB,SAAUvO,GACrCuO,EAAgB8C,KAAK5M,KAAMzE,GAC3ByE,KAAKmJ,UAAYqR,EAAuBxa,KAAKmJ,UAC/C,CACD,CACD,OAAOnJ,KAAK4B,KACb,CACF,GHWC6Y,KAAMnM,EACNK,II1CE,cACI7O,EAGR,QAAAa,CAASrF,GACPsF,OAAOC,OAAOb,KAAK1E,QAASA,GAC5B,MAAMuM,IAAEA,KAAQmB,GAAQ1N,EACxB,GAAIuM,EAAK,CACP,MAAM6S,EAA2B,CAC/Bza,KAAMD,KAAKC,KACXuI,YAAaQ,EAAIR,YACjBE,QAASM,EAAIN,QACb8B,QAASxB,EAAIwB,QACbtC,OAAQ5M,EAAQ4M,OAChBE,OAAQ9M,EAAQ8M,UACb9M,EAAQkT,eAEb,IAAI5M,EAMJ,OAJEA,EADEoH,EAAIjD,QACE,IAAI4I,EAAI9G,EAAK,IAAK6S,EAAc3U,QAASiD,EAAIjD,UAE7C,IAAIoI,EAAUQ,IAAI9G,EAAK6S,GAE1B9Y,CACR,CACF,GJmBC+Y,IKhDE,cAA0BrM,EAC9B,QAAA3N,CAASrF,GAEP,OAAO+L,MAAM1G,SAAS,CACpBkR,KAAM,gBACNrJ,YACE,6FACClN,EACHuM,IANU,sDAQb,ILyCMgH,EAAAE,gBAAkB,CACvB6L,KAAMpf,EAAQqf,KACdC,YMrDS,cAA2Btf,EAAQuf,YAE9C,WAAAhb,CAAYzE,GACV+L,MAAM/L,GACN,MAAM0f,EAAoB1f,GAAWA,EAAQ0f,kBAC7C,GAAIA,EAAmB,CACrB,IAAIC,EAAyB,GACzB7b,MAAMC,QAAQ2b,GAChBC,EAAeD,EACNA,IACTC,EAAe,CAACD,IAElBC,EAAa3b,SAASiC,GAAMvB,KAAKkb,eAAe3Z,IACjD,CACF,IN0CMsN,EAAGc,IAAGA,EOvDf,IAAAd,EAAeA"}
|