| 12345678 |
- /**
- * JSTS. See https://github.com/bjornharrtell/jsts
- * https://github.com/bjornharrtell/jsts/blob/master/LICENSE_EDLv1.txt
- * https://github.com/bjornharrtell/jsts/blob/master/LICENSE_EPLv1.txt
- * @license
- */
- class t{static equalsWithTolerance(t,e,s){return Math.abs(t-e)<=s}}class e extends Error{constructor(t){super(t),this.name=Object.keys({Exception:e})[0]}toString(){return this.message}}class s extends e{constructor(t){super(t),this.name=Object.keys({IllegalArgumentException:s})[0]}}class n{constructor(t,e){this.low=e||0,this.high=t||0}static toBinaryString(t){let e,s="";for(e=2147483648;e>0;e>>>=1)s+=(t.high&e)===e?"1":"0";for(e=2147483648;e>0;e>>>=1)s+=(t.low&e)===e?"1":"0";return s}}function i(){}function r(){}function o(){}function l(){}function a(){}i.NaN=NaN,i.isNaN=t=>Number.isNaN(t),i.isInfinite=t=>!Number.isFinite(t),i.MAX_VALUE=Number.MAX_VALUE,i.POSITIVE_INFINITY=Number.POSITIVE_INFINITY,i.NEGATIVE_INFINITY=Number.NEGATIVE_INFINITY,"function"==typeof Float64Array&&"function"==typeof Int32Array?function(){const t=2146435072,e=new Float64Array(1),s=new Int32Array(e.buffer);i.doubleToLongBits=function(i){e[0]=i;let r=0|s[0],o=0|s[1];return(o&t)===t&&0!=(1048575&o)&&0!==r&&(r=0,o=2146959360),new n(o,r)},i.longBitsToDouble=function(t){return s[0]=t.low,s[1]=t.high,e[0]}}():function(){const t=1023,e=Math.log2,s=Math.floor,r=Math.pow,o=function(){for(let t=53;t>0;t--){const n=r(2,t)-1;if(s(e(n))+1===t)return n}return 0}();i.doubleToLongBits=function(i){let l,a,c,h,u,g,d,_,p;if(i<0||1/i===Number.NEGATIVE_INFINITY?(g=1<<31,i=-i):g=0,0===i)return p=0,_=g,new n(_,p);if(i===1/0)return p=0,_=2146435072|g,new n(_,p);if(i!=i)return p=0,_=2146959360,new n(_,p);if(h=0,p=0,l=s(i),l>1)if(l<=o)h=s(e(l)),h<=20?(p=0,_=l<<20-h&1048575):(c=h-20,a=r(2,c),p=l%a<<32-c,_=l/a&1048575);else for(c=l,p=0;a=c/2,c=s(a),0!==c;)h++,p>>>=1,p|=(1&_)<<31,_>>>=1,a!==c&&(_|=524288);if(d=h+t,u=0===l,l=i-l,h<52&&0!==l)for(c=0;;){if(a=2*l,a>=1?(l=a-1,u?(d--,u=!1):(c<<=1,c|=1,h++)):(l=a,u?0==--d&&(h++,u=!1):(c<<=1,h++)),20===h)_|=c,c=0;else if(52===h){p|=c;break}if(1===a){h<20?_|=c<<20-h:h<52&&(p|=c<<52-h);break}}return _|=d<<20,_|=g,new n(_,p)},i.longBitsToDouble=function(e){let s,n,i,o;const l=e.high,a=e.low,c=l&1<<31?-1:1;for(i=((2146435072&l)>>20)-t,o=0,n=1<<19,s=1;s<=20;s++)l&n&&(o+=r(2,-s)),n>>>=1;for(n=1<<31,s=21;s<=52;s++)a&n&&(o+=r(2,-s)),n>>>=1;if(-1023===i){if(0===o)return 0*c;i=-1022}else{if(1024===i)return 0===o?c/0:NaN;o+=1}return c*o*r(2,i)}}();class c extends e{constructor(t){super(t),this.name=Object.keys({RuntimeException:c})[0]}}class h extends c{constructor(){super(),h.constructor_.apply(this,arguments)}static constructor_(){if(0===arguments.length)c.constructor_.call(this);else if(1===arguments.length){const t=arguments[0];c.constructor_.call(this,t)}}}class u{static shouldNeverReachHere(){if(0===arguments.length)u.shouldNeverReachHere(null);else if(1===arguments.length){const t=arguments[0];throw new h("Should never reach here"+(null!==t?": "+t:""))}}static isTrue(){if(1===arguments.length){const t=arguments[0];u.isTrue(t,null)}else if(2===arguments.length){const t=arguments[1];if(!arguments[0])throw null===t?new h:new h(t)}}static equals(){if(2===arguments.length){const t=arguments[0],e=arguments[1];u.equals(t,e,null)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];if(!e.equals(t))throw new h("Expected "+t+" but encountered "+e+(null!==s?": "+s:""))}}}const g=new ArrayBuffer(8),d=new Float64Array(g),_=new Int32Array(g);class p{constructor(){p.constructor_.apply(this,arguments)}static constructor_(){if(this.x=null,this.y=null,this.z=null,0===arguments.length)p.constructor_.call(this,0,0);else if(1===arguments.length){const t=arguments[0];p.constructor_.call(this,t.x,t.y,t.getZ())}else if(2===arguments.length){const t=arguments[0],e=arguments[1];p.constructor_.call(this,t,e,p.NULL_ORDINATE)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this.x=t,this.y=e,this.z=s}}static hashCode(t){return d[0]=t,_[0]^_[1]}getM(){return i.NaN}setOrdinate(t,e){switch(t){case p.X:this.x=e;break;case p.Y:this.y=e;break;case p.Z:this.setZ(e);break;default:throw new s("Invalid ordinate index: "+t)}}equals2D(){if(1===arguments.length){const t=arguments[0];return this.x===t.x&&this.y===t.y}if(2===arguments.length){const e=arguments[0],s=arguments[1];return!!t.equalsWithTolerance(this.x,e.x,s)&&!!t.equalsWithTolerance(this.y,e.y,s)}}setM(t){throw new s("Invalid ordinate index: "+p.M)}getZ(){return this.z}getOrdinate(t){switch(t){case p.X:return this.x;case p.Y:return this.y;case p.Z:return this.getZ()}throw new s("Invalid ordinate index: "+t)}equals3D(t){return this.x===t.x&&this.y===t.y&&(this.getZ()===t.getZ()||i.isNaN(this.getZ())&&i.isNaN(t.getZ()))}equals(t){return t instanceof p&&this.equals2D(t)}equalInZ(e,s){return t.equalsWithTolerance(this.getZ(),e.getZ(),s)}setX(t){this.x=t}compareTo(t){const e=t;return this.x<e.x?-1:this.x>e.x?1:this.y<e.y?-1:this.y>e.y?1:0}getX(){return this.x}setZ(t){this.z=t}clone(){try{return null}catch(t){if(t instanceof CloneNotSupportedException)return u.shouldNeverReachHere("this shouldn't happen because this class is Cloneable"),null;throw t}}copy(){return new p(this)}toString(){return"("+this.x+", "+this.y+", "+this.getZ()+")"}distance3D(t){const e=this.x-t.x,s=this.y-t.y,n=this.getZ()-t.getZ();return Math.sqrt(e*e+s*s+n*n)}getY(){return this.y}setY(t){this.y=t}distance(t){const e=this.x-t.x,s=this.y-t.y;return Math.sqrt(e*e+s*s)}hashCode(){let t=17;return t=37*t+p.hashCode(this.x),t=37*t+p.hashCode(this.y),t}setCoordinate(t){this.x=t.x,this.y=t.y,this.z=t.getZ()}get interfaces_(){return[r,o,a]}}class m{constructor(){m.constructor_.apply(this,arguments)}static constructor_(){if(this._dimensionsToTest=2,0===arguments.length)m.constructor_.call(this,2);else if(1===arguments.length){const t=arguments[0];if(2!==t&&3!==t)throw new s("only 2 or 3 dimensions may be specified");this._dimensionsToTest=t}}static compare(t,e){return t<e?-1:t>e?1:i.isNaN(t)?i.isNaN(e)?0:-1:i.isNaN(e)?1:0}compare(t,e){const s=m.compare(t.x,e.x);if(0!==s)return s;const n=m.compare(t.y,e.y);if(0!==n)return n;if(this._dimensionsToTest<=2)return 0;return m.compare(t.getZ(),e.getZ())}get interfaces_(){return[l]}}p.DimensionalComparator=m,p.NULL_ORDINATE=i.NaN,p.X=0,p.Y=1,p.Z=2,p.M=3;class f extends p{constructor(){super(),f.constructor_.apply(this,arguments)}static constructor_(){if(0===arguments.length)p.constructor_.call(this);else if(1===arguments.length){if(arguments[0]instanceof f){const t=arguments[0];p.constructor_.call(this,t.x,t.y)}else if(arguments[0]instanceof p){const t=arguments[0];p.constructor_.call(this,t.x,t.y)}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];p.constructor_.call(this,t,e,p.NULL_ORDINATE)}}setOrdinate(t,e){switch(t){case f.X:this.x=e;break;case f.Y:this.y=e;break;default:throw new s("Invalid ordinate index: "+t)}}getZ(){return p.NULL_ORDINATE}getOrdinate(t){switch(t){case f.X:return this.x;case f.Y:return this.y}throw new s("Invalid ordinate index: "+t)}setZ(t){throw new s("CoordinateXY dimension 2 does not support z-ordinate")}copy(){return new f(this)}toString(){return"("+this.x+", "+this.y+")"}setCoordinate(t){this.x=t.x,this.y=t.y,this.z=t.getZ()}}f.X=0,f.Y=1,f.Z=-1,f.M=-1;class y extends p{constructor(){super(),y.constructor_.apply(this,arguments)}static constructor_(){if(this._m=null,0===arguments.length)p.constructor_.call(this),this._m=0;else if(1===arguments.length){if(arguments[0]instanceof y){const t=arguments[0];p.constructor_.call(this,t.x,t.y),this._m=t._m}else if(arguments[0]instanceof p){const t=arguments[0];p.constructor_.call(this,t.x,t.y),this._m=this.getM()}}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];p.constructor_.call(this,t,e,p.NULL_ORDINATE),this._m=s}}getM(){return this._m}setOrdinate(t,e){switch(t){case y.X:this.x=e;break;case y.Y:this.y=e;break;case y.M:this._m=e;break;default:throw new s("Invalid ordinate index: "+t)}}setM(t){this._m=t}getZ(){return p.NULL_ORDINATE}getOrdinate(t){switch(t){case y.X:return this.x;case y.Y:return this.y;case y.M:return this._m}throw new s("Invalid ordinate index: "+t)}setZ(t){throw new s("CoordinateXY dimension 2 does not support z-ordinate")}copy(){return new y(this)}toString(){return"("+this.x+", "+this.y+" m="+this.getM()+")"}setCoordinate(t){this.x=t.x,this.y=t.y,this.z=t.getZ(),this._m=t.getM()}}y.X=0,y.Y=1,y.Z=-1,y.M=2;class x extends p{constructor(){super(),x.constructor_.apply(this,arguments)}static constructor_(){if(this._m=null,0===arguments.length)p.constructor_.call(this),this._m=0;else if(1===arguments.length){if(arguments[0]instanceof x){const t=arguments[0];p.constructor_.call(this,t),this._m=t._m}else if(arguments[0]instanceof p){const t=arguments[0];p.constructor_.call(this,t),this._m=this.getM()}}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];p.constructor_.call(this,t,e,s),this._m=n}}getM(){return this._m}setOrdinate(t,e){switch(t){case p.X:this.x=e;break;case p.Y:this.y=e;break;case p.Z:this.z=e;break;case p.M:this._m=e;break;default:throw new s("Invalid ordinate index: "+t)}}setM(t){this._m=t}getOrdinate(t){switch(t){case p.X:return this.x;case p.Y:return this.y;case p.Z:return this.getZ();case p.M:return this.getM()}throw new s("Invalid ordinate index: "+t)}copy(){return new x(this)}toString(){return"("+this.x+", "+this.y+", "+this.getZ()+" m="+this.getM()+")"}setCoordinate(t){this.x=t.x,this.y=t.y,this.z=t.getZ(),this._m=t.getM()}}function E(t,e){return t.interfaces_&&t.interfaces_.indexOf(e)>-1}class I{add(){}addAll(){}isEmpty(){}iterator(){}size(){}toArray(){}remove(){}}class N extends e{constructor(t){super(t),this.name=Object.keys({IndexOutOfBoundsException:N})[0]}}class C extends I{get(){}set(){}isEmpty(){}}class w extends e{constructor(t){super(t),this.name=Object.keys({NoSuchElementException:w})[0]}}class S extends C{constructor(t){super(),this.array=[],t instanceof I&&this.addAll(t)}get interfaces_(){return[C,I]}ensureCapacity(){}add(t){return 1===arguments.length?this.array.push(t):this.array.splice(arguments[0],0,arguments[1]),!0}clear(){this.array=[]}addAll(t){for(const e of t)this.array.push(e)}set(t,e){const s=this.array[t];return this.array[t]=e,s}iterator(){return new L(this)}get(t){if(t<0||t>=this.size())throw new N;return this.array[t]}isEmpty(){return 0===this.array.length}sort(t){t?this.array.sort(((e,s)=>t.compare(e,s))):this.array.sort()}size(){return this.array.length}toArray(){return this.array.slice()}remove(t){for(let e=0,s=this.array.length;e<s;e++)if(this.array[e]===t)return!!this.array.splice(e,1);return!1}[Symbol.iterator](){return this.array.values()}}class L{constructor(t){this.arrayList=t,this.position=0}next(){if(this.position===this.arrayList.size())throw new w;return this.arrayList.get(this.position++)}hasNext(){return this.position<this.arrayList.size()}set(t){return this.arrayList.set(this.position-1,t)}remove(){this.arrayList.remove(this.arrayList.get(this.position))}}class T extends S{constructor(){super(),T.constructor_.apply(this,arguments)}static constructor_(){if(0===arguments.length);else if(1===arguments.length){const t=arguments[0];this.ensureCapacity(t.length),this.add(t,!0)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.ensureCapacity(t.length),this.add(t,e)}}getCoordinate(t){return this.get(t)}addAll(){if(2===arguments.length&&"boolean"==typeof arguments[1]&&E(arguments[0],I)){const t=arguments[1];let e=!1;for(let s=arguments[0].iterator();s.hasNext();)this.add(s.next(),t),e=!0;return e}return super.addAll.apply(this,arguments)}clone(){const t=super.clone.call(this);for(let e=0;e<this.size();e++)t.add(e,this.get(e).clone());return t}toCoordinateArray(){if(0===arguments.length)return this.toArray(T.coordArrayType);if(1===arguments.length){if(arguments[0])return this.toArray(T.coordArrayType);const t=this.size(),e=new Array(t).fill(null);for(let s=0;s<t;s++)e[s]=this.get(t-s-1);return e}}add(){if(1===arguments.length){const t=arguments[0];return super.add.call(this,t)}if(2===arguments.length){if(arguments[0]instanceof Array&&"boolean"==typeof arguments[1]){const t=arguments[0],e=arguments[1];return this.add(t,e,!0),!0}if(arguments[0]instanceof p&&"boolean"==typeof arguments[1]){const t=arguments[0];if(!arguments[1]&&this.size()>=1){if(this.get(this.size()-1).equals2D(t))return null}super.add.call(this,t)}else if(arguments[0]instanceof Object&&"boolean"==typeof arguments[1]){const t=arguments[0],e=arguments[1];return this.add(t,e),!0}}else if(3===arguments.length){if("boolean"==typeof arguments[2]&&arguments[0]instanceof Array&&"boolean"==typeof arguments[1]){const t=arguments[0],e=arguments[1];if(arguments[2])for(let s=0;s<t.length;s++)this.add(t[s],e);else for(let s=t.length-1;s>=0;s--)this.add(t[s],e);return!0}if("boolean"==typeof arguments[2]&&Number.isInteger(arguments[0])&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1];if(!arguments[2]){const s=this.size();if(s>0){if(t>0){if(this.get(t-1).equals2D(e))return null}if(t<s){if(this.get(t).equals2D(e))return null}}}super.add.call(this,t,e)}}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];let i=1;s>n&&(i=-1);for(let r=s;r!==n;r+=i)this.add(t[r],e);return!0}}closeRing(){if(this.size()>0){const t=this.get(0).copy();this.add(t,!1)}}}T.coordArrayType=new Array(0).fill(null);class R{filter(t,e){}isDone(){}isGeometryChanged(){}}class P{constructor(){P.constructor_.apply(this,arguments)}static constructor_(){if(this._minx=null,this._maxx=null,this._miny=null,this._maxy=null,0===arguments.length)this.init();else if(1===arguments.length){if(arguments[0]instanceof p){const t=arguments[0];this.init(t.x,t.x,t.y,t.y)}else if(arguments[0]instanceof P){const t=arguments[0];this.init(t)}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.init(t.x,e.x,t.y,e.y)}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];this.init(t,e,s,n)}}static intersects(){if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];return s.x>=(t.x<e.x?t.x:e.x)&&s.x<=(t.x>e.x?t.x:e.x)&&s.y>=(t.y<e.y?t.y:e.y)&&s.y<=(t.y>e.y?t.y:e.y)}if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];let i=Math.min(s.x,n.x),r=Math.max(s.x,n.x),o=Math.min(t.x,e.x),l=Math.max(t.x,e.x);return!(o>r)&&(!(l<i)&&(i=Math.min(s.y,n.y),r=Math.max(s.y,n.y),o=Math.min(t.y,e.y),l=Math.max(t.y,e.y),!(o>r)&&!(l<i)))}}getArea(){return this.getWidth()*this.getHeight()}equals(t){if(!(t instanceof P))return!1;const e=t;return this.isNull()?e.isNull():this._maxx===e.getMaxX()&&this._maxy===e.getMaxY()&&this._minx===e.getMinX()&&this._miny===e.getMinY()}intersection(t){if(this.isNull()||t.isNull()||!this.intersects(t))return new P;const e=this._minx>t._minx?this._minx:t._minx,s=this._miny>t._miny?this._miny:t._miny,n=this._maxx<t._maxx?this._maxx:t._maxx,i=this._maxy<t._maxy?this._maxy:t._maxy;return new P(e,n,s,i)}isNull(){return this._maxx<this._minx}getMaxX(){return this._maxx}covers(){if(1===arguments.length){if(arguments[0]instanceof p){const t=arguments[0];return this.covers(t.x,t.y)}if(arguments[0]instanceof P){const t=arguments[0];return!this.isNull()&&!t.isNull()&&(t.getMinX()>=this._minx&&t.getMaxX()<=this._maxx&&t.getMinY()>=this._miny&&t.getMaxY()<=this._maxy)}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];return!this.isNull()&&(t>=this._minx&&t<=this._maxx&&e>=this._miny&&e<=this._maxy)}}intersects(){if(1===arguments.length){if(arguments[0]instanceof P){const t=arguments[0];return!this.isNull()&&!t.isNull()&&!(t._minx>this._maxx||t._maxx<this._minx||t._miny>this._maxy||t._maxy<this._miny)}if(arguments[0]instanceof p){const t=arguments[0];return this.intersects(t.x,t.y)}}else if(2===arguments.length){if(arguments[0]instanceof p&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1];if(this.isNull())return!1;if((t.x<e.x?t.x:e.x)>this._maxx)return!1;if((t.x>e.x?t.x:e.x)<this._minx)return!1;if((t.y<e.y?t.y:e.y)>this._maxy)return!1;return!((t.y>e.y?t.y:e.y)<this._miny)}if("number"==typeof arguments[0]&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1];return!this.isNull()&&!(t>this._maxx||t<this._minx||e>this._maxy||e<this._miny)}}}getMinY(){return this._miny}getDiameter(){if(this.isNull())return 0;const t=this.getWidth(),e=this.getHeight();return Math.sqrt(t*t+e*e)}getMinX(){return this._minx}expandToInclude(){if(1===arguments.length){if(arguments[0]instanceof p){const t=arguments[0];this.expandToInclude(t.x,t.y)}else if(arguments[0]instanceof P){const t=arguments[0];if(t.isNull())return null;this.isNull()?(this._minx=t.getMinX(),this._maxx=t.getMaxX(),this._miny=t.getMinY(),this._maxy=t.getMaxY()):(t._minx<this._minx&&(this._minx=t._minx),t._maxx>this._maxx&&(this._maxx=t._maxx),t._miny<this._miny&&(this._miny=t._miny),t._maxy>this._maxy&&(this._maxy=t._maxy))}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.isNull()?(this._minx=t,this._maxx=t,this._miny=e,this._maxy=e):(t<this._minx&&(this._minx=t),t>this._maxx&&(this._maxx=t),e<this._miny&&(this._miny=e),e>this._maxy&&(this._maxy=e))}}minExtent(){if(this.isNull())return 0;const t=this.getWidth(),e=this.getHeight();return t<e?t:e}getWidth(){return this.isNull()?0:this._maxx-this._minx}compareTo(t){const e=t;return this.isNull()?e.isNull()?0:-1:e.isNull()?1:this._minx<e._minx?-1:this._minx>e._minx?1:this._miny<e._miny?-1:this._miny>e._miny?1:this._maxx<e._maxx?-1:this._maxx>e._maxx?1:this._maxy<e._maxy?-1:this._maxy>e._maxy?1:0}translate(t,e){if(this.isNull())return null;this.init(this.getMinX()+t,this.getMaxX()+t,this.getMinY()+e,this.getMaxY()+e)}copy(){return new P(this)}toString(){return"Env["+this._minx+" : "+this._maxx+", "+this._miny+" : "+this._maxy+"]"}setToNull(){this._minx=0,this._maxx=-1,this._miny=0,this._maxy=-1}disjoint(t){return!(!this.isNull()&&!t.isNull())||(t._minx>this._maxx||t._maxx<this._minx||t._miny>this._maxy||t._maxy<this._miny)}getHeight(){return this.isNull()?0:this._maxy-this._miny}maxExtent(){if(this.isNull())return 0;const t=this.getWidth(),e=this.getHeight();return t>e?t:e}expandBy(){if(1===arguments.length){const t=arguments[0];this.expandBy(t,t)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];if(this.isNull())return null;this._minx-=t,this._maxx+=t,this._miny-=e,this._maxy+=e,(this._minx>this._maxx||this._miny>this._maxy)&&this.setToNull()}}contains(){if(1===arguments.length){if(arguments[0]instanceof P){const t=arguments[0];return this.covers(t)}if(arguments[0]instanceof p){const t=arguments[0];return this.covers(t)}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];return this.covers(t,e)}}centre(){return this.isNull()?null:new p((this.getMinX()+this.getMaxX())/2,(this.getMinY()+this.getMaxY())/2)}init(){if(0===arguments.length)this.setToNull();else if(1===arguments.length){if(arguments[0]instanceof p){const t=arguments[0];this.init(t.x,t.x,t.y,t.y)}else if(arguments[0]instanceof P){const t=arguments[0];this._minx=t._minx,this._maxx=t._maxx,this._miny=t._miny,this._maxy=t._maxy}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.init(t.x,e.x,t.y,e.y)}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];t<e?(this._minx=t,this._maxx=e):(this._minx=e,this._maxx=t),s<n?(this._miny=s,this._maxy=n):(this._miny=n,this._maxy=s)}}getMaxY(){return this._maxy}distance(t){if(this.intersects(t))return 0;let e=0;this._maxx<t._minx?e=t._minx-this._maxx:this._minx>t._maxx&&(e=this._minx-t._maxx);let s=0;return this._maxy<t._miny?s=t._miny-this._maxy:this._miny>t._maxy&&(s=this._miny-t._maxy),0===e?s:0===s?e:Math.sqrt(e*e+s*s)}hashCode(){let t=17;return t=37*t+p.hashCode(this._minx),t=37*t+p.hashCode(this._maxx),t=37*t+p.hashCode(this._miny),t=37*t+p.hashCode(this._maxy),t}get interfaces_(){return[r,a]}}class O{constructor(t){this.str=t}append(t){this.str+=t}setCharAt(t,e){this.str=this.str.substr(0,t)+e+this.str.substr(t+1)}toString(){return this.str}}class v{constructor(t){this.value=t}intValue(){return this.value}compareTo(t){return this.value<t?-1:this.value>t?1:0}static compare(t,e){return t<e?-1:t>e?1:0}static isNan(t){return Number.isNaN(t)}static valueOf(t){return new v(t)}}class M{static isWhitespace(t){return t<=32&&t>=0||127===t}static toUpperCase(t){return t.toUpperCase()}}class b{constructor(){b.constructor_.apply(this,arguments)}static constructor_(){if(this._hi=0,this._lo=0,0===arguments.length)this.init(0);else if(1===arguments.length){if("number"==typeof arguments[0]){const t=arguments[0];this.init(t)}else if(arguments[0]instanceof b){const t=arguments[0];this.init(t)}else if("string"==typeof arguments[0]){const t=arguments[0];b.constructor_.call(this,b.parse(t))}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.init(t,e)}}static determinant(){if("number"==typeof arguments[3]&&"number"==typeof arguments[2]&&"number"==typeof arguments[0]&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];return b.determinant(b.valueOf(t),b.valueOf(e),b.valueOf(s),b.valueOf(n))}if(arguments[3]instanceof b&&arguments[2]instanceof b&&arguments[0]instanceof b&&arguments[1]instanceof b){const t=arguments[1],e=arguments[2],s=arguments[3];return arguments[0].multiply(s).selfSubtract(t.multiply(e))}}static sqr(t){return b.valueOf(t).selfMultiply(t)}static valueOf(){if("string"==typeof arguments[0]){const t=arguments[0];return b.parse(t)}if("number"==typeof arguments[0]){return new b(arguments[0])}}static sqrt(t){return b.valueOf(t).sqrt()}static parse(t){let e=0;const s=t.length;for(;M.isWhitespace(t.charAt(e));)e++;let n=!1;if(e<s){const s=t.charAt(e);"-"!==s&&"+"!==s||(e++,"-"===s&&(n=!0))}const i=new b;let r=0,o=0,l=0,a=!1;for(;!(e>=s);){const s=t.charAt(e);if(e++,M.isDigit(s)){const t=s-"0";i.selfMultiply(b.TEN),i.selfAdd(t),r++}else{if("."!==s){if("e"===s||"E"===s){const s=t.substring(e);try{l=v.parseInt(s)}catch(e){throw e instanceof NumberFormatException?new NumberFormatException("Invalid exponent "+s+" in string "+t):e}break}throw new NumberFormatException("Unexpected character '"+s+"' at position "+e+" in string "+t)}o=r,a=!0}}let c=i;a||(o=r);const h=r-o-l;if(0===h)c=i;else if(h>0){const t=b.TEN.pow(h);c=i.divide(t)}else if(h<0){const t=b.TEN.pow(-h);c=i.multiply(t)}return n?c.negate():c}static createNaN(){return new b(i.NaN,i.NaN)}static copy(t){return new b(t)}static magnitude(t){const e=Math.abs(t),s=Math.log(e)/Math.log(10);let n=Math.trunc(Math.floor(s));return 10*Math.pow(10,n)<=e&&(n+=1),n}static stringOfChar(t,e){const s=new O;for(let n=0;n<e;n++)s.append(t);return s.toString()}le(t){return this._hi<t._hi||this._hi===t._hi&&this._lo<=t._lo}extractSignificantDigits(t,e){let s=this.abs(),n=b.magnitude(s._hi);const i=b.TEN.pow(n);s=s.divide(i),s.gt(b.TEN)?(s=s.divide(b.TEN),n+=1):s.lt(b.ONE)&&(s=s.multiply(b.TEN),n-=1);const r=n+1,o=new O,l=b.MAX_PRINT_DIGITS-1;for(let e=0;e<=l;e++){t&&e===r&&o.append(".");const n=Math.trunc(s._hi);if(n<0)break;let i=!1,a=0;n>9?(i=!0,a="9"):a="0"+n,o.append(a),s=s.subtract(b.valueOf(n)).multiply(b.TEN),i&&s.selfAdd(b.TEN);let c=!0;const h=b.magnitude(s._hi);if(h<0&&Math.abs(h)>=l-e&&(c=!1),!c)break}return e[0]=n,o.toString()}sqr(){return this.multiply(this)}doubleValue(){return this._hi+this._lo}subtract(){if(arguments[0]instanceof b){const t=arguments[0];return this.add(t.negate())}if("number"==typeof arguments[0]){const t=arguments[0];return this.add(-t)}}equals(){if(1===arguments.length&&arguments[0]instanceof b){const t=arguments[0];return this._hi===t._hi&&this._lo===t._lo}}isZero(){return 0===this._hi&&0===this._lo}selfSubtract(){if(arguments[0]instanceof b){const t=arguments[0];return this.isNaN()?this:this.selfAdd(-t._hi,-t._lo)}if("number"==typeof arguments[0]){const t=arguments[0];return this.isNaN()?this:this.selfAdd(-t,0)}}getSpecialNumberString(){return this.isZero()?"0.0":this.isNaN()?"NaN ":null}min(t){return this.le(t)?this:t}selfDivide(){if(1===arguments.length){if(arguments[0]instanceof b){const t=arguments[0];return this.selfDivide(t._hi,t._lo)}if("number"==typeof arguments[0]){const t=arguments[0];return this.selfDivide(t,0)}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];let s=null,n=null,i=null,r=null,o=null,l=null,a=null,c=null;return o=this._hi/t,l=b.SPLIT*o,s=l-o,c=b.SPLIT*t,s=l-s,n=o-s,i=c-t,a=o*t,i=c-i,r=t-i,c=s*i-a+s*r+n*i+n*r,l=(this._hi-a-c+this._lo-o*e)/t,c=o+l,this._hi=c,this._lo=o-c+l,this}}dump(){return"DD<"+this._hi+", "+this._lo+">"}divide(){if(arguments[0]instanceof b){const t=arguments[0];let e=null,s=null,n=null,i=null,r=null,o=null,l=null,a=null;r=this._hi/t._hi,o=b.SPLIT*r,e=o-r,a=b.SPLIT*t._hi,e=o-e,s=r-e,n=a-t._hi,l=r*t._hi,n=a-n,i=t._hi-n,a=e*n-l+e*i+s*n+s*i,o=(this._hi-l-a+this._lo-r*t._lo)/t._hi,a=r+o;return new b(a,r-a+o)}if("number"==typeof arguments[0]){const t=arguments[0];return i.isNaN(t)?b.createNaN():b.copy(this).selfDivide(t,0)}}ge(t){return this._hi>t._hi||this._hi===t._hi&&this._lo>=t._lo}pow(t){if(0===t)return b.valueOf(1);let e=new b(this),s=b.valueOf(1),n=Math.abs(t);if(n>1)for(;n>0;)n%2==1&&s.selfMultiply(e),n/=2,n>0&&(e=e.sqr());else s=e;return t<0?s.reciprocal():s}ceil(){if(this.isNaN())return b.NaN;const t=Math.ceil(this._hi);let e=0;return t===this._hi&&(e=Math.ceil(this._lo)),new b(t,e)}compareTo(t){const e=t;return this._hi<e._hi?-1:this._hi>e._hi?1:this._lo<e._lo?-1:this._lo>e._lo?1:0}rint(){if(this.isNaN())return this;return this.add(.5).floor()}setValue(){if(arguments[0]instanceof b){const t=arguments[0];return this.init(t),this}if("number"==typeof arguments[0]){const t=arguments[0];return this.init(t),this}}max(t){return this.ge(t)?this:t}sqrt(){if(this.isZero())return b.valueOf(0);if(this.isNegative())return b.NaN;const t=1/Math.sqrt(this._hi),e=this._hi*t,s=b.valueOf(e),n=this.subtract(s.sqr())._hi*(.5*t);return s.add(n)}selfAdd(){if(1===arguments.length){if(arguments[0]instanceof b){const t=arguments[0];return this.selfAdd(t._hi,t._lo)}if("number"==typeof arguments[0]){const t=arguments[0];let e=null,s=null,n=null,i=null,r=null,o=null;return n=this._hi+t,r=n-this._hi,i=n-r,i=t-r+(this._hi-i),o=i+this._lo,e=n+o,s=o+(n-e),this._hi=e+s,this._lo=s+(e-this._hi),this}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];let s=null,n=null,i=null,r=null,o=null,l=null,a=null,c=null;o=this._hi+t,i=this._lo+e,a=o-this._hi,c=i-this._lo,l=o-a,r=i-c,l=t-a+(this._hi-l),r=e-c+(this._lo-r),a=l+i,s=o+a,n=a+(o-s),a=r+n;const h=s+a,u=a+(s-h);return this._hi=h,this._lo=u,this}}selfMultiply(){if(1===arguments.length){if(arguments[0]instanceof b){const t=arguments[0];return this.selfMultiply(t._hi,t._lo)}if("number"==typeof arguments[0]){const t=arguments[0];return this.selfMultiply(t,0)}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];let s=null,n=null,i=null,r=null,o=null,l=null;o=b.SPLIT*this._hi,s=o-this._hi,l=b.SPLIT*t,s=o-s,n=this._hi-s,i=l-t,o=this._hi*t,i=l-i,r=t-i,l=s*i-o+s*r+n*i+n*r+(this._hi*e+this._lo*t);const a=o+l;s=o-a;const c=l+s;return this._hi=a,this._lo=c,this}}selfSqr(){return this.selfMultiply(this)}floor(){if(this.isNaN())return b.NaN;const t=Math.floor(this._hi);let e=0;return t===this._hi&&(e=Math.floor(this._lo)),new b(t,e)}negate(){return this.isNaN()?this:new b(-this._hi,-this._lo)}clone(){try{return null}catch(t){if(t instanceof CloneNotSupportedException)return null;throw t}}multiply(){if(arguments[0]instanceof b){const t=arguments[0];return t.isNaN()?b.createNaN():b.copy(this).selfMultiply(t)}if("number"==typeof arguments[0]){const t=arguments[0];return i.isNaN(t)?b.createNaN():b.copy(this).selfMultiply(t,0)}}isNaN(){return i.isNaN(this._hi)}intValue(){return Math.trunc(this._hi)}toString(){const t=b.magnitude(this._hi);return t>=-3&&t<=20?this.toStandardNotation():this.toSciNotation()}toStandardNotation(){const t=this.getSpecialNumberString();if(null!==t)return t;const e=new Array(1).fill(null),s=this.extractSignificantDigits(!0,e),n=e[0]+1;let i=s;if("."===s.charAt(0))i="0"+s;else if(n<0)i="0."+b.stringOfChar("0",-n)+s;else if(-1===s.indexOf(".")){const t=n-s.length;i=s+b.stringOfChar("0",t)+".0"}return this.isNegative()?"-"+i:i}reciprocal(){let t=null,e=null,s=null,n=null,i=null,r=null,o=null,l=null;i=1/this._hi,r=b.SPLIT*i,t=r-i,l=b.SPLIT*this._hi,t=r-t,e=i-t,s=l-this._hi,o=i*this._hi,s=l-s,n=this._hi-s,l=t*s-o+t*n+e*s+e*n,r=(1-o-l-i*this._lo)/this._hi;const a=i+r;return new b(a,i-a+r)}toSciNotation(){if(this.isZero())return b.SCI_NOT_ZERO;const t=this.getSpecialNumberString();if(null!==t)return t;const e=new Array(1).fill(null),s=this.extractSignificantDigits(!1,e),n=b.SCI_NOT_EXPONENT_CHAR+e[0];if("0"===s.charAt(0))throw new IllegalStateException("Found leading zero: "+s);let i="";s.length>1&&(i=s.substring(1));const r=s.charAt(0)+"."+i;return this.isNegative()?"-"+r+n:r+n}abs(){return this.isNaN()?b.NaN:this.isNegative()?this.negate():new b(this)}isPositive(){return this._hi>0||0===this._hi&&this._lo>0}lt(t){return this._hi<t._hi||this._hi===t._hi&&this._lo<t._lo}add(){if(arguments[0]instanceof b){const t=arguments[0];return b.copy(this).selfAdd(t)}if("number"==typeof arguments[0]){const t=arguments[0];return b.copy(this).selfAdd(t)}}init(){if(1===arguments.length){if("number"==typeof arguments[0]){const t=arguments[0];this._hi=t,this._lo=0}else if(arguments[0]instanceof b){const t=arguments[0];this._hi=t._hi,this._lo=t._lo}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._hi=t,this._lo=e}}gt(t){return this._hi>t._hi||this._hi===t._hi&&this._lo>t._lo}isNegative(){return this._hi<0||0===this._hi&&this._lo<0}trunc(){return this.isNaN()?b.NaN:this.isPositive()?this.floor():this.ceil()}signum(){return this._hi>0?1:this._hi<0?-1:this._lo>0?1:this._lo<0?-1:0}get interfaces_(){return[a,r,o]}}b.PI=new b(3.141592653589793,12246467991473532e-32),b.TWO_PI=new b(6.283185307179586,24492935982947064e-32),b.PI_2=new b(1.5707963267948966,6123233995736766e-32),b.E=new b(2.718281828459045,14456468917292502e-32),b.NaN=new b(i.NaN,i.NaN),b.EPS=123259516440783e-46,b.SPLIT=134217729,b.MAX_PRINT_DIGITS=32,b.TEN=b.valueOf(10),b.ONE=b.valueOf(1),b.SCI_NOT_EXPONENT_CHAR="E",b.SCI_NOT_ZERO="0.0E0";class D{static orientationIndex(t,e,s){const n=D.orientationIndexFilter(t,e,s);if(n<=1)return n;const i=b.valueOf(e.x).selfAdd(-t.x),r=b.valueOf(e.y).selfAdd(-t.y),o=b.valueOf(s.x).selfAdd(-e.x),l=b.valueOf(s.y).selfAdd(-e.y);return i.selfMultiply(l).selfSubtract(r.selfMultiply(o)).signum()}static signOfDet2x2(){if(arguments[3]instanceof b&&arguments[2]instanceof b&&arguments[0]instanceof b&&arguments[1]instanceof b){const t=arguments[1],e=arguments[2],s=arguments[3];return arguments[0].multiply(s).selfSubtract(t.multiply(e)).signum()}if("number"==typeof arguments[3]&&"number"==typeof arguments[2]&&"number"==typeof arguments[0]&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=b.valueOf(t),r=b.valueOf(e),o=b.valueOf(s),l=b.valueOf(n);return i.multiply(l).selfSubtract(r.multiply(o)).signum()}}static intersection(t,e,s,n){const r=new b(t.y).selfSubtract(e.y),o=new b(e.x).selfSubtract(t.x),l=new b(t.x).selfMultiply(e.y).selfSubtract(new b(e.x).selfMultiply(t.y)),a=new b(s.y).selfSubtract(n.y),c=new b(n.x).selfSubtract(s.x),h=new b(s.x).selfMultiply(n.y).selfSubtract(new b(n.x).selfMultiply(s.y)),u=o.multiply(h).selfSubtract(c.multiply(l)),g=a.multiply(l).selfSubtract(r.multiply(h)),d=r.multiply(c).selfSubtract(a.multiply(o)),_=u.selfDivide(d).doubleValue(),m=g.selfDivide(d).doubleValue();return i.isNaN(_)||i.isInfinite(_)||i.isNaN(m)||i.isInfinite(m)?null:new p(_,m)}static orientationIndexFilter(t,e,s){let n=null;const i=(t.x-s.x)*(e.y-s.y),r=(t.y-s.y)*(e.x-s.x),o=i-r;if(i>0){if(r<=0)return D.signum(o);n=i+r}else{if(!(i<0))return D.signum(o);if(r>=0)return D.signum(o);n=-i-r}const l=D.DP_SAFE_EPSILON*n;return o>=l||-o>=l?D.signum(o):2}static signum(t){return t>0?1:t<0?-1:0}}D.DP_SAFE_EPSILON=1e-15;class A{getM(t){if(this.hasM()){const e=this.getDimension()-this.getMeasures();return this.getOrdinate(t,e)}return i.NaN}setOrdinate(t,e,s){}getZ(t){return this.hasZ()?this.getOrdinate(t,2):i.NaN}size(){}getOrdinate(t,e){}getCoordinate(){}getCoordinateCopy(t){}createCoordinate(){}getDimension(){}hasM(){return this.getMeasures()>0}getX(t){}hasZ(){return this.getDimension()-this.getMeasures()>2}getMeasures(){return 0}expandEnvelope(t){}copy(){}getY(t){}toCoordinateArray(){}get interfaces_(){return[o]}}A.X=0,A.Y=1,A.Z=2,A.M=3;class F{static index(t,e,s){return D.orientationIndex(t,e,s)}static isCCW(){if(arguments[0]instanceof Array){const t=arguments[0],e=t.length-1;if(e<3)throw new s("Ring has fewer than 4 points, so orientation cannot be determined");let n=t[0],i=0;for(let s=1;s<=e;s++){const e=t[s];e.y>n.y&&(n=e,i=s)}let r=i;do{r-=1,r<0&&(r=e)}while(t[r].equals2D(n)&&r!==i);let o=i;do{o=(o+1)%e}while(t[o].equals2D(n)&&o!==i);const l=t[r],a=t[o];if(l.equals2D(n)||a.equals2D(n)||l.equals2D(a))return!1;const c=F.index(l,n,a);let h=null;return h=0===c?l.x>a.x:c>0,h}if(E(arguments[0],A)){const t=arguments[0],e=t.size()-1;if(e<3)throw new s("Ring has fewer than 4 points, so orientation cannot be determined");let n=t.getCoordinate(0),i=0;for(let s=1;s<=e;s++){const e=t.getCoordinate(s);e.y>n.y&&(n=e,i=s)}let r=null,o=i;do{o-=1,o<0&&(o=e),r=t.getCoordinate(o)}while(r.equals2D(n)&&o!==i);let l=null,a=i;do{a=(a+1)%e,l=t.getCoordinate(a)}while(l.equals2D(n)&&a!==i);if(r.equals2D(n)||l.equals2D(n)||r.equals2D(l))return!1;const c=F.index(r,n,l);let h=null;return h=0===c?r.x>l.x:c>0,h}}}F.CLOCKWISE=-1,F.RIGHT=F.CLOCKWISE,F.COUNTERCLOCKWISE=1,F.LEFT=F.COUNTERCLOCKWISE,F.COLLINEAR=0,F.STRAIGHT=F.COLLINEAR;class G{static intersection(t,e,s,n){const r=t.x<e.x?t.x:e.x,o=t.y<e.y?t.y:e.y,l=t.x>e.x?t.x:e.x,a=t.y>e.y?t.y:e.y,c=s.x<n.x?s.x:n.x,h=s.y<n.y?s.y:n.y,u=s.x>n.x?s.x:n.x,g=s.y>n.y?s.y:n.y,d=((r>c?r:c)+(l<u?l:u))/2,_=((o>h?o:h)+(a<g?a:g))/2,m=t.x-d,f=t.y-_,y=e.x-d,x=e.y-_,E=s.x-d,I=s.y-_,N=n.x-d,C=n.y-_,w=f-x,S=y-m,L=m*x-y*f,T=I-C,R=N-E,P=E*C-N*I,O=w*R-T*S,v=(S*P-R*L)/O,M=(T*L-w*P)/O;return i.isNaN(v)||i.isInfinite(v)||i.isNaN(M)||i.isInfinite(M)?null:new p(v+d,M+_)}}class q{static arraycopy(t,e,s,n,i){let r=0;for(let o=e;o<e+i;o++)s[n+r]=t[o],r++}static getProperty(t){return{"line.separator":"\n"}[t]}}class B{static log10(t){const e=Math.log(t);return i.isInfinite(e)||i.isNaN(e)?e:e/B.LOG_10}static min(t,e,s,n){let i=t;return e<i&&(i=e),s<i&&(i=s),n<i&&(i=n),i}static clamp(){if("number"==typeof arguments[2]&&"number"==typeof arguments[0]&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1],s=arguments[2];return t<e?e:t>s?s:t}if(Number.isInteger(arguments[2])&&Number.isInteger(arguments[0])&&Number.isInteger(arguments[1])){const t=arguments[0],e=arguments[1],s=arguments[2];return t<e?e:t>s?s:t}}static wrap(t,e){return t<0?e- -t%e:t%e}static max(){if(3===arguments.length){const t=arguments[1],e=arguments[2];let s=arguments[0];return t>s&&(s=t),e>s&&(s=e),s}if(4===arguments.length){const t=arguments[1],e=arguments[2],s=arguments[3];let n=arguments[0];return t>n&&(n=t),e>n&&(n=e),s>n&&(n=s),n}}static average(t,e){return(t+e)/2}}B.LOG_10=Math.log(10);class Y{static segmentToSegment(t,e,s,n){if(t.equals(e))return Y.pointToSegment(t,s,n);if(s.equals(n))return Y.pointToSegment(n,t,e);let i=!1;if(P.intersects(t,e,s,n)){const r=(e.x-t.x)*(n.y-s.y)-(e.y-t.y)*(n.x-s.x);if(0===r)i=!0;else{const o=(t.y-s.y)*(n.x-s.x)-(t.x-s.x)*(n.y-s.y),l=((t.y-s.y)*(e.x-t.x)-(t.x-s.x)*(e.y-t.y))/r,a=o/r;(a<0||a>1||l<0||l>1)&&(i=!0)}}else i=!0;return i?B.min(Y.pointToSegment(t,s,n),Y.pointToSegment(e,s,n),Y.pointToSegment(s,t,e),Y.pointToSegment(n,t,e)):0}static pointToSegment(t,e,s){if(e.x===s.x&&e.y===s.y)return t.distance(e);const n=(s.x-e.x)*(s.x-e.x)+(s.y-e.y)*(s.y-e.y),i=((t.x-e.x)*(s.x-e.x)+(t.y-e.y)*(s.y-e.y))/n;if(i<=0)return t.distance(e);if(i>=1)return t.distance(s);const r=((e.y-t.y)*(s.x-e.x)-(e.x-t.x)*(s.y-e.y))/n;return Math.abs(r)*Math.sqrt(n)}static pointToLinePerpendicular(t,e,s){const n=(s.x-e.x)*(s.x-e.x)+(s.y-e.y)*(s.y-e.y),i=((e.y-t.y)*(s.x-e.x)-(e.x-t.x)*(s.y-e.y))/n;return Math.abs(i)*Math.sqrt(n)}static pointToSegmentString(t,e){if(0===e.length)throw new s("Line array must contain at least one vertex");let n=t.distance(e[0]);for(let s=0;s<e.length-1;s++){const i=Y.pointToSegment(t,e[s],e[s+1]);i<n&&(n=i)}return n}}class V{create(){if(1===arguments.length)arguments[0]instanceof Array||E(arguments[0],A);else if(2===arguments.length);else if(3===arguments.length){const t=arguments[0],e=arguments[1];return this.create(t,e)}}}class z{filter(t){}}class X{constructor(){X.constructor_.apply(this,arguments)}isGeometryCollection(){return this.getTypeCode()===X.TYPECODE_GEOMETRYCOLLECTION}getFactory(){return this._factory}getGeometryN(t){return this}getArea(){return 0}isRectangle(){return!1}equalsExact(t){return this===t||this.equalsExact(t,0)}geometryChanged(){this.apply(X.geometryChangedFilter)}geometryChangedAction(){this._envelope=null}equalsNorm(t){return null!==t&&this.norm().equalsExact(t.norm())}getLength(){return 0}getNumGeometries(){return 1}compareTo(){let t;if(1===arguments.length){const e=arguments[0];return t=e,this.getTypeCode()!==t.getTypeCode()?this.getTypeCode()-t.getTypeCode():this.isEmpty()&&t.isEmpty()?0:this.isEmpty()?-1:t.isEmpty()?1:this.compareToSameClass(e)}if(2===arguments.length){const e=arguments[0],s=arguments[1];return t=e,this.getTypeCode()!==t.getTypeCode()?this.getTypeCode()-t.getTypeCode():this.isEmpty()&&t.isEmpty()?0:this.isEmpty()?-1:t.isEmpty()?1:this.compareToSameClass(e,s)}}getUserData(){return this._userData}getSRID(){return this._SRID}getEnvelope(){return this.getFactory().toGeometry(this.getEnvelopeInternal())}checkNotGeometryCollection(t){if(t.getTypeCode()===X.TYPECODE_GEOMETRYCOLLECTION)throw new s("This method does not support GeometryCollection arguments")}equal(t,e,s){return 0===s?t.equals(e):t.distance(e)<=s}norm(){const t=this.copy();return t.normalize(),t}reverse(){const t=this.reverseInternal();return null!=this.envelope&&(t.envelope=this.envelope.copy()),t.setSRID(this.getSRID()),t}copy(){const t=this.copyInternal();return t.envelope=null==this._envelope?null:this._envelope.copy(),t._SRID=this._SRID,t._userData=this._userData,t}getPrecisionModel(){return this._factory.getPrecisionModel()}getEnvelopeInternal(){return null===this._envelope&&(this._envelope=this.computeEnvelopeInternal()),new P(this._envelope)}setSRID(t){this._SRID=t}setUserData(t){this._userData=t}compare(t,e){const s=t.iterator(),n=e.iterator();for(;s.hasNext()&&n.hasNext();){const t=s.next(),e=n.next(),i=t.compareTo(e);if(0!==i)return i}return s.hasNext()?1:n.hasNext()?-1:0}hashCode(){return this.getEnvelopeInternal().hashCode()}isEquivalentClass(t){return this.getClass()===t.getClass()}isGeometryCollectionOrDerived(){return this.getTypeCode()===X.TYPECODE_GEOMETRYCOLLECTION||this.getTypeCode()===X.TYPECODE_MULTIPOINT||this.getTypeCode()===X.TYPECODE_MULTILINESTRING||this.getTypeCode()===X.TYPECODE_MULTIPOLYGON}get interfaces_(){return[o,r,a]}getClass(){return X}static hasNonEmptyElements(t){for(let e=0;e<t.length;e++)if(!t[e].isEmpty())return!0;return!1}static hasNullElements(t){for(let e=0;e<t.length;e++)if(null===t[e])return!0;return!1}}X.constructor_=function(t){t&&(this._envelope=null,this._userData=null,this._factory=t,this._SRID=t.getSRID())},X.TYPECODE_POINT=0,X.TYPECODE_MULTIPOINT=1,X.TYPECODE_LINESTRING=2,X.TYPECODE_LINEARRING=3,X.TYPECODE_MULTILINESTRING=4,X.TYPECODE_POLYGON=5,X.TYPECODE_MULTIPOLYGON=6,X.TYPECODE_GEOMETRYCOLLECTION=7,X.TYPENAME_POINT="Point",X.TYPENAME_MULTIPOINT="MultiPoint",X.TYPENAME_LINESTRING="LineString",X.TYPENAME_LINEARRING="LinearRing",X.TYPENAME_MULTILINESTRING="MultiLineString",X.TYPENAME_POLYGON="Polygon",X.TYPENAME_MULTIPOLYGON="MultiPolygon",X.TYPENAME_GEOMETRYCOLLECTION="GeometryCollection",X.geometryChangedFilter={get interfaces_(){return[z]},filter(t){t.geometryChangedAction()}};class k{filter(t){}}class U{static ofLine(t){const e=t.size();if(e<=1)return 0;let s=0;const n=new p;t.getCoordinate(0,n);let i=n.x,r=n.y;for(let o=1;o<e;o++){t.getCoordinate(o,n);const e=n.x,l=n.y,a=e-i,c=l-r;s+=Math.sqrt(a*a+c*c),i=e,r=l}return s}}class H{}class W{static copyCoord(t,e,s,n){const i=Math.min(t.getDimension(),s.getDimension());for(let r=0;r<i;r++)s.setOrdinate(n,r,t.getOrdinate(e,r))}static isRing(t){const e=t.size();return 0===e||!(e<=3)&&(t.getOrdinate(0,A.X)===t.getOrdinate(e-1,A.X)&&t.getOrdinate(0,A.Y)===t.getOrdinate(e-1,A.Y))}static scroll(){if(2===arguments.length){if(E(arguments[0],A)&&Number.isInteger(arguments[1])){const t=arguments[0],e=arguments[1];W.scroll(t,e,W.isRing(t))}else if(E(arguments[0],A)&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1],s=W.indexOf(e,t);if(s<=0)return null;W.scroll(t,s)}}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];if(e<=0)return null;const n=t.copy(),i=s?t.size()-1:t.size();for(let s=0;s<i;s++)for(let r=0;r<t.getDimension();r++)t.setOrdinate(s,r,n.getOrdinate((e+s)%i,r));if(s)for(let e=0;e<t.getDimension();e++)t.setOrdinate(i,e,t.getOrdinate(0,e))}}static isEqual(t,e){const s=t.size();if(s!==e.size())return!1;const n=Math.min(t.getDimension(),e.getDimension());for(let r=0;r<s;r++)for(let s=0;s<n;s++){const n=t.getOrdinate(r,s),o=e.getOrdinate(r,s);if(t.getOrdinate(r,s)!==e.getOrdinate(r,s)&&(!i.isNaN(n)||!i.isNaN(o)))return!1}return!0}static minCoordinateIndex(){if(1===arguments.length){const t=arguments[0];return W.minCoordinateIndex(t,0,t.size()-1)}if(3===arguments.length){const t=arguments[0],e=arguments[2];let s=-1,n=null;for(let i=arguments[1];i<=e;i++){const e=t.getCoordinate(i);(null===n||n.compareTo(e)>0)&&(n=e,s=i)}return s}}static extend(t,e,s){const n=t.create(s,e.getDimension()),i=e.size();if(W.copy(e,0,n,0,i),i>0)for(let t=i;t<s;t++)W.copy(e,i-1,n,t,1);return n}static reverse(t){const e=t.size()-1,s=Math.trunc(e/2);for(let n=0;n<=s;n++)W.swap(t,n,e-n)}static swap(t,e,s){if(e===s)return null;for(let n=0;n<t.getDimension();n++){const i=t.getOrdinate(e,n);t.setOrdinate(e,n,t.getOrdinate(s,n)),t.setOrdinate(s,n,i)}}static copy(t,e,s,n,i){for(let r=0;r<i;r++)W.copyCoord(t,e+r,s,n+r)}static ensureValidRing(t,e){const s=e.size();if(0===s)return e;if(s<=3)return W.createClosedRing(t,e,4);return e.getOrdinate(0,A.X)===e.getOrdinate(s-1,A.X)&&e.getOrdinate(0,A.Y)===e.getOrdinate(s-1,A.Y)?e:W.createClosedRing(t,e,s+1)}static indexOf(t,e){for(let s=0;s<e.size();s++)if(t.x===e.getOrdinate(s,A.X)&&t.y===e.getOrdinate(s,A.Y))return s;return-1}static createClosedRing(t,e,s){const n=t.create(s,e.getDimension()),i=e.size();W.copy(e,0,n,0,i);for(let t=i;t<s;t++)W.copy(e,0,n,t,1);return n}static minCoordinate(t){let e=null;for(let s=0;s<t.size();s++){const n=t.getCoordinate(s);(null===e||e.compareTo(n)>0)&&(e=n)}return e}}class Z extends e{constructor(t){super(t),this.name=Object.keys({UnsupportedOperationException:Z})[0]}}class j{static toDimensionSymbol(t){switch(t){case j.FALSE:return j.SYM_FALSE;case j.TRUE:return j.SYM_TRUE;case j.DONTCARE:return j.SYM_DONTCARE;case j.P:return j.SYM_P;case j.L:return j.SYM_L;case j.A:return j.SYM_A}throw new s("Unknown dimension value: "+t)}static toDimensionValue(t){switch(M.toUpperCase(t)){case j.SYM_FALSE:return j.FALSE;case j.SYM_TRUE:return j.TRUE;case j.SYM_DONTCARE:return j.DONTCARE;case j.SYM_P:return j.P;case j.SYM_L:return j.L;case j.SYM_A:return j.A}throw new s("Unknown dimension symbol: "+t)}}j.P=0,j.L=1,j.A=2,j.FALSE=-1,j.TRUE=-2,j.DONTCARE=-3,j.SYM_FALSE="F",j.SYM_TRUE="T",j.SYM_DONTCARE="*",j.SYM_P="0",j.SYM_L="1",j.SYM_A="2";class K{filter(t){}}class Q extends X{constructor(){super(),Q.constructor_.apply(this,arguments)}static constructor_(){if(this._points=null,0===arguments.length);else if(2===arguments.length){const t=arguments[0],e=arguments[1];X.constructor_.call(this,e),this.init(t)}}computeEnvelopeInternal(){return this.isEmpty()?new P:this._points.expandEnvelope(new P)}isRing(){return this.isClosed()&&this.isSimple()}getCoordinates(){return this._points.toCoordinateArray()}copyInternal(){return new Q(this._points.copy(),this._factory)}equalsExact(){if(2===arguments.length&&"number"==typeof arguments[1]&&arguments[0]instanceof X){const t=arguments[0],e=arguments[1];if(!this.isEquivalentClass(t))return!1;const s=t;if(this._points.size()!==s._points.size())return!1;for(let t=0;t<this._points.size();t++)if(!this.equal(this._points.getCoordinate(t),s._points.getCoordinate(t),e))return!1;return!0}return super.equalsExact.apply(this,arguments)}normalize(){for(let t=0;t<Math.trunc(this._points.size()/2);t++){const e=this._points.size()-1-t;if(!this._points.getCoordinate(t).equals(this._points.getCoordinate(e))){if(this._points.getCoordinate(t).compareTo(this._points.getCoordinate(e))>0){const t=this._points.copy();W.reverse(t),this._points=t}return null}}}getCoordinate(){return this.isEmpty()?null:this._points.getCoordinate(0)}getBoundaryDimension(){return this.isClosed()?j.FALSE:0}isClosed(){return!this.isEmpty()&&this.getCoordinateN(0).equals2D(this.getCoordinateN(this.getNumPoints()-1))}reverseInternal(){const t=this._points.copy();return W.reverse(t),this.getFactory().createLineString(t)}getEndPoint(){return this.isEmpty()?null:this.getPointN(this.getNumPoints()-1)}getTypeCode(){return X.TYPECODE_LINESTRING}getDimension(){return 1}getLength(){return U.ofLine(this._points)}getNumPoints(){return this._points.size()}compareToSameClass(){if(1===arguments.length){const t=arguments[0];let e=0,s=0;for(;e<this._points.size()&&s<t._points.size();){const n=this._points.getCoordinate(e).compareTo(t._points.getCoordinate(s));if(0!==n)return n;e++,s++}return e<this._points.size()?1:s<t._points.size()?-1:0}if(2===arguments.length){const t=arguments[0];return arguments[1].compare(this._points,t._points)}}apply(){if(E(arguments[0],k)){const t=arguments[0];for(let e=0;e<this._points.size();e++)t.filter(this._points.getCoordinate(e))}else if(E(arguments[0],R)){const t=arguments[0];if(0===this._points.size())return null;for(let e=0;e<this._points.size()&&(t.filter(this._points,e),!t.isDone());e++);t.isGeometryChanged()&&this.geometryChanged()}else if(E(arguments[0],K)){arguments[0].filter(this)}else if(E(arguments[0],z)){arguments[0].filter(this)}}getBoundary(){throw new Z}isEquivalentClass(t){return t instanceof Q}getCoordinateN(t){return this._points.getCoordinate(t)}getGeometryType(){return X.TYPENAME_LINESTRING}getCoordinateSequence(){return this._points}isEmpty(){return 0===this._points.size()}init(t){if(null===t&&(t=this.getFactory().getCoordinateSequenceFactory().create([])),1===t.size())throw new s("Invalid number of points in LineString (found "+t.size()+" - must be 0 or >= 2)");this._points=t}isCoordinate(t){for(let e=0;e<this._points.size();e++)if(this._points.getCoordinate(e).equals(t))return!0;return!1}getStartPoint(){return this.isEmpty()?null:this.getPointN(0)}getPointN(t){return this.getFactory().createPoint(this._points.getCoordinate(t))}get interfaces_(){return[H]}}class J{}class $ extends X{constructor(){super(),$.constructor_.apply(this,arguments)}static constructor_(){this._coordinates=null;const t=arguments[0],e=arguments[1];X.constructor_.call(this,e),this.init(t)}computeEnvelopeInternal(){if(this.isEmpty())return new P;const t=new P;return t.expandToInclude(this._coordinates.getX(0),this._coordinates.getY(0)),t}getCoordinates(){return this.isEmpty()?[]:[this.getCoordinate()]}copyInternal(){return new $(this._coordinates.copy(),this._factory)}equalsExact(){if(2===arguments.length&&"number"==typeof arguments[1]&&arguments[0]instanceof X){const t=arguments[0],e=arguments[1];return!!this.isEquivalentClass(t)&&(!(!this.isEmpty()||!t.isEmpty())||this.isEmpty()===t.isEmpty()&&this.equal(t.getCoordinate(),this.getCoordinate(),e))}return super.equalsExact.apply(this,arguments)}normalize(){}getCoordinate(){return 0!==this._coordinates.size()?this._coordinates.getCoordinate(0):null}getBoundaryDimension(){return j.FALSE}reverseInternal(){return this.getFactory().createPoint(this._coordinates.copy())}getTypeCode(){return X.TYPECODE_POINT}getDimension(){return 0}getNumPoints(){return this.isEmpty()?0:1}getX(){if(null===this.getCoordinate())throw new IllegalStateException("getX called on empty Point");return this.getCoordinate().x}compareToSameClass(){if(1===arguments.length){const t=arguments[0];return this.getCoordinate().compareTo(t.getCoordinate())}if(2===arguments.length){const t=arguments[0];return arguments[1].compare(this._coordinates,t._coordinates)}}apply(){if(E(arguments[0],k)){const t=arguments[0];if(this.isEmpty())return null;t.filter(this.getCoordinate())}else if(E(arguments[0],R)){const t=arguments[0];if(this.isEmpty())return null;t.filter(this._coordinates,0),t.isGeometryChanged()&&this.geometryChanged()}else if(E(arguments[0],K)){arguments[0].filter(this)}else if(E(arguments[0],z)){arguments[0].filter(this)}}getBoundary(){return this.getFactory().createGeometryCollection()}getGeometryType(){return X.TYPENAME_POINT}getCoordinateSequence(){return this._coordinates}getY(){if(null===this.getCoordinate())throw new IllegalStateException("getY called on empty Point");return this.getCoordinate().y}isEmpty(){return 0===this._coordinates.size()}init(t){null===t&&(t=this.getFactory().getCoordinateSequenceFactory().create([])),u.isTrue(t.size()<=1),this._coordinates=t}isSimple(){return!0}get interfaces_(){return[J]}}class tt{static ofRing(){if(arguments[0]instanceof Array){const t=arguments[0];return Math.abs(tt.ofRingSigned(t))}if(E(arguments[0],A)){const t=arguments[0];return Math.abs(tt.ofRingSigned(t))}}static ofRingSigned(){if(arguments[0]instanceof Array){const t=arguments[0];if(t.length<3)return 0;let e=0;const s=t[0].x;for(let n=1;n<t.length-1;n++){const i=t[n].x-s,r=t[n+1].y;e+=i*(t[n-1].y-r)}return e/2}if(E(arguments[0],A)){const t=arguments[0],e=t.size();if(e<3)return 0;const s=new p,n=new p,i=new p;t.getCoordinate(0,n),t.getCoordinate(1,i);const r=n.x;i.x-=r;let o=0;for(let l=1;l<e-1;l++)s.y=n.y,n.x=i.x,n.y=i.y,t.getCoordinate(l+1,i),i.x-=r,o+=n.x*(s.y-i.y);return o/2}}}class et{static sort(){const t=arguments[0];if(1===arguments.length)t.sort(((t,e)=>t.compareTo(e)));else if(2===arguments.length)t.sort(((t,e)=>arguments[1].compare(t,e)));else if(3===arguments.length){const e=t.slice(arguments[1],arguments[2]);e.sort();const s=t.slice(0,arguments[1]).concat(e,t.slice(arguments[2],t.length));t.splice(0,t.length);for(const e of s)t.push(e)}else if(4===arguments.length){const e=t.slice(arguments[1],arguments[2]);e.sort(((t,e)=>arguments[3].compare(t,e)));const s=t.slice(0,arguments[1]).concat(e,t.slice(arguments[2],t.length));t.splice(0,t.length);for(const e of s)t.push(e)}}static asList(t){const e=new S;for(const s of t)e.add(s);return e}static copyOf(t,e){return t.slice(0,e)}}class st{}class nt extends X{constructor(){super(),nt.constructor_.apply(this,arguments)}static constructor_(){this._shell=null,this._holes=null;let t=arguments[0],e=arguments[1],n=arguments[2];if(X.constructor_.call(this,n),null===t&&(t=this.getFactory().createLinearRing()),null===e&&(e=[]),X.hasNullElements(e))throw new s("holes must not contain null elements");if(t.isEmpty()&&X.hasNonEmptyElements(e))throw new s("shell is empty but holes are not");this._shell=t,this._holes=e}computeEnvelopeInternal(){return this._shell.getEnvelopeInternal()}getCoordinates(){if(this.isEmpty())return[];const t=new Array(this.getNumPoints()).fill(null);let e=-1;const s=this._shell.getCoordinates();for(let n=0;n<s.length;n++)e++,t[e]=s[n];for(let s=0;s<this._holes.length;s++){const n=this._holes[s].getCoordinates();for(let s=0;s<n.length;s++)e++,t[e]=n[s]}return t}getArea(){let t=0;t+=tt.ofRing(this._shell.getCoordinateSequence());for(let e=0;e<this._holes.length;e++)t-=tt.ofRing(this._holes[e].getCoordinateSequence());return t}copyInternal(){const t=this._shell.copy(),e=new Array(this._holes.length).fill(null);for(let t=0;t<this._holes.length;t++)e[t]=this._holes[t].copy();return new nt(t,e,this._factory)}isRectangle(){if(0!==this.getNumInteriorRing())return!1;if(null===this._shell)return!1;if(5!==this._shell.getNumPoints())return!1;const t=this._shell.getCoordinateSequence(),e=this.getEnvelopeInternal();for(let s=0;s<5;s++){const n=t.getX(s);if(n!==e.getMinX()&&n!==e.getMaxX())return!1;const i=t.getY(s);if(i!==e.getMinY()&&i!==e.getMaxY())return!1}let s=t.getX(0),n=t.getY(0);for(let e=1;e<=4;e++){const i=t.getX(e),r=t.getY(e);if(i!==s===(r!==n))return!1;s=i,n=r}return!0}equalsExact(){if(2===arguments.length&&"number"==typeof arguments[1]&&arguments[0]instanceof X){const t=arguments[0],e=arguments[1];if(!this.isEquivalentClass(t))return!1;const s=t,n=this._shell,i=s._shell;if(!n.equalsExact(i,e))return!1;if(this._holes.length!==s._holes.length)return!1;for(let t=0;t<this._holes.length;t++)if(!this._holes[t].equalsExact(s._holes[t],e))return!1;return!0}return super.equalsExact.apply(this,arguments)}normalize(){if(0===arguments.length){this._shell=this.normalized(this._shell,!0);for(let t=0;t<this._holes.length;t++)this._holes[t]=this.normalized(this._holes[t],!1);et.sort(this._holes)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];if(t.isEmpty())return null;const s=t.getCoordinateSequence(),n=W.minCoordinateIndex(s,0,s.size()-2);W.scroll(s,n,!0),F.isCCW(s)===e&&W.reverse(s)}}getCoordinate(){return this._shell.getCoordinate()}getNumInteriorRing(){return this._holes.length}getBoundaryDimension(){return 1}reverseInternal(){const t=this.getExteriorRing().reverse(),e=new Array(this.getNumInteriorRing()).fill(null);for(let t=0;t<e.length;t++)e[t]=this.getInteriorRingN(t).reverse();return this.getFactory().createPolygon(t,e)}getTypeCode(){return X.TYPECODE_POLYGON}getDimension(){return 2}getLength(){let t=0;t+=this._shell.getLength();for(let e=0;e<this._holes.length;e++)t+=this._holes[e].getLength();return t}getNumPoints(){let t=this._shell.getNumPoints();for(let e=0;e<this._holes.length;e++)t+=this._holes[e].getNumPoints();return t}convexHull(){return this.getExteriorRing().convexHull()}normalized(t,e){const s=t.copy();return this.normalize(s,e),s}compareToSameClass(){if(1===arguments.length){const t=arguments[0],e=this._shell,s=t._shell;return e.compareToSameClass(s)}if(2===arguments.length){const t=arguments[1],e=arguments[0],s=this._shell,n=e._shell,i=s.compareToSameClass(n,t);if(0!==i)return i;const r=this.getNumInteriorRing(),o=e.getNumInteriorRing();let l=0;for(;l<r&&l<o;){const s=this.getInteriorRingN(l),n=e.getInteriorRingN(l),i=s.compareToSameClass(n,t);if(0!==i)return i;l++}return l<r?1:l<o?-1:0}}apply(){if(E(arguments[0],k)){const t=arguments[0];this._shell.apply(t);for(let e=0;e<this._holes.length;e++)this._holes[e].apply(t)}else if(E(arguments[0],R)){const t=arguments[0];if(this._shell.apply(t),!t.isDone())for(let e=0;e<this._holes.length&&(this._holes[e].apply(t),!t.isDone());e++);t.isGeometryChanged()&&this.geometryChanged()}else if(E(arguments[0],K)){arguments[0].filter(this)}else if(E(arguments[0],z)){const t=arguments[0];t.filter(this),this._shell.apply(t);for(let e=0;e<this._holes.length;e++)this._holes[e].apply(t)}}getBoundary(){if(this.isEmpty())return this.getFactory().createMultiLineString();const t=new Array(this._holes.length+1).fill(null);t[0]=this._shell;for(let e=0;e<this._holes.length;e++)t[e+1]=this._holes[e];return t.length<=1?this.getFactory().createLinearRing(t[0].getCoordinateSequence()):this.getFactory().createMultiLineString(t)}getGeometryType(){return X.TYPENAME_POLYGON}getExteriorRing(){return this._shell}isEmpty(){return this._shell.isEmpty()}getInteriorRingN(t){return this._holes[t]}get interfaces_(){return[st]}}class it extends I{contains(){}}class rt extends it{}class ot extends rt{constructor(t){super(),this.array=[],t instanceof I&&this.addAll(t)}contains(t){for(const e of this.array)if(0===e.compareTo(t))return!0;return!1}add(t){if(this.contains(t))return!1;for(let e=0,s=this.array.length;e<s;e++){if(1===this.array[e].compareTo(t))return!!this.array.splice(e,0,t)}return this.array.push(t),!0}addAll(t){for(const e of t)this.add(e);return!0}remove(){throw new Z}size(){return this.array.length}isEmpty(){return 0===this.array.length}toArray(){return this.array.slice()}iterator(){return new lt(this.array)}}class lt{constructor(t){this.array=t,this.position=0}next(){if(this.position===this.array.length)throw new w;return this.array[this.position++]}hasNext(){return this.position<this.array.length}remove(){throw new Z}}class at extends X{constructor(){super(),at.constructor_.apply(this,arguments)}static constructor_(){if(this._geometries=null,0===arguments.length);else if(2===arguments.length){let t=arguments[0],e=arguments[1];if(X.constructor_.call(this,e),null===t&&(t=[]),X.hasNullElements(t))throw new s("geometries must not contain null elements");this._geometries=t}}computeEnvelopeInternal(){const t=new P;for(let e=0;e<this._geometries.length;e++)t.expandToInclude(this._geometries[e].getEnvelopeInternal());return t}getGeometryN(t){return this._geometries[t]}getCoordinates(){const t=new Array(this.getNumPoints()).fill(null);let e=-1;for(let s=0;s<this._geometries.length;s++){const n=this._geometries[s].getCoordinates();for(let s=0;s<n.length;s++)e++,t[e]=n[s]}return t}getArea(){let t=0;for(let e=0;e<this._geometries.length;e++)t+=this._geometries[e].getArea();return t}copyInternal(){const t=new Array(this._geometries.length).fill(null);for(let e=0;e<t.length;e++)t[e]=this._geometries[e].copy();return new at(t,this._factory)}equalsExact(){if(2===arguments.length&&"number"==typeof arguments[1]&&arguments[0]instanceof X){const t=arguments[0],e=arguments[1];if(!this.isEquivalentClass(t))return!1;const s=t;if(this._geometries.length!==s._geometries.length)return!1;for(let t=0;t<this._geometries.length;t++)if(!this._geometries[t].equalsExact(s._geometries[t],e))return!1;return!0}return super.equalsExact.apply(this,arguments)}normalize(){for(let t=0;t<this._geometries.length;t++)this._geometries[t].normalize();et.sort(this._geometries)}getCoordinate(){return this.isEmpty()?null:this._geometries[0].getCoordinate()}getBoundaryDimension(){let t=j.FALSE;for(let e=0;e<this._geometries.length;e++)t=Math.max(t,this._geometries[e].getBoundaryDimension());return t}reverseInternal(){const t=this._geometries.length,e=new S(t);for(let s=0;s<t;s++)e.add(this._geometries[s].reverse());return this.getFactory().buildGeometry(e)}getTypeCode(){return X.TYPECODE_GEOMETRYCOLLECTION}getDimension(){let t=j.FALSE;for(let e=0;e<this._geometries.length;e++)t=Math.max(t,this._geometries[e].getDimension());return t}getLength(){let t=0;for(let e=0;e<this._geometries.length;e++)t+=this._geometries[e].getLength();return t}getNumPoints(){let t=0;for(let e=0;e<this._geometries.length;e++)t+=this._geometries[e].getNumPoints();return t}getNumGeometries(){return this._geometries.length}compareToSameClass(){if(1===arguments.length){const t=arguments[0],e=new ot(et.asList(this._geometries)),s=new ot(et.asList(t._geometries));return this.compare(e,s)}if(2===arguments.length){const t=arguments[1],e=arguments[0],s=this.getNumGeometries(),n=e.getNumGeometries();let i=0;for(;i<s&&i<n;){const s=this.getGeometryN(i),n=e.getGeometryN(i),r=s.compareToSameClass(n,t);if(0!==r)return r;i++}return i<s?1:i<n?-1:0}}apply(){if(E(arguments[0],k)){const t=arguments[0];for(let e=0;e<this._geometries.length;e++)this._geometries[e].apply(t)}else if(E(arguments[0],R)){const t=arguments[0];if(0===this._geometries.length)return null;for(let e=0;e<this._geometries.length&&(this._geometries[e].apply(t),!t.isDone());e++);t.isGeometryChanged()&&this.geometryChanged()}else if(E(arguments[0],K)){const t=arguments[0];t.filter(this);for(let e=0;e<this._geometries.length;e++)this._geometries[e].apply(t)}else if(E(arguments[0],z)){const t=arguments[0];t.filter(this);for(let e=0;e<this._geometries.length;e++)this._geometries[e].apply(t)}}getBoundary(){return X.checkNotGeometryCollection(this),u.shouldNeverReachHere(),null}getGeometryType(){return X.TYPENAME_GEOMETRYCOLLECTION}isEmpty(){for(let t=0;t<this._geometries.length;t++)if(!this._geometries[t].isEmpty())return!1;return!0}}class ct extends at{constructor(){super(),ct.constructor_.apply(this,arguments)}static constructor_(){const t=arguments[0],e=arguments[1];at.constructor_.call(this,t,e)}copyInternal(){const t=new Array(this._geometries.length).fill(null);for(let e=0;e<t.length;e++)t[e]=this._geometries[e].copy();return new ct(t,this._factory)}isValid(){return!0}equalsExact(){if(2===arguments.length&&"number"==typeof arguments[1]&&arguments[0]instanceof X){const t=arguments[0],e=arguments[1];return!!this.isEquivalentClass(t)&&super.equalsExact.call(this,t,e)}return super.equalsExact.apply(this,arguments)}getCoordinate(){if(1===arguments.length&&Number.isInteger(arguments[0])){const t=arguments[0];return this._geometries[t].getCoordinate()}return super.getCoordinate.apply(this,arguments)}getBoundaryDimension(){return j.FALSE}getTypeCode(){return X.TYPECODE_MULTIPOINT}getDimension(){return 0}getBoundary(){return this.getFactory().createGeometryCollection()}getGeometryType(){return X.TYPENAME_MULTIPOINT}get interfaces_(){return[J]}}class ht extends Q{constructor(){super(),ht.constructor_.apply(this,arguments)}static constructor_(){const t=arguments[0],e=arguments[1];Q.constructor_.call(this,t,e),this.validateConstruction()}copyInternal(){return new ht(this._points.copy(),this._factory)}getBoundaryDimension(){return j.FALSE}isClosed(){return!!this.isEmpty()||super.isClosed.call(this)}reverseInternal(){const t=this._points.copy();return W.reverse(t),this.getFactory().createLinearRing(t)}getTypeCode(){return X.TYPECODE_LINEARRING}validateConstruction(){if(!this.isEmpty()&&!super.isClosed.call(this))throw new s("Points of LinearRing do not form a closed linestring");if(this.getCoordinateSequence().size()>=1&&this.getCoordinateSequence().size()<ht.MINIMUM_VALID_SIZE)throw new s("Invalid number of points in LinearRing (found "+this.getCoordinateSequence().size()+" - must be 0 or >= 4)")}getGeometryType(){return X.TYPENAME_LINEARRING}}ht.MINIMUM_VALID_SIZE=4;class ut{static measures(t){return t instanceof f?0:t instanceof y||t instanceof x?1:0}static dimension(t){return t instanceof f?2:t instanceof y?3:t instanceof x?4:3}static create(){if(1===arguments.length){const t=arguments[0];return ut.create(t,0)}if(2===arguments.length){const t=arguments[0],e=arguments[1];return 2===t?new f:3===t&&0===e?new p:3===t&&1===e?new y:4===t&&1===e?new x:new p}}}class gt{static isRing(t){return!(t.length<4)&&!!t[0].equals2D(t[t.length-1])}static ptNotInList(t,e){for(let s=0;s<t.length;s++){const n=t[s];if(gt.indexOf(n,e)<0)return n}return null}static scroll(t,e){const s=gt.indexOf(e,t);if(s<0)return null;const n=new Array(t.length).fill(null);q.arraycopy(t,s,n,0,t.length-s),q.arraycopy(t,0,n,t.length-s,s),q.arraycopy(n,0,t,0,t.length)}static equals(){if(2===arguments.length){const t=arguments[0],e=arguments[1];if(t===e)return!0;if(null===t||null===e)return!1;if(t.length!==e.length)return!1;for(let s=0;s<t.length;s++)if(!t[s].equals(e[s]))return!1;return!0}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];if(t===e)return!0;if(null===t||null===e)return!1;if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(0!==s.compare(t[n],e[n]))return!1;return!0}}static intersection(t,e){const s=new T;for(let n=0;n<t.length;n++)e.intersects(t[n])&&s.add(t[n],!0);return s.toCoordinateArray()}static measures(t){if(null===t||0===t.length)return 0;let e=0;for(const s of t)e=Math.max(e,ut.measures(s));return e}static hasRepeatedPoints(t){for(let e=1;e<t.length;e++)if(t[e-1].equals(t[e]))return!0;return!1}static removeRepeatedPoints(t){if(!gt.hasRepeatedPoints(t))return t;return new T(t,!1).toCoordinateArray()}static reverse(t){const e=t.length-1,s=Math.trunc(e/2);for(let n=0;n<=s;n++){const s=t[n];t[n]=t[e-n],t[e-n]=s}}static removeNull(t){let e=0;for(let s=0;s<t.length;s++)null!==t[s]&&e++;const s=new Array(e).fill(null);if(0===e)return s;let n=0;for(let e=0;e<t.length;e++)null!==t[e]&&(s[n++]=t[e]);return s}static copyDeep(){if(1===arguments.length){const t=arguments[0],e=new Array(t.length).fill(null);for(let s=0;s<t.length;s++)e[s]=t[s].copy();return e}if(5===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=arguments[4];for(let r=0;r<i;r++)s[n+r]=t[e+r].copy()}}static isEqualReversed(t,e){for(let s=0;s<t.length;s++){const n=t[s],i=e[t.length-s-1];if(0!==n.compareTo(i))return!1}return!0}static envelope(t){const e=new P;for(let s=0;s<t.length;s++)e.expandToInclude(t[s]);return e}static toCoordinateArray(t){return t.toArray(gt.coordArrayType)}static dimension(t){if(null===t||0===t.length)return 3;let e=0;for(const s of t)e=Math.max(e,ut.dimension(s));return e}static atLeastNCoordinatesOrNothing(t,e){return e.length>=t?e:[]}static indexOf(t,e){for(let s=0;s<e.length;s++)if(t.equals(e[s]))return s;return-1}static increasingDirection(t){for(let e=0;e<Math.trunc(t.length/2);e++){const s=t.length-1-e,n=t[e].compareTo(t[s]);if(0!==n)return n}return 1}static compare(t,e){let s=0;for(;s<t.length&&s<e.length;){const n=t[s].compareTo(e[s]);if(0!==n)return n;s++}return s<e.length?-1:s<t.length?1:0}static minCoordinate(t){let e=null;for(let s=0;s<t.length;s++)(null===e||e.compareTo(t[s])>0)&&(e=t[s]);return e}static extract(t,e,s){e=B.clamp(e,0,t.length);let n=(s=B.clamp(s,-1,t.length))-e+1;s<0&&(n=0),e>=t.length&&(n=0),s<e&&(n=0);const i=new Array(n).fill(null);if(0===n)return i;let r=0;for(let n=e;n<=s;n++)i[r++]=t[n];return i}}gt.ForwardComparator=class{compare(t,e){const s=t,n=e;return gt.compare(s,n)}get interfaces_(){return[l]}},gt.BidirectionalComparator=class{compare(t,e){const s=t,n=e;if(s.length<n.length)return-1;if(s.length>n.length)return 1;if(0===s.length)return 0;const i=gt.compare(s,n);return gt.isEqualReversed(s,n)?0:i}OLDcompare(t,e){const s=t,n=e;if(s.length<n.length)return-1;if(s.length>n.length)return 1;if(0===s.length)return 0;const i=gt.increasingDirection(s),r=gt.increasingDirection(n);let o=i>0?0:s.length-1,l=r>0?0:s.length-1;for(let t=0;t<s.length;t++){const t=s[o].compareTo(n[l]);if(0!==t)return t;o+=i,l+=r}return 0}get interfaces_(){return[l]}},gt.coordArrayType=new Array(0).fill(null);class dt{constructor(t){this.str=t}append(t){this.str+=t}setCharAt(t,e){this.str=this.str.substr(0,t)+e+this.str.substr(t+1)}toString(){return this.str}}class _t{constructor(){_t.constructor_.apply(this,arguments)}static constructor_(){if(this._dimension=3,this._measures=0,this._coordinates=null,1===arguments.length){if(arguments[0]instanceof Array){const t=arguments[0];_t.constructor_.call(this,t,gt.dimension(t),gt.measures(t))}else if(Number.isInteger(arguments[0])){const t=arguments[0];this._coordinates=new Array(t).fill(null);for(let e=0;e<t;e++)this._coordinates[e]=new p}else if(E(arguments[0],A)){const t=arguments[0];if(null===t)return this._coordinates=new Array(0).fill(null),null;this._dimension=t.getDimension(),this._measures=t.getMeasures(),this._coordinates=new Array(t.size()).fill(null);for(let e=0;e<this._coordinates.length;e++)this._coordinates[e]=t.getCoordinateCopy(e)}}else if(2===arguments.length){if(arguments[0]instanceof Array&&Number.isInteger(arguments[1])){const t=arguments[0],e=arguments[1];_t.constructor_.call(this,t,e,gt.measures(t))}else if(Number.isInteger(arguments[0])&&Number.isInteger(arguments[1])){const t=arguments[0],e=arguments[1];this._coordinates=new Array(t).fill(null),this._dimension=e;for(let s=0;s<t;s++)this._coordinates[s]=ut.create(e)}}else if(3===arguments.length)if(Number.isInteger(arguments[2])&&arguments[0]instanceof Array&&Number.isInteger(arguments[1])){const t=arguments[0],e=arguments[1],s=arguments[2];this._dimension=e,this._measures=s,this._coordinates=null===t?new Array(0).fill(null):t}else if(Number.isInteger(arguments[2])&&Number.isInteger(arguments[0])&&Number.isInteger(arguments[1])){const t=arguments[0],e=arguments[1],s=arguments[2];this._coordinates=new Array(t).fill(null),this._dimension=e,this._measures=s;for(let e=0;e<t;e++)this._coordinates[e]=this.createCoordinate()}}getM(t){return this.hasM()?this._coordinates[t].getM():i.NaN}setOrdinate(t,e,s){switch(e){case A.X:this._coordinates[t].x=s;break;case A.Y:this._coordinates[t].y=s;break;default:this._coordinates[t].setOrdinate(e,s)}}getZ(t){return this.hasZ()?this._coordinates[t].getZ():i.NaN}size(){return this._coordinates.length}getOrdinate(t,e){switch(e){case A.X:return this._coordinates[t].x;case A.Y:return this._coordinates[t].y;default:return this._coordinates[t].getOrdinate(e)}}getCoordinate(){if(1===arguments.length){const t=arguments[0];return this._coordinates[t]}if(2===arguments.length){const t=arguments[0];arguments[1].setCoordinate(this._coordinates[t])}}getCoordinateCopy(t){const e=this.createCoordinate();return e.setCoordinate(this._coordinates[t]),e}createCoordinate(){return ut.create(this.getDimension(),this.getMeasures())}getDimension(){return this._dimension}getX(t){return this._coordinates[t].x}getMeasures(){return this._measures}expandEnvelope(t){for(let e=0;e<this._coordinates.length;e++)t.expandToInclude(this._coordinates[e]);return t}copy(){const t=new Array(this.size()).fill(null);for(let e=0;e<this._coordinates.length;e++){const s=this.createCoordinate();s.setCoordinate(this._coordinates[e]),t[e]=s}return new _t(t,this._dimension,this._measures)}toString(){if(this._coordinates.length>0){const t=new dt(17*this._coordinates.length);t.append("("),t.append(this._coordinates[0]);for(let e=1;e<this._coordinates.length;e++)t.append(", "),t.append(this._coordinates[e]);return t.append(")"),t.toString()}return"()"}getY(t){return this._coordinates[t].y}toCoordinateArray(){return this._coordinates}get interfaces_(){return[A,a]}}class pt{static instance(){return pt.instanceObject}readResolve(){return pt.instance()}create(){if(1===arguments.length){if(arguments[0]instanceof Array){return new _t(arguments[0])}if(E(arguments[0],A)){return new _t(arguments[0])}}else{if(2===arguments.length){let t=arguments[1];return t>3&&(t=3),t<2&&(t=2),new _t(arguments[0],t)}if(3===arguments.length){let t=arguments[2],e=arguments[1]-t;return t>1&&(t=1),e>3&&(e=3),e<2&&(e=2),new _t(arguments[0],e+t,t)}}}get interfaces_(){return[V,a]}}pt.instanceObject=new pt;class mt extends at{constructor(){super(),mt.constructor_.apply(this,arguments)}static constructor_(){const t=arguments[0],e=arguments[1];at.constructor_.call(this,t,e)}copyInternal(){const t=new Array(this._geometries.length).fill(null);for(let e=0;e<t.length;e++)t[e]=this._geometries[e].copy();return new mt(t,this._factory)}equalsExact(){if(2===arguments.length&&"number"==typeof arguments[1]&&arguments[0]instanceof X){const t=arguments[0],e=arguments[1];return!!this.isEquivalentClass(t)&&super.equalsExact.call(this,t,e)}return super.equalsExact.apply(this,arguments)}getBoundaryDimension(){return 1}getTypeCode(){return X.TYPECODE_MULTIPOLYGON}getDimension(){return 2}getBoundary(){if(this.isEmpty())return this.getFactory().createMultiLineString();const t=new S;for(let e=0;e<this._geometries.length;e++){const s=this._geometries[e].getBoundary();for(let e=0;e<s.getNumGeometries();e++)t.add(s.getGeometryN(e))}const e=new Array(t.size()).fill(null);return this.getFactory().createMultiLineString(t.toArray(e))}getGeometryType(){return X.TYPENAME_MULTIPOLYGON}get interfaces_(){return[st]}}class ft{get(){}put(){}size(){}values(){}entrySet(){}}class yt extends it{constructor(t){super(),this.map=new Map,t instanceof I&&this.addAll(t)}contains(t){const e=t.hashCode?t.hashCode():t;return!!this.map.has(e)}add(t){const e=t.hashCode?t.hashCode():t;return!this.map.has(e)&&!!this.map.set(e,t)}addAll(t){for(const e of t)this.add(e);return!0}remove(){throw new Z}size(){return this.map.size}isEmpty(){return 0===this.map.size}toArray(){return Array.from(this.map.values())}iterator(){return new xt(this.map)}[Symbol.iterator](){return this.map}}class xt{constructor(t){this.iterator=t.values();const{done:e,value:s}=this.iterator.next();this.done=e,this.value=s}next(){if(this.done)throw new w;const t=this.value,{done:e,value:s}=this.iterator.next();return this.done=e,this.value=s,t}hasNext(){return!this.done}remove(){throw new Z}}class Et extends ft{constructor(){super(),this.map=new Map}get(t){return this.map.get(t)||null}put(t,e){return this.map.set(t,e),e}values(){const t=new S,e=this.map.values();let s=e.next();for(;!s.done;)t.add(s.value),s=e.next();return t}entrySet(){const t=new yt;return this.map.entries().forEach((e=>t.add(e))),t}size(){return this.map.size()}}class It{constructor(){It.constructor_.apply(this,arguments)}static constructor_(){if(this._modelType=null,this._scale=null,0===arguments.length)this._modelType=It.FLOATING;else if(1===arguments.length)if(arguments[0]instanceof Nt){const t=arguments[0];this._modelType=t,t===It.FIXED&&this.setScale(1)}else if("number"==typeof arguments[0]){const t=arguments[0];this._modelType=It.FIXED,this.setScale(t)}else if(arguments[0]instanceof It){const t=arguments[0];this._modelType=t._modelType,this._scale=t._scale}}static mostPrecise(t,e){return t.compareTo(e)>=0?t:e}equals(t){if(!(t instanceof It))return!1;const e=t;return this._modelType===e._modelType&&this._scale===e._scale}compareTo(t){const e=t,s=this.getMaximumSignificantDigits(),n=e.getMaximumSignificantDigits();return v.compare(s,n)}getScale(){return this._scale}isFloating(){return this._modelType===It.FLOATING||this._modelType===It.FLOATING_SINGLE}getType(){return this._modelType}toString(){let t="UNKNOWN";return this._modelType===It.FLOATING?t="Floating":this._modelType===It.FLOATING_SINGLE?t="Floating-Single":this._modelType===It.FIXED&&(t="Fixed (Scale="+this.getScale()+")"),t}makePrecise(){if("number"==typeof arguments[0]){const t=arguments[0];if(i.isNaN(t))return t;if(this._modelType===It.FLOATING_SINGLE){return t}return this._modelType===It.FIXED?Math.round(t*this._scale)/this._scale:t}if(arguments[0]instanceof p){const t=arguments[0];if(this._modelType===It.FLOATING)return null;t.x=this.makePrecise(t.x),t.y=this.makePrecise(t.y)}}getMaximumSignificantDigits(){let t=16;return this._modelType===It.FLOATING?t=16:this._modelType===It.FLOATING_SINGLE?t=6:this._modelType===It.FIXED&&(t=1+Math.trunc(Math.ceil(Math.log(this.getScale())/Math.log(10)))),t}setScale(t){this._scale=Math.abs(t)}get interfaces_(){return[a,r]}}class Nt{constructor(){Nt.constructor_.apply(this,arguments)}static constructor_(){this._name=null;const t=arguments[0];this._name=t,Nt.nameToTypeMap.put(t,this)}readResolve(){return Nt.nameToTypeMap.get(this._name)}toString(){return this._name}get interfaces_(){return[a]}}Nt.nameToTypeMap=new Et,It.Type=Nt,It.FIXED=new Nt("FIXED"),It.FLOATING=new Nt("FLOATING"),It.FLOATING_SINGLE=new Nt("FLOATING SINGLE"),It.maximumPreciseValue=9007199254740992;class Ct extends at{constructor(){super(),Ct.constructor_.apply(this,arguments)}static constructor_(){const t=arguments[0],e=arguments[1];at.constructor_.call(this,t,e)}copyInternal(){const t=new Array(this._geometries.length).fill(null);for(let e=0;e<t.length;e++)t[e]=this._geometries[e].copy();return new Ct(t,this._factory)}equalsExact(){if(2===arguments.length&&"number"==typeof arguments[1]&&arguments[0]instanceof X){const t=arguments[0],e=arguments[1];return!!this.isEquivalentClass(t)&&super.equalsExact.call(this,t,e)}return super.equalsExact.apply(this,arguments)}getBoundaryDimension(){return this.isClosed()?j.FALSE:0}isClosed(){if(this.isEmpty())return!1;for(let t=0;t<this._geometries.length;t++)if(!this._geometries[t].isClosed())return!1;return!0}getTypeCode(){return X.TYPECODE_MULTILINESTRING}getDimension(){return 1}getBoundary(){throw new Z}getGeometryType(){return X.TYPENAME_MULTILINESTRING}get interfaces_(){return[H]}}class wt{constructor(){wt.constructor_.apply(this,arguments)}static constructor_(){if(this._precisionModel=null,this._coordinateSequenceFactory=null,this._SRID=null,0===arguments.length)wt.constructor_.call(this,new It,0);else if(1===arguments.length){if(E(arguments[0],V)){const t=arguments[0];wt.constructor_.call(this,new It,0,t)}else if(arguments[0]instanceof It){const t=arguments[0];wt.constructor_.call(this,t,0,wt.getDefaultCoordinateSequenceFactory())}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];wt.constructor_.call(this,t,e,wt.getDefaultCoordinateSequenceFactory())}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._precisionModel=t,this._coordinateSequenceFactory=s,this._SRID=e}}static toMultiPolygonArray(t){const e=new Array(t.size()).fill(null);return t.toArray(e)}static toGeometryArray(t){if(null===t)return null;const e=new Array(t.size()).fill(null);return t.toArray(e)}static getDefaultCoordinateSequenceFactory(){return pt.instance()}static toMultiLineStringArray(t){const e=new Array(t.size()).fill(null);return t.toArray(e)}static toLineStringArray(t){const e=new Array(t.size()).fill(null);return t.toArray(e)}static toMultiPointArray(t){const e=new Array(t.size()).fill(null);return t.toArray(e)}static toLinearRingArray(t){const e=new Array(t.size()).fill(null);return t.toArray(e)}static toPointArray(t){const e=new Array(t.size()).fill(null);return t.toArray(e)}static toPolygonArray(t){const e=new Array(t.size()).fill(null);return t.toArray(e)}static createPointFromInternalCoord(t,e){return e.getPrecisionModel().makePrecise(t),e.getFactory().createPoint(t)}createEmpty(t){switch(t){case-1:return this.createGeometryCollection();case 0:return this.createPoint();case 1:return this.createLineString();case 2:return this.createPolygon();default:throw new s("Invalid dimension: "+t)}}toGeometry(t){return t.isNull()?this.createPoint():t.getMinX()===t.getMaxX()&&t.getMinY()===t.getMaxY()?this.createPoint(new p(t.getMinX(),t.getMinY())):t.getMinX()===t.getMaxX()||t.getMinY()===t.getMaxY()?this.createLineString([new p(t.getMinX(),t.getMinY()),new p(t.getMaxX(),t.getMaxY())]):this.createPolygon(this.createLinearRing([new p(t.getMinX(),t.getMinY()),new p(t.getMinX(),t.getMaxY()),new p(t.getMaxX(),t.getMaxY()),new p(t.getMaxX(),t.getMinY()),new p(t.getMinX(),t.getMinY())]),null)}createLineString(){if(0===arguments.length)return this.createLineString(this.getCoordinateSequenceFactory().create([]));if(1===arguments.length){if(arguments[0]instanceof Array){const t=arguments[0];return this.createLineString(null!==t?this.getCoordinateSequenceFactory().create(t):null)}if(E(arguments[0],A)){return new Q(arguments[0],this)}}}createMultiLineString(){if(0===arguments.length)return new Ct(null,this);if(1===arguments.length){return new Ct(arguments[0],this)}}buildGeometry(t){let e=null,s=!1,n=!1;for(let i=t.iterator();i.hasNext();){const t=i.next(),r=t.getTypeCode();null===e&&(e=r),r!==e&&(s=!0),t instanceof at&&(n=!0)}if(null===e)return this.createGeometryCollection();if(s||n)return this.createGeometryCollection(wt.toGeometryArray(t));const i=t.iterator().next();if(t.size()>1){if(i instanceof nt)return this.createMultiPolygon(wt.toPolygonArray(t));if(i instanceof Q)return this.createMultiLineString(wt.toLineStringArray(t));if(i instanceof $)return this.createMultiPoint(wt.toPointArray(t));u.shouldNeverReachHere("Unhandled geometry type: "+i.getGeometryType())}return i}createMultiPointFromCoords(t){return this.createMultiPoint(null!==t?this.getCoordinateSequenceFactory().create(t):null)}createPoint(){if(0===arguments.length)return this.createPoint(this.getCoordinateSequenceFactory().create([]));if(1===arguments.length){if(arguments[0]instanceof p){const t=arguments[0];return this.createPoint(null!==t?this.getCoordinateSequenceFactory().create([t]):null)}if(E(arguments[0],A)){return new $(arguments[0],this)}}}getCoordinateSequenceFactory(){return this._coordinateSequenceFactory}createPolygon(){if(0===arguments.length)return this.createPolygon(null,null);if(1===arguments.length){if(E(arguments[0],A)){const t=arguments[0];return this.createPolygon(this.createLinearRing(t))}if(arguments[0]instanceof Array){const t=arguments[0];return this.createPolygon(this.createLinearRing(t))}if(arguments[0]instanceof ht){const t=arguments[0];return this.createPolygon(t,null)}}else if(2===arguments.length){return new nt(arguments[0],arguments[1],this)}}getSRID(){return this._SRID}createGeometryCollection(){if(0===arguments.length)return new at(null,this);if(1===arguments.length){return new at(arguments[0],this)}}getPrecisionModel(){return this._precisionModel}createLinearRing(){if(0===arguments.length)return this.createLinearRing(this.getCoordinateSequenceFactory().create([]));if(1===arguments.length){if(arguments[0]instanceof Array){const t=arguments[0];return this.createLinearRing(null!==t?this.getCoordinateSequenceFactory().create(t):null)}if(E(arguments[0],A)){return new ht(arguments[0],this)}}}createMultiPolygon(){if(0===arguments.length)return new mt(null,this);if(1===arguments.length){return new mt(arguments[0],this)}}createMultiPoint(){if(0===arguments.length)return new ct(null,this);if(1===arguments.length){if(arguments[0]instanceof Array){return new ct(arguments[0],this)}if(E(arguments[0],A)){const t=arguments[0];if(null===t)return this.createMultiPoint(new Array(0).fill(null));const e=new Array(t.size()).fill(null);for(let s=0;s<t.size();s++){const n=this.getCoordinateSequenceFactory().create(1,t.getDimension(),t.getMeasures());W.copy(t,s,n,0,1),e[s]=this.createPoint(n)}return this.createMultiPoint(e)}}}get interfaces_(){return[a]}}const St="XY",Lt="XYZ",Tt="XYM",Rt="XYZM",Pt={POINT:"Point",LINE_STRING:"LineString",LINEAR_RING:"LinearRing",POLYGON:"Polygon",MULTI_POINT:"MultiPoint",MULTI_LINE_STRING:"MultiLineString",MULTI_POLYGON:"MultiPolygon",GEOMETRY_COLLECTION:"GeometryCollection",CIRCLE:"Circle"},Ot=1,vt=2,Mt=3,bt=4,Dt=5,At=6,Ft={};for(const t in Pt)Ft[t]=Pt[t].toUpperCase();class Gt{constructor(t){this.wkt=t,this.index_=-1}isAlpha_(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"}isNumeric_(t,e){return t>="0"&&t<="9"||"."==t&&!(void 0!==e&&e)}isWhiteSpace_(t){return" "==t||"\t"==t||"\r"==t||"\n"==t}nextChar_(){return this.wkt.charAt(++this.index_)}nextToken(){const t=this.nextChar_(),e=this.index_;let s,n=t;if("("==t)s=vt;else if(","==t)s=Dt;else if(")"==t)s=Mt;else if(this.isNumeric_(t)||"-"==t)s=bt,n=this.readNumber_();else if(this.isAlpha_(t))s=Ot,n=this.readText_();else{if(this.isWhiteSpace_(t))return this.nextToken();if(""!==t)throw new Error("Unexpected character: "+t);s=At}return{position:e,value:n,type:s}}readNumber_(){let t;const e=this.index_;let s=!1,n=!1;do{"."==t?s=!0:"e"!=t&&"E"!=t||(n=!0),t=this.nextChar_()}while(this.isNumeric_(t,s)||!n&&("e"==t||"E"==t)||n&&("-"==t||"+"==t));return parseFloat(this.wkt.substring(e,this.index_--))}readText_(){let t;const e=this.index_;do{t=this.nextChar_()}while(this.isAlpha_(t));return this.wkt.substring(e,this.index_--).toUpperCase()}}class qt{constructor(t,e){this.lexer_=t,this.token_,this.layout_=St,this.factory=e}consume_(){this.token_=this.lexer_.nextToken()}isTokenType(t){return this.token_.type==t}match(t){const e=this.isTokenType(t);return e&&this.consume_(),e}parse(){this.consume_();return this.parseGeometry_()}parseGeometryLayout_(){let t=St;const e=this.token_;if(this.isTokenType(Ot)){const s=e.value;"Z"===s?t=Lt:"M"===s?t=Tt:"ZM"===s&&(t=Rt),t!==St&&this.consume_()}return t}parseGeometryCollectionText_(){if(this.match(vt)){const t=[];do{t.push(this.parseGeometry_())}while(this.match(Dt));if(this.match(Mt))return t}else if(this.isEmptyGeometry_())return[];throw new Error(this.formatErrorMessage_())}parsePointText_(){if(this.match(vt)){const t=this.parsePoint_();if(this.match(Mt))return t}else if(this.isEmptyGeometry_())return null;throw new Error(this.formatErrorMessage_())}parseLineStringText_(){if(this.match(vt)){const t=this.parsePointList_();if(this.match(Mt))return t}else if(this.isEmptyGeometry_())return[];throw new Error(this.formatErrorMessage_())}parsePolygonText_(){if(this.match(vt)){const t=this.parseLineStringTextList_();if(this.match(Mt))return t}else if(this.isEmptyGeometry_())return[];throw new Error(this.formatErrorMessage_())}parseMultiPointText_(){if(this.match(vt)){let t;if(t=this.token_.type==vt?this.parsePointTextList_():this.parsePointList_(),this.match(Mt))return t}else if(this.isEmptyGeometry_())return[];throw new Error(this.formatErrorMessage_())}parseMultiLineStringText_(){if(this.match(vt)){const t=this.parseLineStringTextList_();if(this.match(Mt))return t}else if(this.isEmptyGeometry_())return[];throw new Error(this.formatErrorMessage_())}parseMultiPolygonText_(){if(this.match(vt)){const t=this.parsePolygonTextList_();if(this.match(Mt))return t}else if(this.isEmptyGeometry_())return[];throw new Error(this.formatErrorMessage_())}parsePoint_(){const t=[],e=this.layout_.length;for(let s=0;s<e;++s){const e=this.token_;if(!this.match(bt))break;t.push(e.value)}if(t.length==e)return t;throw new Error(this.formatErrorMessage_())}parsePointList_(){const t=[this.parsePoint_()];for(;this.match(Dt);)t.push(this.parsePoint_());return t}parsePointTextList_(){const t=[this.parsePointText_()];for(;this.match(Dt);)t.push(this.parsePointText_());return t}parseLineStringTextList_(){const t=[this.parseLineStringText_()];for(;this.match(Dt);)t.push(this.parseLineStringText_());return t}parsePolygonTextList_(){const t=[this.parsePolygonText_()];for(;this.match(Dt);)t.push(this.parsePolygonText_());return t}isEmptyGeometry_(){const t=this.isTokenType(Ot)&&"EMPTY"==this.token_.value;return t&&this.consume_(),t}formatErrorMessage_(){return"Unexpected `"+this.token_.value+"` at position "+this.token_.position+" in `"+this.lexer_.wkt+"`"}parseGeometry_(){const t=this.factory,e=t=>new p(...t),s=s=>{const n=s.map((s=>t.createLinearRing(s.map(e))));return n.length>1?t.createPolygon(n[0],n.slice(1)):t.createPolygon(n[0])},n=this.token_;if(this.match(Ot)){const i=n.value;if(this.layout_=this.parseGeometryLayout_(),"GEOMETRYCOLLECTION"==i){const e=this.parseGeometryCollectionText_();return t.createGeometryCollection(e)}switch(i){case"POINT":{const e=this.parsePointText_();return e?t.createPoint(new p(...e)):t.createPoint()}case"LINESTRING":{const s=this.parseLineStringText_().map(e);return t.createLineString(s)}case"LINEARRING":{const s=this.parseLineStringText_().map(e);return t.createLinearRing(s)}case"POLYGON":{const e=this.parsePolygonText_();return e&&0!==e.length?s(e):t.createPolygon()}case"MULTIPOINT":{const s=this.parseMultiPointText_();if(!s||0===s.length)return t.createMultiPoint();const n=s.map(e).map((e=>t.createPoint(e)));return t.createMultiPoint(n)}case"MULTILINESTRING":{const s=this.parseMultiLineStringText_().map((s=>t.createLineString(s.map(e))));return t.createMultiLineString(s)}case"MULTIPOLYGON":{const e=this.parseMultiPolygonText_();if(!e||0===e.length)return t.createMultiPolygon();const n=e.map(s);return t.createMultiPolygon(n)}default:throw new Error("Invalid geometry type: "+i)}}throw new Error(this.formatErrorMessage_())}}function Bt(t){if(t.isEmpty())return"";const e=t.getCoordinate(),s=[e.x,e.y];return void 0===e.z||Number.isNaN(e.z)||s.push(e.z),void 0===e.m||Number.isNaN(e.m)||s.push(e.m),s.join(" ")}function Yt(t){const e=t.getCoordinates().map((t=>{const e=[t.x,t.y];return void 0===t.z||Number.isNaN(t.z)||e.push(t.z),void 0===t.m||Number.isNaN(t.m)||e.push(t.m),e})),s=[];for(let t=0,n=e.length;t<n;++t)s.push(e[t].join(" "));return s.join(", ")}function Vt(t){const e=[];e.push("("+Yt(t.getExteriorRing())+")");for(let s=0,n=t.getNumInteriorRing();s<n;++s)e.push("("+Yt(t.getInteriorRingN(s))+")");return e.join(", ")}const zt={Point:Bt,LineString:Yt,LinearRing:Yt,Polygon:Vt,MultiPoint:function(t){const e=[];for(let s=0,n=t.getNumGeometries();s<n;++s)e.push("("+Bt(t.getGeometryN(s))+")");return e.join(", ")},MultiLineString:function(t){const e=[];for(let s=0,n=t.getNumGeometries();s<n;++s)e.push("("+Yt(t.getGeometryN(s))+")");return e.join(", ")},MultiPolygon:function(t){const e=[];for(let s=0,n=t.getNumGeometries();s<n;++s)e.push("("+Vt(t.getGeometryN(s))+")");return e.join(", ")},GeometryCollection:function(t){const e=[];for(let s=0,n=t.getNumGeometries();s<n;++s)e.push(Xt(t.getGeometryN(s)));return e.join(", ")}};function Xt(t){let e=t.getGeometryType();const s=zt[e];e=e.toUpperCase();const n=function(t){let e="";if(t.isEmpty())return e;const s=t.getCoordinate();return void 0===s.z||Number.isNaN(s.z)||(e+="Z"),void 0===s.m||Number.isNaN(s.m)||(e+="M"),e}(t);if(n.length>0&&(e+=" "+n),t.isEmpty())return e+" EMPTY";return e+" ("+s(t)+")"}class kt{constructor(t){this.geometryFactory=t||new wt,this.precisionModel=this.geometryFactory.getPrecisionModel()}read(t){const e=new Gt(t);return new qt(e,this.geometryFactory).parse()}write(t){return Xt(t)}}class Ut{constructor(t){this.parser=new kt(t)}write(t){return this.parser.write(t)}static toLineString(t,e){if(2!==arguments.length)throw new Error("Not implemented");return"LINESTRING ( "+t.x+" "+t.y+", "+e.x+" "+e.y+" )"}}class Ht{constructor(){Ht.constructor_.apply(this,arguments)}static constructor_(){this._result=null,this._inputLines=Array(2).fill().map((()=>Array(2))),this._intPt=new Array(2).fill(null),this._intLineIndex=null,this._isProper=null,this._pa=null,this._pb=null,this._precisionModel=null,this._intPt[0]=new p,this._intPt[1]=new p,this._pa=this._intPt[0],this._pb=this._intPt[1],this._result=0}static computeEdgeDistance(t,e,s){const n=Math.abs(s.x-e.x),i=Math.abs(s.y-e.y);let r=-1;if(t.equals(e))r=0;else if(t.equals(s))r=n>i?n:i;else{const s=Math.abs(t.x-e.x),o=Math.abs(t.y-e.y);r=n>i?s:o,0!==r||t.equals(e)||(r=Math.max(s,o))}return u.isTrue(!(0===r&&!t.equals(e)),"Bad distance calculation"),r}static nonRobustComputeEdgeDistance(t,e,s){const n=t.x-e.x,i=t.y-e.y,r=Math.sqrt(n*n+i*i);return u.isTrue(!(0===r&&!t.equals(e)),"Invalid distance calculation"),r}getIndexAlongSegment(t,e){return this.computeIntLineIndex(),this._intLineIndex[t][e]}getTopologySummary(){const t=new dt;return this.isEndPoint()&&t.append(" endpoint"),this._isProper&&t.append(" proper"),this.isCollinear()&&t.append(" collinear"),t.toString()}computeIntersection(t,e,s,n){this._inputLines[0][0]=t,this._inputLines[0][1]=e,this._inputLines[1][0]=s,this._inputLines[1][1]=n,this._result=this.computeIntersect(t,e,s,n)}getIntersectionNum(){return this._result}computeIntLineIndex(){if(0===arguments.length)null===this._intLineIndex&&(this._intLineIndex=Array(2).fill().map((()=>Array(2))),this.computeIntLineIndex(0),this.computeIntLineIndex(1));else if(1===arguments.length){const t=arguments[0];this.getEdgeDistance(t,0)>this.getEdgeDistance(t,1)?(this._intLineIndex[t][0]=0,this._intLineIndex[t][1]=1):(this._intLineIndex[t][0]=1,this._intLineIndex[t][1]=0)}}isProper(){return this.hasIntersection()&&this._isProper}setPrecisionModel(t){this._precisionModel=t}isInteriorIntersection(){if(0===arguments.length)return!!this.isInteriorIntersection(0)||!!this.isInteriorIntersection(1);if(1===arguments.length){const t=arguments[0];for(let e=0;e<this._result;e++)if(!this._intPt[e].equals2D(this._inputLines[t][0])&&!this._intPt[e].equals2D(this._inputLines[t][1]))return!0;return!1}}getIntersection(t){return this._intPt[t]}isEndPoint(){return this.hasIntersection()&&!this._isProper}hasIntersection(){return this._result!==Ht.NO_INTERSECTION}getEdgeDistance(t,e){return Ht.computeEdgeDistance(this._intPt[e],this._inputLines[t][0],this._inputLines[t][1])}isCollinear(){return this._result===Ht.COLLINEAR_INTERSECTION}toString(){return Ut.toLineString(this._inputLines[0][0],this._inputLines[0][1])+" - "+Ut.toLineString(this._inputLines[1][0],this._inputLines[1][1])+this.getTopologySummary()}getEndpoint(t,e){return this._inputLines[t][e]}isIntersection(t){for(let e=0;e<this._result;e++)if(this._intPt[e].equals2D(t))return!0;return!1}getIntersectionAlongSegment(t,e){return this.computeIntLineIndex(),this._intPt[this._intLineIndex[t][e]]}}Ht.DONT_INTERSECT=0,Ht.DO_INTERSECT=1,Ht.COLLINEAR=2,Ht.NO_INTERSECTION=0,Ht.POINT_INTERSECTION=1,Ht.COLLINEAR_INTERSECTION=2;class Wt extends Ht{constructor(){super()}static nearestEndpoint(t,e,s,n){let i=t,r=Y.pointToSegment(t,s,n),o=Y.pointToSegment(e,s,n);return o<r&&(r=o,i=e),o=Y.pointToSegment(s,t,e),o<r&&(r=o,i=s),o=Y.pointToSegment(n,t,e),o<r&&(r=o,i=n),i}isInSegmentEnvelopes(t){const e=new P(this._inputLines[0][0],this._inputLines[0][1]),s=new P(this._inputLines[1][0],this._inputLines[1][1]);return e.contains(t)&&s.contains(t)}computeIntersection(){if(3!==arguments.length)return super.computeIntersection.apply(this,arguments);{const t=arguments[0],e=arguments[1],s=arguments[2];if(this._isProper=!1,P.intersects(e,s,t)&&0===F.index(e,s,t)&&0===F.index(s,e,t))return this._isProper=!0,(t.equals(e)||t.equals(s))&&(this._isProper=!1),this._result=Ht.POINT_INTERSECTION,null;this._result=Ht.NO_INTERSECTION}}intersection(t,e,s,n){let i=this.intersectionSafe(t,e,s,n);return this.isInSegmentEnvelopes(i)||(i=new p(Wt.nearestEndpoint(t,e,s,n))),null!==this._precisionModel&&this._precisionModel.makePrecise(i),i}checkDD(t,e,s,n,i){const r=D.intersection(t,e,s,n),o=this.isInSegmentEnvelopes(r);q.out.println("DD in env = "+o+" --------------------- "+r),i.distance(r)>1e-4&&q.out.println("Distance = "+i.distance(r))}intersectionSafe(t,e,s,n){let i=G.intersection(t,e,s,n);return null===i&&(i=Wt.nearestEndpoint(t,e,s,n)),i}computeCollinearIntersection(t,e,s,n){const i=P.intersects(t,e,s),r=P.intersects(t,e,n),o=P.intersects(s,n,t),l=P.intersects(s,n,e);return i&&r?(this._intPt[0]=s,this._intPt[1]=n,Ht.COLLINEAR_INTERSECTION):o&&l?(this._intPt[0]=t,this._intPt[1]=e,Ht.COLLINEAR_INTERSECTION):i&&o?(this._intPt[0]=s,this._intPt[1]=t,!s.equals(t)||r||l?Ht.COLLINEAR_INTERSECTION:Ht.POINT_INTERSECTION):i&&l?(this._intPt[0]=s,this._intPt[1]=e,!s.equals(e)||r||o?Ht.COLLINEAR_INTERSECTION:Ht.POINT_INTERSECTION):r&&o?(this._intPt[0]=n,this._intPt[1]=t,!n.equals(t)||i||l?Ht.COLLINEAR_INTERSECTION:Ht.POINT_INTERSECTION):r&&l?(this._intPt[0]=n,this._intPt[1]=e,!n.equals(e)||i||o?Ht.COLLINEAR_INTERSECTION:Ht.POINT_INTERSECTION):Ht.NO_INTERSECTION}computeIntersect(t,e,s,n){if(this._isProper=!1,!P.intersects(t,e,s,n))return Ht.NO_INTERSECTION;const i=F.index(t,e,s),r=F.index(t,e,n);if(i>0&&r>0||i<0&&r<0)return Ht.NO_INTERSECTION;const o=F.index(s,n,t),l=F.index(s,n,e);if(o>0&&l>0||o<0&&l<0)return Ht.NO_INTERSECTION;return 0===i&&0===r&&0===o&&0===l?this.computeCollinearIntersection(t,e,s,n):(0===i||0===r||0===o||0===l?(this._isProper=!1,t.equals2D(s)||t.equals2D(n)?this._intPt[0]=t:e.equals2D(s)||e.equals2D(n)?this._intPt[0]=e:0===i?this._intPt[0]=new p(s):0===r?this._intPt[0]=new p(n):0===o?this._intPt[0]=new p(t):0===l&&(this._intPt[0]=new p(e))):(this._isProper=!0,this._intPt[0]=this.intersection(t,e,s,n)),Ht.POINT_INTERSECTION)}}class Zt{constructor(){Zt.constructor_.apply(this,arguments)}static constructor_(){if(this.p0=null,this.p1=null,0===arguments.length)Zt.constructor_.call(this,new p,new p);else if(1===arguments.length){const t=arguments[0];Zt.constructor_.call(this,t.p0,t.p1)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.p0=t,this.p1=e}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];Zt.constructor_.call(this,new p(t,e),new p(s,n))}}static midPoint(t,e){return new p((t.x+e.x)/2,(t.y+e.y)/2)}minX(){return Math.min(this.p0.x,this.p1.x)}orientationIndex(){if(arguments[0]instanceof Zt){const t=arguments[0],e=F.index(this.p0,this.p1,t.p0),s=F.index(this.p0,this.p1,t.p1);return e>=0&&s>=0||e<=0&&s<=0?Math.max(e,s):0}if(arguments[0]instanceof p){const t=arguments[0];return F.index(this.p0,this.p1,t)}}toGeometry(t){return t.createLineString([this.p0,this.p1])}isVertical(){return this.p0.x===this.p1.x}equals(t){if(!(t instanceof Zt))return!1;const e=t;return this.p0.equals(e.p0)&&this.p1.equals(e.p1)}intersection(t){const e=new Wt;return e.computeIntersection(this.p0,this.p1,t.p0,t.p1),e.hasIntersection()?e.getIntersection(0):null}project(){if(arguments[0]instanceof p){const t=arguments[0];if(t.equals(this.p0)||t.equals(this.p1))return new p(t);const e=this.projectionFactor(t),s=new p;return s.x=this.p0.x+e*(this.p1.x-this.p0.x),s.y=this.p0.y+e*(this.p1.y-this.p0.y),s}if(arguments[0]instanceof Zt){const t=arguments[0],e=this.projectionFactor(t.p0),s=this.projectionFactor(t.p1);if(e>=1&&s>=1)return null;if(e<=0&&s<=0)return null;let n=this.project(t.p0);e<0&&(n=this.p0),e>1&&(n=this.p1);let i=this.project(t.p1);return s<0&&(i=this.p0),s>1&&(i=this.p1),new Zt(n,i)}}normalize(){this.p1.compareTo(this.p0)<0&&this.reverse()}angle(){return Math.atan2(this.p1.y-this.p0.y,this.p1.x-this.p0.x)}getCoordinate(t){return 0===t?this.p0:this.p1}distancePerpendicular(t){return Y.pointToLinePerpendicular(t,this.p0,this.p1)}minY(){return Math.min(this.p0.y,this.p1.y)}midPoint(){return Zt.midPoint(this.p0,this.p1)}projectionFactor(t){if(t.equals(this.p0))return 0;if(t.equals(this.p1))return 1;const e=this.p1.x-this.p0.x,s=this.p1.y-this.p0.y,n=e*e+s*s;if(n<=0)return i.NaN;return((t.x-this.p0.x)*e+(t.y-this.p0.y)*s)/n}closestPoints(t){const e=this.intersection(t);if(null!==e)return[e,e];const s=new Array(2).fill(null);let n=i.MAX_VALUE,r=null;const o=this.closestPoint(t.p0);n=o.distance(t.p0),s[0]=o,s[1]=t.p0;const l=this.closestPoint(t.p1);r=l.distance(t.p1),r<n&&(n=r,s[0]=l,s[1]=t.p1);const a=t.closestPoint(this.p0);r=a.distance(this.p0),r<n&&(n=r,s[0]=this.p0,s[1]=a);const c=t.closestPoint(this.p1);return r=c.distance(this.p1),r<n&&(n=r,s[0]=this.p1,s[1]=c),s}closestPoint(t){const e=this.projectionFactor(t);if(e>0&&e<1)return this.project(t);return this.p0.distance(t)<this.p1.distance(t)?this.p0:this.p1}maxX(){return Math.max(this.p0.x,this.p1.x)}getLength(){return this.p0.distance(this.p1)}compareTo(t){const e=t,s=this.p0.compareTo(e.p0);return 0!==s?s:this.p1.compareTo(e.p1)}reverse(){const t=this.p0;this.p0=this.p1,this.p1=t}equalsTopo(t){return this.p0.equals(t.p0)&&this.p1.equals(t.p1)||this.p0.equals(t.p1)&&this.p1.equals(t.p0)}lineIntersection(t){return G.intersection(this.p0,this.p1,t.p0,t.p1)}maxY(){return Math.max(this.p0.y,this.p1.y)}pointAlongOffset(t,e){const s=this.p0.x+t*(this.p1.x-this.p0.x),n=this.p0.y+t*(this.p1.y-this.p0.y),i=this.p1.x-this.p0.x,r=this.p1.y-this.p0.y,o=Math.sqrt(i*i+r*r);let l=0,a=0;if(0!==e){if(o<=0)throw new IllegalStateException("Cannot compute offset from zero-length line segment");l=e*i/o,a=e*r/o}return new p(s-a,n+l)}setCoordinates(){if(1===arguments.length){const t=arguments[0];this.setCoordinates(t.p0,t.p1)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.p0.x=t.x,this.p0.y=t.y,this.p1.x=e.x,this.p1.y=e.y}}segmentFraction(t){let e=this.projectionFactor(t);return e<0?e=0:(e>1||i.isNaN(e))&&(e=1),e}toString(){return"LINESTRING( "+this.p0.x+" "+this.p0.y+", "+this.p1.x+" "+this.p1.y+")"}isHorizontal(){return this.p0.y===this.p1.y}reflect(t){const e=this.p1.getY()-this.p0.getY(),s=this.p0.getX()-this.p1.getX(),n=this.p0.getY()*(this.p1.getX()-this.p0.getX())-this.p0.getX()*(this.p1.getY()-this.p0.getY()),i=e*e+s*s,r=e*e-s*s,o=t.getX(),l=t.getY();return new p((-r*o-2*e*s*l-2*e*n)/i,(r*l-2*e*s*o-2*s*n)/i)}distance(){if(arguments[0]instanceof Zt){const t=arguments[0];return Y.segmentToSegment(this.p0,this.p1,t.p0,t.p1)}if(arguments[0]instanceof p){const t=arguments[0];return Y.pointToSegment(t,this.p0,this.p1)}}pointAlong(t){const e=new p;return e.x=this.p0.x+t*(this.p1.x-this.p0.x),e.y=this.p0.y+t*(this.p1.y-this.p0.y),e}hashCode(){let t=i.doubleToLongBits(this.p0.x);t^=31*i.doubleToLongBits(this.p0.y);const e=Math.trunc(t)^Math.trunc(t>>32);let s=i.doubleToLongBits(this.p1.x);s^=31*i.doubleToLongBits(this.p1.y);return e^(Math.trunc(s)^Math.trunc(s>>32))}get interfaces_(){return[r,a]}}class jt{static toLocationSymbol(t){switch(t){case jt.EXTERIOR:return"e";case jt.BOUNDARY:return"b";case jt.INTERIOR:return"i";case jt.NONE:return"-"}throw new s("Unknown location value: "+t)}}jt.INTERIOR=0,jt.BOUNDARY=1,jt.EXTERIOR=2,jt.NONE=-1;class Kt{constructor(){Kt.constructor_.apply(this,arguments)}static constructor_(){if(this._matrix=null,0===arguments.length)this._matrix=Array(3).fill().map((()=>Array(3))),this.setAll(j.FALSE);else if(1===arguments.length)if("string"==typeof arguments[0]){const t=arguments[0];Kt.constructor_.call(this),this.set(t)}else if(arguments[0]instanceof Kt){const t=arguments[0];Kt.constructor_.call(this),this._matrix[jt.INTERIOR][jt.INTERIOR]=t._matrix[jt.INTERIOR][jt.INTERIOR],this._matrix[jt.INTERIOR][jt.BOUNDARY]=t._matrix[jt.INTERIOR][jt.BOUNDARY],this._matrix[jt.INTERIOR][jt.EXTERIOR]=t._matrix[jt.INTERIOR][jt.EXTERIOR],this._matrix[jt.BOUNDARY][jt.INTERIOR]=t._matrix[jt.BOUNDARY][jt.INTERIOR],this._matrix[jt.BOUNDARY][jt.BOUNDARY]=t._matrix[jt.BOUNDARY][jt.BOUNDARY],this._matrix[jt.BOUNDARY][jt.EXTERIOR]=t._matrix[jt.BOUNDARY][jt.EXTERIOR],this._matrix[jt.EXTERIOR][jt.INTERIOR]=t._matrix[jt.EXTERIOR][jt.INTERIOR],this._matrix[jt.EXTERIOR][jt.BOUNDARY]=t._matrix[jt.EXTERIOR][jt.BOUNDARY],this._matrix[jt.EXTERIOR][jt.EXTERIOR]=t._matrix[jt.EXTERIOR][jt.EXTERIOR]}}static matches(){if(Number.isInteger(arguments[0])&&"string"==typeof arguments[1]){const t=arguments[0],e=arguments[1];return e===j.SYM_DONTCARE||(e===j.SYM_TRUE&&(t>=0||t===j.TRUE)||(e===j.SYM_FALSE&&t===j.FALSE||(e===j.SYM_P&&t===j.P||(e===j.SYM_L&&t===j.L||e===j.SYM_A&&t===j.A))))}if("string"==typeof arguments[0]&&"string"==typeof arguments[1]){const t=arguments[1];return new Kt(arguments[0]).matches(t)}}static isTrue(t){return t>=0||t===j.TRUE}isIntersects(){return!this.isDisjoint()}isCovers(){return(Kt.isTrue(this._matrix[jt.INTERIOR][jt.INTERIOR])||Kt.isTrue(this._matrix[jt.INTERIOR][jt.BOUNDARY])||Kt.isTrue(this._matrix[jt.BOUNDARY][jt.INTERIOR])||Kt.isTrue(this._matrix[jt.BOUNDARY][jt.BOUNDARY]))&&this._matrix[jt.EXTERIOR][jt.INTERIOR]===j.FALSE&&this._matrix[jt.EXTERIOR][jt.BOUNDARY]===j.FALSE}isCoveredBy(){return(Kt.isTrue(this._matrix[jt.INTERIOR][jt.INTERIOR])||Kt.isTrue(this._matrix[jt.INTERIOR][jt.BOUNDARY])||Kt.isTrue(this._matrix[jt.BOUNDARY][jt.INTERIOR])||Kt.isTrue(this._matrix[jt.BOUNDARY][jt.BOUNDARY]))&&this._matrix[jt.INTERIOR][jt.EXTERIOR]===j.FALSE&&this._matrix[jt.BOUNDARY][jt.EXTERIOR]===j.FALSE}set(){if(1===arguments.length){const t=arguments[0];for(let e=0;e<t.length;e++){const s=Math.trunc(e/3),n=e%3;this._matrix[s][n]=j.toDimensionValue(t.charAt(e))}}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._matrix[t][e]=s}}isContains(){return Kt.isTrue(this._matrix[jt.INTERIOR][jt.INTERIOR])&&this._matrix[jt.EXTERIOR][jt.INTERIOR]===j.FALSE&&this._matrix[jt.EXTERIOR][jt.BOUNDARY]===j.FALSE}setAtLeast(){if(1===arguments.length){const t=arguments[0];for(let e=0;e<t.length;e++){const s=Math.trunc(e/3),n=e%3;this.setAtLeast(s,n,j.toDimensionValue(t.charAt(e)))}}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._matrix[t][e]<s&&(this._matrix[t][e]=s)}}setAtLeastIfValid(t,e,s){t>=0&&e>=0&&this.setAtLeast(t,e,s)}isWithin(){return Kt.isTrue(this._matrix[jt.INTERIOR][jt.INTERIOR])&&this._matrix[jt.INTERIOR][jt.EXTERIOR]===j.FALSE&&this._matrix[jt.BOUNDARY][jt.EXTERIOR]===j.FALSE}isTouches(t,e){return t>e?this.isTouches(e,t):(t===j.A&&e===j.A||t===j.L&&e===j.L||t===j.L&&e===j.A||t===j.P&&e===j.A||t===j.P&&e===j.L)&&(this._matrix[jt.INTERIOR][jt.INTERIOR]===j.FALSE&&(Kt.isTrue(this._matrix[jt.INTERIOR][jt.BOUNDARY])||Kt.isTrue(this._matrix[jt.BOUNDARY][jt.INTERIOR])||Kt.isTrue(this._matrix[jt.BOUNDARY][jt.BOUNDARY])))}isOverlaps(t,e){return t===j.P&&e===j.P||t===j.A&&e===j.A?Kt.isTrue(this._matrix[jt.INTERIOR][jt.INTERIOR])&&Kt.isTrue(this._matrix[jt.INTERIOR][jt.EXTERIOR])&&Kt.isTrue(this._matrix[jt.EXTERIOR][jt.INTERIOR]):t===j.L&&e===j.L&&(1===this._matrix[jt.INTERIOR][jt.INTERIOR]&&Kt.isTrue(this._matrix[jt.INTERIOR][jt.EXTERIOR])&&Kt.isTrue(this._matrix[jt.EXTERIOR][jt.INTERIOR]))}isEquals(t,e){return t===e&&(Kt.isTrue(this._matrix[jt.INTERIOR][jt.INTERIOR])&&this._matrix[jt.INTERIOR][jt.EXTERIOR]===j.FALSE&&this._matrix[jt.BOUNDARY][jt.EXTERIOR]===j.FALSE&&this._matrix[jt.EXTERIOR][jt.INTERIOR]===j.FALSE&&this._matrix[jt.EXTERIOR][jt.BOUNDARY]===j.FALSE)}toString(){const t=new dt("123456789");for(let e=0;e<3;e++)for(let s=0;s<3;s++)t.setCharAt(3*e+s,j.toDimensionSymbol(this._matrix[e][s]));return t.toString()}setAll(t){for(let e=0;e<3;e++)for(let s=0;s<3;s++)this._matrix[e][s]=t}get(t,e){return this._matrix[t][e]}transpose(){let t=this._matrix[1][0];return this._matrix[1][0]=this._matrix[0][1],this._matrix[0][1]=t,t=this._matrix[2][0],this._matrix[2][0]=this._matrix[0][2],this._matrix[0][2]=t,t=this._matrix[2][1],this._matrix[2][1]=this._matrix[1][2],this._matrix[1][2]=t,this}matches(t){if(9!==t.length)throw new s("Should be length 9: "+t);for(let e=0;e<3;e++)for(let s=0;s<3;s++)if(!Kt.matches(this._matrix[e][s],t.charAt(3*e+s)))return!1;return!0}add(t){for(let e=0;e<3;e++)for(let s=0;s<3;s++)this.setAtLeast(e,s,t.get(e,s))}isDisjoint(){return this._matrix[jt.INTERIOR][jt.INTERIOR]===j.FALSE&&this._matrix[jt.INTERIOR][jt.BOUNDARY]===j.FALSE&&this._matrix[jt.BOUNDARY][jt.INTERIOR]===j.FALSE&&this._matrix[jt.BOUNDARY][jt.BOUNDARY]===j.FALSE}isCrosses(t,e){return t===j.P&&e===j.L||t===j.P&&e===j.A||t===j.L&&e===j.A?Kt.isTrue(this._matrix[jt.INTERIOR][jt.INTERIOR])&&Kt.isTrue(this._matrix[jt.INTERIOR][jt.EXTERIOR]):t===j.L&&e===j.P||t===j.A&&e===j.P||t===j.A&&e===j.L?Kt.isTrue(this._matrix[jt.INTERIOR][jt.INTERIOR])&&Kt.isTrue(this._matrix[jt.EXTERIOR][jt.INTERIOR]):t===j.L&&e===j.L&&0===this._matrix[jt.INTERIOR][jt.INTERIOR]}get interfaces_(){return[o]}}class Qt{static toDegrees(t){return 180*t/Math.PI}static normalize(t){for(;t>Math.PI;)t-=Qt.PI_TIMES_2;for(;t<=-Math.PI;)t+=Qt.PI_TIMES_2;return t}static angle(){if(1===arguments.length){const t=arguments[0];return Math.atan2(t.y,t.x)}if(2===arguments.length){const t=arguments[0],e=arguments[1],s=e.x-t.x,n=e.y-t.y;return Math.atan2(n,s)}}static isAcute(t,e,s){const n=t.x-e.x,i=t.y-e.y;return n*(s.x-e.x)+i*(s.y-e.y)>0}static isObtuse(t,e,s){const n=t.x-e.x,i=t.y-e.y;return n*(s.x-e.x)+i*(s.y-e.y)<0}static interiorAngle(t,e,s){const n=Qt.angle(e,t),i=Qt.angle(e,s);return Math.abs(i-n)}static normalizePositive(t){if(t<0){for(;t<0;)t+=Qt.PI_TIMES_2;t>=Qt.PI_TIMES_2&&(t=0)}else{for(;t>=Qt.PI_TIMES_2;)t-=Qt.PI_TIMES_2;t<0&&(t=0)}return t}static angleBetween(t,e,s){const n=Qt.angle(e,t),i=Qt.angle(e,s);return Qt.diff(n,i)}static diff(t,e){let s=null;return s=t<e?e-t:t-e,s>Math.PI&&(s=2*Math.PI-s),s}static toRadians(t){return t*Math.PI/180}static getTurn(t,e){const s=Math.sin(e-t);return s>0?Qt.COUNTERCLOCKWISE:s<0?Qt.CLOCKWISE:Qt.NONE}static angleBetweenOriented(t,e,s){const n=Qt.angle(e,t),i=Qt.angle(e,s)-n;return i<=-Math.PI?i+Qt.PI_TIMES_2:i>Math.PI?i-Qt.PI_TIMES_2:i}}Qt.PI_TIMES_2=2*Math.PI,Qt.PI_OVER_2=Math.PI/2,Qt.PI_OVER_4=Math.PI/4,Qt.COUNTERCLOCKWISE=F.COUNTERCLOCKWISE,Qt.CLOCKWISE=F.CLOCKWISE,Qt.NONE=F.COLLINEAR;class Jt extends e{constructor(){super(),Jt.constructor_.apply(this,arguments)}static constructor_(){e.constructor_.call(this,"Projective point not representable on the Cartesian plane.")}}class $t{constructor(){$t.constructor_.apply(this,arguments)}static constructor_(){if(this.x=null,this.y=null,this.w=null,0===arguments.length)this.x=0,this.y=0,this.w=1;else if(1===arguments.length){const t=arguments[0];this.x=t.x,this.y=t.y,this.w=1}else if(2===arguments.length){if("number"==typeof arguments[0]&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1];this.x=t,this.y=e,this.w=1}else if(arguments[0]instanceof $t&&arguments[1]instanceof $t){const t=arguments[0],e=arguments[1];this.x=t.y*e.w-e.y*t.w,this.y=e.x*t.w-t.x*e.w,this.w=t.x*e.y-e.x*t.y}else if(arguments[0]instanceof p&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1];this.x=t.y-e.y,this.y=e.x-t.x,this.w=t.x*e.y-e.x*t.y}}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this.x=t,this.y=e,this.w=s}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=t.y-e.y,r=e.x-t.x,o=t.x*e.y-e.x*t.y,l=s.y-n.y,a=n.x-s.x,c=s.x*n.y-n.x*s.y;this.x=r*c-a*o,this.y=l*o-i*c,this.w=i*a-l*r}}getY(){const t=this.y/this.w;if(i.isNaN(t)||i.isInfinite(t))throw new Jt;return t}getX(){const t=this.x/this.w;if(i.isNaN(t)||i.isInfinite(t))throw new Jt;return t}getCoordinate(){const t=new p;return t.x=this.getX(),t.y=this.getY(),t}}class te{constructor(){te.constructor_.apply(this,arguments)}static constructor_(){this.p0=null,this.p1=null,this.p2=null;const t=arguments[0],e=arguments[1],s=arguments[2];this.p0=t,this.p1=e,this.p2=s}static area(t,e,s){return Math.abs(((s.x-t.x)*(e.y-t.y)-(e.x-t.x)*(s.y-t.y))/2)}static signedArea(t,e,s){return((s.x-t.x)*(e.y-t.y)-(e.x-t.x)*(s.y-t.y))/2}static det(t,e,s,n){return t*n-e*s}static interpolateZ(t,e,s,n){const i=e.x,r=e.y,o=s.x-i,l=n.x-i,a=s.y-r,c=n.y-r,h=o*c-l*a,u=t.x-i,g=t.y-r,d=(c*u-l*g)/h,_=(-a*u+o*g)/h;return e.getZ()+d*(s.getZ()-e.getZ())+_*(n.getZ()-e.getZ())}static longestSideLength(t,e,s){const n=t.distance(e),i=e.distance(s),r=s.distance(t);let o=n;return i>o&&(o=i),r>o&&(o=r),o}static circumcentreDD(t,e,s){const n=b.valueOf(t.x).subtract(s.x),i=b.valueOf(t.y).subtract(s.y),r=b.valueOf(e.x).subtract(s.x),o=b.valueOf(e.y).subtract(s.y),l=b.determinant(n,i,r,o).multiply(2),a=n.sqr().add(i.sqr()),c=r.sqr().add(o.sqr()),h=b.determinant(i,a,o,c),u=b.determinant(n,a,r,c),g=b.valueOf(s.x).subtract(h.divide(l)).doubleValue(),d=b.valueOf(s.y).add(u.divide(l)).doubleValue();return new p(g,d)}static isAcute(t,e,s){return!!Qt.isAcute(t,e,s)&&(!!Qt.isAcute(e,s,t)&&!!Qt.isAcute(s,t,e))}static circumcentre(t,e,s){const n=s.x,i=s.y,r=t.x-n,o=t.y-i,l=e.x-n,a=e.y-i,c=2*te.det(r,o,l,a),h=te.det(o,r*r+o*o,a,l*l+a*a),u=te.det(r,r*r+o*o,l,l*l+a*a);return new p(n-h/c,i+u/c)}static perpendicularBisector(t,e){const s=e.x-t.x,n=e.y-t.y,i=new $t(t.x+s/2,t.y+n/2,1),r=new $t(t.x-n+s/2,t.y+s+n/2,1);return new $t(i,r)}static angleBisector(t,e,s){const n=e.distance(t),i=n/(n+e.distance(s)),r=s.x-t.x,o=s.y-t.y;return new p(t.x+i*r,t.y+i*o)}static area3D(t,e,s){const n=e.x-t.x,i=e.y-t.y,r=e.getZ()-t.getZ(),o=s.x-t.x,l=s.y-t.y,a=s.getZ()-t.getZ(),c=i*a-r*l,h=r*o-n*a,u=n*l-i*o,g=c*c+h*h+u*u;return Math.sqrt(g)/2}static centroid(t,e,s){const n=(t.x+e.x+s.x)/3,i=(t.y+e.y+s.y)/3;return new p(n,i)}static inCentre(t,e,s){const n=e.distance(s),i=t.distance(s),r=t.distance(e),o=n+i+r,l=(n*t.x+i*e.x+r*s.x)/o,a=(n*t.y+i*e.y+r*s.y)/o;return new p(l,a)}area(){return te.area(this.p0,this.p1,this.p2)}signedArea(){return te.signedArea(this.p0,this.p1,this.p2)}interpolateZ(t){if(null===t)throw new s("Supplied point is null.");return te.interpolateZ(t,this.p0,this.p1,this.p2)}longestSideLength(){return te.longestSideLength(this.p0,this.p1,this.p2)}isAcute(){return te.isAcute(this.p0,this.p1,this.p2)}circumcentre(){return te.circumcentre(this.p0,this.p1,this.p2)}area3D(){return te.area3D(this.p0,this.p1,this.p2)}centroid(){return te.centroid(this.p0,this.p1,this.p2)}inCentre(){return te.inCentre(this.p0,this.p1,this.p2)}}class ee extends e{constructor(){super(),ee.constructor_.apply(this,arguments)}static constructor_(){if(0===arguments.length)e.constructor_.call(this);else if(1===arguments.length){const t=arguments[0];e.constructor_.call(this,t)}}}class se{constructor(){se.constructor_.apply(this,arguments)}static constructor_(){if(this._m00=null,this._m01=null,this._m02=null,this._m10=null,this._m11=null,this._m12=null,0===arguments.length)this.setToIdentity();else if(1===arguments.length){if(arguments[0]instanceof Array){const t=arguments[0];this._m00=t[0],this._m01=t[1],this._m02=t[2],this._m10=t[3],this._m11=t[4],this._m12=t[5]}else if(arguments[0]instanceof se){const t=arguments[0];this.setTransformation(t)}}else if(6===arguments.length&&"number"==typeof arguments[5]&&"number"==typeof arguments[4]&&"number"==typeof arguments[3]&&"number"==typeof arguments[2]&&"number"==typeof arguments[0]&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=arguments[4],r=arguments[5];this.setTransformation(t,e,s,n,i,r)}}static translationInstance(t,e){const s=new se;return s.setToTranslation(t,e),s}static shearInstance(t,e){const s=new se;return s.setToShear(t,e),s}static reflectionInstance(){if(2===arguments.length){const t=arguments[0],e=arguments[1],s=new se;return s.setToReflection(t,e),s}if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=new se;return i.setToReflection(t,e,s,n),i}}static rotationInstance(){if(1===arguments.length){const t=arguments[0];return se.rotationInstance(Math.sin(t),Math.cos(t))}if(2===arguments.length){const t=arguments[0],e=arguments[1],s=new se;return s.setToRotation(t,e),s}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];return se.rotationInstance(Math.sin(t),Math.cos(t),e,s)}if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=new se;return i.setToRotation(t,e,s,n),i}}static scaleInstance(){if(2===arguments.length){const t=arguments[0],e=arguments[1],s=new se;return s.setToScale(t,e),s}if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=new se;return i.translate(-s,-n),i.scale(t,e),i.translate(s,n),i}}setToReflectionBasic(t,e,n,i){if(t===n&&e===i)throw new s("Reflection line points must be distinct");const r=n-t,o=i-e,l=Math.sqrt(r*r+o*o),a=o/l,c=r/l,h=2*a*c,u=c*c-a*a;return this._m00=u,this._m01=h,this._m02=0,this._m10=h,this._m11=-u,this._m12=0,this}getInverse(){const t=this.getDeterminant();if(0===t)throw new ee("Transformation is non-invertible");const e=this._m11/t,s=-this._m10/t,n=-this._m01/t,i=this._m00/t,r=(this._m01*this._m12-this._m02*this._m11)/t,o=(-this._m00*this._m12+this._m10*this._m02)/t;return new se(e,n,r,s,i,o)}compose(t){const e=t._m00*this._m00+t._m01*this._m10,s=t._m00*this._m01+t._m01*this._m11,n=t._m00*this._m02+t._m01*this._m12+t._m02,i=t._m10*this._m00+t._m11*this._m10,r=t._m10*this._m01+t._m11*this._m11,o=t._m10*this._m02+t._m11*this._m12+t._m12;return this._m00=e,this._m01=s,this._m02=n,this._m10=i,this._m11=r,this._m12=o,this}equals(t){if(null===t)return!1;if(!(t instanceof se))return!1;const e=t;return this._m00===e._m00&&this._m01===e._m01&&this._m02===e._m02&&this._m10===e._m10&&this._m11===e._m11&&this._m12===e._m12}setToScale(t,e){return this._m00=t,this._m01=0,this._m02=0,this._m10=0,this._m11=e,this._m12=0,this}isIdentity(){return 1===this._m00&&0===this._m01&&0===this._m02&&0===this._m10&&1===this._m11&&0===this._m12}scale(t,e){return this.compose(se.scaleInstance(t,e)),this}setToIdentity(){return this._m00=1,this._m01=0,this._m02=0,this._m10=0,this._m11=1,this._m12=0,this}isGeometryChanged(){return!0}setTransformation(){if(1===arguments.length){const t=arguments[0];return this._m00=t._m00,this._m01=t._m01,this._m02=t._m02,this._m10=t._m10,this._m11=t._m11,this._m12=t._m12,this}if(6===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=arguments[4],r=arguments[5];return this._m00=t,this._m01=e,this._m02=s,this._m10=n,this._m11=i,this._m12=r,this}}setToRotation(){if(1===arguments.length){const t=arguments[0];return this.setToRotation(Math.sin(t),Math.cos(t)),this}if(2===arguments.length){const t=arguments[0],e=arguments[1];return this._m00=e,this._m01=-t,this._m02=0,this._m10=t,this._m11=e,this._m12=0,this}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];return this.setToRotation(Math.sin(t),Math.cos(t),e,s),this}if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];return this._m00=e,this._m01=-t,this._m02=s-s*e+n*t,this._m10=t,this._m11=e,this._m12=n-s*t-n*e,this}}getMatrixEntries(){return[this._m00,this._m01,this._m02,this._m10,this._m11,this._m12]}filter(t,e){this.transform(t,e)}rotate(){if(1===arguments.length){const t=arguments[0];return this.compose(se.rotationInstance(t)),this}if(2===arguments.length){const t=arguments[0],e=arguments[1];return this.compose(se.rotationInstance(t,e)),this}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];return this.compose(se.rotationInstance(t,e,s)),this}if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];return this.compose(se.rotationInstance(t,e,s,n)),this}}getDeterminant(){return this._m00*this._m11-this._m01*this._m10}composeBefore(t){const e=this._m00*t._m00+this._m01*t._m10,s=this._m00*t._m01+this._m01*t._m11,n=this._m00*t._m02+this._m01*t._m12+this._m02,i=this._m10*t._m00+this._m11*t._m10,r=this._m10*t._m01+this._m11*t._m11,o=this._m10*t._m02+this._m11*t._m12+this._m12;return this._m00=e,this._m01=s,this._m02=n,this._m10=i,this._m11=r,this._m12=o,this}setToShear(t,e){return this._m00=1,this._m01=t,this._m02=0,this._m10=e,this._m11=1,this._m12=0,this}isDone(){return!1}clone(){try{return null}catch(t){if(!(t instanceof e))throw t;u.shouldNeverReachHere()}return null}translate(t,e){return this.compose(se.translationInstance(t,e)),this}setToReflection(){if(2===arguments.length){const t=arguments[0],e=arguments[1];if(0===t&&0===e)throw new s("Reflection vector must be non-zero");if(t===e)return this._m00=0,this._m01=1,this._m02=0,this._m10=1,this._m11=0,this._m12=0,this;const n=Math.sqrt(t*t+e*e),i=e/n,r=t/n;return this.rotate(-i,r),this.scale(1,-1),this.rotate(i,r),this}if(4===arguments.length){const t=arguments[0],e=arguments[1],n=arguments[2],i=arguments[3];if(t===n&&e===i)throw new s("Reflection line points must be distinct");this.setToTranslation(-t,-e);const r=n-t,o=i-e,l=Math.sqrt(r*r+o*o),a=o/l,c=r/l;return this.rotate(-a,c),this.scale(1,-1),this.rotate(a,c),this.translate(t,e),this}}toString(){return"AffineTransformation[["+this._m00+", "+this._m01+", "+this._m02+"], ["+this._m10+", "+this._m11+", "+this._m12+"]]"}setToTranslation(t,e){return this._m00=1,this._m01=0,this._m02=t,this._m10=0,this._m11=1,this._m12=e,this}shear(t,e){return this.compose(se.shearInstance(t,e)),this}transform(){if(1===arguments.length){const t=arguments[0].copy();return t.apply(this),t}if(2===arguments.length){if(arguments[0]instanceof p&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1],s=this._m00*t.x+this._m01*t.y+this._m02,n=this._m10*t.x+this._m11*t.y+this._m12;return e.x=s,e.y=n,e}if(E(arguments[0],A)&&Number.isInteger(arguments[1])){const t=arguments[0],e=arguments[1],s=this._m00*t.getOrdinate(e,0)+this._m01*t.getOrdinate(e,1)+this._m02,n=this._m10*t.getOrdinate(e,0)+this._m11*t.getOrdinate(e,1)+this._m12;t.setOrdinate(e,0,s),t.setOrdinate(e,1,n)}}}reflect(){if(2===arguments.length){const t=arguments[0],e=arguments[1];return this.compose(se.reflectionInstance(t,e)),this}if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];return this.compose(se.reflectionInstance(t,e,s,n)),this}}get interfaces_(){return[o,R]}}class ne{static solve(t,e){const n=e.length;if(t.length!==n||t[0].length!==n)throw new s("Matrix A is incorrectly sized");for(let s=0;s<n;s++){let i=s;for(let e=s+1;e<n;e++)Math.abs(t[e][s])>Math.abs(t[i][s])&&(i=e);if(0===t[i][s])return null;ne.swapRows(t,s,i),ne.swapRows(e,s,i);for(let i=s+1;i<n;i++){const r=t[i][s]/t[s][s];for(let e=n-1;e>=s;e--)t[i][e]-=t[s][e]*r;e[i]-=e[s]*r}}const i=new Array(n).fill(null);for(let s=n-1;s>=0;s--){let r=0;for(let e=s+1;e<n;e++)r+=t[s][e]*i[e];i[s]=(e[s]-r)/t[s][s]}return i}static swapRows(){if(Number.isInteger(arguments[2])&&arguments[0]instanceof Array&&Number.isInteger(arguments[1])){const t=arguments[0],e=arguments[1],s=arguments[2];if(e===s)return null;for(let n=0;n<t[0].length;n++){const i=t[e][n];t[e][n]=t[s][n],t[s][n]=i}}else if(Number.isInteger(arguments[2])&&arguments[0]instanceof Array&&Number.isInteger(arguments[1])){const t=arguments[0],e=arguments[1],s=arguments[2];if(e===s)return null;const n=t[e];t[e]=t[s],t[s]=n}}}class ie{constructor(){ie.constructor_.apply(this,arguments)}static constructor_(){this._src0=null,this._src1=null,this._src2=null,this._dest0=null,this._dest1=null,this._dest2=null,this._m00=null,this._m01=null,this._m02=null,this._m10=null,this._m11=null,this._m12=null;const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=arguments[4],r=arguments[5];this._src0=t,this._src1=e,this._src2=s,this._dest0=n,this._dest1=i,this._dest2=r}solve(t){const e=[[this._src0.x,this._src0.y,1],[this._src1.x,this._src1.y,1],[this._src2.x,this._src2.y,1]];return ne.solve(e,t)}compute(){const t=[this._dest0.x,this._dest1.x,this._dest2.x],e=this.solve(t);if(null===e)return!1;this._m00=e[0],this._m01=e[1],this._m02=e[2];const s=[this._dest0.y,this._dest1.y,this._dest2.y],n=this.solve(s);return null!==n&&(this._m10=n[0],this._m11=n[1],this._m12=n[2],!0)}getTransformation(){return this.compute()?new se(this._m00,this._m01,this._m02,this._m10,this._m11,this._m12):null}}class re{static createFromBaseLines(t,e,s,n){const i=new p(t.x+n.x-s.x,t.y+n.y-s.y),r=Qt.angleBetweenOriented(e,t,i),o=e.distance(t),l=n.distance(s);if(0===o)return new se;const a=l/o,c=se.translationInstance(-t.x,-t.y);return c.rotate(r),c.scale(a,a),c.translate(s.x,s.y),c}static createFromControlVectors(){if(2===arguments.length){if(arguments[0]instanceof p&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1],s=e.x-t.x,n=e.y-t.y;return se.translationInstance(s,n)}if(arguments[0]instanceof Array&&arguments[1]instanceof Array){const t=arguments[0],e=arguments[1];if(t.length!==e.length)throw new s("Src and Dest arrays are not the same length");if(t.length<=0)throw new s("Too few control points");if(t.length>3)throw new s("Too many control points");return 1===t.length?re.createFromControlVectors(t[0],e[0]):2===t.length?re.createFromControlVectors(t[0],t[1],e[0],e[1]):re.createFromControlVectors(t[0],t[1],t[2],e[0],e[1],e[2])}}else{if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=new p(n.x-s.x,n.y-s.y),r=Qt.angleBetweenOriented(e,t,i),o=e.distance(t),l=n.distance(s);if(0===o)return null;const a=l/o,c=se.translationInstance(-t.x,-t.y);return c.rotate(r),c.scale(a,a),c.translate(s.x,s.y),c}if(6===arguments.length){return new ie(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]).getTransformation()}}}}class oe{constructor(){oe.constructor_.apply(this,arguments)}static constructor_(){this._coords=null;const t=arguments[0];this._coords=t}static getCoordinates(t){const e=new S;return t.apply(new oe(e)),e}filter(t){(t instanceof Q||t instanceof $)&&this._coords.add(t.getCoordinate())}get interfaces_(){return[z]}}class le{constructor(){le.constructor_.apply(this,arguments)}static constructor_(){this._mapOp=null;const t=arguments[0];this._mapOp=t}static map(t,e){return new le(e).map(t)}map(t){const e=new S;for(let s=0;s<t.getNumGeometries();s++){const n=this._mapOp.map(t.getGeometryN(s));n.isEmpty()||e.add(n)}return t.getFactory().createGeometryCollection(wt.toGeometryArray(e))}}class ae{constructor(){ae.constructor_.apply(this,arguments)}static constructor_(){this._geomFactory=null,this._skipEmpty=!1,this._inputGeoms=null;const t=arguments[0];this._geomFactory=ae.extractFactory(t),this._inputGeoms=t}static combine(){if(1===arguments.length){return new ae(arguments[0]).combine()}if(2===arguments.length){const t=arguments[0],e=arguments[1];return new ae(ae.createList(t,e)).combine()}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];return new ae(ae.createList(t,e,s)).combine()}}static extractFactory(t){return t.isEmpty()?null:t.iterator().next().getFactory()}static createList(){if(2===arguments.length){const t=arguments[0],e=arguments[1],s=new S;return s.add(t),s.add(e),s}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=new S;return n.add(t),n.add(e),n.add(s),n}}extractElements(t,e){if(null===t)return null;for(let s=0;s<t.getNumGeometries();s++){const n=t.getGeometryN(s);this._skipEmpty&&n.isEmpty()||e.add(n)}}combine(){const t=new S;for(let e=this._inputGeoms.iterator();e.hasNext();){const s=e.next();this.extractElements(s,t)}return 0===t.size()?null!==this._geomFactory?this._geomFactory.createGeometryCollection():null:this._geomFactory.buildGeometry(t)}}class ce{constructor(){ce.constructor_.apply(this,arguments)}static constructor_(){if(this._factory=null,this._isUserDataCopied=!1,0===arguments.length);else if(1===arguments.length){const t=arguments[0];this._factory=t}}setCopyUserData(t){this._isUserDataCopied=t}edit(t,e){if(null===t)return null;const s=this.editInternal(t,e);return this._isUserDataCopied&&s.setUserData(t.getUserData()),s}editInternal(t,e){return null===this._factory&&(this._factory=t.getFactory()),t instanceof at?this.editGeometryCollection(t,e):t instanceof nt?this.editPolygon(t,e):t instanceof $||t instanceof Q?e.edit(t,this._factory):(u.shouldNeverReachHere("Unsupported Geometry type: "+t.getGeometryType()),null)}editGeometryCollection(t,e){const s=e.edit(t,this._factory),n=new S;for(let t=0;t<s.getNumGeometries();t++){const i=this.edit(s.getGeometryN(t),e);null===i||i.isEmpty()||n.add(i)}return s.getGeometryType()===X.TYPENAME_MULTIPOINT?this._factory.createMultiPoint(n.toArray([])):s.getGeometryType()===X.TYPENAME_MULTILINESTRING?this._factory.createMultiLineString(n.toArray([])):s.getGeometryType()===X.TYPENAME_MULTIPOLYGON?this._factory.createMultiPolygon(n.toArray([])):this._factory.createGeometryCollection(n.toArray([]))}editPolygon(t,e){let s=e.edit(t,this._factory);if(null===s&&(s=this._factory.createPolygon()),s.isEmpty())return s;const n=this.edit(s.getExteriorRing(),e);if(null===n||n.isEmpty())return this._factory.createPolygon();const i=new S;for(let t=0;t<s.getNumInteriorRing();t++){const n=this.edit(s.getInteriorRingN(t),e);null===n||n.isEmpty()||i.add(n)}return this._factory.createPolygon(n,i.toArray([]))}}function he(){}ce.GeometryEditorOperation=he;ce.NoOpGeometryOperation=class{edit(t,e){return t}get interfaces_(){return[he]}},ce.CoordinateOperation=class{edit(t,e){const s=this.edit(t.getCoordinates(),t);return t instanceof ht?null===s?e.createLinearRing():e.createLinearRing(s):t instanceof Q?null===s?e.createLineString():e.createLineString(s):t instanceof $?null===s||0===s.length?e.createPoint():e.createPoint(s[0]):t}get interfaces_(){return[he]}},ce.CoordinateSequenceOperation=class{edit(t,e){return t instanceof ht?e.createLinearRing(this.edit(t.getCoordinateSequence(),t)):t instanceof Q?e.createLineString(this.edit(t.getCoordinateSequence(),t)):t instanceof $?e.createPoint(this.edit(t.getCoordinateSequence(),t)):t}get interfaces_(){return[he]}};class ue{constructor(){ue.constructor_.apply(this,arguments)}static constructor_(){this._geometryType=null,this._comps=null;const t=arguments[0],e=arguments[1];this._geometryType=t,this._comps=e}static isOfType(t,e){return t.getGeometryType()===e||e===X.TYPENAME_LINESTRING&&t.getGeometryType()===X.TYPENAME_LINEARRING}static extract(){if(2===arguments.length){const t=arguments[0],e=arguments[1];return ue.extract(t,e,new S)}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];return t.getGeometryType()===e?s.add(t):t instanceof at&&t.apply(new ue(e,s)),s}}filter(t){(null===this._geometryType||ue.isOfType(t,this._geometryType))&&this._comps.add(t)}get interfaces_(){return[K]}}class ge{static map(){if(arguments[0]instanceof X&&E(arguments[1],de)){const t=arguments[0],e=arguments[1],s=new S;for(let n=0;n<t.getNumGeometries();n++){const i=e.map(t.getGeometryN(n));null!==i&&s.add(i)}return t.getFactory().buildGeometry(s)}if(E(arguments[0],I)&&E(arguments[1],de)){const t=arguments[0],e=arguments[1],s=new S;for(let n=t.iterator();n.hasNext();){const t=n.next(),i=e.map(t);null!==i&&s.add(i)}return s}}}function de(){}ge.MapOp=de;class _e{constructor(){_e.constructor_.apply(this,arguments)}static constructor_(){this._inputGeom=null,this._factory=null,this._pruneEmptyGeometry=!0,this._preserveGeometryCollectionType=!0,this._preserveCollections=!1,this._preserveType=!1}transformPoint(t,e){return this._factory.createPoint(this.transformCoordinates(t.getCoordinateSequence(),t))}transformPolygon(t,e){let s=!0;const n=this.transformLinearRing(t.getExteriorRing(),t);null!==n&&n instanceof ht&&!n.isEmpty()||(s=!1);const i=new S;for(let e=0;e<t.getNumInteriorRing();e++){const n=this.transformLinearRing(t.getInteriorRingN(e),t);null===n||n.isEmpty()||(n instanceof ht||(s=!1),i.add(n))}if(s)return this._factory.createPolygon(n,i.toArray([]));{const t=new S;return null!==n&&t.add(n),t.addAll(i),this._factory.buildGeometry(t)}}createCoordinateSequence(t){return this._factory.getCoordinateSequenceFactory().create(t)}getInputGeometry(){return this._inputGeom}transformMultiLineString(t,e){const s=new S;for(let e=0;e<t.getNumGeometries();e++){const n=this.transformLineString(t.getGeometryN(e),t);null!==n&&(n.isEmpty()||s.add(n))}return this._factory.buildGeometry(s)}transformCoordinates(t,e){return this.copy(t)}transformLineString(t,e){return this._factory.createLineString(this.transformCoordinates(t.getCoordinateSequence(),t))}transformMultiPoint(t,e){const s=new S;for(let e=0;e<t.getNumGeometries();e++){const n=this.transformPoint(t.getGeometryN(e),t);null!==n&&(n.isEmpty()||s.add(n))}return this._factory.buildGeometry(s)}transformMultiPolygon(t,e){const s=new S;for(let e=0;e<t.getNumGeometries();e++){const n=this.transformPolygon(t.getGeometryN(e),t);null!==n&&(n.isEmpty()||s.add(n))}return this._factory.buildGeometry(s)}copy(t){return t.copy()}transformGeometryCollection(t,e){const s=new S;for(let e=0;e<t.getNumGeometries();e++){const n=this.transform(t.getGeometryN(e));null!==n&&(this._pruneEmptyGeometry&&n.isEmpty()||s.add(n))}return this._preserveGeometryCollectionType?this._factory.createGeometryCollection(wt.toGeometryArray(s)):this._factory.buildGeometry(s)}transform(t){if(this._inputGeom=t,this._factory=t.getFactory(),t instanceof $)return this.transformPoint(t,null);if(t instanceof ct)return this.transformMultiPoint(t,null);if(t instanceof ht)return this.transformLinearRing(t,null);if(t instanceof Q)return this.transformLineString(t,null);if(t instanceof Ct)return this.transformMultiLineString(t,null);if(t instanceof nt)return this.transformPolygon(t,null);if(t instanceof mt)return this.transformMultiPolygon(t,null);if(t instanceof at)return this.transformGeometryCollection(t,null);throw new s("Unknown Geometry subtype: "+t.getGeometryType())}transformLinearRing(t,e){const s=this.transformCoordinates(t.getCoordinateSequence(),t);if(null===s)return this._factory.createLinearRing(null);const n=s.size();return n>0&&n<4&&!this._preserveType?this._factory.createLineString(s):this._factory.createLinearRing(s)}}class pe{constructor(){pe.constructor_.apply(this,arguments)}static constructor_(){this._comps=null;const t=arguments[0];this._comps=t}static getGeometry(t){return t.getFactory().buildGeometry(pe.getLines(t))}static getLines(){if(1===arguments.length){const t=arguments[0];return pe.getLines(t,new S)}if(2===arguments.length){const t=arguments[0],e=arguments[1];return t instanceof Q?e.add(t):t instanceof at&&t.apply(new pe(e)),e}}filter(t){t instanceof Q&&this._comps.add(t)}get interfaces_(){return[K]}}class me{constructor(){me.constructor_.apply(this,arguments)}static constructor_(){if(this._lines=null,this._isForcedToLineString=!1,1===arguments.length){const t=arguments[0];this._lines=t}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._lines=t,this._isForcedToLineString=e}}static getGeometry(){if(1===arguments.length){const t=arguments[0];return t.getFactory().buildGeometry(me.getLines(t))}if(2===arguments.length){const t=arguments[0],e=arguments[1];return t.getFactory().buildGeometry(me.getLines(t,e))}}static getLines(){if(1===arguments.length){const t=arguments[0];return me.getLines(t,!1)}if(2===arguments.length){if(E(arguments[0],I)&&E(arguments[1],I)){const t=arguments[1];for(let e=arguments[0].iterator();e.hasNext();){const s=e.next();me.getLines(s,t)}return t}if(arguments[0]instanceof X&&"boolean"==typeof arguments[1]){const t=arguments[0],e=arguments[1],s=new S;return t.apply(new me(s,e)),s}if(arguments[0]instanceof X&&E(arguments[1],I)){const t=arguments[0],e=arguments[1];return t instanceof Q?e.add(t):t.apply(new me(e)),e}}else if(3===arguments.length){if("boolean"==typeof arguments[2]&&E(arguments[0],I)&&E(arguments[1],I)){const t=arguments[1],e=arguments[2];for(let s=arguments[0].iterator();s.hasNext();){const n=s.next();me.getLines(n,t,e)}return t}if("boolean"==typeof arguments[2]&&arguments[0]instanceof X&&E(arguments[1],I)){const t=arguments[1],e=arguments[2];return arguments[0].apply(new me(t,e)),t}}}filter(t){if(this._isForcedToLineString&&t instanceof ht){const e=t.getFactory().createLineString(t.getCoordinateSequence());return this._lines.add(e),null}t instanceof Q&&this._lines.add(t)}setForceToLineString(t){this._isForcedToLineString=t}get interfaces_(){return[z]}}const fe={reverseOrder:function(){return{compare:(t,e)=>e.compareTo(t)}},min:function(t){return fe.sort(t),t.get(0)},sort:function(t,e){const s=t.toArray();e?et.sort(s,e):et.sort(s);const n=t.iterator();for(let t=0,e=s.length;t<e;t++)n.next(),n.set(s[t])},singletonList:function(t){const e=new S;return e.add(t),e}};class ye{constructor(){ye.constructor_.apply(this,arguments)}static constructor_(){this._pts=null;const t=arguments[0];this._pts=t}static getPoints(){if(1===arguments.length){const t=arguments[0];return t instanceof $?fe.singletonList(t):ye.getPoints(t,new S)}if(2===arguments.length){const t=arguments[0],e=arguments[1];return t instanceof $?e.add(t):t instanceof at&&t.apply(new ye(e)),e}}filter(t){t instanceof $&&this._pts.add(t)}get interfaces_(){return[K]}}class xe{constructor(){xe.constructor_.apply(this,arguments)}static constructor_(){this._comps=null;const t=arguments[0];this._comps=t}static getPolygons(){if(1===arguments.length){const t=arguments[0];return xe.getPolygons(t,new S)}if(2===arguments.length){const t=arguments[0],e=arguments[1];return t instanceof nt?e.add(t):t instanceof at&&t.apply(new xe(e)),e}}filter(t){t instanceof nt&&this._comps.add(t)}get interfaces_(){return[K]}}class Ee{constructor(){Ee.constructor_.apply(this,arguments)}static constructor_(){this._isDone=!1}applyTo(t){for(let e=0;e<t.getNumGeometries()&&!this._isDone;e++){const s=t.getGeometryN(e);if(s instanceof at)this.applyTo(s);else if(this.visit(s),this.isDone())return this._isDone=!0,null}}}class Ie{constructor(){Ie.constructor_.apply(this,arguments)}static constructor_(){if(this._geomFact=null,this._precModel=null,this._dim=new Ne,this._nPts=100,this._rotationAngle=0,0===arguments.length)Ie.constructor_.call(this,new wt);else if(1===arguments.length){const t=arguments[0];this._geomFact=t,this._precModel=t.getPrecisionModel()}}createSupercircle(t){const e=1/t,s=this._dim.getMinSize()/2,n=this._dim.getCentre(),i=Math.pow(s,t),r=s,o=Math.pow(i/2,e),l=Math.trunc(this._nPts/8),a=new Array(8*l+1).fill(null),c=o/l;for(let s=0;s<=l;s++){let o=0,h=r;if(0!==s){o=c*s;const n=Math.pow(o,t);h=Math.pow(i-n,e)}a[s]=this.coordTrans(o,h,n),a[2*l-s]=this.coordTrans(h,o,n),a[2*l+s]=this.coordTrans(h,-o,n),a[4*l-s]=this.coordTrans(o,-h,n),a[4*l+s]=this.coordTrans(-o,-h,n),a[6*l-s]=this.coordTrans(-h,-o,n),a[6*l+s]=this.coordTrans(-h,o,n),a[8*l-s]=this.coordTrans(-o,h,n)}a[a.length-1]=new p(a[0]);const h=this._geomFact.createLinearRing(a),u=this._geomFact.createPolygon(h);return this.rotate(u)}setNumPoints(t){this._nPts=t}setBase(t){this._dim.setBase(t)}setRotation(t){this._rotationAngle=t}setWidth(t){this._dim.setWidth(t)}createEllipse(){const t=this._dim.getEnvelope(),e=t.getWidth()/2,s=t.getHeight()/2,n=t.getMinX()+e,i=t.getMinY()+s,r=new Array(this._nPts+1).fill(null);let o=0;for(let t=0;t<this._nPts;t++){const l=t*(2*Math.PI/this._nPts),a=e*Math.cos(l)+n,c=s*Math.sin(l)+i;r[o++]=this.coord(a,c)}r[o]=new p(r[0]);const l=this._geomFact.createLinearRing(r),a=this._geomFact.createPolygon(l);return this.rotate(a)}coordTrans(t,e,s){return this.coord(t+s.x,e+s.y)}createSquircle(){return this.createSupercircle(4)}setEnvelope(t){this._dim.setEnvelope(t)}setCentre(t){this._dim.setCentre(t)}createArc(t,e){const s=this._dim.getEnvelope(),n=s.getWidth()/2,i=s.getHeight()/2,r=s.getMinX()+n,o=s.getMinY()+i;let l=e;(l<=0||l>2*Math.PI)&&(l=2*Math.PI);const a=l/(this._nPts-1),c=new Array(this._nPts).fill(null);let h=0;for(let e=0;e<this._nPts;e++){const s=t+e*a,l=n*Math.cos(s)+r,u=i*Math.sin(s)+o;c[h++]=this.coord(l,u)}const u=this._geomFact.createLineString(c);return this.rotate(u)}rotate(t){if(0!==this._rotationAngle){const e=se.rotationInstance(this._rotationAngle,this._dim.getCentre().x,this._dim.getCentre().y);t.apply(e)}return t}coord(t,e){const s=new p(t,e);return this._precModel.makePrecise(s),s}createArcPolygon(t,e){const s=this._dim.getEnvelope(),n=s.getWidth()/2,i=s.getHeight()/2,r=s.getMinX()+n,o=s.getMinY()+i;let l=e;(l<=0||l>2*Math.PI)&&(l=2*Math.PI);const a=l/(this._nPts-1),c=new Array(this._nPts+2).fill(null);let h=0;c[h++]=this.coord(r,o);for(let e=0;e<this._nPts;e++){const s=t+a*e,l=n*Math.cos(s)+r,u=i*Math.sin(s)+o;c[h++]=this.coord(l,u)}c[h++]=this.coord(r,o);const u=this._geomFact.createLinearRing(c),g=this._geomFact.createPolygon(u);return this.rotate(g)}createRectangle(){let t=null,e=0,s=Math.trunc(this._nPts/4);s<1&&(s=1);const n=this._dim.getEnvelope().getWidth()/s,i=this._dim.getEnvelope().getHeight()/s,r=new Array(4*s+1).fill(null),o=this._dim.getEnvelope();for(t=0;t<s;t++){const s=o.getMinX()+t*n,i=o.getMinY();r[e++]=this.coord(s,i)}for(t=0;t<s;t++){const s=o.getMaxX(),n=o.getMinY()+t*i;r[e++]=this.coord(s,n)}for(t=0;t<s;t++){const s=o.getMaxX()-t*n,i=o.getMaxY();r[e++]=this.coord(s,i)}for(t=0;t<s;t++){const s=o.getMinX(),n=o.getMaxY()-t*i;r[e++]=this.coord(s,n)}r[e++]=new p(r[0]);const l=this._geomFact.createLinearRing(r),a=this._geomFact.createPolygon(l);return this.rotate(a)}createCircle(){return this.createEllipse()}setHeight(t){this._dim.setHeight(t)}setSize(t){this._dim.setSize(t)}}class Ne{constructor(){Ne.constructor_.apply(this,arguments)}static constructor_(){this.base=null,this.centre=null,this.width=null,this.height=null}setBase(t){this.base=t}setWidth(t){this.width=t}getBase(){return this.base}getWidth(){return this.width}setEnvelope(t){this.width=t.getWidth(),this.height=t.getHeight(),this.base=new p(t.getMinX(),t.getMinY()),this.centre=new p(t.centre())}setCentre(t){this.centre=t}getMinSize(){return Math.min(this.width,this.height)}getEnvelope(){return null!==this.base?new P(this.base.x,this.base.x+this.width,this.base.y,this.base.y+this.height):null!==this.centre?new P(this.centre.x-this.width/2,this.centre.x+this.width/2,this.centre.y-this.height/2,this.centre.y+this.height/2):new P(0,this.width,0,this.height)}getCentre(){return null===this.centre&&(this.centre=new p(this.base.x+this.width/2,this.base.y+this.height/2)),this.centre}getHeight(){return this.height}setHeight(t){this.height=t}setSize(t){this.height=t,this.width=t}}Ie.Dimensions=Ne;class Ce extends Ie{constructor(){super(),Ce.constructor_.apply(this,arguments)}static constructor_(){if(this._numArms=8,this._armLengthRatio=.5,0===arguments.length)Ie.constructor_.call(this);else if(1===arguments.length){const t=arguments[0];Ie.constructor_.call(this,t)}}static create(t,e,s,n,i){const r=new Ce;r.setCentre(t),r.setSize(e),r.setNumPoints(s),r.setArmLengthRatio(i),r.setNumArms(n);return r.createSineStar()}setNumArms(t){this._numArms=t}setArmLengthRatio(t){this._armLengthRatio=t}createSineStar(){const t=this._dim.getEnvelope(),e=t.getWidth()/2;let s=this._armLengthRatio;s<0&&(s=0),s>1&&(s=1);const n=s*e,i=(1-s)*e,r=t.getMinX()+e,o=t.getMinY()+e,l=new Array(this._nPts+1).fill(null);let a=0;for(let t=0;t<this._nPts;t++){const e=t/this._nPts*this._numArms,s=e-Math.floor(e),c=2*Math.PI*s,h=i+n*((Math.cos(c)+1)/2),u=t*(2*Math.PI/this._nPts),g=h*Math.cos(u)+r,d=h*Math.sin(u)+o;l[a++]=this.coord(g,d)}l[a]=new p(l[0]);const c=this._geomFact.createLinearRing(l);return this._geomFact.createPolygon(c)}}var we=Object.freeze({__proto__:null,AffineTransformation:se,AffineTransformationBuilder:ie,AffineTransformationFactory:re,ComponentCoordinateExtracter:oe,GeometryCollectionMapper:le,GeometryCombiner:ae,GeometryEditor:ce,GeometryExtracter:ue,GeometryMapper:ge,GeometryTransformer:_e,LineStringExtracter:pe,LinearComponentExtracter:me,PointExtracter:ye,PolygonExtracter:xe,ShortCircuitedGeometryVisitor:Ee,SineStarFactory:Ce}),Se=Object.freeze({__proto__:null,Coordinate:p,CoordinateXY:f,CoordinateXYM:y,CoordinateXYZM:x,CoordinateList:T,CoordinateSequenceFilter:R,Envelope:P,LineSegment:Zt,GeometryFactory:wt,Geometry:X,Point:$,LineString:Q,LinearRing:ht,Polygon:nt,GeometryCollection:at,MultiPoint:ct,MultiLineString:Ct,MultiPolygon:mt,Dimension:j,IntersectionMatrix:Kt,PrecisionModel:It,Location:jt,Triangle:te,util:we});class Le{constructor(){Le.constructor_.apply(this,arguments)}static constructor_(){this._pt=[new p,new p],this._distance=i.NaN,this._isNull=!0}getCoordinates(){return this._pt}getCoordinate(t){return this._pt[t]}setMinimum(){if(1===arguments.length){const t=arguments[0];this.setMinimum(t._pt[0],t._pt[1])}else if(2===arguments.length){const t=arguments[0],e=arguments[1];if(this._isNull)return this.initialize(t,e),null;const s=t.distance(e);s<this._distance&&this.initialize(t,e,s)}}initialize(){if(0===arguments.length)this._isNull=!0;else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._pt[0].setCoordinate(t),this._pt[1].setCoordinate(e),this._distance=t.distance(e),this._isNull=!1}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._pt[0].setCoordinate(t),this._pt[1].setCoordinate(e),this._distance=s,this._isNull=!1}}toString(){return Ut.toLineString(this._pt[0],this._pt[1])}getDistance(){return this._distance}setMaximum(){if(1===arguments.length){const t=arguments[0];this.setMaximum(t._pt[0],t._pt[1])}else if(2===arguments.length){const t=arguments[0],e=arguments[1];if(this._isNull)return this.initialize(t,e),null;const s=t.distance(e);s>this._distance&&this.initialize(t,e,s)}}}class Te{static computeDistance(){if(arguments[2]instanceof Le&&arguments[0]instanceof Q&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1],s=arguments[2],n=new Zt,i=t.getCoordinates();for(let t=0;t<i.length-1;t++){n.setCoordinates(i[t],i[t+1]);const r=n.closestPoint(e);s.setMinimum(r,e)}}else if(arguments[2]instanceof Le&&arguments[0]instanceof nt&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1],s=arguments[2];Te.computeDistance(t.getExteriorRing(),e,s);for(let n=0;n<t.getNumInteriorRing();n++)Te.computeDistance(t.getInteriorRingN(n),e,s)}else if(arguments[2]instanceof Le&&arguments[0]instanceof X&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1],s=arguments[2];if(t instanceof Q)Te.computeDistance(t,e,s);else if(t instanceof nt)Te.computeDistance(t,e,s);else if(t instanceof at){const n=t;for(let t=0;t<n.getNumGeometries();t++){const i=n.getGeometryN(t);Te.computeDistance(i,e,s)}}else s.setMinimum(t.getCoordinate(),e)}else if(arguments[2]instanceof Le&&arguments[0]instanceof Zt&&arguments[1]instanceof p){const t=arguments[1],e=arguments[2],s=arguments[0].closestPoint(t);e.setMinimum(s,t)}}}class Re{constructor(){Re.constructor_.apply(this,arguments)}static constructor_(){this._g0=null,this._g1=null,this._ptDist=new Le,this._densifyFrac=0;const t=arguments[0],e=arguments[1];this._g0=t,this._g1=e}static distance(){if(2===arguments.length){return new Re(arguments[0],arguments[1]).distance()}if(3===arguments.length){const t=arguments[2],e=new Re(arguments[0],arguments[1]);return e.setDensifyFraction(t),e.distance()}}getCoordinates(){return this._ptDist.getCoordinates()}setDensifyFraction(t){if(t>1||t<=0)throw new s("Fraction is not in range (0.0 - 1.0]");this._densifyFrac=t}compute(t,e){this.computeOrientedDistance(t,e,this._ptDist),this.computeOrientedDistance(e,t,this._ptDist)}distance(){return this.compute(this._g0,this._g1),this._ptDist.getDistance()}computeOrientedDistance(t,e,s){const n=new Pe(e);if(t.apply(n),s.setMaximum(n.getMaxPointDistance()),this._densifyFrac>0){const n=new Oe(e,this._densifyFrac);t.apply(n),s.setMaximum(n.getMaxPointDistance())}}orientedDistance(){return this.computeOrientedDistance(this._g0,this._g1,this._ptDist),this._ptDist.getDistance()}}class Pe{constructor(){Pe.constructor_.apply(this,arguments)}static constructor_(){this._maxPtDist=new Le,this._minPtDist=new Le,this._euclideanDist=new Te,this._geom=null;const t=arguments[0];this._geom=t}filter(t){this._minPtDist.initialize(),Te.computeDistance(this._geom,t,this._minPtDist),this._maxPtDist.setMaximum(this._minPtDist)}getMaxPointDistance(){return this._maxPtDist}get interfaces_(){return[k]}}class Oe{constructor(){Oe.constructor_.apply(this,arguments)}static constructor_(){this._maxPtDist=new Le,this._minPtDist=new Le,this._geom=null,this._numSubSegs=0;const t=arguments[0],e=arguments[1];this._geom=t,this._numSubSegs=Math.trunc(Math.round(1/e))}filter(t,e){if(0===e)return null;const s=t.getCoordinate(e-1),n=t.getCoordinate(e),i=(n.x-s.x)/this._numSubSegs,r=(n.y-s.y)/this._numSubSegs;for(let t=0;t<this._numSubSegs;t++){const e=s.x+t*i,n=s.y+t*r,o=new p(e,n);this._minPtDist.initialize(),Te.computeDistance(this._geom,o,this._minPtDist),this._maxPtDist.setMaximum(this._minPtDist)}}isDone(){return!1}isGeometryChanged(){return!1}getMaxPointDistance(){return this._maxPtDist}get interfaces_(){return[R]}}Re.MaxPointDistanceFilter=Pe,Re.MaxDensifiedByFractionDistanceFilter=Oe;var ve=Object.freeze({__proto__:null,DiscreteHausdorffDistance:Re,DistanceToPoint:Te,PointPairDistance:Le});class Me{visitItem(t){}}class be{locate(t){}}class De{constructor(){De.constructor_.apply(this,arguments)}static constructor_(){this._min=i.POSITIVE_INFINITY,this._max=i.NEGATIVE_INFINITY}getMin(){return this._min}intersects(t,e){return!(this._min>e||this._max<t)}getMax(){return this._max}toString(){return Ut.toLineString(new p(this._min,0),new p(this._max,0))}}De.NodeComparator=class{compare(t,e){const s=t,n=e,i=(s._min+s._max)/2,r=(n._min+n._max)/2;return i<r?-1:i>r?1:0}get interfaces_(){return[l]}};class Ae extends De{constructor(){super(),Ae.constructor_.apply(this,arguments)}static constructor_(){this._item=null;const t=arguments[0],e=arguments[1],s=arguments[2];this._min=t,this._max=e,this._item=s}query(t,e,s){if(!this.intersects(t,e))return null;s.visitItem(this._item)}}class Fe extends De{constructor(){super(),Fe.constructor_.apply(this,arguments)}static constructor_(){this._node1=null,this._node2=null;const t=arguments[0],e=arguments[1];this._node1=t,this._node2=e,this.buildExtent(this._node1,this._node2)}buildExtent(t,e){this._min=Math.min(t._min,e._min),this._max=Math.max(t._max,e._max)}query(t,e,s){if(!this.intersects(t,e))return null;null!==this._node1&&this._node1.query(t,e,s),null!==this._node2&&this._node2.query(t,e,s)}}class Ge{constructor(){Ge.constructor_.apply(this,arguments)}static constructor_(){this._leaves=new S,this._root=null,this._level=0}buildTree(){fe.sort(this._leaves,new De.NodeComparator);let t=this._leaves,e=null,s=new S;for(;;){if(this.buildLevel(t,s),1===s.size())return s.get(0);e=t,t=s,s=e}}insert(t,e,s){if(null!==this._root)throw new IllegalStateException("Index cannot be added to once it has been queried");this._leaves.add(new Ae(t,e,s))}query(t,e,s){if(this.init(),null===this._root)return null;this._root.query(t,e,s)}buildRoot(){if(null!==this._root)return null;this._root=this.buildTree()}printNode(t){q.out.println(Ut.toLineString(new p(t._min,this._level),new p(t._max,this._level)))}init(){return null!==this._root||0===this._leaves.size()?null:void this.buildRoot()}buildLevel(t,e){this._level++,e.clear();for(let s=0;s<t.size();s+=2){const n=t.get(s);if(null===(s+1<t.size()?t.get(s):null))e.add(n);else{const n=new Fe(t.get(s),t.get(s+1));e.add(n)}}}}class qe{constructor(){qe.constructor_.apply(this,arguments)}static constructor_(){this._items=new S}visitItem(t){this._items.add(t)}getItems(){return this._items}get interfaces_(){return[Me]}}class Be{constructor(){Be.constructor_.apply(this,arguments)}static constructor_(){this._p=null,this._crossingCount=0,this._isPointOnSegment=!1;const t=arguments[0];this._p=t}static locatePointInRing(){if(arguments[0]instanceof p&&E(arguments[1],A)){const t=arguments[1],e=new Be(arguments[0]),s=new p,n=new p;for(let i=1;i<t.size();i++)if(t.getCoordinate(i,s),t.getCoordinate(i-1,n),e.countSegment(s,n),e.isOnSegment())return e.getLocation();return e.getLocation()}if(arguments[0]instanceof p&&arguments[1]instanceof Array){const t=arguments[1],e=new Be(arguments[0]);for(let s=1;s<t.length;s++){const n=t[s],i=t[s-1];if(e.countSegment(n,i),e.isOnSegment())return e.getLocation()}return e.getLocation()}}countSegment(t,e){if(t.x<this._p.x&&e.x<this._p.x)return null;if(this._p.x===e.x&&this._p.y===e.y)return this._isPointOnSegment=!0,null;if(t.y===this._p.y&&e.y===this._p.y){let s=t.x,n=e.x;return s>n&&(s=e.x,n=t.x),this._p.x>=s&&this._p.x<=n&&(this._isPointOnSegment=!0),null}if(t.y>this._p.y&&e.y<=this._p.y||e.y>this._p.y&&t.y<=this._p.y){let s=F.index(t,e,this._p);if(s===F.COLLINEAR)return this._isPointOnSegment=!0,null;e.y<t.y&&(s=-s),s===F.LEFT&&this._crossingCount++}}isPointInPolygon(){return this.getLocation()!==jt.EXTERIOR}getLocation(){return this._isPointOnSegment?jt.BOUNDARY:this._crossingCount%2==1?jt.INTERIOR:jt.EXTERIOR}isOnSegment(){return this._isPointOnSegment}}class Ye{constructor(){Ye.constructor_.apply(this,arguments)}static constructor_(){this._geom=null,this._index=null;const t=arguments[0];if(!(E(t,st)||t instanceof ht))throw new s("Argument must be Polygonal or LinearRing");this._geom=t}locate(t){null===this._index&&(this._index=new ze(this._geom),this._geom=null);const e=new Be(t),s=new Ve(e);return this._index.query(t.y,t.y,s),e.getLocation()}get interfaces_(){return[be]}}class Ve{constructor(){Ve.constructor_.apply(this,arguments)}static constructor_(){this._counter=null;const t=arguments[0];this._counter=t}visitItem(t){const e=t;this._counter.countSegment(e.getCoordinate(0),e.getCoordinate(1))}get interfaces_(){return[Me]}}class ze{constructor(){ze.constructor_.apply(this,arguments)}static constructor_(){this._isEmpty=!1,this._index=new Ge;const t=arguments[0];t.isEmpty()?this._isEmpty=!0:this.init(t)}init(t){for(let e=me.getLines(t).iterator();e.hasNext();){const t=e.next().getCoordinates();this.addLine(t)}}addLine(t){for(let e=1;e<t.length;e++){const s=new Zt(t[e-1],t[e]),n=Math.min(s.p0.y,s.p1.y),i=Math.max(s.p0.y,s.p1.y);this._index.insert(n,i,s)}}query(){if(2===arguments.length){const t=arguments[0],e=arguments[1];if(this._isEmpty)return new S;const s=new qe;return this._index.query(t,e,s),s.getItems()}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];if(this._isEmpty)return null;this._index.query(t,e,s)}}}Ye.SegmentVisitor=Ve,Ye.IntervalIndexedGeometry=ze;class Xe{static isOnLine(){if(arguments[0]instanceof p&&E(arguments[1],A)){const t=arguments[0],e=arguments[1],s=new Wt,n=new p,i=new p,r=e.size();for(let o=1;o<r;o++)if(e.getCoordinate(o-1,n),e.getCoordinate(o,i),s.computeIntersection(t,n,i),s.hasIntersection())return!0;return!1}if(arguments[0]instanceof p&&arguments[1]instanceof Array){const t=arguments[0],e=arguments[1],s=new Wt;for(let n=1;n<e.length;n++){const i=e[n-1],r=e[n];if(s.computeIntersection(t,i,r),s.hasIntersection())return!0}return!1}}static locateInRing(t,e){return Be.locatePointInRing(t,e)}static isInRing(t,e){return Xe.locateInRing(t,e)!==jt.EXTERIOR}}class ke{hasNext(){}next(){}remove(){}}class Ue{constructor(){Ue.constructor_.apply(this,arguments)}static constructor_(){this._parent=null,this._atStart=null,this._max=null,this._index=null,this._subcollectionIterator=null;const t=arguments[0];this._parent=t,this._atStart=!0,this._index=0,this._max=t.getNumGeometries()}static isAtomic(t){return!(t instanceof at)}next(){if(this._atStart)return this._atStart=!1,Ue.isAtomic(this._parent)&&this._index++,this._parent;if(null!==this._subcollectionIterator){if(this._subcollectionIterator.hasNext())return this._subcollectionIterator.next();this._subcollectionIterator=null}if(this._index>=this._max)throw new w;const t=this._parent.getGeometryN(this._index++);return t instanceof at?(this._subcollectionIterator=new Ue(t),this._subcollectionIterator.next()):t}remove(){throw new Z(this.getClass().getName())}hasNext(){if(this._atStart)return!0;if(null!==this._subcollectionIterator){if(this._subcollectionIterator.hasNext())return!0;this._subcollectionIterator=null}return!(this._index>=this._max)}get interfaces_(){return[ke]}}class He{constructor(){He.constructor_.apply(this,arguments)}static constructor_(){this._geom=null;const t=arguments[0];this._geom=t}static locatePointInPolygon(t,e){if(e.isEmpty())return jt.EXTERIOR;const s=e.getExteriorRing(),n=He.locatePointInRing(t,s);if(n!==jt.INTERIOR)return n;for(let s=0;s<e.getNumInteriorRing();s++){const n=e.getInteriorRingN(s),i=He.locatePointInRing(t,n);if(i===jt.BOUNDARY)return jt.BOUNDARY;if(i===jt.INTERIOR)return jt.EXTERIOR}return jt.INTERIOR}static locatePointInRing(t,e){return e.getEnvelopeInternal().intersects(t)?Xe.locateInRing(t,e.getCoordinates()):jt.EXTERIOR}static containsPointInPolygon(t,e){return jt.EXTERIOR!==He.locatePointInPolygon(t,e)}static locateInGeometry(t,e){if(e instanceof nt)return He.locatePointInPolygon(t,e);if(e instanceof at){const s=new Ue(e);for(;s.hasNext();){const n=s.next();if(n!==e){const e=He.locateInGeometry(t,n);if(e!==jt.EXTERIOR)return e}}}return jt.EXTERIOR}static isContained(t,e){return jt.EXTERIOR!==He.locate(t,e)}static locate(t,e){return e.isEmpty()?jt.EXTERIOR:e.getEnvelopeInternal().intersects(t)?He.locateInGeometry(t,e):jt.EXTERIOR}locate(t){return He.locate(t,this._geom)}get interfaces_(){return[be]}}var We=Object.freeze({__proto__:null,IndexedPointInAreaLocator:Ye,PointOnGeometryLocator:be,SimplePointInAreaLocator:He});class Ze{measure(t,e){}}class je{static diagonalSize(t){if(t.isNull())return 0;const e=t.getWidth(),s=t.getHeight();return Math.sqrt(e*e+s*s)}measure(t,e){const s=Re.distance(t,e,je.DENSIFY_FRACTION),n=new P(t.getEnvelopeInternal());n.expandToInclude(e.getEnvelopeInternal());return 1-s/je.diagonalSize(n)}get interfaces_(){return[Ze]}}je.DENSIFY_FRACTION=.25;var Ke=Object.freeze({__proto__:null,AreaSimilarityMeasure:class{measure(t,e){return t.intersection(e).getArea()/t.union(e).getArea()}get interfaces_(){return[Ze]}},HausdorffSimilarityMeasure:je,SimilarityMeasure:Ze,SimilarityMeasureCombiner:class{static combine(t,e){return Math.min(t,e)}}});class Qe{constructor(){Qe.constructor_.apply(this,arguments)}static constructor_(){this._areaBasePt=null,this._triangleCent3=new p,this._areasum2=0,this._cg3=new p,this._lineCentSum=new p,this._totalLength=0,this._ptCount=0,this._ptCentSum=new p;const t=arguments[0];this._areaBasePt=null,this.add(t)}static area2(t,e,s){return(e.x-t.x)*(s.y-t.y)-(s.x-t.x)*(e.y-t.y)}static centroid3(t,e,s,n){return n.x=t.x+e.x+s.x,n.y=t.y+e.y+s.y,null}static getCentroid(t){return new Qe(t).getCentroid()}setAreaBasePoint(t){this._areaBasePt=t}addPoint(t){this._ptCount+=1,this._ptCentSum.x+=t.x,this._ptCentSum.y+=t.y}addLineSegments(t){let e=0;for(let s=0;s<t.length-1;s++){const n=t[s].distance(t[s+1]);if(0===n)continue;e+=n;const i=(t[s].x+t[s+1].x)/2;this._lineCentSum.x+=n*i;const r=(t[s].y+t[s+1].y)/2;this._lineCentSum.y+=n*r}this._totalLength+=e,0===e&&t.length>0&&this.addPoint(t[0])}addHole(t){const e=F.isCCW(t);for(let s=0;s<t.length-1;s++)this.addTriangle(this._areaBasePt,t[s],t[s+1],e);this.addLineSegments(t)}getCentroid(){const t=new p;if(Math.abs(this._areasum2)>0)t.x=this._cg3.x/3/this._areasum2,t.y=this._cg3.y/3/this._areasum2;else if(this._totalLength>0)t.x=this._lineCentSum.x/this._totalLength,t.y=this._lineCentSum.y/this._totalLength;else{if(!(this._ptCount>0))return null;t.x=this._ptCentSum.x/this._ptCount,t.y=this._ptCentSum.y/this._ptCount}return t}addShell(t){t.length>0&&this.setAreaBasePoint(t[0]);const e=!F.isCCW(t);for(let s=0;s<t.length-1;s++)this.addTriangle(this._areaBasePt,t[s],t[s+1],e);this.addLineSegments(t)}addTriangle(t,e,s,n){const i=n?1:-1;Qe.centroid3(t,e,s,this._triangleCent3);const r=Qe.area2(t,e,s);this._cg3.x+=i*r*this._triangleCent3.x,this._cg3.y+=i*r*this._triangleCent3.y,this._areasum2+=i*r}add(){if(arguments[0]instanceof nt){const t=arguments[0];this.addShell(t.getExteriorRing().getCoordinates());for(let e=0;e<t.getNumInteriorRing();e++)this.addHole(t.getInteriorRingN(e).getCoordinates())}else if(arguments[0]instanceof X){const t=arguments[0];if(t.isEmpty())return null;if(t instanceof $)this.addPoint(t.getCoordinate());else if(t instanceof Q)this.addLineSegments(t.getCoordinates());else if(t instanceof nt){const e=t;this.add(e)}else if(t instanceof at){const e=t;for(let t=0;t<e.getNumGeometries();t++)this.add(e.getGeometryN(t))}}}}class Je extends e{constructor(t){super(t),this.name=Object.keys({EmptyStackException:Je})[0]}}class $e extends C{constructor(){super(),this.array=[]}add(t){return this.array.push(t),!0}get(t){if(t<0||t>=this.size())throw new N;return this.array[t]}push(t){return this.array.push(t),t}pop(){if(0===this.array.length)throw new Je;return this.array.pop()}peek(){if(0===this.array.length)throw new Je;return this.array[this.array.length-1]}empty(){return 0===this.array.length}isEmpty(){return this.empty()}search(t){return this.array.indexOf(t)}size(){return this.array.length}toArray(){return this.array.slice()}}class ts{constructor(){ts.constructor_.apply(this,arguments)}static constructor_(){this._coordSet=new yt,this._list=new S}static filterCoordinates(t){const e=new ts;for(let s=0;s<t.length;s++)e.filter(t[s]);return e.getCoordinates()}filter(t){this._coordSet.add(t)&&this._list.add(t)}getCoordinates(){const t=new Array(this._list.size()).fill(null);return this._list.toArray(t)}get interfaces_(){return[k]}}class es{constructor(){es.constructor_.apply(this,arguments)}static constructor_(){if(this._geomFactory=null,this._inputPts=null,1===arguments.length){const t=arguments[0];es.constructor_.call(this,es.extractCoordinates(t),t.getFactory())}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._inputPts=ts.filterCoordinates(t),this._geomFactory=e}}static extractCoordinates(t){const e=new ts;return t.apply(e),e.getCoordinates()}preSort(t){let e=null;for(let s=1;s<t.length;s++)(t[s].y<t[0].y||t[s].y===t[0].y&&t[s].x<t[0].x)&&(e=t[0],t[0]=t[s],t[s]=e);return et.sort(t,1,t.length,new ss(t[0])),t}computeOctRing(t){const e=this.computeOctPts(t),s=new T;return s.add(e,!1),s.size()<3?null:(s.closeRing(),s.toCoordinateArray())}lineOrPolygon(t){if(3===(t=this.cleanRing(t)).length)return this._geomFactory.createLineString([t[0],t[1]]);const e=this._geomFactory.createLinearRing(t);return this._geomFactory.createPolygon(e)}cleanRing(t){u.equals(t[0],t[t.length-1]);const e=new S;let s=null;for(let n=0;n<=t.length-2;n++){const i=t[n],r=t[n+1];i.equals(r)||(null!==s&&this.isBetween(s,i,r)||(e.add(i),s=i))}e.add(t[t.length-1]);const n=new Array(e.size()).fill(null);return e.toArray(n)}isBetween(t,e,s){if(0!==F.index(t,e,s))return!1;if(t.x!==s.x){if(t.x<=e.x&&e.x<=s.x)return!0;if(s.x<=e.x&&e.x<=t.x)return!0}if(t.y!==s.y){if(t.y<=e.y&&e.y<=s.y)return!0;if(s.y<=e.y&&e.y<=t.y)return!0}return!1}reduce(t){const e=this.computeOctRing(t);if(null===e)return t;const s=new ot;for(let t=0;t<e.length;t++)s.add(e[t]);for(let n=0;n<t.length;n++)Xe.isInRing(t[n],e)||s.add(t[n]);const n=gt.toCoordinateArray(s);return n.length<3?this.padArray3(n):n}getConvexHull(){if(0===this._inputPts.length)return this._geomFactory.createGeometryCollection();if(1===this._inputPts.length)return this._geomFactory.createPoint(this._inputPts[0]);if(2===this._inputPts.length)return this._geomFactory.createLineString(this._inputPts);let t=this._inputPts;this._inputPts.length>50&&(t=this.reduce(this._inputPts));const e=this.preSort(t),s=this.grahamScan(e),n=this.toCoordinateArray(s);return this.lineOrPolygon(n)}padArray3(t){const e=new Array(3).fill(null);for(let s=0;s<e.length;s++)s<t.length?e[s]=t[s]:e[s]=t[0];return e}computeOctPts(t){const e=new Array(8).fill(null);for(let s=0;s<e.length;s++)e[s]=t[0];for(let s=1;s<t.length;s++)t[s].x<e[0].x&&(e[0]=t[s]),t[s].x-t[s].y<e[1].x-e[1].y&&(e[1]=t[s]),t[s].y>e[2].y&&(e[2]=t[s]),t[s].x+t[s].y>e[3].x+e[3].y&&(e[3]=t[s]),t[s].x>e[4].x&&(e[4]=t[s]),t[s].x-t[s].y>e[5].x-e[5].y&&(e[5]=t[s]),t[s].y<e[6].y&&(e[6]=t[s]),t[s].x+t[s].y<e[7].x+e[7].y&&(e[7]=t[s]);return e}toCoordinateArray(t){const e=new Array(t.size()).fill(null);for(let s=0;s<t.size();s++){const n=t.get(s);e[s]=n}return e}grahamScan(t){let e=null;const s=new $e;s.push(t[0]),s.push(t[1]),s.push(t[2]);for(let n=3;n<t.length;n++){for(e=s.pop();!s.empty()&&F.index(s.peek(),e,t[n])>0;)e=s.pop();s.push(e),s.push(t[n])}return s.push(t[0]),s}}class ss{constructor(){ss.constructor_.apply(this,arguments)}static constructor_(){this._origin=null;const t=arguments[0];this._origin=t}static polarCompare(t,e,s){const n=e.x-t.x,i=e.y-t.y,r=s.x-t.x,o=s.y-t.y,l=F.index(t,e,s);if(l===F.COUNTERCLOCKWISE)return 1;if(l===F.CLOCKWISE)return-1;const a=n*n+i*i,c=r*r+o*o;return a<c?-1:a>c?1:0}compare(t,e){const s=t,n=e;return ss.polarCompare(this._origin,s,n)}get interfaces_(){return[l]}}es.RadialComparator=ss;class ns{constructor(){ns.constructor_.apply(this,arguments)}static constructor_(){this._interiorPoint=null,this._maxWidth=-1;const t=arguments[0];this.process(t)}static getInteriorPoint(t){return new ns(t).getInteriorPoint()}static avg(t,e){return(t+e)/2}getInteriorPoint(){return this._interiorPoint}process(t){if(t.isEmpty())return null;if(t instanceof nt)this.processPolygon(t);else if(t instanceof at){const e=t;for(let t=0;t<e.getNumGeometries();t++)this.process(e.getGeometryN(t))}}processPolygon(t){const e=new is(t);e.process();const s=e.getWidth();s>this._maxWidth&&(this._maxWidth=s,this._interiorPoint=e.getInteriorPoint())}}class is{constructor(){is.constructor_.apply(this,arguments)}static constructor_(){this._polygon=null,this._interiorPointY=null,this._interiorSectionWidth=0,this._interiorPoint=null;const t=arguments[0];this._polygon=t,this._interiorPointY=os.getScanLineY(t)}static isEdgeCrossingCounted(t,e,s){const n=t.getY(),i=e.getY();return n!==i&&(!(n===s&&i<s)&&!(i===s&&n<s))}static intersectsHorizontalLine(){if(2===arguments.length){const t=arguments[0],e=arguments[1];return!(e<t.getMinY())&&!(e>t.getMaxY())}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];return!(t.getY()>s&&e.getY()>s)&&!(t.getY()<s&&e.getY()<s)}}static intersection(t,e,s){const n=t.getX(),i=e.getX();if(n===i)return n;const r=i-n,o=(e.getY()-t.getY())/r;return n+(s-t.getY())/o}findBestMidpoint(t){if(0===t.size())return null;u.isTrue(0==t.size()%2,"Interior Point robustness failure: odd number of scanline crossings"),t.sort(new rs);for(let e=0;e<t.size();e+=2){const s=t.get(e),n=t.get(e+1),i=n-s;if(i>this._interiorSectionWidth){this._interiorSectionWidth=i;const t=ns.avg(s,n);this._interiorPoint=new p(t,this._interiorPointY)}}}process(){if(this._polygon.isEmpty())return null;this._interiorPoint=new p(this._polygon.getCoordinate());const t=new S;this.scanRing(this._polygon.getExteriorRing(),t);for(let e=0;e<this._polygon.getNumInteriorRing();e++)this.scanRing(this._polygon.getInteriorRingN(e),t);this.findBestMidpoint(t)}scanRing(t,e){if(!is.intersectsHorizontalLine(t.getEnvelopeInternal(),this._interiorPointY))return null;const s=t.getCoordinateSequence();for(let t=1;t<s.size();t++){const n=s.getCoordinate(t-1),i=s.getCoordinate(t);this.addEdgeCrossing(n,i,this._interiorPointY,e)}}getWidth(){return this._interiorSectionWidth}getInteriorPoint(){return this._interiorPoint}addEdgeCrossing(t,e,s,n){if(!is.intersectsHorizontalLine(t,e,s))return null;if(!is.isEdgeCrossingCounted(t,e,s))return null;const i=is.intersection(t,e,s);n.add(i)}}class rs{compare(t,e){return t<e?-1:t>e?1:0}get interfaces_(){return[l]}}is.DoubleComparator=rs;class os{constructor(){os.constructor_.apply(this,arguments)}static constructor_(){this._poly=null,this._centreY=null,this._hiY=i.MAX_VALUE,this._loY=-i.MAX_VALUE;const t=arguments[0];this._poly=t,this._hiY=t.getEnvelopeInternal().getMaxY(),this._loY=t.getEnvelopeInternal().getMinY(),this._centreY=ns.avg(this._loY,this._hiY)}static getScanLineY(t){return new os(t).getScanLineY()}updateInterval(t){t<=this._centreY?t>this._loY&&(this._loY=t):t>this._centreY&&t<this._hiY&&(this._hiY=t)}getScanLineY(){this.process(this._poly.getExteriorRing());for(let t=0;t<this._poly.getNumInteriorRing();t++)this.process(this._poly.getInteriorRingN(t));return ns.avg(this._hiY,this._loY)}process(t){const e=t.getCoordinateSequence();for(let t=0;t<e.size();t++){const s=e.getY(t);this.updateInterval(s)}}}ns.InteriorPointPolygon=is,ns.ScanLineYOrdinateFinder=os;class ls{constructor(){ls.constructor_.apply(this,arguments)}static constructor_(){this._centroid=null,this._minDistance=i.MAX_VALUE,this._interiorPoint=null;const t=arguments[0];t.isEmpty()?this._centroid=null:(this._centroid=Qe.getCentroid(t),t.getPrecisionModel().makePrecise(this._centroid)),this.addInterior(t),null===this._interiorPoint&&this.addEndpoints(t)}static getInteriorPoint(t){return new ls(t).getInteriorPoint()}addEndpoints(){if(arguments[0]instanceof X){const t=arguments[0];if(t instanceof Q)this.addEndpoints(t.getCoordinates());else if(t instanceof at){const e=t;for(let t=0;t<e.getNumGeometries();t++)this.addEndpoints(e.getGeometryN(t))}}else if(arguments[0]instanceof Array){const t=arguments[0];this.add(t[0]),this.add(t[t.length-1])}}getInteriorPoint(){return this._interiorPoint}addInterior(){if(arguments[0]instanceof X){const t=arguments[0];if(t instanceof Q)this.addInterior(t.getCoordinates());else if(t instanceof at){const e=t;for(let t=0;t<e.getNumGeometries();t++)this.addInterior(e.getGeometryN(t))}}else if(arguments[0]instanceof Array){const t=arguments[0];for(let e=1;e<t.length-1;e++)this.add(t[e])}}add(t){const e=t.distance(this._centroid);e<this._minDistance&&(this._interiorPoint=new p(t),this._minDistance=e)}}class as{constructor(){as.constructor_.apply(this,arguments)}static constructor_(){this._centroid=null,this._minDistance=i.MAX_VALUE,this._interiorPoint=null;const t=arguments[0];this._centroid=Qe.getCentroid(t),this.add(t)}static getInteriorPoint(t){return new as(t).getInteriorPoint()}getInteriorPoint(){return this._interiorPoint}add(){if(arguments[0]instanceof X){const t=arguments[0];if(t instanceof $)this.add(t.getCoordinate());else if(t instanceof at){const e=t;for(let t=0;t<e.getNumGeometries();t++)this.add(e.getGeometryN(t))}}else if(arguments[0]instanceof p){const t=arguments[0],e=t.distance(this._centroid);e<this._minDistance&&(this._interiorPoint=new p(t),this._minDistance=e)}}}class cs{isInBoundary(t){}}class hs{isInBoundary(t){return t%2==1}get interfaces_(){return[cs]}}class us{isInBoundary(t){return t>0}get interfaces_(){return[cs]}}class gs{isInBoundary(t){return t>1}get interfaces_(){return[cs]}}class ds{isInBoundary(t){return 1===t}get interfaces_(){return[cs]}}cs.Mod2BoundaryNodeRule=hs,cs.EndPointBoundaryNodeRule=us,cs.MultiValentEndPointBoundaryNodeRule=gs,cs.MonoValentEndPointBoundaryNodeRule=ds,cs.MOD2_BOUNDARY_RULE=new hs,cs.ENDPOINT_BOUNDARY_RULE=new us,cs.MULTIVALENT_ENDPOINT_BOUNDARY_RULE=new gs,cs.MONOVALENT_ENDPOINT_BOUNDARY_RULE=new ds,cs.OGC_SFS_BOUNDARY_RULE=cs.MOD2_BOUNDARY_RULE;class _s{constructor(){_s.constructor_.apply(this,arguments)}static constructor_(){if(this._boundaryRule=cs.OGC_SFS_BOUNDARY_RULE,this._isIn=null,this._numBoundaries=null,0===arguments.length);else if(1===arguments.length){const t=arguments[0];if(null===t)throw new s("Rule must be non-null");this._boundaryRule=t}}locateInPolygonRing(t,e){return e.getEnvelopeInternal().intersects(t)?Xe.locateInRing(t,e.getCoordinates()):jt.EXTERIOR}intersects(t,e){return this.locate(t,e)!==jt.EXTERIOR}updateLocationInfo(t){t===jt.INTERIOR&&(this._isIn=!0),t===jt.BOUNDARY&&this._numBoundaries++}computeLocation(t,e){if(e instanceof $&&this.updateLocationInfo(this.locateOnPoint(t,e)),e instanceof Q)this.updateLocationInfo(this.locateOnLineString(t,e));else if(e instanceof nt)this.updateLocationInfo(this.locateInPolygon(t,e));else if(e instanceof Ct){const s=e;for(let e=0;e<s.getNumGeometries();e++){const n=s.getGeometryN(e);this.updateLocationInfo(this.locateOnLineString(t,n))}}else if(e instanceof mt){const s=e;for(let e=0;e<s.getNumGeometries();e++){const n=s.getGeometryN(e);this.updateLocationInfo(this.locateInPolygon(t,n))}}else if(e instanceof at){const s=new Ue(e);for(;s.hasNext();){const n=s.next();n!==e&&this.computeLocation(t,n)}}}locateOnPoint(t,e){return e.getCoordinate().equals2D(t)?jt.INTERIOR:jt.EXTERIOR}locateOnLineString(t,e){if(!e.getEnvelopeInternal().intersects(t))return jt.EXTERIOR;const s=e.getCoordinateSequence();return e.isClosed()||!t.equals(s.getCoordinate(0))&&!t.equals(s.getCoordinate(s.size()-1))?Xe.isOnLine(t,s)?jt.INTERIOR:jt.EXTERIOR:jt.BOUNDARY}locateInPolygon(t,e){if(e.isEmpty())return jt.EXTERIOR;const s=e.getExteriorRing(),n=this.locateInPolygonRing(t,s);if(n===jt.EXTERIOR)return jt.EXTERIOR;if(n===jt.BOUNDARY)return jt.BOUNDARY;for(let s=0;s<e.getNumInteriorRing();s++){const n=e.getInteriorRingN(s),i=this.locateInPolygonRing(t,n);if(i===jt.INTERIOR)return jt.EXTERIOR;if(i===jt.BOUNDARY)return jt.BOUNDARY}return jt.INTERIOR}locate(t,e){return e.isEmpty()?jt.EXTERIOR:e instanceof Q?this.locateOnLineString(t,e):e instanceof nt?this.locateInPolygon(t,e):(this._isIn=!1,this._numBoundaries=0,this.computeLocation(t,e),this._boundaryRule.isInBoundary(this._numBoundaries)?jt.BOUNDARY:this._numBoundaries>0||this._isIn?jt.INTERIOR:jt.EXTERIOR)}}class ps{constructor(){ps.constructor_.apply(this,arguments)}static constructor_(){this._input=null,this._extremalPts=null,this._centre=null,this._radius=0;const t=arguments[0];this._input=t}static farthestPoints(t){const e=t[0].distance(t[1]),s=t[1].distance(t[2]),n=t[2].distance(t[0]);return e>=s&&e>=n?[t[0],t[1]]:s>=e&&s>=n?[t[1],t[2]]:[t[2],t[0]]}static pointWitMinAngleWithX(t,e){let s=i.MAX_VALUE,n=null;for(let i=0;i<t.length;i++){const r=t[i];if(r===e)continue;const o=r.x-e.x;let l=r.y-e.y;l<0&&(l=-l);const a=l/Math.sqrt(o*o+l*l);a<s&&(s=a,n=r)}return n}static lowestPoint(t){let e=t[0];for(let s=1;s<t.length;s++)t[s].y<e.y&&(e=t[s]);return e}static pointWithMinAngleWithSegment(t,e,s){let n=i.MAX_VALUE,r=null;for(let i=0;i<t.length;i++){const o=t[i];if(o===e)continue;if(o===s)continue;const l=Qt.angleBetween(e,o,s);l<n&&(n=l,r=o)}return r}getRadius(){return this.compute(),this._radius}getDiameter(){switch(this.compute(),this._extremalPts.length){case 0:return this._input.getFactory().createLineString();case 1:return this._input.getFactory().createPoint(this._centre)}const t=this._extremalPts[0],e=this._extremalPts[1];return this._input.getFactory().createLineString([t,e])}getExtremalPoints(){return this.compute(),this._extremalPts}computeCirclePoints(){if(this._input.isEmpty())return this._extremalPts=new Array(0).fill(null),null;if(1===this._input.getNumPoints()){const t=this._input.getCoordinates();return this._extremalPts=[new p(t[0])],null}const t=this._input.convexHull().getCoordinates();let e=t;if(t[0].equals2D(t[t.length-1])&&(e=new Array(t.length-1).fill(null),gt.copyDeep(t,0,e,0,t.length-1)),e.length<=2)return this._extremalPts=gt.copyDeep(e),null;let s=ps.lowestPoint(e),n=ps.pointWitMinAngleWithX(e,s);for(let t=0;t<e.length;t++){const t=ps.pointWithMinAngleWithSegment(e,s,n);if(Qt.isObtuse(s,t,n))return this._extremalPts=[new p(s),new p(n)],null;if(Qt.isObtuse(t,s,n))s=t;else{if(!Qt.isObtuse(t,n,s))return this._extremalPts=[new p(s),new p(n),new p(t)],null;n=t}}u.shouldNeverReachHere("Logic failure in Minimum Bounding Circle algorithm!")}compute(){if(null!==this._extremalPts)return null;this.computeCirclePoints(),this.computeCentre(),null!==this._centre&&(this._radius=this._centre.distance(this._extremalPts[0]))}getCircle(){if(this.compute(),null===this._centre)return this._input.getFactory().createPolygon();const t=this._input.getFactory().createPoint(this._centre);return 0===this._radius?t:t.buffer(this._radius)}getCentre(){return this.compute(),this._centre}getMaximumDiameter(){switch(this.compute(),this._extremalPts.length){case 0:return this._input.getFactory().createLineString();case 1:return this._input.getFactory().createPoint(this._centre);case 2:return this._input.getFactory().createLineString([this._extremalPts[0],this._extremalPts[1]]);default:const t=ps.farthestPoints(this._extremalPts);return this._input.getFactory().createLineString(t)}}computeCentre(){switch(this._extremalPts.length){case 0:this._centre=null;break;case 1:this._centre=this._extremalPts[0];break;case 2:this._centre=new p((this._extremalPts[0].x+this._extremalPts[1].x)/2,(this._extremalPts[0].y+this._extremalPts[1].y)/2);break;case 3:this._centre=te.circumcentre(this._extremalPts[0],this._extremalPts[1],this._extremalPts[2])}}}class ms{constructor(){ms.constructor_.apply(this,arguments)}static constructor_(){if(this._inputGeom=null,this._isConvex=null,this._convexHullPts=null,this._minBaseSeg=new Zt,this._minWidthPt=null,this._minPtIndex=null,this._minWidth=0,1===arguments.length){const t=arguments[0];ms.constructor_.call(this,t,!1)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._inputGeom=t,this._isConvex=e}}static nextIndex(t,e){return++e>=t.length&&(e=0),e}static computeC(t,e,s){return t*s.y-e*s.x}static getMinimumDiameter(t){return new ms(t).getDiameter()}static getMinimumRectangle(t){return new ms(t).getMinimumRectangle()}static computeSegmentForLine(t,e,s){let n=null,i=null;return Math.abs(e)>Math.abs(t)?(n=new p(0,s/e),i=new p(1,s/e-t/e)):(n=new p(s/t,0),i=new p(s/t-e/t,1)),new Zt(n,i)}getWidthCoordinate(){return this.computeMinimumDiameter(),this._minWidthPt}getSupportingSegment(){return this.computeMinimumDiameter(),this._inputGeom.getFactory().createLineString([this._minBaseSeg.p0,this._minBaseSeg.p1])}getDiameter(){if(this.computeMinimumDiameter(),null===this._minWidthPt)return this._inputGeom.getFactory().createLineString();const t=this._minBaseSeg.project(this._minWidthPt);return this._inputGeom.getFactory().createLineString([t,this._minWidthPt])}computeWidthConvex(t){this._convexHullPts=t instanceof nt?t.getExteriorRing().getCoordinates():t.getCoordinates(),0===this._convexHullPts.length?(this._minWidth=0,this._minWidthPt=null,this._minBaseSeg=null):1===this._convexHullPts.length?(this._minWidth=0,this._minWidthPt=this._convexHullPts[0],this._minBaseSeg.p0=this._convexHullPts[0],this._minBaseSeg.p1=this._convexHullPts[0]):2===this._convexHullPts.length||3===this._convexHullPts.length?(this._minWidth=0,this._minWidthPt=this._convexHullPts[0],this._minBaseSeg.p0=this._convexHullPts[0],this._minBaseSeg.p1=this._convexHullPts[1]):this.computeConvexRingMinDiameter(this._convexHullPts)}computeConvexRingMinDiameter(t){this._minWidth=i.MAX_VALUE;let e=1;const s=new Zt;for(let n=0;n<t.length-1;n++)s.p0=t[n],s.p1=t[n+1],e=this.findMaxPerpDistance(t,s,e)}computeMinimumDiameter(){if(null!==this._minWidthPt)return null;if(this._isConvex)this.computeWidthConvex(this._inputGeom);else{const t=new es(this._inputGeom).getConvexHull();this.computeWidthConvex(t)}}getLength(){return this.computeMinimumDiameter(),this._minWidth}findMaxPerpDistance(t,e,s){let n=e.distancePerpendicular(t[s]),i=n,r=s,o=r;for(;i>=n;)n=i,r=o,o=ms.nextIndex(t,r),i=e.distancePerpendicular(t[o]);return n<this._minWidth&&(this._minPtIndex=r,this._minWidth=n,this._minWidthPt=t[this._minPtIndex],this._minBaseSeg=new Zt(e)),r}getMinimumRectangle(){if(this.computeMinimumDiameter(),0===this._minWidth)return this._minBaseSeg.p0.equals2D(this._minBaseSeg.p1)?this._inputGeom.getFactory().createPoint(this._minBaseSeg.p0):this._minBaseSeg.toGeometry(this._inputGeom.getFactory());const t=this._minBaseSeg.p1.x-this._minBaseSeg.p0.x,e=this._minBaseSeg.p1.y-this._minBaseSeg.p0.y;let s=i.MAX_VALUE,n=-i.MAX_VALUE,r=i.MAX_VALUE,o=-i.MAX_VALUE;for(let i=0;i<this._convexHullPts.length;i++){const l=ms.computeC(t,e,this._convexHullPts[i]);l>n&&(n=l),l<s&&(s=l);const a=ms.computeC(-e,t,this._convexHullPts[i]);a>o&&(o=a),a<r&&(r=a)}const l=ms.computeSegmentForLine(-t,-e,o),a=ms.computeSegmentForLine(-t,-e,r),c=ms.computeSegmentForLine(-e,t,n),h=ms.computeSegmentForLine(-e,t,s),u=c.lineIntersection(l),g=h.lineIntersection(l),d=h.lineIntersection(a),_=c.lineIntersection(a),p=this._inputGeom.getFactory().createLinearRing([u,g,d,_,u]);return this._inputGeom.getFactory().createPolygon(p)}}var fs=Object.freeze({__proto__:null,distance:ve,locate:We,match:Ke,Angle:Qt,Area:tt,Centroid:Qe,ConvexHull:es,Distance:Y,InteriorPointArea:ns,InteriorPointLine:ls,InteriorPointPoint:as,Length:U,Orientation:F,PointLocation:Xe,PointLocator:_s,RobustLineIntersector:Wt,MinimumBoundingCircle:ps,MinimumDiameter:ms});class ys{constructor(){ys.constructor_.apply(this,arguments)}static constructor_(){this._inputGeom=null,this._distanceTolerance=null;const t=arguments[0];this._inputGeom=t}static densifyPoints(t,e,s){const n=new Zt,i=new T;for(let r=0;r<t.length-1;r++){n.p0=t[r],n.p1=t[r+1],i.add(n.p0,!1);const o=n.getLength(),l=Math.trunc(o/e)+1;if(l>1){const t=o/l;for(let e=1;e<l;e++){const r=e*t/o,l=n.pointAlong(r);s.makePrecise(l),i.add(l,!1)}}}return i.add(t[t.length-1],!1),i.toCoordinateArray()}static densify(t,e){const s=new ys(t);return s.setDistanceTolerance(e),s.getResultGeometry()}getResultGeometry(){return new xs(this._distanceTolerance).transform(this._inputGeom)}setDistanceTolerance(t){if(t<=0)throw new s("Tolerance must be positive");this._distanceTolerance=t}}class xs extends _e{constructor(){super(),xs.constructor_.apply(this,arguments)}static constructor_(){this.distanceTolerance=null;const t=arguments[0];this.distanceTolerance=t}transformMultiPolygon(t,e){const s=super.transformMultiPolygon.call(this,t,e);return this.createValidArea(s)}transformPolygon(t,e){const s=super.transformPolygon.call(this,t,e);return e instanceof mt?s:this.createValidArea(s)}transformCoordinates(t,e){const s=t.toCoordinateArray();let n=ys.densifyPoints(s,this.distanceTolerance,e.getPrecisionModel());return e instanceof Q&&1===n.length&&(n=new Array(0).fill(null)),this._factory.getCoordinateSequenceFactory().create(n)}createValidArea(t){return t.buffer(0)}}ys.DensifyTransformer=xs;var Es=Object.freeze({__proto__:null,Densifier:ys});class Is{static isNorthern(t){return t===Is.NE||t===Is.NW}static isOpposite(t,e){if(t===e)return!1;return 2===(t-e+4)%4}static commonHalfPlane(t,e){if(t===e)return t;if(2===(t-e+4)%4)return-1;const s=t<e?t:e;return 0===s&&3===(t>e?t:e)?3:s}static isInHalfPlane(t,e){return e===Is.SE?t===Is.SE||t===Is.SW:t===e||t===e+1}static quadrant(){if("number"==typeof arguments[0]&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1];if(0===t&&0===e)throw new s("Cannot compute the quadrant for point ( "+t+", "+e+" )");return t>=0?e>=0?Is.NE:Is.SE:e>=0?Is.NW:Is.SW}if(arguments[0]instanceof p&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1];if(e.x===t.x&&e.y===t.y)throw new s("Cannot compute the quadrant for two identical points "+t);return e.x>=t.x?e.y>=t.y?Is.NE:Is.SE:e.y>=t.y?Is.NW:Is.SW}}}Is.NE=0,Is.NW=1,Is.SW=2,Is.SE=3;class Ns{constructor(){Ns.constructor_.apply(this,arguments)}static constructor_(){this._orig=null,this._sym=null,this._next=null;const t=arguments[0];this._orig=t}static create(t,e){const s=new Ns(t),n=new Ns(e);return s.link(n),s}find(t){let e=this;do{if(null===e)return null;if(e.dest().equals2D(t))return e;e=e.oNext()}while(e!==this);return null}dest(){return this._sym._orig}isEdgesSorted(){const t=this.findLowest();let e=t;do{const s=e.oNext();if(s===t)break;if(!(s.compareTo(e)>0))return!1;e=s}while(e!==t);return!0}oNext(){return this._sym._next}directionY(){return this.directionPt().getY()-this._orig.getY()}insert(t){if(this.oNext()===this)return this.insertAfter(t),null;this.insertionEdge(t).insertAfter(t)}insertAfter(t){u.equals(this._orig,t.orig());const e=this.oNext();this._sym.setNext(t),t.sym().setNext(e)}degree(){let t=0,e=this;do{t++,e=e.oNext()}while(e!==this);return t}equals(){if(2===arguments.length&&arguments[1]instanceof p&&arguments[0]instanceof p){const t=arguments[0],e=arguments[1];return this._orig.equals2D(t)&&this._sym._orig.equals(e)}}findLowest(){let t=this,e=this.oNext();do{e.compareTo(t)<0&&(t=e),e=e.oNext()}while(e!==this);return t}directionPt(){return this.dest()}sym(){return this._sym}prev(){return this._sym.next()._sym}compareAngularDirection(t){const e=this.directionX(),s=this.directionY(),n=t.directionX(),i=t.directionY();if(e===n&&s===i)return 0;const r=Is.quadrant(e,s),o=Is.quadrant(n,i);if(r>o)return 1;if(r<o)return-1;const l=this.directionPt(),a=t.directionPt();return F.index(t._orig,a,l)}prevNode(){let t=this;for(;2===t.degree();)if(t=t.prev(),t===this)return null;return t}directionX(){return this.directionPt().getX()-this._orig.getX()}insertionEdge(t){let e=this;do{const s=e.oNext();if(s.compareTo(e)>0&&t.compareTo(e)>=0&&t.compareTo(s)<=0)return e;if(s.compareTo(e)<=0&&(t.compareTo(s)<=0||t.compareTo(e)>=0))return e;e=s}while(e!==this);return u.shouldNeverReachHere(),null}compareTo(t){const e=t;return this.compareAngularDirection(e)}toStringNode(){const t=this.orig();this.dest();const e=new dt;e.append("Node( "+Ut.format(t)+" )\n");let s=this;do{e.append(" -> "+s),e.append("\n"),s=s.oNext()}while(s!==this);return e.toString()}link(t){this.setSym(t),t.setSym(this),this.setNext(t),t.setNext(this)}next(){return this._next}setSym(t){this._sym=t}orig(){return this._orig}toString(){return"HE("+this._orig.x+" "+this._orig.y+", "+this._sym._orig.x+" "+this._sym._orig.y+")"}toStringNodeEdge(){return" -> ("+Ut.format(this.dest())}setNext(t){this._next=t}}class Cs extends Ns{constructor(){super(),Cs.constructor_.apply(this,arguments)}static constructor_(){this._isMarked=!1;const t=arguments[0];Ns.constructor_.call(this,t)}static setMarkBoth(t,e){t.setMark(e),t.sym().setMark(e)}static isMarked(t){return t.isMarked()}static setMark(t,e){t.setMark(e)}static markBoth(t){t.mark(),t.sym().mark()}static mark(t){t.mark()}mark(){this._isMarked=!0}setMark(t){this._isMarked=t}isMarked(){return this._isMarked}}class ws{constructor(){ws.constructor_.apply(this,arguments)}static constructor_(){this._vertexMap=new Et}static isValidEdge(t,e){return 0!==e.compareTo(t)}insert(t,e,s){const n=this.create(t,e);null!==s?s.insert(n):this._vertexMap.put(t,n);const i=this._vertexMap.get(e);return null!==i?i.insert(n.sym()):this._vertexMap.put(e,n.sym()),n}create(t,e){const s=this.createEdge(t),n=this.createEdge(e);return s.link(n),s}createEdge(t){return new Ns(t)}addEdge(t,e){if(!ws.isValidEdge(t,e))return null;const s=this._vertexMap.get(t);let n=null;if(null!==s&&(n=s.find(e)),null!==n)return n;return this.insert(t,e,s)}getVertexEdges(){return this._vertexMap.values()}findEdge(t,e){const s=this._vertexMap.get(t);return null===s?null:s.find(e)}}class Ss extends Cs{constructor(){super(),Ss.constructor_.apply(this,arguments)}static constructor_(){this._isStart=!1;const t=arguments[0];Cs.constructor_.call(this,t)}setStart(){this._isStart=!0}isStart(){return this._isStart}}class Ls extends ws{constructor(){super()}createEdge(t){return new Ss(t)}}class Ts{constructor(){Ts.constructor_.apply(this,arguments)}static constructor_(){this._result=null,this._factory=null,this._graph=null,this._lines=new S,this._nodeEdgeStack=new $e,this._ringStartEdge=null,this._graph=new Ls}static dissolve(t){const e=new Ts;return e.add(t),e.getResult()}addLine(t){this._lines.add(this._factory.createLineString(t.toCoordinateArray()))}updateRingStartEdge(t){return t.isStart()||(t=t.sym()).isStart()?null===this._ringStartEdge?(this._ringStartEdge=t,null):void(t.orig().compareTo(this._ringStartEdge.orig())<0&&(this._ringStartEdge=t)):null}getResult(){return null===this._result&&this.computeResult(),this._result}process(t){let e=t.prevNode();null===e&&(e=t),this.stackEdges(e),this.buildLines()}buildRing(t){const e=new T;let s=t;for(e.add(s.orig().copy(),!1);2===s.sym().degree();){const n=s.next();if(n===t)break;e.add(n.orig().copy(),!1),s=n}e.add(s.dest().copy(),!1),this.addLine(e)}buildLine(t){const e=new T;let s=t;for(this._ringStartEdge=null,Cs.markBoth(s),e.add(s.orig().copy(),!1);2===s.sym().degree();){this.updateRingStartEdge(s);const n=s.next();if(n===t)return this.buildRing(this._ringStartEdge),null;e.add(n.orig().copy(),!1),s=n,Cs.markBoth(s)}e.add(s.dest().clone(),!1),this.stackEdges(s.sym()),this.addLine(e)}stackEdges(t){let e=t;do{Cs.isMarked(e)||this._nodeEdgeStack.add(e),e=e.oNext()}while(e!==t)}computeResult(){for(let t=this._graph.getVertexEdges().iterator();t.hasNext();){const e=t.next();Cs.isMarked(e)||this.process(e)}this._result=this._factory.buildGeometry(this._lines)}buildLines(){for(;!this._nodeEdgeStack.empty();){const t=this._nodeEdgeStack.pop();Cs.isMarked(t)||this.buildLine(t)}}add(){if(arguments[0]instanceof X){arguments[0].apply(new class{get interfaces_(){return[z]}filter(t){t instanceof Q&&this.add(t)}})}else if(E(arguments[0],I)){for(let t=arguments[0].iterator();t.hasNext();){const e=t.next();this.add(e)}}else if(arguments[0]instanceof Q){const t=arguments[0];null===this._factory&&(this._factory=t.getFactory());const e=t.getCoordinateSequence();let s=!1;for(let t=1;t<e.size();t++){const n=this._graph.addEdge(e.getCoordinate(t-1),e.getCoordinate(t));null!==n&&(s||(n.setStart(),s=!0))}}}}var Rs=Object.freeze({__proto__:null,LineDissolver:Ts});class Ps{static opposite(t){return t===Ps.LEFT?Ps.RIGHT:t===Ps.RIGHT?Ps.LEFT:t}}Ps.ON=0,Ps.LEFT=1,Ps.RIGHT=2;class Os{constructor(){Os.constructor_.apply(this,arguments)}static constructor_(){this.mce=null,this.chainIndex=null;const t=arguments[0],e=arguments[1];this.mce=t,this.chainIndex=e}computeIntersections(t,e){this.mce.computeIntersectsForChain(this.chainIndex,t.mce,t.chainIndex,e)}}class vs{constructor(){vs.constructor_.apply(this,arguments)}static constructor_(){if(this._label=null,this._xValue=null,this._eventType=null,this._insertEvent=null,this._deleteEventIndex=null,this._obj=null,2===arguments.length){const t=arguments[0],e=arguments[1];this._eventType=vs.DELETE,this._xValue=t,this._insertEvent=e}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._eventType=vs.INSERT,this._label=t,this._xValue=e,this._obj=s}}isDelete(){return this._eventType===vs.DELETE}setDeleteEventIndex(t){this._deleteEventIndex=t}getObject(){return this._obj}compareTo(t){const e=t;return this._xValue<e._xValue?-1:this._xValue>e._xValue?1:this._eventType<e._eventType?-1:this._eventType>e._eventType?1:0}getInsertEvent(){return this._insertEvent}isInsert(){return this._eventType===vs.INSERT}isSameLabel(t){return null!==this._label&&this._label===t._label}getDeleteEventIndex(){return this._deleteEventIndex}get interfaces_(){return[r]}}vs.INSERT=1,vs.DELETE=2;class Ms{constructor(){Ms.constructor_.apply(this,arguments)}static constructor_(){this._hasIntersection=!1,this._hasProper=!1,this._hasProperInterior=!1,this._properIntersectionPoint=null,this._li=null,this._includeProper=null,this._recordIsolated=null,this._isSelfIntersection=null,this._numIntersections=0,this.numTests=0,this._bdyNodes=null,this._isDone=!1,this._isDoneWhenProperInt=!1;const t=arguments[0],e=arguments[1],s=arguments[2];this._li=t,this._includeProper=e,this._recordIsolated=s}static isAdjacentSegments(t,e){return 1===Math.abs(t-e)}isTrivialIntersection(t,e,s,n){if(t===s&&1===this._li.getIntersectionNum()){if(Ms.isAdjacentSegments(e,n))return!0;if(t.isClosed()){const s=t.getNumPoints()-1;if(0===e&&n===s||0===n&&e===s)return!0}}return!1}getProperIntersectionPoint(){return this._properIntersectionPoint}setIsDoneIfProperInt(t){this._isDoneWhenProperInt=t}hasProperInteriorIntersection(){return this._hasProperInterior}isBoundaryPointInternal(t,e){for(let s=e.iterator();s.hasNext();){const e=s.next().getCoordinate();if(t.isIntersection(e))return!0}return!1}hasProperIntersection(){return this._hasProper}hasIntersection(){return this._hasIntersection}isDone(){return this._isDone}isBoundaryPoint(t,e){return null!==e&&(!!this.isBoundaryPointInternal(t,e[0])||!!this.isBoundaryPointInternal(t,e[1]))}setBoundaryNodes(t,e){this._bdyNodes=new Array(2).fill(null),this._bdyNodes[0]=t,this._bdyNodes[1]=e}addIntersections(t,e,s,n){if(t===s&&e===n)return null;this.numTests++;const i=t.getCoordinates()[e],r=t.getCoordinates()[e+1],o=s.getCoordinates()[n],l=s.getCoordinates()[n+1];this._li.computeIntersection(i,r,o,l),this._li.hasIntersection()&&(this._recordIsolated&&(t.setIsolated(!1),s.setIsolated(!1)),this._numIntersections++,this.isTrivialIntersection(t,e,s,n)||(this._hasIntersection=!0,!this._includeProper&&this._li.isProper()||(t.addIntersections(this._li,e,0),s.addIntersections(this._li,n,1)),this._li.isProper()&&(this._properIntersectionPoint=this._li.getIntersection(0).copy(),this._hasProper=!0,this._isDoneWhenProperInt&&(this._isDone=!0),this.isBoundaryPoint(this._li,this._bdyNodes)||(this._hasProperInterior=!0))))}}class bs extends class{}{constructor(){super(),bs.constructor_.apply(this,arguments)}static constructor_(){this.events=new S,this.nOverlaps=null}prepareEvents(){fe.sort(this.events);for(let t=0;t<this.events.size();t++){const e=this.events.get(t);e.isDelete()&&e.getInsertEvent().setDeleteEventIndex(t)}}computeIntersections(){if(1===arguments.length){const t=arguments[0];this.nOverlaps=0,this.prepareEvents();for(let e=0;e<this.events.size();e++){const s=this.events.get(e);if(s.isInsert()&&this.processOverlaps(e,s.getDeleteEventIndex(),s,t),t.isDone())break}}else if(3===arguments.length)if(arguments[2]instanceof Ms&&E(arguments[0],C)&&E(arguments[1],C)){const t=arguments[0],e=arguments[1],s=arguments[2];this.addEdges(t,t),this.addEdges(e,e),this.computeIntersections(s)}else if("boolean"==typeof arguments[2]&&E(arguments[0],C)&&arguments[1]instanceof Ms){const t=arguments[0],e=arguments[1];arguments[2]?this.addEdges(t,null):this.addEdges(t),this.computeIntersections(e)}}addEdge(t,e){const s=t.getMonotoneChainEdge(),n=s.getStartIndexes();for(let t=0;t<n.length-1;t++){const n=new Os(s,t),i=new vs(e,s.getMinX(t),n);this.events.add(i),this.events.add(new vs(s.getMaxX(t),i))}}processOverlaps(t,e,s,n){const i=s.getObject();for(let r=t;r<e;r++){const t=this.events.get(r);if(t.isInsert()){const e=t.getObject();s.isSameLabel(t)||(i.computeIntersections(e,n),this.nOverlaps++)}}}addEdges(){if(1===arguments.length){for(let t=arguments[0].iterator();t.hasNext();){const e=t.next();this.addEdge(e,e)}}else if(2===arguments.length){const t=arguments[1];for(let e=arguments[0].iterator();e.hasNext();){const s=e.next();this.addEdge(s,t)}}}}class Ds{constructor(){Ds.constructor_.apply(this,arguments)}static constructor_(){if(this.location=null,1===arguments.length){if(arguments[0]instanceof Array){const t=arguments[0];this.init(t.length)}else if(Number.isInteger(arguments[0])){const t=arguments[0];this.init(1),this.location[Ps.ON]=t}else if(arguments[0]instanceof Ds){const t=arguments[0];if(this.init(t.location.length),null!==t)for(let e=0;e<this.location.length;e++)this.location[e]=t.location[e]}}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this.init(3),this.location[Ps.ON]=t,this.location[Ps.LEFT]=e,this.location[Ps.RIGHT]=s}}setAllLocations(t){for(let e=0;e<this.location.length;e++)this.location[e]=t}isNull(){for(let t=0;t<this.location.length;t++)if(this.location[t]!==jt.NONE)return!1;return!0}setAllLocationsIfNull(t){for(let e=0;e<this.location.length;e++)this.location[e]===jt.NONE&&(this.location[e]=t)}isLine(){return 1===this.location.length}merge(t){if(t.location.length>this.location.length){const t=new Array(3).fill(null);t[Ps.ON]=this.location[Ps.ON],t[Ps.LEFT]=jt.NONE,t[Ps.RIGHT]=jt.NONE,this.location=t}for(let e=0;e<this.location.length;e++)this.location[e]===jt.NONE&&e<t.location.length&&(this.location[e]=t.location[e])}getLocations(){return this.location}flip(){if(this.location.length<=1)return null;const t=this.location[Ps.LEFT];this.location[Ps.LEFT]=this.location[Ps.RIGHT],this.location[Ps.RIGHT]=t}toString(){const t=new O;return this.location.length>1&&t.append(jt.toLocationSymbol(this.location[Ps.LEFT])),t.append(jt.toLocationSymbol(this.location[Ps.ON])),this.location.length>1&&t.append(jt.toLocationSymbol(this.location[Ps.RIGHT])),t.toString()}setLocations(t,e,s){this.location[Ps.ON]=t,this.location[Ps.LEFT]=e,this.location[Ps.RIGHT]=s}get(t){return t<this.location.length?this.location[t]:jt.NONE}isArea(){return this.location.length>1}isAnyNull(){for(let t=0;t<this.location.length;t++)if(this.location[t]===jt.NONE)return!0;return!1}setLocation(){if(1===arguments.length){const t=arguments[0];this.setLocation(Ps.ON,t)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.location[t]=e}}init(t){this.location=new Array(t).fill(null),this.setAllLocations(jt.NONE)}isEqualOnSide(t,e){return this.location[e]===t.location[e]}allPositionsEqual(t){for(let e=0;e<this.location.length;e++)if(this.location[e]!==t)return!1;return!0}}class As{constructor(){As.constructor_.apply(this,arguments)}static constructor_(){if(this.elt=new Array(2).fill(null),1===arguments.length){if(Number.isInteger(arguments[0])){const t=arguments[0];this.elt[0]=new Ds(t),this.elt[1]=new Ds(t)}else if(arguments[0]instanceof As){const t=arguments[0];this.elt[0]=new Ds(t.elt[0]),this.elt[1]=new Ds(t.elt[1])}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.elt[0]=new Ds(jt.NONE),this.elt[1]=new Ds(jt.NONE),this.elt[t].setLocation(e)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this.elt[0]=new Ds(t,e,s),this.elt[1]=new Ds(t,e,s)}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];this.elt[0]=new Ds(jt.NONE,jt.NONE,jt.NONE),this.elt[1]=new Ds(jt.NONE,jt.NONE,jt.NONE),this.elt[t].setLocations(e,s,n)}}static toLineLabel(t){const e=new As(jt.NONE);for(let s=0;s<2;s++)e.setLocation(s,t.getLocation(s));return e}getGeometryCount(){let t=0;return this.elt[0].isNull()||t++,this.elt[1].isNull()||t++,t}setAllLocations(t,e){this.elt[t].setAllLocations(e)}isNull(t){return this.elt[t].isNull()}setAllLocationsIfNull(){if(1===arguments.length){const t=arguments[0];this.setAllLocationsIfNull(0,t),this.setAllLocationsIfNull(1,t)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.elt[t].setAllLocationsIfNull(e)}}isLine(t){return this.elt[t].isLine()}merge(t){for(let e=0;e<2;e++)null===this.elt[e]&&null!==t.elt[e]?this.elt[e]=new Ds(t.elt[e]):this.elt[e].merge(t.elt[e])}flip(){this.elt[0].flip(),this.elt[1].flip()}getLocation(){if(1===arguments.length){const t=arguments[0];return this.elt[t].get(Ps.ON)}if(2===arguments.length){const t=arguments[0],e=arguments[1];return this.elt[t].get(e)}}toString(){const t=new O;return null!==this.elt[0]&&(t.append("A:"),t.append(this.elt[0].toString())),null!==this.elt[1]&&(t.append(" B:"),t.append(this.elt[1].toString())),t.toString()}isArea(){if(0===arguments.length)return this.elt[0].isArea()||this.elt[1].isArea();if(1===arguments.length){const t=arguments[0];return this.elt[t].isArea()}}isAnyNull(t){return this.elt[t].isAnyNull()}setLocation(){if(2===arguments.length){const t=arguments[0],e=arguments[1];this.elt[t].setLocation(Ps.ON,e)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this.elt[t].setLocation(e,s)}}isEqualOnSide(t,e){return this.elt[0].isEqualOnSide(t.elt[0],e)&&this.elt[1].isEqualOnSide(t.elt[1],e)}allPositionsEqual(t,e){return this.elt[t].allPositionsEqual(e)}toLine(t){this.elt[t].isArea()&&(this.elt[t]=new Ds(this.elt[t].location[0]))}}class Fs{constructor(){Fs.constructor_.apply(this,arguments)}static constructor_(){this.coord=null,this.segmentIndex=null,this.dist=null;const t=arguments[0],e=arguments[1],s=arguments[2];this.coord=new p(t),this.segmentIndex=e,this.dist=s}getSegmentIndex(){return this.segmentIndex}getCoordinate(){return this.coord}print(t){t.print(this.coord),t.print(" seg # = "+this.segmentIndex),t.println(" dist = "+this.dist)}compareTo(t){const e=t;return this.compare(e.segmentIndex,e.dist)}isEndPoint(t){return 0===this.segmentIndex&&0===this.dist||this.segmentIndex===t}toString(){return this.coord+" seg # = "+this.segmentIndex+" dist = "+this.dist}getDistance(){return this.dist}compare(t,e){return this.segmentIndex<t?-1:this.segmentIndex>t?1:this.dist<e?-1:this.dist>e?1:0}get interfaces_(){return[r]}}class Gs extends ft{}function qs(t){return null==t?0:t.color}function Bs(t){return null==t?null:t.parent}function Ys(t,e){null!==t&&(t.color=e)}function Vs(t){return null==t?null:t.left}function zs(t){return null==t?null:t.right}class Xs extends Gs{constructor(){super(),this.root_=null,this.size_=0}get(t){let e=this.root_;for(;null!==e;){const s=t.compareTo(e.key);if(s<0)e=e.left;else{if(!(s>0))return e.value;e=e.right}}return null}put(t,e){if(null===this.root_)return this.root_={key:t,value:e,left:null,right:null,parent:null,color:0,getValue(){return this.value},getKey(){return this.key}},this.size_=1,null;let s,n,i=this.root_;do{if(s=i,n=t.compareTo(i.key),n<0)i=i.left;else{if(!(n>0)){const t=i.value;return i.value=e,t}i=i.right}}while(null!==i);const r={key:t,left:null,right:null,value:e,parent:s,color:0,getValue(){return this.value},getKey(){return this.key}};return n<0?s.left=r:s.right=r,this.fixAfterInsertion(r),this.size_++,null}fixAfterInsertion(t){let e;for(t.color=1;null!=t&&t!==this.root_&&1===t.parent.color;)Bs(t)===Vs(Bs(Bs(t)))?(e=zs(Bs(Bs(t))),1===qs(e)?(Ys(Bs(t),0),Ys(e,0),Ys(Bs(Bs(t)),1),t=Bs(Bs(t))):(t===zs(Bs(t))&&(t=Bs(t),this.rotateLeft(t)),Ys(Bs(t),0),Ys(Bs(Bs(t)),1),this.rotateRight(Bs(Bs(t))))):(e=Vs(Bs(Bs(t))),1===qs(e)?(Ys(Bs(t),0),Ys(e,0),Ys(Bs(Bs(t)),1),t=Bs(Bs(t))):(t===Vs(Bs(t))&&(t=Bs(t),this.rotateRight(t)),Ys(Bs(t),0),Ys(Bs(Bs(t)),1),this.rotateLeft(Bs(Bs(t)))));this.root_.color=0}values(){const t=new S;let e=this.getFirstEntry();if(null!==e)for(t.add(e.value);null!==(e=Xs.successor(e));)t.add(e.value);return t}entrySet(){const t=new yt;let e=this.getFirstEntry();if(null!==e)for(t.add(e);null!==(e=Xs.successor(e));)t.add(e);return t}rotateLeft(t){if(null!=t){const e=t.right;t.right=e.left,null!=e.left&&(e.left.parent=t),e.parent=t.parent,null==t.parent?this.root_=e:t.parent.left===t?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e}}rotateRight(t){if(null!=t){const e=t.left;t.left=e.right,null!=e.right&&(e.right.parent=t),e.parent=t.parent,null==t.parent?this.root_=e:t.parent.right===t?t.parent.right=e:t.parent.left=e,e.right=t,t.parent=e}}getFirstEntry(){let t=this.root_;if(null!=t)for(;null!=t.left;)t=t.left;return t}static successor(t){let e;if(null===t)return null;if(null!==t.right){for(e=t.right;null!==e.left;)e=e.left;return e}{e=t.parent;let s=t;for(;null!==e&&s===e.right;)s=e,e=e.parent;return e}}size(){return this.size_}containsKey(t){let e=this.root_;for(;null!==e;){const s=t.compareTo(e.key);if(s<0)e=e.left;else{if(!(s>0))return!0;e=e.right}}return!1}}class ks{constructor(){ks.constructor_.apply(this,arguments)}static constructor_(){this._nodeMap=new Xs,this.edge=null;const t=arguments[0];this.edge=t}print(t){t.println("Intersections:");for(let e=this.iterator();e.hasNext();){e.next().print(t)}}iterator(){return this._nodeMap.values().iterator()}addSplitEdges(t){this.addEndpoints();const e=this.iterator();let s=e.next();for(;e.hasNext();){const n=e.next(),i=this.createSplitEdge(s,n);t.add(i),s=n}}addEndpoints(){const t=this.edge.pts.length-1;this.add(this.edge.pts[0],0,0),this.add(this.edge.pts[t],t,0)}createSplitEdge(t,e){let s=e.segmentIndex-t.segmentIndex+2;const n=this.edge.pts[e.segmentIndex],i=e.dist>0||!e.coord.equals2D(n);i||s--;const r=new Array(s).fill(null);let o=0;r[o++]=new p(t.coord);for(let s=t.segmentIndex+1;s<=e.segmentIndex;s++)r[o++]=this.edge.pts[s];return i&&(r[o]=e.coord),new Ks(r,new As(this.edge._label))}add(t,e,s){const n=new Fs(t,e,s),i=this._nodeMap.get(n);return null!==i?i:(this._nodeMap.put(n,n),n)}isIntersection(t){for(let e=this.iterator();e.hasNext();){if(e.next().coord.equals(t))return!0}return!1}}class Us{constructor(){Us.constructor_.apply(this,arguments)}static constructor_(){if(this._data=null,this._size=0,0===arguments.length)Us.constructor_.call(this,10);else if(1===arguments.length){const t=arguments[0];this._data=new Array(t).fill(null)}}size(){return this._size}addAll(t){return null===t||0===t.length?null:(this.ensureCapacity(this._size+t.length),q.arraycopy(t,0,this._data,this._size,t.length),void(this._size+=t.length))}ensureCapacity(t){if(t<=this._data.length)return null;const e=Math.max(t,2*this._data.length);this._data=et.copyOf(this._data,e)}toArray(){const t=new Array(this._size).fill(null);return q.arraycopy(this._data,0,t,0,this._size),t}add(t){this.ensureCapacity(this._size+1),this._data[this._size]=t,++this._size}}class Hs{static toIntArray(t){const e=new Array(t.size()).fill(null);for(let s=0;s<e.length;s++)e[s]=t.get(s).intValue();return e}getChainStartIndices(t){let e=0;const s=new Us(Math.trunc(t.length/2));s.add(e);do{const n=this.findChainEnd(t,e);s.add(n),e=n}while(e<t.length-1);return s.toArray()}findChainEnd(t,e){const s=Is.quadrant(t[e],t[e+1]);let n=e+1;for(;n<t.length;){if(Is.quadrant(t[n-1],t[n])!==s)break;n++}return n-1}OLDgetChainStartIndices(t){let e=0;const s=new S;s.add(e);do{const n=this.findChainEnd(t,e);s.add(n),e=n}while(e<t.length-1);return Hs.toIntArray(s)}}class Ws{constructor(){Ws.constructor_.apply(this,arguments)}static constructor_(){this.e=null,this.pts=null,this.startIndex=null;const t=arguments[0];this.e=t,this.pts=t.getCoordinates();const e=new Hs;this.startIndex=e.getChainStartIndices(this.pts)}getCoordinates(){return this.pts}getMaxX(t){const e=this.pts[this.startIndex[t]].x,s=this.pts[this.startIndex[t+1]].x;return e>s?e:s}getMinX(t){const e=this.pts[this.startIndex[t]].x,s=this.pts[this.startIndex[t+1]].x;return e<s?e:s}computeIntersectsForChain(){if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];this.computeIntersectsForChain(this.startIndex[t],this.startIndex[t+1],e,e.startIndex[s],e.startIndex[s+1],n)}else if(6===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=arguments[4],r=arguments[5];if(e-t==1&&i-n==1)return r.addIntersections(this.e,t,s.e,n),null;if(!this.overlaps(t,e,s,n,i))return null;const o=Math.trunc((t+e)/2),l=Math.trunc((n+i)/2);t<o&&(n<l&&this.computeIntersectsForChain(t,o,s,n,l,r),l<i&&this.computeIntersectsForChain(t,o,s,l,i,r)),o<e&&(n<l&&this.computeIntersectsForChain(o,e,s,n,l,r),l<i&&this.computeIntersectsForChain(o,e,s,l,i,r))}}overlaps(t,e,s,n,i){return P.intersects(this.pts[t],this.pts[e],s.pts[n],s.pts[i])}getStartIndexes(){return this.startIndex}computeIntersects(t,e){for(let s=0;s<this.startIndex.length-1;s++)for(let n=0;n<t.startIndex.length-1;n++)this.computeIntersectsForChain(s,t,n,e)}}class Zs{constructor(){Zs.constructor_.apply(this,arguments)}static constructor_(){this._depth=Array(2).fill().map((()=>Array(3)));for(let t=0;t<2;t++)for(let e=0;e<3;e++)this._depth[t][e]=Zs.NULL_VALUE}static depthAtLocation(t){return t===jt.EXTERIOR?0:t===jt.INTERIOR?1:Zs.NULL_VALUE}getDepth(t,e){return this._depth[t][e]}setDepth(t,e,s){this._depth[t][e]=s}isNull(){if(0===arguments.length){for(let t=0;t<2;t++)for(let e=0;e<3;e++)if(this._depth[t][e]!==Zs.NULL_VALUE)return!1;return!0}if(1===arguments.length){const t=arguments[0];return this._depth[t][1]===Zs.NULL_VALUE}if(2===arguments.length){const t=arguments[0],e=arguments[1];return this._depth[t][e]===Zs.NULL_VALUE}}normalize(){for(let t=0;t<2;t++)if(!this.isNull(t)){let e=this._depth[t][1];this._depth[t][2]<e&&(e=this._depth[t][2]),e<0&&(e=0);for(let s=1;s<3;s++){let n=0;this._depth[t][s]>e&&(n=1),this._depth[t][s]=n}}}getDelta(t){return this._depth[t][Ps.RIGHT]-this._depth[t][Ps.LEFT]}getLocation(t,e){return this._depth[t][e]<=0?jt.EXTERIOR:jt.INTERIOR}toString(){return"A: "+this._depth[0][1]+","+this._depth[0][2]+" B: "+this._depth[1][1]+","+this._depth[1][2]}add(){if(1===arguments.length){const t=arguments[0];for(let e=0;e<2;e++)for(let s=1;s<3;s++){const n=t.getLocation(e,s);n!==jt.EXTERIOR&&n!==jt.INTERIOR||(this.isNull(e,s)?this._depth[e][s]=Zs.depthAtLocation(n):this._depth[e][s]+=Zs.depthAtLocation(n))}}else if(3===arguments.length){const t=arguments[0],e=arguments[1];arguments[2]===jt.INTERIOR&&this._depth[t][e]++}}}Zs.NULL_VALUE=-1;class js{constructor(){js.constructor_.apply(this,arguments)}static constructor_(){if(this._label=null,this._isInResult=!1,this._isCovered=!1,this._isCoveredSet=!1,this._isVisited=!1,0===arguments.length);else if(1===arguments.length){const t=arguments[0];this._label=t}}setVisited(t){this._isVisited=t}setInResult(t){this._isInResult=t}isCovered(){return this._isCovered}isCoveredSet(){return this._isCoveredSet}setLabel(t){this._label=t}getLabel(){return this._label}setCovered(t){this._isCovered=t,this._isCoveredSet=!0}updateIM(t){u.isTrue(this._label.getGeometryCount()>=2,"found partial label"),this.computeIM(t)}isInResult(){return this._isInResult}isVisited(){return this._isVisited}}class Ks extends js{constructor(){super(),Ks.constructor_.apply(this,arguments)}static constructor_(){if(this.pts=null,this._env=null,this.eiList=new ks(this),this._name=null,this._mce=null,this._isIsolated=!0,this._depth=new Zs,this._depthDelta=0,1===arguments.length){const t=arguments[0];Ks.constructor_.call(this,t,null)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.pts=t,this._label=e}}static updateIM(){if(!(2===arguments.length&&arguments[1]instanceof Kt&&arguments[0]instanceof As))return super.updateIM.apply(this,arguments);{const t=arguments[0],e=arguments[1];e.setAtLeastIfValid(t.getLocation(0,Ps.ON),t.getLocation(1,Ps.ON),1),t.isArea()&&(e.setAtLeastIfValid(t.getLocation(0,Ps.LEFT),t.getLocation(1,Ps.LEFT),2),e.setAtLeastIfValid(t.getLocation(0,Ps.RIGHT),t.getLocation(1,Ps.RIGHT),2))}}getDepth(){return this._depth}getCollapsedEdge(){const t=new Array(2).fill(null);t[0]=this.pts[0],t[1]=this.pts[1];return new Ks(t,As.toLineLabel(this._label))}isIsolated(){return this._isIsolated}getCoordinates(){return this.pts}setIsolated(t){this._isIsolated=t}setName(t){this._name=t}equals(t){if(!(t instanceof Ks))return!1;const e=t;if(this.pts.length!==e.pts.length)return!1;let s=!0,n=!0,i=this.pts.length;for(let t=0;t<this.pts.length;t++)if(this.pts[t].equals2D(e.pts[t])||(s=!1),this.pts[t].equals2D(e.pts[--i])||(n=!1),!s&&!n)return!1;return!0}getCoordinate(){if(0===arguments.length)return this.pts.length>0?this.pts[0]:null;if(1===arguments.length){const t=arguments[0];return this.pts[t]}}print(t){t.print("edge "+this._name+": "),t.print("LINESTRING (");for(let e=0;e<this.pts.length;e++)e>0&&t.print(","),t.print(this.pts[e].x+" "+this.pts[e].y);t.print(") "+this._label+" "+this._depthDelta)}computeIM(t){Ks.updateIM(this._label,t)}isCollapsed(){return!!this._label.isArea()&&(3===this.pts.length&&!!this.pts[0].equals(this.pts[2]))}isClosed(){return this.pts[0].equals(this.pts[this.pts.length-1])}getMaximumSegmentIndex(){return this.pts.length-1}getDepthDelta(){return this._depthDelta}getNumPoints(){return this.pts.length}printReverse(t){t.print("edge "+this._name+": ");for(let e=this.pts.length-1;e>=0;e--)t.print(this.pts[e]+" ");t.println("")}getMonotoneChainEdge(){return null===this._mce&&(this._mce=new Ws(this)),this._mce}getEnvelope(){if(null===this._env){this._env=new P;for(let t=0;t<this.pts.length;t++)this._env.expandToInclude(this.pts[t])}return this._env}addIntersection(t,e,s,n){const i=new p(t.getIntersection(n));let r=e,o=t.getEdgeDistance(s,n);const l=r+1;if(l<this.pts.length){const t=this.pts[l];i.equals2D(t)&&(r=l,o=0)}this.eiList.add(i,r,o)}toString(){const t=new dt;t.append("edge "+this._name+": "),t.append("LINESTRING (");for(let e=0;e<this.pts.length;e++)e>0&&t.append(","),t.append(this.pts[e].x+" "+this.pts[e].y);return t.append(") "+this._label+" "+this._depthDelta),t.toString()}isPointwiseEqual(t){if(this.pts.length!==t.pts.length)return!1;for(let e=0;e<this.pts.length;e++)if(!this.pts[e].equals2D(t.pts[e]))return!1;return!0}setDepthDelta(t){this._depthDelta=t}getEdgeIntersectionList(){return this.eiList}addIntersections(t,e,s){for(let n=0;n<t.getIntersectionNum();n++)this.addIntersection(t,e,s,n)}}class Qs extends js{constructor(){super(),Qs.constructor_.apply(this,arguments)}static constructor_(){this._coord=null,this._edges=null;const t=arguments[0],e=arguments[1];this._coord=t,this._edges=e,this._label=new As(0,jt.NONE)}isIncidentEdgeInResult(){for(let t=this.getEdges().getEdges().iterator();t.hasNext();){if(t.next().getEdge().isInResult())return!0}return!1}isIsolated(){return 1===this._label.getGeometryCount()}getCoordinate(){return this._coord}print(t){t.println("node "+this._coord+" lbl: "+this._label)}computeIM(t){}computeMergedLocation(t,e){let s=jt.NONE;if(s=this._label.getLocation(e),!t.isNull(e)){const n=t.getLocation(e);s!==jt.BOUNDARY&&(s=n)}return s}setLabel(){if(2!==arguments.length||!Number.isInteger(arguments[1])||!Number.isInteger(arguments[0]))return super.setLabel.apply(this,arguments);{const t=arguments[0],e=arguments[1];null===this._label?this._label=new As(t,e):this._label.setLocation(t,e)}}getEdges(){return this._edges}mergeLabel(){if(arguments[0]instanceof Qs){const t=arguments[0];this.mergeLabel(t._label)}else if(arguments[0]instanceof As){const t=arguments[0];for(let e=0;e<2;e++){const s=this.computeMergedLocation(t,e);this._label.getLocation(e)===jt.NONE&&this._label.setLocation(e,s)}}}add(t){this._edges.insert(t),t.setNode(this)}setLabelBoundary(t){if(null===this._label)return null;let e=jt.NONE;null!==this._label&&(e=this._label.getLocation(t));let s=null;switch(e){case jt.BOUNDARY:s=jt.INTERIOR;break;case jt.INTERIOR:default:s=jt.BOUNDARY}this._label.setLocation(t,s)}}class Js{constructor(){Js.constructor_.apply(this,arguments)}static constructor_(){this.nodeMap=new Xs,this.nodeFact=null;const t=arguments[0];this.nodeFact=t}find(t){return this.nodeMap.get(t)}addNode(){if(arguments[0]instanceof p){const t=arguments[0];let e=this.nodeMap.get(t);return null===e&&(e=this.nodeFact.createNode(t),this.nodeMap.put(t,e)),e}if(arguments[0]instanceof Qs){const t=arguments[0],e=this.nodeMap.get(t.getCoordinate());return null===e?(this.nodeMap.put(t.getCoordinate(),t),t):(e.mergeLabel(t),e)}}print(t){for(let e=this.iterator();e.hasNext();){e.next().print(t)}}iterator(){return this.nodeMap.values().iterator()}values(){return this.nodeMap.values()}getBoundaryNodes(t){const e=new S;for(let s=this.iterator();s.hasNext();){const n=s.next();n.getLabel().getLocation(t)===jt.BOUNDARY&&e.add(n)}return e}add(t){const e=t.getCoordinate();this.addNode(e).add(t)}}class $s{constructor(){$s.constructor_.apply(this,arguments)}static constructor_(){if(this._edge=null,this._label=null,this._node=null,this._p0=null,this._p1=null,this._dx=null,this._dy=null,this._quadrant=null,1===arguments.length){const t=arguments[0];this._edge=t}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];$s.constructor_.call(this,t,e,s,null)}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];$s.constructor_.call(this,t),this.init(e,s),this._label=n}}compareDirection(t){return this._dx===t._dx&&this._dy===t._dy?0:this._quadrant>t._quadrant?1:this._quadrant<t._quadrant?-1:F.index(t._p0,t._p1,this._p1)}getDy(){return this._dy}getCoordinate(){return this._p0}setNode(t){this._node=t}print(t){const e=Math.atan2(this._dy,this._dx),s=this.getClass().getName(),n=s.lastIndexOf("."),i=s.substring(n+1);t.print(" "+i+": "+this._p0+" - "+this._p1+" "+this._quadrant+":"+e+" "+this._label)}compareTo(t){const e=t;return this.compareDirection(e)}getDirectedCoordinate(){return this._p1}getDx(){return this._dx}getLabel(){return this._label}getEdge(){return this._edge}getQuadrant(){return this._quadrant}getNode(){return this._node}toString(){const t=Math.atan2(this._dy,this._dx),e=this.getClass().getName(),s=e.lastIndexOf(".");return" "+e.substring(s+1)+": "+this._p0+" - "+this._p1+" "+this._quadrant+":"+t+" "+this._label}computeLabel(t){}init(t,e){this._p0=t,this._p1=e,this._dx=e.x-t.x,this._dy=e.y-t.y,this._quadrant=Is.quadrant(this._dx,this._dy),u.isTrue(!(0===this._dx&&0===this._dy),"EdgeEnd with identical endpoints found")}get interfaces_(){return[r]}}class tn extends c{constructor(t,e){super(e?t+" [ "+e+" ]":t),this.pt=e?new p(e):void 0,this.name=Object.keys({TopologyException:tn})[0]}getCoordinate(){return this.pt}}class en extends $s{constructor(){super(),en.constructor_.apply(this,arguments)}static constructor_(){this._isForward=null,this._isInResult=!1,this._isVisited=!1,this._sym=null,this._next=null,this._nextMin=null,this._edgeRing=null,this._minEdgeRing=null,this._depth=[0,-999,-999];const t=arguments[0],e=arguments[1];if($s.constructor_.call(this,t),this._isForward=e,e)this.init(t.getCoordinate(0),t.getCoordinate(1));else{const e=t.getNumPoints()-1;this.init(t.getCoordinate(e),t.getCoordinate(e-1))}this.computeDirectedLabel()}static depthFactor(t,e){return t===jt.EXTERIOR&&e===jt.INTERIOR?1:t===jt.INTERIOR&&e===jt.EXTERIOR?-1:0}getNextMin(){return this._nextMin}getDepth(t){return this._depth[t]}setVisited(t){this._isVisited=t}computeDirectedLabel(){this._label=new As(this._edge.getLabel()),this._isForward||this._label.flip()}getNext(){return this._next}setDepth(t,e){if(-999!==this._depth[t]&&this._depth[t]!==e)throw new tn("assigned depths do not match",this.getCoordinate());this._depth[t]=e}isInteriorAreaEdge(){let t=!0;for(let e=0;e<2;e++)this._label.isArea(e)&&this._label.getLocation(e,Ps.LEFT)===jt.INTERIOR&&this._label.getLocation(e,Ps.RIGHT)===jt.INTERIOR||(t=!1);return t}setNextMin(t){this._nextMin=t}print(t){super.print.call(this,t),t.print(" "+this._depth[Ps.LEFT]+"/"+this._depth[Ps.RIGHT]),t.print(" ("+this.getDepthDelta()+")"),this._isInResult&&t.print(" inResult")}setMinEdgeRing(t){this._minEdgeRing=t}isLineEdge(){const t=this._label.isLine(0)||this._label.isLine(1),e=!this._label.isArea(0)||this._label.allPositionsEqual(0,jt.EXTERIOR),s=!this._label.isArea(1)||this._label.allPositionsEqual(1,jt.EXTERIOR);return t&&e&&s}setEdgeRing(t){this._edgeRing=t}getMinEdgeRing(){return this._minEdgeRing}getDepthDelta(){let t=this._edge.getDepthDelta();return this._isForward||(t=-t),t}setInResult(t){this._isInResult=t}getSym(){return this._sym}isForward(){return this._isForward}getEdge(){return this._edge}printEdge(t){this.print(t),t.print(" "),this._isForward?this._edge.print(t):this._edge.printReverse(t)}setSym(t){this._sym=t}setVisitedEdge(t){this.setVisited(t),this._sym.setVisited(t)}setEdgeDepths(t,e){let s=this.getEdge().getDepthDelta();this._isForward||(s=-s);let n=1;t===Ps.LEFT&&(n=-1);const i=Ps.opposite(t),r=e+s*n;this.setDepth(t,e),this.setDepth(i,r)}getEdgeRing(){return this._edgeRing}isInResult(){return this._isInResult}setNext(t){this._next=t}isVisited(){return this._isVisited}}class sn{createNode(t){return new Qs(t,null)}}class nn{constructor(){nn.constructor_.apply(this,arguments)}static constructor_(){if(this._edges=new S,this._nodes=null,this._edgeEndList=new S,0===arguments.length)this._nodes=new Js(new sn);else if(1===arguments.length){const t=arguments[0];this._nodes=new Js(t)}}static linkResultDirectedEdges(t){for(let e=t.iterator();e.hasNext();){e.next().getEdges().linkResultDirectedEdges()}}printEdges(t){t.println("Edges:");for(let e=0;e<this._edges.size();e++){t.println("edge "+e+":");const s=this._edges.get(e);s.print(t),s.eiList.print(t)}}find(t){return this._nodes.find(t)}addNode(){if(arguments[0]instanceof Qs){const t=arguments[0];return this._nodes.addNode(t)}if(arguments[0]instanceof p){const t=arguments[0];return this._nodes.addNode(t)}}getNodeIterator(){return this._nodes.iterator()}linkResultDirectedEdges(){for(let t=this._nodes.iterator();t.hasNext();){t.next().getEdges().linkResultDirectedEdges()}}debugPrintln(t){q.out.println(t)}isBoundaryNode(t,e){const s=this._nodes.find(e);if(null===s)return!1;const n=s.getLabel();return null!==n&&n.getLocation(t)===jt.BOUNDARY}linkAllDirectedEdges(){for(let t=this._nodes.iterator();t.hasNext();){t.next().getEdges().linkAllDirectedEdges()}}matchInSameDirection(t,e,s,n){return!!t.equals(s)&&(F.index(t,e,n)===F.COLLINEAR&&Is.quadrant(t,e)===Is.quadrant(s,n))}getEdgeEnds(){return this._edgeEndList}debugPrint(t){q.out.print(t)}getEdgeIterator(){return this._edges.iterator()}findEdgeInSameDirection(t,e){for(let s=0;s<this._edges.size();s++){const n=this._edges.get(s),i=n.getCoordinates();if(this.matchInSameDirection(t,e,i[0],i[1]))return n;if(this.matchInSameDirection(t,e,i[i.length-1],i[i.length-2]))return n}return null}insertEdge(t){this._edges.add(t)}findEdgeEnd(t){for(let e=this.getEdgeEnds().iterator();e.hasNext();){const s=e.next();if(s.getEdge()===t)return s}return null}addEdges(t){for(let e=t.iterator();e.hasNext();){const t=e.next();this._edges.add(t);const s=new en(t,!0),n=new en(t,!1);s.setSym(n),n.setSym(s),this.add(s),this.add(n)}}add(t){this._nodes.add(t),this._edgeEndList.add(t)}getNodes(){return this._nodes.values()}findEdge(t,e){for(let s=0;s<this._edges.size();s++){const n=this._edges.get(s),i=n.getCoordinates();if(t.equals(i[0])&&e.equals(i[1]))return n}return null}}class rn extends nn{constructor(){super(),rn.constructor_.apply(this,arguments)}static constructor_(){if(this._parentGeom=null,this._lineEdgeMap=new Et,this._boundaryNodeRule=null,this._useBoundaryDeterminationRule=!0,this._argIndex=null,this._boundaryNodes=null,this._hasTooFewPoints=!1,this._invalidPoint=null,this._areaPtLocator=null,this._ptLocator=new _s,2===arguments.length){const t=arguments[0],e=arguments[1];rn.constructor_.call(this,t,e,cs.OGC_SFS_BOUNDARY_RULE)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._argIndex=t,this._parentGeom=e,this._boundaryNodeRule=s,null!==e&&this.add(e)}}static determineBoundary(t,e){return t.isInBoundary(e)?jt.BOUNDARY:jt.INTERIOR}insertBoundaryPoint(t,e){const s=this._nodes.addNode(e).getLabel();let n=1,i=jt.NONE;i=s.getLocation(t,Ps.ON),i===jt.BOUNDARY&&n++;const r=rn.determineBoundary(this._boundaryNodeRule,n);s.setLocation(t,r)}computeSelfNodes(){if(2===arguments.length){const t=arguments[0],e=arguments[1];return this.computeSelfNodes(t,e,!1)}if(3===arguments.length){const t=arguments[1],e=arguments[2],s=new Ms(arguments[0],!0,!1);s.setIsDoneIfProperInt(e);const n=this.createEdgeSetIntersector(),i=this._parentGeom instanceof ht||this._parentGeom instanceof nt||this._parentGeom instanceof mt,r=t||!i;return n.computeIntersections(this._edges,s,r),this.addSelfIntersectionNodes(this._argIndex),s}}computeSplitEdges(t){for(let e=this._edges.iterator();e.hasNext();){e.next().eiList.addSplitEdges(t)}}computeEdgeIntersections(t,e,s){const n=new Ms(e,s,!0);n.setBoundaryNodes(this.getBoundaryNodes(),t.getBoundaryNodes());return this.createEdgeSetIntersector().computeIntersections(this._edges,t._edges,n),n}getGeometry(){return this._parentGeom}getBoundaryNodeRule(){return this._boundaryNodeRule}hasTooFewPoints(){return this._hasTooFewPoints}addPoint(){if(arguments[0]instanceof $){const t=arguments[0].getCoordinate();this.insertPoint(this._argIndex,t,jt.INTERIOR)}else if(arguments[0]instanceof p){const t=arguments[0];this.insertPoint(this._argIndex,t,jt.INTERIOR)}}addPolygon(t){this.addPolygonRing(t.getExteriorRing(),jt.EXTERIOR,jt.INTERIOR);for(let e=0;e<t.getNumInteriorRing();e++){const s=t.getInteriorRingN(e);this.addPolygonRing(s,jt.INTERIOR,jt.EXTERIOR)}}addEdge(t){this.insertEdge(t);const e=t.getCoordinates();this.insertPoint(this._argIndex,e[0],jt.BOUNDARY),this.insertPoint(this._argIndex,e[e.length-1],jt.BOUNDARY)}addLineString(t){const e=gt.removeRepeatedPoints(t.getCoordinates());if(e.length<2)return this._hasTooFewPoints=!0,this._invalidPoint=e[0],null;const s=new Ks(e,new As(this._argIndex,jt.INTERIOR));this._lineEdgeMap.put(t,s),this.insertEdge(s),u.isTrue(e.length>=2,"found LineString with single point"),this.insertBoundaryPoint(this._argIndex,e[0]),this.insertBoundaryPoint(this._argIndex,e[e.length-1])}getInvalidPoint(){return this._invalidPoint}getBoundaryPoints(){const t=this.getBoundaryNodes(),e=new Array(t.size()).fill(null);let s=0;for(let n=t.iterator();n.hasNext();){const t=n.next();e[s++]=t.getCoordinate().copy()}return e}getBoundaryNodes(){return null===this._boundaryNodes&&(this._boundaryNodes=this._nodes.getBoundaryNodes(this._argIndex)),this._boundaryNodes}addSelfIntersectionNode(t,e,s){if(this.isBoundaryNode(t,e))return null;s===jt.BOUNDARY&&this._useBoundaryDeterminationRule?this.insertBoundaryPoint(t,e):this.insertPoint(t,e,s)}addPolygonRing(t,e,s){if(t.isEmpty())return null;const n=gt.removeRepeatedPoints(t.getCoordinates());if(n.length<4)return this._hasTooFewPoints=!0,this._invalidPoint=n[0],null;let i=e,r=s;F.isCCW(n)&&(i=s,r=e);const o=new Ks(n,new As(this._argIndex,jt.BOUNDARY,i,r));this._lineEdgeMap.put(t,o),this.insertEdge(o),this.insertPoint(this._argIndex,n[0],jt.BOUNDARY)}insertPoint(t,e,s){const n=this._nodes.addNode(e),i=n.getLabel();null===i?n._label=new As(t,s):i.setLocation(t,s)}createEdgeSetIntersector(){return new bs}addSelfIntersectionNodes(t){for(let e=this._edges.iterator();e.hasNext();){const s=e.next(),n=s.getLabel().getLocation(t);for(let e=s.eiList.iterator();e.hasNext();){const s=e.next();this.addSelfIntersectionNode(t,s.coord,n)}}}add(){if(!(1===arguments.length&&arguments[0]instanceof X))return super.add.apply(this,arguments);{const t=arguments[0];if(t.isEmpty())return null;if(t instanceof mt&&(this._useBoundaryDeterminationRule=!1),t instanceof nt)this.addPolygon(t);else if(t instanceof Q)this.addLineString(t);else if(t instanceof $)this.addPoint(t);else if(t instanceof ct)this.addCollection(t);else if(t instanceof Ct)this.addCollection(t);else if(t instanceof mt)this.addCollection(t);else{if(!(t instanceof at))throw new Z(t.getGeometryType());this.addCollection(t)}}}addCollection(t){for(let e=0;e<t.getNumGeometries();e++){const s=t.getGeometryN(e);this.add(s)}}locate(t){return E(this._parentGeom,st)&&this._parentGeom.getNumGeometries()>50?(null===this._areaPtLocator&&(this._areaPtLocator=new Ye(this._parentGeom)),this._areaPtLocator.locate(t)):this._ptLocator.locate(t,this._parentGeom)}findEdge(){if(1===arguments.length&&arguments[0]instanceof Q){const t=arguments[0];return this._lineEdgeMap.get(t)}return super.findEdge.apply(this,arguments)}}var on=Object.freeze({__proto__:null,GeometryGraph:rn});class ln{visit(t){}}class an{constructor(){an.constructor_.apply(this,arguments)}static constructor_(){if(this._p=null,this._data=null,this._left=null,this._right=null,this._count=null,2===arguments.length){const t=arguments[0],e=arguments[1];this._p=new p(t),this._left=null,this._right=null,this._count=1,this._data=e}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._p=new p(t,e),this._left=null,this._right=null,this._count=1,this._data=s}}isRepeated(){return this._count>1}getRight(){return this._right}getCoordinate(){return this._p}setLeft(t){this._left=t}getX(){return this._p.x}getData(){return this._data}getCount(){return this._count}getLeft(){return this._left}getY(){return this._p.y}increment(){this._count=this._count+1}setRight(t){this._right=t}}class cn{constructor(){cn.constructor_.apply(this,arguments)}static constructor_(){if(this._root=null,this._numberOfNodes=null,this._tolerance=null,0===arguments.length)cn.constructor_.call(this,0);else if(1===arguments.length){const t=arguments[0];this._tolerance=t}}static toCoordinates(){if(1===arguments.length){const t=arguments[0];return cn.toCoordinates(t,!1)}if(2===arguments.length){const t=arguments[0],e=arguments[1],s=new T;for(let n=t.iterator();n.hasNext();){const t=n.next(),i=e?t.getCount():1;for(let e=0;e<i;e++)s.add(t.getCoordinate(),!0)}return s.toCoordinateArray()}}insert(){if(1===arguments.length){const t=arguments[0];return this.insert(t,null)}if(2===arguments.length){const t=arguments[0],e=arguments[1];if(null===this._root)return this._root=new an(t,e),this._root;if(this._tolerance>0){const e=this.findBestMatchNode(t);if(null!==e)return e.increment(),e}return this.insertExact(t,e)}}query(){if(1===arguments.length){const t=arguments[0],e=new S;return this.query(t,e),e}if(2===arguments.length)if(arguments[0]instanceof P&&E(arguments[1],C)){const t=arguments[0],e=arguments[1];this.queryNode(this._root,t,!0,new class{get interfaces_(){return[ln]}visit(t){e.add(t)}})}else if(arguments[0]instanceof P&&E(arguments[1],ln)){const t=arguments[0],e=arguments[1];this.queryNode(this._root,t,!0,e)}}queryNode(t,e,s,n){if(null===t)return null;let i=null,r=null,o=null;s?(i=e.getMinX(),r=e.getMaxX(),o=t.getX()):(i=e.getMinY(),r=e.getMaxY(),o=t.getY());const l=o<=r;i<o&&this.queryNode(t.getLeft(),e,!s,n),e.contains(t.getCoordinate())&&n.visit(t),l&&this.queryNode(t.getRight(),e,!s,n)}findBestMatchNode(t){const e=new hn(t,this._tolerance);return this.query(e.queryEnvelope(),e),e.getNode()}isEmpty(){return null===this._root}insertExact(t,e){let s=this._root,n=this._root,i=!0,r=!0;for(;null!==s;){if(null!==s){if(t.distance(s.getCoordinate())<=this._tolerance)return s.increment(),s}r=i?t.x<s.getX():t.y<s.getY(),n=s,s=r?s.getLeft():s.getRight(),i=!i}this._numberOfNodes=this._numberOfNodes+1;const o=new an(t,e);return r?n.setLeft(o):n.setRight(o),o}}class hn{constructor(){hn.constructor_.apply(this,arguments)}static constructor_(){this._tolerance=null,this._matchNode=null,this._matchDist=0,this._p=null;const t=arguments[0],e=arguments[1];this._p=t,this._tolerance=e}visit(t){const e=this._p.distance(t.getCoordinate());if(!(e<=this._tolerance))return null;let s=!1;(null===this._matchNode||e<this._matchDist||null!==this._matchNode&&e===this._matchDist&&t.getCoordinate().compareTo(this._matchNode.getCoordinate())<1)&&(s=!0),s&&(this._matchNode=t,this._matchDist=e)}queryEnvelope(){const t=new P(this._p);return t.expandBy(this._tolerance),t}getNode(){return this._matchNode}get interfaces_(){return[ln]}}cn.BestMatchVisitor=hn;var un=Object.freeze({__proto__:null,KdTree:cn});class gn{constructor(){gn.constructor_.apply(this,arguments)}static constructor_(){this._items=new S,this._subnode=new Array(4).fill(null)}static getSubnodeIndex(t,e,s){let n=-1;return t.getMinX()>=e&&(t.getMinY()>=s&&(n=3),t.getMaxY()<=s&&(n=1)),t.getMaxX()<=e&&(t.getMinY()>=s&&(n=2),t.getMaxY()<=s&&(n=0)),n}hasChildren(){for(let t=0;t<4;t++)if(null!==this._subnode[t])return!0;return!1}isPrunable(){return!(this.hasChildren()||this.hasItems())}addAllItems(t){t.addAll(this._items);for(let e=0;e<4;e++)null!==this._subnode[e]&&this._subnode[e].addAllItems(t);return t}getNodeCount(){let t=0;for(let e=0;e<4;e++)null!==this._subnode[e]&&(t+=this._subnode[e].size());return t+1}size(){let t=0;for(let e=0;e<4;e++)null!==this._subnode[e]&&(t+=this._subnode[e].size());return t+this._items.size()}addAllItemsFromOverlapping(t,e){if(!this.isSearchMatch(t))return null;e.addAll(this._items);for(let s=0;s<4;s++)null!==this._subnode[s]&&this._subnode[s].addAllItemsFromOverlapping(t,e)}visitItems(t,e){for(let t=this._items.iterator();t.hasNext();)e.visitItem(t.next())}hasItems(){return!this._items.isEmpty()}remove(t,e){if(!this.isSearchMatch(t))return!1;let s=!1;for(let n=0;n<4;n++)if(null!==this._subnode[n]&&(s=this._subnode[n].remove(t,e),s)){this._subnode[n].isPrunable()&&(this._subnode[n]=null);break}return s||(s=this._items.remove(e),s)}visit(t,e){if(!this.isSearchMatch(t))return null;this.visitItems(t,e);for(let s=0;s<4;s++)null!==this._subnode[s]&&this._subnode[s].visit(t,e)}getItems(){return this._items}depth(){let t=0;for(let e=0;e<4;e++)if(null!==this._subnode[e]){const s=this._subnode[e].depth();s>t&&(t=s)}return t+1}isEmpty(){let t=!0;if(this._items.isEmpty()){for(let e=0;e<4;e++)if(null!==this._subnode[e]&&!this._subnode[e].isEmpty()){t=!1;break}}else t=!1;return t}add(t){this._items.add(t)}get interfaces_(){return[a]}}function dn(){}dn.exponent=function(t){return function(t,e){let s,n,i,r;const o={32:{d:127,c:128,b:0,a:0},64:{d:32752,c:0,b:0,a:0}},l={32:8,64:11}[t];r||(s=e<0||1/e<0,isFinite(e)||(r=o[t],s&&(r.d+=1<<t/4-1),n=Math.pow(2,l)-1,i=0));if(!r){for(n={32:127,64:1023}[t],i=Math.abs(e);i>=2;)n++,i/=2;for(;i<1&&n>0;)n--,i*=2;n<=0&&(i/=2),32===t&&n>254&&(r={d:s?255:127,c:128,b:0,a:0},n=Math.pow(2,l)-1,i=0)}return n}(64,t)-1023},dn.powerOf2=function(t){return Math.pow(2,t)};class _n{constructor(){_n.constructor_.apply(this,arguments)}static constructor_(){this._pt=new p,this._level=0,this._env=null;const t=arguments[0];this.computeKey(t)}static computeQuadLevel(t){const e=t.getWidth(),s=t.getHeight(),n=e>s?e:s;return dn.exponent(n)+1}getLevel(){return this._level}computeKey(){if(1===arguments.length){const t=arguments[0];for(this._level=_n.computeQuadLevel(t),this._env=new P,this.computeKey(this._level,t);!this._env.contains(t);)this._level+=1,this.computeKey(this._level,t)}else if(2===arguments.length){const t=arguments[0],e=arguments[1],s=dn.powerOf2(t);this._pt.x=Math.floor(e.getMinX()/s)*s,this._pt.y=Math.floor(e.getMinY()/s)*s,this._env.init(this._pt.x,this._pt.x+s,this._pt.y,this._pt.y+s)}}getEnvelope(){return this._env}getCentre(){return new p((this._env.getMinX()+this._env.getMaxX())/2,(this._env.getMinY()+this._env.getMaxY())/2)}getPoint(){return this._pt}}class pn extends gn{constructor(){super(),pn.constructor_.apply(this,arguments)}static constructor_(){this._env=null,this._centrex=null,this._centrey=null,this._level=null;const t=arguments[0],e=arguments[1];this._env=t,this._level=e,this._centrex=(t.getMinX()+t.getMaxX())/2,this._centrey=(t.getMinY()+t.getMaxY())/2}static createNode(t){const e=new _n(t);return new pn(e.getEnvelope(),e.getLevel())}static createExpanded(t,e){const s=new P(e);null!==t&&s.expandToInclude(t._env);const n=pn.createNode(s);return null!==t&&n.insertNode(t),n}find(t){const e=gn.getSubnodeIndex(t,this._centrex,this._centrey);if(-1===e)return this;if(null!==this._subnode[e]){return this._subnode[e].find(t)}return this}isSearchMatch(t){return null!==t&&this._env.intersects(t)}getSubnode(t){return null===this._subnode[t]&&(this._subnode[t]=this.createSubnode(t)),this._subnode[t]}getEnvelope(){return this._env}getNode(t){const e=gn.getSubnodeIndex(t,this._centrex,this._centrey);if(-1!==e){return this.getSubnode(e).getNode(t)}return this}createSubnode(t){let e=0,s=0,n=0,i=0;switch(t){case 0:e=this._env.getMinX(),s=this._centrex,n=this._env.getMinY(),i=this._centrey;break;case 1:e=this._centrex,s=this._env.getMaxX(),n=this._env.getMinY(),i=this._centrey;break;case 2:e=this._env.getMinX(),s=this._centrex,n=this._centrey,i=this._env.getMaxY();break;case 3:e=this._centrex,s=this._env.getMaxX(),n=this._centrey,i=this._env.getMaxY()}const r=new P(e,s,n,i);return new pn(r,this._level-1)}insertNode(t){u.isTrue(null===this._env||this._env.contains(t._env));const e=gn.getSubnodeIndex(t._env,this._centrex,this._centrey);if(t._level===this._level-1)this._subnode[e]=t;else{const s=this.createSubnode(e);s.insertNode(t),this._subnode[e]=s}}}class mn{static isZeroWidth(t,e){const s=e-t;if(0===s)return!0;const n=s/Math.max(Math.abs(t),Math.abs(e));return dn.exponent(n)<=mn.MIN_BINARY_EXPONENT}}mn.MIN_BINARY_EXPONENT=-50;class fn extends gn{constructor(){super()}insert(t,e){const s=gn.getSubnodeIndex(t,fn.origin.x,fn.origin.y);if(-1===s)return this.add(e),null;const n=this._subnode[s];if(null===n||!n.getEnvelope().contains(t)){const e=pn.createExpanded(n,t);this._subnode[s]=e}this.insertContained(this._subnode[s],t,e)}isSearchMatch(t){return!0}insertContained(t,e,s){u.isTrue(t.getEnvelope().contains(e));const n=mn.isZeroWidth(e.getMinX(),e.getMaxX()),i=mn.isZeroWidth(e.getMinY(),e.getMaxY());let r=null;r=n||i?t.find(e):t.getNode(e),r.add(s)}}fn.origin=new p(0,0);class yn{insert(t,e){}remove(t,e){}query(){}}class xn{constructor(){xn.constructor_.apply(this,arguments)}static constructor_(){this._root=null,this._minExtent=1,this._root=new fn}static ensureExtent(t,e){let s=t.getMinX(),n=t.getMaxX(),i=t.getMinY(),r=t.getMaxY();return s!==n&&i!==r?t:(s===n&&(s-=e/2,n+=e/2),i===r&&(i-=e/2,r+=e/2),new P(s,n,i,r))}size(){return null!==this._root?this._root.size():0}insert(t,e){this.collectStats(t);const s=xn.ensureExtent(t,this._minExtent);this._root.insert(s,e)}query(){if(1===arguments.length){const t=arguments[0],e=new qe;return this.query(t,e),e.getItems()}if(2===arguments.length){const t=arguments[0],e=arguments[1];this._root.visit(t,e)}}queryAll(){const t=new S;return this._root.addAllItems(t),t}remove(t,e){const s=xn.ensureExtent(t,this._minExtent);return this._root.remove(s,e)}collectStats(t){const e=t.getWidth();e<this._minExtent&&e>0&&(this._minExtent=e);const s=t.getHeight();s<this._minExtent&&s>0&&(this._minExtent=s)}depth(){return null!==this._root?this._root.depth():0}isEmpty(){return null===this._root||this._root.isEmpty()}get interfaces_(){return[yn,a]}}var En=Object.freeze({__proto__:null,Quadtree:xn});class In{getBounds(){}}class Nn{constructor(){Nn.constructor_.apply(this,arguments)}static constructor_(){this._bounds=null,this._item=null;const t=arguments[0],e=arguments[1];this._bounds=t,this._item=e}getItem(){return this._item}getBounds(){return this._bounds}get interfaces_(){return[In,a]}}class Cn{constructor(){Cn.constructor_.apply(this,arguments)}static constructor_(){this._size=null,this._items=null,this._size=0,this._items=new S,this._items.add(null)}poll(){if(this.isEmpty())return null;const t=this._items.get(1);return this._items.set(1,this._items.get(this._size)),this._size-=1,this.reorder(1),t}size(){return this._size}reorder(t){let e=null;const s=this._items.get(t);for(;2*t<=this._size&&(e=2*t,e!==this._size&&this._items.get(e+1).compareTo(this._items.get(e))<0&&e++,this._items.get(e).compareTo(s)<0);t=e)this._items.set(t,this._items.get(e));this._items.set(t,s)}clear(){this._size=0,this._items.clear()}peek(){if(this.isEmpty())return null;return this._items.get(1)}isEmpty(){return 0===this._size}add(t){this._items.add(null),this._size+=1;let e=this._size;for(this._items.set(0,t);t.compareTo(this._items.get(Math.trunc(e/2)))<0;e/=2)this._items.set(e,this._items.get(Math.trunc(e/2)));this._items.set(e,t)}}class wn{constructor(){wn.constructor_.apply(this,arguments)}static constructor_(){if(this._childBoundables=new S,this._bounds=null,this._level=null,0===arguments.length);else if(1===arguments.length){const t=arguments[0];this._level=t}}getLevel(){return this._level}size(){return this._childBoundables.size()}getChildBoundables(){return this._childBoundables}addChildBoundable(t){u.isTrue(null===this._bounds),this._childBoundables.add(t)}isEmpty(){return this._childBoundables.isEmpty()}getBounds(){return null===this._bounds&&(this._bounds=this.computeBounds()),this._bounds}get interfaces_(){return[In,a]}}class Sn{static maxDistance(t,e,s,n,i,r,o,l){let a=Sn.distance(t,e,i,r);return a=Math.max(a,Sn.distance(t,e,o,l)),a=Math.max(a,Sn.distance(s,n,i,r)),a=Math.max(a,Sn.distance(s,n,o,l)),a}static distance(t,e,s,n){const i=s-t,r=n-e;return Math.sqrt(i*i+r*r)}static maximumDistance(t,e){const s=Math.min(t.getMinX(),e.getMinX()),n=Math.min(t.getMinY(),e.getMinY()),i=Math.max(t.getMaxX(),e.getMaxX()),r=Math.max(t.getMaxY(),e.getMaxY());return Sn.distance(s,n,i,r)}static minMaxDistance(t,e){const s=t.getMinX(),n=t.getMinY(),i=t.getMaxX(),r=t.getMaxY(),o=e.getMinX(),l=e.getMinY(),a=e.getMaxX(),c=e.getMaxY();let h=Sn.maxDistance(s,n,s,r,o,l,o,c);return h=Math.min(h,Sn.maxDistance(s,n,s,r,o,l,a,l)),h=Math.min(h,Sn.maxDistance(s,n,s,r,a,c,o,c)),h=Math.min(h,Sn.maxDistance(s,n,s,r,a,c,a,l)),h=Math.min(h,Sn.maxDistance(s,n,i,n,o,l,o,c)),h=Math.min(h,Sn.maxDistance(s,n,i,n,o,l,a,l)),h=Math.min(h,Sn.maxDistance(s,n,i,n,a,c,o,c)),h=Math.min(h,Sn.maxDistance(s,n,i,n,a,c,a,l)),h=Math.min(h,Sn.maxDistance(i,r,s,r,o,l,o,c)),h=Math.min(h,Sn.maxDistance(i,r,s,r,o,l,a,l)),h=Math.min(h,Sn.maxDistance(i,r,s,r,a,c,o,c)),h=Math.min(h,Sn.maxDistance(i,r,s,r,a,c,a,l)),h=Math.min(h,Sn.maxDistance(i,r,i,n,o,l,o,c)),h=Math.min(h,Sn.maxDistance(i,r,i,n,o,l,a,l)),h=Math.min(h,Sn.maxDistance(i,r,i,n,a,c,o,c)),h=Math.min(h,Sn.maxDistance(i,r,i,n,a,c,a,l)),h}}class Ln{constructor(){Ln.constructor_.apply(this,arguments)}static constructor_(){this._boundable1=null,this._boundable2=null,this._distance=null,this._itemDistance=null;const t=arguments[0],e=arguments[1],s=arguments[2];this._boundable1=t,this._boundable2=e,this._itemDistance=s,this._distance=this.distance()}static area(t){return t.getBounds().getArea()}static isComposite(t){return t instanceof wn}maximumDistance(){return Sn.maximumDistance(this._boundable1.getBounds(),this._boundable2.getBounds())}expandToQueue(t,e){const n=Ln.isComposite(this._boundable1),i=Ln.isComposite(this._boundable2);if(n&&i)return Ln.area(this._boundable1)>Ln.area(this._boundable2)?(this.expand(this._boundable1,this._boundable2,!1,t,e),null):(this.expand(this._boundable2,this._boundable1,!0,t,e),null);if(n)return this.expand(this._boundable1,this._boundable2,!1,t,e),null;if(i)return this.expand(this._boundable2,this._boundable1,!0,t,e),null;throw new s("neither boundable is composite")}isLeaves(){return!(Ln.isComposite(this._boundable1)||Ln.isComposite(this._boundable2))}compareTo(t){const e=t;return this._distance<e._distance?-1:this._distance>e._distance?1:0}expand(t,e,s,n,i){for(let r=t.getChildBoundables().iterator();r.hasNext();){const t=r.next();let o=null;o=s?new Ln(e,t,this._itemDistance):new Ln(t,e,this._itemDistance),o.getDistance()<i&&n.add(o)}}getBoundable(t){return 0===t?this._boundable1:this._boundable2}getDistance(){return this._distance}distance(){return this.isLeaves()?this._itemDistance.distance(this._boundable1,this._boundable2):this._boundable1.getBounds().distance(this._boundable2.getBounds())}get interfaces_(){return[r]}}class Tn{constructor(){Tn.constructor_.apply(this,arguments)}static constructor_(){if(this._root=null,this._built=!1,this._itemBoundables=new S,this._nodeCapacity=null,0===arguments.length)Tn.constructor_.call(this,Tn.DEFAULT_NODE_CAPACITY);else if(1===arguments.length){const t=arguments[0];u.isTrue(t>1,"Node capacity must be greater than 1"),this._nodeCapacity=t}}static compareDoubles(t,e){return t>e?1:t<e?-1:0}queryInternal(){if(E(arguments[2],Me)&&arguments[0]instanceof Object&&arguments[1]instanceof wn){const t=arguments[0],e=arguments[2],s=arguments[1].getChildBoundables();for(let n=0;n<s.size();n++){const i=s.get(n);this.getIntersectsOp().intersects(i.getBounds(),t)&&(i instanceof wn?this.queryInternal(t,i,e):i instanceof Nn?e.visitItem(i.getItem()):u.shouldNeverReachHere())}}else if(E(arguments[2],C)&&arguments[0]instanceof Object&&arguments[1]instanceof wn){const t=arguments[0],e=arguments[2],s=arguments[1].getChildBoundables();for(let n=0;n<s.size();n++){const i=s.get(n);this.getIntersectsOp().intersects(i.getBounds(),t)&&(i instanceof wn?this.queryInternal(t,i,e):i instanceof Nn?e.add(i.getItem()):u.shouldNeverReachHere())}}}getNodeCapacity(){return this._nodeCapacity}lastNode(t){return t.get(t.size()-1)}size(){if(0===arguments.length)return this.isEmpty()?0:(this.build(),this.size(this._root));if(1===arguments.length){let t=0;for(let e=arguments[0].getChildBoundables().iterator();e.hasNext();){const s=e.next();s instanceof wn?t+=this.size(s):s instanceof Nn&&(t+=1)}return t}}removeItem(t,e){let s=null;for(let n=t.getChildBoundables().iterator();n.hasNext();){const t=n.next();t instanceof Nn&&t.getItem()===e&&(s=t)}return null!==s&&(t.getChildBoundables().remove(s),!0)}itemsTree(){if(0===arguments.length){this.build();const t=this.itemsTree(this._root);return null===t?new S:t}if(1===arguments.length){const t=arguments[0],e=new S;for(let s=t.getChildBoundables().iterator();s.hasNext();){const t=s.next();if(t instanceof wn){const s=this.itemsTree(t);null!==s&&e.add(s)}else t instanceof Nn?e.add(t.getItem()):u.shouldNeverReachHere()}return e.size()<=0?null:e}}insert(t,e){u.isTrue(!this._built,"Cannot insert items into an STR packed R-tree after it has been built."),this._itemBoundables.add(new Nn(t,e))}boundablesAtLevel(){if(1===arguments.length){const t=arguments[0],e=new S;return this.boundablesAtLevel(t,this._root,e),e}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];if(u.isTrue(t>-2),e.getLevel()===t)return s.add(e),null;for(let n=e.getChildBoundables().iterator();n.hasNext();){const e=n.next();e instanceof wn?this.boundablesAtLevel(t,e,s):(u.isTrue(e instanceof Nn),-1===t&&s.add(e))}return null}}query(){if(1===arguments.length){const t=arguments[0];this.build();const e=new S;return this.isEmpty()||this.getIntersectsOp().intersects(this._root.getBounds(),t)&&this.queryInternal(t,this._root,e),e}if(2===arguments.length){const t=arguments[0],e=arguments[1];if(this.build(),this.isEmpty())return null;this.getIntersectsOp().intersects(this._root.getBounds(),t)&&this.queryInternal(t,this._root,e)}}build(){if(this._built)return null;this._root=this._itemBoundables.isEmpty()?this.createNode(0):this.createHigherLevels(this._itemBoundables,-1),this._itemBoundables=null,this._built=!0}getRoot(){return this.build(),this._root}remove(){if(2===arguments.length){const t=arguments[0],e=arguments[1];return this.build(),!!this.getIntersectsOp().intersects(this._root.getBounds(),t)&&this.remove(t,this._root,e)}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];let n=this.removeItem(e,s);if(n)return!0;let i=null;for(let r=e.getChildBoundables().iterator();r.hasNext();){const e=r.next();if(this.getIntersectsOp().intersects(e.getBounds(),t)&&(e instanceof wn&&(n=this.remove(t,e,s),n))){i=e;break}}return null!==i&&i.getChildBoundables().isEmpty()&&e.getChildBoundables().remove(i),n}}createHigherLevels(t,e){u.isTrue(!t.isEmpty());const s=this.createParentBoundables(t,e+1);return 1===s.size()?s.get(0):this.createHigherLevels(s,e+1)}depth(){if(0===arguments.length)return this.isEmpty()?0:(this.build(),this.depth(this._root));if(1===arguments.length){let t=0;for(let e=arguments[0].getChildBoundables().iterator();e.hasNext();){const s=e.next();if(s instanceof wn){const e=this.depth(s);e>t&&(t=e)}}return t+1}}createParentBoundables(t,e){u.isTrue(!t.isEmpty());const s=new S;s.add(this.createNode(e));const n=new S(t);fe.sort(n,this.getComparator());for(let t=n.iterator();t.hasNext();){const n=t.next();this.lastNode(s).getChildBoundables().size()===this.getNodeCapacity()&&s.add(this.createNode(e)),this.lastNode(s).addChildBoundable(n)}return s}isEmpty(){return this._built?this._root.isEmpty():this._itemBoundables.isEmpty()}get interfaces_(){return[a]}}Tn.IntersectsOp=function(){},Tn.DEFAULT_NODE_CAPACITY=10;class Rn{distance(t,e){}}class Pn extends Tn{constructor(){super(),Pn.constructor_.apply(this,arguments)}static constructor_(){if(0===arguments.length)Pn.constructor_.call(this,Pn.DEFAULT_NODE_CAPACITY);else if(1===arguments.length){const t=arguments[0];Tn.constructor_.call(this,t)}}static centreX(t){return Pn.avg(t.getMinX(),t.getMaxX())}static avg(t,e){return(t+e)/2}static getItems(t){const e=new Array(t.size()).fill(null);let s=0;for(;!t.isEmpty();){const n=t.poll();e[s]=n.getBoundable(0).getItem(),s++}return e}static centreY(t){return Pn.avg(t.getMinY(),t.getMaxY())}createParentBoundablesFromVerticalSlices(t,e){u.isTrue(t.length>0);const s=new S;for(let n=0;n<t.length;n++)s.addAll(this.createParentBoundablesFromVerticalSlice(t[n],e));return s}nearestNeighbourK(){if(2===arguments.length){const t=arguments[0],e=arguments[1];return this.nearestNeighbourK(t,i.POSITIVE_INFINITY,e)}if(3===arguments.length){const t=arguments[0],e=arguments[2];let s=arguments[1];const n=new Cn;n.add(t);const i=new Cn;for(;!n.isEmpty()&&s>=0;){const t=n.poll(),r=t.getDistance();if(r>=s)break;if(t.isLeaves())if(i.size()<e)i.add(t);else{i.peek().getDistance()>r&&(i.poll(),i.add(t));s=i.peek().getDistance()}else t.expandToQueue(n,s)}return Pn.getItems(i)}}createNode(t){return new On(t)}size(){return 0===arguments.length?super.size.call(this):super.size.apply(this,arguments)}insert(){if(!(2===arguments.length&&arguments[1]instanceof Object&&arguments[0]instanceof P))return super.insert.apply(this,arguments);{const t=arguments[0],e=arguments[1];if(t.isNull())return null;super.insert.call(this,t,e)}}getIntersectsOp(){return Pn.intersectsOp}verticalSlices(t,e){const s=Math.trunc(Math.ceil(t.size()/e)),n=new Array(e).fill(null),i=t.iterator();for(let t=0;t<e;t++){n[t]=new S;let e=0;for(;i.hasNext()&&e<s;){const s=i.next();n[t].add(s),e++}}return n}query(){if(1===arguments.length){const t=arguments[0];return super.query.call(this,t)}if(2===arguments.length){const t=arguments[0],e=arguments[1];super.query.call(this,t,e)}}getComparator(){return Pn.yComparator}createParentBoundablesFromVerticalSlice(t,e){return super.createParentBoundables.call(this,t,e)}remove(){if(2===arguments.length&&arguments[1]instanceof Object&&arguments[0]instanceof P){const t=arguments[0],e=arguments[1];return super.remove.call(this,t,e)}return super.remove.apply(this,arguments)}depth(){return 0===arguments.length?super.depth.call(this):super.depth.apply(this,arguments)}createParentBoundables(t,e){u.isTrue(!t.isEmpty());const s=Math.trunc(Math.ceil(t.size()/this.getNodeCapacity())),n=new S(t);fe.sort(n,Pn.xComparator);const i=this.verticalSlices(n,Math.trunc(Math.ceil(Math.sqrt(s))));return this.createParentBoundablesFromVerticalSlices(i,e)}nearestNeighbour(){if(1===arguments.length){if(E(arguments[0],Rn)){const t=arguments[0];if(this.isEmpty())return null;const e=new Ln(this.getRoot(),this.getRoot(),t);return this.nearestNeighbour(e)}if(arguments[0]instanceof Ln){const t=arguments[0];let e=i.POSITIVE_INFINITY,s=null;const n=new Cn;for(n.add(t);!n.isEmpty()&&e>0;){const t=n.poll(),i=t.getDistance();if(i>=e)break;t.isLeaves()?(e=i,s=t):t.expandToQueue(n,e)}return null===s?null:[s.getBoundable(0).getItem(),s.getBoundable(1).getItem()]}}else{if(2===arguments.length){const t=arguments[0],e=arguments[1];if(this.isEmpty()||t.isEmpty())return null;const s=new Ln(this.getRoot(),t.getRoot(),e);return this.nearestNeighbour(s)}if(3===arguments.length){const t=arguments[2],e=new Nn(arguments[0],arguments[1]),s=new Ln(this.getRoot(),e,t);return this.nearestNeighbour(s)[0]}if(4===arguments.length){const t=arguments[2],e=arguments[3],s=new Nn(arguments[0],arguments[1]),n=new Ln(this.getRoot(),s,t);return this.nearestNeighbourK(n,e)}}}isWithinDistance(){if(2===arguments.length){const t=arguments[0],e=arguments[1];let s=i.POSITIVE_INFINITY;const n=new Cn;for(n.add(t);!n.isEmpty();){const t=n.poll(),i=t.getDistance();if(i>e)return!1;if(t.maximumDistance()<=e)return!0;if(t.isLeaves()){if(s=i,s<=e)return!0}else t.expandToQueue(n,s)}return!1}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=new Ln(this.getRoot(),t.getRoot(),e);return this.isWithinDistance(n,s)}}get interfaces_(){return[yn,a]}}class On extends wn{constructor(){super(),On.constructor_.apply(this,arguments)}static constructor_(){const t=arguments[0];wn.constructor_.call(this,t)}computeBounds(){let t=null;for(let e=this.getChildBoundables().iterator();e.hasNext();){const s=e.next();null===t?t=new P(s.getBounds()):t.expandToInclude(s.getBounds())}return t}}Pn.STRtreeNode=On,Pn.xComparator=new class{get interfaces_(){return[l]}compare(t,e){return Tn.compareDoubles(Pn.centreX(t.getBounds()),Pn.centreX(e.getBounds()))}},Pn.yComparator=new class{get interfaces_(){return[l]}compare(t,e){return Tn.compareDoubles(Pn.centreY(t.getBounds()),Pn.centreY(e.getBounds()))}},Pn.intersectsOp=new class{get interfaces_(){return[IntersectsOp]}intersects(t,e){return t.intersects(e)}},Pn.DEFAULT_NODE_CAPACITY=10;var vn=Object.freeze({__proto__:null,STRtree:Pn}),Mn=Object.freeze({__proto__:null,kdtree:un,quadtree:En,strtree:vn});const bn=["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"];class Dn{constructor(t){this.geometryFactory=t||new wt}read(t){let e;e="string"==typeof t?JSON.parse(t):t;const s=e.type;if(!An[s])throw new Error("Unknown GeoJSON type: "+e.type);return-1!==bn.indexOf(s)?An[s].call(this,e.coordinates):"GeometryCollection"===s?An[s].call(this,e.geometries):An[s].call(this,e)}write(t){const e=t.getGeometryType();if(!Fn[e])throw new Error("Geometry is not supported");return Fn[e].call(this,t)}}const An={Feature:function(t){const e={};for(const s in t)e[s]=t[s];if(t.geometry){const s=t.geometry.type;if(!An[s])throw new Error("Unknown GeoJSON type: "+t.type);e.geometry=this.read(t.geometry)}return t.bbox&&(e.bbox=An.bbox.call(this,t.bbox)),e},FeatureCollection:function(t){const e={};if(t.features){e.features=[];for(let s=0;s<t.features.length;++s)e.features.push(this.read(t.features[s]))}return t.bbox&&(e.bbox=this.parse.bbox.call(this,t.bbox)),e},coordinates:function(t){const e=[];for(let s=0;s<t.length;++s){const n=t[s];e.push(new p(...n))}return e},bbox:function(t){return this.geometryFactory.createLinearRing([new p(t[0],t[1]),new p(t[2],t[1]),new p(t[2],t[3]),new p(t[0],t[3]),new p(t[0],t[1])])},Point:function(t){const e=new p(...t);return this.geometryFactory.createPoint(e)},MultiPoint:function(t){const e=[];for(let s=0;s<t.length;++s)e.push(An.Point.call(this,t[s]));return this.geometryFactory.createMultiPoint(e)},LineString:function(t){const e=An.coordinates.call(this,t);return this.geometryFactory.createLineString(e)},MultiLineString:function(t){const e=[];for(let s=0;s<t.length;++s)e.push(An.LineString.call(this,t[s]));return this.geometryFactory.createMultiLineString(e)},Polygon:function(t){const e=An.coordinates.call(this,t[0]),s=this.geometryFactory.createLinearRing(e),n=[];for(let e=1;e<t.length;++e){const s=t[e],i=An.coordinates.call(this,s),r=this.geometryFactory.createLinearRing(i);n.push(r)}return this.geometryFactory.createPolygon(s,n)},MultiPolygon:function(t){const e=[];for(let s=0;s<t.length;++s){const n=t[s];e.push(An.Polygon.call(this,n))}return this.geometryFactory.createMultiPolygon(e)},GeometryCollection:function(t){const e=[];for(let s=0;s<t.length;++s){const n=t[s];e.push(this.read(n))}return this.geometryFactory.createGeometryCollection(e)}},Fn={coordinate:function(t){const e=[t.x,t.y];return t.z&&e.push(t.z),t.m&&e.push(t.m),e},Point:function(t){return{type:"Point",coordinates:Fn.coordinate.call(this,t.getCoordinate())}},MultiPoint:function(t){const e=[];for(let s=0;s<t._geometries.length;++s){const n=t._geometries[s],i=Fn.Point.call(this,n);e.push(i.coordinates)}return{type:"MultiPoint",coordinates:e}},LineString:function(t){const e=[],s=t.getCoordinates();for(let t=0;t<s.length;++t){const n=s[t];e.push(Fn.coordinate.call(this,n))}return{type:"LineString",coordinates:e}},MultiLineString:function(t){const e=[];for(let s=0;s<t._geometries.length;++s){const n=t._geometries[s],i=Fn.LineString.call(this,n);e.push(i.coordinates)}return{type:"MultiLineString",coordinates:e}},Polygon:function(t){const e=[],s=Fn.LineString.call(this,t._shell);e.push(s.coordinates);for(let s=0;s<t._holes.length;++s){const n=t._holes[s],i=Fn.LineString.call(this,n);e.push(i.coordinates)}return{type:"Polygon",coordinates:e}},MultiPolygon:function(t){const e=[];for(let s=0;s<t._geometries.length;++s){const n=t._geometries[s],i=Fn.Polygon.call(this,n);e.push(i.coordinates)}return{type:"MultiPolygon",coordinates:e}},GeometryCollection:function(t){const e=[];for(let s=0;s<t._geometries.length;++s){const n=t._geometries[s],i=n.getGeometryType();e.push(Fn[i].call(this,n))}return{type:"GeometryCollection",geometries:e}}};function Gn(t){return[t.x,t.y]}var qn=Object.freeze({__proto__:null,GeoJSONReader:class{constructor(t){this.parser=new Dn(t||new wt)}read(t){return this.parser.read(t)}},GeoJSONWriter:class{constructor(){this.parser=new Dn(this.geometryFactory)}write(t){return this.parser.write(t)}},OL3Parser:class{constructor(t,e){this.geometryFactory=t||new wt,this.ol=e||"undefined"!=typeof ol&&ol}inject(t,e,s,n,i,r,o,l){this.ol={geom:{Point:t,LineString:e,LinearRing:s,Polygon:n,MultiPoint:i,MultiLineString:r,MultiPolygon:o,GeometryCollection:l}}}read(t){const e=this.ol;return t instanceof e.geom.Point?this.convertFromPoint(t):t instanceof e.geom.LineString?this.convertFromLineString(t):t instanceof e.geom.LinearRing?this.convertFromLinearRing(t):t instanceof e.geom.Polygon?this.convertFromPolygon(t):t instanceof e.geom.MultiPoint?this.convertFromMultiPoint(t):t instanceof e.geom.MultiLineString?this.convertFromMultiLineString(t):t instanceof e.geom.MultiPolygon?this.convertFromMultiPolygon(t):t instanceof e.geom.GeometryCollection?this.convertFromCollection(t):void 0}convertFromPoint(t){const e=t.getCoordinates();return this.geometryFactory.createPoint(new p(e[0],e[1]))}convertFromLineString(t){return this.geometryFactory.createLineString(t.getCoordinates().map((function(t){return new p(t[0],t[1])})))}convertFromLinearRing(t){return this.geometryFactory.createLinearRing(t.getCoordinates().map((function(t){return new p(t[0],t[1])})))}convertFromPolygon(t){const e=t.getLinearRings();let s=null;const n=[];for(let t=0;t<e.length;t++){const i=this.convertFromLinearRing(e[t]);0===t?s=i:n.push(i)}return this.geometryFactory.createPolygon(s,n)}convertFromMultiPoint(t){const e=t.getPoints().map((function(t){return this.convertFromPoint(t)}),this);return this.geometryFactory.createMultiPoint(e)}convertFromMultiLineString(t){const e=t.getLineStrings().map((function(t){return this.convertFromLineString(t)}),this);return this.geometryFactory.createMultiLineString(e)}convertFromMultiPolygon(t){const e=t.getPolygons().map((function(t){return this.convertFromPolygon(t)}),this);return this.geometryFactory.createMultiPolygon(e)}convertFromCollection(t){const e=t.getGeometries().map((function(t){return this.read(t)}),this);return this.geometryFactory.createGeometryCollection(e)}write(t){return"Point"===t.getGeometryType()?this.convertToPoint(t.getCoordinate()):"LineString"===t.getGeometryType()?this.convertToLineString(t):"LinearRing"===t.getGeometryType()?this.convertToLinearRing(t):"Polygon"===t.getGeometryType()?this.convertToPolygon(t):"MultiPoint"===t.getGeometryType()?this.convertToMultiPoint(t):"MultiLineString"===t.getGeometryType()?this.convertToMultiLineString(t):"MultiPolygon"===t.getGeometryType()?this.convertToMultiPolygon(t):"GeometryCollection"===t.getGeometryType()?this.convertToCollection(t):void 0}convertToPoint(t){return new this.ol.geom.Point([t.x,t.y])}convertToLineString(t){const e=t._points._coordinates.map(Gn);return new this.ol.geom.LineString(e)}convertToLinearRing(t){const e=t._points._coordinates.map(Gn);return new this.ol.geom.LinearRing(e)}convertToPolygon(t){const e=[t._shell._points._coordinates.map(Gn)];for(let s=0;s<t._holes.length;s++)e.push(t._holes[s]._points._coordinates.map(Gn));return new this.ol.geom.Polygon(e)}convertToMultiPoint(t){return new this.ol.geom.MultiPoint(t.getCoordinates().map(Gn))}convertToMultiLineString(t){const e=[];for(let s=0;s<t._geometries.length;s++)e.push(this.convertToLineString(t._geometries[s]).getCoordinates());return new this.ol.geom.MultiLineString(e)}convertToMultiPolygon(t){const e=[];for(let s=0;s<t._geometries.length;s++)e.push(this.convertToPolygon(t._geometries[s]).getCoordinates());return new this.ol.geom.MultiPolygon(e)}convertToCollection(t){const e=[];for(let s=0;s<t._geometries.length;s++){const n=t._geometries[s];e.push(this.write(n))}return new this.ol.geom.GeometryCollection(e)}},WKTReader:class{constructor(t){this.parser=new kt(t||new wt)}read(t){return this.parser.read(t)}},WKTWriter:Ut});class Bn{static relativeSign(t,e){return t<e?-1:t>e?1:0}static compare(t,e,s){if(e.equals2D(s))return 0;const n=Bn.relativeSign(e.x,s.x),i=Bn.relativeSign(e.y,s.y);switch(t){case 0:return Bn.compareValue(n,i);case 1:return Bn.compareValue(i,n);case 2:return Bn.compareValue(i,-n);case 3:return Bn.compareValue(-n,i);case 4:return Bn.compareValue(-n,-i);case 5:return Bn.compareValue(-i,-n);case 6:return Bn.compareValue(-i,n);case 7:return Bn.compareValue(n,-i)}return u.shouldNeverReachHere("invalid octant value"),0}static compareValue(t,e){return t<0?-1:t>0?1:e<0?-1:e>0?1:0}}class Yn{constructor(){Yn.constructor_.apply(this,arguments)}static constructor_(){this._segString=null,this.coord=null,this.segmentIndex=null,this._segmentOctant=null,this._isInterior=null;const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];this._segString=t,this.coord=new p(e),this.segmentIndex=s,this._segmentOctant=n,this._isInterior=!e.equals2D(t.getCoordinate(s))}getCoordinate(){return this.coord}print(t){t.print(this.coord),t.print(" seg # = "+this.segmentIndex)}compareTo(t){const e=t;return this.segmentIndex<e.segmentIndex?-1:this.segmentIndex>e.segmentIndex?1:this.coord.equals2D(e.coord)?0:this._isInterior?e._isInterior?Bn.compare(this._segmentOctant,this.coord,e.coord):1:-1}isEndPoint(t){return 0===this.segmentIndex&&!this._isInterior||this.segmentIndex===t}toString(){return this.segmentIndex+":"+this.coord.toString()}isInterior(){return this._isInterior}get interfaces_(){return[r]}}class Vn{constructor(){Vn.constructor_.apply(this,arguments)}static constructor_(){this._nodeMap=new Xs,this._edge=null;const t=arguments[0];this._edge=t}getSplitCoordinates(){const t=new T;this.addEndpoints();const e=this.iterator();let s=e.next();for(;e.hasNext();){const n=e.next();this.addEdgeCoordinates(s,n,t),s=n}return t.toCoordinateArray()}addCollapsedNodes(){const t=new S;this.findCollapsesFromInsertedNodes(t),this.findCollapsesFromExistingVertices(t);for(let e=t.iterator();e.hasNext();){const t=e.next().intValue();this.add(this._edge.getCoordinate(t),t)}}createSplitEdgePts(t,e){let s=e.segmentIndex-t.segmentIndex+2;if(2===s)return[new p(t.coord),new p(e.coord)];const n=this._edge.getCoordinate(e.segmentIndex),i=e.isInterior()||!e.coord.equals2D(n);i||s--;const r=new Array(s).fill(null);let o=0;r[o++]=new p(t.coord);for(let s=t.segmentIndex+1;s<=e.segmentIndex;s++)r[o++]=this._edge.getCoordinate(s);return i&&(r[o]=new p(e.coord)),r}print(t){t.println("Intersections:");for(let e=this.iterator();e.hasNext();){e.next().print(t)}}findCollapsesFromExistingVertices(t){for(let e=0;e<this._edge.size()-2;e++){const s=this._edge.getCoordinate(e);this._edge.getCoordinate(e+1);const n=this._edge.getCoordinate(e+2);s.equals2D(n)&&t.add(v.valueOf(e+1))}}addEdgeCoordinates(t,e,s){const n=this.createSplitEdgePts(t,e);s.add(n,!1)}iterator(){return this._nodeMap.values().iterator()}addSplitEdges(t){this.addEndpoints(),this.addCollapsedNodes();const e=this.iterator();let s=e.next();for(;e.hasNext();){const n=e.next(),i=this.createSplitEdge(s,n);t.add(i),s=n}}findCollapseIndex(t,e,s){if(!t.coord.equals2D(e.coord))return!1;let n=e.segmentIndex-t.segmentIndex;return e.isInterior()||n--,1===n&&(s[0]=t.segmentIndex+1,!0)}findCollapsesFromInsertedNodes(t){const e=new Array(1).fill(null),s=this.iterator();let n=s.next();for(;s.hasNext();){const i=s.next();this.findCollapseIndex(n,i,e)&&t.add(v.valueOf(e[0])),n=i}}getEdge(){return this._edge}addEndpoints(){const t=this._edge.size()-1;this.add(this._edge.getCoordinate(0),0),this.add(this._edge.getCoordinate(t),t)}createSplitEdge(t,e){const s=this.createSplitEdgePts(t,e);return new Un(s,this._edge.getData())}add(t,e){const s=new Yn(this._edge,t,e,this._edge.getSegmentOctant(e)),n=this._nodeMap.get(s);return null!==n?(u.isTrue(n.coord.equals2D(t),"Found equal nodes with different coordinates"),n):(this._nodeMap.put(s,s),s)}checkSplitEdgesCorrectness(t){const e=this._edge.getCoordinates(),s=t.get(0).getCoordinate(0);if(!s.equals2D(e[0]))throw new c("bad split edge start point at "+s);const n=t.get(t.size()-1).getCoordinates(),i=n[n.length-1];if(!i.equals2D(e[e.length-1]))throw new c("bad split edge end point at "+i)}}class zn{static octant(){if("number"==typeof arguments[0]&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1];if(0===t&&0===e)throw new s("Cannot compute the octant for point ( "+t+", "+e+" )");const n=Math.abs(t),i=Math.abs(e);return t>=0?e>=0?n>=i?0:1:n>=i?7:6:e>=0?n>=i?3:2:n>=i?4:5}if(arguments[0]instanceof p&&arguments[1]instanceof p){const t=arguments[0],e=arguments[1],n=e.x-t.x,i=e.y-t.y;if(0===n&&0===i)throw new s("Cannot compute the octant for two identical points "+t);return zn.octant(n,i)}}}class Xn{getCoordinates(){}size(){}getCoordinate(t){}isClosed(){}setData(t){}getData(){}}class kn{addIntersection(t,e){}get interfaces_(){return[Xn]}}class Un{constructor(){Un.constructor_.apply(this,arguments)}static constructor_(){this._nodeList=new Vn(this),this._pts=null,this._data=null;const t=arguments[0],e=arguments[1];this._pts=t,this._data=e}static getNodedSubstrings(){if(1===arguments.length){const t=arguments[0],e=new S;return Un.getNodedSubstrings(t,e),e}if(2===arguments.length){const t=arguments[1];for(let e=arguments[0].iterator();e.hasNext();){e.next().getNodeList().addSplitEdges(t)}}}getCoordinates(){return this._pts}size(){return this._pts.length}getCoordinate(t){return this._pts[t]}isClosed(){return this._pts[0].equals(this._pts[this._pts.length-1])}getSegmentOctant(t){return t===this._pts.length-1?-1:this.safeOctant(this.getCoordinate(t),this.getCoordinate(t+1))}setData(t){this._data=t}safeOctant(t,e){return t.equals2D(e)?0:zn.octant(t,e)}getData(){return this._data}addIntersection(){if(2===arguments.length){const t=arguments[0],e=arguments[1];this.addIntersectionNode(t,e)}else if(4===arguments.length){const t=arguments[1],e=arguments[3],s=new p(arguments[0].getIntersection(e));this.addIntersection(s,t)}}toString(){return Ut.toLineString(new _t(this._pts))}getNodeList(){return this._nodeList}addIntersectionNode(t,e){let s=e;const n=s+1;if(n<this._pts.length){const e=this._pts[n];t.equals2D(e)&&(s=n)}return this._nodeList.add(t,s)}addIntersections(t,e,s){for(let n=0;n<t.getIntersectionNum();n++)this.addIntersection(t,e,s,n)}get interfaces_(){return[kn]}}class Hn{constructor(){Hn.constructor_.apply(this,arguments)}static constructor_(){this._overlapSeg1=new Zt,this._overlapSeg2=new Zt}overlap(){if(2===arguments.length);else if(4===arguments.length){const t=arguments[1],e=arguments[2],s=arguments[3];arguments[0].getLineSegment(t,this._overlapSeg1),e.getLineSegment(s,this._overlapSeg2),this.overlap(this._overlapSeg1,this._overlapSeg2)}}}class Wn{constructor(){Wn.constructor_.apply(this,arguments)}static constructor_(){this._pts=null,this._start=null,this._end=null,this._env=null,this._context=null,this._id=null;const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];this._pts=t,this._start=e,this._end=s,this._context=n}getLineSegment(t,e){e.p0=this._pts[t],e.p1=this._pts[t+1]}computeSelect(t,e,s,n){const i=this._pts[e],r=this._pts[s];if(s-e==1)return n.select(this,e),null;if(!t.intersects(i,r))return null;const o=Math.trunc((e+s)/2);e<o&&this.computeSelect(t,e,o,n),o<s&&this.computeSelect(t,o,s,n)}getCoordinates(){const t=new Array(this._end-this._start+1).fill(null);let e=0;for(let s=this._start;s<=this._end;s++)t[e++]=this._pts[s];return t}computeOverlaps(){if(2===arguments.length){const t=arguments[0],e=arguments[1];this.computeOverlaps(this._start,this._end,t,t._start,t._end,e)}else if(6===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=arguments[4],r=arguments[5];if(e-t==1&&i-n==1)return r.overlap(this,t,s,n),null;if(!this.overlaps(t,e,s,n,i))return null;const o=Math.trunc((t+e)/2),l=Math.trunc((n+i)/2);t<o&&(n<l&&this.computeOverlaps(t,o,s,n,l,r),l<i&&this.computeOverlaps(t,o,s,l,i,r)),o<e&&(n<l&&this.computeOverlaps(o,e,s,n,l,r),l<i&&this.computeOverlaps(o,e,s,l,i,r))}}setId(t){this._id=t}select(t,e){this.computeSelect(t,this._start,this._end,e)}getEnvelope(){if(null===this._env){const t=this._pts[this._start],e=this._pts[this._end];this._env=new P(t,e)}return this._env}overlaps(t,e,s,n,i){return P.intersects(this._pts[t],this._pts[e],s._pts[n],s._pts[i])}getEndIndex(){return this._end}getStartIndex(){return this._start}getContext(){return this._context}getId(){return this._id}}class Zn{static findChainEnd(t,e){let s=e;for(;s<t.length-1&&t[s].equals2D(t[s+1]);)s++;if(s>=t.length-1)return t.length-1;const n=Is.quadrant(t[s],t[s+1]);let i=e+1;for(;i<t.length;){if(!t[i-1].equals2D(t[i])){if(Is.quadrant(t[i-1],t[i])!==n)break}i++}return i-1}static getChains(){if(1===arguments.length){const t=arguments[0];return Zn.getChains(t,null)}if(2===arguments.length){const t=arguments[0],e=arguments[1],s=new S;let n=0;do{const i=Zn.findChainEnd(t,n),r=new Wn(t,n,i,e);s.add(r),n=i}while(n<t.length-1);return s}}}class jn{computeNodes(t){}getNodedSubstrings(){}}class Kn{constructor(){Kn.constructor_.apply(this,arguments)}static constructor_(){if(this._segInt=null,0===arguments.length);else if(1===arguments.length){const t=arguments[0];this.setSegmentIntersector(t)}}setSegmentIntersector(t){this._segInt=t}get interfaces_(){return[jn]}}class Qn extends Kn{constructor(){super(),Qn.constructor_.apply(this,arguments)}static constructor_(){if(this._monoChains=new S,this._index=new Pn,this._idCounter=0,this._nodedSegStrings=null,this._nOverlaps=0,0===arguments.length);else if(1===arguments.length){const t=arguments[0];Kn.constructor_.call(this,t)}}getMonotoneChains(){return this._monoChains}getNodedSubstrings(){return Un.getNodedSubstrings(this._nodedSegStrings)}getIndex(){return this._index}add(t){for(let e=Zn.getChains(t.getCoordinates(),t).iterator();e.hasNext();){const t=e.next();t.setId(this._idCounter++),this._index.insert(t.getEnvelope(),t),this._monoChains.add(t)}}computeNodes(t){this._nodedSegStrings=t;for(let e=t.iterator();e.hasNext();)this.add(e.next());this.intersectChains()}intersectChains(){const t=new Jn(this._segInt);for(let e=this._monoChains.iterator();e.hasNext();){const s=e.next();for(let e=this._index.query(s.getEnvelope()).iterator();e.hasNext();){const n=e.next();if(n.getId()>s.getId()&&(s.computeOverlaps(n,t),this._nOverlaps++),this._segInt.isDone())return null}}}}class Jn extends Hn{constructor(){super(),Jn.constructor_.apply(this,arguments)}static constructor_(){this._si=null;const t=arguments[0];this._si=t}overlap(){if(4!==arguments.length)return super.overlap.apply(this,arguments);{const t=arguments[1],e=arguments[2],s=arguments[3],n=arguments[0].getContext(),i=e.getContext();this._si.processIntersections(n,t,i,s)}}}Qn.SegmentOverlapAction=Jn;class $n{constructor(){$n.constructor_.apply(this,arguments)}static constructor_(){if(this._noder=null,this._scaleFactor=null,this._offsetX=null,this._offsetY=null,this._isScaled=!1,2===arguments.length){const t=arguments[0],e=arguments[1];$n.constructor_.call(this,t,e,0,0)}else if(4===arguments.length){const t=arguments[0],e=arguments[1];this._noder=t,this._scaleFactor=e,this._isScaled=!this.isIntegerPrecision()}}rescale(){if(E(arguments[0],I)){for(let t=arguments[0].iterator();t.hasNext();){const e=t.next();this.rescale(e.getCoordinates())}}else if(arguments[0]instanceof Array){const t=arguments[0];for(let e=0;e<t.length;e++)t[e].x=t[e].x/this._scaleFactor+this._offsetX,t[e].y=t[e].y/this._scaleFactor+this._offsetY;2===t.length&&t[0].equals2D(t[1])&&q.out.println(t)}}scale(){if(E(arguments[0],I)){const t=arguments[0],e=new S(t.size());for(let s=t.iterator();s.hasNext();){const t=s.next();e.add(new Un(this.scale(t.getCoordinates()),t.getData()))}return e}if(arguments[0]instanceof Array){const t=arguments[0],e=new Array(t.length).fill(null);for(let s=0;s<t.length;s++)e[s]=new p(Math.round((t[s].x-this._offsetX)*this._scaleFactor),Math.round((t[s].y-this._offsetY)*this._scaleFactor),t[s].getZ());return gt.removeRepeatedPoints(e)}}isIntegerPrecision(){return 1===this._scaleFactor}getNodedSubstrings(){const t=this._noder.getNodedSubstrings();return this._isScaled&&this.rescale(t),t}computeNodes(t){let e=t;this._isScaled&&(e=this.scale(t)),this._noder.computeNodes(e)}get interfaces_(){return[jn]}}var ti=Object.freeze({__proto__:null,MCIndexNoder:Qn,ScaledNoder:$n,SegmentString:Xn});class ei{constructor(){ei.constructor_.apply(this,arguments)}static constructor_(){if(this._geom=null,this._geomFact=null,this._bnRule=null,this._endpointMap=null,1===arguments.length){const t=arguments[0];ei.constructor_.call(this,t,cs.MOD2_BOUNDARY_RULE)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._geom=t,this._geomFact=t.getFactory(),this._bnRule=e}}static getBoundary(){if(1===arguments.length){return new ei(arguments[0]).getBoundary()}if(2===arguments.length){return new ei(arguments[0],arguments[1]).getBoundary()}}boundaryMultiLineString(t){if(this._geom.isEmpty())return this.getEmptyMultiPoint();const e=this.computeBoundaryCoordinates(t);return 1===e.length?this._geomFact.createPoint(e[0]):this._geomFact.createMultiPointFromCoords(e)}getBoundary(){return this._geom instanceof Q?this.boundaryLineString(this._geom):this._geom instanceof Ct?this.boundaryMultiLineString(this._geom):this._geom.getBoundary()}boundaryLineString(t){if(this._geom.isEmpty())return this.getEmptyMultiPoint();if(t.isClosed()){return this._bnRule.isInBoundary(2)?t.getStartPoint():this._geomFact.createMultiPoint()}return this._geomFact.createMultiPoint([t.getStartPoint(),t.getEndPoint()])}getEmptyMultiPoint(){return this._geomFact.createMultiPoint()}computeBoundaryCoordinates(t){const e=new S;this._endpointMap=new Xs;for(let e=0;e<t.getNumGeometries();e++){const s=t.getGeometryN(e);0!==s.getNumPoints()&&(this.addEndpoint(s.getCoordinateN(0)),this.addEndpoint(s.getCoordinateN(s.getNumPoints()-1)))}for(let t=this._endpointMap.entrySet().iterator();t.hasNext();){const s=t.next(),n=s.getValue().count;this._bnRule.isInBoundary(n)&&e.add(s.getKey())}return gt.toCoordinateArray(e)}addEndpoint(t){let e=this._endpointMap.get(t);null===e&&(e=new si,this._endpointMap.put(t,e)),e.count++}}class si{constructor(){si.constructor_.apply(this,arguments)}static constructor_(){this.count=null}}class ni{constructor(){ni.constructor_.apply(this,arguments)}static constructor_(){if(this._inputGeom=null,this._isClosedEndpointsInInterior=!0,this._nonSimpleLocation=null,1===arguments.length){const t=arguments[0];this._inputGeom=t}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._inputGeom=t,this._isClosedEndpointsInInterior=!e.isInBoundary(2)}}static isSimple(){if(1===arguments.length){return new ni(arguments[0]).isSimple()}if(2===arguments.length){return new ni(arguments[0],arguments[1]).isSimple()}}isSimpleMultiPoint(t){if(t.isEmpty())return!0;const e=new ot;for(let s=0;s<t.getNumGeometries();s++){const n=t.getGeometryN(s).getCoordinate();if(e.contains(n))return this._nonSimpleLocation=n,!1;e.add(n)}return!0}isSimplePolygonal(t){for(let e=me.getLines(t).iterator();e.hasNext();){const t=e.next();if(!this.isSimpleLinearGeometry(t))return!1}return!0}hasClosedEndpointIntersection(t){const e=new Xs;for(let s=t.getEdgeIterator();s.hasNext();){const t=s.next(),n=t.isClosed(),i=t.getCoordinate(0);this.addEndpoint(e,i,n);const r=t.getCoordinate(t.getNumPoints()-1);this.addEndpoint(e,r,n)}for(let t=e.values().iterator();t.hasNext();){const e=t.next();if(e.isClosed&&2!==e.degree)return this._nonSimpleLocation=e.getCoordinate(),!0}return!1}getNonSimpleLocation(){return this._nonSimpleLocation}isSimpleLinearGeometry(t){if(t.isEmpty())return!0;const e=new rn(0,t),s=new Wt,n=e.computeSelfNodes(s,!0);return!n.hasIntersection()||(n.hasProperIntersection()?(this._nonSimpleLocation=n.getProperIntersectionPoint(),!1):!this.hasNonEndpointIntersection(e)&&(!this._isClosedEndpointsInInterior||!this.hasClosedEndpointIntersection(e)))}hasNonEndpointIntersection(t){for(let e=t.getEdgeIterator();e.hasNext();){const t=e.next(),s=t.getMaximumSegmentIndex();for(let e=t.getEdgeIntersectionList().iterator();e.hasNext();){const t=e.next();if(!t.isEndPoint(s))return this._nonSimpleLocation=t.getCoordinate(),!0}}return!1}addEndpoint(t,e,s){let n=t.get(e);null===n&&(n=new ii(e),t.put(e,n)),n.addEndpoint(s)}computeSimple(t){return this._nonSimpleLocation=null,!!t.isEmpty()||(t instanceof Q||t instanceof Ct?this.isSimpleLinearGeometry(t):t instanceof ct?this.isSimpleMultiPoint(t):E(t,st)?this.isSimplePolygonal(t):!(t instanceof at)||this.isSimpleGeometryCollection(t))}isSimple(){return this._nonSimpleLocation=null,this.computeSimple(this._inputGeom)}isSimpleGeometryCollection(t){for(let e=0;e<t.getNumGeometries();e++){const s=t.getGeometryN(e);if(!this.computeSimple(s))return!1}return!0}}class ii{constructor(){ii.constructor_.apply(this,arguments)}static constructor_(){this.pt=null,this.isClosed=null,this.degree=null;const t=arguments[0];this.pt=t,this.isClosed=!1,this.degree=0}addEndpoint(t){this.degree++,this.isClosed|=t}getCoordinate(){return this.pt}}ni.EndpointInfo=ii;class ri{constructor(){ri.constructor_.apply(this,arguments)}static constructor_(){if(this._quadrantSegments=ri.DEFAULT_QUADRANT_SEGMENTS,this._endCapStyle=ri.CAP_ROUND,this._joinStyle=ri.JOIN_ROUND,this._mitreLimit=ri.DEFAULT_MITRE_LIMIT,this._isSingleSided=!1,this._simplifyFactor=ri.DEFAULT_SIMPLIFY_FACTOR,0===arguments.length);else if(1===arguments.length){const t=arguments[0];this.setQuadrantSegments(t)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.setQuadrantSegments(t),this.setEndCapStyle(e)}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];this.setQuadrantSegments(t),this.setEndCapStyle(e),this.setJoinStyle(s),this.setMitreLimit(n)}}static bufferDistanceError(t){const e=Math.PI/2/t;return 1-Math.cos(e/2)}getEndCapStyle(){return this._endCapStyle}isSingleSided(){return this._isSingleSided}setQuadrantSegments(t){this._quadrantSegments=t,0===this._quadrantSegments&&(this._joinStyle=ri.JOIN_BEVEL),this._quadrantSegments<0&&(this._joinStyle=ri.JOIN_MITRE,this._mitreLimit=Math.abs(this._quadrantSegments)),t<=0&&(this._quadrantSegments=1),this._joinStyle!==ri.JOIN_ROUND&&(this._quadrantSegments=ri.DEFAULT_QUADRANT_SEGMENTS)}getJoinStyle(){return this._joinStyle}setJoinStyle(t){this._joinStyle=t}setSimplifyFactor(t){this._simplifyFactor=t<0?0:t}getSimplifyFactor(){return this._simplifyFactor}getQuadrantSegments(){return this._quadrantSegments}setEndCapStyle(t){this._endCapStyle=t}getMitreLimit(){return this._mitreLimit}setMitreLimit(t){this._mitreLimit=t}setSingleSided(t){this._isSingleSided=t}}ri.CAP_ROUND=1,ri.CAP_FLAT=2,ri.CAP_SQUARE=3,ri.JOIN_ROUND=1,ri.JOIN_MITRE=2,ri.JOIN_BEVEL=3,ri.DEFAULT_QUADRANT_SEGMENTS=8,ri.DEFAULT_MITRE_LIMIT=5,ri.DEFAULT_SIMPLIFY_FACTOR=.01;class oi{constructor(){oi.constructor_.apply(this,arguments)}static constructor_(){this._minIndex=-1,this._minCoord=null,this._minDe=null,this._orientedDe=null}getCoordinate(){return this._minCoord}getRightmostSide(t,e){let s=this.getRightmostSideOfSegment(t,e);return s<0&&(s=this.getRightmostSideOfSegment(t,e-1)),s<0&&(this._minCoord=null,this.checkForRightmostCoordinate(t)),s}findRightmostEdgeAtVertex(){const t=this._minDe.getEdge().getCoordinates();u.isTrue(this._minIndex>0&&this._minIndex<t.length,"rightmost point expected to be interior vertex of edge");const e=t[this._minIndex-1],s=t[this._minIndex+1],n=F.index(this._minCoord,s,e);let i=!1;(e.y<this._minCoord.y&&s.y<this._minCoord.y&&n===F.COUNTERCLOCKWISE||e.y>this._minCoord.y&&s.y>this._minCoord.y&&n===F.CLOCKWISE)&&(i=!0),i&&(this._minIndex=this._minIndex-1)}getRightmostSideOfSegment(t,e){const s=t.getEdge().getCoordinates();if(e<0||e+1>=s.length)return-1;if(s[e].y===s[e+1].y)return-1;let n=Ps.LEFT;return s[e].y<s[e+1].y&&(n=Ps.RIGHT),n}getEdge(){return this._orientedDe}checkForRightmostCoordinate(t){const e=t.getEdge().getCoordinates();for(let s=0;s<e.length-1;s++)(null===this._minCoord||e[s].x>this._minCoord.x)&&(this._minDe=t,this._minIndex=s,this._minCoord=e[s])}findRightmostEdgeAtNode(){const t=this._minDe.getNode().getEdges();this._minDe=t.getRightmostEdge(),this._minDe.isForward()||(this._minDe=this._minDe.getSym(),this._minIndex=this._minDe.getEdge().getCoordinates().length-1)}findEdge(t){for(let e=t.iterator();e.hasNext();){const t=e.next();t.isForward()&&this.checkForRightmostCoordinate(t)}u.isTrue(0!==this._minIndex||this._minCoord.equals(this._minDe.getCoordinate()),"inconsistency in rightmost processing"),0===this._minIndex?this.findRightmostEdgeAtNode():this.findRightmostEdgeAtVertex(),this._orientedDe=this._minDe;this.getRightmostSide(this._minDe,this._minIndex)===Ps.LEFT&&(this._orientedDe=this._minDe.getSym())}}class li{constructor(){this.array=[]}addLast(t){this.array.push(t)}removeFirst(){return this.array.shift()}isEmpty(){return 0===this.array.length}}class ai{constructor(){ai.constructor_.apply(this,arguments)}static constructor_(){this._finder=null,this._dirEdgeList=new S,this._nodes=new S,this._rightMostCoord=null,this._env=null,this._finder=new oi}clearVisitedEdges(){for(let t=this._dirEdgeList.iterator();t.hasNext();){t.next().setVisited(!1)}}getRightmostCoordinate(){return this._rightMostCoord}computeNodeDepth(t){let e=null;for(let s=t.getEdges().iterator();s.hasNext();){const t=s.next();if(t.isVisited()||t.getSym().isVisited()){e=t;break}}if(null===e)throw new tn("unable to find edge to compute depths at "+t.getCoordinate());t.getEdges().computeDepths(e);for(let e=t.getEdges().iterator();e.hasNext();){const t=e.next();t.setVisited(!0),this.copySymDepths(t)}}computeDepth(t){this.clearVisitedEdges();const e=this._finder.getEdge();e.getNode(),e.getLabel(),e.setEdgeDepths(Ps.RIGHT,t),this.copySymDepths(e),this.computeDepths(e)}create(t){this.addReachable(t),this._finder.findEdge(this._dirEdgeList),this._rightMostCoord=this._finder.getCoordinate()}findResultEdges(){for(let t=this._dirEdgeList.iterator();t.hasNext();){const e=t.next();e.getDepth(Ps.RIGHT)>=1&&e.getDepth(Ps.LEFT)<=0&&!e.isInteriorAreaEdge()&&e.setInResult(!0)}}computeDepths(t){const e=new yt,s=new li,n=t.getNode();for(s.addLast(n),e.add(n),t.setVisited(!0);!s.isEmpty();){const t=s.removeFirst();e.add(t),this.computeNodeDepth(t);for(let n=t.getEdges().iterator();n.hasNext();){const t=n.next().getSym();if(t.isVisited())continue;const i=t.getNode();e.contains(i)||(s.addLast(i),e.add(i))}}}compareTo(t){const e=t;return this._rightMostCoord.x<e._rightMostCoord.x?-1:this._rightMostCoord.x>e._rightMostCoord.x?1:0}getEnvelope(){if(null===this._env){const t=new P;for(let e=this._dirEdgeList.iterator();e.hasNext();){const s=e.next().getEdge().getCoordinates();for(let e=0;e<s.length-1;e++)t.expandToInclude(s[e])}this._env=t}return this._env}addReachable(t){const e=new $e;for(e.add(t);!e.empty();){const t=e.pop();this.add(t,e)}}copySymDepths(t){const e=t.getSym();e.setDepth(Ps.LEFT,t.getDepth(Ps.RIGHT)),e.setDepth(Ps.RIGHT,t.getDepth(Ps.LEFT))}add(t,e){t.setVisited(!0),this._nodes.add(t);for(let s=t.getEdges().iterator();s.hasNext();){const t=s.next();this._dirEdgeList.add(t);const n=t.getSym().getNode();n.isVisited()||e.push(n)}}getNodes(){return this._nodes}getDirectedEdges(){return this._dirEdgeList}get interfaces_(){return[r]}}class ci{constructor(){ci.constructor_.apply(this,arguments)}static constructor_(){if(this._startDe=null,this._maxNodeDegree=-1,this._edges=new S,this._pts=new S,this._label=new As(jt.NONE),this._ring=null,this._isHole=null,this._shell=null,this._holes=new S,this._geometryFactory=null,0===arguments.length);else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._geometryFactory=e,this.computePoints(t),this.computeRing()}}computeRing(){if(null!==this._ring)return null;const t=new Array(this._pts.size()).fill(null);for(let e=0;e<this._pts.size();e++)t[e]=this._pts.get(e);this._ring=this._geometryFactory.createLinearRing(t),this._isHole=F.isCCW(this._ring.getCoordinates())}isIsolated(){return 1===this._label.getGeometryCount()}computePoints(t){this._startDe=t;let e=t,s=!0;do{if(null===e)throw new tn("Found null DirectedEdge");if(e.getEdgeRing()===this)throw new tn("Directed Edge visited twice during ring-building at "+e.getCoordinate());this._edges.add(e);const t=e.getLabel();u.isTrue(t.isArea()),this.mergeLabel(t),this.addPoints(e.getEdge(),e.isForward(),s),s=!1,this.setEdgeRing(e,this),e=this.getNext(e)}while(e!==this._startDe)}getLinearRing(){return this._ring}getCoordinate(t){return this._pts.get(t)}computeMaxNodeDegree(){this._maxNodeDegree=0;let t=this._startDe;do{const e=t.getNode().getEdges().getOutgoingDegree(this);e>this._maxNodeDegree&&(this._maxNodeDegree=e),t=this.getNext(t)}while(t!==this._startDe);this._maxNodeDegree*=2}addPoints(t,e,s){const n=t.getCoordinates();if(e){let t=1;s&&(t=0);for(let e=t;e<n.length;e++)this._pts.add(n[e])}else{let t=n.length-2;s&&(t=n.length-1);for(let e=t;e>=0;e--)this._pts.add(n[e])}}isHole(){return this._isHole}setInResult(){let t=this._startDe;do{t.getEdge().setInResult(!0),t=t.getNext()}while(t!==this._startDe)}containsPoint(t){const e=this.getLinearRing();if(!e.getEnvelopeInternal().contains(t))return!1;if(!Xe.isInRing(t,e.getCoordinates()))return!1;for(let e=this._holes.iterator();e.hasNext();){if(e.next().containsPoint(t))return!1}return!0}addHole(t){this._holes.add(t)}isShell(){return null===this._shell}getLabel(){return this._label}getEdges(){return this._edges}getMaxNodeDegree(){return this._maxNodeDegree<0&&this.computeMaxNodeDegree(),this._maxNodeDegree}getShell(){return this._shell}mergeLabel(){if(1===arguments.length){const t=arguments[0];this.mergeLabel(t,0),this.mergeLabel(t,1)}else if(2===arguments.length){const t=arguments[1],e=arguments[0].getLocation(t,Ps.RIGHT);if(e===jt.NONE)return null;if(this._label.getLocation(t)===jt.NONE)return this._label.setLocation(t,e),null}}setShell(t){this._shell=t,null!==t&&t.addHole(this)}toPolygon(t){const e=new Array(this._holes.size()).fill(null);for(let t=0;t<this._holes.size();t++)e[t]=this._holes.get(t).getLinearRing();return t.createPolygon(this.getLinearRing(),e)}}class hi extends ci{constructor(){super(),hi.constructor_.apply(this,arguments)}static constructor_(){const t=arguments[0],e=arguments[1];ci.constructor_.call(this,t,e)}setEdgeRing(t,e){t.setMinEdgeRing(e)}getNext(t){return t.getNextMin()}}class ui extends ci{constructor(){super(),ui.constructor_.apply(this,arguments)}static constructor_(){const t=arguments[0],e=arguments[1];ci.constructor_.call(this,t,e)}buildMinimalRings(){const t=new S;let e=this._startDe;do{if(null===e.getMinEdgeRing()){const s=new hi(e,this._geometryFactory);t.add(s)}e=e.getNext()}while(e!==this._startDe);return t}setEdgeRing(t,e){t.setEdgeRing(e)}linkDirectedEdgesForMinimalEdgeRings(){let t=this._startDe;do{t.getNode().getEdges().linkMinimalDirectedEdges(this),t=t.getNext()}while(t!==this._startDe)}getNext(t){return t.getNext()}}class gi{constructor(){gi.constructor_.apply(this,arguments)}static constructor_(){this._geometryFactory=null,this._shellList=new S;const t=arguments[0];this._geometryFactory=t}static findEdgeRingContaining(t,e){const s=t.getLinearRing(),n=s.getEnvelopeInternal();let i=s.getCoordinateN(0),r=null,o=null;for(let t=e.iterator();t.hasNext();){const e=t.next(),l=e.getLinearRing(),a=l.getEnvelopeInternal();if(a.equals(n))continue;if(!a.contains(n))continue;i=gt.ptNotInList(s.getCoordinates(),l.getCoordinates());let c=!1;Xe.isInRing(i,l.getCoordinates())&&(c=!0),c&&(null===r||o.contains(a))&&(r=e,o=r.getLinearRing().getEnvelopeInternal())}return r}sortShellsAndHoles(t,e,s){for(let n=t.iterator();n.hasNext();){const t=n.next();t.isHole()?s.add(t):e.add(t)}}computePolygons(t){const e=new S;for(let s=t.iterator();s.hasNext();){const t=s.next().toPolygon(this._geometryFactory);e.add(t)}return e}placeFreeHoles(t,e){for(let s=e.iterator();s.hasNext();){const e=s.next();if(null===e.getShell()){const s=gi.findEdgeRingContaining(e,t);if(null===s)throw new tn("unable to assign hole to a shell",e.getCoordinate(0));e.setShell(s)}}}buildMinimalEdgeRings(t,e,s){const n=new S;for(let i=t.iterator();i.hasNext();){const t=i.next();if(t.getMaxNodeDegree()>2){t.linkDirectedEdgesForMinimalEdgeRings();const n=t.buildMinimalRings(),i=this.findShell(n);null!==i?(this.placePolygonHoles(i,n),e.add(i)):s.addAll(n)}else n.add(t)}return n}buildMaximalEdgeRings(t){const e=new S;for(let s=t.iterator();s.hasNext();){const t=s.next();if(t.isInResult()&&t.getLabel().isArea()&&null===t.getEdgeRing()){const s=new ui(t,this._geometryFactory);e.add(s),s.setInResult()}}return e}placePolygonHoles(t,e){for(let s=e.iterator();s.hasNext();){const e=s.next();e.isHole()&&e.setShell(t)}}getPolygons(){return this.computePolygons(this._shellList)}findShell(t){let e=0,s=null;for(let n=t.iterator();n.hasNext();){const t=n.next();t.isHole()||(s=t,e++)}return u.isTrue(e<=1,"found two shells in MinimalEdgeRing list"),s}add(){if(1===arguments.length){const t=arguments[0];this.add(t.getEdgeEnds(),t.getNodes())}else if(2===arguments.length){const t=arguments[0],e=arguments[1];nn.linkResultDirectedEdges(e);const s=this.buildMaximalEdgeRings(t),n=new S,i=this.buildMinimalEdgeRings(s,this._shellList,n);this.sortShellsAndHoles(i,this._shellList,n),this.placeFreeHoles(this._shellList,n)}}}class di{constructor(){di.constructor_.apply(this,arguments)}static constructor_(){this._inputLine=null,this._distanceTol=null,this._isDeleted=null,this._angleOrientation=F.COUNTERCLOCKWISE;const t=arguments[0];this._inputLine=t}static simplify(t,e){return new di(t).simplify(e)}isDeletable(t,e,s,n){const i=this._inputLine[t],r=this._inputLine[e],o=this._inputLine[s];return!!this.isConcave(i,r,o)&&(!!this.isShallow(i,r,o,n)&&this.isShallowSampled(i,r,t,s,n))}deleteShallowConcavities(){let t=1,e=this.findNextNonDeletedIndex(t),s=this.findNextNonDeletedIndex(e),n=!1;for(;s<this._inputLine.length;){let i=!1;this.isDeletable(t,e,s,this._distanceTol)&&(this._isDeleted[e]=di.DELETE,i=!0,n=!0),t=i?s:e,e=this.findNextNonDeletedIndex(t),s=this.findNextNonDeletedIndex(e)}return n}isShallowConcavity(t,e,s,n){if(!(F.index(t,e,s)===this._angleOrientation))return!1;return Y.pointToSegment(e,t,s)<n}isShallowSampled(t,e,s,n,i){let r=Math.trunc((n-s)/di.NUM_PTS_TO_CHECK);r<=0&&(r=1);for(let o=s;o<n;o+=r)if(!this.isShallow(t,e,this._inputLine[o],i))return!1;return!0}isConcave(t,e,s){return F.index(t,e,s)===this._angleOrientation}simplify(t){this._distanceTol=Math.abs(t),t<0&&(this._angleOrientation=F.CLOCKWISE),this._isDeleted=new Array(this._inputLine.length).fill(null);let e=!1;do{e=this.deleteShallowConcavities()}while(e);return this.collapseLine()}findNextNonDeletedIndex(t){let e=t+1;for(;e<this._inputLine.length&&this._isDeleted[e]===di.DELETE;)e++;return e}isShallow(t,e,s,n){return Y.pointToSegment(e,t,s)<n}collapseLine(){const t=new T;for(let e=0;e<this._inputLine.length;e++)this._isDeleted[e]!==di.DELETE&&t.add(this._inputLine[e]);return t.toCoordinateArray()}}di.INIT=0,di.DELETE=1,di.KEEP=1,di.NUM_PTS_TO_CHECK=10;class _i{constructor(){_i.constructor_.apply(this,arguments)}static constructor_(){this._ptList=null,this._precisionModel=null,this._minimimVertexDistance=0,this._ptList=new S}getCoordinates(){return this._ptList.toArray(_i.COORDINATE_ARRAY_TYPE)}setPrecisionModel(t){this._precisionModel=t}addPt(t){const e=new p(t);if(this._precisionModel.makePrecise(e),this.isRedundant(e))return null;this._ptList.add(e)}reverse(){}addPts(t,e){if(e)for(let e=0;e<t.length;e++)this.addPt(t[e]);else for(let e=t.length-1;e>=0;e--)this.addPt(t[e])}isRedundant(t){if(this._ptList.size()<1)return!1;const e=this._ptList.get(this._ptList.size()-1);return t.distance(e)<this._minimimVertexDistance}toString(){return(new wt).createLineString(this.getCoordinates()).toString()}closeRing(){if(this._ptList.size()<1)return null;const t=new p(this._ptList.get(0)),e=this._ptList.get(this._ptList.size()-1);if(t.equals(e))return null;this._ptList.add(t)}setMinimumVertexDistance(t){this._minimimVertexDistance=t}}_i.COORDINATE_ARRAY_TYPE=new Array(0).fill(null);class pi{constructor(){pi.constructor_.apply(this,arguments)}static constructor_(){this._maxCurveSegmentError=0,this._filletAngleQuantum=null,this._closingSegLengthFactor=1,this._segList=null,this._distance=0,this._precisionModel=null,this._bufParams=null,this._li=null,this._s0=null,this._s1=null,this._s2=null,this._seg0=new Zt,this._seg1=new Zt,this._offset0=new Zt,this._offset1=new Zt,this._side=0,this._hasNarrowConcaveAngle=!1;const t=arguments[0],e=arguments[1],s=arguments[2];this._precisionModel=t,this._bufParams=e,this._li=new Wt,this._filletAngleQuantum=Math.PI/2/e.getQuadrantSegments(),e.getQuadrantSegments()>=8&&e.getJoinStyle()===ri.JOIN_ROUND&&(this._closingSegLengthFactor=pi.MAX_CLOSING_SEG_LEN_FACTOR),this.init(s)}addNextSegment(t,e){if(this._s0=this._s1,this._s1=this._s2,this._s2=t,this._seg0.setCoordinates(this._s0,this._s1),this.computeOffsetSegment(this._seg0,this._side,this._distance,this._offset0),this._seg1.setCoordinates(this._s1,this._s2),this.computeOffsetSegment(this._seg1,this._side,this._distance,this._offset1),this._s1.equals(this._s2))return null;const s=F.index(this._s0,this._s1,this._s2),n=s===F.CLOCKWISE&&this._side===Ps.LEFT||s===F.COUNTERCLOCKWISE&&this._side===Ps.RIGHT;0===s?this.addCollinear(e):n?this.addOutsideTurn(s,e):this.addInsideTurn(s,e)}addLineEndCap(t,e){const s=new Zt(t,e),n=new Zt;this.computeOffsetSegment(s,Ps.LEFT,this._distance,n);const i=new Zt;this.computeOffsetSegment(s,Ps.RIGHT,this._distance,i);const r=e.x-t.x,o=e.y-t.y,l=Math.atan2(o,r);switch(this._bufParams.getEndCapStyle()){case ri.CAP_ROUND:this._segList.addPt(n.p1),this.addDirectedFillet(e,l+Math.PI/2,l-Math.PI/2,F.CLOCKWISE,this._distance),this._segList.addPt(i.p1);break;case ri.CAP_FLAT:this._segList.addPt(n.p1),this._segList.addPt(i.p1);break;case ri.CAP_SQUARE:const t=new p;t.x=Math.abs(this._distance)*Math.cos(l),t.y=Math.abs(this._distance)*Math.sin(l);const s=new p(n.p1.x+t.x,n.p1.y+t.y),r=new p(i.p1.x+t.x,i.p1.y+t.y);this._segList.addPt(s),this._segList.addPt(r)}}getCoordinates(){return this._segList.getCoordinates()}addMitreJoin(t,e,s,n){const i=G.intersection(e.p0,e.p1,s.p0,s.p1);if(null!==i){if((n<=0?1:i.distance(t)/Math.abs(n))<=this._bufParams.getMitreLimit())return this._segList.addPt(i),null}this.addLimitedMitreJoin(e,s,n,this._bufParams.getMitreLimit())}addOutsideTurn(t,e){if(this._offset0.p1.distance(this._offset1.p0)<this._distance*pi.OFFSET_SEGMENT_SEPARATION_FACTOR)return this._segList.addPt(this._offset0.p1),null;this._bufParams.getJoinStyle()===ri.JOIN_MITRE?this.addMitreJoin(this._s1,this._offset0,this._offset1,this._distance):this._bufParams.getJoinStyle()===ri.JOIN_BEVEL?this.addBevelJoin(this._offset0,this._offset1):(e&&this._segList.addPt(this._offset0.p1),this.addCornerFillet(this._s1,this._offset0.p1,this._offset1.p0,t,this._distance),this._segList.addPt(this._offset1.p0))}createSquare(t){this._segList.addPt(new p(t.x+this._distance,t.y+this._distance)),this._segList.addPt(new p(t.x+this._distance,t.y-this._distance)),this._segList.addPt(new p(t.x-this._distance,t.y-this._distance)),this._segList.addPt(new p(t.x-this._distance,t.y+this._distance)),this._segList.closeRing()}addSegments(t,e){this._segList.addPts(t,e)}addFirstSegment(){this._segList.addPt(this._offset1.p0)}addCornerFillet(t,e,s,n,i){const r=e.x-t.x,o=e.y-t.y;let l=Math.atan2(o,r);const a=s.x-t.x,c=s.y-t.y,h=Math.atan2(c,a);n===F.CLOCKWISE?l<=h&&(l+=2*Math.PI):l>=h&&(l-=2*Math.PI),this._segList.addPt(e),this.addDirectedFillet(t,l,h,n,i),this._segList.addPt(s)}addLastSegment(){this._segList.addPt(this._offset1.p1)}initSideSegments(t,e,s){this._s1=t,this._s2=e,this._side=s,this._seg1.setCoordinates(t,e),this.computeOffsetSegment(this._seg1,s,this._distance,this._offset1)}addLimitedMitreJoin(t,e,s,n){const i=this._seg0.p1,r=Qt.angle(i,this._seg0.p0),o=Qt.angleBetweenOriented(this._seg0.p0,i,this._seg1.p1)/2,l=Qt.normalize(r+o),a=Qt.normalize(l+Math.PI),c=n*s,h=s-c*Math.abs(Math.sin(o)),u=i.x+c*Math.cos(a),g=i.y+c*Math.sin(a),d=new p(u,g),_=new Zt(i,d),m=_.pointAlongOffset(1,h),f=_.pointAlongOffset(1,-h);this._side===Ps.LEFT?(this._segList.addPt(m),this._segList.addPt(f)):(this._segList.addPt(f),this._segList.addPt(m))}addDirectedFillet(t,e,s,n,i){const r=n===F.CLOCKWISE?-1:1,o=Math.abs(e-s),l=Math.trunc(o/this._filletAngleQuantum+.5);if(l<1)return null;const a=o/l,c=new p;for(let s=0;s<l;s++){const n=e+r*s*a;c.x=t.x+i*Math.cos(n),c.y=t.y+i*Math.sin(n),this._segList.addPt(c)}}computeOffsetSegment(t,e,s,n){const i=e===Ps.LEFT?1:-1,r=t.p1.x-t.p0.x,o=t.p1.y-t.p0.y,l=Math.sqrt(r*r+o*o),a=i*s*r/l,c=i*s*o/l;n.p0.x=t.p0.x-c,n.p0.y=t.p0.y+a,n.p1.x=t.p1.x-c,n.p1.y=t.p1.y+a}addInsideTurn(t,e){if(this._li.computeIntersection(this._offset0.p0,this._offset0.p1,this._offset1.p0,this._offset1.p1),this._li.hasIntersection())this._segList.addPt(this._li.getIntersection(0));else if(this._hasNarrowConcaveAngle=!0,this._offset0.p1.distance(this._offset1.p0)<this._distance*pi.INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR)this._segList.addPt(this._offset0.p1);else{if(this._segList.addPt(this._offset0.p1),this._closingSegLengthFactor>0){const t=new p((this._closingSegLengthFactor*this._offset0.p1.x+this._s1.x)/(this._closingSegLengthFactor+1),(this._closingSegLengthFactor*this._offset0.p1.y+this._s1.y)/(this._closingSegLengthFactor+1));this._segList.addPt(t);const e=new p((this._closingSegLengthFactor*this._offset1.p0.x+this._s1.x)/(this._closingSegLengthFactor+1),(this._closingSegLengthFactor*this._offset1.p0.y+this._s1.y)/(this._closingSegLengthFactor+1));this._segList.addPt(e)}else this._segList.addPt(this._s1);this._segList.addPt(this._offset1.p0)}}createCircle(t){const e=new p(t.x+this._distance,t.y);this._segList.addPt(e),this.addDirectedFillet(t,0,2*Math.PI,-1,this._distance),this._segList.closeRing()}addBevelJoin(t,e){this._segList.addPt(t.p1),this._segList.addPt(e.p0)}init(t){this._distance=t,this._maxCurveSegmentError=t*(1-Math.cos(this._filletAngleQuantum/2)),this._segList=new _i,this._segList.setPrecisionModel(this._precisionModel),this._segList.setMinimumVertexDistance(t*pi.CURVE_VERTEX_SNAP_DISTANCE_FACTOR)}addCollinear(t){this._li.computeIntersection(this._s0,this._s1,this._s1,this._s2);this._li.getIntersectionNum()>=2&&(this._bufParams.getJoinStyle()===ri.JOIN_BEVEL||this._bufParams.getJoinStyle()===ri.JOIN_MITRE?(t&&this._segList.addPt(this._offset0.p1),this._segList.addPt(this._offset1.p0)):this.addCornerFillet(this._s1,this._offset0.p1,this._offset1.p0,F.CLOCKWISE,this._distance))}closeRing(){this._segList.closeRing()}hasNarrowConcaveAngle(){return this._hasNarrowConcaveAngle}}pi.OFFSET_SEGMENT_SEPARATION_FACTOR=.001,pi.INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR=.001,pi.CURVE_VERTEX_SNAP_DISTANCE_FACTOR=1e-6,pi.MAX_CLOSING_SEG_LEN_FACTOR=80;class mi{constructor(){mi.constructor_.apply(this,arguments)}static constructor_(){this._distance=0,this._precisionModel=null,this._bufParams=null;const t=arguments[0],e=arguments[1];this._precisionModel=t,this._bufParams=e}static copyCoordinates(t){const e=new Array(t.length).fill(null);for(let s=0;s<e.length;s++)e[s]=new p(t[s]);return e}getOffsetCurve(t,e){if(this._distance=e,0===e)return null;const s=e<0,n=Math.abs(e),i=this.getSegGen(n);t.length<=1?this.computePointCurve(t[0],i):this.computeOffsetCurve(t,s,i);const r=i.getCoordinates();return s&>.reverse(r),r}computeSingleSidedBufferCurve(t,e,s){const n=this.simplifyTolerance(this._distance);if(e){s.addSegments(t,!0);const e=di.simplify(t,-n),i=e.length-1;s.initSideSegments(e[i],e[i-1],Ps.LEFT),s.addFirstSegment();for(let t=i-2;t>=0;t--)s.addNextSegment(e[t],!0)}else{s.addSegments(t,!1);const e=di.simplify(t,n),i=e.length-1;s.initSideSegments(e[0],e[1],Ps.LEFT),s.addFirstSegment();for(let t=2;t<=i;t++)s.addNextSegment(e[t],!0)}s.addLastSegment(),s.closeRing()}computeRingBufferCurve(t,e,s){let n=this.simplifyTolerance(this._distance);e===Ps.RIGHT&&(n=-n);const i=di.simplify(t,n),r=i.length-1;s.initSideSegments(i[r-1],i[0],e);for(let t=1;t<=r;t++){const e=1!==t;s.addNextSegment(i[t],e)}s.closeRing()}computeLineBufferCurve(t,e){const s=this.simplifyTolerance(this._distance),n=di.simplify(t,s),i=n.length-1;e.initSideSegments(n[0],n[1],Ps.LEFT);for(let t=2;t<=i;t++)e.addNextSegment(n[t],!0);e.addLastSegment(),e.addLineEndCap(n[i-1],n[i]);const r=di.simplify(t,-s),o=r.length-1;e.initSideSegments(r[o],r[o-1],Ps.LEFT);for(let t=o-2;t>=0;t--)e.addNextSegment(r[t],!0);e.addLastSegment(),e.addLineEndCap(r[1],r[0]),e.closeRing()}computePointCurve(t,e){switch(this._bufParams.getEndCapStyle()){case ri.CAP_ROUND:e.createCircle(t);break;case ri.CAP_SQUARE:e.createSquare(t)}}getLineCurve(t,e){if(this._distance=e,this.isLineOffsetEmpty(e))return null;const s=Math.abs(e),n=this.getSegGen(s);if(t.length<=1)this.computePointCurve(t[0],n);else if(this._bufParams.isSingleSided()){const s=e<0;this.computeSingleSidedBufferCurve(t,s,n)}else this.computeLineBufferCurve(t,n);return n.getCoordinates()}getBufferParameters(){return this._bufParams}simplifyTolerance(t){return t*this._bufParams.getSimplifyFactor()}getRingCurve(t,e,s){if(this._distance=s,t.length<=2)return this.getLineCurve(t,s);if(0===s)return mi.copyCoordinates(t);const n=this.getSegGen(s);return this.computeRingBufferCurve(t,e,n),n.getCoordinates()}computeOffsetCurve(t,e,s){const n=this.simplifyTolerance(this._distance);if(e){const e=di.simplify(t,-n),i=e.length-1;s.initSideSegments(e[i],e[i-1],Ps.LEFT),s.addFirstSegment();for(let t=i-2;t>=0;t--)s.addNextSegment(e[t],!0)}else{const e=di.simplify(t,n),i=e.length-1;s.initSideSegments(e[0],e[1],Ps.LEFT),s.addFirstSegment();for(let t=2;t<=i;t++)s.addNextSegment(e[t],!0)}s.addLastSegment()}isLineOffsetEmpty(t){return 0===t||t<0&&!this._bufParams.isSingleSided()}getSegGen(t){return new pi(this._precisionModel,this._bufParams,t)}}class fi{constructor(){fi.constructor_.apply(this,arguments)}static constructor_(){this._subgraphs=null,this._seg=new Zt;const t=arguments[0];this._subgraphs=t}findStabbedSegments(){if(1===arguments.length){const t=arguments[0],e=new S;for(let s=this._subgraphs.iterator();s.hasNext();){const n=s.next(),i=n.getEnvelope();t.y<i.getMinY()||t.y>i.getMaxY()||this.findStabbedSegments(t,n.getDirectedEdges(),e)}return e}if(3===arguments.length)if(E(arguments[2],C)&&arguments[0]instanceof p&&arguments[1]instanceof en){const t=arguments[0],e=arguments[1],s=arguments[2],n=e.getEdge().getCoordinates();for(let i=0;i<n.length-1;i++){this._seg.p0=n[i],this._seg.p1=n[i+1],this._seg.p0.y>this._seg.p1.y&&this._seg.reverse();if(Math.max(this._seg.p0.x,this._seg.p1.x)<t.x)continue;if(this._seg.isHorizontal())continue;if(t.y<this._seg.p0.y||t.y>this._seg.p1.y)continue;if(F.index(this._seg.p0,this._seg.p1,t)===F.RIGHT)continue;let r=e.getDepth(Ps.LEFT);this._seg.p0.equals(n[i])||(r=e.getDepth(Ps.RIGHT));const o=new yi(this._seg,r);s.add(o)}}else if(E(arguments[2],C)&&arguments[0]instanceof p&&E(arguments[1],C)){const t=arguments[0],e=arguments[2];for(let s=arguments[1].iterator();s.hasNext();){const n=s.next();n.isForward()&&this.findStabbedSegments(t,n,e)}}}getDepth(t){const e=this.findStabbedSegments(t);if(0===e.size())return 0;return fe.min(e)._leftDepth}}class yi{constructor(){yi.constructor_.apply(this,arguments)}static constructor_(){this._upwardSeg=null,this._leftDepth=null;const t=arguments[0],e=arguments[1];this._upwardSeg=new Zt(t),this._leftDepth=e}compareTo(t){const e=t;if(this._upwardSeg.minX()>=e._upwardSeg.maxX())return 1;if(this._upwardSeg.maxX()<=e._upwardSeg.minX())return-1;let s=this._upwardSeg.orientationIndex(e._upwardSeg);return 0!==s?s:(s=-1*e._upwardSeg.orientationIndex(this._upwardSeg),0!==s?s:this._upwardSeg.compareTo(e._upwardSeg))}compareX(t,e){const s=t.p0.compareTo(e.p0);return 0!==s?s:t.p1.compareTo(e.p1)}toString(){return this._upwardSeg.toString()}get interfaces_(){return[r]}}fi.DepthSegment=yi;class xi{constructor(){xi.constructor_.apply(this,arguments)}static constructor_(){this._inputGeom=null,this._distance=null,this._curveBuilder=null,this._curveList=new S;const t=arguments[0],e=arguments[1],s=arguments[2];this._inputGeom=t,this._distance=e,this._curveBuilder=s}addRingSide(t,e,s,n,i){if(0===e&&t.length<ht.MINIMUM_VALID_SIZE)return null;let r=n,o=i;t.length>=ht.MINIMUM_VALID_SIZE&&F.isCCW(t)&&(r=i,o=n,s=Ps.opposite(s));const l=this._curveBuilder.getRingCurve(t,s,e);this.addCurve(l,r,o)}addRingBothSides(t,e){this.addRingSide(t,e,Ps.LEFT,jt.EXTERIOR,jt.INTERIOR),this.addRingSide(t,e,Ps.RIGHT,jt.INTERIOR,jt.EXTERIOR)}addPoint(t){if(this._distance<=0)return null;const e=t.getCoordinates(),s=this._curveBuilder.getLineCurve(e,this._distance);this.addCurve(s,jt.EXTERIOR,jt.INTERIOR)}addPolygon(t){let e=this._distance,s=Ps.LEFT;this._distance<0&&(e=-this._distance,s=Ps.RIGHT);const n=t.getExteriorRing(),i=gt.removeRepeatedPoints(n.getCoordinates());if(this._distance<0&&this.isErodedCompletely(n,this._distance))return null;if(this._distance<=0&&i.length<3)return null;this.addRingSide(i,e,s,jt.EXTERIOR,jt.INTERIOR);for(let n=0;n<t.getNumInteriorRing();n++){const i=t.getInteriorRingN(n),r=gt.removeRepeatedPoints(i.getCoordinates());this._distance>0&&this.isErodedCompletely(i,-this._distance)||this.addRingSide(r,e,Ps.opposite(s),jt.INTERIOR,jt.EXTERIOR)}}isTriangleErodedCompletely(t,e){const s=new te(t[0],t[1],t[2]),n=s.inCentre();return Y.pointToSegment(n,s.p0,s.p1)<Math.abs(e)}addLineString(t){if(this._curveBuilder.isLineOffsetEmpty(this._distance))return null;const e=gt.removeRepeatedPoints(t.getCoordinates());if(gt.isRing(e)&&!this._curveBuilder.getBufferParameters().isSingleSided())this.addRingBothSides(e,this._distance);else{const t=this._curveBuilder.getLineCurve(e,this._distance);this.addCurve(t,jt.EXTERIOR,jt.INTERIOR)}}addCurve(t,e,s){if(null===t||t.length<2)return null;const n=new Un(t,new As(0,jt.BOUNDARY,e,s));this._curveList.add(n)}getCurves(){return this.add(this._inputGeom),this._curveList}add(t){if(t.isEmpty())return null;if(t instanceof nt)this.addPolygon(t);else if(t instanceof Q)this.addLineString(t);else if(t instanceof $)this.addPoint(t);else if(t instanceof ct)this.addCollection(t);else if(t instanceof Ct)this.addCollection(t);else if(t instanceof mt)this.addCollection(t);else{if(!(t instanceof at))throw new Z(t.getGeometryType());this.addCollection(t)}}isErodedCompletely(t,e){const s=t.getCoordinates();if(s.length<4)return e<0;if(4===s.length)return this.isTriangleErodedCompletely(s,e);const n=t.getEnvelopeInternal(),i=Math.min(n.getHeight(),n.getWidth());return e<0&&2*Math.abs(e)>i}addCollection(t){for(let e=0;e<t.getNumGeometries();e++){const s=t.getGeometryN(e);this.add(s)}}}class Ei{constructor(){Ei.constructor_.apply(this,arguments)}static constructor_(){this._edgeMap=new Xs,this._edgeList=null,this._ptInAreaLocation=[jt.NONE,jt.NONE]}getNextCW(t){this.getEdges();const e=this._edgeList.indexOf(t);let s=e-1;return 0===e&&(s=this._edgeList.size()-1),this._edgeList.get(s)}propagateSideLabels(t){let e=jt.NONE;for(let s=this.iterator();s.hasNext();){const n=s.next().getLabel();n.isArea(t)&&n.getLocation(t,Ps.LEFT)!==jt.NONE&&(e=n.getLocation(t,Ps.LEFT))}if(e===jt.NONE)return null;let s=e;for(let e=this.iterator();e.hasNext();){const n=e.next(),i=n.getLabel();if(i.getLocation(t,Ps.ON)===jt.NONE&&i.setLocation(t,Ps.ON,s),i.isArea(t)){const e=i.getLocation(t,Ps.LEFT),r=i.getLocation(t,Ps.RIGHT);if(r!==jt.NONE){if(r!==s)throw new tn("side location conflict",n.getCoordinate());e===jt.NONE&&u.shouldNeverReachHere("found single null side (at "+n.getCoordinate()+")"),s=e}else u.isTrue(i.getLocation(t,Ps.LEFT)===jt.NONE,"found single null side"),i.setLocation(t,Ps.RIGHT,s),i.setLocation(t,Ps.LEFT,s)}}}getCoordinate(){const t=this.iterator();if(!t.hasNext())return null;return t.next().getCoordinate()}print(t){q.out.println("EdgeEndStar: "+this.getCoordinate());for(let e=this.iterator();e.hasNext();){e.next().print(t)}}isAreaLabelsConsistent(t){return this.computeEdgeEndLabels(t.getBoundaryNodeRule()),this.checkAreaLabelsConsistent(0)}checkAreaLabelsConsistent(t){const e=this.getEdges();if(e.size()<=0)return!0;const s=e.size()-1,n=e.get(s).getLabel().getLocation(t,Ps.LEFT);u.isTrue(n!==jt.NONE,"Found unlabelled area edge");let i=n;for(let e=this.iterator();e.hasNext();){const s=e.next().getLabel();u.isTrue(s.isArea(t),"Found non-area edge");const n=s.getLocation(t,Ps.LEFT),r=s.getLocation(t,Ps.RIGHT);if(n===r)return!1;if(r!==i)return!1;i=n}return!0}findIndex(t){this.iterator();for(let e=0;e<this._edgeList.size();e++){if(this._edgeList.get(e)===t)return e}return-1}iterator(){return this.getEdges().iterator()}getEdges(){return null===this._edgeList&&(this._edgeList=new S(this._edgeMap.values())),this._edgeList}getLocation(t,e,s){return this._ptInAreaLocation[t]===jt.NONE&&(this._ptInAreaLocation[t]=He.locate(e,s[t].getGeometry())),this._ptInAreaLocation[t]}toString(){const t=new O;t.append("EdgeEndStar: "+this.getCoordinate()),t.append("\n");for(let e=this.iterator();e.hasNext();){const s=e.next();t.append(s),t.append("\n")}return t.toString()}computeEdgeEndLabels(t){for(let e=this.iterator();e.hasNext();){e.next().computeLabel(t)}}computeLabelling(t){this.computeEdgeEndLabels(t[0].getBoundaryNodeRule()),this.propagateSideLabels(0),this.propagateSideLabels(1);const e=[!1,!1];for(let t=this.iterator();t.hasNext();){const s=t.next().getLabel();for(let t=0;t<2;t++)s.isLine(t)&&s.getLocation(t)===jt.BOUNDARY&&(e[t]=!0)}for(let s=this.iterator();s.hasNext();){const n=s.next(),i=n.getLabel();for(let s=0;s<2;s++)if(i.isAnyNull(s)){let r=jt.NONE;if(e[s])r=jt.EXTERIOR;else{const e=n.getCoordinate();r=this.getLocation(s,e,t)}i.setAllLocationsIfNull(s,r)}}}getDegree(){return this._edgeMap.size()}insertEdgeEnd(t,e){this._edgeMap.put(t,e),this._edgeList=null}}class Ii extends Ei{constructor(){super(),Ii.constructor_.apply(this,arguments)}static constructor_(){this._resultAreaEdgeList=null,this._label=null,this._SCANNING_FOR_INCOMING=1,this._LINKING_TO_OUTGOING=2}linkResultDirectedEdges(){this.getResultAreaEdges();let t=null,e=null,s=this._SCANNING_FOR_INCOMING;for(let n=0;n<this._resultAreaEdgeList.size();n++){const i=this._resultAreaEdgeList.get(n),r=i.getSym();if(i.getLabel().isArea())switch(null===t&&i.isInResult()&&(t=i),s){case this._SCANNING_FOR_INCOMING:if(!r.isInResult())continue;e=r,s=this._LINKING_TO_OUTGOING;break;case this._LINKING_TO_OUTGOING:if(!i.isInResult())continue;e.setNext(i),s=this._SCANNING_FOR_INCOMING}}if(s===this._LINKING_TO_OUTGOING){if(null===t)throw new tn("no outgoing dirEdge found",this.getCoordinate());u.isTrue(t.isInResult(),"unable to link last incoming dirEdge"),e.setNext(t)}}insert(t){const e=t;this.insertEdgeEnd(e,e)}getRightmostEdge(){const t=this.getEdges(),e=t.size();if(e<1)return null;const s=t.get(0);if(1===e)return s;const n=t.get(e-1),i=s.getQuadrant(),r=n.getQuadrant();return Is.isNorthern(i)&&Is.isNorthern(r)?s:Is.isNorthern(i)||Is.isNorthern(r)?0!==s.getDy()?s:0!==n.getDy()?n:(u.shouldNeverReachHere("found two horizontal edges incident on node"),null):n}print(t){q.out.println("DirectedEdgeStar: "+this.getCoordinate());for(let e=this.iterator();e.hasNext();){const s=e.next();t.print("out "),s.print(t),t.println(),t.print("in "),s.getSym().print(t),t.println()}}getResultAreaEdges(){if(null!==this._resultAreaEdgeList)return this._resultAreaEdgeList;this._resultAreaEdgeList=new S;for(let t=this.iterator();t.hasNext();){const e=t.next();(e.isInResult()||e.getSym().isInResult())&&this._resultAreaEdgeList.add(e)}return this._resultAreaEdgeList}updateLabelling(t){for(let e=this.iterator();e.hasNext();){const s=e.next().getLabel();s.setAllLocationsIfNull(0,t.getLocation(0)),s.setAllLocationsIfNull(1,t.getLocation(1))}}linkAllDirectedEdges(){this.getEdges();let t=null,e=null;for(let s=this._edgeList.size()-1;s>=0;s--){const n=this._edgeList.get(s),i=n.getSym();null===e&&(e=i),null!==t&&i.setNext(t),t=n}e.setNext(t)}computeDepths(){if(1===arguments.length){const t=arguments[0],e=this.findIndex(t),s=t.getDepth(Ps.LEFT),n=t.getDepth(Ps.RIGHT),i=this.computeDepths(e+1,this._edgeList.size(),s);if(this.computeDepths(0,e,i)!==n)throw new tn("depth mismatch at "+t.getCoordinate())}else if(3===arguments.length){const t=arguments[1];let e=arguments[2];for(let s=arguments[0];s<t;s++){const t=this._edgeList.get(s);t.setEdgeDepths(Ps.RIGHT,e),e=t.getDepth(Ps.LEFT)}return e}}mergeSymLabels(){for(let t=this.iterator();t.hasNext();){const e=t.next();e.getLabel().merge(e.getSym().getLabel())}}linkMinimalDirectedEdges(t){let e=null,s=null,n=this._SCANNING_FOR_INCOMING;for(let i=this._resultAreaEdgeList.size()-1;i>=0;i--){const r=this._resultAreaEdgeList.get(i),o=r.getSym();switch(null===e&&r.getEdgeRing()===t&&(e=r),n){case this._SCANNING_FOR_INCOMING:if(o.getEdgeRing()!==t)continue;s=o,n=this._LINKING_TO_OUTGOING;break;case this._LINKING_TO_OUTGOING:if(r.getEdgeRing()!==t)continue;s.setNextMin(r),n=this._SCANNING_FOR_INCOMING}}n===this._LINKING_TO_OUTGOING&&(u.isTrue(null!==e,"found null for first outgoing dirEdge"),u.isTrue(e.getEdgeRing()===t,"unable to link last incoming dirEdge"),s.setNextMin(e))}getOutgoingDegree(){if(0===arguments.length){let t=0;for(let e=this.iterator();e.hasNext();){e.next().isInResult()&&t++}return t}if(1===arguments.length){const t=arguments[0];let e=0;for(let s=this.iterator();s.hasNext();){s.next().getEdgeRing()===t&&e++}return e}}getLabel(){return this._label}findCoveredLineEdges(){let t=jt.NONE;for(let e=this.iterator();e.hasNext();){const s=e.next(),n=s.getSym();if(!s.isLineEdge()){if(s.isInResult()){t=jt.INTERIOR;break}if(n.isInResult()){t=jt.EXTERIOR;break}}}if(t===jt.NONE)return null;let e=t;for(let t=this.iterator();t.hasNext();){const s=t.next(),n=s.getSym();s.isLineEdge()?s.getEdge().setCovered(e===jt.INTERIOR):(s.isInResult()&&(e=jt.EXTERIOR),n.isInResult()&&(e=jt.INTERIOR))}}computeLabelling(t){super.computeLabelling.call(this,t),this._label=new As(jt.NONE);for(let t=this.iterator();t.hasNext();){const e=t.next().getEdge().getLabel();for(let t=0;t<2;t++){const s=e.getLocation(t);s!==jt.INTERIOR&&s!==jt.BOUNDARY||this._label.setLocation(t,jt.INTERIOR)}}}}class Ni extends sn{constructor(){super()}createNode(t){return new Qs(t,new Ii)}}class Ci{constructor(){Ci.constructor_.apply(this,arguments)}static constructor_(){this._pts=null,this._orientation=null;const t=arguments[0];this._pts=t,this._orientation=Ci.orientation(t)}static orientation(t){return 1===gt.increasingDirection(t)}static compareOriented(t,e,s,n){const i=e?1:-1,r=n?1:-1,o=e?t.length:-1,l=n?s.length:-1;let a=e?0:t.length-1,c=n?0:s.length-1;for(;;){const e=t[a].compareTo(s[c]);if(0!==e)return e;a+=i,c+=r;const n=a===o,h=c===l;if(n&&!h)return-1;if(!n&&h)return 1;if(n&&h)return 0}}compareTo(t){const e=t;return Ci.compareOriented(this._pts,this._orientation,e._pts,e._orientation)}get interfaces_(){return[r]}}class wi{constructor(){wi.constructor_.apply(this,arguments)}static constructor_(){this._edges=new S,this._ocaMap=new Xs}print(t){t.print("MULTILINESTRING ( ");for(let e=0;e<this._edges.size();e++){const s=this._edges.get(e);e>0&&t.print(","),t.print("(");const n=s.getCoordinates();for(let e=0;e<n.length;e++)e>0&&t.print(","),t.print(n[e].x+" "+n[e].y);t.println(")")}t.print(") ")}addAll(t){for(let e=t.iterator();e.hasNext();)this.add(e.next())}findEdgeIndex(t){for(let e=0;e<this._edges.size();e++)if(this._edges.get(e).equals(t))return e;return-1}iterator(){return this._edges.iterator()}getEdges(){return this._edges}get(t){return this._edges.get(t)}findEqualEdge(t){const e=new Ci(t.getCoordinates());return this._ocaMap.get(e)}add(t){this._edges.add(t);const e=new Ci(t.getCoordinates());this._ocaMap.put(e,t)}}class Si{processIntersections(t,e,s,n){}isDone(){}}class Li{constructor(){Li.constructor_.apply(this,arguments)}static constructor_(){this._hasIntersection=!1,this._hasProper=!1,this._hasProperInterior=!1,this._hasInterior=!1,this._properIntersectionPoint=null,this._li=null,this._isSelfIntersection=null,this.numIntersections=0,this.numInteriorIntersections=0,this.numProperIntersections=0,this.numTests=0;const t=arguments[0];this._li=t}static isAdjacentSegments(t,e){return 1===Math.abs(t-e)}isTrivialIntersection(t,e,s,n){if(t===s&&1===this._li.getIntersectionNum()){if(Li.isAdjacentSegments(e,n))return!0;if(t.isClosed()){const s=t.size()-1;if(0===e&&n===s||0===n&&e===s)return!0}}return!1}getProperIntersectionPoint(){return this._properIntersectionPoint}hasProperInteriorIntersection(){return this._hasProperInterior}getLineIntersector(){return this._li}hasProperIntersection(){return this._hasProper}processIntersections(t,e,s,n){if(t===s&&e===n)return null;this.numTests++;const i=t.getCoordinates()[e],r=t.getCoordinates()[e+1],o=s.getCoordinates()[n],l=s.getCoordinates()[n+1];this._li.computeIntersection(i,r,o,l),this._li.hasIntersection()&&(this.numIntersections++,this._li.isInteriorIntersection()&&(this.numInteriorIntersections++,this._hasInterior=!0),this.isTrivialIntersection(t,e,s,n)||(this._hasIntersection=!0,t.addIntersections(this._li,e,0),s.addIntersections(this._li,n,1),this._li.isProper()&&(this.numProperIntersections++,this._hasProper=!0,this._hasProperInterior=!0)))}hasIntersection(){return this._hasIntersection}isDone(){return!1}hasInteriorIntersection(){return this._hasInterior}get interfaces_(){return[Si]}}class Ti{constructor(){Ti.constructor_.apply(this,arguments)}static constructor_(){this._bufParams=null,this._workingPrecisionModel=null,this._workingNoder=null,this._geomFact=null,this._graph=null,this._edgeList=new wi;const t=arguments[0];this._bufParams=t}static depthDelta(t){const e=t.getLocation(0,Ps.LEFT),s=t.getLocation(0,Ps.RIGHT);return e===jt.INTERIOR&&s===jt.EXTERIOR?1:e===jt.EXTERIOR&&s===jt.INTERIOR?-1:0}static convertSegStrings(t){const e=new wt,s=new S;for(;t.hasNext();){const n=t.next(),i=e.createLineString(n.getCoordinates());s.add(i)}return e.buildGeometry(s)}setWorkingPrecisionModel(t){this._workingPrecisionModel=t}insertUniqueEdge(t){const e=this._edgeList.findEqualEdge(t);if(null!==e){const s=e.getLabel();let n=t.getLabel();e.isPointwiseEqual(t)||(n=new As(t.getLabel()),n.flip()),s.merge(n);const i=Ti.depthDelta(n),r=e.getDepthDelta()+i;e.setDepthDelta(r)}else this._edgeList.add(t),t.setDepthDelta(Ti.depthDelta(t.getLabel()))}buildSubgraphs(t,e){const s=new S;for(let n=t.iterator();n.hasNext();){const t=n.next(),i=t.getRightmostCoordinate(),r=new fi(s).getDepth(i);t.computeDepth(r),t.findResultEdges(),s.add(t),e.add(t.getDirectedEdges(),t.getNodes())}}createSubgraphs(t){const e=new S;for(let s=t.getNodes().iterator();s.hasNext();){const t=s.next();if(!t.isVisited()){const s=new ai;s.create(t),e.add(s)}}return fe.sort(e,fe.reverseOrder()),e}createEmptyResultGeometry(){return this._geomFact.createPolygon()}getNoder(t){if(null!==this._workingNoder)return this._workingNoder;const e=new Qn,s=new Wt;return s.setPrecisionModel(t),e.setSegmentIntersector(new Li(s)),e}buffer(t,e){let s=this._workingPrecisionModel;null===s&&(s=t.getPrecisionModel()),this._geomFact=t.getFactory();const n=new mi(s,this._bufParams),i=new xi(t,e,n).getCurves();if(i.size()<=0)return this.createEmptyResultGeometry();this.computeNodedEdges(i,s),this._graph=new nn(new Ni),this._graph.addEdges(this._edgeList.getEdges());const r=this.createSubgraphs(this._graph),o=new gi(this._geomFact);this.buildSubgraphs(r,o);const l=o.getPolygons();if(l.size()<=0)return this.createEmptyResultGeometry();return this._geomFact.buildGeometry(l)}computeNodedEdges(t,e){const s=this.getNoder(e);s.computeNodes(t);for(let t=s.getNodedSubstrings().iterator();t.hasNext();){const e=t.next(),s=e.getCoordinates();if(2===s.length&&s[0].equals2D(s[1]))continue;const n=e.getData(),i=new Ks(e.getCoordinates(),new As(n));this.insertUniqueEdge(i)}}setNoder(t){this._workingNoder=t}}class Ri{constructor(){Ri.constructor_.apply(this,arguments)}static constructor_(){this._li=new Wt,this._segStrings=null;const t=arguments[0];this._segStrings=t}checkEndPtVertexIntersections(){if(0===arguments.length)for(let t=this._segStrings.iterator();t.hasNext();){const e=t.next().getCoordinates();this.checkEndPtVertexIntersections(e[0],this._segStrings),this.checkEndPtVertexIntersections(e[e.length-1],this._segStrings)}else if(2===arguments.length){const t=arguments[0];for(let e=arguments[1].iterator();e.hasNext();){const s=e.next().getCoordinates();for(let e=1;e<s.length-1;e++)if(s[e].equals(t))throw new c("found endpt/interior pt intersection at index "+e+" :pt "+t)}}}checkInteriorIntersections(){if(0===arguments.length)for(let t=this._segStrings.iterator();t.hasNext();){const e=t.next();for(let t=this._segStrings.iterator();t.hasNext();){const s=t.next();this.checkInteriorIntersections(e,s)}}else if(2===arguments.length){const t=arguments[0],e=arguments[1],s=t.getCoordinates(),n=e.getCoordinates();for(let i=0;i<s.length-1;i++)for(let s=0;s<n.length-1;s++)this.checkInteriorIntersections(t,i,e,s)}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];if(t===s&&e===n)return null;const i=t.getCoordinates()[e],r=t.getCoordinates()[e+1],o=s.getCoordinates()[n],l=s.getCoordinates()[n+1];if(this._li.computeIntersection(i,r,o,l),this._li.hasIntersection()&&(this._li.isProper()||this.hasInteriorIntersection(this._li,i,r)||this.hasInteriorIntersection(this._li,o,l)))throw new c("found non-noded intersection at "+i+"-"+r+" and "+o+"-"+l)}}checkValid(){this.checkEndPtVertexIntersections(),this.checkInteriorIntersections(),this.checkCollapses()}checkCollapses(){if(0===arguments.length)for(let t=this._segStrings.iterator();t.hasNext();){const e=t.next();this.checkCollapses(e)}else if(1===arguments.length){const t=arguments[0].getCoordinates();for(let e=0;e<t.length-2;e++)this.checkCollapse(t[e],t[e+1],t[e+2])}}hasInteriorIntersection(t,e,s){for(let n=0;n<t.getIntersectionNum();n++){const i=t.getIntersection(n);if(!i.equals(e)&&!i.equals(s))return!0}return!1}checkCollapse(t,e,s){if(t.equals(s))throw new c("found non-noded collapse at "+Ri.fact.createLineString([t,e,s]))}}Ri.fact=new wt;class Pi{constructor(){Pi.constructor_.apply(this,arguments)}static constructor_(){this._li=null,this._pt=null,this._originalPt=null,this._ptScaled=null,this._p0Scaled=null,this._p1Scaled=null,this._scaleFactor=null,this._minx=null,this._maxx=null,this._miny=null,this._maxy=null,this._corner=new Array(4).fill(null),this._safeEnv=null;const t=arguments[0],e=arguments[1],n=arguments[2];if(this._originalPt=t,this._pt=t,this._scaleFactor=e,this._li=n,e<=0)throw new s("Scale factor must be non-zero");1!==e&&(this._pt=new p(this.scale(t.x),this.scale(t.y)),this._p0Scaled=new p,this._p1Scaled=new p),this.initCorners(this._pt)}intersectsScaled(t,e){const s=Math.min(t.x,e.x),n=Math.max(t.x,e.x),i=Math.min(t.y,e.y),r=Math.max(t.y,e.y),o=this._maxx<s||this._minx>n||this._maxy<i||this._miny>r;if(o)return!1;const l=this.intersectsToleranceSquare(t,e);return u.isTrue(!(o&&l),"Found bad envelope test"),l}initCorners(t){const e=.5;this._minx=t.x-e,this._maxx=t.x+e,this._miny=t.y-e,this._maxy=t.y+e,this._corner[0]=new p(this._maxx,this._maxy),this._corner[1]=new p(this._minx,this._maxy),this._corner[2]=new p(this._minx,this._miny),this._corner[3]=new p(this._maxx,this._miny)}intersects(t,e){return 1===this._scaleFactor?this.intersectsScaled(t,e):(this.copyScaled(t,this._p0Scaled),this.copyScaled(e,this._p1Scaled),this.intersectsScaled(this._p0Scaled,this._p1Scaled))}scale(t){return Math.round(t*this._scaleFactor)}getCoordinate(){return this._originalPt}copyScaled(t,e){e.x=this.scale(t.x),e.y=this.scale(t.y)}getSafeEnvelope(){if(null===this._safeEnv){const t=Pi.SAFE_ENV_EXPANSION_FACTOR/this._scaleFactor;this._safeEnv=new P(this._originalPt.x-t,this._originalPt.x+t,this._originalPt.y-t,this._originalPt.y+t)}return this._safeEnv}intersectsPixelClosure(t,e){return this._li.computeIntersection(t,e,this._corner[0],this._corner[1]),!!this._li.hasIntersection()||(this._li.computeIntersection(t,e,this._corner[1],this._corner[2]),!!this._li.hasIntersection()||(this._li.computeIntersection(t,e,this._corner[2],this._corner[3]),!!this._li.hasIntersection()||(this._li.computeIntersection(t,e,this._corner[3],this._corner[0]),!!this._li.hasIntersection())))}intersectsToleranceSquare(t,e){let s=!1,n=!1;return this._li.computeIntersection(t,e,this._corner[0],this._corner[1]),!!this._li.isProper()||(this._li.computeIntersection(t,e,this._corner[1],this._corner[2]),!!this._li.isProper()||(this._li.hasIntersection()&&(s=!0),this._li.computeIntersection(t,e,this._corner[2],this._corner[3]),!!this._li.isProper()||(this._li.hasIntersection()&&(n=!0),this._li.computeIntersection(t,e,this._corner[3],this._corner[0]),!!this._li.isProper()||(!(!s||!n)||(!!t.equals(this._pt)||!!e.equals(this._pt))))))}addSnappedNode(t,e){const s=t.getCoordinate(e),n=t.getCoordinate(e+1);return!!this.intersects(s,n)&&(t.addIntersection(this.getCoordinate(),e),!0)}}Pi.SAFE_ENV_EXPANSION_FACTOR=.75;class Oi{constructor(){Oi.constructor_.apply(this,arguments)}static constructor_(){this.selectedSegment=new Zt}select(){if(1===arguments.length);else if(2===arguments.length){const t=arguments[1];arguments[0].getLineSegment(t,this.selectedSegment),this.select(this.selectedSegment)}}}class vi{constructor(){vi.constructor_.apply(this,arguments)}static constructor_(){this._index=null;const t=arguments[0];this._index=t}snap(){if(1===arguments.length){const t=arguments[0];return this.snap(t,null,-1)}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=t.getSafeEnvelope(),i=new Mi(t,e,s);return this._index.query(n,new class{get interfaces_(){return[Me]}visitItem(t){t.select(n,i)}}),i.isNodeAdded()}}}class Mi extends Oi{constructor(){super(),Mi.constructor_.apply(this,arguments)}static constructor_(){this._hotPixel=null,this._parentEdge=null,this._hotPixelVertexIndex=null,this._isNodeAdded=!1;const t=arguments[0],e=arguments[1],s=arguments[2];this._hotPixel=t,this._parentEdge=e,this._hotPixelVertexIndex=s}isNodeAdded(){return this._isNodeAdded}select(){if(!(2===arguments.length&&Number.isInteger(arguments[1])&&arguments[0]instanceof Wn))return super.select.apply(this,arguments);{const t=arguments[1],e=arguments[0].getContext();if(this._parentEdge===e&&(t===this._hotPixelVertexIndex||t+1===this._hotPixelVertexIndex))return null;this._isNodeAdded|=this._hotPixel.addSnappedNode(e,t)}}}vi.HotPixelSnapAction=Mi;class bi{constructor(){bi.constructor_.apply(this,arguments)}static constructor_(){this._li=null,this._interiorIntersections=null;const t=arguments[0];this._li=t,this._interiorIntersections=new S}processIntersections(t,e,s,n){if(t===s&&e===n)return null;const i=t.getCoordinates()[e],r=t.getCoordinates()[e+1],o=s.getCoordinates()[n],l=s.getCoordinates()[n+1];if(this._li.computeIntersection(i,r,o,l),this._li.hasIntersection()&&this._li.isInteriorIntersection()){for(let t=0;t<this._li.getIntersectionNum();t++)this._interiorIntersections.add(this._li.getIntersection(t));t.addIntersections(this._li,e,0),s.addIntersections(this._li,n,1)}}isDone(){return!1}getInteriorIntersections(){return this._interiorIntersections}get interfaces_(){return[Si]}}class Di{constructor(){Di.constructor_.apply(this,arguments)}static constructor_(){this._pm=null,this._li=null,this._scaleFactor=null,this._noder=null,this._pointSnapper=null,this._nodedSegStrings=null;const t=arguments[0];this._pm=t,this._li=new Wt,this._li.setPrecisionModel(t),this._scaleFactor=t.getScale()}checkCorrectness(t){const s=Un.getNodedSubstrings(t),n=new Ri(s);try{n.checkValid()}catch(t){if(!(t instanceof e))throw t;t.printStackTrace()}}getNodedSubstrings(){return Un.getNodedSubstrings(this._nodedSegStrings)}snapRound(t,e){const s=this.findInteriorIntersections(t,e);this.computeIntersectionSnaps(s),this.computeVertexSnaps(t)}findInteriorIntersections(t,e){const s=new bi(e);return this._noder.setSegmentIntersector(s),this._noder.computeNodes(t),s.getInteriorIntersections()}computeVertexSnaps(){if(E(arguments[0],I)){for(let t=arguments[0].iterator();t.hasNext();){const e=t.next();this.computeVertexSnaps(e)}}else if(arguments[0]instanceof Un){const t=arguments[0],e=t.getCoordinates();for(let s=0;s<e.length;s++){const n=new Pi(e[s],this._scaleFactor,this._li);this._pointSnapper.snap(n,t,s)&&t.addIntersection(e[s],s)}}}computeNodes(t){this._nodedSegStrings=t,this._noder=new Qn,this._pointSnapper=new vi(this._noder.getIndex()),this.snapRound(t,this._li)}computeIntersectionSnaps(t){for(let e=t.iterator();e.hasNext();){const t=e.next(),s=new Pi(t,this._scaleFactor,this._li);this._pointSnapper.snap(s)}}get interfaces_(){return[jn]}}class Ai{constructor(){Ai.constructor_.apply(this,arguments)}static constructor_(){if(this._argGeom=null,this._distance=null,this._bufParams=new ri,this._resultGeometry=null,this._saveException=null,1===arguments.length){const t=arguments[0];this._argGeom=t}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._argGeom=t,this._bufParams=e}}static bufferOp(){if(2===arguments.length){const t=arguments[1];return new Ai(arguments[0]).getResultGeometry(t)}if(3===arguments.length){if(Number.isInteger(arguments[2])&&arguments[0]instanceof X&&"number"==typeof arguments[1]){const t=arguments[1],e=arguments[2],s=new Ai(arguments[0]);s.setQuadrantSegments(e);return s.getResultGeometry(t)}if(arguments[2]instanceof ri&&arguments[0]instanceof X&&"number"==typeof arguments[1]){const t=arguments[1];return new Ai(arguments[0],arguments[2]).getResultGeometry(t)}}else if(4===arguments.length){const t=arguments[1],e=arguments[2],s=arguments[3],n=new Ai(arguments[0]);n.setQuadrantSegments(e),n.setEndCapStyle(s);return n.getResultGeometry(t)}}static precisionScaleFactor(t,e,s){const n=t.getEnvelopeInternal(),i=B.max(Math.abs(n.getMaxX()),Math.abs(n.getMaxY()),Math.abs(n.getMinX()),Math.abs(n.getMinY()))+2*(e>0?e:0),r=s-Math.trunc(Math.log(i)/Math.log(10)+1);return Math.pow(10,r)}bufferFixedPrecision(t){const e=new $n(new Di(new It(1)),t.getScale()),s=new Ti(this._bufParams);s.setWorkingPrecisionModel(t),s.setNoder(e),this._resultGeometry=s.buffer(this._argGeom,this._distance)}bufferReducedPrecision(){if(0===arguments.length){for(let t=Ai.MAX_PRECISION_DIGITS;t>=0;t--){try{this.bufferReducedPrecision(t)}catch(t){if(!(t instanceof tn))throw t;this._saveException=t}if(null!==this._resultGeometry)return null}throw this._saveException}if(1===arguments.length){const t=arguments[0],e=Ai.precisionScaleFactor(this._argGeom,this._distance,t),s=new It(e);this.bufferFixedPrecision(s)}}computeGeometry(){if(this.bufferOriginalPrecision(),null!==this._resultGeometry)return null;const t=this._argGeom.getFactory().getPrecisionModel();t.getType()===It.FIXED?this.bufferFixedPrecision(t):this.bufferReducedPrecision()}setQuadrantSegments(t){this._bufParams.setQuadrantSegments(t)}bufferOriginalPrecision(){try{const t=new Ti(this._bufParams);this._resultGeometry=t.buffer(this._argGeom,this._distance)}catch(t){if(!(t instanceof c))throw t;this._saveException=t}}getResultGeometry(t){return this._distance=t,this.computeGeometry(),this._resultGeometry}setEndCapStyle(t){this._bufParams.setEndCapStyle(t)}}Ai.CAP_ROUND=ri.CAP_ROUND,Ai.CAP_BUTT=ri.CAP_FLAT,Ai.CAP_FLAT=ri.CAP_FLAT,Ai.CAP_SQUARE=ri.CAP_SQUARE,Ai.MAX_PRECISION_DIGITS=12;var Fi=Object.freeze({__proto__:null,BufferOp:Ai,BufferParameters:ri});class Gi{constructor(){Gi.constructor_.apply(this,arguments)}static constructor_(){if(this._component=null,this._segIndex=null,this._pt=null,2===arguments.length){const t=arguments[0],e=arguments[1];Gi.constructor_.call(this,t,Gi.INSIDE_AREA,e)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._component=t,this._segIndex=e,this._pt=s}}getSegmentIndex(){return this._segIndex}getCoordinate(){return this._pt}isInsideArea(){return this._segIndex===Gi.INSIDE_AREA}toString(){return this._component.getGeometryType()+"["+this._segIndex+"]-"+Ut.toPoint(this._pt)}getGeometryComponent(){return this._component}}Gi.INSIDE_AREA=-1;class qi{constructor(){qi.constructor_.apply(this,arguments)}static constructor_(){this._locations=null;const t=arguments[0];this._locations=t}static getLocations(t){const e=new S;return t.apply(new qi(e)),e}filter(t){if(t.isEmpty())return null;(t instanceof $||t instanceof Q||t instanceof nt)&&this._locations.add(new Gi(t,0,t.getCoordinate()))}get interfaces_(){return[K]}}class Bi{constructor(){Bi.constructor_.apply(this,arguments)}static constructor_(){if(this._geom=null,this._terminateDistance=0,this._ptLocator=new _s,this._minDistanceLocation=null,this._minDistance=i.MAX_VALUE,2===arguments.length){const t=arguments[0],e=arguments[1];Bi.constructor_.call(this,t,e,0)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._geom=new Array(2).fill(null),this._geom[0]=t,this._geom[1]=e,this._terminateDistance=s}}static distance(t,e){return new Bi(t,e).distance()}static isWithinDistance(t,e,s){if(t.getEnvelopeInternal().distance(e.getEnvelopeInternal())>s)return!1;return new Bi(t,e,s).distance()<=s}static nearestPoints(t,e){return new Bi(t,e).nearestPoints()}computeContainmentDistance(){if(0===arguments.length){const t=new Array(2).fill(null);if(this.computeContainmentDistance(0,t),this._minDistance<=this._terminateDistance)return null;this.computeContainmentDistance(1,t)}else if(2===arguments.length){const t=arguments[0],e=arguments[1],s=this._geom[t];if(s.getDimension()<2)return null;const n=1-t,i=xe.getPolygons(s);if(i.size()>0){const s=qi.getLocations(this._geom[n]);if(this.computeContainmentDistance(s,i,e),this._minDistance<=this._terminateDistance)return this._minDistanceLocation[n]=e[0],this._minDistanceLocation[t]=e[1],null}}else if(3===arguments.length)if(arguments[2]instanceof Array&&E(arguments[0],C)&&E(arguments[1],C)){const t=arguments[0],e=arguments[1],s=arguments[2];for(let n=0;n<t.size();n++){const i=t.get(n);for(let t=0;t<e.size();t++)if(this.computeContainmentDistance(i,e.get(t),s),this._minDistance<=this._terminateDistance)return null}}else if(arguments[2]instanceof Array&&arguments[0]instanceof Gi&&arguments[1]instanceof nt){const t=arguments[0],e=arguments[1],s=arguments[2],n=t.getCoordinate();if(jt.EXTERIOR!==this._ptLocator.locate(n,e))return this._minDistance=0,s[0]=t,s[1]=new Gi(e,n),null}}computeMinDistanceLinesPoints(t,e,s){for(let n=0;n<t.size();n++){const i=t.get(n);for(let t=0;t<e.size();t++){const n=e.get(t);if(this.computeMinDistance(i,n,s),this._minDistance<=this._terminateDistance)return null}}}computeFacetDistance(){const t=new Array(2).fill(null),e=me.getLines(this._geom[0]),s=me.getLines(this._geom[1]),n=ye.getPoints(this._geom[0]),i=ye.getPoints(this._geom[1]);return this.computeMinDistanceLines(e,s,t),this.updateMinDistance(t,!1),this._minDistance<=this._terminateDistance?null:(t[0]=null,t[1]=null,this.computeMinDistanceLinesPoints(e,i,t),this.updateMinDistance(t,!1),this._minDistance<=this._terminateDistance?null:(t[0]=null,t[1]=null,this.computeMinDistanceLinesPoints(s,n,t),this.updateMinDistance(t,!0),this._minDistance<=this._terminateDistance?null:(t[0]=null,t[1]=null,this.computeMinDistancePoints(n,i,t),void this.updateMinDistance(t,!1))))}nearestLocations(){return this.computeMinDistance(),this._minDistanceLocation}updateMinDistance(t,e){if(null===t[0])return null;e?(this._minDistanceLocation[0]=t[1],this._minDistanceLocation[1]=t[0]):(this._minDistanceLocation[0]=t[0],this._minDistanceLocation[1]=t[1])}nearestPoints(){this.computeMinDistance();return[this._minDistanceLocation[0].getCoordinate(),this._minDistanceLocation[1].getCoordinate()]}computeMinDistance(){if(0===arguments.length){if(null!==this._minDistanceLocation)return null;if(this._minDistanceLocation=new Array(2).fill(null),this.computeContainmentDistance(),this._minDistance<=this._terminateDistance)return null;this.computeFacetDistance()}else if(3===arguments.length)if(arguments[2]instanceof Array&&arguments[0]instanceof Q&&arguments[1]instanceof $){const t=arguments[0],e=arguments[1],s=arguments[2];if(t.getEnvelopeInternal().distance(e.getEnvelopeInternal())>this._minDistance)return null;const n=t.getCoordinates(),i=e.getCoordinate();for(let r=0;r<n.length-1;r++){const o=Y.pointToSegment(i,n[r],n[r+1]);if(o<this._minDistance){this._minDistance=o;const l=new Zt(n[r],n[r+1]).closestPoint(i);s[0]=new Gi(t,r,l),s[1]=new Gi(e,0,i)}if(this._minDistance<=this._terminateDistance)return null}}else if(arguments[2]instanceof Array&&arguments[0]instanceof Q&&arguments[1]instanceof Q){const t=arguments[0],e=arguments[1],s=arguments[2];if(t.getEnvelopeInternal().distance(e.getEnvelopeInternal())>this._minDistance)return null;const n=t.getCoordinates(),i=e.getCoordinates();for(let r=0;r<n.length-1;r++){const o=new P(n[r],n[r+1]);if(!(o.distance(e.getEnvelopeInternal())>this._minDistance))for(let l=0;l<i.length-1;l++){const a=new P(i[l],i[l+1]);if(o.distance(a)>this._minDistance)continue;const c=Y.segmentToSegment(n[r],n[r+1],i[l],i[l+1]);if(c<this._minDistance){this._minDistance=c;const o=new Zt(n[r],n[r+1]),a=new Zt(i[l],i[l+1]),h=o.closestPoints(a);s[0]=new Gi(t,r,h[0]),s[1]=new Gi(e,l,h[1])}if(this._minDistance<=this._terminateDistance)return null}}}}computeMinDistancePoints(t,e,s){for(let n=0;n<t.size();n++){const i=t.get(n);for(let t=0;t<e.size();t++){const n=e.get(t),r=i.getCoordinate().distance(n.getCoordinate());if(r<this._minDistance&&(this._minDistance=r,s[0]=new Gi(i,0,i.getCoordinate()),s[1]=new Gi(n,0,n.getCoordinate())),this._minDistance<=this._terminateDistance)return null}}}distance(){if(null===this._geom[0]||null===this._geom[1])throw new s("null geometries are not supported");return this._geom[0].isEmpty()||this._geom[1].isEmpty()?0:(this.computeMinDistance(),this._minDistance)}computeMinDistanceLines(t,e,s){for(let n=0;n<t.size();n++){const i=t.get(n);for(let t=0;t<e.size();t++){const n=e.get(t);if(this.computeMinDistance(i,n,s),this._minDistance<=this._terminateDistance)return null}}}}var Yi=Object.freeze({__proto__:null,DistanceOp:Bi});class Vi{constructor(){Vi.constructor_.apply(this,arguments)}static constructor_(){this._factory=null,this._directedEdges=new S,this._coordinates=null;const t=arguments[0];this._factory=t}getCoordinates(){if(null===this._coordinates){let t=0,e=0;const s=new T;for(let n=this._directedEdges.iterator();n.hasNext();){const i=n.next();i.getEdgeDirection()?t++:e++,s.add(i.getEdge().getLine().getCoordinates(),!1,i.getEdgeDirection())}this._coordinates=s.toCoordinateArray(),e>t&>.reverse(this._coordinates)}return this._coordinates}toLineString(){return this._factory.createLineString(this.getCoordinates())}add(t){this._directedEdges.add(t)}}class zi{constructor(){zi.constructor_.apply(this,arguments)}static constructor_(){this._isMarked=!1,this._isVisited=!1,this._data=null}static getComponentWithVisitedState(t,e){for(;t.hasNext();){const s=t.next();if(s.isVisited()===e)return s}return null}static setVisited(t,e){for(;t.hasNext();){t.next().setVisited(e)}}static setMarked(t,e){for(;t.hasNext();){t.next().setMarked(e)}}setVisited(t){this._isVisited=t}isMarked(){return this._isMarked}setData(t){this._data=t}getData(){return this._data}setMarked(t){this._isMarked=t}getContext(){return this._data}isVisited(){return this._isVisited}setContext(t){this._data=t}}class Xi extends zi{constructor(){super(),Xi.constructor_.apply(this,arguments)}static constructor_(){if(this._parentEdge=null,this._from=null,this._to=null,this._p0=null,this._p1=null,this._sym=null,this._edgeDirection=null,this._quadrant=null,this._angle=null,0===arguments.length);else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];this._from=t,this._to=e,this._edgeDirection=n,this._p0=t.getCoordinate(),this._p1=s;const i=this._p1.x-this._p0.x,r=this._p1.y-this._p0.y;this._quadrant=Is.quadrant(i,r),this._angle=Math.atan2(r,i)}}static toEdges(t){const e=new S;for(let s=t.iterator();s.hasNext();)e.add(s.next()._parentEdge);return e}isRemoved(){return null===this._parentEdge}compareDirection(t){return this._quadrant>t._quadrant?1:this._quadrant<t._quadrant?-1:F.index(t._p0,t._p1,this._p1)}getCoordinate(){return this._from.getCoordinate()}print(t){const e=this.getClass().getName(),s=e.lastIndexOf("."),n=e.substring(s+1);t.print(" "+n+": "+this._p0+" - "+this._p1+" "+this._quadrant+":"+this._angle)}getDirectionPt(){return this._p1}getAngle(){return this._angle}compareTo(t){const e=t;return this.compareDirection(e)}getFromNode(){return this._from}getSym(){return this._sym}setEdge(t){this._parentEdge=t}remove(){this._sym=null,this._parentEdge=null}getEdge(){return this._parentEdge}getQuadrant(){return this._quadrant}setSym(t){this._sym=t}getToNode(){return this._to}getEdgeDirection(){return this._edgeDirection}get interfaces_(){return[r]}}class ki extends Xi{constructor(){super(),ki.constructor_.apply(this,arguments)}static constructor_(){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];Xi.constructor_.call(this,t,e,s,n)}getNext(){return 2!==this.getToNode().getDegree()?null:this.getToNode().getOutEdges().getEdges().get(0)===this.getSym()?this.getToNode().getOutEdges().getEdges().get(1):(u.isTrue(this.getToNode().getOutEdges().getEdges().get(1)===this.getSym()),this.getToNode().getOutEdges().getEdges().get(0))}}class Ui extends zi{constructor(){super(),Ui.constructor_.apply(this,arguments)}static constructor_(){if(this._dirEdge=null,0===arguments.length);else if(2===arguments.length){const t=arguments[0],e=arguments[1];this.setDirectedEdges(t,e)}}isRemoved(){return null===this._dirEdge}setDirectedEdges(t,e){this._dirEdge=[t,e],t.setEdge(this),e.setEdge(this),t.setSym(e),e.setSym(t),t.getFromNode().addOutEdge(t),e.getFromNode().addOutEdge(e)}getDirEdge(){if(Number.isInteger(arguments[0])){const t=arguments[0];return this._dirEdge[t]}if(arguments[0]instanceof Wi){const t=arguments[0];return this._dirEdge[0].getFromNode()===t?this._dirEdge[0]:this._dirEdge[1].getFromNode()===t?this._dirEdge[1]:null}}remove(){this._dirEdge=null}getOppositeNode(t){return this._dirEdge[0].getFromNode()===t?this._dirEdge[0].getToNode():this._dirEdge[1].getFromNode()===t?this._dirEdge[1].getToNode():null}}class Hi{constructor(){Hi.constructor_.apply(this,arguments)}static constructor_(){this._outEdges=new S,this._sorted=!1}getNextEdge(t){const e=this.getIndex(t);return this._outEdges.get(this.getIndex(e+1))}getCoordinate(){const t=this.iterator();if(!t.hasNext())return null;return t.next().getCoordinate()}iterator(){return this.sortEdges(),this._outEdges.iterator()}sortEdges(){this._sorted||(fe.sort(this._outEdges),this._sorted=!0)}remove(t){this._outEdges.remove(t)}getEdges(){return this.sortEdges(),this._outEdges}getNextCWEdge(t){const e=this.getIndex(t);return this._outEdges.get(this.getIndex(e-1))}getIndex(){if(arguments[0]instanceof Ui){const t=arguments[0];this.sortEdges();for(let e=0;e<this._outEdges.size();e++){if(this._outEdges.get(e).getEdge()===t)return e}return-1}if(arguments[0]instanceof Xi){const t=arguments[0];this.sortEdges();for(let e=0;e<this._outEdges.size();e++){if(this._outEdges.get(e)===t)return e}return-1}if(Number.isInteger(arguments[0])){let t=arguments[0]%this._outEdges.size();return t<0&&(t+=this._outEdges.size()),t}}add(t){this._outEdges.add(t),this._sorted=!1}getDegree(){return this._outEdges.size()}}class Wi extends zi{constructor(){super(),Wi.constructor_.apply(this,arguments)}static constructor_(){if(this._pt=null,this._deStar=null,1===arguments.length){const t=arguments[0];Wi.constructor_.call(this,t,new Hi)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._pt=t,this._deStar=e}}static getEdgesBetween(t,e){const s=Xi.toEdges(t.getOutEdges().getEdges()),n=new yt(s),i=Xi.toEdges(e.getOutEdges().getEdges());return n.retainAll(i),n}isRemoved(){return null===this._pt}addOutEdge(t){this._deStar.add(t)}getCoordinate(){return this._pt}getOutEdges(){return this._deStar}remove(){if(0===arguments.length)this._pt=null;else if(1===arguments.length){const t=arguments[0];this._deStar.remove(t)}}getIndex(t){return this._deStar.getIndex(t)}getDegree(){return this._deStar.getDegree()}}class Zi extends Ui{constructor(){super(),Zi.constructor_.apply(this,arguments)}static constructor_(){this._line=null;const t=arguments[0];this._line=t}getLine(){return this._line}}class ji{constructor(){ji.constructor_.apply(this,arguments)}static constructor_(){this._nodeMap=new Xs}find(t){return this._nodeMap.get(t)}iterator(){return this._nodeMap.values().iterator()}remove(t){return this._nodeMap.remove(t)}values(){return this._nodeMap.values()}add(t){return this._nodeMap.put(t.getCoordinate(),t),t}}class Ki{constructor(){Ki.constructor_.apply(this,arguments)}static constructor_(){this._edges=new yt,this._dirEdges=new yt,this._nodeMap=new ji}findNodesOfDegree(t){const e=new S;for(let s=this.nodeIterator();s.hasNext();){const n=s.next();n.getDegree()===t&&e.add(n)}return e}dirEdgeIterator(){return this._dirEdges.iterator()}edgeIterator(){return this._edges.iterator()}remove(){if(arguments[0]instanceof Ui){const t=arguments[0];this.remove(t.getDirEdge(0)),this.remove(t.getDirEdge(1)),this._edges.remove(t),t.remove()}else if(arguments[0]instanceof Xi){const t=arguments[0],e=t.getSym();null!==e&&e.setSym(null),t.getFromNode().remove(t),t.remove(),this._dirEdges.remove(t)}else if(arguments[0]instanceof Wi){const t=arguments[0];for(let e=t.getOutEdges().getEdges().iterator();e.hasNext();){const t=e.next(),s=t.getSym();null!==s&&this.remove(s),this._dirEdges.remove(t);const n=t.getEdge();null!==n&&this._edges.remove(n)}this._nodeMap.remove(t.getCoordinate()),t.remove()}}findNode(t){return this._nodeMap.find(t)}getEdges(){return this._edges}nodeIterator(){return this._nodeMap.iterator()}contains(){if(arguments[0]instanceof Ui){const t=arguments[0];return this._edges.contains(t)}if(arguments[0]instanceof Xi){const t=arguments[0];return this._dirEdges.contains(t)}}add(){if(arguments[0]instanceof Wi){const t=arguments[0];this._nodeMap.add(t)}else if(arguments[0]instanceof Ui){const t=arguments[0];this._edges.add(t),this.add(t.getDirEdge(0)),this.add(t.getDirEdge(1))}else if(arguments[0]instanceof Xi){const t=arguments[0];this._dirEdges.add(t)}}getNodes(){return this._nodeMap.values()}}class Qi extends Ki{constructor(){super()}addEdge(t){if(t.isEmpty())return null;const e=gt.removeRepeatedPoints(t.getCoordinates());if(e.length<=1)return null;const s=e[0],n=e[e.length-1],i=this.getNode(s),r=this.getNode(n),o=new ki(i,r,e[1],!0),l=new ki(r,i,e[e.length-2],!1),a=new Zi(t);a.setDirectedEdges(o,l),this.add(a)}getNode(t){let e=this.findNode(t);return null===e&&(e=new Wi(t),this.add(e)),e}}class Ji{constructor(){Ji.constructor_.apply(this,arguments)}static constructor_(){this._graph=new Qi,this._mergedLineStrings=null,this._factory=null,this._edgeStrings=null}buildEdgeStringsForUnprocessedNodes(){for(let t=this._graph.getNodes().iterator();t.hasNext();){const e=t.next();e.isMarked()||(u.isTrue(2===e.getDegree()),this.buildEdgeStringsStartingAt(e),e.setMarked(!0))}}buildEdgeStringsForNonDegree2Nodes(){for(let t=this._graph.getNodes().iterator();t.hasNext();){const e=t.next();2!==e.getDegree()&&(this.buildEdgeStringsStartingAt(e),e.setMarked(!0))}}buildEdgeStringsForObviousStartNodes(){this.buildEdgeStringsForNonDegree2Nodes()}getMergedLineStrings(){return this.merge(),this._mergedLineStrings}buildEdgeStringsStartingAt(t){for(let e=t.getOutEdges().iterator();e.hasNext();){const t=e.next();t.getEdge().isMarked()||this._edgeStrings.add(this.buildEdgeStringStartingWith(t))}}merge(){if(null!==this._mergedLineStrings)return null;zi.setMarked(this._graph.nodeIterator(),!1),zi.setMarked(this._graph.edgeIterator(),!1),this._edgeStrings=new S,this.buildEdgeStringsForObviousStartNodes(),this.buildEdgeStringsForIsolatedLoops(),this._mergedLineStrings=new S;for(let t=this._edgeStrings.iterator();t.hasNext();){const e=t.next();this._mergedLineStrings.add(e.toLineString())}}addLineString(t){null===this._factory&&(this._factory=t.getFactory()),this._graph.addEdge(t)}buildEdgeStringStartingWith(t){const e=new Vi(this._factory);let s=t;do{e.add(s),s.getEdge().setMarked(!0),s=s.getNext()}while(null!==s&&s!==t);return e}add(){if(arguments[0]instanceof X){const t=arguments[0];for(let e=0;e<t.getNumGeometries();e++){const s=t.getGeometryN(e);s instanceof Q&&this.addLineString(s)}}else if(E(arguments[0],I)){const t=arguments[0];this._mergedLineStrings=null;for(let e=t.iterator();e.hasNext();){const t=e.next();this.add(t)}}}buildEdgeStringsForIsolatedLoops(){this.buildEdgeStringsForUnprocessedNodes()}}class $i{constructor(){$i.constructor_.apply(this,arguments)}static constructor_(){this._parentGraph=null,this._edges=new yt,this._dirEdges=new S,this._nodeMap=new ji;const t=arguments[0];this._parentGraph=t}dirEdgeIterator(){return this._dirEdges.iterator()}edgeIterator(){return this._edges.iterator()}getParent(){return this._parentGraph}nodeIterator(){return this._nodeMap.iterator()}contains(t){return this._edges.contains(t)}add(t){if(this._edges.contains(t))return null;this._edges.add(t),this._dirEdges.add(t.getDirEdge(0)),this._dirEdges.add(t.getDirEdge(1)),this._nodeMap.add(t.getDirEdge(0).getFromNode()),this._nodeMap.add(t.getDirEdge(1).getFromNode())}}class tr{constructor(){tr.constructor_.apply(this,arguments)}static constructor_(){this._graph=null;const t=arguments[0];this._graph=t}addReachable(t,e){const s=new $e;for(s.add(t);!s.empty();){const t=s.pop();this.addEdges(t,s,e)}}findSubgraph(t){const e=new $i(this._graph);return this.addReachable(t,e),e}getConnectedSubgraphs(){const t=new S;zi.setVisited(this._graph.nodeIterator(),!1);for(let e=this._graph.edgeIterator();e.hasNext();){const s=e.next().getDirEdge(0).getFromNode();s.isVisited()||t.add(this.findSubgraph(s))}return t}addEdges(t,e,s){t.setVisited(!0);for(let n=t.getOutEdges().iterator();n.hasNext();){const t=n.next();s.add(t.getEdge());const i=t.getToNode();i.isVisited()||e.push(i)}}}class er{constructor(){er.constructor_.apply(this,arguments)}static constructor_(){this._graph=new Qi,this._factory=new wt,this._lineCount=0,this._isRun=!1,this._sequencedGeometry=null,this._isSequenceable=!1}static findUnvisitedBestOrientedDE(t){let e=null,s=null;for(let n=t.getOutEdges().iterator();n.hasNext();){const t=n.next();t.getEdge().isVisited()||(s=t,t.getEdgeDirection()&&(e=t))}return null!==e?e:s}static findLowestDegreeNode(t){let e=v.MAX_VALUE,s=null;for(let n=t.nodeIterator();n.hasNext();){const t=n.next();(null===s||t.getDegree()<e)&&(e=t.getDegree(),s=t)}return s}static isSequenced(t){if(!(t instanceof Ct))return!0;const e=t,s=new ot;let n=null;const i=new S;for(let t=0;t<e.getNumGeometries();t++){const r=e.getGeometryN(t),o=r.getCoordinateN(0),l=r.getCoordinateN(r.getNumPoints()-1);if(s.contains(o))return!1;if(s.contains(l))return!1;null!==n&&(o.equals(n)||(s.addAll(i),i.clear())),i.add(o),i.add(l),n=l}return!0}static reverse(t){const e=t.getCoordinates(),s=new Array(e.length).fill(null),n=e.length;for(let t=0;t<n;t++)s[n-1-t]=new p(e[t]);return t.getFactory().createLineString(s)}static sequence(t){const e=new er;return e.add(t),e.getSequencedLineStrings()}addLine(t){null===this._factory&&(this._factory=t.getFactory()),this._graph.addEdge(t),this._lineCount++}hasSequence(t){let e=0;for(let s=t.nodeIterator();s.hasNext();){s.next().getDegree()%2==1&&e++}return e<=2}computeSequence(){if(this._isRun)return null;this._isRun=!0;const t=this.findSequences();if(null===t)return null;this._sequencedGeometry=this.buildSequencedGeometry(t),this._isSequenceable=!0;const e=this._sequencedGeometry.getNumGeometries();u.isTrue(this._lineCount===e,"Lines were missing from result"),u.isTrue(this._sequencedGeometry instanceof Q||this._sequencedGeometry instanceof Ct,"Result is not lineal")}findSequences(){const t=new S;for(let e=new tr(this._graph).getConnectedSubgraphs().iterator();e.hasNext();){const s=e.next();if(!this.hasSequence(s))return null;{const e=this.findSequence(s);t.add(e)}}return t}addReverseSubpath(t,e,s){const n=t.getToNode();let i=null;for(;;){e.add(t.getSym()),t.getEdge().setVisited(!0),i=t.getFromNode();const s=er.findUnvisitedBestOrientedDE(i);if(null===s)break;t=s.getSym()}s&&u.isTrue(i===n,"path not contiguous")}findSequence(t){zi.setVisited(t.edgeIterator(),!1);const e=er.findLowestDegreeNode(t).getOutEdges().iterator().next().getSym(),s=new li,n=s.listIterator();for(this.addReverseSubpath(e,n,!1);n.hasPrevious();){const t=n.previous(),e=er.findUnvisitedBestOrientedDE(t.getFromNode());null!==e&&this.addReverseSubpath(e.getSym(),n,!0)}return this.orient(s)}reverse(t){const e=new li;for(let s=t.iterator();s.hasNext();){const t=s.next();e.addFirst(t.getSym())}return e}orient(t){const e=t.get(0),s=t.get(t.size()-1),n=e.getFromNode(),i=s.getToNode();let r=!1;if(1===n.getDegree()||1===i.getDegree()){let t=!1;1===s.getToNode().getDegree()&&!1===s.getEdgeDirection()&&(t=!0,r=!0),1===e.getFromNode().getDegree()&&!0===e.getEdgeDirection()&&(t=!0,r=!1),t||1===e.getFromNode().getDegree()&&(r=!0)}return r?this.reverse(t):t}buildSequencedGeometry(t){const e=new S;for(let s=t.iterator();s.hasNext();){for(let t=s.next().iterator();t.hasNext();){const s=t.next(),n=s.getEdge().getLine();let i=n;s.getEdgeDirection()||n.isClosed()||(i=er.reverse(n)),e.add(i)}}return 0===e.size()?this._factory.createMultiLineString(new Array(0).fill(null)):this._factory.buildGeometry(e)}getSequencedLineStrings(){return this.computeSequence(),this._sequencedGeometry}isSequenceable(){return this.computeSequence(),this._isSequenceable}add(){if(E(arguments[0],I)){for(let t=arguments[0].iterator();t.hasNext();){const e=t.next();this.add(e)}}else if(arguments[0]instanceof X){arguments[0].apply(new class{get interfaces_(){return[z]}filter(t){t instanceof Q&&this.addLine(t)}})}}}var sr=Object.freeze({__proto__:null,LineMerger:Ji,LineSequencer:er});class nr{constructor(){nr.constructor_.apply(this,arguments)}static constructor_(){if(this._snapTolerance=0,this._srcPts=null,this._seg=new Zt,this._allowSnappingToSourceVertices=!1,this._isClosed=!1,arguments[0]instanceof Q&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1];nr.constructor_.call(this,t.getCoordinates(),e)}else if(arguments[0]instanceof Array&&"number"==typeof arguments[1]){const t=arguments[0],e=arguments[1];this._srcPts=t,this._isClosed=nr.isClosed(t),this._snapTolerance=e}}static isClosed(t){return!(t.length<=1)&&t[0].equals2D(t[t.length-1])}snapVertices(t,e){const s=this._isClosed?t.size()-1:t.size();for(let n=0;n<s;n++){const s=t.get(n),i=this.findSnapForVertex(s,e);null!==i&&(t.set(n,new p(i)),0===n&&this._isClosed&&t.set(t.size()-1,new p(i)))}}findSnapForVertex(t,e){for(let s=0;s<e.length;s++){if(t.equals2D(e[s]))return null;if(t.distance(e[s])<this._snapTolerance)return e[s]}return null}snapTo(t){const e=new T(this._srcPts);this.snapVertices(e,t),this.snapSegments(e,t);return e.toCoordinateArray()}snapSegments(t,e){if(0===e.length)return null;let s=e.length;e[0].equals2D(e[e.length-1])&&(s=e.length-1);for(let n=0;n<s;n++){const s=e[n],i=this.findSegmentIndexToSnap(s,t);i>=0&&t.add(i+1,new p(s),!1)}}findSegmentIndexToSnap(t,e){let s=i.MAX_VALUE,n=-1;for(let i=0;i<e.size()-1;i++){if(this._seg.p0=e.get(i),this._seg.p1=e.get(i+1),this._seg.p0.equals2D(t)||this._seg.p1.equals2D(t)){if(this._allowSnappingToSourceVertices)continue;return-1}const r=this._seg.distance(t);r<this._snapTolerance&&r<s&&(s=r,n=i)}return n}setAllowSnappingToSourceVertices(t){this._allowSnappingToSourceVertices=t}}class ir{constructor(){ir.constructor_.apply(this,arguments)}static constructor_(){this._srcGeom=null;const t=arguments[0];this._srcGeom=t}static snap(t,e,s){const n=new Array(2).fill(null),i=new ir(t);n[0]=i.snapTo(e,s);const r=new ir(e);return n[1]=r.snapTo(n[0],s),n}static computeOverlaySnapTolerance(){if(1===arguments.length){const t=arguments[0];let e=ir.computeSizeBasedSnapTolerance(t);const s=t.getPrecisionModel();if(s.getType()===It.FIXED){const t=1/s.getScale()*2/1.415;t>e&&(e=t)}return e}if(2===arguments.length){const t=arguments[0],e=arguments[1];return Math.min(ir.computeOverlaySnapTolerance(t),ir.computeOverlaySnapTolerance(e))}}static computeSizeBasedSnapTolerance(t){const e=t.getEnvelopeInternal();return Math.min(e.getHeight(),e.getWidth())*ir.SNAP_PRECISION_FACTOR}static snapToSelf(t,e,s){return new ir(t).snapToSelf(e,s)}snapTo(t,e){const s=this.extractTargetCoordinates(t);return new rr(e,s).transform(this._srcGeom)}snapToSelf(t,e){const s=this.extractTargetCoordinates(this._srcGeom),n=new rr(t,s,!0).transform(this._srcGeom);let i=n;return e&&E(i,st)&&(i=n.buffer(0)),i}computeSnapTolerance(t){return this.computeMinimumSegmentLength(t)/10}extractTargetCoordinates(t){const e=new ot,s=t.getCoordinates();for(let t=0;t<s.length;t++)e.add(s[t]);return e.toArray(new Array(0).fill(null))}computeMinimumSegmentLength(t){let e=i.MAX_VALUE;for(let s=0;s<t.length-1;s++){const n=t[s].distance(t[s+1]);n<e&&(e=n)}return e}}ir.SNAP_PRECISION_FACTOR=1e-9;class rr extends _e{constructor(){super(),rr.constructor_.apply(this,arguments)}static constructor_(){if(this._snapTolerance=null,this._snapPts=null,this._isSelfSnap=!1,2===arguments.length){const t=arguments[0],e=arguments[1];this._snapTolerance=t,this._snapPts=e}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._snapTolerance=t,this._snapPts=e,this._isSelfSnap=s}}snapLine(t,e){const s=new nr(t,this._snapTolerance);return s.setAllowSnappingToSourceVertices(this._isSelfSnap),s.snapTo(e)}transformCoordinates(t,e){const s=t.toCoordinateArray(),n=this.snapLine(s,this._snapPts);return this._factory.getCoordinateSequenceFactory().create(n)}}var or=Object.freeze({__proto__:null,GeometrySnapper:ir,LineStringSnapper:nr});class lr{constructor(){lr.constructor_.apply(this,arguments)}static constructor_(){this._pts=null,this._data=null;const t=arguments[0],e=arguments[1];this._pts=t,this._data=e}getCoordinates(){return this._pts}size(){return this._pts.length}getCoordinate(t){return this._pts[t]}isClosed(){return this._pts[0].equals(this._pts[this._pts.length-1])}getSegmentOctant(t){return t===this._pts.length-1?-1:zn.octant(this.getCoordinate(t),this.getCoordinate(t+1))}setData(t){this._data=t}getData(){return this._data}toString(){return Ut.toLineString(new _t(this._pts))}get interfaces_(){return[Xn]}}class ar{constructor(){ar.constructor_.apply(this,arguments)}static constructor_(){this._findAllIntersections=!1,this._isCheckEndSegmentsOnly=!1,this._keepIntersections=!0,this._isInteriorIntersectionsOnly=!1,this._li=null,this._interiorIntersection=null,this._intSegments=null,this._intersections=new S,this._intersectionCount=0;const t=arguments[0];this._li=t,this._interiorIntersection=null}static createAllIntersectionsFinder(t){const e=new ar(t);return e.setFindAllIntersections(!0),e}static isInteriorVertexIntersection(){if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[3];return(!arguments[2]||!s)&&!!t.equals2D(e)}if(8===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=arguments[4],r=arguments[5],o=arguments[6],l=arguments[7];return!!ar.isInteriorVertexIntersection(t,s,i,o)||(!!ar.isInteriorVertexIntersection(t,n,i,l)||(!!ar.isInteriorVertexIntersection(e,s,r,o)||!!ar.isInteriorVertexIntersection(e,n,r,l)))}}static createInteriorIntersectionCounter(t){const e=new ar(t);return e.setInteriorIntersectionsOnly(!0),e.setFindAllIntersections(!0),e.setKeepIntersections(!1),e}static createIntersectionCounter(t){const e=new ar(t);return e.setFindAllIntersections(!0),e.setKeepIntersections(!1),e}static isEndSegment(t,e){return 0===e||e>=t.size()-2}static createAnyIntersectionFinder(t){return new ar(t)}static createInteriorIntersectionsFinder(t){const e=new ar(t);return e.setFindAllIntersections(!0),e.setInteriorIntersectionsOnly(!0),e}setCheckEndSegmentsOnly(t){this._isCheckEndSegmentsOnly=t}getIntersectionSegments(){return this._intSegments}count(){return this._intersectionCount}getIntersections(){return this._intersections}setFindAllIntersections(t){this._findAllIntersections=t}setKeepIntersections(t){this._keepIntersections=t}getIntersection(){return this._interiorIntersection}processIntersections(t,e,s,n){if(!this._findAllIntersections&&this.hasIntersection())return null;const i=t===s;if(i&&e===n)return null;if(this._isCheckEndSegmentsOnly){if(!(ar.isEndSegment(t,e)||ar.isEndSegment(s,n)))return null}const r=t.getCoordinate(e),o=t.getCoordinate(e+1),l=s.getCoordinate(n),a=s.getCoordinate(n+1),c=0===e,h=e+2===t.size(),u=0===n,g=n+2===s.size();this._li.computeIntersection(r,o,l,a);const d=this._li.hasIntersection()&&this._li.isInteriorIntersection();let _=!1;if(!this._isInteriorIntersectionsOnly){_=!(i&&Math.abs(n-e)<=1)&&ar.isInteriorVertexIntersection(r,o,l,a,c,h,u,g)}(d||_)&&(this._intSegments=new Array(4).fill(null),this._intSegments[0]=r,this._intSegments[1]=o,this._intSegments[2]=l,this._intSegments[3]=a,this._interiorIntersection=this._li.getIntersection(0),this._keepIntersections&&this._intersections.add(this._interiorIntersection),this._intersectionCount++)}hasIntersection(){return null!==this._interiorIntersection}isDone(){return!this._findAllIntersections&&null!==this._interiorIntersection}setInteriorIntersectionsOnly(t){this._isInteriorIntersectionsOnly=t}get interfaces_(){return[Si]}}class cr{constructor(){cr.constructor_.apply(this,arguments)}static constructor_(){this._li=new Wt,this._segStrings=null,this._findAllIntersections=!1,this._segInt=null,this._isValid=!0;const t=arguments[0];this._segStrings=t}static computeIntersections(t){const e=new cr(t);return e.setFindAllIntersections(!0),e.isValid(),e.getIntersections()}execute(){if(null!==this._segInt)return null;this.checkInteriorIntersections()}getIntersections(){return this._segInt.getIntersections()}isValid(){return this.execute(),this._isValid}setFindAllIntersections(t){this._findAllIntersections=t}checkInteriorIntersections(){this._isValid=!0,this._segInt=new ar(this._li),this._segInt.setFindAllIntersections(this._findAllIntersections);const t=new Qn;if(t.setSegmentIntersector(this._segInt),t.computeNodes(this._segStrings),this._segInt.hasIntersection())return this._isValid=!1,null}checkValid(){if(this.execute(),!this._isValid)throw new tn(this.getErrorMessage(),this._segInt.getIntersection())}getErrorMessage(){if(this._isValid)return"no intersections found";const t=this._segInt.getIntersectionSegments();return"found non-noded intersection between "+Ut.toLineString(t[0],t[1])+" and "+Ut.toLineString(t[2],t[3])}}class hr{constructor(){hr.constructor_.apply(this,arguments)}static constructor_(){this._nv=null;const t=arguments[0];this._nv=new cr(hr.toSegmentStrings(t))}static toSegmentStrings(t){const e=new S;for(let s=t.iterator();s.hasNext();){const t=s.next();e.add(new lr(t.getCoordinates(),t))}return e}static checkValid(t){new hr(t).checkValid()}checkValid(){this._nv.checkValid()}}class ur{constructor(){ur.constructor_.apply(this,arguments)}static constructor_(){this._op=null,this._geometryFactory=null,this._ptLocator=null,this._lineEdgesList=new S,this._resultLineList=new S;const t=arguments[0],e=arguments[1],s=arguments[2];this._op=t,this._geometryFactory=e,this._ptLocator=s}collectLines(t){for(let e=this._op.getGraph().getEdgeEnds().iterator();e.hasNext();){const s=e.next();this.collectLineEdge(s,t,this._lineEdgesList),this.collectBoundaryTouchEdge(s,t,this._lineEdgesList)}}labelIsolatedLine(t,e){const s=this._ptLocator.locate(t.getCoordinate(),this._op.getArgGeometry(e));t.getLabel().setLocation(e,s)}build(t){return this.findCoveredLineEdges(),this.collectLines(t),this.buildLines(t),this._resultLineList}collectLineEdge(t,e,s){const n=t.getLabel(),i=t.getEdge();t.isLineEdge()&&(t.isVisited()||!Er.isResultOfOp(n,e)||i.isCovered()||(s.add(i),t.setVisitedEdge(!0)))}findCoveredLineEdges(){for(let t=this._op.getGraph().getNodes().iterator();t.hasNext();){t.next().getEdges().findCoveredLineEdges()}for(let t=this._op.getGraph().getEdgeEnds().iterator();t.hasNext();){const e=t.next(),s=e.getEdge();if(e.isLineEdge()&&!s.isCoveredSet()){const t=this._op.isCoveredByA(e.getCoordinate());s.setCovered(t)}}}labelIsolatedLines(t){for(let e=t.iterator();e.hasNext();){const t=e.next(),s=t.getLabel();t.isIsolated()&&(s.isNull(0)?this.labelIsolatedLine(t,0):this.labelIsolatedLine(t,1))}}buildLines(t){for(let t=this._lineEdgesList.iterator();t.hasNext();){const e=t.next(),s=this._geometryFactory.createLineString(e.getCoordinates());this._resultLineList.add(s),e.setInResult(!0)}}collectBoundaryTouchEdge(t,e,s){const n=t.getLabel();return t.isLineEdge()||t.isVisited()||t.isInteriorAreaEdge()||t.getEdge().isInResult()?null:(u.isTrue(!(t.isInResult()||t.getSym().isInResult())||!t.getEdge().isInResult()),void(Er.isResultOfOp(n,e)&&e===Er.INTERSECTION&&(s.add(t.getEdge()),t.setVisitedEdge(!0))))}}class gr{constructor(){gr.constructor_.apply(this,arguments)}static constructor_(){this._op=null,this._geometryFactory=null,this._resultPointList=new S;const t=arguments[0],e=arguments[1];this._op=t,this._geometryFactory=e}filterCoveredNodeToPoint(t){const e=t.getCoordinate();if(!this._op.isCoveredByLA(e)){const t=this._geometryFactory.createPoint(e);this._resultPointList.add(t)}}extractNonCoveredResultNodes(t){for(let e=this._op.getGraph().getNodes().iterator();e.hasNext();){const s=e.next();if(!s.isInResult()&&(!s.isIncidentEdgeInResult()&&(0===s.getEdges().getDegree()||t===Er.INTERSECTION))){const e=s.getLabel();Er.isResultOfOp(e,t)&&this.filterCoveredNodeToPoint(s)}}}build(t){return this.extractNonCoveredResultNodes(t),this._resultPointList}}class dr{constructor(){this._isFirst=!0,this._commonMantissaBitsCount=53,this._commonBits=new n,this._commonSignExp=null}getCommon(){return i.longBitsToDouble(this._commonBits)}add(t){const e=i.doubleToLongBits(t);if(this._isFirst)return this._commonBits=e,this._commonSignExp=dr.signExpBits(this._commonBits),this._isFirst=!1,null;if(dr.signExpBits(e)!==this._commonSignExp)return this._commonBits.high=0,this._commonBits.low=0,null;this._commonMantissaBitsCount=dr.numCommonMostSigMantissaBits(this._commonBits,e),this._commonBits=dr.zeroLowerBits(this._commonBits,64-(12+this._commonMantissaBitsCount))}toString(){if(1===arguments.length){const t=arguments[0],e=i.longBitsToDouble(t),s="0000000000000000000000000000000000000000000000000000000000000000"+n.toBinaryString(t),r=s.substring(s.length-64);return r.substring(0,1)+" "+r.substring(1,12)+"(exp) "+r.substring(12)+" [ "+e+" ]"}}getClass(){return dr}get interfaces_(){return[]}static getBit(t,e){const s=1<<e%32;return e<32?0!=(t.low&s)?1:0:0!=(t.high&s)?1:0}static signExpBits(t){return t.high>>>20}static zeroLowerBits(t,e){let s="low";if(e>32&&(t.low=0,e%=32,s="high"),e>0){const n=e<32?~((1<<e)-1):0;t[s]&=n}return t}static numCommonMostSigMantissaBits(t,e){let s=0;for(let n=52;n>=0;n--){if(dr.getBit(t,n)!==dr.getBit(e,n))return s;s++}return 52}}class _r{constructor(){_r.constructor_.apply(this,arguments)}static constructor_(){this._commonCoord=null,this._ccFilter=new pr}addCommonBits(t){const e=new mr(this._commonCoord);t.apply(e),t.geometryChanged()}removeCommonBits(t){if(0===this._commonCoord.x&&0===this._commonCoord.y)return t;const e=new p(this._commonCoord);e.x=-e.x,e.y=-e.y;const s=new mr(e);return t.apply(s),t.geometryChanged(),t}getCommonCoordinate(){return this._commonCoord}add(t){t.apply(this._ccFilter),this._commonCoord=this._ccFilter.getCommonCoordinate()}}class pr{constructor(){pr.constructor_.apply(this,arguments)}static constructor_(){this._commonBitsX=new dr,this._commonBitsY=new dr}filter(t){this._commonBitsX.add(t.x),this._commonBitsY.add(t.y)}getCommonCoordinate(){return new p(this._commonBitsX.getCommon(),this._commonBitsY.getCommon())}get interfaces_(){return[k]}}class mr{constructor(){mr.constructor_.apply(this,arguments)}static constructor_(){this.trans=null;const t=arguments[0];this.trans=t}filter(t,e){const s=t.getOrdinate(e,0)+this.trans.x,n=t.getOrdinate(e,1)+this.trans.y;t.setOrdinate(e,0,s),t.setOrdinate(e,1,n)}isDone(){return!1}isGeometryChanged(){return!0}get interfaces_(){return[R]}}_r.CommonCoordinateFilter=pr,_r.Translater=mr;class fr{constructor(){fr.constructor_.apply(this,arguments)}static constructor_(){this._geom=new Array(2).fill(null),this._snapTolerance=null,this._cbr=null;const t=arguments[0],e=arguments[1];this._geom[0]=t,this._geom[1]=e,this.computeSnapTolerance()}static overlayOp(t,e,s){return new fr(t,e).getResultGeometry(s)}static union(t,e){return fr.overlayOp(t,e,Er.UNION)}static intersection(t,e){return fr.overlayOp(t,e,Er.INTERSECTION)}static symDifference(t,e){return fr.overlayOp(t,e,Er.SYMDIFFERENCE)}static difference(t,e){return fr.overlayOp(t,e,Er.DIFFERENCE)}selfSnap(t){return new ir(t).snapTo(t,this._snapTolerance)}removeCommonBits(t){this._cbr=new _r,this._cbr.add(t[0]),this._cbr.add(t[1]);const e=new Array(2).fill(null);return e[0]=this._cbr.removeCommonBits(t[0].copy()),e[1]=this._cbr.removeCommonBits(t[1].copy()),e}prepareResult(t){return this._cbr.addCommonBits(t),t}getResultGeometry(t){const e=this.snap(this._geom),s=Er.overlayOp(e[0],e[1],t);return this.prepareResult(s)}checkValid(t){t.isValid()||q.out.println("Snapped geometry is invalid")}computeSnapTolerance(){this._snapTolerance=ir.computeOverlaySnapTolerance(this._geom[0],this._geom[1])}snap(t){const e=this.removeCommonBits(t);return ir.snap(e[0],e[1],this._snapTolerance)}}class yr{constructor(){yr.constructor_.apply(this,arguments)}static constructor_(){this._geom=new Array(2).fill(null);const t=arguments[0],e=arguments[1];this._geom[0]=t,this._geom[1]=e}static overlayOp(t,e,s){return new yr(t,e).getResultGeometry(s)}static union(t,e){return yr.overlayOp(t,e,Er.UNION)}static intersection(t,e){return yr.overlayOp(t,e,Er.INTERSECTION)}static symDifference(t,e){return yr.overlayOp(t,e,Er.SYMDIFFERENCE)}static difference(t,e){return yr.overlayOp(t,e,Er.DIFFERENCE)}getResultGeometry(t){let e=null,s=!1,n=null;try{e=Er.overlayOp(this._geom[0],this._geom[1],t);!0&&(s=!0)}catch(t){if(!(t instanceof c))throw t;n=t}if(!s)try{e=fr.overlayOp(this._geom[0],this._geom[1],t)}catch(t){throw t instanceof c?n:t}return e}}class xr{constructor(){xr.constructor_.apply(this,arguments)}static constructor_(){if(this._li=new Wt,this._resultPrecisionModel=null,this._arg=null,1===arguments.length){const t=arguments[0];this.setComputationPrecision(t.getPrecisionModel()),this._arg=new Array(1).fill(null),this._arg[0]=new rn(0,t)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];xr.constructor_.call(this,t,e,cs.OGC_SFS_BOUNDARY_RULE)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];t.getPrecisionModel().compareTo(e.getPrecisionModel())>=0?this.setComputationPrecision(t.getPrecisionModel()):this.setComputationPrecision(e.getPrecisionModel()),this._arg=new Array(2).fill(null),this._arg[0]=new rn(0,t,s),this._arg[1]=new rn(1,e,s)}}getArgGeometry(t){return this._arg[t].getGeometry()}setComputationPrecision(t){this._resultPrecisionModel=t,this._li.setPrecisionModel(this._resultPrecisionModel)}}class Er extends xr{constructor(){super(),Er.constructor_.apply(this,arguments)}static constructor_(){this._ptLocator=new _s,this._geomFact=null,this._resultGeom=null,this._graph=null,this._edgeList=new wi,this._resultPolyList=new S,this._resultLineList=new S,this._resultPointList=new S;const t=arguments[0],e=arguments[1];xr.constructor_.call(this,t,e),this._graph=new nn(new Ni),this._geomFact=t.getFactory()}static overlayOp(t,e,s){return new Er(t,e).getResultGeometry(s)}static union(t,e){if(t.isEmpty()||e.isEmpty()){if(t.isEmpty()&&e.isEmpty())return Er.createEmptyResult(Er.UNION,t,e,t.getFactory());if(t.isEmpty())return e.copy();if(e.isEmpty())return t.copy()}if(t.isGeometryCollection()||e.isGeometryCollection())throw new s("This method does not support GeometryCollection arguments");return yr.overlayOp(t,e,Er.UNION)}static intersection(t,e){if(t.isEmpty()||e.isEmpty())return Er.createEmptyResult(Er.INTERSECTION,t,e,t.getFactory());if(t.isGeometryCollection()){const s=e;return le.map(t,new class{get interfaces_(){return[MapOp]}map(t){return Er.intersection(t,s)}})}return yr.overlayOp(t,e,Er.INTERSECTION)}static symDifference(t,e){if(t.isEmpty()||e.isEmpty()){if(t.isEmpty()&&e.isEmpty())return Er.createEmptyResult(Er.SYMDIFFERENCE,t,e,t.getFactory());if(t.isEmpty())return e.copy();if(e.isEmpty())return t.copy()}if(t.isGeometryCollection()||e.isGeometryCollection())throw new s("This method does not support GeometryCollection arguments");return yr.overlayOp(t,e,Er.SYMDIFFERENCE)}static resultDimension(t,e,s){const n=e.getDimension(),i=s.getDimension();let r=-1;switch(t){case Er.INTERSECTION:r=Math.min(n,i);break;case Er.UNION:r=Math.max(n,i);break;case Er.DIFFERENCE:r=n;break;case Er.SYMDIFFERENCE:r=Math.max(n,i)}return r}static createEmptyResult(t,e,s,n){const i=Er.resultDimension(t,e,s);return n.createEmpty(i)}static difference(t,e){if(t.isEmpty())return Er.createEmptyResult(Er.DIFFERENCE,t,e,t.getFactory());if(e.isEmpty())return t.copy();if(t.isGeometryCollection()||e.isGeometryCollection())throw new s("This method does not support GeometryCollection arguments");return yr.overlayOp(t,e,Er.DIFFERENCE)}static isResultOfOp(){if(2===arguments.length){const t=arguments[0],e=arguments[1],s=t.getLocation(0),n=t.getLocation(1);return Er.isResultOfOp(s,n,e)}if(3===arguments.length){let t=arguments[0],e=arguments[1],s=arguments[2];switch(t===jt.BOUNDARY&&(t=jt.INTERIOR),e===jt.BOUNDARY&&(e=jt.INTERIOR),s){case Er.INTERSECTION:return t===jt.INTERIOR&&e===jt.INTERIOR;case Er.UNION:return t===jt.INTERIOR||e===jt.INTERIOR;case Er.DIFFERENCE:return t===jt.INTERIOR&&e!==jt.INTERIOR;case Er.SYMDIFFERENCE:return t===jt.INTERIOR&&e!==jt.INTERIOR||t!==jt.INTERIOR&&e===jt.INTERIOR}return!1}}insertUniqueEdge(t){const e=this._edgeList.findEqualEdge(t);if(null!==e){const s=e.getLabel();let n=t.getLabel();e.isPointwiseEqual(t)||(n=new As(t.getLabel()),n.flip());const i=e.getDepth();i.isNull()&&i.add(s),i.add(n),s.merge(n)}else this._edgeList.add(t)}getGraph(){return this._graph}cancelDuplicateResultEdges(){for(let t=this._graph.getEdgeEnds().iterator();t.hasNext();){const e=t.next(),s=e.getSym();e.isInResult()&&s.isInResult()&&(e.setInResult(!1),s.setInResult(!1))}}isCoveredByLA(t){return!!this.isCovered(t,this._resultLineList)||!!this.isCovered(t,this._resultPolyList)}computeGeometry(t,e,s,n){const i=new S;return i.addAll(t),i.addAll(e),i.addAll(s),i.isEmpty()?Er.createEmptyResult(n,this._arg[0].getGeometry(),this._arg[1].getGeometry(),this._geomFact):this._geomFact.buildGeometry(i)}mergeSymLabels(){for(let t=this._graph.getNodes().iterator();t.hasNext();){t.next().getEdges().mergeSymLabels()}}isCovered(t,e){for(let s=e.iterator();s.hasNext();){const e=s.next();if(this._ptLocator.locate(t,e)!==jt.EXTERIOR)return!0}return!1}replaceCollapsedEdges(){const t=new S;for(let e=this._edgeList.iterator();e.hasNext();){const s=e.next();s.isCollapsed()&&(e.remove(),t.add(s.getCollapsedEdge()))}this._edgeList.addAll(t)}updateNodeLabelling(){for(let t=this._graph.getNodes().iterator();t.hasNext();){const e=t.next(),s=e.getEdges().getLabel();e.getLabel().merge(s)}}getResultGeometry(t){return this.computeOverlay(t),this._resultGeom}insertUniqueEdges(t){for(let e=t.iterator();e.hasNext();){const t=e.next();this.insertUniqueEdge(t)}}computeOverlay(t){this.copyPoints(0),this.copyPoints(1),this._arg[0].computeSelfNodes(this._li,!1),this._arg[1].computeSelfNodes(this._li,!1),this._arg[0].computeEdgeIntersections(this._arg[1],this._li,!0);const e=new S;this._arg[0].computeSplitEdges(e),this._arg[1].computeSplitEdges(e),this.insertUniqueEdges(e),this.computeLabelsFromDepths(),this.replaceCollapsedEdges(),hr.checkValid(this._edgeList.getEdges()),this._graph.addEdges(this._edgeList.getEdges()),this.computeLabelling(),this.labelIncompleteNodes(),this.findResultAreaEdges(t),this.cancelDuplicateResultEdges();const s=new gi(this._geomFact);s.add(this._graph),this._resultPolyList=s.getPolygons();const n=new ur(this,this._geomFact,this._ptLocator);this._resultLineList=n.build(t);const i=new gr(this,this._geomFact,this._ptLocator);this._resultPointList=i.build(t),this._resultGeom=this.computeGeometry(this._resultPointList,this._resultLineList,this._resultPolyList,t)}labelIncompleteNode(t,e){const s=this._ptLocator.locate(t.getCoordinate(),this._arg[e].getGeometry());t.getLabel().setLocation(e,s)}copyPoints(t){for(let e=this._arg[t].getNodeIterator();e.hasNext();){const s=e.next();this._graph.addNode(s.getCoordinate()).setLabel(t,s.getLabel().getLocation(t))}}findResultAreaEdges(t){for(let e=this._graph.getEdgeEnds().iterator();e.hasNext();){const s=e.next(),n=s.getLabel();n.isArea()&&!s.isInteriorAreaEdge()&&Er.isResultOfOp(n.getLocation(0,Ps.RIGHT),n.getLocation(1,Ps.RIGHT),t)&&s.setInResult(!0)}}computeLabelsFromDepths(){for(let t=this._edgeList.iterator();t.hasNext();){const e=t.next(),s=e.getLabel(),n=e.getDepth();if(!n.isNull()){n.normalize();for(let t=0;t<2;t++)s.isNull(t)||!s.isArea()||n.isNull(t)||(0===n.getDelta(t)?s.toLine(t):(u.isTrue(!n.isNull(t,Ps.LEFT),"depth of LEFT side has not been initialized"),s.setLocation(t,Ps.LEFT,n.getLocation(t,Ps.LEFT)),u.isTrue(!n.isNull(t,Ps.RIGHT),"depth of RIGHT side has not been initialized"),s.setLocation(t,Ps.RIGHT,n.getLocation(t,Ps.RIGHT))))}}}computeLabelling(){for(let t=this._graph.getNodes().iterator();t.hasNext();){t.next().getEdges().computeLabelling(this._arg)}this.mergeSymLabels(),this.updateNodeLabelling()}labelIncompleteNodes(){for(let t=this._graph.getNodes().iterator();t.hasNext();){const e=t.next(),s=e.getLabel();e.isIsolated()&&(s.isNull(0)?this.labelIncompleteNode(e,0):this.labelIncompleteNode(e,1)),e.getEdges().updateLabelling(s)}}isCoveredByA(t){return!!this.isCovered(t,this._resultPolyList)}}Er.INTERSECTION=1,Er.UNION=2,Er.DIFFERENCE=3,Er.SYMDIFFERENCE=4;var Ir=Object.freeze({__proto__:null,snap:or,OverlayOp:Er});class Nr extends Xi{constructor(){super(),Nr.constructor_.apply(this,arguments)}static constructor_(){this._edgeRing=null,this._next=null,this._label=-1;const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];Xi.constructor_.call(this,t,e,s,n)}getNext(){return this._next}isInRing(){return null!==this._edgeRing}setRing(t){this._edgeRing=t}setLabel(t){this._label=t}getLabel(){return this._label}setNext(t){this._next=t}getRing(){return this._edgeRing}}class Cr extends Ui{constructor(){super(),Cr.constructor_.apply(this,arguments)}static constructor_(){this._line=null;const t=arguments[0];this._line=t}getLine(){return this._line}}class wr{constructor(){wr.constructor_.apply(this,arguments)}static constructor_(){this._geometryFactory=new wt,this._geomGraph=null,this._disconnectedRingcoord=null;const t=arguments[0];this._geomGraph=t}static findDifferentPoint(t,e){for(let s=0;s<t.length;s++)if(!t[s].equals(e))return t[s];return null}visitInteriorRing(t,e){if(t.isEmpty())return null;const s=t.getCoordinates(),n=s[0],i=wr.findDifferentPoint(s,n),r=e.findEdgeInSameDirection(n,i),o=e.findEdgeEnd(r);let l=null;o.getLabel().getLocation(0,Ps.RIGHT)===jt.INTERIOR?l=o:o.getSym().getLabel().getLocation(0,Ps.RIGHT)===jt.INTERIOR&&(l=o.getSym()),u.isTrue(null!==l,"unable to find dirEdge with Interior on RHS"),this.visitLinkedDirectedEdges(l)}visitShellInteriors(t,e){if(t instanceof nt){const s=t;this.visitInteriorRing(s.getExteriorRing(),e)}if(t instanceof mt){const s=t;for(let t=0;t<s.getNumGeometries();t++){const n=s.getGeometryN(t);this.visitInteriorRing(n.getExteriorRing(),e)}}}getCoordinate(){return this._disconnectedRingcoord}setInteriorEdgesInResult(t){for(let e=t.getEdgeEnds().iterator();e.hasNext();){const t=e.next();t.getLabel().getLocation(0,Ps.RIGHT)===jt.INTERIOR&&t.setInResult(!0)}}visitLinkedDirectedEdges(t){const e=t;let s=t;do{u.isTrue(null!==s,"found null Directed Edge"),s.setVisited(!0),s=s.getNext()}while(s!==e)}buildEdgeRings(t){const e=new S;for(let s=t.iterator();s.hasNext();){const t=s.next();if(t.isInResult()&&null===t.getEdgeRing()){const s=new ui(t,this._geometryFactory);s.linkDirectedEdgesForMinimalEdgeRings();const n=s.buildMinimalRings();e.addAll(n)}}return e}hasUnvisitedShellEdge(t){for(let e=0;e<t.size();e++){const s=t.get(e);if(s.isHole())continue;const n=s.getEdges();let i=n.get(0);if(i.getLabel().getLocation(0,Ps.RIGHT)===jt.INTERIOR)for(let t=0;t<n.size();t++)if(i=n.get(t),!i.isVisited())return this._disconnectedRingcoord=i.getCoordinate(),!0}return!1}isInteriorsConnected(){const t=new S;this._geomGraph.computeSplitEdges(t);const e=new nn(new Ni);e.addEdges(t),this.setInteriorEdgesInResult(e),e.linkResultDirectedEdges();const s=this.buildEdgeRings(e.getEdgeEnds());return this.visitShellInteriors(this._geomGraph.getGeometry(),e),!this.hasUnvisitedShellEdge(s)}}class Sr{createEdgeEndForNext(t,e,s,n){const i=s.segmentIndex+1;if(i>=t.getNumPoints()&&null===n)return null;let r=t.getCoordinate(i);null!==n&&n.segmentIndex===s.segmentIndex&&(r=n.coord);const o=new $s(t,s.coord,r,new As(t.getLabel()));e.add(o)}createEdgeEndForPrev(t,e,s,n){let i=s.segmentIndex;if(0===s.dist){if(0===i)return null;i--}let r=t.getCoordinate(i);null!==n&&n.segmentIndex>=i&&(r=n.coord);const o=new As(t.getLabel());o.flip();const l=new $s(t,s.coord,r,o);e.add(l)}computeEdgeEnds(){if(1===arguments.length){const t=arguments[0],e=new S;for(let s=t;s.hasNext();){const t=s.next();this.computeEdgeEnds(t,e)}return e}if(2===arguments.length){const t=arguments[0],e=arguments[1],s=t.getEdgeIntersectionList();s.addEndpoints();const n=s.iterator();let i=null,r=null;if(!n.hasNext())return null;let o=n.next();do{i=r,r=o,o=null,n.hasNext()&&(o=n.next()),null!==r&&(this.createEdgeEndForPrev(t,e,r,i),this.createEdgeEndForNext(t,e,r,o))}while(null!==r)}}}class Lr extends $s{constructor(){super(),Lr.constructor_.apply(this,arguments)}static constructor_(){if(this._edgeEnds=new S,1===arguments.length){const t=arguments[0];Lr.constructor_.call(this,null,t)}else if(2===arguments.length){const t=arguments[1];$s.constructor_.call(this,t.getEdge(),t.getCoordinate(),t.getDirectedCoordinate(),new As(t.getLabel())),this.insert(t)}}insert(t){this._edgeEnds.add(t)}print(t){t.println("EdgeEndBundle--\x3e Label: "+this._label);for(let e=this.iterator();e.hasNext();){e.next().print(t),t.println()}}iterator(){return this._edgeEnds.iterator()}getEdgeEnds(){return this._edgeEnds}computeLabelOn(t,e){let s=0,n=!1;for(let e=this.iterator();e.hasNext();){const i=e.next().getLabel().getLocation(t);i===jt.BOUNDARY&&s++,i===jt.INTERIOR&&(n=!0)}let i=jt.NONE;n&&(i=jt.INTERIOR),s>0&&(i=rn.determineBoundary(e,s)),this._label.setLocation(t,i)}computeLabelSide(t,e){for(let s=this.iterator();s.hasNext();){const n=s.next();if(n.getLabel().isArea()){const s=n.getLabel().getLocation(t,e);if(s===jt.INTERIOR)return this._label.setLocation(t,e,jt.INTERIOR),null;s===jt.EXTERIOR&&this._label.setLocation(t,e,jt.EXTERIOR)}}}getLabel(){return this._label}computeLabelSides(t){this.computeLabelSide(t,Ps.LEFT),this.computeLabelSide(t,Ps.RIGHT)}updateIM(t){Ks.updateIM(this._label,t)}computeLabel(t){let e=!1;for(let t=this.iterator();t.hasNext();){t.next().getLabel().isArea()&&(e=!0)}this._label=e?new As(jt.NONE,jt.NONE,jt.NONE):new As(jt.NONE);for(let s=0;s<2;s++)this.computeLabelOn(s,t),e&&this.computeLabelSides(s)}}class Tr extends Ei{constructor(){super()}updateIM(t){for(let e=this.iterator();e.hasNext();){e.next().updateIM(t)}}insert(t){let e=this._edgeMap.get(t);null===e?(e=new Lr(t),this.insertEdgeEnd(t,e)):e.insert(t)}}class Rr extends Qs{constructor(){super(),Rr.constructor_.apply(this,arguments)}static constructor_(){const t=arguments[0],e=arguments[1];Qs.constructor_.call(this,t,e)}updateIMFromEdges(t){this._edges.updateIM(t)}computeIM(t){t.setAtLeastIfValid(this._label.getLocation(0),this._label.getLocation(1),0)}}class Pr extends sn{constructor(){super()}createNode(t){return new Rr(t,new Tr)}}class Or{constructor(){Or.constructor_.apply(this,arguments)}static constructor_(){this._nodes=new Js(new Pr)}insertEdgeEnds(t){for(let e=t.iterator();e.hasNext();){const t=e.next();this._nodes.add(t)}}getNodeIterator(){return this._nodes.iterator()}copyNodesAndLabels(t,e){for(let s=t.getNodeIterator();s.hasNext();){const t=s.next();this._nodes.addNode(t.getCoordinate()).setLabel(e,t.getLabel().getLocation(e))}}build(t){this.computeIntersectionNodes(t,0),this.copyNodesAndLabels(t,0);const e=(new Sr).computeEdgeEnds(t.getEdgeIterator());this.insertEdgeEnds(e)}computeIntersectionNodes(t,e){for(let s=t.getEdgeIterator();s.hasNext();){const t=s.next(),n=t.getLabel().getLocation(e);for(let s=t.getEdgeIntersectionList().iterator();s.hasNext();){const t=s.next(),i=this._nodes.addNode(t.coord);n===jt.BOUNDARY?i.setLabelBoundary(e):i.getLabel().isNull(e)&&i.setLabel(e,jt.INTERIOR)}}}}class vr{constructor(){vr.constructor_.apply(this,arguments)}static constructor_(){this._li=new Wt,this._geomGraph=null,this._nodeGraph=new Or,this._invalidPoint=null;const t=arguments[0];this._geomGraph=t}isNodeEdgeAreaLabelsConsistent(){for(let t=this._nodeGraph.getNodeIterator();t.hasNext();){const e=t.next();if(!e.getEdges().isAreaLabelsConsistent(this._geomGraph))return this._invalidPoint=e.getCoordinate().copy(),!1}return!0}getInvalidPoint(){return this._invalidPoint}hasDuplicateRings(){for(let t=this._nodeGraph.getNodeIterator();t.hasNext();){for(let e=t.next().getEdges().iterator();e.hasNext();){const t=e.next();if(t.getEdgeEnds().size()>1)return this._invalidPoint=t.getEdge().getCoordinate(0),!0}}return!1}isNodeConsistentArea(){const t=this._geomGraph.computeSelfNodes(this._li,!0,!0);return t.hasProperIntersection()?(this._invalidPoint=t.getProperIntersectionPoint(),!1):(this._nodeGraph.build(this._geomGraph),this.isNodeEdgeAreaLabelsConsistent())}}class Mr{constructor(){Mr.constructor_.apply(this,arguments)}static constructor_(){this._graph=null,this._rings=new S,this._totalEnv=new P,this._index=null,this._nestedPt=null;const t=arguments[0];this._graph=t}buildIndex(){this._index=new Pn;for(let t=0;t<this._rings.size();t++){const e=this._rings.get(t),s=e.getEnvelopeInternal();this._index.insert(s,e)}}getNestedPoint(){return this._nestedPt}isNonNested(){this.buildIndex();for(let t=0;t<this._rings.size();t++){const e=this._rings.get(t),s=e.getCoordinates(),n=this._index.query(e.getEnvelopeInternal());for(let t=0;t<n.size();t++){const i=n.get(t),r=i.getCoordinates();if(e===i)continue;if(!e.getEnvelopeInternal().intersects(i.getEnvelopeInternal()))continue;const o=Dr.findPtNotNode(s,i,this._graph);if(null===o)continue;if(Xe.isInRing(o,r))return this._nestedPt=o,!1}}return!0}add(t){this._rings.add(t),this._totalEnv.expandToInclude(t.getEnvelopeInternal())}}class br{constructor(){br.constructor_.apply(this,arguments)}static constructor_(){if(this._errorType=null,this._pt=null,1===arguments.length){const t=arguments[0];br.constructor_.call(this,t,null)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._errorType=t,null!==e&&(this._pt=e.copy())}}getErrorType(){return this._errorType}getMessage(){return br.errMsg[this._errorType]}getCoordinate(){return this._pt}toString(){let t="";return null!==this._pt&&(t=" at or near point "+this._pt),this.getMessage()+t}}br.ERROR=0,br.REPEATED_POINT=1,br.HOLE_OUTSIDE_SHELL=2,br.NESTED_HOLES=3,br.DISCONNECTED_INTERIOR=4,br.SELF_INTERSECTION=5,br.RING_SELF_INTERSECTION=6,br.NESTED_SHELLS=7,br.DUPLICATE_RINGS=8,br.TOO_FEW_POINTS=9,br.INVALID_COORDINATE=10,br.RING_NOT_CLOSED=11,br.errMsg=["Topology Validation Error","Repeated Point","Hole lies outside shell","Holes are nested","Interior is disconnected","Self-intersection","Ring Self-intersection","Nested shells","Duplicate Rings","Too few distinct points in geometry component","Invalid Coordinate","Ring is not closed"];class Dr{constructor(){Dr.constructor_.apply(this,arguments)}static constructor_(){this._parentGeometry=null,this._isSelfTouchingRingFormingHoleValid=!1,this._validErr=null;const t=arguments[0];this._parentGeometry=t}static findPtNotNode(t,e,s){const n=s.findEdge(e).getEdgeIntersectionList();for(let e=0;e<t.length;e++){const s=t[e];if(!n.isIntersection(s))return s}return null}static isValid(){if(arguments[0]instanceof X){return new Dr(arguments[0]).isValid()}if(arguments[0]instanceof p){const t=arguments[0];return!i.isNaN(t.x)&&(!i.isInfinite(t.x)&&(!i.isNaN(t.y)&&!i.isInfinite(t.y)))}}checkInvalidCoordinates(){if(arguments[0]instanceof Array){const t=arguments[0];for(let e=0;e<t.length;e++)if(!Dr.isValid(t[e]))return this._validErr=new br(br.INVALID_COORDINATE,t[e]),null}else if(arguments[0]instanceof nt){const t=arguments[0];if(this.checkInvalidCoordinates(t.getExteriorRing().getCoordinates()),null!==this._validErr)return null;for(let e=0;e<t.getNumInteriorRing();e++)if(this.checkInvalidCoordinates(t.getInteriorRingN(e).getCoordinates()),null!==this._validErr)return null}}checkHolesNotNested(t,e){if(t.getNumInteriorRing()<=0)return null;const s=new Mr(e);for(let e=0;e<t.getNumInteriorRing();e++){const n=t.getInteriorRingN(e);n.isEmpty()||s.add(n)}s.isNonNested()||(this._validErr=new br(br.NESTED_HOLES,s.getNestedPoint()))}checkConsistentArea(t){const e=new vr(t);if(!e.isNodeConsistentArea())return this._validErr=new br(br.SELF_INTERSECTION,e.getInvalidPoint()),null;e.hasDuplicateRings()&&(this._validErr=new br(br.DUPLICATE_RINGS,e.getInvalidPoint()))}isValid(){return this.checkValid(this._parentGeometry),null===this._validErr}checkShellInsideHole(t,e,s){const n=t.getCoordinates(),i=e.getCoordinates(),r=Dr.findPtNotNode(n,e,s);if(null!==r){if(!Xe.isInRing(r,i))return r}const o=Dr.findPtNotNode(i,t,s);if(null!==o){return Xe.isInRing(o,n)?o:null}return u.shouldNeverReachHere("points in shell and hole appear to be equal"),null}checkNoSelfIntersectingRings(t){for(let e=t.getEdgeIterator();e.hasNext();){const t=e.next();if(this.checkNoSelfIntersectingRing(t.getEdgeIntersectionList()),null!==this._validErr)return null}}checkConnectedInteriors(t){const e=new wr(t);e.isInteriorsConnected()||(this._validErr=new br(br.DISCONNECTED_INTERIOR,e.getCoordinate()))}checkNoSelfIntersectingRing(t){const e=new ot;let s=!0;for(let n=t.iterator();n.hasNext();){const t=n.next();if(s)s=!1;else{if(e.contains(t.coord))return this._validErr=new br(br.RING_SELF_INTERSECTION,t.coord),null;e.add(t.coord)}}}checkHolesInShell(t,e){if(t.getNumInteriorRing()<=0)return null;const s=t.getExteriorRing(),n=s.isEmpty(),i=new Ye(s);for(let r=0;r<t.getNumInteriorRing();r++){const o=t.getInteriorRingN(r);let l=null;if(o.isEmpty())continue;if(l=Dr.findPtNotNode(o.getCoordinates(),s,e),null===l)return null;if(n||jt.EXTERIOR===i.locate(l))return this._validErr=new br(br.HOLE_OUTSIDE_SHELL,l),null}}checkTooFewPoints(t){if(t.hasTooFewPoints())return this._validErr=new br(br.TOO_FEW_POINTS,t.getInvalidPoint()),null}getValidationError(){return this.checkValid(this._parentGeometry),this._validErr}checkValid(){if(arguments[0]instanceof $){const t=arguments[0];this.checkInvalidCoordinates(t.getCoordinates())}else if(arguments[0]instanceof ct){const t=arguments[0];this.checkInvalidCoordinates(t.getCoordinates())}else if(arguments[0]instanceof ht){const t=arguments[0];if(this.checkInvalidCoordinates(t.getCoordinates()),null!==this._validErr)return null;if(this.checkClosedRing(t),null!==this._validErr)return null;const e=new rn(0,t);if(this.checkTooFewPoints(e),null!==this._validErr)return null;const s=new Wt;e.computeSelfNodes(s,!0,!0),this.checkNoSelfIntersectingRings(e)}else if(arguments[0]instanceof Q){const t=arguments[0];if(this.checkInvalidCoordinates(t.getCoordinates()),null!==this._validErr)return null;const e=new rn(0,t);this.checkTooFewPoints(e)}else if(arguments[0]instanceof nt){const t=arguments[0];if(this.checkInvalidCoordinates(t),null!==this._validErr)return null;if(this.checkClosedRings(t),null!==this._validErr)return null;const e=new rn(0,t);if(this.checkTooFewPoints(e),null!==this._validErr)return null;if(this.checkConsistentArea(e),null!==this._validErr)return null;if(!this._isSelfTouchingRingFormingHoleValid&&(this.checkNoSelfIntersectingRings(e),null!==this._validErr))return null;if(this.checkHolesInShell(t,e),null!==this._validErr)return null;if(this.checkHolesNotNested(t,e),null!==this._validErr)return null;this.checkConnectedInteriors(e)}else if(arguments[0]instanceof mt){const t=arguments[0];for(let e=0;e<t.getNumGeometries();e++){const s=t.getGeometryN(e);if(this.checkInvalidCoordinates(s),null!==this._validErr)return null;if(this.checkClosedRings(s),null!==this._validErr)return null}const e=new rn(0,t);if(this.checkTooFewPoints(e),null!==this._validErr)return null;if(this.checkConsistentArea(e),null!==this._validErr)return null;if(!this._isSelfTouchingRingFormingHoleValid&&(this.checkNoSelfIntersectingRings(e),null!==this._validErr))return null;for(let s=0;s<t.getNumGeometries();s++){const n=t.getGeometryN(s);if(this.checkHolesInShell(n,e),null!==this._validErr)return null}for(let s=0;s<t.getNumGeometries();s++){const n=t.getGeometryN(s);if(this.checkHolesNotNested(n,e),null!==this._validErr)return null}if(this.checkShellsNotNested(t,e),null!==this._validErr)return null;this.checkConnectedInteriors(e)}else if(arguments[0]instanceof at){const t=arguments[0];for(let e=0;e<t.getNumGeometries();e++){const s=t.getGeometryN(e);if(this.checkValid(s),null!==this._validErr)return null}}else if(arguments[0]instanceof X){const t=arguments[0];if(this._validErr=null,t.isEmpty())return null;if(t instanceof $)this.checkValid(t);else if(t instanceof ct)this.checkValid(t);else if(t instanceof ht)this.checkValid(t);else if(t instanceof Q)this.checkValid(t);else if(t instanceof nt)this.checkValid(t);else if(t instanceof mt)this.checkValid(t);else{if(!(t instanceof at))throw new Z(t.getGeometryType());this.checkValid(t)}}}setSelfTouchingRingFormingHoleValid(t){this._isSelfTouchingRingFormingHoleValid=t}checkShellNotNested(t,e,s){const n=t.getCoordinates(),i=e.getExteriorRing();if(i.isEmpty())return null;const r=i.getCoordinates(),o=Dr.findPtNotNode(n,i,s);if(null===o)return null;if(!Xe.isInRing(o,r))return null;if(e.getNumInteriorRing()<=0)return this._validErr=new br(br.NESTED_SHELLS,o),null;let l=null;for(let n=0;n<e.getNumInteriorRing();n++){const i=e.getInteriorRingN(n);if(l=this.checkShellInsideHole(t,i,s),null===l)return null}this._validErr=new br(br.NESTED_SHELLS,l)}checkClosedRings(t){if(this.checkClosedRing(t.getExteriorRing()),null!==this._validErr)return null;for(let e=0;e<t.getNumInteriorRing();e++)if(this.checkClosedRing(t.getInteriorRingN(e)),null!==this._validErr)return null}checkClosedRing(t){if(t.isEmpty())return null;if(!t.isClosed()){let e=null;t.getNumPoints()>=1&&(e=t.getCoordinateN(0)),this._validErr=new br(br.RING_NOT_CLOSED,e)}}checkShellsNotNested(t,e){for(let s=0;s<t.getNumGeometries();s++){const n=t.getGeometryN(s).getExteriorRing();for(let i=0;i<t.getNumGeometries();i++){if(s===i)continue;const r=t.getGeometryN(i);if(this.checkShellNotNested(n,r,e),null!==this._validErr)return null}}}}class Ar{constructor(){Ar.constructor_.apply(this,arguments)}static constructor_(){this._factory=null,this._deList=new S,this._lowestEdge=null,this._ring=null,this._locator=null,this._ringPts=null,this._holes=null,this._shell=null,this._isHole=null,this._isProcessed=!1,this._isIncludedSet=!1,this._isIncluded=!1;const t=arguments[0];this._factory=t}static findDirEdgesInRing(t){let e=t;const s=new S;do{s.add(e),e=e.getNext(),u.isTrue(null!==e,"found null DE in ring"),u.isTrue(e===t||!e.isInRing(),"found DE already in ring")}while(e!==t);return s}static addEdge(t,e,s){if(e)for(let e=0;e<t.length;e++)s.add(t[e],!1);else for(let e=t.length-1;e>=0;e--)s.add(t[e],!1)}static findEdgeRingContaining(t,e){const s=t.getRing(),n=s.getEnvelopeInternal();let i=s.getCoordinateN(0),r=null,o=null;for(let t=e.iterator();t.hasNext();){const e=t.next(),l=e.getRing().getEnvelopeInternal();if(l.equals(n))continue;if(!l.contains(n))continue;i=gt.ptNotInList(s.getCoordinates(),e.getCoordinates());e.isInRing(i)&&(null===r||o.contains(l))&&(r=e,o=r.getRing().getEnvelopeInternal())}return r}isIncluded(){return this._isIncluded}getCoordinates(){if(null===this._ringPts){const t=new T;for(let e=this._deList.iterator();e.hasNext();){const s=e.next(),n=s.getEdge();Ar.addEdge(n.getLine().getCoordinates(),s.getEdgeDirection(),t)}this._ringPts=t.toCoordinateArray()}return this._ringPts}isIncludedSet(){return this._isIncludedSet}isValid(){return this.getCoordinates(),!(this._ringPts.length<=3)&&(this.getRing(),Dr.isValid(this._ring))}build(t){let e=t;do{this.add(e),e.setRing(this),e=e.getNext(),u.isTrue(null!==e,"found null DE in ring"),u.isTrue(e===t||!e.isInRing(),"found DE already in ring")}while(e!==t)}isInRing(t){return jt.EXTERIOR!==this.getLocator().locate(t)}isOuterHole(){return!!this._isHole&&!this.hasShell()}getPolygon(){let t=null;if(null!==this._holes){t=new Array(this._holes.size()).fill(null);for(let e=0;e<this._holes.size();e++)t[e]=this._holes.get(e)}return this._factory.createPolygon(this._ring,t)}isHole(){return this._isHole}isProcessed(){return this._isProcessed}addHole(){if(arguments[0]instanceof ht){const t=arguments[0];null===this._holes&&(this._holes=new S),this._holes.add(t)}else if(arguments[0]instanceof Ar){const t=arguments[0];t.setShell(this);const e=t.getRing();null===this._holes&&(this._holes=new S),this._holes.add(e)}}setIncluded(t){this._isIncluded=t,this._isIncludedSet=!0}getOuterHole(){if(this.isHole())return null;for(let t=0;t<this._deList.size();t++){const e=this._deList.get(t).getSym().getRing();if(e.isOuterHole())return e}return null}computeHole(){const t=this.getRing();this._isHole=F.isCCW(t.getCoordinates())}hasShell(){return null!==this._shell}isOuterShell(){return null!==this.getOuterHole()}getLineString(){return this.getCoordinates(),this._factory.createLineString(this._ringPts)}toString(){return Ut.toLineString(new _t(this.getCoordinates()))}getLocator(){return null===this._locator&&(this._locator=new Ye(this.getRing())),this._locator}getShell(){return this.isHole()?this._shell:this}add(t){this._deList.add(t)}getRing(){if(null!==this._ring)return this._ring;this.getCoordinates(),this._ringPts.length<3&&q.out.println(this._ringPts);try{this._ring=this._factory.createLinearRing(this._ringPts)}catch(t){if(!(t instanceof e))throw t;q.out.println(this._ringPts)}return this._ring}updateIncluded(){if(this.isHole())return null;for(let t=0;t<this._deList.size();t++){const e=this._deList.get(t).getSym().getRing().getShell();if(null!==e&&e.isIncludedSet())return this.setIncluded(!e.isIncluded()),null}}setShell(t){this._shell=t}setProcessed(t){this._isProcessed=t}}Ar.EnvelopeComparator=class{compare(t,e){const s=e;return t.getRing().getEnvelope().compareTo(s.getRing().getEnvelope())}get interfaces_(){return[l]}};class Fr extends Ki{constructor(){super(),Fr.constructor_.apply(this,arguments)}static constructor_(){this._factory=null;const t=arguments[0];this._factory=t}static findLabeledEdgeRings(t){const e=new S;let s=1;for(let n=t.iterator();n.hasNext();){const t=n.next();if(t.isMarked())continue;if(t.getLabel()>=0)continue;e.add(t);const i=Ar.findDirEdgesInRing(t);Fr.label(i,s),s++}return e}static getDegreeNonDeleted(t){let e=0;for(let s=t.getOutEdges().getEdges().iterator();s.hasNext();){s.next().isMarked()||e++}return e}static deleteAllEdges(t){for(let e=t.getOutEdges().getEdges().iterator();e.hasNext();){const t=e.next();t.setMarked(!0);const s=t.getSym();null!==s&&s.setMarked(!0)}}static label(t,e){for(let s=t.iterator();s.hasNext();){s.next().setLabel(e)}}static computeNextCWEdges(t){let e=null,s=null;for(let n=t.getOutEdges().getEdges().iterator();n.hasNext();){const t=n.next();if(!t.isMarked()){if(null===e&&(e=t),null!==s){s.getSym().setNext(t)}s=t}}if(null!==s){s.getSym().setNext(e)}}static computeNextCCWEdges(t,e){let s=null,n=null;const i=t.getOutEdges().getEdges();for(let t=i.size()-1;t>=0;t--){const r=i.get(t),o=r.getSym();let l=null;r.getLabel()===e&&(l=r);let a=null;o.getLabel()===e&&(a=o),null===l&&null===a||(null!==a&&(n=a),null!==l&&(null!==n&&(n.setNext(l),n=null),null===s&&(s=l)))}null!==n&&(u.isTrue(null!==s),n.setNext(s))}static getDegree(t,e){let s=0;for(let n=t.getOutEdges().getEdges().iterator();n.hasNext();){n.next().getLabel()===e&&s++}return s}static findIntersectionNodes(t,e){let s=t,n=null;do{const i=s.getFromNode();Fr.getDegree(i,e)>1&&(null===n&&(n=new S),n.add(i)),s=s.getNext(),u.isTrue(null!==s,"found null DE in ring"),u.isTrue(s===t||!s.isInRing(),"found DE already in ring")}while(s!==t);return n}findEdgeRing(t){const e=new Ar(this._factory);return e.build(t),e}computeDepthParity(){if(0===arguments.length)for(;;)return null}computeNextCWEdges(){for(let t=this.nodeIterator();t.hasNext();){const e=t.next();Fr.computeNextCWEdges(e)}}addEdge(t){if(t.isEmpty())return null;const e=gt.removeRepeatedPoints(t.getCoordinates());if(e.length<2)return null;const s=e[0],n=e[e.length-1],i=this.getNode(s),r=this.getNode(n),o=new Nr(i,r,e[1],!0),l=new Nr(r,i,e[e.length-2],!1),a=new Cr(t);a.setDirectedEdges(o,l),this.add(a)}deleteCutEdges(){this.computeNextCWEdges(),Fr.findLabeledEdgeRings(this._dirEdges);const t=new S;for(let e=this._dirEdges.iterator();e.hasNext();){const s=e.next();if(s.isMarked())continue;const n=s.getSym();if(s.getLabel()===n.getLabel()){s.setMarked(!0),n.setMarked(!0);const e=s.getEdge();t.add(e.getLine())}}return t}getEdgeRings(){this.computeNextCWEdges(),Fr.label(this._dirEdges,-1);const t=Fr.findLabeledEdgeRings(this._dirEdges);this.convertMaximalToMinimalEdgeRings(t);const e=new S;for(let t=this._dirEdges.iterator();t.hasNext();){const s=t.next();if(s.isMarked())continue;if(s.isInRing())continue;const n=this.findEdgeRing(s);e.add(n)}return e}getNode(t){let e=this.findNode(t);return null===e&&(e=new Wi(t),this.add(e)),e}convertMaximalToMinimalEdgeRings(t){for(let e=t.iterator();e.hasNext();){const t=e.next(),s=t.getLabel(),n=Fr.findIntersectionNodes(t,s);if(null!==n)for(let t=n.iterator();t.hasNext();){const e=t.next();Fr.computeNextCCWEdges(e,s)}}}deleteDangles(){const t=this.findNodesOfDegree(1),e=new yt,s=new $e;for(let e=t.iterator();e.hasNext();)s.push(e.next());for(;!s.isEmpty();){const t=s.pop();Fr.deleteAllEdges(t);for(let n=t.getOutEdges().getEdges().iterator();n.hasNext();){const t=n.next();t.setMarked(!0);const i=t.getSym();null!==i&&i.setMarked(!0);const r=t.getEdge();e.add(r.getLine());const o=t.getToNode();1===Fr.getDegreeNonDeleted(o)&&s.push(o)}}return e}}class Gr{constructor(){Gr.constructor_.apply(this,arguments)}static constructor_(){this._shells=null,this._shellIndex=null;const t=arguments[0];this._shells=t,this.buildIndex()}static assignHolesToShells(t,e){new Gr(e).assignHolesToShells(t)}assignHolesToShells(t){for(let e=t.iterator();e.hasNext();){const t=e.next();this.assignHoleToShell(t)}}buildIndex(){this._shellIndex=new Pn;for(const t of this._shells)this._shellIndex.insert(t.getRing().getEnvelopeInternal(),t)}queryOverlappingShells(t){return this._shellIndex.query(t)}findShellContaining(t){const e=t.getRing().getEnvelopeInternal(),s=this.queryOverlappingShells(e);return Ar.findEdgeRingContaining(t,s)}assignHoleToShell(t){const e=this.findShellContaining(t);null!==e&&e.addHole(t)}}class qr{constructor(){qr.constructor_.apply(this,arguments)}static constructor_(){if(this._lineStringAdder=new Br(this),this._graph=null,this._dangles=new S,this._cutEdges=new S,this._invalidRingLines=new S,this._holeList=null,this._shellList=null,this._polyList=null,this._isCheckingRingsValid=!0,this._extractOnlyPolygonal=null,this._geomFactory=null,0===arguments.length)qr.constructor_.call(this,!1);else if(1===arguments.length){const t=arguments[0];this._extractOnlyPolygonal=t}}static extractPolygons(t,e){const s=new S;for(let n=t.iterator();n.hasNext();){const t=n.next();(e||t.isIncluded())&&s.add(t.getPolygon())}return s}static findOuterShells(t){for(let e=t.iterator();e.hasNext();){const t=e.next(),s=t.getOuterHole();null===s||s.isProcessed()||(t.setIncluded(!0),s.setProcessed(!0))}}static findDisjointShells(t){qr.findOuterShells(t);let e=null;do{e=!1;for(let s=t.iterator();s.hasNext();){const t=s.next();t.isIncludedSet()||(t.updateIncluded(),t.isIncludedSet()||(e=!0))}}while(e)}getGeometry(){return null===this._geomFactory&&(this._geomFactory=new wt),this.polygonize(),this._extractOnlyPolygonal?this._geomFactory.buildGeometry(this._polyList):this._geomFactory.createGeometryCollection(wt.toGeometryArray(this._polyList))}getInvalidRingLines(){return this.polygonize(),this._invalidRingLines}findValidRings(t,e,s){for(let n=t.iterator();n.hasNext();){const t=n.next();t.isValid()?e.add(t):s.add(t.getLineString())}}polygonize(){if(null!==this._polyList)return null;if(this._polyList=new S,null===this._graph)return null;this._dangles=this._graph.deleteDangles(),this._cutEdges=this._graph.deleteCutEdges();const t=this._graph.getEdgeRings();let e=new S;this._invalidRingLines=new S,this._isCheckingRingsValid?this.findValidRings(t,e,this._invalidRingLines):e=t,this.findShellsAndHoles(e),Gr.assignHolesToShells(this._holeList,this._shellList),fe.sort(this._shellList,new Ar.EnvelopeComparator);let s=!0;this._extractOnlyPolygonal&&(qr.findDisjointShells(this._shellList),s=!1),this._polyList=qr.extractPolygons(this._shellList,s)}getDangles(){return this.polygonize(),this._dangles}getCutEdges(){return this.polygonize(),this._cutEdges}getPolygons(){return this.polygonize(),this._polyList}add(){if(E(arguments[0],I)){for(let t=arguments[0].iterator();t.hasNext();){const e=t.next();this.add(e)}}else if(arguments[0]instanceof Q){const t=arguments[0];this._geomFactory=t.getFactory(),null===this._graph&&(this._graph=new Fr(this._geomFactory)),this._graph.addEdge(t)}else if(arguments[0]instanceof X){arguments[0].apply(this._lineStringAdder)}}setCheckRingsValid(t){this._isCheckingRingsValid=t}findShellsAndHoles(t){this._holeList=new S,this._shellList=new S;for(let e=t.iterator();e.hasNext();){const t=e.next();t.computeHole(),t.isHole()?this._holeList.add(t):this._shellList.add(t)}}}class Br{constructor(){Br.constructor_.apply(this,arguments)}static constructor_(){this.p=null;const t=arguments[0];this.p=t}filter(t){t instanceof Q&&this.p.add(t)}get interfaces_(){return[z]}}qr.LineStringAdder=Br;var Yr=Object.freeze({__proto__:null,Polygonizer:qr});class Vr{constructor(){Vr.constructor_.apply(this,arguments)}static constructor_(){this._li=new Wt,this._ptLocator=new _s,this._arg=null,this._nodes=new Js(new Pr),this._im=null,this._isolatedEdges=new S,this._invalidPoint=null;const t=arguments[0];this._arg=t}insertEdgeEnds(t){for(let e=t.iterator();e.hasNext();){const t=e.next();this._nodes.add(t)}}computeProperIntersectionIM(t,e){const s=this._arg[0].getGeometry().getDimension(),n=this._arg[1].getGeometry().getDimension(),i=t.hasProperIntersection(),r=t.hasProperInteriorIntersection();2===s&&2===n?i&&e.setAtLeast("212101212"):2===s&&1===n?(i&&e.setAtLeast("FFF0FFFF2"),r&&e.setAtLeast("1FFFFF1FF")):1===s&&2===n?(i&&e.setAtLeast("F0FFFFFF2"),r&&e.setAtLeast("1F1FFFFFF")):1===s&&1===n&&r&&e.setAtLeast("0FFFFFFFF")}labelIsolatedEdges(t,e){for(let s=this._arg[t].getEdgeIterator();s.hasNext();){const t=s.next();t.isIsolated()&&(this.labelIsolatedEdge(t,e,this._arg[e].getGeometry()),this._isolatedEdges.add(t))}}labelIsolatedEdge(t,e,s){if(s.getDimension()>0){const n=this._ptLocator.locate(t.getCoordinate(),s);t.getLabel().setAllLocations(e,n)}else t.getLabel().setAllLocations(e,jt.EXTERIOR)}computeIM(){const t=new Kt;if(t.set(jt.EXTERIOR,jt.EXTERIOR,2),!this._arg[0].getGeometry().getEnvelopeInternal().intersects(this._arg[1].getGeometry().getEnvelopeInternal()))return this.computeDisjointIM(t),t;this._arg[0].computeSelfNodes(this._li,!1),this._arg[1].computeSelfNodes(this._li,!1);const e=this._arg[0].computeEdgeIntersections(this._arg[1],this._li,!1);this.computeIntersectionNodes(0),this.computeIntersectionNodes(1),this.copyNodesAndLabels(0),this.copyNodesAndLabels(1),this.labelIsolatedNodes(),this.computeProperIntersectionIM(e,t);const s=new Sr,n=s.computeEdgeEnds(this._arg[0].getEdgeIterator());this.insertEdgeEnds(n);const i=s.computeEdgeEnds(this._arg[1].getEdgeIterator());return this.insertEdgeEnds(i),this.labelNodeEdges(),this.labelIsolatedEdges(0,1),this.labelIsolatedEdges(1,0),this.updateIM(t),t}labelNodeEdges(){for(let t=this._nodes.iterator();t.hasNext();){t.next().getEdges().computeLabelling(this._arg)}}copyNodesAndLabels(t){for(let e=this._arg[t].getNodeIterator();e.hasNext();){const s=e.next();this._nodes.addNode(s.getCoordinate()).setLabel(t,s.getLabel().getLocation(t))}}labelIntersectionNodes(t){for(let e=this._arg[t].getEdgeIterator();e.hasNext();){const s=e.next(),n=s.getLabel().getLocation(t);for(let e=s.getEdgeIntersectionList().iterator();e.hasNext();){const s=e.next(),i=this._nodes.find(s.coord);i.getLabel().isNull(t)&&(n===jt.BOUNDARY?i.setLabelBoundary(t):i.setLabel(t,jt.INTERIOR))}}}labelIsolatedNode(t,e){const s=this._ptLocator.locate(t.getCoordinate(),this._arg[e].getGeometry());t.getLabel().setAllLocations(e,s)}computeIntersectionNodes(t){for(let e=this._arg[t].getEdgeIterator();e.hasNext();){const s=e.next(),n=s.getLabel().getLocation(t);for(let e=s.getEdgeIntersectionList().iterator();e.hasNext();){const s=e.next(),i=this._nodes.addNode(s.coord);n===jt.BOUNDARY?i.setLabelBoundary(t):i.getLabel().isNull(t)&&i.setLabel(t,jt.INTERIOR)}}}labelIsolatedNodes(){for(let t=this._nodes.iterator();t.hasNext();){const e=t.next(),s=e.getLabel();u.isTrue(s.getGeometryCount()>0,"node with empty label found"),e.isIsolated()&&(s.isNull(0)?this.labelIsolatedNode(e,0):this.labelIsolatedNode(e,1))}}updateIM(t){for(let e=this._isolatedEdges.iterator();e.hasNext();){e.next().updateIM(t)}for(let e=this._nodes.iterator();e.hasNext();){const s=e.next();s.updateIM(t),s.updateIMFromEdges(t)}}computeDisjointIM(t){const e=this._arg[0].getGeometry();e.isEmpty()||(t.set(jt.INTERIOR,jt.EXTERIOR,e.getDimension()),t.set(jt.BOUNDARY,jt.EXTERIOR,e.getBoundaryDimension()));const s=this._arg[1].getGeometry();s.isEmpty()||(t.set(jt.EXTERIOR,jt.INTERIOR,s.getDimension()),t.set(jt.EXTERIOR,jt.BOUNDARY,s.getBoundaryDimension()))}}class zr{constructor(){zr.constructor_.apply(this,arguments)}static constructor_(){this._rectEnv=null;const t=arguments[0];this._rectEnv=t.getEnvelopeInternal()}static contains(t,e){return new zr(t).contains(e)}isContainedInBoundary(t){if(t instanceof nt)return!1;if(t instanceof $)return this.isPointContainedInBoundary(t);if(t instanceof Q)return this.isLineStringContainedInBoundary(t);for(let e=0;e<t.getNumGeometries();e++){const s=t.getGeometryN(e);if(!this.isContainedInBoundary(s))return!1}return!0}isLineSegmentContainedInBoundary(t,e){if(t.equals(e))return this.isPointContainedInBoundary(t);if(t.x===e.x){if(t.x===this._rectEnv.getMinX()||t.x===this._rectEnv.getMaxX())return!0}else if(t.y===e.y&&(t.y===this._rectEnv.getMinY()||t.y===this._rectEnv.getMaxY()))return!0;return!1}isLineStringContainedInBoundary(t){const e=t.getCoordinateSequence(),s=new p,n=new p;for(let t=0;t<e.size()-1;t++)if(e.getCoordinate(t,s),e.getCoordinate(t+1,n),!this.isLineSegmentContainedInBoundary(s,n))return!1;return!0}isPointContainedInBoundary(){if(arguments[0]instanceof $){const t=arguments[0];return this.isPointContainedInBoundary(t.getCoordinate())}if(arguments[0]instanceof p){const t=arguments[0];return t.x===this._rectEnv.getMinX()||t.x===this._rectEnv.getMaxX()||t.y===this._rectEnv.getMinY()||t.y===this._rectEnv.getMaxY()}}contains(t){return!!this._rectEnv.contains(t.getEnvelopeInternal())&&!this.isContainedInBoundary(t)}}class Xr{constructor(){Xr.constructor_.apply(this,arguments)}static constructor_(){this._li=new Wt,this._rectEnv=null,this._diagUp0=null,this._diagUp1=null,this._diagDown0=null,this._diagDown1=null;const t=arguments[0];this._rectEnv=t,this._diagUp0=new p(t.getMinX(),t.getMinY()),this._diagUp1=new p(t.getMaxX(),t.getMaxY()),this._diagDown0=new p(t.getMinX(),t.getMaxY()),this._diagDown1=new p(t.getMaxX(),t.getMinY())}intersects(t,e){const s=new P(t,e);if(!this._rectEnv.intersects(s))return!1;if(this._rectEnv.intersects(t))return!0;if(this._rectEnv.intersects(e))return!0;if(t.compareTo(e)>0){const s=t;t=e,e=s}let n=!1;return e.y>t.y&&(n=!0),n?this._li.computeIntersection(t,e,this._diagDown0,this._diagDown1):this._li.computeIntersection(t,e,this._diagUp0,this._diagUp1),!!this._li.hasIntersection()}}class kr{constructor(){kr.constructor_.apply(this,arguments)}static constructor_(){this._rectangle=null,this._rectEnv=null;const t=arguments[0];this._rectangle=t,this._rectEnv=t.getEnvelopeInternal()}static intersects(t,e){return new kr(t).intersects(e)}intersects(t){if(!this._rectEnv.intersects(t.getEnvelopeInternal()))return!1;const e=new Ur(this._rectEnv);if(e.applyTo(t),e.intersects())return!0;const s=new Hr(this._rectangle);if(s.applyTo(t),s.containsPoint())return!0;const n=new Wr(this._rectangle);return n.applyTo(t),!!n.intersects()}}class Ur extends Ee{constructor(){super(),Ur.constructor_.apply(this,arguments)}static constructor_(){this._rectEnv=null,this._intersects=!1;const t=arguments[0];this._rectEnv=t}isDone(){return!0===this._intersects}visit(t){const e=t.getEnvelopeInternal();return this._rectEnv.intersects(e)?this._rectEnv.contains(e)||e.getMinX()>=this._rectEnv.getMinX()&&e.getMaxX()<=this._rectEnv.getMaxX()||e.getMinY()>=this._rectEnv.getMinY()&&e.getMaxY()<=this._rectEnv.getMaxY()?(this._intersects=!0,null):void 0:null}intersects(){return this._intersects}}class Hr extends Ee{constructor(){super(),Hr.constructor_.apply(this,arguments)}static constructor_(){this._rectSeq=null,this._rectEnv=null,this._containsPoint=!1;const t=arguments[0];this._rectSeq=t.getExteriorRing().getCoordinateSequence(),this._rectEnv=t.getEnvelopeInternal()}isDone(){return!0===this._containsPoint}visit(t){if(!(t instanceof nt))return null;const e=t.getEnvelopeInternal();if(!this._rectEnv.intersects(e))return null;const s=new p;for(let n=0;n<4;n++)if(this._rectSeq.getCoordinate(n,s),e.contains(s)&&He.containsPointInPolygon(s,t))return this._containsPoint=!0,null}containsPoint(){return this._containsPoint}}class Wr extends Ee{constructor(){super(),Wr.constructor_.apply(this,arguments)}static constructor_(){this._rectEnv=null,this._rectIntersector=null,this._hasIntersection=!1,this._p0=new p,this._p1=new p;const t=arguments[0];this._rectEnv=t.getEnvelopeInternal(),this._rectIntersector=new Xr(this._rectEnv)}intersects(){return this._hasIntersection}isDone(){return!0===this._hasIntersection}visit(t){const e=t.getEnvelopeInternal();if(!this._rectEnv.intersects(e))return null;const s=me.getLines(t);this.checkIntersectionWithLineStrings(s)}checkIntersectionWithLineStrings(t){for(let e=t.iterator();e.hasNext();){const t=e.next();if(this.checkIntersectionWithSegments(t),this._hasIntersection)return null}}checkIntersectionWithSegments(t){const e=t.getCoordinateSequence();for(let t=1;t<e.size();t++)if(e.getCoordinate(t-1,this._p0),e.getCoordinate(t,this._p1),this._rectIntersector.intersects(this._p0,this._p1))return this._hasIntersection=!0,null}}class Zr extends xr{constructor(){super(),Zr.constructor_.apply(this,arguments)}static constructor_(){if(this._relate=null,2===arguments.length){const t=arguments[0],e=arguments[1];xr.constructor_.call(this,t,e),this._relate=new Vr(this._arg)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];xr.constructor_.call(this,t,e,s),this._relate=new Vr(this._arg)}}static covers(t,e){return!(2===e.getDimension()&&t.getDimension()<2)&&(!(1===e.getDimension()&&t.getDimension()<1&&e.getLength()>0)&&(!!t.getEnvelopeInternal().covers(e.getEnvelopeInternal())&&(!!t.isRectangle()||new Zr(t,e).getIntersectionMatrix().isCovers())))}static intersects(t,e){if(!t.getEnvelopeInternal().intersects(e.getEnvelopeInternal()))return!1;if(t.isRectangle())return kr.intersects(t,e);if(e.isRectangle())return kr.intersects(e,t);if(t.isGeometryCollection()||e.isGeometryCollection()){for(let s=0;s<t.getNumGeometries();s++)for(let n=0;n<e.getNumGeometries();n++)if(t.getGeometryN(s).intersects(e.getGeometryN(n)))return!0;return!1}return new Zr(t,e).getIntersectionMatrix().isIntersects()}static touches(t,e){return!!t.getEnvelopeInternal().intersects(e.getEnvelopeInternal())&&new Zr(t,e).getIntersectionMatrix().isTouches(t.getDimension(),e.getDimension())}static equalsTopo(t,e){return!!t.getEnvelopeInternal().equals(e.getEnvelopeInternal())&&Zr.relate(t,e).isEquals(t.getDimension(),e.getDimension())}static relate(){if(2===arguments.length){return new Zr(arguments[0],arguments[1]).getIntersectionMatrix()}if(3===arguments.length){return new Zr(arguments[0],arguments[1],arguments[2]).getIntersectionMatrix()}}static overlaps(t,e){return!!t.getEnvelopeInternal().intersects(e.getEnvelopeInternal())&&new Zr(t,e).getIntersectionMatrix().isOverlaps(t.getDimension(),e.getDimension())}static crosses(t,e){return!!t.getEnvelopeInternal().intersects(e.getEnvelopeInternal())&&new Zr(t,e).getIntersectionMatrix().isCrosses(t.getDimension(),e.getDimension())}static contains(t,e){return!(2===e.getDimension()&&t.getDimension()<2)&&(!(1===e.getDimension()&&t.getDimension()<1&&e.getLength()>0)&&(!!t.getEnvelopeInternal().contains(e.getEnvelopeInternal())&&(t.isRectangle()?zr.contains(t,e):new Zr(t,e).getIntersectionMatrix().isContains())))}getIntersectionMatrix(){return this._relate.computeIM()}}var jr=Object.freeze({__proto__:null,RelateOp:Zr});class Kr{constructor(){Kr.constructor_.apply(this,arguments)}static constructor_(){this._pointGeom=null,this._otherGeom=null,this._geomFact=null;const t=arguments[0],e=arguments[1];this._pointGeom=t,this._otherGeom=e,this._geomFact=e.getFactory()}static union(t,e){return new Kr(t,e).union()}union(){const t=new _s,e=new ot;for(let s=0;s<this._pointGeom.getNumGeometries();s++){const n=this._pointGeom.getGeometryN(s).getCoordinate();t.locate(n,this._otherGeom)===jt.EXTERIOR&&e.add(n)}if(0===e.size())return this._otherGeom;let s=null;const n=gt.toCoordinateArray(e);return s=1===n.length?this._geomFact.createPoint(n[0]):this._geomFact.createMultiPointFromCoords(n),ae.combine(s,this._otherGeom)}}class Qr{constructor(){Qr.constructor_.apply(this,arguments)}static constructor_(){this._geomFactory=null,this._polygons=new S,this._lines=new S,this._points=new S,this._dimension=j.FALSE}static extract(){if(E(arguments[0],I)){const t=arguments[0],e=new Qr;return e.add(t),e}if(arguments[0]instanceof X){const t=arguments[0],e=new Qr;return e.add(t),e}}getFactory(){return this._geomFactory}recordDimension(t){t>this._dimension&&(this._dimension=t)}getDimension(){return this._dimension}filter(t){return this.recordDimension(t.getDimension()),t instanceof at||t.isEmpty()?null:t instanceof nt?(this._polygons.add(t),null):t instanceof Q?(this._lines.add(t),null):t instanceof $?(this._points.add(t),null):void u.shouldNeverReachHere("Unhandled geometry type: "+t.getGeometryType())}getExtract(t){switch(t){case 0:return this._points;case 1:return this._lines;case 2:return this._polygons}return u.shouldNeverReachHere("Invalid dimension: "+t),null}isEmpty(){return this._polygons.isEmpty()&&this._lines.isEmpty()&&this._points.isEmpty()}add(){if(E(arguments[0],I)){const t=arguments[0];for(const e of t)this.add(e)}else if(arguments[0]instanceof X){const t=arguments[0];null===this._geomFactory&&(this._geomFactory=t.getFactory()),t.apply(this)}}get interfaces_(){return[K]}}class Jr{constructor(){Jr.constructor_.apply(this,arguments)}static constructor_(){this._geomFactory=null,this._g0=null,this._g1=null,this._isUnionSafe=null;const t=arguments[0],e=arguments[1];this._g0=t,this._g1=e,this._geomFactory=t.getFactory()}static containsProperly(){if(2===arguments.length){const t=arguments[0],e=arguments[1];return!t.isNull()&&(e.getX()>t.getMinX()&&e.getX()<t.getMaxX()&&e.getY()>t.getMinY()&&e.getY()<t.getMaxY())}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];return Jr.containsProperly(t,e)&&Jr.containsProperly(t,s)}}static union(t,e){return new Jr(t,e).union()}static intersects(t,e,s){return t.intersects(e)||t.intersects(s)}static overlapEnvelope(t,e){const s=t.getEnvelopeInternal(),n=e.getEnvelopeInternal();return s.intersection(n)}static extractBorderSegments(t,e,s){t.apply(new class{get interfaces_(){return[R]}filter(t,n){if(n<=0)return null;const i=t.getCoordinate(n-1),r=t.getCoordinate(n);if(Jr.intersects(e,i,r)&&!Jr.containsProperly(e,i,r)){const t=new Zt(i,r);s.add(t)}}isDone(){return!1}isGeometryChanged(){return!1}})}static unionBuffer(t,e){return t.getFactory().createGeometryCollection([t,e]).buffer(0)}isBorderSegmentsSame(t,e){const s=this.extractBorderSegments(this._g0,this._g1,e),n=new S;return Jr.extractBorderSegments(t,e,n),this.isEqual(s,n)}extractByEnvelope(t,e,s){const n=new S;for(let i=0;i<e.getNumGeometries();i++){const r=e.getGeometryN(i);if(r.getEnvelopeInternal().intersects(t))n.add(r);else{const t=r.copy();s.add(t)}}return this._geomFactory.buildGeometry(n)}isEqual(t,e){if(t.size()!==e.size())return!1;const s=new yt(t);for(const t of e)if(!s.contains(t))return!1;return!0}union(){const t=Jr.overlapEnvelope(this._g0,this._g1);if(t.isNull()){const t=this._g0.copy(),e=this._g1.copy();return ae.combine(t,e)}const e=new S,s=this.extractByEnvelope(t,this._g0,e),n=this.extractByEnvelope(t,this._g1,e),i=this.unionFull(s,n);let r=null;return this._isUnionSafe=this.isBorderSegmentsSame(i,t),r=this._isUnionSafe?this.combine(i,e):this.unionFull(this._g0,this._g1),r}combine(t,e){if(e.size()<=0)return t;e.add(t);return ae.combine(e)}unionFull(t,e){try{return t.union(e)}catch(s){if(s instanceof tn)return Jr.unionBuffer(t,e);throw s}}extractBorderSegments(t,e,s){const n=new S;return Jr.extractBorderSegments(t,s,n),null!==e&&Jr.extractBorderSegments(e,s,n),n}isUnionOptimized(){return this._isUnionSafe}}class $r{constructor(){$r.constructor_.apply(this,arguments)}static constructor_(){this._inputPolys=null,this._geomFactory=null;const t=arguments[0];this._inputPolys=t,null===this._inputPolys&&(this._inputPolys=new S)}static restrictToPolygons(t){if(E(t,st))return t;const e=xe.getPolygons(t);return 1===e.size()?e.get(0):t.getFactory().createMultiPolygon(wt.toPolygonArray(e))}static getGeometry(t,e){return e>=t.size()?null:t.get(e)}static union(t){return new $r(t).union()}reduceToGeometries(t){const e=new S;for(let s=t.iterator();s.hasNext();){const t=s.next();let n=null;E(t,C)?n=this.unionTree(t):t instanceof X&&(n=t),e.add(n)}return e}union(){if(null===this._inputPolys)throw new IllegalStateException("union() method cannot be called twice");if(this._inputPolys.isEmpty())return null;this._geomFactory=this._inputPolys.iterator().next().getFactory();const t=new Pn($r.STRTREE_NODE_CAPACITY);for(let e=this._inputPolys.iterator();e.hasNext();){const s=e.next();t.insert(s.getEnvelopeInternal(),s)}this._inputPolys=null;const e=t.itemsTree();return this.unionTree(e)}binaryUnion(){if(1===arguments.length){const t=arguments[0];return this.binaryUnion(t,0,t.size())}if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];if(s-e<=1){const s=$r.getGeometry(t,e);return this.unionSafe(s,null)}if(s-e==2)return this.unionSafe($r.getGeometry(t,e),$r.getGeometry(t,e+1));{const n=Math.trunc((s+e)/2),i=this.binaryUnion(t,e,n),r=this.binaryUnion(t,n,s);return this.unionSafe(i,r)}}}repeatedUnion(t){let e=null;for(let s=t.iterator();s.hasNext();){const t=s.next();e=null===e?t.copy():e.union(t)}return e}unionSafe(t,e){return null===t&&null===e?null:null===t?e.copy():null===e?t.copy():this.unionActual(t,e)}unionActual(t,e){const s=Jr.union(t,e);return $r.restrictToPolygons(s)}unionTree(t){const e=this.reduceToGeometries(t);return this.binaryUnion(e)}bufferUnion(){if(1===arguments.length){const t=arguments[0];return t.get(0).getFactory().buildGeometry(t).buffer(0)}if(2===arguments.length){const t=arguments[0],e=arguments[1];return t.getFactory().createGeometryCollection([t,e]).buffer(0)}}}$r.STRTREE_NODE_CAPACITY=4;class to{constructor(){to.constructor_.apply(this,arguments)}static constructor_(){if(this._geomFact=null,this._extracter=null,1===arguments.length){if(E(arguments[0],I)){const t=arguments[0];this.extract(t)}else if(arguments[0]instanceof X){const t=arguments[0];this.extract(t)}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._geomFact=e,this.extract(t)}}static union(){if(1===arguments.length){if(E(arguments[0],I)){return new to(arguments[0]).union()}if(arguments[0]instanceof X){return new to(arguments[0]).union()}}else if(2===arguments.length){return new to(arguments[0],arguments[1]).union()}}unionNoOpt(t){const e=this._geomFact.createPoint();return yr.overlayOp(t,e,Er.UNION)}unionWithNull(t,e){return null===t&&null===e?null:null===e?t:null===t?e:t.union(e)}extract(){if(E(arguments[0],I)){const t=arguments[0];this._extracter=Qr.extract(t)}else if(arguments[0]instanceof X){const t=arguments[0];this._extracter=Qr.extract(t)}}union(){if(null===this._geomFact&&(this._geomFact=this._extracter.getFactory()),null===this._geomFact)return null;if(this._extracter.isEmpty())return this._geomFact.createEmpty(this._extracter.getDimension());const t=this._extracter.getExtract(0),e=this._extracter.getExtract(1),s=this._extracter.getExtract(2);let n=null;if(t.size()>0){const e=this._geomFact.buildGeometry(t);n=this.unionNoOpt(e)}let i=null;if(e.size()>0){const t=this._geomFact.buildGeometry(e);i=this.unionNoOpt(t)}let r=null;s.size()>0&&(r=$r.union(s));const o=this.unionWithNull(i,r);let l=null;return l=null===n?o:null===o?n:Kr.union(n,o),null===l?this._geomFact.createGeometryCollection():l}}var eo=Object.freeze({__proto__:null,UnaryUnionOp:to}),so=Object.freeze({__proto__:null,IsValidOp:Dr,ConsistentAreaTester:vr}),no=Object.freeze({__proto__:null,BoundaryOp:ei,IsSimpleOp:ni,buffer:Fi,distance:Yi,linemerge:sr,overlay:Ir,polygonize:Yr,relate:jr,union:eo,valid:so});class io{constructor(){io.constructor_.apply(this,arguments)}static constructor_(){if(this._returnToOriginalPrecision=!0,this._cbr=null,0===arguments.length)io.constructor_.call(this,!0);else if(1===arguments.length){const t=arguments[0];this._returnToOriginalPrecision=t}}computeResultPrecision(t){return this._returnToOriginalPrecision&&this._cbr.addCommonBits(t),t}union(t,e){const s=this.removeCommonBits(t,e);return this.computeResultPrecision(s[0].union(s[1]))}intersection(t,e){const s=this.removeCommonBits(t,e);return this.computeResultPrecision(s[0].intersection(s[1]))}removeCommonBits(){if(1===arguments.length){const t=arguments[0];this._cbr=new _r,this._cbr.add(t);return this._cbr.removeCommonBits(t.copy())}if(2===arguments.length){const t=arguments[0],e=arguments[1];this._cbr=new _r,this._cbr.add(t),this._cbr.add(e);const s=new Array(2).fill(null);return s[0]=this._cbr.removeCommonBits(t.copy()),s[1]=this._cbr.removeCommonBits(e.copy()),s}}buffer(t,e){const s=this.removeCommonBits(t);return this.computeResultPrecision(s.buffer(e))}symDifference(t,e){const s=this.removeCommonBits(t,e);return this.computeResultPrecision(s[0].symDifference(s[1]))}difference(t,e){const s=this.removeCommonBits(t,e);return this.computeResultPrecision(s[0].difference(s[1]))}}class ro extends ce.CoordinateOperation{constructor(){super(),ro.constructor_.apply(this,arguments)}static constructor_(){this._targetPM=null,this._removeCollapsed=!0;const t=arguments[0],e=arguments[1];this._targetPM=t,this._removeCollapsed=e}edit(){if(2===arguments.length&&arguments[1]instanceof X&&arguments[0]instanceof Array){const t=arguments[0],e=arguments[1];if(0===t.length)return null;const s=new Array(t.length).fill(null);for(let e=0;e<t.length;e++){const n=new p(t[e]);this._targetPM.makePrecise(n),s[e]=n}const n=new T(s,!1).toCoordinateArray();let i=0;e instanceof Q&&(i=2),e instanceof ht&&(i=4);let r=s;return this._removeCollapsed&&(r=null),n.length<i?r:n}return super.edit.apply(this,arguments)}}class oo{constructor(){oo.constructor_.apply(this,arguments)}static constructor_(){this._targetPM=null,this._removeCollapsed=!0,this._changePrecisionModel=!1,this._isPointwise=!1;const t=arguments[0];this._targetPM=t}static reduce(t,e){return new oo(e).reduce(t)}static reducePointwise(t,e){const s=new oo(e);return s.setPointwise(!0),s.reduce(t)}fixPolygonalTopology(t){let e=t;this._changePrecisionModel||(e=this.changePM(t,this._targetPM));return Ai.bufferOp(e,0)}reducePointwise(t){let e=null;if(this._changePrecisionModel){const s=this.createFactory(t.getFactory(),this._targetPM);e=new ce(s)}else e=new ce;let s=this._removeCollapsed;t.getDimension()>=2&&(s=!0);return e.edit(t,new ro(this._targetPM,s))}changePM(t,e){return this.createEditor(t.getFactory(),e).edit(t,new ce.NoOpGeometryOperation)}setRemoveCollapsedComponents(t){this._removeCollapsed=t}createFactory(t,e){return new wt(e,t.getSRID(),t.getCoordinateSequenceFactory())}setChangePrecisionModel(t){this._changePrecisionModel=t}reduce(t){const e=this.reducePointwise(t);return this._isPointwise?e:E(e,st)?Dr.isValid(e)?e:this.fixPolygonalTopology(e):e}setPointwise(t){this._isPointwise=t}createEditor(t,e){if(t.getPrecisionModel()===e)return new ce;const s=this.createFactory(t,e);return new ce(s)}}class lo{constructor(){lo.constructor_.apply(this,arguments)}static constructor_(){if(this._geom=null,this._pts=null,this._start=null,this._end=null,2===arguments.length){const t=arguments[0],e=arguments[1];this._pts=t,this._start=e,this._end=e+1}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._pts=t,this._start=e,this._end=s}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];this._geom=t,this._pts=e,this._start=s,this._end=n}}computeDistanceLineLine(t,e){let s=i.MAX_VALUE;for(let n=this._start;n<this._end-1;n++){const i=this._pts.getCoordinate(n),r=this._pts.getCoordinate(n+1);for(let o=t._start;o<t._end-1;o++){const l=t._pts.getCoordinate(o),a=t._pts.getCoordinate(o+1),c=Y.segmentToSegment(i,r,l,a);if(c<s&&(s=c,null!==e&&this.updateNearestLocationsLineLine(n,i,r,t,o,l,a,e),s<=0))return s}}return s}updateNearestLocationsPointLine(t,e,s,n,i,r){r[0]=new Gi(this._geom,this._start,new p(t));const o=new Zt(n,i).closestPoint(t);r[1]=new Gi(e._geom,s,new p(o))}size(){return this._end-this._start}getCoordinate(t){return this._pts.getCoordinate(this._start+t)}nearestLocations(t){const e=this.isPoint(),s=t.isPoint(),n=new Array(2).fill(null);if(e&&s){const e=this._pts.getCoordinate(this._start),s=t._pts.getCoordinate(t._start);n[0]=new Gi(this._geom,this._start,new p(e)),n[1]=new Gi(t._geom,t._start,new p(s))}else if(e){const e=this._pts.getCoordinate(this._start);this.computeDistancePointLine(e,t,n)}else if(s){const e=t._pts.getCoordinate(t._start);this.computeDistancePointLine(e,this,n);const s=n[0];n[0]=n[1],n[1]=s}else this.computeDistanceLineLine(t,n);return n}getEnvelope(){const t=new P;for(let e=this._start;e<this._end;e++)t.expandToInclude(this._pts.getX(e),this._pts.getY(e));return t}updateNearestLocationsLineLine(t,e,s,n,i,r,o,l){const a=new Zt(e,s),c=new Zt(r,o),h=a.closestPoints(c);l[0]=new Gi(this._geom,t,new p(h[0])),l[1]=new Gi(n._geom,i,new p(h[1]))}toString(){const t=new O;t.append("LINESTRING ( ");const e=new p;for(let s=this._start;s<this._end;s++)s>this._start&&t.append(", "),this._pts.getCoordinate(s,e),t.append(e.x+" "+e.y);return t.append(" )"),t.toString()}computeDistancePointLine(t,e,s){let n=i.MAX_VALUE;for(let i=e._start;i<e._end-1;i++){const r=e._pts.getCoordinate(i),o=e._pts.getCoordinate(i+1),l=Y.pointToSegment(t,r,o);if(l<n&&(n=l,null!==s&&this.updateNearestLocationsPointLine(t,e,i,r,o,s),n<=0))return n}return n}isPoint(){return this._end-this._start==1}distance(t){const e=this.isPoint(),s=t.isPoint();let n=null;if(e&&s){const e=this._pts.getCoordinate(this._start),s=t._pts.getCoordinate(t._start);n=e.distance(s)}else if(e){const e=this._pts.getCoordinate(this._start);n=this.computeDistancePointLine(e,t,null)}else if(s){const e=t._pts.getCoordinate(t._start);n=this.computeDistancePointLine(e,this,null)}else n=this.computeDistanceLineLine(t,null);return n}}class ao{static addFacetSequences(t,e,s){let n=0;const i=e.size();for(;n<=i-1;){let r=n+ao.FACET_SEQUENCE_SIZE+1;r>=i-1&&(r=i);const o=new lo(t,e,n,r);s.add(o),n+=ao.FACET_SEQUENCE_SIZE}}static computeFacetSequences(t){const e=new S;return t.apply(new class{get interfaces_(){return[z]}filter(t){let s=null;(t instanceof Q||t instanceof $)&&(s=t.getCoordinateSequence(),ao.addFacetSequences(t,s,e))}}),e}static build(t){const e=new Pn(ao.STR_TREE_NODE_CAPACITY);for(let s=ao.computeFacetSequences(t).iterator();s.hasNext();){const t=s.next();e.insert(t.getEnvelope(),t)}return e.build(),e}}ao.FACET_SEQUENCE_SIZE=6,ao.STR_TREE_NODE_CAPACITY=4;class co{constructor(){co.constructor_.apply(this,arguments)}static constructor_(){this._inputGeom=null,this._minClearance=null,this._minClearancePts=null;const t=arguments[0];this._inputGeom=t}static getLine(t){return new co(t).getLine()}static getDistance(t){return new co(t).getDistance()}getLine(){return this.compute(),null===this._minClearancePts||null===this._minClearancePts[0]?this._inputGeom.getFactory().createLineString():this._inputGeom.getFactory().createLineString(this._minClearancePts)}compute(){if(null!==this._minClearancePts)return null;if(this._minClearancePts=new Array(2).fill(null),this._minClearance=i.MAX_VALUE,this._inputGeom.isEmpty())return null;const t=ao.build(this._inputGeom).nearestNeighbour(new ho),e=new ho;this._minClearance=e.distance(t[0],t[1]),this._minClearancePts=e.getCoordinates()}getDistance(){return this.compute(),this._minClearance}}class ho{constructor(){ho.constructor_.apply(this,arguments)}static constructor_(){this._minDist=i.MAX_VALUE,this._minPts=new Array(2).fill(null)}vertexDistance(t,e){for(let s=0;s<t.size();s++)for(let n=0;n<e.size();n++){const i=t.getCoordinate(s),r=e.getCoordinate(n);if(!i.equals2D(r)){const t=i.distance(r);if(t<this._minDist&&(this._minDist=t,this._minPts[0]=i,this._minPts[1]=r,0===t))return t}}return this._minDist}getCoordinates(){return this._minPts}segmentDistance(t,e){for(let s=0;s<t.size();s++)for(let n=1;n<e.size();n++){const i=t.getCoordinate(s),r=e.getCoordinate(n-1),o=e.getCoordinate(n);if(!i.equals2D(r)&&!i.equals2D(o)){const t=Y.pointToSegment(i,r,o);if(t<this._minDist&&(this._minDist=t,this.updatePts(i,r,o),0===t))return t}}return this._minDist}distance(){if(arguments[0]instanceof Nn&&arguments[1]instanceof Nn){const t=arguments[1],e=arguments[0].getItem(),s=t.getItem();return this._minDist=i.MAX_VALUE,this.distance(e,s)}if(arguments[0]instanceof lo&&arguments[1]instanceof lo){const t=arguments[0],e=arguments[1];return this.vertexDistance(t,e),1===t.size()&&1===e.size()?this._minDist:this._minDist<=0?this._minDist:(this.segmentDistance(t,e),this._minDist<=0||this.segmentDistance(e,t),this._minDist)}}updatePts(t,e,s){this._minPts[0]=t;const n=new Zt(e,s);this._minPts[1]=new p(n.closestPoint(t))}get interfaces_(){return[Rn]}}co.MinClearanceDistance=ho;class uo{constructor(){uo.constructor_.apply(this,arguments)}static constructor_(){this._inputGeom=null,this._minClearance=null,this._minClearancePts=null;const t=arguments[0];this._inputGeom=t}static getLine(t){return new uo(t).getLine()}static getDistance(t){return new uo(t).getDistance()}getLine(){return this.compute(),this._inputGeom.getFactory().createLineString(this._minClearancePts)}updateClearance(){if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];t<this._minClearance&&(this._minClearance=t,this._minClearancePts[0]=new p(e),this._minClearancePts[1]=new p(s))}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];if(t<this._minClearance){this._minClearance=t,this._minClearancePts[0]=new p(e);const i=new Zt(s,n);this._minClearancePts[1]=new p(i.closestPoint(e))}}}compute(){if(null!==this._minClearancePts)return null;this._minClearancePts=new Array(2).fill(null),this._minClearance=i.MAX_VALUE,this._inputGeom.apply(new go(this))}getDistance(){return this.compute(),this._minClearance}}class go{constructor(){go.constructor_.apply(this,arguments)}static constructor_(){this.smc=null;const t=arguments[0];this.smc=t}filter(t){this.smc._inputGeom.apply(new _o(this.smc,t))}get interfaces_(){return[k]}}class _o{constructor(){_o.constructor_.apply(this,arguments)}static constructor_(){this.smc=null,this._queryPt=null;const t=arguments[0],e=arguments[1];this.smc=t,this._queryPt=e}isGeometryChanged(){return!1}checkVertexDistance(t){const e=t.distance(this._queryPt);e>0&&this.smc.updateClearance(e,this._queryPt,t)}filter(t,e){this.checkVertexDistance(t.getCoordinate(e)),e>0&&this.checkSegmentDistance(t.getCoordinate(e-1),t.getCoordinate(e))}checkSegmentDistance(t,e){if(this._queryPt.equals2D(t)||this._queryPt.equals2D(e))return null;const s=Y.pointToSegment(this._queryPt,e,t);s>0&&this.smc.updateClearance(s,this._queryPt,e,t)}isDone(){return!1}get interfaces_(){return[R]}}uo.VertexCoordinateFilter=go,uo.ComputeMCCoordinateSequenceFilter=_o;var po=Object.freeze({__proto__:null,CommonBits:dr,CommonBitsOp:io,CommonBitsRemover:_r,EnhancedPrecisionOp:class{static union(t,e){let s=null;try{return t.union(e)}catch(t){if(!(t instanceof c))throw t;s=t}try{const n=new io(!0).union(t,e);if(!n.isValid())throw s;return n}catch(t){throw t instanceof c?s:t}}static intersection(t,e){let s=null;try{return t.intersection(e)}catch(t){if(!(t instanceof c))throw t;s=t}try{const n=new io(!0).intersection(t,e);if(!n.isValid())throw s;return n}catch(t){throw t instanceof c?s:t}}static buffer(t,e){let s=null;try{return t.buffer(e)}catch(t){if(!(t instanceof c))throw t;s=t}try{const n=new io(!0).buffer(t,e);if(!n.isValid())throw s;return n}catch(t){throw t instanceof c?s:t}}static symDifference(t,e){let s=null;try{return t.symDifference(e)}catch(t){if(!(t instanceof c))throw t;s=t}try{const n=new io(!0).symDifference(t,e);if(!n.isValid())throw s;return n}catch(t){throw t instanceof c?s:t}}static difference(t,e){let s=null;try{return t.difference(e)}catch(t){if(!(t instanceof c))throw t;s=t}try{const n=new io(!0).difference(t,e);if(!n.isValid())throw s;return n}catch(t){throw t instanceof c?s:t}}},GeometryPrecisionReducer:oo,MinimumClearance:co,SimpleMinimumClearance:uo});class mo{constructor(){mo.constructor_.apply(this,arguments)}static constructor_(){this._pts=null,this._usePt=null,this._distanceTolerance=null,this._seg=new Zt;const t=arguments[0];this._pts=t}static simplify(t,e){const s=new mo(t);return s.setDistanceTolerance(e),s.simplify()}simplifySection(t,e){if(t+1===e)return null;this._seg.p0=this._pts[t],this._seg.p1=this._pts[e];let s=-1,n=t;for(let i=t+1;i<e;i++){const t=this._seg.distance(this._pts[i]);t>s&&(s=t,n=i)}if(s<=this._distanceTolerance)for(let s=t+1;s<e;s++)this._usePt[s]=!1;else this.simplifySection(t,n),this.simplifySection(n,e)}setDistanceTolerance(t){this._distanceTolerance=t}simplify(){this._usePt=new Array(this._pts.length).fill(null);for(let t=0;t<this._pts.length;t++)this._usePt[t]=!0;this.simplifySection(0,this._pts.length-1);const t=new T;for(let e=0;e<this._pts.length;e++)this._usePt[e]&&t.add(new p(this._pts[e]));return t.toCoordinateArray()}}class fo{constructor(){fo.constructor_.apply(this,arguments)}static constructor_(){this._inputGeom=null,this._distanceTolerance=null,this._isEnsureValidTopology=!0;const t=arguments[0];this._inputGeom=t}static simplify(t,e){const s=new fo(t);return s.setDistanceTolerance(e),s.getResultGeometry()}setEnsureValid(t){this._isEnsureValidTopology=t}getResultGeometry(){return this._inputGeom.isEmpty()?this._inputGeom.copy():new yo(this._isEnsureValidTopology,this._distanceTolerance).transform(this._inputGeom)}setDistanceTolerance(t){if(t<0)throw new s("Tolerance must be non-negative");this._distanceTolerance=t}}class yo extends _e{constructor(){super(),yo.constructor_.apply(this,arguments)}static constructor_(){this._isEnsureValidTopology=!0,this._distanceTolerance=null;const t=arguments[0],e=arguments[1];this._isEnsureValidTopology=t,this._distanceTolerance=e}transformPolygon(t,e){if(t.isEmpty())return null;const s=super.transformPolygon.call(this,t,e);return e instanceof mt?s:this.createValidArea(s)}createValidArea(t){return this._isEnsureValidTopology?t.buffer(0):t}transformCoordinates(t,e){const s=t.toCoordinateArray();let n=null;return n=0===s.length?new Array(0).fill(null):mo.simplify(s,this._distanceTolerance),this._factory.getCoordinateSequenceFactory().create(n)}transformMultiPolygon(t,e){const s=super.transformMultiPolygon.call(this,t,e);return this.createValidArea(s)}transformLinearRing(t,e){const s=e instanceof nt,n=super.transformLinearRing.call(this,t,e);return!s||n instanceof ht?n:null}}fo.DPTransformer=yo;class xo extends Zt{constructor(){super(),xo.constructor_.apply(this,arguments)}static constructor_(){if(this._parent=null,this._index=null,2===arguments.length){const t=arguments[0],e=arguments[1];xo.constructor_.call(this,t,e,null,-1)}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];Zt.constructor_.call(this,t,e),this._parent=s,this._index=n}}getIndex(){return this._index}getParent(){return this._parent}}class Eo{constructor(){Eo.constructor_.apply(this,arguments)}static constructor_(){if(this._parentLine=null,this._segs=null,this._resultSegs=new S,this._minimumSize=null,1===arguments.length){const t=arguments[0];Eo.constructor_.call(this,t,2)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._parentLine=t,this._minimumSize=e,this.init()}}static extractCoordinates(t){const e=new Array(t.size()+1).fill(null);let s=null;for(let n=0;n<t.size();n++)s=t.get(n),e[n]=s.p0;return e[e.length-1]=s.p1,e}addToResult(t){this._resultSegs.add(t)}asLineString(){return this._parentLine.getFactory().createLineString(Eo.extractCoordinates(this._resultSegs))}getResultSize(){const t=this._resultSegs.size();return 0===t?0:t+1}getParent(){return this._parentLine}getSegment(t){return this._segs[t]}getParentCoordinates(){return this._parentLine.getCoordinates()}getMinimumSize(){return this._minimumSize}asLinearRing(){return this._parentLine.getFactory().createLinearRing(Eo.extractCoordinates(this._resultSegs))}getSegments(){return this._segs}init(){const t=this._parentLine.getCoordinates();this._segs=new Array(t.length-1).fill(null);for(let e=0;e<t.length-1;e++){const s=new xo(t[e],t[e+1],this._parentLine,e);this._segs[e]=s}}getResultCoordinates(){return Eo.extractCoordinates(this._resultSegs)}}class Io{constructor(){Io.constructor_.apply(this,arguments)}static constructor_(){this._index=new xn}remove(t){this._index.remove(new P(t.p0,t.p1),t)}add(){if(arguments[0]instanceof Eo){const t=arguments[0].getSegments();for(let e=0;e<t.length;e++){const s=t[e];this.add(s)}}else if(arguments[0]instanceof Zt){const t=arguments[0];this._index.insert(new P(t.p0,t.p1),t)}}query(t){const e=new P(t.p0,t.p1),s=new No(t);this._index.query(e,s);return s.getItems()}}class No{constructor(){No.constructor_.apply(this,arguments)}static constructor_(){this._querySeg=null,this._items=new S;const t=arguments[0];this._querySeg=t}visitItem(t){const e=t;P.intersects(e.p0,e.p1,this._querySeg.p0,this._querySeg.p1)&&this._items.add(t)}getItems(){return this._items}get interfaces_(){return[Me]}}class Co{constructor(){Co.constructor_.apply(this,arguments)}static constructor_(){this._li=new Wt,this._inputIndex=new Io,this._outputIndex=new Io,this._line=null,this._linePts=null,this._distanceTolerance=0;const t=arguments[0],e=arguments[1];this._inputIndex=t,this._outputIndex=e}static isInLineSection(t,e,s){if(s.getParent()!==t.getParent())return!1;const n=s.getIndex();return n>=e[0]&&n<e[1]}flatten(t,e){const s=this._linePts[t],n=this._linePts[e],i=new Zt(s,n);return this.remove(this._line,t,e),this._outputIndex.add(i),i}hasBadIntersection(t,e,s){return!!this.hasBadOutputIntersection(s)||!!this.hasBadInputIntersection(t,e,s)}setDistanceTolerance(t){this._distanceTolerance=t}simplifySection(t,e,s){s+=1;const n=new Array(2).fill(null);if(t+1===e){const e=this._line.getSegment(t);return this._line.addToResult(e),null}let i=!0;if(this._line.getResultSize()<this._line.getMinimumSize()){s+1<this._line.getMinimumSize()&&(i=!1)}const r=new Array(1).fill(null),o=this.findFurthestPoint(this._linePts,t,e,r);r[0]>this._distanceTolerance&&(i=!1);const l=new Zt;if(l.p0=this._linePts[t],l.p1=this._linePts[e],n[0]=t,n[1]=e,this.hasBadIntersection(this._line,n,l)&&(i=!1),i){const s=this.flatten(t,e);return this._line.addToResult(s),null}this.simplifySection(t,o,s),this.simplifySection(o,e,s)}hasBadOutputIntersection(t){for(let e=this._outputIndex.query(t).iterator();e.hasNext();){const s=e.next();if(this.hasInteriorIntersection(s,t))return!0}return!1}findFurthestPoint(t,e,s,n){const i=new Zt;i.p0=t[e],i.p1=t[s];let r=-1,o=e;for(let n=e+1;n<s;n++){const e=t[n],s=i.distance(e);s>r&&(r=s,o=n)}return n[0]=r,o}simplify(t){this._line=t,this._linePts=t.getParentCoordinates(),this.simplifySection(0,this._linePts.length-1,0)}remove(t,e,s){for(let n=e;n<s;n++){const e=t.getSegment(n);this._inputIndex.remove(e)}}hasInteriorIntersection(t,e){return this._li.computeIntersection(t.p0,t.p1,e.p0,e.p1),this._li.isInteriorIntersection()}hasBadInputIntersection(t,e,s){for(let n=this._inputIndex.query(s).iterator();n.hasNext();){const i=n.next();if(this.hasInteriorIntersection(i,s)){if(Co.isInLineSection(t,e,i))continue;return!0}}return!1}}class wo{constructor(){wo.constructor_.apply(this,arguments)}static constructor_(){this._inputIndex=new Io,this._outputIndex=new Io,this._distanceTolerance=0}setDistanceTolerance(t){this._distanceTolerance=t}simplify(t){for(let e=t.iterator();e.hasNext();)this._inputIndex.add(e.next());for(let e=t.iterator();e.hasNext();){const t=new Co(this._inputIndex,this._outputIndex);t.setDistanceTolerance(this._distanceTolerance),t.simplify(e.next())}}}class So{constructor(){So.constructor_.apply(this,arguments)}static constructor_(){this._inputGeom=null,this._lineSimplifier=new wo,this._linestringMap=null;const t=arguments[0];this._inputGeom=t}static simplify(t,e){const s=new So(t);return s.setDistanceTolerance(e),s.getResultGeometry()}getResultGeometry(){if(this._inputGeom.isEmpty())return this._inputGeom.copy();this._linestringMap=new Et,this._inputGeom.apply(new To(this)),this._lineSimplifier.simplify(this._linestringMap.values());return new Lo(this._linestringMap).transform(this._inputGeom)}setDistanceTolerance(t){if(t<0)throw new s("Tolerance must be non-negative");this._lineSimplifier.setDistanceTolerance(t)}}class Lo extends _e{constructor(){super(),Lo.constructor_.apply(this,arguments)}static constructor_(){this._linestringMap=null;const t=arguments[0];this._linestringMap=t}transformCoordinates(t,e){if(0===t.size())return null;if(e instanceof Q){const t=this._linestringMap.get(e);return this.createCoordinateSequence(t.getResultCoordinates())}return super.transformCoordinates.call(this,t,e)}}class To{constructor(){To.constructor_.apply(this,arguments)}static constructor_(){this.tps=null;const t=arguments[0];this.tps=t}filter(t){if(t instanceof Q){const e=t;if(e.isEmpty())return null;const s=e.isClosed()?4:2,n=new Eo(e,s);this.tps._linestringMap.put(e,n)}}get interfaces_(){return[z]}}So.LineStringTransformer=Lo,So.LineStringMapBuilderFilter=To;class Ro{constructor(){Ro.constructor_.apply(this,arguments)}static constructor_(){this._pts=null,this._tolerance=null;const t=arguments[0],e=arguments[1];this._pts=t,this._tolerance=e*e}static simplify(t,e){return new Ro(t,e).simplify()}simplifyVertex(t){let e=t,s=e.getArea(),n=null;for(;null!==e;){const t=e.getArea();t<s&&(s=t,n=e),e=e._next}return null!==n&&s<this._tolerance&&n.remove(),t.isLive()?s:-1}simplify(){const t=Po.buildLine(this._pts);let e=this._tolerance;do{e=this.simplifyVertex(t)}while(e<this._tolerance);const s=t.getCoordinates();return s.length<2?[s[0],new p(s[0])]:s}}class Po{constructor(){Po.constructor_.apply(this,arguments)}static constructor_(){this._pt=null,this._prev=null,this._next=null,this._area=Po.MAX_AREA,this._isLive=!0;const t=arguments[0];this._pt=t}static buildLine(t){let e=null,s=null;for(let n=0;n<t.length;n++){const i=new Po(t[n]);null===e&&(e=i),i.setPrev(s),null!==s&&(s.setNext(i),s.updateArea()),s=i}return e}getCoordinates(){const t=new T;let e=this;do{t.add(e._pt,!1),e=e._next}while(null!==e);return t.toCoordinateArray()}getArea(){return this._area}updateArea(){if(null===this._prev||null===this._next)return this._area=Po.MAX_AREA,null;this._area=Math.abs(te.area(this._prev._pt,this._pt,this._next._pt))}remove(){const t=this._prev,e=this._next;let s=null;return null!==this._prev&&(this._prev.setNext(e),this._prev.updateArea(),s=this._prev),null!==this._next&&(this._next.setPrev(t),this._next.updateArea(),null===s&&(s=this._next)),this._isLive=!1,s}isLive(){return this._isLive}setPrev(t){this._prev=t}setNext(t){this._next=t}}Po.MAX_AREA=i.MAX_VALUE,Ro.VWVertex=Po;class Oo{constructor(){Oo.constructor_.apply(this,arguments)}static constructor_(){this._inputGeom=null,this._distanceTolerance=null,this._isEnsureValidTopology=!0;const t=arguments[0];this._inputGeom=t}static simplify(t,e){const s=new Oo(t);return s.setDistanceTolerance(e),s.getResultGeometry()}setEnsureValid(t){this._isEnsureValidTopology=t}getResultGeometry(){return this._inputGeom.isEmpty()?this._inputGeom.copy():new vo(this._isEnsureValidTopology,this._distanceTolerance).transform(this._inputGeom)}setDistanceTolerance(t){if(t<0)throw new s("Tolerance must be non-negative");this._distanceTolerance=t}}class vo extends _e{constructor(){super(),vo.constructor_.apply(this,arguments)}static constructor_(){this._isEnsureValidTopology=!0,this._distanceTolerance=null;const t=arguments[0],e=arguments[1];this._isEnsureValidTopology=t,this._distanceTolerance=e}transformPolygon(t,e){if(t.isEmpty())return null;const s=super.transformPolygon.call(this,t,e);return e instanceof mt?s:this.createValidArea(s)}createValidArea(t){return this._isEnsureValidTopology?t.buffer(0):t}transformCoordinates(t,e){const s=t.toCoordinateArray();let n=null;return n=0===s.length?new Array(0).fill(null):Ro.simplify(s,this._distanceTolerance),this._factory.getCoordinateSequenceFactory().create(n)}transformMultiPolygon(t,e){const s=super.transformMultiPolygon.call(this,t,e);return this.createValidArea(s)}transformLinearRing(t,e){const s=e instanceof nt,n=super.transformLinearRing.call(this,t,e);return!s||n instanceof ht?n:null}}Oo.VWTransformer=vo;var Mo=Object.freeze({__proto__:null,DouglasPeuckerSimplifier:fo,TopologyPreservingSimplifier:So,VWSimplifier:Oo});class bo{constructor(){bo.constructor_.apply(this,arguments)}static constructor_(){this._seg=null,this._segLen=null,this._splitPt=null,this._minimumLen=0;const t=arguments[0];this._seg=t,this._segLen=t.getLength()}static pointAlongReverse(t,e){const s=new p;return s.x=t.p1.x-e*(t.p1.x-t.p0.x),s.y=t.p1.y-e*(t.p1.y-t.p0.y),s}splitAt(){if(1===arguments.length){const t=arguments[0],e=this._minimumLen/this._segLen;if(t.distance(this._seg.p0)<this._minimumLen)return this._splitPt=this._seg.pointAlong(e),null;if(t.distance(this._seg.p1)<this._minimumLen)return this._splitPt=bo.pointAlongReverse(this._seg,e),null;this._splitPt=t}else if(2===arguments.length){const t=arguments[0],e=arguments[1],s=this.getConstrainedLength(t)/this._segLen;e.equals2D(this._seg.p0)?this._splitPt=this._seg.pointAlong(s):this._splitPt=bo.pointAlongReverse(this._seg,s)}}setMinimumLength(t){this._minimumLen=t}getConstrainedLength(t){return t<this._minimumLen?this._minimumLen:t}getSplitPoint(){return this._splitPt}}class Do{findSplitPoint(t,e){}}class Ao{static projectedSplitPoint(t,e){return t.getLineSegment().project(e)}findSplitPoint(t,e){const s=t.getLineSegment(),n=s.getLength()/2,i=new bo(s),r=Ao.projectedSplitPoint(t,e);let o=2*r.distance(e)*.8;return o>n&&(o=n),i.setMinimumLength(o),i.splitAt(r),i.getSplitPoint()}get interfaces_(){return[Do]}}class Fo{static triArea(t,e,s){return(e.x-t.x)*(s.y-t.y)-(e.y-t.y)*(s.x-t.x)}static isInCircleDDNormalized(t,e,s,n){const i=b.valueOf(t.x).selfSubtract(n.x),r=b.valueOf(t.y).selfSubtract(n.y),o=b.valueOf(e.x).selfSubtract(n.x),l=b.valueOf(e.y).selfSubtract(n.y),a=b.valueOf(s.x).selfSubtract(n.x),c=b.valueOf(s.y).selfSubtract(n.y),h=i.multiply(l).selfSubtract(o.multiply(r)),u=o.multiply(c).selfSubtract(a.multiply(l)),g=a.multiply(r).selfSubtract(i.multiply(c)),d=i.multiply(i).selfAdd(r.multiply(r)),_=o.multiply(o).selfAdd(l.multiply(l)),p=a.multiply(a).selfAdd(c.multiply(c));return d.selfMultiply(u).selfAdd(_.selfMultiply(g)).selfAdd(p.selfMultiply(h)).doubleValue()>0}static checkRobustInCircle(t,e,s,n){const i=Fo.isInCircleNonRobust(t,e,s,n),r=Fo.isInCircleDDSlow(t,e,s,n),o=Fo.isInCircleCC(t,e,s,n),l=te.circumcentre(t,e,s);q.out.println("p radius diff a = "+Math.abs(n.distance(l)-t.distance(l))/t.distance(l)),i===r&&i===o||(q.out.println("inCircle robustness failure (double result = "+i+", DD result = "+r+", CC result = "+o+")"),q.out.println(Ut.toLineString(new _t([t,e,s,n]))),q.out.println("Circumcentre = "+Ut.toPoint(l)+" radius = "+t.distance(l)),q.out.println("p radius diff a = "+Math.abs(n.distance(l)/t.distance(l)-1)),q.out.println("p radius diff b = "+Math.abs(n.distance(l)/e.distance(l)-1)),q.out.println("p radius diff c = "+Math.abs(n.distance(l)/s.distance(l)-1)),q.out.println())}static isInCircleDDFast(t,e,s,n){const i=b.sqr(t.x).selfAdd(b.sqr(t.y)).selfMultiply(Fo.triAreaDDFast(e,s,n)),r=b.sqr(e.x).selfAdd(b.sqr(e.y)).selfMultiply(Fo.triAreaDDFast(t,s,n)),o=b.sqr(s.x).selfAdd(b.sqr(s.y)).selfMultiply(Fo.triAreaDDFast(t,e,n)),l=b.sqr(n.x).selfAdd(b.sqr(n.y)).selfMultiply(Fo.triAreaDDFast(t,e,s));return i.selfSubtract(r).selfAdd(o).selfSubtract(l).doubleValue()>0}static isInCircleCC(t,e,s,n){const i=te.circumcentre(t,e,s),r=t.distance(i);return n.distance(i)-r<=0}static isInCircleNormalized(t,e,s,n){const i=t.x-n.x,r=t.y-n.y,o=e.x-n.x,l=e.y-n.y,a=s.x-n.x,c=s.y-n.y;return(i*i+r*r)*(o*c-a*l)+(o*o+l*l)*(a*r-i*c)+(a*a+c*c)*(i*l-o*r)>0}static isInCircleDDSlow(t,e,s,n){const i=b.valueOf(n.x),r=b.valueOf(n.y),o=b.valueOf(t.x),l=b.valueOf(t.y),a=b.valueOf(e.x),c=b.valueOf(e.y),h=b.valueOf(s.x),u=b.valueOf(s.y),g=o.multiply(o).add(l.multiply(l)).multiply(Fo.triAreaDDSlow(a,c,h,u,i,r)),d=a.multiply(a).add(c.multiply(c)).multiply(Fo.triAreaDDSlow(o,l,h,u,i,r)),_=h.multiply(h).add(u.multiply(u)).multiply(Fo.triAreaDDSlow(o,l,a,c,i,r)),p=i.multiply(i).add(r.multiply(r)).multiply(Fo.triAreaDDSlow(o,l,a,c,h,u));return g.subtract(d).add(_).subtract(p).doubleValue()>0}static isInCircleNonRobust(t,e,s,n){return(t.x*t.x+t.y*t.y)*Fo.triArea(e,s,n)-(e.x*e.x+e.y*e.y)*Fo.triArea(t,s,n)+(s.x*s.x+s.y*s.y)*Fo.triArea(t,e,n)-(n.x*n.x+n.y*n.y)*Fo.triArea(t,e,s)>0}static isInCircleRobust(t,e,s,n){return Fo.isInCircleNormalized(t,e,s,n)}static triAreaDDSlow(t,e,s,n,i,r){return s.subtract(t).multiply(r.subtract(e)).subtract(n.subtract(e).multiply(i.subtract(t)))}static triAreaDDFast(t,e,s){const n=b.valueOf(e.x).selfSubtract(t.x).selfMultiply(b.valueOf(s.y).selfSubtract(t.y)),i=b.valueOf(e.y).selfSubtract(t.y).selfMultiply(b.valueOf(s.x).selfSubtract(t.x));return n.selfSubtract(i)}}class Go{constructor(){Go.constructor_.apply(this,arguments)}static constructor_(){if(this._p=null,1===arguments.length){const t=arguments[0];this._p=new p(t)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];this._p=new p(t,e)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._p=new p(t,e,s)}}static interpolateZ(){if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=e.distance(s),i=t.distance(e),r=s.getZ()-e.getZ();return e.getZ()+r*(i/n)}if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=e.x,r=e.y,o=s.x-i,l=n.x-i,a=s.y-r,c=n.y-r,h=o*c-l*a,u=t.x-i,g=t.y-r,d=(c*u-l*g)/h,_=(-a*u+o*g)/h;return e.getZ()+d*(s.getZ()-e.getZ())+_*(n.getZ()-e.getZ())}}circleCenter(t,e){const s=new Go(this.getX(),this.getY()),n=this.bisector(s,t),i=this.bisector(t,e),r=new $t(n,i);let o=null;try{o=new Go(r.getX(),r.getY())}catch(n){if(!(n instanceof Jt))throw n;q.err.println("a: "+s+" b: "+t+" c: "+e),q.err.println(n)}return o}dot(t){return this._p.x*t.getX()+this._p.y*t.getY()}magn(){return Math.sqrt(this._p.x*this._p.x+this._p.y*this._p.y)}getZ(){return this._p.getZ()}bisector(t,e){const s=e.getX()-t.getX(),n=e.getY()-t.getY(),i=new $t(t.getX()+s/2,t.getY()+n/2,1),r=new $t(t.getX()-n+s/2,t.getY()+s+n/2,1);return new $t(i,r)}equals(){if(1===arguments.length){const t=arguments[0];return this._p.x===t.getX()&&this._p.y===t.getY()}if(2===arguments.length){const t=arguments[0],e=arguments[1];return this._p.distance(t.getCoordinate())<e}}getCoordinate(){return this._p}isInCircle(t,e,s){return Fo.isInCircleRobust(t._p,e._p,s._p,this._p)}interpolateZValue(t,e,s){const n=t.getX(),i=t.getY(),r=e.getX()-n,o=s.getX()-n,l=e.getY()-i,a=s.getY()-i,c=r*a-o*l,h=this.getX()-n,u=this.getY()-i,g=(a*h-o*u)/c,d=(-l*h+r*u)/c;return t.getZ()+g*(e.getZ()-t.getZ())+d*(s.getZ()-t.getZ())}midPoint(t){const e=(this._p.x+t.getX())/2,s=(this._p.y+t.getY())/2,n=(this._p.getZ()+t.getZ())/2;return new Go(e,s,n)}rightOf(t){return this.isCCW(t.dest(),t.orig())}isCCW(t,e){return(t._p.x-this._p.x)*(e._p.y-this._p.y)-(t._p.y-this._p.y)*(e._p.x-this._p.x)>0}getX(){return this._p.x}crossProduct(t){return this._p.x*t.getY()-this._p.y*t.getX()}setZ(t){this._p.setZ(t)}times(t){return new Go(t*this._p.x,t*this._p.y)}cross(){return new Go(this._p.y,-this._p.x)}leftOf(t){return this.isCCW(t.orig(),t.dest())}toString(){return"POINT ("+this._p.x+" "+this._p.y+")"}sub(t){return new Go(this._p.x-t.getX(),this._p.y-t.getY())}getY(){return this._p.y}classify(t,e){const s=this,n=e.sub(t),i=s.sub(t),r=n.crossProduct(i);return r>0?Go.LEFT:r<0?Go.RIGHT:n.getX()*i.getX()<0||n.getY()*i.getY()<0?Go.BEHIND:n.magn()<i.magn()?Go.BEYOND:t.equals(s)?Go.ORIGIN:e.equals(s)?Go.DESTINATION:Go.BETWEEN}sum(t){return new Go(this._p.x+t.getX(),this._p.y+t.getY())}distance(t,e){return Math.sqrt(Math.pow(e.getX()-t.getX(),2)+Math.pow(e.getY()-t.getY(),2))}circumRadiusRatio(t,e){const s=this.circleCenter(t,e),n=this.distance(s,t);let i=this.distance(this,t),r=this.distance(t,e);return r<i&&(i=r),r=this.distance(e,this),r<i&&(i=r),n/i}}Go.LEFT=0,Go.RIGHT=1,Go.BEYOND=2,Go.BEHIND=3,Go.BETWEEN=4,Go.ORIGIN=5,Go.DESTINATION=6;class qo extends Go{constructor(){super(),qo.constructor_.apply(this,arguments)}static constructor_(){this._isOnConstraint=null,this._constraint=null;const t=arguments[0];Go.constructor_.call(this,t)}getConstraint(){return this._constraint}setOnConstraint(t){this._isOnConstraint=t}merge(t){t._isOnConstraint&&(this._isOnConstraint=!0,this._constraint=t._constraint)}isOnConstraint(){return this._isOnConstraint}setConstraint(t){this._isOnConstraint=!0,this._constraint=t}}class Bo{constructor(){Bo.constructor_.apply(this,arguments)}static constructor_(){this._rot=null,this._vertex=null,this._next=null,this._data=null}static makeEdge(t,e){const s=new Bo,n=new Bo,i=new Bo,r=new Bo;s._rot=n,n._rot=i,i._rot=r,r._rot=s,s.setNext(s),n.setNext(r),i.setNext(i),r.setNext(n);const o=s;return o.setOrig(t),o.setDest(e),o}static swap(t){const e=t.oPrev(),s=t.sym().oPrev();Bo.splice(t,e),Bo.splice(t.sym(),s),Bo.splice(t,e.lNext()),Bo.splice(t.sym(),s.lNext()),t.setOrig(e.dest()),t.setDest(s.dest())}static splice(t,e){const s=t.oNext().rot(),n=e.oNext().rot(),i=e.oNext(),r=t.oNext(),o=n.oNext(),l=s.oNext();t.setNext(i),e.setNext(r),s.setNext(o),n.setNext(l)}static connect(t,e){const s=Bo.makeEdge(t.dest(),e.orig());return Bo.splice(s,t.lNext()),Bo.splice(s.sym(),e),s}equalsNonOriented(t){return!!this.equalsOriented(t)||!!this.equalsOriented(t.sym())}toLineSegment(){return new Zt(this._vertex.getCoordinate(),this.dest().getCoordinate())}dest(){return this.sym().orig()}oNext(){return this._next}equalsOriented(t){return!(!this.orig().getCoordinate().equals2D(t.orig().getCoordinate())||!this.dest().getCoordinate().equals2D(t.dest().getCoordinate()))}dNext(){return this.sym().oNext().sym()}lPrev(){return this._next.sym()}rPrev(){return this.sym().oNext()}rot(){return this._rot}oPrev(){return this._rot._next._rot}sym(){return this._rot._rot}setOrig(t){this._vertex=t}lNext(){return this.invRot().oNext().rot()}getLength(){return this.orig().getCoordinate().distance(this.dest().getCoordinate())}invRot(){return this._rot.sym()}setDest(t){this.sym().setOrig(t)}setData(t){this._data=t}getData(){return this._data}delete(){this._rot=null}orig(){return this._vertex}rNext(){return this._rot._next.invRot()}toString(){const t=this._vertex.getCoordinate(),e=this.dest().getCoordinate();return Ut.toLineString(t,e)}isLive(){return null!==this._rot}getPrimary(){return this.orig().getCoordinate().compareTo(this.dest().getCoordinate())<=0?this:this.sym()}dPrev(){return this.invRot().oNext().invRot()}setNext(t){this._next=t}}class Yo{constructor(){Yo.constructor_.apply(this,arguments)}static constructor_(){this._subdiv=null,this._isUsingTolerance=!1;const t=arguments[0];this._subdiv=t,this._isUsingTolerance=t.getTolerance()>0}insertSite(t){let e=this._subdiv.locate(t);if(this._subdiv.isVertexOfEdge(e,t))return e;this._subdiv.isOnEdge(e,t.getCoordinate())&&(e=e.oPrev(),this._subdiv.delete(e.oNext()));let s=this._subdiv.makeEdge(e.orig(),t);Bo.splice(s,e);const n=s;do{s=this._subdiv.connect(e,s.sym()),e=s.oPrev()}while(e.lNext()!==n);for(;;){const i=e.oPrev();if(i.dest().rightOf(e)&&t.isInCircle(e.orig(),i.dest(),e.dest()))Bo.swap(e),e=e.oPrev();else{if(e.oNext()===n)return s;e=e.oNext().lPrev()}}}insertSites(t){for(let e=t.iterator();e.hasNext();){const t=e.next();this.insertSite(t)}}}class Vo{locate(t){}}class zo{constructor(){zo.constructor_.apply(this,arguments)}static constructor_(){this._subdiv=null,this._lastEdge=null;const t=arguments[0];this._subdiv=t,this.init()}init(){this._lastEdge=this.findEdge()}locate(t){this._lastEdge.isLive()||this.init();const e=this._subdiv.locateFromEdge(t,this._lastEdge);return this._lastEdge=e,e}findEdge(){return this._subdiv.getEdges().iterator().next()}get interfaces_(){return[Vo]}}class Xo extends c{constructor(){super(),Xo.constructor_.apply(this,arguments)}static constructor_(){if(this._seg=null,1===arguments.length){if("string"==typeof arguments[0]){const t=arguments[0];c.constructor_.call(this,t)}else if(arguments[0]instanceof Zt){const t=arguments[0];c.constructor_.call(this,"Locate failed to converge (at edge: "+t+"). Possible causes include invalid Subdivision topology or very close sites"),this._seg=new Zt(t)}}else if(2===arguments.length){const t=arguments[0],e=arguments[1];c.constructor_.call(this,Xo.msgWithSpatial(t,e)),this._seg=new Zt(e)}}static msgWithSpatial(t,e){return null!==e?t+" [ "+e+" ]":t}getSegment(){return this._seg}}class ko{visit(t){}}class Uo{constructor(){Uo.constructor_.apply(this,arguments)}static constructor_(){this._visitedKey=0,this._quadEdges=new S,this._startingEdge=null,this._tolerance=null,this._edgeCoincidenceTolerance=null,this._frameVertex=new Array(3).fill(null),this._frameEnv=null,this._locator=null,this._seg=new Zt,this._triEdges=new Array(3).fill(null);const t=arguments[0],e=arguments[1];this._tolerance=e,this._edgeCoincidenceTolerance=e/Uo.EDGE_COINCIDENCE_TOL_FACTOR,this.createFrame(t),this._startingEdge=this.initSubdiv(),this._locator=new zo(this)}static getTriangleEdges(t,e){if(e[0]=t,e[1]=e[0].lNext(),e[2]=e[1].lNext(),e[2].lNext()!==e[0])throw new s("Edges do not form a triangle")}getTriangleVertices(t){const e=new Zo;return this.visitTriangles(e,t),e.getTriangleVertices()}isFrameVertex(t){return!!t.equals(this._frameVertex[0])||(!!t.equals(this._frameVertex[1])||!!t.equals(this._frameVertex[2]))}isVertexOfEdge(t,e){return!(!e.equals(t.orig(),this._tolerance)&&!e.equals(t.dest(),this._tolerance))}connect(t,e){const s=Bo.connect(t,e);return this._quadEdges.add(s),s}getVoronoiCellPolygon(t,e){const s=new S,n=t;do{const e=t.rot().orig().getCoordinate();s.add(e),t=t.oPrev()}while(t!==n);const i=new T;i.addAll(s,!1),i.closeRing(),i.size()<4&&(q.out.println(i),i.add(i.get(i.size()-1),!0));const r=i.toCoordinateArray(),o=e.createPolygon(e.createLinearRing(r)),l=n.orig();return o.setUserData(l.getCoordinate()),o}setLocator(t){this._locator=t}initSubdiv(){const t=this.makeEdge(this._frameVertex[0],this._frameVertex[1]),e=this.makeEdge(this._frameVertex[1],this._frameVertex[2]);Bo.splice(t.sym(),e);const s=this.makeEdge(this._frameVertex[2],this._frameVertex[0]);return Bo.splice(e.sym(),s),Bo.splice(s.sym(),t),t}isFrameBorderEdge(t){const e=new Array(3).fill(null);Uo.getTriangleEdges(t,e);const s=new Array(3).fill(null);Uo.getTriangleEdges(t.sym(),s);const n=t.lNext().dest();if(this.isFrameVertex(n))return!0;const i=t.sym().lNext().dest();return!!this.isFrameVertex(i)}makeEdge(t,e){const s=Bo.makeEdge(t,e);return this._quadEdges.add(s),s}visitTriangles(t,e){this._visitedKey++;const s=new $e;s.push(this._startingEdge);const n=new yt;for(;!s.empty();){const i=s.pop();if(!n.contains(i)){const r=this.fetchTriangleToVisit(i,s,e,n);null!==r&&t.visit(r)}}}isFrameEdge(t){return!(!this.isFrameVertex(t.orig())&&!this.isFrameVertex(t.dest()))}isOnEdge(t,e){this._seg.setCoordinates(t.orig().getCoordinate(),t.dest().getCoordinate());return this._seg.distance(e)<this._edgeCoincidenceTolerance}getEnvelope(){return new P(this._frameEnv)}createFrame(t){const e=t.getWidth(),s=t.getHeight();let n=0;n=e>s?10*e:10*s,this._frameVertex[0]=new Go((t.getMaxX()+t.getMinX())/2,t.getMaxY()+n),this._frameVertex[1]=new Go(t.getMinX()-n,t.getMinY()-n),this._frameVertex[2]=new Go(t.getMaxX()+n,t.getMinY()-n),this._frameEnv=new P(this._frameVertex[0].getCoordinate(),this._frameVertex[1].getCoordinate()),this._frameEnv.expandToInclude(this._frameVertex[2].getCoordinate())}getTriangleCoordinates(t){const e=new jo;return this.visitTriangles(e,t),e.getTriangles()}getVertices(t){const e=new yt;for(let s=this._quadEdges.iterator();s.hasNext();){const n=s.next(),i=n.orig();!t&&this.isFrameVertex(i)||e.add(i);const r=n.dest();!t&&this.isFrameVertex(r)||e.add(r)}return e}fetchTriangleToVisit(t,e,s,n){let i=t,r=0,o=!1;do{this._triEdges[r]=i,this.isFrameEdge(i)&&(o=!0);const t=i.sym();n.contains(t)||e.push(t),n.add(i),r++,i=i.lNext()}while(i!==t);return o&&!s?null:this._triEdges}getEdges(){if(0===arguments.length)return this._quadEdges;if(1===arguments.length){const t=arguments[0],e=this.getPrimaryEdges(!1),s=new Array(e.size()).fill(null);let n=0;for(let i=e.iterator();i.hasNext();){const e=i.next();s[n++]=t.createLineString([e.orig().getCoordinate(),e.dest().getCoordinate()])}return t.createMultiLineString(s)}}getVertexUniqueEdges(t){const e=new S,s=new yt;for(let n=this._quadEdges.iterator();n.hasNext();){const i=n.next(),r=i.orig();s.contains(r)||(s.add(r),!t&&this.isFrameVertex(r)||e.add(i));const o=i.sym(),l=o.orig();s.contains(l)||(s.add(l),!t&&this.isFrameVertex(l)||e.add(o))}return e}getTriangleEdges(t){const e=new Wo;return this.visitTriangles(e,t),e.getTriangleEdges()}getPrimaryEdges(t){this._visitedKey++;const e=new S,s=new $e;s.push(this._startingEdge);const n=new yt;for(;!s.empty();){const i=s.pop();if(!n.contains(i)){const r=i.getPrimary();!t&&this.isFrameEdge(r)||e.add(r),s.push(i.oNext()),s.push(i.sym().oNext()),n.add(i),n.add(i.sym())}}return e}delete(t){Bo.splice(t,t.oPrev()),Bo.splice(t.sym(),t.sym().oPrev());const e=t.sym(),s=t.rot(),n=t.rot().sym();this._quadEdges.remove(t),this._quadEdges.remove(e),this._quadEdges.remove(s),this._quadEdges.remove(n),t.delete(),e.delete(),s.delete(),n.delete()}locateFromEdge(t,e){let s=0;const n=this._quadEdges.size();let i=e;for(;;){if(s++,s>n)throw new Xo(i.toLineSegment());if(t.equals(i.orig())||t.equals(i.dest()))break;if(t.rightOf(i))i=i.sym();else if(t.rightOf(i.oNext())){if(t.rightOf(i.dPrev()))break;i=i.dPrev()}else i=i.oNext()}return i}getTolerance(){return this._tolerance}getVoronoiCellPolygons(t){this.visitTriangles(new Ho,!0);const e=new S;for(let s=this.getVertexUniqueEdges(!1).iterator();s.hasNext();){const n=s.next();e.add(this.getVoronoiCellPolygon(n,t))}return e}getVoronoiDiagram(t){const e=this.getVoronoiCellPolygons(t);return t.createGeometryCollection(wt.toGeometryArray(e))}getTriangles(t){const e=this.getTriangleCoordinates(!1),s=new Array(e.size()).fill(null);let n=0;for(let i=e.iterator();i.hasNext();){const e=i.next();s[n++]=t.createPolygon(t.createLinearRing(e))}return t.createGeometryCollection(s)}insertSite(t){let e=this.locate(t);if(t.equals(e.orig(),this._tolerance)||t.equals(e.dest(),this._tolerance))return e;let s=this.makeEdge(e.orig(),t);Bo.splice(s,e);const n=s;do{s=this.connect(e,s.sym()),e=s.oPrev()}while(e.lNext()!==n);return n}locate(){if(1===arguments.length){if(arguments[0]instanceof Go){const t=arguments[0];return this._locator.locate(t)}if(arguments[0]instanceof p){const t=arguments[0];return this._locator.locate(new Go(t))}}else if(2===arguments.length){const t=arguments[0],e=arguments[1],s=this._locator.locate(new Go(t));if(null===s)return null;let n=s;s.dest().getCoordinate().equals2D(t)&&(n=s.sym());let i=n;do{if(i.dest().getCoordinate().equals2D(e))return i;i=i.oNext()}while(i!==n);return null}}}class Ho{visit(t){const e=t[0].orig().getCoordinate(),s=t[1].orig().getCoordinate(),n=t[2].orig().getCoordinate(),i=te.circumcentreDD(e,s,n),r=new Go(i);for(let e=0;e<3;e++)t[e].rot().setOrig(r)}get interfaces_(){return[ko]}}class Wo{constructor(){Wo.constructor_.apply(this,arguments)}static constructor_(){this._triList=new S}getTriangleEdges(){return this._triList}visit(t){this._triList.add(t)}get interfaces_(){return[ko]}}class Zo{constructor(){Zo.constructor_.apply(this,arguments)}static constructor_(){this._triList=new S}visit(t){this._triList.add([t[0].orig(),t[1].orig(),t[2].orig()])}getTriangleVertices(){return this._triList}get interfaces_(){return[ko]}}class jo{constructor(){jo.constructor_.apply(this,arguments)}static constructor_(){this._coordList=new T,this._triCoords=new S}checkTriangleSize(t){t.length>=2?Ut.toLineString(t[0],t[1]):t.length>=1&&Ut.toPoint(t[0])}visit(t){this._coordList.clear();for(let e=0;e<3;e++){const s=t[e].orig();this._coordList.add(s.getCoordinate())}if(this._coordList.size()>0){this._coordList.closeRing();const t=this._coordList.toCoordinateArray();if(4!==t.length)return null;this._triCoords.add(t)}}getTriangles(){return this._triCoords}get interfaces_(){return[ko]}}Uo.TriangleCircumcentreVisitor=Ho,Uo.TriangleEdgesListVisitor=Wo,Uo.TriangleVertexListVisitor=Zo,Uo.TriangleCoordinatesVisitor=jo,Uo.EDGE_COINCIDENCE_TOL_FACTOR=1e3;class Ko{constructor(){Ko.constructor_.apply(this,arguments)}static constructor_(){if(this._ls=null,this._data=null,2===arguments.length){const t=arguments[0],e=arguments[1];this._ls=new Zt(t,e)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._ls=new Zt(t,e),this._data=s}else if(6===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=arguments[4],r=arguments[5];Ko.constructor_.call(this,new p(t,e,s),new p(n,i,r))}else if(7===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3],i=arguments[4],r=arguments[5],o=arguments[6];Ko.constructor_.call(this,new p(t,e,s),new p(n,i,r),o)}}getLineSegment(){return this._ls}getEndZ(){return this._ls.getCoordinate(1).getZ()}getStartZ(){return this._ls.getCoordinate(0).getZ()}intersection(t){return this._ls.intersection(t.getLineSegment())}getStart(){return this._ls.getCoordinate(0)}getEnd(){return this._ls.getCoordinate(1)}getEndY(){return this._ls.getCoordinate(1).y}getStartX(){return this._ls.getCoordinate(0).x}equalsTopo(t){return this._ls.equalsTopo(t.getLineSegment())}getStartY(){return this._ls.getCoordinate(0).y}setData(t){this._data=t}getData(){return this._data}getEndX(){return this._ls.getCoordinate(1).x}toString(){return this._ls.toString()}}class Qo extends c{constructor(){super(),Qo.constructor_.apply(this,arguments)}static constructor_(){if(this._pt=null,1===arguments.length){const t=arguments[0];c.constructor_.call(this,t)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];c.constructor_.call(this,Qo.msgWithCoord(t,e)),this._pt=new p(e)}}static msgWithCoord(t,e){return null!==e?t+" [ "+Ut.toPoint(e)+" ]":t}getCoordinate(){return this._pt}}class Jo{constructor(){Jo.constructor_.apply(this,arguments)}static constructor_(){this._initialVertices=null,this._segVertices=null,this._segments=new S,this._subdiv=null,this._incDel=null,this._convexHull=null,this._splitFinder=new Ao,this._kdt=null,this._vertexFactory=null,this._computeAreaEnv=null,this._splitPt=null,this._tolerance=null;const t=arguments[0],e=arguments[1];this._initialVertices=new S(t),this._tolerance=e,this._kdt=new cn(e)}static computeVertexEnvelope(t){const e=new P;for(let s=t.iterator();s.hasNext();){const t=s.next();e.expandToInclude(t.getCoordinate())}return e}getInitialVertices(){return this._initialVertices}getKDT(){return this._kdt}enforceConstraints(){this.addConstraintVertices();let t=0,e=0;do{e=this.enforceGabriel(this._segments),t++}while(e>0&&t<Jo.MAX_SPLIT_ITER);if(t===Jo.MAX_SPLIT_ITER)throw new Qo("Too many splitting iterations while enforcing constraints. Last split point was at: ",this._splitPt)}insertSites(t){for(let e=t.iterator();e.hasNext();){const t=e.next();this.insertSite(t)}}getVertexFactory(){return this._vertexFactory}getPointArray(){const t=new Array(this._initialVertices.size()+this._segVertices.size()).fill(null);let e=0;for(let s=this._initialVertices.iterator();s.hasNext();){const n=s.next();t[e++]=n.getCoordinate()}for(let s=this._segVertices.iterator();s.hasNext();){const n=s.next();t[e++]=n.getCoordinate()}return t}setConstraints(t,e){this._segments=t,this._segVertices=e}computeConvexHull(){const t=new wt,e=this.getPointArray(),s=new es(e,t);this._convexHull=s.getConvexHull()}addConstraintVertices(){this.computeConvexHull(),this.insertSites(this._segVertices)}findNonGabrielPoint(t){const e=t.getStart(),s=t.getEnd(),n=new p((e.x+s.x)/2,(e.y+s.y)/2),r=e.distance(n),o=new P(n);o.expandBy(r);const l=this._kdt.query(o);let a=null,c=i.MAX_VALUE;for(let t=l.iterator();t.hasNext();){const i=t.next().getCoordinate();if(i.equals2D(e)||i.equals2D(s))continue;const o=n.distance(i);if(o<r){const t=o;(null===a||t<c)&&(a=i,c=t)}}return a}getConstraintSegments(){return this._segments}setSplitPointFinder(t){this._splitFinder=t}getConvexHull(){return this._convexHull}getTolerance(){return this._tolerance}enforceGabriel(t){const e=new S;let s=0;const n=new S;for(let i=t.iterator();i.hasNext();){const t=i.next(),r=this.findNonGabrielPoint(t);if(null===r)continue;this._splitPt=this._splitFinder.findSplitPoint(t,r);const o=this.createVertex(this._splitPt,t);this.insertSite(o).getCoordinate().equals2D(this._splitPt);const l=new Ko(t.getStartX(),t.getStartY(),t.getStartZ(),o.getX(),o.getY(),o.getZ(),t.getData()),a=new Ko(o.getX(),o.getY(),o.getZ(),t.getEndX(),t.getEndY(),t.getEndZ(),t.getData());e.add(l),e.add(a),n.add(t),s+=1}return t.removeAll(n),t.addAll(e),s}createVertex(){if(1===arguments.length){const t=arguments[0];let e=null;return e=null!==this._vertexFactory?this._vertexFactory.createVertex(t,null):new qo(t),e}if(2===arguments.length){const t=arguments[0],e=arguments[1];let s=null;return s=null!==this._vertexFactory?this._vertexFactory.createVertex(t,e):new qo(t),s.setOnConstraint(!0),s}}getSubdivision(){return this._subdiv}computeBoundingBox(){const t=Jo.computeVertexEnvelope(this._initialVertices),e=Jo.computeVertexEnvelope(this._segVertices),s=new P(t);s.expandToInclude(e);const n=.2*s.getWidth(),i=.2*s.getHeight(),r=Math.max(n,i);this._computeAreaEnv=new P(s),this._computeAreaEnv.expandBy(r)}setVertexFactory(t){this._vertexFactory=t}formInitialDelaunay(){this.computeBoundingBox(),this._subdiv=new Uo(this._computeAreaEnv,this._tolerance),this._subdiv.setLocator(new zo(this._subdiv)),this._incDel=new Yo(this._subdiv),this.insertSites(this._initialVertices)}insertSite(){if(arguments[0]instanceof qo){const t=arguments[0],e=this._kdt.insert(t.getCoordinate(),t);if(e.isRepeated()){const s=e.getData();return s.merge(t),s}return this._incDel.insertSite(t),t}if(arguments[0]instanceof p){const t=arguments[0];this.insertSite(this.createVertex(t))}}}Jo.MAX_SPLIT_ITER=99;class $o{constructor(){$o.constructor_.apply(this,arguments)}static constructor_(){this._siteCoords=null,this._tolerance=0,this._subdiv=null}static extractUniqueCoordinates(t){if(null===t)return new T;const e=t.getCoordinates();return $o.unique(e)}static envelope(t){const e=new P;for(let s=t.iterator();s.hasNext();){const t=s.next();e.expandToInclude(t)}return e}static unique(t){const e=gt.copyDeep(t);et.sort(e);return new T(e,!1)}static toVertices(t){const e=new S;for(let s=t.iterator();s.hasNext();){const t=s.next();e.add(new Go(t))}return e}create(){if(null!==this._subdiv)return null;const t=$o.envelope(this._siteCoords),e=$o.toVertices(this._siteCoords);this._subdiv=new Uo(t,this._tolerance);new Yo(this._subdiv).insertSites(e)}setTolerance(t){this._tolerance=t}setSites(){if(arguments[0]instanceof X){const t=arguments[0];this._siteCoords=$o.extractUniqueCoordinates(t)}else if(E(arguments[0],I)){const t=arguments[0];this._siteCoords=$o.unique(gt.toCoordinateArray(t))}}getEdges(t){return this.create(),this._subdiv.getEdges(t)}getSubdivision(){return this.create(),this._subdiv}getTriangles(t){return this.create(),this._subdiv.getTriangles(t)}}class tl{constructor(){tl.constructor_.apply(this,arguments)}static constructor_(){this._siteCoords=null,this._constraintLines=null,this._tolerance=0,this._subdiv=null,this._constraintVertexMap=new Xs}static createConstraintSegments(){if(1===arguments.length){const t=arguments[0],e=me.getLines(t),s=new S;for(let t=e.iterator();t.hasNext();){const e=t.next();tl.createConstraintSegments(e,s)}return s}if(2===arguments.length){const t=arguments[1],e=arguments[0].getCoordinates();for(let s=1;s<e.length;s++)t.add(new Ko(e[s-1],e[s]))}}createSiteVertices(t){const e=new S;for(let s=t.iterator();s.hasNext();){const t=s.next();this._constraintVertexMap.containsKey(t)||e.add(new qo(t))}return e}create(){if(null!==this._subdiv)return null;const t=$o.envelope(this._siteCoords);let e=new S;null!==this._constraintLines&&(t.expandToInclude(this._constraintLines.getEnvelopeInternal()),this.createVertices(this._constraintLines),e=tl.createConstraintSegments(this._constraintLines));const s=this.createSiteVertices(this._siteCoords),n=new Jo(s,this._tolerance);n.setConstraints(e,new S(this._constraintVertexMap.values())),n.formInitialDelaunay(),n.enforceConstraints(),this._subdiv=n.getSubdivision()}setTolerance(t){this._tolerance=t}setConstraints(t){this._constraintLines=t}setSites(t){this._siteCoords=$o.extractUniqueCoordinates(t)}getEdges(t){return this.create(),this._subdiv.getEdges(t)}getSubdivision(){return this.create(),this._subdiv}getTriangles(t){return this.create(),this._subdiv.getTriangles(t)}createVertices(t){const e=t.getCoordinates();for(let t=0;t<e.length;t++){const s=new qo(e[t]);this._constraintVertexMap.put(e[t],s)}}}class el{constructor(){el.constructor_.apply(this,arguments)}static constructor_(){this._siteCoords=null,this._tolerance=0,this._subdiv=null,this._clipEnv=null,this._diagramEnv=null}static clipGeometryCollection(t,e){const s=t.getFactory().toGeometry(e),n=new S;for(let i=0;i<t.getNumGeometries();i++){const r=t.getGeometryN(i);let o=null;e.contains(r.getEnvelopeInternal())?o=r:e.intersects(r.getEnvelopeInternal())&&(o=Er.intersection(s,r),o.setUserData(r.getUserData())),null===o||o.isEmpty()||n.add(o)}return t.getFactory().createGeometryCollection(wt.toGeometryArray(n))}create(){if(null!==this._subdiv)return null;const t=$o.envelope(this._siteCoords);if(this._diagramEnv=this._clipEnv,null===this._diagramEnv){this._diagramEnv=t;const e=this._diagramEnv.getDiameter();this._diagramEnv.expandBy(e)}const e=$o.toVertices(this._siteCoords);this._subdiv=new Uo(t,this._tolerance);new Yo(this._subdiv).insertSites(e)}getDiagram(t){this.create();const e=this._subdiv.getVoronoiDiagram(t);return el.clipGeometryCollection(e,this._diagramEnv)}setTolerance(t){this._tolerance=t}setSites(){if(arguments[0]instanceof X){const t=arguments[0];this._siteCoords=$o.extractUniqueCoordinates(t)}else if(E(arguments[0],I)){const t=arguments[0];this._siteCoords=$o.unique(gt.toCoordinateArray(t))}}setClipEnvelope(t){this._clipEnv=t}getSubdivision(){return this.create(),this._subdiv}}var sl=Object.freeze({__proto__:null,Vertex:Go}),nl=Object.freeze({__proto__:null,ConformingDelaunayTriangulationBuilder:tl,DelaunayTriangulationBuilder:$o,VoronoiDiagramBuilder:el,quadedge:sl});class il{constructor(){il.constructor_.apply(this,arguments)}static constructor_(){if(this._linearGeom=null,this._numLines=null,this._currentLine=null,this._componentIndex=0,this._vertexIndex=0,1===arguments.length){const t=arguments[0];il.constructor_.call(this,t,0,0)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];il.constructor_.call(this,t,e.getComponentIndex(),il.segmentEndVertexIndex(e))}else if(3===arguments.length){const t=arguments[0],e=arguments[1],n=arguments[2];if(!E(t,H))throw new s("Lineal geometry is required");this._linearGeom=t,this._numLines=t.getNumGeometries(),this._componentIndex=e,this._vertexIndex=n,this.loadCurrentLine()}}static segmentEndVertexIndex(t){return t.getSegmentFraction()>0?t.getSegmentIndex()+1:t.getSegmentIndex()}getComponentIndex(){return this._componentIndex}getLine(){return this._currentLine}getVertexIndex(){return this._vertexIndex}getSegmentEnd(){return this._vertexIndex<this.getLine().getNumPoints()-1?this._currentLine.getCoordinateN(this._vertexIndex+1):null}next(){if(!this.hasNext())return null;this._vertexIndex++,this._vertexIndex>=this._currentLine.getNumPoints()&&(this._componentIndex++,this.loadCurrentLine(),this._vertexIndex=0)}loadCurrentLine(){if(this._componentIndex>=this._numLines)return this._currentLine=null,null;this._currentLine=this._linearGeom.getGeometryN(this._componentIndex)}getSegmentStart(){return this._currentLine.getCoordinateN(this._vertexIndex)}isEndOfLine(){return!(this._componentIndex>=this._numLines)&&!(this._vertexIndex<this._currentLine.getNumPoints()-1)}hasNext(){return!(this._componentIndex>=this._numLines)&&!(this._componentIndex===this._numLines-1&&this._vertexIndex>=this._currentLine.getNumPoints())}}class rl{constructor(){rl.constructor_.apply(this,arguments)}static constructor_(){this._linearGeom=null;const t=arguments[0];this._linearGeom=t}static indexOf(t,e){return new rl(t).indexOf(e)}static indexOfAfter(t,e,s){return new rl(t).indexOfAfter(e,s)}indexOf(t){return this.indexOfFromStart(t,-1)}indexOfFromStart(t,e){let s=i.MAX_VALUE,n=e,r=0;const o=new Zt,l=new il(this._linearGeom);for(;l.hasNext();){if(!l.isEndOfLine()){o.p0=l.getSegmentStart(),o.p1=l.getSegmentEnd();const i=o.distance(t),a=this.segmentNearestMeasure(o,t,r);i<s&&a>e&&(n=a,s=i),r+=o.getLength()}l.next()}return n}indexOfAfter(t,e){if(e<0)return this.indexOf(t);const s=this._linearGeom.getLength();if(s<e)return s;const n=this.indexOfFromStart(t,e);return u.isTrue(n>=e,"computed index is before specified minimum index"),n}segmentNearestMeasure(t,e,s){const n=t.projectionFactor(e);return n<=0?s:n<=1?s+n*t.getLength():s+t.getLength()}}class ll{constructor(){ll.constructor_.apply(this,arguments)}static constructor_(){if(this._componentIndex=0,this._segmentIndex=0,this._segmentFraction=0,0===arguments.length);else if(1===arguments.length){const t=arguments[0];this._componentIndex=t._componentIndex,this._segmentIndex=t._segmentIndex,this._segmentFraction=t._segmentFraction}else if(2===arguments.length){const t=arguments[0],e=arguments[1];ll.constructor_.call(this,0,t,e)}else if(3===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2];this._componentIndex=t,this._segmentIndex=e,this._segmentFraction=s,this.normalize()}else if(4===arguments.length){const t=arguments[0],e=arguments[1],s=arguments[2],n=arguments[3];this._componentIndex=t,this._segmentIndex=e,this._segmentFraction=s,n&&this.normalize()}}static getEndLocation(t){const e=new ll;return e.setToEnd(t),e}static pointAlongSegmentByFraction(t,e,s){if(s<=0)return t;if(s>=1)return e;const n=(e.x-t.x)*s+t.x,i=(e.y-t.y)*s+t.y,r=(e.getZ()-t.getZ())*s+t.getZ();return new p(n,i,r)}static compareLocationValues(t,e,s,n,i,r){return t<n?-1:t>n?1:e<i?-1:e>i?1:s<r?-1:s>r?1:0}static numSegments(t){const e=t.getNumPoints();return e<=1?0:e-1}getSegmentIndex(){return this._segmentIndex}getComponentIndex(){return this._componentIndex}isEndpoint(t){const e=t.getGeometryN(this._componentIndex),s=ll.numSegments(e);return this._segmentIndex>=s||this._segmentIndex===s-1&&this._segmentFraction>=1}isValid(t){if(this._componentIndex<0||this._componentIndex>=t.getNumGeometries())return!1;const e=t.getGeometryN(this._componentIndex);return!(this._segmentIndex<0||this._segmentIndex>e.getNumPoints())&&((this._segmentIndex!==e.getNumPoints()||0===this._segmentFraction)&&!(this._segmentFraction<0||this._segmentFraction>1))}normalize(){this._segmentFraction<0&&(this._segmentFraction=0),this._segmentFraction>1&&(this._segmentFraction=1),this._componentIndex<0&&(this._componentIndex=0,this._segmentIndex=0,this._segmentFraction=0),this._segmentIndex<0&&(this._segmentIndex=0,this._segmentFraction=0),1===this._segmentFraction&&(this._segmentFraction=0,this._segmentIndex+=1)}toLowest(t){const e=t.getGeometryN(this._componentIndex),s=ll.numSegments(e);return this._segmentIndex<s?this:new ll(this._componentIndex,s-1,1,!1)}getCoordinate(t){const e=t.getGeometryN(this._componentIndex),s=e.getCoordinateN(this._segmentIndex);if(this._segmentIndex>=ll.numSegments(e))return s;const n=e.getCoordinateN(this._segmentIndex+1);return ll.pointAlongSegmentByFraction(s,n,this._segmentFraction)}getSegmentFraction(){return this._segmentFraction}getSegment(t){const e=t.getGeometryN(this._componentIndex),s=e.getCoordinateN(this._segmentIndex);if(this._segmentIndex>=ll.numSegments(e)){const t=e.getCoordinateN(e.getNumPoints()-2);return new Zt(t,s)}const n=e.getCoordinateN(this._segmentIndex+1);return new Zt(s,n)}clamp(t){if(this._componentIndex>=t.getNumGeometries())return this.setToEnd(t),null;if(this._segmentIndex>=t.getNumPoints()){const e=t.getGeometryN(this._componentIndex);this._segmentIndex=ll.numSegments(e),this._segmentFraction=1}}setToEnd(t){this._componentIndex=t.getNumGeometries()-1;const e=t.getGeometryN(this._componentIndex);this._segmentIndex=ll.numSegments(e),this._segmentFraction=0}compareTo(t){const e=t;return this._componentIndex<e._componentIndex?-1:this._componentIndex>e._componentIndex?1:this._segmentIndex<e._segmentIndex?-1:this._segmentIndex>e._segmentIndex?1:this._segmentFraction<e._segmentFraction?-1:this._segmentFraction>e._segmentFraction?1:0}copy(){return new ll(this._componentIndex,this._segmentIndex,this._segmentFraction)}toString(){return"LinearLoc["+this._componentIndex+", "+this._segmentIndex+", "+this._segmentFraction+"]"}isOnSameSegment(t){return this._componentIndex===t._componentIndex&&(this._segmentIndex===t._segmentIndex||(t._segmentIndex-this._segmentIndex==1&&0===t._segmentFraction||this._segmentIndex-t._segmentIndex==1&&0===this._segmentFraction))}snapToVertex(t,e){if(this._segmentFraction<=0||this._segmentFraction>=1)return null;const s=this.getSegmentLength(t),n=this._segmentFraction*s,i=s-n;n<=i&&n<e?this._segmentFraction=0:i<=n&&i<e&&(this._segmentFraction=1)}compareLocationValues(t,e,s){return this._componentIndex<t?-1:this._componentIndex>t?1:this._segmentIndex<e?-1:this._segmentIndex>e?1:this._segmentFraction<s?-1:this._segmentFraction>s?1:0}getSegmentLength(t){const e=t.getGeometryN(this._componentIndex);let s=this._segmentIndex;this._segmentIndex>=ll.numSegments(e)&&(s=e.getNumPoints()-2);const n=e.getCoordinateN(s),i=e.getCoordinateN(s+1);return n.distance(i)}isVertex(){return this._segmentFraction<=0||this._segmentFraction>=1}get interfaces_(){return[r]}}class al{constructor(){al.constructor_.apply(this,arguments)}static constructor_(){this._linearGeom=null;const t=arguments[0];this._linearGeom=t}static indexOf(t,e){return new al(t).indexOf(e)}static indexOfAfter(t,e,s){return new al(t).indexOfAfter(e,s)}indexOf(t){return this.indexOfFromStart(t,null)}indexOfFromStart(t,e){let s=i.MAX_VALUE,n=0,r=0,o=-1;const l=new Zt;for(let i=new il(this._linearGeom);i.hasNext();i.next())if(!i.isEndOfLine()){l.p0=i.getSegmentStart(),l.p1=i.getSegmentEnd();const a=l.distance(t),c=l.segmentFraction(t),h=i.getComponentIndex(),u=i.getVertexIndex();a<s&&(null===e||e.compareLocationValues(h,u,c)<0)&&(n=h,r=u,o=c,s=a)}if(s===i.MAX_VALUE)return new ll(e);return new ll(n,r,o)}indexOfAfter(t,e){if(null===e)return this.indexOf(t);const s=ll.getEndLocation(this._linearGeom);if(s.compareTo(e)<=0)return s;const n=this.indexOfFromStart(t,e);return u.isTrue(n.compareTo(e)>=0,"computed location is before specified minimum location"),n}}class cl{constructor(){cl.constructor_.apply(this,arguments)}static constructor_(){this._linearGeom=null;const t=arguments[0];this._linearGeom=t}static indicesOf(t,e){return new cl(t).indicesOf(e)}indicesOf(t){const e=t.getGeometryN(0).getCoordinateN(0),s=t.getGeometryN(t.getNumGeometries()-1),n=s.getCoordinateN(s.getNumPoints()-1),i=new al(this._linearGeom),r=new Array(2).fill(null);return r[0]=i.indexOf(e),0===t.getLength()?r[1]=r[0].copy():r[1]=i.indexOfAfter(n,r[0]),r}}class hl{constructor(){hl.constructor_.apply(this,arguments)}static constructor_(){this._linearGeom=null;const t=arguments[0];this._linearGeom=t}static getLength(t,e){return new hl(t).getLength(e)}static getLocation(){if(2===arguments.length){const t=arguments[1];return new hl(arguments[0]).getLocation(t)}if(3===arguments.length){const t=arguments[1],e=arguments[2];return new hl(arguments[0]).getLocation(t,e)}}getLength(t){let e=0;const s=new il(this._linearGeom);for(;s.hasNext();){if(!s.isEndOfLine()){const n=s.getSegmentStart(),i=s.getSegmentEnd().distance(n);if(t.getComponentIndex()===s.getComponentIndex()&&t.getSegmentIndex()===s.getVertexIndex())return e+i*t.getSegmentFraction();e+=i}s.next()}return e}resolveHigher(t){if(!t.isEndpoint(this._linearGeom))return t;let e=t.getComponentIndex();if(e>=this._linearGeom.getNumGeometries()-1)return t;do{e++}while(e<this._linearGeom.getNumGeometries()-1&&0===this._linearGeom.getGeometryN(e).getLength());return new ll(e,0,0)}getLocation(){if(1===arguments.length){const t=arguments[0];return this.getLocation(t,!0)}if(2===arguments.length){const t=arguments[0],e=arguments[1];let s=t;if(t<0){s=this._linearGeom.getLength()+t}const n=this.getLocationForward(s);return e?n:this.resolveHigher(n)}}getLocationForward(t){if(t<=0)return new ll;let e=0;const s=new il(this._linearGeom);for(;s.hasNext();){if(s.isEndOfLine()){if(e===t){const t=s.getComponentIndex(),e=s.getVertexIndex();return new ll(t,e,0)}}else{const n=s.getSegmentStart(),i=s.getSegmentEnd().distance(n);if(e+i>t){const n=(t-e)/i,r=s.getComponentIndex(),o=s.getVertexIndex();return new ll(r,o,n)}e+=i}s.next()}return ll.getEndLocation(this._linearGeom)}}class ul{constructor(){ul.constructor_.apply(this,arguments)}static constructor_(){this._geomFact=null,this._lines=new S,this._coordList=null,this._ignoreInvalidLines=!1,this._fixInvalidLines=!1,this._lastPt=null;const t=arguments[0];this._geomFact=t}getGeometry(){return this.endLine(),this._geomFact.buildGeometry(this._lines)}getLastCoordinate(){return this._lastPt}endLine(){if(null===this._coordList)return null;if(this._ignoreInvalidLines&&this._coordList.size()<2)return this._coordList=null,null;const t=this._coordList.toCoordinateArray();let e=t;this._fixInvalidLines&&(e=this.validCoordinateSequence(t)),this._coordList=null;let n=null;try{n=this._geomFact.createLineString(e)}catch(t){if(!(t instanceof s))throw t;if(!this._ignoreInvalidLines)throw t}null!==n&&this._lines.add(n)}setFixInvalidLines(t){this._fixInvalidLines=t}add(){if(1===arguments.length){const t=arguments[0];this.add(t,!0)}else if(2===arguments.length){const t=arguments[0],e=arguments[1];null===this._coordList&&(this._coordList=new T),this._coordList.add(t,e),this._lastPt=t}}setIgnoreInvalidLines(t){this._ignoreInvalidLines=t}validCoordinateSequence(t){if(t.length>=2)return t;return[t[0],t[0]]}}class gl{constructor(){gl.constructor_.apply(this,arguments)}static constructor_(){this._line=null;const t=arguments[0];this._line=t}static extract(t,e,s){return new gl(t).extract(e,s)}computeLinear(t,e){const s=new ul(this._line.getFactory());s.setFixInvalidLines(!0),t.isVertex()||s.add(t.getCoordinate(this._line));for(let n=new il(this._line,t);n.hasNext()&&!(e.compareLocationValues(n.getComponentIndex(),n.getVertexIndex(),0)<0);n.next()){const t=n.getSegmentStart();s.add(t),n.isEndOfLine()&&s.endLine()}return e.isVertex()||s.add(e.getCoordinate(this._line)),s.getGeometry()}computeLine(t,e){const s=this._line.getCoordinates(),n=new T;let i=t.getSegmentIndex();t.getSegmentFraction()>0&&(i+=1);let r=e.getSegmentIndex();1===e.getSegmentFraction()&&(r+=1),r>=s.length&&(r=s.length-1),t.isVertex()||n.add(t.getCoordinate(this._line));for(let t=i;t<=r;t++)n.add(s[t]);e.isVertex()||n.add(e.getCoordinate(this._line)),n.size()<=0&&n.add(t.getCoordinate(this._line));let o=n.toCoordinateArray();return o.length<=1&&(o=[o[0],o[0]]),this._line.getFactory().createLineString(o)}extract(t,e){return e.compareTo(t)<0?this.reverse(this.computeLinear(e,t)):this.computeLinear(t,e)}reverse(t){return E(t,H)?t.reverse():(u.shouldNeverReachHere("non-linear geometry encountered"),null)}}class dl{constructor(){dl.constructor_.apply(this,arguments)}static constructor_(){this._linearGeom=null;const t=arguments[0];this._linearGeom=t}clampIndex(t){const e=this.positiveIndex(t),s=this.getStartIndex();if(e<s)return s;const n=this.getEndIndex();return e>n?n:e}locationOf(){if(1===arguments.length){const t=arguments[0];return hl.getLocation(this._linearGeom,t)}if(2===arguments.length){const t=arguments[0],e=arguments[1];return hl.getLocation(this._linearGeom,t,e)}}project(t){return rl.indexOf(this._linearGeom,t)}positiveIndex(t){return t>=0?t:this._linearGeom.getLength()+t}extractPoint(){if(1===arguments.length){const t=arguments[0];return hl.getLocation(this._linearGeom,t).getCoordinate(this._linearGeom)}if(2===arguments.length){const t=arguments[0],e=arguments[1],s=hl.getLocation(this._linearGeom,t).toLowest(this._linearGeom);return s.getSegment(this._linearGeom).pointAlongOffset(s.getSegmentFraction(),e)}}isValidIndex(t){return t>=this.getStartIndex()&&t<=this.getEndIndex()}getEndIndex(){return this._linearGeom.getLength()}getStartIndex(){return 0}indexOfAfter(t,e){return rl.indexOfAfter(this._linearGeom,t,e)}extractLine(t,e){const s=this.clampIndex(t),n=this.clampIndex(e),i=s===n,r=this.locationOf(s,i),o=this.locationOf(n);return gl.extract(this._linearGeom,r,o)}indexOf(t){return rl.indexOf(this._linearGeom,t)}indicesOf(t){const e=cl.indicesOf(this._linearGeom,t);return[hl.getLength(this._linearGeom,e[0]),hl.getLength(this._linearGeom,e[1])]}}class _l{constructor(){_l.constructor_.apply(this,arguments)}static constructor_(){this._linearGeom=null;const t=arguments[0];this._linearGeom=t,this.checkGeometryType()}clampIndex(t){const e=t.copy();return e.clamp(this._linearGeom),e}project(t){return al.indexOf(this._linearGeom,t)}checkGeometryType(){if(!(this._linearGeom instanceof Q||this._linearGeom instanceof Ct))throw new s("Input geometry must be linear")}extractPoint(){if(1===arguments.length){return arguments[0].getCoordinate(this._linearGeom)}if(2===arguments.length){const t=arguments[1],e=arguments[0].toLowest(this._linearGeom);return e.getSegment(this._linearGeom).pointAlongOffset(e.getSegmentFraction(),t)}}isValidIndex(t){return t.isValid(this._linearGeom)}getEndIndex(){return ll.getEndLocation(this._linearGeom)}getStartIndex(){return new ll}indexOfAfter(t,e){return al.indexOfAfter(this._linearGeom,t,e)}extractLine(t,e){return gl.extract(this._linearGeom,t,e)}indexOf(t){return al.indexOf(this._linearGeom,t)}indicesOf(t){return cl.indicesOf(this._linearGeom,t)}}var pl=Object.freeze({__proto__:null,LengthIndexedLine:dl,LengthLocationMap:hl,LinearGeometryBuilder:ul,LinearIterator:il,LinearLocation:ll,LocationIndexedLine:_l});class ml{static transform(t,e){const s=new S;for(let n=t.iterator();n.hasNext();)s.add(e.execute(n.next()));return s}static select(t,e){const s=new S;for(let n=t.iterator();n.hasNext();){const t=n.next();Boolean.TRUE.equals(e.execute(t))&&s.add(t)}return s}static apply(t,e){for(let s=t.iterator();s.hasNext();)e.execute(s.next())}}ml.Function=function(){};class fl{constructor(){fl.constructor_.apply(this,arguments)}static constructor_(){this.pts=null,this.n=0;const t=arguments[0];this.pts=new Array(t).fill(null)}filter(t){this.pts[this.n++]=t}getCoordinates(){return this.pts}get interfaces_(){return[k]}}class yl{constructor(){yl.constructor_.apply(this,arguments)}static constructor_(){this._n=0}filter(t){this._n++}getCount(){return this._n}get interfaces_(){return[k]}}class xl{constructor(){xl.constructor_.apply(this,arguments)}static constructor_(){this._counts=new Et}count(t){const e=this._counts.get(t);return null===e?0:e.count()}add(t){const e=this._counts.get(t);null===e?this._counts.put(t,new El(1)):e.increment()}}class El{constructor(){El.constructor_.apply(this,arguments)}static constructor_(){if(this.count=0,0===arguments.length);else if(1===arguments.length){const t=arguments[0];this.count=t}}count(){return this.count}increment(){this.count++}}function Il(){}function Nl(){}function Cl(){}xl.Counter=El;class wl extends e{}function Sl(){}class Ll{static chars(t,e){const s=new Array(e).fill(null);for(let n=0;n<e;n++)s[n]=t;return new String(s)}static getStackTrace(){if(1===arguments.length){const t=arguments[0],e=new Cl,s=new Il(e);return t.printStackTrace(s),e.toString()}if(2===arguments.length){const t=arguments[0],e=arguments[1];let s="";const n=new Sl(new Nl(Ll.getStackTrace(t)));for(let t=0;t<e;t++)try{s+=n.readLine()+Ll.NEWLINE}catch(t){if(!(t instanceof wl))throw t;u.shouldNeverReachHere()}return s}}static spaces(t){return Ll.chars(" ",t)}static split(t,e){const s=e.length,n=new S;let i=""+t,r=i.indexOf(e);for(;r>=0;){const t=i.substring(0,r);n.add(t),i=i.substring(r+s),r=i.indexOf(e)}i.length>0&&n.add(i);const o=new Array(n.size()).fill(null);for(let t=0;t<o.length;t++)o[t]=n.get(t);return o}}Ll.NEWLINE=q.getProperty("line.separator");var Tl=Object.freeze({__proto__:null,CollectionUtil:ml,CoordinateArrayFilter:fl,CoordinateCountFilter:yl,GeometricShapeFactory:Ie,NumberUtil:t,ObjectCounter:xl,PriorityQueue:Cn,StringUtil:Ll,UniqueCoordinateArrayFilter:ts});const Rl="2.7.1 (16652a2)";export{fs as algorithm,Es as densify,Rs as dissolve,Se as geom,on as geomgraph,Mn as index,qn as io,pl as linearref,ti as noding,no as operation,po as precision,Mo as simplify,nl as triangulate,Tl as util,Rl as version};
- //# sourceMappingURL=jsts.es6.min.js.map
|